xref: /petsc/src/sys/objects/init.c (revision 192daf7cd86056b082984d0d4358c7fe5ba67f57)
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,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
338   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
339   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
340   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
341   if (flg1 || flg2) {
342     PetscMPIInt    size;
343     PetscInt       lsize,*nodes;
344     MPI_Errhandler err_handler;
345     /*
346        we have to make sure that all processors have opened
347        connections to all other processors, otherwise once the
348        debugger has stated it is likely to receive a SIGUSR1
349        and kill the program.
350     */
351     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
352     if (size > 2) {
353       PetscMPIInt dummy;
354       MPI_Status  status;
355       for (i=0; i<size; i++) {
356         if (rank != i) {
357           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
358         }
359       }
360       for (i=0; i<size; i++) {
361         if (rank != i) {
362           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
363         }
364       }
365     }
366     /* check if this processor node should be in debugger */
367     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
368     lsize = size;
369     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
370     if (flag) {
371       for (i=0; i<lsize; i++) {
372         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
373       }
374     }
375     if (!flag) {
376       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
377       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
378       if (flg1) {
379         ierr = PetscAttachDebugger();CHKERRQ(ierr);
380       } else {
381         ierr = PetscStopForDebugger();CHKERRQ(ierr);
382       }
383       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
384       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
385     }
386     ierr = PetscFree(nodes);CHKERRQ(ierr);
387   }
388 
389   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
390   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)}
391 
392 
393   /*
394     Activates new sockets for zope if needed
395   */
396   ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz); CHKERRQ(ierr);
397   ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout); CHKERRQ(ierr);
398   if(flgz){
399     extern FILE* PETSC_ZOPEFD;
400     int sockfd;
401     char hostname[256];
402     char username[256];
403     int remoteport = 9999;
404     ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
405     if(!hostname[0]){
406       ierr=PetscGetHostName(hostname,256); CHKERRQ(ierr);}
407     ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr);
408     ierr = PetscGetUserName(username, 256);
409     PETSC_ZOPEFD = fdopen(sockfd, "w");
410     if(flgzout){
411       PETSC_STDOUT = PETSC_ZOPEFD;
412       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
413       fprintf(PETSC_STDOUT, "<<<start>>>");
414     }
415     else{
416       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
417       fprintf(PETSC_ZOPEFD, "<<<start>>>");
418     }}
419 
420   /*
421         Setup profiling and logging
422   */
423 #if defined (PETSC_USE_INFO)
424   ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr);
425   if (flg1) {
426     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
427     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
428     if (logname[0]) {
429       PetscInfoAllow(PETSC_TRUE,logname);
430     } else {
431       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
432     }
433   }
434 #endif
435 #if defined(PETSC_USE_LOG)
436   mname[0] = 0;
437   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
438   if (flg1) {
439     if (mname[0]) {
440       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
441     } else {
442       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
443     }
444   }
445 #if defined(PETSC_HAVE_MPE)
446   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
447   if (flg1) PetscLogMPEBegin();
448 #endif
449   ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr);
450   ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr);
451   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
452   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
453   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
454 
455   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
456   if (flg1) {
457     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
458     FILE *file;
459     if (mname[0]) {
460       sprintf(name,"%s.%d",mname,rank);
461       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
462       file = fopen(fname,"w");
463       if (!file) {
464         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
465       }
466     } else {
467       file = PETSC_STDOUT;
468     }
469     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
470   }
471 #endif
472 
473   /*
474       Setup building of stack frames for all function calls
475   */
476 #if defined(PETSC_USE_DEBUG)
477   ierr = PetscStackCreate();CHKERRQ(ierr);
478 #endif
479 
480   ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr);
481 
482   /*
483        Print basic help message
484   */
485   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
486   if (flg1) {
487     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
488     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
489     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
490     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
491     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
492     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
493     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
494     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
495     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
496     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
497     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
498     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
499     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
500     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
501     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
502     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
503     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
504     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
505     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
506     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
507     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
508     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
509     ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr);
510     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
511     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
512     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
513     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
514     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
515     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
516     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
517     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
518 #if defined(PETSC_USE_LOG)
519     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
520     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
521     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
522 #if defined(PETSC_HAVE_MPE)
523     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
524 #endif
525     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
526 #endif
527     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
528     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
529     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
530     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
531   }
532 
533   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
534   if (flg1) {
535     ierr = PetscSleep(si);CHKERRQ(ierr);
536   }
537 
538   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
539   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
540   if (f) {
541     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
542   }
543 
544 
545   PetscFunctionReturn(0);
546 }
547 
548 
549