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