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