TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Transport_Interfaces_FT_Disc.h
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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 Transport_Interfaces_FT_Disc_included
17#define Transport_Interfaces_FT_Disc_included
18
19#include <Equation_base.h>
20#include <Transport_Interfaces_base.h>
21#include <Postraitement_base.h>
22
23#include <Remaillage_FT.h>
24#include <Parcours_interface.h>
25#include <Marching_Cubes.h>
26#include <Connectivite_frontieres.h>
27#include <Topologie_Maillage_FT.h>
28#include <Algorithmes_Transport_FT_Disc.h>
29
30#include <Navier_Stokes_FT_Disc.h>
31#include <Proprietes_part_vol.h>
32#include <TRUSTTabs_forward.h>
33#include <TRUSTTabFT_forward.h>
34#include <TRUST_Ref.h>
35
36#include <Collision_Model_FT_base.h>
37#include <Post_Processing_Hydrodynamic_Forces.h>
38#include <Post_Processing_Hydrodynamic_Forces_Stokes.h>
39
40#include <map>
41
42class Probleme_base;
43class Milieu_base;
45class Loi_horaire;
46
48
50{
51 Declare_instanciable_sans_constructeur(Transport_Interfaces_FT_Disc);
52public:
53
56 //
57 void set_param(Param& titi) const override;
58 int lire_motcle_non_standard(const Motcle&, Entree&) override;
59 // Methodes virtuelles pures de Equation_base
60 //
61 int nombre_d_operateurs() const override; // Zero, y'en a pas.
62 const Operateur& operateur(int i) const override; // Erreur
63 Operateur& operateur(int i) override; // Erreur
64 const Champ_Inc_base& inconnue() const override; // C'est l'indicatrice
65 Champ_Inc_base& inconnue() override;
66
67 // Methodes surchargees de Equation_base
68 //
69 void associer_milieu_base(const Milieu_base& milieu) override;
70
72
73 Milieu_base& milieu() override; // Erreur
74 const Milieu_base& milieu() const override; // Erreur
75 void associer_pb_base(const Probleme_base& probleme) override;
76 void discretiser() override;
77 Entree& lire_cond_init(Entree& is) override;
78 int verif_Cl() const override;
79 double calculer_pas_de_temps() const override;
80 DoubleTab& derivee_en_temps_inco(DoubleTab& derivee) override;
81 void assembler( Matrice_Morse& mat_morse, const DoubleTab& present, DoubleTab& secmem) override ;
82
83 void mettre_a_jour(double temps) override;
84 bool mettre_a_jour_deplacement(double temps);
85 void mettre_a_jour_hors_deplacement(double temps, const bool update_statio=true, const bool update_indic=true);
86 void deplacer_maillage(double temps);
87 bool injecter_supprimer_interfaces(double temps);
88 void completer_maillage_et_changer_temps(double temps);
89
90 std::vector<YAML_data> data_a_sauvegarder() const override;
91 int sauvegarder(Sortie& ) const override;
92 int reprendre(Entree&) override;
93 int impr(Sortie& os) const override;
95
96 // To save front in a different file
97 void init_save_file() override;
98 void close_save_file() override;
99
100 //
101 // Nouvelles methodes
102 //
103 virtual void lire_maillage_ft_cao(Entree& is);
104 int preparer_calcul() override;
106 virtual void preparer_pas_de_temps();
108
109 const Champ_base& get_indicatrice() override;
110 void update_indicatrice() override;
111 void check_indicatrice_is_up_to_date() override;
113 virtual const Champ_base& get_indicatrice_faces();
114 virtual const Champ_base& update_indicatrice_faces();
116 virtual const Champ_base& get_distance_interface() const;
117 virtual const Champ_base& get_update_distance_interface_faces() const;
118 virtual const Champ_base& get_normale_interface() const;
119 // renvoie DoubleTab parce qu'il n'existe pas de champ aux sommets en VDF ! Zut...
120 virtual const DoubleTab& get_update_distance_interface_sommets() const;
121
122 virtual const Parcours_interface& parcours_interface() const;
123 virtual const Marching_Cubes& marching_cubes() const;
127 const Remaillage_FT& remaillage_interface() const;
129 virtual double calculer_integrale_indicatrice(const DoubleVect& indicatrice, double& v_ph0) const;
130
132 const Maillage_FT_Disc& maillage_inject() const;
134
135 void nettoyer_proprietes_particules(const ArrOfInt& som_utilises);
136
137 virtual void calculer_vitesse_transport_interpolee(const Champ_base& champ_vitesse,
138 const Maillage_FT_Disc& m,
139 DoubleTab& vitesse_noeuds,
140 int nv_calc) const
141 {
142 calculer_vitesse_transport_interpolee(champ_vitesse, m, vitesse_noeuds, nv_calc, 1, true);
143 };
144
145 virtual void calculer_vitesse_transport_interpolee(const Champ_base& champ_vitesse,
146 const Maillage_FT_Disc&,
147 DoubleTab& vitesse_noeuds,
148 const int nv_calc,
149 const int standard,
150 const bool la_roue_de_vitesse_a_deja_tournee = false) const;
151 void calculer_scalaire_interpole(const Champ_base& ch_scal,
152 const Maillage_FT_Disc&,
153 DoubleTab& ch_scal_noeuds,
154 int nv_calc) const;
155
156 virtual void remailler_interface();
157
158 //methodes utilisees pour le post-traitement
159 virtual int get_champ_post_FT(const Motcle& champ, Postraitement_base::Localisation loc, DoubleTab *dtab = 0) const;
160 virtual int get_champ_post_FT(const Motcle& champ, Postraitement_base::Localisation loc, IntTab *itab = 0) const;
161 virtual const Maillage_FT_Disc& maillage_interface_pour_post() const;
162 virtual const int& get_n_iterations_distance() const;
163 int get_mesh_tag() const override
164 {
166 };
167
168
169 //Methode d acces au probleme
170 const Probleme_base& get_probleme_base() const;
171
172 //Modifie vpoint (pour N_S) pour imposer au fluide la vitesse de l interface
173 void modifier_vpoint_pour_imposer_vit(const DoubleTab& inco_val,DoubleTab& vpoint0,
174 DoubleTab& vpoint,const DoubleTab& rho_faces,
175 DoubleTab& terme_source,const double temps, const double dt,
176 const int is_explicite,const double eta) override;
177
178 //Methode outil utilisee par modifier_vpoint_pour_imposer_vit(...)
179 void calcul_source(const DoubleTab& inco_val,
180 const DoubleTab& vpoint,
181 const DoubleTab& rho_faces,
182 DoubleTab& source_val,
183 const DoubleTab& vit_imposee,
184 const DoubleTab& indicatrice_faces,
185 const int is_QC,
186 const double dt,
187 const int is_explicite,
188 const double eta);
189 void modifie_source(DoubleTab& so_modif,const DoubleTab& so_val,const DoubleTab& rho_faces,
190 const int n,const int m, const int is_QC,
191 const DoubleVect& vol_entrelaces,const Solveur_Masse_base& solv_masse);
192
193 void calcul_effort_fluide_interface(const DoubleTab& vpoint,const DoubleTab& rho_faces,
194 DoubleTab& source_val,const int is_explicite,const double eta);
195
196 void impr_effort_fluide_interface( DoubleTab& source_val, DoubleTab& pressure_part, DoubleTab& friction_part, DoubleTab& diff_part ) ;
197
198 //Calcul la vitesse imposee a l interface a partir de expression_vitesse_imposee
199 virtual void calcul_vitesse(DoubleTab& vitesse_imp, const DoubleTab& champ_vitesse,
200 const DoubleTab& vpoint, const double temps, const double dt);
201 virtual void get_expression_vitesse_imposee(DoubleTab& vitesse_imp);
202 //Effectue l integration d un ensemble de points (sans notion de facettes)
203 void integrer_ensemble_lagrange(const double temps) override;
204
205 virtual void interpoler_vitesse_face(const DoubleTab& distance_interface,
206 const int phase, const int stencil_width,
207 DoubleTab& champ, DoubleTab& gradient,
208 const double t, const double dt ) ;
209
210 void interpoler_simple_vitesse_face(const DoubleTab& distance_interface,
211 const int phase, const int stencil_width,
212 DoubleTab& champ, DoubleTab& gradient,
213 const double t, const double dt ) ;
214
215 virtual void calcul_nb_traverse( const DoubleTab& xe, const double dx,
216 const int dim, const int ori,
217 Maillage_FT_Disc& maillage, int elem,
218 int& traverse ) ;
219 virtual void calcul_OutElemFa7( Maillage_FT_Disc& maillage,
220 const DoubleTab& indicatrice,
221 const int nb_elem,
222 int& nb_fa7_accepted,
223 IntList& OutElem, IntList& OutFa7 ) ;
224 virtual void PPP_face_interface( Maillage_FT_Disc& maillage, const DoubleTab& indicatrice,
225 const DoubleTab& indicatrice_face, DoubleTab& Vertex ) ;
226
227 virtual void PPP_face_interface_voisin( const DoubleTab& indicatrice, const DoubleTab& indicatrice_face,
228 DoubleTab& Vertex, DoubleTab& PPP ) ;
229 virtual void PPP_face_voisin( const DoubleTab& indicatrice, const DoubleTab& indicatrice_face, DoubleTab& PPP ) ;
230
231 virtual void calcul_maxfa7( Maillage_FT_Disc& maillage, const DoubleTab& indicatrice,
232 const int nb_elem, int& max_fa7, const int exec_planfa7existan ) ;
233 virtual void RenumFa7( DoubleTab& Barycentre, DoubleTab& Tab110,DoubleTab& Tab111,
234 DoubleTab& Tab112, IntTab& Tab12, IntTab& CptFacette,
235 const int nb_facettes, const int nb_facettes_dim ) ;
236 virtual void StockageFa7( Maillage_FT_Disc& maillage, IntTab& CptFacette, DoubleTab& Tab100,
237 DoubleTab& Tab101,DoubleTab& Tab102, DoubleTab& Tab103,
238 DoubleTab& Tab110,DoubleTab& Tab111,DoubleTab& Tab112,
239 IntTab& Tab12, DoubleTab& Barycentre, const DoubleTab& indicatrice,
240 IntList& OutElem, ArrOfBit& fa7, const int exec_planfa7existant) ;
241 virtual void StockageFa7( Maillage_FT_Disc& maillage, DoubleTab& Tab100, DoubleTab& Tab101,
242 DoubleTab& Tab102, DoubleTab& Tab103, DoubleTab& Tab110,
243 DoubleTab& Tab111, DoubleTab& Tab112, IntTab& Tab12,
244 DoubleTab& Barycentre, IntList& OutElem, IntTab& TabOutFa7, ArrOfBit& fa7 ) ;
245 virtual void BaryFa7( Maillage_FT_Disc& maillage, const int i_facette, DoubleTab& Barycentre ) ;
246 virtual void plan_facette_existant( Maillage_FT_Disc& maillage,
247 DoubleList A, DoubleList B, DoubleList C,
248 DoubleList D, const int i_facette,
249 int& test_liste ) ;
250 virtual void calcul_eq_plan_facette(Maillage_FT_Disc& maillage, const int i_facette,
251 double& a, double& b, double& c, double& d);
252 virtual void calcul_eq_plan_facette(const int i_facette,
253 double& a, double& b, double& c, double& d);
254
255 virtual void calcul_tolerance_projete_monophasique( const int i_face, const int ori, const int voisin0,
256 const int voisin1, const DoubleTab& indicatrice_face,
257 const DoubleTab& indicatrice, double& tol ) ;
258
259 virtual void calcul_tolerance_projete_diphasique( const int i_face, const int ori, const int voisin0,
260 const int voisin1, const DoubleTab& indicatrice, double& tol ) ;
261
262 void verifprojete(const int monophasique,const double Lref, double d, const DoubleTab& x,
263 const DoubleTab& V, DoubleTab& coord_projete, int& cpt ) ;
264
265
266 virtual void uzawa(const double d,const DoubleTab& matrice, const DoubleTab& x,
267 const DoubleTab& secmem, DoubleTab& solution) const ;
268
269 virtual void projete_point_face_fluide( int& nb_proj_modif, const int dim_fa7,
270 const DoubleTab& indicatrice_face, const DoubleTab& indicatrice,
271 const DoubleTab& dist_face, const double t, const double dt,
272 DoubleTab& Tab100, DoubleTab& Tab101,DoubleTab& Tab102,
273 DoubleTab& Tab103, IntTab& Tab12, IntTab& CptFacette,
274 DoubleTab& v_imp, DoubleTab& Vertex,
275 Parser& parser_x, Parser& parser_y,Parser& parser_z );
276 virtual void projete_point_face_interface( int& nb_proj_modif,const int dim_fa7,
277 const DoubleTab& indicatrice_face,
278 const DoubleTab& indicatrice,
279 const DoubleTab& dist_face, const double t,
280 const double dt, DoubleTab& Tab100,
281 DoubleTab& Tab101,DoubleTab& Tab102,
282 DoubleTab& Tab103, IntTab& Tab12,
283 IntTab& CptFacette, DoubleTab& v_imp, DoubleTab& Vertex,
284 Parser& parser_x, Parser& parser_y,Parser& parser_z) ;
285
286 virtual void transporter_sans_changement_topologie(DoubleTab& vitesse,
287 const double coeff,const double temps);
288
289 virtual int calculer_composantes_connexes_pour_suppression(IntVect& num_compo);
290 virtual double suppression_interfaces(const IntVect& num_compo, const ArrOfInt& flags_compo_a_supprimer);
291
292 const int& get_vimp_regul() const;
293 void ramasse_miettes(const Maillage_FT_Disc& maillage,
294 DoubleVect& flux,
295 DoubleVect& valeurs);
304
305 // On utilise des OWN_PTR() pour ne pas avoir a inclure la definition
306 // de ces classes (pour reduire les dependances).
308 const DoubleVect& valeurs_euler,
309 ArrOfDouble& valeurs_lagrange);
310
311 // for fpi module
312 // getters/setters
313 Collision_Model_FT_base& get_set_collision_model() { return collision_model_.valeur(); }
314
315 // getters
316 const int& get_nb_particles_tot() const { return nb_particles_tot_; }
317 const Collision_Model_FT_base& get_collision_model() const { return collision_model_.valeur(); }
318 const OWN_PTR(Collision_Model_FT_base)& get_ptr_collision_model() const { return collision_model_; }
319 const DoubleTab& get_particles_position() const { return particles_position_collision_; }
320 const DoubleTab& get_particles_velocity() const { return particles_velocity_collision_; }
321 const ArrOfInt& get_gravity_center_elem() const { return gravity_center_elem_; }
326 const bool& get_is_solid_particle() const { return is_solid_particle_; }
327
328protected:
329 bool injecter_interfaces_par_ajout_phase(double temps);
330 bool injecter_interfaces_pour_TCL(double temps);
332
333 virtual void calculer_vmoy_composantes_connexes(const Maillage_FT_Disc& maillage,
334 const ArrOfInt& compo_connexes_facettes,
335 const int nb_compo_tot,
336 const DoubleTab& vitesse_sommets,
337 DoubleTab& vitesses,
338 DoubleTab& positions) const;
339
340 void ajouter_contribution_saut_vitesse(DoubleTab& deplacement, const bool la_roue_de_vitesse_a_deja_tournee) const;
341 virtual void deplacer_maillage_ft_v_fluide(const double temps);
342
343 virtual void calculer_distance_interface(const Maillage_FT_Disc& maillage,
344 DoubleTab& distance_elements,
345 DoubleTab& normale_elements,
346 const int n_iter) const;
347
348 virtual void calculer_distance_interface_sommets(const DoubleTab& dist_elem,
349 const DoubleTab& normale_elem,
350 DoubleTab& dist_som) const;
351
352
353 virtual void calculer_vitesse_repere_local(const Maillage_FT_Disc& maillage,
354 DoubleTab& deplacement,
355 DoubleTab& Positions,
356 DoubleTab& Vitesses) const;
357
358
359 virtual void calculer_distance_interface_faces(const DoubleTab& dist_elem,
360 const DoubleTab& normale_elem,
361 DoubleTab& dist_faces) const;
362 // Nouvelle methodes
363 // Methode outil utilisee par modifier_vpoint_pour_imposer_vit(...)
364 // Calcul l'indicatrice sur chaque face
365 void calcul_indicatrice_faces(const DoubleTab& indicatrice,
366 const IntTab& face_voisins);
367
368 // for fpi module
369 // getters
378 //setters
379 void set_is_solid_particle(const bool is_solid_particle) { is_solid_particle_=is_solid_particle; }
383
384 void add_fields_to_post_FT(Motcles& fields) const;
385 void fill_ftab_vertices_curvature(DoubleTab *ftab,const DoubleTab& dummytab) const;
386 void fill_ftab_velocity(DoubleTab *ftab,const DoubleTab& dummytab) const;
387 void fill_ftab_local_reference_frame_velocity(DoubleTab *ftab,const DoubleTab& dummytab) const;
388 void fill_ftab_normal_unit(DoubleTab *ftab,const DoubleTab& dummytab) const;
389 void fill_ftab_pressure(DoubleTab *ftab,const DoubleTab& dummytab) const;
390 void fill_ftab_pressure_force(DoubleTab *ftab,const DoubleTab& dummytab) const;
391 void fill_ftab_friction_force(DoubleTab *ftab,const DoubleTab& dummytab) const;
392 void fill_ftab_Stokes_pressure_interp(DoubleTab* ftab, const DoubleTab& values) const;
393 void fill_ftab_Stokes_pressure_th(DoubleTab* ftab, const DoubleTab& values) const;
394 void fill_ftab_Stokes(DoubleTab* ftab, const DoubleTab& values) const;
395
396 OBS_PTR(Probleme_base) probleme_base_;
398 // L'inconnue du probleme
399 OWN_PTR(Champ_Inc_base) indicatrice_;
400 OWN_PTR(Champ_Inc_base) indicatrice_faces_;
401 // Utiliser ces accesseurs :
403 // Utiliser ces accesseurs :
405 // Utiliser ces accesseurs :
407
411
412 DoubleTab& tableaux_positions();
413 IntVect& vecteur_elements();
414 DoubleTab& deplacement_som();
415
417
418 OWN_PTR(Champ_Fonc_base) vitesse_imp_interp_;
419
420 // for fpi module
421 bool is_solid_particle_ = false; // pointer to NS_FT_Disc::is_solid_particle_
424 mutable DoubleTab particles_position_collision_; // for contact forces computation
425 mutable DoubleTab particles_velocity_collision_; // for contact forces computation
426 mutable ArrOfInt gravity_center_elem_; // number of the element which contains the gravity center of the particles
431
434
435
436
437
438private:
439 // Variables internes a la methode de transport
440 Transport_Interfaces_FT_Disc_interne *variables_internes_;
441
442 double temps_debut_;
443
444
445 bool preparer_calcul_anticipated_done_ = false;
446
447 OBS_PTR(Milieu_base) ref_milieu_;
448
449 bool interpolation_repere_local_ = false;
450 ArrOfDouble force_;
451 ArrOfDouble moment_;
452
453 void compute_nb_particles_tot();
454 // for map_element_post_FT ...
455 void fill_ftab_scalar(DoubleTab *ftab, const ArrOfDouble& values) const;
456 void fill_ftab_scalar(DoubleTab *ftab, const DoubleVect& values) const;
457 void fill_ftab_scalar(DoubleTab *ftab, const DoubleTab& values) const;
458 void fill_ftab_vector(DoubleTab *ftab, const DoubleTab& values) const;
459
460 int nb_particles_tot_=0;
461
462 struct map_element_post_FT
463 {
464 using func_type= void (Transport_Interfaces_FT_Disc::*)(DoubleTab*,const DoubleTab&) const;
465 map_element_post_FT() {};
466 map_element_post_FT(const Motcle& location, func_type function, DoubleTab* ptr, const DoubleTab& values):
467 location_(location),
468 function_(function),
469 ptr_(ptr),
470 values_(values)
471 {};
472 Motcle location_;
473 func_type function_;
474 DoubleTab* ptr_;
475 DoubleTab values_;
476 };
477
478 using my_map=std::map<Motcle, map_element_post_FT>;
479
480 void fill_map_post_FT(my_map& map_post, DoubleTab *ftab) const;
481
482 bool explicit_u_NS_ = false;
483};
484
486{
487 Declare_instanciable_sans_constructeur_ni_destructeur(Transport_Interfaces_FT_Disc_interne);
488public:
525private:
527 {}; // Interdit
529 {
530 return *this;
531 }; // Interdit
532
533public:
534 std::vector<YAML_data> data_a_sauvegarder() const;
535 int sauvegarder(Sortie& os) const override;
536 int reprendre(Entree& is) override;
537 void init_save_file();
538 void close_save_file();
539 Nom maillage_interface_xyz_filename(int restart) const;
540
541 // Les membres suivantes sont sauvegardes et repris:
542 OWN_PTR(Champ_Inc_base) indicatrice_cache; // L'indicatrice calculee par update_indicatrice
543 int indicatrice_cache_tag; // Le tag du maillage correspondant
544 Maillage_FT_Disc maillage_interface; // Objet qui peut se reduire a un ensemble de sommets
545 // quand il represente les positions de particules
547 // Fin des membres sauvegardes / repris
548
549 // For now, the front can not be saved with the PDI format
550 // (as the mesh changes with every time step, which means the arrays do not have constant dimensions during the simulation
551 // and this configuration is not supported yet with the current implementation)
552 // so the front will be saved in a different file
553 OWN_PTR(Sortie_Fichier_base) fic_front_sauv_;
554
556 inline void set_pb_name(const Nom& name) { pb_name_ = name; }
558 inline void set_restart_fname(const Nom& name) { restart_fname_ = name; }
560 inline void set_checkpoint_fname(const Nom& name) { checkpoint_fname_ = name; }
562 inline void set_ident(const Nom& name) { ident_ = name; }
563 double time_;
564 inline void set_time(double t) { time_ = t; }
565
566 Proprietes_part_vol proprietes_particules_; //Proprietes physiques de particules
567
568 Maillage_FT_Disc maillage_inject_; //Ensemble de particules a injecter periodiquement
569 Proprietes_part_vol proprietes_inject_; //Proprietes physiques des particules injectees
570
571 // FORMER Keyword (obsolete):
572 // Si iterations_correction_volume == 0, le maillage est transporte par le fluide
573 // a l'aide du champ de vitesse L2 interpole (pas de conservation du volume).
574 // Si iterations_correction_volume > 0, on calcule une correction de volume aux
575 // sommets de l'interface et on l'etale par autant d'iterations d'un lisseur
576 // Voir Transport_Interfaces_FT_Disc::mettre_a_jour
578
579 // NEW Keywords/parameters for volume preserving correction in agreement with phase change :
581 // Si VOFlike_correction_volume == 0, le maillage est transporte par le fluide
582 // a l'aide du champ de vitesse L2 interpole (pas de conservation du volume).
583 // Si VOFlike_correction_volume > 0, on calcule une correction de volume aux
584 // sommets de l'interface et on l'etale par nb_lissage_correction_volume iterations d'un lisseur,
585 // Voir Transport_Interfaces_FT_Disc::mettre_a_jour
586 // pour eviter l'apparition de pic aux interfaces (ie, on lisse legement la correction de volume
587 // (uniquement s'il y en a une))
589 // La correction est iterative car on ne corrige pas exactement du volume demande en deplacant les
590 // noeuds sequentiellement. On fait nb_iterations_correction_volume ou jusqu'a ce que l'erreur
591 // soit inferieure au seuil de correction de volume de Remaillage_FT
593
594 // ADDITIONAL GLOBAL mass conservation with-out phase change:
595 // Rustine introduite pour corriger les pertes de masse:
596 // Si cette valeur est positive, on deplace toute l'interface d'une certaine distance
597 // pour que le volume de la phase 1 reste toujours egal a la valeur prescrite
599 // Si non nul, le calcul de l'integrale pour le volume impose porte sur cette sous-domaine
601
602 OWN_PTR(Champ_Inc_base) vitesse_filtree;
603 DoubleTab doubletab_pos;
606
607 OWN_PTR(Champ_Fonc_base) distance_interface; // Distance a l'interface (aux elements)
608 OWN_PTR(Champ_Fonc_base) normale_interface; // Une normale etalee
609 OWN_PTR(Champ_Fonc_base) surface_interface; // GB : La surface d'interface dans chaque element
610 OWN_PTR(Champ_Fonc_base) tmp_flux; // Tableau temporaire pour le ramasse-miettes
611 OWN_PTR(Champ_Fonc_base) distance_interface_faces; // CF : Distance a l'interface (aux faces)
612 DoubleTab distance_interface_sommets; // Distance a l'interface (aux sommets)
613 OWN_PTR(Champ_Fonc_base) distance_interface_faces_corrigee; // CI : Distance a l'interface corrigee (aux faces)
614 OWN_PTR(Champ_Fonc_base) distance_interface_faces_difference; // CI : Distance a l'interface corrigee - Distance a l'interface calculee (aux faces)
615 OWN_PTR(Champ_Fonc_base) index_element; // CI : indexation des elements
616 OWN_PTR(Champ_Fonc_base) nelem_par_direction; // CI : nombre d'elements par direction
617 // Note de B.M. : zut, y'a pas de champ aux sommets en VDF... donc DoubleTab et
618 // du coup on ne peut pas postraiter facilement. C'est trop con...
624 // Le maillage postraite n'est pas forcement le maillage
627
630 OBS_PTR(Navier_Stokes_std) refequation_vitesse_transport;
631
634
635
636 // Injecteur d'interfaces au cours du temps
640 // temps physique reel auquel a eu lieu la derniere injection (ce n'est pas le temps demande)
642
645
648 double seuil_uzawa ;
651
656
659
662
665
667 // Reference a une loi horaire eventuelle
668 OBS_PTR(Loi_horaire) loi_horaire_;
669
670 // Integration de la vitesse a partir du point de depart (x,y,z)
671 // pendant un temps dt.
672 void integrer_vitesse_imposee(double temps, double dt, double& x, double& y, double& z) const;
673
674 // Les objets-algorithmes :
679 // Cet objet est type en fonction de la discretisation:
680 OWN_PTR(Algorithmes_Transport_FT_Disc) algorithmes_transport_;
681
682};
683#endif
: classe Algorithmes_Transport_FT_Disc
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
Classe Champ_Inc_base.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
: class Collision_Model_FT
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
: class Maillage_FT_Disc Cette classe decrit un maillage:
int get_mesh_tag() const
return mesh_state_tag_
virtual void nettoyer_maillage()
Retire toutes les facettes virtuelles, toutes les facettes invalides (sommet0 == sommet1) et tous les...
void parcourir_maillage()
Remplit la structure intersections_elem_facettes_.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
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
classe Operateur Classe generique de la hierarchie des operateurs.
Definition Operateur.h:39
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
Representation des donnees de la classe Parser.
Definition Parser.h:39
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
Classe qui porte les proprietes de particules.
: class Remaillage_FT Cette classe implemente les procedures de remaillage des interfaces pour le Fro...
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
: class Topologie_Maillage_FT Cette classe implemente les procedures de remaillage des interfaces pou...
OWN_PTR(Champ_Fonc_base) surface_interface
OWN_PTR(Champ_Fonc_base) distance_interface_faces_corrigee
OWN_PTR(Algorithmes_Transport_FT_Disc) algorithmes_transport_
OWN_PTR(Champ_Fonc_base) index_element
OWN_PTR(Champ_Fonc_base) distance_interface_faces_difference
void integrer_vitesse_imposee(double temps, double dt, double &x, double &y, double &z) const
OBS_PTR(Loi_horaire) loi_horaire_
OWN_PTR(Champ_Fonc_base) tmp_flux
std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name and type and dimensions of the indicatrice tag
OWN_PTR(Sortie_Fichier_base) fic_front_sauv_
OWN_PTR(Champ_Fonc_base) distance_interface
OWN_PTR(Champ_Inc_base) indicatrice_cache
int reprendre(Entree &is) override
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
OWN_PTR(Champ_Fonc_base) nelem_par_direction
OWN_PTR(Champ_Fonc_base) normale_interface
OWN_PTR(Champ_Fonc_base) distance_interface_faces
OWN_PTR(Champ_Inc_base) vitesse_filtree
int sauvegarder(Sortie &os) const override
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
OBS_PTR(Navier_Stokes_std) refequation_vitesse_transport
void set_param(Param &titi) const override
DoubleTab & derivee_en_temps_inco(DoubleTab &derivee) override
Calcul de la derivee en temps de l'inconnue : zero.
const Operateur & operateur(int i) const override
void fill_ftab_pressure_force(DoubleTab *ftab, const DoubleTab &dummytab) const
void fill_ftab_friction_force(DoubleTab *ftab, const DoubleTab &dummytab) const
virtual void get_expression_vitesse_imposee(DoubleTab &vitesse_imp)
Collision_Model_FT_base & get_set_collision_model()
const DoubleTab & get_mean_particles_volumic_squared_velocity() const
virtual void PPP_face_interface_voisin(const DoubleTab &indicatrice, const DoubleTab &indicatrice_face, DoubleTab &Vertex, DoubleTab &PPP)
void update_indicatrice_normale_distance()
Updates normals and distances to interface, then updates indicatrice.
virtual const Champ_base & get_indicatrice_faces()
void fill_ftab_normal_unit(DoubleTab *ftab, const DoubleTab &dummytab) const
void interpoler_simple_vitesse_face(const DoubleTab &distance_interface, const int phase, const int stencil_width, DoubleTab &champ, DoubleTab &gradient, const double t, const double dt)
virtual double suppression_interfaces(const IntVect &num_compo, const ArrOfInt &flags_compo_a_supprimer)
OWN_PTR(Champ_Fonc_base) vitesse_imp_interp_
virtual int get_champ_post_FT(const Motcle &champ, Postraitement_base::Localisation loc, DoubleTab *dtab=0) const
Cherche le champ discret aux interfaces dont le nom est "champ", et verifie qu'il peut etre postraite...
void associer_equation_ns(const Navier_Stokes_FT_Disc &ns)
const DoubleTab & get_mean_particles_volumic_velocity() const
int preparer_calcul() override
Tout ce qui ne depend pas des autres problemes eventuels.
OBS_PTR(Navier_Stokes_FT_Disc) equation_ns_
void fill_ftab_vertices_curvature(DoubleTab *ftab, const DoubleTab &dummytab) const
int sauvegarder(Sortie &) const override
On sauvegarde l'inconnue, puis les sources sur un flot de sortie.
virtual void remailler_interface()
Remaillage de l'interface : - amelioration petites et grandes facettes,.
const Collision_Model_FT_base & get_collision_model() const
virtual const DoubleTab & get_update_distance_interface_sommets() const
Renvoi de la distance signee entre l'interface et les sommets du maillage eulerien.
const Topologie_Maillage_FT & topologie_interface() const
int impr(Sortie &os) const override
Imprime les operateurs de l'equation sur un flot de sortie, de facon inconditionnelle.
void calcul_source(const DoubleTab &inco_val, const DoubleTab &vpoint, const DoubleTab &rho_faces, DoubleTab &source_val, const DoubleTab &vit_imposee, const DoubleTab &indicatrice_faces, const int is_QC, const double dt, const int is_explicite, const double eta)
void associer_milieu_base(const Milieu_base &milieu) override
void update_indicatrice() override
Recalcul du champ variables_internes_->indicatrice_cache a partir de la position des interfaces.
void impr_effort_fluide_interface(DoubleTab &source_val, DoubleTab &pressure_part, DoubleTab &friction_part, DoubleTab &diff_part)
void calculer_scalaire_interpole(const Champ_base &ch_scal, const Maillage_FT_Disc &, DoubleTab &ch_scal_noeuds, int nv_calc) const
const DoubleTab & get_particles_purely_solid_mesh_volume() const
virtual void transporter_sans_changement_topologie(DoubleTab &vitesse, const double coeff, const double temps)
void calcul_indicatrice_faces(const DoubleTab &indicatrice, const IntTab &face_voisins)
void fill_ftab_Stokes(DoubleTab *ftab, const DoubleTab &values) const
const Proprietes_part_vol & proprietes_particules() const
virtual const Connectivite_frontieres & connectivite_frontieres() const
void mettre_a_jour(double temps) override
La valeur de l'inconnue sur le pas de temps a ete calculee.
void nettoyer_proprietes_particules(const ArrOfInt &som_utilises)
virtual void calcul_nb_traverse(const DoubleTab &xe, const double dx, const int dim, const int ori, Maillage_FT_Disc &maillage, int elem, int &traverse)
int verif_Cl() const override
Methode appelee par Equation_base::readOn On verifie que toutes les cl sont de type Paroi_FT_disc.
const DoubleTab & get_rms_particles_volumic_velocity() const
virtual void calculer_distance_interface(const Maillage_FT_Disc &maillage, DoubleTab &distance_elements, DoubleTab &normale_elements, const int n_iter) const
Calcul d'un champ scalaire aux elements contenant une distance signee entre le centre de l'element et...
virtual void calcul_tolerance_projete_monophasique(const int i_face, const int ori, const int voisin0, const int voisin1, const DoubleTab &indicatrice_face, const DoubleTab &indicatrice, double &tol)
void modifie_source(DoubleTab &so_modif, const DoubleTab &so_val, const DoubleTab &rho_faces, const int n, const int m, const int is_QC, const DoubleVect &vol_entrelaces, const Solveur_Masse_base &solv_masse)
virtual const Parcours_interface & parcours_interface() const
Post_Processing_Hydrodynamic_Forces_Stokes post_process_hydro_forces_Stokes_
void add_fields_to_post_FT(Motcles &fields) const
virtual const Maillage_FT_Disc & maillage_interface_pour_post() const
Renvoie le maillage stocke specialement pour le postraitement (si on veut postraiter un etat intermed...
const Champ_Inc_base & inconnue() const override
const Champ_base & get_indicatrice() override
getter champ variables_internes_->indicatrice_cache a partir de la position des interfaces.
virtual void calculer_distance_interface_faces(const DoubleTab &dist_elem, const DoubleTab &normale_elem, DoubleTab &dist_faces) const
void check_indicatrice_is_up_to_date() override
Checks if the indicator is up to date.
std::vector< YAML_data > data_a_sauvegarder() const override
for PDI IO: retrieve name and type and dimensions of the indicatrice tag
Transport_Interfaces_FT_Disc()
constructeur par defaut
void discretiser() override
Discretisation des champs: - indicatrice_ : champ scalaire discretise aux elements.
void swap_particles_lagrangian_position_velocity()
WARNING, particles_position_collision_ and particles_velocity_collision_ are not used to transport pa...
const Maillage_FT_Disc & maillage_inject() const
OWN_PTR(Champ_Inc_base) indicatrice_
virtual void calculer_vitesse_transport_interpolee(const Champ_base &champ_vitesse, const Maillage_FT_Disc &m, DoubleTab &vitesse_noeuds, int nv_calc) const
void fill_ftab_pressure(DoubleTab *ftab, const DoubleTab &dummytab) const
const Probleme_base & get_probleme_base() const
OWN_PTR(Collision_Model_FT_base) collision_model_
double calculer_pas_de_temps() const override
Calcul du prochain pas de temps.
void integrer_ensemble_lagrange(const double temps) override
virtual const Champ_base & update_indicatrice_faces()
void associate_temp_equation_post_processing(OBS_PTR(Convection_Diffusion_Temperature_FT_Disc) ref_eq_temp)
const Proprietes_part_vol & proprietes_inject() const
virtual void PPP_face_interface(Maillage_FT_Disc &maillage, const DoubleTab &indicatrice, const DoubleTab &indicatrice_face, DoubleTab &Vertex)
virtual const Champ_base & get_normale_interface() const
virtual void RenumFa7(DoubleTab &Barycentre, DoubleTab &Tab110, DoubleTab &Tab111, DoubleTab &Tab112, IntTab &Tab12, IntTab &CptFacette, const int nb_facettes, const int nb_facettes_dim)
void fill_ftab_Stokes_pressure_th(DoubleTab *ftab, const DoubleTab &values) const
Post_Processing_Hydrodynamic_Forces post_process_hydro_forces_
virtual void PPP_face_voisin(const DoubleTab &indicatrice, const DoubleTab &indicatrice_face, DoubleTab &PPP)
virtual double calculer_integrale_indicatrice(const DoubleVect &indicatrice, double &v_ph0) const
const OWN_PTR(Collision_Model_FT_base) &get_ptr_collision_model() const
void associer_pb_base(const Probleme_base &probleme) override
S'associe au Probleme passe en parametre.
virtual const Algorithmes_Transport_FT_Disc & algorithmes_transport() const
virtual void plan_facette_existant(Maillage_FT_Disc &maillage, DoubleList A, DoubleList B, DoubleList C, DoubleList D, const int i_facette, int &test_liste)
virtual const Champ_base & get_update_distance_interface_faces() const
const Maillage_FT_Disc & maillage_interface() const
virtual void uzawa(const double d, const DoubleTab &matrice, const DoubleTab &x, const DoubleTab &secmem, DoubleTab &solution) const
virtual const Marching_Cubes & marching_cubes() const
virtual void calcul_eq_plan_facette(Maillage_FT_Disc &maillage, const int i_facette, double &a, double &b, double &c, double &d)
virtual void interpoler_vitesse_face(const DoubleTab &distance_interface, const int phase, const int stencil_width, DoubleTab &champ, DoubleTab &gradient, const double t, const double dt)
void fill_ftab_velocity(DoubleTab *ftab, const DoubleTab &dummytab) const
void ramasse_miettes(const Maillage_FT_Disc &maillage, DoubleVect &flux, DoubleVect &valeurs)
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.
virtual void deplacer_maillage_ft_v_fluide(const double temps)
virtual void calcul_tolerance_projete_diphasique(const int i_face, const int ori, const int voisin0, const int voisin1, const DoubleTab &indicatrice, double &tol)
virtual void calcul_OutElemFa7(Maillage_FT_Disc &maillage, const DoubleTab &indicatrice, const int nb_elem, int &nb_fa7_accepted, IntList &OutElem, IntList &OutFa7)
void verifprojete(const int monophasique, const double Lref, double d, const DoubleTab &x, const DoubleTab &V, DoubleTab &coord_projete, int &cpt)
virtual void calcul_maxfa7(Maillage_FT_Disc &maillage, const DoubleTab &indicatrice, const int nb_elem, int &max_fa7, const int exec_planfa7existan)
void fill_ftab_local_reference_frame_velocity(DoubleTab *ftab, const DoubleTab &dummytab) const
static void transfert_conservatif_eulerien_vers_lagrangien_sommets(const Maillage_FT_Disc &maillage, const DoubleVect &valeurs_euler, ArrOfDouble &valeurs_lagrange)
virtual void StockageFa7(Maillage_FT_Disc &maillage, IntTab &CptFacette, DoubleTab &Tab100, DoubleTab &Tab101, DoubleTab &Tab102, DoubleTab &Tab103, DoubleTab &Tab110, DoubleTab &Tab111, DoubleTab &Tab112, IntTab &Tab12, DoubleTab &Barycentre, const DoubleTab &indicatrice, IntList &OutElem, ArrOfBit &fa7, const int exec_planfa7existant)
const ArrOfInt & get_gravity_center_elem() const
void mettre_a_jour_hors_deplacement(double temps, const bool update_statio=true, const bool update_indic=true)
const DoubleTab & get_particles_velocity() const
Entree & lire_cond_init(Entree &is) override
Lecture des conditions initiales.
int reprendre(Entree &) override
On reprend l'inconnue a partir d'un flot d'entree.
void fill_ftab_Stokes_pressure_interp(DoubleTab *ftab, const DoubleTab &values) const
virtual void projete_point_face_interface(int &nb_proj_modif, const int dim_fa7, const DoubleTab &indicatrice_face, const DoubleTab &indicatrice, const DoubleTab &dist_face, const double t, const double dt, DoubleTab &Tab100, DoubleTab &Tab101, DoubleTab &Tab102, DoubleTab &Tab103, IntTab &Tab12, IntTab &CptFacette, DoubleTab &v_imp, DoubleTab &Vertex, Parser &parser_x, Parser &parser_y, Parser &parser_z)
virtual void BaryFa7(Maillage_FT_Disc &maillage, const int i_facette, DoubleTab &Barycentre)
OBS_PTR(Probleme_base) probleme_base_
virtual void calculer_vmoy_composantes_connexes(const Maillage_FT_Disc &maillage, const ArrOfInt &compo_connexes_facettes, const int nb_compo_tot, const DoubleTab &vitesse_sommets, DoubleTab &vitesses, DoubleTab &positions) const
virtual void calcul_vitesse(DoubleTab &vitesse_imp, const DoubleTab &champ_vitesse, const DoubleTab &vpoint, const double temps, const double dt)
virtual void calculer_vitesse_repere_local(const Maillage_FT_Disc &maillage, DoubleTab &deplacement, DoubleTab &Positions, DoubleTab &Vitesses) const
virtual void calculer_distance_interface_sommets(const DoubleTab &dist_elem, const DoubleTab &normale_elem, DoubleTab &dist_som) const
Calcule dist_som, la distance entre l'interface et les sommets du maillage eulerien a partir de dist_...
void update_normale_distance_interface() const
Calcule la normale et la distance a l'interface, evaluees sur une epaisseur egale a n_iterations_dist...
virtual void projete_point_face_fluide(int &nb_proj_modif, const int dim_fa7, const DoubleTab &indicatrice_face, const DoubleTab &indicatrice, const DoubleTab &dist_face, const double t, const double dt, DoubleTab &Tab100, DoubleTab &Tab101, DoubleTab &Tab102, DoubleTab &Tab103, IntTab &Tab12, IntTab &CptFacette, DoubleTab &v_imp, DoubleTab &Vertex, Parser &parser_x, Parser &parser_y, Parser &parser_z)
void calcul_effort_fluide_interface(const DoubleTab &vpoint, const DoubleTab &rho_faces, DoubleTab &source_val, const int is_explicite, const double eta)
virtual int calculer_composantes_connexes_pour_suppression(IntVect &num_compo)
void set_is_solid_particle(const bool is_solid_particle)
void ajouter_contribution_saut_vitesse(DoubleTab &deplacement, const bool la_roue_de_vitesse_a_deja_tournee) const
virtual const Champ_base & get_distance_interface() const
Post_Processing_Hydrodynamic_Forces & get_post_process_hydro_forces()
void modifier_vpoint_pour_imposer_vit(const DoubleTab &inco_val, DoubleTab &vpoint0, DoubleTab &vpoint, const DoubleTab &rho_faces, DoubleTab &terme_source, const double temps, const double dt, const int is_explicite, const double eta) override
virtual const int & get_n_iterations_distance() const
const DoubleTab & get_particles_position() const
void assembler(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem) override
OWN_PTR(Champ_Inc_base) indicatrice_faces_
classe Transport_Interfaces_base Cette classe constitue la classe de base des equations de transport ...