mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
BlackOilPolymerModules: use if constexpr
This commit is contained in:
parent
5213f3b526
commit
d2ba89f39a
@ -307,7 +307,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enablePolymerMolarWeight) {
|
if constexpr (enablePolymerMolarWeight) {
|
||||||
const auto& plyvmhTable = eclState.getTableManager().getPlyvmhTable();
|
const auto& plyvmhTable = eclState.getTableManager().getPlyvmhTable();
|
||||||
if (!plyvmhTable.empty()) {
|
if (!plyvmhTable.empty()) {
|
||||||
assert(plyvmhTable.size() == numMixRegions);
|
assert(plyvmhTable.size() == numMixRegions);
|
||||||
@ -428,7 +428,7 @@ public:
|
|||||||
plymaxMaxConcentration_.resize(numRegions);
|
plymaxMaxConcentration_.resize(numRegions);
|
||||||
plymixparToddLongstaff_.resize(numRegions);
|
plymixparToddLongstaff_.resize(numRegions);
|
||||||
|
|
||||||
if (enablePolymerMolarWeight) {
|
if constexpr (enablePolymerMolarWeight) {
|
||||||
plyvmhCoefficients_.resize(numRegions);
|
plyvmhCoefficients_.resize(numRegions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -502,11 +502,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
static void registerParameters()
|
static void registerParameters()
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer)
|
||||||
// polymers have been disabled at compile time
|
VtkBlackOilPolymerModule<TypeTag>::registerParameters();
|
||||||
return;
|
|
||||||
|
|
||||||
VtkBlackOilPolymerModule<TypeTag>::registerParameters();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -515,24 +512,20 @@ public:
|
|||||||
static void registerOutputModules(Model& model,
|
static void registerOutputModules(Model& model,
|
||||||
Simulator& simulator)
|
Simulator& simulator)
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer)
|
||||||
// polymers have been disabled at compile time
|
model.addOutputModule(new VtkBlackOilPolymerModule<TypeTag>(simulator));
|
||||||
return;
|
|
||||||
|
|
||||||
model.addOutputModule(new VtkBlackOilPolymerModule<TypeTag>(simulator));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool primaryVarApplies(unsigned pvIdx)
|
static bool primaryVarApplies(unsigned pvIdx)
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer) {
|
||||||
// polymers have been disabled at compile time
|
if constexpr (enablePolymerMolarWeight)
|
||||||
return false;
|
return pvIdx == polymerConcentrationIdx || pvIdx == polymerMoleWeightIdx;
|
||||||
|
else
|
||||||
if (!enablePolymerMolarWeight)
|
return pvIdx == polymerConcentrationIdx;
|
||||||
return pvIdx == polymerConcentrationIdx;
|
}
|
||||||
|
else
|
||||||
// both enablePolymer and enablePolymerMolarWeight are true here
|
return false;
|
||||||
return pvIdx == polymerConcentrationIdx || pvIdx == polymerMoleWeightIdx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string primaryVarName(unsigned pvIdx)
|
static std::string primaryVarName(unsigned pvIdx)
|
||||||
@ -557,14 +550,14 @@ public:
|
|||||||
|
|
||||||
static bool eqApplies(unsigned eqIdx)
|
static bool eqApplies(unsigned eqIdx)
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer) {
|
||||||
|
if constexpr (enablePolymerMolarWeight)
|
||||||
|
return eqIdx == contiPolymerEqIdx || eqIdx == contiPolymerMolarWeightEqIdx;
|
||||||
|
else
|
||||||
|
return eqIdx == contiPolymerEqIdx;
|
||||||
|
}
|
||||||
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!enablePolymerMolarWeight)
|
|
||||||
return eqIdx == contiPolymerEqIdx;
|
|
||||||
|
|
||||||
// both enablePolymer and enablePolymerMolarWeight are true here
|
|
||||||
return eqIdx == contiPolymerEqIdx || eqIdx == contiPolymerMolarWeightEqIdx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string eqName(unsigned eqIdx)
|
static std::string eqName(unsigned eqIdx)
|
||||||
@ -590,95 +583,91 @@ public:
|
|||||||
static void addStorage(Dune::FieldVector<LhsEval, numEq>& storage,
|
static void addStorage(Dune::FieldVector<LhsEval, numEq>& storage,
|
||||||
const IntensiveQuantities& intQuants)
|
const IntensiveQuantities& intQuants)
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer) {
|
||||||
return;
|
const auto& fs = intQuants.fluidState();
|
||||||
|
|
||||||
const auto& fs = intQuants.fluidState();
|
LhsEval surfaceVolumeWater =
|
||||||
|
Toolbox::template decay<LhsEval>(fs.saturation(waterPhaseIdx))
|
||||||
|
* Toolbox::template decay<LhsEval>(fs.invB(waterPhaseIdx))
|
||||||
|
* Toolbox::template decay<LhsEval>(intQuants.porosity());
|
||||||
|
|
||||||
LhsEval surfaceVolumeWater =
|
// avoid singular matrix if no water is present.
|
||||||
Toolbox::template decay<LhsEval>(fs.saturation(waterPhaseIdx))
|
surfaceVolumeWater = max(surfaceVolumeWater, 1e-10);
|
||||||
* Toolbox::template decay<LhsEval>(fs.invB(waterPhaseIdx))
|
|
||||||
* Toolbox::template decay<LhsEval>(intQuants.porosity());
|
|
||||||
|
|
||||||
// avoid singular matrix if no water is present.
|
// polymer in water phase
|
||||||
surfaceVolumeWater = max(surfaceVolumeWater, 1e-10);
|
const LhsEval massPolymer = surfaceVolumeWater
|
||||||
|
* Toolbox::template decay<LhsEval>(intQuants.polymerConcentration())
|
||||||
|
* (1.0 - Toolbox::template decay<LhsEval>(intQuants.polymerDeadPoreVolume()));
|
||||||
|
|
||||||
// polymer in water phase
|
// polymer in solid phase
|
||||||
const LhsEval massPolymer = surfaceVolumeWater
|
const LhsEval adsorptionPolymer =
|
||||||
* Toolbox::template decay<LhsEval>(intQuants.polymerConcentration())
|
Toolbox::template decay<LhsEval>(1.0 - intQuants.porosity())
|
||||||
* (1.0 - Toolbox::template decay<LhsEval>(intQuants.polymerDeadPoreVolume()));
|
* Toolbox::template decay<LhsEval>(intQuants.polymerRockDensity())
|
||||||
|
* Toolbox::template decay<LhsEval>(intQuants.polymerAdsorption());
|
||||||
|
|
||||||
// polymer in solid phase
|
LhsEval accumulationPolymer = massPolymer + adsorptionPolymer;
|
||||||
const LhsEval adsorptionPolymer =
|
|
||||||
Toolbox::template decay<LhsEval>(1.0 - intQuants.porosity())
|
|
||||||
* Toolbox::template decay<LhsEval>(intQuants.polymerRockDensity())
|
|
||||||
* Toolbox::template decay<LhsEval>(intQuants.polymerAdsorption());
|
|
||||||
|
|
||||||
LhsEval accumulationPolymer = massPolymer + adsorptionPolymer;
|
storage[contiPolymerEqIdx] += accumulationPolymer;
|
||||||
|
|
||||||
storage[contiPolymerEqIdx] += accumulationPolymer;
|
// tracking the polymer molecular weight
|
||||||
|
if constexpr (enablePolymerMolarWeight) {
|
||||||
|
accumulationPolymer = max(accumulationPolymer, 1e-10);
|
||||||
|
|
||||||
// tracking the polymer molecular weight
|
storage[contiPolymerMolarWeightEqIdx] += accumulationPolymer
|
||||||
if (enablePolymerMolarWeight) {
|
* Toolbox::template decay<LhsEval> (intQuants.polymerMoleWeight());
|
||||||
accumulationPolymer = max(accumulationPolymer, 1e-10);
|
}
|
||||||
|
|
||||||
storage[contiPolymerMolarWeightEqIdx] += accumulationPolymer
|
|
||||||
* Toolbox::template decay<LhsEval> (intQuants.polymerMoleWeight());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void computeFlux(RateVector& flux,
|
static void computeFlux([[maybe_unused]] RateVector& flux,
|
||||||
const ElementContext& elemCtx,
|
[[maybe_unused]] const ElementContext& elemCtx,
|
||||||
unsigned scvfIdx,
|
[[maybe_unused]] unsigned scvfIdx,
|
||||||
unsigned timeIdx)
|
[[maybe_unused]] unsigned timeIdx)
|
||||||
|
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer) {
|
||||||
return;
|
const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
|
||||||
|
|
||||||
const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
|
const unsigned upIdx = extQuants.upstreamIndex(FluidSystem::waterPhaseIdx);
|
||||||
|
const unsigned inIdx = extQuants.interiorIndex();
|
||||||
|
const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
|
||||||
|
const unsigned contiWaterEqIdx = Indices::conti0EqIdx + Indices::canonicalToActiveComponentIndex(FluidSystem::waterCompIdx);
|
||||||
|
|
||||||
const unsigned upIdx = extQuants.upstreamIndex(FluidSystem::waterPhaseIdx);
|
if (upIdx == inIdx) {
|
||||||
const unsigned inIdx = extQuants.interiorIndex();
|
flux[contiPolymerEqIdx] =
|
||||||
const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
|
extQuants.volumeFlux(waterPhaseIdx)
|
||||||
const unsigned contiWaterEqIdx = Indices::conti0EqIdx + Indices::canonicalToActiveComponentIndex(FluidSystem::waterCompIdx);
|
*up.fluidState().invB(waterPhaseIdx)
|
||||||
|
*up.polymerViscosityCorrection()
|
||||||
|
/extQuants.polymerShearFactor()
|
||||||
|
*up.polymerConcentration();
|
||||||
|
|
||||||
|
// modify water
|
||||||
|
flux[contiWaterEqIdx] /=
|
||||||
|
extQuants.waterShearFactor();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
flux[contiPolymerEqIdx] =
|
||||||
|
extQuants.volumeFlux(waterPhaseIdx)
|
||||||
|
*decay<Scalar>(up.fluidState().invB(waterPhaseIdx))
|
||||||
|
*decay<Scalar>(up.polymerViscosityCorrection())
|
||||||
|
/decay<Scalar>(extQuants.polymerShearFactor())
|
||||||
|
*decay<Scalar>(up.polymerConcentration());
|
||||||
|
|
||||||
if (upIdx == inIdx) {
|
// modify water
|
||||||
flux[contiPolymerEqIdx] =
|
flux[contiWaterEqIdx] /=
|
||||||
extQuants.volumeFlux(waterPhaseIdx)
|
decay<Scalar>(extQuants.waterShearFactor());
|
||||||
*up.fluidState().invB(waterPhaseIdx)
|
}
|
||||||
*up.polymerViscosityCorrection()
|
|
||||||
/extQuants.polymerShearFactor()
|
|
||||||
*up.polymerConcentration();
|
|
||||||
|
|
||||||
// modify water
|
// flux related to transport of polymer molecular weight
|
||||||
flux[contiWaterEqIdx] /=
|
if constexpr (enablePolymerMolarWeight) {
|
||||||
extQuants.waterShearFactor();
|
if (upIdx == inIdx)
|
||||||
|
flux[contiPolymerMolarWeightEqIdx] =
|
||||||
|
flux[contiPolymerEqIdx]*up.polymerMoleWeight();
|
||||||
|
else
|
||||||
|
flux[contiPolymerMolarWeightEqIdx] =
|
||||||
|
flux[contiPolymerEqIdx]*decay<Scalar>(up.polymerMoleWeight());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
flux[contiPolymerEqIdx] =
|
|
||||||
extQuants.volumeFlux(waterPhaseIdx)
|
|
||||||
*decay<Scalar>(up.fluidState().invB(waterPhaseIdx))
|
|
||||||
*decay<Scalar>(up.polymerViscosityCorrection())
|
|
||||||
/decay<Scalar>(extQuants.polymerShearFactor())
|
|
||||||
*decay<Scalar>(up.polymerConcentration());
|
|
||||||
|
|
||||||
// modify water
|
|
||||||
flux[contiWaterEqIdx] /=
|
|
||||||
decay<Scalar>(extQuants.waterShearFactor());
|
|
||||||
}
|
|
||||||
|
|
||||||
// flux related to transport of polymer molecular weight
|
|
||||||
if (enablePolymerMolarWeight) {
|
|
||||||
if (upIdx == inIdx)
|
|
||||||
flux[contiPolymerMolarWeightEqIdx] =
|
|
||||||
flux[contiPolymerEqIdx]*up.polymerMoleWeight();
|
|
||||||
else
|
|
||||||
flux[contiPolymerMolarWeightEqIdx] =
|
|
||||||
flux[contiPolymerEqIdx]*decay<Scalar>(up.polymerMoleWeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -696,31 +685,29 @@ public:
|
|||||||
template <class DofEntity>
|
template <class DofEntity>
|
||||||
static void serializeEntity(const Model& model, std::ostream& outstream, const DofEntity& dof)
|
static void serializeEntity(const Model& model, std::ostream& outstream, const DofEntity& dof)
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer) {
|
||||||
return;
|
unsigned dofIdx = model.dofMapper().index(dof);
|
||||||
|
const PrimaryVariables& priVars = model.solution(/*timeIdx=*/0)[dofIdx];
|
||||||
unsigned dofIdx = model.dofMapper().index(dof);
|
outstream << priVars[polymerConcentrationIdx];
|
||||||
const PrimaryVariables& priVars = model.solution(/*timeIdx=*/0)[dofIdx];
|
outstream << priVars[polymerMoleWeightIdx];
|
||||||
outstream << priVars[polymerConcentrationIdx];
|
}
|
||||||
outstream << priVars[polymerMoleWeightIdx];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class DofEntity>
|
template <class DofEntity>
|
||||||
static void deserializeEntity(Model& model, std::istream& instream, const DofEntity& dof)
|
static void deserializeEntity(Model& model, std::istream& instream, const DofEntity& dof)
|
||||||
{
|
{
|
||||||
if (!enablePolymer)
|
if constexpr (enablePolymer) {
|
||||||
return;
|
unsigned dofIdx = model.dofMapper().index(dof);
|
||||||
|
PrimaryVariables& priVars0 = model.solution(/*timeIdx=*/0)[dofIdx];
|
||||||
|
PrimaryVariables& priVars1 = model.solution(/*timeIdx=*/1)[dofIdx];
|
||||||
|
|
||||||
unsigned dofIdx = model.dofMapper().index(dof);
|
instream >> priVars0[polymerConcentrationIdx];
|
||||||
PrimaryVariables& priVars0 = model.solution(/*timeIdx=*/0)[dofIdx];
|
instream >> priVars0[polymerMoleWeightIdx];
|
||||||
PrimaryVariables& priVars1 = model.solution(/*timeIdx=*/1)[dofIdx];
|
|
||||||
|
|
||||||
instream >> priVars0[polymerConcentrationIdx];
|
// set the primary variables for the beginning of the current time step.
|
||||||
instream >> priVars0[polymerMoleWeightIdx];
|
priVars1[polymerConcentrationIdx] = priVars0[polymerConcentrationIdx];
|
||||||
|
priVars1[polymerMoleWeightIdx] = priVars0[polymerMoleWeightIdx];
|
||||||
// set the primary variables for the beginning of the current time step.
|
}
|
||||||
priVars1[polymerConcentrationIdx] = priVars0[polymerConcentrationIdx];
|
|
||||||
priVars1[polymerMoleWeightIdx] = priVars0[polymerMoleWeightIdx];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const Scalar plyrockDeadPoreVolume(const ElementContext& elemCtx,
|
static const Scalar plyrockDeadPoreVolume(const ElementContext& elemCtx,
|
||||||
@ -1048,10 +1035,9 @@ public:
|
|||||||
const auto linearizationType = elemCtx.linearizationType();
|
const auto linearizationType = elemCtx.linearizationType();
|
||||||
const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
|
const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
|
||||||
polymerConcentration_ = priVars.makeEvaluation(polymerConcentrationIdx, timeIdx, linearizationType);
|
polymerConcentration_ = priVars.makeEvaluation(polymerConcentrationIdx, timeIdx, linearizationType);
|
||||||
if (enablePolymerMolarWeight) {
|
if constexpr (enablePolymerMolarWeight) {
|
||||||
polymerMoleWeight_ = priVars.makeEvaluation(polymerMoleWeightIdx, timeIdx, linearizationType);
|
polymerMoleWeight_ = priVars.makeEvaluation(polymerMoleWeightIdx, timeIdx, linearizationType);
|
||||||
}
|
}
|
||||||
const Scalar cmax = PolymerModule::plymaxMaxConcentration(elemCtx, dofIdx, timeIdx);
|
|
||||||
|
|
||||||
// permeability reduction due to polymer
|
// permeability reduction due to polymer
|
||||||
const Scalar& maxAdsorbtion = PolymerModule::plyrockMaxAdsorbtion(elemCtx, dofIdx, timeIdx);
|
const Scalar& maxAdsorbtion = PolymerModule::plyrockMaxAdsorbtion(elemCtx, dofIdx, timeIdx);
|
||||||
@ -1067,7 +1053,8 @@ public:
|
|||||||
const Evaluation resistanceFactor = 1.0 + (residualResistanceFactor - 1.0) * polymerAdsorption_ / maxAdsorbtion;
|
const Evaluation resistanceFactor = 1.0 + (residualResistanceFactor - 1.0) * polymerAdsorption_ / maxAdsorbtion;
|
||||||
|
|
||||||
// compute effective viscosities
|
// compute effective viscosities
|
||||||
if (!enablePolymerMolarWeight) {
|
if constexpr (!enablePolymerMolarWeight) {
|
||||||
|
const Scalar cmax = PolymerModule::plymaxMaxConcentration(elemCtx, dofIdx, timeIdx);
|
||||||
const auto& fs = asImp_().fluidState_;
|
const auto& fs = asImp_().fluidState_;
|
||||||
const Evaluation& muWater = fs.viscosity(waterPhaseIdx);
|
const Evaluation& muWater = fs.viscosity(waterPhaseIdx);
|
||||||
const auto& viscosityMultiplier = PolymerModule::plyviscViscosityMultiplierTable(elemCtx, dofIdx, timeIdx);
|
const auto& viscosityMultiplier = PolymerModule::plyviscViscosityMultiplierTable(elemCtx, dofIdx, timeIdx);
|
||||||
@ -1113,10 +1100,10 @@ public:
|
|||||||
|
|
||||||
const Evaluation& polymerMoleWeight() const
|
const Evaluation& polymerMoleWeight() const
|
||||||
{
|
{
|
||||||
if (!enablePolymerMolarWeight)
|
if constexpr (enablePolymerMolarWeight)
|
||||||
|
return polymerMoleWeight_;
|
||||||
|
else
|
||||||
throw std::logic_error("polymerMoleWeight() is called but polymer milecular weight is disabled");
|
throw std::logic_error("polymerMoleWeight() is called but polymer milecular weight is disabled");
|
||||||
|
|
||||||
return polymerMoleWeight_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Scalar& polymerDeadPoreVolume() const
|
const Scalar& polymerDeadPoreVolume() const
|
||||||
|
Loading…
Reference in New Issue
Block a user