initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / OpenFOAM / db / IOstreams / Pstreams / PstreamReduceOps.H
blob1779ed8600f395efd55de61d3190f08424f2955d
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 #ifndef PstreamReduceOps_H
28 #define PstreamReduceOps_H
30 #include "Pstream.H"
31 #include "ops.H"
33 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
35 namespace Foam
38 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40 // Reduce operation with user specified communication schedule
41 template <class T, class BinaryOp>
42 void reduce
44     const List<Pstream::commsStruct>& comms,
45     T& Value,
46     const BinaryOp& bop
49     Pstream::gather(comms, Value, bop);
50     Pstream::scatter(comms, Value);
51 }    
54 // Reduce using either linear or tree communication schedule
55 template <class T, class BinaryOp>
56 void reduce
58     T& Value,
59     const BinaryOp& bop
62     if (Pstream::nProcs() < Pstream::nProcsSimpleSum)
63     {
64         reduce(Pstream::linearCommunication(), Value, bop);
65     }
66     else
67     {
68         reduce(Pstream::treeCommunication(), Value, bop);
69     }
70 }    
73 // Reduce using either linear or tree communication schedule
74 template <class T, class BinaryOp>
75 T returnReduce
77     const T& Value,
78     const BinaryOp& bop
81     T WorkValue(Value);
83     if (Pstream::nProcs() < Pstream::nProcsSimpleSum)
84     {
85         reduce(Pstream::linearCommunication(), WorkValue, bop);
86     }
87     else
88     {
89         reduce(Pstream::treeCommunication(), WorkValue, bop);
90     }
92     return WorkValue;
93 }    
96 // Insist there is a specialisation for the reduction of a scalar
97 void reduce(scalar& Value, const sumOp<scalar>& bop);
100 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
102 } // End namespace Foam
104 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
106 #endif
108 // ************************************************************************* //