xref: /petsc/src/sys/objects/init.c (revision c6db04a5321582041def2b1e244c75985478b3ef)
1db135669SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay 
4e5c89e4eSSatish Balay    This file defines part of the initialization of PETSc
5e5c89e4eSSatish Balay 
6e5c89e4eSSatish Balay   This file uses regular malloc and free because it cannot know
7e5c89e4eSSatish Balay   what malloc is being used until it has already processed the input.
8e5c89e4eSSatish Balay */
9e5c89e4eSSatish Balay 
10*c6db04a5SJed Brown #include <petscsys.h>        /*I  "petscsys.h"   I*/
11e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H)
12e5c89e4eSSatish Balay #include <stdlib.h>
13e5c89e4eSSatish Balay #endif
14e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MALLOC_H)
15e5c89e4eSSatish Balay #include <malloc.h>
16e5c89e4eSSatish Balay #endif
17555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
18555d055bSBarry Smith #include <valgrind/valgrind.h>
19555d055bSBarry Smith #endif
20555d055bSBarry Smith 
21e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/
22e5c89e4eSSatish Balay /*
23e5c89e4eSSatish Balay      Indicates if PETSc started up MPI, or it was
24e5c89e4eSSatish Balay    already started before PETSc was initialized.
25e5c89e4eSSatish Balay */
267087cfbeSBarry Smith PetscBool    PetscBeganMPI         = PETSC_FALSE;
277087cfbeSBarry Smith PetscBool    PetscInitializeCalled = PETSC_FALSE;
287087cfbeSBarry Smith PetscBool    PetscFinalizeCalled   = PETSC_FALSE;
297087cfbeSBarry Smith PetscMPIInt  PetscGlobalRank = -1;
307087cfbeSBarry Smith PetscMPIInt  PetscGlobalSize = -1;
31e5c89e4eSSatish Balay 
32e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
33e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
34e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
35e5c89e4eSSatish Balay #endif
362c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
377087cfbeSBarry Smith MPI_Datatype   MPI_C_DOUBLE_COMPLEX;
387087cfbeSBarry Smith MPI_Datatype   MPI_C_COMPLEX;
392c876bd9SBarry Smith #endif
407087cfbeSBarry Smith PetscScalar    PETSC_i;
41e5c89e4eSSatish Balay #else
427087cfbeSBarry Smith PetscScalar    PETSC_i = 0.0;
43e5c89e4eSSatish Balay #endif
447087cfbeSBarry Smith MPI_Datatype   MPIU_2SCALAR = 0;
457087cfbeSBarry Smith MPI_Datatype   MPIU_2INT = 0;
4675567043SBarry Smith 
47e5c89e4eSSatish Balay /*
48e5c89e4eSSatish Balay      These are needed by petscbt.h
49e5c89e4eSSatish Balay */
50*c6db04a5SJed Brown #include <petscbt.h>
517087cfbeSBarry Smith char      _BT_mask = ' ';
527087cfbeSBarry Smith char      _BT_c = ' ';
537087cfbeSBarry Smith PetscInt  _BT_idx  = 0;
54e5c89e4eSSatish Balay 
55e5c89e4eSSatish Balay /*
56e5c89e4eSSatish Balay        Function that is called to display all error messages
57e5c89e4eSSatish Balay */
587087cfbeSBarry Smith PetscErrorCode  (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
597087cfbeSBarry Smith PetscErrorCode  (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
60238ccf28SShri Abhyankar #if defined(PETSC_HAVE_MATLAB_ENGINE)
617087cfbeSBarry Smith PetscErrorCode  (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintf_Matlab;
62238ccf28SShri Abhyankar #else
637087cfbeSBarry Smith PetscErrorCode  (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
64238ccf28SShri Abhyankar #endif
65bab1f7e6SVictor Minden /*
668154be41SBarry Smith   This is needed to turn on/off cusp synchronization */
678154be41SBarry Smith PetscBool   synchronizeCUSP = PETSC_FALSE;
68bab1f7e6SVictor Minden 
69e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
70e5c89e4eSSatish Balay /*
71e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
72e5c89e4eSSatish Balay */
73e5c89e4eSSatish Balay FILE *petsc_history = PETSC_NULL;
74e5c89e4eSSatish Balay 
75e5c89e4eSSatish Balay #undef __FUNCT__
76f3dea69dSBarry Smith #define __FUNCT__ "PetscOpenHistoryFile"
777087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
78e5c89e4eSSatish Balay {
79e5c89e4eSSatish Balay   PetscErrorCode ierr;
80e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
81e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
82e5c89e4eSSatish Balay   char           version[256];
83e5c89e4eSSatish Balay 
84e5c89e4eSSatish Balay   PetscFunctionBegin;
85e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
86e5c89e4eSSatish Balay   if (!rank) {
87e5c89e4eSSatish Balay     char        arch[10];
88f56c2debSBarry Smith     int         err;
8988c29154SBarry Smith     PetscViewer viewer;
90f56c2debSBarry Smith 
91e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
92e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
93a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
94e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
95e5c89e4eSSatish Balay     if (filename) {
96e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
97e5c89e4eSSatish Balay     } else {
98e5c89e4eSSatish Balay       ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr);
99e5c89e4eSSatish Balay       ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr);
100e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
101e5c89e4eSSatish Balay     }
102e5c89e4eSSatish Balay 
103e32f2f54SBarry Smith     *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
104e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
105e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
106e5c89e4eSSatish Balay     ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
107e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
10888c29154SBarry Smith     ierr = PetscViewerASCIIOpenWithFILE(PETSC_COMM_WORLD,*fd,&viewer);CHKERRQ(ierr);
10988c29154SBarry Smith     ierr = PetscOptionsView(viewer);CHKERRQ(ierr);
11088c29154SBarry Smith     ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr);
111e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
112f56c2debSBarry Smith     err = fflush(*fd);
113e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
114e5c89e4eSSatish Balay   }
115e5c89e4eSSatish Balay   PetscFunctionReturn(0);
116e5c89e4eSSatish Balay }
117e5c89e4eSSatish Balay 
118e5c89e4eSSatish Balay #undef __FUNCT__
119f3dea69dSBarry Smith #define __FUNCT__ "PetscCloseHistoryFile"
1207087cfbeSBarry Smith PetscErrorCode  PetscCloseHistoryFile(FILE **fd)
121e5c89e4eSSatish Balay {
122e5c89e4eSSatish Balay   PetscErrorCode ierr;
123e5c89e4eSSatish Balay   PetscMPIInt    rank;
124e5c89e4eSSatish Balay   char           date[64];
125f56c2debSBarry Smith   int            err;
126e5c89e4eSSatish Balay 
127e5c89e4eSSatish Balay   PetscFunctionBegin;
128e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
129e5c89e4eSSatish Balay   if (!rank) {
130e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
131e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
132e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
133e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
134f56c2debSBarry Smith     err = fflush(*fd);
135e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
136f56c2debSBarry Smith     err = fclose(*fd);
137e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
138e5c89e4eSSatish Balay   }
139e5c89e4eSSatish Balay   PetscFunctionReturn(0);
140e5c89e4eSSatish Balay }
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
143e5c89e4eSSatish Balay 
144e5c89e4eSSatish Balay /*
145e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
146e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
147e5c89e4eSSatish Balay 
148e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1493c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1503c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
151e5c89e4eSSatish Balay */
152e5c89e4eSSatish Balay 
153e5c89e4eSSatish Balay #undef __FUNCT__
154e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_AbortOnError"
155e5c89e4eSSatish Balay void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
156e5c89e4eSSatish Balay {
157e5c89e4eSSatish Balay   PetscFunctionBegin;
1583c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
159e5c89e4eSSatish Balay   abort();
160e5c89e4eSSatish Balay }
161e5c89e4eSSatish Balay 
162e5c89e4eSSatish Balay #undef __FUNCT__
163e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
164e5c89e4eSSatish Balay void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
165e5c89e4eSSatish Balay {
166e5c89e4eSSatish Balay   PetscErrorCode ierr;
167e5c89e4eSSatish Balay 
168e5c89e4eSSatish Balay   PetscFunctionBegin;
1693c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
170e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
171e5c89e4eSSatish Balay   if (ierr) { /* hopeless so get out */
1723c311c98SBarry Smith     MPI_Abort(*comm,*flag);
173e5c89e4eSSatish Balay   }
174e5c89e4eSSatish Balay }
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay #undef __FUNCT__
177e5c89e4eSSatish Balay #define __FUNCT__ "PetscEnd"
178e5c89e4eSSatish Balay /*@C
179e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
180e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
181e5c89e4eSSatish Balay 
182e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
183e5c89e4eSSatish Balay 
184e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
185e5c89e4eSSatish Balay 
186e5c89e4eSSatish Balay    Level: advanced
187e5c89e4eSSatish Balay 
188e5c89e4eSSatish Balay    Note:
189e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
190e5c89e4eSSatish Balay 
19188c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
192e5c89e4eSSatish Balay @*/
1937087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
194e5c89e4eSSatish Balay {
195e5c89e4eSSatish Balay   PetscFunctionBegin;
196e5c89e4eSSatish Balay   PetscFinalize();
197e5c89e4eSSatish Balay   exit(0);
198e5c89e4eSSatish Balay   return 0;
199e5c89e4eSSatish Balay }
200e5c89e4eSSatish Balay 
201ace3abfcSBarry Smith PetscBool    PetscOptionsPublish = PETSC_FALSE;
20209573ac7SBarry Smith extern PetscErrorCode        PetscSetUseTrMalloc_Private(void);
203ace3abfcSBarry Smith extern PetscBool  petscsetmallocvisited;
204e5c89e4eSSatish Balay static char       emacsmachinename[256];
205e5c89e4eSSatish Balay 
206e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0;
207e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = 0;
208e5c89e4eSSatish Balay 
209e5c89e4eSSatish Balay #undef __FUNCT__
210e5c89e4eSSatish Balay #define __FUNCT__ "PetscSetHelpVersionFunctions"
211e5c89e4eSSatish Balay /*@C
212e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
213e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
214e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay    Input Parameter:
217e5c89e4eSSatish Balay +  help - the help function (may be PETSC_NULL)
218da93591fSBarry Smith -  version - the version function (may be PETSC_NULL)
219e5c89e4eSSatish Balay 
220e5c89e4eSSatish Balay    Level: developer
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Concepts: package help message
223e5c89e4eSSatish Balay 
224e5c89e4eSSatish Balay @*/
2257087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
226e5c89e4eSSatish Balay {
227e5c89e4eSSatish Balay   PetscFunctionBegin;
228e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
229e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
230e5c89e4eSSatish Balay   PetscFunctionReturn(0);
231e5c89e4eSSatish Balay }
232e5c89e4eSSatish Balay 
233e5c89e4eSSatish Balay #undef __FUNCT__
234e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Private"
2357087cfbeSBarry Smith PetscErrorCode  PetscOptionsCheckInitial_Private(void)
236e5c89e4eSSatish Balay {
237e5c89e4eSSatish Balay   char           string[64],mname[PETSC_MAX_PATH_LEN],*f;
238e5c89e4eSSatish Balay   MPI_Comm       comm = PETSC_COMM_WORLD;
239ace3abfcSBarry Smith   PetscBool      flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flg4 = PETSC_FALSE,flag,flgz,flgzout;
240e5c89e4eSSatish Balay   PetscErrorCode ierr;
241a6d0e24fSJed Brown   PetscReal      si;
242e5c89e4eSSatish Balay   int            i;
243e5c89e4eSSatish Balay   PetscMPIInt    rank;
244e5c89e4eSSatish Balay   char           version[256];
245e5c89e4eSSatish Balay 
246e5c89e4eSSatish Balay   PetscFunctionBegin;
247e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
248e5c89e4eSSatish Balay 
249e5c89e4eSSatish Balay   /*
250e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
251e5c89e4eSSatish Balay   */
2528bb29257SSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr);
25381b192fdSBarry Smith #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD)
254acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr);
255e5c89e4eSSatish Balay   if ((!flg2 || flg1) && !petscsetmallocvisited) {
256555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
257555d055bSBarry Smith     if (flg2 || !(RUNNING_ON_VALGRIND)) {
258555d055bSBarry Smith       /* turn off default -malloc if valgrind is being used */
259555d055bSBarry Smith #endif
260e5c89e4eSSatish Balay       ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
261555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
262555d055bSBarry Smith     }
263555d055bSBarry Smith #endif
264e5c89e4eSSatish Balay   }
265e5c89e4eSSatish Balay #else
266acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
267acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr);
268e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
269e5c89e4eSSatish Balay #endif
270e5c89e4eSSatish Balay   if (flg3) {
271e5c89e4eSSatish Balay     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
272e5c89e4eSSatish Balay   }
27390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
274acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr);
275e5c89e4eSSatish Balay   if (flg1) {
276e5c89e4eSSatish Balay     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
277e5c89e4eSSatish Balay     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
278e5c89e4eSSatish Balay   }
279e5c89e4eSSatish Balay 
28090d69ab7SBarry Smith   flg1 = PETSC_FALSE;
281acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
2827783f70dSSatish Balay   if (!flg1) {
28390d69ab7SBarry Smith     flg1 = PETSC_FALSE;
284acfcf0e5SJed Brown     ierr = PetscOptionsGetBool(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
2857783f70dSSatish Balay   }
286e5c89e4eSSatish Balay   if (flg1) {
287e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
288e5c89e4eSSatish Balay   }
289e5c89e4eSSatish Balay 
290e5c89e4eSSatish Balay   /*
291e5c89e4eSSatish Balay       Set the display variable for graphics
292e5c89e4eSSatish Balay   */
293e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
294e5c89e4eSSatish Balay 
295e5c89e4eSSatish Balay   /*
296e5c89e4eSSatish Balay       Print the PETSc version information
297e5c89e4eSSatish Balay   */
298e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
299e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
300e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
301e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3){
302e5c89e4eSSatish Balay 
303e5c89e4eSSatish Balay     /*
304e5c89e4eSSatish Balay        Print "higher-level" package version message
305e5c89e4eSSatish Balay     */
306e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
307e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
308e5c89e4eSSatish Balay     }
309e5c89e4eSSatish Balay 
310a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
311e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
312e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
313e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
314e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
315e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
31684e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
317e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
318e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
319e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
320e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
321e5c89e4eSSatish Balay   }
322e5c89e4eSSatish Balay 
323e5c89e4eSSatish Balay   /*
324e5c89e4eSSatish Balay        Print "higher-level" package help message
325e5c89e4eSSatish Balay   */
326e5c89e4eSSatish Balay   if (flg3){
327e5c89e4eSSatish Balay     if (PetscExternalHelpFunction) {
328e5c89e4eSSatish Balay       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
329e5c89e4eSSatish Balay     }
330e5c89e4eSSatish Balay   }
331e5c89e4eSSatish Balay 
332e5c89e4eSSatish Balay   /*
333e5c89e4eSSatish Balay       Setup the error handling
334e5c89e4eSSatish Balay   */
33590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
336acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr);
337cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);}
33890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
339acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr);
340cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr);}
34190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
342acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr);
343e5c89e4eSSatish Balay   if (flg1) {
344e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
345e5c89e4eSSatish Balay   }
34690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
347acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
348cb9801acSJed Brown   if (!flg1) {ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr);}
34996cc47afSJed Brown   flg1 = PETSC_FALSE;
350acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr);
35196cc47afSJed Brown   if (flg1) {ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr);}
352e5c89e4eSSatish Balay 
353e5c89e4eSSatish Balay   /*
354e5c89e4eSSatish Balay       Setup debugger information
355e5c89e4eSSatish Balay   */
356e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
357e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
358e5c89e4eSSatish Balay   if (flg1) {
359e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
360e5c89e4eSSatish Balay 
361e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
362e5c89e4eSSatish Balay     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
363e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
364e5c89e4eSSatish Balay     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
365e5c89e4eSSatish Balay   }
3665e96ac45SJed Brown   ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
3675e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
368e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
369e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
370e5c89e4eSSatish Balay   if (flg1 || flg2) {
371e5c89e4eSSatish Balay     PetscMPIInt    size;
372e5c89e4eSSatish Balay     PetscInt       lsize,*nodes;
373e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
374e5c89e4eSSatish Balay     /*
375e5c89e4eSSatish Balay        we have to make sure that all processors have opened
376e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
377e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
378e5c89e4eSSatish Balay        and kill the program.
379e5c89e4eSSatish Balay     */
380e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
381e5c89e4eSSatish Balay     if (size > 2) {
382533163c2SBarry Smith       PetscMPIInt dummy = 0;
383e5c89e4eSSatish Balay       MPI_Status  status;
384e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
385e5c89e4eSSatish Balay         if (rank != i) {
386e5c89e4eSSatish Balay           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
387e5c89e4eSSatish Balay         }
388e5c89e4eSSatish Balay       }
389e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
390e5c89e4eSSatish Balay         if (rank != i) {
391e5c89e4eSSatish Balay           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
392e5c89e4eSSatish Balay         }
393e5c89e4eSSatish Balay       }
394e5c89e4eSSatish Balay     }
395e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
396e5c89e4eSSatish Balay     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
397e5c89e4eSSatish Balay     lsize = size;
398e5c89e4eSSatish Balay     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
399e5c89e4eSSatish Balay     if (flag) {
400e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
401e5c89e4eSSatish Balay         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
402e5c89e4eSSatish Balay       }
403e5c89e4eSSatish Balay     }
404e5c89e4eSSatish Balay     if (!flag) {
405e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
406e5c89e4eSSatish Balay       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
407e5c89e4eSSatish Balay       if (flg1) {
408e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
409e5c89e4eSSatish Balay       } else {
410e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
411e5c89e4eSSatish Balay       }
412e5c89e4eSSatish Balay       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
413e5c89e4eSSatish Balay       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
414e5c89e4eSSatish Balay     }
415e5c89e4eSSatish Balay     ierr = PetscFree(nodes);CHKERRQ(ierr);
416e5c89e4eSSatish Balay   }
417e5c89e4eSSatish Balay 
418e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
419cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
420e5c89e4eSSatish Balay 
42193ba235fSBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER)
42222b84c2fSbcordonn   /*
42322b84c2fSbcordonn     Activates new sockets for zope if needed
42422b84c2fSbcordonn   */
42584ab5442Sbcordonn   ierr = PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr);
426d8c6e182Sbcordonn   ierr = PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr);
4276dc8fec2Sbcordonn   if (flgz){
42822b84c2fSbcordonn     int  sockfd;
429f1384234SBarry Smith     char hostname[256];
43022b84c2fSbcordonn     char username[256];
4316dc8fec2Sbcordonn     int  remoteport = 9999;
4329c4c166aSBarry Smith 
43384ab5442Sbcordonn     ierr = PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
43484ab5442Sbcordonn     if (!hostname[0]){
4359c4c166aSBarry Smith       ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
4369c4c166aSBarry Smith     }
43722b84c2fSbcordonn     ierr = PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr);
4389c4c166aSBarry Smith     ierr = PetscGetUserName(username, 256);CHKERRQ(ierr);
43922b84c2fSbcordonn     PETSC_ZOPEFD = fdopen(sockfd, "w");
44022b84c2fSbcordonn     if (flgzout){
44122b84c2fSbcordonn       PETSC_STDOUT = PETSC_ZOPEFD;
442606f100bSbcordonn       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
4436dc8fec2Sbcordonn       fprintf(PETSC_STDOUT, "<<<start>>>");
4449c4c166aSBarry Smith     } else {
445d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
446d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<start>>>");
4479c4c166aSBarry Smith     }
4489c4c166aSBarry Smith   }
44993ba235fSBarry Smith #endif
450ffc871a5SBarry Smith #if defined(PETSC_USE_SERVER)
451ffc871a5SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-server", &flgz);CHKERRQ(ierr);
452ffc871a5SBarry Smith   if (flgz){
453ffc871a5SBarry Smith     PetscInt port = PETSC_DECIDE;
454ffc871a5SBarry Smith     ierr = PetscOptionsGetInt(PETSC_NULL,"-server",&port,PETSC_NULL);CHKERRQ(ierr);
455ffc871a5SBarry Smith     ierr = PetscWebServe(PETSC_COMM_WORLD,(int)port);CHKERRQ(ierr);
456ffc871a5SBarry Smith   }
457ffc871a5SBarry Smith #endif
4586dc8fec2Sbcordonn 
459e5c89e4eSSatish Balay   /*
460e5c89e4eSSatish Balay         Setup profiling and logging
461e5c89e4eSSatish Balay   */
4626cf91177SBarry Smith #if defined (PETSC_USE_INFO)
4638bb29257SSatish Balay   {
464e5c89e4eSSatish Balay     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
4656cf91177SBarry Smith     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
4668bb29257SSatish Balay     if (flg1 && logname[0]) {
467fcc2139eSBarry Smith       ierr = PetscInfoAllow(PETSC_TRUE,logname);CHKERRQ(ierr);
4688bb29257SSatish Balay     } else if (flg1) {
469fcc2139eSBarry Smith       ierr = PetscInfoAllow(PETSC_TRUE,PETSC_NULL);CHKERRQ(ierr);
470e5c89e4eSSatish Balay     }
471e5c89e4eSSatish Balay   }
472865f6aa8SSatish Balay #endif
473865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
474865f6aa8SSatish Balay   mname[0] = 0;
475f3dea69dSBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL,"-history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
476865f6aa8SSatish Balay   if (flg1) {
477865f6aa8SSatish Balay     if (mname[0]) {
478f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
479865f6aa8SSatish Balay     } else {
480f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
481865f6aa8SSatish Balay     }
482865f6aa8SSatish Balay   }
483e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
48490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
485acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-log_mpe",&flg1,PETSC_NULL);CHKERRQ(ierr);
486e5c89e4eSSatish Balay   if (flg1) PetscLogMPEBegin();
487e5c89e4eSSatish Balay #endif
48890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
48990d69ab7SBarry Smith   flg2 = PETSC_FALSE;
49090d69ab7SBarry Smith   flg3 = PETSC_FALSE;
491acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr);
492acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr);
493d44e083bSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
4949f7b6320SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary_python",&flg4);CHKERRQ(ierr);
495e5c89e4eSSatish Balay   if (flg1)                      {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
4969f7b6320SBarry Smith   else if (flg2 || flg3 || flg4) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
497e5c89e4eSSatish Balay 
498e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
499e5c89e4eSSatish Balay   if (flg1) {
500e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
501e5c89e4eSSatish Balay     FILE *file;
502e5c89e4eSSatish Balay     if (mname[0]) {
503e5c89e4eSSatish Balay       sprintf(name,"%s.%d",mname,rank);
504e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
505e5c89e4eSSatish Balay       file = fopen(fname,"w");
506f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
507e5c89e4eSSatish Balay     } else {
508da9f1d6bSBarry Smith       file = PETSC_STDOUT;
509e5c89e4eSSatish Balay     }
510e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
511e5c89e4eSSatish Balay   }
512e5c89e4eSSatish Balay #endif
513e5c89e4eSSatish Balay 
514e5c89e4eSSatish Balay   /*
515e5c89e4eSSatish Balay       Setup building of stack frames for all function calls
516e5c89e4eSSatish Balay   */
51763d6bff0SBarry Smith #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD)
518e5c89e4eSSatish Balay   ierr = PetscStackCreate();CHKERRQ(ierr);
519e5c89e4eSSatish Balay #endif
520e5c89e4eSSatish Balay 
521acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr);
522e5c89e4eSSatish Balay 
523e5c89e4eSSatish Balay   /*
524e5c89e4eSSatish Balay        Print basic help message
525e5c89e4eSSatish Balay   */
526e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
527e5c89e4eSSatish Balay   if (flg1) {
528e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
529301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option\n");CHKERRQ(ierr);
530301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
531301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
532e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
533e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
534e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
535e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
536e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
537e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
538e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
539e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
540e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
541e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
542e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
543e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
544e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
545e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
546e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
547e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
548e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
549e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
550e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
5514161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
5524161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr);
553e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
554e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
555e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
556e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
557e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
558e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
559a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
560e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
561e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
562e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
563e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
564e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
565e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
566e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
567e5c89e4eSSatish Balay #endif
5686cf91177SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
569e5c89e4eSSatish Balay #endif
570e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
571e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
572e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
573e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
574e5c89e4eSSatish Balay   }
575e5c89e4eSSatish Balay 
576a6d0e24fSJed Brown   ierr = PetscOptionsGetReal(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
577e5c89e4eSSatish Balay   if (flg1) {
578e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
579e5c89e4eSSatish Balay   }
580e5c89e4eSSatish Balay 
5816cf91177SBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
582e5c89e4eSSatish Balay   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
583e5c89e4eSSatish Balay   if (f) {
5846cf91177SBarry Smith     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
585e5c89e4eSSatish Balay   }
586827f890bSBarry Smith 
5878154be41SBarry Smith #if defined(PETSC_HAVE_CUSP)
588c97f9302SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
58973113deaSBarry Smith   if (flg3) flg1 = PETSC_TRUE;
59073113deaSBarry Smith   else flg1 = PETSC_FALSE;
5918154be41SBarry Smith   ierr = PetscOptionsGetBool(PETSC_NULL,"-cusp_synchronize",&flg1,PETSC_NULL);CHKERRQ(ierr);
5928154be41SBarry Smith   if (flg1) synchronizeCUSP = PETSC_TRUE;
593bab1f7e6SVictor Minden #endif
594192daf7cSBarry Smith 
595e5c89e4eSSatish Balay   PetscFunctionReturn(0);
596e5c89e4eSSatish Balay }
597df413903SBarry Smith 
598