diff --git a/applications/utilities/preProcessing/changeDictionary/changeDictionary.C b/applications/utilities/preProcessing/changeDictionary/changeDictionary.C index ac3b733b03..ad178b765c 100644 --- a/applications/utilities/preProcessing/changeDictionary/changeDictionary.C +++ b/applications/utilities/preProcessing/changeDictionary/changeDictionary.C @@ -58,11 +58,15 @@ Usage - changeDictionary [OPTION] \param -literalRE \n - Do not interpret regular expressions; treat them as any other keyword. + Do not interpret regular expressions or patchGroups; + treat them as any other keyword. \param -enableFunctionEntries \n By default all dictionary preprocessing of fields is disabled + \param -disablePatchGroups \n + By default all keys are also checked for being patchGroups + \*---------------------------------------------------------------------------*/ #include "argList.H" @@ -84,7 +88,47 @@ namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -bool merge(dictionary&, const dictionary&, const bool); +// Extract groupPatch (= shortcut) info from boundary file info +HashTable extractPatchGroups(const dictionary& boundaryDict) +{ + HashTable groupToPatch; + + forAllConstIter(dictionary, boundaryDict, iter) + { + const word& patchName = iter().keyword(); + const dictionary& patchDict = iter().dict(); + + wordList groups; + if (patchDict.readIfPresent("inGroups", groups)) + { + forAll(groups, i) + { + HashTable::iterator fndGroup = groupToPatch.find + ( + groups[i] + ); + if (fndGroup == groupToPatch.end()) + { + groupToPatch.insert(groups[i], wordList(1, patchName)); + } + else + { + fndGroup().append(patchName); + } + } + } + } + return groupToPatch; +} + + +bool merge +( + dictionary&, + const dictionary&, + const bool, + const HashTable& +); // Add thisEntry to dictionary thisDict. @@ -93,7 +137,8 @@ bool addEntry dictionary& thisDict, entry& thisEntry, const entry& mergeEntry, - const bool literalRE + const bool literalRE, + const HashTable& shortcuts ) { bool changed = false; @@ -108,7 +153,8 @@ bool addEntry ( const_cast(thisEntry.dict()), mergeEntry.dict(), - literalRE + literalRE, + shortcuts ) ) { @@ -135,7 +181,8 @@ bool merge ( dictionary& thisDict, const dictionary& mergeDict, - const bool literalRE + const bool literalRE, + const HashTable& shortcuts ) { bool changed = false; @@ -156,7 +203,7 @@ bool merge { const keyType& key = mergeIter().keyword(); - if (literalRE || !key.isPattern()) + if (literalRE || !(key.isPattern() || shortcuts.found(key))) { entry* entryPtr = thisDict.lookupEntryPtr ( @@ -179,7 +226,8 @@ bool merge thisDict, *entryPtr, mergeIter(), - literalRE + literalRE, + shortcuts ) ) { @@ -196,46 +244,72 @@ bool merge } - // Pass 2. Wildcard matches (if any) on any non-match keys. + // Pass 2. Wildcard or shortcut matches (if any) on any non-match keys. if (!literalRE && thisKeysSet.size() > 0) { + // Pick up remaining dictionary entries wordList thisKeys(thisKeysSet.toc()); forAllConstIter(IDLList, mergeDict, mergeIter) { const keyType& key = mergeIter().keyword(); + // List of indices into thisKeys + labelList matches; + if (key.isPattern()) { - // Find all matching entries in the original thisDict + // Wildcard match + matches = findStrings(key, thisKeys); - labelList matches = findStrings(key, thisKeys); - - forAll(matches, i) + } + else if (shortcuts.size()) + { + // See if patchGroups expand to valid thisKeys + const wordList shortcutNames = shortcuts.toc(); + labelList indices = findStrings(key, shortcutNames); + forAll(indices, i) { - label matchI = matches[i]; - - entry& thisEntry = const_cast - ( - thisDict.lookupEntry(thisKeys[matchI], false, false) - ); - - if - ( - addEntry - ( - thisDict, - thisEntry, - mergeIter(), - literalRE - ) - ) + const word& name = shortcutNames[indices[i]]; + const wordList& keys = shortcuts[name]; + forAll(keys, j) { - changed = true; + label index = findIndex(thisKeys, keys[j]); + if (index != -1) + { + matches.append(index); + } } } } + + // Add all matches + forAll(matches, i) + { + const word& thisKey = thisKeys[matches[i]]; + + entry& thisEntry = const_cast + ( + thisDict.lookupEntry(thisKey, false, false) + ); + + if + ( + addEntry + ( + thisDict, + thisEntry, + mergeIter(), + literalRE, + HashTable(0) // no shortcuts + // at deeper levels + ) + ) + { + changed = true; + } + } } } @@ -273,6 +347,12 @@ int main(int argc, char *argv[]) "enableFunctionEntries", "enable expansion of dictionary directives - #include, #codeStream etc" ); + argList::addBoolOption + ( + "disablePatchGroups", + "disable matching keys to patch groups" + ); + #include "addRegionOption.H" #include "setRootCase.H" @@ -304,7 +384,6 @@ int main(int argc, char *argv[]) } const bool literalRE = args.optionFound("literalRE"); - if (literalRE) { Info<< "Not interpreting any regular expressions (RE)" @@ -328,6 +407,15 @@ int main(int argc, char *argv[]) } + const bool disablePatchGroups = args.optionFound("disablePatchGroups"); + if (disablePatchGroups) + { + Info<< "Not interpreting any keys in the changeDictionary" + << " as patchGroups" + << endl; + } + + fileName regionPrefix = ""; if (regionName != fvMesh::defaultRegion) { @@ -369,6 +457,70 @@ int main(int argc, char *argv[]) << replaceDicts.toc() << endl; + + // Always read boundary to get patch groups + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Info<< "Reading polyMesh/boundary file to extract patch names" + << endl; + + // Read PtrList of dictionary as dictionary. + const word oldTypeName = IOPtrList::typeName; + const_cast(IOPtrList::typeName) = word::null; + IOPtrList dictList + ( + IOobject + ( + "boundary", + runTime.findInstance + ( + regionPrefix/polyMesh::meshSubDir, + "boundary", + IOobject::READ_IF_PRESENT + ), + polyMesh::meshSubDir, + mesh, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE, + false + ) + ); + const_cast(IOPtrList::typeName) = oldTypeName; + // Fake type back to what was in field + const_cast(dictList.type()) = dictList.headerClassName(); + + // Temporary convert to dictionary + dictionary fieldDict; + forAll(dictList, i) + { + fieldDict.add(dictList[i].keyword(), dictList[i].dict()); + } + + if (dictList.size()) + { + Info<< "Loaded dictionary " << dictList.name() + << " with entries " << fieldDict.toc() << endl; + } + + // Extract any patchGroups information (= shortcut for set of + // patches) + HashTable patchGroups; + if (!disablePatchGroups) + { + patchGroups = extractPatchGroups(fieldDict); + if (patchGroups.size()) + { + Info<< "Extracted patch groups:" << endl; + wordList groups(patchGroups.sortedToc()); + forAll(groups, i) + { + Info<< " group " << groups[i] << " with patches " + << patchGroups[groups[i]] << endl; + } + } + } + + // Every replacement is a dictionary name and a keyword in this forAllConstIter(dictionary, replaceDicts, fieldIter) @@ -384,46 +536,12 @@ int main(int argc, char *argv[]) Info<< "Special handling of " << fieldName << " as polyMesh/boundary file." << endl; - // Read PtrList of dictionary as dictionary. - const word oldTypeName = IOPtrList::typeName; - const_cast(IOPtrList::typeName) = word::null; - IOPtrList dictList - ( - IOobject - ( - fieldName, - runTime.findInstance - ( - regionPrefix/polyMesh::meshSubDir, - fieldName - ), - polyMesh::meshSubDir, - mesh, - IOobject::MUST_READ, - IOobject::NO_WRITE, - false - ) - ); - const_cast(IOPtrList::typeName) = oldTypeName; - // Fake type back to what was in field - const_cast(dictList.type()) = dictList.headerClassName(); - - // Temporary convert to dictionary - dictionary fieldDict; - forAll(dictList, i) - { - fieldDict.add(dictList[i].keyword(), dictList[i].dict()); - } - - Info<< "Loaded dictionary " << fieldName - << " with entries " << fieldDict.toc() << endl; - // Get the replacement dictionary for the field const dictionary& replaceDict = fieldIter().dict(); Info<< "Merging entries from " << replaceDict.toc() << endl; // Merge the replacements in - merge(fieldDict, replaceDict, literalRE); + merge(fieldDict, replaceDict, literalRE, patchGroups); Info<< "fieldDict:" << fieldDict << endl; @@ -492,7 +610,7 @@ int main(int argc, char *argv[]) Info<< "Merging entries from " << replaceDict.toc() << endl; // Merge the replacements in - merge(fieldDict, replaceDict, literalRE); + merge(fieldDict, replaceDict, literalRE, patchGroups); Info<< "Writing modified fieldDict " << fieldName << endl; fieldDict.regIOobject::write(); diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C index 60478f9609..eb8fd09280 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -74,13 +74,15 @@ Foam::fileName Foam::functionEntries::includeEntry::includeFileName fileName fName(is); fName.expand(); - // relative name - if (!fName.isAbsolute()) + if (fName.empty() || fName.isAbsolute()) { - fName = fileName(is.name()).path()/fName; + return fName; + } + else + { + // relative name + return fileName(is.name()).path()/fName; } - - return fName; } diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.H b/src/OpenFOAM/db/objectRegistry/objectRegistry.H index 48cabcc1cf..14306e41fb 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.H +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.H @@ -157,7 +157,7 @@ public: //- Lookup and return all objects of the given Type template - HashTable lookupClass() const; + HashTable lookupClass(const bool strict = false) const; //- Is the named Type found? template diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C b/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C index eb7b8fab63..8c1ca52cf8 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C +++ b/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -29,8 +29,7 @@ License // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template -Foam::wordList -Foam::objectRegistry::names() const +Foam::wordList Foam::objectRegistry::names() const { wordList objectNames(size()); @@ -50,14 +49,16 @@ Foam::objectRegistry::names() const template -Foam::HashTable -Foam::objectRegistry::lookupClass() const +Foam::HashTable Foam::objectRegistry::lookupClass +( + const bool strict +) const { HashTable objectsOfClass(size()); for (const_iterator iter = begin(); iter != end(); ++iter) { - if (isA(*iter())) + if ((strict && isType(*iter())) || isA(*iter())) { objectsOfClass.insert ( diff --git a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/MapDimensionedFields.H b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/MapDimensionedFields.H new file mode 100644 index 0000000000..b96c6ca666 --- /dev/null +++ b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/MapDimensionedFields.H @@ -0,0 +1,96 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ 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 . + +Description + Generic internal field mapper for dimensioned fields. For "real" mapping, + add template specialisations for mapping of internal fields depending on + mesh type. + +\*---------------------------------------------------------------------------*/ + +#ifndef MapDimensionedFields_H +#define MapDimensionedFields_H + +#include "polyMesh.H" +#include "MapFvVolField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +template +void MapDimensionedFields(const MeshMapper& mapper) +{ + typedef DimensionedField FieldType; + typedef HashTable TableType; + + TableType fields(mapper.thisDb().size()); + + forAllConstIter(objectRegistry, mapper.thisDb(), iter) + { + if (isType(*iter())) + { + fields.insert + ( + iter()->name(), + dynamic_cast(iter()) + ); + } + } + + forAllConstIter(typename TableType, fields, fieldIter) + { + FieldType& field = const_cast(*fieldIter()); + + if (&field.mesh() == &mapper.mesh()) + { + if (polyMesh::debug) + { + Info<< "Mapping " << field.typeName << ' ' << field.name() + << endl; + } + + MapInternalField()(field, mapper); + + field.instance() = field.time().timeName(); + } + else if (polyMesh::debug) + { + Info<< "Not mapping " << field.typeName << ' ' << field.name() + << " since originating mesh differs from that of mapper." + << endl; + } + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H index 1f9c51ac9f..895daa91ab 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H @@ -25,50 +25,53 @@ Class Foam::globalMeshData Description - Various mesh related information for a parallel run. Upon construction - constructs all info by using parallel communication. + Various mesh related information for a parallel run. Upon construction, + constructs all info using parallel communication. Requires: - all processor patches to have correct ordering. - all processorPatches to have their transforms set. - The shared point and edge addressing is quite interesting. - It calculates addressing for points and edges on coupled patches. In - the 'old' way a distincation was made between points/edges that are - only on two processors and those that are on multiple processors. The - problem is that those on multiple processors do not allow any - transformations and require a global reduction on the master processor. + The shared point and edge addressing calculates addressing for points + and edges on coupled patches. In the 'old' way a distinction was made + between points/edges that are only on two processors and those that are + on multiple processors. The problem is that those on multiple processors + do not allow any transformations and require a global reduction on the + master processor. The alternative is to have an exchange schedule (through a 'mapDistribute') which sends all point/edge data (no distinction is made between those on two and those on more than two coupled patches) to the local - 'master'. This master then does any calculation and sends - the result back to the 'slave' points/edges. This only needs to be done - on points on coupled faces. Any transformation is done using a predetermined - set of transformations - since transformations have to be space filling - only a certain number of transformation is supported. + 'master'. This master then does any calculation and sends + the result back to the 'slave' points/edges. This only needs to be done + on points on coupled faces. Any transformation is done using a + predetermined set of transformations - since transformations have to be + space filling only a certain number of transformation is supported. The exchange needs - a field of data - a mapDistribute which does all parallel exchange and transformations - This appens remote data to the end of the field. + This appens remote data to the end of the field - a set of indices which indicate where to get untransformed data in the field - a set of indices which indicate where to get transformed data in the field - See also mapDistribute, globalIndexAndTransform - - Notes: +Note - compared to 17x nTotalFaces, nTotalPoints do not compensate for - shared points since this would trigger full connectivity analysis + shared points since this would trigger full connectivity analysis - most calculation is demand driven and uses parallel communication - so make sure to invoke on all processors at the same time. + so make sure to invoke on all processors at the same time - old sharedEdge calculation: currently an edge is considered shared - if it uses two shared points and is used more than once. This is not - correct on processor patches but it only slightly overestimates the number - of shared edges. Doing full analysis of how many patches use the edge - would be too complicated. + if it uses two shared points and is used more than once. This is not + correct on processor patches but it only slightly overestimates the number + of shared edges. Doing full analysis of how many patches use the edge + would be too complicated + +SeeAlso + mapDistribute + globalIndexAndTransform + SourceFiles globalMeshData.C @@ -98,7 +101,7 @@ class globalIndexAndTransform; class PackedBoolList; /*---------------------------------------------------------------------------*\ - Class globalMeshData Declaration + Class globalMeshData Declaration \*---------------------------------------------------------------------------*/ class globalMeshData diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C b/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C index bba7367e8b..96dc726b44 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C +++ b/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -31,6 +31,8 @@ Description #include "Time.H" #include "globalMeshData.H" #include "pointMesh.H" +#include "indexedOctree.H" +#include "treeDataCell.H" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // @@ -44,6 +46,11 @@ void Foam::polyMesh::updateMesh(const mapPolyMesh& mpm) faceZones_.clearAddressing(); cellZones_.clearAddressing(); + // Remove the stored tet base points + tetBasePtIsPtr_.clear(); + // Remove the cell tree + cellTreePtr_.clear(); + // Update parallel data if (globalMeshDataPtr_.valid()) { diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H index ba32afbd63..9723a2116a 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H @@ -110,7 +110,7 @@ class codedFixedValueFvPatchField // Private data //- Dictionary contents for the boundary condition - mutable dictionary dict_; + const dictionary dict_; const word redirectType_; diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C index 0889270894..95ff899be9 100644 --- a/src/finiteVolume/fvMesh/fvMesh.C +++ b/src/finiteVolume/fvMesh/fvMesh.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -494,6 +494,13 @@ void Foam::fvMesh::mapFields(const mapPolyMesh& meshMap) MapGeometricFields (mapper); + // Map all the dimensionedFields in the objectRegistry + MapDimensionedFields(mapper); + MapDimensionedFields(mapper); + MapDimensionedFields(mapper); + MapDimensionedFields(mapper); + MapDimensionedFields(mapper); + // Map all the clouds in the objectRegistry mapClouds(*this, meshMap); diff --git a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H index 3f719f18bf..8ae0910b1a 100644 --- a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H +++ b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -31,6 +31,7 @@ Description #include "MapGeometricFields.H" #include "MapFvSurfaceField.H" #include "MapFvVolField.H" +#include "MapDimensionedFields.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/basic/Cloud/Cloud.C b/src/lagrangian/basic/Cloud/Cloud.C index 460b965070..d85ef08dca 100644 --- a/src/lagrangian/basic/Cloud/Cloud.C +++ b/src/lagrangian/basic/Cloud/Cloud.C @@ -423,6 +423,10 @@ void Foam::Cloud::autoMap trackStartCell = 0; p.cell() = 0; } + else + { + p.cell() = trackStartCell; + } vector pos = p.position(); diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index 3ca019fa4e..ef332fa673 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -346,7 +346,7 @@ Foam::KinematicCloud::KinematicCloud ( IOobject ( - this->name() + "UTrans", + this->name() + "::UTrans", this->db().time().timeName(), this->db(), IOobject::READ_IF_PRESENT, @@ -362,7 +362,7 @@ Foam::KinematicCloud::KinematicCloud ( IOobject ( - this->name() + "UCoeff", + this->name() + "::UCoeff", this->db().time().timeName(), this->db(), IOobject::READ_IF_PRESENT, @@ -426,7 +426,7 @@ Foam::KinematicCloud::KinematicCloud ( IOobject ( - this->name() + "UTrans", + this->name() + "::UTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -442,7 +442,7 @@ Foam::KinematicCloud::KinematicCloud ( IOobject ( - name + "UCoeff", + name + "::UCoeff", this->db().time().timeName(), this->db(), IOobject::NO_READ, diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index 106ff158a7..a6bdf47cc4 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -539,7 +539,7 @@ Foam::KinematicCloud::theta() const ( IOobject ( - this->name() + "Theta", + this->name() + "::theta", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -578,7 +578,7 @@ Foam::KinematicCloud::alpha() const ( IOobject ( - this->name() + "Alpha", + this->name() + "::alpha", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -615,7 +615,7 @@ Foam::KinematicCloud::rhoEff() const ( IOobject ( - this->name() + "RhoEff", + this->name() + "::rhoEff", this->db().time().timeName(), this->db(), IOobject::NO_READ, diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C index 0f98e8b935..1bc817a4c1 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C @@ -132,7 +132,7 @@ Foam::ReactingCloud::ReactingCloud ( IOobject ( - this->name() + "rhoTrans_" + specieName, + this->name() + "::rhoTrans_" + specieName, this->db().time().timeName(), this->db(), IOobject::READ_IF_PRESENT, @@ -176,7 +176,7 @@ Foam::ReactingCloud::ReactingCloud ( IOobject ( - this->name() + "rhoTrans_" + specieName, + this->name() + "::rhoTrans_" + specieName, this->db().time().timeName(), this->db(), IOobject::NO_READ, diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H index 2a9bbb2423..66cb73b85f 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -107,7 +107,7 @@ inline Foam::tmp Foam::ReactingCloud::SYi ( IOobject ( - this->name() + "rhoTrans", + this->name() + "::rhoTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -155,7 +155,7 @@ Foam::ReactingCloud::Srho(const label i) const ( IOobject ( - this->name() + "rhoTrans", + this->name() + "::rhoTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -192,7 +192,7 @@ Foam::ReactingCloud::Srho() const ( IOobject ( - this->name() + "rhoTrans", + this->name() + "::rhoTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -236,7 +236,7 @@ Foam::ReactingCloud::Srho(volScalarField& rho) const ( IOobject ( - this->name() + "rhoTrans", + this->name() + "::rhoTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H index 764595fece..a75f1f64d8 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H @@ -278,7 +278,7 @@ inline Foam::tmp Foam::ThermoCloud::Ep() const ( IOobject ( - this->name() + "radiation::Ep", + this->name() + "::radiation::Ep", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -314,7 +314,7 @@ inline Foam::tmp Foam::ThermoCloud::ap() const ( IOobject ( - this->name() + "radiation::ap", + this->name() + "::radiation::ap", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -351,7 +351,7 @@ Foam::ThermoCloud::sigmap() const ( IOobject ( - this->name() + "radiation::sigmap", + this->name() + "::radiation::sigmap", this->db().time().timeName(), this->db(), IOobject::NO_READ, diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C index a16de448b3..ff2f3a6e84 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C @@ -294,7 +294,8 @@ Foam::InjectionModel::InjectionModel(CloudType& owner) parcelBasis_(pbNumber), nParticleFixed_(0.0), time0_(0.0), - timeStep0_(this->template getModelProperty("timeStep0")) + timeStep0_(this->template getModelProperty("timeStep0")), + delayedVolume_(0.0) {} @@ -321,7 +322,8 @@ Foam::InjectionModel::InjectionModel parcelBasis_(pbNumber), nParticleFixed_(0.0), time0_(owner.db().time().value()), - timeStep0_(this->template getModelProperty("timeStep0")) + timeStep0_(this->template getModelProperty("timeStep0")), + delayedVolume_(0.0) { // Provide some info // - also serves to initialise mesh dimensions - needed for parallel runs @@ -394,7 +396,8 @@ Foam::InjectionModel::InjectionModel parcelBasis_(im.parcelBasis_), nParticleFixed_(im.nParticleFixed_), time0_(im.time0_), - timeStep0_(im.timeStep0_) + timeStep0_(im.timeStep0_), + delayedVolume_(im.delayedVolume_) {} @@ -502,6 +505,9 @@ void Foam::InjectionModel::inject(TrackData& td) if (prepareForNextTimeStep(time, newParcels, newVolume)) { + newVolume += delayedVolume_; + scalar delayedVolume = 0; + const scalar trackTime = this->owner().solution().trackTime(); const polyMesh& mesh = this->owner().mesh(); typename TrackData::cloudType& cloud = td.cloud(); @@ -579,7 +585,7 @@ void Foam::InjectionModel::inject(TrackData& td) pPtr->rho() ); - if (pPtr->move(td, dt)) + if ((pPtr->nParticle() >= 1.0) && (pPtr->move(td, dt))) { td.cloud().addParticle(pPtr); massAdded += pPtr->nParticle()*pPtr->mass(); @@ -587,11 +593,14 @@ void Foam::InjectionModel::inject(TrackData& td) } else { + delayedVolume += pPtr->nParticle()*pPtr->volume(); delete pPtr; } } } } + + delayedVolume_ = delayedVolume; } postInjectCheck(parcelsAdded, massAdded); diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H index 37e5909245..64e085edcc 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H @@ -134,6 +134,10 @@ protected: //- Time at start of injection time step [s] scalar timeStep0_; + //- Volume that should have been injected, but would lead to + // less than 1 particle per parcel + scalar delayedVolume_; + // Protected Member Functions diff --git a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C index 65143f5d27..d20552f368 100644 --- a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C +++ b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C @@ -110,6 +110,7 @@ void reactingOneDim::updateQr() const volScalarField kappaRad_(kappaRad()); // Propagate Qr through 1-D regions + label totalFaceId = 0; forAll(intCoupledPatchIDs_, i) { const label patchI = intCoupledPatchIDs_[i]; @@ -121,7 +122,7 @@ void reactingOneDim::updateQr() { const scalar Qr0 = Qrp[faceI]; point Cf0 = Cf[faceI]; - const labelList& cells = boundaryFaceCells_[faceI]; + const labelList& cells = boundaryFaceCells_[totalFaceId]; scalar kappaInt = 0.0; forAll(cells, k) { @@ -132,6 +133,7 @@ void reactingOneDim::updateQr() Qr_[cellI] = Qr0*exp(-kappaInt); Cf0 = Cf1; } + totalFaceId ++; } } @@ -156,6 +158,7 @@ void reactingOneDim::updatePhiGas() const volScalarField& HsiGas = tHsiGas(); const volScalarField& RRiGas = tRRiGas(); + label totalFaceId = 0; forAll(intCoupledPatchIDs_, i) { const label patchI = intCoupledPatchIDs_[i]; @@ -164,7 +167,7 @@ void reactingOneDim::updatePhiGas() forAll(phiGasp, faceI) { - const labelList& cells = boundaryFaceCells_[faceI]; + const labelList& cells = boundaryFaceCells_[totalFaceId]; scalar massInt = 0.0; forAllReverse(cells, k) { @@ -184,6 +187,7 @@ void reactingOneDim::updatePhiGas() << " is : " << massInt << " [kg/s] " << endl; } + totalFaceId ++; } } tHsiGas().clear(); @@ -232,12 +236,22 @@ void reactingOneDim::solveContinuity() Info<< "reactingOneDim::solveContinuity()" << endl; } - solve - ( - fvm::ddt(rho_) - == - - solidChemistry_->RRg() - ); + if (moveMesh_) + { + const scalarField mass0 = rho_*regionMesh().V(); + + fvScalarMatrix rhoEqn + ( + fvm::ddt(rho_) + == + - solidChemistry_->RRg() + ); + + rhoEqn.solve(); + + updateMesh(mass0); + + } } @@ -261,14 +275,15 @@ void reactingOneDim::solveSpeciesMass() solidChemistry_->RRs(i) ); - if (moveMesh_) + if (regionMesh().moving()) { - surfaceScalarField phiRhoMesh + surfaceScalarField phiYiRhoMesh ( fvc::interpolate(Yi*rho_)*regionMesh().phi() ); - YiEqn -= fvc::div(phiRhoMesh); + YiEqn += fvc::div(phiYiRhoMesh); + } YiEqn.solve(regionMesh().solver("Yi")); @@ -303,14 +318,14 @@ void reactingOneDim::solveEnergy() + fvc::div(phiGas) ); - if (moveMesh_) + if (regionMesh().moving()) { - surfaceScalarField phiMesh + surfaceScalarField phihMesh ( fvc::interpolate(rho_*h_)*regionMesh().phi() ); - hEqn -= fvc::div(phiMesh); + hEqn += fvc::div(phihMesh); } hEqn.relax(); @@ -349,7 +364,18 @@ reactingOneDim::reactingOneDim(const word& modelType, const fvMesh& mesh) pyrolysisModel(modelType, mesh), solidChemistry_(solidChemistryModel::New(regionMesh())), solidThermo_(solidChemistry_->solid()), - rho_(solidThermo_.rho()), + rho_ + ( + IOobject + ( + "rho", + regionMesh().time().timeName(), + regionMesh(), + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + solidThermo_.rho() + ), Ys_(solidThermo_.composition().Y()), h_(solidThermo_.he()), primaryRadFluxName_(coeffs().lookupOrDefault("radFluxName", "Qr")), @@ -449,7 +475,18 @@ reactingOneDim::reactingOneDim pyrolysisModel(modelType, mesh, dict), solidChemistry_(solidChemistryModel::New(regionMesh())), solidThermo_(solidChemistry_->solid()), - rho_(solidThermo_.rho()), + rho_ + ( + IOobject + ( + "rho", + regionMesh().time().timeName(), + regionMesh(), + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + solidThermo_.rho() + ), Ys_(solidThermo_.composition().Y()), h_(solidThermo_.he()), primaryRadFluxName_(dict.lookupOrDefault("radFluxName", "Qr")), @@ -681,17 +718,15 @@ void reactingOneDim::evolveRegion() { Info<< "\nEvolving pyrolysis in region: " << regionMesh().name() << endl; - const scalarField mass0 = rho_*regionMesh().V(); - solidChemistry_->solve ( time().value() - time().deltaTValue(), time().deltaTValue() ); - solveContinuity(); + calculateMassTransfer(); - updateMesh(mass0); + solveContinuity(); chemistrySh_ = solidChemistry_->Sh()(); @@ -704,9 +739,9 @@ void reactingOneDim::evolveRegion() solveEnergy(); } - calculateMassTransfer(); - solidThermo_.correct(); + + rho_ = solidThermo_.rho(); } diff --git a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H index aa3d7baa9b..619c9c0e9a 100644 --- a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H +++ b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H @@ -84,14 +84,8 @@ protected: // Reference to solid thermo properties -// //- Absorption coefficient [1/m] -// const volScalarField& kappaRad_; -// -// //- Thermal conductivity [W/m/K] -// const volScalarField& kappa_; - //- Density [kg/m3] - volScalarField& rho_; + volScalarField rho_; //- List of solid components PtrList& Ys_; @@ -221,8 +215,8 @@ public: //- Fields - //- Return density [kg/m3] - virtual const volScalarField& rho() const; + //- Return const density [Kg/m3] + const volScalarField& rho() const; //- Return const temperature [K] virtual const volScalarField& T() const; diff --git a/src/regionModels/regionModel/regionModel1D/regionModel1D.C b/src/regionModels/regionModel/regionModel1D/regionModel1D.C index 372e19a3f3..60243b55cd 100644 --- a/src/regionModels/regionModel/regionModel1D/regionModel1D.C +++ b/src/regionModels/regionModel/regionModel1D/regionModel1D.C @@ -117,6 +117,8 @@ void Foam::regionModels::regionModel1D::initialise() } boundaryFaceOppositeFace_.setSize(localPyrolysisFaceI); + boundaryFaceFaces_.setSize(localPyrolysisFaceI); + boundaryFaceCells_.setSize(localPyrolysisFaceI); surfaceScalarField& nMagSf = nMagSfPtr_(); @@ -192,6 +194,7 @@ Foam::tmp Foam::regionModels::regionModel1D::moveMesh const polyBoundaryMesh& bm = regionMesh().boundaryMesh(); + label totalFaceId = 0; forAll(intCoupledPatchIDs_, localPatchI) { label patchI = intCoupledPatchIDs_[localPatchI]; @@ -200,8 +203,9 @@ Foam::tmp Foam::regionModels::regionModel1D::moveMesh forAll(pp, patchFaceI) { - const labelList& faces = boundaryFaceFaces_[patchFaceI]; - const labelList& cells = boundaryFaceCells_[patchFaceI]; + const labelList& faces = boundaryFaceFaces_[totalFaceId]; + const labelList& cells = boundaryFaceCells_[totalFaceId]; + const vector n = pp.faceNormals()[patchFaceI]; const vector sf = pp.faceAreas()[patchFaceI]; @@ -231,7 +235,7 @@ Foam::tmp Foam::regionModels::regionModel1D::moveMesh if ( - ((nbrCf - (oldPoints[pointI] + newDelta)) & n) + mag((nbrCf - (oldPoints[pointI] + newDelta)) & n) > minDelta ) { @@ -242,19 +246,17 @@ Foam::tmp Foam::regionModels::regionModel1D::moveMesh } nbrCf = oldCf[i + 1] + localDelta; } - // Modify boundary - const label bFaceI = boundaryFaceOppositeFace_[patchFaceI]; + const label bFaceI = boundaryFaceOppositeFace_[totalFaceId]; const face f = regionMesh().faces()[bFaceI]; const label cellI = cells[cells.size() - 1]; newDelta += (deltaV[cellI]/mag(sf))*n; forAll(f, pti) { const label pointI = f[pti]; - if ( - ((nbrCf - (oldPoints[pointI] + newDelta)) & n) + mag((nbrCf - (oldPoints[pointI] + newDelta)) & n) > minDelta ) { @@ -262,9 +264,9 @@ Foam::tmp Foam::regionModels::regionModel1D::moveMesh cellMoveMap[cellI] = 1; } } + totalFaceId ++; } } - // Move points regionMesh().movePoints(newPoints); diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatch.C b/src/sampling/sampledSurface/sampledPatch/sampledPatch.C index 1f8eaf9e1b..da2d90c9fa 100644 --- a/src/sampling/sampledSurface/sampledPatch/sampledPatch.C +++ b/src/sampling/sampledSurface/sampledPatch/sampledPatch.C @@ -28,6 +28,7 @@ License #include "polyMesh.H" #include "polyPatch.H" #include "volFields.H" +#include "surfaceFields.H" #include "addToRunTimeSelectionTable.H" @@ -274,6 +275,49 @@ Foam::tmp Foam::sampledPatch::sample } +Foam::tmp Foam::sampledPatch::sample +( + const surfaceScalarField& sField +) const +{ + return sampleField(sField); +} + + +Foam::tmp Foam::sampledPatch::sample +( + const surfaceVectorField& sField +) const +{ + return sampleField(sField); +} + +Foam::tmp Foam::sampledPatch::sample +( + const surfaceSphericalTensorField& sField +) const +{ + return sampleField(sField); +} + + +Foam::tmp Foam::sampledPatch::sample +( + const surfaceSymmTensorField& sField +) const +{ + return sampleField(sField); +} + + +Foam::tmp Foam::sampledPatch::sample +( + const surfaceTensorField& sField +) const +{ + return sampleField(sField); +} + Foam::tmp Foam::sampledPatch::interpolate ( const interpolation& interpolator diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H index 36590a747a..0ec8dbd89f 100644 --- a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H +++ b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H @@ -87,6 +87,13 @@ class sampledPatch const GeometricField& vField ) const; + //- sample surface field on faces + template + tmp > sampleField + ( + const GeometricField& sField + ) const; + template tmp > interpolateField(const interpolation&) const; @@ -203,6 +210,35 @@ public: const volTensorField& ) const; + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceScalarField& + ) const; + + //- Surface Sample field on surface + virtual tmp sample + ( + const surfaceVectorField& + ) const; + + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceSphericalTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceSymmTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceTensorField& + ) const; //- interpolate field on surface virtual tmp interpolate diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C b/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C index 47b31e97c2..8725f412be 100644 --- a/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C +++ b/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C @@ -48,6 +48,27 @@ Foam::sampledPatch::sampleField } +template +Foam::tmp > +Foam::sampledPatch::sampleField +( + const GeometricField& sField +) const +{ + // One value per face + tmp > tvalues(new Field(patchFaceLabels_.size())); + Field& values = tvalues(); + + forAll(patchFaceLabels_, i) + { + label patchI = patchIDs_[patchIndex_[i]]; + values[i] = sField.boundaryField()[patchI][patchFaceLabels_[i]]; + } + + return tvalues; +} + + template Foam::tmp > Foam::sampledPatch::interpolateField diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.C b/src/sampling/sampledSurface/sampledSurface/sampledSurface.C index 5c7c5abb90..aaca4f087c 100644 --- a/src/sampling/sampledSurface/sampledSurface/sampledSurface.C +++ b/src/sampling/sampledSurface/sampledSurface/sampledSurface.C @@ -240,6 +240,55 @@ Foam::scalar Foam::sampledSurface::area() const } +Foam::tmp Foam::sampledSurface::sample +( + const surfaceScalarField& sField +) const +{ + notImplemented("tmp sampledSurface::sample"); + return tmp(NULL); +} + + +Foam::tmp Foam::sampledSurface::sample +( + const surfaceVectorField& sField +) const +{ + notImplemented("tmp sampledSurface::sample"); + return tmp(NULL); +} + +Foam::tmp Foam::sampledSurface::sample +( + const surfaceSphericalTensorField& sField +) const +{ + notImplemented("tmp sampledSurface::sample"); + return tmp(NULL); +} + + +Foam::tmp Foam::sampledSurface::sample +( + const surfaceSymmTensorField& sField +) const +{ + notImplemented("tmp sampledSurface::sample"); + return tmp(NULL); +} + + +Foam::tmp Foam::sampledSurface::sample +( + const surfaceTensorField& sField +) const +{ + notImplemented("tmp sampledSurface::sample"); + return tmp(NULL); +} + + Foam::tmp > Foam::sampledSurface::project(const Field& field) const { diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.H b/src/sampling/sampledSurface/sampledSurface/sampledSurface.H index 8a2bfa9fed..2659af8f51 100644 --- a/src/sampling/sampledSurface/sampledSurface/sampledSurface.H +++ b/src/sampling/sampledSurface/sampledSurface/sampledSurface.H @@ -60,6 +60,8 @@ SourceFiles #include "runTimeSelectionTables.H" #include "autoPtr.H" #include "volFieldsFwd.H" +#include "surfaceFieldsFwd.H" +#include "surfaceMesh.H" #include "polyMesh.H" #include "coordinateSystems.H" #include "interpolation.H" @@ -355,6 +357,35 @@ public: const volTensorField& ) const = 0; + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceScalarField& + ) const; + + //- Surface Sample field on surface + virtual tmp sample + ( + const surfaceVectorField& + ) const; + + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceSphericalTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceSymmTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp sample + ( + const surfaceTensorField& + ) const; //- Interpolate field on surface virtual tmp interpolate diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C index a8dfaebdfc..778d33871c 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C @@ -95,12 +95,7 @@ Foam::sampledSurfaces::sampledSurfaces fieldSelection_(), interpolationScheme_(word::null), mergeList_(), - formatter_(NULL), - scalarFields_(), - vectorFields_(), - sphericalTensorFields_(), - symmTensorFields_(), - tensorFields_() + formatter_(NULL) { if (Pstream::parRun()) { @@ -154,13 +149,6 @@ void Foam::sampledSurfaces::write() { if (debug) { - Pout<< "timeName = " << mesh_.time().timeName() << nl - << "scalarFields " << scalarFields_ << nl - << "vectorFields " << vectorFields_ << nl - << "sphTensorFields " << sphericalTensorFields_ << nl - << "symTensorFields " << symmTensorFields_ <(objects); + sampleAndWrite(objects); + sampleAndWrite(objects); + sampleAndWrite(objects); + sampleAndWrite(objects); + + sampleAndWrite(objects); + sampleAndWrite(objects); + sampleAndWrite(objects); + sampleAndWrite(objects); + sampleAndWrite(objects); } } @@ -192,7 +188,6 @@ void Foam::sampledSurfaces::read(const dictionary& dict) if (surfacesFound) { dict.lookup("fields") >> fieldSelection_; - clearFieldGroups(); dict.lookup("interpolationScheme") >> interpolationScheme_; const word writeType(dict.lookup("surfaceFormat")); diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H index 0904c92ef0..ebff3bd94d 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H @@ -40,7 +40,9 @@ SourceFiles #include "sampledSurface.H" #include "surfaceWriter.H" #include "volFieldsFwd.H" +#include "surfaceFieldsFwd.H" #include "wordReList.H" +#include "IOobjectList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -60,21 +62,6 @@ class sampledSurfaces { // Private classes - //- Class used for grouping field types - template - class fieldGroup - : - public DynamicList - { - public: - - //- Construct null - fieldGroup() - : - DynamicList(0) - {} - }; - //- Class used for surface merging information class mergeInfo @@ -137,35 +124,43 @@ class sampledSurfaces //- Surface formatter autoPtr formatter_; - //- Categorized scalar/vector/tensor fields - fieldGroup scalarFields_; - fieldGroup vectorFields_; - fieldGroup sphericalTensorFields_; - fieldGroup symmTensorFields_; - fieldGroup tensorFields_; - // Private Member Functions - //- Clear old field groups - void clearFieldGroups(); - //- Append fieldName to the appropriate group - label appendFieldGroup(const word& fieldName, const word& fieldType); - - //- Classify field types, returns the number of fields + //- Return number of fields label classifyFields(); //- Write geometry only void writeGeometry() const; + //- Write sampled fieldName on surface and on outputDir path + template + void writeSurface + ( + const Field& values, + const label surfI, + const word& fieldName, + const fileName& outputDir + ); + //- Sample and write a particular volume field template - void sampleAndWrite(const GeometricField&); + void sampleAndWrite + ( + const GeometricField& + ); + + //- Sample and write a particular surface field + template + void sampleAndWrite + ( + const GeometricField& + ); //- Sample and write all the fields of the given type template - void sampleAndWrite(fieldGroup&); + void sampleAndWrite(const IOobjectList& allObjects); //- Disallow default bitwise copy construct and assignment sampledSurfaces(const sampledSurfaces&); diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C index 0dda16b180..6e67008de3 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C @@ -30,94 +30,22 @@ License // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::sampledSurfaces::clearFieldGroups() -{ - scalarFields_.clear(); - vectorFields_.clear(); - sphericalTensorFields_.clear(); - symmTensorFields_.clear(); - tensorFields_.clear(); -} - - -Foam::label Foam::sampledSurfaces::appendFieldGroup -( - const word& fieldName, - const word& fieldType -) -{ - if (fieldType == volScalarField::typeName) - { - scalarFields_.append(fieldName); - return 1; - } - else if (fieldType == volVectorField::typeName) - { - vectorFields_.append(fieldName); - return 1; - } - else if (fieldType == volSphericalTensorField::typeName) - { - sphericalTensorFields_.append(fieldName); - return 1; - } - else if (fieldType == volSymmTensorField::typeName) - { - symmTensorFields_.append(fieldName); - return 1; - } - else if (fieldType == volTensorField::typeName) - { - tensorFields_.append(fieldName); - return 1; - } - - return 0; -} - - Foam::label Foam::sampledSurfaces::classifyFields() { - label nFields = 0; - clearFieldGroups(); - - // check files for a particular time + // check files for a particular time if (loadFromFiles_) { IOobjectList objects(mesh_, mesh_.time().timeName()); wordList allFields = objects.sortedNames(); - labelList indices = findStrings(fieldSelection_, allFields); - - forAll(indices, fieldI) - { - const word& fieldName = allFields[indices[fieldI]]; - - nFields += appendFieldGroup - ( - fieldName, - objects.find(fieldName)()->headerClassName() - ); - } + return indices.size(); } else { wordList allFields = mesh_.sortedNames(); labelList indices = findStrings(fieldSelection_, allFields); - - forAll(indices, fieldI) - { - const word& fieldName = allFields[indices[fieldI]]; - - nFields += appendFieldGroup - ( - fieldName, - mesh_.find(fieldName)()->type() - ); - } + return indices.size(); } - - return nFields; } diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C index 78d7808d7a..a56fcadf79 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C @@ -25,10 +25,86 @@ License #include "sampledSurfaces.H" #include "volFields.H" +#include "surfaceFields.H" #include "ListListOps.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // +template +void Foam::sampledSurfaces::writeSurface +( + const Field& values, + const label surfI, + const word& fieldName, + const fileName& outputDir +) +{ + const sampledSurface& s = operator[](surfI); + + if (Pstream::parRun()) + { + // Collect values from all processors + List > gatheredValues(Pstream::nProcs()); + gatheredValues[Pstream::myProcNo()] = values; + Pstream::gatherList(gatheredValues); + + if (Pstream::master()) + { + // Combine values into single field + Field allValues + ( + ListListOps::combine > + ( + gatheredValues, + accessOp >() + ) + ); + + // Renumber (point data) to correspond to merged points + if (mergeList_[surfI].pointsMap.size() == allValues.size()) + { + inplaceReorder(mergeList_[surfI].pointsMap, allValues); + allValues.setSize(mergeList_[surfI].points.size()); + } + + // Write to time directory under outputPath_ + // skip surface without faces (eg, a failed cut-plane) + if (mergeList_[surfI].faces.size()) + { + formatter_->write + ( + outputDir, + s.name(), + mergeList_[surfI].points, + mergeList_[surfI].faces, + fieldName, + allValues, + s.interpolate() + ); + } + } + } + else + { + // Write to time directory under outputPath_ + // skip surface without faces (eg, a failed cut-plane) + if (s.faces().size()) + { + formatter_->write + ( + outputDir, + s.name(), + s.points(), + s.faces(), + fieldName, + values, + s.interpolate() + ); + } + } +} + + template void Foam::sampledSurfaces::sampleAndWrite ( @@ -65,125 +141,64 @@ void Foam::sampledSurfaces::sampleAndWrite values = s.sample(vField); } - if (Pstream::parRun()) - { - // Collect values from all processors - List > gatheredValues(Pstream::nProcs()); - gatheredValues[Pstream::myProcNo()] = values; - Pstream::gatherList(gatheredValues); - - if (Pstream::master()) - { - // Combine values into single field - Field allValues - ( - ListListOps::combine > - ( - gatheredValues, - accessOp >() - ) - ); - - // Renumber (point data) to correspond to merged points - if (mergeList_[surfI].pointsMap.size() == allValues.size()) - { - inplaceReorder(mergeList_[surfI].pointsMap, allValues); - allValues.setSize(mergeList_[surfI].points.size()); - } - - // Write to time directory under outputPath_ - // skip surface without faces (eg, a failed cut-plane) - if (mergeList_[surfI].faces.size()) - { - formatter_->write - ( - outputDir, - s.name(), - mergeList_[surfI].points, - mergeList_[surfI].faces, - fieldName, - allValues, - s.interpolate() - ); - } - } - } - else - { - // Write to time directory under outputPath_ - // skip surface without faces (eg, a failed cut-plane) - if (s.faces().size()) - { - formatter_->write - ( - outputDir, - s.name(), - s.points(), - s.faces(), - fieldName, - values, - s.interpolate() - ); - } - } + writeSurface(values, surfI, fieldName, outputDir); } } + template void Foam::sampledSurfaces::sampleAndWrite ( - fieldGroup& fields + const GeometricField& sField ) { - if (fields.size()) + const word& fieldName = sField.name(); + const fileName outputDir = outputPath_/sField.time().timeName(); + + forAll(*this, surfI) { - forAll(fields, fieldI) + const sampledSurface& s = operator[](surfI); + Field values = s.sample(sField); + writeSurface(values, surfI, fieldName, outputDir); + } +} + + +template +void Foam::sampledSurfaces::sampleAndWrite(const IOobjectList& allObjects) +{ + IOobjectList fields = allObjects.lookupClass(GeoField::typeName); + forAllConstIter(IOobjectList, fields, fieldIter) + { + forAll (fieldSelection_, fieldI) { - if (Pstream::master() && verbose_) + const wordRe field = fieldSelection_[fieldI]; + if (field.match(fieldIter()->name())) { - Pout<< "sampleAndWrite: " << fields[fieldI] << endl; - } - - if (loadFromFiles_) - { - sampleAndWrite - ( - GeometricField - ( - IOobject - ( - fields[fieldI], - mesh_.time().timeName(), - mesh_, - IOobject::MUST_READ, - IOobject::NO_WRITE, - false - ), - mesh_ - ) - ); - } - else - { - objectRegistry::const_iterator iter = - mesh_.find(fields[fieldI]); - - if - ( - iter != objectRegistry::end() - && iter()->type() - == GeometricField::typeName - ) + if (Pstream::master() && verbose_) { - sampleAndWrite - ( - mesh_.lookupObject - > - ( - fields[fieldI] - ) - ); + Pout<< "sampleAndWrite: " << field << endl; + } + + if (loadFromFiles_) + { + fieldIter()->readOpt() = IOobject::MUST_READ; + sampleAndWrite + ( + GeoField + ( + *fieldIter(), + mesh_ + ) + ); + } + else + { + sampleAndWrite + ( + mesh_.lookupObject(fieldIter()->name()) + ); } } } diff --git a/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C b/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C index 69e87fe518..e8cc1da8bc 100644 --- a/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C +++ b/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties index 355d1e1b36..30c31c7471 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties +++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties @@ -22,6 +22,7 @@ active true; infinitelyFastChemistryCoeffs { C 10; + semiImplicit false; } // ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones index 6253de1741..1895f851df 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones +++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones @@ -31,9 +31,9 @@ FoamFile radFluxName Qr; - minimumDelta 1e-8; + minimumDelta 1e-12; - reactionDeltaMin 1e-8; + reactionDeltaMin 1e-12; moveMesh false; } diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties index ca98125036..df24e86f8d 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties +++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties @@ -33,7 +33,7 @@ fvDOMCoeffs nPhi 3; // azimuthal angles in PI/2 on X-Y.(from Y to X) nTheta 6; // polar angles in PI (from Z to X-Y plane) convergence 1e-4; // convergence criteria for radiation iteration - maxIter 4; // maximum number of iterations + maxIter 2; // maximum number of iterations } // Number of flow iterations per radiation iteration diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict index 53c9826a9b..fb42599578 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict +++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict @@ -16,25 +16,25 @@ FoamFile application fireFoam; -startFrom startTime; +startFrom latestTime; startTime 0; stopAt endTime; -endTime 15.0; +endTime 15; deltaT 0.03; writeControl adjustableRunTime; -writeInterval 0.5; +writeInterval 1 purgeWrite 0; writeFormat ascii; -writePrecision 6; +writePrecision 12; writeCompression off; diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes index 9911bbedb3..e683569e7a 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes +++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes @@ -70,6 +70,7 @@ fluxRequired { default no; p_rgh; + phiMesh; } diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution index e1d5b8db0b..f485444f2e 100644 --- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution +++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution @@ -32,7 +32,7 @@ solvers relTol 0; } - rhoThermo + rho { solver PCG; preconditioner DIC; diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes index 97a9f76e72..e82354947c 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes +++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes @@ -30,7 +30,7 @@ divSchemes default none; div(phi,U) Gauss linear; div(phi,K) Gauss linear; - div(phi,k) Gauss limitedLinear 0.1; + div(phi,k) Gauss limitedLinear 1; div(phi,Yi_h) Gauss multivariateSelection { O2 limitedLinear01 1; diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution index 6c64887a86..829f7a4a7a 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution +++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution @@ -29,7 +29,7 @@ solvers { solver GAMG; tolerance 1e-7; - relTol 0.01; + relTol 0.1; smoother GaussSeidel; cacheAgglomeration true; nCellsInCoarsestLevel 10; @@ -88,7 +88,7 @@ PIMPLE { momentumPredictor yes; nOuterCorrectors 1; - nCorrectors 1; + nCorrectors 2; nNonOrthogonalCorrectors 0; } @@ -100,7 +100,7 @@ relaxationFactors equations { "(U|k).*" 1; - "(CH4|O2|H2O|CO2|h).*" 0.9; + "(CH4|O2|H2O|CO2|h).*" 1; } } diff --git a/tutorials/compressible/rhoCentralFoam/forwardStep/0/Ma b/tutorials/compressible/rhoCentralFoam/forwardStep/0/Ma deleted file mode 100644 index 061fe2b899..0000000000 --- a/tutorials/compressible/rhoCentralFoam/forwardStep/0/Ma +++ /dev/null @@ -1,264 +0,0 @@ -/*--------------------------------*- C++ -*----------------------------------*\ -| ========= | | -| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: dev | -| \\ / A nd | Web: www.OpenFOAM.org | -| \\/ M anipulation | | -\*---------------------------------------------------------------------------*/ -FoamFile -{ - version 2.0; - format ascii; - class volScalarField; - object Ma; -} -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -dimensions [0 0 0 0 0 0 0]; - -internalField uniform 3; - -boundaryField -{ - inlet - { - type calculated; - value uniform 3; - } - outlet - { - type calculated; - value uniform 3; - } - bottom - { - type symmetryPlane; - } - top - { - type symmetryPlane; - } - obstacle - { - type calculated; - value nonuniform List -208 -( -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -) -; - } - defaultFaces - { - type empty; - } -} - -// ************************************************************************* // diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties b/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties index a57b5a3b7b..47ea4f0978 100644 --- a/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties +++ b/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties @@ -27,7 +27,7 @@ disk1 actuationDiskSourceCoeffs { fieldNames (U); - diskDir (-1 0 0); // orientation of the disk + diskDir (1 0 0); // orientation of the disk Cp 0.386; // Cp Ct 0.58; // Ct diskArea 40; // disk area @@ -47,7 +47,7 @@ disk2 actuationDiskSourceCoeffs { fieldNames (U); - diskDir (-1 0 0); + diskDir (1 0 0); Cp 0.53; Ct 0.58; diskArea 40; diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution b/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution index 2768f93c43..0ddb5a5c7d 100644 --- a/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution +++ b/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution @@ -64,9 +64,9 @@ SIMPLE residualControl { - p 1e-2; - U 1e-3; - "(k|epsilon)" 1e-3; + p 1e-3; + U 1e-4; + "(k|epsilon)" 1e-4; } }