diff --git a/applications/utilities/preProcessing/changeDictionary/changeDictionary.C b/applications/utilities/preProcessing/changeDictionary/changeDictionary.C index ac3b733b038228f347dbe2c8651e19a75a3a50fe..ad178b765cbe55713463e268b1f9463747318826 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<wordList, word> extractPatchGroups(const dictionary& boundaryDict) +{ + HashTable<wordList, word> 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<wordList, word>::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<wordList, word>& +); // 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<wordList, word>& shortcuts ) { bool changed = false; @@ -108,7 +153,8 @@ bool addEntry ( const_cast<dictionary&>(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<wordList, word>& 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,44 +244,70 @@ 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<entry>, 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 - - labelList matches = findStrings(key, thisKeys); + // Wildcard match + 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]; + const word& name = shortcutNames[indices[i]]; + const wordList& keys = shortcuts[name]; + forAll(keys, j) + { + label index = findIndex(thisKeys, keys[j]); + if (index != -1) + { + matches.append(index); + } + } + } + } - entry& thisEntry = const_cast<entry&> - ( - thisDict.lookupEntry(thisKeys[matchI], false, false) - ); + // Add all matches + forAll(matches, i) + { + const word& thisKey = thisKeys[matches[i]]; + + entry& thisEntry = const_cast<entry&> + ( + thisDict.lookupEntry(thisKey, false, false) + ); - if + if + ( + addEntry ( - addEntry - ( - thisDict, - thisEntry, - mergeIter(), - literalRE - ) + thisDict, + thisEntry, + mergeIter(), + literalRE, + HashTable<wordList, word>(0) // no shortcuts + // at deeper levels ) - { - changed = true; - } + ) + { + 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<entry>::typeName; + const_cast<word&>(IOPtrList<entry>::typeName) = word::null; + IOPtrList<entry> 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<word&>(IOPtrList<entry>::typeName) = oldTypeName; + // Fake type back to what was in field + const_cast<word&>(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<wordList, word> 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<entry>::typeName; - const_cast<word&>(IOPtrList<entry>::typeName) = word::null; - IOPtrList<entry> dictList - ( - IOobject - ( - fieldName, - runTime.findInstance - ( - regionPrefix/polyMesh::meshSubDir, - fieldName - ), - polyMesh::meshSubDir, - mesh, - IOobject::MUST_READ, - IOobject::NO_WRITE, - false - ) - ); - const_cast<word&>(IOPtrList<entry>::typeName) = oldTypeName; - // Fake type back to what was in field - const_cast<word&>(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 60478f9609df96806e1307d386b08c6404160345..eb8fd092806efafce9227f6cfd88d7a02fa72f53 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 48cabcc1cfa79c63242306fb2654e3099cecaf59..14306e41fbc8e570921706fd0b2f8682249ca5ed 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<class Type> - HashTable<const Type*> lookupClass() const; + HashTable<const Type*> lookupClass(const bool strict = false) const; //- Is the named Type found? template<class Type> diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C b/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C index eb7b8fab63469b1624bf693cf824b0ae5d4e97a2..8c1ca52cf84265a939e663b751d2f925e0a19bcf 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<class Type> -Foam::wordList -Foam::objectRegistry::names() const +Foam::wordList Foam::objectRegistry::names() const { wordList objectNames(size()); @@ -50,14 +49,16 @@ Foam::objectRegistry::names() const template<class Type> -Foam::HashTable<const Type*> -Foam::objectRegistry::lookupClass() const +Foam::HashTable<const Type*> Foam::objectRegistry::lookupClass +( + const bool strict +) const { HashTable<const Type*> objectsOfClass(size()); for (const_iterator iter = begin(); iter != end(); ++iter) { - if (isA<Type>(*iter())) + if ((strict && isType<Type>(*iter())) || isA<Type>(*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 0000000000000000000000000000000000000000..b96c6ca666c0a783bf5d7997342b9501def880bc --- /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 <http://www.gnu.org/licenses/>. + +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<class Type, class MeshMapper, class GeoMesh> +void MapDimensionedFields(const MeshMapper& mapper) +{ + typedef DimensionedField<Type, GeoMesh> FieldType; + typedef HashTable<const FieldType*> TableType; + + TableType fields(mapper.thisDb().size()); + + forAllConstIter(objectRegistry, mapper.thisDb(), iter) + { + if (isType<FieldType>(*iter())) + { + fields.insert + ( + iter()->name(), + dynamic_cast<const FieldType*>(iter()) + ); + } + } + + forAllConstIter(typename TableType, fields, fieldIter) + { + FieldType& field = const_cast<FieldType&>(*fieldIter()); + + if (&field.mesh() == &mapper.mesh()) + { + if (polyMesh::debug) + { + Info<< "Mapping " << field.typeName << ' ' << field.name() + << endl; + } + + MapInternalField<Type, MeshMapper, GeoMesh>()(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 1f9c51ac9f6a8398f913193faa6cd53e61c961d8..895daa91ab044b53ce4241d7f730a1b69220f43d 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 bba7367e8b9ba29efb752dbcdd9667fa7c659946..96dc726b44a1c2a2bb53667a99b9036dcefa712f 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 ba32afbd6346643e1e9f5bcdd80e395cd91e2e90..9723a2116af3549b3526d569ce13ac1fb0ae69d3 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 0889270894b03b7d3e63a27558fcbbd3b396f0be..95ff899be987577da368654539431426878642c0 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<tensor, fvsPatchField, fvMeshMapper, surfaceMesh> (mapper); + // Map all the dimensionedFields in the objectRegistry + MapDimensionedFields<scalar, fvMeshMapper, volMesh>(mapper); + MapDimensionedFields<vector, fvMeshMapper, volMesh>(mapper); + MapDimensionedFields<sphericalTensor, fvMeshMapper, volMesh>(mapper); + MapDimensionedFields<symmTensor, fvMeshMapper, volMesh>(mapper); + MapDimensionedFields<tensor, fvMeshMapper, volMesh>(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 3f719f18bf82208df536de22e850ae854b3233df..8ae0910b1ab6e92371653d139cf218cf6b100ebb 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 460b9650704eb369c554153fd2e78dceb823f806..d85ef08dcaf6304a0c140b58ddb6a3fc3aa07053 100644 --- a/src/lagrangian/basic/Cloud/Cloud.C +++ b/src/lagrangian/basic/Cloud/Cloud.C @@ -423,6 +423,10 @@ void Foam::Cloud<ParticleType>::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 3ca019fa4e15286e02c46ebfcf2c6e1a4fc67633..ef332fa673eaa57400ce61541a8515824b867cac 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<CloudType>::KinematicCloud ( IOobject ( - this->name() + "UTrans", + this->name() + "::UTrans", this->db().time().timeName(), this->db(), IOobject::READ_IF_PRESENT, @@ -362,7 +362,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud ( IOobject ( - this->name() + "UCoeff", + this->name() + "::UCoeff", this->db().time().timeName(), this->db(), IOobject::READ_IF_PRESENT, @@ -426,7 +426,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud ( IOobject ( - this->name() + "UTrans", + this->name() + "::UTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -442,7 +442,7 @@ Foam::KinematicCloud<CloudType>::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 106ff158a750008bcd70160bc6edc2d41e5a7866..a6bdf47cc46e750f79091d14201fad830c9e4a2a 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<CloudType>::theta() const ( IOobject ( - this->name() + "Theta", + this->name() + "::theta", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -578,7 +578,7 @@ Foam::KinematicCloud<CloudType>::alpha() const ( IOobject ( - this->name() + "Alpha", + this->name() + "::alpha", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -615,7 +615,7 @@ Foam::KinematicCloud<CloudType>::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 0f98e8b935ac00be354dda8050369c66d827faac..1bc817a4c132fa33ceea7d3bfce8eec7c678a859 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<CloudType>::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<CloudType>::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 2a9bbb2423444349e2b272de6c7085237f28acba..66cb73b85f741fbc89ad11286e8cd77ccba7bb55 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::fvScalarMatrix> Foam::ReactingCloud<CloudType>::SYi ( IOobject ( - this->name() + "rhoTrans", + this->name() + "::rhoTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -155,7 +155,7 @@ Foam::ReactingCloud<CloudType>::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<CloudType>::Srho() const ( IOobject ( - this->name() + "rhoTrans", + this->name() + "::rhoTrans", this->db().time().timeName(), this->db(), IOobject::NO_READ, @@ -236,7 +236,7 @@ Foam::ReactingCloud<CloudType>::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 764595fece7cc5be685010174f74ac0217bfe5f5..a75f1f64d861a65ec9db19a1fe9bb01399291ea8 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::volScalarField> Foam::ThermoCloud<CloudType>::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::volScalarField> Foam::ThermoCloud<CloudType>::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<CloudType>::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 a16de448b3a2a06a85930faa06e45c30c5b7a703..ff2f3a6e8413631f1ab77f893d9e2935a09dd4a7 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<CloudType>::InjectionModel(CloudType& owner) parcelBasis_(pbNumber), nParticleFixed_(0.0), time0_(0.0), - timeStep0_(this->template getModelProperty<scalar>("timeStep0")) + timeStep0_(this->template getModelProperty<scalar>("timeStep0")), + delayedVolume_(0.0) {} @@ -321,7 +322,8 @@ Foam::InjectionModel<CloudType>::InjectionModel parcelBasis_(pbNumber), nParticleFixed_(0.0), time0_(owner.db().time().value()), - timeStep0_(this->template getModelProperty<scalar>("timeStep0")) + timeStep0_(this->template getModelProperty<scalar>("timeStep0")), + delayedVolume_(0.0) { // Provide some info // - also serves to initialise mesh dimensions - needed for parallel runs @@ -394,7 +396,8 @@ Foam::InjectionModel<CloudType>::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<CloudType>::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<CloudType>::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<CloudType>::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 37e590924558d2f5e1bca629ebee9606ab4e6cf1..64e085edcc766551e98d08dee0bcf9d8837d03a7 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 65143f5d27db6a8d30eafa25fbfdab3d2749d3ed..d20552f36832c9703baa333fbd5bb4f092dddced 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<word>("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<word>("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 aa3d7baa9b6c8c9760cf32315e876fbb7829ec82..619c9c0e9aba245e105afd17199c3530db037762 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<volScalarField>& 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 372e19a3f35c3859ec70faef5b519aa96e5b202f..60243b55cdc032d6bea6d459f42d71d10ecca6cb 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::labelField> 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::labelField> 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::labelField> Foam::regionModels::regionModel1D::moveMesh if ( - ((nbrCf - (oldPoints[pointI] + newDelta)) & n) + mag((nbrCf - (oldPoints[pointI] + newDelta)) & n) > minDelta ) { @@ -242,19 +246,17 @@ Foam::tmp<Foam::labelField> 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::labelField> 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 1f8eaf9e1b699e2e2a4b925169ec87f8578b95be..da2d90c9faebd7acee8f6d0f6e4a2c975c809706 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::tensorField> Foam::sampledPatch::sample } +Foam::tmp<Foam::scalarField> Foam::sampledPatch::sample +( + const surfaceScalarField& sField +) const +{ + return sampleField(sField); +} + + +Foam::tmp<Foam::vectorField> Foam::sampledPatch::sample +( + const surfaceVectorField& sField +) const +{ + return sampleField(sField); +} + +Foam::tmp<Foam::sphericalTensorField> Foam::sampledPatch::sample +( + const surfaceSphericalTensorField& sField +) const +{ + return sampleField(sField); +} + + +Foam::tmp<Foam::symmTensorField> Foam::sampledPatch::sample +( + const surfaceSymmTensorField& sField +) const +{ + return sampleField(sField); +} + + +Foam::tmp<Foam::tensorField> Foam::sampledPatch::sample +( + const surfaceTensorField& sField +) const +{ + return sampleField(sField); +} + Foam::tmp<Foam::scalarField> Foam::sampledPatch::interpolate ( const interpolation<scalar>& interpolator diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H index 36590a747a74e0ec6aca912fcbed2414e6c5fef7..0ec8dbd89fbc77a206ff22c0833d01fc6f382f23 100644 --- a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H +++ b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H @@ -87,6 +87,13 @@ class sampledPatch const GeometricField<Type, fvPatchField, volMesh>& vField ) const; + //- sample surface field on faces + template <class Type> + tmp<Field<Type> > sampleField + ( + const GeometricField<Type, fvsPatchField, surfaceMesh>& sField + ) const; + template <class Type> tmp<Field<Type> > interpolateField(const interpolation<Type>&) const; @@ -203,6 +210,35 @@ public: const volTensorField& ) const; + //- Surface sample field on surface + virtual tmp<scalarField> sample + ( + const surfaceScalarField& + ) const; + + //- Surface Sample field on surface + virtual tmp<vectorField> sample + ( + const surfaceVectorField& + ) const; + + //- Surface sample field on surface + virtual tmp<sphericalTensorField> sample + ( + const surfaceSphericalTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp<symmTensorField> sample + ( + const surfaceSymmTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp<tensorField> sample + ( + const surfaceTensorField& + ) const; //- interpolate field on surface virtual tmp<scalarField> interpolate diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C b/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C index 47b31e97c2012367f51d189cd8cd9848b9ada957..8725f412bea741fd2dbc4252736f50560b1acfff 100644 --- a/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C +++ b/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C @@ -48,6 +48,27 @@ Foam::sampledPatch::sampleField } +template <class Type> +Foam::tmp<Foam::Field<Type> > +Foam::sampledPatch::sampleField +( + const GeometricField<Type, fvsPatchField, surfaceMesh>& sField +) const +{ + // One value per face + tmp<Field<Type> > tvalues(new Field<Type>(patchFaceLabels_.size())); + Field<Type>& values = tvalues(); + + forAll(patchFaceLabels_, i) + { + label patchI = patchIDs_[patchIndex_[i]]; + values[i] = sField.boundaryField()[patchI][patchFaceLabels_[i]]; + } + + return tvalues; +} + + template <class Type> Foam::tmp<Foam::Field<Type> > Foam::sampledPatch::interpolateField diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.C b/src/sampling/sampledSurface/sampledSurface/sampledSurface.C index 5c7c5abb90c50b43d7c66f60adff1d1f7acd323a..aaca4f087c8b4c2690b5d98af62aea43568a9703 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::scalarField> Foam::sampledSurface::sample +( + const surfaceScalarField& sField +) const +{ + notImplemented("tmp<Foam::scalarField> sampledSurface::sample"); + return tmp<scalarField>(NULL); +} + + +Foam::tmp<Foam::vectorField> Foam::sampledSurface::sample +( + const surfaceVectorField& sField +) const +{ + notImplemented("tmp<Foam::vectorField> sampledSurface::sample"); + return tmp<vectorField>(NULL); +} + +Foam::tmp<Foam::sphericalTensorField> Foam::sampledSurface::sample +( + const surfaceSphericalTensorField& sField +) const +{ + notImplemented("tmp<Foam::sphericalTensorField> sampledSurface::sample"); + return tmp<sphericalTensorField>(NULL); +} + + +Foam::tmp<Foam::symmTensorField> Foam::sampledSurface::sample +( + const surfaceSymmTensorField& sField +) const +{ + notImplemented("tmp<Foam::symmTensorField> sampledSurface::sample"); + return tmp<symmTensorField>(NULL); +} + + +Foam::tmp<Foam::tensorField> Foam::sampledSurface::sample +( + const surfaceTensorField& sField +) const +{ + notImplemented("tmp<Foam::tensorField> sampledSurface::sample"); + return tmp<tensorField>(NULL); +} + + Foam::tmp<Foam::Field<Foam::scalar> > Foam::sampledSurface::project(const Field<scalar>& field) const { diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.H b/src/sampling/sampledSurface/sampledSurface/sampledSurface.H index 8a2bfa9fed3a825a1cca460591871d45aa2cca10..2659af8f51799584f0ae2e7b758cc0660744f265 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<scalarField> sample + ( + const surfaceScalarField& + ) const; + + //- Surface Sample field on surface + virtual tmp<vectorField> sample + ( + const surfaceVectorField& + ) const; + + //- Surface sample field on surface + virtual tmp<sphericalTensorField> sample + ( + const surfaceSphericalTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp<symmTensorField> sample + ( + const surfaceSymmTensorField& + ) const; + + //- Surface sample field on surface + virtual tmp<tensorField> sample + ( + const surfaceTensorField& + ) const; //- Interpolate field on surface virtual tmp<scalarField> interpolate diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C index a8dfaebdfcf67f3fe59e09c44d98c9733b5ca657..778d33871ce6b38438605d4a7fb3aa6faff4ca7d 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_ <<nl - << "tensorFields " << tensorFields_ <<nl; - Pout<< "Creating directory " << outputPath_/mesh_.time().timeName() << nl << endl; @@ -176,11 +164,19 @@ void Foam::sampledSurfaces::write() writeGeometry(); } - sampleAndWrite(scalarFields_); - sampleAndWrite(vectorFields_); - sampleAndWrite(sphericalTensorFields_); - sampleAndWrite(symmTensorFields_); - sampleAndWrite(tensorFields_); + const IOobjectList objects(mesh_, mesh_.time().timeName()); + + sampleAndWrite<volScalarField>(objects); + sampleAndWrite<volVectorField>(objects); + sampleAndWrite<volSphericalTensorField>(objects); + sampleAndWrite<volSymmTensorField>(objects); + sampleAndWrite<volTensorField>(objects); + + sampleAndWrite<surfaceScalarField>(objects); + sampleAndWrite<surfaceVectorField>(objects); + sampleAndWrite<surfaceSphericalTensorField>(objects); + sampleAndWrite<surfaceSymmTensorField>(objects); + sampleAndWrite<surfaceTensorField>(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 0904c92ef0d835bce30ead29c2a9beeff08abd6d..ebff3bd94d8249db3fc4063dc4dc789953aea7e3 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 Type> - class fieldGroup - : - public DynamicList<word> - { - public: - - //- Construct null - fieldGroup() - : - DynamicList<word>(0) - {} - }; - //- Class used for surface merging information class mergeInfo @@ -137,35 +124,43 @@ class sampledSurfaces //- Surface formatter autoPtr<surfaceWriter> formatter_; - //- Categorized scalar/vector/tensor fields - fieldGroup<scalar> scalarFields_; - fieldGroup<vector> vectorFields_; - fieldGroup<sphericalTensor> sphericalTensorFields_; - fieldGroup<symmTensor> symmTensorFields_; - fieldGroup<tensor> 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<class Type> + void writeSurface + ( + const Field<Type>& values, + const label surfI, + const word& fieldName, + const fileName& outputDir + ); + //- Sample and write a particular volume field template<class Type> - void sampleAndWrite(const GeometricField<Type, fvPatchField, volMesh>&); + void sampleAndWrite + ( + const GeometricField<Type, fvPatchField, volMesh>& + ); + + //- Sample and write a particular surface field + template<class Type> + void sampleAndWrite + ( + const GeometricField<Type, fvsPatchField, surfaceMesh>& + ); //- Sample and write all the fields of the given type template<class Type> - void sampleAndWrite(fieldGroup<Type>&); + 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 0dda16b18011c93f400f8e7aabc2e3ee4113448e..6e67008de342e6cdd3cfaa3556e0b965e15095e5 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 78d7808d7af2cd09c5d80ddae203420eaa4a55e6..a56fcadf79df5a5065ef9484892f0e265ba18755 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<class Type> +void Foam::sampledSurfaces::writeSurface +( + const Field<Type>& values, + const label surfI, + const word& fieldName, + const fileName& outputDir +) +{ + const sampledSurface& s = operator[](surfI); + + if (Pstream::parRun()) + { + // Collect values from all processors + List<Field<Type> > gatheredValues(Pstream::nProcs()); + gatheredValues[Pstream::myProcNo()] = values; + Pstream::gatherList(gatheredValues); + + if (Pstream::master()) + { + // Combine values into single field + Field<Type> allValues + ( + ListListOps::combine<Field<Type> > + ( + gatheredValues, + accessOp<Field<Type> >() + ) + ); + + // 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<class Type> 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<Field<Type> > gatheredValues(Pstream::nProcs()); - gatheredValues[Pstream::myProcNo()] = values; - Pstream::gatherList(gatheredValues); - - if (Pstream::master()) - { - // Combine values into single field - Field<Type> allValues - ( - ListListOps::combine<Field<Type> > - ( - gatheredValues, - accessOp<Field<Type> >() - ) - ); - - // 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<Type>(values, surfI, fieldName, outputDir); } } + template<class Type> void Foam::sampledSurfaces::sampleAndWrite ( - fieldGroup<Type>& fields + const GeometricField<Type, fvsPatchField, surfaceMesh>& 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<Type> values = s.sample(sField); + writeSurface<Type>(values, surfI, fieldName, outputDir); + } +} + + +template<class GeoField> +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 (Pstream::master() && verbose_) + { + Pout<< "sampleAndWrite: " << field << endl; + } - if (loadFromFiles_) - { - sampleAndWrite - ( - GeometricField<Type, fvPatchField, volMesh> + if (loadFromFiles_) + { + fieldIter()->readOpt() = IOobject::MUST_READ; + sampleAndWrite ( - IOobject + GeoField ( - 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<Type, fvPatchField, volMesh>::typeName - ) + *fieldIter(), + mesh_ + ) + ); + } + else { - sampleAndWrite - ( - mesh_.lookupObject - <GeometricField<Type, fvPatchField, volMesh> > - ( - fields[fieldI] - ) - ); + sampleAndWrite + ( + mesh_.lookupObject<GeoField>(fieldIter()->name()) + ); } } } diff --git a/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C b/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C index 69e87fe518f7547767c7ca5c0ca591154a8215c4..e8cc1da8bc7d8fa76970f376688fccd8a4424464 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 355d1e1b36de89705c6e4bbbc83442721970e108..30c31c7471bffc10fc8a57c75bc336190538f89d 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 6253de17410b3746318fb080b1d0c4421230796d..1895f851df5b662b8e39e0b663c4b2d2e358cba1 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 ca98125036afe50f9646de87cbc321e80a75deea..df24e86f8dbf7d4d87a52a5ff8acc82de4f364c7 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 53c9826a9b9a59f5db2a3767088a8fb4ab919271..fb425995789bf14d15d5f89335a0ef39ec0064b9 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 9911bbedb397a9e40e00dbbe8fa96884a514623c..e683569e7a4ff14a8dce39837c09a946d0f1cecb 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 e1d5b8db0b76425916fc4dad9c44280d248054df..f485444f2e70136dd27b16cfc4aac18533fedcea 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 97a9f76e7207e61f25a0f31040f6de780edd5b24..e82354947c664a7c1ee03dcde3eccf8d04635878 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 6c64887a86f47a10289f4a9f6cac1af1be49fe08..829f7a4a7ac112b1bd25f30ef358e2dba5b6542a 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 061fe2b89964750c6e1964e4213be2c1cdf5825a..0000000000000000000000000000000000000000 --- 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<scalar> -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 a57b5a3b7b34398ead9e3db058e1b200e971a041..47ea4f097841f82e12de1f1ad869e49f15ec261e 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 2768f93c43803c5fc91b22517d41dae5221b8f55..0ddb5a5c7db5bb9464fa3bae0dc069451f02f089 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; } }