xref: /petsc/src/sys/objects/init.c (revision ebb603aa86fcf6128837ce49b02ec63fe62b67bb)
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   PetscTruth flgzout;
388   ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz); CHKERRQ(ierr);
389   ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout); CHKERRQ(ierr);
390   if(flgz){
391     extern FILE* PETSC_ZOPEFD;
392     extern FILE* PETSC_STDOUT;
393     char hostname[256];
394     int remoteport = 9999;
395     int listenport = 9998;
396     ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
397     if(!hostname[0]){
398       ierr=PetscGetHostName(hostname,256); CHKERRQ(ierr);}
399     ierr=PetscOpenSocket(hostname, remoteport, &PETSC_SOCKFD);CHKERRQ(ierr);
400     PETSC_LISTEN_CHECK = 1;
401     ierr=PetscSocketListen(hostname, listenport, &PETSC_LISTENFD);CHKERRQ(ierr);
402     char username[256];
403     if(flgzout){
404       PETSC_STDOUT = fdopen(PETSC_SOCKFD, "w");
405       ierr = PetscGetUserName(username, 256);
406       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
407       fprintf(PETSC_STDOUT, "<<<start>>>");
408     }
409     else{
410       PETSC_ZOPEFD = fdopen(PETSC_SOCKFD, "w");
411       ierr = PetscGetUserName(username, 256);
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