23#ifndef OPM_GENERIC_THRESHOLD_PRESSURE_IMPL_HPP
24#define OPM_GENERIC_THRESHOLD_PRESSURE_IMPL_HPP
28#include <dune/grid/common/mcmgmapper.hh>
29#include <dune/grid/common/rangegenerators.hh>
31#include <opm/common/ErrorMacros.hpp>
33#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
34#include <opm/input/eclipse/EclipseState/Grid/FieldPropsManager.hpp>
35#include <opm/input/eclipse/EclipseState/Tables/Eqldims.hpp>
36#include <opm/input/eclipse/EclipseState/SimulationConfig/SimulationConfig.hpp>
37#include <opm/input/eclipse/EclipseState/SimulationConfig/ThresholdPressure.hpp>
39#include <fmt/format.h>
48template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
51 const GridView& gridView,
52 const ElementMapper& elementMapper,
53 const EclipseState& eclState)
54 : cartMapper_(cartMapper)
56 , elementMapper_(elementMapper)
57 , lookUpData_(gridView)
58 , lookUpCartesianData_(gridView, cartMapper_)
63template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
67 if (!enableThresholdPressure_)
71 if (!thpresftValues_.empty()) {
73 int fault1Idx = lookUpCartesianData_(elem1Idx, cartElemFaultIdx_);
74 int fault2Idx = lookUpCartesianData_(elem2Idx, cartElemFaultIdx_);
76 if (fault1Idx != -1 && fault1Idx == fault2Idx) {
81 if (fault1Idx != fault2Idx) {
84 Scalar val1 = (fault1Idx >= 0) ? thpresftValues_[fault1Idx] : 0.0;
85 Scalar val2 = (fault2Idx >= 0) ? thpresftValues_[fault2Idx] : 0.0;
86 return std::max(val1, val2);
91 auto equilRegion1Idx = elemEquilRegion_[elem1Idx];
92 auto equilRegion2Idx = elemEquilRegion_[elem2Idx];
94 if (equilRegion1Idx == equilRegion2Idx) {
98 return thpres_[equilRegion1Idx*numEquilRegions_ + equilRegion2Idx];
101template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
105 const auto& simConfig = eclState_.getSimulationConfig();
107 enableThresholdPressure_ = simConfig.useThresholdPressure();
108 if (!enableThresholdPressure_) {
112 numEquilRegions_ = eclState_.getTableManager().getEqldims().getNumEquilRegions();
113 const decltype(numEquilRegions_) maxRegions =
114 std::numeric_limits<std::decay_t<
decltype(elemEquilRegion_[0])>>::max();
116 if (numEquilRegions_ > maxRegions) {
119 OPM_THROW(std::invalid_argument,
120 (fmt::format(
"The maximum number of supported "
121 "equilibration regions by OPM flow is {}, but "
123 maxRegions, numEquilRegions_)));
126 if (numEquilRegions_ > 2048) {
128 OpmLog::warning(fmt::format(
"Number of equilibration regions is {}, which is "
129 "rather large. Note, that this might "
130 "have a negative impact on performance "
131 "and memory consumption.", numEquilRegions_));
135 elemEquilRegion_ = lookUpData_.
136 template assignFieldPropsIntOnLeaf<short unsigned int>(eclState_.fieldProps(),
144 if (simConfig.getThresholdPressure().restart()) {
149 thpres_.resize(numEquilRegions_*numEquilRegions_, 0.0);
150 thpresDefault_.resize(numEquilRegions_*numEquilRegions_, 0.0);
153template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
157 const SimulationConfig& simConfig = eclState_.getSimulationConfig();
158 const auto& thpres = simConfig.getThresholdPressure();
162 for (
const auto& elem : elements(gridView_, Dune::Partitions::interior)) {
163 for (
const auto& intersection : intersections(gridView_, elem)) {
164 if (intersection.boundary()) {
167 else if (!intersection.neighbor()) {
171 const auto& inside = intersection.inside();
172 const auto& outside = intersection.outside();
174 auto equilRegionInside = elemEquilRegion_[elementMapper_.index(inside)];
175 auto equilRegionOutside = elemEquilRegion_[elementMapper_.index(outside)];
177 if (thpres.hasRegionBarrier(equilRegionInside + 1, equilRegionOutside + 1)) {
179 if (thpres.hasThresholdPressure(equilRegionInside + 1, equilRegionOutside + 1)) {
181 pth = thpres.getThresholdPressure(equilRegionInside + 1, equilRegionOutside + 1);
185 unsigned offset = equilRegionInside*numEquilRegions_ + equilRegionOutside;
186 pth = thpresDefault_[offset];
189 unsigned offset1 = equilRegionInside*numEquilRegions_ + equilRegionOutside;
190 unsigned offset2 = equilRegionOutside*numEquilRegions_ + equilRegionInside;
192 thpres_[offset1] = pth;
193 thpres_[offset2] = pth;
199 if (thpres.ftSize() > 0) {
200 configureThpresft_();
204template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
209 const FaultCollection& faults = eclState_.getFaults();
210 const SimulationConfig& simConfig = eclState_.getSimulationConfig();
211 const auto& thpres = simConfig.getThresholdPressure();
214 int numFaults = faults.size();
215 int numCartesianElem = eclState_.getInputGrid().getCartesianSize();
216 thpresftValues_.resize(numFaults, -1.0);
217 cartElemFaultIdx_.resize(numCartesianElem, -1);
218 for (std::size_t faultIdx = 0; faultIdx < faults.size(); ++faultIdx) {
219 const auto& fault = faults.getFault(faultIdx);
220 thpresftValues_[faultIdx] = thpres.getThresholdPressureFault(faultIdx);
221 for (
const FaultFace& face : fault) {
224 for (std::size_t cartElemIdx : face) {
225 cartElemFaultIdx_[cartElemIdx] = faultIdx;
231template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
236 if (!enableThresholdPressure_) {
240 return this->thpres_;
243template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
248 return this->enableThresholdPressure_;
252template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
257 if (!enableThresholdPressure_) {
261 auto lineFormat = [
this](
unsigned i,
unsigned j,
double val)
263 const auto& units = eclState_.getUnits();
264 return fmt::format(
"{:4}{:>6}{:23}{:>6}{:24}{:>11.07}{:7}{}\n",
267 " ", units.from_si(UnitSystem::measure::pressure, val),
268 " ", units.name(UnitSystem::measure::pressure));
270 auto lineFormatS = [](
auto s1,
auto s2,
auto s3)
272 return fmt::format(
"{:4}{:^16}{:13}{:^9}{:21}{:^18}\n",
273 " ", s1,
" ", s2,
" ", s3);
276 std::string str =
"\nLIST OF ALL NON-ZERO THRESHOLD PRESSURES\n"
277 "----------------------------------------\n"
279 str += lineFormatS(
"FLOW FROM REGION",
"TO REGION",
"THRESHOLD PRESSURE");
280 str += lineFormatS(std::string(16,
'-'), std::string(9,
'-'), std::string(18,
'-'));
281 const auto& simConfig = eclState_.getSimulationConfig();
282 const auto& thpres = simConfig.getThresholdPressure();
284 for (
unsigned i = 1; i <= numEquilRegions_; ++i) {
285 for (
unsigned j = (thpres.irreversible() ? 1 : i); j <= numEquilRegions_; ++j) {
286 if (thpres.hasRegionBarrier(i, j)) {
287 if (thpres.hasThresholdPressure(i, j)) {
288 str += lineFormat(i, j, thpres.getThresholdPressure(j, i));
291 std::size_t idx = (j - 1) * numEquilRegions_ + (i - 1);
292 str += lineFormat(i, j, this->thpresDefault_[idx]);
297 str += lineFormatS(std::string(16,
'-'), std::string(9,
'-'), std::string(18,
'-'));
Definition: CollectDataOnIORank.hpp:49
void configureThpresft_()
Definition: GenericThresholdPressure_impl.hpp:206
void logPressures()
Definition: GenericThresholdPressure_impl.hpp:255
void finishInit()
Actually compute the threshold pressures over a face as a pre-compute step.
Definition: GenericThresholdPressure_impl.hpp:103
GenericThresholdPressure(const CartesianIndexMapper &cartMapper, const GridView &gridView, const ElementMapper &elementMapper, const EclipseState &eclState)
Definition: GenericThresholdPressure_impl.hpp:50
bool enableThresholdPressure() const
Definition: GenericThresholdPressure_impl.hpp:246
Scalar thresholdPressure(int elem1Idx, int elem2Idx) const
Returns the theshold pressure [Pa] for the intersection between two elements.
Definition: GenericThresholdPressure_impl.hpp:65
std::vector< Scalar > getRestartVector() const
Returns a fully expanded vector for restart file writing.
Definition: GenericThresholdPressure_impl.hpp:234
void applyExplicitThresholdPressures_()
Definition: GenericThresholdPressure_impl.hpp:155
Definition: blackoilboundaryratevector.hh:39