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