diff --git a/applications/solvers/combustion/dieselEngineFoam/Make/options b/applications/solvers/combustion/dieselEngineFoam/Make/options index c4d65fa137..8fdb0c5c33 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 b8d39b4f46..46d0f364e6 100644 --- a/applications/solvers/combustion/dieselEngineFoam/YEqn.H +++ b/applications/solvers/combustion/dieselEngineFoam/YEqn.H @@ -10,7 +10,8 @@ tmp > mvConvection ); { - + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -20,17 +21,19 @@ tmp > 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 4bd9f1a916..bbb9000943 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 pChemistry +autoPtr 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 turbulence ( @@ -81,6 +71,9 @@ autoPtr 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 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 94ab928999..807051318f 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 7ae59feb81..7c0b7f9dc3 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 84cf9b9756..0000000000 --- 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 124371575d..4083a59e9f 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 7fd7410247..45ee55195c 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 aed41a4431..299eb64ab7 100644 --- a/applications/solvers/combustion/fireFoam/YhsEqn.H +++ b/applications/solvers/combustion/fireFoam/YhsEqn.H @@ -20,7 +20,6 @@ tmp > mvConvection if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; - fvScalarMatrix R(combustion->R(Yi)); fvScalarMatrix YiEqn ( @@ -30,7 +29,7 @@ tmp > mvConvection == parcels.SYi(i, Yi) + surfaceFilm.Srho(i) - + R + + combustion->R(Yi) ); YiEqn.relax(); @@ -55,7 +54,7 @@ tmp > mvConvection - fvm::laplacian(turbulence->alphaEff(), hs) == DpDt - + dQ + + combustion->Sh() + radiation->Shs(thermo) + parcels.Sh(hs) + surfaceFilm.Sh() @@ -66,5 +65,6 @@ tmp > 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 f1e152dc32..afabd393c7 100644 --- a/applications/solvers/combustion/fireFoam/createFields.H +++ b/applications/solvers/combustion/fireFoam/createFields.H @@ -1,10 +1,16 @@ + Info<< "Creating combustion model\n" << endl; + + autoPtr combustion + ( + combustionModels::psiCombustionModel::New + ( + mesh + ) + ); + Info<< "Reading thermophysical properties\n" << endl; - autoPtr pThermo - ( - hsCombustionThermo::New(mesh) - ); - hsCombustionThermo& thermo = pThermo(); + 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 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 7c58a722d1..89968c6e58 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 f0bcf7597f..0000000000 --- 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 6386af8c55..8eb6d4cabd 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 8d63a12868..87b25079ff 100644 --- a/applications/solvers/combustion/reactingFoam/YEqn.H +++ b/applications/solvers/combustion/reactingFoam/YEqn.H @@ -10,6 +10,8 @@ tmp > mvConvection ); { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,16 +21,18 @@ tmp > 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 99f418af6f..0000000000 --- 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 tepsilon(turbulence->epsilon()); - const volScalarField& epsilon = tepsilon(); - tmp tmuEff(turbulence->muEff()); - const volScalarField& muEff = tmuEff(); - tmp 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 a2f016e046..7cf94f754d 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 pChemistry +Info<< "Creating combustion model\n" << endl; + +autoPtr 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 turbulence ( @@ -71,6 +62,9 @@ autoPtr 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 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 e3fa4e7a13..de1a85fddf 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 ca156c3f7f..75fb9ad71d 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 f0bcf7597f..0000000000 --- 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 d6306816fd..5a5df2ed7b 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 8d63a12868..3a371f035c 100644 --- a/applications/solvers/combustion/rhoReactingFoam/YEqn.H +++ b/applications/solvers/combustion/rhoReactingFoam/YEqn.H @@ -10,6 +10,8 @@ tmp > mvConvection ); { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,14 +21,13 @@ tmp > 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 d58e082f5b..65860a67eb 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 pChemistry +Info<< "Creating combustion model\n" << endl; + +autoPtr 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 turbulence @@ -72,6 +64,9 @@ autoPtr 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 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 81bd6ea9d7..01f85ac1da 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 f0bcf7597f..0000000000 --- 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 9c22e63c51..afa7d9771d 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 a9da394140..9f2955bc2f 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 91ee4a594d..36e9c44270 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 c941691d66..625c940a66 100644 --- a/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H +++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H @@ -9,6 +9,9 @@ tmp > 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 103ead9d78..f1f6173cd6 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 pChemistry + autoPtr 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 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::fieldTable fields; @@ -102,20 +95,21 @@ } fields.add(hs); - DimensionedField 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 5954b1217e..55bf1d6dd0 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 e742e9fea7..0000000000 --- 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 e6d0fa85c4..05fe8a1c77 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 f2f8d1e758..e8a8718373 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 be82d6e2b6..e9bd1c6581 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H +++ b/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H @@ -11,6 +11,8 @@ tmp > mvConvection { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,16 +21,20 @@ tmp > 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 3d0eabcef8..1e6daed0fd 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 97e409215c..4d0a2b7408 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 pChemistry + autoPtr 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 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 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 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 e6901a9c6f..9a4665accd 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 f0bcf7597f..0000000000 --- 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 f2dffe2998..1abdd72178 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 53c6b25d81..5ef4aaa3a3 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H @@ -10,6 +10,8 @@ tmp > 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 22d7c1f219..ab6b01f9ce 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 pChemistry + autoPtr 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 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 turbulence ( @@ -83,6 +73,9 @@ ) ); + // Set the turbulence into the combustion model + combustion->setTurbulence(turbulence()); + Info<< "Creating multi-variate interpolation scheme\n" << endl; multivariateSurfaceInterpolationScheme::fieldTable fields; @@ -92,16 +85,16 @@ } fields.add(hs); - DimensionedField 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 58e0b69943..0e2c61a9ff 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 638d83da0c..e077836709 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 f0bcf7597f..0000000000 --- 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 6e225cc092..3f762b6bd0 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 db79376614..4fad16b57d 100644 --- a/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H +++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H @@ -11,6 +11,8 @@ tmp > mvConvection { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,6 +21,7 @@ tmp > mvConvection if (Y[i].name() != inertSpecie) { volScalarField& Yi = Y[i]; + solve ( fvm::ddt(rho, Yi) @@ -27,7 +30,7 @@ tmp > 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 e2db33f1f7..999515f430 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 pChemistry + autoPtr 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 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 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 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 feb112f652..79c5e1c5b3 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 6ae930c7a7..ea8e9e6e5b 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 f0bcf7597f..0000000000 --- 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 fc312bb5fa..e406727104 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 a180973321..78bbe14bbf 100644 --- a/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H +++ b/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H @@ -11,6 +11,8 @@ tmp > mvConvection { + combustion->correct(); + dQ = combustion->dQ(); label inertIndex = -1; volScalarField Yt(0.0*Y[0]); @@ -19,17 +21,20 @@ tmp > 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 089489a014..c318498d94 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 pChemistry + autoPtr 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 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 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 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 7821d340d4..f7499813c7 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 ae2a06a363..0d00af9c2a 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 f0bcf7597f..0000000000 --- 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 ff504df32f..f4c66f06f9 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 99f418af6f..0000000000 --- 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 tepsilon(turbulence->epsilon()); - const volScalarField& epsilon = tepsilon(); - tmp tmuEff(turbulence->muEff()); - const volScalarField& muEff = tmuEff(); - tmp 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 5252fd3cf3..d1f70654ea 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/applications/solvers/multiphase/interMixingFoam/incompressibleThreePhaseMixture/threePhaseMixture.C b/applications/solvers/multiphase/interMixingFoam/incompressibleThreePhaseMixture/threePhaseMixture.C index 5edf003719..1bf6e435a1 100644 --- a/applications/solvers/multiphase/interMixingFoam/incompressibleThreePhaseMixture/threePhaseMixture.C +++ b/applications/solvers/multiphase/interMixingFoam/incompressibleThreePhaseMixture/threePhaseMixture.C @@ -21,9 +21,6 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . -Class - threePhaseMixture - \*---------------------------------------------------------------------------*/ #include "threePhaseMixture.H" diff --git a/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C b/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C index 2f90994c9c..8cd16cffbd 100644 --- a/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C +++ b/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -21,9 +21,6 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . -Class - meshDualiser - \*---------------------------------------------------------------------------*/ #include "meshDualiser.H" diff --git a/applications/utilities/mesh/manipulation/setSet/writeFuns.H b/applications/utilities/mesh/manipulation/setSet/writeFuns.H index 1b9aef4f8e..de5f7a1c44 100644 --- a/applications/utilities/mesh/manipulation/setSet/writeFuns.H +++ b/applications/utilities/mesh/manipulation/setSet/writeFuns.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,18 +22,18 @@ License along with OpenFOAM. If not, see . Class - Foam::writeFunctions + Foam::writeFuns Description Various functions for collecting and writing binary data. SourceFiles - writeFunctions.C + writeFuns.C \*---------------------------------------------------------------------------*/ -#ifndef writeFunctions_H -#define writeFunctions_H +#ifndef writeFuns_H +#define writeFuns_H #include "labelList.H" #include "floatScalar.H" diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/writeFuns.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/writeFuns.H index ecd7225ee5..fd7980ec28 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToVTK/writeFuns.H +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/writeFuns.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,18 +22,18 @@ License along with OpenFOAM. If not, see . Class - Foam::writeFunctions + Foam::writeFuns Description Various functions for collecting and writing binary data. SourceFiles - writeFunctions.C + writeFuns.C \*---------------------------------------------------------------------------*/ -#ifndef writeFunctions_H -#define writeFunctions_H +#ifndef writeFuns_H +#define writeFuns_H #include "floatScalar.H" #include "DynamicList.H" diff --git a/bin/paraFoam b/bin/paraFoam index 08ef45e952..6092623b00 100755 --- a/bin/paraFoam +++ b/bin/paraFoam @@ -70,6 +70,8 @@ export LC_ALL=C # reader extension extension=OpenFOAM +requirePV=1 + # parse options while [ "$#" -gt 0 ] do @@ -97,10 +99,12 @@ do ;; -touch) optTouch=true + requirePV=0 shift ;; -touchAll) optTouch=all + requirePV=0 shift ;; --) @@ -120,7 +124,7 @@ done # # check that reader module has been built # -if [ ! -f $PV_PLUGIN_PATH/libPV3FoamReader_SM.so ] +if [ $requirePV -eq 1 -a ! -f $PV_PLUGIN_PATH/libPV3FoamReader_SM.so ] then cat<< BUILDREADER diff --git a/etc/config/settings.csh b/etc/config/settings.csh index 2ec4117a2b..d153e4216f 100644 --- a/etc/config/settings.csh +++ b/etc/config/settings.csh @@ -209,10 +209,10 @@ case ThirdParty: breaksw case Gcc46: case Gcc46++0x: - set gcc_version=gcc-4.6.0 - set gmp_version=gmp-5.0.1 - set mpfr_version=mpfr-2.4.2 - set mpc_version=mpc-0.8.1 + set gcc_version=gcc-4.6.1 + set gmp_version=gmp-5.0.2 + set mpfr_version=mpfr-3.0.1 + set mpc_version=mpc-0.9 breaksw case Gcc45: case Gcc45++0x: diff --git a/etc/config/settings.sh b/etc/config/settings.sh index 057709d316..bc87934f5b 100644 --- a/etc/config/settings.sh +++ b/etc/config/settings.sh @@ -228,10 +228,11 @@ OpenFOAM | ThirdParty) mpfr_version=mpfr-2.4.2 ;; Gcc46 | Gcc46++0x) - gcc_version=gcc-4.6.0 - gmp_version=gmp-5.0.1 - mpfr_version=mpfr-2.4.2 - mpc_version=mpc-0.8.1 + gcc_version=gcc-4.6.1 + gmp_version=gmp-5.0.2 + mpfr_version=mpfr-3.0.1 + mpc_version=mpc-0.9 + gmpPACKAGE=gmp-5.0.2 ;; Gcc45 | Gcc45++0x) gcc_version=gcc-4.5.2 diff --git a/src/OSspecific/POSIX/fileMonitor.C b/src/OSspecific/POSIX/fileMonitor.C index cb0e8be4d7..cdf40208a4 100644 --- a/src/OSspecific/POSIX/fileMonitor.C +++ b/src/OSspecific/POSIX/fileMonitor.C @@ -21,9 +21,6 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . -Class - fileMonitor - \*----------------------------------------------------------------------------*/ #include "fileMonitor.H" diff --git a/src/OpenFOAM/db/error/StaticAssert.H b/src/OpenFOAM/db/error/StaticAssert.H index beab97f85d..5d209d3f93 100644 --- a/src/OpenFOAM/db/error/StaticAssert.H +++ b/src/OpenFOAM/db/error/StaticAssert.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::StaticAssertFailed + Foam::StaticAssertionFailed Description Macros and classes to provide static (compile-time) assertions. diff --git a/src/OpenFOAM/fields/GeometricFields/geometricOneField/geometricOneField.H b/src/OpenFOAM/fields/GeometricFields/geometricOneField/geometricOneField.H index 76b096cb1e..ff2a76025a 100644 --- a/src/OpenFOAM/fields/GeometricFields/geometricOneField/geometricOneField.H +++ b/src/OpenFOAM/fields/GeometricFields/geometricOneField/geometricOneField.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::GeometricField + Foam::geometricOneField Description A class representing the concept of a GeometricField of 1 used to avoid diff --git a/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H b/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H index ec7c6ff48a..c42891a7fa 100644 --- a/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H +++ b/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::GeometricField + Foam::geometricZeroField Description A class representing the concept of a GeometricField of 1 used to avoid diff --git a/src/OpenFOAM/interpolations/interpolationTable/tableReaders/tableReaders.H b/src/OpenFOAM/interpolations/interpolationTable/tableReaders/tableReaders.H index 8e1c8a0561..0a9aae4cd5 100644 --- a/src/OpenFOAM/interpolations/interpolationTable/tableReaders/tableReaders.H +++ b/src/OpenFOAM/interpolations/interpolationTable/tableReaders/tableReaders.H @@ -21,9 +21,6 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . -Class - Foam::tableReader - SourceFiles tableReaders.C diff --git a/src/OpenFOAM/meshes/polyMesh/zones/zone/zone.H b/src/OpenFOAM/meshes/polyMesh/zones/zone/zone.H index 4f02043dab..1ee3d72ee9 100644 --- a/src/OpenFOAM/meshes/polyMesh/zones/zone/zone.H +++ b/src/OpenFOAM/meshes/polyMesh/zones/zone/zone.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::cellZone + Foam::zone Description Base class for zones diff --git a/src/combustionModels/FSD/FSD.C b/src/combustionModels/FSD/FSD.C new file mode 100644 index 0000000000..699111171b --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "FSD.H" +#include "addToRunTimeSelectionTable.H" +#include "LESModel.H" + +namespace Foam +{ +namespace combustionModels +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template +FSD::FSD +( + const word& modelType, const fvMesh& mesh +) +: + singleStepCombustion(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 +FSD::~FSD() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template +void FSD::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("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 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 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("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 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 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 +void FSD::correct() +{ + this->wFuel_ == + dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0); + + if (this->active()) + { + calculateSourceNorm(); + } +} + + +template +bool FSD::read() +{ + if (singleStepCombustion::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 0000000000..f727790e62 --- /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 . + +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 FSD +: + public singleStepCombustion +{ + // Private data + + //- Auto pointer to consumption speed per unit of flame area model + autoPtr 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 0000000000..1d85272169 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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 0000000000..db8b464457 --- /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) 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 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::consumptionSpeed::omega0Sigma +( + const volScalarField& sigma +) +{ + tmp 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 0000000000..80c0dc9a48 --- /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 . + +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 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 0000000000..f7adc032ab --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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 0000000000..6353f7241d --- /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 . + + +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 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 0000000000..bd8e28062b --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "reactionRateFlameArea.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::autoPtr 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 + (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 0000000000..9f8415385f --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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("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 d36f4c11e3..3e0aea5b8b 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 . 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 86696b0709..3bb286c7d6 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 314c820f24..77f96e3a4a 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 0000000000..a33b778bab --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "PaSR.H" +#include "fvmSup.H" + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template +Foam::combustionModels::PaSR::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 +Foam::combustionModels::PaSR::~PaSR() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +template +Foam::tmp +Foam::combustionModels::PaSR::tc() const +{ + return this->pChemistry_->tc(); +} + + +template +void Foam::combustionModels::PaSR::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 tepsilon(this->turbulence().epsilon()); + const volScalarField& epsilon = tepsilon(); + tmp tmuEff(this->turbulence().muEff()); + const volScalarField& muEff = tmuEff(); + tmp 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 +Foam::tmp +Foam::combustionModels::PaSR::R(const volScalarField& Y) const +{ + + tmp 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 +Foam::tmp +Foam::combustionModels::PaSR::dQ() const +{ + tmp 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 +Foam::tmp +Foam::combustionModels::PaSR::Sh() const +{ + tmp 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 +bool Foam::combustionModels::PaSR::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 0000000000..4250c63a6a --- /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 . + +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 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 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 R(const volScalarField& Y) const; + + //- Heat release rate calculated from fuel consumption rate matrix + virtual tmp dQ() const; + + //- Return source for enthalpy equation [kg/m/s3] + virtual tmp 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 0000000000..650ef98676 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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 bfccadf733..b87503a924 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 . - -\*---------------------------------------------------------------------------*/ - -#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::combustionModel::R -( - volScalarField& Y -) const -{ - return tmp - ( - new fvScalarMatrix(Y, dimMass/dimTime*Y.dimensions()) - ); -} - - -Foam::tmp Foam::combustionModel::dQ() const -{ - return tmp - ( - 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::combustionModel::wFuelNorm() const -{ - return tmp - ( - 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 . + +\*---------------------------------------------------------------------------*/ + +#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("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::combustionModel::Sh() const +{ + return tmp + ( + 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 28ccb85b1b..7b997fce70 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,65 +88,11 @@ public: TypeName("combustionModel"); - // Declare run-time constructor selection table - - declareRunTimeSelectionTable - ( - autoPtr, - combustionModel, - dictionary, - ( - const dictionary& combustionProperties, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho - ), - ( - combustionProperties, - thermo, - turbulence, - phi, - rho - ) - ); - - - // Selectors - - //- Return a reference to the selected combustion model - static autoPtr New - ( - const dictionary& combustionProperties, - hsCombustionThermo& thermo, - const compressible::turbulenceModel& turbulence, - const surfaceScalarField& phi, - const volScalarField& rho - ); - - // Constructors - //- 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 - ); + combustionModel(const word& modelType, const fvMesh& mesh); //- Destructor @@ -159,34 +101,53 @@ public: // Member Functions - // Access functions + // Access - //- Access combustion dictionary - const dictionary coeffs() const - { - return coeffs_; - } + + //- Return const access to the mesh database + inline const fvMesh& mesh() const; + + //- Return const access to phi + inline const surfaceScalarField& phi() const; + + //- Return const access to rho + virtual tmp rho() const = 0; + + //- Return access to turbulence + inline const compressible::turbulenceModel& turbulence() const; + + //- Set turbulence + inline void setTurbulence + ( + compressible::turbulenceModel& turbModel + ); + + //- Is combustion active? + inline const Switch& active() const; + + //- 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 R(volScalarField& Y) const; + virtual tmp R(const volScalarField& Y) const = 0; //- Heat release rate calculated from fuel consumption rate matrix - virtual tmp dQ() const; + virtual tmp dQ() const = 0; - //- Return normalised consumption rate of (fu - fres) - virtual tmp wFuelNorm() const; + //- Return source for enthalpy equation [kg/m/s3] + virtual tmp 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 0000000000..208ed6d2ee --- /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 . + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * 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 0000000000..f3d2ee8e24 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#ifndef makeCombustionTypes_H +#define makeCombustionTypes_H + +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#define makeCombustionTypesThermo(CombModel, Comb, Thermo) \ + \ + typedef CombModel CombModel##Comb##Thermo; \ + \ + \ + defineTemplateTypeNameAndDebugWithName \ + ( \ + CombModel##Comb##Thermo, \ + #CombModel"<"#Comb","#Thermo">", \ + 0 \ + ); \ + \ + \ + addToRunTimeSelectionTable \ + ( \ + Comb, \ + CombModel##Comb##Thermo, \ + dictionary \ + ); + +#define makeCombustionTypes(CombModel, CombThermoType) \ + \ + typedef CombModel \ + 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 2748e31efa..16c32e9e56 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 +infinitelyFastChemistry::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&>(thermo) - ), - wFuelNorm_ - ( - IOobject - ( - "wFuelNorm", - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0) - ) + singleStepCombustion(modelType, mesh), + C_(readScalar(this->coeffs().lookup("C"))) {} // * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // -Foam::combustionModels::infinitelyFastChemistry::~infinitelyFastChemistry() +template +infinitelyFastChemistry::~infinitelyFastChemistry() {} // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // -void Foam::combustionModels::infinitelyFastChemistry::correct() +template +void infinitelyFastChemistry::correct() { - singleMixture_.fresCorrect(); + this->wFuel_ == + dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0); - const label fuelI = singleMixture_.fuelIndex(); - - 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()); + this->singleMixture_.fresCorrect(); + + const label fuelI = this->singleMixture_.fuelIndex(); + + const volScalarField& YFuel = this->thermo_->composition().Y()[fuelI]; + + const dimensionedScalar s = this->singleMixture_.s(); + + if (this->thermo_->composition().contains("O2")) + { + const volScalarField& YO2 = this->thermo_->composition().Y("O2"); + + this->wFuel_ == + this->rho()/(this->mesh().time().deltaT()*C_) + *min(YFuel, YO2/s.value()); + } } } -Foam::tmp -Foam::combustionModels::infinitelyFastChemistry::R(volScalarField& Y) const +template +bool infinitelyFastChemistry::read() { - const label specieI = thermo_.composition().species()[Y.name()]; - - const label fNorm = singleMixture_.specieProd()[specieI]; - - const volScalarField fres(singleMixture_.fres(specieI)); - - const volScalarField wSpecie - ( - wFuelNorm_*singleMixture_.specieStoichCoeffs()[specieI] - / max(fNorm*(Y - fres), scalar(0.001)) - ); - - return -fNorm*wSpecie*fres + fNorm*fvm::Sp(wSpecie, Y); + if (singleStepCombustion::read()) + { + this->coeffs().lookup("C") >> C_ ; + return true; + } + else + { + return false; + } } -Foam::tmp -Foam::combustionModels::infinitelyFastChemistry::dQ() const -{ - const label fuelI = singleMixture_.fuelIndex(); - volScalarField& YFuel = thermo_.composition().Y(fuelI); +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - return -singleMixture_.qFuel()*(R(YFuel) & YFuel); -} +} // End namespace combustionModels +} // End namespace Foam - -Foam::tmp -Foam::combustionModels::infinitelyFastChemistry::wFuelNorm() const -{ - return wFuelNorm_; -} - - -bool Foam::combustionModels::infinitelyFastChemistry::read -( - const dictionary& combustionProps -) -{ - combustionModel::read(combustionProps); - coeffs_.lookup("C") >> C_ ; - - return true; -} - - -// ************************************************************************* // +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H index 304dba46a3..3293089a62 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 infinitelyFastChemistry : - public combustionModel + public singleStepCombustion { // Private data //- Model constant scalar C_; - //- Reference to singleStepReactingMixture mixture - singleStepReactingMixture& 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 R(volScalarField& Y) const; - - //- Heat release rate calculated from fuel consumption rate matrix - virtual tmp dQ() const; - - //- Return normalised consumption rate of (fu - fres) - virtual tmp 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 0000000000..29315599f4 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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 0000000000..426d370b8f --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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 0000000000..e345904f1c --- /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 . + +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 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 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 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 0000000000..1a54dab2d2 --- /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 . + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * 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::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 0000000000..64c60228d1 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "psiChemistryCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr +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 + (cstrIter()(className, mesh)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModel.C b/src/combustionModels/psiCombustionModel/psiCombustionModel.C new file mode 100644 index 0000000000..76d52e4541 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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::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 0000000000..aa1e26dac4 --- /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 . + +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 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 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 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 0000000000..f208d4ea29 --- /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 . + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * 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 0000000000..28092b4a08 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "psiCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr +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(cstrIter()(className, mesh)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModels.C b/src/combustionModels/psiCombustionModel/psiCombustionModels.C new file mode 100644 index 0000000000..6bbbb255a7 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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 0000000000..f427737c8f --- /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 . + +\*---------------------------------------------------------------------------*/ + +#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 0000000000..e288300e6d --- /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 . + +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 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 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 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 0000000000..93c8d2ea8d --- /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 . + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * 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::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 0000000000..4df4146f29 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "rhoChemistryCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr +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 + (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 4fc8c7d0c9..beaebe6aa0 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::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 0000000000..58e499dc8a --- /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 . + +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 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 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 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 0000000000..23db3695c1 --- /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 . + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * 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 0000000000..5496f68925 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "rhoCombustionModel.H" + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +Foam::autoPtr +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 (cstrIter()(className, mesh)); +} + + +// ************************************************************************* // diff --git a/src/combustionModels/singleStepCombustion/singleStepCombustion.C b/src/combustionModels/singleStepCombustion/singleStepCombustion.C new file mode 100644 index 0000000000..b7ff05fb96 --- /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 . + +\*---------------------------------------------------------------------------*/ + +#include "singleStepCombustion.H" +#include "fvmSup.H" + +namespace Foam +{ +namespace combustionModels +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template +singleStepCombustion +::singleStepCombustion +( + const word& modelType, const fvMesh& mesh +) +: + CombThermoType(modelType, mesh), + singleMixture_ + ( + dynamic_cast&>(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 +singleStepCombustion +::~singleStepCombustion() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + +template +Foam::tmp +singleStepCombustion::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 +Foam::tmp +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 +Foam::tmp +singleStepCombustion< CombThermoType, ThermoType>::dQ() const +{ + tmp 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 +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 0000000000..32c4f952fc --- /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 . + +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 singleStepCombustion +: + public CombThermoType +{ + +protected: + + // Protected data + + //- Reference to singleStepReactingMixture mixture + singleStepReactingMixture& 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 R(const volScalarField& Y) const; + + //- Heat release rate calculated from fuel consumption rate matrix + virtual tmp dQ() const; + + //- Sensible enthalpy source term + virtual tmp 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/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index a66495843b..e7c0a655c5 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -250,7 +250,7 @@ $(schemes)/quadraticLinearPureUpwindFit/quadraticLinearPureUpwindFit.C $(schemes)/linearPureUpwindFit/linearPureUpwindFit.C $(schemes)/linearUpwind/linearUpwind.C $(schemes)/linearUpwind/linearUpwindV.C -$(schemes)/quadraticUpwind/quadraticUpwind.C +$(schemes)/LUST/LUST.C limitedSchemes = $(surfaceInterpolation)/limitedSchemes $(limitedSchemes)/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationSchemes.C diff --git a/src/finiteVolume/cfdTools/general/fieldSources/basicSource/basicSource/basicSourceList.H b/src/finiteVolume/cfdTools/general/fieldSources/basicSource/basicSource/basicSourceList.H index 02cd801cc0..7cc22e8cec 100644 --- a/src/finiteVolume/cfdTools/general/fieldSources/basicSource/basicSource/basicSourceList.H +++ b/src/finiteVolume/cfdTools/general/fieldSources/basicSource/basicSource/basicSourceList.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::basicsourceList + Foam::basicSourceList Description List of explict sources diff --git a/src/finiteVolume/fvMatrices/fvMatricesFwd.H b/src/finiteVolume/fvMatrices/fvMatricesFwd.H index b86b729041..d5d3403bed 100644 --- a/src/finiteVolume/fvMatrices/fvMatricesFwd.H +++ b/src/finiteVolume/fvMatrices/fvMatricesFwd.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -21,14 +21,8 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . -Class - Foam::fvMatrix - Description - A special matrix type and solver, designed for finite volume - solutions of scalar equations. - Face addressing is used to make all matrix assembly - and solution loops vectorise. + Forward declarations of fvMatrix specializations. \*---------------------------------------------------------------------------*/ diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H index 773db6dad9..4763714898 100644 --- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H +++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H @@ -25,7 +25,10 @@ Class Foam::fvMatrix Description - Finite-Volume matrix. + A special matrix type and solver, designed for finite volume + solutions of scalar equations. + Face addressing is used to make all matrix assembly + and solution loops vectorise. SourceFiles fvMatrix.C diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/MeshObjects/pureUpwindCFCCellToFaceStencilObject.H b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/MeshObjects/pureUpwindCFCCellToFaceStencilObject.H index 4965e2ed10..dfab1cf255 100644 --- a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/MeshObjects/pureUpwindCFCCellToFaceStencilObject.H +++ b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/MeshObjects/pureUpwindCFCCellToFaceStencilObject.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2008-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2008-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::upwindCFCCellToFaceStencilObject + Foam::pureUpwindCFCCellToFaceStencilObject Description diff --git a/src/finiteVolume/interpolation/interpolation/interpolationCellPointWallModified/interpolationCellPointWallModified.H b/src/finiteVolume/interpolation/interpolation/interpolationCellPointWallModified/interpolationCellPointWallModified.H index 6b57454da7..0cb362fe1e 100644 --- a/src/finiteVolume/interpolation/interpolation/interpolationCellPointWallModified/interpolationCellPointWallModified.H +++ b/src/finiteVolume/interpolation/interpolation/interpolationCellPointWallModified/interpolationCellPointWallModified.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::interpolationCellPoint + Foam::interpolationCellPointWallModified Description Same as interpolationCellPoint, but if interpolating a wall face, uses diff --git a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvSurfaceField.H b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvSurfaceField.H index 21def0d0bb..2b7e4b2747 100644 --- a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvSurfaceField.H +++ b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvSurfaceField.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::MapFvSurfaceField + Foam::MapInternalField Description Map Surface internal field on topology change. This is a partial diff --git a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvVolField.H b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvVolField.H index ed1ce0f097..a2ebddccd7 100644 --- a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvVolField.H +++ b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvVolField.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::MapFvVolField + Foam::MapInternalField Description Map volume internal field on topology change. This is a partial diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticUpwind/quadraticUpwind.C b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/LUST/LUST.C similarity index 86% rename from src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticUpwind/quadraticUpwind.C rename to src/finiteVolume/interpolation/surfaceInterpolation/schemes/LUST/LUST.C index 442e0d3e8b..c9df6716d7 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticUpwind/quadraticUpwind.C +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/LUST/LUST.C @@ -23,15 +23,15 @@ License \*---------------------------------------------------------------------------*/ -#include "quadraticUpwind.H" +#include "LUST.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { - //makeSurfaceInterpolationScheme(quadraticUpwind); - makeSurfaceInterpolationTypeScheme(quadraticUpwind, scalar); - makeSurfaceInterpolationTypeScheme(quadraticUpwind, vector); + //makeSurfaceInterpolationScheme(LUST); + makeSurfaceInterpolationTypeScheme(LUST, scalar); + makeSurfaceInterpolationTypeScheme(LUST, vector); } // ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticUpwind/quadraticUpwind.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/LUST/LUST.H similarity index 85% rename from src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticUpwind/quadraticUpwind.H rename to src/finiteVolume/interpolation/surfaceInterpolation/schemes/LUST/LUST.H index a2fb36f7fb..864559a56a 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticUpwind/quadraticUpwind.H +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/LUST/LUST.H @@ -22,20 +22,24 @@ License along with OpenFOAM. If not, see . Class - quadraticUpwind + Foam::LUST Description - quadraticUpwind interpolation scheme class derived from linearUpwind and - returns blended linear/upwind weighting factors and also applies a explicit - gradient-based correction obtained from the linearUpwind scheme. + LUST: Linear-upwind stabilised transport. + + Interpolation scheme class derived from linearUpwind which returns blended + linear/linear-upwind weighting factors and also applies a explicit + gradient-based correction obtained from the linearUpwind scheme. The + blending-factor is set to 0.75 linear which optimises the balance between + accuracy and stability on a range of LES cases with a range of mesh quality. SourceFiles - quadraticUpwind.C + LUST.C \*---------------------------------------------------------------------------*/ -#ifndef quadraticUpwind_H -#define quadraticUpwind_H +#ifndef LUST_H +#define LUST_H #include "linearUpwind.H" @@ -45,33 +49,33 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class quadraticUpwind Declaration + Class LUST Declaration \*---------------------------------------------------------------------------*/ template -class quadraticUpwind +class LUST : public linearUpwind { // Private Member Functions //- Disallow default bitwise copy construct - quadraticUpwind(const quadraticUpwind&); + LUST(const LUST&); //- Disallow default bitwise assignment - void operator=(const quadraticUpwind&); + void operator=(const LUST&); public: //- Runtime type information - TypeName("quadraticUpwind"); + TypeName("LUST"); // Constructors //- Construct from mesh and Istream - quadraticUpwind + LUST ( const fvMesh& mesh, Istream& schemeData @@ -81,7 +85,7 @@ public: {} //- Construct from mesh, faceFlux and Istream - quadraticUpwind + LUST ( const fvMesh& mesh, const surfaceScalarField& faceFlux, diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.H b/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.H index 1f0d7a1601..4f3f84bc69 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.H +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::displacementFvMotionSolver.H + Foam::displacementFvMotionSolver Description Base class for fvMotionSolvers which calculate displacement. diff --git a/src/lagrangian/coalCombustion/coalCloud/coalCloud.H b/src/lagrangian/coalCombustion/coalCloud/coalCloud.H index e3df30011e..eac53eccf7 100644 --- a/src/lagrangian/coalCombustion/coalCloud/coalCloud.H +++ b/src/lagrangian/coalCombustion/coalCloud/coalCloud.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - CoalCloud + coalCloud Description Cloud class to introduce coal parcels diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H index 0289d1ca0f..625e0784c7 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H +++ b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::BasicReactingMultiphaseParcel + Foam::basicReactingMultiphaseParcel Description Definition of basic reacting parcel diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/kinematicParcelInjectionDataIOList.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/kinematicParcelInjectionDataIOList.H index e7adc61c00..2c3ae0c4fd 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/kinematicParcelInjectionDataIOList.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/kinematicParcelInjectionDataIOList.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2010-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,6 +22,7 @@ License along with OpenFOAM. If not, see . Class + kinematicParcelInjectionDataIOList Description diff --git a/src/lagrangian/intermediate/submodels/Kinematic/ParticleForces/Drag/NonSphereDrag/NonSphereDragForce.H b/src/lagrangian/intermediate/submodels/Kinematic/ParticleForces/Drag/NonSphereDrag/NonSphereDragForce.H index f8a18529f3..a03372c080 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/ParticleForces/Drag/NonSphereDrag/NonSphereDragForce.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/ParticleForces/Drag/NonSphereDrag/NonSphereDragForce.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::NonSphereDrag + Foam::NonSphereDragForce Description Drag model for non-spherical particles. diff --git a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/reactingParcelInjectionDataIOList.H b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/reactingParcelInjectionDataIOList.H index c93bde5a43..c47b7f37e6 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/reactingParcelInjectionDataIOList.H +++ b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/reactingParcelInjectionDataIOList.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2010-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,6 +22,7 @@ License along with OpenFOAM. If not, see . Class + Foam::reactingParcelInjectionDataIOList Description diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/reactingMultiphaseParcelInjectionDataIOList.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/reactingMultiphaseParcelInjectionDataIOList.H index e0410515b1..97a171f2f9 100644 --- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/reactingMultiphaseParcelInjectionDataIOList.H +++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/reactingMultiphaseParcelInjectionDataIOList.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2010-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,6 +22,7 @@ License along with OpenFOAM. If not, see . Class + reactingMultiphaseParcelInjectionDataIOList Description diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/thermoParcelInjectionDataIOList.H b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/thermoParcelInjectionDataIOList.H index 76d39e5b0c..25dae5d66d 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/thermoParcelInjectionDataIOList.H +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/thermoParcelInjectionDataIOList.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2010-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,6 +22,7 @@ License along with OpenFOAM. If not, see . Class + thermoParcelInjectionDataIOList Description diff --git a/src/lagrangian/molecularDynamics/potential/pairPotential/derived/coulomb/coulomb.H b/src/lagrangian/molecularDynamics/potential/pairPotential/derived/coulomb/coulomb.H index 08eb5c5596..2652158fef 100644 --- a/src/lagrangian/molecularDynamics/potential/pairPotential/derived/coulomb/coulomb.H +++ b/src/lagrangian/molecularDynamics/potential/pairPotential/derived/coulomb/coulomb.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2008-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2008-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::pairPotentials::electrostatic + Foam::pairPotentials::coulomb Description diff --git a/src/lagrangian/molecularDynamics/potential/pairPotential/derived/dampedCoulomb/dampedCoulomb.H b/src/lagrangian/molecularDynamics/potential/pairPotential/derived/dampedCoulomb/dampedCoulomb.H index a6e66c1aa2..db7dfdd6a7 100644 --- a/src/lagrangian/molecularDynamics/potential/pairPotential/derived/dampedCoulomb/dampedCoulomb.H +++ b/src/lagrangian/molecularDynamics/potential/pairPotential/derived/dampedCoulomb/dampedCoulomb.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2008-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2008-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::pairPotentials::electrostatic + Foam::pairPotentials::dampedCoulomb Description diff --git a/src/postProcessing/functionObjects/field/streamLine/streamLineParticleCloud.H b/src/postProcessing/functionObjects/field/streamLine/streamLineParticleCloud.H index 76b3f82bf3..2eb4612913 100644 --- a/src/postProcessing/functionObjects/field/streamLine/streamLineParticleCloud.H +++ b/src/postProcessing/functionObjects/field/streamLine/streamLineParticleCloud.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::streamLineCloud + Foam::streamLineParticleCloud Description A Cloud of streamLine particles diff --git a/src/thermophysicalModels/basic/rhoThermo/hRhoThermo/hRhoThermo.H b/src/thermophysicalModels/basic/rhoThermo/hRhoThermo/hRhoThermo.H index d13ea0161e..254372b8db 100644 --- a/src/thermophysicalModels/basic/rhoThermo/hRhoThermo/hRhoThermo.H +++ b/src/thermophysicalModels/basic/rhoThermo/hRhoThermo/hRhoThermo.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::hPsiThermo + Foam::hRhoThermo Description Enthalpy for a mixture based on density diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/noChemistrySolver/noChemistrySolver.H b/src/thermophysicalModels/chemistryModel/chemistrySolver/noChemistrySolver/noChemistrySolver.H index 752c8d6177..de6bd0f26f 100644 --- a/src/thermophysicalModels/chemistryModel/chemistrySolver/noChemistrySolver/noChemistrySolver.H +++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/noChemistrySolver/noChemistrySolver.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::noChemistry + Foam::noChemistrySolver Description Dummy chemistry solver for 'none' option diff --git a/src/thermophysicalModels/radiationModels/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H b/src/thermophysicalModels/radiationModels/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H index f5279d54b9..1ef97d0f1d 100644 --- a/src/thermophysicalModels/radiationModels/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H +++ b/src/thermophysicalModels/radiationModels/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::janafThermo + Foam::absorptionCoeffs Description Absorption coefficients class used in greyMeanAbsorptionEmission and diff --git a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.H b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.H index b301dee960..2faf779a3b 100644 --- a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.H +++ b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::radiation::greyMeanAbsorptionEmission + Foam::radiation::wideBandAbsorptionEmission Description diff --git a/src/thermophysicalModels/specie/equationOfState/icoPolynomial/icoPolynomial.C b/src/thermophysicalModels/specie/equationOfState/icoPolynomial/icoPolynomial.C index a227493a65..9e54abe4ad 100644 --- a/src/thermophysicalModels/specie/equationOfState/icoPolynomial/icoPolynomial.C +++ b/src/thermophysicalModels/specie/equationOfState/icoPolynomial/icoPolynomial.C @@ -73,7 +73,7 @@ void icoPolynomial::write(Ostream& os) const rhoCoeffs_/this->W() ); - os << dict; + os << indent << dict.dictName() << dict; } diff --git a/src/thermophysicalModels/specie/equationOfState/incompressible/incompressible.C b/src/thermophysicalModels/specie/equationOfState/incompressible/incompressible.C index 4174ddfa97..6aed730366 100644 --- a/src/thermophysicalModels/specie/equationOfState/incompressible/incompressible.C +++ b/src/thermophysicalModels/specie/equationOfState/incompressible/incompressible.C @@ -53,7 +53,7 @@ void Foam::incompressible::write(Ostream& os) const dictionary dict("equationOfState"); dict.add("rho", rho_); - os << dict; + os << indent << dict.dictName() << dict; } diff --git a/src/thermophysicalModels/specie/specie/specie.C b/src/thermophysicalModels/specie/specie/specie.C index cfd925ab19..2b84c05580 100644 --- a/src/thermophysicalModels/specie/specie/specie.C +++ b/src/thermophysicalModels/specie/specie/specie.C @@ -66,7 +66,7 @@ void Foam::specie::write(Ostream& os) const dictionary dict("specie"); dict.add("nMoles", nMoles_); dict.add("molWeight", molWeight_); - os << dict; + os << indent << dict.dictName() << dict; } diff --git a/src/thermophysicalModels/specie/thermo/eConst/eConstThermo.C b/src/thermophysicalModels/specie/thermo/eConst/eConstThermo.C index a89059c52b..38a0d8f0b5 100644 --- a/src/thermophysicalModels/specie/thermo/eConst/eConstThermo.C +++ b/src/thermophysicalModels/specie/thermo/eConst/eConstThermo.C @@ -58,7 +58,7 @@ void Foam::eConstThermo::write(Ostream& os) const dictionary dict("thermodynamics"); dict.add("Cv", Cv_); dict.add("Hf", Hf_); - os << dict; + os << indent << dict.dictName() << dict; } diff --git a/src/thermophysicalModels/specie/thermo/hConst/hConstThermo.C b/src/thermophysicalModels/specie/thermo/hConst/hConstThermo.C index 3f1b831e03..5631755c6f 100644 --- a/src/thermophysicalModels/specie/thermo/hConst/hConstThermo.C +++ b/src/thermophysicalModels/specie/thermo/hConst/hConstThermo.C @@ -58,7 +58,7 @@ void Foam::hConstThermo::write(Ostream& os) const dictionary dict("thermodynamics"); dict.add("Cp", Cp_); dict.add("Hf", Hf_); - os << dict; + os << indent << dict.dictName() << dict; } diff --git a/src/thermophysicalModels/specie/thermo/hPolynomial/hPolynomialThermo.C b/src/thermophysicalModels/specie/thermo/hPolynomial/hPolynomialThermo.C index 10d1a280b3..b5dfe01481 100644 --- a/src/thermophysicalModels/specie/thermo/hPolynomial/hPolynomialThermo.C +++ b/src/thermophysicalModels/specie/thermo/hPolynomial/hPolynomialThermo.C @@ -108,7 +108,7 @@ void Foam::hPolynomialThermo::write word("CpCoeffs<" + Foam::name(PolySize) + '>'), CpCoeffs_/this->W() ); - os << dict; + os << indent << dict.dictName() << dict; } diff --git a/src/thermophysicalModels/specie/thermo/janaf/janafThermo.C b/src/thermophysicalModels/specie/thermo/janaf/janafThermo.C index 895a886ca6..4bc263f79b 100644 --- a/src/thermophysicalModels/specie/thermo/janaf/janafThermo.C +++ b/src/thermophysicalModels/specie/thermo/janaf/janafThermo.C @@ -108,7 +108,7 @@ void Foam::janafThermo::write(Ostream& os) const dict.add("Tcommon", Tcommon_); dict.add("highCpCoeffs", highCpCoeffs_); dict.add("lowCpCoeffs", lowCpCoeffs_); - os << dict; + os << indent << dict.dictName() << dict; } diff --git a/src/thermophysicalModels/specie/transport/const/constTransport.C b/src/thermophysicalModels/specie/transport/const/constTransport.C index c6e028db30..fb0aaed3fc 100644 --- a/src/thermophysicalModels/specie/transport/const/constTransport.C +++ b/src/thermophysicalModels/specie/transport/const/constTransport.C @@ -61,7 +61,7 @@ void Foam::constTransport::constTransport::write(Ostream& os) const dictionary dict("transport"); dict.add("mu", mu_); dict.add("Pr", 1.0/rPr_); - os << dict; + os << indent << dict.dictName() << dict; os << decrIndent << token::END_BLOCK << nl; } diff --git a/src/thermophysicalModels/specie/transport/polynomial/polynomialTransport.C b/src/thermophysicalModels/specie/transport/polynomial/polynomialTransport.C index f7e823160d..8376683c07 100644 --- a/src/thermophysicalModels/specie/transport/polynomial/polynomialTransport.C +++ b/src/thermophysicalModels/specie/transport/polynomial/polynomialTransport.C @@ -88,7 +88,7 @@ void Foam::polynomialTransport::write(Ostream& os) const word("kappaCoeffs<" + Foam::name(PolySize) + '>'), kappaCoeffs_/this->W() ); - os << dict; + os << indent << dict.dictName() << dict; os << decrIndent << token::END_BLOCK << nl; } diff --git a/src/thermophysicalModels/specie/transport/sutherland/sutherlandTransport.C b/src/thermophysicalModels/specie/transport/sutherland/sutherlandTransport.C index ad0ea57d2b..4aab3494e8 100644 --- a/src/thermophysicalModels/specie/transport/sutherland/sutherlandTransport.C +++ b/src/thermophysicalModels/specie/transport/sutherland/sutherlandTransport.C @@ -61,7 +61,7 @@ void Foam::sutherlandTransport::write(Ostream& os) const dictionary dict("transport"); dict.add("As", As_); dict.add("Ts", Ts_); - os << dict; + os << indent << dict.dictName() << dict; os << decrIndent << token::END_BLOCK << nl; } @@ -71,7 +71,8 @@ void Foam::sutherlandTransport::write(Ostream& os) const template Foam::Ostream& Foam::operator<< ( - Ostream& os, const sutherlandTransport& st + Ostream& os, + const sutherlandTransport& st ) { os << static_cast(st) << tab << st.As_ << tab << st.Ts_; diff --git a/src/thermophysicalModels/thermalPorousZone/thermalModel/fixedTemperature/fixedTemperature.C b/src/thermophysicalModels/thermalPorousZone/thermalModel/fixedTemperature/fixedTemperature.C index 4f75d3ee13..9564b56c66 100644 --- a/src/thermophysicalModels/thermalPorousZone/thermalModel/fixedTemperature/fixedTemperature.C +++ b/src/thermophysicalModels/thermalPorousZone/thermalModel/fixedTemperature/fixedTemperature.C @@ -82,6 +82,8 @@ void Foam::porousMedia::fixedTemperature::addEnthalpySource scalarField& hDiag = hEqn.diag(); scalarField& hSource = hEqn.source(); + tmp Cp = thermo.Cp(); + // TODO: generalize for non-fixedTemperature methods const scalar rate = 1e6; @@ -92,7 +94,8 @@ void Foam::porousMedia::fixedTemperature::addEnthalpySource forAll(cells, i) { hDiag[cells[i]] += rate*V[cells[i]]*rho[cells[i]]; - hSource[cells[i]] += rate*V[cells[i]]*rho[cells[i]]*T_; + hSource[cells[i]] += + rate*V[cells[i]]*rho[cells[i]]*Cp()[cells[i]]*T_; } } } diff --git a/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties b/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties index 8d6965f6b7..6608c94f4e 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; -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 c6378c0612..95bc43ae37 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; + +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 07dc8690bb..0000000000 --- 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/0/omega b/tutorials/combustion/fireFoam/les/smallPoolFire2D/0/omega new file mode 100644 index 0000000000..e806605630 --- /dev/null +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/0/omega @@ -0,0 +1,53 @@ +/*--------------------------------*- 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 volScalarField; + location "0"; + object omega; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +dimensions [1 -2 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + outlet + { + type inletOutlet; + inletValue uniform 0; + value uniform 0; + } + sides + { + type inletOutlet; + inletValue uniform 0; + value uniform 0; + } + base + { + type zeroGradient; + } + inlet + { + type fixedValue; + value uniform 0.0; + } + frontBack + { + type empty; + } + +} + +// ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties index 51f6378713..aeb4fd4cf4 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; +combustionModel FSD; + +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/polyMesh/boundary b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/polyMesh/boundary index c056cb28ee..3adde43e11 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/polyMesh/boundary +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/polyMesh/boundary @@ -15,31 +15,37 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -4 +5 ( base { type patch; - nFaces 150; + nFaces 134; startFace 44700; } outlet { type patch; nFaces 150; - startFace 44850; + startFace 44834; } sides { type patch; nFaces 300; - startFace 45000; + startFace 44984; } frontAndBack { type empty; nFaces 45000; - startFace 45300; + startFace 45284; + } + inlet + { + type patch; + nFaces 16; + startFace 90284; } ) diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions index c174cf789e..67f2373c38 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/smallPoolFire2D/system/fvSchemes b/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSchemes index 5c8063431d..793ef97237 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSchemes +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSchemes @@ -40,7 +40,9 @@ divSchemes hs limitedLinear 1; }; div((muEff*dev2(T(grad(U))))) Gauss linear; + div(phi,omega) Gauss limitedLinear 1; div(phiU,p) Gauss linear; + div(U) Gauss linear; div(Ji,Ii_h) Gauss upwind; } diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSolution b/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSolution index 5a7b7a980a..0168ed308e 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSolution +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSolution @@ -53,7 +53,7 @@ solvers }; - "(U|Yi|k|hs)" + "(U|Yi|k|hs|omega)" { solver PBiCG; preconditioner DILU; @@ -62,7 +62,7 @@ solvers nSweeps 1; }; - "(U|Yi|k|hs)Final" + "(U|Yi|k|hs|omega)Final" { $U; tolerance 1e-7; diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties index de54b0bbc1..07b7a2a489 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; + +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 c174cf789e..3c6e45a0d6 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 14d3f4ab0a..80cafe049a 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 0000000000..cd5f6c35e1 --- /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; + +active true; + +infinitelyFastChemistryCoeffs +{ + C 10.0; +} + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 0.1; + turbulentReaction on; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/icoFoam/cavity/constant/polyMesh/blockMeshDict b/tutorials/incompressible/icoFoam/cavity/constant/polyMesh/blockMeshDict index 6aa802c1e9..2e5f98c1a5 100644 --- a/tutorials/incompressible/icoFoam/cavity/constant/polyMesh/blockMeshDict +++ b/tutorials/incompressible/icoFoam/cavity/constant/polyMesh/blockMeshDict @@ -16,7 +16,7 @@ FoamFile convertToMeters 0.1; -vertices +vertices ( (0 0 0) (1 0 0) @@ -28,19 +28,18 @@ vertices (0 1 0.1) ); -blocks +blocks ( hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1) ); -edges +edges ( ); boundary ( - - movingWall + movingWall { type wall; faces @@ -48,7 +47,7 @@ boundary (3 7 6 2) ); } - fixedWalls + fixedWalls { type wall; faces @@ -58,7 +57,7 @@ boundary (1 5 4 0) ); } - frontAndBack + frontAndBack { type empty; faces @@ -69,7 +68,7 @@ boundary } ); -mergePatchPairs +mergePatchPairs ( ); diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties index 67ea1f828d..5f0483df1b 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 0000000000..a07f7b12b7 --- /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; + +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 1c723e8931..69f6f93234 100644 --- a/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties +++ b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties @@ -19,9 +19,6 @@ rhoChemistryModel ODEChemistryModel; 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 0000000000..7b938bb477 --- /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; + +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 fd54b84768..cbce99c770 100644 --- a/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties +++ b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel; 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/smallPoolFire2D/constant/chemistryProperties b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties similarity index 80% rename from tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties rename to tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties index fca4f15a5c..83adafa2d4 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/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; +combustionModel PaSR; -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 d332d6144c..8bc89b0f58 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties @@ -19,8 +19,6 @@ rhoChemistryModel ODEChemistryModel; 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/oppositeBurningPanels/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties similarity index 80% rename from tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/chemistryProperties rename to tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties index fca4f15a5c..dc51ca05f7 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/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; +combustionModel PaSR; -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 d332d6144c..8bc89b0f58 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties @@ -19,8 +19,6 @@ rhoChemistryModel ODEChemistryModel; 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 0000000000..dc51ca05f7 --- /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; + +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 d332d6144c..8bc89b0f58 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties @@ -19,8 +19,6 @@ rhoChemistryModel ODEChemistryModel; 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 0000000000..dc51ca05f7 --- /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; + +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 fca4f15a5c..36247042de 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel; 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 4d6e2a96b0..86e6e0388b 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR; + +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 fca4f15a5c..36247042de 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel; 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 4d6e2a96b0..7c6acfaadd 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction off; +} // ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/patchify.setSet b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/patchify.setSet new file mode 100644 index 0000000000..bbfd5e0b24 --- /dev/null +++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/patchify.setSet @@ -0,0 +1,30 @@ +faceSet cubeFaces clear +faceSet cubeFaces add boxToFace (0.399 0.099 0.299) (0.601 0.301 0.301) +faceSet cubeFaces add boxToFace (0.599 0.099 0.099) (0.601 0.301 0.301) +faceSet cubeFaces add boxToFace (0.399 0.099 0.099) (0.601 0.301 0.101) +faceSet cubeFaces add boxToFace (0.399 0.099 0.099) (0.401 0.301 0.301) +faceSet cubeFaces add boxToFace (0.399 0.299 0.099) (0.601 0.301 0.301) +faceSet cubeFaces add boxToFace (0.399 0.099 0.099) (0.601 0.101 0.301) +faceSet cubeFaces add boxToFace (0.399 0.099 0.599) (0.601 0.301 0.601) +faceSet cubeFaces add boxToFace (0.599 0.099 0.399) (0.601 0.301 0.601) +faceSet cubeFaces add boxToFace (0.399 0.099 0.399) (0.601 0.301 0.401) +faceSet cubeFaces add boxToFace (0.399 0.099 0.399) (0.401 0.301 0.601) +faceSet cubeFaces add boxToFace (0.399 0.299 0.399) (0.601 0.301 0.601) +faceSet cubeFaces add boxToFace (0.399 0.099 0.399) (0.601 0.101 0.601) +faceSet cubeFaces add boxToFace (0.399 0.399 0.299) (0.601 0.601 0.301) +faceSet cubeFaces add boxToFace (0.599 0.399 0.099) (0.601 0.601 0.301) +faceSet cubeFaces add boxToFace (0.399 0.399 0.099) (0.601 0.601 0.101) +faceSet cubeFaces add boxToFace (0.399 0.399 0.099) (0.401 0.601 0.301) +faceSet cubeFaces add boxToFace (0.399 0.599 0.099) (0.601 0.601 0.301) +faceSet cubeFaces add boxToFace (0.399 0.399 0.099) (0.601 0.401 0.301) +faceSet cubeFaces add boxToFace (0.399 0.399 0.599) (0.601 0.601 0.601) +faceSet cubeFaces add boxToFace (0.599 0.399 0.399) (0.601 0.601 0.601) +faceSet cubeFaces add boxToFace (0.399 0.399 0.399) (0.601 0.601 0.401) +faceSet cubeFaces add boxToFace (0.399 0.399 0.399) (0.401 0.601 0.601) +faceSet cubeFaces add boxToFace (0.399 0.599 0.399) (0.601 0.601 0.601) +faceSet cubeFaces add boxToFace (0.399 0.399 0.399) (0.601 0.401 0.601) +cellSet cubeFacesCells new faceToCell cubeFaces owner +faceZoneSet cubeFaces new setsToFaceZone cubeFaces cubeFacesCells +faceSet floorFaces new boxToFace (-0.001 -0.001 -0.001) (1.001 1.001 0.001) +cellSet floorCells new faceToCell floorFaces owner +faceZoneSet floorFaces new setsToFaceZone floorFaces floorCells diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties index fca4f15a5c..36247042de 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel; 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 4d6e2a96b0..7c6acfaadd 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR; + +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 fca4f15a5c..36247042de 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel; 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 4d6e2a96b0..7c6acfaadd 100644 --- a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties +++ b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties @@ -15,7 +15,15 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel none; +combustionModel PaSR; + +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 462583d3e2..4a82f1bffd 100644 --- a/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties +++ b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties @@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel; 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 0000000000..7c6acfaadd --- /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; + +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 5612988231..82a5c663e0 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 0000000000..abba13a97f --- /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; + +active false; + +PaSRCoeffs +{ + Cmix Cmix [ 0 0 0 0 0 0 0 ] 1.0; + turbulentReaction yes; +} + + +// ************************************************************************* // diff --git a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties index 08e549dacf..c8cc53eda0 100644 --- a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties +++ b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/sprayCloudProperties @@ -119,7 +119,7 @@ subModels position ( 0 0.0995 0 ); direction ( 0 -1 0 ); parcelsPerSecond 100000000; - volumeFlowRate table + flowRateProfile table ( (0 0.1272) (4.16667e-05 6.1634) diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/U b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/U new file mode 100644 index 0000000000..a7bfdc893c --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/U @@ -0,0 +1,47 @@ +/*--------------------------------*- 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 volVectorField; + location "0"; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + left + { + type slip; + } + right + { + type slip; + } + bottom + { + type slip; + } + top + { + type slip; + } + frontBack + { + type empty; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/alpha1 b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/alpha1 new file mode 100644 index 0000000000..8dbc709325 --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/alpha1 @@ -0,0 +1,47 @@ +/*--------------------------------*- 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 volScalarField; + location "0"; + object alpha1; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + left + { + type zeroGradient; + } + right + { + type zeroGradient; + } + bottom + { + type zeroGradient; + } + top + { + type zeroGradient; + } + frontBack + { + type empty; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/p_rgh b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/p_rgh new file mode 100644 index 0000000000..faed24b29c --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/0.org/p_rgh @@ -0,0 +1,47 @@ +/*--------------------------------*- 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 volScalarField; + location "0"; + object p_rgh; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + left + { + type buoyantPressure; + } + right + { + type buoyantPressure; + } + bottom + { + type buoyantPressure; + } + top + { + type buoyantPressure; + } + frontBack + { + type empty; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/Allclean b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/Allclean new file mode 100755 index 0000000000..cd78b26599 --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/Allclean @@ -0,0 +1,11 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase + +\rm -rf 0 + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/Allrun b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/Allrun new file mode 100755 index 0000000000..887344985c --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/Allrun @@ -0,0 +1,17 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Set application name +application=`getApplication` + +\rm -rf 0 +cp -r 0.org 0 + +runApplication blockMesh +runApplication setFields +runApplication $application + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/g b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/g new file mode 100644 index 0000000000..622f53c352 --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/g @@ -0,0 +1,21 @@ +/*--------------------------------*- 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 uniformDimensionedVectorField; + location "constant"; + object g; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -2 0 0 0 0]; +value (0 -9.81 0); + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/polyMesh/blockMeshDict b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/polyMesh/blockMeshDict new file mode 100644 index 0000000000..129623509b --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/polyMesh/blockMeshDict @@ -0,0 +1,88 @@ +/*--------------------------------*- 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; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (0 0 0) + (10 0 0) + (10 2 0) + (0 2 0) + (0 0 2) + (10 0 2) + (10 2 2) + (0 2 2)); + +blocks +( + hex (0 1 2 3 4 5 6 7) (200 40 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + left + { + type wall; + faces + ( + (0 4 7 3) + ); + } + right + { + type wall; + faces + ( + (1 5 6 2) + ); + } + bottom + { + type wall; + faces + ( + (0 1 5 4) + ); + } + top + { + type wall; + faces + ( + (3 2 6 7) + ); + } + frontBack + { + type empty; + faces + ( + (0 1 2 3) + (4 5 6 7) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/polyMesh/boundary b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/polyMesh/boundary new file mode 100644 index 0000000000..372e6d731b --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/polyMesh/boundary @@ -0,0 +1,52 @@ +/*--------------------------------*- 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 polyBoundaryMesh; + location "constant/polyMesh"; + object boundary; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +5 +( + left + { + type wall; + nFaces 40; + startFace 15760; + } + right + { + type wall; + nFaces 40; + startFace 15800; + } + bottom + { + type wall; + nFaces 200; + startFace 15840; + } + top + { + type wall; + nFaces 200; + startFace 16040; + } + frontBack + { + type empty; + nFaces 16000; + startFace 16240; + } +) + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/transportProperties b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/transportProperties new file mode 100644 index 0000000000..409c2a04f1 --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/transportProperties @@ -0,0 +1,35 @@ +/*--------------------------------*- 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 transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Dab Dab [0 2 -1 0 0 0 0] 1e-06; +alphatab alphatab [0 0 0 0 0 0 0] 1; + +phase1 +{ + transportModel Newtonian; + nu nu [0 2 -1 0 0 0 0] 1e-06; + rho rho [1 -3 0 0 0 0 0] 1000; +} + +phase2 +{ + transportModel Newtonian; + nu nu [0 2 -1 0 0 0 0] 1e-06; + rho rho [1 -3 0 0 0 0 0] 990; +} + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/turbulenceProperties b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/turbulenceProperties new file mode 100644 index 0000000000..68ff5154b0 --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/constant/turbulenceProperties @@ -0,0 +1,20 @@ +/*--------------------------------*- 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 turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType laminar; + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/controlDict b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/controlDict new file mode 100644 index 0000000000..35ccca10c5 --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/controlDict @@ -0,0 +1,53 @@ +/*--------------------------------*- 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 "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application twoLiquidMixingFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 0.05; + +writeControl adjustableRunTime; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep on; + +maxCo 0.5; +maxDeltaT 1; + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/fvSchemes b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/fvSchemes new file mode 100644 index 0000000000..f12ddde1af --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/fvSchemes @@ -0,0 +1,62 @@ +/*--------------------------------*- 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 "system"; + object fvSchemes; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + + div(rho*phi,U) Gauss linear; + div(phi,alpha1) Gauss vanLeer; + div(phi,k) Gauss limitedLinear 1; + div(((rho*nuEff)*dev(grad(U).T()))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; + p_rgh; + alpha1; +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/fvSolution b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/fvSolution new file mode 100644 index 0000000000..20af5a05fc --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/fvSolution @@ -0,0 +1,74 @@ +/*--------------------------------*- 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 "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + "alpha1.*" + { + solver smoothSolver; + smoother GaussSeidel; + tolerance 1e-7; + relTol 0; + nSweeps 1; + } + + p_rgh + { + solver GAMG; + tolerance 1e-7; + relTol 0.01; + smoother GaussSeidel; + cacheAgglomeration true; + nCellsInCoarsestLevel 10; + agglomerator faceAreaPair; + mergeLevels 1; + } + + p_rghFinal + { + $p_rgh; + relTol 0; + } + + U + { + solver smoothSolver; + smoother GaussSeidel; + tolerance 1e-7; + relTol 0.1; + nSweeps 1; + } + + UFinal + { + $U; + relTol 0; + } +} + +PIMPLE +{ + momentumPredictor yes; + nOuterCorrectors 1; + nCorrectors 2; + nNonOrthogonalCorrectors 0; + pRefValue 0; + pRefPoint (0.1 0.1 1); +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/setFieldsDict b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/setFieldsDict new file mode 100644 index 0000000000..64f0b43c43 --- /dev/null +++ b/tutorials/multiphase/twoLiquidMixingFoam/lockExchange/system/setFieldsDict @@ -0,0 +1,36 @@ +/*--------------------------------*- 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; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue alpha1 0 + volVectorFieldValue U (0 0 0) +); + +regions +( + boxToCell + { + box (0 0 0) (5 2 2); + + fieldValues + ( + volScalarFieldValue alpha1 1 + ); + } +); + +// ************************************************************************* //