xref: /petsc/src/sys/objects/init.c (revision 23622779405b3279476b12f00df30cbe6e2b70e5)
1e5c89e4eSSatish Balay /*
2e5c89e4eSSatish Balay 
3e5c89e4eSSatish Balay    This file defines part of the initialization of PETSc
4e5c89e4eSSatish Balay 
5540e20f2SPierre Jolivet   This file uses regular malloc and free because it cannot be known
6e5c89e4eSSatish Balay   what malloc is being used until it has already processed the input.
7e5c89e4eSSatish Balay */
8ef386f4bSSatish Balay 
9ef386f4bSSatish Balay #include <petscsys.h>        /*I  "petscsys.h"   I*/
10f67a399dSBarry Smith #include <petsc/private/petscimpl.h>
11022afb99SBarry Smith #include <petscvalgrind.h>
12665c2dedSJed Brown #include <petscviewer.h>
13fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
14fdc842d1SBarry Smith PETSC_INTERN PetscErrorCode PetscLogInitialize(void);
15fdc842d1SBarry Smith #endif
16ef386f4bSSatish Balay 
17ba61063dSBarry Smith #if defined(PETSC_HAVE_SYS_SYSINFO_H)
1851d315f7SKerry Stevens #include <sys/sysinfo.h>
19ba61063dSBarry Smith #endif
20121deb67SSatish Balay #if defined(PETSC_HAVE_UNISTD_H)
2151d315f7SKerry Stevens #include <unistd.h>
22121deb67SSatish Balay #endif
2305035670SJunchao Zhang 
24d9b72601SDominic Meiser #if defined(PETSC_HAVE_CUDA)
25d9b72601SDominic Meiser   #include <cuda_runtime.h>
26*23622779SBarry Smith   #include <cuda_runtime_api.h>
27*23622779SBarry Smith   #include <cuda_device_runtime_api.h>
287fd2f626SJose E. Roman   #include <petsccublas.h>
2905035670SJunchao Zhang #endif
3005035670SJunchao Zhang 
3105035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
3205035670SJunchao Zhang   #include <hip/hip_runtime.h>
3305035670SJunchao Zhang #endif
3405035670SJunchao Zhang 
3505035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
36c2a741eeSJunchao Zhang   #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
37c2a741eeSJunchao Zhang     #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */
38c2a741eeSJunchao Zhang   #endif
39d9b72601SDominic Meiser #endif
40555d055bSBarry Smith 
41f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL)
42f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit();
43f0a7718cSKarl Rupp #endif
44f0a7718cSKarl Rupp 
4505035670SJunchao Zhang 
46e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/
47e5c89e4eSSatish Balay /*
48e5c89e4eSSatish Balay      Indicates if PETSc started up MPI, or it was
49e5c89e4eSSatish Balay    already started before PETSc was initialized.
50e5c89e4eSSatish Balay */
510cbf60d0SJose E. Roman PetscBool   PetscBeganMPI                 = PETSC_FALSE;
528ad20175SVaclav Hapla PetscBool   PetscErrorHandlingInitialized = PETSC_FALSE;
530cbf60d0SJose E. Roman PetscBool   PetscInitializeCalled         = PETSC_FALSE;
540cbf60d0SJose E. Roman PetscBool   PetscFinalizeCalled           = PETSC_FALSE;
55d6f2c3cbSBarry Smith 
567087cfbeSBarry Smith PetscMPIInt PetscGlobalRank               = -1;
577087cfbeSBarry Smith PetscMPIInt PetscGlobalSize               = -1;
58ba61063dSBarry Smith 
59c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS)
60c2b86a48SJunchao Zhang PetscBool   PetscBeganKokkos              = PETSC_FALSE;
61c2b86a48SJunchao Zhang #endif
62c2b86a48SJunchao Zhang 
6371438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
6471438e86SJunchao Zhang PetscBool   PetscBeganNvshmem             = PETSC_FALSE;
6571438e86SJunchao Zhang PetscBool   PetscNvshmemInitialized       = PETSC_FALSE;
6671438e86SJunchao Zhang #endif
6771438e86SJunchao Zhang 
68c2a741eeSJunchao Zhang PetscBool   use_gpu_aware_mpi             = PETSC_TRUE;
69928a6601SJunchao Zhang PetscBool   PetscCreatedGpuObjects        = PETSC_FALSE;
70c2a741eeSJunchao Zhang 
7150f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX)
72e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
73e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
74e5c89e4eSSatish Balay #endif
758619c96cSJed Brown 
768619c96cSJed Brown /*MC
778619c96cSJed Brown    PETSC_i - the imaginary number i
788619c96cSJed Brown 
798619c96cSJed Brown    Synopsis:
808619c96cSJed Brown    #include <petscsys.h>
818619c96cSJed Brown    PetscComplex PETSC_i;
828619c96cSJed Brown 
838619c96cSJed Brown    Level: beginner
848619c96cSJed Brown 
858619c96cSJed Brown    Note:
868cd53115SBarry Smith    Complex numbers are automatically available if PETSc located a working complex implementation
878619c96cSJed Brown 
888619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex()
898619c96cSJed Brown M*/
9050f81f78SJed Brown PetscComplex PETSC_i;
917a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0;
927a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */
93ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
94c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0;
95570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
96570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0;
97c90a1750SBarry Smith #endif
987087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0;
990354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES)
1007087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0;
10144041f26SJed Brown #endif
1028ad47952SJed Brown MPI_Datatype MPIU_BOOL;
1038ad47952SJed Brown MPI_Datatype MPIU_ENUM;
1047cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR;
105e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T;
10675567043SBarry Smith 
107e5c89e4eSSatish Balay /*
108e5c89e4eSSatish Balay        Function that is called to display all error messages
109e5c89e4eSSatish Balay */
1107087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
1117087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
1127087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
113bab1f7e6SVictor Minden /*
1144cf1874eSKarl Rupp   This is needed to turn on/off GPU synchronization
1158b5db460SBarry Smith */
1164cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE;
117bab1f7e6SVictor Minden 
118e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
119e5c89e4eSSatish Balay /*
120e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
121e5c89e4eSSatish Balay */
12295c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
1230298fd71SBarry Smith FILE *petsc_history = NULL;
124e5c89e4eSSatish Balay 
1257087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
126e5c89e4eSSatish Balay {
127e5c89e4eSSatish Balay   PetscErrorCode ierr;
128e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
129e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
130e5c89e4eSSatish Balay   char           version[256];
131e5c89e4eSSatish Balay 
132e5c89e4eSSatish Balay   PetscFunctionBegin;
133ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
134e5c89e4eSSatish Balay   if (!rank) {
135e5c89e4eSSatish Balay     char        arch[10];
136f56c2debSBarry Smith     int         err;
137f56c2debSBarry Smith 
138e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
139e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
140a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
141ffc4695bSBarry Smith     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
142e5c89e4eSSatish Balay     if (filename) {
143e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
144e5c89e4eSSatish Balay     } else {
145589a23caSBarry Smith       ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr);
146589a23caSBarry Smith       ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr);
147e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
148e5c89e4eSSatish Balay     }
149e5c89e4eSSatish Balay 
150a297a907SKarl Rupp     *fd = fopen(fname,"a");
151a297a907SKarl Rupp     if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
152a297a907SKarl Rupp 
153c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
154e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
155589a23caSBarry Smith     ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
156e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
157c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
158a297a907SKarl Rupp 
159f56c2debSBarry Smith     err = fflush(*fd);
160e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
161e5c89e4eSSatish Balay   }
162e5c89e4eSSatish Balay   PetscFunctionReturn(0);
163e5c89e4eSSatish Balay }
164e5c89e4eSSatish Balay 
16595c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd)
166e5c89e4eSSatish Balay {
167e5c89e4eSSatish Balay   PetscErrorCode ierr;
168e5c89e4eSSatish Balay   PetscMPIInt    rank;
169e5c89e4eSSatish Balay   char           date[64];
170f56c2debSBarry Smith   int            err;
171e5c89e4eSSatish Balay 
172e5c89e4eSSatish Balay   PetscFunctionBegin;
173ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
174e5c89e4eSSatish Balay   if (!rank) {
175e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
176c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
177e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
178c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
179f56c2debSBarry Smith     err  = fflush(*fd);
180e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
181f56c2debSBarry Smith     err = fclose(*fd);
182e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
183e5c89e4eSSatish Balay   }
184e5c89e4eSSatish Balay   PetscFunctionReturn(0);
185e5c89e4eSSatish Balay }
186e5c89e4eSSatish Balay 
187e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
188e5c89e4eSSatish Balay 
189e5c89e4eSSatish Balay /*
190e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
191e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
192e5c89e4eSSatish Balay 
193e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1943c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1953c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
196e5c89e4eSSatish Balay */
197e5c89e4eSSatish Balay 
19833c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
199e5c89e4eSSatish Balay {
200e5c89e4eSSatish Balay   PetscFunctionBegin;
2013c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
202e5c89e4eSSatish Balay   abort();
203e5c89e4eSSatish Balay }
204e5c89e4eSSatish Balay 
20533c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
206e5c89e4eSSatish Balay {
207e5c89e4eSSatish Balay   PetscErrorCode ierr;
208e5c89e4eSSatish Balay 
209e5c89e4eSSatish Balay   PetscFunctionBegin;
2103c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
211e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
21241e02c4dSJunchao Zhang   if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */
213e5c89e4eSSatish Balay }
214e5c89e4eSSatish Balay 
215e5c89e4eSSatish Balay /*@C
216e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
217e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
218e5c89e4eSSatish Balay 
219e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
220e5c89e4eSSatish Balay 
221e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
222e5c89e4eSSatish Balay 
223e5c89e4eSSatish Balay    Level: advanced
224e5c89e4eSSatish Balay 
225e5c89e4eSSatish Balay    Note:
226e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
227e5c89e4eSSatish Balay 
22888c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
229e5c89e4eSSatish Balay @*/
2307087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
231e5c89e4eSSatish Balay {
232e5c89e4eSSatish Balay   PetscFunctionBegin;
233e5c89e4eSSatish Balay   PetscFinalize();
234e5c89e4eSSatish Balay   exit(0);
235e5c89e4eSSatish Balay   return 0;
236e5c89e4eSSatish Balay }
237e5c89e4eSSatish Balay 
238ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE;
23995c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void);
24095c0884eSLisandro Dalcin PETSC_INTERN PetscBool      petscsetmallocvisited;
241e5c89e4eSSatish Balay static       char           emacsmachinename[256];
242e5c89e4eSSatish Balay 
24302c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL;
24402c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = NULL;
245e5c89e4eSSatish Balay 
246e5c89e4eSSatish Balay /*@C
247e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
248e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
249e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
250e5c89e4eSSatish Balay 
251e5c89e4eSSatish Balay    Input Parameter:
2520298fd71SBarry Smith +  help - the help function (may be NULL)
2530298fd71SBarry Smith -  version - the version function (may be NULL)
254e5c89e4eSSatish Balay 
255e5c89e4eSSatish Balay    Level: developer
256e5c89e4eSSatish Balay 
257e5c89e4eSSatish Balay @*/
2587087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
259e5c89e4eSSatish Balay {
260e5c89e4eSSatish Balay   PetscFunctionBegin;
261e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
262e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
263e5c89e4eSSatish Balay   PetscFunctionReturn(0);
264e5c89e4eSSatish Balay }
265e5c89e4eSSatish Balay 
26605df10baSBarry Smith #if defined(PETSC_USE_LOG)
26795c0884eSLisandro Dalcin PETSC_INTERN PetscBool   PetscObjectsLog;
26805df10baSBarry Smith #endif
26905df10baSBarry Smith 
27005035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP.
27105035670SJunchao Zhang    Use the following macros to define CUDA/HIP initialization related vars/routines.
27205035670SJunchao Zhang  */
27305035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
27405035670SJunchao Zhang   typedef cudaError_t                             cupmError_t;
27505035670SJunchao Zhang   typedef struct cudaDeviceProp                   cupmDeviceProp;
276a0e72f99SJunchao Zhang   typedef cudaStream_t                            cupmStream_t;
2779ffd0706SHong Zhang   typedef cudaEvent_t                             cupmEvent_t;
27805035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   cudaGetDeviceCount(x)
27905035670SJunchao Zhang   #define cupmGetDevice(x)                        cudaGetDevice(x)
28005035670SJunchao Zhang   #define cupmSetDevice(x)                        cudaSetDevice(x)
28105035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   cudaSetDeviceFlags(x)
28205035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            cudaGetDeviceProperties(x,y)
283a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     cudaStreamCreate(x)
28405035670SJunchao Zhang   #define cupmGetLastError()                      cudaGetLastError()
28505035670SJunchao Zhang   #define cupmDeviceMapHost                       cudaDeviceMapHost
28605035670SJunchao Zhang   #define cupmSuccess                             cudaSuccess
287e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               cudaErrorMemoryAllocation
288e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           cudaErrorLaunchOutOfResources
28905035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             cudaErrorSetOnActiveProcess
29005035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRCUDA(x)
29105035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         PetscCUBLASInitializeHandle()
29205035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     PetscCUSOLVERDnInitializeHandle()
29305035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscCUDAInitialize
29405035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscCUDAInitialized
29505035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscCUDAInitializeCheck
29605035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscCUDAInitializeAndView
29705035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscCUDASynchronize
29805035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseCUDA
29905035670SJunchao Zhang   #define cupmOptionsStr                          "CUDA options"
3004dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-cuda_device"
30105035670SJunchao Zhang   #define cupmViewStr                             "-cuda_view"
30205035670SJunchao Zhang   #define cupmSynchronizeStr                      "-cuda_synchronize"
30305035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscCUDAInitialize"
30405035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckCUDA
30505035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPICUDAAwarenessCheck
306a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultCudaStream
3079ffd0706SHong Zhang   #define cupmEventCreate(x)                      cudaEventCreate(x)
30805035670SJunchao Zhang   #include "cupminit.inc"
30905035670SJunchao Zhang #endif
31005035670SJunchao Zhang 
31105035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
31205035670SJunchao Zhang   typedef hipError_t                              cupmError_t;
31305035670SJunchao Zhang   typedef hipDeviceProp_t                         cupmDeviceProp;
314a0e72f99SJunchao Zhang   typedef hipStream_t                             cupmStream_t;
3159ffd0706SHong Zhang   typedef hipEvent_t                              cupmEvent_t;
31605035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   hipGetDeviceCount(x)
31705035670SJunchao Zhang   #define cupmGetDevice(x)                        hipGetDevice(x)
31805035670SJunchao Zhang   #define cupmSetDevice(x)                        hipSetDevice(x)
31905035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   hipSetDeviceFlags(x)
32005035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            hipGetDeviceProperties(x,y)
321a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     hipStreamCreate(x)
3229ffd0706SHong Zhang   #define cupmEventCreate(x)                      hipEventCreate(x);
32305035670SJunchao Zhang   #define cupmGetLastError()                      hipGetLastError()
32405035670SJunchao Zhang   #define cupmDeviceMapHost                       hipDeviceMapHost
32505035670SJunchao Zhang   #define cupmSuccess                             hipSuccess
326e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               hipErrorMemoryAllocation
327e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           hipErrorLaunchOutOfResources
32805035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             hipErrorSetOnActiveProcess
32905035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB)
33005035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         0
33105035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     0
33205035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscHIPInitialize
33305035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscHIPInitialized
33405035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscHIPInitializeCheck
33505035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscHIPInitializeAndView
33605035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscHIPSynchronize
33705035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseHIP
33805035670SJunchao Zhang   #define cupmOptionsStr                          "HIP options"
3394dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-hip_device"
34005035670SJunchao Zhang   #define cupmViewStr                             "-hip_view"
34105035670SJunchao Zhang   #define cupmSynchronizeStr                      "-hip_synchronize"
34205035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscHIPInitialize"
34305035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckHIP
34405035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPIHIPAwarenessCheck
345a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultHipStream
34605035670SJunchao Zhang   #include "cupminit.inc"
34705035670SJunchao Zhang #endif
34805035670SJunchao Zhang 
34957171095SVaclav Hapla PETSC_INTERN PetscErrorCode  PetscOptionsCheckInitial_Private(const char help[])
350e5c89e4eSSatish Balay {
351e5ed2c37SJose E. Roman   char              string[64];
352e5c89e4eSSatish Balay   MPI_Comm          comm = PETSC_COMM_WORLD;
35305035670SJunchao Zhang   PetscBool         flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView;
354e5c89e4eSSatish Balay   PetscErrorCode    ierr;
35567584ceeSBarry Smith   PetscReal         si;
35628559dc8SJed Brown   PetscInt          intensity;
357e5c89e4eSSatish Balay   int               i;
358e5c89e4eSSatish Balay   PetscMPIInt       rank;
359d314f959SVaclav Hapla   char              version[256];
3602479a3a6SBarry Smith #if defined(PETSC_USE_LOG)
361e5ed2c37SJose E. Roman   char              mname[PETSC_MAX_PATH_LEN];
3622479a3a6SBarry Smith   PetscViewerFormat format;
36367584ceeSBarry Smith   PetscBool         flg4 = PETSC_FALSE;
36467584ceeSBarry Smith #endif
3657381773fSBarry Smith 
366e5c89e4eSSatish Balay   PetscFunctionBegin;
367ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
368e5c89e4eSSatish Balay 
36967584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
37092f119d6SBarry Smith   if (!(PETSC_RUNNING_ON_VALGRIND)) {
371e5c89e4eSSatish Balay     /*
372e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
373e5c89e4eSSatish Balay     */
374244bdbccSBarry Smith     PetscBool         mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE;
37592f119d6SBarry Smith 
37676bd3646SJed Brown     if (PetscDefined(USE_DEBUG)) {
37792f119d6SBarry Smith       mdebug        = PETSC_TRUE;
37892f119d6SBarry Smith       initializenan = PETSC_TRUE;
37992f119d6SBarry Smith       ierr   = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38076bd3646SJed Brown     } else {
38192f119d6SBarry Smith       /* don't warn about unused option */
38292f119d6SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38392f119d6SBarry Smith       flg1 = PETSC_FALSE;
38476bd3646SJed Brown     }
38579dccf82SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr);
38692f119d6SBarry Smith     if (flg1 || flg2) {
38792f119d6SBarry Smith       mdebug        = PETSC_TRUE;
38892f119d6SBarry Smith       eachcall      = PETSC_TRUE;
38992f119d6SBarry Smith       initializenan = PETSC_TRUE;
39079dccf82SBarry Smith     } else if (flg3 && !flg2) {
39179dccf82SBarry Smith       mdebug        = PETSC_FALSE;
39279dccf82SBarry Smith       eachcall      = PETSC_FALSE;
39379dccf82SBarry Smith       initializenan = PETSC_FALSE;
394e5c89e4eSSatish Balay     }
39592f119d6SBarry Smith 
396608c71bfSMatthew G. Knepley     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr);
397608c71bfSMatthew G. Knepley     if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);}
398608c71bfSMatthew G. Knepley 
39992f119d6SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr);
40092f119d6SBarry Smith     if (mlog) {
40192f119d6SBarry Smith       mdebug = PETSC_TRUE;
40292f119d6SBarry Smith     }
40379dccf82SBarry Smith     /* the next line is deprecated */
40492f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr);
40592f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr);
40692f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr);
40792f119d6SBarry Smith     if (mdebug) {
40892f119d6SBarry Smith       ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr);
40992f119d6SBarry Smith     }
41092f119d6SBarry Smith     if (mlog) {
41192f119d6SBarry Smith       PetscReal logthreshold = 0;
41292f119d6SBarry Smith       ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr);
41392f119d6SBarry Smith       ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr);
41492f119d6SBarry Smith     }
4158b254c29SBarry Smith #if defined(PETSC_USE_LOG)
4168b254c29SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr);
4178b254c29SBarry Smith #endif
41892f119d6SBarry Smith   }
41992f119d6SBarry Smith 
420ba282f50SJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr);
421ba282f50SJed Brown   if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);}
42290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
4232f21b5c6SHong Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr);
424cf6f3811SHong Zhang   /* ignore this option if malloc is already set */
425cf6f3811SHong Zhang   if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);}
426e5c89e4eSSatish Balay 
42790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
428c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr);
4297783f70dSSatish Balay   if (!flg1) {
43090d69ab7SBarry Smith     flg1 = PETSC_FALSE;
431c5929fdfSBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr);
4327783f70dSSatish Balay   }
433e5c89e4eSSatish Balay   if (flg1) {
434e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
435e5c89e4eSSatish Balay   }
43667584ceeSBarry Smith #endif
437e5c89e4eSSatish Balay 
438b4427426SBarry Smith #if defined(PETSC_USE_LOG)
439c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr);
440b4427426SBarry Smith #endif
44105df10baSBarry Smith 
442e5c89e4eSSatish Balay   /*
443e5c89e4eSSatish Balay       Set the display variable for graphics
444e5c89e4eSSatish Balay   */
445e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
446e5c89e4eSSatish Balay 
44751dcc849SKerry Stevens   /*
44857171095SVaclav Hapla      Print main application help message
44957171095SVaclav Hapla   */
45057171095SVaclav Hapla   ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr);
45157171095SVaclav Hapla   if (help && hasHelp) {
45257171095SVaclav Hapla     ierr = PetscPrintf(comm,help);CHKERRQ(ierr);
45357171095SVaclav Hapla     ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr);
45457171095SVaclav Hapla   }
45557171095SVaclav Hapla 
45657171095SVaclav Hapla   /*
457e5c89e4eSSatish Balay       Print the PETSc version information
458e5c89e4eSSatish Balay   */
459d314f959SVaclav Hapla   ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr);
460d314f959SVaclav Hapla   if (flg1 || hasHelp) {
461e5c89e4eSSatish Balay     /*
462e5c89e4eSSatish Balay        Print "higher-level" package version message
463e5c89e4eSSatish Balay     */
464e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
465e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
466e5c89e4eSSatish Balay     }
467e5c89e4eSSatish Balay 
468a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
469e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
470e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
471e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
47284e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
473e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
474e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
475c0bb3764SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr);
4767ca660e7SBarry Smith   }
4777ca660e7SBarry Smith 
47894941ca7SBarry Smith   /*
47994941ca7SBarry Smith        Print "higher-level" package help message
48094941ca7SBarry Smith   */
48157171095SVaclav Hapla   if (hasHelp) {
482d314f959SVaclav Hapla     PetscBool hasHelpIntro;
483d314f959SVaclav Hapla 
48494941ca7SBarry Smith     if (PetscExternalHelpFunction) {
48594941ca7SBarry Smith       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
48694941ca7SBarry Smith     }
487d314f959SVaclav Hapla     ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr);
488d314f959SVaclav Hapla     if (hasHelpIntro) {
489bdb346e9SBarry Smith       ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr);
490008a6e76SBarry Smith       ierr = PetscFreeMPIResources();CHKERRQ(ierr);
491ffc4695bSBarry Smith       ierr = MPI_Finalize();CHKERRMPI(ierr);
4927ca660e7SBarry Smith       exit(0);
4937ca660e7SBarry Smith     }
494e5c89e4eSSatish Balay   }
495e5c89e4eSSatish Balay 
496e5c89e4eSSatish Balay   /*
497e5c89e4eSSatish Balay       Setup the error handling
498e5c89e4eSSatish Balay   */
49990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
500c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr);
501b59baad1SJed Brown   if (flg1) {
502ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr);
50302c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
504b59baad1SJed Brown   }
50590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
506c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr);
50702c9f0b5SLisandro Dalcin   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);}
50890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
509c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr);
510e5c89e4eSSatish Balay   if (flg1) {
511ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr);
512e5c89e4eSSatish Balay   }
51390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
514c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr);
5158d359177SBarry Smith   if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);}
516e5c89e4eSSatish Balay 
517e5c89e4eSSatish Balay   /*
518e5c89e4eSSatish Balay       Setup debugger information
519e5c89e4eSSatish Balay   */
520e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
521589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
522e5c89e4eSSatish Balay   if (flg1) {
523e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
524e5c89e4eSSatish Balay 
525e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
526ffc4695bSBarry Smith     ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr);
527ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
52802c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr);
529e5c89e4eSSatish Balay   }
530589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr);
5315e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
532589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
533589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr);
534e5c89e4eSSatish Balay   if (flg1 || flg2) {
535e5c89e4eSSatish Balay     PetscMPIInt    size;
536bf4d2887SBarry Smith     PetscInt       lsize,*ranks;
537e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
538e5c89e4eSSatish Balay     /*
539e5c89e4eSSatish Balay        we have to make sure that all processors have opened
540e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
541e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
542e5c89e4eSSatish Balay        and kill the program.
543e5c89e4eSSatish Balay     */
544ffc4695bSBarry Smith     ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
545e5c89e4eSSatish Balay     if (size > 2) {
546533163c2SBarry Smith       PetscMPIInt dummy = 0;
547e5c89e4eSSatish Balay       MPI_Status  status;
548e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
549e5c89e4eSSatish Balay         if (rank != i) {
550ffc4695bSBarry Smith           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr);
551e5c89e4eSSatish Balay         }
552e5c89e4eSSatish Balay       }
553e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
554e5c89e4eSSatish Balay         if (rank != i) {
555ffc4695bSBarry Smith           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr);
556e5c89e4eSSatish Balay         }
557e5c89e4eSSatish Balay       }
558e5c89e4eSSatish Balay     }
559e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
560bf4d2887SBarry Smith     ierr  = PetscMalloc1(size,&ranks);CHKERRQ(ierr);
561e5c89e4eSSatish Balay     lsize = size;
562bf4d2887SBarry Smith     /* Deprecated in 3.14 */
563bf4d2887SBarry Smith     ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr);
564bf4d2887SBarry Smith     if (flag) {
565bf4d2887SBarry Smith       const char * const quietopt="-options_suppress_deprecated_warnings";
566bf4d2887SBarry Smith       char               msg[4096];
567bf4d2887SBarry Smith       PetscBool          quiet = PETSC_FALSE;
568bf4d2887SBarry Smith 
569bf4d2887SBarry Smith       ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
570bf4d2887SBarry Smith       if (!quiet) {
571bf4d2887SBarry Smith         ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
572bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr);
573bf4d2887SBarry Smith         ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
574bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr);
575bf4d2887SBarry Smith         ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
576bf4d2887SBarry Smith         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
577bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr);
578bf4d2887SBarry Smith         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
579bf4d2887SBarry Smith         ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
580bf4d2887SBarry Smith         ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
581bf4d2887SBarry Smith         ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
582bf4d2887SBarry Smith         ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
583bf4d2887SBarry Smith       }
584bf4d2887SBarry Smith     } else {
585bf4d2887SBarry Smith       lsize = size;
586bf4d2887SBarry Smith       ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr);
587bf4d2887SBarry Smith     }
588e5c89e4eSSatish Balay     if (flag) {
589e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
590bf4d2887SBarry Smith         if (ranks[i] == rank) { flag = PETSC_FALSE; break; }
591e5c89e4eSSatish Balay       }
592e5c89e4eSSatish Balay     }
593e5c89e4eSSatish Balay     if (!flag) {
594e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
59502c9f0b5SLisandro Dalcin       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
596e5c89e4eSSatish Balay       if (flg1) {
597e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
598e5c89e4eSSatish Balay       } else {
599e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
600e5c89e4eSSatish Balay       }
601ffc4695bSBarry Smith       ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr);
602ffc4695bSBarry Smith       ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
6032a2a2941SBarry Smith     } else {
6042a2a2941SBarry Smith       ierr = PetscWaitOnError();CHKERRQ(ierr);
605e5c89e4eSSatish Balay     }
606bf4d2887SBarry Smith     ierr = PetscFree(ranks);CHKERRQ(ierr);
607e5c89e4eSSatish Balay   }
608e5c89e4eSSatish Balay 
609589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr);
610cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
611e5c89e4eSSatish Balay 
612e5c89e4eSSatish Balay   /*
613e5c89e4eSSatish Balay         Setup profiling and logging
614e5c89e4eSSatish Balay   */
6156cf91177SBarry Smith #if defined(PETSC_USE_INFO)
6168bb29257SSatish Balay   {
617e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr);
618e5c89e4eSSatish Balay   }
619865f6aa8SSatish Balay #endif
620aba4c478SBarry Smith   ierr = PetscDetermineInitialFPTrap();
621cc9df77eSBarry Smith   flg1 = PETSC_FALSE;
622cc9df77eSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr);
623cc9df77eSBarry Smith   if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);}
624cc9df77eSBarry Smith   ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr);
625cc9df77eSBarry Smith   if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);}
626865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
627865f6aa8SSatish Balay   mname[0] = 0;
628589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
629865f6aa8SSatish Balay   if (flg1) {
630865f6aa8SSatish Balay     if (mname[0]) {
631f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
632865f6aa8SSatish Balay     } else {
633706d7a88SBarry Smith       ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr);
634865f6aa8SSatish Balay     }
635865f6aa8SSatish Balay   }
636217044c2SLisandro Dalcin 
637217044c2SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr);
638217044c2SLisandro Dalcin 
639e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
64090d69ab7SBarry Smith   flg1 = PETSC_FALSE;
641c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
642495fc317SBarry Smith   if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);}
643e5c89e4eSSatish Balay #endif
64490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
64590d69ab7SBarry Smith   flg3 = PETSC_FALSE;
646c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr);
647c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
648e5c89e4eSSatish Balay   if (flg1)                      { ierr = PetscLogAllBegin();CHKERRQ(ierr); }
649bb1d7374SBarry Smith   else if (flg3)                 { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);}
650e5c89e4eSSatish Balay 
651589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
652e5c89e4eSSatish Balay   if (flg1) {
653e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
654e5c89e4eSSatish Balay     FILE *file;
655e5c89e4eSSatish Balay     if (mname[0]) {
6562e924ca5SSatish Balay       PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank);
657e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
658e5c89e4eSSatish Balay       file = fopen(fname,"w");
659f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
660a297a907SKarl Rupp     } else file = PETSC_STDOUT;
661e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
662e5c89e4eSSatish Balay   }
663bb1d7374SBarry Smith 
66416413a6aSBarry Smith   ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr);
665bb1d7374SBarry Smith   if (flg4) {
666d0a29bd7SConnor Ward     if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
667bb1d7374SBarry Smith       ierr = PetscLogNestedBegin();CHKERRQ(ierr);
668bb1d7374SBarry Smith     } else {
669bb1d7374SBarry Smith       ierr = PetscLogDefaultBegin();CHKERRQ(ierr);
670bb1d7374SBarry Smith     }
671eccbb886SLisandro Dalcin   }
672d0a29bd7SConnor Ward   if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) {
673eccbb886SLisandro Dalcin     PetscReal threshold = PetscRealConstant(0.01);
674eccbb886SLisandro Dalcin     ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr);
675eccbb886SLisandro Dalcin     if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);}
676bb1d7374SBarry Smith   }
677e5c89e4eSSatish Balay #endif
678e5c89e4eSSatish Balay 
679c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr);
68005035670SJunchao Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr);
6818d4e85a7SStefano Zampini   /*
68205035670SJunchao Zhang     If collecting logging information, by default, wait for device to complete its operations
6838d4e85a7SStefano Zampini     before returning to the CPU in order to get accurate timings of each event
6848d4e85a7SStefano Zampini   */
685cae85d06SJunchao Zhang   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr);
68605035670SJunchao Zhang   if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);}
6878d4e85a7SStefano Zampini 
68805035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
68905035670SJunchao Zhang   ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr);
69005035670SJunchao Zhang #endif
691cae85d06SJunchao Zhang 
69205035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
69305035670SJunchao Zhang   ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr);
6944b0a73b2SBarry Smith #endif
6954b0a73b2SBarry Smith 
696e5c89e4eSSatish Balay   /*
697e5c89e4eSSatish Balay        Print basic help message
698e5c89e4eSSatish Balay   */
69957171095SVaclav Hapla   if (hasHelp) {
700e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
701d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr);
702d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr);
703d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr);
704301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
705301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
706e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
707e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
708e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
709e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
710e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
711e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
712e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
713bf4d2887SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr);
714e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
715e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
716e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
7171cda70a7SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr);
718e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
719e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
720e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
721e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
722e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
72379dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr);
72479dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr);
7254161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
72692f119d6SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr);
72779dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr);
72826a7e8d4SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr);
729e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
730e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
731e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
732e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
733a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
7340841954dSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr);
735e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
736e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
737185ae32fSMatthew G. Knepley     ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr);
738e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
73956071f75SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr);
740e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
741495fc317SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr);
742e5c89e4eSSatish Balay #endif
743e94e781bSJacob Faibussowitsch #endif
744e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO)
745fe9b927eSVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr);
746e5c89e4eSSatish Balay #endif
747e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
748c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr);
749c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr);
750e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
751e5c89e4eSSatish Balay   }
752e5c89e4eSSatish Balay 
75374ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN)
75474ba8654SBarry Smith   {
75574ba8654SBarry Smith   char machine[128];
756589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr);
75774ba8654SBarry Smith   if (flg1) {
75874ba8654SBarry Smith     ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr);
75974ba8654SBarry Smith   }
76074ba8654SBarry Smith   }
76174ba8654SBarry Smith #endif
76274ba8654SBarry Smith 
763c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
764e5c89e4eSSatish Balay   if (flg1) {
765e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
766e5c89e4eSSatish Balay   }
767e5c89e4eSSatish Balay 
768fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL)
769c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
770f14045dbSBarry Smith   if (!flg3) {
771c5929fdfSBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr);
772f14045dbSBarry Smith   }
773c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr);
774f14045dbSBarry Smith   PetscViennaCLSynchronize = flg3;
775fdc842d1SBarry Smith   ierr = PetscViennaCLInit();CHKERRQ(ierr);
7764cf1874eSKarl Rupp #endif
77782f73ecaSAlejandro Lamas Daviña 
778fdc842d1SBarry Smith   /*
779fdc842d1SBarry Smith      Creates the logging data structures; this is enabled even if logging is not turned on
780fdc842d1SBarry Smith      This is the last thing we do before returning to the user code to prevent having the
781fdc842d1SBarry Smith      logging numbers contaminated by any startup time associated with MPI and the GPUs
782fdc842d1SBarry Smith   */
783fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
784fdc842d1SBarry Smith   ierr = PetscLogInitialize();CHKERRQ(ierr);
785f0a7718cSKarl Rupp #endif
786f0a7718cSKarl Rupp 
787e5c89e4eSSatish Balay   PetscFunctionReturn(0);
788e5c89e4eSSatish Balay }
789