17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay This file defines the initialization of PETSc, including PetscInitialize() 4e5c89e4eSSatish Balay */ 5e5c89e4eSSatish Balay 6c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 78101f56cSMatthew Knepley 88154be41SBarry Smith #if defined(PETSC_HAVE_CUSP) 92f947c57SVictor Minden #include <cublas.h> 107a025f21SVictor Minden #endif 117a025f21SVictor Minden 12a9f03627SSatish Balay #if defined(PETSC_USE_LOG) 1309573ac7SBarry Smith extern PetscErrorCode PetscLogBegin_Private(void); 14a9f03627SSatish Balay #endif 15ace3abfcSBarry Smith extern PetscBool PetscOpenMPWorker; 16e5c89e4eSSatish Balay 17e5c89e4eSSatish Balay /* -----------------------------------------------------------------------------------------*/ 18e5c89e4eSSatish Balay 19e5c89e4eSSatish Balay extern FILE *petsc_history; 20e5c89e4eSSatish Balay 2109573ac7SBarry Smith extern PetscErrorCode PetscInitialize_DynamicLibraries(void); 2209573ac7SBarry Smith extern PetscErrorCode PetscFinalize_DynamicLibraries(void); 2309573ac7SBarry Smith extern PetscErrorCode PetscFListDestroyAll(void); 2409573ac7SBarry Smith extern PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int); 2509573ac7SBarry Smith extern PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int); 2609573ac7SBarry Smith extern PetscErrorCode PetscCloseHistoryFile(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 */ 41ace3abfcSBarry Smith const char *PetscBools[] = {"FALSE","TRUE","PetscBool","PETSC_",0}; 4270b3c8c7SBarry Smith const char *PetscCopyModes[] = {"COPY_VALUES","OWN_POINTER","USE_POINTER","PetscCopyMode","PETSC_",0}; 4370b3c8c7SBarry Smith const char *PetscDataTypes[] = {"INT","DOUBLE","COMPLEX","LONG","SHORT","FLOAT", 44ace3abfcSBarry Smith "CHAR","LOGICAL","ENUM","BOOL","LONGDOUBLE","PetscDataType","PETSC_",0}; 45e5c89e4eSSatish Balay 46ace3abfcSBarry Smith PetscBool PetscPreLoadingUsed = PETSC_FALSE; 47ace3abfcSBarry Smith PetscBool 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" 557087cfbeSBarry Smith PetscErrorCode PetscOptionsCheckInitial_Components(void) 56e5c89e4eSSatish Balay { 57ace3abfcSBarry Smith PetscBool 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 740f11a792SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE) 75df413903SBarry Smith extern PetscBool PetscBeganMPI; 76df413903SBarry Smith 77e5c89e4eSSatish Balay #undef __FUNCT__ 780f11a792SBarry Smith #define __FUNCT__ "PetscInitializeMatlab" 790f11a792SBarry Smith /* 800f11a792SBarry Smith PetscInitializeMatlab - Calls PetscInitialize() from C/C++ without the pointers to argc and args 8172a42c3cSBarry Smith 8272a42c3cSBarry Smith Collective 8372a42c3cSBarry Smith 8472a42c3cSBarry Smith Level: advanced 8572a42c3cSBarry Smith 860f11a792SBarry Smith Notes: this is called only by the PETSc MATLAB interface. Even though it might start MPI it sets the flag to 870f11a792SBarry Smith indicate that it did NOT start MPI so that the PetscFinalize() does not end MPI, thus allowing PetscInitialize() to 880f11a792SBarry Smith be called multiple times from MATLAB without the problem of trying to initialize MPI more than once. 890f11a792SBarry Smith 9072a42c3cSBarry Smith .seealso: PetscInitialize(), PetscInitializeFortran(), PetscInitializeNoArguments() 910f11a792SBarry Smith */ 920f11a792SBarry Smith PetscErrorCode PetscInitializeMatlab(int argc,char **args,const char *filename,const char *help) 9372a42c3cSBarry Smith { 9472a42c3cSBarry Smith PetscErrorCode ierr; 9572a42c3cSBarry Smith int myargc = argc; 9672a42c3cSBarry Smith char **myargs = args; 9772a42c3cSBarry Smith 9872a42c3cSBarry Smith PetscFunctionBegin; 9972a42c3cSBarry Smith ierr = PetscInitialize(&myargc,&myargs,filename,help); 100df413903SBarry Smith PetscBeganMPI = PETSC_FALSE; 10172a42c3cSBarry Smith PetscFunctionReturn(ierr); 10272a42c3cSBarry Smith } 10372a42c3cSBarry Smith 10472a42c3cSBarry Smith #undef __FUNCT__ 1050f11a792SBarry Smith #define __FUNCT__ "PetscInitializedMatlab" 1060f11a792SBarry Smith /* 1070f11a792SBarry Smith PetscInitializedMatlab - Has PETSc been initialized already? 1080f11a792SBarry Smith 1090f11a792SBarry Smith Not Collective 1100f11a792SBarry Smith 1110f11a792SBarry Smith Level: advanced 1120f11a792SBarry Smith 1130f11a792SBarry Smith Notes: this is called only by the PETSc MATLAB interface. 1140f11a792SBarry Smith 1150f11a792SBarry Smith .seealso: PetscInitialize(), PetscInitializeFortran(), PetscInitializeNoArguments() 1160f11a792SBarry Smith */ 1170f11a792SBarry Smith int PetscInitializedMatlab(void) 1180f11a792SBarry Smith { 1190f11a792SBarry Smith PetscBool flg; 1200f11a792SBarry Smith 1210f11a792SBarry Smith PetscInitialized(&flg); 1220f11a792SBarry Smith if (flg) return 1; 1230f11a792SBarry Smith else return 0; 1240f11a792SBarry Smith } 1250f11a792SBarry Smith 1260f11a792SBarry Smith #undef __FUNCT__ 1270f11a792SBarry Smith #define __FUNCT__ "PetscGetPETSC_COMM_SELFMatlab" 128f0865b08SBarry Smith /* 129e3c5b3baSBarry Smith Used by MATLAB interface to get communicator 130f0865b08SBarry Smith */ 1310f11a792SBarry Smith PetscErrorCode PetscGetPETSC_COMM_SELFMatlab(MPI_Comm *comm) 132f0865b08SBarry Smith { 133f0865b08SBarry Smith PetscFunctionBegin; 134f0865b08SBarry Smith *comm = PETSC_COMM_SELF; 135f0865b08SBarry Smith PetscFunctionReturn(0); 136f0865b08SBarry Smith } 1370f11a792SBarry Smith #endif 138f0865b08SBarry Smith 139f0865b08SBarry Smith #undef __FUNCT__ 140e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitializeNoArguments" 141e5c89e4eSSatish Balay /*@C 142e5c89e4eSSatish Balay PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without 143e5c89e4eSSatish Balay the command line arguments. 144e5c89e4eSSatish Balay 145e5c89e4eSSatish Balay Collective 146e5c89e4eSSatish Balay 147e5c89e4eSSatish Balay Level: advanced 148e5c89e4eSSatish Balay 149e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeFortran() 150e5c89e4eSSatish Balay @*/ 1517087cfbeSBarry Smith PetscErrorCode PetscInitializeNoArguments(void) 152e5c89e4eSSatish Balay { 153e5c89e4eSSatish Balay PetscErrorCode ierr; 154e5c89e4eSSatish Balay int argc = 0; 155e5c89e4eSSatish Balay char **args = 0; 156e5c89e4eSSatish Balay 157e5c89e4eSSatish Balay PetscFunctionBegin; 158e5c89e4eSSatish Balay ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL); 159e5c89e4eSSatish Balay PetscFunctionReturn(ierr); 160e5c89e4eSSatish Balay } 161e5c89e4eSSatish Balay 162e5c89e4eSSatish Balay #undef __FUNCT__ 163e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialized" 164e5c89e4eSSatish Balay /*@ 165e5c89e4eSSatish Balay PetscInitialized - Determine whether PETSc is initialized. 166e5c89e4eSSatish Balay 1676dc8fec2Sbcordonn 7 Level: beginner 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 170e5c89e4eSSatish Balay @*/ 1717087cfbeSBarry Smith PetscErrorCode PetscInitialized(PetscBool *isInitialized) 172e5c89e4eSSatish Balay { 173e5c89e4eSSatish Balay PetscFunctionBegin; 174e5c89e4eSSatish Balay PetscValidPointer(isInitialized, 1); 175e5c89e4eSSatish Balay *isInitialized = PetscInitializeCalled; 176e5c89e4eSSatish Balay PetscFunctionReturn(0); 177e5c89e4eSSatish Balay } 178e5c89e4eSSatish Balay 179e5c89e4eSSatish Balay #undef __FUNCT__ 180e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalized" 181e5c89e4eSSatish Balay /*@ 182e5c89e4eSSatish Balay PetscFinalized - Determine whether PetscFinalize() has been called yet 183e5c89e4eSSatish Balay 184e5c89e4eSSatish Balay Level: developer 185e5c89e4eSSatish Balay 186e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 187e5c89e4eSSatish Balay @*/ 1887087cfbeSBarry Smith PetscErrorCode PetscFinalized(PetscBool *isFinalized) 189e5c89e4eSSatish Balay { 190e5c89e4eSSatish Balay PetscFunctionBegin; 191e5c89e4eSSatish Balay PetscValidPointer(isFinalized, 1); 192e5c89e4eSSatish Balay *isFinalized = PetscFinalizeCalled; 193e5c89e4eSSatish Balay PetscFunctionReturn(0); 194e5c89e4eSSatish Balay } 195e5c89e4eSSatish Balay 19609573ac7SBarry Smith extern PetscErrorCode PetscOptionsCheckInitial_Private(void); 197ace3abfcSBarry Smith extern PetscBool PetscBeganMPI; 198e5c89e4eSSatish Balay 199e5c89e4eSSatish Balay /* 200e5c89e4eSSatish Balay This function is the MPI reduction operation used to compute the sum of the 201e5c89e4eSSatish Balay first half of the datatype and the max of the second half. 202e5c89e4eSSatish Balay */ 203e5c89e4eSSatish Balay MPI_Op PetscMaxSum_Op = 0; 204e5c89e4eSSatish Balay 205e5c89e4eSSatish Balay EXTERN_C_BEGIN 206e5c89e4eSSatish Balay #undef __FUNCT__ 207e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum_Local" 2087087cfbeSBarry Smith void MPIAPI PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype) 209e5c89e4eSSatish Balay { 210e5c89e4eSSatish Balay PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt; 211e5c89e4eSSatish Balay 212e5c89e4eSSatish Balay PetscFunctionBegin; 213e5c89e4eSSatish Balay if (*datatype != MPIU_2INT) { 214e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2INT data types"); 215e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 216e5c89e4eSSatish Balay } 217e5c89e4eSSatish Balay 218e5c89e4eSSatish Balay for (i=0; i<count; i++) { 219e5c89e4eSSatish Balay xout[2*i] = PetscMax(xout[2*i],xin[2*i]); 220e5c89e4eSSatish Balay xout[2*i+1] += xin[2*i+1]; 221e5c89e4eSSatish Balay } 222812af9f3SBarry Smith PetscFunctionReturnVoid(); 223e5c89e4eSSatish Balay } 224e5c89e4eSSatish Balay EXTERN_C_END 225e5c89e4eSSatish Balay 226e5c89e4eSSatish Balay /* 227e5c89e4eSSatish Balay Returns the max of the first entry owned by this processor and the 228e5c89e4eSSatish Balay sum of the second entry. 229b693b147SBarry Smith 230b693b147SBarry Smith The reason nprocs[2*i] contains lengths nprocs[2*i+1] contains flag of 1 if length is nonzero 231b693b147SBarry Smith is so that the PetscMaxSum_Op() can set TWO values, if we passed in only nprocs[i] with lengths 232b693b147SBarry Smith there would be no place to store the both needed results. 233e5c89e4eSSatish Balay */ 234e5c89e4eSSatish Balay #undef __FUNCT__ 235e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum" 2367087cfbeSBarry Smith PetscErrorCode PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum) 237e5c89e4eSSatish Balay { 238e5c89e4eSSatish Balay PetscMPIInt size,rank; 239e5c89e4eSSatish Balay PetscInt *work; 240e5c89e4eSSatish Balay PetscErrorCode ierr; 241e5c89e4eSSatish Balay 242e5c89e4eSSatish Balay PetscFunctionBegin; 243e5c89e4eSSatish Balay ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 244e5c89e4eSSatish Balay ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 245e5c89e4eSSatish Balay ierr = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr); 246e5c89e4eSSatish Balay ierr = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr); 247e5c89e4eSSatish Balay *max = work[2*rank]; 248e5c89e4eSSatish Balay *sum = work[2*rank+1]; 249e5c89e4eSSatish Balay ierr = PetscFree(work);CHKERRQ(ierr); 250e5c89e4eSSatish Balay PetscFunctionReturn(0); 251e5c89e4eSSatish Balay } 252e5c89e4eSSatish Balay 253e5c89e4eSSatish Balay /* ----------------------------------------------------------------------------*/ 2547087cfbeSBarry Smith MPI_Op PetscADMax_Op = 0; 255e5c89e4eSSatish Balay 256e5c89e4eSSatish Balay EXTERN_C_BEGIN 257e5c89e4eSSatish Balay #undef __FUNCT__ 258e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMax_Local" 2597087cfbeSBarry Smith void MPIAPI PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 260e5c89e4eSSatish Balay { 261e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 262e5c89e4eSSatish Balay PetscInt i,count = *cnt; 263e5c89e4eSSatish Balay 264e5c89e4eSSatish Balay PetscFunctionBegin; 265e5c89e4eSSatish Balay if (*datatype != MPIU_2SCALAR) { 266e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 267e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 268e5c89e4eSSatish Balay } 269e5c89e4eSSatish Balay 270e5c89e4eSSatish Balay for (i=0; i<count; i++) { 271e5c89e4eSSatish Balay if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) { 272e5c89e4eSSatish Balay xout[2*i] = xin[2*i]; 273e5c89e4eSSatish Balay xout[2*i+1] = xin[2*i+1]; 274e5c89e4eSSatish Balay } 275e5c89e4eSSatish Balay } 276812af9f3SBarry Smith PetscFunctionReturnVoid(); 277e5c89e4eSSatish Balay } 278e5c89e4eSSatish Balay EXTERN_C_END 279e5c89e4eSSatish Balay 2807087cfbeSBarry Smith MPI_Op PetscADMin_Op = 0; 281e5c89e4eSSatish Balay 282e5c89e4eSSatish Balay EXTERN_C_BEGIN 283e5c89e4eSSatish Balay #undef __FUNCT__ 284e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMin_Local" 2857087cfbeSBarry Smith void MPIAPI PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 286e5c89e4eSSatish Balay { 287e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 288e5c89e4eSSatish Balay PetscInt i,count = *cnt; 289e5c89e4eSSatish Balay 290e5c89e4eSSatish Balay PetscFunctionBegin; 291e5c89e4eSSatish Balay if (*datatype != MPIU_2SCALAR) { 292e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 293e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 294e5c89e4eSSatish Balay } 295e5c89e4eSSatish Balay 296e5c89e4eSSatish Balay for (i=0; i<count; i++) { 297e5c89e4eSSatish Balay if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) { 298e5c89e4eSSatish Balay xout[2*i] = xin[2*i]; 299e5c89e4eSSatish Balay xout[2*i+1] = xin[2*i+1]; 300e5c89e4eSSatish Balay } 301e5c89e4eSSatish Balay } 302812af9f3SBarry Smith PetscFunctionReturnVoid(); 303e5c89e4eSSatish Balay } 304e5c89e4eSSatish Balay EXTERN_C_END 305e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/ 306e5c89e4eSSatish Balay 307854411e3SBarry Smith #if (defined(PETSC_USE_COMPLEX) && !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)) || defined(PETSC_USE_SCALAR___FLOAT128) 30806a205a8SBarry Smith MPI_Op MPIU_SUM = 0; 309e5c89e4eSSatish Balay 310e5c89e4eSSatish Balay EXTERN_C_BEGIN 311e5c89e4eSSatish Balay #undef __FUNCT__ 312e5c89e4eSSatish Balay #define __FUNCT__ "PetscSum_Local" 3137087cfbeSBarry Smith void PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 314e5c89e4eSSatish Balay { 315e5c89e4eSSatish Balay PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 316e5c89e4eSSatish Balay PetscInt i,count = *cnt; 317e5c89e4eSSatish Balay 318e5c89e4eSSatish Balay PetscFunctionBegin; 319e5c89e4eSSatish Balay if (*datatype != MPIU_SCALAR) { 320e5c89e4eSSatish Balay (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types"); 321e5c89e4eSSatish Balay MPI_Abort(MPI_COMM_WORLD,1); 322e5c89e4eSSatish Balay } 323e5c89e4eSSatish Balay 324e5c89e4eSSatish Balay for (i=0; i<count; i++) { 325e5c89e4eSSatish Balay xout[i] += xin[i]; 326e5c89e4eSSatish Balay } 327812af9f3SBarry Smith PetscFunctionReturnVoid(); 328e5c89e4eSSatish Balay } 329e5c89e4eSSatish Balay EXTERN_C_END 330e5c89e4eSSatish Balay #endif 331e5c89e4eSSatish Balay 332*d9822059SBarry Smith #if defined(PETSC_USE_SCALAR___FLOAT128) 333*d9822059SBarry Smith MPI_Op MPIU_MAX = 0; 334*d9822059SBarry Smith MPI_Op MPIU_MIN = 0; 335*d9822059SBarry Smith 336*d9822059SBarry Smith EXTERN_C_BEGIN 337*d9822059SBarry Smith #undef __FUNCT__ 338*d9822059SBarry Smith #define __FUNCT__ "PetscMax_Local" 339*d9822059SBarry Smith void PetscMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 340*d9822059SBarry Smith { 341*d9822059SBarry Smith PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 342*d9822059SBarry Smith PetscInt i,count = *cnt; 343*d9822059SBarry Smith 344*d9822059SBarry Smith PetscFunctionBegin; 345*d9822059SBarry Smith if (*datatype != MPIU_SCALAR) { 346*d9822059SBarry Smith (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types"); 347*d9822059SBarry Smith MPI_Abort(MPI_COMM_WORLD,1); 348*d9822059SBarry Smith } 349*d9822059SBarry Smith 350*d9822059SBarry Smith for (i=0; i<count; i++) { 351*d9822059SBarry Smith xout[i] += PetscMax(xout[i],xin[i]); 352*d9822059SBarry Smith } 353*d9822059SBarry Smith PetscFunctionReturnVoid(); 354*d9822059SBarry Smith } 355*d9822059SBarry Smith EXTERN_C_END 356*d9822059SBarry Smith 357*d9822059SBarry Smith EXTERN_C_BEGIN 358*d9822059SBarry Smith #undef __FUNCT__ 359*d9822059SBarry Smith #define __FUNCT__ "PetscMin_Local" 360*d9822059SBarry Smith void PetscMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 361*d9822059SBarry Smith { 362*d9822059SBarry Smith PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 363*d9822059SBarry Smith PetscInt i,count = *cnt; 364*d9822059SBarry Smith 365*d9822059SBarry Smith PetscFunctionBegin; 366*d9822059SBarry Smith if (*datatype != MPIU_SCALAR) { 367*d9822059SBarry Smith (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types"); 368*d9822059SBarry Smith MPI_Abort(MPI_COMM_WORLD,1); 369*d9822059SBarry Smith } 370*d9822059SBarry Smith 371*d9822059SBarry Smith for (i=0; i<count; i++) { 372*d9822059SBarry Smith xout[i] += PetscMin(xout[i],xin[i]); 373*d9822059SBarry Smith } 374*d9822059SBarry Smith PetscFunctionReturnVoid(); 375*d9822059SBarry Smith } 376*d9822059SBarry Smith EXTERN_C_END 377*d9822059SBarry Smith #endif 378*d9822059SBarry Smith 379480cf27aSJed Brown EXTERN_C_BEGIN 380480cf27aSJed Brown #undef __FUNCT__ 381480cf27aSJed Brown #define __FUNCT__ "Petsc_DelCounter" 382480cf27aSJed Brown /* 383480cf27aSJed Brown Private routine to delete internal tag/name counter storage when a communicator is freed. 384480cf27aSJed Brown 385480cf27aSJed Brown This is called by MPI, not by users. 386480cf27aSJed Brown 387480cf27aSJed Brown Note: this is declared extern "C" because it is passed to MPI_Keyval_create() 388480cf27aSJed Brown 389480cf27aSJed Brown */ 3907087cfbeSBarry Smith PetscMPIInt MPIAPI Petsc_DelCounter(MPI_Comm comm,PetscMPIInt keyval,void *count_val,void *extra_state) 391480cf27aSJed Brown { 392480cf27aSJed Brown PetscErrorCode ierr; 393480cf27aSJed Brown 394480cf27aSJed Brown PetscFunctionBegin; 395480cf27aSJed Brown ierr = PetscInfo1(0,"Deleting counter data in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 396480cf27aSJed Brown ierr = PetscFree(count_val);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 397480cf27aSJed Brown PetscFunctionReturn(MPI_SUCCESS); 398480cf27aSJed Brown } 399480cf27aSJed Brown EXTERN_C_END 400480cf27aSJed Brown 401480cf27aSJed Brown EXTERN_C_BEGIN 402480cf27aSJed Brown #undef __FUNCT__ 403480cf27aSJed Brown #define __FUNCT__ "Petsc_DelComm" 404480cf27aSJed Brown /* 405480cf27aSJed Brown This does not actually free anything, it simply marks when a reference count to an internal MPI_Comm reaches zero and the 406480cf27aSJed Brown the external MPI_Comm drops its reference to the internal MPI_Comm 407480cf27aSJed Brown 408480cf27aSJed Brown This is called by MPI, not by users. 409480cf27aSJed Brown 410480cf27aSJed Brown Note: this is declared extern "C" because it is passed to MPI_Keyval_create() 411480cf27aSJed Brown 412480cf27aSJed Brown */ 4137087cfbeSBarry Smith PetscMPIInt MPIAPI Petsc_DelComm(MPI_Comm comm,PetscMPIInt keyval,void *attr_val,void *extra_state) 414480cf27aSJed Brown { 415480cf27aSJed Brown PetscErrorCode ierr; 416480cf27aSJed Brown 417480cf27aSJed Brown PetscFunctionBegin; 418480cf27aSJed Brown ierr = PetscInfo1(0,"Deleting PETSc communicator imbedded in a user MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 419480cf27aSJed Brown /* actually don't delete anything because we cannot increase the reference count of the communicator anyways */ 420480cf27aSJed Brown PetscFunctionReturn(MPI_SUCCESS); 421480cf27aSJed Brown } 422480cf27aSJed Brown EXTERN_C_END 423480cf27aSJed Brown 424951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32) 425e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN) 426e39fd77fSBarry Smith EXTERN_C_BEGIN 427e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_extent_fn(MPI_Datatype,MPI_Aint*,void*); 428e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_read_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*); 429e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_write_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*); 430e39fd77fSBarry Smith EXTERN_C_END 431e39fd77fSBarry Smith #endif 432951e3c8eSBarry Smith #endif 433e39fd77fSBarry Smith 4346ae9a8a6SBarry Smith int PetscGlobalArgc = 0; 4356ae9a8a6SBarry Smith char **PetscGlobalArgs = 0; 436e5c89e4eSSatish Balay 437e5c89e4eSSatish Balay #undef __FUNCT__ 438e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetArgs" 439e5c89e4eSSatish Balay /*@C 440e5c89e4eSSatish Balay PetscGetArgs - Allows you to access the raw command line arguments anywhere 441e5c89e4eSSatish Balay after PetscInitialize() is called but before PetscFinalize(). 442e5c89e4eSSatish Balay 443e5c89e4eSSatish Balay Not Collective 444e5c89e4eSSatish Balay 445e5c89e4eSSatish Balay Output Parameters: 446e5c89e4eSSatish Balay + argc - count of number of command line arguments 447e5c89e4eSSatish Balay - args - the command line arguments 448e5c89e4eSSatish Balay 449e5c89e4eSSatish Balay Level: intermediate 450e5c89e4eSSatish Balay 451e5c89e4eSSatish Balay Notes: 452e5c89e4eSSatish Balay This is usually used to pass the command line arguments into other libraries 453e5c89e4eSSatish Balay that are called internally deep in PETSc or the application. 454e5c89e4eSSatish Balay 455f177e3b1SBarry Smith The first argument contains the program name as is normal for C arguments. 456f177e3b1SBarry Smith 457e5c89e4eSSatish Balay Concepts: command line arguments 458e5c89e4eSSatish Balay 459793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments() 460e5c89e4eSSatish Balay 461e5c89e4eSSatish Balay @*/ 4627087cfbeSBarry Smith PetscErrorCode PetscGetArgs(int *argc,char ***args) 463e5c89e4eSSatish Balay { 464e5c89e4eSSatish Balay PetscFunctionBegin; 46517186662SBarry Smith if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 466e5c89e4eSSatish Balay *argc = PetscGlobalArgc; 467e5c89e4eSSatish Balay *args = PetscGlobalArgs; 468e5c89e4eSSatish Balay PetscFunctionReturn(0); 469e5c89e4eSSatish Balay } 470e5c89e4eSSatish Balay 471e5c89e4eSSatish Balay #undef __FUNCT__ 472793721a6SBarry Smith #define __FUNCT__ "PetscGetArguments" 473793721a6SBarry Smith /*@C 474793721a6SBarry Smith PetscGetArguments - Allows you to access the command line arguments anywhere 475793721a6SBarry Smith after PetscInitialize() is called but before PetscFinalize(). 476793721a6SBarry Smith 477793721a6SBarry Smith Not Collective 478793721a6SBarry Smith 479793721a6SBarry Smith Output Parameters: 480793721a6SBarry Smith . args - the command line arguments 481793721a6SBarry Smith 482793721a6SBarry Smith Level: intermediate 483793721a6SBarry Smith 484793721a6SBarry Smith Notes: 485793721a6SBarry Smith This does NOT start with the program name and IS null terminated (final arg is void) 486793721a6SBarry Smith 487793721a6SBarry Smith Concepts: command line arguments 488793721a6SBarry Smith 489793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments() 490793721a6SBarry Smith 491793721a6SBarry Smith @*/ 4927087cfbeSBarry Smith PetscErrorCode PetscGetArguments(char ***args) 493793721a6SBarry Smith { 494793721a6SBarry Smith PetscInt i,argc = PetscGlobalArgc; 495793721a6SBarry Smith PetscErrorCode ierr; 496793721a6SBarry Smith 497793721a6SBarry Smith PetscFunctionBegin; 49817186662SBarry Smith if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 499717030eeSLisandro Dalcin if (!argc) {*args = 0; PetscFunctionReturn(0);} 500793721a6SBarry Smith ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr); 501793721a6SBarry Smith for (i=0; i<argc-1; i++) { 502793721a6SBarry Smith ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr); 503793721a6SBarry Smith } 504793721a6SBarry Smith (*args)[argc-1] = 0; 505793721a6SBarry Smith PetscFunctionReturn(0); 506793721a6SBarry Smith } 507793721a6SBarry Smith 508793721a6SBarry Smith #undef __FUNCT__ 509793721a6SBarry Smith #define __FUNCT__ "PetscFreeArguments" 510793721a6SBarry Smith /*@C 511793721a6SBarry Smith PetscFreeArguments - Frees the memory obtained with PetscGetArguments() 512793721a6SBarry Smith 513793721a6SBarry Smith Not Collective 514793721a6SBarry Smith 515793721a6SBarry Smith Output Parameters: 516793721a6SBarry Smith . args - the command line arguments 517793721a6SBarry Smith 518793721a6SBarry Smith Level: intermediate 519793721a6SBarry Smith 520793721a6SBarry Smith Concepts: command line arguments 521793721a6SBarry Smith 522793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments() 523793721a6SBarry Smith 524793721a6SBarry Smith @*/ 5257087cfbeSBarry Smith PetscErrorCode PetscFreeArguments(char **args) 526793721a6SBarry Smith { 527793721a6SBarry Smith PetscInt i = 0; 528793721a6SBarry Smith PetscErrorCode ierr; 529793721a6SBarry Smith 530793721a6SBarry Smith PetscFunctionBegin; 531717030eeSLisandro Dalcin if (!args) {PetscFunctionReturn(0);} 532793721a6SBarry Smith while (args[i]) { 533793721a6SBarry Smith ierr = PetscFree(args[i]);CHKERRQ(ierr); 534793721a6SBarry Smith i++; 535793721a6SBarry Smith } 536793721a6SBarry Smith ierr = PetscFree(args);CHKERRQ(ierr); 537793721a6SBarry Smith PetscFunctionReturn(0); 538793721a6SBarry Smith } 539793721a6SBarry Smith 540793721a6SBarry Smith #undef __FUNCT__ 541e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialize" 542e5c89e4eSSatish Balay /*@C 543e5c89e4eSSatish Balay PetscInitialize - Initializes the PETSc database and MPI. 544e5c89e4eSSatish Balay PetscInitialize() calls MPI_Init() if that has yet to be called, 545e5c89e4eSSatish Balay so this routine should always be called near the beginning of 546e5c89e4eSSatish Balay your program -- usually the very first line! 547e5c89e4eSSatish Balay 548e5c89e4eSSatish Balay Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set 549e5c89e4eSSatish Balay 550e5c89e4eSSatish Balay Input Parameters: 551e5c89e4eSSatish Balay + argc - count of number of command line arguments 552e5c89e4eSSatish Balay . args - the command line arguments 553fc2bca9aSBarry Smith . file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for 554fc2bca9aSBarry Smith code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 555e5c89e4eSSatish Balay - help - [optional] Help message to print, use PETSC_NULL for no message 556e5c89e4eSSatish Balay 55705827820SBarry Smith If you wish PETSc code to run ONLY on a subcommunicator of MPI_COMM_WORLD, create that 55805827820SBarry Smith communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize(). Thus if you are running a 55905827820SBarry Smith four process job and two processes will run PETSc and have PetscInitialize() and PetscFinalize() and two process will not, 56005827820SBarry Smith then do this. If ALL processes in the job are using PetscInitialize() and PetscFinalize() then you don't need to do this, even 56105827820SBarry Smith if different subcommunicators of the job are doing different things with PETSc. 562e5c89e4eSSatish Balay 563e5c89e4eSSatish Balay Options Database Keys: 564e5c89e4eSSatish Balay + -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger 565e5c89e4eSSatish Balay . -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected 566e5c89e4eSSatish Balay . -on_error_emacs <machinename> causes emacsclient to jump to error file 567b52f573bSBarry Smith . -on_error_abort calls abort() when error detected (no traceback) 568e8fb0fc0SBarry Smith . -on_error_mpiabort calls MPI_abort() when error detected 569e8fb0fc0SBarry Smith . -error_output_stderr prints error messages to stderr instead of the default stdout 570e8fb0fc0SBarry Smith . -error_output_none does not print the error messages (but handles errors in the same way as if this was not called) 571e5c89e4eSSatish Balay . -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger 572e5c89e4eSSatish Balay . -debugger_pause [sleeptime] (in seconds) - Pauses debugger 573e5c89e4eSSatish Balay . -stop_for_debugger - Print message on how to attach debugger manually to 574e5c89e4eSSatish Balay process and wait (-debugger_pause) seconds for attachment 5752fb0ec9aSBarry Smith . -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries) 576e5c89e4eSSatish Balay . -malloc no - Indicates not to use error-checking malloc 5772fb0ec9aSBarry Smith . -malloc_debug - check for memory corruption at EVERY malloc or free 578e5c89e4eSSatish Balay . -fp_trap - Stops on floating point exceptions (Note that on the 579e5c89e4eSSatish Balay IBM RS6000 this slows code by at least a factor of 10.) 580e5c89e4eSSatish Balay . -no_signal_handler - Indicates not to trap error signals 581e5c89e4eSSatish Balay . -shared_tmp - indicates /tmp directory is shared by all processors 582e5c89e4eSSatish Balay . -not_shared_tmp - each processor has own /tmp 583e5c89e4eSSatish Balay . -tmp - alternative name of /tmp directory 584e5c89e4eSSatish Balay . -get_total_flops - returns total flops done by all processors 585e5c89e4eSSatish Balay - -memory_info - Print memory usage at end of run 586e5c89e4eSSatish Balay 587e5c89e4eSSatish Balay Options Database Keys for Profiling: 5880598bfebSBarry Smith See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details. 589e5c89e4eSSatish Balay + -log_trace [filename] - Print traces of all PETSc calls 590e5c89e4eSSatish Balay to the screen (useful to determine where a program 591e5c89e4eSSatish Balay hangs without running in the debugger). See PetscLogTraceBegin(). 5926cf91177SBarry Smith . -info <optional filename> - Prints verbose information to the screen 5936cf91177SBarry Smith - -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages 594e5c89e4eSSatish Balay 595e5c89e4eSSatish Balay Environmental Variables: 596e5c89e4eSSatish Balay + PETSC_TMP - alternative tmp directory 597e5c89e4eSSatish Balay . PETSC_SHARED_TMP - tmp is shared by all processes 598e5c89e4eSSatish Balay . PETSC_NOT_SHARED_TMP - each process has its own private tmp 599e5c89e4eSSatish Balay . PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer 600e5c89e4eSSatish Balay - PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to 601e5c89e4eSSatish Balay 602e5c89e4eSSatish Balay 603e5c89e4eSSatish Balay Level: beginner 604e5c89e4eSSatish Balay 605e5c89e4eSSatish Balay Notes: 606e5c89e4eSSatish Balay If for some reason you must call MPI_Init() separately, call 607e5c89e4eSSatish Balay it before PetscInitialize(). 608e5c89e4eSSatish Balay 609e5c89e4eSSatish Balay Fortran Version: 610e5c89e4eSSatish Balay In Fortran this routine has the format 611e5c89e4eSSatish Balay $ call PetscInitialize(file,ierr) 612e5c89e4eSSatish Balay 613e5c89e4eSSatish Balay + ierr - error return code 6143dae0d48SMatthew Knepley - file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL_CHARACTER to not check for 615fc2bca9aSBarry Smith code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 616e5c89e4eSSatish Balay 617e5c89e4eSSatish Balay Important Fortran Note: 618e5c89e4eSSatish Balay In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a 619e5c89e4eSSatish Balay null character string; you CANNOT just use PETSC_NULL as 6200598bfebSBarry Smith in the C version. See the <a href="../../docs/manual.pdf">users manual</a> for details. 621e5c89e4eSSatish Balay 62201cb0274SBarry Smith If your main program is C but you call Fortran code that also uses PETSc you need to call PetscInitializeFortran() soon after 62301cb0274SBarry Smith calling PetscInitialize(). 624e5c89e4eSSatish Balay 625e5c89e4eSSatish Balay Concepts: initializing PETSc 626e5c89e4eSSatish Balay 62701cb0274SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscInitializeNoArguments() 628e5c89e4eSSatish Balay 629e5c89e4eSSatish Balay @*/ 6307087cfbeSBarry Smith PetscErrorCode PetscInitialize(int *argc,char ***args,const char file[],const char help[]) 631e5c89e4eSSatish Balay { 632e5c89e4eSSatish Balay PetscErrorCode ierr; 633aa5bb8c0SSatish Balay PetscMPIInt flag, size; 634aa5bb8c0SSatish Balay PetscInt nodesize; 635ace3abfcSBarry Smith PetscBool flg; 636e5c89e4eSSatish Balay char hostname[256]; 637e5c89e4eSSatish Balay 638e5c89e4eSSatish Balay PetscFunctionBegin; 639e5c89e4eSSatish Balay if (PetscInitializeCalled) PetscFunctionReturn(0); 640e5c89e4eSSatish Balay 641ae9b4142SLisandro Dalcin /* these must be initialized in a routine, not as a constant declaration*/ 642d89683f4Sbcordonn PETSC_STDOUT = stdout; 643ae9b4142SLisandro Dalcin PETSC_STDERR = stderr; 644e5c89e4eSSatish Balay 645e5c89e4eSSatish Balay ierr = PetscOptionsCreate();CHKERRQ(ierr); 646e5c89e4eSSatish Balay 647e5c89e4eSSatish Balay /* 648e5c89e4eSSatish Balay We initialize the program name here (before MPI_Init()) because MPICH has a bug in 649e5c89e4eSSatish Balay it that it sets args[0] on all processors to be args[0] on the first processor. 650e5c89e4eSSatish Balay */ 651e5c89e4eSSatish Balay if (argc && *argc) { 652e5c89e4eSSatish Balay ierr = PetscSetProgramName(**args);CHKERRQ(ierr); 653e5c89e4eSSatish Balay } else { 654e5c89e4eSSatish Balay ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr); 655e5c89e4eSSatish Balay } 656e5c89e4eSSatish Balay 657e5c89e4eSSatish Balay ierr = MPI_Initialized(&flag);CHKERRQ(ierr); 658e5c89e4eSSatish Balay if (!flag) { 659e32f2f54SBarry 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"); 660e5c89e4eSSatish Balay ierr = MPI_Init(argc,args);CHKERRQ(ierr); 661e5c89e4eSSatish Balay PetscBeganMPI = PETSC_TRUE; 662e5c89e4eSSatish Balay } 663e5c89e4eSSatish Balay if (argc && args) { 664e5c89e4eSSatish Balay PetscGlobalArgc = *argc; 665e5c89e4eSSatish Balay PetscGlobalArgs = *args; 666e5c89e4eSSatish Balay } 667e5c89e4eSSatish Balay PetscFinalizeCalled = PETSC_FALSE; 668e5c89e4eSSatish Balay 669e8373e55SMatthew Knepley if (PETSC_COMM_WORLD == MPI_COMM_NULL) { 670e5c89e4eSSatish Balay PETSC_COMM_WORLD = MPI_COMM_WORLD; 671e5c89e4eSSatish Balay } 672660746e0SBarry Smith ierr = MPI_Errhandler_set(PETSC_COMM_WORLD,MPI_ERRORS_RETURN);CHKERRQ(ierr); 673e5c89e4eSSatish Balay 674e5c89e4eSSatish Balay /* Done after init due to a bug in MPICH-GM? */ 675e5c89e4eSSatish Balay ierr = PetscErrorPrintfInitialize();CHKERRQ(ierr); 676e5c89e4eSSatish Balay 677e5c89e4eSSatish Balay ierr = MPI_Comm_rank(MPI_COMM_WORLD,&PetscGlobalRank);CHKERRQ(ierr); 678e5c89e4eSSatish Balay ierr = MPI_Comm_size(MPI_COMM_WORLD,&PetscGlobalSize);CHKERRQ(ierr); 679e5c89e4eSSatish Balay 680e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 681e5c89e4eSSatish Balay /* 682e5c89e4eSSatish Balay Initialized the global complex variable; this is because with 683e5c89e4eSSatish Balay shared libraries the constructors for global variables 684e5c89e4eSSatish Balay are not called; at least on IRIX. 685e5c89e4eSSatish Balay */ 686e5c89e4eSSatish Balay { 687762437b8SSatish Balay #if defined(PETSC_CLANGUAGE_CXX) 688e5c89e4eSSatish Balay PetscScalar ic(0.0,1.0); 689e5c89e4eSSatish Balay PETSC_i = ic; 690b7940d39SSatish Balay #else 6913433f298SSatish Balay PETSC_i = I; 692b7940d39SSatish Balay #endif 693762437b8SSatish Balay } 694762437b8SSatish Balay 6952c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 6962c876bd9SBarry Smith ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 6972c876bd9SBarry Smith ierr = MPI_Type_commit(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 698a83b8d76SBarry Smith ierr = MPI_Type_contiguous(2,MPI_FLOAT,&MPI_C_COMPLEX);CHKERRQ(ierr); 699a83b8d76SBarry Smith ierr = MPI_Type_commit(&MPI_C_COMPLEX);CHKERRQ(ierr); 70006a205a8SBarry Smith ierr = MPI_Op_create(PetscSum_Local,1,&MPIU_SUM);CHKERRQ(ierr); 701e5c89e4eSSatish Balay #endif 7022c876bd9SBarry Smith #endif 703e5c89e4eSSatish Balay 704e5c89e4eSSatish Balay /* 705e5c89e4eSSatish Balay Create the PETSc MPI reduction operator that sums of the first 706e5c89e4eSSatish Balay half of the entries and maxes the second half. 707e5c89e4eSSatish Balay */ 708e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr); 709e5c89e4eSSatish Balay 710c90a1750SBarry Smith #if defined(PETSC_USE_SCALAR___FLOAT128) 711c90a1750SBarry Smith ierr = MPI_Type_contiguous(2,MPI_DOUBLE,&MPIU___FLOAT128);CHKERRQ(ierr); 712c90a1750SBarry Smith ierr = MPI_Type_commit(&MPIU___FLOAT128);CHKERRQ(ierr); 713854411e3SBarry Smith ierr = MPI_Op_create(PetscSum_Local,1,&MPIU_SUM);CHKERRQ(ierr); 714*d9822059SBarry Smith ierr = MPI_Op_create(PetscMax_Local,1,&MPIU_MAX);CHKERRQ(ierr); 715*d9822059SBarry Smith ierr = MPI_Op_create(PetscMin_Local,1,&MPIU_MIN);CHKERRQ(ierr); 716c90a1750SBarry Smith #endif 717c90a1750SBarry Smith 718e5c89e4eSSatish Balay ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr); 719e5c89e4eSSatish Balay ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr); 720e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr); 721e5c89e4eSSatish Balay ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr); 722e5c89e4eSSatish Balay 723e5c89e4eSSatish Balay ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr); 724e5c89e4eSSatish Balay ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr); 725e5c89e4eSSatish Balay 726e5c89e4eSSatish Balay /* 727480cf27aSJed Brown Attributes to be set on PETSc communicators 728480cf27aSJed Brown */ 729480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelCounter,&Petsc_Counter_keyval,(void*)0);CHKERRQ(ierr); 730480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_InnerComm_keyval,(void*)0);CHKERRQ(ierr); 731480cf27aSJed Brown ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_OuterComm_keyval,(void*)0);CHKERRQ(ierr); 732480cf27aSJed Brown 733480cf27aSJed Brown /* 734e8fb0fc0SBarry Smith Build the options database 735e5c89e4eSSatish Balay */ 736e5c89e4eSSatish Balay ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr); 737e5c89e4eSSatish Balay 7386dc8fec2Sbcordonn 739e5c89e4eSSatish Balay /* 740e5c89e4eSSatish Balay Print main application help message 741e5c89e4eSSatish Balay */ 742e5c89e4eSSatish Balay ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr); 743e5c89e4eSSatish Balay if (help && flg) { 744e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr); 745e5c89e4eSSatish Balay } 746e5c89e4eSSatish Balay ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr); 747e5c89e4eSSatish Balay 748e5c89e4eSSatish Balay /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */ 749a9f03627SSatish Balay #if defined(PETSC_USE_LOG) 750e5c89e4eSSatish Balay ierr = PetscLogBegin_Private();CHKERRQ(ierr); 751a9f03627SSatish Balay #endif 752e5c89e4eSSatish Balay 753e5c89e4eSSatish Balay /* 754e5c89e4eSSatish Balay Load the dynamic libraries (on machines that support them), this registers all 755e5c89e4eSSatish Balay the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes) 756e5c89e4eSSatish Balay */ 757e5c89e4eSSatish Balay ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr); 758e5c89e4eSSatish Balay 759e5c89e4eSSatish Balay ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 760ae15b995SBarry Smith ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr); 761e5c89e4eSSatish Balay ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr); 762ae15b995SBarry Smith ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr); 763e5c89e4eSSatish Balay 764e5c89e4eSSatish Balay ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr); 765ef6c6fedSBoyana Norris /* Check the options database for options related to the options database itself */ 766ef6c6fedSBoyana Norris ierr = PetscOptionsSetFromOptions();CHKERRQ(ierr); 767ef6c6fedSBoyana Norris 768951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32) 769e39fd77fSBarry Smith /* 770e39fd77fSBarry Smith Tell MPI about our own data representation converter, this would/should be used if extern32 is not supported by the MPI 771e39fd77fSBarry Smith 772e39fd77fSBarry Smith Currently not used because it is not supported by MPICH. 773e39fd77fSBarry Smith */ 774e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN) 775708350f5SSatish Balay ierr = MPI_Register_datarep((char *)"petsc",PetscDataRep_read_conv_fn,PetscDataRep_write_conv_fn,PetscDataRep_extent_fn,PETSC_NULL);CHKERRQ(ierr); 776e39fd77fSBarry Smith #endif 777951e3c8eSBarry Smith #endif 778e39fd77fSBarry Smith 779793721a6SBarry Smith ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_spawn_size",&nodesize,&flg);CHKERRQ(ierr); 780793721a6SBarry Smith if (flg) { 78123464e94SBarry Smith #if defined(PETSC_HAVE_MPI_COMM_SPAWN) 7829505b675SBarry Smith ierr = PetscOpenMPSpawn((PetscMPIInt) nodesize);CHKERRQ(ierr); /* worker nodes never return from here; they go directly to PetscEnd() */ 78323464e94SBarry Smith #else 784e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -openmp_merge_size instead"); 78523464e94SBarry Smith #endif 786793721a6SBarry Smith } else { 78723464e94SBarry Smith ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_merge_size",&nodesize,&flg);CHKERRQ(ierr); 7888002f1cdSBarry Smith if (flg) { 7899505b675SBarry Smith ierr = PetscOpenMPMerge((PetscMPIInt) nodesize,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 7909505b675SBarry Smith if (PetscOpenMPWorker) { /* if worker then never enter user code */ 7919505b675SBarry Smith ierr = PetscEnd(); 7929505b675SBarry Smith } 7938002f1cdSBarry Smith } 794793721a6SBarry Smith } 795e5c89e4eSSatish Balay 79635d88935SVictor Minden #if defined(PETSC_HAVE_CUDA) 7972f947c57SVictor Minden cublasInit(); 7983e39abd9SVictor Minden #endif 79992e62aa6SBarry Smith 80092e62aa6SBarry Smith #if defined(PETSC_HAVE_AMS) 801c457296dSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-ams_publish_objects",&flg);CHKERRQ(ierr); 80292e62aa6SBarry Smith if (flg) { 80392e62aa6SBarry Smith PetscAMSPublishAll = PETSC_TRUE; 80492e62aa6SBarry Smith } 80592e62aa6SBarry Smith #endif 80692e62aa6SBarry Smith 8079ac80d5eSLisandro Dalcin ierr = PetscOptionsHasName(PETSC_NULL,"-python",&flg);CHKERRQ(ierr); 8089ac80d5eSLisandro Dalcin if (flg) { 8099ac80d5eSLisandro Dalcin PetscInitializeCalled = PETSC_TRUE; 8109ac80d5eSLisandro Dalcin ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 8119ac80d5eSLisandro Dalcin } 8129ac80d5eSLisandro Dalcin 813301d30feSBarry Smith /* 814301d30feSBarry Smith Once we are completedly initialized then we can set this variables 815301d30feSBarry Smith */ 816301d30feSBarry Smith PetscInitializeCalled = PETSC_TRUE; 817301d30feSBarry Smith PetscFunctionReturn(0); 818e5c89e4eSSatish Balay } 819e5c89e4eSSatish Balay 8202eff7a51SBarry Smith extern PetscObject *PetscObjects; 8212eff7a51SBarry Smith extern PetscInt PetscObjectsCounts, PetscObjectsMaxCounts; 822e5c89e4eSSatish Balay 823e5c89e4eSSatish Balay #undef __FUNCT__ 824e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalize" 825e5c89e4eSSatish Balay /*@C 826e5c89e4eSSatish Balay PetscFinalize - Checks for options to be called at the conclusion 827e5c89e4eSSatish Balay of the program. MPI_Finalize() is called only if the user had not 828e5c89e4eSSatish Balay called MPI_Init() before calling PetscInitialize(). 829e5c89e4eSSatish Balay 830e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 831e5c89e4eSSatish Balay 832e5c89e4eSSatish Balay Options Database Keys: 83388c29154SBarry Smith + -options_table - Calls PetscOptionsView() 834e5c89e4eSSatish Balay . -options_left - Prints unused options that remain in the database 8350a1571b3SBarry Smith . -objects_left - Prints list of all objects that have not been freed 836e5c89e4eSSatish Balay . -mpidump - Calls PetscMPIDump() 837e5c89e4eSSatish Balay . -malloc_dump - Calls PetscMallocDump() 838e5c89e4eSSatish Balay . -malloc_info - Prints total memory usage 839e5c89e4eSSatish Balay - -malloc_log - Prints summary of memory usage 840e5c89e4eSSatish Balay 841e5c89e4eSSatish Balay Options Database Keys for Profiling: 8420598bfebSBarry Smith See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details. 843e5c89e4eSSatish Balay + -log_summary [filename] - Prints summary of flop and timing 844e5c89e4eSSatish Balay information to screen. If the filename is specified the 84591eabc43SBarry Smith summary is written to the file. See PetscLogView(). 846ff5bc46bSBarry Smith . -log_summary_python [filename] - Prints data on of flop and timing usage to a file or screen. 84791eabc43SBarry Smith See PetscLogPrintSViewPython(). 848e5c89e4eSSatish Balay . -log_all [filename] - Logs extensive profiling information 849ff5bc46bSBarry Smith See PetscLogDump(). 850ff5bc46bSBarry Smith . -log [filename] - Logs basic profiline information See PetscLogDump(). 851e5c89e4eSSatish Balay . -log_sync - Log the synchronization in scatters, inner products 852e5c89e4eSSatish Balay and norms 853e5c89e4eSSatish Balay - -log_mpe [filename] - Creates a logfile viewable by the 854e5c89e4eSSatish Balay utility Upshot/Nupshot (in MPICH distribution) 855e5c89e4eSSatish Balay 856e5c89e4eSSatish Balay Level: beginner 857e5c89e4eSSatish Balay 858e5c89e4eSSatish Balay Note: 859e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 860e5c89e4eSSatish Balay 86188c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscEnd() 862e5c89e4eSSatish Balay @*/ 8637087cfbeSBarry Smith PetscErrorCode PetscFinalize(void) 864e5c89e4eSSatish Balay { 865e5c89e4eSSatish Balay PetscErrorCode ierr; 866e5c89e4eSSatish Balay PetscMPIInt rank; 8672eff7a51SBarry Smith PetscInt i,nopt; 8680a1571b3SBarry Smith PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,objects_left = PETSC_FALSE; 869d5649816SBarry Smith #if defined(PETSC_HAVE_AMS) 870ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 871d5649816SBarry Smith #endif 87210463e74SBarry Smith #if defined(PETSC_USE_LOG) 87310463e74SBarry Smith char mname[PETSC_MAX_PATH_LEN]; 87410463e74SBarry Smith #endif 875e5c89e4eSSatish Balay 876e5c89e4eSSatish Balay PetscFunctionBegin; 877e5c89e4eSSatish Balay 878e5c89e4eSSatish Balay if (!PetscInitializeCalled) { 8794b09e917SBarry Smith printf("PetscInitialize() must be called before PetscFinalize()\n"); 8804b09e917SBarry Smith PetscFunctionReturn(PETSC_ERR_ARG_WRONGSTATE); 881e5c89e4eSSatish Balay } 882b022a5c1SBarry Smith ierr = PetscInfo(PETSC_NULL,"PetscFinalize() called\n"); 883b022a5c1SBarry Smith 884d5649816SBarry Smith #if defined(PETSC_HAVE_AMS) 885acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-options_gui",&flg,PETSC_NULL);CHKERRQ(ierr); 886d5649816SBarry Smith if (flg) { 887d5649816SBarry Smith ierr = PetscOptionsAMSDestroy();CHKERRQ(ierr); 888d5649816SBarry Smith } 889d5649816SBarry Smith #endif 890d5649816SBarry Smith 8918002f1cdSBarry Smith ierr = PetscOpenMPFinalize();CHKERRQ(ierr); 8928002f1cdSBarry Smith 893e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 894acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_info",&flg2,PETSC_NULL);CHKERRQ(ierr); 895e5c89e4eSSatish Balay if (!flg2) { 89690d69ab7SBarry Smith flg2 = PETSC_FALSE; 897acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-memory_info",&flg2,PETSC_NULL);CHKERRQ(ierr); 898e5c89e4eSSatish Balay } 899e5c89e4eSSatish Balay if (flg2) { 900e5c89e4eSSatish Balay ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr); 901e5c89e4eSSatish Balay } 902e5c89e4eSSatish Balay 903e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 90490d69ab7SBarry Smith flg1 = PETSC_FALSE; 905acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-get_total_flops",&flg1,PETSC_NULL);CHKERRQ(ierr); 906e5c89e4eSSatish Balay if (flg1) { 907e5c89e4eSSatish Balay PetscLogDouble flops = 0; 908e5c89e4eSSatish Balay ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 909e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr); 910e5c89e4eSSatish Balay } 911e5c89e4eSSatish Balay #endif 912e5c89e4eSSatish Balay 913e5c89e4eSSatish Balay 914e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 915e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 916e5c89e4eSSatish Balay mname[0] = 0; 917e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 918e5c89e4eSSatish Balay if (flg1){ 919e5c89e4eSSatish Balay if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);} 920e5c89e4eSSatish Balay else {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);} 921e5c89e4eSSatish Balay } 922e5c89e4eSSatish Balay #endif 923e5c89e4eSSatish Balay mname[0] = 0; 924e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 925e5c89e4eSSatish Balay if (flg1) { 92691eabc43SBarry Smith PetscViewer viewer; 92791eabc43SBarry Smith if (mname[0]) { 92891eabc43SBarry Smith ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,mname,&viewer);CHKERRQ(ierr); 92991eabc43SBarry Smith ierr = PetscLogView(viewer);CHKERRQ(ierr); 93091eabc43SBarry Smith ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr); 93133f85c2fSBarry Smith } else { 93233f85c2fSBarry Smith viewer = PETSC_VIEWER_STDOUT_WORLD; 93333f85c2fSBarry Smith ierr = PetscLogView(viewer);CHKERRQ(ierr); 93433f85c2fSBarry Smith } 935e5c89e4eSSatish Balay } 936e5c89e4eSSatish Balay 937ff5bc46bSBarry Smith mname[0] = 0; 938ff5bc46bSBarry Smith ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary_python",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 939ff5bc46bSBarry Smith if (flg1) { 940ff5bc46bSBarry Smith PetscViewer viewer; 941ff5bc46bSBarry Smith if (mname[0]) { 942ff5bc46bSBarry Smith ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,mname,&viewer);CHKERRQ(ierr); 94391eabc43SBarry Smith ierr = PetscLogViewPython(viewer);CHKERRQ(ierr); 944ff5bc46bSBarry Smith ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr); 94533f85c2fSBarry Smith } else { 94633f85c2fSBarry Smith viewer = PETSC_VIEWER_STDOUT_WORLD; 94733f85c2fSBarry Smith ierr = PetscLogViewPython(viewer);CHKERRQ(ierr); 94833f85c2fSBarry Smith } 949ff5bc46bSBarry Smith } 950ff5bc46bSBarry Smith 95178392ef1SBarry Smith ierr = PetscOptionsGetString(PETSC_NULL,"-log_detailed",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 95278392ef1SBarry Smith if (flg1) { 95378392ef1SBarry Smith if (mname[0]) {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);} 95478392ef1SBarry Smith else {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,0);CHKERRQ(ierr);} 95578392ef1SBarry Smith } 95678392ef1SBarry Smith 957e5c89e4eSSatish Balay mname[0] = 0; 958e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 959e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr); 960e5c89e4eSSatish Balay if (flg1 || flg2){ 961e5c89e4eSSatish Balay if (mname[0]) PetscLogDump(mname); 962e5c89e4eSSatish Balay else PetscLogDump(0); 963e5c89e4eSSatish Balay } 964e5c89e4eSSatish Balay #endif 96510463e74SBarry Smith 96633f85c2fSBarry Smith #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD) 96733f85c2fSBarry Smith if (PetscStackActive) { 96833f85c2fSBarry Smith ierr = PetscStackDestroy();CHKERRQ(ierr); 96933f85c2fSBarry Smith } 97033f85c2fSBarry Smith #endif 97110463e74SBarry Smith 97290d69ab7SBarry Smith flg1 = PETSC_FALSE; 973acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr); 974e5c89e4eSSatish Balay if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);} 97590d69ab7SBarry Smith flg1 = PETSC_FALSE; 976acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-mpidump",&flg1,PETSC_NULL);CHKERRQ(ierr); 977e5c89e4eSSatish Balay if (flg1) { 978e5c89e4eSSatish Balay ierr = PetscMPIDump(stdout);CHKERRQ(ierr); 979e5c89e4eSSatish Balay } 98090d69ab7SBarry Smith flg1 = PETSC_FALSE; 98190d69ab7SBarry Smith flg2 = PETSC_FALSE; 9828bb29257SSatish Balay /* preemptive call to avoid listing this option in options table as unused */ 9838bb29257SSatish Balay ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr); 984acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-options_table",&flg2,PETSC_NULL);CHKERRQ(ierr); 985e4c476e2SSatish Balay 986e5c89e4eSSatish Balay if (flg2) { 98788c29154SBarry Smith if (!rank) {ierr = PetscOptionsView(PETSC_NULL);CHKERRQ(ierr);} 988e5c89e4eSSatish Balay } 989e5c89e4eSSatish Balay 990e5c89e4eSSatish Balay /* to prevent PETSc -options_left from warning */ 991cb9801acSJed Brown ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg1);CHKERRQ(ierr); 992cb9801acSJed Brown ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr); 9930a1571b3SBarry Smith ierr = PetscOptionsGetBool(PETSC_NULL,"-objects_left",&objects_left,PETSC_NULL);CHKERRQ(ierr); 994e5c89e4eSSatish Balay 995f43cc0c9SSatish Balay if (!PetscOpenMPWorker) { /* worker processes skip this because they do not usually process options */ 99633fc4174SSatish Balay flg3 = PETSC_FALSE; /* default value is required */ 997acfcf0e5SJed Brown ierr = PetscOptionsGetBool(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr); 998e5c89e4eSSatish Balay ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr); 999e5c89e4eSSatish Balay if (flg3) { 1000e5c89e4eSSatish Balay if (!flg2) { /* have not yet printed the options */ 100133f85c2fSBarry Smith ierr = PetscOptionsView(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 1002e5c89e4eSSatish Balay } 1003e5c89e4eSSatish Balay if (!nopt) { 1004e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr); 1005e5c89e4eSSatish Balay } else if (nopt == 1) { 1006e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr); 1007e5c89e4eSSatish Balay } else { 1008e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %d unused database options. They are:\n",nopt);CHKERRQ(ierr); 1009e5c89e4eSSatish Balay } 1010e5c89e4eSSatish Balay } 1011e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG) 1012da8b8a77SBarry Smith if (nopt && !flg3 && !flg1) { 1013e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr); 1014e5c89e4eSSatish Balay ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr); 1015e5c89e4eSSatish Balay ierr = PetscOptionsLeft();CHKERRQ(ierr); 1016e5c89e4eSSatish Balay } else if (nopt && flg3) { 1017e5c89e4eSSatish Balay #else 1018e5c89e4eSSatish Balay if (nopt && flg3) { 1019e5c89e4eSSatish Balay #endif 1020e5c89e4eSSatish Balay ierr = PetscOptionsLeft();CHKERRQ(ierr); 1021e5c89e4eSSatish Balay } 1022931f367cSBarry Smith } 1023e5c89e4eSSatish Balay 102410463e74SBarry Smith /* 102533f85c2fSBarry Smith Free all objects registered with PetscObjectRegisterDestroy() such as PETSC_VIEWER_XXX_(). 102633f85c2fSBarry Smith */ 102733f85c2fSBarry Smith ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr); 102833f85c2fSBarry Smith 10292eff7a51SBarry Smith /* 1030dbc8283eSBarry Smith List all objects the user may have forgot to free 10312eff7a51SBarry Smith */ 10320a1571b3SBarry Smith if (objects_left && PetscObjectsCounts) { 1033dbc8283eSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"The following objects %D were never freed\n",PetscObjectsCounts); 10340a1571b3SBarry Smith } 10352eff7a51SBarry Smith for (i=0; i<PetscObjectsMaxCounts; i++) { 10362eff7a51SBarry Smith if (PetscObjects[i]) { 10370a1571b3SBarry Smith if (objects_left) { 10380a1571b3SBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD," %s %s %s\n",PetscObjects[i]->class_name,PetscObjects[i]->type_name,PetscObjects[i]->name);CHKERRQ(ierr); 10390a1571b3SBarry Smith } 10402eff7a51SBarry Smith } 10412eff7a51SBarry Smith } 1042dbc8283eSBarry Smith /* cannot actually destroy the left over objects, but destroy the list */ 1043dbc8283eSBarry Smith PetscObjectsCounts = 0; 1044dbc8283eSBarry Smith PetscObjectsMaxCounts = 0; 1045dbc8283eSBarry Smith ierr = PetscFree(PetscObjects);CHKERRQ(ierr); 10462eff7a51SBarry Smith 10472eff7a51SBarry Smith 104833f85c2fSBarry Smith #if defined(PETSC_USE_LOG) 104933f85c2fSBarry Smith ierr = PetscLogDestroy();CHKERRQ(ierr); 105033f85c2fSBarry Smith #endif 105133f85c2fSBarry Smith 105233f85c2fSBarry Smith /* 105333f85c2fSBarry Smith Free all the registered create functions, such as KSPList, VecList, SNESList, etc 105433f85c2fSBarry Smith */ 105533f85c2fSBarry Smith ierr = PetscFListDestroyAll();CHKERRQ(ierr); 105633f85c2fSBarry Smith 105733f85c2fSBarry Smith /* 105833f85c2fSBarry Smith Destroy any packages that registered a finalize 105933f85c2fSBarry Smith */ 106033f85c2fSBarry Smith ierr = PetscRegisterFinalizeAll();CHKERRQ(ierr); 106133f85c2fSBarry Smith 106233f85c2fSBarry Smith /* 106310463e74SBarry Smith Destroy all the function registration lists created 106410463e74SBarry Smith */ 106510463e74SBarry Smith ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr); 106610463e74SBarry Smith 10674028d114SSatish Balay if (petsc_history) { 1068f3dea69dSBarry Smith ierr = PetscCloseHistoryFile(&petsc_history);CHKERRQ(ierr); 1069e5c89e4eSSatish Balay petsc_history = 0; 1070e5c89e4eSSatish Balay } 1071e5c89e4eSSatish Balay 10726cf91177SBarry Smith ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr); 1073e5c89e4eSSatish Balay 10748bb29257SSatish Balay { 1075e5c89e4eSSatish Balay char fname[PETSC_MAX_PATH_LEN]; 1076e5c89e4eSSatish Balay FILE *fd; 1077ed9cf6e9SBarry Smith int err; 1078e5c89e4eSSatish Balay 1079e5c89e4eSSatish Balay fname[0] = 0; 1080e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr); 1081e5c89e4eSSatish Balay if (flg1 && fname[0]) { 1082e5c89e4eSSatish Balay char sname[PETSC_MAX_PATH_LEN]; 1083e5c89e4eSSatish Balay 1084e5c89e4eSSatish Balay sprintf(sname,"%s_%d",fname,rank); 1085e32f2f54SBarry Smith fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 1086e5c89e4eSSatish Balay ierr = PetscMallocDump(fd);CHKERRQ(ierr); 1087ed9cf6e9SBarry Smith err = fclose(fd); 1088e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 10898bb29257SSatish Balay } else if (flg1) { 1090e5c89e4eSSatish Balay MPI_Comm local_comm; 1091e5c89e4eSSatish Balay 1092e5c89e4eSSatish Balay ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr); 1093e5c89e4eSSatish Balay ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr); 1094e5c89e4eSSatish Balay ierr = PetscMallocDump(stdout);CHKERRQ(ierr); 1095e5c89e4eSSatish Balay ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr); 1096e5c89e4eSSatish Balay ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr); 1097e5c89e4eSSatish Balay } 1098e5c89e4eSSatish Balay } 10998bb29257SSatish Balay { 1100e5c89e4eSSatish Balay char fname[PETSC_MAX_PATH_LEN]; 1101e5c89e4eSSatish Balay FILE *fd; 1102e5c89e4eSSatish Balay 1103e5c89e4eSSatish Balay fname[0] = 0; 1104e5c89e4eSSatish Balay ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr); 1105e5c89e4eSSatish Balay if (flg1 && fname[0]) { 1106e5c89e4eSSatish Balay char sname[PETSC_MAX_PATH_LEN]; 1107ed9cf6e9SBarry Smith int err; 1108e5c89e4eSSatish Balay 1109e5c89e4eSSatish Balay sprintf(sname,"%s_%d",fname,rank); 1110e32f2f54SBarry Smith fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 1111e5c89e4eSSatish Balay ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr); 1112ed9cf6e9SBarry Smith err = fclose(fd); 1113e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 11148bb29257SSatish Balay } else if (flg1) { 1115e5c89e4eSSatish Balay ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr); 1116e5c89e4eSSatish Balay } 1117e5c89e4eSSatish Balay } 1118e5c89e4eSSatish Balay /* Can be destroyed only after all the options are used */ 1119e5c89e4eSSatish Balay ierr = PetscOptionsDestroy();CHKERRQ(ierr); 1120e5c89e4eSSatish Balay 1121e5c89e4eSSatish Balay PetscGlobalArgc = 0; 1122e5c89e4eSSatish Balay PetscGlobalArgs = 0; 1123e5c89e4eSSatish Balay 1124c90a1750SBarry Smith #if defined(PETSC_USE_SCALAR___FLOAT128) 1125c90a1750SBarry Smith ierr = MPI_Type_free(&MPIU___FLOAT128);CHKERRQ(ierr); 1126854411e3SBarry Smith ierr = MPI_Op_free(&MPIU_SUM);CHKERRQ(ierr); 1127*d9822059SBarry Smith ierr = MPI_Op_free(&MPIU_MAX);CHKERRQ(ierr); 1128*d9822059SBarry Smith ierr = MPI_Op_free(&MPIU_MIN);CHKERRQ(ierr); 1129c90a1750SBarry Smith #endif 1130c90a1750SBarry Smith 1131e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 11322c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 113306a205a8SBarry Smith ierr = MPI_Op_free(&MPIU_SUM);CHKERRQ(ierr); 11342c876bd9SBarry Smith ierr = MPI_Type_free(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr); 1135a83b8d76SBarry Smith ierr = MPI_Type_free(&MPI_C_COMPLEX);CHKERRQ(ierr); 11362c876bd9SBarry Smith #endif 1137e5c89e4eSSatish Balay #endif 1138e5c89e4eSSatish Balay ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr); 1139e5c89e4eSSatish Balay ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr); 1140e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr); 1141e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr); 1142e5c89e4eSSatish Balay ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr); 1143e5c89e4eSSatish Balay 1144dbc8283eSBarry Smith /* 1145dbc8283eSBarry Smith Destroy any known inner communicators and attributes pointing to them 1146dbc8283eSBarry Smith Note this will not destroy any new communicators the user has created 1147dbc8283eSBarry Smith */ 1148b770b1f6SSatish Balay { 1149dbc8283eSBarry Smith PetscCommCounter *counter; 1150dbc8283eSBarry Smith PetscMPIInt flg; 1151dbc8283eSBarry Smith MPI_Comm icomm; 1152dbc8283eSBarry Smith void *ptr; 1153dbc8283eSBarry Smith ierr = MPI_Attr_get(PETSC_COMM_SELF,Petsc_InnerComm_keyval,&ptr,&flg);CHKERRQ(ierr); 1154dbc8283eSBarry Smith if (flg) { 1155dbc8283eSBarry Smith /* Use PetscMemcpy() because casting from pointer to integer of different size is not allowed with some compilers */ 1156dbc8283eSBarry Smith ierr = PetscMemcpy(&icomm,&ptr,sizeof(MPI_Comm));CHKERRQ(ierr); 1157dbc8283eSBarry Smith ierr = MPI_Attr_get(icomm,Petsc_Counter_keyval,&counter,&flg);CHKERRQ(ierr); 1158dbc8283eSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"Inner MPI_Comm does not have expected tag/name counter, problem with corrupted memory"); 1159dbc8283eSBarry Smith 1160dbc8283eSBarry Smith ierr = MPI_Attr_delete(icomm,Petsc_Counter_keyval);CHKERRQ(ierr); 1161dbc8283eSBarry Smith ierr = MPI_Attr_delete(icomm,Petsc_OuterComm_keyval);CHKERRQ(ierr); 1162dbc8283eSBarry Smith ierr = MPI_Comm_free(&icomm);CHKERRQ(ierr); 1163dbc8283eSBarry Smith ierr = MPI_Attr_delete(PETSC_COMM_SELF,Petsc_InnerComm_keyval);CHKERRQ(ierr); 1164dbc8283eSBarry Smith } 1165dbc8283eSBarry Smith ierr = MPI_Attr_get(PETSC_COMM_WORLD,Petsc_InnerComm_keyval,&ptr,&flg);CHKERRQ(ierr); 1166dbc8283eSBarry Smith if (flg) { 1167dbc8283eSBarry Smith /* Use PetscMemcpy() because casting from pointer to integer of different size is not allowed with some compilers */ 1168dbc8283eSBarry Smith ierr = PetscMemcpy(&icomm,&ptr,sizeof(MPI_Comm));CHKERRQ(ierr); 1169dbc8283eSBarry Smith ierr = MPI_Attr_get(icomm,Petsc_Counter_keyval,&counter,&flg);CHKERRQ(ierr); 1170dbc8283eSBarry Smith if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_CORRUPT,"Inner MPI_Comm does not have expected tag/name counter, problem with corrupted memory"); 1171dbc8283eSBarry Smith 1172dbc8283eSBarry Smith ierr = MPI_Attr_delete(icomm,Petsc_Counter_keyval);CHKERRQ(ierr); 1173dbc8283eSBarry Smith ierr = MPI_Attr_delete(icomm,Petsc_OuterComm_keyval);CHKERRQ(ierr); 1174dbc8283eSBarry Smith ierr = MPI_Comm_free(&icomm);CHKERRQ(ierr); 1175dbc8283eSBarry Smith ierr = MPI_Attr_delete(PETSC_COMM_WORLD,Petsc_InnerComm_keyval);CHKERRQ(ierr); 1176dbc8283eSBarry Smith } 1177b770b1f6SSatish Balay } 1178dbc8283eSBarry Smith 1179480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_Counter_keyval);CHKERRQ(ierr); 1180480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_InnerComm_keyval);CHKERRQ(ierr); 1181480cf27aSJed Brown ierr = MPI_Keyval_free(&Petsc_OuterComm_keyval);CHKERRQ(ierr); 1182480cf27aSJed Brown 1183ae15b995SBarry Smith ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr); 1184e5c89e4eSSatish Balay if (PetscBeganMPI) { 118599608316SBarry Smith #if defined(PETSC_HAVE_MPI_FINALIZED) 118699b1327fSBarry Smith PetscMPIInt flag; 118799b1327fSBarry Smith ierr = MPI_Finalized(&flag);CHKERRQ(ierr); 1188e32f2f54SBarry Smith if (flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"MPI_Finalize() has already been called, even though MPI_Init() was called by PetscInitialize()"); 118999608316SBarry Smith #endif 1190e5c89e4eSSatish Balay ierr = MPI_Finalize();CHKERRQ(ierr); 1191e5c89e4eSSatish Balay } 1192e5c89e4eSSatish Balay 11939c4c166aSBarry Smith if (PETSC_ZOPEFD){ 119422b84c2fSbcordonn if (PETSC_ZOPEFD != PETSC_STDOUT) fprintf(PETSC_ZOPEFD, "<<<end>>>"); 11959c4c166aSBarry Smith else fprintf(PETSC_STDOUT, "<<<end>>>"); 11969c4c166aSBarry Smith } 119736186564Sbcordonn 119835d88935SVictor Minden #if defined(PETSC_HAVE_CUDA) 11992f947c57SVictor Minden cublasShutdown(); 1200440a5bbfSVictor Minden #endif 1201e5c89e4eSSatish Balay /* 1202e5c89e4eSSatish Balay 1203e5c89e4eSSatish Balay Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because 1204e5c89e4eSSatish Balay the communicator has some outstanding requests on it. Specifically if the 1205e5c89e4eSSatish Balay flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See 1206e5c89e4eSSatish Balay src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate() 1207e5c89e4eSSatish Balay is never freed as it should be. Thus one may obtain messages of the form 12080e5e90baSSatish Balay [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the 1209e5c89e4eSSatish Balay memory was not freed. 1210e5c89e4eSSatish Balay 1211e5c89e4eSSatish Balay */ 12121d1a0024SBarry Smith ierr = PetscMallocClear();CHKERRQ(ierr); 1213e5c89e4eSSatish Balay PetscInitializeCalled = PETSC_FALSE; 1214e5c89e4eSSatish Balay PetscFinalizeCalled = PETSC_TRUE; 1215e5c89e4eSSatish Balay PetscFunctionReturn(ierr); 1216e5c89e4eSSatish Balay } 1217e5c89e4eSSatish Balay 1218