diff --git a/applications/utilities/mesh/manipulation/topoSet/topoSet.C b/applications/utilities/mesh/manipulation/topoSet/topoSet.C index a377f6133e..e4acfcdeab 100644 --- a/applications/utilities/mesh/manipulation/topoSet/topoSet.C +++ b/applications/utilities/mesh/manipulation/topoSet/topoSet.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 @@ -33,15 +33,72 @@ Description #include "cellSet.H" #include "faceSet.H" #include "pointSet.H" +#include "globalMeshData.H" +#include "timeSelector.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +void printMesh(const Time& runTime, const polyMesh& mesh) +{ + Info<< "Time:" << runTime.timeName() + << " cells:" << mesh.globalData().nTotalCells() + << " faces:" << mesh.globalData().nTotalFaces() + << " points:" << mesh.globalData().nTotalPoints() + << " patches:" << mesh.boundaryMesh().size() + << " bb:" << mesh.bounds() << nl; +} + + +polyMesh::readUpdateState meshReadUpdate(polyMesh& mesh) +{ + polyMesh::readUpdateState stat = mesh.readUpdate(); + + switch(stat) + { + case polyMesh::UNCHANGED: + { + Info<< " mesh not changed." << endl; + break; + } + case polyMesh::POINTS_MOVED: + { + Info<< " points moved; topology unchanged." << endl; + break; + } + case polyMesh::TOPO_CHANGE: + { + Info<< " topology changed; patches unchanged." << nl + << " "; + printMesh(mesh.time(), mesh); + break; + } + case polyMesh::TOPO_PATCH_CHANGE: + { + Info<< " topology changed and patches changed." << nl + << " "; + printMesh(mesh.time(), mesh); + + break; + } + default: + { + FatalErrorIn("meshReadUpdate(polyMesh&)") + << "Illegal mesh update state " + << stat << abort(FatalError); + break; + } + } + return stat; +} + + // Main program: int main(int argc, char *argv[]) { + timeSelector::addOptions(true, false); argList::addOption ( "dict", @@ -57,6 +114,9 @@ int main(int argc, char *argv[]) # include "setRootCase.H" # include "createTime.H" + + instantList timeDirs = timeSelector::selectIfPresent(runTime, args); + # include "createNamedPolyMesh.H" const bool noSync = args.optionFound("noSync"); @@ -99,128 +159,142 @@ int main(int argc, char *argv[]) // Read set construct info from dictionary - PtrList patchSources(topoSetDict.lookup("actions")); + PtrList actions(topoSetDict.lookup("actions")); - forAll(patchSources, i) + forAll(timeDirs, timeI) { - const dictionary& dict = patchSources[i]; + runTime.setTime(timeDirs[timeI], timeI); + Info<< "Time = " << runTime.timeName() << endl; - const word setName(dict.lookup("name")); - const word actionName(dict.lookup("action")); - const word setType(dict.lookup("type")); + // Optionally re-read mesh + meshReadUpdate(mesh); - - topoSetSource::setAction action = topoSetSource::toAction(actionName); - - autoPtr currentSet; - if - ( - (action == topoSetSource::NEW) - || (action == topoSetSource::CLEAR) - ) + // Execute all actions + forAll(actions, i) { - currentSet = topoSet::New(setType, mesh, setName, 10000); - Info<< "Created set " << setName << endl; - } - else if (action == topoSetSource::REMOVE) - { - //? - } - else - { - currentSet = topoSet::New + const dictionary& dict = actions[i]; + + const word setName(dict.lookup("name")); + const word actionName(dict.lookup("action")); + const word setType(dict.lookup("type")); + + + topoSetSource::setAction action = topoSetSource::toAction ( - setType, - mesh, - setName, - IOobject::MUST_READ + actionName ); - Info<< "Read set " << setName << " with size " - << currentSet().size() << endl; - } - - - // Handle special actions (clear, invert) locally, rest through sources. - switch (action) - { - case topoSetSource::NEW: - case topoSetSource::ADD: - case topoSetSource::DELETE: + autoPtr currentSet; + if + ( + (action == topoSetSource::NEW) + || (action == topoSetSource::CLEAR) + ) { - Info<< " Applying source " << word(dict.lookup("source")) - << endl; - autoPtr source = topoSetSource::New - ( - dict.lookup("source"), - mesh, - dict.subDict("sourceInfo") - ); - - source().applyToSet(action, currentSet()); - // Synchronize for coupled patches. - if (!noSync) currentSet().sync(mesh); - currentSet().write(); + currentSet = topoSet::New(setType, mesh, setName, 10000); + Info<< "Created set " << setName << endl; } - break; - - case topoSetSource::SUBSET: + else if (action == topoSetSource::REMOVE) { - Info<< " Applying source " << word(dict.lookup("source")) - << endl; - autoPtr source = topoSetSource::New + //? + } + else + { + currentSet = topoSet::New ( - dict.lookup("source"), + setType, mesh, - dict.subDict("sourceInfo") + setName, + IOobject::MUST_READ ); + Info<< "Read set " << setName << " with size " + << currentSet().size() << endl; + } - // Backup current set. - autoPtr oldSet - ( - topoSet::New + + + // Handle special actions (clear, invert) locally, rest through + // sources. + switch (action) + { + case topoSetSource::NEW: + case topoSetSource::ADD: + case topoSetSource::DELETE: + { + Info<< " Applying source " << word(dict.lookup("source")) + << endl; + autoPtr source = topoSetSource::New ( - setType, + dict.lookup("source"), mesh, - currentSet().name() + "_old2", - currentSet() - ) - ); + dict.subDict("sourceInfo") + ); - currentSet().clear(); - source().applyToSet(topoSetSource::NEW, currentSet()); + source().applyToSet(action, currentSet()); + // Synchronize for coupled patches. + if (!noSync) currentSet().sync(mesh); + currentSet().write(); + } + break; - // Combine new value of currentSet with old one. - currentSet().subset(oldSet()); - // Synchronize for coupled patches. - if (!noSync) currentSet().sync(mesh); - currentSet().write(); + case topoSetSource::SUBSET: + { + Info<< " Applying source " << word(dict.lookup("source")) + << endl; + autoPtr source = topoSetSource::New + ( + dict.lookup("source"), + mesh, + dict.subDict("sourceInfo") + ); + + // Backup current set. + autoPtr oldSet + ( + topoSet::New + ( + setType, + mesh, + currentSet().name() + "_old2", + currentSet() + ) + ); + + currentSet().clear(); + source().applyToSet(topoSetSource::NEW, currentSet()); + + // Combine new value of currentSet with old one. + currentSet().subset(oldSet()); + // Synchronize for coupled patches. + if (!noSync) currentSet().sync(mesh); + currentSet().write(); + } + break; + + case topoSetSource::CLEAR: + Info<< " Clearing set" << endl; + currentSet().clear(); + currentSet().write(); + break; + + case topoSetSource::INVERT: + Info<< " Inverting set" << endl; + currentSet().invert(currentSet().maxSize(mesh)); + currentSet().write(); + break; + + default: + WarningIn(args.executable()) + << "Unhandled action " << action << endl; + break; } - break; - case topoSetSource::CLEAR: - Info<< " Clearing set" << endl; - currentSet().clear(); - currentSet().write(); - break; - - case topoSetSource::INVERT: - Info<< " Inverting set" << endl; - currentSet().invert(currentSet().maxSize(mesh)); - currentSet().write(); - break; - - default: - WarningIn(args.executable()) - << "Unhandled action " << action << endl; - break; - } - - if (currentSet.valid()) - { - Info<< " Set " << currentSet().name() - << " now size " << currentSet().size() - << endl; + if (currentSet.valid()) + { + Info<< " Set " << currentSet().name() + << " now size " << currentSet().size() + << endl; + } } } diff --git a/src/OpenFOAM/db/Time/timeSelector.C b/src/OpenFOAM/db/Time/timeSelector.C index f912433bc3..2c17d11678 100644 --- a/src/OpenFOAM/db/Time/timeSelector.C +++ b/src/OpenFOAM/db/Time/timeSelector.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 @@ -51,7 +51,7 @@ bool Foam::timeSelector::selected(const instant& value) const } -Foam::List Foam::timeSelector::selected(const List& Times) const +Foam::List Foam::timeSelector::selected(const instantList& Times) const { List lst(Times.size(), false); @@ -97,19 +97,14 @@ Foam::List Foam::timeSelector::selected(const List& Times) const } -Foam::List Foam::timeSelector::select -( - const List& Times -) const +Foam::List Foam::timeSelector::select(const instantList& Times) +const { return subset(selected(Times), Times); } -void Foam::timeSelector::inplaceSelect -( - List& Times -) const +void Foam::timeSelector::inplaceSelect(instantList& Times) const { inplaceSubset(selected(Times), Times); } @@ -159,7 +154,7 @@ void Foam::timeSelector::addOptions Foam::List Foam::timeSelector::select ( - const List& timeDirs, + const instantList& timeDirs, const argList& args ) { @@ -270,4 +265,29 @@ Foam::List Foam::timeSelector::select0 } +Foam::List Foam::timeSelector::selectIfPresent +( + Time& runTime, + const argList& args +) +{ + if + ( + args.optionFound("latestTime") + || args.optionFound("time") + || args.optionFound("constant") + || args.optionFound("noZero") + || args.optionFound("zeroTime") + ) + { + return select0(runTime, args); + } + else + { + // No timeSelector option specified. Do not change runTime. + return instantList(1, instant(runTime.value(), runTime.timeName())); + } +} + + // ************************************************************************* // diff --git a/src/OpenFOAM/db/Time/timeSelector.H b/src/OpenFOAM/db/Time/timeSelector.H index 6c3ed747b1..3bfa07f47e 100644 --- a/src/OpenFOAM/db/Time/timeSelector.H +++ b/src/OpenFOAM/db/Time/timeSelector.H @@ -72,7 +72,7 @@ SourceFiles #define timeSelector_H #include "scalarRanges.H" -#include "instant.H" +#include "instantList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -109,13 +109,13 @@ public: //- Return the set of selected instants in the given list that are // within the ranges - List selected(const List&) const; + List selected(const instantList&) const; //- Select a list of Time values that are within the ranges - List select(const List&) const; + instantList select(const instantList&) const; //- Select a list of Time values that are within the ranges - void inplaceSelect(List&) const; + void inplaceSelect(instantList&) const; //- Add the options handled by timeSelector to argList::validOptions // @@ -135,15 +135,24 @@ public: ); //- Return the set of times selected based on the argList options - static List select + static instantList select ( - const List&, + const instantList&, const argList& args ); //- Return the set of times selected based on the argList options // also set the runTime to the first instance - static List select0 + static instantList select0 + ( + Time& runTime, + const argList& args + ); + + //- If any time option provided return the set of times (as select0) + // otherwise return just the current time. + // Also set the runTime to the first instance + static instantList selectIfPresent ( Time& runTime, const argList& args diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C index 48691501ee..a35de05c8c 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C +++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C @@ -85,6 +85,14 @@ Foam::dynamicCodeContext::dynamicCodeContext(const dictionary& dict) stringOps::inplaceExpand(libs_, dict); } + // optional + const entry* localPtr = dict.lookupEntryPtr("localCode", false, false); + if (localPtr) + { + localCode_ = stringOps::trim(localPtr->stream()); + stringOps::inplaceExpand(localCode_, dict); + } + // calculate SHA1 digest from include, options, localCode, code OSHA1stream os; os << include_ << options_ << libs_ << localCode_ << code_; @@ -103,14 +111,18 @@ Foam::dynamicCodeContext::dynamicCodeContext(const dictionary& dict) { addLineDirective(include_, includePtr->startLineNumber(), dict.name()); } - if (optionsPtr) - { - addLineDirective(options_, optionsPtr->startLineNumber(), dict.name()); - } + + // Do not add line directive to options_ (Make/options) since at it is a + // single line at this point. Can be fixed. + if (libsPtr) { addLineDirective(libs_, libsPtr->startLineNumber(), dict.name()); } + if (localPtr) + { + addLineDirective(localCode_, localPtr->startLineNumber(), dict.name()); + } } diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModels.C b/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModels.C index f89258586c..5b56ba374e 100644 --- a/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModels.C +++ b/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModels.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 @@ -46,6 +46,12 @@ namespace Foam gasThermoPhysics ); makeChemistryModel + ( + ODEChemistryModel, + psiChemistryModel, + constGasThermoPhysics + ); + makeChemistryModel ( ODEChemistryModel, psiChemistryModel, diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModels.C b/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModels.C index 5b2edfb004..2f5e3dd193 100644 --- a/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModels.C +++ b/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModels.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 @@ -46,6 +46,12 @@ namespace Foam gasThermoPhysics ); makeChemistryModel + ( + ODEChemistryModel, + rhoChemistryModel, + constGasThermoPhysics + ); + makeChemistryModel ( ODEChemistryModel, rhoChemistryModel, diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/chemistrySolver/makeChemistrySolvers.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/chemistrySolver/makeChemistrySolvers.C index 82b29fb37b..a4c9a2aad0 100644 --- a/src/thermophysicalModels/chemistryModel/chemistrySolver/chemistrySolver/makeChemistrySolvers.C +++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/chemistrySolver/makeChemistrySolvers.C @@ -34,8 +34,10 @@ License namespace Foam { makeChemistrySolverTypes(psiChemistryModel, gasThermoPhysics); + makeChemistrySolverTypes(psiChemistryModel, constGasThermoPhysics); makeChemistrySolverTypes(psiChemistryModel, icoPoly8ThermoPhysics); makeChemistrySolverTypes(rhoChemistryModel, gasThermoPhysics); + makeChemistrySolverTypes(rhoChemistryModel, constGasThermoPhysics); makeChemistrySolverTypes(rhoChemistryModel, icoPoly8ThermoPhysics); } diff --git a/src/thermophysicalModels/reactionThermo/chemistryReaders/chemkinReader/chemkinReader.C b/src/thermophysicalModels/reactionThermo/chemistryReaders/chemkinReader/chemkinReader.C index bc2d7d0e01..94648757fd 100644 --- a/src/thermophysicalModels/reactionThermo/chemistryReaders/chemkinReader/chemkinReader.C +++ b/src/thermophysicalModels/reactionThermo/chemistryReaders/chemkinReader/chemkinReader.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 @@ -889,12 +889,12 @@ Foam::chemkinReader::chemkinReader(const dictionary& thermoDict) fileName relPath = thermoDict.name().path(); if (relPath.size()) { - if (chemkinFile.size() && chemkinFile[0] != '/') + if (!chemkinFile.isAbsolute()) { chemkinFile = relPath/chemkinFile; } - if (thermoFile.size() && thermoFile[0] != '/') + if (!thermoFile.isAbsolute()) { thermoFile = relPath/thermoFile; }