Merge branch 'master' of /home/dm4/OpenFOAM/OpenFOAM-dev

This commit is contained in:
andy
2012-08-10 18:19:33 +01:00
42 changed files with 815 additions and 680 deletions

View File

@ -58,11 +58,15 @@ Usage
- changeDictionary [OPTION] - changeDictionary [OPTION]
\param -literalRE \n \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 \param -enableFunctionEntries \n
By default all dictionary preprocessing of fields is disabled 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" #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. // Add thisEntry to dictionary thisDict.
@ -93,7 +137,8 @@ bool addEntry
dictionary& thisDict, dictionary& thisDict,
entry& thisEntry, entry& thisEntry,
const entry& mergeEntry, const entry& mergeEntry,
const bool literalRE const bool literalRE,
const HashTable<wordList, word>& shortcuts
) )
{ {
bool changed = false; bool changed = false;
@ -108,7 +153,8 @@ bool addEntry
( (
const_cast<dictionary&>(thisEntry.dict()), const_cast<dictionary&>(thisEntry.dict()),
mergeEntry.dict(), mergeEntry.dict(),
literalRE literalRE,
shortcuts
) )
) )
{ {
@ -135,7 +181,8 @@ bool merge
( (
dictionary& thisDict, dictionary& thisDict,
const dictionary& mergeDict, const dictionary& mergeDict,
const bool literalRE const bool literalRE,
const HashTable<wordList, word>& shortcuts
) )
{ {
bool changed = false; bool changed = false;
@ -156,7 +203,7 @@ bool merge
{ {
const keyType& key = mergeIter().keyword(); const keyType& key = mergeIter().keyword();
if (literalRE || !key.isPattern()) if (literalRE || !(key.isPattern() || shortcuts.found(key)))
{ {
entry* entryPtr = thisDict.lookupEntryPtr entry* entryPtr = thisDict.lookupEntryPtr
( (
@ -179,7 +226,8 @@ bool merge
thisDict, thisDict,
*entryPtr, *entryPtr,
mergeIter(), mergeIter(),
literalRE literalRE,
shortcuts
) )
) )
{ {
@ -196,29 +244,54 @@ 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) if (!literalRE && thisKeysSet.size() > 0)
{ {
// Pick up remaining dictionary entries
wordList thisKeys(thisKeysSet.toc()); wordList thisKeys(thisKeysSet.toc());
forAllConstIter(IDLList<entry>, mergeDict, mergeIter) forAllConstIter(IDLList<entry>, mergeDict, mergeIter)
{ {
const keyType& key = mergeIter().keyword(); const keyType& key = mergeIter().keyword();
// List of indices into thisKeys
labelList matches;
if (key.isPattern()) if (key.isPattern())
{ {
// Find all matching entries in the original thisDict // Wildcard match
matches = findStrings(key, thisKeys);
labelList matches = findStrings(key, thisKeys); }
else if (shortcuts.size())
{
// See if patchGroups expand to valid thisKeys
const wordList shortcutNames = shortcuts.toc();
labelList indices = findStrings(key, shortcutNames);
forAll(indices, 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);
}
}
}
}
// Add all matches
forAll(matches, i) forAll(matches, i)
{ {
label matchI = matches[i]; const word& thisKey = thisKeys[matches[i]];
entry& thisEntry = const_cast<entry&> entry& thisEntry = const_cast<entry&>
( (
thisDict.lookupEntry(thisKeys[matchI], false, false) thisDict.lookupEntry(thisKey, false, false)
); );
if if
@ -228,7 +301,9 @@ bool merge
thisDict, thisDict,
thisEntry, thisEntry,
mergeIter(), mergeIter(),
literalRE literalRE,
HashTable<wordList, word>(0) // no shortcuts
// at deeper levels
) )
) )
{ {
@ -237,7 +312,6 @@ bool merge
} }
} }
} }
}
return changed; return changed;
} }
@ -273,6 +347,12 @@ int main(int argc, char *argv[])
"enableFunctionEntries", "enableFunctionEntries",
"enable expansion of dictionary directives - #include, #codeStream etc" "enable expansion of dictionary directives - #include, #codeStream etc"
); );
argList::addBoolOption
(
"disablePatchGroups",
"disable matching keys to patch groups"
);
#include "addRegionOption.H" #include "addRegionOption.H"
#include "setRootCase.H" #include "setRootCase.H"
@ -304,7 +384,6 @@ int main(int argc, char *argv[])
} }
const bool literalRE = args.optionFound("literalRE"); const bool literalRE = args.optionFound("literalRE");
if (literalRE) if (literalRE)
{ {
Info<< "Not interpreting any regular expressions (RE)" 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 = ""; fileName regionPrefix = "";
if (regionName != fvMesh::defaultRegion) if (regionName != fvMesh::defaultRegion)
{ {
@ -369,20 +457,12 @@ int main(int argc, char *argv[])
<< replaceDicts.toc() << endl; << replaceDicts.toc() << endl;
// Every replacement is a dictionary name and a keyword in this
forAllConstIter(dictionary, replaceDicts, fieldIter) // Always read boundary to get patch groups
{ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const word& fieldName = fieldIter().keyword();
Info<< "Replacing entries in dictionary " << fieldName << endl;
// Handle 'boundary' specially: Info<< "Reading polyMesh/boundary file to extract patch names"
// - is PtrList of dictionaries << endl;
// - is in polyMesh/
if (fieldName == "boundary")
{
Info<< "Special handling of " << fieldName
<< " as polyMesh/boundary file." << endl;
// Read PtrList of dictionary as dictionary. // Read PtrList of dictionary as dictionary.
const word oldTypeName = IOPtrList<entry>::typeName; const word oldTypeName = IOPtrList<entry>::typeName;
@ -391,15 +471,16 @@ int main(int argc, char *argv[])
( (
IOobject IOobject
( (
fieldName, "boundary",
runTime.findInstance runTime.findInstance
( (
regionPrefix/polyMesh::meshSubDir, regionPrefix/polyMesh::meshSubDir,
fieldName "boundary",
IOobject::READ_IF_PRESENT
), ),
polyMesh::meshSubDir, polyMesh::meshSubDir,
mesh, mesh,
IOobject::MUST_READ, IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE, IOobject::NO_WRITE,
false false
) )
@ -415,15 +496,52 @@ int main(int argc, char *argv[])
fieldDict.add(dictList[i].keyword(), dictList[i].dict()); fieldDict.add(dictList[i].keyword(), dictList[i].dict());
} }
Info<< "Loaded dictionary " << fieldName if (dictList.size())
{
Info<< "Loaded dictionary " << dictList.name()
<< " with entries " << fieldDict.toc() << endl; << " 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)
{
const word& fieldName = fieldIter().keyword();
Info<< "Replacing entries in dictionary " << fieldName << endl;
// Handle 'boundary' specially:
// - is PtrList of dictionaries
// - is in polyMesh/
if (fieldName == "boundary")
{
Info<< "Special handling of " << fieldName
<< " as polyMesh/boundary file." << endl;
// Get the replacement dictionary for the field // Get the replacement dictionary for the field
const dictionary& replaceDict = fieldIter().dict(); const dictionary& replaceDict = fieldIter().dict();
Info<< "Merging entries from " << replaceDict.toc() << endl; Info<< "Merging entries from " << replaceDict.toc() << endl;
// Merge the replacements in // Merge the replacements in
merge(fieldDict, replaceDict, literalRE); merge(fieldDict, replaceDict, literalRE, patchGroups);
Info<< "fieldDict:" << fieldDict << endl; Info<< "fieldDict:" << fieldDict << endl;
@ -492,7 +610,7 @@ int main(int argc, char *argv[])
Info<< "Merging entries from " << replaceDict.toc() << endl; Info<< "Merging entries from " << replaceDict.toc() << endl;
// Merge the replacements in // Merge the replacements in
merge(fieldDict, replaceDict, literalRE); merge(fieldDict, replaceDict, literalRE, patchGroups);
Info<< "Writing modified fieldDict " << fieldName << endl; Info<< "Writing modified fieldDict " << fieldName << endl;
fieldDict.regIOobject::write(); fieldDict.regIOobject::write();

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -74,13 +74,15 @@ Foam::fileName Foam::functionEntries::includeEntry::includeFileName
fileName fName(is); fileName fName(is);
fName.expand(); fName.expand();
// relative name if (fName.empty() || fName.isAbsolute())
if (!fName.isAbsolute())
{ {
fName = fileName(is.name()).path()/fName;
}
return fName; return fName;
}
else
{
// relative name
return fileName(is.name()).path()/fName;
}
} }

View File

@ -157,7 +157,7 @@ public:
//- Lookup and return all objects of the given Type //- Lookup and return all objects of the given Type
template<class Type> template<class Type>
HashTable<const Type*> lookupClass() const; HashTable<const Type*> lookupClass(const bool strict = false) const;
//- Is the named Type found? //- Is the named Type found?
template<class Type> template<class Type>

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -29,8 +29,7 @@ License
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type> template<class Type>
Foam::wordList Foam::wordList Foam::objectRegistry::names() const
Foam::objectRegistry::names() const
{ {
wordList objectNames(size()); wordList objectNames(size());
@ -50,14 +49,16 @@ Foam::objectRegistry::names() const
template<class Type> template<class Type>
Foam::HashTable<const Type*> Foam::HashTable<const Type*> Foam::objectRegistry::lookupClass
Foam::objectRegistry::lookupClass() const (
const bool strict
) const
{ {
HashTable<const Type*> objectsOfClass(size()); HashTable<const Type*> objectsOfClass(size());
for (const_iterator iter = begin(); iter != end(); ++iter) for (const_iterator iter = begin(); iter != end(); ++iter)
{ {
if (isA<Type>(*iter())) if ((strict && isType<Type>(*iter())) || isA<Type>(*iter()))
{ {
objectsOfClass.insert objectsOfClass.insert
( (

View File

@ -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
// ************************************************************************* //

View File

@ -25,50 +25,53 @@ Class
Foam::globalMeshData Foam::globalMeshData
Description Description
Various mesh related information for a parallel run. Upon construction Various mesh related information for a parallel run. Upon construction,
constructs all info by using parallel communication. constructs all info using parallel communication.
Requires: Requires:
- all processor patches to have correct ordering. - all processor patches to have correct ordering.
- all processorPatches to have their transforms set. - all processorPatches to have their transforms set.
The shared point and edge addressing is quite interesting. The shared point and edge addressing calculates addressing for points
It calculates addressing for points and edges on coupled patches. In and edges on coupled patches. In the 'old' way a distinction was made
the 'old' way a distincation was made between points/edges that are between points/edges that are only on two processors and those that are
only on two processors and those that are on multiple processors. The on multiple processors. The problem is that those on multiple processors
problem is that those on multiple processors do not allow any do not allow any transformations and require a global reduction on the
transformations and require a global reduction on the master processor. master processor.
The alternative is to have an exchange schedule (through a 'mapDistribute') The alternative is to have an exchange schedule (through a 'mapDistribute')
which sends all point/edge data (no distinction is made between 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 those on two and those on more than two coupled patches) to the local
'master'. This master then does any calculation and sends 'master'. This master then does any calculation and sends
the result back to the 'slave' points/edges. This only needs to be done 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 on points on coupled faces. Any transformation is done using a
set of transformations - since transformations have to be space filling predetermined set of transformations - since transformations have to be
only a certain number of transformation is supported. space filling only a certain number of transformation is supported.
The exchange needs The exchange needs
- a field of data - a field of data
- a mapDistribute which does all parallel exchange and transformations - 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 - a set of indices which indicate where to get untransformed data in the
field field
- a set of indices which indicate where to get transformed data in the - a set of indices which indicate where to get transformed data in the
field field
See also mapDistribute, globalIndexAndTransform Note
Notes:
- compared to 17x nTotalFaces, nTotalPoints do not compensate for - 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 - 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 - old sharedEdge calculation: currently an edge is considered shared
if it uses two shared points and is used more than once. This is not 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 correct on processor patches but it only slightly overestimates the number
of shared edges. Doing full analysis of how many patches use the edge of shared edges. Doing full analysis of how many patches use the edge
would be too complicated. would be too complicated
SeeAlso
mapDistribute
globalIndexAndTransform
SourceFiles SourceFiles
globalMeshData.C globalMeshData.C

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -31,6 +31,8 @@ Description
#include "Time.H" #include "Time.H"
#include "globalMeshData.H" #include "globalMeshData.H"
#include "pointMesh.H" #include "pointMesh.H"
#include "indexedOctree.H"
#include "treeDataCell.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@ -44,6 +46,11 @@ void Foam::polyMesh::updateMesh(const mapPolyMesh& mpm)
faceZones_.clearAddressing(); faceZones_.clearAddressing();
cellZones_.clearAddressing(); cellZones_.clearAddressing();
// Remove the stored tet base points
tetBasePtIsPtr_.clear();
// Remove the cell tree
cellTreePtr_.clear();
// Update parallel data // Update parallel data
if (globalMeshDataPtr_.valid()) if (globalMeshDataPtr_.valid())
{ {

View File

@ -110,7 +110,7 @@ class codedFixedValueFvPatchField
// Private data // Private data
//- Dictionary contents for the boundary condition //- Dictionary contents for the boundary condition
mutable dictionary dict_; const dictionary dict_;
const word redirectType_; const word redirectType_;

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2012 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -494,6 +494,13 @@ void Foam::fvMesh::mapFields(const mapPolyMesh& meshMap)
MapGeometricFields<tensor, fvsPatchField, fvMeshMapper, surfaceMesh> MapGeometricFields<tensor, fvsPatchField, fvMeshMapper, surfaceMesh>
(mapper); (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 // Map all the clouds in the objectRegistry
mapClouds(*this, meshMap); mapClouds(*this, meshMap);

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -31,6 +31,7 @@ Description
#include "MapGeometricFields.H" #include "MapGeometricFields.H"
#include "MapFvSurfaceField.H" #include "MapFvSurfaceField.H"
#include "MapFvVolField.H" #include "MapFvVolField.H"
#include "MapDimensionedFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -423,6 +423,10 @@ void Foam::Cloud<ParticleType>::autoMap
trackStartCell = 0; trackStartCell = 0;
p.cell() = 0; p.cell() = 0;
} }
else
{
p.cell() = trackStartCell;
}
vector pos = p.position(); vector pos = p.position();

View File

@ -346,7 +346,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
( (
IOobject IOobject
( (
this->name() + "UTrans", this->name() + "::UTrans",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::READ_IF_PRESENT, IOobject::READ_IF_PRESENT,
@ -362,7 +362,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
( (
IOobject IOobject
( (
this->name() + "UCoeff", this->name() + "::UCoeff",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::READ_IF_PRESENT, IOobject::READ_IF_PRESENT,
@ -426,7 +426,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
( (
IOobject IOobject
( (
this->name() + "UTrans", this->name() + "::UTrans",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -442,7 +442,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
( (
IOobject IOobject
( (
name + "UCoeff", name + "::UCoeff",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,

View File

@ -539,7 +539,7 @@ Foam::KinematicCloud<CloudType>::theta() const
( (
IOobject IOobject
( (
this->name() + "Theta", this->name() + "::theta",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -578,7 +578,7 @@ Foam::KinematicCloud<CloudType>::alpha() const
( (
IOobject IOobject
( (
this->name() + "Alpha", this->name() + "::alpha",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -615,7 +615,7 @@ Foam::KinematicCloud<CloudType>::rhoEff() const
( (
IOobject IOobject
( (
this->name() + "RhoEff", this->name() + "::rhoEff",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,

View File

@ -132,7 +132,7 @@ Foam::ReactingCloud<CloudType>::ReactingCloud
( (
IOobject IOobject
( (
this->name() + "rhoTrans_" + specieName, this->name() + "::rhoTrans_" + specieName,
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::READ_IF_PRESENT, IOobject::READ_IF_PRESENT,
@ -176,7 +176,7 @@ Foam::ReactingCloud<CloudType>::ReactingCloud
( (
IOobject IOobject
( (
this->name() + "rhoTrans_" + specieName, this->name() + "::rhoTrans_" + specieName,
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -107,7 +107,7 @@ inline Foam::tmp<Foam::fvScalarMatrix> Foam::ReactingCloud<CloudType>::SYi
( (
IOobject IOobject
( (
this->name() + "rhoTrans", this->name() + "::rhoTrans",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -155,7 +155,7 @@ Foam::ReactingCloud<CloudType>::Srho(const label i) const
( (
IOobject IOobject
( (
this->name() + "rhoTrans", this->name() + "::rhoTrans",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -192,7 +192,7 @@ Foam::ReactingCloud<CloudType>::Srho() const
( (
IOobject IOobject
( (
this->name() + "rhoTrans", this->name() + "::rhoTrans",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -236,7 +236,7 @@ Foam::ReactingCloud<CloudType>::Srho(volScalarField& rho) const
( (
IOobject IOobject
( (
this->name() + "rhoTrans", this->name() + "::rhoTrans",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,

View File

@ -278,7 +278,7 @@ inline Foam::tmp<Foam::volScalarField> Foam::ThermoCloud<CloudType>::Ep() const
( (
IOobject IOobject
( (
this->name() + "radiation::Ep", this->name() + "::radiation::Ep",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -314,7 +314,7 @@ inline Foam::tmp<Foam::volScalarField> Foam::ThermoCloud<CloudType>::ap() const
( (
IOobject IOobject
( (
this->name() + "radiation::ap", this->name() + "::radiation::ap",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,
@ -351,7 +351,7 @@ Foam::ThermoCloud<CloudType>::sigmap() const
( (
IOobject IOobject
( (
this->name() + "radiation::sigmap", this->name() + "::radiation::sigmap",
this->db().time().timeName(), this->db().time().timeName(),
this->db(), this->db(),
IOobject::NO_READ, IOobject::NO_READ,

View File

@ -294,7 +294,8 @@ Foam::InjectionModel<CloudType>::InjectionModel(CloudType& owner)
parcelBasis_(pbNumber), parcelBasis_(pbNumber),
nParticleFixed_(0.0), nParticleFixed_(0.0),
time0_(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), parcelBasis_(pbNumber),
nParticleFixed_(0.0), nParticleFixed_(0.0),
time0_(owner.db().time().value()), time0_(owner.db().time().value()),
timeStep0_(this->template getModelProperty<scalar>("timeStep0")) timeStep0_(this->template getModelProperty<scalar>("timeStep0")),
delayedVolume_(0.0)
{ {
// Provide some info // Provide some info
// - also serves to initialise mesh dimensions - needed for parallel runs // - also serves to initialise mesh dimensions - needed for parallel runs
@ -394,7 +396,8 @@ Foam::InjectionModel<CloudType>::InjectionModel
parcelBasis_(im.parcelBasis_), parcelBasis_(im.parcelBasis_),
nParticleFixed_(im.nParticleFixed_), nParticleFixed_(im.nParticleFixed_),
time0_(im.time0_), 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)) if (prepareForNextTimeStep(time, newParcels, newVolume))
{ {
newVolume += delayedVolume_;
scalar delayedVolume = 0;
const scalar trackTime = this->owner().solution().trackTime(); const scalar trackTime = this->owner().solution().trackTime();
const polyMesh& mesh = this->owner().mesh(); const polyMesh& mesh = this->owner().mesh();
typename TrackData::cloudType& cloud = td.cloud(); typename TrackData::cloudType& cloud = td.cloud();
@ -579,7 +585,7 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
pPtr->rho() pPtr->rho()
); );
if (pPtr->move(td, dt)) if ((pPtr->nParticle() >= 1.0) && (pPtr->move(td, dt)))
{ {
td.cloud().addParticle(pPtr); td.cloud().addParticle(pPtr);
massAdded += pPtr->nParticle()*pPtr->mass(); massAdded += pPtr->nParticle()*pPtr->mass();
@ -587,11 +593,14 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
} }
else else
{ {
delayedVolume += pPtr->nParticle()*pPtr->volume();
delete pPtr; delete pPtr;
} }
} }
} }
} }
delayedVolume_ = delayedVolume;
} }
postInjectCheck(parcelsAdded, massAdded); postInjectCheck(parcelsAdded, massAdded);

View File

@ -134,6 +134,10 @@ protected:
//- Time at start of injection time step [s] //- Time at start of injection time step [s]
scalar timeStep0_; scalar timeStep0_;
//- Volume that should have been injected, but would lead to
// less than 1 particle per parcel
scalar delayedVolume_;
// Protected Member Functions // Protected Member Functions

View File

@ -110,6 +110,7 @@ void reactingOneDim::updateQr()
const volScalarField kappaRad_(kappaRad()); const volScalarField kappaRad_(kappaRad());
// Propagate Qr through 1-D regions // Propagate Qr through 1-D regions
label totalFaceId = 0;
forAll(intCoupledPatchIDs_, i) forAll(intCoupledPatchIDs_, i)
{ {
const label patchI = intCoupledPatchIDs_[i]; const label patchI = intCoupledPatchIDs_[i];
@ -121,7 +122,7 @@ void reactingOneDim::updateQr()
{ {
const scalar Qr0 = Qrp[faceI]; const scalar Qr0 = Qrp[faceI];
point Cf0 = Cf[faceI]; point Cf0 = Cf[faceI];
const labelList& cells = boundaryFaceCells_[faceI]; const labelList& cells = boundaryFaceCells_[totalFaceId];
scalar kappaInt = 0.0; scalar kappaInt = 0.0;
forAll(cells, k) forAll(cells, k)
{ {
@ -132,6 +133,7 @@ void reactingOneDim::updateQr()
Qr_[cellI] = Qr0*exp(-kappaInt); Qr_[cellI] = Qr0*exp(-kappaInt);
Cf0 = Cf1; Cf0 = Cf1;
} }
totalFaceId ++;
} }
} }
@ -156,6 +158,7 @@ void reactingOneDim::updatePhiGas()
const volScalarField& HsiGas = tHsiGas(); const volScalarField& HsiGas = tHsiGas();
const volScalarField& RRiGas = tRRiGas(); const volScalarField& RRiGas = tRRiGas();
label totalFaceId = 0;
forAll(intCoupledPatchIDs_, i) forAll(intCoupledPatchIDs_, i)
{ {
const label patchI = intCoupledPatchIDs_[i]; const label patchI = intCoupledPatchIDs_[i];
@ -164,7 +167,7 @@ void reactingOneDim::updatePhiGas()
forAll(phiGasp, faceI) forAll(phiGasp, faceI)
{ {
const labelList& cells = boundaryFaceCells_[faceI]; const labelList& cells = boundaryFaceCells_[totalFaceId];
scalar massInt = 0.0; scalar massInt = 0.0;
forAllReverse(cells, k) forAllReverse(cells, k)
{ {
@ -184,6 +187,7 @@ void reactingOneDim::updatePhiGas()
<< " is : " << massInt << " is : " << massInt
<< " [kg/s] " << endl; << " [kg/s] " << endl;
} }
totalFaceId ++;
} }
} }
tHsiGas().clear(); tHsiGas().clear();
@ -232,12 +236,22 @@ void reactingOneDim::solveContinuity()
Info<< "reactingOneDim::solveContinuity()" << endl; Info<< "reactingOneDim::solveContinuity()" << endl;
} }
solve if (moveMesh_)
{
const scalarField mass0 = rho_*regionMesh().V();
fvScalarMatrix rhoEqn
( (
fvm::ddt(rho_) fvm::ddt(rho_)
== ==
- solidChemistry_->RRg() - solidChemistry_->RRg()
); );
rhoEqn.solve();
updateMesh(mass0);
}
} }
@ -261,14 +275,15 @@ void reactingOneDim::solveSpeciesMass()
solidChemistry_->RRs(i) solidChemistry_->RRs(i)
); );
if (moveMesh_) if (regionMesh().moving())
{ {
surfaceScalarField phiRhoMesh surfaceScalarField phiYiRhoMesh
( (
fvc::interpolate(Yi*rho_)*regionMesh().phi() fvc::interpolate(Yi*rho_)*regionMesh().phi()
); );
YiEqn -= fvc::div(phiRhoMesh); YiEqn += fvc::div(phiYiRhoMesh);
} }
YiEqn.solve(regionMesh().solver("Yi")); YiEqn.solve(regionMesh().solver("Yi"));
@ -303,14 +318,14 @@ void reactingOneDim::solveEnergy()
+ fvc::div(phiGas) + fvc::div(phiGas)
); );
if (moveMesh_) if (regionMesh().moving())
{ {
surfaceScalarField phiMesh surfaceScalarField phihMesh
( (
fvc::interpolate(rho_*h_)*regionMesh().phi() fvc::interpolate(rho_*h_)*regionMesh().phi()
); );
hEqn -= fvc::div(phiMesh); hEqn += fvc::div(phihMesh);
} }
hEqn.relax(); hEqn.relax();
@ -349,7 +364,18 @@ reactingOneDim::reactingOneDim(const word& modelType, const fvMesh& mesh)
pyrolysisModel(modelType, mesh), pyrolysisModel(modelType, mesh),
solidChemistry_(solidChemistryModel::New(regionMesh())), solidChemistry_(solidChemistryModel::New(regionMesh())),
solidThermo_(solidChemistry_->solid()), 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()), Ys_(solidThermo_.composition().Y()),
h_(solidThermo_.he()), h_(solidThermo_.he()),
primaryRadFluxName_(coeffs().lookupOrDefault<word>("radFluxName", "Qr")), primaryRadFluxName_(coeffs().lookupOrDefault<word>("radFluxName", "Qr")),
@ -449,7 +475,18 @@ reactingOneDim::reactingOneDim
pyrolysisModel(modelType, mesh, dict), pyrolysisModel(modelType, mesh, dict),
solidChemistry_(solidChemistryModel::New(regionMesh())), solidChemistry_(solidChemistryModel::New(regionMesh())),
solidThermo_(solidChemistry_->solid()), 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()), Ys_(solidThermo_.composition().Y()),
h_(solidThermo_.he()), h_(solidThermo_.he()),
primaryRadFluxName_(dict.lookupOrDefault<word>("radFluxName", "Qr")), primaryRadFluxName_(dict.lookupOrDefault<word>("radFluxName", "Qr")),
@ -681,17 +718,15 @@ void reactingOneDim::evolveRegion()
{ {
Info<< "\nEvolving pyrolysis in region: " << regionMesh().name() << endl; Info<< "\nEvolving pyrolysis in region: " << regionMesh().name() << endl;
const scalarField mass0 = rho_*regionMesh().V();
solidChemistry_->solve solidChemistry_->solve
( (
time().value() - time().deltaTValue(), time().value() - time().deltaTValue(),
time().deltaTValue() time().deltaTValue()
); );
solveContinuity(); calculateMassTransfer();
updateMesh(mass0); solveContinuity();
chemistrySh_ = solidChemistry_->Sh()(); chemistrySh_ = solidChemistry_->Sh()();
@ -704,9 +739,9 @@ void reactingOneDim::evolveRegion()
solveEnergy(); solveEnergy();
} }
calculateMassTransfer();
solidThermo_.correct(); solidThermo_.correct();
rho_ = solidThermo_.rho();
} }

View File

@ -84,14 +84,8 @@ protected:
// Reference to solid thermo properties // Reference to solid thermo properties
// //- Absorption coefficient [1/m]
// const volScalarField& kappaRad_;
//
// //- Thermal conductivity [W/m/K]
// const volScalarField& kappa_;
//- Density [kg/m3] //- Density [kg/m3]
volScalarField& rho_; volScalarField rho_;
//- List of solid components //- List of solid components
PtrList<volScalarField>& Ys_; PtrList<volScalarField>& Ys_;
@ -221,8 +215,8 @@ public:
//- Fields //- Fields
//- Return density [kg/m3] //- Return const density [Kg/m3]
virtual const volScalarField& rho() const; const volScalarField& rho() const;
//- Return const temperature [K] //- Return const temperature [K]
virtual const volScalarField& T() const; virtual const volScalarField& T() const;

View File

@ -117,6 +117,8 @@ void Foam::regionModels::regionModel1D::initialise()
} }
boundaryFaceOppositeFace_.setSize(localPyrolysisFaceI); boundaryFaceOppositeFace_.setSize(localPyrolysisFaceI);
boundaryFaceFaces_.setSize(localPyrolysisFaceI);
boundaryFaceCells_.setSize(localPyrolysisFaceI);
surfaceScalarField& nMagSf = nMagSfPtr_(); surfaceScalarField& nMagSf = nMagSfPtr_();
@ -192,6 +194,7 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
const polyBoundaryMesh& bm = regionMesh().boundaryMesh(); const polyBoundaryMesh& bm = regionMesh().boundaryMesh();
label totalFaceId = 0;
forAll(intCoupledPatchIDs_, localPatchI) forAll(intCoupledPatchIDs_, localPatchI)
{ {
label patchI = intCoupledPatchIDs_[localPatchI]; label patchI = intCoupledPatchIDs_[localPatchI];
@ -200,8 +203,9 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
forAll(pp, patchFaceI) forAll(pp, patchFaceI)
{ {
const labelList& faces = boundaryFaceFaces_[patchFaceI]; const labelList& faces = boundaryFaceFaces_[totalFaceId];
const labelList& cells = boundaryFaceCells_[patchFaceI]; const labelList& cells = boundaryFaceCells_[totalFaceId];
const vector n = pp.faceNormals()[patchFaceI]; const vector n = pp.faceNormals()[patchFaceI];
const vector sf = pp.faceAreas()[patchFaceI]; const vector sf = pp.faceAreas()[patchFaceI];
@ -231,7 +235,7 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
if if
( (
((nbrCf - (oldPoints[pointI] + newDelta)) & n) mag((nbrCf - (oldPoints[pointI] + newDelta)) & n)
> minDelta > minDelta
) )
{ {
@ -242,19 +246,17 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
} }
nbrCf = oldCf[i + 1] + localDelta; nbrCf = oldCf[i + 1] + localDelta;
} }
// Modify boundary // Modify boundary
const label bFaceI = boundaryFaceOppositeFace_[patchFaceI]; const label bFaceI = boundaryFaceOppositeFace_[totalFaceId];
const face f = regionMesh().faces()[bFaceI]; const face f = regionMesh().faces()[bFaceI];
const label cellI = cells[cells.size() - 1]; const label cellI = cells[cells.size() - 1];
newDelta += (deltaV[cellI]/mag(sf))*n; newDelta += (deltaV[cellI]/mag(sf))*n;
forAll(f, pti) forAll(f, pti)
{ {
const label pointI = f[pti]; const label pointI = f[pti];
if if
( (
((nbrCf - (oldPoints[pointI] + newDelta)) & n) mag((nbrCf - (oldPoints[pointI] + newDelta)) & n)
> minDelta > minDelta
) )
{ {
@ -262,9 +264,9 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
cellMoveMap[cellI] = 1; cellMoveMap[cellI] = 1;
} }
} }
totalFaceId ++;
} }
} }
// Move points // Move points
regionMesh().movePoints(newPoints); regionMesh().movePoints(newPoints);

View File

@ -28,6 +28,7 @@ License
#include "polyMesh.H" #include "polyMesh.H"
#include "polyPatch.H" #include "polyPatch.H"
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H"
#include "addToRunTimeSelectionTable.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 Foam::tmp<Foam::scalarField> Foam::sampledPatch::interpolate
( (
const interpolation<scalar>& interpolator const interpolation<scalar>& interpolator

View File

@ -87,6 +87,13 @@ class sampledPatch
const GeometricField<Type, fvPatchField, volMesh>& vField const GeometricField<Type, fvPatchField, volMesh>& vField
) const; ) const;
//- sample surface field on faces
template <class Type>
tmp<Field<Type> > sampleField
(
const GeometricField<Type, fvsPatchField, surfaceMesh>& sField
) const;
template <class Type> template <class Type>
tmp<Field<Type> > tmp<Field<Type> >
interpolateField(const interpolation<Type>&) const; interpolateField(const interpolation<Type>&) const;
@ -203,6 +210,35 @@ public:
const volTensorField& const volTensorField&
) const; ) 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 //- interpolate field on surface
virtual tmp<scalarField> interpolate virtual tmp<scalarField> interpolate

View File

@ -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> template <class Type>
Foam::tmp<Foam::Field<Type> > Foam::tmp<Foam::Field<Type> >
Foam::sampledPatch::interpolateField Foam::sampledPatch::interpolateField

View File

@ -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::tmp<Foam::Field<Foam::scalar> >
Foam::sampledSurface::project(const Field<scalar>& field) const Foam::sampledSurface::project(const Field<scalar>& field) const
{ {

View File

@ -60,6 +60,8 @@ SourceFiles
#include "runTimeSelectionTables.H" #include "runTimeSelectionTables.H"
#include "autoPtr.H" #include "autoPtr.H"
#include "volFieldsFwd.H" #include "volFieldsFwd.H"
#include "surfaceFieldsFwd.H"
#include "surfaceMesh.H"
#include "polyMesh.H" #include "polyMesh.H"
#include "coordinateSystems.H" #include "coordinateSystems.H"
#include "interpolation.H" #include "interpolation.H"
@ -355,6 +357,35 @@ public:
const volTensorField& const volTensorField&
) const = 0; ) 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 //- Interpolate field on surface
virtual tmp<scalarField> interpolate virtual tmp<scalarField> interpolate

View File

@ -95,12 +95,7 @@ Foam::sampledSurfaces::sampledSurfaces
fieldSelection_(), fieldSelection_(),
interpolationScheme_(word::null), interpolationScheme_(word::null),
mergeList_(), mergeList_(),
formatter_(NULL), formatter_(NULL)
scalarFields_(),
vectorFields_(),
sphericalTensorFields_(),
symmTensorFields_(),
tensorFields_()
{ {
if (Pstream::parRun()) if (Pstream::parRun())
{ {
@ -154,13 +149,6 @@ void Foam::sampledSurfaces::write()
{ {
if (debug) 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 " Pout<< "Creating directory "
<< outputPath_/mesh_.time().timeName() << nl << endl; << outputPath_/mesh_.time().timeName() << nl << endl;
@ -176,11 +164,19 @@ void Foam::sampledSurfaces::write()
writeGeometry(); writeGeometry();
} }
sampleAndWrite(scalarFields_); const IOobjectList objects(mesh_, mesh_.time().timeName());
sampleAndWrite(vectorFields_);
sampleAndWrite(sphericalTensorFields_); sampleAndWrite<volScalarField>(objects);
sampleAndWrite(symmTensorFields_); sampleAndWrite<volVectorField>(objects);
sampleAndWrite(tensorFields_); 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) if (surfacesFound)
{ {
dict.lookup("fields") >> fieldSelection_; dict.lookup("fields") >> fieldSelection_;
clearFieldGroups();
dict.lookup("interpolationScheme") >> interpolationScheme_; dict.lookup("interpolationScheme") >> interpolationScheme_;
const word writeType(dict.lookup("surfaceFormat")); const word writeType(dict.lookup("surfaceFormat"));

View File

@ -40,7 +40,9 @@ SourceFiles
#include "sampledSurface.H" #include "sampledSurface.H"
#include "surfaceWriter.H" #include "surfaceWriter.H"
#include "volFieldsFwd.H" #include "volFieldsFwd.H"
#include "surfaceFieldsFwd.H"
#include "wordReList.H" #include "wordReList.H"
#include "IOobjectList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -60,21 +62,6 @@ class sampledSurfaces
{ {
// Private classes // 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 used for surface merging information
class mergeInfo class mergeInfo
@ -137,35 +124,43 @@ class sampledSurfaces
//- Surface formatter //- Surface formatter
autoPtr<surfaceWriter> 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 // Private Member Functions
//- Clear old field groups
void clearFieldGroups();
//- Append fieldName to the appropriate group //- Return number of fields
label appendFieldGroup(const word& fieldName, const word& fieldType);
//- Classify field types, returns the number of fields
label classifyFields(); label classifyFields();
//- Write geometry only //- Write geometry only
void writeGeometry() const; 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 //- Sample and write a particular volume field
template<class Type> 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 //- Sample and write all the fields of the given type
template<class Type> template<class Type>
void sampleAndWrite(fieldGroup<Type>&); void sampleAndWrite(const IOobjectList& allObjects);
//- Disallow default bitwise copy construct and assignment //- Disallow default bitwise copy construct and assignment
sampledSurfaces(const sampledSurfaces&); sampledSurfaces(const sampledSurfaces&);

View File

@ -30,94 +30,22 @@ License
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * 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() Foam::label Foam::sampledSurfaces::classifyFields()
{ {
label nFields = 0;
clearFieldGroups();
// check files for a particular time // check files for a particular time
if (loadFromFiles_) if (loadFromFiles_)
{ {
IOobjectList objects(mesh_, mesh_.time().timeName()); IOobjectList objects(mesh_, mesh_.time().timeName());
wordList allFields = objects.sortedNames(); wordList allFields = objects.sortedNames();
labelList indices = findStrings(fieldSelection_, allFields); labelList indices = findStrings(fieldSelection_, allFields);
return indices.size();
forAll(indices, fieldI)
{
const word& fieldName = allFields[indices[fieldI]];
nFields += appendFieldGroup
(
fieldName,
objects.find(fieldName)()->headerClassName()
);
}
} }
else else
{ {
wordList allFields = mesh_.sortedNames(); wordList allFields = mesh_.sortedNames();
labelList indices = findStrings(fieldSelection_, allFields); labelList indices = findStrings(fieldSelection_, allFields);
return indices.size();
forAll(indices, fieldI)
{
const word& fieldName = allFields[indices[fieldI]];
nFields += appendFieldGroup
(
fieldName,
mesh_.find(fieldName)()->type()
);
} }
}
return nFields;
} }

View File

@ -25,46 +25,22 @@ License
#include "sampledSurfaces.H" #include "sampledSurfaces.H"
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H"
#include "ListListOps.H" #include "ListListOps.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
template<class Type> template<class Type>
void Foam::sampledSurfaces::sampleAndWrite void Foam::sampledSurfaces::writeSurface
( (
const GeometricField<Type, fvPatchField, volMesh>& vField const Field<Type>& values,
const label surfI,
const word& fieldName,
const fileName& outputDir
) )
{ {
// interpolator for this field
autoPtr< interpolation<Type> > interpolator;
const word& fieldName = vField.name();
const fileName outputDir = outputPath_/vField.time().timeName();
forAll(*this, surfI)
{
const sampledSurface& s = operator[](surfI); const sampledSurface& s = operator[](surfI);
Field<Type> values;
if (s.interpolate())
{
if (interpolator.empty())
{
interpolator = interpolation<Type>::New
(
interpolationScheme_,
vField
);
}
values = s.interpolate(interpolator());
}
else
{
values = s.sample(vField);
}
if (Pstream::parRun()) if (Pstream::parRun())
{ {
// Collect values from all processors // Collect values from all processors
@ -126,63 +102,102 @@ void Foam::sampledSurfaces::sampleAndWrite
); );
} }
} }
}
} }
template<class Type> template<class Type>
void Foam::sampledSurfaces::sampleAndWrite void Foam::sampledSurfaces::sampleAndWrite
( (
fieldGroup<Type>& fields const GeometricField<Type, fvPatchField, volMesh>& vField
) )
{ {
if (fields.size()) // interpolator for this field
autoPtr< interpolation<Type> > interpolator;
const word& fieldName = vField.name();
const fileName outputDir = outputPath_/vField.time().timeName();
forAll(*this, surfI)
{ {
forAll(fields, fieldI) const sampledSurface& s = operator[](surfI);
Field<Type> values;
if (s.interpolate())
{
if (interpolator.empty())
{
interpolator = interpolation<Type>::New
(
interpolationScheme_,
vField
);
}
values = s.interpolate(interpolator());
}
else
{
values = s.sample(vField);
}
writeSurface<Type>(values, surfI, fieldName, outputDir);
}
}
template<class Type>
void Foam::sampledSurfaces::sampleAndWrite
(
const GeometricField<Type, fvsPatchField, surfaceMesh>& sField
)
{
const word& fieldName = sField.name();
const fileName outputDir = outputPath_/sField.time().timeName();
forAll(*this, surfI)
{
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)
{
const wordRe field = fieldSelection_[fieldI];
if (field.match(fieldIter()->name()))
{ {
if (Pstream::master() && verbose_) if (Pstream::master() && verbose_)
{ {
Pout<< "sampleAndWrite: " << fields[fieldI] << endl; Pout<< "sampleAndWrite: " << field << endl;
} }
if (loadFromFiles_) if (loadFromFiles_)
{ {
fieldIter()->readOpt() = IOobject::MUST_READ;
sampleAndWrite sampleAndWrite
( (
GeometricField<Type, fvPatchField, volMesh> GeoField
( (
IOobject *fieldIter(),
(
fields[fieldI],
mesh_.time().timeName(),
mesh_,
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
),
mesh_ mesh_
) )
); );
} }
else else
{
objectRegistry::const_iterator iter =
mesh_.find(fields[fieldI]);
if
(
iter != objectRegistry::end()
&& iter()->type()
== GeometricField<Type, fvPatchField, volMesh>::typeName
)
{ {
sampleAndWrite sampleAndWrite
( (
mesh_.lookupObject mesh_.lookupObject<GeoField>(fieldIter()->name())
<GeometricField<Type, fvPatchField, volMesh> >
(
fields[fieldI]
)
); );
} }
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -22,6 +22,7 @@ active true;
infinitelyFastChemistryCoeffs infinitelyFastChemistryCoeffs
{ {
C 10; C 10;
semiImplicit false;
} }
// ************************************************************************* // // ************************************************************************* //

View File

@ -31,9 +31,9 @@ FoamFile
radFluxName Qr; radFluxName Qr;
minimumDelta 1e-8; minimumDelta 1e-12;
reactionDeltaMin 1e-8; reactionDeltaMin 1e-12;
moveMesh false; moveMesh false;
} }

View File

@ -33,7 +33,7 @@ fvDOMCoeffs
nPhi 3; // azimuthal angles in PI/2 on X-Y.(from Y to X) 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) nTheta 6; // polar angles in PI (from Z to X-Y plane)
convergence 1e-4; // convergence criteria for radiation iteration 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 // Number of flow iterations per radiation iteration

View File

@ -16,25 +16,25 @@ FoamFile
application fireFoam; application fireFoam;
startFrom startTime; startFrom latestTime;
startTime 0; startTime 0;
stopAt endTime; stopAt endTime;
endTime 15.0; endTime 15;
deltaT 0.03; deltaT 0.03;
writeControl adjustableRunTime; writeControl adjustableRunTime;
writeInterval 0.5; writeInterval 1
purgeWrite 0; purgeWrite 0;
writeFormat ascii; writeFormat ascii;
writePrecision 6; writePrecision 12;
writeCompression off; writeCompression off;

View File

@ -70,6 +70,7 @@ fluxRequired
{ {
default no; default no;
p_rgh; p_rgh;
phiMesh;
} }

View File

@ -32,7 +32,7 @@ solvers
relTol 0; relTol 0;
} }
rhoThermo rho
{ {
solver PCG; solver PCG;
preconditioner DIC; preconditioner DIC;

View File

@ -30,7 +30,7 @@ divSchemes
default none; default none;
div(phi,U) Gauss linear; div(phi,U) Gauss linear;
div(phi,K) 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 div(phi,Yi_h) Gauss multivariateSelection
{ {
O2 limitedLinear01 1; O2 limitedLinear01 1;

View File

@ -29,7 +29,7 @@ solvers
{ {
solver GAMG; solver GAMG;
tolerance 1e-7; tolerance 1e-7;
relTol 0.01; relTol 0.1;
smoother GaussSeidel; smoother GaussSeidel;
cacheAgglomeration true; cacheAgglomeration true;
nCellsInCoarsestLevel 10; nCellsInCoarsestLevel 10;
@ -88,7 +88,7 @@ PIMPLE
{ {
momentumPredictor yes; momentumPredictor yes;
nOuterCorrectors 1; nOuterCorrectors 1;
nCorrectors 1; nCorrectors 2;
nNonOrthogonalCorrectors 0; nNonOrthogonalCorrectors 0;
} }
@ -100,7 +100,7 @@ relaxationFactors
equations equations
{ {
"(U|k).*" 1; "(U|k).*" 1;
"(CH4|O2|H2O|CO2|h).*" 0.9; "(CH4|O2|H2O|CO2|h).*" 1;
} }
} }

View File

@ -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;
}
}
// ************************************************************************* //

View File

@ -27,7 +27,7 @@ disk1
actuationDiskSourceCoeffs actuationDiskSourceCoeffs
{ {
fieldNames (U); fieldNames (U);
diskDir (-1 0 0); // orientation of the disk diskDir (1 0 0); // orientation of the disk
Cp 0.386; // Cp Cp 0.386; // Cp
Ct 0.58; // Ct Ct 0.58; // Ct
diskArea 40; // disk area diskArea 40; // disk area
@ -47,7 +47,7 @@ disk2
actuationDiskSourceCoeffs actuationDiskSourceCoeffs
{ {
fieldNames (U); fieldNames (U);
diskDir (-1 0 0); diskDir (1 0 0);
Cp 0.53; Cp 0.53;
Ct 0.58; Ct 0.58;
diskArea 40; diskArea 40;

View File

@ -64,9 +64,9 @@ SIMPLE
residualControl residualControl
{ {
p 1e-2; p 1e-3;
U 1e-3; U 1e-4;
"(k|epsilon)" 1e-3; "(k|epsilon)" 1e-4;
} }
} }