Merge pull request #465 from GitPaean/fixing_single_precision_restart

each phase needs to be above certain value to be treated to be present
This commit is contained in:
Andreas Lauser 2019-01-22 16:11:53 +01:00 committed by GitHub
commit 70a7207578

View File

@ -1868,6 +1868,9 @@ private:
elemFluidState.setPvtRegionIndex(pvtRegionIndex(elemIdx)); elemFluidState.setPvtRegionIndex(pvtRegionIndex(elemIdx));
eclWriter_->eclOutputModule().initHysteresisParams(this->simulator(), elemIdx); eclWriter_->eclOutputModule().initHysteresisParams(this->simulator(), elemIdx);
eclWriter_->eclOutputModule().assignToFluidState(elemFluidState, elemIdx); eclWriter_->eclOutputModule().assignToFluidState(elemFluidState, elemIdx);
processRestartSaturations_(elemFluidState);
lastRs_[elemIdx] = elemFluidState.Rs(); lastRs_[elemIdx] = elemFluidState.Rs();
lastRv_[elemIdx] = elemFluidState.Rv(); lastRv_[elemIdx] = elemFluidState.Rv();
if (enableSolvent) if (enableSolvent)
@ -1894,6 +1897,30 @@ private:
} }
void processRestartSaturations_(InitialFluidState& elemFluidState) {
// 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
const Scalar smallSaturationTolerance = 1.e-6;
Scalar sumSaturation = 0.;
for (size_t phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
if (FluidSystem::phaseIsActive(phaseIdx)) {
if (elemFluidState.saturation(phaseIdx) < smallSaturationTolerance)
elemFluidState.setSaturation(phaseIdx, 0.);
sumSaturation += elemFluidState.saturation(phaseIdx);
}
}
assert(sumSaturation > 0.);
for (size_t phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
if (FluidSystem::phaseIsActive(phaseIdx)) {
const Scalar saturation = elemFluidState.saturation(phaseIdx) / sumSaturation;
elemFluidState.setSaturation(phaseIdx, saturation);
}
}
}
void readExplicitInitialCondition_() void readExplicitInitialCondition_()
{ {
const auto& vanguard = this->simulator().vanguard(); const auto& vanguard = this->simulator().vanguard();