21 #ifndef OPM_AQUIFETP_HEADER_INCLUDED
22 #define OPM_AQUIFETP_HEADER_INCLUDED
24 #include <opm/simulators/aquifers/AquiferInterface.hpp>
26 #include <opm/output/data/Aquifer.hpp>
35 template <
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 Aquifetp::AQUFETP_data& aqufetp_data)
56 :
Base(aqufetp_data.aquiferID, connections, ebosSimulator)
57 , aqufetp_data_(aqufetp_data)
61 void endTimeStep()
override
63 for (
const auto& q : this->Qai_) {
64 this->W_flux_ += q * this->ebos_simulator_.timeStepSize();
66 aquifer_pressure_ = aquiferPressure();
69 data::AquiferData aquiferData()
const
72 auto data = data::AquiferData{};
74 data.aquiferID = this->aquiferID();
75 data.pressure = this->aquifer_pressure_;
76 data.fluxRate = std::accumulate(this->Qai_.begin(), this->Qai_.end(), 0.0,
77 [](
const double flux,
const auto& q) ->
double
79 return flux + q.value();
81 data.volume = this->W_flux_.value();
82 data.initPressure = this->pa0_;
84 auto* aquFet = data.typeData.template create<data::AquiferType::Fetkovich>();
85 aquFet->initVolume = this->aqufetp_data_.initial_watvolume;
86 aquFet->prodIndex = this->aqufetp_data_.prod_index;
87 aquFet->timeConstant = this->aqufetp_data_.timeConstant();
94 Aquifetp::AQUFETP_data aqufetp_data_;
95 Scalar aquifer_pressure_;
97 void assignRestartData(
const data::AquiferData& xaq)
override
99 if (! xaq.typeData.is<data::AquiferType::Fetkovich>()) {
100 throw std::invalid_argument {
101 "Analytic aquifer data for unexpected aquifer "
102 "type passed to Fetkovich aquifer"
106 this->aquifer_pressure_ = xaq.pressure;
107 this->rhow_ = this->aqufetp_data_.waterDensity();
110 inline Eval dpai(
int idx)
113 this->gravity_() * (this->cell_depth_[idx] - this->aquiferDepth());
115 return this->aquifer_pressure_ + this->rhow_*gdz
116 - this->pressure_current_.at(idx);
120 inline Scalar aquiferPressure()
122 Scalar Flux = this->W_flux_.value();
124 const auto& comm = this->ebos_simulator_.vanguard().grid().comm();
128 this->aqufetp_data_.total_compr * this->aqufetp_data_.initial_watvolume;
130 return this->pa0_ - (Flux / denom);
133 inline void calculateAquiferConstants()
override
135 this->Tc_ = this->aqufetp_data_.timeConstant();
139 inline void calculateInflowRate(
int idx,
const Simulator& simulator)
override
141 const Scalar td_Tc_ = simulator.timeStepSize() / this->Tc_;
142 const Scalar coef = (1 - exp(-td_Tc_)) / td_Tc_;
144 this->Qai_.at(idx) = coef * this->alphai_[idx] *
145 this->aqufetp_data_.prod_index * dpai(idx);
148 inline void calculateAquiferCondition()
override
150 if (this->solution_set_from_restart_) {
154 if (! this->aqufetp_data_.initial_pressure.has_value()) {
155 this->aqufetp_data_.initial_pressure =
156 this->calculateReservoirEquilibrium();
158 const auto& tables = this->ebos_simulator_.vanguard()
159 .eclState().getTableManager();
161 this->aqufetp_data_.finishInitialisation(tables);
164 this->rhow_ = this->aqufetp_data_.waterDensity();
165 this->pa0_ = this->aqufetp_data_.initial_pressure.value();
166 this->aquifer_pressure_ = this->pa0_;
169 virtual Scalar aquiferDepth()
const override
171 return this->aqufetp_data_.datum_depth;
Definition: AquiferFetkovich.hpp:37
Definition: AquiferInterface.hpp:49
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:27