xref: /petsc/src/sys/objects/init.c (revision 077c8da13ac6100ca323339b1778d12df6637869)
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,"-malloc_info",&flg1);CHKERRQ(ierr);
252   if (!flg1) {
253     ierr = PetscOptionsHasName(PETSC_NULL,"-memory_info",&flg1);CHKERRQ(ierr);
254   }
255   if (flg1) {
256     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
257   }
258 
259   /*
260       Set the display variable for graphics
261   */
262   ierr = PetscSetDisplay();CHKERRQ(ierr);
263 
264   /*
265       Print the PETSc version information
266   */
267   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
268   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
269   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
270   if (flg1 || flg2 || flg3){
271 
272     /*
273        Print "higher-level" package version message
274     */
275     if (PetscExternalVersionFunction) {
276       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
277     }
278 
279     ierr = PetscGetVersion(&version);CHKERRQ(ierr);
280     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
281 ------------------------------\n");CHKERRQ(ierr);
282     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
283     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
284     ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr);
285     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
286     ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr);
287     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
288     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
289     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
290 ------------------------------\n");CHKERRQ(ierr);
291   }
292 
293   /*
294        Print "higher-level" package help message
295   */
296   if (flg3){
297     if (PetscExternalHelpFunction) {
298       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
299     }
300   }
301 
302   /*
303       Setup the error handling
304   */
305   ierr = PetscOptionsHasName(PETSC_NULL,"-fp_trap",&flg1);CHKERRQ(ierr);
306   if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); }
307   ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_abort",&flg1);CHKERRQ(ierr);
308   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)}
309   ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_stop",&flg1);CHKERRQ(ierr);
310   if (flg1) { ierr = PetscPushErrorHandler(PetscStopErrorHandler,0);CHKERRQ(ierr)}
311   ierr = PetscOptionsHasName(PETSC_NULL,"-mpi_return_on_error",&flg1);CHKERRQ(ierr);
312   if (flg1) {
313     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
314   }
315   ierr = PetscOptionsHasName(PETSC_NULL,"-no_signal_handler",&flg1);CHKERRQ(ierr);
316   if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) }
317 
318   /*
319       Setup debugger information
320   */
321   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
322   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
323   if (flg1) {
324     MPI_Errhandler err_handler;
325 
326     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
327     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
328     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
329     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
330   }
331   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
332   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
333   if (flg1 || flg2) {
334     PetscMPIInt    size;
335     PetscInt       lsize,*nodes;
336     MPI_Errhandler err_handler;
337     /*
338        we have to make sure that all processors have opened
339        connections to all other processors, otherwise once the
340        debugger has stated it is likely to receive a SIGUSR1
341        and kill the program.
342     */
343     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
344     if (size > 2) {
345       PetscMPIInt dummy;
346       MPI_Status  status;
347       for (i=0; i<size; i++) {
348         if (rank != i) {
349           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
350         }
351       }
352       for (i=0; i<size; i++) {
353         if (rank != i) {
354           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
355         }
356       }
357     }
358     /* check if this processor node should be in debugger */
359     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
360     lsize = size;
361     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
362     if (flag) {
363       for (i=0; i<lsize; i++) {
364         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
365       }
366     }
367     if (!flag) {
368       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
369       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
370       if (flg1) {
371         ierr = PetscAttachDebugger();CHKERRQ(ierr);
372       } else {
373         ierr = PetscStopForDebugger();CHKERRQ(ierr);
374       }
375       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
376       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
377     }
378     ierr = PetscFree(nodes);CHKERRQ(ierr);
379   }
380 
381   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
382   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)}
383 
384   /*
385         Setup profiling and logging
386   */
387 #if defined (PETSC_USE_INFO)
388   ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr);
389   if (flg1) {
390     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
391     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
392     if (logname[0]) {
393       PetscInfoAllow(PETSC_TRUE,logname);
394     } else {
395       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
396     }
397   }
398 #endif
399 #if defined(PETSC_USE_LOG)
400   mname[0] = 0;
401   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
402   if (flg1) {
403     if (mname[0]) {
404       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
405     } else {
406       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
407     }
408   }
409 #if defined(PETSC_HAVE_MPE)
410   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
411   if (flg1) PetscLogMPEBegin();
412 #endif
413   ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr);
414   ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr);
415   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
416   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
417   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
418 
419   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
420   if (flg1) {
421     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
422     FILE *file;
423     if (mname[0]) {
424       sprintf(name,"%s.%d",mname,rank);
425       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
426       file = fopen(fname,"w");
427       if (!file) {
428         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
429       }
430     } else {
431       file = stdout;
432     }
433     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
434   }
435 #endif
436 
437   /*
438       Setup building of stack frames for all function calls
439   */
440 #if defined(PETSC_USE_DEBUG)
441   ierr = PetscStackCreate();CHKERRQ(ierr);
442 #endif
443 
444   ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr);
445 
446   /*
447        Print basic help message
448   */
449   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
450   if (flg1) {
451     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
452     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
453     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
454     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
455     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
456     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
457     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
458     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
459     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
460     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
461     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
462     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
463     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
464     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
465     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
466     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
467     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
468     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
469     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
470     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
471     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
472     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
473     ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr);
474     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
475     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
476     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
477     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
478     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
479     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
480     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
481     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
482 #if defined(PETSC_USE_LOG)
483     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
484     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
485     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
486 #if defined(PETSC_HAVE_MPE)
487     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
488 #endif
489     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
490 #endif
491     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
492     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
493     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
494     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
495   }
496 
497   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
498   if (flg1) {
499     ierr = PetscSleep(si);CHKERRQ(ierr);
500   }
501 
502   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
503   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
504   if (f) {
505     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
506   }
507 
508   PetscFunctionReturn(0);
509 }
510 
511 
512