From 201cbe16fcc09f4dfdc7d4f2bcd9f8f53684e22b Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 28 Nov 2016 08:54:59 +0100 Subject: [PATCH 1/5] Compute granular kinetic energy per cell. --- src/lagrangian/cfdemParticle/Make/files | 1 + .../granKineticEnergy/granKineticEnergy.C | 136 ++++++++++++++++++ .../granKineticEnergy/granKineticEnergy.H | 89 ++++++++++++ src/lagrangian/cfdemParticleComp/Make/files | 1 + 4 files changed, 227 insertions(+) create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.C create mode 100644 src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.H diff --git a/src/lagrangian/cfdemParticle/Make/files b/src/lagrangian/cfdemParticle/Make/files index a9338ca1..9baa9dfe 100644 --- a/src/lagrangian/cfdemParticle/Make/files +++ b/src/lagrangian/cfdemParticle/Make/files @@ -68,6 +68,7 @@ $(forceModels)/Fines/Fines.C $(forceModels)/Fines/FinesFields.C $(forceModels)/Fines/FanningDynFines.C $(forceModels)/Fines/ErgunStatFines.C +$(forceModels)/granKineticEnergy/granKineticEnergy.C $(forceModelsMS)/forceModelMS/forceModelMS.C $(forceModelsMS)/forceModelMS/newForceModelMS.C diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.C b/src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.C new file mode 100644 index 00000000..350b20cb --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.C @@ -0,0 +1,136 @@ +/*---------------------------------------------------------------------------*\ +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 Sauter mean diameter \sum d_i^3 / \sum d_i^2 + +SourceFiles + granKineticEnergy.C +\*---------------------------------------------------------------------------*/ + +#include "error.H" + +#include "granKineticEnergy.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(granKineticEnergy, 0); + +addToRunTimeSelectionTable +( + forceModel, + granKineticEnergy, + dictionary +); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +granKineticEnergy::granKineticEnergy +( + const dictionary& dict, + cfdemCloud& sm +) +: + forceModel(dict,sm), + propsDict_(dict.subDict(typeName + "Props")), + vfluc_(NULL), + UsFieldName_(propsDict_.lookup("granVelFieldName")), + UsField_(sm.mesh().lookupObject (UsFieldName_)), + granKineticEnergy_ + ( IOobject + ( + "granKineticEnergy", + sm.mesh().time().timeName(), + sm.mesh(), + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + sm.mesh(), + dimensionedScalar("zero", dimensionSet(0,2,-2,0,0), 0), + "zeroGradient" + ) +{ + allocateMyArrays(); + granKineticEnergy_.write(); + + + // init force sub model + setForceSubModels(propsDict_); +} + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +granKineticEnergy::~granKineticEnergy() +{ + delete vfluc_; +} + +// * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * // +void granKineticEnergy::allocateMyArrays() const +{ + // get memory for 2d arrays + double initVal=0.0; + particleCloud_.dataExchangeM().allocateArray(vfluc_,initVal,1); +} +// * * * * * * * * * * * * * * * public Member Functions * * * * * * * * * * * * * // + +void granKineticEnergy::setForce() const +{ + allocateMyArrays(); + + label cellI=0; + vector velfluc(0,0,0); + + + for(int index = 0;index < particleCloud_.numberOfParticles(); ++index) + { + cellI = particleCloud_.cellIDs()[index][0]; + if(cellI >= 0) + { + velfluc = particleCloud_.velocity(index) - UsField_[cellI]; + vfluc_[index][0] = magSqr(velfluc); + } + } + + granKineticEnergy_.primitiveFieldRef() = 0.0; + + particleCloud_.averagingM().resetWeightFields(); + particleCloud_.averagingM().setScalarAverage + ( + granKineticEnergy_, + vfluc_, + particleCloud_.particleWeights(), + particleCloud_.averagingM().UsWeightField(), + NULL + ); + + granKineticEnergy_ *= 0.5; + +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.H b/src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.H new file mode 100644 index 00000000..8cc189b6 --- /dev/null +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/granKineticEnergy/granKineticEnergy.H @@ -0,0 +1,89 @@ +/*---------------------------------------------------------------------------*\ +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 + granKineticEnergy.C +\*---------------------------------------------------------------------------*/ + +#ifndef granKineticEnergy_H +#define granKineticEnergy_H + +#include "forceModel.H" +#include "averagingModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class granKineticEnergy Declaration +\*---------------------------------------------------------------------------*/ + +class granKineticEnergy +: + public forceModel +{ +private: + + dictionary propsDict_; + + mutable double **vfluc_; + + mutable volScalarField granKineticEnergy_; + + word UsFieldName_; + + const volVectorField& UsField_; + + void allocateMyArrays() const; + +public: + + //- Runtime type information + TypeName("granKineticEnergy"); + + // Constructors + + //- Construct from components + granKineticEnergy + ( + const dictionary& dict, + cfdemCloud& sm + ); + + // Destructor + + ~granKineticEnergy(); + + + // Member Functions + void setForce() const; + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/cfdemParticleComp/Make/files b/src/lagrangian/cfdemParticleComp/Make/files index 93f07759..df0d4379 100644 --- a/src/lagrangian/cfdemParticleComp/Make/files +++ b/src/lagrangian/cfdemParticleComp/Make/files @@ -64,6 +64,7 @@ $(forceModels)/Fines/Fines.C $(forceModels)/Fines/FinesFields.C $(forceModels)/Fines/FanningDynFines.C $(forceModels)/Fines/ErgunStatFines.C +$(forceModels)/granKineticEnergy/granKineticEnergy.C $(forceSubModels)/forceSubModel/newForceSubModel.C $(forceSubModels)/forceSubModel/forceSubModel.C From a800b6c426d427225513db1a8a9756c38f503e1f Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 28 Nov 2016 08:55:30 +0100 Subject: [PATCH 2/5] Fix Cp vs Cv issue in energy equation. --- .../solvers/cfdemSolverRhoPimple/EEqn.H | 12 +++---- .../cfdemSolverRhoPimple/createFields.H | 32 ++++++++++++++++++- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/applications/solvers/cfdemSolverRhoPimple/EEqn.H b/applications/solvers/cfdemSolverRhoPimple/EEqn.H index fb22d769..824235b4 100644 --- a/applications/solvers/cfdemSolverRhoPimple/EEqn.H +++ b/applications/solvers/cfdemSolverRhoPimple/EEqn.H @@ -5,10 +5,8 @@ volScalarField& he = thermo.he(); particleCloud.energyContributions(Qsource); - thDiff=particleCloud.thermCondM().thermDiff(); - // BC for thDiff are calculated from its mathematical expression - // to enforce user-defined values, change thDiff to MUST_READ and do - // thDiff.correctBoundaryConditions(); + //thDiff=particleCloud.thermCondM().thermDiff(); + thCond=particleCloud.thermCondM().thermCond(); addSource = fvc::ddt(rhoeps, K) + fvc::div(phi, K) + ( @@ -22,6 +20,8 @@ : -dpdt ); + Cpv = he.name() == "e" ? thermo.Cv() : thermo.Cp(); + fvScalarMatrix EEqn ( @@ -30,8 +30,8 @@ // net heat transfer from particles to fluid - Qsource // thermal conduction of the fluid with effective conductivity - - fvm::laplacian(rhoeps*thDiff,he) - + // - fvm::laplacian(rhoeps*thDiff,he) + - fvm::laplacian(voidfraction*thCond/Cpv,he) // + particle-fluid energy transfer due to work // + fluid energy dissipation due to shearing == diff --git a/applications/solvers/cfdemSolverRhoPimple/createFields.H b/applications/solvers/cfdemSolverRhoPimple/createFields.H index ab5b1d13..ce93d56d 100644 --- a/applications/solvers/cfdemSolverRhoPimple/createFields.H +++ b/applications/solvers/cfdemSolverRhoPimple/createFields.H @@ -97,7 +97,7 @@ Info<< "Reading thermophysical properties\n" << endl; dimensionedScalar("zero", dimensionSet(1,-1,-3,-1,0,0,0), 0.0) ); - Info<< "\nCreating thermal diffusivity field\n" << endl; + /* Info<< "\nCreating thermal diffusivity field\n" << endl; volScalarField thDiff ( IOobject @@ -111,6 +111,36 @@ Info<< "Reading thermophysical properties\n" << endl; mesh, dimensionedScalar("zero", dimensionSet(0,2,-1,0,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 From 5ba7f10a29bd89733dd63f78a0245ba3a3ab8f97 Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 28 Nov 2016 12:10:17 +0100 Subject: [PATCH 3/5] Fixed a logical error regarding averages with distributed particle weights. --- .../cfdemParticle/subModels/averagingModel/dense/dense.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lagrangian/cfdemParticle/subModels/averagingModel/dense/dense.C b/src/lagrangian/cfdemParticle/subModels/averagingModel/dense/dense.C index 5e567886..d1d8d345 100644 --- a/src/lagrangian/cfdemParticle/subModels/averagingModel/dense/dense.C +++ b/src/lagrangian/cfdemParticle/subModels/averagingModel/dense/dense.C @@ -101,7 +101,7 @@ void dense::setScalarAverage if (cellI >= 0) { valueScal = value[index][0]; - weightP = weight[index][0]; + weightP = weight[index][subCell]; // first entry in this cell if(weightField[cellI] == 0) From e752445880b2e4e5ad56af2554af84330b7f970a Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 28 Nov 2016 12:11:57 +0100 Subject: [PATCH 4/5] Some minor corrections for heat transfer. --- .../energyModel/heatTransferGunn/heatTransferGunn.C | 7 +++---- .../heatTransferGunnImplicit/heatTransferGunnImplicit.C | 8 ++++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C index 336648b9..4959ca76 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunn/heatTransferGunn.C @@ -201,10 +201,9 @@ void heatTransferGunn::calcEnergyContribution() particleCloud_.averagingM().UsWeightField(), NULL ); - volScalarField volP (1 - voidfraction_); - volScalarField weigthedTp (volP * partTempField_); - // average per cell-value, not per volume * cell-value - dimensionedScalar aveTemp = weigthedTp.average() / volP.average(); + + volScalarField sumTp (particleCloud_.averagingM().UsWeightField() * partTempField_); + dimensionedScalar aveTemp("aveTemp",dimensionSet(0,0,0,1,0,0,0), gSum(sumTp) / particleCloud_.numberOfParticles()); partRelTempField_ = (partTempField_ - aveTemp) / (aveTemp - partRefTemp_); Info << "heatTransferGunn: average part. temp = " << aveTemp.value() << endl; } diff --git a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnImplicit/heatTransferGunnImplicit.C b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnImplicit/heatTransferGunnImplicit.C index 3886a934..a204f6ca 100644 --- a/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnImplicit/heatTransferGunnImplicit.C +++ b/src/lagrangian/cfdemParticle/subModels/energyModel/heatTransferGunnImplicit/heatTransferGunnImplicit.C @@ -74,7 +74,7 @@ heatTransferGunnImplicit::~heatTransferGunnImplicit() // * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * // void heatTransferGunnImplicit::allocateMyArrays() const { - heatTransferGunn::allocateMyArrays(); +// heatTransferGunn::allocateMyArrays(); double initVal=0.0; particleCloud_.dataExchangeM().allocateArray(partHeatFluxCoeff_,initVal,1); } @@ -82,7 +82,11 @@ void heatTransferGunnImplicit::allocateMyArrays() const void heatTransferGunnImplicit::calcEnergyContribution() { + allocateMyArrays(); + heatTransferGunn::calcEnergyContribution(); + + QPartFluidCoeff_.primitiveFieldRef() = 0.0; particleCloud_.averagingM().setScalarSum ( @@ -94,7 +98,7 @@ void heatTransferGunnImplicit::calcEnergyContribution() QPartFluidCoeff_.primitiveFieldRef() /= -QPartFluidCoeff_.mesh().V(); - QPartFluidCoeff_.correctBoundaryConditions(); +// QPartFluidCoeff_.correctBoundaryConditions(); } From e3799108fdfe7c292c343a02f87b761491eab08e Mon Sep 17 00:00:00 2001 From: tlichtenegger Date: Mon, 28 Nov 2016 12:12:27 +0100 Subject: [PATCH 5/5] Allow implicit heat transfer in energy equation. --- applications/solvers/cfdemSolverRhoPimple/EEqn.H | 12 ++++++------ .../solvers/cfdemSolverRhoPimple/createFields.H | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/applications/solvers/cfdemSolverRhoPimple/EEqn.H b/applications/solvers/cfdemSolverRhoPimple/EEqn.H index 824235b4..606d9fe2 100644 --- a/applications/solvers/cfdemSolverRhoPimple/EEqn.H +++ b/applications/solvers/cfdemSolverRhoPimple/EEqn.H @@ -4,6 +4,7 @@ // dim he = J / kg volScalarField& he = thermo.he(); particleCloud.energyContributions(Qsource); + particleCloud.energyCoefficients(QCoeff); //thDiff=particleCloud.thermCondM().thermDiff(); thCond=particleCloud.thermCondM().thermCond(); @@ -29,6 +30,7 @@ + addSource // net heat transfer from particles to fluid - Qsource + - fvm::Sp(QCoeff/Cpv, he) // thermal conduction of the fluid with effective conductivity // - fvm::laplacian(rhoeps*thDiff,he) - fvm::laplacian(voidfraction*thCond/Cpv,he) @@ -38,12 +40,6 @@ fvOptions(rho, he) ); - - // work in progress: - // if (particleCloud.implicitEnergyModel) - // volScalarField& tpart (lookup ...) - // particleCloud.energyCoefficients(Qcoeff); - // EEqn += ... EEqn.relax(); @@ -56,4 +52,8 @@ 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/createFields.H b/applications/solvers/cfdemSolverRhoPimple/createFields.H index ce93d56d..eac9a5a7 100644 --- a/applications/solvers/cfdemSolverRhoPimple/createFields.H +++ b/applications/solvers/cfdemSolverRhoPimple/createFields.H @@ -83,11 +83,11 @@ Info<< "Reading thermophysical properties\n" << endl; ); Info<< "\nCreating fluid-particle heat flux coefficient field\n" << endl; - volScalarField Qcoeff + volScalarField QCoeff ( IOobject ( - "Qcoeff", + "QCoeff", runTime.timeName(), mesh, IOobject::NO_READ,