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