parallel postChannel
[OpenFOAM-1.5.x.git] / applications / utilities / postProcessing / miscellaneous / postChannel / channelIndexTemplates.C
blob9fc8ff03609b0681b67d664a54b70293b493091d
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2008 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     Field<T> regionField
58     (
59         regionSum(cellField)
60       / regionCount_,
61         sortMap_
62     );
64     // Symmetry?
65     if (symmetric_)
66     {
67         label nlb2 = cellRegion_().nRegions()/2;
69         if (asymmetric)
70         {
71             for (label j=0; j<nlb2; j++)
72             {
73                 regionField[j] =
74                     0.5
75                   * (
76                         regionField[j]
77                       - regionField[cellRegion_().nRegions() - j - 1]
78                     );
79             }
80         }
81         else
82         {
83             for (label j=0; j<nlb2; j++)
84             {
85                 regionField[j] =
86                     0.5
87                   * (
88                         regionField[j]
89                       + regionField[cellRegion_().nRegions() - j - 1]
90                     );
91             }
92         }
94         regionField.setSize(nlb2);
95     }
97     return regionField;
101 // ************************************************************************* //