21#ifndef OPM_AQUIFERCT_HEADER_INCLUDED
22#define OPM_AQUIFERCT_HEADER_INCLUDED
24#include <opm/common/utility/numeric/linearInterpolation.hpp>
26#include <opm/input/eclipse/EclipseState/Aquifer/AquiferCT.hpp>
28#include <opm/output/data/Aquifer.hpp>
40template <
typename TypeTag>
59 const AquiferCT::AQUCT_data& aquct_data)
69 result.pressure_current_ = {4.0, 5.0};
70 result.Qai_ = {{6.0}};
73 result.fluxValue_ = 9.0;
74 result.dimensionless_time_ = 10.0;
75 result.dimensionless_pressure_ = 11.0;
82 for (
const auto& q : this->
Qai_) {
86 const auto& comm = this->
simulator_.vanguard().grid().comm();
92 data::AquiferData data;
95 data.pressure = this->
pa0_;
97 for (
const auto& q : this->
Qai_) {
98 data.fluxRate += q.value();
100 data.volume = this->
W_flux_.value();
101 data.initPressure = this->
pa0_;
103 auto* aquCT = data.typeData.template create<data::AquiferType::CarterTracy>();
107 aquCT->influxConstant = this->
aquct_data_.influxConstant();
110 aquCT->timeConstant = this->
aquct_data_.timeConstant();
111 aquCT->waterDensity = this->
aquct_data_.waterDensity();
112 aquCT->waterViscosity = this->
aquct_data_.waterViscosity();
114 aquCT->waterDensity = this->
rhow_;
115 aquCT->timeConstant = this->
Tc_;
117 aquCT->waterViscosity = this->
Tc_ * this->
aquct_data_.permeability / x;
123 template<
class Serializer>
126 serializer(
static_cast<Base&
>(*
this));
154 this->
rhow_ = this->aquct_data_.waterDensity();
157 std::pair<Scalar, Scalar>
162 linearInterpolation(this->aquct_data_.dimensionless_time,
163 this->aquct_data_.dimensionless_pressure,
164 this->dimensionless_time_);
167 linearInterpolation(this->aquct_data_.dimensionless_time,
168 this->aquct_data_.dimensionless_pressure,
171 const auto PItdprime =
172 linearInterpolationDerivative(this->aquct_data_.dimensionless_time,
173 this->aquct_data_.dimensionless_pressure,
176 return std::make_pair(PItd, PItdprime);
184 const auto dp = this->
pa0_ + this->
rhow_*gdz
191 std::pair<Scalar, Scalar>
194 const Scalar td_plus_dt = (simulator.timeStepSize() + simulator.time()) / this->
Tc_;
200 const auto a = (this->beta_*
dpai(idx) - this->
fluxValue_*PItdprime) / denom;
201 const auto b = this->beta_ / denom;
203 return std::make_pair(a, b);
208 return this->aquct_data_.pvttableID - 1;
223 ? this->timeConstantCO2Store()
224 : this->aquct_data_.timeConstant();
226 this->beta_ = this->aquct_data_.influxConstant();
235 if (! this->aquct_data_.initial_pressure.has_value()) {
236 this->aquct_data_.initial_pressure =
239 const auto& tables = this->
simulator_.vanguard()
240 .eclState().getTableManager();
242 this->aquct_data_.finishInitialisation(tables);
245 this->
pa0_ = this->aquct_data_.initial_pressure.value();
246 if (this->aquct_data_.initial_temperature.has_value()) {
247 this->
Ta0_ = this->aquct_data_.initial_temperature.value();
251 ? this->waterDensityCO2Store()
252 : this->aquct_data_.waterDensity();
257 return this->aquct_data_.datum_depth;
261 Scalar timeConstantCO2Store()
const
263 const Scalar press = this->aquct_data_.initial_pressure.value();
264 const auto temp = this->reservoirTemperatureCO2Store();
266 auto waterViscosity =
Scalar { 0 };
267 if (FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx)) {
268 const auto rs =
Scalar { 0 };
269 waterViscosity = FluidSystem::oilPvt()
272 else if (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) {
273 const auto salt =
Scalar { 0 };
274 const auto rsw =
Scalar { 0 };
275 waterViscosity = FluidSystem::waterPvt()
279 OPM_THROW(std::runtime_error,
"water or oil phase is needed to run CO2Store.");
282 const auto x = this->aquct_data_.porosity * this->aquct_data_.total_compr
283 * this->aquct_data_.inner_radius * this->aquct_data_.inner_radius;
285 return waterViscosity * x / this->aquct_data_.permeability;
288 Scalar waterDensityCO2Store()
const
290 const Scalar press = this->aquct_data_.initial_pressure.value();
291 const auto temp = this->reservoirTemperatureCO2Store();
293 if (FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx)) {
294 const auto& pvt = FluidSystem::oilPvt();
297 const auto rs =
Scalar { 0 };
298 return pvt.inverseFormationVolumeFactor(reg, temp, press, rs)
299 * pvt.oilReferenceDensity(reg);
301 else if (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) {
302 const auto& pvt = FluidSystem::waterPvt();
305 const auto salinity =
Scalar { 0 };
306 const auto rsw =
Scalar { 0 };
308 return pvt.inverseFormationVolumeFactor(reg, temp, press, rsw, salinity)
309 * pvt.waterReferenceDensity(reg);
312 OPM_THROW(std::runtime_error,
"water or oil phase is needed to run CO2Store.");
316 Scalar reservoirTemperatureCO2Store()
const
318 return this->aquct_data_.initial_temperature.has_value()
319 ? this->aquct_data_.initial_temperature.value()
320 : FluidSystem::reservoirTemperature();
Definition: AquiferAnalytical.hpp:56
Scalar gravity_() const
Definition: AquiferAnalytical.hpp:243
Scalar Tc_
Definition: AquiferAnalytical.hpp:449
GetPropType< TypeTag, Properties::Simulator > Simulator
Definition: AquiferAnalytical.hpp:58
GetPropType< TypeTag, Properties::IntensiveQuantities > IntensiveQuantities
Definition: AquiferAnalytical.hpp:64
bool solution_set_from_restart_
Definition: AquiferAnalytical.hpp:459
GetPropType< TypeTag, Properties::ElementContext > ElementContext
Definition: AquiferAnalytical.hpp:60
GetPropType< TypeTag, Properties::RateVector > RateVector
Definition: AquiferAnalytical.hpp:63
std::vector< Scalar > alphai_
Definition: AquiferAnalytical.hpp:447
Scalar pa0_
Definition: AquiferAnalytical.hpp:450
DenseAd::Evaluation< Scalar, numEq > Eval
Definition: AquiferAnalytical.hpp:77
GetPropType< TypeTag, Properties::ElementMapper > ElementMapper
Definition: AquiferAnalytical.hpp:65
std::vector< Scalar > pressure_previous_
Definition: AquiferAnalytical.hpp:444
GetPropType< TypeTag, Properties::Scalar > Scalar
Definition: AquiferAnalytical.hpp:59
Eval W_flux_
Definition: AquiferAnalytical.hpp:457
std::vector< Eval > pressure_current_
Definition: AquiferAnalytical.hpp:445
std::optional< Scalar > Ta0_
Definition: AquiferAnalytical.hpp:451
std::vector< Scalar > cell_depth_
Definition: AquiferAnalytical.hpp:443
GetPropType< TypeTag, Properties::FluidSystem > FluidSystem
Definition: AquiferAnalytical.hpp:61
std::vector< Eval > Qai_
Definition: AquiferAnalytical.hpp:446
Scalar calculateReservoirEquilibrium()
Definition: AquiferAnalytical.hpp:394
BlackOilFluidState< Eval, FluidSystem, enableTemperature, enableEnergy, BlackoilIndices::gasEnabled, enableVapwat, enableBrine, enableSaltPrecipitation, has_disgas_in_water, BlackoilIndices::numPhases > FluidState
Definition: AquiferAnalytical.hpp:88
GetPropType< TypeTag, Properties::Indices > BlackoilIndices
Definition: AquiferAnalytical.hpp:62
Scalar rhow_
Definition: AquiferAnalytical.hpp:452
Definition: AquiferCarterTracy.hpp:42
AquiferCT::AQUCT_data aquct_data_
Definition: AquiferCarterTracy.hpp:142
std::pair< Scalar, Scalar > getInfluenceTableValues(const Scalar td_plus_dt)
Definition: AquiferCarterTracy.hpp:158
void assignRestartData(const data::AquiferData &xaq) override
Definition: AquiferCarterTracy.hpp:151
static AquiferCarterTracy serializationTestObject(const Simulator &simulator)
Definition: AquiferCarterTracy.hpp:64
void calculateInflowRate(int idx, const Simulator &simulator) override
Definition: AquiferCarterTracy.hpp:212
data::AquiferData aquiferData() const override
Definition: AquiferCarterTracy.hpp:90
bool operator==(const AquiferCarterTracy &rhs) const
Definition: AquiferCarterTracy.hpp:132
Scalar fluxValue_
Definition: AquiferCarterTracy.hpp:146
void endTimeStep() override
Definition: AquiferCarterTracy.hpp:80
void calculateAquiferCondition() override
Definition: AquiferCarterTracy.hpp:229
GetPropType< TypeTag, Properties::Scalar > Scalar
Definition: AquiferAnalytical.hpp:59
Scalar dimensionless_pressure_
Definition: AquiferCarterTracy.hpp:149
AquiferCarterTracy(const std::vector< Aquancon::AquancCell > &connections, const Simulator &simulator, const AquiferCT::AQUCT_data &aquct_data)
Definition: AquiferCarterTracy.hpp:57
std::pair< Scalar, Scalar > calculateEqnConstants(const int idx, const Simulator &simulator)
Definition: AquiferCarterTracy.hpp:192
void calculateAquiferConstants() override
Definition: AquiferCarterTracy.hpp:220
void serializeOp(Serializer &serializer)
Definition: AquiferCarterTracy.hpp:124
Scalar dimensionless_time_
Definition: AquiferCarterTracy.hpp:148
Scalar aquiferDepth() const override
Definition: AquiferCarterTracy.hpp:255
Scalar beta_
Definition: AquiferCarterTracy.hpp:144
Scalar dpai(const int idx) const
Definition: AquiferCarterTracy.hpp:179
std::size_t pvtRegionIdx() const
Definition: AquiferCarterTracy.hpp:206
const Simulator & simulator_
Definition: AquiferInterface.hpp:98
bool co2store_or_h2store_() const
Definition: AquiferInterface.hpp:82
int aquiferID() const
Definition: AquiferInterface.hpp:79
Definition: blackoilboundaryratevector.hh:37