GEOS
SinglePhaseWell.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_FLUIDFLOW_WELLS_SINGLEPHASEWELL_HPP_
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_SINGLEPHASEWELL_HPP_
22 
23 #include "WellSolverBase.hpp"
24 
25 #include "constitutive/fluid/singlefluid/SingleFluidLayouts.hpp"
26 
27 namespace geos
28 {
29 
30 namespace dataRepository
31 {
32 class Group;
33 }
34 
35 namespace constitutive
36 {
37 class SingleFluidBase;
38 }
39 class WellElementSubRegion;
40 
47 {
48 public:
49 
50  using DerivOffset = constitutive::singlefluid::DerivativeOffsetC< 1 >;
56  SinglePhaseWell( const string & name,
57  Group * const parent );
58 
60  SinglePhaseWell() = delete;
61 
63  SinglePhaseWell( SinglePhaseWell const & ) = delete;
64 
67 
69  SinglePhaseWell & operator=( SinglePhaseWell const & ) = delete;
70 
73 
77  virtual ~SinglePhaseWell() override = default;
78 
83  static string catalogName() { return "SinglePhaseWell"; }
87  string getCatalogName() const override { return catalogName(); }
88 
89  virtual void registerDataOnMesh( Group & meshBodies ) override;
90 
98  virtual real64
99  calculateResidualNorm( real64 const & time_n,
100  real64 const & dt,
101  DomainPartition const & domain,
102  DofManager const & dofManager,
103  arrayView1d< real64 const > const & localRhs ) override;
104 
105  virtual bool
107  DofManager const & dofManager,
108  arrayView1d< real64 const > const & localSolution,
109  real64 const scalingFactor ) override;
110 
111  virtual void
112  applySystemSolution( DofManager const & dofManager,
113  arrayView1d< real64 const > const & localSolution,
114  real64 const scalingFactor,
115  real64 const dt,
116  DomainPartition & domain ) override;
117 
118  virtual void
120 
121  virtual void
122  implicitStepSetup( real64 const & time,
123  real64 const & dt,
124  DomainPartition & domain ) override;
125 
126  virtual void
128  real64 const & dt,
129  DomainPartition & domain ) override;
130 
133  virtual string wellElementDofName() const override { return viewKeyStruct::dofFieldString(); }
134 
135  virtual string resElementDofName() const override;
136 
137  virtual localIndex numFluidComponents() const override { return 1; }
138 
139  virtual localIndex numFluidPhases() const override { return 1; }
140 
146  virtual void updateVolRateForConstraint( ElementRegionManager const & elemManager, WellElementSubRegion & subRegion );
147 
152  virtual void updateBHPForConstraint( WellElementSubRegion & subRegion );
153 
158  virtual void updateFluidModel( WellElementSubRegion & subRegion ) const;
159 
164  virtual void computePerforationRates( real64 const & time_n,
165  real64 const & dt, DomainPartition & domain ) override;
166 
172  virtual real64 updateSubRegionState( ElementRegionManager const & elemManager, WellElementSubRegion & subRegion ) override;
173 
183  virtual void assembleSystem( real64 const time,
184  real64 const dt,
185  DomainPartition & domain,
186  DofManager const & dofManager,
187  CRSMatrixView< real64, globalIndex const > const & localMatrix,
188  arrayView1d< real64 > const & localRhs ) override;
189 
199  virtual void assembleFluxTerms( real64 const & time_n,
200  real64 const & dt,
201  DomainPartition & domain,
202  DofManager const & dofManager,
203  CRSMatrixView< real64, globalIndex const > const & localMatrix,
204  arrayView1d< real64 > const & localRhs ) override;
205 
213  virtual void assembleAccumulationTerms( real64 const & time_n,
214  real64 const & dt, DomainPartition & domain,
215  DofManager const & dofManager,
216  CRSMatrixView< real64, globalIndex const > const & localMatrix,
217  arrayView1d< real64 > const & localRhs ) override;
218 
227  DofManager const & dofManager,
228  CRSMatrixView< real64, globalIndex const > const & localMatrix,
229  arrayView1d< real64 > const & localRhs );
230 
240  virtual void assemblePressureRelations( real64 const & time_n,
241  real64 const & dt,
242  DomainPartition const & domain,
243  DofManager const & dofManager,
244  CRSMatrixView< real64, globalIndex const > const & localMatrix,
245  arrayView1d< real64 > const & localRhs ) override;
246 
247  /*
248  * @brief apply a special treatment to the wells that are shut
249  * @param time_n the time at the previous converged time step
250  * @param domain the physical domain object
251  * @param dofManager degree-of-freedom manager associated with the linear system
252  * @param matrix the system matrix
253  * @param rhs the system right-hand side vector
254  */
255  void shutDownWell( real64 const time_n,
256  DomainPartition const & domain,
257  DofManager const & dofManager,
258  CRSMatrixView< real64, globalIndex const > const & localMatrix,
259  arrayView1d< real64 > const & localRhs );
261  {
262  static constexpr char const * dofFieldString() { return "singlePhaseWellVars"; }
263 
264  // control data (not registered on the mesh)
265  static constexpr char const * currentBHPString() { return "currentBHP"; }
266  static constexpr char const * dCurrentBHPString() { return "dCurrentBHP"; }
267  static constexpr char const * currentVolRateString() { return "currentVolumetricRate"; }
268  static constexpr char const * dCurrentVolRateString() { return "dCurrentVolRate"; }
269  };
270 
271 protected:
272 
273  void printRates( real64 const & time_n,
274  real64 const & dt,
275  DomainPartition & domain ) override;
276 
279 
280 private:
281 
282  virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override;
283 
288  void initializeWells( DomainPartition & domain, real64 const & time_n ) override;
289 
296  virtual void validateWellConstraints( real64 const & time_n,
297  real64 const & dt,
298  WellElementSubRegion const & subRegion ) override;
299 
300 };
301 
302 } // namespace geos
303 
304 
305 #endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_SINGLEPHASEWELL_HPP_
The DoFManager is responsible for allocating global dofs, constructing sparsity patterns,...
Definition: DofManager.hpp:45
Partition of the decomposed physical domain. It also manages the connexion information to its neighbo...
The ElementRegionManager class provides an interface to ObjectManagerBase in order to manage ElementR...
virtual real64 updateSubRegionState(ElementRegionManager const &elemManager, WellElementSubRegion &subRegion) override
Recompute all dependent quantities from primary variables (including constitutive models)
void assembleVolumeBalanceTerms(DomainPartition const &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs)
assembles the volume balance terms for all well elements
virtual string resElementDofName() const override
get the name of DOF defined on well elements
virtual void assembleSystem(real64 const time, 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 string wellElementDofName() const override
get the name of DOF defined on well elements
SinglePhaseWell(const string &name, Group *const parent)
main constructor for Group Objects
virtual ~SinglePhaseWell() override=default
default destructor
virtual void assemblePressureRelations(real64 const &time_n, real64 const &dt, DomainPartition const &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) override
assembles the pressure relations at all connections between well elements except at the well head
static string catalogName()
name of the node manager in the object catalog
SinglePhaseWell & operator=(SinglePhaseWell const &)=delete
deleted assignment operator
SinglePhaseWell(SinglePhaseWell const &)=delete
deleted copy constructor
virtual void updateFluidModel(WellElementSubRegion &subRegion) const
Update fluid constitutive model state.
SinglePhaseWell(SinglePhaseWell &&)=default
default move constructor
integer m_allowNegativePressure
flag if negative pressure is allowed
virtual void assembleFluxTerms(real64 const &time_n, real64 const &dt, DomainPartition &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) override
assembles the flux terms for all connections between well elements
virtual localIndex numFluidComponents() const override
const getter for the number of fluid components
virtual void assembleAccumulationTerms(real64 const &time_n, real64 const &dt, DomainPartition &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) override
assembles the accumulation term for all the well elements
virtual void registerDataOnMesh(Group &meshBodies) override
Register wrappers that contain data on the mesh objects.
virtual void updateVolRateForConstraint(ElementRegionManager const &elemManager, WellElementSubRegion &subRegion)
Recompute the volumetric rate that are used in the well constraints.
SinglePhaseWell & operator=(SinglePhaseWell &&)=delete
deleted move operator
string getCatalogName() const override
virtual void computePerforationRates(real64 const &time_n, real64 const &dt, DomainPartition &domain) override
Recompute the perforation rates for all the wells.
virtual localIndex numFluidPhases() const override
Get the number of fluid phases.
virtual void updateBHPForConstraint(WellElementSubRegion &subRegion)
Recompute the BHP pressure that is used in the well constraints.
SinglePhaseWell()=delete
deleted default constructor
This class describes a collection of local well elements and perforations.
virtual void implicitStepComplete(real64 const &time, real64 const &dt, DomainPartition &domain) override
perform cleanup for implicit timestep
virtual void resetStateToBeginningOfStep(DomainPartition &domain) override
reset state of physics back to the beginning of the step.
virtual void implicitStepSetup(real64 const &time, real64 const &dt, DomainPartition &domain) override
function to perform setup for implicit timestep
virtual void applySystemSolution(DofManager const &dofManager, arrayView1d< real64 const > const &localSolution, real64 const scalingFactor, real64 const dt, DomainPartition &domain) override
Function to apply the solution vector to the state.
virtual real64 calculateResidualNorm(real64 const &time_n, real64 const &dt, DomainPartition const &domain, DofManager const &dofManager, arrayView1d< real64 const > const &localRhs) override
calculate the norm of the global system residual
virtual bool checkSystemSolution(DomainPartition &domain, DofManager const &dofManager, arrayView1d< real64 const > const &localSolution, real64 const scalingFactor) override
Function to check system solution for physical consistency and constraint violation.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:179
double real64
64-bit floating point type.
Definition: DataTypes.hpp:98
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:84
LvArray::CRSMatrixView< T, COL_INDEX, INDEX_TYPE const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:309
int integer
Signed integer type.
Definition: DataTypes.hpp:81