xref: /petsc/src/sys/objects/init.c (revision f09cb4aaa63df8114585f001107d07490efdc864)
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 
10c6db04a5SJed Brown #include <petscsys.h>        /*I  "petscsys.h"   I*/
1151dcc849SKerry Stevens #include <pthread.h>
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 */
277087cfbeSBarry Smith PetscBool    PetscBeganMPI         = PETSC_FALSE;
287087cfbeSBarry Smith PetscBool    PetscInitializeCalled = PETSC_FALSE;
297087cfbeSBarry Smith PetscBool    PetscFinalizeCalled   = PETSC_FALSE;
3051dcc849SKerry Stevens PetscBool    PetscUseThreadPool    = PETSC_FALSE;
3151dcc849SKerry Stevens PetscBool    PetscThreadGo         = PETSC_TRUE;
327087cfbeSBarry Smith PetscMPIInt  PetscGlobalRank = -1;
337087cfbeSBarry Smith PetscMPIInt  PetscGlobalSize = -1;
3451dcc849SKerry Stevens PetscMPIInt  PetscMaxThreads = 2;
3551dcc849SKerry Stevens pthread_t*   PetscThreadPoint;
3651dcc849SKerry Stevens pthread_barrier_t* BarrPoint;
37*f09cb4aaSKerry Stevens int*         pVal;
3851dcc849SKerry Stevens 
3951dcc849SKerry Stevens typedef struct {
4051dcc849SKerry Stevens   pthread_mutex_t mutex;
4151dcc849SKerry Stevens   pthread_cond_t cond;
4251dcc849SKerry Stevens   void* (*pfunc)(void*);
4351dcc849SKerry Stevens   void** pdata;
4451dcc849SKerry Stevens   pthread_barrier_t* pbarr;
4551dcc849SKerry Stevens   int iNumJobThreads;
4651dcc849SKerry Stevens   int iNumReadyThreads;
4751dcc849SKerry Stevens   PetscBool startJob;
4851dcc849SKerry Stevens } sjob;
4951dcc849SKerry Stevens sjob job = {PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,NULL,NULL,NULL,0,0,PETSC_FALSE};
5051dcc849SKerry Stevens 
5151dcc849SKerry Stevens pthread_cond_t  main_cond  = PTHREAD_COND_INITIALIZER;
5251dcc849SKerry Stevens 
5351dcc849SKerry Stevens void*          PetscThreadFunc(void*);
5451dcc849SKerry Stevens void*          PetscThreadInitialize(PetscInt);
5551dcc849SKerry Stevens PetscErrorCode PetscThreadFinalize(void);
5651dcc849SKerry Stevens void           MainWait(void);
5751dcc849SKerry Stevens void           MainJob(void* (*pFunc)(void*),void**,pthread_barrier_t*,PetscInt);
5851dcc849SKerry Stevens void*          FuncFinish(void*);
59e5c89e4eSSatish Balay 
60e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
61e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
62e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
63e5c89e4eSSatish Balay #endif
642c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
657087cfbeSBarry Smith MPI_Datatype   MPI_C_DOUBLE_COMPLEX;
667087cfbeSBarry Smith MPI_Datatype   MPI_C_COMPLEX;
672c876bd9SBarry Smith #endif
687087cfbeSBarry Smith PetscScalar    PETSC_i;
69e5c89e4eSSatish Balay #else
707087cfbeSBarry Smith PetscScalar    PETSC_i = 0.0;
71e5c89e4eSSatish Balay #endif
72ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
73c90a1750SBarry Smith MPI_Datatype   MPIU___FLOAT128 = 0;
74c90a1750SBarry Smith #endif
757087cfbeSBarry Smith MPI_Datatype   MPIU_2SCALAR = 0;
767087cfbeSBarry Smith MPI_Datatype   MPIU_2INT = 0;
7775567043SBarry Smith 
78e5c89e4eSSatish Balay /*
79e5c89e4eSSatish Balay      These are needed by petscbt.h
80e5c89e4eSSatish Balay */
81c6db04a5SJed Brown #include <petscbt.h>
827087cfbeSBarry Smith char      _BT_mask = ' ';
837087cfbeSBarry Smith char      _BT_c = ' ';
847087cfbeSBarry Smith PetscInt  _BT_idx  = 0;
85e5c89e4eSSatish Balay 
86e5c89e4eSSatish Balay /*
87e5c89e4eSSatish Balay        Function that is called to display all error messages
88e5c89e4eSSatish Balay */
897087cfbeSBarry Smith PetscErrorCode  (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
907087cfbeSBarry Smith PetscErrorCode  (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
91238ccf28SShri Abhyankar #if defined(PETSC_HAVE_MATLAB_ENGINE)
927087cfbeSBarry Smith PetscErrorCode  (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintf_Matlab;
93238ccf28SShri Abhyankar #else
947087cfbeSBarry Smith PetscErrorCode  (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
95238ccf28SShri Abhyankar #endif
96bab1f7e6SVictor Minden /*
978154be41SBarry Smith   This is needed to turn on/off cusp synchronization */
988154be41SBarry Smith PetscBool   synchronizeCUSP = PETSC_FALSE;
99bab1f7e6SVictor Minden 
100e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
101e5c89e4eSSatish Balay /*
102e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
103e5c89e4eSSatish Balay */
104e5c89e4eSSatish Balay FILE *petsc_history = PETSC_NULL;
105e5c89e4eSSatish Balay 
106e5c89e4eSSatish Balay #undef __FUNCT__
107f3dea69dSBarry Smith #define __FUNCT__ "PetscOpenHistoryFile"
1087087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
109e5c89e4eSSatish Balay {
110e5c89e4eSSatish Balay   PetscErrorCode ierr;
111e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
112e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
113e5c89e4eSSatish Balay   char           version[256];
114e5c89e4eSSatish Balay 
115e5c89e4eSSatish Balay   PetscFunctionBegin;
116e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
117e5c89e4eSSatish Balay   if (!rank) {
118e5c89e4eSSatish Balay     char        arch[10];
119f56c2debSBarry Smith     int         err;
12088c29154SBarry Smith     PetscViewer viewer;
121f56c2debSBarry Smith 
122e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
123e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
124a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
125e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
126e5c89e4eSSatish Balay     if (filename) {
127e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
128e5c89e4eSSatish Balay     } else {
129e5c89e4eSSatish Balay       ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr);
130e5c89e4eSSatish Balay       ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr);
131e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
132e5c89e4eSSatish Balay     }
133e5c89e4eSSatish Balay 
134e32f2f54SBarry Smith     *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
135e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
136e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
137e5c89e4eSSatish Balay     ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
138e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
13988c29154SBarry Smith     ierr = PetscViewerASCIIOpenWithFILE(PETSC_COMM_WORLD,*fd,&viewer);CHKERRQ(ierr);
14088c29154SBarry Smith     ierr = PetscOptionsView(viewer);CHKERRQ(ierr);
1416bf464f9SBarry Smith     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
142e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
143f56c2debSBarry Smith     err = fflush(*fd);
144e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
145e5c89e4eSSatish Balay   }
146e5c89e4eSSatish Balay   PetscFunctionReturn(0);
147e5c89e4eSSatish Balay }
148e5c89e4eSSatish Balay 
149e5c89e4eSSatish Balay #undef __FUNCT__
150f3dea69dSBarry Smith #define __FUNCT__ "PetscCloseHistoryFile"
1517087cfbeSBarry Smith PetscErrorCode  PetscCloseHistoryFile(FILE **fd)
152e5c89e4eSSatish Balay {
153e5c89e4eSSatish Balay   PetscErrorCode ierr;
154e5c89e4eSSatish Balay   PetscMPIInt    rank;
155e5c89e4eSSatish Balay   char           date[64];
156f56c2debSBarry Smith   int            err;
157e5c89e4eSSatish Balay 
158e5c89e4eSSatish Balay   PetscFunctionBegin;
159e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
160e5c89e4eSSatish Balay   if (!rank) {
161e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
162e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
163e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
164e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
165f56c2debSBarry Smith     err = fflush(*fd);
166e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
167f56c2debSBarry Smith     err = fclose(*fd);
168e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
169e5c89e4eSSatish Balay   }
170e5c89e4eSSatish Balay   PetscFunctionReturn(0);
171e5c89e4eSSatish Balay }
172e5c89e4eSSatish Balay 
173e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
174e5c89e4eSSatish Balay 
175e5c89e4eSSatish Balay /*
176e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
177e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
178e5c89e4eSSatish Balay 
179e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1803c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1813c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
182e5c89e4eSSatish Balay */
183e5c89e4eSSatish Balay 
184e5c89e4eSSatish Balay #undef __FUNCT__
185e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_AbortOnError"
186e5c89e4eSSatish Balay void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
187e5c89e4eSSatish Balay {
188e5c89e4eSSatish Balay   PetscFunctionBegin;
1893c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
190e5c89e4eSSatish Balay   abort();
191e5c89e4eSSatish Balay }
192e5c89e4eSSatish Balay 
193e5c89e4eSSatish Balay #undef __FUNCT__
194e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
195e5c89e4eSSatish Balay void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
196e5c89e4eSSatish Balay {
197e5c89e4eSSatish Balay   PetscErrorCode ierr;
198e5c89e4eSSatish Balay 
199e5c89e4eSSatish Balay   PetscFunctionBegin;
2003c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
201e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
202e5c89e4eSSatish Balay   if (ierr) { /* hopeless so get out */
2033c311c98SBarry Smith     MPI_Abort(*comm,*flag);
204e5c89e4eSSatish Balay   }
205e5c89e4eSSatish Balay }
206e5c89e4eSSatish Balay 
207e5c89e4eSSatish Balay #undef __FUNCT__
208e5c89e4eSSatish Balay #define __FUNCT__ "PetscEnd"
209e5c89e4eSSatish Balay /*@C
210e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
211e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
212e5c89e4eSSatish Balay 
213e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
214e5c89e4eSSatish Balay 
215e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay    Level: advanced
218e5c89e4eSSatish Balay 
219e5c89e4eSSatish Balay    Note:
220e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
221e5c89e4eSSatish Balay 
22288c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
223e5c89e4eSSatish Balay @*/
2247087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
225e5c89e4eSSatish Balay {
226e5c89e4eSSatish Balay   PetscFunctionBegin;
227e5c89e4eSSatish Balay   PetscFinalize();
228e5c89e4eSSatish Balay   exit(0);
229e5c89e4eSSatish Balay   return 0;
230e5c89e4eSSatish Balay }
231e5c89e4eSSatish Balay 
232ace3abfcSBarry Smith PetscBool    PetscOptionsPublish = PETSC_FALSE;
23309573ac7SBarry Smith extern PetscErrorCode        PetscSetUseTrMalloc_Private(void);
234ace3abfcSBarry Smith extern PetscBool  petscsetmallocvisited;
235e5c89e4eSSatish Balay static char       emacsmachinename[256];
236e5c89e4eSSatish Balay 
237e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0;
238e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = 0;
239e5c89e4eSSatish Balay 
240e5c89e4eSSatish Balay #undef __FUNCT__
241e5c89e4eSSatish Balay #define __FUNCT__ "PetscSetHelpVersionFunctions"
242e5c89e4eSSatish Balay /*@C
243e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
244e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
245e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
246e5c89e4eSSatish Balay 
247e5c89e4eSSatish Balay    Input Parameter:
248e5c89e4eSSatish Balay +  help - the help function (may be PETSC_NULL)
249da93591fSBarry Smith -  version - the version function (may be PETSC_NULL)
250e5c89e4eSSatish Balay 
251e5c89e4eSSatish Balay    Level: developer
252e5c89e4eSSatish Balay 
253e5c89e4eSSatish Balay    Concepts: package help message
254e5c89e4eSSatish Balay 
255e5c89e4eSSatish Balay @*/
2567087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
257e5c89e4eSSatish Balay {
258e5c89e4eSSatish Balay   PetscFunctionBegin;
259e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
260e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
261e5c89e4eSSatish Balay   PetscFunctionReturn(0);
262e5c89e4eSSatish Balay }
263e5c89e4eSSatish Balay 
264e5c89e4eSSatish Balay #undef __FUNCT__
265e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Private"
2667087cfbeSBarry Smith PetscErrorCode  PetscOptionsCheckInitial_Private(void)
267e5c89e4eSSatish Balay {
268e5c89e4eSSatish Balay   char           string[64],mname[PETSC_MAX_PATH_LEN],*f;
269e5c89e4eSSatish Balay   MPI_Comm       comm = PETSC_COMM_WORLD;
270ace3abfcSBarry Smith   PetscBool      flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flg4 = PETSC_FALSE,flag,flgz,flgzout;
271e5c89e4eSSatish Balay   PetscErrorCode ierr;
272a6d0e24fSJed Brown   PetscReal      si;
273e5c89e4eSSatish Balay   int            i;
274e5c89e4eSSatish Balay   PetscMPIInt    rank;
275e5c89e4eSSatish Balay   char           version[256];
276e5c89e4eSSatish Balay 
277e5c89e4eSSatish Balay   PetscFunctionBegin;
278e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
279e5c89e4eSSatish Balay 
280e5c89e4eSSatish Balay   /*
281e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
282e5c89e4eSSatish Balay   */
2838bb29257SSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr);
28481b192fdSBarry Smith #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD)
285acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr);
286e5c89e4eSSatish Balay   if ((!flg2 || flg1) && !petscsetmallocvisited) {
287555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
288555d055bSBarry Smith     if (flg2 || !(RUNNING_ON_VALGRIND)) {
289555d055bSBarry Smith       /* turn off default -malloc if valgrind is being used */
290555d055bSBarry Smith #endif
291e5c89e4eSSatish Balay       ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
292555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
293555d055bSBarry Smith     }
294555d055bSBarry Smith #endif
295e5c89e4eSSatish Balay   }
296e5c89e4eSSatish Balay #else
297acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
298acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr);
299e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
300e5c89e4eSSatish Balay #endif
301e5c89e4eSSatish Balay   if (flg3) {
302e5c89e4eSSatish Balay     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
303e5c89e4eSSatish Balay   }
30490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
305acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr);
306e5c89e4eSSatish Balay   if (flg1) {
307e5c89e4eSSatish Balay     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
308e5c89e4eSSatish Balay     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
309e5c89e4eSSatish Balay   }
310e5c89e4eSSatish Balay 
31190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
312acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
3137783f70dSSatish Balay   if (!flg1) {
31490d69ab7SBarry Smith     flg1 = PETSC_FALSE;
315acfcf0e5SJed Brown     ierr = PetscOptionsGetBool(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
3167783f70dSSatish Balay   }
317e5c89e4eSSatish Balay   if (flg1) {
318e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
319e5c89e4eSSatish Balay   }
320e5c89e4eSSatish Balay 
321e5c89e4eSSatish Balay   /*
322e5c89e4eSSatish Balay       Set the display variable for graphics
323e5c89e4eSSatish Balay   */
324e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
325e5c89e4eSSatish Balay 
326e5c89e4eSSatish Balay   /*
32751dcc849SKerry Stevens       Determine whether user specified maximum number of threads
32851dcc849SKerry Stevens    */
32951dcc849SKerry Stevens   ierr = PetscOptionsHasName(PETSC_NULL,"-thread_max",&flg1);CHKERRQ(ierr);
33051dcc849SKerry Stevens   if(flg1) {
33151dcc849SKerry Stevens     ierr = PetscOptionsGetInt(PETSC_NULL,"-thread_max",&PetscMaxThreads,PETSC_NULL);CHKERRQ(ierr);
33251dcc849SKerry Stevens   }
33351dcc849SKerry Stevens 
33451dcc849SKerry Stevens   /*
33551dcc849SKerry Stevens       Determine whether to use thread pool
33651dcc849SKerry Stevens    */
33751dcc849SKerry Stevens   ierr = PetscOptionsHasName(PETSC_NULL,"-use_thread_pool",&flg1);CHKERRQ(ierr);
33851dcc849SKerry Stevens   if(flg1) {
33951dcc849SKerry Stevens     PetscUseThreadPool = PETSC_TRUE;
34051dcc849SKerry Stevens     PetscThreadInitialize(PetscMaxThreads);
34151dcc849SKerry Stevens   }
34251dcc849SKerry Stevens 
34351dcc849SKerry Stevens   /*
344e5c89e4eSSatish Balay       Print the PETSc version information
345e5c89e4eSSatish Balay   */
346e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
347e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
348e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
349e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3){
350e5c89e4eSSatish Balay 
351e5c89e4eSSatish Balay     /*
352e5c89e4eSSatish Balay        Print "higher-level" package version message
353e5c89e4eSSatish Balay     */
354e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
355e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
356e5c89e4eSSatish Balay     }
357e5c89e4eSSatish Balay 
358a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
359e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
360e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
361e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
362e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
363e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
36484e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
365e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
366e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
367e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
368e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
369e5c89e4eSSatish Balay   }
370e5c89e4eSSatish Balay 
371e5c89e4eSSatish Balay   /*
372e5c89e4eSSatish Balay        Print "higher-level" package help message
373e5c89e4eSSatish Balay   */
374e5c89e4eSSatish Balay   if (flg3){
375e5c89e4eSSatish Balay     if (PetscExternalHelpFunction) {
376e5c89e4eSSatish Balay       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
377e5c89e4eSSatish Balay     }
378e5c89e4eSSatish Balay   }
379e5c89e4eSSatish Balay 
380e5c89e4eSSatish Balay   /*
381e5c89e4eSSatish Balay       Setup the error handling
382e5c89e4eSSatish Balay   */
38390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
384acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr);
385cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);}
38690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
387acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr);
388cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr);}
38990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
390acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr);
391e5c89e4eSSatish Balay   if (flg1) {
392e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
393e5c89e4eSSatish Balay   }
39490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
395acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
396cb9801acSJed Brown   if (!flg1) {ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr);}
39796cc47afSJed Brown   flg1 = PETSC_FALSE;
398acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr);
39996cc47afSJed Brown   if (flg1) {ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr);}
400e5c89e4eSSatish Balay 
401e5c89e4eSSatish Balay   /*
402e5c89e4eSSatish Balay       Setup debugger information
403e5c89e4eSSatish Balay   */
404e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
405e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
406e5c89e4eSSatish Balay   if (flg1) {
407e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
408e5c89e4eSSatish Balay 
409e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
410e5c89e4eSSatish Balay     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
411e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
412e5c89e4eSSatish Balay     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
413e5c89e4eSSatish Balay   }
4145e96ac45SJed Brown   ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
4155e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
416e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
417e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
418e5c89e4eSSatish Balay   if (flg1 || flg2) {
419e5c89e4eSSatish Balay     PetscMPIInt    size;
420e5c89e4eSSatish Balay     PetscInt       lsize,*nodes;
421e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
422e5c89e4eSSatish Balay     /*
423e5c89e4eSSatish Balay        we have to make sure that all processors have opened
424e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
425e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
426e5c89e4eSSatish Balay        and kill the program.
427e5c89e4eSSatish Balay     */
428e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
429e5c89e4eSSatish Balay     if (size > 2) {
430533163c2SBarry Smith       PetscMPIInt dummy = 0;
431e5c89e4eSSatish Balay       MPI_Status  status;
432e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
433e5c89e4eSSatish Balay         if (rank != i) {
434e5c89e4eSSatish Balay           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
435e5c89e4eSSatish Balay         }
436e5c89e4eSSatish Balay       }
437e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
438e5c89e4eSSatish Balay         if (rank != i) {
439e5c89e4eSSatish Balay           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
440e5c89e4eSSatish Balay         }
441e5c89e4eSSatish Balay       }
442e5c89e4eSSatish Balay     }
443e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
444e5c89e4eSSatish Balay     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
445e5c89e4eSSatish Balay     lsize = size;
446e5c89e4eSSatish Balay     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
447e5c89e4eSSatish Balay     if (flag) {
448e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
449e5c89e4eSSatish Balay         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
450e5c89e4eSSatish Balay       }
451e5c89e4eSSatish Balay     }
452e5c89e4eSSatish Balay     if (!flag) {
453e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
454e5c89e4eSSatish Balay       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
455e5c89e4eSSatish Balay       if (flg1) {
456e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
457e5c89e4eSSatish Balay       } else {
458e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
459e5c89e4eSSatish Balay       }
460e5c89e4eSSatish Balay       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
461e5c89e4eSSatish Balay       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
462e5c89e4eSSatish Balay     }
463e5c89e4eSSatish Balay     ierr = PetscFree(nodes);CHKERRQ(ierr);
464e5c89e4eSSatish Balay   }
465e5c89e4eSSatish Balay 
466e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
467cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
468e5c89e4eSSatish Balay 
46993ba235fSBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER)
47022b84c2fSbcordonn   /*
47122b84c2fSbcordonn     Activates new sockets for zope if needed
47222b84c2fSbcordonn   */
47384ab5442Sbcordonn   ierr = PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr);
474d8c6e182Sbcordonn   ierr = PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr);
4756dc8fec2Sbcordonn   if (flgz){
47622b84c2fSbcordonn     int  sockfd;
477f1384234SBarry Smith     char hostname[256];
47822b84c2fSbcordonn     char username[256];
4796dc8fec2Sbcordonn     int  remoteport = 9999;
4809c4c166aSBarry Smith 
48184ab5442Sbcordonn     ierr = PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
48284ab5442Sbcordonn     if (!hostname[0]){
4839c4c166aSBarry Smith       ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
4849c4c166aSBarry Smith     }
48522b84c2fSbcordonn     ierr = PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr);
4869c4c166aSBarry Smith     ierr = PetscGetUserName(username, 256);CHKERRQ(ierr);
48722b84c2fSbcordonn     PETSC_ZOPEFD = fdopen(sockfd, "w");
48822b84c2fSbcordonn     if (flgzout){
48922b84c2fSbcordonn       PETSC_STDOUT = PETSC_ZOPEFD;
490606f100bSbcordonn       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
4916dc8fec2Sbcordonn       fprintf(PETSC_STDOUT, "<<<start>>>");
4929c4c166aSBarry Smith     } else {
493d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
494d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<start>>>");
4959c4c166aSBarry Smith     }
4969c4c166aSBarry Smith   }
49793ba235fSBarry Smith #endif
498ffc871a5SBarry Smith #if defined(PETSC_USE_SERVER)
499ffc871a5SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-server", &flgz);CHKERRQ(ierr);
500ffc871a5SBarry Smith   if (flgz){
501ffc871a5SBarry Smith     PetscInt port = PETSC_DECIDE;
502ffc871a5SBarry Smith     ierr = PetscOptionsGetInt(PETSC_NULL,"-server",&port,PETSC_NULL);CHKERRQ(ierr);
503ffc871a5SBarry Smith     ierr = PetscWebServe(PETSC_COMM_WORLD,(int)port);CHKERRQ(ierr);
504ffc871a5SBarry Smith   }
505ffc871a5SBarry Smith #endif
5066dc8fec2Sbcordonn 
507e5c89e4eSSatish Balay   /*
508e5c89e4eSSatish Balay         Setup profiling and logging
509e5c89e4eSSatish Balay   */
5106cf91177SBarry Smith #if defined (PETSC_USE_INFO)
5118bb29257SSatish Balay   {
512e5c89e4eSSatish Balay     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
5136cf91177SBarry Smith     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
5148bb29257SSatish Balay     if (flg1 && logname[0]) {
515fcc2139eSBarry Smith       ierr = PetscInfoAllow(PETSC_TRUE,logname);CHKERRQ(ierr);
5168bb29257SSatish Balay     } else if (flg1) {
517fcc2139eSBarry Smith       ierr = PetscInfoAllow(PETSC_TRUE,PETSC_NULL);CHKERRQ(ierr);
518e5c89e4eSSatish Balay     }
519e5c89e4eSSatish Balay   }
520865f6aa8SSatish Balay #endif
521865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
522865f6aa8SSatish Balay   mname[0] = 0;
523f3dea69dSBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL,"-history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
524865f6aa8SSatish Balay   if (flg1) {
525865f6aa8SSatish Balay     if (mname[0]) {
526f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
527865f6aa8SSatish Balay     } else {
528f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
529865f6aa8SSatish Balay     }
530865f6aa8SSatish Balay   }
531e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
53290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
533fcfd50ebSBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
534e5c89e4eSSatish Balay   if (flg1) PetscLogMPEBegin();
535e5c89e4eSSatish Balay #endif
53690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
53790d69ab7SBarry Smith   flg2 = PETSC_FALSE;
53890d69ab7SBarry Smith   flg3 = PETSC_FALSE;
539acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr);
540acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr);
541d44e083bSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
5429f7b6320SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary_python",&flg4);CHKERRQ(ierr);
543e5c89e4eSSatish Balay   if (flg1)                      {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
5449f7b6320SBarry Smith   else if (flg2 || flg3 || flg4) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
545e5c89e4eSSatish Balay 
546e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
547e5c89e4eSSatish Balay   if (flg1) {
548e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
549e5c89e4eSSatish Balay     FILE *file;
550e5c89e4eSSatish Balay     if (mname[0]) {
551e5c89e4eSSatish Balay       sprintf(name,"%s.%d",mname,rank);
552e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
553e5c89e4eSSatish Balay       file = fopen(fname,"w");
554f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
555e5c89e4eSSatish Balay     } else {
556da9f1d6bSBarry Smith       file = PETSC_STDOUT;
557e5c89e4eSSatish Balay     }
558e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
559e5c89e4eSSatish Balay   }
560e5c89e4eSSatish Balay #endif
561e5c89e4eSSatish Balay 
562e5c89e4eSSatish Balay   /*
563e5c89e4eSSatish Balay       Setup building of stack frames for all function calls
564e5c89e4eSSatish Balay   */
56563d6bff0SBarry Smith #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD)
566e5c89e4eSSatish Balay   ierr = PetscStackCreate();CHKERRQ(ierr);
567e5c89e4eSSatish Balay #endif
568e5c89e4eSSatish Balay 
569acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr);
570e5c89e4eSSatish Balay 
571e5c89e4eSSatish Balay   /*
572e5c89e4eSSatish Balay        Print basic help message
573e5c89e4eSSatish Balay   */
574e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
575e5c89e4eSSatish Balay   if (flg1) {
576e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
577301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option\n");CHKERRQ(ierr);
578301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
579301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
580e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
581e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
582e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
583e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
584e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
585e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
586e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
587e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
588e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
589e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
590e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
591e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
592e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
593e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
594e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
595e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
596e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
597e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
598e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
5994161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
6004161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr);
601e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
602e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
603e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
604e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
605e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
606e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
607a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
608e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
609e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
610e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
611e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
612e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
613e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
614e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
615e5c89e4eSSatish Balay #endif
6166cf91177SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
617e5c89e4eSSatish Balay #endif
618e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
619e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
620e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
621e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
622e5c89e4eSSatish Balay   }
623e5c89e4eSSatish Balay 
624a6d0e24fSJed Brown   ierr = PetscOptionsGetReal(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
625e5c89e4eSSatish Balay   if (flg1) {
626e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
627e5c89e4eSSatish Balay   }
628e5c89e4eSSatish Balay 
6296cf91177SBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
630e5c89e4eSSatish Balay   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
631e5c89e4eSSatish Balay   if (f) {
6326cf91177SBarry Smith     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
633e5c89e4eSSatish Balay   }
634827f890bSBarry Smith 
6358154be41SBarry Smith #if defined(PETSC_HAVE_CUSP)
636c97f9302SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
63773113deaSBarry Smith   if (flg3) flg1 = PETSC_TRUE;
63873113deaSBarry Smith   else flg1 = PETSC_FALSE;
6398154be41SBarry Smith   ierr = PetscOptionsGetBool(PETSC_NULL,"-cusp_synchronize",&flg1,PETSC_NULL);CHKERRQ(ierr);
6408154be41SBarry Smith   if (flg1) synchronizeCUSP = PETSC_TRUE;
641bab1f7e6SVictor Minden #endif
642192daf7cSBarry Smith 
643e5c89e4eSSatish Balay   PetscFunctionReturn(0);
644e5c89e4eSSatish Balay }
645df413903SBarry Smith 
64651dcc849SKerry Stevens void* PetscThreadFunc(void* arg) {
64751dcc849SKerry Stevens   int ierr;
64851dcc849SKerry Stevens   int* pId = (int*)arg;
64951dcc849SKerry Stevens   int ThreadId = *pId;
65051dcc849SKerry Stevens 
65151dcc849SKerry Stevens   ierr = pthread_mutex_lock(&job.mutex);
65251dcc849SKerry Stevens   job.iNumReadyThreads++;
65351dcc849SKerry Stevens   if(job.iNumReadyThreads==PetscMaxThreads) {
65451dcc849SKerry Stevens     ierr = pthread_cond_signal(&main_cond);
65551dcc849SKerry Stevens   }
65651dcc849SKerry Stevens   //the while loop needs to have an exit
65751dcc849SKerry Stevens   //the 'main' thread can terminate all the threads by performing a broacast
65851dcc849SKerry Stevens   //and calling FuncFinish
65951dcc849SKerry Stevens   while(PetscThreadGo) {
66051dcc849SKerry Stevens     //need to check the condition to ensure we don't have to wait
66151dcc849SKerry Stevens     //waiting when you don't have to causes problems
66251dcc849SKerry Stevens     //also need to wait if another thread sneaks in and messes with the predicate
66351dcc849SKerry Stevens     while(job.startJob==PETSC_FALSE&&job.iNumJobThreads==0) {
66451dcc849SKerry Stevens       //upon entry, automically releases the lock and blocks
66551dcc849SKerry Stevens       //upon return, has the lock
66651dcc849SKerry Stevens       printf("Thread Blocking!\n");
66751dcc849SKerry Stevens       ierr = pthread_cond_wait(&job.cond,&job.mutex);
66851dcc849SKerry Stevens     }
66951dcc849SKerry Stevens     job.startJob = PETSC_FALSE;
67051dcc849SKerry Stevens     job.iNumJobThreads--;
67151dcc849SKerry Stevens     job.iNumReadyThreads--;
67251dcc849SKerry Stevens     if(job.pdata==NULL) {
67351dcc849SKerry Stevens       job.pfunc(job.pdata);
67451dcc849SKerry Stevens     }
67551dcc849SKerry Stevens     else {
67651dcc849SKerry Stevens       job.pfunc(job.pdata[PetscMaxThreads-job.iNumReadyThreads-1]);
67751dcc849SKerry Stevens     }
67851dcc849SKerry Stevens     pthread_mutex_unlock(&job.mutex);
67951dcc849SKerry Stevens     pthread_barrier_wait(job.pbarr); //ensures all threads are finished
68051dcc849SKerry Stevens     printf("Thread %d Got Past The Barrier!\n",ThreadId);
68151dcc849SKerry Stevens     //do collection of results?
68251dcc849SKerry Stevens     //reset job
68351dcc849SKerry Stevens     if(PetscThreadGo) {
68451dcc849SKerry Stevens       pthread_mutex_lock(&job.mutex);
68551dcc849SKerry Stevens       job.iNumReadyThreads++;
68651dcc849SKerry Stevens       if(job.iNumReadyThreads==PetscMaxThreads) {
68751dcc849SKerry Stevens 	//signal the 'main' thread that the job is done!
68851dcc849SKerry Stevens 	ierr = pthread_cond_signal(&main_cond);
68951dcc849SKerry Stevens       }
69051dcc849SKerry Stevens     }
69151dcc849SKerry Stevens   }
69251dcc849SKerry Stevens   printf("Thread Signing Off!\n");
69351dcc849SKerry Stevens   return NULL;
69451dcc849SKerry Stevens }
69551dcc849SKerry Stevens 
696*f09cb4aaSKerry Stevens #undef __FUNCT__
697*f09cb4aaSKerry Stevens #define __FUNCT__ "PetscThreadInitialize"
69851dcc849SKerry Stevens void* PetscThreadInitialize(PetscInt N) {
69951dcc849SKerry Stevens   PetscInt i;
70051dcc849SKerry Stevens   int status;
701*f09cb4aaSKerry Stevens   pVal = (int*)malloc(N*sizeof(int));
70251dcc849SKerry Stevens   printf("In Thread Initialize Function\n");
70351dcc849SKerry Stevens   //allocate memory in the heap for the thread structure
70451dcc849SKerry Stevens   PetscThreadPoint = (pthread_t*)malloc(N*sizeof(pthread_t));
70551dcc849SKerry Stevens   BarrPoint = (pthread_barrier_t*)malloc((N+1)*sizeof(pthread_barrier_t)); //BarrPoint[0] makes no sense, don't use it!
706*f09cb4aaSKerry Stevens   job.pdata = (void**)malloc(N*sizeof(void*));
70751dcc849SKerry Stevens   for(i=0; i<N; i++) {
708*f09cb4aaSKerry Stevens     pVal[i] = i;
709*f09cb4aaSKerry Stevens     status = pthread_create(&PetscThreadPoint[i],NULL,PetscThreadFunc,&pVal[i]);
71051dcc849SKerry Stevens     //error check to ensure proper thread creation
71151dcc849SKerry Stevens     status = pthread_barrier_init(&BarrPoint[i+1],NULL,i+1);
71251dcc849SKerry Stevens     //error check
71351dcc849SKerry Stevens   }
71451dcc849SKerry Stevens   return NULL;
71551dcc849SKerry Stevens }
71651dcc849SKerry Stevens 
717*f09cb4aaSKerry Stevens 
718*f09cb4aaSKerry Stevens #undef __FUNCT__
719*f09cb4aaSKerry Stevens #define __FUNCT__ "PetscThreadFinalize"
72051dcc849SKerry Stevens PetscErrorCode PetscThreadFinalize() {
72151dcc849SKerry Stevens   int i,ierr;
72251dcc849SKerry Stevens   void* jstatus;
72351dcc849SKerry Stevens 
72451dcc849SKerry Stevens   PetscFunctionBegin;
72551dcc849SKerry Stevens   printf("In Thread Finalize Function\n");
72651dcc849SKerry Stevens   MainWait(); //guarantee that all threads are ready to go
72751dcc849SKerry Stevens   printf("Main Thread Done Waiting!\n");
72851dcc849SKerry Stevens   MainJob(FuncFinish,NULL,&BarrPoint[PetscMaxThreads],PetscMaxThreads);  //set up job and broadcast work
72951dcc849SKerry Stevens   printf("Main Thread Done With Finish Function!\n");
73051dcc849SKerry Stevens   //join the threads
73151dcc849SKerry Stevens   for(i=0; i<PetscMaxThreads; i++) {
73251dcc849SKerry Stevens     ierr = pthread_join(PetscThreadPoint[i],&jstatus);
73351dcc849SKerry Stevens     //do error checking
73451dcc849SKerry Stevens   }
73551dcc849SKerry Stevens   printf("Main Thread Done With Joins!\n");
73651dcc849SKerry Stevens   free(BarrPoint);
73751dcc849SKerry Stevens   free(PetscThreadPoint);
73851dcc849SKerry Stevens   PetscFunctionReturn(0);
73951dcc849SKerry Stevens }
74051dcc849SKerry Stevens 
741*f09cb4aaSKerry Stevens #undef __FUNCT__
742*f09cb4aaSKerry Stevens #define __FUNCT__ "MainWait"
74351dcc849SKerry Stevens void MainWait() {
74451dcc849SKerry Stevens   int ierr;
74551dcc849SKerry Stevens 
74651dcc849SKerry Stevens   ierr = pthread_mutex_lock(&job.mutex);
74751dcc849SKerry Stevens   while(job.iNumReadyThreads<PetscMaxThreads||job.startJob==PETSC_TRUE) {
74851dcc849SKerry Stevens     ierr = pthread_cond_wait(&main_cond,&job.mutex);
74951dcc849SKerry Stevens   }
750*f09cb4aaSKerry Stevens   ierr = pthread_mutex_unlock(&job.mutex);
75151dcc849SKerry Stevens }
75251dcc849SKerry Stevens 
753*f09cb4aaSKerry Stevens #undef __FUNCT__
754*f09cb4aaSKerry Stevens #define __FUNCT__ "MainJob"
75551dcc849SKerry Stevens void MainJob(void* (*pFunc)(void*),void** data,pthread_barrier_t* barr,PetscInt n) {
75651dcc849SKerry Stevens   int ierr;
75751dcc849SKerry Stevens 
758*f09cb4aaSKerry Stevens   ierr = pthread_mutex_lock(&job.mutex);
75951dcc849SKerry Stevens   job.pfunc = pFunc;
76051dcc849SKerry Stevens   job.pdata = data;
76151dcc849SKerry Stevens   job.pbarr = barr;
76251dcc849SKerry Stevens   job.iNumJobThreads = n;
76351dcc849SKerry Stevens   job.startJob = PETSC_TRUE;
76451dcc849SKerry Stevens   ierr = pthread_cond_broadcast(&job.cond);
76551dcc849SKerry Stevens   ierr = pthread_mutex_unlock(&job.mutex);
76651dcc849SKerry Stevens }
76751dcc849SKerry Stevens 
76851dcc849SKerry Stevens void* FuncFinish(void* arg) {
76951dcc849SKerry Stevens   printf("In Thread Finish Function\n");
77051dcc849SKerry Stevens   PetscThreadGo = PETSC_FALSE;
77151dcc849SKerry Stevens   return NULL;
77251dcc849SKerry Stevens }
773