LeastSquaresVectors.C
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) 2013-2021 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 \*---------------------------------------------------------------------------*/
25 
26 #include "LeastSquaresVectors.H"
27 
28 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
29 
30 template<class Stencil>
32 (
33  const fvMesh& mesh
34 )
35 :
37  vectors_(mesh.nCells())
38 {
39  calcLeastSquaresVectors();
40 }
41 
42 
43 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
44 
45 template<class Stencil>
47 {}
48 
49 
50 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
51 
52 template<class Stencil>
54 {
55  if (debug)
56  {
57  InfoInFunction << "Calculating least square gradient vectors" << endl;
58  }
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  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  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  // Finalise 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 
99  if (debug)
100  {
102  << "Finished calculating least square gradient vectors" << endl;
103  }
104 }
105 
106 
107 template<class Stencil>
109 {
110  calcLeastSquaresVectors();
111  return true;
112 }
113 
114 
115 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
virtual bool movePoints()
Update the least square vectors when the mesh moves.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
dimensionedSphericalTensor inv(const dimensionedSphericalTensor &dt)
virtual ~LeastSquaresVectors()
Destructor.
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:164
label nCells() const
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
const Vector< label > & geometricD() const
Return the vector of geometric directions in mesh.
Definition: polyMesh.C:814
Templated abstract base-class for optional mesh objects used to automate their allocation to the mesh...
Definition: MeshObject.H:85
dynamicFvMesh & mesh
void collectData(const GeometricField< Type, fvPatchField, volMesh > &fld, List< List< Type >> &stencilFld) const
Use map to get the data into stencil order.
LeastSquaresVectors(const fvMesh &)
Construct given an fvMesh and the minimum determinant criterion.
static const zero Zero
Definition: zero.H:97
Templated 3D Vector derived from VectorSpace adding construction from 3 components, element access using x(), y() and z() member functions and the inner-product (dot-product) and cross product operators.
Definition: Vector.H:57
dimensioned< scalar > magSqr(const dimensioned< Type > &)
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:78
const volVectorField & C() const
Return cell centres as volVectorField.
Least-squares gradient scheme vectors.
#define InfoInFunction
Report an information message using Foam::Info.