From 488a04593d1de18ca831a9dbc29ee273cb8b7d4e Mon Sep 17 00:00:00 2001 From: JuLa96 <206707905+JuLa96@users.noreply.github.com> Date: Mon, 11 Aug 2025 14:53:20 +0200 Subject: [PATCH 1/5] Add new functions for rheological models --- avaframe/com1DFA/DFAfunctionsCython.pyx | 33 ++++++++++++++++ avaframe/com1DFA/com1DFA.py | 51 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/avaframe/com1DFA/DFAfunctionsCython.pyx b/avaframe/com1DFA/DFAfunctionsCython.pyx index 0877190d7..bea05e379 100644 --- a/avaframe/com1DFA/DFAfunctionsCython.pyx +++ b/avaframe/com1DFA/DFAfunctionsCython.pyx @@ -76,6 +76,10 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType cdef double entShearResistance = cfg.getfloat('entShearResistance') cdef double entDefResistance = cfg.getfloat('entDefResistance') cdef double rho = cfg.getfloat('rho') + cdef double rhos = cfg.getfloat('rhos') + cdef double ds = cfg.getfloat('ds') + cdef double cmax = cfg.getfloat('cmax') + cdef double cv = cfg.getfloat('cv') cdef double rhoEnt = cfg.getfloat('rhoEnt') cdef double gravAcc = cfg.getfloat('gravAcc') cdef double xsiVoellmy = cfg.getfloat('xsivoellmy') @@ -86,6 +90,12 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType cdef double muCoulomb = cfg.getfloat('mucoulomb') cdef double muCoulombMinShear = cfg.getfloat('mucoulombminshear') cdef double tau0CoulombMinShear = cfg.getfloat('tau0coulombminshear') + cdef double alphaObrienAndJulien = cfg.getfloat('alphaObrienAndJulien') + cdef double alpha1Eta = cfg.getfloat('alpha1Eta') + cdef double beta1Eta = cfg.getfloat('beta1Eta') + cdef double alpha2Tauy = cfg.getfloat('alpha2Tauy') + cdef double beta2Tauy = cfg.getfloat('beta2Tauy') + cdef double n = cfg.getfloat('n') cdef double curvAccInFriction = cfg.getfloat('curvAccInFriction') cdef double curvAccInTangent = cfg.getfloat('curvAccInTangent') cdef int curvAccInGradient = cfg.getint('curvAccInGradient') @@ -298,6 +308,29 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType xsiVoellmyRaster = xsiRaster[indCellY, indCellX] # Voellmy with optional spatially variable mu and xi values provided as rasters tau = muVoellmyRaster * sigmaB + rho * uMag * uMag * gravAcc / xsiVoellmyRaster + elif frictType >= 10: + # viscosity + eta = alpha1Eta * math.exp(beta1Eta * cv) + # yield shear stress + tauy = alpha2Tauy * math.exp(beta2Tauy * cv) + if frictType == 10: + # O`Brien and Julien + lmObrienAndJulien = 0.4 * h + lambdaBagnold = 1 / (math.pow(cmax / cv, 1 / 3) - 1) + cObrienAndJulien = rho * lmObrienAndJulien * lmObrienAndJulien + alphaObrienAndJulien * rhos * lambdaBagnold * lambdaBagnold * ds * ds + tau = tauy + eta * 3 * uMag / h + cObrienAndJulien * (3 * uMag / h * 3 * uMag / h) + if frictType == 11: + # Herschel and Bulkley + tau = tauy + eta * math.pow(3 * uMag / h, n) + if frictType == 12: + # Ostwald + tau = eta * math.pow(3 * uMag / h, n) + if frictType == 13: + # Bingham + tau = tauy + eta * 3 * uMag / h + if frictType == 14: + # Newton + tau = eta * 3 * uMag / h else: tau = 0.0 diff --git a/avaframe/com1DFA/com1DFA.py b/avaframe/com1DFA/com1DFA.py index f7f6aa3fd..85d5582be 100644 --- a/avaframe/com1DFA/com1DFA.py +++ b/avaframe/com1DFA/com1DFA.py @@ -808,6 +808,52 @@ def createReportDict(avaDir, logName, relName, inputSimLines, cfg, reportAreaInf "mu file": inputSimLines["muFile"].name, "xi file": inputSimLines["xiFile"].name, } + elif cfgGen["frictModel"].lower() == "obrienandjulien": + reportST["Friction model"] = { + "type": "columns", + "model": "O´Brien and Julien", + "alpha": cfgGen["alphaObrienAndJulien"], + "Cmax": cfgGen["cmax"], + "Cv": cfgGen["cv"], + "alpha1": cfgGen["alpha1Eta"], + "beta1": cfgGen["beta1Eta"], + "alpha2": cfgGen["alpha2Tauy"], + "beta2": cfgGen["beta2Tauy"], + } + elif cfgGen["frictModel"].lower() == "herschelandbulkley": + reportST["Friction model"] = { + "type": "columns", + "model": "Herschel and Bulkley", + "n": cfgGen["n"], + "alpha1": cfgGen["alpha1Eta"], + "beta1": cfgGen["beta1Eta"], + "alpha2": cfgGen["alpha2Tauy"], + "beta2": cfgGen["beta2Tauy"], + } + elif cfgGen["frictModel"].lower() == "ostwald": + reportST["Friction model"] = { + "type": "columns", + "model": "Ostwald", + "n": cfgGen["n"], + "alpha1": cfgGen["alpha1Eta"], + "beta1": cfgGen["beta1Eta"], + } + elif cfgGen["frictModel"].lower() == "bingham": + reportST["Friction model"] = { + "type": "columns", + "model": "Bingham", + "alpha1": cfgGen["alpha1Eta"], + "beta1": cfgGen["beta1Eta"], + "alpha2": cfgGen["alpha2Tauy"], + "beta2": cfgGen["beta2Tauy"], + } + elif cfgGen["frictModel"].lower() == "newton": + reportST["Friction model"] = { + "type": "columns", + "model": "Newton", + "alpha1": cfgGen["alpha1Eta"], + "beta1": cfgGen["beta1Eta"], + } # check if secondary release area if secRelAreaFlag == "Yes": @@ -1855,6 +1901,11 @@ def DFAIterate(cfg, particles, fields, dem, inputSimLines, outDir, cuSimName, si "voellmyminshear", "coulombminshear", "spatialvoellmy", + "obrienandjulien", + "herschelandbulkley", + "ostwald", + "bingham", + "newton" ] frictModel = cfgGen["frictModel"].lower() frictType = frictModelsList.index(frictModel) + 1 From 2799043bb71496e4a6ec53426a6e360991bc522e Mon Sep 17 00:00:00 2001 From: JuLa96 <206707905+JuLa96@users.noreply.github.com> Date: Mon, 11 Aug 2025 14:55:21 +0200 Subject: [PATCH 2/5] documentation for new rheological models --- avaframe/com1DFA/com1DFACfg.ini | 35 +++++ avaframe/tests/test_DFAfunctionsCython.py | 4 + docs/_static/Overview_rheological_models.png | Bin 0 -> 40369 bytes docs/theoryCom1DFA.rst | 143 +++++++++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 docs/_static/Overview_rheological_models.png diff --git a/avaframe/com1DFA/com1DFACfg.ini b/avaframe/com1DFA/com1DFACfg.ini index 58391766b..40f09d52b 100644 --- a/avaframe/com1DFA/com1DFACfg.ini +++ b/avaframe/com1DFA/com1DFACfg.ini @@ -62,9 +62,20 @@ ftOptionIni = False #+++++++++SNOW properties # density of snow [kg/m³] +# Override for density of fluid-solid mixture for debris flows rho = 200 # density of entrained snow [kg/m³] rhoEnt = 100 +#+++++++++DEBRIS FLOW properties +# density of sediment [kg/m³] +rhos = 2650 +# mean sediment size [m] +# TODO adjusting +ds = 0.002 +# maximum concentration of sediment particles [m³/m³] +cmax = 0.615 +# volumetric sediment concentration [m³/m³] +cv = 0.5 ##### Thickness is unambiguous: it is measured normal to the slope #### #+++++Release thickness++++ # True if release thickness should be read from shapefile file; if False - relTh read from ini file @@ -294,6 +305,11 @@ explicitFriction = 0 # spatialVoellmy # CoulombMinShear # wetsnow +# OBrienAndJulien +# HerschelAndBulkley +# Ostwald +# Bingham +# Newton # Please note that each type has their own/separate parameters: # https://docs.avaframe.org/en/latest/theoryCom1DFA.html#friction-model frictModel = samosATAuto @@ -352,6 +368,25 @@ TIni = -10 entTempRef = -10.0 # J/kgK (ice) cpIce = 2050.0 +#++++++++++++ Parameter Rheological models +#+++++Parameter viscosity (eta) and yield shear stress (tau_y) +# viscosity parameter +## TODO adjusting, O´Brien and Julien (1985) +alpha1Eta = 0.650 + ## TODO adjusting, O´Brien and Julien (1985) +beta1Eta = 16.81 +# yield shear stress parameter + ## TODO adjusting, O´Brien and Julien (1985) +alpha2Tauy = 0.00886 + ## TODO adjusting, O´Brien and Julien (1985) +beta2Tauy = 13.11 +#++++++++++++O´Brien and Julien +# parameter, default value (Takahashi 1978) +alphaObrienAndJulien = 0.01 +#++++++++++++Herschel and Bulkley, Ostwald +# exponent +## TODO adjusting +n = 1.5 #++++++++++++ Resistance model # default setup: diff --git a/avaframe/tests/test_DFAfunctionsCython.py b/avaframe/tests/test_DFAfunctionsCython.py index ede4dc84e..c9f9647c1 100644 --- a/avaframe/tests/test_DFAfunctionsCython.py +++ b/avaframe/tests/test_DFAfunctionsCython.py @@ -844,3 +844,7 @@ def test_updateFieldsC(): assert np.allclose(fields['dmDet'], dmDet_calculated2, atol=atol) # print(fields['dmDet']) """ + +""" +TODO: Add test_computeForceC() + """ \ No newline at end of file diff --git a/docs/_static/Overview_rheological_models.png b/docs/_static/Overview_rheological_models.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f2cea23c9f6c908c23efe4f662719fb4021bc0 GIT binary patch literal 40369 zcma&N1yohhyDv(KfG7ge-O?qUB1$)#4w01ZZUO1q(xnIjo05i23QC6{Aq@f|UD9>u z^8D`^XWaMh8_%J`p==g&&G>%x%_wzMx%)WeI4CG6_Z8%2HBnH|f>BUVm#{Fw{|JoE zt%AQq-Jk2ZYdKlDdzrafqNtd;JKHuKrg_S(sjpNp4=i=Ttm#@*f7O_ZD4 z;lDq@<>YG3ZN*d<4W5GSEU)i|f`VrT{Xs33Dte8Al0&5+`&8RIduRTx_Yc@C=6>_W zf}hO2M;3c@wAC17Y|->w+K;}5ybrxcsZ2EYnC(v~8rvBwTXFH@XD5lQ6w@_tb|v6@ zzN+$>?$Y-hYIgHR)YMFtd#er!m~f?p4wnQve|#K*_i*m;G*NKa4i%7YvH z?+X#AiII_!y&Tv}b#-aUpM`e69sO=oB4(%KqqnH!hBI!@}3tE+2b zdU`RJ+=~~feqxx?^z?W4P6Wc*mzG{C3B8R(gcKDOU9i!qw>1oGJ^0P|5PaQ=^oS)z zioTjAVs9h5`_D6sML0%(BtBCO2N2@3cxnZz@pGY4P!= zv)@wt%6qsBWsCgSJ{v1kva1#I>wm{;Gh5GTJJ5c66SEj}OQj}p{O;hVn$&ez;Ppj` zg4m&f*WQBhZh(-}LM(-2BkID!!v4|Gvjl31#H=j4mK*SWT@DTN5s8TpJ+65`C))f<;aOP}yUlx&{%6Z?1ui7j?|;X~ zPwMI)8k(RIc9ssPW9oW~H#P4%z=`~%lC_x|bmOyfz@(J=NAcFyusyJK_hPGZ%E#OL z&*o%#DTSD485cXdlChBAiM??QF=zi=&~Ua$w|T(D-_h2q!vUnv(eIKiWi?mjY*7zI zudVWi&6d_ykG8fpc}=z+_Ola7o`l~c84s8$H?$UKc1SX3 z*C~5^Dj5|OC912ddrYoeZrrT1{`>c*fxfTilE0a7|vXz|o&o z?(SAd+1{S6SzGx1v&tMnAZXG15d8D*V!$btp#9JH2s0Uk{@n+Z9njBOtFxOzaE%Js zO_HX4Pqa0tG-=g-zCCT7_Z&<@ED^8BrwLn_uC1bCH1al@h~4?>%*Dfaqh6lmxY}}H zT*1*0d2jYzt&oHS6&0Amu}k{-8p8%h7!0{p(fnX}d3n>Le@ifNcZFFcbE&klO_S(( z2}a<>M$x7um8kpUQe}8MuZ7p1Ml&p@Y3q!$U&7x!fRb$gGwd%iVUCKX}Y?8U8`EgbUakBzxr z^83fel{umwnmvq<`x`|~O-)x;<6)&b%V6VkpVon|D25w7^Rly4IC~PS>%X4kHGavk zv+<({?__7TXaSw9r@?hi5tmwAuTBmbvF4M?Z5rRv(cwy?yI{JpE5N~LPy6Bf;-YC? zn*CjNP&+JsSa8gR-nr+zzx2hGMMM5i@{*NspRgddIl)gxtiDw&?7(V-Mg1PiDs9zMnbmF&3@|_Aw;#1kSJt4;_`JNkYqF-m zc{uacJV7GjElnWl&P-j`|jmKvIn4+TBR}lBfu? z{Hrg6G77L}v+|JGLU=Gej7w{0wm}!x`XY`T=531YJ@&lC``{H3X1IR}*H|2d5Q57L z9s5;vkn6@vkKco29(>xUYa)gDdZJ;laI+>dpE3l81Vc(Uz!*wN|DW599G85~OVS<- z>gD`7MD~qFqVE(VZ*DI4U|zmH7WU>QCb>8x7Ggi|D9g$UR)XzeTV}ekCU4?@@Z5f; zRzc+=@%S*FQY17l=w@0NTejA5-XPA;u+}C?ALSi3#Te0CxuH;vGm~-8p`L<*!sbO= zz$JN}>Eu`V?)Y6AfAu>92-PJXCL#gs&!6BzxD$dtf!Gl;p}9ta9E9tpZ(1tUsXcFZ~D($atoQinPf~?se2YtN0v7jo-I_ za<^aQo4lnfo_8CO*sR{}H=`v|*&v`1a?CbZRAbJPKdqoEP&lntK1@YA+q4JM%;lmIf4@H?75C;T z>qEyA4;EVRMxT`Tq)cj!RoWYqN&N*j5cb z0D@iSJ*K`443u`3FIi-XG{sd`a)ZH*-wafHeGc*G0w>P0zLsI&AMwdz{33&vo6Q*3 z*x0y~YUs#ovbVimh89KHU|nN9(*6Czv*nc)bMe%iobnTaz@s6dfz|{gZd8rV<;{uG zDwmZPj~+dG`ThMS#UKS8X5RVi zHY^4jlHlWixQBx?7Dp{%psTL_vSmouG@vl|88w5rxRKXh>**!|0YU5(#Z0yTxvTMP zy@LleH8paf)vt8+3LNNvyud#oVB)&EriR_0COSIW{pRKdX*rOZ;uo-S+OY%*(D>^o zP47fWi^qKafK zoYi8phIo&%GVbre46Wb1pz=6PgtM8FaOee}AFY?dpPHG`eNxM-V6#w4(RF)^n>*ka)2{h;gPG{ink7TNOS$B$94v)Eb;r2_-o z5I0TD%@hfM0!e=yec2UpALdKhWV&%3b98t(erZj+XYTDSJXvXKTIi`cRJDf`#>Y3# z2;D|3_DoYbx1HG)Hex*cOV(3-uLYkXoD9B-3UO%89kA}* zD;@KjDpVrz_VX+4N$Fz{%~5S7`S$G_LaDX-;&iVPZ42z1(oQ>ne{nzxKUJ__3u|a- zAX+V`AhuszCX|l|%=>T@Lfo)5LUTc+clA(x&v$8gQPGjVlqeBybke3ZR(je@936H?m75*Sjx zWM^ly)xm8aG(%^SS>cWn(tnL{qV6B8qTQah-x?nV@-a+wJj_NQWurFCNvV7GNyjit zV*3USHZ&IiEl=gpf0eE6Qc`cU=`uh_K#(s3+vq8`_lDbk3|lNHVDtwSN!V*QTOXx7 z_F$!lfs<1u+|Va`*0EWIiu+oam6esvJK5vq9Uuz&eK)RBJWwf~P!$B>ZlDPsD=Vaw zAr(6DEwAI8 zFj46JRbJc#rWN%2TiA*d6FjLJ$Y4t{QtZX*oA(%td+oOiWikFh1|a+z?WQUO4kgtm zs_vyj!fBg_&U|lmyvfZPRswf%X!Sit{_3F=v`^2BJeYGEDS7Gf>npZ^U&CMJDWxQ7 zCjQVuPQC>-v{A9WmN%J)y$lKO^eyx!f5C0DlvVLh=iCyI;$FK(D-Mj0`s0}i&@6vN z490WKt7c#@oMwspRO3v!ny7vv8j`v>L!WQ<(*2-s#dUjiG-Bzgn1p!W(!kf9RQ3iS zu=&P|hxkdB@>AJi*_ijqwOLn%lPR29G+;v(vDpI2Tuvo33Uy=T?Dl+I>N6}KG;VT| zJp7$%pm+L1pP^0%zn1K#>>fml zAH))MR8Kr1d-ixXv(JwqrBv6%=MF>*3bS5lGnGNg81^BPnMjJ>uSbFQ|5erhPrR00 zeF<%Z$Vf_DNG1Poutz+#n=A`~!wJX6#@Jfowy7u|K6IY$x%d^s{k_suO7A1sYVRHA zk-fvi_3m251kf{jnR7(kFd1INN^5IBnwy&g=Uqbl`tJ{URn>~W=6^RQ?v02a;o4hT zzXd2n1ZPnbq@HaLl8V433kA4dnkWK(B;V=4;GlM;#sZE0p9`Roy6PQfW2Z=niGO_~ zF_kUVDPP*zDPI@?MDXGINS=^iHjsvhfF!13%)572K!ty0uTeH=J9D@g7{(N%)r@JWqUV(N7$Vzr^PntTp#c<&M7p$tAxl2RLcyVS|`p( z2{6|r7g0|QE@XDbO52?19JJxD}Y9e#r1%xD~gGapY-wd-NeMBF7pE_4g&o&{~@78|C-&V_1x0^3*Y0-jfJ4w zfEx3|8(}fAtyE4!E6;RkeF>{=i(AvumV_TwfClX zWJGuGs6U0B``n=SaB&vevl?U~;UYx2hcQR&0kbXnEsFE?Yz4?u@R(PB|BND(e!SEE z5^cES}_(Sqp(MGeEbUt zTN@?l5~>2PeJ6IB%(^f=?19iL)+&leM35oXi`4Ss0lgvtd*xdnoMk|}TUp_b1HfNW zek)why@fci)++#3o42=8*V7QzFnOkm#zs;=lB{~x0{B~U4-1NlO1Uh%8ovVlIWbf* z`tB=cm!H#xuxl3BxQNr(vaFaw3Tau{$)cnDVIq^MR#h+mu~Wj8HIv0t8AlDrriLBT z1^gq-L4FhJ{S}mg-$kiS^9##^>c z1#%ErVD`A5*Wv`;@rIl(_*HJY5(~{aqjx9JBtTp#xQ_22WXP1UJQTPd0w<*Ty=WVk8 zY~J$#m;4D9FE1~fGg;?{u#rPbaqovYVp(_Xv0tYpXO-gpEM)gdp)c zd{s|7XHA2y!xiAnX23wSCANP)P|Q@l z3Y~@GMHo^|M(XOpoAfn~YjyILH3)J+`(l~WS^)+I^rWPu%{uwVT-;X*$BxIF6WyD6 zUx24qqzaS`0>QSEMAlwNBZvI6Cenxeufcma`NF(iy*w-bI!G7|vg;7dS0K#fWu}2g z@Tx49>}yX?DJ?Uq99pz9aC7+e7Jaukfz2fsHwq7CDDcxo`YOSLPfr(v%;%9Fh#8Vc zj|!0L;JrME-WSa3KxPW37(>hr)ahzK?^$&gDb%x`?BO-fqX3 z729FV6FZ47;;??!k)7~{ajwFsNwc+wC<&40?l2&%R3hJRZKjAEx<9{d(fSW3e*6C& zm9u>nsy)M4(3cs^7opl2>F%MZP6!ZR%Q%;BT87OKR4Src1J2ARuk$O?j*l2)6&@=q zDr!z)V+RlD>qfgu;ZSq$922xqBJbW9nCUB1FS6D$1U(V!Vs8mC% z!gwu`p~G94qp6a@_NRv?sEoO4FrBxnESYWZW9?HkA^j$U^eA9)==AHPh2XQOt?(Xj11W@b_kR1v3MYU!E9n0(H zFF=pK2f|P@fno0>N08PGpei4>7Ta%`Oz-OVoYupyM#kvgMMiQwv+`H8l*jyQ+J}LT zFa{>|^UISRUYB38dK4wZCT>Fldce1tel=l{vpBmAfmt_^-Yd|qt702ndy4AZw5#YEk8fuWaCnO3tqLy;>1hHzsNfJ{tV9y zSc#VLmHIU=!XrUu5mP&WPuf|s%;-laWIK*k*?N*`&wbC22fSe{l^8K_ue$|~R~L-{ z@fg4PzIHuJSS{yTV>Pt2u~Bl8mD*aQa=jOH`|Nag9-ox7Shd>vQ0n$d>$l4TYVk-w z1&9D}?w_2z0OD(0W>#ilZ#~!V0q|yj0W%IFVfmUw#K@Kuc3pZdt_O1QlwZb6v<`sn zz5;e~Sh-lh#S?JWKB473b#bY}@qn@k9EY_Ge(QLgc+IEt?LqCnYPtT03RmD;tb*Rp z0nu{?ki5$0$VygD?xSgY;6I8Y*b`6H1!WUJ(IIB{fYV*sc7d3FH4G#z_)Rf>WW@T< z?Xo+J(L`_^-ZKhZ?&m((-nL&k9?KC7xNsLgTY3XxkFJjik_eflbYAm^WMn0Q2a~0` zc)(-kS&(CkO^`St?d4O~sK zWNhmKj2UQcIap!xZa=8dc)<0rM0@}ft=Rzdb*IOaaS>8T1*A1vtq**%lNjU>wz`%W zckh<2r<}e(i?T;;a9dYhIR*ltlYd0q+>@pxI|H+HAOn#03tUEw6gkPaa@0N;P|2=o zUXGyH2daXcJ%v2(ld^7!JKYo*yFq#VTn}V)jDAv~08`)Nt&DIc*asx5(8TR|-rK9J zMldpb3W^xN-6pwfLto$k#Wmgu(9uw|uQ1jx4Yhd~OTe7n$kJAZo01qufD2_Q;(!Ke;lCL5N*=~^T{L+n)F7CbsdyxoY~tQ7H7 zyEnjV`)9~-j@U=h-gdE#&=jt55N>_+*qU5haQyTA1KZ!5gC3gA^VtTc1j&F4S|+CF z0VbN|Swc>^(*di8&+sG)I?a4m&l!1iVS#~x8JttA2@f`YrHmlN5BFp%Kw09unZ4L) zSp44TV*Yn;(KKArM{R(D#Al~&3Q=#uI}M2@N-amnirtP7^v%)|bd^kmmYHky!Ow6J zxACf@%9dB2vu_+`OIFUUhshI|M)E4-a{^98YG$c-$6!<=mwQqxRqyuNN?n`Z;?Y#N zd3sLz`1xh!h>MFeR&4^)Vq)h-JY|U=0I8wfW`MbY6}EfqCr5T z9+QIQMEv!uc9<3P$Qv9~_BaPSR3}Zh!svC&kW>5hr+6}xX7R;8qaTN;i`>?SAzx4X zOgy3tg09}=_ zyFHy8q*ds|o%b;>FOQ3xdt_ViaN%Flbmg@eP;?I$_sN14s1%|sEG)<5Z1j}@GqtaY zOt^Q_rZi?iq~QTU2(VO2gM0kj+Qr3X^Tfo&1PR!o zTEGpc4C)RhHCA!c0a9m6=*HI<$E8=T4jquEJY4{pjQZ7|ST;2InI?EMQrPD|N5Hjp z3dUT)+^p;<>iQSRFeb2|pBE0CRkq*onXvQ#@GM0Kj zdp-$;$!8#4HSY|=ZZufwj_U%)1hzI_OHu#CXQ8Z&V}i)xLb89|)|;kqK%cEfDV0Mb zZEZ31s<|YnD$_6*z$#x#OMfCxg?2=<`vw|FAm@PWB9-)SL{_xee$|Gp;qC@o>giu#GJgTd^nf-=VW@YZQN>vHOQ^56@8HjvAvj6a9P*_ZzQI*lj zPp27LmR%sG-`%0G4<9IGsY zN5EqxPUshua+p81v^RUc8t_h<-JD8^pQDR`-^$Xy$o+D`rH2a81AIvU9!ioy^72^V zXlcL>_hgvA_ybWWFE6j|aJgMGqAi>@((?`%FA?SOZM`x&QoObhrsiq*yOG`yzC-nl)L$hN?*{L3}KVv594Gt8U_gT-e z<@j(lmSXyo;0dH{m2^P#GbaVqUKaP3o-agDiq|)aP{eB5y{oVS#xsC59Nd5{Xc-?!R;4R zVxp**F5xFg9dzYFglQoo50e1445HaEG;)wF#WtUVlfFg|Y>r|K9&DK3=`Jiq0NaZo zJAAM=Wr`k7ULa<)P}*NH;td5Z*iZ1p_k(e~2|ASE(Pi$sNK>>(eQyYm$2JS;WU1Jc2=x#uiUU%E~PM4vdC*&>f<^p+L(QCCiN3*xX#&M+w34bU?o!_o}Ffl_<8%LJa5!Ilk$= zyy(2gt!+yXxy%T6`PW7vVEc}Xmv_{=IW!bappWkHV|n0hePZUw6QFw z^V3XxH=^4crlEva)>DBwy7wY-Y@WNOjD4%BhgxfXVr;_h=YwGbd7)Z+1(uqyO3eQl zm(tbNd~F(5j|POFl6mP)>rck-w+?|AaJ2*ILdqk*tb0!h0nCVy{{L_&|DzLDA6iWC zPv?1n@G8|2C+Qn6Fq4v=0g8$V{C>Pzu;K>PPC%tkoam(*FoH&zioTxhiBghWpWkHT z5s(p?AbIh)Y!uAmL_1Nr&ON&?|8mKV!3=&<(7OX_#?tTK5di#`H;VFJfZnBy*$Tsk z2f*-yi#8#VnRgxmz+7P!7pDaB=v#?a5!dC_h{P$SPPxGyzdEZS^5fjzR2yBz1*hq^ z4WGXC^sInxiw;2W?N2iB$e+kxUnWjfxo?c|ohpHX_yOj)vbGkEijKL|o5WyAeHn6> z8rVk|pqFN}Ex_*zSb(u>fWganISzB)3@yt;Cpree`sKS$^*nmpk=5Fq-F=;td+j>xxGF$t!8g3 zF2<6Sl*D@Qpdx9?nmaT!)Yg)F9)u#4Q^sC77YrS=Vqz2yGqqoUDmGeP7xvzNdF-Sh zc?zYKm!MMW&QC3Uxl8jEP@)6yo-g+nS{qm5#hk%+m&|5m3OZz7cv%R?QHf1%`(kI( z1fKo((1AkLgk6IZ%l&tInh@AOq{7a$Iu%Ayfc|8_Lb>GFq%`NFVq;~~xQuzM21&Q) znrf7pl#vNy?tf6cyu9pxe*Q4W^%9#Nh(awxCjp0Ai6cen zX~5H%W?5E<4eM+R5o)8OqofkPPpYe{W2Z*)q-ao4Q6XY5;ikls5)BV~_~zHISFtow zCiAK?Taa0XrVe{|>T5leS%@$tVx7N}otIb1R^+icu2BgQwax4DemmBY+v~;K65Bl1 z^V5BhZ7qZ59PU#|NaO)c#{*no_swx^mCPp^>uzpt6EsAako#t~3qJbX-k!t6XN_p0 z8?+3iOXOl0pM&}8+u~>1flJB6Q;A{PbwGRc1pyAuQ4FUm!k#v1GZzB`TLy%~R#Sc4 z3uavr%fL%0b?x94KLHL;WvIey$eNq?y^BXJ3wYFk5%;_wNR&E(pKob(Tvbr>%86%URDG=$4USPeHIV;Q#4RE*h6tuRTzr zEaX3y>c?W~n2}r)yQKBNzi)D#J-phscNjV38{s$_KC9lgwrpHRjlrKke;$y`)!ry@ zWl3ONekPNFF*sHbvj^U|Y~Ka6N|lACy5mQK$fo$^AvoZ#&i0qPXBE<$KpZ=94o-7E z=<`C{Gh~Zc<1K%$P^W@0NRYZ|)c2?Ywbvs=$o}Vd(%OR7Pbo-XC6UiEH*oF=Ofq7- zg0M@=)N(Lqxit}+z|{!N&C*24CxJaLXPKA16vVh}@A@w3^OCf;As0Pc!f&$d*W;jv zP!k{9TvKCXaesN(I;h!XPDkTfY9&=6V{4p5&wP}9a7z|4lLd9G{9il#m#N{-MAUXD z|LyyCOAa_1W8~khDK(FSjCj*#?Qn(eScRztP(~)wWzb8|&H<#&PuBWAo*xF;YgH%8 zThKbO%zomC4=(_qODOB>9T>hJZq|kr1GnXSdEUISQO*cZ@#DXKo zy(U$tO)35^CMNxpC$*XhET}{3LrImU{s-YWRAW1*Aj>0l()CqNW9>?BxdlFqB{G3Y zFP$$ZoTKuYcCC11EJe#&s^LE9$|$a|#AX|lVEs_|{yl&i6`CLWjT2P61%9=E%@yk^ zs#hhFPh~ z%M)F)2yQG~qqNxu7!v578cRx%8QRd!_re^^RsMC%)R@+%Y(&&CmJloGmbr(-QwR;) zQ@-bzrZYdV`2C5_2$n*ZP0FSOeC*}|KQ*g&iqET%@_Nb6kBtWiI&h7XVRWdvXgffa zOxWAdEz43HB01TWLStIm3A%Cj%EOBKldD`bQQz5`0RKtDxWM4g`g##^R!NtHec<+0 zicSPcuk8J{|dYCR_2Z8=gE z@Km#Up>&48#kMAhXUbN3pF#`dp3L^ zD!UTWp-_gIr71{LlOPZ@A=Okg_b2YY%21{!B)70n=TKwdcVfymVcl?i_xS|$t>gpZ zh(NNg^dmMwcPK1|Y{23XHZ6fRn*sH=4)x{agV2aR0ZosT3bof$z$A3*n{HZ50#4TZ zTDb*NY{P1SJi0_lynM+ft#7pxfvts%l9d&6S&l3jnHS3!rPPTkLC|!^wy*fOHB$-;0Vvr& z%a$*>!j4RhWqup9`-X5P@`j6r@9}mD!?Sl%lCE3pcGGpM+c?k3E2v>@dv(c zO=M4Hycm`Y=>MED-UYnL_;5Mf6ME!rVyfmZn)X42Uzf5z;El%IoXS=tND-~o? z?!lZ^>3;V|lzm|Kt0PEqfVW0l-c3`29g+Pf=Vl3kdf)$VBvZK@vxAJ^>b+KxDhS!0>*=M> zIPLE*cUcN@2OjpZ;8RlK($LW0lJQ~uYdI4ECaq)Jxs|{-ed=|n`LJdRylZ4{KN^(I z!5U|)E$@LmKcur$2GnM}>FMe2*;opp2kkc(?8MwAWscl2a7Zb4Z&^m6VFy(^P5_q{ zime6#5djE|7)p}?EZd@n1Bn}3rpZYpj_nI5oHXdTGKdNs&41o_G%PmZ0NTOAtcEhp z0Pg%5E4&AB-#HKyvXMr-eOn5J2_#TUuy0E=u{hN5PtX1nM-?p(3q$~>z|H%B2n8ig zVBr%$CeW?Qiz$6RgMhJ{pAlYPp7sETCj|Wc5n!=pE(<{I9Ocsa9!>Gq(JMT-_CD647C)b-Vf#@c3x}?0E*{XoYWNXo_GVVyleVDY7?!+0UNsX zV4a0NUul57|4p|7x{&pQ6*`0?Xe^72kJo`a-{&Ae>4_zK1CFB^2)4Qz*}&_Luf_wn zzlQDoAX@4cZUb1Sph4;p9;KhoSz{nipD1~P9RzMGSU70j?unh9?4YM5KKxnJSSBoc zA&WQ)TpD?mpJ^q!t)ev>@SWfWH2s85ltSaWO9~TQ^Wx-yC2Wu?HA;S$|>#uOE~m{QawK3dmy#($4Z#WEc`ykcjUrgwkOg z6bw)IfJo>7aYG^XN{X(DMuM?PN;V6l2?TBg2V)Uw>ILjF zGM;EGEBMowd^|(}@R2MbJUofNi7s@1tn&hhL9N zLxWHR9!)$5AUeN&D;x`0CJ?mbpasoSy)*J_YAb7ZiehSxw-u7=u|D3Ahwos|jxv76 zCSGWHxI28cl2go_lIF*OeDJ;y+%8EH82!EeasSGvF^!zqJi%%&vm6=FYSglS{eDkl zq%yZKOLjG}spsaVg^|9R?oi14sz5>5XIME%;ef9T7sW>X#D>ltC&WM`s z>9HYN*T#DcNcPiB zp~Yg};1k8kOTSlZgrpZ+>e<7>4&a9*VaJ2}2?)!l404@)6GRL1e$eOS!RK7&W90jk zp00FsV;$ktxWglRF~Cb|aKfJ-yotbjE0J}%XH@sIrtI`ob;N6F`Ip%SGky{_R9PoN z2UFPbrLG13L`T2e6U%GJ7XKgXmkkD_T>_<>njqcPr~I&U)0) zi2H9^lUoB=%JSY%UQ)OYJ)EQTs{yMZy9PC<6-P8-VA5|6W$bUv-VO0uyzh51eBw3U zC^fzA)mcZ#F;7X4K!HSlT}OkHsYkUJw@07??6$j}V!$OxRwovKNIp63)+JMr2;R30 zCc7n(Q0W9|fsHqpR|NV(&|HxxUQOR7o=qAGA9uX*lsZ_k|E+)J|JNGa--$#78+XXc z3Uo9Z3Keh}MRr{7hQnj7Z;FSwhkI)5@?c_tjO$G1vIF?3js*Cy(CZs*5Jb|Bq;fvI zymWFtIS7&P^P8PzySmeOcj*(RkUmmGR$BpzD-q1$>%$+G2FX?|{qTa?sc!EtQr$dI zb?%Ja<$t(L1n+fx7fxe z)UNeTZ(0W)_o}bl3|piQx-!$xe&c#cpU?j2__wmR$7W>ktkYYGADgw_K3xNPZdP$P z!HbKB5};j@W1fQ^i345ig1u+wih$Pyj=h1uc+=6m8`^s5x|qgx)nseLyM|=N4U+Zz zw`?hleiyk^*Nj|)H&~)M58_|i&FKs-2pHxBl^iMA;Lmk}V@Yp_8w^xw7jT{)0uZ^0 zHbT0WOdq?Jwfq1UvqOst$PNaKq}+ZF&IGc8+_-wO{MqD8o&3#}+oNo8Y`?U`oM4j4 z*7wL@Cp&M72qXTl{~o%7HatB10_bX5}({+X9`PzN4I!eQta>QV~GR>ceV7@Drob-6!0* zUDmT;5*;+QqED32;};UEUjs}TZT52dnrdLEgl4)iOMpL7+W{KLu`DK?s_IGGD%!l; zr!H-Wpj&J@5|})6bg1puCs_!TRA%G0FJHdcOjYD;QggAfRm)RE^|r0uTyhVqrDHh+ zN>VC(w&o$mH45gw2nw-jw}CFnQNAYL2icu=VWqq7ftH#?IIwgW9zVtcFWU(K6E<}K z!eHIqmDP2qBO0_D$2H_c+UJF})u>6t<%eN3hK1AFUkU$gZpjxnuNxVfzCRS2rH@pQ zU9~~o2d2$eaBpa7*=*sM2SD%2InW?oLqqqWkk@K39o5V0lrMpy2gKS2><-NImmgfb zbnUL00xno(sQn(Da5eK#oL+md+*upk8HoAXg@Ei5zMzZxZE0KKlKQEkFpUUm47OZsiC+hi;u(ED0RSFJ` zMSGbbO5nja5)d`M$>jAH0cJ(Si;qwB^z@phlwjXSMn<+}WwohubYkw&48PFOOg>0w z7zDTZI;QkoZ0{I7;qtDW^27RzRSOl>Tx4)fb+t3F$yU~&3uh=SE9b9Xy^1ye3&>e4 zurwM5uc5ntz)D7BeBqN+=Sl$N4Ol8tXz1tYF_9IjV?BAa8*sHmkoQGiuUQK>Av+g# z{_$atQ6?fOdiw8eN=u($C_@~(Pvia9M2JJhaHKZ9hT3*w&7_~yj z7!f{aUI(#lTczEb>t3;|yn||nFsTnNW5ql3p%S4JjZzU(^gUm2XhC6rP`*DWlHGVo z{m0b}pMOuuyWa7>9Nh5TJv9va)sW^x{|}JLOKp&j@FXo*(gD zBlCE4xpbR+T{KB6kTQPzdwc!uA8yIFg8YQTk|(W`dGaG_J@C?8*^qh^w~Jv2_Mlp> zkJ1CELf0q}34`?%R}F6v7u|(zdaK$+`sYBjVXK_*(r%( z9YCr_pzBnh4f*&uR6y?i0{HLxSaoO-92Y>oN$h}HlqrmLt^ua<_wB-rN_T&Ru1N7))O=H5UKu6rG3W##!m(@k>-!=9ABrcbH8Nt0Z$>}%PS+ckAL}}AGKw441~Vk;5C0HU>k3&# z$8yF~kCE_e^wvY_%UXm3d%t(r`-xqI@6q}PVa_45&OAMDXSzU%8}{s+?1|V#QArPu zc|i3vAr>xFd*{w~qwLjX`K>E5=75%(Ybp1k+L*t?-JKr$A1h0lVy7~ko( zz7(lyovQ=yV^hE! z=sZnAkE8_TquPhu3tUzFZCAi~gZd>w0#l9-F6kQMy1ceo$klM)&JKF%xR)e6_|qIY zI(FiFb)CM`k4MHHE3V5iI z;(|*Hvhv>7S|1Mn%J!zSP$6c8ig@m-Rr-*V-66A~8YAcS@|pf%B83mbgPuvIxxpVs zg&jnIMzwR?UVT7BsUQ*haO7dj)Rsiu6gR#G3~Hmd53MN1S_f4BwNhHAMxQDTyJ~rG zO!xEfcIQ23h{)J$m*4FG4IO6SZc}7*v}RBrH|KHJ)rYs#nmsCN=$N=X%_@qDIG}e3 z6Wrj%z`%gew70(>v8F2{TgQ5xW}0+xNfVj(gbX4!vgqWv(wCo4ydl6RnH(M)qNAtK z*)r|`V%X-#r~5BrNkhbT8$Zs?$}d4(A_vvY%|0Y=!`eX`Z<$^dT6lOkbRXv6&&PyU zK=2AI1kzXI-hOGIyY0pIu6MdS<=j)|uh6iUcHJHZ5p)&sc-<{jXMoO|?yLl7K>zi( z?k;_Kqu1sy0@`vTfQ61Qhc0-j2+fB9A6pJa9MyXx{Q3!2(7_$y%)eLe_VKf^sK>_= zbb!WKG?=4ImFd6v{F&#;>oE*9@dFHy9LG&LEVSr*T#|R@{h4jxenNh~-f`ac12Lh7 ziv0N|J7ddvY8U6xEA;|Ss9bj)+2!@D`$;vpyG8cK>&0c4`3l}Krn*9IobHJ9!>2A zu9ByVPE@7F&{liw#*xz<)@}4k1yV}3`hFSZ5UIvkq`Z2O6SQ(6^qsLd3L>kXU)h?2 zRlaq1(=#$+fYce5W@-QO)vNqz2XG^7d~hkc`#!iMjQ<}Dx3(?Zk#+Y#i@<#fQWUW{ znVx0>FSD7{*PB;=1V4^8n3zIaY&&-1ZUYKz#7sK_$4;R<8n%Rym?T^Bm^&N!uI14aZ2QnDWGiMIeBw4oRaUT9 zL3iNCmIa6Do-3vs9*ra=AgN!#UaPX3;)1Qgr2*%WQqGg4T4vq~RPd?{YXg}HZ0IJX z1MFy;&YqqkO@~AUTA=U|V(Amo^jk?a=692&E@?IgeN7#Xe;4cI8btm6GK9a@C1o4+ zXA?+hKqCy$p~Eg{kdrzgNsp+T>&g?9wcrhpiV{BhYV&q}W@u^eN09kXr>^lcDf;{w zC@mr;Jnd)iy|{GB&f`Ii-?Z7(P}Y+|y-Yq`Zthxy6wxXzRHR?gGpj`C_QXeKe=*+QxwcFQy7Pmc%59>KmV#_O=ZxSy3 zV^I=Nl!Rg;DIpY}$h=o0B{K<>%;orx@5GNfG&n_Tv6K?HU^Rh@8|M#Rp}*n;SmDY8 zFf!kO@M6{G5v5f8k{nHV_t5=#gqOS1mG`O~Zj%)ja$>^@LS6JL4{fc$&7g5Si`%hURdfj$P5^L%pn%>cLj z?FP%&*1rTeE5DYCaiZ^y$1d`gb}#kZ2G)Wj9Vv{N7-<`STi!tLG-BfIX@fV_D=$n> zX36hyq`lqtnF6qX8=8d$Xp;g!&fl~o)!~@WQYF7n&)kY5ce2*TeK1gEy0pC->*d?} z2J`0rKQKfiQMG5xXL$jW%RPJw2jhb$c`1RcPdMDg$V_Pq6YB0yJthxE-q^on1 z&6bh-LLH^8E1q7|iXvfATP!knsditx;_bfnP5Aey#Y&bx~{k^}DjM=>% zx$Psreh$mp#2j~-w_MGCua={F(k_X!aI;HnM*{|BEMV-yo1L9AasK{tx5nMAtaHVI zT8=7D^bgrQAs6{gF_Y_~=i%Rkt2y!grm|rxSGe>P7aw7J$VdkYgRS}2wPiIXdL$c( zf-rPoT;n@oJf+ff|NKSee6R(AyB4%HncOs?JX--N62Iucv?J`In(&;H!f)(Qen7BJW^}IM%x$orDRvo(UHf4T9 z7~sew_<*_fgqnJ@#Vd_#bG5hrtHYPSLqFooZ%J<=x3zwi;BFiHJ&>zsdf%vC8sFrD ze6K$xU%Rb;7j@a>GZ7euHdEixI>XLe8g-`||HiPej!`N#vG{|a1i7RNEOZLoub@Ih zXAAM-`JHdVNCu6#J-B`=Cf%qcBI`6$b=lctN-ea833}4&Z~FT38SN;~4-R_uZdgKh zX)xtdlhZ;+OJ6Y5@DT2F&Y1Z&Y&>W`6G&>6SL*%JcD(Lv<3@Q{6Eiru3s<1RuL=~r zz8(gpDdqR}${Sx(PU+wMFf7XMH4~HReVqSPlJp5b;<+5ohEF8;#u5%y#4IO_W{Wd! z!hVk@yp5PWYX6wXsch~a)+9_k06XzdHE>B{=UW|ld9kPuJ{M+L5asTiaU{FKd1`u; zF?=wfLgyY{t$F0~vP*>Wr!)2R#zl_k62`b4ei^Yt{A)7%W4I_H8mvFpMkh-it>qWp zVxb^v@k{||J1TYsN1W}Z?%5+LB72k4oJIT|!{T<}h&&_W+_nmvNlqNjiiA+pNS19P z=!nT1st0e^ZM|1flRKF##|=ig5k9ypBmV3=Yd#z~xG!g6Xu-YkENkU+(6vYnlTm&J zw)#ZdPtVCJEjg9{Mb%k`McIAfo^C`yLOMj0l#*@`5h>}G7Le}lk_G{3q?sY4yQNc7 zx`u9$uCwR;pAYAJd9UlebY>oBo@ej1?{(k5Weipcto{+IKUt4>DNuFV&&Qwn8V^q9 z;R5dDwJn-YATcc~e35{l6dz{XvJ>6TWc8jbl0@E~HoEiW$|k?B-o_7Jc}2|^uN_nW z|7t4^`aoMbX$1XeU9Ck^72C~k5qm~GwZfzbWMxx zLPuk?>!#)g1|gydjN^(cDLkXu?{$Kf{AQ-1XV(=de=?RfliMpCMag!jm51~rBO?mfSU>*`!-rc!hROh_r2|-rPj;c@komlV zf;G^C?<<18cGA7VfcKgk=_t%@`lkP{tSLa9OJ1@0@ zVGAZg6{nbaTZOr5@0pu@?)S#{W_?NU<4PYW1btt~tKCK)d*t>#oEj;+B3p=fX5`K`a0v$DVWX8~-aKTumidxOlDJx=n^j#7FO z+B1?|KA!IJ(h95w=?2m!j}q;}{AfkWp;p7ULVEkIpZVfS2Zp~_c%Sh7I%(GK8l@@8 zEZ6SLSMGgN?`{W6^Pg%X1XU6wf|rJ-eZSu68U(uZf;-{%cVM>&jF7u#|F6G-!^!zU z{q$uH0epv8cB6aX+G;Clbb*2UQISKa!IRdr*LjumyBaxTt)0iwnnqnFs|H6&{HH!Dmmm zwzhT*{yg!P56+B%H)Sd|q-rG#r|9;M+E(WaV;c8i`$NaBaq5M^g-}Lap0ca#OY|=* z%kA(j?YTlyX1Uqvhhwgce&(sx%^8{EgIUdkCT_+IrzD*))eCsTq+!+WVbaX|Rr&egSC74?mPfVLV5`+2?8g+lB7`pb_}H>0BTu;K~~ z%3<%XgPt)Da`$-h0jZjeuce;IL#I~%J(v*PC>+YaEt_ZLawm6O7If!-yz#ixtV>Y&ck0NS|R1kuigG#*qy z1OWLfuu`b6+YK1%61qjDZqpv&1MOnNA=G3W zM2Q7vSZaTN|C)P;u&)Z>fd8rWj(}EC=n12ShI8bq;?c*R=aG6m#Mj-|yRiM=5F};m z4A*AYq7{-j zRbSCdCiS&8FG!h*)=#dI6h2Q>51AP%~vUmi2k;R_Qa&0iE;_?@QaJy zi&U4WAm3NX`jyulegtc5iTv!zGNunx-NlRi->|B8>))*h-B?Sg9!FTqIo$UUcggf&tV(!=EpxmB8XW4JPW9M@i%AoZ%+YrEI9(#O49+rNBrpp$cV0y)D|Kc2DI#UmuBnsQ? zJTo{15f{D-H+@poj3j(~S)9^bh*v<$=+rl)H=B_=>#Q6WcCI4)3`VnuppDgw5T6@s zdz9e19M~-ExguzXu-p3B3ck!l7skVPUM@mt+@zm@I59gsnwiI?Wl4PGJ5LasrDD>| zwwsDD)jj`9IN8=7^qr(sJz?y-MbB+%eCC{j6w|-#Y-%QUu1VAj?3s)ICxdK0oefTp zM535Y%I>-7kJLxb5_9EA$+eilxC(XfD&+yoSi<{nNoz87zWf=WaS2rji5?3Y0_&>TepKzpYhz9 zi0T(#^!qeZE!{8)YEgr-N$~b(`rY-`t8Xzfr+3$39vQ1Ws=DeFnVKg-SiT2cbH<-$ zWWl*6PQG7ZwAc6X#md+wUtap?TdK=bR~0U|G?#EGrSEmp^Y0TuaLvTr_#sF12BZIM zliq14A;~6MO%{lkgv?oDMmBV0H@v??dA<6qm%<=#A})`o-O`t`kTPURY>{`?4#>i{ z3;f6UtXLLRAxQ8GE4taB7C?zH8=f@X@%+kJp7M)Km`9tG}_TK37 z;xhaRI1EmW$zMNCa;s6Q+MhP0k*nq2Aqck;2c#a6D8fqoFFN=x*p3YOJOXTiRiVCO}rfY&&Kdy64HnAr1(^} zhW){<@uVIaTBQvwx7fm{amgYyKbgCf7z5sDxkPFhFx&+d;vTTH2WR(ZZewA`RXLJ0 z3mRDcr<%QDn_Qc0HKBN5q++~$DXx3R)T&sJt-)=95J zJ0_gAMFv=RHI6zq&x|b*4oUQ$BVXbnP@MPTKpUg)%9ww*`I0SNS6B6^$rUrRh#*x= znVV{Gn>uajv3~g_=|dkau|<-%+v9vvcI!ZEGa7!y!3S7aUj)~skoP!s8j{OLl zU@wBZhC#^c9dKg6Lw3NAO$>TnH8T=)=<46oBhT2|kn|LujQd<6`d=;>gM0NrVl<}I z?IWOsarjbSUX$vV=_lC`D@TnHTiGAlkv+^4$E-K8Wz&@Zb<_JCL_%f&%^F&zwiJXq z#wMb+16#xzXzob?_s9vLK@<;2Dl6mfP8R0|tR%8Lmy}A}BA|#Aux$(8XVt-f<5ZNN zW?W+;S7$gJvU=8%wLa0BMK?x227XtFI_E$7Rg;j^K6?`xItMPS$eC-DMrixY)tnv5 z%*kqrYvT=vAF!=x{`!mv2j`gG+RRmBf@p3x=qK8N;GQwC!~K#5MuF*%I!f6+R}Dcy zpk{f?Soew~ldZ%f);rc^_bghAe?B?bo&GG-6=D;o&US66^#y_WNIy0-4u z@rpzVUk%do;whyrclyM;T4s8F5}7(i$clO6*NC8I57xjxMaHDNby)sTLG$BJ=k+kf zA)xmn``(?P3%DLe0(7 zI@iK)mG>8+(pD-0_bzF4$bn?TS8OdCoE6{;{smZNJor)p1^`3_@MY=nZtX~$=OF0s*K}nLg>JWW#?5F)QXb+$Ua;z zRt4YF6ZpxTF;sM_@TZa-kXHa!Ap#C9mA{DHfdOuXie3kZv%G_~kt(b;xpSh+XFkp zxFCU{zTr0c1WCDzd!kiF+*JQCOZ&t5*6|>E)0?B4lBTDLu9B!!N( zH5RUoWU3FyyN+e1dC|r|Nedzh)bJB3o7~g=v7g8QOjdq_nIB&dU~K1Zoc$*K@eBYt z_v_>aBw-2R5yU;bw_nB(K;oI{;&2iAG7|tz+qBT0P=tZ*0z8HW`S4mzcBeqU`ipY@ zTsw!K$!lp@S-x8sDT>H3!kujcF#J^T%Qna!JDvrmarMf?IXfRw&8LJpj<-NruM^1# z4sw~i9ZvB!Mz~G*H#RaIkh4KI8t}6K^)|9MkIWU+={zrgHTD@C7a%I7(j|7lO;#Ww zk}mKv3KtKr7sM#-!T+uR(b&?u69iU%!qXdX2b0-*;r$7?Mt*D1PcE)X9=|!#9jrxN zbhs44{1C9YM$MzzI`O>Fo@xDA~ynD6mC|V?c=^3(kQ(Ls@cV?^-tfZQg42rFL+#KpXA7x}bY?G_aSwMIdA=C!W*nI%>)A6Cv2&BD_0ods zlRfBX%>E060iQOBmj(cEg$$ess)hWHn?-LJejcYME;=IgxD$Pz=7UH?Wm1FT=RQD45vqRw_X8rUk;JdJVIu>n48lI1gU z!va7XtXmTh5)L0~sH*0fp=of7{8?Po%Lubfv-;QVd|$8ZnGYl0FdBkz@cnRjDo!QN zbSHiD{f>nO5QqoM&UkyAdf2C2XzvF(?T@BddbksoxX2y29enTlD?Q{1rS?Ho zTyNsjI?E|0B|bu7LS^_pHe+o1X>AjgO52>ePOzk z04oBU!)MrS|KkFtfri1*fglO)9XV+8nuJz&YyYN{*YH2OY9onF{KWZAcYQ7BhnaX- z;@FJ9Gb)iXVrypQQdF_o`&_tLI<1b=#5ERxZ;R~R5^49&DTO^IOLFSLk(nn%(S_W7 zGsS%JO0rmpEXhAEr6nY#6Qp{&08Rkz)`5qbSdqc=O{$h(GKBLvC-r-kHF6>sICS*G#W^QUYHy{mWQLh-}`MSa$}ggGsCB zB@zbrNwjwBOHD9@0T$$SfPs9e(pN^ENIMbE&<bn=f0x1pxM1vI6B3|{{yV9v# zfM@J=F>4MPcLkU?sBkDq;D2o{b-MhponXE5qUZ@Q34?gk&(u=g=elSimH}^hNn~vI zL)Y?N1PNWgkm!vD+vwM5ug9!DK7Y-}fqNm^#%GxBg%=FaF;@>?PH+_M*;{DQ8_Raa zAgjid1_g0_Bfm~{sT8pRx)Rb9z%gL4mk*R0yjcB6Y*F?Vp&AXxPc?zdXTnE2;J>CZ zY^Z%Oj#{)W>x%Mz_c9O~qG#=N&Z%;0=b#vm^P20z4wOZJ>e^PGnEG&l(B zNj<4}@)?K>b|4J%L9{5cKS4StoB|{fnZBv0tooeb(HxcOO@%XUtuIoqPY7ojZ4@WM zO*IQkQDxgPVR=~DMAF@iUFZBN-_s99wQj&)iMcMEhp z(TYsooMq)Sb$xCb5zu#0>j_K-_v*CA|2FjhNF{@Fol|f+GSbttS@W^0>zytdwSl!q z;`L!`TgaJWwL22McJwc&guV~?44W&HOD1YN5rRe{nWGakYQe&o-p*Tolwsfv&A1#^LIX4#17!l@wf&NK#JE2T(;{5u>inRWEIk>Z@X)!R?FDaCr zUsvIL+~Gl7Ut4=hOpNB)Y5IBl!!{O{-QhLK(|==jppOGwDt}pK*XuG3glmqu_^GZF z>E}zqHAbr3=2`JBmRQX!4x)0f227E8ga57^c5nEHSpsyQN^)O_l#8N(KA))7kCsnFII*}nIjDK*$dDUF|2 zt;PgM@yBZh&#%K+MA4L7u45PZK9Yop_&x}M*dT;}Ax?PQqK5Bm+qiG38WUfofCkuK zz+ow^n$?HAr;H4nU4z|A_}J?ARkvoNtg0Lk`qhFJ8=XffK1eJ3RLuG`IhSFIwItCN z%`pAYYm%BK{Z9afPy>L43=qkuTHAo9O+rje?4UZf4=J6S%+2{AAbqiE>Z<{yaWTA! z!)%HaMzr-)MT$|%Lk8?Is$EuR3>1pJ#on*^YDAy+n^z5$U0%4V+#XC@5d}2LBd>0D z@P|nyIn5rmKR(>TDJOq{`3Ia0a$7BHv}-ijo)iUaWoIN7GG z><*f-Z?JlO)~DI3tA^m{dKjcpr~o!&d4W_9Rq6*U&Oa}!aYc4+!^s|HYUOIR60ovZ zrW`JmW|<5$g+(V5#%4G*Gq&cuq+FgNfIO$RCo63w&E;QBsTO|1k=9lmUk%z$L5bnh z#KV6L-dmmXQ}g5UIZRAo0dJtU;HwfvEyR0~tQDyR@v1yXjodO$jOkODL9EsQjo#|( z>w2JPW7Ka^)$^`YzL6W;N2#*pv-|=`Kedyyf@%7v)gy^RRG_NkKFl2XVjQp7 zyslwoZ+g1*q!3~~Jwo+C+{37B_MEMZ3@9CM&|0%!*}Ciz#NmT0%wH?{%Gb~!vA$X0 zvm>pLh6bF>x)PGCi`;2RYO(p925|iimAiB6UPLBaCObcE<0%&QH+=T>t0y~9ukb=H z!~`CS7xTeWmnw$kHVI-uvz7%7V{9NK)Zl9H*zCt=&@o<`2eZPw@bUH(CS)A-z+Y)H8 zSODC?7lc>Qc_~LwW*q{L1{%0}T*~av{wki3H>}9)4MM#9#0HGU0st;EVkGBWA46B- z=)vmTWY4$p2ENP`Ul)HNp2S%fj0CFiKHG7F2OqS(P{JTVEJ(^Rjfc)*3;_guy+Nl2 zGIRo{!0YQVqVE7S_?OFpcGVu0=ROB0`|5~wWTzz>-Ez%Fq?VRiFg&gd<#>B-DBg?s z$!G|D1Lm!23>$w%+q>_3cY5zCB3A_yivyOxS>6)IK-#~2gy+*Lw%B_;>MwvSl^kZ7 zHHF#^KXcXBn@|h^)Vv+wniv6VagTBCyQt1;3kE%9fV8PuQmDiMy?26TcM`ZyYRluk zjB05{AF7}#e8G6oTSSx_s}&nQO(nH`@1H3`o)@w9C1>hyeXt7(BaMqPr0Y>{{&~nwU#QFh0*P(&*6wi_ijDx$ z5x>l{fYiIM?PB=0S&!1SpCUs&^!wFU9vk+!|Hq4niw-igeC&Z2KoP%?}LX+G$C7pK$E-dYPC*rcKMGPe!GKL1CzHZ0#y+aK9 z3d6JYWo!OuLPFG#9-+p!-Vbxwq2YBwUva76HQD*{`BEZ#)Fk`1I}v~F0afHc`NUCx zA34+iCP71~|GHHLVHqO=RSbH7l$6rWtWnl%VyX!Ib6Valst8W5t{RM$tYxdK7(Q2q z&k76Lp(>2vnPDpxt|DHaiIf4R>t*VPB^%_=>XuY%(fQ=a2IDC#H6J5hlW5>}8sDq_ zjj$xm9%*vdJcxNu*UR9{Tvav|;a@sSb8lc{v}fKPUL)3Y>;Dq@yf?ZWwY9NkcQiRo zn*agX$S=0Xuc?1J=iyH~ZuxfT^vvGn|WC(xjz0y>Eu0IM0Cx&SA? zx&b{sy;ZTPs>-*j%D8_gy}-xuMwd+i4U6&;r|GX{-)X`ihy9||vz>2af{naO`zJ5= zP5Ftnd`GJrlM_FUBY$2wI0^|1L4BeDVq5C0>J}qyUkK}0MD|ADML0kA;I;1zvI8uY|)hX z+eE+&-o;?HBq=m_qm(4EsR=_RSNo-oUK@Y@_OU_t3 zI?C`uPGwz7JiTl4XJE^Yt9S_el85KjDo%BGDXnS^Zj#f$RIN)(ve+y{p({CA>HW~S z_SI!Soh5XE=rL+JVbl^PL7O%lBG|_O9c6u4gs(i$iYBPSrY{MY3|aj!%}Z+OH0Db< z5kAb6f4n2*SX&bfi7*k$*5$RDW-&20huV9=TlLHUrdCn==^T@i3k~j7w)^`AsHSDC z0`(YN4=F!K@PN#ye{c#(y|==C@mG&8p?G>(g{YNqL*vp!uI3ochiO}y`=5-Px62lR zTB{WgYTqbIXKJEuojJ$THuNtXng(iwG8#L*ztvRZpkYDMbrA_8FY0AunYmM(7#2&c zL-lZ65c469FSks?A>RUYyOwSeUYnD&r>sBVmUs}nw|)|mHNud3$mo9<5k(-0a)VWe{XSD2cQ zydRhIJv#aZ7($+br@G z3OoDHY*U&H*0U$3Ovkbs<&o!2{1@X1P)lubeSEg`5vjHQk1sN((OV<)D)$cgLC2PC zJ@EMErkzB68PA87qDkiMT#Y4$%GzJcdy~)*-tQ%VVm;le$FxGED^h~{!;q>OCgR|W z{Mab=apn|i|0$nKA*fy|*6LAgb}OmEDbBiVUzj$+7$Hv^lO_c~G1o7bmA4jMSM&Z9 zeJ~gbxW1Ft$JS|*pXbB{@;F|Eq;Ck1-_EM5_3TG!>Q5YD!TtLX`|jf6Fi(4=YJUE{ z?J4Ysy2XNMuDhuc32Rz?{YTCRzH4+KKvm-cOlbml{HS?xN!#=0gAtn%A zi2mha^Oj^jK%0`SN2Feom-G>tB#K(8k@nPMroilM(CyBe#P0Xbd!O9l+;P@gj=qjz z9kse@AeoS+#*z=zUW{%ZyMBo{`eybgmLBxe0X+nG1R?kZ3H-VN0Z#>dgucbIwbvPl zf|DdIjARSCC=9Hb$Rvy;L;DY=HJZU8 z2qXEI#xkD155=wI)TS>Ms-{I%&ZOcibAqqO059@BhKhWE&C)$H0#mv0= zIWVn7@Hdb_!6uU%NW3x=_UBE~}WdQLaqdp&yBBxT90_v~tp z-RsWf*P0NStQNOrbpoe=-9$Y=o*m`NEXsXVQN;|tzOh-z<4U=yfM26W>)k+RQyq4v zkrzHhf#AZcVUtR&lupA8x1qXnMz)CT+PvTRjt}eoU+jfP`mv(&haXN81GRcY_Abnr z79nM76VkrYS+X}Lo&^ciCWeMxYn@VWLFXJ?mTg<^@ubBI-v`kAJWt98c7kER{?$o-^bz1_4+0l7Xs-7*klP%>OJ(q z>Uc8;sfp-&_Xc5HjX5$Vw5pt)d+8=vxGU55$sv$QSr?03WRJ=IIG_L}DSFo1EZ5!c z49gZeu^StgURW#NWT)Pl+1i<$sQnO7rvG4r5p^N`z8bI7=-*-kXLO9=s6xL)JHbkG z7lH=feMQy0|GF5JU)WH*)jqY|6Jy%8=6C9Et0)4;)DyW{r-X1SG+>ScaRhFC zHkMcF2^=Q0raJ?PW64fz*un1I8zPy$MT`884k)7EO?|xahY%n>G95NWno7FGfTK7A9`i^N}l3ySq<(&7L zkYHrgIuP*#e=Hk{{L~2lE7HbhA=pEcjI(GZnd&X@!SqZHtDLOjQsX{V4cDj}t zP`t+k(}Mr~rbtBnFj3D(`)Zt=)>$qfGu`zJ7K65j?eLt0`D^#hp#n0dY2}1uT_NJK z-F?My7Q)_g3*TAwU97>o*nVRyEu$CA%GA?1CIQk-=pWR!2a2at%3L+Hp@M@{T&kqu zMbpQHLTa)XNu_oU)9ug%AKet&Hgf#44U*&Cxy04-q>Zg-M#F77$HO7rVMCTN-SZFr zw$t{{RF$R@QtAl~1NL?$Gt-ginpgIRoG&b+XoJaHH3;w!F>gQAZZPTPb5Y8fV>ob@ zSx@f9_b%K#kM+@R+Y6*c_`t);*xyX2v21XGxSIA{ zj418lM)K-(HlmU5^>c-?GNym-2Cl$CZZ`7`>suUIR_^pnf~h*}yBFIapL#j=hl@{a zVjSEf3YOxgv(z(B{{c5e`~2hDQkrTDQ3I!rlWeTqA9RS#%Pu;RFHnO|CPTIHSW8RY z?KiGWkImzy>=8(5mad{oKdePw=S(SiD{(~@CX`J<)`<0_T%r(T*<>}85Eyyy*^!nX z?(GbxS%|KHlw;?zk<&8O5>~k%8%L0w-)N_@_Ro-A_;uaF^Ln}oR-zHw;QBIC&!Fk4 zqjdbIhuw=@5CYh@(;?*eNaX~YnN9unMH%0(^IKrmN>SY!XIrizn_3b=7&zE?;s56; zf+QL8dD9*ViuzRjr@fxUL$Lh!oqJU5a}=YHLHywXc!WHM4WNqru3J)HEeDF`B!@XQ zHMi~w2{#o*x#JX3OAtj~k12E@6GfOmE9nQ+Y%{61Yo174dC9VQ$!Af4MfO@W&#ikk znz(K?c!Y5Hr5_*n^Qt7DX|IENP9lK`n`v&ET9V^-MTVG)uj#FgB=h8Uwt1p2BM`Fg z3-7+AYiTz9tzi;pEAqd#rq+bu*>OUrvxgUN2mucO?3SlQM6_1JWMaAEhPo8G^ylk= zqz_C$>Be|{LU8!cP|;UJhqdLCvb5q$gZF*dkX$^^4uYE;ugNRn9h*_+fiA{DM%vbG zJ~;oNcV5WGz?i*eEaI3^ewaL4RAf!D{nqGmYp%}E`Vl(kNHz`O zsxP2c(na|4aXP`uKGbKz6VtWewn9DMYRYL14L>dzXh0Qf8g~1nUbnj%W3FwRWI=5= zSj|mNJRzb?a!f8M#qRGTMwO?8iudywwwXQocTkCz6alcukK~mhd*?i#8L-qG#QTqQ zbt40}Ye$G9xt&#)j^X)>qV9w7P?qAN=MqzGkLVOSdM@nKLOa@1NspSiwy!Y#$fA6Z zq}O}D(`wHajW8{`bTAPLv6j&6sJ!zc+PnACqjKJfW9CKMYVQDO z0(kc#=E?MML~HcpQASWp}xXzwgV$B+0hF0bbnno=G$b#5w?kkQznzLtLmT+t;a97lM z$>#RIhT{5x5XAeo*oc2Yy53_6mYG=I4SmB!^{I?iHuqgG7Tk+5Nl$s+Eah0Wub=b`zj9`$Tyd|w$sB*h%RXQvGL zj-Bn0Id6?*?jte9q+;!xFAfP0E*ok)c@Z_7d!2fY_H7z;V6jCLLr-wsemWv@&kejn z__urPcH>_ri#uGGpVv85nOD-k3kee9XBe2FSa;tUDE;y^^JnT7^=2`i`|6F24yLcowRUuOf9z1X4<5RyEV9{ooH_@ zxs~{}qednmQ$cidM5#DoH_bwN1UgAtf7+i)z4~bkiL&=)hNn>k3Yo(uJUuE zWT@3*<0}OPW#b|&g^U1C;!X(%ScaK>FRMOs)2W@>z?GBS)*1&D9d5Ox1rd zE3tY;B$(F^jq}53S|WbQSZ415*^YvL^rTs>gtM=Dcx?QyUW>Dd(CmdPXbj2AV3gdx ze$1K8O~WK};j0f2O}18(6uA1*c>5!> zGdtt=#e8v>z*xYOQf7FAFc;q36$(!^*YUHG3kvc z;r9MD__1F`eYZQduv5Pbawv<@{A_loQxW{^M=xN(eHwUIs7+m?g4AVm5%W$Pne5N8 zT{(&PeqjA}`g4@VG(LjhSU#h1sxP2(in6za7Ja97O|r46Q`rW!yPQFnC~mdLr*r4{ zb)Jf$E2?jhl2GB4AD~N!pt%1aReE{(G1Pp(U?oKd3}yJEW`t0kP~k025+8fAS3Y)i zOaHI9Fx!5{^*lJ5Ql-gyd^a{ttwY>ZW6&ZE0sdLoti@yT=s=Z5Ue ztkiQkgY2w3YbC)k8X{i8m8n9R|4H#c!jGvUIa_Qh1oj~-+c%IV!?Qt(7oQ) zMJL66WCm)~kt3EiI`hVmbcW_yi6q2zUj%zW+yvuSU0U$G98A^^8YlwO<0KMHqgrr*yM2w;^H z=Z2$p1G33wvjak@PxQ;Qj>EqND8{0DZTwpnx-vQRD|e*x%1BsQ{jNN2%oL;5`0CY6 zN_65G*7VUVq)|0O&gFZ(55?HYY9*0Cmw-z$eH2Dw^vs+q_xY<#-SZbC=2@WtD+H41 z?y`L9IW;gH z=44_{Ob;+y(%0RIU*m}NQ@O9c#ILTi6uxlleH&=IrL#)8{e*fL)s1}{$y`I@vyoT- zqE8t5NM;-9n9+cNXxY%51IbJ_A(c;iplGtSLQB~%>9i5+PC(j`RyQQxy`Jjo^%hY# z07JtlI1#>qDT<#r1`>M)+1MC{DR^xtfMbxC1rYkItvG=_1CCw!TW?SQH3c-So)11s zEwy@wxt$ZO+XFOJT#G3-mO>^cn}7Tk3=^l3`Xs!#Pq?0(-$JWTc2L^J4AG(TTU^?D zo`jx_Ke|oaZo4ZqfwNfRIXI zhv~OF>U9TmZ9}Tq>P9MZd4_G*{3wzBr4I_bFK@kjJ;I|8I;2qDl6?rHVffaa;3+m9YsiJ zuvW{-GbNY4+iSCl7q`FpmX-O_^VaCf5lJYcYBd=9*r`9HP=~E~0ef{LKe(`tu-Qv@ zW#b4@(U;u~?FMv`%u1#ak&K4wb{aSKDx+*1UFDmJoc`c)@U9Gc8>|6z#_FHx7>7=D zfPM=C4H1w6Gk&HYhDmH( zod4XfoxlB(}22#FylpUz9NLw!XSG!rHrd@G=cok0UK|T=I{dn1f`-)!opp z+NW71^EO{qj|gQ>7?1lOv@4EoZl$no)sUuYYz5R%s_ zJ}E*>_UHN=^v?c`PkPX(L8^FJe3SDhg%s+8&CLrNrXcepNofoc#&mL3jR=~ls<&jk zHj(g&#lR;oB`%H##_kP4`~YEaBl=6+`2-kz?(!w40i1=bAh`jVTPnyv!4Kp4O!gTb*YySv}OEavCsqFz^T{+lC) zrT%+ykrGVcFk{R~UHB>e(lb&|SUtFH1V4l0vZn!%52Q?ZO3IL~792<6c3{Z-C9o>~ z5OU{C&&c=>4Qy%vpOXP`hmR8P13YK-U{R|y1c~U^AY~2bfUx)aC@0(6Itc=Wm`Rtp z=?#D@#nGev7yJK}oSq&zHm0NtrmtFtlkl^{LAW3)1;C2GztVo8lN)3m=%)7-4iF}} zXrJwWKI-bBKYX$A(E$8DZxsY~%E8zsG$lxQWf@IVV6i|;?FP@C{Tf~~V5m4nRSxTY z01U z-N=B!c?T}Drm7JnVrpriG}wgGitTe%R#O{MTW@pzGdM@4=IQ z>vpa#z14dK9Prn|>93H0;Vs_vhMG~@TpDEHd%gN~8Tti(yz_sbO@Jnr^Wo;Cjhe%H zkQ=lCs-IXy0sAEFq+FX2FqOx#!rvk9?N4jfoFx9gy*jsZ`Kmo%HM#y2|qCqG4`vzr9M-EO{S&p ze7UikObt{fPcaV+`~)vf1TQXtL*};2CF5cfvZpV|=WSR*c&VTK$B%>mm6{S8=KBAS zX-WzP*+ha|O4?$9M!CM_%fg)<5d5gqOzU?5Khc|_Rhr*7y+(iJBi`g}V8HL8oI$(s z=Wiuy2mt)0UHEb#SK>2BR)9GG4Ddx7q-g!>>gqTU-hwHDAX3V;G&(ql4VIQfkLbuq z9576QURbzg{E~Lh{?$fo>I$6j*r=r|Sh{XT5e{dFE{r@_q19!(6B^ zM)&x)ZAc8Kx3G*!RKiZ#urJu#Wtv1KCfWc^Aojt~DrOkCI=ad~Y%Ak0O1}YS zO4T|x37Zs{HlkhoH5@>>=|B@gf;Df>4n*vzuI>?s=J@4MJCw?mU_={QAhHKYc65~G zTG!HiX{mwUTjLdv%_3WqZ=q0x)N#uiH(){?0|V)a{^1-p9f^QeHJ-Av^56g4tmaWT zF3j>_y0rg~(o+5GL+wu`oiO*?O~b=B$0_&O&Vz0R_Orz|Ut^(6yymz_&ARy88)$OB<`DQmwZ@`TivxUclEC-P z?miE;WN10yy|D5kd>}aivqXlO;7xCyF-wR7;vu4?1+v+ZVxwTPCRYn%^px{{1gJ%a! z*qW6lm|)r^7-mPNdm-{)Cpe!#lL|ono$2;mfq`WAb|$o`stL>2*2R~QijB&0h#HhU zBcu(SQ+$|TH(a1eD6MqX=V%RL?B1Uz3|u6$cie67HRRCwn=t*x51K%e_6`j0wPbCF z=VNsX*ge4*B^&*Qhk`U42|K%AWXODAGBJ;2J!sq}*@)=TY7J}vZ|hn_i@^%8>lo>V z+V8qmQ#02{NnH@b^61P3UY2PGrbqOUF1;v0O;ug`m%R8-O`yT+#ARA3E-)9p9XQHK zXKuK7z$A2`e`AuMjOhYHPdWZ?f3<7@WT968ueCxcV#o48VWG6vK`_-tRWEw*n~EqO z#SVE~Sl?!VZtx<6p*NzOvrpDdMSNtUM%8&_ERl(}EH6Th8dm?@Pads(uvCuK-xdT! zYNn|m{5#h>mRiZw54YlaPfjs92Qv)bwcXsaEOOJ)HPN>jaGgcOW~!WA@uhS_%F26a zw#ot)y0LVNX*53h8^?m{7IVOvU#nY%Z(R)R(t1=2U*7b%lEwgDryOroSf5!yy5Vfx z_#(tiO~6@i7>&Q{itpZ;fshi$9GLD5*2jpji>P-t%53l`B(t8rcyCxVaJS*dNeAd^ zyA+2%$xou^Kx?tYa^RdEb~1zf#4;BU8F>oBA*3XQ?Sl<_3Tw8;czBkFRLR$`kz$q7 zpZ&($zd&4mO5Fy0_0M3c8W8)hy4UOL<51eZL@H`?eShZpQl>i7Sb8wJgU9B6_T0^T zZ;vn8S)ue`hM_V-V2Pd8N}CfbjMI9N)yLaR$9MZrKwkIl zkN~Tm&COT=HM^_5S32z&M_(MS5qPJ|t8cv(T=seHl-YQ=HS>`?-(eOCtGLf4*tw#)ay|*pUBb{-UgV+pNaALq`N)f;p*-T#8(0Sc8Xau_{&KBRWhDAt!bu zGvUmbwgtu;q_D6OP;RKn0$ipj_3d-&!@H;b?)|%e0eWcdT4B^tSTqNGQt`&nN7lts z%f@xdclzfj{Le3m-NL`68+xT1_M*?`CWd__2X8VL9Ypz~)m;FjXjPJpy^N2)_L~0z zj*;GLd_5e8=MDLnsytdgzpKeKki|#%bk5hV_|BNpudn#jVPO>TH%JYQ2*vXCvGH*$ zIXAAa+i5AeiIYTanB0$FDQFvkdAT5Ro_;Iab!WzM2sz7Vb_gj`2QMvxkRlX!mPWnJ zTn;1LVLTQ)L!Yc5?qEGOyX5`TV&i(%c&*(SE|vJiVe__V+AH?V-u1O>PT-D}CgJ=682S6^mi{(2kog5njPn~D>O+igrUvITckA0iQvmD;NWHdUhO zk4F9SAoTW{g z7T+uaexA_yE`E@EuvVkHNw;{JNs?tZA?1gQ&n-9K(oy(%jHl+SnQK(*ApH^@A$!kZ zVPQj{50E-p!E8^Wo33l8lRH0&f+v~GKI7^gC;tHlua3}7h|G$OfqPeS{#R|!!F-=U zK)OZPM2tW4EQGl`p7g4Js66wVZVHFJ{suaKLq=BUe{T|Kh)`|Z zMCiKiFZ$2w>Ur(ggcVosjJ==sYwULeuehB`lgOww8j&;>#T6v9#N6egbW7mNTQB$# zrPMkQzQ|znK67LUi_kFggrA*q+3JZDnS?&8R<)fiK0L;AiH~ZK6eNHZl@EtMrqzm8>aZn~R+6 z_tY>Za1|cC=w0J4w5GtSJa4g#Gt&&)?wXB7d*_Q~w%{ zy{%@oY1?%9SH4WWRJK$@1&!vNNwHuh8kbu%qsaG5_kha5yM*y3= zaUfxK115@9n$qzWaVI-}mS9dOoKB zS3xs*;pniU5Hxr1PK~lKW5=6d^@N5;KL$I97_`v_Cw7EU`U*8d)L7Jt+MHT@rwfyt z3A{P#pE>8E_sMgTm2E#wO>pawYs@L%Gz%L}89*FPfhhvSc!d#0An3nE&N>wDe^YuH z3)^C5GY$}hD-KsG3+Rgl-jIwcJ;h#ydbuczS|!fGNK?l}VP~AptA>Wg1+^yR-oN@= zlb_&cAju}pv75XBX*UM=5lGlx0pA82pcz|5D%aO==ZRryY2=H*UyN|}o7v%_-Tcg= zG9)tWc;##T0ENGW9^-Ro*A{hrVVS(I#IR=A_}_ zo7*w;yZhnNxR#%d#&5tt2vc0m;bDclGy$nyyF9=p35AOXb6F6FggiD_X-Bl_K<9N* z7mN`U4Ysh6)xyc!UwUZ9PRCC3icYgbzI6j;NIf&|{=RgvVshfKqX$-Z0 zY7<%yY|k-m=f_R-W@X$gdPO6DJH@;1`Zx%Ckw&X2N$7xE!UroF)AVG-KVy^DufJ|< zY;4>r)*D5ZZ5}?FbYe59E?GuL3oK3AO@&?oz{H|eh3tm^r&-*`&yRZIUWf2&YWj)$ z$L#f?{Hyz z`V%Wets^7#6<|jvGA)CjLG23?K)kJ?L-j(|cXTcHZ(%`@@Hh9`n)Ww8S*7Dg!Em2B zo}k8k4JSUQQ-O!`Kz_$4zK+@K*9-JlINg2T83+;>R()Eb>xZY$f6!#${)UKs@-mOx z(9j?V8a)Q+Odz^%SO6P#i{;&|ZEf!A>$#CLGm{XX*OVxm&HfYSy0@Hta;VJe2(A`5 zI;&J(#!FdcqV!(4jTE*_t~WPZM8kaCq&8K~&?|CxUyDE39|DIk&fSFnqD8-Ck(pqR z#f+?+dwl_95<{b>&->uIPUafb_4Z18dU`_eS8Io&DHvK?SFI6yG9u=Pj)|c(#jNv3 z?JyWjTNxu1o$vNCmc%!WU7c&f@pQZdXv&C^+oj~x!>E~$&v!zF^ayPHP0Pv(7=LJ3 z0QGGp6zXksf4S$MbJd}2#!#<&V&j)a;$zsA4oQ54sE?sZ<^wpU&&!kigq!G_tqbqZ z1`joeq2GY$^Kk^%F*+`;WJaD}=%+N~1qVL!*h>h}I-9jYe$RziRv(I1RKCdkx-t$u zkKT(svTa8i*-m2mX;9yT!B7A8hS(DDq_u2ES6A94bEpmiLhG`Sh?ED^ODDuMskuyx zWLdq|$rX!)#hwX&)wb8CcrPGf8)0k8FPIAhc{E_fPZ)SJM2Sz^#BK77oqItt5>{qq zWz_`=y9q#D2N_4sem>$XYe|P@>Jn7woxT(UQEEn;%Ogi=adD{pPSHC|_rT*A3sUJN zC`E91v4TOm#~6UisE9~oSuuva*T?XR2_$j?4c2 z;J7XA3ec^F9+v&bNPBkv!oot=@aX8-&khIQ`>Vz-PEz6^l^r2TNnu`=%9-Fd#@<IxHL($5+U>uG~|jhkIX)qCoWY^ELIn!(reKHcBw9+Gk>d zCH%O3JM}A5cSC?unXH7_mgz6KprNlvS)zakZ?i~@7I}|CZ3Dil5s~0DD8Xh{dus|_) zc_hU&UJ!+b^w8{baXXx<%ivPhkP)?yY4H)pnPR81JPqqf(0n7x7g_ahUAE|+et)D0 zWt(6q^90Xw5i;X5R$wcBkE);wwFczYP0?-|yXH-Lz_{WdIoVZ|YCbR$;FFWRs*E#w zm>tB{iS72Wro}6^6d3T=)6i7T3PrzMz*syJeLWWF0#0w$B#GXUKQrNso4P4cs-lnKx7#qgFY~sQw)2Z@{0^zG27N7`y$qH0?rs)a|5Ao${ zV9bv}k*t_IKrch7svhfTmq2`SC^fa?bfDg{0OKEl1j5y+GTGVLi2ja}vAQ)DM10+R zM8v}Nf15+8bxK(0`?G+X(Vg4{1ruPhpHE3W;PF}j-ai!%-kqL5K9nDc>d@;Q1F*cC zNUcWGw|Gu9*ym4nsF7xhz&JnAPY*5|{9aRI%=VsLpcn$y`0`so$FErvL6MLLp37wV z^N-9YAi~AA-QFJo28OPw!Ix+0@%%7sKtM4b8h})+!wsGc#I`X8fAs6}`kI&0R%zgZ z?%@IW%MlHgep%hP#UP%|*vQDk+gBjZN-Vs~xj9|Cg2(#!6fDajWENDL!M%%Hh>)t_ zZWa`bK>X3r4`K0&|Lbimk+~e(Yg}E0iH^Y#+vn^nE3)c z5TcE2ZEbl!JYK!;dge^PMJG-)`Q3O|k;4bjklUl#vU-69aWHm70JX1bS;i0>1Y1gA zP~3{Z(xI5F1(kJp?f7dG$ce8u*FmxSpT|sONR<->DkKz<;X&YkAI=N`)ZjPJ)u#0A zM;wvAdw3`zI5(m(TD(skAWRReAShEm&3f^!z;Y+i_&c=b6rfqOsxWPiEfV2-$0S@` zT@kABv**vT^N}xOd6zOWGK?%eXsG#TwY9arH_%XhVvL@x4nJ3Aq9|@Cj2tyk8&dRd z8XNCJ5?^oKRWW|{Vk`>A|DiDRC71_j*VNR2mC0^=fDXtWb8~aw8{c`o?o=+{esyiF z=Nfnkkl#wmhXE0C4-D`^4vmjfZj6T;f&NJHW!w_1J?d!i4nl7QUZ*!8+zc6Mmyzs8 z$QvL&aKbqq02=wmG1#E0JPHZWa$tCT1%0SIVl#zN{R((yDV?c%j@T)1E19N80r&(J z$t2LM_IR{iyNZH>!_{KB4KB(PiTAL9o5Mk<4bk9j1hLJ&ToJ@+q$tw0#DhLZEXt6-ag})NLDIzBQy`@e{acqs^Ddy64i3 zU>$b%hK=X~Y`cgPfE);$L}kj)%KBMS4rlM>rJ}8^-OWd)c5!jNV+-PGg#X<6h~41-Z9bpRtSf$Z We26nIsh1akm! one block + Einheiten der Parameter ergänzen? + Grafik Modelle anpassen + Referenzen in references_all.bib ergänzen + +The rheological models implemented in AvaFrame can be written in a general form: + +.. math:: + \tau = \tau_y + k \cdot \left( \frac{du}{dz} \right)^n + C \cdot \left( \frac{du}{dz} \right)^2 + :label: rheology-general + +:numref:`Overview-rheological-models-table` gives an overview about the relation between the implemented rheological models and the used parameters: + +.. _Overview-rheological-models-table: + +.. table:: Overview of the implemented rheological models and their parameters according to :eq:`rheology-general` + + +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ + | :math:`\boldsymbol{Model}` | :math:`\boldsymbol{\tau_y}` | :math:`\boldsymbol{k}` | :math:`\boldsymbol{n}` | :math:`\boldsymbol{C}` | + +=====================================+=============================+========================+========================+========================+ + | *O´Brien and Julien (1985)* | :math:`> 0` | :math:`\eta` | :math:`= 1` | :math:`> 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ + | *Herschel and Bulkley (1926)* | :math:`> 0` | :math:`\eta` | :math:`\neq 1` | :math:`= 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ + | *Ostwald (1929)* | :math:`= 0` | :math:`\eta` | :math:`\neq 1` | :math:`= 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ + | *Bingham (1919)* | :math:`> 0` | :math:`\eta` | :math:`= 1` | :math:`= 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ + | *Newton (1687)* | :math:`= 0` | :math:`\eta` | :math:`= 1` | :math:`= 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ + +where :math:`\tau_y` is the yield shear stress, :math:`\eta` is the dynamic viscosity, :math:`n` is a flow exponent and :math:`C` is +the dispersive shear stress. + +:numref:`Overview-rheological-models-fig` illustrates the behaviour of the graphs of the rheological model for different shear rates. + +.. _Overview-rheological-models-fig: + +.. figure:: _static/Overview_rheological_models.png + :width: 90% + + Overview rheological models + + +It is well known that the viscosity :math:`\eta` and the yield shear stress :math:`\tau_y` are both a function of the +volumetric sediment concentration :math:`C_v`. The dependencies are expressed by following equations (e.g. O´Brien and Julien 1993): + +.. math:: + \eta = \alpha_1 \cdot e^{\beta_1 \cdot C_v} + :label: eta-cv + +.. math:: + \tau_y = \alpha_2 \cdot e^{\beta_2 \cdot C_v} + :label: tauy-cv + +where :math:`\alpha_1` and :math:`\beta_1`, :math:`\alpha_2` and :math:`\beta_2`, respectively, are empirical coefficients which +are determined in lab experiments. + +Since the governing equations to be solved are depth-averaged, the shear rate :math:`\frac{du}{dz} = \dot\gamma` +cannot be considered directly. Assuming a parabolic vertical flow velocity distribution the integration +over the flow depth results in following substitution (e.g. Iverson 1997, Iverson and Denlinger 2001, Gibson et al. 2020): + +.. math:: + \dot{\gamma} = \frac{3 \cdot |V|}{h} + :label: shearRate_substitution + +where :math:`|V|` is the depth-averaged magnitude of the flow velocity and :math:`h` is the flow depth. + +O´Brien and Julien (1985) +""""""""""""""""""""""""""" +The quadratic rheological model proposed by O´Brien and Julien (1985) accounts for various shear stress components, including +cohesive yield stress, viscous stress, turbulent stress, and dispersive stress, which arise from sediment particle +collisions under high deformation rates. +The resulting shear stress reads: + +.. math:: + \tau = \tau_y + \eta \cdot \left(\frac{3 \cdot |V|}{h} \right) + C \cdot \left(\frac{3 \cdot |V|}{h} \right)^2 + :label: oBrienAndJulien + +The dispersive shear stress is taken into account by the factor :math:`C` which incorporates the sediment concentration +:math:`\lambda` (Bagnold 1954): + +.. math:: + C = \rho_m \cdot l_m^2 + \alpha_i \cdot \rho_s \cdot \lambda^2 \cdot d_s^2 + :label: dispersiveShearStress + +.. math:: + \frac{1}{\lambda} = \left(\frac{C_m}{C_v}\right)^{1/3} - 1 + :label: sedimentConcentration + +where :math:`\rho_m` is the mass density of the solid-fluid mixture, :math:`\rho_s` is the mass density of sediment, +:math:`l_m` is the Prandtl mixing length (approximate :math:`0.4 \cdot h`), :math:`d_s` is the sediment size and +:math:`\alpha_i` is a coefficient (= 0.01, Takahashi 1978). + +Herschel and Bulkley (1926) +""""""""""""""""""""""""""""" +If the dispersive stress is not accounted for the simulation (:math:`C = 0`), the last term on the right handside of equation (ganz oben) +is neglected and the rheology results in the model by Herschel and Bulkley (1926): + +.. math:: + \tau = \tau_y + \eta \cdot \left(\frac{3 \cdot |V|}{h} \right)^n + :label: herschelAndBulkley + +with :math:`k = \eta`. + +Ostwald (1929) +""""""""""""""""""""""""""" +Like Herschel and Bulkley (1926) the rheological model proposed by Ostwald (1929) is a power-law but with the difference that +no yield stress is taken into account. The resulting shear stress reads: + +.. math:: + \tau = \eta \cdot \left(\frac{3 \cdot |V|}{h} \right)^n + :label: ostwald + +Bingham (1919) +""""""""""""""""""""""""""" +The rheological model proposed by Bingham (1919) is an extension of the one developed by Newton (1687) describing newtonian fluids. Like the +newtonian model, the Bingham model is linear with the difference that a yield shear stress has to be exceeded before +the deformation of the fluid is initialized. The equation reads: + +.. math:: + \tau = \tau_y + \eta \cdot \left(\frac{3 \cdot |V|}{h} \right) + :label: bingham + +Newton (1687) +""""""""""""""""""""""""""" +Newton´s law of viscosity describes ideal fluids (e.g. pure water) where the viscosity remains constant and the relationship +between shear stress :math:`\tau` and shear rate :math:`\dot\gamma` is linear. The equation is as follows: + +.. math:: + \tau = \eta \cdot \left(\frac{3 \cdot |V|}{h} \right) + :label: newton + Dam ~~~ From f3c9de6a2740fb6b7232f071bb2aa28bd145b54c Mon Sep 17 00:00:00 2001 From: JuLa96 <206707905+JuLa96@users.noreply.github.com> Date: Wed, 13 Aug 2025 16:26:55 +0200 Subject: [PATCH 3/5] Update Rheological Models --- avaframe/com1DFA/DFAfunctionsCython.pyx | 76 +++++--- avaframe/com1DFA/com1DFA.py | 49 ++--- avaframe/com1DFA/com1DFACfg.ini | 76 +++++--- docs/_static/Overview_rheological_models.png | Bin 40369 -> 41096 bytes docs/references_all.bib | 106 +++++++++++ docs/theoryCom1DFA.rst | 187 ++++++++++--------- 6 files changed, 319 insertions(+), 175 deletions(-) diff --git a/avaframe/com1DFA/DFAfunctionsCython.pyx b/avaframe/com1DFA/DFAfunctionsCython.pyx index bea05e379..cd23ee867 100644 --- a/avaframe/com1DFA/DFAfunctionsCython.pyx +++ b/avaframe/com1DFA/DFAfunctionsCython.pyx @@ -76,10 +76,6 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType cdef double entShearResistance = cfg.getfloat('entShearResistance') cdef double entDefResistance = cfg.getfloat('entDefResistance') cdef double rho = cfg.getfloat('rho') - cdef double rhos = cfg.getfloat('rhos') - cdef double ds = cfg.getfloat('ds') - cdef double cmax = cfg.getfloat('cmax') - cdef double cv = cfg.getfloat('cv') cdef double rhoEnt = cfg.getfloat('rhoEnt') cdef double gravAcc = cfg.getfloat('gravAcc') cdef double xsiVoellmy = cfg.getfloat('xsivoellmy') @@ -90,12 +86,24 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType cdef double muCoulomb = cfg.getfloat('mucoulomb') cdef double muCoulombMinShear = cfg.getfloat('mucoulombminshear') cdef double tau0CoulombMinShear = cfg.getfloat('tau0coulombminshear') + cdef double rhoSediment = cfg.getfloat('rhoSediment') + cdef double sizeSediment = cfg.getfloat('sizeSediment') + cdef double cvMaxSediment = cfg.getfloat('cvMaxSediment') + cdef double cvSediment = cfg.getfloat('cvSediment') + cdef double alpha1EtaObrienAndJulien = cfg.getfloat('alpha1EtaObrienAndJulien') + cdef double beta1EtaObrienAndJulien = cfg.getfloat('beta1EtaObrienAndJulien') + cdef double alpha2TauyObrienAndJulien = cfg.getfloat('alpha2TauyObrienAndJulien') + cdef double beta2TauyObrienAndJulien = cfg.getfloat('beta2TauyObrienAndJulien') cdef double alphaObrienAndJulien = cfg.getfloat('alphaObrienAndJulien') - cdef double alpha1Eta = cfg.getfloat('alpha1Eta') - cdef double beta1Eta = cfg.getfloat('beta1Eta') - cdef double alpha2Tauy = cfg.getfloat('alpha2Tauy') - cdef double beta2Tauy = cfg.getfloat('beta2Tauy') - cdef double n = cfg.getfloat('n') + cdef double alpha1EtaHerschelAndBulkley = cfg.getfloat('alpha1EtaHerschelAndBulkley') + cdef double beta1EtaHerschelAndBulkley = cfg.getfloat('beta1EtaHerschelAndBulkley') + cdef double alpha2TauyHerschelAndBulkley = cfg.getfloat('alpha2TauyHerschelAndBulkley') + cdef double beta2TauyHerschelAndBulkley = cfg.getfloat('beta2TauyHerschelAndBulkley') + cdef double nHerschelAndBulkley = cfg.getfloat('nHerschelAndBulkley') + cdef double alpha1EtaBingham = cfg.getfloat('alpha1EtaBingham') + cdef double beta1EtaBingham = cfg.getfloat('beta1EtaBingham') + cdef double alpha2TauyBingham = cfg.getfloat('alpha2TauyBingham') + cdef double beta2TauyBingham = cfg.getfloat('beta2TauyBingham') cdef double curvAccInFriction = cfg.getfloat('curvAccInFriction') cdef double curvAccInTangent = cfg.getfloat('curvAccInTangent') cdef int curvAccInGradient = cfg.getint('curvAccInGradient') @@ -309,28 +317,38 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType # Voellmy with optional spatially variable mu and xi values provided as rasters tau = muVoellmyRaster * sigmaB + rho * uMag * uMag * gravAcc / xsiVoellmyRaster elif frictType >= 10: - # viscosity - eta = alpha1Eta * math.exp(beta1Eta * cv) - # yield shear stress - tauy = alpha2Tauy * math.exp(beta2Tauy * cv) + # substitution of shear rate gamma + shearRate = 3 * uMag / h if frictType == 10: - # O`Brien and Julien + ## O`Brien and Julien + # viscosity + etaObrienAndJulien = alpha1EtaObrienAndJulien * math.exp(beta1EtaObrienAndJulien * cvSediment) + # yield shear stress + tauyObrienAndJulien = alpha2TauyObrienAndJulien * math.exp(beta2TauyObrienAndJulien * cvSediment) + # Prandtl mixing length lmObrienAndJulien = 0.4 * h - lambdaBagnold = 1 / (math.pow(cmax / cv, 1 / 3) - 1) - cObrienAndJulien = rho * lmObrienAndJulien * lmObrienAndJulien + alphaObrienAndJulien * rhos * lambdaBagnold * lambdaBagnold * ds * ds - tau = tauy + eta * 3 * uMag / h + cObrienAndJulien * (3 * uMag / h * 3 * uMag / h) - if frictType == 11: - # Herschel and Bulkley - tau = tauy + eta * math.pow(3 * uMag / h, n) - if frictType == 12: - # Ostwald - tau = eta * math.pow(3 * uMag / h, n) - if frictType == 13: - # Bingham - tau = tauy + eta * 3 * uMag / h - if frictType == 14: - # Newton - tau = eta * 3 * uMag / h + # grain concentration + lambdaBagnold = 1 / (math.pow(cvMaxSediment / cvSediment, 1 / 3) - 1) + # dispersive shear stress + cObrienAndJulien = rho * lmObrienAndJulien * lmObrienAndJulien + alphaObrienAndJulien * rhoSediment * lambdaBagnold * lambdaBagnold * sizeSediment * sizeSediment + # shear stress + tau = tauyObrienAndJulien + etaObrienAndJulien * shearRate + cObrienAndJulien * (shearRate * shearRate) + elif frictType == 11: + ## Herschel and Bulkley + # viscosity + etaHerschelAndBulkley = alpha1EtaHerschelAndBulkley * math.exp(beta1EtaHerschelAndBulkley * cvSediment) + # yield shear stress + tauyHerschelAndBulkley = alpha2TauyHerschelAndBulkley * math.exp(beta2TauyHerschelAndBulkley * cvSediment) + # shear stress + tau = tauyHerschelAndBulkley + etaHerschelAndBulkley * math.pow(shearRate, nHerschelAndBulkley) + elif frictType == 12: + ## Bingham + # viscosity + etaBingham = alpha1EtaBingham * math.exp(beta1EtaBingham * cvSediment) + # yield shear stress + tauyBingham = alpha2TauyBingham * math.exp(beta2TauyBingham * cvSediment) + # shear stress + tau = tauyBingham + etaBingham * shearRate else: tau = 0.0 diff --git a/avaframe/com1DFA/com1DFA.py b/avaframe/com1DFA/com1DFA.py index 85d5582be..ccac63e7d 100644 --- a/avaframe/com1DFA/com1DFA.py +++ b/avaframe/com1DFA/com1DFA.py @@ -813,46 +813,31 @@ def createReportDict(avaDir, logName, relName, inputSimLines, cfg, reportAreaInf "type": "columns", "model": "O´Brien and Julien", "alpha": cfgGen["alphaObrienAndJulien"], - "Cmax": cfgGen["cmax"], - "Cv": cfgGen["cv"], - "alpha1": cfgGen["alpha1Eta"], - "beta1": cfgGen["beta1Eta"], - "alpha2": cfgGen["alpha2Tauy"], - "beta2": cfgGen["beta2Tauy"], + "Cmax": cfgGen["cvMaxSediment"], + "Cv": cfgGen["cvSediment"], + "alpha1": cfgGen["alpha1EtaObrienAndJulien"], + "beta1": cfgGen["beta1EtaObrienAndJulien"], + "alpha2": cfgGen["alpha2TauyObrienAndJulien"], + "beta2": cfgGen["beta2TauyObrienAndJulien"], } elif cfgGen["frictModel"].lower() == "herschelandbulkley": reportST["Friction model"] = { "type": "columns", "model": "Herschel and Bulkley", - "n": cfgGen["n"], - "alpha1": cfgGen["alpha1Eta"], - "beta1": cfgGen["beta1Eta"], - "alpha2": cfgGen["alpha2Tauy"], - "beta2": cfgGen["beta2Tauy"], - } - elif cfgGen["frictModel"].lower() == "ostwald": - reportST["Friction model"] = { - "type": "columns", - "model": "Ostwald", - "n": cfgGen["n"], - "alpha1": cfgGen["alpha1Eta"], - "beta1": cfgGen["beta1Eta"], + "n": cfgGen["nHerschelAndBulkley"], + "alpha1": cfgGen["alpha1EtaHerschelAndBulkley"], + "beta1": cfgGen["beta1EtaHerschelAndBulkley"], + "alpha2": cfgGen["alpha2TauyHerschelAndBulkley"], + "beta2": cfgGen["beta2TauyHerschelAndBulkley"], } elif cfgGen["frictModel"].lower() == "bingham": reportST["Friction model"] = { "type": "columns", "model": "Bingham", - "alpha1": cfgGen["alpha1Eta"], - "beta1": cfgGen["beta1Eta"], - "alpha2": cfgGen["alpha2Tauy"], - "beta2": cfgGen["beta2Tauy"], - } - elif cfgGen["frictModel"].lower() == "newton": - reportST["Friction model"] = { - "type": "columns", - "model": "Newton", - "alpha1": cfgGen["alpha1Eta"], - "beta1": cfgGen["beta1Eta"], + "alpha1": cfgGen["alpha1EtaBingham"], + "beta1": cfgGen["beta1EtaBingham"], + "alpha2": cfgGen["alpha2TauyBingham"], + "beta2": cfgGen["beta2TauyBingham"], } # check if secondary release area @@ -1903,9 +1888,7 @@ def DFAIterate(cfg, particles, fields, dem, inputSimLines, outDir, cuSimName, si "spatialvoellmy", "obrienandjulien", "herschelandbulkley", - "ostwald", - "bingham", - "newton" + "bingham" ] frictModel = cfgGen["frictModel"].lower() frictType = frictModelsList.index(frictModel) + 1 diff --git a/avaframe/com1DFA/com1DFACfg.ini b/avaframe/com1DFA/com1DFACfg.ini index 40f09d52b..d7085e8f5 100644 --- a/avaframe/com1DFA/com1DFACfg.ini +++ b/avaframe/com1DFA/com1DFACfg.ini @@ -62,20 +62,9 @@ ftOptionIni = False #+++++++++SNOW properties # density of snow [kg/m³] -# Override for density of fluid-solid mixture for debris flows rho = 200 # density of entrained snow [kg/m³] rhoEnt = 100 -#+++++++++DEBRIS FLOW properties -# density of sediment [kg/m³] -rhos = 2650 -# mean sediment size [m] -# TODO adjusting -ds = 0.002 -# maximum concentration of sediment particles [m³/m³] -cmax = 0.615 -# volumetric sediment concentration [m³/m³] -cv = 0.5 ##### Thickness is unambiguous: it is measured normal to the slope #### #+++++Release thickness++++ # True if release thickness should be read from shapefile file; if False - relTh read from ini file @@ -295,6 +284,7 @@ centeredPosition = 1 # or use an implicit method (0) explicitFriction = 0 # friction type. Available options are: +### Granular friction models # samosAT - standard setup # samosATSmall - setup for release volumes < 25k m³ # samosATMedium - setup for release volumes < 60k m³ @@ -305,11 +295,10 @@ explicitFriction = 0 # spatialVoellmy # CoulombMinShear # wetsnow +### Rheological models # OBrienAndJulien # HerschelAndBulkley -# Ostwald # Bingham -# Newton # Please note that each type has their own/separate parameters: # https://docs.avaframe.org/en/latest/theoryCom1DFA.html#friction-model frictModel = samosATAuto @@ -368,25 +357,56 @@ TIni = -10 entTempRef = -10.0 # J/kgK (ice) cpIce = 2050.0 -#++++++++++++ Parameter Rheological models -#+++++Parameter viscosity (eta) and yield shear stress (tau_y) +#+++++++++DEBRIS FLOW properties +# density of sediment [kg/m³] +rhoSediment = 2650 +# mean sediment size [m] +## TODO adjusting +sizeSediment = 0.002 +# maximum concentration of sediment particles [m³/m³] +cvMaxSediment = 0.615 +# volumetric sediment concentration [m³/m³] +## TODO adjusting +cvSediment = 0.5 +#++++++++++++++Parameter Rheological models +#++++++++++++O´Brien and Julien # viscosity parameter -## TODO adjusting, O´Brien and Julien (1985) -alpha1Eta = 0.650 - ## TODO adjusting, O´Brien and Julien (1985) -beta1Eta = 16.81 +## TODO adjusting, default value O´Brien and Julien (1985) +alpha1EtaObrienAndJulien = 0.650 +## TODO adjusting, default value O´Brien and Julien (1985) +beta1EtaObrienAndJulien = 16.81 # yield shear stress parameter - ## TODO adjusting, O´Brien and Julien (1985) -alpha2Tauy = 0.00886 - ## TODO adjusting, O´Brien and Julien (1985) -beta2Tauy = 13.11 -#++++++++++++O´Brien and Julien -# parameter, default value (Takahashi 1978) +## TODO adjusting, default value O´Brien and Julien (1985) +alpha2TauyObrienAndJulien = 0.00886 + ## TODO adjusting, default value O´Brien and Julien (1985) +beta2TauyObrienAndJulien = 13.11 +# parameter, default value Takahashi (1978) alphaObrienAndJulien = 0.01 -#++++++++++++Herschel and Bulkley, Ostwald -# exponent +#++++++++++++Herschel and Bulkley +# viscosity parameter +## TODO adjusting, default value O´Brien and Julien (1985) +alpha1EtaHerschelAndBulkley = 0.650 + ## TODO adjusting, default value O´Brien and Julien (1985) +beta1EtaHerschelAndBulkley = 16.81 +# yield shear stress parameter + ## TODO adjusting, default value O´Brien and Julien (1985) +alpha2TauyHerschelAndBulkley = 0.00886 + ## TODO adjusting, default value O´Brien and Julien (1985) +beta2TauyHerschelAndBulkley = 13.11 +# flow exponent ## TODO adjusting -n = 1.5 +nHerschelAndBulkley = 1.5 +#++++++++++++Bingham +# viscosity parameter +## TODO adjusting, default value O´Brien and Julien (1985) +alpha1EtaBingham = 0.650 + ## TODO adjusting, default value O´Brien and Julien (1985) +beta1EtaBingham = 16.81 +# yield shear stress parameter + ## TODO adjusting, default value O´Brien and Julien (1985) +alpha2TauyBingham = 0.00886 + ## TODO adjusting, default value O´Brien and Julien (1985) +beta2TauyBingham = 13.11 #++++++++++++ Resistance model # default setup: diff --git a/docs/_static/Overview_rheological_models.png b/docs/_static/Overview_rheological_models.png index d7f2cea23c9f6c908c23efe4f662719fb4021bc0..c39bda107ef2386a701a825f0876bb0429b53eba 100644 GIT binary patch literal 41096 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 literal 40369 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 We26nIsh1akm! one block - Einheiten der Parameter ergänzen? - Grafik Modelle anpassen - Referenzen in references_all.bib ergänzen - -The rheological models implemented in AvaFrame can be written in a general form: +The rheological models are incorporated into a single, general form, which can be expressed as follows: .. math:: - \tau = \tau_y + k \cdot \left( \frac{du}{dz} \right)^n + C \cdot \left( \frac{du}{dz} \right)^2 + \tau = \tau_y + \eta_m \cdot \dot\gamma^n + C \cdot \dot\gamma^2 :label: rheology-general -:numref:`Overview-rheological-models-table` gives an overview about the relation between the implemented rheological models and the used parameters: +The yield shear stress :math:`\tau_y` :math:`[Pa]` defines a lower limit below which no flow takes place. +The dynamic viscosity :math:`\eta_m` :math:`[Pa \cdot s]` quantifies the internal frictional force between two neighbouring layers of the mixture in relative motion. +:math:`\dot\gamma` is the flow velocity gradient, or shear rate, :math:`\frac{du}{dz}` :math:`[s^{-1}]` along the axis normal to the slope (flow thickness). +The flow index :math:`n` describes the rheological behaviour of the mixture as :cite:`KaZhHaHe2025`: + +- :math:`n = 0` a rate-independent solid-like behaviour, +- :math:`n = 1` a Newtonian fluid-like behaviour, +- :math:`0 < n < 1` a shear-thinning non-Newtonian fluid-like behaviour, +- :math:`1 < n < 2` a shear-thickening non-Newtonian fluid-like behaviour, +- :math:`n = 2` an intertial mixture (fluid or solid). + +:math:`C` incorporates the turbulent and dispersive shear stresses :math:`[kg \cdot m^{-1}]`, +which considers the inertial impact between the mixture particles as well :cite:`ObJu1985`. + +Depending on how the parameters are selected, you can choose between three different models. :numref:`Overview-rheological-models-table` gives an overview +about the relation between the implemented rheological models and the used parameters: .. _Overview-rheological-models-table: .. table:: Overview of the implemented rheological models and their parameters according to :eq:`rheology-general` - +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ - | :math:`\boldsymbol{Model}` | :math:`\boldsymbol{\tau_y}` | :math:`\boldsymbol{k}` | :math:`\boldsymbol{n}` | :math:`\boldsymbol{C}` | - +=====================================+=============================+========================+========================+========================+ - | *O´Brien and Julien (1985)* | :math:`> 0` | :math:`\eta` | :math:`= 1` | :math:`> 0` | - +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ - | *Herschel and Bulkley (1926)* | :math:`> 0` | :math:`\eta` | :math:`\neq 1` | :math:`= 0` | - +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ - | *Ostwald (1929)* | :math:`= 0` | :math:`\eta` | :math:`\neq 1` | :math:`= 0` | - +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ - | *Bingham (1919)* | :math:`> 0` | :math:`\eta` | :math:`= 1` | :math:`= 0` | - +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ - | *Newton (1687)* | :math:`= 0` | :math:`\eta` | :math:`= 1` | :math:`= 0` | - +-------------------------------------+-----------------------------+------------------------+------------------------+------------------------+ - -where :math:`\tau_y` is the yield shear stress, :math:`\eta` is the dynamic viscosity, :math:`n` is a flow exponent and :math:`C` is -the dispersive shear stress. - -:numref:`Overview-rheological-models-fig` illustrates the behaviour of the graphs of the rheological model for different shear rates. + +-------------------------------------+-----------------------------+------------------------+------------------------+ + | :math:`\boldsymbol{Model}` | :math:`\boldsymbol{\tau_y}` | :math:`\boldsymbol{n}` | :math:`\boldsymbol{C}` | + +=====================================+=============================+========================+========================+ + | *O´Brien and Julien* | :math:`> 0` | :math:`= 1` | :math:`> 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+ + | *Herschel and Bulkley* | :math:`> 0` | :math:`\neq 1` | :math:`= 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+ + | *Bingham* | :math:`> 0` | :math:`= 1` | :math:`= 0` | + +-------------------------------------+-----------------------------+------------------------+------------------------+ + + +:numref:`Overview-rheological-models-fig` illustrates the behaviour of the graphs of the rheological models due to shear rate. .. _Overview-rheological-models-fig: @@ -667,11 +697,11 @@ the dispersive shear stress. Overview rheological models -It is well known that the viscosity :math:`\eta` and the yield shear stress :math:`\tau_y` are both a function of the -volumetric sediment concentration :math:`C_v`. The dependencies are expressed by following equations (e.g. O´Brien and Julien 1993): +It is well known that the bulk viscosity :math:`\eta_m` and the yield shear stress :math:`\tau_y` are both a function of the +volumetric sediment concentration :math:`C_v`. The dependencies are expressed by following equations :cite:`ObJu1985, ObJu1993`: .. math:: - \eta = \alpha_1 \cdot e^{\beta_1 \cdot C_v} + \eta_m = \alpha_1 \cdot e^{\beta_1 \cdot C_v} :label: eta-cv .. math:: @@ -681,29 +711,29 @@ volumetric sediment concentration :math:`C_v`. The dependencies are expressed by where :math:`\alpha_1` and :math:`\beta_1`, :math:`\alpha_2` and :math:`\beta_2`, respectively, are empirical coefficients which are determined in lab experiments. -Since the governing equations to be solved are depth-averaged, the shear rate :math:`\frac{du}{dz} = \dot\gamma` -cannot be considered directly. Assuming a parabolic vertical flow velocity distribution the integration -over the flow depth results in following substitution (e.g. Iverson 1997, Iverson and Denlinger 2001, Gibson et al. 2020): +Since the governing equations to be solved are depth-averaged, the shear rate :math:`\dot\gamma = \frac{du}{dz}` +cannot be computed directly. Assuming a parabolic vertical flow velocity distribution the integration over the flow thickness results +in following substitution :cite:`Iv1997, DeIv2001, GiFlSaHe2020`: .. math:: - \dot{\gamma} = \frac{3 \cdot |V|}{h} + \dot{\gamma} = \frac{3 \cdot \overline{u}}{\overline{h}} :label: shearRate_substitution -where :math:`|V|` is the depth-averaged magnitude of the flow velocity and :math:`h` is the flow depth. +where :math:`\overline{u}` is the depth-averaged flow velocity and :math:`\overline{h}` is the flow thickness. -O´Brien and Julien (1985) -""""""""""""""""""""""""""" -The quadratic rheological model proposed by O´Brien and Julien (1985) accounts for various shear stress components, including +O´Brien and Julien ++++++++++++++++++++ +The quadratic rheological model proposed by O´Brien and Julien :cite:`ObJu1985` accounts for various shear stress components, including cohesive yield stress, viscous stress, turbulent stress, and dispersive stress, which arise from sediment particle collisions under high deformation rates. The resulting shear stress reads: .. math:: - \tau = \tau_y + \eta \cdot \left(\frac{3 \cdot |V|}{h} \right) + C \cdot \left(\frac{3 \cdot |V|}{h} \right)^2 + \tau = \tau_y + \eta_m \cdot \dot{\gamma} + C \cdot \dot{\gamma}^2 :label: oBrienAndJulien -The dispersive shear stress is taken into account by the factor :math:`C` which incorporates the sediment concentration -:math:`\lambda` (Bagnold 1954): +The turbulence and dispersive shear stresses, which are both functions of the second power of the shear rate, +are taken into account by the factor :math:`C` which incorporates : .. math:: C = \rho_m \cdot l_m^2 + \alpha_i \cdot \rho_s \cdot \lambda^2 \cdot d_s^2 @@ -713,49 +743,36 @@ The dispersive shear stress is taken into account by the factor :math:`C` which \frac{1}{\lambda} = \left(\frac{C_m}{C_v}\right)^{1/3} - 1 :label: sedimentConcentration -where :math:`\rho_m` is the mass density of the solid-fluid mixture, :math:`\rho_s` is the mass density of sediment, -:math:`l_m` is the Prandtl mixing length (approximate :math:`0.4 \cdot h`), :math:`d_s` is the sediment size and -:math:`\alpha_i` is a coefficient (= 0.01, Takahashi 1978). +where :math:`\rho_m` is the mass density of the solid-fluid mixture :math:`[kg \cdot m^{-3}]`, :math:`l_m` is the Prandtl mixing length :math:`[m]` +(approximate :math:`0.4 \cdot h`), :math:`\alpha_i` is a coefficient (= 0.01, :cite:`Ta1978`), :math:`\rho_s` is the mass density +of sediment :math:`[kg \cdot m^{-3}]`, :math:`d_s` is the sediment size :math:`[m]`, :math:`\lambda` is the linear sediment concentration :cite:`Ba1954`, +:math:`C_m` is the maximum concentration of sediment particles (= 0.615, :cite:`Ba1954`) and :math:`C_v` is the volumetric sediment concentration. + +The quadratic rheological model is particularly suitable for simulating debris flows with high sediment concentrations, in which energy dissipation and +resistance due to turbulence and particle collisions are significant. -Herschel and Bulkley (1926) -""""""""""""""""""""""""""""" -If the dispersive stress is not accounted for the simulation (:math:`C = 0`), the last term on the right handside of equation (ganz oben) -is neglected and the rheology results in the model by Herschel and Bulkley (1926): +Herschel and Bulkley ++++++++++++++++++++++++++ +The model by Herschel and Bulkley :cite:`HeBu1926` is expressed by an empirical power-law equation: .. math:: - \tau = \tau_y + \eta \cdot \left(\frac{3 \cdot |V|}{h} \right)^n + \tau = \tau_y + \eta_m \cdot \dot{\gamma}^n :label: herschelAndBulkley -with :math:`k = \eta`. - -Ostwald (1929) -""""""""""""""""""""""""""" -Like Herschel and Bulkley (1926) the rheological model proposed by Ostwald (1929) is a power-law but with the difference that -no yield stress is taken into account. The resulting shear stress reads: - -.. math:: - \tau = \eta \cdot \left(\frac{3 \cdot |V|}{h} \right)^n - :label: ostwald +where the flow index :math:`n` describes the rheological behaviour of the mixture (see above). The factor in front of the shear rate +was originally introduced as a consistency factor :math:`K`. In :py:mod:`com1DFA` :math:`K` equals to the bulk dynamic viscosity :math:`\eta_m`. +This rheology applies to fine-grained soil-water mixtures that exhibit shear-thinning or shear-thickening behavior, respectively, with increasing shear rates. Bingham (1919) -""""""""""""""""""""""""""" -The rheological model proposed by Bingham (1919) is an extension of the one developed by Newton (1687) describing newtonian fluids. Like the -newtonian model, the Bingham model is linear with the difference that a yield shear stress has to be exceeded before -the deformation of the fluid is initialized. The equation reads: +++++++++++++++++ +After exceeding a threshold shear stress the rheological model proposed by Bingham :cite:`Bi1919` describes a linear relationship +between shear stress and shear rate. The equation reads: .. math:: - \tau = \tau_y + \eta \cdot \left(\frac{3 \cdot |V|}{h} \right) + \tau = \tau_y + \eta_m \cdot \dot{\gamma} :label: bingham -Newton (1687) -""""""""""""""""""""""""""" -Newton´s law of viscosity describes ideal fluids (e.g. pure water) where the viscosity remains constant and the relationship -between shear stress :math:`\tau` and shear rate :math:`\dot\gamma` is linear. The equation is as follows: - -.. math:: - \tau = \eta \cdot \left(\frac{3 \cdot |V|}{h} \right) - :label: newton - +The Bingham model is well-suited to homogeneous suspensions of fine particles at low shear rates (e.g. mudflows, :cite:`Ju2010`). Dam ~~~ From 19be5dd0043538b5a41b3f1117522b47b5af53da Mon Sep 17 00:00:00 2001 From: JuLa96 <206707905+JuLa96@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:26:52 +0200 Subject: [PATCH 4/5] Update avaframe/com1DFA/DFAfunctionsCython.pyx --- avaframe/com1DFA/DFAfunctionsCython.pyx | 76 ++++++++++++++----------- docs/theoryCom1DFA.rst | 28 ++++++--- 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/avaframe/com1DFA/DFAfunctionsCython.pyx b/avaframe/com1DFA/DFAfunctionsCython.pyx index cd23ee867..e3794e8a8 100644 --- a/avaframe/com1DFA/DFAfunctionsCython.pyx +++ b/avaframe/com1DFA/DFAfunctionsCython.pyx @@ -169,6 +169,8 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType cdef double nx, ny, nz, nxEnd, nyEnd, nzEnd, nxAvg, nyAvg, nzAvg cdef double gravAccNorm, accNormCurv, effAccNorm, gravAccTangX, gravAccTangY, gravAccTangZ, forceBotTang, sigmaB, tau cdef double muVoellmyRaster, xsiVoellmyRaster + cdef double shearRate, etaObrienAndJulien, tauyObrienAndJulien, lmObrienAndJulien + cdef double lambdaBagnold, cObrienAndJulien, etaHerschelAndBulkley, tauyHerschelAndBulkley, etaBingham, tauyBingham # variables for interpolation cdef int Lx0, Ly0, LxEnd0, LyEnd0, iCell, iCellEnd cdef double w[4] @@ -284,6 +286,13 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType else: # bottom normal stress sigmaB sigmaB = - effAccNorm * rho * h + if frictType >= 10: + # substitution of shear rate gamma + if h == 0.0: + message = "h is 0 - division by 0" + log.error(message) + raise ZeroDivisionError(message) + shearRate = 3 * uMag / h if frictType == 1: # SamosAT friction type (bottom shear stress) tau = DFAtlsC.SamosATfric(rho, tau0SamosAt, Rs0SamosAt, muSamosAt, kappaSamosAt, BSamosAt, RSamosAt, uMag, sigmaB, h) @@ -316,39 +325,40 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType xsiVoellmyRaster = xsiRaster[indCellY, indCellX] # Voellmy with optional spatially variable mu and xi values provided as rasters tau = muVoellmyRaster * sigmaB + rho * uMag * uMag * gravAcc / xsiVoellmyRaster - elif frictType >= 10: - # substitution of shear rate gamma - shearRate = 3 * uMag / h - if frictType == 10: - ## O`Brien and Julien - # viscosity - etaObrienAndJulien = alpha1EtaObrienAndJulien * math.exp(beta1EtaObrienAndJulien * cvSediment) - # yield shear stress - tauyObrienAndJulien = alpha2TauyObrienAndJulien * math.exp(beta2TauyObrienAndJulien * cvSediment) - # Prandtl mixing length - lmObrienAndJulien = 0.4 * h - # grain concentration - lambdaBagnold = 1 / (math.pow(cvMaxSediment / cvSediment, 1 / 3) - 1) - # dispersive shear stress - cObrienAndJulien = rho * lmObrienAndJulien * lmObrienAndJulien + alphaObrienAndJulien * rhoSediment * lambdaBagnold * lambdaBagnold * sizeSediment * sizeSediment - # shear stress - tau = tauyObrienAndJulien + etaObrienAndJulien * shearRate + cObrienAndJulien * (shearRate * shearRate) - elif frictType == 11: - ## Herschel and Bulkley - # viscosity - etaHerschelAndBulkley = alpha1EtaHerschelAndBulkley * math.exp(beta1EtaHerschelAndBulkley * cvSediment) - # yield shear stress - tauyHerschelAndBulkley = alpha2TauyHerschelAndBulkley * math.exp(beta2TauyHerschelAndBulkley * cvSediment) - # shear stress - tau = tauyHerschelAndBulkley + etaHerschelAndBulkley * math.pow(shearRate, nHerschelAndBulkley) - elif frictType == 12: - ## Bingham - # viscosity - etaBingham = alpha1EtaBingham * math.exp(beta1EtaBingham * cvSediment) - # yield shear stress - tauyBingham = alpha2TauyBingham * math.exp(beta2TauyBingham * cvSediment) - # shear stress - tau = tauyBingham + etaBingham * shearRate + elif frictType == 10: + ## O`Brien and Julien + if cvSediment >= cvMaxSediment: + message = "cvSediment must be smaller than cvMaxSediment" + log.error(message) + raise ValueError(message) + # viscosity + etaObrienAndJulien = alpha1EtaObrienAndJulien * math.exp(beta1EtaObrienAndJulien * cvSediment) + # yield shear stress + tauyObrienAndJulien = alpha2TauyObrienAndJulien * math.exp(beta2TauyObrienAndJulien * cvSediment) + # Prandtl mixing length + lmObrienAndJulien = 0.4 * h + # grain concentration + lambdaBagnold = 1.0 / (math.pow(cvMaxSediment / cvSediment, 1.0 / 3.0) - 1.0) + # dispersive shear stress + cObrienAndJulien = rho * lmObrienAndJulien * lmObrienAndJulien + alphaObrienAndJulien * rhoSediment * lambdaBagnold * lambdaBagnold * sizeSediment * sizeSediment + # shear stress + tau = tauyObrienAndJulien + etaObrienAndJulien * shearRate + cObrienAndJulien * (shearRate * shearRate) + elif frictType == 11: + ## Herschel and Bulkley + # viscosity + etaHerschelAndBulkley = alpha1EtaHerschelAndBulkley * math.exp(beta1EtaHerschelAndBulkley * cvSediment) + # yield shear stress + tauyHerschelAndBulkley = alpha2TauyHerschelAndBulkley * math.exp(beta2TauyHerschelAndBulkley * cvSediment) + # shear stress + tau = tauyHerschelAndBulkley + etaHerschelAndBulkley * math.pow(shearRate, nHerschelAndBulkley) + elif frictType == 12: + ## Bingham + # viscosity + etaBingham = alpha1EtaBingham * math.exp(beta1EtaBingham * cvSediment) + # yield shear stress + tauyBingham = alpha2TauyBingham * math.exp(beta2TauyBingham * cvSediment) + # shear stress + tau = tauyBingham + etaBingham * shearRate else: tau = 0.0 diff --git a/docs/theoryCom1DFA.rst b/docs/theoryCom1DFA.rst index edd594b5e..da3fce612 100644 --- a/docs/theoryCom1DFA.rst +++ b/docs/theoryCom1DFA.rst @@ -483,8 +483,8 @@ For solid-fluid mixtures like debris flows, where the properties of the fluid ph the shear stress tensor is, among other things, a function of dynamic viscosity :math:`\eta_m` and shear rate :math:`\dot\gamma` (:ref:`theoryCom1DFA:Rheological models`). .. math:: - \tau_i = f(\eta_m,\dot\gamma,\overline{h},\rho_m,t,\mathbf{x}) - :label: samosAT friction model + \tau^{(b)}_i = f(\eta_m,\dot\gamma,\overline{h},\rho_m,t,\mathbf{x}) + :label: rheological model With @@ -511,6 +511,7 @@ The bottom shear stress simply reads: .. math:: \tau^{(b)} = \tan{\delta}\,\sigma^{(b)} + :label: Mohr-Coulomb friction model :math:`\tan{\delta}=\mu` is the friction coefficient (and :math:`\delta` the friction angle). The bottom shear stress linearly increases with the normal stress component :math:`\sigma^{(b)}` (:cite:`Zw2000,BaSaGr1999,WaHuPu2004,Sa2007`). @@ -530,6 +531,7 @@ The bottom shear stress then reads: .. math:: \tau^{(b)} = c_{\text{dyn}}\,\rho_0\,\bar{u}^2 + :label: Chezy friction model :math:`c_{\text{dyn}}` is the viscous friction coefficient. The bottom shear stress is a quadratic function of the velocity. (:cite:`Zw2000,BaSaGr1999,WaHuPu2004,Sa2007`). @@ -538,6 +540,8 @@ This model enables to reach more realistic velocities for avalanche simulations. The draw back is that the avalanche doesn't stop flowing before the slope inclination approaches zero. This implies that the avalanche flows to the lowest local point. +.. _voellmyfrict: + Voellmy friction model +++++++++++++++++++++++ Anton Voellmy was a Swiss engineer interested in avalanche dynamics :cite:`Vo1955`. @@ -546,6 +550,7 @@ in order to take advantage of both. This leads to the following friction law: .. math:: \tau^{(b)} = \tan{\delta}\,\sigma^{(b)} + \frac{g}{\xi}\,\rho_0\,\bar{u}^2 + :label: Voellmy friction model where :math:`\xi` is the turbulent friction term. This model is described as Voellmy-Fluid :cite:`Sa2004,Sa2007`. @@ -561,6 +566,7 @@ In order to increase the friction force and make the avalanche flow stop on stee .. math:: \tau^{(b)} = \tau_0 + \tan{\delta}\,\sigma^{(b)} + \frac{g}{\xi}\,\rho_0\,\bar{u}^2 + :label: VoellmyMinShear friction model .. _samosatfrict: @@ -569,12 +575,13 @@ SamosAT friction model +++++++++++++++++++++++ SamosAT friction model is a modification of some more classical models -such as Voellmy model :ref:`theoryCom1DFA:Voellmy friction model`. The basal shear stress tensor :math:`\tau^{(b)}` +such as Voellmy model :ref:`voellmyfrict`. The basal shear stress tensor :math:`\tau^{(b)}` is expressed as (:cite:`Sa2007`): .. math:: \tau^{(b)} = \tau_0 + \tan{\delta}\,\left(1+\frac{R_s^0}{R_s^0+R_s}\right)\,\sigma^{(b)} + \frac{\rho_0\,\overline{u}^2}{\left(\frac{1}{\kappa}\,\ln\frac{\overline{h}}{R} + B\right)^2} + :label: SamosAT friction model With @@ -618,6 +625,7 @@ This approach is based on the Voellmy friction model but with an enthalpy depend .. math:: \tau^{(b)} = \mu\,\sigma^{(b)} + c_\text{dyn}\,\rho_0\,\bar{u}^2 + :label: Wet snow friction model where, @@ -625,6 +633,7 @@ where, .. math:: \mu = \mu_0\,\exp(-enthalpy/enthRef) + :label: mu enthalpy The total specific enthalpy of the particles is initialized based on their initial temperature, specific heat capacity, @@ -633,6 +642,7 @@ Throughout the computation, the particles specific enthalpy is then computed fol .. math:: enthalpy = totalEnthalpy - g\,z - 0.5\,\bar{u}^2 + :label: enthalpy Rheological Models """"""""""""""""""" @@ -652,10 +662,10 @@ and non-Newtonian fluids, in which a yield shear stress has to be exceeded or sh The rheological models are incorporated into a single, general form, which can be expressed as follows: .. math:: - \tau = \tau_y + \eta_m \cdot \dot\gamma^n + C \cdot \dot\gamma^2 + \tau^{(b)} = \tau_y + \eta_m \cdot \dot\gamma^n + C \cdot \dot\gamma^2 :label: rheology-general -The yield shear stress :math:`\tau_y` :math:`[Pa]` defines a lower limit below which no flow takes place. +The yield shear stress :math:`\tau_y` :math:`[Pa]` defines a lower limit below which no flow takes place (see :math:`\tau_0` at :ref:`samosatfrict`). The dynamic viscosity :math:`\eta_m` :math:`[Pa \cdot s]` quantifies the internal frictional force between two neighbouring layers of the mixture in relative motion. :math:`\dot\gamma` is the flow velocity gradient, or shear rate, :math:`\frac{du}{dz}` :math:`[s^{-1}]` along the axis normal to the slope (flow thickness). The flow index :math:`n` describes the rheological behaviour of the mixture as :cite:`KaZhHaHe2025`: @@ -729,7 +739,7 @@ collisions under high deformation rates. The resulting shear stress reads: .. math:: - \tau = \tau_y + \eta_m \cdot \dot{\gamma} + C \cdot \dot{\gamma}^2 + \tau^{(b)} = \tau_y + \eta_m \cdot \dot{\gamma} + C \cdot \dot{\gamma}^2 :label: oBrienAndJulien The turbulence and dispersive shear stresses, which are both functions of the second power of the shear rate, @@ -756,20 +766,20 @@ Herschel and Bulkley The model by Herschel and Bulkley :cite:`HeBu1926` is expressed by an empirical power-law equation: .. math:: - \tau = \tau_y + \eta_m \cdot \dot{\gamma}^n + \tau^{(b)} = \tau_y + \eta_m \cdot \dot{\gamma}^n :label: herschelAndBulkley where the flow index :math:`n` describes the rheological behaviour of the mixture (see above). The factor in front of the shear rate was originally introduced as a consistency factor :math:`K`. In :py:mod:`com1DFA` :math:`K` equals to the bulk dynamic viscosity :math:`\eta_m`. This rheology applies to fine-grained soil-water mixtures that exhibit shear-thinning or shear-thickening behavior, respectively, with increasing shear rates. -Bingham (1919) +Bingham ++++++++++++++++ After exceeding a threshold shear stress the rheological model proposed by Bingham :cite:`Bi1919` describes a linear relationship between shear stress and shear rate. The equation reads: .. math:: - \tau = \tau_y + \eta_m \cdot \dot{\gamma} + \tau^{(b)} = \tau_y + \eta_m \cdot \dot{\gamma} :label: bingham The Bingham model is well-suited to homogeneous suspensions of fine particles at low shear rates (e.g. mudflows, :cite:`Ju2010`). From b884ea41387a03dd254aaeb364c170c41f9a4079 Mon Sep 17 00:00:00 2001 From: JuLa96 <206707905+JuLa96@users.noreply.github.com> Date: Mon, 6 Oct 2025 14:44:03 +0200 Subject: [PATCH 5/5] Add test for rheological models --- avaframe/com1DFA/DFAfunctionsCython.pyx | 12 +- avaframe/com1DFA/checkCfg.py | 38 ++++ avaframe/tests/test_DFAfunctionsCython.py | 225 +++++++++++++++++++++- 3 files changed, 263 insertions(+), 12 deletions(-) diff --git a/avaframe/com1DFA/DFAfunctionsCython.pyx b/avaframe/com1DFA/DFAfunctionsCython.pyx index e3794e8a8..7e8b8698d 100644 --- a/avaframe/com1DFA/DFAfunctionsCython.pyx +++ b/avaframe/com1DFA/DFAfunctionsCython.pyx @@ -288,10 +288,10 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType sigmaB = - effAccNorm * rho * h if frictType >= 10: # substitution of shear rate gamma - if h == 0.0: - message = "h is 0 - division by 0" - log.error(message) - raise ZeroDivisionError(message) + if math.fabs(h) <= 1e-9: + message = "h is 0 - division by 0" + log.error(message) + raise ZeroDivisionError(message) shearRate = 3 * uMag / h if frictType == 1: # SamosAT friction type (bottom shear stress) @@ -327,10 +327,6 @@ def computeForceC(cfg, particles, fields, dem, int frictType, int resistanceType tau = muVoellmyRaster * sigmaB + rho * uMag * uMag * gravAcc / xsiVoellmyRaster elif frictType == 10: ## O`Brien and Julien - if cvSediment >= cvMaxSediment: - message = "cvSediment must be smaller than cvMaxSediment" - log.error(message) - raise ValueError(message) # viscosity etaObrienAndJulien = alpha1EtaObrienAndJulien * math.exp(beta1EtaObrienAndJulien * cvSediment) # yield shear stress diff --git a/avaframe/com1DFA/checkCfg.py b/avaframe/com1DFA/checkCfg.py index 205abb4cb..ef8289a43 100644 --- a/avaframe/com1DFA/checkCfg.py +++ b/avaframe/com1DFA/checkCfg.py @@ -130,6 +130,20 @@ def checkCfgFrictionModel(cfg, inputSimFiles, relVolume=""): "tau0coulombminshear", "muvoellmyminshear", "xsivoellmyminshear", + "alpha1EtaObrienAndJulien", + "beta1EtaObrienAndJulien", + "alpha2TauyObrienAndJulien", + "beta2TauyObrienAndJulien", + "alphaObrienAndJulien", + "alpha1EtaHerschelAndBulkley", + "beta1EtaHerschelAndBulkley", + "alpha2TauyHerschelAndBulkley", + "beta2TauyHerschelAndBulkley", + "nHerschelAndBulkley", + "alpha1EtaBingham", + "beta1EtaBingham", + "alpha2TauyBingham", + "beta2TauyBingham", ] # if samosATAuto check for release volume and volume class to determine which parameter setup @@ -168,6 +182,21 @@ def checkCfgFrictionModel(cfg, inputSimFiles, relVolume=""): frictModel.lower() in frictP and "voellmyminshear" not in frictP for frictP in frictParameters ] + elif frictModel.lower() == "obrienandjulien": + frictParameterIn = [ + frictModel.lower() in frictP.lower() + for frictP in frictParameters + ] + elif frictModel.lower() == "herschelandbulkley": + frictParameterIn = [ + frictModel.lower() in frictP.lower() + for frictP in frictParameters + ] + elif frictModel.lower() == "bingham": + frictParameterIn = [ + frictModel.lower() in frictP.lower() + for frictP in frictParameters + ] else: frictParameterIn = [frictModel.lower() in frictP for frictP in frictParameters] @@ -217,6 +246,15 @@ def checkCfgFrictionModel(cfg, inputSimFiles, relVolume=""): cfg["INPUT"]["xiFile"], ) ) + # O´Brien and Julien friction model + # fetch parameters and check if cvSediment < cvMaxSediment + if frictModel.lower() == "obrienandjulien": + cvSediment = cfg['GENERAL']['cvSediment'] + cvMaxSediment = cfg['GENERAL']['cvMaxSediment'] + if cvSediment >= cvMaxSediment: + message = "cvSediment must be smaller than cvMaxSediment" + log.error(message) + raise ValueError(message) # check if explicitFriction has valid values if cfg["GENERAL"]["explicitFriction"] not in ["0", "1"]: diff --git a/avaframe/tests/test_DFAfunctionsCython.py b/avaframe/tests/test_DFAfunctionsCython.py index c9f9647c1..488ccf91b 100644 --- a/avaframe/tests/test_DFAfunctionsCython.py +++ b/avaframe/tests/test_DFAfunctionsCython.py @@ -9,6 +9,7 @@ # Local imports import avaframe.com1DFA.DFAfunctionsCython as DFAfunC import avaframe.com1DFA.DFAtools as DFAtls +import avaframe.com1DFA.DFAToolsCython as DFAtlsC def test_getNeighborsC(capfd): @@ -783,6 +784,226 @@ def test_computeCohesionForceC(): assert force["forceSPHY"][2] < 0 assert force["forceSPHY"][1] == -force["forceSPHY"][2] +def test_computeForceC(): + cfg = configparser.ConfigParser() + cfg["GENERAL"] = { + "alpha1EtaObrienAndJulien": "0.650", + "beta1EtaObrienAndJulien": "16.81", + "alpha2TauyObrienAndJulien": "0.00886", + "beta2TauyObrienAndJulien": "13.11", + "alphaObrienAndJulien": "0.01", + "rhoSediment": "2650.0", + "sizeSediment": "0.002", + "cvMaxSediment": "0.615", + "cvSediment": "0.5", + "rho": "2000.0", + "rhoEnt": "100.0", + "gravAcc": "9.81", + "velMagMin": "1.0e-6", + "depMin": "1.0e-6", + "interpOption": "2", + "explicitFriction": "0", + "reprojMethodForce": "2", + "reprojectionIterations": "5", + "thresholdProjection": "0.001", + "subgridMixingFactor": "100.00", + "viscOption": "0", # 0: no viscosity -> ux as defined below + "enthRef": "20000", + "musamosat": "0.155", + "tau0samosat": "0", + "Rs0samosat": "0.222", + "kappasamosat": "0.43", + "Bsamosat": "4.13", + "Rsamosat": "0.05", + "musamosatsmall": "0.22", + "tau0samosatsmall": "0", + "Rs0samosatsmall": "0.222", + "kappasamosatsmall": "0.43", + "Bsamosatsmall": "4.13", + "Rsamosatsmall": "0.05", + "musamosatmedium": "0.17", + "tau0samosatmedium": "0", + "Rs0samosatmedium": "0.222", + "kappasamosatmedium": "0.43", + "Bsamosatmedium": "4.13", + "Rsamosatmedium": "0.05", + "entEroEnergy": "5000", + "entShearResistance": "0", + "entDefResistance": "0", + "xsivoellmy": "4000.", + "muvoellmy": "0.155", + "xsivoellmyminshear": "4000.", + "muvoellmyminshear": "0.155", + "tau0voellmyminshear": "70", + "mucoulomb": "0.155", + "mucoulombminshear": "0.155", + "tau0coulombminshear": "70", + "alpha1EtaHerschelAndBulkley": "0.650", + "beta1EtaHerschelAndBulkley": "16.81", + "alpha2TauyHerschelAndBulkley": "0.00886", + "beta2TauyHerschelAndBulkley": "13.11", + "nHerschelAndBulkley": "1.5", + "alpha1EtaBingham": "0.650", + "beta1EtaBingham": "16.81", + "alpha2TauyBingham": "0.00886", + "beta2TauyBingham": "13.11", + "curvAccInFriction": "1", + "curvAccInTangent": "0", + "curvAccInGradient": "0", + "mu0wetsnow": "0.155", + "xsiwetsnow": "4000.", + } + + # set particles-parameters; dictionary at t - see 'com1DFA.DFAfunctionsCython.pyx.computeForceC()' + # Minimal particles setup + particles = { + "nPart": 1, + "x": np.array([0.0]), + "y": np.array([0.0]), + "z": np.array([0.0]), + "ux": np.array([1.0]), + "uy": np.array([0.0]), + "uz": np.array([0.0]), + "m": np.array([1.0]), + "h": np.array([1.0]), + "dt": 0.1, + "ID": np.array([1]), + "totalEnthalpy": np.array([0.0]), + "indXDEM": np.array([0], dtype=np.int32), + "indYDEM": np.array([0], dtype=np.int32), + } + + # set dem-parameters; dictionary - see 'com1DFA.DFAfunctionsCython.pyx.computeForceC()' + # Minimal dem setup + dem = { + "header": { + "cellsize": 5, + "nrows": 2, + "ncols": 2, + }, + "rasterData": np.ones((2, 2)), + # normal vectors of surface + "Nx": np.zeros((2, 2)), + "Ny": np.zeros((2, 2)), + "Nz": np.ones((2, 2)), + "areaRaster": np.ones((2, 2)), # Area of grid cells + "outOfDEM": np.zeros((4,), dtype=bool), # no data mask (used to find out of dem particles) + } + #dem["headerNeighbourGrid"] = dem["header"] + + # set fields parameters; dictionary - see 'com1DFA.DFAfunctionsCython.pyx.computeForceC()' + # Minimal fields setup + nrows = dem["header"]["nrows"] + ncols = dem["header"]["ncols"] + + fields = { + "Vx": np.zeros((nrows, ncols)), + "Vy": np.zeros((nrows, ncols)), + "Vz": np.zeros((nrows, ncols)), + "entrMassRaster": np.zeros((nrows, ncols)), + "entrEnthRaster": np.zeros((nrows, ncols)), + "muField": np.zeros((nrows, ncols)), + "xiField": np.zeros((nrows, ncols)), + "detRaster": np.zeros((nrows, ncols)), + "cResRaster": np.zeros((nrows, ncols)), + } + + + # initialize test array friction force + test_tauArray = np.zeros(3) # saving tau of the three models + test_forceFrict = np.zeros(particles['nPart']) + + # resistanceType + resistanceType = 1 # default; since cResRaster = 0 there is no resistance + + # apply function + # looping over models + forceFrictArray = np.zeros(3) + # i = index of result in array, j = frictType + for i, j in enumerate(range(10,13)): + particles, force,*_ = DFAfunC.computeForceC(cfg["GENERAL"], particles, fields, dem, j, resistanceType) + forceFrictArray[i] = force['forceFrict'][0] + + ## Check output types and some expected values + assert "forceX" in force + assert "forceY" in force + assert "forceZ" in force + assert "forceFrict" in force + assert isinstance(force["forceX"], np.ndarray) + assert isinstance(force["forceFrict"], np.ndarray) + + # Mass should not change (no entrainment/detrainment) + assert np.isclose(particles["m"][0], 1.0) + # Output velocities should be unchanged (no artificial viscosity, no mass change) + assert np.isclose(particles["ux"][0], 1.0) + assert np.isclose(particles["uy"][0], 0.0) + assert np.isclose(particles["uz"][0], 0.0) + + ## Testing rheologcial models for given input parameters + # substitution of shear rate gamma + test_uMag = DFAtlsC.norm(particles['ux'][0], particles['uy'][0], particles['uz'][0]) + test_shearRate = 3 * test_uMag / particles['h'] + + ## O'Brien & Julien + # read input parameters + test_alpha1EtaObrienAndJulien = float(cfg['GENERAL']['alpha1EtaObrienAndJulien']) + test_beta1EtaObrienAndJulien = float(cfg['GENERAL']['beta1EtaObrienAndJulien']) + test_alpha2TauyObrienAndJulien = float(cfg['GENERAL']['alpha2TauyObrienAndJulien']) + test_beta2TauyObrienAndJulien = float(cfg['GENERAL']['beta2TauyObrienAndJulien']) + test_cvSediment = float(cfg['GENERAL']['cvSediment']) + test_cvMaxSediment = float(cfg['GENERAL']['cvMaxSediment']) + test_rho = float(cfg['GENERAL']['rho']) + test_alphaObrienAndJulien = float(cfg['GENERAL']['alphaObrienAndJulien']) + test_rhoSediment = float(cfg['GENERAL']['rhoSediment']) + test_sizeSediment = float(cfg['GENERAL']['sizeSediment']) + # compute tau + test_etaObrienAndJulien = test_alpha1EtaObrienAndJulien * math.exp(test_beta1EtaObrienAndJulien * test_cvSediment) + test_tauyObrienAndJulien = test_alpha2TauyObrienAndJulien * math.exp(test_beta2TauyObrienAndJulien * test_cvSediment) + test_lmObrienAndJulien = 0.4 * particles['h'] + test_lambdaBagnold = 1.0 / (math.pow(test_cvMaxSediment/test_cvSediment, 1.0 / 3.0) - 1.0) + test_cObrienAndJulien = test_rho * test_lmObrienAndJulien * test_lmObrienAndJulien + test_alphaObrienAndJulien * test_rhoSediment * test_lambdaBagnold * test_lambdaBagnold * test_sizeSediment * test_sizeSediment + test_tauObrienAndJulien = test_tauyObrienAndJulien + test_etaObrienAndJulien * test_shearRate + test_cObrienAndJulien * (test_shearRate * test_shearRate) + test_tauArray[0] = test_tauObrienAndJulien[0] + + ## Herschel and Bulkley + # read input parameters + test_alpha1EtaHerschelAndBulkley = float(cfg['GENERAL']['alpha1EtaHerschelAndBulkley']) + test_beta1EtaHerschelAndBulkley = float(cfg['GENERAL']['beta1EtaHerschelAndBulkley']) + test_alpha2TauyHerschelAndBulkley = float(cfg['GENERAL']['alpha2TauyHerschelAndBulkley']) + test_beta2TauyHerschelAndBulkley = float(cfg['GENERAL']['beta2TauyHerschelAndBulkley']) + test_nHerschelAndBulkley = float(cfg['GENERAL']['nHerschelAndBulkley']) + # compute tau + test_etaHerschelandBulkley = test_alpha1EtaHerschelAndBulkley * math.exp(test_beta1EtaHerschelAndBulkley * test_cvSediment) + test_tauyHerschelandBulkley = test_alpha2TauyHerschelAndBulkley * math.exp(test_beta2TauyHerschelAndBulkley * test_cvSediment) + test_tauHerschelAndBulkley = test_tauyHerschelandBulkley + test_etaHerschelandBulkley * math.pow(test_shearRate[0], test_nHerschelAndBulkley) + test_tauArray[1] = test_tauHerschelAndBulkley + + ## Bingham + # read input parameters + test_alpha1EtaBingham = float(cfg['GENERAL']['alpha1EtaBingham']) + test_beta1EtaBingham = float(cfg['GENERAL']['beta1EtaBingham']) + test_alpha2TauyBingham = float(cfg['GENERAL']['alpha2TauyBingham']) + test_beta2TauyBingham = float(cfg['GENERAL']['beta2TauyBingham']) + # compute tau + test_etaBingham = test_alpha1EtaBingham * math.exp(test_beta1EtaBingham * test_cvSediment) + test_tauyBingham = test_alpha2TauyBingham * math.exp(test_beta2TauyBingham * test_cvSediment) + test_tauBingham = test_tauyBingham + test_etaBingham * test_shearRate + test_tauArray[2] = test_tauBingham[0] + + ## compute friction force + # deduce area - see 'com1DFA.DFAfunctionsCython.pyx.computeForceC()' + test_areaPart = particles['m'] / (test_rho * particles['h']) + # adding bottom shear resistance contribution - see 'com1DFA.DFAfunctionsCython.pyx.computeForceC()' + test_forceBotTang = - test_areaPart * test_tauArray + # explicit friction = 0 + test_velMagMin = float(cfg['GENERAL']['velMagMin']) + if test_uMag < test_velMagMin: + test_uMagRes = test_velMagMin + else: + test_uMagRes = test_uMag + test_forceFrictArray = test_forceFrict - test_forceBotTang/test_uMagRes + + assert (forceFrictArray == test_forceFrictArray).all() """ TODO: When calling pytest, the following function raises an error ("Fatal Python error: Aborted") @@ -844,7 +1065,3 @@ def test_updateFieldsC(): assert np.allclose(fields['dmDet'], dmDet_calculated2, atol=atol) # print(fields['dmDet']) """ - -""" -TODO: Add test_computeForceC() - """ \ No newline at end of file