Fix solvent restart

This commit is contained in:
Tor Harald Sandve 2019-09-25 12:28:58 +02:00
parent 20fdd62569
commit afba6c8e8e
3 changed files with 30 additions and 12 deletions

View File

@ -1041,6 +1041,17 @@ public:
so -= sol.data("SGAS")[globalDofIndex]; so -= sol.data("SGAS")[globalDofIndex];
} }
if (sSol_.size() > 0) {
// keep the SSOL option for backward compatibility
// should be removed after 10.2018 release
if (sol.has("SSOL"))
sSol_[elemIdx] = sol.data("SSOL")[globalDofIndex];
else if (sol.has("SSOLVENT"))
sSol_[elemIdx] = sol.data("SSOLVENT")[globalDofIndex];
so -= sSol_[elemIdx];
}
assert(saturation_[oilPhaseIdx].size() > 0); assert(saturation_[oilPhaseIdx].size() > 0);
saturation_[oilPhaseIdx][elemIdx] = so; saturation_[oilPhaseIdx][elemIdx] = so;
@ -1052,14 +1063,6 @@ public:
rs_[elemIdx] = sol.data("RS")[globalDofIndex]; rs_[elemIdx] = sol.data("RS")[globalDofIndex];
if (rv_.size() > 0 && sol.has("RV")) if (rv_.size() > 0 && sol.has("RV"))
rv_[elemIdx] = sol.data("RV")[globalDofIndex]; rv_[elemIdx] = sol.data("RV")[globalDofIndex];
if (sSol_.size() > 0) {
// keep the SSOL option for backward compatibility
// should be removed after 10.2018 release
if (sol.has("SSOL"))
sSol_[elemIdx] = sol.data("SSOL")[globalDofIndex];
else if (sol.has("SSOLVENT"))
sSol_[elemIdx] = sol.data("SSOLVENT")[globalDofIndex];
}
if (cPolymer_.size() > 0 && sol.has("POLYMER")) if (cPolymer_.size() > 0 && sol.has("POLYMER"))
cPolymer_[elemIdx] = sol.data("POLYMER")[globalDofIndex]; cPolymer_[elemIdx] = sol.data("POLYMER")[globalDofIndex];
if (cFoam_.size() > 0 && sol.has("FOAM")) if (cFoam_.size() > 0 && sol.has("FOAM"))

View File

@ -2492,12 +2492,14 @@ private:
eclWriter_->eclOutputModule().initHysteresisParams(simulator, elemIdx); eclWriter_->eclOutputModule().initHysteresisParams(simulator, elemIdx);
eclWriter_->eclOutputModule().assignToFluidState(elemFluidState, elemIdx); eclWriter_->eclOutputModule().assignToFluidState(elemFluidState, elemIdx);
processRestartSaturations_(elemFluidState); if (enableSolvent)
solventSaturation_[elemIdx] = eclWriter_->eclOutputModule().getSolventSaturation(elemIdx);
processRestartSaturations_(elemFluidState, solventSaturation_[elemIdx]);
lastRs_[elemIdx] = elemFluidState.Rs(); lastRs_[elemIdx] = elemFluidState.Rs();
lastRv_[elemIdx] = elemFluidState.Rv(); lastRv_[elemIdx] = elemFluidState.Rv();
if (enableSolvent)
solventSaturation_[elemIdx] = eclWriter_->eclOutputModule().getSolventSaturation(elemIdx);
if (enablePolymer) if (enablePolymer)
polymerConcentration_[elemIdx] = eclWriter_->eclOutputModule().getPolymerConcentration(elemIdx); polymerConcentration_[elemIdx] = eclWriter_->eclOutputModule().getPolymerConcentration(elemIdx);
// if we need to restart for polymer molecular weight simulation, we need to add related here // if we need to restart for polymer molecular weight simulation, we need to add related here
@ -2548,7 +2550,7 @@ private:
eclWriter_->endRestart(); eclWriter_->endRestart();
} }
void processRestartSaturations_(InitialFluidState& elemFluidState) void processRestartSaturations_(InitialFluidState& elemFluidState, Scalar& solventSaturation)
{ {
// each phase needs to be above certain value to be claimed to be existing // each phase needs to be above certain value to be claimed to be existing
// this is used to recover some RESTART running with the defaulted single-precision format // this is used to recover some RESTART running with the defaulted single-precision format
@ -2561,6 +2563,13 @@ private:
sumSaturation += elemFluidState.saturation(phaseIdx); sumSaturation += elemFluidState.saturation(phaseIdx);
} }
}
if (enableSolvent) {
if (solventSaturation < smallSaturationTolerance)
solventSaturation = 0.0;
sumSaturation += solventSaturation;
} }
assert(sumSaturation > 0.0); assert(sumSaturation > 0.0);
@ -2571,6 +2580,9 @@ private:
elemFluidState.setSaturation(phaseIdx, saturation); elemFluidState.setSaturation(phaseIdx, saturation);
} }
} }
if (enableSolvent) {
solventSaturation = solventSaturation / sumSaturation;
}
} }
void readExplicitInitialCondition_() void readExplicitInitialCondition_()

View File

@ -157,6 +157,8 @@ class EclWriter
typedef std::vector<Scalar> ScalarBuffer; typedef std::vector<Scalar> ScalarBuffer;
enum { enableEnergy = GET_PROP_VALUE(TypeTag, EnableEnergy) }; enum { enableEnergy = GET_PROP_VALUE(TypeTag, EnableEnergy) };
enum { enableSolvent = GET_PROP_VALUE(TypeTag, EnableSolvent) };
public: public:
static void registerParameters() static void registerParameters()
@ -392,6 +394,7 @@ public:
{"SWAT", Opm::UnitSystem::measure::identity, static_cast<bool>(FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx))}, {"SWAT", Opm::UnitSystem::measure::identity, static_cast<bool>(FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx))},
{"SGAS", Opm::UnitSystem::measure::identity, static_cast<bool>(FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx))}, {"SGAS", Opm::UnitSystem::measure::identity, static_cast<bool>(FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx))},
{"TEMP" , Opm::UnitSystem::measure::temperature, enableEnergy}, {"TEMP" , Opm::UnitSystem::measure::temperature, enableEnergy},
{"SSOLVENT" , Opm::UnitSystem::measure::identity, enableSolvent},
{"RS", Opm::UnitSystem::measure::gas_oil_ratio, FluidSystem::enableDissolvedGas()}, {"RS", Opm::UnitSystem::measure::gas_oil_ratio, FluidSystem::enableDissolvedGas()},
{"RV", Opm::UnitSystem::measure::oil_gas_ratio, FluidSystem::enableVaporizedOil()}, {"RV", Opm::UnitSystem::measure::oil_gas_ratio, FluidSystem::enableVaporizedOil()},
{"SOMAX", Opm::UnitSystem::measure::identity, simulator_.problem().vapparsActive()}, {"SOMAX", Opm::UnitSystem::measure::identity, simulator_.problem().vapparsActive()},