30 #ifndef PARTICLE_DYNAMICS_DIFFUSION_REACTION_H 31 #define PARTICLE_DYNAMICS_DIFFUSION_REACTION_H 33 #include "all_particle_dynamics.h" 35 #include "diffusion_reaction.h" 39 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
40 using DiffusionReactionSimpleData =
41 DataDelegateSimple<BodyType,
42 DiffusionReactionParticles<BaseParticlesType>,
43 DiffusionReaction<BaseMaterialType>>;
45 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
46 using DiffusionReactionInnerData =
47 DataDelegateInner<BodyType,
48 DiffusionReactionParticles<BaseParticlesType>,
49 DiffusionReaction<BaseMaterialType>>;
52 class ContactBodyType,
class ContactBaseParticlesType,
class ContactBaseMaterialType>
53 using DiffusionReactionContactData =
54 DataDelegateContact<BodyType,
55 DiffusionReactionParticles<BaseParticlesType>,
56 DiffusionReaction<BaseMaterialType>,
57 ContactBodyType, DiffusionReactionParticles<ContactBaseParticlesType>,
58 DiffusionReaction<ContactBaseMaterialType>, DataDelegateEmptyBase>;
64 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
75 StdVec<StdLargeVec<Real>> &species_n_;
82 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
91 virtual Real
exec(Real dt = 0.0)
override {
return diff_time_step_; };
92 virtual Real parallel_exec(Real dt = 0.0)
override {
return exec(dt); };
102 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
108 StdVec<BaseDiffusion *> species_diffusion_;
109 StdVec<StdLargeVec<Real>> &species_n_;
110 StdVec<StdLargeVec<Real>> &diffusion_dt_;
114 void initializeDiffusionChangeRate(
size_t particle_i);
115 void getDiffusionChangeRate(
size_t particle_i,
size_t particle_j, Vecd &e_ij, Real surface_area_ij);
116 virtual void updateSpeciesDiffusion(
size_t particle_i, Real dt);
117 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override;
118 virtual void Update(
size_t index_i, Real dt = 0.0)
override;
121 typedef BodyType InnerBodyType;
134 class ContactBodyType,
class ContactBaseParticlesType,
class ContactBaseMaterialType>
138 ContactBodyType, ContactBaseParticlesType, ContactBaseMaterialType>
140 StdVec<BaseDiffusion *> species_diffusion_;
141 StdVec<StdLargeVec<Real>> &species_n_;
142 StdVec<StdLargeVec<Real>> &diffusion_dt_;
143 StdVec<StdLargeVec<Real> *> contact_Vol_;
144 StdVec<StdVec<StdLargeVec<Real>> *> contact_species_n_;
147 void getDiffusionChangeRateContact(
size_t particle_i,
size_t particle_j, Vecd &e_ij,
149 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override;
161 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
166 StdVec<BaseDiffusion *> species_diffusion_;
167 StdVec<StdLargeVec<Real>> &species_n_, &species_s_;
169 void initializeIntermediateValue(
size_t particle_i);
170 virtual void Update(
size_t index_i, Real dt = 0.0)
override;
181 template <
class FirstStageType>
184 StdVec<BaseDiffusion *> species_diffusion_;
185 StdVec<StdLargeVec<Real>> &species_n_;
186 StdVec<StdLargeVec<Real>> &diffusion_dt_;
189 StdVec<StdLargeVec<Real>> &species_s_;
190 virtual void updateSpeciesDiffusion(
size_t particle_i, Real dt)
override;
193 SecondStageRK2(
typename FirstStageType::BodyRelationType &body_relation,
203 template <
class FirstStageType>
207 StdVec<BaseDiffusion *> species_diffusion_;
212 typename FirstStageType::InnerBaseParticlesType,
213 typename FirstStageType::InnerBaseMaterialType>
222 virtual void exec(Real dt = 0.0)
override;
223 virtual void parallel_exec(Real dt = 0.0)
override;
228 Real operator()(Real input, Real production_rate, Real loss_rate, Real dt)
const 230 return input * exp(-loss_rate * dt) + production_rate * (1.0 - exp(-loss_rate * dt)) / (loss_rate + TinyReal);
238 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
244 StdVec<StdLargeVec<Real>> &species_n_;
248 virtual void Update(
size_t index_i, Real dt = 0.0)
override;
259 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
265 StdVec<StdLargeVec<Real>> &species_n_;
269 virtual void Update(
size_t index_i, Real dt = 0.0)
override;
280 template <
class BodyType,
class BaseParticlesType,
class BodyPartByParticleType,
class BaseMaterialType>
289 pos_(this->particles_->pos_), species_n_(this->particles_->species_n_){};
294 StdVec<StdLargeVec<Real>> &species_n_;
302 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
311 pos_(this->particles_->pos_), species_n_(this->particles_->species_n_){};
316 StdVec<StdLargeVec<Real>> &species_n_;
323 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
332 species_n_(this->particles_->species_n_), species_name_(species_name)
334 quantity_name_ =
"TotalAveragedParameterOnDiffusionBody";
336 phi_ = this->material_->SpeciesIndexMap()[species_name_];
341 StdVec<StdLargeVec<Real>> &species_n_;
342 std::string species_name_;
344 Real ReduceFunction(
size_t index_i, Real dt = 0.0)
override 346 return species_n_[phi_][index_i] / this->base_particles_->total_real_particles_;
354 template <
class BodyType,
class BaseParticlesType,
class BaseMaterialType>
364 species_n_(this->particles_->species_n_), species_name_(species_name)
366 quantity_name_ =
"TotalAveragedParameterOnPartlyDiffusionBody";
367 initial_reference_ = Real(0);
368 phi_ = this->material_->SpeciesIndexMap()[species_name_];
373 StdVec<StdLargeVec<Real>> &species_n_;
374 std::string species_name_;
376 Real ReduceFunction(
size_t index_i, Real dt = 0.0)
override 378 return species_n_[phi_][index_i] / body_part_particles_.size();
382 #endif // PARTICLE_DYNAMICS_DIFFUSION_REACTION_H
prepare data for inner particle dynamics
Definition: base_particle_dynamics.h:216
StdVec< StdLargeVec< Real > > species_s_
Definition: particle_dynamics_diffusion_reaction.h:209
Simple particle dynamics without considering particle interaction.
Definition: particle_dynamics_algorithms.h:48
A body part with a collection of particles.
Definition: base_body_part.h:64
This is the derived class of diffusion reaction particles.
Compute the diffusion relaxation process of all species with second order Runge-Kutta time stepping...
Definition: particle_dynamics_diffusion_reaction.h:204
Abstract class for body part simple particle dynamics.
Definition: particle_dynamics_bodypart.h:70
Computing the total averaged parameter on partly diffusion body.
Definition: particle_dynamics_diffusion_reaction.h:355
Compute the diffusion relaxation process of all species.
Definition: particle_dynamics_diffusion_reaction.h:103
Compute the reaction process of all species by forward splitting.
Definition: particle_dynamics_diffusion_reaction.h:239
Base abstract class for reduce.
Definition: particle_dynamics_algorithms.h:69
Mapping inside of body according to diffusion. This is a abstract class to be override for case speci...
Definition: particle_dynamics_diffusion_reaction.h:303
Computing the time step size based on diffusion coefficient and particle smoothing length...
Definition: particle_dynamics_diffusion_reaction.h:83
Definition: particle_dynamics_diffusion_reaction.h:135
virtual void exec(Real dt=0.0) override
Definition: particle_dynamics_diffusion_reaction.hpp:241
Real initial_reference_
Definition: particle_dynamics_algorithms.h:104
Base class for all reaction models.
Definition: diffusion_reaction.h:163
virtual Real exec(Real dt=0.0) override
Definition: particle_dynamics_diffusion_reaction.h:91
pure abstract class for initial conditions
Definition: particle_dynamics_diffusion_reaction.h:65
the second stage of the 2nd-order Runge-Kutta scheme
Definition: particle_dynamics_diffusion_reaction.h:182
Compute the reaction process of all species by backward splitting.
Definition: particle_dynamics_diffusion_reaction.h:260
The relation combined an inner and a contact body relation. The interaction is in a inner-boundary-co...
Definition: complex_body_relation.h:42
SPHBody is a base body with basic data and functions. Its derived class can be a real fluid body...
Definition: base_body.h:61
reduce operation in a Lagrangian contrained region.
Definition: particle_dynamics_bodypart.h:227
This class includes an interaction and a update steps.
Definition: particle_dynamics_algorithms.h:160
The abstract relation within a SPH body.
Definition: base_body_relation.h:117
prepare data for simple particle dynamics.
Definition: base_particle_dynamics.h:185
set boundary condition for diffusion problem
Definition: particle_dynamics_diffusion_reaction.h:281
initialization of a runge-kutta integration scheme
Definition: particle_dynamics_diffusion_reaction.h:162
Definition: particle_dynamics_diffusion_reaction.h:226
Computing the total averaged parameter on the whole diffusion body.
Definition: particle_dynamics_diffusion_reaction.h:324
Definition: solid_body_supplementary.cpp:9
The base class for all particle dynamics This class contains the only two interface functions availab...
Definition: base_particle_dynamics.h:145