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