16#include <Remaillage_FT.h>
17#include <TRUST_Deriv.h>
19#include <Domaine_VF.h>
23#include <Rectangle_2D_axi.h>
26#include <Comm_Group.h>
27#include <Transport_Interfaces_FT_Disc.h>
28#include <EcritureLectureSpecial.h>
30#include <Array_tools.h>
33#include <TRUST_2_PDI.h>
49 double critere_remaillage_compat=-1;
50 p.ajouter(
"critere_remaillage",& critere_remaillage_compat);
55 p.lire_avec_accolades_depuis(is);
57 if ( critere_remaillage_compat!=-1)
58 Process::exit(
"Error: critere_remaillage keyword did nothing and is therefore obsolete, remove it from your datafile");
62 Cerr <<
"Error: Obsolete syntax read in the datafile:" << finl;
64 Cerr <<
"To keep pre v1.9.6 behavior, replace it with:" << finl;
88 Cerr <<
"Error in Remaillage_FT::readOn: It is an error to specify both facteur_longueur_ideale"
89 <<
" and critere_longueur_fixe parameters." << finl;
100 Cerr <<
"Erreur : ::printOn n'est pas code." << finl;
111 Cerr <<
"Erreur dans Remaillage_FT::reprendre\n";
112 Cerr <<
" On attendait le motcle " <<
que_suis_je();
113 Cerr <<
"\n On a trouve " << motlu << finl;
119 Cerr <<
"Remaillage_FT::reprendre Format PDI not supported yet" << finl;
144 Cerr <<
"Remaillage_FT::sauvegarder Format PDI not supported yet" << finl;
189 Cerr<<
"Remaillage_FT::associer_domaine_dis"<<finl;
190 refdomaine_VF_ = ref_cast(
Domaine_VF,domaine_dis);
215 statistics().create_custom_counter(
"Remaillage_local_interface",3,
"FrontTracking");
216 statistics().begin_count(
"Remaillage_local_interface",statistics().get_last_opened_counter_level()+1);
224 ArrOfDoubleFT varVolume;
259 Journal() <<
"remaillage_local_interface t= " << temps <<
" suppressions: " << n <<
" divisions: " << m << finl;
262 statistics().end_count(
"Remaillage_local_interface");
280 ArrOfInt& fa7VoisinesSom_index,
281 IntTab& fa7VoisinesSom_data)
const
287 const IntTab& facettes = maillage.
facettes();
288 const int nb_som_par_facette = facettes.
dimension(1);
290 int fa7, isom, som, trouve, index, index0 = -1;
293 for (som=0 ; som<nb_som ; som++)
295 fa7VoisinesSom_index[som] = -1;
299 for (fa7=0 ; fa7<nb_facettes ; fa7++)
302 for (isom=0 ; isom<nb_som_par_facette ; isom++)
304 som = facettes(fa7,isom);
307 index = fa7VoisinesSom_index[som];
312 fa7VoisinesSom_index[som] = compteur;
313 fa7VoisinesSom_data(compteur,0) = -1;
314 fa7VoisinesSom_data(compteur,1) = fa7;
321 while (index>=0 && trouve==-1)
324 if (fa7VoisinesSom_data(index,1) == fa7)
327 index = fa7VoisinesSom_data(index,0);
332 assert(index==-1 && index0!=-1);
334 fa7VoisinesSom_data(index0,0) = compteur;
335 fa7VoisinesSom_data(compteur,0) = -1;
336 fa7VoisinesSom_data(compteur,1) = fa7;
362 DoubleTab& differentielle_volume)
const
367 const IntTab& facettes = maillage.
facettes();
368 const int nb_som_par_facette = facettes.
dimension(1);
374 differentielle_volume.
resize(nb_sommets, dim);
375 differentielle_volume = 0.;
377 const double facteur = 1. / (double) dim;
388 double normale[3] = { 0., 0., 0. };
389 for (fa7 = 0; fa7 < nb_facettes; fa7++)
394 double surf = surface_facettes[fa7];
395 double x = surf * facteur;
396 for (k = 0; k < dim; k++)
397 normale[k] = normale_facettes(fa7, k);
399 for (isom=0 ; isom<nb_som_par_facette ; isom++)
401 int som = facettes(fa7,isom);
402 for (k = 0; k < dim; k++)
403 differentielle_volume(som,k) += x * normale[k];
409 const double un_tiers = 1. / 3.;
410 const double un_sixieme = 1. / 6.;
411 const DoubleTab& sommets = maillage.
sommets();
413 for (
int facette = 0; facette < nb_facettes; facette++)
417 const int s1 = facettes(facette, 0);
418 const int s2 = facettes(facette, 1);
419 const double r1 = sommets(s1, 0);
420 const double y1 = sommets(s1, 1);
421 const double r2 = sommets(s2, 0);
422 const double y2 = sommets(s2, 1);
423 const double L2 = (r2-r1)*(r2-r1) + (y2-y1)*(y2-y1);
424 const double L = sqrt(L2);
425 const double nx = normale_facettes(facette, 0);
426 const double ny = normale_facettes(facette, 1);
427 const double dv_dn1 = L * (r1 * un_tiers + r2 * un_sixieme) * angle_bidim_axi;
428 const double dv_dn2 = L * (r2 * un_tiers + r1 * un_sixieme) * angle_bidim_axi;
429 differentielle_volume(s1, 0) += nx * dv_dn1;
430 differentielle_volume(s1, 1) += ny * dv_dn1;
431 differentielle_volume(s2, 0) += nx * dv_dn2;
432 differentielle_volume(s2, 1) += ny * dv_dn2;
453 const DoubleTab& position_initiale)
const
456 const IntTab& facettes = maillage.
facettes();
457 const DoubleTab& sommets = maillage.
sommets();
459#if DEBUG_CONSERV_VOLUME
465 double coord_som0[2], coord_som1[2], coord_som_opp[2];
466 const int som0 = facettes(fa7,0);
467 const int som1 = facettes(fa7,1);
470 const double un_tiers = 1. / 3.;
480 if ( (pe_owner[som0]==pe_owner[som1] && som0>som1) || (pe_owner[som0]>pe_owner[som1]) )
488 coord_som0[0] = position_initiale(som0,0);
489 coord_som0[1] = position_initiale(som0,1);
490 coord_som1[0] = position_initiale(som1,0);
491 coord_som1[1] = position_initiale(som1,1);
494 coord_som_opp[0] = sommets(som0,0);
495 coord_som_opp[1] = sommets(som0,1);
499 coord_som_opp[0] = sommets(som1,0);
500 coord_som_opp[1] = sommets(som1,1);
502 double v1 = FTd_calculer_aire_triangle(coord_som0,coord_som1,coord_som_opp);
506 v1 *= (coord_som0[0] + coord_som1[0] + coord_som_opp[0]) * un_tiers * angle_bidim_axi;
511 coord_som0[0] = sommets(som0,0);
512 coord_som0[1] = sommets(som0,1);
513 coord_som1[0] = position_initiale(som1,0);
514 coord_som1[1] = position_initiale(som1,1);
515 coord_som_opp[0] = sommets(som1,0);
516 coord_som_opp[1] = sommets(som1,1);
520 coord_som0[0] = position_initiale(som0,0);
521 coord_som0[1] = position_initiale(som0,1);
522 coord_som1[0] = sommets(som1,0);
523 coord_som1[1] = sommets(som1,1);
524 coord_som_opp[0] = sommets(som0,0);
525 coord_som_opp[1] = sommets(som0,1);
527 double v2 = FTd_calculer_aire_triangle(coord_som0,coord_som1,coord_som_opp);
529 v2 *= (coord_som0[0] + coord_som1[0] + coord_som_opp[0]) * un_tiers * angle_bidim_axi;
530#if DEBUG_CONSERV_VOLUME
544 const double un_sixieme = 1. / 6.;
545 double dy = position_initiale(som0,1)-position_initiale(som1,1);
546 double x0 = position_initiale(som0,0);
547 double x1 = position_initiale(som1,0);
550 const double vp1 = angle_bidim_axi * un_sixieme *dy*(x1*x1+x0*x0+x1*x0);
553 dy = sommets(som0,1)-sommets(som1,1);
554 x0 = sommets(som0,0);
555 x1 = sommets(som1,0);
558 const double vp2 = angle_bidim_axi * un_sixieme *dy*(x1*x1+x0*x0+x1*x0);
561 const double s = surface_facettes[fa7];
562 const double normale_scalaire_direction_x = normales_facettes(fa7, 0);
563 Cerr <<
"dy=" << dy <<
" s.nx " << s*normale_scalaire_direction_x << finl;
564 assert(normale_scalaire_direction_x*dy>=0.);
566 const double dv = vp2 - vp1;
568 Cerr <<
"Remaillage_FT::calculer_variation_volume_facette_2D" << finl;
569 Cerr <<
"Positions ini(x;y) -> fin(x;y) "
570 <<
"som0(" << position_initiale(som0,0)<<
";"<< position_initiale(som0,1)<<
") "
571 "som1(" << position_initiale(som1,0)<<
";"<< position_initiale(som1,1)<<
") "
573 "som0(" << sommets(som0,0)<<
";"<< sommets(som0,1)<<
") "
574 "som1(" << sommets(som1,0)<<
";"<< sommets(som1,1)<<
") "
576 Cerr <<
"v1= " << v1 << finl;
577 Cerr <<
"v2= " << v2 << finl;
578 Cerr <<
"v1+v2= " << v1+v2 << finl;
579 Cerr <<
"vp1= " << vp1 << finl;
580 Cerr <<
"vp2= " << vp2 << finl;
581 Cerr <<
"dv= " << dv << finl;
602static inline double calculer_volume_facette_3D_avec_ordre(
const DoubleTab& position_initiale,
603 const DoubleTab& position_finale,
605 int ordre_sommets[3])
610 FTd_vecteur3 sommets_base[3], sommet4;
613 for (
int i = 0; i < 3; i++)
614 for (
int j = 0; j < 3; j++)
615 sommets_base[i][j] = position_initiale(facette[i], j);
617 for (
int tetra = 0; tetra < 3; tetra++)
620 const int indice_sommet4 = ordre_sommets[tetra];
623 for (
int i = 0; i < 3; i++)
624 sommet4[i] = position_finale(facette[indice_sommet4], i);
626 v += FTd_calculer_volume_tetraedre(sommets_base[0], sommets_base[1], sommets_base[2], sommet4);
628 for (
int i = 0; i < 3; i++)
629 sommets_base[indice_sommet4][i] = sommet4[i];
636 const DoubleTab& position_initiale)
const
638 double varVolume = 0.;
641 const IntTab& facettes = maillage.
facettes();
642 for (
int i = 0; i < 3; i++)
643 facette[i] = facettes(fa7, i);
645 const DoubleTab& position_finale = maillage.
sommets();
646#ifdef ALGO_NON_PARALLELE
647 int ordre_sommets[3] = { 0, 1, 2 };
656 long long indice_global[3];
657 for (
int i = 0; i < 3; i++)
659 int isom = facette[i];
664#define check_swap(i,j) \
665if (indice_global[ordre_sommets[i]] > indice_global[ordre_sommets[j]]) \
666 { int x = ordre_sommets[i]; ordre_sommets[i] = ordre_sommets[j]; ordre_sommets[j] = x; }
672 varVolume = calculer_volume_facette_3D_avec_ordre(position_initiale, position_finale, facette, ordre_sommets);
677 int ordre_sommets[6][3] =
686 for (
int i = 0; i < 6; i++)
687 varVolume += calculer_volume_facette_3D_avec_ordre(position_initiale, position_finale, facette, ordre_sommets[i]);
713 const DoubleTab& position_initiale,
714 ArrOfDouble& varVolume)
const
716 double dvolume_total = 0.;
720 const IntTab& facettes = maillage.
facettes();
721 const int nb_som_par_facette = facettes.
dimension(1);
722 const double inv_som_facette = 1. / (double) nb_som_par_facette;
730 for (fa7 = 0; fa7 < nb_facettes; fa7++)
744 dv *= inv_som_facette;
746 for (isom = 0 ; isom < nb_som_par_facette ; isom++)
748 const int sommet = facettes(fa7, isom);
749 varVolume[sommet] += dv;
758 dvolume_total =
mp_sum(dvolume_total);
759 return dvolume_total;
772 const ArrOfDouble& varVolume,
773 const DoubleTab& deplacement_varVolume,
774 const ArrOfDouble& norme2_deplacement_varVolume)
const
777 const int nb_som = deplacement.
dimension(0);
788 double coeff_depl,coeff_varV;
790 double depl,depl_max = 0.;
796 for (som=0 ; som<nb_som ; som++)
798 if (norme2_deplacement_varVolume[som]!=0.)
806 scal += deplacement(som,k) * deplacement_varVolume(som,k);
812 if (varVolume[som]!=0.)
813 Process::Journal()<<
"correcDepl sommet "<<som<<
" varVolume= "<<varVolume[som]<<
" scal= "<<scal<<finl;
818 double norme = sqrt(norme2_deplacement_varVolume[som]);
821 dvn = deplacement_varVolume(som,k) / norme2_deplacement_varVolume[som];
823 coeff_depl * ( deplacement(som,k) - scal * dvn ) -
824 coeff_varV * varVolume[som] * deplacement_varVolume(som,k)/norme );
828 double norme = sqrt(norme2_deplacement_varVolume[som]);
831 dvn = deplacement_varVolume(som,k) / norme2_deplacement_varVolume[som];
833 coeff_depl * ( deplacement(som,k) - scal * dvn ) -
843 depl += deplacement(som,k) * deplacement(som,k);
876 DoubleTab& barycentres)
const
881 const IntTab& facettes = maillage.
facettes();
882 const DoubleTab& sommets = maillage.
sommets();
891 const double inv_dim = 1. / (double) dim;
893 int fa7, som, isom, k;
894 for (fa7=0 ; fa7<nb_facettes ; fa7++)
899 double bary[3] = {0., 0., 0.};
900 for (isom = 0; isom < dim; isom++)
902 const int sommet = facettes(fa7, isom);
903 for (k = 0; k < dim; k++)
904 bary[k] += sommets(sommet,k);
906 const double surface = surface_facettes[fa7];
907 const double surface_inv_dim = surface * inv_dim;
908 for (isom = 0; isom < dim; isom++)
910 const int sommet = facettes(fa7, isom);
911 for (k = 0; k < dim; k++)
912 barycentres(sommet, k) += bary[k] * surface_inv_dim;
913 barycentres(sommet, dim) += surface;
922 for (som=0 ; som<nb_sommets ; som++)
927 const double surface = barycentres(som, dim);
931 for (k=0 ; k<dim ; k++)
933 barycentres(som,k) = sommets(som,k);
938 const double inverse_surface = 1. / surface;
940 barycentres(som,k) *= inverse_surface;
948#if DEBUG_CONSERV_VOLUME
953double Remaillage_FT::calculer_volume_mesh(
const Maillage_FT_Disc& mesh)
const
959 const IntTab& facettes = mesh.
facettes();
960 const DoubleTab& sommets = mesh.
sommets();
961 const int DIR_projection = 0;
962 for (
int i = 0; i < n; i++)
966 const double s = surfaces_facettes[i];
967 const double normale_scalaire_direction = normales_facettes(i, DIR_projection);
969 const int i0 = facettes(i,0);
970 const int i1 = facettes(i,1);
971 double coord_centre_gravite_DIR = sommets(i0,DIR_projection) + sommets(i1,DIR_projection) ;
974 const int i2 = facettes(i,2);
975 coord_centre_gravite_DIR += sommets(i2,DIR_projection);
980 double volume_prisme=0;
984 const double x0 = sommets(i0,0);
985 const double x1 = sommets(i1,0);
987 volume_prisme = angle_bidim_axi / 6. * (s * normale_scalaire_direction) * (x0*x0+x1*x1+x0*x1);
991 volume_prisme = coord_centre_gravite_DIR * s * normale_scalaire_direction;
993 volume += volume_prisme;
999double Remaillage_FT::calculer_somme_dvolume(
const Maillage_FT_Disc& mesh,
const ArrOfDouble& dvolume)
const
1005 for (
int i = 0; i < n; i++)
1009 somme += dvolume[i];
1031 const double relaxation_direction_tangente,
1032 const double relaxation_direction_normale,
1033 ArrOfDouble& var_volume_impose,
1034 ArrOfDouble& var_volume_obtenu)
const
1038 assert(relaxation_direction_tangente >= 0. && relaxation_direction_tangente <= 1.);
1039 assert(relaxation_direction_normale >= 0. && relaxation_direction_normale <= 1.);
1045 DoubleTabFT differentielle_volume;
1046 DoubleTabFT barycentres;
1056 DoubleTabFT sommets(maillage.
sommets());
1057 DoubleTabFT deplacement(nb_som, dim);
1063 double normale[3] = { 0., 0., 0. };
1065 double diff[3] = {0., 0., 0.};
1067 double dtangent[3] = { 0., 0., 0. };
1068 double depl[3] = { 0., 0., 0. };
1070 int clipped_move = 0;
1074 for (sommet = 0; sommet < nb_som; sommet++)
1083 normale[0] = diff[0] = differentielle_volume(sommet, 0);
1084 normale[1] = diff[1] = differentielle_volume(sommet, 1);
1086 normale[2] = diff[2] = differentielle_volume(sommet, 2);
1092 double norme2_n = normale[0]*normale[0] + normale[1] * normale[1] + normale[2]*normale[2];
1100 double x = 1. / sqrt(norme2_n);
1108 const double normale_scal_diff = normale[0] * diff[0] + normale[1] * diff[1] + normale[2] * diff[2];
1109 const double i_normale_scal_diff = (normale_scal_diff == 0.) ? 0. : 1./normale_scal_diff;
1111 double dtangent_scalaire_n = 0.;
1112 for (k = 0; k < dim; k++)
1114 double x = barycentres(sommet,k) - sommets(sommet, k);
1116 dtangent_scalaire_n += x * normale[k];
1118 const double a = dtangent_scalaire_n;
1120 const double b = var_volume_impose[sommet] * i_normale_scal_diff;
1121 double norme2_deplacement = 0.;
1122 for (k = 0; k < dim; k++)
1126 double dt = (dtangent[k] - normale[k] * a) * relaxation_direction_tangente;
1129 double dn = normale[k] * b * relaxation_direction_normale;
1132 norme2_deplacement += x * x;
1137 double facteur = 1.;
1138 double surface_totale_sommet = barycentres(sommet, dim);
1139 if (norme2_deplacement > barycentres(sommet, dim))
1142 facteur = sqrt(surface_totale_sommet / norme2_deplacement);
1144 for (k = 0; k < dim; k++)
1145 deplacement(sommet,k) = depl[k] * facteur;
1148 if (clipped_move > 0)
1150 Journal() <<
"Remaillage_FT::redistribuer_sommets clipped_move "
1151 << clipped_move <<
" / " << nb_som << finl;
1160#if DEBUG_CONSERV_VOLUME
1161 double volume_init = calculer_volume_mesh(maillage);
1162 double dvol_init = calculer_somme_dvolume(maillage, var_volume_impose);
1165#if DEBUG_CONSERV_VOLUME
1166 double volume_apres = calculer_volume_mesh(maillage);
1168 const int new_nb_som = maillage.
nb_sommets();
1175#if DEBUG_CONSERV_VOLUME
1176 double volume_apres2 = calculer_volume_mesh(maillage);
1177 double dvol_obtenu = calculer_somme_dvolume(maillage, var_volume_obtenu);
1178 Cerr <<
"Remaillage_FT::redistribuer_sommets BILAN "
1179 <<
" volume avt= " << volume_init
1180 <<
" apres= " << volume_apres
1181 <<
" apres2= " << volume_apres2
1182 <<
" dvolume demande= " << dvol_init
1183 <<
" obtenu= " << dvol_obtenu << finl;
1203 nb_iter_corrections_vol,
1217 statistics().create_custom_counter(
"Barycentrer_lisser_sys",3,
"FrontTracking");
1218 statistics().begin_count(
"Barycentrer_lisser_sys",statistics().get_last_opened_counter_level()+1);
1220 Journal() <<
"barycentrer_lisser_systematique" << finl;
1222 ArrOfDoubleFT var_volume(maillage.
nb_sommets());
1234 statistics().end_count(
"Barycentrer_lisser_sys");
1244 statistics().create_custom_counter(
"Barycentrer_lisser_apres_rem",3,
"TrioCFD");
1245 statistics().begin_count(
"Barycentrer_lisser_apres_rem",statistics().get_last_opened_counter_level()+1);
1247 Journal() <<
"barycentrer_lisser_apres_remaillage" << finl;
1257 statistics().end_count(
"Barycentrer_lisser_apres_rem");
1270 ArrOfDouble& var_volume,
1271 const double facteur_barycentrage_tangent,
1272 const double coeff_lissage,
1273 const int nb_iter_barycentrage,
1274 const int nb_iter_lissage,
1275 const int max_nb_iter_correction_volume,
1276 const double seuil_dvolume)
const
1278 ArrOfDoubleFT var_volume_obtenu;
1280 double dvolume = 0.;
1282 int iteration_correction_volume = 0;
1283 for(iteration = 0; 1; iteration++)
1285#if DEBUG_CONSERV_VOLUME
1286 double volume_initial=0, volume_final=0, dvol_init=0, dvol_redistributed=0;
1287 double dvol_apres_regulariser=0, dvol_obtenu=0, dvol_futur=0;
1288 double volume_interm1=0, volume_interm2=0, volume_interm3=0;
1290 double vol = calculer_volume_mesh(maillage);
1291 volume_initial = vol;
1292 double dvol = calculer_somme_dvolume(maillage, var_volume);
1295 Cerr <<
"Remaillage_FT::regulariser_maillage iteration " << iteration
1296 <<
" volume= " << vol <<
" dvolume= " << dvol << finl;
1308#if DEBUG_CONSERV_VOLUME
1310 volume_interm1 = calculer_volume_mesh(maillage);
1311 double dvol = calculer_somme_dvolume(maillage, var_volume);
1312 dvol_redistributed = dvol;
1313 Cerr <<
"Remaillage_FT::regulariser_maillage apres lisser dvolume "
1314 <<
" dvolume= " << dvol << finl;
1322 if (iteration > 0 && iteration < nb_iter_lissage + 1)
1324 ArrOfDoubleFT dv_courbure(maillage.
nb_sommets());
1329 for (
int i = 0; i < n; i++)
1330 var_volume[i] += dv_courbure[i];
1333#if DEBUG_CONSERV_VOLUME
1335 volume_interm2 = calculer_volume_mesh(maillage);
1336 double dvol = calculer_somme_dvolume(maillage, dv_courbure);
1337 double dvolnew = calculer_somme_dvolume(maillage, var_volume);
1338 dvol_apres_regulariser = dvolnew;
1339 Cerr <<
"Remaillage_FT::regulariser_maillage apres calcul dvcourbure "
1340 <<
" dv courbure= " << dvol << finl;
1348 double facteur = facteur_barycentrage_tangent;
1349 if (iteration >= nb_iter_barycentrage)
1358 var_volume_obtenu );
1359#if DEBUG_CONSERV_VOLUME
1361 volume_interm3 = calculer_volume_mesh(maillage);
1362 double dvol = calculer_somme_dvolume(maillage, var_volume);
1363 dvol_obtenu = calculer_somme_dvolume(maillage, var_volume_obtenu);
1364 Cerr <<
"Remaillage_FT::regulariser_maillage apres redistribuer_sommets " << iteration
1365 <<
" dvolume demande= " << dvol
1366 <<
" dvolume obtenu= " << dvol_obtenu << finl;
1372 var_volume -= var_volume_obtenu;
1373#if DEBUG_CONSERV_VOLUME
1375 double vol = calculer_volume_mesh(maillage);
1377 double vvol = calculer_somme_dvolume(maillage, var_volume_obtenu);
1378 double dvol = calculer_somme_dvolume(maillage, var_volume);
1380 Cerr <<
"Remaillage_FT::regulariser_maillage apres redistribuer_sommets " << iteration
1381 <<
" volume= " << vol
1382 <<
" var_vol obtenu= " << vvol
1383 <<
" dvolume= " << dvol
1384 <<
" variation calculee= " << volume_final-volume_initial << finl;
1386 Cerr <<
"Remaillage_FT::regulariser_maillage "
1387 <<
"iteration " << iteration << finl
1388 <<
"volume_initial " << volume_initial << finl
1389 <<
"volume_final " << volume_final << finl
1390 <<
"dvol_init " << dvol_init << finl
1391 <<
"dvol_redistributed " << dvol_redistributed << finl
1392 <<
"dvol_apres_regulariser " << dvol_apres_regulariser << finl
1393 <<
"dvol_obtenu " << dvol_obtenu << finl
1394 <<
"dvol_futur " << dvol_futur << finl
1397 Cerr <<
"Remaillage_FT::regulariser_maillage VOLUMES "
1398 <<
"iteration " << iteration << finl
1399 <<
"volume_initial " << volume_initial << finl
1400 <<
"volume_interm1 " << volume_interm1 << finl
1401 <<
"volume_interm2 " << volume_interm2 << finl
1402 <<
"volume_interm3 " << volume_interm3 << finl
1403 <<
"volume_final " << volume_final << finl
1409 if (iteration >= nb_iter_barycentrage-1 && iteration >= nb_iter_lissage)
1412 iteration_correction_volume++;
1415 if (iteration_correction_volume > max_nb_iter_correction_volume
1416 || std::fabs(dvolume) < seuil_dvolume)
1438 ArrOfDouble& var_volume,
1439 const int nb_iterations)
const
1441 DoubleTabFT barycentres;
1445 const IntTab& facettes = maillage.
facettes();
1446 ArrOfDoubleFT dv_facettes(nb_facettes);
1448 const double inv_dim = 1. / (double) dim;
1449 int facette, j, iter;
1450 for (iter = 0; iter < nb_iterations; iter++)
1455 for (facette = 0; facette < nb_facettes; facette++)
1459 const double surface = surfaces[facette];
1460 for (j = 0; j < dim; j++)
1462 int sommet = facettes(facette, j);
1463 double surface_tot = barycentres(sommet, dim);
1464 if (surface_tot > 0.)
1465 dv_facettes[facette] += surface / surface_tot * var_volume[sommet];
1471 for (facette = 0; facette < nb_facettes; facette++)
1475 double dv = dv_facettes[facette] * inv_dim;
1476 for (j = 0; j < dim; j++)
1478 int sommet = facettes(facette, j);
1479 var_volume[sommet] += dv;
1505 const int nb_sommets = maillage.
nb_sommets();
1507 const IntTab& facettes = maillage.
facettes();
1508 const int nb_som_par_facette = facettes.
dimension(1);
1509 ArrOfIntFT nbSomVois_bord(nb_sommets);
1511 int fa7,som, nb_som_bord, isom;
1513 for (fa7=0 ; fa7<nb_facettes ; fa7++)
1516 for (isom=0 ; isom<nb_som_par_facette ; isom++)
1518 som = facettes(fa7,isom);
1527 for (isom=0 ; isom<nb_som_par_facette ; isom++)
1529 som = facettes(fa7,isom);
1532 nbSomVois_bord[som] += nb_som_bord;
1539 const DoubleTab& sommets = maillage.
sommets();
1540 const DoubleTab& xp = refdomaine_VF_->xp();
1541 double x,y,z=0., scal;
1542 for (som=0 ; som<nb_sommets ; som++)
1547 && nbSomVois_bord[som]==0)
1552 x = xp(elem,0) - sommets(som,0);
1553 y = xp(elem,1) - sommets(som,1);
1554 scal = x * deplacement(som,0) + y * deplacement(som,1);
1557 z = xp(elem,2) - sommets(som,2);
1558 scal += z * deplacement(som,2);
1565 Process::Journal()<<
"Remaillage_FT::traite_decollement : decollement detecte"<<finl;
1567 Process::Journal()<<
" decoll= "<<deplacement(som,0)<<
" "<<deplacement(som,1)<<
" "<<deplacement(som,2)<<finl;
1590 Process::Journal()<<
"Remaillage_FT::traite_adherence : adherence detectee"<<finl;
1598inline double produit_scalaire(
const FTd_vecteur3& a,
const FTd_vecteur3& b)
1600 return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
1603inline void produit_vectoriel(
const FTd_vecteur3& a,
const FTd_vecteur3& b, FTd_vecteur3& resu)
1605 resu[0] = a[1]*b[2] - a[2]*b[1];
1606 resu[1] = a[2]*b[0] - a[0]*b[2];
1607 resu[2] = a[0]*b[1] - a[1]*b[0];
1628 const int nb_som_par_facette = facettes.
dimension(1);
1630#define CONSERVER_FACETTES_COINS
1631#ifdef CONSERVER_FACETTES_COINS
1634 const DoubleTab& sommets = maillage.
sommets();
1639 int fa7, isom, som =0, nb_bord;
1640 for (fa7=0 ; fa7<nb_facettes ; fa7++)
1643 for (isom=0 ; isom<nb_som_par_facette ; isom++)
1645 som = facettes(fa7,isom);
1652#ifndef CONSERVER_FACETTES_COINS
1664 for (isom=1 ; isom<nb_som_par_facette ; isom++)
1666 facettes(fa7,isom) = facettes(fa7,0);
1673 for (isom=0 ; isom<nb_som_par_facette ; isom++)
1675 som = facettes(fa7,isom);
1677 FTd_vecteur3 v4= {0.,0.,0.};
1679 if (dim==3) s2=sommets(som,2);
1681 sommets(som,0), sommets(som,1), s2,
1682 v4[0], v4[1], v4[2]);
1684 for (
int direction = 0; direction < dim; direction++)
1686 ps += v4[direction]*normale_facettes(fa7,direction);
1688 const double tol = 1.e-10;
1689 if (1. - std::fabs(ps)> tol)
1705 for (isom=1 ; isom<nb_som_par_facette ; isom++)
1707 facettes(fa7,isom) = facettes(fa7,0);
1741static void SPA_choisir_sommets_remplacement(
const Maillage_FT_Disc& maillage,
1742 const IntTab& tab_aretesMarquees,
1743 IntTab& sommets_remplacement)
1745 const int nb_sommets = maillage.
nb_sommets();
1746 const IntTab& facettes = maillage.
facettes();
1750 sommets_remplacement.
resize(nb_sommets, 2);
1756 sommets_remplacement = no_PE;
1761 ArrOfIntFT sommets_conserves(nb_sommets);
1762 sommets_conserves = 0;
1767 const int n = tab_aretesMarquees.
dimension(0);
1768 const int nb_som_par_facette = facettes.
dimension(1);
1770 for (i = 0; i < n; i++)
1772 const int fa7 = tab_aretesMarquees(i,0);
1773 const int isom = tab_aretesMarquees(i,1);
1774 assert(isom >= 0 && isom < nb_som_par_facette);
1775 const int isom_s = (isom + 1 < nb_som_par_facette) ? isom + 1 : 0;
1776 const int som = facettes(fa7, isom);
1777 const int som_s = facettes(fa7, isom_s);
1787 const int pe = sommet_PE_owner[som];
1788 const int pe_s = sommet_PE_owner[som_s];
1789 const int numOwner = sommet_num_owner[som];
1790 const int numOwner_s = sommet_num_owner[som_s];
1791 if (FTd_compare_sommets_global(pe, numOwner, pe_s, numOwner_s) > 0)
1820 if ( sommets_remplacement(somRempl, 0) == no_PE
1821 && sommets_remplacement(somSupp, 0) == no_PE
1822 && sommets_conserves[somSupp] == 0)
1824 const int pe = sommet_PE_owner[somRempl];
1825 const int le_som = sommet_num_owner[somRempl];
1826 sommets_remplacement(somSupp, 0) = pe;
1827 sommets_remplacement(somSupp, 1) = le_som;
1828 sommets_conserves[somRempl] = 1;
1849 for (i = 0; i < nb_sommets; i++)
1851 const int a_conserver = sommets_conserves[i];
1852 const int non_remplace = (sommets_remplacement(i,0) == no_PE);
1853 if (a_conserver || non_remplace)
1855 sommets_remplacement(i,0) = -1;
1856 sommets_remplacement(i,1) = -1;
1873 ArrOfDouble& varVolume)
const
1875 statistics().create_custom_counter(
"Supprimer_petites_aretes",3,
"TrioCFD");
1876 statistics().begin_count(
"Supprimer_petites_aretes",statistics().get_last_opened_counter_level()+1);
1877 int nb_sommets_supprimes_tot = 0;
1878 int nb_sommets_supprimes = 0;
1885 IntTabFT remplacement_ilocal(0,2);
1890 IntTabFT tab_aretesMarquees;
1892 ArrOfIntFT tab_somD;
1893 DoubleTabFT tab_deplacement_somD;
1897 tab_deplacement_somD,
1906 IntTabFT sommets_remplacement;
1907 SPA_choisir_sommets_remplacement(maillage,
1909 sommets_remplacement);
1914 ArrOfIntFT request_sommets_pe;
1915 ArrOfIntFT request_sommets_num;
1917 const int nb_sommets = maillage.
nb_sommets();
1919 assert(nb_sommets == sommets_remplacement.
dimension(0));
1920 for (i = 0; i < nb_sommets; i++)
1922 const int pe = sommets_remplacement(i,0);
1923 const int som= sommets_remplacement(i,1);
1945 request_sommets_num);
1954 for (ii = old_size; ii < new_size; ii++)
1959 ArrOfIntFT request_sommets_ilocal;
1963 request_sommets_num,
1965 request_sommets_ilocal);
1967 const int n_rempl = remplacement_ilocal.
dimension(0);
1968 for (i = 0; i < n_rempl; i++)
1970 int som_new = remplacement_ilocal(i,1);
1973 som_new = request_sommets_ilocal[j];
1974 remplacement_ilocal(i,1) = som_new;
1984 const DoubleTab& sommets = maillage.
sommets();
1986 const int n_rempl = remplacement_ilocal.
dimension(0);
1987 DoubleTabFT position_finale(sommets);
1990 for (i = 0; i < n_rempl; i++)
1992 const int som_old = remplacement_ilocal(i,0);
1993 const int som_new = remplacement_ilocal(i,1);
1995 for (j = 0; j < dim; j++)
1996 position_finale(som_old, j) = position_finale(som_new, j);
1999 ArrOfDoubleFT dvolume;
2010 for (i = 0; i < n; i++)
2015 varVolume[i] += dvolume[i];
2018 for (i = 0; i < n_rempl; i++)
2020 const int som_old = remplacement_ilocal(i,0);
2021 const int som_new = remplacement_ilocal(i,1);
2022 const double dv = varVolume[som_old];
2023 varVolume[som_new] += dv;
2024 varVolume[som_old] = 0;
2037 ArrOfIntFT table_old_new(nb_som);
2040 const int nb_rempl = remplacement_ilocal.
dimension(0);
2041 for (i = 0; i < nb_rempl; i++)
2043 const int som_old = remplacement_ilocal(i,0);
2044 const int som_new = remplacement_ilocal(i,1);
2045 table_old_new[som_old] = som_new;
2048 const int nb_facettes = facettes.
dimension(0);
2049 const int nb_som_par_facette = facettes.
dimension(1);
2050 for (i = 0; i < nb_facettes; i++)
2054 for (j = 0; j < nb_som_par_facette; j++)
2056 const int i_sommet = facettes(i,j);
2057 const int new_sommet = table_old_new[i_sommet];
2058 if (new_sommet >= 0)
2060 facettes(i,j) = new_sommet;
2067 if (flag && nb_som_par_facette == 3)
2070 const int s0 = facettes(i,0);
2071 const int s1 = facettes(i,1);
2072 const int s2 = facettes(i,2);
2073 if (s0 == s2 || s1 == s2)
2082 nb_sommets_supprimes = remplacement_ilocal.
dimension(0);
2084 nb_sommets_supprimes_tot += nb_sommets_supprimes;
2086 while (nb_sommets_supprimes > 0);
2095 statistics().end_count(
"Supprimer_petites_aretes");
2096 return nb_sommets_supprimes_tot;
2115 const int nb_sommets = maillage.
nb_sommets();
2118 const int nb_som_par_facette = facettes.
dimension(1);
2121 ArrOfIntFT facettes_a_supprimer(nb_facettes);
2122 facettes_a_supprimer = 0;
2124 ArrOfIntFT fa7VoisinesSom_index;
2125 IntTabFT fa7VoisinesSom_data;
2128 fa7VoisinesSom_data.
resize(3*nb_facettes,2);
2134 int som, index, index2, fa7,fa72, compteur, isom,isom2, trouve;
2135 for (som=0 ; som<nb_sommets ; som++)
2137 index = fa7VoisinesSom_index[som];
2141 fa7 = fa7VoisinesSom_data(index,1);
2142 if (facettes(fa7,0)!=facettes(fa7,1))
2145 index2 = fa7VoisinesSom_data(index,0);
2149 fa72 = fa7VoisinesSom_data(index2,1);
2150 if (facettes(fa72,0)!=facettes(fa72,1))
2156 for (isom=0 ; isom<nb_som_par_facette && trouve==0 ; isom++)
2158 for (isom2=0 ; isom2<nb_som_par_facette && trouve==0 ; isom2++)
2160 if (facettes(fa7,isom) == facettes(fa72,isom2))
2178 if (compteur==nb_som_par_facette)
2192 facettes_a_supprimer[fa7] = 1;
2193 facettes_a_supprimer[fa72] = 1;
2198 index2 = fa7VoisinesSom_data(index2,0);
2204 index2 = fa7VoisinesSom_data(index2,0);
2209 index = fa7VoisinesSom_data(index,0);
2220 for (i = 0; i < nb_facettes; i++)
2222 if (facettes_a_supprimer[i])
2224 const int sommet0 = facettes(i, 0);
2225 for (j = 1; j < nb_som_par_facette; j++)
2226 facettes(i, j) = sommet0;
2246 double x,
double y,
double z)
const
2255 const Elem_geom_base& elem_geom = refdomaine_VF_->domaine().type_elem().valeur();
2257 if (sub_type(Triangle, elem_geom))
2259 double vol = refdomaine_VF_->volumes(elem0);
2263 else if (sub_type(Tetraedre, elem_geom))
2266 double vol = refdomaine_VF_->volumes(elem0);
2270 else if (sub_type(Rectangle, elem_geom)
2271 || sub_type(Hexaedre, elem_geom))
2274 const DoubleTab& sommets = maillage.
sommets();
2275 const DoubleTab& xv = refdomaine_VF_->xv();
2276 const IntTab& elem_faces = refdomaine_VF_->elem_faces();
2278 FTd_vecteur3 v = {0., 0., 0.};
2279 FTd_vecteur3 xyz = {x, y, z};
2280 FTd_vecteur3 delta_xv = {0., 0., 0.};
2283 for (k = 0; k < dim; k++)
2285 v[k] = xyz[k] - sommets(som0, k);
2286 norme2 += v[k] * v[k];
2287 const int face0 = elem_faces(elem0,k);
2288 const int face1 = elem_faces(elem0,k+dim);
2289 delta_xv[k] = xv(face1,k) - xv(face0,k);
2295 for (k = 0; k < dim; k++)
2296 norme2 += delta_xv[k] * delta_xv[k];
2306 v[2] = dim==3 ? 1. : 0.;
2309 double f = 1. / sqrt(norme2);
2311 for (k = 0; k < dim; k++)
2313 v[k] *= f * delta_xv[k];
2314 norme2 += v[k] * v[k];
2322 Cerr <<
"Remaillage_FT::calculer_longueurIdeale2_arete non implemente pour les elements "
2338 Cerr <<
"Erreur Remaillage_FT::calculer_longueurIdeale2_arete" << finl;
2352 ArrOfDouble& varVolume)
const
2357 const DoubleTab& sommets = maillage.
sommets();
2358 const IntTab& facettes = maillage.
facettes();
2359 const int nb_som_par_facette = facettes.
dimension(1);
2361 int isom,som, som_rempl,fa7, k;
2363 FTd_vecteur3 som0,som1,som2,som3;
2371 for (fa7=0 ; fa7<nb_facettes ; fa7++)
2374 for (isom=0 ; isom<nb_som_par_facette ; isom++)
2376 som = facettes(fa7,isom);
2377 som_rempl = tab_somSupp[som];
2386 som0[k] = sommets(facettes(fa7,0),k);
2387 som1[k] = sommets(facettes(fa7,1),k);
2388 som2[k] = sommets(facettes(fa7,2),k);
2389 som3[k] = sommets(som_rempl,k);
2392 volume = FTd_calculer_volume_tetraedre(som0,som1,som2,som3);
2394 varVolume[som] = volume;
2402 const int nb_sommets = maillage.
nb_sommets();
2403 for (som=0 ; som<nb_sommets ; som++)
2405 if (tab_somSupp[som]!=-1)
2406 Process::Journal()<<
"Som_apresSupp "<<tab_somSupp[som]<<
" "<<som<<
" varVolume= "<<varVolume[som]<<finl;
2413 Process::Journal()<<
"calculer_volume_sommets_supprimes : varVolume_global= "<<res<<finl;
2448 statistics().create_custom_counter(
"Diviser_grandes_aretes",3,
"TrioCFD");
2449 statistics().begin_count(
"Diviser_grandes_aretes",statistics().get_last_opened_counter_level()+1);
2451 static int compteur = 0;
2452 static int test_val = -1;
2457 if (compteur == test_val)
2466 IntTabFT tab_aretesMarquees;
2467 ArrOfIntFT tab_somD;
2468 DoubleTabFT tab_deplacement_somD;
2474 tab_deplacement_somD,
2478 const int nb_aretes_divis = tab_aretesMarquees.
dimension(0);
2482 const int nb_facettes0 = nb_facettes;
2484 const int nb_som_par_facette = facettes.
dimension(1);
2487 int fa7,iarete, isom,som,isom_s,som_s,isom_ss,som_ss, pe_somD,numOwner_somD,somD,somD_s,somD_ss;
2490 const int nb_aretes_par_facette = (dimension3)?3:1;
2492 IntTabFT tab_fa7Divis(nb_facettes,nb_aretes_par_facette);
2493 for (fa7=0 ; fa7<nb_facettes ; fa7++)
2495 for (isom=0 ; isom<nb_aretes_par_facette ; isom++)
2497 tab_fa7Divis(fa7,isom) = -1;
2502 for (iarete=0 ; iarete<nb_aretes_divis ; iarete++)
2504 fa7 = tab_aretesMarquees(iarete,0);
2505 isom = tab_aretesMarquees(iarete,1);
2506 isom_s = (isom+1)%nb_som_par_facette;
2508 som = facettes(fa7,isom);
2510 som_s = facettes(fa7,isom_s);
2512 pe_somD = tab_aretesMarquees(iarete,2);
2513 numOwner_somD = tab_aretesMarquees(iarete,3);
2524 somD = numOwner_somD;
2527 tab_fa7Divis(fa7,isom) = somD;
2532 int nb_areteScinder, isom0=-1,isom1=-1;
2533 for (fa7=0 ; fa7<nb_facettes0 ; fa7++)
2536 nb_areteScinder = 0;
2537 for (isom=0 ; isom<nb_aretes_par_facette ; isom++)
2539 if (tab_fa7Divis(fa7,isom)>=0)
2541 if (nb_areteScinder==0)
2552 if (nb_areteScinder==1)
2555 somD = tab_fa7Divis(fa7,isom0);
2557 isom_s = (isom0+1)%nb_som_par_facette;
2558 som_s = facettes(fa7,isom_s);
2559 facettes(fa7,isom_s) = somD;
2566 isom_ss = (isom_s+1)%nb_som_par_facette;
2567 som_ss = facettes(fa7,isom_ss);
2570 facettes(nb_facettes,isom0) = somD;
2571 facettes(nb_facettes,isom_s) = som_s;
2575 facettes(nb_facettes,0) = som_ss;
2576 facettes(nb_facettes,1) = somD;
2577 facettes(nb_facettes,2) = som_s;
2581 else if (nb_areteScinder==2)
2585 if (nb_facettes+2>=facettes.
dimension(0))
2591 if (isom1==(isom0+1)%nb_som_par_facette)
2601 isom_ss = ((isom_s+1)%nb_som_par_facette);
2602 som = facettes(fa7,isom);
2603 som_s = facettes(fa7,isom_s);
2604 som_ss = facettes(fa7,isom_ss);
2605 somD = tab_fa7Divis(fa7,isom);
2606 somD_s = tab_fa7Divis(fa7,isom_s);
2607 somD_ss = tab_fa7Divis(fa7,isom_ss);
2609 facettes(fa7,0) = som;
2610 facettes(fa7,1) = somD;
2611 facettes(fa7,2) = som_ss;
2613 facettes(nb_facettes,0) = somD;
2614 facettes(nb_facettes,1) = som_s;
2615 facettes(nb_facettes,2) = somD_s;
2618 facettes(nb_facettes,0) = somD;
2619 facettes(nb_facettes,1) = somD_s;
2620 facettes(nb_facettes,2) = som_ss;
2623 else if (nb_areteScinder==3)
2627 if (nb_facettes+3>=facettes.
dimension(0))
2635 som = facettes(fa7,isom);
2636 som_s = facettes(fa7,isom_s);
2637 som_ss = facettes(fa7,isom_ss);
2638 somD = tab_fa7Divis(fa7,isom);
2639 somD_s = tab_fa7Divis(fa7,isom_s);
2640 somD_ss = tab_fa7Divis(fa7,isom_ss);
2642 facettes(fa7,0) = som;
2643 facettes(fa7,1) = somD;
2644 facettes(fa7,2) = somD_ss;
2646 facettes(nb_facettes,0) = somD;
2647 facettes(nb_facettes,1) = som_s;
2648 facettes(nb_facettes,2) = somD_s;
2651 facettes(nb_facettes,0) = somD_s;
2652 facettes(nb_facettes,1) = som_ss;
2653 facettes(nb_facettes,2) = somD_ss;
2656 facettes(nb_facettes,0) = somD;
2657 facettes(nb_facettes,1) = somD_s;
2658 facettes(nb_facettes,2) = somD_ss;
2667 ArrOfIntFT liste_sommets_sortis;
2668 ArrOfIntFT numero_face_sortie;
2669 maillage.
deplacer_sommets(tab_somD,tab_deplacement_somD,liste_sommets_sortis,numero_face_sortie);
2673 <<
" nb_aretes_divisees="<< nb_aretes_divis<<finl;
2676 Process::Journal()<<
"FIN Remaillage_FT::diviser_grandes_aretes " <<
" nb_aretes_divisees_tot="<< nb_aretes_divis_tot<<finl;
2679 statistics().end_count(
"Diviser_grandes_aretes");
2681 return nb_aretes_divis_tot;
2687 int pe0,
int numOwner0,
int pe1,
int numOwner1,
int sommet_face_bord1,
2688 int peRequete,
int fa7_peR,
int iarete_fa7_peR)
const
2690 int res = nb_tab_aretes;
2692 if (nb_tab_aretes>=tab_aretes.
dimension(0))
2698 tab_aretes(nb_tab_aretes,0) = pe0;
2699 tab_aretes(nb_tab_aretes,1) = numOwner0;
2700 tab_aretes(nb_tab_aretes,2) = pe1;
2701 tab_aretes(nb_tab_aretes,3) = numOwner1;
2702 tab_aretes(nb_tab_aretes,4) = sommet_face_bord1;
2703 tab_aretes(nb_tab_aretes,5) = peRequete;
2704 tab_aretes(nb_tab_aretes,6) = fa7_peR;
2705 tab_aretes(nb_tab_aretes,7) = iarete_fa7_peR;
2716 int pe0,
int numOwner0,
int pe1,
int numOwner1)
const
2718 int pe0_=-1,numOwner0_=-1, pe1_=-1,numOwner1_=-1;
2720 const int nb_tab_aretes = tab_index.
size_array();
2722 if (tmp>=nb_tab_aretes)
2727 while (tmp<nb_tab_aretes && trouve==-1)
2729 iarete = tab_index[tmp];
2730 pe0_ = tab_aretes(iarete,0);
2731 numOwner0_ = tab_aretes(iarete,1);
2732 pe1_ = tab_aretes(iarete,2);
2733 numOwner1_ = tab_aretes(iarete,3);
2734 if ( pe0_<pe0 || (pe0_==pe0 && numOwner0_<numOwner0)
2735 || (pe0_==pe0 && numOwner0_==numOwner0 && pe1_<pe1)
2736 || (pe0_==pe0 && numOwner0_==numOwner0 && pe1_==pe1 && numOwner1_<numOwner1) )
2745 if (! (pe0_==pe0 && numOwner0_==numOwner0 && pe1_==pe1 && numOwner1_==numOwner1) )
2780 ArrOfInt& tab_somD, DoubleTab& tab_deplacement_somD,
int drap)
const
2783 int nb_aretesMarquees = 0;
2784 tab_aretesMarquees.
resize(10,4);
2790 static IntTabFT tab_arete_somD(10,4);
2791 static IntTabFT tab_aretes(10,10);
2793 int nb_tab_aretes = 0;
2794 static DoubleTabFT tab_criteres(10,6);
2798 const int nb_sommets = maillage.
nb_sommets();
2800 const IntTab& facettes = maillage.
facettes();
2801 DoubleTab& sommets = maillage.
sommets_;
2807 const int nb_som_par_facette = facettes.
dimension(1);
2808 const int nb_aretes_par_facette = (dimension3)?3:1;
2809 const int _MOI_ =
me();
2817 int fa7, isom,som,pe,numOwner, isom_s,som_s,pe_s,numOwner_s, indice, tmp;
2820 for (fa7=0 ; fa7<nb_facettes ; fa7++)
2827 for (isom=0 ; isom<nb_aretes_par_facette ; isom++)
2830 isom_s = (isom+1)%nb_som_par_facette;
2831 som = facettes(fa7,isom);
2832 som_s = facettes(fa7,isom_s);
2833 pe = sommet_PE_owner[som];
2834 numOwner = sommet_num_owner[som];
2835 pe_s = sommet_PE_owner[som_s];
2836 numOwner_s = sommet_num_owner[som_s];
2837 tmp = FTd_compare_sommets_global(pe,numOwner,pe_s,numOwner_s);
2845 pe = sommet_PE_owner[som];
2846 numOwner = sommet_num_owner[som];
2847 pe_s = sommet_PE_owner[som_s];
2848 numOwner_s = sommet_num_owner[som_s];
2856 buffer << pe << numOwner << pe_s << numOwner_s << sommet_face_bord[som_s];
2858 buffer << fa7 << isom;
2860 buffer << sommets(som_s,0) << sommets(som_s,1);
2862 buffer << sommets(som_s,2);
2869 tmp =
inserer_tab_aretes(nb_tab_aretes,tab_aretes,tab_criteres,pe,numOwner,pe_s,numOwner_s, sommet_face_bord[som_s], _MOI_,fa7,isom);
2870 tab_criteres(tmp,0) = sommets(som_s,0);
2871 tab_criteres(tmp,1) = sommets(som_s,1);
2872 tab_criteres(tmp,2) = (dimension3) ? sommets(som_s,2) : 0;
2873 tab_criteres(tmp,3) = tab_criteres(tmp,4) = tab_criteres(tmp,5) = -1.;
2884 buffer << pe << numOwner << pe_s << numOwner_s << sommet_face_bord[som_s];
2886 buffer << fa7 << isom;
2888 buffer << sommets(som,0) << sommets(som,1);
2890 buffer << sommets(som,2);
2897 tmp =
inserer_tab_aretes(nb_tab_aretes,tab_aretes,tab_criteres,pe,numOwner,pe_s,numOwner_s, sommet_face_bord[som_s], -1,-1,-1);
2898 tab_criteres(tmp,0) = sommets(som,0);
2899 tab_criteres(tmp,1) = sommets(som,1);
2900 tab_criteres(tmp,2) = (dimension3) ? sommets(som,2) : 0;
2901 tab_criteres(tmp,3) = tab_criteres(tmp,4) = tab_criteres(tmp,5) = -1.;
2908 int peV, pe0,numOwner0, pe1,numOwner1, iarete, face_bord1;
2925 const int nb_pe_voisins = pe_voisins.
size_array();
2927 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
2929 peV = pe_voisins[indice_pe];
2932 while (!buffer.
eof())
2934 buffer >> numOwner0 >> pe1 >> numOwner1 >> face_bord1;
2935 buffer >> fa7 >> isom;
2940 assert(pe0==_MOI_ || pe1==_MOI_);
2942 tmp =
inserer_tab_aretes(nb_tab_aretes,tab_aretes,tab_criteres,pe0,numOwner0,pe1,numOwner1,face_bord1, peV,fa7,isom);
2943 tab_criteres(tmp,0) = x;
2944 tab_criteres(tmp,1) = y;
2945 tab_criteres(tmp,2) = z;
2946 tab_criteres(tmp,3) = tab_criteres(tmp,4) = tab_criteres(tmp,5) = -1.;
2964 ArrOfIntFT tab_index(nb_tab_aretes);
2965 for (indice=0 ; indice<nb_tab_aretes ; indice++)
2967 tab_index[indice] = indice;
2969 std::sort(tab_index.
begin(), tab_index.
end(), [&](
int a,
int b)
2971 int cmp = FTd_compare_sommets_global(tab_aretes(a,0), tab_aretes(a,1), tab_aretes(b,0), tab_aretes(b,1));
2973 cmp = FTd_compare_sommets_global(tab_aretes(a,2), tab_aretes(a,3), tab_aretes(b,2), tab_aretes(b,3));
2976 double lgr2=-1.,lgr_ideale02=-1.,lgr_ideale12,d;
2977 int pe0p,numOwner0p,pe1p,numOwner1p;
2978 pe0p = numOwner0p = pe1p = numOwner1p = -1;
2985 for (indice=0 ; indice<nb_tab_aretes ; indice++)
2987 iarete = tab_index[indice];
2988 pe0 = tab_aretes(iarete,0);
2989 numOwner0 = tab_aretes(iarete,1);
2990 pe1 = tab_aretes(iarete,2);
2991 numOwner1 = tab_aretes(iarete,3);
2992 if (FTd_compare_sommets_global(pe1,numOwner1,pe1p,numOwner1p)!=0 || FTd_compare_sommets_global(pe0,numOwner0,pe0p,numOwner0p)!=0)
2996 lgr2 = lgr_ideale02 = lgr_ideale12 = -1.;
3001 d = tab_criteres(iarete,0) - sommets(numOwner0,0);
3003 d = tab_criteres(iarete,1) - sommets(numOwner0,1);
3007 d = tab_criteres(iarete,2) - sommets(numOwner0,2);
3021 tab_criteres(iarete,3) = lgr2;
3022 tab_criteres(iarete,4) = lgr_ideale02;
3023 tab_criteres(iarete,5) = lgr_ideale12;
3025 numOwner0p = numOwner0;
3027 numOwner1p = numOwner1;
3036 static ArrOfIntFT recv_pe_list;
3037 static ArrOfIntFT send_pe_list;
3045 for (iarete=0 ; iarete<nb_tab_aretes ; iarete++)
3047 pe0 = tab_aretes(iarete,0);
3048 pe1 = tab_aretes(iarete,2);
3054 if (drap_per[pe1]==0)
3062 if (drap_pes[pe0]==0)
3069 array_trier_retirer_doublons(send_pe_list);
3070 array_trier_retirer_doublons(recv_pe_list);
3077 pe0p = numOwner0p = pe1p = numOwner1p = -1;
3078 for (indice=0 ; indice<nb_tab_aretes ; indice++)
3080 iarete = tab_index[indice];
3081 pe0 = tab_aretes(iarete,0);
3082 pe1 = tab_aretes(iarete,2);
3083 if (pe1==_MOI_ && pe0!=_MOI_)
3087 numOwner0 = tab_aretes(iarete,1);
3088 numOwner1 = tab_aretes(iarete,3);
3089 if (FTd_compare_sommets_global(pe1,numOwner1,pe1p,numOwner1p)!=0 || FTd_compare_sommets_global(pe0,numOwner0,pe0p,numOwner0p)!=0)
3092 lgr_ideale12 = tab_criteres(iarete,5);
3094 buffer << pe0 << numOwner0 << pe1 << numOwner1 << lgr_ideale12;
3096 numOwner0p = numOwner0;
3098 numOwner1p = numOwner1;
3110 const int nb_pe_voisins = pe_voisins.
size_array();
3111 int peVoi, pe0bis,numOwner0bus, pe1bis,numOwner1bis, trouve;
3112 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
3114 peVoi = pe_voisins[indice_pe];
3117 while (!buffer.
eof())
3119 buffer >> numOwner0bus >> pe1bis >> numOwner1bis >> lgr_ideale12;
3120 assert(pe1bis==peVoi && pe0bis!=peVoi);
3125 tmp =
chercher_arete_tab(tmp,tab_index,tab_aretes, pe0bis,numOwner0bus,pe1bis,numOwner1bis);
3129 iarete = tab_index[tmp];
3130 tab_criteres(iarete,5) = lgr_ideale12;
3137 Process::Journal()<<
" arete=("<<tab_aretes(iarete,0)<<
"-"<<tab_aretes(iarete,1)<<
" / "<<tab_aretes(iarete,2)<<
"-"<<tab_aretes(iarete,3);
3138 Process::Journal()<<
" crit=("<<tab_criteres(iarete,3)<<
" / "<<tab_criteres(iarete,4)<<
" / "<<tab_criteres(iarete,5)<<finl;
3139 tmp =
chercher_arete_tab(tmp,tab_index,tab_aretes, pe0bis,numOwner0bus,pe1bis,numOwner1bis);
3155 ArrOfIntFT liste_pe, liste_sommets;
3157 const double tolerance_longueur_arete = 1 +
critere_arete_ * ((drap>0) ? 1. : -1);
3159 const double coeff2 = tolerance_longueur_arete * tolerance_longueur_arete;
3160 double critere, lgrIdeale2;
3163 pe0p = numOwner0p = pe1p = numOwner1p = -1;
3164 for (indice=0 ; indice<nb_tab_aretes ; indice++)
3166 iarete = tab_index[indice];
3167 pe0 = tab_aretes(iarete,0);
3171 numOwner0 = tab_aretes(iarete,1);
3172 pe1 = tab_aretes(iarete,2);
3173 numOwner1 = tab_aretes(iarete,3);
3174 if (FTd_compare_sommets_global(pe1,numOwner1,pe1p,numOwner1p) != 0
3175 || FTd_compare_sommets_global(pe0,numOwner0,pe0p,numOwner0p) != 0)
3180 lgrIdeale2 = 0.5 * (tab_criteres(iarete,4) + tab_criteres(iarete,5));
3181 assert(lgrIdeale2>0);
3185 lgr2 = tab_criteres(iarete,3);
3187 critere = lgr2 / (lgrIdeale2 * coeff2);
3191 test = (drap>0)? (critere<1) : (critere>1);
3193 tab_aretes(iarete,8) = test;
3194 if (drap>0 && !test)
3200 for (isom=0 ; isom<nb_somD && tmp==-1 ; isom++)
3202 if (FTd_compare_sommets_global(pe0,numOwner0,tab_arete_somD(isom,0),tab_arete_somD(isom,1))==0
3203 && FTd_compare_sommets_global(pe1,numOwner1,tab_arete_somD(isom,2),tab_arete_somD(isom,3))==0)
3211 if (NV_nb_sommets>=sommets.
dimension(0))
3213 tmp = NV_nb_sommets+10;
3221 sommets(NV_nb_sommets,0) = sommets(numOwner0,0);
3222 sommets(NV_nb_sommets,1) = sommets(numOwner0,1);
3224 sommets(NV_nb_sommets,2) = sommets(numOwner0,2);
3225 sommet_elem[NV_nb_sommets] = sommet_elem[numOwner0];
3226 face_bord1 = tab_aretes(iarete,4);
3230 sommet_face_bord[NV_nb_sommets] = sommet_face_bord[numOwner0];
3234 sommet_face_bord[NV_nb_sommets] = -1;
3236 sommet_PE_owner[NV_nb_sommets] = sommet_PE_owner[numOwner0];
3237 sommet_num_owner[NV_nb_sommets] = NV_nb_sommets;
3238 drapeaux_sommets[NV_nb_sommets] = drapeaux_sommets[numOwner0];
3248 tab_somD[nb_somD] = NV_nb_sommets;
3250 tab_deplacement_somD(nb_somD,0) = 0.5 * ( tab_criteres(iarete,0) - sommets(NV_nb_sommets,0) );
3251 tab_deplacement_somD(nb_somD,1) = 0.5 * ( tab_criteres(iarete,1) - sommets(NV_nb_sommets,1) );
3253 tab_deplacement_somD(nb_somD,2) = 0.5 * ( tab_criteres(iarete,2) - sommets(NV_nb_sommets,2) );
3255 tab_arete_somD(nb_somD,0) = tab_aretes(iarete,0);
3256 tab_arete_somD(nb_somD,1) = tab_aretes(iarete,1);
3257 tab_arete_somD(nb_somD,2) = tab_aretes(iarete,2);
3258 tab_arete_somD(nb_somD,3) = tab_aretes(iarete,3);
3260 tmp = NV_nb_sommets;
3265 tmp = tab_somD[tmp];
3268 tab_aretes(iarete,9) = tmp;
3270 int peReq = tab_aretes(iarete,5);
3279 test = (NV_nb_sommets!=nb_sommets);
3285 tmp = NV_nb_sommets;
3307 pe0p = numOwner0p = pe1p = numOwner1p = -1;
3308 for (indice=0 ; indice<nb_tab_aretes ; indice++)
3310 iarete = tab_index[indice];
3311 pe0 = tab_aretes(iarete,0);
3315 numOwner0 = tab_aretes(iarete,1);
3316 pe1 = tab_aretes(iarete,2);
3317 numOwner1 = tab_aretes(iarete,3);
3318 if (FTd_compare_sommets_global(pe1,numOwner1,pe1p,numOwner1p)!=0 || FTd_compare_sommets_global(pe0,numOwner0,pe0p,numOwner0p)!=0)
3321 test = tab_aretes(iarete,8);
3325 peReq = tab_aretes(iarete,5);
3326 fa7 = tab_aretes(iarete,6);
3327 isom = tab_aretes(iarete,7);
3331 som = tab_aretes(iarete,9);
3342 if (nb_aretesMarquees>=tab_aretesMarquees.
dimension(0))
3344 tab_aretesMarquees.
resize(nb_aretesMarquees+10,tab_aretesMarquees.
dimension(1));
3346 tab_aretesMarquees(nb_aretesMarquees,0) = fa7;
3347 tab_aretesMarquees(nb_aretesMarquees,1) = isom;
3348 tab_aretesMarquees(nb_aretesMarquees,2) = _MOI_;
3349 tab_aretesMarquees(nb_aretesMarquees,3) = som;
3350 nb_aretesMarquees++;
3356 buffer << fa7 << isom << som;
3370 const int nb_pe_voisins = pe_voisins.
size_array();
3372 for (
int indice_pe = 0; indice_pe < nb_pe_voisins; indice_pe++)
3374 peVbis = pe_voisins[indice_pe];
3377 while (!buffer.
eof())
3379 buffer >> isom >> som;
3380 assert(_MOI_!=peVbis);
3382 if (nb_aretesMarquees>=tab_aretesMarquees.
dimension(0))
3384 tab_aretesMarquees.
resize(nb_aretesMarquees+10,tab_aretesMarquees.
dimension(1));
3386 tab_aretesMarquees(nb_aretesMarquees,0) = fa7;
3387 tab_aretesMarquees(nb_aretesMarquees,1) = isom;
3388 tab_aretesMarquees(nb_aretesMarquees,2) = peVbis;
3389 tab_aretesMarquees(nb_aretesMarquees,3) = som;
3390 nb_aretesMarquees++;
3399 tab_aretesMarquees.
resize(nb_aretesMarquees,tab_aretesMarquees.
dimension(1));
3401 tab_deplacement_somD.
resize(nb_somD,tab_deplacement_somD.
dimension(1));
3422 double perimetre2 = 0.,d;
3425 d = som1[k] - som0[k];
3430 d = som2[k] - som1[k];
3435 d = som0[k] - som2[k];
3439 assert(perimetre2>0.);
3444 vect[0] = (som1[1]-som0[1]) * (som2[2]-som0[2]) - (som1[2]-som0[2]) * (som2[1]-som0[1]);
3445 vect[1] = (som1[2]-som0[2]) * (som2[0]-som0[0]) - (som1[0]-som0[0]) * (som2[2]-som0[2]);
3446 vect[2] = (som1[0]-som0[0]) * (som2[1]-som0[1]) - (som1[1]-som0[1]) * (som2[0]-som0[0]);
3449 aire += vect[k]*vect[k];
3451 aire = sqrt(aire)/2.;
3454 if (
impr_>9000 && aire<=0.)
3456 Cerr<<
"PB qualiteTriangle :"<<finl;
3457 Cerr<<
" som0 "<<
" coord= "<<som0[0]<<
" "<<som0[1]<<
" "<<som0[2]<<finl;
3458 Cerr<<
" som1 "<<
" coord= "<<som1[0]<<
" "<<som1[1]<<
" "<<som1[2]<<finl;
3459 Cerr<<
" som2 "<<
" coord= "<<som2[0]<<
" "<<som2[1]<<
" "<<som2[2]<<finl;
3460 Cerr<<
" perimetre= "<<perimetre2<<finl;
3461 Cerr<<
" vect= "<<vect[0]<<
" "<<vect[1]<<
" "<<vect[2]<<
" aire= "<<aire<<finl;
3465 const double sq3x4 = sqrt(3.) * 4.;
3467 double qual = sq3x4 * aire / perimetre2;
3487 const int nb_som_par_facette = facettes.
dimension(1);
3489 int fa7,isom, nb_fa70 = 0;
3491 for (fa7=0 ; fa7<nb_facettes ; fa7++)
3493 if (surface_facettes[fa7]<=0.)
3495 for (isom=1 ; isom<nb_som_par_facette ; isom++)
3497 facettes(fa7,isom) = facettes(fa7,0);
3506 Process::Journal()<<
"Remaillage_FT::supprimer_facettes_nulles nb_fa70="<<nb_fa70<<finl;
3543 ArrOfDouble& dvolume)
const
3545 const IntTab& facettes = maillage.
facettes();
3546 const DoubleTab& sommets = maillage.
sommets();
3547 const int nb_facettes = facettes.
dimension(0);
3549 const ArrOfDouble& surface_facettes =
3557 double l_min = 1e10;
3559 int total_count = 0;
3560 const double one_third = 1. / 3.;
3564 for (i_facette = 0; i_facette < nb_facettes; i_facette++)
3571 const int s1 = facettes(i_facette, 0);
3572 const int s2 = facettes(i_facette, 1);
3573 const double x1 = sommets(s1, 0);
3574 const double x2 = sommets(s2, 0);
3575 const double dx = x2 - x1;
3576 const double dy = sommets(s2, 1) - sommets(s1, 1);
3577 const double l2 = dx * dx + dy * dy;
3580 const double inv_l = 1. / sqrt(l2);
3581 const double inv_l2 = 1. / (l2);
3585 const double c1 = courbure[s1];
3586 const double c2 = courbure[s2];
3587 const double gradient_c = (c2 - c1) / sqrt(l2);
3593 if ((std::fabs(gradient_c)>= criterion1)||(std::fabs(gradient_c)>= criterion2))
3597 h = (x1+x2) * 0.5 * angle_bidim_axi;
3598 const double flux = gradient_c * h;
3599 dvolume[s1] += flux;
3600 dvolume[s2] -= flux;
3612 for (i = 0; i < 3; i++)
3614 const int s = facettes(i_facette, i);
3617 for (j = 0; j < 3; j++)
3618 coord[i][j] = sommets(s, j);
3620 const double surface = surface_facettes[i_facette];
3622 for (i = 0; i < 3; i++)
3624 const double dx = coord[i_suiv][0] - coord[i][0];
3625 const double dy = coord[i_suiv][1] - coord[i][1];
3626 const double dz = coord[i_suiv][2] - coord[i][2];
3628 const double l2 = dx * dx + dy * dy + dz * dz;
3631 const double inv_l = (l2 == 0.) ? 1. : 1. / sqrt(l2);
3632 const double inv_l2 = (l2 == 0.) ? 1. : 1. / (l2);
3633 const double c1 = c[i];
3634 const double c2 = c[i_suiv];
3635 const double gradient_c = (c2 - c1) * inv_l;
3641 if ((std::fabs(gradient_c)>= criterion1)||(std::fabs(gradient_c)>= criterion2))
3644 const double h = (surface * inv_l) * one_third;
3647 const double flux = gradient_c * h;
3649 const int s1 = som[i];
3650 const int s2 = som[i_suiv];
3651 dvolume[s1] += flux;
3652 dvolume[s2] -= flux;
3662 Journal() <<
"Proportion of smoothed aretes (similar to sommets) " << 100.*count/total_count <<
" %" << finl;
3665 const double coeff_dt = l_min * l_min * coeff;
3666 dvolume *= coeff_dt;
3670 const DoubleVect& volume = refdomaine_VF_->volumes();
3672 double lost_volume = 0.;
3673 int nb_som_reels = 0;
3674 for (
int s = 0; s < maillage.
nb_sommets(); s++)
3682 if (dvolume[s]>volume[elem] )
3684 lost_volume += dvolume[s]-volume[elem];
3685 dvolume[s] = volume[elem];
3688 if (-dvolume[s]>volume[elem] )
3690 lost_volume += dvolume[s]+volume[elem];
3691 dvolume[s] = -volume[elem];
3701 Cerr <<
"[Remaillage_FT::regulariser_courbure] Clipping of var volume in "
3702 << clip <<
" elems. time = " << maillage.
temps()
3703 <<
" Volume redistributed over the whole interface = "
3704 << lost_volume << finl;
3709 lost_volume /=nb_som_reels;
3710 for (
int s = 0; s < maillage.
nb_sommets(); s++)
3712 dvolume[s] += lost_volume;
static int check_enabled()
static void verifier_tableau_sommets(const char *msg, const Maillage_FT_Disc &, const ArrOfDouble &)
static void verifier_maillage_ft(const char *msg, const Maillage_FT_Disc &)
: class Desc_Structure_FT
void collecter_espace_virtuel(ArrOfDouble &tab, MD_Vector_tools::Operations_echange op) const
void echange_espace_virtuel(ArrOfDouble &tab) const
void calcul_schema_comm(const int nb_items_tot)
const Schema_Comm & schema_comm() const
const Schema_Comm & schema_comm_inverse() const
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
static int is_ecriture_special(int &special, int &a_faire)
indique si le format special a ete demande en lecture active par sauvegarde xyz .
Class defining operators and methods for all reading operation in an input flow (file,...
: class Maillage_FT_Disc Cette classe decrit un maillage:
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.
const ArrOfInt & sommet_num_owner() const
pour postraitement, renvoie le numero des sommets sur le PE proprietaire des sommets
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,
Sortie & printSom(int som, Sortie &os) const
void corriger_proprietaires_facettes()
Sans changer les sommets existants ni la numerotation des facettes, on change le proprietaire des fac...
void update_tableau_apres_transport(ArrOfDouble &tableau, int nb_elements, const Desc_Structure_FT &descripteur) const
Voir preparer_tableau_avant_transport.
ArrOfIntFT sommet_PE_owner_
Desc_Structure_FT desc_facettes_
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_
int sommet_ligne_contact(int i) const
virtual void nettoyer_maillage()
Retire toutes les facettes virtuelles, toutes les facettes invalides (sommet0 == sommet1) et tous les...
Desc_Structure_FT desc_sommets_
int facette_virtuelle(int i) const
Renvoie 0 si la facette m'appartient, 1 sinon.
double temps() const
return temps_physique_ (temps_physique_ ne sert a rien en interne.
void maillage_modifie(Statut_Maillage nouveau_statut)
Cette methode change le statut du maillage et invalide le cache de valeurs calculees (surface,...
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_
void creer_sommets_virtuels_numowner(const ArrOfInt &request_sommets_pe, const ArrOfInt &request_sommets_num)
Cree chez moi les sommets virtuels specifies par le couple (pe,num) si le sommet n'existe pas encore.
virtual const DoubleTab & get_update_normale_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
void convertir_numero_distant_local(const Desc_Structure_FT &descripteur, const ArrOfInt &element_num_owner, const ArrOfInt &numeros_distants, const ArrOfInt &pe_distant, ArrOfInt &numeros_locaux) const
Conversion des couples (numeros_distants, pe) en numeros_locaux.
const Desc_Structure_FT & desc_facettes() const
renvoie le descripteur des facettes (espace_distant/virtuel)
ArrOfIntFT drapeaux_sommets_
int sommet_virtuel(int i) const
const ArrOfInt & sommet_PE_owner() const
pour postraitement, renvoie le numero du PE proprietaire des sommets
virtual void deplacer_sommets(const ArrOfInt &liste_sommets_initiale, const DoubleTab &deplacement_initial, ArrOfInt &liste_sommets_sortis, ArrOfInt &numero_face_sortie, int skip_facettes=0)
Applique un vecteur deplacement aux noeuds dont le numero est dans "liste_noeud", puis echange les es...
virtual void transporter(const DoubleTab &deplacement)
Deplace les sommets de l'interface d'un vecteur "deplacement" fourni, Change eventuellement les somme...
void nettoyer_elements_virtuels()
Retire toutes les facettes virtuelles et tous les sommets qui ne sont pas utilises.
virtual const ArrOfDouble & get_update_surface_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
virtual const ArrOfDouble & get_update_courbure_sommets() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
Sortie & printFa7(int fa7, int affsom, Sortie &os) const
static double angle_bidim_axi()
renvoie l'angle solide qui sert a calculer les surfaces et les volumes en bidim_axi
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
const ArrOfInt & sommet_elem() const
pour postraitement, renvoie sommet_elem_
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.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
void calculer_normale_face_bord(int num_face, double x, double y, double z, double &nx_, double &ny_, double &nz_) const
void projeter_vecteur_sur_face(const int num_face, double &x_, double &y_, double &z_) const
Methode outil utilisee pour le traitement des lignes de contact.
static double mp_min(double)
static int check_int_overflow(trustIdType)
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),...
: class Remaillage_FT Cette classe implemente les procedures de remaillage des interfaces pour le Fro...
int calculer_correction_deplacement(DoubleTab &deplacement, const ArrOfDouble &varVolume, const DoubleTab &deplacement_varVolume, const ArrOfDouble &norme2_deplacement_varVolume) const
Cette fonction calcule une correction sur un deplacement liee a une variation de volume imposee Utile...
int supprimer_facettes_bord(Maillage_FT_Disc &maillage) const
Cette fonction marque a supprimer les facettes ayant leurs 3 sommets de bord Marquer a supprimer = co...
int diviser_grandes_aretes(Maillage_FT_Disc &maillage) const
Cette fonction divise les grandes aretes en 2.
int nb_iter_barycentrage_
int sauvegarder(Sortie &) const override
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
int chercher_arete_tab(int tmp, const ArrOfInt &tab_index, const IntTab &tab_aretes, int pe0, int numOwner0, int pe1, int numOwner1) const
int lissage_courbure_iterations_old_
int lissage_courbure_iterations_systematique_
double regulariser_maillage(Maillage_FT_Disc &maillage, ArrOfDouble &var_volume, const double facteur_barycentrage_tangent, const double coeff_lissage, const int nb_iter_barycentrage, const int nb_iter_lissage, const int max_nb_iter_correction_volume, const double seuil_dvolume) const
Algorithme general de lissage du maillage.
int traite_decollement(Maillage_FT_Disc &maillage, const DoubleTab &deplacement) const
Cette fonction permet de gerer le decollement de l'interface de la paroi Si un sommet de bord n'a pas...
int supprimer_facettes_nulles(Maillage_FT_Disc &maillage) const
Cette fonction "supprime" les facettes de surface nulle : Elle les reduit a 1 sommet (le sommet 0,...
void barycentrer_lisser_systematique(double temps, Maillage_FT_Disc &maillage)
applique barycentrage, lissage et correction de volume.
int a_remailler(double temps, const Maillage_FT_Disc &maillage) const
int nb_iter_bary_volume_seul_
virtual double calculer_longueurIdeale2_arete(const Maillage_FT_Disc &maillage, int som0, double x, double y, double z) const
Cette fonction calcule le carre de la longueur ideale d'une arete Dans un premier,...
void set_param(Param &p) const override
Methode appelee par readOn.
double calculer_variation_volume_facette_3D(int fa7, const Maillage_FT_Disc &maillage, const DoubleTab &position_initiale) const
int traite_adherence(Maillage_FT_Disc &maillage) const
Cette fonction permet de gerer l'adherence de l'interface a la paroi Si une facette possede 3 sommets...
double redistribuer_sommets(Maillage_FT_Disc &maillage, const double relaxation_direction_tangente, const double relaxation_direction_normale, ArrOfDouble &var_volume_impose, ArrOfDouble &var_volume_obtenu) const
Deplace les sommets du maillage pour les redistribuer de facon homogene.
int lissage_courbure_iterations_si_remaillage_
int inserer_tab_aretes(int &nb_tab_aretes, IntTab &tab_aretes, DoubleTab &tab_criteres, int pe0, int numOwner0, int pe1, int numOwner1, int face_bord1, int peRequete, int fa7_peR, int iarete_fa7_peR) const
int permuter_aretes(Maillage_FT_Disc &maillage) const
Cette fonction effectue des permutations d'aretes afin d'ameliorer la qualite du maillage.
void associer_domaine(const Domaine_dis_base &domaine_dis)
Cette fonction stocke le domaine_dis dans refdomaine_dis_.
int marquer_aretes(Maillage_FT_Disc &maillage, IntTab &tab_aretesMarquees, ArrOfInt &tab_somD, DoubleTab &tab_deplacement_somD, int drap) const
void remaillage_local_interface(double temps, Maillage_FT_Disc &maillage)
Verifie les criteres de remaillage locaux (longueur des aretes) et effectue les remaillages locaux si...
double calculer_variation_volume(const Maillage_FT_Disc &maillage, const DoubleTab &position_initiale, ArrOfDouble &varVolume) const
Cette fonction calcule le volume de phase 0 engendre par chaque sommet lors du deplacement de l'inter...
int nettoyer_maillage(Maillage_FT_Disc &maillage) const
Cette fonction nettoie le maillage : Elle supprime les facettes reduites a 1 sommet.
double calculer_variation_volume_facette_2D(int fa7, const Maillage_FT_Disc &maillage, const DoubleTab &position_initiale) const
Cette fonction calcule la difference de volume au niveau d'une facette par rapport a une position ini...
double lissage_courbure_coeff_
double facteur_longueur_ideale_
double calculer_volume_sommets_supprimes(const Maillage_FT_Disc &maillage, const ArrOfInt &tab_somSupp, ArrOfDouble &varVolume) const
Cette fonction calcule la variation de volume liee a la suppression de sommets.
int supprimer_doublons_facettes(Maillage_FT_Disc &maillage) const
Cette fonction marque a supprimer les facettes en double.
double qualiteTriangle(const FTd_vecteur3 &som0, const FTd_vecteur3 &som1, const FTd_vecteur3 &som2, double &aire) const
Cette methode calcule, pour un triangle donne, sa qualite : celle-ci est comprise dans ]0,...
double seuil_dvolume_residuel_
int reprendre(Entree &) override
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
void lisser_dvolume(const Maillage_FT_Disc &maillage, ArrOfDouble &var_volume, const int nb_iterations) const
Regularise le champ scalaire "var_volume" defini aux sommets du "maillage".
int a_lisser(double temps) const
void corriger_volume_(Maillage_FT_Disc &maillage, ArrOfDouble &var_volume, const int nb_iter_corrections_vol)
double relax_barycentrage_
double temps_dernier_remaillage_
virtual void regulariser_courbure(Maillage_FT_Disc &maillage, const double coeff, ArrOfDouble &dvolume) const
Regularise le maillage en deplacant les sommets pour reduire les gradients de courbure.
void corriger_volume(Maillage_FT_Disc &maillage, ArrOfDouble &var_volume)
deplacement des sommets se sorte a produire la variation de volume prescrite a chaque sommet.
double temps_dernier_lissage_
int calculer_barycentre_facettes_voisines(const Maillage_FT_Disc &maillage, DoubleTab &barycentres) const
Cette fonction calcule pour chaque sommet le barycentre de l'ensemble des facettes voisines du sommet...
int calculer_connectivites_sommetFacettes(const Maillage_FT_Disc &maillage, ArrOfInt &fa7VoisinesSom_index, IntTab &fa7VoisinesSom_data) const
Cette fonction calcule les connectivites sommet ->facettes voisines Les facettes voisines des sommets...
double valeur_longueur_fixe_
int supprimer_petites_aretes(Maillage_FT_Disc &maillage, ArrOfDouble &varVolume) const
A l'aide de "marquer_aretes", on determine les aretes trop petites du maillage.
void barycentrer_lisser_apres_remaillage(Maillage_FT_Disc &maillage, ArrOfDouble &var_volume)
idem mais avec le nombre d'iterations de lissage si remaillage
int calculer_differentielle_volume(const Maillage_FT_Disc &maillage, DoubleTab &differentielle_volume) const
Calcul de la differentielle du volume de phase 0 par rapport au deplacement de chaque sommet de l'int...
double surface_interface_
const bool & get_is_solid_particle() const
void echange_taille_et_messages() const
Cette methode lance l'echange de donnees entre tous les processeurs.
Sortie & send_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y entasser des donnees a envoyer.
void end_comm() const
Vide les buffers et libere les ressources: on a fini de lire les donnees recues dans les buffers.
Entree & recv_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y lire les donnees recues.
const ArrOfInt & get_recv_pe_list() const
void begin_comm() const
Reserve les buffers de comm pour une nouvelle communication.
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_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
static int is_PDI_checkpoint()
static int is_PDI_restart()