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