AquiferFetkovich.hpp
Go to the documentation of this file.
1/*
2Copyright 2017 TNO - Heat Transfer & Fluid Dynamics, Modelling & Optimization of the Subsurface
3Copyright 2017 Statoil ASA.
4
5This file is part of the Open Porous Media project (OPM).
6
7OPM is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
11
12OPM is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OPM. If not, see <http://www.gnu.org/licenses/>.
19*/
20
21#ifndef OPM_AQUIFETP_HEADER_INCLUDED
22#define OPM_AQUIFETP_HEADER_INCLUDED
23
25
26#include <opm/input/eclipse/EclipseState/Aquifer/Aquifetp.hpp>
27
28#include <opm/output/data/Aquifer.hpp>
29
30#include <stdexcept>
31#include <vector>
32
33namespace Opm
34{
35
36template <typename TypeTag>
37class AquiferFetkovich : public AquiferAnalytical<TypeTag>
38{
39
40public:
42
43 using typename Base::BlackoilIndices;
44 using typename Base::ElementContext;
45 using typename Base::Eval;
46 using typename Base::FluidState;
47 using typename Base::FluidSystem;
48 using typename Base::IntensiveQuantities;
49 using typename Base::RateVector;
50 using typename Base::Scalar;
51 using typename Base::Simulator;
52 using typename Base::ElementMapper;
53
54 AquiferFetkovich(const std::vector<Aquancon::AquancCell>& connections,
55 const Simulator& simulator,
56 const Aquifetp::AQUFETP_data& aqufetp_data)
57 : Base(aqufetp_data.aquiferID, connections, simulator)
58 , aqufetp_data_(aqufetp_data)
59 {
60 }
61
63 {
64 AquiferFetkovich result({}, simulator, {});
65
66 result.pressure_previous_ = {1.0, 2.0, 3.0};
67 result.pressure_current_ = {4.0, 5.0};
68 result.Qai_ = {{6.0}};
69 result.rhow_ = 7.0;
70 result.W_flux_ = 8.0;
71 result.aquifer_pressure_ = 9.0;
72
73 return result;
74 }
75
76 void endTimeStep() override
77 {
78 for (const auto& q : this->Qai_) {
79 this->W_flux_ += q * this->simulator_.timeStepSize();
80 }
82 }
83
84 data::AquiferData aquiferData() const override
85 {
86 // TODO: how to unify the two functions?
87 auto data = data::AquiferData{};
88
89 data.aquiferID = this->aquiferID();
90 data.pressure = this->aquifer_pressure_;
91 data.fluxRate = std::accumulate(this->Qai_.begin(), this->Qai_.end(), 0.0,
92 [](const double flux, const auto& q) -> double
93 {
94 return flux + q.value();
95 });
96 data.volume = this->W_flux_.value();
97 data.initPressure = this->pa0_;
98
99 auto* aquFet = data.typeData.template create<data::AquiferType::Fetkovich>();
100 aquFet->initVolume = this->aqufetp_data_.initial_watvolume;
101 aquFet->prodIndex = this->aqufetp_data_.prod_index;
102 aquFet->timeConstant = this->aqufetp_data_.timeConstant();
103
104 return data;
105 }
106
107 template<class Serializer>
108 void serializeOp(Serializer& serializer)
109 {
110 serializer(static_cast<Base&>(*this));
111 serializer(aquifer_pressure_);
112 }
113
114 bool operator==(const AquiferFetkovich& rhs) const
115 {
116 return static_cast<const Base&>(*this) == rhs &&
118 }
119
120protected:
121 // Aquifer Fetkovich Specific Variables
122 Aquifetp::AQUFETP_data aqufetp_data_;
124
125 void assignRestartData(const data::AquiferData& xaq) override
126 {
127 if (! xaq.typeData.is<data::AquiferType::Fetkovich>()) {
128 throw std::invalid_argument {
129 "Analytic aquifer data for unexpected aquifer "
130 "type passed to Fetkovich aquifer"
131 };
132 }
133
134 this->aquifer_pressure_ = xaq.pressure;
135 this->rhow_ = this->aqufetp_data_.waterDensity();
136 }
137
138 inline Eval dpai(int idx)
139 {
140 const auto gdz =
141 this->gravity_() * (this->cell_depth_[idx] - this->aquiferDepth());
142
143 return this->aquifer_pressure_ + this->rhow_*gdz
144 - this->pressure_current_.at(idx);
145 }
146
147 // This function implements Eq 5.12 of the EclipseTechnicalDescription
149 {
150 Scalar Flux = this->W_flux_.value();
151
152 const auto& comm = this->simulator_.vanguard().grid().comm();
153 comm.sum(&Flux, 1);
154
155 const auto denom =
156 this->aqufetp_data_.total_compr * this->aqufetp_data_.initial_watvolume;
157
158 return this->pa0_ - (Flux / denom);
159 }
160
161 inline void calculateAquiferConstants() override
162 {
163 this->Tc_ = this->aqufetp_data_.timeConstant();
164 }
165
166 // This function implements Eq 5.14 of the EclipseTechnicalDescription
167 inline void calculateInflowRate(int idx, const Simulator& simulator) override
168 {
169 const Scalar td_Tc_ = simulator.timeStepSize() / this->Tc_;
170 const Scalar coef = (1 - exp(-td_Tc_)) / td_Tc_;
171
172 this->Qai_.at(idx) = coef * this->alphai_[idx] *
173 this->aqufetp_data_.prod_index * dpai(idx);
174 }
175
176 inline void calculateAquiferCondition() override
177 {
178 if (this->solution_set_from_restart_) {
179 return;
180 }
181
182 if (! this->aqufetp_data_.initial_pressure.has_value()) {
183 this->aqufetp_data_.initial_pressure =
185
186 const auto& tables = this->simulator_.vanguard()
187 .eclState().getTableManager();
188
189 this->aqufetp_data_.finishInitialisation(tables);
190 }
191
192 this->rhow_ = this->aqufetp_data_.waterDensity();
193 this->pa0_ = this->aqufetp_data_.initial_pressure.value();
194 if (this->aqufetp_data_.initial_temperature.has_value())
195 this->Ta0_ = this->aqufetp_data_.initial_temperature.value();
196 this->aquifer_pressure_ = this->pa0_;
197 }
198
199 virtual Scalar aquiferDepth() const override
200 {
201 return this->aqufetp_data_.datum_depth;
202 }
203}; // Class AquiferFetkovich
204
205} // namespace Opm
206
207#endif
Definition: AquiferAnalytical.hpp:54
Scalar gravity_() const
Definition: AquiferAnalytical.hpp:241
Scalar Tc_
Definition: AquiferAnalytical.hpp:447
GetPropType< TypeTag, Properties::Simulator > Simulator
Definition: AquiferAnalytical.hpp:56
GetPropType< TypeTag, Properties::IntensiveQuantities > IntensiveQuantities
Definition: AquiferAnalytical.hpp:62
bool solution_set_from_restart_
Definition: AquiferAnalytical.hpp:457
GetPropType< TypeTag, Properties::ElementContext > ElementContext
Definition: AquiferAnalytical.hpp:58
GetPropType< TypeTag, Properties::RateVector > RateVector
Definition: AquiferAnalytical.hpp:61
std::vector< Scalar > alphai_
Definition: AquiferAnalytical.hpp:445
Scalar pa0_
Definition: AquiferAnalytical.hpp:448
DenseAd::Evaluation< Scalar, numEq > Eval
Definition: AquiferAnalytical.hpp:75
GetPropType< TypeTag, Properties::ElementMapper > ElementMapper
Definition: AquiferAnalytical.hpp:63
std::vector< Scalar > pressure_previous_
Definition: AquiferAnalytical.hpp:442
GetPropType< TypeTag, Properties::Scalar > Scalar
Definition: AquiferAnalytical.hpp:57
Eval W_flux_
Definition: AquiferAnalytical.hpp:455
std::vector< Eval > pressure_current_
Definition: AquiferAnalytical.hpp:443
std::optional< Scalar > Ta0_
Definition: AquiferAnalytical.hpp:449
std::vector< Scalar > cell_depth_
Definition: AquiferAnalytical.hpp:441
GetPropType< TypeTag, Properties::FluidSystem > FluidSystem
Definition: AquiferAnalytical.hpp:59
std::vector< Eval > Qai_
Definition: AquiferAnalytical.hpp:444
Scalar calculateReservoirEquilibrium()
Definition: AquiferAnalytical.hpp:392
BlackOilFluidState< Eval, FluidSystem, enableTemperature, enableEnergy, BlackoilIndices::gasEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, has_disgas_in_water, BlackoilIndices::numPhases > FluidState
Definition: AquiferAnalytical.hpp:86
GetPropType< TypeTag, Properties::Indices > BlackoilIndices
Definition: AquiferAnalytical.hpp:60
Scalar rhow_
Definition: AquiferAnalytical.hpp:450
Definition: AquiferFetkovich.hpp:38
void assignRestartData(const data::AquiferData &xaq) override
Definition: AquiferFetkovich.hpp:125
void calculateAquiferCondition() override
Definition: AquiferFetkovich.hpp:176
bool operator==(const AquiferFetkovich &rhs) const
Definition: AquiferFetkovich.hpp:114
void endTimeStep() override
Definition: AquiferFetkovich.hpp:76
AquiferFetkovich(const std::vector< Aquancon::AquancCell > &connections, const Simulator &simulator, const Aquifetp::AQUFETP_data &aqufetp_data)
Definition: AquiferFetkovich.hpp:54
data::AquiferData aquiferData() const override
Definition: AquiferFetkovich.hpp:84
void serializeOp(Serializer &serializer)
Definition: AquiferFetkovich.hpp:108
static AquiferFetkovich serializationTestObject(const Simulator &simulator)
Definition: AquiferFetkovich.hpp:62
virtual Scalar aquiferDepth() const override
Definition: AquiferFetkovich.hpp:199
void calculateInflowRate(int idx, const Simulator &simulator) override
Definition: AquiferFetkovich.hpp:167
Eval dpai(int idx)
Definition: AquiferFetkovich.hpp:138
void calculateAquiferConstants() override
Definition: AquiferFetkovich.hpp:161
Aquifetp::AQUFETP_data aqufetp_data_
Definition: AquiferFetkovich.hpp:122
Scalar aquiferPressure()
Definition: AquiferFetkovich.hpp:148
Scalar aquifer_pressure_
Definition: AquiferFetkovich.hpp:123
const Simulator & simulator_
Definition: AquiferInterface.hpp:98
int aquiferID() const
Definition: AquiferInterface.hpp:79
Definition: BlackoilPhases.hpp:27