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