static Evaluation krw(const Params ¶ms, const FluidState &fluidState) { typedef MathToolbox<typename FluidState::Scalar> FsToolbox; typedef MathToolbox<Evaluation> Toolbox; const Evaluation& Sw = FsToolbox::template toLhs<Evaluation>(fluidState.saturation(wettingPhaseIdx)); // transformation to effective saturation const Evaluation& Se = (Sw - params.Swr()) / (1-params.Swr()); // regularization if(Se > 1.0) return 1.; if(Se < 0.0) return 0.; const Evaluation& r = 1. - Toolbox::pow(1 - Toolbox::pow(Se, 1/params.vgM()), params.vgM()); return Toolbox::sqrt(Se)*r*r; }
static Evaluation pcnw(const Params ¶ms, const FluidState &fluidState) { typedef MathToolbox<typename FluidState::Scalar> FsToolbox; typedef MathToolbox<Evaluation> Toolbox; const Evaluation& Sw = FsToolbox::template toLhs<Evaluation>(fluidState.saturation(wettingPhaseIdx)); Evaluation Se = (Sw-params.Swr())/(1.-params.Snr()); Scalar PC_VG_REG = 0.01; // regularization if (Se<0.0) Se=0.0; if (Se>1.0) Se=1.0; if (Se>PC_VG_REG && Se<1-PC_VG_REG) { Evaluation x = Toolbox::pow(Se,-1/params.vgM()) - 1.0; x = Toolbox::pow(x, 1 - params.vgM()); return x/params.vgAlpha(); } // value and derivative at regularization point Scalar Se_regu; if (Se<=PC_VG_REG) Se_regu = PC_VG_REG; else Se_regu = 1.0 - PC_VG_REG; const Evaluation& x = std::pow(Se_regu,-1/params.vgM())-1; const Evaluation& pc = Toolbox::pow(x, 1/params.vgN())/params.vgAlpha(); const Evaluation& pc_prime = Toolbox::pow(x,1/params.vgN()-1) * std::pow(Se_regu, -1.0/params.vgM() - 1) / (-params.vgM()) / params.vgAlpha() / (1-params.Snr()-params.Swr()) / params.vgN(); // evaluate tangential return ((Se-Se_regu)*pc_prime + pc)/params.betaNW(); }
static Evaluation krn(const Params ¶ms, const FluidState &fluidState) { typedef MathToolbox<typename FluidState::Scalar> FsToolbox; typedef MathToolbox<Evaluation> Toolbox; const Evaluation& Sn = FsToolbox::template toLhs<Evaluation>(fluidState.saturation(nonWettingPhaseIdx)); const Evaluation& Sw = FsToolbox::template toLhs<Evaluation>(fluidState.saturation(wettingPhaseIdx)); Evaluation Swe = Toolbox::min((Sw - params.Swr()) / (1 - params.Swr()), 1.); Evaluation Ste = Toolbox::min((Sw + Sn - params.Swr()) / (1 - params.Swr()), 1.); // regularization if(Swe <= 0.0) Swe = 0.; if(Ste <= 0.0) Ste = 0.; if(Ste - Swe <= 0.0) return 0.; Evaluation krn_; krn_ = Toolbox::pow(1 - Toolbox::pow(Swe, 1/params.vgM()), params.vgM()); krn_ -= Toolbox::pow(1 - Toolbox::pow(Ste, 1/params.vgM()), params.vgM()); krn_ *= krn_; if (params.krRegardsSnr()) { // regard Snr in the permeability of the non-wetting // phase, see Helmig1997 const Evaluation& resIncluded = Toolbox::max(Toolbox::min(Sw - params.Snr() / (1-params.Swr()), 1.0), 0.0); krn_ *= Toolbox::sqrt(resIncluded ); } else krn_ *= Toolbox::sqrt(Sn / (1 - params.Swr())); return krn_; }