BlackOilPolymerModules: use if constexpr

This commit is contained in:
Arne Morten Kvarving 2022-08-09 09:21:52 +02:00
parent 5213f3b526
commit d2ba89f39a

View File

@ -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,10 +502,7 @@ public:
*/ */
static void registerParameters() static void registerParameters()
{ {
if (!enablePolymer) if constexpr (enablePolymer)
// polymers have been disabled at compile time
return;
VtkBlackOilPolymerModule<TypeTag>::registerParameters(); 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
return;
model.addOutputModule(new VtkBlackOilPolymerModule<TypeTag>(simulator)); 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;
if (!enablePolymerMolarWeight)
return pvIdx == polymerConcentrationIdx;
// both enablePolymer and enablePolymerMolarWeight are true here
return pvIdx == polymerConcentrationIdx || pvIdx == polymerMoleWeightIdx; return pvIdx == polymerConcentrationIdx || pvIdx == polymerMoleWeightIdx;
else
return pvIdx == polymerConcentrationIdx;
}
else
return false;
} }
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) {
return false; if constexpr (enablePolymerMolarWeight)
if (!enablePolymerMolarWeight)
return eqIdx == contiPolymerEqIdx;
// both enablePolymer and enablePolymerMolarWeight are true here
return eqIdx == contiPolymerEqIdx || eqIdx == contiPolymerMolarWeightEqIdx; return eqIdx == contiPolymerEqIdx || eqIdx == contiPolymerMolarWeightEqIdx;
else
return eqIdx == contiPolymerEqIdx;
}
else
return false;
} }
static std::string eqName(unsigned eqIdx) static std::string eqName(unsigned eqIdx)
@ -590,9 +583,7 @@ 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 = LhsEval surfaceVolumeWater =
@ -619,23 +610,22 @@ public:
storage[contiPolymerEqIdx] += accumulationPolymer; storage[contiPolymerEqIdx] += accumulationPolymer;
// tracking the polymer molecular weight // tracking the polymer molecular weight
if (enablePolymerMolarWeight) { if constexpr (enablePolymerMolarWeight) {
accumulationPolymer = max(accumulationPolymer, 1e-10); accumulationPolymer = max(accumulationPolymer, 1e-10);
storage[contiPolymerMolarWeightEqIdx] += accumulationPolymer storage[contiPolymerMolarWeightEqIdx] += accumulationPolymer
* Toolbox::template decay<LhsEval> (intQuants.polymerMoleWeight()); * 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 upIdx = extQuants.upstreamIndex(FluidSystem::waterPhaseIdx);
@ -643,7 +633,6 @@ public:
const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx); const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
const unsigned contiWaterEqIdx = Indices::conti0EqIdx + Indices::canonicalToActiveComponentIndex(FluidSystem::waterCompIdx); const unsigned contiWaterEqIdx = Indices::conti0EqIdx + Indices::canonicalToActiveComponentIndex(FluidSystem::waterCompIdx);
if (upIdx == inIdx) { if (upIdx == inIdx) {
flux[contiPolymerEqIdx] = flux[contiPolymerEqIdx] =
extQuants.volumeFlux(waterPhaseIdx) extQuants.volumeFlux(waterPhaseIdx)
@ -670,7 +659,7 @@ public:
} }
// flux related to transport of polymer molecular weight // flux related to transport of polymer molecular weight
if (enablePolymerMolarWeight) { if constexpr (enablePolymerMolarWeight) {
if (upIdx == inIdx) if (upIdx == inIdx)
flux[contiPolymerMolarWeightEqIdx] = flux[contiPolymerMolarWeightEqIdx] =
flux[contiPolymerEqIdx]*up.polymerMoleWeight(); flux[contiPolymerEqIdx]*up.polymerMoleWeight();
@ -678,7 +667,7 @@ public:
flux[contiPolymerMolarWeightEqIdx] = flux[contiPolymerMolarWeightEqIdx] =
flux[contiPolymerEqIdx]*decay<Scalar>(up.polymerMoleWeight()); flux[contiPolymerEqIdx]*decay<Scalar>(up.polymerMoleWeight());
} }
}
} }
/*! /*!
@ -696,21 +685,18 @@ 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); unsigned dofIdx = model.dofMapper().index(dof);
const PrimaryVariables& priVars = model.solution(/*timeIdx=*/0)[dofIdx]; const PrimaryVariables& priVars = model.solution(/*timeIdx=*/0)[dofIdx];
outstream << priVars[polymerConcentrationIdx]; outstream << priVars[polymerConcentrationIdx];
outstream << priVars[polymerMoleWeightIdx]; 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); unsigned dofIdx = model.dofMapper().index(dof);
PrimaryVariables& priVars0 = model.solution(/*timeIdx=*/0)[dofIdx]; PrimaryVariables& priVars0 = model.solution(/*timeIdx=*/0)[dofIdx];
PrimaryVariables& priVars1 = model.solution(/*timeIdx=*/1)[dofIdx]; PrimaryVariables& priVars1 = model.solution(/*timeIdx=*/1)[dofIdx];
@ -722,6 +708,7 @@ public:
priVars1[polymerConcentrationIdx] = priVars0[polymerConcentrationIdx]; priVars1[polymerConcentrationIdx] = priVars0[polymerConcentrationIdx];
priVars1[polymerMoleWeightIdx] = priVars0[polymerMoleWeightIdx]; priVars1[polymerMoleWeightIdx] = priVars0[polymerMoleWeightIdx];
} }
}
static const Scalar plyrockDeadPoreVolume(const ElementContext& elemCtx, static const Scalar plyrockDeadPoreVolume(const ElementContext& elemCtx,
unsigned scvIdx, unsigned scvIdx,
@ -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)
throw std::logic_error("polymerMoleWeight() is called but polymer milecular weight is disabled");
return polymerMoleWeight_; return polymerMoleWeight_;
else
throw std::logic_error("polymerMoleWeight() is called but polymer milecular weight is disabled");
} }
const Scalar& polymerDeadPoreVolume() const const Scalar& polymerDeadPoreVolume() const