1*4eb4c1f9SJacob Faibussowitsch #include <petscsys.h> 2*4eb4c1f9SJacob Faibussowitsch #include <petscmatelemental.h> 3*4eb4c1f9SJacob Faibussowitsch #include <petsc/private/petscimpl.h> 4*4eb4c1f9SJacob Faibussowitsch 5*4eb4c1f9SJacob Faibussowitsch /*@ 6*4eb4c1f9SJacob Faibussowitsch PetscElementalInitializePackage - Initialize Elemental package 7*4eb4c1f9SJacob Faibussowitsch 8*4eb4c1f9SJacob Faibussowitsch Collective on `MPI_COMM_WORLD`, not `PETSC_COMM_WORLD` 9*4eb4c1f9SJacob Faibussowitsch 10*4eb4c1f9SJacob Faibussowitsch Level: developer 11*4eb4c1f9SJacob Faibussowitsch 12*4eb4c1f9SJacob Faibussowitsch Note: 13*4eb4c1f9SJacob Faibussowitsch Can be called outside of `PetscInitialize()` and `PetscFinalize()`. 14*4eb4c1f9SJacob Faibussowitsch If called outside of these functions, it is the user's responsibility 15*4eb4c1f9SJacob Faibussowitsch to make sure that `PETSC_COMM_WORLD` is either unset (default value is `MPI_COMM_NULL`), 16*4eb4c1f9SJacob Faibussowitsch or that it is not `MPI_UNEQUAL` to `MPI_COMM_WORLD`. 17*4eb4c1f9SJacob Faibussowitsch Users who do not have a custom `PETSC_COMM_WORLD` do not have to call this function. 18*4eb4c1f9SJacob Faibussowitsch 19*4eb4c1f9SJacob Faibussowitsch .seealso: `MATELEMENTAL`, `PetscElementalFinalizePackage()` 20*4eb4c1f9SJacob Faibussowitsch @*/ 21*4eb4c1f9SJacob Faibussowitsch PetscErrorCode PetscElementalInitializePackage(void) 22*4eb4c1f9SJacob Faibussowitsch { 23*4eb4c1f9SJacob Faibussowitsch if (El::Initialized()) return PETSC_SUCCESS; 24*4eb4c1f9SJacob Faibussowitsch if (PETSC_COMM_WORLD != MPI_COMM_NULL) { /* MPI has been initialized and PETSC_COMM_WORLD has been set */ 25*4eb4c1f9SJacob Faibussowitsch PetscMPIInt result; 26*4eb4c1f9SJacob Faibussowitsch PetscCallMPI(MPI_Comm_compare(PETSC_COMM_WORLD, MPI_COMM_WORLD, &result)); 27*4eb4c1f9SJacob Faibussowitsch if (result == MPI_UNEQUAL) return PETSC_ERR_MPI; /* cannot use Elemental with PETSC_COMM_WORLD and MPI_COMM_WORLD comparing to MPI_UNEQUAL, call PetscElementalInitializePackage()/PetscElementalFinalizePackage() collectively */ 28*4eb4c1f9SJacob Faibussowitsch } 29*4eb4c1f9SJacob Faibussowitsch El::Initialize(); /* called by PetscInitialize_DynamicLibraries(void) or users */ 30*4eb4c1f9SJacob Faibussowitsch if (PetscInitializeCalled) { /* true if MPI is initialized by PETSc, false if MPI has been initialized outside and thus PETSC_COMM_WORLD can't be set to something else than MPI_COMM_NULL, see src/sys/objects/pinit.c */ 31*4eb4c1f9SJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscElementalFinalizePackage)); 32*4eb4c1f9SJacob Faibussowitsch } 33*4eb4c1f9SJacob Faibussowitsch return PETSC_SUCCESS; 34*4eb4c1f9SJacob Faibussowitsch } 35*4eb4c1f9SJacob Faibussowitsch 36*4eb4c1f9SJacob Faibussowitsch /*@ 37*4eb4c1f9SJacob Faibussowitsch PetscElementalInitialized - Determine whether Elemental is initialized 38*4eb4c1f9SJacob Faibussowitsch 39*4eb4c1f9SJacob Faibussowitsch Not Collective 40*4eb4c1f9SJacob Faibussowitsch 41*4eb4c1f9SJacob Faibussowitsch Output Parameter: 42*4eb4c1f9SJacob Faibussowitsch . isInitialized - `PETSC_TRUE` if elemental is initialized, `PETSC_FALSE` otherwise 43*4eb4c1f9SJacob Faibussowitsch 44*4eb4c1f9SJacob Faibussowitsch Level: developer 45*4eb4c1f9SJacob Faibussowitsch 46*4eb4c1f9SJacob Faibussowitsch Note: 47*4eb4c1f9SJacob Faibussowitsch Can be called outside of `PetscInitialize()` and `PetscFinalize()`. 48*4eb4c1f9SJacob Faibussowitsch 49*4eb4c1f9SJacob Faibussowitsch .seealso: `MATELEMENTAL`, `PetscElementalInitializePackage()` 50*4eb4c1f9SJacob Faibussowitsch @*/ 51*4eb4c1f9SJacob Faibussowitsch PetscErrorCode PetscElementalInitialized(PetscBool *isInitialized) 52*4eb4c1f9SJacob Faibussowitsch { 53*4eb4c1f9SJacob Faibussowitsch if (isInitialized) *isInitialized = (PetscBool)El::Initialized(); 54*4eb4c1f9SJacob Faibussowitsch return PETSC_SUCCESS; 55*4eb4c1f9SJacob Faibussowitsch } 56*4eb4c1f9SJacob Faibussowitsch 57*4eb4c1f9SJacob Faibussowitsch /*@ 58*4eb4c1f9SJacob Faibussowitsch PetscElementalFinalizePackage - Finalize Elemental package 59*4eb4c1f9SJacob Faibussowitsch 60*4eb4c1f9SJacob Faibussowitsch Collective on `MPI_COMM_WORLD`, not `PETSC_COMM_WORLD` 61*4eb4c1f9SJacob Faibussowitsch 62*4eb4c1f9SJacob Faibussowitsch Level: developer 63*4eb4c1f9SJacob Faibussowitsch 64*4eb4c1f9SJacob Faibussowitsch Note: 65*4eb4c1f9SJacob Faibussowitsch Can be called outside of `PetscInitialize()` and `PetscFinalize()`. 66*4eb4c1f9SJacob Faibussowitsch Users who do not call `PetscElementalInitializePackage()` do not have to call this function. 67*4eb4c1f9SJacob Faibussowitsch 68*4eb4c1f9SJacob Faibussowitsch .seealso: `MATELEMENTAL`, `PetscElementalInitializePackage()` 69*4eb4c1f9SJacob Faibussowitsch @*/ 70*4eb4c1f9SJacob Faibussowitsch PetscErrorCode PetscElementalFinalizePackage(void) 71*4eb4c1f9SJacob Faibussowitsch { 72*4eb4c1f9SJacob Faibussowitsch if (El::Initialized()) El::Finalize(); 73*4eb4c1f9SJacob Faibussowitsch return PETSC_SUCCESS; 74*4eb4c1f9SJacob Faibussowitsch } 75