From a7db4f3cf0baebea45c223f77a53eeeb304372ed Mon Sep 17 00:00:00 2001 From: Liu Ming Date: Wed, 11 Dec 2013 22:52:11 +0800 Subject: [PATCH] add adsorption and effective relperm functions. --- .../fullyimplicit/.AutoDiffBlock.hpp.swp | Bin 0 -> 16384 bytes .../FullyImplicitTwophasePolymerSolver.cpp | 2 - opm/polymer/fullyimplicit/PolymerPropsAd.cpp | 93 +++++++++++++++++- opm/polymer/fullyimplicit/PolymerPropsAd.hpp | 11 +++ 4 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 opm/polymer/fullyimplicit/.AutoDiffBlock.hpp.swp diff --git a/opm/polymer/fullyimplicit/.AutoDiffBlock.hpp.swp b/opm/polymer/fullyimplicit/.AutoDiffBlock.hpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..30f7c63bd2ed2b77f4ba3c45af2c8c8c455a27b6 GIT binary patch literal 16384 zcmeHN%a0sK884g=oIn62e?UI46zwkKnYE1|a;#Ox`>;oNcUHTzaV&&P%}n)9+1*{8 z>h2v+EC(eVB3`*5aX}#E1X4~sM8pjVPC<#nf!7%+aOJ=W4E(<8>h9Tb;vgZ@OUkE-e(u0Gq_rq8!OD{y^Mh&SJPZSTSppA*ln2odT$((xge-1q9*RK+s9 zZyhdt(F^QMjlJ11NyIpvm~a*;>wcHtgFFmpI!Z!4(pjgQXJ$hO!Nt&wZnh^$@_{`y z6&eN_2JU6xQE~3eHX1#~(Ymw@P!TVW454VW454VW454VW454VW45)|CWI) zc}RQ(qdVb8xZ^)RwD9>ae?8~#_ZQ0l>C1=y{tp()@A~qYzyGlBpzP-#zC7^dFE5lo z;O{@~KmW2&?r%3A4Fe4W4Fe4W4Fe4W4Fe4W4Fe4W4Fe4W4Fe4W@4Z7R|L=Z6h+hM5062>+rUZS zw>W%w71#zI0e*?Yk{5xefWLybKLWo2n8R-X|LsM%I-L%6gG^bugrcbqLz>7VMUqnef?8T869_M){N$gwEXjCG>2h1}FYctcmQ13o%#8iw zmzF6rbf_}drH;q?NRM+FR(+?mlucwtI;Er~xOpwc1SFwMHnB?84O)~MnwgwprN%5h zPZdG3x z4`*&PDZfgh(u_=!X%mwUoLY{%C=WA@(giU(4wSV}JFq75LS9fH*nQWr&a~qu%rRi6 zN4m)Ekwjt2O_Ur>Dq7k!z?=^GT^34YhN+H=sT>~H;WQn9E}s927tHWH6NyYyyq`lR z_T%(wEez#Y@6HZb=rIKrRWBxKY1P?V(xNl&OJPK3-S>34g{hopp|(BZ>t6L2v@eV$ z(~*LimqUSOmG+4>hgL@QRAp1+XD~fq)w)e*R$Fw|f$p^F>O{pfvPx!5%`y65x1}RM zca~clj|x?!;tZw}b2avsv#b2Wv4=VI9#nYbG4fz-l{RC%rlc$c)sr^YYn!@h>fWh> zV$QZvmn49fG6)xY)K=}{=iS(+65@CuV`cRb#&ra%n(Ax&Yah%`+3{(GZaaqZ^qpkKk17t*$>8XxMCT$dMUp8CNo`dOp`snX95>o;mp9 zF-F+L;ezSJohV^ zlDhzMU(%`}tTu#5w={YQMX3Q2hw^fI0r>Klor!~ zsB66H(povg_#-8q+07@g(g$dz8hvSPNCDuK%#pI8kz?>tY6)6kI6BT05{b(yL*)Xw zu1z$XC5W7C2hQAm6mZd)9lIcPo+KnA7u7H=l`7o-C}isfFT-4iNFT8iRkRQF&`LXN zVLrX}7WdtVODW|ixeUY+hEobWyhv*-9x+J;A>5dyASAhL3Fk2sNL$ZzVikrnM#MFa z$aFM8!~#!!j{ZZL!sM_@$R?4>@bws7l@^u1U_#_g?oellaH;0?hN+cw(aYrZ>{jzq z88U*#jhs^|91jGcHPS5{qsX7G!a=!pp%r|U5Ws*&?t|@afrTLt*)lqA# zQ$%_=dNnTguOeO^ivkq^2arfSLrE3s6R)L0T_IJ0hcMk^r zjo#MQ#Vh^wFI>O8+1=ROyWZPbzjCm#xq-d{M3Ue?s3}%DpiG7ae&g~lgtv)$0mTM^ zHO1QZ!X(R*^PSFgI&B}udE3~-4w8Y2Q}>Au z(^h|vy0qKf8}!x>u5|Zk_h4_gzrTrb?PENJgU-&H}Db6TFhQy{w+0-XP?s<#%9{VQ9&^3OUJRUpiYmq`!tn1Ucl4DOO z(mSsM(Lb7SAcQc;kKEFof82*{1OS)r(+P$&oYg}OSew*qQ>^1g$miHmR2*=RaLW#6 z1OB4}JQ}BB;S^|W@4y#Ffl}Fi0)}@DqH0RpkRl1|;~TvCTLQb-*rD+{49M!kNrtuS znRB$?+Zk+bQEz?FqHcnh>7nDc#E6`i!ZJE5g7^R5#s2&O?BRL;Up`;|G4}bd19yNe z;4{D};6dOm)O`hb3D^cM0b9T(a27ZNtO6Z?<(>eVt6`vFpkbh4pkbh4pkbh4pkbh4 zpkbh4;D64*DV(I@i5MO|eDGljl)b|>7mjeS_awUG{`0ru5gpk{N-Gpj(xLmMi)skDk--UB7oHrhOL~vn$Byr@t_9XYUEV$)+mRHB2D>xxzDMh;{ zS-Ij_W~T6n5XTC1fe(*)c)re>lS=OB2jW-g89%xKP6n_AALFT{uR_mY!;S}5JZ>&^ zTk+EqK6* jacs(num_blocks); + for (int block = 0; block < num_blocks; ++block) { + jacs[block] = dads_diag * c.derivative()[block]; + } + + return ADB::function(ads, jacs); + } + + + V + PolymerPropsAd::effectiveRelPerm(const V& c, + const V& cmax_cells, + const V& krw) const + { + const int nc = c.size(); + + V one = V::Ones(nc); + V ads = adsorption(c); + double max_ads = polymer_props_.cMaxAds(); + double res_factor = polymer_props_.resFactor(); + double factor = (res_factor -1.) / max_ads; + V rk = one + factor * ads; + V krw_eff = krw / rk; + + return eff_relperm; + } + + + ADB + PolymerPropsAd::effectiveRelPerm(const ADB& c, + const ADB& cmax_cells, + const ADB& krw, + const ADB& sw) const + { + const int nc = c.value().size(); + + V one = V::Ones(nc); + + ADB ads = adsorption(c); + V krw_eff = effectiveRelPerm(c.value(), cmax_cells.value(), krw.value()); + + double max_ads = polymer_props_.cMaxAds(); + double res_factor = polymer_props_.resFactor(); + double factor = (res_factor - 1.) / max_ads; + ADB rk = one + ads * factor; + ADB::M dkrw_ds = krw.derivative() / rk.derivative(); + ADB::M dkrw_dc = -krw.value() / (rk.value * rk.value()) * ads.derivative() * factor; + + const int num_blocks = c.numBlocks(); + std::vector jacs(num_blocks); + for (int block = 0; block < num_blocks; ++block) { + jac[block] = dkrw_ds * sw.derivative()[block] + dkrw_dc * c.derivative()[block]; + } + + return ADB::function(krw_eff, jacs); + } + }// namespace Opm diff --git a/opm/polymer/fullyimplicit/PolymerPropsAd.hpp b/opm/polymer/fullyimplicit/PolymerPropsAd.hpp index 69936843d..b964a241d 100644 --- a/opm/polymer/fullyimplicit/PolymerPropsAd.hpp +++ b/opm/polymer/fullyimplicit/PolymerPropsAd.hpp @@ -81,6 +81,17 @@ namespace Opm { ADB polymerWaterVelocityRatio(const ADB& c) const; + V + adsorption(const V& c) const; + + ADB + adsorption(const ADB& c) const; + + V + effectiveRelPerm(const V& c, const V& cmax_cells, const V& relperm) const; + + ADB + effectiveRelPerm(const ADB& c, const ADB& cmax_cells, const ADB& krw, const ADB& sw) const; private: const PolymerProperties& polymer_props_; };