From 5fb9e6cd847e890abb566e1852f0aca42f19cde5 Mon Sep 17 00:00:00 2001
From: cfdem
Reasonable example settings for the "couplingProperties" dictionary are given in the tutorial cases.
+modelType ++
"modelType" refers to the formulation of the equations to be solved. Choose "A" or "B", according to Zhou et al. (2010): "Discrete particle simulation of particle-fluid flow: model formulations and their appliccability", JFM. "A" requres the use of the force models gradPForce and viscForce, whereas "B" requires the force model "Archimedes". +
+couplingInterval ++
The coupling interval determines the time passing between two CFD-DEM data exchanges. +
+A useful procedure would be: +1) Set the DEM TS in the in.xxx according to the needs of the pure DEM problem. +2) Set the "couplingInterval", which refers to the DEM timesteps. Depending on the problem you will need to have a close (small couplingInterval) or loose coupling. +3) Choose the CFD timestep in the controlDict. it must be equal or smaller than the coupling time, otherwise you will get the error: "Error - TS bigger than coupling interval!". +
+Example: DEMts=0.00001s, couplingInterval=10 exchange data (=couple) will happen every 0.0001s. +
V9Uf zO}({X^!zT|IX8D6yE7}>V4IWNeBO<_^?H*IEXaA`b?9}tN6%g6MVI%_8+6I5=IU!+ zZ~y%}H;;Y9ev+5JZ`q!`HII|btGj&OkvDiH_e|HJH*Us_mJECpk=?j##q#rJ@gDLt z_J-{bmw&t$Y1wmUp=oNtk<5XoU5%~UmrKtbtmJ<3%iwITn^%c|{OhG_>cif{O3G zTe!zgv#Q*G<)g){g6S_crf)qS@@m_n(suC=`G1_2|I+nNOVrub`?!DG#{LtFJsoV8 z*ZYs{%bl|I_O$`Nc_X&p`Z_P!>FU;)pW>2!1LeotBny4a$GjW(t@jthi-}XW1PzSk zPrLWHtb0+q|A=Q>{JXcWxG*#=Ov-DWxT*D~xZvA<594b4Eib;y_cD6H4z;@RjqTks zzQ=AW)AbHj?%9RIbB8_Y?)1H*Utz34?69eF?sg;dE{!2B#hL3@Pv7jY%Kh5YOWWpM zZV~HKvd8me&wDpsB{Ya4yBVC0TwgoEbP?a9?DypUew%arGTJPv4Yas)@^R;ciN9N< zc3(e@k$T0K>;L0@D+$W0;qgyi^`n|n;Qyh4mk?>L(kZ_4ffgE^cH;`k5GDd+M3;5?w0LLESG(17~)F#Gr%oW$( z@dG(7 fEHWhq%)k;6Y3d9G zr72N3gJVv~B%;Xjc0n8mg`5v$(W)S51|`Qg2-nt}iT}Z(?~p|aGda$n4K5l?K87M| zLVp>wKgolk${VAe&OC-z>}y(;EeIEEUo&HYraD2737R2{J&xU`$^b$}uH$L!g|J zdr`eyn@A4f7$}5y4^dW14FwsL?Bl9pVlFDDG!=v@$Xyj;4=Rh=5TRkvAC%aRVG2@H zqC5;(kljdZY*IcpoP%D~$IUkgSJB@O=d@AqU)`j9Pz1+B!M{a>ivC;#2i>!P`OI!o z-aC?GrQrXwN%@&bPCEtv*hm$h?ok{w1^;hk`L-xdX9eq!C`@V^&2duHen}Rsh~}V+ z3vdI*L}RM2(Huub#q(s*v>2#JsmqVSRJUU}wnTjls7qORm$KZ3h>ca5(=k>-@1fwj zRas<5#K)-|r$d~A)Ry=i2Ns}M?
7yL-% zd;p|c@Omld0XqQQr-J_2hT3YQf8i!ee76d%OpF%5v@-nuF|ADc4?6TR@fwbCcg7=l zHRm5?@ZkrVC^!c#AtDe9^iH;#L^$@05=XQ${H`{wOahlM0Sh_09Fg`&h86_sWjrp* zw9v|U=uK`~8NR}pR)((^q?KU=4`p(drQscW^r| #A84B=q?&?C|Yh(;X1VVHh0Qw_WI=WaOLU)&;KTXQ;^#HUo30fM{ z%A`y$g&P(bRu%GT9xey-3k7I7r_K<*3c~OOp$Kg&(&*rXJF`rook|fQe3ObnC*=y{ zj6xZ@e?VObT!zKa1a669m=$h$Vl*0VWMVWLu1ivMv0M>n;35aK8m0-xH*3+#@SPR( zGNv!UcXb$66-m$?08Q)4;o4j&x|yMAA(Y9OV;e>%LpwCa=yl=B3z`rCTt30HDtzxv zY765J{;2v1%)qP+tzifeqkAW4buqlAl}VXH8*ZvlDk7)CJS6_nZi9Mduppz4;Tj5t z_d}vb$xy)$Zk=FQ2G%unMdV_*Zi3NI5`2drtugqLEn3+>ykCMZ#Guhh&~-4hGAY{X z#`ag4Um`=dYtRV)VHqhG-2 {sy5*nKUccVnVx-7U+l;LA=PbY&8a4#_&vruaWY6aX&$7ltBOGYbT zh9ojE3+5vcvlSu{x{yh|weWFIq7GQd(Y=kdM^bc#iC)GWxv(x`Y9OP-3%I8KA0Y@n zrb^b;Yclx6uu5B(j*QFbaDb+a&J_z72t@*jf~Z0)7!gx~5C~l@I1#{50j|M`#1J z=HL^{n1c_ZDWhd*e=iZUU`Ukkn1Mrrzy6|baFhfrK`fXdU4n0crI9lieG& Yq?Z_6)2Fe(z2Ec8M!7fGLSzm`( zpd7loj_|QNMk~M+4CQ!m)oT@Ef%aZ$Ea0L|W*H+uOL-EwhcOdaFlG=bj~V_U9mF&z zANHmb5esx+NWB$&=F};L8J5v9J}6RxSfES!Xe`7G@B_dfU5Q7dLq~tIkRlA%;{QVt z80!qP3*chO2*iTvS^^%^`tY4@hQb2KY!x9E=;W1p1K|i8qn99M!DuZkUJ1h;z=AO< zrGNvO5+OJ+M8Po^Kg5DDk4WL;5)3zj?=Uc03y7aMj9D-mD1;;kT_Swcmq`c5dNp=J zD;Ow73b)HM$(ic}sSsUNidZmEo)q@p>2p7nF#@C%axO$BV!=SDQdq$-6oFfr87>Il z=O*ef3x@RpoG{77j7bvuO+fV81+8G9dntT_n5l@2=|AX(hjqY0&WuKod1SN >oHp3OIz}5O8@X!!U4RC)vy K#>fN6xFW`)4>H9J*OGBzV`bf5w6vm|M8;(% z$z@zf`OrE`1}ZYz4hV?ROdgNnD>BGVk~%gSkKiP5v-3XWgG^aM24sL`4r5_2 v0#KU8F(F|>tOSSVRqQOAq)=y3&t`5@`ucx z7U1*yYGYIeUoIs45DNzWmBDhE;e4>m#cUZINk0rM 8(oL>X-t3Yk6t$w?+1EFUuuf|(d_M+V<8XSN+C zS%!|V(_DvGFqVoCCmHh&>=!ez9F$3jUWb4MV +$w-gR|@^Vot=l~RgJ2OH`@fXk3T?WuAk%(9@ zCQF$V6sKDsasrIu1E`BAK`a<^j7*BJ|E5WlFqR22*aIT$4g(8j4221o;ewD>VDu77 zD?|VbIb%mi22%sW6CtiM%n7lU(Q^ i}3M`nz9L^^& zjVq&1I6`O>AQr@ez7j-_=phQqc=Sk$${>0G3r3n89^ns(H+3{9gPgd!El?SHg^Er` zkMTgqSTvwAYMrO*Vkm?etXCeWMW31A5d&SLGWwzy%HVq!>ktb%AV81kF%-&R)H76o zNw5mBpf9I@9NdIX4tvM6SPL@;7hp*~u%LG_JOZ#pXCYt!bohQHBt8;>g`6G$g YHjKdmG28TE4q5!Bd%OHr;=m4lu(L=S30fP)On{+}r+Cpc@1Kh-52%E-qXMr6p zdddO5bV=K(f^8%yl+v*=Y!`t`(i`&+%fL|$`dUrMgD){K8Ur~LhH|h3m($%I65aHy zF?=2qCOcYV_@FVpr{OdXeGdXsEF$`n9?B$&E><365yEyDeb$09Mjj2ecNjPe%J91o zYGW00!SoO*qT=w1+ZS#?v*1U1Nq701MIS;7|;G1_!{z99ja%V9RL7 zSl~09u&kpAhK*@@`T)MUDWT7Q@cm6V3_-68AJL_Eu>d|0sPGTPF&02?F!#|b!_tYa zu>fvwqxZW2@*9js! TQ z7*>GX7NbjG?+~IL-bPohDj||HjwwKyguc{+&x1 @rcdvvFPpvP#n2v&S_Yr)!=VQLWsJ-TlJ zQf&fm$YU&EeWnvaikcCS;G`W>2n=Jovx;E*lx}{2U`)%%A^0#ffxHpJgiLTLggrM# z17UR17d!A#Rv8`O3*kOn3__9pmF9~K zKA7LO8k6}7-bx9Z?Ck76|NJw{DiNyLv2r->OA`G<53m(DKpB^$A^r&%kmv<8be{Re z=u&Yzp@1LxkCZ=Hfl~9KWrFz+=BM*X4ub3(QzZ&}#&o(#v?QDdl=*4&m}COQ{+yWf zwj(o@Wr%Ach=d_=Ok`w*URZ^#&@4U`K4EY%*RIiW1V~HN=ZF SC)a 70KLA)NO zQfGm)pZk!Z|G>XerIOYU<_*#*6w3rz!NI(Wx_VN&G?HhZHESwwO>L$rd%DeZUQhM! z +ID$$`3G8Ahug+S6q?ktiD z5QR`q3ud7<81}0oP!pH{H6gA>AZMBwhbY7f1ymMEMQx 0OVz~&nA!s9T7At7y44z$Wp%O81px0;#B)~+ZArN6z9q8XcU@Df% zfWJs42X(|UCB1YuNFic*1kTb>NF)M~LQ8?=bf7N*g^3uRNuUi$8= p11O5xERCA{QcU6iRg?EXja5hz}+~wh&e)VO$4B zgx-3dqqR_~K#yfeWsw}anp{lp+YbCBtcMIx@fui*p<|USodg;NBWUPY<#G_6km+R! z>LDZm&`IS?ds2oo?HrBTlOR73VLFLIh&)3>$MT(z=!A0Q4I+^O3@(x(qlzS8_R}Dr zjJ4Psprfb6@F-J;OahjL<}_qdy3+#i(*7}sER9E*h=jNuxg1$gL<=Lpi)3Q>0Av!U{QD_j;N#v+& zwREh6UvPWim;z^|5;vzn%>kWYF?gL2vsKWK7C`S~0tvW$bpn=OKGNdRULIwv5F-}? zM-e$IWprr}Qd5Yn>qxhZ2dd0?H5F=0SdEI6X*s6a$D@oOe4_Xx1}ccc5Eh^*)?(j) z$U-be1el76L24=pMc9c(F61?^6k;=g&7duX2-=c?`R5|JAY@~*vxrQrKyHZ1B+yNQ zYGiD$w@%>IqfgA?Evjdrl%UzufDT^FyQVjSUX;LVX(|UNgf0d*6*$YK>Mn+$k9qt^ zfKbPfNTgD*p_T+fDkd47$ZKpU7olzyBZs2 sd zKndm-3&m|@bW9AY4KoI=O=}-Z!Ko$eW0)`S<6r2p3^fb9!4P!cSj?NTkiJ*|`i6}D zcUYFs5}u777bnocNxZ>&tQw_BfD9O!v$`+k@kwg`Wm@W@WkAhv$x dM@u1RC}shLi3q|IgiZ`|L^9e8A}2yQ zxQS9N0fTZh1T2s4TM!S3NT>y@4MZf2*8t_ ZocO>4Fv;mL~07~SWK}W zQ$V;uZJ?1Sgm{D705nsy3ml;Sb}+UOQ!p?`OCe<_RG0$9hd_#9j!+>$Sj`T688`7< zOTa`J4S|v&=)D7a90g<)^bp7q%4qW~&>1iz;}#BT2^ff@CIEzk2^><9lwt(p7=$B~ zC}`g!cqYUIv04HK-)IO}EnZ;)p%Mi+jB12puqHxLfNF3P{dOWAn1aDGS_)Q=EKC7W z2epBaj1c6+Z2*#iHXLcEU8qMe1v9g2DKHmDdOlE?C@|2#;6*49FklYA3pCMzdBz|X z?K8Id0cpHOMu6}Tl0r===)K#)i~v j!x$_!C1vq z4%#xFA$FD{d!TgyU=`e2c{-YJ@eI$ _)RU#ws$f6LJ|elgkCPZz+l*5ULT`B1Fbu6^4w# zDrz!>RS?-nAVXM%Z;XL4165=S#{CddK}7##A|gO4CNfOLAQcT2%Q5UNP?bPaCNMRD z2Vj^Y11e^oL@)(4)_ji!rpPcM15>IILYPB@NkC}Jz!aGn@Hz`qWN5)e2PE)pY9pY6 zD8C>|2B *# zz+mV_7P5esIM5^aBM6Ei3q!|56b&7K7EE^*(XpTf)-y2IVALX2(8BeoJ&3@VuJr-b z9)nsi9RpjmbnM_y20HL!H0MZR0fYcNf+$h| cs1m{RBxs?8!3tENV|F6>0Iy)G3yA7b0Wu3F!=R-a8EZYkAtWA*Rsdfj1THap zah8ge^s iU)?>&picyonx|FrvuR{RRDx-KdR?wIX@EpRx7}7vJF`A)3 zV|Iqnmxx(dL%%=FyJ~45l86wl8xa^h7QhbtDWQGycp};_8&uhx$8)1382Hh9vU$yr zZfzP=Pon^ca2AZ{&_Pq3){6j#Tw2cK( NvyZJNuop^YMV7W9;CUh9T`(-ItR&oQ10$Xrnd zG7rt=xwTawE?WM`E-Zf;dIG}B*?*PjUyZ?GrT}@wbhl&B5*WOtInug%OOUBJ#q;^A zK!EQ-phh$#NgV07$3Pt1Y1PC*LSS>qu%Qe9Z!zM?u%cRV p@qu-MgFVsu8H z;Q2Qj$u$O$VbcIdUBzKAqK<(6-xtL2a--x}ce=+3*4G^W#$nZZ=t1x_9$i=o?iO_d zdW0FSZgNx)t1D;Km9y%~v0*goLM~zr$RL7L8|&_J++FmglmErt<;WO~=t>|4)+wiX zj=)#VneA^mtG=93pI&+joOf6rueqM0n&t{d^IoS}wp^%A?>WtLW3-Jp4RxiM8||78 zrn_?*#tg%rPRs{II_1N-QZf{HJf`LYg%B6iL*gLQ(6!I-nn3_iU^z7wfhiexi;~9U z5r+T;7M->~`(JDV3k1}kxMRG}f~ZUgXsJ|39+46cV*`K!APS5OrEUmPG9d^Q!0wDC zU{;^>x^w?c0<83-Djr3jhZ?K|E=slPF!`~Z*|Di)Y(S4X4}H__5eO})roNI<-|<3C zeWSX-v!+|b!hb+(iuM6Q;2C-W+(E6hSimR^m<6*I3mB#8(hFLaSl{SJ5Of7h(A{vc z29~QX0ke7$3`Zln@FMs=!_iHxBqSDDPK=Ubflfz@1z_Jt5a~}|0*_&sGI}<=Tmw@& z<}xtM4ubz++wQ%u*3+S-P@|}jRaD3-D%9y+u~5RW?R-VeR> B@iTTbT2-eR~;d zFj@nDjoLz1Z6T|+P*-hO?_sr17ijo1YCB*3FZ@M}cVqo~Lk%^5kw$+JtG|fVU!<$Q zh}FMqp_;#l(Lbf|zwy`VUjQ{U{5ATESp7w;{vuudVY!L*KU2i=Hxps~H4$D+V-WcN zrg{Jr+Hv0J8lLLSukjq+G={(#6h8y8m^Fl0*AQa0A+D kz61${!{Fdz6b51I0gV=Q z7!*q&C5%Rg#Z9$z3{av&Zq_7S(M=c_ib!Tm^5}IysO}vJ>I=k8jPVy3g+W#DFYYZZ zTRFpa`7M^MxdeBgws$1j`L_eE%Wi0KkQgj5G%S&8AeOkFHLL(|K@OIQ)9r8LIE{>D zFGbyiWySbQYZ58FuM~ia>m9X47-U7q++i*9x7iwYE>=N3JZ>_f0&5vJjEWd;xc3dj z3><@hvHw;RSMUh9Z@;THj1;S-HH?fF0$|4A?QalOEUTt>n|oOAin~0=7FxBjoeZ!+ zk= H;07&A1zuNH(sQq=|NbdlHN@5TrSR~v&3qF4mf)z}s?))ovn0}*s>A)~P^ zQcE- 6u|J5y6 zFoxN8g&OLitI)(V1sm8IsAeEm=*BYz8_(K3R`-emE3b771)cH`MjVQ)f9(~F$gsu= zR%3;3|3lgl#sc6+y!^m(w*q?ro&My%=nB|QGxXoQ(DbSc24W0j)*V==CT5`82zts> zKr6YWPz7%=Hh_+8VUCfVcEtkASTq3swmJ|iH35;`R}eFhOyft8&B5{a@iW$%6ob)d z&*%R^LkSDtw5x-#=NKWOJ=j(fjKQ#;7!tx5XCR(|gh6R)DI@~eynO?+z?c^xMd2F+ z%y6gECtmzFDKMhLQm}Sr1yHLm5g_;S1IEmVmoT7BD}bC4;OR?N0CNV#X`Bi)#ZG{n z%HuEdfds=cq_af8%m)$y?qdxr`a~S?z_KoRg?$3a>L9`R4Oe6kou+~i1ws)$?KO;b zWE(S#0kwVr`$6f@;{RJIN-$7k7_dfQAe@#FYlMYmtP#u@Os6#h?V?XHoc=b(VNS9@NPBA!ym^MV|Lr}UUkMW1`Z~u!w0H#0- zbj&{)YCw!(`D^?E<4Eua1{A`-xKFkGu_?s#qIYWkI0n)$-~AW )YF_4a)Sk7|)+oUI t4IG6; zpMVRFLJTORlRo{IUS~6Fcw`^_q*1DsM3Y~WNLXty5Ya%wCfeAn9_)uP0v!0P765}p zKicfee-l9K_8w3})BPCYVXHDw5*V`)fB}ITw}Z1I*aDKTtN`XrHce}1HWl~(=2nR& zFDGH}Be2x<02v*P26(qhmXieo|FoQ7M+N2M{_g57YalHIX(^QbK(5{rwk26`Ct)*i z5;g-TVZfe7R~fDM4g@&=O|2>e{;CN;`|gBiC` ;PImJ&@?P9no2 z$N=`1m hHp|0aiCSki4JTpJa2j3ZkU>ZD>*j|n z8wzLc{OBW9|HZLjZ*?{TR8=_L#e@``X2U+k!bAxJ6AfUSMJJTQz9;7GQmW?706e M;$qJ#m720*UMoKYMg9EOB=P%~hUKKh$w z|91}?H5 h7*T?zY${J3y5Qskq%(zdSRIN%DHNN{E3Cr`@HaC{X?zq6o4KkE zh312k6y?woqc&t<*k#9h!`2M@ug;=CD!{o+A^ou~u!l@$3qBMfO4^tA9}FNBX!cVm zGa)`S21lk~S5}0M1iIwFKA>76)Uk|2c;+;a3Ye~!>ZbjqkoLm{38z?z%%KQLr0IMq zg9K41C9=>`KIO)A$8QRE2bjYVVq676dI5Z@6$}Mbgy9PohfN2 r##=xcd#OaMp`t&orn z{uX0lV#G JEw=#9xyRl(OkSDVq+I>ZSvwYD2Ye@7^_VYWP&xvg4?Y{{~Y6MbC+2 zrw)U?Kzf}eWltY7pgJ>}H5ZN)wU9E<4StK^H`WJ!OIk=72nWBV@LNa=3@Haa5#7s> zLMh{5L#h$v$Cklg%s^;9X584ops68~rw4{j9NlI@c+h01CZh`sp`+z=8PL;Bj3_g@ zfe}@Y_A;W(X_*maQX3W`-bPdtN8HWL#{`W3kQc^D!YoLGXu|USI?kzivd;r;iy? zHgpyGRfd{qW(*JPjVWVb@zaQEP$y{0M0%7lJcj?&qZ5rO2Ypr+7!!+(DObAK80wug zhCue+n6jW>7*m#@&ktj)PeT)+m}mkN{Y`+;LiB5v31v#}M8DRWP$u*Z6R4GALfM1M z79;XTrqGtLDP;pYC9bAm9TDwqN;w >pVZ|egF_~U zuo5y8w&qEASiqP`6GP}%rc@)f5^&I<(3G;H4b3Ps;E#Vx&8Ygd;m8C2V}coF1#;lu ztIUAq88Z<4m>C$O%nWR0Xbv9m6CS`$kd-+MMH$`R9LDBcbIMxHM6RIcnNuz33+ABM z8*_-j56qz@Ckx7&*0+GFBHG!4a W09{KqgG%4BeLQ8`Il7$VgfG6C?<`CTbqD`;ecY&_<0A2@() z_&48HE1QlYC_!UOwLk~9Fk!qc$OwnCP~ p+i`6RC!|mzy~qv} z6f(cF&~KQB5V4LC0b)X-8~cn_*lX&TvWrhf8aR!J8(m@##!#>vj-Wr_EE8@Pg;b5I zuuY1EH*wIYM=Q~9)-V|GYN!E)VCp0-1)YO_vqpM`ezR(uIYKlAZ^RYaIckZ jZgje`$j3M&_gO}iRW z7AhQt45TcclQK9C{>C$zfs6%MGB#lbgBN7=gK}ma1A&D3o5dM2245J+*zG_WGgHFf zEFC)^!>K8zo{HT!lQH{c1~N7SB4f9&;4Kn{kjYFK$e0ua{L41TBnAv*><*8NS;WKN ztbpv=TE^_E7|7TqFB~hw?W$z#0TCIqAT^LN3s3l$Wz22{$k>&ej9IZ6z$rIIF!qRp zj9EfKIm?(icwiu7mn1S~DFT197G%~2DkxwzVM4Y6oQ-B0X1hejc8QGb5;@x?Z~zd~ z$=NP}Gyd$~OnY*+OXO^qfV(o!*)D H+n{ANo5;@x?aHxrS z&UT5M?GicLCDkS!7{dX>DMt&8&fU9&1cwI(Bd~?mC!;CFs(w^E`os;&mM(AslrNz} z`%$i04vi=wIvxGznsD5FG}W0FM1cc4ucbU`v*wgJOvAXUcXR3;4@T9Wt12{An 340Qs)DKN>Q23=3q$!&Rb_C#)b|&aU@2r^qz1F22m88Hjlqi{oq+$>p~KYhu)u&I zg9yFF|J)0^pKTs>Yw+g7A07?ZeKvRGhgFAM&m9_cbLg(+-K@{VjH`du$a?vhJ-<7o zIyf(kS=;O1N!#O0zE3YSmYn!`b>Pn0RhDV({X%!Vell>cemVWBTh`W?i>Ifo*tzX| z#Y6L7Zx7B&+2wZObZ?bQtwG(oC(QXBVeNf^vPrO7k>qxHdGB%E_@Ad(^NS=M9>4z> zU+7wr@7AVg^Lm#?_dk_#UomQFqX*6gRjn^?-r$kAJYq%XqG9>w70E;GE)*o>xXuf> zu(aiqp$4a;&!6uRAG;`b^P`!P<-UEIFN=BEEc}jY?$~b@cC{bJN3_X|2vNECY;ft) zak$-8zxr0^GZc$E)jr?6_CJb-=61ezew8+hFV(-~x%JX72UoA}7uL8qFNuHgIN__! z@*8%dy7? V4?k*qQI}l%PmbC*&^dL%v6Mc?Mgc%+gW_6 z)ivpJ(rUxIK3C$i<9%PnKiG0`WLFcUjo<6RUE9=!{%Jov^g-w4Z9%ha(Z(j3OX@Ap z_lj2~_$1qf`fpC{xOhnNm&8y>argY^?YB4GyZWy6GDF64)od_ti}!5bgiSlmtyIC? z<|jsfIJL!RX}>e&6Q0L{PQ6Dp&mQo+b4Nxa)Jeb?I>}n!aY^j8u#-g};*XqvwWvW+ zU6s>|g5i6WeRrw!Tb*AzcC>%J_{NW04680+Ue9?iMYYq+2lQIlBgK4bOiP1cE1TYp z{_QzF{7#hjDbbKeoxyZhPg}n*c1;`8#uYIt-H}|{v~#3uarcC%(~DLoZaLxKc8hS< zviweTiM)FspQg{enj;q~P58)4r-E7mS^58rKj^+XH~#H}%w^_M>1gl%i&tkOD y}+G%t>7|VR*sTHHNYmEu=9`iY#ysT^zJNYw5OvDK5^L zi^l8EnDWN#W%E}z8>Xx~byOd^Dk45@?*t1KJwRxQx~WmyE%~`-X5I2XPB}Bv(C4)g zv;ofGx5Rzhf#mOfp2v2(%v;N!GN#CNN1Oab&vQpj-RNgoKl8+g?Hk&h>i`a+!>+~C zn-)hKd5(JIkujkCD7V6YpN)$cpg$`q{Oqcz@paEU?>1?@S@h5oAA?k9-UbHtiXC-k zS^4Fs$+fD&yQK1;QKqZ)+K+zPcvZQ+M?hk*c Fxh*nqB8J5JO|@HE+JyLZT~a8)fN~=Y;65wvYC(V zIrmyi=8fm|-S|ln7*gso`l;Rv&ylBEk9+sX^6*P(o!bL#+dK-10W~H=`}MpnmW-_B zsDIVqmg2+4kuG~9=YO(sn%cO*g8P#Ct o70=hUu~Oz%>P!V_w}^Hhl>vc_i4BN zcj4!mg~JYc%#dUXN~>m_a8h-+Uo!mR{Rb=VbR02vaeVHpbx*$aTXr?=6us)#z*|>( zZp~Wf_1iN`di87Vh}2&L1|Q3tnDce-r@Y|4Kl^Q%? tR@ zZ+^Z1oO x6KkIV9A-R#o8%hPjLUq_1H z?CW^!Y{I~~ UYXs_JanxXvEsN- zQ*(>v53Pi$UsE3{23_m3>DlPv!&{WS-Lz?AdfqP2pWfwCk5f;MI`wFLukO&-ecBxw zXVUvZkME~mzpS65O8eFJRmV$aC+80B#!E #55<( zwde2=pDzt^x{?<4J#Nev!{O085(X$=(mO(i`pmnU`^>A?gA9H~-{PX-9iESIEX*h? zyg9O2(w L-T@9)GJYa>)Oct?sn1MgPTv3Df7ze-C6tCY)aU;jTN76 zWj>I1J0{(s)HCckUvcRvZ@Hb%`mrj*9wBSnMNRlOYVKu8#n!~d57K_#o}B*c(9aG9 zV-AJRTDD?|?eW8(e}!Br74$K!*e$=@YIi~I)#A5zo|bIwkZ0ec!f#+*+vK*jzvg_q zpIbiEV#|*$3v&k)B=ZZy6))etFShGeF)>_k;{1}*Mwf=CL|uQI_T|%|*G3^#{cIi= zudq;^T$5dv_Lgq Q&Xjg%9PH0$a`rGmMzVv%G zw8NAU*{$jgt( wPJGR@JJ>QdkN5lB#b=qS_z_gIi&kH~<|}Tm=n&v= z(=?~E&%S%+9g@cmfduf-TW6|5k9uwGpnTJ-K~|RGv&v5qM+}b?Z2mYiIK(5VQQK`@ zj&5+8cKmqAF7dj~N0*eJJeHl|8DcNX|KYQA%c9Y_V`2pU*TzIvop`%B-QuCW`_yk? zHXoi?uk#Yu_c<`-_WqXpi>?}O=xdy_=F**=Cl{r*YaiKkO6=ZYD^4Fi(eBvPC zzn?2s={;|_rvrVmCuK>`@}Lape}_|+Tx={uhaW~$gXnLwC}( dh&3qyZ+jIO`@t-t=)xFyaFn@mvz z%!wWy7G-0ekJubkT~E)r+PV9>Md_1mo=}l>w~8tzHU@dxUrsDnJkg&$y!$Algw~Hv z7FeA#4vD{JXSK53SF41uo5e?;M?@$GO*{JF;M tb$(DrP?*Ec!ZEmWL9V)wS|H#SY4g33u%)-3J)(#a@J%&2V%FyYck0o zsufj}-f%2gU6oyv*^j^$z*T)mP }x-u2X*+q9d7+-g^oUE6+r zjeOU@&vEgByEY^0?vu3r`tkCy8S|^Iu5@o-_0g-9m)XMEs%Nb|s=~fs51!~UXkXT% zuB-Da+f*DMIJ(Q0M)hW^s-g^yWVL2JrjrKe8PR^{r|?RTm2Wk>`6 C#K< zo1TtY-F8*8v_*9X_KC}AS?Ab=mLu$LbZBfJ?KW}q#|rV|)KZHp? soGuP6->y4h4ZJqMG3&X_26=q$|B$Rh9 zuk%!tdSr_8jwR3Zr5!&mKHD_ZWucva=nB^k1FuBS_wTsk!@Pn8dzQsNKXRarV|>bJ zuLze)y|6Xcp@IJAJ|yoL@YSVvZ~OW!I($wzGUQA?)LFgmNkZYba%t@G?-BcwEFQ+x zSGf(EXB+F}Oe?R%)j`sk_cricT7PZidW(ZAXPp_|H9Ty|gqNu|8n ^Lw=(F8vvOEw`ib2E^?#fAgIS(E5OkdhT^S zJGPm+){sB?^^lE))~oeY8_x}|e7QRG%(R$xyqwV;C;Bf+-__>!hQMUYo=@!D98YW; zH8jWU$o%1FSM&L!CJYH)UT;kkm$kL7#IzfiVY{}D>1V;Hly0J2h493ZR*~yX=LfyX z;PC}5hOBx%=4SjQn-}kE85v(P6#b*0oKvtV>?!Ys)AgBcN2Sn9VpFT`EDKa6T|e1x z;regwqJ2*8mpC2p9)4J%LX7+?Ck8Yrdi{NKcb>aKwLWQ||2r>O*UUUMZYzN6I_IQ@ zNH#B7^(xD2rBFBO4*1=&{DfhFr%&OzIyR4HnfJLp`G!&5PZOS9e5lvUV9?l)!b$mo zi63Xwnm_;9Gu496#aBF U-vz8 zXmeQ~H=BsshAs9l_-FWxbM%>wepU+(D|a4tA2_4+%UfG6|Jc9lfX#7LeAJPW&yT$p zb`HAukM)+2t~2`0JTlYzpAma54tLxyyO-{NsKl>ZmVNh+O|SM%dw*%xy(m?m^)3~O z7uzaSyOR4IA0JuRET@ytsF7Wd_kY~BnSa2G1LogbycxW#RGNRdD(zq2n;C^pKX$Y} z(BtXQ)U)L;Z>QFFe(@ I&?(z$_t++k9Hck`) zCogk*E`Q#C#ev+FC)!ms@SQ&Fu)I8cg?!qr@zXqep6>s!;nd{x{cq|! cj z-Q2bvJ-2U9gvpf1IvIvV6W5uwf3x4Vm{tz(f0!5&c>FY_nwBu@_~6M)UVro&ctt*W zjn|x8#|N!$u`TZGWnsAJyW_tb5~t2OeSS~9inYr|n$NfBols$4J~pay&D17kpH{Ux zF{wktN#9?*pfg&2T(C*szfc^ywC;q(6JB|>?4J>Q&}d=TSAt^x^{Y|qo{j7yn=*2F z{HXoQVjfRU9FW>^%FI3<_f@sdpHWr~Pqxk(d~UAXI>2h};Sar2zRbGSaL%Lk Hr zG4#W>g*}osId%7X9Mt)>@xfj*sKZTtceh;cKL3!<<8SYS@>+gPE6hAnYekGvYI3Hb zl{i7MXxyR)tG=eWO`Vo_@y53Wm%8Rjf9z|u|DCFEw!^dAllQhw_i3Eqv~Kp-r2T2$ zp-y}Je@@t3y!1zMNrP!6yNiEqZn3z+{#3iIH~K{kc$OM=di=tqvUd7m%KDA^Zr+tP z;79-I`M$%GTsB`8G$=^BJmBuix3WpE-G`>ne9|)0DQ{n1(1FJvJxV?|zdP|mxxClL zbw92j>U-_bkVY$Hwe~C<+x5!RCl|{-+cX+0>w3D`g-7jojC^-<@bBF3?(rAejE5s5 zY{ry5JOX kVlXmxvEZEelL?tTu1XAPZSI60H>7vcJ(*SRkHIf*H_UjJ+I@ul z0;QMJab2r0snxKufdRvIwF>$1v0c^P-q-sY*a%iNEQmZ^6uIrC$|iSI<&!w`xQv9) zb58b{A99~R!)c_a`|F$=UV#ILTK|Z>my;ZNuw`EBc}3fgY)%;QLe=(@{pH{C$%fk- z96Q|P@sk7IZvBmdDst+@KdWfxzfxAKvyc0uhCa=Q?meIK;qtux_xC*O;Cu0csJMVm z+rPBl41q=H(~^BnI|W8HP=^0Ar=y$4GhU2qa<9@wmGyi}V{Pj$58K~spz+C-Hrr!u zV{b*A4|sYky7RP7D>Eu)?|FH!N)_E)UQ&E<#0azQoiA7w#3z|qw~6TF+@jf~Z9l({ zwaztrVCeb5f5Nleg*%tuA9#hgVU?3vi_$u;NG6V^#&It7XF2sAJ$!DQ?*xm|yKS~4 z=-+xfCp^evlY655ptDz!?dmS?w||uQb>psahU3h-gB~iokp`E8tR`4YUOk}>aH?OH z8^3dO=Il(6En2XoWPU57+CI(KoU*Gh-*SrQUeEQ}*fonfI!u@}*Ea9a>GLyP>`uSF zx-(yI?30)O*mf9UbHlyYu*IS+xto{HTh3c&?&K_5|24L=U!PU_!-57*P@EbuqMm-= zQ_Uk{u2;skb%z1h=aOl?FVFO$<&?1o W`lFRHf+BBq0W{j2?-g7gj`iiHe35|UT?cz>0WjI7H`In^L8t55A|(gi#lf8 znh&uZEqd&j;yrub&M7CMwsPo>yBk!F_Q!lr8!oxkBI9OKfk$jk{LX{d-rC|S{l+fO zB)J@nTyx`cg!?>IT)nM@jpuwe9~i%A!;K`zwyiy#du`o$zM%`K-eSGElZ)H%^4N}` zx{qDGK|4*#X4N%MQ$SxXet&i6sr1!73MYPR=&Q 3dT%yMoA0F3|V$2KUT( zF!Iu)xbPoc>W|nsyWZ-e*zm^tj`i#7Zw|Dv9(k^VJyl8h#qUdftk>JR?} bI6{bdxJOq=zVlpgYQXQ4*dN2>^)CD@Ivb)f?mDH=gv4C@$dAj zS1MGMPa}fgEq`KgVNsh^5gSIW%-iaCi$0QT6Bu;gx_;=4lIcgI9Fm;A|IAZP&ZV6C zWq)ng;#%~L`vZTBJlbKgf87N??d_Y^*)#v}ohozjoXKaK_BhwBW8j=M6BP{#hKD2_ zoffwK-~N||{A?FKW}V+EM+f)x8@12H_BQRSvp>pTo$;Ay1m!$l>DLehW zb^ZLY3&$(X%f|hp&pBtex#Bg&;=AJ1w{f@c*WJ@&>(c?{6_To#o`DJT_BMH782c$I za(3jqbD5s5NmfAtpRc?=FmY$z3z*t$EN%_1|NQOkuRlzGzIyTQ^-aG=360Jy*3UZ7 z&&hK}NsdDuapkDOTH{q4 V?adVL0ezC&<<8#T&?)cp(XZ1LZMP-|Za=iI zD&xoV>z5wyIrIBr j?Kf9}E zfD#{#%<*ZxYOOFikgUFu)D*p%7L)Lfr@9qS3w+|Z+JaCd$%=`ha_iKzpoZgJ)hgpd zeAU>)+h=IW+$fgPt6RhVq71Gjf)>;ZQs#}WYE7`K?gk5}O*O8%#mqjVzKGdO?$Ciw zSp> 1 zcBdVbWmem*lvy3xEw!dp3c8;PvE;mVBZG3xvTrJ-U!$!gaA^~+j1L4?lNY=XDLW#a zT2QAZQ^9pjxH7X(U#&80saJcbAvIbG&hIgmIh>&!bM`)n%v?i;2M%1~%FNEcmNPnt ziN?jzY%0A@P2L4J)M4*31H)J_$2F?801uJk0mrCbHCj!|S`ELlQEf~^IbvTMu4?p+ zq%2h>gB}9TGn#XCWT&SA-J`u;jNCW1^_Oc$FHuIV5Bn!X>I-%rUjNd$=bF~3GaSAj zPfC7sx8iQVnePV;3-)$RsA~S9@y{Qv=G9WUj5W`1@wB+rD7|-ujkle<=QKXRabMkQ zy)V|@>1 {ZX`g@Zqc(d-@)lX>}xS!2*6ZJ*d@;q{d@BcJMMD`8^J{E{SM4WlUN^*_I;% zUMGzV+T+rz-la7Dfdo~T%V#r(B=0CVGpT>Q&-bo2_59_!GH3TUy|9pFM*cy!Ml{#U zXk;)t^mj&U)vVI(QJY eyehqi$q=ZQ8!fw7~mN_RzFJHdco&2wkm4zxg#g z`&FwwqQfo^`uEu)nc9zkyifeI`RzN$y=$b(qfVwge-TnTYj(=WC#u=+JkP0?9XP(V zxwWXkeu6_x^2twr(~l0OCvLmOYxwlL#A|%!KTmJYN$EWzbo)l(zGrj3?OA^FW2AM^ zkO+^$%6AI~H*2zX$;;n^*WT>*@on?(`x lH#?P=P_suPLHR wWJ&aI}X&aCef-`0K9FDi0y zYjZ2JF8P-Jn= sa{lsl%Y^6UKd<->nDKqe zrk*KN_l=xxS=Q+2oUzBO7kfQSez;MvY0aX$6Ds=3;w!y8qmDI@pDo$C>3bJjrz^u} zTn%1+)XXy~+IXa1)QhuS%8cg-&yVsoS&*mrwW3wP(42}59WI`)ED8Qn_Qw78sMDz= zs(_P-f6OPtJwG_wFt0;Zixq5~3pz{r)EMXBmMirb%MKSZ@Q8oT-et&)ul~iMX zU&e+!=G0lW$~fdT$#N*Bs2V2 #A0lg& AY39sAjvb7plQ zK!A>}_kg-vllA1-dMW0dxdw{y6#3#I^|nU4$=UgpIWMP`9?J1dapwsYQR7Sjmt2D8 z|I)8tP@T;2@wI9Vupn;aODd~I)4}0wXdn!Eju~w-hBBxPB^bbdeM1G;Xf=4N395zD z^*+FK1b^Tfz8@$XUQH%az?_ASl!=*FceG-{1B{vmS5m`kG!mQ<*UqWTJ2=%^00%?3 zEAs~xUZaC4Flt-G^${q>gTwqcRjOAL5K+Lrk-w-#<{Xp^#hCA7J^sWRAub$K2TN_T zWZsOfHkqUI>j(+- p!s&%(=;GLV)d%-B+3M#WmtxCAM9n1#?eKwaR#Kx@H}* q1yUzxhT83 z2yMd0s|&}hlg|7j==T0Ug;F_eRq8~P`j*Uly;`#)66AICz^43PH8`DIPCI+S4+>_ da$5pROhU2 zxv-^vx^mk&AQzVTH@=dmt&dNy@eWN)bY z`X+W>*XvI{4T5Svh|C$_U(KUG!+FB>~Cxr?v0 zuaWV#P{-ZpR>qc{3156u)ha1%*R=iKW$W6z?YP;f-Me7t#1%W&4@sSLu%KXL#CLgQ z-)$+)6Pw57x>b0b@oYJ&uS+MtCKD!X?y*(=B=+|2eH-|TI=)!vxV-M+$nuo&cFWxY zhW$90zxUattaXW((r>Qq8{01X*s-`tukzF1rs@wFb!eV-`@@yFTh{6E9<1FFpvrmI zFvQ^8Rr#duVUPD4j2$#I_VewVm)yN?MqbKZ;XQKAKRb{A`_1d-mb^}<$4P2AmFxeS zJ$K)a6QhT0x4QP>d#83^-rhQCf2!#uVP&>i <7 zU|JMyc6x2LMaN%8KJB0S{CZyJ?B3BgYKiPTEx)UlCa!q(@XnwUPCM?_IokQ3oRI0K znod>Ry&k$Ff79E=zE3j4^U99yx$ E(A&0gEqIoqnLmf%81v&U|`w~RGTpS*a5-qb1I7E5 >b-Nqi_YQqFRn`XID19Vz8zbuj;&g9>|Q_B;Qqcx^MZ_5 z7TMj_fBEWjS*Ho3x(QE|SZr@zV(EMTSfjdctd{p__S=ps-j%WHRb;1Yqob!9XZLf9 zo%FoivyXJb;u}lGN^`uZI=7Bkb?d!(gQN2L$2$96vkUqzxG*3kdUtlSGh0UP`kH3D zHpw;iVzjvT$v%?yE5E$c^WSJ+^~_H7yvv6=Z<4 $JVMK9+<%DCpj~!vEX5Q(eQhwmWyw;athqFw>9kw!U27;OuC#(E91OCwM1rYT)IW zyuZS`Jhs9%Ml~<;Nw`OEQQHQcezhsz=k)%=^=THAm){6r@{)h~4s?fq`4+IE^8J@@M?d+O- KLRZ zwV}%<^Xsd*B{1cEf P$*~l zzSJ!@ppS?0&D6}tglQ`Y!hi|O{6V$ybX3kVA3Rk}kFGVve9vf#tm%zYp+i`{9mCb6 zHned#G{JV@v1;Y<;e7ONGj2ybO-s+4# <%YcLcw=y7mXA=tu JFTRseaGmJJZc(fx4`PuV~7h=pD1P<{T8MrthF` z^{%GKh29mZ^_)?&)uhgJtJz=yw(0v!xk(hiu_^PWF@E)Z7`#u0OlL ne2(HE+fFP+18Vr*nbw^w2MAQj(Um#+}J ziXEM+A&@e<+0h=+xK2O}-=5}2tG&dI-lHkELqeITc?)8+^xqLZt5UkAT%his# x0q+jNOC$b|Tt6I5g z9@vBR&{lD3dPiM*z`LH z&
aLN?ug;Y+N65W%dTP6~q7gV)nD(GUF2)-> a=-!8mmI%1BO`loU{k zUrR@HDot3DNoD9(Gfrj5G?8U!WzV5gkiH17#1k6B>+ibCsle3m*$zTG8GO2e%S486 zoz!IvudkC#@ck4VIw@%__&SPIMKF<*ArKs$Wb%jbAXB1zlP+U;%be(9$d9RgMx~w= zWO5PdtuO%)mVs;p(eJQIA-YM9FEQf?gRd{CUZxVu d73)6b#%gJl!~m=$3B!T+>Qs1Txir?_Qou&7QaLVMdBIx#r`D)0@B96BkwRgo!E zv6He)fp2W!5dOjY6$-MO6iSp{*R87*pf@ZyWkPi4lTMjRrWB#HxK1J5Xh5I=nNmVJ zp%P!3#HovKfZ&wL$tho{K-Ujo`)kdw1TGw5AXSd8h|p;eATZ&CkQ7I0Vh$aAI*}-= zK4eu4CW1Q|P@b1lnGC@&n$WF996ANMVuDkqL^qr0mI(#ul#p(jN+?A4Pv{m3MZ|0e zmqMUJLL55yI2BPQ*NkoT(1yG*x*>v7SBZffvcJas5CYIXg)X6pgmAzDT_M4t!&k#| z%HYF81f8_{$ie*&U)7Zns7(%Mst6N`6a;F6?-&xO4YIXF;F61l1ZtCuRU%@3hwCzk zkO@JL04k91A%F__IoWjpN(e;&l;AD_{k7&7D+#0mvjGu& HdBA3FKr@37X=_)z~H9^b{atMLMn33XZ zO?5p;3TLQ_{wxKISdt@r9*mFzuHbapgw_`1BLzA5q)K#=jII>u+K^Dx1lmvHJQ9*F z4r?ir4z?doq9#ax16)Cv6Yw9Q9N;6`d^3`Qe1vbS;YbD!N=OTv)dA21zQsqE9O5T2 zreXdeBm?k3u!q1w))k{G4LLmUE!j|34R*t 9JR1kN_1q8Bc_st%qG>MjS@C!mu&&H(7_E|dYBss{(uPx%P1iQQi_@&aHm`; zC0$1;BLk}vzHcSmikcv$P>_zU1jxaW7P=8`-a}2Ga}_#@DE@#GV7)|)3xxpk4@Ia6 z0(>h3 3P3_bye znjjT{k5>_jh=oK{fZzdHFDwONeKCCNlxt2g2>}(b7^5pt6QtJxJmC&v1zPM9&B7V1 zPN~oYF*5-|CmjvGNkK>pR;QPtCWry6fSdUVj(}B&F(QFY?o!kQv4&E>{6HuIAKc_d zLj`2uXyHz1g6vedVw*50+%-+O7Wh1Ts}f1UMJEu82!I1oos<@Cu%(Nj2^E3E6_Cj! zI070bl#}9{cy&D%&< 65q# z!jLjR?_8&XFRPMtXd^NWq#!*4Zuuh&E|U>}O(BCMZvbk7n4c7YfJlx?(%|^;6lwz9 zlBa7sNIDR%4Qn03KIkxrUOF^EEV~texry$C@3|9_$>A)mFKXfs0^*ARIg%-e452~} zX9`nL6P%QmK#ZUQ5sYERArw}?1+EpS3DS)rz7d@Y7AE4F0 ^i(!^Z?t!>L(M_A|^qlKt`-il>#{t-C-Jm3t4d!q_|1~Bq$+M zLeK%|q0RRo;}Vt;iim6w F=1}>BJg<2%Y1qUZq21@vx zFW29o4DO>vO%RAh2>^$%Dtt _d=8MQTire3OL+9MeV`T*u#~X*L-L2uWD~q#SzL;mAT~FZ0Cxz{;CokuwcvO( zE!+=H5YSI40i4I>2x(z%R8m5^hK@l^kmCowzCtJhpOPmG35guK2sc3r2onY&g_7)c zz&W(b0c1{sBOD;&PHqqy(Y?635l9Nl!cf!%fnk*ZZMah`lo6m5R*O4I~_6(HM3 znodgY|0p3{K${ AT}1#P(gCOmGV(!UpD;1Zg+!;KmH$301)=vJ zQvNV+6EhQ(DQLYzXinhHdrHV(5j~=SH5Ru=&|FNEL9{2!2&ke|DA~nf^+Bf;z|sX| zBBy=WStYhdp^WTeC7eaBKuwUrTZzAUtlJk5BnWX){-M)hXo5&d!A1hv?MnQy4^Fd? zR9l9cKnE;1k7T5~Lkfd1E~NVDQq%-FKPwePVoa$d(;83)A7#u!T}%u**u~`dDr9v9 zTu_S2xC;p=BN7Fuj5{%+GImDPb} dfcu^!4GqPb*46WmdZ z9&uM`P*!bYjG0wY8NAMen&1Luc!aO`uHI)*2JZ&w_9H5TtJP5x+!zXv@Fo sNh6-C?gWF64(IbqGu@6?hC08O+d~H*6~~> z;9G WTiWcdxhbG`VkZ>BE%R~xC zAc- Pj1Z5Hwg7K!gdfOO2PYF?&qcMEaiwG((+6hwwdgnqX$hN8v$7yyFU}IKTZHIt4 zG$D~n@%OWIOe2-TOHf>4;2R*^E`h^dg!!fLAq%1|><)5$L8^isK7tT-=?FrY$+`X^ zg>(iX4D2d#M+uBhE@Xx+S?0JAvcJasGB`2B^>j#l5hDV=s6qr48M#b{&tBs9Ep)63 z%h>8e8}~m X0s)ZFDNOa= k6OD zB%zT^K@Ktapb9Z^AP{ob;;`OjPlSN}8uP;zH4!r5)l |-DV%Wh< zqO%xA_J@_Wh%gNt6VXK~hz=$|t`o{(I^jB@98P0$yAzH{5Mdd%!ByOhCPWV*5s=`d zl8)3^Xc@6%46zKxF~^T!6P=h}AcM)qfNJ 7(1S>Mpxp|M z6FRZU0W_6!$0uw_NNMx)C`HZf1(1lla|A~N$n_>fFK(&{= dx=sx zCQv>`6etpom7~BlP9z&URvZ8aG$6k!P voidfraction = name of the finite volume voidfraction field - interpolation = flag to use interolate interpolated voidfraction and fluid velocity values (normally off) + interpolation = flag to use interpolated voidfraction and fluid velocity values (normally off) diff --git a/doc/forceModel_KochHillDrag.txt b/doc/forceModel_KochHillDrag.txt index 39e88529..fb67f9f7 100644 --- a/doc/forceModel_KochHillDrag.txt +++ b/doc/forceModel_KochHillDrag.txt @@ -26,7 +26,7 @@ KochHillDragProps {U} = name of the finite volume fluid velocity field :ulb,l {density} = name of the finite volume gravity field :l {voidfraction} = name of the finite volume voidfraction field :l -{interpolation} = flag to use interolate interpolated voidfraction and fluid velocity values (normally off) :l +{interpolation} = flag to use interpolated voidfraction and fluid velocity values (normally off) :l :ule [Examples:] diff --git a/doc/githubAccess_public.pdf b/doc/githubAccess_public.pdf index 47c73839a7b12f2972a84f4857be18667a5d3e1d..4b0b8cc69669e4fad29cf758bb6307456c107176 100644 GIT binary patch delta 109 zcmZqc7HjJko6yE-XkcV)Xkct++}PjR&)C|})Y{M7+Rw7JpLJ%7lSzu9d6HRLYO;}0 inxUDIL9#(ol9{E2v5ApIs!^J`g`Eu{71Og?S!DoRHXw`u delta 109 zcmZqc7HjJko6yE-U}0crXkut$)Y#wJ&)C|})Y{M7+Rw7JpLJ%7lR=VsQmUDGqM>P0 iib0x%iKUsjk%5V!c~YWDl6h*Xv7HSe71Og?S!DoX7$D#P diff --git a/doc/voidFractionModel_dividedVoidFraction.html b/doc/voidFractionModel_dividedVoidFraction.html index 9b019a9e..a07c2403 100644 --- a/doc/voidFractionModel_dividedVoidFraction.html +++ b/doc/voidFractionModel_dividedVoidFraction.html @@ -18,12 +18,15 @@ dividedProps { alphaMin number1; scaleUpVol number2; + interpolation; }
- number1 = mininmum limit for voidfraction
- number2 = diameter of the particle's representation is artificially increased according to number2 * Vparticle, volume remains unaltered! +
- interpolation = flag to interpolate voidfraction to particle positions (normally off) +
Examples: diff --git a/doc/voidFractionModel_dividedVoidFraction.txt b/doc/voidFractionModel_dividedVoidFraction.txt index f3b56050..4c59e90d 100644 --- a/doc/voidFractionModel_dividedVoidFraction.txt +++ b/doc/voidFractionModel_dividedVoidFraction.txt @@ -16,10 +16,12 @@ dividedProps \{ alphaMin number1; scaleUpVol number2; + interpolation; \} :pre {number1} = mininmum limit for voidfraction :ulb,l {number2} = diameter of the particle's representation is artificially increased according to {number2} * Vparticle, volume remains unaltered! :l +{interpolation} = flag to interpolate voidfraction to particle positions (normally off) :l :ule [Examples:] diff --git a/src/lagrangian/cfdemParticle/Make/files b/src/lagrangian/cfdemParticle/Make/files index 4188c2c5..94a1da27 100644 --- a/src/lagrangian/cfdemParticle/Make/files +++ b/src/lagrangian/cfdemParticle/Make/files @@ -1,5 +1,6 @@ cfdemCloud = cfdemCloud forceModels = subModels/forceModel +forceModelsMS = subModels/forceModelMS IOModels = subModels/IOModel voidFractionModels = subModels/voidFractionModel locateModels = subModels/locateModel @@ -13,34 +14,56 @@ liggghtsCommandModels = subModels/liggghtsCommandModel $(cfdemCloud)/cfdemCloud.C derived/cfdemCloudIB/cfdemCloudIB.C +derived/cfdemCloudMS/cfdemCloudMS.C $(forceModels)/forceModel/forceModel.C $(forceModels)/forceModel/newForceModel.C $(forceModels)/noDrag/noDrag.C $(forceModels)/DiFeliceDrag/DiFeliceDrag.C +$(forceModels)/DiFeliceDragNLift/DiFeliceDragNLift.C $(forceModels)/GidaspowDrag/GidaspowDrag.C $(forceModels)/SchillerNaumannDrag/SchillerNaumannDrag.C $(forceModels)/Archimedes/Archimedes.C $(forceModels)/ArchimedesIB/ArchimedesIB.C $(forceModels)/interface/interface.C $(forceModels)/ShirgaonkarIB/ShirgaonkarIB.C +$(forceModels)/fieldTimeAverage/fieldTimeAverage.C +$(forceModels)/fieldBound/fieldBound.C +$(forceModels)/volWeightedAverage/volWeightedAverage.C +$(forceModels)/totalMomentumExchange/totalMomentumExchange.C $(forceModels)/KochHillDrag/KochHillDrag.C +$(forceModels)/BeetstraDrag/multiphaseFlowBasic/multiphaseFlowBasic.C +$(forceModels)/BeetstraDrag/BeetstraDrag.C +$(forceModels)/LaEuScalarLiquid/LaEuScalarLiquid.C $(forceModels)/LaEuScalarTemp/LaEuScalarTemp.C +$(forceModels)/LaEuScalarDust/LaEuScalarDust.C $(forceModels)/virtualMassForce/virtualMassForce.C $(forceModels)/gradPForce/gradPForce.C +$(forceModels)/gradULiftForce/gradULiftForce.C $(forceModels)/viscForce/viscForce.C $(forceModels)/MeiLift/MeiLift.C +$(forceModels)/KochHillDragNLift/KochHillDragNLift.C +$(forceModels)/solidsPressureForce/solidsPressureForce.C +$(forceModels)/periodicPressure/periodicPressure.C +$(forceModels)/periodicPressureControl/periodicPressureControl.C +$(forceModels)/averageSlipVel/averageSlipVel.C + +$(forceModelsMS)/forceModelMS/forceModelMS.C +$(forceModelsMS)/forceModelMS/newForceModelMS.C +$(forceModelsMS)/DiFeliceDragMS/DiFeliceDragMS.C $(IOModels)/IOModel/IOModel.C $(IOModels)/IOModel/newIOModel.C $(IOModels)/noIO/noIO.C $(IOModels)/basicIO/basicIO.C $(IOModels)/trackIO/trackIO.C +$(IOModels)/sophIO/sophIO.C $(voidFractionModels)/voidFractionModel/voidFractionModel.C $(voidFractionModels)/voidFractionModel/newVoidFractionModel.C $(voidFractionModels)/centreVoidFraction/centreVoidFraction.C $(voidFractionModels)/dividedVoidFraction/dividedVoidFraction.C +$(voidFractionModels)/dividedVoidFractionMS/dividedVoidFractionMS.C $(voidFractionModels)/bigParticleVoidFraction/bigParticleVoidFraction.C $(voidFractionModels)/GaussVoidFraction/GaussVoidFraction.C $(voidFractionModels)/IBVoidFraction/IBVoidFraction.C @@ -52,20 +75,22 @@ $(locateModels)/engineSearch/engineSearch.C $(locateModels)/turboEngineSearch/turboEngineSearch.C $(locateModels)/engineSearchIB/engineSearchIB.C - $(meshMotionModels)/meshMotionModel/meshMotionModel.C $(meshMotionModels)/meshMotionModel/newMeshMotionModel.C $(meshMotionModels)/noMeshMotion/noMeshMotion.C +$(meshMotionModels)/DEMdrivenMeshMotion/DEMdrivenMeshMotion.C $(momCoupleModels)/momCoupleModel/momCoupleModel.C $(momCoupleModels)/momCoupleModel/newMomCoupleModel.C $(momCoupleModels)/explicitCouple/explicitCouple.C +$(momCoupleModels)/explicitCoupleSource/explicitCoupleSource.C $(momCoupleModels)/implicitCouple/implicitCouple.C $(momCoupleModels)/noCouple/noCouple.C $(regionModels)/regionModel/regionModel.C $(regionModels)/regionModel/newRegionModel.C $(regionModels)/allRegion/allRegion.C +$(regionModels)/differentialRegion/differentialRegion.C $(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C $(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C diff --git a/src/lagrangian/cfdemParticle/Make/options b/src/lagrangian/cfdemParticle/Make/options index 61f61a93..e24e4695 100644 --- a/src/lagrangian/cfdemParticle/Make/options +++ b/src/lagrangian/cfdemParticle/Make/options @@ -24,4 +24,4 @@ LIB_LIBS = \ -llagrangian \ -lmpi_cxx \ -L$(CFDEM_LIGGGHTS_SRC_DIR) \ - -l$(CFDEM_LIGGGHTS_LIB_NAME) \ + -l$(CFDEM_LIGGGHTS_LIB_NAME) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index cfd72e07..52f22f9f 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -372,34 +372,41 @@ bool Foam::cfdemCloud::evolve Info << "\n Coupling..." << endl; doCouple=true; + clockM().start(5,"defineRegion"); if(verbose_) Info << "- defineRegion()" << endl; regionM().defineRegion(); if(verbose_) Info << "defineRegion done." << endl; + clockM().stop("defineRegion"); // reset vol Fields + clockM().start(6,"resetVolFields"); if(verbose_) Info << "- resetVolFields()" << endl; regionM().resetVolFields(Us); if(verbose_) Info << "resetVolFields done." << endl; + clockM().stop("resetVolFields"); if(verbose_) Info << "- getDEMdata()" << endl; - clockM().start(4,"getDEMdata"); + clockM().start(7,"getDEMdata"); getDEMdata(); - clockM().stop(); + clockM().stop("getDEMdata"); if(verbose_) Info << "- getDEMdata done." << endl; // search cellID of particles - clockM().start(5,"findCell"); + clockM().start(8,"findCell"); if(verbose_) Info << "- findCell()" << endl; findCells(); if(verbose_) Info << "findCell done." << endl; clockM().stop("findCell"); // set void fraction field + clockM().start(9,"setvoidFraction"); if(verbose_) Info << "- setvoidFraction()" << endl; voidFractionM().setvoidFraction(regionM().inRegion(),voidfractions_,particleWeights_,particleVolumes_); if(verbose_) Info << "setvoidFraction done." << endl; + clockM().stop("setvoidFraction"); // set particles velocity field + clockM().start(10,"setVectorAverage"); if(verbose_) Info << "- setVectorAverage(Us,velocities_,weights_)" << endl; averagingM().setVectorAverage ( @@ -410,15 +417,18 @@ bool Foam::cfdemCloud::evolve regionM().inRegion() ); if(verbose_) Info << "setVectorAverage done." << endl; + clockM().stop("setVectorAverage"); // set particles forces + clockM().start(11,"setForce"); if(verbose_) Info << "- setForce(forces_)" << endl; setForces(); if(verbose_) Info << "setForce done." << endl; + clockM().stop("setForce"); // get next force field + clockM().start(12,"setParticleForceField"); if(verbose_) Info << "- setParticleForceField()" << endl; - averagingM().setVectorSum ( forceM(0).impParticleForces(), @@ -433,12 +443,12 @@ bool Foam::cfdemCloud::evolve particleWeights_, regionM().inRegion() ); - if(verbose_) Info << "- setParticleForceField done." << endl; + clockM().stop("setParticleForceField"); // write DEM data if(verbose_) Info << " -giveDEMdata()" << endl; - clockM().start(6,"giveDEMdata"); + clockM().start(13,"giveDEMdata"); giveDEMdata(); clockM().stop("giveDEMdata"); @@ -450,6 +460,7 @@ bool Foam::cfdemCloud::evolve }//end dataExchangeM().couple() Info << "\n timeStepFraction() = " << dataExchangeM().timeStepFraction() << endl; + clockM().start(14,"interpolateEulerFields"); // update voidFractionField alpha.internalField() = voidFractionM().voidFractionInterp(); alpha.correctBoundaryConditions(); @@ -457,12 +468,16 @@ bool Foam::cfdemCloud::evolve // update particle velocity Field Us.internalField() = averagingM().UsInterp(); Us.correctBoundaryConditions(); + clockM().stop("interpolateEulerFields"); if(verbose_){ #include "debugInfo.H" } + + clockM().start(15,"dumpDEMdata"); // do particle IO IOM().dumpDEMdata(); + clockM().stop("dumpDEMdata"); }//end ignore return doCouple; diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C index c4ef7b98..cf854805 100644 --- a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C @@ -141,7 +141,8 @@ void Foam::cfdemCloudIB::calcVelocityCorrection ( volScalarField& p, volVectorField& U, - volScalarField& phiIB + volScalarField& phiIB, + volScalarField& voidfraction ) { label cellI=0; @@ -174,7 +175,7 @@ void Foam::cfdemCloudIB::calcVelocityCorrection } // make field divergence free - solve(fvm::laplacian(phiIB) == fvc::div(U)); + solve(fvm::laplacian(phiIB) == fvc::div(U) + fvc::ddt(voidfraction)); U=U-fvc::grad(phiIB); U.correctBoundaryConditions(); diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H index 099f2fcd..46d4ad7f 100644 --- a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H @@ -82,7 +82,7 @@ public: bool evolve(); - void calcVelocityCorrection(volScalarField&,volVectorField&,volScalarField&); // this could be moved to an IB mom couple model + void calcVelocityCorrection(volScalarField&,volVectorField&,volScalarField&,volScalarField&); // this could be moved to an IB mom couple model // Access vector angularVelocity(int); diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C b/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C new file mode 100644 index 00000000..1c42284c --- /dev/null +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C @@ -0,0 +1,273 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "cfdemCloudMS.H" +#include "voidFractionModel.H" +#include "forceModelMS.H" +#include "regionModel.H" +#include "locateModel.H" +#include "dataExchangeModel.H" + +//#include "mpi.h" // only for debug reason +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +cfdemCloudMS::cfdemCloudMS +( + const fvMesh& mesh +) +: + cfdemCloud(mesh), + positionsCM_(NULL), + velocitiesCM_(NULL), + cellIDsCM_(NULL), + bodies_(NULL), + nrigids_(NULL), + exCM_(NULL), + eyCM_(NULL), + ezCM_(NULL), + VclumpCM_(NULL), + SclumpCM_(NULL), + scalingCM_(NULL), + typeCM_(NULL), + Cclump_ex_(NULL), + Cclump_ey_(NULL), + impForcesCM_(NULL), + expForcesCM_(NULL), + DEMForcesCM_(NULL), + numberOfClumps_(-1), + numberOfClumpsChanged_(false), + forceModels_(couplingProperties_.lookup("forceModelsMS")) +{ + forceModel_ = new autoPtr
[nrForceModels()]; + for (int i=0;i * forceModel_; + +// Private member functions + void getDEMdata(); + void giveDEMdata(); + bool reAllocArrays() const; + void setNumberOfParticles(int); + void findCells(); + void setForces(); + +public: + + // Constructors + + //- Construct from components + cfdemCloudMS + ( + const fvMesh& mesh + ); + + // Destructor + + virtual ~cfdemCloudMS(); + + + // Member Functions + // Access + + vector positionCM(int); + + vector velocityCM(int); + + label cellIDCM(int); + + label body(int); + + label nrigid(int); + + inline double **& positionsCM() const; + + inline double **& velocitiesCM() const; + + inline double **& impForcesCM() const; + + inline double **& expForcesCM() const; + + inline double **& DEMForcesCM() const; + + inline int numberOfClumps() const; + + inline bool numberOfClumpsChanged() const; + + const forceModel& forceM(int); + + int nrForceModels(); + + bool evolve(volScalarField&,volVectorField&,volVectorField&); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "cfdemCloudMSI.H" + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/etc/bashrc b/src/lagrangian/cfdemParticle/etc/bashrc index c3924c69..5a808aeb 100755 --- a/src/lagrangian/cfdemParticle/etc/bashrc +++ b/src/lagrangian/cfdemParticle/etc/bashrc @@ -46,6 +46,19 @@ export CFDEM_LIB_NAME=lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION #- path to test harness export CFDEM_TEST_HARNESS_PATH=$CFDEM_PROJECT_USER_DIR/log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION +#------------------------------------------------------------------------------ +#- settings for lpp postproc tool +#------------------------------------------------------------------------------ + +#- nr of procs for lpp tool +export CFDEM_LPP_NPROCS=1 + +#- nr of procs for lpp tool +export CFDEM_LPP_CHUNKSIZE=1 + +#- shortcut to run lpp +alias lpp='python -i $CFDEM_LPP_DIR/lpp.py --cpunum $CFDEM_LPP_NPROCS --chunksize $CFDEM_LPP_CHUNKSIZE' + #------------------------------------------------------------------------------ #- aliases for easy navigation (no changes necessary) #------------------------------------------------------------------------------ @@ -96,9 +109,6 @@ export -f cfdemLiggghts cfdemLiggghtsPar() { mpirun -np $2 $CFDEM_LIGGGHTS_SRC_DIR/lmp_$CFDEM_LIGGGHTS_MAKEFILE_NAME < $1; } export -f cfdemLiggghtsPar -#- shortcut to run lpp -alias lpp='python -i $CFDEM_LPP_DIR/lpp.py' - # check if the directory exists if [ -d "$CFDEM_PROJECT_USER_DIR" ]; then : diff --git a/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh b/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh index 4ad12e71..92bee98c 100755 --- a/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh +++ b/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh @@ -25,6 +25,7 @@ checkDirComment "$CFDEM_LIGGGHTS_SRC_DIR" '$CFDEM_LIGGGHTS_SRC_DIR' "yes" checkDirComment "$CFDEM_PROJECT_DIR" '$CFDEM_PROJECT_DIR' "yes" checkDirComment "$CFDEM_PROJECT_USER_DIR" '$CFDEM_PROJECT_USER_DIR' "no" checkDirComment "$CFDEM_SRC_DIR" '$CFDEM_SRC_DIR' "yes" +checkDirComment "$CFDEM_LIGGGHTS_SRC_DIR" '$CFDEM_LIGGGHTS_SRC_DIR' "yes" checkDirComment "$CFDEM_LPP_DIR" '$CFDEM_LPP_DIR' "yes" checkDirComment "$CFDEM_PIZZA_DIR" '$CFDEM_PIZZA_DIR' "no" checkDirComment "$CFDEM_TEST_HARNESS_PATH" '$CFDEM_TEST_HARNESS_PATH' "no" diff --git a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh index ce63ff43..30e6e775 100755 --- a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh +++ b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh @@ -26,8 +26,9 @@ logpath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")/$logDir" logfileName="log_compileCFDEMcoupling_src" #alternative: logfileName="log_compileLIGGGHTS_$NOW" casePath="$CFDEM_SRC_DIR" headerText="$logfileName""-$NOW" +#doClean="$1" # "" | "noClean" #--------------------------------------------------------------------------------# -compileLib $logpath $logfileName $casePath $headerText +compileLib $logpath $logfileName $casePath $headerText #$doClean #================================================================================# # compile solvers @@ -42,7 +43,7 @@ do casePath="$CFDEM_SOLVER_DIR/$solverName" headerText="$logfileName""_$solverName""-$NOW" #--------------------------------------------------------------------------------# - compileSolver $logpath $logfileName $casePath $headerText + compileSolver $logpath $logfileName $casePath $headerText #$doClean done echo "Note: the list of solvers compiled might be incomplete." diff --git a/src/lagrangian/cfdemParticle/etc/cshrc b/src/lagrangian/cfdemParticle/etc/cshrc index a1eb980f..6af88645 100755 --- a/src/lagrangian/cfdemParticle/etc/cshrc +++ b/src/lagrangian/cfdemParticle/etc/cshrc @@ -46,6 +46,19 @@ setenv CFDEM_LIB_NAME lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION #- path to test harness setenv CFDEM_TEST_HARNESS_PATH $CFDEM_PROJECT_USER_DIR/log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION +#------------------------------------------------------------------------------ +#- settings for lpp postproc tool +#------------------------------------------------------------------------------ + +#- nr of procs for lpp tool +setenv CFDEM_LPP_NPROCS 4 + +#- nr of procs for lpp tool +setenv CFDEM_LPP_CHUNKSIZE 1 + +#- shortcut to run lpp +alias lpp 'python -i $CFDEM_LPP_DIR/lpp.py --cpunum $CFDEM_LPP_NPROCS --chunksize $CFDEM_LPP_CHUNKSIZE \!:1' + #------------------------------------------------------------------------------ #- aliases for easy navigation (no changes necessary) #------------------------------------------------------------------------------ diff --git a/src/lagrangian/cfdemParticle/etc/functions.sh b/src/lagrangian/cfdemParticle/etc/functions.sh index 1801478c..57df6e6b 100755 --- a/src/lagrangian/cfdemParticle/etc/functions.sh +++ b/src/lagrangian/cfdemParticle/etc/functions.sh @@ -18,6 +18,7 @@ compileLib() logfileName="$2" casePath="$3" headerText="$4" + #doClean="$5" #--------------------------------------------------------------------------------# #- clean up old log file @@ -36,8 +37,10 @@ compileLib() echo 2>&1 | tee -a $logpath/$logfileName #- wclean and wmake - rmdepall 2>&1 | tee -a $logpath/$logfileName - wclean 2>&1 | tee -a $logpath/$logfileName + #if [ $doClean != "noClean" ]; then + rmdepall 2>&1 | tee -a $logpath/$logfileName + wclean 2>&1 | tee -a $logpath/$logfileName + #fi wmake libso 2>&1 | tee -a $logpath/$logfileName #- keep terminal open @@ -56,6 +59,7 @@ compileSolver() logfileName="$2" casePath="$3" headerText="$4" + #doClean="$5" #--------------------------------------------------------------------------------# #- clean up old log file @@ -74,8 +78,10 @@ compileSolver() echo 2>&1 | tee -a $logpath/$logfileName #- wclean and wmake - rmdepall 2>&1 | tee -a $logpath/$logfileName - wclean 2>&1 | tee -a $logpath/$logfileName + #if [ $doClean != "noClean" ]; then + rmdepall 2>&1 | tee -a $logpath/$logfileName + wclean 2>&1 | tee -a $logpath/$logfileName + #fi wmake 2>&1 | tee -a $logpath/$logfileName #- keep terminal open @@ -118,6 +124,47 @@ compileLIGGGHTS() } #==================================# +#==================================# +#- function to compile a lammps lib + +compileLMPlib() +{ + #--------------------------------------------------------------------------------# + #- define variables + logpath="$1" + logfileName="$2" + headerText="$3" + makeFileName="$4" + libraryPath="$5" + #--------------------------------------------------------------------------------# + + #- clean up old log file + rm $logpath/$logfileName + + #- change path + cd $libraryPath + + #- header + echo 2>&1 | tee -a $logpath/$logfileName + echo "// $headerText //" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- write path + pwd 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- clean up + echo "make clean" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + make -f $makeFileName clean 2>&1 | tee -a $logpath/$logfileName + + #- compile + echo "make" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + make -f $makeFileName 2>&1 | tee -a $logpath/$logfileName +} +#==================================# + #==================================# #- function to run a DEM case @@ -156,6 +203,50 @@ DEMrun() } #==================================# +#==================================# +#- function to run a DEM case in parallel + +parDEMrun() +{ + #--------------------------------------------------------------------------------# + #- define variables + logpath="$1" + logfileName="$2" + casePath="$3" + headerText="$4" + solverName="$5" + nrProcs="$6" + machineFileName="$7" + debugMode="$8" + #--------------------------------------------------------------------------------# + + #- clean up old log file + rm $logpath/$logfileName + + #- change path + cd $casePath/DEM + + #- header + echo 2>&1 | tee -a $logpath/$logfileName + echo "// $headerText //" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- write path + pwd 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- run applictaion + if [ $machineFileName == "none" ]; then + mpirun -np $nrProcs $debugMode $CFDEM_LIGGGHTS_SRC_DIR/$CFDEM_LIGGGHTS_LIB_NAME < $solverName 2>&1 | tee -a $logpath/$logfileName + else + mpirun -machinefile $machineFileName -np $nrProcs $debugMode $CFDEM_LIGGGHTS_SRC_DIR/$CFDEM_LIGGGHTS_LIB_NAME < $solverName 2>&1 | tee -a $logpath/$logfileName + fi + + #- keep terminal open (if started in new terminal) + #read +} +#==================================# + #==================================# #- function to run a CFD case diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C index a1da55fe..8081f3c1 100644 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C @@ -267,7 +267,9 @@ bool Foam::twoWayMPI::couple() const setNumberOfParticles(newNpart); // re-allocate arrays of cloud + particleCloud_.clockM().start(4,"LIGGGHTS_reallocArrays"); particleCloud_.reAllocArrays(); + particleCloud_.clockM().stop("LIGGGHTS_reallocArrays"); } return coupleNow; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C index 5f77c195..53b9004b 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C @@ -75,6 +75,8 @@ KochHillDrag::KochHillDrag if (propsDict_.found("verbose")) verbose_=true; if (propsDict_.found("treatExplicit")) treatExplicit_=true; if (propsDict_.found("interpolation")) interpolation_=true; + + // Note: dprim=ds/scale_ if (propsDict_.found("scale")) scale_=scalar(readScalar(propsDict_.lookup("scale"))); } @@ -126,7 +128,6 @@ void KochHillDrag::setForce { if(mask[index][0]) { - cellI = particleCloud_.cellIDs()[index][0]; drag = vector(0,0,0); @@ -137,6 +138,10 @@ void KochHillDrag::setForce position = particleCloud_.position(index); voidfraction = voidfractionInterpolator_.interpolate(position,cellI); Ufluid = UInterpolator_.interpolate(position,cellI); + //Ensure interpolated void fraction to be meaningful + // Info << " --> voidfraction: " << voidfraction << endl; + if(voidfraction>1.00) voidfraction = 1.00; + if(voidfraction<0.40) voidfraction = 0.40; }else { voidfraction = particleCloud_.voidfraction(index); @@ -162,8 +167,12 @@ void KochHillDrag::setForce scalar F0=0.; if(volumefraction < 0.4) { - F0 = (1+3*sqrt((volumefraction)/2)+135/64*volumefraction*log(volumefraction)+16.14*volumefraction)/ - (1+0.681*volumefraction-8.48*sqr(volumefraction)+8.16*volumefraction*volumefraction*volumefraction); + F0 = (1+3*sqrt((volumefraction)/2)+135/64*volumefraction*log(volumefraction) + +16.14*volumefraction + )/ + (1+0.681*volumefraction-8.48*sqr(volumefraction) + +8.16*volumefraction*volumefraction*volumefraction + ); } else { F0 = 10*volumefraction/(voidfraction*voidfraction*voidfraction); } @@ -171,12 +180,14 @@ void KochHillDrag::setForce // calc model coefficient F3 scalar F3 = 0.0673+0.212*volumefraction+0.0232/pow(voidfraction,5); - // calc model coefficient beta - scalar beta = 18*nuf*rho*voidfraction*voidfraction*volumefraction/(ds/scale_*ds/scale_)* - (F0 + 0.5*F3*Rep); + //Calculate F in the formulation of van der Hoef et al. (JFM 528:233-254) + scalar F = voidfraction * (F0 + 0.5*F3*Rep); + + // calc drag model coefficient betaP + scalar betaP = 18.*nuf*rho/(ds/scale_*ds/scale_)*voidfraction*F; // calc particle's drag - drag = Vs*beta/volumefraction*Ur; + drag = Vs*betaP*Ur; if (modelType_=="B") drag /= voidfraction; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C new file mode 100644 index 00000000..42ff59dd --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C @@ -0,0 +1,232 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "DiFeliceDragMS.H" +#include "addToRunTimeSelectionTable.H" + +//#include "mpi.h" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(DiFeliceDragMS, 0); + +addToRunTimeSelectionTable +( + forceModelMS, + DiFeliceDragMS, + dictionary +); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +DiFeliceDragMS::DiFeliceDragMS +( + const dictionary& dict, + cfdemCloudMS& sm +) +: + forceModelMS(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + verbose_(false), + velFieldName_(propsDict_.lookup("velFieldName")), + U_(sm.mesh().lookupObject (velFieldName_)), + densityFieldName_(propsDict_.lookup("densityFieldName")), + rho_(sm.mesh().lookupObject (densityFieldName_)), + voidfractionFieldName_(propsDict_.lookup("voidfractionFieldName")), + voidfraction_(sm.mesh().lookupObject (voidfractionFieldName_)), + interpolation_(false), + //sphereToClump_(readScalar(propsDict_.lookup("sphereToClump"))) + dH_(readScalar(propsDict_.lookup("hydraulicDiameter"))) +{ + if (propsDict_.found("verbose")) verbose_=true; + if (propsDict_.found("treatExplicit")) treatExplicit_=true; + if (propsDict_.found("interpolation")) + { + Info << "using interpolated value of U." << endl; + interpolation_=true; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +DiFeliceDragMS::~DiFeliceDragMS() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void DiFeliceDragMS::setForce +( + double** const& mask, + double**& impForces, + double**& expForces, + double**& DEMForces +) const +{ + // get viscosity field + #ifdef comp + const volScalarField& nufField = cloudRefMS().turbulence().mu() / rho_; + #else + const volScalarField& nufField = cloudRefMS().turbulence().nu(); + #endif + + interpolationCellPoint UInterpolator(U_); + interpolationCellPoint voidfractionInterpolator(voidfraction_); + vector U(0,0,0); + vector position(0,0,0); + scalar voidfraction(1); + vector Us(0,0,0); + vector Ur(0,0,0); + scalar ds(0); + scalar nuf(0); + scalar rho(0); + scalar magUr(0); + scalar Rep(0); + scalar Cd(0); + + cloudRefMS().resetArray(cloudRefMS().expForcesCM(),cloudRefMS().numberOfClumps(),3); + cloudRefMS().resetArray(cloudRefMS().impForcesCM(),cloudRefMS().numberOfClumps(),3); + + for(int index = 0;index < cloudRefMS().numberOfClumps(); index++) + { + + //if(mask[index][0]) // would have to be transformed from body ID to particle ID + //{ + vector drag(0,0,0); + label cellI = cloudRefMS().cellIDCM(index); + + if (cellI > -1) // particle Found + { + if(interpolation_) + { + position = cloudRefMS().positionCM(index); + U = UInterpolator.interpolate(position,cellI); + voidfraction = voidfractionInterpolator.interpolate(position,cellI); + }else + { + U = U_[cellI]; + voidfraction = voidfraction_[cellI]; + } + + Us = cloudRefMS().velocityCM(index); + Ur = U-Us; + //ds = 2*cloudRefMS().radius(index)/sphereToClump_; // scale from particle diameter + ds = dH_; // use dict defined diameter + + nuf = nufField[cellI]; + rho = rho_[cellI]; + magUr = mag(Ur); + Rep = 0; + Cd = 0; + scalar phi(0); + scalar phiN(0); + + if (magUr > 0) + { + // calc particle Re Nr + Rep = ds*voidfraction*magUr/nuf; + + // calc fluid drag Coeff +// phi=1; //AsurfAequi/Asurf; +// phiN=1; //AcrosssecAequi/Acrosssec; + // paper uses different Re definition!? +// Cd=8/(Rep*sqrt(phiN))+16/(Rep*sqrt(phi))+3/(sqrt(Rep)*pow(phi,0.75))+0.42*pow(10,(-0.4*pow(log(phi),0.2)))/phiN; + + // calc fluid drag Coeff + Cd = sqr(0.63 + 4.8/sqrt(Rep)); + + // calc model coefficient Xi + scalar Xi = 3.7 - 0.65 * exp(-sqr(1.5-log10(Rep))/2); + + // calc particle's drag + drag = 0.125*Cd*rho*M_PI*ds*ds*pow(voidfraction,(2-Xi))*magUr*Ur; + + if (modelType_=="B") + drag /= voidfraction; + } + + if(verbose_ && index >=0 && index <10) + { + Info << "index = " << index << endl; + Info << "Us = " << Us << endl; + Info << "Ur = " << Ur << endl; + Info << "ds = " << ds << endl; + Info << "rho = " << rho << endl; + Info << "nuf = " << nuf << endl; + Info << "voidfraction = " << voidfraction << endl; + Info << "Rep = " << Rep << endl; + Info << "Cd = " << Cd << endl; + Info << "drag = " << drag << endl; + } + } + // set force on bodies + if(treatExplicit_) for(int j=0;j<3;j++) cloudRefMS().expForcesCM()[index][j] += drag[j]; + else for(int j=0;j<3;j++) cloudRefMS().impForcesCM()[index][j] += drag[j]; + //} + } + + // set force on particles + int nrigidC(-1); + label ind(-1); + for(int index = 0;index < cloudRefMS().numberOfParticles(); index++) + { + if (particleCloud_.cellIDs()[index][0] > -1) // particle Found + { + ind=cloudRefMS().body(index); + nrigidC=cloudRefMS().nrigid(ind); + + if (nrigidC <= 0) + { + Warning <<"A BUG occurred in DiFeliceDragMS::setForce!!! nrigidC = " << nrigidC <<", ind = " << ind <<", index=" << index <<"\n" << endl; + nrigidC = 1000; + } + if(treatExplicit_) for(int j=0;j<3;j++) expForces[index][j] += cloudRefMS().expForcesCM()[ind][j] / nrigidC; + else for(int j=0;j<3;j++) impForces[index][j] += cloudRefMS().impForcesCM()[ind][j] / nrigidC; + } + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H new file mode 100644 index 00000000..06669379 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H @@ -0,0 +1,121 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). + +Class + DiFeliceDragMS + +SourceFiles + DiFeliceDragMS.C + +\*---------------------------------------------------------------------------*/ + +#ifndef DiFeliceDragMS_H +#define DiFeliceDragMS_H + +#include "cfdemCloudMS.H" +#include "forceModelMS.H" +#include "interpolationCellPoint.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class DiFeliceDragMS Declaration +\*---------------------------------------------------------------------------*/ + +class DiFeliceDragMS +: + public forceModelMS +{ +private: + dictionary propsDict_; + + bool verbose_; + + word velFieldName_; + + const volVectorField& U_; + + word densityFieldName_; + + const volScalarField& rho_; + + word voidfractionFieldName_; + + const volScalarField& voidfraction_; + + bool interpolation_; // use interpolated U field values + + //scalar sphereToClump_; // ratio of sphere radius to clump radius + + scalar dH_; // hydraulic diameter + +public: + + //- Runtime type information + TypeName("DiFeliceDragMS"); + + + // Constructors + + //- Construct from components + DiFeliceDragMS + ( + const dictionary& dict, + cfdemCloudMS& sm + ); + + // Destructor + + ~DiFeliceDragMS(); + + + // Member Functions + void setForce + ( + double** const& mask, + double**&, + double**&, + double**& + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.C new file mode 100644 index 00000000..731a6640 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.C @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" +#include "forceModelMS.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(forceModelMS, 0); + +defineRunTimeSelectionTable(forceModelMS, dictionary); + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +forceModelMS::forceModelMS +( + const dictionary& dict, + cfdemCloudMS& sm +) +: + forceModel(dict,sm), + particleCloudMS_(sm) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +forceModelMS::~forceModelMS() +{} + +// * * * * * * * * * * * * * * * * Member Fct * * * * * * * * * * * * * * * // +cfdemCloudMS& forceModelMS::cloudRefMS() const +{ + return particleCloudMS_; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.H b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.H new file mode 100644 index 00000000..e5c2aed0 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.H @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). + +Class + forceModelMS + +SourceFiles + forceModelMS.C + +\*---------------------------------------------------------------------------*/ + +#ifndef forceModelMS_H +#define forceModelMS_H + +#include "fvCFD.H" +#include "cfdemCloudMS.H" +#include "forceModel.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +/*---------------------------------------------------------------------------*\ + Class forceModelMS Declaration +\*---------------------------------------------------------------------------*/ + +class forceModelMS +: + public forceModel +{ + +protected: + + cfdemCloudMS& particleCloudMS_; + + +public: + + //- Runtime type information + TypeName("forceModelMS"); + + // Declare runtime constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + forceModelMS, + dictionary, + ( + const dictionary& dict, + cfdemCloudMS& sm + ), + (dict,sm) + ); + + + // Constructors + + //- Construct from components + forceModelMS + ( + const dictionary& dict, + cfdemCloudMS& sm + ); + + + // Destructor + + virtual ~forceModelMS(); + + + // Selector + + static autoPtr New + ( + const dictionary& dict, + cfdemCloudMS& sm, + word forceType + ); + + + // Member Functions + + + // Access + cfdemCloudMS& cloudRefMS() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/newForceModelMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/newForceModelMS.C new file mode 100644 index 00000000..aee7f803 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/newForceModelMS.C @@ -0,0 +1,79 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "forceModelMS.H" +#include "DiFeliceDrag.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +autoPtr forceModelMS::New +( + const dictionary& dict, + cfdemCloudMS& sm, + word forceType +) +{ + Info<< "Selecting forceModelMS " + << forceType << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(forceType); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalError + << "forceModelMS::New(const dictionary&, const spray&) : " + << endl + << " unknown forceModelType type " + << forceType + << ", constructor not in hash table" << endl << endl + << " Valid forceModelMS types are :" + << endl; + Info<< dictionaryConstructorTablePtr_->toc() + << abort(FatalError); + } + + return autoPtr (cstrIter()(dict,sm)); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C index f50b63f9..d6b2d2d7 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C @@ -69,12 +69,18 @@ dividedVoidFraction::dividedVoidFraction alphaMin_(readScalar(propsDict_.lookup("alphaMin"))), alphaLimited_(0), tooMuch_(0.0), - scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol"))) + scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol"))), + interpolation_(false) { maxCellsPerParticle_ = 29; if(scaleUpVol_ > 1.3 || scaleUpVol_ < 1){ FatalError<< "scaleUpVol shloud be > 1 and < 1.3 !!!" << abort(FatalError); } if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< "alphaMin shloud be > 1 and < 0.01 !!!" << abort(FatalError); } + if (propsDict_.found("interpolation")){ + interpolation_=true; + Warning << "interpolation for dividedVoidFraction does not yet work correctly!" << endl; + Info << "Using interpolated voidfraction field - do not use this in combination with interpolation in drag model!"<< endl; + } } @@ -90,6 +96,12 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra { reAllocArrays(); + scalar pi = M_PI; + vector position(0,0,0); + label cellID=-1; + scalar radius(-1); + scalar cellVol(0); + for(int index=0; index< particleCloud_.numberOfParticles(); index++) { if(mask[index][0]) @@ -101,14 +113,12 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra } cellsPerParticle_[index][0]=1; - - scalar pi = M_PI; - vector position = particleCloud_.position(index); - label cellID = particleCloud_.cellIDs()[index][0]; - scalar radius = particleCloud_.radii()[index][0]; + position = particleCloud_.position(index); + cellID = particleCloud_.cellIDs()[index][0]; + radius = particleCloud_.radii()[index][0]; scalar volume = 4./3.*radius*radius*radius*3.1415; radius = radius*pow(scaleUpVol_,1/3); - scalar cellVol(0); + cellVol=0; //--variables for sub-search int nPoints = 29; @@ -195,20 +205,53 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra if(index == particleCloud_.numberOfParticles()-1) Info << "Total particle volume neglected: " << tooMuch_<< endl; }// end loop all particles - // bring voidfraction from Eulerian Field to particle array + // bring voidfraction from Eulerian Field to particle arra +// interpolationCellPoint voidfractionInterpolator_(voidfractionNext_); + scalar voidfractionAtPos(0); for(int index=0; index< particleCloud_.numberOfParticles(); index++) { - for(int subcell=0;subcell = 0) + label cellI = particleCloud_.cellIDs()[index][0]; + if(cellI >= 0) { - voidfractions[index][subcell] = voidfractionNext_[cellID]; + position = particleCloud_.position(index); + voidfractionAtPos=voidfractionInterpolator_.interpolate(position,cellI); + }else{ + voidfractionAtPos=-1; } - else + + for(int subcell=0;subcell = 0) + { + if(voidfractionAtPos > 0) + voidfractions[index][subcell] = voidfractionAtPos; + else + voidfractions[index][subcell] = voidfractionNext_[cellID]; + } + else + { + voidfractions[index][subcell] = -1.; + } + } + } + else*/ + { + for(int subcell=0;subcell = 0) + { + voidfractions[index][subcell] = voidfractionNext_[cellID]; + } + else + { + voidfractions[index][subcell] = -1.; + } } } } diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H index 7f4c6ccd..8e793adc 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H @@ -40,6 +40,7 @@ SourceFiles #define dividedVoidFraction_H #include "voidFractionModel.H" +#include "interpolationCellPoint.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -66,6 +67,8 @@ private: const scalar scaleUpVol_; //NP scaling radius, keeping volume of particle + bool interpolation_; + public: //- Runtime type information diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.C new file mode 100644 index 00000000..deb62e94 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.C @@ -0,0 +1,223 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "dividedVoidFractionMS.H" +#include "addToRunTimeSelectionTable.H" +#include "locateModel.H" +#include "regionModel.H" +#include "dataExchangeModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(dividedVoidFractionMS, 0); + +addToRunTimeSelectionTable +( + voidFractionModel, + dividedVoidFractionMS, + dictionary +); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +dividedVoidFractionMS::dividedVoidFractionMS +( + const dictionary& dict, + cfdemCloud& sm +) +: + voidFractionModel(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + alphaMin_(readScalar(propsDict_.lookup("alphaMin"))), + alphaLimited_(0), + tooMuch_(0.0), + scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol"))), + clumpVol_(readScalar(propsDict_.lookup("clumpVol"))), + nrigid_(readScalar(propsDict_.lookup("nrigid"))) +{ + maxCellsPerParticle_ = 29; + + if(scaleUpVol_ > 1.3 || scaleUpVol_ < 1){ FatalError<< "scaleUpVol shloud be > 1 and < 1.3 !!!" << abort(FatalError); } + if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< "alphaMin shloud be > 1 and < 0.01 !!!" << abort(FatalError); } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +dividedVoidFractionMS::~dividedVoidFractionMS() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void dividedVoidFractionMS::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes) const +{ + reAllocArrays(); + + for(int index=0; index< particleCloud_.numberOfParticles(); index++) + { + if(mask[index][0]) + { + // reset + for(int subcell=0;subcell = 0) // particel centre is in domain + { + cellVol = particleCloud_.mesh().V()[cellID]; + + //NP for 2 different radii + for(scalar r = 0.623926*radius;r < radius;r+=0.293976*radius) + { + //NP try 8 subpoint derived from spherical coordinates + for (scalar zeta=pi/4.;zeta<(2.*pi);zeta+=(pi/2.)) + { + for (scalar theta=(pi/4.);theta 29 || cellsSet<0) + { + Info << "ERROR cellsSet =" << cellsSet << endl; + } + + //NP set source for particle center; source 1/nPts+weight of all subpoints that have not been found + scalar centreWeight = 1./nPoints*(nPoints-cellsSet); + + // update voidfraction for each particle read + scalar newAlpha = voidfractionNext_[cellID]- volume*centreWeight/cellVol; + if(newAlpha > alphaMin_) voidfractionNext_[cellID] = newAlpha; + else + { + voidfractionNext_[cellID] = alphaMin_; + tooMuch_ += (alphaMin_-newAlpha) * cellVol; + } + + // store cellweight for each particle --- this should be done for subpoints as well!! + particleWeights[index][0] += centreWeight; + + // store particleVolume for each particle + particleVolumes[index][0] += volume*centreWeight; + + /*//OUTPUT + if (index==0) + { + Info << "centre cellID = " << cellID << endl; + Info << "cellsPerParticle_=" << cellsPerParticle_[index][0] << endl; + + for(int i=0;i = 0) + { + voidfractions[index][subcell] = voidfractionNext_[cellID]; + } + else + { + voidfractions[index][subcell] = -1.; + } + } + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.H b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.H new file mode 100644 index 00000000..a83be07a --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.H @@ -0,0 +1,106 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). + +Class + dividedVoidFractionMS + +SourceFiles + dividedVoidFractionMS.C + +\*---------------------------------------------------------------------------*/ + +#ifndef dividedVoidFractionMS_H +#define dividedVoidFractionMS_H + +#include "voidFractionModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class noDrag Declaration +\*---------------------------------------------------------------------------*/ + +class dividedVoidFractionMS +: + public voidFractionModel +{ + +private: + dictionary propsDict_; + + const scalar alphaMin_; //NP min value of voidFraction + + mutable bool alphaLimited_; + + mutable scalar tooMuch_; //NP particle volume which is lost due to voidFraction limitation + + const scalar scaleUpVol_; //NP scaling radius, keeping volume of particle + + const scalar clumpVol_; + + const int nrigid_; + +public: + + //- Runtime type information + TypeName("dividedMS"); + + + // Constructors + + //- Construct from components + dividedVoidFractionMS + ( + const dictionary& dict, + cfdemCloud& sm + ); + + // Destructor + + ~dividedVoidFractionMS(); + + + // Member Functions + void setvoidFraction(double** const& ,double**&, double**&, double**&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh index 81a03c31..fa4eab31 100644 --- a/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverIB" nrProcs="8" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -66,6 +66,8 @@ cp ../../$logfileName $testHarnessPath #- clean up case echo "deleting data at: $casePath" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/VTK rm -r $casePath/CFD/couplingFiles/* rm -r $casePath/CFD/processor* diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties index 57cb0155..e3c815b4 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties @@ -49,8 +49,8 @@ clockModel standardClock;//off; forceModels ( //GidaspowDrag - DiFeliceDrag - //KochHillDrag + //DiFeliceDrag + KochHillDrag gradPForce viscForce //Archimedes @@ -132,6 +132,7 @@ KochHillDragProps { velFieldName "U"; densityFieldName "rho"; + voidfractionFieldName "voidfraction"; } virtualMassForceProps diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict index c0b2fc33..84219dac 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict @@ -29,7 +29,7 @@ deltaT 0.001; writeControl adjustableRunTime; -writeInterval 0.001;//0.01; +writeInterval 0.01; purgeWrite 0; diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh index 6dd01b35..fd0426d6 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPiso" nrProcs="8" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -83,6 +83,8 @@ fi #- clean up case echo "deleting data at: $casePath :\n" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/log.* rm -r $casePath/CFD/octave/octave-core rm -r $casePath/CFD/VTK diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh index ddc6c75f..90d8d867 100755 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh @@ -98,6 +98,8 @@ fi #- clean up case rm -rf $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/clockData rm -rf $casePath/CFD/processor* rm -r $casePath/CFD/VTK diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy index 5e4682fa..cf58c55e 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy @@ -23,3 +23,5 @@ dummyfile dummyfile dummyfile dummyfile +dummyfile +dummyfile diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh index 792491ee..5443c574 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPiso" nrProcs="2" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" #--------------------------------------------------------------------------------# diff --git a/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh index 6782a588..961943e6 100644 --- a/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPiso" nrProcs="2" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -78,6 +78,8 @@ fi #- clean up case echo "deleting data at: $casePath :\n" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/log.* rm -r $casePath/CFD/octave/octave-core rm -r $casePath/CFD/VTK diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh new file mode 100755 index 00000000..c326910d --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +#===================================================================# +# allrun script for testcase as part of test routine +# run settlingTest +# Christoph Goniva - Sept. 2010 +#===================================================================# + +#- define variables +casePath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")" +pizzaPath="$CFDEM_PIZZA_DIR" +postproc="false" +nrPostProcProcessors=2 + +# check if mesh was built +if [ -d "$casePath/CFD/constant/polyMesh/boundary" ]; then + echo "mesh was built before - using old mesh" +else + echo "mesh needs to be built" + cd $casePath/CFD + blockMesh +fi + +#- run parallel CFD-DEM in new terminal +gnome-terminal --title='cfdemSolverPisoMS ErgunTestMPI CFD' -e "bash $casePath/parCFDDEMrun.sh" + +if [ $postproc == "true" ] + then + + #- keep terminal open (if started in new terminal) + echo "simulation finisehd? ...press enter to proceed" + read + + #- get VTK data from liggghts dump file + cd $casePath/DEM + python $pizzaPath/pizza.py -f pizzaScriptRestart + + #- get VTK data from CFD sim + cd $casePath/CFD + #foamToVTK #- serial run of foamToVTK + source $CFDEM_SRC_DIR/etc/functions.sh #- include functions + pseudoParallelRun "foamToVTK" $nrPostProcProcessors #- pseudo parallel run of foamToVTK + + #- start paraview + paraview + + #- keep terminal open (if started in new terminal) + echo "...press enter to clean up case" + echo "press Ctr+C to keep data" + read + + #- clean up case + echo "deleting data at: $casePath" + rm -r $casePath/CFD/0.* + rm -r $casePath/CFD/VTK + rm -r $casePath/CFD/couplingFiles/* + rm -r $casePath/DEM/post/* + rm -r $casePath/DEM/log.* + rm -r $casePath/log_* + echo "done" + +fi diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl new file mode 100644 index 00000000..f44ecabe --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object Ksl; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -3 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + wall + { + type zeroGradient; + //type fixedValue; + //value uniform 0; + } + inlet + { + type zeroGradient; + } + outlet + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U new file mode 100644 index 00000000..959b298e --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U @@ -0,0 +1,72 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0.1); + +boundaryField +{ + + wall + { + //type fixedValue; + //value uniform (0 0 0); + type slip; + } + + inlet + { + /*type flowRateInletVelocity; + flowRate 0.001; + value uniform (0 0 0);*/ + +/* type fixedValue; + value uniform (0 0 0.1);*/ + + //type zeroGradient; + + /*// superficial velocity BC + type groovyBC; + variables "Usup=vector(0,0,2);alpha=voidfraction;tEnd=0.1;"; // should be used with zeroGradient voidfraction + valueExpression "((time() < tEnd) ? Usup/alpha*(time()/tEnd) : Usup/alpha)"; + value uniform (0 0 0);*/ + + /*// 2.0.x, ext + type timeVaryingUniformFixedValue; + fileName "steps_0p1s"; + outOfBounds clamp; + value uniform (0 0 0);*/ + + // 2.1.x + type uniformFixedValue; + uniformValue table + ( + (0.000 (0 0 0.)) + (0.099 (0 0 2)) + (0.100 (0 0 2)) + ); + } + outlet + { + /*type fluxCorrectedVelocity; //inletOutlet; + value uniform (0 0 0); + inletValue uniform (0 0 0);*/ + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us new file mode 100644 index 00000000..1af9a050 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + location "0"; + object Us; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + wall + { + type zeroGradient; + //type fixedValue; + //value uniform (1 0 0); + } + inlet + { + type zeroGradient; + //type fixedValue; + //value uniform (1 0 0);; + } + outlet + { + type zeroGradient; + //type fixedValue; + //value uniform (1 0 0); + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/epsilon b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/epsilon new file mode 100644 index 00000000..37ffab5e --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/epsilon @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object epsilon; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -3 0 0 0 0]; + +internalField uniform 0.003; + +boundaryField +{ + wall + { + type epsilonWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0.003; + } + outlet + { + type inletOutlet; + inletValue uniform 0.003; + value uniform 0.003; + } + inlet + { + /*type turbulentMixingLengthDissipationRateInlet; + mixingLength 0.005; + value uniform 0.003;*/ + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k new file mode 100644 index 00000000..bbf04afb --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 0.001; + +boundaryField +{ + wall + { + type kqRWallFunction; + value uniform 0.001; + } + outlet + { + type inletOutlet; + inletValue uniform 0.001; + value uniform 0.001; + } + inlet + { + /*type turbulentIntensityKineticEnergyInlet; + intensity 0.05; + value uniform 0.001;*/ + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut new file mode 100644 index 00000000..dcd36c89 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object nut; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + wall + { + type nutWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0; + } + outlet + { + type calculated; + value uniform 0; + } + inlet + { + type calculated; + value uniform 0; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p new file mode 100644 index 00000000..d111e6be --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 1.0e5; + +boundaryField +{ + + wall + { + type zeroGradient; + } + + inlet + { + type zeroGradient; + //type fixedValue; + //value uniform 100000; + } + outlet + { + //type zeroGradient; + type fixedValue; + value uniform 100000; + } +} + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho new file mode 100644 index 00000000..bc2244f6 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object rho; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -3 0 0 0 0 0]; + +internalField uniform 5; + +boundaryField +{ + + wall + { + type zeroGradient; + } + + inlet + { + type zeroGradient; + } + outlet + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/voidfraction b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/voidfraction new file mode 100644 index 00000000..3fdf6da6 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/voidfraction @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object voidfraction; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 1; + +boundaryField +{ + wall + { + type zeroGradient; + } + outlet + { + type fixedValue; + value uniform 1; + } + inlet + { + type fixedValue; + value uniform 1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/RASProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/RASProperties new file mode 100644 index 00000000..daec1829 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/RASProperties @@ -0,0 +1,25 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object RASProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +RASModel laminar; + +turbulence off; + +printCoeffs on; + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties new file mode 100644 index 00000000..62a18661 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties @@ -0,0 +1,177 @@ +/*---------------------------------------------------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.4 | +| \\ / A nd | Web: http://www.openfoam.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object couplingProperties; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//===========================================================================// +// sub-models & settings +verbose; + +modelType B; // A or B + +couplingInterval 100; + +voidFractionModel dividedMS; + +locateModel engine; + +meshMotionModel noMeshMotion; + +regionModel allRegion; + +IOModel basicIO; + +dataExchangeModel twoWayMPI;//twoWayFiles;//oneWayVTK;// + +averagingModel dense;//dilute;// + +clockModel off; + +forceModels +( + off + Archimedes + volWeightedAverage +); + +forceModelsMS +( + DiFeliceDragMS +); + +momCoupleModels +( + implicitCouple +); + +turbulenceModelType RASProperties;//LESProperties;// + +//===========================================================================// +// sub-model properties + +implicitCoupleProps +{ + velFieldName "U"; + granVelFieldName "Us"; + voidfractionFieldName "voidfraction"; +} + +ArchimedesProps +{ + densityFieldName "rho"; + gravityFieldName "g"; +} +gradPForceProps +{ + pFieldName "p"; + densityFieldName "rho"; + velocityFieldName "U"; + interpolation; +} + +viscForceProps +{ + velocityFieldName "U"; + densityFieldName "rho"; + interpolation; +} +volWeightedAverageProps +{ + scalarFieldNames + ( + voidfraction + ); + vectorFieldNames + ( + ); + upperThreshold 0.999; + lowerThreshold 0; + verbose; +} +totalMomentumExchangeProps +{ + implicitMomExFieldName "Ksl"; + explicitMomExFieldName "none"; + fluidVelFieldName "U"; + granVelFieldName "Us"; + densityFieldName "rho"; +} + +DiFeliceDragMSProps +{ + velFieldName "U"; + densityFieldName "rho"; + voidfractionFieldName "voidfraction"; + hydraulicDiameter 0.002; + verbose; +} + +oneWayVTKProps +{ + couplingFilename "vtk_out%4.4d.vtk"; + maxNumberOfParticles 30000; +} + +twoWayFilesProps +{ + maxNumberOfParticles 10100; +} + +centreProps +{ + alphaMin 0.10; +} + +dividedMSProps +{ + alphaMin 0.05; + scaleUpVol 1.0; + clumpVol 1.8433e-9; // this is particles volume, not clump! + nrigid 10; +} + +bigParticleProps +{ + alphaMin 0.05; + scaleUpVol 50.0; + maxCellsPerParticle 1000; +} + +GaussProps +{ + maxCellsPerParticle 5000; + alphaMin 0.05; + scaleUpVol 10.0; +} + +engineProps +{ + treeSearch true; +} + +twoWayMPIProps +{ + maxNumberOfParticles 101000; + liggghtsPath "../DEM/in.liggghts_init"; +} +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/g b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/g new file mode 100644 index 00000000..51944e7a --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/g @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class uniformDimensionedVectorField; + location "constant"; + object g; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -2 0 0 0 0]; +value ( 0 0 0 ); + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/liggghtsCommands b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/liggghtsCommands new file mode 100644 index 00000000..7431b210 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/liggghtsCommands @@ -0,0 +1,31 @@ +/*---------------------------------------------------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.4 | +| \\ / A nd | Web: http://www.openfoam.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object liggghtsCommands; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +liggghtsCommandModels +( + runLiggghts +); + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/polyMesh/blockMeshDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/polyMesh/blockMeshDict new file mode 100644 index 00000000..812a89c1 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/polyMesh/blockMeshDict @@ -0,0 +1,154 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 2.0 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ +version 2.0; +format ascii; +class dictionary; +object blockMeshDict; +} +// ************************************ + + + + + + + meshGenApp blockMesh; + convertToMeters 1; + + //64 mm column diameter + //15 cm length + + + + //Width of middle square section + + + + + //how many cells in the square section + //how many cells from square section to perimeter + // how many cells from top to bottom + + vertices + ( + ( 0.0069 0.0069 0.0 ) // Vertex fiveoclocksqb = 0 + (-0.0069 0.0069 0.0 ) // Vertex sevenoclocksqb = 1 + (-0.0069 -0.0069 0.0 ) // Vertex elevenoclocksqb = 2 + ( 0.0069 -0.0069 0.0 ) // Vertex oneoclocksqb = 3 + + ( 0.00975807358913172 0.00975807357161699 0.0 ) // Vertex fiveoclockcb = 4 + (-0.00975807358913172 0.00975807357161699 0.0) // Vertex sevenoclockcb = 5 + (-0.00975807358913172 -0.00975807357161699 0.0) // Vertex elevenoclockcb = 6 + ( 0.00975807358913172 -0.00975807357161699 0.0) // Vertex oneoclockcb = 7 + + ( 0.0069 0.0069 0.0553) // Vertex fiveoclocksqt = 8 + (-0.0069 0.0069 0.0553) // Vertex sevenoclocksqt = 9 + (-0.0069 -0.0069 0.0553) // Vertex elevenoclocksqt = 10 + ( 0.0069 -0.0069 0.0553) // Vertex oneoclocksqt = 11 + + ( 0.00975807358913172 0.00975807357161699 0.0553) // Vertex fiveoclockct = 12 + (-0.00975807358913172 0.00975807357161699 0.0553) // Vertex sevenoclockct = 13 + (-0.00975807358913172 -0.00975807357161699 0.0553) // Vertex elevenoclockct = 14 + ( 0.00975807358913172 -0.00975807357161699 0.0553) // Vertex oneoclockct = 15 + ); + + blocks + ( + //square block + hex ( + 2 3 0 1 + 10 11 8 9 + ) + (4 4 12) + simpleGrading (1 1 1) + + //slice1 + hex ( + 1 0 4 5 + 9 8 12 13 + ) + (4 2 12) + simpleGrading (1 1 1) + + //slice2 + hex ( + 6 2 1 5 + 14 10 9 13 + ) + ( 2 4 12) +simpleGrading (1 1 1) + + //slice3 + hex ( + 6 7 3 2 + 14 15 11 10 + ) + (4 2 12) +simpleGrading (1 1 1) + + //slice4 + hex ( + 3 7 4 0 + 11 15 12 8 + ) + (2 4 12) +simpleGrading (1 1 1) + + ); + + + //create the quarter circles + edges + ( + arc 4 5 (0.0 0.0138 0.0 ) + arc 5 6 (-0.0138 0.0 0.0) + arc 6 7 (0.0 -0.0138 0.0 ) + arc 7 4 (0.0138 0.0 0.0) + + arc 12 13 (0.0 0.0138 0.0553 ) + arc 13 14 (-0.0138 0.0 0.0553 ) + arc 14 15 (0.0 -0.0138 0.0553 ) + arc 15 12 (0.0138 0.0 0.0553 ) + + ); + + patches + ( + patch inlet + ( + (0 3 2 1) + (0 4 7 3) + (4 0 1 5) + (1 2 6 5) + (3 7 6 2) + ) + + patch outlet + ( + (8 11 10 9) + (8 12 15 11) + (12 8 9 13) + (9 10 14 13) + (11 15 14 10) + ) + + wall wall + ( + (5 4 12 13) + (5 13 14 6) + (6 14 15 7) + (7 15 12 4) + ) + +); + +mergePatchPairs +( +); diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/transportProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/transportProperties new file mode 100644 index 00000000..6eb551de --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/transportProperties @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1.5e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/turbulenceProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/turbulenceProperties new file mode 100644 index 00000000..f6753662 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/turbulenceProperties @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RASModel; + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/clumpProperties.m b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/clumpProperties.m new file mode 100644 index 00000000..8d74c1cb --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/clumpProperties.m @@ -0,0 +1,29 @@ +clc; +close all; +clear; + +%========================================================================== +%m-file to calculate the properties of the imported clump +%========================================================================== + +fprintf('\n sphere10.multisphere:\n') + +rhoC=440 +scaling=1e-3 +nP=10 +rP=0.3530494 +VP=nP*(2*rP*scaling)^3*pi/6 +dH=2*scaling +VC=dH^3*pi/6 +rhoP=rhoC*VC/VP + +% -0.3301476 -3.4959164E-008 0.5563700 0.3530494 +% 0.5421265 -3.2849375E-008 0.3530494 0.3530494 +% 0.0822932 0.5358442 0.3530495 0.3530494 +% 0.0822932 -0.5358442 0.3530494 0.3530494 +% -0.5126716 -0.3946047 -2.9544078E-009 0.3530494 +% -0.5126715 0.3946047 -1.7513663E-008 0.3530494 +% 0.0822932 0.5358442 -0.3530494 0.3530494 +% 0.0822932 -0.5358442 -0.3530495 0.3530494 +% 0.5421264 -3.9639417E-008 -0.3530495 0.3530494 +% -0.3301475 -1.5302462E-008 -0.5563700 0.3530494 diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/loaddata.m b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/loaddata.m new file mode 100644 index 00000000..9897140c --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/loaddata.m @@ -0,0 +1,69 @@ +function [data,colname]=loaddata(filename,columns,headerlines) + +% data = loaddata(filename,columns,headerlines) +% data = loaddata(filename,0,headerlines): automatc detection of +% columns by word count in first headerline or first data line +% (if headerline==0), separated by blanks or tabs +% columns=-1: write colum assignment code lines +% works only if headerline>0 and colnames separated by +% not more than 1 blank! +% columns=-2: columns separated by 2 blanks (fluent/scheme auswertung-instat.scm) +% [data, colname] = loaddata(filename,0,headerlines) +% colname = cell string array of column names from headerline + +fprintf(1,'loading %s ... ', filename); +f=fopen(filename,'r'); +if f==-1 + fprintf(1,'\n*** error: could not open "%s" ...\n', filename); + data=[]; +else + for i=1:headerlines + if i==1 s=fgets(f); else fgets(f); end + end + if headerlines==0 + s=fgets(f); frewind(f); + end + if columns<=0 % & headerlines>=1 + fprintf(1,'\n'); + fprintf(1,' %s',s); + pos = findstr(sprintf('\t'),s); % trennzeichenpositionen in zeile suchen + if length(pos)>0 + endpos=length(s); + %if isspace(s(endpos-1)) endpos=endpos-1; end + pos = [0 pos(1,:) endpos]; % anfangs- und endposition hinzufügen + elseif columns==-2 % spalteneinträge durch 2 blanks getrennt (fluent/scheme) + pos=[0]; + for i=1:length(s)-1 + if isspace(s(i)) & isspace(s(i+1)) + pos(end+1)=i+1; + end + end + pos(end+1)=length(s); + else % spalteneinträge durch blanks getrennt + %pos = findstr(' ',s); % trennzeichenpositionen in zeile suchen + pos=[]; + word=0; + for i=1:length(s) + if isspace(s(i)) + word=0; + elseif ~word + word=1; + pos(end+1)=i-1; + end + end + pos(end+1)=length(s); + end + if headerlines>=1 + for i=1:length(pos)-1 % alle spalten + colname{i}=s(pos(i)+1:pos(i+1)-1); + if columns==-1 fprintf(' = data(strmatch(''%s'',colname),:); %% column %d\n', colname{i},i); end + if columns==-2 fprintf('%% column %d: %s\n', i, colname{i}); end + end + end + columns = length(pos)-1; + fprintf(1,' total: %d columns ',columns); + end + data=fscanf(f,'%f',[columns,inf]); + fclose(f); + fprintf(1,'done.\n'); +end diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m new file mode 100644 index 00000000..e03adcd6 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m @@ -0,0 +1,104 @@ +close all; +clear; +clc; + +%====================================% +% simulation data 1 +%====================================% +%path = '../probes/0/p'; +path = '../probes/0/p'; +columns=22; +headerlines=4; +data = loaddata(path,columns,headerlines); +data=transpose(data); +[x,y]=size(data) +dp_sim = (data(:,2)-data(:,y))/10000; +t_sim = data(:,1); +%fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) ) + +%====================================% +% analytical calculation +%====================================% + +%=================== +% Ergun Equation +%=================== +fprintf('\ncalc Ergun eqn:\n') + +% calc density of clump +% Note: for drag calc the clump diameter is used-> reduced density of clump +dp = 0.002 % clump diameter +ds_=0.001*0.3530494*2 % diameter of sphere +ns_=10; % nr of spheres per clump +rhos_=1000; % density of spheres +VclumpToVbody=ns_*(ds_/dp)^3 % ratio of the tot volume of the spheres to the volume of the body with d_ +rhoP = VclumpToVbody*rhos_ % density of clump + +nP_=2500; % nr of clumps +phip = 1 % sphericity +Ustart = 0. +Uend = 2 +timeStepSize = 0.001; % time interval of pressure data +Tstart = 0; +Tend = t_sim(length(t_sim)); +deltaU=(Uend-Ustart)/((Tend-Tstart)/timeStepSize); +U = Ustart+deltaU:deltaU:Uend; % velocity over time +L = 0.0212; % length of bed filled with particles +D = 0.0276; % diameter of bed + +% calc epsilon from bedheight +%Vpartiles=dp^3*pi/6*nP_; % tot clump vol +Vpartiles=ds_^3*pi/6*nP_*ns_; % tot particle vol +Vfilled=D^2*pi/4*L; %volume filled with particles +epsilon = 1-Vpartiles/Vfilled % void fraction + +%epsilon = 0.656968 + +Ua = U / epsilon; % physical velocity +rhoG = 5 % density in kg/m3 +nuG = 1.5*10^-5 % kinemat Visk in m2/s +muG = nuG*rhoG % dynam visc in Pa s + +dpErgun= L * ( + 150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2) + +1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp)) + )/10000/rhoG; + +fprintf('NOTE: this pressure is divided by density (according to CFD solver)\n') +fprintf('so the result does not depend on pressure\n') + +%fprintf('final pressure drop (Ergun eqn)= %f Pa\n',dpErgun) + +%================================== +% min fluidization velocity in m/s +%================================== +%rhoP = 2000 % particle density in kg/m3 +g = 9.81 % gravity m/s2 +Umf = dp^2*(rhoP-rhoG)*g/(150*muG)*(epsilon^3*phip^2)/(1-epsilon) +ReMF = Umf*dp*rhoG/muG % must be <20 !!! +%Umf = sqrt(phip*dp^2/1.75*(rhoP-rhoG)/rhoG*g*epsilon^3) % Re>1000 + +dpUmf= L * ( + 150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2) + +1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp)) + )/10000/rhoG; + +%====================================% +% plot data +%====================================% + +fig=figure(1) +plot(U,dpErgun,U,dp_sim,[Umf,Uend],dpUmf*ones(1,2)) +title("Ergun pressure drop vs. simulation") +a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf)); +legend(a,"simulation") +xlabel("velocity in [m/s]") +ylabel("pressure drop [bar]") +axis([0,Uend,0,dpErgun(length(dpErgun))]) + +%print('cfdemSolverPiso_settlingTest.eps','-deps2') +print -color "cfdemSolverPisoMS_ErgunTestMPI.eps" +replot; +SimName="ErgunTestMPI_sphereOfSpheres" +print(fig,strcat("figure_",SimName,".png")); + diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/steps_0p1s b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/steps_0p1s new file mode 100644 index 00000000..cc5e250c --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/steps_0p1s @@ -0,0 +1,28 @@ +( + (0.000 (0 0 0.002)) + (0.099 (0 0 0.30)) + (0.100 (0 0 0.30)) +) + +/*( + (0.000 (0 0 0.002)) + (0.010 (0 0 0.002)) + (0.011 (0 0 0.004)) + (0.020 (0 0 0.004)) + (0.021 (0 0 0.006)) + (0.030 (0 0 0.006)) + (0.031 (0 0 0.008)) + (0.040 (0 0 0.008)) + (0.041 (0 0 0.010)) + (0.050 (0 0 0.010)) + (0.051 (0 0 0.012)) + (0.060 (0 0 0.012)) + (0.061 (0 0 0.014)) + (0.070 (0 0 0.014)) + (0.071 (0 0 0.016)) + (0.080 (0 0 0.016)) + (0.081 (0 0 0.018)) + (0.090 (0 0 0.018)) + (0.091 (0 0 0.020)) + (0.100 (0 0 0.020)) +)*/ diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict new file mode 100644 index 00000000..32dc4714 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict @@ -0,0 +1,117 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application pisoFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.1; + +deltaT 0.001; + +writeControl adjustableRunTime; + +writeInterval 0.001; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep no; + +maxCo 0.1; + +//libs ("libOpenFOAM.so" "libgroovyBC.so"); + +functions +( + + probes + { + type probes; + // Where to load it from + functionObjectLibs ( "libsampling.so" ); + // Name of the directory for probe data + name probes; + probeLocations + ( + (0 0 0.0001) + (0 0 0.0026) + (0 0 0.0051) + (0 0 0.0076) + (0 0 0.0101) + (0 0 0.0126) + (0 0 0.0151) + (0 0 0.0176) + (0 0 0.0201) + (0 0 0.0226) + (0 0 0.0251) + (0 0 0.0276) + (0 0 0.0301) + (0 0 0.0326) + (0 0 0.0351) + (0 0 0.0375) + (0 0 0.0401) + (0 0 0.0426) + (0 0 0.0451) + (0 0 0.0476) + (0 0 0.0529) + ); + + // Fields to be probed + fields ( p U voidfraction volAverage_voidfraction); + + // Write at same frequency as fields + outputControl timeStep;//outputTime; + outputInterval 1; + } + + /*pressureDrop + { + type patchAverage; + functionObjectLibs + ( + "libsimpleFunctionObjects.so" + ); + verbose true; + patches + ( + inlet + outlet + ); + fields + ( + p + ); + factor 1; + }*/ +); +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict.foam b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict.foam new file mode 100644 index 00000000..d63da257 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict.foam @@ -0,0 +1,117 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application pisoFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.1;//0.01; + +deltaT 0.001; + +writeControl adjustableRunTime; + +writeInterval 0.001;//0.05; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep no; + +maxCo 0.1; + +libs ("libOpenFOAM.so" "libgroovyBC.so"); + +functions +( + + probes + { + type probes; + // Where to load it from + functionObjectLibs ( "libsampling.so" ); + // Name of the directory for probe data + name probes; + probeLocations + ( + (0 0 0.0001) + (0 0 0.0026) + (0 0 0.0051) + (0 0 0.0076) + (0 0 0.0101) + (0 0 0.0126) + (0 0 0.0151) + (0 0 0.0176) + (0 0 0.0201) + (0 0 0.0226) + (0 0 0.0251) + (0 0 0.0276) + (0 0 0.0301) + (0 0 0.0326) + (0 0 0.0351) + (0 0 0.0375) + (0 0 0.0401) + (0 0 0.0426) + (0 0 0.0451) + (0 0 0.0476) + (0 0 0.0529) + ); + + // Fields to be probed + fields ( p U voidfraction volAverage_voidfraction); + + // Write at same frequency as fields + outputControl timeStep;//outputTime; + outputInterval 1; + } + + /*pressureDrop + { + type patchAverage; + functionObjectLibs + ( + "libsimpleFunctionObjects.so" + ); + verbose true; + patches + ( + inlet + outlet + ); + fields + ( + p + ); + factor 1; + }*/ +); +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/decomposeParDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/decomposeParDict new file mode 100644 index 00000000..21bbeef3 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/decomposeParDict @@ -0,0 +1,86 @@ +/*-------------------------------*- C++ -*---------------------------------*\ +| ========= | +| \\ / OpenFOAM | +| \\ / | +| \\ / The Open Source CFD Toolbox | +| \\/ http://www.OpenFOAM.org | +\*-------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + location "system"; + object decomposeParDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 2; + +//- Keep owner and neighbour on same processor for faces in zones: +// preserveFaceZones (heater solid1 solid3); + +//method scotch; +// method hierarchical; + method simple; +// method metis; +// method manual; + +simpleCoeffs +{ + n (1 1 2); + delta 0.001; +} + +hierarchicalCoeffs +{ + n (2 2 1); + delta 0.001; + order xyz; +} + +metisCoeffs +{ + /* + processorWeights + ( + 1 + 1 + 1 + 1 + ); + */ +} + +scotchCoeffs +{ + //processorWeights + //( + // 1 + // 1 + // 1 + // 1 + //); + //writeGraph true; + //strategy "b"; +} + +manualCoeffs +{ + dataFile "decompositionData"; +} + + +//// Is the case distributed +//distributed yes; +//// Per slave (so nProcs-1 entries) the directory above the case. +//roots +//( +// "/tmp" +// "/tmp" +//); + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/funkySetFieldsDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/funkySetFieldsDict new file mode 100755 index 00000000..39414dd5 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/funkySetFieldsDict @@ -0,0 +1,33 @@ +FoamFile +{ + version 2.0; + format ascii; + + root "/.automount/werner/Werner/bgschaid/bgschaid-foamStuff/DepositionTests"; + case "neutralTest"; + instance "system"; + local ""; + + class dictionary; + object funkySetFieldsDict; +} + +expressions +( + init + { + field voidfraction; + expression "1"; + valuePatches 2(inlet outlet); // set value 1 at those patches + } + setGamma + { + field voidfraction; + expression "0.43"; + //condition "pow(pow(pos().x-0.2,2) + pow(pos().y-0,2)+ pow(pos().z-0,2),0.5) < 0.04"; + condition "pos().z < 0.01467 && pos().z > 0.0"; + keepPatches true; + //valuePatches 1(inlet); // set value 1 at those patches + } + +); diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSchemes b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSchemes new file mode 100644 index 00000000..fac85f68 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSchemes @@ -0,0 +1,76 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; + grad(p) Gauss linear; + grad(U) Gauss linear; +} + +divSchemes +{ + default Gauss linear; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss limitedLinear 1; + div(phi,epsilon) Gauss limitedLinear 1; + div(phi,R) Gauss limitedLinear 1; + div(R) Gauss linear; + div(phi,nuTilda) Gauss limitedLinear 1; + div((viscousTerm*dev(grad(U).T()))) Gauss linear; + div((nu*dev(grad(U).T()))) Gauss linear; + div((nuEff*dev(grad(U).T()))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; + laplacian(viscousTerm,U) Gauss linear corrected; + laplacian(nu,U) Gauss linear corrected; + laplacian(nuEff,U) Gauss linear corrected; + laplacian((1|A(U)),p) Gauss linear corrected; + laplacian((voidfraction2|A(U)),p) Gauss linear corrected; + laplacian(DkEff,k) Gauss linear corrected; + laplacian(DepsilonEff,epsilon) Gauss linear corrected; + laplacian(DREff,R) Gauss linear corrected; + laplacian(DnuTildaEff,nuTilda) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; + interpolate(U) linear; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; + p ; +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSolution b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSolution new file mode 100644 index 00000000..955f5b14 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSolution @@ -0,0 +1,86 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver PCG; + preconditioner DIC; + tolerance 1e-06; + relTol 0.1; + } + + pFinal + { + solver PCG; + preconditioner DIC; + tolerance 1e-06; + relTol 0; + } + + U + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + k + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + epsilon + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + R + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + nuTilda + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } +} + +PISO +{ + nCorrectors 4; + nNonOrthogonalCorrectors 1; + pRefCell 0; + pRefValue 0; +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init new file mode 100755 index 00000000..5c802383 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init @@ -0,0 +1,74 @@ +echo both + +# Pour granular particles into chute container + +atom_style hybrid granular molecular +atom_modify map array sort 0 0 +communicate single vel yes + +boundary m m m +newton off + +units si + +region reg block -0.015 0.015 -0.015 0.015 -0.001 0.0554 units box +create_box 1 reg + +neighbor 0.001 bin +neigh_modify delay 0 + +mass 1 1.0 + +#Material properties required for new pair styles + +fix m1 all property/global youngsModulus peratomtype 5.e6 +fix m2 all property/global poissonsRatio peratomtype 0.45 +fix m3 all property/global coefficientRestitution peratomtypepair 1 0.3 +fix m4 all property/global coefficientFriction peratomtypepair 1 0.5 + +#pair style +pair_style gran/hertz/history 1 0 #Hertzian without cohesion +pair_coeff * * + +#timestep, gravity +timestep 0.00001 +fix gravi all gravity 9.81 vector 0.0 0.0 -1.0 + +#walls +fix zwalls all wall/gran/hertz/history 1 0 zplane 0.0 0.0553 1 +fix cylwalls all wall/gran/hertz/history 1 0 zcylinder 0.01385 1 + + +#============================ +#distributions for insertion +fix pts1 all particletemplate/multisphere 1 atom_type 1 density constant 1000 nspheres 10 ntry 1000000 spheres file ../DEM/sphere10.multisphere scale 0.001 type 1 +fix pdd1 all particledistribution/discrete 1. 1 pts1 1.0 + +#region and insertion +group rigid_group region reg +region bc cylinder z 0.0 0.0 0.012 0.001 0.05 units box + +fix ins rigid_group insert/pack seed 100001 distributiontemplate pdd1 vel constant 0. 0. 0. insert_every once overlapcheck yes region bc ntry_mc 10000 particles_in_region 2500 # volumefraction_region 0.01 # + +#integrator for multisphere rigid bodies +fix integr rigid_group rigid/multisphere +#============================ + +#cfd coupling +fix cfd all couple/cfd couple_every 100000 mpi +fix cfd2 all couple/cfd/force/multisphere + + +#screen output +compute 1 all erotate/sphere +thermo_style custom step atoms ke c_1 vol +thermo 1000 +thermo_modify lost ignore norm no +compute_modify thermo_temp dynamic yes + +#insert the first particles so that dump is not empty +run 1 +dump dmp all custom 5000 ../DEM/post/dump.liggghts_init id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + +run 80000 upto +#write_restart liggghts.restart diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/liggghts.restart b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/liggghts.restart new file mode 100644 index 0000000000000000000000000000000000000000..e85ec5403680706c6b0f0bcda6b9fa04344fd21a GIT binary patch literal 1110 zcmb`GJ8#rL5XXo2L3kYRcUVHgD ;~+@ReP{y3U(vvH;OI|?ZrmZ` }VC_pG8M>wTuUm)cHC6Bnth! zcM7M9c R)fafAKm?BQzM^zYbsd&)zvVQI~P66v*2ZJzLRtDtfM>e`8SfsA4jTfSlK= ztAdrTP6lZubIYMz8X%X+QmYqgvu^cNW)eNj?W1Y3ky5GXRE+iKxN!#LBq?i~r2^-Q z*m4TiTpsufDx^P*{?BG~F;kP-Ky^!{Hp-7e6ZX?cn$YSGBBQbte=mgMs=iQfW
Uh;O}eI85ots7Iu7%8}TxL59+f^-l{muy+xvFRx159C~H_>{pn%~# > $casePath/DEM/post/dummy diff --git a/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh b/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh index 0b0af6d4..63ada777 100644 --- a/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPisoScalar" nrProcs="2" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -85,6 +85,8 @@ fi #- clean up case echo "deleting data at: $casePath : ???\n" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/octave/*.eps rm -r $casePath/CFD/octave/octave-core rm -r $casePath/CFD/VTK