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