diff --git a/README b/README new file mode 100644 index 00000000..fd2ca756 --- /dev/null +++ b/README @@ -0,0 +1,81 @@ +/*---------------------------------------------------------------------------*\ + 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 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. +\*---------------------------------------------------------------------------*/ diff --git a/applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C b/applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C index 65eeb8f3..4d492df5 100644 --- a/applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C +++ b/applications/solvers/cfdemSolverPisoMS/cfdemSolverPisoMS.C @@ -137,7 +137,7 @@ int main(int argc, char *argv[]) // Pressure corrector fvScalarMatrix pEqn ( - fvm::laplacian(rUAvoidfraction, p) == fvc::div(phiGes) + fvc::ddt(voidfraction) + fvm::laplacian(rUAvoidfraction, p) == fvc::div(phiGes) + particleCloud.ddtVoidfraction() ); pEqn.setReference(pRefCell, pRefValue); diff --git a/doc/CFDEMcoupling_Manual.pdf b/doc/CFDEMcoupling_Manual.pdf index 17c9a420..d5912db0 100644 Binary files a/doc/CFDEMcoupling_Manual.pdf and b/doc/CFDEMcoupling_Manual.pdf differ diff --git a/doc/githubAccess_public.pdf b/doc/githubAccess_public.pdf index e72428f4..124b660f 100644 Binary files a/doc/githubAccess_public.pdf and b/doc/githubAccess_public.pdf differ diff --git a/src/lagrangian/cfdemParticle/Make/files b/src/lagrangian/cfdemParticle/Make/files index c212c7d9..5434353f 100644 --- a/src/lagrangian/cfdemParticle/Make/files +++ b/src/lagrangian/cfdemParticle/Make/files @@ -6,7 +6,6 @@ voidFractionModels = subModels/voidFractionModel locateModels = subModels/locateModel meshMotionModels = subModels/meshMotionModel momCoupleModels = subModels/momCoupleModel -regionModels = subModels/regionModel dataExchangeModels = subModels/dataExchangeModel averagingModels = subModels/averagingModel clockModels = subModels/clockModel @@ -21,20 +20,33 @@ $(forceModels)/forceModel/newForceModel.C $(forceModels)/noDrag/noDrag.C $(forceModels)/checkCouplingInterval/checkCouplingInterval.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)/fieldTimeAverage/fieldTimeAverage.C -$(forceModels)/volWeightedAverage/volWeightedAverage.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 @@ -64,21 +76,18 @@ $(locateModels)/turboEngineSearch/turboEngineSearch.C $(locateModels)/turboEngineSearchM2M/turboEngineSearchM2M.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 - $(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C $(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C $(dataExchangeModels)/oneWayVTK/oneWayVTK.C @@ -104,4 +113,4 @@ $(liggghtsCommandModels)/runLiggghts/runLiggghts.C $(liggghtsCommandModels)/writeLiggghts/writeLiggghts.C $(liggghtsCommandModels)/readLiggghtsData/readLiggghtsData.C -LIB = $(FOAM_USER_LIBBIN)/lib$(CFDEM_LIB_NAME) +LIB = $(CFDEM_LIB_DIR)/lib$(CFDEM_LIB_NAME) diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C b/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C index 073b9556..91e34758 100644 --- a/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudMS/cfdemCloudMS.C @@ -148,7 +148,6 @@ void Foam::cfdemCloudMS::giveDEMdata() { for(int i=0;i<3;i++){ impForcesCM()[index][i] += expForcesCM()[index][i] + DEMForcesCM()[index][i]; - Info << "index=" << index << " ,impForcesCM()[index][i]=" << impForcesCM()[index][i] << endl; } } if(forceM(0).coupleForce()) dataExchangeM().giveData("dragforce","vector-multisphere",impForcesCM()); @@ -254,9 +253,8 @@ label Foam::cfdemCloudMS::body(int index) label Foam::cfdemCloudMS::nrigid(int index) { -// return nrigids_[0][index]; - Warning << "Foam::cfdemCloudMS::nrigid: assuming all clumps are equal - LIGGGHTS' nrigid is not transferred correctly! " << endl; - return nrigids_[0][0]; + return nrigids_[0][index]; +// return nrigids_[0][0]; } const forceModel& Foam::cfdemCloudMS::forceM(int i) diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H index 4751eaa6..897f3333 100755 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H @@ -214,7 +214,7 @@ public: { if (particleCloud_.mesh().time().value()-particleCloud_.mesh().time().startTime().value() - ((1+couplingStep_)*(DEMts_*couplingInterval_)) - + SMALL > 0) // Chr 27.03.2013 : first coupling after DEMts_*couplingInterval_ + + 1e-10 > 0) // Chr 27.03.2013 : first coupling after DEMts_*couplingInterval_ // > particleCloud_.mesh().time().deltaT().value()/2) // Chr 27.03.2013 { return true; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C index 20cb77da..b90c593d 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C @@ -207,18 +207,15 @@ void DiFeliceDragMS::setForce() const ind=cloudRefMS().body(index); nrigidC=cloudRefMS().nrigid(ind); -cloudRefMS().impForcesCM(); -Warning <<"A BUG occurred in DiFeliceDragMS::setForce!!! nrigidC = " << nrigidC <<", ind = " << ind <<", index=" << index <<"\n" << endl; - if (nrigidC <= 0) { - Warning <<"A BUG occurred in DiFeliceDragMS::setForce!!! nrigidC = " << nrigidC <<", ind = " << ind <<", index=" << index <<"\n" << endl; + 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++){ - Info << "j=" << j << "ind=" << ind << endl; impForces()[index][j] += cloudRefMS().impForcesCM()[ind][j] / nrigidC; } } diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties index 62a18661..88b8b7fa 100644 --- a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/constant/couplingProperties @@ -25,7 +25,7 @@ FoamFile //===========================================================================// // sub-models & settings -verbose; +//verbose; modelType B; // A or B diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m index 6852ab2a..8da024e6 100644 --- a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/CFD/octave/totalPressureDrop.m @@ -5,6 +5,7 @@ clc; %====================================% % simulation data 1 %====================================% +rhoG = 5 % density in kg/m3 %path = '../probes/0/p'; path = '../probes/0/p'; columns=22; @@ -12,7 +13,7 @@ headerlines=4; data = loaddata(path,columns,headerlines); data=transpose(data); [x,y]=size(data) -dp_sim = (data(:,2)-data(:,y))/10000; +dp_sim = (data(:,2)-data(:,y))*rhoG; t_sim = data(:,1); %fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) ) @@ -55,14 +56,13 @@ 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') @@ -92,7 +92,7 @@ ReMF 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 @@ -104,7 +104,7 @@ 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]") +ylabel("pressure drop [Pa]") axis([0,Uend,0,dpErgun(length(dpErgun))]) %print('cfdemSolverPiso_settlingTest.eps','-deps2') diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init index 43159afc..3e9c9025 100755 --- a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/in.liggghts_init @@ -47,7 +47,7 @@ fix pdd1 all particledistribution/discrete 1. 1 pts1 1.0 group rigid_group region reg region bc cylinder z 0.0 0.0 0.012 0.001 0.055 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 1 #2500 # volumefraction_region 0.01 # +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 multisphere diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/post/dummy b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/post/dummy index 93cbd9a9..8767843c 100644 --- a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/post/dummy +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/DEM/post/dummy @@ -35,3 +35,14 @@ dummyfile dummyfile dummyfile dummyfile +dummyfile +dummyfile +dummyfile +dummyfile +dummyfile +dummyfile +dummyfile +dummyfile +dummyfile +dummyfile +dummyfile diff --git a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/parCFDDEMrun.sh index 7fa5abe0..6333f23b 100644 --- a/tutorials/cfdemSolverPisoMS/ErgunTestMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPisoMS/ErgunTestMPI/parCFDDEMrun.sh @@ -21,7 +21,7 @@ logfileName="log_$headerText" solverName="cfdemSolverPisoMS" nrProcs="2" machineFileName="none" # yourMachinefileName | none -debugMode="on" # on | off +debugMode="off" # on | off testHarnessPath="$CFDEM_TEST_HARNESS_PATH" cleanUp="true"