Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / meshes / primitiveMesh / primitiveMeshCells.C
blob74b47727d01b92737f2bd728d4f5232f07b91fca
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 \*---------------------------------------------------------------------------*/
26 #include "primitiveMesh.H"
28 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
30 void Foam::primitiveMesh::calcCells
32     cellList& cellFaceAddr,
33     const unallocLabelList& own,
34     const unallocLabelList& nei,
35     const label inNCells
38     label nCells = inNCells;
40     if (nCells == -1)
41     {
42         nCells = -1;
44         forAll (own, faceI)
45         {
46             nCells = max(nCells, own[faceI]);
47         }
48         nCells++;
49     }
51     // 1. Count number of faces per cell
53     labelList ncf(nCells, 0);
55     forAll (own, faceI)
56     {
57         ncf[own[faceI]]++;
58     }
60     forAll (nei, faceI)
61     {
62         if (nei[faceI] >= 0)
63         {
64             ncf[nei[faceI]]++;
65         }
66     }
68     // Create the storage
69     cellFaceAddr.setSize(ncf.size());
72     // 2. Size and fill cellFaceAddr
74     forAll (cellFaceAddr, cellI)
75     {
76         cellFaceAddr[cellI].setSize(ncf[cellI]);
77     }
78     ncf = 0;
80     forAll (own, faceI)
81     {
82         label cellI = own[faceI];
84         cellFaceAddr[cellI][ncf[cellI]++] = faceI;
85     }
87     forAll (nei, faceI)
88     {
89         label cellI = nei[faceI];
91         if (cellI >= 0)
92         {
93             cellFaceAddr[cellI][ncf[cellI]++] = faceI;
94         }
95     }
99 void Foam::primitiveMesh::calcCells() const
101     // Loop through faceCells and mark up neighbours
103     if (debug)
104     {
105         Pout<< "primitiveMesh::calcCells() : calculating cells"
106             << endl;
107     }
109     // It is an error to attempt to recalculate cells
110     // if the pointer is already set
111     if (cfPtr_)
112     {
113         FatalErrorIn("primitiveMesh::calcCells() const")
114             << "cells already calculated"
115             << abort(FatalError);
116     }
117     else
118     {
119         // Create the storage
120         cfPtr_ = new cellList(nCells());
121         cellList& cellFaceAddr = *cfPtr_;
123         calcCells
124         (
125             cellFaceAddr,
126             faceOwner(),
127             faceNeighbour(),
128             nCells()
129         );
130     }
134 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
136 const Foam::cellList& Foam::primitiveMesh::cells() const
138     if (!cfPtr_)
139     {
140         calcCells();
141     }
143     return *cfPtr_;
147 // ************************************************************************* //