6 #ifndef EULERIAN_WEAKLY_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP 7 #define EULERIAN_WEAKLY_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP 15 namespace eulerian_weakly_compressible_fluid_dynamics
18 template<
class BaseRelaxationType>
19 template<
class BaseBodyRelationType>
20 RelaxationWithWall<BaseRelaxationType>::
21 RelaxationWithWall(BaseBodyRelationType &base_body_relation,
22 BaseBodyRelationContact &wall_contact_relation) :
25 if (base_body_relation.sph_body_ != wall_contact_relation.sph_body_)
27 std::cout <<
"\n Error: the two body_realtions do not have the same source body!" << std::endl;
28 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
32 for (
size_t k = 0; k != WCFluidWallData::contact_particles_.size(); ++k)
34 Real rho_0_k = WCFluidWallData::contact_particles_[k]->rho0_;
35 wall_inv_rho0_.push_back(1.0 / rho_0_k);
36 wall_mass_.push_back(&(WCFluidWallData::contact_particles_[k]->mass_));
37 wall_Vol_.push_back(&(WCFluidWallData::contact_particles_[k]->Vol_));
38 wall_vel_ave_.push_back(WCFluidWallData::contact_particles_[k]->AverageVelocity());
39 wall_acc_ave_.push_back(WCFluidWallData::contact_particles_[k]->AverageAcceleration());
40 wall_n_.push_back(&(WCFluidWallData::contact_particles_[k]->n_));
44 template <
class BaseViscousAccelerationType>
45 template <
class BaseBodyRelationType>
46 ViscousWithWall<BaseViscousAccelerationType>::
47 ViscousWithWall(BaseBodyRelationType &base_body_relation,
48 BaseBodyRelationContact &wall_contact_relation)
49 : RelaxationWithWall<BaseViscousAccelerationType>(base_body_relation, wall_contact_relation) {}
51 template <
class BaseViscousAccelerationType>
52 void ViscousWithWall<BaseViscousAccelerationType>::Interaction(
size_t index_i, Real dt)
54 BaseViscousAccelerationType::Interaction(index_i, dt);
56 Real rho_i = this->rho_[index_i];
57 const Vecd &vel_i = this->vel_[index_i];
59 Vecd acceleration(0), vel_derivative(0);
65 for (
size_t n = 0; n != contact_neighborhood.current_size_; ++n)
67 size_t index_j = contact_neighborhood.j_[n];
68 Real r_ij = contact_neighborhood.r_ij_[n];
70 vel_derivative = 2.0 * (vel_i - vel_ave_k[index_j]) / (r_ij + 0.01 * this->smoothing_length_);
71 acceleration += 2.0 * this->mu_ * vel_derivative * contact_neighborhood.dW_ij_[n] * Vol_k[index_j] / rho_i;
75 this->dmom_dt_prior_[index_i] += acceleration * rho_i;
78 template <
class BaseViscousAccelerationType>
79 BaseViscousAccelerationWithWall<BaseViscousAccelerationType>::
80 BaseViscousAccelerationWithWall(ComplexBodyRelation &fluid_wall_relation)
81 : BaseViscousAccelerationType(fluid_wall_relation.inner_relation_,
82 fluid_wall_relation.contact_relation_) {}
84 template <
class BaseViscousAccelerationType>
85 BaseViscousAccelerationWithWall<BaseViscousAccelerationType>::
86 BaseViscousAccelerationWithWall(BaseBodyRelationInner &fluid_inner_relation,
87 BaseBodyRelationContact &wall_contact_relation)
88 : BaseViscousAccelerationType(fluid_inner_relation, wall_contact_relation) {}
90 template <
class BaseViscousAccelerationType>
91 BaseViscousAccelerationWithWall<BaseViscousAccelerationType>::
92 BaseViscousAccelerationWithWall(ComplexBodyRelation &fluid_complex_relation,
93 BaseBodyRelationContact &wall_contact_relation)
94 : BaseViscousAccelerationType(fluid_complex_relation, wall_contact_relation) {}
96 template <
class BasePressureRelaxationType>
97 template <
class BaseBodyRelationType>
98 PressureRelaxation<BasePressureRelaxationType>::
99 PressureRelaxation(BaseBodyRelationType &base_body_relation,
100 BaseBodyRelationContact &wall_contact_relation)
101 : RelaxationWithWall<BasePressureRelaxationType>(base_body_relation, wall_contact_relation) {}
103 template <
class BasePressureRelaxationType>
104 void PressureRelaxation<BasePressureRelaxationType>::Interaction(
size_t index_i, Real dt)
106 BasePressureRelaxationType::Interaction(index_i, dt);
108 FluidState state_i(this->rho_[index_i], this->vel_[index_i], this->p_[index_i]);
110 Vecd momentum_change_rate(0.0);
116 for (
size_t n = 0; n != wall_neighborhood.current_size_; ++n)
118 size_t index_j = wall_neighborhood.j_[n];
119 Vecd &e_ij = wall_neighborhood.e_ij_[n];
120 Real dW_ij = wall_neighborhood.dW_ij_[n];
121 Real r_ij = wall_neighborhood.r_ij_[n];
123 Vecd vel_in_wall = -state_i.vel_;
124 Real p_in_wall = state_i.p_;
125 Real rho_in_wall = state_i.rho_;
126 FluidState state_j(rho_in_wall, vel_in_wall, p_in_wall);
127 FluidState interface_state = this->riemann_solver_.getInterfaceState(state_i, state_j, n_k[index_j]);
128 Real p_star = interface_state.p_;
129 Vecd vel_star = interface_state.vel_;
130 Real rho_star = this->material_->DensityFromPressure(p_star);
131 momentum_change_rate -= 2.0 * Vol_k[index_j] *
132 (SimTK::outer(rho_star * vel_star, vel_star) + p_star * Matd(1.0)) * e_ij * dW_ij;
135 this->dmom_dt_[index_i] += momentum_change_rate;
138 template <
class BasePressureRelaxationType>
139 BasePressureRelaxationWithWall<BasePressureRelaxationType>::
140 BasePressureRelaxationWithWall(ComplexBodyRelation &fluid_wall_relation)
141 : BasePressureRelaxationType(fluid_wall_relation.inner_relation_,
142 fluid_wall_relation.contact_relation_) {}
144 template <
class BasePressureRelaxationType>
145 BasePressureRelaxationWithWall<BasePressureRelaxationType>::
146 BasePressureRelaxationWithWall(BaseBodyRelationInner &fluid_inner_relation,
147 BaseBodyRelationContact &wall_contact_relation)
148 : BasePressureRelaxationType(fluid_inner_relation,
149 wall_contact_relation) {}
151 template <
class BasePressureRelaxationType>
152 BasePressureRelaxationWithWall<BasePressureRelaxationType>::
153 BasePressureRelaxationWithWall(ComplexBodyRelation &fluid_complex_relation,
154 BaseBodyRelationContact &wall_contact_relation)
155 : BasePressureRelaxationType(fluid_complex_relation,
156 wall_contact_relation) {}
158 template <
class BaseDensityAndEnergyRelaxationType>
159 template <
class BaseBodyRelationType>
160 DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>::
161 DensityAndEnergyRelaxation(BaseBodyRelationType &base_body_relation,
162 BaseBodyRelationContact &wall_contact_relation)
163 : RelaxationWithWall<BaseDensityAndEnergyRelaxationType>(base_body_relation, wall_contact_relation) {}
165 template <
class BaseDensityAndEnergyRelaxationType>
166 void DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>::Interaction(
size_t index_i, Real dt)
168 BaseDensityAndEnergyRelaxationType::Interaction(index_i, dt);
170 FluidState state_i(this->rho_[index_i], this->vel_[index_i], this->p_[index_i]);
171 Real density_change_rate = 0.0;
177 for (
size_t n = 0; n != wall_neighborhood.current_size_; ++n)
179 size_t index_j = wall_neighborhood.j_[n];
180 Vecd &e_ij = wall_neighborhood.e_ij_[n];
181 Real r_ij = wall_neighborhood.r_ij_[n];
182 Real dW_ij = wall_neighborhood.dW_ij_[n];
184 Vecd vel_in_wall = -state_i.vel_;
185 Real p_in_wall = state_i.p_;
186 Real rho_in_wall = state_i.rho_;
187 FluidState state_j(rho_in_wall, vel_in_wall, p_in_wall);
188 FluidState interface_state = this->riemann_solver_.getInterfaceState(state_i, state_j, n_k[index_j]);
189 Real p_star = interface_state.p_;
190 Vecd vel_star = interface_state.vel_;
191 Real rho_star = this->material_->DensityFromPressure(p_star);
192 density_change_rate -= 2.0 * Vol_k[index_j] * dot(rho_star * vel_star, e_ij) * dW_ij;
195 this->drho_dt_[index_i] += density_change_rate;
198 template <
class BaseDensityAndEnergyRelaxationType>
199 BaseDensityAndEnergyRelaxationWithWall<BaseDensityAndEnergyRelaxationType>::
200 BaseDensityAndEnergyRelaxationWithWall(ComplexBodyRelation &fluid_wall_relation)
201 : DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>(fluid_wall_relation.inner_relation_,
202 fluid_wall_relation.contact_relation_) {}
204 template <
class BaseDensityAndEnergyRelaxationType>
205 BaseDensityAndEnergyRelaxationWithWall<BaseDensityAndEnergyRelaxationType>::
206 BaseDensityAndEnergyRelaxationWithWall(BaseBodyRelationInner &fluid_inner_relation,
207 BaseBodyRelationContact &wall_contact_relation)
208 : DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>(fluid_inner_relation,
209 wall_contact_relation) {}
211 template <
class BaseDensityAndEnergyRelaxationType>
212 BaseDensityAndEnergyRelaxationWithWall<BaseDensityAndEnergyRelaxationType>::
213 BaseDensityAndEnergyRelaxationWithWall(ComplexBodyRelation &fluid_complex_relation,
214 BaseBodyRelationContact &wall_contact_relation)
215 : DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>(fluid_complex_relation, wall_contact_relation) {}
220 #endif //EULERIAN_WEAKLY_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP 221 //=================================================================================================//
Here, we define the algorithm classes for complex weakly compressible fluid dynamics, which is involving with either solid walls (with suffix WithWall) or/and other bodies treated as wall for the fluid (with suffix Complex).
Definition: solid_body_supplementary.cpp:9