opm-simulators
StandardWellPrimaryVariables.hpp
1 /*
2  Copyright 2017 SINTEF Digital, Mathematics and Cybernetics.
3  Copyright 2017 Statoil ASA.
4  Copyright 2016 - 2017 IRIS AS.
5 
6  This file is part of the Open Porous Media project (OPM).
7 
8  OPM is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  OPM is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with OPM. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 
23 #ifndef OPM_STANDARDWELL_PRIMARY_VARIABLES_HEADER_INCLUDED
24 #define OPM_STANDARDWELL_PRIMARY_VARIABLES_HEADER_INCLUDED
25 
26 #include <opm/material/densead/Evaluation.hpp>
27 
28 #include <opm/simulators/wells/StandardWellEquations.hpp>
29 
30 #include <string_view>
31 #include <vector>
32 
33 namespace Opm
34 {
35 
36 class DeferredLogger;
37 template<class FluidSystem, class Indices> class WellInterfaceIndices;
38 template<typename Scalar, typename IndexTraits> class WellState;
39 
41 template<class FluidSystem, class Indices>
42 class StandardWellPrimaryVariables {
43 protected:
44  // the positions of the primary variables for StandardWell
45  // the first one is the weighted total rate (WQ_t), the second and the third ones are F_w and F_g,
46  // which represent the fraction of Water and Gas based on the weighted total rate, the last one is BHP.
47  // correspondingly, we have four well equations for blackoil model, the first three are mass
48  // converstation equations, and the last one is the well control equation.
49  // primary variables related to other components, will be before the Bhp and after F_g.
50  // well control equation is always the last well equation.
51  // TODO: in the current implementation, we use the well rate as the first primary variables for injectors,
52  // instead of G_t.
53 
54  // Table showing the primary variable indices, depending on what phases are present:
55  //
56  // WOG OG WG WO W/O/G (single phase)
57  // WQTotal 0 0 0 0 0
58  // WFrac 1 -1000 -1000 1 -1000
59  // GFrac 2 1 1 -1000 -1000
60  // Spres 3 2 2 2 1
61 
63  static constexpr int numWellControlEq = 1;
64 
65 public:
67  static constexpr int numWellConservationEq = Indices::numPhases + Indices::numSolvents;
68 
72 
73  static constexpr int WQTotal = 0;
74 
78  static constexpr int Bhp = numStaticWellEq - numWellControlEq;
79 
80  static constexpr bool has_wfrac_variable = Indices::waterEnabled && Indices::oilEnabled;
81  static constexpr bool has_gfrac_variable = Indices::gasEnabled && Indices::numPhases > 1;
82  static constexpr int WFrac = has_wfrac_variable ? 1 : -1000;
83  static constexpr int GFrac = has_gfrac_variable ? has_wfrac_variable + 1 : -1000;
84  static constexpr int SFrac = !Indices::enableSolvent ? -1000 : has_wfrac_variable+has_gfrac_variable+1;
85 
86  using Scalar = typename FluidSystem::Scalar;
87  using IndexTraits = typename FluidSystem::IndexTraitsType;
89  using EvalWell = DenseAd::DynamicEvaluation<Scalar, numStaticWellEq + Indices::numEq + 1>;
91 
94  : well_(well)
95  {}
96 
98  void resize(const int numWellEq);
99 
101  int numWellEq() const { return numWellEq_; }
102 
104  void update(const WellState<Scalar, IndexTraits>& well_state,
105  const bool stop_or_zero_rate_target,
106  DeferredLogger& deferred_logger);
107 
109  void updatePolyMW(const WellState<Scalar, IndexTraits>& well_state);
110 
112  void updateNewton(const BVectorWell& dwells,
113  const bool stop_or_zero_rate_target,
114  const Scalar dFLimit,
115  const Scalar dBHPLimit,
116  DeferredLogger& deferred_logger);
117 
119  void updateNewtonPolyMW(const BVectorWell& dwells);
120 
122  void checkFinite(DeferredLogger& deferred_logger, std::string_view context) const;
123 
126  DeferredLogger& deferred_logger) const;
127 
130 
132  EvalWell volumeFractionScaled(const int compIdx) const;
133 
135  EvalWell surfaceVolumeFraction(const int compIdx) const;
136 
138  EvalWell getQs(const int compIdx) const;
139 
141  Scalar value(const int idx) const
142  { return value_[idx]; }
143 
145  const EvalWell& eval(const int idx) const
146  { return evaluation_[idx]; }
147 
149  void setValue(const int idx, const Scalar val)
150  { value_[idx] = val; }
151 
152 private:
154  void setEvaluationsFromValues();
155 
158  Scalar relaxationFactorFractionsProducer(const BVectorWell& dwells,
159  DeferredLogger& deferred_logger) const;
160 
162  EvalWell volumeFraction(const int compIdx) const;
163 
165  void processFractions();
166 
169  std::vector<Scalar> value_;
170 
173  std::vector<EvalWell> evaluation_;
174 
176 
179  int numWellEq_ = numStaticWellEq;
180 };
181 
182 }
183 
184 #endif // OPM_STANDARDWELL_PRIMARY_VARIABLES_HEADER_INCLUDED
void updateNewtonPolyMW(const BVectorWell &dwells)
Update polymer molecular weight values from newton update vector.
Definition: StandardWellPrimaryVariables.cpp:325
Scalar value(const int idx) const
Returns a value.
Definition: StandardWellPrimaryVariables.hpp:141
void resize(const int numWellEq)
Resize values and evaluations.
Definition: StandardWellPrimaryVariables.cpp:115
void setValue(const int idx, const Scalar val)
Set a value. Note that this does not also set the corresponding evaluation.
Definition: StandardWellPrimaryVariables.hpp:149
EvalWell getQs(const int compIdx) const
Returns scaled rate for a component.
Definition: StandardWellPrimaryVariables.cpp:536
void update(const WellState< Scalar, IndexTraits > &well_state, const bool stop_or_zero_rate_target, DeferredLogger &deferred_logger)
Copy values from well state.
Definition: StandardWellPrimaryVariables.cpp:124
void updatePolyMW(const WellState< Scalar, IndexTraits > &well_state)
Copy polymer molecular weigt values from well state.
Definition: StandardWellPrimaryVariables.cpp:245
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
StandardWellPrimaryVariables(const WellInterfaceIndices< FluidSystem, Indices > &well)
Constructor initializes reference to well interface.
Definition: StandardWellPrimaryVariables.hpp:93
Definition: StandardWellAssemble.hpp:34
int numWellEq() const
Returns number of well equations.
Definition: StandardWellPrimaryVariables.hpp:101
void updateNewton(const BVectorWell &dwells, const bool stop_or_zero_rate_target, const Scalar dFLimit, const Scalar dBHPLimit, DeferredLogger &deferred_logger)
Update values from newton update vector.
Definition: StandardWellPrimaryVariables.cpp:262
static constexpr int numWellControlEq
Number of the well control equations.
Definition: StandardWellPrimaryVariables.hpp:63
void checkFinite(DeferredLogger &deferred_logger, std::string_view context) const
Check that all values are finite.
Definition: StandardWellPrimaryVariables.cpp:753
EvalWell surfaceVolumeFraction(const int compIdx) const
Returns surface volume fraction for a component.
Definition: StandardWellPrimaryVariables.cpp:521
static constexpr int numStaticWellEq
Number of the well equations that will always be used.
Definition: StandardWellPrimaryVariables.hpp:71
Definition: MultisegmentWellAssemble.hpp:38
Definition: DeferredLogger.hpp:56
static constexpr int numWellConservationEq
Number of the conservation equations.
Definition: StandardWellPrimaryVariables.hpp:67
void copyToWellStatePolyMW(WellState< Scalar, IndexTraits > &well_state) const
Copy polymer molecular weight values to well state.
Definition: StandardWellPrimaryVariables.cpp:453
DenseAd::DynamicEvaluation< Scalar, numStaticWellEq+GetPropType< TypeTag, Properties::Indices > ::numEq+1 > EvalWell
Evaluation for the well equations.
Definition: StandardWellPrimaryVariables.hpp:89
void copyToWellState(WellState< Scalar, IndexTraits > &well_state, DeferredLogger &deferred_logger) const
Copy values to well state.
Definition: StandardWellPrimaryVariables.cpp:345
static constexpr int WQTotal
The index for the weighted total rate.
Definition: StandardWellPrimaryVariables.hpp:73
static constexpr int Bhp
The index for Bhp in primary variables and the index of well control equation.
Definition: StandardWellPrimaryVariables.hpp:78
EvalWell volumeFractionScaled(const int compIdx) const
Returns scaled volume fraction for a component.
Definition: StandardWellPrimaryVariables.cpp:507
const EvalWell & eval(const int idx) const
Returns a const ref to an evaluation.
Definition: StandardWellPrimaryVariables.hpp:145
The state of a set of wells, tailored for use by the fully implicit blackoil simulator.
Definition: TemperatureModel.hpp:61