xref: /petsc/src/sys/objects/init.c (revision e8fb0fc05573aa974b3f79797ad519d0316ca217)
1 #define PETSC_DLL
2 /*
3 
4    This file defines part of the initialization of PETSc
5 
6   This file uses regular malloc and free because it cannot know
7   what malloc is being used until it has already processed the input.
8 */
9 
10 #include "petsc.h"        /*I  "petsc.h"   I*/
11 #include "petscsys.h"
12 #if defined(PETSC_HAVE_STDLIB_H)
13 #include <stdlib.h>
14 #endif
15 #if defined(PETSC_HAVE_MALLOC_H)
16 #include <malloc.h>
17 #endif
18 #include "petscfix.h"
19 
20 /* ------------------------Nasty global variables -------------------------------*/
21 /*
22      Indicates if PETSc started up MPI, or it was
23    already started before PETSc was initialized.
24 */
25 PetscTruth  PETSC_DLLEXPORT PetscBeganMPI         = PETSC_FALSE;
26 PetscTruth  PETSC_DLLEXPORT PetscInitializeCalled = PETSC_FALSE;
27 PetscTruth  PETSC_DLLEXPORT PetscFinalizeCalled   = PETSC_FALSE;
28 PetscMPIInt PETSC_DLLEXPORT PetscGlobalRank = -1;
29 PetscMPIInt PETSC_DLLEXPORT PetscGlobalSize = -1;
30 
31 #if defined(PETSC_USE_COMPLEX)
32 #if defined(PETSC_COMPLEX_INSTANTIATE)
33 template <> class std::complex<double>; /* instantiate complex template class */
34 #endif
35 MPI_Datatype  PETSC_DLLEXPORT MPIU_COMPLEX;
36 PetscScalar   PETSC_DLLEXPORT PETSC_i;
37 #else
38 PetscScalar   PETSC_DLLEXPORT PETSC_i = 0.0;
39 #endif
40 MPI_Datatype  PETSC_DLLEXPORT MPIU_2SCALAR = 0;
41 MPI_Datatype  PETSC_DLLEXPORT MPIU_2INT = 0;
42 /*
43      These are needed by petscbt.h
44 */
45 char     PETSC_DLLEXPORT _BT_mask = ' ';
46 char     PETSC_DLLEXPORT _BT_c = ' ';
47 PetscInt PETSC_DLLEXPORT _BT_idx  = 0;
48 
49 /*
50        Function that is called to display all error messages
51 */
52 PetscErrorCode PETSC_DLLEXPORT (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
53 PetscErrorCode PETSC_DLLEXPORT (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
54 
55 /* ------------------------------------------------------------------------------*/
56 /*
57    Optional file where all PETSc output from various prints is saved
58 */
59 FILE *petsc_history = PETSC_NULL;
60 
61 #undef __FUNCT__
62 #define __FUNCT__ "PetscLogOpenHistoryFile"
63 PetscErrorCode PETSC_DLLEXPORT PetscLogOpenHistoryFile(const char filename[],FILE **fd)
64 {
65   PetscErrorCode ierr;
66   PetscMPIInt    rank,size;
67   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
68   char           version[256];
69 
70   PetscFunctionBegin;
71   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
72   if (!rank) {
73     char arch[10];
74     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
75     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
76     ierr = PetscGetVersion(&version,256);CHKERRQ(ierr);
77     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
78     if (filename) {
79       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
80     } else {
81       ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr);
82       ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr);
83       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
84     }
85 
86     *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
87     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
88     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
89     ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
90     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
91     ierr = PetscOptionsPrint(*fd);CHKERRQ(ierr);
92     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
93     fflush(*fd);
94   }
95   PetscFunctionReturn(0);
96 }
97 
98 #undef __FUNCT__
99 #define __FUNCT__ "PetscLogCloseHistoryFile"
100 PetscErrorCode PETSC_DLLEXPORT PetscLogCloseHistoryFile(FILE **fd)
101 {
102   PetscErrorCode ierr;
103   PetscMPIInt    rank;
104   char           date[64];
105 
106   PetscFunctionBegin;
107   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
108   if (!rank) {
109     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
110     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
111     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
112     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
113     fflush(*fd);
114     fclose(*fd);
115   }
116   PetscFunctionReturn(0);
117 }
118 
119 /* ------------------------------------------------------------------------------*/
120 
121 /*
122    This is ugly and probably belongs somewhere else, but I want to
123   be able to put a true MPI abort error handler with command line args.
124 
125     This is so MPI errors in the debugger will leave all the stack
126   frames. The default abort cleans up and exits.
127 */
128 
129 #undef __FUNCT__
130 #define __FUNCT__ "Petsc_MPI_AbortOnError"
131 void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
132 {
133   PetscFunctionBegin;
134   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
135   abort();
136 }
137 
138 #undef __FUNCT__
139 #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
140 void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
141 {
142   PetscErrorCode ierr;
143 
144   PetscFunctionBegin;
145   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
146   ierr = PetscAttachDebugger();
147   if (ierr) { /* hopeless so get out */
148     MPI_Finalize();
149     exit(*flag);
150   }
151 }
152 
153 #undef __FUNCT__
154 #define __FUNCT__ "PetscEnd"
155 /*@C
156    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
157      wishes a clean exit somewhere deep in the program.
158 
159    Collective on PETSC_COMM_WORLD
160 
161    Options Database Keys are the same as for PetscFinalize()
162 
163    Level: advanced
164 
165    Note:
166    See PetscInitialize() for more general runtime options.
167 
168 .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
169 @*/
170 PetscErrorCode PETSC_DLLEXPORT PetscEnd(void)
171 {
172   PetscFunctionBegin;
173   PetscFinalize();
174   exit(0);
175   return 0;
176 }
177 
178 PetscTruth   PetscOptionsPublish = PETSC_FALSE;
179 EXTERN PetscErrorCode        PetscSetUseTrMalloc_Private(void);
180 extern PetscTruth petscsetmallocvisited;
181 static char       emacsmachinename[256];
182 
183 PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0;
184 PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = 0;
185 
186 #undef __FUNCT__
187 #define __FUNCT__ "PetscSetHelpVersionFunctions"
188 /*@C
189    PetscSetHelpVersionFunctions - Sets functions that print help and version information
190    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
191    This routine enables a "higher-level" package that uses PETSc to print its messages first.
192 
193    Input Parameter:
194 +  help - the help function (may be PETSC_NULL)
195 -  version - the version function (may be PETSc null)
196 
197    Level: developer
198 
199    Concepts: package help message
200 
201 @*/
202 PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
203 {
204   PetscFunctionBegin;
205   PetscExternalHelpFunction    = help;
206   PetscExternalVersionFunction = version;
207   PetscFunctionReturn(0);
208 }
209 
210 #undef __FUNCT__
211 #define __FUNCT__ "PetscOptionsCheckInitial_Private"
212 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Private(void)
213 {
214   char           string[64],mname[PETSC_MAX_PATH_LEN],*f;
215   MPI_Comm       comm = PETSC_COMM_WORLD;
216   PetscTruth     flg1,flg2,flg3,flag;
217   PetscErrorCode ierr;
218   PetscInt       si;
219   int            i;
220   PetscMPIInt    rank;
221   char           version[256];
222 
223   PetscFunctionBegin;
224   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
225 
226   /*
227       Setup the memory management; support for tracing malloc() usage
228   */
229   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr);
230 #if defined(PETSC_USE_DEBUG)
231   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr);
232   if ((!flg2 || flg1) && !petscsetmallocvisited) {
233     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
234   }
235 #else
236   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr);
237   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc",&flg2);CHKERRQ(ierr);
238   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
239 #endif
240   if (flg3) {
241     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
242   }
243   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_debug",&flg1);CHKERRQ(ierr);
244   if (flg1) {
245     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
246     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
247   }
248 
249   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_info",&flg1);CHKERRQ(ierr);
250   if (!flg1) {
251     ierr = PetscOptionsHasName(PETSC_NULL,"-memory_info",&flg1);CHKERRQ(ierr);
252   }
253   if (flg1) {
254     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
255   }
256 
257   /*
258       Set the display variable for graphics
259   */
260   ierr = PetscSetDisplay();CHKERRQ(ierr);
261 
262   /*
263       Print the PETSc version information
264   */
265   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
266   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
267   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
268   if (flg1 || flg2 || flg3){
269 
270     /*
271        Print "higher-level" package version message
272     */
273     if (PetscExternalVersionFunction) {
274       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
275     }
276 
277     ierr = PetscGetVersion(&version,256);CHKERRQ(ierr);
278     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
279 ------------------------------\n");CHKERRQ(ierr);
280     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
281     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
282     ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr);
283     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
284     ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr);
285     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
286     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
287     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
288 ------------------------------\n");CHKERRQ(ierr);
289   }
290 
291   /*
292        Print "higher-level" package help message
293   */
294   if (flg3){
295     if (PetscExternalHelpFunction) {
296       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
297     }
298   }
299 
300   /*
301       Setup the error handling
302   */
303   ierr = PetscOptionsHasName(PETSC_NULL,"-fp_trap",&flg1);CHKERRQ(ierr);
304   if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); }
305   ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_abort",&flg1);CHKERRQ(ierr);
306   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)}
307   ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_mpiabort",&flg1);CHKERRQ(ierr);
308   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr)}
309   ierr = PetscOptionsHasName(PETSC_NULL,"-mpi_return_on_error",&flg1);CHKERRQ(ierr);
310   if (flg1) {
311     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
312   }
313   ierr = PetscOptionsHasName(PETSC_NULL,"-error_output_none",&flg1);CHKERRQ(ierr);
314   if (flg1) {
315     PetscErrorPrintf = PetscErrorPrintfNone;
316   }
317   ierr = PetscOptionsHasName(PETSC_NULL,"-no_signal_handler",&flg1);CHKERRQ(ierr);
318   if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) }
319 
320   /*
321       Setup debugger information
322   */
323   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
324   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
325   if (flg1) {
326     MPI_Errhandler err_handler;
327 
328     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
329     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
330     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
331     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
332   }
333   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
334   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
335   if (flg1 || flg2) {
336     PetscMPIInt    size;
337     PetscInt       lsize,*nodes;
338     MPI_Errhandler err_handler;
339     /*
340        we have to make sure that all processors have opened
341        connections to all other processors, otherwise once the
342        debugger has stated it is likely to receive a SIGUSR1
343        and kill the program.
344     */
345     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
346     if (size > 2) {
347       PetscMPIInt dummy;
348       MPI_Status  status;
349       for (i=0; i<size; i++) {
350         if (rank != i) {
351           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
352         }
353       }
354       for (i=0; i<size; i++) {
355         if (rank != i) {
356           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
357         }
358       }
359     }
360     /* check if this processor node should be in debugger */
361     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
362     lsize = size;
363     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
364     if (flag) {
365       for (i=0; i<lsize; i++) {
366         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
367       }
368     }
369     if (!flag) {
370       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
371       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
372       if (flg1) {
373         ierr = PetscAttachDebugger();CHKERRQ(ierr);
374       } else {
375         ierr = PetscStopForDebugger();CHKERRQ(ierr);
376       }
377       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
378       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
379     }
380     ierr = PetscFree(nodes);CHKERRQ(ierr);
381   }
382 
383   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
384   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)}
385 
386   /*
387         Setup profiling and logging
388   */
389 #if defined (PETSC_USE_INFO)
390   ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr);
391   if (flg1) {
392     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
393     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
394     if (logname[0]) {
395       PetscInfoAllow(PETSC_TRUE,logname);
396     } else {
397       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
398     }
399   }
400 #endif
401 #if defined(PETSC_USE_LOG)
402   mname[0] = 0;
403   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
404   if (flg1) {
405     if (mname[0]) {
406       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
407     } else {
408       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
409     }
410   }
411 #if defined(PETSC_HAVE_MPE)
412   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
413   if (flg1) PetscLogMPEBegin();
414 #endif
415   ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr);
416   ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr);
417   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
418   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
419   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
420 
421   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
422   if (flg1) {
423     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
424     FILE *file;
425     if (mname[0]) {
426       sprintf(name,"%s.%d",mname,rank);
427       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
428       file = fopen(fname,"w");
429       if (!file) {
430         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
431       }
432     } else {
433       file = stdout;
434     }
435     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
436   }
437 #endif
438 
439   /*
440       Setup building of stack frames for all function calls
441   */
442 #if defined(PETSC_USE_DEBUG)
443   ierr = PetscStackCreate();CHKERRQ(ierr);
444 #endif
445 
446   ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr);
447 
448   /*
449        Print basic help message
450   */
451   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
452   if (flg1) {
453     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
454     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
455     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
456     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
457     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
458     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
459     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
460     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
461     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
462     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
463     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
464     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
465     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
466     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
467     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
468     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
469     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
470     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
471     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
472     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
473     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
474     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
475     ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr);
476     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
477     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
478     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
479     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
480     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
481     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
482     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
483     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
484 #if defined(PETSC_USE_LOG)
485     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
486     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
487     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
488 #if defined(PETSC_HAVE_MPE)
489     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
490 #endif
491     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
492 #endif
493     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
494     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
495     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
496     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
497   }
498 
499   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
500   if (flg1) {
501     ierr = PetscSleep(si);CHKERRQ(ierr);
502   }
503 
504   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
505   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
506   if (f) {
507     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
508   }
509 
510   PetscFunctionReturn(0);
511 }
512 
513 
514