diff --git a/README b/README index fd2ca75..2a7f869 100755 --- a/README +++ b/README @@ -25,16 +25,17 @@ License Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Description - This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS - and OpenFOAM. Note: this code is not part of OpenFOAM (see DISCLAIMER). + This code provides models and solvers to realize coupled CFD-DEM simulations + using LIGGGHTS and OpenFOAM. + Note: this code is not part of OpenFOAM (see DISCLAIMER). \*---------------------------------------------------------------------------*/ -CFDEM coupling provides an open source parallel coupled CFD-DEM framework -combining the strengths of LIGGGHTS DEM code and the Open Source -CFD package OpenFOAM(R)(*). The CFDEMcoupling toolbox allows to expand +CFDEM(R) coupling provides an open source parallel coupled CFD-DEM framework +combining the strengths of LIGGGHTS(R) DEM code and the Open Source +CFD package OpenFOAM(R)(*). The CFDEM(R)coupling toolbox allows to expand standard CFD solvers of OpenFOAM(R)(*) to include a coupling to the DEM -code LIGGGHTS. In this toolbox the particle representation within the +code LIGGGHTS(R). In this toolbox the particle representation within the CFD solver is organized by "cloud" classes. Key functionalities are organised in sub-models (e.g. force models, data exchange models, etc.) which can easily be selected and combined by dictionary settings. @@ -54,7 +55,7 @@ The file structure: - "src" directory including the source files of the coupling toolbox and models - "applications" directory including the solver files for coupled CFD-DEM simulations -- "doc" directory including the documentation of CFDEMcoupling +- "doc" directory including the documentation of CFDEM(R)coupling - "tutorials" directory including basic tutorial cases showing the functionality @@ -64,18 +65,17 @@ Details on installation are given on the "www.cfdem.com" The functionality of this CFD-DEM framwork is described via "tutorial cases" showing how to use different solvers and models. -CFDEMcoupling stands for Computational Fluid Dynamics (CFD) - +CFDEM(R)coupling stands for Computational Fluid Dynamics (CFD) - Discrete Element Method (DEM) coupling. -CFDEMcoupling is an open-source code, distributed freely under the terms of the +CFDEM(R)coupling is an open-source code, distributed freely under the terms of the GNU Public License (GPL). -Core development of CFDEMcoupling is done by +Core development of CFDEM(R)coupling is done by Christoph Goniva and Christoph Kloss, both at DCS Computing GmbH, 2012 \*---------------------------------------------------------------------------*/ -(*) "OpenFOAM(R)"_of is a registered trade mark of the ESI Group. -This offering is not affiliated, approved or endorsed by ESI Group, -the producer of the OpenFOAM® software and owner of the OpenFOAM® trade mark. +(*) "OpenFOAM(R)"_of is a registered trade mark of OpenCFD Limited, a wholly owned subsidiary of the ESI Group. +This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM® and OpenCFD® trade marks. \*---------------------------------------------------------------------------*/ diff --git a/applications/.gitignore b/applications/.gitignore new file mode 100644 index 0000000..4459954 --- /dev/null +++ b/applications/.gitignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.dep +log_* +log.* +*~ diff --git a/applications/solvers/cfdemSolverIB/Make/options b/applications/solvers/cfdemSolverIB/Make/options index c32ff59..a51d1da 100755 --- a/applications/solvers/cfdemSolverIB/Make/options +++ b/applications/solvers/cfdemSolverIB/Make/options @@ -1,3 +1,5 @@ +include $(CFDEM_ADD_LIBS_DIR)/additionalLibs + EXE_INC = \ -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \ -I$(LIB_SRC)/transportModels \ @@ -11,7 +13,6 @@ EXE_INC = \ -I$(LIB_SRC)/dynamicMesh/dynamicFvMesh/lnInclude \ -I$(LIB_SRC)/dynamicMesh/dynamicMesh/lnInclude \ -I$(LIB_SRC)/fvOptions/lnInclude - EXE_LIBS = \ -L$(CFDEM_LIB_DIR)\ -lincompressibleRASModels \ @@ -21,4 +22,7 @@ EXE_LIBS = \ -ldynamicFvMesh \ -ldynamicMesh \ -lfvOptions \ - -l$(CFDEM_LIB_NAME) + -l$(CFDEM_LIB_NAME) \ + $(CFDEM_ADD_LIB_PATHS) \ + $(CFDEM_ADD_LIBS) + diff --git a/applications/solvers/cfdemSolverIB/cfdemSolverIB.C b/applications/solvers/cfdemSolverIB/cfdemSolverIB.C index 93f0d41..9c930e6 100755 --- a/applications/solvers/cfdemSolverIB/cfdemSolverIB.C +++ b/applications/solvers/cfdemSolverIB/cfdemSolverIB.C @@ -72,7 +72,7 @@ int main(int argc, char *argv[]) #include "initContinuityErrs.H" #if defined(version22) - #include "createFvOptions.H" + #include "createFvOptions.H" #endif // create cfdemCloud @@ -128,10 +128,12 @@ int main(int argc, char *argv[]) for (int corr=0; corr()); + Info << "TotalForceExp: " << fTotal << endl; + Info << "TotalForceImp: " << fImpTotal << endl; + #include "solverDebugInfo.H" particleCloud.clockM().stop("Coupling"); @@ -91,23 +102,19 @@ int main(int argc, char *argv[]) // Momentum predictor fvVectorMatrix UEqn ( - fvm::ddt(voidfraction,U) + fvm::Sp(fvc::ddt(voidfraction),U) - + fvm::div(phi,U) + fvm::Sp(fvc::div(phi),U) + fvm::ddt(voidfraction,U) - fvm::Sp(fvc::ddt(voidfraction),U) + + fvm::div(phi,U) - fvm::Sp(fvc::div(phi),U) // + turbulence->divDevReff(U) + particleCloud.divVoidfractionTau(U, voidfraction) == - fvm::Sp(Ksl/rho,U) ); - 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 (momentumPredictor && (modelType=="B" || modelType=="Bfull")) + solve(UEqn == - fvc::grad(p) + Ksl/rho*Us); + else if (momentumPredictor) + solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us); // --- PISO loop @@ -120,11 +127,17 @@ int main(int argc, char *argv[]) surfaceScalarField rUAf("(1|A(U))", fvc::interpolate(rUA)); volScalarField rUAvoidfraction("(voidfraction2|A(U))",rUA*voidfraction); + surfaceScalarField rUAfvoidfraction("(voidfraction2|A(U)F)", fvc::interpolate(rUAvoidfraction)); U = rUA*UEqn.H(); - phi = (fvc::interpolate(U*voidfraction) & mesh.Sf() ); - //+ fvc::ddtPhiCorr(rUAvoidfraction, U, phi); + #ifdef version23 + phi = ( fvc::interpolate(U*voidfraction) & mesh.Sf() ) + + rUAfvoidfraction*fvc::ddtCorr(U, phi); + #else + phi = ( fvc::interpolate(U*voidfraction) & mesh.Sf() ) + + fvc::ddtPhiCorr(rUAvoidfraction, U, phi); + #endif surfaceScalarField phiS(fvc::interpolate(Us*voidfraction) & mesh.Sf()); surfaceScalarField phiGes = phi + rUAf*(fvc::interpolate(Ksl/rho) * phiS); @@ -157,13 +170,14 @@ int main(int argc, char *argv[]) if (nonOrth == nNonOrthCorr) { phiGes -= pEqn.flux(); + phi = phiGes; } } // end non-orthogonal corrector loop #include "continuityErrorPhiPU.H" - if (modelType=="B") + if (modelType=="B" || modelType=="Bfull") U -= rUA*fvc::grad(p) - Ksl/rho*Us*rUA; else U -= voidfraction*rUA*fvc::grad(p) - Ksl/rho*Us*rUA; @@ -191,7 +205,7 @@ int main(int argc, char *argv[]) } Info<< "End\n" << endl; - + return 0; } diff --git a/applications/solvers/cfdemSolverPisoScalar/Make/options b/applications/solvers/cfdemSolverPisoScalar/Make/options index e79c26f..68aecd1 100644 --- a/applications/solvers/cfdemSolverPisoScalar/Make/options +++ b/applications/solvers/cfdemSolverPisoScalar/Make/options @@ -1,3 +1,5 @@ +include $(CFDEM_ADD_LIBS_DIR)/additionalLibs + EXE_INC = \ -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \ -I$(LIB_SRC)/transportModels \ @@ -12,4 +14,6 @@ EXE_LIBS = \ -lincompressibleLESModels \ -lincompressibleTransportModels \ -lfiniteVolume \ - -l$(CFDEM_LIB_NAME) + -l$(CFDEM_LIB_NAME) \ + $(CFDEM_ADD_LIB_PATHS) \ + $(CFDEM_ADD_LIBS) diff --git a/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C b/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C index ac01594..2a3e49a 100644 --- a/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C +++ b/applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C @@ -30,7 +30,7 @@ Application 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, + The code is an evolution of the solver pisoFoam in OpenFOAM(R) 1.6, where additional functionality for CFD-DEM coupling is added. \*---------------------------------------------------------------------------*/ @@ -40,30 +40,26 @@ Description #include "cfdemCloud.H" #include "implicitCouple.H" -#include "forceModel.H" #include "smoothingModel.H" +#include "forceModel.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" cfdemCloud particleCloud(mesh); - #include "checkModelType.H" + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - Info<< "\nStarting time loop\n" << endl; - while (runTime.loop()) { Info<< "Time = " << runTime.timeName() << nl << endl; @@ -72,11 +68,15 @@ int main(int argc, char *argv[]) #include "CourantNo.H" // do particle stuff - Info << "- evolve()" << endl; - particleCloud.evolve(voidfraction,Us,U); + bool hasEvolved = particleCloud.evolve(voidfraction,Us,U); - Ksl.internalField() = particleCloud.momCoupleM(0).impMomSource(); - particleCloud.smoothingM().smoothen(Ksl); + if(hasEvolved) + { + particleCloud.smoothingM().smoothen(particleCloud.forceM(0).impParticleForces()); + } + + Info << "update Ksl.internalField()" << endl; + Ksl = particleCloud.momCoupleM(0).impMomSource(); Ksl.correctBoundaryConditions(); @@ -87,107 +87,116 @@ int main(int argc, char *argv[]) Tsource.correctBoundaryConditions(); // solve scalar transport equation - phi = fvc::interpolate(U*voidfraction) & mesh.Sf(); - - solve + fvScalarMatrix TEqn ( - fvm::ddt(voidfraction,T) - + fvm::div(phi, T) - - fvm::laplacian(DT*voidfraction, T) - == - Tsource + fvm::ddt(voidfraction,T) - fvm::Sp(fvc::ddt(voidfraction),T) + + fvm::div(phi, T) - fvm::Sp(fvc::div(phi),T) + - fvm::laplacian(DT*voidfraction, T) + == + Tsource ); + TEqn.relax(); + TEqn.solve(); - // Pressure-velocity PISO corrector + if(particleCloud.solveFlow()) { - // Momentum predictor - fvVectorMatrix UEqn - ( - fvm::ddt(voidfraction,U) - + fvm::div(phi, U) - + turbulence->divDevReff(U) - == - - fvm::Sp(Ksl/rho,U) - ); - - UEqn.relax(); - - if (momentumPredictor) + // Pressure-velocity PISO corrector { - //solve UEqn - if (modelType=="B") + // Momentum predictor + fvVectorMatrix UEqn + ( + fvm::ddt(voidfraction,U) - fvm::Sp(fvc::ddt(voidfraction),U) + + fvm::div(phi,U) - fvm::Sp(fvc::div(phi),U) +// + turbulence->divDevReff(U) + + particleCloud.divVoidfractionTau(U, voidfraction) + == + - fvm::Sp(Ksl/rho,U) + ); + + UEqn.relax(); + if (momentumPredictor && (modelType=="B" || modelType=="Bfull")) solve(UEqn == - fvc::grad(p) + Ksl/rho*Us); - else + else if (momentumPredictor) solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us); + + // --- PISO loop + + //for (int corr=0; corrcorrect(); + }// end solveFlow + else + { + Info << "skipping flow solution." << endl; } - turbulence->correct(); - runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" diff --git a/applications/utilities/cfdemPostproc/Make/options b/applications/utilities/cfdemPostproc/Make/options index c961d2d..c6a8758 100644 --- a/applications/utilities/cfdemPostproc/Make/options +++ b/applications/utilities/cfdemPostproc/Make/options @@ -1,3 +1,5 @@ +include $(CFDEM_ADD_LIBS_DIR)/additionalLibs + EXE_INC = \ -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \ -I$(LIB_SRC)/transportModels \ @@ -14,4 +16,6 @@ EXE_LIBS = \ -lincompressibleTransportModels \ -lfiniteVolume \ -l$(CFDEM_LIB_NAME) \ + $(CFDEM_ADD_LIB_PATHS) \ + $(CFDEM_ADD_LIBS) diff --git a/applications/utilities/cfdemPostproc/cfdemPostproc.C b/applications/utilities/cfdemPostproc/cfdemPostproc.C index 8db48d8..478136e 100644 --- a/applications/utilities/cfdemPostproc/cfdemPostproc.C +++ b/applications/utilities/cfdemPostproc/cfdemPostproc.C @@ -71,6 +71,7 @@ int main(int argc, char *argv[]) double **voidfractions_; double **particleWeights_; double **particleVolumes_; + double **particleV_; double **cellIDs_; particleCloud.dataExchangeM().allocateArray(positions_,0.,3); @@ -80,6 +81,7 @@ int main(int argc, char *argv[]) particleCloud.dataExchangeM().allocateArray(voidfractions_,0.,1); particleCloud.dataExchangeM().allocateArray(particleWeights_,0.,1); particleCloud.dataExchangeM().allocateArray(particleVolumes_,0.,1); + particleCloud.dataExchangeM().allocateArray(particleV_,0.,1); particleCloud.get_cellIDs(cellIDs_); // get ref to cellIDs //particleCloud.dataExchangeM().allocateArray(cellIDs_,0.,1); @@ -105,7 +107,7 @@ int main(int argc, char *argv[]) particleCloud.locateM().findCell(NULL,positions_,cellIDs_,particleCloud.numberOfParticles()); particleCloud.setPos(positions_); - particleCloud.voidFractionM().setvoidFraction(NULL,voidfractions_,particleWeights_,particleVolumes_); + particleCloud.voidFractionM().setvoidFraction(NULL,voidfractions_,particleWeights_,particleVolumes_,particleV_); voidfraction.internalField() = particleCloud.voidFractionM().voidFractionInterp(); voidfraction.correctBoundaryConditions(); @@ -135,6 +137,7 @@ int main(int argc, char *argv[]) particleCloud.dataExchangeM().destroy(voidfractions_,1); particleCloud.dataExchangeM().destroy(particleWeights_,1); particleCloud.dataExchangeM().destroy(particleVolumes_,1); + particleCloud.dataExchangeM().destroy(particleV_,1); //particleCloud.dataExchangeM().destroy(cellIDs_); // destroyed in cloud Info<< "End\n" << endl; diff --git a/applications/utilities/cfdemPostproc/createFields.H b/applications/utilities/cfdemPostproc/createFields.H index ab0ae8a..6856c6f 100644 --- a/applications/utilities/cfdemPostproc/createFields.H +++ b/applications/utilities/cfdemPostproc/createFields.H @@ -26,7 +26,7 @@ IOobject::NO_WRITE ), mesh, - dimensionedVector("0", dimensionSet(0, 1, -1, 0, 0), vector::zero) + dimensionedVector("0", dimensionSet(0, 1, -1, 0, 0), Foam::vector::zero) ); //======================== @@ -62,7 +62,7 @@ IOobject::AUTO_WRITE ), mesh, - dimensionedVector("0", dimensionSet(0, 1, -1, 0, 0), vector::zero) + dimensionedVector("0", dimensionSet(0, 1, -1, 0, 0), Foam::vector::zero) ); //======================== diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 0000000..4459954 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.dep +log_* +log.* +*~ diff --git a/doc/CFDEMcoupling_Manual.html b/doc/CFDEMcoupling_Manual.html index 4bce9e4..2af4e1b 100644 --- a/doc/CFDEMcoupling_Manual.html +++ b/doc/CFDEMcoupling_Manual.html @@ -164,7 +164,7 @@ In order to get the latest code version, please use the git repository at http:/

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 applicability", JFM. "A" requires the use of the force models gradPForce and viscForce, whereas "B" requires the force model "Archimedes". +

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

couplingInterval 
 
@@ -217,9 +217,11 @@ listing below of styles within certain commands. forceModel_DiFeliceDragforceModel_GidaspowDrag forceModel_KochHillDragforceModel_LaEuScalarTemp forceModel_MeiLiftforceModel_SchillerNaumannDrag -forceModel_ShirgaonkarIBforceModel_gradPForce -forceModel_noDragforceModel_particleCellVolume -forceModel_virtualMassForceforceModel_viscForce +forceModel_ShirgaonkarIBforceModel_fieldStore +forceModel_gradPForceforceModel_noDrag +forceModel_particleCellVolumeforceModel_virtualMassForce +forceModel_viscForceforceSubModel +forceSubModel_ImExforceSubModel_ImExCorr liggghtsCommandModelliggghtsCommandModel_execute liggghtsCommandModel_readLiggghtsDataliggghtsCommandModel_runLiggghts liggghtsCommandModel_writeLiggghtslocateModel diff --git a/doc/CFDEMcoupling_Manual.pdf b/doc/CFDEMcoupling_Manual.pdf index 11f58f2..95cb01e 100644 Binary files a/doc/CFDEMcoupling_Manual.pdf and b/doc/CFDEMcoupling_Manual.pdf differ diff --git a/doc/CFDEMcoupling_Manual.txt b/doc/CFDEMcoupling_Manual.txt index 65da209..2f80b73 100644 --- a/doc/CFDEMcoupling_Manual.txt +++ b/doc/CFDEMcoupling_Manual.txt @@ -133,7 +133,7 @@ Reasonable example settings for the "couplingProperties" dictionary are given in modelType :pre -"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 applicability", JFM. "A" requires the use of the force models gradPForce and viscForce, whereas "B" requires the force model "Archimedes". +"modelType" refers to the formulation of the equations to be solved. Choose "A", "B" or "Bfull", according to Zhou et al. (2010): "Discrete particle simulation of particle-fluid flow: model formulations and their applicability", JFM. "A" requires the use of the force models gradPForce and viscForce, whereas "B" requires the force model "Archimedes". "Bfull" refers to model type I. couplingInterval :pre @@ -221,6 +221,10 @@ Reasonable example settings for the "liggghtsCommands" dictionary are given in t + + + + @@ -261,11 +265,15 @@ listing below of styles within certain commands. "forceModel_MeiLift"_forceModel_MeiLift.html, "forceModel_SchillerNaumannDrag"_forceModel_SchillerNaumannDrag.html, "forceModel_ShirgaonkarIB"_forceModel_ShirgaonkarIB.html, +"forceModel_fieldStore"_forceModel_fieldStore.html, "forceModel_gradPForce"_forceModel_gradPForce.html, "forceModel_noDrag"_forceModel_noDrag.html, "forceModel_particleCellVolume"_forceModel_particleCellVolume.html, "forceModel_virtualMassForce"_forceModel_virtualMassForce.html, "forceModel_viscForce"_forceModel_viscForce.html, +"forceSubModel"_forceSubModel.html, +"forceSubModel_ImEx"_forceSubModel_ImEx.html, +"forceSubModel_ImExCorr"_forceSubModel_ImExCorr.html, "liggghtsCommandModel"_liggghtsCommandModel.html, "liggghtsCommandModel_execute"_liggghtsCommandModel_execute.html, "liggghtsCommandModel_readLiggghtsData"_liggghtsCommandModel_readLiggghtsData.html, diff --git a/doc/cfdemSolverPisoScalar.html b/doc/cfdemSolverPisoScalar.html index 599a219..191cd84 100644 --- a/doc/cfdemSolverPisoScalar.html +++ b/doc/cfdemSolverPisoScalar.html @@ -11,12 +11,14 @@

Description:

-

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

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

see:

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

+

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


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

The "standardClock" model is a basic clockModel model which measures the run time between every ".start(int arrayPos,string name)" and ".stop(string name)" statement placed in the code. If a ".start(name)" is called more than once (e.g. in a loop) the accumulated times are calculated. After the simulation has finished, the data is stored in $caseDir/CFD/clockData/$startTime/*.txt . Since the measurements are stored in an array, it is necessary to put a variable arrayPos (type integer) at the start command. Those do not need to be in ascending order and positions may be omitted. The standard size of this array is 30 and can be changed at the initialization of the standardClock class. If arrayPos is out of bounds, the array size will be doubled. The stop command does not need arrayPos, since the class remembers the positions. The string name is intended for easier evaluation afterwards an may be omitted like ".start(int arrayPos)" and ".stop()". The command ".stop(string name)" is a safety feature, because if the name is not equal to the started name, output will be produced for information. -After the case ran you may use the matPlot.py script located in $CFDEM_UT_DIR/vizClock/ to produce a graphical output of your measurements. The usage is like 'python < matPlot.py' and you have to be in the directory of the desired time step, where there is a file called "timeEvalFull.txt", which contains averaged and maximum data with respect to the number of processes. +After the case ran you may use the matPlot.py script located in $CFDEM_UT_DIR/vizClock/ to produce a graphical output of your measurements. The usage is like 'python < matPlot.py' and you have to be in the directory of the desired time step, where there is a file called "timeEvalFull.txt", which contains averaged and maximum data with respect to the number of processes. There is an alias called "vizClock" to run this python routine for visualizing the data.

Restrictions: none.

diff --git a/doc/clockModel_standardClock.txt b/doc/clockModel_standardClock.txt index 30d675c..bae9832 100644 --- a/doc/clockModel_standardClock.txt +++ b/doc/clockModel_standardClock.txt @@ -21,7 +21,7 @@ clockModel standardClock; :pre The "standardClock" model is a basic clockModel model which measures the run time between every ".start(int arrayPos,string name)" and ".stop(string name)" statement placed in the code. If a ".start(name)" is called more than once (e.g. in a loop) the accumulated times are calculated. After the simulation has finished, the data is stored in $caseDir/CFD/clockData/$startTime/*.txt . Since the measurements are stored in an array, it is necessary to put a variable {arrayPos} (type integer) at the start command. Those do not need to be in ascending order and positions may be omitted. The standard size of this array is 30 and can be changed at the initialization of the standardClock class. If {arrayPos} is out of bounds, the array size will be doubled. The stop command does not need {arrayPos}, since the class remembers the positions. The string name is intended for easier evaluation afterwards an may be omitted like ".start(int arrayPos)" and ".stop()". The command ".stop(string name)" is a safety feature, because if the name is not equal to the started name, output will be produced for information. -After the case ran you may use the matPlot.py script located in $CFDEM_UT_DIR/vizClock/ to produce a graphical output of your measurements. The usage is like 'python < matPlot.py' and you have to be in the directory of the desired time step, where there is a file called "timeEvalFull.txt", which contains averaged and maximum data with respect to the number of processes. +After the case ran you may use the matPlot.py script located in $CFDEM_UT_DIR/vizClock/ to produce a graphical output of your measurements. The usage is like 'python < matPlot.py' and you have to be in the directory of the desired time step, where there is a file called "timeEvalFull.txt", which contains averaged and maximum data with respect to the number of processes. There is an alias called "vizClock" to run this python routine for visualizing the data. [Restrictions:] none. diff --git a/doc/forceModel.html b/doc/forceModel.html index 411ada2..0e71fa5 100644 --- a/doc/forceModel.html +++ b/doc/forceModel.html @@ -33,7 +33,7 @@

Description:

-

The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. All force models selected are executed sequentially and the forces on the particles are superposed. +

The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. All force models selected are executed sequentially and the forces on the particles are superposed. If the fluid density field is needed, by default a field named "rho" will be used. Via the forceSubModel an alternative field can be chosen.

Restrictions:

diff --git a/doc/forceModel.txt b/doc/forceModel.txt index 790b110..4ae3a1a 100644 --- a/doc/forceModel.txt +++ b/doc/forceModel.txt @@ -31,7 +31,7 @@ Note: This examples list might not be complete - please look for other models (f [Description:] -The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. All force models selected are executed sequentially and the forces on the particles are superposed. +The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. All force models selected are executed sequentially and the forces on the particles are superposed. If the fluid density field is needed, by default a field named "rho" will be used. Via the forceSubModel an alternative field can be chosen. [Restrictions:] diff --git a/doc/forceModel_Archimedes.html b/doc/forceModel_Archimedes.html index 95e5156..8301478 100644 --- a/doc/forceModel_Archimedes.html +++ b/doc/forceModel_Archimedes.html @@ -19,13 +19,10 @@ ); ArchimedesProps { - densityFieldName "density"; gravityFieldName "gravity"; }; -