xref: /petsc/src/sys/objects/init.c (revision 0ca81413ba2e908e73df59769d30584e082b69ad)
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*0ca81413SKerry Stevens PetscErrorCode ithreaderr;
38f09cb4aaSKerry Stevens int*         pVal;
3951dcc849SKerry Stevens 
4051dcc849SKerry Stevens typedef struct {
4151dcc849SKerry Stevens   pthread_mutex_t mutex;
4251dcc849SKerry Stevens   pthread_cond_t cond;
4351dcc849SKerry Stevens   void* (*pfunc)(void*);
4451dcc849SKerry Stevens   void** pdata;
4551dcc849SKerry Stevens   pthread_barrier_t* pbarr;
4651dcc849SKerry Stevens   int iNumJobThreads;
4751dcc849SKerry Stevens   int iNumReadyThreads;
4851dcc849SKerry Stevens   PetscBool startJob;
4951dcc849SKerry Stevens } sjob;
5051dcc849SKerry Stevens sjob job = {PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,NULL,NULL,NULL,0,0,PETSC_FALSE};
5151dcc849SKerry Stevens 
5251dcc849SKerry Stevens pthread_cond_t  main_cond  = PTHREAD_COND_INITIALIZER;
5351dcc849SKerry Stevens 
5451dcc849SKerry Stevens void*          PetscThreadFunc(void*);
5551dcc849SKerry Stevens void*          PetscThreadInitialize(PetscInt);
5651dcc849SKerry Stevens PetscErrorCode PetscThreadFinalize(void);
5751dcc849SKerry Stevens void           MainWait(void);
58*0ca81413SKerry Stevens PetscErrorCode MainJob(void* (*pFunc)(void*),void**,PetscInt);
5951dcc849SKerry Stevens void* FuncFinish(void*);
60*0ca81413SKerry Stevens void* PetscThreadRun(MPI_Comm Comm,void* (*pFunc)(void*),int,pthread_t*,void**);
61*0ca81413SKerry Stevens void* PetscThreadStop(MPI_Comm Comm,int,pthread_t*);
62e5c89e4eSSatish Balay 
63e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
64e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
65e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
66e5c89e4eSSatish Balay #endif
672c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
687087cfbeSBarry Smith MPI_Datatype   MPI_C_DOUBLE_COMPLEX;
697087cfbeSBarry Smith MPI_Datatype   MPI_C_COMPLEX;
702c876bd9SBarry Smith #endif
717087cfbeSBarry Smith PetscScalar    PETSC_i;
72e5c89e4eSSatish Balay #else
737087cfbeSBarry Smith PetscScalar    PETSC_i = 0.0;
74e5c89e4eSSatish Balay #endif
75ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
76c90a1750SBarry Smith MPI_Datatype   MPIU___FLOAT128 = 0;
77c90a1750SBarry Smith #endif
787087cfbeSBarry Smith MPI_Datatype   MPIU_2SCALAR = 0;
797087cfbeSBarry Smith MPI_Datatype   MPIU_2INT = 0;
8075567043SBarry Smith 
81e5c89e4eSSatish Balay /*
82e5c89e4eSSatish Balay      These are needed by petscbt.h
83e5c89e4eSSatish Balay */
84c6db04a5SJed Brown #include <petscbt.h>
857087cfbeSBarry Smith char      _BT_mask = ' ';
867087cfbeSBarry Smith char      _BT_c = ' ';
877087cfbeSBarry Smith PetscInt  _BT_idx  = 0;
88e5c89e4eSSatish Balay 
89e5c89e4eSSatish Balay /*
90e5c89e4eSSatish Balay        Function that is called to display all error messages
91e5c89e4eSSatish Balay */
927087cfbeSBarry Smith PetscErrorCode  (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
937087cfbeSBarry Smith PetscErrorCode  (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
94238ccf28SShri Abhyankar #if defined(PETSC_HAVE_MATLAB_ENGINE)
957087cfbeSBarry Smith PetscErrorCode  (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintf_Matlab;
96238ccf28SShri Abhyankar #else
977087cfbeSBarry Smith PetscErrorCode  (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
98238ccf28SShri Abhyankar #endif
99bab1f7e6SVictor Minden /*
1008154be41SBarry Smith   This is needed to turn on/off cusp synchronization */
1018154be41SBarry Smith PetscBool   synchronizeCUSP = PETSC_FALSE;
102bab1f7e6SVictor Minden 
103e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
104e5c89e4eSSatish Balay /*
105e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
106e5c89e4eSSatish Balay */
107e5c89e4eSSatish Balay FILE *petsc_history = PETSC_NULL;
108e5c89e4eSSatish Balay 
109e5c89e4eSSatish Balay #undef __FUNCT__
110f3dea69dSBarry Smith #define __FUNCT__ "PetscOpenHistoryFile"
1117087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
112e5c89e4eSSatish Balay {
113e5c89e4eSSatish Balay   PetscErrorCode ierr;
114e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
115e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
116e5c89e4eSSatish Balay   char           version[256];
117e5c89e4eSSatish Balay 
118e5c89e4eSSatish Balay   PetscFunctionBegin;
119e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
120e5c89e4eSSatish Balay   if (!rank) {
121e5c89e4eSSatish Balay     char        arch[10];
122f56c2debSBarry Smith     int         err;
12388c29154SBarry Smith     PetscViewer viewer;
124f56c2debSBarry Smith 
125e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
126e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
127a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
128e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
129e5c89e4eSSatish Balay     if (filename) {
130e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
131e5c89e4eSSatish Balay     } else {
132e5c89e4eSSatish Balay       ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr);
133e5c89e4eSSatish Balay       ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr);
134e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
135e5c89e4eSSatish Balay     }
136e5c89e4eSSatish Balay 
137e32f2f54SBarry Smith     *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
138e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
139e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
140e5c89e4eSSatish Balay     ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
141e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
14288c29154SBarry Smith     ierr = PetscViewerASCIIOpenWithFILE(PETSC_COMM_WORLD,*fd,&viewer);CHKERRQ(ierr);
14388c29154SBarry Smith     ierr = PetscOptionsView(viewer);CHKERRQ(ierr);
1446bf464f9SBarry Smith     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
145e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
146f56c2debSBarry Smith     err = fflush(*fd);
147e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
148e5c89e4eSSatish Balay   }
149e5c89e4eSSatish Balay   PetscFunctionReturn(0);
150e5c89e4eSSatish Balay }
151e5c89e4eSSatish Balay 
152e5c89e4eSSatish Balay #undef __FUNCT__
153f3dea69dSBarry Smith #define __FUNCT__ "PetscCloseHistoryFile"
1547087cfbeSBarry Smith PetscErrorCode  PetscCloseHistoryFile(FILE **fd)
155e5c89e4eSSatish Balay {
156e5c89e4eSSatish Balay   PetscErrorCode ierr;
157e5c89e4eSSatish Balay   PetscMPIInt    rank;
158e5c89e4eSSatish Balay   char           date[64];
159f56c2debSBarry Smith   int            err;
160e5c89e4eSSatish Balay 
161e5c89e4eSSatish Balay   PetscFunctionBegin;
162e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
163e5c89e4eSSatish Balay   if (!rank) {
164e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
165e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
166e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
167e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr);
168f56c2debSBarry Smith     err = fflush(*fd);
169e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
170f56c2debSBarry Smith     err = fclose(*fd);
171e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
172e5c89e4eSSatish Balay   }
173e5c89e4eSSatish Balay   PetscFunctionReturn(0);
174e5c89e4eSSatish Balay }
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
177e5c89e4eSSatish Balay 
178e5c89e4eSSatish Balay /*
179e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
180e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
181e5c89e4eSSatish Balay 
182e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1833c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1843c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
185e5c89e4eSSatish Balay */
186e5c89e4eSSatish Balay 
187e5c89e4eSSatish Balay #undef __FUNCT__
188e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_AbortOnError"
189e5c89e4eSSatish Balay void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag)
190e5c89e4eSSatish Balay {
191e5c89e4eSSatish Balay   PetscFunctionBegin;
1923c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
193e5c89e4eSSatish Balay   abort();
194e5c89e4eSSatish Balay }
195e5c89e4eSSatish Balay 
196e5c89e4eSSatish Balay #undef __FUNCT__
197e5c89e4eSSatish Balay #define __FUNCT__ "Petsc_MPI_DebuggerOnError"
198e5c89e4eSSatish Balay void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag)
199e5c89e4eSSatish Balay {
200e5c89e4eSSatish Balay   PetscErrorCode ierr;
201e5c89e4eSSatish Balay 
202e5c89e4eSSatish Balay   PetscFunctionBegin;
2033c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
204e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
205e5c89e4eSSatish Balay   if (ierr) { /* hopeless so get out */
2063c311c98SBarry Smith     MPI_Abort(*comm,*flag);
207e5c89e4eSSatish Balay   }
208e5c89e4eSSatish Balay }
209e5c89e4eSSatish Balay 
210e5c89e4eSSatish Balay #undef __FUNCT__
211e5c89e4eSSatish Balay #define __FUNCT__ "PetscEnd"
212e5c89e4eSSatish Balay /*@C
213e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
214e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
217e5c89e4eSSatish Balay 
218e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
219e5c89e4eSSatish Balay 
220e5c89e4eSSatish Balay    Level: advanced
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Note:
223e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
224e5c89e4eSSatish Balay 
22588c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
226e5c89e4eSSatish Balay @*/
2277087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
228e5c89e4eSSatish Balay {
229e5c89e4eSSatish Balay   PetscFunctionBegin;
230e5c89e4eSSatish Balay   PetscFinalize();
231e5c89e4eSSatish Balay   exit(0);
232e5c89e4eSSatish Balay   return 0;
233e5c89e4eSSatish Balay }
234e5c89e4eSSatish Balay 
235ace3abfcSBarry Smith PetscBool    PetscOptionsPublish = PETSC_FALSE;
23609573ac7SBarry Smith extern PetscErrorCode        PetscSetUseTrMalloc_Private(void);
237ace3abfcSBarry Smith extern PetscBool  petscsetmallocvisited;
238e5c89e4eSSatish Balay static char       emacsmachinename[256];
239e5c89e4eSSatish Balay 
240e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0;
241e5c89e4eSSatish Balay PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = 0;
242e5c89e4eSSatish Balay 
243e5c89e4eSSatish Balay #undef __FUNCT__
244e5c89e4eSSatish Balay #define __FUNCT__ "PetscSetHelpVersionFunctions"
245e5c89e4eSSatish Balay /*@C
246e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
247e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
248e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
249e5c89e4eSSatish Balay 
250e5c89e4eSSatish Balay    Input Parameter:
251e5c89e4eSSatish Balay +  help - the help function (may be PETSC_NULL)
252da93591fSBarry Smith -  version - the version function (may be PETSC_NULL)
253e5c89e4eSSatish Balay 
254e5c89e4eSSatish Balay    Level: developer
255e5c89e4eSSatish Balay 
256e5c89e4eSSatish Balay    Concepts: package help message
257e5c89e4eSSatish Balay 
258e5c89e4eSSatish Balay @*/
2597087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
260e5c89e4eSSatish Balay {
261e5c89e4eSSatish Balay   PetscFunctionBegin;
262e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
263e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
264e5c89e4eSSatish Balay   PetscFunctionReturn(0);
265e5c89e4eSSatish Balay }
266e5c89e4eSSatish Balay 
267e5c89e4eSSatish Balay #undef __FUNCT__
268e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Private"
2697087cfbeSBarry Smith PetscErrorCode  PetscOptionsCheckInitial_Private(void)
270e5c89e4eSSatish Balay {
271e5c89e4eSSatish Balay   char           string[64],mname[PETSC_MAX_PATH_LEN],*f;
272e5c89e4eSSatish Balay   MPI_Comm       comm = PETSC_COMM_WORLD;
273ace3abfcSBarry Smith   PetscBool      flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flg4 = PETSC_FALSE,flag,flgz,flgzout;
274e5c89e4eSSatish Balay   PetscErrorCode ierr;
275a6d0e24fSJed Brown   PetscReal      si;
276e5c89e4eSSatish Balay   int            i;
277e5c89e4eSSatish Balay   PetscMPIInt    rank;
278e5c89e4eSSatish Balay   char           version[256];
279e5c89e4eSSatish Balay 
280e5c89e4eSSatish Balay   PetscFunctionBegin;
281e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
282e5c89e4eSSatish Balay 
283e5c89e4eSSatish Balay   /*
284e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
285e5c89e4eSSatish Balay   */
2868bb29257SSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr);
28781b192fdSBarry Smith #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD)
288acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr);
289e5c89e4eSSatish Balay   if ((!flg2 || flg1) && !petscsetmallocvisited) {
290555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
291555d055bSBarry Smith     if (flg2 || !(RUNNING_ON_VALGRIND)) {
292555d055bSBarry Smith       /* turn off default -malloc if valgrind is being used */
293555d055bSBarry Smith #endif
294e5c89e4eSSatish Balay       ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
295555d055bSBarry Smith #if defined(PETSC_HAVE_VALGRIND)
296555d055bSBarry Smith     }
297555d055bSBarry Smith #endif
298e5c89e4eSSatish Balay   }
299e5c89e4eSSatish Balay #else
300acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
301acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr);
302e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);}
303e5c89e4eSSatish Balay #endif
304e5c89e4eSSatish Balay   if (flg3) {
305e5c89e4eSSatish Balay     ierr = PetscMallocSetDumpLog();CHKERRQ(ierr);
306e5c89e4eSSatish Balay   }
30790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
308acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr);
309e5c89e4eSSatish Balay   if (flg1) {
310e5c89e4eSSatish Balay     ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);
311e5c89e4eSSatish Balay     ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr);
312e5c89e4eSSatish Balay   }
313e5c89e4eSSatish Balay 
31490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
315acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
3167783f70dSSatish Balay   if (!flg1) {
31790d69ab7SBarry Smith     flg1 = PETSC_FALSE;
318acfcf0e5SJed Brown     ierr = PetscOptionsGetBool(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr);
3197783f70dSSatish Balay   }
320e5c89e4eSSatish Balay   if (flg1) {
321e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
322e5c89e4eSSatish Balay   }
323e5c89e4eSSatish Balay 
324e5c89e4eSSatish Balay   /*
325e5c89e4eSSatish Balay       Set the display variable for graphics
326e5c89e4eSSatish Balay   */
327e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
328e5c89e4eSSatish Balay 
329e5c89e4eSSatish Balay   /*
33051dcc849SKerry Stevens       Determine whether user specified maximum number of threads
33151dcc849SKerry Stevens    */
33251dcc849SKerry Stevens   ierr = PetscOptionsHasName(PETSC_NULL,"-thread_max",&flg1);CHKERRQ(ierr);
33351dcc849SKerry Stevens   if(flg1) {
33451dcc849SKerry Stevens     ierr = PetscOptionsGetInt(PETSC_NULL,"-thread_max",&PetscMaxThreads,PETSC_NULL);CHKERRQ(ierr);
33551dcc849SKerry Stevens   }
33651dcc849SKerry Stevens 
33751dcc849SKerry Stevens   /*
33851dcc849SKerry Stevens       Determine whether to use thread pool
33951dcc849SKerry Stevens    */
34051dcc849SKerry Stevens   ierr = PetscOptionsHasName(PETSC_NULL,"-use_thread_pool",&flg1);CHKERRQ(ierr);
34151dcc849SKerry Stevens   if(flg1) {
34251dcc849SKerry Stevens     PetscUseThreadPool = PETSC_TRUE;
34351dcc849SKerry Stevens   }
344*0ca81413SKerry Stevens   PetscThreadInitialize(PetscMaxThreads);
34551dcc849SKerry Stevens   /*
346e5c89e4eSSatish Balay       Print the PETSc version information
347e5c89e4eSSatish Balay   */
348e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr);
349e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr);
350e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr);
351e5c89e4eSSatish Balay   if (flg1 || flg2 || flg3){
352e5c89e4eSSatish Balay 
353e5c89e4eSSatish Balay     /*
354e5c89e4eSSatish Balay        Print "higher-level" package version message
355e5c89e4eSSatish Balay     */
356e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
357e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
358e5c89e4eSSatish Balay     }
359e5c89e4eSSatish Balay 
360a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
361e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
362e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
363e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
364e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
365e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
36684e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
367e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
368e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
369e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\
370e5c89e4eSSatish Balay ------------------------------\n");CHKERRQ(ierr);
371e5c89e4eSSatish Balay   }
372e5c89e4eSSatish Balay 
373e5c89e4eSSatish Balay   /*
374e5c89e4eSSatish Balay        Print "higher-level" package help message
375e5c89e4eSSatish Balay   */
376e5c89e4eSSatish Balay   if (flg3){
377e5c89e4eSSatish Balay     if (PetscExternalHelpFunction) {
378e5c89e4eSSatish Balay       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
379e5c89e4eSSatish Balay     }
380e5c89e4eSSatish Balay   }
381e5c89e4eSSatish Balay 
382e5c89e4eSSatish Balay   /*
383e5c89e4eSSatish Balay       Setup the error handling
384e5c89e4eSSatish Balay   */
38590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
386acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr);
387cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);}
38890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
389acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr);
390cb9801acSJed Brown   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr);}
39190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
392acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr);
393e5c89e4eSSatish Balay   if (flg1) {
394e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
395e5c89e4eSSatish Balay   }
39690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
397acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
398cb9801acSJed Brown   if (!flg1) {ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr);}
39996cc47afSJed Brown   flg1 = PETSC_FALSE;
400acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr);
40196cc47afSJed Brown   if (flg1) {ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr);}
402e5c89e4eSSatish Balay 
403e5c89e4eSSatish Balay   /*
404e5c89e4eSSatish Balay       Setup debugger information
405e5c89e4eSSatish Balay   */
406e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
407e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr);
408e5c89e4eSSatish Balay   if (flg1) {
409e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
410e5c89e4eSSatish Balay 
411e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
412e5c89e4eSSatish Balay     ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
413e5c89e4eSSatish Balay     ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
414e5c89e4eSSatish Balay     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr);
415e5c89e4eSSatish Balay   }
4165e96ac45SJed Brown   ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr);
4175e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
418e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr);
419e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr);
420e5c89e4eSSatish Balay   if (flg1 || flg2) {
421e5c89e4eSSatish Balay     PetscMPIInt    size;
422e5c89e4eSSatish Balay     PetscInt       lsize,*nodes;
423e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
424e5c89e4eSSatish Balay     /*
425e5c89e4eSSatish Balay        we have to make sure that all processors have opened
426e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
427e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
428e5c89e4eSSatish Balay        and kill the program.
429e5c89e4eSSatish Balay     */
430e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
431e5c89e4eSSatish Balay     if (size > 2) {
432533163c2SBarry Smith       PetscMPIInt dummy = 0;
433e5c89e4eSSatish Balay       MPI_Status  status;
434e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
435e5c89e4eSSatish Balay         if (rank != i) {
436e5c89e4eSSatish Balay           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr);
437e5c89e4eSSatish Balay         }
438e5c89e4eSSatish Balay       }
439e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
440e5c89e4eSSatish Balay         if (rank != i) {
441e5c89e4eSSatish Balay           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr);
442e5c89e4eSSatish Balay         }
443e5c89e4eSSatish Balay       }
444e5c89e4eSSatish Balay     }
445e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
446e5c89e4eSSatish Balay     ierr  = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr);
447e5c89e4eSSatish Balay     lsize = size;
448e5c89e4eSSatish Balay     ierr  = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
449e5c89e4eSSatish Balay     if (flag) {
450e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
451e5c89e4eSSatish Balay         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
452e5c89e4eSSatish Balay       }
453e5c89e4eSSatish Balay     }
454e5c89e4eSSatish Balay     if (!flag) {
455e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
456e5c89e4eSSatish Balay       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr);
457e5c89e4eSSatish Balay       if (flg1) {
458e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
459e5c89e4eSSatish Balay       } else {
460e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
461e5c89e4eSSatish Balay       }
462e5c89e4eSSatish Balay       ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
463e5c89e4eSSatish Balay       ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr);
464e5c89e4eSSatish Balay     }
465e5c89e4eSSatish Balay     ierr = PetscFree(nodes);CHKERRQ(ierr);
466e5c89e4eSSatish Balay   }
467e5c89e4eSSatish Balay 
468e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr);
469cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
470e5c89e4eSSatish Balay 
47193ba235fSBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER)
47222b84c2fSbcordonn   /*
47322b84c2fSbcordonn     Activates new sockets for zope if needed
47422b84c2fSbcordonn   */
47584ab5442Sbcordonn   ierr = PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr);
476d8c6e182Sbcordonn   ierr = PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr);
4776dc8fec2Sbcordonn   if (flgz){
47822b84c2fSbcordonn     int  sockfd;
479f1384234SBarry Smith     char hostname[256];
48022b84c2fSbcordonn     char username[256];
4816dc8fec2Sbcordonn     int  remoteport = 9999;
4829c4c166aSBarry Smith 
48384ab5442Sbcordonn     ierr = PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr);
48484ab5442Sbcordonn     if (!hostname[0]){
4859c4c166aSBarry Smith       ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
4869c4c166aSBarry Smith     }
48722b84c2fSbcordonn     ierr = PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr);
4889c4c166aSBarry Smith     ierr = PetscGetUserName(username, 256);CHKERRQ(ierr);
48922b84c2fSbcordonn     PETSC_ZOPEFD = fdopen(sockfd, "w");
49022b84c2fSbcordonn     if (flgzout){
49122b84c2fSbcordonn       PETSC_STDOUT = PETSC_ZOPEFD;
492606f100bSbcordonn       fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username);
4936dc8fec2Sbcordonn       fprintf(PETSC_STDOUT, "<<<start>>>");
4949c4c166aSBarry Smith     } else {
495d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username);
496d8c6e182Sbcordonn       fprintf(PETSC_ZOPEFD, "<<<start>>>");
4979c4c166aSBarry Smith     }
4989c4c166aSBarry Smith   }
49993ba235fSBarry Smith #endif
500ffc871a5SBarry Smith #if defined(PETSC_USE_SERVER)
501ffc871a5SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-server", &flgz);CHKERRQ(ierr);
502ffc871a5SBarry Smith   if (flgz){
503ffc871a5SBarry Smith     PetscInt port = PETSC_DECIDE;
504ffc871a5SBarry Smith     ierr = PetscOptionsGetInt(PETSC_NULL,"-server",&port,PETSC_NULL);CHKERRQ(ierr);
505ffc871a5SBarry Smith     ierr = PetscWebServe(PETSC_COMM_WORLD,(int)port);CHKERRQ(ierr);
506ffc871a5SBarry Smith   }
507ffc871a5SBarry Smith #endif
5086dc8fec2Sbcordonn 
509e5c89e4eSSatish Balay   /*
510e5c89e4eSSatish Balay         Setup profiling and logging
511e5c89e4eSSatish Balay   */
5126cf91177SBarry Smith #if defined (PETSC_USE_INFO)
5138bb29257SSatish Balay   {
514e5c89e4eSSatish Balay     char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0;
5156cf91177SBarry Smith     ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr);
5168bb29257SSatish Balay     if (flg1 && logname[0]) {
517fcc2139eSBarry Smith       ierr = PetscInfoAllow(PETSC_TRUE,logname);CHKERRQ(ierr);
5188bb29257SSatish Balay     } else if (flg1) {
519fcc2139eSBarry Smith       ierr = PetscInfoAllow(PETSC_TRUE,PETSC_NULL);CHKERRQ(ierr);
520e5c89e4eSSatish Balay     }
521e5c89e4eSSatish Balay   }
522865f6aa8SSatish Balay #endif
523865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
524865f6aa8SSatish Balay   mname[0] = 0;
525f3dea69dSBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL,"-history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
526865f6aa8SSatish Balay   if (flg1) {
527865f6aa8SSatish Balay     if (mname[0]) {
528f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
529865f6aa8SSatish Balay     } else {
530f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr);
531865f6aa8SSatish Balay     }
532865f6aa8SSatish Balay   }
533e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
53490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
535fcfd50ebSBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
536e5c89e4eSSatish Balay   if (flg1) PetscLogMPEBegin();
537e5c89e4eSSatish Balay #endif
53890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
53990d69ab7SBarry Smith   flg2 = PETSC_FALSE;
54090d69ab7SBarry Smith   flg3 = PETSC_FALSE;
541acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr);
542acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr);
543d44e083bSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
5449f7b6320SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary_python",&flg4);CHKERRQ(ierr);
545e5c89e4eSSatish Balay   if (flg1)                      {  ierr = PetscLogAllBegin();CHKERRQ(ierr); }
5469f7b6320SBarry Smith   else if (flg2 || flg3 || flg4) {  ierr = PetscLogBegin();CHKERRQ(ierr);}
547e5c89e4eSSatish Balay 
548e5c89e4eSSatish Balay   ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr);
549e5c89e4eSSatish Balay   if (flg1) {
550e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
551e5c89e4eSSatish Balay     FILE *file;
552e5c89e4eSSatish Balay     if (mname[0]) {
553e5c89e4eSSatish Balay       sprintf(name,"%s.%d",mname,rank);
554e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
555e5c89e4eSSatish Balay       file = fopen(fname,"w");
556f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
557e5c89e4eSSatish Balay     } else {
558da9f1d6bSBarry Smith       file = PETSC_STDOUT;
559e5c89e4eSSatish Balay     }
560e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
561e5c89e4eSSatish Balay   }
562e5c89e4eSSatish Balay #endif
563e5c89e4eSSatish Balay 
564e5c89e4eSSatish Balay   /*
565e5c89e4eSSatish Balay       Setup building of stack frames for all function calls
566e5c89e4eSSatish Balay   */
56763d6bff0SBarry Smith #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD)
568e5c89e4eSSatish Balay   ierr = PetscStackCreate();CHKERRQ(ierr);
569e5c89e4eSSatish Balay #endif
570e5c89e4eSSatish Balay 
571acfcf0e5SJed Brown   ierr = PetscOptionsGetBool(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr);
572e5c89e4eSSatish Balay 
573e5c89e4eSSatish Balay   /*
574e5c89e4eSSatish Balay        Print basic help message
575e5c89e4eSSatish Balay   */
576e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
577e5c89e4eSSatish Balay   if (flg1) {
578e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
579301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option\n");CHKERRQ(ierr);
580301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
581301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
582e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
583e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
584e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
585e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
586e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
587e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
588e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
589e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
590e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
591e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
592e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
593e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr);
594e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
595e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
596e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
597e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
598e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
599e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr);
600e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr);
6014161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
6024161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr);
603e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr);
604e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr);
605e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
606e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
607e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
608e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
609a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
610e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr);
611e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
612e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
613e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr);
614e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
615e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
616e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr);
617e5c89e4eSSatish Balay #endif
6186cf91177SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr);
619e5c89e4eSSatish Balay #endif
620e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr);
621e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
622e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
623e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
624e5c89e4eSSatish Balay   }
625e5c89e4eSSatish Balay 
626a6d0e24fSJed Brown   ierr = PetscOptionsGetReal(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
627e5c89e4eSSatish Balay   if (flg1) {
628e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
629e5c89e4eSSatish Balay   }
630e5c89e4eSSatish Balay 
6316cf91177SBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
632e5c89e4eSSatish Balay   ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr);
633e5c89e4eSSatish Balay   if (f) {
6346cf91177SBarry Smith     ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr);
635e5c89e4eSSatish Balay   }
636827f890bSBarry Smith 
6378154be41SBarry Smith #if defined(PETSC_HAVE_CUSP)
638c97f9302SBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr);
63973113deaSBarry Smith   if (flg3) flg1 = PETSC_TRUE;
64073113deaSBarry Smith   else flg1 = PETSC_FALSE;
6418154be41SBarry Smith   ierr = PetscOptionsGetBool(PETSC_NULL,"-cusp_synchronize",&flg1,PETSC_NULL);CHKERRQ(ierr);
6428154be41SBarry Smith   if (flg1) synchronizeCUSP = PETSC_TRUE;
643bab1f7e6SVictor Minden #endif
644192daf7cSBarry Smith 
645e5c89e4eSSatish Balay   PetscFunctionReturn(0);
646e5c89e4eSSatish Balay }
647df413903SBarry Smith 
64851dcc849SKerry Stevens void* PetscThreadFunc(void* arg) {
649*0ca81413SKerry Stevens   int ierr,iVal;
65051dcc849SKerry Stevens   int* pId = (int*)arg;
65151dcc849SKerry Stevens   int ThreadId = *pId;
652*0ca81413SKerry Stevens   PetscErrorCode iterr;
65351dcc849SKerry Stevens 
65451dcc849SKerry Stevens   ierr = pthread_mutex_lock(&job.mutex);
65551dcc849SKerry Stevens   job.iNumReadyThreads++;
65651dcc849SKerry Stevens   if(job.iNumReadyThreads==PetscMaxThreads) {
65751dcc849SKerry Stevens     ierr = pthread_cond_signal(&main_cond);
65851dcc849SKerry Stevens   }
65951dcc849SKerry Stevens   //the while loop needs to have an exit
66051dcc849SKerry Stevens   //the 'main' thread can terminate all the threads by performing a broacast
66151dcc849SKerry Stevens   //and calling FuncFinish
66251dcc849SKerry Stevens   while(PetscThreadGo) {
66351dcc849SKerry Stevens     //need to check the condition to ensure we don't have to wait
66451dcc849SKerry Stevens     //waiting when you don't have to causes problems
66551dcc849SKerry Stevens     //also need to wait if another thread sneaks in and messes with the predicate
66651dcc849SKerry Stevens     while(job.startJob==PETSC_FALSE&&job.iNumJobThreads==0) {
66751dcc849SKerry Stevens       //upon entry, automically releases the lock and blocks
66851dcc849SKerry Stevens       //upon return, has the lock
66951dcc849SKerry Stevens       ierr = pthread_cond_wait(&job.cond,&job.mutex);
67051dcc849SKerry Stevens     }
67151dcc849SKerry Stevens     job.startJob = PETSC_FALSE;
67251dcc849SKerry Stevens     job.iNumJobThreads--;
67351dcc849SKerry Stevens     job.iNumReadyThreads--;
674*0ca81413SKerry Stevens     iVal = PetscMaxThreads-job.iNumReadyThreads-1;
675*0ca81413SKerry Stevens     pthread_mutex_unlock(&job.mutex);
67651dcc849SKerry Stevens     if(job.pdata==NULL) {
677*0ca81413SKerry Stevens       iterr = (PetscErrorCode)(long int)job.pfunc(job.pdata);
67851dcc849SKerry Stevens     }
67951dcc849SKerry Stevens     else {
680*0ca81413SKerry Stevens       iterr = (PetscErrorCode)(long int)job.pfunc(job.pdata[iVal]);
68151dcc849SKerry Stevens     }
682*0ca81413SKerry Stevens     if(iterr!=0) {
683*0ca81413SKerry Stevens       ithreaderr = 1;
684*0ca81413SKerry Stevens     }
685*0ca81413SKerry Stevens     //the barrier is necessary BECAUSE: look at job.iNumReadyThreads
686*0ca81413SKerry Stevens     //what happens if a thread finishes before they all start? BAD!
687*0ca81413SKerry Stevens     //what happens if a thread finishes before any else start? BAD!
68851dcc849SKerry Stevens     pthread_barrier_wait(job.pbarr); //ensures all threads are finished
68951dcc849SKerry Stevens     //reset job
69051dcc849SKerry Stevens     if(PetscThreadGo) {
69151dcc849SKerry Stevens       pthread_mutex_lock(&job.mutex);
69251dcc849SKerry Stevens       job.iNumReadyThreads++;
69351dcc849SKerry Stevens       if(job.iNumReadyThreads==PetscMaxThreads) {
694*0ca81413SKerry Stevens 	//signal the 'main' thread that the job is done! (only done once)
69551dcc849SKerry Stevens 	ierr = pthread_cond_signal(&main_cond);
69651dcc849SKerry Stevens       }
69751dcc849SKerry Stevens     }
69851dcc849SKerry Stevens   }
69951dcc849SKerry Stevens   return NULL;
70051dcc849SKerry Stevens }
70151dcc849SKerry Stevens 
702f09cb4aaSKerry Stevens #undef __FUNCT__
703f09cb4aaSKerry Stevens #define __FUNCT__ "PetscThreadInitialize"
70451dcc849SKerry Stevens void* PetscThreadInitialize(PetscInt N) {
70551dcc849SKerry Stevens   PetscInt i;
70651dcc849SKerry Stevens   int status;
707*0ca81413SKerry Stevens 
708*0ca81413SKerry Stevens   if(PetscUseThreadPool) {
709f09cb4aaSKerry Stevens     pVal = (int*)malloc(N*sizeof(int));
71051dcc849SKerry Stevens     //allocate memory in the heap for the thread structure
71151dcc849SKerry Stevens     PetscThreadPoint = (pthread_t*)malloc(N*sizeof(pthread_t));
71251dcc849SKerry Stevens     BarrPoint = (pthread_barrier_t*)malloc((N+1)*sizeof(pthread_barrier_t)); //BarrPoint[0] makes no sense, don't use it!
713f09cb4aaSKerry Stevens     job.pdata = (void**)malloc(N*sizeof(void*));
71451dcc849SKerry Stevens     for(i=0; i<N; i++) {
715f09cb4aaSKerry Stevens       pVal[i] = i;
716f09cb4aaSKerry Stevens       status = pthread_create(&PetscThreadPoint[i],NULL,PetscThreadFunc,&pVal[i]);
71751dcc849SKerry Stevens       //error check to ensure proper thread creation
71851dcc849SKerry Stevens       status = pthread_barrier_init(&BarrPoint[i+1],NULL,i+1);
71951dcc849SKerry Stevens       //error check
72051dcc849SKerry Stevens     }
721*0ca81413SKerry Stevens   }
722*0ca81413SKerry Stevens   else {
723*0ca81413SKerry Stevens   }
72451dcc849SKerry Stevens   return NULL;
72551dcc849SKerry Stevens }
72651dcc849SKerry Stevens 
727f09cb4aaSKerry Stevens 
728f09cb4aaSKerry Stevens #undef __FUNCT__
729f09cb4aaSKerry Stevens #define __FUNCT__ "PetscThreadFinalize"
73051dcc849SKerry Stevens PetscErrorCode PetscThreadFinalize() {
73151dcc849SKerry Stevens   int i,ierr;
73251dcc849SKerry Stevens   void* jstatus;
73351dcc849SKerry Stevens 
73451dcc849SKerry Stevens   PetscFunctionBegin;
735*0ca81413SKerry Stevens 
736*0ca81413SKerry Stevens   if(PetscUseThreadPool) {
737*0ca81413SKerry Stevens     MainJob(FuncFinish,NULL,PetscMaxThreads);  //set up job and broadcast work
73851dcc849SKerry Stevens     //join the threads
73951dcc849SKerry Stevens     for(i=0; i<PetscMaxThreads; i++) {
74051dcc849SKerry Stevens       ierr = pthread_join(PetscThreadPoint[i],&jstatus);
74151dcc849SKerry Stevens       //do error checking
74251dcc849SKerry Stevens     }
74351dcc849SKerry Stevens     free(BarrPoint);
74451dcc849SKerry Stevens     free(PetscThreadPoint);
745*0ca81413SKerry Stevens   }
746*0ca81413SKerry Stevens   else {
747*0ca81413SKerry Stevens   }
74851dcc849SKerry Stevens   PetscFunctionReturn(0);
74951dcc849SKerry Stevens }
75051dcc849SKerry Stevens 
751f09cb4aaSKerry Stevens #undef __FUNCT__
752f09cb4aaSKerry Stevens #define __FUNCT__ "MainWait"
75351dcc849SKerry Stevens void MainWait() {
75451dcc849SKerry Stevens   int ierr;
75551dcc849SKerry Stevens   ierr = pthread_mutex_lock(&job.mutex);
75651dcc849SKerry Stevens   while(job.iNumReadyThreads<PetscMaxThreads||job.startJob==PETSC_TRUE) {
75751dcc849SKerry Stevens     ierr = pthread_cond_wait(&main_cond,&job.mutex);
75851dcc849SKerry Stevens   }
759f09cb4aaSKerry Stevens   ierr = pthread_mutex_unlock(&job.mutex);
76051dcc849SKerry Stevens }
76151dcc849SKerry Stevens 
762f09cb4aaSKerry Stevens #undef __FUNCT__
763f09cb4aaSKerry Stevens #define __FUNCT__ "MainJob"
764*0ca81413SKerry Stevens PetscErrorCode MainJob(void* (*pFunc)(void*),void** data,PetscInt n) {
76551dcc849SKerry Stevens   int ierr;
766*0ca81413SKerry Stevens   PetscErrorCode ijoberr = 0;
767*0ca81413SKerry Stevens   if(PetscUseThreadPool) {
768*0ca81413SKerry Stevens     MainWait();
769f09cb4aaSKerry Stevens     ierr = pthread_mutex_lock(&job.mutex);
77051dcc849SKerry Stevens     job.pfunc = pFunc;
77151dcc849SKerry Stevens     job.pdata = data;
772*0ca81413SKerry Stevens     job.pbarr = &BarrPoint[n];
77351dcc849SKerry Stevens     job.iNumJobThreads = n;
77451dcc849SKerry Stevens     job.startJob = PETSC_TRUE;
77551dcc849SKerry Stevens     ierr = pthread_cond_broadcast(&job.cond);
77651dcc849SKerry Stevens     ierr = pthread_mutex_unlock(&job.mutex);
777*0ca81413SKerry Stevens     if(pFunc!=FuncFinish) {
778*0ca81413SKerry Stevens       MainWait(); //why wait after? guarantees that job gets done
779*0ca81413SKerry Stevens     }
780*0ca81413SKerry Stevens   }
781*0ca81413SKerry Stevens   else {
782*0ca81413SKerry Stevens     pthread_t* apThread = (pthread_t*)malloc(n*sizeof(pthread_t));
783*0ca81413SKerry Stevens     PetscThreadRun(MPI_COMM_WORLD,pFunc,n,apThread,data);
784*0ca81413SKerry Stevens     PetscThreadStop(MPI_COMM_WORLD,n,apThread); //ensures that all threads are finished with the job
785*0ca81413SKerry Stevens     free(apThread);
786*0ca81413SKerry Stevens   }
787*0ca81413SKerry Stevens   if(ithreaderr) {
788*0ca81413SKerry Stevens     ijoberr = ithreaderr;
789*0ca81413SKerry Stevens   }
790*0ca81413SKerry Stevens   return ijoberr;
79151dcc849SKerry Stevens }
79251dcc849SKerry Stevens 
79351dcc849SKerry Stevens void* FuncFinish(void* arg) {
79451dcc849SKerry Stevens   PetscThreadGo = PETSC_FALSE;
795*0ca81413SKerry Stevens   return(0);
79651dcc849SKerry Stevens }
797