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 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  initCloud(checkClass);
181 }
182 
183 
184 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
185 
186 template<class ParticleType>
188 (
189  const word& fieldName,
190  const IOobject::readOption r
191 ) const
192 {
193  return IOobject
194  (
195  fieldName,
196  time().timeName(),
197  *this,
198  r,
199  IOobject::NO_WRITE,
200  false
201  );
202 }
203 
204 
205 template<class ParticleType>
206 template<class DataType>
208 (
209  const Cloud<ParticleType>& c,
210  const IOField<DataType>& data
211 ) const
212 {
213  if (data.size() != c.size())
214  {
216  << "Size of " << data.name()
217  << " field " << data.size()
218  << " does not match the number of particles " << c.size()
219  << abort(FatalError);
220  }
221 }
222 
223 
224 template<class ParticleType>
225 template<class DataType>
227 (
228  const Cloud<ParticleType>& c,
229  const CompactIOField<Field<DataType>, DataType>& data
230 ) const
231 {
232  if (data.size() != c.size())
233  {
235  << "Size of " << data.name()
236  << " field " << data.size()
237  << " does not match the number of particles " << c.size()
238  << abort(FatalError);
239  }
240 }
241 
242 
243 template<class ParticleType>
245 {
247 }
248 
249 
250 template<class ParticleType>
252 (
253  IOstreamOption streamOpt,
254  const bool
255 ) const
256 {
257  writeCloudUniformProperties();
258 
259  writeFields();
260  return cloud::writeObject(streamOpt, this->size());
261 }
262 
263 
264 // * * * * * * * * * * * * * * * Ostream Operators * * * * * * * * * * * * * //
265 
266 template<class ParticleType>
268 {
269  c.writeData(os);
270 
271  os.check(FUNCTION_NAME);
272  return os;
273 }
274 
275 
276 // ************************************************************************* //
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:244
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:208
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
An Ostream wrapper for parallel output to std::cout.
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:188
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:137
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:372
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:265
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:73
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:54
Foam::Cloud::checkFieldFieldIOobject
void checkFieldFieldIOobject(const Cloud< ParticleType > &c, const CompactIOField< Field< DataType >, DataType > &data) const
Check lagrangian data fieldfield.
Definition: CloudIO.C:227
Foam::Cloud::writeObject
virtual bool writeObject(IOstreamOption streamOpt, const bool valid) const
Write using stream options.
Definition: CloudIO.C:252