initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / applications / utilities / postProcessing / miscellaneous / postChannel / channelIndexTemplates.C
blob41c95d79c9fa5f65e305009c8f015ad65c93a7be
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
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 the
13     Free Software Foundation; either version 2 of the License, or (at your
14     option) any later version.
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.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "channelIndex.H"
29 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
31 template<class T>
32 Foam::Field<T> Foam::channelIndex::regionSum(const Field<T>& cellField) const
34     Field<T> regionField(cellRegion_().nRegions(), pTraits<T>::zero);
36     forAll(cellRegion_(), cellI)
37     {
38         regionField[cellRegion_()[cellI]] += cellField[cellI];
39     }
41     // Global sum
42     Pstream::listCombineGather(regionField, plusEqOp<T>());
43     Pstream::listCombineScatter(regionField);
45     return regionField;
49 template<class T>
50 Foam::Field<T> Foam::channelIndex::collapse
52     const Field<T>& cellField,
53     const bool asymmetric
54 ) const
56     // Average and order
57     const Field<T> summedField(regionSum(cellField));
59     Field<T> regionField
60     (
61         summedField
62       / regionCount_,
63         sortMap_
64     );
66     // Symmetry?
67     if (symmetric_)
68     {
69         label nlb2 = cellRegion_().nRegions()/2;
71         if (asymmetric)
72         {
73             for (label j=0; j<nlb2; j++)
74             {
75                 regionField[j] =
76                     0.5
77                   * (
78                         regionField[j]
79                       - regionField[cellRegion_().nRegions() - j - 1]
80                     );
81             }
82         }
83         else
84         {
85             for (label j=0; j<nlb2; j++)
86             {
87                 regionField[j] =
88                     0.5
89                   * (
90                         regionField[j]
91                       + regionField[cellRegion_().nRegions() - j - 1]
92                     );
93             }
94         }
96         regionField.setSize(nlb2);
97     }
99     return regionField;
103 // ************************************************************************* //