xref: /petsc/src/sys/objects/init.c (revision e32f2f54e699d0aa6e733466c00da7e34666fe5e)
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 abort cleans up and exits.
144 */
145 
146 #undef __FUNCT__
147 #define __FUNCT__ "Petsc_MPI_AbortOnError"
148 void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
149 {
150   PetscFunctionBegin;
151   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
152   abort();
153 }
154 
155 #undef __FUNCT__
156 #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
157 void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
158 {
159   PetscErrorCode ierr;
160 
161   PetscFunctionBegin;
162   (*PetscErrorPrintf)("MPI error %d\n",(int)*flag);
163   ierr = PetscAttachDebugger();
164   if (ierr) { /* hopeless so get out */
165     MPI_Finalize();
166     exit(*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");CHKERRQ(ierr);
519     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr);
520     ierr = (*PetscHelpPrintf)(comm," detected. Useful \n       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 
580 
581