mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Merge pull request #610 from hnil/pure_saturation_chopping
Pure saturation chopping
This commit is contained in:
commit
344f6587fa
@ -39,10 +39,12 @@ BEGIN_PROPERTIES
|
|||||||
NEW_PROP_TAG(DpMaxRel);
|
NEW_PROP_TAG(DpMaxRel);
|
||||||
NEW_PROP_TAG(DsMax);
|
NEW_PROP_TAG(DsMax);
|
||||||
NEW_PROP_TAG(PriVarOscilationThreshold);
|
NEW_PROP_TAG(PriVarOscilationThreshold);
|
||||||
|
NEW_PROP_TAG(ProjectSaturations);
|
||||||
|
|
||||||
SET_SCALAR_PROP(NewtonMethod, DpMaxRel, 0.3);
|
SET_SCALAR_PROP(NewtonMethod, DpMaxRel, 0.3);
|
||||||
SET_SCALAR_PROP(NewtonMethod, DsMax, 0.2);
|
SET_SCALAR_PROP(NewtonMethod, DsMax, 0.2);
|
||||||
SET_SCALAR_PROP(NewtonMethod, PriVarOscilationThreshold, 1e-5);
|
SET_SCALAR_PROP(NewtonMethod, PriVarOscilationThreshold, 1e-5);
|
||||||
|
SET_BOOL_PROP(NewtonMethod, ProjectSaturations, false);
|
||||||
|
|
||||||
END_PROPERTIES
|
END_PROPERTIES
|
||||||
|
|
||||||
@ -74,6 +76,7 @@ public:
|
|||||||
priVarOscilationThreshold_ = EWOMS_GET_PARAM(TypeTag, Scalar, PriVarOscilationThreshold);
|
priVarOscilationThreshold_ = EWOMS_GET_PARAM(TypeTag, Scalar, PriVarOscilationThreshold);
|
||||||
dpMaxRel_ = EWOMS_GET_PARAM(TypeTag, Scalar, DpMaxRel);
|
dpMaxRel_ = EWOMS_GET_PARAM(TypeTag, Scalar, DpMaxRel);
|
||||||
dsMax_ = EWOMS_GET_PARAM(TypeTag, Scalar, DsMax);
|
dsMax_ = EWOMS_GET_PARAM(TypeTag, Scalar, DsMax);
|
||||||
|
projectSaturations_ = EWOMS_GET_PARAM(TypeTag, bool, ProjectSaturations);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -98,6 +101,7 @@ public:
|
|||||||
EWOMS_REGISTER_PARAM(TypeTag, Scalar, DsMax, "Maximum absolute change of any saturation in a single iteration");
|
EWOMS_REGISTER_PARAM(TypeTag, Scalar, DsMax, "Maximum absolute change of any saturation in a single iteration");
|
||||||
EWOMS_REGISTER_PARAM(TypeTag, Scalar, PriVarOscilationThreshold,
|
EWOMS_REGISTER_PARAM(TypeTag, Scalar, PriVarOscilationThreshold,
|
||||||
"The threshold value for the primary variable switching conditions after its meaning has switched to hinder oscilations");
|
"The threshold value for the primary variable switching conditions after its meaning has switched to hinder oscilations");
|
||||||
|
EWOMS_REGISTER_PARAM(TypeTag,bool, ProjectSaturations, "Option for doing saturation projection");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -309,6 +313,9 @@ protected:
|
|||||||
|
|
||||||
if (wasSwitched_[globalDofIdx])
|
if (wasSwitched_[globalDofIdx])
|
||||||
++ numPriVarsSwitched_;
|
++ numPriVarsSwitched_;
|
||||||
|
if(projectSaturations_){
|
||||||
|
nextValue.chopAndNormalizeSaturations();
|
||||||
|
}
|
||||||
|
|
||||||
nextValue.checkDefined();
|
nextValue.checkDefined();
|
||||||
}
|
}
|
||||||
@ -319,6 +326,7 @@ private:
|
|||||||
Scalar priVarOscilationThreshold_;
|
Scalar priVarOscilationThreshold_;
|
||||||
Scalar dpMaxRel_;
|
Scalar dpMaxRel_;
|
||||||
Scalar dsMax_;
|
Scalar dsMax_;
|
||||||
|
bool projectSaturations_;
|
||||||
|
|
||||||
// keep track of cells where the primary variable meaning has changed
|
// keep track of cells where the primary variable meaning has changed
|
||||||
// to detect and hinder oscillations
|
// to detect and hinder oscillations
|
||||||
|
@ -565,6 +565,83 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool chopAndNormalizeSaturations(){
|
||||||
|
if (primaryVarsMeaning() == OnePhase_p){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Scalar Sw = 0.0;
|
||||||
|
if (waterEnabled)
|
||||||
|
Sw = (*this)[Indices::waterSaturationIdx];
|
||||||
|
|
||||||
|
if (primaryVarsMeaning() == Sw_po_Sg) {
|
||||||
|
Scalar Sg = 0.0;
|
||||||
|
if (compositionSwitchEnabled)
|
||||||
|
Sg = (*this)[Indices::compositionSwitchIdx];
|
||||||
|
Scalar Ssol = 0.0;
|
||||||
|
if (enableSolvent)
|
||||||
|
Ssol =(*this) [Indices::solventSaturationIdx];
|
||||||
|
|
||||||
|
Scalar So = 1.0 - Sw - Sg - Ssol;
|
||||||
|
Sw = std::min(std::max(Sw,0.0),1.0);
|
||||||
|
So = std::min(std::max(So,0.0),1.0);
|
||||||
|
Sg = std::min(std::max(Sg,0.0),1.0);
|
||||||
|
Ssol = std::min(std::max(Ssol,0.0),1.0);
|
||||||
|
|
||||||
|
Scalar St = Sw + So + Sg + Ssol;
|
||||||
|
Sw = Sw/St;
|
||||||
|
Sg = Sg/St;
|
||||||
|
Ssol = Ssol/St;
|
||||||
|
assert(St>0.5);
|
||||||
|
if (waterEnabled)
|
||||||
|
(*this)[Indices::waterSaturationIdx]= Sw;
|
||||||
|
if (compositionSwitchEnabled)
|
||||||
|
(*this)[Indices::compositionSwitchIdx] = Sg;
|
||||||
|
if (enableSolvent)
|
||||||
|
(*this)[Indices::solventSaturationIdx] = Ssol;
|
||||||
|
return not(St==1);
|
||||||
|
|
||||||
|
}else if (primaryVarsMeaning() == Sw_po_Rs) {
|
||||||
|
Scalar Ssol = 0.0;
|
||||||
|
if (enableSolvent)
|
||||||
|
Ssol = (*this)[Indices::solventSaturationIdx];
|
||||||
|
Scalar So = 1.0 - Sw - Ssol;
|
||||||
|
Sw = std::min(std::max(Sw,0.0),1.0);
|
||||||
|
So = std::min(std::max(So,0.0),1.0);
|
||||||
|
Ssol = std::min(std::max(Ssol,0.0),1.0);
|
||||||
|
//Sg = 0.0;
|
||||||
|
Scalar St = Sw + So + Ssol;
|
||||||
|
assert(St>0.5);
|
||||||
|
Sw=Sw/St;
|
||||||
|
Ssol=Ssol/St;
|
||||||
|
if (waterEnabled)
|
||||||
|
(*this)[Indices::waterSaturationIdx]= Sw;
|
||||||
|
if (enableSolvent)
|
||||||
|
(*this)[Indices::solventSaturationIdx] = Ssol;
|
||||||
|
return not(St==1);
|
||||||
|
}else{
|
||||||
|
assert(primaryVarsMeaning() == Sw_pg_Rv);
|
||||||
|
assert(compositionSwitchEnabled);
|
||||||
|
Scalar Ssol=0.0;
|
||||||
|
if (enableSolvent)
|
||||||
|
Ssol = (*this)[Indices::solventSaturationIdx];
|
||||||
|
Scalar Sg = 1.0 - Sw - Ssol;
|
||||||
|
//So = 0.0;
|
||||||
|
Sw = std::min(std::max(Sw,0.0),1.0);
|
||||||
|
Sg = std::min(std::max(Sg,0.0),1.0);
|
||||||
|
Ssol = std::min(std::max(Ssol,0.0),1.0);
|
||||||
|
Scalar St = Sw + Sg + Ssol;
|
||||||
|
assert(St>0.5);
|
||||||
|
Sw=Sw/St;
|
||||||
|
Ssol=Ssol;
|
||||||
|
if (waterEnabled)
|
||||||
|
(*this)[Indices::waterSaturationIdx]= Sw;
|
||||||
|
if (enableSolvent)
|
||||||
|
(*this)[Indices::solventSaturationIdx] = Ssol;
|
||||||
|
return not(St==1);
|
||||||
|
}
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
BlackOilPrimaryVariables& operator=(const BlackOilPrimaryVariables& other) = default;
|
BlackOilPrimaryVariables& operator=(const BlackOilPrimaryVariables& other) = default;
|
||||||
BlackOilPrimaryVariables& operator=(Scalar value)
|
BlackOilPrimaryVariables& operator=(Scalar value)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user