From bbd0a8e0c034fc5deb8ce6686cdbf06f4dce537d Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Thu, 2 Jun 2011 18:34:38 +0100 Subject: [PATCH] ENH: Updated chemistry solvers --- .../ODEChemistryModel/ODEChemistryModel.C | 12 ++-- .../chemistryModel/makeChemistryModel.H | 14 ---- .../psiChemistryModel/psiChemistryModelNew.C | 68 ++++++++++++------ .../rhoChemistryModel/rhoChemistryModelNew.C | 72 ++++++++++++------- .../EulerImplicit/EulerImplicit.C | 2 +- .../chemistryModel/chemistrySolver/ode/ode.C | 4 +- .../chemistrySolver/sequential/sequential.C | 2 +- 7 files changed, 102 insertions(+), 72 deletions(-) diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C index 4ebc3929ebc..008f5ad42c9 100644 --- a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C +++ b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C @@ -848,11 +848,13 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::solve notImplemented ( "ODEChemistryModel::solve" - "scalarField&, " - "const scalar, " - "const scalar, " - "const scalar, " - "const scalar" + "(" + "scalarField&, " + "const scalar, " + "const scalar, " + "const scalar, " + "const scalar" + ")" ); return (0); diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H b/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H index faf2608a2b5..18970e5d101 100644 --- a/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H +++ b/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H @@ -48,13 +48,6 @@ namespace Foam SS##Comp##Thermo, \ #SS"<"#Comp","#Thermo">", \ 0 \ - ); \ - \ - addToRunTimeSelectionTable \ - ( \ - Comp, \ - SS##Comp##Thermo, \ - fvMesh \ ); @@ -67,13 +60,6 @@ namespace Foam SS##Comp##SThermo##GThermo, \ #SS"<"#Comp","#SThermo","#GThermo">", \ 0 \ - ); \ - \ - addToRunTimeSelectionTable \ - ( \ - Comp, \ - SS##Comp##SThermo##GThermo, \ - fvMesh \ ); diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C b/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C index 7c1d6b596a1..8b22ae7ce55 100644 --- a/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C +++ b/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -32,24 +32,40 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New const fvMesh& mesh ) { - // get model name, but do not register the dictionary - // otherwise it is registered in the database twice - const word userModel + IOdictionary chemistryPropertiesDict ( - IOdictionary + IOobject ( - IOobject - ( - "chemistryProperties", - mesh.time().constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) - ).lookup("psiChemistryModel") + "chemistryProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) ); + const word solver(chemistryPropertiesDict.lookup("chemistrySolver")); + + wordList models = fvMeshConstructorTablePtr_->sortedToc(); + wordHashSet validModels; + forAll(models, i) + { + label delim = models[i].find('<'); + validModels.insert(models[i](0, delim)); + } + + wordHashSet::iterator solverIter = validModels.find(solver); + if (solverIter == validModels.end()) + { + FatalErrorIn("psiChemistryModel::New(const fvMesh&)") + << "Valid chemistrySolver types are:" << validModels + << exit(FatalError); + } + + + const word userModel(chemistryPropertiesDict.lookup("psiChemistryModel")); + // construct chemistry model type name by inserting first template argument const label tempOpen = userModel.find('<'); const label tempClose = userModel.find('>'); @@ -59,7 +75,7 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New userModel(tempOpen + 1, tempClose - tempOpen - 1); const word modelType = - className + '<' + typeName + ',' + thermoTypeName + '>'; + solver + '<' + className + '<' + typeName + ',' + thermoTypeName + ">>"; if (debug) { @@ -77,7 +93,7 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New { if (debug) { - FatalErrorIn("psiChemistryModelBase::New(const mesh&)") + FatalErrorIn("psiChemistryModel::New(const mesh&)") << "Unknown psiChemistryModel type " << modelType << nl << nl << "Valid psiChemistryModel types are:" << nl @@ -86,16 +102,22 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New } else { - wordList models = fvMeshConstructorTablePtr_->sortedToc(); - forAll(models, i) + wordList allModels(fvMeshConstructorTablePtr_->sortedToc()); + wordHashSet models; + forAll(allModels, i) { - models[i] = models[i].replace(typeName + ',', ""); + const label tempOpen = allModels[i].find('<'); + const label tempClose = allModels[i].rfind('>'); + word modelName = + allModels[i](tempOpen + 1, tempClose - tempOpen - 1); + modelName = modelName.replace(typeName + ',', ""); + models.insert(modelName); } - FatalErrorIn("psiChemistryModelBase::New(const mesh&)") + FatalErrorIn("psiChemistryModel::New(const mesh&)") << "Unknown psiChemistryModel type " << userModel - << nl << nl << "Valid psiChemistryModel types are:" << nl - << models << nl << exit(FatalError); + << nl << nl << "Valid psiChemistryModel types are:" + << models << exit(FatalError); } } diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C b/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C index f4dbc3a6715..ec9b968c50c 100644 --- a/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C +++ b/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -32,24 +32,40 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New const fvMesh& mesh ) { - // get model name, but do not register the dictionary - // otherwise it is registered in the database twice - const word userModel + IOdictionary chemistryPropertiesDict ( - IOdictionary + IOobject ( - IOobject - ( - "chemistryProperties", - mesh.time().constant(), - mesh, - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE, - false - ) - ).lookup("rhoChemistryModel") + "chemistryProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) ); + const word solver(chemistryPropertiesDict.lookup("chemistrySolver")); + + wordList models = fvMeshConstructorTablePtr_->sortedToc(); + wordHashSet validModels; + forAll(models, i) + { + label delim = models[i].find('<'); + validModels.insert(models[i](0, delim)); + } + + wordHashSet::iterator solverIter = validModels.find(solver); + if (solverIter == validModels.end()) + { + FatalErrorIn("rhoChemistryModel::New(const fvMesh&)") + << "Valid chemistrySolver types are:" << validModels + << exit(FatalError); + } + + + const word userModel(chemistryPropertiesDict.lookup("rhoChemistryModel")); + // construct chemistry model type name by inserting first template argument const label tempOpen = userModel.find('<'); const label tempClose = userModel.find('>'); @@ -59,7 +75,7 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New userModel(tempOpen + 1, tempClose - tempOpen - 1); const word modelType = - className + '<' + typeName + ',' + thermoTypeName + '>'; + solver + '<' + className + '<' + typeName + ',' + thermoTypeName + ">>"; if (debug) { @@ -77,7 +93,7 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New { if (debug) { - FatalErrorIn("rhoChemistryModelBase::New(const mesh&)") + FatalErrorIn("rhoChemistryModel::New(const mesh&)") << "Unknown rhoChemistryModel type " << modelType << nl << nl << "Valid rhoChemistryModel types are:" << nl @@ -86,18 +102,22 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New } else { - wordList models = fvMeshConstructorTablePtr_->sortedToc(); - forAll(models, i) + wordList allModels(fvMeshConstructorTablePtr_->sortedToc()); + wordHashSet models; + forAll(allModels, i) { - models[i] = models[i].replace(typeName + ',', ""); + const label tempOpen = allModels[i].find('<'); + const label tempClose = allModels[i].rfind('>'); + word modelName = + allModels[i](tempOpen + 1, tempClose - tempOpen - 1); + modelName = modelName.replace(typeName + ',', ""); + models.insert(modelName); } - FatalErrorIn("rhoChemistryModelBase::New(const mesh&)") - << "Unknown rhoChemistryModel type " - << userModel << nl << nl - << "Valid rhoChemistryModel types are:" << nl - << models << nl - << exit(FatalError); + FatalErrorIn("rhoChemistryModel::New(const mesh&)") + << "Unknown rhoChemistryModel type " << userModel + << nl << nl << "Valid rhoChemistryModel types are:" + << models << exit(FatalError); } } diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C index a2fbbe497a1..861347e94bd 100644 --- a/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C +++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C @@ -38,7 +38,7 @@ Foam::EulerImplicit<ODEChemistryType>::EulerImplicit ) : chemistrySolver<ODEChemistryType>(mesh, ODEModelName, thermoType), - coeffsDict_(this->subDict(ODEModelName + "Coeffs")), + coeffsDict_(this->subDict("EulerImplicitCoeffs")), cTauChem_(readScalar(coeffsDict_.lookup("cTauChem"))), eqRateLimiter_(coeffsDict_.lookup("equilibriumRateLimiter")) {} diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C index 29e7d6c8e7d..d14299e235d 100644 --- a/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C +++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C @@ -37,8 +37,8 @@ Foam::ode<ODEChemistryType>::ode ) : chemistrySolver<ODEChemistryType>(mesh, ODEModelName, thermoType), - coeffsDict_(this->subDict(ODEModelName + "Coeffs")), - solverName_(coeffsDict_.lookup("ODESolver")), + coeffsDict_(this->subDict("odeCoeffs")), + solverName_(coeffsDict_.lookup("solver")), odeSolver_(ODESolver::New(solverName_, *this)), eps_(readScalar(coeffsDict_.lookup("eps"))) {} diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C index 28a80563cc9..c0005f64203 100644 --- a/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C +++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C @@ -37,7 +37,7 @@ Foam::sequential<ODEChemistryType>::sequential ) : chemistrySolver<ODEChemistryType>(mesh, ODEModelName, thermoType), - coeffsDict_(this->subDict(ODEModelName + "Coeffs")), + coeffsDict_(this->subDict("sequentialCoeffs")), cTauChem_(readScalar(coeffsDict_.lookup("cTauChem"))), eqRateLimiter_(coeffsDict_.lookup("equilibriumRateLimiter")) {} -- GitLab