21#ifndef OPM_AQUIFERCT_HEADER_INCLUDED
22#define OPM_AQUIFERCT_HEADER_INCLUDED
24#include <opm/simulators/aquifers/AquiferAnalytical.hpp>
26#include <opm/output/data/Aquifer.hpp>
36template <
typename TypeTag>
42 using typename Base::BlackoilIndices;
43 using typename Base::ElementContext;
44 using typename Base::Eval;
45 using typename Base::FluidState;
46 using typename Base::FluidSystem;
47 using typename Base::IntensiveQuantities;
48 using typename Base::RateVector;
49 using typename Base::Scalar;
50 using typename Base::Simulator;
51 using typename Base::ElementMapper;
54 const Simulator& ebosSimulator,
55 const AquiferCT::AQUCT_data& aquct_data)
56 :
Base(aquct_data.aquiferID, connections, ebosSimulator)
57 , aquct_data_(aquct_data)
60 void endTimeStep()
override
62 for (
const auto& q : this->Qai_) {
63 this->W_flux_ += q * this->ebos_simulator_.timeStepSize();
65 this->fluxValue_ = this->W_flux_.value();
66 const auto& comm = this->ebos_simulator_.vanguard().grid().comm();
67 comm.sum(&this->fluxValue_, 1);
70 data::AquiferData aquiferData()
const override
72 data::AquiferData data;
73 data.aquiferID = this->aquiferID();
75 data.pressure = this->pa0_;
77 for (
const auto& q : this->Qai_) {
78 data.fluxRate += q.value();
80 data.volume = this->W_flux_.value();
81 data.initPressure = this->pa0_;
83 auto* aquCT = data.typeData.template create<data::AquiferType::CarterTracy>();
85 aquCT->dimensionless_time = this->dimensionless_time_;
86 aquCT->dimensionless_pressure = this->dimensionless_pressure_;
87 aquCT->influxConstant = this->aquct_data_.influxConstant();
89 if (!this->co2store_()) {
90 aquCT->timeConstant = this->aquct_data_.timeConstant();
91 aquCT->waterDensity = this->aquct_data_.waterDensity();
92 aquCT->waterViscosity = this->aquct_data_.waterViscosity();
94 aquCT->waterDensity = this->rhow_;
95 aquCT->timeConstant = this->Tc_;
96 const auto x = this->aquct_data_.porosity * this->aquct_data_.total_compr * this->aquct_data_.inner_radius * this->aquct_data_.inner_radius;
97 aquCT->waterViscosity = this->Tc_ * this->aquct_data_.permeability / x;
105 AquiferCT::AQUCT_data aquct_data_;
109 Scalar fluxValue_{0};
111 Scalar dimensionless_time_{0};
112 Scalar dimensionless_pressure_{0};
114 void assignRestartData(
const data::AquiferData& xaq)
override
116 this->fluxValue_ = xaq.volume;
117 this->rhow_ = this->aquct_data_.waterDensity();
120 std::pair<Scalar, Scalar>
121 getInfluenceTableValues(
const Scalar td_plus_dt)
124 this->dimensionless_pressure_ =
125 linearInterpolation(this->aquct_data_.dimensionless_time,
126 this->aquct_data_.dimensionless_pressure,
127 this->dimensionless_time_);
130 linearInterpolation(this->aquct_data_.dimensionless_time,
131 this->aquct_data_.dimensionless_pressure,
134 const auto PItdprime =
135 linearInterpolationDerivative(this->aquct_data_.dimensionless_time,
136 this->aquct_data_.dimensionless_pressure,
139 return std::make_pair(PItd, PItdprime);
142 Scalar dpai(
const int idx)
const
145 this->gravity_() * (this->cell_depth_.at(idx) - this->aquiferDepth());
147 const auto dp = this->pa0_ + this->rhow_*gdz
148 - this->pressure_previous_.at(idx);
154 std::pair<Scalar, Scalar>
155 calculateEqnConstants(
const int idx,
const Simulator& simulator)
157 const Scalar td_plus_dt = (simulator.timeStepSize() + simulator.time()) / this->Tc_;
158 this->dimensionless_time_ = simulator.time() / this->Tc_;
160 const auto [PItd, PItdprime] = this->getInfluenceTableValues(td_plus_dt);
162 const auto denom = this->Tc_ * (PItd - this->dimensionless_time_*PItdprime);
163 const auto a = (this->beta_*dpai(idx) - this->fluxValue_*PItdprime) / denom;
164 const auto b = this->beta_ / denom;
166 return std::make_pair(a, b);
169 std::size_t pvtRegionIdx()
const
171 return this->aquct_data_.pvttableID - 1;
175 inline void calculateInflowRate(
int idx,
const Simulator& simulator)
override
177 const auto [a, b] = this->calculateEqnConstants(idx, simulator);
179 this->Qai_.at(idx) = this->alphai_.at(idx) *
180 (a - b*(this->pressure_current_.at(idx) - this->pressure_previous_.at(idx)));
183 inline void calculateAquiferConstants()
override
185 if(this->co2store_()) {
186 const auto press = this->aquct_data_.initial_pressure.value();
187 Scalar temp = FluidSystem::reservoirTemperature();
188 if (this->aquct_data_.initial_temperature.has_value())
189 temp = this->aquct_data_.initial_temperature.value();
192 Scalar waterViscosity = FluidSystem::oilPvt().viscosity(pvtRegionIdx(), temp, press, rs);
193 const auto x = this->aquct_data_.porosity * this->aquct_data_.total_compr * this->aquct_data_.inner_radius * this->aquct_data_.inner_radius;
194 this->Tc_ = waterViscosity * x / this->aquct_data_.permeability;
196 this->Tc_ = this->aquct_data_.timeConstant();
198 this->beta_ = this->aquct_data_.influxConstant();
201 inline void calculateAquiferCondition()
override
203 if (this->solution_set_from_restart_) {
207 if (! this->aquct_data_.initial_pressure.has_value()) {
208 this->aquct_data_.initial_pressure =
209 this->calculateReservoirEquilibrium();
211 const auto& tables = this->ebos_simulator_.vanguard()
212 .eclState().getTableManager();
214 this->aquct_data_.finishInitialisation(tables);
217 this->pa0_ = this->aquct_data_.initial_pressure.value();
218 if (this->aquct_data_.initial_temperature.has_value())
219 this->Ta0_ = this->aquct_data_.initial_temperature.value();
221 if(this->co2store_()) {
222 const auto press = this->aquct_data_.initial_pressure.value();
224 Scalar temp = FluidSystem::reservoirTemperature();
225 if (this->aquct_data_.initial_temperature.has_value())
226 temp = this->aquct_data_.initial_temperature.value();
229 Scalar waterDensity = FluidSystem::oilPvt().inverseFormationVolumeFactor(pvtRegionIdx(), temp, press, rs)
230 * FluidSystem::oilPvt().oilReferenceDensity(pvtRegionIdx());
231 this->rhow_ = waterDensity;
233 this->rhow_ = this->aquct_data_.waterDensity();
237 virtual Scalar aquiferDepth()
const override
239 return this->aquct_data_.datum_depth;
Definition: AquiferAnalytical.hpp:51
Definition: AquiferCarterTracy.hpp:38
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:27