41 const DoubleTab& particles_position,
42 const DoubleTab& particles_velocity,
43 const double& deltat_simu)
46 const int& id_solid_phase=1-id_fluid_phase;
50 const double& solid_density = solid_particle.masse_volumique().valeurs()(0, 0);
51 const double& fluid_density = incompressible_fluid.masse_volumique().valeurs()(0, 0);
52 const double& fluid_viscosity = fluid_density
53 * incompressible_fluid.viscosite_cinematique().valeurs()(0, 0);
54 const double& radius_sphere=solid_particle.get_radius();
55 const double& volume_sphere=solid_particle.get_volume();
56 const double& e_dry=solid_particle.get_e_dry();
57 const double min_threshold=1e-10;
68 for (
int ind_particle_j =ind_start_part_j; ind_particle_j < nb_particles_j; ind_particle_j++)
74 compute_dX_dU(dX, dU, particle_i, particle_j, particles_position,
75 particles_velocity, is_particle_particle_collision);
76 double dist_gravity_center = sqrt(local_carre_norme_vect(dX));
77 double dist_between_particles = dist_gravity_center - 2 * radius_sphere;
79 F_now_(particle_i, particle_j) = 0;
80 if (dist_between_particles <= 0)
82 add_collision(particle_i,particle_j,is_particle_particle_collision);
85 norm(d) = dX(d) / dist_gravity_center;
87 double dX_scal_dU = local_prodscal(dX,dU);
90 dUn(d) = (dX_scal_dU / dist_gravity_center) * norm(d);
92 const double impact_velocity = sqrt(local_carre_norme_vect(dUn));
94 F_now_(particle_i, particle_j) = 1;
95 int is_start_of_collision =
F_now_(particle_i, particle_j) >
96 F_old_(particle_i, particle_j);
101 next_dX(d) = dX(d) + deltat_simu * dU(d);
102 const double next_dist_gravity_center = sqrt(local_carre_norme_vect(next_dX));
103 const double next_dist_between_particles = next_dist_gravity_center - 2 * radius_sphere;
104 const double effective_radius = is_particle_particle_collision ? radius_sphere/2 :
106 const double impact_Stokes = solid_density * 2 * effective_radius * impact_velocity /
107 (9 * fluid_viscosity);
108 if (is_start_of_collision)
111 next_dist_between_particles,
117 is_particle_particle_collision);
121 min_threshold ? 0 : force_contact(d) / volume_sphere;
122 if (!is_particle_particle_collision)
125 min_threshold ? 0 : force_contact(d) / volume_sphere;
128 F_old_(particle_i, particle_j) =
F_now_(particle_i, particle_j);
144 const DoubleTab& volumic_phase_indicator_function,
146 const IntTab& particles_eulerian_id_number,
147 DoubleTab& contact_force_source_term)
150 const int nb_faces=interlaced_volumes.
size_array();
151 const IntVect& orientation = domain_vf.
orientation();
153 for (
int face=0; face<nb_faces; face++)
155 const int left_elem=face_voisins(face,0);
156 const int right_elem=face_voisins(face,1);
157 int id_left = left_elem != -1 ? particles_eulerian_id_number(left_elem) : -1;
158 int id_right = right_elem != -1 ? particles_eulerian_id_number(right_elem) : -1;
159 const int id_number=std::max(id_left,id_right);
162 const int ori=orientation(face);
163 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.