Actual source code: elemental.cxx

petsc-3.13.6 2020-09-29
Report Typos and Errors
  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 responsability
 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:   PetscMPIInt    result;

 26:   if (El::Initialized()) return 0;
 27:   if (PETSC_COMM_WORLD != MPI_COMM_NULL) { /* MPI has been initialized and PETSC_COMM_WORLD has been set */
 28:     MPI_Comm_compare(PETSC_COMM_WORLD,MPI_COMM_WORLD,&result);if (ierr) return ierr;
 29:     if (result == MPI_UNEQUAL) return result; /* cannot use Elemental with PETSC_COMM_WORLD and MPI_COMM_WORLD comparing to MPI_UNEQUAL, call PetscElementalInitializePackage()/PetscElementalFinalizePackage() collectively */
 30:   }
 31:   El::Initialize(); /* called by PetscInitialize_DynamicLibraries(void) or users */
 32:   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 */
 33:     PetscRegisterFinalize(PetscElementalFinalizePackage);if (ierr) return ierr;
 34:   }
 35:   return 0;
 36: }

 38: /*@
 39:    PetscElementalInitialized - Determine whether Elemental is initialized

 41:    Not Collective

 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 0;
 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 0;
 73: }