xref: /petsc/src/sys/objects/init.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
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);
129e5c89e4eSSatish Balay   if (!rank) {
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);
169e5c89e4eSSatish Balay   if (!rank) {
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 
246*d8d19677SJose 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 
36467584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
36592f119d6SBarry Smith   if (!(PETSC_RUNNING_ON_VALGRIND)) {
366e5c89e4eSSatish Balay     /*
367e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
368e5c89e4eSSatish Balay     */
369244bdbccSBarry Smith     PetscBool         mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE;
37092f119d6SBarry Smith 
37176bd3646SJed Brown     if (PetscDefined(USE_DEBUG)) {
37292f119d6SBarry Smith       mdebug        = PETSC_TRUE;
37392f119d6SBarry Smith       initializenan = PETSC_TRUE;
37492f119d6SBarry Smith       ierr   = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
37576bd3646SJed Brown     } else {
37692f119d6SBarry Smith       /* don't warn about unused option */
37792f119d6SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
37892f119d6SBarry Smith       flg1 = PETSC_FALSE;
37976bd3646SJed Brown     }
38079dccf82SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr);
38192f119d6SBarry Smith     if (flg1 || flg2) {
38292f119d6SBarry Smith       mdebug        = PETSC_TRUE;
38392f119d6SBarry Smith       eachcall      = PETSC_TRUE;
38492f119d6SBarry Smith       initializenan = PETSC_TRUE;
38579dccf82SBarry Smith     } else if (flg3 && !flg2) {
38679dccf82SBarry Smith       mdebug        = PETSC_FALSE;
38779dccf82SBarry Smith       eachcall      = PETSC_FALSE;
38879dccf82SBarry Smith       initializenan = PETSC_FALSE;
389e5c89e4eSSatish Balay     }
39092f119d6SBarry Smith 
391608c71bfSMatthew G. Knepley     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr);
392608c71bfSMatthew G. Knepley     if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);}
393608c71bfSMatthew G. Knepley 
39492f119d6SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr);
39592f119d6SBarry Smith     if (mlog) {
39692f119d6SBarry Smith       mdebug = PETSC_TRUE;
39792f119d6SBarry Smith     }
39879dccf82SBarry Smith     /* the next line is deprecated */
39992f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr);
40092f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr);
40192f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr);
40292f119d6SBarry Smith     if (mdebug) {
40392f119d6SBarry Smith       ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr);
40492f119d6SBarry Smith     }
40592f119d6SBarry Smith     if (mlog) {
40692f119d6SBarry Smith       PetscReal logthreshold = 0;
40792f119d6SBarry Smith       ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr);
40892f119d6SBarry Smith       ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr);
40992f119d6SBarry Smith     }
4108b254c29SBarry Smith #if defined(PETSC_USE_LOG)
4118b254c29SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr);
4128b254c29SBarry Smith #endif
41392f119d6SBarry Smith   }
41492f119d6SBarry Smith 
415ba282f50SJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr);
416ba282f50SJed Brown   if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);}
41790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
4182f21b5c6SHong Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr);
419cf6f3811SHong Zhang   /* ignore this option if malloc is already set */
420cf6f3811SHong Zhang   if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);}
421e5c89e4eSSatish Balay 
42290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
423c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr);
4247783f70dSSatish Balay   if (!flg1) {
42590d69ab7SBarry Smith     flg1 = PETSC_FALSE;
426c5929fdfSBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr);
4277783f70dSSatish Balay   }
428e5c89e4eSSatish Balay   if (flg1) {
429e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
430e5c89e4eSSatish Balay   }
43167584ceeSBarry Smith #endif
432e5c89e4eSSatish Balay 
433b4427426SBarry Smith #if defined(PETSC_USE_LOG)
434c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr);
435b4427426SBarry Smith #endif
43605df10baSBarry Smith 
437e5c89e4eSSatish Balay   /*
438e5c89e4eSSatish Balay       Set the display variable for graphics
439e5c89e4eSSatish Balay   */
440e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
441e5c89e4eSSatish Balay 
44251dcc849SKerry Stevens   /*
44357171095SVaclav Hapla      Print main application help message
44457171095SVaclav Hapla   */
44557171095SVaclav Hapla   ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr);
44657171095SVaclav Hapla   if (help && hasHelp) {
44757171095SVaclav Hapla     ierr = PetscPrintf(comm,help);CHKERRQ(ierr);
44857171095SVaclav Hapla     ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr);
44957171095SVaclav Hapla   }
45057171095SVaclav Hapla 
45157171095SVaclav Hapla   /*
452e5c89e4eSSatish Balay       Print the PETSc version information
453e5c89e4eSSatish Balay   */
454d314f959SVaclav Hapla   ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr);
455d314f959SVaclav Hapla   if (flg1 || hasHelp) {
456e5c89e4eSSatish Balay     /*
457e5c89e4eSSatish Balay        Print "higher-level" package version message
458e5c89e4eSSatish Balay     */
459e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
460e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
461e5c89e4eSSatish Balay     }
462e5c89e4eSSatish Balay 
463a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
464e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
465e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
466e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
46784e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
468e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
469e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
470c0bb3764SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr);
4717ca660e7SBarry Smith   }
4727ca660e7SBarry Smith 
47394941ca7SBarry Smith   /*
47494941ca7SBarry Smith        Print "higher-level" package help message
47594941ca7SBarry Smith   */
47657171095SVaclav Hapla   if (hasHelp) {
477d314f959SVaclav Hapla     PetscBool hasHelpIntro;
478d314f959SVaclav Hapla 
47994941ca7SBarry Smith     if (PetscExternalHelpFunction) {
48094941ca7SBarry Smith       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
48194941ca7SBarry Smith     }
482d314f959SVaclav Hapla     ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr);
483d314f959SVaclav Hapla     if (hasHelpIntro) {
484bdb346e9SBarry Smith       ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr);
485008a6e76SBarry Smith       ierr = PetscFreeMPIResources();CHKERRQ(ierr);
486ffc4695bSBarry Smith       ierr = MPI_Finalize();CHKERRMPI(ierr);
4877ca660e7SBarry Smith       exit(0);
4887ca660e7SBarry Smith     }
489e5c89e4eSSatish Balay   }
490e5c89e4eSSatish Balay 
491e5c89e4eSSatish Balay   /*
492e5c89e4eSSatish Balay       Setup the error handling
493e5c89e4eSSatish Balay   */
49490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
495c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr);
496b59baad1SJed Brown   if (flg1) {
497ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr);
49802c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
499b59baad1SJed Brown   }
50090d69ab7SBarry Smith   flg1 = PETSC_FALSE;
501c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr);
50202c9f0b5SLisandro Dalcin   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);}
50390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
504c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr);
505e5c89e4eSSatish Balay   if (flg1) {
506ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr);
507e5c89e4eSSatish Balay   }
50890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
509c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr);
5108d359177SBarry Smith   if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);}
511e5c89e4eSSatish Balay 
512e5c89e4eSSatish Balay   /*
513e5c89e4eSSatish Balay       Setup debugger information
514e5c89e4eSSatish Balay   */
515e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
516589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
517e5c89e4eSSatish Balay   if (flg1) {
518e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
519e5c89e4eSSatish Balay 
520e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
521ffc4695bSBarry Smith     ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr);
522ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
52302c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr);
524e5c89e4eSSatish Balay   }
525589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr);
5265e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
527589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
528589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr);
529e5c89e4eSSatish Balay   if (flg1 || flg2) {
530e5c89e4eSSatish Balay     PetscMPIInt    size;
531bf4d2887SBarry Smith     PetscInt       lsize,*ranks;
532e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
533e5c89e4eSSatish Balay     /*
534e5c89e4eSSatish Balay        we have to make sure that all processors have opened
535e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
536e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
537e5c89e4eSSatish Balay        and kill the program.
538e5c89e4eSSatish Balay     */
539ffc4695bSBarry Smith     ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
540e5c89e4eSSatish Balay     if (size > 2) {
541533163c2SBarry Smith       PetscMPIInt dummy = 0;
542e5c89e4eSSatish Balay       MPI_Status  status;
543e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
544e5c89e4eSSatish Balay         if (rank != i) {
545ffc4695bSBarry Smith           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr);
546e5c89e4eSSatish Balay         }
547e5c89e4eSSatish Balay       }
548e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
549e5c89e4eSSatish Balay         if (rank != i) {
550ffc4695bSBarry Smith           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr);
551e5c89e4eSSatish Balay         }
552e5c89e4eSSatish Balay       }
553e5c89e4eSSatish Balay     }
554e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
555bf4d2887SBarry Smith     ierr  = PetscMalloc1(size,&ranks);CHKERRQ(ierr);
556e5c89e4eSSatish Balay     lsize = size;
557bf4d2887SBarry Smith     /* Deprecated in 3.14 */
558bf4d2887SBarry Smith     ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr);
559bf4d2887SBarry Smith     if (flag) {
560bf4d2887SBarry Smith       const char * const quietopt="-options_suppress_deprecated_warnings";
561bf4d2887SBarry Smith       char               msg[4096];
562bf4d2887SBarry Smith       PetscBool          quiet = PETSC_FALSE;
563bf4d2887SBarry Smith 
564bf4d2887SBarry Smith       ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
565bf4d2887SBarry Smith       if (!quiet) {
566bf4d2887SBarry Smith         ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
567bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr);
568bf4d2887SBarry Smith         ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
569bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr);
570bf4d2887SBarry Smith         ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
571bf4d2887SBarry Smith         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
572bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr);
573bf4d2887SBarry Smith         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
574bf4d2887SBarry Smith         ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
575bf4d2887SBarry Smith         ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
576bf4d2887SBarry Smith         ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
577bf4d2887SBarry Smith         ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
578bf4d2887SBarry Smith       }
579bf4d2887SBarry Smith     } else {
580bf4d2887SBarry Smith       lsize = size;
581bf4d2887SBarry Smith       ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr);
582bf4d2887SBarry Smith     }
583e5c89e4eSSatish Balay     if (flag) {
584e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
585bf4d2887SBarry Smith         if (ranks[i] == rank) { flag = PETSC_FALSE; break; }
586e5c89e4eSSatish Balay       }
587e5c89e4eSSatish Balay     }
588e5c89e4eSSatish Balay     if (!flag) {
589e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
59002c9f0b5SLisandro Dalcin       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
591e5c89e4eSSatish Balay       if (flg1) {
592e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
593e5c89e4eSSatish Balay       } else {
594e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
595e5c89e4eSSatish Balay       }
596ffc4695bSBarry Smith       ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr);
597ffc4695bSBarry Smith       ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
5982a2a2941SBarry Smith     } else {
5992a2a2941SBarry Smith       ierr = PetscWaitOnError();CHKERRQ(ierr);
600e5c89e4eSSatish Balay     }
601bf4d2887SBarry Smith     ierr = PetscFree(ranks);CHKERRQ(ierr);
602e5c89e4eSSatish Balay   }
603e5c89e4eSSatish Balay 
604589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr);
605cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
606e5c89e4eSSatish Balay 
607e5c89e4eSSatish Balay   /*
608e5c89e4eSSatish Balay         Setup profiling and logging
609e5c89e4eSSatish Balay   */
6106cf91177SBarry Smith #if defined(PETSC_USE_INFO)
6118bb29257SSatish Balay   {
612e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr);
613e5c89e4eSSatish Balay   }
614865f6aa8SSatish Balay #endif
615aba4c478SBarry Smith   ierr = PetscDetermineInitialFPTrap();
616cc9df77eSBarry Smith   flg1 = PETSC_FALSE;
617cc9df77eSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr);
618cc9df77eSBarry Smith   if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);}
619cc9df77eSBarry Smith   ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr);
620cc9df77eSBarry Smith   if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);}
621865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
622865f6aa8SSatish Balay   mname[0] = 0;
623589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
624865f6aa8SSatish Balay   if (flg1) {
625865f6aa8SSatish Balay     if (mname[0]) {
626f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
627865f6aa8SSatish Balay     } else {
628706d7a88SBarry Smith       ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr);
629865f6aa8SSatish Balay     }
630865f6aa8SSatish Balay   }
631217044c2SLisandro Dalcin 
632217044c2SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr);
633217044c2SLisandro Dalcin 
634e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
63590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
636c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
637495fc317SBarry Smith   if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);}
638e5c89e4eSSatish Balay #endif
63990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
64090d69ab7SBarry Smith   flg3 = PETSC_FALSE;
641c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr);
642c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
643e5c89e4eSSatish Balay   if (flg1)                      { ierr = PetscLogAllBegin();CHKERRQ(ierr); }
644bb1d7374SBarry Smith   else if (flg3)                 { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);}
645e5c89e4eSSatish Balay 
646589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
647e5c89e4eSSatish Balay   if (flg1) {
648e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
649e5c89e4eSSatish Balay     FILE *file;
650e5c89e4eSSatish Balay     if (mname[0]) {
6512e924ca5SSatish Balay       PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank);
652e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
653e5c89e4eSSatish Balay       file = fopen(fname,"w");
654f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
655a297a907SKarl Rupp     } else file = PETSC_STDOUT;
656e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
657e5c89e4eSSatish Balay   }
658bb1d7374SBarry Smith 
65916413a6aSBarry Smith   ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr);
660bb1d7374SBarry Smith   if (flg4) {
661d0a29bd7SConnor Ward     if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
662bb1d7374SBarry Smith       ierr = PetscLogNestedBegin();CHKERRQ(ierr);
663bb1d7374SBarry Smith     } else {
664bb1d7374SBarry Smith       ierr = PetscLogDefaultBegin();CHKERRQ(ierr);
665bb1d7374SBarry Smith     }
666eccbb886SLisandro Dalcin   }
667d0a29bd7SConnor Ward   if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) {
668eccbb886SLisandro Dalcin     PetscReal threshold = PetscRealConstant(0.01);
669eccbb886SLisandro Dalcin     ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr);
670eccbb886SLisandro Dalcin     if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);}
671bb1d7374SBarry Smith   }
672e5c89e4eSSatish Balay #endif
673e5c89e4eSSatish Balay 
674c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr);
67505035670SJunchao Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr);
6768d4e85a7SStefano Zampini   /*
67705035670SJunchao Zhang     If collecting logging information, by default, wait for device to complete its operations
6788d4e85a7SStefano Zampini     before returning to the CPU in order to get accurate timings of each event
6798d4e85a7SStefano Zampini   */
680cae85d06SJunchao Zhang   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr);
68105035670SJunchao Zhang   if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);}
6828d4e85a7SStefano Zampini 
68305035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
68405035670SJunchao Zhang   ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr);
68505035670SJunchao Zhang #endif
686cae85d06SJunchao Zhang 
68705035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
68805035670SJunchao Zhang   ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr);
6894b0a73b2SBarry Smith #endif
6904b0a73b2SBarry Smith 
691e5c89e4eSSatish Balay   /*
692e5c89e4eSSatish Balay        Print basic help message
693e5c89e4eSSatish Balay   */
69457171095SVaclav Hapla   if (hasHelp) {
695e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
696d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr);
697d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr);
698d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr);
699301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
700301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
701e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
702e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
703e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
704e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
705e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
706e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
707e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
708bf4d2887SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr);
709e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
710e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
711e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
7121cda70a7SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr);
713e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
714e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
715e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
716e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
717e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
71879dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr);
71979dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr);
7204161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
72192f119d6SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr);
72279dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr);
72326a7e8d4SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr);
724e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
725e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
726e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
727e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
728a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
7290841954dSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr);
730e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
731e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
732185ae32fSMatthew G. Knepley     ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr);
733e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
73456071f75SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr);
735e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
736495fc317SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr);
737e5c89e4eSSatish Balay #endif
738e94e781bSJacob Faibussowitsch #endif
739e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO)
740fe9b927eSVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr);
741e5c89e4eSSatish Balay #endif
742e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
743c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr);
744c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr);
745e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
746e5c89e4eSSatish Balay   }
747e5c89e4eSSatish Balay 
74874ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN)
74974ba8654SBarry Smith   {
75074ba8654SBarry Smith   char machine[128];
751589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr);
75274ba8654SBarry Smith   if (flg1) {
75374ba8654SBarry Smith     ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr);
75474ba8654SBarry Smith   }
75574ba8654SBarry Smith   }
75674ba8654SBarry Smith #endif
75774ba8654SBarry Smith 
758c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
759e5c89e4eSSatish Balay   if (flg1) {
760e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
761e5c89e4eSSatish Balay   }
762e5c89e4eSSatish Balay 
763fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL)
764c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
765f14045dbSBarry Smith   if (!flg3) {
766c5929fdfSBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr);
767f14045dbSBarry Smith   }
768c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr);
769f14045dbSBarry Smith   PetscViennaCLSynchronize = flg3;
770fdc842d1SBarry Smith   ierr = PetscViennaCLInit();CHKERRQ(ierr);
7714cf1874eSKarl Rupp #endif
77282f73ecaSAlejandro Lamas Daviña 
773fdc842d1SBarry Smith   /*
774fdc842d1SBarry Smith      Creates the logging data structures; this is enabled even if logging is not turned on
775fdc842d1SBarry Smith      This is the last thing we do before returning to the user code to prevent having the
776fdc842d1SBarry Smith      logging numbers contaminated by any startup time associated with MPI and the GPUs
777fdc842d1SBarry Smith   */
778fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
779fdc842d1SBarry Smith   ierr = PetscLogInitialize();CHKERRQ(ierr);
780f0a7718cSKarl Rupp #endif
781f0a7718cSKarl Rupp 
782e5c89e4eSSatish Balay   PetscFunctionReturn(0);
783e5c89e4eSSatish Balay }
784