Skip to content

Commit

Permalink
Increased readibility for hypre interface (#1857)
Browse files Browse the repository at this point in the history
Moving hypre code mapping to HypreUtils.hpp + adding enumerations
  • Loading branch information
castelletto1 authored Apr 3, 2022
1 parent b18bf1a commit cf4004d
Show file tree
Hide file tree
Showing 19 changed files with 543 additions and 327 deletions.
24 changes: 24 additions & 0 deletions src/coreComponents/codingUtilities/Utilities.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,30 @@ void forEachArgInTuple( std::tuple< Ts ... > const & tuple, F && func )
internal::forEachArgInTuple( tuple, std::forward< F >( func ), std::make_index_sequence< sizeof...( Ts ) >() );
}

/**
* @brief Utility function to convert the value of an enumerator to its underlying type (integer).
* @tparam ENUMERATION the type of the enumeration
* @param[in] value the value of the enumerator
* @return the integer conversion of @p value
*/
template< typename ENUMERATION >
std::underlying_type_t< ENUMERATION > toUnderlying( ENUMERATION const value )
{
return static_cast< std::underlying_type_t< ENUMERATION > >( value );
}

/**
* @brief Utility function to convert a pointer to an enumeration to a pointer to its underlying type (integer).
* @tparam ENUMERATION the type of the enumeration
* @param[in] enumPtr the pointer to the enumeration
* @return the pointer to the enumeration underlying type
*/
template< typename ENUMERATION >
std::underlying_type_t< ENUMERATION > * toUnderlyingPtr( ENUMERATION * const enumPtr )
{
return reinterpret_cast< std::underlying_type_t< ENUMERATION > * >( enumPtr );
}

// The code below should work with any subscriptable vector/matrix types

/**
Expand Down
69 changes: 35 additions & 34 deletions src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@

#include "linearAlgebra/common/common.hpp"

#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp"
#include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp"

#include "LvArray/src/output.hpp"

Expand Down Expand Up @@ -67,64 +67,64 @@ void hypre::mgr::createMGR( LinearSolverParameters const & params,
// using namespace hypre::mgr;
switch( params.mgr.strategy )
{
case LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirFVM:
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseFVM:
{
setStrategy< SinglePhaseReservoirFVM >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< CompositionalMultiphaseFVM >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM:
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM:
{
setStrategy< SinglePhaseHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< CompositionalMultiphaseHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM:
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM:
{
setStrategy< SinglePhaseReservoirHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< CompositionalMultiphaseReservoirFVM >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanics:
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM:
{
setStrategy< SinglePhasePoromechanics >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< CompositionalMultiphaseReservoirHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::hybridSinglePhasePoromechanics:
{
setStrategy< HybridSinglePhasePoromechanics >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseFVM:
case LinearSolverParameters::MGR::StrategyType::hydrofracture:
{
setStrategy< CompositionalMultiphaseFVM >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< Hydrofracture >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM:
case LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics:
{
setStrategy< CompositionalMultiphaseReservoirFVM >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< LagrangianContactMechanics >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM:
case LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics:
{
setStrategy< CompositionalMultiphaseHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< MultiphasePoromechanics >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM:
case LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM:
{
setStrategy< CompositionalMultiphaseReservoirHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< SinglePhaseHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics:
case LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanics:
{
setStrategy< MultiphasePoromechanics >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< SinglePhasePoromechanics >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::hydrofracture:
case LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirFVM:
{
setStrategy< Hydrofracture >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< SinglePhaseReservoirFVM >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
case LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics:
case LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM:
{
setStrategy< LagrangianContactMechanics >( params.mgr, numComponentsPerField, precond, mgrData );
setStrategy< SinglePhaseReservoirHybridFVM >( params.mgr, numComponentsPerField, precond, mgrData );
break;
}
default:
Expand All @@ -151,16 +151,17 @@ void hypre::mgr::createMGR( LinearSolverParameters const & params,
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( mgrData.mechSolver.ptr, 0.0 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxIter( mgrData.mechSolver.ptr, 1 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxRowSum( mgrData.mechSolver.ptr, 1.0 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetStrongThreshold( mgrData.mechSolver.ptr, 0.6 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetStrongThreshold( mgrData.mechSolver.ptr, 0.8 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetPrintLevel( mgrData.mechSolver.ptr, 0 ) );
#ifdef GEOSX_USE_HYPRE_CUDA
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( mgrData.mechSolver.ptr, 8 ) ); // PMIS
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( mgrData.mechSolver.ptr, 18 ) ); // l1-Jacobi
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( mgrData.mechSolver.ptr, hypre::getAMGCoarseningType( "PMIS" ) ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( mgrData.mechSolver.ptr, hypre::getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::l1jacobi ) ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumSweeps( mgrData.mechSolver.ptr, 2 ) );
#else
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxOrder( mgrData.mechSolver.ptr, 1 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( mgrData.mechSolver.ptr, hypre::getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::l1sgs ) ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumSweeps( mgrData.mechSolver.ptr, 1 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxWt( mgrData.mechSolver.ptr, 0.8 ) );
#endif
//GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( mgrData.mechSolver.ptr, 1 ) );
GEOSX_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumFunctions( mgrData.mechSolver.ptr, 3 ) );

mgrData.mechSolver.setup = HYPRE_BoomerAMGSetup;
Expand Down
30 changes: 18 additions & 12 deletions src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,28 +82,34 @@ class MGRStrategyBase
HYPRE_Int m_numLabels[numLevels]{ -1 }; ///< Number of dof labels kept
HYPRE_Int * m_ptrLabels[numLevels]{ nullptr }; ///< Pointers to each level's labels, as consumed by MGR

HYPRE_Int m_levelFRelaxMethod[numLevels]{ -1 }; ///< F-relaxation method for each level
HYPRE_Int m_levelInterpType[numLevels]{ -1 }; ///< Interpolation type for each level
HYPRE_Int m_levelRestrictType[numLevels]{ -1 }; ///< Restriction type for each level
HYPRE_Int m_levelCoarseGridMethod[numLevels]{ -1 }; ///< Coarse grid method for each level
MGRFRelaxationMethod m_levelFRelaxMethod[numLevels]; ///< F-relaxation method for each level
MGRInterpolationType m_levelInterpType[numLevels]; ///< Interpolation type for each level
MGRRestrictionType m_levelRestrictType[numLevels]; ///< Restriction type for each level
MGRCoarseGridMethod m_levelCoarseGridMethod[numLevels]; ///< Coarse grid method for each level

HYPRE_Int m_numRestrictSweeps{ -1 }; ///< Number of restrict sweeps
HYPRE_Int m_numInterpSweeps{ -1 }; ///< Number of interpolation sweeps
HYPRE_Int m_numRestrictSweeps{ -1 }; ///< Number of restrict sweeps
HYPRE_Int m_numInterpSweeps{ -1 }; ///< Number of interpolation sweeps

HYPRE_Int m_fRelaxMethod{ -1 }; ///< F-relaxation method
HYPRE_Int m_relaxType{ -1 }; ///< F-relaxation type
HYPRE_Int m_numRelaxSweeps{ -1 }; ///< F-relaxation number of sweeps
HYPRE_Int m_numRelaxSweeps{ -1 }; ///< F-relaxation number of sweeps

HYPRE_Int m_globalSmoothType{ -1 }; ///< Global smoothing type
HYPRE_Int m_numGlobalSmoothSweeps{ -1 }; ///< Global smoothing number of iterations
MGRGlobalSmootherType m_globalSmoothType{ MGRGlobalSmootherType::blockJacobi }; ///< Global smoothing type
HYPRE_Int m_numGlobalSmoothSweeps{ -1 }; ///< Global smoothing number of iterations

/**
* @brief Constructor.
* @param numBlocks number of blocks
*/
explicit MGRStrategyBase( HYPRE_Int const numBlocks )
: m_numBlocks( numBlocks )
{}
{
for( HYPRE_Int i = 0; i < numLevels; ++i )
{
m_levelFRelaxMethod[i] = MGRFRelaxationMethod::singleLevel;
m_levelInterpType[i] = MGRInterpolationType::jacobi;
m_levelRestrictType[i] = MGRRestrictionType::injection;
m_levelCoarseGridMethod[i] = MGRCoarseGridMethod::galerkin;
}
}

/**
* @brief Call this after populating lv_cindexes.
Expand Down
Loading

0 comments on commit cf4004d

Please sign in to comment.