www.cemf.ir
sphereParticles.cpp
Go to the documentation of this file.
1 /*------------------------------- phasicFlow ---------------------------------
2  O C enter of
3  O O E ngineering and
4  O O M ultiscale modeling of
5  OOOOOOO F luid flow
6 ------------------------------------------------------------------------------
7  Copyright (C): www.cemf.ir
8  email: hamid.r.norouzi AT gmail.com
9 ------------------------------------------------------------------------------
10 Licence:
11  This file is part of phasicFlow code. It is a free software for simulating
12  granular and multiphase flows. You can redistribute it and/or modify it under
13  the terms of GNU General Public License v3 or any other later versions.
14 
15  phasicFlow is distributed to help others in their research in the field of
16  granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the
17  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 
19 -----------------------------------------------------------------------------*/
20 
21 #include "sphereParticles.hpp"
22 #include "systemControl.hpp"
23 #include "vocabs.hpp"
25 
26 
27 //#include "setFieldList.hpp"
28 /*pFlow::uniquePtr<pFlow::List<pFlow::eventObserver*>>
29 pFlow::sphereParticles::getFieldObjectList()const
30 {
31  auto objListPtr = particles::getFieldObjectList();
32 
33  objListPtr().push_back(
34  static_cast<eventObserver*>(&I_) );
35 
36  return objListPtr;
37 }
38 
39 bool pFlow::sphereParticles::diameterMassInertiaPropId
40 (
41  const word& shName,
42  real& diam,
43  real& mass,
44  real& I,
45  int8& propIdx
46 )
47 {
48  uint32 idx;
49  if( !shapes_.nameToIndex(shName, idx) )
50  {
51  printKeys(fatalErrorInFunction<<
52  " wrong shape name in the input: "<< shName<<endl<<
53  " available shape names are: ", shapes_.names())<<endl;
54  return false;
55  }
56 
57  diam = shapes_.diameter(idx);
58  word materialName = shapes_.material(idx);
59  uint32 pIdx;
60  if( !property_.nameToIndex(materialName, pIdx) )
61  {
62  fatalErrorInFunction <<
63  " wrong material name "<< materialName <<" specified for shape "<< shName<<
64  " in the sphereShape dictionary.\n"<<
65  " available materials are "<< property_.materials()<<endl;
66  return false;
67  }
68  real rho = property_.density(pIdx);
69 
70  mass = Pi/6.0*pow(diam,3.0)*rho;
71  I = 0.4 * mass * pow(diam/2.0,2.0);
72  propIdx= static_cast<int8>(pIdx);
73  return true;
74 }
75 
76 bool pFlow::sphereParticles::initializeParticles()
77 {
78 
79  int32IndexContainer indices(
80  0,
81  static_cast<int32>(shapeName_.size()));
82 
83  return insertSphereParticles(shapeName_, indices, false);
84 }*/
85 
86 
87 /*bool pFlow::sphereParticles::beforeIteration()
88 {
89  particles::beforeIteration();
90 
91  intPredictTimer_.start();
92 
93  //INFO<<"before dyn predict"<<endINFO;
94  dynPointStruct_.predict(this->dt(), accelertion_);
95  //INFO<<"after dyn predict"<<endINFO;
96 
97  //INFO<<"before revel predict"<<endINFO;
98  rVelIntegration_().predict(this->dt(),rVelocity_, rAcceleration_);
99  //INFO<<"after rvel predict"<<endINFO;
100 
101  intPredictTimer_.end();
102 
103  return true;
104 }*/
105 
106 
107 
108 
109 
110 /*bool pFlow::sphereParticles::afterIteration()
111 {
112  return true;
113 }*/
114 
115 
116 /*bool pFlow::sphereParticles::insertSphereParticles(
117  const wordVector& names,
118  const int32IndexContainer& indices,
119  bool setId
120  )
121 {
122 
123  if(names.size()!= indices.size())
124  {
125  fatalErrorInFunction <<
126  "sizes of names ("<<names.size()<<") and indices ("
127  << indices.size()<<") do not match \n";
128  return false;
129  }
130 
131  auto len = names.size();
132 
133  realVector diamVec(len, RESERVE());
134  realVector massVec(len, RESERVE());
135  realVector IVec(len, RESERVE());
136  int8Vector pIdVec(len, RESERVE());
137  int32Vector IdVec(len, RESERVE());
138 
139  real d, m, I;
140  int8 pId;
141 
142  ForAll(i, names )
143  {
144 
145  if (diameterMassInertiaPropId(names[i], d, m, I, pId))
146  {
147  diamVec.push_back(d);
148  massVec.push_back(m);
149  IVec.push_back(I);
150  pIdVec.push_back(pId);
151  if(setId) IdVec.push_back(idHandler_.getNextId());
152  //output<<" we are in sphereParticles nextId "<< idHandler_.nextId()<<endl;
153  }
154  else
155  {
156  fatalErrorInFunction<< "failed to calculate properties of shape " <<
157  names[i]<<endl;
158  return false;
159  }
160 
161  }
162 
163  if(!diameter_.insertSetElement(indices, diamVec))
164  {
165  fatalErrorInFunction<< " failed to insert diameters to the diameter field. \n";
166  return false;
167  }
168 
169  if(!mass_.insertSetElement(indices, massVec))
170  {
171  fatalErrorInFunction<< " failed to insert mass to the mass field. \n";
172  return false;
173  }
174 
175  if(!I_.insertSetElement(indices, IVec))
176  {
177  fatalErrorInFunction<< " failed to insert I to the I field. \n";
178  return false;
179  }
180 
181  if(!propertyId_.insertSetElement(indices, pIdVec))
182  {
183  fatalErrorInFunction<< " failed to insert propertyId to the propertyId field. \n";
184  return false;
185  }
186 
187  if(setId)
188  {
189  if( !id_.insertSetElement(indices, IdVec))
190  {
191  fatalErrorInFunction<< " failed to insert id to the id field. \n";
192  return false;
193  }
194  }
195 
196 
197  return true;
198 
199 }*/
200 
202 {
203 
204  using exeSpace = typename realPointField_D::execution_space;
205  using policy = Kokkos::RangePolicy<
206  exeSpace,
207  Kokkos::IndexType<uint32>>;
208 
209  auto [minIndex, maxIndex] = minMax(shapeIndex().internal());
210 
211  if( !spheres_.indexValid(maxIndex) )
212  {
214  "the maximum value of shapeIndex is "<< maxIndex <<
215  " which is not valid."<<endl;
216  return false;
217  }
218 
219  auto aPointsMask = dynPointStruct().activePointsMaskDevice();
220  auto aRange = aPointsMask.activeRange();
221 
222  auto field_shapeIndex = shapeIndex().deviceView();
223  auto field_diameter = diameter_.deviceView();
224  auto field_mass = mass_.deviceView();
225  auto field_propId = propertyId_.deviceView();
226  auto field_I = I_.deviceView();
227 
228  // get info from spheres shape
229  realVector_D d("diameter", spheres_.boundingDiameter());
230  realVector_D mass("mass",spheres_.mass());
231  uint32Vector_D propId("propId", spheres_.shapePropertyIds());
232  realVector_D I("I", spheres_.Inertia());
233 
234  auto d_d = d.deviceView();
235  auto d_mass = mass.deviceView();
236  auto d_propId = propId.deviceView();
237  auto d_I = I.deviceView();
238 
239  Kokkos::parallel_for(
240  "particles::initInertia",
241  policy(aRange.start(), aRange.end()),
242  LAMBDA_HD(uint32 i)
243  {
244  if(aPointsMask(i))
245  {
246  uint32 index = field_shapeIndex[i];
247  field_I[i] = d_I[index];
248  field_diameter[i] = d_d[index];
249  field_mass[i] = d_mass[index];
250  field_propId[i] = d_propId[index];
251  }
252  });
253  Kokkos::fence();
254 
255  return true;
256 }
257 
258 bool
260  const wordVector& shapeNames,
261  uint32Vector& propIds,
262  realVector& diams,
263  realVector& m,
264  realVector& Is,
265  uint32Vector& shIndex
266 )
267 {
268  auto numNew = static_cast<uint32>(shapeNames.size());
269 
270  propIds.clear();
271  propIds.reserve(numNew);
272 
273  diams.clear();
274  diams.reserve(numNew);
275 
276  m.clear();
277  m.reserve(numNew);
278 
279  Is.clear();
280  Is.reserve(numNew);
281 
282  shIndex.clear();
283  shIndex.reserve(numNew);
284 
285 
286  for(const auto& name:shapeNames)
287  {
288  uint32 indx;
289  if(spheres_.shapeNameToIndex(name,indx))
290  {
291  shIndex.push_back(indx);
292  Is.push_back( spheres_.Inertia(indx));
293  m.push_back(spheres_.mass(indx));
294  diams.push_back(spheres_.boundingDiameter(indx));
295  propIds.push_back( spheres_.propertyId(indx));
296  }
297  else
298  {
299  fatalErrorInFunction<<"Shape name "<< name <<
300  "does not exist. The list is "<<spheres_.shapeNameList()<<endl;
301  return false;
302  }
303  }
304 
305  return true;
306 }
307 
309  systemControl &control,
310  const property& prop
311 )
312 :
313  particles(control),
314  spheres_
315  (
316  shapeFile__,
317  &control.caseSetup(),
318  prop
319  ),
320  propertyId_
321  (
322  objectFile
323  (
324  "propertyId",
325  "",
326  objectFile::READ_NEVER,
327  objectFile::WRITE_NEVER
328  ),
329  dynPointStruct(),
330  0u
331  ),
332  diameter_
333  (
334  objectFile(
335  "diameter",
336  "",
337  objectFile::READ_NEVER,
338  objectFile::WRITE_NEVER),
339  dynPointStruct(),
340  0.00000000001
341  ),
342  mass_
343  (
344  objectFile(
345  "mass",
346  "",
347  objectFile::READ_NEVER,
348  objectFile::WRITE_NEVER),
349  dynPointStruct(),
350  0.0000000001
351  ),
352  I_
353  (
354  objectFile
355  (
356  "I",
357  "",
358  objectFile::READ_NEVER,
359  objectFile::WRITE_NEVER
360  ),
361  dynPointStruct(),
362  static_cast<real>(0.0000000001)
363  ),
364  rVelocity_
365  (
366  objectFile
367  (
368  "rVelocity",
369  "",
370  objectFile::READ_IF_PRESENT,
371  objectFile::WRITE_ALWAYS
372  ),
373  dynPointStruct(),
374  zero3
375  ),
376  rAcceleration_
377  (
378  objectFile(
379  "rAcceleration",
380  "",
381  objectFile::READ_IF_PRESENT,
382  objectFile::WRITE_ALWAYS
383  ),
384  dynPointStruct(),
385  zero3
386  ),
387  boundarySphereParticles_
388  (
389  dynPointStruct().boundaries(),
390  *this
391  ),
392  accelerationTimer_(
393  "Acceleration", &this->timers() ),
394  intPredictTimer_(
395  "Integration-predict", &this->timers() ),
396  intCorrectTimer_(
397  "Integration-correct", &this->timers() ),
398  fieldUpdateTimer_(
399  "fieldUpdate", &this->timers() )
400 {
401 
402  auto intMethod = control.settingsDict().getVal<word>("integrationMethod");
403  REPORT(1)<<"Creating integration method "<<Green_Text(intMethod)
404  << " for rotational velocity."<<END_REPORT;
405 
407  (
408  "rVelocity",
409  dynPointStruct(),
410  intMethod,
411  rVelocity_.field()
412  );
413 
414  if( !rVelIntegration_ )
415  {
417  " error in creating integration object for rVelocity. \n";
418  fatalExit;
419  }
420 
421  WARNING<<"setFields for rVelIntegration_"<<END_WARNING;
422 
423  if(!initializeParticles())
424  {
426  fatalExit;
427  }
428 
429 }
430 
431 /*bool pFlow::sphereParticles::update(const eventMessage& msg)
432 {
433 
434  if(rVelIntegration_->needSetInitialVals())
435  {
436 
437 
438  auto indexHD = pStruct().insertedPointIndex();
439 
440  auto n = indexHD.size();
441  auto index = indexHD.indicesHost();
442 
443  realx3Vector rvel(n,RESERVE());
444  const auto hrVel = rVelocity_.hostView();
445 
446  for(auto i=0; i<n; i++)
447  {
448  rvel.push_back( hrVel[index(i)]);
449  }
450 
451  rVelIntegration_->setInitialVals(indexHD, rvel);
452 
453  }
454 
455  return true;
456 }*/
457 
458 /*bool pFlow::sphereParticles::insertParticles
459 (
460  const realx3Vector& position,
461  const wordVector& shapes,
462  const setFieldList& setField
463  )
464 {
465 
466  if( position.size() != shapes.size() )
467  {
468  fatalErrorInFunction<<
469  " size of vectors position ("<<position.size()<<
470  ") and shapes ("<<shapes.size()<<") are not the same. \n";
471  return false;
472  }
473 
474 
475 
476  auto exclusionListAllPtr = getFieldObjectList();
477 
478  auto newInsertedPtr = pStruct().insertPoints( position, setField, time(), exclusionListAllPtr());
479 
480 
481  if(!newInsertedPtr)
482  {
483  fatalErrorInFunction<<
484  " error in inserting points into pStruct. \n";
485  return false;
486  }
487 
488  auto& newInserted = newInsertedPtr();
489 
490  if(!shapeName_.insertSetElement(newInserted, shapes))
491  {
492  fatalErrorInFunction<<
493  " error in inserting shapes into sphereParticles system.\n";
494  return false;
495  }
496 
497  if( !insertSphereParticles(shapes, newInserted) )
498  {
499  fatalErrorInFunction<<
500  "error in inserting shapes into the sphereParticles. \n";
501  return false;
502  }
503 
504 
505  auto activeR = this->activeRange();
506 
507  REPORT(1)<< "Active range is "<<yellowText("["<<activeR.first<<", "<<activeR.second<<")")<<
508  " and number of active points is "<< cyanText(this->numActive())<<
509  " and pointStructure capacity is "<<cyanText(this->capacity())<<endREPORT;
510 
511  return true;
512 
513 }*/
514 
516 {
518  intPredictTimer_.start();
519  auto dt = this->dt();
520  dynPointStruct().predict(dt, accelertion());
521  rVelIntegration_().predict(dt,rVelocity_, rAcceleration_);
522  intPredictTimer_.end();
523 
524  fieldUpdateTimer_.start();
525  propertyId_.updateBoundariesSlaveToMasterIfRequested();
526  diameter_.updateBoundariesSlaveToMasterIfRequested();
527  mass_.updateBoundariesSlaveToMasterIfRequested();
528  I_.updateBoundariesSlaveToMasterIfRequested();
529  rVelocity_.updateBoundariesSlaveToMasterIfRequested();
530  rAcceleration_.updateBoundariesSlaveToMasterIfRequested();
531  rVelIntegration_().updateBoundariesSlaveToMasterIfRequested();
532  fieldUpdateTimer_.end();
533 
534  return true;
535 }
536 
538 {
539 
540  timeInfo ti = TimeInfo();
541  realx3 g = control().g();
542 
544  accelerationTimer_.start();
546  g,
547  mass().deviceViewAll(),
548  contactForce().deviceViewAll(),
549  I().deviceViewAll(),
550  contactTorque().deviceViewAll(),
551  dynPointStruct().activePointsMaskDevice(),
552  accelertion().deviceViewAll(),
553  rAcceleration().deviceViewAll()
554  );
555  for(auto& bndry:boundarySphereParticles_)
556  {
557  bndry->acceleration(ti, g);
558  }
559  accelerationTimer_.end();
560 
561  intCorrectTimer_.start();
562 
563  if(!dynPointStruct().correct(dt(), accelertion()))
564  {
565  return false;
566  }
567  if(!rVelIntegration_().correct(
568  dt(),
569  rVelocity_,
570  rAcceleration_))
571  {
572  return false;
573  }
574 
575  intCorrectTimer_.end();
576 
577  return true;
578 }
579 
581 (
582  const realx3Vector &position,
583  const wordVector &shapesNames,
584  const anyList &setVarList
585 )
586 {
587  anyList newVarList(setVarList);
588 
589  realVector mass("mass");
590  realVector I("I");
591  realVector diameter("diameter");
592  uint32Vector propId("propId");
593  uint32Vector shapeIdx("shapeIdx");
594 
595  if(!getParticlesInfoFromShape(
596  shapesNames,
597  propId,
598  diameter,
599  mass,
600  I,
601  shapeIdx))
602  {
603  return false;
604  }
605 
606  newVarList.emplaceBack(
607  mass_.name()+"Vector",
608  std::move(mass));
609 
610  newVarList.emplaceBack(
611  I_.name()+"Vector",
612  std::move(I));
613 
614  newVarList.emplaceBack(
615  diameter_.name()+"Vector",
616  std::move(diameter));
617 
618  newVarList.emplaceBack(
619  propertyId_.name()+"Vector",
620  std::move(propId));
621 
622  newVarList.emplaceBack(
623  shapeIndex().name()+"Vector",
624  std::move(shapeIdx));
625 
626  if(!dynPointStruct().insertPoints(position, newVarList))
627  {
628  return false;
629  }
630 
631  return true;
632 }
633 
635 {
636  return "sphere";
637 }
638 
640 {
641  return spheres_;
642 }
643 
645 (
646  real & minDiam,
647  real& maxDiam
648 )const
649 {
650  minDiam = spheres_.minBoundingSphere();
651  maxDiam = spheres_.maxBoundingSphere();
652 }
pFlow::minMax
Pair< T, T > minMax(const internalField< T, MemorySpace > &iField)
Definition: internalFieldAlgorithms.hpp:132
pFlow::sphereParticlesKernels::acceleration
void acceleration(const realx3 &g, const deviceViewType1D< real > &mass, const deviceViewType1D< realx3 > &force, const deviceViewType1D< real > &I, const deviceViewType1D< realx3 > &torque, const pFlagTypeDevice &incld, deviceViewType1D< realx3 > lAcc, deviceViewType1D< realx3 > rAcc)
Definition: sphereParticlesKernels.cpp:61
pFlow::sphereParticles::propertyId_
uint32PointField_D propertyId_
property id on device
Definition: sphereParticles.hpp:54
pFlow::sphereParticles::mass
const realPointField_D & mass() const override
Definition: sphereParticles.hpp:199
Green_Text
#define Green_Text(text)
Definition: iOstream.hpp:42
pFlow::particles::beforeIteration
bool beforeIteration() override
This is called in time loop, before iterate.
Definition: particles.cpp:86
pFlow::particles::iterate
bool iterate() override
This is called in time loop.
Definition: particles.cpp:104
pFlow::sphereParticles::diameter_
realPointField_D diameter_
diameter / boundig sphere size of particles on device
Definition: sphereParticles.hpp:57
pFlow::real
float real
Definition: builtinTypes.hpp:45
fatalExit
#define fatalExit
Fatal exit.
Definition: error.hpp:98
pFlow::sphereParticles::rVelocity_
realx3PointField_D rVelocity_
pointField of rotational Velocity of particles on device
Definition: sphereParticles.hpp:66
pFlow::demComponent::control
const auto & control() const
Const ref to systemControl.
Definition: demComponent.hpp:88
REPORT
#define REPORT(n)
Definition: streams.hpp:39
pFlow::sphereParticles::getShapes
const shape & getShapes() const override
Definition: sphereParticles.cpp:639
pFlow::sphereParticles::insertParticles
bool insertParticles(const realx3Vector &position, const wordVector &shapesNames, const anyList &setVarList) override
Definition: sphereParticles.cpp:581
systemControl.hpp
pFlow::sphereParticles::getParticlesInfoFromShape
bool getParticlesInfoFromShape(const wordVector &shapeNames, uint32Vector &propIds, realVector &diams, realVector &m, realVector &Is, uint32Vector &shIndex)
Definition: sphereParticles.cpp:259
pFlow::Vector::reserve
void reserve(size_t cap)
Reserve capacity for vector Preserve the content.
Definition: Vector.hpp:284
pFlow::sphereParticles::boundingSphereMinMax
void boundingSphereMinMax(real &minDiam, real &maxDiam) const override
Definition: sphereParticles.cpp:645
pFlow::uint32
unsigned int uint32
Definition: builtinTypes.hpp:56
pFlow::baseShapeNames::indexValid
bool indexValid(uint32 index) const
Definition: baseShapeNames.hpp:140
pFlow::word
std::string word
Definition: builtinTypes.hpp:64
pFlow::shape::shapePropertyIds
const auto & shapePropertyIds() const
Definition: shape.hpp:80
pFlow::sphereParticles::sphereParticles
sphereParticles(systemControl &control, const property &prop)
construct from systemControl and property
Definition: sphereParticles.cpp:308
pFlow::systemControl
Definition: systemControl.hpp:41
pFlow::zero3
const realx3 zero3(0.0)
Definition: types.hpp:137
pFlow::Vector::size
auto size() const
Size of the vector.
Definition: Vector.hpp:265
pFlow::endl
iOstream & endl(iOstream &os)
Add newline and flush stream.
Definition: iOstream.hpp:341
pFlow::timeInfo
Definition: timeInfo.hpp:28
policy
Kokkos::RangePolicy< pFlow::DefaultExecutionSpace, Kokkos::Schedule< Kokkos::Static >, Kokkos::IndexType< pFlow::uint32 > > policy
Definition: grainParticlesKernels.cpp:25
pFlow::pointField::execution_space
typename InternalFieldType::execution_space execution_space
Definition: pointField.hpp:52
sphereParticlesKernels.hpp
pFlow::VectorSingle::deviceView
INLINE_FUNCTION_H auto deviceView() const
Device view range [0, size)
Definition: VectorSingle.cpp:263
END_WARNING
#define END_WARNING
Definition: streams.hpp:44
pFlow::anyList
Definition: anyList.hpp:35
pFlow::particles
Definition: particles.hpp:33
fatalErrorInFunction
#define fatalErrorInFunction
Report a fatal error and function name and exit the application.
Definition: error.hpp:77
pFlow::shape
Definition: shape.hpp:30
pFlow::sphereShape::Inertia
bool Inertia(uint32 index, real &I) const override
Definition: sphereShape.cpp:147
pFlow::sphereParticles::I
const auto & I() const
const reference to inertia pointField
Definition: sphereParticles.hpp:156
pFlow::internalField::field
const FieldType & field() const
Definition: internalField.hpp:109
pFlow::sphereParticles::shapeTypeName
word shapeTypeName() const override
Definition: sphereParticles.cpp:634
pFlow::particles::shapeIndex
auto & shapeIndex()
Definition: particles.hpp:89
pFlow::sphereShape::boundingDiameter
bool boundingDiameter(uint32 index, real &bDiam) const override
Definition: sphereShape.cpp:81
pFlow::sphereParticles::iterate
bool iterate() override
iterate particles
Definition: sphereParticles.cpp:537
pFlow::VectorSingle
Definition: VectorSingle.hpp:44
pFlow::shapeFile__
const char *const shapeFile__
Definition: vocabs.hpp:41
END_REPORT
#define END_REPORT
Definition: streams.hpp:40
pFlow::objectFile
Definition: objectFile.hpp:30
pFlow::sphereParticles::initializeParticles
bool initializeParticles()
Insert new particles in position with specified shapes.
Definition: sphereParticles.cpp:201
pFlow::sphereParticles::beforeIteration
bool beforeIteration() override
before iteration step
Definition: sphereParticles.cpp:515
pFlow::property
property holds the pure properties of materials.
Definition: property.hpp:37
LAMBDA_HD
#define LAMBDA_HD
Definition: pFlowMacros.hpp:58
pFlow::particles::dynPointStruct
auto & dynPointStruct()
Definition: particles.hpp:74
sphereParticles.hpp
pFlow::sphereParticles::rVelIntegration_
uniquePtr< integration > rVelIntegration_
rotational velocity integrator
Definition: sphereParticles.hpp:75
pFlow::sphereShape::mass
bool mass(uint32 index, real &m) const override
Definition: sphereShape.cpp:108
vocabs.hpp
pFlow::sphereParticles::mass_
realPointField_D mass_
mass of particles field
Definition: sphereParticles.hpp:60
pFlow::triple< real >
pFlow::Vector< word >
m
uint32 m
Definition: NBSLoop.hpp:22
pFlow::sphereParticles::spheres_
ShapeType spheres_
reference to shapes
Definition: sphereParticles.hpp:51
pFlow::integration::create
static uniquePtr< integration > create(const word &baseName, pointStructure &pStruct, const word &method, const realx3Field_D &initialValField)
Create the polymorphic object based on inputs.
Definition: integration.cpp:41
pFlow::anyList::emplaceBack
reference emplaceBack(const word &name, Args &&... args)
Create variable using constructor in-place.
Definition: anyList.hpp:84
pFlow::internalField::deviceView
auto deviceView() const
Definition: internalField.hpp:97
pFlow::sphereParticles::I_
realPointField_D I_
pointField of inertial of particles
Definition: sphereParticles.hpp:63
WARNING
#define WARNING
Definition: streams.hpp:43