xref: /petsc/src/sys/objects/init.c (revision fe36e6c72e90149b1cd32032337feb3f43b5df0b)
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 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,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 = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);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 = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
244   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr);
245   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
246 #endif
247   if (flg3) {
248     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
249   }
250   flg1 = PETSC_FALSE;
251   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr);
252   if (flg1) {
253     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
254     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
255   }
256 
257   flg1 = PETSC_FALSE;
258   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
259   if (!flg1) {
260     flg1 = PETSC_FALSE;
261     ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
262   }
263   if (flg1) {
264     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
265   }
266 
267   /*
268       Set the display variable for graphics
269   */
270   ierr = PetscSetDisplay();CHKERRQ(ierr);
271 
272   /*
273       Print the PETSc version information
274   */
275   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
276   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
277   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
278   if (flg1 || flg2 || flg3){
279 
280     /*
281        Print "higher-level" package version message
282     */
283     if (PetscExternalVersionFunction) {
284       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
285     }
286 
287     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
288     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
289 ------------------------------\n");CHKERRQ(ierr);
290     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
291     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
292     ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr);
293     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
294     ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr);
295     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
296     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
297     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
298 ------------------------------\n");CHKERRQ(ierr);
299   }
300 
301   /*
302        Print "higher-level" package help message
303   */
304   if (flg3){
305     if (PetscExternalHelpFunction) {
306       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
307     }
308   }
309 
310   /*
311       Setup the error handling
312   */
313   flg1 = PETSC_FALSE;
314   ierr = PetscOptionsGetTruth(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr);
315   if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); }
316   flg1 = PETSC_FALSE;
317   ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr);
318   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)}
319   flg1 = PETSC_FALSE;
320   ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr);
321   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr)}
322   flg1 = PETSC_FALSE;
323   ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr);
324   if (flg1) {
325     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
326   }
327   flg1 = PETSC_FALSE;
328   ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
329   if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) }
330 
331   /*
332       Setup debugger information
333   */
334   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
335   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
336   if (flg1) {
337     MPI_Errhandler err_handler;
338 
339     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
340     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
341     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
342     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
343   }
344   ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
345   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
346   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
347   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
348   if (flg1 || flg2) {
349     PetscMPIInt    size;
350     PetscInt       lsize,*nodes;
351     MPI_Errhandler err_handler;
352     /*
353        we have to make sure that all processors have opened
354        connections to all other processors, otherwise once the
355        debugger has stated it is likely to receive a SIGUSR1
356        and kill the program.
357     */
358     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
359     if (size > 2) {
360       PetscMPIInt dummy;
361       MPI_Status  status;
362       for (i=0; i<size; i++) {
363         if (rank != i) {
364           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
365         }
366       }
367       for (i=0; i<size; i++) {
368         if (rank != i) {
369           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
370         }
371       }
372     }
373     /* check if this processor node should be in debugger */
374     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
375     lsize = size;
376     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
377     if (flag) {
378       for (i=0; i<lsize; i++) {
379         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
380       }
381     }
382     if (!flag) {
383       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
384       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
385       if (flg1) {
386         ierr = PetscAttachDebugger();CHKERRQ(ierr);
387       } else {
388         ierr = PetscStopForDebugger();CHKERRQ(ierr);
389       }
390       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
391       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
392     }
393     ierr = PetscFree(nodes);CHKERRQ(ierr);
394   }
395 
396   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
397   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)}
398 
399 #if defined(PETSC_USE_SOCKET_VIEWER)
400   /*
401     Activates new sockets for zope if needed
402   */
403   ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr);
404   ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr);
405   if(flgz){
406     extern FILE* PETSC_ZOPEFD;
407     int sockfd;
408     char hostname[256];
409     char username[256];
410     int remoteport = 9999;
411     ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
412     if(!hostname[0]){
413       ierr=PetscGetHostName(hostname,256);CHKERRQ(ierr);}
414     ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr);
415     ierr = PetscGetUserName(username, 256);
416     PETSC_ZOPEFD = fdopen(sockfd, "w");
417     if(flgzout){
418       PETSC_STDOUT = PETSC_ZOPEFD;
419       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
420       fprintf(PETSC_STDOUT, "<<<start>>>");
421     }
422     else{
423       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
424       fprintf(PETSC_ZOPEFD, "<<<start>>>");
425     }}
426 #endif
427 
428   /*
429         Setup profiling and logging
430   */
431 #if defined (PETSC_USE_INFO)
432   flg1 = PETSC_FALSE;
433   ierr = PetscOptionsGetTruth(PETSC_NULL,"-info",&flg1,PETSC_NULL);CHKERRQ(ierr);
434   if (flg1) {
435     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
436     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
437     if (logname[0]) {
438       PetscInfoAllow(PETSC_TRUE,logname);
439     } else {
440       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
441     }
442   }
443 #endif
444 #if defined(PETSC_USE_LOG)
445   mname[0] = 0;
446   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
447   if (flg1) {
448     if (mname[0]) {
449       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
450     } else {
451       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
452     }
453   }
454 #if defined(PETSC_HAVE_MPE)
455   flg1 = PETSC_FALSE;
456   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_mpe",&flg1,PETSC_NULL);CHKERRQ(ierr);
457   if (flg1) PetscLogMPEBegin();
458 #endif
459   flg1 = PETSC_FALSE;
460   flg2 = PETSC_FALSE;
461   flg3 = PETSC_FALSE;
462   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr);
463   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr);
464   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_summary",&flg3,PETSC_NULL);CHKERRQ(ierr);
465   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
466   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
467 
468   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
469   if (flg1) {
470     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
471     FILE *file;
472     if (mname[0]) {
473       sprintf(name,"%s.%d",mname,rank);
474       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
475       file = fopen(fname,"w");
476       if (!file) {
477         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
478       }
479     } else {
480       file = PETSC_STDOUT;
481     }
482     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
483   }
484 #endif
485 
486   /*
487       Setup building of stack frames for all function calls
488   */
489 #if defined(PETSC_USE_DEBUG)
490   ierr = PetscStackCreate();CHKERRQ(ierr);
491 #endif
492 
493   ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr);
494 
495   /*
496        Print basic help message
497   */
498   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
499   if (flg1) {
500     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
501     ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option");CHKERRQ(ierr);
502     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
503     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
504     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
505     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
506     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
507     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
508     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
509     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
510     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
511     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
512     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
513     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
514     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
515     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
516     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
517     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
518     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
519     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
520     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
521     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
522     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
523     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
524     ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr);
525     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
526     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
527     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
528     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
529     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
530     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
531     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
532     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
533 #if defined(PETSC_USE_LOG)
534     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
535     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
536     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
537 #if defined(PETSC_HAVE_MPE)
538     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
539 #endif
540     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
541 #endif
542     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
543     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
544     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
545     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
546   }
547 
548   ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
549   if (flg1) {
550     ierr = PetscSleep(si);CHKERRQ(ierr);
551   }
552 
553   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
554   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
555   if (f) {
556     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
557   }
558 
559 
560   PetscFunctionReturn(0);
561 }
562 
563 
564