LiquidFilmParticle.h
Go to the documentation of this file.
1 // This file is part of the MercuryDPM project (https://www.mercurydpm.org).
2 // Copyright (c), The MercuryDPM Developers Team. All rights reserved.
3 // License: BSD 3-Clause License; see the LICENSE file in the root directory.
4 
5 #ifndef LiquidFilmParticle_H
6 #define LiquidFilmParticle_H
7 #include "DPMBase.h"
8 
13 template<class Particle>
14 class LiquidFilm : public Particle
15 {
16 public:
22  {
23  liquidVolume_ = 0;
25  }
26 
37  {
38  liquidVolume_ = p.liquidVolume_;
39  totalEvaporatedLiquidVolume_ = p.totalEvaporatedLiquidVolume_;
40  }
41 
47  ~LiquidFilm() override
48  = default;
49 
56  LiquidFilm* copy() const override
57  {
58  return new LiquidFilm(*this);
59  }
60 
67  void write(std::ostream& os) const override
68  {
69  Particle::write(os);
70  os << " liquidVolume " << liquidVolume_ << " totalEvaporatedLiquidVolume " << totalEvaporatedLiquidVolume_;
71  }
72 
77  std::string getName() const override
78  {
79  return "LiquidFilm" + Particle::getName();
80  }
81 
82  void read(std::istream& is) override;
83 
85  {
86  return liquidVolume_;
87  }
88 
89  void setLiquidVolume(Mdouble liquidVolume)
90  {
91  liquidVolume_ = liquidVolume;
92  }
93 
94  void addLiquidVolume(Mdouble liquidVolume)
95  {
96  liquidVolume_ += liquidVolume;
97  }
98 
100  {
102  }
103 
105 
107  {
109  }
110 
112  {
113  totalEvaporatedLiquidVolume_ = liquidVolume;
114  }
115 
117  {
118  totalEvaporatedLiquidVolume_ += liquidVolume;
119  }
120 
126  {
127  return liquidVolume_ / Particle::getSurfaceArea();
128  }
129 
131  {
132  return liquidVolume_ / Particle::getVolume();
133  }
134 
135  unsigned getNumberOfFieldsVTK() const override
136  {
137  return 6;
138  }
139 
140  std::string getTypeVTK(unsigned i) const override
141  {
142  return "Float32";
143  }
144 
145  std::string getNameVTK(unsigned i) const override;
146 
147  std::vector<Mdouble> getFieldVTK(unsigned i) const override;
148 
149  bool isSphericalParticle() const override {return true;}
150 
151 protected:
152 
154 };
155 
156 
157 //todo Does mass and interaction radius change when a liquid film is added?
166 template<class Particle>
167 void LiquidFilm<Particle>::read(std::istream& is)
168 {
169  Particle::read(is);
170  std::string dummy;
171  is >> dummy >> liquidVolume_;
172  // a fix to allow reading of restart files pre-nonspherical
173  if (dummy == "invInertia")
174  {
175  is >> dummy >> liquidVolume_;
176  }
177  is >> dummy >> totalEvaporatedLiquidVolume_;
178 }
179 
180 template<class Particle>
182 {
183  if (i==1)
184  return "liquidFilmVolume";
185  else if (i==2)
186  return "liquidBridgeVolume";
187  else if (i==3)
188  return "totalEvaporatedLiquidVolume";
189  else if (i==4)
190  return "meanLiquidFilmThickness";
191  else if (i==5)
192  return "relativeLiquidVolume";
193  else /*i=0*/
194  return "fullLiquidVolume";
195 }
196 
197 template<class Particle>
198 std::vector<Mdouble> LiquidFilm<Particle>::getFieldVTK(unsigned i) const
199 {
200  if (i==1)
201  return { liquidVolume_ };
202  else if (i==2)
203  return { getLiquidBridgeVolume() };
204  else if (i==3)
205  return { totalEvaporatedLiquidVolume_ };
206  else if (i==4)
207  return { getMeanLiquidFilmThickness() };
208  else if (i==5)
209  return { getRelativeLiquidVolume() };
210  else /*i=0*/
211  return { getFullLiquidVolume() };
212 }
213 
214 template<class Particle>
216 {
217  // Sums the volume of all liquid bridges. Half when interacting with a particle, full when interacting with a wall.
218  Mdouble volume = 0.0;
219  for (auto i : this->getInteractions())
220  {
221  auto j = dynamic_cast<LiquidMigrationWilletInteraction*>(i);
222  if (j)
223  {
224  if (dynamic_cast<BaseParticle*>(j->getI()))
225  volume += 0.5 * j->getLiquidBridgeVolume();
226  else
227  volume += j->getLiquidBridgeVolume();
228  }
229  else
230  {
231  auto k = dynamic_cast<LiquidMigrationLSInteraction*>(i);
232  if (k)
233  {
234  if (dynamic_cast<BaseParticle*>(k->getI()))
235  volume += 0.5 * k->getLiquidBridgeVolume();
236  else
237  volume += k->getLiquidBridgeVolume();
238  }
239  }
240  }
241  return volume;
242 }
243 
245 
246 #endif
int i
Definition: BiCGSTAB_step_by_step.cpp:9
std::string getName(int argc, char *argv[])
Definition: CombineParallelDataFiles.cpp:16
LiquidFilm< SphericalParticle > LiquidFilmParticle
Definition: LiquidFilmParticle.h:244
float * p
Definition: Tutorial_Map_using.cpp:9
Definition: BaseParticle.h:33
Definition: LiquidFilmParticle.h:15
void addTotalEvaporatedLiquidVolume(Mdouble liquidVolume)
Definition: LiquidFilmParticle.h:116
void setLiquidVolume(Mdouble liquidVolume)
Definition: LiquidFilmParticle.h:89
~LiquidFilm() override=default
Particle destructor, needs to be implemented and checked if it removes tangential spring information.
std::vector< Mdouble > getFieldVTK(unsigned i) const override
Definition: LiquidFilmParticle.h:198
LiquidFilm()
Basic Particle constructor, creates an Particle at (0,0,0) with radius, mass and inertia equal to 1.
Definition: LiquidFilmParticle.h:21
Mdouble getMeanLiquidFilmThickness() const
Definition: LiquidFilmParticle.h:125
Mdouble getTotalEvaporatedLiquidVolume() const
Definition: LiquidFilmParticle.h:106
Mdouble getLiquidVolume() const
Definition: LiquidFilmParticle.h:84
LiquidFilm(const LiquidFilm &p)
Particle copy constructor, which accepts as input a reference to a Particle. It creates a copy of thi...
Definition: LiquidFilmParticle.h:36
LiquidFilm * copy() const override
Particle copy method. It calls to copy constructor of this Particle, useful for polymorfism.
Definition: LiquidFilmParticle.h:56
std::string getName() const override
Definition: LiquidFilmParticle.h:77
Mdouble getLiquidBridgeVolume() const
Definition: LiquidFilmParticle.h:215
void read(std::istream &is) override
Definition: LiquidFilmParticle.h:167
Mdouble totalEvaporatedLiquidVolume_
Definition: LiquidFilmParticle.h:153
Mdouble liquidVolume_
Definition: LiquidFilmParticle.h:153
Mdouble getRelativeLiquidVolume() const
Definition: LiquidFilmParticle.h:130
std::string getTypeVTK(unsigned i) const override
Definition: LiquidFilmParticle.h:140
void addLiquidVolume(Mdouble liquidVolume)
Definition: LiquidFilmParticle.h:94
void setTotalEvaporatedLiquidVolume(Mdouble liquidVolume)
Definition: LiquidFilmParticle.h:111
void write(std::ostream &os) const override
Definition: LiquidFilmParticle.h:67
std::string getNameVTK(unsigned i) const override
Definition: LiquidFilmParticle.h:181
Mdouble getFullLiquidVolume() const
Definition: LiquidFilmParticle.h:99
bool isSphericalParticle() const override
Definition: LiquidFilmParticle.h:149
unsigned getNumberOfFieldsVTK() const override
Definition: LiquidFilmParticle.h:135
Defines the liquid bridge LS interaction between two particles or walls.
Definition: LiquidMigrationLSInteraction.h:30
Defines the liquid bridge willet interaction between two particles or walls.
Definition: LiquidMigrationWilletInteraction.h:30
char char char int int * k
Definition: level2_impl.h:374
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t< dt !=data_source::global_mem, void > write(PacketType &packet_data, DataScalar ptr)
write, a template function used for storing the data to local memory. This function is used to guaran...
Definition: TensorContractionSycl.h:221
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t< PacketLoad, PacketType > read(const TensorMapper &tensorMapper, const StorageIndex &NCIndex, const StorageIndex &CIndex, const StorageIndex &ld)
read, a template function used for loading the data from global memory. This function is used to guar...
Definition: TensorContractionSycl.h:162
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2