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: }