xref: /petsc/src/sys/objects/init.c (revision cae85d06d2fa574045eb61866b300b12dbdb9804)
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
23d9b72601SDominic Meiser #if defined(PETSC_HAVE_CUDA)
24d9b72601SDominic Meiser #include <cuda_runtime.h>
257fd2f626SJose E. Roman #include <petsccublas.h>
26c2a741eeSJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
27c2a741eeSJunchao Zhang #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */
28c2a741eeSJunchao Zhang #endif
29d9b72601SDominic Meiser #endif
30555d055bSBarry Smith 
31f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL)
32f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit();
33f0a7718cSKarl Rupp #endif
34f0a7718cSKarl Rupp 
35e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/
36e5c89e4eSSatish Balay /*
37e5c89e4eSSatish Balay      Indicates if PETSc started up MPI, or it was
38e5c89e4eSSatish Balay    already started before PETSc was initialized.
39e5c89e4eSSatish Balay */
400cbf60d0SJose E. Roman PetscBool   PetscBeganMPI         = PETSC_FALSE;
418ad20175SVaclav Hapla PetscBool   PetscErrorHandlingInitialized = PETSC_FALSE;
420cbf60d0SJose E. Roman PetscBool   PetscInitializeCalled = PETSC_FALSE;
430cbf60d0SJose E. Roman PetscBool   PetscFinalizeCalled   = PETSC_FALSE;
44bffec52eSKarl Rupp PetscBool   PetscCUDAInitialized  = PETSC_FALSE;
45d6f2c3cbSBarry Smith 
467087cfbeSBarry Smith PetscMPIInt PetscGlobalRank       = -1;
477087cfbeSBarry Smith PetscMPIInt PetscGlobalSize       = -1;
48ba61063dSBarry Smith 
49c2a741eeSJunchao Zhang PetscBool   use_gpu_aware_mpi     = PETSC_TRUE;
50c2a741eeSJunchao Zhang 
5150f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX)
52e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE)
53e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */
54e5c89e4eSSatish Balay #endif
552c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
56500d8756SSatish Balay MPI_Datatype MPIU_C_DOUBLE_COMPLEX;
57500d8756SSatish Balay MPI_Datatype MPIU_C_COMPLEX;
582c876bd9SBarry Smith #endif
598619c96cSJed Brown 
608619c96cSJed Brown /*MC
618619c96cSJed Brown    PETSC_i - the imaginary number i
628619c96cSJed Brown 
638619c96cSJed Brown    Synopsis:
648619c96cSJed Brown    #include <petscsys.h>
658619c96cSJed Brown    PetscComplex PETSC_i;
668619c96cSJed Brown 
678619c96cSJed Brown    Level: beginner
688619c96cSJed Brown 
698619c96cSJed Brown    Note:
708cd53115SBarry Smith    Complex numbers are automatically available if PETSc located a working complex implementation
718619c96cSJed Brown 
728619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex()
738619c96cSJed Brown M*/
7450f81f78SJed Brown PetscComplex PETSC_i;
75e5c89e4eSSatish Balay #endif
76ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128)
77c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0;
787c2de775SJed Brown #if defined(PETSC_HAVE_COMPLEX)
798c764dc5SJose Roman MPI_Datatype MPIU___COMPLEX128 = 0;
808c764dc5SJose Roman #endif
81570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
82570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0;
83c90a1750SBarry Smith #endif
847087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0;
850354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES)
867087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0;
8744041f26SJed Brown #endif
888ad47952SJed Brown MPI_Datatype MPIU_BOOL;
898ad47952SJed Brown MPI_Datatype MPIU_ENUM;
907cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR;
91e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T;
9275567043SBarry Smith 
93e5c89e4eSSatish Balay /*
94e5c89e4eSSatish Balay        Function that is called to display all error messages
95e5c89e4eSSatish Balay */
967087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...)          = PetscErrorPrintfDefault;
977087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...)  = PetscHelpPrintfDefault;
987087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list)    = PetscVFPrintfDefault;
99bab1f7e6SVictor Minden /*
1004cf1874eSKarl Rupp   This is needed to turn on/off GPU synchronization
1018b5db460SBarry Smith */
1024cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE;
10382f73ecaSAlejandro Lamas Daviña PetscBool PetscCUDASynchronize = PETSC_FALSE;
104bab1f7e6SVictor Minden 
105e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
106e5c89e4eSSatish Balay /*
107e5c89e4eSSatish Balay    Optional file where all PETSc output from various prints is saved
108e5c89e4eSSatish Balay */
10995c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
1100298fd71SBarry Smith FILE *petsc_history = NULL;
111e5c89e4eSSatish Balay 
1127087cfbeSBarry Smith PetscErrorCode  PetscOpenHistoryFile(const char filename[],FILE **fd)
113e5c89e4eSSatish Balay {
114e5c89e4eSSatish Balay   PetscErrorCode ierr;
115e5c89e4eSSatish Balay   PetscMPIInt    rank,size;
116e5c89e4eSSatish Balay   char           pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64];
117e5c89e4eSSatish Balay   char           version[256];
118e5c89e4eSSatish Balay 
119e5c89e4eSSatish Balay   PetscFunctionBegin;
120e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
121e5c89e4eSSatish Balay   if (!rank) {
122e5c89e4eSSatish Balay     char        arch[10];
123f56c2debSBarry Smith     int         err;
124f56c2debSBarry Smith 
125e5c89e4eSSatish Balay     ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
126e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
127a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
128e5c89e4eSSatish Balay     ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
129e5c89e4eSSatish Balay     if (filename) {
130e5c89e4eSSatish Balay       ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr);
131e5c89e4eSSatish Balay     } else {
132589a23caSBarry Smith       ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr);
133589a23caSBarry Smith       ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr);
134e5c89e4eSSatish Balay       ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr);
135e5c89e4eSSatish Balay     }
136e5c89e4eSSatish Balay 
137a297a907SKarl Rupp     *fd = fopen(fname,"a");
138a297a907SKarl Rupp     if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname);
139a297a907SKarl Rupp 
140c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
141e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr);
142589a23caSBarry Smith     ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
143e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr);
144c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
145a297a907SKarl Rupp 
146f56c2debSBarry Smith     err = fflush(*fd);
147e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
148e5c89e4eSSatish Balay   }
149e5c89e4eSSatish Balay   PetscFunctionReturn(0);
150e5c89e4eSSatish Balay }
151e5c89e4eSSatish Balay 
15295c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd)
153e5c89e4eSSatish Balay {
154e5c89e4eSSatish Balay   PetscErrorCode ierr;
155e5c89e4eSSatish Balay   PetscMPIInt    rank;
156e5c89e4eSSatish Balay   char           date[64];
157f56c2debSBarry Smith   int            err;
158e5c89e4eSSatish Balay 
159e5c89e4eSSatish Balay   PetscFunctionBegin;
160e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
161e5c89e4eSSatish Balay   if (!rank) {
162e5c89e4eSSatish Balay     ierr = PetscGetDate(date,64);CHKERRQ(ierr);
163c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
164e5c89e4eSSatish Balay     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr);
165c0bb3764SVaclav Hapla     ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr);
166f56c2debSBarry Smith     err  = fflush(*fd);
167e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
168f56c2debSBarry Smith     err = fclose(*fd);
169e32f2f54SBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
170e5c89e4eSSatish Balay   }
171e5c89e4eSSatish Balay   PetscFunctionReturn(0);
172e5c89e4eSSatish Balay }
173e5c89e4eSSatish Balay 
174e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay /*
177e5c89e4eSSatish Balay    This is ugly and probably belongs somewhere else, but I want to
178e5c89e4eSSatish Balay   be able to put a true MPI abort error handler with command line args.
179e5c89e4eSSatish Balay 
180e5c89e4eSSatish Balay     This is so MPI errors in the debugger will leave all the stack
1813c311c98SBarry Smith   frames. The default MP_Abort() cleans up and exits thus providing no useful information
1823c311c98SBarry Smith   in the debugger hence we call abort() instead of MPI_Abort().
183e5c89e4eSSatish Balay */
184e5c89e4eSSatish Balay 
18533c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
186e5c89e4eSSatish Balay {
187e5c89e4eSSatish Balay   PetscFunctionBegin;
1883c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
189e5c89e4eSSatish Balay   abort();
190e5c89e4eSSatish Balay }
191e5c89e4eSSatish Balay 
19233c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...)
193e5c89e4eSSatish Balay {
194e5c89e4eSSatish Balay   PetscErrorCode ierr;
195e5c89e4eSSatish Balay 
196e5c89e4eSSatish Balay   PetscFunctionBegin;
1973c311c98SBarry Smith   (*PetscErrorPrintf)("MPI error %d\n",*flag);
198e5c89e4eSSatish Balay   ierr = PetscAttachDebugger();
19941e02c4dSJunchao Zhang   if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */
200e5c89e4eSSatish Balay }
201e5c89e4eSSatish Balay 
2027381773fSBarry Smith #if defined(PETSC_HAVE_CUDA)
203*cae85d06SJunchao Zhang /* CUDA validation after it is lazily initialized */
204*cae85d06SJunchao Zhang static PetscErrorCode PetscCUDAValidate(void)
205*cae85d06SJunchao Zhang {
206*cae85d06SJunchao Zhang   PetscBool             mpi_gpu_awareness;
207*cae85d06SJunchao Zhang 
208*cae85d06SJunchao Zhang   PetscFunctionBegin;
209*cae85d06SJunchao Zhang   if (use_gpu_aware_mpi) {
210*cae85d06SJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) && defined(MPIX_CUDA_AWARE_SUPPORT) && MPIX_CUDA_AWARE_SUPPORT
211*cae85d06SJunchao Zhang     /* Trust OpenMPI's compile time cuda query interface */
212*cae85d06SJunchao Zhang     mpi_gpu_awareness = PETSC_TRUE;
213*cae85d06SJunchao Zhang #else
214*cae85d06SJunchao Zhang     /* For other MPI implementations without cuda query API, we do a GPU MPI call to see if it segfaults.
215*cae85d06SJunchao Zhang       Note that Spectrum MPI sets OMPI_MAJOR_VERSION and is CUDA-aware, but does not have MPIX_CUDA_AWARE_SUPPORT.
216*cae85d06SJunchao Zhang     */
217*cae85d06SJunchao Zhang     mpi_gpu_awareness = PetscCheckMpiGpuAwareness();
218*cae85d06SJunchao Zhang #endif
219*cae85d06SJunchao Zhang     if (!mpi_gpu_awareness) {
220*cae85d06SJunchao Zhang       (*PetscErrorPrintf)("PETSc is configured with GPU support, but your MPI is not GPU-aware. For better performance, please use a GPU-aware MPI.\n");
221*cae85d06SJunchao Zhang       (*PetscErrorPrintf)("If you do not care, add option -use_gpu_aware_mpi 0. To not see the message again, add the option to your .petscrc, OR add it to the env var PETSC_OPTIONS.\n");
222*cae85d06SJunchao Zhang       (*PetscErrorPrintf)("If you do care, for IBM Spectrum MPI on OLCF Summit, you may need jsrun --smpiargs=-gpu.\n");
223*cae85d06SJunchao Zhang       (*PetscErrorPrintf)("For OpenMPI, you need to configure it --with-cuda (https://www.open-mpi.org/faq/?category=buildcuda)\n");
224*cae85d06SJunchao Zhang       (*PetscErrorPrintf)("For MVAPICH2-GDR, you need to set MV2_USE_CUDA=1 (http://mvapich.cse.ohio-state.edu/userguide/gdr/)\n");
225*cae85d06SJunchao Zhang       (*PetscErrorPrintf)("For Cray-MPICH, you need to set MPICH_RDMA_ENABLED_CUDA=1 (https://www.olcf.ornl.gov/tutorials/gpudirect-mpich-enabled-cuda/)\n");
226*cae85d06SJunchao Zhang       PETSCABORT(PETSC_COMM_SELF,PETSC_ERR_LIB);
227*cae85d06SJunchao Zhang     }
228*cae85d06SJunchao Zhang   }
229*cae85d06SJunchao Zhang   PetscFunctionReturn(0);
230*cae85d06SJunchao Zhang }
231*cae85d06SJunchao Zhang 
232*cae85d06SJunchao Zhang /* Initialize the CUDA device lazily just before creating the first CUDA object. */
233*cae85d06SJunchao Zhang static PetscBool PetscNotUseGpu = PETSC_FALSE; /* Assert the code will not use GPUs */
234*cae85d06SJunchao Zhang PetscErrorCode PetscCUDAInitializeLazily(void)
235*cae85d06SJunchao Zhang {
236*cae85d06SJunchao Zhang   PetscErrorCode        ierr;
237*cae85d06SJunchao Zhang   cudaError_t           cerr;
238*cae85d06SJunchao Zhang   int                   devId,devCount;
239*cae85d06SJunchao Zhang   PetscMPIInt           rank;
240*cae85d06SJunchao Zhang   static PetscBool      cudaValdidateChecked = PETSC_FALSE;
241*cae85d06SJunchao Zhang 
242*cae85d06SJunchao Zhang   PetscFunctionBegin;
243*cae85d06SJunchao Zhang   if (PetscNotUseGpu) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"You asserted the code won't use GPUs with -cuda_set_device none, but it is trying to create a cuda object. Remove this option or see manpage of PetscCUDAInitialize().");
244*cae85d06SJunchao Zhang   if (!PetscCUDAInitialized) {
245*cae85d06SJunchao Zhang     cerr = cudaGetDeviceCount(&devCount);CHKERRCUDA(cerr);
246*cae85d06SJunchao Zhang     if (devCount > 1) {
247*cae85d06SJunchao Zhang       cerr = cudaSetDeviceFlags(cudaDeviceMapHost);
248*cae85d06SJunchao Zhang       cudaGetLastError(); /* Reset the last error */
249*cae85d06SJunchao Zhang       if (cerr == cudaSuccess) { /* It implies cuda runtime has not been initialized? */
250*cae85d06SJunchao Zhang         ierr  = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
251*cae85d06SJunchao Zhang         devId = rank % devCount;
252*cae85d06SJunchao Zhang         cerr  = cudaSetDevice(devId);CHKERRCUDA(cerr);
253*cae85d06SJunchao Zhang       } else if (cerr == cudaErrorSetOnActiveProcess) {
254*cae85d06SJunchao Zhang         /* It implies user has initialized cuda runtime outside of petsc. We do nothing to respect the device choice. */
255*cae85d06SJunchao Zhang       }
256*cae85d06SJunchao Zhang     }
257*cae85d06SJunchao Zhang     PetscCUDAInitialized = PETSC_TRUE;
258*cae85d06SJunchao Zhang   }
259*cae85d06SJunchao Zhang   if (!cudaValdidateChecked) {
260*cae85d06SJunchao Zhang     ierr = PetscCUDAValidate();CHKERRQ(ierr);
261*cae85d06SJunchao Zhang     cudaValdidateChecked = PETSC_TRUE;
262*cae85d06SJunchao Zhang   }
263*cae85d06SJunchao Zhang   PetscFunctionReturn(0);
264*cae85d06SJunchao Zhang }
265*cae85d06SJunchao Zhang 
2667381773fSBarry Smith /*@C
267*cae85d06SJunchao Zhang      PetscCUDAInitialize - Initializes the CUDA device (eagerly in PetscInitialize()) and cuBLAS/cuSPARSE on the device
2687381773fSBarry Smith 
2697381773fSBarry Smith      Logically collective
2707381773fSBarry Smith 
2717381773fSBarry Smith   Input Parameter:
2727381773fSBarry Smith   comm   - the MPI communicator that will utilize the CUDA devices
273*cae85d06SJunchao Zhang   device - the device assigned to current MPI process. Special values like PETSC_DECIDE/DEFAULT have special meanings (see details below)
2747381773fSBarry Smith 
2757381773fSBarry Smith   Options Database:
276*cae85d06SJunchao Zhang +  -cuda_set_device <device> - the device assigned to current MPI rank. <device> is case-insensitive and can be:
277*cae85d06SJunchao Zhang        NONE (or none, or -3) : the code will not use GPUs, otherwise it will error out;
278*cae85d06SJunchao Zhang        PETSC_DEFAULT(or DEFAULT, or -2) : do not explicitly set device, i.e., use whatever device already set by user (probably before PetscInitialize()). Init cuda runtime etc;
279*cae85d06SJunchao Zhang        PETSC_DECIDE (or DECIDE, or -1) : assign MPI ranks in comm to available devices in round-robin, and init cuda runtime etc on the selected device;
280*cae85d06SJunchao Zhang        >= 0 integer  : assign the device with this id to current MPI process. Error out if <device> is invalid. Init cuda runtime etc on this device;
281*cae85d06SJunchao Zhang      With PETSC_{DECIDE, DEFAULT}, if there are actually no GPUs, the code can still run, but it will error out when trying to create cuda objects.
282*cae85d06SJunchao Zhang .  -cuda_view                - view information about the CUDA devices.
283*cae85d06SJunchao Zhang .  -cuda_synchronize         - wait at the end of asynchronize CUDA calls so that their time gets credited to the current event; default with -log_view.
284*cae85d06SJunchao Zhang .  -log_view                 - logging, however if alone or combined with `-cuda_set_device DEFAULT | DECIDE | >=0 int`, will int cuda; if combined with `-cuda_set_device none`, won't init cuda.
285*cae85d06SJunchao Zhang -  -use_gpu_aware_mpi        - assume the MPI is GPU-aware when communicating data on GPUs.
2867381773fSBarry Smith 
28790ea27d8SSatish Balay   Level: beginner
28890ea27d8SSatish Balay 
2897381773fSBarry Smith   Notes:
290*cae85d06SJunchao Zhang    Initializing cuBLAS takes about 1/2 second therefore it is done by default in PetscCUDAInitialize() before logging begins.
2917381773fSBarry Smith 
2927381773fSBarry Smith @*/
293*cae85d06SJunchao Zhang PetscErrorCode PetscCUDAInitialize(MPI_Comm comm,PetscInt device)
2947381773fSBarry Smith {
2957381773fSBarry Smith   PetscErrorCode        ierr;
296*cae85d06SJunchao Zhang   cudaError_t           cerr;
297*cae85d06SJunchao Zhang   int                   devId,devCount=0;
298*cae85d06SJunchao Zhang   const PetscInt        PETSC_NONE=-3; /* Unlike PETSC_DECIDE, we don't have a macro PETSC_NONE in petsc headers */
299*cae85d06SJunchao Zhang   PetscMPIInt           rank;
3007381773fSBarry Smith 
3017381773fSBarry Smith   PetscFunctionBegin;
3027381773fSBarry Smith   if (!PetscCUDAInitialized) {
303*cae85d06SJunchao Zhang     cerr = cudaGetDeviceCount(&devCount);
304*cae85d06SJunchao Zhang     cudaGetLastError(); /* Reset the last error */
305*cae85d06SJunchao Zhang     if (cerr != cudaSuccess) devCount = 0;
306*cae85d06SJunchao Zhang     if (device >= 0) { /* User wants to use this specific device */
307*cae85d06SJunchao Zhang       cerr = cudaSetDeviceFlags(cudaDeviceMapHost); /* Allow it to fail since user might have already initialized the device. */
308*cae85d06SJunchao Zhang       cudaGetLastError(); /* Reset the last error */
309*cae85d06SJunchao Zhang       cerr = cudaSetDevice((int)device);CHKERRCUDA(cerr);
310*cae85d06SJunchao Zhang     } else if (device == PETSC_DECIDE) { /* Assign MPI ranks to available devices in round-robin */
311*cae85d06SJunchao Zhang       if (devCount > 0) { /* Allow no-GPU as long as user does not use GPUs */
312*cae85d06SJunchao Zhang         /* Set the device flags so that it can map host memory */
313*cae85d06SJunchao Zhang         cerr  = cudaSetDeviceFlags(cudaDeviceMapHost);CHKERRCUDA(cerr);
3147381773fSBarry Smith         ierr  = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
315*cae85d06SJunchao Zhang         devId = rank % devCount;
316*cae85d06SJunchao Zhang         cerr  = cudaSetDevice(devId);CHKERRCUDA(cerr);
3177381773fSBarry Smith       }
318*cae85d06SJunchao Zhang     } else if (device == PETSC_DEFAULT) {
319*cae85d06SJunchao Zhang       /* Do nothing, i.e., use whatever device set by user before PetscInitialize() */
320*cae85d06SJunchao Zhang     } else if (device == PETSC_NONE) {
321*cae85d06SJunchao Zhang       PetscNotUseGpu = PETSC_TRUE; /* Assert the code won't use GPUs even there are */
322*cae85d06SJunchao Zhang     } else SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Wrong device (%D) passed to -cuda_set_device <dev>. Must be NONE(-3),PETSC_DEFAULT(-2),PETSC_DECIDE(-1) or a non-negative integer.",device);
3237381773fSBarry Smith 
324*cae85d06SJunchao Zhang     if (devCount > 0 && device != PETSC_NONE) {
325*cae85d06SJunchao Zhang       /* Do costly CUDA handles initialization here to not to distort petsc logging later */
3267381773fSBarry Smith       ierr = PetscCUBLASInitializeHandle();CHKERRQ(ierr);
3273bbda9c2SStefano Zampini       ierr = PetscCUSOLVERDnInitializeHandle();CHKERRQ(ierr);
3287381773fSBarry Smith       PetscCUDAInitialized = PETSC_TRUE;
3297381773fSBarry Smith     }
3307381773fSBarry Smith   }
3317381773fSBarry Smith   PetscFunctionReturn(0);
3327381773fSBarry Smith }
3337381773fSBarry Smith #endif
3347381773fSBarry Smith 
335e5c89e4eSSatish Balay /*@C
336e5c89e4eSSatish Balay    PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one
337e5c89e4eSSatish Balay      wishes a clean exit somewhere deep in the program.
338e5c89e4eSSatish Balay 
339e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
340e5c89e4eSSatish Balay 
341e5c89e4eSSatish Balay    Options Database Keys are the same as for PetscFinalize()
342e5c89e4eSSatish Balay 
343e5c89e4eSSatish Balay    Level: advanced
344e5c89e4eSSatish Balay 
345e5c89e4eSSatish Balay    Note:
346e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
347e5c89e4eSSatish Balay 
34888c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize()
349e5c89e4eSSatish Balay @*/
3507087cfbeSBarry Smith PetscErrorCode  PetscEnd(void)
351e5c89e4eSSatish Balay {
352e5c89e4eSSatish Balay   PetscFunctionBegin;
353e5c89e4eSSatish Balay   PetscFinalize();
354e5c89e4eSSatish Balay   exit(0);
355e5c89e4eSSatish Balay   return 0;
356e5c89e4eSSatish Balay }
357e5c89e4eSSatish Balay 
358ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE;
35995c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void);
36095c0884eSLisandro Dalcin PETSC_INTERN PetscBool      petscsetmallocvisited;
361e5c89e4eSSatish Balay static       char           emacsmachinename[256];
362e5c89e4eSSatish Balay 
36302c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL;
36402c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm)    = NULL;
365e5c89e4eSSatish Balay 
366e5c89e4eSSatish Balay /*@C
367e5c89e4eSSatish Balay    PetscSetHelpVersionFunctions - Sets functions that print help and version information
368e5c89e4eSSatish Balay    before the PETSc help and version information is printed. Must call BEFORE PetscInitialize().
369e5c89e4eSSatish Balay    This routine enables a "higher-level" package that uses PETSc to print its messages first.
370e5c89e4eSSatish Balay 
371e5c89e4eSSatish Balay    Input Parameter:
3720298fd71SBarry Smith +  help - the help function (may be NULL)
3730298fd71SBarry Smith -  version - the version function (may be NULL)
374e5c89e4eSSatish Balay 
375e5c89e4eSSatish Balay    Level: developer
376e5c89e4eSSatish Balay 
377e5c89e4eSSatish Balay @*/
3787087cfbeSBarry Smith PetscErrorCode  PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm))
379e5c89e4eSSatish Balay {
380e5c89e4eSSatish Balay   PetscFunctionBegin;
381e5c89e4eSSatish Balay   PetscExternalHelpFunction    = help;
382e5c89e4eSSatish Balay   PetscExternalVersionFunction = version;
383e5c89e4eSSatish Balay   PetscFunctionReturn(0);
384e5c89e4eSSatish Balay }
385e5c89e4eSSatish Balay 
38605df10baSBarry Smith #if defined(PETSC_USE_LOG)
38795c0884eSLisandro Dalcin PETSC_INTERN PetscBool   PetscObjectsLog;
38805df10baSBarry Smith #endif
38905df10baSBarry Smith 
390e781f417SStefano Zampini void PetscMPI_Comm_eh(MPI_Comm *comm, PetscMPIInt *err, ...)
391e781f417SStefano Zampini {
392e781f417SStefano Zampini   if (PetscUnlikely(*err)) {
393e781f417SStefano Zampini     PetscMPIInt len;
394e781f417SStefano Zampini     char        errstring[MPI_MAX_ERROR_STRING];
395e781f417SStefano Zampini 
396e781f417SStefano Zampini     MPI_Error_string(*err,errstring,&len);
397e781f417SStefano Zampini     PetscError(MPI_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,PETSC_MPI_ERROR_CODE,PETSC_ERROR_INITIAL,"Internal error in MPI: %s",errstring);
398e781f417SStefano Zampini   }
399e781f417SStefano Zampini   return;
400e781f417SStefano Zampini }
401e781f417SStefano Zampini 
40257171095SVaclav Hapla PETSC_INTERN PetscErrorCode  PetscOptionsCheckInitial_Private(const char help[])
403e5c89e4eSSatish Balay {
404e5ed2c37SJose E. Roman   char              string[64];
405e5c89e4eSSatish Balay   MPI_Comm          comm = PETSC_COMM_WORLD;
40657171095SVaclav Hapla   PetscBool         flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp;
407e5c89e4eSSatish Balay   PetscErrorCode    ierr;
40867584ceeSBarry Smith   PetscReal         si;
40928559dc8SJed Brown   PetscInt          intensity;
410e5c89e4eSSatish Balay   int               i;
411e5c89e4eSSatish Balay   PetscMPIInt       rank;
412d314f959SVaclav Hapla   char              version[256];
4132479a3a6SBarry Smith #if defined(PETSC_USE_LOG)
414e5ed2c37SJose E. Roman   char              mname[PETSC_MAX_PATH_LEN];
4152479a3a6SBarry Smith   PetscViewerFormat format;
41667584ceeSBarry Smith   PetscBool         flg4 = PETSC_FALSE;
41767584ceeSBarry Smith #endif
4187381773fSBarry Smith 
419e5c89e4eSSatish Balay   PetscFunctionBegin;
42042218b76SBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
421e5c89e4eSSatish Balay 
42267584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
42392f119d6SBarry Smith   if (!(PETSC_RUNNING_ON_VALGRIND)) {
424e5c89e4eSSatish Balay     /*
425e5c89e4eSSatish Balay       Setup the memory management; support for tracing malloc() usage
426e5c89e4eSSatish Balay     */
427244bdbccSBarry Smith     PetscBool         mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE;
42892f119d6SBarry Smith 
42976bd3646SJed Brown     if (PetscDefined(USE_DEBUG)) {
43092f119d6SBarry Smith       mdebug        = PETSC_TRUE;
43192f119d6SBarry Smith       initializenan = PETSC_TRUE;
43292f119d6SBarry Smith       ierr   = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
43376bd3646SJed Brown     } else {
43492f119d6SBarry Smith       /* don't warn about unused option */
43592f119d6SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr);
43692f119d6SBarry Smith       flg1 = PETSC_FALSE;
43776bd3646SJed Brown     }
43879dccf82SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr);
43992f119d6SBarry Smith     if (flg1 || flg2) {
44092f119d6SBarry Smith       mdebug        = PETSC_TRUE;
44192f119d6SBarry Smith       eachcall      = PETSC_TRUE;
44292f119d6SBarry Smith       initializenan = PETSC_TRUE;
44379dccf82SBarry Smith     } else if (flg3 && !flg2) {
44479dccf82SBarry Smith       mdebug        = PETSC_FALSE;
44579dccf82SBarry Smith       eachcall      = PETSC_FALSE;
44679dccf82SBarry Smith       initializenan = PETSC_FALSE;
447e5c89e4eSSatish Balay     }
44892f119d6SBarry Smith 
44992f119d6SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr);
45092f119d6SBarry Smith     if (mlog) {
45192f119d6SBarry Smith       mdebug = PETSC_TRUE;
45292f119d6SBarry Smith     }
45379dccf82SBarry Smith     /* the next line is deprecated */
45492f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr);
45592f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr);
45692f119d6SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr);
45792f119d6SBarry Smith     if (mdebug) {
45892f119d6SBarry Smith       ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr);
45992f119d6SBarry Smith     }
46092f119d6SBarry Smith     if (mlog) {
46192f119d6SBarry Smith       PetscReal logthreshold = 0;
46292f119d6SBarry Smith       ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr);
46392f119d6SBarry Smith       ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr);
46492f119d6SBarry Smith     }
4658b254c29SBarry Smith #if defined(PETSC_USE_LOG)
4668b254c29SBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr);
4678b254c29SBarry Smith #endif
46892f119d6SBarry Smith   }
46992f119d6SBarry Smith 
470ba282f50SJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr);
471ba282f50SJed Brown   if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);}
47290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
4732f21b5c6SHong Zhang   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr);
474cf6f3811SHong Zhang   /* ignore this option if malloc is already set */
475cf6f3811SHong Zhang   if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);}
476e5c89e4eSSatish Balay 
47790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
478c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr);
4797783f70dSSatish Balay   if (!flg1) {
48090d69ab7SBarry Smith     flg1 = PETSC_FALSE;
481c5929fdfSBarry Smith     ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr);
4827783f70dSSatish Balay   }
483e5c89e4eSSatish Balay   if (flg1) {
484e5c89e4eSSatish Balay     ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
485e5c89e4eSSatish Balay   }
48667584ceeSBarry Smith #endif
487e5c89e4eSSatish Balay 
488b4427426SBarry Smith #if defined(PETSC_USE_LOG)
489c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr);
490b4427426SBarry Smith #endif
49105df10baSBarry Smith 
492e5c89e4eSSatish Balay   /*
493e5c89e4eSSatish Balay       Set the display variable for graphics
494e5c89e4eSSatish Balay   */
495e5c89e4eSSatish Balay   ierr = PetscSetDisplay();CHKERRQ(ierr);
496e5c89e4eSSatish Balay 
49751dcc849SKerry Stevens   /*
49857171095SVaclav Hapla      Print main application help message
49957171095SVaclav Hapla   */
50057171095SVaclav Hapla   ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr);
50157171095SVaclav Hapla   if (help && hasHelp) {
50257171095SVaclav Hapla     ierr = PetscPrintf(comm,help);CHKERRQ(ierr);
50357171095SVaclav Hapla     ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr);
50457171095SVaclav Hapla   }
50557171095SVaclav Hapla 
50657171095SVaclav Hapla   /*
507e5c89e4eSSatish Balay       Print the PETSc version information
508e5c89e4eSSatish Balay   */
509d314f959SVaclav Hapla   ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr);
510d314f959SVaclav Hapla   if (flg1 || hasHelp) {
511e5c89e4eSSatish Balay     /*
512e5c89e4eSSatish Balay        Print "higher-level" package version message
513e5c89e4eSSatish Balay     */
514e5c89e4eSSatish Balay     if (PetscExternalVersionFunction) {
515e5c89e4eSSatish Balay       ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr);
516e5c89e4eSSatish Balay     }
517e5c89e4eSSatish Balay 
518a523d312SBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr);
519e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr);
520e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr);
521e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr);
52284e42920SBarry Smith     ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr);
523e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr);
524e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr);
525c0bb3764SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr);
5267ca660e7SBarry Smith   }
5277ca660e7SBarry Smith 
52894941ca7SBarry Smith   /*
52994941ca7SBarry Smith        Print "higher-level" package help message
53094941ca7SBarry Smith   */
53157171095SVaclav Hapla   if (hasHelp) {
532d314f959SVaclav Hapla     PetscBool hasHelpIntro;
533d314f959SVaclav Hapla 
53494941ca7SBarry Smith     if (PetscExternalHelpFunction) {
53594941ca7SBarry Smith       ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr);
53694941ca7SBarry Smith     }
537d314f959SVaclav Hapla     ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr);
538d314f959SVaclav Hapla     if (hasHelpIntro) {
539bdb346e9SBarry Smith       ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr);
540008a6e76SBarry Smith       ierr = PetscFreeMPIResources();CHKERRQ(ierr);
5417ca660e7SBarry Smith       ierr = MPI_Finalize();CHKERRQ(ierr);
5427ca660e7SBarry Smith       exit(0);
5437ca660e7SBarry Smith     }
544e5c89e4eSSatish Balay   }
545e5c89e4eSSatish Balay 
546e5c89e4eSSatish Balay   /*
547e5c89e4eSSatish Balay       Setup the error handling
548e5c89e4eSSatish Balay   */
54990d69ab7SBarry Smith   flg1 = PETSC_FALSE;
550c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr);
551b59baad1SJed Brown   if (flg1) {
55242218b76SBarry Smith     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRQ(ierr);
55302c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
554b59baad1SJed Brown   }
55590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
556c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr);
55702c9f0b5SLisandro Dalcin   if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);}
55890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
559c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr);
560e5c89e4eSSatish Balay   if (flg1) {
561d54338ecSKarl Rupp     ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr);
562e5c89e4eSSatish Balay   }
563e781f417SStefano Zampini   /* experimental */
564e781f417SStefano Zampini   flg1 = PETSC_FALSE;
565e781f417SStefano Zampini   ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_error_string",&flg1,NULL);CHKERRQ(ierr);
566e781f417SStefano Zampini   if (flg1) {
567e781f417SStefano Zampini     MPI_Errhandler eh;
568e781f417SStefano Zampini 
569e781f417SStefano Zampini     ierr = MPI_Comm_create_errhandler(PetscMPI_Comm_eh,&eh);CHKERRQ(ierr);
570e781f417SStefano Zampini     ierr = MPI_Comm_set_errhandler(comm,eh);CHKERRQ(ierr);
571e781f417SStefano Zampini     ierr = MPI_Errhandler_free(&eh);CHKERRQ(ierr);
572e781f417SStefano Zampini   }
57390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
574c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr);
5758d359177SBarry Smith   if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);}
576e5c89e4eSSatish Balay 
577e5c89e4eSSatish Balay   /*
578e5c89e4eSSatish Balay       Setup debugger information
579e5c89e4eSSatish Balay   */
580e5c89e4eSSatish Balay   ierr = PetscSetDefaultDebugger();CHKERRQ(ierr);
581589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
582e5c89e4eSSatish Balay   if (flg1) {
583e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
584e5c89e4eSSatish Balay 
585e5c89e4eSSatish Balay     ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
58633c7d699SBarry Smith     ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr);
587d54338ecSKarl Rupp     ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRQ(ierr);
58802c9f0b5SLisandro Dalcin     ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr);
589e5c89e4eSSatish Balay   }
590589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr);
5915e96ac45SJed Brown   if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); }
592589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr);
593589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr);
594e5c89e4eSSatish Balay   if (flg1 || flg2) {
595e5c89e4eSSatish Balay     PetscMPIInt    size;
596e5c89e4eSSatish Balay     PetscInt       lsize,*nodes;
597e5c89e4eSSatish Balay     MPI_Errhandler err_handler;
598e5c89e4eSSatish Balay     /*
599e5c89e4eSSatish Balay        we have to make sure that all processors have opened
600e5c89e4eSSatish Balay        connections to all other processors, otherwise once the
601e5c89e4eSSatish Balay        debugger has stated it is likely to receive a SIGUSR1
602e5c89e4eSSatish Balay        and kill the program.
603e5c89e4eSSatish Balay     */
60442218b76SBarry Smith     ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
605e5c89e4eSSatish Balay     if (size > 2) {
606533163c2SBarry Smith       PetscMPIInt dummy = 0;
607e5c89e4eSSatish Balay       MPI_Status  status;
608e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
609e5c89e4eSSatish Balay         if (rank != i) {
61042218b76SBarry Smith           ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRQ(ierr);
611e5c89e4eSSatish Balay         }
612e5c89e4eSSatish Balay       }
613e5c89e4eSSatish Balay       for (i=0; i<size; i++) {
614e5c89e4eSSatish Balay         if (rank != i) {
61542218b76SBarry Smith           ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRQ(ierr);
616e5c89e4eSSatish Balay         }
617e5c89e4eSSatish Balay       }
618e5c89e4eSSatish Balay     }
619e5c89e4eSSatish Balay     /* check if this processor node should be in debugger */
620785e854fSJed Brown     ierr  = PetscMalloc1(size,&nodes);CHKERRQ(ierr);
621e5c89e4eSSatish Balay     lsize = size;
622c5929fdfSBarry Smith     ierr  = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr);
623e5c89e4eSSatish Balay     if (flag) {
624e5c89e4eSSatish Balay       for (i=0; i<lsize; i++) {
625e5c89e4eSSatish Balay         if (nodes[i] == rank) { flag = PETSC_FALSE; break; }
626e5c89e4eSSatish Balay       }
627e5c89e4eSSatish Balay     }
628e5c89e4eSSatish Balay     if (!flag) {
629e5c89e4eSSatish Balay       ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr);
63002c9f0b5SLisandro Dalcin       ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr);
631e5c89e4eSSatish Balay       if (flg1) {
632e5c89e4eSSatish Balay         ierr = PetscAttachDebugger();CHKERRQ(ierr);
633e5c89e4eSSatish Balay       } else {
634e5c89e4eSSatish Balay         ierr = PetscStopForDebugger();CHKERRQ(ierr);
635e5c89e4eSSatish Balay       }
63633c7d699SBarry Smith       ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr);
637d54338ecSKarl Rupp       ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRQ(ierr);
638e5c89e4eSSatish Balay     }
639e5c89e4eSSatish Balay     ierr = PetscFree(nodes);CHKERRQ(ierr);
640e5c89e4eSSatish Balay   }
641e5c89e4eSSatish Balay 
642589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr);
643cb9801acSJed Brown   if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);}
644e5c89e4eSSatish Balay 
645e5c89e4eSSatish Balay   /*
646e5c89e4eSSatish Balay         Setup profiling and logging
647e5c89e4eSSatish Balay   */
6486cf91177SBarry Smith #if defined(PETSC_USE_INFO)
6498bb29257SSatish Balay   {
650e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr);
651e5c89e4eSSatish Balay   }
652865f6aa8SSatish Balay #endif
653aba4c478SBarry Smith   ierr = PetscDetermineInitialFPTrap();
654cc9df77eSBarry Smith   flg1 = PETSC_FALSE;
655cc9df77eSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr);
656cc9df77eSBarry Smith   if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);}
657cc9df77eSBarry Smith   ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr);
658cc9df77eSBarry Smith   if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);}
659865f6aa8SSatish Balay #if defined(PETSC_USE_LOG)
660865f6aa8SSatish Balay   mname[0] = 0;
661589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
662865f6aa8SSatish Balay   if (flg1) {
663865f6aa8SSatish Balay     if (mname[0]) {
664f3dea69dSBarry Smith       ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr);
665865f6aa8SSatish Balay     } else {
666706d7a88SBarry Smith       ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr);
667865f6aa8SSatish Balay     }
668865f6aa8SSatish Balay   }
669217044c2SLisandro Dalcin 
670217044c2SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr);
671217044c2SLisandro Dalcin 
672e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
67390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
674c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr);
675495fc317SBarry Smith   if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);}
676e5c89e4eSSatish Balay #endif
67790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
67890d69ab7SBarry Smith   flg3 = PETSC_FALSE;
679c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr);
680c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
681e5c89e4eSSatish Balay   if (flg1)                      { ierr = PetscLogAllBegin();CHKERRQ(ierr); }
682bb1d7374SBarry Smith   else if (flg3)                 { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);}
683e5c89e4eSSatish Balay 
684589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr);
685e5c89e4eSSatish Balay   if (flg1) {
686e5c89e4eSSatish Balay     char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN];
687e5c89e4eSSatish Balay     FILE *file;
688e5c89e4eSSatish Balay     if (mname[0]) {
6892e924ca5SSatish Balay       PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank);
690e5c89e4eSSatish Balay       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
691e5c89e4eSSatish Balay       file = fopen(fname,"w");
692f3dea69dSBarry Smith       if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname);
693a297a907SKarl Rupp     } else file = PETSC_STDOUT;
694e5c89e4eSSatish Balay     ierr = PetscLogTraceBegin(file);CHKERRQ(ierr);
695e5c89e4eSSatish Balay   }
696bb1d7374SBarry Smith 
69716413a6aSBarry Smith   ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr);
698bb1d7374SBarry Smith   if (flg4) {
699bb1d7374SBarry Smith     if (format == PETSC_VIEWER_ASCII_XML) {
700bb1d7374SBarry Smith       ierr = PetscLogNestedBegin();CHKERRQ(ierr);
701bb1d7374SBarry Smith     } else {
702bb1d7374SBarry Smith       ierr = PetscLogDefaultBegin();CHKERRQ(ierr);
703bb1d7374SBarry Smith     }
704eccbb886SLisandro Dalcin   }
705eccbb886SLisandro Dalcin   if (flg4 && format == PETSC_VIEWER_ASCII_XML) {
706eccbb886SLisandro Dalcin     PetscReal threshold = PetscRealConstant(0.01);
707eccbb886SLisandro Dalcin     ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr);
708eccbb886SLisandro Dalcin     if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);}
709bb1d7374SBarry Smith   }
710e5c89e4eSSatish Balay #endif
711e5c89e4eSSatish Balay 
712c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr);
713e5c89e4eSSatish Balay 
7144b0a73b2SBarry Smith #if defined(PETSC_HAVE_CUDA)
715*cae85d06SJunchao Zhang   {
716*cae85d06SJunchao Zhang     cudaError_t           cerr;
717*cae85d06SJunchao Zhang     PetscBool             initCUDA = PETSC_FALSE,cudaView = PETSC_FALSE,logView = PETSC_FALSE,devNone = PETSC_FALSE;
718*cae85d06SJunchao Zhang     struct cudaDeviceProp prop;
719*cae85d06SJunchao Zhang     PetscInt              device;
720*cae85d06SJunchao Zhang     char                  devStr[16]={0};
721*cae85d06SJunchao Zhang     int                   devId,devCount;
7228d4e85a7SStefano Zampini     /*
7238d4e85a7SStefano Zampini       If collecting logging information, by default, wait for GPU to complete its operations
7248d4e85a7SStefano Zampini       before returning to the CPU in order to get accurate timings of each event
7258d4e85a7SStefano Zampini     */
726*cae85d06SJunchao Zhang     ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr);
727*cae85d06SJunchao Zhang     if (!logView) {
728*cae85d06SJunchao Zhang       ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);
7298d4e85a7SStefano Zampini     }
730*cae85d06SJunchao Zhang     PetscCUDASynchronize = logView;
7318d4e85a7SStefano Zampini 
732*cae85d06SJunchao Zhang     ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"CUDA options","Sys");CHKERRQ(ierr);
733*cae85d06SJunchao Zhang     ierr = PetscOptionsString("-cuda_set_device","Set which MPI ranks to use which CUDA devices","PetscCUDAInitialize",devStr,devStr,sizeof(devStr),&initCUDA);CHKERRQ(ierr);
734*cae85d06SJunchao Zhang     ierr = PetscStrcasecmp("none",devStr,&devNone);CHKERRQ(ierr);
735*cae85d06SJunchao Zhang     if (devNone) device = -3; /* -3 is the locally used PETSC_NONE in PetscCUDAInitialize() */
736*cae85d06SJunchao Zhang     else {ierr = PetscOptionsInt("-cuda_set_device","Set which MPI ranks to use which CUDA devices","PetscCUDAInitialize",device,&device,&initCUDA);CHKERRQ(ierr);}
7378d4e85a7SStefano Zampini     ierr = PetscOptionsBool("-cuda_synchronize","Wait for the GPU to complete operations before returning to the CPU (on by default with -log_summary or -log_view)",NULL,PetscCUDASynchronize,&PetscCUDASynchronize,NULL);CHKERRQ(ierr);
738*cae85d06SJunchao Zhang     ierr = PetscOptionsDeprecated("-cuda_show_devices","-cuda_view","3.12",NULL);CHKERRQ(ierr);
739*cae85d06SJunchao Zhang     ierr = PetscOptionsName("-cuda_view","Display CUDA device information and assignments",NULL,&cudaView);CHKERRQ(ierr);
740*cae85d06SJunchao Zhang     /* Get use_gpu_aware_mpi ASAP since it might be accessed even before lazy CUDA initialization */
741c2a741eeSJunchao Zhang     ierr = PetscOptionsBool("-use_gpu_aware_mpi","Use GPU-aware MPI",NULL,use_gpu_aware_mpi,&use_gpu_aware_mpi,NULL);CHKERRQ(ierr);
742012f15ecSRichard Tran Mills     ierr = PetscOptionsEnd();CHKERRQ(ierr);
743*cae85d06SJunchao Zhang 
744*cae85d06SJunchao Zhang     if (initCUDA) {ierr = PetscCUDAInitialize(PETSC_COMM_WORLD,device);CHKERRQ(ierr);}
745*cae85d06SJunchao Zhang     else if (logView) { /* With -log_view, we want to do costly cuda runtime initialization early so that not to distort the timing later. */
746*cae85d06SJunchao Zhang       devCount = 0;
747*cae85d06SJunchao Zhang       cerr = cudaGetDeviceCount(&devCount);
748*cae85d06SJunchao Zhang       cudaGetLastError(); /* Reset the last error */
749*cae85d06SJunchao Zhang       if (cerr == cudaSuccess && devCount >= 1) { /* There are GPU(s) */
750*cae85d06SJunchao Zhang         devId = 0;
751*cae85d06SJunchao Zhang         if (devCount > 1) { /* Decide which GPU to init when there are multiple GPUs */
752*cae85d06SJunchao Zhang           cerr = cudaSetDeviceFlags(cudaDeviceMapHost);
753*cae85d06SJunchao Zhang           cudaGetLastError(); /* Reset the last error */
754*cae85d06SJunchao Zhang           if (cerr == cudaSuccess) { /* It implies cuda runtime has not been initialized */
755*cae85d06SJunchao Zhang             ierr  = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
756*cae85d06SJunchao Zhang             devId = rank % devCount;
757*cae85d06SJunchao Zhang             cerr  = cudaSetDevice(devId);CHKERRCUDA(cerr);
758*cae85d06SJunchao Zhang           } else if (cerr == cudaErrorSetOnActiveProcess) {
759*cae85d06SJunchao Zhang             /* It means user initialized cuda runtime outside of petsc. We respect the device choice. */
760*cae85d06SJunchao Zhang             cerr = cudaGetDevice(&devId);CHKERRCUDA(cerr);
761fe2aebe2SStefano Zampini           }
762*cae85d06SJunchao Zhang         }
763*cae85d06SJunchao Zhang         ierr = PetscCUDAInitialize(PETSC_COMM_WORLD,(PetscInt)devId);CHKERRQ(ierr);
764*cae85d06SJunchao Zhang       }
765*cae85d06SJunchao Zhang     }
766*cae85d06SJunchao Zhang 
767*cae85d06SJunchao Zhang     if (cudaView) {
768*cae85d06SJunchao Zhang       ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
769*cae85d06SJunchao Zhang       cerr = cudaGetDeviceCount(&devCount);CHKERRCUDA(cerr);
770*cae85d06SJunchao Zhang       for (devId = 0; devId < devCount; ++devId) {
771*cae85d06SJunchao Zhang         cerr = cudaGetDeviceProperties(&prop,devId);CHKERRCUDA(cerr);
772*cae85d06SJunchao Zhang         ierr = PetscPrintf(PETSC_COMM_WORLD, "CUDA device %d: %s\n", devId, prop.name);CHKERRQ(ierr);
773*cae85d06SJunchao Zhang       }
774*cae85d06SJunchao Zhang       cerr = cudaGetDevice(&devId);CHKERRCUDA(cerr);
775*cae85d06SJunchao Zhang       ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] Using CUDA device %d.\n",rank,devId);CHKERRQ(ierr);
776*cae85d06SJunchao Zhang       ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);CHKERRQ(ierr);
777c2a741eeSJunchao Zhang     }
778c2a741eeSJunchao Zhang   }
7794b0a73b2SBarry Smith #endif
7804b0a73b2SBarry Smith 
781e5c89e4eSSatish Balay   /*
782e5c89e4eSSatish Balay        Print basic help message
783e5c89e4eSSatish Balay   */
78457171095SVaclav Hapla   if (hasHelp) {
785e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr);
786d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr);
787d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr);
788d314f959SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr);
789301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr);
790301d30feSBarry Smith     ierr = (*PetscHelpPrintf)(comm,"       only when run in the debugger\n");CHKERRQ(ierr);
791e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
792e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start the debugger in new xterm\n");CHKERRQ(ierr);
793e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       unless noxterm is given\n");CHKERRQ(ierr);
794e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr);
795e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"       start all processes in the debugger\n");CHKERRQ(ierr);
796e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr);
797e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"    emacs jumps to error file\n");CHKERRQ(ierr);
798e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr);
799e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr);
800e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr);
801e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"                      waits the delay for you to attach\n");CHKERRQ(ierr);
8021cda70a7SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr);
803e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr);
804e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr);
805e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr);
806e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"           note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr);
807e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr);
80879dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr);
80979dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr);
8104161f2a3SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr);
81192f119d6SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr);
81279dccf82SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr);
81326a7e8d4SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr);
814e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr);
815e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr);
816e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr);
817e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr);
818a8c7a070SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr);
8190841954dSBarry Smith     ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr);
820e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
821e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr);
822185ae32fSMatthew G. Knepley     ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr);
823e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr);
82456071f75SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr);
825e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
826495fc317SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr);
827e5c89e4eSSatish Balay #endif
828e94e781bSJacob Faibussowitsch #endif
829e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO)
830fe9b927eSVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr);
831e5c89e4eSSatish Balay #endif
832e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr);
833c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr);
834c5b5d8d5SVaclav Hapla     ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr);
835e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr);
836e5c89e4eSSatish Balay   }
837e5c89e4eSSatish Balay 
83874ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN)
83974ba8654SBarry Smith   {
84074ba8654SBarry Smith   char machine[128];
841589a23caSBarry Smith   ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr);
84274ba8654SBarry Smith   if (flg1) {
84374ba8654SBarry Smith     ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr);
84474ba8654SBarry Smith   }
84574ba8654SBarry Smith   }
84674ba8654SBarry Smith #endif
84774ba8654SBarry Smith 
848c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr);
849e5c89e4eSSatish Balay   if (flg1) {
850e5c89e4eSSatish Balay     ierr = PetscSleep(si);CHKERRQ(ierr);
851e5c89e4eSSatish Balay   }
852e5c89e4eSSatish Balay 
853fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL)
854c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr);
855f14045dbSBarry Smith   if (!flg3) {
856c5929fdfSBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr);
857f14045dbSBarry Smith   }
858c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr);
859f14045dbSBarry Smith   PetscViennaCLSynchronize = flg3;
860fdc842d1SBarry Smith   ierr = PetscViennaCLInit();CHKERRQ(ierr);
8614cf1874eSKarl Rupp #endif
86282f73ecaSAlejandro Lamas Daviña 
863fdc842d1SBarry Smith   /*
864fdc842d1SBarry Smith      Creates the logging data structures; this is enabled even if logging is not turned on
865fdc842d1SBarry Smith      This is the last thing we do before returning to the user code to prevent having the
866fdc842d1SBarry Smith      logging numbers contaminated by any startup time associated with MPI and the GPUs
867fdc842d1SBarry Smith   */
868fdc842d1SBarry Smith #if defined(PETSC_USE_LOG)
869fdc842d1SBarry Smith   ierr = PetscLogInitialize();CHKERRQ(ierr);
870f0a7718cSKarl Rupp #endif
871f0a7718cSKarl Rupp 
872e5c89e4eSSatish Balay   PetscFunctionReturn(0);
873e5c89e4eSSatish Balay }
874