29 #ifndef FLUID_STRUCTURE_INTERACTION_H 30 #define FLUID_STRUCTURE_INTERACTION_H 32 #include "all_particle_dynamics.h" 36 #include "riemann_solver.h" 40 namespace solid_dynamics
42 typedef DataDelegateSimple<SolidBody, SolidParticles, Solid> SolidDataSimple;
43 typedef DataDelegateContact<SolidBody, SolidParticles, Solid, FluidBody, FluidParticles, Fluid> FSIContactData;
44 typedef DataDelegateContact<SolidBody, SolidParticles, Solid, EulerianFluidBody,
45 FluidParticles, Fluid> EFSIContactData;
60 StdVec<StdLargeVec<Real> *> contact_Vol_, contact_rho_n_;
61 StdVec<StdLargeVec<Vecd> *> contact_vel_n_;
66 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override;
82 StdVec<StdLargeVec<Real> *> contact_Vol_, contact_rho_n_;
83 StdVec<StdLargeVec<Vecd> *> contact_vel_n_;
88 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override;
103 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override;
113 template <
class RiemannSolverType>
120 Vol_(particles_->Vol_), vel_ave_(*particles_->AverageVelocity()),
121 acc_prior_(particles_->acc_prior_),
122 acc_ave_(*particles_->AverageAcceleration()), n_(particles_->n_)
125 for (
size_t k = 0; k != contact_particles_.size(); ++k)
127 contact_Vol_.push_back(&(contact_particles_[k]->Vol_));
128 contact_rho_n_.push_back(&(contact_particles_[k]->rho_));
129 contact_vel_n_.push_back(&(contact_particles_[k]->vel_));
130 contact_p_.push_back(&(contact_particles_[k]->p_));
131 contact_acc_prior_.push_back(&(contact_particles_[k]->acc_prior_));
132 riemann_solvers_.push_back(RiemannSolverType(*contact_material_[k], *contact_material_[k]));
140 StdVec<StdLargeVec<Real> *> contact_Vol_, contact_rho_n_, contact_p_;
141 StdVec<StdLargeVec<Vecd> *> contact_vel_n_, contact_acc_prior_;
142 StdVec<RiemannSolverType> riemann_solvers_;
145 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override 147 const Vecd &acc_ave_i = acc_ave_[index_i];
148 Real Vol_i = Vol_[index_i];
149 const Vecd &vel_ave_i = vel_ave_[index_i];
150 const Vecd &n_i = n_[index_i];
160 Fluid *fluid_k = contact_material_[k];
161 RiemannSolverType &riemann_solver_k = riemann_solvers_[k];
163 for (
size_t n = 0; n != contact_neighborhood.
current_size_; ++n)
165 size_t index_j = contact_neighborhood.
j_[n];
166 Vecd e_ij = contact_neighborhood.
e_ij_[n];
167 Real r_ij = contact_neighborhood.
r_ij_[n];
168 Real face_wall_external_acceleration = dot((acc_prior_k[index_j] - acc_ave_i), e_ij);
169 Real p_in_wall = p_k[index_j] + rho_n_k[index_j] * r_ij * SMAX(0.0, face_wall_external_acceleration);
170 Real rho_in_wall = fluid_k->DensityFromPressure(p_in_wall);
171 Vecd vel_in_wall = 2.0 * vel_ave_i - vel_n_k[index_j];
173 FluidState state_l(rho_n_k[index_j], vel_n_k[index_j], p_k[index_j]);
174 FluidState state_r(rho_in_wall, vel_in_wall, p_in_wall);
175 Real p_star = riemann_solver_k.getPStar(state_l, state_r, n_i);
176 force -= 2.0 * p_star * e_ij * Vol_i * Vol_k[index_j] * contact_neighborhood.
dW_ij_[n];
180 acc_prior_[index_i] = force / particles_->ParticleMass(index_i);
183 using FluidPressureForceOnSolid = BaseFluidPressureForceOnSolid<NoRiemannSolver>;
184 using FluidPressureForceOnSolidRiemann = BaseFluidPressureForceOnSolid<AcousticRiemannSolver>;
193 template <
class RiemannSolverType>
200 Vol_(particles_->Vol_), vel_ave_(*particles_->AverageVelocity()),
201 acc_prior_(particles_->acc_prior_), n_(particles_->n_)
204 for (
size_t k = 0; k != contact_particles_.size(); ++k)
206 contact_Vol_.push_back(&(contact_particles_[k]->Vol_));
207 contact_rho_n_.push_back(&(contact_particles_[k]->rho_));
208 contact_vel_n_.push_back(&(contact_particles_[k]->vel_));
209 contact_p_.push_back(&(contact_particles_[k]->p_));
210 riemann_solvers_.push_back(RiemannSolverType(*contact_material_[k], *contact_material_[k]));
218 StdVec<StdLargeVec<Real> *> contact_Vol_, contact_rho_n_, contact_p_;
219 StdVec<StdLargeVec<Vecd> *> contact_vel_n_;
220 StdVec<RiemannSolverType> riemann_solvers_;
223 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override 225 Real Vol_i = Vol_[index_i];
226 const Vecd &vel_ave_i = vel_ave_[index_i];
227 const Vecd &n_i = n_[index_i];
236 Fluid *fluid_k = contact_material_[k];
237 RiemannSolverType &riemann_solver_k = riemann_solvers_[k];
239 for (
size_t n = 0; n != contact_neighborhood.
current_size_; ++n)
241 size_t index_j = contact_neighborhood.
j_[n];
242 Vecd e_ij = contact_neighborhood.
e_ij_[n];
243 Real r_ij = contact_neighborhood.
r_ij_[n];
244 Real p_in_wall = p_k[index_j];
245 Real rho_in_wall = fluid_k->DensityFromPressure(p_in_wall);
246 Vecd vel_in_wall = - vel_n_k[index_j];
248 FluidState state_l(rho_n_k[index_j], vel_n_k[index_j], p_k[index_j]);
249 FluidState state_r(rho_in_wall, vel_in_wall, p_in_wall);
250 FluidState interface_state = riemann_solver_k.getInterfaceState(state_l, state_r, n_i);
251 Real p_star = interface_state.p_;
252 force -= 2.0 * p_star * e_ij * Vol_i * Vol_k[index_j] * contact_neighborhood.
dW_ij_[n];
256 acc_prior_[index_i] = force / particles_->ParticleMass(index_i);
259 using FluidPressureForceOnSolidInEuler = BaseFluidPressureForceOnSolidInEuler<NoRiemannSolver>;
260 using FluidPressureForceOnSolidAcousticRiemannInEuler = BaseFluidPressureForceOnSolidInEuler<AcousticRiemannSolver>;
261 using FluidPressureForceOnSolidHLLCRiemannInEuler = BaseFluidPressureForceOnSolidInEuler<HLLCRiemannSolverInWeaklyCompressibleFluid>;
262 using FluidPressureForceOnSolidHLLCWithLimiterRiemannInEuler = BaseFluidPressureForceOnSolidInEuler<HLLCRiemannSolverWithLimiterInWeaklyCompressibleFluid>;
268 template <
class PressureForceType,
class ViscousForceType>
274 viscous_force_from_fluid_(*this->particles_->template getVariableByName<Vecd>(
"ViscousForceFromFluid")){};
277 ViscousForceType viscous_force_;
282 virtual void Interaction(
size_t index_i, Real dt = 0.0)
override 284 PressureForceType::Interaction(index_i, dt);
285 this->force_from_fluid_[index_i] += viscous_force_from_fluid_[index_i];
286 this->acc_prior_[index_i] += viscous_force_from_fluid_[index_i] / this->particles_->ParticleMass(index_i);
311 Vecd ReduceFunction(
size_t index_i, Real dt = 0.0)
override;
326 Vecd ReduceFunction(
size_t index_i, Real dt = 0.0)
override;
343 virtual void Update(
size_t index_i, Real dt = 0.0)
override;
360 virtual void Update(
size_t index_i, Real dt = 0.0)
override;
383 #endif //FLUID_STRUCTURE_INTERACTION_H A neighborhood around particle i.
Definition: neighbor_relation.h:47
The base relation between a SPH body and its contact SPH bodies.
Definition: base_body_relation.h:136
Definition: fluid_structure_interaction.h:114
virtual void Interaction(size_t index_i, Real dt=0.0) override
Definition: fluid_structure_interaction.cpp:107
size_t current_size_
Definition: neighbor_relation.h:50
Simple particle dynamics without considering particle interaction.
Definition: particle_dynamics_algorithms.h:48
Declaration of solidbody which is used for Solid BCs and derived from RealBody.
Definition: solid_body.h:46
StdLargeVec< Real > r_ij_
Definition: neighbor_relation.h:56
Base class of all fluids.
Definition: base_material.h:89
StdLargeVec< Vecd > e_ij_
Definition: neighbor_relation.h:57
virtual void Interaction(size_t index_i, Real dt=0.0) override
Definition: fluid_structure_interaction.cpp:31
Base abstract class for reduce.
Definition: particle_dynamics_algorithms.h:69
This is the base classes of all materials. A function in a derived material class returns a value wit...
template class for computing force from fluid with updated viscous force
Definition: fluid_structure_interaction.h:269
Computing average velocity. This class is for FSI applications to achieve smaller solid dynamics time...
Definition: fluid_structure_interaction.h:352
Impose force matching between fluid and solid dynamics. Note that the fluid time step should be large...
Definition: fluid_structure_interaction.h:369
initialize the displacement for computing average velocity. This class is for FSI applications to ach...
Definition: fluid_structure_interaction.h:335
Template class fro computing the pressure force from the fluid with different Riemann solvers...
Definition: fluid_structure_interaction.h:194
Computing the viscous force from the fluid.
Definition: fluid_structure_interaction.h:51
Here, we define the algorithm classes for elastic solid dynamics.
Computing the total viscous force from fluid.
Definition: fluid_structure_interaction.h:303
StdLargeVec< Real > dW_ij_
Definition: neighbor_relation.h:55
Computing the viscous force from the fluid in eulerian framework.
Definition: fluid_structure_interaction.h:73
Computing total force from fluid.
Definition: fluid_structure_interaction.h:318
Computing the viscous force from the fluid.
Definition: fluid_structure_interaction.h:95
This is the class for particle interaction with other particles.
Definition: particle_dynamics_algorithms.h:115
virtual void Interaction(size_t index_i, Real dt=0.0) override
Definition: fluid_structure_interaction.cpp:78
StdLargeVec< Vecd > force_from_fluid_
Definition: fluid_structure_interaction.h:221
StdLargeVec< Vecd > force_from_fluid_
Definition: fluid_structure_interaction.h:143
Here, we define the algorithm classes for complex fluid dynamics, which is involving with either soli...
prepare data for simple particle dynamics.
Definition: base_particle_dynamics.h:185
StdLargeVec< size_t > j_
Definition: neighbor_relation.h:53
Definition: riemann_solver.h:36
Definition: solid_body_supplementary.cpp:9