Merge branch 'master' of github.com-OpenFOAM:OpenFOAM/OpenFOAM-dev

This commit is contained in:
Henry Weller
2019-02-01 14:10:22 +00:00
27 changed files with 400 additions and 460 deletions

View File

@ -80,15 +80,6 @@ Description
#{ #{
Pout<< "**codeSetValue**" << endl; Pout<< "**codeSetValue**" << endl;
#}; #};
// Dummy entry. Make dependent on above to trigger recompilation
code
#{
$codeInclude
$codeCorrect
$codeAddSup
$codeSetValue
#};
} }
sourceTimeCoeffs sourceTimeCoeffs

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -59,8 +59,8 @@ namespace functionEntries
} }
const Foam::word Foam::functionEntries::codeStream::codeTemplateC const Foam::word Foam::functionEntries::codeStream::codeTemplateC =
= "codeStreamTemplate.C"; "codeStreamTemplate.C";
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
@ -123,8 +123,8 @@ Foam::functionEntries::codeStream::getFunction
const dictionary& codeDict const dictionary& codeDict
) )
{ {
// get code, codeInclude, codeOptions // get code, codeInclude, ...
dynamicCodeContext context(codeDict); dynamicCodeContext context(codeDict, {"code", "codeInclude", "localCode"});
// codeName: codeStream + _<sha1> // codeName: codeStream + _<sha1>
// codeDir : _<sha1> // codeDir : _<sha1>

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -293,7 +293,7 @@ void Foam::codedBase::updateLibrary
dict dict
); );
dynamicCodeContext context(dict); dynamicCodeContext context(dict, codeKeys());
// codeName: name + _<sha1> // codeName: name + _<sha1>
// codeDir : name // codeDir : name

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -92,30 +92,26 @@ class codedBase
protected: protected:
//- Update library as required //- Update library as required
void updateLibrary void updateLibrary(const word& name) const;
(
const word& name
) const;
//- Get the loaded dynamic libraries //- Get the loaded dynamic libraries
virtual dlLibraryTable& libs() const = 0; virtual dlLibraryTable& libs() const = 0;
//- Adapt the context for the current object //- Adapt the context for the current object
virtual void prepare virtual void prepare(dynamicCode&, const dynamicCodeContext&) const = 0;
(
dynamicCode&,
const dynamicCodeContext&
) const = 0;
// Return a description (type + name) for the output //- Return a description (type + name) for the output
virtual string description() const = 0; virtual string description() const = 0;
// Clear any redirected objects //- Clear any redirected objects
virtual void clearRedirect() const = 0; virtual void clearRedirect() const = 0;
// Get the dictionary to initialize the codeContext //- Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const = 0; virtual const dictionary& codeDict() const = 0;
//- Get the keywords associated with source code
virtual const wordList& codeKeys() const = 0;
public: public:

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -343,7 +343,13 @@ void Foam::dynamicCode::reset
) )
{ {
clear(); clear();
setFilterContext(context);
forAllConstIter(HashTable<string>, context.code(), iter)
{
setFilterVariable(iter.key(), iter());
}
setFilterVariable("SHA1sum", context.sha1().str());
} }
@ -369,18 +375,6 @@ void Foam::dynamicCode::addCreateFile
} }
void Foam::dynamicCode::setFilterContext
(
const dynamicCodeContext& context
)
{
filterVars_.set("localCode", context.localCode());
filterVars_.set("code", context.code());
filterVars_.set("codeInclude", context.include());
filterVars_.set("SHA1sum", context.sha1().str());
}
void Foam::dynamicCode::setFilterVariable void Foam::dynamicCode::setFilterVariable
( (
const word& key, const word& key,

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -259,9 +259,6 @@ public:
//- Add a file to create with its contents. Will not be filtered //- Add a file to create with its contents. Will not be filtered
void addCreateFile(const fileName& name, const string& contents); void addCreateFile(const fileName& name, const string& contents);
//- Define filter variables for code, codeInclude, SHA1sum
void setFilterContext(const dynamicCodeContext&);
//- Define a filter variable //- Define a filter variable
void setFilterVariable(const word& key, const std::string& value); void setFilterVariable(const word& key, const std::string& value);

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -27,102 +27,7 @@ License
#include "stringOps.H" #include "stringOps.H"
#include "OSHA1stream.H" #include "OSHA1stream.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::dynamicCodeContext::dynamicCodeContext(const dictionary& dict)
:
dict_(dict),
code_(),
localCode_(),
include_(),
options_(),
libs_()
{
// Expand dictionary entries
// Note: removes any leading/trailing whitespace
// - necessary for compilation options, convenient for includes
// and body.
const entry* codePtr = dict.lookupEntryPtr
(
"code",
false,
false
);
if (codePtr)
{
code_ = stringOps::trim(codePtr->stream());
stringOps::inplaceExpand(code_, dict);
}
const entry* includePtr = dict.lookupEntryPtr
(
"codeInclude",
false,
false
);
if (includePtr)
{
include_ = stringOps::trim(includePtr->stream());
stringOps::inplaceExpand(include_, dict);
}
const entry* optionsPtr = dict.lookupEntryPtr
(
"codeOptions",
false,
false
);
if (optionsPtr)
{
options_ = stringOps::trim(optionsPtr->stream());
stringOps::inplaceExpand(options_, dict);
}
const entry* libsPtr = dict.lookupEntryPtr("codeLibs", false, false);
if (libsPtr)
{
libs_ = stringOps::trim(libsPtr->stream());
stringOps::inplaceExpand(libs_, dict);
}
const entry* localPtr = dict.lookupEntryPtr("localCode", false, false);
if (localPtr)
{
localCode_ = stringOps::trim(localPtr->stream());
stringOps::inplaceExpand(localCode_, dict);
}
// Calculate SHA1 digest from include, options, localCode, code
OSHA1stream os;
os << include_ << options_ << libs_ << localCode_ << code_;
sha1_ = os.digest();
// Add line number after calculating sha1 since includes processorDDD
// in path which differs between processors.
if (codePtr)
{
addLineDirective(code_, codePtr->startLineNumber(), dict.name());
}
if (includePtr)
{
addLineDirective(include_, includePtr->startLineNumber(), dict.name());
}
// Do not add line directive to options_ (Make/options) and libs since
// they are preprocessed as a single line at this point. Can be fixed.
if (localPtr)
{
addLineDirective(localCode_, localPtr->startLineNumber(), dict.name());
}
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::dynamicCodeContext::addLineDirective void Foam::dynamicCodeContext::addLineDirective
( (
@ -135,4 +40,69 @@ void Foam::dynamicCodeContext::addLineDirective
} }
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::dynamicCodeContext::dynamicCodeContext
(
const dictionary& dict,
const wordList& codeKeys
)
:
dict_(dict),
code_(),
options_(),
libs_()
{
// Expand all dictionary entries. Note that this removes any leading or
// trailing whitespace, which is necessary for compilation options, and
// doesn't hurt for everything else
List<const entry*> codePtrs(codeKeys.size(), nullptr);
forAll(codeKeys, i)
{
const word& key = codeKeys[i];
codePtrs[i] = dict.lookupEntryPtr(key, false, false);
if (codePtrs[i])
{
code_.insert
(
key,
stringOps::expand
(
stringOps::trim(codePtrs[i]->stream()),
dict
)
);
}
else
{
code_.insert(key, "");
}
}
// Calculate SHA1 digest from all entries
OSHA1stream os;
forAllConstIter(HashTable<string>, code_, iter)
{
os << iter();
}
sha1_ = os.digest();
// Add line directive after calculating SHA1 since this includes
// "processor..." in the path which differs between cores
forAll(codeKeys, i)
{
if (codePtrs[i])
{
const word& key = codeKeys[i];
addLineDirective
(
code_[key],
codePtrs[i]->startLineNumber(),
dict.name()
);
}
}
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -36,6 +36,7 @@ SourceFiles
#define dynamicCodeContext_H #define dynamicCodeContext_H
#include "dictionary.H" #include "dictionary.H"
#include "HashTable.H"
#include "SHA1Digest.H" #include "SHA1Digest.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -54,31 +55,42 @@ class dynamicCodeContext
//- The parent dictionary context //- The parent dictionary context
const dictionary& dict_; const dictionary& dict_;
//- Optional "code" entry //- Code entries
string code_; HashTable<string> code_;
//- Optional "localCode" entry
string localCode_;
//- Optional "codeInclude" entry
string include_;
//- Optional "codeOptions" entry //- Optional "codeOptions" entry
string options_; string options_;
//- Optional "codeLib" entry //- Optional "codeLibs" entry
string libs_; string libs_;
//- Calculated SHA1Digest //- Calculated SHA1Digest
SHA1Digest sha1_; SHA1Digest sha1_;
// Private member functions
//- Add a \#line directive to the start of the given source string that
// compilation messages are meaningful
static void addLineDirective
(
string&,
const label lineNum,
const fileName& name
);
public: public:
// Constructors // Constructors
//- Construct from a dictionary //- Construct from a dictionary and lists of which entries correspond
dynamicCodeContext(const dictionary&); // to code
dynamicCodeContext
(
const dictionary& dict,
const wordList& codeKeys
);
// Member functions // Member functions
@ -89,10 +101,10 @@ public:
return dict_; return dict_;
} }
//- Return the code-includes //- Return the code table
const string& include() const const HashTable<string>& code() const
{ {
return include_; return code_;
} }
//- Return the code-options //- Return the code-options
@ -107,31 +119,11 @@ public:
return libs_; return libs_;
} }
//- Return the code
const string& code() const
{
return code_;
}
//- Return the local (file-scope) code
const string& localCode() const
{
return localCode_;
}
//- Return SHA1 digest calculated from include, options, code //- Return SHA1 digest calculated from include, options, code
const SHA1Digest& sha1() const const SHA1Digest& sha1() const
{ {
return sha1_; return sha1_;
} }
//- Helper: add \#line directive
static void addLineDirective
(
string&,
const label lineNum,
const fileName& name
);
}; };

View File

@ -31,15 +31,22 @@ License
#include "dynamicCodeContext.H" #include "dynamicCodeContext.H"
#include "stringOps.H" #include "stringOps.H"
// * * * * * * * * * * * * Private Static Data Members * * * * * * * * * * * //
template<class Type>
const Foam::wordList Foam::codedFixedValuePointPatchField<Type>::codeKeys_ =
{"code", "codeInclude", "localCode"};
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template<class Type> template<class Type>
const Foam::word Foam::codedFixedValuePointPatchField<Type>::codeTemplateC const Foam::word Foam::codedFixedValuePointPatchField<Type>::codeTemplateC =
= "fixedValuePointPatchFieldTemplate.C"; "fixedValuePointPatchFieldTemplate.C";
template<class Type> template<class Type>
const Foam::word Foam::codedFixedValuePointPatchField<Type>::codeTemplateH const Foam::word Foam::codedFixedValuePointPatchField<Type>::codeTemplateH =
= "fixedValuePointPatchFieldTemplate.H"; "fixedValuePointPatchFieldTemplate.H";
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
@ -141,8 +148,8 @@ void Foam::codedFixedValuePointPatchField<Type>::prepare
template<class Type> template<class Type>
const Foam::dictionary& Foam::codedFixedValuePointPatchField<Type>::codeDict() const Foam::dictionary&
const Foam::codedFixedValuePointPatchField<Type>::codeDict() const
{ {
// Use system/codeDict or in-line // Use system/codeDict or in-line
return return
@ -154,6 +161,14 @@ const
} }
template<class Type>
const Foam::wordList&
Foam::codedFixedValuePointPatchField<Type>::codeKeys() const
{
return codeKeys_;
}
template<class Type> template<class Type>
Foam::string Foam::codedFixedValuePointPatchField<Type>::description() const Foam::string Foam::codedFixedValuePointPatchField<Type>::description() const
{ {

View File

@ -105,6 +105,12 @@ class codedFixedValuePointPatchField
public fixedValuePointPatchField<Type>, public fixedValuePointPatchField<Type>,
public codedBase public codedBase
{ {
// Private static data
//- The keywords associated with source code
static const wordList codeKeys_;
// Private data // Private data
//- Dictionary contents for the boundary condition //- Dictionary contents for the boundary condition
@ -128,15 +134,18 @@ class codedFixedValuePointPatchField
//- Adapt the context for the current object //- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const; virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output //- Return a description (type + name) for the output
virtual string description() const; virtual string description() const;
// Clear the ptr to the redirected object //- Clear the ptr to the redirected object
virtual void clearRedirect() const; virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext //- Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const; virtual const dictionary& codeDict() const;
//- Get the keywords associated with source code
virtual const wordList& codeKeys() const;
public: public:

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -127,6 +127,7 @@ bool Foam::combineFaces::validFace
void Foam::combineFaces::regioniseFaces void Foam::combineFaces::regioniseFaces
( (
const scalar minCos, const scalar minCos,
const labelHashSet& patchIDs,
const label celli, const label celli,
const labelList& cEdges, const labelList& cEdges,
Map<label>& faceRegion Map<label>& faceRegion
@ -145,9 +146,15 @@ void Foam::combineFaces::regioniseFaces
label p1 = patches.whichPatch(f1); label p1 = patches.whichPatch(f1);
// Face can be merged if // Face can be merged if
// - same non-coupled patch // - same non-coupled patch in list
// - small angle // - small angle
if (p0 != -1 && p0 == p1 && !patches[p0].coupled()) if
(
p0 != -1
&& p0 == p1
&& !patches[p0].coupled()
&& patchIDs.found(p0)
)
{ {
vector f0Normal = mesh_.faceAreas()[f0]; vector f0Normal = mesh_.faceAreas()[f0];
f0Normal /= mag(f0Normal); f0Normal /= mag(f0Normal);
@ -298,6 +305,7 @@ Foam::labelListList Foam::combineFaces::getMergeSets
( (
const scalar featureCos, const scalar featureCos,
const scalar minConcaveCos, const scalar minConcaveCos,
const labelHashSet& patchIDs,
const labelHashSet& boundaryCells const labelHashSet& boundaryCells
) const ) const
{ {
@ -317,7 +325,7 @@ Foam::labelListList Foam::combineFaces::getMergeSets
// Region per face // Region per face
Map<label> faceRegion(cFaces.size()); Map<label> faceRegion(cFaces.size());
regioniseFaces(featureCos, celli, cEdges, faceRegion); regioniseFaces(featureCos, patchIDs, celli, cEdges, faceRegion);
// Now we have in faceRegion for every face the region with planar // Now we have in faceRegion for every face the region with planar
// face sharing the same region. We now check whether the resulting // face sharing the same region. We now check whether the resulting
@ -381,7 +389,8 @@ Foam::labelListList Foam::combineFaces::getMergeSets
Foam::labelListList Foam::combineFaces::getMergeSets Foam::labelListList Foam::combineFaces::getMergeSets
( (
const scalar featureCos, const scalar featureCos,
const scalar minConcaveCos const scalar minConcaveCos,
const labelHashSet& patchIDs
) const ) const
{ {
const polyBoundaryMesh& patches = mesh_.boundaryMesh(); const polyBoundaryMesh& patches = mesh_.boundaryMesh();
@ -389,9 +398,9 @@ Foam::labelListList Foam::combineFaces::getMergeSets
// Pick up all cells on boundary // Pick up all cells on boundary
labelHashSet boundaryCells(mesh_.nFaces()-mesh_.nInternalFaces()); labelHashSet boundaryCells(mesh_.nFaces()-mesh_.nInternalFaces());
forAll(patches, patchi) forAllConstIter(labelHashSet, patchIDs, iter)
{ {
const polyPatch& patch = patches[patchi]; const polyPatch& patch = patches[iter.key()];
if (!patch.coupled()) if (!patch.coupled())
{ {
@ -402,7 +411,20 @@ Foam::labelListList Foam::combineFaces::getMergeSets
} }
} }
return getMergeSets(featureCos, minConcaveCos, boundaryCells); return getMergeSets(featureCos, minConcaveCos, patchIDs, boundaryCells);
}
Foam::labelListList Foam::combineFaces::getMergeSets
(
const scalar featureCos,
const scalar minConcaveCos
) const
{
const labelHashSet patchIDs(identity(mesh_.boundaryMesh().size()));
return getMergeSets(featureCos, minConcaveCos, patchIDs);
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -101,6 +101,7 @@ class combineFaces
void regioniseFaces void regioniseFaces
( (
const scalar minCos, const scalar minCos,
const labelHashSet& patchIDs,
const label celli, const label celli,
const labelList& cEdges, const labelList& cEdges,
Map<label>& faceRegion Map<label>& faceRegion
@ -153,14 +154,24 @@ public:
// Helper functions // Helper functions
//- Extract lists of all (non-coupled) boundary faces on selected //- Extract lists of all (non-coupled) boundary faces on selected
// cells that can be merged. Uses getFaceRegions. // patches and cells that can be merged. Uses getFaceRegions.
labelListList getMergeSets labelListList getMergeSets
( (
const scalar featureCos, const scalar featureCos,
const scalar minConcaveCos, const scalar minConcaveCos,
const labelHashSet& patchIDs,
const labelHashSet& boundaryCells const labelHashSet& boundaryCells
) const; ) const;
//- Extract lists of all (non-coupled) boundary faces on selected
// patches that can be merged. Uses getFaceRegions.
labelListList getMergeSets
(
const scalar featureCos,
const scalar minConcaveCos,
const labelHashSet& patchIDs
) const;
//- Extract lists of all (non-coupled) boundary faces that can //- Extract lists of all (non-coupled) boundary faces that can
// be merged. Uses getFaceRegions. // be merged. Uses getFaceRegions.
labelListList getMergeSets labelListList getMergeSets

View File

@ -31,15 +31,22 @@ License
#include "dynamicCodeContext.H" #include "dynamicCodeContext.H"
#include "stringOps.H" #include "stringOps.H"
// * * * * * * * * * * * * Private Static Data Members * * * * * * * * * * * //
template<class Type>
const Foam::wordList Foam::codedFixedValueFvPatchField<Type>::codeKeys_ =
{"code", "codeInclude", "localCode"};
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template<class Type> template<class Type>
const Foam::word Foam::codedFixedValueFvPatchField<Type>::codeTemplateC const Foam::word Foam::codedFixedValueFvPatchField<Type>::codeTemplateC =
= "fixedValueFvPatchFieldTemplate.C"; "fixedValueFvPatchFieldTemplate.C";
template<class Type> template<class Type>
const Foam::word Foam::codedFixedValueFvPatchField<Type>::codeTemplateH const Foam::word Foam::codedFixedValueFvPatchField<Type>::codeTemplateH =
= "fixedValueFvPatchFieldTemplate.H"; "fixedValueFvPatchFieldTemplate.H";
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
@ -153,6 +160,13 @@ const
} }
template<class Type>
const Foam::wordList& Foam::codedFixedValueFvPatchField<Type>::codeKeys() const
{
return codeKeys_;
}
template<class Type> template<class Type>
Foam::string Foam::codedFixedValueFvPatchField<Type>::description() const Foam::string Foam::codedFixedValueFvPatchField<Type>::description() const
{ {

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -103,6 +103,12 @@ class codedFixedValueFvPatchField
public fixedValueFvPatchField<Type>, public fixedValueFvPatchField<Type>,
public codedBase public codedBase
{ {
// Private static data
//- The keywords associated with source code
static const wordList codeKeys_;
// Private data // Private data
//- Dictionary contents for the boundary condition //- Dictionary contents for the boundary condition
@ -126,15 +132,18 @@ class codedFixedValueFvPatchField
//- Adapt the context for the current object //- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const; virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output //- Return a description (type + name) for the output
virtual string description() const; virtual string description() const;
// Clear the ptr to the redirected object //- Clear the ptr to the redirected object
virtual void clearRedirect() const; virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext //- Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const; virtual const dictionary& codeDict() const;
//- Get the keywords associated with source code
virtual const wordList& codeKeys() const;
public: public:

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -31,15 +31,22 @@ License
#include "dynamicCodeContext.H" #include "dynamicCodeContext.H"
#include "stringOps.H" #include "stringOps.H"
// * * * * * * * * * * * * Private Static Data Members * * * * * * * * * * * //
template<class Type>
const Foam::wordList Foam::codedMixedFvPatchField<Type>::codeKeys_ =
{"code", "codeInclude", "localCode"};
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template<class Type> template<class Type>
const Foam::word Foam::codedMixedFvPatchField<Type>::codeTemplateC const Foam::word Foam::codedMixedFvPatchField<Type>::codeTemplateC =
= "mixedFvPatchFieldTemplate.C"; "mixedFvPatchFieldTemplate.C";
template<class Type> template<class Type>
const Foam::word Foam::codedMixedFvPatchField<Type>::codeTemplateH const Foam::word Foam::codedMixedFvPatchField<Type>::codeTemplateH =
= "mixedFvPatchFieldTemplate.H"; "mixedFvPatchFieldTemplate.H";
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
@ -153,6 +160,13 @@ const
} }
template<class Type>
const Foam::wordList& Foam::codedMixedFvPatchField<Type>::codeKeys() const
{
return codeKeys_;
}
template<class Type> template<class Type>
Foam::string Foam::codedMixedFvPatchField<Type>::description() const Foam::string Foam::codedMixedFvPatchField<Type>::description() const
{ {

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -113,6 +113,12 @@ class codedMixedFvPatchField
public mixedFvPatchField<Type>, public mixedFvPatchField<Type>,
public codedBase public codedBase
{ {
// Private static data
//- The keywords associated with source code
static const wordList codeKeys_;
// Private data // Private data
//- Dictionary contents for the boundary condition //- Dictionary contents for the boundary condition
@ -136,15 +142,18 @@ class codedMixedFvPatchField
//- Adapt the context for the current object //- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const; virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output //- Return a description (type + name) for the output
virtual string description() const; virtual string description() const;
// Clear the ptr to the redirected object //- Clear the ptr to the redirected object
virtual void clearRedirect() const; virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext //- Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const; virtual const dictionary& codeDict() const;
//- Get the keywords associated with source code
virtual const wordList& codeKeys() const;
public: public:

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -33,6 +33,20 @@ License
#include "stringOps.H" #include "stringOps.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * Protected Static Data Members * * * * * * * * * * * //
const Foam::wordList Foam::codedFunctionObject::codeKeys_ =
{
"codeData",
"codeEnd",
"codeExecute",
"codeInclude",
"codeRead",
"codeWrite",
"localCode"
};
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam namespace Foam
@ -47,6 +61,7 @@ namespace Foam
); );
} }
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::codedFunctionObject::prepare void Foam::codedFunctionObject::prepare
@ -55,13 +70,7 @@ void Foam::codedFunctionObject::prepare
const dynamicCodeContext& context const dynamicCodeContext& context
) const ) const
{ {
// Set additional rewrite rules
dynCode.setFilterVariable("typeName", name_); dynCode.setFilterVariable("typeName", name_);
dynCode.setFilterVariable("codeData", codeData_);
dynCode.setFilterVariable("codeRead", codeRead_);
dynCode.setFilterVariable("codeExecute", codeExecute_);
dynCode.setFilterVariable("codeWrite", codeWrite_);
dynCode.setFilterVariable("codeEnd", codeEnd_);
// Compile filtered C template // Compile filtered C template
dynCode.addCompileFile("functionObjectTemplate.C"); dynCode.addCompileFile("functionObjectTemplate.C");
@ -114,6 +123,12 @@ const Foam::dictionary& Foam::codedFunctionObject::codeDict() const
} }
const Foam::wordList& Foam::codedFunctionObject::codeKeys() const
{
return codeKeys_;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::codedFunctionObject::codedFunctionObject Foam::codedFunctionObject::codedFunctionObject
@ -129,9 +144,6 @@ Foam::codedFunctionObject::codedFunctionObject
dict_(dict) dict_(dict)
{ {
read(dict_); read(dict_);
updateLibrary(name_);
redirectFunctionObject();
} }
@ -184,114 +196,15 @@ bool Foam::codedFunctionObject::end()
bool Foam::codedFunctionObject::read(const dictionary& dict) bool Foam::codedFunctionObject::read(const dictionary& dict)
{ {
// Backward compatibility // The name keyword is "name". "redirectType" is also maintained here
if (dict.found("redirectType")) // for backwards compatibility, but "name" is taken in preference and
// is printed in the error message if neither keyword is present.
name_ = word::null;
name_ = dict.lookupOrDefault("redirectType", name_);
name_ = dict.lookupOrDefault("name", name_);
if (name_ == word::null)
{ {
dict.lookup("redirectType") >> name_; dict.lookup("name"); // <-- generate error message with "name" in it
}
else
{
dict.lookup("name") >> name_;
}
const entry* dataPtr = dict.lookupEntryPtr
(
"codeData",
false,
false
);
if (dataPtr)
{
codeData_ = stringOps::trim(dataPtr->stream());
stringOps::inplaceExpand(codeData_, dict);
dynamicCodeContext::addLineDirective
(
codeData_,
dataPtr->startLineNumber(),
dict.name()
);
}
const entry* readPtr = dict.lookupEntryPtr
(
"codeRead",
false,
false
);
if (readPtr)
{
codeRead_ = stringOps::trim(readPtr->stream());
stringOps::inplaceExpand(codeRead_, dict);
dynamicCodeContext::addLineDirective
(
codeRead_,
readPtr->startLineNumber(),
dict.name()
);
}
const entry* execPtr = dict.lookupEntryPtr
(
"codeExecute",
false,
false
);
if (execPtr)
{
codeExecute_ = stringOps::trim(execPtr->stream());
stringOps::inplaceExpand(codeExecute_, dict);
dynamicCodeContext::addLineDirective
(
codeExecute_,
execPtr->startLineNumber(),
dict.name()
);
}
const entry* writePtr = dict.lookupEntryPtr
(
"codeWrite",
false,
false
);
if (writePtr)
{
codeWrite_ = stringOps::trim(writePtr->stream());
stringOps::inplaceExpand(codeWrite_, dict);
dynamicCodeContext::addLineDirective
(
codeWrite_,
writePtr->startLineNumber(),
dict.name()
);
}
const entry* endPtr = dict.lookupEntryPtr
(
"codeEnd",
false,
false
);
if (endPtr)
{
codeEnd_ = stringOps::trim(endPtr->stream());
stringOps::inplaceExpand(codeEnd_, dict);
dynamicCodeContext::addLineDirective
(
codeEnd_,
endPtr->startLineNumber(),
dict.name()
);
}
if(!dataPtr && !readPtr && !execPtr && !writePtr && !endPtr)
{
IOWarningInFunction
(
dict
) << "No critical \"code\" prefixed keywords were found."
<< " Please check the code documentation for more details."
<< nl << endl;
} }
updateLibrary(name_); updateLibrary(name_);

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -90,6 +90,12 @@ class codedFunctionObject
{ {
protected: protected:
// Protected static data
//- The keywords associated with source code
static const wordList codeKeys_;
// Protected data // Protected data
//- Reference to the time database //- Reference to the time database
@ -98,14 +104,9 @@ protected:
//- Input dictionary //- Input dictionary
dictionary dict_; dictionary dict_;
//- The name
word name_; word name_;
string codeData_;
string codeRead_;
string codeExecute_;
string codeWrite_;
string codeEnd_;
//- Underlying functionObject //- Underlying functionObject
mutable autoPtr<functionObject> redirectFunctionObjectPtr_; mutable autoPtr<functionObject> redirectFunctionObjectPtr_;
@ -118,15 +119,18 @@ protected:
//- Adapt the context for the current object //- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const; virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output //- Return a description (type + name) for the output
virtual string description() const; virtual string description() const;
// Clear any redirected objects //- Clear any redirected objects
virtual void clearRedirect() const; virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext //- Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const; virtual const dictionary& codeDict() const;
//- Get the keywords associated with source code
virtual const wordList& codeKeys() const;
private: private:

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2012-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -29,6 +29,13 @@ License
#include "dynamicCode.H" #include "dynamicCode.H"
#include "dynamicCodeContext.H" #include "dynamicCodeContext.H"
// * * * * * * * * * * * Protected Static Data Members * * * * * * * * * * * //
template<class Type>
const Foam::wordList Foam::fv::CodedSource<Type>::codeKeys_ =
{"codeAddSup", "codeCorrect", "codeInclude", "codeSetValue", "localCode"};
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class Type> template<class Type>
@ -45,11 +52,6 @@ void Foam::fv::CodedSource<Type>::prepare
dynCode.setFilterVariable("TemplateType", sourceType); dynCode.setFilterVariable("TemplateType", sourceType);
dynCode.setFilterVariable("SourceType", sourceType + "Source"); dynCode.setFilterVariable("SourceType", sourceType + "Source");
// dynCode.removeFilterVariable("code");
dynCode.setFilterVariable("codeCorrect", codeCorrect_);
dynCode.setFilterVariable("codeAddSup", codeAddSup_);
dynCode.setFilterVariable("codeSetValue", codeSetValue_);
// compile filtered C template // compile filtered C template
dynCode.addCompileFile("codedFvOptionTemplate.C"); dynCode.addCompileFile("codedFvOptionTemplate.C");
@ -108,6 +110,13 @@ const Foam::dictionary& Foam::fv::CodedSource<Type>::codeDict() const
} }
template<class Type>
const Foam::wordList& Foam::fv::CodedSource<Type>::codeKeys() const
{
return codeKeys_;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type> template<class Type>

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2012-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -89,15 +89,6 @@ Usage
#{ #{
Pout<< "**codeSetValue**" << endl; Pout<< "**codeSetValue**" << endl;
#}; #};
// Dummy entry. Make dependent on above to trigger recompilation
code
#{
$codeInclude
$codeCorrect
$codeAddSup
$codeSetValue
#};
} }
sourceTimeCoeffs sourceTimeCoeffs
@ -136,17 +127,19 @@ class CodedSource
public cellSetOption, public cellSetOption,
public codedBase public codedBase
{ {
protected: protected:
// Protected static data
//- The keywords associated with source code
static const wordList codeKeys_;
// Protected data // Protected data
//- The name
word name_; word name_;
string codeCorrect_;
string codeAddSup_;
string codeSetValue_;
//- Underlying functionObject //- Underlying functionObject
mutable autoPtr<option> redirectFvOptionPtr_; mutable autoPtr<option> redirectFvOptionPtr_;
@ -159,15 +152,18 @@ protected:
//- Adapt the context for the current object //- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const; virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output //- Return a description (type + name) for the output
virtual string description() const; virtual string description() const;
// Clear any redirected objects //- Clear any redirected objects
virtual void clearRedirect() const; virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext //- Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const; virtual const dictionary& codeDict() const;
//- Get the keywords associated with source code
virtual const wordList& codeKeys() const;
public: public:

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2012-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -36,67 +36,18 @@ bool Foam::fv::CodedSource<Type>::read(const dictionary& dict)
coeffs_.lookup("fields") >> fieldNames_; coeffs_.lookup("fields") >> fieldNames_;
applied_.setSize(fieldNames_.size(), false); applied_.setSize(fieldNames_.size(), false);
// Backward compatibility // The name keyword is "name". "redirectType" is also maintained here
if (dict.found("redirectType")) // for backwards compatibility, but "name" is taken in preference and
// is printed in the error message if neither keyword is present.
name_ = word::null;
name_ = dict.lookupOrDefault("redirectType", name_);
name_ = dict.lookupOrDefault("name", name_);
if (name_ == word::null)
{ {
dict.lookup("redirectType") >> name_; dict.lookup("name"); // <-- generate error message with "name" in it
}
else
{
dict.lookup("name") >> name_;
} }
// Code snippets updateLibrary(name_);
{
const entry& e = coeffs_.lookupEntry
(
"codeCorrect",
false,
false
);
codeCorrect_ = stringOps::trim(e.stream());
stringOps::inplaceExpand(codeCorrect_, coeffs_);
dynamicCodeContext::addLineDirective
(
codeCorrect_,
e.startLineNumber(),
coeffs_.name()
);
}
{
const entry& e = coeffs_.lookupEntry
(
"codeAddSup",
false,
false
);
codeAddSup_ = stringOps::trim(e.stream());
stringOps::inplaceExpand(codeAddSup_, coeffs_);
dynamicCodeContext::addLineDirective
(
codeAddSup_,
e.startLineNumber(),
coeffs_.name()
);
}
{
const entry& e = coeffs_.lookupEntry
(
"codeSetValue",
false,
false
);
codeSetValue_ = stringOps::trim(e.stream());
stringOps::inplaceExpand(codeSetValue_, coeffs_);
dynamicCodeContext::addLineDirective
(
codeSetValue_,
e.startLineNumber(),
coeffs_.name()
);
}
return true; return true;
} }

View File

@ -997,7 +997,7 @@ public:
( (
const scalar minCos, const scalar minCos,
const scalar concaveCos, const scalar concaveCos,
const labelList& patchIDs, const labelHashSet& patchIDs,
const dictionary& motionDict, const dictionary& motionDict,
const labelList& preserveFaces const labelList& preserveFaces
); );

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -248,7 +248,7 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
( (
const scalar minCos, const scalar minCos,
const scalar concaveCos, const scalar concaveCos,
const labelList& patchIDs, const labelHashSet& patchIDs,
const dictionary& motionDict, const dictionary& motionDict,
const labelList& preserveFaces const labelList& preserveFaces
) )
@ -256,28 +256,6 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
// Patch face merging engine // Patch face merging engine
combineFaces faceCombiner(mesh_, true); combineFaces faceCombiner(mesh_, true);
// Pick up all candidate cells on boundary
labelHashSet boundaryCells(mesh_.nFaces()-mesh_.nInternalFaces());
{
const polyBoundaryMesh& patches = mesh_.boundaryMesh();
forAll(patchIDs, i)
{
label patchi = patchIDs[i];
const polyPatch& patch = patches[patchi];
if (!patch.coupled())
{
forAll(patch, i)
{
boundaryCells.insert(mesh_.faceOwner()[patch.start()+i]);
}
}
}
}
// Get all sets of faces that can be merged. Since only faces on the same // Get all sets of faces that can be merged. Since only faces on the same
// patch get merged there is no risk of e.g. patchID faces getting merged // patch get merged there is no risk of e.g. patchID faces getting merged
// with original patches (or even processor patches). There is a risk // with original patches (or even processor patches). There is a risk
@ -285,12 +263,7 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
// angle. Would be pretty weird starting mesh though. // angle. Would be pretty weird starting mesh though.
labelListList allFaceSets labelListList allFaceSets
( (
faceCombiner.getMergeSets faceCombiner.getMergeSets(minCos, concaveCos, patchIDs)
(
minCos,
concaveCos,
boundaryCells
)
); );
// Filter out any set that contains any preserveFace // Filter out any set that contains any preserveFace

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -114,6 +114,17 @@ Foam::layerParameters::layerParameters
boundaryMesh.size(), boundaryMesh.size(),
readScalar(dict.lookup("minThickness")) readScalar(dict.lookup("minThickness"))
), ),
mergeFaces_
(
boundaryMesh.size(),
dict.found("mergeFaces")
? (
dict.lookupType<bool>("mergeFaces")
? mergeFace::yes
: mergeFace::no
)
: mergeFace::ifOnMeshedPatch
),
featureAngle_(readScalar(dict.lookup("featureAngle"))), featureAngle_(readScalar(dict.lookup("featureAngle"))),
concaveAngle_ concaveAngle_
( (
@ -361,6 +372,14 @@ Foam::layerParameters::layerParameters
"minThickness", "minThickness",
minThickness_[patchi] minThickness_[patchi]
); );
if (layerDict.found("mergeFaces"))
{
mergeFaces_[patchi] =
layerDict.lookupType<bool>("mergeFaces")
? mergeFace::yes
: mergeFace::no;
}
} }
} }
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -76,6 +76,16 @@ public:
TOTAL_AND_EXPANSION TOTAL_AND_EXPANSION
}; };
//- Enumeration defining whether to merge faces on a given patch. Read
// as a boolean (no/yes). Defaults to merging only on patches which
// were meshed/snapped to (ifOnMeshedPatch).
enum class mergeFace
{
no,
ifOnMeshedPatch,
yes
};
private: private:
@ -112,6 +122,9 @@ private:
//- Minimum total thickness //- Minimum total thickness
scalarField minThickness_; scalarField minThickness_;
//- Whether to merge boundary faces of the same layer cell
List<mergeFace> mergeFaces_;
scalar featureAngle_; scalar featureAngle_;
@ -225,6 +238,12 @@ public:
return minThickness_; return minThickness_;
} }
//- Whether to merge boundary faces of the same layer cell
const List<mergeFace>& mergeFaces() const
{
return mergeFaces_;
}
// Control // Control

View File

@ -2832,11 +2832,25 @@ void Foam::snappyLayerDriver::mergePatchFacesUndo
duplicateFace[cpl[1]] = cpl[0]; duplicateFace[cpl[1]] = cpl[0];
} }
// Get a set of which patches are to have faces merged
labelHashSet patchIDs(meshRefiner_.meshedPatches());
forAll(mesh.boundaryMesh(), patchi)
{
if (layerParams.mergeFaces()[patchi] == layerParameters::mergeFace::no)
{
patchIDs.unset(patchi);
}
if (layerParams.mergeFaces()[patchi] == layerParameters::mergeFace::yes)
{
patchIDs.set(patchi);
}
}
label nChanged = meshRefiner_.mergePatchFacesUndo label nChanged = meshRefiner_.mergePatchFacesUndo
( (
minCos, minCos,
concaveCos, concaveCos,
meshRefiner_.meshedPatches(), patchIDs,
motionDict, motionDict,
duplicateFace duplicateFace
); );

View File

@ -91,7 +91,6 @@ meshQualityControls
writeFlags writeFlags
( (
noRefinement
// scalarLevels // scalarLevels
// layerSets // layerSets
// layerFields // layerFields