Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / tetFiniteElement / tetPolyMesh / calcTetPolyMeshAddressing.C
blobeb9dfa752b5a2966bfe92fca0ea1b0ba4a87f288
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 Description
25     The insertion of edges in the edge list is dictated by the upper
26     triangular ordering. The current decomposition of a polyhedral cell into
27     tetrahedra requires insertion of face centres and cell centres. The points
28     are ordered in the following way:
29         1) points of the polyMesh (supporting polyhedral cells)
30         2) face centres
31         3) cell centres
33     The algorithm for owner-neighbour insertion first adds all the points the
34     owner point shares the edge with (only the ones with the higher label than
35     the owner point), followed by the face centres of the pointFaces, followed
36     by the pointCells. This is because the face and the the cell centres are
37     guaranteed to have a higher index than the internal vertices.
39     Note:
40     It is assumed that the edges are constructed such that the start label
41     is lower than the end label and that pointFaces and pointCells lists are
42     ordered.
45 \*---------------------------------------------------------------------------*/
47 #include "tetPolyMesh.H"
48 #include "tetPointRef.H"
50 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
52 namespace Foam
55 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
57 const lduAddressing& tetPolyMesh::lduAddr() const
59     if (!lduPtr_)
60     {
61         lduPtr_ = new tetPolyMeshLduAddressing(*this);
62     }
64     return *lduPtr_;
68 label tetPolyMesh::maxNPointsForCell() const
70     if (maxNPointsForCell_ < 0)
71     {
72         const faceList& meshFaces = mesh_.faces();
73         const cellList& polyCells = mesh_.cells();
75         forAll (polyCells, cellI)
76         {
77             maxNPointsForCell_ =
78                 max
79                 (
80                     maxNPointsForCell_,
81                     polyCells[cellI].labels(meshFaces).size()
82                   + polyCells[cellI].size()
83                   + 1
84                 );
85         }
86     }
88     return maxNPointsForCell_;
92 // Fill buffer with addressing for the cell
93 label tetPolyMesh::addressing
95     const label cellID,
96     labelList& localToGlobalBuffer,
97     labelList& globalToLocalBuffer
98 ) const
100     const unallocFaceList& meshFaces = mesh_.faces();
102     const labelList& cellFaces = mesh_.cells()[cellID];
104     label nextLocal = 0;
106     // First mark up the vertices
107     forAll (cellFaces, faceI)
108     {
109         const face& curFace = meshFaces[cellFaces[faceI]];
111         forAll (curFace, pointI)
112         {
113             // If the point has not been already inserted into the local
114             // buffer, add it
115             if (globalToLocalBuffer[curFace[pointI]] == -1)
116             {
117                 localToGlobalBuffer[nextLocal] = curFace[pointI];
118                 globalToLocalBuffer[curFace[pointI]] = nextLocal;
119                 nextLocal++;
120             }
121         }
122     }
124     // Mark up face centres
125     forAll (cellFaces, faceI)
126     {
127         const label curFaceIndex = cellFaces[faceI] + faceOffset();
129         // Mark up the face
130         if (globalToLocalBuffer[curFaceIndex] == -1)
131         {
132             localToGlobalBuffer[nextLocal] = curFaceIndex;
133             globalToLocalBuffer[curFaceIndex] = nextLocal;
134             nextLocal++;
135         }
136     }
138     // Mark up the cell centre
139     localToGlobalBuffer[nextLocal] = cellOffset() + cellID;
140     globalToLocalBuffer[cellOffset() + cellID] = nextLocal;
141     nextLocal++;
143     // Return size of addressing
144     return nextLocal;
148 // Clear global to local addressing
149 void tetPolyMesh::clearAddressing
151     const label cellID,
152     const label nCellPoints,
153     labelList& localToGlobalBuffer,
154     labelList& globalToLocalBuffer
155 ) const
157     // Only clear the places that have been used.  The rest of the buffer
158     // is already initiated to -1
159     for (label localI = 0; localI < nCellPoints; localI++)
160     {
161         globalToLocalBuffer[localToGlobalBuffer[localI]] = -1;
162     }
166 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
168 } // End namespace Foam
170 // ************************************************************************* //