xref: /petsc/src/sys/objects/init.c (revision dc3071720dfa1aa23e689c7dc820998b5562ac53)
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;
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   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     int sockfd;
393     char hostname[256];
394     char username[256];
395     int remoteport = 9999;
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, &sockfd);CHKERRQ(ierr);
400     ierr = PetscGetUserName(username, 256);
401     PETSC_ZOPEFD = fdopen(sockfd, "w");
402     if(flgzout){
403       PETSC_STDOUT = PETSC_ZOPEFD;
404       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
405       fprintf(PETSC_STDOUT, "<<<start>>>");
406     }
407     else{
408       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
409       fprintf(PETSC_ZOPEFD, "<<<start>>>");
410     }}
411 
412   /*
413         Setup profiling and logging
414   */
415 #if defined (PETSC_USE_INFO)
416   ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr);
417   if (flg1) {
418     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
419     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
420     if (logname[0]) {
421       PetscInfoAllow(PETSC_TRUE,logname);
422     } else {
423       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
424     }
425   }
426 #endif
427 #if defined(PETSC_USE_LOG)
428   mname[0] = 0;
429   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
430   if (flg1) {
431     if (mname[0]) {
432       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
433     } else {
434       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
435     }
436   }
437 #if defined(PETSC_HAVE_MPE)
438   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
439   if (flg1) PetscLogMPEBegin();
440 #endif
441   ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr);
442   ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr);
443   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
444   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
445   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
446 
447   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
448   if (flg1) {
449     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
450     FILE *file;
451     if (mname[0]) {
452       sprintf(name,"%s.%d",mname,rank);
453       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
454       file = fopen(fname,"w");
455       if (!file) {
456         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
457       }
458     } else {
459       file = PETSC_STDOUT;
460     }
461     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
462   }
463 #endif
464 
465   /*
466       Setup building of stack frames for all function calls
467   */
468 #if defined(PETSC_USE_DEBUG)
469   ierr = PetscStackCreate();CHKERRQ(ierr);
470 #endif
471 
472   ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr);
473 
474   /*
475        Print basic help message
476   */
477   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
478   if (flg1) {
479     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
480     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
481     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
482     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
483     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
484     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
485     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
486     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
487     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
488     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
489     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
490     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
491     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
492     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
493     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
494     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
495     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
496     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
497     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
498     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
499     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
500     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
501     ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr);
502     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
503     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
504     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
505     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
506     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
507     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
508     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
509     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
510 #if defined(PETSC_USE_LOG)
511     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
512     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
513     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
514 #if defined(PETSC_HAVE_MPE)
515     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
516 #endif
517     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
518 #endif
519     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
520     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
521     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
522     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
523   }
524 
525   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
526   if (flg1) {
527     ierr = PetscSleep(si);CHKERRQ(ierr);
528   }
529 
530   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
531   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
532   if (f) {
533     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
534   }
535 
536   PetscFunctionReturn(0);
537 }
538 
539 
540