diff --git a/opm/polymer/fullyimplicit/.IncompPropsAdFromDeck.cpp.swp b/opm/polymer/fullyimplicit/.IncompPropsAdFromDeck.cpp.swp new file mode 100644 index 000000000..5a92cb6fb Binary files /dev/null and b/opm/polymer/fullyimplicit/.IncompPropsAdFromDeck.cpp.swp differ diff --git a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp index a101c5512..a68110425 100644 --- a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp +++ b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp @@ -226,6 +226,19 @@ typedef Eigen::Array c.value()(i)) ? cmax(i) : c.value()(i); + } + + return ADB::constant(cmax); + } @@ -243,9 +256,12 @@ typedef Eigen::Array kr = computeRelPerm(state); - for (int phase = 0; phase < fluid_.numPhases(); ++phase) { - const ADB mflux = computeMassFlux(phase, trans, kr, state); - ADB source = accumSource(phase, kr, src); + + const ADB cmax = computeCmax(state.concentration); + const ADB krw_eff = polymer_props_.effectiveRelPerm(c, cmax, kr[0], state.saturation[0]); + + const std::vector mflux = computeMassFlux(trans, kr, state); + const std::vector source = accumSource(phase, kr, src); residual_[phase] = pvdt*(state.saturation[phase] - old_state.saturation[phase]) + ops_.div*mflux - source; @@ -255,17 +271,19 @@ typedef Eigen::Array& kr, - const std::vector& src) const + std::vector + FullyImplicitTwophasePolymerSolver::accumSource(const std::vector& kr, + const std::vector& src, + const std::vector& polymer_inflow_c, + const SolutionState& state) const { //extract the source to out and in source. std::vector outsrc; @@ -286,6 +304,7 @@ typedef Eigen::Array(& src[0], grid_.number_of_cells); const V outSrc = Eigen::Map(& outsrc[0], grid_.number_of_cells); const V inSrc = Eigen::Map(& insrc[0], grid_.number_of_cells); + const V polyin = Eigen::Map(& polymer_inflow_c[0], grid_.number_of_cells); // compute the out-fracflow. ADB f_out = computeFracFlow(phase, kr); // compute the in-fracflow. @@ -336,7 +355,7 @@ typedef Eigen::Array FullyImplicitTwophasePolymerSolver::computeFracFlow(int phase, const std::vector& kr) const { @@ -452,54 +471,30 @@ typedef Eigen::Array& kr , - const SolutionState& state ) const + std::vector + FullyImplicitTwophasePolymerSolver::computeMassFlux(const V& trans, + const ADB& mc, + const std::vector& kr , + const SolutionState& state ) const { -// const ADB tr_mult = transMult(state.pressure); const double* mus = fluid_.viscosity(); - ADB mob = ADB::null(); - if (phase == 0) { - ADB inv_wat_eff_vis = polymer_props_ad_.effectiveInvWaterVisc(state.concentration, mus); -// for (int i = 0; i < grid_.number_of_cells; ++i) { -// std::cout << state.concentration.value()(i) << " " << 1./inv_wat_eff_vis.value()(i) << std::endl; -// std::cout << "water effective vis\n"<<1./inv_wat_eff_v1./inv_wat_eff_vis.value()is.value()< mflux(2, ADB::null()); + ADB inv_wat_eff_vis = polymer_props_ad_.effectiveInvWaterVisc(state.concentration, mus); + ADB wat_mob = kr[0] * inv_wat_eff_vis; + ADB oil_mob = kr[1] / V::Constant(kr[1].size(), 1, mus[1]); + ADB poly_mob = mc * kr[0] * inv_wat_eff_vis; + + const ADB dp = ops_.ngrad * state.pressure; const ADB head = trans * dp; - UpwindSelector upwind(grid_, ops_, head.value()); - return upwind.select(mob) * head; + mflux.push_back(upwind.select(wat_mob)*head); + mflux.push_back(upwind.select(oil_mob)*head); + mflux.push_back(upwind.select(poly_mob)*head); + return mflux; } - ADB - FullyImplicitTwophasePolymerSolver::computePolymerMassFlux(const V& trans, - const ADB& mc, - const std::vector& kr, - const SolutionState& state) const - - { - const double* mus = fluid_.viscosity(); - ADB inv_wat_eff_vis = polymer_props_ad_.effectiveInvWaterVisc(state.concentration, mus); - ADB poly_mob = mc * kr[0] * inv_wat_eff_vis; - - const ADB dp = ops_.ngrad * state.pressure; - const ADB head = trans * dp; - - UpwindSelector upwind(grid_, ops_, head.value()); - - return upwind.select(poly_mob) * head; - - } - double FullyImplicitTwophasePolymerSolver::residualNorm() const diff --git a/opm/polymer/fullyimplicit/PolymerPropsAd.cpp b/opm/polymer/fullyimplicit/PolymerPropsAd.cpp index f9ce55952..d1b984ac4 100644 --- a/opm/polymer/fullyimplicit/PolymerPropsAd.cpp +++ b/opm/polymer/fullyimplicit/PolymerPropsAd.cpp @@ -163,6 +163,16 @@ namespace Opm { } */ + double + PolymerPropsAd::rockDensity() const + { + return polymer_props_.rockDensity(); + } + + + + + PolymerPropsAd::PolymerPropsAd(const PolymerProperties& polymer_props) : polymer_props_ (polymer_props) { diff --git a/opm/polymer/fullyimplicit/PolymerPropsAd.hpp b/opm/polymer/fullyimplicit/PolymerPropsAd.hpp index b964a241d..5c899ab40 100644 --- a/opm/polymer/fullyimplicit/PolymerPropsAd.hpp +++ b/opm/polymer/fullyimplicit/PolymerPropsAd.hpp @@ -63,6 +63,7 @@ namespace Opm { const ADB& muWat, const ADB& muPolyEff) const; */ + double rockDensity() const; typedef AutoDiffBlock ADB; typedef ADB::V V; PolymerPropsAd(const PolymerProperties& polymer_props);