codedMixedFvPatchField.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2016 OpenFOAM Foundation
9 Copyright (C) 2016-2021 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
31#include "fvPatchFieldMapper.H"
32#include "volFields.H"
33#include "dynamicCode.H"
34#include "dictionaryContent.H"
35
36// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
37
38template<class Type>
40{
41 return this->db().time().libs();
42}
43
44
45template<class Type>
47{
48 return
49 "patch "
50 + this->patch().name()
51 + " on field "
52 + this->internalField().name();
53}
54
55
56template<class Type>
58{
59 redirectPatchFieldPtr_.reset(nullptr);
60}
61
62
63template<class Type>
66{
67 const dictionary* ptr = dict_.findDict("codeContext", keyType::LITERAL);
68 return (ptr ? *ptr : dictionary::null);
69}
70
71
72template<class Type>
75{
76 // Inline "code" or from system/codeDict
77 return
78 (
79 dict_.found("code")
80 ? dict_
81 : codedBase::codeDict(this->db()).subDict(name_)
82 );
83}
84
85
86template<class Type>
88(
89 dynamicCode& dynCode,
90 const dynamicCodeContext& context
91) const
92{
93 // Take no chances - typeName must be identical to name_
94 dynCode.setFilterVariable("typeName", name_);
95
96 // Set TemplateType and FieldType filter variables
97 dynCode.setFieldTemplates<Type>();
98
99 // Compile filtered C template
100 dynCode.addCompileFile(codeTemplateC);
101
102 // Copy filtered H template
103 dynCode.addCopyFile(codeTemplateH);
104
105 #ifdef FULLDEBUG
106 dynCode.setFilterVariable("verbose", "true");
108 <<"compile " << name_ << " sha1: " << context.sha1() << endl;
109 #endif
110
111 // Define Make/options
112 dynCode.setMakeOptions
113 (
114 "EXE_INC = -g \\\n"
115 "-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
116 "-I$(LIB_SRC)/meshTools/lnInclude \\\n"
117 + context.options()
118 + "\n\nLIB_LIBS = \\\n"
119 " -lOpenFOAM \\\n"
120 " -lfiniteVolume \\\n"
121 " -lmeshTools \\\n"
122 + context.libs()
123 );
124}
125
126
127// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
128
129template<class Type>
131(
132 const fvPatch& p,
134)
135:
136 parent_bctype(p, iF),
137 codedBase(),
138 redirectPatchFieldPtr_(nullptr)
139{}
140
141
142template<class Type>
144(
146 const fvPatch& p,
148 const fvPatchFieldMapper& mapper
149)
150:
151 parent_bctype(rhs, p, iF, mapper),
152 codedBase(),
153 dict_(rhs.dict_), // Deep copy
154 name_(rhs.name_),
155 redirectPatchFieldPtr_(nullptr)
156{}
157
158
159template<class Type>
161(
162 const fvPatch& p,
164 const dictionary& dict
165)
166:
167 parent_bctype(p, iF, dict),
168 codedBase(),
169 dict_
170 (
171 // Copy dictionary, but without "heavy" data chunks
172 dictionaryContent::copyDict
173 (
174 dict,
175 wordList(), // allow
176 wordList // deny
177 ({
178 "type", // redundant
179 "value", "refValue", "refGradient", "valueFraction"
180 })
181 )
182 ),
183 name_(dict.getCompat<word>("name", {{"redirectType", 1706}})),
184 redirectPatchFieldPtr_(nullptr)
185{
186 updateLibrary(name_);
187}
188
189
190template<class Type>
192(
194)
195:
196 parent_bctype(rhs),
197 codedBase(),
198 dict_(rhs.dict_), // Deep copy
199 name_(rhs.name_),
200 redirectPatchFieldPtr_(nullptr)
201{}
202
203
204template<class Type>
206(
209)
210:
211 parent_bctype(rhs, iF),
212 codedBase(),
213 dict_(rhs.dict_), // Deep copy
214 name_(rhs.name_),
215 redirectPatchFieldPtr_(nullptr)
216{}
217
218
219// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
220
221template<class Type>
224{
225 if (!redirectPatchFieldPtr_)
226 {
227 // Construct a patch
228 // Make sure to construct the patchfield with up-to-date value
229
230 // Write the data from the mixed b.c.
232 this->parent_bctype::write(os);
233 IStringStream is(os.str());
234 // Construct dictionary from it.
235 dictionary constructDict(is);
236
237 // Override type
238 constructDict.set("type", name_);
239
240 redirectPatchFieldPtr_.reset
241 (
242 dynamic_cast<parent_bctype*>
243 (
245 (
246 this->patch(),
247 this->internalField(),
248 constructDict
249 ).ptr()
250 )
251 );
252
253 // Forward copy of dictionary content to the code template
254 auto* contentPtr =
255 dynamic_cast<dictionaryContent*>(redirectPatchFieldPtr_.get());
256
257 if (contentPtr)
258 {
259 contentPtr->dict(this->codeContext());
260 }
261 else
262 {
264 << name_ << " Did not derive from dictionaryContent"
265 << nl << nl;
266 }
267 }
268 return *redirectPatchFieldPtr_;
269}
270
271
272template<class Type>
274{
275 if (this->updated())
276 {
277 return;
278 }
279
280 // Make sure library containing user-defined fvPatchField is up-to-date
281 updateLibrary(name_);
282
283 const parent_bctype& fvp = redirectPatchField();
284 const_cast<parent_bctype&>(fvp).updateCoeffs();
285
286 // Copy through coefficients
287 this->refValue() = fvp.refValue();
288 this->refGrad() = fvp.refGrad();
289 this->valueFraction() = fvp.valueFraction();
290
291 this->parent_bctype::updateCoeffs();
292}
293
294
295template<class Type>
297(
298 const Pstream::commsTypes commsType
299)
300{
301 // Make sure library containing user-defined fvPatchField is up-to-date
302 updateLibrary(name_);
303
304 const parent_bctype& fvp = redirectPatchField();
305
306 // - updates the value of fvp (though not used)
307 // - resets the updated() flag
308 const_cast<parent_bctype&>(fvp).evaluate(commsType);
309
310 // Update the value (using the coefficients) locally
311 parent_bctype::evaluate(commsType);
312}
313
314
315template<class Type>
317{
318 this->parent_bctype::write(os);
319 os.writeEntry("name", name_);
320
322}
323
324
325// ************************************************************************* //
Macros for easy insertion into run-time selection tables.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
void evaluate()
Evaluate boundary conditions.
Input from string buffer, using a ISstream. Always UNCOMPRESSED.
Definition: StringStream.H:112
Output to string buffer, using a OSstream. Always UNCOMPRESSED.
Definition: StringStream.H:231
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:62
Ostream & writeEntry(const keyType &key, const T &value)
Write a keyword/value entry.
Definition: Ostream.H:239
commsTypes
Types of communications.
Definition: UPstream.H:67
Base class for function objects and boundary conditions using dynamic code that provides methods for ...
Definition: codedBase.H:67
static void writeCodeDict(Ostream &os, const dictionary &dict)
Write code-dictionary contents.
Definition: codedBase.C:88
Constructs on-the-fly a new boundary condition (derived from mixedFvPatchField) which is then used to...
virtual const dictionary & codeContext() const
Additional 'codeContext' dictionary to pass through.
virtual void prepare(dynamicCode &, const dynamicCodeContext &) const
Adapt the context for the current object.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
virtual const dictionary & codeDict() const
The code dictionary. Inline "code" or from system/codeDict.
const mixedFvPatchField< Type > & redirectPatchField() const
Get reference to the underlying patchField.
virtual void clearRedirect() const
Clear redirected object(s)
virtual dlLibraryTable & libs() const
Mutable access to the loaded dynamic libraries.
virtual string description() const
Description (type + name) for the output.
A wrapper for dictionary content, without operators that could affect inheritance patterns.
const dictionary & dict() const noexcept
Read-access to the content.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:126
dictionary * findDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX)
Find and return a sub-dictionary pointer if present.
Definition: dictionaryI.H:127
T getCompat(const word &keyword, std::initializer_list< std::pair< const char *, int > > compat, enum keyType::option matchOpt=keyType::REGEX) const
entry * set(entry *entryPtr)
Assign a new entry, overwriting any existing entry.
Definition: dictionary.C:780
A table of dynamically loaded libraries.
static dlLibraryTable & libs()
Table of global libraries.
Encapsulation of dynamic code dictionaries.
const string & libs() const noexcept
The code libs (LIB_LIBS)
const SHA1 & sha1() const noexcept
The SHA1 calculated from options, libs, include, code, etc.
const string & options() const noexcept
The code options (Make/options)
Tools for handling dynamic code compilation.
Definition: dynamicCode.H:60
void addCopyFile(const fileName &name)
Add a file template name, which will be found and filtered.
Definition: dynamicCode.C:359
void setFieldTemplates()
Define a filter variables TemplateType and FieldType.
Definition: dynamicCode.H:286
void setFilterVariable(const word &key, const std::string &value)
Define a filter variable.
Definition: dynamicCode.C:388
void addCompileFile(const fileName &name)
Add a file template name, which will be found and filtered.
Definition: dynamicCode.C:353
void setMakeOptions(const std::string &content)
Define contents for Make/options.
Definition: dynamicCode.C:397
virtual bool write()
Write the output fields.
A FieldMapper for finite-volume patch fields.
Abstract base class with a fat-interface to all derived classes covering all possible ways in which t...
Definition: fvPatchField.H:82
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition: fvPatch.H:71
This boundary condition provides a base class for 'mixed' type boundary conditions,...
virtual Field< Type > & refGrad()
virtual Field< Type > & refValue()
virtual scalarField & valueFraction()
A class for handling character strings derived from std::string.
Definition: string.H:79
A class for handling words, derived from Foam::string.
Definition: word.H:68
volScalarField & p
#define DetailInfo
Definition: evalEntry.C:37
OBJstream os(runTime.globalPath()/outputName)
#define WarningInFunction
Report a warning using Foam::Warning.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:372
constexpr char nl
The newline '\n' character (0x0a)
Definition: Ostream.H:53
dictionary dict