Actual source code: elemental.cxx

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

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

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

 10:   Level: developer

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

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

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

 39:   Not Collective

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

 44:   Level: developer

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

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

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

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

 62:   Level: developer

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

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