6 #ifndef EULERIAN_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP 7 #define EULERIAN_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP 15 namespace eulerian_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) :
23 BaseRelaxationType(base_body_relation), CompressibleFluidWallData(wall_contact_relation)
25 if (base_body_relation.sph_body_ != wall_contact_relation.sph_body_)
27 std::cout <<
"\n Error: the two body_relations do not have the same source body!" << std::endl;
28 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
32 for (
size_t k = 0; k != CompressibleFluidWallData::contact_particles_.size(); ++k)
34 Real rho_0_k = CompressibleFluidWallData::contact_particles_[k]->rho0_;
35 wall_inv_rho_0_.push_back(1.0 / rho_0_k);
36 wall_mass_.push_back(&(CompressibleFluidWallData::contact_particles_[k]->mass_));
37 wall_Vol_.push_back(&(CompressibleFluidWallData::contact_particles_[k]->Vol_));
38 wall_vel_ave_.push_back(CompressibleFluidWallData::contact_particles_[k]->AverageVelocity());
39 wall_acc_ave_.push_back(CompressibleFluidWallData::contact_particles_[k]->AverageAcceleration());
40 wall_n_.push_back(&(CompressibleFluidWallData::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 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
72 * contact_neighborhood.dW_ij_[n] * Vol_k[index_j] / rho_i;
76 this->dmom_dt_prior_[index_i] += rho_i * acceleration;
77 this->dE_dt_prior_[index_i] += rho_i * dot(acceleration, vel_i);
80 template<
class BaseViscousAccelerationType>
81 BaseViscousAccelerationWithWall<BaseViscousAccelerationType>::
82 BaseViscousAccelerationWithWall(ComplexBodyRelation &fluid_wall_relation) :
83 BaseViscousAccelerationType(fluid_wall_relation.inner_relation_,
84 fluid_wall_relation.contact_relation_) {}
86 template<
class BaseViscousAccelerationType>
87 BaseViscousAccelerationWithWall<BaseViscousAccelerationType>::
88 BaseViscousAccelerationWithWall(BaseBodyRelationInner &fluid_inner_relation,
89 BaseBodyRelationContact &wall_contact_relation) :
90 BaseViscousAccelerationType(fluid_inner_relation,
91 wall_contact_relation) {}
93 template<
class BaseViscousAccelerationType>
94 BaseViscousAccelerationWithWall<BaseViscousAccelerationType>::
95 BaseViscousAccelerationWithWall(ComplexBodyRelation &fluid_complex_relation,
96 BaseBodyRelationContact &wall_contact_relation) :
97 BaseViscousAccelerationType(fluid_complex_relation,
98 wall_contact_relation) {}
100 template<
class BasePressureRelaxationType>
101 template<
class BaseBodyRelationType>
102 PressureRelaxation<BasePressureRelaxationType>::
103 PressureRelaxation(BaseBodyRelationType &base_body_relation,
104 BaseBodyRelationContact &wall_contact_relation) :
105 RelaxationWithWall<BasePressureRelaxationType>(base_body_relation,
106 wall_contact_relation) {}
108 template<
class BasePressureRelaxationType>
109 void PressureRelaxation<BasePressureRelaxationType>::Interaction(
size_t index_i, Real dt)
111 BasePressureRelaxationType::Interaction(index_i, dt);
113 CompressibleFluidState state_i(this->rho_[index_i], this->vel_[index_i], this->p_[index_i], this->E_[index_i]);
114 Vecd momentum_change_rate(0.0);
120 for (
size_t n = 0; n != wall_neighborhood.current_size_; ++n)
122 size_t index_j = wall_neighborhood.j_[n];
123 Vecd& e_ij = wall_neighborhood.e_ij_[n];
124 Real dW_ij = wall_neighborhood.dW_ij_[n];
125 Real r_ij = wall_neighborhood.r_ij_[n];
127 Vecd vel_in_wall = -state_i.vel_;
128 Real p_in_wall = state_i.p_;
129 Real rho_in_wall = state_i.rho_;
130 Real E_in_wall = state_i.E_;
131 CompressibleFluidState state_j(rho_in_wall, vel_in_wall, p_in_wall, E_in_wall);
132 CompressibleFluidState interface_state = this->riemann_solver_.getInterfaceState(state_i, state_j, n_k[index_j]);
133 Vecd vel_star = interface_state.vel_;
134 Real p_star = interface_state.p_;
135 Real rho_star = interface_state.rho_;
137 momentum_change_rate -= 2.0 * Vol_k[index_j] *
138 (SimTK::outer(rho_star * vel_star, vel_star) + p_star * Matd(1.0)) * e_ij * dW_ij;
141 this->dmom_dt_[index_i] += momentum_change_rate;
144 template<
class BasePressureRelaxationType>
145 BasePressureRelaxationWithWall<BasePressureRelaxationType>::
146 BasePressureRelaxationWithWall(ComplexBodyRelation &fluid_wall_relation) :
147 BasePressureRelaxationType(fluid_wall_relation.inner_relation_,
148 fluid_wall_relation.contact_relation_) {}
150 template<
class BasePressureRelaxationType>
151 BasePressureRelaxationWithWall<BasePressureRelaxationType>::
152 BasePressureRelaxationWithWall(BaseBodyRelationInner &fluid_inner_relation,
153 BaseBodyRelationContact &wall_contact_relation) :
154 BasePressureRelaxationType(fluid_inner_relation,
155 wall_contact_relation) {}
157 template<
class BasePressureRelaxationType>
158 BasePressureRelaxationWithWall<BasePressureRelaxationType>::
159 BasePressureRelaxationWithWall(ComplexBodyRelation &fluid_complex_relation,
160 BaseBodyRelationContact &wall_contact_relation) :
161 BasePressureRelaxationType(fluid_complex_relation,
162 wall_contact_relation) {}
164 template<
class BaseDensityAndEnergyRelaxationType>
165 template<
class BaseBodyRelationType>
166 DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>::
167 DensityAndEnergyRelaxation(BaseBodyRelationType &base_body_relation,
168 BaseBodyRelationContact &wall_contact_relation) :
169 RelaxationWithWall<BaseDensityAndEnergyRelaxationType>(base_body_relation, wall_contact_relation) {}
171 template<
class BaseDensityAndEnergyRelaxationType>
172 void DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>::Interaction(
size_t index_i, Real dt)
174 BaseDensityAndEnergyRelaxationType::Interaction(index_i, dt);
176 CompressibleFluidState state_i(this->rho_[index_i], this->vel_[index_i], this->p_[index_i], this->E_[index_i]);
177 Real density_change_rate = 0.0;
178 Real energy_change_rate = 0.0;
184 for (
size_t n = 0; n != wall_neighborhood.current_size_; ++n)
186 size_t index_j = wall_neighborhood.j_[n];
187 Vecd& e_ij = wall_neighborhood.e_ij_[n];
188 Real r_ij = wall_neighborhood.r_ij_[n];
189 Real dW_ij = wall_neighborhood.dW_ij_[n];
191 Vecd vel_in_wall = -state_i.vel_;
192 Real p_in_wall = state_i.p_;
193 Real rho_in_wall = state_i.rho_;
194 Real E_in_wall = state_i.E_;
195 CompressibleFluidState state_j(rho_in_wall, vel_in_wall, p_in_wall, E_in_wall);
196 CompressibleFluidState interface_state = this->riemann_solver_.getInterfaceState(state_i, state_j, n_k[index_j]);
197 Vecd vel_star = interface_state.vel_;
198 Real p_star = interface_state.p_;
199 Real rho_star = interface_state.rho_;
200 Real E_star = interface_state.E_;
202 density_change_rate -= 2.0 * Vol_k[index_j] * dot(rho_star * vel_star, e_ij) * dW_ij;
203 energy_change_rate -= 2.0 * Vol_k[index_j] * dot(E_star * vel_star + p_star * vel_star, e_ij) * dW_ij;
206 this->drho_dt_[index_i] += density_change_rate;
207 this->dE_dt_[index_i] += energy_change_rate;
210 template<
class BaseDensityAndEnergyRelaxationType>
211 BaseDensityAndEnergyRelaxationWithWall<BaseDensityAndEnergyRelaxationType>::
212 BaseDensityAndEnergyRelaxationWithWall(ComplexBodyRelation &fluid_wall_relation) :
213 DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>(fluid_wall_relation.inner_relation_,
214 fluid_wall_relation.contact_relation_) {}
216 template<
class BaseDensityAndEnergyRelaxationType>
217 BaseDensityAndEnergyRelaxationWithWall<BaseDensityAndEnergyRelaxationType>::
218 BaseDensityAndEnergyRelaxationWithWall(BaseBodyRelationInner &fluid_inner_relation,
219 BaseBodyRelationContact &wall_contact_relation) :
220 DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>(fluid_inner_relation,
221 wall_contact_relation) {}
223 template<
class BaseDensityAndEnergyRelaxationType>
224 BaseDensityAndEnergyRelaxationWithWall<BaseDensityAndEnergyRelaxationType>::
225 BaseDensityAndEnergyRelaxationWithWall(ComplexBodyRelation &fluid_complex_relation,
226 BaseBodyRelationContact &wall_contact_relation) :
227 DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>(fluid_complex_relation, wall_contact_relation) {}
232 #endif //EULERIAN_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP 233 //=================================================================================================//
Here, we define the algorithm classes for eulerian complex 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