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 "common/DataTypes.hpp"
24 #include "constitutive/fluid/multifluid/Layouts.hpp"
25 #include "constitutive/relativePermeability/Layouts.hpp"
26 #include "mesh/MeshLevel.hpp"
29 
30 namespace geos
31 {
32 
33 namespace constitutive
34 {
35 class ConstitutiveManager;
36 class MultiFluidBase;
37 }
38 
39 namespace compositionalMultiphaseStatistics
40 {
41 class StatsAggregator;
42 }
43 
50 {
51 public:
52 
58  CompositionalMultiphaseWell( const string & name,
59  Group * const parent );
60 
63 
66 
69 
72 
75 
79  virtual ~CompositionalMultiphaseWell() override = default;
80 
85  static string catalogName() { return "CompositionalMultiphaseWell"; }
89  string getCatalogName() const override { return catalogName(); }
90 
91  virtual void registerDataOnMesh( Group & meshBodies ) override;
92 
93 
102  virtual real64
103  calculateResidualNorm( real64 const & time_n,
104  real64 const & dt,
105  DomainPartition const & domain,
106  DofManager const & dofManager,
107  arrayView1d< real64 const > const & localRhs ) override;
108 
109  virtual real64
111  DofManager const & dofManager,
112  arrayView1d< real64 const > const & localSolution ) override;
113 
114  virtual bool
116  DofManager const & dofManager,
117  arrayView1d< real64 const > const & localSolution,
118  real64 const scalingFactor ) override;
119 
120  virtual void
121  applySystemSolution( DofManager const & dofManager,
122  arrayView1d< real64 const > const & localSolution,
123  real64 const scalingFactor,
124  real64 const dt,
125  DomainPartition & domain ) override;
126 
127  virtual void
129 
130  virtual void
131  implicitStepSetup( real64 const & time,
132  real64 const & dt,
133  DomainPartition & domain ) override;
134 
135  virtual void
137  real64 const & dt,
138  DomainPartition & domain ) override;
139 
147 
154 
161 
168 
175 
180  void updateTotalMassDensity( WellElementSubRegion & subRegion ) const;
181 
186  virtual void computePerforationRates( real64 const & time_n,
187  real64 const & dt, DomainPartition & domain ) override;
188 
193  virtual void updateState( DomainPartition & domain ) override;
194 
195  virtual real64 updateSubRegionState( WellElementSubRegion & subRegion ) override;
196 
197  virtual string wellElementDofName() const override { return viewKeyStruct::dofFieldString(); }
198 
199  virtual string resElementDofName() const override { return CompositionalMultiphaseBase::viewKeyStruct::elemDofFieldString(); }
200 
201  virtual localIndex numFluidComponents() const override { return m_numComponents; }
202 
203  virtual localIndex numFluidPhases() const override { return m_numPhases; }
204 
205  integer useTotalMassEquation() const { return m_useTotalMassEquation; }
206 
217  virtual void assembleFluxTerms( real64 const & time_n,
218  real64 const & dt,
219  DomainPartition & domain,
220  DofManager const & dofManager,
221  CRSMatrixView< real64, globalIndex const > const & localMatrix,
222  arrayView1d< real64 > const & localRhs )override;
230  virtual void assembleAccumulationTerms( real64 const & time_n,
231  real64 const & dt,
232  DomainPartition & domain,
233  DofManager const & dofManager,
234  CRSMatrixView< real64, globalIndex const > const & localMatrix,
235  arrayView1d< real64 > const & localRhs ) override;
236 
246  virtual void assemblePressureRelations( real64 const & time_n,
247  real64 const & dt,
248  DomainPartition const & domain,
249  DofManager const & dofManager,
250  CRSMatrixView< real64, globalIndex const > const & localMatrix,
251  arrayView1d< real64 > const & localRhs ) override;
252 
258 
260  {
261  static constexpr char const * dofFieldString() { return "compositionalWellVars"; }
262 
263  // inputs
264 
265  static constexpr char const * useMassFlagString() { return CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString(); }
266 
267  static constexpr char const * useTotalMassEquationString() { return CompositionalMultiphaseBase::viewKeyStruct::useTotalMassEquationString(); }
268 
269  static constexpr char const * maxCompFracChangeString() { return CompositionalMultiphaseBase::viewKeyStruct::maxCompFracChangeString(); }
270 
271  static constexpr char const * maxRelativePresChangeString() { return "maxRelativePressureChange"; }
272 
273  static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; }
274 
275  static constexpr char const * maxRelativeCompDensChangeString() { return "maxRelativeCompDensChange"; }
276 
277  static constexpr char const * maxRelativeTempChangeString() { return "maxRelativeTemperatureChange"; }
278 
279  static constexpr char const * allowLocalCompDensChoppingString() { return CompositionalMultiphaseBase::viewKeyStruct::allowLocalCompDensChoppingString(); }
280 
281  // control data (not registered on the mesh)
282 
283  static constexpr char const * massDensityString() { return "massDensity";}
284 
285  static constexpr char const * currentBHPString() { return "currentBHP"; }
286  static constexpr char const * dCurrentBHPString() { return "dCurrentBHP"; }
287 
288  static constexpr char const * dCurrentBHP_dPresString() { return "dCurrentBHP_dPres"; }
289  static constexpr char const * dCurrentBHP_dCompDensString() { return "dCurrentBHP_dCompDens"; }
290 
291  static constexpr char const * currentPhaseVolRateString() { return "currentPhaseVolumetricRate"; }
292  static constexpr char const * dCurrentPhaseVolRateString() { return "dCurrentPhaseVolumetricRate"; }
293 
294 
295  static constexpr char const * dCurrentPhaseVolRate_dPresString() { return "dCurrentPhaseVolumetricRate_dPres"; }
296 
297  static constexpr char const * dCurrentPhaseVolRate_dCompDensString() { return "dCurrentPhaseVolumetricRate_dCompDens"; }
298 
299  static constexpr char const * dCurrentPhaseVolRate_dRateString() { return "dCurrentPhaseVolumetricRate_dRate"; }
300 
301  static constexpr char const * currentTotalVolRateString() { return "currentTotalVolumetricRate"; }
302  static constexpr char const * dCurrentTotalVolRateString() { return "dCurrentTotalVolumetricRate"; }
303 
304  static constexpr char const * currentMassRateString() { return "currentMassRate"; }
305 
306  static constexpr char const * dCurrentTotalVolRate_dPresString() { return "dCurrentTotalVolumetricRate_dPres"; }
307 
308  static constexpr char const * dCurrentTotalVolRate_dCompDensString() { return "dCurrentTotalVolumetricRate_dCompDens"; }
309 
310  static constexpr char const * dCurrentTotalVolRate_dRateString() { return "dCurrentTotalVolumetricRate_dRate"; }
311 
312  } viewKeysCompMultiphaseWell;
313 
314 protected:
315 
316  virtual void postInputInitialization() override;
317 
318  virtual void initializePostSubGroups() override;
319 
321 
322  virtual void postRestartInitialization() override final;
323  /*
324  * @brief Utility function that checks the consistency of the constitutive models
325  * @param[in] domain the domain partition
326  * @detail
327  * This function will produce an error if one of the well constitutive models
328  * is incompatible with the corresponding models in reservoir
329  * regions connected to that particular well.
330  */
331  void validateConstitutiveModels( DomainPartition const & domain ) const;
332 
337  void validateWellControlsForFluid( WellControls const & wellControls,
338  constitutive::MultiFluidBase const & fluid ) const;
339 
344  void validateInjectionStreams( WellElementSubRegion const & subRegion ) const;
345 
353  virtual void validateWellConstraints( real64 const & time_n,
354  real64 const & dt,
355  WellElementSubRegion const & subRegion ) override;
356 
361 
362  void printRates( real64 const & time_n,
363  real64 const & dt,
364  DomainPartition & domain ) override;
365 
366 private:
367 
368  struct ReferenceConditions
369  {
370  real64 pressure;
371  real64 temperature;
372  };
373 
378  void initializeWells( DomainPartition & domain, real64 const & time_n ) override;
379 
380  virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override;
381 
382  void precomputeReferenceConditions( real64 time_n,
383  Group & meshBodies,
384  MeshBody & meshBody,
385  WellElementSubRegion const & subRegion );
386 
387  ReferenceConditions getReferenceConditions( WellElementSubRegion const & subRegion );
388 
390  integer m_useMass;
391 
393  integer m_useTotalMassEquation;
394 
396  real64 m_maxCompFracChange;
397 
399  real64 m_maxRelativePresChange;
400 
402  real64 m_maxAbsolutePresChange;
403 
405  real64 m_maxRelativeCompDensChange;
406 
408  real64 m_maxRelativeTempChange;
409 
411  real64 m_minScalingFactor;
412 
414  integer m_allowCompDensChopping;
415 
417  localIndex m_targetPhaseIndex;
418 
420  std::unique_ptr< compositionalMultiphaseStatistics::StatsAggregator > m_reservoirStatsAggregator;
421 
422 
423 };
424 
425 } // namespace geos
426 
427 
428 #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 updateVolRatesForConstraint(WellElementSubRegion const &subRegion)
Recompute the volumetric rates that are used in the well constraints.
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) 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.
void createSeparator()
Create well separator.
CompositionalMultiphaseWell & operator=(CompositionalMultiphaseWell &&)=delete
deleted move operator
virtual void postRestartInitialization() override final
Performs initialization required after reading from a restart file.
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 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 class is used to manage mesh body.
Definition: MeshBody.hpp:36
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