From e226b5d95e2ac5379125c833c63044c86563cd90 Mon Sep 17 00:00:00 2001 From: Liu Ming Date: Mon, 9 Dec 2013 20:33:05 +0800 Subject: [PATCH] Simulator for fullyimplicit two phase flow with polymer --- .../FullyImplicitTwophasePolymerSolver.cpp | 105 +++++++++++------- .../FullyImplicitTwophasePolymerSolver.hpp | 26 +++-- .../fullyimplicit/IncompPropsAdBasic.cpp | 2 +- opm/polymer/fullyimplicit/PolymerPropsAd.cpp | 17 ++- opm/polymer/fullyimplicit/PolymerPropsAd.hpp | 26 +++-- 5 files changed, 111 insertions(+), 65 deletions(-) diff --git a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp index a2534ba1c..179fd8253 100644 --- a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp +++ b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -56,15 +57,13 @@ typedef Eigen::Array& src) + const std::vector& src, + const std::vector& polymer_inflow) + // const bool if_polymer_actived) { V pvol(grid_.number_of_cells); @@ -99,7 +100,7 @@ typedef Eigen::Array(&x.concentration()[0], nc); vars0.push_back(c); @@ -214,7 +215,7 @@ typedef Eigen::Array& bpat = vars[0].blockPattern(); { ADB so = ADB::constant(V::Ones(nc, 1), bpat); - ADB& sw = vars[ nextvar++ ]; + ADB sw = vars[ nextvar++ ]; state.saturation[0] = sw; so = so - sw; state.saturation[1] = so; @@ -233,11 +234,13 @@ typedef Eigen::Array& src) + const std::vector& src, + const std::vector& polymer_inflow) + // const bool if_polymer_actived) { // Create the primary variables. const SolutionState state = variableState(x); @@ -252,21 +255,42 @@ typedef Eigen::Array(&polymer_inflow[0], nc); + ADB mc = computeMc(state); + ADB mflux = computeMassFlux(0, trans, kr, state); + residual_[2] = pvdt * (state.saturation[0] * state.concentration + - old_state.saturation[0] * old_state.concentration) + + ops_.div * state.concentration * mc * mflux - src_polymer; + } else { + residual_[2] = ADB::constant(V::Zero(nc)); + } } - + double + FullyImplicitTwophasePolymerSolver:: + PolymerInjectedAmount(const std::vector& polymer_inflow) const + { + double amount = 0; + for (int i = 0; i < int(polymer_inflow.size()); ++i) { + amount += polymer_inflow[i]; + } + return amount; + } ADB - FullyImplicitTwoPhaseSolver::accumSource(const int phase, + FullyImplicitTwophasePolymerSolver::accumSource(const int phase, const std::vector& kr, const std::vector& src) const { @@ -307,7 +331,7 @@ typedef Eigen::Array& kr) const { const double* mus = fluid_.viscosity(); @@ -325,14 +349,14 @@ typedef Eigen::Array matr = mass_res.derivative()[0]; V dx(V::Zero(mass_res.size())); @@ -352,7 +376,7 @@ typedef Eigen::Array - FullyImplicitTwoPhaseSolver::computeRelPerm(const SolutionState& state) const + FullyImplicitTwophasePolymerSolver::computeRelPerm(const SolutionState& state) const { const ADB sw = state.saturation[0]; @@ -424,7 +449,7 @@ typedef Eigen::Array& kr , const SolutionState& state ) const @@ -446,7 +471,7 @@ typedef Eigen::Array::const_iterator @@ -465,7 +490,7 @@ typedef Eigen::Array& src); + const std::vector& src, + const std::vector& polymer_inflow + ); +// const bool if_polymer_actived); private: typedef AutoDiffBlock ADB; typedef ADB::V V; @@ -46,7 +48,6 @@ namespace Opm { }; const UnstructuredGrid& grid_; const IncompPropsAdInterface& fluid_; - const PolymerProperties& polymer_props_; const PolymerPropsAd& polymer_props_ad_; const LinearSolverInterface& linsolver_; const std::vector cells_; @@ -62,7 +63,9 @@ namespace Opm { assemble(const V& pvdt, const SolutionState& old_state, const PolymerState& x, - const std::vector& src); + const std::vector& src, + const std::vector& polymer_inflow); +// const bool if_polymer_actived); V solveJacobianSystem() const; void updateState(const V& dx, PolymerState& x) const; @@ -84,7 +87,10 @@ namespace Opm { const SolutionState& state) const; double residualNorm() const; + + ADB + computeMc(const SolutionState& state) const; ADB rockPorosity(const ADB& p) const; ADB @@ -93,6 +99,8 @@ namespace Opm { fluidDensity(const int phase) const; ADB transMult(const ADB& p) const; + double + PolymerInjectedAmount(const std::vector& polymer_inflow) const; }; } // namespace Opm #endif// OPM_FULLYIMPLICITTWOPHASESOLVER_HEADER_INCLUDED diff --git a/opm/polymer/fullyimplicit/IncompPropsAdBasic.cpp b/opm/polymer/fullyimplicit/IncompPropsAdBasic.cpp index a12eff445..33691fb82 100644 --- a/opm/polymer/fullyimplicit/IncompPropsAdBasic.cpp +++ b/opm/polymer/fullyimplicit/IncompPropsAdBasic.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include diff --git a/opm/polymer/fullyimplicit/PolymerPropsAd.cpp b/opm/polymer/fullyimplicit/PolymerPropsAd.cpp index 15adf0149..d6404618e 100644 --- a/opm/polymer/fullyimplicit/PolymerPropsAd.cpp +++ b/opm/polymer/fullyimplicit/PolymerPropsAd.cpp @@ -182,7 +182,7 @@ namespace Opm { const double* visc) const { const int nc = c.size(); - V inv_mu_w_eff(n); + V inv_mu_w_eff(nc); for (int i = 0; i < nc; ++i) { double im = 0; polymer_props_.effectiveInvVisc(c(i), visc, im); @@ -198,11 +198,11 @@ namespace Opm { ADB PolymerPropsAd::effectiveInvWaterVisc(const ADB& c, - const double* visc) + const double* visc) const { const int nc = c.size(); - V inv_mu_w_eff(n); - V dinv_mu_w_eff(n); + V inv_mu_w_eff(nc); + V dinv_mu_w_eff(nc); for (int i = 0; i < nc; ++i) { double im = 0, dim = 0; polymer_props_.effectiveInvViscWithDer(c.value()(i), visc, im, dim); @@ -221,11 +221,10 @@ namespace Opm { - V PolymerPropsAd::polymerWaterVelocityRatio(const V& c) const { const int nc = c.size(); - V mc(n); + V mc(nc); for (int i = 0; i < nc; ++i) { double m = 0; @@ -244,13 +243,13 @@ namespace Opm { { const int nc = c.size(); - V mc(n); - V dmc(n); + V mc(nc); + V dmc(nc); for (int i = 0; i < nc; ++i) { double m = 0; double dm = 0; - polymer_props_.computeMcWithDer(c(i), m, dm); + polymer_props_.computeMcWithDer(c.value()(i), m, dm); mc(i) = m; dmc(i) = dm; diff --git a/opm/polymer/fullyimplicit/PolymerPropsAd.hpp b/opm/polymer/fullyimplicit/PolymerPropsAd.hpp index 2d77b228c..f03ccd34c 100644 --- a/opm/polymer/fullyimplicit/PolymerPropsAd.hpp +++ b/opm/polymer/fullyimplicit/PolymerPropsAd.hpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include namespace Opm { @@ -65,15 +65,25 @@ namespace Opm { */ typedef AutoDiffBlock ADB; typedef ADB::V V; - PolymerPropsAd(const PolymerPropperties& polymer_props); - ~PolymerPropsAd(); - V PolymerPropsAd::effectiveInvWaterVisc(const V& c,const double* visc) const; - ADB PolymerPropsAd::effectiveInvWaterVisc(const ADB& c,const double* visc) const; - V PolymerPropsAd::polymerWaterVelocityRatio(const V& c) const; - ADB PolymerPropsAd::polymerWaterVelocityRatio(const ADB& c) const; + PolymerPropsAd(const PolymerProperties& polymer_props); + + ~PolymerPropsAd(); + + V + effectiveInvWaterVisc(const V& c,const double* visc) const; + + ADB + effectiveInvWaterVisc(const ADB& c,const double* visc) const; + + V + polymerWaterVelocityRatio(const V& c) const; + + ADB + polymerWaterVelocityRatio(const ADB& c) const; + private: - const PolymerProperties polymer_props_; + const PolymerProperties& polymer_props_; };