From 6a636658aa58ad5d99a86e3fb6ba48ac606492d0 Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Tue, 16 May 2017 13:55:12 +0200 Subject: [PATCH 01/35] added grid coarsening/particle coarsening corrections to Beetstra drag model --- .../forceModel/BeetstraDrag/BeetstraDrag.C | 209 +++++++++++++++++- .../forceModel/BeetstraDrag/BeetstraDrag.H | 29 +++ .../CFD/constant/couplingProperties | 11 +- 3 files changed, 236 insertions(+), 13 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C index 779a7a42..268a58cf 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C @@ -56,7 +56,16 @@ BeetstraDrag::BeetstraDrag UsFieldName_(propsDict_.lookup("granVelFieldName")), UsField_(sm.mesh().lookupObject (UsFieldName_)), scaleDia_(1.), - scaleDrag_(1.) + scaleDrag_(1.), + rhoP_(0.), + rho_(0.), + Lc2_(0.), + dPrim_(0.), + nuf_(0.), + g_(9.81), + k_(0.05), + useGC_(false), + usePC_(false) { //Append the field names to be probed particleCloud_.probeM().initialize(typeName, "BeetstraDrag.logDat"); @@ -83,6 +92,30 @@ BeetstraDrag::BeetstraDrag if (propsDict_.found("scaleDrag")) scaleDrag_=scalar(readScalar(propsDict_.lookup("scaleDrag"))); + if (propsDict_.found("useFilteredDragModel")) + { + useGC_ = true; + g_=propsDict_.lookupOrDefault("g", 9.81); + dPrim_=scalar(readScalar(propsDict_.lookup("dPrim"))); + rhoP_=scalar(readScalar(propsDict_.lookup("rhoP"))); + rho_=scalar(readScalar(propsDict_.lookup("rho"))); + nuf_=scalar(readScalar(propsDict_.lookup("nuf"))); + scalar ut = terminalVelocity(1., dPrim_, nuf_, rho_, rhoP_, g_); + scalar Frp = ut*ut/g_/dPrim_; + Lc2_ = ut*ut/g_*pow(Frp, -.6666667); // n is hardcoded as -2/3 + Info << "using grid coarsening correction with Lc2 = " << Lc2_ << " and ut = " << ut << " and Frp = " << Frp<< endl; + + if (propsDict_.found("useParcelSizeDependentFilteredDrag")) + { + usePC_ = true; + if (propsDict_.found("k")) + k_=scalar(readScalar(propsDict_.lookup("k"))); + Info << "using particle coarsening correction with k = " << k_ << endl; + } + } + + + } @@ -122,6 +155,8 @@ void BeetstraDrag::setForce() const scalar magUr(0); scalar Rep(0); scalar localPhiP(0); + scalar GCcorr(1.); + scalar PCcorr(1.); vector dragExplicit(0,0,0); scalar dragCoefficient(0); @@ -163,7 +198,7 @@ void BeetstraDrag::setForce() const Ur = Ufluid-Us; magUr = mag(Ur); ds = 2*particleCloud_.radius(index); - ds_scaled = ds/scaleDia_; + ds_scaled = ds/scaleDia_; rho = rhoField[cellI]; nuf = nufField[cellI]; @@ -172,14 +207,29 @@ void BeetstraDrag::setForce() const // calc particle's drag coefficient (i.e., Force per unit slip velocity and Stokes drag) - Rep=ds_scaled*voidfraction*magUr/nuf+SMALL; - dragCoefficient = 10.0*localPhiP/(voidfraction*voidfraction) + - voidfraction*voidfraction*(1.0+1.5*Foam::sqrt(localPhiP)) + - 0.413*Rep/(24*voidfraction*voidfraction)*(1.0/voidfraction+3*voidfraction*localPhiP+8.4*Foam::pow(Rep,-0.343))/ - (1+Foam::pow(10,3*localPhiP)*Foam::pow(Rep,-0.5*(1+4*localPhiP))); + Rep=ds_scaled*voidfraction*magUr/(nuf+SMALL); + dragCoefficient = F(Rep, voidfraction) + *3*M_PI*ds_scaled*nuf*rho*voidfraction + *scaleDia3*scaleDrag_; + + // calculate filtering corrections + if (useGC_) + { + GCcorr = 1.-h(localPhiP) + /( a(localPhiP) + *Lc2_ + /Foam::pow(U_.mesh().V()[cellI],.33333333) + + 1. + ); + if (usePC_) + { + PCcorr = Foam::exp(k_*(1.-scaleDia_)); + } + } + + // apply filtering corrections + dragCoefficient *= GCcorr*PCcorr; - // calc particle's drag - dragCoefficient *= 3*M_PI*ds_scaled*nuf*rho*voidfraction*scaleDia3*scaleDrag_; if (modelType_=="B") dragCoefficient /= voidfraction; @@ -200,6 +250,8 @@ void BeetstraDrag::setForce() const Pout << "nuf = " << nuf << endl; Pout << "voidfraction = " << voidfraction << endl; Pout << "Rep = " << Rep << endl; + Pout << "GCcorr = " << GCcorr << endl; + Pout << "PCcorr = " << PCcorr << endl; Pout << "drag = " << drag << endl; } @@ -220,6 +272,145 @@ void BeetstraDrag::setForce() const } } +/********************************************************* + * "Drag Force of Intermediate Reynolds Number Flow Past * + * Mono- and Bidisperse Arrays of Spheres", eq. 16 * + * R Beetstra, M. A. van der Hoef, JAM Kuipers * + * AIChE Journal 53(2) (2007) * + *********************************************************/ +double BeetstraDrag::F(double voidfraction, double Rep) const +{ + double localPhiP = max(SMALL,min(1.-SMALL,1.-voidfraction)); + return 10.0*localPhiP/(voidfraction*voidfraction) + + voidfraction*voidfraction*(1.0+1.5*Foam::sqrt(localPhiP)) + + 0.413*Rep/(24*voidfraction*voidfraction) + *(1.0/voidfraction + +3*voidfraction*localPhiP + +8.4*Foam::pow(Rep,-0.343) + ) + /(1+Foam::pow(10,3*localPhiP) + *Foam::pow(Rep,-0.5*(1+4*localPhiP)) + ); + +} + + +/********************************************************* + * "A drag model for filtered Euler-Lagange simulations * + * of clustered gas-particle suspension", * + * S. Radl, S. Sundaresan, * + * Chemical Engineering Science 117 (2014). * + *********************************************************/ +double BeetstraDrag::a(double phiP) const +{ + double a0m = 0.; + double a1m = 0.; + double a2m = 0.; + double a3m = 0.; + double phipam = 0.; + if (phiP < 0.016) + { + a0m = 21.51; + } + else if (phiP < 0.100) + { + a0m = 1.96; a1m = 29.40; a2m = 164.91; a3m = -1923.; + } + else if (phiP < 0.180) + { + a0m = 4.63; a1m = 4.68; a2m = -412.04; a3m = 2254.; phipam = 0.10; + } + else if (phiP < 0.250) + { + a0m = 3.52; a1m = -17.99; a2m = 128.80; a3m = -603.; phipam = 0.18; + } + else if (phiP < 0.400) + { + a0m = 2.68; a1m = -8.20; a2m = 2.18; a3m = 112.33; phipam = 0.25; + } + else + { + a0m = 1.79; + } + return a0m + a1m*(phiP-phipam) + a2m*pow(phiP-phipam,2.) + a3m*pow(phiP-phipam,3.); +} + +double BeetstraDrag::h(double phiP) const +{ + double h0m = 0.; + double h1m = 0.; + double h2m = 0.; + double h3m = 0.; + double phiphm = 0.; + + if (phiP < 0.03) + { + h1m = 7.97; + } + else if (phiP < 0.08) + { + h0m = 0.239; h1m = 4.640; h2m = -4.410; h3m = 253.630; phiphm = 0.03; + } + else if (phiP < 0.12) + { + h0m = 0.492; h1m = 6.100; h2m = 33.630; h3m = -789.600; phiphm = 0.08; + } + else if (phiP < 0.18) + { + h0m = 0.739; h1m = 5.010; h2m = -61.100; h3m = 310.800; phiphm = 0.12; + } + else if (phiP < 0.34) + { + h0m = 0.887; h1m = 1.030; h2m = -5.170; h3m = 5.990; phiphm = 0.18; + } + else if (phiP < 0.48) + { + h0m = 0.943; h1m = -0.170; h2m = -2.290; h3m = -9.120; phiphm = 0.34; + } + else if (phiP < 0.55) + { + h0m = 0.850; h1m = -1.350; h2m = -6.130; h3m = -132.600; phiphm = 0.48; + } + else + { + h0m = 0.680; h1m = -2.340; h2m = -225.200; phiphm = 0.55; + } + return h0m + h1m*(phiP-phiphm) + h2m*pow(phiP-phiphm,2) + h3m*pow(phiP-phiphm,3); +} + +double BeetstraDrag::terminalVelocity(double voidfraction, double dp, double nuf, double rhof, double rhop, double g) const +{ + scalar u0(dp*dp*fabs(rhof-rhop)*g/18./rhof/nuf); + scalar Re(u0*dp/nuf); + scalar res(1.); + scalar u(u0); + scalar Fi(0); + scalar CdSt(0); + Info << "uo: " << u0< 1.e-6) && (i<100)) + { + Info << "Iteration " << i; + u0 = u; + Info << ", u0 = " << u0; + CdSt = 24/Re; + Info << ", CdSt = " << CdSt; + Fi = F(voidfraction, Re); + Info << ", F = "; + u = sqrt(1.333333333*fabs(rhof-rhop)*g*dp + /(CdSt*voidfraction*Fi*rhof) + ); + Info << ", u = " << u; + Re = fabs(u)*dp/nuf*voidfraction; + res = fabs((u-u0)/u); + Info << "Res: " << res << endl; + i++; + } + if (res >1.e-6) + FatalError << "Terminal velocity calculation diverged!" << endl; + + return u; +} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H index a36ab894..ec59213f 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H @@ -59,6 +59,35 @@ private: mutable scalar scaleDrag_; + mutable scalar rhoP_; + + mutable scalar rho_; + + mutable scalar Lc2_; + + mutable scalar dPrim_; + + mutable scalar nuf_; + + mutable scalar g_; + + mutable scalar k_; + + bool useGC_; + + bool usePC_; + +protected: + double F(double, double) const; + + double terminalVelocity(double, double, double, double, double, double) const; + + double a(double) const; + + double h(double) const; + + + public: //- Runtime type information diff --git a/tutorials/cfdemSolverPiso/ErgunTestCG/CFD/constant/couplingProperties b/tutorials/cfdemSolverPiso/ErgunTestCG/CFD/constant/couplingProperties index 862de403..1216be50 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestCG/CFD/constant/couplingProperties +++ b/tutorials/cfdemSolverPiso/ErgunTestCG/CFD/constant/couplingProperties @@ -162,12 +162,15 @@ KochHillDragProps BeetstraDragProps { velFieldName "U"; - gravityFieldName "g"; - rhoParticle 2000.; voidfractionFieldName "voidfraction"; + granVelFieldName "Us"; interpolation true; - useFilteredDragModel ; - useParcelSizeDependentFilteredDrag ; +// useFilteredDragModel; +// useParcelSizeDependentFilteredDrag; + g 9.81; + rhoP 7000.; + rho 10.; + nuf 1.5e-4; k 0.05; aLimit 0.0; // verbose true; From 148990499dcbbc5abe59e6f55d56dab50cb81c0e Mon Sep 17 00:00:00 2001 From: danielque Date: Tue, 27 Mar 2018 14:43:04 +0200 Subject: [PATCH 02/35] clean up whitespaces use spaces, not tabs --- .../subModels/dataExchangeModel/oneWayVTK/oneWayVTK.C | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/oneWayVTK/oneWayVTK.C b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/oneWayVTK/oneWayVTK.C index af104f38..9031027d 100644 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/oneWayVTK/oneWayVTK.C +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/oneWayVTK/oneWayVTK.C @@ -173,10 +173,10 @@ void oneWayVTK::getData input >> just_read; // skip text for dataType // need to distinguish between file formats from dump custom/vtk and from LPP if(just_read.compare("3") == 0) - { - input >> just_read; - input >> just_read; - } + { + input >> just_read; + input >> just_read; + } for (int index = 0; index> field[index][0] >> field[index][1] >> field[index][2]; From 8754ca59528d5fc54825cd120cd47571c691096e Mon Sep 17 00:00:00 2001 From: danielque Date: Tue, 27 Mar 2018 15:25:30 +0200 Subject: [PATCH 03/35] replace vector(0,0,0) with vector::zero --- src/lagrangian/cfdemParticle/cfdTools/debugInfo.H | 4 ++-- src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H | 4 ++-- .../averagingModel/averagingModel/averagingModel.C | 2 +- .../subModels/forceModel/BeetstraDrag/BeetstraDrag.C | 6 +++--- .../subModels/forceModel/DiFeliceDrag/DiFeliceDrag.C | 6 +++--- .../subModels/forceModel/Fines/ErgunStatFines.C | 6 +++--- .../subModels/forceModel/Fines/FanningDynFines.C | 4 ++-- .../subModels/forceModel/GidaspowDrag/GidaspowDrag.C | 6 +++--- .../subModels/forceModel/KochHillDrag/KochHillDrag.C | 6 +++--- .../subModels/forceModel/KochHillRWDrag/KochHillRWDrag.C | 6 +++--- .../subModels/forceModel/forceModel/forceModel.C | 4 ++-- .../subModels/forceModel/gradPForce/gradPForce.C | 2 +- .../subModels/forceModel/interface/interface.C | 2 +- .../subModels/forceModel/viscForce/viscForce.C | 2 +- .../subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C | 2 +- .../momCoupleModel/explicitCouple/explicitCouple.C | 4 ++-- .../otherForceModel/expParticleForces/expParticleForces.C | 2 +- .../subModels/otherForceModel/gravity/gravity.C | 2 +- .../weightSecondaryPhase/weightSecondaryPhase.C | 2 +- 19 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/lagrangian/cfdemParticle/cfdTools/debugInfo.H b/src/lagrangian/cfdemParticle/cfdTools/debugInfo.H index 285e291f..f5968190 100755 --- a/src/lagrangian/cfdemParticle/cfdTools/debugInfo.H +++ b/src/lagrangian/cfdemParticle/cfdTools/debugInfo.H @@ -69,8 +69,8 @@ else { meanAlpha_field = 0; - meanU_field = vector(0,0,0); - meanUs_field = vector(0,0,0); + meanU_field = vector::zero; + meanUs_field = vector::zero; } meanUs_array /= numberOfParticles()+SMALL; meanR_array /= numberOfParticles()+SMALL; diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H index b17b6381..0f74cc1f 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H @@ -330,11 +330,11 @@ public: //access to the particle's rotation and torque data virtual inline double ** DEMTorques() const {return NULL;} virtual inline double ** omegaArray() const {return NULL;} - virtual vector omega(int) const {return vector(0,0,0);} + virtual vector omega(int) const {return vector::zero;} //access to the particles' orientation information virtual inline double ** exArray() const {return NULL;} - virtual vector ex(int) const {return vector(0,0,0);} + virtual vector ex(int) const {return vector::zero;} //Detector if SRF module is enable or not virtual inline bool SRFOn(){return false;} diff --git a/src/lagrangian/cfdemParticle/subModels/averagingModel/averagingModel/averagingModel.C b/src/lagrangian/cfdemParticle/subModels/averagingModel/averagingModel/averagingModel.C index c8d1cd22..ca82ba2d 100644 --- a/src/lagrangian/cfdemParticle/subModels/averagingModel/averagingModel/averagingModel.C +++ b/src/lagrangian/cfdemParticle/subModels/averagingModel/averagingModel/averagingModel.C @@ -81,7 +81,7 @@ void averagingModel::undoVectorAverage if(weightField[cellI] == weightP) { - fieldNext[cellI] = vector(0,0,0); + fieldNext[cellI] = vector::zero; }else { fieldNext[cellI] = (fieldNext[cellI]*weightField[cellI]-valueVec*weightP)/(weightField[cellI]-weightP); diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C index 58677ad3..b37eaba7 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C @@ -137,9 +137,9 @@ void BeetstraDrag::setForce() const for(int index = 0; index < particleCloud_.numberOfParticles(); ++index) { cellI = particleCloud_.cellIDs()[index][0]; - drag = vector(0,0,0); - dragExplicit = vector(0,0,0); - Ufluid =vector(0,0,0); + drag = vector::zero; + dragExplicit = vector::zero; + Ufluid = vector::zero; voidfraction=0; dragCoefficient = 0; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/DiFeliceDrag/DiFeliceDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/DiFeliceDrag/DiFeliceDrag.C index c15da1e1..8a7deab9 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/DiFeliceDrag/DiFeliceDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/DiFeliceDrag/DiFeliceDrag.C @@ -148,10 +148,10 @@ void DiFeliceDrag::setForce() const for(int index = 0; index < particleCloud_.numberOfParticles(); ++index) { cellI = particleCloud_.cellIDs()[index][0]; - drag = vector(0,0,0); - dragExplicit = vector(0,0,0); + drag = vector::zero; + dragExplicit = vector::zero; dragCoefficient=0; - Ufluid =vector(0,0,0); + Ufluid = vector::zero; if (cellI > -1) // particle Found { diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/ErgunStatFines.C b/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/ErgunStatFines.C index e229c15e..08fbf8b3 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/ErgunStatFines.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/ErgunStatFines.C @@ -164,10 +164,10 @@ void ErgunStatFines::setForce() const for(int index = 0; index < particleCloud_.numberOfParticles(); ++index) { cellI = particleCloud_.cellIDs()[index][0]; - drag = vector(0,0,0); - dragExplicit = vector(0,0,0); + drag = vector::zero; + dragExplicit = vector::zero; betaP = 0; - Ufluid = vector(0,0,0); + Ufluid = vector::zero; voidfraction = 0; dragCoefficient = 0; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/FanningDynFines.C b/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/FanningDynFines.C index 29cbdd36..0dffe38b 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/FanningDynFines.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/Fines/FanningDynFines.C @@ -120,8 +120,8 @@ void FanningDynFines::setForce() const for(int index = 0; index < particleCloud_.numberOfParticles(); ++index) { cellI = particleCloud_.cellIDs()[index][0]; - drag = vector(0,0,0); - UDyn = vector(0,0,0); + drag = vector::zero; + UDyn = vector::zero; dragCoefficient = 0; if (cellI > -1) // particle found diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/GidaspowDrag/GidaspowDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/GidaspowDrag/GidaspowDrag.C index 57bb5d3c..826d2a76 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/GidaspowDrag/GidaspowDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/GidaspowDrag/GidaspowDrag.C @@ -159,11 +159,11 @@ void GidaspowDrag::setForce() const //if(mask[index][0]) //{ cellI = particleCloud_.cellIDs()[index][0]; - drag = vector(0,0,0); - dragExplicit = vector(0,0,0); + drag = vector::zero; + dragExplicit = vector::zero; betaP = 0; Vs = 0; - Ufluid = vector(0,0,0); + Ufluid = vector::zero; voidfraction = 0; dragCoefficient = 0; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C index 7368d942..23f866ab 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C @@ -157,12 +157,12 @@ void KochHillDrag::setForce() const for (int index = 0; index -1) // particle Found diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillRWDrag/KochHillRWDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillRWDrag/KochHillRWDrag.C index 616069c8..5303c7fd 100755 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillRWDrag/KochHillRWDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/KochHillRWDrag/KochHillRWDrag.C @@ -200,12 +200,12 @@ void KochHillRWDrag::setForce() const //if (mask[index][0]) //{ cellI = particleCloud_.cellIDs()[index][0]; - drag = vector(0,0,0); - dragExplicit = vector(0,0,0); + drag = vector::zero; + dragExplicit = vector::zero; dragCoefficient = 0; betaP = 0; Vs = 0; - Ufluid = vector(0,0,0); + Ufluid = vector::zero; // Pout << "RW-TEST: cellI = " << cellI << endl; // TEST-Output if (cellI > -1) // particle Found diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.C b/src/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.C index 0b593924..4abb55af 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.C @@ -69,7 +69,7 @@ forceModel::forceModel IOobject::AUTO_WRITE ), sm.mesh(), - dimensionedVector("zero", dimensionSet(1,1,-2,0,0), vector(0,0,0)) // N + dimensionedVector("zero", dimensionSet(1,1,-2,0,0), vector::zero) // N ), expParticleForces_ ( IOobject @@ -81,7 +81,7 @@ forceModel::forceModel IOobject::AUTO_WRITE ), sm.mesh(), - dimensionedVector("zero", dimensionSet(1,1,-2,0,0), vector(0,0,0)) // N + dimensionedVector("zero", dimensionSet(1,1,-2,0,0), vector::zero) // N ), coupleForce_(true), modelType_(sm.modelType()), diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/gradPForce/gradPForce.C b/src/lagrangian/cfdemParticle/subModels/forceModel/gradPForce/gradPForce.C index 586579b7..ed8481ad 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/gradPForce/gradPForce.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/gradPForce/gradPForce.C @@ -160,7 +160,7 @@ void gradPForce::setForce() const { //if(mask[index][0]) //{ - force = vector(0,0,0); + force = vector::zero; cellI = particleCloud_.cellIDs()[index][0]; if (cellI > -1) // particle Found diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/interface/interface.C b/src/lagrangian/cfdemParticle/subModels/forceModel/interface/interface.C index ad77200e..33b44627 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/interface/interface.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/interface/interface.C @@ -142,7 +142,7 @@ Info << "interface::setForce" << endl; } // Initialize an interfaceForce vector - vector interfaceForce = Foam::vector(0,0,0); + vector interfaceForce = Foam::vector::zero; // Calculate the interfaceForce (range of alphap needed for stability) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C b/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C index 30762ce8..23b3298a 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C @@ -142,7 +142,7 @@ void viscForce::setForce() const { //if(mask[index][0]) //{ - force=vector(0,0,0); + force = vector::zero; cellI = particleCloud_.cellIDs()[index][0]; if (cellI > -1) // particle Found diff --git a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C index 7cb38d76..1bebcc2a 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModelMS/DiFeliceDragMS/DiFeliceDragMS.C @@ -156,7 +156,7 @@ void DiFeliceDragMS::setForce() const //{ cellI = cloudRefMS().cellIDCM(index); - drag = vector(0,0,0); + drag = vector::zero; if (cellI > -1) // particle Found { diff --git a/src/lagrangian/cfdemParticle/subModels/momCoupleModel/explicitCouple/explicitCouple.C b/src/lagrangian/cfdemParticle/subModels/momCoupleModel/explicitCouple/explicitCouple.C index 46e99223..da5238ac 100644 --- a/src/lagrangian/cfdemParticle/subModels/momCoupleModel/explicitCouple/explicitCouple.C +++ b/src/lagrangian/cfdemParticle/subModels/momCoupleModel/explicitCouple/explicitCouple.C @@ -73,7 +73,7 @@ explicitCouple::explicitCouple IOobject::NO_WRITE ), sm.mesh(), - dimensionedVector("zero", dimensionSet(1,-2,-2,0,0), vector(0,0,0)), // N/m3 + dimensionedVector("zero", dimensionSet(1,-2,-2,0,0), vector::zero), // N/m3 "zeroGradient" ), fNext_ @@ -86,7 +86,7 @@ explicitCouple::explicitCouple IOobject::NO_WRITE ), sm.mesh(), - dimensionedVector("zero", dimensionSet(1,-2,-2,0,0), vector(0,0,0)), // N/m3 + dimensionedVector("zero", dimensionSet(1,-2,-2,0,0), vector::zero), // N/m3 "zeroGradient" ), fLimit_(1e10,1e10,1e10) diff --git a/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C b/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C index e7818931..3e91a9aa 100644 --- a/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C +++ b/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C @@ -69,7 +69,7 @@ tmp expParticleForces::exportForceField() particleCloud_.mesh(), dimensionedVector ( - "zero",dimensionSet(1, -2, -2, 0, 0),vector(0,0,0) + "zero",dimensionSet(1, -2, -2, 0, 0),vector::zero ) ) ); diff --git a/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.C b/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.C index b4fcfe8e..3753b121 100644 --- a/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.C +++ b/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.C @@ -74,7 +74,7 @@ tmp gravity::exportForceField() particleCloud_.mesh(), dimensionedVector ( - "zero",dimensionSet(1, -2, -2, 0, 0),vector(0,0,0) + "zero",dimensionSet(1, -2, -2, 0, 0),vector::zero ) ) ); diff --git a/src/lagrangian/cfdemParticle/subModels/otherForceModel/weightSecondaryPhase/weightSecondaryPhase.C b/src/lagrangian/cfdemParticle/subModels/otherForceModel/weightSecondaryPhase/weightSecondaryPhase.C index 6e6fba8d..69d5ef63 100644 --- a/src/lagrangian/cfdemParticle/subModels/otherForceModel/weightSecondaryPhase/weightSecondaryPhase.C +++ b/src/lagrangian/cfdemParticle/subModels/otherForceModel/weightSecondaryPhase/weightSecondaryPhase.C @@ -78,7 +78,7 @@ tmp weightSecondaryPhase::exportForceField() particleCloud_.mesh(), dimensionedVector ( - "zero",dimensionSet(1, -2, -2, 0, 0),vector(0,0,0) + "zero",dimensionSet(1, -2, -2, 0, 0),vector::zero ) ) ); From 67ef631a6ca808797f4fa7a57b1e6c5598a638dd Mon Sep 17 00:00:00 2001 From: danielque Date: Tue, 27 Mar 2018 15:26:39 +0200 Subject: [PATCH 04/35] add -f option to rm in clean target of make files avoid make error in clean installations --- .../twoWayMany2Many/library/Makefile.fedora_fpic | 2 +- .../twoWayMany2Many/library/Makefile.fedora_fpic_debug | 2 +- .../dataExchangeModel/twoWayMany2Many/library/Makefile.g++ | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic index 4035f2a6..b2c8df9c 100644 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic @@ -27,7 +27,7 @@ lib: $(OBJ) $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) clean: - rm $(LIB) *.o *.d + rm -f $(LIB) *.o *.d # Compilation rules diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic_debug b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic_debug index 28614b91..4749e990 100644 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic_debug +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.fedora_fpic_debug @@ -27,7 +27,7 @@ lib: $(OBJ) $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) clean: - rm $(LIB) *.o *.d + rm -f $(LIB) *.o *.d # Compilation rules diff --git a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.g++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.g++ index 07e58076..cf4211d9 100644 --- a/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.g++ +++ b/src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library/Makefile.g++ @@ -26,7 +26,7 @@ lib: $(OBJ) $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) clean: - rm $(LIB) *.o *.d + rm -f $(LIB) *.o *.d # Compilation rules From 4063a2a103e6ccfa3516e748d0636fe6def78f0f Mon Sep 17 00:00:00 2001 From: danielque Date: Tue, 27 Mar 2018 17:52:49 +0200 Subject: [PATCH 05/35] fix reconstruction of twoSpheresGlowinskiMPI fixes #42 --- .../twoSpheresGlowinskiMPI/parCFDDEMrun.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) mode change 100644 => 100755 tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh diff --git a/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh old mode 100644 new mode 100755 index 967b517e..f496b3f1 --- a/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh @@ -22,6 +22,7 @@ solverName="cfdemSolverIB" nrProcs="4" machineFileName="none" # yourMachinefileName | none debugMode="off" # on | off| strict +reconstructCase="false" # true | false testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" postproc="false" @@ -30,6 +31,14 @@ postproc="false" #- call function to run a parallel CFD-DEM case parCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode +#- case needs special reconstruction +if [ $reconstructCase == "true" ] + then + cd $casePath/CFD + reconstructParMesh -mergeTol 1e-06 + reconstructPar -noLagrangian +fi + if [ $runOctave == "true" ] then @@ -60,9 +69,6 @@ if [ $postproc == "true" ] read fi -#- copy log file to test harness -cp ../../$logfileName $testHarnessPath - #- clean up case echo "deleting data at: $casePath" source $WM_PROJECT_DIR/bin/tools/CleanFunctions From 05907081c064c4bbbe11596dada6f9203561323f Mon Sep 17 00:00:00 2001 From: danielque Date: Tue, 27 Mar 2018 17:54:14 +0200 Subject: [PATCH 06/35] fix spelling of shell script variable --- .../cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh index 2dd14810..691b9397 100644 --- a/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh @@ -22,10 +22,10 @@ solverName="cfdemSolverPiso" nrProcs="4" machineFileName="none" # yourMachinefileName | none debugMode="off" # on | off| strict -reconstuctCase="true" # true | false +reconstructCase="true" # true | false testHarnessPath="$CFDEM_TEST_HARNESS_PATH" #--------------------------------------------------------------------------------# #- call function to run a parallel CFD-DEM case -parCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode $reconstuctCase +parCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode $reconstructCase From 5baa91df8103ba42adadefdae9ff551428dcbb5d Mon Sep 17 00:00:00 2001 From: danielque Date: Tue, 27 Mar 2018 17:55:51 +0200 Subject: [PATCH 07/35] use shell script variable to indicate meaning of parameter --- tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh b/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh index 3e8fcd20..f0d2ca8c 100644 --- a/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh +++ b/tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh @@ -22,6 +22,7 @@ solverName="cfdemSolverPiso" nrProcs="2" machineFileName="none" # yourMachinefileName | none debugMode="off" # on | off| strict +reconstructCase="true" # true | false testHarnessPath="$CFDEM_TEST_HARNESS_PATH" runOctave="true" cleanUp="true" @@ -29,7 +30,7 @@ postproc="false" #--------------------------------------------------------------------------------# #- call function to run a parallel CFD-DEM case -parCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode "true" +parCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode $reconstructCase if [ $runOctave == "true" ] then From e7a3e8de8f3dbc065acaddfcf2c4beb66f334b08 Mon Sep 17 00:00:00 2001 From: danielque Date: Wed, 4 Apr 2018 12:48:53 +0200 Subject: [PATCH 08/35] clean up whitespaces --- .../otherForceModel/expParticleForces/expParticleForces.C | 6 +++--- .../otherForceModel/expParticleForces/expParticleForces.H | 1 - .../subModels/otherForceModel/gravity/gravity.C | 6 +++--- .../subModels/otherForceModel/gravity/gravity.H | 3 +-- .../otherForceModel/otherForceModel/otherForceModel.H | 2 -- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C b/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C index 3e91a9aa..65bbe71d 100644 --- a/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C +++ b/src/lagrangian/cfdemParticle/subModels/otherForceModel/expParticleForces/expParticleForces.C @@ -73,14 +73,14 @@ tmp expParticleForces::exportForceField() ) ) ); - + volVectorField& source = tsource.ref(); - + // negative sign in sum because force on particles = - force on fluid for(int i=0; i gravity::exportForceField() ) ) ); - + volVectorField& source = tsource.ref(); - + source = rhoG_ * voidfraction_ * g_; - + return tsource; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.H b/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.H index b9e650b5..24efa9a7 100644 --- a/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.H +++ b/src/lagrangian/cfdemParticle/subModels/otherForceModel/gravity/gravity.H @@ -48,14 +48,13 @@ protected: word voidfractionFieldName_; const volScalarField& voidfraction_; - + word rhoGFieldName_; const volScalarField& rhoG_; const dimensionedVector g_; - public: //- Runtime type information diff --git a/src/lagrangian/cfdemParticle/subModels/otherForceModel/otherForceModel/otherForceModel.H b/src/lagrangian/cfdemParticle/subModels/otherForceModel/otherForceModel/otherForceModel.H index 5b7c2ac5..0813ba38 100644 --- a/src/lagrangian/cfdemParticle/subModels/otherForceModel/otherForceModel/otherForceModel.H +++ b/src/lagrangian/cfdemParticle/subModels/otherForceModel/otherForceModel/otherForceModel.H @@ -47,7 +47,6 @@ protected: cfdemCloud& particleCloud_; - public: //- Runtime type information @@ -95,7 +94,6 @@ public: // Member Functions - virtual tmp exportForceField() = 0; }; From 0411ae0d801475e707e091ee049d584fbd266c4d Mon Sep 17 00:00:00 2001 From: danielque Date: Wed, 4 Apr 2018 14:46:53 +0200 Subject: [PATCH 09/35] clean up whitespaces --- applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C b/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C index 73ec3fca..8f1a8534 100644 --- a/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C +++ b/applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C @@ -81,7 +81,7 @@ int main(int argc, char *argv[]) { particleCloud.smoothingM().smoothen(particleCloud.forceM(0).impParticleForces()); } - + Info << "update Ksl.internalField()" << endl; Ksl = particleCloud.momCoupleM(0).impMomSource(); Ksl.correctBoundaryConditions(); From e66de2bbc9b0972a53512ff07b90604c71137e95 Mon Sep 17 00:00:00 2001 From: danielque Date: Wed, 4 Apr 2018 14:54:00 +0200 Subject: [PATCH 10/35] bump version number to 18.03 --- etc/bashrc | 2 +- etc/cshrc | 2 +- src/lagrangian/cfdemParticle/cfdTools/versionInfo.H | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/etc/bashrc b/etc/bashrc index 00f84d39..159fdf83 100755 --- a/etc/bashrc +++ b/etc/bashrc @@ -17,7 +17,7 @@ #------------------------------------------------------------------------------ export CFDEM_PROJECT=CFDEM -export CFDEM_VERSION=17.08 +export CFDEM_VERSION=18.03 ################################################################################ # USER EDITABLE PART: Changes made here may be lost with the next upgrade diff --git a/etc/cshrc b/etc/cshrc index 3ae372da..e2ac96a0 100755 --- a/etc/cshrc +++ b/etc/cshrc @@ -15,7 +15,7 @@ #------------------------------------------------------------------------------ setenv CFDEM_PROJECT CFDEM -setenv CFDEM_VERSION 17.08 +setenv CFDEM_VERSION 18.03 ################################################################################ # USER EDITABLE PART: Changes made here may be lost with the next upgrade diff --git a/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H b/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H index bebaac8c..43650545 100755 --- a/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H +++ b/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H @@ -34,8 +34,8 @@ Description #ifndef versionInfo_H #define versionInfo_H -word CFDEMversion="PFM 17.08"; -word compatibleLIGGGHTSversion="PFM 17.08"; +word CFDEMversion="PFM 18.03"; +word compatibleLIGGGHTSversion="PFM 18.03"; word OFversion="4.x"; Info << "\nCFDEMcoupling version: " << CFDEMversion << endl; From d5d37233ef0eb77dc871810aef1cbea8057aa852 Mon Sep 17 00:00:00 2001 From: danielque Date: Wed, 4 Apr 2018 17:30:35 +0200 Subject: [PATCH 11/35] update .gitignore file for tutorials * ignore any files in any DEM/post/ folder * ignore any processor directories in CFD folders * ignore all time directories except '0' in CFD folders --- tutorials/.gitignore | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tutorials/.gitignore b/tutorials/.gitignore index 6154fdee..a41c02d3 100644 --- a/tutorials/.gitignore +++ b/tutorials/.gitignore @@ -6,3 +6,16 @@ log_* log.* *~ +**/DEM/post/* +**/CFD/processor*/ +**/CFD/0*/ +**/CFD/1*/ +**/CFD/2*/ +**/CFD/3*/ +**/CFD/4*/ +**/CFD/5*/ +**/CFD/6*/ +**/CFD/7*/ +**/CFD/8*/ +**/CFD/9*/ +!**/CFD/0/ From 771dd7e6d05ac13da35e7751184b6ac88acf5f65 Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Thu, 12 Apr 2018 11:06:46 +0200 Subject: [PATCH 12/35] Initial commit for cfdemSolverRhoSimple. New heat transfer model to treat granular temperature as field to be solved on a grid. --- .../solvers/cfdemSolverRhoPimple/EEqn.H | 4 - .../cfdemSolverRhoPimple.C | 4 + .../solvers/cfdemSolverRhoSimple/EEqn.H | 57 +++++ .../solvers/cfdemSolverRhoSimple/Make/files | 3 + .../solvers/cfdemSolverRhoSimple/Make/options | 32 +++ .../solvers/cfdemSolverRhoSimple/UEqn.H | 32 +++ .../cfdemSolverRhoSimple.C | 141 ++++++++++ .../cfdemSolverRhoSimple/createFieldRefs.H | 2 + .../cfdemSolverRhoSimple/createFields.H | 242 ++++++++++++++++++ .../solvers/cfdemSolverRhoSimple/pEqn.H | 80 ++++++ etc/solver-list.txt | 1 + src/lagrangian/cfdemParticle/Make/files | 3 +- .../cfdemCloudEnergy/cfdemCloudEnergy.C | 6 + .../cfdemCloudEnergy/cfdemCloudEnergy.H | 2 + .../energyModel/energyModel/energyModel.H | 2 + .../heatTransferGunn/heatTransferGunn.C | 184 +++++++++++-- .../heatTransferGunn/heatTransferGunn.H | 74 ++++-- .../heatTransferGunnPartField.C | 149 +++++++++++ .../heatTransferGunnPartField.H | 93 +++++++ .../ZehnerSchluenderThermCond.C | 149 +++++++++++ .../ZehnerSchluenderThermCond.H | 107 ++++++++ src/lagrangian/cfdemParticleComp/Make/files | 3 +- 22 files changed, 1308 insertions(+), 62 deletions(-) create mode 100644 applications/solvers/cfdemSolverRhoSimple/EEqn.H create mode 100644 applications/solvers/cfdemSolverRhoSimple/Make/files create mode 100644 applications/solvers/cfdemSolverRhoSimple/Make/options create mode 100644 applications/solvers/cfdemSolverRhoSimple/UEqn.H create mode 100644 applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C create mode 100644 applications/solvers/cfdemSolverRhoSimple/createFieldRefs.H create mode 100644 applications/solvers/cfdemSolverRhoSimple/createFields.H create mode 100644 applications/solvers/cfdemSolverRhoSimple/pEqn.H create mode 100644 src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C create mode 100644 src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H create mode 100644 src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C create mode 100644 src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H diff --git a/applications/solvers/cfdemSolverRhoPimple/EEqn.H b/applications/solvers/cfdemSolverRhoPimple/EEqn.H index 606d9fe2..fc770162 100644 --- a/applications/solvers/cfdemSolverRhoPimple/EEqn.H +++ b/applications/solvers/cfdemSolverRhoPimple/EEqn.H @@ -52,8 +52,4 @@ thermo.correct(); Info<< "T max/min : " << max(T).value() << " " << min(T).value() << endl; - - particleCloud.clockM().start(31,"postFlow"); - particleCloud.postFlow(); - particleCloud.clockM().stop("postFlow"); } diff --git a/applications/solvers/cfdemSolverRhoPimple/cfdemSolverRhoPimple.C b/applications/solvers/cfdemSolverRhoPimple/cfdemSolverRhoPimple.C index b9cf2fcb..39fa85cc 100644 --- a/applications/solvers/cfdemSolverRhoPimple/cfdemSolverRhoPimple.C +++ b/applications/solvers/cfdemSolverRhoPimple/cfdemSolverRhoPimple.C @@ -139,6 +139,10 @@ int main(int argc, char *argv[]) } } + particleCloud.clockM().start(31,"postFlow"); + particleCloud.postFlow(); + particleCloud.clockM().stop("postFlow"); + runTime.write(); diff --git a/applications/solvers/cfdemSolverRhoSimple/EEqn.H b/applications/solvers/cfdemSolverRhoSimple/EEqn.H new file mode 100644 index 00000000..3dbb5c3f --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/EEqn.H @@ -0,0 +1,57 @@ +// contributions to internal energy equation can be found in +// Crowe et al.: "Multiphase flows with droplets and particles", CRC Press 1998 +{ + // dim he = J / kg + volScalarField& he = thermo.he(); + particleCloud.energyContributions(Qsource); + particleCloud.energyCoefficients(QCoeff); + + //thDiff=particleCloud.thermCondM().thermDiff(); + thCond=particleCloud.thermCondM().thermCond(); + + addSource = + ( + he.name() == "e" + ? + fvc::div(phi, K) + + fvc::div + ( + fvc::absolute(phi/fvc::interpolate(rho), voidfraction*U), + p, + "div(phiv,p)" + ) + : fvc::div(phi, K) + ); + + Cpv = he.name() == "e" ? thermo.Cv() : thermo.Cp(); + + + fvScalarMatrix EEqn + ( + fvm::div(phi, he) + + addSource + - Qsource + - fvm::Sp(QCoeff/Cpv, he) + - fvm::laplacian(voidfraction*thCond/Cpv,he) + == + fvOptions(rho, he) + ); + + + EEqn.relax(); + + fvOptions.constrain(EEqn); + + EEqn.solve(); + + fvOptions.correct(he); + + thermo.correct(); + + Info<< "T max/min : " << max(T).value() << " " << min(T).value() << endl; + + + particleCloud.clockM().start(31,"energySolve"); + particleCloud.solve(); + particleCloud.clockM().stop("energySolve"); +} diff --git a/applications/solvers/cfdemSolverRhoSimple/Make/files b/applications/solvers/cfdemSolverRhoSimple/Make/files new file mode 100644 index 00000000..d9db0744 --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/Make/files @@ -0,0 +1,3 @@ +cfdemSolverRhoSimple.C + +EXE=$(CFDEM_APP_DIR)/cfdemSolverRhoSimple diff --git a/applications/solvers/cfdemSolverRhoSimple/Make/options b/applications/solvers/cfdemSolverRhoSimple/Make/options new file mode 100644 index 00000000..0377ece5 --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/Make/options @@ -0,0 +1,32 @@ +include $(CFDEM_ADD_LIBS_DIR)/additionalLibs + +PFLAGS+= -Dcompre + +EXE_INC = \ + $(PFLAGS) \ + -I$(CFDEM_OFVERSION_DIR) \ + -I$(LIB_SRC)/transportModels/compressible/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \ + -I$(LIB_SRC)/finiteVolume/cfdTools \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/lnInclude \ + -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/cfdTools \ + +EXE_LIBS = \ + -L$(CFDEM_LIB_DIR)\ + -lcompressibleTransportModels \ + -lfluidThermophysicalModels \ + -lspecie \ + -lturbulenceModels \ + -lcompressibleTurbulenceModels \ + -lfiniteVolume \ + -lmeshTools \ + -lsampling \ + -lfvOptions \ + -l$(CFDEM_LIB_COMP_NAME) \ + $(CFDEM_ADD_LIB_PATHS) \ + $(CFDEM_ADD_LIBS) diff --git a/applications/solvers/cfdemSolverRhoSimple/UEqn.H b/applications/solvers/cfdemSolverRhoSimple/UEqn.H new file mode 100644 index 00000000..c4a58ad2 --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/UEqn.H @@ -0,0 +1,32 @@ +// Solve the Momentum equation +particleCloud.otherForces(fOther); + +tmp tUEqn +( + fvm::div(phi, U) + + particleCloud.divVoidfractionTau(U, voidfraction) + + fvm::Sp(Ksl,U) + - fOther + == + fvOptions(rho, U) +); +fvVectorMatrix& UEqn = tUEqn.ref(); + +UEqn.relax(); + +fvOptions.constrain(UEqn); + +if (modelType=="B" || modelType=="Bfull") +{ + solve(UEqn == -fvc::grad(p)+ Ksl*Us); + + fvOptions.correct(U); + K = 0.5*magSqr(U); +} +else +{ + solve(UEqn == -voidfraction*fvc::grad(p)+ Ksl*Us); + + fvOptions.correct(U); + K = 0.5*magSqr(U); +} diff --git a/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C new file mode 100644 index 00000000..1b020f9f --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C @@ -0,0 +1,141 @@ +/*---------------------------------------------------------------------------*\ +License + + This 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. + + This code 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 this code. If not, see . + + Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria + +Application + cfdemSolverRhoPimple + +Description + Transient solver for compressible flow using the flexible PIMPLE (PISO-SIMPLE) + algorithm. + Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected. + The code is an evolution of the solver rhoPimpleFoam in OpenFOAM(R) 4.x, + where additional functionality for CFD-DEM coupling is added. +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "psiThermo.H" +#include "turbulentFluidThermoModel.H" +#include "bound.H" +#include "simpleControl.H" +#include "fvOptions.H" +#include "localEulerDdtScheme.H" +#include "fvcSmooth.H" + +#include "cfdemCloudEnergy.H" +#include "implicitCouple.H" +#include "clockModel.H" +#include "smoothingModel.H" +#include "forceModel.H" +#include "thermCondModel.H" +#include "energyModel.H" + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + #include "postProcess.H" + + #include "setRootCase.H" + #include "createTime.H" + #include "createMesh.H" + #include "createControl.H" + #include "createTimeControls.H" + #include "createRDeltaT.H" + #include "initContinuityErrs.H" + #include "createFields.H" + #include "createFieldRefs.H" + #include "createFvOptions.H" + + // create cfdemCloud + #include "readGravitationalAcceleration.H" + cfdemCloudEnergy particleCloud(mesh); + #include "checkModelType.H" + + turbulence->validate(); + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info<< "\nStarting time loop\n" << endl; + + while (simple.loop()) + { + particleCloud.clockM().start(1,"Global"); + + Info<< "Time = " << runTime.timeName() << nl << endl; + + // do particle stuff + particleCloud.clockM().start(2,"Coupling"); + bool hasEvolved = particleCloud.evolve(voidfraction,Us,U); + + if(hasEvolved) + { + particleCloud.smoothingM().smoothen(particleCloud.forceM(0).impParticleForces()); + } + + Info << "update Ksl.internalField()" << endl; + Ksl = particleCloud.momCoupleM(0).impMomSource(); + Ksl.correctBoundaryConditions(); + + //Force Checks + vector fTotal(0,0,0); + vector fImpTotal = sum(mesh.V()*Ksl.primitiveFieldRef()*(Us.primitiveFieldRef()-U.primitiveFieldRef())); + reduce(fImpTotal, sumOp()); + Info << "TotalForceExp: " << fTotal << endl; + Info << "TotalForceImp: " << fImpTotal << endl; + + #include "solverDebugInfo.H" + particleCloud.clockM().stop("Coupling"); + + particleCloud.clockM().start(26,"Flow"); + + volScalarField rhoeps("rhoeps",rho*voidfraction); + // --- Pressure-velocity PIMPLE corrector loop + { + #include "UEqn.H" + #include "EEqn.H" + + // besides this pEqn, OF offers a "simple consistent"-option + #include "pEqn.H" + rhoeps=rho*voidfraction; + + turbulence->correct(); + } + + particleCloud.clockM().start(32,"postFlow"); + particleCloud.postFlow(); + particleCloud.clockM().stop("postFlow"); + + runTime.write(); + + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + + particleCloud.clockM().stop("Flow"); + particleCloud.clockM().stop("Global"); + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/cfdemSolverRhoSimple/createFieldRefs.H b/applications/solvers/cfdemSolverRhoSimple/createFieldRefs.H new file mode 100644 index 00000000..5842906a --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/createFieldRefs.H @@ -0,0 +1,2 @@ +const volScalarField& T = thermo.T(); +const volScalarField& psi = thermo.psi(); diff --git a/applications/solvers/cfdemSolverRhoSimple/createFields.H b/applications/solvers/cfdemSolverRhoSimple/createFields.H new file mode 100644 index 00000000..a9225229 --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/createFields.H @@ -0,0 +1,242 @@ +Info<< "Reading thermophysical properties\n" << endl; + + autoPtr pThermo + ( + psiThermo::New(mesh) + ); + psiThermo& thermo = pThermo(); + thermo.validate(args.executable(), "h", "e"); + volScalarField& p = thermo.p(); + + Info<< "Reading field rho\n" << endl; + volScalarField rho + ( + IOobject + ( + "rho", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + thermo.rho() + ); + + + Info<< "Reading field U\n" << endl; + volVectorField U + ( + IOobject + ( + "U", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + ); + + Info<< "\nReading voidfraction field voidfraction = (Vgas/Vparticle)\n" << endl; + volScalarField voidfraction + ( + IOobject + ( + "voidfraction", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + ); + + volScalarField addSource + ( + IOobject + ( + "addSource", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + ); + + Info<< "\nCreating fluid-particle heat flux field\n" << endl; + volScalarField Qsource + ( + IOobject + ( + "Qsource", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("zero", dimensionSet(1,-1,-3,0,0,0,0), 0.0) + ); + + Info<< "\nCreating fluid-particle heat flux coefficient field\n" << endl; + volScalarField QCoeff + ( + IOobject + ( + "QCoeff", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("zero", dimensionSet(1,-1,-3,-1,0,0,0), 0.0) + ); + + Info<< "\nCreating thermal conductivity field\n" << endl; + volScalarField thCond + ( + IOobject + ( + "thCond", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("zero", dimensionSet(1,1,-3,-1,0,0,0), 0.0) + ); + + Info<< "\nCreating heat capacity field\n" << endl; + volScalarField Cpv + ( + IOobject + ( + "Cpv", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("zero", dimensionSet(0,2,-2,-1,0,0,0), 0.0) + ); + + Info<< "\nCreating body force field\n" << endl; + volVectorField fOther + ( + IOobject + ( + "fOther", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh, + dimensionedVector("zero", dimensionSet(1,-2,-2,0,0,0,0), vector::zero) + ); + + Info<< "Reading/calculating face flux field phi\n" << endl; + surfaceScalarField phi + ( + IOobject + ( + "phi", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + linearInterpolate(rho*U*voidfraction) & mesh.Sf() + ); + + dimensionedScalar rhoMax + ( + dimensionedScalar::lookupOrDefault + ( + "rhoMax", + simple.dict(), + dimDensity, + GREAT + ) + ); + + dimensionedScalar rhoMin + ( + dimensionedScalar::lookupOrDefault + ( + "rhoMin", + simple.dict(), + dimDensity, + 0 + ) + ); + + Info<< "Creating turbulence model\n" << endl; + autoPtr turbulence + ( + compressible::turbulenceModel::New + ( + rho, + U, + phi, + thermo + ) + ); + + label pRefCell = 0; + scalar pRefValue = 0.0; + setRefCell(p, simple.dict(), pRefCell, pRefValue); + + mesh.setFluxRequired(p.name()); + + Info<< "Creating field dpdt\n" << endl; + volScalarField dpdt + ( + IOobject + ( + "dpdt", + runTime.timeName(), + mesh + ), + mesh, + dimensionedScalar("dpdt", p.dimensions()/dimTime, 0) + ); + + Info<< "Creating field kinetic energy K\n" << endl; + volScalarField K("K", 0.5*magSqr(U)); + + Info<< "\nReading momentum exchange field Ksl\n" << endl; + volScalarField Ksl + ( + IOobject + ( + "Ksl", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + //dimensionedScalar("0", dimensionSet(1, -3, -1, 0, 0), 1.0) + ); + + + Info<< "Reading particle velocity field Us\n" << endl; + volVectorField Us + ( + IOobject + ( + "Us", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + ); + +//=============================== diff --git a/applications/solvers/cfdemSolverRhoSimple/pEqn.H b/applications/solvers/cfdemSolverRhoSimple/pEqn.H new file mode 100644 index 00000000..a85e7f44 --- /dev/null +++ b/applications/solvers/cfdemSolverRhoSimple/pEqn.H @@ -0,0 +1,80 @@ +rho = thermo.rho(); +rho = max(rho, rhoMin); +rho = min(rho, rhoMax); +rho.relax(); + +volScalarField rAU(1.0/UEqn.A()); +surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rhoeps*rAU)); +if (modelType=="A") +{ + rhorAUf *= fvc::interpolate(voidfraction); +} +volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); + +surfaceScalarField phiUs("phiUs", fvc::interpolate(rhoeps*rAU*Ksl*Us)& mesh.Sf()); + + +if (simple.transonic()) +{ +// transonic version not implemented yet +} +else +{ + surfaceScalarField phiHbyA + ( + "phiHbyA", + ( + fvc::flux(rhoeps*HbyA) + ) + ); + + // flux without pressure gradient contribution + phi = phiHbyA + phiUs; + + // Update the pressure BCs to ensure flux consistency + constrainPressure(p, rhoeps, U, phi, rhorAUf); + + while (simple.correctNonOrthogonal()) + { + // Pressure corrector + fvScalarMatrix pEqn + ( + fvc::div(phi) + - fvm::laplacian(rhorAUf, p) + == + fvOptions(psi, p, rho.name()) + ); + + pEqn.setReference(pRefCell, pRefValue); + + pEqn.solve(); + + if (simple.finalNonOrthogonalIter()) + { + phi += pEqn.flux(); + } + } +} + +// Explicitly relax pressure for momentum corrector +p.relax(); + +// Recalculate density from the relaxed pressure +rho = thermo.rho(); +rho = max(rho, rhoMin); +rho = min(rho, rhoMax); +rho.relax(); +Info<< "rho max/min : " << max(rho).value() + << " " << min(rho).value() << endl; + +if (modelType=="A") +{ + U = HbyA - rAU*(voidfraction*fvc::grad(p)-Ksl*Us); +} +else +{ + U = HbyA - rAU*(fvc::grad(p)-Ksl*Us); +} +U.correctBoundaryConditions(); +fvOptions.correct(U); +K = 0.5*magSqr(U); diff --git a/etc/solver-list.txt b/etc/solver-list.txt index 9d9911fa..60c0eb39 100644 --- a/etc/solver-list.txt +++ b/etc/solver-list.txt @@ -1,5 +1,6 @@ cfdemSolverPisoMS/dir cfdemSolverPiso/dir cfdemSolverRhoPimple/dir +cfdemSolverRhoSimple/dir cfdemSolverIB/dir cfdemSolverPisoScalar/dir diff --git a/src/lagrangian/cfdemParticle/Make/files b/src/lagrangian/cfdemParticle/Make/files index 7cc1c491..b1b8e9e8 100644 --- a/src/lagrangian/cfdemParticle/Make/files +++ b/src/lagrangian/cfdemParticle/Make/files @@ -32,12 +32,13 @@ $(cfdTools)/newGlobal.C $(energyModels)/energyModel/energyModel.C $(energyModels)/energyModel/newEnergyModel.C $(energyModels)/heatTransferGunn/heatTransferGunn.C -$(energyModels)/heatTransferGunnImplicit/heatTransferGunnImplicit.C +$(energyModels)/heatTransferGunnPartField/heatTransferGunnPartField.C $(energyModels)/reactionHeat/reactionHeat.C $(thermCondModels)/thermCondModel/thermCondModel.C $(thermCondModels)/thermCondModel/newThermCondModel.C $(thermCondModels)/SyamlalThermCond/SyamlalThermCond.C +$(thermCondModels)/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C $(thermCondModels)/noTherm/noThermCond.C $(forceModels)/forceModel/forceModel.C diff --git a/src/lagrangian/cfdemParticle/derived/cfdemCloudEnergy/cfdemCloudEnergy.C b/src/lagrangian/cfdemParticle/derived/cfdemCloudEnergy/cfdemCloudEnergy.C index 1ed2727b..4a2f44d3 100644 --- a/src/lagrangian/cfdemParticle/derived/cfdemCloudEnergy/cfdemCloudEnergy.C +++ b/src/lagrangian/cfdemParticle/derived/cfdemCloudEnergy/cfdemCloudEnergy.C @@ -169,6 +169,12 @@ void cfdemCloudEnergy::postFlow() energyModel_[i]().postFlow(); } +void cfdemCloudEnergy::solve() +{ + for (int i=0;i("expNusselt",false)), interpolation_(propsDict_.lookupOrDefault("interpolation",false)), verbose_(propsDict_.lookupOrDefault("verbose",false)), + implicit_(propsDict_.lookupOrDefault("implicit",true)), QPartFluidName_(propsDict_.lookupOrDefault("QPartFluidName","QPartFluid")), QPartFluid_ ( IOobject @@ -58,13 +60,26 @@ heatTransferGunn::heatTransferGunn sm.mesh(), dimensionedScalar("zero", dimensionSet(1,-1,-3,0,0,0,0), 0.0) ), + QPartFluidCoeffName_(propsDict_.lookupOrDefault("QPartFluidCoeffName","QPartFluidCoeff")), + QPartFluidCoeff_ + ( IOobject + ( + QPartFluidCoeffName_, + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimensionSet(1,-1,-3,-1,0,0,0), 0.0) + ), partTempField_ ( IOobject ( "particleTemp", sm.mesh().time().timeName(), sm.mesh(), - IOobject::NO_READ, + IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), sm.mesh(), @@ -108,6 +123,8 @@ heatTransferGunn::heatTransferGunn ), partRefTemp_("partRefTemp", dimensionSet(0,0,0,1,0,0,0), 0.0), calcPartTempField_(propsDict_.lookupOrDefault("calcPartTempField",false)), + calcPartTempAve_(propsDict_.lookupOrDefault("calcPartTempAve",false)), + partTempAve_(0.0), tempFieldName_(propsDict_.lookupOrDefault("tempFieldName","T")), tempField_(sm.mesh().lookupObject (tempFieldName_)), voidfractionFieldName_(propsDict_.lookupOrDefault("voidfractionFieldName","voidfraction")), @@ -121,32 +138,47 @@ heatTransferGunn::heatTransferGunn partTemp_(NULL), partHeatFluxName_(propsDict_.lookup("partHeatFluxName")), partHeatFlux_(NULL), + partHeatFluxCoeff_(NULL), partRe_(NULL), partNu_(NULL) { - allocateMyArrays(); + allocateMyArrays(); if (propsDict_.found("maxSource")) { maxSource_=readScalar(propsDict_.lookup ("maxSource")); Info << "limiting eulerian source field to: " << maxSource_ << endl; } + if (calcPartTempField_) { + calcPartTempAve_ = true; if (propsDict_.found("partRefTemp")) + { partRefTemp_.value()=readScalar(propsDict_.lookup ("partRefTemp")); + } partTempField_.writeOpt() = IOobject::AUTO_WRITE; partRelTempField_.writeOpt() = IOobject::AUTO_WRITE; partTempField_.write(); partRelTempField_.write(); Info << "Particle temperature field activated." << endl; } + + if (!implicit_) + { + QPartFluidCoeff_.writeOpt() = IOobject::NO_WRITE; + } + if (verbose_) { ReField_.writeOpt() = IOobject::AUTO_WRITE; NuField_.writeOpt() = IOobject::AUTO_WRITE; ReField_.write(); NuField_.write(); + if (expNusselt_) + { + FatalError <<"Cannot read and create NuField at the same time!\n" << abort(FatalError); + } } } @@ -159,6 +191,10 @@ heatTransferGunn::~heatTransferGunn() particleCloud_.dataExchangeM().destroy(partHeatFlux_,1); particleCloud_.dataExchangeM().destroy(partRe_,1); particleCloud_.dataExchangeM().destroy(partNu_,1); + if (implicit_) + { + particleCloud_.dataExchangeM().destroy(partHeatFluxCoeff_,1); + } } // * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * // @@ -168,6 +204,10 @@ void heatTransferGunn::allocateMyArrays() const double initVal=0.0; particleCloud_.dataExchangeM().allocateArray(partTemp_,initVal,1); // field/initVal/with/lenghtFromLigghts particleCloud_.dataExchangeM().allocateArray(partHeatFlux_,initVal,1); + if(implicit_) + { + particleCloud_.dataExchangeM().allocateArray(partHeatFluxCoeff_,initVal,1); + } if(verbose_) { @@ -227,6 +267,7 @@ void heatTransferGunn::calcEnergyContribution() scalar Rep(0); scalar Pr(0); scalar Nup(0); + scalar Tsum(0.0); interpolationCellPoint voidfractionInterpolator_(voidfraction_); @@ -265,13 +306,12 @@ void heatTransferGunn::calcEnergyContribution() Nup = Nusselt(voidfraction, Rep, Pr); - + Tsum += partTemp_[index][0]; scalar h = kf0_ * Nup / ds; scalar As = ds * ds * M_PI; // surface area of sphere // calc convective heat flux [W] heatFlux(index, h, As, Tfluid); - heatFluxCoeff(index, h, As); if(verbose_) { @@ -295,6 +335,16 @@ void heatTransferGunn::calcEnergyContribution() } } + // gather particle temperature sums and obtain average + if(calcPartTempAve_) + { + reduce(Tsum, sumOp()); + partTempAve_ = Tsum / particleCloud_.numberOfParticles(); + Info << "mean particle temperature = " << partTempAve_ << endl; + } + + if(calcPartTempField_) partTempField(); + particleCloud_.averagingM().setScalarSum ( QPartFluid_, @@ -305,6 +355,21 @@ void heatTransferGunn::calcEnergyContribution() QPartFluid_.primitiveFieldRef() /= -QPartFluid_.mesh().V(); + if(implicit_) + { + QPartFluidCoeff_.primitiveFieldRef() = 0.0; + + particleCloud_.averagingM().setScalarSum + ( + QPartFluidCoeff_, + partHeatFluxCoeff_, + particleCloud_.particleWeights(), + NULL + ); + + QPartFluidCoeff_.primitiveFieldRef() /= -QPartFluidCoeff_.mesh().V(); + } + if(verbose_) { ReField_.primitiveFieldRef() = 0.0; @@ -329,22 +394,22 @@ void heatTransferGunn::calcEnergyContribution() ); } - // limit source term - forAll(QPartFluid_,cellI) + // limit source term in explicit treatment + if(!implicit_) { - scalar EuFieldInCell = QPartFluid_[cellI]; - - if(mag(EuFieldInCell) > maxSource_ ) + forAll(QPartFluid_,cellI) { - Pout << "limiting source term\n" << endl ; - QPartFluid_[cellI] = sign(EuFieldInCell) * maxSource_; + scalar EuFieldInCell = QPartFluid_[cellI]; + + if(mag(EuFieldInCell) > maxSource_ ) + { + Pout << "limiting source term\n" << endl ; + QPartFluid_[cellI] = sign(EuFieldInCell) * maxSource_; + } } } QPartFluid_.correctBoundaryConditions(); - - giveData(0); - } void heatTransferGunn::addEnergyContribution(volScalarField& Qsource) const @@ -352,6 +417,14 @@ void heatTransferGunn::addEnergyContribution(volScalarField& Qsource) const Qsource += QPartFluid_; } +void heatTransferGunn::addEnergyCoefficient(volScalarField& Qsource) const +{ + if(implicit_) + { + Qsource += QPartFluidCoeff_; + } +} + scalar heatTransferGunn::Nusselt(scalar voidfraction, scalar Rep, scalar Pr) const { return (7 - 10 * voidfraction + 5 * voidfraction * voidfraction) * @@ -362,22 +435,77 @@ scalar heatTransferGunn::Nusselt(scalar voidfraction, scalar Rep, scalar Pr) con void heatTransferGunn::heatFlux(label index, scalar h, scalar As, scalar Tfluid) { - partHeatFlux_[index][0] = h * As * (Tfluid - partTemp_[index][0]); -} - -void heatTransferGunn::heatFluxCoeff(label index, scalar h, scalar As) -{ - //no heat transfer coefficient in explicit model -} - -void heatTransferGunn::giveData(int call) -{ - if(call == 0) + scalar hAs = h * As; + partHeatFlux_[index][0] = - hAs * partTemp_[index][0]; + if(!implicit_) { - Info << "total convective particle-fluid heat flux [W] (Eulerian) = " << gSum(QPartFluid_*1.0*QPartFluid_.mesh().V()) << endl; - - particleCloud_.dataExchangeM().giveData(partHeatFluxName_,"scalar-atom", partHeatFlux_); + partHeatFlux_[index][0] += hAs * Tfluid; } + else + { + partHeatFluxCoeff_[index][0] = hAs; + } +} + +void heatTransferGunn::giveData() +{ + Info << "total convective particle-fluid heat flux [W] (Eulerian) = " << gSum(QPartFluid_*1.0*QPartFluid_.mesh().V()) << endl; + + particleCloud_.dataExchangeM().giveData(partHeatFluxName_,"scalar-atom", partHeatFlux_); +} + +void heatTransferGunn::postFlow() +{ + if(implicit_) + { + label cellI; + scalar Tfluid(0.0); + scalar Tpart(0.0); + interpolationCellPoint TInterpolator_(tempField_); + + for(int index = 0;index < particleCloud_.numberOfParticles(); ++index) + { + cellI = particleCloud_.cellIDs()[index][0]; + if(cellI >= 0) + { + if(interpolation_) + { + vector position = particleCloud_.position(index); + Tfluid = TInterpolator_.interpolate(position,cellI); + } + else + { + Tfluid = tempField_[cellI]; + } + + Tpart = partTemp_[index][0]; + partHeatFlux_[index][0] = (Tfluid - Tpart) * partHeatFluxCoeff_[index][0]; + } + } + } + giveData(); +} + +scalar heatTransferGunn::aveTpart() const +{ + return partTempAve_; +} + +void heatTransferGunn::partTempField() +{ + partTempField_.primitiveFieldRef() = 0.0; + particleCloud_.averagingM().resetWeightFields(); + particleCloud_.averagingM().setScalarAverage + ( + partTempField_, + partTemp_, + particleCloud_.particleWeights(), + particleCloud_.averagingM().UsWeightField(), + NULL + ); + + dimensionedScalar aveTemp("aveTemp",dimensionSet(0,0,0,1,0,0,0), partTempAve_); + partRelTempField_ = (partTempField_ - aveTemp) / (aveTemp - partRefTemp_); } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.H b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.H index 4862e5ed..aa6facf7 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.H +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.H @@ -15,7 +15,7 @@ License along with this code. If not, see . Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria - + Description Correlation for Nusselt number according to Gunn, D. J. International Journal of Heat and Mass Transfer 21.4 (1978) @@ -44,27 +44,39 @@ class heatTransferGunn protected: dictionary propsDict_; - + + bool expNusselt_; + bool interpolation_; - + bool verbose_; - + + bool implicit_; + word QPartFluidName_; - + volScalarField QPartFluid_; - - volScalarField partTempField_; - + + word QPartFluidCoeffName_; + + volScalarField QPartFluidCoeff_; + + mutable volScalarField partTempField_; + volScalarField partRelTempField_; - + volScalarField ReField_; - + volScalarField NuField_; - + dimensionedScalar partRefTemp_; - + bool calcPartTempField_; + bool calcPartTempAve_; + + scalar partTempAve_; + word tempFieldName_; const volScalarField& tempField_; // ref to temperature field @@ -78,33 +90,35 @@ protected: word velFieldName_; const volVectorField& U_; - + word densityFieldName_; - + const volScalarField& rho_; word partTempName_; - mutable double **partTemp_; // Lagrangian array + mutable double **partTemp_; word partHeatFluxName_; - mutable double **partHeatFlux_; // Lagrangian array - + mutable double **partHeatFlux_; + + mutable double **partHeatFluxCoeff_; + mutable double **partRe_; - + mutable double **partNu_; void allocateMyArrays() const; - + + void partTempField(); + scalar Nusselt(scalar, scalar, scalar) const; - - virtual void giveData(int); - + + virtual void giveData(); + virtual void heatFlux(label, scalar, scalar, scalar); - - virtual void heatFluxCoeff(label, scalar, scalar); - + public: //- Runtime type information @@ -128,10 +142,14 @@ public: // Member Functions void addEnergyContribution(volScalarField&) const; - - void addEnergyCoefficient(volScalarField&) const {} - + + void addEnergyCoefficient(volScalarField&) const; + void calcEnergyContribution(); + + void postFlow(); + + scalar aveTpart() const; }; diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C new file mode 100644 index 00000000..9ac88758 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------*\ +License + + This 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. + + This code 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 this code. If not, see . + + Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria + +\*---------------------------------------------------------------------------*/ + +#include "error.H" +#include "heatTransferGunnPartField.H" +#include "addToRunTimeSelectionTable.H" +#include "thermCondModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(heatTransferGunnPartField, 0); + +addToRunTimeSelectionTable(energyModel, heatTransferGunnPartField, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +heatTransferGunnPartField::heatTransferGunnPartField +( + const dictionary& dict, + cfdemCloudEnergy& sm +) +: + heatTransferGunn(dict,sm), + fvOptions(fv::options::New(sm.mesh())), + thermCondModel_ + ( + thermCondModel::New + ( + propsDict_, + sm + ) + ) +{ + if(!implicit_) + { + FatalError << "heatTransferGunnPartField requires implicit heat transfer treatment." << abort(FatalError); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +heatTransferGunnPartField::~heatTransferGunnPartField() +{ +} + +// * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * // +// * * * * * * * * * * * * * * * * Member Fct * * * * * * * * * * * * * * * // +void heatTransferGunnPartField::calcEnergyContribution() +{ + heatTransferGunn::calcEnergyContribution(); + // if heat sources in particles present, pull them here +} + +void heatTransferGunnPartField::addEnergyContribution(volScalarField& Qsource) const +{ + Qsource -= QPartFluidCoeff_*partTempField_; +} + +void heatTransferGunnPartField::giveData() +{ + particleCloud_.dataExchangeM().giveData(partTempName_,"scalar-atom", partTemp_); +} + +void heatTransferGunnPartField::postFlow() +{ + label cellI; + scalar Tpart(0.0); + interpolationCellPoint partTInterpolator_(partTempField_); + + for(int index = 0;index < particleCloud_.numberOfParticles(); ++index) + { + cellI = particleCloud_.cellIDs()[index][0]; + if(cellI >= 0) + { + if(interpolation_) + { + vector position = particleCloud_.position(index); + Tpart = partTInterpolator_.interpolate(position,cellI); + } + else + { + Tpart = partTempField_[cellI]; + } + partTemp_[index][0] = Tpart; + } + } + + giveData(); +} + +void heatTransferGunnPartField::solve() +{ +//use gasT and QCoeff to solve particle temp eqn + volScalarField Qsource = QPartFluidCoeff_*tempField_; + volScalarField alphaP = 1.0 - voidfraction_; + volScalarField thCond = thermCondModel_().thermCond(); + + fvScalarMatrix partTEqn + ( + Qsource + - fvm::Sp(QPartFluidCoeff_, partTempField_) + - fvm::laplacian(alphaP*thCond,partTempField_) + == + fvOptions(rho_, partTempField_) + ); + // if transient add time derivative - need particle density and specific heat fields + // if sources activated add sources + // if convection activated add convection + + partTEqn.relax(); + + fvOptions.constrain(partTEqn); + + partTEqn.solve(); + + fvOptions.correct(partTempField_); + + Info<< "partT max/min : " << max(partTempField_).value() << " " << min(partTempField_).value() << endl; + +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H new file mode 100644 index 00000000..12ae0d82 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H @@ -0,0 +1,93 @@ +/*---------------------------------------------------------------------------*\ +License + + This 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. + + This code 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 this code. If not, see . + + Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria + + Description + Correlation for Nusselt number according to + Gunn, D. J. International Journal of Heat and Mass Transfer 21.4 (1978) + +\*---------------------------------------------------------------------------*/ + +#ifndef heatTransferGunnPartField_H +#define heatTransferGunnPartField_H + +#include "fvCFD.H" +#include "cfdemCloudEnergy.H" +#include "heatTransferGunn.H" +#include "fvOptions.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +class thermCondModel; +/*---------------------------------------------------------------------------*\ + Class heatTransferGunnPartField Declaration +\*---------------------------------------------------------------------------*/ + +class heatTransferGunnPartField +: + public heatTransferGunn +{ +private: + + fv::options& fvOptions; + + autoPtr thermCondModel_; + + void giveData(); + +public: + + //- Runtime type information + TypeName("heatTransferGunnPartField"); + + // Constructors + + //- Construct from components + heatTransferGunnPartField + ( + const dictionary& dict, + cfdemCloudEnergy& sm + ); + + + // Destructor + + virtual ~heatTransferGunnPartField(); + + + // Member Functions + void addEnergyContribution(volScalarField&) const; + + void calcEnergyContribution(); + + void postFlow(); + + void solve(); + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C new file mode 100644 index 00000000..b0241cf2 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------*\ +License + + This 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. + + This code 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 this code. If not, see . + + Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria + +\*---------------------------------------------------------------------------*/ + +#include "error.H" +#include "ZehnerSchluenderThermCond.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(ZehnerSchluenderThermCond, 0); + +addToRunTimeSelectionTable +( + thermCondModel, + ZehnerSchluenderThermCond, + dictionary +); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +ZehnerSchluenderThermCond::ZehnerSchluenderThermCond +( + const dictionary& dict, + cfdemCloud& sm +) +: + thermCondModel(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + voidfractionFieldName_(propsDict_.lookupOrDefault("voidfractionFieldName","voidfraction")), + voidfraction_(sm.mesh().lookupObject (voidfractionFieldName_)), + ks0_(transportProperties_.lookup("ks")), + wallQFactorName_(propsDict_.lookupOrDefault("wallQFactorName","wallQFactor")), + wallQFactor_ + ( IOobject + ( + wallQFactorName_, + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimensionSet(0,0,0,0,0,0,0), 1.0) + ), + hasWallQFactor_(false) +{ + if (wallQFactor_.headerOk()) + { + Info << "Found field for scaling wall heat flux.\n" << endl; + hasWallQFactor_ = true; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +ZehnerSchluenderThermCond::~ZehnerSchluenderThermCond() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +tmp ZehnerSchluenderThermCond::thermCond() const +{ + tmp tvf + ( + new volScalarField + ( + IOobject + ( + "tmpThCond", + voidfraction_.instance(), + voidfraction_.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + voidfraction_.mesh(), + dimensionedScalar("zero", dimensionSet(1,1,-3,-1,0,0,0), 0.0) + ) + ); + + volScalarField& svf = tvf.ref(); + + scalar A = ks0_.value()/kf0_.value(); + scalar B = 0.0; + scalar C = 0.0; + scalar k = 0.0; + scalar OnemBoA = 0.0; + scalar voidfraction = 0.0; + scalar w = 7.26e-3; + + forAll(svf, cellI) + { + voidfraction = voidfraction_[cellI]; + B = 1.25 * Foam::pow((1 - voidfraction) / voidfraction, 1.11); + OnemBoA = 1.0 - B/A; + C = (A - 1) / (OnemBoA * OnemBoA) * B/A * log(A/B) - (B - 1)/OnemBoA - 0.5 * (B + 1); + C *= 2.0 / OnemBoA; + k = Foam::sqrt(1 - voidfraction) * (w * A + (1 - w) * C) * kf0_.value(); + svf[cellI] = k / (1 - voidfraction); + } + + // if a wallQFactor field is present, use it to scale heat transport through a patch + if (hasWallQFactor_) + { + wallQFactor_.correctBoundaryConditions(); + forAll(wallQFactor_.boundaryField(), patchi) + svf.boundaryFieldRef()[patchi] *= wallQFactor_.boundaryField()[patchi]; + } + + return tvf; +} + +tmp ZehnerSchluenderThermCond::thermDiff() const +{ + FatalError << "ZehnerSchluenderThermCond does not provide thermal diffusivity." << abort(FatalError); +} + + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H new file mode 100644 index 00000000..12320d75 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ +License + + This 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. + + This code 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 this code. If not, see . + + Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria + + +Description + thermal conductivity of PARTICLE phase in presence of a fluid according to + Zehner and Schluender (1970) + +Class + ZehnerSchluenderThermCond + +SourceFiles + ZehnerSchluenderThermCond.C + +\*---------------------------------------------------------------------------*/ + + +#ifndef ZehnerSchluenderThermCond_H +#define ZehnerSchluenderThermCond_H + +#include "thermCondModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class ZehnerSchluenderThermCond Declaration +\*---------------------------------------------------------------------------*/ + +class ZehnerSchluenderThermCond +: + public thermCondModel +{ + +private: + + dictionary propsDict_; + + word voidfractionFieldName_; + + const volScalarField& voidfraction_; + + dimensionedScalar ks0_; + + word wallQFactorName_; + + // ratio of half-cell-size and near-wall film + mutable volScalarField wallQFactor_; + + bool hasWallQFactor_; + +public: + + //- Runtime type information + TypeName("ZehnerSchluenderThermCond"); + + + // Constructors + + //- Construct from components + ZehnerSchluenderThermCond + ( + const dictionary& dict, + cfdemCloud& sm + ); + + // Destructor + + ~ZehnerSchluenderThermCond(); + + + // Member Functions + + tmp thermCond() const; + + tmp thermDiff() const; + + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticleComp/Make/files b/src/lagrangian/cfdemParticleComp/Make/files index b119a3b3..0613c1cf 100644 --- a/src/lagrangian/cfdemParticleComp/Make/files +++ b/src/lagrangian/cfdemParticleComp/Make/files @@ -31,12 +31,13 @@ $(cfdTools)/newGlobal.C $(energyModels)/energyModel/energyModel.C $(energyModels)/energyModel/newEnergyModel.C $(energyModels)/heatTransferGunn/heatTransferGunn.C -$(energyModels)/heatTransferGunnImplicit/heatTransferGunnImplicit.C +$(energyModels)/heatTransferGunnPartField/heatTransferGunnPartField.C $(energyModels)/reactionHeat/reactionHeat.C $(thermCondModels)/thermCondModel/thermCondModel.C $(thermCondModels)/thermCondModel/newThermCondModel.C $(thermCondModels)/SyamlalThermCond/SyamlalThermCond.C +$(thermCondModels)/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C $(thermCondModels)/noTherm/noThermCond.C $(forceModels)/forceModel/forceModel.C From 76ea1af1abb02951aed8671352084a431a650089 Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Fri, 13 Apr 2018 11:19:08 +0200 Subject: [PATCH 13/35] CFDEMcloud can now hold particle types and densities. Heat transfer model needs to know heat capacities to solve T eqn. --- .../cfdemSolverRhoSimple.C | 17 +++--- .../cfdemParticle/cfdemCloud/cfdemCloud.C | 46 ++++++++++++++- .../cfdemParticle/cfdemCloud/cfdemCloud.H | 19 +++++- .../cfdemParticle/cfdemCloud/cfdemCloudI.H | 36 ++++++++++++ .../heatTransferGunnPartField.C | 58 ++++++++++++++++--- .../heatTransferGunnPartField.H | 10 +++- .../ZehnerSchluenderThermCond.C | 25 +++++--- 7 files changed, 181 insertions(+), 30 deletions(-) diff --git a/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C index 1b020f9f..e960b40b 100644 --- a/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C +++ b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C @@ -105,17 +105,16 @@ int main(int argc, char *argv[]) particleCloud.clockM().start(26,"Flow"); volScalarField rhoeps("rhoeps",rho*voidfraction); - // --- Pressure-velocity PIMPLE corrector loop - { - #include "UEqn.H" - #include "EEqn.H" + // Pressure-velocity SIMPLE corrector - // besides this pEqn, OF offers a "simple consistent"-option - #include "pEqn.H" - rhoeps=rho*voidfraction; + #include "UEqn.H" + #include "EEqn.H" - turbulence->correct(); - } + // besides this pEqn, OF offers a "simple consistent"-option + #include "pEqn.H" + rhoeps=rho*voidfraction; + + turbulence->correct(); particleCloud.clockM().start(32,"postFlow"); particleCloud.postFlow(); diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index 89e2cead..5d132ddd 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -83,6 +83,8 @@ cfdemCloud::cfdemCloud ignore_(false), allowCFDsubTimestep_(true), limitDEMForces_(false), + getParticleDensities_(couplingProperties_.lookupOrDefault("getParticleDensities",false)), + getParticleTypes_(couplingProperties_.lookupOrDefault("getParticleTypes",false)), modelType_(couplingProperties_.lookup("modelType")), positions_(NULL), velocities_(NULL), @@ -127,6 +129,19 @@ cfdemCloud::cfdemCloud mesh, dimensionedScalar("zero", dimensionSet(0,0,-1,0,0), 0) // 1/s ), + particleDensityField_ + ( + IOobject + ( + "partRho", + mesh.time().timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + mesh, + dimensionedScalar("zero", dimensionSet(1,-3,0,0,0), 0.0) + ), checkPeriodicCells_(false), turbulence_ ( @@ -358,6 +373,8 @@ cfdemCloud::~cfdemCloud() dataExchangeM().destroy(particleWeights_,1); dataExchangeM().destroy(particleVolumes_,1); dataExchangeM().destroy(particleV_,1); + if(getParticleDensities_) dataExchangeM().destroy(particleDensities_,1); + if(getParticleTypes_) dataExchangeM().destroy(particleTypes_,1); } // * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * // @@ -369,6 +386,9 @@ void cfdemCloud::getDEMdata() if(impDEMdragAcc_) dataExchangeM().getData("dragAcc","vector-atom",fAcc_); // array is used twice - might be necessary to clean it first + + if(getParticleDensities_) dataExchangeM().getData("density","scalar-atom",particleDensities_); + if(getParticleTypes_) dataExchangeM().getData("type","scalar-atom",particleTypes_); } void cfdemCloud::giveDEMdata() @@ -446,6 +466,25 @@ void cfdemCloud::setParticleForceField() ); } +void cfdemCloud::setScalarAverages() +{ + if(!getParticleDensities_) return; + if(verbose_) Info << "- setScalarAverage" << endl; + + particleDensityField_.primitiveFieldRef() = 0.0; + averagingM().resetWeightFields(); + averagingM().setScalarAverage + ( + particleDensityField_, + particleDensities_, + particleWeights_, + averagingM().UsWeightField(), + NULL + ); + + if(verbose_) Info << "setScalarAverage done." << endl; +} + void cfdemCloud::setVectorAverages() { if(verbose_) Info << "- setVectorAverage(Us,velocities_,weights_)" << endl; @@ -598,7 +637,8 @@ bool cfdemCloud::evolve clockM().stop("setvoidFraction"); // set average particles velocity field - clockM().start(20,"setVectorAverage"); + clockM().start(20,"setAverages"); + setScalarAverages(); setVectorAverages(); @@ -612,7 +652,7 @@ bool cfdemCloud::evolve if(!treatVoidCellsAsExplicitForce()) smoothingM().smoothenReferenceField(averagingM().UsNext()); - clockM().stop("setVectorAverage"); + clockM().stop("setAverages"); } //============================================ @@ -703,6 +743,8 @@ bool cfdemCloud::reAllocArrays() dataExchangeM().allocateArray(particleWeights_,0.,voidFractionM().maxCellsPerParticle()); dataExchangeM().allocateArray(particleVolumes_,0.,voidFractionM().maxCellsPerParticle()); dataExchangeM().allocateArray(particleV_,0.,1); + if(getParticleDensities_) dataExchangeM().allocateArray(particleDensities_,0.,1); + if(getParticleTypes_) dataExchangeM().allocateArray(particleTypes_,0.,1); arraysReallocated_ = true; return true; } diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H index 0f74cc1f..1b3f78cf 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H @@ -96,6 +96,10 @@ protected: bool limitDEMForces_; + bool getParticleDensities_; + + bool getParticleTypes_; + scalar maxDEMForce_; const word modelType_; @@ -122,6 +126,10 @@ protected: mutable int **cellIDs_; + mutable double **particleDensities_; + + mutable int **particleTypes_; + mutable double **particleWeights_; mutable double **particleVolumes_; @@ -162,6 +170,8 @@ protected: mutable volScalarField ddtVoidfraction_; + mutable volScalarField particleDensityField_; + mutable Switch checkPeriodicCells_; const turbulenceModel& turbulence_; @@ -205,6 +215,8 @@ protected: virtual void setParticleForceField(); + virtual void setScalarAverages(); + virtual void setVectorAverages(); public: @@ -323,9 +335,10 @@ public: virtual inline int maxType() {return -1;} virtual inline bool multipleTypesDMax() {return false;} virtual inline bool multipleTypesDMin() {return false;} - virtual inline double ** particleDensity() const {return NULL;} - virtual inline int ** particleTypes() const {return NULL;} - virtual label particleType(label index) const {return -1;} + virtual inline double ** particleDensity() const; + virtual inline double particleDensity(label index) const; + virtual inline int ** particleTypes() const; + virtual inline label particleType(label index) const; //access to the particle's rotation and torque data virtual inline double ** DEMTorques() const {return NULL;} diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H index 2fbe1744..56ddfa48 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H @@ -216,6 +216,42 @@ inline double cfdemCloud::d32(bool recalc) return d32_; } +inline double ** cfdemCloud::particleDensity() const +{ + if(!getParticleDensities_) return NULL; + else + { + return particleDensities_; + } +} + +inline double cfdemCloud::particleDensity(label index) const +{ + if(!getParticleDensities_) return -1.0; + else + { + return particleDensities_[index][0]; + } +} + +inline int ** cfdemCloud::particleTypes() const +{ + if(!getParticleTypes_) return NULL; + else + { + return particleTypes_; + } +} + +inline label cfdemCloud::particleType(label index) const +{ + if(!getParticleDensities_) return -1; + else + { + return particleTypes_[index][0]; + } +} + inline int cfdemCloud::numberOfParticles() const { return numberOfParticles_; diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C index 9ac88758..6e354810 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C @@ -44,7 +44,22 @@ heatTransferGunnPartField::heatTransferGunnPartField ) : heatTransferGunn(dict,sm), - fvOptions(fv::options::New(sm.mesh())), + partCpField_ + ( + IOobject + ( + "partCp", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimensionSet(0,2,-2,-1,0,0,0), 0.0), + "zeroGradient" + ), + partRhoField_(sm.mesh().lookupObject("partRho")), + partCp_(NULL), thermCondModel_ ( thermCondModel::New @@ -52,12 +67,15 @@ heatTransferGunnPartField::heatTransferGunnPartField propsDict_, sm ) - ) + ), + fvOptions(fv::options::New(sm.mesh())) { if(!implicit_) { FatalError << "heatTransferGunnPartField requires implicit heat transfer treatment." << abort(FatalError); } + + allocateMyArrays(); } @@ -65,14 +83,36 @@ heatTransferGunnPartField::heatTransferGunnPartField heatTransferGunnPartField::~heatTransferGunnPartField() { + particleCloud_.dataExchangeM().destroy(partCp_,1); } // * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * // + +void heatTransferGunnPartField::allocateMyArrays() const +{ + double initVal=0.0; + particleCloud_.dataExchangeM().allocateArray(partCp_,initVal,1); +} // * * * * * * * * * * * * * * * * Member Fct * * * * * * * * * * * * * * * // void heatTransferGunnPartField::calcEnergyContribution() { + allocateMyArrays(); heatTransferGunn::calcEnergyContribution(); + // if heat sources in particles present, pull them here + + // loop over all particles to fill partCp_ based on type + partCpField_.primitiveFieldRef() = 0.0; + particleCloud_.averagingM().resetWeightFields(); + particleCloud_.averagingM().setScalarAverage + ( + partCpField_, + partCp_, + particleCloud_.particleWeights(), + particleCloud_.averagingM().UsWeightField(), + NULL + ); + } void heatTransferGunnPartField::addEnergyContribution(volScalarField& Qsource) const @@ -114,18 +154,20 @@ void heatTransferGunnPartField::postFlow() void heatTransferGunnPartField::solve() { -//use gasT and QCoeff to solve particle temp eqn - volScalarField Qsource = QPartFluidCoeff_*tempField_; + Info << "patch types of partTemp boundary: " << partTempField_.boundaryField().types() << endl; + volScalarField Qsource = QPartFluidCoeff_*tempField_/partCpField_; volScalarField alphaP = 1.0 - voidfraction_; - volScalarField thCond = thermCondModel_().thermCond(); + volScalarField partRhoEff = alphaP*partRhoField_; +// volScalarField thCond = thermCondModel_().thermCond(); + fvScalarMatrix partTEqn ( Qsource - - fvm::Sp(QPartFluidCoeff_, partTempField_) - - fvm::laplacian(alphaP*thCond,partTempField_) + - fvm::Sp(QPartFluidCoeff_/partCpField_, partTempField_) + // - fvm::laplacian(alphaP*thCond/partCpField_,partTempField_) == - fvOptions(rho_, partTempField_) + fvOptions(partRhoEff, partTempField_) ); // if transient add time derivative - need particle density and specific heat fields // if sources activated add sources diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H index 12ae0d82..a52cdec0 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H @@ -44,10 +44,18 @@ class heatTransferGunnPartField { private: - fv::options& fvOptions; + volScalarField partCpField_; + + const volScalarField& partRhoField_; + + mutable double **partCp_; autoPtr thermCondModel_; + fv::options& fvOptions; + + void allocateMyArrays() const; + void giveData(); public: diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C index b0241cf2..35f816dd 100644 --- a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C @@ -99,7 +99,8 @@ tmp ZehnerSchluenderThermCond::thermCond() const IOobject::NO_WRITE ), voidfraction_.mesh(), - dimensionedScalar("zero", dimensionSet(1,1,-3,-1,0,0,0), 0.0) + dimensionedScalar("zero", dimensionSet(1,1,-3,-1,0,0,0), 0.0), + "zeroGradient" ) ); @@ -115,15 +116,25 @@ tmp ZehnerSchluenderThermCond::thermCond() const forAll(svf, cellI) { + // debugging + Pout << "calculating field in cell " << cellI << endl; voidfraction = voidfraction_[cellI]; - B = 1.25 * Foam::pow((1 - voidfraction) / voidfraction, 1.11); - OnemBoA = 1.0 - B/A; - C = (A - 1) / (OnemBoA * OnemBoA) * B/A * log(A/B) - (B - 1)/OnemBoA - 0.5 * (B + 1); - C *= 2.0 / OnemBoA; - k = Foam::sqrt(1 - voidfraction) * (w * A + (1 - w) * C) * kf0_.value(); - svf[cellI] = k / (1 - voidfraction); + if(voidfraction > 1.0 - SMALL) svf[cellI] = 0.0; + else + { + B = 1.25 * Foam::pow((1 - voidfraction) / voidfraction, 1.11); + OnemBoA = 1.0 - B/A; + C = (A - 1) / (OnemBoA * OnemBoA) * B/A * log(A/B) - (B - 1)/OnemBoA - 0.5 * (B + 1); + C *= 2.0 / OnemBoA; + k = Foam::sqrt(1 - voidfraction) * (w * A + (1 - w) * C) * kf0_.value(); + svf[cellI] = k / (1 - voidfraction); + } } + // debugging + Pout << "patch types of svf boundary: " << svf.boundaryField().types() << endl; + svf.correctBoundaryConditions(); + // if a wallQFactor field is present, use it to scale heat transport through a patch if (hasWallQFactor_) { From 24c5c25f7c83eab845f4abcb50a53286bb95fe52 Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 16 Apr 2018 11:44:48 +0200 Subject: [PATCH 14/35] Specific heat and thermal conductivities for various species. --- .../heatTransferGunn/heatTransferGunn.C | 5 +- .../heatTransferGunnPartField.C | 34 +++++++-- .../heatTransferGunnPartField.H | 3 + .../ZehnerSchluenderThermCond.C | 75 +++++++++++++++++-- .../ZehnerSchluenderThermCond.H | 11 ++- 5 files changed, 110 insertions(+), 18 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C index cd945d30..47530705 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C @@ -76,14 +76,15 @@ heatTransferGunn::heatTransferGunn partTempField_ ( IOobject ( - "particleTemp", + "partTemp", sm.mesh().time().timeName(), sm.mesh(), IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), sm.mesh(), - dimensionedScalar("zero", dimensionSet(0,0,0,1,0,0,0), 0.0) + dimensionedScalar("zero", dimensionSet(0,0,0,1,0,0,0), 0.0), + "zeroGradient" ), partRelTempField_ ( IOobject diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C index 6e354810..17be0c17 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C @@ -59,6 +59,7 @@ heatTransferGunnPartField::heatTransferGunnPartField "zeroGradient" ), partRhoField_(sm.mesh().lookupObject("partRho")), + typeCp_(propsDict_.lookupOrDefault("specificHeatCapacities",scalarList(1,-1.0))), partCp_(NULL), thermCondModel_ ( @@ -70,11 +71,16 @@ heatTransferGunnPartField::heatTransferGunnPartField ), fvOptions(fv::options::New(sm.mesh())) { - if(!implicit_) + if (!implicit_) { FatalError << "heatTransferGunnPartField requires implicit heat transfer treatment." << abort(FatalError); } + if (typeCp_[0] < 0.0) + { + FatalError << "heatTransferGunnPartField: provide list of specific heat capacities." << abort(FatalError); + } + allocateMyArrays(); } @@ -102,6 +108,19 @@ void heatTransferGunnPartField::calcEnergyContribution() // if heat sources in particles present, pull them here // loop over all particles to fill partCp_ based on type + label cellI=0; + label partType = 0; + for(int index = 0;index < particleCloud_.numberOfParticles(); ++index) + { + cellI = particleCloud_.cellIDs()[index][0]; + if(cellI >= 0) + { + partType = particleCloud_.particleType(index); + // LIGGGGHTS counts types 1, 2, ..., C++ array starts at 0 + partCp_[index][0] = typeCp_[partType - 1]; + } + } + partCpField_.primitiveFieldRef() = 0.0; particleCloud_.averagingM().resetWeightFields(); particleCloud_.averagingM().setScalarAverage @@ -155,19 +174,20 @@ void heatTransferGunnPartField::postFlow() void heatTransferGunnPartField::solve() { Info << "patch types of partTemp boundary: " << partTempField_.boundaryField().types() << endl; - volScalarField Qsource = QPartFluidCoeff_*tempField_/partCpField_; + volScalarField Qsource = QPartFluidCoeff_*tempField_; volScalarField alphaP = 1.0 - voidfraction_; - volScalarField partRhoEff = alphaP*partRhoField_; -// volScalarField thCond = thermCondModel_().thermCond(); + volScalarField partCpEff = alphaP*partRhoField_*partCpField_; + volScalarField thCondEff = alphaP*thermCondModel_().thermCond(); +// thCondEff.correctBoundaryConditions(); fvScalarMatrix partTEqn ( Qsource - - fvm::Sp(QPartFluidCoeff_/partCpField_, partTempField_) - // - fvm::laplacian(alphaP*thCond/partCpField_,partTempField_) + - fvm::Sp(QPartFluidCoeff_, partTempField_) + - fvm::laplacian(thCondEff,partTempField_) == - fvOptions(partRhoEff, partTempField_) + fvOptions(partCpEff, partTempField_) ); // if transient add time derivative - need particle density and specific heat fields // if sources activated add sources diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H index a52cdec0..a321be7e 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H @@ -29,6 +29,7 @@ License #include "cfdemCloudEnergy.H" #include "heatTransferGunn.H" #include "fvOptions.H" +#include "scalarList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -48,6 +49,8 @@ private: const volScalarField& partRhoField_; + scalarList typeCp_; + mutable double **partCp_; autoPtr thermCondModel_; diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C index 35f816dd..7b8b9a95 100644 --- a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C @@ -50,9 +50,24 @@ ZehnerSchluenderThermCond::ZehnerSchluenderThermCond : thermCondModel(dict,sm), propsDict_(dict.subDict(typeName + "Props")), + partKsField_ + ( + IOobject + ( + "partKs", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedScalar("one", dimensionSet(1, 1, -3, -1,0,0,0), 1.0), + "zeroGradient" + ), voidfractionFieldName_(propsDict_.lookupOrDefault("voidfractionFieldName","voidfraction")), voidfraction_(sm.mesh().lookupObject (voidfractionFieldName_)), - ks0_(transportProperties_.lookup("ks")), + typeKs_(propsDict_.lookupOrDefault("thermalConductivities",scalarList(1,-1.0))), + partKs_(NULL), wallQFactorName_(propsDict_.lookupOrDefault("wallQFactorName","wallQFactor")), wallQFactor_ ( IOobject @@ -68,6 +83,17 @@ ZehnerSchluenderThermCond::ZehnerSchluenderThermCond ), hasWallQFactor_(false) { + if (typeKs_[0] < 0.0) + { + FatalError << "ZehnerSchluenderThermCond: provide list of thermal conductivities." << abort(FatalError); + } + + if (typeKs_.size() > 1) allocateMyArrays(); + else + { + partKsField_ *= typeKs_[0]; + } + if (wallQFactor_.headerOk()) { Info << "Found field for scaling wall heat flux.\n" << endl; @@ -79,9 +105,17 @@ ZehnerSchluenderThermCond::ZehnerSchluenderThermCond // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // ZehnerSchluenderThermCond::~ZehnerSchluenderThermCond() -{} +{ + if (typeKs_.size() > 1) particleCloud_.dataExchangeM().destroy(partKs_,1); +} +void ZehnerSchluenderThermCond::allocateMyArrays() const +{ + double initVal=0.0; + particleCloud_.dataExchangeM().allocateArray(partKs_,initVal,1); +} + // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // tmp ZehnerSchluenderThermCond::thermCond() const @@ -106,7 +140,8 @@ tmp ZehnerSchluenderThermCond::thermCond() const volScalarField& svf = tvf.ref(); - scalar A = ks0_.value()/kf0_.value(); + calcPartKsField(); + scalar A = 0.0; scalar B = 0.0; scalar C = 0.0; scalar k = 0.0; @@ -116,12 +151,11 @@ tmp ZehnerSchluenderThermCond::thermCond() const forAll(svf, cellI) { - // debugging - Pout << "calculating field in cell " << cellI << endl; voidfraction = voidfraction_[cellI]; - if(voidfraction > 1.0 - SMALL) svf[cellI] = 0.0; + if(voidfraction > 1.0 - SMALL || partKsField_[cellI] < SMALL) svf[cellI] = 0.0; else { + A = partKsField_[cellI]/kf0_.value(); B = 1.25 * Foam::pow((1 - voidfraction) / voidfraction, 1.11); OnemBoA = 1.0 - B/A; C = (A - 1) / (OnemBoA * OnemBoA) * B/A * log(A/B) - (B - 1)/OnemBoA - 0.5 * (B + 1); @@ -131,8 +165,6 @@ tmp ZehnerSchluenderThermCond::thermCond() const } } - // debugging - Pout << "patch types of svf boundary: " << svf.boundaryField().types() << endl; svf.correctBoundaryConditions(); // if a wallQFactor field is present, use it to scale heat transport through a patch @@ -151,8 +183,35 @@ tmp ZehnerSchluenderThermCond::thermDiff() const FatalError << "ZehnerSchluenderThermCond does not provide thermal diffusivity." << abort(FatalError); } +void ZehnerSchluenderThermCond::calcPartKsField() const +{ + if (typeKs_.size() <= 1) return; + allocateMyArrays(); + label cellI=0; + label partType = 0; + for(int index = 0;index < particleCloud_.numberOfParticles(); ++index) + { + cellI = particleCloud_.cellIDs()[index][0]; + if(cellI >= 0) + { + partType = particleCloud_.particleType(index); + // LIGGGGHTS counts types 1, 2, ..., C++ array starts at 0 + partKs_[index][0] = typeKs_[partType - 1]; + } + } + partKsField_.primitiveFieldRef() = 0.0; + particleCloud_.averagingM().resetWeightFields(); + particleCloud_.averagingM().setScalarAverage + ( + partKsField_, + partKs_, + particleCloud_.particleWeights(), + particleCloud_.averagingM().UsWeightField(), + NULL + ); +} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H index 12320d75..b3cafd7c 100644 --- a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.H @@ -34,6 +34,7 @@ SourceFiles #define ZehnerSchluenderThermCond_H #include "thermCondModel.H" +#include "scalarList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -52,12 +53,16 @@ class ZehnerSchluenderThermCond private: dictionary propsDict_; + + mutable volScalarField partKsField_; word voidfractionFieldName_; const volScalarField& voidfraction_; - dimensionedScalar ks0_; + scalarList typeKs_; + + mutable double **partKs_; word wallQFactorName_; @@ -66,6 +71,10 @@ private: bool hasWallQFactor_; + void allocateMyArrays() const; + + void calcPartKsField() const; + public: //- Runtime type information From d8682c6a79eb7823ab3775dc647c30363b5908be Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Thu, 19 Apr 2018 15:07:24 +0200 Subject: [PATCH 15/35] Some experiments to get more stability. --- .../solvers/cfdemSolverRhoPimple/EEqn.H | 7 ++++- .../solvers/cfdemSolverRhoSimple/UEqn.H | 19 +++++++++----- .../cfdemSolverRhoSimple.C | 4 ++- .../solvers/cfdemSolverRhoSimple/pEqn.H | 10 +++++++ .../heatTransferGunnPartField.C | 26 ++++++++++++++++--- 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/applications/solvers/cfdemSolverRhoPimple/EEqn.H b/applications/solvers/cfdemSolverRhoPimple/EEqn.H index fc770162..0f1e6aff 100644 --- a/applications/solvers/cfdemSolverRhoPimple/EEqn.H +++ b/applications/solvers/cfdemSolverRhoPimple/EEqn.H @@ -39,7 +39,7 @@ == fvOptions(rho, he) ); - + EEqn.relax(); @@ -52,4 +52,9 @@ thermo.correct(); Info<< "T max/min : " << max(T).value() << " " << min(T).value() << endl; + + particleCloud.clockM().start(31,"energySolve"); + particleCloud.solve(); + particleCloud.clockM().stop("energySolve"); + } diff --git a/applications/solvers/cfdemSolverRhoSimple/UEqn.H b/applications/solvers/cfdemSolverRhoSimple/UEqn.H index c4a58ad2..45b78abe 100644 --- a/applications/solvers/cfdemSolverRhoSimple/UEqn.H +++ b/applications/solvers/cfdemSolverRhoSimple/UEqn.H @@ -19,14 +19,21 @@ fvOptions.constrain(UEqn); if (modelType=="B" || modelType=="Bfull") { solve(UEqn == -fvc::grad(p)+ Ksl*Us); - - fvOptions.correct(U); - K = 0.5*magSqr(U); } else { solve(UEqn == -voidfraction*fvc::grad(p)+ Ksl*Us); - - fvOptions.correct(U); - K = 0.5*magSqr(U); } + +fvOptions.correct(U); + +// limit vel + +forAll(U,cellI) +{ + scalar mU = mag(U[cellI]); + if (mU > 200.0) U[cellI] *= 200.0/mU; +} + + +K = 0.5*magSqr(U); diff --git a/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C index e960b40b..b505252e 100644 --- a/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C +++ b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C @@ -108,12 +108,14 @@ int main(int argc, char *argv[]) // Pressure-velocity SIMPLE corrector #include "UEqn.H" - #include "EEqn.H" + // besides this pEqn, OF offers a "simple consistent"-option #include "pEqn.H" rhoeps=rho*voidfraction; + #include "EEqn.H" + turbulence->correct(); particleCloud.clockM().start(32,"postFlow"); diff --git a/applications/solvers/cfdemSolverRhoSimple/pEqn.H b/applications/solvers/cfdemSolverRhoSimple/pEqn.H index a85e7f44..c032cbeb 100644 --- a/applications/solvers/cfdemSolverRhoSimple/pEqn.H +++ b/applications/solvers/cfdemSolverRhoSimple/pEqn.H @@ -75,6 +75,16 @@ else { U = HbyA - rAU*(fvc::grad(p)-Ksl*Us); } + +// limit vel + +forAll(U,cellI) +{ + scalar mU = mag(U[cellI]); + if (mU > 200.0) U[cellI] *= 200.0/mU; +} + + U.correctBoundaryConditions(); fvOptions.correct(U); K = 0.5*magSqr(U); diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C index 17be0c17..2dac2222 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C @@ -81,6 +81,8 @@ heatTransferGunnPartField::heatTransferGunnPartField FatalError << "heatTransferGunnPartField: provide list of specific heat capacities." << abort(FatalError); } + partTempField_.writeOpt() = IOobject::AUTO_WRITE; + allocateMyArrays(); } @@ -173,18 +175,29 @@ void heatTransferGunnPartField::postFlow() void heatTransferGunnPartField::solve() { - Info << "patch types of partTemp boundary: " << partTempField_.boundaryField().types() << endl; - volScalarField Qsource = QPartFluidCoeff_*tempField_; + // for some weird reason, the particle-fluid heat transfer fields were defined with a negative sign + volScalarField alphaP = 1.0 - voidfraction_; + volScalarField correctedQPartFluidCoeff(QPartFluidCoeff_); + // no heattransfer in empty cells -- for numerical stability, add small amount + forAll(correctedQPartFluidCoeff,cellI) + { + if (-correctedQPartFluidCoeff[cellI] < SMALL) correctedQPartFluidCoeff[cellI] = -SMALL; + } + + volScalarField Qsource = correctedQPartFluidCoeff*tempField_; volScalarField partCpEff = alphaP*partRhoField_*partCpField_; volScalarField thCondEff = alphaP*thermCondModel_().thermCond(); // thCondEff.correctBoundaryConditions(); + fvScalarMatrix partTEqn ( + // fvm::ddt(partCpEff, partTempField_) + // + Qsource Qsource - - fvm::Sp(QPartFluidCoeff_, partTempField_) + - fvm::Sp(correctedQPartFluidCoeff, partTempField_) - fvm::laplacian(thCondEff,partTempField_) == fvOptions(partCpEff, partTempField_) @@ -199,8 +212,15 @@ void heatTransferGunnPartField::solve() partTEqn.solve(); + partTempField_.relax(); + fvOptions.correct(partTempField_); + dimensionedScalar pTMin("pTMin",dimensionSet(0,0,0,1,0,0,0),293.0); + dimensionedScalar pTMax("pTMin",dimensionSet(0,0,0,1,0,0,0),3000.0); + partTempField_ = max(partTempField_, pTMin); + partTempField_ = min(partTempField_, pTMax); + Info<< "partT max/min : " << max(partTempField_).value() << " " << min(partTempField_).value() << endl; } From bdfdb23cddc2fb2b9426a5bacf73eef5289179c4 Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 23 Apr 2018 14:15:34 +0200 Subject: [PATCH 16/35] Some debugging (initialization of arrays etc.). --- src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C | 6 +++++- src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H | 2 ++ src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H | 10 ++++++++++ .../ZehnerSchluenderThermCond.C | 5 +++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index 5d132ddd..2eb91237 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -97,6 +97,8 @@ cfdemCloud::cfdemCloud radii_(NULL), voidfractions_(NULL), cellIDs_(NULL), + particleDensities_(NULL), + particleTypes_(NULL), particleWeights_(NULL), particleVolumes_(NULL), particleV_(NULL), @@ -743,8 +745,10 @@ bool cfdemCloud::reAllocArrays() dataExchangeM().allocateArray(particleWeights_,0.,voidFractionM().maxCellsPerParticle()); dataExchangeM().allocateArray(particleVolumes_,0.,voidFractionM().maxCellsPerParticle()); dataExchangeM().allocateArray(particleV_,0.,1); + Info << "\nnow allocating particle densities array.\n" << endl; if(getParticleDensities_) dataExchangeM().allocateArray(particleDensities_,0.,1); - if(getParticleTypes_) dataExchangeM().allocateArray(particleTypes_,0.,1); + Info << "\nnow allocating particle types array.\n" << endl; + if(getParticleTypes_) dataExchangeM().allocateArray(particleTypes_,0,1); arraysReallocated_ = true; return true; } diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H index 1b3f78cf..e736c974 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H @@ -335,8 +335,10 @@ public: virtual inline int maxType() {return -1;} virtual inline bool multipleTypesDMax() {return false;} virtual inline bool multipleTypesDMin() {return false;} + inline bool getParticleDensities() const; virtual inline double ** particleDensity() const; virtual inline double particleDensity(label index) const; + inline bool getParticleTypes() const; virtual inline int ** particleTypes() const; virtual inline label particleType(label index) const; diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H index 56ddfa48..0db389e0 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H @@ -216,6 +216,11 @@ inline double cfdemCloud::d32(bool recalc) return d32_; } +inline bool cfdemCloud::getParticleDensities() const +{ + return getParticleDensities_; +} + inline double ** cfdemCloud::particleDensity() const { if(!getParticleDensities_) return NULL; @@ -234,6 +239,11 @@ inline double cfdemCloud::particleDensity(label index) const } } +inline bool cfdemCloud::getParticleTypes() const +{ + return getParticleTypes_; +} + inline int ** cfdemCloud::particleTypes() const { if(!getParticleTypes_) return NULL; diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C index 7b8b9a95..1d1cec33 100644 --- a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C @@ -187,6 +187,11 @@ void ZehnerSchluenderThermCond::calcPartKsField() const { if (typeKs_.size() <= 1) return; + if (!particleCloud_.getParticleTypes()) + { + FatalError << "ZehnerSchluenderThermCond needs data for more than one type, but types are not communicated." << abort(FatalError); + } + allocateMyArrays(); label cellI=0; label partType = 0; From 948a909da83919a13edd18123911c66fbd08809f Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Wed, 25 Apr 2018 15:28:03 +0200 Subject: [PATCH 17/35] Adapted Sauter mean diameter and void fraction models for eff. particle volume factor in case of polydisp. parcels. --- .../cfdemParticle/cfdemCloud/cfdemCloud.C | 6 ++- .../cfdemParticle/cfdemCloud/cfdemCloud.H | 9 +++++ .../cfdemParticle/cfdemCloud/cfdemCloudI.H | 14 +++++++ .../subModels/forceModel/dSauter/dSauter.C | 40 +++++++++---------- .../subModels/forceModel/dSauter/dSauter.H | 6 +-- .../GaussVoidFraction/GaussVoidFraction.C | 3 +- .../bigParticleVoidFraction.C | 3 +- .../centreVoidFraction/centreVoidFraction.C | 3 +- .../dividedVoidFraction/dividedVoidFraction.C | 1 + .../trilinearVoidFraction.C | 3 +- .../voidFractionModel/voidFractionModel.C | 2 + .../voidFractionModel/voidFractionModel.H | 7 ++++ 12 files changed, 68 insertions(+), 29 deletions(-) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index 2eb91237..680658c0 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -98,6 +98,7 @@ cfdemCloud::cfdemCloud voidfractions_(NULL), cellIDs_(NULL), particleDensities_(NULL), + particleEffVolFactors_(NULL), particleTypes_(NULL), particleWeights_(NULL), particleVolumes_(NULL), @@ -376,6 +377,7 @@ cfdemCloud::~cfdemCloud() dataExchangeM().destroy(particleVolumes_,1); dataExchangeM().destroy(particleV_,1); if(getParticleDensities_) dataExchangeM().destroy(particleDensities_,1); + if(getParticleEffVolFactors_) dataExchangeM().destroy(particleEffVolFactors_,1); if(getParticleTypes_) dataExchangeM().destroy(particleTypes_,1); } @@ -390,6 +392,7 @@ void cfdemCloud::getDEMdata() dataExchangeM().getData("dragAcc","vector-atom",fAcc_); // array is used twice - might be necessary to clean it first if(getParticleDensities_) dataExchangeM().getData("density","scalar-atom",particleDensities_); + if(getParticleEffVolFactors_) dataExchangeM().getData("effvolfactor","scalar-atom",particleEffVolFactors_); if(getParticleTypes_) dataExchangeM().getData("type","scalar-atom",particleTypes_); } @@ -745,9 +748,8 @@ bool cfdemCloud::reAllocArrays() dataExchangeM().allocateArray(particleWeights_,0.,voidFractionM().maxCellsPerParticle()); dataExchangeM().allocateArray(particleVolumes_,0.,voidFractionM().maxCellsPerParticle()); dataExchangeM().allocateArray(particleV_,0.,1); - Info << "\nnow allocating particle densities array.\n" << endl; if(getParticleDensities_) dataExchangeM().allocateArray(particleDensities_,0.,1); - Info << "\nnow allocating particle types array.\n" << endl; + if(getParticleEffVolFactors_) dataExchangeM().allocateArray(particleEffVolFactors_,0.,1); if(getParticleTypes_) dataExchangeM().allocateArray(particleTypes_,0,1); arraysReallocated_ = true; return true; diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H index e736c974..aeee157f 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H @@ -98,6 +98,8 @@ protected: bool getParticleDensities_; + bool getParticleEffVolFactors_; + bool getParticleTypes_; scalar maxDEMForce_; @@ -128,6 +130,8 @@ protected: mutable double **particleDensities_; + mutable double **particleEffVolFactors_; + mutable int **particleTypes_; mutable double **particleWeights_; @@ -335,9 +339,14 @@ public: virtual inline int maxType() {return -1;} virtual inline bool multipleTypesDMax() {return false;} virtual inline bool multipleTypesDMin() {return false;} + inline bool getParticleDensities() const; virtual inline double ** particleDensity() const; virtual inline double particleDensity(label index) const; + + inline bool getParticleEffVolFactors() const; + virtual inline double particleEffVolFactor(label index) const; + inline bool getParticleTypes() const; virtual inline int ** particleTypes() const; virtual inline label particleType(label index) const; diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H index 0db389e0..685a8558 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H @@ -239,6 +239,20 @@ inline double cfdemCloud::particleDensity(label index) const } } +inline bool cfdemCloud::getParticleEffVolFactors() const +{ + return getParticleEffVolFactors_; +} + +inline double cfdemCloud::particleEffVolFactor(label index) const +{ + if(!getParticleEffVolFactors_) return -1.0; + else + { + return particleEffVolFactors_[index][0]; + } +} + inline bool cfdemCloud::getParticleTypes() const { return getParticleTypes_; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.C b/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.C index 081742c3..e7e6c3d8 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.C @@ -53,10 +53,10 @@ dSauter::dSauter : forceModel(dict,sm), propsDict_(dict.subDict(typeName + "Props")), + multiTypes_(false), d2_(NULL), d3_(NULL), - scaleDia_(1.0), - scaleDiaDist_(1.0), + typeCG_(propsDict_.lookupOrDefault("coarseGrainingFactors",labelList(1,1))), d2Field_ ( IOobject ( @@ -95,17 +95,13 @@ dSauter::dSauter "zeroGradient" ) { + if (typeCG_.size()>1) multiTypes_ = true; allocateMyArrays(); dSauter_.write(); // init force sub model setForceSubModels(propsDict_); - - if (propsDict_.found("scaleCG")) - scaleDia_ = scalar(readScalar(propsDict_.lookup("scaleCG"))); - if (propsDict_.found("scaleDist")) - scaleDiaDist_ = scalar(readScalar(propsDict_.lookup("scaleDist"))); } @@ -131,30 +127,34 @@ void dSauter::allocateMyArrays() const void dSauter::setForce() const { - if (scaleDia_ > 1) + if (typeCG_.size()>1 || typeCG_[0] > 1) { - Info << "dSauter using scaleCG = " << scaleDia_ << endl; - } - else if (particleCloud_.cg() > 1) - { - scaleDia_ = particleCloud_.cg(); - Info << "dSauter using scaleCG from liggghts cg = " << scaleDia_ << endl; + Info << "dSauter using CG factor(s) = " << typeCG_ << endl; } allocateMyArrays(); - label cellI=0; - scalar ds(0); - scalar scale = scaleDiaDist_/scaleDia_; + label cellI = 0; + label cg = 1; + label partType = 1; + scalar ds = 0.0; + scalar effVolFac = 1.0; + for(int index = 0; index < particleCloud_.numberOfParticles(); ++index) { cellI = particleCloud_.cellIDs()[index][0]; if (cellI >= 0) { + if (particleCloud_.getParticleEffVolFactors()) + { + effVolFac = particleCloud_.particleEffVolFactor(index); + } + if (multiTypes_) partType = particleCloud_.particleType(index); + cg = typeCG_[partType - 1]; ds = particleCloud_.d(index); - d2_[index][0] = ds*ds; - d3_[index][0] = ds*ds*ds; + d2_[index][0] = ds*ds*effVolFac*cg; + d3_[index][0] = ds*ds*ds*effVolFac; } } @@ -181,7 +181,7 @@ void dSauter::setForce() const { if (d2Field_[cellI] > ROOTVSMALL) { - dSauter_[cellI] = d3Field_[cellI] / d2Field_[cellI] * scale; + dSauter_[cellI] = d3Field_[cellI] / d2Field_[cellI]; } else { diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.H b/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.H index 7a81fab5..1b969b9c 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/dSauter/dSauter.H @@ -43,13 +43,13 @@ private: dictionary propsDict_; + bool multiTypes_; + mutable double **d2_; mutable double **d3_; - mutable scalar scaleDia_; // scaling due to coarse graining - - mutable scalar scaleDiaDist_; // scaling due to modified particle size distribution + labelList typeCG_; mutable volScalarField d2Field_; diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/GaussVoidFraction/GaussVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/GaussVoidFraction/GaussVoidFraction.C index 3964b074..3db3e053 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/GaussVoidFraction/GaussVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/GaussVoidFraction/GaussVoidFraction.C @@ -95,7 +95,7 @@ void GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfract scalar radius(-1); scalar volume(0); - scalar scaleVol= weight(); + scalar scaleVol = weight(); scalar scaleRadius = pow(porosity(),1./3.); for(int index=0; index< particleCloud_.numberOfParticles(); index++) @@ -115,6 +115,7 @@ void GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfract label particleCenterCellID=particleCloud_.cellIDs()[index][0]; radius = particleCloud_.radius(index); + if (multiWeights_) scaleVol = weight(index); volume = constant::mathematical::fourPiByThree*radius*radius*radius*scaleVol; radius *= scaleRadius; diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/bigParticleVoidFraction/bigParticleVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/bigParticleVoidFraction/bigParticleVoidFraction.C index d176668f..e7dc28bc 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/bigParticleVoidFraction/bigParticleVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/bigParticleVoidFraction/bigParticleVoidFraction.C @@ -94,7 +94,7 @@ void bigParticleVoidFraction::setvoidFraction(double** const& mask,double**& voi scalar radius(-1); scalar volume(0); - scalar scaleVol= weight(); + scalar scaleVol = weight(); scalar scaleRadius = pow(porosity(),1./3.); for(int index=0; index< particleCloud_.numberOfParticles(); index++) @@ -113,6 +113,7 @@ void bigParticleVoidFraction::setvoidFraction(double** const& mask,double**& voi //collecting data label particleCenterCellID=particleCloud_.cellIDs()[index][0]; radius = particleCloud_.radius(index); + if (multiWeights_) scaleVol = weight(index); volume = constant::mathematical::fourPiByThree*radius*radius*radius*scaleVol; radius *= scaleRadius; vector positionCenter=particleCloud_.position(index); diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/centreVoidFraction/centreVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/centreVoidFraction/centreVoidFraction.C index 0f1fb2bf..6aa96bce 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/centreVoidFraction/centreVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/centreVoidFraction/centreVoidFraction.C @@ -85,7 +85,7 @@ void centreVoidFraction::setvoidFraction(double** const& mask,double**& voidfrac scalar radius(-1); scalar volume(0); scalar cellVol(0); - scalar scaleVol= weight(); + scalar scaleVol = weight(); for(int index=0; index< particleCloud_.numberOfParticles(); index++) { @@ -99,6 +99,7 @@ void centreVoidFraction::setvoidFraction(double** const& mask,double**& voidfrac if (cellI >= 0) // particel centre is in domain { + if (multiWeights_) scaleVol = weight(index); cellVol = voidfractionNext_.mesh().V()[cellI]; radius = particleCloud_.radius(index); volume = constant::mathematical::fourPiByThree*radius*radius*radius*scaleVol; diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C index 3066be22..6648d3c7 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C @@ -200,6 +200,7 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra position = particleCloud_.position(index); cellID = particleCloud_.cellIDs()[index][0]; radius = particleCloud_.radius(index); + if (multiWeights_) scaleVol = weight(index); volume = Vp(index,radius,scaleVol); radius *= scaleRadius; cellVol = 0; diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/trilinearVoidFraction/trilinearVoidFraction.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/trilinearVoidFraction/trilinearVoidFraction.C index 5e395e31..8413532a 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/trilinearVoidFraction/trilinearVoidFraction.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/trilinearVoidFraction/trilinearVoidFraction.C @@ -94,7 +94,7 @@ void trilinearVoidFraction::setvoidFraction(double** const& mask,double**& voidf scalar radius(-1.); scalar volume(0.); - const scalar scaleVol = weight(); + scalar scaleVol = weight(); vector partPos(0.,0.,0.); vector pt(0.,0.,0.); @@ -140,6 +140,7 @@ void trilinearVoidFraction::setvoidFraction(double** const& mask,double**& voidf if (cellI >= 0) // particel centre is in domain { radius = particleCloud_.radius(index); + if (multiWeights_) scaleVol = weight(index); volume = constant::mathematical::fourPiByThree * radius * radius * radius * scaleVol; // store volume for each particle diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.C b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.C index 3368fc7a..424b8eef 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.C +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.C @@ -57,6 +57,7 @@ voidFractionModel::voidFractionModel : dict_(dict), particleCloud_(sm), + multiWeights_(false), voidfractionPrev_ ( IOobject ( @@ -89,6 +90,7 @@ voidFractionModel::voidFractionModel porosity_(1.) { particleCloud_.dataExchangeM().allocateArray(cellsPerParticle_,1,1); + if (particleCloud_.getParticleEffVolFactors()) multiWeights_ = true; } diff --git a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.H b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.H index 877b49bf..9a760b31 100644 --- a/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.H +++ b/src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.H @@ -63,6 +63,8 @@ protected: cfdemCloud& particleCloud_; + bool multiWeights_; + mutable volScalarField voidfractionPrev_; mutable volScalarField voidfractionNext_; @@ -132,6 +134,11 @@ public: inline scalar weight()const { return weight_; } + inline scalar weight(label index) const + { + return particleCloud_.particleEffVolFactor(index); + } + inline scalar porosity()const { return porosity_; } inline void checkWeightNporosity(dictionary& propsDict) const From 500db10717af5672686035ce0d61fe2e832335fd Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 30 Apr 2018 15:04:21 +0200 Subject: [PATCH 18/35] Forgot to set bool getParticleEffVolFactors. --- src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C index 680658c0..9f5d8955 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C @@ -84,6 +84,7 @@ cfdemCloud::cfdemCloud allowCFDsubTimestep_(true), limitDEMForces_(false), getParticleDensities_(couplingProperties_.lookupOrDefault("getParticleDensities",false)), + getParticleEffVolFactors_(couplingProperties_.lookupOrDefault("getParticleEffVolFactors",false)), getParticleTypes_(couplingProperties_.lookupOrDefault("getParticleTypes",false)), modelType_(couplingProperties_.lookup("modelType")), positions_(NULL), From 7b59ed2ffa76eadfb1337a32eb81e3d6df0b76a9 Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Thu, 17 May 2018 14:13:13 +0200 Subject: [PATCH 19/35] Fix sequence of arguments in function calculating drag. --- .../subModels/forceModel/BeetstraDrag/BeetstraDrag.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C index 8bf3ed97..b771773b 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C @@ -236,7 +236,7 @@ void BeetstraDrag::setForce() const Rep=ds_scaled*voidfraction*magUr/nuf + SMALL; - dragCoefficient = F(Rep, voidfraction) + dragCoefficient = F(voidfraction, Rep) *3*M_PI*nuf*rho*voidfraction *effDiameter(ds_scaled, voidfraction, cellI, index) *scaleDia3*scaleDrag_; From e0530dcf5bf8c11ddc9f28f57a3a7398e1a0ff70 Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Fri, 18 May 2018 12:04:57 +0200 Subject: [PATCH 20/35] Cleaned up solver, removed testing code. --- applications/solvers/cfdemSolverRhoSimple/UEqn.H | 9 --------- .../cfdemSolverRhoSimple/cfdemSolverRhoSimple.C | 2 +- applications/solvers/cfdemSolverRhoSimple/pEqn.H | 11 +---------- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/applications/solvers/cfdemSolverRhoSimple/UEqn.H b/applications/solvers/cfdemSolverRhoSimple/UEqn.H index 45b78abe..8fbd30f2 100644 --- a/applications/solvers/cfdemSolverRhoSimple/UEqn.H +++ b/applications/solvers/cfdemSolverRhoSimple/UEqn.H @@ -27,13 +27,4 @@ else fvOptions.correct(U); -// limit vel - -forAll(U,cellI) -{ - scalar mU = mag(U[cellI]); - if (mU > 200.0) U[cellI] *= 200.0/mU; -} - - K = 0.5*magSqr(U); diff --git a/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C index b505252e..4e1821fc 100644 --- a/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C +++ b/applications/solvers/cfdemSolverRhoSimple/cfdemSolverRhoSimple.C @@ -119,7 +119,7 @@ int main(int argc, char *argv[]) turbulence->correct(); particleCloud.clockM().start(32,"postFlow"); - particleCloud.postFlow(); + if(hasEvolved) particleCloud.postFlow(); particleCloud.clockM().stop("postFlow"); runTime.write(); diff --git a/applications/solvers/cfdemSolverRhoSimple/pEqn.H b/applications/solvers/cfdemSolverRhoSimple/pEqn.H index c032cbeb..5b2dbcbd 100644 --- a/applications/solvers/cfdemSolverRhoSimple/pEqn.H +++ b/applications/solvers/cfdemSolverRhoSimple/pEqn.H @@ -76,15 +76,6 @@ else U = HbyA - rAU*(fvc::grad(p)-Ksl*Us); } -// limit vel - -forAll(U,cellI) -{ - scalar mU = mag(U[cellI]); - if (mU > 200.0) U[cellI] *= 200.0/mU; -} - - U.correctBoundaryConditions(); fvOptions.correct(U); -K = 0.5*magSqr(U); +K = 0.5*magSqr(U); \ No newline at end of file From 19dd9c96469d561c39eed7f8274327c8c7a751cb Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Fri, 18 May 2018 12:08:56 +0200 Subject: [PATCH 21/35] Beetstra drag model. For polydisp case, BeetstraDragPoly overrides functions for diameter. Effect of fines phase in terms of static hold-up field is included in BeetstraDragPoly. --- .../forceModel/BeetstraDrag/BeetstraDrag.C | 7 ++-- .../forceModel/BeetstraDrag/BeetstraDrag.H | 4 +- .../BeetstraDragPoly/BeetstraDragPoly.C | 40 ++++++++++++++----- .../BeetstraDragPoly/BeetstraDragPoly.H | 12 ++++-- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C index b771773b..98182357 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C @@ -163,6 +163,7 @@ void BeetstraDrag::setForce() const vector Ur(0,0,0); scalar ds(0); scalar ds_scaled(0); + scalar dSauter(0); scalar scaleDia3 = typeCG_[0]*typeCG_[0]*typeCG_[0]; scalar nuf(0); scalar rho(0); @@ -225,20 +226,20 @@ void BeetstraDrag::setForce() const magUr = mag(Ur); ds = 2*particleCloud_.radius(index); ds_scaled = ds/cg; + dSauter = meanSauterDiameter(ds_scaled, cellI); rho = rhoField[cellI]; nuf = nufField[cellI]; - Rep=0.0; localPhiP = 1.0f-voidfraction+SMALL; // calc particle's drag coefficient (i.e., Force per unit slip velocity and Stokes drag) - Rep=ds_scaled*voidfraction*magUr/nuf + SMALL; + Rep=dSauter*voidfraction*magUr/nuf + SMALL; dragCoefficient = F(voidfraction, Rep) *3*M_PI*nuf*rho*voidfraction - *effDiameter(ds_scaled, voidfraction, cellI, index) + *effDiameter(ds_scaled, cellI, index) *scaleDia3*scaleDrag_; // calculate filtering corrections diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H index 8b8c0055..c2128855 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H @@ -85,7 +85,9 @@ protected: virtual void adaptVoidfraction(double&, label) const {} - virtual scalar effDiameter(double d, double voidfraction, label cellI, label index) const {return d;} + virtual scalar effDiameter(double d, label cellI, label index) const {return d;} + + virtual scalar meanSauterDiameter(double d, label cellI) const {return d;} double F(double, double) const; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C index fe4024cd..3fb66969 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C @@ -49,14 +49,26 @@ BeetstraDragPoly::BeetstraDragPoly : BeetstraDrag(dict,sm), fines_(propsDict_.lookupOrDefault("fines",false)), - dSauter_(sm.mesh().lookupObject ("dSauter")) + dFine_(propsDict_.lookupOrDefault("dFine",1.0)) { + // if fines are present, take mixture dSauter, otherwise normal dSauter if (fines_) { + if (!propsDict_.found("dFine")) + { + FatalError << "forceModel BeetstraDragPoly: Define fines diameter." << abort(FatalError); + } + volScalarField& alphaP(const_cast(sm.mesh().lookupObject ("alphaP"))); + alphaP_.set(&alphaP); volScalarField& alphaSt(const_cast(sm.mesh().lookupObject ("alphaSt"))); alphaSt_.set(&alphaSt); - volScalarField& dSauterMix(const_cast(sm.mesh().lookupObject ("dSauterMix"))); - dSauterMix_.set(&dSauterMix); + volScalarField& dSauter(const_cast(sm.mesh().lookupObject ("dSauterMix"))); + dSauter_.set(&dSauter); + } + else + { + volScalarField& dSauter(const_cast(sm.mesh().lookupObject ("dSauter"))); + dSauter_.set(&dSauter); } } @@ -75,24 +87,30 @@ void BeetstraDragPoly::adaptVoidfraction(double& voidfraction, label cellI) cons if (voidfraction < minVoidfraction_) voidfraction = minVoidfraction_; } -scalar BeetstraDragPoly::effDiameter(double d, double voidfraction, label cellI, label index) const +scalar BeetstraDragPoly::effDiameter(double d, label cellI, label index) const { - scalar dS = dSauter_[cellI]; - scalar effD = d*d/dS; + scalar dS = dSauter_()[cellI]; + scalar effD = d*d / dS + 0.064*d*d*d*d / (dS*dS*dS); + if (fines_) { - scalar pureVoidfraction = voidfraction_[cellI]; - scalar dSmix = dSauterMix_()[cellI]; - effD *= pureVoidfraction / voidfraction * (1 - voidfraction) / (1 - pureVoidfraction); - effD *= dS * dS / (dSmix * dSmix); + scalar fineCorr = dFine_*dFine_ / dS + 0.064*dFine_*dFine_*dFine_*dFine_ / (dS*dS*dS); + fineCorr *= d*d*d / (dFine_*dFine_*dFine_) * alphaSt_()[cellI] / alphaP_()[cellI]; + effD += fineCorr; } + if (particleCloud_.getParticleEffVolFactors()) { scalar effVolFac = particleCloud_.particleEffVolFactor(index); effD *= effVolFac; } + return effD; - +} + +scalar BeetstraDragPoly::meanSauterDiameter(double d, label cellI) const +{ + return dSauter_()[cellI]; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H index 12bde2a3..88965010 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H @@ -43,16 +43,20 @@ class BeetstraDragPoly protected: const bool fines_; + + scalar dFine_; + autoPtr alphaP_; + autoPtr alphaSt_; - const volScalarField& dSauter_; - - autoPtr dSauterMix_; + autoPtr dSauter_; void adaptVoidfraction(double&, label) const; - scalar effDiameter(double, double, label, label) const; + scalar effDiameter(double, label, label) const; + + scalar meanSauterDiameter(double, label) const; public: From 05fb204dc397d7a716630237f8604e46257b5453 Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Fri, 18 May 2018 14:10:35 +0200 Subject: [PATCH 22/35] Some improvements based on helpful comments. --- .../cfdemParticle/cfdemCloud/cfdemCloudI.H | 12 ++------- .../forceModel/BeetstraDrag/BeetstraDrag.C | 25 +++++++++++-------- .../BeetstraDragPoly/BeetstraDragPoly.C | 7 ++---- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H index 685a8558..187d043f 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H @@ -223,11 +223,7 @@ inline bool cfdemCloud::getParticleDensities() const inline double ** cfdemCloud::particleDensity() const { - if(!getParticleDensities_) return NULL; - else - { - return particleDensities_; - } + return particleDensities_; } inline double cfdemCloud::particleDensity(label index) const @@ -260,11 +256,7 @@ inline bool cfdemCloud::getParticleTypes() const inline int ** cfdemCloud::particleTypes() const { - if(!getParticleTypes_) return NULL; - else - { - return particleTypes_; - } + return particleTypes_; } inline label cfdemCloud::particleType(label index) const diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C index 98182357..59c39254 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C @@ -12,6 +12,7 @@ License along with this code. If not, see . Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria + Contributing author: Paul Kieckhefen, TU Hamburg, Germany \*---------------------------------------------------------------------------*/ @@ -214,7 +215,7 @@ void BeetstraDrag::setForce() const // in case a fines phase is present, void fraction needs to be adapted adaptVoidfraction(voidfraction, cellI); - if (multiTypes_) + if (multiTypes_) { partType = particleCloud_.particleType(index); cg = typeCG_[partType - 1]; @@ -241,14 +242,14 @@ void BeetstraDrag::setForce() const *3*M_PI*nuf*rho*voidfraction *effDiameter(ds_scaled, cellI, index) *scaleDia3*scaleDrag_; - + // calculate filtering corrections if (useGC_) { - GCcorr = 1.-h(localPhiP) - /( a(localPhiP) - *Lc2_ - /Foam::pow(U_.mesh().V()[cellI],.33333333) + GCcorr = 1.-h(localPhiP) + /( a(localPhiP) + *Lc2_ + /std::cbrt(U_.mesh().V()[cellI]) + 1. ); if (usePC_) @@ -311,8 +312,8 @@ void BeetstraDrag::setForce() const double BeetstraDrag::F(double voidfraction, double Rep) const { double localPhiP = max(SMALL,min(1.-SMALL,1.-voidfraction)); - return 10.0*localPhiP/(voidfraction*voidfraction) - + voidfraction*voidfraction*(1.0+1.5*Foam::sqrt(localPhiP)) + return 10.0*localPhiP/(voidfraction*voidfraction) + + voidfraction*voidfraction*(1.0+1.5*Foam::sqrt(localPhiP)) + 0.413*Rep/(24*voidfraction*voidfraction) *(1.0/voidfraction +3*voidfraction*localPhiP @@ -362,7 +363,9 @@ double BeetstraDrag::a(double phiP) const { a0m = 1.79; } - return a0m + a1m*(phiP-phipam) + a2m*pow(phiP-phipam,2.) + a3m*pow(phiP-phipam,3.); + const double phiP_minus_phipam = phiP-phipam; + return a0m + a1m*phiP_minus_phipam + a2m*phiP_minus_phipam*phiP_minus_phipam + + a3m*phiP_minus_phipam*phiP_minus_phipam*phiP_minus_phipam; } double BeetstraDrag::h(double phiP) const @@ -405,7 +408,9 @@ double BeetstraDrag::h(double phiP) const { h0m = 0.680; h1m = -2.340; h2m = -225.200; phiphm = 0.55; } - return h0m + h1m*(phiP-phiphm) + h2m*pow(phiP-phiphm,2) + h3m*pow(phiP-phiphm,3); + const double phiP_minus_phiphm = phiP-phiphm; + return h0m + h1m*phiP_minus_phiphm + h2m*phiP_minus_phiphm*phiP_minus_phiphm + + h3m*phiP_minus_phiphm*phiP_minus_phiphm*phiP_minus_phiphm; } double BeetstraDrag::terminalVelocity(double voidfraction, double dp, double nuf, double rhof, double rhop, double g) const diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C index 3fb66969..0d886657 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C @@ -49,15 +49,12 @@ BeetstraDragPoly::BeetstraDragPoly : BeetstraDrag(dict,sm), fines_(propsDict_.lookupOrDefault("fines",false)), - dFine_(propsDict_.lookupOrDefault("dFine",1.0)) + dFine_(1.0) { // if fines are present, take mixture dSauter, otherwise normal dSauter if (fines_) { - if (!propsDict_.found("dFine")) - { - FatalError << "forceModel BeetstraDragPoly: Define fines diameter." << abort(FatalError); - } + dFine_ = readScalar(propsDict_.lookup("dFine")); volScalarField& alphaP(const_cast(sm.mesh().lookupObject ("alphaP"))); alphaP_.set(&alphaP); volScalarField& alphaSt(const_cast(sm.mesh().lookupObject ("alphaSt"))); From 554577d0bab3a7000ee8ba3abf0323e6fb221c33 Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Fri, 18 May 2018 14:30:42 +0200 Subject: [PATCH 23/35] Some more improvements. --- src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H | 2 +- src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H | 2 +- .../ZehnerSchluenderThermCond.C | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H index aeee157f..6f46acd1 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H @@ -341,7 +341,7 @@ public: virtual inline bool multipleTypesDMin() {return false;} inline bool getParticleDensities() const; - virtual inline double ** particleDensity() const; + virtual inline double ** particleDensities() const; virtual inline double particleDensity(label index) const; inline bool getParticleEffVolFactors() const; diff --git a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H index 187d043f..02b3a7dc 100644 --- a/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H +++ b/src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H @@ -221,7 +221,7 @@ inline bool cfdemCloud::getParticleDensities() const return getParticleDensities_; } -inline double ** cfdemCloud::particleDensity() const +inline double ** cfdemCloud::particleDensities() const { return particleDensities_; } diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C index 1d1cec33..e7647b7a 100644 --- a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C @@ -51,7 +51,7 @@ ZehnerSchluenderThermCond::ZehnerSchluenderThermCond thermCondModel(dict,sm), propsDict_(dict.subDict(typeName + "Props")), partKsField_ - ( + ( IOobject ( "partKs", @@ -145,7 +145,7 @@ tmp ZehnerSchluenderThermCond::thermCond() const scalar B = 0.0; scalar C = 0.0; scalar k = 0.0; - scalar OnemBoA = 0.0; + scalar InvOnemBoA = 0.0; scalar voidfraction = 0.0; scalar w = 7.26e-3; @@ -157,9 +157,9 @@ tmp ZehnerSchluenderThermCond::thermCond() const { A = partKsField_[cellI]/kf0_.value(); B = 1.25 * Foam::pow((1 - voidfraction) / voidfraction, 1.11); - OnemBoA = 1.0 - B/A; - C = (A - 1) / (OnemBoA * OnemBoA) * B/A * log(A/B) - (B - 1)/OnemBoA - 0.5 * (B + 1); - C *= 2.0 / OnemBoA; + InvOnemBoA = 1.0/(1.0 - B/A); + C = (A - 1) * InvOnemBoA * InvOnemBoA * B/A * log(A/B) - (B - 1) * InvOnemBoA - 0.5 * (B + 1); + C *= 2.0 * InvOnemBoA; k = Foam::sqrt(1 - voidfraction) * (w * A + (1 - w) * C) * kf0_.value(); svf[cellI] = k / (1 - voidfraction); } From c1cb77f08c6d3afab4f4f432c9aef029dc229709 Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Tue, 22 May 2018 09:42:24 +0200 Subject: [PATCH 24/35] Replaced hardcoded temperature limits with user-defined ones. --- .../heatTransferGunnPartField.C | 21 ++++++++++++++----- .../heatTransferGunnPartField.H | 4 ++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C index 2dac2222..d4a116d0 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C @@ -56,11 +56,13 @@ heatTransferGunnPartField::heatTransferGunnPartField ), sm.mesh(), dimensionedScalar("zero", dimensionSet(0,2,-2,-1,0,0,0), 0.0), - "zeroGradient" + "zeroGradient" ), partRhoField_(sm.mesh().lookupObject("partRho")), typeCp_(propsDict_.lookupOrDefault("specificHeatCapacities",scalarList(1,-1.0))), partCp_(NULL), + pTMax_(dimensionedScalar("pTMax",dimensionSet(0,0,0,1,0,0,0), -1.0)), + pTMin_(dimensionedScalar("pTMin",dimensionSet(0,0,0,1,0,0,0), -1.0)), thermCondModel_ ( thermCondModel::New @@ -80,6 +82,16 @@ heatTransferGunnPartField::heatTransferGunnPartField { FatalError << "heatTransferGunnPartField: provide list of specific heat capacities." << abort(FatalError); } + + if (propsDict_.found("pTMax")) + { + pTMax_.value()=scalar(readScalar(propsDict_.lookup("pTMax"))); + } + + if (propsDict_.found("pTMin")) + { + pTMin_.value()=scalar(readScalar(propsDict_.lookup("pTMin"))); + } partTempField_.writeOpt() = IOobject::AUTO_WRITE; @@ -216,10 +228,9 @@ void heatTransferGunnPartField::solve() fvOptions.correct(partTempField_); - dimensionedScalar pTMin("pTMin",dimensionSet(0,0,0,1,0,0,0),293.0); - dimensionedScalar pTMax("pTMin",dimensionSet(0,0,0,1,0,0,0),3000.0); - partTempField_ = max(partTempField_, pTMin); - partTempField_ = min(partTempField_, pTMax); + if (pTMax_.value() > 0.0) partTempField_ = min(partTempField_, pTMax_); + if (pTMin_.value() > 0.0) partTempField_ = max(partTempField_, pTMin_); + Info<< "partT max/min : " << max(partTempField_).value() << " " << min(partTempField_).value() << endl; diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H index a321be7e..296c9a49 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.H @@ -53,6 +53,10 @@ private: mutable double **partCp_; + dimensionedScalar pTMax_; + + dimensionedScalar pTMin_; + autoPtr thermCondModel_; fv::options& fvOptions; From 0d7916746ab834af414d6ed6f71a81882eceb76a Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Tue, 22 May 2018 15:23:35 +0200 Subject: [PATCH 25/35] Added return NULL to silence compiler. --- .../ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C index e7647b7a..7e4ca613 100644 --- a/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C +++ b/src/lagrangian/cfdemParticle/subModels/thermCondModel/ZehnerSchluenderThermCond/ZehnerSchluenderThermCond.C @@ -181,6 +181,7 @@ tmp ZehnerSchluenderThermCond::thermCond() const tmp ZehnerSchluenderThermCond::thermDiff() const { FatalError << "ZehnerSchluenderThermCond does not provide thermal diffusivity." << abort(FatalError); + return tmp(NULL); } void ZehnerSchluenderThermCond::calcPartKsField() const From 06633e9e4d5ba4c4e6d65e38468f2943bdc8480b Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Tue, 22 May 2018 15:24:36 +0200 Subject: [PATCH 26/35] Reset array where necessary. --- .../heatTransferGunnPartField/heatTransferGunnPartField.C | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C index d4a116d0..2d8af0e6 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnPartField/heatTransferGunnPartField.C @@ -164,6 +164,8 @@ void heatTransferGunnPartField::postFlow() scalar Tpart(0.0); interpolationCellPoint partTInterpolator_(partTempField_); + particleCloud_.dataExchangeM().allocateArray(partTemp_,0.0,1); + for(int index = 0;index < particleCloud_.numberOfParticles(); ++index) { cellI = particleCloud_.cellIDs()[index][0]; From d29b4673971e8196e6d95e7364e40bcf0c49e7d7 Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 4 Jun 2018 15:28:11 +0200 Subject: [PATCH 27/35] Look for static hold up only if fines are present. --- .../subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C index 0d886657..04e12ed9 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C @@ -80,7 +80,7 @@ BeetstraDragPoly::~BeetstraDragPoly() void BeetstraDragPoly::adaptVoidfraction(double& voidfraction, label cellI) const { - voidfraction -= alphaSt_()[cellI]; + if (fines_) voidfraction -= alphaSt_()[cellI]; if (voidfraction < minVoidfraction_) voidfraction = minVoidfraction_; } From 19f27d279d0b6305ae5e055a25121ff43cad4d74 Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Wed, 30 May 2018 17:41:48 +0200 Subject: [PATCH 28/35] add postprocessing model for momentum-diameter correlation. --- .../forceModel/pdCorrelation/pdCorrelation.C | 334 ++++++++++++++++++ .../forceModel/pdCorrelation/pdCorrelation.H | 99 ++++++ 2 files changed, 433 insertions(+) create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C new file mode 100644 index 00000000..44c428a3 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C @@ -0,0 +1,334 @@ +/*---------------------------------------------------------------------------*\ +License + This 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. + This code 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 this code. If not, see . + +Description + calculates the correlation between particle momentum and diameter + +SourceFiles + pdCorrelation.C + +Contributing Author + 2018 Paul Kieckhefen, TUHH +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "pdCorrelation.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(pdCorrelation, 0); + +addToRunTimeSelectionTable +( + forceModel, + pdCorrelation, + dictionary +); + +const dimensionSet dimMomentum(dimForce*dimTime); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +pdCorrelation::pdCorrelation +( + const dictionary& dict, + cfdemCloud& sm +) +: + forceModel(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + d_(nullptr), + p_(nullptr), + d2_(nullptr), + pd_(nullptr), + cg3_(nullptr), + dField_ + ( IOobject + ( + "dField", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimLength, 0), + "zeroGradient" + ), + pField_ + ( IOobject + ( + "pField", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedVector("zero", dimMomentum, vector::zero) + ), + d2Field_ + ( IOobject + ( + "d2Field", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimLength*dimLength, 0) + ), + pdField_ + ( IOobject + ( + "pdCorrelation", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + sm.mesh(), + dimensionedVector("zero", dimMomentum*dimLength, vector::zero), + "zeroGradient" + ), + cg3FieldPtr_(), + typeCG_ + ( + propsDict_.lookupOrDefault + ( + "coarseGrainingFactors", + scalarList(1, sm.cg()) + ) + ), + particleDensities_ + ( + propsDict_.lookupOrDefault + ( + "particleDensities", + scalarList(1, -1.) + ) + ), + constantCG_(typeCG_.size() > 0), + CG_(!(constantCG_ && abs(typeCG_[0] - 1.) < SMALL)) +{ + if ((particleDensities_[0] < 0) && !particleCloud_.getParticleDensities()) + { + FatalError<< "Please set the particle density either in LIGGGHTS" + << "or the pdCorrelationPropsDict." + << "In the first case, set getParticleDensities in the couplingProperties." + << abort(FatalError); + } + + allocateMyArrays(); + if (CG_) + { + cg3FieldPtr_.set + ( new volScalarField + ( IOobject + ( + "CG3Field", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimless, 0) + ) + ); + } + + dField_.write(); + pdField_.write(); + + + // init force sub model + setForceSubModels(propsDict_); +} + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +pdCorrelation::~pdCorrelation() +{ + if (!constantCG_) + { + particleCloud_.dataExchangeM().destroy(cg3_, 1); + } + particleCloud_.dataExchangeM().destroy(d_, 1); + particleCloud_.dataExchangeM().destroy(p_, 3); + particleCloud_.dataExchangeM().destroy(d2_, 1); + particleCloud_.dataExchangeM().destroy(pd_, 3); +} + +// * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * // +void pdCorrelation::allocateMyArrays() const +{ + // get memory for 2d arrays + double initVal = 0.0; + particleCloud_.dataExchangeM().allocateArray(d_, initVal, 1); + particleCloud_.dataExchangeM().allocateArray(p_, initVal, 3); + particleCloud_.dataExchangeM().allocateArray(d2_, initVal, 1); + particleCloud_.dataExchangeM().allocateArray(pd_, initVal, 3); + if (CG_) + { + particleCloud_.dataExchangeM().allocateArray(cg3_, initVal, 1); + } +} +// * * * * * * * * * * * * * * * public Member Functions * * * * * * * * * * * * * // + +void pdCorrelation::setForce() const +{ + const fvMesh& mesh = particleCloud_.mesh(); + + if (!mesh.write()) return; // skip if it's not write time + + allocateMyArrays(); + + const Switch densityFromList + ( + particleCloud_.getParticleTypes() + && particleCloud_.getParticleDensities() + ); + + const scalar piOverSix = constant::mathematical::pi / 6.; + + label celli(0); + scalar dp(0.); + scalar cg(typeCG_[0]); + scalar rhop(particleDensities_[0]); + label typei(0); + scalar particleV(0.); + for(int pi = 0; pi < particleCloud_.numberOfParticles(); ++pi) + { + celli = particleCloud_.cellIDs()[pi][0]; + if (celli < 0) continue; + + dp = particleCloud_.d(pi); + if (particleCloud_.getParticleTypes()) + { + typei = particleCloud_.particleTypes()[pi][0] - 1; + rhop = densityFromList ? particleDensities_[typei] + : particleCloud_.particleDensity(pi); + cg = constantCG_ ? typeCG_[typei] : typeCG_[0]; + } + + particleV = piOverSix * rhop * dp * dp * dp; + d_ [pi][0] = cg * cg * dp; + d2_[pi][0] = cg * dp * dp; + p_ [pi][0] = particleV * particleCloud_.velocities()[pi][0]; + p_ [pi][1] = particleV * particleCloud_.velocities()[pi][1]; + p_ [pi][2] = particleV * particleCloud_.velocities()[pi][2]; + pd_[pi][0] = p_[pi][0] * dp / cg; + pd_[pi][1] = p_[pi][1] * dp / cg; + pd_[pi][2] = p_[pi][2] * dp / cg; + + if (CG_) + { + cg3_[pi][0] = cg * cg * cg; + } + } + + dField_.primitiveFieldRef() = 0.0; + pField_.primitiveFieldRef() = vector::zero; + d2Field_.primitiveFieldRef() = 0.0; + pdField_.primitiveFieldRef() = vector::zero; + + particleCloud_.averagingM().setScalarSum + ( + dField_, + d_, + particleCloud_.particleWeights(), + nullptr + ); + particleCloud_.averagingM().setVectorSum + ( + pField_, + p_, + particleCloud_.particleWeights(), + nullptr + ); + particleCloud_.averagingM().setScalarSum + ( + d2Field_, + d2_, + particleCloud_.particleWeights(), + nullptr + ); + particleCloud_.averagingM().setVectorSum + ( + pdField_, + pd_, + particleCloud_.particleWeights(), + nullptr + ); + + if (CG_) + { + volScalarField& cg3Field_ = cg3FieldPtr_(); + particleCloud_.averagingM().setScalarSum + ( + cg3Field_, + cg3_, + particleCloud_.particleWeights(), + nullptr + ); + + scalar oneOverCG3(1.); + forAll(cg3Field_, celli) + { + if (cg3Field_[celli] < 1.) continue; + oneOverCG3 = 1./cg3Field_[celli]; + oneOverCG3 = oneOverCG3 * oneOverCG3 * oneOverCG3; + + dField_ [celli] *= oneOverCG3; + pField_ [celli] *= oneOverCG3; + d2Field_[celli] *= oneOverCG3; + pdField_[celli] *= oneOverCG3; + } + } + + scalar denom(0.); + forAll(dField_, celli) + { + if (dField_[celli] < SMALL) + { + pdField_[celli] = vector::zero; + continue; + } + denom = d2Field_[celli] - dField_[celli] * dField_[celli]; + if (denom < SMALL) + { + pdField_[celli] = vector::zero; + continue; + } + + pdField_[celli] -= dField_[celli] * pField_[celli]; + pdField_[celli] /= denom; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H new file mode 100644 index 00000000..817e10af --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------------*\ +License + This 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. + This code 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 this code. If not, see . + + Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria + +Description + calculates the granular kinetic energy + +SourceFiles + pdCorrelation.C +\*---------------------------------------------------------------------------*/ + +#ifndef pdCorrelation_H +#define pdCorrelation_H + +#include "forceModel.H" +#include "averagingModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class pdCorrelation Declaration +\*---------------------------------------------------------------------------*/ + +class pdCorrelation +: + public forceModel +{ +private: + + dictionary propsDict_; + + mutable double **d_; + mutable double **p_; + mutable double **d2_; + mutable double **pd_; + mutable double **cg3_; + + mutable volScalarField dField_; + mutable volVectorField pField_; + mutable volScalarField d2Field_; + mutable volVectorField pdField_; + + mutable autoPtr cg3FieldPtr_; + + const scalarList typeCG_; + const scalarList particleDensities_; + const Switch constantCG_; + const Switch CG_; + + void allocateMyArrays() const; + +public: + + //- Runtime type information + TypeName("pdCorrelation"); + + // Constructors + + //- Construct from components + pdCorrelation + ( + const dictionary& dict, + cfdemCloud& sm + ); + + // Destructor + + ~pdCorrelation(); + + + // Member Functions + void setForce() const; + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // From 3361956058275e6cef0b9dbbc40b39b40d4602d8 Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Wed, 30 May 2018 17:45:10 +0200 Subject: [PATCH 29/35] build new model. --- src/lagrangian/cfdemParticle/Make/files | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lagrangian/cfdemParticle/Make/files b/src/lagrangian/cfdemParticle/Make/files index 93e0999c..85382270 100644 --- a/src/lagrangian/cfdemParticle/Make/files +++ b/src/lagrangian/cfdemParticle/Make/files @@ -71,6 +71,7 @@ $(forceModels)/Fines/FinesFields.C $(forceModels)/Fines/FanningDynFines.C $(forceModels)/Fines/ErgunStatFines.C $(forceModels)/granKineticEnergy/granKineticEnergy.C +$(forceModels)/pdCorrelation/pdCorrelation.C $(forceModelsMS)/forceModelMS/forceModelMS.C $(forceModelsMS)/forceModelMS/newForceModelMS.C From 8cd9ca56b9b7cc9d47e71dbe2fdb7f9ded87448e Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Wed, 30 May 2018 18:33:55 +0200 Subject: [PATCH 30/35] bugfixing and simplification. --- .../forceModel/pdCorrelation/pdCorrelation.C | 104 ++++++++---------- .../forceModel/pdCorrelation/pdCorrelation.H | 2 +- 2 files changed, 44 insertions(+), 62 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C index 44c428a3..c95762ee 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C @@ -110,7 +110,18 @@ pdCorrelation::pdCorrelation dimensionedVector("zero", dimMomentum*dimLength, vector::zero), "zeroGradient" ), - cg3FieldPtr_(), + cg3Field_ + ( IOobject + ( + "cg3Field", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimless, 0) + ), typeCG_ ( propsDict_.lookupOrDefault @@ -127,8 +138,8 @@ pdCorrelation::pdCorrelation scalarList(1, -1.) ) ), - constantCG_(typeCG_.size() > 0), - CG_(!(constantCG_ && abs(typeCG_[0] - 1.) < SMALL)) + constantCG_(typeCG_.size() < 2), + CG_(!constantCG_ || typeCG_[0] > 1. + SMALL) { if ((particleDensities_[0] < 0) && !particleCloud_.getParticleDensities()) { @@ -139,23 +150,6 @@ pdCorrelation::pdCorrelation } allocateMyArrays(); - if (CG_) - { - cg3FieldPtr_.set - ( new volScalarField - ( IOobject - ( - "CG3Field", - sm.mesh().time().timeName(), - sm.mesh(), - IOobject::NO_READ, - IOobject::NO_WRITE - ), - sm.mesh(), - dimensionedScalar("zero", dimless, 0) - ) - ); - } dField_.write(); pdField_.write(); @@ -169,10 +163,7 @@ pdCorrelation::pdCorrelation pdCorrelation::~pdCorrelation() { - if (!constantCG_) - { - particleCloud_.dataExchangeM().destroy(cg3_, 1); - } + particleCloud_.dataExchangeM().destroy(cg3_, 1); particleCloud_.dataExchangeM().destroy(d_, 1); particleCloud_.dataExchangeM().destroy(p_, 3); particleCloud_.dataExchangeM().destroy(d2_, 1); @@ -188,10 +179,7 @@ void pdCorrelation::allocateMyArrays() const particleCloud_.dataExchangeM().allocateArray(p_, initVal, 3); particleCloud_.dataExchangeM().allocateArray(d2_, initVal, 1); particleCloud_.dataExchangeM().allocateArray(pd_, initVal, 3); - if (CG_) - { - particleCloud_.dataExchangeM().allocateArray(cg3_, initVal, 1); - } + particleCloud_.dataExchangeM().allocateArray(cg3_, initVal, 1); } // * * * * * * * * * * * * * * * public Member Functions * * * * * * * * * * * * * // @@ -199,18 +187,23 @@ void pdCorrelation::setForce() const { const fvMesh& mesh = particleCloud_.mesh(); - if (!mesh.write()) return; // skip if it's not write time +// if (!mesh.write()) return; // skip if it's not write time allocateMyArrays(); const Switch densityFromList ( particleCloud_.getParticleTypes() - && particleCloud_.getParticleDensities() + && !particleCloud_.getParticleDensities() ); - const scalar piOverSix = constant::mathematical::pi / 6.; + dField_.primitiveFieldRef() = 0.0; + pField_.primitiveFieldRef() = vector::zero; + d2Field_.primitiveFieldRef() = 0.0; + pdField_.primitiveFieldRef() = vector::zero; + cg3Field_.primitiveFieldRef() = 0.; + label celli(0); scalar dp(0.); scalar cg(typeCG_[0]); @@ -228,7 +221,7 @@ void pdCorrelation::setForce() const typei = particleCloud_.particleTypes()[pi][0] - 1; rhop = densityFromList ? particleDensities_[typei] : particleCloud_.particleDensity(pi); - cg = constantCG_ ? typeCG_[typei] : typeCG_[0]; + cg = constantCG_ ? typeCG_[0] : typeCG_[typei]; } particleV = piOverSix * rhop * dp * dp * dp; @@ -241,16 +234,9 @@ void pdCorrelation::setForce() const pd_[pi][1] = p_[pi][1] * dp / cg; pd_[pi][2] = p_[pi][2] * dp / cg; - if (CG_) - { - cg3_[pi][0] = cg * cg * cg; - } + cg3_[pi][0] = CG_ ? cg * cg * cg : 1.; } - dField_.primitiveFieldRef() = 0.0; - pField_.primitiveFieldRef() = vector::zero; - d2Field_.primitiveFieldRef() = 0.0; - pdField_.primitiveFieldRef() = vector::zero; particleCloud_.averagingM().setScalarSum ( @@ -281,29 +267,25 @@ void pdCorrelation::setForce() const nullptr ); - if (CG_) + particleCloud_.averagingM().setScalarSum + ( + cg3Field_, + cg3_, + particleCloud_.particleWeights(), + nullptr + ); + + scalar oneOverCG3(1.); + forAll(cg3Field_, celli) { - volScalarField& cg3Field_ = cg3FieldPtr_(); - particleCloud_.averagingM().setScalarSum - ( - cg3Field_, - cg3_, - particleCloud_.particleWeights(), - nullptr - ); + if (cg3Field_[celli] < 1.) continue; + oneOverCG3 = 1./cg3Field_[celli]; + oneOverCG3 = oneOverCG3 * oneOverCG3 * oneOverCG3; - scalar oneOverCG3(1.); - forAll(cg3Field_, celli) - { - if (cg3Field_[celli] < 1.) continue; - oneOverCG3 = 1./cg3Field_[celli]; - oneOverCG3 = oneOverCG3 * oneOverCG3 * oneOverCG3; - - dField_ [celli] *= oneOverCG3; - pField_ [celli] *= oneOverCG3; - d2Field_[celli] *= oneOverCG3; - pdField_[celli] *= oneOverCG3; - } + dField_ [celli] *= oneOverCG3; + pField_ [celli] *= oneOverCG3; + d2Field_[celli] *= oneOverCG3; + pdField_[celli] *= oneOverCG3; } scalar denom(0.); diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H index 817e10af..5a524f81 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H @@ -54,7 +54,7 @@ private: mutable volScalarField d2Field_; mutable volVectorField pdField_; - mutable autoPtr cg3FieldPtr_; + mutable volScalarField cg3Field_; const scalarList typeCG_; const scalarList particleDensities_; From 2151dbf0f8eca87bdf5d26a7dc7d95d0b69b3019 Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Mon, 4 Jun 2018 10:42:52 +0200 Subject: [PATCH 31/35] bugfix + switch to run on write time only. --- .../subModels/forceModel/pdCorrelation/pdCorrelation.C | 9 +++++---- .../subModels/forceModel/pdCorrelation/pdCorrelation.H | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C index c95762ee..dfc121f8 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C @@ -139,7 +139,8 @@ pdCorrelation::pdCorrelation ) ), constantCG_(typeCG_.size() < 2), - CG_(!constantCG_ || typeCG_[0] > 1. + SMALL) + CG_(!constantCG_ || typeCG_[0] > 1. + SMALL), + runOnWriteOnly_(propsDict_.lookupOrDefault("runOnWriteOnly", false)) { if ((particleDensities_[0] < 0) && !particleCloud_.getParticleDensities()) { @@ -187,7 +188,7 @@ void pdCorrelation::setForce() const { const fvMesh& mesh = particleCloud_.mesh(); -// if (!mesh.write()) return; // skip if it's not write time + if (runOnWriteOnly_ && !mesh.write()) return; // skip if it's not write time allocateMyArrays(); @@ -276,11 +277,11 @@ void pdCorrelation::setForce() const ); scalar oneOverCG3(1.); + const scalar oneMinusSmall(1.-SMALL); forAll(cg3Field_, celli) { - if (cg3Field_[celli] < 1.) continue; + if (cg3Field_[celli] < oneMinusSmall) continue; oneOverCG3 = 1./cg3Field_[celli]; - oneOverCG3 = oneOverCG3 * oneOverCG3 * oneOverCG3; dField_ [celli] *= oneOverCG3; pField_ [celli] *= oneOverCG3; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H index 5a524f81..1f548dfa 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H @@ -60,6 +60,7 @@ private: const scalarList particleDensities_; const Switch constantCG_; const Switch CG_; + const Switch runOnWriteOnly_; void allocateMyArrays() const; From e08e63c38b511c186eed0b391a886702d2a15734 Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Mon, 4 Jun 2018 11:58:41 +0200 Subject: [PATCH 32/35] also write pField. --- .../subModels/forceModel/pdCorrelation/pdCorrelation.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C index dfc121f8..ff0de5d0 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.C @@ -80,7 +80,7 @@ pdCorrelation::pdCorrelation sm.mesh().time().timeName(), sm.mesh(), IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), sm.mesh(), dimensionedVector("zero", dimMomentum, vector::zero) From 87c54c0fba67b3739d1e3ef1cc69eec448a9bbb6 Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Mon, 4 Jun 2018 15:51:17 +0200 Subject: [PATCH 33/35] [DOC] forceModel dSauter. --- doc/CFDEMcoupling_Manual.html | 46 ++++++++++++++++----------------- doc/CFDEMcoupling_Manual.txt | 1 + doc/Eqs/d32.png | Bin 0 -> 3204 bytes doc/forceModel.html | 2 +- doc/forceModel.txt | 2 +- doc/forceModel_dSauter.html | 47 ++++++++++++++++++++++++++++++++++ doc/forceModel_dSauter.txt | 44 +++++++++++++++++++++++++++++++ 7 files changed, 117 insertions(+), 25 deletions(-) create mode 100644 doc/Eqs/d32.png create mode 100644 doc/forceModel_dSauter.html create mode 100644 doc/forceModel_dSauter.txt diff --git a/doc/CFDEMcoupling_Manual.html b/doc/CFDEMcoupling_Manual.html index c100495e..6d2fc602 100644 --- a/doc/CFDEMcoupling_Manual.html +++ b/doc/CFDEMcoupling_Manual.html @@ -215,29 +215,29 @@ listing below of styles within certain commands. dataExchangeModel_twoWayMPIdataExchangeModel_twoWayMany2Many forceModelforceModel_Archimedes forceModel_ArchimedesIBforceModel_DiFeliceDrag -forceModel_GidaspowDragforceModel_KochHillDrag -forceModel_LaEuScalarTempforceModel_MeiLift -forceModel_SchillerNaumannDragforceModel_ShirgaonkarIB -forceModel_fieldStoreforceModel_gradPForce -forceModel_noDragforceModel_particleCellVolume -forceModel_virtualMassForceforceModel_viscForce -forceSubModelforceSubModel_ImEx -forceSubModel_ImExCorrliggghtsCommandModel -liggghtsCommandModel_executeliggghtsCommandModel_readLiggghtsData -liggghtsCommandModel_runLiggghtsliggghtsCommandModel_writeLiggghts -locateModellocateModel_engineSearch -locateModel_engineSearchIBlocateModel_engineSearchMany2Many -locateModel_standardSearchlocateModel_turboEngineSearch -meshMotionModelmeshMotionModel_noMeshMotion -momCoupleModelmomCoupleModel_explicitCouple -momCoupleModel_implicitCouplemomCoupleModel_noCouple -probeModelprobeModel_noProbe -regionModelregionModel_allRegion -smoothingModelsmoothingModel_constDiffSmoothing -smoothingModel_noSmoothingvoidfractionModel -voidfractionModel_GaussVoidFractionvoidfractionModel_IBVoidFraction -voidfractionModel_bigParticleVoidFractionvoidfractionModel_centreVoidFraction -voidfractionModel_dividedVoidFraction +forceModel_dSauterforceModel_GidaspowDrag +forceModel_KochHillDragforceModel_LaEuScalarTemp +forceModel_MeiLiftforceModel_SchillerNaumannDrag +forceModel_ShirgaonkarIBforceModel_fieldStore +forceModel_gradPForceforceModel_noDrag +forceModel_particleCellVolumeforceModel_virtualMassForce +forceModel_viscForceforceSubModel +forceSubModel_ImExforceSubModel_ImExCorr +liggghtsCommandModelliggghtsCommandModel_execute +liggghtsCommandModel_readLiggghtsDataliggghtsCommandModel_runLiggghts +liggghtsCommandModel_writeLiggghtslocateModel +locateModel_engineSearchlocateModel_engineSearchIB +locateModel_engineSearchMany2ManylocateModel_standardSearch +locateModel_turboEngineSearchmeshMotionModel +meshMotionModel_noMeshMotionmomCoupleModel +momCoupleModel_explicitCouplemomCoupleModel_implicitCouple +momCoupleModel_noCoupleprobeModel +probeModel_noProberegionModel +regionModel_allRegionsmoothingModel +smoothingModel_constDiffSmoothingsmoothingModel_noSmoothing +voidfractionModelvoidfractionModel_GaussVoidFraction +voidfractionModel_IBVoidFractionvoidfractionModel_bigParticleVoidFraction +voidfractionModel_centreVoidFractionvoidfractionModel_dividedVoidFraction diff --git a/doc/CFDEMcoupling_Manual.txt b/doc/CFDEMcoupling_Manual.txt index 3493934c..fdc93a03 100644 --- a/doc/CFDEMcoupling_Manual.txt +++ b/doc/CFDEMcoupling_Manual.txt @@ -260,6 +260,7 @@ listing below of styles within certain commands. "forceModel_Archimedes"_forceModel_Archimedes.html, "forceModel_ArchimedesIB"_forceModel_ArchimedesIB.html, "forceModel_DiFeliceDrag"_forceModel_DiFeliceDrag.html, +"forceModel_dSauter"_forceModel_dSauter.html, "forceModel_GidaspowDrag"_forceModel_GidaspowDrag.html, "forceModel_KochHillDrag"_forceModel_KochHillDrag.html, "forceModel_LaEuScalarTemp"_forceModel_LaEuScalarTemp.html, diff --git a/doc/Eqs/d32.png b/doc/Eqs/d32.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f91641652f1efa6fb942a2e827b929e5e42640 GIT binary patch literal 3204 zcmZ`*cQhMnAC5g@bEzFl(Lt=1pjOnnMskfbHc>02f{>V1b<zocFKyzP+tEFSi6Y007{%w1C0^045$r z9l*)TxP6Bv%ovH)&)CKo0I16V9(%DddS-8Hb12~K&y2S(868KsrHvWK5}OpShOmOy zb|L@(G_r&mJ4DTF6s_eILWGh%ioUXfqBUQMFAjS~Yk02n=Fi zhkAu(4Z6Ux!Oz-bX2cRWE>;y6&eG~E=a{2#z2y6+xVuEW0)Q5^{DdZv@vuTqk(nEA zaxYPu?Lpc0c*MSbi<|=6uf7PPiJnB0_W zX}!2<3P@U)h>Tln101im#uX%=O`OHq^yR$rqnkTxcV9c*XjOUMqt?lymZrz_9qG|R zUb{-ZnQ>&Ne?ARm4zF-fPOq5_O(sv5*hBZJYuv$e$4^crRV|_`)tG@1(~%+TJfUTB zpLj|_9_D0)mVqBrJn|YsH}V||Qf`!;(No|YC}m{w{8GLJ4!S? z3HSy=npoZ&6DHwi>4h*pD21@a5B#8{%$>4781#rY-CIgL>VscS*-E=WQp9w$>0C6W zRkQToD*x4wWxH9GghXo&pQqNZn={RCzUe~zNlctnST3}*Wj+7bnd+LpL9dmEstcED7F_x% zHy%tl^XvC_EB6w>f+|3275pOA?}?>)2BBr@1c+anPZ#2oe3L^f+SOUc zcKQL;s0U=0nbW7kpby%St2YV}wWX2-X z|C*8RT~2sjs}cW94*Uvl#Sa?9-&*i5TI(5|d}LYe(DzZ#+Z#7O)vfEI zdM8lqFfn4taaq*ua|5P9s3~ubC>aL6Ow1{rXsx9_Mmx>BYAy>^mINRWw#ANt#dT~C zlJhMBol^IeN7a3(<+s6oMNd8T{NDJI8rQ^B`_xoF*dsUos&)OqBEimte-~G^o?p|f zFf7&K`PS!;W%&g(M7=h*F>Mkbq=Bp?gzRIV72edF;%N~XvzkqA93&am2Q>U$OcD2Y zt6D2YJn@>Neyx`t*L!)#e81BMFK@KdwEdp{M3RMHdW()opXgf-d4N^=`6SZ0cggeP z!RC=ohlqSnx0ZLK2)j4mk)~m)(=C7Y9I>*DiI^*bYU{{<3-l(?@UXMDr!dQI&+XsTRk)0+;L22|T zXLP+*&iO~=&ldLZV)t?vWEaw@uP{Tbs5 zbdibER0u6WDEc7Lm?-b@EZoUzQKbmo@x|OJBh1HYz0C7>*?S%CV^&|sSj=HT?|Pw1 zE;aZnONX|4diPO=avit!c5JGe1@nggNx>|4yc`}Ko4!s5DR7-t)ymVxFA)U>MNjsm zqZ~0HW*pG%XR#$9irGCCUkGx0VDp%AOvSR$T6yIj0nrs z>F}{G%8M!M^_%UP{FcevX5yQuA*!8yFLxHTK+rtrW3~_`WVM*;6M0#NY2S~Zmokh{ za=~=nNu2AR86gVk6-6y6uTuq?*j@`g&90k?TVwss%>v2ciHJl~J+-IRN-G+tVU zGp?s7CePRaXem#|!^+)PhjS?AUIx4)A0J)5XI(PsAP-Mx)vvVs285$ZrJ^vt?K(mB zcHgp(O3AKMJ??ie-Z$J6tOky^&I8C9O8N?7%Kjv6fAgj8IC3@49 z=x?E0s40yK59dnO&la39ff7g)xRDEDFWbviN;X7Mi+wvgy*vH$(uz)2Qfgu0!;^^S zX#I#Noh{{c5!G~)F7o+k94mCDWOK#zMo}^$f7(|wz59_880q1z;@?8NKNA#35F9zY zn7A9#c|AW�dx+x0x4w_=6KpKELpNNSHkNK~^)P`*bO1ieV|2sYRkD1p0o$T|RE( zjCUHfHE4*$-=!ku^265BK%SIJ7jVB;w6 zzX>pPy&_mLAH&nk6!)oOUo`=TC^s3RD76dNC*CcKRDdMPF)PS^el6@}Sj7po8nDx* zf*sQhYK80U-=%D{={P{KPO2fWpqP~~a!D`Xb#@6Z`B;nNExfI6j5_ssWInaPJrXYeg~pZ@wI z6>svy<4;uT4sNt6Au=t*7_&V4&Fz0dc*>6!%|aJJ=-{ zfIloZ*Il^8if5BWkjESh;#AN!I*Y~xnyAJQHA!h|=U*=I`E)?DLq zEkrs9{m2*ME7M_mAns*$*w3=lh@U-o`1RKHJ1Ls&VIQdAJtQoPgI-O>9oy{I%l5zK zV$TW=pF5yCF$_9K8_Lgo&3KlUT>0@vw7zW46U(NY#86=PLPEPi-HJ`>h&Y|363H_# z+ibXq!H&pOl)|cubXythDoCpI)w98cCbGaq~csujJ9|`SZcK<52urSobcuaS<&M^%7Zhx+3 z+94xoY)m^BGsg8lZZq~PAk&25;D6=rq}Oo`w5h=BrE{wtEry$Z4|-^elFUQ-lzo9+ zt{2|Tg$CkAK<3_F!lcN*v#(6eGlRCYh%drKbp?UX6WR;TYrC+}r5i&w;ouRL0lmq= zNf%EbDUuhyTm60-fWHO}Y@8GeBIRS!7;sR3(pl=naM}!ApLI9dz@E%omn1KK+ M&1|7HCZ37^0k-q#@&Et; literal 0 HcmV?d00001 diff --git a/doc/forceModel.html b/doc/forceModel.html index 0e71fa58..fa2d2f78 100644 --- a/doc/forceModel.html +++ b/doc/forceModel.html @@ -41,7 +41,7 @@

Related commands:

-

Archimedes, DiFeliceDrag, gradPForce, viscForce +

Archimedes, DiFeliceDrag, gradPForce, viscForce">dSauter

Note: This examples list may be incomplete - please look for other models (forceModel_XY) in this documentation.

diff --git a/doc/forceModel.txt b/doc/forceModel.txt index 4ae3a1a1..2ada849a 100644 --- a/doc/forceModel.txt +++ b/doc/forceModel.txt @@ -39,7 +39,7 @@ None. [Related commands:] -"Archimedes"_forceModel_Archimedes.html, "DiFeliceDrag"_forceModel_DiFeliceDrag.html, "gradPForce"_forceModel_gradPForce.html, "viscForce"_forceModel_viscForce.html +"Archimedes"_forceModel_Archimedes.html, "DiFeliceDrag"_forceModel_DiFeliceDrag.html, "gradPForce"_forceModel_gradPForce.html, "viscForce"_forceModel_viscForce.html,"dSauter"_forceModel_dSauter.html Note: This examples list may be incomplete - please look for other models (forceModel_XY) in this documentation. diff --git a/doc/forceModel_dSauter.html b/doc/forceModel_dSauter.html new file mode 100644 index 00000000..4f8050e3 --- /dev/null +++ b/doc/forceModel_dSauter.html @@ -0,0 +1,47 @@ + +
CFDEMproject WWW Site - CFDEM Commands +
+ + + + +
+ +

forceModel_dSauter command +

+

Syntax: +

+

Defined in couplingProperties dictionary. +

+
forceModels
+(
+    dSauter
+);
+dSauterProps
+{
+    coarseGrainingFactors
+    (
+        X Y Z
+    );
+}; 
+
+
  • coarseGrainingFactors = list of coarse graining factors by type, separated by whitespace, optional + + +
+

Description: +

+

This "forceModel" does not influence the particles or the flow - it calculates the Sauter diameter +

+
+
+

. +

+

Restrictions: +

+

none. +

+

Related commands: +

+

forceModel

+ diff --git a/doc/forceModel_dSauter.txt b/doc/forceModel_dSauter.txt new file mode 100644 index 00000000..478c8dbd --- /dev/null +++ b/doc/forceModel_dSauter.txt @@ -0,0 +1,44 @@ +"CFDEMproject WWW Site"_lws - "CFDEM Commands"_lc :c + +:link(lws,http://www.cfdem.com) +:link(lc,CFDEMcoupling_Manual.html#comm) + +:line + +forceModel_dSauter command :h3 + +[Syntax:] + +Defined in couplingProperties dictionary. + +forceModels +( + dSauter +); +dSauterProps +\{ + coarseGrainingFactors + ( + X Y Z + ); +\}; :pre + +{coarseGrainingFactors} = list of coarse graining factors by type, separated by whitespace, optional :ulb,l + +:ule + +[Description:] + +This "forceModel" does not influence the particles or the flow - it calculates the Sauter diameter + +:c,image(Eqs/d32.png) +. + + +[Restrictions:] + +none. + +[Related commands:] + +"forceModel"_forceModel.html \ No newline at end of file From ec62d94d8f666f15f35041dca3f0d3668dacdb54 Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Mon, 4 Jun 2018 15:51:52 +0200 Subject: [PATCH 34/35] add description in header. --- .../subModels/forceModel/pdCorrelation/pdCorrelation.H | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H index 1f548dfa..7ea99050 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/pdCorrelation/pdCorrelation.H @@ -11,13 +11,15 @@ License You should have received a copy of the GNU General Public License along with this code. If not, see . - Copyright (C) 2015- Thomas Lichtenegger, JKU Linz, Austria Description - calculates the granular kinetic energy + calculates the correlation between particle diameter and momentum SourceFiles pdCorrelation.C + +Contributing Author + 2018 Paul Kieckhefen, TUHH \*---------------------------------------------------------------------------*/ #ifndef pdCorrelation_H From 653237a641c1ecfa443b7acc4eb3b7a730d89c7f Mon Sep 17 00:00:00 2001 From: Paul Kieckhefen Date: Mon, 4 Jun 2018 16:15:50 +0200 Subject: [PATCH 35/35] [DOC] for forceModel pdCorrelation. --- doc/CFDEMcoupling_Manual.html | 39 ++++++++++---------- doc/CFDEMcoupling_Manual.txt | 1 + doc/Eqs/pdCorrelation.png | Bin 0 -> 15167 bytes doc/forceModel_pdCorrelation.html | 58 ++++++++++++++++++++++++++++++ doc/forceModel_pdCorrelation.txt | 53 +++++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 19 deletions(-) create mode 100644 doc/Eqs/pdCorrelation.png create mode 100644 doc/forceModel_pdCorrelation.html create mode 100644 doc/forceModel_pdCorrelation.txt diff --git a/doc/CFDEMcoupling_Manual.html b/doc/CFDEMcoupling_Manual.html index 6d2fc602..eb31ac01 100644 --- a/doc/CFDEMcoupling_Manual.html +++ b/doc/CFDEMcoupling_Manual.html @@ -219,25 +219,26 @@ listing below of styles within certain commands. forceModel_KochHillDragforceModel_LaEuScalarTemp forceModel_MeiLiftforceModel_SchillerNaumannDrag forceModel_ShirgaonkarIBforceModel_fieldStore -forceModel_gradPForceforceModel_noDrag -forceModel_particleCellVolumeforceModel_virtualMassForce -forceModel_viscForceforceSubModel -forceSubModel_ImExforceSubModel_ImExCorr -liggghtsCommandModelliggghtsCommandModel_execute -liggghtsCommandModel_readLiggghtsDataliggghtsCommandModel_runLiggghts -liggghtsCommandModel_writeLiggghtslocateModel -locateModel_engineSearchlocateModel_engineSearchIB -locateModel_engineSearchMany2ManylocateModel_standardSearch -locateModel_turboEngineSearchmeshMotionModel -meshMotionModel_noMeshMotionmomCoupleModel -momCoupleModel_explicitCouplemomCoupleModel_implicitCouple -momCoupleModel_noCoupleprobeModel -probeModel_noProberegionModel -regionModel_allRegionsmoothingModel -smoothingModel_constDiffSmoothingsmoothingModel_noSmoothing -voidfractionModelvoidfractionModel_GaussVoidFraction -voidfractionModel_IBVoidFractionvoidfractionModel_bigParticleVoidFraction -voidfractionModel_centreVoidFractionvoidfractionModel_dividedVoidFraction +forceModel_pdCorrelationforceModel_gradPForce +forceModel_noDragforceModel_particleCellVolume +forceModel_virtualMassForceforceModel_viscForce +forceSubModelforceSubModel_ImEx +forceSubModel_ImExCorrliggghtsCommandModel +liggghtsCommandModel_executeliggghtsCommandModel_readLiggghtsData +liggghtsCommandModel_runLiggghtsliggghtsCommandModel_writeLiggghts +locateModellocateModel_engineSearch +locateModel_engineSearchIBlocateModel_engineSearchMany2Many +locateModel_standardSearchlocateModel_turboEngineSearch +meshMotionModelmeshMotionModel_noMeshMotion +momCoupleModelmomCoupleModel_explicitCouple +momCoupleModel_implicitCouplemomCoupleModel_noCouple +probeModelprobeModel_noProbe +regionModelregionModel_allRegion +smoothingModelsmoothingModel_constDiffSmoothing +smoothingModel_noSmoothingvoidfractionModel +voidfractionModel_GaussVoidFractionvoidfractionModel_IBVoidFraction +voidfractionModel_bigParticleVoidFractionvoidfractionModel_centreVoidFraction +voidfractionModel_dividedVoidFraction diff --git a/doc/CFDEMcoupling_Manual.txt b/doc/CFDEMcoupling_Manual.txt index fdc93a03..5a004c21 100644 --- a/doc/CFDEMcoupling_Manual.txt +++ b/doc/CFDEMcoupling_Manual.txt @@ -268,6 +268,7 @@ listing below of styles within certain commands. "forceModel_SchillerNaumannDrag"_forceModel_SchillerNaumannDrag.html, "forceModel_ShirgaonkarIB"_forceModel_ShirgaonkarIB.html, "forceModel_fieldStore"_forceModel_fieldStore.html, +"forceModel_pdCorrelation"_forceModel_pdCorrelation.html, "forceModel_gradPForce"_forceModel_gradPForce.html, "forceModel_noDrag"_forceModel_noDrag.html, "forceModel_particleCellVolume"_forceModel_particleCellVolume.html, diff --git a/doc/Eqs/pdCorrelation.png b/doc/Eqs/pdCorrelation.png new file mode 100644 index 0000000000000000000000000000000000000000..161dc5e8880341843763894a94bef78c75318e0a GIT binary patch literal 15167 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 BCVKz? literal 0 HcmV?d00001 diff --git a/doc/forceModel_pdCorrelation.html b/doc/forceModel_pdCorrelation.html new file mode 100644 index 00000000..c838e5e2 --- /dev/null +++ b/doc/forceModel_pdCorrelation.html @@ -0,0 +1,58 @@ + +
CFDEMproject WWW Site - CFDEM Commands +
+ + + + +
+ +

forceModel_pdCorrelation +

+

Syntax: +

+

Defined in couplingProperties dictionary. +

+
forceModels
+(
+    pdCorrelation
+);
+pdCorrelationProps
+{
+    coarseGrainingFactors
+    (
+        X Y Z
+    );
+    particleDensities
+    (
+        A B C
+    );
+    runOnWriteOnly true;
+}; 
+
+
  • coarseGrainingFactors = list of coarse graining factors by type, separated by whitespace, optional + +
  • particleDensities = list of particle densities by type, separated by whitespace, optional + +
  • runOnWriteOnly = switch if this should be executed on write, optional (default: false - execute every coupling step). + + +
+

Description: +

+

This "forceModel" does not influence the particles or the flow - it calculates the particle momentum-diameter correlation +

+
+
+

where delta is the type-specific coarsegraining factor. +

+

This model is sensitive to additionally pulled particle type info, and can either use the type-specific densities from the dict or those pulled from LIGGGHTS. +

+

Restrictions: +

+

none. +

+

Related commands: +

+

forceModel

+ diff --git a/doc/forceModel_pdCorrelation.txt b/doc/forceModel_pdCorrelation.txt new file mode 100644 index 00000000..34049c96 --- /dev/null +++ b/doc/forceModel_pdCorrelation.txt @@ -0,0 +1,53 @@ +"CFDEMproject WWW Site"_lws - "CFDEM Commands"_lc :c + +:link(lws,http://www.cfdem.com) +:link(lc,CFDEMcoupling_Manual.html#comm) + +:line + +forceModel_pdCorrelation :h3 + +[Syntax:] + +Defined in couplingProperties dictionary. + +forceModels +( + pdCorrelation +); +pdCorrelationProps +\{ + coarseGrainingFactors + ( + X Y Z + ); + particleDensities + ( + A B C + ); + runOnWriteOnly true; +\}; :pre + +{coarseGrainingFactors} = list of coarse graining factors by type, separated by whitespace, optional :ulb,l +{particleDensities} = list of particle densities by type, separated by whitespace, optional :l +{runOnWriteOnly} = switch if this should be executed on write, optional (default: false - execute every coupling step). :l + + +:ule + +[Description:] + +This "forceModel" does not influence the particles or the flow - it calculates the particle momentum-diameter correlation + +:c,image(Eqs/pdCorrelation.png) +where delta is the type-specific coarsegraining factor. + +This model is sensitive to additionally pulled particle type info, and can either use the type-specific densities from the dict or those pulled from LIGGGHTS. + +[Restrictions:] + +none. + +[Related commands:] + +"forceModel"_forceModel.html \ No newline at end of file