示例#1
0
    static Evaluation twoPhaseSatKrnInv(const Params &params, 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");
    }
示例#2
0
    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 &params, 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);
    }
示例#4
0
    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");
    }