20 #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEBASE_HPP_
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEBASE_HPP_
25 #include "constitutive/fluid/multifluid/Layouts.hpp"
26 #include "constitutive/relativePermeability/Layouts.hpp"
27 #include "constitutive/capillaryPressure/Layouts.hpp"
28 #include "constitutive/fluid/multifluid/MultiFluidBase.hpp"
29 #include "constitutive/solid/CoupledSolidBase.hpp"
30 #include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp"
52 "OverallComposition" );
70 Group *
const parent );
135 template<
typename SUBREGION_TYPE >
137 SUBREGION_TYPE
const & subRegion,
233 {
return m_useMass ? units::Unit::Mass : units::Unit::Mole; }
285 static constexpr
char const * elemDofFieldString() {
return "compositionalVariables"; }
289 static constexpr
char const * useMassFlagString() {
return "useMass"; }
290 static constexpr
char const * formulationTypeString() {
return "formulationType"; }
294 static constexpr
char const * solutionChangeScalingFactorString() {
return "solutionChangeScalingFactor"; }
295 static constexpr
char const * targetRelativePresChangeString() {
return "targetRelativePressureChangeInTimeStep"; }
296 static constexpr
char const * targetRelativeTempChangeString() {
return "targetRelativeTemperatureChangeInTimeStep"; }
297 static constexpr
char const * targetPhaseVolFracChangeString() {
return "targetPhaseVolFractionChangeInTimeStep"; }
298 static constexpr
char const * targetRelativeCompDensChangeString() {
return "targetRelativeCompDensChangeInTimeStep"; }
299 static constexpr
char const * targetCompFracChangeString() {
return "targetCompFracChangeInTimeStep"; }
300 static constexpr
char const * targetFlowCFLString() {
return "targetFlowCFL"; }
305 static constexpr
char const * maxCompFracChangeString() {
return "maxCompFractionChange"; }
306 static constexpr
char const * maxRelativePresChangeString() {
return "maxRelativePressureChange"; }
307 static constexpr
char const * maxRelativeTempChangeString() {
return "maxRelativeTemperatureChange"; }
308 static constexpr
char const * maxRelativeCompDensChangeString() {
return "maxRelativeCompDensChange"; }
309 static constexpr
char const * allowLocalCompDensChoppingString() {
return "allowLocalCompDensityChopping"; }
310 static constexpr
char const * useTotalMassEquationString() {
return "useTotalMassEquation"; }
311 static constexpr
char const * useSimpleAccumulationString() {
return "useSimpleAccumulation"; }
312 static constexpr
char const * minCompDensString() {
return "minCompDens"; }
313 static constexpr
char const * minCompFracString() {
return "minCompFrac"; }
314 static constexpr
char const * maxSequentialCompDensChangeString() {
return "maxSequentialCompDensChange"; }
315 static constexpr
char const * minScalingFactorString() {
return "minScalingFactor"; }
317 static constexpr
char const * relPermNamesString() {
return "relPermNames"; }
318 static constexpr
char const * capPressureNamesString() {
return "capPressureNames"; }
319 static constexpr
char const * diffusionNamesString() {
return "diffusionNames"; }
320 static constexpr
char const * dispersionNamesString() {
return "dispersionNames"; }
533 real64 m_maxSequentialCompDensChange;
543 real64 const time )
const;
549 template<
typename SUBREGION_TYPE >
551 SUBREGION_TYPE
const & subRegion,
555 constitutive::MultiFluidBase
const & fluid =
556 getConstitutiveModel< constitutive::MultiFluidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::fluidNamesString() ) );
557 constitutive::CoupledSolidBase
const & solid =
558 getConstitutiveModel< constitutive::CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) );
560 string const dofKey = dofManager.
getKey( viewKeyStruct::elemDofFieldString() );
562 using namespace isothermalCompositionalMultiphaseBaseKernels;
564 BitFlags< KernelFlags > kernelFlags;
566 kernelFlags.set( KernelFlags::TotalMassEquation );
568 kernelFlags.set( KernelFlags::SimpleAccumulation );
573 isothermalCompositionalMultiphaseBaseKernels::
574 AccumulationZFormulationKernelFactory::
590 thermalCompositionalMultiphaseBaseKernels::
591 AccumulationKernelFactory::
605 isothermalCompositionalMultiphaseBaseKernels::
606 AccumulationKernelFactory::
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
#define GEOS_ERROR(...)
Raise a hard error and terminate the program.
Unit
Enumerator of available unit types for given physical scales. Units are in SI by default.
void initializeAquiferBC(constitutive::ConstitutiveManager const &cm) const
Initialize the aquifer boundary condition (gravity vector, water phase index)
bool m_hasCapPressure
flag to determine whether or not to apply capillary pressure
real64 m_solutionChangeScalingFactor
damping factor for solution change targets
CompositionalMultiphaseBase(CompositionalMultiphaseBase &&)=default
default move constructor
virtual void initializePreSubGroups() override
Called by Initialize() prior to initializing sub-Groups.
real64 m_targetPhaseVolFracChange
target (absolute) change in phase volume fraction in a time step
virtual void postInputInitialization() override
void keepVariablesConstantDuringInitStep(real64 const time, real64 const dt, DofManager const &dofManager, DomainPartition &domain, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const
Function to fix the initial state during the initialization step in coupled problems.
integer m_useMass
flag indicating whether mass or molar formulation should be used
integer m_useSimpleAccumulation
flag indicating whether simple accumulation form is used
real64 m_maxRelativeTempChange
maximum (relative) change in temperature in a Newton iteration
virtual bool checkSequentialSolutionIncrements(DomainPartition &domain) const override
Check if the solution increments are ok to use.
real64 m_targetCompFracChange
target (absolute) change in component fraction in a time step
virtual void initializeFluidState(MeshLevel &mesh, string_array const ®ionNames) override
Initialize all variables from initial conditions.
real64 m_maxRelativePresChange
maximum (relative) change in pressure in a Newton iteration
real64 m_targetRelativePresChange
target (relative) change in pressure in a time step
real64 m_minCompFrac
minimum allowed global component fraction
void validateConstitutiveModels(DomainPartition const &domain) const
Utility function that checks the consistency of the constitutive models.
real64 m_minScalingFactor
minimum value of the scaling factor obtained by enforcing maxCompFracChange
virtual void applyAquiferBC(real64 const time, real64 const dt, DofManager const &dofManager, DomainPartition &domain, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const =0
Apply aquifer boundary conditions to the system.
bool m_hasDiffusion
flag to determine whether or not to apply diffusion
virtual void registerDataOnMesh(Group &meshBodies) override
Register wrappers that contain data on the mesh objects.
void applySourceFluxBC(real64 const time, real64 const dt, DofManager const &dofManager, DomainPartition &domain, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const
Apply source flux boundary conditions to the system.
virtual void initializePostInitialConditionsPreSubGroups() override
Called by InitializePostInitialConditions() prior to initializing sub-Groups.
real64 m_maxCompFracChange
maximum (absolute) change in a component fraction in a Newton iteration
real64 m_sequentialCompDensChange
maximum (absolute) component density change in a sequential iteration
real64 m_targetRelativeCompDensChange
target (relative) change in component density in a time step
virtual real64 setNextDtBasedOnStateChange(real64 const ¤tDt, DomainPartition &domain) override
function to set the next dt based on state change
void chopNegativeCompFractions(DomainPartition &domain)
Sets all the negative component fractions (if any) to zero.
CompositionalMultiphaseBase()=delete
deleted default constructor
integer m_allowCompDensChopping
flag indicating whether local (cell-wise) chopping of negative compositions is allowed
string m_referenceFluidModelName
name of the fluid constitutive model used as a reference for component/phase description
integer m_numComponents
the number of fluid components
CompositionalMultiphaseBase(CompositionalMultiphaseBase const &)=delete
deleted copy constructor
integer m_useTotalMassEquation
flag indicating whether total mass equation is used
virtual ~CompositionalMultiphaseBase() override=default
default destructor
void chopNegativeDensities(DomainPartition &domain)
Sets all the negative component densities (if any) to zero.
real64 m_maxRelativeCompDensChange
maximum (relative) change in component density in a Newton iteration
virtual void computeHydrostaticEquilibrium(DomainPartition &domain) override
Compute the hydrostatic equilibrium using the compositions and temperature input tables.
real64 m_minCompDens
minimum allowed global component density
CompositionalMultiphaseFormulationType m_formulationType
formulation type
CompositionalMultiphaseBase(const string &name, Group *const parent)
main constructor for Group Objects
integer m_numPhases
the max number of fluid phases
bool m_hasDispersion
flag to determine whether or not to apply dispersion
real64 m_targetRelativeTempChange
target (relative) change in temperature in a time step
void applyDirichletBC(real64 const time, real64 const dt, DofManager const &dofManager, DomainPartition &domain, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const
Function to perform the Application of Dirichlet type BC's.
CompositionalMultiphaseBase & operator=(CompositionalMultiphaseBase const &)=delete
deleted assignment operator
CompositionalMultiphaseBase & operator=(CompositionalMultiphaseBase &&)=delete
deleted move operator
The DoFManager is responsible for allocating global dofs, constructing sparsity patterns,...
globalIndex rankOffset(string const &fieldName) const
string const & getKey(string const &fieldName) const
Return the key used to record the field in the DofManager.
Partition of the decomposed physical domain. It also manages the connexion information to its neighbo...
integer m_isThermal
flag to determine whether or not this is a thermal simulation
Class facilitating the representation of a multi-level discretization of a MeshBody.
The ObjectManagerBase is the base object of all object managers in the mesh data hierachy.
virtual string getCatalogName() const =0
DataContext const & getDataContext() const
virtual void resetStateToBeginningOfStep(DomainPartition &domain) override
reset state of physics back to the beginning of the step.
virtual void implicitStepSetup(real64 const &time_n, real64 const &dt, DomainPartition &domain) override
function to perform setup for implicit timestep
real64 updatePhaseVolumeFraction(ObjectManagerBase &dataGroup) const
Recompute phase volume fractions (saturations) from constitutive and primary variables.
virtual units::Unit getMassUnit() const override
virtual void assembleSystem(real64 const time_n, real64 const dt, DomainPartition &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) override
function to assemble the linear system matrix and rhs
virtual void assembleStabilizedFluxTerms(real64 const dt, DomainPartition const &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const =0
assembles the flux terms for all cells with pressure jump stabilization
virtual void saveSequentialIterationState(DomainPartition &domain) override final
Utility function to save the iteration state (useful for sequential simulations)
virtual void implicitStepComplete(real64 const &time, real64 const &dt, DomainPartition &domain) override
perform cleanup for implicit timestep
integer numFluidComponents() const
Getter for the number of fluid components (species)
virtual void applyBoundaryConditions(real64 const time_n, real64 const dt, DomainPartition &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) override
apply boundary condition to system
virtual void assembleFluxTerms(real64 const dt, DomainPartition const &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const =0
assembles the flux terms for all cells
void updateFluidModel(ObjectManagerBase &dataGroup) const
Update all relevant fluid models using current values of pressure and composition.
virtual void updatePhaseMobility(ObjectManagerBase &dataGroup) const =0
Recompute phase mobility from constitutive and primary variables.
void updateRelPermModel(ObjectManagerBase &dataGroup) const
Update all relevant relperm models using current values of phase volume fraction.
virtual void updateState(DomainPartition &domain) override final
Recompute all dependent quantities from primary variables (including constitutive models)
void assembleLocalTerms(DomainPartition &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const
assembles the accumulation other local terms for all cells
void updateCapPressureModel(ObjectManagerBase &dataGroup) const
Update all relevant capillary pressure models using current values of phase volume fraction.
void updateEnergy(ElementSubRegionBase &subRegion) const
Update energy.
void updateSolidInternalEnergyModel(ObjectManagerBase &dataGroup) const
Update all relevant solid internal energy models using current values of temperature.
string referenceFluidModelName() const
Getter for the name of the reference fluid model name.
virtual void saveConvergedState(ElementSubRegionBase &subRegion) const override final
Utility function to save the converged state.
void updateCompAmount(ElementSubRegionBase &subRegion) const
Update components mass/moles.
void accumulationAssemblyLaunch(DofManager const &dofManager, SUBREGION_TYPE const &subRegion, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) const
assembles the accumulation terms for all cells of a spcefici subRegion.
integer numFluidPhases() const
Getter for the number of fluid phases.
void updateGlobalComponentFraction(ObjectManagerBase &dataGroup) const
Recompute global component fractions from primary variables (component densities)
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
stdVector< string > string_array
A 1-dimensional array of geos::string types.
double real64
64-bit floating point type.
LvArray::CRSMatrixView< T, COL_INDEX, INDEX_TYPE const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
CompositionalMultiphaseFormulationType
Options for flow formulation.
@ OverallComposition
use overall composition (z_c) as primary variables
@ ComponentDensities
use component densities as primary variables
int integer
Signed integer type.
ENUM_STRINGS(LinearSolverParameters::SolverType, "direct", "cg", "gmres", "fgmres", "bicgstab", "richardson", "preconditioner")
Declare strings associated with enumeration values.