ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / applications / utilities / mesh / conversion / sammToFoam / calcPointCells.C
blob282e507058fad55f4e7db92b5e52e9f72137751f
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
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
13     the Free Software Foundation, either version 3 of the License, or
14     (at your 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, see <http://www.gnu.org/licenses/>.
24 Description
25     Create intermediate mesh files from SAMM files
27 \*---------------------------------------------------------------------------*/
29 #include "sammMesh.H"
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33 void sammMesh::calcPointCells() const
35     static const label UNIT_POINT_CELLS = 12;
37     if (pointCellsPtr_)
38     {
39         FatalErrorIn("sammMesh::calcPointCells()")
40             << "PointCells already calculated"
41             << abort(FatalError);
42     }
45     pointCellsPtr_ = new labelListList(points_.size());
47     labelListList& pc = *pointCellsPtr_;
49     forAll(pc, i)
50     {
51         pc[i].setSize(UNIT_POINT_CELLS);
52     }
54     // Initialise the list of labels which will hold the count the
55     // actual number of cells per point during the analysis
56     labelList cellCount(points_.size());
58     forAll(cellCount, i)
59     {
60         cellCount[i] = 0;
61     }
63     // Note. Unlike the standard point-cell algorithm, which asks the cell for
64     // the supporting point labels, we need to work based on the cell faces.
65     // This is because some of the faces for meshes with arbitrary interfaces
66     // do not come from the cell shape, but from the slaves of the coupled
67     // match. It is also adventageous to remove the duplicates from the
68     // point-cell addressing, because this removes a lot of waste later.
69     //
71     // For each cell
72     forAll(cellShapes_, cellI)
73     {
74         const faceList& faces = cellFaces_[cellI];
76         forAll(faces, i)
77         {
78             // For each vertex
79             const labelList& labels = faces[i];
81             forAll(labels, j)
82             {
83                 // Set working point label
84                 label curPoint = labels[j];
85                 labelList& curPointCells = pc[curPoint];
86                 label curCount = cellCount[curPoint];
88                 // check if the cell has been added before
89                 bool found = false;
91                 for (label f = 0; f < curCount; f++)
92                 {
93                     if (curPointCells[f] == cellI)
94                     {
95                         found = true;
97                         break;
98                     }
99                 }
101                 if (!found)
102                 {
104                     // If the list of pointCells is not big enough, double it
105                     if (curPointCells.size() <= curCount)
106                     {
107                         curPointCells.setSize(curPointCells.size()*2);
108                     }
110                     // Enter the cell label in the point's cell list
111                     curPointCells[curCount] = cellI;
113                     // Increment the cell count for the point addressed
114                     cellCount[curPoint]++;
115                 }
116             }
117         }
118     }
120     // Finally, truncate the lists made to their active size
121     forAll(pc, i)
122     {
123         pc[i].setSize(cellCount[i]);
124     }
128 const labelListList& sammMesh::pointCells() const
130     if (!pointCellsPtr_)
131     {
132         calcPointCells();
133     }
135     return *pointCellsPtr_;
139 // ************************************************************************* //