From 6d8e8bb7050403bbf78877aba6a10e6d4d0e1dcf Mon Sep 17 00:00:00 2001 From: s126103 Date: Tue, 10 Mar 2020 16:37:59 +0100 Subject: [PATCH] initial commit for mass transfer --- .../cfdemSolverMultiphaseScalar/CEqn.H | 26 +++++++ .../cfdemSolverMultiphaseScalar.C | 1 + .../createFields.H | 69 +++++++++++++++++++ .../multiphaseMixture/multiphaseMixture.C | 39 +++++++++++ .../multiphaseMixture/multiphaseMixture.H | 6 ++ .../multiphaseMixture/phase/phase.C | 6 +- .../multiphaseMixture/phase/phase.H | 14 ++++ 7 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 applications/solvers/cfdemSolverMultiphaseScalar/CEqn.H diff --git a/applications/solvers/cfdemSolverMultiphaseScalar/CEqn.H b/applications/solvers/cfdemSolverMultiphaseScalar/CEqn.H new file mode 100644 index 00000000..c407f73b --- /dev/null +++ b/applications/solvers/cfdemSolverMultiphaseScalar/CEqn.H @@ -0,0 +1,26 @@ + // get mixture properties + D = mixture.D(); + Cs = mixture.Cs(); + //keff=particleCloud.thermCondM().thermCond(); + + // get scalar source from DEM + //particleCloud.energyContributions(Qsource); + //particleCloud.energyCoefficients(QCoeff); + + fvScalarMatrix CEqn + ( + fvm::ddt(voidfraction,C) + + fvm::div(phi,C) + - fvc::div(D*voidfraction*fvc::grad(C)) + == + Csource + fvm::Sp(CCoeff,C) + ); + + + CEqn.relax(); + fvOptions.constrain(CEqn); + CEqn.solve(); + + particleCloud.clockM().start(31,"postFlow"); + particleCloud.postFlow(); + particleCloud.clockM().stop("postFlow"); diff --git a/applications/solvers/cfdemSolverMultiphaseScalar/cfdemSolverMultiphaseScalar.C b/applications/solvers/cfdemSolverMultiphaseScalar/cfdemSolverMultiphaseScalar.C index 0174eeee..725f4327 100644 --- a/applications/solvers/cfdemSolverMultiphaseScalar/cfdemSolverMultiphaseScalar.C +++ b/applications/solvers/cfdemSolverMultiphaseScalar/cfdemSolverMultiphaseScalar.C @@ -111,6 +111,7 @@ int main(int argc, char *argv[]) rhoEps = rho * voidfraction; #include "EEqn.H" + #include "CEqn.H" // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) diff --git a/applications/solvers/cfdemSolverMultiphaseScalar/createFields.H b/applications/solvers/cfdemSolverMultiphaseScalar/createFields.H index 9a7d6281..98c2a59e 100644 --- a/applications/solvers/cfdemSolverMultiphaseScalar/createFields.H +++ b/applications/solvers/cfdemSolverMultiphaseScalar/createFields.H @@ -190,6 +190,75 @@ volScalarField keff dimensionedScalar("zero", dimensionSet(1,1,-3,-1,0,0,0), 0.0) ); +Info<< "Reading/creating concentration fields\n" << endl; +volScalarField C +( + IOobject + ( + "C", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +volScalarField Csource +( + IOobject + ( + "Csource", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("zero", dimensionSet(1,-3,-1,0,0,0,0), 0.0) +); + +volScalarField CCoeff +( + IOobject + ( + "Csource", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("zero", dimensionSet(0,0,-1,0,0,0,0), 0.0) +); + + +volScalarField D +( + IOobject + ( + "D", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + mixture.D() +); + +volScalarField Cs +( + IOobject + ( + "Cs", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + mixture.Cs() +); + //======================== diff --git a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.C b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.C index faa3a1ec..36150332 100644 --- a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.C +++ b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.C @@ -416,6 +416,45 @@ Foam::multiphaseMixture::kf() const return tkf; } +Foam::tmp +Foam::multiphaseMixture::D() const +{ + PtrDictionary::const_iterator iter = phases_.begin(); + + // 1/D + tmp tDInv = iter()/iter().D(); + volScalarField& DInv = tDInv.ref(); + + // D + tmp tD = iter()*iter().D(); + volScalarField& D = tD.ref(); + + for (++iter; iter != phases_.end(); ++iter) + { + DInv += iter()/iter().D(); + } + + D = 1/DInv; + return tD; +} + +Foam::tmp +Foam::multiphaseMixture::Cs() const +{ + PtrDictionary::const_iterator iter = phases_.begin(); + + // Cs + tmp tCs = iter()*iter().Cs(); + volScalarField& Cs = tCs.ref(); + + for (++iter; iter != phases_.end(); ++iter) + { + Cs += iter()*iter().Cs(); + } + + return tCs; +} + void Foam::multiphaseMixture::solve() { correct(); diff --git a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.H b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.H index c7334d4a..ba6765d4 100644 --- a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.H +++ b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/multiphaseMixture.H @@ -259,6 +259,12 @@ public: //- Return the thermal conductivity tmp kf() const; + //- Return the diffusion coefficient + tmp D() const; + + //- Return the solubility + tmp Cs() const; + tmp surfaceTensionForce() const { return surfaceTensionForce_; diff --git a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.C b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.C index 5b0d90ec..4d8b6a95 100644 --- a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.C +++ b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.C @@ -61,7 +61,9 @@ Foam::phase::phase ), rho_("rho", dimDensity, phaseDict_), Cp_("Cp", (dimSpecificHeatCapacity), phaseDict_), - kf_("kf", (dimPower/dimLength/dimTemperature), phaseDict_) + kf_("kf", (dimPower/dimLength/dimTemperature), phaseDict_), + D_("D", dimViscosity, phaseDict_), + Cs_("Cs", dimDensity, phaseDict_) {} @@ -86,6 +88,8 @@ bool Foam::phase::read(const dictionary& phaseDict) phaseDict_.lookup("Cp") >> Cp_; phaseDict_.lookup("kf") >> kf_; + phaseDict_.lookup("D") >> D_; + phaseDict_.lookup("Cs") >> Cs_; if (nuModel_->read(phaseDict_)) { diff --git a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.H b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.H index e61f63c9..a8957122 100644 --- a/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.H +++ b/applications/solvers/cfdemSolverMultiphaseScalar/multiphaseMixture/phase/phase.H @@ -62,6 +62,8 @@ class phase dimensionedScalar rho_; dimensionedScalar Cp_; dimensionedScalar kf_; + dimensionedScalar D_; + dimensionedScalar Cs_; public: @@ -154,6 +156,18 @@ public: return kf_; } + //- Return const-access to phase1 diffusion coefficient + const dimensionedScalar& D() const + { + return D_; + } + + //- Return const-access to phase1 solubility + const dimensionedScalar& Cs() const + { + return Cs_; + } + //- Correct the phase properties void correct();