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