GEOS
CompositionalMultiphaseWell.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_COMPOSITIONALMULTIPHASEWELL_HPP_
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_COMPOSITIONALMULTIPHASEWELL_HPP_
22 
23 #include "constitutive/fluid/multifluid/Layouts.hpp"
24 #include "constitutive/relativePermeability/Layouts.hpp"
27 
28 namespace geos
29 {
30 
31 namespace constitutive
32 {
33 class ConstitutiveManager;
34 class MultiFluidBase;
35 }
36 
43 {
44 public:
45 
51  CompositionalMultiphaseWell( const string & name,
52  Group * const parent );
53 
56 
59 
62 
65 
68 
72  virtual ~CompositionalMultiphaseWell() override = default;
73 
78  static string catalogName() { return "CompositionalMultiphaseWell"; }
82  string getCatalogName() const override { return catalogName(); }
83 
84  virtual void registerDataOnMesh( Group & meshBodies ) override;
85 
86 
95  virtual real64
96  calculateResidualNorm( real64 const & time_n,
97  real64 const & dt,
98  DomainPartition const & domain,
99  DofManager const & dofManager,
100  arrayView1d< real64 const > const & localRhs ) override;
101 
102  virtual real64
104  DofManager const & dofManager,
105  arrayView1d< real64 const > const & localSolution ) override;
106 
107  virtual bool
109  DofManager const & dofManager,
110  arrayView1d< real64 const > const & localSolution,
111  real64 const scalingFactor ) override;
112 
113  virtual void
114  applySystemSolution( DofManager const & dofManager,
115  arrayView1d< real64 const > const & localSolution,
116  real64 const scalingFactor,
117  real64 const dt,
118  DomainPartition & domain ) override;
119 
120  virtual void
122 
123  virtual void
124  implicitStepSetup( real64 const & time,
125  real64 const & dt,
126  DomainPartition & domain ) override;
127 
128  virtual void
130  real64 const & dt,
131  DomainPartition & domain ) override;
132 
140 
147 
154 
161 
168 
173  void updateTotalMassDensity( WellElementSubRegion & subRegion ) const;
174 
179  virtual void computePerforationRates( real64 const & time_n,
180  real64 const & dt, DomainPartition & domain ) override;
181 
186  virtual void updateState( DomainPartition & domain ) override;
187 
188  virtual real64 updateSubRegionState( WellElementSubRegion & subRegion ) override;
189 
190  virtual string wellElementDofName() const override { return viewKeyStruct::dofFieldString(); }
191 
192  virtual string resElementDofName() const override { return CompositionalMultiphaseBase::viewKeyStruct::elemDofFieldString(); }
193 
194  virtual localIndex numFluidComponents() const override { return m_numComponents; }
195 
196  virtual localIndex numFluidPhases() const override { return m_numPhases; }
197 
198  integer useTotalMassEquation() const { return m_useTotalMassEquation; }
199 
210  virtual void assembleFluxTerms( real64 const & time_n,
211  real64 const & dt,
212  DomainPartition & domain,
213  DofManager const & dofManager,
214  CRSMatrixView< real64, globalIndex const > const & localMatrix,
215  arrayView1d< real64 > const & localRhs )override;
223  virtual void assembleAccumulationTerms( real64 const & time_n,
224  real64 const & dt,
225  DomainPartition & domain,
226  DofManager const & dofManager,
227  CRSMatrixView< real64, globalIndex const > const & localMatrix,
228  arrayView1d< real64 > const & localRhs ) override;
229 
239  virtual void assemblePressureRelations( real64 const & time_n,
240  real64 const & dt,
241  DomainPartition const & domain,
242  DofManager const & dofManager,
243  CRSMatrixView< real64, globalIndex const > const & localMatrix,
244  arrayView1d< real64 > const & localRhs ) override;
245 
251 
253  {
254  static constexpr char const * dofFieldString() { return "compositionalWellVars"; }
255 
256  // inputs
257 
258  static constexpr char const * useMassFlagString() { return CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString(); }
259 
260  static constexpr char const * useTotalMassEquationString() { return CompositionalMultiphaseBase::viewKeyStruct::useTotalMassEquationString(); }
261 
262  static constexpr char const * maxCompFracChangeString() { return CompositionalMultiphaseBase::viewKeyStruct::maxCompFracChangeString(); }
263 
264  static constexpr char const * maxRelativePresChangeString() { return "maxRelativePressureChange"; }
265 
266  static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; }
267 
268  static constexpr char const * maxRelativeCompDensChangeString() { return "maxRelativeCompDensChange"; }
269 
270  static constexpr char const * maxRelativeTempChangeString() { return "maxRelativeTemperatureChange"; }
271 
272  static constexpr char const * allowLocalCompDensChoppingString() { return CompositionalMultiphaseBase::viewKeyStruct::allowLocalCompDensChoppingString(); }
273 
274  // control data (not registered on the mesh)
275 
276  static constexpr char const * massDensityString() { return "massDensity";}
277 
278  static constexpr char const * currentBHPString() { return "currentBHP"; }
279  static constexpr char const * dCurrentBHPString() { return "dCurrentBHP"; }
280 
281  static constexpr char const * dCurrentBHP_dPresString() { return "dCurrentBHP_dPres"; }
282  static constexpr char const * dCurrentBHP_dCompDensString() { return "dCurrentBHP_dCompDens"; }
283 
284  static constexpr char const * currentPhaseVolRateString() { return "currentPhaseVolumetricRate"; }
285  static constexpr char const * dCurrentPhaseVolRateString() { return "dCurrentPhaseVolumetricRate"; }
286 
287 
288  static constexpr char const * dCurrentPhaseVolRate_dPresString() { return "dCurrentPhaseVolumetricRate_dPres"; }
289 
290  static constexpr char const * dCurrentPhaseVolRate_dCompDensString() { return "dCurrentPhaseVolumetricRate_dCompDens"; }
291 
292  static constexpr char const * dCurrentPhaseVolRate_dRateString() { return "dCurrentPhaseVolumetricRate_dRate"; }
293 
294  static constexpr char const * currentTotalVolRateString() { return "currentTotalVolumetricRate"; }
295  static constexpr char const * dCurrentTotalVolRateString() { return "dCurrentTotalVolumetricRate"; }
296 
297  static constexpr char const * currentMassRateString() { return "currentMassRate"; }
298 
299  static constexpr char const * dCurrentTotalVolRate_dPresString() { return "dCurrentTotalVolumetricRate_dPres"; }
300 
301  static constexpr char const * dCurrentTotalVolRate_dCompDensString() { return "dCurrentTotalVolumetricRate_dCompDens"; }
302 
303  static constexpr char const * dCurrentTotalVolRate_dRateString() { return "dCurrentTotalVolumetricRate_dRate"; }
304 
305  } viewKeysCompMultiphaseWell;
306 
307 protected:
308 
309  virtual void postInputInitialization() override;
310 
311  virtual void initializePostSubGroups() override;
312 
314 
315  /*
316  * @brief Utility function that checks the consistency of the constitutive models
317  * @param[in] domain the domain partition
318  * @detail
319  * This function will produce an error if one of the well constitutive models
320  * is incompatible with the corresponding models in reservoir
321  * regions connected to that particular well.
322  */
323  void validateConstitutiveModels( DomainPartition const & domain ) const;
324 
329  void validateWellControlsForFluid( WellControls const & wellControls,
330  constitutive::MultiFluidBase const & fluid ) const;
331 
336  void validateInjectionStreams( WellElementSubRegion const & subRegion ) const;
337 
345  virtual void validateWellConstraints( real64 const & time_n,
346  real64 const & dt,
347  WellElementSubRegion const & subRegion,
348  ElementRegionManager const & elemManager ) override;
349 
350  void printRates( real64 const & time_n,
351  real64 const & dt,
352  DomainPartition & domain ) override;
353 
354 private:
355 
360  void initializeWells( DomainPartition & domain, real64 const & time_n ) override;
361 
362  virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override;
363 
364 
365 
367  integer m_useMass;
368 
370  integer m_useTotalMassEquation;
371 
373  real64 m_maxCompFracChange;
374 
376  real64 m_maxRelativePresChange;
377 
379  real64 m_maxAbsolutePresChange;
380 
382  real64 m_maxRelativeCompDensChange;
383 
385  real64 m_maxRelativeTempChange;
386 
388  real64 m_minScalingFactor;
389 
391  integer m_allowCompDensChopping;
392 
394  localIndex m_targetPhaseIndex;
395 
396 
397 
398 };
399 
400 } // namespace geos
401 
402 
403 #endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_COMPOSITIONALMULTIPHASEWELL_HPP_
void updateFluidModel(WellElementSubRegion &subRegion)
Update all relevant fluid models using current values of pressure and composition.
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 void updateState(DomainPartition &domain) override
Recompute all dependent quantities from primary variables (including constitutive models)
void chopNegativeDensities(DomainPartition &domain)
Sets all the negative component densities (if any) to zero.
virtual string wellElementDofName() const override
get the name of DOF defined on well elements
CompositionalMultiphaseWell(CompositionalMultiphaseWell const &)=delete
deleted copy constructor
void validateWellControlsForFluid(WellControls const &wellControls, constitutive::MultiFluidBase const &fluid) const
Checks if the WellControls parameters are within the fluid tables ranges.
void updateGlobalComponentFraction(WellElementSubRegion &subRegion) const
Recompute global component fractions from primary variables (component densities)
void updateTotalMassDensity(WellElementSubRegion &subRegion) const
Recompute total mass densities from mass density and phase volume fractions.
CompositionalMultiphaseWell(CompositionalMultiphaseWell &&)=default
default move constructor
virtual void initializePostInitialConditionsPreSubGroups() override
Called by InitializePostInitialConditions() prior to initializing sub-Groups.
virtual void computePerforationRates(real64 const &time_n, real64 const &dt, DomainPartition &domain) override
Recompute the perforation rates for all the wells.
void validateInjectionStreams(WellElementSubRegion const &subRegion) const
Checks injection streams for validity (compositions sum to one)
virtual real64 updateSubRegionState(WellElementSubRegion &subRegion) override
Recompute all dependent quantities from primary variables (including constitutive models)
virtual ~CompositionalMultiphaseWell() override=default
default destructor
virtual localIndex numFluidComponents() const override
const getter for the number of fluid components
virtual void validateWellConstraints(real64 const &time_n, real64 const &dt, WellElementSubRegion const &subRegion, ElementRegionManager const &elemManager) override
Make sure that the well constraints are compatible.
CompositionalMultiphaseWell(const string &name, Group *const parent)
main constructor for Group Objects
static string catalogName()
name of the node manager in the object catalog
virtual void registerDataOnMesh(Group &meshBodies) override
Register wrappers that contain data on the mesh objects.
CompositionalMultiphaseWell & operator=(CompositionalMultiphaseWell &&)=delete
deleted move operator
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
void updateVolRatesForConstraint(WellElementSubRegion &subRegion)
Recompute the volumetric rates that are used in the well constraints.
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
virtual localIndex numFluidPhases() const override
Get the number of fluid phases.
CompositionalMultiphaseWell & operator=(CompositionalMultiphaseWell const &)=delete
deleted assignment operator
virtual string resElementDofName() const override
get the name of DOF defined on well elements
CompositionalMultiphaseWell()=delete
deleted default constructor
virtual void postInputInitialization() override
real64 updatePhaseVolumeFraction(WellElementSubRegion &subRegion) const
Recompute phase volume fractions (saturations) from constitutive and primary variables.
void updateBHPForConstraint(WellElementSubRegion &subRegion)
Recompute the current BHP pressure.
virtual void initializePostSubGroups() override
Called by Initialize() after to initializing sub-Groups.
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...
This class describes the controls used to operate a well.
This class describes a collection of local well elements and perforations.
integer m_numComponents
the number of fluid components
integer m_numPhases
the max number of fluid phases
virtual real64 scalingForSystemSolution(DomainPartition &domain, DofManager const &dofManager, arrayView1d< real64 const > const &localSolution) override
Function to determine if the solution vector should be scaled back in order to maintain a known const...
virtual void implicitStepSetup(real64 const &time, real64 const &dt, DomainPartition &domain) override
function to perform setup for implicit timestep
virtual void resetStateToBeginningOfStep(DomainPartition &domain) override
reset state of physics back to the beginning of the step.
virtual void implicitStepComplete(real64 const &time, real64 const &dt, DomainPartition &domain) override
perform cleanup for implicit timestep
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 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 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