xref: /petsc/src/sys/objects/init.c (revision a0e72f99b781a1b11acf6c40ba4a7ecafcc3e699)
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
688619c96cSJed Brown 
698619c96cSJed Brown /*MC
708619c96cSJed Brown    PETSC_i - the imaginary number i
718619c96cSJed Brown 
728619c96cSJed Brown    Synopsis:
738619c96cSJed Brown    #include <petscsys.h>
748619c96cSJed Brown    PetscComplex PETSC_i;
758619c96cSJed Brown 
768619c96cSJed Brown    Level: beginner
778619c96cSJed Brown 
788619c96cSJed Brown    Note:
798cd53115SBarry Smith    Complex numbers are automatically available if PETSc located a working complex implementation
808619c96cSJed Brown 
818619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex()
828619c96cSJed Brown M*/
8350f81f78SJed Brown PetscComplex PETSC_i;
847a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0;
857a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */
86ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
87c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0;
88570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
89570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0;
90c90a1750SBarry Smith #endif
917087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0;
920354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES)
937087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0;
9444041f26SJed Brown #endif
958ad47952SJed Brown MPI_Datatype MPIU_BOOL;
968ad47952SJed Brown MPI_Datatype MPIU_ENUM;
977cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR;
98e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T;
9975567043SBarry Smith 
100e5c89e4eSSatish Balay /*
101e5c89e4eSSatish Balay        Function that is called to display all error messages
102e5c89e4eSSatish Balay */
1037087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
1047087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
1057087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
106bab1f7e6SVictor Minden /*
1074cf1874eSKarl Rupp   This is needed to turn on/off GPU synchronization
1088b5db460SBarry Smith */
1094cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE;
110bab1f7e6SVictor Minden 
111e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
112e5c89e4eSSatish Balay /*
113e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
114e5c89e4eSSatish Balay */
11595c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
1160298fd71SBarry Smith FILE *petsc_history = NULL;
117e5c89e4eSSatish Balay 
1187087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
119e5c89e4eSSatish Balay {
120e5c89e4eSSatish Balay   PetscErrorCode ierr;
121e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
122e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
123e5c89e4eSSatish Balay   char           version[256];
124e5c89e4eSSatish Balay 
125e5c89e4eSSatish Balay   PetscFunctionBegin;
126ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
127e5c89e4eSSatish Balay   if (!rank) {
128e5c89e4eSSatish Balay     char        arch[10];
129f56c2debSBarry Smith     int         err;
130f56c2debSBarry Smith 
131e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
132e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
133a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
134ffc4695bSBarry Smith     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
135e5c89e4eSSatish Balay     if (filename) {
136e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
137e5c89e4eSSatish Balay     } else {
138589a23caSBarry Smith       ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr);
139589a23caSBarry Smith       ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr);
140e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
141e5c89e4eSSatish Balay     }
142e5c89e4eSSatish Balay 
143a297a907SKarl Rupp     *fd = fopen(fname,"a");
144a297a907SKarl Rupp     if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
145a297a907SKarl Rupp 
146c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
147e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
148589a23caSBarry Smith     ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
149e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
150c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
151a297a907SKarl Rupp 
152f56c2debSBarry Smith     err = fflush(*fd);
153e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
154e5c89e4eSSatish Balay   }
155e5c89e4eSSatish Balay   PetscFunctionReturn(0);
156e5c89e4eSSatish Balay }
157e5c89e4eSSatish Balay 
15895c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd)
159e5c89e4eSSatish Balay {
160e5c89e4eSSatish Balay   PetscErrorCode ierr;
161e5c89e4eSSatish Balay   PetscMPIInt    rank;
162e5c89e4eSSatish Balay   char           date[64];
163f56c2debSBarry Smith   int            err;
164e5c89e4eSSatish Balay 
165e5c89e4eSSatish Balay   PetscFunctionBegin;
166ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
167e5c89e4eSSatish Balay   if (!rank) {
168e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
169c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
170e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
171c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
172f56c2debSBarry Smith     err  = fflush(*fd);
173e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
174f56c2debSBarry Smith     err = fclose(*fd);
175e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
176e5c89e4eSSatish Balay   }
177e5c89e4eSSatish Balay   PetscFunctionReturn(0);
178e5c89e4eSSatish Balay }
179e5c89e4eSSatish Balay 
180e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
181e5c89e4eSSatish Balay 
182e5c89e4eSSatish Balay /*
183e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
184e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
185e5c89e4eSSatish Balay 
186e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1873c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1883c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
189e5c89e4eSSatish Balay */
190e5c89e4eSSatish Balay 
19133c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
192e5c89e4eSSatish Balay {
193e5c89e4eSSatish Balay   PetscFunctionBegin;
1943c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
195e5c89e4eSSatish Balay   abort();
196e5c89e4eSSatish Balay }
197e5c89e4eSSatish Balay 
19833c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
199e5c89e4eSSatish Balay {
200e5c89e4eSSatish Balay   PetscErrorCode ierr;
201e5c89e4eSSatish Balay 
202e5c89e4eSSatish Balay   PetscFunctionBegin;
2033c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
204e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
20541e02c4dSJunchao Zhang   if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */
206e5c89e4eSSatish Balay }
207e5c89e4eSSatish Balay 
208e5c89e4eSSatish Balay /*@C
209e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
210e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
211e5c89e4eSSatish Balay 
212e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
213e5c89e4eSSatish Balay 
214e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay    Level: advanced
217e5c89e4eSSatish Balay 
218e5c89e4eSSatish Balay    Note:
219e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
220e5c89e4eSSatish Balay 
22188c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
222e5c89e4eSSatish Balay @*/
2237087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
224e5c89e4eSSatish Balay {
225e5c89e4eSSatish Balay   PetscFunctionBegin;
226e5c89e4eSSatish Balay   PetscFinalize();
227e5c89e4eSSatish Balay   exit(0);
228e5c89e4eSSatish Balay   return 0;
229e5c89e4eSSatish Balay }
230e5c89e4eSSatish Balay 
231ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE;
23295c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void);
23395c0884eSLisandro Dalcin PETSC_INTERN PetscBool      petscsetmallocvisited;
234e5c89e4eSSatish Balay static       char           emacsmachinename[256];
235e5c89e4eSSatish Balay 
23602c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL;
23702c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = NULL;
238e5c89e4eSSatish Balay 
239e5c89e4eSSatish Balay /*@C
240e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
241e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
242e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
243e5c89e4eSSatish Balay 
244e5c89e4eSSatish Balay    Input Parameter:
2450298fd71SBarry Smith +  help - the help function (may be NULL)
2460298fd71SBarry Smith -  version - the version function (may be NULL)
247e5c89e4eSSatish Balay 
248e5c89e4eSSatish Balay    Level: developer
249e5c89e4eSSatish Balay 
250e5c89e4eSSatish Balay @*/
2517087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
252e5c89e4eSSatish Balay {
253e5c89e4eSSatish Balay   PetscFunctionBegin;
254e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
255e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
256e5c89e4eSSatish Balay   PetscFunctionReturn(0);
257e5c89e4eSSatish Balay }
258e5c89e4eSSatish Balay 
25905df10baSBarry Smith #if defined(PETSC_USE_LOG)
26095c0884eSLisandro Dalcin PETSC_INTERN PetscBool   PetscObjectsLog;
26105df10baSBarry Smith #endif
26205df10baSBarry Smith 
26305035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP.
26405035670SJunchao Zhang    Use the following macros to define CUDA/HIP initialization related vars/routines.
26505035670SJunchao Zhang  */
26605035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
26705035670SJunchao Zhang   typedef cudaError_t                             cupmError_t;
26805035670SJunchao Zhang   typedef struct cudaDeviceProp                   cupmDeviceProp;
269*a0e72f99SJunchao Zhang   typedef cudaStream_t                            cupmStream_t;
27005035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   cudaGetDeviceCount(x)
27105035670SJunchao Zhang   #define cupmGetDevice(x)                        cudaGetDevice(x)
27205035670SJunchao Zhang   #define cupmSetDevice(x)                        cudaSetDevice(x)
27305035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   cudaSetDeviceFlags(x)
27405035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            cudaGetDeviceProperties(x,y)
275*a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     cudaStreamCreate(x)
27605035670SJunchao Zhang   #define cupmGetLastError()                      cudaGetLastError()
27705035670SJunchao Zhang   #define cupmDeviceMapHost                       cudaDeviceMapHost
27805035670SJunchao Zhang   #define cupmSuccess                             cudaSuccess
279e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               cudaErrorMemoryAllocation
280e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           cudaErrorLaunchOutOfResources
28105035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             cudaErrorSetOnActiveProcess
28205035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRCUDA(x)
28305035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         PetscCUBLASInitializeHandle()
28405035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     PetscCUSOLVERDnInitializeHandle()
28505035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscCUDAInitialize
28605035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscCUDAInitialized
28705035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscCUDAInitializeCheck
28805035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscCUDAInitializeAndView
28905035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscCUDASynchronize
29005035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseCUDA
29105035670SJunchao Zhang   #define cupmOptionsStr                          "CUDA options"
2924dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-cuda_device"
29305035670SJunchao Zhang   #define cupmViewStr                             "-cuda_view"
29405035670SJunchao Zhang   #define cupmSynchronizeStr                      "-cuda_synchronize"
29505035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscCUDAInitialize"
29605035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckCUDA
29705035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPICUDAAwarenessCheck
298*a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultCudaStream
29905035670SJunchao Zhang   #include "cupminit.inc"
30005035670SJunchao Zhang #endif
30105035670SJunchao Zhang 
30205035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
30305035670SJunchao Zhang   typedef hipError_t                              cupmError_t;
30405035670SJunchao Zhang   typedef hipDeviceProp_t                         cupmDeviceProp;
305*a0e72f99SJunchao Zhang   typedef hipStream_t                             cupmStream_t;
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)
311*a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     hipStreamCreate(x)
31205035670SJunchao Zhang   #define cupmGetLastError()                      hipGetLastError()
31305035670SJunchao Zhang   #define cupmDeviceMapHost                       hipDeviceMapHost
31405035670SJunchao Zhang   #define cupmSuccess                             hipSuccess
315e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               hipErrorMemoryAllocation
316e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           hipErrorLaunchOutOfResources
31705035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             hipErrorSetOnActiveProcess
31805035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB)
31905035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         0
32005035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     0
32105035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscHIPInitialize
32205035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscHIPInitialized
32305035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscHIPInitializeCheck
32405035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscHIPInitializeAndView
32505035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscHIPSynchronize
32605035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseHIP
32705035670SJunchao Zhang   #define cupmOptionsStr                          "HIP options"
3284dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-hip_device"
32905035670SJunchao Zhang   #define cupmViewStr                             "-hip_view"
33005035670SJunchao Zhang   #define cupmSynchronizeStr                      "-hip_synchronize"
33105035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscHIPInitialize"
33205035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckHIP
33305035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPIHIPAwarenessCheck
334*a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultHipStream
33505035670SJunchao Zhang   #include "cupminit.inc"
33605035670SJunchao Zhang #endif
33705035670SJunchao Zhang 
33857171095SVaclav Hapla PETSC_INTERN PetscErrorCode  PetscOptionsCheckInitial_Private(const char help[])
339e5c89e4eSSatish Balay {
340e5ed2c37SJose E. Roman   char              string[64];
341e5c89e4eSSatish Balay   MPI_Comm          comm = PETSC_COMM_WORLD;
34205035670SJunchao Zhang   PetscBool         flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView;
343e5c89e4eSSatish Balay   PetscErrorCode    ierr;
34467584ceeSBarry Smith   PetscReal         si;
34528559dc8SJed Brown   PetscInt          intensity;
346e5c89e4eSSatish Balay   int               i;
347e5c89e4eSSatish Balay   PetscMPIInt       rank;
348d314f959SVaclav Hapla   char              version[256];
3492479a3a6SBarry Smith #if defined(PETSC_USE_LOG)
350e5ed2c37SJose E. Roman   char              mname[PETSC_MAX_PATH_LEN];
3512479a3a6SBarry Smith   PetscViewerFormat format;
35267584ceeSBarry Smith   PetscBool         flg4 = PETSC_FALSE;
35367584ceeSBarry Smith #endif
3547381773fSBarry Smith 
355e5c89e4eSSatish Balay   PetscFunctionBegin;
356ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
357e5c89e4eSSatish Balay 
35867584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
35992f119d6SBarry Smith   if (!(PETSC_RUNNING_ON_VALGRIND)) {
360e5c89e4eSSatish Balay     /*
361e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
362e5c89e4eSSatish Balay     */
363244bdbccSBarry Smith     PetscBool         mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE;
36492f119d6SBarry Smith 
36576bd3646SJed Brown     if (PetscDefined(USE_DEBUG)) {
36692f119d6SBarry Smith       mdebug        = PETSC_TRUE;
36792f119d6SBarry Smith       initializenan = PETSC_TRUE;
36892f119d6SBarry Smith       ierr   = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
36976bd3646SJed Brown     } else {
37092f119d6SBarry Smith       /* don't warn about unused option */
37192f119d6SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
37292f119d6SBarry Smith       flg1 = PETSC_FALSE;
37376bd3646SJed Brown     }
37479dccf82SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr);
37592f119d6SBarry Smith     if (flg1 || flg2) {
37692f119d6SBarry Smith       mdebug        = PETSC_TRUE;
37792f119d6SBarry Smith       eachcall      = PETSC_TRUE;
37892f119d6SBarry Smith       initializenan = PETSC_TRUE;
37979dccf82SBarry Smith     } else if (flg3 && !flg2) {
38079dccf82SBarry Smith       mdebug        = PETSC_FALSE;
38179dccf82SBarry Smith       eachcall      = PETSC_FALSE;
38279dccf82SBarry Smith       initializenan = PETSC_FALSE;
383e5c89e4eSSatish Balay     }
38492f119d6SBarry Smith 
385608c71bfSMatthew G. Knepley     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr);
386608c71bfSMatthew G. Knepley     if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);}
387608c71bfSMatthew G. Knepley 
38892f119d6SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr);
38992f119d6SBarry Smith     if (mlog) {
39092f119d6SBarry Smith       mdebug = PETSC_TRUE;
39192f119d6SBarry Smith     }
39279dccf82SBarry Smith     /* the next line is deprecated */
39392f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr);
39492f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr);
39592f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr);
39692f119d6SBarry Smith     if (mdebug) {
39792f119d6SBarry Smith       ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr);
39892f119d6SBarry Smith     }
39992f119d6SBarry Smith     if (mlog) {
40092f119d6SBarry Smith       PetscReal logthreshold = 0;
40192f119d6SBarry Smith       ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr);
40292f119d6SBarry Smith       ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr);
40392f119d6SBarry Smith     }
4048b254c29SBarry Smith #if defined(PETSC_USE_LOG)
4058b254c29SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr);
4068b254c29SBarry Smith #endif
40792f119d6SBarry Smith   }
40892f119d6SBarry Smith 
409ba282f50SJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr);
410ba282f50SJed Brown   if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);}
41190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
4122f21b5c6SHong Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr);
413cf6f3811SHong Zhang   /* ignore this option if malloc is already set */
414cf6f3811SHong Zhang   if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);}
415e5c89e4eSSatish Balay 
41690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
417c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr);
4187783f70dSSatish Balay   if (!flg1) {
41990d69ab7SBarry Smith     flg1 = PETSC_FALSE;
420c5929fdfSBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr);
4217783f70dSSatish Balay   }
422e5c89e4eSSatish Balay   if (flg1) {
423e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
424e5c89e4eSSatish Balay   }
42567584ceeSBarry Smith #endif
426e5c89e4eSSatish Balay 
427b4427426SBarry Smith #if defined(PETSC_USE_LOG)
428c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr);
429b4427426SBarry Smith #endif
43005df10baSBarry Smith 
431e5c89e4eSSatish Balay   /*
432e5c89e4eSSatish Balay       Set the display variable for graphics
433e5c89e4eSSatish Balay   */
434e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
435e5c89e4eSSatish Balay 
43651dcc849SKerry Stevens   /*
43757171095SVaclav Hapla      Print main application help message
43857171095SVaclav Hapla   */
43957171095SVaclav Hapla   ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr);
44057171095SVaclav Hapla   if (help && hasHelp) {
44157171095SVaclav Hapla     ierr = PetscPrintf(comm,help);CHKERRQ(ierr);
44257171095SVaclav Hapla     ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr);
44357171095SVaclav Hapla   }
44457171095SVaclav Hapla 
44557171095SVaclav Hapla   /*
446e5c89e4eSSatish Balay       Print the PETSc version information
447e5c89e4eSSatish Balay   */
448d314f959SVaclav Hapla   ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr);
449d314f959SVaclav Hapla   if (flg1 || hasHelp) {
450e5c89e4eSSatish Balay     /*
451e5c89e4eSSatish Balay        Print "higher-level" package version message
452e5c89e4eSSatish Balay     */
453e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
454e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
455e5c89e4eSSatish Balay     }
456e5c89e4eSSatish Balay 
457a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
458e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
459e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
460e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
46184e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
462e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
463e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
464c0bb3764SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr);
4657ca660e7SBarry Smith   }
4667ca660e7SBarry Smith 
46794941ca7SBarry Smith   /*
46894941ca7SBarry Smith        Print "higher-level" package help message
46994941ca7SBarry Smith   */
47057171095SVaclav Hapla   if (hasHelp) {
471d314f959SVaclav Hapla     PetscBool hasHelpIntro;
472d314f959SVaclav Hapla 
47394941ca7SBarry Smith     if (PetscExternalHelpFunction) {
47494941ca7SBarry Smith       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
47594941ca7SBarry Smith     }
476d314f959SVaclav Hapla     ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr);
477d314f959SVaclav Hapla     if (hasHelpIntro) {
478bdb346e9SBarry Smith       ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr);
479008a6e76SBarry Smith       ierr = PetscFreeMPIResources();CHKERRQ(ierr);
480ffc4695bSBarry Smith       ierr = MPI_Finalize();CHKERRMPI(ierr);
4817ca660e7SBarry Smith       exit(0);
4827ca660e7SBarry Smith     }
483e5c89e4eSSatish Balay   }
484e5c89e4eSSatish Balay 
485e5c89e4eSSatish Balay   /*
486e5c89e4eSSatish Balay       Setup the error handling
487e5c89e4eSSatish Balay   */
48890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
489c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr);
490b59baad1SJed Brown   if (flg1) {
491ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr);
49202c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
493b59baad1SJed Brown   }
49490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
495c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr);
49602c9f0b5SLisandro Dalcin   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);}
49790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
498c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr);
499e5c89e4eSSatish Balay   if (flg1) {
500ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr);
501e5c89e4eSSatish Balay   }
50290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
503c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr);
5048d359177SBarry Smith   if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);}
505e5c89e4eSSatish Balay 
506e5c89e4eSSatish Balay   /*
507e5c89e4eSSatish Balay       Setup debugger information
508e5c89e4eSSatish Balay   */
509e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
510589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
511e5c89e4eSSatish Balay   if (flg1) {
512e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
513e5c89e4eSSatish Balay 
514e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
515ffc4695bSBarry Smith     ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr);
516ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
51702c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr);
518e5c89e4eSSatish Balay   }
519589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr);
5205e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
521589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
522589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr);
523e5c89e4eSSatish Balay   if (flg1 || flg2) {
524e5c89e4eSSatish Balay     PetscMPIInt    size;
525bf4d2887SBarry Smith     PetscInt       lsize,*ranks;
526e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
527e5c89e4eSSatish Balay     /*
528e5c89e4eSSatish Balay        we have to make sure that all processors have opened
529e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
530e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
531e5c89e4eSSatish Balay        and kill the program.
532e5c89e4eSSatish Balay     */
533ffc4695bSBarry Smith     ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
534e5c89e4eSSatish Balay     if (size > 2) {
535533163c2SBarry Smith       PetscMPIInt dummy = 0;
536e5c89e4eSSatish Balay       MPI_Status  status;
537e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
538e5c89e4eSSatish Balay         if (rank != i) {
539ffc4695bSBarry Smith           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr);
540e5c89e4eSSatish Balay         }
541e5c89e4eSSatish Balay       }
542e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
543e5c89e4eSSatish Balay         if (rank != i) {
544ffc4695bSBarry Smith           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr);
545e5c89e4eSSatish Balay         }
546e5c89e4eSSatish Balay       }
547e5c89e4eSSatish Balay     }
548e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
549bf4d2887SBarry Smith     ierr  = PetscMalloc1(size,&ranks);CHKERRQ(ierr);
550e5c89e4eSSatish Balay     lsize = size;
551bf4d2887SBarry Smith     /* Deprecated in 3.14 */
552bf4d2887SBarry Smith     ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr);
553bf4d2887SBarry Smith     if (flag) {
554bf4d2887SBarry Smith       const char * const quietopt="-options_suppress_deprecated_warnings";
555bf4d2887SBarry Smith       char               msg[4096];
556bf4d2887SBarry Smith       PetscBool          quiet = PETSC_FALSE;
557bf4d2887SBarry Smith 
558bf4d2887SBarry Smith       ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
559bf4d2887SBarry Smith       if (!quiet) {
560bf4d2887SBarry Smith         ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
561bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr);
562bf4d2887SBarry Smith         ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
563bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr);
564bf4d2887SBarry Smith         ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
565bf4d2887SBarry Smith         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
566bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr);
567bf4d2887SBarry Smith         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
568bf4d2887SBarry Smith         ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
569bf4d2887SBarry Smith         ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
570bf4d2887SBarry Smith         ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
571bf4d2887SBarry Smith         ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
572bf4d2887SBarry Smith       }
573bf4d2887SBarry Smith     } else {
574bf4d2887SBarry Smith       lsize = size;
575bf4d2887SBarry Smith       ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr);
576bf4d2887SBarry Smith     }
577e5c89e4eSSatish Balay     if (flag) {
578e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
579bf4d2887SBarry Smith         if (ranks[i] == rank) { flag = PETSC_FALSE; break; }
580e5c89e4eSSatish Balay       }
581e5c89e4eSSatish Balay     }
582e5c89e4eSSatish Balay     if (!flag) {
583e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
58402c9f0b5SLisandro Dalcin       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
585e5c89e4eSSatish Balay       if (flg1) {
586e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
587e5c89e4eSSatish Balay       } else {
588e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
589e5c89e4eSSatish Balay       }
590ffc4695bSBarry Smith       ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr);
591ffc4695bSBarry Smith       ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
5922a2a2941SBarry Smith     } else {
5932a2a2941SBarry Smith       ierr = PetscWaitOnError();CHKERRQ(ierr);
594e5c89e4eSSatish Balay     }
595bf4d2887SBarry Smith     ierr = PetscFree(ranks);CHKERRQ(ierr);
596e5c89e4eSSatish Balay   }
597e5c89e4eSSatish Balay 
598589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr);
599cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
600e5c89e4eSSatish Balay 
601e5c89e4eSSatish Balay   /*
602e5c89e4eSSatish Balay         Setup profiling and logging
603e5c89e4eSSatish Balay   */
6046cf91177SBarry Smith #if defined(PETSC_USE_INFO)
6058bb29257SSatish Balay   {
606e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr);
607e5c89e4eSSatish Balay   }
608865f6aa8SSatish Balay #endif
609aba4c478SBarry Smith   ierr = PetscDetermineInitialFPTrap();
610cc9df77eSBarry Smith   flg1 = PETSC_FALSE;
611cc9df77eSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr);
612cc9df77eSBarry Smith   if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);}
613cc9df77eSBarry Smith   ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr);
614cc9df77eSBarry Smith   if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);}
615865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
616865f6aa8SSatish Balay   mname[0] = 0;
617589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
618865f6aa8SSatish Balay   if (flg1) {
619865f6aa8SSatish Balay     if (mname[0]) {
620f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
621865f6aa8SSatish Balay     } else {
622706d7a88SBarry Smith       ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr);
623865f6aa8SSatish Balay     }
624865f6aa8SSatish Balay   }
625217044c2SLisandro Dalcin 
626217044c2SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr);
627217044c2SLisandro Dalcin 
628e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
62990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
630c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
631495fc317SBarry Smith   if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);}
632e5c89e4eSSatish Balay #endif
63390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
63490d69ab7SBarry Smith   flg3 = PETSC_FALSE;
635c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr);
636c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
637e5c89e4eSSatish Balay   if (flg1)                      { ierr = PetscLogAllBegin();CHKERRQ(ierr); }
638bb1d7374SBarry Smith   else if (flg3)                 { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);}
639e5c89e4eSSatish Balay 
640589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
641e5c89e4eSSatish Balay   if (flg1) {
642e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
643e5c89e4eSSatish Balay     FILE *file;
644e5c89e4eSSatish Balay     if (mname[0]) {
6452e924ca5SSatish Balay       PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank);
646e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
647e5c89e4eSSatish Balay       file = fopen(fname,"w");
648f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
649a297a907SKarl Rupp     } else file = PETSC_STDOUT;
650e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
651e5c89e4eSSatish Balay   }
652bb1d7374SBarry Smith 
65316413a6aSBarry Smith   ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr);
654bb1d7374SBarry Smith   if (flg4) {
655bb1d7374SBarry Smith     if (format == PETSC_VIEWER_ASCII_XML) {
656bb1d7374SBarry Smith       ierr = PetscLogNestedBegin();CHKERRQ(ierr);
657bb1d7374SBarry Smith     } else {
658bb1d7374SBarry Smith       ierr = PetscLogDefaultBegin();CHKERRQ(ierr);
659bb1d7374SBarry Smith     }
660eccbb886SLisandro Dalcin   }
661eccbb886SLisandro Dalcin   if (flg4 && format == PETSC_VIEWER_ASCII_XML) {
662eccbb886SLisandro Dalcin     PetscReal threshold = PetscRealConstant(0.01);
663eccbb886SLisandro Dalcin     ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr);
664eccbb886SLisandro Dalcin     if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);}
665bb1d7374SBarry Smith   }
666e5c89e4eSSatish Balay #endif
667e5c89e4eSSatish Balay 
668c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr);
66905035670SJunchao Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr);
6708d4e85a7SStefano Zampini   /*
67105035670SJunchao Zhang     If collecting logging information, by default, wait for device to complete its operations
6728d4e85a7SStefano Zampini     before returning to the CPU in order to get accurate timings of each event
6738d4e85a7SStefano Zampini   */
674cae85d06SJunchao Zhang   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr);
67505035670SJunchao Zhang   if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);}
6768d4e85a7SStefano Zampini 
67705035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
67805035670SJunchao Zhang   ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr);
67905035670SJunchao Zhang #endif
680cae85d06SJunchao Zhang 
68105035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
68205035670SJunchao Zhang   ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr);
6834b0a73b2SBarry Smith #endif
6844b0a73b2SBarry Smith 
685e5c89e4eSSatish Balay   /*
686e5c89e4eSSatish Balay        Print basic help message
687e5c89e4eSSatish Balay   */
68857171095SVaclav Hapla   if (hasHelp) {
689e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
690d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr);
691d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr);
692d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr);
693301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
694301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
695e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
696e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
697e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
698e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
699e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
700e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
701e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
702bf4d2887SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr);
703e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
704e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
705e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
7061cda70a7SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr);
707e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
708e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
709e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
710e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
711e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
71279dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr);
71379dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr);
7144161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
71592f119d6SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr);
71679dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr);
71726a7e8d4SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr);
718e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
719e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
720e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
721e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
722a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
7230841954dSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr);
724e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
725e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
726185ae32fSMatthew G. Knepley     ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr);
727e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
72856071f75SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr);
729e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
730495fc317SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr);
731e5c89e4eSSatish Balay #endif
732e94e781bSJacob Faibussowitsch #endif
733e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO)
734fe9b927eSVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr);
735e5c89e4eSSatish Balay #endif
736e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
737c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr);
738c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr);
739e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
740e5c89e4eSSatish Balay   }
741e5c89e4eSSatish Balay 
74274ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN)
74374ba8654SBarry Smith   {
74474ba8654SBarry Smith   char machine[128];
745589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr);
74674ba8654SBarry Smith   if (flg1) {
74774ba8654SBarry Smith     ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr);
74874ba8654SBarry Smith   }
74974ba8654SBarry Smith   }
75074ba8654SBarry Smith #endif
75174ba8654SBarry Smith 
752c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
753e5c89e4eSSatish Balay   if (flg1) {
754e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
755e5c89e4eSSatish Balay   }
756e5c89e4eSSatish Balay 
757fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL)
758c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
759f14045dbSBarry Smith   if (!flg3) {
760c5929fdfSBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr);
761f14045dbSBarry Smith   }
762c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr);
763f14045dbSBarry Smith   PetscViennaCLSynchronize = flg3;
764fdc842d1SBarry Smith   ierr = PetscViennaCLInit();CHKERRQ(ierr);
7654cf1874eSKarl Rupp #endif
76682f73ecaSAlejandro Lamas Daviña 
767fdc842d1SBarry Smith   /*
768fdc842d1SBarry Smith      Creates the logging data structures; this is enabled even if logging is not turned on
769fdc842d1SBarry Smith      This is the last thing we do before returning to the user code to prevent having the
770fdc842d1SBarry Smith      logging numbers contaminated by any startup time associated with MPI and the GPUs
771fdc842d1SBarry Smith   */
772fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
773fdc842d1SBarry Smith   ierr = PetscLogInitialize();CHKERRQ(ierr);
774f0a7718cSKarl Rupp #endif
775f0a7718cSKarl Rupp 
776e5c89e4eSSatish Balay   PetscFunctionReturn(0);
777e5c89e4eSSatish Balay }
778