Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / meshes / polyMesh / zones / zone / zone.C
blob4ee225e5a757f5c93deee2a5422220b73f17ef92
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2009-2010 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
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 "zone.H"
27 #include "IOstream.H"
28 #include "demandDrivenData.H"
30 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 defineTypeNameAndDebug(Foam::zone, 0);
35 // * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
37 const Foam::Map<Foam::label>& Foam::zone::lookupMap() const
39     if (!lookupMapPtr_)
40     {
41         calcLookupMap();
42     }
44     return *lookupMapPtr_;
48 void Foam::zone::calcLookupMap() const
50     if (debug)
51     {
52         Info<< "void zone::calcLookupMap() const: "
53             << "Calculating lookup map"
54             << endl;
55     }
57     if (lookupMapPtr_)
58     {
59         FatalErrorIn("void zone::calcLookupMap() const")
60             << "Lookup map already calculated" << nl
61             << abort(FatalError);
62     }
64     const labelList& addr = *this;
66     lookupMapPtr_ = new Map<label>(2*addr.size());
67     Map<label>& lm = *lookupMapPtr_;
69     forAll(addr, i)
70     {
71         lm.insert(addr[i], i);
72     }
74     if (debug)
75     {
76         Info<< "void zone::calcLookupMap() const: "
77             << "Finished calculating lookup map"
78             << endl;
79     }
83 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
85 Foam::zone::zone
87     const word& name,
88     const labelUList& addr,
89     const label index
92     labelList(addr),
93     name_(name),
94     index_(index),
95     lookupMapPtr_(NULL)
99 Foam::zone::zone
101     const word& name,
102     const Xfer<labelList>& addr,
103     const label index
106     labelList(addr),
107     name_(name),
108     index_(index),
109     lookupMapPtr_(NULL)
113 Foam::zone::zone
115     const word& name,
116     const dictionary& dict,
117     const word& labelsName,
118     const label index
121     labelList(dict.lookup(labelsName)),
122     name_(name),
123     index_(index),
124     lookupMapPtr_(NULL)
128 Foam::zone::zone
130     const zone& z,
131     const labelUList& addr,
132     const label index
135     labelList(addr),
136     name_(z.name()),
137     index_(index),
138     lookupMapPtr_(NULL)
142 Foam::zone::zone
144     const zone& z,
145     const Xfer<labelList>& addr,
146     const label index
149     labelList(addr),
150     name_(z.name()),
151     index_(index),
152     lookupMapPtr_(NULL)
156 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
158 Foam::zone::~zone()
160     clearAddressing();
164 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
166 Foam::label Foam::zone::localID(const label globalCellID) const
168     const Map<label>& lm = lookupMap();
170     Map<label>::const_iterator lmIter = lm.find(globalCellID);
172     if (lmIter == lm.end())
173     {
174         return -1;
175     }
176     else
177     {
178         return lmIter();
179     }
183 void Foam::zone::clearAddressing()
185     deleteDemandDrivenData(lookupMapPtr_);
189 bool Foam::zone::checkDefinition(const label maxSize, const bool report) const
191     const labelList& addr = *this;
193     bool hasError = false;
195     forAll(addr, i)
196     {
197         if (addr[i] < 0 || addr[i] >= maxSize)
198         {
199             hasError = true;
201             if (report)
202             {
203                 SeriousErrorIn
204                 (
205                     "bool zone::checkDefinition("
206                     "const label maxSize, const bool report) const"
207                 )   << "Zone " << name_
208                     << " contains invalid index label " << addr[i] << nl
209                     << "Valid index labels are 0.."
210                     << maxSize-1 << endl;
211             }
212             else
213             {
214                 // w/o report - can stop checking now
215                 break;
216             }
217         }
218     }
220     return hasError;
224 void Foam::zone::write(Ostream& os) const
226     os  << nl << name_
227         << nl << static_cast<const labelList&>(*this);
231 // * * * * * * * * * * * * * * * Ostream Operator  * * * * * * * * * * * * * //
233 Foam::Ostream& Foam::operator<<(Ostream& os, const zone& z)
235     z.write(os);
236     os.check("Ostream& operator<<(Ostream& f, const zone& z");
237     return os;
241 // ************************************************************************* //