1e5c89e4eSSatish Balay #define PETSC_DLL 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay This file defines the initialization of PETSc, including PetscInitialize() 4e5c89e4eSSatish Balay */ 5e5c89e4eSSatish Balay 6d382aafbSBarry Smith #include "petscsys.h" /*I "petscsys.h" I*/ 78101f56cSMatthew Knepley 87a025f21SVictor Minden #if defined(PETSC_HAVE_CUDA) 92f947c57SVictor Minden #include <cublas.h> 107a025f21SVictor Minden #endif 117a025f21SVictor Minden 12a9f03627SSatish Balay #if defined(PETSC_USE_LOG) 13e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogBegin_Private(void); 14a9f03627SSatish Balay #endif 15461e1b68SBarry Smith extern PetscTruth PetscOpenMPWorker; 16e5c89e4eSSatish Balay 17e5c89e4eSSatish Balay /* -----------------------------------------------------------------------------------------*/ 18e5c89e4eSSatish Balay 19e5c89e4eSSatish Balay extern FILE *petsc_history; 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscInitialize_DynamicLibraries(void); 22e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFinalize_DynamicLibraries(void); 23e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFListDestroyAll(void); 24e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int); 25e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int); 26e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogCloseHistoryFile(FILE **); 27e5c89e4eSSatish Balay 28e5c89e4eSSatish Balay /* this is used by the _, __, and ___ macros (see include/petscerror.h) */ 29e5c89e4eSSatish Balay PetscErrorCode __gierr = 0; 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay /* user may set this BEFORE calling PetscInitialize() */ 32e8373e55SMatthew Knepley MPI_Comm PETSC_COMM_WORLD = MPI_COMM_NULL; 33e5c89e4eSSatish Balay 34480cf27aSJed Brown PetscMPIInt Petsc_Counter_keyval = MPI_KEYVAL_INVALID; 35480cf27aSJed Brown PetscMPIInt Petsc_InnerComm_keyval = MPI_KEYVAL_INVALID; 36480cf27aSJed Brown PetscMPIInt Petsc_OuterComm_keyval = MPI_KEYVAL_INVALID; 37480cf27aSJed Brown 38e5c89e4eSSatish Balay /* 39e5c89e4eSSatish Balay Declare and set all the string names of the PETSc enums 40e5c89e4eSSatish Balay */ 41e5c89e4eSSatish Balay const char *PetscTruths[] = {"FALSE","TRUE","PetscTruth","PETSC_",0}; 42e5c89e4eSSatish Balay const char *PetscDataTypes[] = {"INT", "DOUBLE", "COMPLEX", 43e5c89e4eSSatish Balay "LONG","SHORT", "FLOAT", 44f68b968cSBarry Smith "CHAR","LOGICAL","ENUM","TRUTH","LONGDOUBLE","PetscDataType","PETSC_",0}; 45e5c89e4eSSatish Balay 460f8e0872SSatish Balay PetscTruth PetscPreLoadingUsed = PETSC_FALSE; 470f8e0872SSatish Balay PetscTruth PetscPreLoadingOn = PETSC_FALSE; 480f8e0872SSatish Balay 49e5c89e4eSSatish Balay /* 50e5c89e4eSSatish Balay Checks the options database for initializations related to the 51e5c89e4eSSatish Balay PETSc components 52e5c89e4eSSatish Balay */ 53e5c89e4eSSatish Balay #undef __FUNCT__ 54e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Components" 55e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Components(void) 56e5c89e4eSSatish Balay { 57e5c89e4eSSatish Balay PetscTruth flg1; 58e5c89e4eSSatish Balay PetscErrorCode ierr; 59e5c89e4eSSatish Balay 60e5c89e4eSSatish Balay PetscFunctionBegin; 61e5c89e4eSSatish Balay ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 62e5c89e4eSSatish Balay if (flg1) { 63e5c89e4eSSatish Balay #if defined (PETSC_USE_LOG) 64e8e7597cSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 65e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr); 66e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr); 676cf91177SBarry Smith ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr); 68e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 69e5c89e4eSSatish Balay #endif 70e5c89e4eSSatish Balay } 71e5c89e4eSSatish Balay PetscFunctionReturn(0); 72e5c89e4eSSatish Balay } 73e5c89e4eSSatish Balay 74e5c89e4eSSatish Balay #undef __FUNCT__ 75e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitializeNoArguments" 76e5c89e4eSSatish Balay /*@C 77e5c89e4eSSatish Balay PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without 78e5c89e4eSSatish Balay the command line arguments. 79e5c89e4eSSatish Balay 80e5c89e4eSSatish Balay Collective 81e5c89e4eSSatish Balay 82e5c89e4eSSatish Balay Level: advanced 83e5c89e4eSSatish Balay 84e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeFortran() 85e5c89e4eSSatish Balay @*/ 86e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void) 87e5c89e4eSSatish Balay { 88e5c89e4eSSatish Balay PetscErrorCode ierr; 89e5c89e4eSSatish Balay int argc = 0; 90e5c89e4eSSatish Balay char **args = 0; 91e5c89e4eSSatish Balay 92e5c89e4eSSatish Balay PetscFunctionBegin; 93e5c89e4eSSatish Balay ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL); 94e5c89e4eSSatish Balay PetscFunctionReturn(ierr); 95e5c89e4eSSatish Balay } 96e5c89e4eSSatish Balay 97e5c89e4eSSatish Balay #undef __FUNCT__ 98e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialized" 99e5c89e4eSSatish Balay /*@ 100e5c89e4eSSatish Balay PetscInitialized - Determine whether PETSc is initialized. 101e5c89e4eSSatish Balay 1026dc8fec2Sbcordonn 7 Level: beginner 103e5c89e4eSSatish Balay 104e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 105e5c89e4eSSatish Balay @*/ 106e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *isInitialized) 107e5c89e4eSSatish Balay { 108e5c89e4eSSatish Balay PetscFunctionBegin; 109e5c89e4eSSatish Balay PetscValidPointer(isInitialized, 1); 110e5c89e4eSSatish Balay *isInitialized = PetscInitializeCalled; 111e5c89e4eSSatish Balay PetscFunctionReturn(0); 112e5c89e4eSSatish Balay } 113e5c89e4eSSatish Balay 114e5c89e4eSSatish Balay #undef __FUNCT__ 115e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalized" 116e5c89e4eSSatish Balay /*@ 117e5c89e4eSSatish Balay PetscFinalized - Determine whether PetscFinalize() has been called yet 118e5c89e4eSSatish Balay 119e5c89e4eSSatish Balay Level: developer 120e5c89e4eSSatish Balay 121e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 122e5c89e4eSSatish Balay @*/ 123e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *isFinalized) 124e5c89e4eSSatish Balay { 125e5c89e4eSSatish Balay PetscFunctionBegin; 126e5c89e4eSSatish Balay PetscValidPointer(isFinalized, 1); 127e5c89e4eSSatish Balay *isFinalized = PetscFinalizeCalled; 128e5c89e4eSSatish Balay PetscFunctionReturn(0); 129e5c89e4eSSatish Balay } 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscOptionsCheckInitial_Private(void); 132e5c89e4eSSatish Balay extern PetscTruth PetscBeganMPI; 133e5c89e4eSSatish Balay 134e5c89e4eSSatish Balay /* 135e5c89e4eSSatish Balay This function is the MPI reduction operation used to compute the sum of the 136e5c89e4eSSatish Balay first half of the datatype and the max of the second half. 137e5c89e4eSSatish Balay */ 138e5c89e4eSSatish Balay MPI_Op PetscMaxSum_Op = 0; 139e5c89e4eSSatish Balay 140e5c89e4eSSatish Balay EXTERN_C_BEGIN 141e5c89e4eSSatish Balay #undef __FUNCT__ 142e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum_Local" 1436f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype) 144e5c89e4eSSatish Balay { 145e5c89e4eSSatish Balay PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt; 146e5c89e4eSSatish Balay 147e5c89e4eSSatish Balay PetscFunctionBegin; 148e5c89e4eSSatish Balay if (*datatype != MPIU_2INT) { 149e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2INT data types"); 150e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 151e5c89e4eSSatish Balay } 152e5c89e4eSSatish Balay 153e5c89e4eSSatish Balay for (i=0; i<count; i++) { 154e5c89e4eSSatish Balay xout[2*i] = PetscMax(xout[2*i],xin[2*i]); 155e5c89e4eSSatish Balay xout[2*i+1] += xin[2*i+1]; 156e5c89e4eSSatish Balay } 157*812af9f3SBarry Smith PetscFunctionReturnVoid(); 158e5c89e4eSSatish Balay } 159e5c89e4eSSatish Balay EXTERN_C_END 160e5c89e4eSSatish Balay 161e5c89e4eSSatish Balay /* 162e5c89e4eSSatish Balay Returns the max of the first entry owned by this processor and the 163e5c89e4eSSatish Balay sum of the second entry. 164b693b147SBarry Smith 165b693b147SBarry Smith The reason nprocs[2*i] contains lengths nprocs[2*i+1] contains flag of 1 if length is nonzero 166b693b147SBarry Smith is so that the PetscMaxSum_Op() can set TWO values, if we passed in only nprocs[i] with lengths 167b693b147SBarry Smith there would be no place to store the both needed results. 168e5c89e4eSSatish Balay */ 169e5c89e4eSSatish Balay #undef __FUNCT__ 170e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum" 171e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum) 172e5c89e4eSSatish Balay { 173e5c89e4eSSatish Balay PetscMPIInt size,rank; 174e5c89e4eSSatish Balay PetscInt *work; 175e5c89e4eSSatish Balay PetscErrorCode ierr; 176e5c89e4eSSatish Balay 177e5c89e4eSSatish Balay PetscFunctionBegin; 178e5c89e4eSSatish Balay ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 179e5c89e4eSSatish Balay ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 180e5c89e4eSSatish Balay ierr = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr); 181e5c89e4eSSatish Balay ierr = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr); 182e5c89e4eSSatish Balay *max = work[2*rank]; 183e5c89e4eSSatish Balay *sum = work[2*rank+1]; 184e5c89e4eSSatish Balay ierr = PetscFree(work);CHKERRQ(ierr); 185e5c89e4eSSatish Balay PetscFunctionReturn(0); 186e5c89e4eSSatish Balay } 187e5c89e4eSSatish Balay 188e5c89e4eSSatish Balay /* ----------------------------------------------------------------------------*/ 189e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMax_Op = 0; 190e5c89e4eSSatish Balay 191e5c89e4eSSatish Balay EXTERN_C_BEGIN 192e5c89e4eSSatish Balay #undef __FUNCT__ 193e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMax_Local" 1946f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 195e5c89e4eSSatish Balay { 196e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 197e5c89e4eSSatish Balay PetscInt i,count = *cnt; 198e5c89e4eSSatish Balay 199e5c89e4eSSatish Balay PetscFunctionBegin; 200e5c89e4eSSatish Balay if (*datatype != MPIU_2SCALAR) { 201e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 202e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 203e5c89e4eSSatish Balay } 204e5c89e4eSSatish Balay 205e5c89e4eSSatish Balay for (i=0; i<count; i++) { 206e5c89e4eSSatish Balay if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) { 207e5c89e4eSSatish Balay xout[2*i] = xin[2*i]; 208e5c89e4eSSatish Balay xout[2*i+1] = xin[2*i+1]; 209e5c89e4eSSatish Balay } 210e5c89e4eSSatish Balay } 211*812af9f3SBarry Smith PetscFunctionReturnVoid(); 212e5c89e4eSSatish Balay } 213e5c89e4eSSatish Balay EXTERN_C_END 214e5c89e4eSSatish Balay 215e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMin_Op = 0; 216e5c89e4eSSatish Balay 217e5c89e4eSSatish Balay EXTERN_C_BEGIN 218e5c89e4eSSatish Balay #undef __FUNCT__ 219e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMin_Local" 2206f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 221e5c89e4eSSatish Balay { 222e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 223e5c89e4eSSatish Balay PetscInt i,count = *cnt; 224e5c89e4eSSatish Balay 225e5c89e4eSSatish Balay PetscFunctionBegin; 226e5c89e4eSSatish Balay if (*datatype != MPIU_2SCALAR) { 227e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 228e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 229e5c89e4eSSatish Balay } 230e5c89e4eSSatish Balay 231e5c89e4eSSatish Balay for (i=0; i<count; i++) { 232e5c89e4eSSatish Balay if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) { 233e5c89e4eSSatish Balay xout[2*i] = xin[2*i]; 234e5c89e4eSSatish Balay xout[2*i+1] = xin[2*i+1]; 235e5c89e4eSSatish Balay } 236e5c89e4eSSatish Balay } 237*812af9f3SBarry Smith PetscFunctionReturnVoid(); 238e5c89e4eSSatish Balay } 239e5c89e4eSSatish Balay EXTERN_C_END 240e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/ 241e5c89e4eSSatish Balay 242e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 2432c876bd9SBarry Smith 2442c876bd9SBarry Smith /* 2452c876bd9SBarry Smith This operation is only needed when using complex numbers with older MPI that does not support complex numbers 2462c876bd9SBarry Smith */ 2472c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 24806a205a8SBarry Smith MPI_Op MPIU_SUM = 0; 249e5c89e4eSSatish Balay 250e5c89e4eSSatish Balay EXTERN_C_BEGIN 251e5c89e4eSSatish Balay #undef __FUNCT__ 252e5c89e4eSSatish Balay #define __FUNCT__ "PetscSum_Local" 253e5c89e4eSSatish Balay void PETSC_DLLEXPORT PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 254e5c89e4eSSatish Balay { 255e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 256e5c89e4eSSatish Balay PetscInt i,count = *cnt; 257e5c89e4eSSatish Balay 258e5c89e4eSSatish Balay PetscFunctionBegin; 259e5c89e4eSSatish Balay if (*datatype != MPIU_SCALAR) { 260e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types"); 261e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 262e5c89e4eSSatish Balay } 263e5c89e4eSSatish Balay 264e5c89e4eSSatish Balay for (i=0; i<count; i++) { 265e5c89e4eSSatish Balay xout[i] += xin[i]; 266e5c89e4eSSatish Balay } 267*812af9f3SBarry Smith PetscFunctionReturnVoid(); 268e5c89e4eSSatish Balay } 269e5c89e4eSSatish Balay EXTERN_C_END 270e5c89e4eSSatish Balay #endif 2712c876bd9SBarry Smith #endif 272e5c89e4eSSatish Balay 273480cf27aSJed Brown EXTERN_C_BEGIN 274480cf27aSJed Brown #undef __FUNCT__ 275480cf27aSJed Brown #define __FUNCT__ "Petsc_DelCounter" 276480cf27aSJed Brown /* 277480cf27aSJed Brown Private routine to delete internal tag/name counter storage when a communicator is freed. 278480cf27aSJed Brown 279480cf27aSJed Brown This is called by MPI, not by users. 280480cf27aSJed Brown 281480cf27aSJed Brown Note: this is declared extern "C" because it is passed to MPI_Keyval_create() 282480cf27aSJed Brown 283480cf27aSJed Brown */ 284480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelCounter(MPI_Comm comm,PetscMPIInt keyval,void *count_val,void *extra_state) 285480cf27aSJed Brown { 286480cf27aSJed Brown PetscErrorCode ierr; 287480cf27aSJed Brown 288480cf27aSJed Brown PetscFunctionBegin; 289480cf27aSJed Brown ierr = PetscInfo1(0,"Deleting counter data in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 290480cf27aSJed Brown ierr = PetscFree(count_val);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 291480cf27aSJed Brown PetscFunctionReturn(MPI_SUCCESS); 292480cf27aSJed Brown } 293480cf27aSJed Brown EXTERN_C_END 294480cf27aSJed Brown 295480cf27aSJed Brown EXTERN_C_BEGIN 296480cf27aSJed Brown #undef __FUNCT__ 297480cf27aSJed Brown #define __FUNCT__ "Petsc_DelComm" 298480cf27aSJed Brown /* 299480cf27aSJed Brown This does not actually free anything, it simply marks when a reference count to an internal MPI_Comm reaches zero and the 300480cf27aSJed Brown the external MPI_Comm drops its reference to the internal MPI_Comm 301480cf27aSJed Brown 302480cf27aSJed Brown This is called by MPI, not by users. 303480cf27aSJed Brown 304480cf27aSJed Brown Note: this is declared extern "C" because it is passed to MPI_Keyval_create() 305480cf27aSJed Brown 306480cf27aSJed Brown */ 307480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelComm(MPI_Comm comm,PetscMPIInt keyval,void *attr_val,void *extra_state) 308480cf27aSJed Brown { 309480cf27aSJed Brown PetscErrorCode ierr; 310480cf27aSJed Brown 311480cf27aSJed Brown PetscFunctionBegin; 312480cf27aSJed Brown ierr = PetscInfo1(0,"Deleting PETSc communicator imbedded in a user MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 313480cf27aSJed Brown /* actually don't delete anything because we cannot increase the reference count of the communicator anyways */ 314480cf27aSJed Brown PetscFunctionReturn(MPI_SUCCESS); 315480cf27aSJed Brown } 316480cf27aSJed Brown EXTERN_C_END 317480cf27aSJed Brown 318951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32) 319e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN) 320e39fd77fSBarry Smith EXTERN_C_BEGIN 321e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_extent_fn(MPI_Datatype,MPI_Aint*,void*); 322e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_read_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*); 323e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_write_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*); 324e39fd77fSBarry Smith EXTERN_C_END 325e39fd77fSBarry Smith #endif 326951e3c8eSBarry Smith #endif 327e39fd77fSBarry Smith 3286ae9a8a6SBarry Smith int PetscGlobalArgc = 0; 3296ae9a8a6SBarry Smith char **PetscGlobalArgs = 0; 330e5c89e4eSSatish Balay 331e5c89e4eSSatish Balay #undef __FUNCT__ 332e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetArgs" 333e5c89e4eSSatish Balay /*@C 334e5c89e4eSSatish Balay PetscGetArgs - Allows you to access the raw command line arguments anywhere 335e5c89e4eSSatish Balay after PetscInitialize() is called but before PetscFinalize(). 336e5c89e4eSSatish Balay 337e5c89e4eSSatish Balay Not Collective 338e5c89e4eSSatish Balay 339e5c89e4eSSatish Balay Output Parameters: 340e5c89e4eSSatish Balay + argc - count of number of command line arguments 341e5c89e4eSSatish Balay - args - the command line arguments 342e5c89e4eSSatish Balay 343e5c89e4eSSatish Balay Level: intermediate 344e5c89e4eSSatish Balay 345e5c89e4eSSatish Balay Notes: 346e5c89e4eSSatish Balay This is usually used to pass the command line arguments into other libraries 347e5c89e4eSSatish Balay that are called internally deep in PETSc or the application. 348e5c89e4eSSatish Balay 349f177e3b1SBarry Smith The first argument contains the program name as is normal for C arguments. 350f177e3b1SBarry Smith 351e5c89e4eSSatish Balay Concepts: command line arguments 352e5c89e4eSSatish Balay 353793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments() 354e5c89e4eSSatish Balay 355e5c89e4eSSatish Balay @*/ 356e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int *argc,char ***args) 357e5c89e4eSSatish Balay { 358e5c89e4eSSatish Balay PetscFunctionBegin; 35917186662SBarry Smith if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 360e5c89e4eSSatish Balay *argc = PetscGlobalArgc; 361e5c89e4eSSatish Balay *args = PetscGlobalArgs; 362e5c89e4eSSatish Balay PetscFunctionReturn(0); 363e5c89e4eSSatish Balay } 364e5c89e4eSSatish Balay 365e5c89e4eSSatish Balay #undef __FUNCT__ 366793721a6SBarry Smith #define __FUNCT__ "PetscGetArguments" 367793721a6SBarry Smith /*@C 368793721a6SBarry Smith PetscGetArguments - Allows you to access the command line arguments anywhere 369793721a6SBarry Smith after PetscInitialize() is called but before PetscFinalize(). 370793721a6SBarry Smith 371793721a6SBarry Smith Not Collective 372793721a6SBarry Smith 373793721a6SBarry Smith Output Parameters: 374793721a6SBarry Smith . args - the command line arguments 375793721a6SBarry Smith 376793721a6SBarry Smith Level: intermediate 377793721a6SBarry Smith 378793721a6SBarry Smith Notes: 379793721a6SBarry Smith This does NOT start with the program name and IS null terminated (final arg is void) 380793721a6SBarry Smith 381793721a6SBarry Smith Concepts: command line arguments 382793721a6SBarry Smith 383793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments() 384793721a6SBarry Smith 385793721a6SBarry Smith @*/ 386793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***args) 387793721a6SBarry Smith { 388793721a6SBarry Smith PetscInt i,argc = PetscGlobalArgc; 389793721a6SBarry Smith PetscErrorCode ierr; 390793721a6SBarry Smith 391793721a6SBarry Smith PetscFunctionBegin; 39217186662SBarry Smith if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 393717030eeSLisandro Dalcin if (!argc) {*args = 0; PetscFunctionReturn(0);} 394793721a6SBarry Smith ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr); 395793721a6SBarry Smith for (i=0; i<argc-1; i++) { 396793721a6SBarry Smith ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr); 397793721a6SBarry Smith } 398793721a6SBarry Smith (*args)[argc-1] = 0; 399793721a6SBarry Smith PetscFunctionReturn(0); 400793721a6SBarry Smith } 401793721a6SBarry Smith 402793721a6SBarry Smith #undef __FUNCT__ 403793721a6SBarry Smith #define __FUNCT__ "PetscFreeArguments" 404793721a6SBarry Smith /*@C 405793721a6SBarry Smith PetscFreeArguments - Frees the memory obtained with PetscGetArguments() 406793721a6SBarry Smith 407793721a6SBarry Smith Not Collective 408793721a6SBarry Smith 409793721a6SBarry Smith Output Parameters: 410793721a6SBarry Smith . args - the command line arguments 411793721a6SBarry Smith 412793721a6SBarry Smith Level: intermediate 413793721a6SBarry Smith 414793721a6SBarry Smith Concepts: command line arguments 415793721a6SBarry Smith 416793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments() 417793721a6SBarry Smith 418793721a6SBarry Smith @*/ 419793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **args) 420793721a6SBarry Smith { 421793721a6SBarry Smith PetscInt i = 0; 422793721a6SBarry Smith PetscErrorCode ierr; 423793721a6SBarry Smith 424793721a6SBarry Smith PetscFunctionBegin; 425717030eeSLisandro Dalcin if (!args) {PetscFunctionReturn(0);} 426793721a6SBarry Smith while (args[i]) { 427793721a6SBarry Smith ierr = PetscFree(args[i]);CHKERRQ(ierr); 428793721a6SBarry Smith i++; 429793721a6SBarry Smith } 430793721a6SBarry Smith ierr = PetscFree(args);CHKERRQ(ierr); 431793721a6SBarry Smith PetscFunctionReturn(0); 432793721a6SBarry Smith } 433793721a6SBarry Smith 434793721a6SBarry Smith #undef __FUNCT__ 435e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialize" 436e5c89e4eSSatish Balay /*@C 437e5c89e4eSSatish Balay PetscInitialize - Initializes the PETSc database and MPI. 438e5c89e4eSSatish Balay PetscInitialize() calls MPI_Init() if that has yet to be called, 439e5c89e4eSSatish Balay so this routine should always be called near the beginning of 440e5c89e4eSSatish Balay your program -- usually the very first line! 441e5c89e4eSSatish Balay 442e5c89e4eSSatish Balay Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set 443e5c89e4eSSatish Balay 444e5c89e4eSSatish Balay Input Parameters: 445e5c89e4eSSatish Balay + argc - count of number of command line arguments 446e5c89e4eSSatish Balay . args - the command line arguments 447fc2bca9aSBarry Smith . file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for 448fc2bca9aSBarry Smith code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 449e5c89e4eSSatish Balay - help - [optional] Help message to print, use PETSC_NULL for no message 450e5c89e4eSSatish Balay 45105827820SBarry Smith If you wish PETSc code to run ONLY on a subcommunicator of MPI_COMM_WORLD, create that 45205827820SBarry Smith communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize(). Thus if you are running a 45305827820SBarry Smith four process job and two processes will run PETSc and have PetscInitialize() and PetscFinalize() and two process will not, 45405827820SBarry Smith then do this. If ALL processes in the job are using PetscInitialize() and PetscFinalize() then you don't need to do this, even 45505827820SBarry Smith if different subcommunicators of the job are doing different things with PETSc. 456e5c89e4eSSatish Balay 457e5c89e4eSSatish Balay Options Database Keys: 458e5c89e4eSSatish Balay + -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger 459e5c89e4eSSatish Balay . -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected 460e5c89e4eSSatish Balay . -on_error_emacs <machinename> causes emacsclient to jump to error file 461b52f573bSBarry Smith . -on_error_abort calls abort() when error detected (no traceback) 462e8fb0fc0SBarry Smith . -on_error_mpiabort calls MPI_abort() when error detected 463e8fb0fc0SBarry Smith . -error_output_stderr prints error messages to stderr instead of the default stdout 464e8fb0fc0SBarry Smith . -error_output_none does not print the error messages (but handles errors in the same way as if this was not called) 465e5c89e4eSSatish Balay . -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger 466e5c89e4eSSatish Balay . -debugger_pause [sleeptime] (in seconds) - Pauses debugger 467e5c89e4eSSatish Balay . -stop_for_debugger - Print message on how to attach debugger manually to 468e5c89e4eSSatish Balay process and wait (-debugger_pause) seconds for attachment 4692fb0ec9aSBarry Smith . -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries) 470e5c89e4eSSatish Balay . -malloc no - Indicates not to use error-checking malloc 4712fb0ec9aSBarry Smith . -malloc_debug - check for memory corruption at EVERY malloc or free 472e5c89e4eSSatish Balay . -fp_trap - Stops on floating point exceptions (Note that on the 473e5c89e4eSSatish Balay IBM RS6000 this slows code by at least a factor of 10.) 474e5c89e4eSSatish Balay . -no_signal_handler - Indicates not to trap error signals 475e5c89e4eSSatish Balay . -shared_tmp - indicates /tmp directory is shared by all processors 476e5c89e4eSSatish Balay . -not_shared_tmp - each processor has own /tmp 477e5c89e4eSSatish Balay . -tmp - alternative name of /tmp directory 478e5c89e4eSSatish Balay . -get_total_flops - returns total flops done by all processors 479e5c89e4eSSatish Balay - -memory_info - Print memory usage at end of run 480e5c89e4eSSatish Balay 481e5c89e4eSSatish Balay Options Database Keys for Profiling: 4820598bfebSBarry Smith See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details. 483e5c89e4eSSatish Balay + -log_trace [filename] - Print traces of all PETSc calls 484e5c89e4eSSatish Balay to the screen (useful to determine where a program 485e5c89e4eSSatish Balay hangs without running in the debugger). See PetscLogTraceBegin(). 4866cf91177SBarry Smith . -info <optional filename> - Prints verbose information to the screen 4876cf91177SBarry Smith - -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages 488e5c89e4eSSatish Balay 489e5c89e4eSSatish Balay Environmental Variables: 490e5c89e4eSSatish Balay + PETSC_TMP - alternative tmp directory 491e5c89e4eSSatish Balay . PETSC_SHARED_TMP - tmp is shared by all processes 492e5c89e4eSSatish Balay . PETSC_NOT_SHARED_TMP - each process has its own private tmp 493e5c89e4eSSatish Balay . PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer 494e5c89e4eSSatish Balay - PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to 495e5c89e4eSSatish Balay 496e5c89e4eSSatish Balay 497e5c89e4eSSatish Balay Level: beginner 498e5c89e4eSSatish Balay 499e5c89e4eSSatish Balay Notes: 500e5c89e4eSSatish Balay If for some reason you must call MPI_Init() separately, call 501e5c89e4eSSatish Balay it before PetscInitialize(). 502e5c89e4eSSatish Balay 503e5c89e4eSSatish Balay Fortran Version: 504e5c89e4eSSatish Balay In Fortran this routine has the format 505e5c89e4eSSatish Balay $ call PetscInitialize(file,ierr) 506e5c89e4eSSatish Balay 507e5c89e4eSSatish Balay + ierr - error return code 5083dae0d48SMatthew Knepley - file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL_CHARACTER to not check for 509fc2bca9aSBarry Smith code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 510e5c89e4eSSatish Balay 511e5c89e4eSSatish Balay Important Fortran Note: 512e5c89e4eSSatish Balay In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a 513e5c89e4eSSatish Balay null character string; you CANNOT just use PETSC_NULL as 5140598bfebSBarry Smith in the C version. See the <a href="../../docs/manual.pdf">users manual</a> for details. 515e5c89e4eSSatish Balay 51601cb0274SBarry Smith If your main program is C but you call Fortran code that also uses PETSc you need to call PetscInitializeFortran() soon after 51701cb0274SBarry Smith calling PetscInitialize(). 518e5c89e4eSSatish Balay 519e5c89e4eSSatish Balay Concepts: initializing PETSc 520e5c89e4eSSatish Balay 52101cb0274SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscInitializeNoArguments() 522e5c89e4eSSatish Balay 523e5c89e4eSSatish Balay @*/ 52433a40596SVictor Minden PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int *argc,char ***args,const char file[],const char help[]) 525e5c89e4eSSatish Balay { 526e5c89e4eSSatish Balay PetscErrorCode ierr; 527aa5bb8c0SSatish Balay PetscMPIInt flag, size; 528aa5bb8c0SSatish Balay PetscInt nodesize; 529e5c89e4eSSatish Balay PetscTruth flg; 530e5c89e4eSSatish Balay char hostname[256]; 531e5c89e4eSSatish Balay 532e5c89e4eSSatish Balay PetscFunctionBegin; 533e5c89e4eSSatish Balay if (PetscInitializeCalled) PetscFunctionReturn(0); 534e5c89e4eSSatish Balay 535ae9b4142SLisandro Dalcin /* these must be initialized in a routine, not as a constant declaration*/ 536d89683f4Sbcordonn PETSC_STDOUT = stdout; 537ae9b4142SLisandro Dalcin PETSC_STDERR = stderr; 538e5c89e4eSSatish Balay 539e5c89e4eSSatish Balay ierr = PetscOptionsCreate();CHKERRQ(ierr); 540e5c89e4eSSatish Balay 541e5c89e4eSSatish Balay /* 542e5c89e4eSSatish Balay We initialize the program name here (before MPI_Init()) because MPICH has a bug in 543e5c89e4eSSatish Balay it that it sets args[0] on all processors to be args[0] on the first processor. 544e5c89e4eSSatish Balay */ 545e5c89e4eSSatish Balay if (argc && *argc) { 546e5c89e4eSSatish Balay ierr = PetscSetProgramName(**args);CHKERRQ(ierr); 547e5c89e4eSSatish Balay } else { 548e5c89e4eSSatish Balay ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr); 549e5c89e4eSSatish Balay } 550e5c89e4eSSatish Balay 551e5c89e4eSSatish Balay ierr = MPI_Initialized(&flag);CHKERRQ(ierr); 552e5c89e4eSSatish Balay if (!flag) { 553e32f2f54SBarry Smith if (PETSC_COMM_WORLD != MPI_COMM_NULL) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You cannot set PETSC_COMM_WORLD if you have not initialized MPI first"); 554e5c89e4eSSatish Balay ierr = MPI_Init(argc,args);CHKERRQ(ierr); 555e5c89e4eSSatish Balay PetscBeganMPI = PETSC_TRUE; 556e5c89e4eSSatish Balay } 557e5c89e4eSSatish Balay if (argc && args) { 558e5c89e4eSSatish Balay PetscGlobalArgc = *argc; 559e5c89e4eSSatish Balay PetscGlobalArgs = *args; 560e5c89e4eSSatish Balay } 561e5c89e4eSSatish Balay PetscFinalizeCalled = PETSC_FALSE; 562e5c89e4eSSatish Balay 563e8373e55SMatthew Knepley if (PETSC_COMM_WORLD == MPI_COMM_NULL) { 564e5c89e4eSSatish Balay PETSC_COMM_WORLD = MPI_COMM_WORLD; 565e5c89e4eSSatish Balay } 566e5c89e4eSSatish Balay 567e5c89e4eSSatish Balay /* Done after init due to a bug in MPICH-GM? */ 568e5c89e4eSSatish Balay ierr = PetscErrorPrintfInitialize();CHKERRQ(ierr); 569e5c89e4eSSatish Balay 570e5c89e4eSSatish Balay ierr = MPI_Comm_rank(MPI_COMM_WORLD,&PetscGlobalRank);CHKERRQ(ierr); 571e5c89e4eSSatish Balay ierr = MPI_Comm_size(MPI_COMM_WORLD,&PetscGlobalSize);CHKERRQ(ierr); 572e5c89e4eSSatish Balay 573e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 574e5c89e4eSSatish Balay /* 575e5c89e4eSSatish Balay Initialized the global complex variable; this is because with 576e5c89e4eSSatish Balay shared libraries the constructors for global variables 577e5c89e4eSSatish Balay are not called; at least on IRIX. 578e5c89e4eSSatish Balay */ 579e5c89e4eSSatish Balay { 580762437b8SSatish Balay #if defined(PETSC_CLANGUAGE_CXX) 581e5c89e4eSSatish Balay PetscScalar ic(0.0,1.0); 582e5c89e4eSSatish Balay PETSC_i = ic; 583b7940d39SSatish Balay #else 5843433f298SSatish Balay PETSC_i = I; 585b7940d39SSatish Balay #endif 586762437b8SSatish Balay } 587762437b8SSatish Balay 5882c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 5892c876bd9SBarry Smith ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 5902c876bd9SBarry Smith ierr = MPI_Type_commit(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 591a83b8d76SBarry Smith ierr = MPI_Type_contiguous(2,MPI_FLOAT,&MPI_C_COMPLEX);CHKERRQ(ierr); 592a83b8d76SBarry Smith ierr = MPI_Type_commit(&MPI_C_COMPLEX);CHKERRQ(ierr); 59306a205a8SBarry Smith ierr = MPI_Op_create(PetscSum_Local,1,&MPIU_SUM);CHKERRQ(ierr); 594e5c89e4eSSatish Balay #endif 5952c876bd9SBarry Smith #endif 596e5c89e4eSSatish Balay 597e5c89e4eSSatish Balay /* 598e5c89e4eSSatish Balay Create the PETSc MPI reduction operator that sums of the first 599e5c89e4eSSatish Balay half of the entries and maxes the second half. 600e5c89e4eSSatish Balay */ 601e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr); 602e5c89e4eSSatish Balay 603e5c89e4eSSatish Balay ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr); 604e5c89e4eSSatish Balay ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr); 605e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr); 606e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr); 607e5c89e4eSSatish Balay 608e5c89e4eSSatish Balay ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr); 609e5c89e4eSSatish Balay ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr); 610e5c89e4eSSatish Balay 611e5c89e4eSSatish Balay /* 612480cf27aSJed Brown Attributes to be set on PETSc communicators 613480cf27aSJed Brown */ 614480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelCounter,&Petsc_Counter_keyval,(void*)0);CHKERRQ(ierr); 615480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_InnerComm_keyval,(void*)0);CHKERRQ(ierr); 616480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_OuterComm_keyval,(void*)0);CHKERRQ(ierr); 617480cf27aSJed Brown 618480cf27aSJed Brown /* 619e8fb0fc0SBarry Smith Build the options database 620e5c89e4eSSatish Balay */ 621e5c89e4eSSatish Balay ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr); 622e5c89e4eSSatish Balay 6236dc8fec2Sbcordonn 624e5c89e4eSSatish Balay /* 625e5c89e4eSSatish Balay Print main application help message 626e5c89e4eSSatish Balay */ 627e5c89e4eSSatish Balay ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr); 628e5c89e4eSSatish Balay if (help && flg) { 629e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr); 630e5c89e4eSSatish Balay } 631e5c89e4eSSatish Balay ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr); 632e5c89e4eSSatish Balay 633e5c89e4eSSatish Balay /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */ 634a9f03627SSatish Balay #if defined(PETSC_USE_LOG) 635e5c89e4eSSatish Balay ierr = PetscLogBegin_Private();CHKERRQ(ierr); 636a9f03627SSatish Balay #endif 637e5c89e4eSSatish Balay 638e5c89e4eSSatish Balay /* 639e5c89e4eSSatish Balay Load the dynamic libraries (on machines that support them), this registers all 640e5c89e4eSSatish Balay the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes) 641e5c89e4eSSatish Balay */ 642e5c89e4eSSatish Balay ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr); 643e5c89e4eSSatish Balay 644e5c89e4eSSatish Balay ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 645ae15b995SBarry Smith ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr); 646e5c89e4eSSatish Balay ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr); 647ae15b995SBarry Smith ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr); 648e5c89e4eSSatish Balay 649e5c89e4eSSatish Balay ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr); 650ef6c6fedSBoyana Norris /* Check the options database for options related to the options database itself */ 651ef6c6fedSBoyana Norris ierr = PetscOptionsSetFromOptions();CHKERRQ(ierr); 652ef6c6fedSBoyana Norris 653951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32) 654e39fd77fSBarry Smith /* 655e39fd77fSBarry Smith Tell MPI about our own data representation converter, this would/should be used if extern32 is not supported by the MPI 656e39fd77fSBarry Smith 657e39fd77fSBarry Smith Currently not used because it is not supported by MPICH. 658e39fd77fSBarry Smith */ 659e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN) 660708350f5SSatish Balay ierr = MPI_Register_datarep((char *)"petsc",PetscDataRep_read_conv_fn,PetscDataRep_write_conv_fn,PetscDataRep_extent_fn,PETSC_NULL);CHKERRQ(ierr); 661e39fd77fSBarry Smith #endif 662951e3c8eSBarry Smith #endif 663e39fd77fSBarry Smith 664793721a6SBarry Smith ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_spawn_size",&nodesize,&flg);CHKERRQ(ierr); 665793721a6SBarry Smith if (flg) { 66623464e94SBarry Smith #if defined(PETSC_HAVE_MPI_COMM_SPAWN) 6679505b675SBarry Smith ierr = PetscOpenMPSpawn((PetscMPIInt) nodesize);CHKERRQ(ierr); /* worker nodes never return from here; they go directly to PetscEnd() */ 66823464e94SBarry Smith #else 669e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -openmp_merge_size instead"); 67023464e94SBarry Smith #endif 671793721a6SBarry Smith } else { 67223464e94SBarry Smith ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_merge_size",&nodesize,&flg);CHKERRQ(ierr); 6738002f1cdSBarry Smith if (flg) { 6749505b675SBarry Smith ierr = PetscOpenMPMerge((PetscMPIInt) nodesize,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 6759505b675SBarry Smith if (PetscOpenMPWorker) { /* if worker then never enter user code */ 6769505b675SBarry Smith ierr = PetscEnd(); 6779505b675SBarry Smith } 6788002f1cdSBarry Smith } 679793721a6SBarry Smith } 68090d69ab7SBarry Smith flg = PETSC_FALSE; 68190d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg,PETSC_NULL);CHKERRQ(ierr); 682192daf7cSBarry Smith if (flg) {ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);} 683e5c89e4eSSatish Balay 68435d88935SVictor Minden #if defined(PETSC_HAVE_CUDA) 6852f947c57SVictor Minden cublasInit(); 6863e39abd9SVictor Minden #endif 687301d30feSBarry Smith /* 688301d30feSBarry Smith Once we are completedly initialized then we can set this variables 689301d30feSBarry Smith */ 690301d30feSBarry Smith PetscInitializeCalled = PETSC_TRUE; 691301d30feSBarry Smith PetscFunctionReturn(0); 692e5c89e4eSSatish Balay } 693e5c89e4eSSatish Balay 694e5c89e4eSSatish Balay 695e5c89e4eSSatish Balay #undef __FUNCT__ 696e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalize" 697e5c89e4eSSatish Balay /*@C 698e5c89e4eSSatish Balay PetscFinalize - Checks for options to be called at the conclusion 699e5c89e4eSSatish Balay of the program. MPI_Finalize() is called only if the user had not 700e5c89e4eSSatish Balay called MPI_Init() before calling PetscInitialize(). 701e5c89e4eSSatish Balay 702e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 703e5c89e4eSSatish Balay 704e5c89e4eSSatish Balay Options Database Keys: 705e5c89e4eSSatish Balay + -options_table - Calls PetscOptionsPrint() 706e5c89e4eSSatish Balay . -options_left - Prints unused options that remain in the database 707e5c89e4eSSatish Balay . -options_left no - Does not print unused options that remain in the database 708e5c89e4eSSatish Balay . -mpidump - Calls PetscMPIDump() 709e5c89e4eSSatish Balay . -malloc_dump - Calls PetscMallocDump() 710e5c89e4eSSatish Balay . -malloc_info - Prints total memory usage 711e5c89e4eSSatish Balay - -malloc_log - Prints summary of memory usage 712e5c89e4eSSatish Balay 713e5c89e4eSSatish Balay Options Database Keys for Profiling: 7140598bfebSBarry Smith See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details. 715e5c89e4eSSatish Balay + -log_summary [filename] - Prints summary of flop and timing 716e5c89e4eSSatish Balay information to screen. If the filename is specified the 717e5c89e4eSSatish Balay summary is written to the file. (for code compiled with 718e5c89e4eSSatish Balay PETSC_USE_LOG). See PetscLogPrintSummary(). 719e5c89e4eSSatish Balay . -log_all [filename] - Logs extensive profiling information 720e5c89e4eSSatish Balay (for code compiled with PETSC_USE_LOG). See PetscLogDump(). 721e5c89e4eSSatish Balay . -log [filename] - Logs basic profiline information (for 722e5c89e4eSSatish Balay code compiled with PETSC_USE_LOG). See PetscLogDump(). 723e5c89e4eSSatish Balay . -log_sync - Log the synchronization in scatters, inner products 724e5c89e4eSSatish Balay and norms 725e5c89e4eSSatish Balay - -log_mpe [filename] - Creates a logfile viewable by the 726e5c89e4eSSatish Balay utility Upshot/Nupshot (in MPICH distribution) 727e5c89e4eSSatish Balay 728e5c89e4eSSatish Balay Level: beginner 729e5c89e4eSSatish Balay 730e5c89e4eSSatish Balay Note: 731e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 732e5c89e4eSSatish Balay 733e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscEnd() 734e5c89e4eSSatish Balay @*/ 735e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void) 736e5c89e4eSSatish Balay { 737e5c89e4eSSatish Balay PetscErrorCode ierr; 738e5c89e4eSSatish Balay PetscMPIInt rank; 739e5c89e4eSSatish Balay int nopt; 74090d69ab7SBarry Smith PetscTruth flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE; 741d5649816SBarry Smith #if defined(PETSC_HAVE_AMS) 742d5649816SBarry Smith PetscTruth flg = PETSC_FALSE; 743d5649816SBarry Smith #endif 744e5c89e4eSSatish Balay 745e5c89e4eSSatish Balay PetscFunctionBegin; 746e5c89e4eSSatish Balay 747e5c89e4eSSatish Balay if (!PetscInitializeCalled) { 748e5c89e4eSSatish Balay (*PetscErrorPrintf)("PetscInitialize() must be called before PetscFinalize()\n"); 749e5c89e4eSSatish Balay PetscFunctionReturn(0); 750e5c89e4eSSatish Balay } 751b022a5c1SBarry Smith ierr = PetscInfo(PETSC_NULL,"PetscFinalize() called\n"); 752b022a5c1SBarry Smith 753d5649816SBarry Smith #if defined(PETSC_HAVE_AMS) 754d5649816SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&flg,PETSC_NULL);CHKERRQ(ierr); 755d5649816SBarry Smith if (flg) { 756d5649816SBarry Smith ierr = PetscOptionsAMSDestroy();CHKERRQ(ierr); 757d5649816SBarry Smith } 758d5649816SBarry Smith #endif 759d5649816SBarry Smith 7608002f1cdSBarry Smith ierr = PetscOpenMPFinalize();CHKERRQ(ierr); 7618002f1cdSBarry Smith 76290d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg1,PETSC_NULL);CHKERRQ(ierr); 763192daf7cSBarry Smith if (flg1) {ierr = PetscPythonFinalize();CHKERRQ(ierr);} 764192daf7cSBarry Smith 765e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 76690d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg2,PETSC_NULL);CHKERRQ(ierr); 767e5c89e4eSSatish Balay if (!flg2) { 76890d69ab7SBarry Smith flg2 = PETSC_FALSE; 76990d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg2,PETSC_NULL);CHKERRQ(ierr); 770e5c89e4eSSatish Balay } 771e5c89e4eSSatish Balay if (flg2) { 772e5c89e4eSSatish Balay ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr); 773e5c89e4eSSatish Balay } 774e5c89e4eSSatish Balay 7753fa76a5bSLisandro Dalcin /* 7763fa76a5bSLisandro Dalcin Free all objects registered with PetscObjectRegisterDestroy() such as PETSC_VIEWER_XXX_(). 7773fa76a5bSLisandro Dalcin */ 7783fa76a5bSLisandro Dalcin ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr); 7793fa76a5bSLisandro Dalcin 7803fa76a5bSLisandro Dalcin /* 7813fa76a5bSLisandro Dalcin Free all the registered create functions, such as KSPList, VecList, SNESList, etc 7823fa76a5bSLisandro Dalcin */ 7833fa76a5bSLisandro Dalcin ierr = PetscFListDestroyAll();CHKERRQ(ierr); 7843fa76a5bSLisandro Dalcin 7853fa76a5bSLisandro Dalcin /* 7863fa76a5bSLisandro Dalcin Destroy any packages that registered a finalize 7873fa76a5bSLisandro Dalcin */ 788eb8be38cSBarry Smith ierr = PetscRegisterFinalizeAll();CHKERRQ(ierr); 789e5c89e4eSSatish Balay 790e5c89e4eSSatish Balay /* 791e5c89e4eSSatish Balay Destroy all the function registration lists created 792e5c89e4eSSatish Balay */ 793e5c89e4eSSatish Balay ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr); 794e5c89e4eSSatish Balay 795e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 79690d69ab7SBarry Smith flg1 = PETSC_FALSE; 79790d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-get_total_flops",&flg1,PETSC_NULL);CHKERRQ(ierr); 798e5c89e4eSSatish Balay if (flg1) { 799e5c89e4eSSatish Balay PetscLogDouble flops = 0; 800e5c89e4eSSatish Balay ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 801e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr); 802e5c89e4eSSatish Balay } 803e5c89e4eSSatish Balay #endif 804e5c89e4eSSatish Balay 805e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG) 806e5c89e4eSSatish Balay if (PetscStackActive) { 807e5c89e4eSSatish Balay ierr = PetscStackDestroy();CHKERRQ(ierr); 808e5c89e4eSSatish Balay } 809e5c89e4eSSatish Balay #endif 810e5c89e4eSSatish Balay 811e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 812e5c89e4eSSatish Balay { 813e5c89e4eSSatish Balay char mname[PETSC_MAX_PATH_LEN]; 814e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 815e5c89e4eSSatish Balay mname[0] = 0; 816e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 817e5c89e4eSSatish Balay if (flg1){ 818e5c89e4eSSatish Balay if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);} 819e5c89e4eSSatish Balay else {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);} 820e5c89e4eSSatish Balay } 821e5c89e4eSSatish Balay #endif 822e5c89e4eSSatish Balay mname[0] = 0; 823e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 824e5c89e4eSSatish Balay if (flg1) { 825e5c89e4eSSatish Balay if (mname[0]) {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);} 826e5c89e4eSSatish Balay else {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,0);CHKERRQ(ierr);} 827e5c89e4eSSatish Balay } 828e5c89e4eSSatish Balay 82978392ef1SBarry Smith ierr = PetscOptionsGetString(PETSC_NULL,"-log_detailed",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 83078392ef1SBarry Smith if (flg1) { 83178392ef1SBarry Smith if (mname[0]) {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);} 83278392ef1SBarry Smith else {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,0);CHKERRQ(ierr);} 83378392ef1SBarry Smith } 83478392ef1SBarry Smith 835e5c89e4eSSatish Balay mname[0] = 0; 836e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 837e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr); 838e5c89e4eSSatish Balay if (flg1 || flg2){ 839e5c89e4eSSatish Balay if (mname[0]) PetscLogDump(mname); 840e5c89e4eSSatish Balay else PetscLogDump(0); 841e5c89e4eSSatish Balay } 842e5c89e4eSSatish Balay ierr = PetscLogDestroy();CHKERRQ(ierr); 843e5c89e4eSSatish Balay } 844e5c89e4eSSatish Balay #endif 84590d69ab7SBarry Smith flg1 = PETSC_FALSE; 84690d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr); 847e5c89e4eSSatish Balay if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);} 84890d69ab7SBarry Smith flg1 = PETSC_FALSE; 84990d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpidump",&flg1,PETSC_NULL);CHKERRQ(ierr); 850e5c89e4eSSatish Balay if (flg1) { 851e5c89e4eSSatish Balay ierr = PetscMPIDump(stdout);CHKERRQ(ierr); 852e5c89e4eSSatish Balay } 85390d69ab7SBarry Smith flg1 = PETSC_FALSE; 85490d69ab7SBarry Smith flg2 = PETSC_FALSE; 85590d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr); 85690d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_table",&flg2,PETSC_NULL);CHKERRQ(ierr); 857e5c89e4eSSatish Balay if (flg2) { 858e5c89e4eSSatish Balay if (!rank) {ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);} 859e5c89e4eSSatish Balay } 860e5c89e4eSSatish Balay 861e5c89e4eSSatish Balay /* to prevent PETSc -options_left from warning */ 862cb9801acSJed Brown ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg1);CHKERRQ(ierr); 863cb9801acSJed Brown ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr); 864e5c89e4eSSatish Balay 865f43cc0c9SSatish Balay if (!PetscOpenMPWorker) { /* worker processes skip this because they do not usually process options */ 86633fc4174SSatish Balay flg3 = PETSC_FALSE; /* default value is required */ 867da8b8a77SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr); 868e5c89e4eSSatish Balay ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr); 869e5c89e4eSSatish Balay if (flg3) { 870e5c89e4eSSatish Balay if (!flg2) { /* have not yet printed the options */ 871e5c89e4eSSatish Balay ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr); 872e5c89e4eSSatish Balay } 873e5c89e4eSSatish Balay if (!nopt) { 874e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr); 875e5c89e4eSSatish Balay } else if (nopt == 1) { 876e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr); 877e5c89e4eSSatish Balay } else { 878e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %d unused database options. They are:\n",nopt);CHKERRQ(ierr); 879e5c89e4eSSatish Balay } 880e5c89e4eSSatish Balay } 881e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG) 882da8b8a77SBarry Smith if (nopt && !flg3 && !flg1) { 883e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr); 884e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr); 885e5c89e4eSSatish Balay ierr = PetscOptionsLeft();CHKERRQ(ierr); 886e5c89e4eSSatish Balay } else if (nopt && flg3) { 887e5c89e4eSSatish Balay #else 888e5c89e4eSSatish Balay if (nopt && flg3) { 889e5c89e4eSSatish Balay #endif 890e5c89e4eSSatish Balay ierr = PetscOptionsLeft();CHKERRQ(ierr); 891e5c89e4eSSatish Balay } 892931f367cSBarry Smith } 893e5c89e4eSSatish Balay 89490d69ab7SBarry Smith flg1 = PETSC_FALSE; 89590d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_history",&flg1,PETSC_NULL);CHKERRQ(ierr); 896e5c89e4eSSatish Balay if (flg1) { 897e5c89e4eSSatish Balay ierr = PetscLogCloseHistoryFile(&petsc_history);CHKERRQ(ierr); 898e5c89e4eSSatish Balay petsc_history = 0; 899e5c89e4eSSatish Balay } 900e5c89e4eSSatish Balay 9016cf91177SBarry Smith ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr); 902e5c89e4eSSatish Balay 90390d69ab7SBarry Smith flg1 = PETSC_FALSE; 90490d69ab7SBarry Smith flg3 = PETSC_FALSE; 90590d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr); 90690d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);CHKERRQ(ierr); 907e5c89e4eSSatish Balay if (flg1) { 908e5c89e4eSSatish Balay char fname[PETSC_MAX_PATH_LEN]; 909e5c89e4eSSatish Balay FILE *fd; 910ed9cf6e9SBarry Smith int err; 911e5c89e4eSSatish Balay 912e5c89e4eSSatish Balay fname[0] = 0; 913e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr); 914e5c89e4eSSatish Balay if (flg1 && fname[0]) { 915e5c89e4eSSatish Balay char sname[PETSC_MAX_PATH_LEN]; 916e5c89e4eSSatish Balay 917e5c89e4eSSatish Balay sprintf(sname,"%s_%d",fname,rank); 918e32f2f54SBarry Smith fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 919e5c89e4eSSatish Balay ierr = PetscMallocDump(fd);CHKERRQ(ierr); 920ed9cf6e9SBarry Smith err = fclose(fd); 921e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 922e5c89e4eSSatish Balay } else { 923e5c89e4eSSatish Balay MPI_Comm local_comm; 924e5c89e4eSSatish Balay 925e5c89e4eSSatish Balay ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr); 926e5c89e4eSSatish Balay ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr); 927e5c89e4eSSatish Balay ierr = PetscMallocDump(stdout);CHKERRQ(ierr); 928e5c89e4eSSatish Balay ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr); 929e5c89e4eSSatish Balay ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr); 930e5c89e4eSSatish Balay } 931e5c89e4eSSatish Balay } 932e5c89e4eSSatish Balay if (flg3) { 933e5c89e4eSSatish Balay char fname[PETSC_MAX_PATH_LEN]; 934e5c89e4eSSatish Balay FILE *fd; 935e5c89e4eSSatish Balay 936e5c89e4eSSatish Balay fname[0] = 0; 937e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr); 938e5c89e4eSSatish Balay if (flg1 && fname[0]) { 939e5c89e4eSSatish Balay char sname[PETSC_MAX_PATH_LEN]; 940ed9cf6e9SBarry Smith int err; 941e5c89e4eSSatish Balay 942e5c89e4eSSatish Balay sprintf(sname,"%s_%d",fname,rank); 943e32f2f54SBarry Smith fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 944e5c89e4eSSatish Balay ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr); 945ed9cf6e9SBarry Smith err = fclose(fd); 946e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 947e5c89e4eSSatish Balay } else { 948e5c89e4eSSatish Balay ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr); 949e5c89e4eSSatish Balay } 950e5c89e4eSSatish Balay } 951e5c89e4eSSatish Balay /* Can be destroyed only after all the options are used */ 952e5c89e4eSSatish Balay ierr = PetscOptionsDestroy();CHKERRQ(ierr); 953e5c89e4eSSatish Balay 954e5c89e4eSSatish Balay PetscGlobalArgc = 0; 955e5c89e4eSSatish Balay PetscGlobalArgs = 0; 956e5c89e4eSSatish Balay 957e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 9582c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 95906a205a8SBarry Smith ierr = MPI_Op_free(&MPIU_SUM);CHKERRQ(ierr); 9602c876bd9SBarry Smith ierr = MPI_Type_free(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 961a83b8d76SBarry Smith ierr = MPI_Type_free(&MPI_C_COMPLEX);CHKERRQ(ierr); 9622c876bd9SBarry Smith #endif 963e5c89e4eSSatish Balay #endif 964e5c89e4eSSatish Balay ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr); 965e5c89e4eSSatish Balay ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr); 966e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr); 967e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr); 968e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr); 969e5c89e4eSSatish Balay 970480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_Counter_keyval);CHKERRQ(ierr); 971480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_InnerComm_keyval);CHKERRQ(ierr); 972480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_OuterComm_keyval);CHKERRQ(ierr); 973480cf27aSJed Brown 974ae15b995SBarry Smith ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr); 975e5c89e4eSSatish Balay if (PetscBeganMPI) { 97699608316SBarry Smith #if defined(PETSC_HAVE_MPI_FINALIZED) 97799b1327fSBarry Smith PetscMPIInt flag; 97899b1327fSBarry Smith ierr = MPI_Finalized(&flag);CHKERRQ(ierr); 979e32f2f54SBarry Smith if (flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"MPI_Finalize() has already been called, even though MPI_Init() was called by PetscInitialize()"); 98099608316SBarry Smith #endif 981e5c89e4eSSatish Balay ierr = MPI_Finalize();CHKERRQ(ierr); 982e5c89e4eSSatish Balay } 983e5c89e4eSSatish Balay 9849c4c166aSBarry Smith if (PETSC_ZOPEFD){ 98522b84c2fSbcordonn if (PETSC_ZOPEFD != PETSC_STDOUT) fprintf(PETSC_ZOPEFD, "<<<end>>>"); 9869c4c166aSBarry Smith else fprintf(PETSC_STDOUT, "<<<end>>>"); 9879c4c166aSBarry Smith } 98836186564Sbcordonn 98935d88935SVictor Minden #if defined(PETSC_HAVE_CUDA) 9902f947c57SVictor Minden cublasShutdown(); 991440a5bbfSVictor Minden #endif 992e5c89e4eSSatish Balay /* 993e5c89e4eSSatish Balay 994e5c89e4eSSatish Balay Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because 995e5c89e4eSSatish Balay the communicator has some outstanding requests on it. Specifically if the 996e5c89e4eSSatish Balay flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See 997e5c89e4eSSatish Balay src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate() 998e5c89e4eSSatish Balay is never freed as it should be. Thus one may obtain messages of the form 9990e5e90baSSatish Balay [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the 1000e5c89e4eSSatish Balay memory was not freed. 1001e5c89e4eSSatish Balay 1002e5c89e4eSSatish Balay */ 10031d1a0024SBarry Smith ierr = PetscMallocClear();CHKERRQ(ierr); 1004e5c89e4eSSatish Balay PetscInitializeCalled = PETSC_FALSE; 1005e5c89e4eSSatish Balay PetscFinalizeCalled = PETSC_TRUE; 1006e5c89e4eSSatish Balay PetscFunctionReturn(ierr); 1007e5c89e4eSSatish Balay } 1008e5c89e4eSSatish Balay 1009