BUGFIX: Seg-fault in multiphaseInterFoam. Author: Henrik Rusche. Merge: Hrvoje Jasak
[foam-extend-3.2.git] / src / decompositionMethods / parMetisDecomp / parMetisDecomp.H
blobef164e7f9f9f04efa100e8a5b3d21905bb2073e2
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend 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 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::parMetisDecomp
27 Description
29 SourceFiles
30     parMetisDecomp.C
32 \*---------------------------------------------------------------------------*/
34 #ifndef parMetisDecomp_H
35 #define parMetisDecomp_H
37 #include "decompositionMethod.H"
39 namespace Foam
42 /*---------------------------------------------------------------------------*\
43                         Class parMetisDecomp Declaration
44 \*---------------------------------------------------------------------------*/
46 class parMetisDecomp
48     public decompositionMethod
50     // Private data
52         const polyMesh& mesh_;
55     // Private Member Functions
57         //- Disallow default bitwise copy construct
58         parMetisDecomp(const parMetisDecomp&);
60         //- Disallow default bitwise assignment
61         void operator=(const parMetisDecomp&);
64         //- Insert list in front of list
65         template<class Type>
66         static void prepend(const UList<Type>&, List<Type>&);
68         //- Insert list at end of list
69         template<class Type>
70         static void append(const UList<Type>&, List<Type>&);
72         label decompose
73         (
74             Field<int>& xadj,
75             Field<int>& adjncy,
76             const pointField& cellCentres,
77             Field<int>& cellWeights,
78             Field<int>& faceWeights,
79             const List<int>& options,
81             List<int>& finalDecomp
82         );
85 public:
87     //- Runtime type information
88     TypeName("parMetis");
91     // Constructors
93         //- Construct given the decomposition dictionary and mesh
94         parMetisDecomp
95         (
96             const dictionary& decompositionDict,
97             const polyMesh& mesh
98         );
101     // Destructor
103         ~parMetisDecomp()
104         {}
107     // Member Functions
109         //- parMetis handles Foam processor boundaries
110         virtual bool parallelAware() const
111         {
112             return true;
113         }
115         //- Return for every coordinate the wanted processor number. Use the
116         //  mesh connectivity (if needed)
117         //  Weights get normalised so the minimum value is 1 before truncation
118         //  to an integer so the weights should be multiples of the minimum
119         //  value. The overall sum of weights might otherwise overflow.
120         virtual labelList decompose
121         (
122             const pointField& points,
123             const scalarField& pointWeights
124         );
126         //- Return for every coordinate the wanted processor number. Gets
127         //  passed agglomeration map (from fine to coarse cells) and coarse cell
128         //  location. Can be overridden by decomposers that provide this
129         //  functionality natively.
130         //  See note on weights above.
131         virtual labelList decompose
132         (
133             const labelList& cellToRegion,
134             const pointField& regionPoints,
135             const scalarField& regionWeights
136         );
138         //- Same but with uniform weights
139         virtual labelList decompose
140         (
141             const labelList& cellToRegion,
142             const pointField& regionPoints
143         )
144         {
145             return decompose
146             (
147                 cellToRegion,
148                 regionPoints,
149                 scalarField(regionPoints.size(), 1.0)
150             );
151         }
153         //- Return for every coordinate the wanted processor number. Explicitly
154         //  provided mesh connectivity.
155         //  The connectivity is equal to mesh.cellCells() except for
156         //  - in parallel the cell numbers are global cell numbers (starting
157         //    from 0 at processor0 and then incrementing all through the
158         //    processors)
159         //  - the connections are across coupled patches
160         //  See note on weights above.
161         virtual labelList decompose
162         (
163             const labelListList& globalCellCells,
164             const pointField& cc,
165             const scalarField& cWeights
166         );
170 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
172 } // End namespace Foam
174 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
176 #ifdef NoRepository
177 #   include "parMetisDecompTemplates.C"
178 #endif
180 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
182 #endif
184 // ************************************************************************* //