TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Collision_Model_FT_base.h
1/****************************************************************************
2* Copyright (c) 2023, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Collision_Model_FT_base_included
17#define Collision_Model_FT_base_included
18
19
20#include <TRUSTTabFT_forward.h>
21#include <Fluide_Diphasique.h>
22#include <Schema_Comm.h>
23#include <Champ_Don_base.h>
24#include <Matrice_Morse.h>
25#include <Domaine_VDF.h>
26#include <TRUSTTabFT.h>
27#include <TRUSTLists.h>
28#include <TRUST_Ref.h>
29#include <type_traits>
30
31
32class Param;
36
37
38/*! @brief : class Collision_Model_FT
39 *
40 * Description: This class enables to compute solid-solid
41 * interactions for fpi module under the framework of
42 * soft-sphere collision model. Under this framework,
43 * multiple collisions can occurs at the same time (ie a
44 * particle can collide with 2 or more particles). The
45 * collision is spread out on multiple time steps. A slight
46 * overlap (less than the mesh grid size) occurs during the
47 * process.
48 */
50{
51 Declare_base_sans_constructeur(Collision_Model_FT_base);
52
53public:
54
56 // override functions
57 int lire_motcle_non_standard(const Motcle&, Entree&) override;
58 int reprendre(Entree& is) override;
59 int sauvegarder(Sortie& os) const override;
60 int preparer_calcul(const Domaine_VDF& domain_vdf,
61 const int nb_particles_tot,
62 const Navier_Stokes_FT_Disc& ns,
63 const Transport_Interfaces_FT_Disc& eq_transport,
64 const Schema_Comm& schema_comm_FT);
65 void set_param(Param& p) const override;
66 void reset(); // Tables must have the right dimension to be correctly read during the restart
73 void associate_transport_equation(const Equation_base& equation);
74 int check_for_duplicates(ArrOfInt& vector);
75 void compute_fictive_wall_coordinates(const double& radius);
76
77 virtual void compute_lagrangian_contact_forces(const Fluide_Diphasique& two_phase_fluid,
78 const DoubleTab& particles_position,
79 const DoubleTab& particles_velocity,
80 const double& deltat_simu)=0;
81
82 virtual void discretize_contact_forces_eulerian_field(const DoubleTab& volumic_phase_indicator_function,
83 const Domaine_VF& domain_vf,
84 const IntTab& particles_eulerian_id_number,
85 DoubleTab& contact_force_source_term)=0;
86
88 const Transport_Interfaces_FT_Disc& eq_transport);
89
90 void compute_Verlet_tables(const DoubleTab& particles_position,
91 const DoubleTab& particles_velocity,
92 double& max_vi,
93 const double& radius,
94 const ArrOfInt& list_particles_to_check_LC);
95
96 DoubleTab compute_contact_force(
97 const double& next_dist_int,
98 const DoubleTab& norm,
99 const DoubleTab& dUn,
100 const int& particle_i,
101 const int& particle_j,
102 const int& is_compression_step,
103 const double& is_collision_part_part);
104
105 double compute_ewet_legendre(const double& St) {return exp(-35 / (St + 1e-6));} // See: D. Legendre et al, Chem. Eng. Sci., (2006).
106
107 double compute_stiffness_breugem(const double& mass_eff, const double& e_dry) // See. W-P. Breugem, 2010.
108 {return (mass_eff * (pow(M_PI,2)+ pow(log(e_dry), 2))) / pow(collision_duration_, 2);}
109
110 double compute_damper_breugem(const double& mass_eff, const double& e_dry) // See. W-P. Breugem, 2010.
111 {return -2*(mass_eff * log(e_dry)) / (collision_duration_);}
112
113 void add_collision(const int part_i, const int part_j, const bool is_part_part_collision);
114 bool is_Verlet_activated();
115 bool is_LC_activated();
116
117 // setters
118 void set_nb_particles_tot(int nb_particles_tot) { nb_particles_tot_=nb_particles_tot; }
119 void set_nb_real_particles(int nb_real_particles) { nb_real_particles_=nb_real_particles; }
120
121 void set_activation_distance(const double& diameter)
122 {
125 }
126 void set_spring_properties(const Solid_Particle_base& solid_particle);
127 void set_domain_dimensions(DoubleVect& Longueurs) { domain_dimensions_=Longueurs; }
128 void set_origin(DoubleVect& Origin) { origin_=Origin; }
129 void set_geometric_parameters(const Domaine_VDF& domaine_vdf);
130 void set_LC_zones(const Domaine_VF& domaine_vf, const Schema_Comm& schema_com);
131
132 // getters
133 const int& get_nb_dt_Verlet() const { return nb_dt_Verlet_; }
134 const int& get_nb_dt_compute_Verlet() const { return nb_dt_compute_Verlet_; }
135 const int& get_nb_dt_max_Verlet() const { return nb_dt_max_Verlet_; }
137 const int& get_collision_number() const { return collision_number_; }
138 const int& get_nb_real_particles() const { return nb_real_particles_; }
139 const int& get_nb_particles_tot() const { return nb_particles_tot_; }
140
141 int get_last_id(const ArrOfInt& list_particles_to_check_LC);
142 int get_id(const ArrOfInt& list_particle, const int ind_id_particle);
143
144 const double& get_duration_collision() const { return collision_duration_; }
146 const double& get_s_Verlet() const { return detection_thickness_Verlet_; }
147 const DoubleVect& get_wall_coordinates() const { return fictive_wall_coordinates_; }
148 const DoubleVect& get_origin() const { return origin_; }
149 const DoubleVect& get_domain_dimensions() const { return domain_dimensions_; }
152 const ArrOfInt& get_list_upper_zone() const { return list_upper_zone_; }
153 const ArrOfInt& get_list_lower_zone() const { return list_lower_zone_; }
154 const IntLists& get_Verlet_table() const { return Verlet_tables_; }
155 // getters to fill tab and vectors
157 DoubleTab& get_set_e_eff() { return e_eff_; }
158 DoubleTab& get_set_F_old() { return F_old_; }
159 DoubleTab& get_set_F_now() { return F_now_; }
162
163
164protected:
165 int is_collision_activated_before_impact_ = 1; // to activate, or not, the collision process before the impact
166 int is_force_on_two_phase_elem_ = 0; // eulerian discretization of the collision forces on the total particles volume (including two-phase cells)
167 int nb_particles_tot_ = 0; // number of particles in the whole domain
168 int nb_dt_Verlet_ = 0; // number of time steps since last compute of Verlet tables
169 int nb_dt_compute_Verlet_ = 0; // number of time steps to achieve before recomputing Verlet tables
170 int nb_dt_max_Verlet_ = 0; // maximum number of time step before recomputing Verlet tables
173 double activation_distance_percentage_diameter_ = 0; // distance to the wall as a percentage of the particle diameter
175 double collision_duration_ = 0.; // duration of the collision in seconds
177
179 DoubleTab e_eff_; // effective restitution coefficient
180 DoubleTab F_old_;
181 DoubleTab F_now_;
186
187 OBS_PTR(Transport_Interfaces_FT_Disc) refequation_transport_;
188
189 OBS_PTR(Domaine) ref_domaine;
190
191 void compute_dX_dU(DoubleTab& dX, DoubleTab& dU, const int& particle,\
192 const int& neighbor, const DoubleTab& particles_position, const\
193 DoubleTab& particles_velocity, const bool is_particle_particle_collision );
194
195
196 int get_nb_particles_j(const int ind_particle_i) const;
197 int get_ind_start_particles_j(const int ind_particle_i) const;
198 int get_particle_i(const int ind_particle_i);
199 int get_particle_j(const int ind_particle_i, const int ind_particle_j);
200
201
202 IntVect nb_nodes_;
203 DoubleVect origin_;
205 DoubleVect fictive_wall_coordinates_; // an offset is applied to compute collision forces before the impact
208 int nb_real_particles_; // = nb_particles_tot_ for CHECK_ALL and VERLET
209
214
217
220};
221
222#endif
void compute_fictive_wall_coordinates(const double &radius)
const IntLists & get_Verlet_table() const
void set_activation_distance(const double &diameter)
double compute_damper_breugem(const double &mass_eff, const double &e_dry)
OBS_PTR(Domaine) ref_domaine
int sauvegarder(Sortie &os) const override
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
const int & get_nb_dt_compute_Verlet() const
const DoubleVect & get_wall_coordinates() const
void associate_transport_equation(const Equation_base &equation)
void set_origin(DoubleVect &Origin)
const int & get_nb_real_particles() const
const ArrOfInt & get_list_upper_zone() const
void set_geometric_parameters(const Domaine_VDF &domaine_vdf)
Recover the geometric parameters of the domain: number of nodes in each direction origin of the domai...
const DoubleVect & get_origin() const
virtual void discretize_contact_forces_eulerian_field(const DoubleTab &volumic_phase_indicator_function, const Domaine_VF &domain_vf, const IntTab &particles_eulerian_id_number, DoubleTab &contact_force_source_term)=0
const int & get_nb_dt_max_Verlet() const
int get_particle_i(const int ind_particle_i)
const DoubleTab & get_particles_collision_number() const
const int & get_nb_dt_Verlet() const
int check_for_duplicates(ArrOfInt &vector)
Check if two particles have the same ID Very important function to stop computation if two particles ...
int get_ind_start_particles_j(const int ind_particle_i) const
int get_nb_particles_j(const int ind_particle_i) const
void add_collision(const int part_i, const int part_j, const bool is_part_part_collision)
double compute_stiffness_breugem(const double &mass_eff, const double &e_dry)
const double & get_delta_n() const
const double & get_s_Verlet() const
const int & get_nb_particles_tot() const
int preparer_calcul(const Domaine_VDF &domain_vdf, const int nb_particles_tot, const Navier_Stokes_FT_Disc &ns, const Transport_Interfaces_FT_Disc &eq_transport, const Schema_Comm &schema_comm_FT)
void set_domain_dimensions(DoubleVect &Longueurs)
void research_collision_pairs_Verlet(const Navier_Stokes_FT_Disc &eq_ns, const Transport_Interfaces_FT_Disc &eq_transport)
DoubleTab & get_set_lagrangian_contact_forces()
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
double compute_ewet_legendre(const double &St)
int get_id(const ArrOfInt &list_particle, const int ind_id_particle)
const ArrOfInt & get_list_lower_zone() const
const DoubleTab & get_lagrangian_contact_forces() const
int get_particle_j(const int ind_particle_i, const int ind_particle_j)
void set_nb_particles_tot(int nb_particles_tot)
OBS_PTR(Transport_Interfaces_FT_Disc) refequation_transport_
void set_spring_properties(const Solid_Particle_base &solid_particle)
int get_last_id(const ArrOfInt &list_particles_to_check_LC)
void set_LC_zones(const Domaine_VF &domaine_vf, const Schema_Comm &schema_com)
int reprendre(Entree &is) override
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
DoubleTab compute_contact_force(const double &next_dist_int, const DoubleTab &norm, const DoubleTab &dUn, const int &particle_i, const int &particle_j, const int &is_compression_step, const double &is_collision_part_part)
const double & get_duration_collision() const
void compute_dX_dU(DoubleTab &dX, DoubleTab &dU, const int &particle, const int &neighbor, const DoubleTab &particles_position, const DoubleTab &particles_velocity, const bool is_particle_particle_collision)
const int & get_collision_number() const
virtual void compute_lagrangian_contact_forces(const Fluide_Diphasique &two_phase_fluid, const DoubleTab &particles_position, const DoubleTab &particles_velocity, const double &deltat_simu)=0
void set_nb_real_particles(int nb_real_particles)
void set_param(Param &p) const override
const DoubleVect & get_domain_dimensions() const
const int & get_is_force_on_two_phase_elem() const
void compute_Verlet_tables(const DoubleTab &particles_position, const DoubleTab &particles_velocity, double &max_vi, const double &radius, const ArrOfInt &list_particles_to_check_LC)
class Domaine_VDF
Definition Domaine_VDF.h:64
class Domaine_VF
Definition Domaine_VF.h:44
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
: class Maillage_FT_Disc Cette classe decrit un maillage:
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
friend class Sortie
Definition Objet_U.h:75
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
: class Solid_Particle