Actual source code: elemental.cxx

  1: #include <petscmatelemental.h>
  2: #include <petsc/private/petscimpl.h>

  4: /*@
  5:   PetscElementalInitializePackage - Initialize Elemental package

  7:   Collective on `MPI_COMM_WORLD`, not `PETSC_COMM_WORLD`

  9:   Level: developer

 11:   Note:
 12:   Can be called outside of `PetscInitialize()` and `PetscFinalize()`.
 13:   If called outside of these functions, it is the user's responsibility
 14:   to make sure that `PETSC_COMM_WORLD` is either unset (default value is `MPI_COMM_NULL`),
 15:   or that it is not `MPI_UNEQUAL` to `MPI_COMM_WORLD`.
 16:   Users who do not have a custom `PETSC_COMM_WORLD` do not have to call this function.

 18: .seealso: `MATELEMENTAL`, `PetscElementalFinalizePackage()`
 19: @*/
 20: PetscErrorCode PetscElementalInitializePackage(void)
 21: {
 22:   if (El::Initialized()) return PETSC_SUCCESS;
 23:   if (PETSC_COMM_WORLD != MPI_COMM_NULL) { /* MPI has been initialized and PETSC_COMM_WORLD has been set */
 24:     PetscMPIInt result;
 25:     PetscCallMPI(MPI_Comm_compare(PETSC_COMM_WORLD, MPI_COMM_WORLD, &result));
 26:     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 */
 27:   }
 28:   El::Initialize();            /* called by PetscInitialize_DynamicLibraries(void) or users */
 29:   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 */
 30:     PetscCall(PetscRegisterFinalize(PetscElementalFinalizePackage));
 31:   }
 32:   return PETSC_SUCCESS;
 33: }

 35: /*@
 36:   PetscElementalInitialized - Determine whether Elemental is initialized

 38:   Not Collective

 40:   Output Parameter:
 41: . isInitialized - `PETSC_TRUE` if elemental is initialized, `PETSC_FALSE` otherwise

 43:   Level: developer

 45:   Note:
 46:   Can be called outside of `PetscInitialize()` and `PetscFinalize()`.

 48: .seealso: `MATELEMENTAL`, `PetscElementalInitializePackage()`
 49: @*/
 50: PetscErrorCode PetscElementalInitialized(PetscBool *isInitialized)
 51: {
 52:   if (isInitialized) *isInitialized = (PetscBool)El::Initialized();
 53:   return PETSC_SUCCESS;
 54: }

 56: /*@
 57:   PetscElementalFinalizePackage - Finalize Elemental package

 59:   Collective on `MPI_COMM_WORLD`, not `PETSC_COMM_WORLD`

 61:   Level: developer

 63:   Note:
 64:   Can be called outside of `PetscInitialize()` and `PetscFinalize()`.
 65:   Users who do not call `PetscElementalInitializePackage()` do not have to call this function.

 67: .seealso: `MATELEMENTAL`, `PetscElementalInitializePackage()`
 68: @*/
 69: PetscErrorCode PetscElementalFinalizePackage(void)
 70: {
 71:   if (El::Initialized()) El::Finalize();
 72:   return PETSC_SUCCESS;
 73: }