xref: /petsc/src/sys/objects/init.c (revision 46edd32f2d45ea29d6d2c0b2b2be47c17203695c)
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 #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
36 MPI_Datatype  PETSC_DLLEXPORT MPI_C_DOUBLE_COMPLEX;
37 #endif
38 PetscScalar   PETSC_DLLEXPORT PETSC_i;
39 #else
40 PetscScalar   PETSC_DLLEXPORT PETSC_i = 0.0;
41 #endif
42 MPI_Datatype  PETSC_DLLEXPORT MPIU_2SCALAR = 0;
43 MPI_Datatype  PETSC_DLLEXPORT MPIU_2INT = 0;
44 
45 #if defined(PETSC_USE_SCALAR_QD_DD)
46 MPI_Datatype  PETSC_DLLEXPORT MPIU_QD_DD;
47 #endif
48 /*
49      These are needed by petscbt.h
50 */
51 #include "petscbt.h"
52 char     PETSC_DLLEXPORT _BT_mask = ' ';
53 char     PETSC_DLLEXPORT _BT_c = ' ';
54 PetscInt PETSC_DLLEXPORT _BT_idx  = 0;
55 
56 /*
57        Function that is called to display all error messages
58 */
59 PetscErrorCode PETSC_DLLEXPORT (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
60 PetscErrorCode PETSC_DLLEXPORT (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
61 PetscErrorCode PETSC_DLLEXPORT (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
62 
63 /* ------------------------------------------------------------------------------*/
64 /*
65    Optional file where all PETSc output from various prints is saved
66 */
67 FILE *petsc_history = PETSC_NULL;
68 
69 #undef __FUNCT__
70 #define __FUNCT__ "PetscLogOpenHistoryFile"
71 PetscErrorCode PETSC_DLLEXPORT PetscLogOpenHistoryFile(const char filename[],FILE **fd)
72 {
73   PetscErrorCode ierr;
74   PetscMPIInt    rank,size;
75   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
76   char           version[256];
77 
78   PetscFunctionBegin;
79   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
80   if (!rank) {
81     char arch[10];
82     int  err;
83 
84     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
85     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
86     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
87     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
88     if (filename) {
89       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
90     } else {
91       ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr);
92       ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr);
93       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
94     }
95 
96     *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
97     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
98     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
99     ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
100     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
101     ierr = PetscOptionsPrint(*fd);CHKERRQ(ierr);
102     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
103     err = fflush(*fd);
104     if (err) SETERRQ(PETSC_ERR_SYS,"fflush() failed on file");
105   }
106   PetscFunctionReturn(0);
107 }
108 
109 #undef __FUNCT__
110 #define __FUNCT__ "PetscLogCloseHistoryFile"
111 PetscErrorCode PETSC_DLLEXPORT PetscLogCloseHistoryFile(FILE **fd)
112 {
113   PetscErrorCode ierr;
114   PetscMPIInt    rank;
115   char           date[64];
116   int            err;
117 
118   PetscFunctionBegin;
119   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
120   if (!rank) {
121     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
122     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
123     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
124     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
125     err = fflush(*fd);
126     if (err) SETERRQ(PETSC_ERR_SYS,"fflush() failed on file");
127     err = fclose(*fd);
128     if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file");
129   }
130   PetscFunctionReturn(0);
131 }
132 
133 /* ------------------------------------------------------------------------------*/
134 
135 /*
136    This is ugly and probably belongs somewhere else, but I want to
137   be able to put a true MPI abort error handler with command line args.
138 
139     This is so MPI errors in the debugger will leave all the stack
140   frames. The default abort cleans up and exits.
141 */
142 
143 #undef __FUNCT__
144 #define __FUNCT__ "Petsc_MPI_AbortOnError"
145 void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
146 {
147   PetscFunctionBegin;
148   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
149   abort();
150 }
151 
152 #undef __FUNCT__
153 #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
154 void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
155 {
156   PetscErrorCode ierr;
157 
158   PetscFunctionBegin;
159   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
160   ierr = PetscAttachDebugger();
161   if (ierr) { /* hopeless so get out */
162     MPI_Finalize();
163     exit(*flag);
164   }
165 }
166 
167 #undef __FUNCT__
168 #define __FUNCT__ "PetscEnd"
169 /*@C
170    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
171      wishes a clean exit somewhere deep in the program.
172 
173    Collective on PETSC_COMM_WORLD
174 
175    Options Database Keys are the same as for PetscFinalize()
176 
177    Level: advanced
178 
179    Note:
180    See PetscInitialize() for more general runtime options.
181 
182 .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
183 @*/
184 PetscErrorCode PETSC_DLLEXPORT PetscEnd(void)
185 {
186   PetscFunctionBegin;
187   PetscFinalize();
188   exit(0);
189   return 0;
190 }
191 
192 PetscTruth   PetscOptionsPublish = PETSC_FALSE;
193 EXTERN PetscErrorCode        PetscSetUseTrMalloc_Private(void);
194 extern PetscTruth petscsetmallocvisited;
195 static char       emacsmachinename[256];
196 
197 PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0;
198 PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = 0;
199 
200 #undef __FUNCT__
201 #define __FUNCT__ "PetscSetHelpVersionFunctions"
202 /*@C
203    PetscSetHelpVersionFunctions - Sets functions that print help and version information
204    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
205    This routine enables a "higher-level" package that uses PETSc to print its messages first.
206 
207    Input Parameter:
208 +  help - the help function (may be PETSC_NULL)
209 -  version - the version function (may be PETSC_NULL)
210 
211    Level: developer
212 
213    Concepts: package help message
214 
215 @*/
216 PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
217 {
218   PetscFunctionBegin;
219   PetscExternalHelpFunction    = help;
220   PetscExternalVersionFunction = version;
221   PetscFunctionReturn(0);
222 }
223 
224 #undef __FUNCT__
225 #define __FUNCT__ "PetscOptionsCheckInitial_Private"
226 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Private(void)
227 {
228   char           string[64],mname[PETSC_MAX_PATH_LEN],*f;
229   MPI_Comm       comm = PETSC_COMM_WORLD;
230   PetscTruth     flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,flgz,flgzout;
231   PetscErrorCode ierr;
232   PetscReal      si;
233   int            i;
234   PetscMPIInt    rank;
235   char           version[256];
236 
237   PetscFunctionBegin;
238   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
239 
240   /*
241       Setup the memory management; support for tracing malloc() usage
242   */
243   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);CHKERRQ(ierr);
244 #if defined(PETSC_USE_DEBUG)
245   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr);
246   if ((!flg2 || flg1) && !petscsetmallocvisited) {
247     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
248   }
249 #else
250   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
251   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr);
252   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
253 #endif
254   if (flg3) {
255     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
256   }
257   flg1 = PETSC_FALSE;
258   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr);
259   if (flg1) {
260     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
261     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
262   }
263 
264   flg1 = PETSC_FALSE;
265   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
266   if (!flg1) {
267     flg1 = PETSC_FALSE;
268     ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
269   }
270   if (flg1) {
271     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
272   }
273 
274   /*
275       Set the display variable for graphics
276   */
277   ierr = PetscSetDisplay();CHKERRQ(ierr);
278 
279   /*
280       Print the PETSc version information
281   */
282   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
283   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
284   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
285   if (flg1 || flg2 || flg3){
286 
287     /*
288        Print "higher-level" package version message
289     */
290     if (PetscExternalVersionFunction) {
291       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
292     }
293 
294     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
295     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
296 ------------------------------\n");CHKERRQ(ierr);
297     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
298     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
299     ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr);
300     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
301     ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr);
302     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
303     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
304     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
305 ------------------------------\n");CHKERRQ(ierr);
306   }
307 
308   /*
309        Print "higher-level" package help message
310   */
311   if (flg3){
312     if (PetscExternalHelpFunction) {
313       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
314     }
315   }
316 
317   /*
318       Setup the error handling
319   */
320   flg1 = PETSC_FALSE;
321   ierr = PetscOptionsGetTruth(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr);
322   if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); }
323   flg1 = PETSC_FALSE;
324   ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr);
325   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)}
326   flg1 = PETSC_FALSE;
327   ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr);
328   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr)}
329   flg1 = PETSC_FALSE;
330   ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr);
331   if (flg1) {
332     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
333   }
334   flg1 = PETSC_FALSE;
335   ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
336   if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) }
337 
338   /*
339       Setup debugger information
340   */
341   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
342   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
343   if (flg1) {
344     MPI_Errhandler err_handler;
345 
346     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
347     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
348     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
349     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
350   }
351   ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
352   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
353   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
354   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
355   if (flg1 || flg2) {
356     PetscMPIInt    size;
357     PetscInt       lsize,*nodes;
358     MPI_Errhandler err_handler;
359     /*
360        we have to make sure that all processors have opened
361        connections to all other processors, otherwise once the
362        debugger has stated it is likely to receive a SIGUSR1
363        and kill the program.
364     */
365     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
366     if (size > 2) {
367       PetscMPIInt dummy = 0;
368       MPI_Status  status;
369       for (i=0; i<size; i++) {
370         if (rank != i) {
371           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
372         }
373       }
374       for (i=0; i<size; i++) {
375         if (rank != i) {
376           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
377         }
378       }
379     }
380     /* check if this processor node should be in debugger */
381     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
382     lsize = size;
383     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
384     if (flag) {
385       for (i=0; i<lsize; i++) {
386         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
387       }
388     }
389     if (!flag) {
390       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
391       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
392       if (flg1) {
393         ierr = PetscAttachDebugger();CHKERRQ(ierr);
394       } else {
395         ierr = PetscStopForDebugger();CHKERRQ(ierr);
396       }
397       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
398       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
399     }
400     ierr = PetscFree(nodes);CHKERRQ(ierr);
401   }
402 
403   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
404   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)}
405 
406 #if defined(PETSC_USE_SOCKET_VIEWER)
407   /*
408     Activates new sockets for zope if needed
409   */
410   ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr);
411   ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr);
412   if(flgz){
413     extern FILE* PETSC_ZOPEFD;
414     int sockfd;
415     char hostname[256];
416     char username[256];
417     int remoteport = 9999;
418     ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
419     if(!hostname[0]){
420       ierr=PetscGetHostName(hostname,256);CHKERRQ(ierr);}
421     ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr);
422     ierr = PetscGetUserName(username, 256);
423     PETSC_ZOPEFD = fdopen(sockfd, "w");
424     if(flgzout){
425       PETSC_STDOUT = PETSC_ZOPEFD;
426       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
427       fprintf(PETSC_STDOUT, "<<<start>>>");
428     }
429     else{
430       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
431       fprintf(PETSC_ZOPEFD, "<<<start>>>");
432     }}
433 #endif
434 
435   /*
436         Setup profiling and logging
437   */
438 #if defined (PETSC_USE_INFO)
439   flg1 = PETSC_FALSE;
440   ierr = PetscOptionsGetTruth(PETSC_NULL,"-info",&flg1,PETSC_NULL);CHKERRQ(ierr);
441   if (flg1) {
442     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
443     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
444     if (logname[0]) {
445       PetscInfoAllow(PETSC_TRUE,logname);
446     } else {
447       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
448     }
449   }
450 #endif
451 #if defined(PETSC_USE_LOG)
452   mname[0] = 0;
453   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
454   if (flg1) {
455     if (mname[0]) {
456       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
457     } else {
458       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
459     }
460   }
461 #if defined(PETSC_HAVE_MPE)
462   flg1 = PETSC_FALSE;
463   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_mpe",&flg1,PETSC_NULL);CHKERRQ(ierr);
464   if (flg1) PetscLogMPEBegin();
465 #endif
466   flg1 = PETSC_FALSE;
467   flg2 = PETSC_FALSE;
468   flg3 = PETSC_FALSE;
469   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr);
470   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr);
471   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
472   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
473   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
474 
475   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
476   if (flg1) {
477     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
478     FILE *file;
479     if (mname[0]) {
480       sprintf(name,"%s.%d",mname,rank);
481       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
482       file = fopen(fname,"w");
483       if (!file) {
484         SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
485       }
486     } else {
487       file = PETSC_STDOUT;
488     }
489     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
490   }
491 #endif
492 
493   /*
494       Setup building of stack frames for all function calls
495   */
496 #if defined(PETSC_USE_DEBUG)
497   ierr = PetscStackCreate();CHKERRQ(ierr);
498 #endif
499 
500   ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr);
501 
502   /*
503        Print basic help message
504   */
505   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
506   if (flg1) {
507     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
508     ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option");CHKERRQ(ierr);
509     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
510     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       only when run in the debugger\n");CHKERRQ(ierr);
511     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
512     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
513     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
514     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
515     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
516     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
517     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
518     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
519     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
520     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
521     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
522     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
523     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
524     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
525     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
526     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
527     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
528     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
529     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
530     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
531     ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr);
532     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
533     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
534     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
535     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
536     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
537     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
538     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
539     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
540 #if defined(PETSC_USE_LOG)
541     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
542     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
543     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
544 #if defined(PETSC_HAVE_MPE)
545     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
546 #endif
547     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
548 #endif
549     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
550     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
551     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
552     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
553   }
554 
555   ierr = PetscOptionsGetReal(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
556   if (flg1) {
557     ierr = PetscSleep(si);CHKERRQ(ierr);
558   }
559 
560   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
561   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
562   if (f) {
563     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
564   }
565 
566 
567   PetscFunctionReturn(0);
568 }
569 
570 
571