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