|
[Sponsors] |
January 19, 2016, 06:14 |
Population Balance Equation in OpenFOAM
|
#1 |
New Member
Amjad
Join Date: May 2012
Posts: 21
Rep Power: 14 |
Hello,
I am trying to couple my solver with Population Balance Equation (PBE) in order to describe the particle size distribution in the flow domain. Unfortunately, the solver is unstable and does not work well. To caluclate the particle distrubtion, I implement the DQMOM equations ( see equation.pngin OpenFOAM. These equations are taken from this paper done by Silva et al. "Implementation and analysis of numerical solution of the population balance equation in CFD packages" The implementation in OF used to determine the abscissa, the weight abscissa and the required coffecient can be found in the attachment (pbeDQMOM.H) Code:
{ for (int acorr=0; acorr< nPBECorr; acorr++) { forAll(absc[0], cellI) { // Aggregation (Sa) and breakege (Sb) contribution for cellI scalarField Sa = aggK -> aggregKernel(cellI); scalarField Sb = breakK -> breakKernel(cellI); // nmom number of moments // nmom=2*np // np is the quadarate nodes for(label k=0; k<nmom; k++) { for(label i=0; i<np; i++) { DQM[k][i] = (1-k)*pow(absc[i][cellI],k); DQM[k][i+np] = k*pow(absc[i][cellI],k-1); } source[k] = Sa[k] + Sb[k]; } //- Solve matrix and allocate the results into //- source term for DQMOM transport equations LUsolve(DQM, source); for(label i=0; i<np; i++) { zeta[i][cellI] = source[i]; omega[i][cellI] = source[i+np]; } } //- Solve transport equations for DQMOM //- alphac void fraction of contious phase surfaceScalarField Alphaf = fvc::interpolate(1.-alphac); //beta = scalar(1.0); forAll(weight, i) { surfaceScalarField phir = phid - phi; //phid disperse phase //phi continous phase //surfaceScalarField phix = fvc::interpolate(1-alphac)*phid + fvc::interpolate(alphac) *phi; fvScalarMatrix PBEq1 ( fvm::ddt(weight[i]) + fvm::div(phix,weight[i]) + fvm::div(phir,weight[i]) - fvm::div(phir*Alphaf,weight[i]) == zeta[i] ); fvScalarMatrix PBEq2 ( fvm::ddt(eta[i]) + fvm::div(phix,eta[i]) + fvm::div(phir,eta[i]) - fvm::div(phir*Alphaf,eta[i]) == omega[i] ); PBEq1.solve(); PBEq2.solve(); Info<<"here1" << nl; absc[i] = eta[i]/(weight[i]); } for(label i=0; i<np; i++) { num += eta[i]; den += pow(absc[i], 2./3.)*weight[i]; } Info<<"here2" << nl; ds= CC * num/(den + small); Info<<"here3" << nl; } } Code:
tmp<scalarField> aggMcCoyMadras::aggregKernel (const label cellId) const { scalarField Sa(2*np_, 0.0); scalar aux; // loop to calculate death and birth due aggregation for(label k=0; k < 2*np_; k++) { for(label i=0; i < np_; i++) { aux = 0.; for(label j=0; j < np_; j++) { aux += ( pow(abscissa_[i][cellId] + abscissa_[j][cellId] , k) - pow(abscissa_[i][cellId] , k) - pow(abscissa_[j][cellId] , k) ) * C1.value() * weight_[j][cellId]*weight_[i][cellId]; } Sa[k] += aux; } Sa[k] *= 0.5; } return tmp<scalarField> ( new scalarField(Sa) ); } Code:
tmp<scalarField> breakMcCoyMadras::breakKernel (const label cellId) const { scalarField Sb(2*np_, 0.0); // loop to calculate death and birth due breakage for(label k=0; k < 2*np_; k++) { for(label i=0; i < np_; i++) { Sb[k] += 0.5*abscissa_[i][cellId]*phiInf.value()*phiInf.value() * weight_[i][cellId] * pow(abscissa_[i][cellId], k) * ( ni.value()/(k + 1) - 1 ); } } return tmp<scalarField> ( new scalarField(Sb) ); } Code:
int main(int argc, char *argv[]) { argList::addOption ( "cloudName", "name", "specify alternative cloud name. default is 'kinematicCloud'" ); #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "createPBEVariables.H" #include "createFvOptions.H" #include "initContinuityErrs.H" pimpleControl pimple(mesh); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; while (runTime.run()) { #include "readTimeControls.H" #include "CourantNo.H" #include "setDeltaT.H" runTime++; // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { #include "UEqn.H" #include "pbeDQMOM.H" // --- Pressure corrector loop while (pimple.correct()) { #include "pEqn.H" } if (pimple.turbCorr()) { turbulence->correct(); } } runTime.write(); Info << "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; } Info<< "End\n" << endl; return 0; } Code:
here1 #0 Foam::error::printStack(Foam::Ostream&) at ??:? #1 Foam::sigFpe::sigHandler(int) at ??:? #2 in "/lib/x86_64-linux-gnu/libc.so.6" #3 in "/lib/x86_64-linux-gnu/libm.so.6" #4 pow in "/lib/x86_64-linux-gnu/libm.so.6" #5 Foam::pow(Foam::Field<double>&, Foam::UList<double> const&, double const&) at ??:? #6 void Foam::pow<Foam::fvPatchField, Foam::volMesh>(Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>&, Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, Foam::dimensioned<double> const&) at ??:? #7 Foam::tmp<Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> > Foam::pow<Foam::fvPatchField, Foam::volMesh>(Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, Foam::dimensioned<double> const&) at ??:? #8 Foam::tmp<Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> > Foam::pow<Foam::fvPatchField, Foam::volMesh>(Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, double const&) at ??:? #9 at ??:? #10 __libc_start_main in "/lib/x86_64-linux-gnu/libc.so.6" #11 at ??: It is my pleasure to get your suggestion and advices. Thank you for your help! |
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Map of the OpenFOAM Forum - Understanding where to post your questions! | wyldckat | OpenFOAM | 10 | September 2, 2021 06:29 |
OpenFOAM v3.0.1 Training, London, Houston, Berlin, Jan-Mar 2016 | cfd.direct | OpenFOAM Announcements from Other Sources | 0 | January 5, 2016 04:18 |
OpenFOAM Training, London, Chicago, Munich, Sep-Oct 2015 | cfd.direct | OpenFOAM Announcements from Other Sources | 2 | August 31, 2015 14:36 |
OpenFOAM representation for a partial equation | jimbean | OpenFOAM Running, Solving & CFD | 0 | October 24, 2013 14:30 |
Population balance for airlift reactor (FLUENT) | amira | Main CFD Forum | 1 | October 31, 2009 08:54 |