From 4d2f2fb6a5b1e134a3e085723538207e054b70ee Mon Sep 17 00:00:00 2001 From: Liu Ming Date: Wed, 22 Jan 2014 16:59:51 +0800 Subject: [PATCH] using last time step's cmax value when computing adsorption for inconp solver --- opm/polymer/fullyimplicit/.utilities.cpp.swp | Bin 0 -> 16384 bytes .../FullyImplicitTwophasePolymerSolver.cpp | 15 +++++++++------ .../FullyImplicitTwophasePolymerSolver.hpp | 5 +++-- 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 opm/polymer/fullyimplicit/.utilities.cpp.swp diff --git a/opm/polymer/fullyimplicit/.utilities.cpp.swp b/opm/polymer/fullyimplicit/.utilities.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..b7460437f9637d580d00a4119b128a6abf20961e GIT binary patch literal 16384 zcmeHN%a0sK8E^6cCW#3o1VM5suM;z~kD1-Il)&smti6UfVzbu9UL!4=p{J*Mx9omV zRlVblv2w}*Bu+sbA`S>4F5CzQE?kfzB_dq-2T;W0fKbE%35g5*zUt@9&aC4T2vy5J z&vre&@2lVU)mPnB-Cx|jvc+C#FFLqB?Kpqy{bA?n2Y!9#p|3ekC<2jE`8}>a7dIDz z+s`juSpM=0r?l-PGQP<@-Qlt9q>9T9iiRh?vHJYh{#XVq1C{~H zfMvikU>UFsSOzQumI2FvWxz7OraGr(USbDZ~qUjW|+z6D$W z{`IKi{0cY%mVv)N;y7;ucYt-^_YKEMfX9J%Kj}C>0B!(J0%w4~e!_8n3;Yy#14w{1 zpaFdNamV={@Eu?W_#*J9haKm2U={f1L$C=r02Y7`u(9!7;48of*d+NS@Fvg&{s_+A z1KtL113qAQ1eL6I-5t53ijyT&s-+vLB$m3Tq_>xF>GwPy1p91mjhQ>?YQEx7)A4Jv zKx#F;hH6W(Y<7)#ahUXc>3VyM`zx%|VK<;pGRg6&#!)OJJBouebvjw))UTm>dw!{~nZ%rN_DZ0yepg6nZOw&r`)qvL6VtaAA zv{50et5wg=b`o~GX(V*FJ8+K~>SkE@>V*z&+B0-(#>JySa3A7lm^g@H$p>w=QxZx{ zvZ1Tkj5BJ_v^yvtW(LtfVOMTANE{+m)WSOb^t?EVl348x_fM5;#^J@OHX>(n!R0c- z7dc(#$yg~rh=)u>M)oN-3ZFG|_4+vBP|MD)u`4gXbotV??VZ*sE<=!29utbWOvl;{ zpwpAN1?nh>2Dkz`t>VVz=PnmvO!?FYPO&zc!`Pic})LU!Gp8xmc+yXDdWS$?R}+sHKfV^jKV>fMn5-6b{F=nE*S&CttB#&GfCajV44! z$=F0cnWna{ZuPFcxU+pDOCvIkvF~~U41(h2pj~- zGD{9!qzn)LwP(gOQe;F41?uv+*_9K~p!8mphJ7x3vEMUN)hH{qKEzAznW~Q|sJfI> zrmmY(E(Hu^X({^n)(z2AW!jPTp^YJm*LXAX=1ovnqDPx~0e5AyHg<}x$b*Ua8ZS|8 zSa^vdvS@PW)QmxSX@XPFkFH&U~)g%*qWfvd$4$C7Qb6*8zvSFz9fu|CYA zPO)Z{zOt3GmHF}>3g%i2xf>rjl7c)DLb5L;GE37WJhU)@eNsa;gl{IUbi+N^wm<3} zcI}W?B}|!#!@xwS+EjPUT!{uT>vKwETqcrhK41f$V9mqgz~YE0tY%%~DH=_#OGNvu z=1C&a#4`jaBy5_K(SZ3udK=$wPVKCypSh^BVgpwr-)otA8ZsvLGqGHBV_ywYL;~rO zv3JY(7LOzJ(WpahD*n-J0I`^6=Aj1mVdM&*mqg4mdNT^0vC>UMYH;g)+dmg{U2PPiC=%_`5F)^YPVazo)|c1~_r~nxkBB4N5gg2t;QZ1>fy0C z|FHYGa~;p!6Qz%|x=c?2TP{7MPO`+bRU%9S@>Zu@XC}2RzBA8>DV7McE}hnX^t<$; z+xW^dNrJJ?WUNlTTb82AHEC+kKtu?WPCsx}FK`j3x7s5yR8l&m^f{&OK#BoX(fj|; z@Gky2yu;J`e{p{Q4&L{F1NnWzTUPlalRbOXj|f)u9EDrlT0dy3^I@oI2#T8%eJ?7;Rf2+ f&$f7aFa;a@`JFk--R0QA6Z#kjSt4$FI2HI0YMeuL literal 0 HcmV?d00001 diff --git a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp index 9b64b69ec..c3e99d1b2 100644 --- a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp +++ b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.cpp @@ -164,6 +164,7 @@ namespace { const V pvdt = pvol / dt; const SolutionState old_state = constantState(x, xw); + computeCmax(x, old_state.concentration); computeAccum(old_state, 0); const double atol = 1.0e-12; const double rtol = 5.0e-8; @@ -355,16 +356,17 @@ namespace { } - ADB + void FullyImplicitTwophasePolymerSolver:: - computeCmax(const ADB& c) + computeCmax(PolymerState& state, + const ADB& c) { const int nc = grid_.number_of_cells; for (int i = 0; i < nc; ++i) { cmax_(i) = std::max(cmax_(i), c.value()(i)); } + std::copy(&cmax_[0], &cmax_[0] + nc, state.maxconcentration().begin()); - return ADB::constant(cmax_, c.blockPattern()); } void @@ -378,7 +380,7 @@ namespace { rq_[0].accum[aix] = sat[0]; rq_[1].accum[aix] = sat[1]; - const ADB cmax = computeCmax(state.concentration); + const ADB cmax = ADB::constant(cmax_, state.concentration.blockPattern()); const ADB ads = polymer_props_ad_.adsorption(state.concentration, cmax); const double rho_rock = polymer_props_ad_.rockDensity(); const V phi = Eigen::Map(&fluid_.porosity()[0], grid_.number_of_cells, 1); @@ -403,7 +405,7 @@ namespace { const V trans = subset(transmissibility(), ops_.internal_faces); const std::vector kr = computeRelPerm(state); - const ADB cmax = computeCmax(state.concentration); + const ADB cmax = ADB::constant(cmax_, state.concentration.blockPattern()); // const ADB ads = polymer_props_ad_.adsorption(state.concentration, cmax); const ADB krw_eff = polymer_props_ad_.effectiveRelPerm(state.concentration, cmax, kr[0], state.saturation[0]); const ADB mc = computeMc(state); @@ -697,6 +699,7 @@ namespace { const int nc = grid_.number_of_cells; const int nw = wells_.number_of_wells; const V one = V::Constant(nc, 1.0); + const V zero = V::Zero(nc); // Extract parts of dx corresponding to each part. const V dp = subset(dx, Span(nc)); @@ -732,7 +735,7 @@ namespace { // Concentration updates. const V c_old = Eigen::Map(&state.concentration()[0], nc); - const V c = c_old - dc; + const V c = (c_old - dc).max(zero); std::copy(&c[0], &c[0] + nc, state.concentration().begin()); diff --git a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.hpp b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.hpp index 0849a07bd..d96b19750 100644 --- a/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.hpp +++ b/opm/polymer/fullyimplicit/FullyImplicitTwophasePolymerSolver.hpp @@ -126,8 +126,9 @@ namespace Opm { const std::vector& polymer_inflow_c, const SolutionState& state) const; - ADB - computeCmax(const ADB& c); + void + computeCmax(PolymerState& state, + const ADB& c); void computeAccum(const SolutionState& state, const int aix );