SPHinXsys  alpha version
eulerian_weakly_compressible_fluid_dynamics_complex.hpp
Go to the documentation of this file.
1 
6 #ifndef EULERIAN_WEAKLY_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP
7 #define EULERIAN_WEAKLY_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP
8 
10 
11  //=================================================================================================//
12 namespace SPH
13 {
14  //=================================================================================================//
15  namespace eulerian_weakly_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), WCFluidWallData(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_realtions 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 != WCFluidWallData::contact_particles_.size(); ++k)
33  {
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_));
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  const Vecd &vel_i = this->vel_[index_i];
58 
59  Vecd acceleration(0), vel_derivative(0);
60  for (size_t k = 0; k < WCFluidWallData::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 = (*WCFluidWallData::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 * contact_neighborhood.dW_ij_[n] * Vol_k[index_j] / rho_i;
72  }
73  }
74 
75  this->dmom_dt_prior_[index_i] += acceleration * rho_i;
76  }
77  //=================================================================================================//
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_) {}
83  //=================================================================================================//
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) {}
89  //=================================================================================================//
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) {}
95  //=================================================================================================//
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) {}
102  //=================================================================================================//
103  template <class BasePressureRelaxationType>
104  void PressureRelaxation<BasePressureRelaxationType>::Interaction(size_t index_i, Real dt)
105  {
106  BasePressureRelaxationType::Interaction(index_i, dt);
107 
108  FluidState state_i(this->rho_[index_i], this->vel_[index_i], this->p_[index_i]);
109 
110  Vecd momentum_change_rate(0.0);
111  for (size_t k = 0; k < WCFluidWallData::contact_configuration_.size(); ++k)
112  {
113  StdLargeVec<Real> &Vol_k = *(this->wall_Vol_[k]);
114  StdLargeVec<Vecd> &n_k = *(this->wall_n_[k]);
115  Neighborhood &wall_neighborhood = (*WCFluidWallData::contact_configuration_[k])[index_i];
116  for (size_t n = 0; n != wall_neighborhood.current_size_; ++n)
117  {
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];
122 
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;
133  }
134  }
135  this->dmom_dt_[index_i] += momentum_change_rate;
136  }
137  //=================================================================================================//
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_) {}
143  //=================================================================================================//
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) {}
150  //=================================================================================================//
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) {}
157  //=================================================================================================//
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) {}
164  //=================================================================================================//
165  template <class BaseDensityAndEnergyRelaxationType>
166  void DensityAndEnergyRelaxation<BaseDensityAndEnergyRelaxationType>::Interaction(size_t index_i, Real dt)
167  {
168  BaseDensityAndEnergyRelaxationType::Interaction(index_i, dt);
169 
170  FluidState state_i(this->rho_[index_i], this->vel_[index_i], this->p_[index_i]);
171  Real density_change_rate = 0.0;
172  for (size_t k = 0; k < WCFluidWallData::contact_configuration_.size(); ++k)
173  {
174  StdLargeVec<Real> &Vol_k = *(this->wall_Vol_[k]);
175  StdLargeVec<Vecd> &n_k = *(this->wall_n_[k]);
176  Neighborhood &wall_neighborhood = (*WCFluidWallData::contact_configuration_[k])[index_i];
177  for (size_t n = 0; n != wall_neighborhood.current_size_; ++n)
178  {
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];
183 
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;
193  }
194  }
195  this->drho_dt_[index_i] += density_change_rate;
196  }
197  //=================================================================================================//
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_) {}
203  //=================================================================================================//
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) {}
210  //=================================================================================================//
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) {}
216  //=================================================================================================//
217  }
218  //=================================================================================================//
219 }
220 #endif //EULERIAN_WEAKLY_COMPRESSIBLE_FLUID_DYNAMICS_COMPLEX_HPP
221 //=================================================================================================//
StdVec< ParticleConfiguration * > contact_configuration_
Definition: base_particle_dynamics.h:251
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