16#include <Maillage_FT_IJK.h>
19#include <IJK_Lata_writer.h>
22#include <communications.h>
23#include <TRUSTTabFT.h>
24#include <Comm_Group.h>
25#include <Perf_counters.h>
27#include <TRUSTArrays.h>
28#include <Array_tools.h>
29#include <Domaine_IJK.h>
36#include <Remaillage_FT_IJK.h>
37#include <IJK_communications.h>
38#include <Operator_FT_Disc.h>
53 param.lire_avec_accolades(is);
77 const DoubleTab& deplacement,
78 ArrOfInt& liste_sommets_sortis,
79 ArrOfInt& numero_face_sortie,
int skip_facettes)
87 VECT(ArrOfInt) slice_offsets(3);
88 Int3 my_slice, my_new_slice;
90 for (
int i = 0; i < 3; i++)
92 ref_domaine_->get_slice_offsets(i, slice_offsets[i]);
95 const int n = slice_offsets[i].size_array();
96 slice_offsets[i].resize_array(n+1);
98 my_slice[i] = ref_domaine_->get_local_slice_index(i);
104 const int nb_som = liste_sommets.
size_array();
105 ArrOfInt liste_processeurs_destination;
106 ArrOfInt send_pe_list;
108 int max_voisinage = 0;
127 double longueur_cara_fa7 = 0.;
129 for (
int fa = 0; fa < Sfa7.
size_array(); fa++)
131 longueur_cara_fa7 += Sfa7(fa);
138 longueur_cara_fa7 /= n ;
139 longueur_cara_fa7 = std::sqrt(longueur_cara_fa7);
144 DoubleTab liste_sommets_avant_deplacement(nb_som, 3);
145 DoubleTab liste_sommets_apres_deplacement(nb_som, 3);
146 ArrOfInt compo_connexe_sommets_deplace(nb_som);
150 for (
int i_sommet = 0; i_sommet < nb_som; i_sommet++)
152 const int num_sommet = liste_sommets[i_sommet];
155 liste_sommets_avant_deplacement(i_sommet, 0) = pos[0];
156 liste_sommets_avant_deplacement(i_sommet, 1) = pos[1];
157 liste_sommets_avant_deplacement(i_sommet, 2) = pos[2];
159 liste_sommets_apres_deplacement(i_sommet, 0) = pos[0];
160 liste_sommets_apres_deplacement(i_sommet, 1) = pos[1];
161 liste_sommets_apres_deplacement(i_sommet, 2) = pos[2];
162 compo_connexe_sommets_deplace(i_sommet) = compo_connexe_sommet(num_sommet);
165 surfactant.
completer_compo_connexe_partielle(*
this, ref_domaine_.valeur(), liste_sommets_apres_deplacement, liste_sommets_avant_deplacement, compo_connexe_sommets_deplace);
170 int nb_facettes_compo_complete = facettes_sommets_full_compo.
dimension(0);
171 int nbsom_compo_complete = liste_sommets_et_deplacements_full_compo.
dimension(0);
174 for (
int indice_sommet_unsorted = 0; indice_sommet_unsorted < nbsom_compo_complete; indice_sommet_unsorted++)
176 int indice_sommet = sorted_index(indice_sommet_unsorted);
177 Vecteur3 pos(liste_sommets_et_deplacements_full_compo(indice_sommet,0),liste_sommets_et_deplacements_full_compo(indice_sommet,1),liste_sommets_et_deplacements_full_compo(indice_sommet,2));
178 Vecteur3 pos_apres_dep(liste_sommets_et_deplacements_full_compo(indice_sommet,3),liste_sommets_et_deplacements_full_compo(indice_sommet,4),liste_sommets_et_deplacements_full_compo(indice_sommet,5));
179 int deplacement_residuel = 0;
180 Point3D dep = {pos_apres_dep[0]-pos[0],pos_apres_dep[1]-pos[1],pos_apres_dep[2]-pos[2]};
183 deplacement_residuel = 1;
186 if(!deplacement_residuel)
188 for (
int fa = 0; fa < nb_facettes_compo_complete; fa++)
190 for (
int somfa7 = 0; somfa7 < 3; somfa7++)
192 double sx = facettes_sommets_full_compo(fa, 3*somfa7+0);
193 double sy = facettes_sommets_full_compo(fa, 3*somfa7+1);
194 double sz = facettes_sommets_full_compo(fa, 3*somfa7+2);
196 Point3D p2 = {pos[0],pos[1],pos[2]};
199 sx = facettes_sommets_full_compo(fa, 0);
200 sy = facettes_sommets_full_compo(fa, 1);
201 sz = facettes_sommets_full_compo(fa, 2);
203 sx = facettes_sommets_full_compo(fa, 3);
204 sy = facettes_sommets_full_compo(fa, 4);
205 sz = facettes_sommets_full_compo(fa, 5);
207 sx = facettes_sommets_full_compo(fa, 6);
208 sy = facettes_sommets_full_compo(fa, 7);
209 sz = facettes_sommets_full_compo(fa, 8);
212 if (!(s0 == s1 or s1 == s2 or s0 == s2))
219 for (
int dir = 0; dir < 3; dir++)
220 facettes_sommets_full_compo(fa, 3*somfa7+dir)=pos_apres_dep[dir];
221 facettes_sommets_full_compo(fa, 12)=n_apres_dep.
x;
222 facettes_sommets_full_compo(fa, 13)=n_apres_dep.
y;
223 facettes_sommets_full_compo(fa, 14)=n_apres_dep.
z;
238 for (
int i_sommet = 0; i_sommet < nb_som; i_sommet++)
241 const int num_sommet = liste_sommets[i_sommet];
244 Cerr <<
"Erreur dans Maillage_FT_IJK::deplacer_sommets: \n"
245 <<
" le sommet "<<num_sommet<<
"est dans la liste a deplacer et est virtuel" << finl;
258 for (
int direction = 0; direction < 3; direction++)
260 double coord = pos[direction];
261 int i_maille = ijk_pos[direction] + ref_domaine_->get_offset_local(direction);
262 const ArrOfDouble& coord_noeuds = ref_domaine_->get_node_coordinates(direction);
263 const int derniere_maille = coord_noeuds.
size_array() - 2;
265 while (coord_noeuds[i_maille+1] < coord)
268 if (i_maille == derniere_maille)
271 coord = coord_noeuds[derniere_maille + 1];
277 while (coord_noeuds[i_maille] > coord)
283 coord = coord_noeuds[0];
289 sommets_(num_sommet,direction) = coord;
291 int current_slice = my_slice[direction];
292 while (i_maille >= slice_offsets[direction][current_slice+1])
296 while (i_maille < slice_offsets[direction][current_slice])
300 my_new_slice[direction] = current_slice;
301 ijk_pos[direction] = i_maille - slice_offsets[direction][current_slice];
305 Int3 nbmailles_euler_in_new_slice;
306 for (
int direction = 0; direction < 3; direction++)
308 int new_slice = my_new_slice[direction];
309 nbmailles_euler_in_new_slice[direction] = slice_offsets[direction][new_slice+1] - slice_offsets[direction][new_slice] ;
311 assert(!( (my_slice[direction] == my_new_slice[direction]) &&
312 (nbmailles_euler_in_new_slice[direction] != ref_domaine_->get_nb_elem_local(direction))));
318 assert((ijk_pos[0] < 0 && ijk_pos[1] < 0 && ijk_pos[2] < 0)
319 || (ijk_pos[0] >= 0 && ijk_pos[0] < nbmailles_euler_in_new_slice[0]
320 && ijk_pos[1] >= 0 && ijk_pos[1] < nbmailles_euler_in_new_slice[1]
321 && ijk_pos[2] >= 0 && ijk_pos[2] < nbmailles_euler_in_new_slice[2]));
324 int new_processor = ref_domaine_->get_processor_by_ijk(my_new_slice[0],my_new_slice[1],my_new_slice[2]);
325 if (new_processor != my_processor)
330 liste_processeurs_destination.
append_array(new_processor);
331 if (drapeau_processeur_destination[new_processor] == 0)
334 drapeau_processeur_destination[new_processor] = 1;
346 if ((new_processor != my_processor)
352 const int i = ijk_pos[0];
353 const int j = ijk_pos[1];
354 const int k = ijk_pos[2];
355 assert((i < 0 && j < 0 && k < 0)
356 || (i >= 0 && i < nbmailles_euler_in_new_slice[0]
357 && j >= 0 && j < nbmailles_euler_in_new_slice[1]
358 && k >= 0 && k < nbmailles_euler_in_new_slice[2] ));
362 sommet_elem_[num_sommet]= (k * nbmailles_euler_in_new_slice[1] + j) * nbmailles_euler_in_new_slice[0] + i;
371 ArrOfInt recv_pe_list;
372 if (max_voisinage == 0)
376 else if (max_voisinage == 1)
382 else if (max_voisinage == 2)
388 else if (max_voisinage == 3)
398 reverse_send_recv_pe_list(send_pe_list, recv_pe_list);
403 if (max_voisinage > 0)
418 const int nechange = liste_sommets_sortis.
size_array();
419 for (
int i = 0; i < nechange; i++)
421 const int sommet = liste_sommets_sortis[i];
422 const int pe_destination = liste_processeurs_destination[i];
440 const int nsommets =
sommets_.dimension(0);
441 const int moi =
me();
442 for (
int i = 0; i < nsommets; i++)
460 const char *geometryname)
462 Cerr <<
"Maillage_FT_IJK::lire_maillage_ft_dans_lata fichier " << filename_with_path <<
" tstep=" << tstep
463 <<
" geom=" << geometryname << finl;
468 split_path_filename(filename_with_path, path, dbname);
473 for (
int j = 0; j < 3; j++)
474 origine[j] = ref_domaine_->get_origin(j);
480 db.read_master_file(path, filename_with_path);
482 const LataDBField& db_som = db.get_field(tstep, geometryname,
"SOMMETS",
"");
483 db.read_data(db_som, coord);
484 const LataDBField& db_elem = db.get_field(tstep, geometryname,
"ELEMENTS",
"");
488 if (!db.field_exists(tstep, geometryname,
"COMPO_CONNEXE"))
490 Cerr <<
"Erreur a la reprise d'une interface ft dans le fichier lata " << filename_with_path
491 <<
":\n Le champ COMPO_CONNEXE est absent." << finl;
494 const LataDBField& db_field = db.get_field(tstep, geometryname,
"COMPO_CONNEXE",
"ELEM");
496 db.read_data(db_field, tmp);
505 db.read_data(db_elem, tmp_fac);
507 assert(tmp_fac.
nb_dim() == 2);
517 if (db.field_exists(tstep, geometryname,
"INDEX_SOMMET_REEL"))
519 const LataDBField& db_index_sommet_reel = db.get_field(tstep, geometryname,
"INDEX_SOMMET_REEL",
"");
522 db.read_data(db_index_sommet_reel, big_idx);
524 assert(big_idx.
nb_dim() == 2);
529 const ArrOfInt& index_sommet_reel = index_sommet_reel_tab;
532 const int nb_facettes_tot =
facettes_.dimension(0);
535 for (
int i = 0; i < nb_facettes_tot; i++)
539 const int i_som0_renum = index_sommet_reel[i_som0];
540 if (i_som0 == i_som0_renum)
543 for (
int j = 0; j < 3; j++)
546 const int i_som_renum = index_sommet_reel[i_sommet];
554 Journal() <<
" Renumerotation des facettes ft relues: " << nb_facettes_tot
555 <<
" facettes lues, " << idest <<
" facettes reelles conservees" << finl;
562 Journal() <<
" Pas de champ INDEX_SOMMET_REEL, on suppose qu'il n'y a pas de sommet virtuel" << finl;
565 if (nbSom0 > std::numeric_limits<int>::max())
566 Process::exit(
"The FT mesh has too many vertices (>32b) - this is not implemented yet!!");
567 nbsom =
static_cast<int>(nbSom0);
568 Cerr <<
"Le maillage a nbsom=" << nbsom <<
" (avant suppression des sommets virtuels lus)" << finl;
577 ijk[0] = ijk[1] = ijk[2] = 0;
579 for (i = 0; i < nbsom; i++)
581 for (
int j = 0; j < 3; j++)
588 const int nbelem=
facettes_.dimension(0);
589 Cerr <<
"Le maillage a nbelem=" << nbelem << finl;
591 for (i = 0; i < nbelem; i++)
616 DoubleTab liste_sommets_recus;
617 DoubleTab liste_coord_recues;
618 IntTab liste_facettes_recues;
619 ArrOfInt liste_compo_connexe_facettes_recues;
626 Cerr <<
"We read " << nb_bubbles <<
" (real) bubbles on master proc and will redistribute them on procs." << finl;
627 VECT(DoubleTab) liste_sommets(nbproc);
628 VECT(DoubleTab) liste_coord(nbproc);
629 VECT(IntTab) liste_facettes(nbproc);
630 VECT(ArrOfInt) liste_compo_connexe_facettes(nbproc);
631 for(
int p=0; p<nbproc; p++)
633 liste_sommets[p].resize(0,3);
634 liste_coord[p].resize(0,3);
635 liste_facettes[p].resize(0,3);
636 liste_compo_connexe_facettes[p].resize_array(0);
639 const int nbelem=
facettes_.dimension(0);
640 ArrOfInt dest_proc_sommets(nbsom);
641 ArrOfInt sommets_renum(nbsom);
642 for (
int i = 0; i < nbelem; i++)
646 int new_owner = icompo % nbproc;
647 for (
int j = 0; j < 3; j++)
650 dest_proc_sommets[i_som] = new_owner;
653 liste_compo_connexe_facettes[new_owner].append_array(icompo);
656 for (
int i = 0; i < nbsom; i++)
658 const int new_owner = dest_proc_sommets[i];
659 sommets_renum[i] = liste_sommets[new_owner].
dimension(0);
661 liste_coord[new_owner].append_line(coord(i,0),coord(i,1),coord(i,2));
664 for (
int p=0; p< nbproc; p++)
666 const int nb_facettes_loc = liste_facettes[p].dimension(0);
667 for (
int i = 0; i < nb_facettes_loc; i++)
668 for (
int j=0; j<3; j++)
670 const int old_isom = liste_facettes[p](i,j);
671 const int new_isom = sommets_renum[old_isom];
672 liste_facettes[p](i,j) = new_isom;
680 for(
int p=0; p<nbproc; p++)
682 sum_nbsom += liste_sommets[p].dimension(0);
683 sum_nbelem +=liste_facettes[p].dimension(0);
685 if (sum_nbsom != nbsom)
687 Cerr <<
"Some Front sommets have been lost!" << finl;
690 if (sum_nbelem != nbelem)
692 Cerr <<
"Some Front facettes have been lost!" << finl;
698 Cerr <<
"Master starts sending packages..." << finl;
700 for(
int p=1; p<nbproc; p++)
703 envoyer(liste_sommets[p],0,p,2000+4*p);
704 envoyer(liste_facettes[p],0,p,2000+4*p+1);
705 envoyer(liste_compo_connexe_facettes[p],0,p,2000+4*p+2);
706 envoyer(liste_coord[p],0,p,2000+4*p+3);
708 Cerr <<
"Master is done sending packages..." << finl;
711 liste_sommets_recus = liste_sommets[0];
712 liste_facettes_recues = liste_facettes[0];
713 liste_compo_connexe_facettes_recues = liste_compo_connexe_facettes[0];
714 liste_coord_recues = liste_coord[0];
718 Journal() <<
"Receiving from master..." << finl;
721 recevoir(liste_sommets_recus,0,p,2000+4*p);
722 recevoir(liste_facettes_recues,0,p,2000+4*p+1 );
723 recevoir(liste_compo_connexe_facettes_recues,0,p,2000+4*p+2);
724 recevoir(liste_coord_recues,0,p,2000+4*p+3);
725 Journal() <<
"All data recieved..." << finl;
733 const int nbelem = liste_facettes_recues.
dimension(0);
734 assert(liste_compo_connexe_facettes_recues.
size_array() == nbelem);
740 for (
int i=0; i< nbelem; i++)
742 for (
int j = 0; j < 3; j++)
743 facettes_(i,j) = liste_facettes_recues(i,j);
754 for (
int i = 0; i < nbsom; i++)
770 DoubleTab deplacement(nbsom,3);
771 for (
int i = 0; i < nbsom; i++)
773 for (
int j = 0; j < 3; j++)
774 deplacement(i,j) = liste_coord_recues(i,j) - origine[j];
837 int facette_avant_transport = -1 ;
841 Point3D p2 = {(
sommets_(
facettes_(i,0),0)+
sommets_(
facettes_(i,1),0)+
sommets_(
facettes_(i,2),0))/3., (
sommets_(
facettes_(i,0),1)+
sommets_(
facettes_(i,1),1)+
sommets_(
facettes_(i,2),1))/3., (
sommets_(
facettes_(i,0),2)+
sommets_(
facettes_(i,1),2)+
sommets_(
facettes_(i,2),2))/3.};
844 facette_avant_transport = j;
848 if (facette_avant_transport!=-1)
881 const int nb_fa7 =
facettes_.dimension(0);
886 for (
int i = 0; i < nb_fa7; i++)
890 if (!invalide && !virtuelle)
900 for (
int i = 0; i < nb_fa7; i++)
904 if (!invalide && !virtuelle)
920 const ArrOfInt& liste_facettes_pe,
921 const ArrOfInt& facettes_send_pe_list,
922 const ArrOfInt& facettes_recv_pe_list)
927 facettes_send_pe_list,
928 facettes_recv_pe_list);
949 int npx = ref_domaine_->get_nprocessor_per_direction(0);
950 int npy = ref_domaine_->get_nprocessor_per_direction(1);
951 int npz = ref_domaine_->get_nprocessor_per_direction(2);
955 Int3 my_ijk, voisin_ijk;
956 for (
int i = 0; i < 3; i++)
957 my_ijk[i] = ref_domaine_->get_local_slice_index(i);
959 for (
int i = -1; i< 2; i++)
961 for (
int j = -1; j< 2; j++)
963 for (
int k = -1; k< 2; k++)
969 if (voisin_ijk[0] >=0 && voisin_ijk[0]<npx &&
970 voisin_ijk[1] >=0 && voisin_ijk[1]<npy &&
971 voisin_ijk[2] >=0 && voisin_ijk[2]<npz )
973 int rang_voisin = ref_domaine_->get_processor_by_ijk(voisin_ijk[0],voisin_ijk[1],voisin_ijk[2]);
974 int max_voisinage = abs(i)+abs(j)+abs(k);
976 if (max_voisinage == 0)
980 else if (max_voisinage == 1)
986 else if (max_voisinage == 2)
991 else if (max_voisinage == 3)
1020 Journal() <<
"Erreur Maillage_FT_IJK::check_mesh : taille de compo_connexe_facettes_ invalide" << finl;
1027 Journal() <<
"Erreur Maillage_FT_IJK::check_mesh : taille de Surfactant_facettes_ invalide" << finl;
1038 const double invalid_value = DMAXFLOAT*0.9;
1047 ok = ok && (
desc_sommets_.espace_virtuel().pe_voisins().size_array() == 0);
1048 ok = ok && (
desc_sommets_.espace_distant().pe_voisins().size_array() == 0);
1049 if (!ok && error_is_fatal)
1051 Journal() <<
"Erreur Maillage_FT_Disc::check_sommets : maillage RESET invalide" << finl;
1059 const int nsom =
sommets_.dimension(0);
1071 ArrOfIntFT pe_owner(nsom);
1074 for (som = 0; som < nsom; som++)
1087 Cerr <<
"Erreur Verification de sommet_PE_owner_" << finl;
1093 Journal() <<
"Erreur sommet_num_owner_.size_array() != nb_sommets" << finl;
1100 ArrOfIntFT num_owner(nsom);
1101 for (
int i = 0; i < nsom; i++)
1104 for (
int i = 0; i < nsom; i++)
1108 Journal() <<
"Erreur num_owner[" << i <<
"] = " << num_owner[i];
1120 DoubleTabFT copie_sommets =
sommets_;
1125 const ArrOfInt& pe_voisins = espace_virtuel.
pe_voisins();
1126 const int nb_pe_voisins = pe_voisins.
size_array();
1127 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
1129 const int pe = pe_voisins[indice_pe];
1130 const ArrOfInt& elements = espace_virtuel.
elements(pe);
1132 for (
int i = 0; i < n; i++)
1134 const int num_sommet = elements[i];
1135 copie_sommets(num_sommet, 0) = invalid_value;
1136 copie_sommets(num_sommet, 1) = invalid_value;
1137 copie_sommets(num_sommet, 2) = invalid_value;
1143 for (
int i = 0; i < nsom; i++)
1147 if (copie_sommets(i,j) == invalid_value)
1149 Journal() <<
"Erreur copie_sommets(" << i <<
",";
1150 Journal() << j <<
") == DMAX_FLOAT" << finl;
1157 if (copie_sommets(i,j) !=
sommets_(i,j))
1159 Journal() <<
"Erreur copie_sommets(" << i <<
",";
1160 Journal() << j <<
") = " << copie_sommets(i,j);
1176 Journal() <<
"Erreur sommet_elem_.size_array() != nb_sommets" << finl;
1185 const ArrOfInt& pe_voisins = espace_virtuel.
pe_voisins();
1186 const int nb_pe_voisins = pe_voisins.
size_array();
1187 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
1189 const int pe = pe_voisins[indice_pe];
1190 const ArrOfInt& elements = espace_virtuel.
elements(pe);
1192 for (
int i = 0; i < n; i++)
1194 const int num_sommet = elements[i];
1198 <<
" Il devrait etre negatif car le sommet est virtuel" << finl;
1216 const int nb_fa7 =
facettes_.dimension(0);
1218 compo_connexe_sommets.
resize_array(nbsom, RESIZE_OPTIONS::NOCOPY_NOINIT);
1219 compo_connexe_sommets = -10000000;
1221 for (
int i = 0; i < nb_fa7; i++)
1224 for (
int j = 0; j < 3; j++)
1227 compo_connexe_sommets[i_som] = icompo;
1253 DoubleTab interfacial_source_term ;
1254 if (compute_interfacial_source)
1257 ArrOfDouble sigma_facettes;
1258 sigma_facettes.
resize(nbfa7);
1259 for (
int fa=0 ; fa<nbfa7 ; fa++)
1260 sigma_facettes[fa]= sigma_const;
1265 return interfacial_source_term ;
1269 DoubleTab interfacial_source_term ;
1270 Cerr <<
"No surfactant nor tryggvason formulation for interfacial source term --> we must not be here ! " << finl;
1272 return interfacial_source_term ;
1282 Cerr <<
"Methode Maillage_FT_IJK::recopie_force_compo inusite jusqu'a present"
1283 <<
" donc a tester! " << finl;
1288 for (
int i_facette = 0; i_facette < nf; i_facette++)
1317 Cerr <<
"Maillage_FT_IJK::recopie_maillage : cette surcharge s'attend a "
1318 <<
"recevoir un Maillage_FT_IJK" << finl;
1334 Cerr <<
"Maillage_FT_IJK::ajouter_maillage : cette surcharge s'attend a "
1335 <<
"recevoir un Maillage_FT_IJK" << finl;
1347 const int nb_facettes_add = added_mesh.
nb_facettes();
1376 costheta.
resize(nb_som, 2);
1380static double distance_sommets(
const DoubleTab& sommets,
const int s0,
const int s1)
1382 const double d = (sommets(s0,0) - sommets(s1,0)) * (sommets(s0,0) - sommets(s1,0))
1383 + (sommets(s0,1) - sommets(s1,1)) * (sommets(s0,1) - sommets(s1,1))
1384 + (sommets(s0,2) - sommets(s1,2)) * (sommets(s0,2) - sommets(s1,2));
1391 const int nb_fa7 =
facettes_.dimension(0);
1392 const DoubleTab& tab_sommets =
sommets();
1394 double petit = 1.e-7;
1396 for (
int i = 0; i < nb_fa7; i++)
1401 double d1 = distance_sommets(tab_sommets, s0, s1);
1402 double d2 = distance_sommets(tab_sommets, s0, s2);
1403 double d3 = distance_sommets(tab_sommets, s1, s2);
1406 if ((d1> petit) && (d1 < lg))
1410 if ((d2> petit) && (d2 < lg))
1414 if ((d3> petit) && (d3 < lg))
1431 for (
int ifa=0 ; ifa<
facettes_.dimension(0) ; ifa++)
static int check_enabled()
: class Desc_Structure_FT
void collecter_espace_virtuel(ArrOfDouble &tab, MD_Vector_tools::Operations_echange op) const
void echange_espace_virtuel(ArrOfDouble &tab) const
: class Descripteur_FT Descripteur_FT stocke pour chaque PE une liste de numeros d'elements.
const ArrOfInt & elements(int pe_voisin) const
Renvoie la liste des elements distants/virtuels du pe en parametre.
const ArrOfInt & pe_voisins() const
Renvoie la liste des PE pour lesquels la liste d'elements est non vide, dans l'ordre croissant des nu...
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
int get_nb_elem_local(int direction) const
Returns the number of elements owned by this processor in the given direction.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
void reinit_remeshing_table()
void completer_compo_connexe_partielle(const Maillage_FT_IJK &mesh, const Domaine_IJK &splitting, const DoubleTab &liste_sommets_apres_deplacement, const DoubleTab &liste_sommets_avant_deplacement, const ArrOfInt &compo_connexe_sommets_deplace)
DoubleTab & get_liste_sommets_et_deplacements_non_const()
void remailler_FT_Field(Maillage_FT_IJK &mesh)
const ArrOfInt get_sorted_index()
void set_tolerance_point_identique(double longueur_cara_fa7)
ArrOfInt get_compo_connexe_sommets() const
void echange_espace_virtuel(const Maillage_FT_Disc &mesh)
void champ_sommet_from_facettes(const ArrOfInt &compo_connexe_facettes, const Maillage_FT_IJK &mesh)
Point3D calculer_normale_apres_deplacement(const int fa, const int somfa7, const Vecteur3 pos_apres_dep)
void sauvegarder_triangle(const Maillage_FT_IJK &mesh, const int i, const int avant_apres_remaillage)
void update_FT_Field_local_from_full_compo(const Maillage_FT_IJK &mesh)
bool get_disable_surfactant() const
DoubleTab & get_facettes_sommets_full_compo_non_const()
virtual void creer_facettes_virtuelles(const ArrOfInt &liste_facettes, const ArrOfInt &liste_pe, const ArrOfInt &facettes_send_pe_list, const ArrOfInt &facettes_recv_pe_list)
Creation de facettes virtuelles sur le pe specifie.
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 corriger_proprietaires_facettes()
Sans changer les sommets existants ni la numerotation des facettes, on change le proprietaire des fac...
void supprimer_facettes(const ArrOfInt &liste_facettes)
Supprime les facettes dont les indices locaux sont donnes en parametre.
ArrOfIntFT sommet_PE_owner_
Desc_Structure_FT desc_facettes_
virtual const ArrOfDouble & get_surface_facettes() const
void creer_sommets_virtuels(const ArrOfInt &liste_sommets, const ArrOfInt &liste_pe, const Schema_Comm &comm)
Envoi des sommets dont le numero est donne dans liste_sommets au processeur dont le numero est donne ...
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
ArrOfIntFT sommet_face_bord_
ArrOfIntFT facette_num_owner_
virtual void nettoyer_maillage()
Retire toutes les facettes virtuelles, toutes les facettes invalides (sommet0 == sommet1) et tous les...
Desc_Structure_FT desc_sommets_
void associer_domaine_dis_parcours(const Domaine_dis_base &domaine_dis, const Parcours_interface &parcours)
int facette_virtuelle(int i) const
Renvoie 0 si la facette m'appartient, 1 sinon.
const Desc_Structure_FT & desc_sommets() const
renvoie le descripteur des sommets (espace_distant/virtuel)
virtual int check_mesh(int error_is_fatal=1, int skip_facette_owner=0, int skip_facettes=0) const
ArrOfIntFT sommet_num_owner_
virtual void ajouter_maillage(const Maillage_FT_Disc &maillage_tmp, int skip_facettes=0)
const Desc_Structure_FT & desc_facettes() const
renvoie le descripteur des facettes (espace_distant/virtuel)
ArrOfIntFT drapeaux_sommets_
void parcourir_maillage()
Remplit la structure intersections_elem_facettes_.
int sommet_virtuel(int i) const
virtual void recopie(const Maillage_FT_Disc &maillage_source, Statut_Maillage niveau_copie)
Recopie une partie du maillage source dans *this.
Maillage_FT_Disc()
constructeur par defaut.
virtual void transporter(const DoubleTab &deplacement)
Deplace les sommets de l'interface d'un vecteur "deplacement" fourni, Change eventuellement les somme...
friend class Parcours_interface
void reset()
vide toutes les structures du maillage, le statut passe a RESET.
void parcourir_maillage()
ArrOfInt liste_processeurs_voisins_faces_
void calculer_costheta_minmax(DoubleTab &costheta) const override
Pour chaque sommet du maillage, s'il est sur un bord, on calcule costheta min et max (hysteresis) cor...
void deplacer_sommets(const ArrOfInt &liste_sommets_initiale, const DoubleTab &deplacement_initial, ArrOfInt &liste_sommets_sortis, ArrOfInt &numero_face_sortie, int skip_facettes=0) override
Applique un vecteur deplacement aux noeuds dont le numero est dans "liste_noeud", puis echange les es...
bool use_tryggvason_interfacial_source_
int check_mesh(int error_is_fatal=1, int skip_facette_owner=0, int skip_facettes=0) const override
int nb_facettes_sans_duplicata() const
void lire_maillage_ft_dans_lata(const char *filename_with_path, int tstep, const char *geometryname)
const ArrOfInt & compo_connexe_facettes() const
void ajouter_maillage(const Maillage_FT_Disc &maillage_tmp, int skip_facettes=0) override
FT_Field & Surfactant_facettes_non_const()
DoubleTab update_sigma_and_interfacial_source_term_sommet(const Domaine_IJK &splitting, bool compute_interfacial_source, bool use_tryggvason_formulation, const double sigma_const=-1.)
Int3 get_ijk_cell_index(int num_sommet) const
const FT_Field & Surfactant_facettes() const
ArrOfIntFT compo_connexe_facettes_
void creer_facettes_virtuelles(const ArrOfInt &liste_facettes, const ArrOfInt &liste_pe, const ArrOfInt &facettes_send_pe_list, const ArrOfInt &facettes_recv_pe_list) override
Creation de facettes virtuelles sur le pe specifie.
FT_Field Surfactant_facettes_
void transporter(const DoubleTab &deplacement) override
Deplace les sommets de l'interface d'un vecteur "deplacement" fourni, Change eventuellement les somme...
void nettoyer_maillage() override
Retire toutes les facettes virtuelles, toutes les facettes invalides (sommet0 == sommet1) et tous les...
ArrOfInt & compo_connexe_facettes_non_const()
void initialize_processor_neighbourhood()
int check_sommets(int error_is_fatal=1) const override
void recopie_force_compo(const Maillage_FT_IJK &source_mesh, const int icompo)
DoubleTab indexation_facettes_avant_transport_
void corriger_proprietaires_facettes()
bool during_barycentrage_
void update_surfactant_apres_transport()
ArrOfInt liste_processeurs_voisins_coins_
void recopie(const Maillage_FT_Disc &source_mesh, Statut_Maillage niveau_copie) override
Recopie une partie du maillage source dans *this.
Maillage_FT_IJK(const Maillage_FT_IJK &)=default
void ajouter_maillage_IJK(const Maillage_FT_IJK &added_mesh)
ArrOfInt voisinage_processeur_
ArrOfInt liste_processeurs_voisins_aretes_
void supprimer_facettes(const ArrOfInt &liste_facettes)
double minimum_longueur_arrete() const
void calculer_compo_connexe_sommets(ArrOfIntFT &compo_connexe_sommets) const
void initialize(const Domaine_IJK &, const Domaine_dis_base &, const Parcours_interface &, const bool use_tryggvason_interfacial_source=false)
void sauv_facette_indexation_avant_transport()
void set_ijk_cell_index(int num_sommet, Int3 ijk)
class Nom Une chaine de caractere pour nommer les objets de TRUST
classe Objet_U Cette classe est la classe de base des Objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
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.
void Compute_interfaciale_source(const ArrOfDouble &sigma_Facet, const Maillage_FT_Disc &FTmesh, DoubleTab &df_sigma, bool Normalised_with_Surface, bool use_tryggvason_formulation, bool with_marangoni=false)
static double mp_min(double)
static int check_int_overflow(trustIdType)
static double mp_max(double)
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
void set_send_recv_pe_list(const ArrOfInt &send_pe_list, const ArrOfInt &recv_pe_list, const int me_to_me=0)
Definit la liste des processeurs a qui on va envoyer et de qui on va recevoir des donnees.
Classe de base des flux de sortie.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void resize(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
int dimension_int(int d) const
void ref_as_small(TRUSTTab< _TYPE_, int > &out) const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const