xref: /petsc/src/sys/objects/init.c (revision 092991ac1244d667ecf45705734b89bd49b3016b)
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>
2623622779SBarry Smith   #include <cuda_runtime_api.h>
2723622779SBarry Smith   #include <cuda_device_runtime_api.h>
287fd2f626SJose E. Roman   #include <petsccublas.h>
2905035670SJunchao Zhang #endif
3005035670SJunchao Zhang 
3105035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
3205035670SJunchao Zhang   #include <hip/hip_runtime.h>
3305035670SJunchao Zhang #endif
3405035670SJunchao Zhang 
3505035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
36c2a741eeSJunchao Zhang   #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
37c2a741eeSJunchao Zhang     #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */
38c2a741eeSJunchao Zhang   #endif
39d9b72601SDominic Meiser #endif
40555d055bSBarry Smith 
41f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL)
42f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit();
43f0a7718cSKarl Rupp #endif
44f0a7718cSKarl Rupp 
45e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/
46e5c89e4eSSatish Balay /*
47e5c89e4eSSatish Balay      Indicates if PETSc started up MPI, or it was
48e5c89e4eSSatish Balay    already started before PETSc was initialized.
49e5c89e4eSSatish Balay */
500cbf60d0SJose E. Roman PetscBool   PetscBeganMPI                 = PETSC_FALSE;
518ad20175SVaclav Hapla PetscBool   PetscErrorHandlingInitialized = PETSC_FALSE;
520cbf60d0SJose E. Roman PetscBool   PetscInitializeCalled         = PETSC_FALSE;
530cbf60d0SJose E. Roman PetscBool   PetscFinalizeCalled           = PETSC_FALSE;
54d6f2c3cbSBarry Smith 
557087cfbeSBarry Smith PetscMPIInt PetscGlobalRank               = -1;
567087cfbeSBarry Smith PetscMPIInt PetscGlobalSize               = -1;
57ba61063dSBarry Smith 
58c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS)
59c2b86a48SJunchao Zhang PetscBool   PetscBeganKokkos              = PETSC_FALSE;
60c2b86a48SJunchao Zhang #endif
61c2b86a48SJunchao Zhang 
6271438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
6371438e86SJunchao Zhang PetscBool   PetscBeganNvshmem             = PETSC_FALSE;
6471438e86SJunchao Zhang PetscBool   PetscNvshmemInitialized       = PETSC_FALSE;
6571438e86SJunchao Zhang #endif
6671438e86SJunchao Zhang 
67c2a741eeSJunchao Zhang PetscBool   use_gpu_aware_mpi             = PETSC_TRUE;
68928a6601SJunchao Zhang PetscBool   PetscCreatedGpuObjects        = PETSC_FALSE;
69c2a741eeSJunchao Zhang 
7050f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX)
71e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
72e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
73e5c89e4eSSatish Balay #endif
748619c96cSJed Brown 
758619c96cSJed Brown /*MC
768619c96cSJed Brown    PETSC_i - the imaginary number i
778619c96cSJed Brown 
788619c96cSJed Brown    Synopsis:
798619c96cSJed Brown    #include <petscsys.h>
808619c96cSJed Brown    PetscComplex PETSC_i;
818619c96cSJed Brown 
828619c96cSJed Brown    Level: beginner
838619c96cSJed Brown 
848619c96cSJed Brown    Note:
858cd53115SBarry Smith    Complex numbers are automatically available if PETSc located a working complex implementation
868619c96cSJed Brown 
878619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex()
888619c96cSJed Brown M*/
8950f81f78SJed Brown PetscComplex PETSC_i;
907a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0;
917a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */
92ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
93c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0;
94570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
95570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0;
96c90a1750SBarry Smith #endif
977087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0;
98*092991acSStefano Zampini MPI_Datatype MPIU_REAL_INT = 0;
99*092991acSStefano Zampini MPI_Datatype MPIU_SCALAR_INT = 0;
1000354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES)
1017087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0;
10244041f26SJed Brown #endif
1038ad47952SJed Brown MPI_Datatype MPIU_BOOL;
1048ad47952SJed Brown MPI_Datatype MPIU_ENUM;
1057cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR;
106e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T;
10775567043SBarry Smith 
108e5c89e4eSSatish Balay /*
109e5c89e4eSSatish Balay        Function that is called to display all error messages
110e5c89e4eSSatish Balay */
1117087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
1127087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
1137087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
114bab1f7e6SVictor Minden /*
1154cf1874eSKarl Rupp   This is needed to turn on/off GPU synchronization
1168b5db460SBarry Smith */
1174cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE;
118bab1f7e6SVictor Minden 
119e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
120e5c89e4eSSatish Balay /*
121e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
122e5c89e4eSSatish Balay */
12395c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
1240298fd71SBarry Smith FILE *petsc_history = NULL;
125e5c89e4eSSatish Balay 
1267087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
127e5c89e4eSSatish Balay {
128e5c89e4eSSatish Balay   PetscErrorCode ierr;
129e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
130e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
131e5c89e4eSSatish Balay   char           version[256];
132e5c89e4eSSatish Balay 
133e5c89e4eSSatish Balay   PetscFunctionBegin;
134ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
135e5c89e4eSSatish Balay   if (!rank) {
136e5c89e4eSSatish Balay     char        arch[10];
137f56c2debSBarry Smith     int         err;
138f56c2debSBarry Smith 
139e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
140e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
141a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
142ffc4695bSBarry Smith     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
143e5c89e4eSSatish Balay     if (filename) {
144e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
145e5c89e4eSSatish Balay     } else {
146589a23caSBarry Smith       ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr);
147589a23caSBarry Smith       ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr);
148e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
149e5c89e4eSSatish Balay     }
150e5c89e4eSSatish Balay 
151a297a907SKarl Rupp     *fd = fopen(fname,"a");
152a297a907SKarl Rupp     if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
153a297a907SKarl Rupp 
154c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
155e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
156589a23caSBarry Smith     ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
157e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
158c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
159a297a907SKarl Rupp 
160f56c2debSBarry Smith     err = fflush(*fd);
161e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
162e5c89e4eSSatish Balay   }
163e5c89e4eSSatish Balay   PetscFunctionReturn(0);
164e5c89e4eSSatish Balay }
165e5c89e4eSSatish Balay 
16695c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd)
167e5c89e4eSSatish Balay {
168e5c89e4eSSatish Balay   PetscErrorCode ierr;
169e5c89e4eSSatish Balay   PetscMPIInt    rank;
170e5c89e4eSSatish Balay   char           date[64];
171f56c2debSBarry Smith   int            err;
172e5c89e4eSSatish Balay 
173e5c89e4eSSatish Balay   PetscFunctionBegin;
174ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
175e5c89e4eSSatish Balay   if (!rank) {
176e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
177c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
178e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
179c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
180f56c2debSBarry Smith     err  = fflush(*fd);
181e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
182f56c2debSBarry Smith     err = fclose(*fd);
183e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
184e5c89e4eSSatish Balay   }
185e5c89e4eSSatish Balay   PetscFunctionReturn(0);
186e5c89e4eSSatish Balay }
187e5c89e4eSSatish Balay 
188e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
189e5c89e4eSSatish Balay 
190e5c89e4eSSatish Balay /*
191e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
192e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
193e5c89e4eSSatish Balay 
194e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1953c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1963c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
197e5c89e4eSSatish Balay */
198e5c89e4eSSatish Balay 
19933c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
200e5c89e4eSSatish Balay {
201e5c89e4eSSatish Balay   PetscFunctionBegin;
2023c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
203e5c89e4eSSatish Balay   abort();
204e5c89e4eSSatish Balay }
205e5c89e4eSSatish Balay 
20633c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
207e5c89e4eSSatish Balay {
208e5c89e4eSSatish Balay   PetscErrorCode ierr;
209e5c89e4eSSatish Balay 
210e5c89e4eSSatish Balay   PetscFunctionBegin;
2113c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
212e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
21341e02c4dSJunchao Zhang   if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */
214e5c89e4eSSatish Balay }
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay /*@C
217e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
218e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
219e5c89e4eSSatish Balay 
220e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
223e5c89e4eSSatish Balay 
224e5c89e4eSSatish Balay    Level: advanced
225e5c89e4eSSatish Balay 
226e5c89e4eSSatish Balay    Note:
227e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
228e5c89e4eSSatish Balay 
22988c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
230e5c89e4eSSatish Balay @*/
2317087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
232e5c89e4eSSatish Balay {
233e5c89e4eSSatish Balay   PetscFunctionBegin;
234e5c89e4eSSatish Balay   PetscFinalize();
235e5c89e4eSSatish Balay   exit(0);
236e5c89e4eSSatish Balay   return 0;
237e5c89e4eSSatish Balay }
238e5c89e4eSSatish Balay 
239ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE;
24095c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void);
24195c0884eSLisandro Dalcin PETSC_INTERN PetscBool      petscsetmallocvisited;
242e5c89e4eSSatish Balay static       char           emacsmachinename[256];
243e5c89e4eSSatish Balay 
24402c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL;
24502c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = NULL;
246e5c89e4eSSatish Balay 
247e5c89e4eSSatish Balay /*@C
248e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
249e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
250e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
251e5c89e4eSSatish Balay 
252e5c89e4eSSatish Balay    Input Parameter:
2530298fd71SBarry Smith +  help - the help function (may be NULL)
2540298fd71SBarry Smith -  version - the version function (may be NULL)
255e5c89e4eSSatish Balay 
256e5c89e4eSSatish Balay    Level: developer
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 
26705df10baSBarry Smith #if defined(PETSC_USE_LOG)
26895c0884eSLisandro Dalcin PETSC_INTERN PetscBool   PetscObjectsLog;
26905df10baSBarry Smith #endif
27005df10baSBarry Smith 
27105035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP.
27205035670SJunchao Zhang    Use the following macros to define CUDA/HIP initialization related vars/routines.
27305035670SJunchao Zhang  */
27405035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
27505035670SJunchao Zhang   typedef cudaError_t                             cupmError_t;
27605035670SJunchao Zhang   typedef struct cudaDeviceProp                   cupmDeviceProp;
277a0e72f99SJunchao Zhang   typedef cudaStream_t                            cupmStream_t;
2789ffd0706SHong Zhang   typedef cudaEvent_t                             cupmEvent_t;
27905035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   cudaGetDeviceCount(x)
28005035670SJunchao Zhang   #define cupmGetDevice(x)                        cudaGetDevice(x)
28105035670SJunchao Zhang   #define cupmSetDevice(x)                        cudaSetDevice(x)
28205035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   cudaSetDeviceFlags(x)
28305035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            cudaGetDeviceProperties(x,y)
284a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     cudaStreamCreate(x)
28505035670SJunchao Zhang   #define cupmGetLastError()                      cudaGetLastError()
28605035670SJunchao Zhang   #define cupmDeviceMapHost                       cudaDeviceMapHost
28705035670SJunchao Zhang   #define cupmSuccess                             cudaSuccess
288e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               cudaErrorMemoryAllocation
289e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           cudaErrorLaunchOutOfResources
29005035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             cudaErrorSetOnActiveProcess
29105035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRCUDA(x)
29205035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         PetscCUBLASInitializeHandle()
29305035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     PetscCUSOLVERDnInitializeHandle()
29405035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscCUDAInitialize
29505035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscCUDAInitialized
29605035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscCUDAInitializeCheck
29705035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscCUDAInitializeAndView
29805035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscCUDASynchronize
29905035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseCUDA
30005035670SJunchao Zhang   #define cupmOptionsStr                          "CUDA options"
3014dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-cuda_device"
30205035670SJunchao Zhang   #define cupmViewStr                             "-cuda_view"
30305035670SJunchao Zhang   #define cupmSynchronizeStr                      "-cuda_synchronize"
30405035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscCUDAInitialize"
30505035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckCUDA
30605035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPICUDAAwarenessCheck
307a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultCudaStream
3089ffd0706SHong Zhang   #define cupmEventCreate(x)                      cudaEventCreate(x)
30905035670SJunchao Zhang   #include "cupminit.inc"
31005035670SJunchao Zhang #endif
31105035670SJunchao Zhang 
31205035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
31305035670SJunchao Zhang   typedef hipError_t                              cupmError_t;
31405035670SJunchao Zhang   typedef hipDeviceProp_t                         cupmDeviceProp;
315a0e72f99SJunchao Zhang   typedef hipStream_t                             cupmStream_t;
3169ffd0706SHong Zhang   typedef hipEvent_t                              cupmEvent_t;
31705035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   hipGetDeviceCount(x)
31805035670SJunchao Zhang   #define cupmGetDevice(x)                        hipGetDevice(x)
31905035670SJunchao Zhang   #define cupmSetDevice(x)                        hipSetDevice(x)
32005035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   hipSetDeviceFlags(x)
32105035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            hipGetDeviceProperties(x,y)
322a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     hipStreamCreate(x)
3239ffd0706SHong Zhang   #define cupmEventCreate(x)                      hipEventCreate(x);
32405035670SJunchao Zhang   #define cupmGetLastError()                      hipGetLastError()
32505035670SJunchao Zhang   #define cupmDeviceMapHost                       hipDeviceMapHost
32605035670SJunchao Zhang   #define cupmSuccess                             hipSuccess
327e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               hipErrorMemoryAllocation
328e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           hipErrorLaunchOutOfResources
32905035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             hipErrorSetOnActiveProcess
33005035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB)
33105035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         0
33205035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     0
33305035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscHIPInitialize
33405035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscHIPInitialized
33505035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscHIPInitializeCheck
33605035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscHIPInitializeAndView
33705035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscHIPSynchronize
33805035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseHIP
33905035670SJunchao Zhang   #define cupmOptionsStr                          "HIP options"
3404dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-hip_device"
34105035670SJunchao Zhang   #define cupmViewStr                             "-hip_view"
34205035670SJunchao Zhang   #define cupmSynchronizeStr                      "-hip_synchronize"
34305035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscHIPInitialize"
34405035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckHIP
34505035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPIHIPAwarenessCheck
346a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultHipStream
34705035670SJunchao Zhang   #include "cupminit.inc"
34805035670SJunchao Zhang #endif
34905035670SJunchao Zhang 
35057171095SVaclav Hapla PETSC_INTERN PetscErrorCode  PetscOptionsCheckInitial_Private(const char help[])
351e5c89e4eSSatish Balay {
352e5ed2c37SJose E. Roman   char              string[64];
353e5c89e4eSSatish Balay   MPI_Comm          comm = PETSC_COMM_WORLD;
35405035670SJunchao Zhang   PetscBool         flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView;
355e5c89e4eSSatish Balay   PetscErrorCode    ierr;
35667584ceeSBarry Smith   PetscReal         si;
35728559dc8SJed Brown   PetscInt          intensity;
358e5c89e4eSSatish Balay   int               i;
359e5c89e4eSSatish Balay   PetscMPIInt       rank;
360d314f959SVaclav Hapla   char              version[256];
3612479a3a6SBarry Smith #if defined(PETSC_USE_LOG)
362e5ed2c37SJose E. Roman   char              mname[PETSC_MAX_PATH_LEN];
3632479a3a6SBarry Smith   PetscViewerFormat format;
36467584ceeSBarry Smith   PetscBool         flg4 = PETSC_FALSE;
36567584ceeSBarry Smith #endif
3667381773fSBarry Smith 
367e5c89e4eSSatish Balay   PetscFunctionBegin;
368ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
369e5c89e4eSSatish Balay 
37067584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
37192f119d6SBarry Smith   if (!(PETSC_RUNNING_ON_VALGRIND)) {
372e5c89e4eSSatish Balay     /*
373e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
374e5c89e4eSSatish Balay     */
375244bdbccSBarry Smith     PetscBool         mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE;
37692f119d6SBarry Smith 
37776bd3646SJed Brown     if (PetscDefined(USE_DEBUG)) {
37892f119d6SBarry Smith       mdebug        = PETSC_TRUE;
37992f119d6SBarry Smith       initializenan = PETSC_TRUE;
38092f119d6SBarry Smith       ierr   = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38176bd3646SJed Brown     } else {
38292f119d6SBarry Smith       /* don't warn about unused option */
38392f119d6SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38492f119d6SBarry Smith       flg1 = PETSC_FALSE;
38576bd3646SJed Brown     }
38679dccf82SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr);
38792f119d6SBarry Smith     if (flg1 || flg2) {
38892f119d6SBarry Smith       mdebug        = PETSC_TRUE;
38992f119d6SBarry Smith       eachcall      = PETSC_TRUE;
39092f119d6SBarry Smith       initializenan = PETSC_TRUE;
39179dccf82SBarry Smith     } else if (flg3 && !flg2) {
39279dccf82SBarry Smith       mdebug        = PETSC_FALSE;
39379dccf82SBarry Smith       eachcall      = PETSC_FALSE;
39479dccf82SBarry Smith       initializenan = PETSC_FALSE;
395e5c89e4eSSatish Balay     }
39692f119d6SBarry Smith 
397608c71bfSMatthew G. Knepley     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr);
398608c71bfSMatthew G. Knepley     if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);}
399608c71bfSMatthew G. Knepley 
40092f119d6SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr);
40192f119d6SBarry Smith     if (mlog) {
40292f119d6SBarry Smith       mdebug = PETSC_TRUE;
40392f119d6SBarry Smith     }
40479dccf82SBarry Smith     /* the next line is deprecated */
40592f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr);
40692f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr);
40792f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr);
40892f119d6SBarry Smith     if (mdebug) {
40992f119d6SBarry Smith       ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr);
41092f119d6SBarry Smith     }
41192f119d6SBarry Smith     if (mlog) {
41292f119d6SBarry Smith       PetscReal logthreshold = 0;
41392f119d6SBarry Smith       ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr);
41492f119d6SBarry Smith       ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr);
41592f119d6SBarry Smith     }
4168b254c29SBarry Smith #if defined(PETSC_USE_LOG)
4178b254c29SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr);
4188b254c29SBarry Smith #endif
41992f119d6SBarry Smith   }
42092f119d6SBarry Smith 
421ba282f50SJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr);
422ba282f50SJed Brown   if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);}
42390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
4242f21b5c6SHong Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr);
425cf6f3811SHong Zhang   /* ignore this option if malloc is already set */
426cf6f3811SHong Zhang   if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);}
427e5c89e4eSSatish Balay 
42890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
429c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr);
4307783f70dSSatish Balay   if (!flg1) {
43190d69ab7SBarry Smith     flg1 = PETSC_FALSE;
432c5929fdfSBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr);
4337783f70dSSatish Balay   }
434e5c89e4eSSatish Balay   if (flg1) {
435e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
436e5c89e4eSSatish Balay   }
43767584ceeSBarry Smith #endif
438e5c89e4eSSatish Balay 
439b4427426SBarry Smith #if defined(PETSC_USE_LOG)
440c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr);
441b4427426SBarry Smith #endif
44205df10baSBarry Smith 
443e5c89e4eSSatish Balay   /*
444e5c89e4eSSatish Balay       Set the display variable for graphics
445e5c89e4eSSatish Balay   */
446e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
447e5c89e4eSSatish Balay 
44851dcc849SKerry Stevens   /*
44957171095SVaclav Hapla      Print main application help message
45057171095SVaclav Hapla   */
45157171095SVaclav Hapla   ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr);
45257171095SVaclav Hapla   if (help && hasHelp) {
45357171095SVaclav Hapla     ierr = PetscPrintf(comm,help);CHKERRQ(ierr);
45457171095SVaclav Hapla     ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr);
45557171095SVaclav Hapla   }
45657171095SVaclav Hapla 
45757171095SVaclav Hapla   /*
458e5c89e4eSSatish Balay       Print the PETSc version information
459e5c89e4eSSatish Balay   */
460d314f959SVaclav Hapla   ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr);
461d314f959SVaclav Hapla   if (flg1 || hasHelp) {
462e5c89e4eSSatish Balay     /*
463e5c89e4eSSatish Balay        Print "higher-level" package version message
464e5c89e4eSSatish Balay     */
465e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
466e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
467e5c89e4eSSatish Balay     }
468e5c89e4eSSatish Balay 
469a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
470e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
471e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
472e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
47384e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
474e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
475e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
476c0bb3764SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr);
4777ca660e7SBarry Smith   }
4787ca660e7SBarry Smith 
47994941ca7SBarry Smith   /*
48094941ca7SBarry Smith        Print "higher-level" package help message
48194941ca7SBarry Smith   */
48257171095SVaclav Hapla   if (hasHelp) {
483d314f959SVaclav Hapla     PetscBool hasHelpIntro;
484d314f959SVaclav Hapla 
48594941ca7SBarry Smith     if (PetscExternalHelpFunction) {
48694941ca7SBarry Smith       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
48794941ca7SBarry Smith     }
488d314f959SVaclav Hapla     ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr);
489d314f959SVaclav Hapla     if (hasHelpIntro) {
490bdb346e9SBarry Smith       ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr);
491008a6e76SBarry Smith       ierr = PetscFreeMPIResources();CHKERRQ(ierr);
492ffc4695bSBarry Smith       ierr = MPI_Finalize();CHKERRMPI(ierr);
4937ca660e7SBarry Smith       exit(0);
4947ca660e7SBarry Smith     }
495e5c89e4eSSatish Balay   }
496e5c89e4eSSatish Balay 
497e5c89e4eSSatish Balay   /*
498e5c89e4eSSatish Balay       Setup the error handling
499e5c89e4eSSatish Balay   */
50090d69ab7SBarry Smith   flg1 = PETSC_FALSE;
501c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr);
502b59baad1SJed Brown   if (flg1) {
503ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr);
50402c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
505b59baad1SJed Brown   }
50690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
507c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr);
50802c9f0b5SLisandro Dalcin   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);}
50990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
510c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr);
511e5c89e4eSSatish Balay   if (flg1) {
512ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr);
513e5c89e4eSSatish Balay   }
51490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
515c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr);
5168d359177SBarry Smith   if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);}
517e5c89e4eSSatish Balay 
518e5c89e4eSSatish Balay   /*
519e5c89e4eSSatish Balay       Setup debugger information
520e5c89e4eSSatish Balay   */
521e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
522589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
523e5c89e4eSSatish Balay   if (flg1) {
524e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
525e5c89e4eSSatish Balay 
526e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
527ffc4695bSBarry Smith     ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr);
528ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
52902c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr);
530e5c89e4eSSatish Balay   }
531589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr);
5325e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
533589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
534589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr);
535e5c89e4eSSatish Balay   if (flg1 || flg2) {
536e5c89e4eSSatish Balay     PetscMPIInt    size;
537bf4d2887SBarry Smith     PetscInt       lsize,*ranks;
538e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
539e5c89e4eSSatish Balay     /*
540e5c89e4eSSatish Balay        we have to make sure that all processors have opened
541e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
542e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
543e5c89e4eSSatish Balay        and kill the program.
544e5c89e4eSSatish Balay     */
545ffc4695bSBarry Smith     ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
546e5c89e4eSSatish Balay     if (size > 2) {
547533163c2SBarry Smith       PetscMPIInt dummy = 0;
548e5c89e4eSSatish Balay       MPI_Status  status;
549e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
550e5c89e4eSSatish Balay         if (rank != i) {
551ffc4695bSBarry Smith           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr);
552e5c89e4eSSatish Balay         }
553e5c89e4eSSatish Balay       }
554e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
555e5c89e4eSSatish Balay         if (rank != i) {
556ffc4695bSBarry Smith           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr);
557e5c89e4eSSatish Balay         }
558e5c89e4eSSatish Balay       }
559e5c89e4eSSatish Balay     }
560e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
561bf4d2887SBarry Smith     ierr  = PetscMalloc1(size,&ranks);CHKERRQ(ierr);
562e5c89e4eSSatish Balay     lsize = size;
563bf4d2887SBarry Smith     /* Deprecated in 3.14 */
564bf4d2887SBarry Smith     ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr);
565bf4d2887SBarry Smith     if (flag) {
566bf4d2887SBarry Smith       const char * const quietopt="-options_suppress_deprecated_warnings";
567bf4d2887SBarry Smith       char               msg[4096];
568bf4d2887SBarry Smith       PetscBool          quiet = PETSC_FALSE;
569bf4d2887SBarry Smith 
570bf4d2887SBarry Smith       ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
571bf4d2887SBarry Smith       if (!quiet) {
572bf4d2887SBarry Smith         ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
573bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr);
574bf4d2887SBarry Smith         ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
575bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr);
576bf4d2887SBarry Smith         ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
577bf4d2887SBarry Smith         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
578bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr);
579bf4d2887SBarry Smith         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
580bf4d2887SBarry Smith         ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
581bf4d2887SBarry Smith         ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
582bf4d2887SBarry Smith         ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
583bf4d2887SBarry Smith         ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
584bf4d2887SBarry Smith       }
585bf4d2887SBarry Smith     } else {
586bf4d2887SBarry Smith       lsize = size;
587bf4d2887SBarry Smith       ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr);
588bf4d2887SBarry Smith     }
589e5c89e4eSSatish Balay     if (flag) {
590e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
591bf4d2887SBarry Smith         if (ranks[i] == rank) { flag = PETSC_FALSE; break; }
592e5c89e4eSSatish Balay       }
593e5c89e4eSSatish Balay     }
594e5c89e4eSSatish Balay     if (!flag) {
595e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
59602c9f0b5SLisandro Dalcin       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
597e5c89e4eSSatish Balay       if (flg1) {
598e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
599e5c89e4eSSatish Balay       } else {
600e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
601e5c89e4eSSatish Balay       }
602ffc4695bSBarry Smith       ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr);
603ffc4695bSBarry Smith       ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
6042a2a2941SBarry Smith     } else {
6052a2a2941SBarry Smith       ierr = PetscWaitOnError();CHKERRQ(ierr);
606e5c89e4eSSatish Balay     }
607bf4d2887SBarry Smith     ierr = PetscFree(ranks);CHKERRQ(ierr);
608e5c89e4eSSatish Balay   }
609e5c89e4eSSatish Balay 
610589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr);
611cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
612e5c89e4eSSatish Balay 
613e5c89e4eSSatish Balay   /*
614e5c89e4eSSatish Balay         Setup profiling and logging
615e5c89e4eSSatish Balay   */
6166cf91177SBarry Smith #if defined(PETSC_USE_INFO)
6178bb29257SSatish Balay   {
618e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr);
619e5c89e4eSSatish Balay   }
620865f6aa8SSatish Balay #endif
621aba4c478SBarry Smith   ierr = PetscDetermineInitialFPTrap();
622cc9df77eSBarry Smith   flg1 = PETSC_FALSE;
623cc9df77eSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr);
624cc9df77eSBarry Smith   if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);}
625cc9df77eSBarry Smith   ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr);
626cc9df77eSBarry Smith   if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);}
627865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
628865f6aa8SSatish Balay   mname[0] = 0;
629589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
630865f6aa8SSatish Balay   if (flg1) {
631865f6aa8SSatish Balay     if (mname[0]) {
632f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
633865f6aa8SSatish Balay     } else {
634706d7a88SBarry Smith       ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr);
635865f6aa8SSatish Balay     }
636865f6aa8SSatish Balay   }
637217044c2SLisandro Dalcin 
638217044c2SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr);
639217044c2SLisandro Dalcin 
640e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
64190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
642c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
643495fc317SBarry Smith   if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);}
644e5c89e4eSSatish Balay #endif
64590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
64690d69ab7SBarry Smith   flg3 = PETSC_FALSE;
647c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr);
648c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
649e5c89e4eSSatish Balay   if (flg1)                      { ierr = PetscLogAllBegin();CHKERRQ(ierr); }
650bb1d7374SBarry Smith   else if (flg3)                 { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);}
651e5c89e4eSSatish Balay 
652589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
653e5c89e4eSSatish Balay   if (flg1) {
654e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
655e5c89e4eSSatish Balay     FILE *file;
656e5c89e4eSSatish Balay     if (mname[0]) {
6572e924ca5SSatish Balay       PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank);
658e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
659e5c89e4eSSatish Balay       file = fopen(fname,"w");
660f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
661a297a907SKarl Rupp     } else file = PETSC_STDOUT;
662e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
663e5c89e4eSSatish Balay   }
664bb1d7374SBarry Smith 
66516413a6aSBarry Smith   ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr);
666bb1d7374SBarry Smith   if (flg4) {
667d0a29bd7SConnor Ward     if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
668bb1d7374SBarry Smith       ierr = PetscLogNestedBegin();CHKERRQ(ierr);
669bb1d7374SBarry Smith     } else {
670bb1d7374SBarry Smith       ierr = PetscLogDefaultBegin();CHKERRQ(ierr);
671bb1d7374SBarry Smith     }
672eccbb886SLisandro Dalcin   }
673d0a29bd7SConnor Ward   if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) {
674eccbb886SLisandro Dalcin     PetscReal threshold = PetscRealConstant(0.01);
675eccbb886SLisandro Dalcin     ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr);
676eccbb886SLisandro Dalcin     if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);}
677bb1d7374SBarry Smith   }
678e5c89e4eSSatish Balay #endif
679e5c89e4eSSatish Balay 
680c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr);
68105035670SJunchao Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr);
6828d4e85a7SStefano Zampini   /*
68305035670SJunchao Zhang     If collecting logging information, by default, wait for device to complete its operations
6848d4e85a7SStefano Zampini     before returning to the CPU in order to get accurate timings of each event
6858d4e85a7SStefano Zampini   */
686cae85d06SJunchao Zhang   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr);
68705035670SJunchao Zhang   if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);}
6888d4e85a7SStefano Zampini 
68905035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
69005035670SJunchao Zhang   ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr);
69105035670SJunchao Zhang #endif
692cae85d06SJunchao Zhang 
69305035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
69405035670SJunchao Zhang   ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr);
6954b0a73b2SBarry Smith #endif
6964b0a73b2SBarry Smith 
697e5c89e4eSSatish Balay   /*
698e5c89e4eSSatish Balay        Print basic help message
699e5c89e4eSSatish Balay   */
70057171095SVaclav Hapla   if (hasHelp) {
701e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
702d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr);
703d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr);
704d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr);
705301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
706301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
707e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
708e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
709e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
710e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
711e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
712e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
713e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
714bf4d2887SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr);
715e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
716e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
717e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
7181cda70a7SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr);
719e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
720e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
721e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
722e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
723e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
72479dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr);
72579dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr);
7264161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
72792f119d6SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr);
72879dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr);
72926a7e8d4SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr);
730e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
731e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
732e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
733e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
734a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
7350841954dSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr);
736e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
737e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
738185ae32fSMatthew G. Knepley     ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr);
739e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
74056071f75SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr);
741e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
742495fc317SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr);
743e5c89e4eSSatish Balay #endif
744e94e781bSJacob Faibussowitsch #endif
745e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO)
746fe9b927eSVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr);
747e5c89e4eSSatish Balay #endif
748e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
749c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr);
750c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr);
751e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
752e5c89e4eSSatish Balay   }
753e5c89e4eSSatish Balay 
75474ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN)
75574ba8654SBarry Smith   {
75674ba8654SBarry Smith   char machine[128];
757589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr);
75874ba8654SBarry Smith   if (flg1) {
75974ba8654SBarry Smith     ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr);
76074ba8654SBarry Smith   }
76174ba8654SBarry Smith   }
76274ba8654SBarry Smith #endif
76374ba8654SBarry Smith 
764c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
765e5c89e4eSSatish Balay   if (flg1) {
766e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
767e5c89e4eSSatish Balay   }
768e5c89e4eSSatish Balay 
769fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL)
770c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
771f14045dbSBarry Smith   if (!flg3) {
772c5929fdfSBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr);
773f14045dbSBarry Smith   }
774c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr);
775f14045dbSBarry Smith   PetscViennaCLSynchronize = flg3;
776fdc842d1SBarry Smith   ierr = PetscViennaCLInit();CHKERRQ(ierr);
7774cf1874eSKarl Rupp #endif
77882f73ecaSAlejandro Lamas Daviña 
779fdc842d1SBarry Smith   /*
780fdc842d1SBarry Smith      Creates the logging data structures; this is enabled even if logging is not turned on
781fdc842d1SBarry Smith      This is the last thing we do before returning to the user code to prevent having the
782fdc842d1SBarry Smith      logging numbers contaminated by any startup time associated with MPI and the GPUs
783fdc842d1SBarry Smith   */
784fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
785fdc842d1SBarry Smith   ierr = PetscLogInitialize();CHKERRQ(ierr);
786f0a7718cSKarl Rupp #endif
787f0a7718cSKarl Rupp 
788e5c89e4eSSatish Balay   PetscFunctionReturn(0);
789e5c89e4eSSatish Balay }
790