5 #ifndef HEATFLUIDCOUPLEDSPECIES_H
6 #define HEATFLUIDCOUPLEDSPECIES_H
12 template<
class NormalForceSpecies>
29 void write(std::ostream& os)
const;
32 void read(std::istream& is);
88 std::array<double,2>
f(
double liquidVolume,
double temperature,
double mass,
double surfaceArea)
const;
134 template<
class NormalForceSpecies>
149 template<
class NormalForceSpecies>
163 template<
class NormalForceSpecies>
167 template<
class NormalForceSpecies>
171 os <<
" massTransferCoefficient " << massTransferCoefficient_;
172 os <<
" latentHeatVaporization " << latentHeatVaporization_;
173 os <<
" liquidDensity " << liquidDensity_;
174 os <<
" evaporationCoefficientA " << evaporationCoefficientA_;
175 os <<
" evaporationCoefficientA " << evaporationCoefficientB_;
176 os <<
" ambientHumidity " << ambientHumidity_;
177 os <<
" ambientEquilibriumMoistureContent " << ambientEquilibriumMoistureContent_;
178 os <<
" ambientVapourConcentration " << ambientVapourConcentration_;
181 template<
class NormalForceSpecies>
186 is >> dummy >> massTransferCoefficient_;
187 is >> dummy >> latentHeatVaporization_;
188 is >> dummy >> liquidDensity_;
189 is >> dummy >> evaporationCoefficientA_;
190 is >> dummy >> evaporationCoefficientB_;
191 is >> dummy >> ambientHumidity_;
192 is >> dummy >> ambientEquilibriumMoistureContent_;
193 is >> dummy >> ambientVapourConcentration_;
194 double ambientTemperature;
195 if (helpers::readOptionalVariable<Mdouble>(is,
"ambientTemperature", ambientTemperature)) {
200 template<
class NormalForceSpecies>
203 return "HeatFluidCoupled" + NormalForceSpecies::getBaseName();
206 template<
class NormalForceSpecies>
209 return massTransferCoefficient_;
212 template<
class NormalForceSpecies>
215 logger.assert_always(massTransferCoefficient > 0,
216 "[HeatFluidCoupledSpecies<>::setMassTransferCoefficient(%)] value has to be positive",
217 massTransferCoefficient);
218 massTransferCoefficient_ = massTransferCoefficient;
221 template<
class NormalForceSpecies>
224 return latentHeatVaporization_;
227 template<
class NormalForceSpecies>
230 logger.assert_always(latentHeatVaporization > 0,
231 "[HeatFluidCoupledSpecies<>::setLatentHeatVaporization(%)] value has to be positive",
232 latentHeatVaporization);
233 latentHeatVaporization_ = latentHeatVaporization;
236 template<
class NormalForceSpecies>
239 return liquidDensity_;
242 template<
class NormalForceSpecies>
245 logger.assert_always(liquidDensity > 0,
246 "[HeatFluidCoupledSpecies<>::setLiquidDensity(%)] value has to be positive",
248 liquidDensity_ = liquidDensity;
251 template<
class NormalForceSpecies>
254 return evaporationCoefficientA_;
257 template<
class NormalForceSpecies>
260 logger.assert_always(evaporationCoefficientA >= 0,
261 "[HeatFluidCoupledSpecies<>::setEvaporationCoefficientA(%)] value has to be positive",
262 evaporationCoefficientA);
263 evaporationCoefficientA_ = evaporationCoefficientA;
266 template<
class NormalForceSpecies>
269 return evaporationCoefficientB_;
272 template<
class NormalForceSpecies>
275 logger.assert_always(evaporationCoefficientB <= 0,
276 "[HeatFluidCoupledSpecies<>::setEvaporationCoefficientB(%)] value has to be negative",
277 evaporationCoefficientB);
278 evaporationCoefficientB_ = evaporationCoefficientB;
281 template<
class NormalForceSpecies>
284 return ambientHumidity_;
287 template<
class NormalForceSpecies>
291 logger.assert_always(ambientHumidity > 0,
292 "[HeatFluidCoupledSpecies<>::setAmbientHumidity(%)] value has to be positive",
294 ambientHumidity_ = ambientHumidity;
297 template<
class NormalForceSpecies>
300 return ambientEquilibriumMoistureContent_;
303 template<
class NormalForceSpecies>
306 logger.assert_always(ambientEquilibriumMoistureContent >= 0,
307 "[HeatFluidCoupledSpecies<>::setAmbientEquilibriumMoistureContent(%)] value has to be positive",
308 ambientEquilibriumMoistureContent);
309 ambientEquilibriumMoistureContent_ = ambientEquilibriumMoistureContent;
312 template<
class NormalForceSpecies>
315 return ambientVapourConcentration_;
318 template<
class NormalForceSpecies>
321 logger.assert_always(ambientVapourConcentration >= 0,
322 "[HeatFluidCoupledSpecies<>::setAmbientVapourConcentration(%)] value has to be positive",
323 ambientVapourConcentration);
324 ambientVapourConcentration_ = ambientVapourConcentration;
327 template<
class NormalForceSpecies>
332 double mass =
p->getMass();
333 double surfaceArea =
p->getSurfaceArea();
336 std::array<double,2> k1 =
f(
p->getLiquidVolume() ,
p->getTemperature() , mass, surfaceArea);
337 std::array<double,2> k2 =
f(
p->getLiquidVolume() + 0.5*dt*k1[0],
p->getTemperature() + 0.5*dt*k1[1], mass, surfaceArea);
338 std::array<double,2> k3 =
f(
p->getLiquidVolume() + 0.5*dt*k2[0],
p->getTemperature() + 0.5*dt*k2[1], mass, surfaceArea);
339 std::array<double,2> k4 =
f(
p->getLiquidVolume() + dt*k3[0],
p->getTemperature() + dt*k3[1], mass, surfaceArea);
340 double dLiquidVolume = dt * (k1[0] + 2*k2[0] + 2*k3[0] + k4[0]) / 6.0;
341 double dTemperature = dt * (k1[1] + 2*k2[1] + 2*k3[1] + k4[1]) / 6.0;
345 dLiquidVolume = -dLiquidVolume;
346 dTemperature = -dTemperature;
349 double dLiquidFilm =
std::min(dLiquidVolume,
p->getLiquidVolume());
350 double remainder = dLiquidVolume - dLiquidFilm;
360 double liquidBridgeVolume = 0.0;
361 for (
auto i :
p->getInteractions())
364 liquidBridgeVolume +=
j->getLiquidBridgeVolume();
366 double dLiquidBridge =
std::min(remainder, liquidBridgeVolume);
367 remainder -= dLiquidBridge;
369 double factor = liquidBridgeVolume == 0.0 ? 0.0 : dLiquidBridge / liquidBridgeVolume;
370 for (
auto i :
p->getInteractions())
373 j->addLiquidBridgeVolumeByEvaporation(-factor *
j->getLiquidBridgeVolume());
377 p->addLiquidVolume(-dLiquidFilm);
378 p->addTotalEvaporatedLiquidVolume(dLiquidVolume - remainder);
380 double dLiquidVolumeFactor = dLiquidVolume == 0.0 ? 0.0 : (dLiquidVolume - remainder) / dLiquidVolume;
381 p->setTemperature(
std::max(0.0,
p->getTemperature() - dTemperature * dLiquidVolumeFactor));
392 template<
class NormalForceSpecies>
399 double dT = temperature - 273;
400 double saturatedVapourConcentration = dT < 1 ? 8.319815774e-3 * temperature / 274 :
401 (((4.844e-9*dT - 1.4807e-7)*dT + 2.6572e-5)*dT - 4.8613e-5)*dT + 8.342e-3;
404 double equilibriumActivationEnergy = -
constants::R * this->getAmbientTemperature() *
log(getAmbientHumidity());
406 double moistureContent = liquidVolume * getLiquidDensity() / mass;
407 double activationEnergy = equilibriumActivationEnergy * (moistureContent - getAmbientEquilibriumMoistureContent());
411 double interfaceVapourConcentration = temperature == 0 ? 0.0 :
412 exp(-activationEnergy / (
constants::R * temperature)) * saturatedVapourConcentration;
415 double dLiquidMass = -getMassTransferCoefficient() * surfaceArea * (interfaceVapourConcentration - getAmbientVapourConcentration());
418 double dLiquidVolume = dLiquidMass / getLiquidDensity();
421 double heatOfEvaporation = getLatentHeatVaporization() * (1.0 + getEvaporationCoefficientA() *
422 exp((getEvaporationCoefficientB() * getLiquidDensity() / mass) * liquidVolume)) * dLiquidMass;
425 double dTemperature = heatOfEvaporation / (mass * this->getHeatCapacity());
427 return { dLiquidVolume, dTemperature };
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
float * p
Definition: Tutorial_Map_using.cpp:9
DPMBase * getDPMBase()
Gets the problem that is solved using this handler.
Definition: BaseHandler.h:733
Stores information about interactions between two interactable objects; often particles but could be ...
Definition: BaseInteraction.h:39
Definition: BaseParticle.h:33
ParticleHandler * getHandler() const
Returns pointer to the particle's ParticleHandler.
Definition: BaseParticle.cc:650
Mdouble getTimeStep() const
Returns the simulation time step.
Definition: DPMBase.cc:1241
Definition: HeatFluidCoupledInteraction.h:17
Species for the HeatFluidCoupledParticle.
Definition: HeatFluidCoupledSpecies.h:14
Mdouble getAmbientVapourConcentration() const
Allows ambientVapourConcentration_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:313
void setEvaporationCoefficientB(Mdouble evaporationCoefficientB)
Allows evaporationCoefficientB_ to be changed.
Definition: HeatFluidCoupledSpecies.h:273
Mdouble getEvaporationCoefficientA() const
Allows evaporationCoefficientA_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:252
Mdouble ambientVapourConcentration_
The ambient vapour concentration (kg/m^3).
Definition: HeatFluidCoupledSpecies.h:130
Mdouble getLiquidDensity() const
Allows liquidDensity_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:237
void setEvaporationCoefficientA(Mdouble evaporationCoefficientA)
Allows evaporationCoefficientA_ to be changed.
Definition: HeatFluidCoupledSpecies.h:258
Mdouble evaporationCoefficientB_
The evaporation coefficient b (dimensionless)
Definition: HeatFluidCoupledSpecies.h:115
HeatFluidCoupledSpecies()
The default constructor.
Definition: HeatFluidCoupledSpecies.h:135
void read(std::istream &is)
Reads the species properties from an input stream.
Definition: HeatFluidCoupledSpecies.h:182
void setAmbientVapourConcentration(Mdouble ambientVapourConcentration)
Allows ambientVapourConcentration_ to be changed.
Definition: HeatFluidCoupledSpecies.h:319
void setMassTransferCoefficient(Mdouble massTransferCoefficient)
Allows massTransferCoefficient_ to be changed.
Definition: HeatFluidCoupledSpecies.h:213
void setLiquidDensity(Mdouble liquidDensity)
Allows liquidDensity_ to be changed.
Definition: HeatFluidCoupledSpecies.h:243
void actionsAfterTimeStep(BaseParticle *particle) const override
Definition: HeatFluidCoupledSpecies.h:328
Mdouble massTransferCoefficient_
The mass transfer rate (m/s)
Definition: HeatFluidCoupledSpecies.h:95
Mdouble ambientHumidity_
The ambient humidity (dimensionless, between 0 and 1, but cannot be 0)
Definition: HeatFluidCoupledSpecies.h:120
void setLatentHeatVaporization(Mdouble latentHeatVaporization)
Allows latentHeatVaporization_ to be changed.
Definition: HeatFluidCoupledSpecies.h:228
Mdouble ambientEquilibriumMoistureContent_
The ambient equilibrium moisture content (dimensionless, between 0 and 1).
Definition: HeatFluidCoupledSpecies.h:125
HeatFluidCoupledInteraction< typename NormalForceSpecies::InteractionType > InteractionType
Definition: HeatFluidCoupledSpecies.h:17
virtual ~HeatFluidCoupledSpecies()
The default destructor.
Definition: HeatFluidCoupledSpecies.h:164
Mdouble evaporationCoefficientA_
The evaporation coefficient a (dimensionless)
Definition: HeatFluidCoupledSpecies.h:110
void write(std::ostream &os) const
Writes the species properties to an output stream.
Definition: HeatFluidCoupledSpecies.h:168
void setAmbientEquilibriumMoistureContent(Mdouble ambientEquilibriumMoistureContent)
Allows ambientEquilibriumMoistureContent_ to be changed.
Definition: HeatFluidCoupledSpecies.h:304
std::array< double, 2 > f(double liquidVolume, double temperature, double mass, double surfaceArea) const
f1 is used in Runge–Kutta method.
Definition: HeatFluidCoupledSpecies.h:393
void setAmbientHumidity(Mdouble ambientHumidity)
Allows ambientHumidity_ to be changed.
Definition: HeatFluidCoupledSpecies.h:288
Mdouble getAmbientHumidity() const
Allows ambientHumidity_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:282
Mdouble getAmbientEquilibriumMoistureContent() const
Allows ambientEquilibriumMoistureContent_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:298
Mdouble latentHeatVaporization_
The latent heat of vaporization (J/kg)
Definition: HeatFluidCoupledSpecies.h:100
Mdouble getEvaporationCoefficientB() const
Allows evaporationCoefficientB_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:267
std::string getBaseName() const
Used in Species::getName to obtain a unique name for each Species.
Definition: HeatFluidCoupledSpecies.h:201
Mdouble liquidDensity_
The liquid density (kg/m^3)
Definition: HeatFluidCoupledSpecies.h:105
Mdouble getLatentHeatVaporization() const
Allows latentHeatVaporization_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:222
Mdouble getMassTransferCoefficient() const
Allows massTransferCoefficient_ to be accessed.
Definition: HeatFluidCoupledSpecies.h:207
Class of particles that store both temperature and liquid volume, which is adapted for the CFD-DEM st...
Definition: HeatFluidCoupledParticle.h:25
Defines the liquid bridge willet interaction between two particles or walls.
Definition: LiquidMigrationWilletInteraction.h:30
Defines a contact force parallel to the contact normal.
Definition: ThermalSpecies.h:14
void read(std::istream &is)
Reads the species properties from an input stream.
Definition: ThermalSpecies.h:210
void write(std::ostream &os) const
Writes the species properties to an output stream.
Definition: ThermalSpecies.h:196
void setAmbientTemperature(Mdouble ambientTemperature)
Definition: ThermalSpecies.h:58
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
RealScalar s
Definition: level1_cplx_impl.h:130
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16 &a)
Definition: BFloat16.h:615
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16 &a)
Definition: BFloat16.h:618
const Mdouble R
Definition: ExtendedMath.h:29
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2