xref: /petsc/src/sys/objects/init.c (revision 27104ee2013e31f06617ed2b246343664c6dee21)
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>
11665c2dedSJed Brown #include <petscviewer.h>
12fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
13fdc842d1SBarry Smith PETSC_INTERN PetscErrorCode PetscLogInitialize(void);
14fdc842d1SBarry Smith #endif
15ef386f4bSSatish Balay 
16ba61063dSBarry Smith #if defined(PETSC_HAVE_SYS_SYSINFO_H)
1751d315f7SKerry Stevens #include <sys/sysinfo.h>
18ba61063dSBarry Smith #endif
19121deb67SSatish Balay #if defined(PETSC_HAVE_UNISTD_H)
2051d315f7SKerry Stevens #include <unistd.h>
21121deb67SSatish Balay #endif
2205035670SJunchao Zhang 
23030f984aSJacob Faibussowitsch #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP)
24030f984aSJacob Faibussowitsch #  include <petscdevice.h>
2505035670SJunchao Zhang #endif
2605035670SJunchao Zhang 
2705035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
28c2a741eeSJunchao Zhang   #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
29c2a741eeSJunchao Zhang     #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */
30c2a741eeSJunchao Zhang   #endif
31d9b72601SDominic Meiser #endif
32555d055bSBarry Smith 
33f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL)
34f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit();
35f0a7718cSKarl Rupp #endif
36f0a7718cSKarl Rupp 
37e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/
38e5c89e4eSSatish Balay /*
39e5c89e4eSSatish Balay      Indicates if PETSc started up MPI, or it was
40e5c89e4eSSatish Balay    already started before PETSc was initialized.
41e5c89e4eSSatish Balay */
420cbf60d0SJose E. Roman PetscBool   PetscBeganMPI                 = PETSC_FALSE;
438ad20175SVaclav Hapla PetscBool   PetscErrorHandlingInitialized = PETSC_FALSE;
440cbf60d0SJose E. Roman PetscBool   PetscInitializeCalled         = PETSC_FALSE;
450cbf60d0SJose E. Roman PetscBool   PetscFinalizeCalled           = PETSC_FALSE;
46d6f2c3cbSBarry Smith 
477087cfbeSBarry Smith PetscMPIInt PetscGlobalRank               = -1;
487087cfbeSBarry Smith PetscMPIInt PetscGlobalSize               = -1;
49ba61063dSBarry Smith 
50c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS)
51c2b86a48SJunchao Zhang PetscBool   PetscBeganKokkos              = PETSC_FALSE;
52c2b86a48SJunchao Zhang #endif
53c2b86a48SJunchao Zhang 
5471438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
5571438e86SJunchao Zhang PetscBool   PetscBeganNvshmem             = PETSC_FALSE;
5671438e86SJunchao Zhang PetscBool   PetscNvshmemInitialized       = PETSC_FALSE;
5771438e86SJunchao Zhang #endif
5871438e86SJunchao Zhang 
59c2a741eeSJunchao Zhang PetscBool   use_gpu_aware_mpi             = PETSC_TRUE;
60928a6601SJunchao Zhang PetscBool   PetscCreatedGpuObjects        = PETSC_FALSE;
61c2a741eeSJunchao Zhang 
6250f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX)
63e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
64e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
65e5c89e4eSSatish Balay #endif
668619c96cSJed Brown 
678619c96cSJed Brown /*MC
688619c96cSJed Brown    PETSC_i - the imaginary number i
698619c96cSJed Brown 
708619c96cSJed Brown    Synopsis:
718619c96cSJed Brown    #include <petscsys.h>
728619c96cSJed Brown    PetscComplex PETSC_i;
738619c96cSJed Brown 
748619c96cSJed Brown    Level: beginner
758619c96cSJed Brown 
768619c96cSJed Brown    Note:
778cd53115SBarry Smith    Complex numbers are automatically available if PETSc located a working complex implementation
788619c96cSJed Brown 
798619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex()
808619c96cSJed Brown M*/
8150f81f78SJed Brown PetscComplex PETSC_i;
827a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0;
837a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */
84ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
85c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0;
86570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
87570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0;
88c90a1750SBarry Smith #endif
897087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0;
90092991acSStefano Zampini MPI_Datatype MPIU_REAL_INT = 0;
91092991acSStefano Zampini MPI_Datatype MPIU_SCALAR_INT = 0;
920354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES)
937087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0;
9444041f26SJed Brown #endif
95b5a892a1SMatthew G. Knepley MPI_Datatype MPI_4INT = 0;
96b5a892a1SMatthew G. Knepley MPI_Datatype MPIU_4INT = 0;
978ad47952SJed Brown MPI_Datatype MPIU_BOOL;
988ad47952SJed Brown MPI_Datatype MPIU_ENUM;
997cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR;
100e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T;
10175567043SBarry Smith 
102e5c89e4eSSatish Balay /*
103e5c89e4eSSatish Balay        Function that is called to display all error messages
104e5c89e4eSSatish Balay */
1057087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
1067087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
1077087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
108bab1f7e6SVictor Minden /*
1094cf1874eSKarl Rupp   This is needed to turn on/off GPU synchronization
1108b5db460SBarry Smith */
1114cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE;
112bab1f7e6SVictor Minden 
113e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
114e5c89e4eSSatish Balay /*
115e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
116e5c89e4eSSatish Balay */
11795c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
1180298fd71SBarry Smith FILE *petsc_history = NULL;
119e5c89e4eSSatish Balay 
1207087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
121e5c89e4eSSatish Balay {
122e5c89e4eSSatish Balay   PetscErrorCode ierr;
123e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
124e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
125e5c89e4eSSatish Balay   char           version[256];
126e5c89e4eSSatish Balay 
127e5c89e4eSSatish Balay   PetscFunctionBegin;
128ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
129dd400576SPatrick Sanan   if (rank == 0) {
130e5c89e4eSSatish Balay     char        arch[10];
131f56c2debSBarry Smith     int         err;
132f56c2debSBarry Smith 
133e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
134e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
135a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
136ffc4695bSBarry Smith     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
137e5c89e4eSSatish Balay     if (filename) {
138e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
139e5c89e4eSSatish Balay     } else {
140589a23caSBarry Smith       ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr);
141589a23caSBarry Smith       ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr);
142e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
143e5c89e4eSSatish Balay     }
144e5c89e4eSSatish Balay 
145a297a907SKarl Rupp     *fd = fopen(fname,"a");
146a297a907SKarl Rupp     if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
147a297a907SKarl Rupp 
148c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
149e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
150589a23caSBarry Smith     ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
151e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
152c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
153a297a907SKarl Rupp 
154f56c2debSBarry Smith     err = fflush(*fd);
155e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
156e5c89e4eSSatish Balay   }
157e5c89e4eSSatish Balay   PetscFunctionReturn(0);
158e5c89e4eSSatish Balay }
159e5c89e4eSSatish Balay 
16095c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd)
161e5c89e4eSSatish Balay {
162e5c89e4eSSatish Balay   PetscErrorCode ierr;
163e5c89e4eSSatish Balay   PetscMPIInt    rank;
164e5c89e4eSSatish Balay   char           date[64];
165f56c2debSBarry Smith   int            err;
166e5c89e4eSSatish Balay 
167e5c89e4eSSatish Balay   PetscFunctionBegin;
168ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
169dd400576SPatrick Sanan   if (rank == 0) {
170e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
171c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
172e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
173c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
174f56c2debSBarry Smith     err  = fflush(*fd);
175e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
176f56c2debSBarry Smith     err = fclose(*fd);
177e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
178e5c89e4eSSatish Balay   }
179e5c89e4eSSatish Balay   PetscFunctionReturn(0);
180e5c89e4eSSatish Balay }
181e5c89e4eSSatish Balay 
182e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
183e5c89e4eSSatish Balay 
184e5c89e4eSSatish Balay /*
185e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
186e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
187e5c89e4eSSatish Balay 
188e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1893c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1903c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
191e5c89e4eSSatish Balay */
192e5c89e4eSSatish Balay 
19333c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
194e5c89e4eSSatish Balay {
195e5c89e4eSSatish Balay   PetscFunctionBegin;
1963c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
197e5c89e4eSSatish Balay   abort();
198e5c89e4eSSatish Balay }
199e5c89e4eSSatish Balay 
20033c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
201e5c89e4eSSatish Balay {
202e5c89e4eSSatish Balay   PetscErrorCode ierr;
203e5c89e4eSSatish Balay 
204e5c89e4eSSatish Balay   PetscFunctionBegin;
2053c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
206e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
20741e02c4dSJunchao Zhang   if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */
208e5c89e4eSSatish Balay }
209e5c89e4eSSatish Balay 
210e5c89e4eSSatish Balay /*@C
211e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
212e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
213e5c89e4eSSatish Balay 
214e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
217e5c89e4eSSatish Balay 
218e5c89e4eSSatish Balay    Level: advanced
219e5c89e4eSSatish Balay 
220e5c89e4eSSatish Balay    Note:
221e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
222e5c89e4eSSatish Balay 
22388c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
224e5c89e4eSSatish Balay @*/
2257087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
226e5c89e4eSSatish Balay {
227e5c89e4eSSatish Balay   PetscFunctionBegin;
228e5c89e4eSSatish Balay   PetscFinalize();
229e5c89e4eSSatish Balay   exit(0);
230e5c89e4eSSatish Balay   return 0;
231e5c89e4eSSatish Balay }
232e5c89e4eSSatish Balay 
233ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE;
23495c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void);
23595c0884eSLisandro Dalcin PETSC_INTERN PetscBool      petscsetmallocvisited;
236e5c89e4eSSatish Balay static       char           emacsmachinename[256];
237e5c89e4eSSatish Balay 
23802c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL;
23902c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = NULL;
240e5c89e4eSSatish Balay 
241e5c89e4eSSatish Balay /*@C
242e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
243e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
244e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
245e5c89e4eSSatish Balay 
246d8d19677SJose E. Roman    Input Parameters:
2470298fd71SBarry Smith +  help - the help function (may be NULL)
2480298fd71SBarry Smith -  version - the version function (may be NULL)
249e5c89e4eSSatish Balay 
250e5c89e4eSSatish Balay    Level: developer
251e5c89e4eSSatish Balay 
252e5c89e4eSSatish Balay @*/
2537087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
254e5c89e4eSSatish Balay {
255e5c89e4eSSatish Balay   PetscFunctionBegin;
256e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
257e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
258e5c89e4eSSatish Balay   PetscFunctionReturn(0);
259e5c89e4eSSatish Balay }
260e5c89e4eSSatish Balay 
26105df10baSBarry Smith #if defined(PETSC_USE_LOG)
26295c0884eSLisandro Dalcin PETSC_INTERN PetscBool   PetscObjectsLog;
26305df10baSBarry Smith #endif
26405df10baSBarry Smith 
26505035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP.
26605035670SJunchao Zhang    Use the following macros to define CUDA/HIP initialization related vars/routines.
26705035670SJunchao Zhang  */
26805035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
26905035670SJunchao Zhang   typedef cudaError_t                             cupmError_t;
27005035670SJunchao Zhang   typedef struct cudaDeviceProp                   cupmDeviceProp;
271a0e72f99SJunchao Zhang   typedef cudaStream_t                            cupmStream_t;
2729ffd0706SHong Zhang   typedef cudaEvent_t                             cupmEvent_t;
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)
278a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     cudaStreamCreate(x)
27905035670SJunchao Zhang   #define cupmGetLastError()                      cudaGetLastError()
28005035670SJunchao Zhang   #define cupmDeviceMapHost                       cudaDeviceMapHost
28105035670SJunchao Zhang   #define cupmSuccess                             cudaSuccess
282e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               cudaErrorMemoryAllocation
283e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           cudaErrorLaunchOutOfResources
28405035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             cudaErrorSetOnActiveProcess
28505035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRCUDA(x)
28605035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         PetscCUBLASInitializeHandle()
28705035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     PetscCUSOLVERDnInitializeHandle()
28805035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscCUDAInitialize
28905035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscCUDAInitialized
29005035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscCUDAInitializeCheck
29105035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscCUDAInitializeAndView
29205035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscCUDASynchronize
29305035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseCUDA
29405035670SJunchao Zhang   #define cupmOptionsStr                          "CUDA options"
2954dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-cuda_device"
29605035670SJunchao Zhang   #define cupmViewStr                             "-cuda_view"
29705035670SJunchao Zhang   #define cupmSynchronizeStr                      "-cuda_synchronize"
29805035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscCUDAInitialize"
29905035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckCUDA
30005035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPICUDAAwarenessCheck
301a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultCudaStream
3029ffd0706SHong Zhang   #define cupmEventCreate(x)                      cudaEventCreate(x)
30305035670SJunchao Zhang   #include "cupminit.inc"
30405035670SJunchao Zhang #endif
30505035670SJunchao Zhang 
30605035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
30705035670SJunchao Zhang   typedef hipError_t                              cupmError_t;
30805035670SJunchao Zhang   typedef hipDeviceProp_t                         cupmDeviceProp;
309a0e72f99SJunchao Zhang   typedef hipStream_t                             cupmStream_t;
3109ffd0706SHong Zhang   typedef hipEvent_t                              cupmEvent_t;
31105035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   hipGetDeviceCount(x)
31205035670SJunchao Zhang   #define cupmGetDevice(x)                        hipGetDevice(x)
31305035670SJunchao Zhang   #define cupmSetDevice(x)                        hipSetDevice(x)
31405035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   hipSetDeviceFlags(x)
31505035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            hipGetDeviceProperties(x,y)
316a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     hipStreamCreate(x)
3179ffd0706SHong Zhang   #define cupmEventCreate(x)                      hipEventCreate(x);
31805035670SJunchao Zhang   #define cupmGetLastError()                      hipGetLastError()
31905035670SJunchao Zhang   #define cupmDeviceMapHost                       hipDeviceMapHost
32005035670SJunchao Zhang   #define cupmSuccess                             hipSuccess
321e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               hipErrorMemoryAllocation
322e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           hipErrorLaunchOutOfResources
32305035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             hipErrorSetOnActiveProcess
32405035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB)
32505035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         0
32605035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     0
32705035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscHIPInitialize
32805035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscHIPInitialized
32905035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscHIPInitializeCheck
33005035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscHIPInitializeAndView
33105035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscHIPSynchronize
33205035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseHIP
33305035670SJunchao Zhang   #define cupmOptionsStr                          "HIP options"
3344dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-hip_device"
33505035670SJunchao Zhang   #define cupmViewStr                             "-hip_view"
33605035670SJunchao Zhang   #define cupmSynchronizeStr                      "-hip_synchronize"
33705035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscHIPInitialize"
33805035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckHIP
33905035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPIHIPAwarenessCheck
340a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultHipStream
34105035670SJunchao Zhang   #include "cupminit.inc"
34205035670SJunchao Zhang #endif
34305035670SJunchao Zhang 
34457171095SVaclav Hapla PETSC_INTERN PetscErrorCode  PetscOptionsCheckInitial_Private(const char help[])
345e5c89e4eSSatish Balay {
346e5ed2c37SJose E. Roman   char              string[64];
347e5c89e4eSSatish Balay   MPI_Comm          comm = PETSC_COMM_WORLD;
34805035670SJunchao Zhang   PetscBool         flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView;
349e5c89e4eSSatish Balay   PetscErrorCode    ierr;
35067584ceeSBarry Smith   PetscReal         si;
35128559dc8SJed Brown   PetscInt          intensity;
352e5c89e4eSSatish Balay   int               i;
353e5c89e4eSSatish Balay   PetscMPIInt       rank;
354d314f959SVaclav Hapla   char              version[256];
3552479a3a6SBarry Smith #if defined(PETSC_USE_LOG)
356e5ed2c37SJose E. Roman   char              mname[PETSC_MAX_PATH_LEN];
3572479a3a6SBarry Smith   PetscViewerFormat format;
35867584ceeSBarry Smith   PetscBool         flg4 = PETSC_FALSE;
35967584ceeSBarry Smith #endif
3607381773fSBarry Smith 
361e5c89e4eSSatish Balay   PetscFunctionBegin;
362ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
363e5c89e4eSSatish Balay 
364*27104ee2SJacob Faibussowitsch   /*
365*27104ee2SJacob Faibussowitsch      Setup building of stack frames for all function calls
366*27104ee2SJacob Faibussowitsch   */
367*27104ee2SJacob Faibussowitsch   if (PetscDefined(USE_DEBUG) && !PetscDefined(HAVE_THREADSAFETY)) {
368*27104ee2SJacob Faibussowitsch     ierr = PetscOptionsGetBool(NULL,NULL,"-checkstack",&flg1,NULL);CHKERRQ(ierr);
369*27104ee2SJacob Faibussowitsch     ierr = PetscStackSetCheck(flg1);CHKERRQ(ierr);
370*27104ee2SJacob Faibussowitsch   }
371*27104ee2SJacob Faibussowitsch 
37267584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
37392f119d6SBarry Smith   if (!(PETSC_RUNNING_ON_VALGRIND)) {
374e5c89e4eSSatish Balay     /*
375e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
376e5c89e4eSSatish Balay     */
377244bdbccSBarry Smith     PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE;
37892f119d6SBarry Smith 
37976bd3646SJed Brown     if (PetscDefined(USE_DEBUG)) {
38092f119d6SBarry Smith       mdebug        = PETSC_TRUE;
38192f119d6SBarry Smith       initializenan = PETSC_TRUE;
38292f119d6SBarry Smith       ierr   = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38376bd3646SJed Brown     } else {
38492f119d6SBarry Smith       /* don't warn about unused option */
38592f119d6SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38692f119d6SBarry Smith       flg1 = PETSC_FALSE;
38776bd3646SJed Brown     }
38879dccf82SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr);
38992f119d6SBarry Smith     if (flg1 || flg2) {
39092f119d6SBarry Smith       mdebug        = PETSC_TRUE;
39192f119d6SBarry Smith       eachcall      = PETSC_TRUE;
39292f119d6SBarry Smith       initializenan = PETSC_TRUE;
39379dccf82SBarry Smith     } else if (flg3 && !flg2) {
39479dccf82SBarry Smith       mdebug        = PETSC_FALSE;
39579dccf82SBarry Smith       eachcall      = PETSC_FALSE;
39679dccf82SBarry Smith       initializenan = PETSC_FALSE;
397e5c89e4eSSatish Balay     }
39892f119d6SBarry Smith 
399608c71bfSMatthew G. Knepley     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr);
400608c71bfSMatthew G. Knepley     if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);}
401608c71bfSMatthew G. Knepley 
40292f119d6SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr);
40392f119d6SBarry Smith     if (mlog) {
40492f119d6SBarry Smith       mdebug = PETSC_TRUE;
40592f119d6SBarry Smith     }
40679dccf82SBarry Smith     /* the next line is deprecated */
40792f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr);
40892f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr);
40992f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr);
41092f119d6SBarry Smith     if (mdebug) {
41192f119d6SBarry Smith       ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr);
41292f119d6SBarry Smith     }
41392f119d6SBarry Smith     if (mlog) {
41492f119d6SBarry Smith       PetscReal logthreshold = 0;
41592f119d6SBarry Smith       ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr);
41692f119d6SBarry Smith       ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr);
41792f119d6SBarry Smith     }
4188b254c29SBarry Smith #if defined(PETSC_USE_LOG)
4198b254c29SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr);
4208b254c29SBarry Smith #endif
42192f119d6SBarry Smith   }
42292f119d6SBarry Smith 
423ba282f50SJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr);
424ba282f50SJed Brown   if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);}
42590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
4262f21b5c6SHong Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr);
427cf6f3811SHong Zhang   /* ignore this option if malloc is already set */
428cf6f3811SHong Zhang   if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);}
429e5c89e4eSSatish Balay 
43090d69ab7SBarry Smith   flg1 = PETSC_FALSE;
431c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr);
4327783f70dSSatish Balay   if (!flg1) {
43390d69ab7SBarry Smith     flg1 = PETSC_FALSE;
434c5929fdfSBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr);
4357783f70dSSatish Balay   }
436e5c89e4eSSatish Balay   if (flg1) {
437e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
438e5c89e4eSSatish Balay   }
43967584ceeSBarry Smith #endif
440e5c89e4eSSatish Balay 
441b4427426SBarry Smith #if defined(PETSC_USE_LOG)
442c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr);
443b4427426SBarry Smith #endif
44405df10baSBarry Smith 
445e5c89e4eSSatish Balay   /*
446e5c89e4eSSatish Balay       Set the display variable for graphics
447e5c89e4eSSatish Balay   */
448e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
449e5c89e4eSSatish Balay 
45051dcc849SKerry Stevens   /*
45157171095SVaclav Hapla      Print main application help message
45257171095SVaclav Hapla   */
45357171095SVaclav Hapla   ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr);
45457171095SVaclav Hapla   if (help && hasHelp) {
45557171095SVaclav Hapla     ierr = PetscPrintf(comm,help);CHKERRQ(ierr);
45657171095SVaclav Hapla     ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr);
45757171095SVaclav Hapla   }
45857171095SVaclav Hapla 
45957171095SVaclav Hapla   /*
460e5c89e4eSSatish Balay       Print the PETSc version information
461e5c89e4eSSatish Balay   */
462d314f959SVaclav Hapla   ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr);
463d314f959SVaclav Hapla   if (flg1 || hasHelp) {
464e5c89e4eSSatish Balay     /*
465e5c89e4eSSatish Balay        Print "higher-level" package version message
466e5c89e4eSSatish Balay     */
467e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
468e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
469e5c89e4eSSatish Balay     }
470e5c89e4eSSatish Balay 
471a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
472e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
473e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
474e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
47584e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
476e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
477e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
478c0bb3764SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr);
4797ca660e7SBarry Smith   }
4807ca660e7SBarry Smith 
48194941ca7SBarry Smith   /*
48294941ca7SBarry Smith        Print "higher-level" package help message
48394941ca7SBarry Smith   */
48457171095SVaclav Hapla   if (hasHelp) {
485d314f959SVaclav Hapla     PetscBool hasHelpIntro;
486d314f959SVaclav Hapla 
48794941ca7SBarry Smith     if (PetscExternalHelpFunction) {
48894941ca7SBarry Smith       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
48994941ca7SBarry Smith     }
490d314f959SVaclav Hapla     ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr);
491d314f959SVaclav Hapla     if (hasHelpIntro) {
492bdb346e9SBarry Smith       ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr);
493008a6e76SBarry Smith       ierr = PetscFreeMPIResources();CHKERRQ(ierr);
494ffc4695bSBarry Smith       ierr = MPI_Finalize();CHKERRMPI(ierr);
4957ca660e7SBarry Smith       exit(0);
4967ca660e7SBarry Smith     }
497e5c89e4eSSatish Balay   }
498e5c89e4eSSatish Balay 
499e5c89e4eSSatish Balay   /*
500e5c89e4eSSatish Balay       Setup the error handling
501e5c89e4eSSatish Balay   */
50290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
503c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr);
504b59baad1SJed Brown   if (flg1) {
505ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr);
50602c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
507b59baad1SJed Brown   }
50890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
509c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr);
51002c9f0b5SLisandro Dalcin   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);}
51190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
512c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr);
513e5c89e4eSSatish Balay   if (flg1) {
514ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr);
515e5c89e4eSSatish Balay   }
51690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
517c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr);
5188d359177SBarry Smith   if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);}
519e5c89e4eSSatish Balay 
520e5c89e4eSSatish Balay   /*
521e5c89e4eSSatish Balay       Setup debugger information
522e5c89e4eSSatish Balay   */
523e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
524589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
525e5c89e4eSSatish Balay   if (flg1) {
526e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
527e5c89e4eSSatish Balay 
528e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
529ffc4695bSBarry Smith     ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr);
530ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
53102c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr);
532e5c89e4eSSatish Balay   }
533589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr);
5345e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
535589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
536589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr);
537e5c89e4eSSatish Balay   if (flg1 || flg2) {
538e5c89e4eSSatish Balay     PetscMPIInt    size;
539bf4d2887SBarry Smith     PetscInt       lsize,*ranks;
540e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
541e5c89e4eSSatish Balay     /*
542e5c89e4eSSatish Balay        we have to make sure that all processors have opened
543e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
544e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
545e5c89e4eSSatish Balay        and kill the program.
546e5c89e4eSSatish Balay     */
547ffc4695bSBarry Smith     ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
548e5c89e4eSSatish Balay     if (size > 2) {
549533163c2SBarry Smith       PetscMPIInt dummy = 0;
550e5c89e4eSSatish Balay       MPI_Status  status;
551e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
552e5c89e4eSSatish Balay         if (rank != i) {
553ffc4695bSBarry Smith           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr);
554e5c89e4eSSatish Balay         }
555e5c89e4eSSatish Balay       }
556e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
557e5c89e4eSSatish Balay         if (rank != i) {
558ffc4695bSBarry Smith           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr);
559e5c89e4eSSatish Balay         }
560e5c89e4eSSatish Balay       }
561e5c89e4eSSatish Balay     }
562e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
563bf4d2887SBarry Smith     ierr  = PetscMalloc1(size,&ranks);CHKERRQ(ierr);
564e5c89e4eSSatish Balay     lsize = size;
565bf4d2887SBarry Smith     /* Deprecated in 3.14 */
566bf4d2887SBarry Smith     ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr);
567bf4d2887SBarry Smith     if (flag) {
568bf4d2887SBarry Smith       const char * const quietopt="-options_suppress_deprecated_warnings";
569bf4d2887SBarry Smith       char               msg[4096];
570bf4d2887SBarry Smith       PetscBool          quiet = PETSC_FALSE;
571bf4d2887SBarry Smith 
572bf4d2887SBarry Smith       ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
573bf4d2887SBarry Smith       if (!quiet) {
574bf4d2887SBarry Smith         ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
575bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr);
576bf4d2887SBarry Smith         ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
577bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr);
578bf4d2887SBarry Smith         ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
579bf4d2887SBarry Smith         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
580bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr);
581bf4d2887SBarry Smith         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
582bf4d2887SBarry Smith         ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
583bf4d2887SBarry Smith         ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
584bf4d2887SBarry Smith         ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
585bf4d2887SBarry Smith         ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
586bf4d2887SBarry Smith       }
587bf4d2887SBarry Smith     } else {
588bf4d2887SBarry Smith       lsize = size;
589bf4d2887SBarry Smith       ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr);
590bf4d2887SBarry Smith     }
591e5c89e4eSSatish Balay     if (flag) {
592e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
593bf4d2887SBarry Smith         if (ranks[i] == rank) { flag = PETSC_FALSE; break; }
594e5c89e4eSSatish Balay       }
595e5c89e4eSSatish Balay     }
596e5c89e4eSSatish Balay     if (!flag) {
597e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
59802c9f0b5SLisandro Dalcin       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
599e5c89e4eSSatish Balay       if (flg1) {
600e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
601e5c89e4eSSatish Balay       } else {
602e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
603e5c89e4eSSatish Balay       }
604ffc4695bSBarry Smith       ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr);
605ffc4695bSBarry Smith       ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
6062a2a2941SBarry Smith     } else {
6072a2a2941SBarry Smith       ierr = PetscWaitOnError();CHKERRQ(ierr);
608e5c89e4eSSatish Balay     }
609bf4d2887SBarry Smith     ierr = PetscFree(ranks);CHKERRQ(ierr);
610e5c89e4eSSatish Balay   }
611e5c89e4eSSatish Balay 
612589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr);
613dd400576SPatrick Sanan   if (flg1 && rank == 0) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
614e5c89e4eSSatish Balay 
615e5c89e4eSSatish Balay   /*
616e5c89e4eSSatish Balay         Setup profiling and logging
617e5c89e4eSSatish Balay   */
6186cf91177SBarry Smith #if defined(PETSC_USE_INFO)
6198bb29257SSatish Balay   {
620e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr);
621e5c89e4eSSatish Balay   }
622865f6aa8SSatish Balay #endif
623aba4c478SBarry Smith   ierr = PetscDetermineInitialFPTrap();
624cc9df77eSBarry Smith   flg1 = PETSC_FALSE;
625cc9df77eSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr);
626cc9df77eSBarry Smith   if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);}
627cc9df77eSBarry Smith   ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr);
628cc9df77eSBarry Smith   if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);}
629865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
630865f6aa8SSatish Balay   mname[0] = 0;
631589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
632865f6aa8SSatish Balay   if (flg1) {
633865f6aa8SSatish Balay     if (mname[0]) {
634f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
635865f6aa8SSatish Balay     } else {
636706d7a88SBarry Smith       ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr);
637865f6aa8SSatish Balay     }
638865f6aa8SSatish Balay   }
639217044c2SLisandro Dalcin 
640217044c2SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr);
641217044c2SLisandro Dalcin 
642e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
64390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
644c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
645495fc317SBarry Smith   if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);}
646e5c89e4eSSatish Balay #endif
64790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
64890d69ab7SBarry Smith   flg3 = PETSC_FALSE;
649c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr);
650c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
651e5c89e4eSSatish Balay   if (flg1)                      { ierr = PetscLogAllBegin();CHKERRQ(ierr); }
652bb1d7374SBarry Smith   else if (flg3)                 { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);}
653e5c89e4eSSatish Balay 
654589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
655e5c89e4eSSatish Balay   if (flg1) {
656e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
657e5c89e4eSSatish Balay     FILE *file;
658e5c89e4eSSatish Balay     if (mname[0]) {
6592e924ca5SSatish Balay       PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank);
660e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
661e5c89e4eSSatish Balay       file = fopen(fname,"w");
662f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
663a297a907SKarl Rupp     } else file = PETSC_STDOUT;
664e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
665e5c89e4eSSatish Balay   }
666bb1d7374SBarry Smith 
66716413a6aSBarry Smith   ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr);
668bb1d7374SBarry Smith   if (flg4) {
669d0a29bd7SConnor Ward     if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
670bb1d7374SBarry Smith       ierr = PetscLogNestedBegin();CHKERRQ(ierr);
671bb1d7374SBarry Smith     } else {
672bb1d7374SBarry Smith       ierr = PetscLogDefaultBegin();CHKERRQ(ierr);
673bb1d7374SBarry Smith     }
674eccbb886SLisandro Dalcin   }
675d0a29bd7SConnor Ward   if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) {
676eccbb886SLisandro Dalcin     PetscReal threshold = PetscRealConstant(0.01);
677eccbb886SLisandro Dalcin     ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr);
678eccbb886SLisandro Dalcin     if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);}
679bb1d7374SBarry Smith   }
680e5c89e4eSSatish Balay #endif
681e5c89e4eSSatish Balay 
682c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr);
68305035670SJunchao Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr);
6848d4e85a7SStefano Zampini   /*
68505035670SJunchao Zhang     If collecting logging information, by default, wait for device to complete its operations
6868d4e85a7SStefano Zampini     before returning to the CPU in order to get accurate timings of each event
6878d4e85a7SStefano Zampini   */
688cae85d06SJunchao Zhang   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr);
68905035670SJunchao Zhang   if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);}
6908d4e85a7SStefano Zampini 
69105035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
69205035670SJunchao Zhang   ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr);
69305035670SJunchao Zhang #endif
694cae85d06SJunchao Zhang 
69505035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
69605035670SJunchao Zhang   ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr);
6974b0a73b2SBarry Smith #endif
6984b0a73b2SBarry Smith 
699e5c89e4eSSatish Balay   /*
700e5c89e4eSSatish Balay        Print basic help message
701e5c89e4eSSatish Balay   */
70257171095SVaclav Hapla   if (hasHelp) {
703e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
704d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr);
705d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr);
706d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr);
707301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
708301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
709e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
710e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
711e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
712e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
713e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
714e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
715e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
716bf4d2887SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr);
717e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
718e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
719e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
7201cda70a7SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr);
721e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
722e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
723e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
724e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
725e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
72679dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr);
72779dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr);
7284161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
72992f119d6SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr);
73079dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr);
73126a7e8d4SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr);
732e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
733e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
734e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
735e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
736a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
7370841954dSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr);
738e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
739e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
740185ae32fSMatthew G. Knepley     ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr);
741e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
74256071f75SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr);
743e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
744495fc317SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr);
745e5c89e4eSSatish Balay #endif
746e94e781bSJacob Faibussowitsch #endif
747e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO)
748fe9b927eSVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr);
749e5c89e4eSSatish Balay #endif
750e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
751c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr);
752c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr);
753e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
754e5c89e4eSSatish Balay   }
755e5c89e4eSSatish Balay 
75674ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN)
75774ba8654SBarry Smith   {
75874ba8654SBarry Smith   char machine[128];
759589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr);
76074ba8654SBarry Smith   if (flg1) {
76174ba8654SBarry Smith     ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr);
76274ba8654SBarry Smith   }
76374ba8654SBarry Smith   }
76474ba8654SBarry Smith #endif
76574ba8654SBarry Smith 
766c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
767e5c89e4eSSatish Balay   if (flg1) {
768e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
769e5c89e4eSSatish Balay   }
770e5c89e4eSSatish Balay 
771fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL)
772c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
773f14045dbSBarry Smith   if (!flg3) {
774c5929fdfSBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr);
775f14045dbSBarry Smith   }
776c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr);
777f14045dbSBarry Smith   PetscViennaCLSynchronize = flg3;
778fdc842d1SBarry Smith   ierr = PetscViennaCLInit();CHKERRQ(ierr);
7794cf1874eSKarl Rupp #endif
78082f73ecaSAlejandro Lamas Daviña 
781fdc842d1SBarry Smith   /*
782fdc842d1SBarry Smith      Creates the logging data structures; this is enabled even if logging is not turned on
783fdc842d1SBarry Smith      This is the last thing we do before returning to the user code to prevent having the
784fdc842d1SBarry Smith      logging numbers contaminated by any startup time associated with MPI and the GPUs
785fdc842d1SBarry Smith   */
786fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
787fdc842d1SBarry Smith   ierr = PetscLogInitialize();CHKERRQ(ierr);
788f0a7718cSKarl Rupp #endif
789f0a7718cSKarl Rupp 
790e5c89e4eSSatish Balay   PetscFunctionReturn(0);
791e5c89e4eSSatish Balay }
792