Loading...
Searching...
No Matches
codedFixedValueFvPatchField.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-2023 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>
87void Foam::codedFixedValueFvPatchField<Type>::prepare
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 // The 'value' is optional
168 parent_bctype(p, iF, dict, IOobjectOption::NO_READ),
169 codedBase(),
170 dict_
171 (
172 // Copy dictionary without "heavy" data chunks
173 dictionaryContent::copyDict
174 (
175 dict,
176 wordList(), // allow
177 wordList // deny
178 ({
179 "type", // redundant
180 "value"
181 })
182 )
183 ),
184 name_(dict.getCompat<word>("name", {{"redirectType", 1706}})),
185 redirectPatchFieldPtr_(nullptr)
186{
187 updateLibrary(name_);
188
189 if (!this->readValueEntry(dict))
190 {
191 // Ensure field has reasonable initial values
192 this->extrapolateInternal();
193
194 // Evaluate to assign a value
196 }
197}
198
199
200template<class Type>
202(
203 const codedFixedValueFvPatchField<Type>& rhs
204)
205:
206 parent_bctype(rhs),
207 codedBase(),
208 dict_(rhs.dict_), // Deep copy
209 name_(rhs.name_),
210 redirectPatchFieldPtr_(nullptr)
211{}
212
213
214template<class Type>
216(
219)
220:
221 parent_bctype(rhs, iF),
222 codedBase(),
223 dict_(rhs.dict_), // Deep copy
224 name_(rhs.name_),
225 redirectPatchFieldPtr_(nullptr)
227
228
229// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
230
231template<class Type>
234{
235 if (!redirectPatchFieldPtr_)
236 {
237 // Construct a patch
238 // Make sure to construct the patchfield with up-to-date value
239
241 this->writeValueEntry(os);
242 ISpanStream is(os.view());
243 dictionary constructDict(is);
244
245 constructDict.set("type", name_);
246
247 redirectPatchFieldPtr_.reset
248 (
250 (
251 this->patch(),
252 this->internalField(),
253 constructDict
254 ).ptr()
255 );
256
257
258 // Forward copy of codeContext to the code template
259 auto* contentPtr =
260 dynamic_cast<dictionaryContent*>(redirectPatchFieldPtr_.get());
261
262 if (contentPtr)
263 {
264 contentPtr->dict(this->codeContext());
265 }
266 else
267 {
269 << name_ << " Did not derive from dictionaryContent"
270 << nl << nl;
272 }
273 return *redirectPatchFieldPtr_;
274}
275
276
277template<class Type>
279{
280 if (this->updated())
281 {
282 return;
283 }
284
285 // Make sure library containing user-defined fvPatchField is up-to-date
286 updateLibrary(name_);
287
288 const fvPatchField<Type>& fvp = redirectPatchField();
289
290 const_cast<fvPatchField<Type>&>(fvp).updateCoeffs();
291
292 // Copy through value
293 this->operator==(fvp);
294
296}
297
298
299template<class Type>
301(
302 const Pstream::commsTypes commsType
303)
304{
305 // Make sure library containing user-defined fvPatchField is up-to-date
306 updateLibrary(name_);
307
308 const fvPatchField<Type>& fvp = redirectPatchField();
309
310 const_cast<fvPatchField<Type>&>(fvp).evaluate(commsType);
311
312 parent_bctype::evaluate(commsType);
313}
314
315
316template<class Type>
318{
319 this->parent_bctype::write(os);
320 os.writeEntry("name", name_);
321
323}
324
325
326// ************************************************************************* //
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...
A simple container of IOobject preferences. Can also be used for general handling of read/no-read/rea...
Similar to IStringStream but using an externally managed buffer for its input. This allows the input ...
An OSstream with internal List storage.
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition Ostream.H:59
commsTypes
Communications types.
Definition UPstream.H:81
@ buffered
"buffered" : (MPI_Bsend, MPI_Recv)
Definition UPstream.H:82
Base class for function objects and boundary conditions using dynamic code that provides methods for ...
Definition codedBase.H:63
void updateLibrary(const word &name, const dynamicCodeContext &context) const
Update library as required, using the given context.
Definition codedBase.C:283
virtual void clearRedirect() const =0
codedBase(const codedBase &)=delete
No copy construct.
virtual dlLibraryTable & libs() const =0
Mutable access to the loaded dynamic libraries.
virtual string description() const =0
virtual const dictionary & codeDict() const =0
static void writeCodeDict(Ostream &os, const dictionary &dict)
Write code-dictionary contents.
Definition codedBase.C:81
dynamicCodeContext & codeContext()
Access to the dynamic code context.
Definition codedBase.H:131
Constructs on-the-fly a new boundary condition (derived from fixedValueFvPatchField) which is then us...
virtual void write(Ostream &) const
Write.
codedFixedValueFvPatchField(const fvPatch &, const DimensionedField< Type, volMesh > &)
Construct from patch and internal field.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
const fvPatchField< Type > & redirectPatchField() const
Get reference to the underlying patch.
virtual void evaluate(const Pstream::commsTypes commsType=Pstream::commsTypes::buffered)
Evaluate the patch field, sets updated() to false.
A wrapper for dictionary content, without operators that could affect inheritance patterns.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition dictionary.H:133
entry * set(entry *entryPtr)
Assign a new entry, overwriting any existing entry.
Definition dictionary.C:765
A table of dynamically loaded libraries.
static dlLibraryTable & libs()
Table of global libraries.
virtual void write(Ostream &) const
Write includes "value" entry.
const fvPatch & patch() const noexcept
Return the patch.
bool updated() const noexcept
True if the boundary condition has already been updated.
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...
static tmp< fvPatchField< Type > > New(const word &patchFieldType, const fvPatch &, const DimensionedField< Type, volMesh > &)
Return a pointer to a new patchField created on freestore given.
void writeValueEntry(Ostream &os) const
Write *this field as a "value" entry.
const DimensionedField< Type, volMesh > & internalField() const noexcept
Return const-reference to the dimensioned internal field.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
virtual void evaluate(const Pstream::commsTypes commsType=Pstream::commsTypes::buffered)
Evaluate the patch field, sets updated() to false.
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition fvPatch.H:71
A class for handling character strings derived from std::string.
Definition string.H:76
A class for handling words, derived from Foam::string.
Definition word.H:66
volScalarField & p
#define DetailInfo
Definition evalEntry.C:30
OBJstream os(runTime.globalPath()/outputName)
#define WarningInFunction
Report a warning using Foam::Warning.
const std::string patch
OpenFOAM patch number as a std::string.
List< word > wordList
List of word.
Definition fileName.H:60
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition Ostream.H:519
tmp< faMatrix< Type > > operator==(const faMatrix< Type > &, const faMatrix< Type > &)
void rhs(fvMatrix< typename Expr::value_type > &m, const Expr &expression)
constexpr char nl
The newline '\n' character (0x0a).
Definition Ostream.H:50
dictionary dict