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]
|
- 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();
|
||||||
|
|||||||
@ -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,14 +74,16 @@ 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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
|
||||||
(
|
(
|
||||||
|
|||||||
@ -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
|
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
|
||||||
|
|||||||
@ -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())
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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_;
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"));
|
||||||
|
|||||||
@ -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&);
|
||||||
|
|||||||
@ -30,95 +30,23 @@ 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -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
|
||||||
@ -127,62 +103,101 @@ 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]
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -22,6 +22,7 @@ active true;
|
|||||||
infinitelyFastChemistryCoeffs
|
infinitelyFastChemistryCoeffs
|
||||||
{
|
{
|
||||||
C 10;
|
C 10;
|
||||||
|
semiImplicit false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -70,6 +70,7 @@ fluxRequired
|
|||||||
{
|
{
|
||||||
default no;
|
default no;
|
||||||
p_rgh;
|
p_rgh;
|
||||||
|
phiMesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -32,7 +32,7 @@ solvers
|
|||||||
relTol 0;
|
relTol 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rhoThermo
|
rho
|
||||||
{
|
{
|
||||||
solver PCG;
|
solver PCG;
|
||||||
preconditioner DIC;
|
preconditioner DIC;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user