TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Transport_Marqueur_FT.cpp
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#include <Transport_Marqueur_FT.h>
17#include <Probleme_base.h>
18#include <Schema_Temps_base.h>
19#include <Discretisation_base.h>
20#include <TRUSTTab.h>
21#include <Fluide_Incompressible.h>
22#include <Champ_Uniforme.h>
23#include <Fluide_Diphasique.h>
24#include <Domaine_VF.h>
25#include <Source_Reaction_Particules.h>
26#include <Domaine.h>
27#include <Sous_Domaine.h>
28#include <Source_Masse_Ajoutee.h>
29#include <communications.h>
30#include <Param.h>
31
32Implemente_instanciable_sans_constructeur(Transport_Marqueur_FT,"Transport_Marqueur_FT",Transport_Interfaces_FT_Disc);
33
35{
36 t_debut_integr_ = -1.;
37 t_debut_inject_ = 1.e32;
39 dt_inject_ = -1.;
40 t_debut_transfo_ = 1.e32;
42 dt_transfo_ = -1.;
43 nb_it_ = 1;
44 implicite_ = 0;
45 diametre_min_ = -1.;
46 beta_transfo_ = -1.;
47 methode_calcul_vp_ = INTERPOLEE;
48 methode_couplage_ = SUIVI;
49 phase_marquee_ = -1;
51
52}
53
54
55/*! @brief
56 *
57 * @param (Sortie& os) un flot de sortie
58 * @return (Sortie&) le flot de sortie modifie
59 */
61{
62 return os;
63}
64
65/*! @brief Lecture d'une equation sur un flot d'entree.
66 *
67 * Voir Equation_base::readOn()
68 * Exception : le bloc de lecture des conditions limites doit etre vide
69 * Conditions_limites { }
70 *
71 */
73{
75
76 if (t_debut_integr_==-1.)
78
79 if (!est_egal(dt_inject_,-1.))
80 {
81 if (est_egal(t_debut_inject_,1.e32))
84 }
85
86 if (!est_egal(dt_transfo_,-1))
87 {
88 if (est_egal(t_debut_transfo_,1.e32))
91 }
92
93 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std,probleme().equation(0));
94 const Milieu_base& mil = eq_ns.milieu();
95 if ((sub_type(Fluide_Diphasique,mil)) && (phase_marquee_==-1))
97
98 int ok_impl = 0;
99 if (implicite_==1)
100 {
101 for (auto& itr : les_sources)
102 {
103 if (sub_type(Source_Masse_Ajoutee,itr.valeur()))
104 ok_impl = 1;
105 }
106 if (!ok_impl)
107 {
108 Cerr<<"Implicite option cannot be used if there is no added weight source term."<<finl;
110 }
111 }
112
113 return is;
114}
115
116//Lecture d options specifique a l equation
117//-methode_transport : type de la methode de transport : vitesse_interpolee ou vitesse_particules
118//-methode_couplage : type de la methode de couplage : suivi ou one_way_coupling ou two_way_coupling
119//-phase_marquee : numero de la phase marquee : numero de la phase marquee (cas diphasique)
120//-injection : informations specifiques a une injection : cf lire_injection(...)
121//-transformation_bulles : informations specifiques a une transformation : cf lire_transformation(...)
122//-contribution_one_way : pour activer (1) ou desactiver (0) l effet du fluide sur les particules
123//-nb_iterations : nombre de sous pas de temps pour resoudre l equation de qdm des particules (1 par defaut)
124//-implicite : pour impliciter (1) ou non (0) le schema en temps
126{
128 param.ajouter_non_std("methode_transport",(this));
129 param.ajouter_non_std("methode_couplage",(this));
130 param.ajouter("phase_marquee",&phase_marquee_);
131 param.ajouter_non_std("injection",(this));
132 param.ajouter_non_std("transformation_bulles",(this));
133 param.ajouter("contribution_one_way",&contrib_one_way);
134 param.ajouter_condition("(value_of_contribution_one_way_eq_0)_or_(value_of_contribution_one_way_eq_1)","contribution_one_way must be set to 0 or 1");
135 param.ajouter("nb_iterations",&nb_it_);
136 param.ajouter("implicite",&implicite_);
137 param.ajouter_condition("(value_of_implicite_eq_0)_or_(value_of_implicite_eq_1)","implicite must be set to 0 or 1");
138}
139
141{
142 Motcle motlu;
143 if (mot=="methode_transport")
144 {
145 is>>motlu;
146 if (motlu=="vitesse_interpolee")
147 methode_calcul_vp_ = INTERPOLEE;
148 else if (motlu=="vitesse_particules")
149 methode_calcul_vp_ = BILAN_QDM;
150 else
151 {
152 Cerr<<"The keyword "<<motlu<<" is not recognized as a calculation method "<<finl;
153 Cerr<<"of the velocity particles."<<finl;
155 }
156 return 1;
157 }
158 else if (mot=="methode_couplage")
159 {
160 is>>motlu;
161 if (motlu=="suivi")
162 methode_couplage_ = SUIVI;
163 else if (motlu=="one_way_coupling")
164 methode_couplage_ = ONE_WAY_COUPLING;
165 else if (motlu=="two_way_coupling")
166 {
167 methode_couplage_ = TWO_WAY_COUPLING;
168 Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std,probleme().equation(0));
170 Source source_part;
171 Sources& les_sources_ns = eq_ns.sources();
172 Source& source_particule=les_sources_ns.add(source_part);
173 Cerr << "Creation of the Force Particule term for the two_way_coupling case."<< finl;
174 Nom type_so = "Two_Way_Coupling";
175 type_so += "_";
176 if (Motcle(disc)=="VEFPreP1b")
177 disc ="VEF";
178 type_so += disc;
179 Cerr<<"type_so = "<<type_so<<finl;
180 source_particule.typer_direct(type_so);
181 source_particule->associer_eqn(eq_ns);
182 Source_Reaction_Particules& so_reac = ref_cast(Source_Reaction_Particules,source_particule.valeur());
183 so_reac.associer_eq_marqueur(*this);
184 }
185 else
186 {
187 Cerr<<"The keyword "<<motlu<<" is not recognized as a fluid/particles coupling method."<<finl;
189 }
190 return 1;
191 }
192 else if (mot=="injection")
193 {
194 lire_injection(is);
195 return 1;
196 }
197 else if (mot=="transformation_bulles")
198 {
200 return 1;
201 }
202 else
204}
205
206
207/*! @brief Lecture des conditions initiales dans un flot d'entree.
208 *
209 * Le format de lecture est le suivant:
210 * {
211 * ensemble_points { } lecture de la positions des particules cf Maillage_FT_Disc::readOn
212 * [ proprietes_particules { } ] lecture des proprietes materielles des particules cf Prprietes_part_vol::readOn
213 * [ t_debut_integration value ]
214 * }
215 *
216 */
218{
219 Param param_init(que_suis_je());
220 param_init.ajouter("ensemble_points",&maillage_interface());
221 param_init.ajouter("proprietes_particules",&proprietes_particules());
222 param_init.ajouter("t_debut_integration",&t_debut_integr_);
223 param_init.lire_avec_accolades_depuis(is);
224 return is;
225}
226
227//La methode est surchargee pour ne pas avoir a lire des conditions limites
228//specifiques pour cette equation car le traitement des particules aux CL
229//depend de celles imposees a l hydraulique
231{
232 Param param_cl(que_suis_je());
233 param_cl.lire_avec_accolades_depuis(is);
234 return is;
235}
236
237//Lecture des informations specifiques a l injection
238//-ensemble_points : lecture de la positions des particules a injecter cf Maillage_FT_Disc::readOn
239//-proprietes_particules : lecture des proprietes des particules a injecter cf Prprietes_part_vol::readOn
240//-t_debut_injection : Instant de la premiere injection
241//-dt_injection : Periodique d injection
243{
245 Param param_inj(que_suis_je());
246 param_inj.ajouter("ensemble_points",&maillage_inject());
247 param_inj.ajouter("proprietes_particules",&proprietes_inject());
248 param_inj.ajouter("t_debut_injection",&t_debut_inject_);
249 param_inj.ajouter("dt_injection",&dt_inject_);
250 param_inj.lire_avec_accolades_depuis(is);
251 return is;
252}
253
254//Lecture des informations specifiques a la transformation
255//-localisation : nb_sz nom_sz1 ... (lecture des sous domaines ou sont declenchees la transformation)
256//-taille : diametre_min value ou beta_transfo value (diamtre minimum ou coefficient multiplicatif du volume de controle)
257//-t_debut_transfo : Instant de la premiere injection
258//-dt_transfo : Periodique de transformation
259//-interface : Lecture du nom de l equation d interface separant les deux phases
261{
262 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std,probleme().equation(0));
263 const Milieu_base& mil = eq_ns.milieu();
264 if (!sub_type(Fluide_Diphasique,mil))
265 {
266 Cerr<<"Transformation of bubbles into particles can be selected"<<finl;
267 Cerr<<"only for two phases calculation."<<finl;
269 }
270
272 Param param_transfo(que_suis_je());
273 param_transfo.ajouter("localisation",&nom_sz_transfo_);
274 param_transfo.ajouter("diametre_min",&diametre_min_);
275 param_transfo.ajouter("beta_transfo",&beta_transfo_);
276 param_transfo.ajouter("t_debut_transfo",&t_debut_transfo_);
277 param_transfo.ajouter("dt_transfo",&dt_transfo_);
278 param_transfo.ajouter("interface",&nom_eq_interf_,Param::REQUIRED);
279 param_transfo.lire_avec_accolades_depuis(is);
280 return is;
281}
282
283//Discretisation du champ inconnu (champ_bidon_)
285{
286 const Probleme_base& pb = get_probleme_base();
287 const Discretisation_base& discr = pb.discretisation();
288 //Discretisation d un champ inconnu bidon
289 Nom fieldname;
290 Nom suffix("_");
291 suffix += le_nom();
292 fieldname = "CHAMP_BIDON";
293 fieldname += suffix;
294 const Domaine_dis_base& un_domaine_dis = domaine_dis();
295 const double temps = schema_temps().temps_courant();
296 const int nb_valeurs_temps = schema_temps().nb_valeurs_temporelles();
297
298 discr.discretiser_champ("champ_elem", un_domaine_dis,
299 fieldname, "-",
300 1 /* composantes */, nb_valeurs_temps,
301 temps,
302 champ_bidon_);
303 champ_bidon_->associer_eqn(*this);
304
306
307 const Domaine& domaine = un_domaine_dis.domaine();
309}
310
311/*! @brief Complete la construction (initialisation) des objets : maillage_interface et proprietes_particules_
312 *
313 * maillage_inject_ et proprietes_inject_
314 *
315 */
317{
318 les_sources.completer();
319 ////le_dom_Cl_dis->completer();
320 const Domaine& domaine = le_dom_dis->domaine();
321
322 Maillage_FT_Disc& ens_points = maillage_interface();
323 ens_points.associer_domaine(domaine);
324 ens_points.generer_structure();
325 ens_points.associer_equation_transport(*this);
326
328 const ArrOfInt& som_init = ens_points.som_init_util();
330
331 Maillage_FT_Disc& ens_points_inject = maillage_inject();
332 ens_points_inject.associer_domaine(domaine);
333 ens_points_inject.generer_structure();
334 ens_points_inject.associer_equation_transport(*this);
335
337 const ArrOfInt& som_init_inject = ens_points_inject.som_init_util();
338 proprietes_inject().nettoyer(som_init_inject);
339
340 // Pas d'appel a Equation_base::completer donc:
342}
343
344
345//Initialisation de delta_v et dimensionnement de source_stockage_
346//dans le cas ou l on resoud le bila de qdm des particules
348{
349
350 if (methode_calcul_vp_==BILAN_QDM)
351 {
352 int nb_part = proprietes_particules().nb_particules();
353 int dim = Objet_U::dimension;
355 source_stockage_.resize(nb_part,dim);
356 }
357
358 return 1;
359}
360
362{
363 return champ_bidon_;
364}
365
367{
368 return champ_bidon_;
369}
370
371
372//Preparation du pas de temps pour l equataion
373//-injection et transformation
374//-dans le cas ou l on resoud le bilan de qdm des particules
375// calcul des proprietes du fluide aux positions des particules
376// calcul des sources intrevenant dans le bialn de qdm
377// actualisation de delta_v
379{
381
382 double temps = probleme().schema_temps().temps_courant();
383
384 injecter(temps);
385 transformer(temps);
386
387 if ((sup_ou_egal(temps+dt,t_debut_integr_)) || ((methode_couplage_==TWO_WAY_COUPLING) && (!contrib_one_way)))
388 {
389 if (methode_calcul_vp_==BILAN_QDM)
390 {
391 const int dim = Objet_U::dimension;
392 const int nb_particules = proprietes_particules().nb_particules();
393 const Maillage_FT_Disc& ens_points = maillage_interface();
394 DoubleTab& vitesse_p = proprietes_particules().vitesse_particules();
395 dt_p_ = dt/nb_it_;
398 source_stockage_.resize(nb_particules,dim);
399
400 for (int i=0; i<nb_it_; i++)
401 {
404 //Stockage de delta_v pour le prochain pas de temps
405 update_delta_v(0,nb_particules,ens_points,0);
407 }
408 }
409 }
410
411 return true;
412}
413
414//-Transport des particules
415//-Nettoyage : suppression des particules virtuelles et de celles sortant du domaine
421
422/*! @brief
423 *
424 */
426{
427 return 0;
428}
430{
431 return 1;
432}
433
434//Integration des trajectoires de particules
435// La methode est une version simplifiee de deplacer_maillage_ft_v_fluide(...)
436// -Interpolation du champ de vitesse de l equation de qdm ou resolution du bilan de qdm des particules
437// -Calcul du deplacement a appliquer aux particules
438// -Transport des particules en fonction du deplacement calcule
439// -Mise a jour du temps de l objet ensemble de points meme si t<t_debut_integr
440// Rq : t_debut_integr est fixe par defaut a t_init mais peut etre specifie par l utilisateur
441
443{
444 const double t_debut_integr = temps_debut_integration();
445 Maillage_FT_Disc& ens_points = maillage_interface();
446 if (sup_ou_egal(temps,t_debut_integr))
447 {
448 DoubleTab& deplacement = deplacement_som();
449 calcul_vitesse_p(deplacement);
450
451 const double delta_t = probleme_base_->schema_temps().pas_de_temps();
452 // Calcul du deplacement :
453 deplacement *= delta_t;
454
455 //preparation des tableaux contenant les proprietes volumiques
457 preparer_tableaux_avant_transport(ens_points,proprietes);
458 ens_points.transporter_simple(deplacement);
459 //update des tableaux contenant les proprietes volumiques
460 update_tableaux_apres_transport(ens_points,proprietes);
461
462 } //Fin if t_debut_integr
463
464 //Rq : La modification du temps devrait etre faite dans la mise a jour de l ensemble de points ...
465 ens_points.changer_temps(temps);
466}
467
468//Evaluation des proprietes du fluide aux positions des particules
469//vit_fluide_som_, grad_P_som_, rho_fluide_som_ et visco_dyn_fluide_som_ sont interpoles
471{
472 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std,probleme().equation(0));
473 const Champ_base& champ_vitesse = eq_ns.inconnue();
474 const Champ_base& champ_pression = eq_ns.pression();
475
476 const Solveur_Masse_base& le_solveur_masse_ns = eq_ns.solv_masse();
477 const Operateur_Grad& gradient = eq_ns.operateur_gradient();
478
479 OWN_PTR(Champ_Inc_base) champ_grad_p = eq_ns.grad_P();
480
481 gradient.calculer(champ_pression.valeurs(), champ_grad_p->valeurs());
482 le_solveur_masse_ns.appliquer(champ_grad_p->valeurs());
483 champ_grad_p->valeurs().echange_espace_virtuel();
484 DoubleTabFT tab_som;
485 const DoubleTab& pos = ens_points.sommets();
486 const ArrOfInt& elem = ens_points.sommet_elem();
487 const int nb_pos_tot = pos.dimension(0);
488 const int dim = Objet_U::dimension;
489
490 int nb_positions;
491 nb_positions=0;
492 for (int i = 0; i < nb_pos_tot; i++)
493 {
494 const int num_elem = elem[i];
495 if (num_elem >= 0)
496 {
497 nb_positions++;
498 }
499 }
500 vit_fluide_som_.resize(nb_positions, dim);
501 grad_P_som_.resize(nb_positions,dim);
502 rho_fluide_som_.resize(nb_positions);
503 visco_dyn_fluide_som_.resize(nb_positions);
504
505 calculer_vitesse_transport_interpolee(champ_vitesse,ens_points,tab_som,1);
506 nb_positions =0;
507 for (int i = 0; i < nb_pos_tot; i++)
508 {
509 if (elem[i] >= 0)
510 {
511 for (int j = 0; j < dim; j++)
512 vit_fluide_som_(nb_positions, j) = tab_som(i, j);
513 nb_positions++;
514 }
515 }
516
517 calculer_vitesse_transport_interpolee(champ_grad_p,ens_points,tab_som,1);
518 nb_positions =0;
519 for (int i = 0; i < nb_pos_tot; i++)
520 {
521 if (elem[i] >= 0)
522 {
523 for (int j = 0; j < dim; j++)
524 grad_P_som_(nb_positions, j) = tab_som(i, j);
525 nb_positions++;
526 }
527 }
528
529
530 if (sub_type(Navier_Stokes_FT_Disc,eq_ns))
531 {
532 const Milieu_base& mil = eq_ns.milieu();
533 if (sub_type(Fluide_Diphasique,mil))
534 {
535 const Fluide_Diphasique& fluide_diph = ref_cast(Fluide_Diphasique,mil);
536 const Fluide_Incompressible& fluide = fluide_diph.fluide_phase(phase_marquee_);
537 const DoubleTab& rho = fluide.masse_volumique().valeurs();
538 const DoubleTab& visco_dyn = fluide.viscosite_dynamique().valeurs();
539 rho_fluide_som_ = rho(0,0);
540 visco_dyn_fluide_som_ = visco_dyn(0,0);
541 }
542 else
543 {
544 const Fluide_base& fluide = ref_cast(Fluide_base,mil);
545 const DoubleTab& rho = fluide.masse_volumique().valeurs();
546 const DoubleTab& visco_dyn = fluide.viscosite_dynamique().valeurs();
547 rho_fluide_som_ = rho(0,0);
548 visco_dyn_fluide_som_ = visco_dyn(0,0);
549 }
550 const Navier_Stokes_FT_Disc& eq_ns_FT = ref_cast(Navier_Stokes_FT_Disc,eq_ns);
551 if (!eq_ns_FT.is_terme_gravite_rhog()
552 && eq_ns_FT.milieu().a_gravite())
553 {
554 const DoubleTab& gravite = eq_ns_FT.milieu().gravite().valeurs();
555 if (gravite.nb_dim() != 2 || gravite.dimension(1) != dimension)
556 {
557 Cerr << "Error for method calculer_proprietes_fluide_pos_particules\n";
559 }
560
561 for (int i=0; i<grad_P_som_.dimension(0); i++)
562 for (int j=0; j<grad_P_som_.dimension(1); j++)
563 grad_P_som_(i,j) += rho_fluide_som_(i)*gravite(0,j);
564
565 }
566 }
567 else
568 {
569 const Fluide_base& fluide = ref_cast(Fluide_base,eq_ns.milieu());
570 const Champ_base& champ_masse_vol = fluide.masse_volumique();
571 const Champ_base& champ_visco_dyn = fluide.viscosite_dynamique();
572
573 DoubleTab& les_positions = tableaux_positions();
574 IntVect& les_elements = vecteur_elements();
575 les_positions.resize(nb_pos_tot, dim);
576 les_elements.resize(nb_pos_tot);
577 //int i, j;
578 nb_positions = 0;
579 for (int i = 0; i < nb_pos_tot; i++)
580 {
581 const int num_elem = elem[i];
582 if (num_elem >= 0)
583 {
584 for (int j = 0; j < dim; j++)
585 les_positions(nb_positions, j) = pos(i, j);
586 les_elements(nb_positions) = num_elem;
587 nb_positions++;
588 }
589 }
590
591
592 if (sub_type(Champ_Uniforme,champ_masse_vol))
593 {
594 double rho = champ_masse_vol.valeurs()(0,0);
595 rho_fluide_som_ = rho;
596 const DoubleTab& gravite = milieu().gravite().valeurs();
597
598 //Dans le cas N_S et Fluide_Inc gradient_P contient grad(P/rho+gz) avec rho uniforme
599 //Par consequent on multiplie gradient_P par rho et on retranche rho*g
600 for (int i=0; i<grad_P_som_.dimension(0); i++)
601 for (int j=0; j<grad_P_som_.dimension(1); j++)
602 {
603 grad_P_som_(i,j) *= rho;
604 grad_P_som_(i,j) -= rho*gravite(0,j);
605 }
606 }
607 else
608 calculer_scalaire_interpole(champ_masse_vol,ens_points,rho_fluide_som_,1);
609
610 if (sub_type(Champ_Uniforme,champ_visco_dyn))
611 visco_dyn_fluide_som_ = champ_visco_dyn.valeurs()(0,0);
612 else
613 champ_visco_dyn.valeur_aux_elems(les_positions,les_elements,visco_dyn_fluide_som_);
614 }
615
616}
617
618//Appel a la methode d injection de particules si instant d injection
620{
621 if (linject(temps))
622 {
623 const Maillage_FT_Disc& maill_inject = maillage_inject();
624 const Proprietes_part_vol& propri_inject = proprietes_inject();
625 injection(maill_inject,propri_inject);
626 t_derniere_inject_ = temps;
627 }
628}
629
630//Injection de particules
631//-ajout d un esnemble de positions (et d un ensemble de proprietes si particules materielles)
632//-actualisation de delta_v pour la partie injectee
633void Transport_Marqueur_FT::injection(const Maillage_FT_Disc& maill_inject, const Proprietes_part_vol& propr_inject)
634{
635 int nb_part_deb = proprietes_particules().nb_particules();
636 ajouter_points(maill_inject);
638 int nb_part_fin = proprietes_particules().nb_particules();
639 update_delta_v(nb_part_deb,nb_part_fin,maill_inject,1);
640
641}
642
643//Suppression de particules entrant dans la phase non marquee
644//Appel a la methode de transformation si instant de transformation
646{
648
649 if (ltransfo(temps))
650 {
651 Maillage_FT_Disc maillage_transfo;
652 Proprietes_part_vol proprietes_transfo;
653 transformation(maillage_transfo,proprietes_transfo);
654 injection(maillage_transfo,proprietes_transfo);
655 t_derniere_transfo_ = temps;
656 }
657
658
659}
660
661//-Identification des groupes connexes
662//-calcul des proprietes geometriques equivalentes (positions, volumes et diametres) de ces goupes
663//-Detection des groupes a supprimer (situe dans un sous domaine specifie par utilisateur
664// ou de diametre inferieur a un diametre specifie par l utilsateur)
665//-Construction de l objet maillage (ensemble de points) et proprietes (proprietes materielles) a injecter
666//-Suppression des groupes connexes identifies a supprimer
667
669{
670 //Appel de la methode permettant de detecter les groupes connexes
671 //et de deteminer les proprietes des particules resultant de la transformation
672 const Equation_base& eq = probleme_base_->get_equation_by_name(nom_eq_interf_);
673 Transport_Interfaces_FT_Disc& eq_interf = ref_cast_non_const(Transport_Interfaces_FT_Disc,eq);
674 const Equation_base& eqn_hydraulique = probleme_base_->equation(0);
675 const Champ_base& champ_vitesse = eqn_hydraulique.inconnue();
676 DoubleTab& vitesse_p = proprietes.vitesse_particules();
677
678 IntVect num_compo;
679 const int nb_compo = eq_interf.calculer_composantes_connexes_pour_suppression(num_compo);
680
681 ArrOfDouble volumes;
682 DoubleTab positions;
683 const DoubleTab& indic = eq_interf.get_indicatrice().valeurs();
684 calcul_proprietes_geometriques(num_compo, nb_compo, indic, volumes, positions);
685 ArrOfInt flags_compos_a_supprimer;
686 detection_groupes_a_supprimer(volumes, positions, flags_compos_a_supprimer);
687 construction_ensemble_proprietes(num_compo, nb_compo, marqueurs, proprietes, flags_compos_a_supprimer, positions, volumes);
688 eq_interf.calculer_vitesse_transport_interpolee(champ_vitesse,marqueurs,vitesse_p,1);
689 eq_interf.suppression_interfaces(num_compo, flags_compos_a_supprimer);
690 // The FT mesh has been modified and its interface is no longer up-to-date.
691 // Update the indicator function :
692 eq_interf.parcourir_maillage();
694}
695
696//Suppression des particules situees dans la phase non marquee
698{
699 if ((phase_marquee_!=-1) && (nom_eq_interf_!="??"))
700 {
701 const Milieu_base& mil = probleme().equation(0).milieu();
702 if (!sub_type(Fluide_Diphasique,mil))
703 {
704 Cerr<<"Particles transformation can be activated only for a Fluide_Diphasique medium."<<finl;
706 }
707 Maillage_FT_Disc& ens_points = maillage_interface();
709 }
710}
711
712//calcul des proprietes geometriques equivalentes aux groupes connexes (positions, volumes, diametres)
713//par integration de la quantite (volume ou position) pondere par l indicatrice
714//Construction du tableau elems_pos
715//-elems_pos(el,0) contient l element dans lequel est localise le centre de gravite G
716//-elems_pos(el,1) contient un element contenu dans le groupe connexe de centre G
717//car le centre de gravite du groupe connexe peut ne pas etre contenu dans le groupe
718
720 const int nb_compo,
721 const DoubleTab& indic,
722 ArrOfDouble& volumes,
723 DoubleTab& positions)
724{
725 const Domaine_dis_base& zdis_base = domaine_dis();
726 const Domaine_VF& zvf = ref_cast(Domaine_VF,zdis_base);
727 const DoubleVect& vol_elem = zvf.volumes();
728 const DoubleTab& xp_elem = zvf.xp();
729 int nb_elem = zvf.nb_elem();
730 int dim = xp_elem.dimension(1);
731
732 volumes.resize_array(nb_compo, RESIZE_OPTIONS::NOCOPY_NOINIT);
733 positions.resize(nb_compo, dim, RESIZE_OPTIONS::NOCOPY_NOINIT);
734 volumes = 0.;
735 positions = 0.;
736
737 //Calcul du volume - du diametre - du centre de gravite pour chaque groupe connexe
738 for (int elem=0; elem<nb_elem; elem++)
739 {
740 const int num_group = num_compo(elem);
741 if (num_group>=0)
742 {
743 const double indic_phase = phase_marquee_+(1.-2*phase_marquee_)*indic(elem);
744 const double v = indic_phase * vol_elem(elem);
745 volumes[num_group] += v;
746 for (int j=0; j<dim; j++)
747 positions(num_group,j) += xp_elem(elem,j) * v;
748 }
749 }
750
751 mp_sum_for_each_item(volumes);
752 mp_sum_for_each_item(positions);
753
754 for (int num_group=0; num_group<nb_compo; num_group++)
755 {
756 const double inv_v = 1. / volumes[num_group];
757 for (int j=0; j<dim; j++)
758 positions(num_group,j) *= inv_v;
759 }
760}
761
762//Parmi l ensemble des groupes connexes identifies, on detecte ceux qui sont a supprimer
763//Les criteres de suppression retenus sont :
764// -le centre de gravite du groupe est dans un sous domaine definie par l utilisateur
765// (pour un groupe connexe donne, on parcours les sous domaines pour tester si l une d entre elles
766// contient le centre de gravite du groupe)
767// -le diametre caracteristique du groupe connexe considere est plus petit qu un diametre_min
768// defini par l utilisateur ou plus petite que beta fois le volume elementaire contenant le
769// centre de gravite du groupe (beta est specifie par l utilisateur)
770
772 const DoubleTab& positions,
773 ArrOfInt& flags_compo_a_supprimer)
774{
775 const Domaine_VF& zvf = ref_cast(Domaine_VF, domaine_dis());
776 const Domaine& domaine_geom = zvf.domaine();
777 const DoubleVect& volume_elem = zvf.volumes();
778
779 // Recherche de l'element contenant le centre de gravite de chaque composante connexe
780 const int nb_compo = volumes.size_array();
781 ArrOfInt elems;
782
783 domaine_geom.chercher_elements(positions, elems);
784
785 flags_compo_a_supprimer.resize_array(nb_compo, RESIZE_OPTIONS::NOCOPY_NOINIT);
786 flags_compo_a_supprimer = 0;
787
788 // Construction d'un tableau de flags des elements reels contenus dans les sous-domaines de destruction
789 const int nb_elem = domaine_geom.nb_elem();
790 ArrOfBit flag_sous_domaine(nb_elem);
791 flag_sous_domaine = 0;
792 {
793 const int nb_sous_domaines = nom_sz_transfo_.size();
794 for (int i_sous_domaine = 0; i_sous_domaine < nb_sous_domaines; i_sous_domaine++)
795 {
796 const Sous_Domaine& sous_domaine = domaine_geom.ss_domaine(nom_sz_transfo_[i_sous_domaine]);
797 const int nb_elem_sous_domaine = sous_domaine.nb_elem_tot();
798 for (int i = 0; i < nb_elem_sous_domaine; i++)
799 {
800 const int ielem = sous_domaine[i];
801 // La sous_domaine contient des indices d'elements virtuels
802 if (ielem < nb_elem)
803 flag_sous_domaine.setbit(sous_domaine[i]);
804 }
805 }
806 }
807
808 // Volume max d'une inclusion a supprimer (conversion du diametre min en volume)
809 const double volume_max = 4. / 3. * M_PI * pow(diametre_min_ * 0.5, 3); // 4/3*PI*R^3
810
811 for (int i = 0; i < nb_compo; i++)
812 {
813 // Test sur le centre de gravite: suppression des interfaces dont le centre de gravite
814 // est dans la sous-domaine de suppression.
815 // Attention, seul le processeur qui a le centre de gravite peut mettre le flag a 1.
816 // On synchronise les flags ensuite.
817 const int num_elem = elems[i];
818 if (num_elem >= 0 && num_elem < nb_elem)
819 {
820 // L'element est chez moi. Est-il dans la sous_domaine ?
821 if (flag_sous_domaine[num_elem])
822 {
823 // Test sur le volume:
824 // (facteur 1/6 pour compatibilite avec codage precedent.
825 // Il n'y a pas de raison particuliere, c'est comme ca)
826 const double volume_local_max = beta_transfo_ / 6. * volume_elem[num_elem];
827 const double v = volumes[i];
828 // Je remplace inf_strict par <. De toutes facons on compare maintenant les volumes pas les diametres
829 // cela change le epsilon. De plus, un test "inf_strict" n'a pas d'interet ici.
830 if (v < volume_max || v < volume_local_max)
831 flags_compo_a_supprimer[i] = 1;
832 }
833 }
834 }
835 // Synchronisation des flags entre processeurs
836 mp_max_for_each_item(flags_compo_a_supprimer);
837}
838
839//Construction de la structure maillage (ensemble de points) et proprietes (proprietes materielles) a injecter
840// en remplacement des groupes connexes
841//Pour la structure maillage : ens_points.associer_domaine(...)
842// ens_points.generer_structure(...)
843// ens_points.associer_equation_transport(...)
844
845//Pour la structure proprietes : dimensionnement remplissage des differentes proprietes
846// proprietes.fixer_nb_particules(...)
847// proprietes.completer(...)
848// proprietes.nettoyer(...)
849
851 const int nb_compo,
852 Maillage_FT_Disc& ens_points,
853 Proprietes_part_vol& propri,
854 const ArrOfInt& flags_compos_a_supprimer,
855 const DoubleTab& positions,
856 const ArrOfDouble& volumes)
857{
858 int phase_transfo = (phase_marquee_==0?1:0);
859 const Fluide_Diphasique& fluide_diph = ref_cast(Fluide_Diphasique,probleme().equation(0).milieu());
860 const DoubleTab& rho = fluide_diph.fluide_phase(phase_transfo).masse_volumique().valeurs();
861 double rho_val = rho(0,0);
862
863 const int dim = positions.dimension(1);
864
865 int size_new = 0;
866 for (int i = 0; i < nb_compo; i++)
867 if (flags_compos_a_supprimer[i])
868 size_new++;
869
870 //remplir sommets_lu et proprietes
871 const Domaine& domaine = le_dom_dis->domaine();
872 ens_points.associer_domaine(domaine);
873
874 DoubleTab& soms_tmp = ens_points.sommets_lu();
875 DoubleTab& vitesse_tmp = propri.vitesse_particules();
876 DoubleTab& temp_tmp = propri.temperature_particules();
877 DoubleTab& dv_tmp = propri.delta_v();
878 DoubleTab& mvol_tmp = propri.masse_vol_particules();
879 DoubleTab& vol_tmp = propri.volume_particules();
880 DoubleTab& diam_tmp = propri.diametre_particules();
881
882 soms_tmp.resize(size_new,dim);
883 vitesse_tmp.resize(size_new,dim);
884 dv_tmp.resize(size_new,dim);
885 temp_tmp.resize(size_new,1);
886 mvol_tmp.resize(size_new,1);
887 vol_tmp.resize(size_new,1);
888 diam_tmp.resize(size_new,1);
889
890 int compt=0;
891 for (int i = 0; i<nb_compo; i++)
892 {
893 if (flags_compos_a_supprimer[i]>0)
894 {
895 for (int j=0; j<dim; j++)
896 {
897 soms_tmp(compt,j) = positions(i,j);
898 vitesse_tmp(compt,j) = 0.;
899 dv_tmp(compt,j) = 0.;
900 }
901 temp_tmp(compt,0) = 273.;
902 mvol_tmp(compt,0) = rho_val;
903 vol_tmp(compt,0) = volumes[i];
904 diam_tmp(compt,0) = pow(volumes[i]*3./(4.*M_PI), 1./3) * 2.;
905 compt++;
906 }
907 }
908 propri.fixer_nb_particules(size_new);
909
910 ens_points.generer_structure();
911 ens_points.associer_equation_transport(*this);
912
913 propri.completer();
914 const ArrOfInt& som_init = ens_points.som_init_util();
915 propri.nettoyer(som_init);
916
917}
918
919//Calcul de la vitesse des particules vitesse_p
920//-methode_calcul_vp_==INTERPOLEE : interpolation du champ de vitesse du fluide
921//-methode_calcul_vp_==BILAN_QDM : resolution du bilan de dqm des particules
922//Calcul du deplacement = vitesse_p*dt
923
924void Transport_Marqueur_FT::calcul_vitesse_p(DoubleTab& deplacement) const
925{
926 if (methode_calcul_vp_==INTERPOLEE)
927 {
928 const Champ_base *u0_ptr = 0;
929
930 //Pour une equation de transport d interface solide, la REF refequation_vitesse_transport est vide
931 //On utilise directement l equation de N_S et non pas efequation_vitesse_transport.valeur()
932 const Equation_base& eqn_hydraulique = probleme_base_->equation(0);
933 const Champ_base& champ_vitesse = eqn_hydraulique.inconnue();
936 deplacement, 1 /* recalculer le champ de vitesse L2 */);
937
938 if (sub_type(Navier_Stokes_FT_Disc, eqn_hydraulique))
939 {
940 // On recupere le saut de vitesse a l'interface (changement de phase)
941 const Navier_Stokes_FT_Disc& ns = ref_cast(Navier_Stokes_FT_Disc, eqn_hydraulique);
942 u0_ptr = ns.get_delta_vitesse_interface();
943 if (u0_ptr)
944 {
945 const Champ_base& u0 = *u0_ptr;
946 DoubleTabFT d2(deplacement);
949 d2, 1 /* recalculer le champ de vitesse L2 */);
950 const int n = d2.dimension(0);
951 const int dim = d2.dimension(1);
952
953 for (int i = 0; i < n; i++)
954 {
955 for (int j = 0; j < dim; j++)
956 {
957 const double depl2 = d2(i,j);
958 deplacement(i,j) -= depl2;
959 }
960 }
961 }
962 }
963 }
964 else if (methode_calcul_vp_==BILAN_QDM)
965 {
966 const DoubleTab& vitesse_p = proprietes_particules().vitesse_particules();
967 deplacement = vitesse_p;
968 }
969}
970
971//Actualisation de delta_v (vitesse_p-vit_fluide_som_) pour les particules allant de n_deb a n_fin-1
972//Les proprietes du fluide sont re-estimees sur ens_points si calc=1
973
974void Transport_Marqueur_FT::update_delta_v(int n_deb,int n_fin,const Maillage_FT_Disc& ens_points,int calc)
975{
976 assert(n_fin-n_deb==ens_points.sommets().dimension(0));
977 DoubleTab& delta_vit = proprietes_particules().delta_v();
978 const DoubleTab& vitesse_p = proprietes_particules().vitesse_particules();
979 int dim = Objet_U::dimension;
980 if (mp_sum(n_fin-n_deb))
981 {
982 if (calc)
984
985 if (!implicite_)
986 {
987 for (int i=n_deb; i<n_fin; i++)
988 for (int j=0; j<dim; j++)
989 delta_vit(i,j) = vit_fluide_som_(i-n_deb,j)-vitesse_p(i,j);
990 }
991 else
992 {
993 for (int i=n_deb; i<n_fin; i++)
994 for (int j=0; j<dim; j++)
995 delta_vit(i,j) = vit_fluide_som_(i-n_deb,j);
996 }
997 }
998
999}
1000
1001//Methode de resolution du bilan de qdm des particules
1002//vitesse_p = vitesse_p + sources*dt
1003//distinction pour explicite et implicite
1004void Transport_Marqueur_FT::resoudre_edo(DoubleTab& vitesse_p, DoubleTab& une_source_stockage,const double delta_t)
1005{
1006
1007 const int nb_particules = proprietes_particules().nb_particules();
1008 const int dim = Objet_U::dimension;
1009 const DoubleTab& masse_vol_p = proprietes_particules().masse_vol_particules();
1010 const DoubleTab& volume_p = proprietes_particules().volume_particules();
1011
1012 if (!implicite_)
1013 {
1014 for (int i=0; i<nb_particules; i++)
1015 for (int j=0; j<dim; j++)
1016 vitesse_p(i,j) += (1./(masse_vol_p(i,0)*volume_p(i,0)))*contrib_one_way*source_stockage_(i,j)*delta_t;
1017 }
1018 else
1019 {
1020 for (int i=0; i<nb_particules; i++)
1021 for (int j=0; j<dim; j++)
1022 vitesse_p(i,j) += (1./((masse_vol_p(i,0)+0.5*rho_fluide_som_(i))*volume_p(i,0)))*contrib_one_way*source_stockage_(i,j)*delta_t;
1023
1024 //Evaluation du terme source en tenant compte de la partice imlplicite de la masse ajoutee
1025 for (int i=0; i<nb_particules; i++)
1026 for (int j=0; j<dim; j++)
1027 source_stockage_(i,j) -= (0.5*rho_fluide_som_(i)/(masse_vol_p(i,0)+0.5*rho_fluide_som_(i)))*source_stockage_(i,j);
1028 }
1029}
1030
1031//Modifie le champ de vitesse pour les particules situees sur un bord qui porte :
1032//une condition limite de paroi_fixe ou de symetrie pour l hydraulique
1033//La modification consiste en une reflexion du champ de vitesse (condition de rebond)
1034//Appel a appliquer_reflexion_vitesse(...)
1035
1037{
1038 const Domaine_VF& domaine_vf = ref_cast(Domaine_VF,domaine_dis());
1039 DoubleTab& vitesse_p = proprietes_particules().vitesse_particules();
1040 const Maillage_FT_Disc& maillage = maillage_interface();
1041 const DoubleTab& pos = maillage.sommets();
1042 const ArrOfInt& elem = maillage.sommet_elem();
1043 const ArrOfInt& som_face = maillage.sommet_face_bord();
1044 const int nb_pos_tot = pos.dimension(0);
1045 const int dim = Objet_U::dimension;
1046
1047 // int nb_positions;
1048 int face_bord;
1049 //nb_positions=0;
1050 double x = 0.,y= 0.,z= 0.;
1051
1052 for (int som = 0; som < nb_pos_tot; som++)
1053 {
1054 const int num_elem = elem[som];
1055 if (num_elem >= 0)
1056 {
1057 if (maillage.sommet_ligne_contact(som))
1058 {
1059 x= pos(som,0);
1060 y= pos(som,1);
1061 if (dim==3)
1062 z= pos(som,2);
1063 face_bord = som_face[som];
1064 appliquer_reflexion_vitesse(x,y,z,som,face_bord,domaine_vf,vitesse_p);
1065 }
1066 }
1067 }
1068
1069}
1070
1071//-Construction d une base de vecteur vecteur_base(0), vecteur_base(1), vecteur_base(2)
1072// ou vecteur_base(0) est normal a la face ou l on veut modifier le vecteur vitesse
1073//-Inversion du signe de la composante normale du vecteur vitesse dans cette base
1074//-Calcul des nouvelles composantes du vecteur vitesse dans la base (e0,e1,e2)
1075
1076void Transport_Marqueur_FT::appliquer_reflexion_vitesse(const double x, const double y, const double z,
1077 const int som,int& face_bord,
1078 const Domaine_VF& domaine_vf,
1079 DoubleTab& vitesse_p)
1080{
1081
1082 int dim = Objet_U::dimension;
1083 const DoubleTab& cg_faces = domaine_vf.xv();
1084 DoubleTab vecteur_base(dim,dim);
1085 DoubleVect vit_base1(dim);
1086
1087 //calcul de la norme du vecteur normal a la face vecteur_base(0)
1088 double norme = 0.;
1089 for (int j=0; j<dim; j++)
1090 norme += domaine_vf.face_normales(face_bord,j)*domaine_vf.face_normales(face_bord,j);
1091 norme = sqrt(norme);
1092 if (!est_egal(norme,0.))
1093 {
1094 for (int j=0; j<dim; j++)
1095 vecteur_base(0,j) = domaine_vf.face_normales(face_bord,j)/norme;
1096 }
1097 else
1098 {
1099 Cerr<<"Problem encountered wih the norme calculation for the method "<<finl;
1100 Cerr<<"Maillage_FT_Disc::modifier_proprietes_particules"<<finl;
1101 }
1102 //construction du premier vecteur tangentiel a la paroi vecteur_base(1)
1103 //on prend un vecteur orthogonal construit a partir du point x y z
1104 //situe sur la face et du centre de gravite de la face
1105 vecteur_base(1,0) = x-cg_faces(face_bord,0);
1106 vecteur_base(1,1) = y-cg_faces(face_bord,1);
1107 if (dim==3)
1108 vecteur_base(1,2) = z-cg_faces(face_bord,2);
1109 norme = 0.;
1110 for (int j=0; j<dim; j++)
1111 norme += vecteur_base(1,j)*vecteur_base(1,j);
1112 norme = sqrt(norme);
1113 if (!est_egal(norme,0.))
1114 {
1115 for (int j=0; j<dim; j++)
1116 vecteur_base(1,j) = vecteur_base(1,j)/norme;
1117 }
1118 else
1119 {
1120 Cerr<<"Problem encountered wih the tan1 norme calculation for the method"<<finl;
1121 Cerr<<"Maillage_FT_Disc::modifier_proprietes_particules"<<finl;
1122 }
1123 //cas dimension 3
1124 //construction du second vecteur tangentiel a la paroi vecteur_base(2)
1125 //on prend le produit vectoriel entre les deux vecteurs norm et tan1
1126 if (dim==3)
1127 {
1128 vecteur_base(2,0)=vecteur_base(0,1)*vecteur_base(1,2)-vecteur_base(0,2)*vecteur_base(1,1);
1129 vecteur_base(2,1)=vecteur_base(0,2)*vecteur_base(1,0)-vecteur_base(0,0)*vecteur_base(1,2);
1130 vecteur_base(2,2)=vecteur_base(0,0)*vecteur_base(1,1)-vecteur_base(0,1)*vecteur_base(1,0);
1131 }
1132
1133 //Calcul des composantes du vecteur vitesse dans la base vecteur_base
1134 for (int j=0; j<dim; j++)
1135 {
1136 for (int k=0; k<dim; k++)
1137 vit_base1(j) += vitesse_p(som,k)*vecteur_base(j,k);
1138
1139 }
1140
1141 //Inversion du signe de la composante normale
1142 vit_base1(0) *= -1.;
1143
1144 //Calcul des nouvelles composantes du vecteur vitesse dans la base (e0,e1,e2)
1145 for (int j=0; j<dim; j++)
1146 {
1147 vitesse_p(som,j) = 0.;
1148 for (int k=0; k<dim; k++)
1149 vitesse_p(som,j) += vit_base1(k)*vecteur_base(k,j);
1150 }
1151
1152}
1153
1154//Ajout de points a l objet maillage
1156{
1158 int skip_facettes = 1;
1159 maillage.ajouter_maillage(un_maillage_inject,skip_facettes);
1160}
1161
1162
1163//Preparation des tableaux contenant les proprietes (vitesse_p, ...)
1164//pour pouvoir assurer le passage d un sous domaine a un autre dans le cas d un calcul parallele
1166 Proprietes_part_vol& proprietes)
1167{
1168 int nb_particules = proprietes.nb_particules();
1169 if (mp_sum(nb_particules))
1170 {
1171 const Desc_Structure_FT& descripteur = maillage.desc_sommets();
1172 DoubleTab& vitesse_som = proprietes.vitesse_particules();
1173 DoubleTab& delta_vit_som = proprietes.delta_v();
1174 DoubleTab& temp_som = proprietes.temperature_particules();
1175 DoubleTab& masse_vol_som = proprietes.masse_vol_particules();
1176 DoubleTab& diametre_som = proprietes.diametre_particules();
1177 DoubleTab& volume_som = proprietes.volume_particules();
1178
1179 maillage.preparer_tableau_avant_transport(vitesse_som,descripteur);
1180 maillage.preparer_tableau_avant_transport(delta_vit_som,descripteur);
1181 maillage.preparer_tableau_avant_transport(temp_som,descripteur);
1182 maillage.preparer_tableau_avant_transport(masse_vol_som,descripteur);
1183 maillage.preparer_tableau_avant_transport(diametre_som,descripteur);
1184 maillage.preparer_tableau_avant_transport(volume_som,descripteur);
1185 }
1186}
1187
1188//Actualisation des tableaux contenant les proprietes (vitesse_p, ...)
1189//dans le cas ou une particule a change de sous domaine dans le cas d un calcul parallele
1190//Cette operation doit modifier l attribut nb_particules_ de proprietes
1191//dans le cas ou le nombre de particules a varie pour le sous domaine
1193 Proprietes_part_vol& proprietes)
1194{
1195 int nb_particules = proprietes.nb_particules();
1196 if (mp_sum(nb_particules))
1197 {
1198 const Desc_Structure_FT& descripteur = maillage.desc_sommets();
1199 int nb_som = maillage.nb_sommets();
1200 DoubleTab& vitesse_som = proprietes.vitesse_particules();
1201 DoubleTab& delta_vit_som = proprietes.delta_v();
1202 DoubleTab& temp_som = proprietes.temperature_particules();
1203 DoubleTab& masse_vol_som = proprietes.masse_vol_particules();
1204 DoubleTab& diametre_som = proprietes.diametre_particules();
1205 DoubleTab& volume_som = proprietes.volume_particules();
1206
1207 maillage.update_tableau_apres_transport(vitesse_som,nb_som,descripteur);
1208 maillage.update_tableau_apres_transport(delta_vit_som,nb_som,descripteur);
1209 maillage.update_tableau_apres_transport(temp_som,nb_som,descripteur);
1210 maillage.update_tableau_apres_transport(masse_vol_som,nb_som,descripteur);
1211 maillage.update_tableau_apres_transport(diametre_som,nb_som,descripteur);
1212 maillage.update_tableau_apres_transport(volume_som,nb_som,descripteur);
1213
1214 proprietes.fixer_nb_particules(nb_som);
1215 }
1216}
1217
1219{
1221 Noms noms_compris = champs_compris_.liste_noms_compris();
1222 noms_compris.add("densite_particules");
1223 noms_compris.add("volume_particules");
1224 if (opt==DESCRIPTION)
1225 Cerr<<" Transport_Marqueur_FT : "<< noms_compris <<finl;
1226 else
1227 nom.add(noms_compris);
1228}
1229
1231{
1233 if (motlu == "densite_particules")
1234 {
1235 if (!densite_particules_)
1236 {
1237 //const & discr = ref_cast(Discret_Thyd, discretisation());
1238 const Discretisation_base& discr = probleme().discretisation();
1239 const Domaine_dis_base& un_domaine_dis = domaine_dis();
1240 const double temps = schema_temps().temps_courant();
1241 Nom nom="densite_particules";
1242 Nom unite="sans_dimension";
1243 discr.discretiser_champ("champ_elem",un_domaine_dis,nom,unite,1,temps,densite_particules_);
1244 champs_compris_.ajoute_champ(densite_particules_.valeur());
1245 }
1246 }
1247
1248 if (motlu == "volume_particules")
1249 {
1250 if (!volume_particules_)
1251 {
1252 //const Discret_Thyd& discr = ref_cast(Discret_Thyd, discretisation());
1253 const Discretisation_base& discr = probleme().discretisation();
1254 const Domaine_dis_base& un_domaine_dis = domaine_dis();
1255 const double temps = schema_temps().temps_courant();
1256 Nom nom="volume_particules";
1257 Nom unite="sans_dimension";
1258 discr.discretiser_champ("champ_elem",un_domaine_dis,nom,unite,1,temps,volume_particules_);
1259 champs_compris_.ajoute_champ(volume_particules_.valeur());
1260 }
1261 }
1262}
1263
1265{
1266 if (nom == "densite_particules" || nom == "volume_particules")
1267 {
1268 ref_champ = Transport_Marqueur_FT::get_champ(nom);
1269 return true;
1270 }
1271
1272 if (Transport_Interfaces_FT_Disc::has_champ(nom, ref_champ))
1273 return true;
1274
1275 return false; /* rien trouve */
1276}
1277
1279{
1280 if (nom == "densite_particules" || nom == "volume_particules")
1281 return true;
1282
1284 return true;
1285
1286 return false; /* rien trouve */
1287}
1288
1290{
1291 if (nom == "densite_particules")
1292 {
1293 double temps = schema_temps().temps_courant();
1294 Champ_Fonc_base& ch_densite = ref_cast_non_const(Champ_Fonc_base, densite_particules_.valeur());
1295 DoubleTab& val_densite = ch_densite.valeurs();
1296 calculer_valeurs_densite(val_densite);
1297 ch_densite.changer_temps(temps);
1298 return champs_compris_.get_champ(nom);
1299 }
1300
1301 if (nom == "volume_particules")
1302 {
1303 double temps = schema_temps().temps_courant();
1304 Champ_Fonc_base& ch_vol = ref_cast_non_const(Champ_Fonc_base, volume_particules_.valeur());
1305 DoubleTab& val_vol = ch_vol.valeurs();
1306 calculer_valeurs_volumes(val_vol);
1307 ch_vol.changer_temps(temps);
1308 return champs_compris_.get_champ(nom);
1309 }
1310
1311 OBS_PTR(Champ_base) ref_champ;
1312
1313 if (Transport_Interfaces_FT_Disc::has_champ(nom, ref_champ))
1314 return ref_champ;
1315
1316 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
1317}
1318
1319//Calcul des valeurs du champ postraitable densite_particules_
1320//Estimation du nombre de particules par maille
1321const DoubleTab& Transport_Marqueur_FT::calculer_valeurs_densite(DoubleTab& val_densite) const
1322{
1323 const Maillage_FT_Disc& ens_points = maillage_interface();
1324 if (ens_points.type_statut())
1325 {
1326 const ArrOfInt& sommet_elem = ens_points.sommet_elem();
1327 val_densite = 0.;
1328 int nb_som = ens_points.nb_sommets();
1329 int elem;
1330 for (int som=0; som<nb_som; som++)
1331 {
1332 elem = sommet_elem[som];
1333 val_densite(elem) += 1.;
1334 }
1335 }
1336 return val_densite;
1337}
1338
1339//Calcul des valeurs du champ postraitable volume_particules_
1340//Estimation du volume occupe par les particules dans une maille
1341const DoubleTab& Transport_Marqueur_FT::calculer_valeurs_volumes(DoubleTab& val_volume) const
1342{
1343 const Maillage_FT_Disc& ens_points = maillage_interface();
1344
1345 if (ens_points.type_statut())
1346 {
1347 const ArrOfInt& sommet_elem = ens_points.sommet_elem();
1348 const Proprietes_part_vol& proprietes = proprietes_particules();
1349 const DoubleTab& volume_part = proprietes.volume_particules();
1350
1351 val_volume = 0.;
1352 int nb_som = ens_points.nb_sommets();
1353 int elem;
1354
1355 for (int som=0; som<nb_som; som++)
1356 {
1357 elem = sommet_elem[som];
1358 val_volume(elem) += volume_part(som, 0);
1359 }
1360 }
1361 return val_volume;
1362}
1363
1364// Methode de travail de remplissage d'une FloatTab par un DoubleTabFT
1365inline void remplissage(const DoubleTab& tab, DoubleTab *ftab)
1366{
1367 const int nb_noeuds = tab.dimension(0);
1368 const int nb_compo = tab.dimension(1);
1369 ftab->resize(nb_noeuds, nb_compo);
1370 for (int som=0 ; som<nb_noeuds ; som++)
1371 for (int k=0 ; k<nb_compo ; k++)
1372 (*ftab)(som,k) = tab(som,k);
1373}
1374/*! @brief Cherche le champ discret aux interfaces dont le nom est "champ", et verifie qu'il peut etre postraite a la localisation demandee (loc).
1375 *
1376 * Si oui on renvoie 1 et, si ftab est non nul, on remplit le champ ftab
1377 * avec le champ demande.
1378 * Si non, on renvoie 0.
1379 * (la fonction est appelee avec ftab=0 lors de la lecture du postraitement,
1380 * car on n'a pas besoin de la valeur du champ, on veut seulement verifier
1381 * qu'il existe).
1382 *
1383 */
1385{
1386 int res = 1;
1387
1388 const Motcle som = "sommets"; //postraitement possible uniquement aux sommets
1389 const Motcle elem = "elements"; //postraitement possible uniquement aux elements
1390 const Motcle bi = "elements et sommets"; //postraitement possible aux sommets et aux elements
1391 int nb_champs = 2;
1392 int proprietes_postraitables=1;
1393 // Condition pour postraiter les proprietes des particules
1394 // en attendant que les marqueurs aient des proprietes simples:
1395 // diametre nul
1396 // vitesse
1397 // etc...
1398 if (methode_calcul_vp_ == INTERPOLEE)
1399 proprietes_postraitables=0;
1400
1401 if (proprietes_postraitables)
1402 nb_champs+=5;
1403 Motcles les_champs(nb_champs);
1404 {
1406 les_champs[1] = "vitesse";
1407 if (proprietes_postraitables)
1408 {
1409 les_champs[2] = "delta_v";
1410 les_champs[3] = "temperature";
1411 les_champs[4] = "masse_volumique";
1412 les_champs[5] = "diametre";
1413 les_champs[6] = "volume";
1414 }
1415 }
1416 Motcles localisations(nb_champs);
1417 {
1418 localisations[0] = bi;
1419 // Pour des particules, on n'accepte que le postraitement aux sommets (1 particule=1 sommet!):
1420 for (int i=1; i<nb_champs; i++)
1421 localisations[i] = som;
1422 }
1423
1424 int rang=les_champs.search(champ);
1425
1426 if (rang==0)
1427 {
1428 Cerr<<"The real fields to be post-processed are :"<<finl;
1429 for (int i=1 ; i<nb_champs ; i++)
1430 {
1431 Cerr << " Fields("<<i<<") : "<< les_champs[i] << " # Localisations : " << localisations[i] << finl;
1432 }
1433 res = 0;
1434 }
1435 else if (rang==-1) //test champ existe ?
1436 {
1437 //champ inexistant
1438 res = 0;
1439 }
1440 else if (! (localisations[rang]==bi
1441 || (localisations[rang]==som && loc==Postraitement_base::SOMMETS)
1442 || (localisations[rang]==elem && loc==Postraitement_base::ELEMENTS)) ) //test localisation autorisee ?
1443 {
1444 //localisation non autorisee
1445 res = 0;
1446 }
1447 else
1448 {
1449 if (ftab) // Si pointeur nul : ne pas calculer la valeur du champ.
1450 switch(rang)
1451 {
1452 case 1:
1453 {
1454 if (methode_calcul_vp_ == INTERPOLEE)
1455 {
1456 DoubleTabFT vitesse;
1457 calcul_vitesse_p(vitesse);
1458 remplissage(vitesse, ftab);
1459 }
1460 else
1461 remplissage(proprietes_particules().vitesse_particules(), ftab);
1462 break;
1463 }
1464 case 2:
1465 {
1466 remplissage(proprietes_particules().delta_v(), ftab);
1467 break;
1468 }
1469 case 3:
1470 {
1471 remplissage(proprietes_particules().temperature_particules(), ftab);
1472 break;
1473 }
1474 case 4:
1475 {
1476 remplissage(proprietes_particules().masse_vol_particules(), ftab);
1477 break;
1478 }
1479 case 5:
1480 {
1481 remplissage(proprietes_particules().diametre_particules(), ftab);
1482 break;
1483 }
1484 case 6:
1485 {
1486 remplissage(proprietes_particules().volume_particules(), ftab);
1487 break;
1488 }
1489 default:
1490 Cerr << "Error for the method Transport_Marqueur_FT::get_champ_post_FT" << finl;
1491 Process::exit();
1492 }
1493 res = 1;
1494 }
1495
1496 return res;
1497}
1498/*! @brief Voir l'autre get_champ_post_FT.
1499 *
1500 * Cette fonction est specifique aux champs d'entiers.
1501 *
1502 */
1504{
1505 return 0;
1506}
void setbit(int_t i) const
Met le bit e a 1.
Definition ArrOfBit.h:73
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
Classe Champ_Inc_base.
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual double changer_temps(const double t)
Fixe le temps auquel se situe le champ.
virtual DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const
provoque une erreur ! doit etre surchargee par les classes derivees
virtual bool has_champ(const Motcle &nom, OBS_PTR(Champ_base)&ref_champ) const =0
: class Desc_Structure_FT
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
const Sous_Domaine_t & ss_domaine(int i) const
Definition Domaine.h:290
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Recherche des elements contenant les points dont les coordonnees sont specifiees.
Definition Domaine.cpp:405
int_t nb_elem() const
Definition Domaine.h:131
class Domaine_VF
Definition Domaine_VF.h:44
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
double volumes(int i) const
Definition Domaine_VF.h:113
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
void associer_domaine(const Domaine &domaine)
const DoubleTab & sommets_lu() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual void set_param(Param &titi) const override
const Nom & le_nom() const override
Renvoie le nom de l'equation.
virtual const Milieu_base & milieu() const =0
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
Sources les_sources
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void initialise_residu(int=0)
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
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.
void creer_champ(const Motcle &motlu) override
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual bool initTimeStep(double dt)
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
Champs_compris champs_compris_
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Fluide_Incompressible & fluide_phase(int la_phase) const
classe Fluide_Incompressible Cette classe represente un d'un fluide incompressible ainsi que
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
const Champ_Don_base & viscosite_dynamique() const
Definition Fluide_base.h:60
: class Maillage_FT_Disc Cette classe decrit un maillage:
void transporter_simple(const DoubleTab &deplacement)
void nettoyer_noeuds_virtuels_et_frontieres()
void preparer_tableau_avant_transport(ArrOfDouble &tableau, const Desc_Structure_FT &descripteur) const
Prepare un tableau de donnees aux sommets ou aux facettes pour conserver les valeurs apres transport.
int nb_sommets() const
renvoie le nombre de sommets (reels et virtuels) (egal a sommets().
const DoubleTab & sommets() const
renvoie le tableau des sommets (reels et virtuels) dimension(0) = nombre de sommets,
void associer_equation_transport(const Equation_base &equation) override
on remplit refequation_transport_, schema_comm_domaine_ desc_sommets_.comm_group_ et desc_facettes_....
void update_tableau_apres_transport(ArrOfDouble &tableau, int nb_elements, const Desc_Structure_FT &descripteur) const
Voir preparer_tableau_avant_transport.
int sommet_ligne_contact(int i) const
const Desc_Structure_FT & desc_sommets() const
renvoie le descripteur des sommets (espace_distant/virtuel)
virtual void ajouter_maillage(const Maillage_FT_Disc &maillage_tmp, int skip_facettes=0)
double changer_temps(double t)
return temps_physique_ = t
const ArrOfInt & som_init_util() const
return som_init_util_
void nettoyer_phase(const Nom &nom_eq, const int phase)
const ArrOfInt & sommet_face_bord() const
pour postraitement, renvoie sommet_face_bord_
const ArrOfInt & sommet_elem() const
pour postraitement, renvoie sommet_elem_
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
virtual int a_gravite() const
Renvoie 1 si la gravite a ete initialisee.
virtual const Champ_Don_base & gravite() const
Renvoie la gravite du milieu si elle a ete associe provoque une erreur sinon.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
virtual const Champ_base * get_delta_vitesse_interface() const
Si le champ de vitesse est discontinu (calcul avec changement de phase), renvoie un pointeur vers le ...
const Milieu_base & milieu() const override
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
Champ_Inc_base & grad_P()
Champ_Inc_base & pression()
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const std::string & getString() const
Definition Nom.h:92
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
Definition Param.cpp:496
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
@ REQUIRED
Definition Param.h:115
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
Definition Param.cpp:32
static const char *const demande_description
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual const Equation_base & equation(int) const =0
static void mp_max_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:196
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Definition Process.cpp:146
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe qui porte les proprietes de particules.
DoubleTab & masse_vol_particules()
void fixer_nb_particules(const int nb_part)
DoubleTab & vitesse_particules()
void nettoyer(const ArrOfInt &som_utilises)
DoubleTab & diametre_particules()
void ajouter_proprietes(const Proprietes_part_vol &proprietes_tmp)
DoubleTab & volume_particules()
DoubleTab & temperature_particules()
double temps_courant() const
Renvoie le temps courant.
double pas_temps_min() const
Renvoie le pas de temps minimum.
double temps_init() const
Renvoie le temps initial.
virtual int nb_valeurs_temporelles() const =0
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
Definition Sortie.h:52
Classe Source_Reaction_Particules Calcul du terme source a ajouter dans Navier_Stokes pour prendre en...
void associer_eq_marqueur(const Equation_base &equation)
classe Source Classe generique de la hierarchie des sources, un objet Source peut
Definition Source.h:33
void typer_direct(const Nom &)
Definition Source.cpp:41
class Sources Sources represente une liste de Source.
Definition Sources.h:31
int_t nb_elem_tot() const
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
int nb_dim() const
Definition TRUSTTab.h:199
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
void update_indicatrice_normale_distance()
Updates normals and distances to interface, then updates indicatrice.
virtual double suppression_interfaces(const IntVect &num_compo, const ArrOfInt &flags_compo_a_supprimer)
void calculer_scalaire_interpole(const Champ_base &ch_scal, const Maillage_FT_Disc &, DoubleTab &ch_scal_noeuds, int nv_calc) const
const Proprietes_part_vol & proprietes_particules() const
const Champ_base & get_indicatrice() override
getter champ variables_internes_->indicatrice_cache a partir de la position des interfaces.
Transport_Interfaces_FT_Disc()
constructeur par defaut
void discretiser() override
Discretisation des champs: - indicatrice_ : champ scalaire discretise aux elements.
const Maillage_FT_Disc & maillage_inject() const
virtual void calculer_vitesse_transport_interpolee(const Champ_base &champ_vitesse, const Maillage_FT_Disc &m, DoubleTab &vitesse_noeuds, int nv_calc) const
const Probleme_base & get_probleme_base() const
const Proprietes_part_vol & proprietes_inject() const
const Maillage_FT_Disc & maillage_interface() const
OBS_PTR(Probleme_base) probleme_base_
virtual int calculer_composantes_connexes_pour_suppression(IntVect &num_compo)
int linject(double temps) const
void creer_champ(const Motcle &motlu) override
int sauvegarder(Sortie &) const override
On sauvegarde l'inconnue, puis les sources sur un flot de sortie.
int get_champ_post_FT(const Motcle &champ, Postraitement_base::Localisation loc, DoubleTab *ftab=0) const override
Cherche le champ discret aux interfaces dont le nom est "champ", et verifie qu'il peut etre postraite...
int ltransfo(double temps) const
int reprendre(Entree &) override
On reprend l'inconnue a partir d'un flot d'entree.
Methode_couplage methode_couplage_
void mettre_a_jour(double temps) override
La valeur de l'inconnue sur le pas de temps a ete calculee.
void calcul_proprietes_geometriques(const IntVect &num_compo, const int nb_compo_glob, const DoubleTab &indic, ArrOfDouble &volumes, DoubleTab &positions)
void construction_ensemble_proprietes(const IntVect &num_compo, const int nb_compo, Maillage_FT_Disc &ens_points, Proprietes_part_vol &propri, const ArrOfInt &flags_compos_a_supprimer, const DoubleTab &positions, const ArrOfDouble &volumes)
const DoubleTab & calculer_valeurs_densite(DoubleTab &val_densite) const
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.
Entree & lire_transformation(Entree &is)
void calcul_vitesse_p(DoubleTab &deplacement) const
Entree & lire_injection(Entree &is)
const Champ_Inc_base & inconnue() const override
OWN_PTR(Champ_Fonc_base) densite_particules_
const double & temps_debut_integration() const
void completer() override
Complete la construction (initialisation) des objets : maillage_interface et proprietes_particules_.
void integrer_ensemble_lagrange(const double temps) override
void discretiser() override
Discretisation des champs: - indicatrice_ : champ scalaire discretise aux elements.
void update_tableaux_apres_transport(Maillage_FT_Disc &maillage, Proprietes_part_vol &proprietes)
int preparer_calcul() override
Tout ce qui ne depend pas des autres problemes eventuels.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void update_delta_v(int n_deb, int n_fin, const Maillage_FT_Disc &ens_points, int calc=1)
void transformation(Maillage_FT_Disc &maillage, Proprietes_part_vol &proprietes)
const Champ_base & get_champ(const Motcle &nom) const override
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
Entree & lire_cond_init(Entree &is) override
Lecture des conditions initiales dans un flot d'entree.
void calculer_proprietes_fluide_pos_particules(const Maillage_FT_Disc &ens_points)
Entree & lire_cl(Entree &) override
Lecture des conditions limites sur un flot d'entree.
const DoubleTab & calculer_valeurs_volumes(DoubleTab &val_volume) const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void ajouter_points(const Maillage_FT_Disc &maillage_inject)
void preparer_tableaux_avant_transport(Maillage_FT_Disc &maillage, Proprietes_part_vol &proprietes)
void detection_groupes_a_supprimer(const ArrOfDouble &volumes, const DoubleTab &positions, ArrOfInt &flags_compo_a_supprimer)
void resoudre_edo(DoubleTab &vitesse_p, DoubleTab &source_stockage, const double delta_t)
static void appliquer_reflexion_vitesse(const double x, const double y, const double z, const int som, int &face_bord, const Domaine_VF &domaine_vf, DoubleTab &vitesse)
void injection(const Maillage_FT_Disc &maill_inject, const Proprietes_part_vol &propr_inject)
void set_param(Param &titi) const override
Methode_calcul_vp methode_calcul_vp_