xref: /petsc/src/sys/objects/init.c (revision 6cf91177622bd3d3e4d9f7c593ec388633359851)
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_INFO)
385   ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr);
386   if (flg1) {
387     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
388     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
389     if (logname[0]) {
390       PetscInfoAllow(PETSC_TRUE,logname);
391     } else {
392       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
393     }
394   }
395 #endif
396 #if defined(PETSC_USE_LOG)
397   mname[0] = 0;
398   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
399   if (flg1) {
400     if (mname[0]) {
401       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
402     } else {
403       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
404     }
405   }
406 #if defined(PETSC_HAVE_MPE)
407   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
408   if (flg1) PetscLogMPEBegin();
409 #endif
410   ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr);
411   ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr);
412   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
413   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
414   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
415 
416   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
417   if (flg1) {
418     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
419     FILE *file;
420     if (mname[0]) {
421       sprintf(name,"%s.%d",mname,rank);
422       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
423       file = fopen(fname,"w");
424       if (!file) {
425         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
426       }
427     } else {
428       file = stdout;
429     }
430     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
431   }
432 #endif
433 
434   /*
435       Setup building of stack frames for all function calls
436   */
437 #if defined(PETSC_USE_DEBUG)
438   ierr = PetscStackCreate();CHKERRQ(ierr);
439 #endif
440 
441   ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr);
442 
443   /*
444        Print basic help message
445   */
446   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
447   if (flg1) {
448     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
449     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
450     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
451     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
452     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
453     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
454     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
455     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
456     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
457     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
458     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
459     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
460     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
461     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
462     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
463     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
464     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
465     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
466     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
467     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
468     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
469     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
470     ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr);
471     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
472     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
473     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
474     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
475     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
476     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
477     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
478     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
479 #if defined(PETSC_USE_LOG)
480     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
481     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
482     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
483 #if defined(PETSC_HAVE_MPE)
484     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
485 #endif
486     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
487 #endif
488     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
489     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
490     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
491     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
492   }
493 
494   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
495   if (flg1) {
496     ierr = PetscSleep(si);CHKERRQ(ierr);
497   }
498 
499   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
500   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
501   if (f) {
502     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
503   }
504 
505   PetscFunctionReturn(0);
506 }
507 
508 
509