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