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