UpwindFitScheme.H
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 Class
25  Foam::UpwindFitScheme
26 
27 Description
28  Upwind biased fit surface interpolation scheme that applies an explicit
29  correction to linear.
30 
31 \*---------------------------------------------------------------------------*/
32 
33 #ifndef UpwindFitScheme_H
34 #define UpwindFitScheme_H
35 
36 #include "UpwindFitData.H"
37 #include "linear.H"
38 
39 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40 
41 namespace Foam
42 {
43 
44 /*---------------------------------------------------------------------------*\
45  Class UpwindFitScheme Declaration
46 \*---------------------------------------------------------------------------*/
47 
48 template<class Type, class Polynomial, class Stencil>
49 class UpwindFitScheme
50 :
51  public linear<Type>
52 {
53  // Private Data
54 
55  //- Reference to the surface flux used to choose upwind direction
56  const surfaceScalarField& faceFlux_;
57 
58  //- Factor the fit is allowed to deviate from linear.
59  // This limits the amount of high-order correction and increases
60  // stability on bad meshes
61  const scalar linearLimitFactor_;
62 
63  //- Weights for central stencil
64  const scalar centralWeight_;
65 
66 
67  // Private Member Functions
68 
69  //- Disallow default bitwise copy construct
71 
72  //- Disallow default bitwise assignment
73  void operator=(const UpwindFitScheme&);
74 
75 
76 public:
77 
78  //- Runtime type information
79  TypeName("UpwindFitScheme");
80 
81 
82  // Constructors
83 
84  //- Construct from mesh and Istream
85  // The name of the flux field is read from the Istream and looked-up
86  // from the mesh objectRegistry
87  UpwindFitScheme(const fvMesh& mesh, Istream& is)
88  :
89  linear<Type>(mesh),
90  faceFlux_(mesh.lookupObject<surfaceScalarField>(word(is))),
91  linearLimitFactor_(readScalar(is)),
92  centralWeight_(1000)
93  {}
94 
95 
96  //- Construct from mesh, faceFlux and Istream
98  (
99  const fvMesh& mesh,
100  const surfaceScalarField& faceFlux,
101  Istream& is
102  )
103  :
104  linear<Type>(mesh),
105  faceFlux_(faceFlux),
106  linearLimitFactor_(readScalar(is)),
107  centralWeight_(1000)
108  {}
109 
110 
111  // Member Functions
112 
113  //- Return true if this scheme uses an explicit correction
114  virtual bool corrected() const
115  {
116  return true;
117  }
118 
119  //- Return the explicit correction to the face-interpolate
122  (
124  ) const
125  {
126  const fvMesh& mesh = this->mesh();
127 
129  (
130  mesh,
131  false, // pureUpwind
132  scalar(0.5)
133  );
134 
135  const UpwindFitData<Polynomial>& ufd =
137  (
138  mesh,
139  stencil,
140  true, // calculate as offset to linear
141  linearLimitFactor_,
142  centralWeight_
143  );
144 
145  const List<scalarList>& fo = ufd.owncoeffs();
146  const List<scalarList>& fn = ufd.neicoeffs();
147 
148  return stencil.weightedSum(faceFlux_, vf, fo, fn);
149  }
150 };
151 
152 
153 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
154 
155 } // End namespace Foam
156 
157 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
158 
159 // Add the patch constructor functions to the hash tables
161 #define makeUpwindFitSurfaceInterpolationTypeScheme\
162 ( \
163  SS, \
164  POLYNOMIAL, \
165  STENCIL, \
166  TYPE \
167 ) \
168  \
169 typedef UpwindFitScheme<TYPE, POLYNOMIAL, STENCIL> \
170  UpwindFitScheme##TYPE##POLYNOMIAL##STENCIL##_; \
171 defineTemplateTypeNameAndDebugWithName \
172  (UpwindFitScheme##TYPE##POLYNOMIAL##STENCIL##_, #SS, 0); \
173  \
174 surfaceInterpolationScheme<TYPE>::addMeshConstructorToTable \
175 <UpwindFitScheme<TYPE, POLYNOMIAL, STENCIL>> \
176  add##SS##STENCIL##TYPE##MeshConstructorToTable_; \
177  \
178 surfaceInterpolationScheme<TYPE>::addMeshFluxConstructorToTable \
179 <UpwindFitScheme<TYPE, POLYNOMIAL, STENCIL>> \
180  add##SS##STENCIL##TYPE##MeshFluxConstructorToTable_;
182 #define makeUpwindFitSurfaceInterpolationScheme(SS, POLYNOMIAL, STENCIL) \
183  \
184 makeUpwindFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,scalar) \
185 makeUpwindFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,vector) \
186 makeUpwindFitSurfaceInterpolationTypeScheme \
187 ( \
188  SS, \
189  POLYNOMIAL, \
190  STENCIL, \
191  sphericalTensor \
192 ) \
193 makeUpwindFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,symmTensor) \
194 makeUpwindFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,tensor)
195 
196 
197 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
198 
199 #endif
200 
201 // ************************************************************************* //
Central-differencing interpolation scheme class.
Definition: linear.H:50
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
Definition: Istream.H:57
const fvMesh & mesh() const
Return mesh reference.
virtual tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > correction(const GeometricField< Type, fvPatchField, volMesh > &vf) const
Return the explicit correction to the face-interpolate.
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions)
const List< scalarList > & neicoeffs() const
Return reference to neighbour fit coefficients.
static const UpwindFitData< Polynomial > & New(const fvMesh &mesh)
Definition: MeshObject.C:44
TypeName("UpwindFitScheme")
Runtime type information.
A class for handling words, derived from string.
Definition: word.H:59
Upwind biased fit surface interpolation scheme that applies an explicit correction to linear...
const List< scalarList > & owncoeffs() const
Return reference to owner fit coefficients.
bool readScalar(const char *buf, doubleScalar &s)
Read whole of buf as a scalar. Return true if successful.
Definition: doubleScalar.H:68
tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > weightedSum(const surfaceScalarField &phi, const GeometricField< Type, fvPatchField, volMesh > &fld, const List< List< scalar >> &ownWeights, const List< List< scalar >> &neiWeights) const
Sum vol field contributions to create face values.
Data for the quadratic fit correction interpolation scheme to be used with upwind biased stencil...
Definition: UpwindFitData.H:54
Creates upwind stencil by shifting a centred stencil to upwind and downwind faces and optionally remo...
virtual bool corrected() const
Return true if this scheme uses an explicit correction.
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:78
A class for managing temporary objects.
Definition: PtrList.H:53
Namespace for OpenFOAM.