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