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 
159  virtual void assembleHydrofracFluxTerms( real64 const time_n,
160  real64 const dt,
161  DomainPartition const & domain,
162  DofManager const & dofManager,
163  CRSMatrixView< real64, globalIndex const > const & localMatrix,
164  arrayView1d< real64 > const & localRhs,
166  {
167  GEOS_UNUSED_VAR ( time_n, dt, domain, dofManager, localMatrix, localRhs, dR_dAper );
168  GEOS_ERROR( "Poroelastic fluxes with conforming fractures not yet implemented." );
169  }
170 
171  virtual void initializeFluidState( MeshLevel & mesh, string_array const & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); }
172 
173  virtual void initializeThermalState( MeshLevel & mesh, string_array const & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); }
174 
182  void findMinMaxElevationInEquilibriumTarget( DomainPartition & domain, // cannot be const...
183  std::map< string, localIndex > const & equilNameToEquilId,
184  arrayView1d< real64 > const & maxElevation,
185  arrayView1d< real64 > const & minElevation ) const;
186 
196  real64 const & dt,
197  DomainPartition & domain, // cannot be const...
198  std::map< string, localIndex > const & bcNameToBcId,
199  arrayView1d< globalIndex > const & bcAllSetsSize ) const;
200 
201  integer numberOfDofsPerCell() const { return m_numDofPerCell; }
202 
203 protected:
204 
214  virtual void saveAquiferConvergedState( real64 const & time,
215  real64 const & dt,
216  DomainPartition & domain );
217 
222  virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const;
223 
228  virtual void validatePoreVolumes( DomainPartition const & domain ) const;
229 
230  virtual void precomputeData( MeshLevel & mesh,
231  string_array const & regionNames );
232 
233  virtual void initializePreSubGroups() override;
234 
235  void checkDiscretizationName() const;
236 
238 
239  void initializeState( DomainPartition & domain );
240 
241  virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) { GEOS_UNUSED_VAR( domain ); }
242 
243  void initializePorosityAndPermeability( MeshLevel & mesh, string_array const & regionNames );
244 
245  void initializeHydraulicAperture( MeshLevel & mesh, string_array const & regionNames );
246 
247  void saveInitialPressureAndTemperature( MeshLevel & mesh, string_array const & regionNames );
248 
249  virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override;
250 
253 
256 
259 
262 
265 
268 
271 
274 
277  real64 m_maxSequentialPresChange;
278 
281  real64 m_maxSequentialTempChange;
282 
286  class BCMessage
287  {
288 public:
289  static string pressureConflict( string_view regionName, string_view subRegionName,
290  string_view setName, string_view fieldName );
291 
292  static string temperatureConflict( string_view regionName, string_view subRegionName,
293  string_view setName, string_view fieldName );
294 
295  static string missingPressure( string_view regionName, string_view subRegionName,
296  string_view setName, string_view fieldName );
297 
298  static string missingTemperature( string_view regionName, string_view subRegionName,
299  string_view setName, string_view fieldName );
300 
301  static string conflictingComposition( int comp, string_view componentName,
302  string_view regionName, string_view subRegionName,
303  string_view setName, string_view fieldName );
304 
305  static string invalidComponentIndex( int comp,
306  string_view fsName, string_view fieldName );
307 
308  static string notAppliedOnRegion( int componentIndex, string_view componentName,
309  string_view regionName, string_view subRegionName,
310  string_view setName, string_view fieldName );
311 private:
312  static string generateMessage( string_view baseMessage,
313  string_view fieldName, string_view setName );
314 
315  BCMessage();
316  };
317 
318 private:
319  virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override;
320 
321  // flag to determine whether or not to apply lagging update for the fracture stencil weights
322  integer m_isLaggingFractureStencilWeightsUpdate;
323 
324 };
325 
326 
327 }
328 
329 #endif //GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
Definition: GeosxMacros.hpp:84
#define GEOS_ERROR(msg)
Raise a hard error and terminate the program.
Definition: Logger.hpp:157
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:56
Provides management of the boundary stencil points (stencils used to prescribe boundary conditions on...
The DoFManager is responsible for allocating global dofs, constructing sparsity patterns,...
Definition: DofManager.hpp:44
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 assembleHydrofracFluxTerms(real64 const time_n, real64 const dt, DomainPartition const &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs, CRSMatrixView< real64, localIndex const > const &dR_dAper)
assembles the flux terms for all cells for the hydrofracture case
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
LvArray::CRSMatrixView< T, COL_INDEX, localIndex const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:310
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
std::vector< string > string_array
A 1-dimensional array of geos::string types.
Definition: DataTypes.hpp:393
std::string_view string_view
String type.
Definition: DataTypes.hpp:94
Structure to hold scoped key names.