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 @*/
PetscElementalInitializePackage(void)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 @*/
PetscElementalInitialized(PetscBool * isInitialized)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 @*/
PetscElementalFinalizePackage(void)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