From 34dce34af3f4dda17f5c1dd4a607bf43ca3a9feb Mon Sep 17 00:00:00 2001 From: Jez Swann Date: Wed, 17 Jul 2024 15:49:50 +0100 Subject: [PATCH 1/6] Added tutorial, currently using previous nek5000 fdlf (cherry picked from commit f8409f92a7e7da5b351475a70e72d2db2e185b24) --- .../_static/img/tutorials/fdlf/setup.png | Bin 0 -> 57470 bytes .../_static/img/tutorials/fdlf/temp.png | Bin 0 -> 18410 bytes .../tutorials/fdlf/temperature_lineplot.png | Bin 0 -> 26119 bytes .../img/tutorials/fdlf/velocity_lineplot.png | Bin 0 -> 26682 bytes .../img/tutorials/fdlf/velocity_paraview.png | Bin 0 -> 10462 bytes doc/source/index.rst | 2 +- doc/source/tutorials.rst | 4 - doc/source/tutorials/_tutorials.rst | 12 + doc/source/tutorials/fdlf.rst | 341 ++++++++++++++++++ doc/source/tutorials/tutorial_2.rst | 4 + doc/source/tutorials/tutorial_3.rst | 4 + doc/source/tutorials/tutorial_4.rst | 4 + 12 files changed, 366 insertions(+), 5 deletions(-) create mode 100644 doc/source/_static/img/tutorials/fdlf/setup.png create mode 100644 doc/source/_static/img/tutorials/fdlf/temp.png create mode 100644 doc/source/_static/img/tutorials/fdlf/temperature_lineplot.png create mode 100644 doc/source/_static/img/tutorials/fdlf/velocity_lineplot.png create mode 100644 doc/source/_static/img/tutorials/fdlf/velocity_paraview.png delete mode 100644 doc/source/tutorials.rst create mode 100644 doc/source/tutorials/_tutorials.rst create mode 100644 doc/source/tutorials/fdlf.rst create mode 100644 doc/source/tutorials/tutorial_2.rst create mode 100644 doc/source/tutorials/tutorial_3.rst create mode 100644 doc/source/tutorials/tutorial_4.rst diff --git a/doc/source/_static/img/tutorials/fdlf/setup.png b/doc/source/_static/img/tutorials/fdlf/setup.png new file mode 100644 index 0000000000000000000000000000000000000000..3377d7da22433aac2212a62d39c1c0b9398d4a2f GIT binary patch literal 57470 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 literal 0 HcmV?d00001 diff --git a/doc/source/_static/img/tutorials/fdlf/temp.png b/doc/source/_static/img/tutorials/fdlf/temp.png new file mode 100644 index 0000000000000000000000000000000000000000..173d0b5cef513db46f10c489f4de7c0786661b0b GIT binary patch literal 18410 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 literal 0 HcmV?d00001 diff --git a/doc/source/_static/img/tutorials/fdlf/temperature_lineplot.png b/doc/source/_static/img/tutorials/fdlf/temperature_lineplot.png new file mode 100644 index 0000000000000000000000000000000000000000..531adc8f259b35a3edfb03879ca4a51200f38ce6 GIT binary patch literal 26119 zcmeFZbzD~MyDzv11(8xgLJ0+tZluGYMd>a@K)SnCR9Znm8b!LL8$m!sKpF|@?rxZC zx%ZxP=JPo-b7toJIs5az`~8Uz&$HIO?)$pFbv*%!kE99kDDe;kA&`}Mpo}1xz6gRb zf_ol*B4u`s8~%gsa8Fhh7yi!^_t{(c^95TOEe8Z4dV>Coks+RL20s*Vl+<)ou`zLU zd17yjSUqvHwX|`xG6qmpuaHpFEcWC5=hE$&4_R+rZ}df;oSjOztV*b0516d&Emc-N6Yne{ zOA70rSt;7pZhLkot{oFWd>d`KE8!LpT`g=0_z%u~1RFtYIsgAZ{I6aEb}2H&=*Z~k zrQe_KXBpJhK4ggKnt=xpWOygeX|b1y&!Yd~qer0?WKu{q{u@H7@T8=qE@OCsxq$0> zaxA}%wIjuAT15Z#;m(qL);`AO_O_~&)a#pcbTf;K=C;Nq`NhQ_yjRFihWMqIH0-Mr z7xo%9x3*^H=1dPfMlM}KI2!--)DlqgzDrL}udc4{O}>lu<{&A=dxh-3`;|$7&6cw3 zTi^NNgR$rk*dYSsn6&VRmpA_B{!kc$2-y4;Ifsq?qp|V+jT<+#tDINP4RGj`KC~Jt zeqU8pHB@YtGSe2V(;nAulKSOKhE|aYdM}-cq9sNxgxP!p20k^gIDI~kMR!y~_TVrY z%3Iz<($dpe#KiQkFg#Rrb}p@ST1xXiIb^zhJN@U5mX=mvK!B2^WlpKpaN6LYrlhp= z(o%k1X-bW02eE1^f zb;t-mRBl=|fEO}6{Fv;Ag~Kc$pm~vuUG>S6PggngEuC`UiM6$~v}}&4Y3QjfouHr8 zx{hcnD}QFwDP`p5?lu?U=2l)B$j{#tg?owYAM-w1iP|~ZThp+%&g-LeadFw1?@H_+WV^E0Axc`RG{q$f?O<7s_iWLUpyU5HDt)BPc=g;80@75LMdi7l?(rW7J3^q14 z*>>>%W@cyA4-!X4MlR-wA6ckb5MCEBbQ3lCMGhNJHiVL|yE)`qB;3x)(cV%B|KE(w zqpM_O+2!Sfn?mB^2H~pO+RS8RWNibX})f+NP@4due1%o{dukNi^n;$CdathFAvz_7Qvv9#hdv4{S6Kd4q0UrlUX;5Qt54rvH$jI8i#CR_7AKtUY*}v ztBsi3n2Op^X>C319@VRqpcWWt+SSq2)XWuH37EhrFzZRPcXrMz9*&NV)-c0aW2K=< zx|p}OvGHED@XGwsl7~{uhc6uo!t&v}E5jPb$U}IjPoI9Caq{-Ag$GVTLBaI+@nd5X z6Xu&Y@8#v?k(vKt{}2_`olliwa5Ve;L@so|Az@)}{fU>boK8=(_D_!8gH zz~ zmGnoEsvCc5R!6HW;OtUz8v3f|Xns=5RyP~1bP8vFbkf|?!otU=cK7aGJUl#QbMq`H zFOFv?d-7T3@18ZjCRpstj;6e0nV}GOhv~+RyRgeNg08X!AA}%Cedx(r2tUd8H=Iq) z3T5s%wy9eT5w*1&Qhbl)RV2o0&#TW1z~OKH{(XM1&?w4d^BfM2#mvvh&Aq*7`kCqJ zAFT^vJ~)mG-IDTAtXU+E$eItSQi^K3 zPhJq@vu34vxzyNH(Hm!p1z1B#Q8Br@TRFQB%2nIwsGiNif!WkcA~_sFnbub2spj)) z0gJR~+hLIoqweGB6iKVrV?q zk>C#J%<*{NP9aH5Z&rM?KNTt_l!H4NLcQ4N4HK?*rn^-^4}lF)QC^M~RAxp-&J6C} ztL&H@DtZOxfGnb$wt`$!X9(+Fc>YAuI_|sfPyYEAA88+14hXA{7!&e{giPH2&?S)Q58~ zi4hE>!07g)_}}nLB$Sj{;o+CFE0j{C7T^~9;JEdbSZKUtesu|5)WJeHl+1#HT4SDD zA!u9Sb7|)rc)mXVO}A^w_di~-zwas=9uX0-yZpzxG-LMlGRypIHYvo#7%g zrl5nRTjW(pg>Uz17-SX{{2mW9TpGl{Mv_ArnVGv^oVz$ZG4bgQjrSn;>dZ`PZ?9_1 zLk0p0?gx(^Ew7C?pqJN+0jHrG?JgrDx(ECF^R-8-5pUkSG4|eHpNPsoJATeT-noAp zp0<<3$>9#$-eOyOdta7XHhvzi69on_f?O-|*t2f`$d%H)AMsc$^W#TyudR0eN~lrz z8Th*|(6t_XS7_9-m>R7g{>M@s5QS44Tbbspb;Zn8Hm$GU>lY0<(2K5rU2NX>b93Zx zw1M}ZadX3b^!muhw-gweCS_)?h+D*y?qN(CoJ(y z1c`sFpUCS`I?~hKTa#SxzFIo`B|S0ReNSE9dL&rrHC%gr(#d`buS44QY+UzRUE9tt z+lnvwaeOLAO+hn#DR2DFVMf0}Uq*p*dSq~N9OlDlIVL6;*Y5MMypnlscQ{hq{!7DJ zbx%2_ALTuGoD#|lgN2)MeDbGrg#FpKMRz}b_?Tf4$3IXaMT*nQiEfQ>U17%pPp^C3 zT{zT=zuP$E6=KOXNEGE=Nv^GmuMT1 zk7nm9xLhv)E9a{R*3ZJxKHG!)QkLkfF;^sZ}=AW!dh}l0lBkgIq6JFfA{_ z2~lIeVobLaM+vYM{ir11rPGs>pKCn!vdYUf#ZUKBPEXc+blQ^$d=O@oc`Uwq zi9@7L87E-(8307O-BdHv&6^FrS-zD4@aPK6{`~nvDPWtNS9j{ZGFaGXo~Ki04NIKF zYt)Q?aCk_mdP8v!EwOi2f;eh_Z_c!->FeiZs-&yO)*UWp6J+3J45Q~h?#Z3F+@wwx zv+r*&nRkB)h~=|L)3K@POa6%*p^u)t!}88jN|=~3v=u(nj_cVK(C?XecvQrX*I!D7 zQClhc`+7~>;Y5(em7x-O05{R}C&yczl!EqOMn*^3wy1=id9!%y+5h|^9ItlUA|WQG zB_bm7fA#7)yq-+A4k~YnS&!7}>Z*B9T1XU!fi<5E9MSOb&%j(-dwNtvJ$7@pCnkyl zgM#`#-N%8-YBgF}((I0j=*IWw>gZq^0(9Q)c`Qz$d&zL@e>qiBTX3Cf3DYPtX*bUm zMQaavM8cm6!3BGovG*E(YPOP$>|C4}os*N7R{;tZ9vEO|g18ZD{QsVq(Plo4 zUjOuly8Fj_I#K`yG(N{092N;ePFcYGRLw-_=o&B6^6>DSZ3^tZ@?N=iGE_FSTn0x7 zD5>(=-ZOJXkX0FF?}lg9Je!}v1F z&!1;dyN+Y9>6RCC?>V`++0#TiQCS3uiyefgvHO!^?v!{#fRwV+nJL*!vJ3* ze)&ZfP4_fBrOG$tlyu{%{ha_s^UQGT%)EbLb? zT3QJ)F)?)u;P}NR?UZe?e~L^khD)u6DxI=Rtw+rT3En3r=FKJf)HWYtAs$g@Q(-~{ zR&jmk>N}2k?U?}}`}ylvam+f-IMM4h3f~WB)HOLEe~j(S-mfYcHvWh^<3>#r=@<`EPYaD0dUZIBu zXNS@82?-%gg!Kkr0}%2nS5jb=%r>W6g*^8QUc7u+Vm~7X@KiqB-rjzCdb`EMIGSA# z?H>y90!po|t$6tOs_yQUuzOf7fGFjE{(KV%&;pPyyo(oA;BYPuC+>h{k7xIa1l## zXnE^z=%l~I@T68aq`ts(i>F|Z`apI0b4OdWytlWMI&SiLw8Q)yuGJHU&loMUiQZbP zJL8&|O%oOM$ojU`neFgA!|ohrh7vSs+h=ZWLfqcfi)^|X`g5UG6|!NX48Y2*r~5U1 zN8zG;vFyd&lpj47W2!l=%oCie$f%QN4h&IC$y7;Q%HzqCKuQ9k^$|`FhEfR$K6zn% zG<`)d`h#Y3o336-o|R6C`x2X*%kpzWeYN36_9G6?WX5 zmgTb?R7``VAk!}hCX?0n*=qkuC8XMA)coU5Utjr64D#lM{AdJO42-z_c=3;EQe<6S zo!IgEeI_oYERFohtiL|T_l>JuvX7$JDw!F7%qwG%zXcdjK)2MN+cVu7aZ8qoiD~hy zou8XcpVeuRp3f#Pn?5osic*IjX)MITMVzNQgx6G|7U=5gqI9XD;a;YXPk_e(h5!!0 zB1Ih1t5?leM=B0i%Eows*SD3oKI;ZW!wFCh3oUJZJs!p&H!MppSNh{5b$~x5He+HH z6%}ScKsJTv4yvgt!f1T!>H)@N7@?m*N_s1Ea?2Cy#CZ+uAZ^)nQ3ab*Z0PNcAHEPKfeJU_+R)M~vvPoNBkrcZaOIi%!y*Ub{E z;r`@Bq}Lc-dnJ=1EhriZ^b4?Fxy2W8k-jELTEr0RmkHYKXC@||P%MpBp$bFlc& z{olN?`0?%rsw3UIhe_s)aFW1sn#;(_2K;rMB2Y*a(W-IZ>8?9FvB^G=47y68N`Yuj zk#Hit?_hyIPM!x&*A;$C{zF27m7^@8cnf{t?|{ErG`zYH{^jn=^O^83JWoUo?p=b< z^I#^LlK1&L@3Rw^>h|f;n#JF0H+2Vq zYar=yWpE?qC;%^i;B$5~#-_26r&;(yrxM9%YsHVgxhFhBUx&yjx%?W2 zuyMngn$18EhxxsZH(IodOhURMF(g9JjY%KV&Rw&Y*jt*ry+6f$vKgeDkT5eb{iTJ* zN0)!pF`|nUQzB#n7V1rzL&x=Vw{EwkCfA!+dzV=cZA?d)yDjCOS38fCz{9Gyvl`1g zQBpFm^C;VK4WsTZHskj9&rIclkIJ2dcW7~#f5+=t-dkIP*>S7|Fv2abd8g z`}0jN@3or48aD?$fVwmj`FF7v{K-_;#_#Hhnt#w883|@1LGp;v7jqP89d`OmZ+7}* z?d9o3P1u{73W{#L`Vh~`XQgeoM26VX!o%1#YrASTB4D;-o^TW&ntyWKYxxcHU}x1z z(+n}>g$+@)xplZBv_JlGvDzl7uUt?>SNwYuljRTMm&{nmFz9QBG>;N{SKm;Fp9PXu zu8wTfOTZO9qvVzG6DcA?=UUoJ@<=}VXZzR~l%#rRsBOs|2XIPvT%*~u z$gWwCo^ID;*&m#G>psDgKat5g8V zphG__{o_LhRI&)?O?Pv!O60tIci(2jMaL$4Q7t__#vN3m*sRy*2d za{NiczK;0HKY;s=a9$Zo1)$Q@+`JfLnwZH;bL9#h0Anm>EZ@p7*c=RcUORn56%Oh2 zW~avosIu{m6vOufWV!-bKu)p1)=-1zvG|E91_p*yG&bUl?kPp6bih~pd@-<8)zwY- zqTjtswi+%)868x^dNJtT@gS$5>Nf~U@7@vT>Q(K&Sc+!TNxNe;^aI2}aF4ox#O2Pm zn-qb-+MA=rsjG=K4BHJ7Jxi0AEqA5!4@m!6Dbx)rHcO zo!K}W?RKd7txf(_Y8VmHnFmaPEHE%g6&4l( zC5}U392He=e%WG$2%}!L`2neF|ve2dT3fEki_P0uWLi>46^heyKOW@l&5;H-}1Q(*w1 zT->&}6Nl0PNhvAqn!SMAiHZ^uzN?_vUOb)Zkb!eAF1-}v-C5VsMd5wvZCqU3y?ghV zt%glZOtRpVtJU5X5vlGz3=YO`JM{HMK<(Ac1#s5|C#J*WVdf+UyR3TB7MAS>K!+5d z=A%vnda=STd42J)Q4aUkY>J?KUJsZM_6`5=@nZ%!y8f?UGlO=$HP@*DCb?ATbtYL# zA;*los#PJ>I}GPV&CIpGdSLSQK#eH|0*>nUaH1kq?H2h#KLp-{q6$UDcgiX%Gaym} ziZci=wwsc&8Yx%uIT{}8%}}B{fg<5P8)FLHUvp*^(BLlk$cvy|MbL{LEf=Bs9f&RX zd3eaW>77f6(bK1>K!(DSH$*h*wzdW8dAdwKK0dO_aGCM(r-M1m-Kjxnr3G0TmGAxh z{6J*Z(A4~B+z!V?O;r^&k`e^$?mc<(+%BwzhWh zKMHmO)~ug-QSS2Xl7<+K2l!TbqfQ@GQ5JJ7(O{UNkT@ZF*5?98A}Kh9=-Ln zc98gB{pDn3Gwn~I1oi`g)lX2ykU?oJdj4P}ynsCF4ZzCBO#=M3G8+TYWrkj@ z`&F9S?ZH~@Q67}a6ezGMZSXfYF=>6bm|0nSi_Ll*!NAZI_3mnIl|_YuiqwlpFUphD znAzFYWn|u>h11Q=&FpvbU6kk=C$8flPGm{Y=Wanqf~_f+<@&1|iZwwVE~2Oc4Ukrr znS~{ysHmuK5D0}6Y5>LZ%A)Y+ZX^a`P6;ew8}x}RucO^Vpvbw+*T9v$B_Bn6iqv=X zY9hZnI|p!RJd@F@P9wZ9j;C2>o#4Jb{|Pj_=deA%N#w4i2i-o~83_&z?T;69pqGUu z#v>q5b95{QZy?>cEviq`4>9-q!)k0IXHrz@ypjc0j(j-kcGF3RlIvbal1tTu5pMvV zXtSX=1JKSL*DmC?`2~g0Oe$%;=o_eabtEX)c`HBrvfUxf9rF;?YWZANb*%;qzAefb zAiiE%&dBl3fB_qk`x)E}-}B$Juv!bikx+ZbB1Zz@ODQf;%w8+MKU->*dUjg&l=H^j zpPd?UcdXDIvTzgJ0Q60^p(d%TN5SdX1`$Wwn#^wU`vo^w*MFBGp&s=J`+U~i?W7+| zzur~2IV_x=h-co#x-SpU->r|(cVlD2ecTVHx7y7Cjj#ZM`=DxPz7M-BFY^%54K?tI zoSgiUr{`p4okySfuzQh^N)>k9_FmmJ9U7#bxUZJT5ZqbonjLj25m!a%qW1P#Kf)my zG0o%aOCYe*A)EzW%5nakF{?PEjNlc9jJcOYl$sPs{qtxiy7}L~6`?q2hm5+-B}A(c z`?f`tc~$L>+P$f~F0$WZSmWOPfytcH{KE^q@-tyXpi=%Yj+To{2^_I_R961}{rknd z1h{fz((~h&W7@lg*M3aBm+nn1-VWRFKKU}BA5mTjxU%`yxq9&5BNGpTZV3w?RWG^9 zh}im5i7?%4po-eHDMr@>LvM@r?53Ug!cg6sqYma?A>7$6o&>844c>a zSHso^a$<^~`p5blq{hN-Mdp-N5La-&mKuq~b9luZW*nZX(-_K}KffwIOMC>Y4fE{>zKlNbfm#?w}p@fwlP05Y(%3Hitk5 zbhUrrR9u)?B7~WZwRd6q*+P`g7n|Bla!32_4)2rR?cX?{IHQH9{e=aiJ0l@&de5{!4n77NNN7DKA+Drqw5k2UbmyWvBpavo#F7)Xw%>#7O|6UAg_J_gRQ<XVZZ45?^apR)%w_RZB>Dlca5Fy@}oYb`H1nn zqW?3K%kZH2X1^xl8Gum^Ta@wkZD{~!>JDJv)aEoG(wm?HW~1IUc(ABnoFYwxIv;vh zk@`naVoXd;mqLYC6(NWOhr74j&WK9XT~%LSzjAlT;(~AeEnHCa&Q4Dv0Re-!JP(R9 zlwXP5%w4AOSFf-~z4k_hypPM_v7$;Wm4K}Tks zFk0RR3*nhSYRY_hun_F_D5%7!j4?L{9%A|u6qmeKN{p)T=;(Cd;AXI7>QhjlyDoB6 zCxgU+a`}2C)gzJu03#q_(6wsE{iVJ9b1Ryyj3vt2i;W8VIBrz|Ldegx@0@FkR z0x|rRtPoPm+$A(@38gA=+cJ?=MsfHrp3eCMm%mD$o+5h~*d26?j6XJu;|;tIBt7<4 z`O0r1zI0FlA1Wx6c*>kq%q6OzR?7ZV7z+@002}#*m>3?DtE+inLRdf_IvhJYO&=dO zOp(V#1d`2@FbN3=N<6(#Cmup6e9FXz8~{zXf3oC12ljzBW@8aZg8}MK^n(s`U9ZFi z>D+0!$T1K7iO-I)p8Y!1JWw=1?RX&-On#&2k0q!Uh-R-0dQpAgDqBn{`s#7UJRGX^ zs-je{bt5{duFfZf^jt3~U?Y^-z}qClQ`3mu13Zun zzrda|gt6Y6sRBNLDxfHcVtfJU9h-A8;|dzP1HnJDxL6hT^C8s!VD<}$Z=LE2QV#ak zKRb-i{6iGGUKYS9eSkPU;Gd^=cX!9;Tq@9l?%E47)-5!2FvBp9_zF#Y6~h|*B6}r- zf=3ES*-*J%igo$Kd0?ek5Eqn_kr`*gDG*lETSp)8bGW70J65sa2!N{xL{^24%;O(&Q-9; zVryx+e6Ep3G1?0PIFY9tfFHbo1-${_l(FS{8P_&+bJHGG5uwWlhK8!!+5H2Kic`40 z^@30$iVeSELPXU9mB6M#`2RgbN{BObD8U=m?EUpXodJ4dK9@-^z|zV^a)@hK*SV45P;?Dhoq{N z7LV7VV>{TL4zs_yfM=oMy|-_1!LO4GFSZz9M-#sQ(gs4QgyCs&ER+oB_kdOFCF%Zp z15Mb?C3-wE@Y;!djZg8^Q4n(2TtF*KA+ic#5>%K*iyxemX{e#FWlDbT0N@XN`&Lm| zIb6HM90X7LorNB0_#v>pGk78IlLl;p>jH}3zJ1d!xBUdpOo{8pQ(0xe13Nxvdp_vt zZHr>-gPnv*zTj4zk}h4-cr>vwbvV|W8QBbZqznkiQYcgd&QJt z!NI+Nx3fJTtE;Q0?m*kEGCl#}1*|rUl4cNTMBTRq*0^phz{;q>ZqFXZv+VuU9=G!{ zDQQUTqI~)x?8wvn%5d04w&#dRP@IPkpSt7H0V?OyB`fidOwfmE97HsV7rS9Ah z04UI-rRINkU#)5kdS=@<1K%nZHQbX`ZUkC&{DaPZbF=cxRBxoW1>S!jaPAl81|L?7 zA)c6T%$|G=elkP$=~DZF^9$8%vfGC<vV=rB9K$a9u*Ha-1?`p-iWGqgW{+Euj2rVp>v5>Eg=&JcRk z%<{6XSs7$o*Q)oPZf$H-jJwm&(8!Vs`vJQn6Pf*V|4nbU1_vsDgRn-H!}ouo8sLJe zaw<9CWB^raWmiX?A$|IpV3I>+*?zyy%wh92%8@L!5<;_{lYTT9`k$Ax=AZCC7e~#6 z-ruGP5=o^a1i{c#7#0==wr^jdk+dvn5}z)}SFqDf+&VkO&vNu@+?nXNoPqlC=oz>PW(huJdMIVh+Y&ttsEl&+=*Ofp5 zJuYR3MNq$U+vC(Jv|}A%MCB5cYJ=Bfe4G9D?Uv2!{jffZkoD^6<ooATN*+1jdyPu#}ON z^&xZ*bO7K>AXOs}Q8Ui-$Km>hqwiE+Ud}wHuCejy1On7RKoj;{|9gs$#s}^biK>RkJ#mO)k9hft>Ou~tA?wxGFkL8noT~)+dhYk-@Jq%!Z7@ZYZj+qt)!B!IMs@tH5oMIwIo+ZuA;RM>g_O-Atuyjut5)ve2S{1d9mBgA z8_T{D2SDRbB{5jM3()ISUveK#7Gxd?yw170^APZOB7f z96v2JbIUZTb^3c43m|mAPNcyE3iMK<$7&bU_iUHHZqkpEJeBPVTk8F!qR&G->ju)m z02#1RyA~>tcJt|F!K)t#rr^Q#fi8*Jk@<}Qr2CVtq_YozRw((cbKtq69k$*Y+<`bQ z*yJ@};Z-iA#r2k2>7ZD<-ue>q*phy?N=7iw>W z*x9iI+S;J*n)hbB|M$`B0_TFY2Ot9l%Gb|%n9r)GSVlfeq3Ri+0scySxLXWtiQbQ3 zDWZA+nh(==n;}Kl3z@r%JP6SO*!K17S9)2Mw1-`Qu2Ja-QT6XcJ~s!GbKQeB(7pVp zC=$~6FcNW1?=pg9V8Wen!RZ1Eu-|3OD;<{injRtKdWkS;+1vhj94E953=H_n!PPXu z#vej29G$B`^I=`72;fn;rIH-b>L5wl2ht2FHFX|jVA02mkOd%b%`f2LeT`oP^`oG= zrsm%j>9XcwN|k`FW&ukvRO3+wj>j|Z7!;5py7bP7lGV=AzyKto=}b*cQ{>_9qJ5FK zLCRq9q=K_#dFLAX49XwElm7q^0iB2WhC`FH+0Oxq@Ksu5lEZ4ORu3ruJ9;+#YRx!) zn>*;*+X~|P?#rXq4e&0?<~Q3ovMmPkP#Xtf$I`%<`iu`ISlNhu5a8b@j!XzL&JATC zND5G0y%;f~lnOE@Ko%#dXt*YG3=HDP>YaWabXWy&9!JgT;gVD|Y#DRNR;U921c=Qb zE97-p3=kLPG)ONmJEk9LMC%t)7IjAGfUq&#A$}Et-Z+}GWVVBhHJlsQMH~ci4pgZZ z;D~5_<_LeAe3cma1h5U&l7F_h^Hq|-{hT94s75kVq)A0x3&5*CLxbL^d4=vKUu`MG z(e@UR=od1dLs|22>r422 z<=u_$+exa`>l^PO;5iuu4?_Sy?t(AC?SDvBM1<<9`>^=(fey4jniaIK=MDjWPI z?OM-@zG}!c%gF@-Ib(p)l%3^2D#Fgo1=?GXl*$Ix9mVEAEA*yB|9r+u@=ALIxjFqa zF`LBRF9CjVsC`*ryvY!<2$NG&e1H;-O--}G0)o&^5(Iv-bdw?@Qz26g9LpRmYP9`= zq*;4G*I{%jsRwWf3p|cye=;`NyZr0xPqFim~pQ*Blre7fA;BY!z=6QJ$ z&X*MDG4nV$URHm;O2RzZhdx(uU-}`SFyjGb;KRFjhJ4OPD`h&EEWQhB)aeI8wg9F?boA%u=H$a6tvCZeI2dA}5~7c`n{wQZ@K%5}TOk`^KH#zI zb!XUy0EUF5>UKN3+|$N_bk@)rAQ)kQ=x+?1@Z9E_nwrj|=U@L116hhI+7OV>l8sJ5Hl?rYROk9t6qN*dvcgf&y=pgVH_PL$D*OXYiCt5HgvCU7x2^n$eYT$ z#~0Tg+05>Al1jamPyc_B<-4JwF<|Z!HuNqbKF8$R9hvZ71G;o$kd*d_A@hcrryM)4y ztR=)?SwgD*3lCn67jl&G<}uOKkFMSSJkoJ|+Ka8TR8|TZK3KK6=b}Ap2Lpmaz!2;l z98_dvWKyk$(Q&AS?$n=quim`T&`x^){)rY1kCdA-$H2x& zO-qBUwG0e9$tfrRyNh0}JM(VaYj15u`w2Qd1<@b~=&FS~HWKj9XJzMAHq>1#F&tob z(yh@3EVM9mOa7TXx5yUM!Iuz(`#;B)YS?_~4lm$n|36LP*=TK{y2wO>f7AeoD<9~+ zK!;w0C?lJTUfVAdv+d_G9l8tC;DKzejSi20h9<=ZUNoaDR9EQ7+4j~uF?u-;P<)w~ znHQ^Dcw!!+EL%?Qr`rIlW`V@TtE}bU<(A$OiM{Jc#I)(U_vi`(xegJ66i~zy72mH* z63OgIkv`+%w1{$?y#tmef-NDuz4QB%{lUU*S!FW_mDKy8863p&0>6chvvYfzr3gbB^7Wh>pKKU|uaOq=)1} z0~ut+Oimc&wEXBe``(6<|B?B~;NS~bjP{$zkRL>Yv*$Dn%-(*XBB1;sV*UYb8pt&% zq!p@spPG=ixT_;3k(`>&{>hAQeQonDyG(j-VNXSM1x#Gt96 zY7)$YME`>YLcUZIure@lozwWUQ-23Qk?jRsU#DKEwoV}JTY%v-RAd_VZ%SC`RVUJ~ z1R!Ss^t=*>xko1;QXay;|IryQEyLe}0~z(NYCyhu+#Ehw?;etq0ulAxB=196h%HpQ z@2y&)B11Ca1c@zGKlq)ZyMspmdi5eXI_ZO4$HyoL6||dt12^s!JdqS*o_Ne0Lv zv0O&4VS9wI!_xKM#jY2chFNA%AtIgE{^p`H3os}74=OCuvSVi6hlWG~PzSA|5b3hF zzgdS>Kma)qG<^q^uq##dKUw@CsG3%#&9T$-Cqlx)fM+FvozHh$Ud1RNT=@OzW$oc2 z3p(ouR`t9+A`z|%le2&)vtbTtUb&;q@(vUpX&fSI$G3_Sb)YUsdwO}nq=Jd9Q)vLA zi35DEVg54Aa5V9>?yZe+0Axa)Drn|+C|!v$C7ge+>#=YG?2Jt$$0NwG!66Mi_hoJ-TktBa`Np7VH-Q6B$;zkr(k^1Uk}q+ zxAJkZUn4OJG7`qdw;m;lg@6sB_2xeAjW7Pce*G$N+nT+zLMJFlAwo?AA$_a#4DGyv z0%G_RU~;R!WMM6h5N990!Q4%$ia2BT_4RS`@L(aq*9DbJzY*Vi8!sy_kCoK!O=CZ;sE; zGj{2#sy!d-duSEgv7L%j(E`CjkXz zH8p<;+UGlZ{V)*F05b%aC@BL0!%mD;IA~TnG9`-p{Ox#OOYJ8i5yl&FgBcONKppm` z*6XNyD;Vya3QGDE$X87;sxdw_^%4+K;pt&p9&FmzMMXTke0&p&i-FbEBG$iv!f`n- zYm!q?+||*!hJ{1;9i~fSMP>n>!f(>`tE;GB`APVKP(jDZNeuq`;8){|t|HX%4=4kv z`j}!atJk47e#*?e067g;H@8n;zC2j8J3HQb{4j?59B32|z~?Zuun2-To&@E5w)yRY zo1S0cTdk13t{(dMvX5pElbPIeR&{HZ^}ONjGDg| z8_j)#fO7BteJlXyjX-gl0()RgHuxGp;Wd8iSA~UKu<)-TzL{KES=qWT)02VFzasuz zKu9fuYhhubsiQLmGcXMxu-21DknbJLB^iOHRqlDf4cadkOx)zH9c;~!^O=)?cIXdu zv7xQ)BG^>co0gL>QBO=p_6E*E-U^7vuBXR>X%Ayw0N<2gB)Q4Rhzr{RrU>srzLI`7 zA|@sPq|a~t{Z~Ojkx@`+g30%|<7pyTNibxlfPE==i-TPL0$TJF&=`OG{P`j}nyfjP z;w8*&GnAQy=I3*OIf1RCqr*;SU|a+G;zkk0YFY`I`u6EtP z1b_8qLIM?N)qx;=PoyV#H$d&JumgNISZZ|*B>am2!#wvV-YCxnRa27sQhk)6hiL+= zv_}bnpl`JbUB8EG_8uZmBXvGBP=8yXi!~jZTUb4iWd$<@Q-KKVGkAKUrP7fo8idvs8gXig(b#$rmrTkQ`g5;=qVfjzG_9y8Rg&jsfM#7*mU)E5 z!6NKqA~-Kn&z?+a6ZlpZeH0QB;^gAGYi`aAG^v~m91e1bY4@%W5D+M-tG@;# zYjs&~$`rfy5j&hO)PfuI25f`_9a&RLt3*h=n-^+(0o0~(09579E0iv+e#G}=hN;B8 zufvNz3Ob~Hch~{n`xO{}HO?4=>5pl^H6(|sbskz9WD*UQav)|}gtmd9A#H4I?6*76 z`2ba41R3{LY3UsZ_b?ZpKq~c#jZGNTKO>kvfTty?tb7@~K~|?@Xd;GBpT2<7+W>_G z>YQecJ0Cs)!3`2TjNXKH-4b(BR#sN%bZ^mx;o-Rg-}w<8`!Xo#A~c#p2(dwL8=q_n zy3B9D7yQu)XF;ZZ4k zzEtsnfp}2=g@u0boe{k|ufPccj#dw<1t%nsaQ*K= zGMz?IJ<8kK6iTCjG31wM>TJd78(w79q^;C09gz2-cEOF+;B1EvKq6frnFOvlbn z2-e+87!~aGf@>rdKRf1mlqhn+!^7jcfGq-!c+^HRbbXOa=yq z!5R;Kun2$W9j(4SsFm&Bv|2SSnm8(hI?8%4O0W|9A?}S=)si>g;}TJe)WZQu&dv^k zZTLfo{*FVeG!+&va;JwC^Kwm_B?tZkd za5Cr>6QGH3a&k&Qkoi+q7W2|O^lxuU&*K~7psC00wK1sP+wb-tO2Y3^1wl!INqE*J zPF%A~aP*Q}!e|`w3Gnfskzcs+>PJ45gmqVu9K9;_oD=Bj;~TCk&hcQC!Ve2M{3K}a zyykihfBg9IqXhIKYHI2qt*w`?sVFOBLY{Jdaq*sp1{qlKu7}&1gC9ZYE3c}$FE4)) z4*xz(i7mvue87x;Dtx!c6HvK7az4QXy2FN6vj^6h+1W+_e4yUCrL+{5lt?NmUD}IG zNMP%)1JfS*ybs?s*q9g)!|($NZ~Y70rFU>VAfEZXsp$qBPWW_PA2Ty1cm>9l zD_3;OZ80Fjg4RG{DykDH2fBnS(EfgdhY!u1@VbyAF6@b~gl~xNP4~kj>5s+5yyX=Yci}E!`6Qk{X9N-wcfHQElNxUGCKuOx3&`WWmY^N4g;G%=)=Un|8Vp|B zb@=ilU+Bd!Te_m|_HAGb8X^7+J-V!hjBqSFP1HLY=2S1OsAXX2u@|acQB=0j+uf zH5eLt>Z%QZ2hD0%E)Wp8o_@#86BQSyfdj$G&;KSVi3WnoO*=5i1K)0ev%bAOJ=ELV zJHEOa3U`Z0xVsBEIyp^DPBw&4h`4gX|88nVAE1Il$hE13g#e$^102|sxku+ORrEc< zs|R12dUkeJQA6WRM8p;7D8tM9pxu6JZa!~rZVuJw8@PAh4~H#8&%w4<4-7s3P+{z^ zhP{1u!*y|Q5dg-8Aln4gLa4wHG6T3oL~l}4Z-Jvx2!qPY!(~K~k&#c0mO4wptuum| zP2DP}xqvO-Kq*-sskj11*Ec(xB~io;6LDQ12fGD?K}#Q~tGZ(_mi`+gqJVuE*<`;X zH6%t!{qmhV)g%`ux>&BR0%&lx8W071V+{^Ol>=a+I0fbuE>HFJ^q`0as5m8zRJXt_ za2o$4`I44q??cs>pZ+!=z%MeA6fBdFOLS5&J46JwB8FmF;v~2RZ-auckY9;A zIJD}F(|+qYPkheM(UBL1umb>V!Dv0~OIR>V@Ddg)gMkkj!4SP>t*4-GWnCp$7C<3Q zpm<9>6+MTbZw<=_AxHyG7^AlqZGwhb@!1Z>>WT6Ef3&r|EGgO1`KjLxU&HY}F7Bd} zlT*B~OQ^Tqg&PSGp@i!l!ZvHJ1ngd=;3i#z@O}YwN9^>#FZSzJauf2?OBt%ze67j`|nL`n{Yk!}kKskJX9ig7HRs`!f>8V}m3=GSMk5k>~Jo&j*2(K|rU9t4yJS}s~+6fWh7O*?1>DuDSX~k2;<|*MP97eMQGWj)Y%yfMVKm}W zR#sL;7BrL=<_Y&3orrg=LRv;@z2dHI!M%jkcphBlxTgCQzSHa+qN<_cP-h9Oz8k({ z3;+}0LkR_iT)o{rhTfJwr6~)W5BZ)cp2Ma2hw`6qzRzes@=#gi@b7QYKC7IlTUlP_ zv>M{|go%7)vEvkCjo6?LeH8Z*gKsrB2ajZWc6JgRgh9vx51#7j>e@o+IGB>_$hb7z5FWLRXH#KY|DtRBCMSjz71?%R+Me_*y* z+1Xrhe4weLbzO z23S?kpFfAlHI%eq__m~<+1;z#a2HGlf>H-R%XWX2ef@gbW$mv&;OXAJzG0?@-4^ou zT3Qs4K5004e+H#aJ{WpZ1S27sgyRzvUDLJK#Ge{Z|9JoO+yI(i(&oz3D*E5*y7qV| z^R|CG<6L| zlI*+cX-ns7#ClMvNVKUmw&i8ZG(N-X^9u^Zwrtt5SxwCoBf?z6JUurypI6olQp~cB z$Du0?iWC(U?cNzb>-_Z#fU>I{+?3JV`S~Z767=bXBI@qE<;Am@6&11s+v`pBsE z*Rsjh5l2gQIfRwg~{jDy_jfht-kyt_|eIwW!gfBrll@>mP}KU61*lF|V#8%s;o zrzsG>V`fw=lWBmemlA*vBIrUCD)W;@R*@i2MAhH<2Xz7>(^UTxX;MIf-VzNY0f3!= z0v`gxumj~X6Po`eEeI$ri@s78pTAdH<$^HMMj#5t z8^W8v3kuTXWb6>Y=%v`o&H2N;g8cmFX*G_S{1<`FA0eVE&stq+8@dUa49+8FBVkkB zZ{Hu`L6A2`MAA%X!}48<&LZCcgj)App;kXXg5`x%gTsMH69vU2)+xe-*J{w}Sgqk) z9oaWv$ z$O?~d4^9-0V-!j(7`fOK+u;JJ5+c9teL7zgJ8hbFHTyd6&aG5$t>r7?zxme{O>P1w z^-_+h!rhphoQy0h^K?CWi$0(@pxG<4&D~@wAdhZwYFO>_^Cn3Lo}+}R%*wTq|DTTt zQN*w9IJJW0r3ne5&`-~+{QJxHHaWAsdj%~mEi<#S_%KqZ9~OanXGNHOH6#kq3r}|- zwaYg5Y0_)g#)2zm!$}+Nd2B@L5D;)nb+p{8_Z~QaBKVb=xw)~VQUIK#`(q`|ZHqfT zFM&71zC zP}=Jm^L7ig95`;ZI7msUsqxT#L(ZJZuBysVlvYtWk2a1C`uehHZzF|OI-PFq;-cBW zav2Jm7K+Tw+)&DUjs951Mn5B4TU)R%*(+M^%>aKofy34eWuwbs$ro?&gxs!aZE)wh zyu&;cD0%Cj7rXB+4GvB3jl0?^f3bK+1ynFL`d-q$5)gbd^ z^$gh58UX=;j?PX`s2~B{SAjIzHpELCH@DSU*6MTIF2mk4*aPIl!YsUa0LydbZ0>@7 z%Bg>cUVXE$KnJ<4?e12>G@Z(zF=I4%-Tpx@47#i!46 z4mwv8+9*#>O;0xi&PA>y>EFq>oq9-nt=gRxPdJ=7YxTWQJ?@v6pX_HzLQ{nbW&70- z^ERE2m)?tdXD=_W-|;S~v(q2vyIeVu^k=1?sgf{mo-zG{1jPP01Rd0n$V@LX3-bxO zK#1}6jv9HY6m7cx)vGIEG^`G$8+jchGLI3J_L4i=B`7Ss2?P@xw^&JY4Y$j#8lHOh zaU&xmpt^bp+m1!9b?D{n2~K@m-`S}Eum$>xr9!=ZeHloIsu+9Qo^{_D(E)|qac~KM0RrCgM-jNiq-v|!`x|+W za^^gD=yDPIr`eusEFkpfPi(S7zXp zo+=)oVQt%Qv|Z`Ib)2Mb99Hh5;#K6rkX z)+|Sb^X3gpX&m~;R>Ti9>!!#nD&9kKlQ-|#`E0-i?}b~_2y?^<$Mw*`gPx{Y7awyu zM%Q$E;XvvjqFm0%c#0C*%3_Efeoq0K(r(|@FbW!#c@!`prnoau{nUvQ6g@pXT}D-q zTgp4A=h(HIA3@H6WkbQ1qrivohP(Lg5<*f3cJprlxa8NdTU$Lf9qv+)<+iG-M(L=z zbJbwMoq4Q)HpadcDEtSIzfVU^6*flT7K$@=!Mqo zf_;&|cku%XrYVeHU;kJQ0YXhe1RF;I!X6d<5oN0$uDZ%*W@krZa)GXynOR`#{=3D1x2E+HC2z7s*f2r%Y}svDK2N^_`5F@{!#}2hFg|F6r4iJ zvS(&0Vxzr`mmn<3E$d7FkkB`%_7}o9Hwg);yxS1+=1;p9(xED;;)$x}2;n^Sj84f> z5$i(lv}}%H?IvIMx1vxskjerM7qTw?$;is~LFpu|M+7ksFE2sJg~s6vsa>3g1_3mz zk=hTeKb$i3cJI!ts#1dcAPRQDkGn@U(01#iX$g42@MNDL&TVE<(P~V)20c921j@Mr z7!L%7)I*_I?+Xpx@yZ_r4dslauZFEHA|}R9&@mUcq^v9&v=FLeVv43?_QQt?goL#8 z_YjUSn=X;PT}^ETBrbdr>*>?}*`@a*wpjk=EnChtDX(9@1_6?!hOlPQ*|oGF4fh7> zmpSmJq`Ycif-OM^?IHh<0C|fhRn;7O@^)A0xm5T@A%I(3OW=H1+t~@i>V&M;@ZyCe z()@l`S0$BQ^mw!s$I}4(++YrpZi0xYXdRphZR8dNlRh{dlhf1DH8s0oNi|lulzEBj z`*p_yEoGreP7YqDV?K%n8{p_-lbAR-$ifwlM_oN4__?=KsMGMC%n;zv`z}fh|C}oh zAN9oI#~|O|%7lzgPc))WM4XtMnIYwV*p%#nk+HF^?03HcY)Ar{LGl2)S_8WBVff|+ z3E1@z%+Ly^3_YxloNJW52r58CN}94<`X?qhFqA4Iid`T4gj4im;seA$fm-;6m9(CS zrL#pfd3kX#i*&FHiVE}d%Jcwk68<)`uyEUp)7(KT7*%`( zHg8Kgmq!mAYhMMP@0y;JBuRj$IQgzeBn*3vu6xqNH88khG>gzy0$e9jRf3$Q|u1Z>AbM0l1kpj>imxL3wZnQsiEu zi(;Z2qKZ>5KCz*G4e!d9ey)aR#XnJ)! zs^_7Gmm4~miX_GP@xz_5hvrgw;tzf?aq+1SQ&iNn5lf%uwMfhQ+&Zm3=xn5?g+h+a zV)^YKP_Tajn%x4*lt30@qN4afA%rt04)?r&A4t9z(1g|2)&kXELQ3lA@m=%pN503# zCvmxfe@`Pmjs#Z;#^PdPq@w_1{=79?8C{Z!_=@T=TLGcRR`05 zJ)+{piNg|PTY@)&^Cr#Ld@vjXw$4+0`gnwK&8G7UYZ?;m>v>}nU>l6PYdo7=6 zf)6EZPiWX)v^27H(6_!pve37+GPkrfH!;{{f5Y0w#PXKNA)!Nu1$G(R+FD5o3jX)^ zhb*mc3Z{=eWG0bzkxnZfz2q1*+Uew4-Tb$Fs@X8uYXdDEx6<{1S6h@v-=x~sH?>s- zl)bw0_Nlj4{OfN|)p$ySo*qbgGobEgW@byPC2*M`@3PDOB%O-<>WLsxn}GXt`n=)u zGgB3D*0tdiuIC~KWQUelV}w`&PVVNxKL#SB0y>`F_(w*Y+LQQ1>?GNFMMcGuvi&4q zeB8o9sX&W=*y2e0iQivmAf3S1=Kkc*iN6ZCKw`kRsY3t%AOBySuzRnz?63TomL};k zCvfZ5EfyN8GtYJ4 z*2h;>A2#93p20z?epiaDoE+xgsUpI{-abAr+?MAgq@G+-|}N1O&lLL(RFZ`-$+N&(b2i>;2z{=vxlY?4M zrw6JozPXfSu(nZLS~`+V{MPw5m-r%E6f~Zq?>gy0kN@MwY9aP<}Hs7 zYJKjwz2eKrk4#ed^{bDkCn^8$l3AL2T)mQ_;s!Z6xy;PWZwY7FwsA-qiX~i4H^nNa z1zm_c$+*;kEvK05b9qDIjjE@#tgMy4>f>5-90YOA_=}0>O3KTJq~#7B3XG9;p<`#S z{=2%odE2&xQ$d`g9a#;cMwL(a6i=QMHfs{FpXdt6$Phnz^r&`$d*`SIJ+DenN0v=O zkkIuqnQvLx@ncEq?^rKfxG-<$e>PG~|1e9Y^B+_0%XSmzVq|=Z^z^#(-R9i{?iCeQ zhVpNDae!~r+fAOq!NId5%|W;=2E+04<;%%Ge{R%9NiGHk`TFwg-|sy+X=U2{{;Z>; z#8_Lp$g0)OfRp$Yi>$M#PPXlfYkAI!r%pY_0x|2l>e~y5i;L&x<(=hvr5x(qGs8$r zJCf?QY(F|SHr$dL_v(z0NkhWc7cX8IS=2-v>BH!s9MZ`yEMHyd3v!yRKgFl{anFs) zC%seUTsNotzs_rob0A|)wpSS>*IYF-)l>9x{L~SxlG7@ zZ)n(Z{p!4+WVmvq_;F?5SNsU_Cb`wwi&Wb=tDD|wS-K2$!q5D<^hkLRIemS7 znw`S;SC{A0EZW6R`m+=Tu!&P=eb4C|8w+^+`0?%u#Yo3+U9Fidl}9G8^sepQ*N4G4)F&F^*YKYVEOvt+Z}V*g{;Sn-1g z13rBcZ5ZA-FTjZC1quFY;08zx!gAurd}_XaGKtO z$m#q3>dX^te@~0{&q7AkEJQS8WiW$AUqkjH2Z+^aUrD)kc7D8bxIH5!>D{?#DN@3k zCH8dge3wggqALuFIE??w`*^eF_efEx z__!>HYx~MXf&VNVnL7DI=RdzMC2IsfyXNc@y!(`}Va1MyZr}cXLsFOX$U!`|D$?PmEnBXC zdw$e)rbb+$_T};R&lWo+t@j|C321)2&wS1C4%WVRWMoVK{ouyNOLX+~PKyK2oaS0@ zE{ z%XxmhCTAkw@7_HMtkGT{m&c_KUCXU_#C_axEWJ5Q)c6Wo7C}aZ6qik%nZ!c{7tLEU2ukY-&bEU0R#N z-<3rfe#a~%vk3{g`HcsNRI+hWnuGp1QW%LH>93o_!pV6~LnCZ>rldp>RokRHUv_+a z+#zC6w#xc8xBIl=0rM{Znb_{k%W7&^x}-Emp|ZqSUTKN2C)+rzYKKCvU3eTETvQgo zwwao`az0f1b{vZFXVGq~NrTBnI>APN?c}Ct`VEB~|e}6A0M;ZxRf3l}& zv@5Uulk>CXpYA_Pd_I{qZ>w0;`j%yLlbwSDtMS5VW>D0!tHZXsoXaEX&q#BcNds?} zW8YTN=;)}Gy?t3{XEYYw^v9c0Ospd!j7%fnRkAbNuDHCsd^Q(1O*k3An$S1c^mB0V z0dAXivn~Op5L>uTG~x7P-i+uGgv*(XTb+)``AM2-yr@>MkQZ%7nrc23&8)3WR@$A&^;m$n(K?(GYb7kgJ0DxgW{;NTDy9WBH{W8^_$Bd%}n;85P#$+3O=_9&F0 zLF*X}{NU+9t&^sv2at;s48MjXq_l1k%q_(9O-@gLsjsKSkLCU@Tt{6pX?#tK%%F!7 zLc=K|QI~r0;zeQ>F27Zm02KMt$*y4$T1uhkL$}wso1LswUqIevjDWUp}AyMv9*rQA=)#-p`k+~PWhIh}W{ zsJ=dR(&KA}MOD`mhO4JerQQ6pp+i0Sc~R_{QK~rF;-?{<%t3c$rlTQa@at>b5QzY9Ktdkr(Pzl zHRV5f!f;X7)YSA&cl6K6-r~`=bib7RC2DDDX`rE_NOYQ+RxgHGr#r68&$V1n@ECgV z3F-FyyQ@b+LPA*N-DS+0l6yy6(+rJ_@WB@V(;Cy9#gT>r50Amx=&Fj~-I5-EWk#Cb z^>o;b+3G|l`Zpj z9~B@Mk$a8G&AW0X5Ac!`Nk(e#K>GWrZ(Y{cL{P z-d^lfAo~l0QePmh-%an#=0pbi`ik#RY`o=Sey`}!M4kTawX9q=rtO|2)b9-&H#Q(& zkW)~EOFJBznwrX;YcnGuB|TIQJs^Zky=$l~4@pAEY1;6bV=pECvoxdIy$WdHPL$>6 zZ{N=Io{LfnU_J8sLL3$SzH=o%euM%7kx7b&jJBlS`)tv!mThZ-+E(*HzxY>2){Moo zvV$+;pE1`A)p}*w^p~cBfnk@2mIh$o}5uVkg_2b^u)KoyS9jZH z`CU$Z{^bW-?8{d@D)ARORRY_rH zpdDdiVluLCt*%*FS&={vvEah4_}xC|b^rbjIy!6J^czM-)2%mSg)G`W$>b>8j8_`|IDOeQ%e@T`vP}jw{c1D@`TCM z>b!QO$iv+T)xJ&#?!zA{VtJTo`Dlm@jt4|DAXu00j5WND66nA|dV3|M_KL1sDWFFX zdI*HML;8Uq*!M9m zLB=ua$h=L|dURh_y5ocHYAiGn)GgEH=}waUG* z$`nW37sw*SA6`w@`>815)@DuV=dE!E7;8U}7!whwmKzc?s z5mPHObqz0$Z;SzcE^zH=P?bMh>dQF%?Zv&}>@V7DOU(rzGBWn<+U1E(cPK|*AL|Qv zufO(pRR*A+C?Tdl4zRON>$W=qW4ESW-`JVskcbN-C>d|wyh$LOhJc{s4`}okCVL5F zzVv4#O~05*{k^tNL4ikp`RwE*0S|9tSweIREkfFsPJ2y7Sz4~VXWyCUJk_!=^<=?Dp6^U{$|BQI z5DZ3VX3m~HJFqa-=jiN=c3rcFP1rYNbkrQM6WOjHWs!H^zCI*v)B3NaXjv?+qH6>FX z0J|6bC8~rUGc??jW>jNgk&!XnH|VAg4jDv|Kc{R22$=Jz{x9R=PM593$twEYVm?@w}oVCFEeY({dG1i_zv4ffU6gIxe_jn%@6}0$#I@zCE z!+>u3&@8hO$r=Pw6>8R&Im!@&GY(``$8V41-z8xa_zZW0ohd06IHkz>prRrw=;6Rj z-HWr4F77R71oKL+2g#NJv4+WesCtZxuXHTzAuq%(d%r#a^*@x z3)nNvZ0jczdIW-ay12>r`*m{5{%8}X(Hl&T=S+N0))WD4sECkKQc@yK|BacQp8koA zP1>_(&-oX}ykyd^ygpwvyKw*h2Ed`GLo8Wt8P{I!{(P3~ynxa7_|t$6AJF4D&;B}U zZl0Vp0hB)b`-dMGy@qtND~NFcjU;adB?F$7zstog`JX^*$wC) z{p=G!pU5^u7^syfiQ9J(+vJBW+C%~O7r@6k^#`A-4y;eQxUZoA%?44X|Ni|8?vEZA z>vztdGJ13!O;5W6_&kpA&No`>cQx{q-Xnjm;s5aAMg-%HU*BFB8XAWEIjHf$v!zAD z;QDn*=UF1HJmphUq^|AcIB?n7vCg3(sm|rco6G!&he9pOyc0@F-bu1(#KdP%BfkUdE`KyU{ku7(4x|W4#bLuf%wDR&iH6LXp}I)* zNo7+tr%LSZRK)$hS{(mWD_e1$b5lT5j4`S%8mq*fI;B$LbMOWM4= z23#3vAM>95i5VcOal&T;XyI`#09s$vLid3x4vO$g<6Qq^Rbj_TJ&fBEWD^khphYYJ zVb}i77kn~rr6VDyU=XdDw|580|CM+&<8nw$>?y*J0{OHe-K@DK-HcgPZgCGu+F`uE zE!|Aitf^Xb@Lfh1kF0FxB`p;d8t}|c=eGL&;@y#|OguW;EtPQLy>)``LEwcD9gKO) z;d4Ih-kX%gw9Uz zFCfrMj75J=OsEdkM$fpp&J5OQ=GY&slbNBJo0}t;T9KQzlNkl80bl{t@?D)G#4IWU zIiz1-O@A|dd-qBIT`00h+(iErA!>3A6AalRK?uJ#0+W=G}(H$RrPjXHZE0-Z+SPKzWzGHZcnNY$(>l zy}XYAb2X9TYXdVrzZgC+@PUoQt|O35{=!c`nZzT3^AoC}i7^HliTgaNBR4v4H$dH& zVIaLynx33ItRoOTQu+0<=+c<@sAt);L%o0MJnqJFsf0n|xSDVt`;Q+|OzDHXdld3^ zqZK>Rg;+ZfeT9?L`)NEzV(;v0nzNNSCr4gAdf#?{WVtNy9;%Qm{>YY(ySXWu@Xzbj7AW$qEG*O`yXz+x_@jh@@( zDzc;<7ts=O2Gqq`YD~n0QU(W0a&bt1VY5WvM0@X^`z6I&iO0OCSLWI+B_t(p*Hfw2 zqY|SJhJM7b{9(%phkWQCLV0x``(G898sune_k>=VbQ)lE*UWtMmVO@{3s(^L!Gnn& z#Z)aH?uY~ivRgCNTKuEsf{(S`{rP}DCnW5q+Nvq!sBnSr!w^|fVDk#*R-EEmm7Qm+U=^Cw>p{1p+ zA^De8qInS!p+_T9bH!I+L_S<_`mmGpmx^GkQI_OuHG=v135Uv)1-t_v?2Em>m93(( zlINg9I>hMsO;DM?2Ia}htjUl~O_g{oA6#xvzbAaddg*}refu$u0(aT`{Cv=u57L|y z3HW==mRh4<@RCV$;DNEWqiS>ln&eaz5>mo|M~AdC3tcAiPNDW76+S(5Sy8e7J+$tQ zcOiRUczBS6MMU_tJ_~Hywv7Of*y<5m^T2f^yVCJDt`aX$;Cy)C@I5rr#lor8rSon0}2GmgVL0C-U~9V zHr7XDCm7kZIz+mNQ8fu`$0;Z%c;?Ao9-dO~&v$6~$c=ykLBgF@R(=V}*U0VRHjbZQ z#Q|$ej{WfQR=NY7EiB<<)#trb{MEy>d=jDBXdZF=J3bUh* z**OuGmL{^cP%bZF)k7+NxLthY%(-(35Qq{SxInzE2TF3lEpl2uDjKTeF+U2xUET%> zMnoaF>8Jb8q7{0iPCDV61ZgxFN*EzkYiMZ1{KbU&g5uwDiI<1xX##1#nu?Q?laT(G z4Mc3vtIFs%Wk6uewjWbYH~rDV!bH{lUh}mw#2u`Wp#Diu@zax%quYY;}Y&@ z`G5j@P+}DnNV*=Y>6!)5s(5(F(UJlH8bfr&lvd7bn3$NzfZs)$fHrf**oH2ZDx*u1 z1{@?8NpGQVdrX87g{zzXf|Z2ZlKwM*SftLppi#; zODJ?ugS>rxzce>LL*LskEqCC6FT{v1#l=ZFIbyxNy^u2kU%%eJ>*gOpd{rNJssTL; zn9WmYvk?`pQ>DyCNmRTNcupz2wJ<%|)_VUqQg%_1VV|4yGV zog4kC8WU4e7rQ;%MME*ZC3Qik5WPA8_Cx3y;prKc-7)AihL*!XsDi~dYHC7Pagii* z`{xG8zMm|+yBa63DA){yia|j|L+Szc>-lj-_Xak2W_I@98}G0r@vmNm%c-iUY}kdI z?eFiO6E@aaC3{VutNE%){?pzaI~2;Q!w=gF*xL;1g^6s;sd`4{`1AYTU)@~SFEMBq zKfI2Pm7RKyzxe9l@(1H}56CQIViv=bQi>j+`mdFhl`~ZH*REYdN726=cK`l;>A<>G zOZV$QZIu1VbPw*|pKLQrA(S*Y1s0#BpNkOnLGL|e66E8P^_HZ$1EAY=S9!X6L<;4R zTPo^fZSk(Nv^9M{Uq6lB>e<_KlznM#uSvg>yJ`E=nL0VYdpRz5V!pf?T;B0-G`7f< zTG<=?(i}=drZMf_TTa1t((1C^8x^3Ai*~;hoTrI7h(XNG&X#m_$<>*56VzUE&%pHDTz=m| z$NcfLN=nZmCM*Un{#~8`4RGcy~VBz!@qtl6uR%{>?eFT zW*mfawpcFz+)}qCcW0LemzX)}d2W40156k+n+h?vJ6Ne5oajT-Yv+&FyZVXOWc)gC zXeN`3sbF)wq7NN-_QQ4Gr;+hY&}ioeZKk2A7LnuSEfej+PPeqQOcO%bK{bges}2*o zM;H(+yXCNh%h9BHMoEWsqbeSYj8zIYI;=3#^ub+r9}xQ3<+mZB?RKkDu9IX7i$(Hl zUqj`uP@{+}X}VJG*d-v~-_xVVif2PP1?Ju>Cl}Lv&1I{noZHg*B(=S~XCpQgf-*As z@rIEg9lV&Y>7g+rbXfDwY{m-7KWs3wpp8$06mrD0Q4f$F5&iw`6+seV64wJf`lsLMrDeZ9ro_2Mo1I8eZdAD!x+et$O&Iy1$ z^X*UytT!je9C)qgbMy4S?_oLOniFn?6gzSuo3{Yw6IGS^$LVio*L zQ^**CdEVQakY9QCW$fn(cQ!E^PN#kkw;X%@=5+qYtE;WKP9mtcPv2ftR8)a^FaEs5 zvx8@9DwHH#S)K~qImJb}tG+8{du_~KVc}`P?mjIbfNdzteA?T#O-@&Ra1d;MD$rZ} z=5p4#+O6tP4^nOIczEtI>QL7=ET}q*50nx;m!?$toIjDa0ds$j%RFb{<0t z7XXdvJq7?5ys=X6F#JuCGM0I^gVj6bRwj?5@mWC6ODOBxC|y(ZX=$^>r6>h>m{Of) zj6SaAnn_4VX!NQo_H(PjXXy9q$6Mxt)j2lwj#7k8Vx+3NT6Ap70UjPNRk#)f27^y= z>d%d~f+LPd7u3mq0&2QLJnHL8IMOBUjvacvrl|K^I<~vBM z5j3n(Q*20x!HY_ahl!YeVYn2WM&4z>`eGRK?mCP{NxB7cMMXvIlGY{17=67Nwq|d} zkE0;;4VY+UT5$u)^uckXo$neBCgAFGVcOuANBKQ@)C5qfWn^SXEaJDKyxsx=+yXRF z6Ubfq{g!Ca1@jl~?u&K(o;(3r6=LFAKZqj&pOs_-cPXXzj*r)N|DDT_8H1p9vn$sL z-0wZhg4HJSP#Y)1#iNB`dUIZ}zxN_y!=Mg7bm(&0r|M#DEiCIiyGuwYm{3Yp!aSp+&-r8R z60vq-W?0=QX@_l|fRQH<80HV$+kL!ies|`G-=o_4rL|SEoAC<)gD>snneHK0qUMc8 zDi1(ee|5M><2$Y9k0Y1x3YMU{1eaW4C;~u|@n=$8#j+ z!!BaUS1I4B-+p0l;m#!!R!+6;lWh_Y59LeX(cpGtP*4CQm5YYOR2N+qbv*`B#k+RZ zR{8n6EejAqTSPoXN5JK`Jyn8P+WEOje3L6q>}+E9^WC`Ry6%?xcz3X24T5v@4=Xgk zeh{LWD&8jh<3`5};J%N4F&)Fg^S#MrMUa6Z$JyEdz zMrFS(lBnUHR(E&vu|}V2vt|LU*WMKz#8WeP>LjThw%)@oziszPJzIOK=c3={awZ&? z{xqj9FZ4y_JUpS8Ot^t7R`+W$@v8Fv8H#Pye#?}lb@JJ{b7k(6dYd+R4pgPv`Fm?H z65~A9qZUW?&V4oXqFIwws@=$%9lIk2Q{* zY&-p5=QADa?_#eUM2yioou{Gt)wnt6VqyzCl8YVht_zFkm(jew#v!-hIa{Jw)x^gm zhOSJppUlR}KHfbaw@~~cyR4C5xH@G(M!9G!6{E-r2b)L9)i>oWB@XXI9^zzQm3zs$uwWxHtPLoiasCF6+LQG#6AC?W`Da?4Twnbut|MmhpmovG=dRARL&nlX zL&ZnEeh;4y9}d6Q$tjbb$Sp>IVnwVuR|9KM^v?!S%amfoi4a;;IAD27^KPt18S3xDZU`R+ht_kW|9y_9`DnbBWsU zujv}@Nc(!PEBpsFn_jil5pq4Na;v9Pev^YiC1fCveQW36EjmM*?hW(0wdggl4x zfUAA}HpI(guoXnV(Og!&u_2sqgoypg^oK8uU|I=>X`OzdBRZt@*&itu{Zma>o(o~u zKpx@&DbhU!n*kK8$G~=T6Wyv-R)>+1^}vuO2whB2;T9GS(M&T+b(y~fE*j#KaQof@ zaNmSQ6g_U5K`Aw8lasI*a4xtaITS&gTYyMGLO&>qmW7Cm=?@wwNa#}Hbqm~QC%R*$ z?0)ZHWb}gO1dGL22iHrN7{E3F&|l24w?JoRf}R~(lS1v=Hgsl0%Lkq3^_3LPdeCtD z_RYYP85Sr42n>E!83`H~cqe=+2B?V;3}l`-L4sEUSwpC21kNn;-wB*~HG2=OlafF_ zt*x`Ol*`buGh>sN!TU!bb|>J#XbX|}^^$BrMzl(p*0CG4-u*o7{KUsAI5`(BMGxYpil zW$XpFJ4X>F~~u+)W9!%{l`b=~|mll&99<2z-vjHXDxhKGIf^4wy6zGfXAWljR>_P%EVU%(yYO`IZfk0OzRux~s-j{K zQtWkbF#_2969sEASvEt&F5n~m-)fcENQVv`a{cq;ia(opAlym^)RUF4D>Wgd=O;Ry zP~6b4#ljQ$R^tO5Z5Ee0Es2b38+!%1rJ1qzPbL>*KEndtdAq^rUJ>Bc24uj+ITVgq zj6HwXD_`%HWLQn7I&A7_+1SqDx;4@w!V1mmJ`9_g3aAJ&?ool4I2uV{ygPZQJf|k4IZzT zC!ZaX33)`iaN+z%!*hKT1;rwDJGAnouAGbdV19?k;N|+S%DXrpZ1cLe@r9eqMVpc9 z)g0(5o1~!9~zG1N}IH^42pgdyf9ientOMo zE+&S2G-H-uURX(ym16zfxMAj^pgMd=~3+Bfp0y;oNnB_I2<5u{eEj>4o;#mP;T>tN2<8En8FkL?;D{&>*x^9a!ELP zUoc{7iOw_KdsB$Rn1O>A^_p2w-~+0yFoy|TiS!QGZ$+B@^Jg!zH{wmqyhUMI-g3Uc zdVm_<^?!F)l?z~Nkl-d`5+I3ZM3pT#I{xPSEM{`7asb5S`FIw7D-zAtt*;y=x(GWM z2++1qCKUZqtk6Z=^?!iUEDbNhE}SnUTbP;Hq<{@4p_R&0zP4)V7s{&^#VA4A22Uag zJ>nz?A{g3F?F;nfv_#j;GoN63d0||-Hi-4a@7S|{hldyb{HC19r2s2_P&GdDc4q8G zapVR#9>UXQmq*j)FF(RTy#3PB2UH?TQVSJ?uepb}@$s<;i}a3V*mPYzBvAdG(U*a3 zo`F>S<%{D`w8MU!fzkJvy2r9}r<1N12ziU?iH`8(GtczC?+KHjHEp`ztP3sXaVY;4 zg!dI1s(Y`h82G-A^O43obDrURQ$vB}DfuuQ#F8J?(boI2!EsJ={{?bwZO64vhn>>) z0`MOQ5bQS+@zX;W<14ZgNejhiGX~e5x6htX>_2MueS;_ZXVi!7*b*a9>0gsSuW;Kx zd3Kk_%2c_W=9Xyh?-@S%S1 zue)Lnro?LiX3GI|s-SClRSE9x;Q3&s`pZ2e2+~TqNXtyfL2@iCxZB0!oJ-oFk&f-#n?dvI1;< zsgqw*0r=UHb`qkfD-`WO$lt_yGL(L3Ptfn^_~@wFN!&LZhS2+2qkDwjP4L*DOT8{f zLJ#453pm{>#OMd0Q;mPv>@(O&@@bU=uz1TgJBS-Y$m2dzX_2NB8U@c zMs+bY=mWyx6#2|epLGVigLp0wTYC`VxY#!sDM6}NK|q;FMeO`8LWoDfO;eaP& zD8?nQ+heWs*kvD$6xv$K{h!#`5dvz^j@hXyQ4w+PR9WtXt*ly$Pv^F_4K$TF zj5SSeJdF5(8~%*4vM=QUI;TwPT=Eu>@eKv=Jk%j9sbB3v_&z*{m;ves^VU+}A>W>1 zSzcON`u&EF%wgOqw-x^XI$**redlrA?VT9yQAmWIQ5jN~7asq7f1bPtSOZgStmiIF#7f}AteP>l>6K)S zBEW}QRI>#TcV`ilzZ#S131Jc^-@G*AK*pZ9lyWVaz>%PPq5I*f_(bRJw(7xP#e!pZ za3B*$?uZ|uM}m`#Ma-N9X9)O`rI2IBHBcdr?tl>rkL`0JN3Oz#?>jA=n9?yq(x?*AK4Y~KEPYem+X1^g#=W`7ss!n+;< zd%iB47npd_@8nN>DpQC0|-Os|#u#~BwGtO&Psajdtu(rx(l zViPUU{>jXD*f4m;Yed8Yo61gRJN;&YZ#svvzg;lKg^NQ3LTR%?Lh=0p-sU6bPeB!uj=Wg82blv{* z4Kw=1#{|Yx(zmgH@aoK0PT`WqM*9ZdIni4*sM7)}dmjGSP}rJwvu|kVAw*u_6hl-Q z2lfKAzv$V~cksZejfihc?lu-h_}+n!ANdLAhaP~N2wzf-kvU!9z6uXwacL=~hldBG zn^VrtOBCUluND?*=~20fmT=eq@&c?pIvXt=8Ns?bOP@PSw`Z^Bhr_h|n>}&Q-RK1% zQl{bX7IB&-@mw^NjXDQcZEbdoXv4@_Wov17=SvH9#)yQw&{{Dv0iExaI4cgG% zyLU5j9FJ7+cZnZ{6<3sKb}3tLxN&Dd$4oV8S;{_<^aG4APBUd}-?*K(y%&9&MjBO& zGxZ_u59ay?4gcRrtn+JQoh}+rZv3U1bYaokaiZ}&6)i2}aptq7d#ohG?mj$Hbo{5U zaYFioRi^amkjwNnyMj`Uvfu7BHqqde3OnQfiudSm)=W+fnRvBcC06P~l~aqWM^$Ja zM(G=MO+_!;=x9sT$xIZl-q?^YH<2sS^4Wq7!sZ8?p>w1{oIeT<3AqcmrR_u)2hkbA z$m$JFE8^WP9-fce?u;}S^X{fFZvSlGvvAwHN3TQ5?P{BzVfr3R690h%1ZfPyqL~fF z>y)~>dR#foP!ub`fH>`yYjG z&di}8F~B!FPQ&7PW_Xxx<8CvH%1oN+%)BcpZa zZ(g@~e=V==R|E(Vc!YBAfcqB%2M@^`B%;{qTz0KlE%lny z^}Oja=RZAt6zo#>U5*~L%68|_dGmIv?^peT&~A#cW5@iX8YTJ{7AljNj-T!#H7$;@ z-CXO6H0iEeS=LGW@L|X9Q-LM0_WFPbI`1tO? zDhk4={`0sK$4NC!&CLNP?}0M}$*|MT;!KJ2K)|0$wvi($Uw_qqd+_kM+oJGjW#we~ zK-Gm+9HJ_4@_pQh=WdEFN;3)(_XH-u2EBJOt_XG;+dkF+gd=SLCp}K*;JRo%hs#h& z!8U9nfu6a0_1y#f6tIxgDAzoRfYQjael;G(g##hj^Ika9hh|Fedc(>^p34UqFCDmi z?>6fGW4DW8*8e@WA9crNUC0wvDf-GOcJ4gik+-G&cAwS6SVr$*yEn9tSszAm>Si_8 z(_wg|!!QF8*n(R4> zBY5PmW&glup$(<{OM5#TkUY-A-j9phouCp<{@i{@P*juwL_#UR%4A>4q4JdWqkw(F zNlowW1j$pqjJqT2;#sNOQd+WWWKw@a{-39f!%AfWFUkC2t-z|J0wZYW*lz`kOPF84 z(2$WRDJlQh58>b(sIdotj@NN&8*eh$h$=%Qz|JVjElfQ?$=(40CvM*s0wVS56Fi=y%d<>98MtsS1O#k}5qp=>_O3K%SS(rDb-io$;q4czcgsW@Pd67H*x!g1G%f~7b2Unt!Y7?dRbbXLTRT;ns%moh5xD=B4h4&%@DrVK7gO7uWFeMw;~t za~_88wggU`3l}fm12mdEsB+q}gA6g@T$p?{of>`?J)KZtu&Do7pf1o}HO?BTRTN!ktHt zb}%q7C~-U#VE^|;n7Acp{>t{ddBzs6v2 z;@?G6Lqh1_lpupsrWnTgy>{%v^#6u93iW0Iq$U{&+5oTuF(2&z`6I$Kfg=~EU=RBM zQ2@lcGKWvK=T@TM2-Qk6+G=fMLy+4^agV~+C*`B{flzA9E2dk-fQU`Stw=~eaV7?z z(Ce>%B84T>$hPGpPVGPffAaJxE~>JAQQF~6+>>AdUL+(?5m^DAg7`p1-a_Iby=`&A zoUo3=IK>IbTnO%Tm)#y=vV2B%7I->EpiKEz*t;d^==w4GGAxzHgv`1>IDz4e9Q$(xn6 zBApORKUmUZ*6iuFyyu+a(!U9CHW?c5s{HZRW2fU^r{|w8Wh=ysuZKds_`K7M=Y=>^ zO9m!#AD{13JbC}FwaUi;uE#UaZEVbL;3=LR-JCmlY^q{La<3zW`W5)e1{Bp2bo6d&eG$oE4 zrF6Bx^kloW2WG|>KTK&kIp62#zEb1fvu6Wdmb6f%``6%n69WCovu7i>o~^6|<$U}| z7aAH$^{(|v_8D=kEZ*MnAb9F;G?W=)6bMbjy)b z(^Qk_d0xMN|KROgv%K3l>tvkXb~32mG`*%aWjQTX60GqN2{V|6pB|a+ZvriebjF%{ z%SMzn;B-^^rQ|DJ8Y#IzvpKQO9LST!bK_oTFEhSD;p__JsDE>6yGVS4s-|XmBki7j zP81raUYu{tIe6draKePETl0!648O$jt8x3&r#HhNgO}I@LaM|Kt|K$Ns5joh#6$&n z7Wdu)#2IlPpymV|CwjQ;Xr3AK=-aowpPfX=Rb$1DE3ZD8oc%QW{|a4~ugyOFYha#a9=Dm=yIb{_^Q9{Bhb#*(_hK=DA}1a?GqJ!xRT15#1wMkPb% z(82xt3yG8nNP6kYmEGdv%%pE=H&uz3k5ubYVplkALhJdfi(~&GsxCKXjoi#Ro#Pb- z*cL3%fl(n1a3(9$evFl{4dG}X*i7=*7LDfS?ybo*G&G9Hn@ob&{BaohInpS>W&kbP z+2Gwoo;eN^JYr%@z#}jYo&s}%*8$kt5MFd}B4-_33O&h4o`B;7g;a7G75VGqvpM$Z zmb4j;Lg#h1CTozzCn$6HxtH>=Dv$^$YHn^GH_svGnpxBW@=NIU&l29|i~AWsG%27u zJ+{Fs%z`UD9-)kt&3mkEOxAhZPMN&e-mTa0_E}@nubUzA1a9y)d~MO*rlUZ5{r+TA zm=JQH^LqUZKK(>~S-{uBeKEa=`Ox#plFdH!7dX~ats&i;K#tqLhpu#IzCEuH8O(i~ z=S}f?-c%Xf9x29c^JPPePR@fneoUu19=aO|G2bB=l@;63c4iKT36!o?s`YB)olLWi zD1;;5yg2~)q|8zL`(I*y%r7Wd&YzM?E-0AdJW+Y#`#Mxqq zau+YRY82YE4*nDk?fyObp6QtxB$-!%`l0_m&>ZORFYNB-f(xMq{>jGM$#nll&X4Rs z&|Xv|98u*sa^wizzK?SMifr{87&}?O+(VrS1Z5HT<_$IaHnsAP2iA*U#VCUMo|r|O z5=XJ=6oL0>!#N`5P5#ZmN8$A!DXGD)@Lh-D*kIB61n=R#uYhy7VDX4VJF|MH#+$%1 zw5N}~I8Tt(ualEY9J<{eMn$n>Vzyo*Fs)*U6JC5pyeI&N34NI#gwd{#J)|1`Lm{xU zN!K+v*0DFw*ZrZ&NxL=nuFt2U`h)dLYu=BDU`5Mx_BV_Aoqsn|-gE~l?-%exI5nqM zo=W|nv0?$dyu9`wI#dR3^)}xBm$dsU=f9h2!z2&8KCuShzpEwnRdDK35ibJV^9+TO z@a9r`9s9lizi#jzWmE0chXemvmK*D+lB%E87ewQ z;&nH8BL)o)3v%1BYxbSkg()zkC1kGs4Agi+pxRTvB|iSE^a6xuu=k5p&GI%p3=56yBl7QX!-NkeWaxoRj2mAb>38!U4lT zOp(vODSDFq><*dd&z}aHA6GE1BmdwN#91A}()d4GI}@my^Zt+j3{u%9glc5EDa|}) zNMW*sHflssNocV~6haA!WLkt6yNOC0qD4Y(lh87{{rY_K)2)?ENW>s3rc5-QmkY=H>pXhj_mVzjL0} z8PLJXf5Qf@S0|wmVusFm*~(!?UOg#(W(?Yk`zR;muR}f*#R!h71jT^RlXBt|^*mu+ zeSIZZPa>DBgf+3^^5T{UJb37^FiYd0?DaqA@gAk2a(wdS$;So;%1CCG|1v?!$jHE4 z9|BQyZ0tH!n#3XFWqr`}Bpl5kVdBi(tX>SWxtvV8javWyJ2+?+$56$7OqoYyK6S>7 zDc;_ni!2t`;oLK$%$41%Oskmz?wIZy8#!#we}DE-kqU3#G-rDiR&s1CLOex|*i{V7 z92=ht55$}vbL7S2tw{#+j*PTyGDsi7L||{f6v>sdT0X3~v2TT-rU zoc+DQ8ogJJxu`!UA$NtiZjQ{peA(=D+30|sPN!F{53D#Ic}qkHcuxna)jU(dXsJKZ zXTt^)&e^&w_!~)Lo}$34NVhUCO`#~7x;^`JnY7&RRp8s-wtoAKFVw7( z*E^CRYy&GHdKo6%{IXA;?7~*34F1Vfy5*dM+`-AoEUpBbKo6!JtN9Q6`~f}I+3r&O zH!(KvNSLh0*zg99_a7luGoph+0Rs$oQ6~v^n8-cD!Y+y3SGiZOd^i=3_14{{?ZS&}!Cn~j zU{*F=$dVBVOi;Q<{@=ifE^{U-Q(PyI_J?dYk6 z-~G+E7aIC>ZT+~9nIzfR*zC+%zj(18fVJJsnIDMp`<&0RKgVzVf`H~gpL=h$v#eG~ zb5EQ<-%qNpsnJ>8hnMsH>}AV7K?oVYOGhOnwf@(v5VFeboSl^c5NSx9a2}8iYZFdK zK>QT@dlxMJTp{)?l$$97GQ{#OrlzIcUV3eHx74moICt@W?F$r(!FTmq&jM3_$Ik0) zy%jFax7`Lcuh=NA$?uqr>>qK{D8+lmb{RE2*+B+`df`I(>V#;4Id=^CreOsUjgEfw{-H?V{iFXpO#EJ9BnFCk|CG&V;Cm z?gUGcj}5-~>kD-)$%xa=mlU+l*wVgFqwlN;m66#*krGHX6m6@FU43Y6ZLRRL-GFG; z`sVol{d!;9!~;I}!@4!&JUU^l2R5oPg!?p~q9E;*#jkrZJY6S{)=#!NXL6wR}0 zm~q6|dgn(b=^bnKbs#U>110xcQeNEyAs>8EDOFFQs$=2kxSx@^4^`C2a(tZEGR~%< zd#;q`|6;+yDMl*hO(~~N^&!Ve%}1^{06N*;xlC&6c;a;W(Nm1~-OZ{*avcVi9>K2f zd)?^rfxvgf4L9de5x5!!{azGW_^aM8W_`e)w zo(`X-%vRotF6JX_#8kx5j?>}{&sPE&#KD^#GVx7F*45k}qo};(+budex{-WT)L+32 z%d@78QZ;W9S-pb2!GD=sR;CU|z}s)JZe6B{EGyJ7&~+u|FdDNJhs0JbYTEX5jh;*X zrlFR3<-{AFtnYT%u!-m;9kiE*)UjC>#-Exu%fX}hg1xJ2ulSi^kZ7`D!-`8+&n?~) z@Gbc=!h&|`(xrM{&yLdO$B%>Y)3*HlaDbkkUK^{%E*T@MKTVq_BOO1#ipey10Zh zEi8caT?Icfdwkpv4KFqmZzj@>fAa3FF|rG(MAroi2;_X!I5DkpmJcAW*kYh$%#$7R z@B*?qILiYvZ;T0A*W>MmOi<;v_VxvMm=nUSc)E9sSszX~e5&>4&Z(rNq^s|8o07_w z%j@5tgv^tbD5r4esEN+Up5bg zu5Mh>s{{FajtpMJRVUC=Na2}K3y^tjmIm0C5HW8w@WmV^&W}Qn+TpFi9E?oNNYR{81lBIkZ)$~qszILGc{km?%-cgjY;E{nKn!Rx4iPL-waA1kRv%|oW7iWF+^SS2<4&VqM~ zcnLpYmg1yK%N&C&&k)5K(b91x3k9A>vr%e>^{(LrO9JqPnUH98o)uUV-@aW<0^pJi zz-AS6y&`N#JFv||i~x#f-$KAeZ~k=-JWd|1o#HH%VnOYRLB!got@v@ISPDTP_=U|# z#Cem&eJH@o$2e&&zvDICjVCca86s$UQ+E#;yN zAb!XUmkX$X63$f#^?A2d4YvoO!!I&$n<0x;>Y^4E5*`_;&JXsX`jZ_n`;mNOR?#I( zOUu0Sa;Hsjsh87;^cQhMDmvRmWUie-zgprdll&gR5?E~7bmc>{P$G0|_-KLb;Uh-a zjel8eq^O@rbmIc(4Gx#->!(KWcDjIKTDMvrDhRXt6f`AD=_PlGE+LJ{*@HARK7puC z*7wqrE&oJ-NfDV#ZfQC=I@U1tFzAmXoaFA4NBo6e*8?r9Bw+~EK-3euYnPHF!n{8; zI{~mxoJ~D$F{o-#!8yR27h_&PuqZNGLvp2^U%@L>nhnf zIBW;j?Z@x65#>W<%X@)rMBQk|nPBhi94Y`Td4M|0q1XCA(h?Z-{+Um34ah{>wZXpy zO@T(2>}JjCOgpB(kN(2)A>^I@y))y!nKwl_M$4$Yt2X=AHA-0&S?R3XBun;Wh_#w? zG&ISuW+Q|dPmRUm|+^_PfAyNUxQ*Dg0X~=oVWpMPXLWzNHCNefwhMg&+ z@++4V@3nH!J6$8Aj7n!Gr~U}fdPZWGJiaJ7pbB*Yi5tMVLcBW|IL_>{w3I0=Vu-ImCx^svxI8mm1m_K+HE`VeGo?|Xg{q>I?zNjdxfA+vv8xf0 zl~;aX;(@TjmOp^Be=c@sL;F8(qkk>ZK#3#Y_0Eb@9buvMc?zHNBUxKcw>WF&zU^O- C)IvZ2 literal 0 HcmV?d00001 diff --git a/doc/source/_static/img/tutorials/fdlf/velocity_paraview.png b/doc/source/_static/img/tutorials/fdlf/velocity_paraview.png new file mode 100644 index 0000000000000000000000000000000000000000..5578c00d417b7481a1f1fa6247ea9faee46e16d6 GIT binary patch literal 10462 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 literal 0 HcmV?d00001 diff --git a/doc/source/index.rst b/doc/source/index.rst index 4fd6b96e1..a65e995cf 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -34,7 +34,7 @@ Table of Contents quickstart user_guide/_user_guide - tutorials + tutorials/_tutorials developer_guide/_developer_guide glossary references diff --git a/doc/source/tutorials.rst b/doc/source/tutorials.rst deleted file mode 100644 index 48020555e..000000000 --- a/doc/source/tutorials.rst +++ /dev/null @@ -1,4 +0,0 @@ -.. _tutorials: - -Tutorials -========= diff --git a/doc/source/tutorials/_tutorials.rst b/doc/source/tutorials/_tutorials.rst new file mode 100644 index 000000000..6c1bca6c9 --- /dev/null +++ b/doc/source/tutorials/_tutorials.rst @@ -0,0 +1,12 @@ +.. _tutorials: + +Tutorials +========= + +.. toctree:: + :maxdepth: 2 + + fdlf + tutorial_2 + tutorial_3 + tutorial_4 \ No newline at end of file diff --git a/doc/source/tutorials/fdlf.rst b/doc/source/tutorials/fdlf.rst new file mode 100644 index 000000000..2ae8a9acf --- /dev/null +++ b/doc/source/tutorials/fdlf.rst @@ -0,0 +1,341 @@ +.. _fdlf: + +----------------------------- +Fully Developed Laminar Flow +----------------------------- + +In this tutorial we will be building a case that involves incompressible laminar flow in a channel with a constant heat flux applied. +This case uses air as a working fluid and will be simulated using fully dimensional quantities. +A diagram of the case is provided in :numref:`fig:setup` and the necessary case parameters are provided in :numref:`tab:setup`. +Note that round numbers have been selected for the fluid properties and simulation parameters for the sake of simplicity. + +.. _fig:setup: + +.. figure:: ../_static/img/tutorials/fdlf/setup.png + :align: center + :figclass: align-center + :alt: flow diagram + + Diagram describing the case setup for fully developed laminar flow in a channel.. + +.. _tab:setup: + +.. csv-table:: Fluid properties and simulation parameters + :align: center + :header: "Parameter name","variable","value" + :widths: 15, 15, 15 + + "channel height",":math:`H`","1 cm" + "channel length",":math:`L`","20 cm" + "mean velocity",":math:`U_m`","0.5 m/s" + "heat flux",":math:`q''`","300 W/m\ :sup:`2`" + "inlet temperature",":math:`T_{in}`","10 C" + "density",":math:`\rho`","1.2 kg/m\ :sup:`3`" + "viscosity",":math:`\mu`","0.00002 kg/m-s" + "thermal conductivity",":math:`\lambda`","0.025 W/m-K" + "specific heat",":math:`c_p`","1000 J/kg-K" + +This case has analytic solutions to the momentum and energy equations which makes it easy to confirm if the problem is setup correctly. +These expressions will be used to test the accuracy of the solution. + +.. math:: + :label: fdlf_vel + + u(y) = \frac{3}{2} U_m \left( 1 - 4\left(\frac{y}{H}\right)^2\right) + +.. math:: + :label: fdlf_temp + + T(x,y)-T_b(x) = \frac{q'' H}{2\lambda}\left( 3\left(\frac{y}{H}\right)^2 - 2\left(\frac{y}{H}\right)^4-\frac{39}{280}\right) + +where the bulk temperature is given by the expression + +.. math:: + + T_b(x) = \left(\frac{2q''}{U_m \rho c_p H}\right)x + T_{in} + +.. Additionally, we will extract the predicted Darcy friction factor and Nusselt number from the simulation and confirm that they match the expected values. + +.. .. math:: + + f = \frac{96}{Re} + +.. .. math:: + + Nu = \frac{140}{17} + +........................ +Before You Begin +........................ + +This tutorial assumes that you have installed *Nek5000* in your home directory and have setup your :ref:`execution PATH`. +Before running the case, you will need to compile the tools ``genbox`` and ``genmap``. +These can be compiled using the following command in the ``$HOME/Nek5000/tools`` directory: + +.. code-block:: console + + $ ./maketools genbox + $ ./maketools genmap + +Before building the case, the user should set up a case subdirectory in their run directory. + +.. code-block:: console + + $ cd $HOME/Nek5000/run + $ mkdir fdlf + $ cd fdlf + +........................ +Mesh Generation +........................ + +This tutorial uses a simple rectangular box mesh generated by ``genbox``. +To create the input file, copy the following script and save the file as ``fdlf.box``. + +.. literalinclude:: ../../../examples/fdlf/fdlf.box + :language: none + +For this mesh we are specifying 50 uniform elements in the stream-wise (:math:`x`) direction and 5 uniform elements in the span-wise (:math:`y`) direction. +The velocity boundary conditions in the x-direction are a standard Dirichlet velocity boundary condition at :math:`x_{min}` and an open boundary condition with zero pressure at :math:`x_{max}`. +The velocity boundary conditions in the y-direction are a symmetric boundary at :math:`y_{min}` and a wall with no slip condition at :math:`y_{max}`.. +The temperature boundary conditions in the x-direction are a standard Dirichlet boundary condition at :math:`x_{min}` and an outflow condition with zero gradient at :math:`x_{max}`. +The temperature boundary conditions in the y-direction are an insulated condition with zero gradient at :math:`y_{min}` and a constant heat flux at :math:`y_{max}`. +Note that the boundary conditions specified with lower case letters must have values assigned in userbc, which will be shown later in this tutorial. +Now we can run ``genbox`` with + +.. code-block:: console + + $ genbox + +When prompted provide the input file name, which for this case is ``fdlf.box``. The tool will produce binary mesh and boundary data file ``box.re2`` which should be renamed to ``fdlf.re2``. + +Once we have the mesh file, we need to run the domain partitioning tool, ``genmap``. + +.. code-block:: console + + $ genmap + +On input specify ``fdlf`` as your casename and press enter to use the default tolerance. +This step will produce ``fdlf.ma2`` which contains the element partitioning information. +You do not have to specify the number of MPI-ranks you plan to run the case with when you use ``genmap``, as it contains the partitioning for all possible choices. + +:tip: + If either ``genbox`` or ``genmap`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see :ref:`here`. + +........................ +Control parameters +........................ + +The control parameters for any case are given in the ``.par`` file. For this case, create a new file called ``fdlf.par`` with the following: + +.. literalinclude:: ../../../examples/fdlf/fdlf.par + +For this case the properties evaluated are for air at ~20 C. +Note that ``rhoCp`` is the product of density and specific heat. +The ``userParam`` list represents an easy way of passing data to *Nek5000* that can later be used throughout the ``.usr`` file. +Additionally, like all values specified in the ``.par`` file, they can be changed without the need to recompile *Nek5000*. + +The required values for the initial and boundary conditions specified by lower case letters in the ``.box`` file are defined here as a list of user given parameters, as well as the height of the channel. +These initial and boundary conditions will later be called in respective subroutines of the ``.usr`` file. + +.............................. +User Routines File (.usr) +.............................. + +The user file implements various subroutines to allow the user to interact with the solver. +Note that only the subroutines that need to be edited to run this case will be discussed. +The remaining routines can be left as is. +For more information on the ``.usr`` file and the available subroutines see :ref:`here `. + +To get started we copy the template to our case directory + +.. code-block:: console + + $ cp $HOME/Nek5000/core/zero.usr fdlf.usr + + +Boundary and initial conditions +_______________________________ + +The boundary conditions can be setup in subroutine ``userbc`` as shown below, where the highlighted lines indicate where the actual boundary condition is specified. +The velocity and temperature are set to the analytic profiles given by Eqs. :eq:`fdlf_vel` and :eq:`fdlf_temp` and the heat flux is set to a constant value. + +.. .. literalinclude:: ../../../examples/fdlf/fdlf.usr +.. :language: fortran +.. :lines: 69-97 +.. :emphasize-lines: 22,25,26 + +The channel height, mean velocity, heat flux, and mean inlet temperature are all called from the list of user defined parameters in the ``.par`` file. +The thermal conductivity is set from the :ref:`field coefficient array`, which is set from the conductivity specified for the temperature field in the ``.par`` file. + +The next step is to specify the initial conditions. +This can be done in the subroutine ``useric`` as shown. +Again, the actual inlet condition is specified with the highlighted lines. + +.. .. literalinclude:: ../../../examples/fdlf/fdlf.usr +.. :language: fortran +.. :lines: 99-117 +.. :emphasize-lines: 13,16 + +As with ``userbc``, the inlet temperature and mean velocity are set from the list of user defined parameters in the ``.par`` file. + +.. ........................ +.. userchk +.. ........................ +.. +.. The subroutine ``userchk`` is a general purpose function that is executed before the time stepper and after each time step. The following should be copied to this subroutine +.. +.. .. code-block:: fortran +.. +.. subroutine userchk() +.. +.. implicit none +.. +.. include 'SIZE' +.. include 'TOTAL' +.. +.. real bc_average,glsc3,glsc2 +.. real Dh,um,qpp,Tin,rho,mu,con,L,Pin,Pout,darcy,Re,derror +.. real Tbulk,Twall,HTC,Nuss,Nerror +.. +.. integer n +.. +.. n=lx1*ly1*lz1*nelv +.. +.. Dh = uparam(1)*2.0 !hydraulic diameter +.. um = uparam(2) !mean velocity +.. qpp = uparam(3) !heat flux +.. rho = cpfld(1,2) !density +.. mu = cpfld(1,1) !viscosity +.. con = cpfld(2,1) !conductivity +.. +.. c Evaluate friction factor +.. L = 0.2 +.. Pin = bc_average(pr,'v ',1) +.. Pout = bc_average(pr,'O ',1) +.. darcy = -2.*Dh*(Pout-Pin)/(L*rho*um*um) +.. Re = rho*um*Dh/mu +.. derror = abs(1.-darcy*Re/96.) +.. +.. c Evaluate Nusselt number +.. Tbulk = glsc3(t,vx,bm1,n)/glsc2(vx,bm1,n) +.. Twall = bc_average(t,'f ',2) +.. HTC = qpp/(Twall-Tbulk) +.. Nuss = HTC*Dh/con +.. Nerror = abs(1.-Nuss*17./140.) +.. +.. c Print to logfile +.. if(nio.eq.0) then +.. write(*,*) "Friction factor = ",darcy,derror +.. write(*,*) "Nusselt = ",Nuss,Nerror +.. write(*,*) +.. endif +.. +.. A custom function is called to evaluate the inlet pressure, outlet pressure, and the wall temperature. Built in routines for array multiplication are used to evaluate the bulk temperature. The Nusselt number and Darcy friction factor are evaluated and printed to the logfile along with their associated errors. + +........................ +SIZE file +........................ + +It is recommended to copy a template of the ``SIZE`` file from the core directory and rename it ``SIZE`` in the working directory: + +.. code-block:: console + + $ cp $HOME/Nek5000/core/SIZE.template SIZE + +Then, in the BASIC section, adjust the domain dimension (``ldim``) and the max number of global elements (``lelg``). + +.. literalinclude:: ../../../examples/fdlf/SIZE + :language: fortran + :lines: 11-20 + :emphasize-lines: 2,7 + +For this tutorial we have set our polynomial order to be :math:`N=7` which is defined in the ``SIZE`` file as ``lx1=8`` which indicates that there are 8 points in each spatial dimension of every element. The number of dimensions is specified using ``ldim`` and the number of global elements used is specified using ``lelg``. + +........................ +Compilation +........................ + +You should now be all set to compile and run your case! +As a final check, you should have the following files: + + .. * :download:`fdlf.usr ` + .. * :download:`fdlf.par ` + .. * :download:`fdlf.re2 ` + .. * :download:`fdlf.ma2 ` + .. * :download:`SIZE ` + +If for some reason you encountered an insurmountable error and were unable to generate any of the required files, you may use the provided links to download them. +After confirming that you have all five, you are now ready to compile + +.. code-block:: console + + $ makenek fdlf + +If the compilation is successful, the executable ``nek5000`` will be generated. + +........................ +Running the case +........................ + +Now you can run the case + +.. code-block:: console + + $ nekbmpi fdlf 4 + +To launch an MPI jobs on your local machine using 4 ranks. The output will be redirected to ``logfile``. + +............................ +Post-processing the results +............................ + +Once execution is completed your directory should now contain 5 checkpoint files that look like this: + +.. code-block:: none + + fdlf0.f00001 + fdlf0.f00002 + ... + +The preferred mode for data visualization and analysis with *Nek5000* is to use Visit/ParaView. One can use the script *visnek*, to be found in ``/scripts``. It is sufficient to run: + +.. code-block:: console + + $ visnek fdlf + +to obtain a file named ``fdlf.nek5000`` which can be recognized in Visit/ParaView. In the viewing window one can visualize the flow-field as depicted in :numref:`fig:velocity_paraview` as well as the temperature profile as depicted in :numref:`fig:temperature_paraview` below. + +.. _fig:velocity_paraview: + +.. figure:: ../_static/img/tutorials/fdlf/velocity_paraview.png + :align: center + :figclass: align-center + + Steady-State flow field visualized in Visit/ParaView. Colors represent velocity magnitude. + +.. _fig:temperature_paraview: + +.. figure:: ../_static/img/tutorials/fdlf/temp.png + :align: center + :figclass: align-center + + Temperature profile visualized in Visit/ParaView. + +Plots of the velocity and temperature varying along the y-axis as evaluated by *Nek5000* compared to the analytic solutions provided by Eqs. :eq:`fdlf_vel` and :eq:`fdlf_temp` respectively are shown below in :numref:`fig:velocity_lineplot` and :numref:`fig:temperature_lineplot`. + +.. _fig:velocity_lineplot: + +.. figure:: ../_static/img/tutorials/fdlf/velocity_lineplot.png + :align: center + :figclass: align-center + + *Nek5000* velocity solutions plotted against analytical solutions. + +.. _fig:temperature_lineplot: + +.. figure:: ../_static/img/tutorials/fdlf/temperature_lineplot.png + :align: center + :figclass: align-center + + *Nek5000* temperature solutions plotted against analytical solutions. diff --git a/doc/source/tutorials/tutorial_2.rst b/doc/source/tutorials/tutorial_2.rst new file mode 100644 index 000000000..d5297a3c7 --- /dev/null +++ b/doc/source/tutorials/tutorial_2.rst @@ -0,0 +1,4 @@ +.. _tutorial_2: + +Tutorial 2 +========== \ No newline at end of file diff --git a/doc/source/tutorials/tutorial_3.rst b/doc/source/tutorials/tutorial_3.rst new file mode 100644 index 000000000..cf8cc8094 --- /dev/null +++ b/doc/source/tutorials/tutorial_3.rst @@ -0,0 +1,4 @@ +.. _tutorial_3: + +Tutorial 3 +========== \ No newline at end of file diff --git a/doc/source/tutorials/tutorial_4.rst b/doc/source/tutorials/tutorial_4.rst new file mode 100644 index 000000000..43d39ec4e --- /dev/null +++ b/doc/source/tutorials/tutorial_4.rst @@ -0,0 +1,4 @@ +.. _tutorial_4: + +Tutorial 4 +========== \ No newline at end of file From 36d6445d5dd08c2bb8a600be31bb1d1278055e77 Mon Sep 17 00:00:00 2001 From: Jez Swann Date: Fri, 19 Jul 2024 09:42:06 +0100 Subject: [PATCH 2/6] continuing fdlf tutorial (cherry picked from commit c502cca89cfdf02702ab26e8fc7f20ed350f0c01) --- doc/source/tutorials/_tutorials.rst | 9 ++- doc/source/tutorials/fdlf.rst | 89 +++++++++++++---------------- 2 files changed, 47 insertions(+), 51 deletions(-) diff --git a/doc/source/tutorials/_tutorials.rst b/doc/source/tutorials/_tutorials.rst index 6c1bca6c9..9a5170129 100644 --- a/doc/source/tutorials/_tutorials.rst +++ b/doc/source/tutorials/_tutorials.rst @@ -3,8 +3,15 @@ Tutorials ========= +The following tutorials are provided to familiarize beginners with the features +and typical workflow of NekRS. For a user brand new to NekRS, we strongly +recommend beginning with the fully developed laminar flow tutorial. + +N.B. Some of these tutorials have been adapted from those in the Nek5000 +documentation (https://nek5000.github.io/NekDoc/tutorials.html) + .. toctree:: - :maxdepth: 2 + :maxdepth: 1 fdlf tutorial_2 diff --git a/doc/source/tutorials/fdlf.rst b/doc/source/tutorials/fdlf.rst index 2ae8a9acf..d948e1374 100644 --- a/doc/source/tutorials/fdlf.rst +++ b/doc/source/tutorials/fdlf.rst @@ -1,8 +1,7 @@ .. _fdlf: ------------------------------ Fully Developed Laminar Flow ------------------------------ +============================ In this tutorial we will be building a case that involves incompressible laminar flow in a channel with a constant heat flux applied. This case uses air as a working fluid and will be simulated using fully dimensional quantities. @@ -15,6 +14,7 @@ Note that round numbers have been selected for the fluid properties and simulati :align: center :figclass: align-center :alt: flow diagram + :width: 500 Diagram describing the case setup for fully developed laminar flow in a channel.. @@ -64,30 +64,21 @@ where the bulk temperature is given by the expression Nu = \frac{140}{17} -........................ Before You Begin -........................ +________________ -This tutorial assumes that you have installed *Nek5000* in your home directory and have setup your :ref:`execution PATH`. -Before running the case, you will need to compile the tools ``genbox`` and ``genmap``. -These can be compiled using the following command in the ``$HOME/Nek5000/tools`` directory: +This tutorial assumes that you have installed *NekRS* in your home directory and +have setup your :ref:`execution PATH`. You can either follow the example +with the files in the fdlf directory within examples directory of nekRS, or create +it within a directory of your choice. -.. code-block:: console - - $ ./maketools genbox - $ ./maketools genmap - -Before building the case, the user should set up a case subdirectory in their run directory. - -.. code-block:: console +If you have chosen to create the example as following along, for the initial +mesh generation, you will need to compile the tools ``genbox`` and ``genmap`` +from *Nek5000*. Please follow the instructions in the +:ref:`Building the Nek5000 Tool Scripts ` section. - $ cd $HOME/Nek5000/run - $ mkdir fdlf - $ cd fdlf - -........................ Mesh Generation -........................ +_______________ This tutorial uses a simple rectangular box mesh generated by ``genbox``. To create the input file, copy the following script and save the file as ``fdlf.box``. @@ -109,22 +100,21 @@ Now we can run ``genbox`` with When prompted provide the input file name, which for this case is ``fdlf.box``. The tool will produce binary mesh and boundary data file ``box.re2`` which should be renamed to ``fdlf.re2``. -Once we have the mesh file, we need to run the domain partitioning tool, ``genmap``. +.. Once we have the mesh file, we need to run the domain partitioning tool, ``genmap``. -.. code-block:: console +.. .. code-block:: console - $ genmap +.. $ genmap -On input specify ``fdlf`` as your casename and press enter to use the default tolerance. -This step will produce ``fdlf.ma2`` which contains the element partitioning information. -You do not have to specify the number of MPI-ranks you plan to run the case with when you use ``genmap``, as it contains the partitioning for all possible choices. +.. On input specify ``fdlf`` as your casename and press enter to use the default tolerance. +.. This step will produce ``fdlf.ma2`` which contains the element partitioning information. +.. You do not have to specify the number of MPI-ranks you plan to run the case with when you use ``genmap``, as it contains the partitioning for all possible choices. -:tip: - If either ``genbox`` or ``genmap`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see :ref:`here`. +.. :tip: If either ``genbox`` or ``genmap`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see :ref:`here`. +:tip: If ``genbox`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see `here `_. -........................ Control parameters -........................ +__________________ The control parameters for any case are given in the ``.par`` file. For this case, create a new file called ``fdlf.par`` with the following: @@ -132,20 +122,22 @@ The control parameters for any case are given in the ``.par`` file. For this cas For this case the properties evaluated are for air at ~20 C. Note that ``rhoCp`` is the product of density and specific heat. -The ``userParam`` list represents an easy way of passing data to *Nek5000* that can later be used throughout the ``.usr`` file. -Additionally, like all values specified in the ``.par`` file, they can be changed without the need to recompile *Nek5000*. +The ``CASEDATA`` list represents an easy way of passing data to *NekRS* that +can later be used throughout the ``.udf`` file. Additionally, like all values +specified in the ``.par`` file, they can be changed without the need to recompile *NekRS*. -The required values for the initial and boundary conditions specified by lower case letters in the ``.box`` file are defined here as a list of user given parameters, as well as the height of the channel. -These initial and boundary conditions will later be called in respective subroutines of the ``.usr`` file. +The required values for the initial and boundary conditions specified by lower +case letters in the ``.box`` file are defined here as a list of user given +parameters, as well as the height of the channel. These initial and boundary +conditions will later be called in respective subroutines of the ``.udf`` file. -.............................. -User Routines File (.usr) -.............................. +User-Defined Host Functions File (.udf) +_________________________ -The user file implements various subroutines to allow the user to interact with the solver. +The user-defined host functions file implements various subroutines to allow the user to interact with the solver. Note that only the subroutines that need to be edited to run this case will be discussed. The remaining routines can be left as is. -For more information on the ``.usr`` file and the available subroutines see :ref:`here `. +For more information on the ``.udf`` file and the available subroutines see :ref:`here `. To get started we copy the template to our case directory @@ -155,12 +147,12 @@ To get started we copy the template to our case directory Boundary and initial conditions -_______________________________ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The boundary conditions can be setup in subroutine ``userbc`` as shown below, where the highlighted lines indicate where the actual boundary condition is specified. The velocity and temperature are set to the analytic profiles given by Eqs. :eq:`fdlf_vel` and :eq:`fdlf_temp` and the heat flux is set to a constant value. -.. .. literalinclude:: ../../../examples/fdlf/fdlf.usr +.. .. literalinclude:: ../../../examples/fdlf/fdlf.udf .. :language: fortran .. :lines: 69-97 .. :emphasize-lines: 22,25,26 @@ -233,9 +225,8 @@ As with ``userbc``, the inlet temperature and mean velocity are set from the lis .. .. A custom function is called to evaluate the inlet pressure, outlet pressure, and the wall temperature. Built in routines for array multiplication are used to evaluate the bulk temperature. The Nusselt number and Darcy friction factor are evaluated and printed to the logfile along with their associated errors. -........................ SIZE file -........................ +_________ It is recommended to copy a template of the ``SIZE`` file from the core directory and rename it ``SIZE`` in the working directory: @@ -252,9 +243,9 @@ Then, in the BASIC section, adjust the domain dimension (``ldim``) and the max n For this tutorial we have set our polynomial order to be :math:`N=7` which is defined in the ``SIZE`` file as ``lx1=8`` which indicates that there are 8 points in each spatial dimension of every element. The number of dimensions is specified using ``ldim`` and the number of global elements used is specified using ``lelg``. -........................ + Compilation -........................ +___________ You should now be all set to compile and run your case! As a final check, you should have the following files: @@ -274,9 +265,8 @@ After confirming that you have all five, you are now ready to compile If the compilation is successful, the executable ``nek5000`` will be generated. -........................ Running the case -........................ +________________ Now you can run the case @@ -286,9 +276,8 @@ Now you can run the case To launch an MPI jobs on your local machine using 4 ranks. The output will be redirected to ``logfile``. -............................ Post-processing the results -............................ +___________________________ Once execution is completed your directory should now contain 5 checkpoint files that look like this: From c3e9c379695eeb721dda521b333319d333abbc2f Mon Sep 17 00:00:00 2001 From: Jez Swann Date: Fri, 19 Jul 2024 11:04:06 +0100 Subject: [PATCH 3/6] Added fdlf example files to tutorial. (cherry picked from commit 35074729affbb61c3f3f353dbf44887e735565f5) --- examples/fdlf/SIZE | 42 ++++++++++ examples/fdlf/fdlf.box | 14 ++++ examples/fdlf/fdlf.oudf | 20 +++++ examples/fdlf/fdlf.par | 28 +++++++ examples/fdlf/fdlf.re2 | Bin 0 -> 128188 bytes examples/fdlf/fdlf.udf | 177 ++++++++++++++++++++++++++++++++++++++++ examples/fdlf/fdlf.usr | 63 ++++++++++++++ 7 files changed, 344 insertions(+) create mode 100644 examples/fdlf/SIZE create mode 100644 examples/fdlf/fdlf.box create mode 100644 examples/fdlf/fdlf.oudf create mode 100644 examples/fdlf/fdlf.par create mode 100644 examples/fdlf/fdlf.re2 create mode 100644 examples/fdlf/fdlf.udf create mode 100644 examples/fdlf/fdlf.usr diff --git a/examples/fdlf/SIZE b/examples/fdlf/SIZE new file mode 100644 index 000000000..a277021de --- /dev/null +++ b/examples/fdlf/SIZE @@ -0,0 +1,42 @@ +c +c Include file to dimension static arrays +c and to set some hardwired run-time parameters +c + integer ldim,lx1,lxd,lx2,lx1m,lelg,lelt,lpmin,ldimt + integer lpelt,lbelt,toteq,lcvelt + integer lelx,lely,lelz,mxprev,lgmres,lorder,lhis + integer maxobj,lpert,nsessmax,lxo + integer lfdm,ldimt_proj,lelr + + ! BASIC + parameter (ldim=2) ! domain dimension (2 or 3) + parameter (lx1=8) ! GLL points per element along each direction + parameter (lxd=12) ! GL points for over-integration (dealiasing) + parameter (lx2=lx1-0) ! GLL points for pressure (lx1 or lx1-2) + + parameter (lelg=250) ! max number of global elements + parameter (lpmin=1) ! min number of MPI ranks + parameter (lelt=lelg/lpmin + 3) ! max number of local elements per MPI rank + parameter (ldimt=1) ! max auxiliary fields (temperature + scalars) + + ! OPTIONAL + parameter (ldimt_proj=1) ! max auxiliary fields residual projection + parameter (lelr=lelt) ! max number of local elements per restart file + parameter (lhis=1) ! max history/monitoring points + parameter (maxobj=1) ! max number of objects + parameter (lpert=1) ! max number of perturbations + parameter (nsessmax=1) ! max sessions to NEKNEK + parameter (lxo=lx1) ! max GLL points on output (lxo>=lx1) + parameter (mxprev=20) ! max dim of projection space + parameter (lgmres=30) ! max dim Krylov space + parameter (lorder=3) ! max order in time + parameter (lx1m=1) ! GLL points mesh solver + parameter (lfdm=0) ! unused + parameter (lelx=1,lely=1,lelz=1) ! global tensor mesh dimensions + + parameter (lbelt=1) ! lelt for mhd + parameter (lpelt=1) ! lelt for linear stability + parameter (lcvelt=1) ! lelt for cvode + + ! INTERNALS + include 'SIZE.inc' diff --git a/examples/fdlf/fdlf.box b/examples/fdlf/fdlf.box new file mode 100644 index 000000000..0d69e44a9 --- /dev/null +++ b/examples/fdlf/fdlf.box @@ -0,0 +1,14 @@ +-3 spatial dimension (will create box.re2) +2 number of fields +# +# comments: periodic laminar flow +# +#======================================================== +# +Box fdlf +-50 -5 -1 Nelx Nely +0.0 0.2 1.0 x0 x1 ratio +0.0 0.005 0.7 y0 y1 ratio +0.0 1.0 1.0 z0 z1 ratio +v ,O ,SYM,W ,P ,P Velocity BC's: (cbx0, cbx1, cby0, cby1) +t ,O ,I ,f ,P ,P Temperature BC's: (cbx0, cbx1, cby0, cby1) \ No newline at end of file diff --git a/examples/fdlf/fdlf.oudf b/examples/fdlf/fdlf.oudf new file mode 100644 index 000000000..ec79b1d25 --- /dev/null +++ b/examples/fdlf/fdlf.oudf @@ -0,0 +1,20 @@ +void velocityDirichletConditions(bcData *bc) +{ + bc->u = 0.0; // x-velocity + bc->v = 0.0; // y-velocity +// um*3./2.*(1-4.*(y/H)**2) + bc->w = 0.5; // z-velocity +} + +void scalarDirichletConditions(bcData *bc) +{ + const dfloat H = 0.01; + const dfloat Tin = 10; + const dfloat term = 300*H/(2*0.025); + bc->s = term*(3.*((bc->y/H)*(bc->y/H))-2.*((bc->y/H)*(bc->y/H)*(bc->y/H)*(bc->y/H))-39./280.)+Tin; // temperature +} + +void scalarNeumannConditions(bcData *bc) +{ + bc->flux = 300; // heat flux +} \ No newline at end of file diff --git a/examples/fdlf/fdlf.par b/examples/fdlf/fdlf.par new file mode 100644 index 000000000..881deb9f1 --- /dev/null +++ b/examples/fdlf/fdlf.par @@ -0,0 +1,28 @@ +# +# nek parameter file +# +[GENERAL] +polynomialOrder = 7 +cubaturePolynomialOrder = 11 +dt = 1.0e-4 +numsteps = 10000 +writeInterval = 2000 + +[PRESSURE] +residualTol = 1e-4 + +[VELOCITY] +density = 1.2 #kg/m3 +viscosity = 0.00002 #kg/m-s +#boundaryTypeMap = v ,o ,sym,w ,sym,sym + +[TEMPERATURE] +rhoCp = 1200.0 #J/m3-K +conductivity = 0.025 #W/m-K +#boundaryTypeMap = t ,o ,i ,f ,p ,p + +[CASEDATA] +height = 0.01 +Umean = 0.5 +Tflux = 300.0 +Tin = 10.0 \ No newline at end of file diff --git a/examples/fdlf/fdlf.re2 b/examples/fdlf/fdlf.re2 new file mode 100644 index 0000000000000000000000000000000000000000..d6f08f7ab4de7bc98dc85e4f2aa265f9aec2a4ef GIT binary patch literal 128188 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 o_Uexact, o_Texact; + +#ifdef __okl__ + +@kernel void computeUexact(const dlong Ntotal, + @ restrict const dfloat *y, + @ restrict dfloat *U) +{ + for (dlong n = 0; n < Ntotal; ++n; @tile(p_blockSize, @outer, @inner)) { + if (n < Ntotal) { + const dfloat yhat = y[n] / p_height; + const dfloat yhat2 = yhat * yhat; + U[n] = p_umean * 1.5 * (1.0 - 4.0*yhat2); + } + } +} + +@kernel void computeTexact(const dlong Ntotal, + @ restrict const dfloat *x, + @ restrict const dfloat *y, + @ restrict dfloat *T) +{ + for (dlong n = 0; n < Ntotal; ++n; @tile(p_blockSize, @outer, @inner)) { + if (n < Ntotal) { + const dfloat xn = x[n]; + const dfloat yn = y[n]; + const dfloat yhat = yn / p_height; + const dfloat yhat2 = yhat * yhat; + const dfloat yhat4 = yhat2 * yhat2; + + const dfloat Tbulk = 2.0*p_tflux / (p_umean*p_rhocp*p_height) * xn + p_tin; + + const dfloat tmp = p_tflux*p_height/(2.0*p_cond); + T[n] = Tbulk + tmp * (3.0*yhat2 - 2.0*yhat4 - 39.0/280.0); + } + } +} + +void velocityDirichletConditions(bcData *bc) +{ + const dfloat yhat = bc->y / p_height; + const dfloat yhat2 = yhat * yhat; + bc->u = p_umean * 1.5 * (1.0 - 4.0*yhat2); + bc->v = 0.0; + bc->w = 0.0; +} + +void scalarDirichletConditions(bcData *bc) +{ + const dfloat yhat = bc->y / p_height; + const dfloat yhat2 = yhat * yhat; + const dfloat yhat4 = yhat2* yhat2; + bc->s = p_tscale*(3.0*yhat2 - 2.0*yhat4 - 39.0/280.0) + p_tin; +} + +void scalarNeumannConditions(bcData *bc) +{ + bc->flux = p_tflux; +} + +#endif + +void UDF_LoadKernels(deviceKernelProperties& kernelInfo) +{ + setupAide& options = platform->options; + + dfloat rhocp, cond; + options.getArgs("SCALAR00 DENSITY", rhocp); + options.getArgs("SCALAR00 DIFFUSIVITY", cond); + + kernelInfo.define("p_height") = P_HEIGHT; + kernelInfo.define("p_umean") = P_UMEAN; + kernelInfo.define("p_tflux") = P_TFLUX; + kernelInfo.define("p_tin") = P_TIN; + kernelInfo.define("p_tscale") = P_TFLUX * P_HEIGHT / (2.0*cond); + kernelInfo.define("p_rhocp") = rhocp; + kernelInfo.define("p_cond") = cond; +} + +void UDF_Setup0(MPI_Comm comm, setupAide &options) +{ + platform->par->extract("casedata", "height", P_HEIGHT); + platform->par->extract("casedata", "umean", P_UMEAN); + platform->par->extract("casedata", "tflux", P_TFLUX); + platform->par->extract("casedata", "tin", P_TIN); +} + +void UDF_Setup() +{ + auto mesh = nrs->meshV; + + // adjust mesh + { + auto rescale = [&](dfloat newMin, dfloat newMax, dfloat *x) + { + auto min = std::numeric_limits::max(); + auto max = std::numeric_limits::lowest(); + for(int i = 0; i < mesh->Nlocal ; i++) { + min = std::min(min, x[i]); + max = std::max(max, x[i]); + } + MPI_Allreduce(MPI_IN_PLACE, &min, 1, MPI_DFLOAT, MPI_MIN, platform->comm.mpiComm); + MPI_Allreduce(MPI_IN_PLACE, &max, 1, MPI_DFLOAT, MPI_MAX, platform->comm.mpiComm); + const auto scale = (newMax - newMin)/(max - min); + + for(int i = 0; i < mesh->Nlocal ; i++) { + x[i] = newMin + scale*(x[i] - min); + } + }; + rescale(0.0, P_HEIGHT/2.0, mesh->y); + rescale(0.0, P_HEIGHT/2.0, mesh->z); + } + + // set IC + dfloat rhocp, cond; + platform->options.getArgs("SCALAR00 DENSITY", rhocp); + platform->options.getArgs("SCALAR00 DIFFUSIVITY", cond); + if (platform->options.getArgs("RESTART FILE NAME").empty()) { + for (int n = 0; n < mesh->Nlocal; n++) { + const auto x = mesh->x[n]; + const auto y = mesh->y[n]; + const auto z = mesh->z[n]; + + const dfloat yhat2 = pow(y/P_HEIGHT,2); + const dfloat yhat4 = pow(yhat2,2); + nrs->U[n + 0 * nrs->fieldOffset] = P_UMEAN; + nrs->U[n + 1 * nrs->fieldOffset] = 0.0; + nrs->U[n + 2 * nrs->fieldOffset] = 0.0; + + nrs->cds->S[n + 0 * nrs->cds->fieldOffset[0]] = P_TIN; + } + } + +} + +void UDF_ExecuteStep(double time, int tstep) +{ + auto mesh = nrs->meshV; +/* + if (nrs->isCheckpointStep) { + nek::ocopyToNek(time, tstep); + nek::userchk(); + } +*/ + + // dump exact sol. + if (tstep==0) { + o_Uexact.resize(mesh->Nlocal); + o_Texact.resize(mesh->Nlocal); + computeUexact(mesh->Nlocal, mesh->o_y, o_Uexact); + computeTexact(mesh->Nlocal, mesh->o_x, mesh->o_y, o_Texact); + + std::vector o_fldList; + o_fldList.push_back(o_Uexact); + o_fldList.push_back(o_Texact); + fld::write("ref", time, tstep, o_fldList, true, false, 0, false); + } + + if (tstep % 100 == 0) { + + auto o_ux = nrs->o_U.slice(0 * nrs->fieldOffset, nrs->fieldOffset); + auto o_t = nrs->cds->o_S.slice(0 * nrs->cds->fieldOffset[0], nrs->cds->fieldOffset[0]); + auto o_err = platform->o_memPool.reserve(mesh->Nlocal); + + platform->linAlg->axpbyz(mesh->Nlocal, 1.0, o_Uexact, -1.0, o_ux, o_err); + auto Uerr = platform->linAlg->amax(mesh->Nlocal, o_err, platform->comm.mpiComm); + + platform->linAlg->axpbyz(mesh->Nlocal, 1.0, o_Texact, -1.0, o_t, o_err); + auto Terr = platform->linAlg->amax(mesh->Nlocal, o_err, platform->comm.mpiComm); + + if (platform->comm.mpiRank == 0) { + printf("LinfErr: %d %2.2e %2.4e %2.4e\n",tstep, time, Uerr, Terr); + } + } +} diff --git a/examples/fdlf/fdlf.usr b/examples/fdlf/fdlf.usr new file mode 100644 index 000000000..c7d446e06 --- /dev/null +++ b/examples/fdlf/fdlf.usr @@ -0,0 +1,63 @@ +C +C USER SPECIFIED ROUTINES: +C +C - boundary conditions +C - initial conditions +C - variable properties +C - forcing function for fluid (f) +C - forcing function for passive scalar (q) +C - general purpose routine for checking errors etc. +C +c----------------------------------------------------------------------- + subroutine useric (ix,iy,iz,ieg) + include 'SIZE' + include 'TOTAL' + include 'NEKUSE' + + return + end +c----------------------------------------------------------------------- + subroutine userchk + include 'SIZE' + include 'TOTAL' + + return + end +c----------------------------------------------------------------------- + subroutine usrdat ! This routine to modify element vertices + include 'SIZE' ! _before_ mesh is generated, which + include 'TOTAL' ! guarantees GLL mapping of mesh. + + return + end +c----------------------------------------------------------------------- + subroutine usrdat2() ! This routine to modify mesh coordinates + include 'SIZE' + include 'TOTAL' + + return + end +c----------------------------------------------------------------------- + subroutine usrsetvert(glo_num,nel,nx,ny,nz) ! to modify glo_num + integer*8 glo_num(1) + + ! kludge for periodic bc in z + nxy = nx*ny + nxyz = nx*ny*nz + do iel = 1,nel + ioff = nxyz*(iel-1) + do ixy = 1,nxy + glo_num(ioff + nxy*(nz-1) + ixy) = glo_num(ioff + ixy) + enddo + enddo + + return + end +c----------------------------------------------------------------------- + subroutine usrdat3 + include 'SIZE' + include 'TOTAL' + + return + end +C----------------------------------------------------------------------- From dfc17b6d58364c3c86dabf7396ebf685d3482381 Mon Sep 17 00:00:00 2001 From: Jez Swann Date: Mon, 22 Jul 2024 11:24:19 +0100 Subject: [PATCH 4/6] tidying fdlf files (cherry picked from commit ce0548ffa9c62f0f6511a84499e6bf3bbf869706) --- examples/fdlf/SIZE | 42 ------------------------------------------ examples/fdlf/fdlf.par | 2 -- 2 files changed, 44 deletions(-) delete mode 100644 examples/fdlf/SIZE diff --git a/examples/fdlf/SIZE b/examples/fdlf/SIZE deleted file mode 100644 index a277021de..000000000 --- a/examples/fdlf/SIZE +++ /dev/null @@ -1,42 +0,0 @@ -c -c Include file to dimension static arrays -c and to set some hardwired run-time parameters -c - integer ldim,lx1,lxd,lx2,lx1m,lelg,lelt,lpmin,ldimt - integer lpelt,lbelt,toteq,lcvelt - integer lelx,lely,lelz,mxprev,lgmres,lorder,lhis - integer maxobj,lpert,nsessmax,lxo - integer lfdm,ldimt_proj,lelr - - ! BASIC - parameter (ldim=2) ! domain dimension (2 or 3) - parameter (lx1=8) ! GLL points per element along each direction - parameter (lxd=12) ! GL points for over-integration (dealiasing) - parameter (lx2=lx1-0) ! GLL points for pressure (lx1 or lx1-2) - - parameter (lelg=250) ! max number of global elements - parameter (lpmin=1) ! min number of MPI ranks - parameter (lelt=lelg/lpmin + 3) ! max number of local elements per MPI rank - parameter (ldimt=1) ! max auxiliary fields (temperature + scalars) - - ! OPTIONAL - parameter (ldimt_proj=1) ! max auxiliary fields residual projection - parameter (lelr=lelt) ! max number of local elements per restart file - parameter (lhis=1) ! max history/monitoring points - parameter (maxobj=1) ! max number of objects - parameter (lpert=1) ! max number of perturbations - parameter (nsessmax=1) ! max sessions to NEKNEK - parameter (lxo=lx1) ! max GLL points on output (lxo>=lx1) - parameter (mxprev=20) ! max dim of projection space - parameter (lgmres=30) ! max dim Krylov space - parameter (lorder=3) ! max order in time - parameter (lx1m=1) ! GLL points mesh solver - parameter (lfdm=0) ! unused - parameter (lelx=1,lely=1,lelz=1) ! global tensor mesh dimensions - - parameter (lbelt=1) ! lelt for mhd - parameter (lpelt=1) ! lelt for linear stability - parameter (lcvelt=1) ! lelt for cvode - - ! INTERNALS - include 'SIZE.inc' diff --git a/examples/fdlf/fdlf.par b/examples/fdlf/fdlf.par index 881deb9f1..c8cd403cb 100644 --- a/examples/fdlf/fdlf.par +++ b/examples/fdlf/fdlf.par @@ -14,12 +14,10 @@ residualTol = 1e-4 [VELOCITY] density = 1.2 #kg/m3 viscosity = 0.00002 #kg/m-s -#boundaryTypeMap = v ,o ,sym,w ,sym,sym [TEMPERATURE] rhoCp = 1200.0 #J/m3-K conductivity = 0.025 #W/m-K -#boundaryTypeMap = t ,o ,i ,f ,p ,p [CASEDATA] height = 0.01 From 0dad656ce7fa87fee95523579ae9c710c931f2db Mon Sep 17 00:00:00 2001 From: Jez Swann Date: Mon, 22 Jul 2024 12:00:37 +0100 Subject: [PATCH 5/6] More work on fdlf tutorial. Also removed oudf file as this is now outdated. (cherry picked from commit ea36c5b8734f7c7d26234d05fdfa5c1b672e29c5) --- doc/source/tutorials/fdlf.rst | 217 ++++++++++++---------------------- examples/fdlf/fdlf.oudf | 20 ---- 2 files changed, 75 insertions(+), 162 deletions(-) delete mode 100644 examples/fdlf/fdlf.oudf diff --git a/doc/source/tutorials/fdlf.rst b/doc/source/tutorials/fdlf.rst index d948e1374..d4901587b 100644 --- a/doc/source/tutorials/fdlf.rst +++ b/doc/source/tutorials/fdlf.rst @@ -3,7 +3,7 @@ Fully Developed Laminar Flow ============================ -In this tutorial we will be building a case that involves incompressible laminar flow in a channel with a constant heat flux applied. +In this tutorial we will be building a case that involves incompressible laminar flow in a channel with a constant heat flux applied. This case uses air as a working fluid and will be simulated using fully dimensional quantities. A diagram of the case is provided in :numref:`fig:setup` and the necessary case parameters are provided in :numref:`tab:setup`. Note that round numbers have been selected for the fluid properties and simulation parameters for the sake of simplicity. @@ -16,7 +16,7 @@ Note that round numbers have been selected for the fluid properties and simulati :alt: flow diagram :width: 500 - Diagram describing the case setup for fully developed laminar flow in a channel.. + Diagram describing the case setup for fully developed laminar flow in a channel. .. _tab:setup: @@ -68,13 +68,13 @@ Before You Begin ________________ This tutorial assumes that you have installed *NekRS* in your home directory and -have setup your :ref:`execution PATH`. You can either follow the example +have setup your :ref:`PATH `. You can either follow the example with the files in the fdlf directory within examples directory of nekRS, or create it within a directory of your choice. -If you have chosen to create the example as following along, for the initial -mesh generation, you will need to compile the tools ``genbox`` and ``genmap`` -from *Nek5000*. Please follow the instructions in the +If you have chosen to create the example as following along, you will need to +compile the two *Nek5000* tools ``genbox`` for the initial mesh generation and +``visnek`` to visualise the final result. Please follow the instructions in the :ref:`Building the Nek5000 Tool Scripts ` section. Mesh Generation @@ -86,19 +86,32 @@ To create the input file, copy the following script and save the file as ``fdlf. .. literalinclude:: ../../../examples/fdlf/fdlf.box :language: none -For this mesh we are specifying 50 uniform elements in the stream-wise (:math:`x`) direction and 5 uniform elements in the span-wise (:math:`y`) direction. -The velocity boundary conditions in the x-direction are a standard Dirichlet velocity boundary condition at :math:`x_{min}` and an open boundary condition with zero pressure at :math:`x_{max}`. -The velocity boundary conditions in the y-direction are a symmetric boundary at :math:`y_{min}` and a wall with no slip condition at :math:`y_{max}`.. -The temperature boundary conditions in the x-direction are a standard Dirichlet boundary condition at :math:`x_{min}` and an outflow condition with zero gradient at :math:`x_{max}`. -The temperature boundary conditions in the y-direction are an insulated condition with zero gradient at :math:`y_{min}` and a constant heat flux at :math:`y_{max}`. -Note that the boundary conditions specified with lower case letters must have values assigned in userbc, which will be shown later in this tutorial. -Now we can run ``genbox`` with +For this mesh we are specifying 50 uniform elements in the stream-wise (:math:`x`) +direction and 5 uniform elements in the span-wise (:math:`y`) direction. The +velocity boundary conditions in the x-direction are a standard Dirichlet +velocity boundary condition at :math:`x_{min}` and an open boundary condition +with zero pressure at :math:`x_{max}`. The velocity boundary conditions in the +y-direction are a symmetric boundary at :math:`y_{min}` and a wall with no slip +condition at :math:`y_{max}`. The temperature boundary conditions in the +x-direction are a standard Dirichlet boundary condition at :math:`x_{min}` +and an outflow condition with zero gradient at :math:`x_{max}`. The temperature +boundary conditions in the y-direction are an insulated condition with zero +gradient at :math:`y_{min}` and a constant heat flux at :math:`y_{max}`. Note +that the boundary conditions specified with lower case letters must have values +assigned in userbc, which will be shown later in this tutorial. Now we can run +``genbox`` with .. code-block:: console $ genbox -When prompted provide the input file name, which for this case is ``fdlf.box``. The tool will produce binary mesh and boundary data file ``box.re2`` which should be renamed to ``fdlf.re2``. +When prompted provide the input file name, which for this case is ``fdlf.box``. +The tool will produce binary mesh and boundary data file ``box.re2`` which should +be renamed to ``fdlf.re2``. + +.. code-block:: console + + $ mv box.re fdlf.re2 .. Once we have the mesh file, we need to run the domain partitioning tool, ``genmap``. @@ -111,12 +124,13 @@ When prompted provide the input file name, which for this case is ``fdlf.box``. .. You do not have to specify the number of MPI-ranks you plan to run the case with when you use ``genmap``, as it contains the partitioning for all possible choices. .. :tip: If either ``genbox`` or ``genmap`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see :ref:`here`. -:tip: If ``genbox`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see `here `_. +.. tip:: If ``genbox`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see `here `_. Control parameters __________________ -The control parameters for any case are given in the ``.par`` file. For this case, create a new file called ``fdlf.par`` with the following: +The control parameters for any case are given in the ``.par`` file. For this case, +create a new file called ``fdlf.par`` with the following: .. literalinclude:: ../../../examples/fdlf/fdlf.par @@ -132,154 +146,68 @@ parameters, as well as the height of the channel. These initial and boundary conditions will later be called in respective subroutines of the ``.udf`` file. User-Defined Host Functions File (.udf) -_________________________ - -The user-defined host functions file implements various subroutines to allow the user to interact with the solver. -Note that only the subroutines that need to be edited to run this case will be discussed. -The remaining routines can be left as is. -For more information on the ``.udf`` file and the available subroutines see :ref:`here `. - -To get started we copy the template to our case directory - -.. code-block:: console - - $ cp $HOME/Nek5000/core/zero.usr fdlf.usr +_______________________________________ +The user-defined host functions file implements various subroutines to allow the +user to interact with the solver. For more information on the ``.udf`` file and +the available subroutines see :ref:`here `. Boundary and initial conditions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The boundary conditions can be setup in subroutine ``userbc`` as shown below, where the highlighted lines indicate where the actual boundary condition is specified. -The velocity and temperature are set to the analytic profiles given by Eqs. :eq:`fdlf_vel` and :eq:`fdlf_temp` and the heat flux is set to a constant value. +The boundary conditions can be setup in function ``UDF_Setup`` as shown below, +where the highlighted lines indicate where the actual boundary condition is specified. +The velocity and temperature are set to the analytic profiles given by Eqs. : +eq:`fdlf_vel` and :eq:`fdlf_temp` and the heat flux is set to a constant value. -.. .. literalinclude:: ../../../examples/fdlf/fdlf.udf -.. :language: fortran -.. :lines: 69-97 -.. :emphasize-lines: 22,25,26 +.. literalinclude:: ../../../examples/fdlf/fdlf.udf + :language: c++ + :lines: 41-61 + :emphasize-lines: 3-5,12-15,20 -The channel height, mean velocity, heat flux, and mean inlet temperature are all called from the list of user defined parameters in the ``.par`` file. -The thermal conductivity is set from the :ref:`field coefficient array`, which is set from the conductivity specified for the temperature field in the ``.par`` file. +*The channel height, mean velocity, heat flux, and mean inlet temperature are all +called from the list of user defined parameters in the ``.par`` file. +The thermal conductivity is set from the :ref:`field coefficient array`, +which is set from the conductivity specified for the temperature field in the ``.par`` file.* -The next step is to specify the initial conditions. -This can be done in the subroutine ``useric`` as shown. +The next step is to specify the initial conditions. +This can also be done in the ``UDF_Setup`` function as shown. Again, the actual inlet condition is specified with the highlighted lines. -.. .. literalinclude:: ../../../examples/fdlf/fdlf.usr -.. :language: fortran -.. :lines: 99-117 -.. :emphasize-lines: 13,16 - -As with ``userbc``, the inlet temperature and mean velocity are set from the list of user defined parameters in the ``.par`` file. - -.. ........................ -.. userchk -.. ........................ -.. -.. The subroutine ``userchk`` is a general purpose function that is executed before the time stepper and after each time step. The following should be copied to this subroutine -.. -.. .. code-block:: fortran -.. -.. subroutine userchk() -.. -.. implicit none -.. -.. include 'SIZE' -.. include 'TOTAL' -.. -.. real bc_average,glsc3,glsc2 -.. real Dh,um,qpp,Tin,rho,mu,con,L,Pin,Pout,darcy,Re,derror -.. real Tbulk,Twall,HTC,Nuss,Nerror -.. -.. integer n -.. -.. n=lx1*ly1*lz1*nelv -.. -.. Dh = uparam(1)*2.0 !hydraulic diameter -.. um = uparam(2) !mean velocity -.. qpp = uparam(3) !heat flux -.. rho = cpfld(1,2) !density -.. mu = cpfld(1,1) !viscosity -.. con = cpfld(2,1) !conductivity -.. -.. c Evaluate friction factor -.. L = 0.2 -.. Pin = bc_average(pr,'v ',1) -.. Pout = bc_average(pr,'O ',1) -.. darcy = -2.*Dh*(Pout-Pin)/(L*rho*um*um) -.. Re = rho*um*Dh/mu -.. derror = abs(1.-darcy*Re/96.) -.. -.. c Evaluate Nusselt number -.. Tbulk = glsc3(t,vx,bm1,n)/glsc2(vx,bm1,n) -.. Twall = bc_average(t,'f ',2) -.. HTC = qpp/(Twall-Tbulk) -.. Nuss = HTC*Dh/con -.. Nerror = abs(1.-Nuss*17./140.) -.. -.. c Print to logfile -.. if(nio.eq.0) then -.. write(*,*) "Friction factor = ",darcy,derror -.. write(*,*) "Nusselt = ",Nuss,Nerror -.. write(*,*) -.. endif -.. -.. A custom function is called to evaluate the inlet pressure, outlet pressure, and the wall temperature. Built in routines for array multiplication are used to evaluate the bulk temperature. The Nusselt number and Darcy friction factor are evaluated and printed to the logfile along with their associated errors. - -SIZE file -_________ - -It is recommended to copy a template of the ``SIZE`` file from the core directory and rename it ``SIZE`` in the working directory: - -.. code-block:: console - - $ cp $HOME/Nek5000/core/SIZE.template SIZE - -Then, in the BASIC section, adjust the domain dimension (``ldim``) and the max number of global elements (``lelg``). +.. literalinclude:: ../../../examples/fdlf/fdlf.udf + :language: c++ + :lines: 117-132 + :emphasize-lines: 12,16 -.. literalinclude:: ../../../examples/fdlf/SIZE - :language: fortran - :lines: 11-20 - :emphasize-lines: 2,7 - -For this tutorial we have set our polynomial order to be :math:`N=7` which is defined in the ``SIZE`` file as ``lx1=8`` which indicates that there are 8 points in each spatial dimension of every element. The number of dimensions is specified using ``ldim`` and the number of global elements used is specified using ``lelg``. - - -Compilation -___________ - -You should now be all set to compile and run your case! -As a final check, you should have the following files: - - .. * :download:`fdlf.usr ` - .. * :download:`fdlf.par ` - .. * :download:`fdlf.re2 ` - .. * :download:`fdlf.ma2 ` - .. * :download:`SIZE ` - -If for some reason you encountered an insurmountable error and were unable to generate any of the required files, you may use the provided links to download them. -After confirming that you have all five, you are now ready to compile - -.. code-block:: console - - $ makenek fdlf - -If the compilation is successful, the executable ``nek5000`` will be generated. +As with the boundary conditions, the inlet temperature and mean velocity are set +from the list of user defined parameters in the ``.par`` file. Running the case ________________ +You should now be all set to run your case! As a final check, you should have the following files: + + * :download:`fdlf.re2 <../../../examples/fdlf/fdlf.re2>` + * :download:`fdlf.par <../../../examples/fdlf/fdlf.par>` + * :download:`fdlf.udf <../../../examples/fdlf/fdlf.udf>` + * :download:`fdlf.usr <../../../examples/fdlf/fdlf.usr>` + +If for some reason you encountered an insurmountable error and were unable to +generate any of the required files, you may use the provided links to download them. Now you can run the case .. code-block:: console - $ nekbmpi fdlf 4 + $ mpirun -np 4 nekrs --setup fdlf.par | tee logfile -To launch an MPI jobs on your local machine using 4 ranks. The output will be redirected to ``logfile``. +To launch an MPI jobs on your local machine using 4 ranks. The output will be +redirected to ``logfile``. Post-processing the results ___________________________ -Once execution is completed your directory should now contain 5 checkpoint files that look like this: +Once execution is completed your directory should now contain 5 checkpoint files +that look like this: .. code-block:: none @@ -287,13 +215,18 @@ Once execution is completed your directory should now contain 5 checkpoint files fdlf0.f00002 ... -The preferred mode for data visualization and analysis with *Nek5000* is to use Visit/ParaView. One can use the script *visnek*, to be found in ``/scripts``. It is sufficient to run: +The preferred mode for data visualization and analysis with *NekRS* is to use +Visit or ParaView. One can use the script *visnek*, to be found in ``/scripts``. +It is sufficient to run: .. code-block:: console $ visnek fdlf -to obtain a file named ``fdlf.nek5000`` which can be recognized in Visit/ParaView. In the viewing window one can visualize the flow-field as depicted in :numref:`fig:velocity_paraview` as well as the temperature profile as depicted in :numref:`fig:temperature_paraview` below. +to obtain a file named ``fdlf.nek5000`` which can be recognized in Visit/ParaView. +In the viewing window one can visualize the flow-field as depicted in +:numref:`fig:velocity_paraview` as well as the temperature profile as depicted +in :numref:`fig:temperature_paraview` below. .. _fig:velocity_paraview: diff --git a/examples/fdlf/fdlf.oudf b/examples/fdlf/fdlf.oudf deleted file mode 100644 index ec79b1d25..000000000 --- a/examples/fdlf/fdlf.oudf +++ /dev/null @@ -1,20 +0,0 @@ -void velocityDirichletConditions(bcData *bc) -{ - bc->u = 0.0; // x-velocity - bc->v = 0.0; // y-velocity -// um*3./2.*(1-4.*(y/H)**2) - bc->w = 0.5; // z-velocity -} - -void scalarDirichletConditions(bcData *bc) -{ - const dfloat H = 0.01; - const dfloat Tin = 10; - const dfloat term = 300*H/(2*0.025); - bc->s = term*(3.*((bc->y/H)*(bc->y/H))-2.*((bc->y/H)*(bc->y/H)*(bc->y/H)*(bc->y/H))-39./280.)+Tin; // temperature -} - -void scalarNeumannConditions(bcData *bc) -{ - bc->flux = 300; // heat flux -} \ No newline at end of file From b39fb8064f354f35379e46f0a653e986b77cdbd6 Mon Sep 17 00:00:00 2001 From: Jez Swann Date: Mon, 22 Jul 2024 16:33:37 +0100 Subject: [PATCH 6/6] Continuing fdlf tutorial. Tidied box file. --- doc/source/tutorials/fdlf.rst | 117 ++++++++++++++++++++++------------ examples/fdlf/fdlf.box | 6 +- 2 files changed, 81 insertions(+), 42 deletions(-) diff --git a/doc/source/tutorials/fdlf.rst b/doc/source/tutorials/fdlf.rst index d4901587b..3ca8be724 100644 --- a/doc/source/tutorials/fdlf.rst +++ b/doc/source/tutorials/fdlf.rst @@ -73,33 +73,40 @@ with the files in the fdlf directory within examples directory of nekRS, or crea it within a directory of your choice. If you have chosen to create the example as following along, you will need to -compile the two *Nek5000* tools ``genbox`` for the initial mesh generation and -``visnek`` to visualise the final result. Please follow the instructions in the -:ref:`Building the Nek5000 Tool Scripts ` section. +compile the *Nek5000* tool ``genbox`` for the initial mesh generation and have +access to the ``visnek`` tool to visualise the final result. Please follow the +instructions in the :ref:`Building the Nek5000 Tool Scripts ` section. Mesh Generation _______________ -This tutorial uses a simple rectangular box mesh generated by ``genbox``. +This tutorial uses a simple 3D cuboid box mesh generated by ``genbox``. To create the input file, copy the following script and save the file as ``fdlf.box``. .. literalinclude:: ../../../examples/fdlf/fdlf.box :language: none For this mesh we are specifying 50 uniform elements in the stream-wise (:math:`x`) -direction and 5 uniform elements in the span-wise (:math:`y`) direction. The -velocity boundary conditions in the x-direction are a standard Dirichlet +direction and 5 uniform elements in the span-wise (:math:`y`) direction. As +*NekRS* can only solve 3D problems we also create a single element in the z-direction. + +The velocity boundary conditions in the x-direction are a standard Dirichlet velocity boundary condition at :math:`x_{min}` and an open boundary condition -with zero pressure at :math:`x_{max}`. The velocity boundary conditions in the -y-direction are a symmetric boundary at :math:`y_{min}` and a wall with no slip -condition at :math:`y_{max}`. The temperature boundary conditions in the -x-direction are a standard Dirichlet boundary condition at :math:`x_{min}` -and an outflow condition with zero gradient at :math:`x_{max}`. The temperature -boundary conditions in the y-direction are an insulated condition with zero -gradient at :math:`y_{min}` and a constant heat flux at :math:`y_{max}`. Note -that the boundary conditions specified with lower case letters must have values -assigned in userbc, which will be shown later in this tutorial. Now we can run -``genbox`` with +with zero pressure at :math:`x_{max}`. In the y-direction the velocity boundary +conditions are a symmetric boundary at :math:`y_{min}` and a wall with no slip +condition at :math:`y_{max}`. In the z-direction there is a periodic velocity +boundary condition at both :math:`z_{min}` and :math:`z_{max}`. + +The temperature boundary conditions in the x-direction are a standard Dirichlet +boundary condition at :math:`x_{min}` and an outflow condition with zero gradient +at :math:`x_{max}`. In the y-direction the temperature boundary conditions are +an insulated condition with zero gradient at :math:`y_{min}` and a constant heat +flux at :math:`y_{max}`. The z direction boundary conditions are periodic at +both :math:`z_{min}` and :math:`z_{max}`. + +Note that the boundary conditions specified with lower case letters must have +values assigned in relevant functions in the udf file, which will be shown later +in this tutorial (see :ref:`bc_ic_udf`). Now we can generate the mesh with: .. code-block:: console @@ -107,7 +114,7 @@ assigned in userbc, which will be shown later in this tutorial. Now we can run When prompted provide the input file name, which for this case is ``fdlf.box``. The tool will produce binary mesh and boundary data file ``box.re2`` which should -be renamed to ``fdlf.re2``. +be renamed to ``fdlf.re2``: .. code-block:: console @@ -124,7 +131,9 @@ be renamed to ``fdlf.re2``. .. You do not have to specify the number of MPI-ranks you plan to run the case with when you use ``genmap``, as it contains the partitioning for all possible choices. .. :tip: If either ``genbox`` or ``genmap`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see :ref:`here`. -.. tip:: If ``genbox`` cannot be located by your shell, check to make sure the ``Nek5000/tools`` directory is in your path. For help see `here `_. +.. tip:: If ``genbox`` cannot be located by your shell, check to make sure the + ``Nek5000/tools`` directory is in your path. For help see + `here `_. Control parameters __________________ @@ -134,16 +143,22 @@ create a new file called ``fdlf.par`` with the following: .. literalinclude:: ../../../examples/fdlf/fdlf.par -For this case the properties evaluated are for air at ~20 C. -Note that ``rhoCp`` is the product of density and specific heat. -The ``CASEDATA`` list represents an easy way of passing data to *NekRS* that -can later be used throughout the ``.udf`` file. Additionally, like all values -specified in the ``.par`` file, they can be changed without the need to recompile *NekRS*. +Here we have set our polynomial order to be :math:`N=7` which indicates that +there are 8 points in each spatial dimension of every element. The case has been +configured to have a time step of `0.1` milliseconds, with a maximum of 10000 +steps and an output file produced every 2000 steps. + +.. TODO cubaturePolynomialOrder and pressureTol + +For this case the properties evaluated are for air at ~20 C and ``rhoCp`` is the +product of density and specific heat. The required values for the initial and boundary conditions specified by lower -case letters in the ``.box`` file are defined here as a list of user given -parameters, as well as the height of the channel. These initial and boundary -conditions will later be called in respective subroutines of the ``.udf`` file. +case letters in the ``.box`` file are defined here as part of the ``CASEDATA`` +section. This provides an easy way of passing data to *NekRS* that can later be +used throughout the ``.udf`` file where the conditions will later be set. +Additionally, like all values specified in the ``.par`` file, they can be +changed without the need to recompile *NekRS*. User-Defined Host Functions File (.udf) _______________________________________ @@ -152,27 +167,49 @@ The user-defined host functions file implements various subroutines to allow the user to interact with the solver. For more information on the ``.udf`` file and the available subroutines see :ref:`here `. +Loading parameters +^^^^^^^^^^^^^^^^^^ + +Firstly, the channel height, mean velocity, heat flux, and mean inlet temperature +parameters that were set in the ``.par`` file must be loaded for later use. +These are loaded through the ``UDF_Setup0`` method. + +.. literalinclude:: ../../../examples/fdlf/fdlf.udf + :language: c++ + :lines: 82-88 + +The ``UDF_LoadKernels`` function is used to load the remaining parameters +of the temperature density and diffusivity/conductivity. + +.. literalinclude:: ../../../examples/fdlf/fdlf.udf + :language: c++ + :lines: 65-71 + +All these values can then be set as variables for use within the device kernel. + +.. literalinclude:: ../../../examples/fdlf/fdlf.udf + :language: c++ + :lines: 73-80 + +.. _bc_ic_udf: + Boundary and initial conditions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The boundary conditions can be setup in function ``UDF_Setup`` as shown below, -where the highlighted lines indicate where the actual boundary condition is specified. -The velocity and temperature are set to the analytic profiles given by Eqs. : -eq:`fdlf_vel` and :eq:`fdlf_temp` and the heat flux is set to a constant value. +The boundary conditions are setup in ``velocityDirichletConditions``, +``scalarDirichletConditions`` and ``scalarNeumannConditions`` device functions +as shown below, where the highlighted lines indicate where the actual boundary condition +is specified. The velocity and temperature are set to the analytic profiles given +by Eqs. :eq:`fdlf_vel` and :eq:`fdlf_temp` and the heat flux is set to a constant value. .. literalinclude:: ../../../examples/fdlf/fdlf.udf :language: c++ :lines: 41-61 - :emphasize-lines: 3-5,12-15,20 + :emphasize-lines: 5,15,20 -*The channel height, mean velocity, heat flux, and mean inlet temperature are all -called from the list of user defined parameters in the ``.par`` file. -The thermal conductivity is set from the :ref:`field coefficient array`, -which is set from the conductivity specified for the temperature field in the ``.par`` file.* - -The next step is to specify the initial conditions. -This can also be done in the ``UDF_Setup`` function as shown. -Again, the actual inlet condition is specified with the highlighted lines. +The next step is to specify the initial conditions. This is done in the +``UDF_Setup`` function as shown. Again, the actual inlet condition is specified +with the highlighted lines. .. literalinclude:: ../../../examples/fdlf/fdlf.udf :language: c++ @@ -206,6 +243,8 @@ redirected to ``logfile``. Post-processing the results ___________________________ +.. TODO tidy how to get visnek + Once execution is completed your directory should now contain 5 checkpoint files that look like this: diff --git a/examples/fdlf/fdlf.box b/examples/fdlf/fdlf.box index 0d69e44a9..e48da1171 100644 --- a/examples/fdlf/fdlf.box +++ b/examples/fdlf/fdlf.box @@ -6,9 +6,9 @@ #======================================================== # Box fdlf --50 -5 -1 Nelx Nely +-50 -5 -1 Nelx Nely Nelz 0.0 0.2 1.0 x0 x1 ratio 0.0 0.005 0.7 y0 y1 ratio 0.0 1.0 1.0 z0 z1 ratio -v ,O ,SYM,W ,P ,P Velocity BC's: (cbx0, cbx1, cby0, cby1) -t ,O ,I ,f ,P ,P Temperature BC's: (cbx0, cbx1, cby0, cby1) \ No newline at end of file +v ,O ,SYM,W ,P ,P Velocity BC's: (cbx0, cbx1, cby0, cby1, cbz0, cbz1) +t ,O ,I ,f ,P ,P Temperature BC's: (cbx0, cbx1, cby0, cby1, cbz0, cb1) \ No newline at end of file