BlackOilBrineModules: use if constexpr

This commit is contained in:
Arne Morten Kvarving 2022-08-09 08:54:18 +02:00
parent 368a2414c3
commit 0a182d51f6

View File

@ -130,7 +130,7 @@ public:
} }
} }
if (enableSaltPrecipitation) { if constexpr (enableSaltPrecipitation) {
const TableContainer& permfactTables = tableManager.getPermfactTables(); const TableContainer& permfactTables = tableManager.getPermfactTables();
permfactTable_.resize(numPvtRegions); permfactTable_.resize(numPvtRegions);
for (size_t i = 0; i < permfactTables.size(); ++i) { for (size_t i = 0; i < permfactTables.size(); ++i) {
@ -156,18 +156,14 @@ public:
*/ */
static void registerParameters() static void registerParameters()
{ {
if (!enableBrine)
// brine have been disabled at compile time
return;
} }
static bool primaryVarApplies(unsigned pvIdx) static bool primaryVarApplies(unsigned pvIdx)
{ {
if (!enableBrine) if constexpr (enableBrine)
// brine have been disabled at compile time return pvIdx == saltConcentrationIdx;
else
return false; return false;
return pvIdx == saltConcentrationIdx;
} }
/*! /*!
@ -177,10 +173,8 @@ public:
static void assignPrimaryVars(PrimaryVariables& priVars, static void assignPrimaryVars(PrimaryVariables& priVars,
const FluidState& fluidState) const FluidState& fluidState)
{ {
if (!enableBrine) if constexpr (enableBrine)
return; priVars[saltConcentrationIdx] = fluidState.saltConcentration();
priVars[saltConcentrationIdx] = fluidState.saltConcentration();
} }
static std::string primaryVarName([[maybe_unused]] unsigned pvIdx) static std::string primaryVarName([[maybe_unused]] unsigned pvIdx)
@ -200,10 +194,10 @@ public:
static bool eqApplies(unsigned eqIdx) static bool eqApplies(unsigned eqIdx)
{ {
if (!enableBrine) if constexpr (enableBrine)
return eqIdx == contiBrineEqIdx;
else
return false; return false;
return eqIdx == contiBrineEqIdx;
} }
static std::string eqName([[maybe_unused]] unsigned eqIdx) static std::string eqName([[maybe_unused]] unsigned eqIdx)
@ -226,61 +220,59 @@ public:
static void addStorage(Dune::FieldVector<LhsEval, numEq>& storage, static void addStorage(Dune::FieldVector<LhsEval, numEq>& storage,
const IntensiveQuantities& intQuants) const IntensiveQuantities& intQuants)
{ {
if (!enableBrine) if constexpr (enableBrine) {
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. // Brine in water phase
surfaceVolumeWater = max(surfaceVolumeWater, 1e-10); const LhsEval massBrine = surfaceVolumeWater
* Toolbox::template decay<LhsEval>(fs.saltConcentration());
// Brine in water phase if (enableSaltPrecipitation){
const LhsEval massBrine = surfaceVolumeWater double saltDensity = 2170; // Solid salt density kg/m3
* Toolbox::template decay<LhsEval>(fs.saltConcentration()); const LhsEval solidSalt =
Toolbox::template decay<LhsEval>(intQuants.porosity())
* saltDensity
* Toolbox::template decay<LhsEval>(intQuants.saltSaturation());
if (enableSaltPrecipitation){ storage[contiBrineEqIdx] += massBrine + solidSalt;
double saltDensity = 2170; // Solid salt density kg/m3 }
const LhsEval solidSalt = else { storage[contiBrineEqIdx] += massBrine;}
Toolbox::template decay<LhsEval>(intQuants.porosity())
* saltDensity
* Toolbox::template decay<LhsEval>(intQuants.saltSaturation());
storage[contiBrineEqIdx] += massBrine + solidSalt;
} }
else { storage[contiBrineEqIdx] += massBrine;}
} }
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 (!enableBrine) if constexpr (enableBrine) {
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 upIdx = extQuants.upstreamIndex(FluidSystem::waterPhaseIdx); if (upIdx == inIdx) {
const unsigned inIdx = extQuants.interiorIndex(); flux[contiBrineEqIdx] =
const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx); extQuants.volumeFlux(waterPhaseIdx)
*up.fluidState().invB(waterPhaseIdx)
if (upIdx == inIdx) { *up.fluidState().saltConcentration();
flux[contiBrineEqIdx] = }
extQuants.volumeFlux(waterPhaseIdx) else {
*up.fluidState().invB(waterPhaseIdx) flux[contiBrineEqIdx] =
*up.fluidState().saltConcentration(); extQuants.volumeFlux(waterPhaseIdx)
} *decay<Scalar>(up.fluidState().invB(waterPhaseIdx))
else { *decay<Scalar>(up.fluidState().saltConcentration());
flux[contiBrineEqIdx] = }
extQuants.volumeFlux(waterPhaseIdx)
*decay<Scalar>(up.fluidState().invB(waterPhaseIdx))
*decay<Scalar>(up.fluidState().saltConcentration());
} }
} }
@ -299,28 +291,26 @@ 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 (!enableBrine) if constexpr (enableBrine) {
return; unsigned dofIdx = model.dofMapper().index(dof);
const PrimaryVariables& priVars = model.solution(/*timeIdx=*/0)[dofIdx];
unsigned dofIdx = model.dofMapper().index(dof); outstream << priVars[saltConcentrationIdx];
const PrimaryVariables& priVars = model.solution(/*timeIdx=*/0)[dofIdx]; }
outstream << priVars[saltConcentrationIdx];
} }
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 (!enableBrine) if constexpr (enableBrine) {
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[saltConcentrationIdx];
PrimaryVariables& priVars0 = model.solution(/*timeIdx=*/0)[dofIdx];
PrimaryVariables& priVars1 = model.solution(/*timeIdx=*/1)[dofIdx];
instream >> priVars0[saltConcentrationIdx]; // set the primary variables for the beginning of the current time step.
priVars1[saltConcentrationIdx] = priVars0[saltConcentrationIdx];
// set the primary variables for the beginning of the current time step. }
priVars1[saltConcentrationIdx] = priVars0[saltConcentrationIdx];
} }
static const Scalar& referencePressure(const ElementContext& elemCtx, static const Scalar& referencePressure(const ElementContext& elemCtx,
@ -440,7 +430,7 @@ public:
auto& fs = asImp_().fluidState_; auto& fs = asImp_().fluidState_;
if (enableSaltPrecipitation) { if constexpr (enableSaltPrecipitation) {
const auto& saltsolTable = BrineModule::saltsolTable(elemCtx, dofIdx, timeIdx); const auto& saltsolTable = BrineModule::saltsolTable(elemCtx, dofIdx, timeIdx);
saltSolubility_ = saltsolTable; saltSolubility_ = saltsolTable;
@ -460,11 +450,11 @@ public:
} }
} }
void saltPropertiesUpdate_(const ElementContext& elemCtx, void saltPropertiesUpdate_([[maybe_unused]] const ElementContext& elemCtx,
unsigned dofIdx, [[maybe_unused]] unsigned dofIdx,
unsigned timeIdx) [[maybe_unused]] unsigned timeIdx)
{ {
if (enableSaltPrecipitation) { if constexpr (enableSaltPrecipitation) {
const Evaluation porosityFactor = min(1.0 - saltSaturation(), 1.0); //phi/phi_0 const Evaluation porosityFactor = min(1.0 - saltSaturation(), 1.0); //phi/phi_0
const auto& permfactTable = BrineModule::permfactTable(elemCtx, dofIdx, timeIdx); const auto& permfactTable = BrineModule::permfactTable(elemCtx, dofIdx, timeIdx);