add parameter to set threshold for only water cells. Default is 1.0

This commit is contained in:
Tor Harald Sandve 2023-08-16 16:19:41 +02:00
parent 60c65ec661
commit da06e423d5
2 changed files with 19 additions and 8 deletions

View File

@ -57,6 +57,8 @@ template<class TypeTag, class MyTypeTag>
struct TemperatureMin { using type = UndefinedProperty; }; struct TemperatureMin { using type = UndefinedProperty; };
template<class TypeTag, class MyTypeTag> template<class TypeTag, class MyTypeTag>
struct MaximumWaterSaturation { using type = UndefinedProperty; }; struct MaximumWaterSaturation { using type = UndefinedProperty; };
template<class TypeTag, class MyTypeTag>
struct WaterOnlyThreshold { using type = UndefinedProperty; };
template<class TypeTag> template<class TypeTag>
struct DpMaxRel<TypeTag, TTag::NewtonMethod> struct DpMaxRel<TypeTag, TTag::NewtonMethod>
{ {
@ -101,6 +103,12 @@ struct MaximumWaterSaturation<TypeTag, TTag::NewtonMethod>
using type = GetPropType<TypeTag, Scalar>; using type = GetPropType<TypeTag, Scalar>;
static constexpr type value = 1.0; static constexpr type value = 1.0;
}; };
template<class TypeTag>
struct WaterOnlyThreshold<TypeTag, TTag::NewtonMethod>
{
using type = GetPropType<TypeTag, Scalar>;
static constexpr type value = 1.0;
};
} // namespace Opm::Properties } // namespace Opm::Properties
namespace Opm { namespace Opm {
@ -139,6 +147,7 @@ public:
tempMax_ = EWOMS_GET_PARAM(TypeTag, Scalar, TemperatureMax); tempMax_ = EWOMS_GET_PARAM(TypeTag, Scalar, TemperatureMax);
tempMin_ = EWOMS_GET_PARAM(TypeTag, Scalar, TemperatureMin); tempMin_ = EWOMS_GET_PARAM(TypeTag, Scalar, TemperatureMin);
waterSaturationMax_ = EWOMS_GET_PARAM(TypeTag, Scalar, MaximumWaterSaturation); waterSaturationMax_ = EWOMS_GET_PARAM(TypeTag, Scalar, MaximumWaterSaturation);
waterOnlyThreshold_ = EWOMS_GET_PARAM(TypeTag, Scalar, WaterOnlyThreshold);
} }
/*! /*!
@ -168,6 +177,7 @@ public:
EWOMS_REGISTER_PARAM(TypeTag, Scalar, TemperatureMax, "Maximum absolute temperature"); EWOMS_REGISTER_PARAM(TypeTag, Scalar, TemperatureMax, "Maximum absolute temperature");
EWOMS_REGISTER_PARAM(TypeTag, Scalar, TemperatureMin, "Minimum absolute temperature"); EWOMS_REGISTER_PARAM(TypeTag, Scalar, TemperatureMin, "Minimum absolute temperature");
EWOMS_REGISTER_PARAM(TypeTag, Scalar, MaximumWaterSaturation, "Maximum water saturation"); EWOMS_REGISTER_PARAM(TypeTag, Scalar, MaximumWaterSaturation, "Maximum water saturation");
EWOMS_REGISTER_PARAM(TypeTag, Scalar, WaterOnlyThreshold, "Cells with water saturation above or equal is considered one-phase water only");
} }
/*! /*!
@ -458,9 +468,9 @@ protected:
// use a threshold value after a switch to make it harder to switch back // use a threshold value after a switch to make it harder to switch back
// immediately. // immediately.
if (wasSwitched_[globalDofIdx]) if (wasSwitched_[globalDofIdx])
wasSwitched_[globalDofIdx] = nextValue.adaptPrimaryVariables(this->problem(), globalDofIdx, waterSaturationMax_, priVarOscilationThreshold_); wasSwitched_[globalDofIdx] = nextValue.adaptPrimaryVariables(this->problem(), globalDofIdx, waterSaturationMax_, waterOnlyThreshold_, priVarOscilationThreshold_);
else else
wasSwitched_[globalDofIdx] = nextValue.adaptPrimaryVariables(this->problem(), globalDofIdx, waterSaturationMax_); wasSwitched_[globalDofIdx] = nextValue.adaptPrimaryVariables(this->problem(), globalDofIdx, waterSaturationMax_, waterOnlyThreshold_);
if (wasSwitched_[globalDofIdx]) if (wasSwitched_[globalDofIdx])
++ numPriVarsSwitched_; ++ numPriVarsSwitched_;
@ -476,6 +486,8 @@ private:
Scalar priVarOscilationThreshold_; Scalar priVarOscilationThreshold_;
Scalar waterSaturationMax_; Scalar waterSaturationMax_;
Scalar waterOnlyThreshold_;
Scalar dpMaxRel_; Scalar dpMaxRel_;
Scalar dsMax_; Scalar dsMax_;
bool projectSaturations_; bool projectSaturations_;

View File

@ -493,10 +493,8 @@ public:
* *
* \return true Iff the interpretation of one of the switching variables was changed * \return true Iff the interpretation of one of the switching variables was changed
*/ */
bool adaptPrimaryVariables(const Problem& problem, unsigned globalDofIdx, Scalar swMaximum, Scalar eps = 0.0) bool adaptPrimaryVariables(const Problem& problem, unsigned globalDofIdx, Scalar swMaximum, Scalar thresholdWaterFilledCell, Scalar eps = 0.0)
{ {
static const Scalar thresholdWaterFilledCell = 1.0 - eps;
// this function accesses quite a few black-oil specific low-level functions // this function accesses quite a few black-oil specific low-level functions
// directly for better performance (instead of going the canonical way through // directly for better performance (instead of going the canonical way through
// the IntensiveQuantities). The reason is that most intensive quantities are not // the IntensiveQuantities). The reason is that most intensive quantities are not
@ -546,9 +544,10 @@ public:
// keep track if any meaning has changed // keep track if any meaning has changed
bool changed = false; bool changed = false;
// special case cells with almost only water // Special case for cells with almost only water
// use both saturations (if the phase is enabled) // for these cells both saturations (if the phase is enabled) is used
// if dissolved gas in water is enabled we shouldn't enter // to avoid singular systems.
// If dissolved gas in water is enabled we shouldn't enter
// here but instead switch to Rsw as primary variable // here but instead switch to Rsw as primary variable
// as sw >= 1.0 -> gas <= 0 (i.e. gas phase disappears) // as sw >= 1.0 -> gas <= 0 (i.e. gas phase disappears)
if (sw >= thresholdWaterFilledCell && !FluidSystem::enableDissolvedGasInWater()) { if (sw >= thresholdWaterFilledCell && !FluidSystem::enableDissolvedGasInWater()) {