16#include <ComputeValParCompoInCell.h>
17#ifndef NUM_COMPO_INVALID
18#define NUM_COMPO_INVALID (-2000000000)
31 const IntTab& facettes =
mesh_->facettes();
32 const DoubleTab& sommets =
mesh_->sommets();
33 const ArrOfDouble& surface_facettes =
mesh_->get_update_surface_facettes();
34 const DoubleTab& normale_facettes =
mesh_->get_update_normale_facettes();
35 const ArrOfInt& compo_connexe =
mesh_->compo_connexe_facettes();
53 const int icompo = compo_connexe[fa7];
54 if (icompo == num_compo)
56 const double surface_facette = surface_facettes[fa7];
59 Vecteur3 coord_barycentre_fraction(0., 0., 0.);
60 for (
int dir = 0; dir < 3; dir++)
62 const double nx = normale_facettes(fa7, dir);
63 normale[dir] += nx * surf;
65 for (
int isom = 0; isom < 3; isom++)
68 num_som = facettes(fa7, isom);
73 for (
int dir = 0; dir < 3; dir++)
74 coord_barycentre_fraction[dir] += bary_som * sommets(num_som, dir);
76 coord_barycentre_fraction *= surf;
77 bary += coord_barycentre_fraction;
86 normale *= 1. / surface_tot;
87 bary *= 1. / surface_tot;
91 Cerr <<
" Trouble in "
92 "ComputeValParCompoInCell::calculer_normale_et_bary_element_pour_compo."
94 Cerr <<
"L'element " << elem <<
" contient des facettes de surface totale "
95 << surface_tot <<
" nulle!" << finl;
96 for (
int dir = 0; dir < 3; dir++)
98 bary[dir] = sommets(num_som, dir);
99 normale[dir] = normale_facettes(fa7, dir);
101 Cerr <<
"bary: " << bary[0] <<
" " << bary[1] <<
" " << bary[2] << finl;
102 Cerr <<
"normale: " << normale[0] <<
" " << normale[1] <<
" " << normale[2] << finl;
107 const double norm = normale[0] * normale[0] + normale[1] * normale[1] + normale[2] * normale[2];
110 Cerr <<
" Dans calculer_normale_et_bary_element_pour_compo." << finl;
111 Cerr <<
"Petite : " << count <<
" facettes dans l'element " << elem <<
". surface_tot = " << surface_tot
112 <<
"Norm**2 = " << norm << finl;
117 IJK_Field_int& nb_compo_traversante,
126 Cout <<
"Calcul moyennes de l'interface dans chaque cellule par compo" << finl;
129 nb_compo_traversante.
data() = NUM_COMPO_INVALID;
131 for (
int c = 0; c < max_authorized_nb_of_components_; c++)
134 compos_traversantes[c].data() = NUM_COMPO_INVALID;
135 surface_par_compo[c].data() = 0.;
136 for (
int compo = 0; compo < 3; compo++)
138 normale_par_compo[3 * c + compo].data() = 0.;
139 bary_par_compo[3 * c + compo].data() = 0.;
144 const int ni = ref_domaine_->get_nb_elem_local(DIRECTION_I);
145 const int nj = ref_domaine_->get_nb_elem_local(DIRECTION_J);
146 const int nk = ref_domaine_->get_nb_elem_local(DIRECTION_K);
148 ArrOfInt liste_composantes_connexes_dans_element;
149 for (
int k = 0; k < nk; k++)
150 for (
int j = 0; j < nj; j++)
151 for (
int i = 0; i < ni; i++)
154 const int elem = ref_domaine_->convert_ijk_cell_to_packed(i, j, k);
157 const int nb_compo_traversantes =
159 if (nb_compo_traversantes > max_authorized_nb_of_components_)
161 Cerr <<
"ComputeValParCompoInCell::ajouter_terme_source_interfaces. Trop de "
162 "compo connexes dans "
163 <<
"l'element " << elem <<
"[ " << i <<
" " << j <<
" " << k <<
" "
165 Cerr <<
"Augmenter la taille max_authorized_nb_of_components_." << finl;
169 nb_compo_traversante(i, j, k) = nb_compo_traversantes;
171 for (
int i_compo = 0; i_compo < nb_compo_traversantes; i_compo++)
173 const int num_compo = liste_composantes_connexes_dans_element[i_compo];
174 compos_traversantes[i_compo](i, j, k) = num_compo;
184 indic_par_compo[i_compo](i, j, k) = indic;
185 surface_par_compo[i_compo](i, j, k) = surface;
186 for (
int dir = 0; dir < 3; dir++)
188 const int idx = i_compo * 3 + dir;
189 normale_par_compo[idx](i, j, k) = normale[dir];
190 bary_par_compo[idx](i, j, k) = bary_facettes_dans_elem[dir];
209 IJK_Field_int& nb_compo_trav,
224 indicatrice_par_compo,
230 mesh_->get_update_courbure_sommets(),
234 const ArrOfDouble& val_on_sommet,
238 const ArrOfInt& compo_connexe =
mesh_->compo_connexe_facettes();
240 const IntTab& facettes =
mesh_->facettes();
241 const ArrOfDouble& surface_facettes =
mesh_->get_update_surface_facettes();
242 for (
int c = 0; c < max_authorized_nb_of_components_; c++)
243 field_par_compo[c].data() = 0.;
246 const int ni = field_par_compo[0].ni();
247 const int nj = field_par_compo[0].nj();
248 const int nk = field_par_compo[0].nk();
250 ArrOfInt liste_composantes_connexes_dans_element;
251 liste_composantes_connexes_dans_element = 0;
252 for (
int k = 0; k < nk; k++)
253 for (
int j = 0; j < nj; j++)
254 for (
int i = 0; i < ni; i++)
257 const int elem = ref_domaine_->convert_ijk_cell_to_packed(i, j, k);
258 const int nb_compo_traversantes =
261 assert(nb_compo_traversantes < max_authorized_nb_of_components_);
264 for (
int i_compo = 0; i_compo < nb_compo_traversantes; i_compo++)
266 const int num_compo = liste_composantes_connexes_dans_element[i_compo];
268 double moy_field = 0.;
272 double moy_field_fa7 = 0.;
278 const int icompo = compo_connexe[fa7];
280 if (icompo == num_compo)
282 const double surface_facette = surface_facettes[fa7];
286 for (
int isom = 0; isom < 3; isom++)
289 const int num_som = facettes(fa7, isom);
290 const double val = val_on_sommet[num_som];
295 moy_field_fa7 += bary_som * val;
297 moy_field += moy_field_fa7 * surf;
302 field_par_compo[i_compo](i, j, k) = moy_field;
311 const ArrOfDouble& val_on_sommet,
315 const ArrOfInt& compo_connexe =
mesh_->compo_connexe_facettes();
316 const ArrOfDouble& surface_facettes =
mesh_->get_update_surface_facettes();
318 const IntTab& facettes =
mesh_->facettes();
320 for (
int c = 0; c < max_authorized_nb_of_components_; c++)
321 field_par_compo[c].data() = 0.;
324 const int ni = field_par_compo[0].ni();
325 const int nj = field_par_compo[0].nj();
326 const int nk = field_par_compo[0].nk();
328 ArrOfInt liste_composantes_connexes_dans_element;
329 liste_composantes_connexes_dans_element = 0;
330 for (
int k = 0; k < nk; k++)
331 for (
int j = 0; j < nj; j++)
332 for (
int i = 0; i < ni; i++)
335 const int elem = ref_domaine_->convert_ijk_cell_to_packed(i, j, k);
336 const int nb_compo_traversantes =
339 assert(nb_compo_traversantes < max_authorized_nb_of_components_);
342 for (
int i_compo = 0; i_compo < nb_compo_traversantes; i_compo++)
344 const int num_compo = liste_composantes_connexes_dans_element[i_compo];
346 double moy_field = 0.;
351 double moy_field_fa7 = 0.;
357 const int icompo = compo_connexe[fa7];
359 if (icompo == num_compo)
361 const double surface_facette = surface_facettes[fa7];
365 for (
int isom = 0; isom < 3; isom++)
368 const int num_som = facettes(fa7, isom);
369 const double val = val_on_sommet[num_som];
374 moy_field_fa7 += bary_som * val;
377 moy_field += moy_field_fa7 * surf;
383 moy_field *= 1. / surface;
385 moy_field = moy_field_fa7;
386 field_par_compo[i_compo](i, j, k) = moy_field;
395 const ArrOfDouble& val_on_fa7,
399 const ArrOfInt& compo_connexe =
mesh_->compo_connexe_facettes();
400 const ArrOfDouble& surface_facettes =
mesh_->get_update_surface_facettes();
403 for (
int c = 0; c < max_authorized_nb_of_components_; c++)
404 field_par_compo[c].data() = 0.;
407 const int ni = field_par_compo[0].ni();
408 const int nj = field_par_compo[0].nj();
409 const int nk = field_par_compo[0].nk();
411 ArrOfInt liste_composantes_connexes_dans_element;
412 for (
int k = 0; k < nk; k++)
413 for (
int j = 0; j < nj; j++)
414 for (
int i = 0; i < ni; i++)
417 const int elem = ref_domaine_->convert_ijk_cell_to_packed(i, j, k);
418 const int nb_compo_traversantes =
421 assert(nb_compo_traversantes > max_authorized_nb_of_components_);
424 for (
int i_compo = 0; i_compo < nb_compo_traversantes; i_compo++)
426 const int num_compo = liste_composantes_connexes_dans_element[i_compo];
428 double moy_field = 0.;
439 const int icompo = compo_connexe[fa7];
440 if (icompo == num_compo)
442 const double surface_facette = surface_facettes[fa7];
444 const double moy_field_fa7 = val_on_fa7[fa7];
446 moy_field += moy_field_fa7 * surf;
451 assert(surface > 0.);
452 moy_field *= 1. / surface;
453 field_par_compo[i_compo](i, j, k) = moy_field;
462 ArrOfInt& liste_composantes_connexes_dans_element
466 const ArrOfInt& index_elem = intersections.
index_elem();
467 const ArrOfInt& compo_connexe_facettes =
mesh_->compo_connexe_facettes();
469 liste_composantes_connexes_dans_element.
resize_array(0);
472 int index_next_facette = index_elem[elem];
473 while (index_next_facette >= 0)
482 Cerr <<
"compute_list_compo_connex_in_element : elem= " << elem
483 <<
" Intersection issue du parcours : numero_facette_= " << data.
numero_facette_
496 const int nmax = liste_composantes_connexes_dans_element.
size_array();
497 for (ii = 0; ii < nmax; ii++)
499 if (liste_composantes_connexes_dans_element[ii] == compo)
504 liste_composantes_connexes_dans_element.
append_array(compo);
509 const int nb_compo_traversantes = liste_composantes_connexes_dans_element.
size_array();
510 return nb_compo_traversantes;
520 const IntTab& facettes =
mesh_->facettes();
521 const DoubleTab& sommets =
mesh_->sommets();
522 const ArrOfInt& compo_connexe =
mesh_->compo_connexe_facettes();
525 double somme_contrib = 0.;
535 const int num_compo = compo_connexe[fa7];
536 if (icompo == num_compo)
540 Vecteur3 coord_barycentre_fraction(0., 0., 0.);
541 for (
int isom = 0; isom < 3; isom++)
543 const int num_som = facettes(fa7, isom);
547 for (
int dir = 0; dir < 3; dir++)
548 coord_barycentre_fraction[dir] += bary_som * sommets(num_som, dir);
557 while (somme_contrib > 1.)
559 while (somme_contrib < 0.)
562 if (somme_contrib == 0.)
564 Cerr <<
"calculer_indicatrice ne fait rien dans la boucle while... "
570 indic = somme_contrib;
void calculer_moyennes_interface_element_pour_compo(const int num_compo, const int elem, double &surface, Vecteur3 &normale, Vecteur3 &bary) const
void calculer_moy_field_fa7_par_compo(const ArrOfDouble &val_on_fa7, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &field_par_compo) const
void calculer_valeur_par_compo(const double time, const int itstep, IJK_Field_int &nb_compo_trav, FixedVector< IJK_Field_int, max_authorized_nb_of_components_ > &compos_trav, FixedVector< IJK_Field_double, 3 *max_authorized_nb_of_components_ > &normale_par_compo, FixedVector< IJK_Field_double, 3 *max_authorized_nb_of_components_ > &bary_par_compo, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &indicatrice_par_compo, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &surface_par_compo, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &courbure_par_compo)
int compute_list_compo_connex_in_element(const int elem, ArrOfInt &liste_composantes_connexes_dans_element) const
int calculer_indic_elem_pour_compo(const int icompo, const int elem, double &indic) const
void calculer_moy_par_compo(IJK_Field_int &nb_compo_traversante, FixedVector< IJK_Field_int, max_authorized_nb_of_components_ > &compos_traversantes, FixedVector< IJK_Field_double, 3 *max_authorized_nb_of_components_ > &normale_par_compo, FixedVector< IJK_Field_double, 3 *max_authorized_nb_of_components_ > &bary_par_compo, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &indic_par_compo, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &surface_par_compo) const
void calculer_somme_field_sommet_par_compo(const ArrOfDouble &val_on_sommet, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &field_par_compo) const
const Maillage_FT_IJK * mesh_
void calculer_moy_field_sommet_par_compo(const ArrOfDouble &val_on_sommet, FixedVector< IJK_Field_double, max_authorized_nb_of_components_ > &field_par_compo) const
void echange_espace_virtuel()
void echange_espace_virtuel(int ghost)
Exchange data over "ghost" number of cells.
double contrib_volume_phase1_
double fraction_surface_intersection_
int index_facette_suivante_
: class Intersections_Elem_Facettes
const ArrOfInt & index_elem() const
Renvoie un tableau de taille domaine.
const Intersections_Elem_Facettes_Data & data_intersection(int index) const
Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index ...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)