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;
55 const Simulator& simulator,
56 const Aquifetp::AQUFETP_data& aqufetp_data)
57 :
Base(aqufetp_data.aquiferID, connections, simulator)
58 , aqufetp_data_(aqufetp_data)
66 result.pressure_previous_ = {1.0, 2.0, 3.0};
67 result.pressure_current_ = {4.0, 5.0};
68 result.Qai_ = {{6.0}};
71 result.aquifer_pressure_ = 9.0;
76 void endTimeStep()
override
78 for (
const auto& q : this->Qai_) {
79 this->W_flux_ += q * this->simulator_.timeStepSize();
81 aquifer_pressure_ = aquiferPressure();
84 data::AquiferData aquiferData()
const override
87 auto data = data::AquiferData{};
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
94 return flux + q.value();
96 data.volume = this->W_flux_.value();
97 data.initPressure = this->pa0_;
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();
107 template<
class Serializer>
108 void serializeOp(Serializer& serializer)
110 serializer(
static_cast<Base&
>(*
this));
111 serializer(aquifer_pressure_);
116 return static_cast<const Base&
>(*this) == rhs &&
117 this->aquifer_pressure_ == rhs.aquifer_pressure_;
122 Aquifetp::AQUFETP_data aqufetp_data_;
123 Scalar aquifer_pressure_;
125 void assignRestartData(
const data::AquiferData& xaq)
override
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"
134 this->aquifer_pressure_ = xaq.pressure;
135 this->rhow_ = this->aqufetp_data_.waterDensity();
138 inline Eval dpai(
int idx)
141 this->gravity_() * (this->cell_depth_[idx] - this->aquiferDepth());
143 return this->aquifer_pressure_ + this->rhow_*gdz
144 - this->pressure_current_.at(idx);
148 inline Scalar aquiferPressure()
150 Scalar Flux = this->W_flux_.value();
152 const auto& comm = this->simulator_.vanguard().grid().comm();
156 this->aqufetp_data_.total_compr * this->aqufetp_data_.initial_watvolume;
158 return this->pa0_ - (Flux / denom);
161 inline void calculateAquiferConstants()
override
163 this->Tc_ = this->aqufetp_data_.timeConstant();
167 inline void calculateInflowRate(
int idx,
const Simulator& simulator)
override
169 const Scalar td_Tc_ = simulator.timeStepSize() / this->Tc_;
170 const Scalar coef = (1 - exp(-td_Tc_)) / td_Tc_;
172 this->Qai_.at(idx) = coef * this->alphai_[idx] *
173 this->aqufetp_data_.prod_index * dpai(idx);
176 inline void calculateAquiferCondition()
override
178 if (this->solution_set_from_restart_) {
182 if (! this->aqufetp_data_.initial_pressure.has_value()) {
183 this->aqufetp_data_.initial_pressure =
184 this->calculateReservoirEquilibrium();
186 const auto& tables = this->simulator_.vanguard()
187 .eclState().getTableManager();
189 this->aqufetp_data_.finishInitialisation(tables);
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_;
199 virtual Scalar aquiferDepth()
const override
201 return this->aqufetp_data_.datum_depth;