SPHinXsys  alpha version
eulerian_compressible_fluid_dynamics_complex.hpp
Go to the documentation of this file.
1 
6 #ifndef EULERIAN_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP
7 #define EULERIAN_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP
8 
10 
11 //=================================================================================================//
12 namespace SPH
13 {
14 //=================================================================================================//
15  namespace eulerian_compressible_fluid_dynamics
16  {
17  //=================================================================================================//
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)
24  {
25  if (base_body_relation.sph_body_ != wall_contact_relation.sph_body_)
26  {
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;
29  exit(1);
30  }
31 
32  for (size_t k = 0; k != CompressibleFluidWallData::contact_particles_.size(); ++k)
33  {
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_));
41  }
42  }
43  //=================================================================================================//
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) {}
50  //=================================================================================================//
51  template<class BaseViscousAccelerationType>
52  void ViscousWithWall<BaseViscousAccelerationType>::Interaction(size_t index_i, Real dt)
53  {
54  BaseViscousAccelerationType::Interaction(index_i, dt);
55 
56  Real rho_i = this->rho_[index_i];
57  Vecd& vel_i = this->vel_[index_i];
58 
59  Vecd acceleration(0), vel_derivative(0);
60  for (size_t k = 0; k < CompressibleFluidWallData::contact_configuration_.size(); ++k)
61  {
62  StdLargeVec<Real>& Vol_k = *(this->wall_Vol_[k]);
63  StdLargeVec<Vecd>& vel_ave_k = *(this->wall_vel_ave_[k]);
64  Neighborhood& contact_neighborhood = (*CompressibleFluidWallData::contact_configuration_[k])[index_i];
65  for (size_t n = 0; n != contact_neighborhood.current_size_; ++n)
66  {
67  size_t index_j = contact_neighborhood.j_[n];
68  Real r_ij = contact_neighborhood.r_ij_[n];
69 
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;
73  }
74  }
75 
76  this->dmom_dt_prior_[index_i] += rho_i * acceleration;
77  this->dE_dt_prior_[index_i] += rho_i * dot(acceleration, vel_i);
78  }
79  //=================================================================================================//
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_) {}
85  //=================================================================================================//
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) {}
92  //=================================================================================================//
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) {}
99  //=================================================================================================//
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) {}
107  //=================================================================================================//
108  template<class BasePressureRelaxationType>
109  void PressureRelaxation<BasePressureRelaxationType>::Interaction(size_t index_i, Real dt)
110  {
111  BasePressureRelaxationType::Interaction(index_i, dt);
112 
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);
115  for (size_t k = 0; k < CompressibleFluidWallData::contact_configuration_.size(); ++k)
116  {
117  StdLargeVec<Real>& Vol_k = *(this->wall_Vol_[k]);
118  StdLargeVec<Vecd>& n_k = *(this->wall_n_[k]);
119  Neighborhood& wall_neighborhood = (*CompressibleFluidWallData::contact_configuration_[k])[index_i];
120  for (size_t n = 0; n != wall_neighborhood.current_size_; ++n)
121  {
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];
126 
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_;
136 
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;
139  }
140  }
141  this->dmom_dt_[index_i] += momentum_change_rate;
142  }
143  //=================================================================================================//
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_) {}
149  //=================================================================================================//
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) {}
156  //=================================================================================================//
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) {}
163  //=================================================================================================//
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) {}
170  //=================================================================================================//
171  template<class BaseDensityAndEnergyRelaxationType>
172  void DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>::Interaction(size_t index_i, Real dt)
173  {
174  BaseDensityAndEnergyRelaxationType::Interaction(index_i, dt);
175 
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;
179  for (size_t k = 0; k < CompressibleFluidWallData::contact_configuration_.size(); ++k)
180  {
181  StdLargeVec<Real>& Vol_k = *(this->wall_Vol_[k]);
182  StdLargeVec<Vecd>& n_k = *(this->wall_n_[k]);
183  Neighborhood& wall_neighborhood = (*CompressibleFluidWallData::contact_configuration_[k])[index_i];
184  for (size_t n = 0; n != wall_neighborhood.current_size_; ++n)
185  {
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];
190 
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_;
201 
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;
204  }
205  }
206  this->drho_dt_[index_i] += density_change_rate;
207  this->dE_dt_[index_i] += energy_change_rate;
208  }
209  //=================================================================================================//
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_) {}
215  //=================================================================================================//
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) {}
222  //=================================================================================================//
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) {}
228  //=================================================================================================//
229  }
230 //=================================================================================================//
231 }
232 #endif //EULERIAN_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP
233 //=================================================================================================//
StdVec< ParticleConfiguration * > contact_configuration_
Definition: base_particle_dynamics.h:251
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