20#ifndef OPM_REGIONAVERAGECALCULATOR_HPP_HEADER_INCLUDED
21#define OPM_REGIONAVERAGECALCULATOR_HPP_HEADER_INCLUDED
23#include <opm/core/props/BlackoilPhases.hpp>
24#include <opm/simulators/wells/RegionAttributeHelpers.hpp>
25#include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
27#include <dune/grid/common/gridenums.hh>
28#include <dune/grid/common/rangegenerators.hh>
36#include <unordered_map>
51 namespace RegionAverageCalculator {
64 template <
class Flu
idSystem,
class Region>
78 , attr_ (rmap_, Attributes())
86 template <
typename ElementContext,
class EbosSimulator>
92 const auto& gridView = simulator.gridView();
93 const auto& comm = gridView.comm();
94 for (
const auto& reg : rmap_.activeRegions()) {
95 numRegions = std::max(numRegions, reg);
97 numRegions = comm.max(numRegions);
98 for (
int reg = 1; reg <= numRegions ; ++ reg) {
100 attr_.insert(reg, Attributes());
104 for (
int reg = 1; reg <= numRegions ; ++ reg) {
105 auto& ra = attr_.attributes(reg);
112 std::unordered_map<RegionId, Attributes> attributes_pv;
115 std::unordered_map<RegionId, Attributes> attributes_hpv;
117 for (
int reg = 1; reg <= numRegions ; ++ reg) {
118 attributes_pv.insert({reg, Attributes()});
119 attributes_hpv.insert({reg, Attributes()});
122 ElementContext elemCtx( simulator );
124 OPM_BEGIN_PARALLEL_TRY_CATCH();
125 for (
const auto& elem : elements(gridView, Dune::Partitions::interior)) {
126 elemCtx.updatePrimaryStencil(elem);
127 elemCtx.updatePrimaryIntensiveQuantities(0);
128 const unsigned cellIdx = elemCtx.globalSpaceIndex(0, 0);
129 const auto& intQuants = elemCtx.intensiveQuantities(0, 0);
130 const auto& fs = intQuants.fluidState();
132 const double pv_cell =
133 simulator.model().dofTotalVolume(cellIdx)
134 * intQuants.porosity().value();
137 double hydrocarbon = 1.0;
138 const auto& pu = phaseUsage_;
140 hydrocarbon -= fs.saturation(FluidSystem::waterPhaseIdx).value();
143 const int reg = rmap_.region(cellIdx);
147 const double hydrocarbonPV = pv_cell*hydrocarbon;
148 if (hydrocarbonPV > 0.) {
149 auto& attr = attributes_hpv[reg];
150 attr.pv += hydrocarbonPV;
152 attr.pressure += fs.pressure(FluidSystem::oilPhaseIdx).value() * hydrocarbonPV;
155 attr.pressure += fs.pressure(FluidSystem::gasPhaseIdx).value() * hydrocarbonPV;
160 auto& attr = attributes_pv[reg];
163 attr.pressure += fs.pressure(FluidSystem::oilPhaseIdx).value() * pv_cell;
165 attr.pressure += fs.pressure(FluidSystem::gasPhaseIdx).value() * pv_cell;
168 attr.pressure += fs.pressure(FluidSystem::waterPhaseIdx).value() * pv_cell;
172 OPM_END_PARALLEL_TRY_CATCH(
"AverageRegionalPressure::defineState(): ", simulator.vanguard().grid().comm());
174 for (
int reg = 1; reg <= numRegions ; ++ reg) {
175 auto& ra = attr_.attributes(reg);
176 const double hpv_sum = comm.sum(attributes_hpv[reg].pv);
179 const auto& attri_hpv = attributes_hpv[reg];
180 const double p_hpv_sum = comm.sum(attri_hpv.pressure);
181 ra.pressure = p_hpv_sum / hpv_sum;
184 const auto& attri_pv = attributes_pv[reg];
185 const double pv_sum = comm.sum(attri_pv.pv);
188 const double p_pv_sum = comm.sum(attri_pv.pressure);
189 ra.pressure = p_pv_sum / pv_sum;
200 typedef typename RegionMapping<Region>::RegionId
RegionId;
212 int num_active_regions = 0;
213 for (
const auto& attr : attr_.attributes()) {
214 const auto& value = *attr.second;
215 const auto& ra = value.attr_;
217 num_active_regions ++;
219 return pressure / num_active_regions;
222 const auto& ra = attr_.attributes(r);
236 const RegionMapping<Region> rmap_;
253 RegionAttributeHelpers::RegionAttributes<RegionId, Attributes> attr_;
Computes hydrocarbon weighed average pressures over regions.
Definition: RegionAverageCalculator.hpp:65
void defineState(const EbosSimulator &simulator)
Compute pore volume averaged hydrocarbon state pressure, *.
Definition: RegionAverageCalculator.hpp:87
AverageRegionalPressure(const PhaseUsage &phaseUsage, const Region ®ion)
Constructor.
Definition: RegionAverageCalculator.hpp:74
double pressure(const RegionId r) const
Average pressure.
Definition: RegionAverageCalculator.hpp:207
RegionMapping< Region >::RegionId RegionId
Region identifier.
Definition: RegionAverageCalculator.hpp:200
bool water(const PhaseUsage &pu)
Active water predicate.
Definition: RegionAttributeHelpers.hpp:308
bool oil(const PhaseUsage &pu)
Active oil predicate.
Definition: RegionAttributeHelpers.hpp:321
bool gas(const PhaseUsage &pu)
Active gas predicate.
Definition: RegionAttributeHelpers.hpp:334
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:27
PhaseUsage phaseUsage(const Phases &phases)
Determine the active phases.
Definition: phaseUsageFromDeck.cpp:37
Definition: BlackoilPhases.hpp:46