From 88743b79fd677abd3ecb5aae535b5dc98c54e469 Mon Sep 17 00:00:00 2001 From: "Christoph Goniva, DCS Computing GmbH" Date: Mon, 5 Jan 2015 13:56:45 +0100 Subject: [PATCH] release on 2015-01-05_13-56-45 --- README | 26 +-- applications/.gitignore | 7 + .../solvers/cfdemSolverIB/cfdemSolverIB.C | 6 +- .../solvers/cfdemSolverPiso/cfdemSolverPiso.C | 32 ++- .../solvers/cfdemSolverPiso/createFields.H | 16 -- .../cfdemSolverPisoScalar.C | 201 ++++++++++-------- doc/.gitignore | 7 + doc/CFDEMcoupling_Manual.html | 38 ++-- doc/CFDEMcoupling_Manual.pdf | Bin 515919 -> 518492 bytes doc/CFDEMcoupling_Manual.txt | 1 + doc/cfdemSolverPisoScalar.html | 4 +- doc/cfdemSolverPisoScalar.txt | 5 +- doc/forceModel_LaEuScalarTemp.html | 6 +- doc/forceModel_LaEuScalarTemp.txt | 5 +- doc/forceModel_fieldStore.html | 68 ++++++ doc/forceModel_fieldStore.txt | 63 ++++++ doc/githubAccess_public.pdf | Bin 362748 -> 362748 bytes src/.gitignore | 7 + .../cfdemParticle/cfdTools/global.C | 80 +++++++ .../cfdemParticle/cfdTools/global.H | 128 +++++++++++ .../cfdemParticle/cfdTools/newGlobal.C | 84 ++++++++ .../cfdemParticle/cfdTools/versionInfo.H | 47 +++- .../cfdemParticle/cfdemCloud/cfdemCloud.C | 44 +++- .../cfdemParticle/cfdemCloud/cfdemCloud.H | 15 +- .../cfdemParticle/cfdemCloud/cfdemCloudI.H | 2 +- .../cfdemParticle/etc/OFversion/OFversion.H | 4 +- src/lagrangian/cfdemParticle/etc/bashrc | 11 + .../etc/compileCFDEMcoupling_src.sh | 84 ++++---- .../etc/compileCFDEMcoupling_uti.sh | 117 ++++++++-- src/lagrangian/cfdemParticle/etc/cshrc | 3 + src/lagrangian/cfdemParticle/etc/functions.sh | 15 ++ .../forceModel/Archimedes/Archimedes.C | 2 +- .../forceModel/KochHillDrag/KochHillDrag.C | 2 +- .../LaEuScalarTemp/LaEuScalarTemp.C | 11 +- .../forceModel/ShirgaonkarIB/ShirgaonkarIB.C | 9 +- .../checkCouplingInterval.C | 11 +- .../forceModel/fieldStore/fieldStore.C | 164 ++++++++++++++ .../forceModel/fieldStore/fieldStore.H | 106 +++++++++ .../forceSubModel/forceSubModel.C | 64 +++++- .../forceSubModel/forceSubModel.H | 8 +- .../forceModel/viscForce/viscForce.C | 16 +- .../DiFeliceDragMS/DiFeliceDragMS.C | 16 +- .../DiFeliceDragMS/DiFeliceDragMS.H | 4 - .../liggghtsCommandModel.C | 8 +- .../probeModel/particleProbe/particleProbe.C | 38 +++- .../probeModel/particleProbe/particleProbe.H | 9 +- .../probeModel/probeModel/probeModel.H | 4 + .../dividedVoidFraction/dividedVoidFraction.C | 15 +- .../dividedVoidFraction/dividedVoidFraction.H | 2 + .../voidFractionModel/voidFractionModel.C | 9 + .../voidFractionModel/voidFractionModel.H | 2 + tutorials/.gitignore | 8 + .../CFD/constant/couplingProperties | 12 ++ .../CFD/constant/liggghtsCommands | 6 +- .../CFD/constant/couplingProperties | 9 +- .../CFD/constant/couplingProperties | 3 +- 56 files changed, 1348 insertions(+), 316 deletions(-) create mode 100644 applications/.gitignore create mode 100644 doc/.gitignore create mode 100644 doc/forceModel_fieldStore.html create mode 100644 doc/forceModel_fieldStore.txt create mode 100644 src/.gitignore create mode 100644 src/lagrangian/cfdemParticle/cfdTools/global.C create mode 100644 src/lagrangian/cfdemParticle/cfdTools/global.H create mode 100644 src/lagrangian/cfdemParticle/cfdTools/newGlobal.C create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.C create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.H create mode 100644 tutorials/.gitignore diff --git a/README b/README index fd2ca756..2a7f869c 100755 --- a/README +++ b/README @@ -25,16 +25,17 @@ License 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. Note: this code is not part of OpenFOAM (see DISCLAIMER). + This code provides models and solvers to realize coupled CFD-DEM simulations + using LIGGGHTS and OpenFOAM. + Note: this code is not part of OpenFOAM (see DISCLAIMER). \*---------------------------------------------------------------------------*/ -CFDEM coupling provides an open source parallel coupled CFD-DEM framework -combining the strengths of LIGGGHTS DEM code and the Open Source -CFD package OpenFOAM(R)(*). The CFDEMcoupling toolbox allows to expand +CFDEM(R) coupling provides an open source parallel coupled CFD-DEM framework +combining the strengths of LIGGGHTS(R) DEM code and the Open Source +CFD package OpenFOAM(R)(*). The CFDEM(R)coupling toolbox allows to expand standard CFD solvers of OpenFOAM(R)(*) to include a coupling to the DEM -code LIGGGHTS. In this toolbox the particle representation within the +code LIGGGHTS(R). In this toolbox the particle representation within the CFD solver is organized by "cloud" classes. Key functionalities are organised in sub-models (e.g. force models, data exchange models, etc.) which can easily be selected and combined by dictionary settings. @@ -54,7 +55,7 @@ The file structure: - "src" directory including the source files of the coupling toolbox and models - "applications" directory including the solver files for coupled CFD-DEM simulations -- "doc" directory including the documentation of CFDEMcoupling +- "doc" directory including the documentation of CFDEM(R)coupling - "tutorials" directory including basic tutorial cases showing the functionality @@ -64,18 +65,17 @@ Details on installation are given on the "www.cfdem.com" The functionality of this CFD-DEM framwork is described via "tutorial cases" showing how to use different solvers and models. -CFDEMcoupling stands for Computational Fluid Dynamics (CFD) - +CFDEM(R)coupling stands for Computational Fluid Dynamics (CFD) - Discrete Element Method (DEM) coupling. -CFDEMcoupling is an open-source code, distributed freely under the terms of the +CFDEM(R)coupling is an open-source code, distributed freely under the terms of the GNU Public License (GPL). -Core development of CFDEMcoupling is done by +Core development of CFDEM(R)coupling is done by Christoph Goniva and Christoph Kloss, both at DCS Computing GmbH, 2012 \*---------------------------------------------------------------------------*/ -(*) "OpenFOAM(R)"_of is a registered trade mark of the ESI Group. -This offering is not affiliated, approved or endorsed by ESI Group, -the producer of the OpenFOAM® software and owner of the OpenFOAM® trade mark. +(*) "OpenFOAM(R)"_of is a registered trade mark of OpenCFD Limited, a wholly owned subsidiary of the ESI Group. +This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM® and OpenCFD® trade marks. \*---------------------------------------------------------------------------*/ diff --git a/applications/.gitignore b/applications/.gitignore new file mode 100644 index 00000000..44599544 --- /dev/null +++ b/applications/.gitignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.dep +log_* +log.* +*~ diff --git a/applications/solvers/cfdemSolverIB/cfdemSolverIB.C b/applications/solvers/cfdemSolverIB/cfdemSolverIB.C index 93f0d41d..9c930e63 100755 --- a/applications/solvers/cfdemSolverIB/cfdemSolverIB.C +++ b/applications/solvers/cfdemSolverIB/cfdemSolverIB.C @@ -72,7 +72,7 @@ int main(int argc, char *argv[]) #include "initContinuityErrs.H" #if defined(version22) - #include "createFvOptions.H" + #include "createFvOptions.H" #endif // create cfdemCloud @@ -128,10 +128,12 @@ int main(int argc, char *argv[]) for (int corr=0; corrdivDevReff(U) - == - - fvm::Sp(Ksl/rho,U) - ); - - UEqn.relax(); - - if (momentumPredictor) + // Pressure-velocity PISO corrector { - //solve UEqn - if (modelType=="B" || modelType=="Bfull") + // Momentum predictor + fvVectorMatrix UEqn + ( + fvm::ddt(voidfraction,U) - fvm::Sp(fvc::ddt(voidfraction),U) + + fvm::div(phi,U) - fvm::Sp(fvc::div(phi),U) +// + turbulence->divDevReff(U) + + particleCloud.divVoidfractionTau(U, voidfraction) + == + - fvm::Sp(Ksl/rho,U) + ); + + UEqn.relax(); + if (momentumPredictor && (modelType=="B" || modelType=="Bfull")) solve(UEqn == - fvc::grad(p) + Ksl/rho*Us); - else + else if (momentumPredictor) solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us); + + // --- PISO loop + + //for (int corr=0; corrcorrect(); + }// end solveFlow + else + { + Info << "skipping flow solution." << endl; } - turbulence->correct(); - runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 00000000..44599544 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.dep +log_* +log.* +*~ diff --git a/doc/CFDEMcoupling_Manual.html b/doc/CFDEMcoupling_Manual.html index 5f120f05..30e06ab6 100644 --- a/doc/CFDEMcoupling_Manual.html +++ b/doc/CFDEMcoupling_Manual.html @@ -218,25 +218,25 @@ listing below of styles within certain commands. forceModel_GidaspowDragforceModel_KochHillDrag forceModel_LaEuScalarTempforceModel_MeiLift forceModel_SchillerNaumannDragforceModel_ShirgaonkarIB -forceModel_gradPForceforceModel_noDrag -forceModel_particleCellVolumeforceModel_virtualMassForce -forceModel_viscForceforceSubModel -forceSubModel_ImExforceSubModel_ImExCorr -liggghtsCommandModelliggghtsCommandModel_execute -liggghtsCommandModel_readLiggghtsDataliggghtsCommandModel_runLiggghts -liggghtsCommandModel_writeLiggghtslocateModel -locateModel_engineSearchlocateModel_engineSearchIB -locateModel_standardSearchlocateModel_turboEngineSearch -meshMotionModelmeshMotionModel_noMeshMotion -momCoupleModelmomCoupleModel_explicitCouple -momCoupleModel_implicitCouplemomCoupleModel_noCouple -probeModelprobeModel_noProbe -regionModelregionModel_allRegion -smoothingModelsmoothingModel_constDiffSmoothing -smoothingModel_noSmoothingvoidfractionModel -voidfractionModel_GaussVoidFractionvoidfractionModel_IBVoidFraction -voidfractionModel_bigParticleVoidFractionvoidfractionModel_centreVoidFraction -voidfractionModel_dividedVoidFraction +forceModel_fieldStoreforceModel_gradPForce +forceModel_noDragforceModel_particleCellVolume +forceModel_virtualMassForceforceModel_viscForce +forceSubModelforceSubModel_ImEx +forceSubModel_ImExCorrliggghtsCommandModel +liggghtsCommandModel_executeliggghtsCommandModel_readLiggghtsData +liggghtsCommandModel_runLiggghtsliggghtsCommandModel_writeLiggghts +locateModellocateModel_engineSearch +locateModel_engineSearchIBlocateModel_standardSearch +locateModel_turboEngineSearchmeshMotionModel +meshMotionModel_noMeshMotionmomCoupleModel +momCoupleModel_explicitCouplemomCoupleModel_implicitCouple +momCoupleModel_noCoupleprobeModel +probeModel_noProberegionModel +regionModel_allRegionsmoothingModel +smoothingModel_constDiffSmoothingsmoothingModel_noSmoothing +voidfractionModelvoidfractionModel_GaussVoidFraction +voidfractionModel_IBVoidFractionvoidfractionModel_bigParticleVoidFraction +voidfractionModel_centreVoidFractionvoidfractionModel_dividedVoidFraction diff --git a/doc/CFDEMcoupling_Manual.pdf b/doc/CFDEMcoupling_Manual.pdf index 2f6afc0c55ede53db025b3cf6d29c129fe3f34b9..1ba7d809612f26e3aad11f0f46a701139a747d34 100644 GIT binary patch delta 57315 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�anZA6~RB_6vl2&el}FbF~}kc;FuX`D|qX{im(#Vo}^60&q2U5 z89ZZ=1)eG38A}=POa;%nNbC$GMj&b-w`U+30yyVroPlHsL=rMI1BnudWQ6@MBu)UQ z&#V4IvSLJheMfgM$HN|8PR{NcuKphG%HRS8;_w%e1{gi`FQg!Wb8z%XgY4`(-bHy3|~ zKKNd`c-+&=$=BiF+%WCDAgscqbABzX%A|Y#5G)T6==lU#5uE#yG$Oz&z%vs8T!uVGfCUIt zDo%8Z052zi&8eIKix8+ZWQG7s&bgMVgMLKcXXTmURRnD<#Dp1Emd1AyB@bsmR}U|L zH!sh{x@eP-WM){2piM>|Gs9v8Z3?2r0t+ES%z%$J75^a0f_~6OKgfyU`+$DTWdX8*t7x}aU|A{rEm6tO!^_Lx)y?zZV&>qc-)9zBoj@ZaLJ*Lc zMnUu;Sdu`aA~q0AC4i!z1i@Ma(42k>!JvZ$!7C6R7#0Oglwep*6D#C9>=vaZnk|gf zwxQznSJP^*HTV`B;vo6paw$QFf?R`P31om3=0-mdJs>e@JVzI1VhD{f6RojCHsFbE zUn@_z#0K0TWa0*EKVgG;ka1R668VNcnXti9h%h^NDn0?; zYu2%YCFI$`s5|-{xB>(2c%e_n*kLIURu|Y|6=aYdRJyIK=lsb$DmgJo~GsBGtZr`H5GvNiAb@G6x0Q3p%L-11P?#|$ph{Z90shfC#8zEj` zm?>W1t8iXenwzoTG00@uz@Ql)ScSv~o{sYYvQ9t-;`a|P(DDTzkR%cv`hz|d@&OH2 z@q?!i;5%UH89pF-5I<0f%nyb#(IHAQu-XV8%n3Bi;s@h@(eWsBTuA_ozv2LP*49Oo z1ptF!^cxgUBbfrAx?nfMBzUln&72JZqC&56{uKbSoe_X#fvd6wU=^OlnFJCOctR3z z{KpR~^I$EQh56WhE7a+{7>t@9pkVgooonG>HUTSPK6s!6b21y+(9jDvAVzhFDT1&# zD^(NQZtrangaZlsG`vB|L1Vmf&=~inXn0iy-{WwahL>56MRh<2sXPMA0PtHb5#EZZ z3&Y0{BND7|uTdB#L&#q}5NcphVl})I@s@xck-F7ja8d&P1|i97@xh|CU{Iz3UWHtf zfaQ?Oa=_d6>j2p+Iru9J621Xvkg)*{L$0m{mB~*T=0~hI!tzL#GAu&(@aod$`*+2@ zQgk|jP_S}aq1y7Vk)>NtyK{C@pTS&A9GfycJPJQ;^A(t#UZcOGaKr0La|-*B+J`5u zoRGaKeelxMWNnB3eut*Q=8MBqfutGN-G?eOj`h{3ZR?+0T`{|<@a7I@g9|F7i52ZV z4KMH6KM&+P#`Lj>uR;9TN47TluWYA@g9c(}Z}iUO?|9YGl;&vs!|1FWm*H6|bWMTW z%{d?%Uv9{GN-JC{V9O>OHAk2D@pG&89Ut-Qv=#Ez3D6ZA?!DXWGo*UoflFE@EUQ)3 z6t3~S(R)ea<+t@PQ&HdBx~i{2qCEAkG0s0?zsA-%JWuFNI6KkqG?}=~tA{QZAR`yG ztIzdj{h7$$@bXlpK6qeYvLsyfh^6}G^MJDSe!YzC?qBeQ>PxcKvZBKUO*fN|Yi+Q- zv1_t;rG|hsR2@q(+2G}}JF-e9VE3fh1?daVb^EGhMLi16mh(U2*KHEjkVqPpis5Wk zU^f=Hv7HumSENks%`#%4me~n<4Kx3z#^}rD3fb3esl9v>+Eyta*lc1Xo>AC&DqSOu zn9eiba>!Y6?a;M|4WfU@LScy!MJy#+b!MkcPdyOp(jZ8jss_6$%d_ac*L~VwO-i0> z;c470CO1{o-m?cX;mlsvRFj27$TY00GuvcJxMXm=xGS~?@X;9+T%qbhkA3D~{4s!S z(`q#vx9F+mQ+2tiXO+Q?r`~uW+9u)AV^3D-os`&XA$Z9W zsCW_52Ysr%{mz_R$M&W?OgNk_%yc@@D1;*p?x@e&%ICe}NGm$2=jrzSITxs6k?OJC zvMUDj-Fxp>za)>iiS^OFHt@a(O*Ax^ok%$0d%(!V+(q%4^g8J`>g3F@)+9&cTSMI= z?&<%Ebsjz%-P<5+Y-{@EQjt+y_|*Na8iiw~mm7Txy0?vcj`9lmD2JbVbqOX?UMPk= zV?io!x?8uk=Gc6EW=%`8Q!dNMvns!_`Dblh+l?`$y*9{p(nR~0BXqlaNv3PfG}=GC z4sYcSQ4esADyb_htB*MZJyd}M`(MCGC`o%X=)}@CG|NTCFMTvDgTgq;cAIH?im8}n4qd7m&el*_J zQ&Qhnv#G!EvJBkZp~Nd@nfWu|`v4cu?JGN2!=B}QU@|W$%hl`9kNUYQTV#Ff_ri=l z&nx|llvS7?ZluUO_ON^=JfMK?DOu*bS0Hlzr+qq zWd&~R?{R;Vsmjhy^$a{=`{1?t!S(}XNB&xu3+vXl~m)vGDF#t z%UNaTT!tRHAVTJn_ zhdU#MUtKq;Q`odKBwf#3@O?ubvt@1#mkZ?_!8CWXOE>#$n5>CBDNw9~W^!Z~`zB7h zz$S&JKT2<+HomTWHj-U-VOv{vAc2Mat;}u@4NBeR+}m6gd-2xCpZg?BxqC~W``Dd{ zp-vuBu%uYT2=ZNL9VmY+o?7&Njaigzu>LEiI63>|u9Ax4+5)ST6HT=lHgX2JhR;~c z4xCpGmg&hiYEb*x=gYPC10%_{yIzL(PfcuY5$+fiQMmdu{DfOlk2e2_5Pk7GmL+YyTYGLk{^LR` zY-#KIy?^Csm482}g}QS3t<~1iAxbrk> zmOj%g$lS17Wt$0s+q7J{W}y8*Y18LTdnyJM`&gwZ0#XB6n_k^DGJdNT9+A#U*gRu( zXktt0wML5yX3Z!r!%MauPaFep*V?xPnNRL(y?S07qSS6az1N)}<{q@iPeH_Vt&*AU zzH)<39nz88_q79}E2;7Q`zUYWc%hy@hl=Y>Mow=RZ@FU?Khb)A#`wpq?aZycPgigB zeZ}e`?C<3*onE@Jxpz5dcgW^TQmbF44L$yl#2n<&yGB*GVb7R z`}Epz2Rn;or-6bg_gfui#{<4RJ}zYQ-BQ)YrsH|}x+kp5oLj7170G4^8zl&l@{{Sa z?;pt5NFzB#Pm%g@ZzONW4DVl^KU0I>FZ;C~x}5Xc*K$?l)7;m~Q;S*^;{!VA$IBb? zvhKRXyu27YOC36wAyde;Doe%uW`3>qvB!e)zwe~ZzBqqp+sURALqF989w-&|$o+j| z+4CtRWx#iMx7342gG%E*_xzWaXngm#Tz^@u`EE*<;PopuTWvNV)dz2cUnmt87I@HZ z?QN|RSl^f-sIDeIZsBivx>D`!l*&PM`ZlgKs|+Lfh~k^K9o%ISk7W)=4y^YxdJ*$# z{YsIYoLh|{>7S&pr-WgFX(hd!n3c*g+lsv@MNbc?XD20dWNq%MFMG~eZycc+HG21U zM5v)g^pDFu%uX*MbuPfjI$6Oj@%5x*tdl-(d(yGqYc1h_I z+sVlsWh>ONx{|f-8mIM&EkCXoXZfYF?~TfiI>f=*kgs6-~1^cJ(nrszu~)em;1}K_)RK7s|YO ziuahPzX9MGEF}3hhE5o(Y!T}{E-QREv>{bd@SDTU%G9@P0hv`_oU+w_n|8IS~v|G0tl&b#zCeaUck|Gr|jJUldVwLtthJ; zqpgZ(*?&_nYq|LA25tJ8dMJ@fRFn5DDCsHQHIjrFDOy_rpMGuIrS0d=p96JEg4pqv zPP2G1ks@kG=dtHY>A?K?pI|F1T)(w$N@R?%IaST-oG|&@+v21fgGXXNy}Qg|FQDqS zS-V6lq0T6=TrlV)SJ}0Q(5GvyIjtp+nSI&*s>;DSrp8*xKj!L73DvAKnEtngE`s3t zug&O2ksp^ASIBW54!tf?yg#OR#4WT_H(e^t?5swl=9$dk+W#-s^xkaTwfWvN&G*m0 zzEMwct-Q1Hn$(0~&Wh50Y84jOh^8AFZy<6emocKPShzT*U%A{iLHIC07o%d8rcej# z8~Vrnr;npSdhqE-_U6YWHgggxXvUZo=cA!8`e;HYx{(uJqj#ppy2m?i;`Pb?0e8DE z5&oG~$W!l&MP7sc&9Aq7%BcImzIHt$7H&pVONL*GIXrXVfXpDtN)3MgacX(<)L9LW zgT(vmmOpVijjX)vd*&$}B$Cm%*{?=_1Fq}W+c!s5cHP$e8gaaHSIq(S$xWnmU%87d zAbga+ns%sM`SAaw-2qc_)TzOcsE!oJT+}RP%wCpw<#*KRP3Hz>yMoiHwPbj zOuM;{hYGP?uTsws89drNaAeZ)&`^c7%Y9YlPC8E)LieW!uPfP@)6QY{c>Q$wRM4?^ z+QH*~|GQ;1;aD_18UgQlTJwN2 zY(Hy|#H|&Qaia7i+qwrlYiCPDU%W5%T2~r8JN?q0CvC{mbC0 z?wqqcAxAO?OZZtT@?6e#eEj@H-?HVF@2HOH*Z!{Fv8zec=lshbYk!;cv<{JYmU#Xt zlbU*!;o!r+A+x?~gC%%YRKG8IJI!^N?TEsy;!e-bbzOs>)i%<@3kSVP3Z~7aj$J<< zNAj$repz+as-VHs@!n<4+Ipm@Lb2+O+O2A7#{f@96YxOEj0*bOZxsQ|4mRHPl(vF`vU`9@6&t&s_pWELW(pF#E&`8=mza(a?T2N z6ISU=UsJBn^~F|bW* zelJ!_cb~$qM+~g!W^dD3ttD%5|H>^I8ELzoMtCK z5x-Eq&~-&Dq*)d2g=~cD35dsDye$&5cX9Uw{FN0Ap;!aPw9W8M7-6;p&2|8%p#qRF%?AyW@{6%$}{@FT?)sJfujx|CnT#_oDx{jSHKJ_nAY!6MZ!Opap^p{{rQ$wtjPUydsqFWZ@Iee zP_t&{+x;ib*0@%#$TQ{I(;{A zVGUU%r% zct4GubZekPUsv6}Deyq!hDvu!YW~V;IX?phnbH+UGA@r@3L3fLdD}U9eK?D<=0(cK zW~WWQmZCjRdd)uB+z{I2k*w5Wq_W|YqKxCU;H(j=N$G(bYRJ|L8B$daic~`Amrb(7 ztsVviQ9G?}X54tQYU%+`E*E$C_Kuy(NAJ^1jSQ=#a6&mtd!NpK!IJ{fNO+=RVEc8%+Q8Y2$ z#Us=0X&LwSRIk#&)Y)Ki_-a44byC6xFV&vBZ(8-DTD-`t&iCI;*ipU<`BFM59=V#2 zH_&HSMM42KFa2%0t{Lwtb6qhWDcNqUu<_hyhw6d8e*S$~!@tagH(toKYqVSa*uHO* z%D4Vu%eWq$TfKpHQnoQ)zLnV3Y?P~aJ>cD%pl9o?(s%s2$r^9}^5CGWKU# z_trL_xwDzAgfIOZ(K(H&MGsNf&ZID*e^h9{)Ycj~*RkEkhN)E>lUiOz-4DvTk$g5g zA^Wq{fnmKvq6n+XcwEmrv!4l9SEwm&SJRIg%(<-k0eFcdw0X_&+hBd>-UIXPIw;8lX~kSi{AwcLbTo&dbwZxSg?6E^yMRIVrhN$MA3w_H-Fqeq{j`frTm9LuNUnGgTFE)A$Jdf zLUhm?zCu7)J@Bfh-~sy}*O*yV009kY_W%UH?BKsl$Z;RMieB`AW6?q^O3)=CCca?& z`+isfLMo2n z!8n0X2wZ@kF4u;DAx=-&n;Gc|#ijcfiVlH`xu?Jo-4`}sM$As*vpi0NA#hYI6A3sz z18kX*q-cDoAQ~N_B2F=2*6eY3oPgxS<3o+{pzchIDcP2(H4le>VY6)9Yg3u}W`(!1{mcxe6`eHXmS~$|7O||8sCfol-2&Rr7>Y1DhwoTT(Q)V+F z?H8zdEcN#N^5VPK->f@FpX~bnP5)^4z`-}$_b|Z201C!+P#{ zC=2m4g%`#s3ndq38z)UeK-Je!rZ-#Gss+98-d!^j|^<-r2Pr?hX8S^`*9WCs?wEXz~LorK0p9n6;FnURh zYcksS)kMVfDmYmOu*v1>64(U(j1UpM1`>rx)j~oOK%!J~RB7=U4o^kvwuMo<+T;%! ztU2~_$WDH%ksFurtn@jh9ZnAWBae}{8zc;{l^NXGAC^#JVkX?++j)?+A?pUy;q0zq za)yZbzZcv0TU4coE+zfsVz1XZKEllDgiU;k346{}@OszGMD!2;?b^Cx^FKn8b04d@fe_2T zZ2CuUnoqZdnC8q))gvD)j+c)J?n!<6qI3CEgRhx!Z-O@uxDFd%8s9o-`ZD20lyv2R zi+z6K>x|Mb1w9cz7}2?>3ksM0u`Pe9hIrh}VNd%z=JwAYsDnq#kL^*NO6=#>*VnI* zJp9#tqJ^k^e|$gB7XePGvVok6+#Hpa9Km@M_a~isGPW12`ZsDJSI)vR{8zUv8>^G= zeSg_-l^!DKBirdKo#-gf3{p|{&04;t+QZj zd-bqf@W-AlQz;hvX4b24yq+Ftztx(UqqMx>fo{X*gHwHv%UAYQKL`%CC|Ij?;oBwe z42_11u36a%ir{^Hdrm!X@69cHEyr?o1D*EY6^Z@5_DMnV!_HNIdmaDw(Wg@7?$ef) z^SuijUcbWDiM^Rg^%T1kNkYNPr{I&iDpv^UU^9EfnFIIM*^Z}tx&4F^TXo4Z`G(w+ z-DjTGRBePrn&|?k9}cI5-M^PS^^omTvY*W6Xy*t83qiG0m*m#YE|=dDqnW5wwsJSe z!x)E+QIC>2NW8{{34@Nz4%*YF>3&~3e&77qbgm@V^PgDwuI0Tm;Y~_KqC1$xjpfo? zg;rNrSU&yq!#h7dcB`NKqnm5`nI#MMa$Wj*AnISRniUUM2YWl$ol;F{`Jx)Wf+EW* zj^ovu1nux%?*P{eW3B^{suyZiB~0o*G%KEZoHexi%WUwl=JbazkHxvpbjmtjqucJh ztm<-m{EMIK!OlcCfAfp{tU94hqKCUO^Ar1@yV? zH|6x``iHv18U^3%t@Q6lWHMJPz6;h{>FKz$~=YrFEVj9%KT z7`4SWJBitO*RJ@Iy2fF0Pm}hqtJ14;#sxN|iQ zvz)1dMqYhK4a?zgU)DS-b$nk5iw=KJGd9}MXsas7TJLOhF-NjM?gaC}byREQ!W~?L z`a5$_0^El>m;<1MK@#l4%uS4V+~F0{J;S+u_Gm2PeHW)rzdH}G!1bnG`QTMi2V8;t zpI5~iOAD{GEqoypcUSzbPdrpbcy=T6glpQQKX2}F_CwanJ4!+;KOA+i6YiYs?rtJz zryt4wCZ%C<=4}yqteMu$Wq*(m^k;cKhs;@7)q{_}yr#|Y&D{TYcvV$JjEvcV7m)&l z?g@=Q=T4_}&?imWw0fXc&r&zLQ^H+NIp=*1ktZaK4w+aI)C&+I7> zS)ZKq)o(qWx}j1bRA!^$2qN3@komg(s$}1M_Qb%(L<^Rdx}7;0)pkdhN731gZbH4i z8aDPfcdlaZozf%7%BWZPh@IXw$nomk=-|fGX8XIEcR&1~9~u)af<3*wdN)x6Q$nO5 z@rKLQ1SuQaY9&(Np|-(5;^x#Nts|$sOya}}HP~u( z>;-js%6Vf>`n>QOx0I9K=iipDT}tY3dh&FG<%O_pCG&@`vpXN%Y3BL9DLum0IhJ%j zXJVg7Wh5v3l!>09oRr5!_DT*rtw&}EUo)MWu1c9%j|(=w?~snGc64-QV_T!> zUC^^V%PDF_Y+B$Zhzwj|x^VXLgxfXZ0G!H+RQV`6GwXLyv-9zWxa<73f?rNagwf?qt z7p(GHOH^Jc`?|png};cff%sU&Ugp>C1w$8#ylFe$X7Wl8Kev+LhNPE`p4`#)&dDQ6 zUNdFO-T2U_n>mX1<{k|iDCT;tp3Btc-@R5qM$*{$82kM7Cg;b`xj@is_LdD7DANT?U%;BWR4H#L97^bHUExn}ujjDVh5*>VZBi_h=)kH7d~@44Px3E5nXXKP?FcntteA=MI) z)*fl_BWA9o(X_$7kA13*9A&zQ+I^hP?mk=qT3fsiz^y@W5pnx9SeOoO--Jxq`;0YS zI*_8UH}TT);JpGK6>SG>geKE9;N2MlN0YO5B&F^DI{RVuj#TFk z52x2Yz8cum_cp99(wWVT=p!kz=j)5>Pu9_|1R8g<%h*Q5aYB=M-);T91Uy$&2PA7S zAEYMp01zUj(`zoKG25y^-#>8NjFQ09ZK2osFy^)Xz-kV$Dkc9Qw%z<|rzc-a{H)(z zucP{A-&3YQDS6!sGbzTuBn*-+zO&o%s>33`94mGwE%4zx*d^2Qv<>O_V*R1-3wZ?8nMqY6$vK>f%vP%@9)Birp>q<-B zdP{KMt_15eCtv=n0rmH_CX{14njJgxBc*eTx1Ya}UUH(w&*CSSVbtl)ZP7o60&-RI z#48Wi8FsQ+lKy_R;?%G;4{`$SLzkkecDtNaWgnVMQXfJUFG5D-BAPqKS{fef8EKFI zeBsKf+u(3&3s#&ipTjn-{vM+uH?wZ%@dX;v|SS7%hs&9 zJ)fQeGW>F?XNZn_!a_Sb+i zP#*B+MauVk+0V$u+x~^Vs{L}SSH!2CDwV-HE_{AAg`-IPuIQtaN#D|aU59+=QbtjJ zEH(-@woT5er0le9Mq_6-B8CBDpyS=IEHIhyV^c3M&E_qwQaE0=ux{`&w~^~&Ee-4lM< z_QT4xM{0H^#=N<8p)mTQ^0D%e-PgyS44eJ_U{H}h-E3lcdf6vlbCqrT*7hy?l1A2d zJ)N6z%_y*4mV;Ekk5{fE_F$Jpfx)QJjAiwEhn51@TB1tqg#)rC_de6Jx4*dNNB>L@ z6j`0|C}h7;1aphU0BxoGA<4EsC&kY=&nm8bDxOT2l9F5PwBf~(>jhsOH%kYXG{>H~ z@G<)BZQ)x3S07UpCNfSB3~kenFp=Grl3i)BKBvdIVY62BWml^gBeoi?k;6TuYu9%T zM|yK|sZlMu51d@{K-9N0@`qdeTS*lGApwD{W=zaR$Bk{APF&GVkQr;+)@N?6qhPAJ zLI38?JHlQUQvAPaZ)q8Nr`dPq^uUdb(bi#dz$+P!OG>tT`^M!OKI>haAx^Q(zV=f= z)|BH}?pY47ig_=rhOAG3+0pC4vX8<3js9KT|LotvN!t&9)Z(id{wJh)kHz}!(I4_Z zJVZM8S+{!xaj9kN$CcD2sn#n`4+f~++gk6y&PJktcr89xB zTZ&h&AhpV;vQ?%AEj|zY`56Cf?UV)mcD(7(nTL@A$KuMI>AlUKF=bK5MGrmTGF!3E zN@Ts)b+!hv;x<|T@b!P!n}xSnM5i*Bdu*vKF77uZWeKLs@$*?)`WU;kvkvV zp#JN!JyIE%cf9!1vAusqhE@C%JU0IQ@J;YRxsdyTRkd3_D?Tv`WQo}WH<_#{NCM)ZSQ$!uSPT#@PyyZgH= zsSXc*&4dU{e0=2GocVKLf0D{Q=d$-dCO_Q2-fo&ctv7XkhPiR@?Qevu5_jpEN;sbx z{D&dPNF}K7&obc}W^T>;VN2rFiJ#J2|315lc-7#P*J>E|ECIPTvh^8ELDF(SnXmNh z(&8%rq8ey&(x}Aot=ZeIRHydz>Nc^j3KiEHe6u%{lIjP_xThx)liurWde|lKlx^ea z=$ai)kGCHP=eL}=Qt1A*ISF}9mA7d685-bvogN@`;?uyB4#~vRYA@Oeubkt$MJ5XbRFcAr z{Y>ntk2NJdml>CiF4)ha*L8!h)_hmbO-1&khIFOiy(^WT{yJ1-Z9klQEIA|M;ltJU zEpsm|k7v%m(kj&N{cZF}4TTBHGqD@H<)0b(XQZeZdaCSmal)y8>)F3b4Q|dk32$#D z)Bo5w?oJtA&!Topuj^94%9R&1&;0u}e(?3rFB6qr#`0dmBfATC#Htxk+5FoNxBhr+ zRfLpUzB0INc*mrAaJw+y%KI|=SQ6scA!?m&73}zJ@J-|Df6FF0ZfuSl{PF7T_hkAe znePYp4VU;|J~f-x-I$RRs<6DO^5~)Q$85(}i_=H{ttng``u#iik%6D~>GTh~9wnJs zect)_eQ6()rmjM0>JVXn^~)T|;;($RF=73NVkXOfGty1J$B@i9;*lRc5835t(0LE5lsg@U{v~H}0_Q z%XOy0CFsA*`JVNzSbf{4-AT70?%eAyyJV66yg?No&8V`Vl)jUR!$Ag*`W=VN?@Mnx zd_PlukX<}u>S=D@gx*=2sY62ShKC;rtDddr?GBfC!~G?5^rccIQMXb+3=SoW86CH@ zUG0~2{!?sT$c0?-0c-J1`O+u%Y?>@`bD~|T9vy~f3^(frG{QsXV$*YyeJK;ozjWD$g03{r8cE{TeXY! zzU$PpR(hpzZLW5PYEm{IM}GUWr++DOa+18;Lf0EzGfMGlj@z>F(o?mQN~R-gD(vOb zWw!Rz@<%H<^cHzr@lD5f?9w7MzvZ7?>jbSBa5!^Apw9Q4FfXasHh0fkTI8*e?ER_Y)h$&xH1=Cy=FI*3DQCt1C@C~v&hQL> zbldMX{fXz(eQxS$HX(-jhgwG@&q!VH{_?%%S{*Y@M*VsJ&2N)q4?i6GokSg~+*4?N zzRAFn&0pWua&Rr}w}JNMB=t|*{Il}{$EuFA@TM3hEmLaoYXAMp{AA?4*pyty;w#$A z)*TcwG4s&u-hTA?BwwxDqpN~6jtTkS)>|)k|J+ekL;qVN^ylpfzr$lk^yPUTGW%`( zHOxM=OO7Y#WVHD=LfM+OwCwy9J-6F7zf=2V@mVNWIQxWw+_N8l|N5^#DwwiEe22>^ z9nro{PQS3^sm9mkw(G`zUUOdk?j0SOhzi=7n4Egv-RL^ct|N4f&a*$a+c7DWK>Hu` z6}mUqu;tZQ_}Ol__K@_&x?L}6(2Bl&DAe&7r+UG+)g9hDKUP-`D!eS~WGXY(7(Xdj zA-wy{Mpj+x0NC)8$q}C7U7SIIgX52w8@a?|RO+fKXde!+_P=Q=&(3Ho`xh#|Dzx7C z4bprM-Y6OJ=tA5DI(LOql$AhcFcQH8J$UY7@A8CcIOB6RlKB#k(Ds+`3FMjwIL!e6 zyAX1|1snqyK7fBPb4R*&PhRid+|6XVyqgy}*ou>1Xayy{0_+SB_UAWjMWZTQ`6JL5(YsA29y<)l7i&(Gxu`gNmif@zb zn9POElik(!3NqIdDt@n|eDeN5dSb&jJ#ojUg3Z5}tKx{m`B0ws6N$T6?(E8}3AH?M zS^b43@~;Y(Hr(B>tNH5B&7Jfa*9XgJG8#v>KO48psZ}W{EZp|g`69>fV8!oFTaCAH zNu*1v$3N7O$X^p(Q5K>i_Al^2PH?glH}|Iph(k3jO+S^zzh0}~iLjxQr)|aEICaTh z2j-EYFTr}GXGNpWKb&Wat)$1r9d=J|Fx1{|ti0<_)EB}n+H0bUZbJrtYw4~_r^4L+ z%A`4sHH=N|dOPYWdUR_|NaZ67SK2D^;I-<3tkC;CE-&59Lkrg*tH|4>?&*?!UiruW zvGvt)Rc+1Rl85f@ZjkPhZs|^GP`W`5CEWrC5TucoMnO8Hkrqkm?#_23_dfT&&-43- z4|~?kthM%;nZ5Sfv*s)4Vk70T{!Qor9KRPnRLsF>Z%h!gKPjULvrR~fGCK{+***Ou z>BrP742qO`2PU=Y%9WDt#2#%mZ2_Ha#2Krj-K^Bp>gr|zSA5W!q42R^snq<|&V$Z( zSID)f={#f7nX4Lo@?4_n{hShWNwY(LMmkPqj8odQJ`SRe{H#2hd+uEkNlxmY6xW3(@`psvBm+K>3)-xJl428q!pqL+%Oh;JLvx~_7R4{$M zi$2XsZjrNCul(Mk#E*aLQhi-;1aj8}Z;48decEkzYuFiY6L-Rw>_Yqun2>j}k0N?7PKtH_LV}Z%ZRd{Y7yhHf{ zyKBjsi;f@IG5j|^^Pe#$;{|cNbMrRvS9)7i%cJRC%q?Kb$<#K;t8u+}@H#tCX-1ur zW$>!yX1_`3!3DwV5+mF%o06tr=9<7|+GyP!i zPuz;u=A(_B+VS(1dpA2P5{tB6HIvqgWb@5yS9BV7!$OfXM%q-#3>8jF?3Op@aa3#I z?zk|Qw}wcJl(tZ)3$I{p0OLwmlhohXnO!|otIQE0xKW4dNXgx$Qw`9o@T4WyX+Z@}lihW<2 zF*%1IgaOC!H7QZLz~oH4^G z?OXf4`fK#k@vT--&iwYtHKaS)0qs!qQqP1Rk)=}W+Sdaa^(dw7N#)!0Klz9%omiAl z>R)vet57N8&fT)kpxOkM(-oxAjw>4~XqXHs?uzv0GgK8vx8<6`qc!c9IgRLzTCOrK z;XvIC(FzgB?hb9Fo6XV{74CgM;&$^9b1tx)9ew!m4NGfw9G^X&a9D}Yn>9AmwCNNE z+^7S8!dp@}v~ve7IuCU+j-w%QNY!L_9n9dA2W0pOk$p;lGWkC2xq;4EQT7v(z42s* zqZ|J*Ltco_COj7eW*D9hyqDA zaT=+-#>PllZk}&dnL_J3NE`~wA=?yypuD@|t9e=3@~>`RxqfY_NcQWPYunpnef_n4 z{L~hfw=%sGx-f!-|NExm$ zz=kT?0Bvt$jNUKZY)c-*64FLF2hI40^UY2ls57L3cRKFC%jAWv$IWfIC*g}6f1%EU z)!g?-W@knm-wPJ-H8vs}ihVzfXhBJw^VFX0?G#a#79&j{z0q-gv(ry8-d5S0KE^Np zvHn)mM@vG7HEdAVuI8j0&zb7 ziayE}f7gLB8o>re6?BJE!$CP#BI%|sL_((Bni2_;ku)m8G+0#^6>nGkCiIrpE;o=E zbwqC_JK1V{^!&=?W(mGdZ9f0oII={fgZ4rj1DB-00exeqZG*%OK}xTgPRzQOdK542 zO@aSU<~|#tGA#YrhdBl_5<%yr9}jRws94C~RIC@R!O#3)K6MU3(086pRD9=YGam_} zF$yFH0L26sc7SDY?&WCz%??=^`J?l`h5|;_VdzPv?0*k_kC87E3rr(I|+%Aozz02R+)k9S?ktcWNmM1)gQq%FZI$hM1LnZWN zxrkbrxdPr5TXgo_#>0_6u;BXOfuHs;HxLzH;bYa-{(gmWq1rr5KGKtm9JgO9=);Ul z$yC$Ps4%n|=aDK|+=Ay?|ojx2xXBiz|avC$DTW(Z64yH{==b zZ3w2kZ`R;vyxwrZQXol=rjb4P&UhIXd~M9XxUE$Z@1M!%S8hi(QaP7fYzniZpDJd3s8XvbZxbz= zlH}X=TK63bg=)%=QN&#GbjBiY0%uOE?*eEQDOdbncJj2bGkp)F2ogG~iJre7u1|bU zZiM+MTBEWyRp--5RGDX5xP{4{i?+?d*~#$u>kZ?<`c>Bi)f&`=FKqrYrSu@e%+H?1 zI1DCLF(6No?hs9^1hF}Nl1e)Tp02>|Brin& z44xKJ`Wpy6&(v37&n}DzCWfUN;N$hG9Vly4X)-RYcZa`=8|c@TdFb-$yU)enK>o1wX_7cD zuy4iNSl*{0&-)mbI|P~+O4E21VHPdFiT;l4)vhE(uYl;D#`ht`nF5DJlK&*C*uUZYk8a`*tw{ zy2wuR8oJ&urE$hDtNd7pz{6^`l-QQBB;UbR8HzP56GcnWk;*HRlBX=qsT<5nO{zUf*ZY%1lLGMxsFWo%{Uf)tkG~U^}JDEbUs-4+1NQcXXQ; zzPhUCLBo*Ymnw?}ijaxRC(DAng3ox&qszMjUZ4@z;G>{XEYv<%x5u@Mv5^OUfGFQS z@%i5ZN!?rm5c)gdky*Y8uL+G7+-9*VSk+?i@XWBl=Lj6-|vFbGciju^OQXl5#2us%DoKC-N7M_$N)2Qer2zc73_ zl2AQC#*{UMes|80vmRq4(Io7DB7ujAmVh9UgQ=!4R#4)6I`^w6`hAyH=C2|Hm5@@T zbH@hwJjw{t$?}-%_1$-_KHFI=+)^xZuphhD1vnp!bF0CufdzOV=u zyr5WiDQz>mOb!@aYUWS64AmX2BD?1oMvI~Yue!F}I@Ds0HO_Za%QZ!z4Vg76*12ks z9Sq7(3P~#X%D?l4;ZQcPv?F0x{urcYzH17*sZTolT-fX@&M~VC88T}+)PPN(y@=be z8Z;3b+5QF2)arg+_deOq0&$Wc4^p8$G#=NoXCcNUkgeHW^o#Cb#KI$6jx~{INr&Z& zZRz&`+)}6!Wo`Y!}oIfrcBwW&%6dTqB z!A>BrL3tJ|E~=Uc$MQAN6Mr8tR2tzq1ac1z`g17pIn3kFDF7LQ0Rc7K_u=^vOs#An zw>L)S5Q+nMGMLnMKFEs$cph-4k{How_;NVhlDyJMz`cGpcM1lbsF6{yFAE92%-!^9 zvl*4XgMc5oZA7~dL1GbsEk{zfWO~!|?Adz#T%d*aqQDet$RgMz5+) zV^8&x{-pa9&iqy3)}>2R&`3;5H;onM^+a5)ljFXF7G+6Rrd^i9emvNKsPU71twEGJZ*IWr@Xdm9ixaQUTFh?GrNboFn>CdS;|4jsbP3f$ z1G0+S-zB>qSysNSpy5>D4J&hC9*xnz54L4(G#r>>xM`?5m2XqfpC~kpC-t`^)zgYe z>&>vU#wUIm8OWQ_natPCr8%qv>H#9)(1;IM}mF_!o+nE=l=1+d3Pds)91|%$E4Htr>KJx zOmb3M7Z*{PZZh&*UK9<^m(SZ+D9nGszjs^=*HC(|vD876?YY;97jT?f!>_;~RvRN5 z>h@kxETff@=y@rG5A^gq+JHcRvWJ57o3FD<$TxlizwJNofYYLK}H3hc2P^HBxAZPI$ zo(SxYu~6itv^mR}xNjjVeS2Lj^TCF8d$Qs{K3%OkAUdc;Q5pwNkBU>qyoJjSM2A8v zdDY^ZrcX-QWA@52p|i~3ouAjUXOVA_Q_ma>UM9`+4Nn!!bS&uGyOmnQ=Ks{V`U9+Hx&|KPo5oWY z#_gRd*NRTG6PZ;tL7OF}udbg59ir&*g@zaLv@`cKTx!@XzlFPMs+Tt;Ijc@7GYcp9 z8Ym5=Zp{Xop`wploD$*hWF*-w-0nCBk{*N8sC7#{vb0Zfh$tby$B)`=X2+Y7L?U?E z&T{PQDjTNstADHqtxHp#{U8ldzL5IKu`^r*b}+qYy;NJduK4W>y-=5zh^9Z@8I#-mIu;>+xl3Icw~;0iXxy-IM){6{ z|8BYRwTP4>mSM^-3G3}ngj`g-ee@&6-R&!kQ3Hm1W6f7T6*%66b9#=Bq@Z8u`h+hb zQG-`u=$9c52;aw+z>=!2xt^$1eJdK0tNM5^>u2|dZ9acFEy)R$SFh)$nKuc4_;Ta+ zThsDYI>Q@r2VT@8xUWS1!tCxO1FuK0tBi>1Th;r`S`DsUvx^#TVa{VSw?H^T_(v_X z4UI~vg-kOaq$1-4X#9|mB#Y? ztb@&q2}6QHw2+2Cz5B{HDik&rKT3J7>5;KeX}CCP>2g9&s2S=vLY6gms0s1|6$%Kz zJQUS#LpTc1o5DJVzJ~&_*aP_kEC>d0b%osm#<#m~p+iSQj=0#! z`k+4-DkR8I<(Dj9xspmJ{4QxN*jQ9+m5mTvQf9%>W?x`MnZq_&;X1Az-4(T*YzNbr z=aJyIjGfDJIlOGQKA3qCJs?Fpkyv7{dH?O*XZ6ZgNn9q7;tT?uir33y^SrL;4G8nb zO{SOXA$q^s%i?scfB1%l%+_Gt1Ly9Ct&!)4XOL=}&AY*J>kIzJg($tm_xK zcRbRL`^I3WDaSRH;Lr`i(~Pr!Y~GFqY|Y?^M3_PL~rq-W_#=&wHD zQN7U5&T57ar-{*GiYgMWp@aIaL_K~nZzhMz)iF|>7h=X$Qf$mCo@E#e7DSa9=1Um5 zlw{p0&{%|V{{dWb2Vgxt$IVQg4MSw~!+)Kw$y#&1z9N2H+rL&55rnC5L$Y{7x3vmSK&#zB+_PdZ5q}m-pcMaBJi9&=<+wA4_UR zoXKO-*o5S+FJvYh?8+w)eb>5~*v5lJxnKWuDgrlX%3j>*!Nk=RGrY|_C zGJPuuDG`TFw~Jrs3@4K==(j>>RB7dswAX9Vj+geR&@jKcL&gf`n&06+V1mz?xpCkG&<_#leM0|P_& zpy1><5D`##%!2?hP##X6eQA#2v*aqL7={(eyxl&ra@cOxA`88QNsps&$UwV8$+WbY z%8~0YPKC|$N=gUnH(mc-!#wR}Qo;}MAp*6X-7byRI(%s&uigmI3!LR9aM*)(o1VPH zFB0jbwx2kR*9YbX99H`KFmnh;gtZ=vvf7kgX)X9j&f5!n4NW(N0frVWVbgC{mjFGt@GEB)5)-Y6}q3pPGR0u zA-Q(+JJXsO-BL04&UHvP?&!RtI`6y9(4A{*yNBtUpOI{DPGr278o|NKvPTAd*2WSi z!RKs14TVKmVNV-=y|~OOqS2de3c;E4bK=<}(1m|V!57lR4N}dzkPVrFVJt@Yk#uT~ z)O!k~t{P{zYiJ*;Gjo!qEg>_MXaU+HCFJpYpPNdRJW|4Oxy~J!lj$6^j(`y1jvUFb ziqw+2sLbcX&p&^RV1cj^KZP(8V&Dw|I9q#14C1PX1&*(wW~8!v${!dUpyOlGe}|Zm zJ@Lhp0c%b^0f;0yusBsg0L8tb9mh5C&qi(CCn0jiCm|6=Ao%{t3By1DAwmP_#)pi+Q@;uiw1mv5h}w*Xu!DgDx-?;zw}Z{e?X8!hGihIeZ!S3m7G7i zdQdZwmtd67&Jt3tc$UQC|-cr?Xs zZt}~?x^G2KMAk@Yjfl<&mRP3F_~pSCyfeo2Oqt-K>)GZ$@yNZhBdKk^-nOjVF*tgW z`rfXi=SGvHbb0*K4y;-Dt6*aj64wnB=}CKZ)ugDXv$aX(Pm|cmco!EJU*4yvM1CUt zIpGsXi^kmSJ!d7}{?3kQRD1pKhufW7vqUOC+d#x1C)&(uuKq*`PKtx3G*3TNcVI@v zh|D!qN&=XcSivg%yOio6@ZUeTd5rv5F==vbDLCMX0;6>^iS-$q;kR@ibBII{a{I2XE)P z6V1qSxru$1Tp()uVWoUpIwQGTcARg4z19&9k`ywuTEewhq3?5?vGP>Z2Febg; zD9Jt&w{70jT$uV7PE@;wEs(o7TW~8nFNg`ITe3!PdB>tW>{@&crp)nnzMWT#6;UX$ zcQU?#*e@`b_qmmn^K&o#j-a+g%;c=Lj@!XAu#=A>8Vi~|K(&tj>~!h11`oq8*xt@; z?_wQl^Tnp+`9n(dq@>&@vzL@6hc@~?4@~qXyY{}TzuLV3X zX|kSJSu47Z5W=JUpEv$xK9F+?H%J^B0CW%F2OPzN93%r|&Xvc_o~<7AJ;Y_P=tK4e zpP0#oK*10vc@PaWJ3pjZ=rR2B0}!5)@Ys-DY7h$ewJt?~#@SfcexDXGwLmh97A#&3 zVW&U<)x)C$;}{qaeX~B*F$n2Cm&(I`Y#)tF&cX{HsmIusTZ-v!yb;7rxHj#|qK}l9km_7;x<_zVM^qKqlxQEb2v-XRAy{^@$fJ+ZRbjKU>K4{1O-;ppOY}` z1*3I6dseW^t$D0!QbcXFR86+{unkw&JnI&|+a&&W#gi5&< z-Y0^>o@>`Jpy^WvtFKUx@-ce(x#8ZJHgE0L;?#G?Xfn#)1p3?$De}{VEimJY@05_+ ze)g~H(iKJ5FBh=GOC%PS46%y^+^fMoA9$ezO&C+XxN%P*IDh_?_${$(Q`^kcvdE0L z3(J|(ad$C?EI-T0g%Z`v&CwHUe7oQ5pv4~@w%(WDmOc*nA>;-KWVgAK)H`?z?BcD6=!;}YoA21fO%Z3o zncFX&efndSy@CsQ?jD{?;2B}9I4Pnac2l-XweS(PdnPDZBt$QQTzj~L?_N!m=UL0% zZ3wl$uG<8Y%;@WMdq$`$W0T={l~|RH zM`K|fh8!S7?^H&L7WlI&nwr!Y;v@fKZMZW)xi2TK~h{Hj#IdqBbS z1-9weLM@blX%kLloiC%C%Uj1Xqc0YyDCe2{{Sp=w$gmRR)n2#S$@FTrjCQ>iC6;RQj-|?5De6fP~Y&q@)Jq2b5+LSeKC)B(#i~H*#*O9 zczXqgd@Ys7_aDzsN*7Z5lq{@9ecu$fLO+V%h0v*;j~CBF!>$F!aOewaZ0SWICQHn1 zRg{&^89~}Uo`WR!muE#E%V+cZ#uKQ3gp*CACQHmE=6hFOOf+&bZ6jSoBDLaODUNHv zSIAgL$S4W^MJ(Rh!;(V{iFjHqJ8tnke0m8@q7Eu6FW459Or9 z{?)hMPJ}QvD+?cjlNkB6Fj3^--c$dj#5m<|mo1kt-eSG<5PIn+v(=RbeR?dN4kZH^ z_$({P0}d5?c*14!s{Dj6wuW^EQZ4tyxFQEElmPg%6nTKrog2gsgYrIj!0X)m964<6 z?Ii@$7+Cn+sysaih+YB#`muy841n?u>3sPZp#e0`dVUZUW*OyP`PHWFq(^YlfC4iT zof%|{A4CQYhe04*?Z^vRjy3XY5(b~#vQuDIhF~H=Lo4)E$Jzb#9w(?VlS;Jpz%oDQ zpn9Ed`CGOwApV->qs1os7DQCW%tmRqDVg()Q* z{4F?sh8yS1P^m6qQEgKZ6*`SSOM98H#!22gC`n$B->t+@rM_3Z{<380tW=XNXpU09 zt^2$RB4I|Ri&---oxXcJV+qRP9U$3Gha|7UX<`LpG$)3U>t}x9#dXXsa?xN++d_6m zz)48~XTpW=kGeF*i*&2496hg5+57@^sb=Y2b8~!HU_V>;%nGn#rR>c@$l(KGnfLph zZHt@33*JImv`(q@4m5-kcuod=N;W4EL6kRSsAtBwKOI@#_fI+5>O;lYxevEHv1V%$ z4UT#b=|j)Qvc3>|rFA##E|$DCar0I5q{oKOzB$L;v+%)a3bKy@nqD$Xd+~hL-9YyR zHM9S4T$=FV%eKBiaa!1E)a!MKoh8Th3fp@@F5Q`%iK;D>Mb^$cg3rIZGN)s9lunMq zcoxzuUR|%XE~YTV$_-+1bDbxN=$|SBG4uY}p0VEIldUvpJlV>m#^YW;JH%BJFswr% z-~z>NlNI@(^a2zclT-A>oTmN6+@KAtFye(k%s^3RTOAO0L%JBq78->*u|}cnV2XVH zwZGt#K)B(PK%wE&R>q%VL4Y~(a6sscfQ~RFfweX2$JAdt6Ic7U@RnWz)Q^IH)*=$d zKqpSDAl}C!^=HNaH@6JP1sVl+=dGHoNv@bLg^MXf^3@Zw+bh5?fXejr<{%!(fIP6k zp@4xL%7bu`^GM}eXp+GrX@rOn3l}E~dnI9I+=AEHP{DS! zaaijv=|}anf6w+$PpiGjDK72jZ>`6SGowA5G>Do$a=j_9&#L+*(DdDQp*RL!`TbTG zVS?C)D4SuXnZ{1pX2GQUJ(sc zLUED!hRa}}Mr!uEFjo)J6CSNzs9H&Tvo3qh_^ISH8<@PU`cjtZV#`0akCO6Pug`d4 zX0pe!S+MHDH@9y|82_LFqT{u97r=8bVYreojHLFS` zgphX-Y4c2Le*|$Fs7A$Eil-+wwWu#s@Llm#8}FD5 zIp4d~d{2k^WimjBcw_FF^qW7qUXsq>T}b?`d%b(BX6=hdukcTD4hTaJr+^XH@L8bQat|dRUgXtM_bvefAhPTWUGBlK^3Js5ftk<>&bHtI8 zyNRiI5-NxGNXMI0vx`O}z^ceZ61|?8#cX-5uYO3PiFBC+?h4i=(-Id;eN{$I>aWmS zZiyYuBZAZA#(1st0?MtP+Ng+<4TouUD9ncPjGX&dG84>K#{{(@rl7(IWauE;30r!{vX>9b%|ddNLF8adS*c!A zEy=ji0(WDkQ2KX>RK*I$rM)jue;)n*h+j~xAw!Khl*DOcjpo2oHL2dkFskv4?DYu^ zp+VC-2IfNM5}P82r0org)I~VHtb>J7)a6g3^~kSuROony*po!G)8y@oXyHTd@iT32 z=`veSi{lX|nkprX`9Av39aKkyW#&KA^Ju=-N)o&}33+!T7p0UWVP7dH(5p_sTi`Qk z7V`a4?<5`y`>s9tHd~iQRnr5$O||e-Il{(o$M3alM%bvcIDs+j;E&?tc1WpQUw!c0 zNiMpJKE04Ec|%Nm1iR0f&P+Sm3O8ltCi3yuQhLPnH*T0?e>A=hFS|nS3g*3glNt1( zq5RKyWU?;c2-?;k`r%a~PI(m40 z^c4ZAu=(k{aDV9N>vNyRP`wPPD+)osp3TvD7?p>i*N9+l3vavvc9Ydhk!};}Y@$1D zlA4Zjd_Gq>EC!~-TPv=z3`sSgeGVMI+4DDC4Zw~f*HPA^@58?%=*<2w| z&uiYDCFtDW-%ejg>&KiU_E7u&_A*^lKY7dggJr^LaW7EOpEYvL$ob~`JnmesS`n4d zDQgl8xa(U(b8`Ckw=2ysCi%1Nm&RDDvp!eC@THUQ+0W-ZTN5Rc@p>jxePVcg#ra7t zc@acHed4Gn&a^qm?Bd-ms532)GNgo($CeE3PL4G&FpgfsT8AUHAmxb>Xe-bl5H~w2 z)N;Gmblvi}XtL9}kWP_}RBLT@yi#q-demMqT6H6R8@ zwHl$In;x4UPXwOb3~c2qnldgk>T{uj#UkugdevYR+YrTD-VP2YFXV>pi}7V7E8n%) zYvFb?M=8(JMeu4o4&UL!9d_!*3Bw4U8M@*+VwE0Vo|xN2^BU}>$iHJ%;o>vw%16oWb={wDt+H)BnK6 zu}%AZ5%38JST8c@zQi5w(M(j(ETv%=QqE9{!l~SC+`eg-s}<>KBUt5$E^v*_#p*2` z#Y6HYTp+&)1Bcbuj8u~>`H6PQqaI7%?!Lrvnvi2p&fKC?jfH_2_vWDup1|~ zRXH#ZEX$+I#0hD9Y>B@u+glsVpemfJ7Q3hdDIUp6C}12;`X88GV0HNV3b7cvvO0uM zYlr%q^$B-n>#bkTtDg%^3c4TQLriGqyp87rJvJsN(&mhcQ6>EZw>4;P<{q{jnTN~$6BdY`te4!dA+>5l}~Hy4V_ng zr^!mz1|zP@tHf}e*%(IoRW|VzGgCUNV?9L%?P zQ8Kw@TE&d0b1{q$yH7~SL!e^90$EI1#eF4Qi9X=4blXCRFci8@vm^buOh_{1BU%r_ z(6n(uJhbk8Ln9o#G( z01PueNabhv9PB4-yMJJP`2f@-ARU_K5kraD1VjY}Lfo=Cg$QMxX**n<{;qO$?~ePl z2W83iqEO9_az<^ELGUX}5%L?Wg%7`P7@mWYe#S<7x zqx=nwvFsh$DtT*%#>|8mBpod+mm0QECWdhxH{;x%YSS1^i9lfx$S4wtp^2nt_G?)( zCGL3&L}$8A`=zks@B4c)2kC*AHJ@H^hS{ND^Vg=fEc5Up8!|BJX>o_Cu=zC_ieq4> zM8I%GK(o*?_lPAiXs550t4`K2d0nw?Xq8@pNn1?L4=5Y97;oGn3O+RYrG{vZUV0eR z?XES~HJ0?H|72#nQqcVNOwBB}f=#;azD#S#o!JZK9lIx2^Vw^7ay-~%EY+rmP)wE{ z^g=_Hep$Hethb6^-%y{YWXXOEAlIHE_K3+YQ4w_^C9$T?vSyq5P=A3CC*n`2UO13{ z07i%;kD{Y_+uxZI{hK7eC}fu=Ng@(YTcI=l*$(;OjoOlH;~cnTXmIKp zn>cPydcvwoA`G=fGbG+~*@+e5))J%fNTMAlQioT+C((yvk&R_SF4xxQ$(@Jpu-I`g zrkRd*;Stetq;OYA3vqp}y9?)h)?s0ETnL5?g6Zcj?xj7JntN(WzuSCB_wV~)h&;Y9 zy_RK`SI&t#-ISBa{U#t})u>ND1NN0g5j+tA{1-a*Z!Dx-Qsi4bKE%IRKBz1=Q;;;E z3Oj19P;j?7Wk!@>!i~L&PcATXWv>kR`A*2TNch0c>{IG8f_4r~UXB&6u#0K8#&j)s z^XQBF@~gxK!_ElOy!W0zcn}^CHZz;Hzu9b~PT$(QX-C<*SmpT?lb$YAydz!!N)4ma z(>A>AQ7w*qU{2CE{?cvLIn>CF-e7d0==UR&QrgNq-N)nM=v;9+hNA~QYKFOVH^!a# zQx$~HwF!2N(8xVGrX|`RrW-i91AHCD`2P#50iV1cfr7C9$D06pBz!g&_a89Ff4dVT z#{&TP(KiQC!*)fsYC{6efzPNkHdP|rFK`AVhrfBBSoJRYQWGtEO4V>Ezfw3}U?*Az z-X1QGt|T3~31u}RH=MciGkQAB+-AO6x{cenb_%A+oYdEyq3wLI#c3!%vS=0j)aQgV zq(5~oRF>Hc%D8_&!)X&~?aW=cXr^$>fIlRJNA&KXKmhXk9QRZ{ZW*#RMk)5^HMJ{bq|rJZ3t` zc;@&KiJq*rw4CxyeUE!InE9*PJ0*EsC(YzEruwXCwgP7beT8Inwm}U|UxG1Ob4$>; zj`*whpsVJW1h%MZHWaokRtG%zpz*BCf)MhAWFco%UFqb{1%&SNM?_luwhEbuR+|NI z=<07gE1Ws}ZKaE2>ib1_?CIutz*o!0EX$#~Zb)BN{D=&{51wzag4aq^y^}QxUDj;! zQ0tKOK9dg-gM;qg5}G6z7LaI;AgrToc?HUCZ}m-v1hiEUQ_8>h08dAXrRWLhf54O6%xdw zq=)8P#Fx}wH>3?09D&d3V`y3<`-!$z$>R$ZRlB<`kOH73dEN31V@lha$~=4Dd* zD6d5$gA~=XY^c1;H9MyUx3+QyER_`j)c2`AB zGhURQ6B{@A;67S9PK&d9wN*>HH(WILVR+;+BR*WGM$h(S@$$gUiM$;BrCVpk^&u7M z-YW*CVl1v?d4{Y8$u>|EAQuD0lFOA&6+9ZWpb$G$#%Wew8Wd2fQkik-eGz)7Bu5NG zeIhM2!Uh5@=KxhBCfb8@WcJCA?<^2Hre_nXag9(|LZ>hwmqrDTXMOv2TMdQ$8}_Ry z$>Cp0ep)26B*KHG;xTA*mkbSly;k(NlcLX=Q5k*_s^C#Od`#mf~%1R3hv_a(binz}KufaSI=0M*;=$JBkZsYxUz zbVyE;9?Dx=)o>DyuVm0zoUz`nFAE@Y*+lJnaB67Jd!pZ)f;U_WBku*J6J|W?Ib?>Ul{F zyuRg<6KL4t{EA2F?eJj}|J==!0MY#w;S0VlYYKeBh#h?%eEzzQZ1=N_-^*A1UOg;7 z$7MYp5Zi={HVWfVsC=10saji2+HQ9017i|I}Ww9Dae^L4gB0Y|2_Dou(YGn{fRh z=w3u-WPVxCzMhYHb6Xq}E^!$Q_G{e;md7}f`$1cVt2+XVUnNhek#SxOWvQuzUby<< zYOFKu&C$i3SFn~*U{ZilNb+bvk_ePd6eIt3Pmib(0h(;!FaN-c=TrwnAy*g!4M$== zw0r_~TUbLryzTG@9|Exqwj%8VdRRQaMi&+TXX3zr09qXYBnNr?Ci{Oq z1t{&{%^p9rV*UZl{r?^Wf4SfKR@8c3bw!#1KEpz4hY9+7yt)^ar`%QG8zidF;H;iJ~fvqpHJA@ z$5+cI(BY#+2(=A*l%6kMqz*_VN~h;yWSD0ixQISD6I`B}#lvFs#81Z_T%E?fWxw&d zT&`q4qyo;KoaBVIT{L%BmYD7-O>3f3KhM;rw=Xf4H5M-K`Mo&L6C!$&DDU1_xDD=` zff?CX-ea*1fBzGiLIK+ceX|rpVZ+s7Zaon{rbI(K|uGG)X;$8+FD zyN`Yl^))ZCE^@HW%y|9`f(Q(LEOVwe?6_y3f!_2t#?vF|a!Gdw-EeYqY~!nBXL zHTaB?>PK@3Gjjvb%)K|p^^<BRDejnCx3z02V4La77!iuT=(LB`3!0(M zDCNW=!}L;&uH3BB6AX97eqQ&Yz-pF41wLP`kvN~sfCPul#Cu-52!wtw`yv(`qvpkw z<2n@NpA7FvF^i1K&mE><15@{N50!gNcb^+Sh(}H@+oS@Mi4iQxh$}Z%mdz#6dG1%( z>VG?DJStb_AYn=QF4ZYUn#JPY5L?Uvn_bB=$)8&%lX>))G9)bPZrlgDip#q;=_JyA z-kI#@m?2I*5|7$u{b)fziiY8vVF;^fjSv#t+HfYTt;(gjuZL!xKdfldMwxd zJQtvDOP&5ZR}63iNMJWS>HiujP%!#4d^R*tTlV!^5YZpMZ(wu-Im0SSVf|vjFC8V% z13xpQCHeHfhW`hO{Rt3K($U?)je=L;xs0ugs~ZL16Y%Y8j9jJe7%lxY?Apk@H;ST_zLUE>qKB)po&mkf8fA^Ud`qU>t z#)D8j%6<$2{$PgvLq_@o=&bPw=nO#)2GK(T!=8HnBa;~jB827wBCIcn0CMy17J?uU zKEy2;=;_cG1cEq+|3?bIkPQNE(Ks^vUu~QJwBbP>f`FL^zXL{L5b+-oJcv&)h!|2B z^tZa6zuJBWgP0)ap#V2;o7p1IP#yVK$b&5rq@{rYn+C}N&OSi^xEqaOxB zg$BTw|FjhT(?SaQ5eCA9yodn$po;yE028F_k&^uvB`+Mr3?YdGDCludJVX&7dY~X; z&Z9HM{6&k20OocT1xx}x{%LNP5g-}}cG%yyEHM5_*d`M23-}m79aO>-w(St9vAWDbaaBA}!?8N~7ELw}S^#R0B0`AB9@c_NF)12>~K8VCe{ zmBK@s{~;4Wh8_pe_#POJG~|h!D*^bf$(009hX10}CIIrmF;7#5hiIifG14Uhj9+5^ zCinkE{*(xKUs^Ko8>yy&;1HjySb72B5de)>O9K%ishYU}n>|461U&vd5N!C~173ok z0wU)4gM|ARH^(2i`~SeR@c+4f3c~-t0wzfQqwF65^S@;uVWt0B=J5Xu-TGg$;3VLl zk|crf9}$JUK?Gb+eW?Gfg!8|YJYN6L001S_5EclCi1SY;{}Fx!c>ebY9UbA2j6u zUk?%FAsKLA;nc@z{OSB}4Sz}){p&~g2O0Wb8lX}Ea|=iTyf8HGpOO6O{BJ#c|22}w z>;JhOfApY20RINSm}i$AO=d_|5w=Ayj*q^VH|bw!Yf(LN?rIG2*%a)>F?4w5J&`9 z>SQ4jTugKZ0+NAoz~JWKU-2$<7~E$g0RsUSu3d>s@o&*z-*fNzsON%j7Dm>0 zo_eaf@4ft*^#>2%d-%c2yI3Fo^zH9GdKBAE*6#oN$D1$TOnsB3zKlz@liB^h|8(>7 zH+GL^8nv&0m0!HN`Pp~!HnimB@ltlO^2I-1-K4LSxXD^v#gt?bkQo zDmx9^S;Mx|u-Wox58LZ{xc~6=%{RXq(-*&cee=fG=TO<{@pt#h-R<~yswGzfbNuaO zWrT>6)d1u;SqnO@2YlL%vw&}eFdrtdBFZoa-gkVs2E)Cbj2~SQSqid{ngcPqKFj>9 zxaJ~S*P>e2VnEIM@bYXmSzT>c6tpV}+B^AVhP@T|DnK!73w+VJo0xA)`SWKt4<1L= zsU_8^Wz(su8mQHJ|JToMzRP#3%Zw+aJubg>enr)5W+MoX<9aAEu3uSIpTY z1&`Yl&mpnXdWs|a9hI3<@{ZJ|JhG=7SH$5OuH}@O6T*7j6Sib(gRr_665Jv)akv&0 z%aIjXNW?UE1DW^x6ekJ078UziOeV_2oMa&}3&6El+WPE#PKPa4b;8&rwp*kX;;j%n zKV|3_ViI;O1#!Z;rSSvR?%@$pZZ33)9JrpC-zF)on#EDTAKzzbl+zBD;d)-fW?7xkl>Lug z5{EOb->7AFxnw@WvT2FatdBbvPHXFaB|QWQF=Wjv)5GcKiVyGWGyG2nrs^l|;aKSL zmW1pAqifQEx@3K}N+Q62Pf-GS-7*%iFn-?es9`v@J)F$$|MDeYDiNa0H9L(An$d(v*bFVwUI4HXF(_v4Bo>icTj*_YFT_|jyx^DP{3;8w1 zAV>thERc$mZyOY&xHI*jq%>q*7S1q_COzh+b_?by?|=Y`EDJ$p|I{N>b)^`#fa;0v6ay#S54%N> z$->jQ*|XnOXq_06h?RxpN!>nA2l!rgD@XNDK9eU}X9jx9WbOZSLPi#nwg1y|ou%IE znZzxVG@;r(^9x2Y&YD=JjGshzI0MIAws_Ym>5xp(8Zx90C-qNArYHl)l!d@C4+>)c zgu4p?>5$CBz|**q3B?KfIn6r|4l zv`NnqwslGvsJ;Nl)Q4%C$qTRKjoQ^0s_&>k$vZ6zF*WtOOboddT%ha~WjM3fXLHtZ zCHL?9m9(Nr+^YHl7n|SxJNN~-$t${aH9L$$e36tc&yp%7>PcUs`^Xq$-UEK2i=<;( zh~i>|t|wldAkaywrs&}&y9F=!)tg!uKD8f+u9VGojJ`#t`P#z8Ketp$Oo_ED&YCJ{ zD~bsh{&@@_+KRGbD@s71nzE3!tGLH6_@|@*YwAwcudLXl>g#60GALe;d41rQ0WE&T zkoD@dwveRiLnf4TSYMwllHV+pE-eLvYpOEz0e4O_e1R_UaU~}iIY7plFcgZ{OVn@p zg-|HUC{JW1Qxt}RZwW&|Cam73>@ooOg;4U0O)k%j)d6Wf6m8NpV-qp!tuUFi8Ei6} zd`rQ=NDqD#WKs$mEL6uu!2pX%@WbfoUT|h@Dd4}-WFr#Q;jXYy#_gJCOOa;r%+Pkk z3s2zxMij3Ud!`kZb;TgNk8Q(&#TQD^JuYP6<0Q;cgpVd7f~2nD&2X++SbbSq&J zZATczzAgmmMZrr;0gw{#LAEP?&t|0+Do$7xTCL)lmr2guWP^tI(1t%osp73B;T*^$ zM<5e)G+G&g6_m8HB@{C(WaOXK88|s)^F(XRpfV|vt?JpBRhrTAY}=*db4$Uh5+Gy> zt<0e-(E}E%#I~Q9qasFN3sEA2HAX|cA#zKbu*Bosv$#DbK zvs7-#6#MB#d*`AFCH*gCdvxx07y@n`A)}Xz2oPo(KrkQf`4#(+M@!Xw@4S5Hnr{shT)3_B+AglAEJb{E~YpwhbVe=S(%)G-< z4rNa^kX2tybM~xO#V{^BXIz0UkJpg4-*KPVrZ~~|cdLsWA$!NL)H7c6wQz#Qd?c$$s28NI%Oi{4YmNcDye{NRC(r3=n15C9wiw>_aiZ zZQZyzGllQQA(Q5AruNxr)52(A8kZY8D~ckcUFlZLDYd8MqdiC7IOU(+!}JxsSt%`+ zT784+%+a+!-^yuiitXM9HFFTmb%3;yoHPH+?53w&$cksd*iX7~$nZG7Vv{RMELG(FIh_=Rvv9hd+iXrFt6ifo31xEFFVDFbOC$qRuk9Y<>O z%2X~7c`I-qV5uot|7w1!E7<0J>lW#nd?i z?)V>-lk5{0umpTSYG3uzRnnx>iaI72Y>p9u{ozs262D@yr?*Vwwy)okHkRU_)k+5} z^Se@@MrrPOiAQnT$7|(&WVM71Lzl;zVSbfJau3q?wr=#fRKd6 zL6~eE=U~1tfj9=|Gw{F8F{F1mj(Y@DxQ{D^Nv8?wE!Y73N8k78Nca)0TX9yJkwVvytx0U?i*(&JqLjvk{= zL~|a^L+`;5F5hNh9RE090MaGrb5tP7X^yJ}3ArM(Ip&4`8Jt&M2yya`WMpoY9nW+I+#235K7)t&?D;MyCPEnSL4U05!^Y+W4gLFu5>gLHM>ToSx+3vpX0EBLzoBUr~IAeuP+v zV%1xSR-SKYW=@KZ?;9{a+Htbi=Qi7(WlU)#!-xnlN%-+*Z9wv0OMTt zSJTiGmepY|orJq=$BALpLqdHUjZeD3Mv-#_I;>gnO* z=g-Hd)p4!6#}9w}$+PEo?AQ3u_da~*DWxPgBe~)An?cnhlOxk&(%53s z2r+5wF=_K}rV(H4Cg{=-cWh zWnsR=ZSxVoY@&48$R1)k0UZltB$1rGM2p!k?E8q@1Q?n$c`}2csVz^TGBkCO=6ytI zHeZ5EmkcLqNzWU=am>gBlnQji!yd;15rE zC@4(|Bg%;AqQC2rv1#b2Y1%ZTc|S~Z_5@7h6$X;Pr3{>f2A+mE{$Y{b53@W27Je%H zj75P0rZW)7128svKT!su9U#gGQ1mp(I9W$qTa%2FE6>7UVg>G{Gvk#)p0samx5Hn5QG<%u;U=8Mn`3X zQlL3QTa$_m9|X#pI1Uj+o=N0J?tm78uo`q(Of*;}Iye(wG;l77gc$3Pflk-M%x9o_ z=xWmuwmU=##Ay_Gk|T+7qM$gL#Y3Y*0A_jEsAx)puINmVAuto99Tkg%4vf%7PN%>U z;f@4%*hRriSSsK=crMKH_=6y%J_@X&LAKE8WC#jHmjYIOjRFbns9%;wL$p8{5QEWa zknqDWEpoUVLY4+pK^h$$P18X~>uGD!kQ&rd!D4us!05W@XpBx{kii`ooqPuMSu~Lc zaXbV*Lzk^Q9m_fje5N7EhhTgg7>V3R>ELV{i%z4Vg#hR>$lGXm(TpL=p#B0nnTl2` zIwp`pM-(!_6GmVlax{jhAVg&`&~&K~Mfx9xv1ATWR1&SqDm+LoAHljMhJ` zSfEp}88A9cPY?1Jqu)a5SwI&BC+NxR&|zK3Q=t%0?yfkZ%mS#Iy7D@xv%nCvnCn0Uu?o5X*>@E8J~z@B2elToU~$qw zFId^LoKOKvnm{Tg9!y8`T8B!3R|;CrN+&AtL_91kbW!7E8tA8ulUK(9nJodW zj&xK9G94WbDXoiWCBSg8c%XX#9Wg#iB=X>N8oD@8x(pH#4=>N)lL%H_(Q1U2PjpG> zkdfw};FhakEkaL(vIk`cT!*osbq7ii&H}q1>>1KX4ls#A<$&VDfQ1S93YA`-rl*V4 zF(Fmlk3lA+#Y0XKlOU(SbwI=zQMXY4GFl|S3h)LVL6D*=PlJqw$somPS;-(qwFh3B zlOWb~I$FsvGL25rq+{fTpar6zjE+XlK(`7gCp6S$Ptf596TzO-$!IQ8&@{v7G{|Z) zPVYnM94SDDny`K4^&LQi(DIns%8$1~Hh8%ihh`)z8_Bn~ZGwLZq^hQAi|% zY&=a=CDF+8+VWON-4Wsvq;ra>2|1!r0YFIMD99AdBa)E9qr}C?vzq`DFenj+5_mI- z8aOJDMuv|PIl1h}GzvNqH?k9|4fm`-SRD_D6atxsME)R}agb@cn7ES6|A-UH`XlaS z)*NvmDB)KYQR5$^@;-~mg-T@L5;q|KO4P|Z4JPU!&4FN|b{$cLgRDcvgq}hEBb4nJ zE|dpJKSq@QM}P-P7&!LV#wW)x8+B;7M5E(Gah_QlVJ~1iO{B0vr9DMlMbgp3q@^AI zkF=5FFllE2cr@$;QJFwzl@yy3@bjA!U?6P1GD!6acrnd}uL0=ZrJN1aOW8#AKWUPf zjoD7u#x?nsOQEdJbdsp5in-j#=uZyNQT-qr>;NR9lg!$o ztBu(~&?O_}o5YnIWL-=MGIDaRC5yRnvBGsCdy{*B@z*t zXG9J}@(dKd(omv|8kvD=hY4U{Sq1{|Bq1{}{r?e!t^^R2UV{n37s918{}IG}76NYk z3WQ{xB`UFm=*?Qez;m9=U|FL#*BU*{8Uh*Mcs07*^l)?3&drqqT0E;GDk5Te@H@a+ zS!DDa1Y%zvq#dAFX~Z@UetVZk)I@HCL3OLi1AEQR6V*|4Dl0gfKzg{z2y&jdWOhAJ zw6&4u^H`aIG%_P;<5~0rc>W2s6tevSxW+XCh$P_x&-<*{KXF6R))3^ZqgNq=~T0v%6L1tM&o@)gevjWWu+zv8s z$AL@#BLZ8_SoQc+IO{F)tSMxcDP)!@yDgvzpnI@b~!%Mu#P5*ls^+qJnu6lth#*vi1SY;Fp^1!EOBshgiAz#q1w&hT-(DNAqvaaqeh^Rq-f#Z_&O6ZpS zu~~-|T^t5*Q&_t=MF$Hfd}jqn2UC33pRlcCYlfqYwPu9zo&B%wbTabc3eg;gOw!1U zGM4)tDp>wdgQmhCEm%7?h0e-3I;PdEG&;6p65uq}T*va25FHEFKl1*&UrI}$Dq~4O zXBk7sjIl?WZV{DXb&>c{yp1(%;259_3B4a+Et(aGK?RXZ#14*`b20)z0BSV~0@x~v zs|2xZ{Hp?NyJ#r?i5FsB$x4HODxxwz_3cVX1KdvJUge)Oz_xocVTvxM>c4YB?9dJ! zY}rz1s|t`Zx&eNxX3eJ#9g078;%I=Ig5d-!c%Q32gQY$LUrj>zZvR&nfUf`O4=@%h z-`=%QzVRxA?ckVKG57#da99BEa|;9mFA&Jr)2tK`#5euF@{roM#I=7+gPkAWjsB^4 z*hY@aVx=L2RVVPRel|g%rQvjEc2^a`H~znZ^!~>%M7RzUM?!+`LI`lv^k!=xhAF@_ z93sH`T+{S)FmYHF7ls2Onk4^9`!{4q?x0H;MYiATVZE{>&4x^mWtbkzFuge;qXJxT zYJi>GxP`b%2nP$Zf}qU*8!xA3ND$$AmKOu>{i(LpS=c~j!3HV|Hc;on1~``C!eF}v zVRNklVJxdKIY%1)ST%MZO+;u0sZ+K8SVd)l2k1?puHlBW*T3tC3g7{(LU(r5EipU3RY=H#Vx`B0yZxWG`N9bPPm~NfO*Ef z30#XBA&6s%zn($TKVy{uQy)VVIQoGD#S%<=H7bS>a4DDvKnlwW97D`%56#arkX!KP z%@W6nqY5J+fAb3Z1M#xf1VB&cY7!(yFIsn93@ z(+Kd6o$sjlA^)!%b^e_1P(Loj&;&j$%Mu-I!?H(GT42p$>2c>dqz5!EWsvC>BB!t& z6~_a!&eXwoUKH%1J1-hM5)KiNQq+LIrb#Jc5CN0N0uNLiJp3~mD>B8U#8tvn421mS zEI6R!r&CmW0^kQMG-j_r463051`6=`S@y7C0~Lo2_Q;tR5Z>Jl&;fcD2?8*zJy#t5y@_uE+BP^JID4pbaxa8p?rg37`We?mfMg@n!u362>4%7g2w zzeXXwuUO@I^=p<@YFKjsvkL1yK+y5d0=&=7H(ge~!7Ursy@7la!g>w=SO+vTO#fQv z-u}nBhi@S2p|NlGmt`KSqd@&nM}a!qQ9xs+$Urs5Y{4)I z*fO`F0PN_Fh2_83JMcBCjT99F4%jdpO3WqgvijYhLW)C(zmbBr03NB5j=zOrsDq`YDiy;5xByoA;V^?6u3qPq zJA~~VkxHNfLjDscK^#B)m4$W~X6phfk5$AA0NDk606>C=2?GU~NDP{QKXI%9?{f=- z9xF@$bfEDgM8#3WtUMaB>F!^7=q0Zr1_kh`acgKey7=RJIC-JHA8354!!XEfj=@x$@&N)keMAR#0|dY^ z!{0dpYoM*if7}LJ5Na0YIEhb?)Tj~a&~X1_1PgA^aJT^?F=J+pppcQTU9jJ=zy&51 z#}a>~Vtotr5P><3(FcKp>d%2>_d`WM<*CuIRs?1mt9L=edl%d^th@2oL<(jifyM$E zxI8Qy|CRS&E0J5D-~@ea09N3cWN^Ud0pe0X&S)0=9R|1}Wq`O0M@iWBG&n$1GQn2Y zKU{xKjWkyKgNC<1xM?i-LBl&1vmTAKWy&&jIgqj`^TF8Yr~Kfo@`GsNkL)HS@0lNNwxfs`D3hz|9lxlDVh@ zW<^m467%)Xn*0y$pv~eA)P`ByffX^6Q2>Xi73y#`_a_8+r-K{r+;Mp<^ua;|G&gm zpa;5BEI@(Ag7eP}1wtMNnDyUV^~-Mxjp`03#4Xy7PPrN3b;hY6PST5 zmH)OVXmeW>;5lhz6}(_6=lBy+4zs0j5>`)JAl&xU{3NQOSA^1ll~JuQr(rM!Rw=7- zL1SG`z%?%B@jroNV3iJ5CA2B<${~nDiht4(?OOa(KBN_AO9HD?L7UsDph2es%Z{_C z&#~h9pJoMZZnFYS4umlUq4K^;6vFJ>IgRImEOWLh;0T19#_CtV1?n72Fw_918yae@ zbPEg$gj?$WRBY@!&au|hHP8<3yRjMmn)(Nez#Qv5eLRB#?NpFOzljVg4F?-4Qf4uUTN2-(Rd)I9adG=sUy63-bCMz(Idg)f1lzSV8)*@NLPcD$ zcN!AUMp8g~wT0MsC=qNV<;)h6Fv3Y7@n?>~2NeQ|k3i8wbO|I?*vy>?BsIi^jU
tDxQA- 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 diff --git a/doc/CFDEMcoupling_Manual.txt b/doc/CFDEMcoupling_Manual.txt index 6e0f2156..638b2f95 100644 --- a/doc/CFDEMcoupling_Manual.txt +++ b/doc/CFDEMcoupling_Manual.txt @@ -266,6 +266,7 @@ listing below of styles within certain commands. "forceModel_MeiLift"_forceModel_MeiLift.html, "forceModel_SchillerNaumannDrag"_forceModel_SchillerNaumannDrag.html, "forceModel_ShirgaonkarIB"_forceModel_ShirgaonkarIB.html, +"forceModel_fieldStore"_forceModel_fieldStore.html, "forceModel_gradPForce"_forceModel_gradPForce.html, "forceModel_noDrag"_forceModel_noDrag.html, "forceModel_particleCellVolume"_forceModel_particleCellVolume.html, diff --git a/doc/cfdemSolverPisoScalar.html b/doc/cfdemSolverPisoScalar.html index 599a2194..191cd84a 100644 --- a/doc/cfdemSolverPisoScalar.html +++ b/doc/cfdemSolverPisoScalar.html @@ -11,12 +11,14 @@

Description:

-

"cfdemSolverPisoScalar" is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework. Based on pisoFoam(R)(*), a finite volume based solver for turbulent Navier-Stokes equations applying PISO algorithm, "cfdemSolverPisoScalar" has additional functionality for a coupling to the DEM code "LIGGGHTS" as well as a scalar transport equation. The volume averaged Navier-Stokes Equations are solved accounting for momentum exchange and volume displacement of discrete particles whose trajectories are calculated in the DEM code LIGGGHTS. The scalar transport equation is coupled to scalar properties of the particle phase, thus convective heat transfer in a fluid granular system can be modeled with "cfdemSolverPisoScalar". +

"cfdemSolverPisoScalar" is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework. Based on pisoFoam(R)(*), a finite volume based solver for turbulent Navier-Stokes equations applying PISO algorithm, "cfdemSolverPisoScalar" has additional functionality for a coupling to the DEM code "LIGGGHTS" as well as a scalar transport equation. The volume averaged Navier-Stokes Equations are solved accounting for momentum exchange and volume displacement of discrete particles, whose trajectories are calculated in the DEM code LIGGGHTS. The scalar transport equation is coupled to scalar properties of the particle phase, thus convective heat transfer in a fluid granular system can be modeled with "cfdemSolverPisoScalar".

see:

GONIVA, C., KLOSS, C., HAGER,A. and PIRKER, S. (2010): "An Open Source CFD-DEM Perspective", Proc. of OpenFOAM Workshop, Göteborg, June 22.-24.

+

The heat transfer equation is implemented according to Nield & Bejan (2013), Convection in Porous Media, DOI 10.1007/978-1-4614-5541-7_2, Springer +


(*) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM® and OpenCFD® trade marks. OPENFOAM® is a registered trade mark of OpenCFD Limited, a wholly owned subsidiary of the ESI Group. diff --git a/doc/cfdemSolverPisoScalar.txt b/doc/cfdemSolverPisoScalar.txt index 41126c41..f05ca932 100644 --- a/doc/cfdemSolverPisoScalar.txt +++ b/doc/cfdemSolverPisoScalar.txt @@ -9,12 +9,15 @@ cfdemSolverPisoScalar command :h3 [Description:] -"cfdemSolverPisoScalar" is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework. Based on pisoFoam(R)(*), a finite volume based solver for turbulent Navier-Stokes equations applying PISO algorithm, "cfdemSolverPisoScalar" has additional functionality for a coupling to the DEM code "LIGGGHTS" as well as a scalar transport equation. The volume averaged Navier-Stokes Equations are solved accounting for momentum exchange and volume displacement of discrete particles whose trajectories are calculated in the DEM code LIGGGHTS. The scalar transport equation is coupled to scalar properties of the particle phase, thus convective heat transfer in a fluid granular system can be modeled with "cfdemSolverPisoScalar". +"cfdemSolverPisoScalar" is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework. Based on pisoFoam(R)(*), a finite volume based solver for turbulent Navier-Stokes equations applying PISO algorithm, "cfdemSolverPisoScalar" has additional functionality for a coupling to the DEM code "LIGGGHTS" as well as a scalar transport equation. The volume averaged Navier-Stokes Equations are solved accounting for momentum exchange and volume displacement of discrete particles, whose trajectories are calculated in the DEM code LIGGGHTS. The scalar transport equation is coupled to scalar properties of the particle phase, thus convective heat transfer in a fluid granular system can be modeled with "cfdemSolverPisoScalar". see: GONIVA, C., KLOSS, C., HAGER,A. and PIRKER, S. (2010): "An Open Source CFD-DEM Perspective", Proc. of OpenFOAM Workshop, Göteborg, June 22.-24. +The heat transfer equation is implemented according to Nield & Bejan (2013), Convection in Porous Media, DOI 10.1007/978-1-4614-5541-7_2, Springer + + :line (*) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM® and OpenCFD® trade marks. OPENFOAM® is a registered trade mark of OpenCFD Limited, a wholly owned subsidiary of the ESI Group. diff --git a/doc/forceModel_LaEuScalarTemp.html b/doc/forceModel_LaEuScalarTemp.html index 2e936521..778d3e32 100644 --- a/doc/forceModel_LaEuScalarTemp.html +++ b/doc/forceModel_LaEuScalarTemp.html @@ -21,7 +21,6 @@ LaEuScalarTempProps { velFieldName "U"; tempFieldName "T"; - tempSourceFieldName "Tsource"; voidfractionFieldName "voidfraction"; partTempName "Temp"; partHeatFluxName "convectiveHeatFlux"; @@ -35,8 +34,6 @@ LaEuScalarTempProps

  • T = name of the finite volume scalar temperature field -
  • Tsource = name of the finite volume scalar temperature source field -
  • voidfraction = name of the finite volume voidfraction field
  • Temp = name of the DEM data representing the particles temperature @@ -63,7 +60,6 @@ LaEuScalarTempProps { velFieldName "U"; tempFieldName "T"; - tempSourceFieldName "Tsource"; voidfractionFieldName "voidfraction"; partTempName "Temp"; partHeatFluxName "convectiveHeatFlux"; @@ -77,7 +73,7 @@ LaEuScalarTempProps

    Restrictions:

    -

    Goes only with cfdemSolverScalar. +

    Goes only with cfdemSolverScalar. The force model has to be the second (!!!) model in the forces list.

    Related commands:

    diff --git a/doc/forceModel_LaEuScalarTemp.txt b/doc/forceModel_LaEuScalarTemp.txt index 9558d2cf..307693c7 100644 --- a/doc/forceModel_LaEuScalarTemp.txt +++ b/doc/forceModel_LaEuScalarTemp.txt @@ -19,7 +19,6 @@ LaEuScalarTempProps \{ velFieldName "U"; tempFieldName "T"; - tempSourceFieldName "Tsource"; voidfractionFieldName "voidfraction"; partTempName "Temp"; partHeatFluxName "convectiveHeatFlux"; @@ -31,7 +30,6 @@ LaEuScalarTempProps {U} = name of the finite volume fluid velocity field :ulb,l {T} = name of the finite volume scalar temperature field :l -{Tsource} = name of the finite volume scalar temperature source field :l {voidfraction} = name of the finite volume voidfraction field :l {Temp} = name of the DEM data representing the particles temperature :l {convectiveHeatFlux} = name of the DEM data representing the particle-fluid convective heat flux :l @@ -51,7 +49,6 @@ LaEuScalarTempProps \{ velFieldName "U"; tempFieldName "T"; - tempSourceFieldName "Tsource"; voidfractionFieldName "voidfraction"; partTempName "Temp"; partHeatFluxName "convectiveHeatFlux"; @@ -65,7 +62,7 @@ This "forceModel" does not influence the particles or the fluid flow! Using the [Restrictions:] -Goes only with cfdemSolverScalar. +Goes only with cfdemSolverScalar. The force model has to be the second (!!!) model in the forces list. [Related commands:] diff --git a/doc/forceModel_fieldStore.html b/doc/forceModel_fieldStore.html new file mode 100644 index 00000000..d21cbcb9 --- /dev/null +++ b/doc/forceModel_fieldStore.html @@ -0,0 +1,68 @@ + +
    CFDEMproject WWW Site - CFDEM Commands +
    + + + + +
    + +

    forceModel_fieldStore command +

    +

    Syntax: +

    +

    Defined in couplingProperties dictionary. +

    +
    forceModels
    +(
    +    fieldStore
    +);
    +fieldStoreProps
    +{
    +    scalarFieldNames
    +    (
    +        "scalarField"
    +    );
    +    vectorFieldNames
    +    (
    +        "vectorField"
    +    );
    +}; 
    +
    +
    • scalarField = names of the finite volume scalar fields to be stored + +
    • vectorField = names of the finite volume vector fields to be stored + + +
    +

    Examples: +

    +
    forceModels
    +(
    +    fieldStore
    +);
    +fieldStoreProps
    +{
    +    scalarFieldNames
    +    (
    +        "voidfraction"
    +    );
    +    vectorFieldNames
    +    (
    +        "U"
    +    );
    +} 
    +
    +

    Description: +

    +

    This "forceModel" does not influence the particles or the flow - it is a tool to store a scalar/vector field! This is especially useful if you use a boundary condition which cannot interpreted correctly in your postporcessor (e.g. paraview). +

    +

    Restrictions: +

    +

    none. +

    +

    Related commands: +

    +

    forceModel +

    + diff --git a/doc/forceModel_fieldStore.txt b/doc/forceModel_fieldStore.txt new file mode 100644 index 00000000..2e8af443 --- /dev/null +++ b/doc/forceModel_fieldStore.txt @@ -0,0 +1,63 @@ +"CFDEMproject WWW Site"_lws - "CFDEM Commands"_lc :c + +:link(lws,http://www.cfdem.com) +:link(lc,CFDEMcoupling_Manual.html#comm) + +:line + +forceModel_fieldStore command :h3 + +[Syntax:] + +Defined in couplingProperties dictionary. + +forceModels +( + fieldStore +); +fieldStoreProps +\{ + scalarFieldNames + ( + "scalarField" + ); + vectorFieldNames + ( + "vectorField" + ); +\}; :pre + +{scalarField} = names of the finite volume scalar fields to be stored :ulb,l +{vectorField} = names of the finite volume vector fields to be stored :l +:ule + +[Examples:] + +forceModels +( + fieldStore +); +fieldStoreProps +\{ + scalarFieldNames + ( + "voidfraction" + ); + vectorFieldNames + ( + "U" + ); +\} :pre + +[Description:] + +This "forceModel" does not influence the particles or the flow - it is a tool to store a scalar/vector field! This is especially useful if you use a boundary condition which cannot interpreted correctly in your postporcessor (e.g. paraview). + +[Restrictions:] + +none. + +[Related commands:] + +"forceModel"_forceModel.html + diff --git a/doc/githubAccess_public.pdf b/doc/githubAccess_public.pdf index ef054d0652b9b2ca39182e10a026f20890136436..13f6bb53a70227787f71227b0ae424e04f3fd7f9 100644 GIT binary patch delta 111 zcmew}QS8q|u?el*rUr%vriR9*X2zC{6Iv%QwoYJboxt2Wfo1CiR=y6WG;`w=%QUkj m^RyImGZUj!q?t<08BO delta 111 zcmew}QS8q|u?el*CWeNF1_lj^ kAeCyAnqru2nr4t New + ( + const dictionary& dict, + cfdemCloud& sm + ); + + // Member Function + + void info(); + + // Access + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/cfdTools/newGlobal.C b/src/lagrangian/cfdemParticle/cfdTools/newGlobal.C new file mode 100644 index 00000000..73c4eac1 --- /dev/null +++ b/src/lagrangian/cfdemParticle/cfdTools/newGlobal.C @@ -0,0 +1,84 @@ +/*---------------------------------------------------------------------------*\ + 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 "global.H" +#include "dilute.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +autoPtr global::New +( + const dictionary& dict, + cfdemCloud& sm +) +{ + word globalType + ( + dict.lookup("global") + ); + + Info<< "Selecting global " + << globalType << endl; + + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(globalType); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalError + << "global::New(const dictionary&, const spray&) : " + << endl + << " unknown globalType type " + << globalType + << ", constructor not in hash table" << endl << endl + << " Valid global types are :" + << endl; + Info<< dictionaryConstructorTablePtr_->toc() + << abort(FatalError); + } + + return autoPtr(cstrIter()(dict,sm)); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H b/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H index eeec5b55..ae743253 100755 --- a/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H +++ b/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H @@ -1,9 +1,44 @@ -word CFDEMversion="cfdem-2.7.9"; -word compatibleLIGGGHTSversion="3.0.3"; +/*---------------------------------------------------------------------------*\ + 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). + +\*---------------------------------------------------------------------------*/ + +#ifndef versionInfo_H +#define versionInfo_H + +word CFDEMversion="cfdem-2.8.2"; +word compatibleLIGGGHTSversion="3.0.6"; word OFversion="2.3.x-commit-4d6f4a3115ff76ec4154c580eb041bc95ba4ec09"; -Info << "\nCFDEMcoupling version: " << CFDEMversion << "\n" << endl; -Info << "\n, compatible to LIGGGHTS version: " << compatibleLIGGGHTSversion << "\n" << endl; -Info << "\n, compatible to OF version: " << OFversion << "\n" << endl; - +Info << "\nCFDEMcoupling version: " << CFDEMversion << endl; +Info << ", compatible to LIGGGHTS version: " << compatibleLIGGGHTSversion << endl; +Info << ", compatible to OF version and build: " << OFversion << endl; +#endif diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index 1e6da060..a913c413 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -31,6 +31,7 @@ Description #include "fileName.H" #include "cfdemCloud.H" +#include "global.H" #include "forceModel.H" #include "locateModel.H" #include "momCoupleModel.H" @@ -121,7 +122,7 @@ Foam::cfdemCloud::cfdemCloud turbulence_ ( #if defined(version21) || defined(version16ext) - #ifdef comp + #ifdef compre mesh.lookupObject #else mesh.lookupObject @@ -217,6 +218,8 @@ Foam::cfdemCloud::cfdemCloud ) { #include "versionInfo.H" + global buildInfo(couplingProperties_,*this); + buildInfo.info(); Info << "If BC are important, please provide volScalarFields -imp/expParticleForces-" << endl; if (couplingProperties_.found("solveFlow")) @@ -453,6 +456,16 @@ label Foam::cfdemCloud::liggghtsCommandModelIndex(word name) return index; } +std::vector* Foam::cfdemCloud::getVprobe() +{ + return probeModel_->getVprobe(); +} + +std::vector* Foam::cfdemCloud::getSprobe() +{ + return probeModel_->getSprobe(); +} + // * * * * * * * * * * * * * * * WRITE * * * * * * * * * * * * * // // * * * write cfdemCloud internal data * * * // @@ -467,6 +480,7 @@ bool Foam::cfdemCloud::evolve numberOfParticlesChanged_ = false; arraysReallocated_=false; bool doCouple=false; + probeModel_->clearProbes(); if(!ignore()) { @@ -516,6 +530,7 @@ bool Foam::cfdemCloud::evolve clockM().start(20,"setVectorAverage"); setVectorAverages(); + //Smoothen "next" fields smoothingM().dSmoothing(); smoothingM().smoothen(voidFractionM().voidFractionNext()); @@ -617,6 +632,29 @@ bool Foam::cfdemCloud::reAllocArrays() const return false; } +bool Foam::cfdemCloud::reAllocArrays(int nP, bool forceRealloc) const +{ + if( (numberOfParticlesChanged_ && !arraysReallocated_) || forceRealloc) + { + // get arrays of new length + dataExchangeM().allocateArray(positions_,0.,3,nP); + dataExchangeM().allocateArray(velocities_,0.,3,nP); + dataExchangeM().allocateArray(fluidVel_,0.,3,nP); + dataExchangeM().allocateArray(impForces_,0.,3,nP); + dataExchangeM().allocateArray(expForces_,0.,3,nP); + dataExchangeM().allocateArray(DEMForces_,0.,3,nP); + dataExchangeM().allocateArray(Cds_,0.,1,nP); + dataExchangeM().allocateArray(radii_,0.,1,nP); + dataExchangeM().allocateArray(voidfractions_,1.,voidFractionM().maxCellsPerParticle(),nP); + dataExchangeM().allocateArray(cellIDs_,0.,voidFractionM().maxCellsPerParticle(),nP); + dataExchangeM().allocateArray(particleWeights_,0.,voidFractionM().maxCellsPerParticle(),nP); + dataExchangeM().allocateArray(particleVolumes_,0.,voidFractionM().maxCellsPerParticle(),nP); + arraysReallocated_ = true; + return true; + } + return false; +} + tmp cfdemCloud::divVoidfractionTau(volVectorField& U,volScalarField& voidfraction) const { return @@ -659,7 +697,7 @@ tmp cfdemCloud::voidfractionNuEff(volScalarField& voidfraction) { return tmp ( - #ifdef comp + #ifdef compre new volScalarField("viscousTerm", (turbulence_.mut() + turbulence_.mu())) #else new volScalarField("viscousTerm", (turbulence_.nut() + turbulence_.nu())) @@ -670,7 +708,7 @@ tmp cfdemCloud::voidfractionNuEff(volScalarField& voidfraction) { return tmp ( - #ifdef comp + #ifdef compre new volScalarField("viscousTerm", voidfraction*(turbulence_.mut() + turbulence_.mu())) #else new volScalarField("viscousTerm", voidfraction*(turbulence_.nut() + turbulence_.nu())) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H index cafdfec4..a9a35ba6 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H @@ -44,6 +44,7 @@ SourceFiles // choose version #include "OFversion.H" +#include #include "fvCFD.H" #include "IFstream.H" @@ -155,7 +156,7 @@ protected: mutable volScalarField ddtVoidfraction_; #if defined(version21) || defined(version16ext) - #ifdef comp + #ifdef compre const compressible::turbulenceModel& turbulence_; #else const incompressible::turbulenceModel& turbulence_; @@ -323,6 +324,9 @@ public: virtual inline double ** exArray() const {return NULL;}; virtual vector ex(int) const {return Foam::vector(0,0,0);}; + //Detector if SRF module is enable or not + virtual inline bool SRFOn(){return false;} + inline int numberOfParticles() const; inline bool numberOfParticlesChanged() const; @@ -358,7 +362,7 @@ public: inline autoPtr* liggghtsCommand() const; #if defined(version21) || defined(version16ext) - #ifdef comp + #ifdef compre inline const compressible::turbulenceModel& turbulence() const; #else inline const incompressible::turbulenceModel& turbulence() const; @@ -374,6 +378,9 @@ public: virtual bool reAllocArrays() const; + virtual bool reAllocArrays(int nP, bool forceRealloc) const; //force number of particles during reallocation + + // IO void writeScalarFieldToTerminal(double**&); @@ -391,6 +398,10 @@ public: tmp voidfractionNuEff(volScalarField&) const; void resetArray(double**&,int,int,double resetVal=0.); + + std::vector* getVprobe(); + + std::vector* getSprobe(); }; diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H index fcdaae2c..8549060d 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H @@ -284,7 +284,7 @@ inline autoPtr* cfdemCloud::liggghtsCommand() const } #if defined(version21) || defined(version16ext) - #ifdef comp + #ifdef compre inline const compressible::turbulenceModel& cfdemCloud::turbulence() const #else inline const incompressible::turbulenceModel& cfdemCloud::turbulence() const diff --git a/src/lagrangian/cfdemParticle/etc/OFversion/OFversion.H b/src/lagrangian/cfdemParticle/etc/OFversion/OFversion.H index aa7bbb96..ba6a30dd 100644 --- a/src/lagrangian/cfdemParticle/etc/OFversion/OFversion.H +++ b/src/lagrangian/cfdemParticle/etc/OFversion/OFversion.H @@ -5,10 +5,10 @@ //#define version15 // choose comp/incomp -//#define comp // if comp is on - you must use Make/options_comp! +//#define compre // if comp is on - you must use Make/options_comp! //define multi sphere -#define multisphere +//#define multisphere // features of 2.1 work also in 2.3 #if defined(version23) diff --git a/src/lagrangian/cfdemParticle/etc/bashrc b/src/lagrangian/cfdemParticle/etc/bashrc index abef2168..48a0424b 100755 --- a/src/lagrangian/cfdemParticle/etc/bashrc +++ b/src/lagrangian/cfdemParticle/etc/bashrc @@ -50,6 +50,9 @@ export CFDEM_LIGGGHTS_LIB_NAME=lmp_$CFDEM_LIGGGHTS_MAKEFILE_NAME #- CFDEM lib name export CFDEM_LIB_NAME=lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION +#- CFDEM compressible lib name +export CFDEM_LIB_COMP_NAME=lagrangianCFDEMcomp-$CFDEM_VERSION-$WM_PROJECT_VERSION + #----------------------------------------------------- # additional libraries @@ -68,6 +71,9 @@ export CFDEM_POEMSLIB_MAKEFILENAME=g++ #- LMP ASPHERE lib path and makefile export CFDEM_ASPHERELIB_PATH=$CFDEM_LAMMPS_LIB_DIR/poems export CFDEM_ASPHERELIB_MAKEFILENAME=g++ + +#-C3PO library +export C3PO_SRC_DIR=$CFDEM_SRC_DIR/c3po #----------------------------------------------------- #- path to test harness @@ -178,6 +184,11 @@ export -f cfdemLiggghtsPar cfdemGrep() { grep -rl "$1" ./* | xargs gedit; } export -f cfdemGrep +#- shortcut lo list files in a directory +#cfdemListFiles() { find $1 | sed s:""$1"":: > listOfFiles.txt; } #leave out the dir iteslf in list +cfdemListFiles() { find $1 > listOfFiles.txt; } #keep the dir in list +export -f cfdemListFiles + # check if the run directory exists if [ -d "$CFDEM_PROJECT_USER_DIR" ]; then : diff --git a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh index a763dace..a4b531c3 100755 --- a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh +++ b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh @@ -20,48 +20,48 @@ mkdir -p $logDir #================================================================================# # compile src #================================================================================# - whitelist="$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/library-list.txt" - echo "" - echo "Please provide the libraries to be compiled in the $CWD/$whitelist file." +whitelist="$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/library-list.txt" +echo "" +echo "Please provide the libraries to be compiled in the $CWD/$whitelist file." - if [ ! -f "$CWD/$whitelist" ];then - echo "$whitelist does not exist in $CWD. Nothing will be done." - NLINES=0 - COUNT=0 - else - NLINES=`wc -l < $CWD/$whitelist` - COUNT=0 - fi +if [ ! -f "$CWD/$whitelist" ];then + echo "$whitelist does not exist in $CWD. Nothing will be done." + NLINES=0 + COUNT=0 +else + NLINES=`wc -l < $CWD/$whitelist` + COUNT=0 +fi - while [ $COUNT -lt $NLINES ] - do - let COUNT++ - LINE=`head -n $COUNT $CWD/$whitelist | tail -1` - - # white lines - if [[ "$LINE" == "" ]]; then - echo "compile $LINE" - continue - # comments - elif [[ "$LINE" == \#* ]]; then - continue - # paths - elif [[ "$LINE" == */dir ]]; then - echo "will change path..." - LINE=$(echo "${LINE%????}") - path="$CFDEM_SRC_DIR/$LINE" - cd $path - #continue - fi - #--------------------------------------------------------------------------------# - #- define variables - logpath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")/$logDir" - logfileName="log_compileCFDEMcoupling_"$(basename $LINE)"" - casePath="$path" - headerText="$logfileName""-$NOW" - #--------------------------------------------------------------------------------# - # remove old log file - rm "$logpath/$logfileName"* - compileLib $logpath $logfileName $casePath $headerText - done +while [ $COUNT -lt $NLINES ] +do + let COUNT++ + LINE=`head -n $COUNT $CWD/$whitelist | tail -1` + + # white lines + if [[ "$LINE" == "" ]]; then + echo "compile $LINE" + continue + # comments + elif [[ "$LINE" == \#* ]]; then + continue + # paths + elif [[ "$LINE" == */dir ]]; then + echo "will change path..." + LINE=$(echo "${LINE%????}") + path="$CFDEM_SRC_DIR/$LINE" + cd $path + #continue + fi + #--------------------------------------------------------------------------------# + #- define variables + logpath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")/$logDir" + logfileName="log_compileCFDEMcoupling_"$(basename $LINE)"" + casePath="$path" + headerText="$logfileName""-$NOW" + #--------------------------------------------------------------------------------# + # remove old log file + rm "$logpath/$logfileName"* + compileLib $logpath $logfileName $casePath $headerText +done diff --git a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh index 8b91bfeb..d4e0306e 100644 --- a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh +++ b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh @@ -1,36 +1,115 @@ #!/bin/bash #===================================================================# -# compile routine for CFDEMcoupling solvers, part of CFDEMproject +# compile routine for CFDEMcoupling utilities, part of CFDEMproject # Christoph Goniva - May. 2012, DCS Computing GmbH #===================================================================# +whitelist="utilities-list.txt" + #- include functions source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh - -NOW="$(date +"%Y-%m-%d-%H:%M")" logDir="log" - - cd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc mkdir -p $logDir -#================================================================================# -# compile utilities -#================================================================================# +CWD="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")" +NOW="$(date +"%Y-%m-%d-%H:%M")" +echo "" +echo "This routine will compile the utilities specified in utilities-list.txt" +echo "" +#echo "Are the variables CFDEM_UT_DIR=$CFDEM_UT_DIR" +#echo "and CFDEM_SRC_DIR=$CFDEM_SRC_DIR/lagrangian/cfdemParticle correct? (y/n)" +#read YN +#if [ "$YN" != "y" ];then +# echo "Aborted by user." +# exit 1 +#fi + +echo "" +echo "Please provide the utilities to be compiled in the $CWD/$whitelist file." +echo "structure:" +echo "path to provide the path relative to CFDEM_UT_DIR" +echo "" +echo "example:" +echo "cfdemPostproc/dir" +echo "" + +if [ ! -f "$CWD/$whitelist" ];then + echo "$whitelist does not exist in $CWD" +else + njobs=`wc -l < $CWD/$whitelist` + echo "" + echo "running compilation in pseudo-parallel mode of $njobs utilities" -for utName in "cfdemPostproc" -do #--------------------------------------------------------------------------------# - #- define variables logpath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")/$logDir" - logfileName="log_compileCFDEMcoupling""_$utName" - casePath="$CFDEM_UT_DIR/$utName" - headerText="$logfileName""_$utName""-$NOW" - #--------------------------------------------------------------------------------# - compileSolver $logpath $logfileName $casePath $headerText -done -echo "Note: the list of utilities compiled might be incomplete." -echo "please check $CFDEM_UT_DIR for more utilities available" + ##number of utilities compiled at a time + + if [[ $WM_NCOMPPROCS == "" ]] || [ $WM_NCOMPPROCS -eq 1 ]; then + nsteps=1 + let nchunk=$njobs+1 # +1, to wait for the last compilation too + echo "do compilation in serial" + else + nsteps=$WM_NCOMPPROCS + nchunk=`echo $njobs/$nsteps+1 | bc` + echo "do compilation on $nsteps procs in $nchunk chunks" + let nchunk++ # +1, to wait for the last compilation too + fi + + counter=0 + for i in `seq $nchunk` + do + + #wait until prev. compilation is finished + echo "waiting..." + until [ `ps -C make | wc -l` -eq 1 ]; + do + sleep 2 + done + + for j in `seq $nsteps` + do + let solNr=($i-1)*$nsteps+$j + LINE=`head -n $solNr $CWD/$whitelist | tail -1` + + # white lines + if [[ "$LINE" == "" ]]; then + continue + # comments + elif [[ "$LINE" == \#* ]]; then + continue + # paths + elif [[ "$LINE" == */dir ]]; then + #echo "change path" + LINE=$(echo "${LINE%????}") + path="$CFDEM_UT_DIR/$LINE" + #cd $path + let solNr++ + fi + + if [[ "$counter" -lt "$njobs" ]]; then + #--------------------------------------------------------------------------------# + #- define variables + #logpath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")/$logDir" + logfileName="log_compileCFDEMcoupling""_$LINE" + casePath="$CFDEM_UT_DIR/$LINE" + headerText="$logfileName""_$LINE""-$NOW" + parallel="true" + #--------------------------------------------------------------------------------# + + #echo "compiling $LINE" + compileSolver $logpath $logfileName $casePath $headerText $parallel + let counter++ + fi + done + + sleep 1 # wait a second until compilation starts + done + + echo "compilation done." +fi + + diff --git a/src/lagrangian/cfdemParticle/etc/cshrc b/src/lagrangian/cfdemParticle/etc/cshrc index 351de826..4e07778e 100755 --- a/src/lagrangian/cfdemParticle/etc/cshrc +++ b/src/lagrangian/cfdemParticle/etc/cshrc @@ -43,6 +43,9 @@ setenv CFDEM_LIGGGHTS_LIB_NAME lmp_$CFDEM_LIGGGHTS_MAKEFILE_NAME #- CFDEM lib name setenv CFDEM_LIB_NAME lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION +#- CFDEM compressible lib name +setenv CFDEM_LIB_COMP_NAME lagrangianCFDEMcomp-$CFDEM_VERSION-$WM_PROJECT_VERSION + #- LMP Many2Many lib path and makefile setenv CFDEM_Many2ManyLIB_PATH $CFDEM_SRC_DIR/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library setenv CFDEM_Many2ManyLIB_MAKEFILENAME $CFDEM_LIGGGHTS_MAKEFILE_NAME diff --git a/src/lagrangian/cfdemParticle/etc/functions.sh b/src/lagrangian/cfdemParticle/etc/functions.sh index 526221aa..e89fa54b 100755 --- a/src/lagrangian/cfdemParticle/etc/functions.sh +++ b/src/lagrangian/cfdemParticle/etc/functions.sh @@ -71,6 +71,21 @@ compileLib() #- wclean and wmake #if [ $doClean != "noClean" ]; then + # check library to compile is compressible + str=$casePath + i=$((${#str}-4)) + ending=${str:$i:4} + if [[ $ending == "Comp" ]]; then + echo "Compiling a compressible library - so doing an rmdepall of incomp library first." + echo "Please make sure to have the compressible libraries first in the library-list.txt!" + cd $CFDEM_SRC_DIR/lagrangian/cfdemParticle + echo "changing to $PWD" + rmdepall 2>&1 | tee -a $logpath/$logfileName + cd $casePath + echo "changing to $PWD" + else + echo "Compiling a incompressible library." + fi rmdepall 2>&1 | tee -a $logpath/$logfileName wclean 2>&1 | tee -a $logpath/$logfileName #fi diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/Archimedes/Archimedes.C b/src/lagrangian/cfdemParticle/subModels/forceModel/Archimedes/Archimedes.C index 42416b79..05120cec 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/Archimedes/Archimedes.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/Archimedes/Archimedes.C @@ -101,7 +101,7 @@ Archimedes::Archimedes if (modelType_=="B"){ if(forceSubM(0).switches()[1]) // treatDEM = true { - Warning << "Usually model type B needs Archimedes only on CFD and DEM side (treatForceDEM=false)! are you sure about your settings?" << endl; + Warning << "Usually model type B needs Archimedes on CFD and DEM side (treatForceDEM=false)! are you sure about your settings?" << endl; } } diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C index 5684071d..da0a465b 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C @@ -187,7 +187,7 @@ void KochHillDrag::setForce() const magUr = mag(Ur); Rep = 0; Vs = ds*ds*ds*M_PI/6; - volumefraction = 1-voidfraction+SMALL; + volumefraction = max(SMALL,min(1-SMALL,1-voidfraction)); if (magUr > 0) { diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/LaEuScalarTemp/LaEuScalarTemp.C b/src/lagrangian/cfdemParticle/subModels/forceModel/LaEuScalarTemp/LaEuScalarTemp.C index 1fdccec8..57a5da65 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/LaEuScalarTemp/LaEuScalarTemp.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/LaEuScalarTemp/LaEuScalarTemp.C @@ -138,8 +138,6 @@ void LaEuScalarTemp::manipulateScalarField(volScalarField& EuField) const const volScalarField& nufField = forceSubM(0).nuField(); const volScalarField& rhoField = forceSubM(0).rhoField(); -Info << "nufField=" << nufField << endl; - // calc La based heat flux vector position(0,0,0); scalar voidfraction(1); @@ -160,6 +158,8 @@ Info << "nufField=" << nufField << endl; interpolationCellPoint UInterpolator_(U_); interpolationCellPoint TInterpolator_(tempField_); + scalar h1(0); + scalar h2(0); for(int index = 0;index < particleCloud_.numberOfParticles(); ++index) { //if(particleCloud_.regionM().inRegion()[index][0]) @@ -187,7 +187,7 @@ Info << "nufField=" << nufField << endl; As = ds*ds*M_PI; nuf = nufField[cellI]; Rep = ds*magUr/nuf; - Pr = Cp_*nuf*rhoField[cellI]/lambda_; + Pr = max(SMALL,Cp_*nuf*rhoField[cellI]/lambda_); if (Rep < 200) { @@ -195,8 +195,9 @@ Info << "nufField=" << nufField << endl; } else if (Rep < 1500) { - Nup = 2+0.5*pow(voidfraction,n)*sqrt(Rep)*pow(Pr,0.33) - +0.02*pow(voidfraction,n)*pow(Rep,0.8)*pow(Pr,0.33); + h1=pow(voidfraction,n); + h2=pow(Pr,0.33); + Nup = 2+0.5*h1*sqrt(Rep)*h2+0.02*h1*pow(Rep,0.8)*h2; } else { diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/ShirgaonkarIB/ShirgaonkarIB.C b/src/lagrangian/cfdemParticle/subModels/forceModel/ShirgaonkarIB/ShirgaonkarIB.C index 310783ff..59569a45 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/ShirgaonkarIB/ShirgaonkarIB.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/ShirgaonkarIB/ShirgaonkarIB.C @@ -112,14 +112,7 @@ void ShirgaonkarIB::setForce() const label cellI; vector drag; - #ifdef comp - const volScalarField& mufField = forceSubM(0).muField(); - volVectorField h = (mufField*fvc::laplacian(U_)-fvc::grad(p_)); - #else - const volScalarField& nufField = forceSubM(0).nuField(); - const volScalarField& rhoField = forceSubM(0).rhoField(); - volVectorField h = rhoField*(nufField*fvc::laplacian(U_)-fvc::grad(p_)); - #endif + volVectorField h=forceSubM(0).IBDragPerV(U_,p_); #include "setupProbeModel.H" diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/checkCouplingInterval/checkCouplingInterval.C b/src/lagrangian/cfdemParticle/subModels/forceModel/checkCouplingInterval/checkCouplingInterval.C index ab50686c..a226d82b 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/checkCouplingInterval/checkCouplingInterval.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/checkCouplingInterval/checkCouplingInterval.C @@ -65,7 +65,13 @@ checkCouplingInterval::checkCouplingInterval forceModel(dict,sm), propsDict_(dict.subDict(typeName + "Props")), rhoP_(readScalar(propsDict_.lookup("rhoP"))) -{} +{ + // init force sub model + setForceSubModels(propsDict_); + + // read those switches defined above, if provided in dict + forceSubM(0).readSwitches(); +} // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // @@ -108,7 +114,8 @@ void checkCouplingInterval::setForce() const double accNrAll=-1.; MPI_Allreduce(&accNr, &accNrAll, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); - + Info << "min. occurring particle relaxation time [s]: " << minTauP << endl; + Info << "coupling interval [s]: " << DEMtime << endl; Info << "max. occurring acceleration nr: " << accNrAll << endl; if(accNrAll > 0.1) Warning << "you should use a smaller coupling interval!" << endl; } diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.C b/src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.C new file mode 100644 index 00000000..24a299b8 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.C @@ -0,0 +1,164 @@ +/*---------------------------------------------------------------------------*\ + 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 "fieldStore.H" +#include "addToRunTimeSelectionTable.H" +#include "dataExchangeModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(fieldStore, 0); + +addToRunTimeSelectionTable +( + forceModel, + fieldStore, + dictionary +); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +fieldStore::fieldStore +( + const dictionary& dict, + cfdemCloud& sm +) +: + forceModel(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + mesh_(particleCloud_.mesh()), + scalarFieldNames_(propsDict_.lookup("scalarFieldNames")), + vectorFieldNames_(propsDict_.lookup("vectorFieldNames")), + scalarFields_(NULL), + vectorFields_(NULL) +{ + // create time average scalar fields + scalarFields_.setSize(scalarFieldNames_.size()); + + for (int i=0;i < scalarFieldNames_.size(); i++) + { + word fieldName = "stored_" + scalarFieldNames_[i]; + + Info<< "Creating field " << fieldName << endl; + scalarFields_.set + ( + i, + new volScalarField + ( + IOobject + ( + fieldName, + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh_, + dimensionedScalar("0", mesh_.lookupObject(scalarFieldNames_[i]).dimensions(), 0) + ) + ); + } + + // create time average vector fields + vectorFields_.setSize(vectorFieldNames_.size()); + + for (int i=0;i < vectorFieldNames_.size(); i++) + { + word fieldName = "stored_" + vectorFieldNames_[i]; + + Info<< "Creating field " << fieldName << endl; + vectorFields_.set + ( + i, + new volVectorField + ( + IOobject + ( + fieldName, + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh_, + dimensionedVector("0", mesh_.lookupObject(vectorFieldNames_[i]).dimensions(), vector::zero) + ) + ); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +fieldStore::~fieldStore() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void fieldStore::setForce() const +{ + if(particleCloud_.verbose()) Info << "fieldStore.C - setForce()" << endl; + + for (int i=0;i < scalarFieldNames_.size(); i++) + { + // get reference to actual field + volScalarField& field = (volScalarField&) mesh_.lookupObject(scalarFieldNames_[i]); + + // save field + scalarFields_[i] = field; + } + + for (int i=0;i < vectorFieldNames_.size(); i++) + { + // get reference to actual field + volVectorField& field = (volVectorField&) mesh_.lookupObject(vectorFieldNames_[i]); + + // save field + vectorFields_[i] = field; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.H b/src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.H new file mode 100644 index 00000000..f9caf1d6 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.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). + + calc time average of scalar or vector field + +Class + fieldStore + +SourceFiles + fieldStore.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fieldStore_H +#define fieldStore_H + +#include "forceModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class fieldStore Declaration +\*---------------------------------------------------------------------------*/ + +class fieldStore +: + public forceModel +{ +private: + + dictionary propsDict_; + + const fvMesh& mesh_; + + const wordList scalarFieldNames_; + + const wordList vectorFieldNames_; + + mutable PtrList scalarFields_; + + mutable PtrList vectorFields_; + +public: + + //- Runtime type information + TypeName("fieldStore"); + + + // Constructors + + //- Construct from components + fieldStore + ( + const dictionary& dict, + cfdemCloud& sm + ); + + // Destructor + + ~fieldStore(); + + + // Member Functions + void setForce() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.C b/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.C index ba1aaa9d..a1cce23c 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.C @@ -76,7 +76,32 @@ forceSubModel::forceSubModel sm.mesh(), dimensionedScalar("nu0", dimensionSet(0, 2, -1, 0, 0), 1.) ), - nuField_(sm.turbulence().nu()), + divTau_ + ( + IOobject + ( + "divTau", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedVector("divTau", dimensionSet(1, -2, -2, 0, 0), vector::zero) + ), + IBDragPerV_ + ( + IOobject + ( + "IBDragPerV", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedVector("IBDragPerV", dimensionSet(1, -2, -2, 0, 0), vector::zero) + ), densityFieldName_(dict_.lookupOrDefault("densityFieldName","rho")), rho_(sm.mesh().lookupObject (densityFieldName_)) { @@ -246,8 +271,9 @@ void forceSubModel::readSwitches() const const volScalarField& forceSubModel::nuField() const { - #ifdef comp - return particleCloud_.turbulence().mu() / rho_; + #ifdef compre + nu_=particleCloud_.turbulence().mu() / rho_; + return nu_; #else if(switches_[8]) // scalarViscosity=true return nu_; @@ -258,9 +284,12 @@ const volScalarField& forceSubModel::nuField() const const volScalarField& forceSubModel::muField() const { - #ifdef comp + #ifdef compre return particleCloud_.turbulence().mu(); #else + // passing the ref to nu*rho will not work->generate a mu_ field like nu_ + FatalError<< "implementation not complete!" << abort(FatalError); + if(switches_[8]) // scalarViscosity=true return nu_*rho_; else @@ -270,7 +299,32 @@ const volScalarField& forceSubModel::muField() const const volScalarField& forceSubModel::rhoField() const { - return rho_; + return rho_; +} + +const volVectorField& forceSubModel::divTauField(const volVectorField& U) const +{ + // calc div(Tau) + #ifdef compre + const volScalarField& mu_ = muField(); + divTau_ = -fvc::laplacian(mu_, U) - fvc::div(mu_*dev(fvc::grad(U)().T())); + return divTau_; + #else + const volScalarField& nu_ = nuField(); + const volScalarField& rho_ = rhoField(); + divTau_ = -fvc::laplacian(nu_*rho_, U)- fvc::div(nu_*rho_*dev(fvc::grad(U)().T())); + return divTau_; + #endif +} + +const volVectorField& forceSubModel::IBDragPerV(const volVectorField& U,const volScalarField& p) const +{ + #ifdef compre + IBDragPerV_ = muField()*fvc::laplacian(U)-fvc::grad(p) + #else + IBDragPerV_ = rhoField()*(nuField()*fvc::laplacian(U)-fvc::grad(p)); + #endif + return IBDragPerV_; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.H b/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.H index 59d80a73..e4cc63e5 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.H @@ -73,7 +73,9 @@ protected: mutable volScalarField nu_; - const volScalarField& nuField_; + mutable volVectorField divTau_; + + mutable volVectorField IBDragPerV_; word densityFieldName_; @@ -163,6 +165,10 @@ public: const volScalarField& muField() const; const volScalarField& rhoField() const; + + const volVectorField& divTauField(const volVectorField&) const; + + const volVectorField& IBDragPerV(const volVectorField&,const volScalarField&) const; }; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C b/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C index b53af340..571915ab 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C @@ -126,21 +126,7 @@ viscForce::~viscForce() void viscForce::setForce() const { - const volScalarField& nufField = forceSubM(0).nuField(); - const volScalarField& rhoField = forceSubM(0).rhoField(); - - // get viscosity field - #ifdef comp - // calc div(Tau) - volVectorField divTauField = - - fvc::laplacian(forceSubM(0).muField(), U_) - - fvc::div(forceSubM(0).muField()*dev(fvc::grad(U_)().T())); - #else - // calc div(Tau) - volVectorField divTauField = - - fvc::laplacian(nufField*rhoField, U_) - - fvc::div(nufField*rhoField*dev(fvc::grad(U_)().T())); - #endif + const volVectorField& divTauField = forceSubM(0).divTauField(U_); vector divTau; scalar Vs; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C index 691b61e3..35a0386d 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C @@ -64,12 +64,10 @@ DiFeliceDragMS::DiFeliceDragMS : forceModelMS(dict,sm), propsDict_(dict.subDict(typeName + "Props")), - verbose_(false), velFieldName_(propsDict_.lookup("velFieldName")), U_(sm.mesh().lookupObject (velFieldName_)), voidfractionFieldName_(propsDict_.lookup("voidfractionFieldName")), voidfraction_(sm.mesh().lookupObject (voidfractionFieldName_)), - interpolation_(false), splitImplicitExplicit_(false), UsFieldName_(propsDict_.lookup("granVelFieldName")), UsField_(sm.mesh().lookupObject (UsFieldName_)) @@ -85,28 +83,26 @@ DiFeliceDragMS::DiFeliceDragMS particleCloud_.probeM().scalarFields_.append("voidfraction"); //other are debug particleCloud_.probeM().writeHeader(); - if (propsDict_.found("verbose")) verbose_=true; - // init force sub model setForceSubModels(propsDict_); // define switches which can be read from dict forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch + forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch + forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch // read those switches defined above, if provided in dict forceSubM(0).readSwitches(); - if (propsDict_.found("interpolation")) + if (forceSubM(0).interpolation()) { - Info << "using interpolated value of U." << endl; - interpolation_=true; Warning << " interpolation is commented for this force model - it seems to be unstable with AMI!" << endl; } if (propsDict_.found("splitImplicitExplicit")) { Info << "will split implicit / explicit force contributions." << endl; splitImplicitExplicit_ = true; - if(!interpolation_) + if(!forceSubM(0).interpolation()) Info << "WARNING: will only consider fluctuating particle velocity in implicit / explicit force split!" << endl; } particleCloud_.checkCG(false); @@ -163,7 +159,7 @@ void DiFeliceDragMS::setForce() const if (cellI > -1) // particle Found { - //if(interpolation_) + //if(forceSubM(0).interpolation()) //{ // position = cloudRefMS().positionCM(index); // voidfraction = voidfractionInterpolator_.interpolate(position,cellI); @@ -218,7 +214,7 @@ void DiFeliceDragMS::setForce() const } } - if(verbose_ && index >=0 && index <10) + if(forceSubM(0).verbose() && index >=0 && index <10) { Pout << "index = " << index << endl; Pout << "Us = " << Us << endl; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H index dd31d9ac..27bc6275 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H @@ -61,8 +61,6 @@ class DiFeliceDragMS private: dictionary propsDict_; - bool verbose_; - word velFieldName_; const volVectorField& U_; @@ -71,8 +69,6 @@ private: const volScalarField& voidfraction_; - bool interpolation_; // use interpolated U field values - bool splitImplicitExplicit_; // use splitting of implicit and explict force contribution word UsFieldName_; diff --git a/src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/liggghtsCommandModel/liggghtsCommandModel.C b/src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/liggghtsCommandModel/liggghtsCommandModel.C index ae85ed1c..73c93e16 100644 --- a/src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/liggghtsCommandModel/liggghtsCommandModel.C +++ b/src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/liggghtsCommandModel/liggghtsCommandModel.C @@ -115,14 +115,14 @@ void liggghtsCommandModel::checkTimeSettings(const dictionary& propsDict) if(runLast_) // last run { // read time options from subdict - endTime_ = particleCloud_.mesh().time().endTime().value(); + endTime_ = particleCloud_.mesh().time().endTime().value()-particleCloud_.mesh().time().startTime().value(); startTime_ = endTime_; - timeInterval_ = 1; + timeInterval_ = -1; // calculate coupling times firstCouplingStep_ = floor(startTime_/DEMts/couplingInterval); lastCouplingStep_ = floor(endTime_/DEMts/couplingInterval); - couplingStepInterval_ = floor(timeInterval_/DEMts/couplingInterval); + couplingStepInterval_ = -1; } else //runEveryCouplingStep of every n steps or every writeStep { @@ -150,7 +150,7 @@ void liggghtsCommandModel::checkTimeSettings(const dictionary& propsDict) { firstCouplingStep_ =1; lastCouplingStep_ =1; - couplingStepInterval_ =1; + couplingStepInterval_ =-1; } if(verbose_){ diff --git a/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.C b/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.C index dc480bdc..96affbed 100644 --- a/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.C +++ b/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.C @@ -204,7 +204,7 @@ void particleProbe::writeHeader() const *sPtr<<"|| scalarData: " << " "; forAll(scalarFields_, iter) { - *sPtr << scalarFields_(iter) << " "; + *sPtr << scalarFields_(iter) << " "; } } @@ -214,8 +214,20 @@ void particleProbe::writeHeader() const } +void particleProbe::clearProbes() const +{ + for (unsigned int i=0; i sValues, Field vValues) const { + + if(printNow_ && checkIDForPrint(index) && verboseToFile_) { @@ -224,15 +236,34 @@ void particleProbe::writeProbe(int index, Field sValues, Field v *sPtr << index << tab << particleCloud_.mesh().time().value() << " " ; *sPtr << "|| "; - + + int vsize_=vProbes_.size(); //vectorFields *sPtr << setprecision(writePrecision_) ; forAll(vValues, iter) { - if(!probeDebug_ && iter>0) break; + // if(!probeDebug_ && iter>0) break; *sPtr << vValues[iter][0] << " "; *sPtr << vValues[iter][1] << " "; *sPtr << vValues[iter][2] << " "; + + + if(index sValues, Field v forAll(sValues, iter) { *sPtr << sValues[iter] << " "; + sProbes_.push_back(sValues[iter]); } } diff --git a/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.H b/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.H index 6d07f239..043bf2c8 100644 --- a/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.H +++ b/src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.H @@ -44,7 +44,7 @@ SourceFiles #include "polyMesh.H" #include "cfdemCloud.H" #include "OFstream.H" - +#include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -101,6 +101,10 @@ private: mutable bool printNow_; + mutable std::vector sProbes_; + + mutable std::vector vProbes_; + public: //- Runtime type information @@ -129,6 +133,9 @@ public: void writeProbe(int index, Field sValues, Field vValues) const; bool checkIDForPrint(int) const; void setCounter() const; + void clearProbes() const; + std::vector* getVprobe() {return &vProbes_; }; + std::vector* getSprobe() {return &sProbes_; }; }; diff --git a/src/lagrangian/cfdemParticle/subModels/probeModel/probeModel/probeModel.H b/src/lagrangian/cfdemParticle/subModels/probeModel/probeModel/probeModel.H index 0330dc1c..54e57735 100644 --- a/src/lagrangian/cfdemParticle/subModels/probeModel/probeModel/probeModel.H +++ b/src/lagrangian/cfdemParticle/subModels/probeModel/probeModel/probeModel.H @@ -41,6 +41,7 @@ SourceFiles #include "fvCFD.H" #include "cfdemCloud.H" +#include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -139,6 +140,9 @@ public: virtual bool checkIDForPrint(int) const {return false;}; virtual void setCounter() const {}; virtual bool active() const {return true;}; + virtual std::vector* getVprobe() {return NULL;}; + virtual std::vector* getSprobe() {return NULL;}; + virtual void clearProbes() const {}; const char* wordToChar(word&) const; // Access diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C index 14d1bdbe..88ba06a7 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C @@ -69,7 +69,8 @@ dividedVoidFraction::dividedVoidFraction alphaMin_(readScalar(propsDict_.lookup("alphaMin"))), alphaLimited_(0), tooMuch_(0.0), - interpolation_(false) + interpolation_(false), + cfdemUseOnly_(false) { maxCellsPerParticle_ = 29; @@ -83,6 +84,11 @@ dividedVoidFraction::dividedVoidFraction checkWeightNporosity(propsDict_); if (propsDict_.found("verbose")) verbose_=true; + + if (propsDict_.found("cfdemUseOnly")) + { + cfdemUseOnly_ = readBool(propsDict_.lookup("cfdemUseOnly")); + } } @@ -96,7 +102,11 @@ dividedVoidFraction::~dividedVoidFraction() void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes, double**& particleV) const { - reAllocArrays(); + + if(cfdemUseOnly_) + reAllocArrays(particleCloud_.numberOfParticles()); + else + reAllocArrays(); scalar pi = M_PI; vector position(0,0,0); @@ -114,6 +124,7 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra //if(mask[index][0]) //{ // reset + for(int subcell=0;subcell