static Evaluation twoPhaseSatKrnInv(const Params ¶ms, const Evaluation& krn) { typedef MathToolbox<Evaluation> Toolbox; // since inverting the formula for krn is hard to do analytically, we use the // Newton-Raphson method Evaluation Sw = Toolbox::createConstant(0.5); Scalar eps = 1e-10; for (int i = 0; i < 20; ++i) { Evaluation f = krn - twoPhaseSatKrn(params, Sw); Evaluation fStar = krn - twoPhaseSatKrn(params, Sw + eps); Evaluation fPrime = (fStar - f)/eps; Evaluation delta = f/fPrime; Sw -= delta; if (Sw < 0) Sw = Toolbox::createConstant(0.0); if (Toolbox::abs(delta) < 1e-10) return Sw; } OPM_THROW(NumericalIssue, "Couldn't invert the Brooks-Corey non-wetting phase" " relperm within 20 iterations"); }
static Evaluation krn(const Params& params, const FluidState& fs) { const Evaluation& Sw = 1.0 - Opm::decay<Evaluation>(fs.saturation(Traits::nonWettingPhaseIdx)); return twoPhaseSatKrn(params, Sw); }
static Evaluation krn(const Params ¶ms, const FluidState &fs) { typedef MathToolbox<typename FluidState::Scalar> FsToolbox; const Evaluation& Sw = 1.0 - FsToolbox::template toLhs<Evaluation>(fs.saturation(Traits::nonWettingPhaseIdx)); return twoPhaseSatKrn(params, Sw); }
static Evaluation twoPhaseSatKrnInv(const Params& params, const Evaluation& krn) { // since inverting the formula for krn is hard to do analytically, we use the // Newton-Raphson method Evaluation Sw = 0.5; Scalar eps = 1e-10; for (int i = 0; i < 20; ++i) { Evaluation f = krn - twoPhaseSatKrn(params, Sw); Evaluation fStar = krn - twoPhaseSatKrn(params, Sw + eps); Evaluation fPrime = (fStar - f)/eps; Evaluation delta = f/fPrime; Sw -= delta; if (Sw < 0) Sw = 0.0; if (Opm::abs(delta) < 1e-10) return Sw; } throw NumericalIssue("Couldn't invert the Brooks-Corey non-wetting phase" " relperm within 20 iterations"); }