faBoundaryMeshEntries.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) 2022-2023 OpenCFD Ltd.
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 #include "faBoundaryMeshEntries.H"
29 #include "processorFaPatch.H"
30 
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
32 
33 namespace Foam
34 {
36 }
37 
38 
39 // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
40 
42 :
44  (
45  IOobject(io, IOobjectOption::NO_REGISTER)
46  )
47 {
48  // readContents()
49 
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  faBoundaryMeshEntries 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::faBoundaryMeshEntries::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 == processorFaPatch::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 
165 // * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
168 {
169  removeProcPatches(*this);
170 }
171 
174 {
175  return extract<word>("type", *this, "patch");
176 }
177 
178 
180 {
181  writeEntries(os, *this);
182 }
183 
184 
186 (
187  const keyType& keyword,
188  Ostream& os
189 ) const
190 {
191  const PtrList<entry>& entries = *this;
192 
193  if (!keyword.empty())
194  {
195  os.write(keyword);
196  os << (entries.empty() ? token::SPACE : token::NL);
197  }
199  writeEntries(os, entries);
200 
201  if (!keyword.empty()) os.endEntry();
202 }
203 
204 
206 {
207  return writeEntries(os, *this);
208 }
209 
210 
212 (
213  IOstreamOption streamOpt,
214  const bool writeOnProc
215 ) const
216 {
218  return regIOobject::writeObject(streamOpt, writeOnProc);
219 }
220 
221 
222 // ************************************************************************* //
void writeEntry(Ostream &os) const
Write sub-dictionary with its dictName as its header.
Definition: dictionaryIO.C:157
faBoundaryMeshEntries(const IOobject &io)
Read construct from IOobject. Never register!
A class for handling keywords in dictionaries.
Definition: keyType.H:66
dictionary dict
static bool writeEntries(Ostream &os, const UPtrList< entry > &entries)
Write list of entries.
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
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.
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
defineTypeName(manifoldCellsMeshObject)
void writeEntry(Ostream &os) const
Write as a plain list of entries.
void close()
Close Istream.
A class for handling words, derived from Foam::string.
Definition: word.H:63
label size() const noexcept
The number of entries in the list.
Definition: UPtrListI.H:106
Space [isspace].
Definition: token.H:131
void removeProcPatches()
Truncate at the first processor patch entry.
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
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Definition: Ostream.H:56
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)
virtual bool writeData(Ostream &os) const
The writeData member function required by regIOobject.
Read and store dictionary entries for finite-area boundary patches. The object is *never* registered ...
bool empty() const noexcept
True if the list is empty (ie, size() is zero)
Definition: UPtrListI.H:99
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...
static PtrList< entry > readContents(const IOobject &io)
Read and return contents. The IOobject is never registered.
wordList types() const
Return a list of patch types, uses the "patch" entry.
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
Definition: regIOobject.H:66
virtual bool writeObject(IOstreamOption streamOpt, const bool writeOnProc=true) const
Write using stream options, forces UNCOMPRESSED.
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
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:172
Namespace for OpenFOAM.