This repository has been archived on 2023-11-20. You can view files and clone it, but cannot push or open issues or pull requests.
foam-extend4.1-coherent-io/applications/solvers/combustion/PDRFoam/bEqn.H
2012-01-29 12:01:07 +00:00

108 lines
2.6 KiB
C++

tmp<fv::convectionScheme<scalar> > mvConvection
(
fv::convectionScheme<scalar>::New
(
mesh,
fields,
phi,
mesh.schemesDict().divScheme("div(phi,ft_b_h_hu)")
)
);
volScalarField Db("Db", turbulence->muEff());
if (ign.ignited())
{
// Calculate the unstrained laminar flame speed
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Su = unstrainedLaminarFlameSpeed()();
const volScalarField& Xi = flameWrinkling->Xi();
// progress variable
// ~~~~~~~~~~~~~~~~~
volScalarField c("c", 1.0 - b);
// Unburnt gas density
// ~~~~~~~~~~~~~~~~~~~
volScalarField rhou = thermo.rhou();
// Calculate flame normal etc.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
//volVectorField n = fvc::grad(b);
volVectorField n = fvc::reconstruct(fvc::snGrad(b)*mesh.magSf());
volScalarField mgb("mgb", mag(n));
dimensionedScalar dMgb("dMgb", mgb.dimensions(), SMALL);
{
volScalarField bc = b*c;
dMgb += 1.0e-3*
(bc*mgb)().weightedAverage(mesh.V())
/(bc.weightedAverage(mesh.V()) + SMALL);
}
mgb += dMgb;
surfaceVectorField Sfhat = mesh.Sf()/mesh.magSf();
surfaceVectorField nfVec = fvc::interpolate(n);
nfVec += Sfhat*(fvc::snGrad(b) - (Sfhat & nfVec));
nfVec /= (mag(nfVec) + dMgb);
surfaceScalarField nf("nf", mesh.Sf() & nfVec);
n /= mgb;
# include "StCorr.H"
// Calculate turbulent flame speed flux
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
surfaceScalarField phiSt("phiSt", fvc::interpolate(rhou*StCorr*St)*nf);
# include "StCourantNo.H"
Db = flameWrinkling->Db();
// Create b equation
// ~~~~~~~~~~~~~~~~~
fvScalarMatrix bEqn
(
betav*fvm::ddt(rho, b)
+ mvConvection->fvmDiv(phi, b)
+ fvm::div(phiSt, b)
- fvm::Sp(fvc::div(phiSt), b)
- fvm::laplacian(Db, b)
);
// Add ignition cell contribution to b-equation
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# include "ignite.H"
// Solve for b
// ~~~~~~~~~~~
bEqn.solve();
Info<< "min(b) = " << min(b).value() << endl;
if (composition.contains("ft"))
{
volScalarField& ft = composition.Y("ft");
Info<< "Combustion progress = "
<< 100*(1.0 - b)().weightedAverage(mesh.V()*ft).value() << "%"
<< endl;
}
else
{
Info<< "Combustion progress = "
<< 100*(1.0 - b)().weightedAverage(mesh.V()).value() << "%"
<< endl;
}
// Correct the flame-wrinkling
flameWrinkling->correct(mvConvection);
St = Xi*Su;
}