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