xref: /petsc/src/sys/objects/init.c (revision f4e03e183c1b57e5875a61693320bb2a8a544408)
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       PetscLogInfoAllow(PETSC_TRUE,logname);
400     } else {
401       PetscLogInfoAllow(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 
440   /*
441        Print basic help message
442   */
443   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
444   if (flg1) {
445     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
446     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
447     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
448     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
449     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
450     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
451     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
452     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
453     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
454     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
455     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
456     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
457     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
458     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
459     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
460     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
461     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
462     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
463     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
464     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
465     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
466     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
467     ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr);
468     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
469     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
470     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
471     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
472     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
473     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
474     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has seperate tmp directory\n");CHKERRQ(ierr);
475     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
476 #if defined(PETSC_USE_LOG)
477     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
478     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
479     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
480 #if defined(PETSC_HAVE_MPE)
481     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
482 #endif
483     ierr = (*PetscHelpPrintf)(comm," -log_info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
484 #endif
485     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
486     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
487     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
488     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
489   }
490 
491   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
492   if (flg1) {
493     ierr = PetscSleep(si);CHKERRQ(ierr);
494   }
495 
496   ierr = PetscOptionsGetString(PETSC_NULL,"-log_info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
497   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
498   if (f) {
499     ierr = PetscLogInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
500   }
501 
502   PetscFunctionReturn(0);
503 }
504 
505 
506