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