TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Remaillage_FT_IJK.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Remaillage_FT_IJK.h>
17#include <Param.h>
18#include <Maillage_FT_Disc.h>
19#include <Comm_Group.h>
20#include <Perf_counters.h>
21#include <iostream>
22#include <vector>
23#include <cmath>
24#include <algorithm>
25#include <numeric>
26#include <variant>
27
28using namespace std;
29
30Implemente_instanciable_sans_constructeur(Remaillage_FT_IJK,"Remaillage_FT_IJK",Remaillage_FT) ;
31
32Remaillage_FT_IJK::Remaillage_FT_IJK()
33{
34 nb_iter_barycentrage_ = 0; // Par defaut, pas de barycentrage
35 nb_iter_bary_volume_seul_ = 0; // Pas de correction de volume
37 facteur_longueur_ideale_ = -1; // Pas de redecoupage ou suppression d'arretes.
38 // Sinon, la valeur recommandee en 3D est 1.5.
39 critere_arete_ = 0.35; // Je crois que c'est sa valeur par defaut en FTD. Je n'arrive pas a le retrouver.
40 equilateral_ = 1; // Par defaut, sur maillage etire, on fait des triangles equilateraux avec
41 // un facteur_longueur qui vaut 1 si l'arrete a la meme taille que la diagonale.
42 // Comportement different du FTD classique de trio (equilateral = 0) qui regarde
43 // l'orientation de la facette pour ajuster sa taille a l'element eulerien.
44
45}
46
48{
49 // Objet_U::printOn(os);
50 os << "{\n"
51 << " pas_remaillage " << dt_remaillage_ << "\n"
52 << " nb_iter_barycentrage " << nb_iter_barycentrage_ << "\n"
53 << " relax_barycentrage " << relax_barycentrage_ << "\n";
54 os << " critere_arete " << critere_arete_ << "\n"
55 << " seuil_dvolume_residuel " << seuil_dvolume_residuel_ << "\n";
56 os << " nb_iter_correction_volume " << nb_iter_bary_volume_seul_ << "\n"
57 << " nb_iter_remaillage " << nb_iter_remaillage_ << "\n"
58 << " facteur_longueur_ideale " << facteur_longueur_ideale_ << "\n";
59 os << " equilateral " << equilateral_ << "\n"
60 << " lissage_courbure_coeff " << lissage_courbure_coeff_ << "\n"
61 << " lissage_courbure_iterations_systematique " << lissage_courbure_iterations_systematique_ << "\n"
62 << " lissage_courbure_iterations_si_remaillage " << lissage_courbure_iterations_si_remaillage_ << "\n";
63 os << " }\n" ;
64 return os;
65}
66// XD remaillage_ft_ijk interprete nul BRACE not_set
68{
69 Param p(que_suis_je());
70 p.ajouter("pas_remaillage", &dt_remaillage_); // XD_ADD_P floattant
71 // XD_CONT not_set
72 p.ajouter("nb_iter_barycentrage", &nb_iter_barycentrage_); // XD_ADD_P entier
73 // XD_CONT not_set
74 p.ajouter("relax_barycentrage", &relax_barycentrage_); // XD_ADD_P floattant
75 // XD_CONT not_set
76 p.ajouter("critere_arete", &critere_arete_); // XD_ADD_P floattant
77 // XD_CONT not_set
78 p.ajouter("seuil_dvolume_residuel", &seuil_dvolume_residuel_); // XD_ADD_P floattant
79 // XD_CONT not_set
80 p.ajouter("nb_iter_correction_volume", &nb_iter_bary_volume_seul_); // XD_ADD_P entier
81 // XD_CONT not_set
82 p.ajouter("nb_iter_remaillage", &nb_iter_remaillage_); // XD_ADD_P entier
83 // XD_CONT not_set
84 p.ajouter("facteur_longueur_ideale", &facteur_longueur_ideale_); // XD_ADD_P floattant
85 // XD_CONT not_set
86 p.ajouter("equilateral", &equilateral_); // XD_ADD_P entier
87 // XD_CONT not_set
88 p.ajouter("lissage_courbure_coeff", &lissage_courbure_coeff_); // XD_ADD_P floattant
89 // XD_CONT not_set
90 p.ajouter("lissage_courbure_iterations_systematique", &lissage_courbure_iterations_systematique_); // XD_ADD_P entier
91 // XD_CONT not_set
92 p.ajouter("lissage_courbure_iterations_si_remaillage", &lissage_courbure_iterations_si_remaillage_); // XD_ADD_P entier
93 // XD_CONT not_set
94 p.lire_avec_accolades_depuis(is);
95
96 Cout << "Remaillage_FT_IJK::readOn : Les options lues sont : " << finl;
97 p.print(Cout);
98
99 if ((dt_remaillage_ > 0. ) && (facteur_longueur_ideale_<0.))
100 {
101 Cerr << "Erreur dans les parametres de Remaillage_FT_IJK."
102 << " Il faut specifier la valeur de facteur_longueur_ideale si pas_remaillage>0."
103 << " La valeur recommandee est : facteur_longueur_ideale 1.5 (en 3D)." << finl;
105 }
106 return is;
107}
108
109
110
111
112/* methode static duplique depuis Remaillage_FT --> a faire autrement ? */
113static void SPA_choisir_sommets_remplacement(const Maillage_FT_IJK& maillage,
114 const IntTab& tab_aretesMarquees,
115 IntTab& sommets_remplacement)
116{
117 const int nb_sommets = maillage.nb_sommets();
118 const IntTab& facettes = maillage.facettes();
119 const ArrOfInt& sommet_PE_owner = maillage.sommet_PE_owner();
120 const ArrOfInt& sommet_num_owner = maillage.sommet_num_owner();
121
122 sommets_remplacement.resize(nb_sommets, 2);
123 // On initialise le tableau a "no_PE": on mettra ensuite
124 // les processeurs d'accord entre eux avec un
125 // "collecter(Descripteur_FT::MIN_COLONNE1)"
126 // Si tout le monde contient "no_PE", alors le noeud ne devra pas etre remplace.
127 const int no_PE = Process::nproc();
128 sommets_remplacement = no_PE;
129
130 // Pour chaque sommet, y a-t-il un processeur qui veut le conserver ?
131 // (le sommet sert a remplacer d'autres sommets)
132 // 0 => non sinon => oui
133 ArrOfIntFT sommets_conserves(nb_sommets);
134 sommets_conserves = 0;
135
136 // Parcours de la liste des aretes a supprimer. Pour chacune, on choisit
137 // un sommet a conserver et un sommet a supprimer (le plus petit en numerotation
138 // globale pour que le choix soit identique pour les deux triangles adjacents).
139 const int n = tab_aretesMarquees.dimension(0);
140 const int nb_som_par_facette = facettes.dimension(1);
141 int i;
142 for (i = 0; i < n; i++)
143 {
144 const int fa7 = tab_aretesMarquees(i,0);
145 const int isom = tab_aretesMarquees(i,1);
146 assert(isom >= 0 && isom < nb_som_par_facette);
147 const int isom_s = (isom + 1 < nb_som_par_facette) ? isom + 1 : 0;
148 const int som = facettes(fa7, isom);
149 const int som_s = facettes(fa7, isom_s);
150 const int bord = maillage.sommet_ligne_contact(som);
151 const int bord_s = maillage.sommet_ligne_contact(som_s);
152
153 int somRempl = -1; // Le sommet de remplacement (num_owner)
154 int somSupp = -1; // Le sommet supprime (indice local)
155 if (bord == bord_s)
156 {
157 //les deux sommets sont sur le bord ou les 2 sont internes
158 //on compare alors leur numero global
159 const int pe = sommet_PE_owner[som];
160 const int pe_s = sommet_PE_owner[som_s];
161 const int numOwner = sommet_num_owner[som];
162 const int numOwner_s = sommet_num_owner[som_s];
163 if (FTd_compare_sommets_global(pe, numOwner, pe_s, numOwner_s) > 0)
164 {
165 //som_s>som : on garde som, on supprime som_s
166 somRempl = som;
167 somSupp = som_s;
168 }
169 else
170 {
171 //som_s<=som : on garde som_s, on supprime som
172 somRempl = som_s;
173 somSupp = som;
174 }
175 }
176 else if (bord==1)
177 {
178 //som est de bord : on garde som, on supprimer som_s
179 somRempl = som;
180 somSupp = som_s;
181 }
182 else
183 {
184 //som_s est de bord : on garde som_s, on supprime som
185 somRempl = som_s;
186 somSupp = som;
187 }
188 // Remplacement du sommet si
189 // * le sommet a supprimer ne l'a pas encore ete
190 // * le sommet de remplacement n'a pas encore ete supprime
191 // * le sommet a supprimer n'est pas utilise pour en remplacer un autre
192 if ( sommets_remplacement(somRempl, 0) == no_PE
193 && sommets_remplacement(somSupp, 0) == no_PE
194 && sommets_conserves[somSupp] == 0)
195 {
196 const int pe = sommet_PE_owner[somRempl];
197 const int le_som = sommet_num_owner[somRempl];
198 sommets_remplacement(somSupp, 0) = pe;
199 sommets_remplacement(somSupp, 1) = le_som;
200 sommets_conserves[somRempl] = 1;
201 }
202 }
203
204 // Si un sommet est conserve sur un processeur, il ne doit etre supprime
205 // sur aucun processeur. On fait la somme pour tous les processeurs
206 // de "sommets_conserves" : si un sommet est conserve sur l'un, il devra
207 // etre conserve sur tous.
208 const Desc_Structure_FT& desc_sommets = maillage.desc_sommets();
209 desc_sommets.collecter_espace_virtuel(sommets_conserves,
211 desc_sommets.echange_espace_virtuel(sommets_conserves);
212
213 // On met aussi tous les processeurs d'accord sur le sommet de remplacement.
214 // Choix arbitraire de l'un des sommets de remplacement parmi ceux
215 // proposes par les differents processeurs.
216 desc_sommets.collecter_espace_virtuel(sommets_remplacement,
218 desc_sommets.echange_espace_virtuel(sommets_remplacement);
219
220 // Mise a jour de sommets_remplacement : -1 pour les sommets a conserver
221 for (i = 0; i < nb_sommets; i++)
222 {
223 const int a_conserver = sommets_conserves[i];
224 const int non_remplace = (sommets_remplacement(i,0) == no_PE);
225 if (a_conserver || non_remplace)
226 {
227 sommets_remplacement(i,0) = -1;
228 sommets_remplacement(i,1) = -1;
229 }
230 }
231}
232
234 ArrOfDouble& var_volume)
235{
236 statistics().create_custom_counter("Remaillage interf: bary/lissage systematiques",3,"FrontTracking");
237 statistics().begin_count("Remaillage interf: bary/lissage systematiques",statistics().get_last_opened_counter_level()+1);
238
239 FT_Field& Surfactant = maillage.Surfactant_facettes_non_const();
240 ArrOfDouble surfactant_avant_remaillage ;
241 if (!Surfactant.get_disable_surfactant())
242 {
243 var_volume.resize_array(maillage.nb_sommets());
244 surfactant_avant_remaillage = Surfactant.check_conservation(maillage);
245 maillage.set_barycentrage(true);
246 //nettoyer_maillage(maillage);
247 Surfactant.passer_variable_intensive(maillage);
248 }
249 regulariser_maillage(maillage,
250 var_volume,
257 supprimer_facettes_bord(maillage);
258 if (!Surfactant.get_disable_surfactant())
259 {
260 Surfactant.passer_variable_extensive(maillage);
261 maillage.set_barycentrage(false);
262 ArrOfDouble surfactant_apres_remaillage = Surfactant.check_conservation(maillage);
263 Surfactant.correction_conservation_globale(maillage, surfactant_avant_remaillage, surfactant_apres_remaillage);
264 }
265 statistics().end_count("Remaillage interf: bary/lissage systematiques");
266}
267
269{
270 statistics().create_custom_counter("Remaillage local: bary/lissage apres remaillage",3,"FrontTracking");
271 statistics().begin_count("Remaillage local: bary/lissage apres remaillage",statistics().get_last_opened_counter_level()+1);
272
273 FT_Field& surfactant = maillage.Surfactant_facettes_non_const();
274 if (!surfactant.get_disable_surfactant())
275 {
276 //ArrOfDouble surfactant_avant_remaillage = surfactant.check_conservation(maillage);
277 maillage.set_barycentrage(true);
278 //nettoyer_maillage(maillage);
279 surfactant.passer_variable_intensive(maillage);
280 }
281 regulariser_maillage(maillage, var_volume,
288 supprimer_facettes_bord(maillage);
289 if (!surfactant.get_disable_surfactant())
290 {
291 surfactant.passer_variable_extensive(maillage);
292 maillage.set_barycentrage(false);
293 //ArrOfDouble surfactant_apres_remaillage = surfactant.check_conservation(maillage);
294 //surfactant.correction_conservation_globale(maillage, surfactant_avant_remaillage, surfactant_apres_remaillage);
295 }
296
297 // Dans le doute, je laisse l'appel a nettoyer_maillage :
298 nettoyer_maillage(maillage);
299 statistics().end_count("Remaillage local: bary/lissage apres remaillage");
300}
301
302// Surcharge de Remaillage_FT::diviser_grandes_aretes(Maillage_FT_Disc& maillage) const
303// A la creation des facettes, il faut leur attribuer un numero de compo connexe dans compo_connex_facettes_.
305{
306 statistics().create_custom_counter("Remaillage local: suppressions / divisions aretes",3,"FrontTracking");
307 statistics().begin_count("Remaillage local: suppressions / divisions aretes",statistics().get_last_opened_counter_level()+1);
308
309
310 FT_Field& surfactant = maillage.Surfactant_facettes_non_const();
311 static int compteur = 0;
312 static int test_val = -1;
313 if (!surfactant.get_disable_surfactant())
314 {
316 surfactant.echange_espace_virtuel(maillage);
317 }
318
319 Process::Journal()<<"Remaillage_FT_IJK::diviser_grandes_aretes "<<temps_<<" nb_som="<<maillage.nb_sommets()<<finl;
320 Process::Journal()<<" Compteur = " << compteur << finl;
321 compteur++;
322 if (compteur == test_val)
323 {
324 Process::Journal() << " STOP." << finl;
325 }
326 // int res = 1;
327
329
330 //tableaux de stockage
331 IntTabFT tab_aretesMarquees;
332 ArrOfIntFT tab_somD;
333 DoubleTabFT tab_deplacement_somD;
334
335 //on commence par marquer les grandes aretes
336 marquer_aretes(maillage,
337 tab_aretesMarquees,
338 tab_somD,
339 tab_deplacement_somD,
340 1 /* marquage des aretes trop grandes */);
341 // resultat = tab_aretesMarquees : [ fa7 iarete pe som ]
342
343 const int nb_aretes_divis = tab_aretesMarquees.dimension(0);
344
345
346 int nb_facettes = maillage.nb_facettes();
347 const int nb_facettes0 = nb_facettes;
348 IntTab& facettes = maillage.facettes_;
349 const int nb_som_par_facette = facettes.dimension(1);
350
351 const ArrOfInt& sommet_num_owner = maillage.sommet_num_owner_;
352 int fa7,iarete, isom,som,isom_s,som_s,isom_ss,som_ss, pe_somD,numOwner_somD,somD,somD_s,somD_ss;
353
354 const int dimension3 = (dimension==3);
355 const int nb_aretes_par_facette = (dimension3)?3:1;
356 //tableau stockant le sommet servant a decouper l'arete (ou -1 si arete non divisee)
357 IntTabFT tab_fa7Divis(nb_facettes,nb_aretes_par_facette);
358 for (fa7=0 ; fa7<nb_facettes ; fa7++)
359 {
360 for (isom=0 ; isom<nb_aretes_par_facette ; isom++)
361 {
362 tab_fa7Divis(fa7,isom) = -1;
363 }
364 }
365
366 //on va balayer les aretes a memoriser l'ensemble des aretes a scinder
367 for (iarete=0 ; iarete<nb_aretes_divis ; iarete++)
368 {
369 fa7 = tab_aretesMarquees(iarete,0);
370 isom = tab_aretesMarquees(iarete,1);
371 isom_s = (isom+1)%nb_som_par_facette;
372 //sommet qui va rester dans fa7
373 som = facettes(fa7,isom);
374 //sommet qui va aller dans une nouvelle facette
375 som_s = facettes(fa7,isom_s);
376 //sommet a inserer dans l'arete
377 pe_somD = tab_aretesMarquees(iarete,2);
378 numOwner_somD = tab_aretesMarquees(iarete,3);
379
380 if (pe_somD!=me())
381 {
382 //je ne connais pas l'indice du sommet a inserer dans me()
383 maillage.convertir_numero_distant_local(maillage.desc_sommets(),sommet_num_owner,numOwner_somD,pe_somD,somD);
384 assert(somD >= 0);
385 }
386 else
387 {
388 //je suis le proprietaire de somD : je connais donc le bon indice du sommet a inserer
389 somD = numOwner_somD;
390 }
391
392 tab_fa7Divis(fa7,isom) = somD;
393 }
394
395 // Specifique IJK :
396 ArrOfInt& compo_connexe_facettes = maillage.compo_connexe_facettes_non_const();
397
398 //on va ensuite balayer les facettes et les scinder
399 //la configuration depend du nb d'aretes a scinder par facette
400 int nb_areteScinder, isom0=-1,isom1=-1;
401
402
403 if (!surfactant.get_disable_surfactant())
404 {
405 for (fa7=0 ; fa7<nb_facettes0 ; fa7++)
406 {
407 //on compte le nombre d'aretes a scinder
408 nb_areteScinder = 0;
409 for (isom=0 ; isom<nb_aretes_par_facette ; isom++)
410 {
411 if (tab_fa7Divis(fa7,isom)>=0)
412 {
413 if (nb_areteScinder==0)
414 {
415 isom0 = isom;
416 }
417 else
418 {
419 isom1 = isom;
420 }
421 nb_areteScinder++;
422 }
423 }
424 if (nb_areteScinder==1)
425 {
426 double concentration_surfactant_avant_decoupage = surfactant[fa7];
427 //s'il n'y a qu'une arete a scinder
428 somD = tab_fa7Divis(fa7,isom0);
429 //on modifie la facettes d'origine
430 isom_s = (isom0+1)%nb_som_par_facette;
431 som_s = facettes(fa7,isom_s);
432 facettes(fa7,isom_s) = somD;
433 surfactant[fa7]=concentration_surfactant_avant_decoupage;
434 //on cree une nouvelle facette
435 if (nb_facettes>=facettes.dimension(0))
436 {
437 //Redimensionnement
438 facettes.resize(nb_facettes+10,facettes.dimension(1));
439 compo_connexe_facettes.resize_array(nb_facettes+10);
440 surfactant.resize_array(nb_facettes+10);
441 }
442 isom_ss = (isom_s+1)%nb_som_par_facette;
443 som_ss = facettes(fa7,isom_ss);
444 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
445 surfactant[nb_facettes]=concentration_surfactant_avant_decoupage;
446 if (dimension==2)
447 {
448 facettes(nb_facettes,isom0) = somD;
449 facettes(nb_facettes,isom_s) = som_s;
450 }
451 else
452 {
453 facettes(nb_facettes,0) = som_ss;
454 facettes(nb_facettes,1) = somD; //sommet insere
455 facettes(nb_facettes,2) = som_s;
456 }
457 nb_facettes++;
458 }
459 else if (nb_areteScinder==2)
460 {
461 //si 2 aretes sont a scinder
462 //on cree deux nouvelles facettes
463 double concentration_surfactant_avant_decoupage = surfactant[fa7];
464 if (nb_facettes+2>=facettes.dimension(0))
465 {
466 //Redimensionnement
467 facettes.resize(nb_facettes+12,facettes.dimension(1));
468 compo_connexe_facettes.resize_array(nb_facettes+12);
469 surfactant.resize_array(nb_facettes+12);
470 }
471 //on positionne isom et isom_s tq elles soient les aretes a scinder
472 if (isom1==(isom0+1)%nb_som_par_facette)
473 {
474 isom = isom0;
475 isom_s = isom1;
476 }
477 else
478 {
479 isom = isom1;
480 isom_s = isom0;
481 }
482 isom_ss = ((isom_s+1)%nb_som_par_facette);
483 som = facettes(fa7,isom);
484 som_s = facettes(fa7,isom_s);
485 som_ss = facettes(fa7,isom_ss);
486 somD = tab_fa7Divis(fa7,isom);
487 somD_s = tab_fa7Divis(fa7,isom_s);
488 somD_ss = tab_fa7Divis(fa7,isom_ss);
489 //on modifie la facette existante
490 facettes(fa7,0) = som;
491 facettes(fa7,1) = somD;
492 facettes(fa7,2) = som_ss;
493 surfactant[fa7]=concentration_surfactant_avant_decoupage;
494 //premiere nouvelle facette
495 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
496 facettes(nb_facettes,0) = somD;
497 facettes(nb_facettes,1) = som_s;
498 facettes(nb_facettes,2) = somD_s;
499 surfactant[nb_facettes]=concentration_surfactant_avant_decoupage;
500 nb_facettes++;
501 //seconde nouvelle facette
502 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
503 facettes(nb_facettes,0) = somD;
504 facettes(nb_facettes,1) = somD_s;
505 facettes(nb_facettes,2) = som_ss;
506 surfactant[nb_facettes]=concentration_surfactant_avant_decoupage;
507 nb_facettes++;
508 }
509 else if (nb_areteScinder==3)
510 {
511 //si toutes les aretes sont a scinder
512 //on cree trois nouvelles facettes
513 double concentration_surfactant_avant_decoupage = surfactant[fa7];
514 if (nb_facettes+3>=facettes.dimension(0))
515 {
516 //Redimensionnement
517 facettes.resize(nb_facettes+13,facettes.dimension(1));
518 compo_connexe_facettes.resize_array(nb_facettes+13);
519 surfactant.resize_array(nb_facettes+13);
520 }
521 isom = 0;
522 isom_s = 1;
523 isom_ss = 2;
524 som = facettes(fa7,isom);
525 som_s = facettes(fa7,isom_s);
526 som_ss = facettes(fa7,isom_ss);
527 somD = tab_fa7Divis(fa7,isom);
528 somD_s = tab_fa7Divis(fa7,isom_s);
529 somD_ss = tab_fa7Divis(fa7,isom_ss);
530 //on modifie la facette existante
531 facettes(fa7,0) = som;
532 facettes(fa7,1) = somD;
533 facettes(fa7,2) = somD_ss;
534 surfactant[fa7]=concentration_surfactant_avant_decoupage;
535 //premiere nouvelle facette
536 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
537 facettes(nb_facettes,0) = somD;
538 facettes(nb_facettes,1) = som_s;
539 facettes(nb_facettes,2) = somD_s;
540 surfactant[nb_facettes]=concentration_surfactant_avant_decoupage;
541 nb_facettes++;
542 //seconde nouvelle facette
543 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
544 facettes(nb_facettes,0) = somD_s;
545 facettes(nb_facettes,1) = som_ss;
546 facettes(nb_facettes,2) = somD_ss;
547 surfactant[nb_facettes]=concentration_surfactant_avant_decoupage;
548 nb_facettes++;
549 //troisieme nouvelle facette
550 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
551 facettes(nb_facettes,0) = somD;
552 facettes(nb_facettes,1) = somD_s;
553 facettes(nb_facettes,2) = somD_ss;
554 surfactant[nb_facettes]=concentration_surfactant_avant_decoupage;
555 nb_facettes++;
556 }
557 }
558 }
559 else
560 {
561 for (fa7=0 ; fa7<nb_facettes0 ; fa7++)
562 {
563 //on compte le nombre d'aretes a scinder
564 nb_areteScinder = 0;
565 for (isom=0 ; isom<nb_aretes_par_facette ; isom++)
566 {
567 if (tab_fa7Divis(fa7,isom)>=0)
568 {
569 if (nb_areteScinder==0)
570 {
571 isom0 = isom;
572 }
573 else
574 {
575 isom1 = isom;
576 }
577 nb_areteScinder++;
578 }
579 }
580 if (nb_areteScinder==1)
581 {
582 //s'il n'y a qu'une arete a scinder
583 somD = tab_fa7Divis(fa7,isom0);
584 //on modifie la facettes d'origine
585 isom_s = (isom0+1)%nb_som_par_facette;
586 som_s = facettes(fa7,isom_s);
587 facettes(fa7,isom_s) = somD;
588 //on cree une nouvelle facette
589 if (nb_facettes>=facettes.dimension(0))
590 {
591 //Redimensionnement
592 facettes.resize(nb_facettes+10,facettes.dimension(1));
593 compo_connexe_facettes.resize_array(nb_facettes+10);
594 }
595 isom_ss = (isom_s+1)%nb_som_par_facette;
596 som_ss = facettes(fa7,isom_ss);
597 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
598 if (dimension==2)
599 {
600 facettes(nb_facettes,isom0) = somD;
601 facettes(nb_facettes,isom_s) = som_s;
602 }
603 else
604 {
605 facettes(nb_facettes,0) = som_ss;
606 facettes(nb_facettes,1) = somD; //sommet insere
607 facettes(nb_facettes,2) = som_s;
608 }
609 nb_facettes++;
610 }
611 else if (nb_areteScinder==2)
612 {
613 //si 2 aretes sont a scinder
614 //on cree deux nouvelles facettes
615 if (nb_facettes+2>=facettes.dimension(0))
616 {
617 //Redimensionnement
618 facettes.resize(nb_facettes+12,facettes.dimension(1));
619 compo_connexe_facettes.resize_array(nb_facettes+12);
620 }
621 //on positionne isom et isom_s tq elles soient les aretes a scinder
622 if (isom1==(isom0+1)%nb_som_par_facette)
623 {
624 isom = isom0;
625 isom_s = isom1;
626 }
627 else
628 {
629 isom = isom1;
630 isom_s = isom0;
631 }
632 isom_ss = ((isom_s+1)%nb_som_par_facette);
633 som = facettes(fa7,isom);
634 som_s = facettes(fa7,isom_s);
635 som_ss = facettes(fa7,isom_ss);
636 somD = tab_fa7Divis(fa7,isom);
637 somD_s = tab_fa7Divis(fa7,isom_s);
638 somD_ss = tab_fa7Divis(fa7,isom_ss);
639 //on modifie la facette existante
640 facettes(fa7,0) = som;
641 facettes(fa7,1) = somD;
642 facettes(fa7,2) = som_ss;
643 //premiere nouvelle facette
644 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
645 facettes(nb_facettes,0) = somD;
646 facettes(nb_facettes,1) = som_s;
647 facettes(nb_facettes,2) = somD_s;
648 nb_facettes++;
649 //seconde nouvelle facette
650 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
651 facettes(nb_facettes,0) = somD;
652 facettes(nb_facettes,1) = somD_s;
653 facettes(nb_facettes,2) = som_ss;
654 nb_facettes++;
655 }
656 else if (nb_areteScinder==3)
657 {
658 //si toutes les aretes sont a scinder
659 //on cree trois nouvelles facettes
660 if (nb_facettes+3>=facettes.dimension(0))
661 {
662 //Redimensionnement
663 facettes.resize(nb_facettes+13,facettes.dimension(1));
664 compo_connexe_facettes.resize_array(nb_facettes+13);
665 }
666 isom = 0;
667 isom_s = 1;
668 isom_ss = 2;
669 som = facettes(fa7,isom);
670 som_s = facettes(fa7,isom_s);
671 som_ss = facettes(fa7,isom_ss);
672 somD = tab_fa7Divis(fa7,isom);
673 somD_s = tab_fa7Divis(fa7,isom_s);
674 somD_ss = tab_fa7Divis(fa7,isom_ss);
675 //on modifie la facette existante
676 facettes(fa7,0) = som;
677 facettes(fa7,1) = somD;
678 facettes(fa7,2) = somD_ss;
679 //premiere nouvelle facette
680 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
681 facettes(nb_facettes,0) = somD;
682 facettes(nb_facettes,1) = som_s;
683 facettes(nb_facettes,2) = somD_s;
684 nb_facettes++;
685 //seconde nouvelle facette
686 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
687 facettes(nb_facettes,0) = somD_s;
688 facettes(nb_facettes,1) = som_ss;
689 facettes(nb_facettes,2) = somD_ss;
690 nb_facettes++;
691 //troisieme nouvelle facette
692 compo_connexe_facettes[nb_facettes] = compo_connexe_facettes[fa7];
693 facettes(nb_facettes,0) = somD;
694 facettes(nb_facettes,1) = somD_s;
695 facettes(nb_facettes,2) = somD_ss;
696 nb_facettes++;
697 }
698 }
699 }
700 //Redimensionnement
701 facettes.resize(nb_facettes,facettes.dimension(1));
702 compo_connexe_facettes.resize_array(nb_facettes);
703 if (!surfactant.get_disable_surfactant())
704 surfactant.resize_array(nb_facettes);
705 maillage.desc_facettes_.calcul_schema_comm(nb_facettes);
707
708 ArrOfIntFT liste_sommets_sortis;
709 ArrOfIntFT numero_face_sortie;
710 if (!surfactant.get_disable_surfactant())
711 {
712 surfactant.echange_espace_virtuel(maillage);
713 }
714 maillage.deplacer_sommets(tab_somD,tab_deplacement_somD,liste_sommets_sortis,numero_face_sortie);
716 if (!surfactant.get_disable_surfactant())
717 surfactant.echange_espace_virtuel(maillage);
718
719 int nb_aretes_divis_tot = Process::check_int_overflow(Process::mp_sum(nb_aretes_divis));
720 Process::Journal()<<"FIN Remaillage_FT::diviser_grandes_aretes "<<temps_<<" nb_som="<<maillage.nb_sommets()
721 <<" nb_aretes_divisees_on_proc="<< nb_aretes_divis;
722 Process::Journal()<< " nb_aretes_divisees_tot="<< nb_aretes_divis_tot<<finl;
724
725 statistics().end_count("Remaillage local: suppressions / divisions aretes");
726
727 return nb_aretes_divis_tot;
728 // return res;
729}
730
731
732/* Surcharge de supprimer_petites_aretes de Remaillage_FT */
733// pour gestion des Surfactants IJK
735 ArrOfDouble& varVolume) const
736{
737 FT_Field& surfactant = maillage.Surfactant_facettes_non_const();
738 if (surfactant.get_disable_surfactant())
739 {
740 return Remaillage_FT::supprimer_petites_aretes(maillage,varVolume);
741 }
742 statistics().create_custom_counter("Supprimer_petites_aretes",3,"FrontTracking");
743 statistics().begin_count("Supprimer_petites_aretes",statistics().get_last_opened_counter_level()+1);
744
745 maillage.check_mesh();
746 int nb_sommets_supprimes_tot = 0;
747 int nb_sommets_supprimes = 0;
748 do
749 {
750 // Pour chaque sommet a remplacer:
751 // colonne0: indice local du sommet a remplacer
752 // colonne1: indice local du sommet de remplacement
753 IntTabFT remplacement_ilocal(0,2);
754
755 {
756 // ******************************************************
757 // Recherche des aretes trop petites
758 IntTabFT tab_aretesMarquees;
759 {
760 ArrOfIntFT tab_somD; // Inutilise
761 DoubleTabFT tab_deplacement_somD; // Inutilise
762 marquer_aretes(maillage,
763 tab_aretesMarquees,
764 tab_somD,
765 tab_deplacement_somD,
766 -1 /* marquage des aretes trop petites */);
767 }
768
769 // ******************************************************
770 // On supprime les aretes en remplacant une extremite par l'autre
771 // (genere des triangles dont deux sommets sont confondus)
772 // Determination des sommets a remplacer et des sommets de remplacement
773 // en numerotation globale.
774 IntTabFT sommets_remplacement;
775 SPA_choisir_sommets_remplacement(maillage,
776 tab_aretesMarquees,
777 sommets_remplacement);
778
779 // ******************************************************
780 // Certains sommets de remplacement n'existent pas encore sur le processeur local.
781 // Creation de la liste des sommets de remplacement virtuels dont on aura besoin
782 ArrOfIntFT request_sommets_pe;
783 ArrOfIntFT request_sommets_num;
784 int i;
785 const int nb_sommets = maillage.nb_sommets();
786 const int moi = Process::me();
787 assert(nb_sommets == sommets_remplacement.dimension(0));
788 for (i = 0; i < nb_sommets; i++)
789 {
790 const int pe = sommets_remplacement(i,0);
791 const int som= sommets_remplacement(i,1);
792 if (pe >= 0)
793 {
794 int j;
795 if (pe != moi) // Le sommet de remplacement est virtuel
796 {
797 request_sommets_pe.append_array(pe);
798 request_sommets_num.append_array(som);
799 j = -1;
800 }
801 else
802 {
803 j = som;
804 }
805 remplacement_ilocal.append_line(i, j);
806 }
807 }
808 // ******************************************************
809 // Creation des sommets virtuels qui remplaceront les sommets supprimes
810 // (certains existent peut-etre deja, ils ne seront pas recrees)
811
812 maillage.creer_sommets_virtuels_numowner(request_sommets_pe,
813 request_sommets_num);
814 // On a cree de nouveaux sommets virtuels. Mise a jour de varVolume:
815 // Inutile de mettre a jour l'espace virtuel, l'echange sera fait
816 // apres le calcul de dvolume
817 {
818 const int old_size = varVolume.size_array();
819 const int new_size = maillage.nb_sommets();
820 varVolume.resize_array(new_size);
821 int ii;
822 for (ii = old_size; ii < new_size; ii++)
823 varVolume[ii] = 0.;
824 }
825 // ******************************************************
826 // Calcul de l'indice local des sommets de remplacement
827 ArrOfIntFT request_sommets_ilocal;
828
830 maillage.sommet_num_owner(),
831 request_sommets_num,
832 request_sommets_pe,
833 request_sommets_ilocal);
834 int j = 0;
835 const int n_rempl = remplacement_ilocal.dimension(0);
836 for (i = 0; i < n_rempl; i++)
837 {
838 int som_new = remplacement_ilocal(i,1);
839 if (som_new < 0) // Le sommet de remplacement est virtuel ?
840 {
841 som_new = request_sommets_ilocal[j];
842 remplacement_ilocal(i,1) = som_new;
843 j++;
844 }
845 }
846 }
847 // ******************************************************
848 // Determination de la variation de volume liee a la suppression des aretes
849 // On calcule la variation de volume correspondant au deplacement des
850 // noeuds remplaces vers les noeuds de remplacement.
851 {
852 const DoubleTab& sommets = maillage.sommets();
853 // Nombre de sommets a remplacer
854 const int n_rempl = remplacement_ilocal.dimension(0);
855 DoubleTabFT position_finale(sommets); // Copie du tableau.
856 int i;
857 const int dim = Objet_U::dimension;
858 for (i = 0; i < n_rempl; i++)
859 {
860 const int som_old = remplacement_ilocal(i,0);
861 const int som_new = remplacement_ilocal(i,1);
862 int j;
863 for (j = 0; j < dim; j++)
864 position_finale(som_old, j) = position_finale(som_new, j);
865 }
866 {
867 ArrOfDoubleFT dvolume;
869 position_finale,
870 dvolume);
871
872 // Avant d'affecter la variation de volume des noeuds remplaces aux noeuds
873 // de remplacement: certains sommets de remplacement sont virtuels,
874 // il faut donc "collecter" les contributions a la fin. Donc il faut
875 // annuler la valeur de varVolume pour les sommets virtuels avant
876 // de commencer.
877 const int n = maillage.nb_sommets();
878 for (i = 0; i < n; i++)
879 {
880 if (maillage.sommet_virtuel(i))
881 varVolume[i] = 0.;
882 else
883 varVolume[i] += dvolume[i];
884 }
885 }
886 for (i = 0; i < n_rempl; i++)
887 {
888 const int som_old = remplacement_ilocal(i,0);
889 const int som_new = remplacement_ilocal(i,1);
890 const double dv = varVolume[som_old];
891 varVolume[som_new] += dv;
892 varVolume[som_old] = 0;
893 }
894 const Desc_Structure_FT& desc = maillage.desc_sommets();
896 desc.echange_espace_virtuel(varVolume);
897 }
898
899 // ******************************************************
900 // Remplacement des sommets dans le tableau des facettes,
901 // On rend invalides les facettes qui disparaissent (deux sommets confondus)
902
903
904 {
905 const int nb_som = maillage.nb_sommets();
906 // Creation d'une table de remplacement de sommets:
907 ArrOfIntFT table_old_new(nb_som);
908 table_old_new = -1;
909 const int nb_rempl = remplacement_ilocal.dimension(0);
910 for (int i = 0; i < nb_rempl; i++)
911 {
912 const int som_old = remplacement_ilocal(i,0);
913 const int som_new = remplacement_ilocal(i,1);
914 table_old_new[som_old] = som_new;
915 }
916 IntTab& facettes = maillage.facettes_;
917 const DoubleTab& sommets = maillage.sommets_;
918 //const DoubleTab& sommets = maillage.sommets();
919 const int nb_facettes = facettes.dimension(0);
920 const int nb_som_par_facette = facettes.dimension(1);
921
922
923 // doit mettre a jour sommet
924
925
926 // int nb_proc = splitting->get_nprocessor_per_direction(0)*splitting->get_nprocessor_per_direction(1)*splitting->get_nprocessor_per_direction(2);
927
928 //////////////////////// GESTION DU CHAMP DE SURFACTANT QUAND ON REMPLACE LES SOMMETS DES FACETTES //////////////////
929 /* Avant de changer le sommet, on stocke les triangles (facettes) initiaux avant changement (i.e. les triangles dont l'un des trois sommets va changer)
930 * Apres la modification du sommet, on stocke les triangles modifiés (i.e. les triangles dont l'un des trois sommets va changer)
931 * On calcule ensuite toute les intersections entre les triangles initiaux et les triangles finaux
932 * Ces intersections permettent de reconstruire le champ de surfactant apres transport des sommets de maniere conservative et sans diffusion numerique
933 * Si plusieurs arretes successives sont supprimees, le nombre de triangles impliqué sur un seul sommet modifie peut être très grand
934 * La parallèlisation est alors très compliquee. On peut avoir besoin de voisins non direct.
935 * C'est pourquoi, en attendant une indexation déterministe des facettes et des sommets, on est obligés de partager les tableaux complets sur l'ensemble des procs
936 */
937
938 // on stocke les coord des sommets reels qui bougent
939
940 // premier partage entre proc : coordonnees new_sommet sur les proc compo
941 //surfactant.dimensionner_remaillage_FT_Field(maillage, table_old_new);
942 //DoubleTab sommet_bouge = surfactant.get_sommet_bouge();
943 // construction des tableau avant/apres deplacement
944 const ArrOfDouble& Sfa7 = maillage.get_surface_facettes();
945 double longueur_cara_fa7 = 0.;
946 int n = 0 ;
947 for (int fa = 0; fa < Sfa7.size_array(); fa++)
948 {
949 longueur_cara_fa7 += Sfa7(fa);
950 n++;
951 }
952 longueur_cara_fa7= Process::mp_sum(longueur_cara_fa7);
954 if (n>0)
955 {
956 longueur_cara_fa7 /= n ;
957 longueur_cara_fa7 = std::sqrt(longueur_cara_fa7);
958 }
959
960 surfactant.set_tolerance_point_identique(longueur_cara_fa7);
961 surfactant.echange_espace_virtuel(maillage);
962
963 DoubleTab liste_sommets_avant_deplacement(0, 3);
964 DoubleTab liste_sommets_apres_deplacement(0, 3);
965 ArrOfInt compo_connexe_sommets_deplace(0);
966 ArrOfInt& compo_connexe_facettes = maillage.compo_connexe_facettes_non_const();
967 surfactant.champ_sommet_from_facettes(compo_connexe_facettes, maillage);
968 ArrOfInt compo_connexe_sommet = surfactant.get_compo_connexe_sommets();
969 int index = 0 ;
970 for (int i = 0; i < nb_rempl; i++)
971 {
972 const int som_old = remplacement_ilocal(i,0);
973 const int som_new = remplacement_ilocal(i,1);
974 if (som_new >= 0)
975 {
976 liste_sommets_avant_deplacement.resize(index+1,3);
977 liste_sommets_apres_deplacement.resize(index+1,3);
978 compo_connexe_sommets_deplace.resize(index+1);
979 liste_sommets_avant_deplacement(index, 0) = sommets(som_old,0);
980 liste_sommets_avant_deplacement(index, 1) = sommets(som_old,1);
981 liste_sommets_avant_deplacement(index, 2) = sommets(som_old,2);
982 liste_sommets_apres_deplacement(index, 0) = sommets(som_new,0);
983 liste_sommets_apres_deplacement(index, 1) = sommets(som_new,1);
984 liste_sommets_apres_deplacement(index, 2) = sommets(som_new,2);
985 compo_connexe_sommets_deplace(index) = compo_connexe_sommet(som_old);
986 //std::cout << " som avant = " << liste_sommets_avant_deplacement(index, 0) << liste_sommets_avant_deplacement(index, 1) << liste_sommets_avant_deplacement(index, 2);
987 //std::cout << " som apres = " << liste_sommets_apres_deplacement(index, 0) << liste_sommets_apres_deplacement(index, 1) << liste_sommets_apres_deplacement(index, 2) << std::endl;
988 index++;
989 }
990 }
991
992
993 surfactant.completer_compo_connexe_partielle(maillage, maillage.get_domaine(), liste_sommets_apres_deplacement, liste_sommets_avant_deplacement, compo_connexe_sommets_deplace);
994 DoubleTab& facettes_sommets_full_compo = surfactant.get_facettes_sommets_full_compo_non_const();
995 DoubleTab& liste_sommets_et_deplacements_full_compo = surfactant.get_liste_sommets_et_deplacements_non_const();
996 ArrOfInt sorted_index = surfactant.get_sorted_index();
997
998 int nb_facettes_compo_complete = facettes_sommets_full_compo.dimension(0);
999 int nbsom_compo_complete = liste_sommets_et_deplacements_full_compo.dimension(0);
1000
1001
1002 /*Process::barrier();
1003 int nb_proc = splitting->get_nprocessor_per_direction(0)*splitting->get_nprocessor_per_direction(1)*splitting->get_nprocessor_per_direction(2);
1004 int ny = splitting->get_nprocessor_per_direction(1);
1005 int nz = splitting->get_nprocessor_per_direction(2);
1006 int x = splitting->get_local_slice_index(0);
1007 int y = splitting->get_local_slice_index(1);
1008 int z = splitting->get_local_slice_index(2);
1009 int proc_index = z + y * nz + x * ny * nz ;
1010 int index_global = 0;
1011 for (int proc = 0; proc < nb_proc; proc++)
1012 {
1013 index_global = Process::mp_max(index_global);
1014 Process::barrier();
1015 if (proc == proc_index)
1016 {*/
1017
1018
1019
1020 for (int indice_sommet_desordre = 0; indice_sommet_desordre < nbsom_compo_complete; indice_sommet_desordre++)
1021 {
1022 int indice_sommet=sorted_index(indice_sommet_desordre);
1023 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));
1024 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));
1025 surfactant.reinit_remeshing_table();
1026 for (int fa = 0; fa < nb_facettes_compo_complete; fa++)
1027 {
1028 /*bool facette_virtuelle_locale = false;
1029 if(facettes_sommets_full_compo(index, 11)==1.)
1030 {
1031 facette_virtuelle_locale = true;
1032 }*/
1033
1034 for (int somfa7 = 0; somfa7 < nb_som_par_facette; somfa7++)
1035 {
1036 double sx = facettes_sommets_full_compo(fa, 3*somfa7+0);
1037 double sy = facettes_sommets_full_compo(fa, 3*somfa7+1);
1038 double sz = facettes_sommets_full_compo(fa, 3*somfa7+2);
1039 Point3D p1 = {sx,sy,sz};
1040 Point3D p2 = {pos[0],pos[1],pos[2]};
1041 if (p1==p2)
1042 {
1043 sx = facettes_sommets_full_compo(fa, 0);
1044 sy = facettes_sommets_full_compo(fa, 1);
1045 sz = facettes_sommets_full_compo(fa, 2);
1046 Point3D s0 = {sx,sy,sz};
1047 sx = facettes_sommets_full_compo(fa, 3);
1048 sy = facettes_sommets_full_compo(fa, 4);
1049 sz = facettes_sommets_full_compo(fa, 5);
1050 Point3D s1 = {sx,sy,sz};
1051 sx = facettes_sommets_full_compo(fa, 6);
1052 sy = facettes_sommets_full_compo(fa, 7);
1053 sz = facettes_sommets_full_compo(fa, 8);
1054 Point3D s2 = {sx,sy,sz};
1055
1056 if (!(s0 == s1 or s1 == s2 or s0 == s2))
1057 {
1058 // on sauvegarde le triangle avant deplacement
1059 // on deplace le sommet du triangle
1060 // on sauvegarde le triangle apres deplacement ssi il nest pas de surface nulle
1061 //if(!facette_virtuelle_locale)
1062 surfactant.sauvegarder_triangle(maillage, fa, 0);
1063
1064 Point3D n_apres_dep = surfactant.calculer_normale_apres_deplacement(fa, somfa7, pos_apres_dep);
1065
1066 // on bouge le sommet
1067 for (int dir = 0; dir < 3; dir++)
1068 facettes_sommets_full_compo(fa, 3*somfa7+dir)=pos_apres_dep[dir];
1069 // on met a jour la normale au sommet
1070 facettes_sommets_full_compo(fa, 12)=n_apres_dep.x;
1071 facettes_sommets_full_compo(fa, 13)=n_apres_dep.y;
1072 facettes_sommets_full_compo(fa, 14)=n_apres_dep.z;
1073
1074
1075 const int indice_fa_locale = int(facettes_sommets_full_compo(fa, 10));
1076 if(indice_fa_locale!=-1)
1077 {
1078 // alors la fa7 est reelle ou virtuelle locale sur le proc et il faut la modifier
1079 const int i_sommet = facettes(indice_fa_locale,somfa7);
1080 const int new_sommet = table_old_new[i_sommet];
1081 facettes(indice_fa_locale,somfa7) = new_sommet;
1082 }
1083
1084 sx = facettes_sommets_full_compo(fa, 0);
1085 sy = facettes_sommets_full_compo(fa, 1);
1086 sz = facettes_sommets_full_compo(fa, 2);
1087 s0 = {sx,sy,sz};
1088 sx = facettes_sommets_full_compo(fa, 3);
1089 sy = facettes_sommets_full_compo(fa, 4);
1090 sz = facettes_sommets_full_compo(fa, 5);
1091 s1 = {sx,sy,sz};
1092 sx = facettes_sommets_full_compo(fa, 6);
1093 sy = facettes_sommets_full_compo(fa, 7);
1094 sz = facettes_sommets_full_compo(fa, 8);
1095 s2 = {sx,sy,sz};
1096 if (!(s0 == s1 or s1 == s2 or s0 == s2))
1097 {
1098 //if(!facette_virtuelle_locale)
1099 surfactant.sauvegarder_triangle(maillage, fa, 1);
1100 }
1101 else
1102 {
1103 // la fa7 doit devenir invalide
1104 // on rempli avec des valeurs bidons
1105 for (int somfa7bis = 0; somfa7bis < nb_som_par_facette; somfa7bis++)
1106 {
1107 for (int dir = 0; dir < 3; dir++)
1108 facettes_sommets_full_compo(fa, 3*somfa7bis+dir)=-123.;
1109 }
1110 facettes_sommets_full_compo(fa, 9)=-123.;
1111 }
1112 break;
1113 }
1114 }
1115 }
1116 }
1117 surfactant.remailler_FT_Field(maillage);
1118 }
1119
1120 //}
1121 //}
1122 surfactant.update_FT_Field_local_from_full_compo(maillage);
1123 surfactant.echange_espace_virtuel(maillage);
1124
1125
1126 for (int i = 0; i < nb_facettes; i++)
1127 {
1128 // En dimension2, une facette est invalide si les deux sommets
1129 // sont identiques. En dimension 3, si deux sommets sont confondus,
1130 // il faut invalider la facette (sommet0 == sommet1)
1131 if (nb_som_par_facette == 3)
1132 {
1133 // Facette modifiee, on teste si elle disparait
1134 const int s0 = facettes(i,0);
1135 const int s1 = facettes(i,1);
1136 const int s2 = facettes(i,2);
1137 if (s0 == s2 || s1 == s2)
1138 {
1139 facettes(i,1) = s0;
1140 facettes(i,2) = s0;
1141 }
1142 }
1143 }
1144 }
1145
1146 nb_sommets_supprimes = remplacement_ilocal.dimension(0);
1147 nb_sommets_supprimes = Process::check_int_overflow(Process::mp_sum(nb_sommets_supprimes));
1148 nb_sommets_supprimes_tot += nb_sommets_supprimes;
1150 surfactant.echange_espace_virtuel(maillage);
1151 }
1152 while (nb_sommets_supprimes > 0);
1153
1154 //maillage.corriger_proprietaires_facettes();
1155 //surfactant.echange_espace_virtuel(maillage);
1156 // corriger_proprietaires_facettes() cree eventuellement des sommets virtuels.
1157 // => Mise a jour de varVolume
1158 varVolume.resize_array(maillage.nb_sommets());
1159 maillage.desc_sommets().echange_espace_virtuel(varVolume);
1160
1162 statistics().end_count("Supprimer_petites_aretes");
1163 return nb_sommets_supprimes_tot;
1164}
1165
1167{
1168 statistics().create_custom_counter("Remaillage interf: remaillage local",3,"FrontTracking");
1169 statistics().begin_count("Remaillage interf: remaillage local",statistics().get_last_opened_counter_level()+1);
1170
1171 FT_Field& surfactant = maillage.Surfactant_facettes_non_const();
1173 ArrOfDouble surfactant_avant_remaillage ;
1174 if (!surfactant.get_disable_surfactant())
1175 {
1176 surfactant_avant_remaillage = surfactant.check_conservation(maillage);
1177 }
1178
1179 maillage.nettoyer_elements_virtuels();
1180 maillage.check_mesh();
1181 //boucle sur les remaillages
1182 int iter;
1183 ArrOfDoubleFT varVolume;
1184
1185 for (iter = 0; iter < nb_iter_remaillage_; iter++)
1186 {
1187 if (!surfactant.get_disable_surfactant())
1188 {
1190 surfactant.echange_espace_virtuel(maillage);
1191 surfactant.passer_variable_intensive(maillage);
1192 //maillage.nettoyer_elements_virtuels();
1193 maillage.check_mesh();
1194 }
1195
1196 const int nb_sommets = maillage.nb_sommets();
1197 varVolume.resize_array(nb_sommets);
1198 varVolume = 0.;
1199 variation_volume_ = 0.;
1200 // n = nombre de sommets supprimes
1201 int n = supprimer_petites_aretes(maillage,varVolume);
1202 if (!surfactant.get_disable_surfactant())
1203 {
1205 //nettoyer_maillage(maillage);
1206 surfactant.passer_variable_extensive(maillage);
1208 surfactant.echange_espace_virtuel(maillage);
1209 }
1210 if (Comm_Group::check_enabled()) maillage.check_mesh();
1211 if (n > 0)
1212 {
1213 if (!surfactant.get_disable_surfactant())
1214 varVolume.resize_array(maillage.nb_sommets());
1215
1217 if (Comm_Group::check_enabled()) maillage.check_mesh();
1218 // On a supprime les petites aretes en deplacant un noeud sur
1219 // un autre, la variation de volume engendree a ete mise dans varVolume:
1220 // On barycentre et on lisse, notamment pour recuperer cette variation.
1221 if(!surfactant.get_only_remaillage())
1222 barycentrer_lisser_apres_remaillage(maillage, varVolume);
1223 if (Comm_Group::check_enabled()) maillage.check_mesh();
1224 }
1225
1226 int m = diviser_grandes_aretes(maillage);
1227 if (Comm_Group::check_enabled()) maillage.check_mesh();
1228 if (m > 0)
1229 {
1230 varVolume.resize_array(maillage.nb_sommets());
1231 varVolume = 0.;
1232 if(!surfactant.get_only_remaillage())
1233 barycentrer_lisser_apres_remaillage(maillage, varVolume);
1234 if (Comm_Group::check_enabled()) maillage.check_mesh();
1235 }
1237 Journal() << "remaillage_local_interface t= " << temps << " suppressions: " << n << " divisions: " << m << finl;
1238 if (!surfactant.get_disable_surfactant())
1239 nettoyer_maillage(maillage);
1240 }
1241 if (!surfactant.get_disable_surfactant())
1242 {
1243 ArrOfDouble surfactant_apres_remaillage = surfactant.check_conservation(maillage);
1244 surfactant.correction_conservation_globale(maillage, surfactant_avant_remaillage, surfactant_apres_remaillage);
1245 }
1246 nettoyer_maillage(maillage);
1247 statistics().end_count("Remaillage interf: remaillage local");
1248}
1249
1251{
1252 const Domaine_IJK& geom = maillage.get_domaine();
1253 Vecteur3 delta(0., 0., 0.);
1254 const int dim = Objet_U::dimension;
1255 for (int k = 0; k < dim; k++)
1256 delta[k] = geom.get_constant_delta(k);
1257 // Le carre de la diagonale des elements :
1258 // diago_elem2_ = delta[0]*delta[0] + delta[1]*delta[1] + delta[2]*delta[2];
1259 return delta;
1260}
1261
1263 int som0,
1264 double x, double y, double z) const
1265{
1266 double lgrId2 = 0.;
1267 if (facteur_longueur_ideale_ > 0.)
1268 {
1269 const Maillage_FT_IJK& maillage_ijk = ref_cast(Maillage_FT_IJK, maillage);
1270 const Vecteur3 delta_xv = get_delta_euler(maillage_ijk);
1271 const int dim = Objet_U::dimension;
1272 int k;
1273 if (equilateral_)
1274 {
1275 // On calcul la diagonale de l'element eulerien. Puis longueur au carre.
1276 for (k = 0; k < dim; k++)
1277 {
1278 lgrId2 += delta_xv[k]*delta_xv[k];
1279 }
1280 }
1281 else
1282 {
1283 const DoubleTab& sommets = maillage.sommets();
1284 const Vecteur3 xyz(x, y, z);
1285 Vecteur3 v(0., 0., 0.);
1286 double norme2 = 0.;
1287 for (k = 0; k < dim; k++)
1288 {
1289 v[k] = xyz[k] - sommets(som0, k);
1290 norme2 += v[k] * v[k];
1291 }
1292 if (norme2 == 0)
1293 {
1294 v[0] = 1.;
1295 v[1] = 1.;
1296 v[2] = dim==3 ? 1. : 0.;
1297 norme2 = dim;
1298 }
1299 double f = 1. / sqrt(norme2);
1300 norme2 = 0.;
1301 for (k = 0; k < dim; k++)
1302 {
1303 v[k] *= f * delta_xv[k];
1304 norme2 += v[k] * v[k];
1305 }
1306 lgrId2 = norme2;
1307
1308 }
1310 }
1311 else
1312 {
1313 Cerr << "Erreur Remaillage_FT_IJK::calculer_longueurIdeale2_arete" << finl;
1314 Process::exit();
1315 }
1316 return lgrId2;
1317}
static int check_enabled()
Definition Comm_Group.h:159
: 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)
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
double get_constant_delta(int direction) const
Returns the size of cells in a direction.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void reinit_remeshing_table()
Definition FT_Field.h:452
void passer_variable_intensive(const Maillage_FT_IJK &mesh)
Definition FT_Field.cpp:261
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()
Definition FT_Field.h:435
void remailler_FT_Field(Maillage_FT_IJK &mesh)
Definition FT_Field.cpp:981
const ArrOfInt get_sorted_index()
Definition FT_Field.h:439
int get_only_remaillage() const
Definition FT_Field.h:338
ArrOfDouble check_conservation(const Maillage_FT_IJK &mesh)
void correction_conservation_globale(const Maillage_FT_IJK &mesh, const ArrOfDouble &surfactant_avant_remaillage, const ArrOfDouble &surfactant_apres_remaillage)
void set_tolerance_point_identique(double longueur_cara_fa7)
Definition FT_Field.h:462
ArrOfInt get_compo_connexe_sommets() const
Definition FT_Field.h:365
void echange_espace_virtuel(const Maillage_FT_Disc &mesh)
Definition FT_Field.cpp:378
void passer_variable_extensive(const Maillage_FT_IJK &mesh)
Definition FT_Field.cpp:279
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)
Definition FT_Field.cpp:898
void update_FT_Field_local_from_full_compo(const Maillage_FT_IJK &mesh)
void resize_array(int index)
Definition FT_Field.h:305
bool get_disable_surfactant() const
Definition FT_Field.h:351
DoubleTab & get_facettes_sommets_full_compo_non_const()
Definition FT_Field.h:431
: class Maillage_FT_Disc Cette classe decrit un maillage:
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,
Desc_Structure_FT desc_facettes_
virtual const ArrOfDouble & get_surface_facettes() const
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
int sommet_ligne_contact(int i) const
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)
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.
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.
int sommet_virtuel(int i) const
const ArrOfInt & sommet_PE_owner() const
pour postraitement, renvoie le numero du PE proprietaire des sommets
void nettoyer_elements_virtuels()
Retire toutes les facettes virtuelles et tous les sommets qui ne sont pas utilises.
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
: class Maillage_FT_IJK
void set_barycentrage(bool bary)
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...
int check_mesh(int error_is_fatal=1, int skip_facette_owner=0, int skip_facettes=0) const override
FT_Field & Surfactant_facettes_non_const()
const Domaine_IJK & get_domaine() const
ArrOfInt & compo_connexe_facettes_non_const()
void corriger_proprietaires_facettes()
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
double z
Definition FT_Field.h:80
double y
Definition FT_Field.h:80
double x
Definition FT_Field.h:80
static int check_int_overflow(trustIdType)
Definition Process.cpp:428
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
Definition Process.cpp:588
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
Definition Process.cpp:104
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Definition Process.cpp:146
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
void remaillage_local_interface(double temps, Maillage_FT_IJK &maillage)
int supprimer_petites_aretes(Maillage_FT_IJK &maillage, ArrOfDouble &varVolume) const
Vecteur3 get_delta_euler(const Maillage_FT_IJK &maillage) const
int diviser_grandes_aretes(Maillage_FT_IJK &maillage) const
void barycentrer_lisser_apres_remaillage(Maillage_FT_IJK &maillage, ArrOfDouble &var_volume)
void barycentrer_lisser_systematique_ijk(Maillage_FT_IJK &maillage, ArrOfDouble &var_volume)
double calculer_longueurIdeale2_arete(const Maillage_FT_Disc &maillage, int som0, double x, double y, double z) const override
Cette fonction calcule le carre de la longueur ideale d'une arete Dans un premier,...
: class Remaillage_FT Cette classe implemente les procedures de remaillage des interfaces pour le Fro...
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...
double critere_arete_
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.
double variation_volume_
int nb_iter_bary_volume_seul_
int lissage_courbure_iterations_si_remaillage_
int marquer_aretes(Maillage_FT_Disc &maillage, IntTab &tab_aretesMarquees, ArrOfInt &tab_somD, DoubleTab &tab_deplacement_somD, int drap) const
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 lissage_courbure_coeff_
double dt_remaillage_
double facteur_longueur_ideale_
int supprimer_doublons_facettes(Maillage_FT_Disc &maillage) const
Cette fonction marque a supprimer les facettes en double.
double seuil_dvolume_residuel_
double relax_barycentrage_
double temps_dernier_remaillage_
double temps_dernier_lissage_
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.
Classe de base des flux de sortie.
Definition Sortie.h:52
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)
Definition TRUSTArray.h:156
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
void append_line(_TYPE_)
Definition TRUSTTab.tpp:213
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133