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> 48 template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
49 GenericThresholdPressure<Grid,GridView,ElementMapper,Scalar>::
50 GenericThresholdPressure(
const CartesianIndexMapper& cartMapper,
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_)
63 template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
64 Scalar GenericThresholdPressure<Grid,GridView,ElementMapper,Scalar>::
65 thresholdPressure(
int elem1Idx,
int elem2Idx)
const 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];
101 template<
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);
153 template<
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_();
204 template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
205 void GenericThresholdPressure<Grid,GridView,ElementMapper,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;
231 template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
233 GenericThresholdPressure<Grid,GridView,ElementMapper,Scalar>::
234 getRestartVector()
const 236 if (!enableThresholdPressure_) {
240 return this->thpres_;
243 template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
248 return this->enableThresholdPressure_;
252 template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class Scalar>
254 GenericThresholdPressure<Grid,GridView,ElementMapper,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,
'-'));
303 #endif // OPM_GENERIC_THRESHOLD_PRESSURE_IMPL_HPP This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Definition: GenericThresholdPressure.hpp:43