ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / src / OpenFOAM / meshes / primitiveMesh / primitiveMeshCells.C
blob5ba711be130274ebe8ba1a744490ccd14580dfca
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 \*---------------------------------------------------------------------------*/
26 #include "primitiveMesh.H"
28 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
30 void Foam::primitiveMesh::calcCells
32     cellList& cellFaceAddr,
33     const labelUList& own,
34     const labelUList& 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 // ************************************************************************* //