xref: /petsc/src/sys/objects/init.c (revision dbf0e21dc9b62c19f2224f20451fa79066c7e006)
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 /* ------------------------Nasty global variables -------------------------------*/
20 /*
21      Indicates if PETSc started up MPI, or it was
22    already started before PETSc was initialized.
23 */
24 PetscTruth  PETSC_DLLEXPORT PetscBeganMPI         = PETSC_FALSE;
25 PetscTruth  PETSC_DLLEXPORT PetscInitializeCalled = PETSC_FALSE;
26 PetscTruth  PETSC_DLLEXPORT PetscFinalizeCalled   = PETSC_FALSE;
27 PetscMPIInt PETSC_DLLEXPORT PetscGlobalRank = -1;
28 PetscMPIInt PETSC_DLLEXPORT PetscGlobalSize = -1;
29 
30 #if defined(PETSC_USE_COMPLEX)
31 #if defined(PETSC_COMPLEX_INSTANTIATE)
32 template <> class std::complex<double>; /* instantiate complex template class */
33 #endif
34 MPI_Datatype  PETSC_DLLEXPORT MPIU_COMPLEX;
35 PetscScalar   PETSC_DLLEXPORT PETSC_i;
36 #else
37 PetscScalar   PETSC_DLLEXPORT PETSC_i = 0.0;
38 #endif
39 MPI_Datatype  PETSC_DLLEXPORT MPIU_2SCALAR = 0;
40 MPI_Datatype  PETSC_DLLEXPORT MPIU_2INT = 0;
41 /*
42      These are needed by petscbt.h
43 */
44 #include "petscbt.h"
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     int  err;
76 
77     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
78     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
79     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
80     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
81     if (filename) {
82       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
83     } else {
84       ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr);
85       ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr);
86       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
87     }
88 
89     *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
90     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
91     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
92     ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
93     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
94     ierr = PetscOptionsPrint(*fd);CHKERRQ(ierr);
95     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
96     err = fflush(*fd);
97     if (err) SETERRQ(PETSC_ERR_SYS,"fflush() failed on file");
98   }
99   PetscFunctionReturn(0);
100 }
101 
102 #undef __FUNCT__
103 #define __FUNCT__ "PetscLogCloseHistoryFile"
104 PetscErrorCode PETSC_DLLEXPORT PetscLogCloseHistoryFile(FILE **fd)
105 {
106   PetscErrorCode ierr;
107   PetscMPIInt    rank;
108   char           date[64];
109   int            err;
110 
111   PetscFunctionBegin;
112   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
113   if (!rank) {
114     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
115     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
116     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
117     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
118     err = fflush(*fd);
119     if (err) SETERRQ(PETSC_ERR_SYS,"fflush() failed on file");
120     err = fclose(*fd);
121     if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file");
122   }
123   PetscFunctionReturn(0);
124 }
125 
126 /* ------------------------------------------------------------------------------*/
127 
128 /*
129    This is ugly and probably belongs somewhere else, but I want to
130   be able to put a true MPI abort error handler with command line args.
131 
132     This is so MPI errors in the debugger will leave all the stack
133   frames. The default abort cleans up and exits.
134 */
135 
136 #undef __FUNCT__
137 #define __FUNCT__ "Petsc_MPI_AbortOnError"
138 void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
139 {
140   PetscFunctionBegin;
141   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
142   abort();
143 }
144 
145 #undef __FUNCT__
146 #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
147 void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
148 {
149   PetscErrorCode ierr;
150 
151   PetscFunctionBegin;
152   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
153   ierr = PetscAttachDebugger();
154   if (ierr) { /* hopeless so get out */
155     MPI_Finalize();
156     exit(*flag);
157   }
158 }
159 
160 #undef __FUNCT__
161 #define __FUNCT__ "PetscEnd"
162 /*@C
163    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
164      wishes a clean exit somewhere deep in the program.
165 
166    Collective on PETSC_COMM_WORLD
167 
168    Options Database Keys are the same as for PetscFinalize()
169 
170    Level: advanced
171 
172    Note:
173    See PetscInitialize() for more general runtime options.
174 
175 .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
176 @*/
177 PetscErrorCode PETSC_DLLEXPORT PetscEnd(void)
178 {
179   PetscFunctionBegin;
180   PetscFinalize();
181   exit(0);
182   return 0;
183 }
184 
185 PetscTruth   PetscOptionsPublish = PETSC_FALSE;
186 EXTERN PetscErrorCode        PetscSetUseTrMalloc_Private(void);
187 extern PetscTruth petscsetmallocvisited;
188 static char       emacsmachinename[256];
189 
190 PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0;
191 PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = 0;
192 
193 #undef __FUNCT__
194 #define __FUNCT__ "PetscSetHelpVersionFunctions"
195 /*@C
196    PetscSetHelpVersionFunctions - Sets functions that print help and version information
197    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
198    This routine enables a "higher-level" package that uses PETSc to print its messages first.
199 
200    Input Parameter:
201 +  help - the help function (may be PETSC_NULL)
202 -  version - the version function (may be PETSc null)
203 
204    Level: developer
205 
206    Concepts: package help message
207 
208 @*/
209 PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
210 {
211   PetscFunctionBegin;
212   PetscExternalHelpFunction    = help;
213   PetscExternalVersionFunction = version;
214   PetscFunctionReturn(0);
215 }
216 
217 #undef __FUNCT__
218 #define __FUNCT__ "PetscOptionsCheckInitial_Private"
219 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Private(void)
220 {
221   char           string[64],mname[PETSC_MAX_PATH_LEN],*f;
222   MPI_Comm       comm = PETSC_COMM_WORLD;
223   PetscTruth     flg1,flg2,flg3,flag,flgz,flgzout;
224   PetscErrorCode ierr;
225   PetscInt       si;
226   int            i;
227   PetscMPIInt    rank;
228   char           version[256];
229 
230   PetscFunctionBegin;
231   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
232 
233   /*
234       Setup the memory management; support for tracing malloc() usage
235   */
236   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr);
237 #if defined(PETSC_USE_DEBUG)
238   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr);
239   if ((!flg2 || flg1) && !petscsetmallocvisited) {
240     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
241   }
242 #else
243   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr);
244   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc",&flg2);CHKERRQ(ierr);
245   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
246 #endif
247   if (flg3) {
248     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
249   }
250   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_debug",&flg1);CHKERRQ(ierr);
251   if (flg1) {
252     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
253     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
254   }
255 
256   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_info",&flg1);CHKERRQ(ierr);
257   if (!flg1) {
258     ierr = PetscOptionsHasName(PETSC_NULL,"-memory_info",&flg1);CHKERRQ(ierr);
259   }
260   if (flg1) {
261     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
262   }
263 
264   /*
265       Set the display variable for graphics
266   */
267   ierr = PetscSetDisplay();CHKERRQ(ierr);
268 
269   /*
270       Print the PETSc version information
271   */
272   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
273   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
274   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
275   if (flg1 || flg2 || flg3){
276 
277     /*
278        Print "higher-level" package version message
279     */
280     if (PetscExternalVersionFunction) {
281       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
282     }
283 
284     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
285     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
286 ------------------------------\n");CHKERRQ(ierr);
287     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
288     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
289     ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr);
290     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
291     ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr);
292     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
293     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
294     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
295 ------------------------------\n");CHKERRQ(ierr);
296   }
297 
298   /*
299        Print "higher-level" package help message
300   */
301   if (flg3){
302     if (PetscExternalHelpFunction) {
303       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
304     }
305   }
306 
307   /*
308       Setup the error handling
309   */
310   ierr = PetscOptionsHasName(PETSC_NULL,"-fp_trap",&flg1);CHKERRQ(ierr);
311   if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); }
312   ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_abort",&flg1);CHKERRQ(ierr);
313   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)}
314   ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_mpiabort",&flg1);CHKERRQ(ierr);
315   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr)}
316   ierr = PetscOptionsHasName(PETSC_NULL,"-mpi_return_on_error",&flg1);CHKERRQ(ierr);
317   if (flg1) {
318     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
319   }
320   ierr = PetscOptionsHasName(PETSC_NULL,"-no_signal_handler",&flg1);CHKERRQ(ierr);
321   if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) }
322 
323   /*
324       Setup debugger information
325   */
326   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
327   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
328   if (flg1) {
329     MPI_Errhandler err_handler;
330 
331     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
332     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
333     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
334     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
335   }
336   ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
337   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
338   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
339   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
340   if (flg1 || flg2) {
341     PetscMPIInt    size;
342     PetscInt       lsize,*nodes;
343     MPI_Errhandler err_handler;
344     /*
345        we have to make sure that all processors have opened
346        connections to all other processors, otherwise once the
347        debugger has stated it is likely to receive a SIGUSR1
348        and kill the program.
349     */
350     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
351     if (size > 2) {
352       PetscMPIInt dummy;
353       MPI_Status  status;
354       for (i=0; i<size; i++) {
355         if (rank != i) {
356           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
357         }
358       }
359       for (i=0; i<size; i++) {
360         if (rank != i) {
361           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
362         }
363       }
364     }
365     /* check if this processor node should be in debugger */
366     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
367     lsize = size;
368     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
369     if (flag) {
370       for (i=0; i<lsize; i++) {
371         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
372       }
373     }
374     if (!flag) {
375       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
376       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
377       if (flg1) {
378         ierr = PetscAttachDebugger();CHKERRQ(ierr);
379       } else {
380         ierr = PetscStopForDebugger();CHKERRQ(ierr);
381       }
382       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
383       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
384     }
385     ierr = PetscFree(nodes);CHKERRQ(ierr);
386   }
387 
388   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
389   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)}
390 
391 #if defined(PETSC_USE_SOCKET_VIEWER)
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 #endif
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," -help: prints help method for each option");CHKERRQ(ierr);
489     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
490     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
491     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
492     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
493     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
494     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
495     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
496     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
497     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
498     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
499     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
500     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
501     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
502     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
503     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
504     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
505     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
506     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
507     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
508     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
509     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
510     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
511     ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr);
512     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
513     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
514     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
515     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
516     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
517     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
518     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
519     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
520 #if defined(PETSC_USE_LOG)
521     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
522     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
523     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
524 #if defined(PETSC_HAVE_MPE)
525     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
526 #endif
527     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
528 #endif
529     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
530     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
531     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
532     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
533   }
534 
535   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
536   if (flg1) {
537     ierr = PetscSleep(si);CHKERRQ(ierr);
538   }
539 
540   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
541   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
542   if (f) {
543     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
544   }
545 
546 
547   PetscFunctionReturn(0);
548 }
549 
550 
551