50 const DoubleTab& particles_position,
51 const DoubleTab& particles_velocity,
52 const double& deltat_simu)
55 const int& id_solid_phase=1-id_fluid_phase;
59 const double& solid_density = solid_particle.masse_volumique().valeurs()(0, 0);
60 const double& fluid_density = incompressible_fluid.masse_volumique().valeurs()(0, 0);
61 const double& fluid_viscosity = fluid_density
62 * incompressible_fluid.viscosite_cinematique().valeurs()(0, 0);
63 const double& radius_sphere=solid_particle.get_radius();
64 const double& volume_sphere=solid_particle.get_volume();
65 const double& e_dry=solid_particle.get_e_dry();
66 const double min_threshold=1e-10;
77 for (
int ind_particle_j =ind_start_part_j; ind_particle_j < nb_particles_j; ind_particle_j++)
83 compute_dX_dU(dX, dU, particle_i, particle_j, particles_position,
84 particles_velocity, is_particle_particle_collision);
85 double dist_gravity_center = sqrt(local_carre_norme_vect(dX));
86 double dist_between_particles = dist_gravity_center - 2 * radius_sphere;
88 F_now_(particle_i, particle_j) = 0;
89 if (dist_between_particles <= 0)
91 add_collision(particle_i,particle_j,is_particle_particle_collision);
94 norm(d) = dX(d) / dist_gravity_center;
96 double dX_scal_dU = local_prodscal(dX,dU);
99 dUn(d) = (dX_scal_dU / dist_gravity_center) * norm(d);
101 const double impact_velocity = sqrt(local_carre_norme_vect(dUn));
103 F_now_(particle_i, particle_j) = 1;
104 int is_start_of_collision =
F_now_(particle_i, particle_j) >
105 F_old_(particle_i, particle_j);
110 next_dX(d) = dX(d) + deltat_simu * dU(d);
111 const double next_dist_gravity_center = sqrt(local_carre_norme_vect(next_dX));
112 const double next_dist_between_particles = next_dist_gravity_center - 2 * radius_sphere;
113 const double effective_radius = is_particle_particle_collision ? radius_sphere/2 :
115 const double impact_Stokes = solid_density * 2 * effective_radius * impact_velocity /
116 (9 * fluid_viscosity);
117 if (is_start_of_collision)
120 next_dist_between_particles,
126 is_particle_particle_collision);
130 min_threshold ? 0 : force_contact(d) / volume_sphere;
131 if (!is_particle_particle_collision)
134 min_threshold ? 0 : force_contact(d) / volume_sphere;
137 F_old_(particle_i, particle_j) =
F_now_(particle_i, particle_j);
153 const DoubleTab& volumic_phase_indicator_function,
155 const IntTab& particles_eulerian_id_number,
156 DoubleTab& contact_force_source_term)
159 const int nb_faces=interlaced_volumes.
size_array();
160 const IntVect& orientation = domain_vf.
orientation();
162 for (
int face=0; face<nb_faces; face++)
164 const int left_elem=face_voisins(face,0);
165 const int right_elem=face_voisins(face,1);
166 int id_left = left_elem != -1 ? particles_eulerian_id_number(left_elem) : -1;
167 int id_right = right_elem != -1 ? particles_eulerian_id_number(right_elem) : -1;
168 const int id_number=std::max(id_left,id_right);
171 const int ori=orientation(face);
172 contact_force_source_term(face)=(1-volumic_phase_indicator_function(face))
DoubleVect & volumes_entrelaces()
virtual const IntVect & orientation() const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.