mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge branch 'master' of /home/dm4/OpenFOAM/OpenFOAM-dev
This commit is contained in:
@ -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,46 +244,72 @@ bool merge
|
||||
}
|
||||
|
||||
|
||||
// Pass 2. Wildcard matches (if any) on any non-match keys.
|
||||
// Pass 2. Wildcard or shortcut matches (if any) on any non-match keys.
|
||||
|
||||
if (!literalRE && thisKeysSet.size() > 0)
|
||||
{
|
||||
// Pick up remaining dictionary entries
|
||||
wordList thisKeys(thisKeysSet.toc());
|
||||
|
||||
forAllConstIter(IDLList<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
|
||||
// Wildcard match
|
||||
matches = findStrings(key, thisKeys);
|
||||
|
||||
labelList matches = findStrings(key, thisKeys);
|
||||
|
||||
forAll(matches, i)
|
||||
}
|
||||
else if (shortcuts.size())
|
||||
{
|
||||
// See if patchGroups expand to valid thisKeys
|
||||
const wordList shortcutNames = shortcuts.toc();
|
||||
labelList indices = findStrings(key, shortcutNames);
|
||||
forAll(indices, i)
|
||||
{
|
||||
label matchI = matches[i];
|
||||
|
||||
entry& thisEntry = const_cast<entry&>
|
||||
(
|
||||
thisDict.lookupEntry(thisKeys[matchI], false, false)
|
||||
);
|
||||
|
||||
if
|
||||
(
|
||||
addEntry
|
||||
(
|
||||
thisDict,
|
||||
thisEntry,
|
||||
mergeIter(),
|
||||
literalRE
|
||||
)
|
||||
)
|
||||
const word& name = shortcutNames[indices[i]];
|
||||
const wordList& keys = shortcuts[name];
|
||||
forAll(keys, j)
|
||||
{
|
||||
changed = true;
|
||||
label index = findIndex(thisKeys, keys[j]);
|
||||
if (index != -1)
|
||||
{
|
||||
matches.append(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add all matches
|
||||
forAll(matches, i)
|
||||
{
|
||||
const word& thisKey = thisKeys[matches[i]];
|
||||
|
||||
entry& thisEntry = const_cast<entry&>
|
||||
(
|
||||
thisDict.lookupEntry(thisKey, false, false)
|
||||
);
|
||||
|
||||
if
|
||||
(
|
||||
addEntry
|
||||
(
|
||||
thisDict,
|
||||
thisEntry,
|
||||
mergeIter(),
|
||||
literalRE,
|
||||
HashTable<wordList, word>(0) // no shortcuts
|
||||
// at deeper levels
|
||||
)
|
||||
)
|
||||
{
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -273,6 +347,12 @@ int main(int argc, char *argv[])
|
||||
"enableFunctionEntries",
|
||||
"enable expansion of dictionary directives - #include, #codeStream etc"
|
||||
);
|
||||
argList::addBoolOption
|
||||
(
|
||||
"disablePatchGroups",
|
||||
"disable matching keys to patch groups"
|
||||
);
|
||||
|
||||
#include "addRegionOption.H"
|
||||
|
||||
#include "setRootCase.H"
|
||||
@ -304,7 +384,6 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
const bool literalRE = args.optionFound("literalRE");
|
||||
|
||||
if (literalRE)
|
||||
{
|
||||
Info<< "Not interpreting any regular expressions (RE)"
|
||||
@ -328,6 +407,15 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
|
||||
const bool disablePatchGroups = args.optionFound("disablePatchGroups");
|
||||
if (disablePatchGroups)
|
||||
{
|
||||
Info<< "Not interpreting any keys in the changeDictionary"
|
||||
<< " as patchGroups"
|
||||
<< endl;
|
||||
}
|
||||
|
||||
|
||||
fileName regionPrefix = "";
|
||||
if (regionName != fvMesh::defaultRegion)
|
||||
{
|
||||
@ -369,6 +457,70 @@ int main(int argc, char *argv[])
|
||||
<< replaceDicts.toc() << endl;
|
||||
|
||||
|
||||
|
||||
// Always read boundary to get patch groups
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Info<< "Reading polyMesh/boundary file to extract patch names"
|
||||
<< endl;
|
||||
|
||||
// Read PtrList of dictionary as dictionary.
|
||||
const word oldTypeName = IOPtrList<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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
|
||||
(
|
||||
|
||||
@ -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
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -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
|
||||
|
||||
@ -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())
|
||||
{
|
||||
|
||||
@ -110,7 +110,7 @@ class codedFixedValueFvPatchField
|
||||
// Private data
|
||||
|
||||
//- Dictionary contents for the boundary condition
|
||||
mutable dictionary dict_;
|
||||
const dictionary dict_;
|
||||
|
||||
const word redirectType_;
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -423,6 +423,10 @@ void Foam::Cloud<ParticleType>::autoMap
|
||||
trackStartCell = 0;
|
||||
p.cell() = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
p.cell() = trackStartCell;
|
||||
}
|
||||
|
||||
vector pos = p.position();
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"));
|
||||
|
||||
@ -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&);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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 (loadFromFiles_)
|
||||
{
|
||||
sampleAndWrite
|
||||
(
|
||||
GeometricField<Type, fvPatchField, volMesh>
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
fields[fieldI],
|
||||
mesh_.time().timeName(),
|
||||
mesh_,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
),
|
||||
mesh_
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
objectRegistry::const_iterator iter =
|
||||
mesh_.find(fields[fieldI]);
|
||||
|
||||
if
|
||||
(
|
||||
iter != objectRegistry::end()
|
||||
&& iter()->type()
|
||||
== GeometricField<Type, fvPatchField, volMesh>::typeName
|
||||
)
|
||||
if (Pstream::master() && verbose_)
|
||||
{
|
||||
sampleAndWrite
|
||||
(
|
||||
mesh_.lookupObject
|
||||
<GeometricField<Type, fvPatchField, volMesh> >
|
||||
(
|
||||
fields[fieldI]
|
||||
)
|
||||
);
|
||||
Pout<< "sampleAndWrite: " << field << endl;
|
||||
}
|
||||
|
||||
if (loadFromFiles_)
|
||||
{
|
||||
fieldIter()->readOpt() = IOobject::MUST_READ;
|
||||
sampleAndWrite
|
||||
(
|
||||
GeoField
|
||||
(
|
||||
*fieldIter(),
|
||||
mesh_
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
sampleAndWrite
|
||||
(
|
||||
mesh_.lookupObject<GeoField>(fieldIter()->name())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -22,6 +22,7 @@ active true;
|
||||
infinitelyFastChemistryCoeffs
|
||||
{
|
||||
C 10;
|
||||
semiImplicit false;
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -31,9 +31,9 @@ FoamFile
|
||||
|
||||
radFluxName Qr;
|
||||
|
||||
minimumDelta 1e-8;
|
||||
minimumDelta 1e-12;
|
||||
|
||||
reactionDeltaMin 1e-8;
|
||||
reactionDeltaMin 1e-12;
|
||||
|
||||
moveMesh false;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -70,6 +70,7 @@ fluxRequired
|
||||
{
|
||||
default no;
|
||||
p_rgh;
|
||||
phiMesh;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ solvers
|
||||
relTol 0;
|
||||
}
|
||||
|
||||
rhoThermo
|
||||
rho
|
||||
{
|
||||
solver PCG;
|
||||
preconditioner DIC;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user