1e5c89e4eSSatish Balay /* 2e5c89e4eSSatish Balay 3e5c89e4eSSatish Balay This file defines part of the initialization of PETSc 4e5c89e4eSSatish Balay 5540e20f2SPierre Jolivet This file uses regular malloc and free because it cannot be known 6e5c89e4eSSatish Balay what malloc is being used until it has already processed the input. 7e5c89e4eSSatish Balay */ 8ef386f4bSSatish Balay 9ef386f4bSSatish Balay #include <petscsys.h> /*I "petscsys.h" I*/ 10f67a399dSBarry Smith #include <petsc/private/petscimpl.h> 11022afb99SBarry Smith #include <petscvalgrind.h> 12665c2dedSJed Brown #include <petscviewer.h> 13fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 14fdc842d1SBarry Smith PETSC_INTERN PetscErrorCode PetscLogInitialize(void); 15fdc842d1SBarry Smith #endif 16ef386f4bSSatish Balay 17ba61063dSBarry Smith #if defined(PETSC_HAVE_SYS_SYSINFO_H) 1851d315f7SKerry Stevens #include <sys/sysinfo.h> 19ba61063dSBarry Smith #endif 20121deb67SSatish Balay #if defined(PETSC_HAVE_UNISTD_H) 2151d315f7SKerry Stevens #include <unistd.h> 22121deb67SSatish Balay #endif 2305035670SJunchao Zhang 24d9b72601SDominic Meiser #if defined(PETSC_HAVE_CUDA) 25d9b72601SDominic Meiser #include <cuda_runtime.h> 267fd2f626SJose E. Roman #include <petsccublas.h> 2705035670SJunchao Zhang #endif 2805035670SJunchao Zhang 2905035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 3005035670SJunchao Zhang #include <hip/hip_runtime.h> 3105035670SJunchao Zhang #endif 3205035670SJunchao Zhang 3305035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 34c2a741eeSJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 35c2a741eeSJunchao Zhang #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */ 36c2a741eeSJunchao Zhang #endif 37d9b72601SDominic Meiser #endif 38555d055bSBarry Smith 39f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL) 40f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit(); 41f0a7718cSKarl Rupp #endif 42f0a7718cSKarl Rupp 4305035670SJunchao Zhang 44e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/ 45e5c89e4eSSatish Balay /* 46e5c89e4eSSatish Balay Indicates if PETSc started up MPI, or it was 47e5c89e4eSSatish Balay already started before PETSc was initialized. 48e5c89e4eSSatish Balay */ 490cbf60d0SJose E. Roman PetscBool PetscBeganMPI = PETSC_FALSE; 508ad20175SVaclav Hapla PetscBool PetscErrorHandlingInitialized = PETSC_FALSE; 510cbf60d0SJose E. Roman PetscBool PetscInitializeCalled = PETSC_FALSE; 520cbf60d0SJose E. Roman PetscBool PetscFinalizeCalled = PETSC_FALSE; 53d6f2c3cbSBarry Smith 547087cfbeSBarry Smith PetscMPIInt PetscGlobalRank = -1; 557087cfbeSBarry Smith PetscMPIInt PetscGlobalSize = -1; 56ba61063dSBarry Smith 57c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 58c2b86a48SJunchao Zhang PetscBool PetscBeganKokkos = PETSC_FALSE; 59c2b86a48SJunchao Zhang #endif 60c2b86a48SJunchao Zhang 61c2a741eeSJunchao Zhang PetscBool use_gpu_aware_mpi = PETSC_TRUE; 62928a6601SJunchao Zhang PetscBool PetscCreatedGpuObjects = PETSC_FALSE; 63c2a741eeSJunchao Zhang 6450f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 65e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE) 66e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */ 67e5c89e4eSSatish Balay #endif 682c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 69500d8756SSatish Balay MPI_Datatype MPIU_C_DOUBLE_COMPLEX; 70500d8756SSatish Balay MPI_Datatype MPIU_C_COMPLEX; 712c876bd9SBarry Smith #endif 728619c96cSJed Brown 738619c96cSJed Brown /*MC 748619c96cSJed Brown PETSC_i - the imaginary number i 758619c96cSJed Brown 768619c96cSJed Brown Synopsis: 778619c96cSJed Brown #include <petscsys.h> 788619c96cSJed Brown PetscComplex PETSC_i; 798619c96cSJed Brown 808619c96cSJed Brown Level: beginner 818619c96cSJed Brown 828619c96cSJed Brown Note: 838cd53115SBarry Smith Complex numbers are automatically available if PETSc located a working complex implementation 848619c96cSJed Brown 858619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 868619c96cSJed Brown M*/ 8750f81f78SJed Brown PetscComplex PETSC_i; 88*7a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0; 89*7a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */ 90ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 91c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0; 92570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 93570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0; 94c90a1750SBarry Smith #endif 957087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0; 960354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES) 977087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0; 9844041f26SJed Brown #endif 998ad47952SJed Brown MPI_Datatype MPIU_BOOL; 1008ad47952SJed Brown MPI_Datatype MPIU_ENUM; 1017cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR; 102e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T; 10375567043SBarry Smith 104e5c89e4eSSatish Balay /* 105e5c89e4eSSatish Balay Function that is called to display all error messages 106e5c89e4eSSatish Balay */ 1077087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 1087087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 1097087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 110bab1f7e6SVictor Minden /* 1114cf1874eSKarl Rupp This is needed to turn on/off GPU synchronization 1128b5db460SBarry Smith */ 1134cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 114bab1f7e6SVictor Minden 115e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 116e5c89e4eSSatish Balay /* 117e5c89e4eSSatish Balay Optional file where all PETSc output from various prints is saved 118e5c89e4eSSatish Balay */ 11995c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1200298fd71SBarry Smith FILE *petsc_history = NULL; 121e5c89e4eSSatish Balay 1227087cfbeSBarry Smith PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 123e5c89e4eSSatish Balay { 124e5c89e4eSSatish Balay PetscErrorCode ierr; 125e5c89e4eSSatish Balay PetscMPIInt rank,size; 126e5c89e4eSSatish Balay char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 127e5c89e4eSSatish Balay char version[256]; 128e5c89e4eSSatish Balay 129e5c89e4eSSatish Balay PetscFunctionBegin; 130ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 131e5c89e4eSSatish Balay if (!rank) { 132e5c89e4eSSatish Balay char arch[10]; 133f56c2debSBarry Smith int err; 134f56c2debSBarry Smith 135e5c89e4eSSatish Balay ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 136e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 137a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 138ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 139e5c89e4eSSatish Balay if (filename) { 140e5c89e4eSSatish Balay ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 141e5c89e4eSSatish Balay } else { 142589a23caSBarry Smith ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr); 143589a23caSBarry Smith ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr); 144e5c89e4eSSatish Balay ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 145e5c89e4eSSatish Balay } 146e5c89e4eSSatish Balay 147a297a907SKarl Rupp *fd = fopen(fname,"a"); 148a297a907SKarl Rupp if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 149a297a907SKarl Rupp 150c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 151e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 152589a23caSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 153e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 154c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 155a297a907SKarl Rupp 156f56c2debSBarry Smith err = fflush(*fd); 157e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 158e5c89e4eSSatish Balay } 159e5c89e4eSSatish Balay PetscFunctionReturn(0); 160e5c89e4eSSatish Balay } 161e5c89e4eSSatish Balay 16295c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 163e5c89e4eSSatish Balay { 164e5c89e4eSSatish Balay PetscErrorCode ierr; 165e5c89e4eSSatish Balay PetscMPIInt rank; 166e5c89e4eSSatish Balay char date[64]; 167f56c2debSBarry Smith int err; 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay PetscFunctionBegin; 170ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 171e5c89e4eSSatish Balay if (!rank) { 172e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 173c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 174e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 175c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 176f56c2debSBarry Smith err = fflush(*fd); 177e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 178f56c2debSBarry Smith err = fclose(*fd); 179e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 180e5c89e4eSSatish Balay } 181e5c89e4eSSatish Balay PetscFunctionReturn(0); 182e5c89e4eSSatish Balay } 183e5c89e4eSSatish Balay 184e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 185e5c89e4eSSatish Balay 186e5c89e4eSSatish Balay /* 187e5c89e4eSSatish Balay This is ugly and probably belongs somewhere else, but I want to 188e5c89e4eSSatish Balay be able to put a true MPI abort error handler with command line args. 189e5c89e4eSSatish Balay 190e5c89e4eSSatish Balay This is so MPI errors in the debugger will leave all the stack 1913c311c98SBarry Smith frames. The default MP_Abort() cleans up and exits thus providing no useful information 1923c311c98SBarry Smith in the debugger hence we call abort() instead of MPI_Abort(). 193e5c89e4eSSatish Balay */ 194e5c89e4eSSatish Balay 19533c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 196e5c89e4eSSatish Balay { 197e5c89e4eSSatish Balay PetscFunctionBegin; 1983c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 199e5c89e4eSSatish Balay abort(); 200e5c89e4eSSatish Balay } 201e5c89e4eSSatish Balay 20233c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 203e5c89e4eSSatish Balay { 204e5c89e4eSSatish Balay PetscErrorCode ierr; 205e5c89e4eSSatish Balay 206e5c89e4eSSatish Balay PetscFunctionBegin; 2073c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 208e5c89e4eSSatish Balay ierr = PetscAttachDebugger(); 20941e02c4dSJunchao Zhang if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 210e5c89e4eSSatish Balay } 211e5c89e4eSSatish Balay 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; 23695c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 23795c0884eSLisandro Dalcin PETSC_INTERN PetscBool petscsetmallocvisited; 238e5c89e4eSSatish Balay static char emacsmachinename[256]; 239e5c89e4eSSatish Balay 24002c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL; 24102c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = NULL; 242e5c89e4eSSatish Balay 243e5c89e4eSSatish Balay /*@C 244e5c89e4eSSatish Balay PetscSetHelpVersionFunctions - Sets functions that print help and version information 245e5c89e4eSSatish Balay before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 246e5c89e4eSSatish Balay This routine enables a "higher-level" package that uses PETSc to print its messages first. 247e5c89e4eSSatish Balay 248e5c89e4eSSatish Balay Input Parameter: 2490298fd71SBarry Smith + help - the help function (may be NULL) 2500298fd71SBarry Smith - version - the version function (may be NULL) 251e5c89e4eSSatish Balay 252e5c89e4eSSatish Balay Level: developer 253e5c89e4eSSatish Balay 254e5c89e4eSSatish Balay @*/ 2557087cfbeSBarry Smith PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 256e5c89e4eSSatish Balay { 257e5c89e4eSSatish Balay PetscFunctionBegin; 258e5c89e4eSSatish Balay PetscExternalHelpFunction = help; 259e5c89e4eSSatish Balay PetscExternalVersionFunction = version; 260e5c89e4eSSatish Balay PetscFunctionReturn(0); 261e5c89e4eSSatish Balay } 262e5c89e4eSSatish Balay 26305df10baSBarry Smith #if defined(PETSC_USE_LOG) 26495c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 26505df10baSBarry Smith #endif 26605df10baSBarry Smith 26705035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP. 26805035670SJunchao Zhang Use the following macros to define CUDA/HIP initialization related vars/routines. 26905035670SJunchao Zhang */ 27005035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 27105035670SJunchao Zhang typedef cudaError_t cupmError_t; 27205035670SJunchao Zhang typedef struct cudaDeviceProp cupmDeviceProp; 27305035670SJunchao Zhang #define cupmGetDeviceCount(x) cudaGetDeviceCount(x) 27405035670SJunchao Zhang #define cupmGetDevice(x) cudaGetDevice(x) 27505035670SJunchao Zhang #define cupmSetDevice(x) cudaSetDevice(x) 27605035670SJunchao Zhang #define cupmSetDeviceFlags(x) cudaSetDeviceFlags(x) 27705035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) cudaGetDeviceProperties(x,y) 27805035670SJunchao Zhang #define cupmGetLastError() cudaGetLastError() 27905035670SJunchao Zhang #define cupmDeviceMapHost cudaDeviceMapHost 28005035670SJunchao Zhang #define cupmSuccess cudaSuccess 281e57d7714SBarry Smith #define cupmErrorMemoryAllocation cudaErrorMemoryAllocation 282e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources cudaErrorLaunchOutOfResources 28305035670SJunchao Zhang #define cupmErrorSetOnActiveProcess cudaErrorSetOnActiveProcess 28405035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRCUDA(x) 28505035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() PetscCUBLASInitializeHandle() 28605035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() PetscCUSOLVERDnInitializeHandle() 28705035670SJunchao Zhang #define PetscCUPMInitialize PetscCUDAInitialize 28805035670SJunchao Zhang #define PetscCUPMInitialized PetscCUDAInitialized 28905035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscCUDAInitializeCheck 29005035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscCUDAInitializeAndView 29105035670SJunchao Zhang #define PetscCUPMSynchronize PetscCUDASynchronize 29205035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseCUDA 29305035670SJunchao Zhang #define cupmOptionsStr "CUDA options" 2944dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-cuda_device" 29505035670SJunchao Zhang #define cupmViewStr "-cuda_view" 29605035670SJunchao Zhang #define cupmSynchronizeStr "-cuda_synchronize" 29705035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscCUDAInitialize" 29805035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckCUDA 29905035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPICUDAAwarenessCheck 30005035670SJunchao Zhang #include "cupminit.inc" 30105035670SJunchao Zhang #endif 30205035670SJunchao Zhang 30305035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 30405035670SJunchao Zhang typedef hipError_t cupmError_t; 30505035670SJunchao Zhang typedef hipDeviceProp_t cupmDeviceProp; 30605035670SJunchao Zhang #define cupmGetDeviceCount(x) hipGetDeviceCount(x) 30705035670SJunchao Zhang #define cupmGetDevice(x) hipGetDevice(x) 30805035670SJunchao Zhang #define cupmSetDevice(x) hipSetDevice(x) 30905035670SJunchao Zhang #define cupmSetDeviceFlags(x) hipSetDeviceFlags(x) 31005035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) hipGetDeviceProperties(x,y) 31105035670SJunchao Zhang #define cupmGetLastError() hipGetLastError() 31205035670SJunchao Zhang #define cupmDeviceMapHost hipDeviceMapHost 31305035670SJunchao Zhang #define cupmSuccess hipSuccess 314e57d7714SBarry Smith #define cupmErrorMemoryAllocation hipErrorMemoryAllocation 315e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources hipErrorLaunchOutOfResources 31605035670SJunchao Zhang #define cupmErrorSetOnActiveProcess hipErrorSetOnActiveProcess 31705035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB) 31805035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() 0 31905035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() 0 32005035670SJunchao Zhang #define PetscCUPMInitialize PetscHIPInitialize 32105035670SJunchao Zhang #define PetscCUPMInitialized PetscHIPInitialized 32205035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscHIPInitializeCheck 32305035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscHIPInitializeAndView 32405035670SJunchao Zhang #define PetscCUPMSynchronize PetscHIPSynchronize 32505035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseHIP 32605035670SJunchao Zhang #define cupmOptionsStr "HIP options" 3274dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-hip_device" 32805035670SJunchao Zhang #define cupmViewStr "-hip_view" 32905035670SJunchao Zhang #define cupmSynchronizeStr "-hip_synchronize" 33005035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscHIPInitialize" 33105035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckHIP 33205035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPIHIPAwarenessCheck 33305035670SJunchao Zhang #include "cupminit.inc" 33405035670SJunchao Zhang #endif 33505035670SJunchao Zhang 33657171095SVaclav Hapla PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(const char help[]) 337e5c89e4eSSatish Balay { 338e5ed2c37SJose E. Roman char string[64]; 339e5c89e4eSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 34005035670SJunchao Zhang PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView; 341e5c89e4eSSatish Balay PetscErrorCode ierr; 34267584ceeSBarry Smith PetscReal si; 34328559dc8SJed Brown PetscInt intensity; 344e5c89e4eSSatish Balay int i; 345e5c89e4eSSatish Balay PetscMPIInt rank; 346d314f959SVaclav Hapla char version[256]; 3472479a3a6SBarry Smith #if defined(PETSC_USE_LOG) 348e5ed2c37SJose E. Roman char mname[PETSC_MAX_PATH_LEN]; 3492479a3a6SBarry Smith PetscViewerFormat format; 35067584ceeSBarry Smith PetscBool flg4 = PETSC_FALSE; 35167584ceeSBarry Smith #endif 3527381773fSBarry Smith 353e5c89e4eSSatish Balay PetscFunctionBegin; 354ffc4695bSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 355e5c89e4eSSatish Balay 35667584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 35792f119d6SBarry Smith if (!(PETSC_RUNNING_ON_VALGRIND)) { 358e5c89e4eSSatish Balay /* 359e5c89e4eSSatish Balay Setup the memory management; support for tracing malloc() usage 360e5c89e4eSSatish Balay */ 361244bdbccSBarry Smith PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 36292f119d6SBarry Smith 36376bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 36492f119d6SBarry Smith mdebug = PETSC_TRUE; 36592f119d6SBarry Smith initializenan = PETSC_TRUE; 36692f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 36776bd3646SJed Brown } else { 36892f119d6SBarry Smith /* don't warn about unused option */ 36992f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 37092f119d6SBarry Smith flg1 = PETSC_FALSE; 37176bd3646SJed Brown } 37279dccf82SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 37392f119d6SBarry Smith if (flg1 || flg2) { 37492f119d6SBarry Smith mdebug = PETSC_TRUE; 37592f119d6SBarry Smith eachcall = PETSC_TRUE; 37692f119d6SBarry Smith initializenan = PETSC_TRUE; 37779dccf82SBarry Smith } else if (flg3 && !flg2) { 37879dccf82SBarry Smith mdebug = PETSC_FALSE; 37979dccf82SBarry Smith eachcall = PETSC_FALSE; 38079dccf82SBarry Smith initializenan = PETSC_FALSE; 381e5c89e4eSSatish Balay } 38292f119d6SBarry Smith 383608c71bfSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr); 384608c71bfSMatthew G. Knepley if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);} 385608c71bfSMatthew G. Knepley 38692f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 38792f119d6SBarry Smith if (mlog) { 38892f119d6SBarry Smith mdebug = PETSC_TRUE; 38992f119d6SBarry Smith } 39079dccf82SBarry Smith /* the next line is deprecated */ 39192f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 39292f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 39392f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 39492f119d6SBarry Smith if (mdebug) { 39592f119d6SBarry Smith ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 39692f119d6SBarry Smith } 39792f119d6SBarry Smith if (mlog) { 39892f119d6SBarry Smith PetscReal logthreshold = 0; 39992f119d6SBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 40092f119d6SBarry Smith ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 40192f119d6SBarry Smith } 4028b254c29SBarry Smith #if defined(PETSC_USE_LOG) 4038b254c29SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr); 4048b254c29SBarry Smith #endif 40592f119d6SBarry Smith } 40692f119d6SBarry Smith 407ba282f50SJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 408ba282f50SJed Brown if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 40990d69ab7SBarry Smith flg1 = PETSC_FALSE; 4102f21b5c6SHong Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 411cf6f3811SHong Zhang /* ignore this option if malloc is already set */ 412cf6f3811SHong Zhang if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 413e5c89e4eSSatish Balay 41490d69ab7SBarry Smith flg1 = PETSC_FALSE; 415c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 4167783f70dSSatish Balay if (!flg1) { 41790d69ab7SBarry Smith flg1 = PETSC_FALSE; 418c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 4197783f70dSSatish Balay } 420e5c89e4eSSatish Balay if (flg1) { 421e5c89e4eSSatish Balay ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 422e5c89e4eSSatish Balay } 42367584ceeSBarry Smith #endif 424e5c89e4eSSatish Balay 425b4427426SBarry Smith #if defined(PETSC_USE_LOG) 426c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 427b4427426SBarry Smith #endif 42805df10baSBarry Smith 429e5c89e4eSSatish Balay /* 430e5c89e4eSSatish Balay Set the display variable for graphics 431e5c89e4eSSatish Balay */ 432e5c89e4eSSatish Balay ierr = PetscSetDisplay();CHKERRQ(ierr); 433e5c89e4eSSatish Balay 43451dcc849SKerry Stevens /* 43557171095SVaclav Hapla Print main application help message 43657171095SVaclav Hapla */ 43757171095SVaclav Hapla ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr); 43857171095SVaclav Hapla if (help && hasHelp) { 43957171095SVaclav Hapla ierr = PetscPrintf(comm,help);CHKERRQ(ierr); 44057171095SVaclav Hapla ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr); 44157171095SVaclav Hapla } 44257171095SVaclav Hapla 44357171095SVaclav Hapla /* 444e5c89e4eSSatish Balay Print the PETSc version information 445e5c89e4eSSatish Balay */ 446d314f959SVaclav Hapla ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr); 447d314f959SVaclav Hapla if (flg1 || hasHelp) { 448e5c89e4eSSatish Balay /* 449e5c89e4eSSatish Balay Print "higher-level" package version message 450e5c89e4eSSatish Balay */ 451e5c89e4eSSatish Balay if (PetscExternalVersionFunction) { 452e5c89e4eSSatish Balay ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 453e5c89e4eSSatish Balay } 454e5c89e4eSSatish Balay 455a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 456e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 457e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 458e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 45984e42920SBarry Smith ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 460e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 461e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 462c0bb3764SVaclav Hapla ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr); 4637ca660e7SBarry Smith } 4647ca660e7SBarry Smith 46594941ca7SBarry Smith /* 46694941ca7SBarry Smith Print "higher-level" package help message 46794941ca7SBarry Smith */ 46857171095SVaclav Hapla if (hasHelp) { 469d314f959SVaclav Hapla PetscBool hasHelpIntro; 470d314f959SVaclav Hapla 47194941ca7SBarry Smith if (PetscExternalHelpFunction) { 47294941ca7SBarry Smith ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 47394941ca7SBarry Smith } 474d314f959SVaclav Hapla ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr); 475d314f959SVaclav Hapla if (hasHelpIntro) { 476bdb346e9SBarry Smith ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 477008a6e76SBarry Smith ierr = PetscFreeMPIResources();CHKERRQ(ierr); 478ffc4695bSBarry Smith ierr = MPI_Finalize();CHKERRMPI(ierr); 4797ca660e7SBarry Smith exit(0); 4807ca660e7SBarry Smith } 481e5c89e4eSSatish Balay } 482e5c89e4eSSatish Balay 483e5c89e4eSSatish Balay /* 484e5c89e4eSSatish Balay Setup the error handling 485e5c89e4eSSatish Balay */ 48690d69ab7SBarry Smith flg1 = PETSC_FALSE; 487c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 488b59baad1SJed Brown if (flg1) { 489ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr); 49002c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 491b59baad1SJed Brown } 49290d69ab7SBarry Smith flg1 = PETSC_FALSE; 493c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 49402c9f0b5SLisandro Dalcin if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);} 49590d69ab7SBarry Smith flg1 = PETSC_FALSE; 496c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 497e5c89e4eSSatish Balay if (flg1) { 498ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr); 499e5c89e4eSSatish Balay } 50090d69ab7SBarry Smith flg1 = PETSC_FALSE; 501c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 5028d359177SBarry Smith if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 503e5c89e4eSSatish Balay 504e5c89e4eSSatish Balay /* 505e5c89e4eSSatish Balay Setup debugger information 506e5c89e4eSSatish Balay */ 507e5c89e4eSSatish Balay ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 508589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 509e5c89e4eSSatish Balay if (flg1) { 510e5c89e4eSSatish Balay MPI_Errhandler err_handler; 511e5c89e4eSSatish Balay 512e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 513ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr); 514ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 51502c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr); 516e5c89e4eSSatish Balay } 517589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr); 5185e96ac45SJed Brown if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 519589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 520589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr); 521e5c89e4eSSatish Balay if (flg1 || flg2) { 522e5c89e4eSSatish Balay PetscMPIInt size; 523bf4d2887SBarry Smith PetscInt lsize,*ranks; 524e5c89e4eSSatish Balay MPI_Errhandler err_handler; 525e5c89e4eSSatish Balay /* 526e5c89e4eSSatish Balay we have to make sure that all processors have opened 527e5c89e4eSSatish Balay connections to all other processors, otherwise once the 528e5c89e4eSSatish Balay debugger has stated it is likely to receive a SIGUSR1 529e5c89e4eSSatish Balay and kill the program. 530e5c89e4eSSatish Balay */ 531ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 532e5c89e4eSSatish Balay if (size > 2) { 533533163c2SBarry Smith PetscMPIInt dummy = 0; 534e5c89e4eSSatish Balay MPI_Status status; 535e5c89e4eSSatish Balay for (i=0; i<size; i++) { 536e5c89e4eSSatish Balay if (rank != i) { 537ffc4695bSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr); 538e5c89e4eSSatish Balay } 539e5c89e4eSSatish Balay } 540e5c89e4eSSatish Balay for (i=0; i<size; i++) { 541e5c89e4eSSatish Balay if (rank != i) { 542ffc4695bSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr); 543e5c89e4eSSatish Balay } 544e5c89e4eSSatish Balay } 545e5c89e4eSSatish Balay } 546e5c89e4eSSatish Balay /* check if this processor node should be in debugger */ 547bf4d2887SBarry Smith ierr = PetscMalloc1(size,&ranks);CHKERRQ(ierr); 548e5c89e4eSSatish Balay lsize = size; 549bf4d2887SBarry Smith /* Deprecated in 3.14 */ 550bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr); 551bf4d2887SBarry Smith if (flag) { 552bf4d2887SBarry Smith const char * const quietopt="-options_suppress_deprecated_warnings"; 553bf4d2887SBarry Smith char msg[4096]; 554bf4d2887SBarry Smith PetscBool quiet = PETSC_FALSE; 555bf4d2887SBarry Smith 556bf4d2887SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 557bf4d2887SBarry Smith if (!quiet) { 558bf4d2887SBarry Smith ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 559bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr); 560bf4d2887SBarry Smith ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 561bf4d2887SBarry Smith ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr); 562bf4d2887SBarry Smith ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 563bf4d2887SBarry Smith ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 564bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr); 565bf4d2887SBarry Smith ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 566bf4d2887SBarry Smith ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 567bf4d2887SBarry Smith ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 568bf4d2887SBarry Smith ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 569bf4d2887SBarry Smith ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 570bf4d2887SBarry Smith } 571bf4d2887SBarry Smith } else { 572bf4d2887SBarry Smith lsize = size; 573bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr); 574bf4d2887SBarry Smith } 575e5c89e4eSSatish Balay if (flag) { 576e5c89e4eSSatish Balay for (i=0; i<lsize; i++) { 577bf4d2887SBarry Smith if (ranks[i] == rank) { flag = PETSC_FALSE; break; } 578e5c89e4eSSatish Balay } 579e5c89e4eSSatish Balay } 580e5c89e4eSSatish Balay if (!flag) { 581e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 58202c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 583e5c89e4eSSatish Balay if (flg1) { 584e5c89e4eSSatish Balay ierr = PetscAttachDebugger();CHKERRQ(ierr); 585e5c89e4eSSatish Balay } else { 586e5c89e4eSSatish Balay ierr = PetscStopForDebugger();CHKERRQ(ierr); 587e5c89e4eSSatish Balay } 588ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr); 589ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 5902a2a2941SBarry Smith } else { 5912a2a2941SBarry Smith ierr = PetscWaitOnError();CHKERRQ(ierr); 592e5c89e4eSSatish Balay } 593bf4d2887SBarry Smith ierr = PetscFree(ranks);CHKERRQ(ierr); 594e5c89e4eSSatish Balay } 595e5c89e4eSSatish Balay 596589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr); 597cb9801acSJed Brown if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 598e5c89e4eSSatish Balay 599e5c89e4eSSatish Balay /* 600e5c89e4eSSatish Balay Setup profiling and logging 601e5c89e4eSSatish Balay */ 6026cf91177SBarry Smith #if defined(PETSC_USE_INFO) 6038bb29257SSatish Balay { 604e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr); 605e5c89e4eSSatish Balay } 606865f6aa8SSatish Balay #endif 607aba4c478SBarry Smith ierr = PetscDetermineInitialFPTrap(); 608cc9df77eSBarry Smith flg1 = PETSC_FALSE; 609cc9df77eSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 610cc9df77eSBarry Smith if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 611cc9df77eSBarry Smith ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 612cc9df77eSBarry Smith if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 613865f6aa8SSatish Balay #if defined(PETSC_USE_LOG) 614865f6aa8SSatish Balay mname[0] = 0; 615589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 616865f6aa8SSatish Balay if (flg1) { 617865f6aa8SSatish Balay if (mname[0]) { 618f3dea69dSBarry Smith ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 619865f6aa8SSatish Balay } else { 620706d7a88SBarry Smith ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 621865f6aa8SSatish Balay } 622865f6aa8SSatish Balay } 623217044c2SLisandro Dalcin 624217044c2SLisandro Dalcin ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 625217044c2SLisandro Dalcin 626e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 62790d69ab7SBarry Smith flg1 = PETSC_FALSE; 628c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 629495fc317SBarry Smith if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 630e5c89e4eSSatish Balay #endif 63190d69ab7SBarry Smith flg1 = PETSC_FALSE; 63290d69ab7SBarry Smith flg3 = PETSC_FALSE; 633c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 634c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 635e5c89e4eSSatish Balay if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 636bb1d7374SBarry Smith else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 637e5c89e4eSSatish Balay 638589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 639e5c89e4eSSatish Balay if (flg1) { 640e5c89e4eSSatish Balay char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 641e5c89e4eSSatish Balay FILE *file; 642e5c89e4eSSatish Balay if (mname[0]) { 6432e924ca5SSatish Balay PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 644e5c89e4eSSatish Balay ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 645e5c89e4eSSatish Balay file = fopen(fname,"w"); 646f3dea69dSBarry Smith if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 647a297a907SKarl Rupp } else file = PETSC_STDOUT; 648e5c89e4eSSatish Balay ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 649e5c89e4eSSatish Balay } 650bb1d7374SBarry Smith 65116413a6aSBarry Smith ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 652bb1d7374SBarry Smith if (flg4) { 653bb1d7374SBarry Smith if (format == PETSC_VIEWER_ASCII_XML) { 654bb1d7374SBarry Smith ierr = PetscLogNestedBegin();CHKERRQ(ierr); 655bb1d7374SBarry Smith } else { 656bb1d7374SBarry Smith ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 657bb1d7374SBarry Smith } 658eccbb886SLisandro Dalcin } 659eccbb886SLisandro Dalcin if (flg4 && format == PETSC_VIEWER_ASCII_XML) { 660eccbb886SLisandro Dalcin PetscReal threshold = PetscRealConstant(0.01); 661eccbb886SLisandro Dalcin ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 662eccbb886SLisandro Dalcin if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 663bb1d7374SBarry Smith } 664e5c89e4eSSatish Balay #endif 665e5c89e4eSSatish Balay 666c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 66705035670SJunchao Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr); 6688d4e85a7SStefano Zampini /* 66905035670SJunchao Zhang If collecting logging information, by default, wait for device to complete its operations 6708d4e85a7SStefano Zampini before returning to the CPU in order to get accurate timings of each event 6718d4e85a7SStefano Zampini */ 672cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr); 67305035670SJunchao Zhang if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);} 6748d4e85a7SStefano Zampini 67505035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 67605035670SJunchao Zhang ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr); 67705035670SJunchao Zhang #endif 678cae85d06SJunchao Zhang 67905035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 68005035670SJunchao Zhang ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr); 6814b0a73b2SBarry Smith #endif 6824b0a73b2SBarry Smith 683e5c89e4eSSatish Balay /* 684e5c89e4eSSatish Balay Print basic help message 685e5c89e4eSSatish Balay */ 68657171095SVaclav Hapla if (hasHelp) { 687e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 688d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr); 689d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr); 690d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr); 691301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 692301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 693e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 694e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 695e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 696e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 697e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 698e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 699e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 700bf4d2887SBarry Smith ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr); 701e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 702e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 703e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 7041cda70a7SBarry Smith ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 705e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 706e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 707e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 708e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 709e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 71079dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 71179dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 7124161f2a3SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 71392f119d6SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 71479dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 71526a7e8d4SBarry Smith ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 716e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 717e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 718e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 719e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 720a8c7a070SBarry Smith ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 7210841954dSBarry Smith ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 722e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 723e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 724185ae32fSMatthew G. Knepley ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 725e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 72656071f75SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr); 727e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 728495fc317SBarry Smith ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 729e5c89e4eSSatish Balay #endif 730e94e781bSJacob Faibussowitsch #endif 731e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO) 732fe9b927eSVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr); 733e5c89e4eSSatish Balay #endif 734e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 735c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr); 736c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr); 737e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 738e5c89e4eSSatish Balay } 739e5c89e4eSSatish Balay 74074ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN) 74174ba8654SBarry Smith { 74274ba8654SBarry Smith char machine[128]; 743589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr); 74474ba8654SBarry Smith if (flg1) { 74574ba8654SBarry Smith ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 74674ba8654SBarry Smith } 74774ba8654SBarry Smith } 74874ba8654SBarry Smith #endif 74974ba8654SBarry Smith 750c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 751e5c89e4eSSatish Balay if (flg1) { 752e5c89e4eSSatish Balay ierr = PetscSleep(si);CHKERRQ(ierr); 753e5c89e4eSSatish Balay } 754e5c89e4eSSatish Balay 755fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL) 756c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 757f14045dbSBarry Smith if (!flg3) { 758c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 759f14045dbSBarry Smith } 760c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 761f14045dbSBarry Smith PetscViennaCLSynchronize = flg3; 762fdc842d1SBarry Smith ierr = PetscViennaCLInit();CHKERRQ(ierr); 7634cf1874eSKarl Rupp #endif 76482f73ecaSAlejandro Lamas Daviña 765fdc842d1SBarry Smith /* 766fdc842d1SBarry Smith Creates the logging data structures; this is enabled even if logging is not turned on 767fdc842d1SBarry Smith This is the last thing we do before returning to the user code to prevent having the 768fdc842d1SBarry Smith logging numbers contaminated by any startup time associated with MPI and the GPUs 769fdc842d1SBarry Smith */ 770fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 771fdc842d1SBarry Smith ierr = PetscLogInitialize();CHKERRQ(ierr); 772f0a7718cSKarl Rupp #endif 773f0a7718cSKarl Rupp 774e5c89e4eSSatish Balay PetscFunctionReturn(0); 775e5c89e4eSSatish Balay } 776