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