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 8*7a025f21SVictor Minden #if defined(PETSC_HAVE_CUDA) 9*7a025f21SVictor Minden 10*7a025f21SVictor Minden EXTERN void cublasInit_Public(void); 11*7a025f21SVictor Minden EXTERN void cublasShutdown_Public(void); 12*7a025f21SVictor Minden #endif 13*7a025f21SVictor Minden 14a9f03627SSatish Balay #if defined(PETSC_USE_LOG) 15e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogBegin_Private(void); 16a9f03627SSatish Balay #endif 17461e1b68SBarry Smith extern PetscTruth PetscOpenMPWorker; 18e5c89e4eSSatish Balay 19e5c89e4eSSatish Balay /* -----------------------------------------------------------------------------------------*/ 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay extern FILE *petsc_history; 22e5c89e4eSSatish Balay 23e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscInitialize_DynamicLibraries(void); 24e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFinalize_DynamicLibraries(void); 25e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFListDestroyAll(void); 26e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int); 27e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int); 28e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogCloseHistoryFile(FILE **); 29e5c89e4eSSatish Balay 30e5c89e4eSSatish Balay /* this is used by the _, __, and ___ macros (see include/petscerror.h) */ 31e5c89e4eSSatish Balay PetscErrorCode __gierr = 0; 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay /* user may set this BEFORE calling PetscInitialize() */ 34e8373e55SMatthew Knepley MPI_Comm PETSC_COMM_WORLD = MPI_COMM_NULL; 35e5c89e4eSSatish Balay 36480cf27aSJed Brown PetscMPIInt Petsc_Counter_keyval = MPI_KEYVAL_INVALID; 37480cf27aSJed Brown PetscMPIInt Petsc_InnerComm_keyval = MPI_KEYVAL_INVALID; 38480cf27aSJed Brown PetscMPIInt Petsc_OuterComm_keyval = MPI_KEYVAL_INVALID; 39480cf27aSJed Brown 40e5c89e4eSSatish Balay /* 41e5c89e4eSSatish Balay Declare and set all the string names of the PETSc enums 42e5c89e4eSSatish Balay */ 43e5c89e4eSSatish Balay const char *PetscTruths[] = {"FALSE","TRUE","PetscTruth","PETSC_",0}; 44e5c89e4eSSatish Balay const char *PetscDataTypes[] = {"INT", "DOUBLE", "COMPLEX", 45e5c89e4eSSatish Balay "LONG","SHORT", "FLOAT", 46f68b968cSBarry Smith "CHAR","LOGICAL","ENUM","TRUTH","LONGDOUBLE","PetscDataType","PETSC_",0}; 47e5c89e4eSSatish Balay 480f8e0872SSatish Balay PetscTruth PetscPreLoadingUsed = PETSC_FALSE; 490f8e0872SSatish Balay PetscTruth PetscPreLoadingOn = PETSC_FALSE; 500f8e0872SSatish Balay 51e5c89e4eSSatish Balay /* 52e5c89e4eSSatish Balay Checks the options database for initializations related to the 53e5c89e4eSSatish Balay PETSc components 54e5c89e4eSSatish Balay */ 55e5c89e4eSSatish Balay #undef __FUNCT__ 56e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Components" 57e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Components(void) 58e5c89e4eSSatish Balay { 59e5c89e4eSSatish Balay PetscTruth flg1; 60e5c89e4eSSatish Balay PetscErrorCode ierr; 61e5c89e4eSSatish Balay 62e5c89e4eSSatish Balay PetscFunctionBegin; 63e5c89e4eSSatish Balay ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 64e5c89e4eSSatish Balay if (flg1) { 65e5c89e4eSSatish Balay #if defined (PETSC_USE_LOG) 66e8e7597cSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 67e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr); 68e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr); 696cf91177SBarry Smith ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr); 70e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 71e5c89e4eSSatish Balay #endif 72e5c89e4eSSatish Balay } 73e5c89e4eSSatish Balay PetscFunctionReturn(0); 74e5c89e4eSSatish Balay } 75e5c89e4eSSatish Balay 76e5c89e4eSSatish Balay #undef __FUNCT__ 77e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitializeNoArguments" 78e5c89e4eSSatish Balay /*@C 79e5c89e4eSSatish Balay PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without 80e5c89e4eSSatish Balay the command line arguments. 81e5c89e4eSSatish Balay 82e5c89e4eSSatish Balay Collective 83e5c89e4eSSatish Balay 84e5c89e4eSSatish Balay Level: advanced 85e5c89e4eSSatish Balay 86e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeFortran() 87e5c89e4eSSatish Balay @*/ 88e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void) 89e5c89e4eSSatish Balay { 90e5c89e4eSSatish Balay PetscErrorCode ierr; 91e5c89e4eSSatish Balay int argc = 0; 92e5c89e4eSSatish Balay char **args = 0; 93e5c89e4eSSatish Balay 94e5c89e4eSSatish Balay PetscFunctionBegin; 95e5c89e4eSSatish Balay ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL); 96e5c89e4eSSatish Balay PetscFunctionReturn(ierr); 97e5c89e4eSSatish Balay } 98e5c89e4eSSatish Balay 99e5c89e4eSSatish Balay #undef __FUNCT__ 100e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialized" 101e5c89e4eSSatish Balay /*@ 102e5c89e4eSSatish Balay PetscInitialized - Determine whether PETSc is initialized. 103e5c89e4eSSatish Balay 1046dc8fec2Sbcordonn 7 Level: beginner 105e5c89e4eSSatish Balay 106e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 107e5c89e4eSSatish Balay @*/ 108e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *isInitialized) 109e5c89e4eSSatish Balay { 110e5c89e4eSSatish Balay PetscFunctionBegin; 111e5c89e4eSSatish Balay PetscValidPointer(isInitialized, 1); 112e5c89e4eSSatish Balay *isInitialized = PetscInitializeCalled; 113e5c89e4eSSatish Balay PetscFunctionReturn(0); 114e5c89e4eSSatish Balay } 115e5c89e4eSSatish Balay 116e5c89e4eSSatish Balay #undef __FUNCT__ 117e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalized" 118e5c89e4eSSatish Balay /*@ 119e5c89e4eSSatish Balay PetscFinalized - Determine whether PetscFinalize() has been called yet 120e5c89e4eSSatish Balay 121e5c89e4eSSatish Balay Level: developer 122e5c89e4eSSatish Balay 123e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 124e5c89e4eSSatish Balay @*/ 125e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *isFinalized) 126e5c89e4eSSatish Balay { 127e5c89e4eSSatish Balay PetscFunctionBegin; 128e5c89e4eSSatish Balay PetscValidPointer(isFinalized, 1); 129e5c89e4eSSatish Balay *isFinalized = PetscFinalizeCalled; 130e5c89e4eSSatish Balay PetscFunctionReturn(0); 131e5c89e4eSSatish Balay } 132e5c89e4eSSatish Balay 133e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscOptionsCheckInitial_Private(void); 134e5c89e4eSSatish Balay extern PetscTruth PetscBeganMPI; 135e5c89e4eSSatish Balay 136e5c89e4eSSatish Balay /* 137e5c89e4eSSatish Balay This function is the MPI reduction operation used to compute the sum of the 138e5c89e4eSSatish Balay first half of the datatype and the max of the second half. 139e5c89e4eSSatish Balay */ 140e5c89e4eSSatish Balay MPI_Op PetscMaxSum_Op = 0; 141e5c89e4eSSatish Balay 142e5c89e4eSSatish Balay EXTERN_C_BEGIN 143e5c89e4eSSatish Balay #undef __FUNCT__ 144e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum_Local" 1456f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype) 146e5c89e4eSSatish Balay { 147e5c89e4eSSatish Balay PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt; 148e5c89e4eSSatish Balay 149e5c89e4eSSatish Balay PetscFunctionBegin; 150e5c89e4eSSatish Balay if (*datatype != MPIU_2INT) { 151e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2INT data types"); 152e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 153e5c89e4eSSatish Balay } 154e5c89e4eSSatish Balay 155e5c89e4eSSatish Balay for (i=0; i<count; i++) { 156e5c89e4eSSatish Balay xout[2*i] = PetscMax(xout[2*i],xin[2*i]); 157e5c89e4eSSatish Balay xout[2*i+1] += xin[2*i+1]; 158e5c89e4eSSatish Balay } 159e5c89e4eSSatish Balay PetscStackPop; 160e5c89e4eSSatish Balay return; 161e5c89e4eSSatish Balay } 162e5c89e4eSSatish Balay EXTERN_C_END 163e5c89e4eSSatish Balay 164e5c89e4eSSatish Balay /* 165e5c89e4eSSatish Balay Returns the max of the first entry owned by this processor and the 166e5c89e4eSSatish Balay sum of the second entry. 167b693b147SBarry Smith 168b693b147SBarry Smith The reason nprocs[2*i] contains lengths nprocs[2*i+1] contains flag of 1 if length is nonzero 169b693b147SBarry Smith is so that the PetscMaxSum_Op() can set TWO values, if we passed in only nprocs[i] with lengths 170b693b147SBarry Smith there would be no place to store the both needed results. 171e5c89e4eSSatish Balay */ 172e5c89e4eSSatish Balay #undef __FUNCT__ 173e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum" 174e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum) 175e5c89e4eSSatish Balay { 176e5c89e4eSSatish Balay PetscMPIInt size,rank; 177e5c89e4eSSatish Balay PetscInt *work; 178e5c89e4eSSatish Balay PetscErrorCode ierr; 179e5c89e4eSSatish Balay 180e5c89e4eSSatish Balay PetscFunctionBegin; 181e5c89e4eSSatish Balay ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 182e5c89e4eSSatish Balay ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 183e5c89e4eSSatish Balay ierr = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr); 184e5c89e4eSSatish Balay ierr = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr); 185e5c89e4eSSatish Balay *max = work[2*rank]; 186e5c89e4eSSatish Balay *sum = work[2*rank+1]; 187e5c89e4eSSatish Balay ierr = PetscFree(work);CHKERRQ(ierr); 188e5c89e4eSSatish Balay PetscFunctionReturn(0); 189e5c89e4eSSatish Balay } 190e5c89e4eSSatish Balay 191e5c89e4eSSatish Balay /* ----------------------------------------------------------------------------*/ 192e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMax_Op = 0; 193e5c89e4eSSatish Balay 194e5c89e4eSSatish Balay EXTERN_C_BEGIN 195e5c89e4eSSatish Balay #undef __FUNCT__ 196e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMax_Local" 1976f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 198e5c89e4eSSatish Balay { 199e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 200e5c89e4eSSatish Balay PetscInt i,count = *cnt; 201e5c89e4eSSatish Balay 202e5c89e4eSSatish Balay PetscFunctionBegin; 203e5c89e4eSSatish Balay if (*datatype != MPIU_2SCALAR) { 204e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 205e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 206e5c89e4eSSatish Balay } 207e5c89e4eSSatish Balay 208e5c89e4eSSatish Balay for (i=0; i<count; i++) { 209e5c89e4eSSatish Balay if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) { 210e5c89e4eSSatish Balay xout[2*i] = xin[2*i]; 211e5c89e4eSSatish Balay xout[2*i+1] = xin[2*i+1]; 212e5c89e4eSSatish Balay } 213e5c89e4eSSatish Balay } 214e5c89e4eSSatish Balay 215e5c89e4eSSatish Balay PetscStackPop; 216e5c89e4eSSatish Balay return; 217e5c89e4eSSatish Balay } 218e5c89e4eSSatish Balay EXTERN_C_END 219e5c89e4eSSatish Balay 220e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMin_Op = 0; 221e5c89e4eSSatish Balay 222e5c89e4eSSatish Balay EXTERN_C_BEGIN 223e5c89e4eSSatish Balay #undef __FUNCT__ 224e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMin_Local" 2256f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 226e5c89e4eSSatish Balay { 227e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 228e5c89e4eSSatish Balay PetscInt i,count = *cnt; 229e5c89e4eSSatish Balay 230e5c89e4eSSatish Balay PetscFunctionBegin; 231e5c89e4eSSatish Balay if (*datatype != MPIU_2SCALAR) { 232e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 233e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 234e5c89e4eSSatish Balay } 235e5c89e4eSSatish Balay 236e5c89e4eSSatish Balay for (i=0; i<count; i++) { 237e5c89e4eSSatish Balay if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) { 238e5c89e4eSSatish Balay xout[2*i] = xin[2*i]; 239e5c89e4eSSatish Balay xout[2*i+1] = xin[2*i+1]; 240e5c89e4eSSatish Balay } 241e5c89e4eSSatish Balay } 242e5c89e4eSSatish Balay 243e5c89e4eSSatish Balay PetscStackPop; 244e5c89e4eSSatish Balay return; 245e5c89e4eSSatish Balay } 246e5c89e4eSSatish Balay EXTERN_C_END 247e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/ 248e5c89e4eSSatish Balay 249e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 2502c876bd9SBarry Smith 2512c876bd9SBarry Smith /* 2522c876bd9SBarry Smith This operation is only needed when using complex numbers with older MPI that does not support complex numbers 2532c876bd9SBarry Smith */ 2542c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 25506a205a8SBarry Smith MPI_Op MPIU_SUM = 0; 256e5c89e4eSSatish Balay 257e5c89e4eSSatish Balay EXTERN_C_BEGIN 258e5c89e4eSSatish Balay #undef __FUNCT__ 259e5c89e4eSSatish Balay #define __FUNCT__ "PetscSum_Local" 260e5c89e4eSSatish Balay void PETSC_DLLEXPORT PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 261e5c89e4eSSatish Balay { 262e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 263e5c89e4eSSatish Balay PetscInt i,count = *cnt; 264e5c89e4eSSatish Balay 265e5c89e4eSSatish Balay PetscFunctionBegin; 266e5c89e4eSSatish Balay if (*datatype != MPIU_SCALAR) { 267e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types"); 268e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 269e5c89e4eSSatish Balay } 270e5c89e4eSSatish Balay 271e5c89e4eSSatish Balay for (i=0; i<count; i++) { 272e5c89e4eSSatish Balay xout[i] += xin[i]; 273e5c89e4eSSatish Balay } 274e5c89e4eSSatish Balay 275e5c89e4eSSatish Balay PetscStackPop; 276e5c89e4eSSatish Balay return; 277e5c89e4eSSatish Balay } 278e5c89e4eSSatish Balay EXTERN_C_END 279e5c89e4eSSatish Balay #endif 2802c876bd9SBarry Smith #endif 281e5c89e4eSSatish Balay 282480cf27aSJed Brown EXTERN_C_BEGIN 283480cf27aSJed Brown #undef __FUNCT__ 284480cf27aSJed Brown #define __FUNCT__ "Petsc_DelCounter" 285480cf27aSJed Brown /* 286480cf27aSJed Brown Private routine to delete internal tag/name counter storage when a communicator is freed. 287480cf27aSJed Brown 288480cf27aSJed Brown This is called by MPI, not by users. 289480cf27aSJed Brown 290480cf27aSJed Brown Note: this is declared extern "C" because it is passed to MPI_Keyval_create() 291480cf27aSJed Brown 292480cf27aSJed Brown */ 293480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelCounter(MPI_Comm comm,PetscMPIInt keyval,void *count_val,void *extra_state) 294480cf27aSJed Brown { 295480cf27aSJed Brown PetscErrorCode ierr; 296480cf27aSJed Brown 297480cf27aSJed Brown PetscFunctionBegin; 298480cf27aSJed Brown ierr = PetscInfo1(0,"Deleting counter data in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 299480cf27aSJed Brown ierr = PetscFree(count_val);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 300480cf27aSJed Brown PetscFunctionReturn(MPI_SUCCESS); 301480cf27aSJed Brown } 302480cf27aSJed Brown EXTERN_C_END 303480cf27aSJed Brown 304480cf27aSJed Brown EXTERN_C_BEGIN 305480cf27aSJed Brown #undef __FUNCT__ 306480cf27aSJed Brown #define __FUNCT__ "Petsc_DelComm" 307480cf27aSJed Brown /* 308480cf27aSJed Brown This does not actually free anything, it simply marks when a reference count to an internal MPI_Comm reaches zero and the 309480cf27aSJed Brown the external MPI_Comm drops its reference to the internal MPI_Comm 310480cf27aSJed Brown 311480cf27aSJed Brown This is called by MPI, not by users. 312480cf27aSJed Brown 313480cf27aSJed Brown Note: this is declared extern "C" because it is passed to MPI_Keyval_create() 314480cf27aSJed Brown 315480cf27aSJed Brown */ 316480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelComm(MPI_Comm comm,PetscMPIInt keyval,void *attr_val,void *extra_state) 317480cf27aSJed Brown { 318480cf27aSJed Brown PetscErrorCode ierr; 319480cf27aSJed Brown 320480cf27aSJed Brown PetscFunctionBegin; 321480cf27aSJed Brown ierr = PetscInfo1(0,"Deleting PETSc communicator imbedded in a user MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 322480cf27aSJed Brown /* actually don't delete anything because we cannot increase the reference count of the communicator anyways */ 323480cf27aSJed Brown PetscFunctionReturn(MPI_SUCCESS); 324480cf27aSJed Brown } 325480cf27aSJed Brown EXTERN_C_END 326480cf27aSJed Brown 327951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32) 328e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN) 329e39fd77fSBarry Smith EXTERN_C_BEGIN 330e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_extent_fn(MPI_Datatype,MPI_Aint*,void*); 331e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_read_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*); 332e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_write_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*); 333e39fd77fSBarry Smith EXTERN_C_END 334e39fd77fSBarry Smith #endif 335951e3c8eSBarry Smith #endif 336e39fd77fSBarry Smith 3376ae9a8a6SBarry Smith int PetscGlobalArgc = 0; 3386ae9a8a6SBarry Smith char **PetscGlobalArgs = 0; 339e5c89e4eSSatish Balay 340e5c89e4eSSatish Balay #undef __FUNCT__ 341e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetArgs" 342e5c89e4eSSatish Balay /*@C 343e5c89e4eSSatish Balay PetscGetArgs - Allows you to access the raw command line arguments anywhere 344e5c89e4eSSatish Balay after PetscInitialize() is called but before PetscFinalize(). 345e5c89e4eSSatish Balay 346e5c89e4eSSatish Balay Not Collective 347e5c89e4eSSatish Balay 348e5c89e4eSSatish Balay Output Parameters: 349e5c89e4eSSatish Balay + argc - count of number of command line arguments 350e5c89e4eSSatish Balay - args - the command line arguments 351e5c89e4eSSatish Balay 352e5c89e4eSSatish Balay Level: intermediate 353e5c89e4eSSatish Balay 354e5c89e4eSSatish Balay Notes: 355e5c89e4eSSatish Balay This is usually used to pass the command line arguments into other libraries 356e5c89e4eSSatish Balay that are called internally deep in PETSc or the application. 357e5c89e4eSSatish Balay 358f177e3b1SBarry Smith The first argument contains the program name as is normal for C arguments. 359f177e3b1SBarry Smith 360e5c89e4eSSatish Balay Concepts: command line arguments 361e5c89e4eSSatish Balay 362793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments() 363e5c89e4eSSatish Balay 364e5c89e4eSSatish Balay @*/ 365e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int *argc,char ***args) 366e5c89e4eSSatish Balay { 367e5c89e4eSSatish Balay PetscFunctionBegin; 36817186662SBarry Smith if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 369e5c89e4eSSatish Balay *argc = PetscGlobalArgc; 370e5c89e4eSSatish Balay *args = PetscGlobalArgs; 371e5c89e4eSSatish Balay PetscFunctionReturn(0); 372e5c89e4eSSatish Balay } 373e5c89e4eSSatish Balay 374e5c89e4eSSatish Balay #undef __FUNCT__ 375793721a6SBarry Smith #define __FUNCT__ "PetscGetArguments" 376793721a6SBarry Smith /*@C 377793721a6SBarry Smith PetscGetArguments - Allows you to access the command line arguments anywhere 378793721a6SBarry Smith after PetscInitialize() is called but before PetscFinalize(). 379793721a6SBarry Smith 380793721a6SBarry Smith Not Collective 381793721a6SBarry Smith 382793721a6SBarry Smith Output Parameters: 383793721a6SBarry Smith . args - the command line arguments 384793721a6SBarry Smith 385793721a6SBarry Smith Level: intermediate 386793721a6SBarry Smith 387793721a6SBarry Smith Notes: 388793721a6SBarry Smith This does NOT start with the program name and IS null terminated (final arg is void) 389793721a6SBarry Smith 390793721a6SBarry Smith Concepts: command line arguments 391793721a6SBarry Smith 392793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments() 393793721a6SBarry Smith 394793721a6SBarry Smith @*/ 395793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***args) 396793721a6SBarry Smith { 397793721a6SBarry Smith PetscInt i,argc = PetscGlobalArgc; 398793721a6SBarry Smith PetscErrorCode ierr; 399793721a6SBarry Smith 400793721a6SBarry Smith PetscFunctionBegin; 40117186662SBarry Smith if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 402717030eeSLisandro Dalcin if (!argc) {*args = 0; PetscFunctionReturn(0);} 403793721a6SBarry Smith ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr); 404793721a6SBarry Smith for (i=0; i<argc-1; i++) { 405793721a6SBarry Smith ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr); 406793721a6SBarry Smith } 407793721a6SBarry Smith (*args)[argc-1] = 0; 408793721a6SBarry Smith PetscFunctionReturn(0); 409793721a6SBarry Smith } 410793721a6SBarry Smith 411793721a6SBarry Smith #undef __FUNCT__ 412793721a6SBarry Smith #define __FUNCT__ "PetscFreeArguments" 413793721a6SBarry Smith /*@C 414793721a6SBarry Smith PetscFreeArguments - Frees the memory obtained with PetscGetArguments() 415793721a6SBarry Smith 416793721a6SBarry Smith Not Collective 417793721a6SBarry Smith 418793721a6SBarry Smith Output Parameters: 419793721a6SBarry Smith . args - the command line arguments 420793721a6SBarry Smith 421793721a6SBarry Smith Level: intermediate 422793721a6SBarry Smith 423793721a6SBarry Smith Concepts: command line arguments 424793721a6SBarry Smith 425793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments() 426793721a6SBarry Smith 427793721a6SBarry Smith @*/ 428793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **args) 429793721a6SBarry Smith { 430793721a6SBarry Smith PetscInt i = 0; 431793721a6SBarry Smith PetscErrorCode ierr; 432793721a6SBarry Smith 433793721a6SBarry Smith PetscFunctionBegin; 434717030eeSLisandro Dalcin if (!args) {PetscFunctionReturn(0);} 435793721a6SBarry Smith while (args[i]) { 436793721a6SBarry Smith ierr = PetscFree(args[i]);CHKERRQ(ierr); 437793721a6SBarry Smith i++; 438793721a6SBarry Smith } 439793721a6SBarry Smith ierr = PetscFree(args);CHKERRQ(ierr); 440793721a6SBarry Smith PetscFunctionReturn(0); 441793721a6SBarry Smith } 442793721a6SBarry Smith 443793721a6SBarry Smith #undef __FUNCT__ 444e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialize" 445e5c89e4eSSatish Balay /*@C 446e5c89e4eSSatish Balay PetscInitialize - Initializes the PETSc database and MPI. 447e5c89e4eSSatish Balay PetscInitialize() calls MPI_Init() if that has yet to be called, 448e5c89e4eSSatish Balay so this routine should always be called near the beginning of 449e5c89e4eSSatish Balay your program -- usually the very first line! 450e5c89e4eSSatish Balay 451e5c89e4eSSatish Balay Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set 452e5c89e4eSSatish Balay 453e5c89e4eSSatish Balay Input Parameters: 454e5c89e4eSSatish Balay + argc - count of number of command line arguments 455e5c89e4eSSatish Balay . args - the command line arguments 456fc2bca9aSBarry Smith . file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for 457fc2bca9aSBarry Smith code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 458e5c89e4eSSatish Balay - help - [optional] Help message to print, use PETSC_NULL for no message 459e5c89e4eSSatish Balay 46005827820SBarry Smith If you wish PETSc code to run ONLY on a subcommunicator of MPI_COMM_WORLD, create that 46105827820SBarry Smith communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize(). Thus if you are running a 46205827820SBarry Smith four process job and two processes will run PETSc and have PetscInitialize() and PetscFinalize() and two process will not, 46305827820SBarry Smith then do this. If ALL processes in the job are using PetscInitialize() and PetscFinalize() then you don't need to do this, even 46405827820SBarry Smith if different subcommunicators of the job are doing different things with PETSc. 465e5c89e4eSSatish Balay 466e5c89e4eSSatish Balay Options Database Keys: 467e5c89e4eSSatish Balay + -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger 468e5c89e4eSSatish Balay . -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected 469e5c89e4eSSatish Balay . -on_error_emacs <machinename> causes emacsclient to jump to error file 470b52f573bSBarry Smith . -on_error_abort calls abort() when error detected (no traceback) 471e8fb0fc0SBarry Smith . -on_error_mpiabort calls MPI_abort() when error detected 472e8fb0fc0SBarry Smith . -error_output_stderr prints error messages to stderr instead of the default stdout 473e8fb0fc0SBarry Smith . -error_output_none does not print the error messages (but handles errors in the same way as if this was not called) 474e5c89e4eSSatish Balay . -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger 475e5c89e4eSSatish Balay . -debugger_pause [sleeptime] (in seconds) - Pauses debugger 476e5c89e4eSSatish Balay . -stop_for_debugger - Print message on how to attach debugger manually to 477e5c89e4eSSatish Balay process and wait (-debugger_pause) seconds for attachment 4782fb0ec9aSBarry Smith . -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries) 479e5c89e4eSSatish Balay . -malloc no - Indicates not to use error-checking malloc 4802fb0ec9aSBarry Smith . -malloc_debug - check for memory corruption at EVERY malloc or free 481e5c89e4eSSatish Balay . -fp_trap - Stops on floating point exceptions (Note that on the 482e5c89e4eSSatish Balay IBM RS6000 this slows code by at least a factor of 10.) 483e5c89e4eSSatish Balay . -no_signal_handler - Indicates not to trap error signals 484e5c89e4eSSatish Balay . -shared_tmp - indicates /tmp directory is shared by all processors 485e5c89e4eSSatish Balay . -not_shared_tmp - each processor has own /tmp 486e5c89e4eSSatish Balay . -tmp - alternative name of /tmp directory 487e5c89e4eSSatish Balay . -get_total_flops - returns total flops done by all processors 488e5c89e4eSSatish Balay - -memory_info - Print memory usage at end of run 489e5c89e4eSSatish Balay 490e5c89e4eSSatish Balay Options Database Keys for Profiling: 491e5c89e4eSSatish Balay See the Profiling chapter of the users manual for details. 492e5c89e4eSSatish Balay + -log_trace [filename] - Print traces of all PETSc calls 493e5c89e4eSSatish Balay to the screen (useful to determine where a program 494e5c89e4eSSatish Balay hangs without running in the debugger). See PetscLogTraceBegin(). 4956cf91177SBarry Smith . -info <optional filename> - Prints verbose information to the screen 4966cf91177SBarry Smith - -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages 497e5c89e4eSSatish Balay 498e5c89e4eSSatish Balay Environmental Variables: 499e5c89e4eSSatish Balay + PETSC_TMP - alternative tmp directory 500e5c89e4eSSatish Balay . PETSC_SHARED_TMP - tmp is shared by all processes 501e5c89e4eSSatish Balay . PETSC_NOT_SHARED_TMP - each process has its own private tmp 502e5c89e4eSSatish Balay . PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer 503e5c89e4eSSatish Balay - PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to 504e5c89e4eSSatish Balay 505e5c89e4eSSatish Balay 506e5c89e4eSSatish Balay Level: beginner 507e5c89e4eSSatish Balay 508e5c89e4eSSatish Balay Notes: 509e5c89e4eSSatish Balay If for some reason you must call MPI_Init() separately, call 510e5c89e4eSSatish Balay it before PetscInitialize(). 511e5c89e4eSSatish Balay 512e5c89e4eSSatish Balay Fortran Version: 513e5c89e4eSSatish Balay In Fortran this routine has the format 514e5c89e4eSSatish Balay $ call PetscInitialize(file,ierr) 515e5c89e4eSSatish Balay 516e5c89e4eSSatish Balay + ierr - error return code 5173dae0d48SMatthew Knepley - file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL_CHARACTER to not check for 518fc2bca9aSBarry Smith code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 519e5c89e4eSSatish Balay 520e5c89e4eSSatish Balay Important Fortran Note: 521e5c89e4eSSatish Balay In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a 522e5c89e4eSSatish Balay null character string; you CANNOT just use PETSC_NULL as 523e5c89e4eSSatish Balay in the C version. See the users manual for details. 524e5c89e4eSSatish Balay 52501cb0274SBarry Smith If your main program is C but you call Fortran code that also uses PETSc you need to call PetscInitializeFortran() soon after 52601cb0274SBarry Smith calling PetscInitialize(). 527e5c89e4eSSatish Balay 528e5c89e4eSSatish Balay Concepts: initializing PETSc 529e5c89e4eSSatish Balay 53001cb0274SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscInitializeNoArguments() 531e5c89e4eSSatish Balay 532e5c89e4eSSatish Balay @*/ 53333a40596SVictor Minden PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int *argc,char ***args,const char file[],const char help[]) 534e5c89e4eSSatish Balay { 535e5c89e4eSSatish Balay PetscErrorCode ierr; 536aa5bb8c0SSatish Balay PetscMPIInt flag, size; 537aa5bb8c0SSatish Balay PetscInt nodesize; 538e5c89e4eSSatish Balay PetscTruth flg; 539e5c89e4eSSatish Balay char hostname[256]; 540e5c89e4eSSatish Balay 541e5c89e4eSSatish Balay PetscFunctionBegin; 542e5c89e4eSSatish Balay if (PetscInitializeCalled) PetscFunctionReturn(0); 543e5c89e4eSSatish Balay 544ae9b4142SLisandro Dalcin /* these must be initialized in a routine, not as a constant declaration*/ 545d89683f4Sbcordonn PETSC_STDOUT = stdout; 546ae9b4142SLisandro Dalcin PETSC_STDERR = stderr; 547e5c89e4eSSatish Balay 548e5c89e4eSSatish Balay ierr = PetscOptionsCreate();CHKERRQ(ierr); 549e5c89e4eSSatish Balay 550e5c89e4eSSatish Balay /* 551e5c89e4eSSatish Balay We initialize the program name here (before MPI_Init()) because MPICH has a bug in 552e5c89e4eSSatish Balay it that it sets args[0] on all processors to be args[0] on the first processor. 553e5c89e4eSSatish Balay */ 554e5c89e4eSSatish Balay if (argc && *argc) { 555e5c89e4eSSatish Balay ierr = PetscSetProgramName(**args);CHKERRQ(ierr); 556e5c89e4eSSatish Balay } else { 557e5c89e4eSSatish Balay ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr); 558e5c89e4eSSatish Balay } 559e5c89e4eSSatish Balay 560e5c89e4eSSatish Balay ierr = MPI_Initialized(&flag);CHKERRQ(ierr); 561e5c89e4eSSatish Balay if (!flag) { 562e32f2f54SBarry 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"); 563e5c89e4eSSatish Balay ierr = MPI_Init(argc,args);CHKERRQ(ierr); 564e5c89e4eSSatish Balay PetscBeganMPI = PETSC_TRUE; 565e5c89e4eSSatish Balay } 566e5c89e4eSSatish Balay if (argc && args) { 567e5c89e4eSSatish Balay PetscGlobalArgc = *argc; 568e5c89e4eSSatish Balay PetscGlobalArgs = *args; 569e5c89e4eSSatish Balay } 570e5c89e4eSSatish Balay PetscFinalizeCalled = PETSC_FALSE; 571e5c89e4eSSatish Balay 572e8373e55SMatthew Knepley if (PETSC_COMM_WORLD == MPI_COMM_NULL) { 573e5c89e4eSSatish Balay PETSC_COMM_WORLD = MPI_COMM_WORLD; 574e5c89e4eSSatish Balay } 575e5c89e4eSSatish Balay 576e5c89e4eSSatish Balay /* Done after init due to a bug in MPICH-GM? */ 577e5c89e4eSSatish Balay ierr = PetscErrorPrintfInitialize();CHKERRQ(ierr); 578e5c89e4eSSatish Balay 579e5c89e4eSSatish Balay ierr = MPI_Comm_rank(MPI_COMM_WORLD,&PetscGlobalRank);CHKERRQ(ierr); 580e5c89e4eSSatish Balay ierr = MPI_Comm_size(MPI_COMM_WORLD,&PetscGlobalSize);CHKERRQ(ierr); 581e5c89e4eSSatish Balay 582e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 583e5c89e4eSSatish Balay /* 584e5c89e4eSSatish Balay Initialized the global complex variable; this is because with 585e5c89e4eSSatish Balay shared libraries the constructors for global variables 586e5c89e4eSSatish Balay are not called; at least on IRIX. 587e5c89e4eSSatish Balay */ 588e5c89e4eSSatish Balay { 589762437b8SSatish Balay #if defined(PETSC_CLANGUAGE_CXX) 590e5c89e4eSSatish Balay PetscScalar ic(0.0,1.0); 591e5c89e4eSSatish Balay PETSC_i = ic; 592b7940d39SSatish Balay #else 5933433f298SSatish Balay PETSC_i = I; 594b7940d39SSatish Balay #endif 595762437b8SSatish Balay } 596762437b8SSatish Balay 5972c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 5982c876bd9SBarry Smith ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 5992c876bd9SBarry Smith ierr = MPI_Type_commit(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 600a83b8d76SBarry Smith ierr = MPI_Type_contiguous(2,MPI_FLOAT,&MPI_C_COMPLEX);CHKERRQ(ierr); 601a83b8d76SBarry Smith ierr = MPI_Type_commit(&MPI_C_COMPLEX);CHKERRQ(ierr); 60206a205a8SBarry Smith ierr = MPI_Op_create(PetscSum_Local,1,&MPIU_SUM);CHKERRQ(ierr); 603e5c89e4eSSatish Balay #endif 6042c876bd9SBarry Smith #endif 605e5c89e4eSSatish Balay 606e5c89e4eSSatish Balay /* 607e5c89e4eSSatish Balay Create the PETSc MPI reduction operator that sums of the first 608e5c89e4eSSatish Balay half of the entries and maxes the second half. 609e5c89e4eSSatish Balay */ 610e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr); 611e5c89e4eSSatish Balay 612e5c89e4eSSatish Balay ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr); 613e5c89e4eSSatish Balay ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr); 614e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr); 615e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr); 616e5c89e4eSSatish Balay 617e5c89e4eSSatish Balay ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr); 618e5c89e4eSSatish Balay ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr); 619e5c89e4eSSatish Balay 620e5c89e4eSSatish Balay /* 621480cf27aSJed Brown Attributes to be set on PETSc communicators 622480cf27aSJed Brown */ 623480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelCounter,&Petsc_Counter_keyval,(void*)0);CHKERRQ(ierr); 624480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_InnerComm_keyval,(void*)0);CHKERRQ(ierr); 625480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_OuterComm_keyval,(void*)0);CHKERRQ(ierr); 626480cf27aSJed Brown 627480cf27aSJed Brown /* 628e8fb0fc0SBarry Smith Build the options database 629e5c89e4eSSatish Balay */ 630e5c89e4eSSatish Balay ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr); 631e5c89e4eSSatish Balay 6326dc8fec2Sbcordonn 633e5c89e4eSSatish Balay /* 634e5c89e4eSSatish Balay Print main application help message 635e5c89e4eSSatish Balay */ 636e5c89e4eSSatish Balay ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr); 637e5c89e4eSSatish Balay if (help && flg) { 638e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr); 639e5c89e4eSSatish Balay } 640e5c89e4eSSatish Balay ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr); 641e5c89e4eSSatish Balay 642e5c89e4eSSatish Balay /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */ 643a9f03627SSatish Balay #if defined(PETSC_USE_LOG) 644e5c89e4eSSatish Balay ierr = PetscLogBegin_Private();CHKERRQ(ierr); 645a9f03627SSatish Balay #endif 646e5c89e4eSSatish Balay 647e5c89e4eSSatish Balay /* 648e5c89e4eSSatish Balay Load the dynamic libraries (on machines that support them), this registers all 649e5c89e4eSSatish Balay the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes) 650e5c89e4eSSatish Balay */ 651e5c89e4eSSatish Balay ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr); 652e5c89e4eSSatish Balay 653e5c89e4eSSatish Balay ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 654ae15b995SBarry Smith ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr); 655e5c89e4eSSatish Balay ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr); 656ae15b995SBarry Smith ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr); 657e5c89e4eSSatish Balay 658e5c89e4eSSatish Balay ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr); 659ef6c6fedSBoyana Norris /* Check the options database for options related to the options database itself */ 660ef6c6fedSBoyana Norris ierr = PetscOptionsSetFromOptions();CHKERRQ(ierr); 661ef6c6fedSBoyana Norris 662951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32) 663e39fd77fSBarry Smith /* 664e39fd77fSBarry Smith Tell MPI about our own data representation converter, this would/should be used if extern32 is not supported by the MPI 665e39fd77fSBarry Smith 666e39fd77fSBarry Smith Currently not used because it is not supported by MPICH. 667e39fd77fSBarry Smith */ 668e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN) 669708350f5SSatish Balay ierr = MPI_Register_datarep((char *)"petsc",PetscDataRep_read_conv_fn,PetscDataRep_write_conv_fn,PetscDataRep_extent_fn,PETSC_NULL);CHKERRQ(ierr); 670e39fd77fSBarry Smith #endif 671951e3c8eSBarry Smith #endif 672e39fd77fSBarry Smith 673793721a6SBarry Smith ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_spawn_size",&nodesize,&flg);CHKERRQ(ierr); 674793721a6SBarry Smith if (flg) { 67523464e94SBarry Smith #if defined(PETSC_HAVE_MPI_COMM_SPAWN) 6769505b675SBarry Smith ierr = PetscOpenMPSpawn((PetscMPIInt) nodesize);CHKERRQ(ierr); /* worker nodes never return from here; they go directly to PetscEnd() */ 67723464e94SBarry Smith #else 678e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -openmp_merge_size instead"); 67923464e94SBarry Smith #endif 680793721a6SBarry Smith } else { 68123464e94SBarry Smith ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_merge_size",&nodesize,&flg);CHKERRQ(ierr); 6828002f1cdSBarry Smith if (flg) { 6839505b675SBarry Smith ierr = PetscOpenMPMerge((PetscMPIInt) nodesize,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 6849505b675SBarry Smith if (PetscOpenMPWorker) { /* if worker then never enter user code */ 6859505b675SBarry Smith ierr = PetscEnd(); 6869505b675SBarry Smith } 6878002f1cdSBarry Smith } 688793721a6SBarry Smith } 68990d69ab7SBarry Smith flg = PETSC_FALSE; 69090d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg,PETSC_NULL);CHKERRQ(ierr); 691192daf7cSBarry Smith if (flg) {ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);} 692e5c89e4eSSatish Balay 69335d88935SVictor Minden #if defined(PETSC_HAVE_CUDA) 694*7a025f21SVictor Minden cublasInit_Public(); 6953e39abd9SVictor Minden #endif 696301d30feSBarry Smith /* 697301d30feSBarry Smith Once we are completedly initialized then we can set this variables 698301d30feSBarry Smith */ 699301d30feSBarry Smith PetscInitializeCalled = PETSC_TRUE; 700301d30feSBarry Smith PetscFunctionReturn(0); 701e5c89e4eSSatish Balay } 702e5c89e4eSSatish Balay 703e5c89e4eSSatish Balay 704e5c89e4eSSatish Balay #undef __FUNCT__ 705e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalize" 706e5c89e4eSSatish Balay /*@C 707e5c89e4eSSatish Balay PetscFinalize - Checks for options to be called at the conclusion 708e5c89e4eSSatish Balay of the program. MPI_Finalize() is called only if the user had not 709e5c89e4eSSatish Balay called MPI_Init() before calling PetscInitialize(). 710e5c89e4eSSatish Balay 711e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 712e5c89e4eSSatish Balay 713e5c89e4eSSatish Balay Options Database Keys: 714e5c89e4eSSatish Balay + -options_table - Calls PetscOptionsPrint() 715e5c89e4eSSatish Balay . -options_left - Prints unused options that remain in the database 716e5c89e4eSSatish Balay . -options_left no - Does not print unused options that remain in the database 717e5c89e4eSSatish Balay . -mpidump - Calls PetscMPIDump() 718e5c89e4eSSatish Balay . -malloc_dump - Calls PetscMallocDump() 719e5c89e4eSSatish Balay . -malloc_info - Prints total memory usage 720e5c89e4eSSatish Balay - -malloc_log - Prints summary of memory usage 721e5c89e4eSSatish Balay 722e5c89e4eSSatish Balay Options Database Keys for Profiling: 723e5c89e4eSSatish Balay See the Profiling chapter of the users manual for details. 724e5c89e4eSSatish Balay + -log_summary [filename] - Prints summary of flop and timing 725e5c89e4eSSatish Balay information to screen. If the filename is specified the 726e5c89e4eSSatish Balay summary is written to the file. (for code compiled with 727e5c89e4eSSatish Balay PETSC_USE_LOG). See PetscLogPrintSummary(). 728e5c89e4eSSatish Balay . -log_all [filename] - Logs extensive profiling information 729e5c89e4eSSatish Balay (for code compiled with PETSC_USE_LOG). See PetscLogDump(). 730e5c89e4eSSatish Balay . -log [filename] - Logs basic profiline information (for 731e5c89e4eSSatish Balay code compiled with PETSC_USE_LOG). See PetscLogDump(). 732e5c89e4eSSatish Balay . -log_sync - Log the synchronization in scatters, inner products 733e5c89e4eSSatish Balay and norms 734e5c89e4eSSatish Balay - -log_mpe [filename] - Creates a logfile viewable by the 735e5c89e4eSSatish Balay utility Upshot/Nupshot (in MPICH distribution) 736e5c89e4eSSatish Balay 737e5c89e4eSSatish Balay Level: beginner 738e5c89e4eSSatish Balay 739e5c89e4eSSatish Balay Note: 740e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 741e5c89e4eSSatish Balay 742e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscEnd() 743e5c89e4eSSatish Balay @*/ 744e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void) 745e5c89e4eSSatish Balay { 746e5c89e4eSSatish Balay PetscErrorCode ierr; 747e5c89e4eSSatish Balay PetscMPIInt rank; 748e5c89e4eSSatish Balay int nopt; 74990d69ab7SBarry Smith PetscTruth flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE; 750d5649816SBarry Smith #if defined(PETSC_HAVE_AMS) 751d5649816SBarry Smith PetscTruth flg = PETSC_FALSE; 752d5649816SBarry Smith #endif 753e5c89e4eSSatish Balay 754e5c89e4eSSatish Balay PetscFunctionBegin; 755e5c89e4eSSatish Balay 756e5c89e4eSSatish Balay if (!PetscInitializeCalled) { 757e5c89e4eSSatish Balay (*PetscErrorPrintf)("PetscInitialize() must be called before PetscFinalize()\n"); 758e5c89e4eSSatish Balay PetscFunctionReturn(0); 759e5c89e4eSSatish Balay } 760b022a5c1SBarry Smith ierr = PetscInfo(PETSC_NULL,"PetscFinalize() called\n"); 761b022a5c1SBarry Smith 762d5649816SBarry Smith #if defined(PETSC_HAVE_AMS) 763d5649816SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&flg,PETSC_NULL);CHKERRQ(ierr); 764d5649816SBarry Smith if (flg) { 765d5649816SBarry Smith ierr = PetscOptionsAMSDestroy();CHKERRQ(ierr); 766d5649816SBarry Smith } 767d5649816SBarry Smith #endif 768d5649816SBarry Smith 7698002f1cdSBarry Smith ierr = PetscOpenMPFinalize();CHKERRQ(ierr); 7708002f1cdSBarry Smith 77190d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg1,PETSC_NULL);CHKERRQ(ierr); 772192daf7cSBarry Smith if (flg1) {ierr = PetscPythonFinalize();CHKERRQ(ierr);} 773192daf7cSBarry Smith 774e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 77590d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg2,PETSC_NULL);CHKERRQ(ierr); 776e5c89e4eSSatish Balay if (!flg2) { 77790d69ab7SBarry Smith flg2 = PETSC_FALSE; 77890d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg2,PETSC_NULL);CHKERRQ(ierr); 779e5c89e4eSSatish Balay } 780e5c89e4eSSatish Balay if (flg2) { 781e5c89e4eSSatish Balay ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr); 782e5c89e4eSSatish Balay } 783e5c89e4eSSatish Balay 7843fa76a5bSLisandro Dalcin /* 7853fa76a5bSLisandro Dalcin Free all objects registered with PetscObjectRegisterDestroy() such as PETSC_VIEWER_XXX_(). 7863fa76a5bSLisandro Dalcin */ 7873fa76a5bSLisandro Dalcin ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr); 7883fa76a5bSLisandro Dalcin 7893fa76a5bSLisandro Dalcin /* 7903fa76a5bSLisandro Dalcin Free all the registered create functions, such as KSPList, VecList, SNESList, etc 7913fa76a5bSLisandro Dalcin */ 7923fa76a5bSLisandro Dalcin ierr = PetscFListDestroyAll();CHKERRQ(ierr); 7933fa76a5bSLisandro Dalcin 7943fa76a5bSLisandro Dalcin /* 7953fa76a5bSLisandro Dalcin Destroy any packages that registered a finalize 7963fa76a5bSLisandro Dalcin */ 797eb8be38cSBarry Smith ierr = PetscRegisterFinalizeAll();CHKERRQ(ierr); 798e5c89e4eSSatish Balay 799e5c89e4eSSatish Balay /* 800e5c89e4eSSatish Balay Destroy all the function registration lists created 801e5c89e4eSSatish Balay */ 802e5c89e4eSSatish Balay ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr); 803e5c89e4eSSatish Balay 804e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 80590d69ab7SBarry Smith flg1 = PETSC_FALSE; 80690d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-get_total_flops",&flg1,PETSC_NULL);CHKERRQ(ierr); 807e5c89e4eSSatish Balay if (flg1) { 808e5c89e4eSSatish Balay PetscLogDouble flops = 0; 809e5c89e4eSSatish Balay ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 810e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr); 811e5c89e4eSSatish Balay } 812e5c89e4eSSatish Balay #endif 813e5c89e4eSSatish Balay 814e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG) 815e5c89e4eSSatish Balay if (PetscStackActive) { 816e5c89e4eSSatish Balay ierr = PetscStackDestroy();CHKERRQ(ierr); 817e5c89e4eSSatish Balay } 818e5c89e4eSSatish Balay #endif 819e5c89e4eSSatish Balay 820e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 821e5c89e4eSSatish Balay { 822e5c89e4eSSatish Balay char mname[PETSC_MAX_PATH_LEN]; 823e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 824e5c89e4eSSatish Balay mname[0] = 0; 825e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 826e5c89e4eSSatish Balay if (flg1){ 827e5c89e4eSSatish Balay if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);} 828e5c89e4eSSatish Balay else {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);} 829e5c89e4eSSatish Balay } 830e5c89e4eSSatish Balay #endif 831e5c89e4eSSatish Balay mname[0] = 0; 832e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 833e5c89e4eSSatish Balay if (flg1) { 834e5c89e4eSSatish Balay if (mname[0]) {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);} 835e5c89e4eSSatish Balay else {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,0);CHKERRQ(ierr);} 836e5c89e4eSSatish Balay } 837e5c89e4eSSatish Balay 83878392ef1SBarry Smith ierr = PetscOptionsGetString(PETSC_NULL,"-log_detailed",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 83978392ef1SBarry Smith if (flg1) { 84078392ef1SBarry Smith if (mname[0]) {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);} 84178392ef1SBarry Smith else {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,0);CHKERRQ(ierr);} 84278392ef1SBarry Smith } 84378392ef1SBarry Smith 844e5c89e4eSSatish Balay mname[0] = 0; 845e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 846e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr); 847e5c89e4eSSatish Balay if (flg1 || flg2){ 848e5c89e4eSSatish Balay if (mname[0]) PetscLogDump(mname); 849e5c89e4eSSatish Balay else PetscLogDump(0); 850e5c89e4eSSatish Balay } 851e5c89e4eSSatish Balay ierr = PetscLogDestroy();CHKERRQ(ierr); 852e5c89e4eSSatish Balay } 853e5c89e4eSSatish Balay #endif 85490d69ab7SBarry Smith flg1 = PETSC_FALSE; 85590d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr); 856e5c89e4eSSatish Balay if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);} 85790d69ab7SBarry Smith flg1 = PETSC_FALSE; 85890d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpidump",&flg1,PETSC_NULL);CHKERRQ(ierr); 859e5c89e4eSSatish Balay if (flg1) { 860e5c89e4eSSatish Balay ierr = PetscMPIDump(stdout);CHKERRQ(ierr); 861e5c89e4eSSatish Balay } 86290d69ab7SBarry Smith flg1 = PETSC_FALSE; 86390d69ab7SBarry Smith flg2 = PETSC_FALSE; 86490d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr); 86590d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_table",&flg2,PETSC_NULL);CHKERRQ(ierr); 866e5c89e4eSSatish Balay if (flg2) { 867e5c89e4eSSatish Balay if (!rank) {ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);} 868e5c89e4eSSatish Balay } 869e5c89e4eSSatish Balay 870e5c89e4eSSatish Balay /* to prevent PETSc -options_left from warning */ 871cb9801acSJed Brown ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg1);CHKERRQ(ierr); 872cb9801acSJed Brown ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr); 873e5c89e4eSSatish Balay 874f43cc0c9SSatish Balay if (!PetscOpenMPWorker) { /* worker processes skip this because they do not usually process options */ 87533fc4174SSatish Balay flg3 = PETSC_FALSE; /* default value is required */ 876da8b8a77SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr); 877e5c89e4eSSatish Balay ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr); 878e5c89e4eSSatish Balay if (flg3) { 879e5c89e4eSSatish Balay if (!flg2) { /* have not yet printed the options */ 880e5c89e4eSSatish Balay ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr); 881e5c89e4eSSatish Balay } 882e5c89e4eSSatish Balay if (!nopt) { 883e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr); 884e5c89e4eSSatish Balay } else if (nopt == 1) { 885e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr); 886e5c89e4eSSatish Balay } else { 887e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %d unused database options. They are:\n",nopt);CHKERRQ(ierr); 888e5c89e4eSSatish Balay } 889e5c89e4eSSatish Balay } 890e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG) 891da8b8a77SBarry Smith if (nopt && !flg3 && !flg1) { 892e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr); 893e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr); 894e5c89e4eSSatish Balay ierr = PetscOptionsLeft();CHKERRQ(ierr); 895e5c89e4eSSatish Balay } else if (nopt && flg3) { 896e5c89e4eSSatish Balay #else 897e5c89e4eSSatish Balay if (nopt && flg3) { 898e5c89e4eSSatish Balay #endif 899e5c89e4eSSatish Balay ierr = PetscOptionsLeft();CHKERRQ(ierr); 900e5c89e4eSSatish Balay } 901931f367cSBarry Smith } 902e5c89e4eSSatish Balay 90390d69ab7SBarry Smith flg1 = PETSC_FALSE; 90490d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_history",&flg1,PETSC_NULL);CHKERRQ(ierr); 905e5c89e4eSSatish Balay if (flg1) { 906e5c89e4eSSatish Balay ierr = PetscLogCloseHistoryFile(&petsc_history);CHKERRQ(ierr); 907e5c89e4eSSatish Balay petsc_history = 0; 908e5c89e4eSSatish Balay } 909e5c89e4eSSatish Balay 9106cf91177SBarry Smith ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr); 911e5c89e4eSSatish Balay 91290d69ab7SBarry Smith flg1 = PETSC_FALSE; 91390d69ab7SBarry Smith flg3 = PETSC_FALSE; 91490d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr); 91590d69ab7SBarry Smith ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);CHKERRQ(ierr); 916e5c89e4eSSatish Balay if (flg1) { 917e5c89e4eSSatish Balay char fname[PETSC_MAX_PATH_LEN]; 918e5c89e4eSSatish Balay FILE *fd; 919ed9cf6e9SBarry Smith int err; 920e5c89e4eSSatish Balay 921e5c89e4eSSatish Balay fname[0] = 0; 922e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr); 923e5c89e4eSSatish Balay if (flg1 && fname[0]) { 924e5c89e4eSSatish Balay char sname[PETSC_MAX_PATH_LEN]; 925e5c89e4eSSatish Balay 926e5c89e4eSSatish Balay sprintf(sname,"%s_%d",fname,rank); 927e32f2f54SBarry Smith fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 928e5c89e4eSSatish Balay ierr = PetscMallocDump(fd);CHKERRQ(ierr); 929ed9cf6e9SBarry Smith err = fclose(fd); 930e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 931e5c89e4eSSatish Balay } else { 932e5c89e4eSSatish Balay MPI_Comm local_comm; 933e5c89e4eSSatish Balay 934e5c89e4eSSatish Balay ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr); 935e5c89e4eSSatish Balay ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr); 936e5c89e4eSSatish Balay ierr = PetscMallocDump(stdout);CHKERRQ(ierr); 937e5c89e4eSSatish Balay ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr); 938e5c89e4eSSatish Balay ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr); 939e5c89e4eSSatish Balay } 940e5c89e4eSSatish Balay } 941e5c89e4eSSatish Balay if (flg3) { 942e5c89e4eSSatish Balay char fname[PETSC_MAX_PATH_LEN]; 943e5c89e4eSSatish Balay FILE *fd; 944e5c89e4eSSatish Balay 945e5c89e4eSSatish Balay fname[0] = 0; 946e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr); 947e5c89e4eSSatish Balay if (flg1 && fname[0]) { 948e5c89e4eSSatish Balay char sname[PETSC_MAX_PATH_LEN]; 949ed9cf6e9SBarry Smith int err; 950e5c89e4eSSatish Balay 951e5c89e4eSSatish Balay sprintf(sname,"%s_%d",fname,rank); 952e32f2f54SBarry Smith fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 953e5c89e4eSSatish Balay ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr); 954ed9cf6e9SBarry Smith err = fclose(fd); 955e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 956e5c89e4eSSatish Balay } else { 957e5c89e4eSSatish Balay ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr); 958e5c89e4eSSatish Balay } 959e5c89e4eSSatish Balay } 960e5c89e4eSSatish Balay /* Can be destroyed only after all the options are used */ 961e5c89e4eSSatish Balay ierr = PetscOptionsDestroy();CHKERRQ(ierr); 962e5c89e4eSSatish Balay 963e5c89e4eSSatish Balay PetscGlobalArgc = 0; 964e5c89e4eSSatish Balay PetscGlobalArgs = 0; 965e5c89e4eSSatish Balay 966e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 9672c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 96806a205a8SBarry Smith ierr = MPI_Op_free(&MPIU_SUM);CHKERRQ(ierr); 9692c876bd9SBarry Smith ierr = MPI_Type_free(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 970a83b8d76SBarry Smith ierr = MPI_Type_free(&MPI_C_COMPLEX);CHKERRQ(ierr); 9712c876bd9SBarry Smith #endif 972e5c89e4eSSatish Balay #endif 973e5c89e4eSSatish Balay ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr); 974e5c89e4eSSatish Balay ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr); 975e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr); 976e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr); 977e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr); 978e5c89e4eSSatish Balay 979480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_Counter_keyval);CHKERRQ(ierr); 980480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_InnerComm_keyval);CHKERRQ(ierr); 981480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_OuterComm_keyval);CHKERRQ(ierr); 982480cf27aSJed Brown 983ae15b995SBarry Smith ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr); 984e5c89e4eSSatish Balay if (PetscBeganMPI) { 98599608316SBarry Smith #if defined(PETSC_HAVE_MPI_FINALIZED) 98699b1327fSBarry Smith PetscMPIInt flag; 98799b1327fSBarry Smith ierr = MPI_Finalized(&flag);CHKERRQ(ierr); 988e32f2f54SBarry Smith if (flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"MPI_Finalize() has already been called, even though MPI_Init() was called by PetscInitialize()"); 98999608316SBarry Smith #endif 990e5c89e4eSSatish Balay ierr = MPI_Finalize();CHKERRQ(ierr); 991e5c89e4eSSatish Balay } 992e5c89e4eSSatish Balay 9939c4c166aSBarry Smith if (PETSC_ZOPEFD){ 99422b84c2fSbcordonn if (PETSC_ZOPEFD != PETSC_STDOUT) fprintf(PETSC_ZOPEFD, "<<<end>>>"); 9959c4c166aSBarry Smith else fprintf(PETSC_STDOUT, "<<<end>>>"); 9969c4c166aSBarry Smith } 99736186564Sbcordonn 99835d88935SVictor Minden #if defined(PETSC_HAVE_CUDA) 999*7a025f21SVictor Minden cublasShutdown_Public(); 1000440a5bbfSVictor Minden #endif 1001e5c89e4eSSatish Balay /* 1002e5c89e4eSSatish Balay 1003e5c89e4eSSatish Balay Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because 1004e5c89e4eSSatish Balay the communicator has some outstanding requests on it. Specifically if the 1005e5c89e4eSSatish Balay flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See 1006e5c89e4eSSatish Balay src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate() 1007e5c89e4eSSatish Balay is never freed as it should be. Thus one may obtain messages of the form 10080e5e90baSSatish Balay [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the 1009e5c89e4eSSatish Balay memory was not freed. 1010e5c89e4eSSatish Balay 1011e5c89e4eSSatish Balay */ 10121d1a0024SBarry Smith ierr = PetscMallocClear();CHKERRQ(ierr); 1013e5c89e4eSSatish Balay PetscInitializeCalled = PETSC_FALSE; 1014e5c89e4eSSatish Balay PetscFinalizeCalled = PETSC_TRUE; 1015e5c89e4eSSatish Balay PetscFunctionReturn(ierr); 1016e5c89e4eSSatish Balay } 1017e5c89e4eSSatish Balay 1018