Loading...
Searching...
No Matches
faGradScheme.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) 2016-2017 Wikki Ltd
9 Copyright (C) 2019-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
29#include "fa.H"
30#include "objectRegistry.H"
31#include "solution.H"
32
33// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34
35namespace Foam
36{
37
38// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40namespace fa
41{
42
43// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * //
44
45template<class Type>
47(
48 const faMesh& mesh,
49 Istream& schemeData
50)
51{
52 if (fa::debug)
53 {
55 << "constructing gradScheme<Type>"
56 << endl;
57 }
58
59 if (schemeData.eof())
60 {
61 FatalIOErrorInFunction(schemeData)
62 << "Grad scheme not specified" << nl << nl
63 << "Valid grad schemes are :" << nl
64 << IstreamConstructorTablePtr_->sortedToc()
66 }
67
68 const word schemeName(schemeData);
69
70 auto* ctorPtr = IstreamConstructorTable(schemeName);
71
72 if (!ctorPtr)
73 {
75 (
76 schemeData,
77 "grad",
78 schemeName,
79 *IstreamConstructorTablePtr_
80 ) << exit(FatalIOError);
81 }
82
83 return ctorPtr(mesh, schemeData);
84}
85
86
87// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
88
89template<class Type>
90tmp
91<
93 <
97 >
98>
100(
102 const word& name
103) const
104{
105 typedef typename outerProduct<vector, Type>::type GradType;
107
108 GradFieldType* pgGrad =
109 mesh().thisDb().template getObjectPtr<GradFieldType>(name);
110
111 if (!this->mesh().cache(name)) // || this->mesh().changing()
112 {
113 // Delete any old occurrences to avoid double registration
114 if (pgGrad && pgGrad->ownedByRegistry())
115 {
116 solution::cachePrintMessage("Deleting", name, vsf);
117 delete pgGrad;
118 }
119
120 solution::cachePrintMessage("Calculating", name, vsf);
121 return calcGrad(vsf, name);
122 }
123
124
125 if (!pgGrad)
126 {
127 solution::cachePrintMessage("Calculating and caching", name, vsf);
128
129 pgGrad = calcGrad(vsf, name).ptr();
130 regIOobject::store(pgGrad);
131 }
132 else
133 {
134 if (pgGrad->upToDate(vsf))
135 {
136 solution::cachePrintMessage("Reusing", name, vsf);
137 }
138 else
139 {
140 solution::cachePrintMessage("Updating", name, vsf);
141 delete pgGrad;
142
143 pgGrad = calcGrad(vsf, name).ptr();
144 regIOobject::store(pgGrad);
145 }
146 }
147
148 return *pgGrad;
149}
150
151
152template<class Type>
153tmp
154<
163(
165) const
166{
167 return grad(vsf, "grad(" + vsf.name() + ')');
168}
169
170
171template<class Type>
172tmp
173<
186 typedef typename outerProduct<vector, Type>::type GradType;
188
189 tmp<GradFieldType> tgrad = grad(tvsf());
190 tvsf.clear();
191 return tgrad;
192}
193
194
195// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
196
197} // End namespace fa
198
199// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
200
201} // End namespace Foam
202
203// ************************************************************************* //
Generic GeometricField class.
const word & name() const noexcept
Return the object name.
Definition IOobjectI.H:205
bool eof() const noexcept
True if end of input seen.
Definition IOstream.H:289
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition Istream.H:60
Mesh data needed to do the Finite Area discretisation.
Definition areaFaMesh.H:50
Finite area mesh (used for 2-D non-Euclidian finite area method) defined using a patch of faces on a ...
Definition faMesh.H:140
faPatchField<Type> abstract base class. This class gives a fat-interface to all derived classes cover...
const faMesh & mesh() const noexcept
Return mesh reference.
static tmp< gradScheme< Type > > New(const faMesh &mesh, Istream &schemeData)
Return a pointer to a new gradScheme created on freestore.
tmp< GeometricField< typename outerProduct< vector, Type >::type, faPatchField, areaMesh > > grad(const GeometricField< Type, faPatchField, areaMesh > &, const word &name) const
Calculate and return the grad of the given field which may have been cached.
virtual tmp< GeometricField< typename outerProduct< vector, Type >::type, faPatchField, areaMesh > > calcGrad(const GeometricField< Type, faPatchField, areaMesh > &, const word &name) const =0
Calculate and return the grad of the given field.
typeOfRank< typenamepTraits< arg1 >::cmptType, direction(pTraits< arg1 >::rank)+direction(pTraits< arg2 >::rank)>::type type
Definition products.H:118
bool store()
Register object with its registry and transfer ownership to the registry.
static void cachePrintMessage(const char *message, const word &name, const FieldType &fld)
Helper for printing cache message.
A class for managing temporary objects.
Definition tmp.H:75
A class for handling words, derived from Foam::string.
Definition word.H:66
dynamicFvMesh & mesh
#define FatalIOErrorInLookup(ios, lookupTag, lookupName, lookupTable)
Report an error message using Foam::FatalIOError.
Definition error.H:637
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition error.H:629
#define InfoInFunction
Report an information message using Foam::Info.
Namespace for finite-area.
Definition limitHeight.C:30
Namespace for OpenFOAM.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition Ostream.H:519
IOerror FatalIOError
Error stream (stdout output on all processes), with additional 'FOAM FATAL IO ERROR' header text and ...
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
Definition exprTraits.C:127
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition errorManip.H:125
constexpr char nl
The newline '\n' character (0x0a).
Definition Ostream.H:50