20#ifndef OPM_AQUIFERCONSTANTFLUX_HPP
21#define OPM_AQUIFERCONSTANTFLUX_HPP
23#include <opm/simulators/aquifers/AquiferInterface.hpp>
25#include <opm/input/eclipse/EclipseState/Aquifer/Aquancon.hpp>
26#include <opm/input/eclipse/EclipseState/Aquifer/AquiferFlux.hpp>
27#include <opm/input/eclipse/EclipseState/Grid/FaceDir.hpp>
29#include <opm/common/ErrorMacros.hpp>
31#include <opm/material/common/MathToolbox.hpp>
32#include <opm/material/densead/Evaluation.hpp>
40template<
typename TypeTag>
44 using RateVector = GetPropType<TypeTag, Properties::RateVector>;
45 using Simulator = GetPropType<TypeTag, Properties::Simulator>;
46 using ElementMapper = GetPropType<TypeTag, Properties::ElementMapper>;
47 using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
48 using BlackoilIndices = GetPropType<TypeTag, Properties::Indices>;
50 static constexpr int numEq = BlackoilIndices::numEq;
51 using Eval = DenseAd::Evaluation<double, numEq>;
54 const Simulator& ebos_simulator,
55 const SingleAquiferFlux& aquifer)
57 , connections_ (connections)
58 , aquifer_data_ (aquifer)
59 , connection_flux_ (connections_.size(), Eval{0})
61 this->initializeConnections();
67 result.cumulative_flux_ = 1.0;
74 void updateAquifer(
const SingleAquiferFlux& aquifer)
76 aquifer_data_ = aquifer;
79 void initFromRestart(
const data::Aquifers& )
override {
82 void initialSolutionApplied()
override {
86 void beginTimeStep()
override
89 void endTimeStep()
override
91 this->flux_rate_ = this->totalFluxRate();
92 this->cumulative_flux_ +=
93 this->flux_rate_ * this->ebos_simulator_.timeStepSize();
96 data::AquiferData aquiferData()
const override
98 data::AquiferData data;
100 data.aquiferID = this->aquifer_data_.id;
104 data.fluxRate = this->totalFluxRate();
106 data.volume = this->cumulative_flux_;
109 data.initPressure = 0.0;
114 void addToSource(RateVector& rates,
115 const unsigned cellIdx,
116 [[maybe_unused]]
const unsigned timeIdx)
override
118 const int idx = this->cellToConnectionIdx_[cellIdx];
123 const auto& model = this->ebos_simulator_.model();
125 const auto fw = this->aquifer_data_.flux;
127 this->connection_flux_[idx] = fw * this->connections_[idx].effective_facearea;
129 rates[BlackoilIndices::conti0EqIdx + compIdx_()]
130 += this->connection_flux_[idx] / model.dofTotalVolume(cellIdx);
133 template<
class Serializer>
134 void serializeOp(Serializer& serializer)
136 serializer(cumulative_flux_);
141 return this->cumulative_flux_ == rhs.cumulative_flux_;
145 const std::vector<Aquancon::AquancCell>& connections_;
147 SingleAquiferFlux aquifer_data_;
148 std::vector<Eval> connection_flux_{};
149 std::vector<int> cellToConnectionIdx_{};
151 double cumulative_flux_{};
153 void initializeConnections() {
154 this->cellToConnectionIdx_.resize(this->ebos_simulator_.gridView().size(0), -1);
155 for (std::size_t idx = 0; idx < this->connections_.size(); ++idx) {
156 const auto global_index = this->connections_[idx].global_index;
157 const int cell_index = this->ebos_simulator_.vanguard()
158 .compressedIndexForInterior(global_index);
160 if (cell_index < 0) {
164 this->cellToConnectionIdx_[cell_index] = idx;
175 if (this->co2store_())
176 return FluidSystem::oilCompIdx;
178 return FluidSystem::waterCompIdx;
181 double totalFluxRate()
const
183 return std::accumulate(this->connection_flux_.begin(),
184 this->connection_flux_.end(), 0.0,
185 [](
const double rate,
const auto& q)
187 return rate + getValue(q);
Definition: AquiferConstantFlux.hpp:42
Definition: AquiferInterface.hpp:35
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:27