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