layerAverageTemplates.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) 2011-2022 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 "layerAverage.H"
27 
28 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
29 
30 template<class T>
31 T Foam::functionObjects::layerAverage::symmetricCoeff() const
32 {
33  return pTraits<T>::one;
34 }
35 
36 
37 template<class T>
38 Foam::Field<T> Foam::functionObjects::layerAverage::sum
39 (
40  const Field<T>& cellField
41 ) const
42 {
43  Field<T> layerField(nLayers_, Zero);
44 
45  forAll(cellLayer_, celli)
46  {
47  if (cellLayer_[celli] != -1)
48  {
49  layerField[cellLayer_[celli]] += cellField[celli];
50  }
51  }
52 
54  Pstream::listCombineScatter(layerField);
55 
56  return layerField;
57 }
58 
59 
60 template<class T>
61 Foam::Field<T> Foam::functionObjects::layerAverage::average
62 (
63  const Field<T>& cellField
64 ) const
65 {
66  // Sum and average
67  Field<T> layerField(sum(cellField)/layerCount_);
68 
69  // Handle symmetry
70  if (symmetric_)
71  {
72  const T coeff = symmetricCoeff<T>();
73 
74  for (label i=0; i<nLayers_/2; i++)
75  {
76  const label j = nLayers_ - i - 1;
77 
78  layerField[i] =
79  (layerField[i] + cmptMultiply(coeff, layerField[j]))/2;
80  }
81 
82  layerField.setSize(nLayers_/2);
83  }
84 
85  return layerField;
86 }
87 
88 
89 // ************************************************************************* //
static void listCombineScatter(const List< commsStruct > &comms, List< T > &Value, const int tag, const label comm)
Scatter data. Reverse of combineGather.
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
static void listCombineGather(const List< commsStruct > &comms, List< T > &Value, const CombineOp &cop, const int tag, const label comm)
static const zero Zero
Definition: zero.H:97
dimensioned< Type > cmptMultiply(const dimensioned< Type > &, const dimensioned< Type > &)
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
void setSize(const label)
Reset size of List.
Definition: List.C:281
const volScalarField & T