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: Level: developer
43: Note:
44: Can be called outside of `PetscInitialize()` and `PetscFinalize()`.
46: .seealso: `MATELEMENTAL`, `PetscElementalInitializePackage()`
47: @*/
48: PetscErrorCode PetscElementalInitialized(PetscBool *isInitialized)
49: {
50: if (isInitialized) *isInitialized = (PetscBool)El::Initialized();
51: return PETSC_SUCCESS;
52: }
54: /*@
55: PetscElementalFinalizePackage - Finalize Elemental package
57: Collective on `MPI_COMM_WORLD`, not `PETSC_COMM_WORLD`
59: Level: developer
61: Note:
62: Can be called outside of `PetscInitialize()` and `PetscFinalize()`.
63: Users who do not call `PetscElementalInitializePackage()` do not have to call this function.
65: .seealso: `MATELEMENTAL`, `PetscElementalInitializePackage()`
66: @*/
67: PetscErrorCode PetscElementalFinalizePackage(void)
68: {
69: if (El::Initialized()) El::Finalize();
70: return PETSC_SUCCESS;
71: }