initial commit for version 1.5.x patch release
[OpenFOAM-1.5.x.git] / src / finiteVolume / fvMesh / fvMeshCutSurface / meshCut / cellAddressing.C
blobbe1fbb99df3bf14272858280f3b50f44a033ad12
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 Description
27 \*---------------------------------------------------------------------------*/
29 #include "cellAddressing.H"
30 #include "labelHashSet.H"
31 #include "cellModel.H"
34 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
36 Foam::labelList Foam::cellAddressing::makeIdentity(const label size)
38     labelList result(size);
39     forAll(result, resultI)
40     {
41         result[resultI] = resultI;
42     }
43     return result;
47 Foam::label Foam::cellAddressing::findEdge(const edge& e)
49     forAll(edges_, edgeI)
50     {
51         if (edges_[edgeI] == e)
52         {
53             return edgeI;
54         }
55     }
56     FatalErrorIn
57     (
58         "cellAddressing::findEdge(const edge&)"
59     )   << "Problem: cannot find edge " << e << " in edges " << edges_
60         << exit(FatalError);
62     return -1;
66 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
68 // Construct from components
69 Foam::cellAddressing::cellAddressing(const Foam::cellModel& model)
71     modelFaces_(model.modelFaces()),
72     edges_(model.edges(makeIdentity(model.nPoints()))),
73     edgeFaces_(model.nEdges()),
74     faceEdges_(model.nFaces()),
75     pointEdges_(model.nPoints())
77     List<labelHashSet > dynEdgeFaces(edgeFaces_.size());
79     forAll(faceEdges_, faceI)
80     {
81         DynamicList<label> fEdges;
83         const face& f = modelFaces_[faceI];
85         forAll(f, fp)
86         {
87             label edgeI = findEdge(edge(f[fp], f[(fp+1)%f.size()]));
89             // Append to faceEdges
90             fEdges.append(edgeI);
92             // Append to edgefaces
93             labelHashSet& eFaces = dynEdgeFaces[edgeI];
95             if (!eFaces.found(faceI))
96             {
97                 eFaces.insert(faceI);
98             }
99         }
100         fEdges.shrink();
102         // Copy into faceEdges_
103         faceEdges_[faceI].transfer(fEdges.shrink());
104     }
106     // Convert dynEdgeFaces into edgeFaces_
108     forAll(dynEdgeFaces, edgeI)
109     {
110         edgeFaces_[edgeI] = dynEdgeFaces[edgeI].toc();
111     }
114     // Convert edges_ into pointEdges
115     List<DynamicList<label> > dynPointEdges(model.nPoints());
117     forAll(edges_, edgeI)
118     {
119         const edge& e = edges_[edgeI];
121         dynPointEdges[e.start()].append(edgeI);
122         dynPointEdges[e.end()].append(edgeI);
123     }
125     forAll(dynPointEdges, pointI)
126     {
127         pointEdges_[pointI].transfer(dynPointEdges[pointI].shrink());
128     }
132 // ************************************************************************* //