LeastSquaresVectors.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) 2013-2016 OpenFOAM Foundation
9 Copyright (C) 2020-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
29#include "LeastSquaresVectors.H"
30
31// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
32
33template<class Stencil>
35(
36 const fvMesh& mesh
37)
38:
40 vectors_(mesh.nCells())
41{
42 calcLeastSquaresVectors();
43}
44
45
46// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
47
48template<class Stencil>
50{}
51
52
53// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
54
55template<class Stencil>
57{
58 DebugInFunction << "Calculating least square gradient vectors" << nl;
59
60 const fvMesh& mesh = this->mesh_;
61 const extendedCentredCellToCellStencil& stencil = this->stencil();
62
63 stencil.collectData(mesh.C(), vectors_);
64
65 // Create the base form of the dd-tensor
66 // including components for the "empty" directions
67 const symmTensor dd0(sqr((Vector<label>::one - mesh.geometricD())/2));
68
69 forAll(vectors_, i)
70 {
71 List<vector>& lsvi = vectors_[i];
72 symmTensor dd(dd0);
73
74 // The current cell is 0 in the stencil
75 // Calculate the deltas and sum the weighted dd
76 for (label j = 1; j < lsvi.size(); ++j)
77 {
78 lsvi[j] = lsvi[j] - lsvi[0];
79 const scalar magSqrLsvi = magSqr(lsvi[j]);
80 dd += sqr(lsvi[j])/magSqrLsvi;
81 lsvi[j] /= magSqrLsvi;
82 }
83
84 // Invert dd
85 dd = inv(dd);
86
87 // Remove the components corresponding to the empty directions
88 dd -= dd0;
89
90 // Finalize the gradient weighting vectors
91 lsvi[0] = Zero;
92 for (label j = 1; j < lsvi.size(); ++j)
93 {
94 lsvi[j] = dd & lsvi[j];
95 lsvi[0] -= lsvi[j];
96 }
97 }
98
100 << "Finished calculating least square gradient vectors" << endl;
101}
102
103
104template<class Stencil>
106{
107 calcLeastSquaresVectors();
108 return true;
109}
110
111
112// ************************************************************************* //
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: List.H:77
Templated abstract base-class for optional mesh objects used to automate their allocation to the mesh...
Definition: MeshObject.H:91
void size(const label n)
Older name for setAddressableSize.
Definition: UList.H:114
void collectData(const GeometricField< Type, fvPatchField, volMesh > &fld, List< List< Type > > &stencilFld) const
Use map to get the data into stencil order.
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:91
Least-squares gradient scheme vectors.
virtual bool movePoints()
Update the least square vectors when the mesh moves.
virtual ~LeastSquaresVectors()
Destructor.
A class representing the concept of 1 (one) that can be used to avoid manipulating objects known to b...
Definition: one.H:62
dynamicFvMesh & mesh
#define DebugInfo
Report an information message using Foam::Info.
#define DebugInFunction
Report an information message using Foam::Info.
Namespace for OpenFOAM.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:372
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:131
dimensionedSphericalTensor inv(const dimensionedSphericalTensor &dt)
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
constexpr char nl
The newline '\n' character (0x0a)
Definition: Ostream.H:53
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:333