polyBoundaryMeshEntries.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2012 OpenFOAM Foundation
9  Copyright (C) 2020-2023 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
30 #include "processorPolyPatch.H"
31 
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33 
34 namespace Foam
35 {
37 }
38 
39 
40 // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
41 
43 :
45  (
46  IOobject(io, IOobjectOption::NO_REGISTER)
47  )
48 {
49  // readIOcontents()
50  if (isReadRequired() || (isReadOptional() && headerOk()))
51  {
52  // Read as entries
53  Istream& is = readStream(typeName);
54 
55  is >> *this;
56  close();
57  }
58 }
59 
60 
61 // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
62 
65 {
66  polyBoundaryMeshEntries reader(io);
67 
68  return PtrList<entry>(std::move(static_cast<PtrList<entry>&>(reader)));
69 }
70 
71 
72 // * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
73 
74 namespace Foam
75 {
76 
77 // Extract optional entry from dictionaries and return as a list
78 template<class T>
79 static inline List<T> extract
80 (
81  const word& key,
82  const UPtrList<entry>& entries,
83  const T& initValue
84 )
85 {
86  List<T> result(entries.size(), initValue);
87 
88  forAll(entries, i)
89  {
90  const dictionary& dict = entries[i].dict();
91  dict.readIfPresent(key, result[i]);
92  }
93 
94  return result;
95 }
96 
97 } // End namespace
98 
99 
100 // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
101 
102 void Foam::polyBoundaryMeshEntries::removeProcPatches(PtrList<entry>& entries)
103 {
104  // Truncate at the first processor patch entry
105 
106  label nNonProcessor = entries.size();
107 
108  forAll(entries, patchi)
109  {
110  const dictionary& dict = entries[patchi].dict();
111 
112  const word pType = dict.get<word>("type");
113  if (pType == processorPolyPatch::typeName)
114  {
115  nNonProcessor = patchi;
116  break;
117  }
118  }
119 
120  entries.resize(nNonProcessor);
121 }
122 
123 
125 (
126  Ostream& os,
127  const UPtrList<entry>& entries
128 )
129 {
130  os << entries.size();
131 
132  if (entries.empty())
133  {
134  // 0-sized : can write with less vertical space
136  }
137  else
138  {
139  os << nl << token::BEGIN_LIST << incrIndent << nl;
140 
141  forAll(entries, patchi)
142  {
143  const auto& key = entries[patchi].keyword();
144  const auto& dict = entries[patchi].dict();
145 
146  dict.writeEntry(key, os);
147  }
149  }
152  return os.good();
153 }
154 
155 
157 (
158  const UPtrList<entry>& entries
159 )
160 {
161  return extract<word>("type", entries, "patch");
162 }
163 
164 
166 (
167  const UPtrList<entry>& entries
168 )
169 {
170  return extract<label>("startFace", entries, 0);
171 }
172 
173 
175 (
176  const UPtrList<entry>& entries
177 )
178 {
179  return extract<label>("nFaces", entries, 0);
180 }
181 
182 
183 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
186 {
187  removeProcPatches(*this);
188 }
189 
192 {
193  return extract<word>("type", *this, "patch");
194 }
195 
198 {
199  return extract<label>("startFace", *this, 0);
200 }
201 
204 {
205  return extract<label>("nFaces", *this, 0);
206 }
207 
208 
210 {
211  writeEntries(os, *this);
212 }
213 
214 
216 (
217  const word& keyword,
218  Ostream& os
219 ) const
220 {
221  const PtrList<entry>& entries = *this;
222 
223  if (!keyword.empty())
224  {
225  os.write(keyword);
226  os << (entries.empty() ? token::SPACE : token::NL);
227  }
229  writeEntries(os, entries);
230 
231  if (!keyword.empty()) os.endEntry();
232 }
233 
234 
236 {
237  return writeEntries(os, *this);
238 }
239 
240 
242 (
243  IOstreamOption streamOpt,
244  const bool writeOnProc
245 ) const
246 {
248  return regIOobject::writeObject(streamOpt, writeOnProc);
249 }
250 
251 
252 // ************************************************************************* //
void writeEntry(Ostream &os) const
Write sub-dictionary with its dictName as its header.
Definition: dictionaryIO.C:157
polyBoundaryMeshEntries(const IOobject &io)
Read construct from IOobject. Never register!
dictionary dict
void removeProcPatches()
Truncate at the first processor patch entry.
virtual Ostream & write(const char c) override
Write character.
Definition: OBJstream.C:69
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
virtual bool check(const char *operation) const
Check IOstream status for given operation.
Definition: IOstream.C:45
virtual bool writeObject(IOstreamOption streamOpt, const bool writeOnProc=true) const
Write using stream options, forces UNCOMPRESSED.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: BitOps.H:56
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
Definition: Istream.H:57
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
Newline [isspace].
Definition: token.H:130
bool headerOk()
Read and check header info. Does not check the headerClassName.
Definition: regIOobject.C:505
Begin list [isseparator].
Definition: token.H:161
A simple container for options an IOstream can normally have.
virtual bool writeObject(IOstreamOption streamOpt, const bool writeOnProc) const
Write using stream options.
T get(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T. FatalIOError if not found, or if the number of tokens is incorrect.
wordList types() const
Return a list of patch types, uses the "patch" entry.
bool isReadOptional() const noexcept
True if (LAZY_READ) bits are set [same as READ_IF_PRESENT].
static List< T > extract(const word &key, const UPtrList< entry > &entries, const T &initValue)
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:421
static bool writeEntries(Ostream &os, const UPtrList< entry > &entries)
Write list of entries.
defineTypeName(manifoldCellsMeshObject)
void close()
Close Istream.
A class for handling words, derived from Foam::string.
Definition: word.H:63
static PtrList< entry > readContents(const IOobject &io)
Read and return contents. The IOobject is never registered.
label size() const noexcept
The number of entries in the list.
Definition: UPtrListI.H:106
Space [isspace].
Definition: token.H:131
End list [isseparator].
Definition: token.H:162
A list of pointers to objects of type <T>, without allocation/deallocation management of the pointers...
Definition: HashTable.H:106
labelList patchSizes() const
Return a list of patch sizes, uses "nFaces" entry.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Definition: Ostream.H:56
void writeEntry(Ostream &os) const
Write as a plain list of entries.
bool readIfPresent(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry if present, and assign to T val. FatalIOError if it is found and the number of tokens i...
OBJstream os(runTime.globalPath()/outputName)
#define FUNCTION_NAME
compressionType compression() const noexcept
Get the stream compression.
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
Definition: Ostream.H:511
bool isReadRequired() const noexcept
True if (MUST_READ | READ_MODIFIED) bits are set.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
bool empty() const noexcept
True if the list is empty (ie, size() is zero)
Definition: UPtrListI.H:99
labelList patchStarts() const
Return a list of patch start face indices, uses "startFace" entry.
auto key(const Type &t) -> typename std::enable_if< std::is_enum< Type >::value, typename std::underlying_type< Type >::type >::type
Definition: foamGltfBase.H:103
bool good() const noexcept
True if next operation might succeed.
Definition: IOstream.H:281
A simple container of IOobject preferences. Can also be used for general handling of read/no-read/rea...
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
Definition: regIOobject.H:68
virtual bool writeData(Ostream &os) const
The writeData member function required by regIOobject.
IOobject io("surfaceFilmProperties", mesh.time().constant(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, IOobject::NO_REGISTER)
virtual Ostream & endEntry()
Write end entry (&#39;;&#39;) followed by newline.
Definition: Ostream.C:117
Read and store dictionary entries for boundary patches The object is *never* registered to avoid regi...
Ostream & incrIndent(Ostream &os)
Increment the indent level.
Definition: Ostream.H:502
Defines the attributes of an object for which implicit objectRegistry management is supported...
Definition: IOobject.H:180
Namespace for OpenFOAM.