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 * isThermalString() { return "isThermal"; }
77  static constexpr char const * inputTemperatureString() { return "temperature"; }
78  static constexpr char const * allowNegativePressureString() { return "allowNegativePressure"; }
79  static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; }
80  static constexpr char const * maxSequentialPresChangeString() { return "maxSequentialPressureChange"; }
81  static constexpr char const * maxSequentialTempChangeString() { return "maxSequentialTemperatureChange"; }
82 
83  static constexpr char const * fluidNamesString() { return "fluidNames"; }
84  static constexpr char const * solidNamesString() { return "solidNames"; }
85  static constexpr char const * permeabilityNamesString() { return "permeabilityNames"; }
86  static constexpr char const * solidInternalEnergyNamesString() { return "solidInternalEnergyNames"; }
87  static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; }
88  };
89 
95  void prepareStencilWeights( DomainPartition & domain ) const;
96 
102  void updateStencilWeights( DomainPartition & domain ) const;
103 
104  void enableFixedStressPoromechanicsUpdate() { m_isFixedStressPoromechanicsUpdate = true; }
105 
106  void enableJumpStabilization() { m_isJumpStabilized = true; }
107 
108  void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const;
109 
110  virtual void updatePorosityAndPermeability( SurfaceElementSubRegion & subRegion ) const;
111 
116  virtual void saveSequentialIterationState( DomainPartition & domain ) override;
117 
118  integer & isThermal() { return m_isThermal; }
119 
123  virtual units::Unit getMassUnit() const { return units::Unit::Mass; }
124 
129 
135  void setKeepVariablesConstantDuringInitStep( bool const keepVariablesConstantDuringInitStep )
136  { m_keepVariablesConstantDuringInitStep = keepVariablesConstantDuringInitStep; }
137 
138  virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const override;
139 
140  void enableLaggingFractureStencilWeightsUpdate(){ m_isLaggingFractureStencilWeightsUpdate = 1; };
141 
142  real64 sumAquiferFluxes( BoundaryStencil const & stencil,
143  AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper,
144  ElementViewConst< arrayView1d< real64 const > > const & pres,
145  ElementViewConst< arrayView1d< real64 const > > const & presOld,
146  ElementViewConst< arrayView1d< real64 const > > const & gravCoef,
147  real64 const & timeAtBeginningOfStep,
148  real64 const & dt );
149 
160  virtual void assembleHydrofracFluxTerms( real64 const time_n,
161  real64 const dt,
162  DomainPartition const & domain,
163  DofManager const & dofManager,
164  CRSMatrixView< real64, globalIndex const > const & localMatrix,
165  arrayView1d< real64 > const & localRhs,
167  {
168  GEOS_UNUSED_VAR ( time_n, dt, domain, dofManager, localMatrix, localRhs, dR_dAper );
169  GEOS_ERROR( "Poroelastic fluxes with conforming fractures not yet implemented." );
170  }
171 
172  void initializeState( DomainPartition & domain );
173 
174  virtual void initializeFluidState( MeshLevel & mesh, string_array const & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); }
175 
176  virtual void initializeThermalState( MeshLevel & mesh, string_array const & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); }
177 
185  void findMinMaxElevationInEquilibriumTarget( DomainPartition & domain, // cannot be const...
186  std::map< string, localIndex > const & equilNameToEquilId,
187  arrayView1d< real64 > const & maxElevation,
188  arrayView1d< real64 > const & minElevation ) const;
189 
199  real64 const & dt,
200  DomainPartition & domain, // cannot be const...
201  std::map< string, localIndex > const & bcNameToBcId,
202  arrayView1d< globalIndex > const & bcAllSetsSize ) const;
203 
204  integer numberOfDofsPerCell() const { return m_numDofPerCell; }
205 
206 protected:
207 
217  virtual void saveAquiferConvergedState( real64 const & time,
218  real64 const & dt,
219  DomainPartition & domain );
220 
225  virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const;
226 
231  virtual void validatePoreVolumes( DomainPartition const & domain ) const;
232 
233  virtual void precomputeData( MeshLevel & mesh,
234  string_array const & regionNames );
235 
236  virtual void initializePreSubGroups() override;
237 
238  void checkDiscretizationName() const;
239 
241 
242  virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) { GEOS_UNUSED_VAR( domain ); }
243 
244  void initializePorosityAndPermeability( MeshLevel & mesh, string_array const & regionNames );
245 
246  void initializeHydraulicAperture( MeshLevel & mesh, string_array const & regionNames );
247 
248  void saveInitialPressureAndTemperature( MeshLevel & mesh, string_array const & regionNames );
249 
250  virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override;
251 
254 
257 
260 
263 
266 
269 
272 
275 
278  real64 m_maxSequentialPresChange;
279 
282  real64 m_maxSequentialTempChange;
283 
287  class BCMessage
288  {
289 public:
290  static string pressureConflict( string_view regionName, string_view subRegionName,
291  string_view setName, string_view fieldName );
292 
293  static string temperatureConflict( string_view regionName, string_view subRegionName,
294  string_view setName, string_view fieldName );
295 
296  static string missingPressure( string_view regionName, string_view subRegionName,
297  string_view setName, string_view fieldName );
298 
299  static string missingTemperature( string_view regionName, string_view subRegionName,
300  string_view setName, string_view fieldName );
301 
302  static string conflictingComposition( int comp, string_view componentName,
303  string_view regionName, string_view subRegionName,
304  string_view setName, string_view fieldName );
305 
306  static string invalidComponentIndex( int comp,
307  string_view fsName, string_view fieldName );
308 
309  static string notAppliedOnRegion( int componentIndex, string_view componentName,
310  string_view regionName, string_view subRegionName,
311  string_view setName, string_view fieldName );
312 private:
313  static string generateMessage( string_view baseMessage,
314  string_view fieldName, string_view setName );
315  };
316 
317 private:
318  virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override;
319 
320  // flag to determine whether or not to apply lagging update for the fracture stencil weights
321  integer m_isLaggingFractureStencilWeightsUpdate;
322 
323 };
324 
325 
326 }
327 
328 #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 for given physical scales. Units are in SI by default.
Definition: Units.hpp:59
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.
bool m_keepVariablesConstantDuringInitStep
flag to freeze the initial state during initialization in coupled problems
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
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:188
stdVector< string > string_array
A 1-dimensional array of geos::string types.
Definition: DataTypes.hpp:401
LvArray::CRSMatrixView< T, COL_INDEX, localIndex const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:318
double real64
64-bit floating point type.
Definition: DataTypes.hpp:98
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:81
std::string_view string_view
String type.
Definition: DataTypes.hpp:93
Structure to hold scoped key names.