16#include <Interpolation_IBM_base.h>
17#include <Source_PDF_base.h>
29 dis.
discretiser_champ(
"champ_sommets",le_dom_dis,vectoriel,c_nam,units,nb_comp,0.,solid_points_);
35 DoubleTab& the_values = ref_cast_non_const(DoubleTab, my_prep->get_champ_solid_points());
36 solid_points_->valeurs() = the_values;
42 solid_points_->affecter(solid_points_lu_);
50 DoubleTab& the_values = ref_cast_non_const(DoubleTab, my_prep->get_isNodeDirichlet());
51 dis.
discretiser_champ(
"champ_sommets",le_dom_dis,
"is_dirichlet",
"none",1,0., is_dirichlet_);
52 is_dirichlet_->valeurs() = the_values;
59 dis.
discretiser_champ(
"champ_sommets",le_dom_dis,
"is_dirichlet",
"none",1,0., is_dirichlet_);
60 is_dirichlet_->affecter(is_dirichlet_lu_);
64 if (my_source_->equation().discretisation().is_vef() && my_source_->get_imm_wall_law())
66 Cerr<<
"Interpolation_IBM_base::discretise field est_dirichlet not provided for imm. wall law with VEF discretization. Exit."<<finl;
78 DoubleTab& the_values = ref_cast_non_const(DoubleTab, my_prep->get_champ_corresp_elems());
79 dis.
discretiser_champ(
"champ_elem",le_dom_dis,
"corresp_elems",
"none",1,0., corresp_elems_);
80 corresp_elems_->valeurs() = the_values;
85 if (corresp_elems_lu_)
87 dis.
discretiser_champ(
"champ_elem",le_dom_dis,
"corresp_elems",
"none",1,0., corresp_elems_);
88 corresp_elems_->affecter(corresp_elems_lu_);
101 dis.
discretiser_champ(
"champ_sommets",le_dom_dis,
"distance_projete_solide",
"",1,0., champ_dis_proj_solid_);
102 DoubleTab& distPSArray = champ_dis_proj_solid_->valeurs();
105 dis.
discretiser_champ(
"champ_sommets",le_dom_dis,
"normal_projete_solide",
"",nb_comp,0., champ_normal_proj_solid_);
106 DoubleTab& normPSArray = champ_normal_proj_solid_->valeurs();
111 if (my_source_->get_modele().get_use_pseudo_level_set_moving_PDF())
122 dis.
discretiser_champ(
"champ_sommets",le_dom_dis,
"pseudo_level_set",
"",1,0., pseudo_level_set_);
123 DoubleTab& PSLevelStSArray = pseudo_level_set_->valeurs();
124 PSLevelStSArray = 0.;
155 DoubleTab& distance_signee = pseudo_level_set_->valeurs();
158 const DoubleTab& aire = my_source_->get_champ_aire().valeurs();
162 const Domaine& dom = le_dom_dis.
domaine();
166 IntLists elem_voisins(nb_elem_tot);
167 DoubleTab& aire_ncst = ref_cast_non_const(DoubleTab, aire);
168 bool all_elem_vois =
true;
169 my_source_->compute_NeighNode_IBM_elem(aire_ncst, elem_voisins, all_elem_vois);
171 DoubleTab& nor = champ_normal_proj_solid_->valeurs();
172 DoubleTab& d1 = champ_dis_proj_solid_->valeurs();
175 Cerr <<
"Interpolation_IBM_base::definir_pseudo_level_set : no champ_normal_proj_solid_. Exit"<< finl;
180 Cerr <<
"Interpolation_IBM_base::definir_pseudo_level_set : no champ_dis_proj_solid_. Exit"<< finl;
184 distance_signee=-99999.;
185 IntTrav deja_fait_elem(nb_elem_tot);
186 DoubleTrav nor_ref_i(nb_node_tot,dim_esp);
187 IntList to_do_cut_elem;
188 to_do_cut_elem.
vide();
190 for (
int e=0; e<nb_elem; e++)
192 if (aire(e)>0. && deja_fait_elem(e) == 0)
194 if (idebug_lset) Cerr<<
">>>>>>>>>>>>>> element racine = "<<e<<finl;
200 Cerr<<
"to_do_cut_elem after define_pseudo_level_set_for_one_cut_cell : ";
201 for (
int ip=0; ip<to_do_cut_elem.
size(); ip++) Cerr<<to_do_cut_elem[ip]<<
" ";
204 while (to_do_cut_elem.
size() != 0)
206 int elem_voi = to_do_cut_elem[0];
207 if (idebug_lset) Cerr<<
"cutted elem_voi = "<<elem_voi<<finl;
209 to_do_cut_elem.
suppr(elem_voi);
212 Cerr<<
"to_do_cut_elem after define_pseudo_level_set_for_one_cut_cell : ";
213 for (
int ip=0; ip<to_do_cut_elem.
size(); ip++) Cerr<<to_do_cut_elem[ip]<<
" ";
215 Cerr<<
"///////////////////////////////////////"<<finl;
224 DoubleTab& distance_signee = pseudo_level_set_->valeurs();
225 DoubleTab& nor = champ_normal_proj_solid_->valeurs();
226 DoubleTab& d1 = champ_dis_proj_solid_->valeurs();
230 const Domaine& dom = le_dom_dis.
domaine();
234 bool exist_ref_e =
false;
235 DoubleTrav nor_ref_e(dim_esp);
237 for (
int ilr=0; ilr<nb_som_elem; ilr++)
239 int ir = elems(elem,ilr);
241 if (distance_signee(ir) != -99999.)
243 for (
int k=0; k<dim_esp; k++) nor_ref_e(k) = nor_ref_i(ir,k);
245 if (idebug_lset) Cerr<<
" node = "<<ir;
249 if (idebug_lset) Cerr<<
" > element = "<<elem<<
" exist_ref_e = "<<int(exist_ref_e)<<finl;
252 for (
int il=0; il<nb_som_elem; il++)
254 int i = elems(elem,il);
255 if (distance_signee(i) == -99999.)
260 for (
int k=0; k<dim_esp; k++) norm += nor(i,k) * nor(i,k);
263 for (
int k=0; k<dim_esp; k++) nor_ref_e(k) = nor(i,k);
267 Cerr<<
"i = "<<i<<
" : exist_ref_e nor_ref_e = "<<int(exist_ref_e);
268 for (
int k=0; k<dim_esp; k++) Cerr<<
" "<<nor_ref_e(k);
272 else if (idebug_lset) Cerr<<
"*** i = "<<i<<
" norme = "<<norm<<finl;
277 for (
int k=0; k<dim_esp; k++) pscal += nor(i,k) * nor_ref_e(k);
278 if (abs(pscal) > 1.e-10) distance_signee(i) = d1(i) * pscal / abs(pscal);
279 for (
int k=0; k<dim_esp; k++) nor_ref_i(i,k) = nor(i,k)*distance_signee(i)/abs(distance_signee(i));
282 Cerr<<
"*** i = "<<i<<
" nor = ";
283 for (
int k=0; k<dim_esp; k++) Cerr<<
" "<<nor(i,k);
284 Cerr<<
" distance_signee = "<<distance_signee(i)<<finl;
289 Cerr<<
"Interpolation_IBM_base::definir_pseudo_level_set: no reference for the element "<<elem<<finl;
294 deja_fait_elem(elem) = 1;
303 const DoubleTab& aire = my_source_->get_champ_aire().valeurs();
306 const Domaine& dom = le_dom_dis.
domaine();
310 DoubleTab& nor = champ_normal_proj_solid_->valeurs();
311 DoubleTab& d1 = champ_dis_proj_solid_->valeurs();
312 DoubleTab& distance_signee = pseudo_level_set_->valeurs();
315 Cerr <<
"Interpolation_IBM_base::calcul_cluster_pseudo_level_set : no champ_normal_proj_solid_. Exit"<< finl;
320 Cerr <<
"Interpolation_IBM_base::calcul_cluster_pseudo_level_set : no champ_dis_proj_solid_. Exit"<< finl;
324 int nb_elem_voi = elem_voisins[elem].
size();
325 if (nb_elem_voi != 0)
327 for (
int voi=0; voi<nb_elem_voi; voi++)
329 int elem_voi = (elem_voisins[elem])[voi];
330 if (idebug_lset) Cerr<<
">>>> element of cluster = "<<elem_voi<<
" aire = "<<aire(elem_voi)<<
" deja_fait_ele = "<<deja_fait_elem(elem_voi)<<finl;
332 if (elem_voi != elem && aire(elem_voi) > 0. && deja_fait_elem(elem_voi) == 0) to_do_cut_elem.
add_if_not(elem_voi);
334 bool exist_ref_e =
false;
335 DoubleTrav nor_ref_e(dim_esp);
336 if (elem_voi != elem && deja_fait_elem(elem_voi) == 0 && aire(elem_voi) <= 0.)
339 for (
int ilr=0; ilr<nb_som_elem; ilr++)
341 int ir = elems(elem_voi,ilr);
343 if (distance_signee(ir) != -99999.)
345 for (
int k=0; k<dim_esp; k++) nor_ref_e(k) = nor_ref_i(ir,k);
347 if (idebug_lset) Cerr<<
" node = "<<ir;
353 Cerr<<
" > exist_ref_e = "<<int(exist_ref_e)<<
" nor_ref_e =";
354 for (
int k=0; k<dim_esp; k++) Cerr<<
" "<<nor_ref_e(k);
360 Cerr<<
"Interpolation_IBM_base::definir_pseudo_level_set: no reference for the element "<<elem_voi<<finl;
364 for (
int il_v=0; il_v<nb_som_elem; il_v++)
366 int i_v = elems(elem_voi,il_v);
367 if (distance_signee(i_v) == -99999.)
370 for (
int k=0; k<dim_esp; k++) pscal += nor(i_v,k) * nor_ref_e(k);
371 if (abs(pscal) > 1.e-10) distance_signee(i_v) = d1(i_v) * pscal / abs(pscal);
372 for (
int k=0; k<dim_esp; k++) nor_ref_i(i_v,k) = nor(i_v,k)*distance_signee(i_v)/abs(distance_signee(i_v));
375 Cerr<<
"*** i_v = "<<i_v<<
" nor = ";
376 for (
int k=0; k<dim_esp; k++) Cerr<<
" "<<nor(i_v,k);
377 Cerr<<
" distance_signee = "<<distance_signee(i_v)<<finl;
381 deja_fait_elem(elem_voi) = 1;
390 const DoubleTab& solid_points = solid_points_->valeurs();
393 Cerr <<
"Interpolation_IBM_base::maj_normal_proj_solid : no solid projection. Exit"<< finl;
398 assert (solid_points.
dimension(1) == dim_esp);
401 const Domaine& dom = le_dom_dis.
domaine();
407 const DoubleTab& aire = my_source_->get_champ_aire().valeurs();
410 IntLists elem_voisins(nb_elem_tot);
411 DoubleTab& aire_ncst = ref_cast_non_const(DoubleTab, aire);
412 bool all_elem_vois =
true;
413 my_source_->compute_NeighNode_IBM_elem(aire_ncst, elem_voisins, all_elem_vois);
415 DoubleTab& nor = champ_normal_proj_solid_->valeurs();
417 DoubleTab& d1 = champ_dis_proj_solid_->valeurs();
418 IntTrav deja_fait_vert(nb_node_tot);
420 for (
int e=0; e<nb_elem; e++)
425 for (
int il=0; il<nb_som_elem; il++)
428 if (deja_fait_vert(i) == 0)
431 for (
int k=0; k<dim_esp; k++)
433 double xk = dom.
coord(i,k);
434 double xks = solid_points(i,k);
435 nor(i, k) = xk - xks;
436 d1(i) += (xk-xks)*(xk-xks);
440 for (
int k=0; k<dim_esp; k++) nor(i, k) /= d1(i) ;
441 deja_fait_vert(i) = 1;
445 int nb_elem_voi = elem_voisins[e].
size();
446 for (
int voi=0; voi<nb_elem_voi; voi++)
448 int elem_voi = (elem_voisins[e])[voi];
449 for (
int il_v=0; il_v<nb_som_elem; il_v++)
451 int i_v = elems(elem_voi,il_v);
452 if (deja_fait_vert(i_v) == 0)
455 for (
int k=0; k<dim_esp; k++)
457 double xk = dom.
coord(i_v,k);
458 double xks = solid_points(i_v,k);
459 nor(i_v, k) = xk - xks;
460 d1(i_v) += (xk-xks)*(xk-xks);
462 d1(i_v) = sqrt(d1(i_v));
464 for (
int k=0; k<dim_esp; k++) nor(i_v, k) /= d1(i_v) ;
465 deja_fait_vert(i_v) = 1;
483 Cerr<<
"Interpolation_IBM_base::set_fields_from_prepro_to_interp field est_dirichlet not provided. Exit."<<finl;
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
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() const
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
double coord(int_t i, int j) const
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
void set_param(Param &) const override
virtual void set_fields_from_prepro_to_interp(Prepro_IBM_base &)
void calculer_normal_et_distance_proj_solid()
virtual void discretise(const Discretisation_base &, Domaine_dis_base &)
void define_pseudo_level_set_for_one_cut_cell(IntLists &, int, IntTab &, DoubleTab &, IntList &, int)
OBS_PTR(Source_PDF_base) my_source_
virtual void discretise_PDF_mobile(const Discretisation_base &, Domaine_dis_base &)
void calcul_cluster_pseudo_level_set(IntLists &, int, IntTab &, DoubleTab &, IntList &, int)
bool is_dirichlet_from_prepro_
bool solid_points_from_prepro_
virtual void discretise_pseudo_level_set(const Discretisation_base &, Domaine_dis_base &)
bool corresp_elems_from_prepro_
void definir_pseudo_level_set()
Un tableau de chaine de caracteres (VECT(Nom)).
classe Objet_U Cette classe est la classe de base des Objets de TRUST
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
const DoubleTab & get_isNodeDirichlet()
const DoubleTab & get_champ_solid_points()
const DoubleTab & get_champ_corresp_elems()
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Equation_base & equation(int) const =0
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ size_array() const
TRUSTList & add_if_not(_TYPE_)
Ajout d'un element a la liste ssi il n'existe pas deja.
void suppr(_TYPE_)
Supprime un element contenu dans la liste.
void vide()
Vide la liste.
_SIZE_ dimension(int d) const