diff --git a/applications/solvers/combustion/dieselEngineFoam/Make/options b/applications/solvers/combustion/dieselEngineFoam/Make/options index c4d65fa137e5afa137669220ffae425c4d126430..8fdb0c5c33d6d9af10af064876dbea071641d0c9 100644 --- a/applications/solvers/combustion/dieselEngineFoam/Make/options +++ b/applications/solvers/combustion/dieselEngineFoam/Make/options @@ -16,6 +16,7 @@ EXE_INC = \ -I$(LIB_SRC)/ODE/lnInclude \ -I$(LIB_SRC)/engine/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude EXE_LIBS = \ -lengine \ @@ -35,4 +36,5 @@ EXE_LIBS = \ -llaminarFlameSpeedModels \ -lchemistryModel \ -lODE \ - -ldistributionModels + -ldistributionModels \ + -lcombustionModels diff --git a/applications/solvers/combustion/dieselEngineFoam/YEqn.H b/applications/solvers/combustion/dieselEngineFoam/YEqn.H index b8d39b4f46f329babb405d32cf0ae14c17c8079c..46d0f364e69f5689c9cc45301696d02ac19a6df1 100644 --- a/applications/solvers/combustion/dieselEngineFoam/YEqn.H +++ b/applications/solvers/combustion/dieselEngineFoam/YEqn.H @@ -10,7 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection ); { - + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -20,17 +21,19 @@ tmp<fv::convectionScheme<scalar> > mvConvection { volScalarField& Yi = Y[i]; - solve + fvScalarMatrix YiEqn ( fvm::ddt(rho, Yi) + mvConvection->fvmDiv(phi, Yi) - fvm::laplacian(turbulence->muEff(), Yi) == dieselSpray.evaporationSource(i) - + kappa*chemistry.RR(i), - mesh.solver("Yi") + + combustion->R(Yi) ); + YiEqn.relax(); + YiEqn.solve(mesh.solver("Yi")); + Yi.max(0.0); Yt += Yi; } diff --git a/applications/solvers/combustion/dieselEngineFoam/createFields.H b/applications/solvers/combustion/dieselEngineFoam/createFields.H index 4bd9f1a9160ed8509f062834bf7c72adea75f84c..bbb9000943dd0aef392551be5b1fe2a60156b2fb 100644 --- a/applications/solvers/combustion/dieselEngineFoam/createFields.H +++ b/applications/solvers/combustion/dieselEngineFoam/createFields.H @@ -1,10 +1,14 @@ -Info<< nl << "Reading thermophysicalProperties" << endl; +Info<< "Creating combustion model\n" << endl; -autoPtr<psiChemistryModel> pChemistry +autoPtr<combustionModels::psiChemistryCombustionModel> combustion ( - psiChemistryModel::New(mesh) + combustionModels::psiChemistryCombustionModel::New + ( + mesh + ) ); -psiChemistryModel& chemistry = pChemistry(); + +psiChemistryModel& chemistry = combustion->pChemistry(); hsCombustionThermo& thermo = chemistry.thermo(); @@ -55,20 +59,6 @@ volScalarField& hs = thermo.hs(); #include "compressibleCreatePhi.H" -volScalarField kappa -( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) -); - Info << "Creating turbulence model.\n" << nl; autoPtr<compressible::turbulenceModel> turbulence ( @@ -81,6 +71,9 @@ autoPtr<compressible::turbulenceModel> turbulence ) ); +// Set the turbulence into the combustion model +combustion->setTurbulence(turbulence()); + Info<< "Creating field DpDt\n" << endl; volScalarField DpDt ( @@ -96,16 +89,16 @@ forAll(Y, i) } fields.add(hs); -DimensionedField<scalar, volMesh> chemistrySh +volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); diff --git a/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C b/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C index 94ab9289994012cf5e2a769e94826aecaf59c5b7..807051318fe37329137828e7c5e906f62c2af1dd 100644 --- a/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C +++ b/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C @@ -32,8 +32,8 @@ Description #include "fvCFD.H" #include "engineTime.H" #include "engineMesh.H" -#include "hCombustionThermo.H" #include "turbulenceModel.H" +#include "psiChemistryCombustionModel.H" #include "spray.H" #include "psiChemistryModel.H" #include "chemistrySolver.H" @@ -54,7 +54,6 @@ int main(int argc, char *argv[]) #include "createEngineMesh.H" #include "createFields.H" #include "readGravitationalAcceleration.H" - #include "readCombustionProperties.H" #include "createSpray.H" #include "initContinuityErrs.H" #include "readEngineTimeControls.H" @@ -82,29 +81,6 @@ int main(int argc, char *argv[]) dieselSpray.evolve(); - Info<< "Solving chemistry" << endl; - - chemistry.solve - ( - runTime.value() - runTime.deltaTValue(), - runTime.deltaTValue() - ); - - // turbulent time scale - { - volScalarField tk - ( - Cmix*sqrt(turbulence->muEff()/rho/turbulence->epsilon()) - ); - volScalarField tc(chemistry.tc()); - - // Chalmers PaSR model - kappa = (runTime.deltaT() + tc)/(runTime.deltaT() + tc + tk); - } - - chemistrySh = kappa*chemistry.Sh()(); - - #include "rhoEqn.H" for (pimple.start(); pimple.loop(); pimple++) @@ -130,10 +106,7 @@ int main(int argc, char *argv[]) rho = thermo.rho(); - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" diff --git a/applications/solvers/combustion/dieselEngineFoam/hsEqn.H b/applications/solvers/combustion/dieselEngineFoam/hsEqn.H index 7ae59feb8199fc909983ed77cdba242f4d443b6c..7c0b7f9dc3327b65fa9a1a49b8e7e33e2e0a92e3 100644 --- a/applications/solvers/combustion/dieselEngineFoam/hsEqn.H +++ b/applications/solvers/combustion/dieselEngineFoam/hsEqn.H @@ -1,14 +1,21 @@ { - solve + fvScalarMatrix hsEqn ( fvm::ddt(rho, hs) + mvConvection->fvmDiv(phi, hs) - fvm::laplacian(turbulence->alphaEff(), hs) == - DpDt - + dieselSpray.heatTransferSource()().dimensionedInternalField() - + chemistrySh + DpDt + + combustion->Sh() + + dieselSpray.heatTransferSource()() + ); + hsEqn.relax(); + hsEqn.solve(); + thermo.correct(); + + Info<< "min/max(T) = " + << min(T).value() << ", " << max(T).value() << endl; } diff --git a/applications/solvers/combustion/dieselEngineFoam/readCombustionProperties.H b/applications/solvers/combustion/dieselEngineFoam/readCombustionProperties.H deleted file mode 100644 index 84cf9b9756a8ca420c58fdfeb5f64b3fcf6f0843..0000000000000000000000000000000000000000 --- a/applications/solvers/combustion/dieselEngineFoam/readCombustionProperties.H +++ /dev/null @@ -1,18 +0,0 @@ -Info<< "Reading combustion properties\n" << endl; - -IOdictionary combustionProperties -( - IOobject - ( - "combustionProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE - ) -); - -dimensionedScalar Cmix -( - combustionProperties.lookup("Cmix") -); diff --git a/applications/solvers/combustion/dieselFoam/Make/options b/applications/solvers/combustion/dieselFoam/Make/options index 124371575d752b3051af50923a0bde4f20fc3609..4083a59e9f6d148b4b2206fd2053b78c874e7383 100644 --- a/applications/solvers/combustion/dieselFoam/Make/options +++ b/applications/solvers/combustion/dieselFoam/Make/options @@ -14,7 +14,8 @@ EXE_INC = \ -I$(LIB_SRC)/thermophysicalModels/laminarFlameSpeed/lnInclude \ -I$(LIB_SRC)/../applications/solvers/reactionThermo/XiFoam \ -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \ - -I$(LIB_SRC)/ODE/lnInclude + -I$(LIB_SRC)/ODE/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude EXE_LIBS = \ -lcompressibleTurbulenceModel \ @@ -33,4 +34,5 @@ EXE_LIBS = \ -lchemistryModel \ -lODE \ -ldistributionModels \ - -lfiniteVolume + -lfiniteVolume \ + -lcombustionModels diff --git a/applications/solvers/combustion/dieselFoam/dieselFoam.C b/applications/solvers/combustion/dieselFoam/dieselFoam.C index 7fd74102476c6aab20528e167dfc4ec0b152d2db..45ee55195cd9d5cfa26a3a21ef15e7a6439d532d 100644 --- a/applications/solvers/combustion/dieselFoam/dieselFoam.C +++ b/applications/solvers/combustion/dieselFoam/dieselFoam.C @@ -30,12 +30,11 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hCombustionThermo.H" +#include "psiChemistryCombustionModel.H" #include "turbulenceModel.H" -#include "spray.H" #include "psiChemistryModel.H" #include "chemistrySolver.H" - +#include "spray.H" #include "multivariateScheme.H" #include "IFstream.H" #include "OFstream.H" @@ -52,7 +51,6 @@ int main(int argc, char *argv[]) #include "createMesh.H" #include "createFields.H" #include "readGravitationalAcceleration.H" - #include "readCombustionProperties.H" #include "createSpray.H" #include "initContinuityErrs.H" #include "readTimeControls.H" @@ -79,26 +77,6 @@ int main(int argc, char *argv[]) Info<< "Solving chemistry" << endl; - chemistry.solve - ( - runTime.value() - runTime.deltaTValue(), - runTime.deltaTValue() - ); - - // turbulent time scale - { - volScalarField tk - ( - Cmix*sqrt(turbulence->muEff()/rho/turbulence->epsilon()) - ); - volScalarField tc(chemistry.tc()); - - // Chalmers PaSR model - kappa = (runTime.deltaT() + tc)/(runTime.deltaT()+tc+tk); - } - - chemistrySh = kappa*chemistry.Sh()(); - #include "rhoEqn.H" // --- Pressure-velocity PIMPLE corrector loop @@ -124,10 +102,7 @@ int main(int argc, char *argv[]) rho = thermo.rho(); - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" diff --git a/applications/solvers/combustion/fireFoam/YhsEqn.H b/applications/solvers/combustion/fireFoam/YhsEqn.H index aed41a4431359997c531556cab966fd23d2c514e..299eb64ab7669e20893c3aa614d34e7a66af2653 100644 --- a/applications/solvers/combustion/fireFoam/YhsEqn.H +++ b/applications/solvers/combustion/fireFoam/YhsEqn.H @@ -20,7 +20,6 @@ tmp<fv::convectionScheme<scalar> > mvConvection if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; - fvScalarMatrix R(combustion->R(Yi)); fvScalarMatrix YiEqn ( @@ -30,7 +29,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection == parcels.SYi(i, Yi) + surfaceFilm.Srho(i) - + R + + combustion->R(Yi) ); YiEqn.relax(); @@ -55,7 +54,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection - fvm::laplacian(turbulence->alphaEff(), hs) == DpDt - + dQ + + combustion->Sh() + radiation->Shs(thermo) + parcels.Sh(hs) + surfaceFilm.Sh() @@ -66,5 +65,6 @@ tmp<fv::convectionScheme<scalar> > mvConvection thermo.correct(); - Info<< "min/max(T) = " << min(T).value() << ", " << max(T).value() << endl; + Info<< "min/max(T) = " + << min(T).value() << ", " << max(T).value() << endl; } diff --git a/applications/solvers/combustion/fireFoam/createFields.H b/applications/solvers/combustion/fireFoam/createFields.H index f1e152dc320b47f428e326350f66aae48c947338..afabd393c74464a69451c860f700aeef2222e759 100644 --- a/applications/solvers/combustion/fireFoam/createFields.H +++ b/applications/solvers/combustion/fireFoam/createFields.H @@ -1,10 +1,16 @@ - Info<< "Reading thermophysical properties\n" << endl; + Info<< "Creating combustion model\n" << endl; - autoPtr<hsCombustionThermo> pThermo + autoPtr<combustionModels::psiCombustionModel> combustion ( - hsCombustionThermo::New(mesh) + combustionModels::psiCombustionModel::New + ( + mesh + ) ); - hsCombustionThermo& thermo = pThermo(); + + Info<< "Reading thermophysical properties\n" << endl; + + hsCombustionThermo& thermo = combustion->thermo(); SLGThermo slgThermo(mesh, thermo); @@ -60,30 +66,8 @@ ) ); - IOdictionary combustionProperties - ( - IOobject - ( - "combustionProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE - ) - ); - - Info<< "Creating combustion model\n" << endl; - autoPtr<combustionModel> combustion - ( - combustionModel::combustionModel::New - ( - combustionProperties, - thermo, - turbulence(), - phi, - rho - ) - ); + // Set the turbulence into the combustion model + combustion->setTurbulence(turbulence()); volScalarField dQ ( @@ -96,7 +80,7 @@ IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("dQ", dimMass/pow3(dimTime)/dimLength, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); Info<< "Creating field DpDt\n" << endl; diff --git a/applications/solvers/combustion/fireFoam/fireFoam.C b/applications/solvers/combustion/fireFoam/fireFoam.C index 7c58a722d1676bfa6a6845e754df62344e9c386a..89968c6e5878160c3b7e32ce45170f2d448f88b4 100644 --- a/applications/solvers/combustion/fireFoam/fireFoam.C +++ b/applications/solvers/combustion/fireFoam/fireFoam.C @@ -38,9 +38,8 @@ Description #include "pyrolysisModel.H" #include "radiationModel.H" #include "SLGThermo.H" -#include "hsCombustionThermo.H" #include "solidChemistryModel.H" -#include "combustionModel.H" +#include "psiCombustionModel.H" #include "pimpleControl.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -51,7 +50,6 @@ int main(int argc, char *argv[]) #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "createClouds.H" diff --git a/applications/solvers/combustion/fireFoam/readChemistryProperties.H b/applications/solvers/combustion/fireFoam/readChemistryProperties.H deleted file mode 100644 index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000 --- a/applications/solvers/combustion/fireFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/combustion/reactingFoam/Make/options b/applications/solvers/combustion/reactingFoam/Make/options index 6386af8c557fcea5ace76bfe7c203c36ab85cd6e..8eb6d4cabdac7d75a037f5f639685739bdb30b45 100644 --- a/applications/solvers/combustion/reactingFoam/Make/options +++ b/applications/solvers/combustion/reactingFoam/Make/options @@ -5,7 +5,8 @@ EXE_INC = \ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \ -I$(LIB_SRC)/ODE/lnInclude \ - -I$(LIB_SRC)/finiteVolume/lnInclude + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude EXE_LIBS = \ -lcompressibleTurbulenceModel \ @@ -16,4 +17,5 @@ EXE_LIBS = \ -lbasicThermophysicalModels \ -lchemistryModel \ -lODE \ - -lfiniteVolume + -lfiniteVolume \ + -lcombustionModels diff --git a/applications/solvers/combustion/reactingFoam/YEqn.H b/applications/solvers/combustion/reactingFoam/YEqn.H index 8d63a12868554b2d7c785d97549537c736ac8fa9..87b25079ff6dc5b31f09a60fbab9345d56aa2bc5 100644 --- a/applications/solvers/combustion/reactingFoam/YEqn.H +++ b/applications/solvers/combustion/reactingFoam/YEqn.H @@ -10,6 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection ); { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,16 +21,18 @@ tmp<fv::convectionScheme<scalar> > mvConvection { volScalarField& Yi = Y[i]; - solve + fvScalarMatrix YiEqn ( fvm::ddt(rho, Yi) + mvConvection->fvmDiv(phi, Yi) - fvm::laplacian(turbulence->muEff(), Yi) == - kappa*chemistry.RR(i), - mesh.solver("Yi") + combustion->R(Yi) ); + YiEqn.relax(); + YiEqn.solve(mesh.solver("Yi")); + Yi.max(0.0); Yt += Yi; } diff --git a/applications/solvers/combustion/reactingFoam/chemistry.H b/applications/solvers/combustion/reactingFoam/chemistry.H deleted file mode 100644 index 99f418af6f10ac69b44d08fc2271e2dd79c73fc4..0000000000000000000000000000000000000000 --- a/applications/solvers/combustion/reactingFoam/chemistry.H +++ /dev/null @@ -1,44 +0,0 @@ -if (chemistry.chemistry()) -{ - Info<< "Solving chemistry" << endl; - - chemistry.solve - ( - runTime.value() - runTime.deltaTValue(), - runTime.deltaTValue() - ); - - // turbulent time scale - if (turbulentReaction) - { - tmp<volScalarField> tepsilon(turbulence->epsilon()); - const volScalarField& epsilon = tepsilon(); - tmp<volScalarField> tmuEff(turbulence->muEff()); - const volScalarField& muEff = tmuEff(); - tmp<volScalarField> ttc(chemistry.tc()); - const volScalarField& tc = ttc(); - - forAll(epsilon, i) - { - if (epsilon[i] > 0) - { - // Chalmers PaSR model - scalar tk = Cmix.value()*Foam::sqrt(muEff[i]/rho[i]/epsilon[i]); - kappa[i] = - (runTime.deltaTValue() + tc[i]) - /(runTime.deltaTValue() + tc[i] + tk); - } - else - { - // Return to laminar combustion - kappa[i] = 1.0; - } - } - } - else - { - kappa = 1.0; - } - - chemistrySh = kappa*chemistry.Sh()(); -} diff --git a/applications/solvers/combustion/reactingFoam/createFields.H b/applications/solvers/combustion/reactingFoam/createFields.H index a2f016e04622295e17aa3c5a67915e5f3feae69c..7cf94f754d9a205246efd838f58564f236aa5c0f 100644 --- a/applications/solvers/combustion/reactingFoam/createFields.H +++ b/applications/solvers/combustion/reactingFoam/createFields.H @@ -1,9 +1,14 @@ -Info<< nl << "Reading thermophysicalProperties" << endl; -autoPtr<psiChemistryModel> pChemistry +Info<< "Creating combustion model\n" << endl; + +autoPtr<combustionModels::psiChemistryCombustionModel> combustion ( - psiChemistryModel::New(mesh) + combustionModels::psiChemistryCombustionModel::New + ( + mesh + ) ); -psiChemistryModel& chemistry = pChemistry(); + +psiChemistryModel& chemistry = combustion->pChemistry(); hsCombustionThermo& thermo = chemistry.thermo(); @@ -45,20 +50,6 @@ const volScalarField& T = thermo.T(); #include "compressibleCreatePhi.H" -volScalarField kappa -( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) -); - Info << "Creating turbulence model.\n" << nl; autoPtr<compressible::turbulenceModel> turbulence ( @@ -71,6 +62,9 @@ autoPtr<compressible::turbulenceModel> turbulence ) ); +// Set the turbulence into the combustion model +combustion->setTurbulence(turbulence()); + Info<< "Creating field DpDt\n" << endl; volScalarField DpDt ( @@ -85,16 +79,16 @@ forAll(Y, i) } fields.add(hs); -DimensionedField<scalar, volMesh> chemistrySh +volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); diff --git a/applications/solvers/combustion/reactingFoam/hsEqn.H b/applications/solvers/combustion/reactingFoam/hsEqn.H index e3fa4e7a135adb1539de8d1e548329a8f97c7a06..de1a85fddf5365c2be897aaeff7ffa8a42cd35cc 100644 --- a/applications/solvers/combustion/reactingFoam/hsEqn.H +++ b/applications/solvers/combustion/reactingFoam/hsEqn.H @@ -7,7 +7,7 @@ // - fvm::laplacian(turbulence->muEff(), hs) // unit lewis no. == DpDt - + chemistrySh + + combustion->Sh() ); hsEqn.relax(); diff --git a/applications/solvers/combustion/reactingFoam/reactingFoam.C b/applications/solvers/combustion/reactingFoam/reactingFoam.C index ca156c3f7f305814548a1cfe97c372f9a3b0da92..75fb9ad71d59f5b7cdbf22dc2c88a00c0a728ee0 100644 --- a/applications/solvers/combustion/reactingFoam/reactingFoam.C +++ b/applications/solvers/combustion/reactingFoam/reactingFoam.C @@ -30,10 +30,8 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hCombustionThermo.H" #include "turbulenceModel.H" -#include "psiChemistryModel.H" -#include "chemistrySolver.H" +#include "psiChemistryCombustionModel.H" #include "multivariateScheme.H" #include "pimpleControl.H" @@ -44,7 +42,6 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "initContinuityErrs.H" @@ -67,7 +64,6 @@ int main(int argc, char *argv[]) runTime++; Info<< "Time = " << runTime.timeName() << nl << endl; - #include "chemistry.H" #include "rhoEqn.H" for (pimple.start(); pimple.loop(); pimple++) @@ -88,11 +84,6 @@ int main(int argc, char *argv[]) } } - if (runTime.write()) - { - chemistry.dQ()().write(); - } - runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" diff --git a/applications/solvers/combustion/reactingFoam/readChemistryProperties.H b/applications/solvers/combustion/reactingFoam/readChemistryProperties.H deleted file mode 100644 index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000 --- a/applications/solvers/combustion/reactingFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/combustion/rhoReactingFoam/Make/options b/applications/solvers/combustion/rhoReactingFoam/Make/options index d6306816fd8174d34268711983ddb53cdb4eb040..5a5df2ed7b6f552e4d6a281f8b0de7cff35470fc 100644 --- a/applications/solvers/combustion/rhoReactingFoam/Make/options +++ b/applications/solvers/combustion/rhoReactingFoam/Make/options @@ -6,7 +6,8 @@ EXE_INC = \ -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \ -I$(LIB_SRC)/ODE/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \ - -I$(FOAM_SOLVERS)/combustion/reactingFoam + -I$(FOAM_SOLVERS)/combustion/reactingFoam \ + -I$(LIB_SRC)/combustionModels/lnInclude EXE_LIBS = \ @@ -18,4 +19,5 @@ EXE_LIBS = \ -lbasicThermophysicalModels \ -lchemistryModel \ -lODE \ - -lfiniteVolume + -lfiniteVolume \ + -lcombustionModels diff --git a/applications/solvers/combustion/rhoReactingFoam/YEqn.H b/applications/solvers/combustion/rhoReactingFoam/YEqn.H index 8d63a12868554b2d7c785d97549537c736ac8fa9..3a371f035c6ad2c6c64e6f09cf99b0d633eb9734 100644 --- a/applications/solvers/combustion/rhoReactingFoam/YEqn.H +++ b/applications/solvers/combustion/rhoReactingFoam/YEqn.H @@ -10,6 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection ); { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,14 +21,13 @@ tmp<fv::convectionScheme<scalar> > mvConvection { volScalarField& Yi = Y[i]; - solve + fvScalarMatrix YiEqn ( fvm::ddt(rho, Yi) + mvConvection->fvmDiv(phi, Yi) - fvm::laplacian(turbulence->muEff(), Yi) == - kappa*chemistry.RR(i), - mesh.solver("Yi") + combustion->R(Yi) ); Yi.max(0.0); diff --git a/applications/solvers/combustion/rhoReactingFoam/createFields.H b/applications/solvers/combustion/rhoReactingFoam/createFields.H index d58e082f5ba433ad1cc0925ebb5c69c114b9fe9b..65860a67eb26605f0501062cdbfbebf9da5949f8 100644 --- a/applications/solvers/combustion/rhoReactingFoam/createFields.H +++ b/applications/solvers/combustion/rhoReactingFoam/createFields.H @@ -1,9 +1,14 @@ -Info<< nl << "Reading thermophysicalProperties" << endl; -autoPtr<rhoChemistryModel> pChemistry +Info<< "Creating combustion model\n" << endl; + +autoPtr<combustionModels::rhoChemistryCombustionModel> combustion ( - rhoChemistryModel::New(mesh) + combustionModels::rhoChemistryCombustionModel::New + ( + mesh + ) ); -rhoChemistryModel& chemistry = pChemistry(); + +rhoChemistryModel& chemistry = combustion->pChemistry(); hsReactionThermo& thermo = chemistry.thermo(); @@ -46,19 +51,6 @@ const volScalarField& T = thermo.T(); #include "compressibleCreatePhi.H" -volScalarField kappa -( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) -); Info << "Creating turbulence model.\n" << nl; autoPtr<compressible::turbulenceModel> turbulence @@ -72,6 +64,9 @@ autoPtr<compressible::turbulenceModel> turbulence ) ); +// Set the turbulence into the combustion model +combustion->setTurbulence(turbulence()); + Info<< "Creating field DpDt\n" << endl; volScalarField DpDt ( @@ -86,16 +81,16 @@ forAll(Y, i) } fields.add(hs); -DimensionedField<scalar, volMesh> chemistrySh +volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); diff --git a/applications/solvers/combustion/rhoReactingFoam/hsEqn.H b/applications/solvers/combustion/rhoReactingFoam/hsEqn.H index 81bd6ea9d7bb4a03834d5db86deb7d728eb3d9db..01f85ac1da7432acf7a54a555dc8283af58979d3 100644 --- a/applications/solvers/combustion/rhoReactingFoam/hsEqn.H +++ b/applications/solvers/combustion/rhoReactingFoam/hsEqn.H @@ -4,9 +4,10 @@ fvm::ddt(rho, hs) + mvConvection->fvmDiv(phi, hs) - fvm::laplacian(turbulence->alphaEff(), hs) +// - fvm::laplacian(turbulence->muEff(), hs) // unit lewis no. == DpDt - + chemistrySh + + combustion->Sh() ); hsEqn.relax(); @@ -14,6 +15,6 @@ thermo.correct(); - Info<< "T gas min/max = " << min(T).value() << ", " - << max(T).value() << endl; + Info<< "min/max(T) = " + << min(T).value() << ", " << max(T).value() << endl; } diff --git a/applications/solvers/combustion/rhoReactingFoam/readChemistryProperties.H b/applications/solvers/combustion/rhoReactingFoam/readChemistryProperties.H deleted file mode 100644 index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000 --- a/applications/solvers/combustion/rhoReactingFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C b/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C index 9c22e63c51188674a5ea8d4ccb608b38e712ec93..afa7d9771da6b6ce722385bbd30abb6df5b86ec7 100644 --- a/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C +++ b/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C @@ -31,10 +31,8 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hReactionThermo.H" +#include "rhoChemistryCombustionModel.H" #include "turbulenceModel.H" -#include "rhoChemistryModel.H" -#include "chemistrySolver.H" #include "multivariateScheme.H" #include "pimpleControl.H" @@ -45,7 +43,6 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "initContinuityErrs.H" @@ -68,7 +65,6 @@ int main(int argc, char *argv[]) runTime++; Info<< "Time = " << runTime.timeName() << nl << endl; - #include "chemistry.H" #include "rhoEqn.H" // --- Pressure-velocity PIMPLE corrector loop @@ -92,10 +88,7 @@ int main(int argc, char *argv[]) rho = thermo.rho(); - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C b/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C index a9da394140e253851b1e7d85221100d6467fb9fd..9f2955bc2f8773489e8297ec900c7964e2874b22 100644 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C +++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C @@ -36,11 +36,9 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hReactionThermo.H" #include "turbulenceModel.H" #include "basicReactingMultiphaseCloud.H" -#include "rhoChemistryModel.H" -#include "chemistrySolver.H" +#include "rhoChemistryCombustionModel.H" #include "radiationModel.H" #include "porousZones.H" #include "timeActivatedExplicitSource.H" @@ -75,7 +73,6 @@ int main(int argc, char *argv[]) while (runTime.run()) { - #include "readChemistryProperties.H" #include "readAdditionalSolutionControls.H" #include "readTimeControls.H" @@ -85,7 +82,6 @@ int main(int argc, char *argv[]) parcels.evolve(); - #include "chemistry.H" #include "timeScales.H" #include "rhoEqn.H" @@ -111,10 +107,7 @@ int main(int argc, char *argv[]) } } - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options b/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options index 91ee4a594d0a3ff79918481ebcc7764fe2823dee..36e9c44270ad2859e3d4a7ac6ecfe803157c08b0 100644 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options +++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options @@ -20,7 +20,8 @@ EXE_INC = \ -I$(LIB_SRC)/ODE/lnInclude \ -I$(LIB_SRC)/regionModels/regionModel/lnInclude \ -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \ - -I$(LIB_SRC)/sampling/lnInclude + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude EXE_LIBS = \ -lfiniteVolume \ @@ -44,4 +45,5 @@ EXE_LIBS = \ -lODE \ -lregionModels \ -lsurfaceFilmModels \ - -lsampling + -lsampling \ + -lcombustionModels diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H index c941691d66ccff733405ec92982e848bb15b0d53..625c940a663b63f83858861cf894e49bb04d0875 100644 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H +++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H @@ -9,6 +9,9 @@ tmp<fv::convectionScheme<scalar> > mvConvection ) ); +combustion->correct(); +dQ = combustion->dQ(); + if (solveSpecies) { label inertIndex = -1; @@ -19,14 +22,15 @@ if (solveSpecies) if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; + solve ( fvm::ddt(rho, Yi) + mvConvection->fvmDiv(phi, Yi) - fvm::laplacian(turbulence->muEff(), Yi) - == + == parcels.SYi(i, Yi) - + kappa*chemistry.RR(i)().dimensionedInternalField() + + combustion->R(Yi) + massSource.Su(i), mesh.solver("Yi") ); diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H index 103ead9d78f33787d964777673c78d08e943371c..f1f6173cd611633a7d7115f4f476f1dba583c2e1 100644 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H +++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H @@ -1,10 +1,14 @@ - Info<< "Reading thermophysical properties\n" << endl; + Info<< "Creating combustion model\n" << endl; - autoPtr<rhoChemistryModel> pChemistry + autoPtr<combustionModels::rhoChemistryCombustionModel> combustion ( - rhoChemistryModel::New(mesh) + combustionModels::rhoChemistryCombustionModel::New + ( + mesh + ) ); - rhoChemistryModel& chemistry = pChemistry(); + + rhoChemistryModel& chemistry = combustion->pChemistry(); hsReactionThermo& thermo = chemistry.thermo(); @@ -57,20 +61,6 @@ #include "compressibleCreatePhi.H" - DimensionedField<scalar, volMesh> kappa - ( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) - ); - dimensionedScalar rhoMax ( mesh.solutionDict().subDict("PIMPLE").lookup("rhoMax") @@ -93,6 +83,9 @@ ) ); + // Set the turbulence into the combustion model + combustion->setTurbulence(turbulence()); + Info<< "Creating multi-variate interpolation scheme\n" << endl; multivariateSurfaceInterpolationScheme<scalar>::fieldTable fields; @@ -102,20 +95,21 @@ } fields.add(hs); - DimensionedField<scalar, volMesh> chemistrySh + volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); + volScalarField rDeltaT ( IOobject diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H index 5954b1217e6cbce2f227c60b9dfa158f7ca54343..55bf1d6dd0cdc850c8bd6b3364d51631f0c1106e 100644 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H +++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H @@ -9,7 +9,7 @@ + parcels.Sh(hs) + radiation->Shs(thermo) + energySource.Su() - + chemistrySh + + combustion->Sh() ); hsEqn.solve(); diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/readChemistryProperties.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/readChemistryProperties.H deleted file mode 100644 index e742e9fea78c2d196b07e96196b20ea8a2cf53f1..0000000000000000000000000000000000000000 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -// Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H index e6d0fa85c4919cb322b30620c2850d408fb0fb8f..05fe8a1c7713453e650d8e0416b2963fe5f5b8ef 100644 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H +++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H @@ -77,7 +77,7 @@ Info<< "Time scales min/max:" << endl; DpDt + parcels.hsTrans()/(mesh.V()*runTime.deltaT()) + energySource.Su() - + chemistrySh + + combustion->Sh()() ) /rho ); diff --git a/applications/solvers/lagrangian/coalChemistryFoam/Make/options b/applications/solvers/lagrangian/coalChemistryFoam/Make/options index f2f8d1e75874dd9361753b992bad7d1847ff0dc1..e8a871837378ef43f984a402c41889bca9f64204 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/Make/options +++ b/applications/solvers/lagrangian/coalChemistryFoam/Make/options @@ -21,6 +21,7 @@ EXE_INC = \ -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \ -I$(LIB_SRC)/ODE/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude \ -I$(FOAM_SOLVERS)/combustion/reactingFoam @@ -47,4 +48,5 @@ EXE_LIBS = \ -lregionModels \ -lsurfaceFilmModels \ -lODE \ - -lsampling + -lsampling \ + -lcombustionModels diff --git a/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H b/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H index be82d6e2b6019af547a5fe2f023be66da02483a7..e9bd1c6581b842fb1ccc9739d4c8370546d8fdc8 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H +++ b/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H @@ -11,6 +11,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,16 +21,20 @@ tmp<fv::convectionScheme<scalar> > mvConvection if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; - solve + + fvScalarMatrix YiEqn ( fvm::ddt(rho, Yi) + mvConvection->fvmDiv(phi, Yi) - fvm::laplacian(turbulence->muEff(), Yi) == coalParcels.SYi(i, Yi) - + kappa*chemistry.RR(i)().dimensionedInternalField() + + combustion->R(Yi) ); + YiEqn.relax(); + YiEqn.solve(mesh.solver("Yi")); + Yi.max(0.0); Yt += Yi; } diff --git a/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C b/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C index 3d0eabcef8e21afc2ede2401710d3b26a3531ee4..1e6daed0fde4e02f5c160b4716a9d02ff73cea3c 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C +++ b/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C @@ -36,12 +36,10 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hCombustionThermo.H" #include "turbulenceModel.H" #include "basicThermoCloud.H" #include "coalCloud.H" -#include "psiChemistryModel.H" -#include "chemistrySolver.H" +#include "psiChemistryCombustionModel.H" #include "timeActivatedExplicitSource.H" #include "radiationModel.H" #include "SLGThermo.H" @@ -55,7 +53,6 @@ int main(int argc, char *argv[]) #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "createClouds.H" @@ -88,7 +85,6 @@ int main(int argc, char *argv[]) limestoneParcels.evolve(); - #include "chemistry.H" #include "rhoEqn.H" // --- Pressure-velocity PIMPLE corrector loop @@ -112,10 +108,7 @@ int main(int argc, char *argv[]) rho = thermo.rho(); - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" diff --git a/applications/solvers/lagrangian/coalChemistryFoam/createFields.H b/applications/solvers/lagrangian/coalChemistryFoam/createFields.H index 97e409215c08153dca0a360bdc027fffb6581172..4d0a2b7408dc36caa486c9369b8ce7e6f31d582d 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/createFields.H +++ b/applications/solvers/lagrangian/coalChemistryFoam/createFields.H @@ -1,10 +1,14 @@ - Info<< "Reading thermophysical properties\n" << endl; + Info<< "Creating combustion model\n" << endl; - autoPtr<psiChemistryModel> pChemistry + autoPtr<combustionModels::psiChemistryCombustionModel> combustion ( - psiChemistryModel::New(mesh) + combustionModels::psiChemistryCombustionModel::New + ( + mesh + ) ); - psiChemistryModel& chemistry = pChemistry(); + + psiChemistryModel& chemistry = combustion->pChemistry(); hsCombustionThermo& thermo = chemistry.thermo(); @@ -96,20 +100,6 @@ #include "compressibleCreatePhi.H" - DimensionedField<scalar, volMesh> kappa - ( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) - ); - Info<< "Creating turbulence model\n" << endl; autoPtr<compressible::turbulenceModel> turbulence ( @@ -122,6 +112,9 @@ ) ); + // Set the turbulence into the combustion model + combustion->setTurbulence(turbulence()); + Info<< "Creating field DpDt\n" << endl; volScalarField DpDt ( @@ -138,16 +131,16 @@ "hs" ); - DimensionedField<scalar, volMesh> chemistrySh + volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); diff --git a/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H b/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H index e6901a9c6f255dcf4328c60fa986c45a353deee0..9a4665accdbb10927c30b4d88f230dfb0af7adad 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H +++ b/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H @@ -6,15 +6,14 @@ - fvm::laplacian(turbulence->alphaEff(), hs) == DpDt + + combustion->Sh() + coalParcels.Sh(hs) + limestoneParcels.Sh(hs) + enthalpySource.Su() + radiation->Shs(thermo) - + chemistrySh ); hsEqn.relax(); - hsEqn.solve(); thermo.correct(); diff --git a/applications/solvers/lagrangian/coalChemistryFoam/readChemistryProperties.H b/applications/solvers/lagrangian/coalChemistryFoam/readChemistryProperties.H deleted file mode 100644 index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000 --- a/applications/solvers/lagrangian/coalChemistryFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options index f2dffe2998bacfbb04d2fd06d7f8f9de0f802905..1abdd721788ff53a8e102167b6e886c7e26e15bb 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options @@ -21,6 +21,7 @@ EXE_INC = \ -I$(LIB_SRC)/regionModels/regionModel/lnInclude \ -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude \ -I$(FOAM_SOLVERS)/combustion/reactingFoam @@ -46,4 +47,5 @@ EXE_LIBS = \ -lODE \ -lregionModels \ -lsurfaceFilmModels \ - -lsampling + -lsampling \ + -lcombustionModels diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H index 53c6b25d81c1e10fb8f3f0d377ca35d715bf4686..5ef4aaa3a351fa79fd3bfb24ac8144ca112c24c4 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H @@ -10,6 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection ) ); +combustion->correct(); +dQ = combustion->dQ(); if (solveSpecies) { @@ -21,6 +23,7 @@ if (solveSpecies) if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; + solve ( fvm::ddt(rho, Yi) @@ -28,7 +31,7 @@ if (solveSpecies) - fvm::laplacian(turbulence->muEff(), Yi) == parcels.SYi(i, Yi) - + kappa*chemistry.RR(i)().dimensionedInternalField() + + combustion->R(Yi) + massSource.Su(i), mesh.solver("Yi") ); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H index 22d7c1f219e49c8bde15b1fd01bf6e4a20895e4d..ab6b01f9cea220ce72b805249fae37dee8e68c03 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H @@ -1,10 +1,14 @@ - Info<< "Reading thermophysical properties\n" << endl; + Info<< "Creating combustion model\n" << endl; - autoPtr<rhoChemistryModel> pChemistry + autoPtr<combustionModels::rhoChemistryCombustionModel> combustion ( - rhoChemistryModel::New(mesh) + combustionModels::rhoChemistryCombustionModel::New + ( + mesh + ) ); - rhoChemistryModel& chemistry = pChemistry(); + + rhoChemistryModel& chemistry = combustion->pChemistry(); hsReactionThermo& thermo = chemistry.thermo(); @@ -57,20 +61,6 @@ #include "compressibleCreatePhi.H" - DimensionedField<scalar, volMesh> kappa - ( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) - ); - Info<< "Creating turbulence model\n" << endl; autoPtr<compressible::turbulenceModel> turbulence ( @@ -83,6 +73,9 @@ ) ); + // Set the turbulence into the combustion model + combustion->setTurbulence(turbulence()); + Info<< "Creating multi-variate interpolation scheme\n" << endl; multivariateSurfaceInterpolationScheme<scalar>::fieldTable fields; @@ -92,16 +85,16 @@ } fields.add(hs); - DimensionedField<scalar, volMesh> chemistrySh + volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H index 58e0b699433c0f9eb32b548dd512016a003027e6..0e2c61a9ff1b6e8682403b1d2281963f18506042 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H @@ -39,7 +39,7 @@ + parcels.Sh(hs) + radiation->Shs(thermo) + energySource.Su() - + chemistrySh + + combustion->Sh() ); thermo.correct(); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C index 638d83da0c7d8681f62e8727e21ba0b7fc750fe9..e077836709b583922c3ece1d7885c785b213359c 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C @@ -40,11 +40,9 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hReactionThermo.H" #include "turbulenceModel.H" #include "basicReactingMultiphaseCloud.H" -#include "rhoChemistryModel.H" -#include "chemistrySolver.H" +#include "rhoChemistryCombustionModel.H" #include "radiationModel.H" #include "porousZones.H" #include "timeActivatedExplicitSource.H" @@ -59,7 +57,6 @@ int main(int argc, char *argv[]) #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "createRadiationModel.H" @@ -90,7 +87,6 @@ int main(int argc, char *argv[]) parcels.evolve(); - #include "chemistry.H" #include "rhoEqn.H" // --- Pressure-velocity PIMPLE corrector loop @@ -114,10 +110,7 @@ int main(int argc, char *argv[]) rho = thermo.rho(); - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/readChemistryProperties.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/readChemistryProperties.H deleted file mode 100644 index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options b/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options index 6e225cc09231bc0c0d7cd2b39dafd6270885ebf6..3f762b6bd00784de202e89a568afc58bd3425e96 100644 --- a/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options +++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options @@ -20,6 +20,7 @@ EXE_INC = \ -I$(LIB_SRC)/lagrangian/intermediate/lnInclude \ -I$(LIB_SRC)/ODE/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude \ -I$(FOAM_SOLVERS)/combustion/reactingFoam @@ -41,4 +42,5 @@ EXE_LIBS = \ -lsurfaceFilmModels \ -llagrangianIntermediate \ -lODE \ - -lsampling + -lsampling \ + -lcombustionModels diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H index db79376614e29b4289c41f54e76c7bdf5c25e9b6..4fad16b57d7c16e55aff80e77583d71d72764eca 100644 --- a/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H +++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H @@ -11,6 +11,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,6 +21,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; + solve ( fvm::ddt(rho, Yi) @@ -27,7 +30,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection == parcels.SYi(i, Yi) + surfaceFilm.Srho(i) - + kappa*chemistry.RR(i)().dimensionedInternalField(), + + combustion->R(Yi), mesh.solver("Yi") ); diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H index e2db33f1f7f64960cd07f9898b039970a63c9b76..999515f4309aa2ca8526ee39a3daddaf8ed9d71b 100644 --- a/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H +++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H @@ -1,10 +1,14 @@ - Info<< "Reading thermophysical properties\n" << endl; + Info<< "Creating combustion model\n" << endl; - autoPtr<psiChemistryModel> pChemistry + autoPtr<combustionModels::psiChemistryCombustionModel> combustion ( - psiChemistryModel::New(mesh) + combustionModels::psiChemistryCombustionModel::New + ( + mesh + ) ); - psiChemistryModel& chemistry = pChemistry(); + + psiChemistryModel& chemistry = combustion->pChemistry(); hsCombustionThermo& thermo = chemistry.thermo(); @@ -50,21 +54,6 @@ #include "compressibleCreatePhi.H" - Info<< "Creating field kappa\n" << endl; - DimensionedField<scalar, volMesh> kappa - ( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) - ); - Info<< "Creating turbulence model\n" << endl; autoPtr<compressible::turbulenceModel> turbulence ( @@ -77,6 +66,9 @@ ) ); + // Set the turbulence into the combustion model + combustion->setTurbulence(turbulence()); + Info<< "Creating field DpDt\n" << endl; volScalarField DpDt ( @@ -131,16 +123,16 @@ additionalControlsDict.lookup("solvePrimaryRegion") ); - DimensionedField<scalar, volMesh> chemistrySh + volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0) + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) ); diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H index feb112f652a3f9478af26963b590aa65e2e47de4..79c5e1c5b3cc5a239437601f3bd8e3b57c6224e3 100644 --- a/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H +++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H @@ -9,7 +9,7 @@ + parcels.Sh(hs) + surfaceFilm.Sh() + radiation->Shs(thermo) - + chemistrySh + + combustion->Sh() ); hsEqn.relax(); diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C b/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C index 6ae930c7a72da80de68ec6cfd1aeb3ed5baefcf6..ea8e9e6e5b65aed30d23c2dd521f2f6ca48740c0 100644 --- a/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C +++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C @@ -31,12 +31,10 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hCombustionThermo.H" #include "turbulenceModel.H" #include "basicReactingCloud.H" #include "surfaceFilmModel.H" -#include "psiChemistryModel.H" -#include "chemistrySolver.H" +#include "psiChemistryCombustionModel.H" #include "radiationModel.H" #include "SLGThermo.H" #include "pimpleControl.H" @@ -49,7 +47,6 @@ int main(int argc, char *argv[]) #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "createClouds.H" @@ -83,7 +80,6 @@ int main(int argc, char *argv[]) if (solvePrimaryRegion) { - #include "chemistry.H" #include "rhoEqn.H" // --- PIMPLE loop @@ -107,10 +103,7 @@ int main(int argc, char *argv[]) rho = thermo.rho(); - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); } else { diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/readChemistryProperties.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/readChemistryProperties.H deleted file mode 100644 index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000 --- a/applications/solvers/lagrangian/reactingParcelFilmFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/lagrangian/reactingParcelFoam/Make/options b/applications/solvers/lagrangian/reactingParcelFoam/Make/options index fc312bb5fa8e3e8c7dc14254607ad907eb4d8c11..e406727104647bc53fd59ccbf6da44a9c5af2722 100644 --- a/applications/solvers/lagrangian/reactingParcelFoam/Make/options +++ b/applications/solvers/lagrangian/reactingParcelFoam/Make/options @@ -20,6 +20,7 @@ EXE_INC = \ -I$(LIB_SRC)/regionModels/regionModel/lnInclude \ -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude \ -I$(FOAM_SOLVERS)/combustion/reactingFoam @@ -45,4 +46,5 @@ EXE_LIBS = \ -lODE \ -lregionModels \ -lsurfaceFilmModels \ - -lsampling + -lsampling \ + -lcombustionModels diff --git a/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H b/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H index a18097332134baaa0b312ecaf281a81694ae73ac..78bbe14bbfe72df41f7c6d17bcf10e152e32e6c6 100644 --- a/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H +++ b/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H @@ -11,6 +11,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,17 +21,20 @@ tmp<fv::convectionScheme<scalar> > mvConvection if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; - solve + + fvScalarMatrix YiEqn ( fvm::ddt(rho, Yi) + mvConvection->fvmDiv(phi, Yi) - fvm::laplacian(turbulence->muEff(), Yi) == parcels.SYi(i, Yi) - + kappa*chemistry.RR(i)().dimensionedInternalField(), - mesh.solver("Yi") + + combustion->R(Yi) ); + YiEqn.relax(); + YiEqn.solve(mesh.solver("Yi")); + Yi.max(0.0); Yt += Yi; } diff --git a/applications/solvers/lagrangian/reactingParcelFoam/createFields.H b/applications/solvers/lagrangian/reactingParcelFoam/createFields.H index 089489a014adeaedf43888bf9761475685644044..c318498d94c3efcd27e0c257e306795081ce99fb 100644 --- a/applications/solvers/lagrangian/reactingParcelFoam/createFields.H +++ b/applications/solvers/lagrangian/reactingParcelFoam/createFields.H @@ -1,10 +1,14 @@ - Info<< "Reading thermophysical properties\n" << endl; + Info<< "Creating combustion model\n" << endl; - autoPtr<psiChemistryModel> pChemistry + autoPtr<combustionModels::psiChemistryCombustionModel> combustion ( - psiChemistryModel::New(mesh) + combustionModels::psiChemistryCombustionModel::New + ( + mesh + ) ); - psiChemistryModel& chemistry = pChemistry(); + + psiChemistryModel& chemistry = combustion->pChemistry(); hsCombustionThermo& thermo = chemistry.thermo(); @@ -57,20 +61,6 @@ #include "compressibleCreatePhi.H" - DimensionedField<scalar, volMesh> kappa - ( - IOobject - ( - "kappa", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("zero", dimless, 0.0) - ); - Info<< "Creating turbulence model\n" << endl; autoPtr<compressible::turbulenceModel> turbulence ( @@ -83,6 +73,9 @@ ) ); + // Set the turbulence into the combustion model + combustion->setTurbulence(turbulence()); + Info<< "Creating field DpDt\n" << endl; volScalarField DpDt ( @@ -98,16 +91,16 @@ } fields.add(hs); - DimensionedField<scalar, volMesh> chemistrySh + volScalarField dQ ( IOobject ( - "chemistry::Sh", + "dQ", runTime.timeName(), mesh, IOobject::NO_READ, - IOobject::NO_WRITE + IOobject::AUTO_WRITE ), mesh, - dimensionedScalar("chemistry::Sh", dimEnergy/dimTime/dimVolume, 0.0) - ); + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0) + ); \ No newline at end of file diff --git a/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H b/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H index 7821d340d4bc6b1f955b94dcb770fd9454acdf95..f7499813c7f63fcfdbe026d28cfc4485c3cff0df 100644 --- a/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H +++ b/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H @@ -8,7 +8,7 @@ DpDt + parcels.Sh(hs) + radiation->Shs(thermo) - + chemistrySh + + combustion->Sh() ); hEqn.relax(); diff --git a/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C b/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C index ae2a06a363b2ff893a0faef9c3b73c3270060535..0d00af9c2a89c7c8811bb8ca100d3cbe8d21997f 100644 --- a/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C +++ b/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C @@ -31,11 +31,9 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hCombustionThermo.H" #include "turbulenceModel.H" #include "basicReactingCloud.H" -#include "psiChemistryModel.H" -#include "chemistrySolver.H" +#include "psiChemistryCombustionModel.H" #include "radiationModel.H" #include "SLGThermo.H" #include "pimpleControl.H" @@ -48,7 +46,6 @@ int main(int argc, char *argv[]) #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "createClouds.H" @@ -76,7 +73,6 @@ int main(int argc, char *argv[]) parcels.evolve(); - #include "chemistry.H" #include "rhoEqn.H" // --- Pressure-velocity PIMPLE corrector loop @@ -100,10 +96,7 @@ int main(int argc, char *argv[]) rho = thermo.rho(); - if (runTime.write()) - { - chemistry.dQ()().write(); - } + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" diff --git a/applications/solvers/lagrangian/reactingParcelFoam/readChemistryProperties.H b/applications/solvers/lagrangian/reactingParcelFoam/readChemistryProperties.H deleted file mode 100644 index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000 --- a/applications/solvers/lagrangian/reactingParcelFoam/readChemistryProperties.H +++ /dev/null @@ -1,23 +0,0 @@ -Info<< "Reading chemistry properties\n" << endl; - -IOdictionary chemistryProperties -( - IOobject - ( - "chemistryProperties", - runTime.constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) -); - -Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction")); - -dimensionedScalar Cmix("Cmix", dimless, 1.0); - -if (turbulentReaction) -{ - chemistryProperties.lookup("Cmix") >> Cmix; -} diff --git a/applications/solvers/lagrangian/sprayFoam/Make/options b/applications/solvers/lagrangian/sprayFoam/Make/options index ff504df32f0445a26d5f9e7fae166313250341e8..f4c66f06f918d426c58214f7d079691de242a24f 100644 --- a/applications/solvers/lagrangian/sprayFoam/Make/options +++ b/applications/solvers/lagrangian/sprayFoam/Make/options @@ -21,6 +21,7 @@ EXE_INC = \ -I$(LIB_SRC)/regionModels/regionModel/lnInclude \ -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/combustionModels/lnInclude \ -I$(FOAM_SOLVERS)/lagrangian/reactingParcelFoam @@ -47,4 +48,5 @@ EXE_LIBS = \ -lODE \ -lregionModels \ -lsurfaceFilmModels \ - -lsampling + -lsampling \ + -lcombustionModels diff --git a/applications/solvers/lagrangian/sprayFoam/chemistry.H b/applications/solvers/lagrangian/sprayFoam/chemistry.H deleted file mode 100644 index 99f418af6f10ac69b44d08fc2271e2dd79c73fc4..0000000000000000000000000000000000000000 --- a/applications/solvers/lagrangian/sprayFoam/chemistry.H +++ /dev/null @@ -1,44 +0,0 @@ -if (chemistry.chemistry()) -{ - Info<< "Solving chemistry" << endl; - - chemistry.solve - ( - runTime.value() - runTime.deltaTValue(), - runTime.deltaTValue() - ); - - // turbulent time scale - if (turbulentReaction) - { - tmp<volScalarField> tepsilon(turbulence->epsilon()); - const volScalarField& epsilon = tepsilon(); - tmp<volScalarField> tmuEff(turbulence->muEff()); - const volScalarField& muEff = tmuEff(); - tmp<volScalarField> ttc(chemistry.tc()); - const volScalarField& tc = ttc(); - - forAll(epsilon, i) - { - if (epsilon[i] > 0) - { - // Chalmers PaSR model - scalar tk = Cmix.value()*Foam::sqrt(muEff[i]/rho[i]/epsilon[i]); - kappa[i] = - (runTime.deltaTValue() + tc[i]) - /(runTime.deltaTValue() + tc[i] + tk); - } - else - { - // Return to laminar combustion - kappa[i] = 1.0; - } - } - } - else - { - kappa = 1.0; - } - - chemistrySh = kappa*chemistry.Sh()(); -} diff --git a/applications/solvers/lagrangian/sprayFoam/sprayFoam.C b/applications/solvers/lagrangian/sprayFoam/sprayFoam.C index 5252fd3cf3905f471c46f62b1a22d6f55ef0f21d..d1f70654eacac05e0fa6e36e40ff61484e72b518 100644 --- a/applications/solvers/lagrangian/sprayFoam/sprayFoam.C +++ b/applications/solvers/lagrangian/sprayFoam/sprayFoam.C @@ -31,11 +31,9 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" -#include "hCombustionThermo.H" #include "turbulenceModel.H" #include "basicSprayCloud.H" -#include "psiChemistryModel.H" -#include "chemistrySolver.H" +#include "psiChemistryCombustionModel.H" #include "radiationModel.H" #include "SLGThermo.H" #include "pimpleControl.H" @@ -48,7 +46,6 @@ int main(int argc, char *argv[]) #include "createTime.H" #include "createMesh.H" - #include "readChemistryProperties.H" #include "readGravitationalAcceleration.H" #include "createFields.H" #include "createClouds.H" @@ -76,7 +73,6 @@ int main(int argc, char *argv[]) parcels.evolve(); - #include "chemistry.H" #include "rhoEqn.H" // --- Pressure-velocity PIMPLE corrector loop diff --git a/src/combustionModels/FSD/FSD.C b/src/combustionModels/FSD/FSD.C new file mode 100644 index 0000000000000000000000000000000000000000..699111171b636952d25dd8f1626e628c39aeb773 --- /dev/null +++ b/src/combustionModels/FSD/FSD.C @@ -0,0 +1,362 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "FSD.H" +#include "addToRunTimeSelectionTable.H" +#include "LESModel.H" + +namespace Foam +{ +namespace combustionModels +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class CombThermoType, class ThermoType> +FSD<CombThermoType, ThermoType>::FSD +( + const word& modelType, const fvMesh& mesh +) +: + singleStepCombustion<CombThermoType, ThermoType>(modelType, mesh), + reactionRateFlameArea_ + ( + reactionRateFlameArea::New + ( + this->coeffs(), + this->mesh(), + *this + ) + ), + ft_ + ( + IOobject + ( + "ft", + this->mesh().time().timeName(), + this->mesh(), + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + this->mesh(), + dimensionedScalar("zero", dimless, 0.0) + ), + YFuelFuelStream_ + ( + dimensionedScalar("YFuelStream", dimless, 1.0) + ), + YO2OxiStream_ + ( + dimensionedScalar("YOxiStream", dimless, 0.23) + ), + Cv_(readScalar(this->coeffs().lookup("Cv"))), + C_(5.0), + ftMin_(0.0), + ftMax_(1.0), + ftDim_(300), + ftVarMin_(readScalar(this->coeffs().lookup("ftVarMin"))) +{} + + +// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // + +template<class CombThermoType, class ThermoType> +FSD<CombThermoType, ThermoType>::~FSD() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template<class CombThermoType, class ThermoType> +void FSD<CombThermoType, ThermoType>::calculateSourceNorm() +{ + this->singleMixture_.fresCorrect(); + + const label fuelI = this->singleMixture_.fuelIndex(); + + const volScalarField& YFuel = this->thermo_->composition().Y()[fuelI]; + + const volScalarField& YO2 = this->thermo_->composition().Y("O2"); + + const dimensionedScalar s = this->singleMixture_.s(); + + ft_ = + (s*YFuel - (YO2 - YO2OxiStream_))/(s*YFuelFuelStream_ + YO2OxiStream_); + + + volVectorField nft = fvc::grad(ft_); + + volScalarField mgft = mag(nft); + + surfaceVectorField SfHat = this->mesh().Sf()/this->mesh().magSf(); + + volScalarField cAux = scalar(1) - ft_; + + dimensionedScalar dMgft = 1.0e-3* + (ft_*cAux*mgft)().weightedAverage(this->mesh().V()) + /((ft_*cAux)().weightedAverage(this->mesh().V()) + SMALL) + + dimensionedScalar("ddMgft", mgft.dimensions(), SMALL); + + mgft += dMgft; + + nft /= mgft; + + const volVectorField& U = YO2.db().lookupObject<volVectorField>("U"); + + const volScalarField sigma = + (nft & nft)*fvc::div(U) - (nft & fvc::grad(U) & nft); + + reactionRateFlameArea_->correct(sigma); + + const volScalarField& omegaFuel = reactionRateFlameArea_->omega(); + + + const scalar ftStoich = + YO2OxiStream_.value() + /( + s.value()*YFuelFuelStream_.value() + YO2OxiStream_.value() + ); + + tmp<volScalarField> tPc + ( + new volScalarField + ( + IOobject + ( + "Pc", + U.time().timeName(), + U.db(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + U.mesh(), + dimensionedScalar("Pc", dimless, 0) + ) + ); + + volScalarField& pc = tPc(); + + tmp<volScalarField> tomegaFuel + ( + new volScalarField + ( + IOobject + ( + "omegaFuelBar", + U.time().timeName(), + U.db(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + U.mesh(), + dimensionedScalar + ( + "omegaFuelBar", + omegaFuel.dimensions(), + 0 + ) + ) + ); + + volScalarField& omegaFuelBar = tomegaFuel(); + + // Calculation of the mixture fraction variance (ftVar) + const compressible::LESModel& lesModel = + YO2.db().lookupObject<compressible::LESModel>("LESProperties"); + + const volScalarField& delta = lesModel.delta(); + const volScalarField ftVar = Cv_*sqr(delta)*sqr(mgft); + + // Thickened flame (average flame thickness for counterflow configuration + // is 1.5 mm) + + volScalarField deltaF = + lesModel.delta()/dimensionedScalar("flame",dimLength, 1.5e-3); + + // Linear correlation between delta and flame thickness + volScalarField omegaF = max(deltaF*(4.0/3.0) + (2.0/3.0), 1.0); + + scalar deltaFt = 1.0/ftDim_; + + forAll(ft_, cellI) + { + if(ft_[cellI] > ftMin_ && ft_[cellI] < ftMax_) + { + scalar ftCell = ft_[cellI]; + + if(ftVar[cellI] > ftVarMin_) //sub-grid beta pdf of ft_ + { + scalar ftVarc = ftVar[cellI]; + scalar a = + max(ftCell*(ftCell*(1.0 - ftCell)/ftVarc - 1.0), 0.0); + scalar b = max(a/ftCell - a, 0.0); + + for(int i=1; i<ftDim_; i++) + { + scalar ft = i*deltaFt; + pc[cellI] += pow(ft, a-1.0)*pow(1.0 - ft, b - 1.0)*deltaFt; + } + + for(int i=1; i<ftDim_; i++) + { + scalar ft = i*deltaFt; + omegaFuelBar[cellI] += + omegaFuel[cellI]/omegaF[cellI] + *exp + ( + -sqr(ft - ftStoich) + /(2.0*sqr(0.01*omegaF[cellI])) + ) + *pow(ft, a - 1.0) + *pow(1.0 - ft, b - 1.0) + *deltaFt; + } + omegaFuelBar[cellI] /= max(pc[cellI], 1e-4); + } + else + { + omegaFuelBar[cellI] = + (omegaFuel[cellI]/omegaF[cellI]) + *exp + ( + -sqr(ftCell - ftStoich)/(2.0*sqr(0.01*omegaF[cellI])) + ); + } + + } + else + { + omegaFuelBar[cellI] = 0.0; + } + } + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Combustion progress variable (c). +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + List<label> productsIndex(2, -1); + { + label i = 0; + forAll (this->singleMixture_.specieProd(), specieI) + { + if (this->singleMixture_.specieProd()[specieI] < 0) + { + productsIndex[i] = specieI; + i++; + } + } + } + + + // Flamelet probability of the progress c based on IFC (reuse pc) + scalar YprodTotal = 0; + forAll (productsIndex, j) + { + YprodTotal += this->singleMixture_.Yprod0()[productsIndex[j]]; + } + + forAll(ft_, cellI) + { + if(ft_[cellI] < ftStoich) + { + pc[cellI] = ft_[cellI]*(YprodTotal/ftStoich); + } + else + { + pc[cellI] = (1.0 - ft_[cellI])*(YprodTotal/(1.0 - ftStoich)); + } + } + + tmp<volScalarField> tproducts + ( + new volScalarField + ( + IOobject + ( + "products", + U.time().timeName(), + U.db(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + U.mesh(), + dimensionedScalar("products", dimless, 0) + ) + ); + + volScalarField& products = tproducts(); + + forAll (productsIndex, j) + { + label specieI = productsIndex[j]; + const volScalarField& Yp = this->thermo_->composition().Y()[specieI]; + products += Yp; + } + + volScalarField c = max(scalar(1.0) - products/max(pc, 1e-5), 0.0); + + pc = min(C_*c, scalar(1.0)); + + const volScalarField fres = this->singleMixture_.fres(fuelI); + + this->wFuel_ == mgft*pc*omegaFuelBar; +} + + +template<class CombThermoType, class ThermoType> +void FSD<CombThermoType, ThermoType>::correct() +{ + this->wFuel_ == + dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0); + + if (this->active()) + { + calculateSourceNorm(); + } +} + + +template<class CombThermoType, class ThermoType> +bool FSD<CombThermoType, ThermoType>::read() +{ + if (singleStepCombustion<CombThermoType, ThermoType>::read()) + { + this->coeffs().lookup("Cv") >> Cv_ ; + this->coeffs().lookup("ftVarMin") >> ftVarMin_; + reactionRateFlameArea_->read(this->coeffs()); + return true; + } + else + { + return false; + } +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace combustionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/FSD/FSD.H b/src/combustionModels/FSD/FSD.H new file mode 100644 index 0000000000000000000000000000000000000000..f727790e62de229c9b52dd0c2cf741b5e3b78ef1 --- /dev/null +++ b/src/combustionModels/FSD/FSD.H @@ -0,0 +1,173 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::combustionModels::FSD + +Description + + Flame Surface Dennsity (FDS) combustion model. + + The fuel source term is given by mgft*pc*omegaFuelBar. + + where: + mgft: filtered flame area. + pc: probability of the combustion progress. + omegaFuelBar: filtered consumption speed per unit of flame area. + + pc is considered from the IFC solution. + omegaFuelBar is calculated solving a relaxation equation which tends to + omegaEq. This omegaEq is obtained from the flamelet solution for + different strain rates and fit using a expential distribution. + + The spacial distribution of the consumption speed (omega) is obtained also + from a strained flamelet solution and it is assumed to have a guassian + distribution. + + If the grid resolution is not enough to resolve the flame, the consumption + speed distribution is linearly thickened conserving the overall heat + release. + + If the turbulent fluctuation of the mixture fraction at the sub-grid level + is large (>1E-04) then a beta pdf is used for filtering. + + At the moment the flame area combustion model is only fit to work in a LES + frame work. In RAS the subgrid fluctiuation has to be solved by an extra + transport equation. + +SourceFiles + FSD.C + +\*---------------------------------------------------------------------------*/ + +#ifndef FSD_H +#define FSD_H + +#include "singleStepCombustion.H" +#include "reactionRateFlameArea.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + +/*---------------------------------------------------------------------------*\ + Class FSD Declaration +\*---------------------------------------------------------------------------*/ + +template<class CombThermoType, class ThermoType> +class FSD +: + public singleStepCombustion <CombThermoType, ThermoType> +{ + // Private data + + //- Auto pointer to consumption speed per unit of flame area model + autoPtr<reactionRateFlameArea> reactionRateFlameArea_; + + //- Mixture fraction + volScalarField ft_; + + //- Fuel mass concentration on the fuel stream + dimensionedScalar YFuelFuelStream_; + + //- Oxygen mass concentration on the oxydizer stream + dimensionedScalar YO2OxiStream_; + + //- Similarity constant for the sub-grid ft fluctuations + scalar Cv_; + + //- Model constant + scalar C_; + + //- Lower flammability limit + scalar ftMin_; + + //- Upper flammability limit + scalar ftMax_; + + //- Dimension of the ft space. Used to integrate the beta-pdf + scalar ftDim_; + + //- Minimum mixture freaction variance to calculate pdf + scalar ftVarMin_; + + + // Private Member Functions + + //- Calculate the normalised fuel source term + void calculateSourceNorm(); + + //- Disallow copy construct + FSD(const FSD&); + + //- Disallow default bitwise assignment + void operator=(const FSD&); + + +public: + + //- Runtime type information + TypeName("FSD"); + + + // Constructors + + //- Construct from components + FSD(const word& modelType, const fvMesh& mesh); + + + // Destructor + virtual ~FSD(); + + + // Evolution + + //- Correct combustion rate + virtual void correct(); + + + // I-O + + //- Update properties + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace combustionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "FSD.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/FSD/FSDs.C b/src/combustionModels/FSD/FSDs.C new file mode 100644 index 0000000000000000000000000000000000000000..1d8527216914816be38b646e33b1277a99d81c06 --- /dev/null +++ b/src/combustionModels/FSD/FSDs.C @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "makeCombustionTypes.H" + +#include "thermoPhysicsTypes.H" +#include "psiCombustionModel.H" +#include "FSD.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + makeCombustionTypesThermo + ( + FSD, + psiCombustionModel, + gasThermoPhysics + ); + +} +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C new file mode 100644 index 0000000000000000000000000000000000000000..a8d9903b6eb8885139be6c927dbe835227a86035 --- /dev/null +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C @@ -0,0 +1,137 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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 2 of the License, or (at your + option) any later version. + + OpenFOAM 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 OpenFOAM; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "consumptionSpeed.H" + +/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */ + +namespace Foam +{ + defineTypeNameAndDebug(consumptionSpeed, 0); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::consumptionSpeed::consumptionSpeed +( + const dictionary& dict +) +: omega0_(readScalar(dict.lookup("omega0"))), + eta_(readScalar(dict.lookup("eta"))), + sigmaExt_(readScalar(dict.lookup("sigmaExt"))), + omegaMin_(readScalar(dict.lookup("omegaMin"))) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::consumptionSpeed::~consumptionSpeed() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +Foam::scalar Foam::consumptionSpeed::omega0Sigma +( + scalar sigma, + scalar a +) const +{ + scalar omega0 = 0.0; + if (sigma < sigmaExt_) + { + omega0 = + max + ( + a*omega0_*(1.0 - exp(eta_*max(sigma, 0.0))), + omegaMin_ + ) ; + } + return omega0; +} + + +Foam::tmp<Foam::volScalarField> Foam::consumptionSpeed::omega0Sigma +( + const volScalarField& sigma +) +{ + tmp<volScalarField> tomega0 + ( + new volScalarField + ( + IOobject + ( + "omega0", + sigma.time().timeName(), + sigma.db(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + sigma.mesh(), + dimensionedScalar + ( + "omega0", + dimensionSet(1, -2, -1, 0, 0, 0, 0), + 0 + ) + ) + ); + + volScalarField& omega0 = tomega0(); + + forAll(omega0, celli) + { + omega0[celli] = omega0Sigma(sigma[celli], 1.0); + } + + forAll(omega0.boundaryField(), patchi) + { + forAll(omega0.boundaryField()[patchi], facei) + { + omega0.boundaryField()[patchi][facei] = + omega0Sigma + ( + sigma.boundaryField()[patchi][facei], + 1.0 + ); + } + } + + return tomega0; +} + + +void Foam::consumptionSpeed::read(const dictionary& dict) +{ + dict.lookup("omega0") >> omega0_ ; + dict.lookup("eta") >> eta_ ; + dict.lookup("sigmaExt") >> sigmaExt_; + dict.lookup("omegaMin") >> omegaMin_; +} + +// ************************************************************************* // diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.H b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.H new file mode 100644 index 0000000000000000000000000000000000000000..80c0dc9a486c71bce9bf63fe673e1ca8271fa4d6 --- /dev/null +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.H @@ -0,0 +1,139 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::reactionRateFlameAreaModels::consumptionSpeed + +Description + Correlation function for laminar consumption speed obtained from flamelet + solution at increasing strain rates. + +SourceFiles + consumptionSpeed.C + +\*---------------------------------------------------------------------------*/ + +#ifndef consumptionSpeed_H +#define consumptionSpeed_H + +#include "IOdictionary.H" +#include "volFields.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class consumptionSpeed Declaration +\*---------------------------------------------------------------------------*/ + +class consumptionSpeed +{ + // Private Data + + + //- Maximum consumption speed + scalar omega0_; + + //- Exponential factor + scalar eta_; + + //- Extinction strain + scalar sigmaExt_; + + //- Minimum consumption speed + scalar omegaMin_; + + + // Private member functions + + //- Return consumption rate + scalar omega0Sigma(scalar sigma, scalar a) const; + + //- Disallow copy construct + consumptionSpeed(const consumptionSpeed&); + + //- Disallow default bitwise assignment + void operator=(const consumptionSpeed&); + + +public: + + //- Runtime type information + TypeName("consumptionSpeed"); + + + // Constructors + + //- Construct from dictionary + consumptionSpeed(const dictionary& dict); + + + //- Destructor + virtual ~consumptionSpeed(); + + + // Member functions + + //- Return speed consumption rate temp + tmp<volScalarField> omega0Sigma(const volScalarField& sigma); + + + // Access functions + + scalar omega0() const + { + return omega0_; + } + + scalar eta() const + { + return eta_; + } + + scalar sigmaExt() const + { + return sigmaExt_; + } + + scalar omegaMin() const + { + return omegaMin_; + } + + + // I-O + + //- Update properties + void read(const dictionary& dict); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C new file mode 100644 index 0000000000000000000000000000000000000000..f7adc032ab067a6319fced1107349d47532f18d3 --- /dev/null +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "reactionRateFlameArea.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(reactionRateFlameArea, 0); + defineRunTimeSelectionTable(reactionRateFlameArea, dictionary); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::reactionRateFlameArea::reactionRateFlameArea +( + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel +) +: + coeffDict_(dictionary::null), + mesh_(mesh), + combModel_(combModel), + fuel_(dict.lookup("fuel")), + omega_ + ( + IOobject + ( + "omega", + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh_ + ) +{ +} + + +Foam::reactionRateFlameArea::reactionRateFlameArea +( + const word& modelType, + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel +) +: + coeffDict_(dict.subDict(modelType + "Coeffs")), + mesh_(mesh), + combModel_(combModel), + fuel_(dict.lookup("fuel")), + omega_ + ( + IOobject + ( + "omega", + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh_ + ) +{ +} + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::reactionRateFlameArea::~reactionRateFlameArea() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +bool Foam::reactionRateFlameArea::read(const dictionary& dict) +{ + dict.lookup("fuel") >> fuel_; + return true; + +} + +// ************************************************************************* // diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.H b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.H new file mode 100644 index 0000000000000000000000000000000000000000..6353f7241dc3c38d6154476d1151a0002f8928e5 --- /dev/null +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.H @@ -0,0 +1,176 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + + +Class + Foam::reactionRateFlameArea + +Description + Abstract class for reaction rate per flame area unit + +SourceFiles + reactionRateFlameArea.C + reactionRateFlameAreaNew.C + +\*---------------------------------------------------------------------------*/ + +#ifndef reactionRateFlameArea_H +#define reactionRateFlameArea_H + +#include "runTimeSelectionTables.H" +#include "dictionary.H" +#include "autoPtr.H" +#include "volFields.H" +#include "combustionModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +class fvMesh; + +/*---------------------------------------------------------------------------*\ + Class reactionRateFlameArea Declaration +\*---------------------------------------------------------------------------*/ + +class reactionRateFlameArea +{ + +protected: + + // Protected data + + //- Dictionary + dictionary coeffDict_; + + //- Mesh reference + const fvMesh& mesh_; + + //- Combstion model owner + const combustionModel& combModel_; + + //- Fuel name + word fuel_; + + //- Fuel consumption rate per unit of flame area + volScalarField omega_; + + +private: + + // Private member functions + + //- Disallow copy construct + reactionRateFlameArea(const reactionRateFlameArea&); + + //- Disallow default bitwise assignment + void operator=(const reactionRateFlameArea&); + + +public: + + //- Runtime type information + TypeName("reactionRateFlameArea"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + reactionRateFlameArea, + dictionary, + ( + const word modelType, + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel + ), + (modelType, dict, mesh, combModel) + ); + + + // Constructors + + //- Construct from dictionary and hsCombustionThermo + reactionRateFlameArea + ( + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel + ); + + //- Construct from components + reactionRateFlameArea + ( + const word& modelType, + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel + ); + + + // Selector + + static autoPtr<reactionRateFlameArea> New + ( + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel + ); + + + // Destructor + + virtual ~reactionRateFlameArea(); + + + // Member functions + + //- Access functions + + //- Return omega + const volScalarField& omega() const + { + return omega_; + } + + + //- Correct omega + virtual void correct(const volScalarField& sigma) = 0; + + //- Update from dictionary + virtual bool read(const dictionary& dictProperties); + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C new file mode 100644 index 0000000000000000000000000000000000000000..bd8e28062b241c4736d9f121bcab20d76c5ec8a5 --- /dev/null +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C @@ -0,0 +1,69 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "reactionRateFlameArea.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::reactionRateFlameArea> Foam::reactionRateFlameArea::New +( + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel +) +{ + word reactionRateFlameAreaType + ( + dict.lookup("reactionRateFlameArea") + ); + + Info<< "Selecting reaction rate flame area correlation " + << reactionRateFlameAreaType << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(reactionRateFlameAreaType); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalIOErrorIn + ( + "reactionRateFlameArea::New(const hsCombustionThermo&)", + dict + ) << "Unknown reactionRateFlameArea type " + << reactionRateFlameAreaType << endl << endl + << "Valid reaction rate flame area types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalIOError); + } + + const label tempOpen = reactionRateFlameAreaType.find('<'); + + const word className = reactionRateFlameAreaType(0, tempOpen); + + return autoPtr<reactionRateFlameArea> + (cstrIter()(className, dict, mesh, combModel)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C new file mode 100644 index 0000000000000000000000000000000000000000..9f8415385fa6380037ac1c6b0ac91a0d1b8d5bf9 --- /dev/null +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C @@ -0,0 +1,155 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "relaxation.H" +#include "addToRunTimeSelectionTable.H" +#include "fvm.H" +#include "LESModel.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace reactionRateFlameAreaModels +{ + defineTypeNameAndDebug(relaxation, 0); + addToRunTimeSelectionTable + ( + reactionRateFlameArea, + relaxation, + dictionary + ); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::reactionRateFlameAreaModels::relaxation::relaxation +( + const word modelType, + const dictionary& dict, + const fvMesh& mesh, + const combustionModel& combModel +) +: + reactionRateFlameArea(modelType, dict, mesh, combModel), + correlation_(dict.subDict(typeName + "Coeffs").subDict(fuel_)), + C_(readScalar(dict.subDict(typeName + "Coeffs").lookup("C"))), + alpha_(readScalar(dict.subDict(typeName + "Coeffs").lookup("alpha"))) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::reactionRateFlameAreaModels::relaxation::~relaxation() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::reactionRateFlameAreaModels::relaxation::correct +( + const volScalarField& sigma +) +{ + + dimensionedScalar omega0 + ( + "omega0", + dimensionSet(1, -2, -1, 0, 0, 0, 0), + correlation_.omega0() + ); + + dimensionedScalar sigmaExt + ( + "sigmaExt", + dimensionSet(0, 0, -1, 0, 0, 0, 0), + correlation_.sigmaExt() + ); + + dimensionedScalar omegaMin + ( + "omegaMin", + omega0.dimensions(), + 1e-4 + ); + + const compressible::LESModel& lesModel = + omega_.db().lookupObject<compressible::LESModel>("LESProperties"); + + // Total strain : resolved and sub-grid (just LES for now) + const volScalarField sigmaTotal = + sigma + alpha_*lesModel.epsilon()/(lesModel.k() + lesModel.kMin()); + + const volScalarField omegaInf = correlation_.omega0Sigma(sigmaTotal); + + dimensionedScalar sigma0("sigma0", sigma.dimensions(), 0.0); + + const volScalarField tau = C_*mag(sigmaTotal); + + volScalarField Rc = + (tau*omegaInf*(omega0 - omegaInf) + sqr(omegaMin)*sigmaExt) + /(sqr(omega0 - omegaInf) + sqr(omegaMin)); + + const volScalarField rho(combModel_.rho()); + const surfaceScalarField phi(combModel_.phi()); + + solve + ( + fvm::ddt(rho, omega_) + + fvm::div(phi, omega_, "div(phi,omega)") + == + rho*Rc*omega0 + - fvm::SuSp(rho*(tau + Rc), omega_) + ); + + omega_.min(omega0); + omega_.max(0.0); +} + + +bool Foam::reactionRateFlameAreaModels::relaxation::read +( + const dictionary& dict +) +{ + if (reactionRateFlameArea::read(dict)) + { + coeffDict_ = dict.subDict(typeName + "Coeffs"); + coeffDict_.lookup("C") >> C_; + coeffDict_.lookup("alpha") >> alpha_; + correlation_.read + ( + coeffDict_.subDict(fuel_) + ); + return true; + } + else + { + return false; + } +} + +// ************************************************************************* // diff --git a/src/combustionModels/noCombustion/noCombustion.H b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.H similarity index 55% rename from src/combustionModels/noCombustion/noCombustion.H rename to src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.H index d36f4c11e342657f43019015c7c42a30fa104121..3e0aea5b8b658e786bf3630a3944dcfd1086c449 100644 --- a/src/combustionModels/noCombustion/noCombustion.H +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -21,72 +21,97 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Class - Foam::combustionModel::noCombustion + Foam::reactionRateFlameAreaModels::relaxation Description - Dummy combustion model for 'none' option + Consumption rate per unit of flame area obtained from a relaxation equation SourceFiles - noCombustion.C + relaxation.C \*---------------------------------------------------------------------------*/ -#ifndef noCombustion_H -#define noCombustion_H +#ifndef relaxation_H +#define relaxation_H -#include "combustionModel.H" +#include "reactionRateFlameArea.H" +#include "consumptionSpeed.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { -namespace combustionModels +namespace reactionRateFlameAreaModels { /*---------------------------------------------------------------------------*\ - Class noCombustion Declaration + Class relaxation Declaration \*---------------------------------------------------------------------------*/ -class noCombustion +class relaxation : - public combustionModel + public reactionRateFlameArea { - // Private Member Functions + // Private Data + + //- Correlation + consumptionSpeed correlation_; + + //- Proportionality constant for time scale in the relaxation Eq. + scalar C_; + + //- Proportionality constant for sub-grid strain + scalar alpha_; + + + // Private Member Functions //- Disallow copy construct - noCombustion(const noCombustion&); + relaxation(const relaxation&); //- Disallow default bitwise assignment - void operator=(const noCombustion&); + void operator=(const relaxation&); public: //- Runtime type information - TypeName("none"); + TypeName("relaxation"); // Constructors - //- Construct from components - noCombustion + //- Construct from dictionary and hsCombustionThermo + relaxation ( - const dictionary& combustionProperties, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho + const word modelType, + const dictionary& dictCoeffs, + const fvMesh& mesh, + const combustionModel& combModel ); - //- Destructor - virtual ~noCombustion(); + // Destructor + + virtual ~relaxation(); + + + // Member functions + + //- Correct omega + virtual void correct(const volScalarField& sigma); + + + // I-O + + //- Update properties from given dictionary + virtual bool read(const dictionary& dictProperties); }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -} // End namespace combustionModels +} // End reactionRateFlameAreaModels } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/Make/files b/src/combustionModels/Make/files index 86696b0709373fbb8bb6c63f090564f55b85d740..3bb286c7d6bb55525cdd676413d9b87ff6c3c7ec 100644 --- a/src/combustionModels/Make/files +++ b/src/combustionModels/Make/files @@ -1,9 +1,27 @@ combustionModel/combustionModel.C -combustionModel/combustionModelNew.C -infinitelyFastChemistry/infinitelyFastChemistry.C +psiCombustionModel/psiCombustionModel.C +psiCombustionModel/psiCombustionModelNew.C -noCombustion/noCombustion.C +rhoCombustionModel/rhoCombustionModel.C +rhoCombustionModel/rhoCombustionModelNew.C + +infinitelyFastChemistry/infinitelyFastChemistrys.C + +psiChemistryCombustionModel/psiChemistryCombustionModel.C +psiChemistryCombustionModel/psiChemistryCombustionModelNew.C + +rhoChemistryCombustionModel/rhoChemistryCombustionModel.C +rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C + +PaSR/PaSRs.C + +FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C +FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C +FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C +FSD/reactionRateFlameAreaModels/relaxation/relaxation.C + +FSD/FSDs.C LIB = $(FOAM_LIBBIN)/libcombustionModels diff --git a/src/combustionModels/Make/options b/src/combustionModels/Make/options index 314c820f246e9647033b316e36cbdec038a85a08..77f96e3a4a6ae84658800f7543df20b954f4a8f1 100644 --- a/src/combustionModels/Make/options +++ b/src/combustionModels/Make/options @@ -2,8 +2,14 @@ EXE_INC = \ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \ -I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \ + -I$(LIB_SRC)/turbulenceModels/ \ + -I$(LIB_SRC)/turbulenceModels/LES/LESdeltas/lnInclude \ + -I$(LIB_SRC)/turbulenceModels/LES/LESfilters/lnInclude \ + -I$(LIB_SRC)/turbulenceModels/compressible/LES/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude LIB_LIBS = \ - -lfiniteVolume + -lfiniteVolume \ + -lchemistryModel diff --git a/src/combustionModels/PaSR/PaSR.C b/src/combustionModels/PaSR/PaSR.C new file mode 100644 index 0000000000000000000000000000000000000000..a33b778bab3cb62d68f5f57f7fdf1cff2b9effc4 --- /dev/null +++ b/src/combustionModels/PaSR/PaSR.C @@ -0,0 +1,253 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "PaSR.H" +#include "fvmSup.H" + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class CombThermoType> +Foam::combustionModels::PaSR<CombThermoType>::PaSR +( + const word& modelType, + const fvMesh& mesh +) +: + CombThermoType(modelType, mesh), + Cmix_(this->coeffs().lookup("Cmix")), + turbulentReaction_(this->coeffs().lookup("turbulentReaction")), + kappa_ + ( + IOobject + ( + "kappa", + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + mesh, + dimensionedScalar("kappa", dimless, 0.0) + ), + useReactionRate_(this->coeffs().lookupOrDefault("useReactionRate", false)) +{} + + +// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // + +template<class CombThermoType> +Foam::combustionModels::PaSR<CombThermoType>::~PaSR() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +template<class CombThermoType> +Foam::tmp<Foam::volScalarField> +Foam::combustionModels::PaSR<CombThermoType>::tc() const +{ + return this->pChemistry_->tc(); +} + + +template<class CombThermoType> +void Foam::combustionModels::PaSR<CombThermoType>::correct() +{ + if (this->active()) + { + if (!useReactionRate_) + { + this->pChemistry_->solve + ( + this->mesh().time().value()-this->mesh().time().deltaTValue(), + this->mesh().time().deltaTValue() + ); + } + else + { + this->pChemistry_->calculate(); + } + + if (turbulentReaction_) + { + tmp<volScalarField> tepsilon(this->turbulence().epsilon()); + const volScalarField& epsilon = tepsilon(); + tmp<volScalarField> tmuEff(this->turbulence().muEff()); + const volScalarField& muEff = tmuEff(); + tmp<volScalarField> ttc(tc()); + const volScalarField& tc = ttc(); + forAll(epsilon, i) + { + if (epsilon[i] > 0) + { + const dimensionedScalar e0 + ( + "e0", + sqr(dimLength)/pow3(dimTime), SMALL + ); + + scalar tk = + Cmix_.value() + *Foam::sqrt + ( + muEff[i]/this->rho()()[i]/(epsilon[i] + e0.value()) + ); + + // Chalmers PaSR model + if (!useReactionRate_) + { + kappa_[i] = + ( this->mesh().time().deltaTValue() + tc[i]) + /( this->mesh().time().deltaTValue() + tc[i] + tk); + } + else + { + kappa_[i] = tc[i]/(tc[i] + tk); + } + } + else + { + // Return to laminar combustion + kappa_[i] = 1.0; + } + } + } + else + { + kappa_ = 1.0; + } + } +} + + +template<class CombThermoType> +Foam::tmp<Foam::fvScalarMatrix> +Foam::combustionModels::PaSR<CombThermoType>::R(const volScalarField& Y) const +{ + + tmp<fvScalarMatrix> tSu + ( + new fvScalarMatrix(Y, dimMass/dimTime) + ); + + fvScalarMatrix& Su = tSu(); + + if (this->active()) + { + const label specieI = this->thermo().composition().species()[Y.name()]; + + Su += kappa_*this->pChemistry_->RR(specieI); + } + + return tSu; +} + + +template<class CombThermoType> +Foam::tmp<Foam::volScalarField> +Foam::combustionModels::PaSR<CombThermoType>::dQ() const +{ + tmp<volScalarField> tdQ + ( + new volScalarField + ( + IOobject + ( + "dQ", + this->mesh().time().timeName(), + this->mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + this->mesh(), + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0), + zeroGradientFvPatchScalarField::typeName + ) + ); + + if (this->active()) + { + volScalarField& dQ = tdQ(); + dQ = kappa_*this->pChemistry_->dQ(); + } + + return tdQ; +} + + +template<class CombThermoType> +Foam::tmp<Foam::volScalarField> +Foam::combustionModels::PaSR<CombThermoType>::Sh() const +{ + tmp<volScalarField> tSh + ( + new volScalarField + ( + IOobject + ( + "Sh", + this->mesh().time().timeName(), + this->mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + this->mesh(), + dimensionedScalar("zero", dimEnergy/dimTime/dimVolume, 0.0), + zeroGradientFvPatchScalarField::typeName + ) + ); + + if (this->active()) + { + scalarField& Sh = tSh(); + Sh = kappa_*this->pChemistry_->Sh(); + } + + return tSh; +} + + +template<class CombThermoType> +bool Foam::combustionModels::PaSR<CombThermoType>::read() +{ + if (CombThermoType::read()) + { + this->coeffs().lookup("Cmix") >> Cmix_; + this->coeffs().lookup("turbulentReaction") >> turbulentReaction_; + this->coeffs().lookup("useReactionRate") >> useReactionRate_; + return true; + } + else + { + return false; + } +} + + +// ************************************************************************* // diff --git a/src/combustionModels/PaSR/PaSR.H b/src/combustionModels/PaSR/PaSR.H new file mode 100644 index 0000000000000000000000000000000000000000..4250c63a6a64283f48e6e89a2b48ef0e8a07ddd2 --- /dev/null +++ b/src/combustionModels/PaSR/PaSR.H @@ -0,0 +1,140 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::combustionModels::PaSR + +Description + Simple infinitely fast chemistry combustion model based on the principle + mixed is burnt. Additional parameter C is used to distribute the heat + release rate.in time + +SourceFiles + PaSR.C + +\*---------------------------------------------------------------------------*/ + +#ifndef PaSR_H +#define PaSR_H + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + +/*---------------------------------------------------------------------------*\ + Class PaSR Declaration +\*---------------------------------------------------------------------------*/ + +template<class CombThermoType> +class PaSR +: + public CombThermoType +{ + // Private data + + //- Mixing constant + dimensionedScalar Cmix_; + + //- Turbulent reaction switch + Switch turbulentReaction_; + + //- Mixing parameter + volScalarField kappa_; + + //- Use reaction rate + bool useReactionRate_; + + + // Private Member Functions + + //- Return the chemical time scale + tmp<volScalarField> tc() const; + + //- Disallow copy construct + PaSR(const PaSR&); + + //- Disallow default bitwise assignment + void operator=(const PaSR&); + + +public: + + //- Runtime type information + TypeName("PaSR"); + + + // Constructors + + //- Construct from components + PaSR + ( + const word& modelType, + const fvMesh& mesh + ); + + + //- Destructor + virtual ~PaSR(); + + + // Member Functions + + // Evolution + + //- Correct combustion rate + virtual void correct(); + + //- Fuel consumption rate matrix. + virtual tmp<fvScalarMatrix> R(const volScalarField& Y) const; + + //- Heat release rate calculated from fuel consumption rate matrix + virtual tmp<volScalarField> dQ() const; + + //- Return source for enthalpy equation [kg/m/s3] + virtual tmp<volScalarField> Sh() const; + + // I-O + + //- Update properties from given dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace combustionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "PaSR.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/PaSR/PaSRs.C b/src/combustionModels/PaSR/PaSRs.C new file mode 100644 index 0000000000000000000000000000000000000000..650ef9867609ad767bd76b06064644f1b6724219 --- /dev/null +++ b/src/combustionModels/PaSR/PaSRs.C @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "makeCombustionTypes.H" + +#include "psiChemistryCombustionModel.H" +#include "rhoChemistryCombustionModel.H" +#include "PaSR.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + makeCombustionTypes + ( + PaSR, + psiChemistryCombustionModel + ); + + makeCombustionTypes + ( + PaSR, + rhoChemistryCombustionModel + ); +} +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/combustionModel/combustionModel.C b/src/combustionModels/combustionModel/combustionModel.C index bfccadf733d45683dcc470ebb53779bc3458452d..b87503a92478599737fc1a6c5fb610bf6100c150 100644 --- a/src/combustionModels/combustionModel/combustionModel.C +++ b/src/combustionModels/combustionModel/combustionModel.C @@ -1,153 +1,111 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. - \\/ M anipulation | -------------------------------------------------------------------------------- -License - - OpenFOAM 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. - - OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. - -\*---------------------------------------------------------------------------*/ - -#include "combustionModel.H" -#include "surfaceFields.H" -#include "fvScalarMatrix.H" - -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ - defineTypeNameAndDebug(combustionModel, 0); - defineRunTimeSelectionTable(combustionModel, dictionary); -}; - - -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -Foam::combustionModel::combustionModel -( - const dictionary& combustionProps, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho -) -: - coeffs_(dictionary::null), - thermo_(thermo), - turbulence_(turbulence), - mesh_(phi.mesh()), - phi_(phi), - rho_(rho) -{} - - -Foam::combustionModel::combustionModel -( - const word& modelType, - const dictionary& combustionProps, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho -) -: - coeffs_(combustionProps.subDict(modelType + "Coeffs")), - thermo_(thermo), - turbulence_(turbulence), - mesh_(phi.mesh()), - phi_(phi), - rho_(rho) -{} - - -// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // - -Foam::combustionModel::~combustionModel() -{} - - -// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // - -void Foam::combustionModel::correct() -{ - // do nothing -} - - -Foam::tmp<Foam::fvScalarMatrix> Foam::combustionModel::R -( - volScalarField& Y -) const -{ - return tmp<fvScalarMatrix> - ( - new fvScalarMatrix(Y, dimMass/dimTime*Y.dimensions()) - ); -} - - -Foam::tmp<Foam::volScalarField> Foam::combustionModel::dQ() const -{ - return tmp<Foam::volScalarField> - ( - new volScalarField - ( - IOobject - ( - "dQ", - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0) - ) - ); -} - - -Foam::tmp<Foam::volScalarField> Foam::combustionModel::wFuelNorm() const -{ - return tmp<Foam::volScalarField> - ( - new volScalarField - ( - IOobject - ( - "wFuelNorm", - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("zero", dimMass/dimTime/pow3(dimLength), 0.0) - ) - ); -} - - -bool Foam::combustionModel::read(const dictionary& combustionProps) -{ - coeffs_ = combustionProps.subDict(type() + "Coeffs"); - - return true; -} - - -// ************************************************************************* // +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "combustionModel.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(combustionModel, 0); +} + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::combustionModel::combustionModel +( + const word& modelType, + const fvMesh& mesh +) +: + IOdictionary + ( + IOobject + ( + "combustionProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ), + turbulencePtr_(), + mesh_(mesh), + active_(lookupOrDefault<Switch>("active", true)), + coeffs_(subDict(modelType + "Coeffs")), + modelType_(modelType) +{} + + +// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // + +Foam::combustionModel::~combustionModel() +{ + if (turbulencePtr_) + { + turbulencePtr_ = 0; + } +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +bool Foam::combustionModel::read() +{ + if (regIOobject::read()) + { + this->lookup("active") >> active_; + coeffs_ = subDict(modelType_ + "Coeffs"); + return true; + } + else + { + return false; + } +} + + +Foam::tmp<Foam::volScalarField> Foam::combustionModel::Sh() const +{ + return tmp<Foam::volScalarField> + ( + new volScalarField + ( + IOobject + ( + "Sh", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0) + ) + ); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/combustionModel/combustionModel.H b/src/combustionModels/combustionModel/combustionModel.H index 28ccb85b1b82027eeb2299512b72eac101447336..7b997fce70dd06a89b61e9b89b674d213682eeae 100644 --- a/src/combustionModels/combustionModel/combustionModel.H +++ b/src/combustionModels/combustionModel/combustionModel.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -24,8 +24,7 @@ Class Foam::combustionModel Description - Base class for all non-premixed combustion models based on single step - chemistry + Base class for combustion models SourceFiles combustionModel.C @@ -36,9 +35,7 @@ SourceFiles #define combustionModel_H #include "IOdictionary.H" -#include "hsCombustionThermo.H" #include "turbulenceModel.H" -#include "runTimeSelectionTables.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -50,29 +47,28 @@ namespace Foam \*---------------------------------------------------------------------------*/ class combustionModel +: + public IOdictionary { protected: // Protected data - //- Dictionary of coefficients for the particular model - dictionary coeffs_; - - //- Reference to the thermodynamics - hsCombustionThermo& thermo_; - //- Reference to the turbulence model - const compressible::turbulenceModel& turbulence_; + compressible::turbulenceModel* turbulencePtr_; //- Reference to the mesh database const fvMesh& mesh_; - //- Reference to mass-flux field - const surfaceScalarField& phi_; + //- Active + Switch active_; - //- Reference to the density field - const volScalarField& rho_; + //- Dictionary of the model + dictionary coeffs_; + + //- Model name + const word modelType_; private: @@ -92,101 +88,66 @@ public: TypeName("combustionModel"); - // Declare run-time constructor selection table + // Constructors - declareRunTimeSelectionTable - ( - autoPtr, - combustionModel, - dictionary, - ( - const dictionary& combustionProperties, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho - ), - ( - combustionProperties, - thermo, - turbulence, - phi, - rho - ) - ); + //- Construct from components + combustionModel(const word& modelType, const fvMesh& mesh); - // Selectors - //- Return a reference to the selected combustion model - static autoPtr<combustionModel> New - ( - const dictionary& combustionProperties, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho - ); + //- Destructor + virtual ~combustionModel(); + + // Member Functions - // Constructors + // Access - //- Construct null from components - combustionModel - ( - const dictionary& combustionProps, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho - ); - //- Construct from components - combustionModel - ( - const word& modelType, - const dictionary& combustionProperties, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho - ); + //- Return const access to the mesh database + inline const fvMesh& mesh() const; + //- Return const access to phi + inline const surfaceScalarField& phi() const; - //- Destructor - virtual ~combustionModel(); + //- Return const access to rho + virtual tmp<volScalarField> rho() const = 0; + //- Return access to turbulence + inline const compressible::turbulenceModel& turbulence() const; - // Member Functions + //- Set turbulence + inline void setTurbulence + ( + compressible::turbulenceModel& turbModel + ); - // Access functions + //- Is combustion active? + inline const Switch& active() const; - //- Access combustion dictionary - const dictionary coeffs() const - { - return coeffs_; - } + //- Return const dictionary of the model + inline const dictionary& coeffs() const; // Evolution //- Correct combustion rate - virtual void correct(); + virtual void correct() = 0; //- Fuel consumption rate matrix, i.e. source term for fuel equation - virtual tmp<fvScalarMatrix> R(volScalarField& Y) const; + virtual tmp<fvScalarMatrix> R(const volScalarField& Y) const = 0; //- Heat release rate calculated from fuel consumption rate matrix - virtual tmp<volScalarField> dQ() const; + virtual tmp<volScalarField> dQ() const = 0; - //- Return normalised consumption rate of (fu - fres) - virtual tmp<Foam::volScalarField> wFuelNorm() const; + //- Return source for enthalpy equation [kg/m/s3] + virtual tmp<volScalarField> Sh() const; // I-O //- Update properties from given dictionary - virtual bool read(const dictionary& combustionProps); + virtual bool read(); }; @@ -196,6 +157,10 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#include "combustionModelI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/combustionModels/combustionModel/combustionModelI.H b/src/combustionModels/combustionModel/combustionModelI.H new file mode 100644 index 0000000000000000000000000000000000000000..208ed6d2ee61470b46b91ad5709a449dad62f551 --- /dev/null +++ b/src/combustionModels/combustionModel/combustionModelI.H @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline const Foam::fvMesh& Foam::combustionModel::mesh() const +{ + return mesh_; +} + + +inline const Foam::surfaceScalarField& Foam::combustionModel::phi() const +{ + if (turbulencePtr_) + { + return turbulencePtr_->phi(); + } + else + { + FatalErrorIn + ( + "const Foam::compressible::turbulenceModel& " + "Foam::combustionModel::turbulence() const " + ) << "turbulencePtr_ is empty. Please use " + << "combustionModel::setTurbulence " + << "(compressible::turbulenceModel& )" + << abort(FatalError); + + return turbulencePtr_->phi(); + } +} + + +inline const Foam::compressible::turbulenceModel& +Foam::combustionModel::turbulence() const +{ + if (turbulencePtr_) + { + return *turbulencePtr_; + } + else + { + FatalErrorIn + ( + "const Foam::compressible::turbulenceModel& " + "Foam::combustionModel::turbulence() const " + ) << "turbulencePtr_ is empty. Please use " + << "combustionModel::setTurbulence " + << "(compressible::turbulenceModel& )" + << abort(FatalError); + + return *turbulencePtr_; + } +} + + +inline const Foam::Switch& Foam::combustionModel::active() const +{ + return active_; +} + + +inline void Foam::combustionModel::setTurbulence +( + compressible::turbulenceModel& turbModel +) +{ + turbulencePtr_ = &turbModel; +} + + +inline const Foam::dictionary& Foam::combustionModel::coeffs() const +{ + return coeffs_; +} + +// ************************************************************************* // diff --git a/src/combustionModels/combustionModel/makeCombustionTypes.H b/src/combustionModels/combustionModel/makeCombustionTypes.H new file mode 100644 index 0000000000000000000000000000000000000000..f3d2ee8e24028bb0fb21e8bec72926438a5ee6fe --- /dev/null +++ b/src/combustionModels/combustionModel/makeCombustionTypes.H @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef makeCombustionTypes_H +#define makeCombustionTypes_H + +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#define makeCombustionTypesThermo(CombModel, Comb, Thermo) \ + \ + typedef CombModel<Comb, Thermo> CombModel##Comb##Thermo; \ + \ + \ + defineTemplateTypeNameAndDebugWithName \ + ( \ + CombModel##Comb##Thermo, \ + #CombModel"<"#Comb","#Thermo">", \ + 0 \ + ); \ + \ + \ + addToRunTimeSelectionTable \ + ( \ + Comb, \ + CombModel##Comb##Thermo, \ + dictionary \ + ); + +#define makeCombustionTypes(CombModel, CombThermoType) \ + \ + typedef CombModel<CombThermoType> \ + CombModel##CombThermoType; \ + \ + defineTemplateTypeNameAndDebugWithName \ + ( \ + CombModel##CombThermoType, \ + #CombModel"<"#CombThermoType">", \ + 0 \ + ); \ + \ + addToRunTimeSelectionTable \ + ( \ + CombThermoType, \ + CombModel##CombThermoType, \ + dictionary \ + ); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C index 2748e31efa20ff9758d44b584726b4b95427d371..16c32e9e56f50f5e14c66bcda0985f4edf71658b 100644 --- a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C +++ b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -23,131 +23,80 @@ License \*---------------------------------------------------------------------------*/ #include "infinitelyFastChemistry.H" -#include "addToRunTimeSelectionTable.H" -#include "fvmSup.H" - -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { namespace combustionModels { - defineTypeNameAndDebug(infinitelyFastChemistry, 0); - addToRunTimeSelectionTable - ( - combustionModel, - infinitelyFastChemistry, - dictionary - ); -}; -}; - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::combustionModels::infinitelyFastChemistry::infinitelyFastChemistry +template<class CombThermoType, class ThermoType> +infinitelyFastChemistry<CombThermoType, ThermoType>::infinitelyFastChemistry ( - const dictionary& combustionProps, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho + const word& modelType, const fvMesh& mesh ) : - combustionModel(typeName, combustionProps, thermo, turbulence, phi, rho), - C_(readScalar(coeffs_.lookup("C"))), - singleMixture_ - ( - dynamic_cast<singleStepReactingMixture<gasThermoPhysics>&>(thermo) - ), - wFuelNorm_ - ( - IOobject - ( - "wFuelNorm", - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0) - ) + singleStepCombustion<CombThermoType, ThermoType>(modelType, mesh), + C_(readScalar(this->coeffs().lookup("C"))) {} // * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // -Foam::combustionModels::infinitelyFastChemistry::~infinitelyFastChemistry() +template<class CombThermoType, class ThermoType> +infinitelyFastChemistry<CombThermoType, ThermoType>::~infinitelyFastChemistry() {} // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // -void Foam::combustionModels::infinitelyFastChemistry::correct() +template<class CombThermoType, class ThermoType> +void infinitelyFastChemistry<CombThermoType, ThermoType>::correct() { - singleMixture_.fresCorrect(); - - const label fuelI = singleMixture_.fuelIndex(); + this->wFuel_ == + dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0); - const volScalarField& YFuel = thermo_.composition().Y()[fuelI]; - - const dimensionedScalar s = singleMixture_.s(); - - if (thermo_.composition().contains("O2")) + if (this->active()) { - const volScalarField& YO2 = thermo_.composition().Y("O2"); - wFuelNorm_ == rho_/(mesh_.time().deltaT()*C_)*min(YFuel, YO2/s.value()); - } -} - - -Foam::tmp<Foam::fvScalarMatrix> -Foam::combustionModels::infinitelyFastChemistry::R(volScalarField& Y) const -{ - const label specieI = thermo_.composition().species()[Y.name()]; - - const label fNorm = singleMixture_.specieProd()[specieI]; - - const volScalarField fres(singleMixture_.fres(specieI)); + this->singleMixture_.fresCorrect(); - const volScalarField wSpecie - ( - wFuelNorm_*singleMixture_.specieStoichCoeffs()[specieI] - / max(fNorm*(Y - fres), scalar(0.001)) - ); + const label fuelI = this->singleMixture_.fuelIndex(); - return -fNorm*wSpecie*fres + fNorm*fvm::Sp(wSpecie, Y); -} + const volScalarField& YFuel = this->thermo_->composition().Y()[fuelI]; + const dimensionedScalar s = this->singleMixture_.s(); -Foam::tmp<Foam::volScalarField> -Foam::combustionModels::infinitelyFastChemistry::dQ() const -{ - const label fuelI = singleMixture_.fuelIndex(); - volScalarField& YFuel = thermo_.composition().Y(fuelI); + if (this->thermo_->composition().contains("O2")) + { + const volScalarField& YO2 = this->thermo_->composition().Y("O2"); - return -singleMixture_.qFuel()*(R(YFuel) & YFuel); + this->wFuel_ == + this->rho()/(this->mesh().time().deltaT()*C_) + *min(YFuel, YO2/s.value()); + } + } } -Foam::tmp<Foam::volScalarField> -Foam::combustionModels::infinitelyFastChemistry::wFuelNorm() const +template<class CombThermoType, class ThermoType> +bool infinitelyFastChemistry<CombThermoType, ThermoType>::read() { - return wFuelNorm_; + if (singleStepCombustion<CombThermoType, ThermoType>::read()) + { + this->coeffs().lookup("C") >> C_ ; + return true; + } + else + { + return false; + } } -bool Foam::combustionModels::infinitelyFastChemistry::read -( - const dictionary& combustionProps -) -{ - combustionModel::read(combustionProps); - coeffs_.lookup("C") >> C_ ; - - return true; -} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +} // End namespace combustionModels +} // End namespace Foam -// ************************************************************************* // +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H index 304dba46a3bbae9c610588fd9890cb648cee7bf2..3293089a621c2a37b8ef6b1b60c24d2e6a3ad0ea 100644 --- a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H +++ b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -35,10 +35,7 @@ SourceFiles #ifndef infinitelyFastChemistry_H #define infinitelyFastChemistry_H - -#include "combustionModel.H" -#include "singleStepReactingMixture.H" -#include "thermoPhysicsTypes.H" +#include "singleStepCombustion.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -51,21 +48,16 @@ namespace combustionModels Class infinitelyFastChemistry Declaration \*---------------------------------------------------------------------------*/ +template<class CombThermoType, class ThermoType> class infinitelyFastChemistry : - public combustionModel + public singleStepCombustion <CombThermoType, ThermoType> { // Private data //- Model constant scalar C_; - //- Reference to singleStepReactingMixture mixture - singleStepReactingMixture<gasThermoPhysics>& singleMixture_; - - //- Normalised consumption rate of (fu - fres) - volScalarField wFuelNorm_; - // Private Member Functions @@ -87,11 +79,7 @@ public: //- Construct from components infinitelyFastChemistry ( - const dictionary& combustionProps, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho + const word& modelType, const fvMesh& mesh ); @@ -106,20 +94,11 @@ public: //- Correct combustion rate virtual void correct(); - //- Fuel consumption rate matrix, i.e. source term for fuel equation - virtual tmp<fvScalarMatrix> R(volScalarField& Y) const; - - //- Heat release rate calculated from fuel consumption rate matrix - virtual tmp<volScalarField> dQ() const; - - //- Return normalised consumption rate of (fu - fres) - virtual tmp<volScalarField> wFuelNorm() const; - // I-O - //- Update properties from given dictionary - virtual bool read(const dictionary& combustionProperties); + //- Update properties + virtual bool read(); }; @@ -128,6 +107,13 @@ public: } // End namespace combustionModels } // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "infinitelyFastChemistry.C" +#endif + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif diff --git a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistrys.C b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistrys.C new file mode 100644 index 0000000000000000000000000000000000000000..29315599f40643fa83c33ee35b8bd6b79103985e --- /dev/null +++ b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistrys.C @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "makeCombustionTypes.H" + +#include "thermoPhysicsTypes.H" +#include "psiCombustionModel.H" +#include "rhoCombustionModel.H" +#include "infinitelyFastChemistry.H" +#include "singleStepCombustion.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + + makeCombustionTypesThermo + ( + infinitelyFastChemistry, + psiCombustionModel, + gasThermoPhysics + ); + + makeCombustionTypesThermo + ( + infinitelyFastChemistry, + psiCombustionModel, + constGasThermoPhysics + ); + + makeCombustionTypesThermo + ( + infinitelyFastChemistry, + rhoCombustionModel, + gasThermoPhysics + ); +} +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.C b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.C new file mode 100644 index 0000000000000000000000000000000000000000..426d370b8f3ae599cd2b1e68e7739f5f0c73bb0b --- /dev/null +++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.C @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "psiChemistryCombustionModel.H" + +/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */ + +namespace Foam +{ +namespace combustionModels +{ + defineTypeNameAndDebug(psiChemistryCombustionModel, 0); + defineRunTimeSelectionTable(psiChemistryCombustionModel, dictionary); + + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +psiChemistryCombustionModel::psiChemistryCombustionModel +( + const word& modelType, + const fvMesh& mesh +) +: + combustionModel(modelType, mesh), + pChemistry_(psiChemistryModel::New(mesh)) +{} + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +psiChemistryCombustionModel::~psiChemistryCombustionModel() +{} + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +bool psiChemistryCombustionModel::read() +{ + if (combustionModel::read()) + { + return true; + } + else + { + return false; + } +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace combustionModels + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.H b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.H new file mode 100644 index 0000000000000000000000000000000000000000..e345904f1cdf4793242bbf3e41c313db6811c5c0 --- /dev/null +++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.H @@ -0,0 +1,160 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::psiChemistryCombustionModel + +Description + Combustion models for compressibility-based thermodynamics + +SourceFiles + psiChemistryCombustionModelI.H + psiChemistryCombustionModel.C + psiChemistryCombustionModelNew.C + +\*---------------------------------------------------------------------------*/ + +#ifndef psiChemistryCombustionModel_H +#define psiChemistryCombustionModel_H + +#include "combustionModel.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" +#include "psiChemistryModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + +/*---------------------------------------------------------------------------*\ + class psiChemistryCombustionModel Declaration +\*---------------------------------------------------------------------------*/ + +class psiChemistryCombustionModel +: + public combustionModel +{ + + // Private Member Functions + + //- Construct as copy (not implemented) + psiChemistryCombustionModel(const psiChemistryCombustionModel&); + + //- Disallow default bitwise assignment + void operator=(const psiChemistryCombustionModel&); + + +protected: + + // Protected data + + //- Auto pointer to psiChemistry + autoPtr<psiChemistryModel> pChemistry_; + + +public: + + //- Runtime type information + TypeName("psiChemistryCombustionModel"); + + + //- Declare run-time constructor selection tables + declareRunTimeSelectionTable + ( + autoPtr, + psiChemistryCombustionModel, + dictionary, + ( + const word& modelType, + const fvMesh& mesh + ), + (modelType, mesh) + ); + + + // Constructors + + + //- Construct from components and thermo + psiChemistryCombustionModel + ( + const word& modelType, + const fvMesh& mesh + ); + + + + //- Selector + static autoPtr<psiChemistryCombustionModel> New + ( + const fvMesh& mesh + ); + + + //- Destructor + virtual ~psiChemistryCombustionModel(); + + + // Member Functions + + + //- Return access to the thermo package + inline psiChemistryModel& pChemistry(); + + //- Return const access to the thermo package + inline const psiChemistryModel& pChemistry() const; + + //- Return const access to rho + inline tmp<volScalarField> rho() const; + + //- Return const access to rho + inline const hsCombustionThermo& thermo() const; + + //- Return non const access to rho + inline hsCombustionThermo& thermo(); + + + // I-O + + //- Update properties from given dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace combustionModels + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "psiChemistryCombustionModelI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelI.H b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelI.H new file mode 100644 index 0000000000000000000000000000000000000000..1a54dab2d26bb52ec7c227331df8850741a55ff0 --- /dev/null +++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelI.H @@ -0,0 +1,59 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline Foam::psiChemistryModel& +Foam::combustionModels::psiChemistryCombustionModel::pChemistry() +{ + return pChemistry_(); +} + +inline const Foam::psiChemistryModel& +Foam::combustionModels::psiChemistryCombustionModel:: +pChemistry() const +{ + return pChemistry_(); +} + +inline Foam::tmp<Foam::volScalarField> +Foam::combustionModels::psiChemistryCombustionModel::rho() const +{ + return pChemistry_->thermo().rho(); +} + +inline const Foam::hsCombustionThermo& +Foam::combustionModels::psiChemistryCombustionModel::thermo() const +{ + return pChemistry_->thermo(); +} + +inline Foam::hsCombustionThermo& +Foam::combustionModels::psiChemistryCombustionModel::thermo() +{ + return pChemistry_->thermo(); +} + +// ************************************************************************* // diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelNew.C b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelNew.C new file mode 100644 index 0000000000000000000000000000000000000000..64c60228d126d82d373e905a86fd1d48a5c84d52 --- /dev/null +++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelNew.C @@ -0,0 +1,78 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "psiChemistryCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::combustionModels::psiChemistryCombustionModel> +Foam::combustionModels::psiChemistryCombustionModel::New +( + const fvMesh& mesh +) +{ + const word combModelName + ( + IOdictionary + ( + IOobject + ( + "combustionProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ).lookup("combustionModel") + ); + + Info<< "Selecting combustion model " << combModelName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(combModelName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "psiChemistryCombustionModel::New" + ) << "Unknown psiChemistryCombustionModel type " + << combModelName << endl << endl + << "Valid combustionModels are : " << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + const label tempOpen = combModelName.find('<'); + + const word className = combModelName(0, tempOpen); + + return autoPtr<psiChemistryCombustionModel> + (cstrIter()(className, mesh)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModel.C b/src/combustionModels/psiCombustionModel/psiCombustionModel.C new file mode 100644 index 0000000000000000000000000000000000000000..76d52e45413158a337f54f0302cf0d2666af78df --- /dev/null +++ b/src/combustionModels/psiCombustionModel/psiCombustionModel.C @@ -0,0 +1,78 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "psiCombustionModel.H" + +/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */ + +namespace Foam +{ +namespace combustionModels +{ + defineTypeNameAndDebug(psiCombustionModel, 0); + defineRunTimeSelectionTable(psiCombustionModel, dictionary); +} +} + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + + +Foam::combustionModels::psiCombustionModel::psiCombustionModel +( + const word& modelType, + const fvMesh& mesh +) +: + combustionModel(modelType, mesh), + thermo_(hsCombustionThermo::New(mesh)) +{} + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::combustionModels::psiCombustionModel::~psiCombustionModel() +{} + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +bool Foam::combustionModels::psiCombustionModel::read() +{ + if (combustionModel::read()) + { + return true; + } + else + { + return false; + } +} + +Foam::tmp<Foam::volScalarField> +Foam::combustionModels::psiCombustionModel::rho() const +{ + return thermo_->rho(); +} + +// ************************************************************************* // diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModel.H b/src/combustionModels/psiCombustionModel/psiCombustionModel.H new file mode 100644 index 0000000000000000000000000000000000000000..aa1e26dac40fdd5c629f7ee88ed2fb6af1644a22 --- /dev/null +++ b/src/combustionModels/psiCombustionModel/psiCombustionModel.H @@ -0,0 +1,155 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::psiCombustionModel + +Description + Combustion models for compressibility-based thermodynamics + +SourceFiles + psiCombustionModelI.H + psiCombustionModel.C + psiCombustionModelNew.C + +\*---------------------------------------------------------------------------*/ + +#ifndef psiCombustionModel_H +#define psiCombustionModel_H + +#include "combustionModel.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" +#include "hsCombustionThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + +/*---------------------------------------------------------------------------*\ + class psiCombustionModel Declaration +\*---------------------------------------------------------------------------*/ + +class psiCombustionModel +: + public combustionModel +{ + + // Private Member Functions + + //- Construct as copy (not implemented) + psiCombustionModel(const psiCombustionModel&); + + //- Disallow default bitwise assignment + void operator=(const psiCombustionModel&); + + +protected: + + // Protected data + + + //- Thermo package + autoPtr<hsCombustionThermo> thermo_; + + + + +public: + + //- Runtime type information + TypeName("psiCombustionModel"); + + + //- Declare run-time constructor selection tables + declareRunTimeSelectionTable + ( + autoPtr, + psiCombustionModel, + dictionary, + ( + const word& modelType, + const fvMesh& mesh + ), + (modelType, mesh) + ); + + + // Constructors + + + //- Construct from components and thermo + psiCombustionModel + ( + const word& modelType, + const fvMesh& mesh + ); + + + + //- Selector + static autoPtr<psiCombustionModel> New + ( + const fvMesh& mesh + ); + + + //- Destructor + virtual ~psiCombustionModel(); + + + // Member Functions + + //- Return access to the thermo package + inline hsCombustionThermo& thermo(); + + //- Return const access to the thermo package + inline const hsCombustionThermo& thermo() const; + + //- Return tmp of rho + virtual tmp<volScalarField> rho() const; + + // I-O + + //- Update properties from given dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace combustionModels + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "psiCombustionModelI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModelI.H b/src/combustionModels/psiCombustionModel/psiCombustionModelI.H new file mode 100644 index 0000000000000000000000000000000000000000..f208d4ea29f6ad582f11f0d6fc95eef1679dbab0 --- /dev/null +++ b/src/combustionModels/psiCombustionModel/psiCombustionModelI.H @@ -0,0 +1,41 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline Foam::hsCombustionThermo& +Foam::combustionModels::psiCombustionModel::thermo() +{ + return thermo_(); +} + +inline const Foam::hsCombustionThermo& +Foam::combustionModels::psiCombustionModel::thermo() const +{ + return thermo_(); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModelNew.C b/src/combustionModels/psiCombustionModel/psiCombustionModelNew.C new file mode 100644 index 0000000000000000000000000000000000000000..28092b4a08972061043c44f8221fe3550a0575c5 --- /dev/null +++ b/src/combustionModels/psiCombustionModel/psiCombustionModelNew.C @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "psiCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::combustionModels::psiCombustionModel> +Foam::combustionModels::psiCombustionModel::New +( + const fvMesh& mesh +) +{ + const word combModelName + ( + IOdictionary + ( + IOobject + ( + "combustionProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ).lookup("combustionModel") + ); + + Info<< "Selecting combustion model " << combModelName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(combModelName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "psiCombustionModel::New" + ) << "Unknown psiCombustionModel type " + << combModelName << endl << endl + << "Valid combustionModels are : " << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + const label tempOpen = combModelName.find('<'); + + const word className = combModelName(0, tempOpen); + + return autoPtr<psiCombustionModel>(cstrIter()(className, mesh)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModels.C b/src/combustionModels/psiCombustionModel/psiCombustionModels.C new file mode 100644 index 0000000000000000000000000000000000000000..6bbbb255a7e0d962a67a811224dfdde15aa94cc5 --- /dev/null +++ b/src/combustionModels/psiCombustionModel/psiCombustionModels.C @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "makeCombustionTypes.H" + +#include "psiCombustionModel.H" +#include "PaSR.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + makeCombustionTypes + ( + infinitelyFastChemistry, + psiCombustionModel + ); +} +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.C b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.C new file mode 100644 index 0000000000000000000000000000000000000000..f427737c8ff901a5838d034585ed57183ef9e0d3 --- /dev/null +++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.C @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "rhoChemistryCombustionModel.H" + +/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */ + +namespace Foam +{ +namespace combustionModels +{ + defineTypeNameAndDebug(rhoChemistryCombustionModel, 0); + defineRunTimeSelectionTable(rhoChemistryCombustionModel, dictionary); + + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +rhoChemistryCombustionModel::rhoChemistryCombustionModel +( + const word& modelType, + const fvMesh& mesh +) +: + combustionModel(modelType, mesh), + pChemistry_(rhoChemistryModel::New(mesh)) +{} + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +rhoChemistryCombustionModel::~rhoChemistryCombustionModel() +{} + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +bool rhoChemistryCombustionModel::read() +{ + if (combustionModel::read()) + { + return true; + } + else + { + return false; + } +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace combustionModels + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.H b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.H new file mode 100644 index 0000000000000000000000000000000000000000..e288300e6df5038dcdf1f5f856f323b84c405d70 --- /dev/null +++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.H @@ -0,0 +1,160 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::rhoChemistryCombustionModel + +Description + Combustion models for compressibility-based thermodynamics + +SourceFiles + rhoChemistryCombustionModelI.H + rhoChemistryCombustionModel.C + rhoChemistryCombustionModelNew.C + +\*---------------------------------------------------------------------------*/ + +#ifndef rhoChemistryCombustionModel_H +#define rhoChemistryCombustionModel_H + +#include "combustionModel.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" +#include "rhoChemistryModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + +/*---------------------------------------------------------------------------*\ + class rhoChemistryCombustionModel Declaration +\*---------------------------------------------------------------------------*/ + +class rhoChemistryCombustionModel +: + public combustionModel +{ + + // Private Member Functions + + //- Construct as copy (not implemented) + rhoChemistryCombustionModel(const rhoChemistryCombustionModel&); + + //- Disallow default bitwise assignment + void operator=(const rhoChemistryCombustionModel&); + + +protected: + + // Protected data + + //- Auto pointer to psiChemistry + autoPtr<rhoChemistryModel> pChemistry_; + + +public: + + //- Runtime type information + TypeName("rhoChemistryCombustionModel"); + + + //- Declare run-time constructor selection tables + declareRunTimeSelectionTable + ( + autoPtr, + rhoChemistryCombustionModel, + dictionary, + ( + const word& modelType, + const fvMesh& mesh + ), + (modelType, mesh) + ); + + + // Constructors + + + //- Construct from components and thermo + rhoChemistryCombustionModel + ( + const word& modelType, + const fvMesh& mesh + ); + + + + //- Selector + static autoPtr<rhoChemistryCombustionModel> New + ( + const fvMesh& mesh + ); + + + //- Destructor + virtual ~rhoChemistryCombustionModel(); + + + // Member Functions + + + //- Return access to the thermo package + inline rhoChemistryModel& pChemistry(); + + //- Return const access to the thermo package + inline const rhoChemistryModel& pChemistry() const; + + //- Return const access to rho + inline tmp<volScalarField> rho() const; + + //- Return const access to rho + inline const hsReactionThermo& thermo() const; + + //- Return non const access to rho + inline hsReactionThermo& thermo(); + + + // I-O + + //- Update properties from given dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace combustionModels + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "rhoChemistryCombustionModelI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelI.H b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelI.H new file mode 100644 index 0000000000000000000000000000000000000000..93c8d2ea8daba3b4ed14b8d4bba9711bd41e6663 --- /dev/null +++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelI.H @@ -0,0 +1,59 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline Foam::rhoChemistryModel& +Foam::combustionModels::rhoChemistryCombustionModel::pChemistry() +{ + return pChemistry_(); +} + +inline const Foam::rhoChemistryModel& +Foam::combustionModels::rhoChemistryCombustionModel:: +pChemistry() const +{ + return pChemistry_(); +} + +inline Foam::tmp<Foam::volScalarField> +Foam::combustionModels::rhoChemistryCombustionModel::rho() const +{ + return pChemistry_->thermo().rho(); +} + +inline const Foam::hsReactionThermo& +Foam::combustionModels::rhoChemistryCombustionModel::thermo() const +{ + return pChemistry_->thermo(); +} + +inline Foam::hsReactionThermo& +Foam::combustionModels::rhoChemistryCombustionModel::thermo() +{ + return pChemistry_->thermo(); +} + +// ************************************************************************* // diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C new file mode 100644 index 0000000000000000000000000000000000000000..4df4146f29feb6e69f150990c1dd3958d10a691b --- /dev/null +++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C @@ -0,0 +1,78 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "rhoChemistryCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::combustionModels::rhoChemistryCombustionModel> +Foam::combustionModels::rhoChemistryCombustionModel::New +( + const fvMesh& mesh +) +{ + const word combModelName + ( + IOdictionary + ( + IOobject + ( + "combustionProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ).lookup("combustionModel") + ); + + Info<< "Selecting combustion model " << combModelName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(combModelName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "rhoChemistryCombustionModel::New" + ) << "Unknown rhoChemistryCombustionModel type " + << combModelName << endl << endl + << "Valid combustionModels are : " << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + const label tempOpen = combModelName.find('<'); + + const word className = combModelName(0, tempOpen); + + return autoPtr<rhoChemistryCombustionModel> + (cstrIter()(className, mesh)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/noCombustion/noCombustion.C b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.C similarity index 56% rename from src/combustionModels/noCombustion/noCombustion.C rename to src/combustionModels/rhoCombustionModel/rhoCombustionModel.C index 4fc8c7d0c905c11d21c05b7b396c6a3d6439864c..beaebe6aa07b81564540397faac73fa49ffece4b 100644 --- a/src/combustionModels/noCombustion/noCombustion.C +++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.C @@ -2,10 +2,11 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License + This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,45 +23,56 @@ License \*---------------------------------------------------------------------------*/ -#include "noCombustion.H" -#include "addToRunTimeSelectionTable.H" +#include "rhoCombustionModel.H" -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // +/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */ namespace Foam { namespace combustionModels { - defineTypeNameAndDebug(noCombustion, 0); - addToRunTimeSelectionTable - ( - combustionModel, - noCombustion, - dictionary - ); -}; -}; - + defineTypeNameAndDebug(rhoCombustionModel, 0); + defineRunTimeSelectionTable(rhoCombustionModel, dictionary); +} +} // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::combustionModels::noCombustion::noCombustion + +Foam::combustionModels::rhoCombustionModel::rhoCombustionModel ( - const dictionary& combustionProps, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho + const word& modelType, + const fvMesh& mesh ) : - combustionModel(combustionProps, thermo, turbulence, phi, rho) + combustionModel(modelType, mesh), + thermo_(hsReactionThermo::New(mesh)) {} +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // -// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // - -Foam::combustionModels::noCombustion::~noCombustion() +Foam::combustionModels::rhoCombustionModel::~rhoCombustionModel() {} +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> +Foam::combustionModels::rhoCombustionModel::rho() const +{ + return thermo_->rho(); +} + + +bool Foam::combustionModels::rhoCombustionModel::read() +{ + if (combustionModel::read()) + { + return true; + } + else + { + return false; + } +} // ************************************************************************* // diff --git a/src/combustionModels/rhoCombustionModel/rhoCombustionModel.H b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.H new file mode 100644 index 0000000000000000000000000000000000000000..58e499dc8a2f4af8424a2841b8d45e6b6aea546f --- /dev/null +++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.H @@ -0,0 +1,158 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::rhoCombustionModel + +Description + Combustion models for rho-based thermodynamics + +SourceFiles + rhoCombustionModelI.H + rhoCombustionModel.C + rhoCombustionModelNew.C + +\*---------------------------------------------------------------------------*/ + +#ifndef rhoCombustionModel_H +#define rhoCombustionModel_H + +#include "combustionModel.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" +#include "hsReactionThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + +/*---------------------------------------------------------------------------*\ + class rhoCombustionModel Declaration +\*---------------------------------------------------------------------------*/ + +class rhoCombustionModel +: + public combustionModel +{ + + // Private Member Functions + + //- Construct as copy (not implemented) + rhoCombustionModel(const rhoCombustionModel&); + + //- Disallow default bitwise assignment + void operator=(const rhoCombustionModel&); + + +protected: + + // Protected data + + //- Thermo package + autoPtr<hsReactionThermo> thermo_; + + +public: + + //- Runtime type information + TypeName("rhoCombustionModel"); + + + //- Declare run-time constructor selection tables + declareRunTimeSelectionTable + ( + autoPtr, + rhoCombustionModel, + dictionary, + ( + const word& modelType, + const fvMesh& mesh + ), + (modelType, mesh) + ); + + + // Constructors + + + //- Construct from components and thermo + rhoCombustionModel + ( + const word& modelType, + const fvMesh& mesh + ); + + + + //- Selector + static autoPtr<rhoCombustionModel> New + ( + const fvMesh& mesh + ); + + + //- Destructor + virtual ~rhoCombustionModel(); + + + // Member Functions + + // Access functions + + //- Access combustion dict + inline const dictionary& coeff() const; + + + //- Return access to the thermo package + inline hsReactionThermo& thermo(); + + //- Return const access to the thermo package + inline const hsReactionThermo& thermo() const; + + //- Return tmp of rho + virtual tmp<volScalarField> rho() const; + + // I-O + + //- Update properties from given dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace combustionModels + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "rhoCombustionModelI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/combustionModels/rhoCombustionModel/rhoCombustionModelI.H b/src/combustionModels/rhoCombustionModel/rhoCombustionModelI.H new file mode 100644 index 0000000000000000000000000000000000000000..23db3695c1d371a4ccb3181f41faf784115f029e --- /dev/null +++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModelI.H @@ -0,0 +1,41 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline Foam::hsReactionThermo& +Foam::combustionModels::rhoCombustionModel::thermo() +{ + return thermo_(); +} + +inline const Foam::hsReactionThermo& +Foam::combustionModels::rhoCombustionModel::thermo() const +{ + return thermo_(); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/rhoCombustionModel/rhoCombustionModelNew.C b/src/combustionModels/rhoCombustionModel/rhoCombustionModelNew.C new file mode 100644 index 0000000000000000000000000000000000000000..5496f689253ad653eb607a8505ce1a4869aca775 --- /dev/null +++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModelNew.C @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "rhoCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::combustionModels::rhoCombustionModel> +Foam::combustionModels::rhoCombustionModel::New +( + const fvMesh& mesh +) +{ + const word combTypeName + ( + IOdictionary + ( + IOobject + ( + "combustionProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ).lookup("combustionModel") + ); + + Info<< "Selecting combustion model " << combTypeName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(combTypeName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "rhoCombustionModel::New" + ) << "Unknown rhoCombustionModel type " + << combTypeName << endl << endl + << "Valid combustionModels are : " << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + const label tempOpen = combTypeName.find('<'); + + const word className = combTypeName(0, tempOpen); + + return autoPtr<rhoCombustionModel> (cstrIter()(className, mesh)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/singleStepCombustion/singleStepCombustion.C b/src/combustionModels/singleStepCombustion/singleStepCombustion.C new file mode 100644 index 0000000000000000000000000000000000000000..b7ff05fb969e26ce0704340b58625f8a8b80b1e4 --- /dev/null +++ b/src/combustionModels/singleStepCombustion/singleStepCombustion.C @@ -0,0 +1,159 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "singleStepCombustion.H" +#include "fvmSup.H" + +namespace Foam +{ +namespace combustionModels +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class CombThermoType, class ThermoType> +singleStepCombustion<CombThermoType, ThermoType> +::singleStepCombustion +( + const word& modelType, const fvMesh& mesh +) +: + CombThermoType(modelType, mesh), + singleMixture_ + ( + dynamic_cast<singleStepReactingMixture<ThermoType>&>(this->thermo()) + ), + wFuel_ + ( + IOobject + ( + "wFuel", + this->mesh().time().timeName(), + this->mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + this->mesh(), + dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0) + ) +{} + + +// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // + +template<class CombThermoType, class ThermoType> +singleStepCombustion<CombThermoType, ThermoType> +::~singleStepCombustion() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +template<class CombThermoType, class ThermoType> +Foam::tmp<Foam::fvScalarMatrix> +singleStepCombustion<CombThermoType, ThermoType>::R +( + const volScalarField& Y +) const +{ + const label specieI = this->thermo_->composition().species()[Y.name()]; + + const label fNorm = singleMixture_.specieProd()[specieI]; + + const volScalarField fres(singleMixture_.fres(specieI)); + + const volScalarField wSpecie + ( + wFuel_*singleMixture_.specieStoichCoeffs()[specieI] + / max(fNorm*(Y - fres), scalar(0.001)) + ); + + return -fNorm*wSpecie*fres + fNorm*fvm::Sp(wSpecie, Y); +} + + +template<class CombThermoType, class ThermoType> +Foam::tmp<Foam::volScalarField> +singleStepCombustion< CombThermoType, ThermoType>::Sh() const +{ + const label fuelI = singleMixture_.fuelIndex(); + const volScalarField& YFuel = this->thermo_->composition().Y(fuelI); + + return -singleMixture_.qFuel()*(R(YFuel) & YFuel); +} + + +template<class CombThermoType, class ThermoType> +Foam::tmp<Foam::volScalarField> +singleStepCombustion< CombThermoType, ThermoType>::dQ() const +{ + tmp<volScalarField> tdQ + ( + new volScalarField + ( + IOobject + ( + "dQ", + this->mesh_.time().timeName(), + this->mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + this->mesh_, + dimensionedScalar("dQ", dimEnergy/dimTime, 0.0), + zeroGradientFvPatchScalarField::typeName + ) + ); + + if (this->active()) + { + volScalarField& dQ = tdQ(); + dQ.dimensionedInternalField() = this->mesh().V()*Sh()(); + } + return tdQ; +} + + +template<class CombThermoType, class ThermoType> +bool singleStepCombustion< CombThermoType, ThermoType>::read() +{ + if (CombThermoType::read()) + { + return true; + } + else + { + return false; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace combustionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/singleStepCombustion/singleStepCombustion.H b/src/combustionModels/singleStepCombustion/singleStepCombustion.H new file mode 100644 index 0000000000000000000000000000000000000000..32c4f952fcc835d4d5b8dc81c49965dcd50be151 --- /dev/null +++ b/src/combustionModels/singleStepCombustion/singleStepCombustion.H @@ -0,0 +1,132 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::combustionModels::singleStepCombustion + +Description + Base class for combustion models using singleStepReactingMixture. + +SourceFiles + singleStepCombustion.C + +\*---------------------------------------------------------------------------*/ + +#ifndef singleStepCombustion_H +#define singleStepCombustion_H + +#include "singleStepReactingMixture.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace combustionModels +{ + +/*---------------------------------------------------------------------------*\ + Class singleStepCombustion Declaration +\*---------------------------------------------------------------------------*/ + +template<class CombThermoType, class ThermoType> +class singleStepCombustion +: + public CombThermoType +{ + +protected: + + // Protected data + + //- Reference to singleStepReactingMixture mixture + singleStepReactingMixture<ThermoType>& singleMixture_; + + //- Fuel consumption rate + volScalarField wFuel_; + + +private: + + // Private Member Functions + + //- Disallow copy construct + singleStepCombustion(const singleStepCombustion&); + + //- Disallow default bitwise assignment + void operator=(const singleStepCombustion&); + + +public: + + + // Constructors + + //- Construct from components + singleStepCombustion + ( + const word& modelType, const fvMesh& mesh + ); + + + //- Destructor + virtual ~singleStepCombustion(); + + + // Member Functions + + // Evolution + + + //- Fuel consumption rate matrix + virtual tmp<fvScalarMatrix> R(const volScalarField& Y) const; + + //- Heat release rate calculated from fuel consumption rate matrix + virtual tmp<volScalarField> dQ() const; + + //- Sensible enthalpy source term + virtual tmp<volScalarField> Sh() const; + + + // I-O + + //- Update properties from given dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace combustionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#ifdef NoRepository +# include "singleStepCombustion.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties b/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties index 8d6965f6b7137d7af9be749b3e7f1268cdc0f1c8..6608c94f4e4babd2c006cc9a384465d16ae7dab8 100644 --- a/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties +++ b/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties @@ -15,15 +15,16 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -Cmix Cmix [ 0 0 0 0 0 0 0 ] 1; +combustionModel PaSR<psiChemistryCombustionModel>; -ignitionProperties1 +active true; + +PaSRCoeffs { - ignite on; - ignitionPoint ignitionPoint [ 0 1 0 0 0 0 0 ] ( 0.2 0 0.02 ); - timing timing [ 0 0 1 0 0 0 0 ] 0; - duration duration [ 0 0 1 0 0 0 0 ] 1; + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1; + turbulentReaction on; } + // ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties index c6378c0612e0b1e1bfd5f9f4ddcbbf9a3b723e70..95bc43ae376973e90796296d208b2bf01ce6296c 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties +++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties @@ -15,7 +15,9 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel infinitelyFastChemistry; +combustionModel infinitelyFastChemistry<psiCombustionModel,gasThermoPhysics>; + +active true; infinitelyFastChemistryCoeffs { diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/panelRegion/cellDecomposition b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/panelRegion/cellDecomposition deleted file mode 100644 index 07dc8690bb106cb53695b765b617e1eb8a5d167a..0000000000000000000000000000000000000000 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/panelRegion/cellDecomposition +++ /dev/null @@ -1,34104 +0,0 @@ -/*--------------------------------*- C++ -*----------------------------------*\ -| ========= | | -| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: dev | -| \\ / A nd | Web: www.OpenFOAM.com | -| \\/ M anipulation | | -\*---------------------------------------------------------------------------*/ -FoamFile -{ - version 2.0; - format ascii; - class labelList; - location "constant"; - object cellDecomposition; -} -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - - -34080 -( -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -4 -4 -4 -4 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -) - - -// ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties index 51f63787132188da77d2b98b5a414d3e735c5c7b..aeb4fd4cf46eba93ea16a2fdca7ea1c34627e762 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties @@ -15,16 +15,44 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel infinitelyFastChemistry; +//combustionModel infinitelyFastChemistry<psiCombustionModel,gasThermoPhysics>; +combustionModel FSD<psiCombustionModel,gasThermoPhysics>; + +active true; infinitelyFastChemistryCoeffs { - C 10.0; + C 5.0; } -noCombustionCoeffs +FSDCoeffs { -} + Cv 0.1; + ftVarMin 1e-2; + + reactionRateFlameArea relaxation; + fuel Methane; + + relaxationCoeffs + { + C 2.0; + alpha 1.0; + Methane + { + omega0 0.5; + eta -0.013; + omegaMin 0.01; + sigmaExt 470; + } + Propane + { + omega0 0.4; + eta -0.00656; + omegaMin 0.01; + sigmaExt 450; + } + } +} // ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions index c174cf789ecfdfbaf6128592efbd6123e013f690..67f2373c382e5477caeeada95dc46a061ee97423 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions @@ -12,6 +12,6 @@ reactions propaneReaction { type irreversibleinfiniteReaction; - reaction "CH4 + 2O2 = CO2 + 2H2O"; + reaction "CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2"; } } diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties index de54b0bbc10176c603037ff2d6c9908ea9574c72..f528cf3e1284a4d12698c3738dc91aca7b597747 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties +++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties @@ -16,16 +16,14 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel infinitelyFastChemistry; +//combustionModel infinitelyFastChemistry<psiCombustionModel,gasThermoPhysics>; + +active on; infinitelyFastChemistryCoeffs { C 5.0; } -noCombustionCoeffs -{ -} - // ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions index c174cf789ecfdfbaf6128592efbd6123e013f690..3c6e45a0d6883fd69019f831ae3758bda192e5c3 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions +++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions @@ -12,6 +12,6 @@ reactions propaneReaction { type irreversibleinfiniteReaction; - reaction "CH4 + 2O2 = CO2 + 2H2O"; + reaction "CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2"; } } diff --git a/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties index 14d3f4ab0aed2d7816a2e3baaad052eb4c175361..80cafe049a753c2deb2d47be3999ac1ed8970156 100644 --- a/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties +++ b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties @@ -23,8 +23,6 @@ chemistrySolver ode; initialChemicalTimeStep 1e-07; -turbulentReaction on; - sequentialCoeffs { cTauChem 0.001; @@ -43,6 +41,4 @@ odeCoeffs scale 1; } -Cmix Cmix [ 0 0 0 0 0 0 0 ] 0.1; - // ************************************************************************* // diff --git a/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/combustionProperties b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/combustionProperties new file mode 100644 index 0000000000000000000000000000000000000000..cd5f6c35e1cc7835b9797a391cae0190c8e071f8 --- /dev/null +++ b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/combustionProperties @@ -0,0 +1,34 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object combustionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +combustionModel PaSR<psiChemistryCombustionModel>; + +active true; + +infinitelyFastChemistryCoeffs +{ + C 10.0; +} + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 0.1; + turbulentReaction on; +} + + +// ************************************************************************* // diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties index 67ea1f828dfb41dd86a79bd54ab9986f09dd1d90..5f0483df1b9ad7fc60e590bb1ab9f0681c9d8090 100644 --- a/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties +++ b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties @@ -25,8 +25,4 @@ chemCalcFreq 1; initialChemicalTimeStep 1e-8; // NOT USED -Cmix Cmix [ 0 0 0 0 0 0 0 ] 0.1; - -turbulentReaction on; - // ************************************************************************* // diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/combustionProperties b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/combustionProperties new file mode 100644 index 0000000000000000000000000000000000000000..a07f7b12b79a51be9ece8b6e6e9d349c2a211817 --- /dev/null +++ b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/combustionProperties @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object combustionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +combustionModel PaSR<rhoChemistryCombustionModel>; + +active true; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 0.1; + turbulentReaction on; + useReactionRate true; +} + + +// ************************************************************************* // diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties index 1c723e893176e751b44432dea6fc22bad07827da..69f6f932345866f38fb1c8cdfbbb2fa78fb4cfeb 100644 --- a/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties +++ b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties @@ -19,9 +19,6 @@ rhoChemistryModel ODEChemistryModel<icoPoly8ThermoPhysics>; chemistry off; - -turbulentReaction off; - chemistrySolver noChemistrySolver; initialChemicalTimeStep 1e-07; // NOT USED diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/combustionProperties b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/combustionProperties new file mode 100644 index 0000000000000000000000000000000000000000..7b938bb47730a20ae9b66cd5422cbe6e862609cf --- /dev/null +++ b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/combustionProperties @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object combustionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +combustionModel PaSR<rhoChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 0.1; + turbulentReaction off; + useReactionRate true; +} + + +// ************************************************************************* // diff --git a/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties index fd54b847684388b2766bb421f6dc35976272347b..cbce99c7700fc9c29edaac6bbbf3abf5466a31ee 100644 --- a/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties +++ b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>; chemistry on; -turbulentReaction on; - chemistrySolver ode; initialChemicalTimeStep 1e-07; @@ -44,7 +42,5 @@ odeCoeffs scale 1; } -Cmix Cmix [ 0 0 0 0 0 0 0 ] 1; - // ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/chemistryProperties b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties similarity index 80% rename from tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/chemistryProperties rename to tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..83adafa2d4f605b12f8e21011b9712722d728973 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/chemistryProperties +++ b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties @@ -11,19 +11,20 @@ FoamFile format ascii; class dictionary; location "constant"; - object chemistryProperties; + object combustionProperties; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -psiChemistryModel ODEChemistryModel<gasThermoPhysics>; +combustionModel PaSR<psiChemistryCombustionModel>; -chemistry off; +active true; -turbulentReaction off; -chemistrySolver noChemistrySolver; - -initialChemicalTimeStep 1e-07; +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction on; +} // ************************************************************************* // diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties index d332d6144c4dff6be5f1143fb899738a8dff8c1b..8bc89b0f589a6790ba4e9c781908a2ebeffea12f 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties @@ -19,8 +19,6 @@ rhoChemistryModel ODEChemistryModel<icoPoly8ThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver ode; initialChemicalTimeStep 1e-07; @@ -44,7 +42,5 @@ odeCoeffs scale 1; } -Cmix Cmix [ 0 0 0 0 0 0 0 ] 1; - // ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties similarity index 80% rename from tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties rename to tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..dc51ca05f7392d872afc49f249abb0ca0f16536a 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties @@ -11,19 +11,19 @@ FoamFile format ascii; class dictionary; location "constant"; - object chemistryProperties; + object combustionProperties; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -psiChemistryModel ODEChemistryModel<gasThermoPhysics>; +combustionModel PaSR<rhoChemistryCombustionModel>; -chemistry off; +active false; -turbulentReaction off; - -chemistrySolver noChemistrySolver; - -initialChemicalTimeStep 1e-07; +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} // ************************************************************************* // diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties index d332d6144c4dff6be5f1143fb899738a8dff8c1b..8bc89b0f589a6790ba4e9c781908a2ebeffea12f 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties @@ -19,8 +19,6 @@ rhoChemistryModel ODEChemistryModel<icoPoly8ThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver ode; initialChemicalTimeStep 1e-07; @@ -44,7 +42,5 @@ odeCoeffs scale 1; } -Cmix Cmix [ 0 0 0 0 0 0 0 ] 1; - // ************************************************************************* // diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/combustionProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/combustionProperties new file mode 100644 index 0000000000000000000000000000000000000000..dc51ca05f7392d872afc49f249abb0ca0f16536a --- /dev/null +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/combustionProperties @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object combustionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +combustionModel PaSR<rhoChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} + + +// ************************************************************************* // diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties index d332d6144c4dff6be5f1143fb899738a8dff8c1b..8bc89b0f589a6790ba4e9c781908a2ebeffea12f 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties @@ -19,8 +19,6 @@ rhoChemistryModel ODEChemistryModel<icoPoly8ThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver ode; initialChemicalTimeStep 1e-07; @@ -44,7 +42,5 @@ odeCoeffs scale 1; } -Cmix Cmix [ 0 0 0 0 0 0 0 ] 1; - // ************************************************************************* // diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/combustionProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/combustionProperties new file mode 100644 index 0000000000000000000000000000000000000000..dc51ca05f7392d872afc49f249abb0ca0f16536a --- /dev/null +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/combustionProperties @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object combustionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +combustionModel PaSR<rhoChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} + + +// ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver noChemistrySolver; initialChemicalTimeStep 1e-07; diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties index 4d6e2a96b0030adb10594884242240aff3cc76b9..86e6e0388b3899e36d707e8efa38e29b459abe86 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR<psiChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction on; +} // ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver noChemistrySolver; initialChemicalTimeStep 1e-07; diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties index 4d6e2a96b0030adb10594884242240aff3cc76b9..7c6acfaadd0776258477a4db18a228fc7a9fdfd3 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR<psiChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} // ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver noChemistrySolver; initialChemicalTimeStep 1e-07; diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties index 4d6e2a96b0030adb10594884242240aff3cc76b9..7c6acfaadd0776258477a4db18a228fc7a9fdfd3 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR<psiChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} // ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver noChemistrySolver; initialChemicalTimeStep 1e-07; diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties index 4d6e2a96b0030adb10594884242240aff3cc76b9..7c6acfaadd0776258477a4db18a228fc7a9fdfd3 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR<psiChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} // ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties index 462583d3e25646bed8bb64009d7ca0ecd4238419..4a82f1bffdd2d91a77acb5a93741cc953b515bc2 100644 --- a/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>; chemistry off; -turbulentReaction off; - chemistrySolver ode; initialChemicalTimeStep 1e-07; @@ -43,7 +41,5 @@ odeCoeffs scale 1; } -Cmix Cmix [ 0 0 0 0 0 0 0 ] 1; - // ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/combustionProperties new file mode 100644 index 0000000000000000000000000000000000000000..7c6acfaadd0776258477a4db18a228fc7a9fdfd3 --- /dev/null +++ b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/combustionProperties @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object combustionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +combustionModel PaSR<psiChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} + + +// ************************************************************************* // diff --git a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties index 5612988231f268a3913dd7d6053b17a8ffbe2d8b..82a5c663e00184008f60f5fe603f560c4a4c0bf4 100644 --- a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties +++ b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties @@ -23,10 +23,6 @@ chemistrySolver ode; initialChemicalTimeStep 1e-07; -turbulentReaction yes; - -Cmix Cmix [0 0 0 0 0] 1; - odeCoeffs { solver SIBS; diff --git a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/combustionProperties b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/combustionProperties new file mode 100644 index 0000000000000000000000000000000000000000..abba13a97fd68fe6a8b6e9ab4eb9346454676a6a --- /dev/null +++ b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/combustionProperties @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object combustionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +combustionModel PaSR<psiChemistryCombustionModel>; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction yes; +} + + +// ************************************************************************* //