xref: /petsc/src/sys/objects/init.c (revision 25462798e3bf7473e331de49e67002b71c5f19fa)
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 #include "zope.h"
20 
21 /* ------------------------Nasty global variables -------------------------------*/
22 /*
23      Indicates if PETSc started up MPI, or it was
24    already started before PETSc was initialized.
25 */
26 PetscTruth  PETSC_DLLEXPORT PetscBeganMPI         = PETSC_FALSE;
27 PetscTruth  PETSC_DLLEXPORT PetscInitializeCalled = PETSC_FALSE;
28 PetscTruth  PETSC_DLLEXPORT PetscFinalizeCalled   = PETSC_FALSE;
29 PetscMPIInt PETSC_DLLEXPORT PetscGlobalRank = -1;
30 PetscMPIInt PETSC_DLLEXPORT PetscGlobalSize = -1;
31 
32 #if defined(PETSC_USE_COMPLEX)
33 #if defined(PETSC_COMPLEX_INSTANTIATE)
34 template <> class std::complex<double>; /* instantiate complex template class */
35 #endif
36 MPI_Datatype  PETSC_DLLEXPORT MPIU_COMPLEX;
37 PetscScalar   PETSC_DLLEXPORT PETSC_i;
38 #else
39 PetscScalar   PETSC_DLLEXPORT PETSC_i = 0.0;
40 #endif
41 MPI_Datatype  PETSC_DLLEXPORT MPIU_2SCALAR = 0;
42 MPI_Datatype  PETSC_DLLEXPORT MPIU_2INT = 0;
43 /*
44      These are needed by petscbt.h
45 */
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, flgz;
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   ierr=PetscOptionsHasName(PETSC_NULL,"-z", &flgz); CHKERRQ(ierr);
388   if(flgz){
389     extern int PETSC_SOCKFD;
390     extern int PETSC_LISTENFD;
391     extern int PETSC_LISTEN_CHECK;
392     char hostname[] = "hookshot.mcs.anl.gov";
393     int remoteport = 9999;
394     int listenport = 9998;
395     PETSC_SOCKFD = PetscOpenSocket(hostname, remoteport);
396     PETSC_LISTEN_CHECK = 1;
397     PETSC_LISTENFD = PetscSocketListen(hostname, listenport);
398     PETSC_STDOUT = fdopen(PETSC_SOCKFD, "w");
399     fprintf(PETSC_STDOUT, "<<<start>>>");
400   }
401 
402   /*
403         Setup profiling and logging
404   */
405 #if defined (PETSC_USE_INFO)
406   ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr);
407   if (flg1) {
408     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
409     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
410     if (logname[0]) {
411       PetscInfoAllow(PETSC_TRUE,logname);
412     } else {
413       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
414     }
415   }
416 #endif
417 #if defined(PETSC_USE_LOG)
418   mname[0] = 0;
419   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
420   if (flg1) {
421     if (mname[0]) {
422       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
423     } else {
424       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
425     }
426   }
427 #if defined(PETSC_HAVE_MPE)
428   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
429   if (flg1) PetscLogMPEBegin();
430 #endif
431   ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr);
432   ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr);
433   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
434   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
435   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
436 
437   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
438   if (flg1) {
439     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
440     FILE *file;
441     if (mname[0]) {
442       sprintf(name,"%s.%d",mname,rank);
443       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
444       file = fopen(fname,"w");
445       if (!file) {
446         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
447       }
448     } else {
449       file = PETSC_STDOUT;
450     }
451     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
452   }
453 #endif
454 
455   /*
456       Setup building of stack frames for all function calls
457   */
458 #if defined(PETSC_USE_DEBUG)
459   ierr = PetscStackCreate();CHKERRQ(ierr);
460 #endif
461 
462   ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr);
463 
464   /*
465        Print basic help message
466   */
467   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
468   if (flg1) {
469     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
470     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
471     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
472     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
473     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
474     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
475     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
476     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
477     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
478     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
479     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
480     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
481     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
482     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
483     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
484     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
485     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
486     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
487     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
488     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
489     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
490     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
491     ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr);
492     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
493     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
494     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
495     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
496     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
497     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
498     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
499     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
500 #if defined(PETSC_USE_LOG)
501     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
502     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
503     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
504 #if defined(PETSC_HAVE_MPE)
505     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
506 #endif
507     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
508 #endif
509     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
510     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
511     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
512     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
513   }
514 
515   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
516   if (flg1) {
517     ierr = PetscSleep(si);CHKERRQ(ierr);
518   }
519 
520   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
521   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
522   if (f) {
523     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
524   }
525 
526   PetscFunctionReturn(0);
527 }
528 
529 
530