GEOS
FlowSolverBase.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 TotalEnergies
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
20 #ifndef GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_
21 #define GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_
22 
24 #include "common/Units.hpp"
27 
28 namespace geos
29 {
30 
38 {
39  template< typename VIEWTYPE >
41 
42 public:
43 
45  static string coupledSolverAttributePrefix() { return "flow"; }
46 
52  FlowSolverBase( const string & name,
53  Group * const parent );
54 
55 
57  FlowSolverBase() = delete;
58 
60  FlowSolverBase( FlowSolverBase const & ) = delete;
61 
63  FlowSolverBase( FlowSolverBase && ) = default;
64 
66  FlowSolverBase & operator=( FlowSolverBase const & ) = delete;
67 
70 
71  virtual void registerDataOnMesh( Group & MeshBodies ) override;
72 
74  {
75  // misc inputs
76  static constexpr char const * fluidNamesString() { return "fluidNames"; }
77  static constexpr char const * solidNamesString() { return "solidNames"; }
78  static constexpr char const * permeabilityNamesString() { return "permeabilityNames"; }
79  static constexpr char const * isThermalString() { return "isThermal"; }
80  static constexpr char const * inputTemperatureString() { return "temperature"; }
81  static constexpr char const * solidInternalEnergyNamesString() { return "solidInternalEnergyNames"; }
82  static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; }
83  static constexpr char const * allowNegativePressureString() { return "allowNegativePressure"; }
84  static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; }
85  static constexpr char const * maxSequentialPresChangeString() { return "maxSequentialPressureChange"; }
86  static constexpr char const * maxSequentialTempChangeString() { return "maxSequentialTemperatureChange"; }
87  };
88 
94  void prepareStencilWeights( DomainPartition & domain ) const;
95 
101  void updateStencilWeights( DomainPartition & domain ) const;
102 
103  void enableFixedStressPoromechanicsUpdate() { m_isFixedStressPoromechanicsUpdate = true; }
104 
105  void enableJumpStabilization() { m_isJumpStabilized = true; }
106 
107  void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const;
108 
109  virtual void updatePorosityAndPermeability( SurfaceElementSubRegion & subRegion ) const;
110 
115  virtual void saveSequentialIterationState( DomainPartition & domain ) override;
116 
117  integer & isThermal() { return m_isThermal; }
118 
122  virtual units::Unit getMassUnit() const { return units::Unit::Mass; }
123 
128 
134  void setKeepVariablesConstantDuringInitStep( bool const keepVariablesConstantDuringInitStep )
135  { m_keepVariablesConstantDuringInitStep = keepVariablesConstantDuringInitStep; }
136 
137  virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const override;
138 
139  void enableLaggingFractureStencilWeightsUpdate(){ m_isLaggingFractureStencilWeightsUpdate = 1; };
140 
141  real64 sumAquiferFluxes( BoundaryStencil const & stencil,
142  AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper,
143  ElementViewConst< arrayView1d< real64 const > > const & pres,
144  ElementViewConst< arrayView1d< real64 const > > const & presOld,
145  ElementViewConst< arrayView1d< real64 const > > const & gravCoef,
146  real64 const & timeAtBeginningOfStep,
147  real64 const & dt );
148 
149  virtual void initializeFluidState( MeshLevel & mesh, const arrayView1d< const string > & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); }
150 
151  virtual void initializeThermalState( MeshLevel & mesh, const arrayView1d< const string > & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); }
152 
160  void findMinMaxElevationInEquilibriumTarget( DomainPartition & domain, // cannot be const...
161  std::map< string, localIndex > const & equilNameToEquilId,
162  arrayView1d< real64 > const & maxElevation,
163  arrayView1d< real64 > const & minElevation ) const;
164 
174  real64 const & dt,
175  DomainPartition & domain, // cannot be const...
176  std::map< string, localIndex > const & bcNameToBcId,
177  arrayView1d< globalIndex > const & bcAllSetsSize ) const;
178 
179 protected:
180 
190  virtual void saveAquiferConvergedState( real64 const & time,
191  real64 const & dt,
192  DomainPartition & domain );
193 
198  virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const;
199 
204  virtual void validatePoreVolumes( DomainPartition const & domain ) const;
205 
206  virtual void precomputeData( MeshLevel & mesh,
207  arrayView1d< string const > const & regionNames );
208 
209  virtual void initializePreSubGroups() override;
210 
212 
213  void initializeState( DomainPartition & domain );
214 
215  virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) { GEOS_UNUSED_VAR( domain ); }
216 
217  void initializePorosityAndPermeability( MeshLevel & mesh, arrayView1d< string const > const & regionNames );
218 
219  void initializeHydraulicAperture( MeshLevel & mesh, const arrayView1d< const string > & regionNames );
220 
221  void saveInitialPressureAndTemperature( MeshLevel & mesh, const arrayView1d< const string > & regionNames );
222 
223  virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override;
224 
227 
230 
233 
236 
239 
242 
245 
248 
251  real64 m_maxSequentialPresChange;
252 
255  real64 m_maxSequentialTempChange;
256 
260  class BCMessage
261  {
262 public:
263  static string pressureConflict( string_view regionName, string_view subRegionName,
264  string_view setName, string_view fieldName );
265 
266  static string temperatureConflict( string_view regionName, string_view subRegionName,
267  string_view setName, string_view fieldName );
268 
269  static string missingPressure( string_view regionName, string_view subRegionName,
270  string_view setName, string_view fieldName );
271 
272  static string missingTemperature( string_view regionName, string_view subRegionName,
273  string_view setName, string_view fieldName );
274 
275  static string conflictingComposition( int comp, string_view componentName,
276  string_view regionName, string_view subRegionName,
277  string_view setName, string_view fieldName );
278 
279  static string invalidComponentIndex( int comp,
280  string_view fsName, string_view fieldName );
281 
282  static string notAppliedOnRegion( int componentIndex, string_view componentName,
283  string_view regionName, string_view subRegionName,
284  string_view setName, string_view fieldName );
285 private:
286  static string generateMessage( string_view baseMessage,
287  string_view fieldName, string_view setName );
288 
289  BCMessage();
290  };
291 
292 private:
293  virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override;
294 
295  // flag to determine whether or not to apply lagging update for the fracture stencil weights
296  integer m_isLaggingFractureStencilWeightsUpdate;
297 
298 };
299 
300 
301 }
302 
303 #endif //GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
Definition: GeosxMacros.hpp:84
Enumerates the Units that are in use in GEOS and regroups useful conversion and formatting functions.
Unit
Enumerator of available unit types. Units are in SI by default.
Definition: Units.hpp:54
Provides management of the boundary stencil points (stencils used to prescribe boundary conditions on...
Partition of the decomposed physical domain. It also manages the connexion information to its neighbo...
typename ElementViewAccessor< VIEWTYPE >::NestedViewTypeConst ElementViewConst
The ElementViewAccessor at the ElementRegionManager level is the type resulting from ElementViewAcces...
Class used for displaying boundary warning message.
virtual void saveSequentialIterationState(DomainPartition &domain) override
Utility function to save the iteration state (useful for sequential simulations)
virtual void initializePostInitialConditionsPreSubGroups() override
Called by InitializePostInitialConditions() prior to initializing sub-Groups.
virtual void validatePoreVolumes(DomainPartition const &domain) const
Helper function to compute/report the elements with small pore volumes.
virtual units::Unit getMassUnit() const
virtual void registerDataOnMesh(Group &MeshBodies) override
Register wrappers that contain data on the mesh objects.
FlowSolverBase(FlowSolverBase &&)=default
default move constructor
integer m_keepVariablesConstantDuringInitStep
flag to freeze the initial state during initialization in coupled problems
FlowSolverBase & operator=(FlowSolverBase const &)=delete
deleted assignment operator
real64 m_sequentialPresChange
maximum (absolute) pressure change in a sequential iteration
void updateStencilWeights(DomainPartition &domain) const
Update the stencil weights by adding the contribution of the hydraulic aperture after the aperture is...
void computeSourceFluxSizeScalingFactor(real64 const &time, real64 const &dt, DomainPartition &domain, std::map< string, localIndex > const &bcNameToBcId, arrayView1d< globalIndex > const &bcAllSetsSize) const
For each source flux boundary condition, loop over all the target cells and sum the owned cells.
bool m_isFixedStressPoromechanicsUpdate
enable the fixed stress poromechanics update of porosity
void setKeepVariablesConstantDuringInitStep(bool const keepVariablesConstantDuringInitStep)
Utility function to keep the flow variables during a time step (used in poromechanics simulations)
FlowSolverBase & operator=(FlowSolverBase &&)=delete
deleted move operator
bool m_isJumpStabilized
enable pressure jump stabilzation for fixed-stress poromechanics
void prepareStencilWeights(DomainPartition &domain) const
Prepare the stencil weights by removing the contribution of the hydraulic aperture before the apertur...
FlowSolverBase(const string &name, Group *const parent)
main constructor for Group Objects
void findMinMaxElevationInEquilibriumTarget(DomainPartition &domain, std::map< string, localIndex > const &equilNameToEquilId, arrayView1d< real64 > const &maxElevation, arrayView1d< real64 > const &minElevation) const
For each equilibrium initial condition, loop over all the target cells and compute the min/max elevat...
virtual void setConstitutiveNamesCallSuper(ElementSubRegionBase &subRegion) const override
This function sets constitutive name fields on an ElementSubRegionBase, and calls the base function i...
FlowSolverBase(FlowSolverBase const &)=delete
deleted copy constructor
virtual void initializePreSubGroups() override
Called by Initialize() prior to initializing sub-Groups.
static string coupledSolverAttributePrefix()
String used to form the solverName used to register single-physics solvers in CoupledSolver.
integer m_allowNegativePressure
flag if negative pressure is allowed
integer m_isThermal
flag to determine whether or not this is a thermal simulation
real64 m_maxAbsolutePresChange
maximum (absolute) pressure change in a Newton iteration
virtual bool checkSequentialSolutionIncrements(DomainPartition &domain) const override
Check if the solution increments are ok to use.
void allowNegativePressure()
Function to activate the flag allowing negative pressure.
real64 m_sequentialTempChange
maximum (absolute) temperature change in a sequential iteration
FlowSolverBase()=delete
deleted default constructor
integer m_numDofPerCell
the number of Degrees of Freedom per cell
virtual void saveAquiferConvergedState(real64 const &time, real64 const &dt, DomainPartition &domain)
Increment the cumulative flux from each aquifer.
virtual void saveConvergedState(ElementSubRegionBase &subRegion) const
Utility function to save the converged state.
real64 m_inputTemperature
the input temperature
Class facilitating the representation of a multi-level discretization of a MeshBody.
Definition: MeshLevel.hpp:42
Base class for all physics solvers.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:180
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
std::string_view string_view
String type.
Definition: DataTypes.hpp:94
Structure to hold scoped key names.