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/linalg/ParallelIstlInformation.hpp>
26 #include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
28 #include <dune/grid/common/gridenums.hh>
33 #include <type_traits>
34 #include <unordered_map>
48 namespace RegionAverageCalculator {
61 template <
class Flu
idSystem,
class Region>
75 , attr_ (rmap_, Attributes())
83 template <
typename ElementContext,
class EbosSimulator>
89 const auto& gridView = simulator.gridView();
90 const auto& comm = gridView.comm();
91 for (
const auto& reg : rmap_.activeRegions()) {
92 numRegions = std::max(numRegions, reg);
94 numRegions = comm.max(numRegions);
95 for (
int reg = 1; reg <= numRegions ; ++ reg) {
97 attr_.insert(reg, Attributes());
101 for (
int reg = 1; reg <= numRegions ; ++ reg) {
102 auto& ra = attr_.attributes(reg);
109 std::unordered_map<RegionId, Attributes> attributes_pv;
112 std::unordered_map<RegionId, Attributes> attributes_hpv;
114 for (
int reg = 1; reg <= numRegions ; ++ reg) {
115 attributes_pv.insert({reg, Attributes()});
116 attributes_hpv.insert({reg, Attributes()});
119 ElementContext elemCtx( simulator );
120 const auto& elemEndIt = gridView.template end<0>();
121 OPM_BEGIN_PARALLEL_TRY_CATCH();
123 for (
auto elemIt = gridView.template begin</*codim=*/0>();
128 const auto& elem = *elemIt;
129 if (elem.partitionType() != Dune::InteriorEntity)
132 elemCtx.updatePrimaryStencil(elem);
133 elemCtx.updatePrimaryIntensiveQuantities(0);
134 const unsigned cellIdx = elemCtx.globalSpaceIndex(0, 0);
135 const auto& intQuants = elemCtx.intensiveQuantities(0, 0);
136 const auto& fs = intQuants.fluidState();
138 const double pv_cell =
139 simulator.model().dofTotalVolume(cellIdx)
140 * intQuants.porosity().value();
143 double hydrocarbon = 1.0;
144 const auto& pu = phaseUsage_;
146 hydrocarbon -= fs.saturation(FluidSystem::waterPhaseIdx).value();
149 const int reg = rmap_.region(cellIdx);
153 const double hydrocarbonPV = pv_cell*hydrocarbon;
154 if (hydrocarbonPV > 0.) {
155 auto& attr = attributes_hpv[reg];
156 attr.pv += hydrocarbonPV;
158 attr.pressure += fs.pressure(FluidSystem::oilPhaseIdx).value() * hydrocarbonPV;
161 attr.pressure += fs.pressure(FluidSystem::gasPhaseIdx).value() * hydrocarbonPV;
166 auto& attr = attributes_pv[reg];
169 attr.pressure += fs.pressure(FluidSystem::oilPhaseIdx).value() * pv_cell;
171 attr.pressure += fs.pressure(FluidSystem::gasPhaseIdx).value() * pv_cell;
174 attr.pressure += fs.pressure(FluidSystem::waterPhaseIdx).value() * pv_cell;
178 OPM_END_PARALLEL_TRY_CATCH(
"AverageRegionalPressure::defineState(): ", simulator.vanguard().grid().comm());
180 for (
int reg = 1; reg <= numRegions ; ++ reg) {
181 auto& ra = attr_.attributes(reg);
182 const double hpv_sum = comm.sum(attributes_hpv[reg].pv);
185 const auto& attri_hpv = attributes_hpv[reg];
186 const double p_hpv_sum = comm.sum(attri_hpv.pressure);
187 ra.pressure = p_hpv_sum / hpv_sum;
190 const auto& attri_pv = attributes_pv[reg];
191 const double pv_sum = comm.sum(attri_pv.pv);
194 const double p_pv_sum = comm.sum(attri_pv.pressure);
195 ra.pressure = p_pv_sum / pv_sum;
206 typedef typename RegionMapping<Region>::RegionId
RegionId;
218 int num_active_regions = 0;
219 for (
const auto& attr : attr_.attributes()) {
220 const auto& value = *attr.second;
221 const auto& ra = value.attr_;
223 num_active_regions ++;
225 return pressure / num_active_regions;
228 const auto& ra = attr_.attributes(r);
242 const RegionMapping<Region> rmap_;
259 RegionAttributeHelpers::RegionAttributes<RegionId, Attributes> attr_;
Computes hydrocarbon weighed average pressures over regions.
Definition: RegionAverageCalculator.hpp:62
void defineState(const EbosSimulator &simulator)
Compute pore volume averaged hydrocarbon state pressure, *.
Definition: RegionAverageCalculator.hpp:84
AverageRegionalPressure(const PhaseUsage &phaseUsage, const Region ®ion)
Constructor.
Definition: RegionAverageCalculator.hpp:71
double pressure(const RegionId r) const
Average pressure.
Definition: RegionAverageCalculator.hpp:213
RegionMapping< Region >::RegionId RegionId
Region identifier.
Definition: RegionAverageCalculator.hpp:206
bool water(const PhaseUsage &pu)
Active water predicate.
Definition: RegionAttributeHelpers.hpp:309
bool oil(const PhaseUsage &pu)
Active oil predicate.
Definition: RegionAttributeHelpers.hpp:322
bool gas(const PhaseUsage &pu)
Active gas predicate.
Definition: RegionAttributeHelpers.hpp:335
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:26
PhaseUsage phaseUsage(const Phases &phases)
Determine the active phases.
Definition: phaseUsageFromDeck.cpp:33
Definition: BlackoilPhases.hpp:45