CloudIO.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-2017, 2020 OpenFOAM Foundation
9  Copyright (C) 2017-2020 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 
29 #include "Cloud.H"
30 #include "Time.H"
31 #include "IOPosition.H"
32 #include "IOdictionary.H"
33 
34 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
35 
36 template<class ParticleType>
38 
39 
40 // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
41 
42 template<class ParticleType>
44 {
45  IOobject dictObj
46  (
47  cloudPropertiesName,
48  time().timeName(),
49  "uniform"/cloud::prefix/name(),
50  db(),
51  IOobject::MUST_READ_IF_MODIFIED,
52  IOobject::NO_WRITE,
53  false
54  );
55 
56  if (dictObj.typeHeaderOk<IOdictionary>(true))
57  {
58  const IOdictionary uniformPropsDict(dictObj);
59 
60  // Fall back to positions mode if the entry is not present for
61  // backwards compatibility
62  geometryType_ =
63  cloud::geometryTypeNames.getOrDefault
64  (
65  "geometry",
66  uniformPropsDict,
67  cloud::geometryType::POSITIONS
68  );
69 
70  const word procName("processor" + Foam::name(Pstream::myProcNo()));
71 
72  const dictionary* dictptr = uniformPropsDict.findDict(procName);
73 
74  if (dictptr)
75  {
76  dictptr->readEntry("particleCount", ParticleType::particleCount_);
77  }
78  }
79  else
80  {
81  ParticleType::particleCount_ = 0;
82  }
83 }
84 
85 
86 template<class ParticleType>
88 {
89  IOdictionary uniformPropsDict
90  (
91  IOobject
92  (
93  cloudPropertiesName,
94  time().timeName(),
95  "uniform"/cloud::prefix/name(),
96  db(),
97  IOobject::NO_READ,
98  IOobject::NO_WRITE,
99  false
100  )
101  );
102 
103  labelList np(Pstream::nProcs(), Zero);
104  np[Pstream::myProcNo()] = ParticleType::particleCount_;
105 
106  Pstream::listCombineGather(np, maxEqOp<label>());
107  Pstream::listCombineScatter(np);
108 
109  uniformPropsDict.add
110  (
111  "geometry",
112  cloud::geometryTypeNames[geometryType_]
113  );
114 
115  forAll(np, i)
116  {
117  word procName("processor" + Foam::name(i));
118  uniformPropsDict.add(procName, dictionary());
119  uniformPropsDict.subDict(procName).add("particleCount", np[i]);
120  }
121 
122  uniformPropsDict.writeObject
123  (
124  IOstreamOption(IOstream::ASCII, time().writeCompression()),
125  true
126  );
127 }
128 
129 
130 template<class ParticleType>
131 void Foam::Cloud<ParticleType>::initCloud(const bool checkClass)
132 {
133  readCloudUniformProperties();
134 
135  IOPosition<Cloud<ParticleType>> ioP(*this, geometryType_);
136 
137  const bool valid = ioP.headerOk();
138  Istream& is = ioP.readStream(checkClass ? typeName : "", valid);
139  if (valid)
140  {
141  ioP.readData(is, *this);
142  ioP.close();
143  }
144 
145  if (!valid && debug)
146  {
147  Pout<< "Cannot read particle positions file:" << nl
148  << " " << ioP.objectPath() << nl
149  << "Assuming the initial cloud contains 0 particles." << endl;
150  }
151 
152  // Always operate in coordinates mode after reading
153  geometryType_ = cloud::geometryType::COORDINATES;
154 
155  // Ask for the tetBasePtIs to trigger all processors to build
156  // them, otherwise, if some processors have no particles then
157  // there is a comms mismatch.
158  polyMesh_.tetBasePtIs();
159 }
160 
161 
162 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
163 
164 template<class ParticleType>
166 (
167  const polyMesh& pMesh,
168  const word& cloudName,
169  const bool checkClass
170 )
171 :
172  cloud(pMesh, cloudName),
173  polyMesh_(pMesh),
174  labels_(),
175  cellWallFacesPtr_(),
176  geometryType_(cloud::geometryType::COORDINATES)
177 {
178  checkPatches();
179 
180  polyMesh_.tetBasePtIs();
181  polyMesh_.oldCellCentres();
182 
183  initCloud(checkClass);
184 }
185 
186 
187 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
188 
189 template<class ParticleType>
191 (
192  const word& fieldName,
193  const IOobject::readOption r
194 ) const
195 {
196  return IOobject
197  (
198  fieldName,
199  time().timeName(),
200  *this,
201  r,
202  IOobject::NO_WRITE,
203  false
204  );
205 }
206 
207 
208 template<class ParticleType>
209 template<class DataType>
211 (
212  const Cloud<ParticleType>& c,
213  const IOField<DataType>& data
214 ) const
215 {
216  if (data.size() != c.size())
217  {
219  << "Size of " << data.name()
220  << " field " << data.size()
221  << " does not match the number of particles " << c.size()
222  << abort(FatalError);
223  }
224 }
225 
226 
227 template<class ParticleType>
228 template<class DataType>
230 (
231  const Cloud<ParticleType>& c,
232  const CompactIOField<Field<DataType>, DataType>& data
233 ) const
234 {
235  if (data.size() != c.size())
236  {
238  << "Size of " << data.name()
239  << " field " << data.size()
240  << " does not match the number of particles " << c.size()
241  << abort(FatalError);
242  }
243 }
244 
245 
246 template<class ParticleType>
248 {
250 }
251 
252 
253 template<class ParticleType>
255 (
256  IOstreamOption streamOpt,
257  const bool
258 ) const
259 {
260  writeCloudUniformProperties();
261 
262  writeFields();
263  return cloud::writeObject(streamOpt, this->size());
264 }
265 
266 
267 // * * * * * * * * * * * * * * * Ostream Operators * * * * * * * * * * * * * //
268 
269 template<class ParticleType>
271 {
272  c.writeData(os);
273 
274  os.check(FUNCTION_NAME);
275  return os;
276 }
277 
278 
279 // ************************************************************************* //
Foam::expressions::patchExpr::debug
int debug
Static debugging option.
Foam::labelList
List< label > labelList
A List of labels.
Definition: List.H:71
Foam::IOobject
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition: IOobject.H:104
IOPosition.H
Foam::Cloud::writeFields
virtual void writeFields() const
Write the field data for the cloud of particles Dummy at.
Definition: CloudIO.C:247
cloudName
const word cloudName(propsDict.get< word >("cloud"))
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:62
Foam::IOField
A primitive field of type <T> with automated input and output.
Definition: foamVtkLagrangianWriter.H:61
Foam::Zero
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:131
Foam::Cloud::checkFieldIOobject
void checkFieldIOobject(const Cloud< ParticleType > &c, const IOField< DataType > &data) const
Check lagrangian data field.
Definition: CloudIO.C:211
Cloud.H
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:350
Foam::CompactIOField
A Field of objects of type <T> with automated input and output using a compact storage....
Definition: CompactIOField.H:53
Foam::Pout
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
Foam::baseIOdictionary::name
const word & name() const
Definition: baseIOdictionary.C:82
Foam::Cloud::fieldIOobject
IOobject fieldIOobject(const word &fieldName, const IOobject::readOption r) const
Helper to construct IOobject for field and current time.
Definition: CloudIO.C:191
Foam::polyMesh
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:77
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:296
Foam::operator<<
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces)
Definition: boundaryPatch.C:83
Foam::Field
Generic templated field type.
Definition: Field.H:63
Foam::name
word name(const complex &c)
Return string representation of complex.
Definition: complex.C:76
Foam::writeFields
void writeFields(const fvMesh &mesh, const wordHashSet &selectedFields)
Foam::IOstreamOption
The IOstreamOption is a simple container for options an IOstream can normally have.
Definition: IOstreamOption.H:63
Foam::Cloud::cloudPropertiesName
static word cloudPropertiesName
Name of cloud properties dictionary.
Definition: Cloud.H:126
timeName
word timeName
Definition: getTimeIndex.H:3
Foam::IOstream::check
virtual bool check(const char *operation) const
Check IOstream status for given operation.
Definition: IOstream.C:51
Foam::FatalError
error FatalError
Foam::abort
errorManip< error > abort(error &err)
Definition: errorManip.H:144
IOdictionary.H
Time.H
Foam::cloud
A cloud is a registry collection of lagrangian particles.
Definition: cloud.H:57
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:381
Foam::nl
constexpr char nl
Definition: Ostream.H:385
Foam::Cloud
Base cloud calls templated on particle type.
Definition: Cloud.H:54
FUNCTION_NAME
#define FUNCTION_NAME
Definition: messageStream.H:270
Foam::Cloud::Cloud
Cloud(const polyMesh &mesh, const word &cloudName, const IDLList< ParticleType > &particles)
Construct from mesh and a list of particles.
Definition: Cloud.C:74
Foam::constant::universal::c
const dimensionedScalar c
Speed of light in a vacuum.
Foam::IOobject::readOption
readOption
Enumeration defining the read options.
Definition: IOobject.H:118
Foam::Ostream
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:56
Foam::data
Database for solution data, solver performance and other reduced data.
Definition: data.H:55
Foam::Cloud::checkFieldFieldIOobject
void checkFieldFieldIOobject(const Cloud< ParticleType > &c, const CompactIOField< Field< DataType >, DataType > &data) const
Check lagrangian data fieldfield.
Definition: CloudIO.C:230
Foam::Cloud::writeObject
virtual bool writeObject(IOstreamOption streamOpt, const bool valid) const
Write using stream options.
Definition: CloudIO.C:255