From 5fb9e6cd847e890abb566e1852f0aca42f19cde5 Mon Sep 17 00:00:00 2001 From: cfdem Date: Tue, 23 Oct 2012 10:36:40 +0200 Subject: [PATCH] release on 2012-10-23_10-36-40 --- README | 82 ------ .../solvers/cfdemSolverIB/cfdemSolverIB.C | 7 +- .../solvers/cfdemSolverPiso/cfdemSolverPiso.C | 23 +- .../solvers/cfdemSolverPisoMS/Make/files | 3 + .../solvers/cfdemSolverPisoMS/Make/options | 16 + .../cfdemSolverPisoMS/cfdemSolverPisoMS.C | 191 ++++++++++++ .../cfdemSolverPisoScalar.C | 8 +- doc/CFDEMcoupling_Manual.html | 15 + doc/CFDEMcoupling_Manual.pdf | Bin 509450 -> 510502 bytes doc/CFDEMcoupling_Manual.txt | 23 ++ doc/forceModel_KochHillDrag.html | 2 +- doc/forceModel_KochHillDrag.txt | 2 +- doc/githubAccess_public.pdf | Bin 361862 -> 361862 bytes ...voidFractionModel_dividedVoidFraction.html | 3 + doc/voidFractionModel_dividedVoidFraction.txt | 2 + src/lagrangian/cfdemParticle/Make/files | 27 +- src/lagrangian/cfdemParticle/Make/options | 2 +- .../cfdemParticle/cfdemCloud/cfdemCloud.C | 27 +- .../derived/cfdemCloudIB/cfdemCloudIB.C | 5 +- .../derived/cfdemCloudIB/cfdemCloudIB.H | 2 +- .../derived/cfdemCloudMS/cfdemCloudMS.C | 273 ++++++++++++++++++ .../derived/cfdemCloudMS/cfdemCloudMS.H | 160 ++++++++++ src/lagrangian/cfdemParticle/etc/bashrc | 16 +- .../cfdemParticle/etc/cfdemSystemTest.sh | 1 + .../cfdemParticle/etc/compileCFDEMcoupling.sh | 5 +- src/lagrangian/cfdemParticle/etc/cshrc | 13 + src/lagrangian/cfdemParticle/etc/functions.sh | 99 ++++++- .../dataExchangeModel/twoWayMPI/twoWayMPI.C | 2 + .../forceModel/KochHillDrag/KochHillDrag.C | 25 +- .../DiFeliceDragMS/DiFeliceDragMS.C | 232 +++++++++++++++ .../DiFeliceDragMS/DiFeliceDragMS.H | 121 ++++++++ .../forceModelMS/forceModelMS/forceModelMS.C | 76 +++++ .../forceModelMS/forceModelMS/forceModelMS.H | 124 ++++++++ .../forceModelMS/newForceModelMS.C | 79 +++++ .../dividedVoidFraction/dividedVoidFraction.C | 73 ++++- .../dividedVoidFraction/dividedVoidFraction.H | 3 + .../dividedVoidFractionMS.C | 223 ++++++++++++++ .../dividedVoidFractionMS.H | 106 +++++++ .../twoSpheresGlowinskiMPI/parCFDDEMrun.sh | 4 +- .../CFD/constant/couplingProperties | 5 +- .../ErgunTestMPI/CFD/system/controlDict | 2 +- .../ErgunTestMPI/parCFDDEMrun.sh | 4 +- .../ErgunTestMPI_restart/Allrun.sh | 2 + .../ErgunTestMPI_restart/DEM/post/dummy | 2 + .../ErgunTestMPI_restart/parCFDDEMrun.sh | 2 +- .../settlingTestMPI/parCFDDEMrun.sh | 4 +- .../cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh | 62 ++++ .../cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl | 41 +++ .../cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U | 72 +++++ .../cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us | 45 +++ .../ErgunTestMPI/CFD/0/epsilon | 48 +++ .../cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k | 45 +++ .../cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut | 45 +++ .../cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p | 43 +++ .../cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho | 39 +++ .../ErgunTestMPI/CFD/0/voidfraction | 41 +++ .../ErgunTestMPI/CFD/constant/RASProperties | 25 ++ .../CFD/constant/couplingProperties | 177 ++++++++++++ .../ErgunTestMPI/CFD/constant/g | 22 ++ .../CFD/constant/liggghtsCommands | 31 ++ .../CFD/constant/polyMesh/blockMeshDict | 154 ++++++++++ .../CFD/constant/transportProperties | 37 +++ .../CFD/constant/turbulenceProperties | 21 ++ .../ErgunTestMPI/CFD/octave/clumpProperties.m | 29 ++ .../ErgunTestMPI/CFD/octave/loaddata.m | 69 +++++ .../CFD/octave/totalPressureDrop.m | 104 +++++++ .../ErgunTestMPI/CFD/steps_0p1s | 28 ++ .../ErgunTestMPI/CFD/system/controlDict | 117 ++++++++ .../ErgunTestMPI/CFD/system/controlDict.foam | 117 ++++++++ .../ErgunTestMPI/CFD/system/decomposeParDict | 86 ++++++ .../CFD/system/funkySetFieldsDict | 33 +++ .../ErgunTestMPI/CFD/system/fvSchemes | 76 +++++ .../ErgunTestMPI/CFD/system/fvSolution | 86 ++++++ .../ErgunTestMPI/DEM/in.liggghts_init | 74 +++++ .../ErgunTestMPI/DEM/liggghts.restart | Bin 0 -> 1110 bytes .../ErgunTestMPI/DEM/post/dummy | 4 + .../ErgunTestMPI/DEM/sphere10.multisphere | 10 + .../ErgunTestMPI/parCFDDEMrun.sh | 68 +++++ .../packedBedTemp/parCFDDEMrun.sh | 4 +- 79 files changed, 3796 insertions(+), 153 deletions(-) delete mode 100644 README create mode 100644 applications/solvers/cfdemSolverPisoMS/Make/files create mode 100644 applications/solvers/cfdemSolverPisoMS/Make/options create mode 100644 applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C create mode 100644 src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C create mode 100644 src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.H create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.C create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.H create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/newForceModelMS.C create mode 100644 src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.C create mode 100644 src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.H create mode 100755 tutorials/cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/epsilon create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/voidfraction create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/RASProperties create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/g create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/liggghtsCommands create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/polyMesh/blockMeshDict create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/transportProperties create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/turbulenceProperties create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/clumpProperties.m create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/loaddata.m create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/steps_0p1s create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict.foam create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/decomposeParDict create mode 100755 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/funkySetFieldsDict create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSchemes create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSolution create mode 100755 tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/liggghts.restart create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/post/dummy create mode 100755 tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/sphere10.multisphere create mode 100644 tutorials/cfdemSolverPisoMS/ErgunTestMPI/parCFDDEMrun.sh diff --git a/README b/README deleted file mode 100644 index a677e0a8..00000000 --- a/README +++ /dev/null @@ -1,82 +0,0 @@ -/*---------------------------------------------------------------------------*\ - 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. 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 -standard CFD solvers of OpenFOAM(R)(*) to include a coupling to the DEM -code LIGGGHTS. 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. - -The coupled solvers run fully parallel on distributed-memory clusters. - -Features are: - -- its modular approach allows users to easily implement new models -- its MPI parallelization enables to use it for large scale problems -- the "forum"_lws on CFD-DEM gives the possibility to exchange with other - users / developers -- the use of GIT allows to easily update to the latest version -- basic documentation is provided - -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 -- "tutorials" directory including basic tutorial cases showing the functionality - - - -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) - -Discrete Element Method (DEM) coupling. - -CFDEMcoupling is an open-source code, distributed freely under the terms of the -GNU Public License (GPL). - -Core development of CFDEMcoupling is done by -Christoph Goniva and Christoph Kloss, both at DCS Computing GmbH, 2012 - - -\*---------------------------------------------------------------------------*/ -(*) "OpenFOAM(R)"_of is a registered trade mark of Silicon Graphics -International Corp. This offering is not affiliated, approved or endorsed by -Silicon Graphics International Corp., the producer of the OpenFOAM(R) software -and owner of the OpenFOAM(R) trademark. -\*---------------------------------------------------------------------------*/ diff --git a/applications/solvers/cfdemSolverIB/cfdemSolverIB.C b/applications/solvers/cfdemSolverIB/cfdemSolverIB.C index 912cb6c8..f61f03dd 100755 --- a/applications/solvers/cfdemSolverIB/cfdemSolverIB.C +++ b/applications/solvers/cfdemSolverIB/cfdemSolverIB.C @@ -93,7 +93,7 @@ int main(int argc, char *argv[]) fvVectorMatrix UEqn ( - fvm::ddt(U) + fvm::ddt(voidfraction,U) + fvm::div(phi, U) + turbulence->divDevReff(U) ); @@ -123,7 +123,7 @@ int main(int argc, char *argv[]) fvScalarMatrix pEqn ( - fvm::laplacian(rUA, p) == fvc::div(phi) + fvm::laplacian(rUA, p) == fvc::div(phi) + fvc::ddt(voidfraction) ); pEqn.setReference(pRefCell, pRefValue); @@ -157,7 +157,8 @@ int main(int argc, char *argv[]) turbulence->correct(); Info << "particleCloud.calcVelocityCorrection() " << endl; - particleCloud.calcVelocityCorrection(p,U,phiIB); + volScalarField voidfractionNext=mesh.lookupObject("voidfractionNext"); + particleCloud.calcVelocityCorrection(p,U,phiIB,voidfractionNext); runTime.write(); diff --git a/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C b/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C index 352236d7..c14cba22 100644 --- a/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C +++ b/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C @@ -80,7 +80,7 @@ int main(int argc, char *argv[]) #include "solverDebugInfo.H" particleCloud.clockM().stop("Coupling"); - particleCloud.clockM().start(10,"Flow"); + particleCloud.clockM().start(16,"Flow"); // Pressure-velocity PISO corrector { // Momentum predictor @@ -94,16 +94,15 @@ int main(int argc, char *argv[]) - fvm::Sp(Ksl/rho,U) ); + if (modelType=="B") + UEqn == - fvc::grad(p) + Ksl/rho*Us; + else + UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us; + UEqn.relax(); if (momentumPredictor) - { - //solve UEqn - if (modelType=="B") - solve(UEqn == - fvc::grad(p) + Ksl/rho*Us); - else - solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us); - } + solve(UEqn); // --- PISO loop @@ -114,15 +113,15 @@ int main(int argc, char *argv[]) { volScalarField rUA = 1.0/UEqn.A(); surfaceScalarField rUAf("(1|A(U))", fvc::interpolate(rUA)); + volScalarField rUAvoidfraction("(voidfraction2|A(U))",rUA*voidfraction); U = rUA*UEqn.H(); - phi = fvc::interpolate(U*voidfraction) & mesh.Sf(); - //+ fvc::ddtPhiCorr(rUA, U, phi) + phi = ( fvc::interpolate(U*voidfraction) & mesh.Sf() ) + + fvc::ddtPhiCorr(rUAvoidfraction, U, phi); surfaceScalarField phiS(fvc::interpolate(Us*voidfraction) & mesh.Sf()); surfaceScalarField phiGes = phi + rUAf*(fvc::interpolate(Ksl/rho) * phiS); - volScalarField rUAvoidfraction("(voidfraction2|A(U))",rUA*voidfraction); if (modelType=="A") rUAvoidfraction = volScalarField("(voidfraction2|A(U))",rUA*voidfraction*voidfraction); @@ -156,7 +155,7 @@ int main(int argc, char *argv[]) } // end non-orthogonal corrector loop - #include "continuityErrs.H" + #include "continuityErrorPhiPU.H" if (modelType=="B") U -= rUA*fvc::grad(p) - Ksl/rho*Us*rUA; diff --git a/applications/solvers/cfdemSolverPisoMS/Make/files b/applications/solvers/cfdemSolverPisoMS/Make/files new file mode 100644 index 00000000..3d58796c --- /dev/null +++ b/applications/solvers/cfdemSolverPisoMS/Make/files @@ -0,0 +1,3 @@ +cfdemSolverPisoMS.C + +EXE=$(FOAM_USER_APPBIN)/cfdemSolverPisoMS diff --git a/applications/solvers/cfdemSolverPisoMS/Make/options b/applications/solvers/cfdemSolverPisoMS/Make/options new file mode 100644 index 00000000..17268a09 --- /dev/null +++ b/applications/solvers/cfdemSolverPisoMS/Make/options @@ -0,0 +1,16 @@ +EXE_INC = \ + -I$(CFDEM_SRC_DIR)/lnInclude \ + -I ../cfdemSolverPiso \ + -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \ + -I$(LIB_SRC)/transportModels \ + -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(CFDEM_SRC_DIR)/cfdTools \ + +EXE_LIBS = \ + -L$(FOAM_USER_LIBBIN)\ + -lincompressibleRASModels \ + -lincompressibleLESModels \ + -lincompressibleTransportModels \ + -lfiniteVolume \ + -l$(CFDEM_LIB_NAME) diff --git a/applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C b/applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C new file mode 100644 index 00000000..65eeb8f3 --- /dev/null +++ b/applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C @@ -0,0 +1,191 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright (C) 1991-2009 OpenCFD Ltd. + Copyright (C) 2009-2012 JKU, Linz + Copyright (C) 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, see . + +Application + cfdemSolverPisoMS + +Description + Transient solver for incompressible flow. + Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected. + The code is an evolution of the solver pisoFoam in OpenFOAM(R) 1.6, + where additional functionality for CFD-DEM coupling is added. +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "singlePhaseTransportModel.H" +#include "turbulenceModel.H" + +#include "cfdemCloudMS.H" +#include "implicitCouple.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + #include "setRootCase.H" + #include "createTime.H" + #include "createMesh.H" + #include "createFields.H" + + #include "initContinuityErrs.H" + + // create cfdemCloud + #include "readGravitationalAcceleration.H" + cfdemCloudMS particleCloud(mesh); + + #include "checkModelType.H" + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info<< "\nStarting time loop\n" << endl; + + while (runTime.loop()) + { + Info<< "Time = " << runTime.timeName() << nl << endl; + + #include "readPISOControls.H" + #include "CourantNo.H" + + // do particle stuff + Info << "- evolve()" << endl; + particleCloud.evolve(voidfraction,Us,U); + + Info << "update Ksl.internalField()" << endl; + Ksl.internalField() = particleCloud.momCoupleM(0).impMomSource(); + Ksl.correctBoundaryConditions(); + + // debug info + //Info << "totaldragforceEuler calculus" << endl; + //vector totaldragforceEuler(0,0,0); + //forAll(Ksl,cellI) + //{ + // totaldragforceEuler += Ksl[cellI]*(Us[cellI]-U[cellI])/rho[cellI] * Ksl.mesh().V()[cellI]; + //} + //Pout <<"totaldragforceEuler = "<< mag(totaldragforceEuler) << endl; + //Pout << "dv/dt =" << sum(fvc::ddt(voidfraction)) << endl; + //----------- + + // Pressure-velocity PISO corrector + { + // Momentum predictor + fvVectorMatrix UEqn + ( + fvm::ddt(voidfraction,U) + + fvm::div(phi, U) +// + turbulence->divDevReff(U) + + particleCloud.divVoidfractionTau(U, voidfraction) + == + - fvm::Sp(Ksl/rho,U) + ); + + UEqn.relax(); + + if (momentumPredictor) + { + //solve UEqn + if (modelType=="B") + solve(UEqn == - fvc::grad(p) + Ksl/rho*Us); + else + solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us); + } + + // --- PISO loop + + //for (int corr=0; corrcorrect(); + + runTime.write(); + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C b/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C index 86656e0c..2fdd14c5 100644 --- a/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C +++ b/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C @@ -126,14 +126,14 @@ int main(int argc, char *argv[]) { volScalarField rUA = 1.0/UEqn.A(); surfaceScalarField rUAf("(1|A(U))", fvc::interpolate(rUA)); + volScalarField rUAvoidfraction("(voidfraction2|A(U))",rUA*voidfraction); U = rUA*UEqn.H(); - phi = fvc::interpolate(U*voidfraction) & mesh.Sf(); - //+ fvc::ddtPhiCorr(rUA, U, phi) + phi = ( fvc::interpolate(U*voidfraction) & mesh.Sf() ) + + fvc::ddtPhiCorr(rUAvoidfraction, U, phi); surfaceScalarField phiS(fvc::interpolate(Us*voidfraction) & mesh.Sf()); surfaceScalarField phiGes = phi + rUAf*(fvc::interpolate(Ksl/rho) * phiS); - volScalarField rUAvoidfraction("(voidfraction2|A(U))",rUA*voidfraction); if (modelType=="A") rUAvoidfraction = volScalarField("(voidfraction2|A(U))",rUA*voidfraction*voidfraction); @@ -167,7 +167,7 @@ int main(int argc, char *argv[]) } // end non-orthogonal corrector loop - #include "continuityErrs.H" + #include "continuityErrorPhiPU.H" if (modelType=="B") U -= rUA*fvc::grad(p) - Ksl/rho*Us*rUA; diff --git a/doc/CFDEMcoupling_Manual.html b/doc/CFDEMcoupling_Manual.html index 148ce0c3..19e9fc60 100644 --- a/doc/CFDEMcoupling_Manual.html +++ b/doc/CFDEMcoupling_Manual.html @@ -162,6 +162,21 @@ In order to get the latest code version, please use the git repository at http:/

Reasonable example settings for the "couplingProperties" dictionary are given in the tutorial cases.

+
modelType 
+
+

"modelType" refers to the formulation of the equations to be solved. Choose "A" or "B", according to Zhou et al. (2010): "Discrete particle simulation of particle-fluid flow: model formulations and their appliccability", JFM. "A" requres the use of the force models gradPForce and viscForce, whereas "B" requires the force model "Archimedes". +

+
couplingInterval 
+
+

The coupling interval determines the time passing between two CFD-DEM data exchanges. +

+

A useful procedure would be: +1) Set the DEM TS in the in.xxx according to the needs of the pure DEM problem. +2) Set the "couplingInterval", which refers to the DEM timesteps. Depending on the problem you will need to have a close (small couplingInterval) or loose coupling. +3) Choose the CFD timestep in the controlDict. it must be equal or smaller than the coupling time, otherwise you will get the error: "Error - TS bigger than coupling interval!". +

+

Example: DEMts=0.00001s, couplingInterval=10 exchange data (=couple) will happen every 0.0001s. +


1.5 "liggghtsCommands" dictionary diff --git a/doc/CFDEMcoupling_Manual.pdf b/doc/CFDEMcoupling_Manual.pdf index 351b314faabe0402376c82961341ef92258f84bf..aaa1d0ac59943e92a08fe39af6916a2308d1487c 100644 GIT binary patch delta 41465 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 = name of the finite volume voidfraction field -
  • interpolation = flag to use interolate interpolated voidfraction and fluid velocity values (normally off) +
  • interpolation = flag to use interpolated voidfraction and fluid velocity values (normally off) diff --git a/doc/forceModel_KochHillDrag.txt b/doc/forceModel_KochHillDrag.txt index 39e88529..fb67f9f7 100644 --- a/doc/forceModel_KochHillDrag.txt +++ b/doc/forceModel_KochHillDrag.txt @@ -26,7 +26,7 @@ KochHillDragProps {U} = name of the finite volume fluid velocity field :ulb,l {density} = name of the finite volume gravity field :l {voidfraction} = name of the finite volume voidfraction field :l -{interpolation} = flag to use interolate interpolated voidfraction and fluid velocity values (normally off) :l +{interpolation} = flag to use interpolated voidfraction and fluid velocity values (normally off) :l :ule [Examples:] diff --git a/doc/githubAccess_public.pdf b/doc/githubAccess_public.pdf index 47c73839a7b12f2972a84f4857be18667a5d3e1d..4b0b8cc69669e4fad29cf758bb6307456c107176 100644 GIT binary patch delta 109 zcmZqc7HjJko6yE-XkcV)Xkct++}PjR&)C|})Y{M7+Rw7JpLJ%7lSzu9d6HRLYO;}0 inxUDIL9#(ol9{E2v5ApIs!^J`g`Eu{71Og?S!DoRHXw`u delta 109 zcmZqc7HjJko6yE-U}0crXkut$)Y#wJ&)C|})Y{M7+Rw7JpLJ%7lR=VsQmUDGqM>P0 iib0x%iKUsjk%5V!c~YWDl6h*Xv7HSe71Og?S!DoX7$D#P diff --git a/doc/voidFractionModel_dividedVoidFraction.html b/doc/voidFractionModel_dividedVoidFraction.html index 9b019a9e..a07c2403 100644 --- a/doc/voidFractionModel_dividedVoidFraction.html +++ b/doc/voidFractionModel_dividedVoidFraction.html @@ -18,12 +18,15 @@ dividedProps { alphaMin number1; scaleUpVol number2; + interpolation; }
    • number1 = mininmum limit for voidfraction
    • number2 = diameter of the particle's representation is artificially increased according to number2 * Vparticle, volume remains unaltered! +
    • interpolation = flag to interpolate voidfraction to particle positions (normally off) +

    Examples: diff --git a/doc/voidFractionModel_dividedVoidFraction.txt b/doc/voidFractionModel_dividedVoidFraction.txt index f3b56050..4c59e90d 100644 --- a/doc/voidFractionModel_dividedVoidFraction.txt +++ b/doc/voidFractionModel_dividedVoidFraction.txt @@ -16,10 +16,12 @@ dividedProps \{ alphaMin number1; scaleUpVol number2; + interpolation; \} :pre {number1} = mininmum limit for voidfraction :ulb,l {number2} = diameter of the particle's representation is artificially increased according to {number2} * Vparticle, volume remains unaltered! :l +{interpolation} = flag to interpolate voidfraction to particle positions (normally off) :l :ule [Examples:] diff --git a/src/lagrangian/cfdemParticle/Make/files b/src/lagrangian/cfdemParticle/Make/files index 4188c2c5..94a1da27 100644 --- a/src/lagrangian/cfdemParticle/Make/files +++ b/src/lagrangian/cfdemParticle/Make/files @@ -1,5 +1,6 @@ cfdemCloud = cfdemCloud forceModels = subModels/forceModel +forceModelsMS = subModels/forceModelMS IOModels = subModels/IOModel voidFractionModels = subModels/voidFractionModel locateModels = subModels/locateModel @@ -13,34 +14,56 @@ liggghtsCommandModels = subModels/liggghtsCommandModel $(cfdemCloud)/cfdemCloud.C derived/cfdemCloudIB/cfdemCloudIB.C +derived/cfdemCloudMS/cfdemCloudMS.C $(forceModels)/forceModel/forceModel.C $(forceModels)/forceModel/newForceModel.C $(forceModels)/noDrag/noDrag.C $(forceModels)/DiFeliceDrag/DiFeliceDrag.C +$(forceModels)/DiFeliceDragNLift/DiFeliceDragNLift.C $(forceModels)/GidaspowDrag/GidaspowDrag.C $(forceModels)/SchillerNaumannDrag/SchillerNaumannDrag.C $(forceModels)/Archimedes/Archimedes.C $(forceModels)/ArchimedesIB/ArchimedesIB.C $(forceModels)/interface/interface.C $(forceModels)/ShirgaonkarIB/ShirgaonkarIB.C +$(forceModels)/fieldTimeAverage/fieldTimeAverage.C +$(forceModels)/fieldBound/fieldBound.C +$(forceModels)/volWeightedAverage/volWeightedAverage.C +$(forceModels)/totalMomentumExchange/totalMomentumExchange.C $(forceModels)/KochHillDrag/KochHillDrag.C +$(forceModels)/BeetstraDrag/multiphaseFlowBasic/multiphaseFlowBasic.C +$(forceModels)/BeetstraDrag/BeetstraDrag.C +$(forceModels)/LaEuScalarLiquid/LaEuScalarLiquid.C $(forceModels)/LaEuScalarTemp/LaEuScalarTemp.C +$(forceModels)/LaEuScalarDust/LaEuScalarDust.C $(forceModels)/virtualMassForce/virtualMassForce.C $(forceModels)/gradPForce/gradPForce.C +$(forceModels)/gradULiftForce/gradULiftForce.C $(forceModels)/viscForce/viscForce.C $(forceModels)/MeiLift/MeiLift.C +$(forceModels)/KochHillDragNLift/KochHillDragNLift.C +$(forceModels)/solidsPressureForce/solidsPressureForce.C +$(forceModels)/periodicPressure/periodicPressure.C +$(forceModels)/periodicPressureControl/periodicPressureControl.C +$(forceModels)/averageSlipVel/averageSlipVel.C + +$(forceModelsMS)/forceModelMS/forceModelMS.C +$(forceModelsMS)/forceModelMS/newForceModelMS.C +$(forceModelsMS)/DiFeliceDragMS/DiFeliceDragMS.C $(IOModels)/IOModel/IOModel.C $(IOModels)/IOModel/newIOModel.C $(IOModels)/noIO/noIO.C $(IOModels)/basicIO/basicIO.C $(IOModels)/trackIO/trackIO.C +$(IOModels)/sophIO/sophIO.C $(voidFractionModels)/voidFractionModel/voidFractionModel.C $(voidFractionModels)/voidFractionModel/newVoidFractionModel.C $(voidFractionModels)/centreVoidFraction/centreVoidFraction.C $(voidFractionModels)/dividedVoidFraction/dividedVoidFraction.C +$(voidFractionModels)/dividedVoidFractionMS/dividedVoidFractionMS.C $(voidFractionModels)/bigParticleVoidFraction/bigParticleVoidFraction.C $(voidFractionModels)/GaussVoidFraction/GaussVoidFraction.C $(voidFractionModels)/IBVoidFraction/IBVoidFraction.C @@ -52,20 +75,22 @@ $(locateModels)/engineSearch/engineSearch.C $(locateModels)/turboEngineSearch/turboEngineSearch.C $(locateModels)/engineSearchIB/engineSearchIB.C - $(meshMotionModels)/meshMotionModel/meshMotionModel.C $(meshMotionModels)/meshMotionModel/newMeshMotionModel.C $(meshMotionModels)/noMeshMotion/noMeshMotion.C +$(meshMotionModels)/DEMdrivenMeshMotion/DEMdrivenMeshMotion.C $(momCoupleModels)/momCoupleModel/momCoupleModel.C $(momCoupleModels)/momCoupleModel/newMomCoupleModel.C $(momCoupleModels)/explicitCouple/explicitCouple.C +$(momCoupleModels)/explicitCoupleSource/explicitCoupleSource.C $(momCoupleModels)/implicitCouple/implicitCouple.C $(momCoupleModels)/noCouple/noCouple.C $(regionModels)/regionModel/regionModel.C $(regionModels)/regionModel/newRegionModel.C $(regionModels)/allRegion/allRegion.C +$(regionModels)/differentialRegion/differentialRegion.C $(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C $(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C diff --git a/src/lagrangian/cfdemParticle/Make/options b/src/lagrangian/cfdemParticle/Make/options index 61f61a93..e24e4695 100644 --- a/src/lagrangian/cfdemParticle/Make/options +++ b/src/lagrangian/cfdemParticle/Make/options @@ -24,4 +24,4 @@ LIB_LIBS = \ -llagrangian \ -lmpi_cxx \ -L$(CFDEM_LIGGGHTS_SRC_DIR) \ - -l$(CFDEM_LIGGGHTS_LIB_NAME) \ + -l$(CFDEM_LIGGGHTS_LIB_NAME) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index cfd72e07..52f22f9f 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -372,34 +372,41 @@ bool Foam::cfdemCloud::evolve Info << "\n Coupling..." << endl; doCouple=true; + clockM().start(5,"defineRegion"); if(verbose_) Info << "- defineRegion()" << endl; regionM().defineRegion(); if(verbose_) Info << "defineRegion done." << endl; + clockM().stop("defineRegion"); // reset vol Fields + clockM().start(6,"resetVolFields"); if(verbose_) Info << "- resetVolFields()" << endl; regionM().resetVolFields(Us); if(verbose_) Info << "resetVolFields done." << endl; + clockM().stop("resetVolFields"); if(verbose_) Info << "- getDEMdata()" << endl; - clockM().start(4,"getDEMdata"); + clockM().start(7,"getDEMdata"); getDEMdata(); - clockM().stop(); + clockM().stop("getDEMdata"); if(verbose_) Info << "- getDEMdata done." << endl; // search cellID of particles - clockM().start(5,"findCell"); + clockM().start(8,"findCell"); if(verbose_) Info << "- findCell()" << endl; findCells(); if(verbose_) Info << "findCell done." << endl; clockM().stop("findCell"); // set void fraction field + clockM().start(9,"setvoidFraction"); if(verbose_) Info << "- setvoidFraction()" << endl; voidFractionM().setvoidFraction(regionM().inRegion(),voidfractions_,particleWeights_,particleVolumes_); if(verbose_) Info << "setvoidFraction done." << endl; + clockM().stop("setvoidFraction"); // set particles velocity field + clockM().start(10,"setVectorAverage"); if(verbose_) Info << "- setVectorAverage(Us,velocities_,weights_)" << endl; averagingM().setVectorAverage ( @@ -410,15 +417,18 @@ bool Foam::cfdemCloud::evolve regionM().inRegion() ); if(verbose_) Info << "setVectorAverage done." << endl; + clockM().stop("setVectorAverage"); // set particles forces + clockM().start(11,"setForce"); if(verbose_) Info << "- setForce(forces_)" << endl; setForces(); if(verbose_) Info << "setForce done." << endl; + clockM().stop("setForce"); // get next force field + clockM().start(12,"setParticleForceField"); if(verbose_) Info << "- setParticleForceField()" << endl; - averagingM().setVectorSum ( forceM(0).impParticleForces(), @@ -433,12 +443,12 @@ bool Foam::cfdemCloud::evolve particleWeights_, regionM().inRegion() ); - if(verbose_) Info << "- setParticleForceField done." << endl; + clockM().stop("setParticleForceField"); // write DEM data if(verbose_) Info << " -giveDEMdata()" << endl; - clockM().start(6,"giveDEMdata"); + clockM().start(13,"giveDEMdata"); giveDEMdata(); clockM().stop("giveDEMdata"); @@ -450,6 +460,7 @@ bool Foam::cfdemCloud::evolve }//end dataExchangeM().couple() Info << "\n timeStepFraction() = " << dataExchangeM().timeStepFraction() << endl; + clockM().start(14,"interpolateEulerFields"); // update voidFractionField alpha.internalField() = voidFractionM().voidFractionInterp(); alpha.correctBoundaryConditions(); @@ -457,12 +468,16 @@ bool Foam::cfdemCloud::evolve // update particle velocity Field Us.internalField() = averagingM().UsInterp(); Us.correctBoundaryConditions(); + clockM().stop("interpolateEulerFields"); if(verbose_){ #include "debugInfo.H" } + + clockM().start(15,"dumpDEMdata"); // do particle IO IOM().dumpDEMdata(); + clockM().stop("dumpDEMdata"); }//end ignore return doCouple; diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C index c4ef7b98..cf854805 100644 --- a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C @@ -141,7 +141,8 @@ void Foam::cfdemCloudIB::calcVelocityCorrection ( volScalarField& p, volVectorField& U, - volScalarField& phiIB + volScalarField& phiIB, + volScalarField& voidfraction ) { label cellI=0; @@ -174,7 +175,7 @@ void Foam::cfdemCloudIB::calcVelocityCorrection } // make field divergence free - solve(fvm::laplacian(phiIB) == fvc::div(U)); + solve(fvm::laplacian(phiIB) == fvc::div(U) + fvc::ddt(voidfraction)); U=U-fvc::grad(phiIB); U.correctBoundaryConditions(); diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H index 099f2fcd..46d4ad7f 100644 --- a/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H @@ -82,7 +82,7 @@ public: bool evolve(); - void calcVelocityCorrection(volScalarField&,volVectorField&,volScalarField&); // this could be moved to an IB mom couple model + void calcVelocityCorrection(volScalarField&,volVectorField&,volScalarField&,volScalarField&); // this could be moved to an IB mom couple model // Access vector angularVelocity(int); diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C b/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C new file mode 100644 index 00000000..1c42284c --- /dev/null +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C @@ -0,0 +1,273 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "cfdemCloudMS.H" +#include "voidFractionModel.H" +#include "forceModelMS.H" +#include "regionModel.H" +#include "locateModel.H" +#include "dataExchangeModel.H" + +//#include "mpi.h" // only for debug reason +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +cfdemCloudMS::cfdemCloudMS +( + const fvMesh& mesh +) +: + cfdemCloud(mesh), + positionsCM_(NULL), + velocitiesCM_(NULL), + cellIDsCM_(NULL), + bodies_(NULL), + nrigids_(NULL), + exCM_(NULL), + eyCM_(NULL), + ezCM_(NULL), + VclumpCM_(NULL), + SclumpCM_(NULL), + scalingCM_(NULL), + typeCM_(NULL), + Cclump_ex_(NULL), + Cclump_ey_(NULL), + impForcesCM_(NULL), + expForcesCM_(NULL), + DEMForcesCM_(NULL), + numberOfClumps_(-1), + numberOfClumpsChanged_(false), + forceModels_(couplingProperties_.lookup("forceModelsMS")) +{ + forceModel_ = new autoPtr[nrForceModels()]; + for (int i=0;i* forceModel_; + +// Private member functions + void getDEMdata(); + void giveDEMdata(); + bool reAllocArrays() const; + void setNumberOfParticles(int); + void findCells(); + void setForces(); + +public: + + // Constructors + + //- Construct from components + cfdemCloudMS + ( + const fvMesh& mesh + ); + + // Destructor + + virtual ~cfdemCloudMS(); + + + // Member Functions + // Access + + vector positionCM(int); + + vector velocityCM(int); + + label cellIDCM(int); + + label body(int); + + label nrigid(int); + + inline double **& positionsCM() const; + + inline double **& velocitiesCM() const; + + inline double **& impForcesCM() const; + + inline double **& expForcesCM() const; + + inline double **& DEMForcesCM() const; + + inline int numberOfClumps() const; + + inline bool numberOfClumpsChanged() const; + + const forceModel& forceM(int); + + int nrForceModels(); + + bool evolve(volScalarField&,volVectorField&,volVectorField&); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "cfdemCloudMSI.H" + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/etc/bashrc b/src/lagrangian/cfdemParticle/etc/bashrc index c3924c69..5a808aeb 100755 --- a/src/lagrangian/cfdemParticle/etc/bashrc +++ b/src/lagrangian/cfdemParticle/etc/bashrc @@ -46,6 +46,19 @@ export CFDEM_LIB_NAME=lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION #- path to test harness export CFDEM_TEST_HARNESS_PATH=$CFDEM_PROJECT_USER_DIR/log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION +#------------------------------------------------------------------------------ +#- settings for lpp postproc tool +#------------------------------------------------------------------------------ + +#- nr of procs for lpp tool +export CFDEM_LPP_NPROCS=1 + +#- nr of procs for lpp tool +export CFDEM_LPP_CHUNKSIZE=1 + +#- shortcut to run lpp +alias lpp='python -i $CFDEM_LPP_DIR/lpp.py --cpunum $CFDEM_LPP_NPROCS --chunksize $CFDEM_LPP_CHUNKSIZE' + #------------------------------------------------------------------------------ #- aliases for easy navigation (no changes necessary) #------------------------------------------------------------------------------ @@ -96,9 +109,6 @@ export -f cfdemLiggghts cfdemLiggghtsPar() { mpirun -np $2 $CFDEM_LIGGGHTS_SRC_DIR/lmp_$CFDEM_LIGGGHTS_MAKEFILE_NAME < $1; } export -f cfdemLiggghtsPar -#- shortcut to run lpp -alias lpp='python -i $CFDEM_LPP_DIR/lpp.py' - # check if the directory exists if [ -d "$CFDEM_PROJECT_USER_DIR" ]; then : diff --git a/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh b/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh index 4ad12e71..92bee98c 100755 --- a/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh +++ b/src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh @@ -25,6 +25,7 @@ checkDirComment "$CFDEM_LIGGGHTS_SRC_DIR" '$CFDEM_LIGGGHTS_SRC_DIR' "yes" checkDirComment "$CFDEM_PROJECT_DIR" '$CFDEM_PROJECT_DIR' "yes" checkDirComment "$CFDEM_PROJECT_USER_DIR" '$CFDEM_PROJECT_USER_DIR' "no" checkDirComment "$CFDEM_SRC_DIR" '$CFDEM_SRC_DIR' "yes" +checkDirComment "$CFDEM_LIGGGHTS_SRC_DIR" '$CFDEM_LIGGGHTS_SRC_DIR' "yes" checkDirComment "$CFDEM_LPP_DIR" '$CFDEM_LPP_DIR' "yes" checkDirComment "$CFDEM_PIZZA_DIR" '$CFDEM_PIZZA_DIR' "no" checkDirComment "$CFDEM_TEST_HARNESS_PATH" '$CFDEM_TEST_HARNESS_PATH' "no" diff --git a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh index ce63ff43..30e6e775 100755 --- a/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh +++ b/src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh @@ -26,8 +26,9 @@ logpath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")/$logDir" logfileName="log_compileCFDEMcoupling_src" #alternative: logfileName="log_compileLIGGGHTS_$NOW" casePath="$CFDEM_SRC_DIR" headerText="$logfileName""-$NOW" +#doClean="$1" # "" | "noClean" #--------------------------------------------------------------------------------# -compileLib $logpath $logfileName $casePath $headerText +compileLib $logpath $logfileName $casePath $headerText #$doClean #================================================================================# # compile solvers @@ -42,7 +43,7 @@ do casePath="$CFDEM_SOLVER_DIR/$solverName" headerText="$logfileName""_$solverName""-$NOW" #--------------------------------------------------------------------------------# - compileSolver $logpath $logfileName $casePath $headerText + compileSolver $logpath $logfileName $casePath $headerText #$doClean done echo "Note: the list of solvers compiled might be incomplete." diff --git a/src/lagrangian/cfdemParticle/etc/cshrc b/src/lagrangian/cfdemParticle/etc/cshrc index a1eb980f..6af88645 100755 --- a/src/lagrangian/cfdemParticle/etc/cshrc +++ b/src/lagrangian/cfdemParticle/etc/cshrc @@ -46,6 +46,19 @@ setenv CFDEM_LIB_NAME lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION #- path to test harness setenv CFDEM_TEST_HARNESS_PATH $CFDEM_PROJECT_USER_DIR/log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION +#------------------------------------------------------------------------------ +#- settings for lpp postproc tool +#------------------------------------------------------------------------------ + +#- nr of procs for lpp tool +setenv CFDEM_LPP_NPROCS 4 + +#- nr of procs for lpp tool +setenv CFDEM_LPP_CHUNKSIZE 1 + +#- shortcut to run lpp +alias lpp 'python -i $CFDEM_LPP_DIR/lpp.py --cpunum $CFDEM_LPP_NPROCS --chunksize $CFDEM_LPP_CHUNKSIZE \!:1' + #------------------------------------------------------------------------------ #- aliases for easy navigation (no changes necessary) #------------------------------------------------------------------------------ diff --git a/src/lagrangian/cfdemParticle/etc/functions.sh b/src/lagrangian/cfdemParticle/etc/functions.sh index 1801478c..57df6e6b 100755 --- a/src/lagrangian/cfdemParticle/etc/functions.sh +++ b/src/lagrangian/cfdemParticle/etc/functions.sh @@ -18,6 +18,7 @@ compileLib() logfileName="$2" casePath="$3" headerText="$4" + #doClean="$5" #--------------------------------------------------------------------------------# #- clean up old log file @@ -36,8 +37,10 @@ compileLib() echo 2>&1 | tee -a $logpath/$logfileName #- wclean and wmake - rmdepall 2>&1 | tee -a $logpath/$logfileName - wclean 2>&1 | tee -a $logpath/$logfileName + #if [ $doClean != "noClean" ]; then + rmdepall 2>&1 | tee -a $logpath/$logfileName + wclean 2>&1 | tee -a $logpath/$logfileName + #fi wmake libso 2>&1 | tee -a $logpath/$logfileName #- keep terminal open @@ -56,6 +59,7 @@ compileSolver() logfileName="$2" casePath="$3" headerText="$4" + #doClean="$5" #--------------------------------------------------------------------------------# #- clean up old log file @@ -74,8 +78,10 @@ compileSolver() echo 2>&1 | tee -a $logpath/$logfileName #- wclean and wmake - rmdepall 2>&1 | tee -a $logpath/$logfileName - wclean 2>&1 | tee -a $logpath/$logfileName + #if [ $doClean != "noClean" ]; then + rmdepall 2>&1 | tee -a $logpath/$logfileName + wclean 2>&1 | tee -a $logpath/$logfileName + #fi wmake 2>&1 | tee -a $logpath/$logfileName #- keep terminal open @@ -118,6 +124,47 @@ compileLIGGGHTS() } #==================================# +#==================================# +#- function to compile a lammps lib + +compileLMPlib() +{ + #--------------------------------------------------------------------------------# + #- define variables + logpath="$1" + logfileName="$2" + headerText="$3" + makeFileName="$4" + libraryPath="$5" + #--------------------------------------------------------------------------------# + + #- clean up old log file + rm $logpath/$logfileName + + #- change path + cd $libraryPath + + #- header + echo 2>&1 | tee -a $logpath/$logfileName + echo "// $headerText //" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- write path + pwd 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- clean up + echo "make clean" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + make -f $makeFileName clean 2>&1 | tee -a $logpath/$logfileName + + #- compile + echo "make" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + make -f $makeFileName 2>&1 | tee -a $logpath/$logfileName +} +#==================================# + #==================================# #- function to run a DEM case @@ -156,6 +203,50 @@ DEMrun() } #==================================# +#==================================# +#- function to run a DEM case in parallel + +parDEMrun() +{ + #--------------------------------------------------------------------------------# + #- define variables + logpath="$1" + logfileName="$2" + casePath="$3" + headerText="$4" + solverName="$5" + nrProcs="$6" + machineFileName="$7" + debugMode="$8" + #--------------------------------------------------------------------------------# + + #- clean up old log file + rm $logpath/$logfileName + + #- change path + cd $casePath/DEM + + #- header + echo 2>&1 | tee -a $logpath/$logfileName + echo "// $headerText //" 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- write path + pwd 2>&1 | tee -a $logpath/$logfileName + echo 2>&1 | tee -a $logpath/$logfileName + + #- run applictaion + if [ $machineFileName == "none" ]; then + mpirun -np $nrProcs $debugMode $CFDEM_LIGGGHTS_SRC_DIR/$CFDEM_LIGGGHTS_LIB_NAME < $solverName 2>&1 | tee -a $logpath/$logfileName + else + mpirun -machinefile $machineFileName -np $nrProcs $debugMode $CFDEM_LIGGGHTS_SRC_DIR/$CFDEM_LIGGGHTS_LIB_NAME < $solverName 2>&1 | tee -a $logpath/$logfileName + fi + + #- keep terminal open (if started in new terminal) + #read +} +#==================================# + #==================================# #- function to run a CFD case diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C index a1da55fe..8081f3c1 100644 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C @@ -267,7 +267,9 @@ bool Foam::twoWayMPI::couple() const setNumberOfParticles(newNpart); // re-allocate arrays of cloud + particleCloud_.clockM().start(4,"LIGGGHTS_reallocArrays"); particleCloud_.reAllocArrays(); + particleCloud_.clockM().stop("LIGGGHTS_reallocArrays"); } return coupleNow; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C index 5f77c195..53b9004b 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C @@ -75,6 +75,8 @@ KochHillDrag::KochHillDrag if (propsDict_.found("verbose")) verbose_=true; if (propsDict_.found("treatExplicit")) treatExplicit_=true; if (propsDict_.found("interpolation")) interpolation_=true; + + // Note: dprim=ds/scale_ if (propsDict_.found("scale")) scale_=scalar(readScalar(propsDict_.lookup("scale"))); } @@ -126,7 +128,6 @@ void KochHillDrag::setForce { if(mask[index][0]) { - cellI = particleCloud_.cellIDs()[index][0]; drag = vector(0,0,0); @@ -137,6 +138,10 @@ void KochHillDrag::setForce position = particleCloud_.position(index); voidfraction = voidfractionInterpolator_.interpolate(position,cellI); Ufluid = UInterpolator_.interpolate(position,cellI); + //Ensure interpolated void fraction to be meaningful + // Info << " --> voidfraction: " << voidfraction << endl; + if(voidfraction>1.00) voidfraction = 1.00; + if(voidfraction<0.40) voidfraction = 0.40; }else { voidfraction = particleCloud_.voidfraction(index); @@ -162,8 +167,12 @@ void KochHillDrag::setForce scalar F0=0.; if(volumefraction < 0.4) { - F0 = (1+3*sqrt((volumefraction)/2)+135/64*volumefraction*log(volumefraction)+16.14*volumefraction)/ - (1+0.681*volumefraction-8.48*sqr(volumefraction)+8.16*volumefraction*volumefraction*volumefraction); + F0 = (1+3*sqrt((volumefraction)/2)+135/64*volumefraction*log(volumefraction) + +16.14*volumefraction + )/ + (1+0.681*volumefraction-8.48*sqr(volumefraction) + +8.16*volumefraction*volumefraction*volumefraction + ); } else { F0 = 10*volumefraction/(voidfraction*voidfraction*voidfraction); } @@ -171,12 +180,14 @@ void KochHillDrag::setForce // calc model coefficient F3 scalar F3 = 0.0673+0.212*volumefraction+0.0232/pow(voidfraction,5); - // calc model coefficient beta - scalar beta = 18*nuf*rho*voidfraction*voidfraction*volumefraction/(ds/scale_*ds/scale_)* - (F0 + 0.5*F3*Rep); + //Calculate F in the formulation of van der Hoef et al. (JFM 528:233-254) + scalar F = voidfraction * (F0 + 0.5*F3*Rep); + + // calc drag model coefficient betaP + scalar betaP = 18.*nuf*rho/(ds/scale_*ds/scale_)*voidfraction*F; // calc particle's drag - drag = Vs*beta/volumefraction*Ur; + drag = Vs*betaP*Ur; if (modelType_=="B") drag /= voidfraction; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C new file mode 100644 index 00000000..42ff59dd --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C @@ -0,0 +1,232 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "DiFeliceDragMS.H" +#include "addToRunTimeSelectionTable.H" + +//#include "mpi.h" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(DiFeliceDragMS, 0); + +addToRunTimeSelectionTable +( + forceModelMS, + DiFeliceDragMS, + dictionary +); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +DiFeliceDragMS::DiFeliceDragMS +( + const dictionary& dict, + cfdemCloudMS& sm +) +: + forceModelMS(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + verbose_(false), + velFieldName_(propsDict_.lookup("velFieldName")), + U_(sm.mesh().lookupObject (velFieldName_)), + densityFieldName_(propsDict_.lookup("densityFieldName")), + rho_(sm.mesh().lookupObject (densityFieldName_)), + voidfractionFieldName_(propsDict_.lookup("voidfractionFieldName")), + voidfraction_(sm.mesh().lookupObject (voidfractionFieldName_)), + interpolation_(false), + //sphereToClump_(readScalar(propsDict_.lookup("sphereToClump"))) + dH_(readScalar(propsDict_.lookup("hydraulicDiameter"))) +{ + if (propsDict_.found("verbose")) verbose_=true; + if (propsDict_.found("treatExplicit")) treatExplicit_=true; + if (propsDict_.found("interpolation")) + { + Info << "using interpolated value of U." << endl; + interpolation_=true; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +DiFeliceDragMS::~DiFeliceDragMS() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void DiFeliceDragMS::setForce +( + double** const& mask, + double**& impForces, + double**& expForces, + double**& DEMForces +) const +{ + // get viscosity field + #ifdef comp + const volScalarField& nufField = cloudRefMS().turbulence().mu() / rho_; + #else + const volScalarField& nufField = cloudRefMS().turbulence().nu(); + #endif + + interpolationCellPoint UInterpolator(U_); + interpolationCellPoint voidfractionInterpolator(voidfraction_); + vector U(0,0,0); + vector position(0,0,0); + scalar voidfraction(1); + vector Us(0,0,0); + vector Ur(0,0,0); + scalar ds(0); + scalar nuf(0); + scalar rho(0); + scalar magUr(0); + scalar Rep(0); + scalar Cd(0); + + cloudRefMS().resetArray(cloudRefMS().expForcesCM(),cloudRefMS().numberOfClumps(),3); + cloudRefMS().resetArray(cloudRefMS().impForcesCM(),cloudRefMS().numberOfClumps(),3); + + for(int index = 0;index < cloudRefMS().numberOfClumps(); index++) + { + + //if(mask[index][0]) // would have to be transformed from body ID to particle ID + //{ + vector drag(0,0,0); + label cellI = cloudRefMS().cellIDCM(index); + + if (cellI > -1) // particle Found + { + if(interpolation_) + { + position = cloudRefMS().positionCM(index); + U = UInterpolator.interpolate(position,cellI); + voidfraction = voidfractionInterpolator.interpolate(position,cellI); + }else + { + U = U_[cellI]; + voidfraction = voidfraction_[cellI]; + } + + Us = cloudRefMS().velocityCM(index); + Ur = U-Us; + //ds = 2*cloudRefMS().radius(index)/sphereToClump_; // scale from particle diameter + ds = dH_; // use dict defined diameter + + nuf = nufField[cellI]; + rho = rho_[cellI]; + magUr = mag(Ur); + Rep = 0; + Cd = 0; + scalar phi(0); + scalar phiN(0); + + if (magUr > 0) + { + // calc particle Re Nr + Rep = ds*voidfraction*magUr/nuf; + + // calc fluid drag Coeff +// phi=1; //AsurfAequi/Asurf; +// phiN=1; //AcrosssecAequi/Acrosssec; + // paper uses different Re definition!? +// Cd=8/(Rep*sqrt(phiN))+16/(Rep*sqrt(phi))+3/(sqrt(Rep)*pow(phi,0.75))+0.42*pow(10,(-0.4*pow(log(phi),0.2)))/phiN; + + // calc fluid drag Coeff + Cd = sqr(0.63 + 4.8/sqrt(Rep)); + + // calc model coefficient Xi + scalar Xi = 3.7 - 0.65 * exp(-sqr(1.5-log10(Rep))/2); + + // calc particle's drag + drag = 0.125*Cd*rho*M_PI*ds*ds*pow(voidfraction,(2-Xi))*magUr*Ur; + + if (modelType_=="B") + drag /= voidfraction; + } + + if(verbose_ && index >=0 && index <10) + { + Info << "index = " << index << endl; + Info << "Us = " << Us << endl; + Info << "Ur = " << Ur << endl; + Info << "ds = " << ds << endl; + Info << "rho = " << rho << endl; + Info << "nuf = " << nuf << endl; + Info << "voidfraction = " << voidfraction << endl; + Info << "Rep = " << Rep << endl; + Info << "Cd = " << Cd << endl; + Info << "drag = " << drag << endl; + } + } + // set force on bodies + if(treatExplicit_) for(int j=0;j<3;j++) cloudRefMS().expForcesCM()[index][j] += drag[j]; + else for(int j=0;j<3;j++) cloudRefMS().impForcesCM()[index][j] += drag[j]; + //} + } + + // set force on particles + int nrigidC(-1); + label ind(-1); + for(int index = 0;index < cloudRefMS().numberOfParticles(); index++) + { + if (particleCloud_.cellIDs()[index][0] > -1) // particle Found + { + ind=cloudRefMS().body(index); + nrigidC=cloudRefMS().nrigid(ind); + + if (nrigidC <= 0) + { + Warning <<"A BUG occurred in DiFeliceDragMS::setForce!!! nrigidC = " << nrigidC <<", ind = " << ind <<", index=" << index <<"\n" << endl; + nrigidC = 1000; + } + if(treatExplicit_) for(int j=0;j<3;j++) expForces[index][j] += cloudRefMS().expForcesCM()[ind][j] / nrigidC; + else for(int j=0;j<3;j++) impForces[index][j] += cloudRefMS().impForcesCM()[ind][j] / nrigidC; + } + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H new file mode 100644 index 00000000..06669379 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.H @@ -0,0 +1,121 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). + +Class + DiFeliceDragMS + +SourceFiles + DiFeliceDragMS.C + +\*---------------------------------------------------------------------------*/ + +#ifndef DiFeliceDragMS_H +#define DiFeliceDragMS_H + +#include "cfdemCloudMS.H" +#include "forceModelMS.H" +#include "interpolationCellPoint.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class DiFeliceDragMS Declaration +\*---------------------------------------------------------------------------*/ + +class DiFeliceDragMS +: + public forceModelMS +{ +private: + dictionary propsDict_; + + bool verbose_; + + word velFieldName_; + + const volVectorField& U_; + + word densityFieldName_; + + const volScalarField& rho_; + + word voidfractionFieldName_; + + const volScalarField& voidfraction_; + + bool interpolation_; // use interpolated U field values + + //scalar sphereToClump_; // ratio of sphere radius to clump radius + + scalar dH_; // hydraulic diameter + +public: + + //- Runtime type information + TypeName("DiFeliceDragMS"); + + + // Constructors + + //- Construct from components + DiFeliceDragMS + ( + const dictionary& dict, + cfdemCloudMS& sm + ); + + // Destructor + + ~DiFeliceDragMS(); + + + // Member Functions + void setForce + ( + double** const& mask, + double**&, + double**&, + double**& + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.C new file mode 100644 index 00000000..731a6640 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.C @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" +#include "forceModelMS.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(forceModelMS, 0); + +defineRunTimeSelectionTable(forceModelMS, dictionary); + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +forceModelMS::forceModelMS +( + const dictionary& dict, + cfdemCloudMS& sm +) +: + forceModel(dict,sm), + particleCloudMS_(sm) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +forceModelMS::~forceModelMS() +{} + +// * * * * * * * * * * * * * * * * Member Fct * * * * * * * * * * * * * * * // +cfdemCloudMS& forceModelMS::cloudRefMS() const +{ + return particleCloudMS_; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.H b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.H new file mode 100644 index 00000000..e5c2aed0 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/forceModelMS.H @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). + +Class + forceModelMS + +SourceFiles + forceModelMS.C + +\*---------------------------------------------------------------------------*/ + +#ifndef forceModelMS_H +#define forceModelMS_H + +#include "fvCFD.H" +#include "cfdemCloudMS.H" +#include "forceModel.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +/*---------------------------------------------------------------------------*\ + Class forceModelMS Declaration +\*---------------------------------------------------------------------------*/ + +class forceModelMS +: + public forceModel +{ + +protected: + + cfdemCloudMS& particleCloudMS_; + + +public: + + //- Runtime type information + TypeName("forceModelMS"); + + // Declare runtime constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + forceModelMS, + dictionary, + ( + const dictionary& dict, + cfdemCloudMS& sm + ), + (dict,sm) + ); + + + // Constructors + + //- Construct from components + forceModelMS + ( + const dictionary& dict, + cfdemCloudMS& sm + ); + + + // Destructor + + virtual ~forceModelMS(); + + + // Selector + + static autoPtr New + ( + const dictionary& dict, + cfdemCloudMS& sm, + word forceType + ); + + + // Member Functions + + + // Access + cfdemCloudMS& cloudRefMS() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/newForceModelMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/newForceModelMS.C new file mode 100644 index 00000000..aee7f803 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/forceModelMS/newForceModelMS.C @@ -0,0 +1,79 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "forceModelMS.H" +#include "DiFeliceDrag.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +autoPtr forceModelMS::New +( + const dictionary& dict, + cfdemCloudMS& sm, + word forceType +) +{ + Info<< "Selecting forceModelMS " + << forceType << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(forceType); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalError + << "forceModelMS::New(const dictionary&, const spray&) : " + << endl + << " unknown forceModelType type " + << forceType + << ", constructor not in hash table" << endl << endl + << " Valid forceModelMS types are :" + << endl; + Info<< dictionaryConstructorTablePtr_->toc() + << abort(FatalError); + } + + return autoPtr(cstrIter()(dict,sm)); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C index f50b63f9..d6b2d2d7 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C @@ -69,12 +69,18 @@ dividedVoidFraction::dividedVoidFraction alphaMin_(readScalar(propsDict_.lookup("alphaMin"))), alphaLimited_(0), tooMuch_(0.0), - scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol"))) + scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol"))), + interpolation_(false) { maxCellsPerParticle_ = 29; if(scaleUpVol_ > 1.3 || scaleUpVol_ < 1){ FatalError<< "scaleUpVol shloud be > 1 and < 1.3 !!!" << abort(FatalError); } if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< "alphaMin shloud be > 1 and < 0.01 !!!" << abort(FatalError); } + if (propsDict_.found("interpolation")){ + interpolation_=true; + Warning << "interpolation for dividedVoidFraction does not yet work correctly!" << endl; + Info << "Using interpolated voidfraction field - do not use this in combination with interpolation in drag model!"<< endl; + } } @@ -90,6 +96,12 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra { reAllocArrays(); + scalar pi = M_PI; + vector position(0,0,0); + label cellID=-1; + scalar radius(-1); + scalar cellVol(0); + for(int index=0; index< particleCloud_.numberOfParticles(); index++) { if(mask[index][0]) @@ -101,14 +113,12 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra } cellsPerParticle_[index][0]=1; - - scalar pi = M_PI; - vector position = particleCloud_.position(index); - label cellID = particleCloud_.cellIDs()[index][0]; - scalar radius = particleCloud_.radii()[index][0]; + position = particleCloud_.position(index); + cellID = particleCloud_.cellIDs()[index][0]; + radius = particleCloud_.radii()[index][0]; scalar volume = 4./3.*radius*radius*radius*3.1415; radius = radius*pow(scaleUpVol_,1/3); - scalar cellVol(0); + cellVol=0; //--variables for sub-search int nPoints = 29; @@ -195,20 +205,53 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra if(index == particleCloud_.numberOfParticles()-1) Info << "Total particle volume neglected: " << tooMuch_<< endl; }// end loop all particles - // bring voidfraction from Eulerian Field to particle array + // bring voidfraction from Eulerian Field to particle arra +// interpolationCellPoint voidfractionInterpolator_(voidfractionNext_); + scalar voidfractionAtPos(0); for(int index=0; index< particleCloud_.numberOfParticles(); index++) { - for(int subcell=0;subcell= 0) + label cellI = particleCloud_.cellIDs()[index][0]; + if(cellI >= 0) { - voidfractions[index][subcell] = voidfractionNext_[cellID]; + position = particleCloud_.position(index); + voidfractionAtPos=voidfractionInterpolator_.interpolate(position,cellI); + }else{ + voidfractionAtPos=-1; } - else + + for(int subcell=0;subcell= 0) + { + if(voidfractionAtPos > 0) + voidfractions[index][subcell] = voidfractionAtPos; + else + voidfractions[index][subcell] = voidfractionNext_[cellID]; + } + else + { + voidfractions[index][subcell] = -1.; + } + } + } + else*/ + { + for(int subcell=0;subcell= 0) + { + voidfractions[index][subcell] = voidfractionNext_[cellID]; + } + else + { + voidfractions[index][subcell] = -1.; + } } } } diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H index 7f4c6ccd..8e793adc 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H @@ -40,6 +40,7 @@ SourceFiles #define dividedVoidFraction_H #include "voidFractionModel.H" +#include "interpolationCellPoint.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -66,6 +67,8 @@ private: const scalar scaleUpVol_; //NP scaling radius, keeping volume of particle + bool interpolation_; + public: //- Runtime type information diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.C new file mode 100644 index 00000000..deb62e94 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.C @@ -0,0 +1,223 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "dividedVoidFractionMS.H" +#include "addToRunTimeSelectionTable.H" +#include "locateModel.H" +#include "regionModel.H" +#include "dataExchangeModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(dividedVoidFractionMS, 0); + +addToRunTimeSelectionTable +( + voidFractionModel, + dividedVoidFractionMS, + dictionary +); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +dividedVoidFractionMS::dividedVoidFractionMS +( + const dictionary& dict, + cfdemCloud& sm +) +: + voidFractionModel(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + alphaMin_(readScalar(propsDict_.lookup("alphaMin"))), + alphaLimited_(0), + tooMuch_(0.0), + scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol"))), + clumpVol_(readScalar(propsDict_.lookup("clumpVol"))), + nrigid_(readScalar(propsDict_.lookup("nrigid"))) +{ + maxCellsPerParticle_ = 29; + + if(scaleUpVol_ > 1.3 || scaleUpVol_ < 1){ FatalError<< "scaleUpVol shloud be > 1 and < 1.3 !!!" << abort(FatalError); } + if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< "alphaMin shloud be > 1 and < 0.01 !!!" << abort(FatalError); } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +dividedVoidFractionMS::~dividedVoidFractionMS() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void dividedVoidFractionMS::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes) const +{ + reAllocArrays(); + + for(int index=0; index< particleCloud_.numberOfParticles(); index++) + { + if(mask[index][0]) + { + // reset + for(int subcell=0;subcell= 0) // particel centre is in domain + { + cellVol = particleCloud_.mesh().V()[cellID]; + + //NP for 2 different radii + for(scalar r = 0.623926*radius;r < radius;r+=0.293976*radius) + { + //NP try 8 subpoint derived from spherical coordinates + for (scalar zeta=pi/4.;zeta<(2.*pi);zeta+=(pi/2.)) + { + for (scalar theta=(pi/4.);theta29 || cellsSet<0) + { + Info << "ERROR cellsSet =" << cellsSet << endl; + } + + //NP set source for particle center; source 1/nPts+weight of all subpoints that have not been found + scalar centreWeight = 1./nPoints*(nPoints-cellsSet); + + // update voidfraction for each particle read + scalar newAlpha = voidfractionNext_[cellID]- volume*centreWeight/cellVol; + if(newAlpha > alphaMin_) voidfractionNext_[cellID] = newAlpha; + else + { + voidfractionNext_[cellID] = alphaMin_; + tooMuch_ += (alphaMin_-newAlpha) * cellVol; + } + + // store cellweight for each particle --- this should be done for subpoints as well!! + particleWeights[index][0] += centreWeight; + + // store particleVolume for each particle + particleVolumes[index][0] += volume*centreWeight; + + /*//OUTPUT + if (index==0) + { + Info << "centre cellID = " << cellID << endl; + Info << "cellsPerParticle_=" << cellsPerParticle_[index][0] << endl; + + for(int i=0;i= 0) + { + voidfractions[index][subcell] = voidfractionNext_[cellID]; + } + else + { + voidfractions[index][subcell] = -1.; + } + } + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.H b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.H new file mode 100644 index 00000000..a83be07a --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFractionMS/dividedVoidFractionMS.H @@ -0,0 +1,106 @@ +/*---------------------------------------------------------------------------*\ + CFDEMcoupling - Open Source CFD-DEM coupling + + CFDEMcoupling is part of the CFDEMproject + www.cfdem.com + Christoph Goniva, christoph.goniva@cfdem.com + Copyright 2009-2012 JKU Linz + Copyright 2012- DCS Computing GmbH, Linz +------------------------------------------------------------------------------- +License + This file is part of CFDEMcoupling. + + CFDEMcoupling is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with CFDEMcoupling; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS + and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER). + +Class + dividedVoidFractionMS + +SourceFiles + dividedVoidFractionMS.C + +\*---------------------------------------------------------------------------*/ + +#ifndef dividedVoidFractionMS_H +#define dividedVoidFractionMS_H + +#include "voidFractionModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class noDrag Declaration +\*---------------------------------------------------------------------------*/ + +class dividedVoidFractionMS +: + public voidFractionModel +{ + +private: + dictionary propsDict_; + + const scalar alphaMin_; //NP min value of voidFraction + + mutable bool alphaLimited_; + + mutable scalar tooMuch_; //NP particle volume which is lost due to voidFraction limitation + + const scalar scaleUpVol_; //NP scaling radius, keeping volume of particle + + const scalar clumpVol_; + + const int nrigid_; + +public: + + //- Runtime type information + TypeName("dividedMS"); + + + // Constructors + + //- Construct from components + dividedVoidFractionMS + ( + const dictionary& dict, + cfdemCloud& sm + ); + + // Destructor + + ~dividedVoidFractionMS(); + + + // Member Functions + void setvoidFraction(double** const& ,double**&, double**&, double**&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh index 81a03c31..fa4eab31 100644 --- a/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverIB" nrProcs="8" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -66,6 +66,8 @@ cp ../../$logfileName $testHarnessPath #- clean up case echo "deleting data at: $casePath" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/VTK rm -r $casePath/CFD/couplingFiles/* rm -r $casePath/CFD/processor* diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties index 57cb0155..e3c815b4 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties @@ -49,8 +49,8 @@ clockModel standardClock;//off; forceModels ( //GidaspowDrag - DiFeliceDrag - //KochHillDrag + //DiFeliceDrag + KochHillDrag gradPForce viscForce //Archimedes @@ -132,6 +132,7 @@ KochHillDragProps { velFieldName "U"; densityFieldName "rho"; + voidfractionFieldName "voidfraction"; } virtualMassForceProps diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict index c0b2fc33..84219dac 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict @@ -29,7 +29,7 @@ deltaT 0.001; writeControl adjustableRunTime; -writeInterval 0.001;//0.01; +writeInterval 0.01; purgeWrite 0; diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh index 6dd01b35..fd0426d6 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPiso" nrProcs="8" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -83,6 +83,8 @@ fi #- clean up case echo "deleting data at: $casePath :\n" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/log.* rm -r $casePath/CFD/octave/octave-core rm -r $casePath/CFD/VTK diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh index ddc6c75f..90d8d867 100755 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh @@ -98,6 +98,8 @@ fi #- clean up case rm -rf $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/clockData rm -rf $casePath/CFD/processor* rm -r $casePath/CFD/VTK diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy index 5e4682fa..cf58c55e 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/post/dummy @@ -23,3 +23,5 @@ dummyfile dummyfile dummyfile dummyfile +dummyfile +dummyfile diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh index 792491ee..5443c574 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPiso" nrProcs="2" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" #--------------------------------------------------------------------------------# diff --git a/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh index 6782a588..961943e6 100644 --- a/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPiso" nrProcs="2" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -78,6 +78,8 @@ fi #- clean up case echo "deleting data at: $casePath :\n" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/log.* rm -r $casePath/CFD/octave/octave-core rm -r $casePath/CFD/VTK diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh new file mode 100755 index 00000000..c326910d --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/Allrun.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +#===================================================================# +# allrun script for testcase as part of test routine +# run settlingTest +# Christoph Goniva - Sept. 2010 +#===================================================================# + +#- define variables +casePath="$(dirname "$(readlink -f ${BASH_SOURCE[0]})")" +pizzaPath="$CFDEM_PIZZA_DIR" +postproc="false" +nrPostProcProcessors=2 + +# check if mesh was built +if [ -d "$casePath/CFD/constant/polyMesh/boundary" ]; then + echo "mesh was built before - using old mesh" +else + echo "mesh needs to be built" + cd $casePath/CFD + blockMesh +fi + +#- run parallel CFD-DEM in new terminal +gnome-terminal --title='cfdemSolverPisoMS ErgunTestMPI CFD' -e "bash $casePath/parCFDDEMrun.sh" + +if [ $postproc == "true" ] + then + + #- keep terminal open (if started in new terminal) + echo "simulation finisehd? ...press enter to proceed" + read + + #- get VTK data from liggghts dump file + cd $casePath/DEM + python $pizzaPath/pizza.py -f pizzaScriptRestart + + #- get VTK data from CFD sim + cd $casePath/CFD + #foamToVTK #- serial run of foamToVTK + source $CFDEM_SRC_DIR/etc/functions.sh #- include functions + pseudoParallelRun "foamToVTK" $nrPostProcProcessors #- pseudo parallel run of foamToVTK + + #- start paraview + paraview + + #- keep terminal open (if started in new terminal) + echo "...press enter to clean up case" + echo "press Ctr+C to keep data" + read + + #- clean up case + echo "deleting data at: $casePath" + rm -r $casePath/CFD/0.* + rm -r $casePath/CFD/VTK + rm -r $casePath/CFD/couplingFiles/* + rm -r $casePath/DEM/post/* + rm -r $casePath/DEM/log.* + rm -r $casePath/log_* + echo "done" + +fi diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl new file mode 100644 index 00000000..f44ecabe --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Ksl @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object Ksl; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -3 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + wall + { + type zeroGradient; + //type fixedValue; + //value uniform 0; + } + inlet + { + type zeroGradient; + } + outlet + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U new file mode 100644 index 00000000..959b298e --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/U @@ -0,0 +1,72 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0.1); + +boundaryField +{ + + wall + { + //type fixedValue; + //value uniform (0 0 0); + type slip; + } + + inlet + { + /*type flowRateInletVelocity; + flowRate 0.001; + value uniform (0 0 0);*/ + +/* type fixedValue; + value uniform (0 0 0.1);*/ + + //type zeroGradient; + + /*// superficial velocity BC + type groovyBC; + variables "Usup=vector(0,0,2);alpha=voidfraction;tEnd=0.1;"; // should be used with zeroGradient voidfraction + valueExpression "((time() < tEnd) ? Usup/alpha*(time()/tEnd) : Usup/alpha)"; + value uniform (0 0 0);*/ + + /*// 2.0.x, ext + type timeVaryingUniformFixedValue; + fileName "steps_0p1s"; + outOfBounds clamp; + value uniform (0 0 0);*/ + + // 2.1.x + type uniformFixedValue; + uniformValue table + ( + (0.000 (0 0 0.)) + (0.099 (0 0 2)) + (0.100 (0 0 2)) + ); + } + outlet + { + /*type fluxCorrectedVelocity; //inletOutlet; + value uniform (0 0 0); + inletValue uniform (0 0 0);*/ + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us new file mode 100644 index 00000000..1af9a050 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/Us @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + location "0"; + object Us; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + wall + { + type zeroGradient; + //type fixedValue; + //value uniform (1 0 0); + } + inlet + { + type zeroGradient; + //type fixedValue; + //value uniform (1 0 0);; + } + outlet + { + type zeroGradient; + //type fixedValue; + //value uniform (1 0 0); + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/epsilon b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/epsilon new file mode 100644 index 00000000..37ffab5e --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/epsilon @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object epsilon; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -3 0 0 0 0]; + +internalField uniform 0.003; + +boundaryField +{ + wall + { + type epsilonWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0.003; + } + outlet + { + type inletOutlet; + inletValue uniform 0.003; + value uniform 0.003; + } + inlet + { + /*type turbulentMixingLengthDissipationRateInlet; + mixingLength 0.005; + value uniform 0.003;*/ + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k new file mode 100644 index 00000000..bbf04afb --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/k @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 0.001; + +boundaryField +{ + wall + { + type kqRWallFunction; + value uniform 0.001; + } + outlet + { + type inletOutlet; + inletValue uniform 0.001; + value uniform 0.001; + } + inlet + { + /*type turbulentIntensityKineticEnergyInlet; + intensity 0.05; + value uniform 0.001;*/ + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut new file mode 100644 index 00000000..dcd36c89 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/nut @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object nut; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + wall + { + type nutWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0; + } + outlet + { + type calculated; + value uniform 0; + } + inlet + { + type calculated; + value uniform 0; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p new file mode 100644 index 00000000..d111e6be --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/p @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 1.0e5; + +boundaryField +{ + + wall + { + type zeroGradient; + } + + inlet + { + type zeroGradient; + //type fixedValue; + //value uniform 100000; + } + outlet + { + //type zeroGradient; + type fixedValue; + value uniform 100000; + } +} + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho new file mode 100644 index 00000000..bc2244f6 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/rho @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object rho; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -3 0 0 0 0 0]; + +internalField uniform 5; + +boundaryField +{ + + wall + { + type zeroGradient; + } + + inlet + { + type zeroGradient; + } + outlet + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/voidfraction b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/voidfraction new file mode 100644 index 00000000..3fdf6da6 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/0/voidfraction @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object voidfraction; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 1; + +boundaryField +{ + wall + { + type zeroGradient; + } + outlet + { + type fixedValue; + value uniform 1; + } + inlet + { + type fixedValue; + value uniform 1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/RASProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/RASProperties new file mode 100644 index 00000000..daec1829 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/RASProperties @@ -0,0 +1,25 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object RASProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +RASModel laminar; + +turbulence off; + +printCoeffs on; + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties new file mode 100644 index 00000000..62a18661 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties @@ -0,0 +1,177 @@ +/*---------------------------------------------------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.4 | +| \\ / A nd | Web: http://www.openfoam.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object couplingProperties; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//===========================================================================// +// sub-models & settings +verbose; + +modelType B; // A or B + +couplingInterval 100; + +voidFractionModel dividedMS; + +locateModel engine; + +meshMotionModel noMeshMotion; + +regionModel allRegion; + +IOModel basicIO; + +dataExchangeModel twoWayMPI;//twoWayFiles;//oneWayVTK;// + +averagingModel dense;//dilute;// + +clockModel off; + +forceModels +( + off + Archimedes + volWeightedAverage +); + +forceModelsMS +( + DiFeliceDragMS +); + +momCoupleModels +( + implicitCouple +); + +turbulenceModelType RASProperties;//LESProperties;// + +//===========================================================================// +// sub-model properties + +implicitCoupleProps +{ + velFieldName "U"; + granVelFieldName "Us"; + voidfractionFieldName "voidfraction"; +} + +ArchimedesProps +{ + densityFieldName "rho"; + gravityFieldName "g"; +} +gradPForceProps +{ + pFieldName "p"; + densityFieldName "rho"; + velocityFieldName "U"; + interpolation; +} + +viscForceProps +{ + velocityFieldName "U"; + densityFieldName "rho"; + interpolation; +} +volWeightedAverageProps +{ + scalarFieldNames + ( + voidfraction + ); + vectorFieldNames + ( + ); + upperThreshold 0.999; + lowerThreshold 0; + verbose; +} +totalMomentumExchangeProps +{ + implicitMomExFieldName "Ksl"; + explicitMomExFieldName "none"; + fluidVelFieldName "U"; + granVelFieldName "Us"; + densityFieldName "rho"; +} + +DiFeliceDragMSProps +{ + velFieldName "U"; + densityFieldName "rho"; + voidfractionFieldName "voidfraction"; + hydraulicDiameter 0.002; + verbose; +} + +oneWayVTKProps +{ + couplingFilename "vtk_out%4.4d.vtk"; + maxNumberOfParticles 30000; +} + +twoWayFilesProps +{ + maxNumberOfParticles 10100; +} + +centreProps +{ + alphaMin 0.10; +} + +dividedMSProps +{ + alphaMin 0.05; + scaleUpVol 1.0; + clumpVol 1.8433e-9; // this is particles volume, not clump! + nrigid 10; +} + +bigParticleProps +{ + alphaMin 0.05; + scaleUpVol 50.0; + maxCellsPerParticle 1000; +} + +GaussProps +{ + maxCellsPerParticle 5000; + alphaMin 0.05; + scaleUpVol 10.0; +} + +engineProps +{ + treeSearch true; +} + +twoWayMPIProps +{ + maxNumberOfParticles 101000; + liggghtsPath "../DEM/in.liggghts_init"; +} +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/g b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/g new file mode 100644 index 00000000..51944e7a --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/g @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class uniformDimensionedVectorField; + location "constant"; + object g; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -2 0 0 0 0]; +value ( 0 0 0 ); + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/liggghtsCommands b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/liggghtsCommands new file mode 100644 index 00000000..7431b210 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/liggghtsCommands @@ -0,0 +1,31 @@ +/*---------------------------------------------------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.4 | +| \\ / A nd | Web: http://www.openfoam.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object liggghtsCommands; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +liggghtsCommandModels +( + runLiggghts +); + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/polyMesh/blockMeshDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/polyMesh/blockMeshDict new file mode 100644 index 00000000..812a89c1 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/polyMesh/blockMeshDict @@ -0,0 +1,154 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 2.0 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ +version 2.0; +format ascii; +class dictionary; +object blockMeshDict; +} +// ************************************ + + + + + + + meshGenApp blockMesh; + convertToMeters 1; + + //64 mm column diameter + //15 cm length + + + + //Width of middle square section + + + + + //how many cells in the square section + //how many cells from square section to perimeter + // how many cells from top to bottom + + vertices + ( + ( 0.0069 0.0069 0.0 ) // Vertex fiveoclocksqb = 0 + (-0.0069 0.0069 0.0 ) // Vertex sevenoclocksqb = 1 + (-0.0069 -0.0069 0.0 ) // Vertex elevenoclocksqb = 2 + ( 0.0069 -0.0069 0.0 ) // Vertex oneoclocksqb = 3 + + ( 0.00975807358913172 0.00975807357161699 0.0 ) // Vertex fiveoclockcb = 4 + (-0.00975807358913172 0.00975807357161699 0.0) // Vertex sevenoclockcb = 5 + (-0.00975807358913172 -0.00975807357161699 0.0) // Vertex elevenoclockcb = 6 + ( 0.00975807358913172 -0.00975807357161699 0.0) // Vertex oneoclockcb = 7 + + ( 0.0069 0.0069 0.0553) // Vertex fiveoclocksqt = 8 + (-0.0069 0.0069 0.0553) // Vertex sevenoclocksqt = 9 + (-0.0069 -0.0069 0.0553) // Vertex elevenoclocksqt = 10 + ( 0.0069 -0.0069 0.0553) // Vertex oneoclocksqt = 11 + + ( 0.00975807358913172 0.00975807357161699 0.0553) // Vertex fiveoclockct = 12 + (-0.00975807358913172 0.00975807357161699 0.0553) // Vertex sevenoclockct = 13 + (-0.00975807358913172 -0.00975807357161699 0.0553) // Vertex elevenoclockct = 14 + ( 0.00975807358913172 -0.00975807357161699 0.0553) // Vertex oneoclockct = 15 + ); + + blocks + ( + //square block + hex ( + 2 3 0 1 + 10 11 8 9 + ) + (4 4 12) + simpleGrading (1 1 1) + + //slice1 + hex ( + 1 0 4 5 + 9 8 12 13 + ) + (4 2 12) + simpleGrading (1 1 1) + + //slice2 + hex ( + 6 2 1 5 + 14 10 9 13 + ) + ( 2 4 12) +simpleGrading (1 1 1) + + //slice3 + hex ( + 6 7 3 2 + 14 15 11 10 + ) + (4 2 12) +simpleGrading (1 1 1) + + //slice4 + hex ( + 3 7 4 0 + 11 15 12 8 + ) + (2 4 12) +simpleGrading (1 1 1) + + ); + + + //create the quarter circles + edges + ( + arc 4 5 (0.0 0.0138 0.0 ) + arc 5 6 (-0.0138 0.0 0.0) + arc 6 7 (0.0 -0.0138 0.0 ) + arc 7 4 (0.0138 0.0 0.0) + + arc 12 13 (0.0 0.0138 0.0553 ) + arc 13 14 (-0.0138 0.0 0.0553 ) + arc 14 15 (0.0 -0.0138 0.0553 ) + arc 15 12 (0.0138 0.0 0.0553 ) + + ); + + patches + ( + patch inlet + ( + (0 3 2 1) + (0 4 7 3) + (4 0 1 5) + (1 2 6 5) + (3 7 6 2) + ) + + patch outlet + ( + (8 11 10 9) + (8 12 15 11) + (12 8 9 13) + (9 10 14 13) + (11 15 14 10) + ) + + wall wall + ( + (5 4 12 13) + (5 13 14 6) + (6 14 15 7) + (7 15 12 4) + ) + +); + +mergePatchPairs +( +); diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/transportProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/transportProperties new file mode 100644 index 00000000..6eb551de --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/transportProperties @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1.5e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/turbulenceProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/turbulenceProperties new file mode 100644 index 00000000..f6753662 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/turbulenceProperties @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RASModel; + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/clumpProperties.m b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/clumpProperties.m new file mode 100644 index 00000000..8d74c1cb --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/clumpProperties.m @@ -0,0 +1,29 @@ +clc; +close all; +clear; + +%========================================================================== +%m-file to calculate the properties of the imported clump +%========================================================================== + +fprintf('\n sphere10.multisphere:\n') + +rhoC=440 +scaling=1e-3 +nP=10 +rP=0.3530494 +VP=nP*(2*rP*scaling)^3*pi/6 +dH=2*scaling +VC=dH^3*pi/6 +rhoP=rhoC*VC/VP + +% -0.3301476 -3.4959164E-008 0.5563700 0.3530494 +% 0.5421265 -3.2849375E-008 0.3530494 0.3530494 +% 0.0822932 0.5358442 0.3530495 0.3530494 +% 0.0822932 -0.5358442 0.3530494 0.3530494 +% -0.5126716 -0.3946047 -2.9544078E-009 0.3530494 +% -0.5126715 0.3946047 -1.7513663E-008 0.3530494 +% 0.0822932 0.5358442 -0.3530494 0.3530494 +% 0.0822932 -0.5358442 -0.3530495 0.3530494 +% 0.5421264 -3.9639417E-008 -0.3530495 0.3530494 +% -0.3301475 -1.5302462E-008 -0.5563700 0.3530494 diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/loaddata.m b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/loaddata.m new file mode 100644 index 00000000..9897140c --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/loaddata.m @@ -0,0 +1,69 @@ +function [data,colname]=loaddata(filename,columns,headerlines) + +% data = loaddata(filename,columns,headerlines) +% data = loaddata(filename,0,headerlines): automatc detection of +% columns by word count in first headerline or first data line +% (if headerline==0), separated by blanks or tabs +% columns=-1: write colum assignment code lines +% works only if headerline>0 and colnames separated by +% not more than 1 blank! +% columns=-2: columns separated by 2 blanks (fluent/scheme auswertung-instat.scm) +% [data, colname] = loaddata(filename,0,headerlines) +% colname = cell string array of column names from headerline + +fprintf(1,'loading %s ... ', filename); +f=fopen(filename,'r'); +if f==-1 + fprintf(1,'\n*** error: could not open "%s" ...\n', filename); + data=[]; +else + for i=1:headerlines + if i==1 s=fgets(f); else fgets(f); end + end + if headerlines==0 + s=fgets(f); frewind(f); + end + if columns<=0 % & headerlines>=1 + fprintf(1,'\n'); + fprintf(1,' %s',s); + pos = findstr(sprintf('\t'),s); % trennzeichenpositionen in zeile suchen + if length(pos)>0 + endpos=length(s); + %if isspace(s(endpos-1)) endpos=endpos-1; end + pos = [0 pos(1,:) endpos]; % anfangs- und endposition hinzufügen + elseif columns==-2 % spalteneinträge durch 2 blanks getrennt (fluent/scheme) + pos=[0]; + for i=1:length(s)-1 + if isspace(s(i)) & isspace(s(i+1)) + pos(end+1)=i+1; + end + end + pos(end+1)=length(s); + else % spalteneinträge durch blanks getrennt + %pos = findstr(' ',s); % trennzeichenpositionen in zeile suchen + pos=[]; + word=0; + for i=1:length(s) + if isspace(s(i)) + word=0; + elseif ~word + word=1; + pos(end+1)=i-1; + end + end + pos(end+1)=length(s); + end + if headerlines>=1 + for i=1:length(pos)-1 % alle spalten + colname{i}=s(pos(i)+1:pos(i+1)-1); + if columns==-1 fprintf(' = data(strmatch(''%s'',colname),:); %% column %d\n', colname{i},i); end + if columns==-2 fprintf('%% column %d: %s\n', i, colname{i}); end + end + end + columns = length(pos)-1; + fprintf(1,' total: %d columns ',columns); + end + data=fscanf(f,'%f',[columns,inf]); + fclose(f); + fprintf(1,'done.\n'); +end diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m new file mode 100644 index 00000000..e03adcd6 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m @@ -0,0 +1,104 @@ +close all; +clear; +clc; + +%====================================% +% simulation data 1 +%====================================% +%path = '../probes/0/p'; +path = '../probes/0/p'; +columns=22; +headerlines=4; +data = loaddata(path,columns,headerlines); +data=transpose(data); +[x,y]=size(data) +dp_sim = (data(:,2)-data(:,y))/10000; +t_sim = data(:,1); +%fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) ) + +%====================================% +% analytical calculation +%====================================% + +%=================== +% Ergun Equation +%=================== +fprintf('\ncalc Ergun eqn:\n') + +% calc density of clump +% Note: for drag calc the clump diameter is used-> reduced density of clump +dp = 0.002 % clump diameter +ds_=0.001*0.3530494*2 % diameter of sphere +ns_=10; % nr of spheres per clump +rhos_=1000; % density of spheres +VclumpToVbody=ns_*(ds_/dp)^3 % ratio of the tot volume of the spheres to the volume of the body with d_ +rhoP = VclumpToVbody*rhos_ % density of clump + +nP_=2500; % nr of clumps +phip = 1 % sphericity +Ustart = 0. +Uend = 2 +timeStepSize = 0.001; % time interval of pressure data +Tstart = 0; +Tend = t_sim(length(t_sim)); +deltaU=(Uend-Ustart)/((Tend-Tstart)/timeStepSize); +U = Ustart+deltaU:deltaU:Uend; % velocity over time +L = 0.0212; % length of bed filled with particles +D = 0.0276; % diameter of bed + +% calc epsilon from bedheight +%Vpartiles=dp^3*pi/6*nP_; % tot clump vol +Vpartiles=ds_^3*pi/6*nP_*ns_; % tot particle vol +Vfilled=D^2*pi/4*L; %volume filled with particles +epsilon = 1-Vpartiles/Vfilled % void fraction + +%epsilon = 0.656968 + +Ua = U / epsilon; % physical velocity +rhoG = 5 % density in kg/m3 +nuG = 1.5*10^-5 % kinemat Visk in m2/s +muG = nuG*rhoG % dynam visc in Pa s + +dpErgun= L * ( + 150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2) + +1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp)) + )/10000/rhoG; + +fprintf('NOTE: this pressure is divided by density (according to CFD solver)\n') +fprintf('so the result does not depend on pressure\n') + +%fprintf('final pressure drop (Ergun eqn)= %f Pa\n',dpErgun) + +%================================== +% min fluidization velocity in m/s +%================================== +%rhoP = 2000 % particle density in kg/m3 +g = 9.81 % gravity m/s2 +Umf = dp^2*(rhoP-rhoG)*g/(150*muG)*(epsilon^3*phip^2)/(1-epsilon) +ReMF = Umf*dp*rhoG/muG % must be <20 !!! +%Umf = sqrt(phip*dp^2/1.75*(rhoP-rhoG)/rhoG*g*epsilon^3) % Re>1000 + +dpUmf= L * ( + 150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2) + +1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp)) + )/10000/rhoG; + +%====================================% +% plot data +%====================================% + +fig=figure(1) +plot(U,dpErgun,U,dp_sim,[Umf,Uend],dpUmf*ones(1,2)) +title("Ergun pressure drop vs. simulation") +a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf)); +legend(a,"simulation") +xlabel("velocity in [m/s]") +ylabel("pressure drop [bar]") +axis([0,Uend,0,dpErgun(length(dpErgun))]) + +%print('cfdemSolverPiso_settlingTest.eps','-deps2') +print -color "cfdemSolverPisoMS_ErgunTestMPI.eps" +replot; +SimName="ErgunTestMPI_sphereOfSpheres" +print(fig,strcat("figure_",SimName,".png")); + diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/steps_0p1s b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/steps_0p1s new file mode 100644 index 00000000..cc5e250c --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/steps_0p1s @@ -0,0 +1,28 @@ +( + (0.000 (0 0 0.002)) + (0.099 (0 0 0.30)) + (0.100 (0 0 0.30)) +) + +/*( + (0.000 (0 0 0.002)) + (0.010 (0 0 0.002)) + (0.011 (0 0 0.004)) + (0.020 (0 0 0.004)) + (0.021 (0 0 0.006)) + (0.030 (0 0 0.006)) + (0.031 (0 0 0.008)) + (0.040 (0 0 0.008)) + (0.041 (0 0 0.010)) + (0.050 (0 0 0.010)) + (0.051 (0 0 0.012)) + (0.060 (0 0 0.012)) + (0.061 (0 0 0.014)) + (0.070 (0 0 0.014)) + (0.071 (0 0 0.016)) + (0.080 (0 0 0.016)) + (0.081 (0 0 0.018)) + (0.090 (0 0 0.018)) + (0.091 (0 0 0.020)) + (0.100 (0 0 0.020)) +)*/ diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict new file mode 100644 index 00000000..32dc4714 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict @@ -0,0 +1,117 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application pisoFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.1; + +deltaT 0.001; + +writeControl adjustableRunTime; + +writeInterval 0.001; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep no; + +maxCo 0.1; + +//libs ("libOpenFOAM.so" "libgroovyBC.so"); + +functions +( + + probes + { + type probes; + // Where to load it from + functionObjectLibs ( "libsampling.so" ); + // Name of the directory for probe data + name probes; + probeLocations + ( + (0 0 0.0001) + (0 0 0.0026) + (0 0 0.0051) + (0 0 0.0076) + (0 0 0.0101) + (0 0 0.0126) + (0 0 0.0151) + (0 0 0.0176) + (0 0 0.0201) + (0 0 0.0226) + (0 0 0.0251) + (0 0 0.0276) + (0 0 0.0301) + (0 0 0.0326) + (0 0 0.0351) + (0 0 0.0375) + (0 0 0.0401) + (0 0 0.0426) + (0 0 0.0451) + (0 0 0.0476) + (0 0 0.0529) + ); + + // Fields to be probed + fields ( p U voidfraction volAverage_voidfraction); + + // Write at same frequency as fields + outputControl timeStep;//outputTime; + outputInterval 1; + } + + /*pressureDrop + { + type patchAverage; + functionObjectLibs + ( + "libsimpleFunctionObjects.so" + ); + verbose true; + patches + ( + inlet + outlet + ); + fields + ( + p + ); + factor 1; + }*/ +); +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict.foam b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict.foam new file mode 100644 index 00000000..d63da257 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/controlDict.foam @@ -0,0 +1,117 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application pisoFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.1;//0.01; + +deltaT 0.001; + +writeControl adjustableRunTime; + +writeInterval 0.001;//0.05; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep no; + +maxCo 0.1; + +libs ("libOpenFOAM.so" "libgroovyBC.so"); + +functions +( + + probes + { + type probes; + // Where to load it from + functionObjectLibs ( "libsampling.so" ); + // Name of the directory for probe data + name probes; + probeLocations + ( + (0 0 0.0001) + (0 0 0.0026) + (0 0 0.0051) + (0 0 0.0076) + (0 0 0.0101) + (0 0 0.0126) + (0 0 0.0151) + (0 0 0.0176) + (0 0 0.0201) + (0 0 0.0226) + (0 0 0.0251) + (0 0 0.0276) + (0 0 0.0301) + (0 0 0.0326) + (0 0 0.0351) + (0 0 0.0375) + (0 0 0.0401) + (0 0 0.0426) + (0 0 0.0451) + (0 0 0.0476) + (0 0 0.0529) + ); + + // Fields to be probed + fields ( p U voidfraction volAverage_voidfraction); + + // Write at same frequency as fields + outputControl timeStep;//outputTime; + outputInterval 1; + } + + /*pressureDrop + { + type patchAverage; + functionObjectLibs + ( + "libsimpleFunctionObjects.so" + ); + verbose true; + patches + ( + inlet + outlet + ); + fields + ( + p + ); + factor 1; + }*/ +); +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/decomposeParDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/decomposeParDict new file mode 100644 index 00000000..21bbeef3 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/decomposeParDict @@ -0,0 +1,86 @@ +/*-------------------------------*- C++ -*---------------------------------*\ +| ========= | +| \\ / OpenFOAM | +| \\ / | +| \\ / The Open Source CFD Toolbox | +| \\/ http://www.OpenFOAM.org | +\*-------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + location "system"; + object decomposeParDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 2; + +//- Keep owner and neighbour on same processor for faces in zones: +// preserveFaceZones (heater solid1 solid3); + +//method scotch; +// method hierarchical; + method simple; +// method metis; +// method manual; + +simpleCoeffs +{ + n (1 1 2); + delta 0.001; +} + +hierarchicalCoeffs +{ + n (2 2 1); + delta 0.001; + order xyz; +} + +metisCoeffs +{ + /* + processorWeights + ( + 1 + 1 + 1 + 1 + ); + */ +} + +scotchCoeffs +{ + //processorWeights + //( + // 1 + // 1 + // 1 + // 1 + //); + //writeGraph true; + //strategy "b"; +} + +manualCoeffs +{ + dataFile "decompositionData"; +} + + +//// Is the case distributed +//distributed yes; +//// Per slave (so nProcs-1 entries) the directory above the case. +//roots +//( +// "/tmp" +// "/tmp" +//); + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/funkySetFieldsDict b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/funkySetFieldsDict new file mode 100755 index 00000000..39414dd5 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/funkySetFieldsDict @@ -0,0 +1,33 @@ +FoamFile +{ + version 2.0; + format ascii; + + root "/.automount/werner/Werner/bgschaid/bgschaid-foamStuff/DepositionTests"; + case "neutralTest"; + instance "system"; + local ""; + + class dictionary; + object funkySetFieldsDict; +} + +expressions +( + init + { + field voidfraction; + expression "1"; + valuePatches 2(inlet outlet); // set value 1 at those patches + } + setGamma + { + field voidfraction; + expression "0.43"; + //condition "pow(pow(pos().x-0.2,2) + pow(pos().y-0,2)+ pow(pos().z-0,2),0.5) < 0.04"; + condition "pos().z < 0.01467 && pos().z > 0.0"; + keepPatches true; + //valuePatches 1(inlet); // set value 1 at those patches + } + +); diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSchemes b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSchemes new file mode 100644 index 00000000..fac85f68 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSchemes @@ -0,0 +1,76 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; + grad(p) Gauss linear; + grad(U) Gauss linear; +} + +divSchemes +{ + default Gauss linear; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss limitedLinear 1; + div(phi,epsilon) Gauss limitedLinear 1; + div(phi,R) Gauss limitedLinear 1; + div(R) Gauss linear; + div(phi,nuTilda) Gauss limitedLinear 1; + div((viscousTerm*dev(grad(U).T()))) Gauss linear; + div((nu*dev(grad(U).T()))) Gauss linear; + div((nuEff*dev(grad(U).T()))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; + laplacian(viscousTerm,U) Gauss linear corrected; + laplacian(nu,U) Gauss linear corrected; + laplacian(nuEff,U) Gauss linear corrected; + laplacian((1|A(U)),p) Gauss linear corrected; + laplacian((voidfraction2|A(U)),p) Gauss linear corrected; + laplacian(DkEff,k) Gauss linear corrected; + laplacian(DepsilonEff,epsilon) Gauss linear corrected; + laplacian(DREff,R) Gauss linear corrected; + laplacian(DnuTildaEff,nuTilda) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; + interpolate(U) linear; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; + p ; +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSolution b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSolution new file mode 100644 index 00000000..955f5b14 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/system/fvSolution @@ -0,0 +1,86 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.6 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver PCG; + preconditioner DIC; + tolerance 1e-06; + relTol 0.1; + } + + pFinal + { + solver PCG; + preconditioner DIC; + tolerance 1e-06; + relTol 0; + } + + U + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + k + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + epsilon + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + R + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } + + nuTilda + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } +} + +PISO +{ + nCorrectors 4; + nNonOrthogonalCorrectors 1; + pRefCell 0; + pRefValue 0; +} + + +// ************************************************************************* // diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init new file mode 100755 index 00000000..5c802383 --- /dev/null +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init @@ -0,0 +1,74 @@ +echo both + +# Pour granular particles into chute container + +atom_style hybrid granular molecular +atom_modify map array sort 0 0 +communicate single vel yes + +boundary m m m +newton off + +units si + +region reg block -0.015 0.015 -0.015 0.015 -0.001 0.0554 units box +create_box 1 reg + +neighbor 0.001 bin +neigh_modify delay 0 + +mass 1 1.0 + +#Material properties required for new pair styles + +fix m1 all property/global youngsModulus peratomtype 5.e6 +fix m2 all property/global poissonsRatio peratomtype 0.45 +fix m3 all property/global coefficientRestitution peratomtypepair 1 0.3 +fix m4 all property/global coefficientFriction peratomtypepair 1 0.5 + +#pair style +pair_style gran/hertz/history 1 0 #Hertzian without cohesion +pair_coeff * * + +#timestep, gravity +timestep 0.00001 +fix gravi all gravity 9.81 vector 0.0 0.0 -1.0 + +#walls +fix zwalls all wall/gran/hertz/history 1 0 zplane 0.0 0.0553 1 +fix cylwalls all wall/gran/hertz/history 1 0 zcylinder 0.01385 1 + + +#============================ +#distributions for insertion +fix pts1 all particletemplate/multisphere 1 atom_type 1 density constant 1000 nspheres 10 ntry 1000000 spheres file ../DEM/sphere10.multisphere scale 0.001 type 1 +fix pdd1 all particledistribution/discrete 1. 1 pts1 1.0 + +#region and insertion +group rigid_group region reg +region bc cylinder z 0.0 0.0 0.012 0.001 0.05 units box + +fix ins rigid_group insert/pack seed 100001 distributiontemplate pdd1 vel constant 0. 0. 0. insert_every once overlapcheck yes region bc ntry_mc 10000 particles_in_region 2500 # volumefraction_region 0.01 # + +#integrator for multisphere rigid bodies +fix integr rigid_group rigid/multisphere +#============================ + +#cfd coupling +fix cfd all couple/cfd couple_every 100000 mpi +fix cfd2 all couple/cfd/force/multisphere + + +#screen output +compute 1 all erotate/sphere +thermo_style custom step atoms ke c_1 vol +thermo 1000 +thermo_modify lost ignore norm no +compute_modify thermo_temp dynamic yes + +#insert the first particles so that dump is not empty +run 1 +dump dmp all custom 5000 ../DEM/post/dump.liggghts_init id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + +run 80000 upto +#write_restart liggghts.restart diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/liggghts.restart b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/liggghts.restart new file mode 100644 index 0000000000000000000000000000000000000000..e85ec5403680706c6b0f0bcda6b9fa04344fd21a GIT binary patch literal 1110 zcmb`GJ8#rL5XXo2L3kYRcUVHgD;~+@ReP{y3U(vvH;OI|?ZrmZ`}VC_pG8M>wTuUm)cHC6Bnth! zcM7M9cR)fafAKm?BQzM^zYbsd&)zvVQI~P66v*2ZJzLRtDtfM>e`8SfsA4jTfSlK= ztAdrTP6lZubIYMz8X%X+QmYqgvu^cNW)eNj?W1Y3ky5GXRE+iKxN!#LBq?i~r2^-Q z*m4TiTpsufDx^P*{?BG~F;kP-Ky^!{Hp-7e6ZX?cn$YSGBBQbte=mgMs=iQfWUh;O}eI85ots7Iu7%8}TxL59+f^-l{muy+xvFRx159C~H_>{pn%~#> $casePath/DEM/post/dummy diff --git a/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh b/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh index 0b0af6d4..63ada777 100644 --- a/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPisoScalar" nrProcs="2" machineFileName="none" # yourMachinefileName | none -debugMode="off" # on | off +debugMode="off" # on | off | prof testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -85,6 +85,8 @@ fi #- clean up case echo "deleting data at: $casePath : ???\n" rm -r $casePath/CFD/0.* +rm -r $casePath/CFD/callgrind.* +rm -r $casePath/CFD/*.out rm -r $casePath/CFD/octave/*.eps rm -r $casePath/CFD/octave/octave-core rm -r $casePath/CFD/VTK