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