xref: /petsc/src/sys/objects/init.c (revision b5a892a1a70151a25c27b9422f362b5a6d017e0f)
1e5c89e4eSSatish Balay /*
2e5c89e4eSSatish Balay 
3e5c89e4eSSatish Balay    This file defines part of the initialization of PETSc
4e5c89e4eSSatish Balay 
5540e20f2SPierre Jolivet   This file uses regular malloc and free because it cannot be known
6e5c89e4eSSatish Balay   what malloc is being used until it has already processed the input.
7e5c89e4eSSatish Balay */
8ef386f4bSSatish Balay 
9ef386f4bSSatish Balay #include <petscsys.h>        /*I  "petscsys.h"   I*/
10f67a399dSBarry Smith #include <petsc/private/petscimpl.h>
11665c2dedSJed Brown #include <petscviewer.h>
12fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
13fdc842d1SBarry Smith PETSC_INTERN PetscErrorCode PetscLogInitialize(void);
14fdc842d1SBarry Smith #endif
15ef386f4bSSatish Balay 
16ba61063dSBarry Smith #if defined(PETSC_HAVE_SYS_SYSINFO_H)
1751d315f7SKerry Stevens #include <sys/sysinfo.h>
18ba61063dSBarry Smith #endif
19121deb67SSatish Balay #if defined(PETSC_HAVE_UNISTD_H)
2051d315f7SKerry Stevens #include <unistd.h>
21121deb67SSatish Balay #endif
2205035670SJunchao Zhang 
23d9b72601SDominic Meiser #if defined(PETSC_HAVE_CUDA)
24d9b72601SDominic Meiser   #include <cuda_runtime.h>
2523622779SBarry Smith   #include <cuda_runtime_api.h>
2623622779SBarry Smith   #include <cuda_device_runtime_api.h>
277fd2f626SJose E. Roman   #include <petsccublas.h>
2805035670SJunchao Zhang #endif
2905035670SJunchao Zhang 
3005035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
3105035670SJunchao Zhang   #include <hip/hip_runtime.h>
3205035670SJunchao Zhang #endif
3305035670SJunchao Zhang 
3405035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
35c2a741eeSJunchao Zhang   #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
36c2a741eeSJunchao Zhang     #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */
37c2a741eeSJunchao Zhang   #endif
38d9b72601SDominic Meiser #endif
39555d055bSBarry Smith 
40f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL)
41f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit();
42f0a7718cSKarl Rupp #endif
43f0a7718cSKarl Rupp 
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 
6171438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
6271438e86SJunchao Zhang PetscBool   PetscBeganNvshmem             = PETSC_FALSE;
6371438e86SJunchao Zhang PetscBool   PetscNvshmemInitialized       = PETSC_FALSE;
6471438e86SJunchao Zhang #endif
6571438e86SJunchao Zhang 
66c2a741eeSJunchao Zhang PetscBool   use_gpu_aware_mpi             = PETSC_TRUE;
67928a6601SJunchao Zhang PetscBool   PetscCreatedGpuObjects        = PETSC_FALSE;
68c2a741eeSJunchao Zhang 
6950f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX)
70e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
71e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
72e5c89e4eSSatish Balay #endif
738619c96cSJed Brown 
748619c96cSJed Brown /*MC
758619c96cSJed Brown    PETSC_i - the imaginary number i
768619c96cSJed Brown 
778619c96cSJed Brown    Synopsis:
788619c96cSJed Brown    #include <petscsys.h>
798619c96cSJed Brown    PetscComplex PETSC_i;
808619c96cSJed Brown 
818619c96cSJed Brown    Level: beginner
828619c96cSJed Brown 
838619c96cSJed Brown    Note:
848cd53115SBarry Smith    Complex numbers are automatically available if PETSc located a working complex implementation
858619c96cSJed Brown 
868619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex()
878619c96cSJed Brown M*/
8850f81f78SJed Brown PetscComplex PETSC_i;
897a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0;
907a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */
91ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
92c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0;
93570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
94570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0;
95c90a1750SBarry Smith #endif
967087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0;
97092991acSStefano Zampini MPI_Datatype MPIU_REAL_INT = 0;
98092991acSStefano Zampini MPI_Datatype MPIU_SCALAR_INT = 0;
990354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES)
1007087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0;
10144041f26SJed Brown #endif
102*b5a892a1SMatthew G. Knepley MPI_Datatype MPI_4INT = 0;
103*b5a892a1SMatthew G. Knepley MPI_Datatype MPIU_4INT = 0;
1048ad47952SJed Brown MPI_Datatype MPIU_BOOL;
1058ad47952SJed Brown MPI_Datatype MPIU_ENUM;
1067cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR;
107e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T;
10875567043SBarry Smith 
109e5c89e4eSSatish Balay /*
110e5c89e4eSSatish Balay        Function that is called to display all error messages
111e5c89e4eSSatish Balay */
1127087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
1137087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
1147087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
115bab1f7e6SVictor Minden /*
1164cf1874eSKarl Rupp   This is needed to turn on/off GPU synchronization
1178b5db460SBarry Smith */
1184cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE;
119bab1f7e6SVictor Minden 
120e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
121e5c89e4eSSatish Balay /*
122e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
123e5c89e4eSSatish Balay */
12495c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
1250298fd71SBarry Smith FILE *petsc_history = NULL;
126e5c89e4eSSatish Balay 
1277087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
128e5c89e4eSSatish Balay {
129e5c89e4eSSatish Balay   PetscErrorCode ierr;
130e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
131e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
132e5c89e4eSSatish Balay   char           version[256];
133e5c89e4eSSatish Balay 
134e5c89e4eSSatish Balay   PetscFunctionBegin;
135ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
136e5c89e4eSSatish Balay   if (!rank) {
137e5c89e4eSSatish Balay     char        arch[10];
138f56c2debSBarry Smith     int         err;
139f56c2debSBarry Smith 
140e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
141e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
142a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
143ffc4695bSBarry Smith     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
144e5c89e4eSSatish Balay     if (filename) {
145e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
146e5c89e4eSSatish Balay     } else {
147589a23caSBarry Smith       ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr);
148589a23caSBarry Smith       ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr);
149e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
150e5c89e4eSSatish Balay     }
151e5c89e4eSSatish Balay 
152a297a907SKarl Rupp     *fd = fopen(fname,"a");
153a297a907SKarl Rupp     if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
154a297a907SKarl Rupp 
155c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
156e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
157589a23caSBarry Smith     ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
158e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
159c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
160a297a907SKarl Rupp 
161f56c2debSBarry Smith     err = fflush(*fd);
162e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
163e5c89e4eSSatish Balay   }
164e5c89e4eSSatish Balay   PetscFunctionReturn(0);
165e5c89e4eSSatish Balay }
166e5c89e4eSSatish Balay 
16795c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd)
168e5c89e4eSSatish Balay {
169e5c89e4eSSatish Balay   PetscErrorCode ierr;
170e5c89e4eSSatish Balay   PetscMPIInt    rank;
171e5c89e4eSSatish Balay   char           date[64];
172f56c2debSBarry Smith   int            err;
173e5c89e4eSSatish Balay 
174e5c89e4eSSatish Balay   PetscFunctionBegin;
175ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
176e5c89e4eSSatish Balay   if (!rank) {
177e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
178c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
179e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
180c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
181f56c2debSBarry Smith     err  = fflush(*fd);
182e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
183f56c2debSBarry Smith     err = fclose(*fd);
184e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
185e5c89e4eSSatish Balay   }
186e5c89e4eSSatish Balay   PetscFunctionReturn(0);
187e5c89e4eSSatish Balay }
188e5c89e4eSSatish Balay 
189e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
190e5c89e4eSSatish Balay 
191e5c89e4eSSatish Balay /*
192e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
193e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
194e5c89e4eSSatish Balay 
195e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1963c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1973c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
198e5c89e4eSSatish Balay */
199e5c89e4eSSatish Balay 
20033c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
201e5c89e4eSSatish Balay {
202e5c89e4eSSatish Balay   PetscFunctionBegin;
2033c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
204e5c89e4eSSatish Balay   abort();
205e5c89e4eSSatish Balay }
206e5c89e4eSSatish Balay 
20733c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
208e5c89e4eSSatish Balay {
209e5c89e4eSSatish Balay   PetscErrorCode ierr;
210e5c89e4eSSatish Balay 
211e5c89e4eSSatish Balay   PetscFunctionBegin;
2123c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
213e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
21441e02c4dSJunchao Zhang   if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */
215e5c89e4eSSatish Balay }
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay /*@C
218e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
219e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
220e5c89e4eSSatish Balay 
221e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
222e5c89e4eSSatish Balay 
223e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
224e5c89e4eSSatish Balay 
225e5c89e4eSSatish Balay    Level: advanced
226e5c89e4eSSatish Balay 
227e5c89e4eSSatish Balay    Note:
228e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
229e5c89e4eSSatish Balay 
23088c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
231e5c89e4eSSatish Balay @*/
2327087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
233e5c89e4eSSatish Balay {
234e5c89e4eSSatish Balay   PetscFunctionBegin;
235e5c89e4eSSatish Balay   PetscFinalize();
236e5c89e4eSSatish Balay   exit(0);
237e5c89e4eSSatish Balay   return 0;
238e5c89e4eSSatish Balay }
239e5c89e4eSSatish Balay 
240ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE;
24195c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void);
24295c0884eSLisandro Dalcin PETSC_INTERN PetscBool      petscsetmallocvisited;
243e5c89e4eSSatish Balay static       char           emacsmachinename[256];
244e5c89e4eSSatish Balay 
24502c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL;
24602c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = NULL;
247e5c89e4eSSatish Balay 
248e5c89e4eSSatish Balay /*@C
249e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
250e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
251e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
252e5c89e4eSSatish Balay 
253e5c89e4eSSatish Balay    Input Parameter:
2540298fd71SBarry Smith +  help - the help function (may be NULL)
2550298fd71SBarry Smith -  version - the version function (may be NULL)
256e5c89e4eSSatish Balay 
257e5c89e4eSSatish Balay    Level: developer
258e5c89e4eSSatish Balay 
259e5c89e4eSSatish Balay @*/
2607087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
261e5c89e4eSSatish Balay {
262e5c89e4eSSatish Balay   PetscFunctionBegin;
263e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
264e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
265e5c89e4eSSatish Balay   PetscFunctionReturn(0);
266e5c89e4eSSatish Balay }
267e5c89e4eSSatish Balay 
26805df10baSBarry Smith #if defined(PETSC_USE_LOG)
26995c0884eSLisandro Dalcin PETSC_INTERN PetscBool   PetscObjectsLog;
27005df10baSBarry Smith #endif
27105df10baSBarry Smith 
27205035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP.
27305035670SJunchao Zhang    Use the following macros to define CUDA/HIP initialization related vars/routines.
27405035670SJunchao Zhang  */
27505035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
27605035670SJunchao Zhang   typedef cudaError_t                             cupmError_t;
27705035670SJunchao Zhang   typedef struct cudaDeviceProp                   cupmDeviceProp;
278a0e72f99SJunchao Zhang   typedef cudaStream_t                            cupmStream_t;
2799ffd0706SHong Zhang   typedef cudaEvent_t                             cupmEvent_t;
28005035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   cudaGetDeviceCount(x)
28105035670SJunchao Zhang   #define cupmGetDevice(x)                        cudaGetDevice(x)
28205035670SJunchao Zhang   #define cupmSetDevice(x)                        cudaSetDevice(x)
28305035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   cudaSetDeviceFlags(x)
28405035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            cudaGetDeviceProperties(x,y)
285a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     cudaStreamCreate(x)
28605035670SJunchao Zhang   #define cupmGetLastError()                      cudaGetLastError()
28705035670SJunchao Zhang   #define cupmDeviceMapHost                       cudaDeviceMapHost
28805035670SJunchao Zhang   #define cupmSuccess                             cudaSuccess
289e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               cudaErrorMemoryAllocation
290e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           cudaErrorLaunchOutOfResources
29105035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             cudaErrorSetOnActiveProcess
29205035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRCUDA(x)
29305035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         PetscCUBLASInitializeHandle()
29405035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     PetscCUSOLVERDnInitializeHandle()
29505035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscCUDAInitialize
29605035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscCUDAInitialized
29705035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscCUDAInitializeCheck
29805035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscCUDAInitializeAndView
29905035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscCUDASynchronize
30005035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseCUDA
30105035670SJunchao Zhang   #define cupmOptionsStr                          "CUDA options"
3024dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-cuda_device"
30305035670SJunchao Zhang   #define cupmViewStr                             "-cuda_view"
30405035670SJunchao Zhang   #define cupmSynchronizeStr                      "-cuda_synchronize"
30505035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscCUDAInitialize"
30605035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckCUDA
30705035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPICUDAAwarenessCheck
308a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultCudaStream
3099ffd0706SHong Zhang   #define cupmEventCreate(x)                      cudaEventCreate(x)
31005035670SJunchao Zhang   #include "cupminit.inc"
31105035670SJunchao Zhang #endif
31205035670SJunchao Zhang 
31305035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
31405035670SJunchao Zhang   typedef hipError_t                              cupmError_t;
31505035670SJunchao Zhang   typedef hipDeviceProp_t                         cupmDeviceProp;
316a0e72f99SJunchao Zhang   typedef hipStream_t                             cupmStream_t;
3179ffd0706SHong Zhang   typedef hipEvent_t                              cupmEvent_t;
31805035670SJunchao Zhang   #define cupmGetDeviceCount(x)                   hipGetDeviceCount(x)
31905035670SJunchao Zhang   #define cupmGetDevice(x)                        hipGetDevice(x)
32005035670SJunchao Zhang   #define cupmSetDevice(x)                        hipSetDevice(x)
32105035670SJunchao Zhang   #define cupmSetDeviceFlags(x)                   hipSetDeviceFlags(x)
32205035670SJunchao Zhang   #define cupmGetDeviceProperties(x,y)            hipGetDeviceProperties(x,y)
323a0e72f99SJunchao Zhang   #define cupmStreamCreate(x)                     hipStreamCreate(x)
3249ffd0706SHong Zhang   #define cupmEventCreate(x)                      hipEventCreate(x);
32505035670SJunchao Zhang   #define cupmGetLastError()                      hipGetLastError()
32605035670SJunchao Zhang   #define cupmDeviceMapHost                       hipDeviceMapHost
32705035670SJunchao Zhang   #define cupmSuccess                             hipSuccess
328e57d7714SBarry Smith   #define cupmErrorMemoryAllocation               hipErrorMemoryAllocation
329e57d7714SBarry Smith   #define cupmErrorLaunchOutOfResources           hipErrorLaunchOutOfResources
33005035670SJunchao Zhang   #define cupmErrorSetOnActiveProcess             hipErrorSetOnActiveProcess
33105035670SJunchao Zhang   #define CHKERRCUPM(x)                           CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB)
33205035670SJunchao Zhang   #define PetscCUPMBLASInitializeHandle()         0
33305035670SJunchao Zhang   #define PetscCUPMSOLVERDnInitializeHandle()     0
33405035670SJunchao Zhang   #define PetscCUPMInitialize                     PetscHIPInitialize
33505035670SJunchao Zhang   #define PetscCUPMInitialized                    PetscHIPInitialized
33605035670SJunchao Zhang   #define PetscCUPMInitializeCheck                PetscHIPInitializeCheck
33705035670SJunchao Zhang   #define PetscCUPMInitializeAndView              PetscHIPInitializeAndView
33805035670SJunchao Zhang   #define PetscCUPMSynchronize                    PetscHIPSynchronize
33905035670SJunchao Zhang   #define PetscNotUseCUPM                         PetscNotUseHIP
34005035670SJunchao Zhang   #define cupmOptionsStr                          "HIP options"
3414dcd27cbSJunchao Zhang   #define cupmSetDeviceStr                        "-hip_device"
34205035670SJunchao Zhang   #define cupmViewStr                             "-hip_view"
34305035670SJunchao Zhang   #define cupmSynchronizeStr                      "-hip_synchronize"
34405035670SJunchao Zhang   #define PetscCUPMInitializeStr                  "PetscHIPInitialize"
34505035670SJunchao Zhang   #define PetscOptionsCheckCUPM                   PetscOptionsCheckHIP
34605035670SJunchao Zhang   #define PetscMPICUPMAwarenessCheck              PetscMPIHIPAwarenessCheck
347a0e72f99SJunchao Zhang   #define PetscDefaultCupmStream                  PetscDefaultHipStream
34805035670SJunchao Zhang   #include "cupminit.inc"
34905035670SJunchao Zhang #endif
35005035670SJunchao Zhang 
35157171095SVaclav Hapla PETSC_INTERN PetscErrorCode  PetscOptionsCheckInitial_Private(const char help[])
352e5c89e4eSSatish Balay {
353e5ed2c37SJose E. Roman   char              string[64];
354e5c89e4eSSatish Balay   MPI_Comm          comm = PETSC_COMM_WORLD;
35505035670SJunchao Zhang   PetscBool         flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView;
356e5c89e4eSSatish Balay   PetscErrorCode    ierr;
35767584ceeSBarry Smith   PetscReal         si;
35828559dc8SJed Brown   PetscInt          intensity;
359e5c89e4eSSatish Balay   int               i;
360e5c89e4eSSatish Balay   PetscMPIInt       rank;
361d314f959SVaclav Hapla   char              version[256];
3622479a3a6SBarry Smith #if defined(PETSC_USE_LOG)
363e5ed2c37SJose E. Roman   char              mname[PETSC_MAX_PATH_LEN];
3642479a3a6SBarry Smith   PetscViewerFormat format;
36567584ceeSBarry Smith   PetscBool         flg4 = PETSC_FALSE;
36667584ceeSBarry Smith #endif
3677381773fSBarry Smith 
368e5c89e4eSSatish Balay   PetscFunctionBegin;
369ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
370e5c89e4eSSatish Balay 
37167584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
37292f119d6SBarry Smith   if (!(PETSC_RUNNING_ON_VALGRIND)) {
373e5c89e4eSSatish Balay     /*
374e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
375e5c89e4eSSatish Balay     */
376244bdbccSBarry Smith     PetscBool         mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE;
37792f119d6SBarry Smith 
37876bd3646SJed Brown     if (PetscDefined(USE_DEBUG)) {
37992f119d6SBarry Smith       mdebug        = PETSC_TRUE;
38092f119d6SBarry Smith       initializenan = PETSC_TRUE;
38192f119d6SBarry Smith       ierr   = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38276bd3646SJed Brown     } else {
38392f119d6SBarry Smith       /* don't warn about unused option */
38492f119d6SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
38592f119d6SBarry Smith       flg1 = PETSC_FALSE;
38676bd3646SJed Brown     }
38779dccf82SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr);
38892f119d6SBarry Smith     if (flg1 || flg2) {
38992f119d6SBarry Smith       mdebug        = PETSC_TRUE;
39092f119d6SBarry Smith       eachcall      = PETSC_TRUE;
39192f119d6SBarry Smith       initializenan = PETSC_TRUE;
39279dccf82SBarry Smith     } else if (flg3 && !flg2) {
39379dccf82SBarry Smith       mdebug        = PETSC_FALSE;
39479dccf82SBarry Smith       eachcall      = PETSC_FALSE;
39579dccf82SBarry Smith       initializenan = PETSC_FALSE;
396e5c89e4eSSatish Balay     }
39792f119d6SBarry Smith 
398608c71bfSMatthew G. Knepley     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr);
399608c71bfSMatthew G. Knepley     if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);}
400608c71bfSMatthew G. Knepley 
40192f119d6SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr);
40292f119d6SBarry Smith     if (mlog) {
40392f119d6SBarry Smith       mdebug = PETSC_TRUE;
40492f119d6SBarry Smith     }
40579dccf82SBarry Smith     /* the next line is deprecated */
40692f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr);
40792f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr);
40892f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr);
40992f119d6SBarry Smith     if (mdebug) {
41092f119d6SBarry Smith       ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr);
41192f119d6SBarry Smith     }
41292f119d6SBarry Smith     if (mlog) {
41392f119d6SBarry Smith       PetscReal logthreshold = 0;
41492f119d6SBarry Smith       ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr);
41592f119d6SBarry Smith       ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr);
41692f119d6SBarry Smith     }
4178b254c29SBarry Smith #if defined(PETSC_USE_LOG)
4188b254c29SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr);
4198b254c29SBarry Smith #endif
42092f119d6SBarry Smith   }
42192f119d6SBarry Smith 
422ba282f50SJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr);
423ba282f50SJed Brown   if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);}
42490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
4252f21b5c6SHong Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr);
426cf6f3811SHong Zhang   /* ignore this option if malloc is already set */
427cf6f3811SHong Zhang   if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);}
428e5c89e4eSSatish Balay 
42990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
430c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr);
4317783f70dSSatish Balay   if (!flg1) {
43290d69ab7SBarry Smith     flg1 = PETSC_FALSE;
433c5929fdfSBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr);
4347783f70dSSatish Balay   }
435e5c89e4eSSatish Balay   if (flg1) {
436e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
437e5c89e4eSSatish Balay   }
43867584ceeSBarry Smith #endif
439e5c89e4eSSatish Balay 
440b4427426SBarry Smith #if defined(PETSC_USE_LOG)
441c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr);
442b4427426SBarry Smith #endif
44305df10baSBarry Smith 
444e5c89e4eSSatish Balay   /*
445e5c89e4eSSatish Balay       Set the display variable for graphics
446e5c89e4eSSatish Balay   */
447e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
448e5c89e4eSSatish Balay 
44951dcc849SKerry Stevens   /*
45057171095SVaclav Hapla      Print main application help message
45157171095SVaclav Hapla   */
45257171095SVaclav Hapla   ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr);
45357171095SVaclav Hapla   if (help && hasHelp) {
45457171095SVaclav Hapla     ierr = PetscPrintf(comm,help);CHKERRQ(ierr);
45557171095SVaclav Hapla     ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr);
45657171095SVaclav Hapla   }
45757171095SVaclav Hapla 
45857171095SVaclav Hapla   /*
459e5c89e4eSSatish Balay       Print the PETSc version information
460e5c89e4eSSatish Balay   */
461d314f959SVaclav Hapla   ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr);
462d314f959SVaclav Hapla   if (flg1 || hasHelp) {
463e5c89e4eSSatish Balay     /*
464e5c89e4eSSatish Balay        Print "higher-level" package version message
465e5c89e4eSSatish Balay     */
466e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
467e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
468e5c89e4eSSatish Balay     }
469e5c89e4eSSatish Balay 
470a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
471e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
472e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
473e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
47484e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
475e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
476e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
477c0bb3764SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr);
4787ca660e7SBarry Smith   }
4797ca660e7SBarry Smith 
48094941ca7SBarry Smith   /*
48194941ca7SBarry Smith        Print "higher-level" package help message
48294941ca7SBarry Smith   */
48357171095SVaclav Hapla   if (hasHelp) {
484d314f959SVaclav Hapla     PetscBool hasHelpIntro;
485d314f959SVaclav Hapla 
48694941ca7SBarry Smith     if (PetscExternalHelpFunction) {
48794941ca7SBarry Smith       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
48894941ca7SBarry Smith     }
489d314f959SVaclav Hapla     ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr);
490d314f959SVaclav Hapla     if (hasHelpIntro) {
491bdb346e9SBarry Smith       ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr);
492008a6e76SBarry Smith       ierr = PetscFreeMPIResources();CHKERRQ(ierr);
493ffc4695bSBarry Smith       ierr = MPI_Finalize();CHKERRMPI(ierr);
4947ca660e7SBarry Smith       exit(0);
4957ca660e7SBarry Smith     }
496e5c89e4eSSatish Balay   }
497e5c89e4eSSatish Balay 
498e5c89e4eSSatish Balay   /*
499e5c89e4eSSatish Balay       Setup the error handling
500e5c89e4eSSatish Balay   */
50190d69ab7SBarry Smith   flg1 = PETSC_FALSE;
502c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr);
503b59baad1SJed Brown   if (flg1) {
504ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr);
50502c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
506b59baad1SJed Brown   }
50790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
508c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr);
50902c9f0b5SLisandro Dalcin   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);}
51090d69ab7SBarry Smith   flg1 = PETSC_FALSE;
511c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr);
512e5c89e4eSSatish Balay   if (flg1) {
513ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr);
514e5c89e4eSSatish Balay   }
51590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
516c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr);
5178d359177SBarry Smith   if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);}
518e5c89e4eSSatish Balay 
519e5c89e4eSSatish Balay   /*
520e5c89e4eSSatish Balay       Setup debugger information
521e5c89e4eSSatish Balay   */
522e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
523589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
524e5c89e4eSSatish Balay   if (flg1) {
525e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
526e5c89e4eSSatish Balay 
527e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
528ffc4695bSBarry Smith     ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr);
529ffc4695bSBarry Smith     ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
53002c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr);
531e5c89e4eSSatish Balay   }
532589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr);
5335e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
534589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
535589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr);
536e5c89e4eSSatish Balay   if (flg1 || flg2) {
537e5c89e4eSSatish Balay     PetscMPIInt    size;
538bf4d2887SBarry Smith     PetscInt       lsize,*ranks;
539e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
540e5c89e4eSSatish Balay     /*
541e5c89e4eSSatish Balay        we have to make sure that all processors have opened
542e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
543e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
544e5c89e4eSSatish Balay        and kill the program.
545e5c89e4eSSatish Balay     */
546ffc4695bSBarry Smith     ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
547e5c89e4eSSatish Balay     if (size > 2) {
548533163c2SBarry Smith       PetscMPIInt dummy = 0;
549e5c89e4eSSatish Balay       MPI_Status  status;
550e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
551e5c89e4eSSatish Balay         if (rank != i) {
552ffc4695bSBarry Smith           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr);
553e5c89e4eSSatish Balay         }
554e5c89e4eSSatish Balay       }
555e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
556e5c89e4eSSatish Balay         if (rank != i) {
557ffc4695bSBarry Smith           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr);
558e5c89e4eSSatish Balay         }
559e5c89e4eSSatish Balay       }
560e5c89e4eSSatish Balay     }
561e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
562bf4d2887SBarry Smith     ierr  = PetscMalloc1(size,&ranks);CHKERRQ(ierr);
563e5c89e4eSSatish Balay     lsize = size;
564bf4d2887SBarry Smith     /* Deprecated in 3.14 */
565bf4d2887SBarry Smith     ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr);
566bf4d2887SBarry Smith     if (flag) {
567bf4d2887SBarry Smith       const char * const quietopt="-options_suppress_deprecated_warnings";
568bf4d2887SBarry Smith       char               msg[4096];
569bf4d2887SBarry Smith       PetscBool          quiet = PETSC_FALSE;
570bf4d2887SBarry Smith 
571bf4d2887SBarry Smith       ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
572bf4d2887SBarry Smith       if (!quiet) {
573bf4d2887SBarry Smith         ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
574bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr);
575bf4d2887SBarry Smith         ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
576bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr);
577bf4d2887SBarry Smith         ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
578bf4d2887SBarry Smith         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
579bf4d2887SBarry Smith         ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr);
580bf4d2887SBarry Smith         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
581bf4d2887SBarry Smith         ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
582bf4d2887SBarry Smith         ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
583bf4d2887SBarry Smith         ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
584bf4d2887SBarry Smith         ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
585bf4d2887SBarry Smith       }
586bf4d2887SBarry Smith     } else {
587bf4d2887SBarry Smith       lsize = size;
588bf4d2887SBarry Smith       ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr);
589bf4d2887SBarry Smith     }
590e5c89e4eSSatish Balay     if (flag) {
591e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
592bf4d2887SBarry Smith         if (ranks[i] == rank) { flag = PETSC_FALSE; break; }
593e5c89e4eSSatish Balay       }
594e5c89e4eSSatish Balay     }
595e5c89e4eSSatish Balay     if (!flag) {
596e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
59702c9f0b5SLisandro Dalcin       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
598e5c89e4eSSatish Balay       if (flg1) {
599e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
600e5c89e4eSSatish Balay       } else {
601e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
602e5c89e4eSSatish Balay       }
603ffc4695bSBarry Smith       ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr);
604ffc4695bSBarry Smith       ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr);
6052a2a2941SBarry Smith     } else {
6062a2a2941SBarry Smith       ierr = PetscWaitOnError();CHKERRQ(ierr);
607e5c89e4eSSatish Balay     }
608bf4d2887SBarry Smith     ierr = PetscFree(ranks);CHKERRQ(ierr);
609e5c89e4eSSatish Balay   }
610e5c89e4eSSatish Balay 
611589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr);
612cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
613e5c89e4eSSatish Balay 
614e5c89e4eSSatish Balay   /*
615e5c89e4eSSatish Balay         Setup profiling and logging
616e5c89e4eSSatish Balay   */
6176cf91177SBarry Smith #if defined(PETSC_USE_INFO)
6188bb29257SSatish Balay   {
619e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr);
620e5c89e4eSSatish Balay   }
621865f6aa8SSatish Balay #endif
622aba4c478SBarry Smith   ierr = PetscDetermineInitialFPTrap();
623cc9df77eSBarry Smith   flg1 = PETSC_FALSE;
624cc9df77eSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr);
625cc9df77eSBarry Smith   if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);}
626cc9df77eSBarry Smith   ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr);
627cc9df77eSBarry Smith   if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);}
628865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
629865f6aa8SSatish Balay   mname[0] = 0;
630589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
631865f6aa8SSatish Balay   if (flg1) {
632865f6aa8SSatish Balay     if (mname[0]) {
633f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
634865f6aa8SSatish Balay     } else {
635706d7a88SBarry Smith       ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr);
636865f6aa8SSatish Balay     }
637865f6aa8SSatish Balay   }
638217044c2SLisandro Dalcin 
639217044c2SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr);
640217044c2SLisandro Dalcin 
641e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
64290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
643c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
644495fc317SBarry Smith   if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);}
645e5c89e4eSSatish Balay #endif
64690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
64790d69ab7SBarry Smith   flg3 = PETSC_FALSE;
648c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr);
649c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
650e5c89e4eSSatish Balay   if (flg1)                      { ierr = PetscLogAllBegin();CHKERRQ(ierr); }
651bb1d7374SBarry Smith   else if (flg3)                 { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);}
652e5c89e4eSSatish Balay 
653589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
654e5c89e4eSSatish Balay   if (flg1) {
655e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
656e5c89e4eSSatish Balay     FILE *file;
657e5c89e4eSSatish Balay     if (mname[0]) {
6582e924ca5SSatish Balay       PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank);
659e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
660e5c89e4eSSatish Balay       file = fopen(fname,"w");
661f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
662a297a907SKarl Rupp     } else file = PETSC_STDOUT;
663e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
664e5c89e4eSSatish Balay   }
665bb1d7374SBarry Smith 
66616413a6aSBarry Smith   ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr);
667bb1d7374SBarry Smith   if (flg4) {
668d0a29bd7SConnor Ward     if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
669bb1d7374SBarry Smith       ierr = PetscLogNestedBegin();CHKERRQ(ierr);
670bb1d7374SBarry Smith     } else {
671bb1d7374SBarry Smith       ierr = PetscLogDefaultBegin();CHKERRQ(ierr);
672bb1d7374SBarry Smith     }
673eccbb886SLisandro Dalcin   }
674d0a29bd7SConnor Ward   if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) {
675eccbb886SLisandro Dalcin     PetscReal threshold = PetscRealConstant(0.01);
676eccbb886SLisandro Dalcin     ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr);
677eccbb886SLisandro Dalcin     if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);}
678bb1d7374SBarry Smith   }
679e5c89e4eSSatish Balay #endif
680e5c89e4eSSatish Balay 
681c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr);
68205035670SJunchao Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr);
6838d4e85a7SStefano Zampini   /*
68405035670SJunchao Zhang     If collecting logging information, by default, wait for device to complete its operations
6858d4e85a7SStefano Zampini     before returning to the CPU in order to get accurate timings of each event
6868d4e85a7SStefano Zampini   */
687cae85d06SJunchao Zhang   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr);
68805035670SJunchao Zhang   if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);}
6898d4e85a7SStefano Zampini 
69005035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
69105035670SJunchao Zhang   ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr);
69205035670SJunchao Zhang #endif
693cae85d06SJunchao Zhang 
69405035670SJunchao Zhang #if defined(PETSC_HAVE_HIP)
69505035670SJunchao Zhang   ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr);
6964b0a73b2SBarry Smith #endif
6974b0a73b2SBarry Smith 
698e5c89e4eSSatish Balay   /*
699e5c89e4eSSatish Balay        Print basic help message
700e5c89e4eSSatish Balay   */
70157171095SVaclav Hapla   if (hasHelp) {
702e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
703d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr);
704d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr);
705d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr);
706301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
707301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
708e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
709e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
710e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
711e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
712e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
713e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
714e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
715bf4d2887SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr);
716e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
717e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
718e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
7191cda70a7SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr);
720e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
721e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
722e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
723e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
724e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
72579dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr);
72679dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr);
7274161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
72892f119d6SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr);
72979dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr);
73026a7e8d4SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr);
731e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
732e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
733e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
734e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
735a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
7360841954dSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr);
737e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
738e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
739185ae32fSMatthew G. Knepley     ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr);
740e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
74156071f75SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr);
742e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
743495fc317SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr);
744e5c89e4eSSatish Balay #endif
745e94e781bSJacob Faibussowitsch #endif
746e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO)
747fe9b927eSVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr);
748e5c89e4eSSatish Balay #endif
749e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
750c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr);
751c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr);
752e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
753e5c89e4eSSatish Balay   }
754e5c89e4eSSatish Balay 
75574ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN)
75674ba8654SBarry Smith   {
75774ba8654SBarry Smith   char machine[128];
758589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr);
75974ba8654SBarry Smith   if (flg1) {
76074ba8654SBarry Smith     ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr);
76174ba8654SBarry Smith   }
76274ba8654SBarry Smith   }
76374ba8654SBarry Smith #endif
76474ba8654SBarry Smith 
765c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
766e5c89e4eSSatish Balay   if (flg1) {
767e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
768e5c89e4eSSatish Balay   }
769e5c89e4eSSatish Balay 
770fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL)
771c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
772f14045dbSBarry Smith   if (!flg3) {
773c5929fdfSBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr);
774f14045dbSBarry Smith   }
775c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr);
776f14045dbSBarry Smith   PetscViennaCLSynchronize = flg3;
777fdc842d1SBarry Smith   ierr = PetscViennaCLInit();CHKERRQ(ierr);
7784cf1874eSKarl Rupp #endif
77982f73ecaSAlejandro Lamas Daviña 
780fdc842d1SBarry Smith   /*
781fdc842d1SBarry Smith      Creates the logging data structures; this is enabled even if logging is not turned on
782fdc842d1SBarry Smith      This is the last thing we do before returning to the user code to prevent having the
783fdc842d1SBarry Smith      logging numbers contaminated by any startup time associated with MPI and the GPUs
784fdc842d1SBarry Smith   */
785fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
786fdc842d1SBarry Smith   ierr = PetscLogInitialize();CHKERRQ(ierr);
787f0a7718cSKarl Rupp #endif
788f0a7718cSKarl Rupp 
789e5c89e4eSSatish Balay   PetscFunctionReturn(0);
790e5c89e4eSSatish Balay }
791