xref: /petsc/src/sys/objects/init.c (revision 301d30fe7cc1420be847c48d5fdb1cff0d41df3b)
1e5c89e4eSSatish Balay #define PETSC_DLL
2db135669SBarry Smith 
3e5c89e4eSSatish Balay /*
4e5c89e4eSSatish Balay 
5e5c89e4eSSatish Balay    This file defines part of the initialization of PETSc
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay   This file uses regular malloc and free because it cannot know
8e5c89e4eSSatish Balay   what malloc is being used until it has already processed the input.
9e5c89e4eSSatish Balay */
10e5c89e4eSSatish Balay 
11d382aafbSBarry Smith #include "petscsys.h"        /*I  "petscsys.h"   I*/
12e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H)
13e5c89e4eSSatish Balay #include <stdlib.h>
14e5c89e4eSSatish Balay #endif
15e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MALLOC_H)
16e5c89e4eSSatish Balay #include <malloc.h>
17e5c89e4eSSatish Balay #endif
18555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
19555d055bSBarry Smith #include <valgrind/valgrind.h>
20555d055bSBarry Smith #endif
21555d055bSBarry Smith 
22e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/
23e5c89e4eSSatish Balay /*
24e5c89e4eSSatish Balay      Indicates if PETSc started up MPI, or it was
25e5c89e4eSSatish Balay    already started before PETSc was initialized.
26e5c89e4eSSatish Balay */
27e5c89e4eSSatish Balay PetscTruth  PETSC_DLLEXPORT PetscBeganMPI         = PETSC_FALSE;
28e5c89e4eSSatish Balay PetscTruth  PETSC_DLLEXPORT PetscInitializeCalled = PETSC_FALSE;
29e5c89e4eSSatish Balay PetscTruth  PETSC_DLLEXPORT PetscFinalizeCalled   = PETSC_FALSE;
30e5c89e4eSSatish Balay PetscMPIInt PETSC_DLLEXPORT PetscGlobalRank = -1;
31e5c89e4eSSatish Balay PetscMPIInt PETSC_DLLEXPORT PetscGlobalSize = -1;
32e5c89e4eSSatish Balay 
33e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
34e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
35e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
36e5c89e4eSSatish Balay #endif
372c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
382c876bd9SBarry Smith MPI_Datatype  PETSC_DLLEXPORT MPI_C_DOUBLE_COMPLEX;
39a83b8d76SBarry Smith MPI_Datatype  PETSC_DLLEXPORT MPI_C_COMPLEX;
402c876bd9SBarry Smith #endif
41e5c89e4eSSatish Balay PetscScalar   PETSC_DLLEXPORT PETSC_i;
42e5c89e4eSSatish Balay #else
43e5c89e4eSSatish Balay PetscScalar   PETSC_DLLEXPORT PETSC_i = 0.0;
44e5c89e4eSSatish Balay #endif
45e5c89e4eSSatish Balay MPI_Datatype  PETSC_DLLEXPORT MPIU_2SCALAR = 0;
46e5c89e4eSSatish Balay MPI_Datatype  PETSC_DLLEXPORT MPIU_2INT = 0;
4775567043SBarry Smith 
4875567043SBarry Smith #if defined(PETSC_USE_SCALAR_QD_DD)
4975567043SBarry Smith MPI_Datatype  PETSC_DLLEXPORT MPIU_QD_DD;
5075567043SBarry Smith #endif
51e5c89e4eSSatish Balay /*
52e5c89e4eSSatish Balay      These are needed by petscbt.h
53e5c89e4eSSatish Balay */
54421d60dfSSatish Balay #include "petscbt.h"
55e5c89e4eSSatish Balay char     PETSC_DLLEXPORT _BT_mask = ' ';
56e5c89e4eSSatish Balay char     PETSC_DLLEXPORT _BT_c = ' ';
57e5c89e4eSSatish Balay PetscInt PETSC_DLLEXPORT _BT_idx  = 0;
58e5c89e4eSSatish Balay 
59e5c89e4eSSatish Balay /*
60e5c89e4eSSatish Balay        Function that is called to display all error messages
61e5c89e4eSSatish Balay */
62e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
63e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
641179db26SBarry Smith PetscErrorCode PETSC_DLLEXPORT (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
65e5c89e4eSSatish Balay 
66e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
67e5c89e4eSSatish Balay /*
68e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
69e5c89e4eSSatish Balay */
70e5c89e4eSSatish Balay FILE *petsc_history = PETSC_NULL;
71e5c89e4eSSatish Balay 
72e5c89e4eSSatish Balay #undef __FUNCT__
73e5c89e4eSSatish Balay #define __FUNCT__ "PetscLogOpenHistoryFile"
74e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscLogOpenHistoryFile(const char filename[],FILE **fd)
75e5c89e4eSSatish Balay {
76e5c89e4eSSatish Balay   PetscErrorCode ierr;
77e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
78e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
79e5c89e4eSSatish Balay   char           version[256];
80e5c89e4eSSatish Balay 
81e5c89e4eSSatish Balay   PetscFunctionBegin;
82e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
83e5c89e4eSSatish Balay   if (!rank) {
84e5c89e4eSSatish Balay     char arch[10];
85f56c2debSBarry Smith     int  err;
86f56c2debSBarry Smith 
87e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
88e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
89a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
90e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
91e5c89e4eSSatish Balay     if (filename) {
92e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
93e5c89e4eSSatish Balay     } else {
94e5c89e4eSSatish Balay       ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr);
95e5c89e4eSSatish Balay       ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr);
96e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
97e5c89e4eSSatish Balay     }
98e5c89e4eSSatish Balay 
99e32f2f54SBarry Smith     *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
100e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
101e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
102e5c89e4eSSatish Balay     ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
103e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
104e5c89e4eSSatish Balay     ierr = PetscOptionsPrint(*fd);CHKERRQ(ierr);
105e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
106f56c2debSBarry Smith     err = fflush(*fd);
107e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
108e5c89e4eSSatish Balay   }
109e5c89e4eSSatish Balay   PetscFunctionReturn(0);
110e5c89e4eSSatish Balay }
111e5c89e4eSSatish Balay 
112e5c89e4eSSatish Balay #undef __FUNCT__
113e5c89e4eSSatish Balay #define __FUNCT__ "PetscLogCloseHistoryFile"
114e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscLogCloseHistoryFile(FILE **fd)
115e5c89e4eSSatish Balay {
116e5c89e4eSSatish Balay   PetscErrorCode ierr;
117e5c89e4eSSatish Balay   PetscMPIInt    rank;
118e5c89e4eSSatish Balay   char           date[64];
119f56c2debSBarry Smith   int            err;
120e5c89e4eSSatish Balay 
121e5c89e4eSSatish Balay   PetscFunctionBegin;
122e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
123e5c89e4eSSatish Balay   if (!rank) {
124e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
125e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
126e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
127e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
128f56c2debSBarry Smith     err = fflush(*fd);
129e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
130f56c2debSBarry Smith     err = fclose(*fd);
131e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
132e5c89e4eSSatish Balay   }
133e5c89e4eSSatish Balay   PetscFunctionReturn(0);
134e5c89e4eSSatish Balay }
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay /*
139e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
140e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1433c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1443c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
145e5c89e4eSSatish Balay */
146e5c89e4eSSatish Balay 
147e5c89e4eSSatish Balay #undef __FUNCT__
148e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_AbortOnError"
149e5c89e4eSSatish Balay void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
150e5c89e4eSSatish Balay {
151e5c89e4eSSatish Balay   PetscFunctionBegin;
1523c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
153e5c89e4eSSatish Balay   abort();
154e5c89e4eSSatish Balay }
155e5c89e4eSSatish Balay 
156e5c89e4eSSatish Balay #undef __FUNCT__
157e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
158e5c89e4eSSatish Balay void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
159e5c89e4eSSatish Balay {
160e5c89e4eSSatish Balay   PetscErrorCode ierr;
161e5c89e4eSSatish Balay 
162e5c89e4eSSatish Balay   PetscFunctionBegin;
1633c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
164e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
165e5c89e4eSSatish Balay   if (ierr) { /* hopeless so get out */
1663c311c98SBarry Smith     MPI_Abort(*comm,*flag);
167e5c89e4eSSatish Balay   }
168e5c89e4eSSatish Balay }
169e5c89e4eSSatish Balay 
170e5c89e4eSSatish Balay #undef __FUNCT__
171e5c89e4eSSatish Balay #define __FUNCT__ "PetscEnd"
172e5c89e4eSSatish Balay /*@C
173e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
174e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
177e5c89e4eSSatish Balay 
178e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
179e5c89e4eSSatish Balay 
180e5c89e4eSSatish Balay    Level: advanced
181e5c89e4eSSatish Balay 
182e5c89e4eSSatish Balay    Note:
183e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
184e5c89e4eSSatish Balay 
185e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
186e5c89e4eSSatish Balay @*/
187e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscEnd(void)
188e5c89e4eSSatish Balay {
189e5c89e4eSSatish Balay   PetscFunctionBegin;
190e5c89e4eSSatish Balay   PetscFinalize();
191e5c89e4eSSatish Balay   exit(0);
192e5c89e4eSSatish Balay   return 0;
193e5c89e4eSSatish Balay }
194e5c89e4eSSatish Balay 
195e5c89e4eSSatish Balay PetscTruth   PetscOptionsPublish = PETSC_FALSE;
196e5c89e4eSSatish Balay EXTERN PetscErrorCode        PetscSetUseTrMalloc_Private(void);
197e5c89e4eSSatish Balay extern PetscTruth petscsetmallocvisited;
198e5c89e4eSSatish Balay static char       emacsmachinename[256];
199e5c89e4eSSatish Balay 
200e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0;
201e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = 0;
202e5c89e4eSSatish Balay 
203e5c89e4eSSatish Balay #undef __FUNCT__
204e5c89e4eSSatish Balay #define __FUNCT__ "PetscSetHelpVersionFunctions"
205e5c89e4eSSatish Balay /*@C
206e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
207e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
208e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
209e5c89e4eSSatish Balay 
210e5c89e4eSSatish Balay    Input Parameter:
211e5c89e4eSSatish Balay +  help - the help function (may be PETSC_NULL)
212da93591fSBarry Smith -  version - the version function (may be PETSC_NULL)
213e5c89e4eSSatish Balay 
214e5c89e4eSSatish Balay    Level: developer
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay    Concepts: package help message
217e5c89e4eSSatish Balay 
218e5c89e4eSSatish Balay @*/
219e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
220e5c89e4eSSatish Balay {
221e5c89e4eSSatish Balay   PetscFunctionBegin;
222e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
223e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
224e5c89e4eSSatish Balay   PetscFunctionReturn(0);
225e5c89e4eSSatish Balay }
226e5c89e4eSSatish Balay 
227e5c89e4eSSatish Balay #undef __FUNCT__
228e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Private"
229e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Private(void)
230e5c89e4eSSatish Balay {
231e5c89e4eSSatish Balay   char           string[64],mname[PETSC_MAX_PATH_LEN],*f;
232e5c89e4eSSatish Balay   MPI_Comm       comm = PETSC_COMM_WORLD;
23390d69ab7SBarry Smith   PetscTruth     flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,flgz,flgzout;
234e5c89e4eSSatish Balay   PetscErrorCode ierr;
235a6d0e24fSJed Brown   PetscReal      si;
236e5c89e4eSSatish Balay   int            i;
237e5c89e4eSSatish Balay   PetscMPIInt    rank;
238e5c89e4eSSatish Balay   char           version[256];
239e5c89e4eSSatish Balay 
240e5c89e4eSSatish Balay   PetscFunctionBegin;
241e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
242e5c89e4eSSatish Balay 
243e5c89e4eSSatish Balay   /*
244e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
245e5c89e4eSSatish Balay   */
24690d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);CHKERRQ(ierr);
247e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG)
248e5c89e4eSSatish Balay   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr);
249e5c89e4eSSatish Balay   if ((!flg2 || flg1) && !petscsetmallocvisited) {
250555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
251555d055bSBarry Smith     if (flg2 || !(RUNNING_ON_VALGRIND)) {
252555d055bSBarry Smith       /* turn off default -malloc if valgrind is being used */
253555d055bSBarry Smith #endif
254e5c89e4eSSatish Balay       ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
255555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
256555d055bSBarry Smith     }
257555d055bSBarry Smith #endif
258e5c89e4eSSatish Balay   }
259e5c89e4eSSatish Balay #else
26090d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
26190d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr);
262e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
263e5c89e4eSSatish Balay #endif
264e5c89e4eSSatish Balay   if (flg3) {
265e5c89e4eSSatish Balay     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
266e5c89e4eSSatish Balay   }
26790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
26890d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr);
269e5c89e4eSSatish Balay   if (flg1) {
270e5c89e4eSSatish Balay     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
271e5c89e4eSSatish Balay     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
272e5c89e4eSSatish Balay   }
273e5c89e4eSSatish Balay 
27490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
27590d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
2767783f70dSSatish Balay   if (!flg1) {
27790d69ab7SBarry Smith     flg1 = PETSC_FALSE;
27890d69ab7SBarry Smith     ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
2797783f70dSSatish Balay   }
280e5c89e4eSSatish Balay   if (flg1) {
281e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
282e5c89e4eSSatish Balay   }
283e5c89e4eSSatish Balay 
284e5c89e4eSSatish Balay   /*
285e5c89e4eSSatish Balay       Set the display variable for graphics
286e5c89e4eSSatish Balay   */
287e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
288e5c89e4eSSatish Balay 
289e5c89e4eSSatish Balay   /*
290e5c89e4eSSatish Balay       Print the PETSc version information
291e5c89e4eSSatish Balay   */
292e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
293e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
294e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
295e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3){
296e5c89e4eSSatish Balay 
297e5c89e4eSSatish Balay     /*
298e5c89e4eSSatish Balay        Print "higher-level" package version message
299e5c89e4eSSatish Balay     */
300e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
301e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
302e5c89e4eSSatish Balay     }
303e5c89e4eSSatish Balay 
304a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
305e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
306e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
307e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
308e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
309e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr);
310e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
31184e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
312e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
313e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
314e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
315e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
316e5c89e4eSSatish Balay   }
317e5c89e4eSSatish Balay 
318e5c89e4eSSatish Balay   /*
319e5c89e4eSSatish Balay        Print "higher-level" package help message
320e5c89e4eSSatish Balay   */
321e5c89e4eSSatish Balay   if (flg3){
322e5c89e4eSSatish Balay     if (PetscExternalHelpFunction) {
323e5c89e4eSSatish Balay       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
324e5c89e4eSSatish Balay     }
325e5c89e4eSSatish Balay   }
326e5c89e4eSSatish Balay 
327e5c89e4eSSatish Balay   /*
328e5c89e4eSSatish Balay       Setup the error handling
329e5c89e4eSSatish Balay   */
33090d69ab7SBarry Smith   flg1 = PETSC_FALSE;
33190d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr);
332cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);}
33390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
33490d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr);
335cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr);}
33690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
3371c2628b8SHong Zhang   ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr);
338e5c89e4eSSatish Balay   if (flg1) {
339e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
340e5c89e4eSSatish Balay   }
34190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
34290d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
343cb9801acSJed Brown   if (!flg1) {ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr);}
34496cc47afSJed Brown   flg1 = PETSC_FALSE;
34596cc47afSJed Brown   ierr = PetscOptionsGetTruth(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr);
34696cc47afSJed Brown   if (flg1) {ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr);}
347e5c89e4eSSatish Balay 
348e5c89e4eSSatish Balay   /*
349e5c89e4eSSatish Balay       Setup debugger information
350e5c89e4eSSatish Balay   */
351e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
352e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
353e5c89e4eSSatish Balay   if (flg1) {
354e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
355e5c89e4eSSatish Balay 
356e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
357e5c89e4eSSatish Balay     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
358e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
359e5c89e4eSSatish Balay     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
360e5c89e4eSSatish Balay   }
3615e96ac45SJed Brown   ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
3625e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
363e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
364e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
365e5c89e4eSSatish Balay   if (flg1 || flg2) {
366e5c89e4eSSatish Balay     PetscMPIInt    size;
367e5c89e4eSSatish Balay     PetscInt       lsize,*nodes;
368e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
369e5c89e4eSSatish Balay     /*
370e5c89e4eSSatish Balay        we have to make sure that all processors have opened
371e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
372e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
373e5c89e4eSSatish Balay        and kill the program.
374e5c89e4eSSatish Balay     */
375e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
376e5c89e4eSSatish Balay     if (size > 2) {
377533163c2SBarry Smith       PetscMPIInt dummy = 0;
378e5c89e4eSSatish Balay       MPI_Status  status;
379e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
380e5c89e4eSSatish Balay         if (rank != i) {
381e5c89e4eSSatish Balay           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
382e5c89e4eSSatish Balay         }
383e5c89e4eSSatish Balay       }
384e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
385e5c89e4eSSatish Balay         if (rank != i) {
386e5c89e4eSSatish Balay           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
387e5c89e4eSSatish Balay         }
388e5c89e4eSSatish Balay       }
389e5c89e4eSSatish Balay     }
390e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
391e5c89e4eSSatish Balay     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
392e5c89e4eSSatish Balay     lsize = size;
393e5c89e4eSSatish Balay     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
394e5c89e4eSSatish Balay     if (flag) {
395e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
396e5c89e4eSSatish Balay         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
397e5c89e4eSSatish Balay       }
398e5c89e4eSSatish Balay     }
399e5c89e4eSSatish Balay     if (!flag) {
400e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
401e5c89e4eSSatish Balay       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
402e5c89e4eSSatish Balay       if (flg1) {
403e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
404e5c89e4eSSatish Balay       } else {
405e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
406e5c89e4eSSatish Balay       }
407e5c89e4eSSatish Balay       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
408e5c89e4eSSatish Balay       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
409e5c89e4eSSatish Balay     }
410e5c89e4eSSatish Balay     ierr = PetscFree(nodes);CHKERRQ(ierr);
411e5c89e4eSSatish Balay   }
412e5c89e4eSSatish Balay 
413e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
414cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
415e5c89e4eSSatish Balay 
41693ba235fSBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER)
41722b84c2fSbcordonn   /*
41822b84c2fSbcordonn     Activates new sockets for zope if needed
41922b84c2fSbcordonn   */
42084ab5442Sbcordonn   ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr);
421d8c6e182Sbcordonn   ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr);
4226dc8fec2Sbcordonn   if(flgz){
423d8c6e182Sbcordonn     extern FILE* PETSC_ZOPEFD;
42422b84c2fSbcordonn     int sockfd;
425f1384234SBarry Smith     char hostname[256];
42622b84c2fSbcordonn     char username[256];
4276dc8fec2Sbcordonn     int remoteport = 9999;
42884ab5442Sbcordonn     ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
42984ab5442Sbcordonn     if(!hostname[0]){
43084ab5442Sbcordonn       ierr=PetscGetHostName(hostname,256);CHKERRQ(ierr);}
43122b84c2fSbcordonn     ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr);
432606f100bSbcordonn     ierr = PetscGetUserName(username, 256);
43322b84c2fSbcordonn     PETSC_ZOPEFD = fdopen(sockfd, "w");
43422b84c2fSbcordonn     if(flgzout){
43522b84c2fSbcordonn       PETSC_STDOUT = PETSC_ZOPEFD;
436606f100bSbcordonn       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
4376dc8fec2Sbcordonn       fprintf(PETSC_STDOUT, "<<<start>>>");
4386dc8fec2Sbcordonn     }
439d8c6e182Sbcordonn     else{
440d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
441d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<start>>>");
442d8c6e182Sbcordonn     }}
44393ba235fSBarry Smith #endif
4446dc8fec2Sbcordonn 
445e5c89e4eSSatish Balay   /*
446e5c89e4eSSatish Balay         Setup profiling and logging
447e5c89e4eSSatish Balay   */
4486cf91177SBarry Smith #if defined (PETSC_USE_INFO)
44990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
45090d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-info",&flg1,PETSC_NULL);CHKERRQ(ierr);
451e5c89e4eSSatish Balay   if (flg1) {
452e5c89e4eSSatish Balay     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
4536cf91177SBarry Smith     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
454e5c89e4eSSatish Balay     if (logname[0]) {
4556cf91177SBarry Smith       PetscInfoAllow(PETSC_TRUE,logname);
456e5c89e4eSSatish Balay     } else {
4576cf91177SBarry Smith       PetscInfoAllow(PETSC_TRUE,PETSC_NULL);
458e5c89e4eSSatish Balay     }
459e5c89e4eSSatish Balay   }
460865f6aa8SSatish Balay #endif
461865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
462865f6aa8SSatish Balay   mname[0] = 0;
463865f6aa8SSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
464865f6aa8SSatish Balay   if (flg1) {
465865f6aa8SSatish Balay     if (mname[0]) {
466865f6aa8SSatish Balay       ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
467865f6aa8SSatish Balay     } else {
468865f6aa8SSatish Balay       ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
469865f6aa8SSatish Balay     }
470865f6aa8SSatish Balay   }
471e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
47290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
47390d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_mpe",&flg1,PETSC_NULL);CHKERRQ(ierr);
474e5c89e4eSSatish Balay   if (flg1) PetscLogMPEBegin();
475e5c89e4eSSatish Balay #endif
47690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
47790d69ab7SBarry Smith   flg2 = PETSC_FALSE;
47890d69ab7SBarry Smith   flg3 = PETSC_FALSE;
47990d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr);
48090d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr);
481d44e083bSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
482e5c89e4eSSatish Balay   if (flg1)              {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
483e5c89e4eSSatish Balay   else if (flg2 || flg3) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
484e5c89e4eSSatish Balay 
485e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
486e5c89e4eSSatish Balay   if (flg1) {
487e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
488e5c89e4eSSatish Balay     FILE *file;
489e5c89e4eSSatish Balay     if (mname[0]) {
490e5c89e4eSSatish Balay       sprintf(name,"%s.%d",mname,rank);
491e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
492e5c89e4eSSatish Balay       file = fopen(fname,"w");
493e5c89e4eSSatish Balay       if (!file) {
494e32f2f54SBarry Smith         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
495e5c89e4eSSatish Balay       }
496e5c89e4eSSatish Balay     } else {
497da9f1d6bSBarry Smith       file = PETSC_STDOUT;
498e5c89e4eSSatish Balay     }
499e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
500e5c89e4eSSatish Balay   }
501e5c89e4eSSatish Balay #endif
502e5c89e4eSSatish Balay 
503e5c89e4eSSatish Balay   /*
504e5c89e4eSSatish Balay       Setup building of stack frames for all function calls
505e5c89e4eSSatish Balay   */
506e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG)
507e5c89e4eSSatish Balay   ierr = PetscStackCreate();CHKERRQ(ierr);
508e5c89e4eSSatish Balay #endif
509e5c89e4eSSatish Balay 
51090d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr);
511e5c89e4eSSatish Balay 
512e5c89e4eSSatish Balay   /*
513e5c89e4eSSatish Balay        Print basic help message
514e5c89e4eSSatish Balay   */
515e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
516e5c89e4eSSatish Balay   if (flg1) {
517e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
518*301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option\n");CHKERRQ(ierr);
519*301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
520*301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
521e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
522e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
523e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
524e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
525e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
526e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
527e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
528e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
529e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
530e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
531e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
532e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
533e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
534e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
535e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
536e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
537e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
538e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
539e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
5404161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
5414161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr);
542e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
543e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
544e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
545e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
546e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
547e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
548a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
549e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
550e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
551e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
552e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
553e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
554e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
555e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
556e5c89e4eSSatish Balay #endif
5576cf91177SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
558e5c89e4eSSatish Balay #endif
559e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
560e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
561e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
562e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
563e5c89e4eSSatish Balay   }
564e5c89e4eSSatish Balay 
565a6d0e24fSJed Brown   ierr = PetscOptionsGetReal(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
566e5c89e4eSSatish Balay   if (flg1) {
567e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
568e5c89e4eSSatish Balay   }
569e5c89e4eSSatish Balay 
5706cf91177SBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
571e5c89e4eSSatish Balay   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
572e5c89e4eSSatish Balay   if (f) {
5736cf91177SBarry Smith     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
574e5c89e4eSSatish Balay   }
575e5c89e4eSSatish Balay 
576192daf7cSBarry Smith 
577e5c89e4eSSatish Balay   PetscFunctionReturn(0);
578e5c89e4eSSatish Balay }
579