TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Raffiner_Simplexes.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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 <Raffiner_Simplexes.h>
17#include <Domaine.h>
18#include <Nom.h>
19#include <Scatter.h>
20#include <Motcle.h>
21#include <TRUSTTab.h>
22#include <Array_tools.h>
23#include <Static_Int_Lists.h>
24#include <Connectivite_som_elem.h>
25#include <Declarer_bord_perio.h>
26#include <Faces_builder.h>
27#include <Synonyme_info.h>
28
29Implemente_instanciable_32_64(Raffiner_Simplexes_32_64,"Raffiner_Simplexes",Interprete_geometrique_base_32_64<_T_>) ;
30Add_synonym(Raffiner_Simplexes,"Raffiner_isotrope"); // Raffiner_Simplexes class replaces the obsolete Raffiner_isotrope class
31// XD raffiner_isotrope interprete raffiner_isotrope INHERITS_BRACE For VDF and VEF discretizations, allows to cut
32// XD_CONT triangles/quadrangles or tetrahedral/hexaedras elements respectively in 4 or 8 new ones by defining new
33// XD_CONT summits located at the middle of edges (and center of faces and elements for quadrangles and hexaedra). Such
34// XD_CONT a cut preserves the shape of original elements (isotropic). For 2D elements:
35// XD_CONT \includeimage{{raffinerisotrirect.jpeg}} NL2 For 3D elements: \includeimage{{raffinerisotetra.jpeg}} NL2
36// XD_CONT \includeimage{{raffinerisohexa.jpeg}}.
37// XD attr domain_name ref_domaine domain_name REQ Name of domain.
38
39// XD Raffiner_Simplexes_64 raffiner_isotrope Raffiner_Simplexes_64 NO_BRACE Same as Raffiner_isotrope and
40// XD_CONT Raffiner_simplexes for big (64b) domain
41template<typename _SIZE_>
43{
45 return os;
46}
47
48template<typename _SIZE_>
50{
52 return is;
53}
54
55/////////// Helper implementation class
56template<typename _SIZE_>
57class Impl_32_64
58{
59public:
60 using int_t = _SIZE_;
61 using ArrOfInt_t = ArrOfInt_T<_SIZE_>;
62 using IntVect_t = IntVect_T<_SIZE_>;
63 using IntTab_t = IntTab_T<_SIZE_>;
64 using DoubleTab_t = DoubleTab_T<_SIZE_>;
65 using SmallArrOfTID_t = SmallArrOfTID_T<_SIZE_>;
71
72 static void build_edges(const IntTab_t& nodes_of_cells, const IntTab& edges_pattern,
73 IntTab_t& edges_of_cells, IntTab_t& nodes_of_edges);
74 static void build_nodes(const DoubleTab_t& nodes_src, const IntTab_t& nodes_of_edges_src, DoubleTab_t& nodes_dest);
75 static int_t find_refined_node_index(const IntTab_t& nodes_of_cells_src, const IntTab_t& edges_of_cells_src,
76 int_t nb_nodes_src, int_t cell_src, int index);
77 static void build_cells(const IntTab_t& nodes_of_cells_src, const IntTab_t& edges_of_cells_src, const IntTab& pattern,
78 int_t nb_nodes_src, IntTab_t& nodes_of_cells_dest);
79 static void build_frontier(const Frontiere_t& src,
80 const Type_Face& face_type,
81 const IntTab_t& nodes_of_cells_src,
82 const Static_Int_Lists_32_64<_SIZE_>& cells_of_nodes_src,
83 const IntTab_t& edges_of_cells_src,
84 const IntTab& faces_pattern,
85 const IntTab& faces_refinement_pattern,
86 const Domaine_t& domaine_dest,
87 Frontiere_t& dest);
88};
89
90
91// Macros pour l'encodage de l'idx (meme fonction que build_idx mais pratique
92// pour ecrire le code de build_refine_...)
93// Sommet fin situe sur le sommet "num" de l'element grossier:
94#define NODE_ID(num) num
95// Sommet fin situe au milieu de l'arete "num" de l'element grossier:
96#define EDGE_ID(num) (-num-1)
97
98namespace
99{
100
101void fill_tab_2(const int *t, int n, int m, IntTab& tab)
102{
103 tab.resize(n, m);
104
105 for (int i=0; i<n; ++i)
106 for (int j=0; j<m; ++j)
107 tab(i,j) = t[i*m+j];
108
109 if (t[n*m] != -1)
110 {
111 Cerr << "Error in Raffiner_Simplexes_32_64 'filltab_2'" << finl;
113 }
114}
115
116void fill_tab_2_new(const int *t, int n, int m, IntTab& tab)
117{
118 tab.resize(n, m);
119 tab=-1;
120 int compt=0;
121 for (int i=0; i<n; ++i)
122 {
123 int nb=t[compt++];
124
125 for (int j=0; j<nb; ++j)
126 {
127 tab(i,j) = t[compt++];
128 }
129 }
130
131 if (t[compt] != -1)
132 {
133 Cerr << "Error in Raffiner_Simplexes_32_64 'filltab_2_new'" << finl;
135 }
136}
137
138
139void fill_tab_3(const int *t, int n, int m, int p, IntTab& tab)
140{
141 tab.resize(n, m, p);
142
143 for (int i=0; i<n; ++i)
144 {
145 for (int j=0; j<m; ++j)
146 {
147 for (int k=0; k<p; ++k)
148 {
149 tab(i,j,k) = t[(i*m+j)*p+k];
150 }
151 }
152 }
153
154 if (t[n*m*p] != -1)
155 {
156 Cerr << "Error in Raffiner_Simplexes_32_64 'filltab_3'" << finl;
158 }
159}
160
161
162void build_quadrangle_cell_refinement_pattern(IntTab& pattern)
163{
164 const int t[] = { NODE_ID(0), EDGE_ID(0), EDGE_ID(3), EDGE_ID(4), // triangle defini par sommet0 arete0 arete1
165 EDGE_ID(0), NODE_ID(1), EDGE_ID(4),EDGE_ID(1), // etc...
166 EDGE_ID(4), EDGE_ID(1), EDGE_ID(2), NODE_ID(3),
167 EDGE_ID(3), EDGE_ID(4), NODE_ID(2), EDGE_ID(2), -1
168 } ;
169 fill_tab_2(t, 4, 4, pattern);
170}
171
172void build_triangle_cell_refinement_pattern(IntTab& pattern)
173{
174 const int t[] = { NODE_ID(0), EDGE_ID(0), EDGE_ID(1), // triangle defini par sommet0 arete0 arete1
175 EDGE_ID(0), NODE_ID(1), EDGE_ID(2), // etc...
176 EDGE_ID(1), EDGE_ID(2), NODE_ID(2),
177 EDGE_ID(2), EDGE_ID(1), EDGE_ID(0), -1
178 } ;
179 fill_tab_2(t, 4, 3, pattern);
180}
181
182void build_tetrahedron_cell_refinement_pattern(IntTab& pattern)
183{
184 const int t[] = { NODE_ID(0), EDGE_ID(0), EDGE_ID(1), EDGE_ID(2) , // tetraedre defini par sommet0 arete0 arete1 arete2
185 EDGE_ID(0), NODE_ID(1), EDGE_ID(3), EDGE_ID(4) , // etc...
186 EDGE_ID(1), EDGE_ID(3), NODE_ID(2), EDGE_ID(5) ,
187 EDGE_ID(2), EDGE_ID(4), EDGE_ID(5), NODE_ID(3) ,
188 EDGE_ID(1), EDGE_ID(5), EDGE_ID(4), EDGE_ID(3) ,
189 EDGE_ID(5), EDGE_ID(4), EDGE_ID(2), EDGE_ID(1) ,
190 EDGE_ID(4), EDGE_ID(2), EDGE_ID(1), EDGE_ID(0) ,
191 EDGE_ID(3), EDGE_ID(1), EDGE_ID(0), EDGE_ID(4) , -1
192 };
193 fill_tab_2(t, 8, 4, pattern);
194}
195// Convention de numerotation
196// sommets
197// 6------7
198// /| /|
199// 4------5 |
200// | | | |
201// | 2----|-3
202// |/ |/
203// 0------1
204void build_hexa_cell_refinement_pattern(IntTab& pattern)
205{
206 const int t[] =
207 {
208 NODE_ID(0),EDGE_ID(0),EDGE_ID(3),EDGE_ID(4),EDGE_ID(5),EDGE_ID(6),EDGE_ID(8),EDGE_ID(9), // tetraedre defini par sommet0 arete0 arete1 arete2
209
210 EDGE_ID(0),NODE_ID(1),EDGE_ID(4),EDGE_ID(1),EDGE_ID(6),EDGE_ID(7),EDGE_ID(9),EDGE_ID(10),
211 EDGE_ID(3),EDGE_ID(4),NODE_ID(2),EDGE_ID(2),EDGE_ID(8),EDGE_ID(9),EDGE_ID(11),EDGE_ID(12),
212 EDGE_ID(4),EDGE_ID(1),EDGE_ID(2),NODE_ID(3),EDGE_ID(9),EDGE_ID(10),EDGE_ID(12),EDGE_ID(13),
213
214 EDGE_ID(5),EDGE_ID(6),EDGE_ID(8),EDGE_ID(9),NODE_ID(4),EDGE_ID(14),EDGE_ID(17),EDGE_ID(18),
215 EDGE_ID(6),EDGE_ID(7),EDGE_ID(9),EDGE_ID(10),EDGE_ID(14),NODE_ID(5),EDGE_ID(18),EDGE_ID(15),
216 EDGE_ID(8),EDGE_ID(9),EDGE_ID(11),EDGE_ID(12),EDGE_ID(17),EDGE_ID(18),NODE_ID(6),EDGE_ID(16),
217 EDGE_ID(9),EDGE_ID(10),EDGE_ID(12),EDGE_ID(13),EDGE_ID(18),EDGE_ID(15),EDGE_ID(16),NODE_ID(7),
218
219 -1
220 };
221 fill_tab_2(t, 8, 8, pattern);
222}
223
224int type_elem(const Nom& cell_type)
225{
226 Motcles understood_keywords(6);
227 understood_keywords[0] = "Triangle";
228 understood_keywords[1] = "Tetraedre";
229 understood_keywords[2] = "Rectangle";
230 understood_keywords[3] = "Hexaedre";
231 understood_keywords[4] = "Quadrangle";
232 understood_keywords[5] = "Hexaedre_VEF";
233 Nom reduce_call_type(cell_type);
234 reduce_call_type.prefix("_64");
235 const Motcle c(reduce_call_type);
236 int rank = understood_keywords.search(c);
237 if (rank>3) rank-=2;
238 return rank;
239}
240
241void build_cell_refinement_pattern(IntTab& pattern, const Nom& cell_type)
242{
243 int rank = type_elem(cell_type);
244 switch(rank)
245 {
246 case 0 :
247 build_triangle_cell_refinement_pattern(pattern);
248 break;
249 case 1 :
250 build_tetrahedron_cell_refinement_pattern(pattern);
251 break;
252 case 2 :
253 build_quadrangle_cell_refinement_pattern(pattern);
254 break;
255 case 3 :
256 build_hexa_cell_refinement_pattern(pattern);
257 break;
258 default :
259 Cerr << "Error in Raffiner_Simplexes_32_64.cpp 'build_cell_refinement_pattern()'" << finl;
260 Cerr << " Unknown cell type : " << cell_type << finl;
261 Cerr << " Raffiner_Simplexes_32_64 can only refine Triangles and Tetrahedrons" << finl;
263 }
264}
265
266
267void build_quadrangle_face_refinement_pattern(IntTab& pattern)
268{
269 const int t[] = { NODE_ID(0), EDGE_ID(0),
270 EDGE_ID(0), NODE_ID(1),
271
272 NODE_ID(3), EDGE_ID(1),
273 EDGE_ID(1), NODE_ID(1),
274
275 NODE_ID(3), EDGE_ID(2),
276 EDGE_ID(2), NODE_ID(2),
277
278 NODE_ID(0), EDGE_ID(3),
279 EDGE_ID(3), NODE_ID(2),-1
280 };
281 fill_tab_3(t, 4, 2, 2, pattern);
282}
283
284void build_triangle_face_refinement_pattern(IntTab& pattern)
285{
286 const int t[] = { NODE_ID(2), EDGE_ID(2),
287 EDGE_ID(2), NODE_ID(1),
288
289 NODE_ID(0), EDGE_ID(1),
290 EDGE_ID(1), NODE_ID(2),
291
292 NODE_ID(1), EDGE_ID(0),
293 EDGE_ID(0), NODE_ID(0), -1
294 };
295 fill_tab_3(t, 3, 2, 2, pattern);
296}
297
298void build_tetrahedron_face_refinement_pattern(IntTab& pattern)
299{
300 const int t[] = { NODE_ID(1), EDGE_ID(3), EDGE_ID(4),
301 EDGE_ID(3), NODE_ID(2), EDGE_ID(5),
302 EDGE_ID(4), EDGE_ID(5), NODE_ID(3),
303 EDGE_ID(5), EDGE_ID(4), EDGE_ID(3),
304
305 NODE_ID(2), EDGE_ID(1), EDGE_ID(5),
306 EDGE_ID(1), NODE_ID(0), EDGE_ID(2),
307 EDGE_ID(5), EDGE_ID(2), NODE_ID(3),
308 EDGE_ID(2), EDGE_ID(5), EDGE_ID(1),
309
310 NODE_ID(3), EDGE_ID(2), EDGE_ID(4),
311 EDGE_ID(2), NODE_ID(0), EDGE_ID(0),
312 EDGE_ID(4), EDGE_ID(0), NODE_ID(1),
313 EDGE_ID(0), EDGE_ID(4), EDGE_ID(2),
314
315 NODE_ID(0), EDGE_ID(1), EDGE_ID(0),
316 EDGE_ID(1), NODE_ID(2), EDGE_ID(3),
317 EDGE_ID(0), EDGE_ID(3), NODE_ID(1),
318 EDGE_ID(3), EDGE_ID(0), EDGE_ID(1), -1
319 };
320
321 fill_tab_3(t, 4, 4, 3, pattern);
322}
323
324void build_hexa_face_refinement_pattern(IntTab& pattern)
325{
326 const int t[] = { NODE_ID(0), EDGE_ID(3), EDGE_ID(5), EDGE_ID(8), // 0 2 4 6
327 EDGE_ID(3), NODE_ID(2), EDGE_ID(8), EDGE_ID(11),
328 EDGE_ID(5), EDGE_ID(8), NODE_ID(4), EDGE_ID(17),
329 EDGE_ID(8), EDGE_ID(11), EDGE_ID(17), NODE_ID(6),
330
331 NODE_ID(0), EDGE_ID(0), EDGE_ID(5), EDGE_ID(6), // 0, 1, 4, 5 ,
332 EDGE_ID(0), NODE_ID(1), EDGE_ID(6), EDGE_ID(7),
333 EDGE_ID(5), EDGE_ID(6), NODE_ID(4), EDGE_ID(14),
334 EDGE_ID(6), EDGE_ID(7), EDGE_ID(14), NODE_ID(5),
335
336
337 NODE_ID(0), EDGE_ID(0), EDGE_ID(3), EDGE_ID(4), // 0, 1, 2, 3 ,
338 EDGE_ID(0), NODE_ID(1), EDGE_ID(4), EDGE_ID(1),
339 EDGE_ID(3), EDGE_ID(4), NODE_ID(2), EDGE_ID(2),
340 EDGE_ID(4), EDGE_ID(1), EDGE_ID(2), NODE_ID(3),
341
342 NODE_ID(1), EDGE_ID(1), EDGE_ID(7), EDGE_ID(10), // 1, 3, 5, 7 ,
343 EDGE_ID(1), NODE_ID(3), EDGE_ID(10), EDGE_ID(13),
344 EDGE_ID(7), EDGE_ID(10), NODE_ID(5), EDGE_ID(15),
345 EDGE_ID(10), EDGE_ID(13), EDGE_ID(15), NODE_ID(7),
346
347 NODE_ID(2), EDGE_ID(2), EDGE_ID(11), EDGE_ID(12), // 2, 3, 6, 7 ,
348 EDGE_ID(2), NODE_ID(3), EDGE_ID(12), EDGE_ID(13),
349 EDGE_ID(11), EDGE_ID(12), NODE_ID(6), EDGE_ID(16),
350 EDGE_ID(12), EDGE_ID(13), EDGE_ID(16), NODE_ID(7),
351
352 NODE_ID(4), EDGE_ID(14), EDGE_ID(17), EDGE_ID(18), // 4, 5, 6, 7
353 EDGE_ID(14), NODE_ID(5), EDGE_ID(18), EDGE_ID(15),
354 EDGE_ID(17), EDGE_ID(18), NODE_ID(6), EDGE_ID(16),
355 EDGE_ID(18), EDGE_ID(15), EDGE_ID(16), NODE_ID(7),
356
357 -1
358 };
359
360 fill_tab_3(t, 6, 4, 4, pattern);
361}
362
363
364void build_face_refinement_pattern(IntTab& pattern, const Nom& cell_type)
365{
366 int rank = type_elem(cell_type);
367 switch(rank)
368 {
369 case 0 :
370 build_triangle_face_refinement_pattern(pattern);
371 break;
372 case 1 :
373 build_tetrahedron_face_refinement_pattern(pattern);
374 break;
375 case 2 :
376 build_quadrangle_face_refinement_pattern(pattern);
377 break;
378 case 3 :
379 build_hexa_face_refinement_pattern(pattern);
380 break;
381 default :
382 Cerr << "Error in Raffiner_Simplexes_32_64.cpp 'build_face_refinement_pattern()'" << finl;
383 Cerr << " Unknown cell type : " << cell_type << finl;
384 Cerr << " Raffiner_Simplexes_32_64 can only refine Triangles and Tetrahedrons" << finl;
386 }
387}
388
389
390void build_quadrangle_edges_pattern(IntTab& pattern)
391{
392 const int t[] = { 2,0, 1 ,
393 2,1, 3,
394 2, 2, 3,
395 2, 0, 2,
396 4,0,3,1,2,
397 -1
398 };
399 fill_tab_2_new(t, 5, 4, pattern);
400}
401
402void build_triangle_edges_pattern(IntTab& pattern)
403{
404 const int t[] = { 0, 1 ,
405 0, 2 ,
406 1, 2 , -1
407 };
408 fill_tab_2(t, 3, 2, pattern);
409}
410
411void build_tetrahedron_edges_pattern(IntTab& pattern)
412{
413 const int t[] = { 0, 1 , // L'arete 0 est entre le sommet 0 et le sommet 1 de l'element
414 0, 2 , // L'arete 1 est entre 0 et 2
415 0, 3 , // etc...
416 1, 2 ,
417 1, 3 ,
418 2, 3 , -1
419 };
420 fill_tab_2(t, 6, 2, pattern);
421}
422
423// plan haut
424// 6-- 16'---7
425// / /
426// 17' 18' 15'
427// / /
428// 4---14'---5
429//
430// plan milieu
431// 11'--12'---13'
432// / /
433// 8' 9' 10'
434// / /
435// 5'---6'---7'
436//
437// plan bas
438// 2--2'---3
439// / /
440// 3' 4' 1'
441// / /
442// 0---0'---1
443void build_hexa_edges_pattern(IntTab& pattern)
444{
445
446 const int t[] = { 2, 0, 1 , // L'arete 0 est entre le sommet 0 et le sommet 1 de l'element
447 2, 1, 3 , // etc...
448 2, 2, 3 ,
449 2, 0, 2 ,
450 4, 0, 3 , 1,2,
451 2, 0,4, 4,0,5,1,4 ,2, 1,5 , // 5' 6' 7'
452 4,0,6,2,4, 8,0,7,1,6,3,4,2,5, 4,1,7,3,5,
453 2,2,6, 4,2,7,3,6, 2,3,7, //11' 12' 13'
454 2,4,5, 2,5,7, 2,6,7, 2,4,6 , 4,4,7,5,6,
455 -1
456 };
457 fill_tab_2_new(t, 19, 8, pattern);
458}
459
460void build_edges_pattern(IntTab& pattern, const Nom& cell_type)
461{
462
463 int rank = type_elem(cell_type);
464 switch(rank)
465 {
466 case 0 :
467 build_triangle_edges_pattern(pattern);
468 break;
469 case 1 :
470 build_tetrahedron_edges_pattern(pattern);
471 break;
472 case 2 :
473 build_quadrangle_edges_pattern(pattern);
474 break;
475 case 3 :
476 build_hexa_edges_pattern(pattern);
477 break;
478 default :
479 Cerr << "Error in Raffiner_Simplexes_32_64.cpp 'build_edges_pattern()'" << finl;
480 Cerr << " Unknown cell type : " << cell_type << finl;
481 Cerr << " Raffiner_Simplexes_32_64 can only refine Triangles and Tetrahedrons" << finl;
483 }
484}
485
486void build_quadrangle_faces_pattern(IntTab& pattern)
487{
488 const int t[] = { 0, 1 ,
489 1, 3,
490 3, 2 ,
491 2, 0 , -1
492 };
493 fill_tab_2(t, 4, 2, pattern);
494}
495
496void build_triangle_faces_pattern(IntTab& pattern)
497{
498 const int t[] = { 2, 1 ,
499 0, 2,
500 1, 0 , -1
501 };
502 fill_tab_2(t, 3, 2, pattern);
503}
504
505void build_tetrahedron_faces_pattern(IntTab& pattern)
506{
507 const int t[] = { 1, 2, 3,
508 2, 0, 3,
509 3, 0, 1,
510 0, 2, 1, -1
511 };
512 fill_tab_2(t, 4, 3, pattern);
513}
514
515void build_hexa_faces_pattern(IntTab& pattern)
516{
517 const int t[] = { 0, 2, 4, 6 ,
518 0, 1, 4, 5 ,
519 0, 1, 2, 3 ,
520 1, 3, 5, 7 ,
521 2, 3, 6, 7 ,
522 4, 5, 6, 7 , -1
523 };
524 fill_tab_2(t, 6, 4, pattern);
525}
526
527
528void build_faces_pattern(IntTab& pattern, const Nom& cell_type)
529{
530
531 int rank = type_elem(cell_type);
532 switch(rank)
533 {
534 case 0 :
535 build_triangle_faces_pattern(pattern);
536 break;
537 case 1 :
538 build_tetrahedron_faces_pattern(pattern);
539 break;
540 case 2 :
541 build_quadrangle_faces_pattern(pattern);
542 break;
543 case 3 :
544 build_hexa_faces_pattern(pattern);
545 break;
546 default :
547 Cerr << "Error in Raffiner_Simplexes_32_64.cpp 'build_faces_pattern()'" << finl;
548 Cerr << " Unknown cell type : " << cell_type << finl;
549 Cerr << " Raffiner_Simplexes_32_64 can only refine Triangles and Tetrahedrons" << finl;
551 }
552}
553
554} // end anonymous namespace
555
556///////////////////////////////////////////////////////////////
557
558template <typename _SIZE_>
559void Impl_32_64<_SIZE_>::build_edges(const IntTab_t& nodes_of_cells, const IntTab& edges_pattern,
560 IntTab_t& edges_of_cells, IntTab_t& nodes_of_edges)
561{
562 const int_t nb_cells = nodes_of_cells.dimension(0);
563 const int nb_edges_per_cell = edges_pattern.dimension(0);
564 // const int nb_nodes_per_edge = 2;
565 const int nb_nodes_per_edge_max = edges_pattern.dimension(1);
566 IntTab_t duplicated_edges(nb_cells * nb_edges_per_cell, nb_nodes_per_edge_max);
567 int_t nb_duplicated_edges = 0;
568 for (int_t cell=0; cell<nb_cells; ++cell)
569 {
570 for (int edge_in_cell=0; edge_in_cell<nb_edges_per_cell; ++edge_in_cell)
571 {
572 const int node_in_cell_0 = edges_pattern(edge_in_cell,0);
573 const int node_in_cell_1 = edges_pattern(edge_in_cell,1);
574
575 int_t node_0 = nodes_of_cells(cell,node_in_cell_0);
576 int_t node_1 = nodes_of_cells(cell,node_in_cell_1);
577 // En 3D le centre de gravite des faces est defini par les 2 diagonales
578 // pour assurer l'unicite avec la numerotation on prend la diagonale avec l indice de noeuds le grand en premier
579 bool quad_2d=false;
580
581 if (Objet_U::dimension==3)
582 {
583 int it=nb_nodes_per_edge_max;
584 while ( edges_pattern(edge_in_cell,it-1)==-1) it--;
585 if (it==4)
586 quad_2d=true;
587 }
588 if (quad_2d)
589 {
590 const int node_in_cell_2 = edges_pattern(edge_in_cell,2);
591 const int node_in_cell_3 = edges_pattern(edge_in_cell,3);
592
593 int_t node_2 = nodes_of_cells(cell,node_in_cell_2);
594 int_t node_3 = nodes_of_cells(cell,node_in_cell_3);
595 if (node_0 <node_1)
596 std::swap(node_0,node_1);
597 if (node_2 <node_3)
598 std::swap(node_2,node_3);
599 if (node_2>node_0)
600 {
601 duplicated_edges(nb_duplicated_edges,2)=node_0;
602 duplicated_edges(nb_duplicated_edges,3)=node_1;
603 node_0=node_2;
604 node_1=node_3;
605 }
606 else
607 {
608 assert(node_2!=node_0);
609 duplicated_edges(nb_duplicated_edges,2)=node_2;
610 duplicated_edges(nb_duplicated_edges,3)=node_3;
611 }
612 for (int c=4; c<nb_nodes_per_edge_max; c++)
613 duplicated_edges(nb_duplicated_edges,c)=-1;
614
615 }
616 duplicated_edges(nb_duplicated_edges,0) = (node_0 < node_1) ? node_0 : node_1;
617 duplicated_edges(nb_duplicated_edges,1) = (node_0 < node_1) ? node_1 : node_0;
618 if (!quad_2d)
619 for (int c=2; c<nb_nodes_per_edge_max; c++)
620 {
621 int node=edges_pattern(edge_in_cell,c);
622 if (node==-1)
623 duplicated_edges(nb_duplicated_edges,c)=-1;
624 else
625 duplicated_edges(nb_duplicated_edges,c)=nodes_of_cells(cell,node);
626 }
627 ++nb_duplicated_edges;
628 }
629 }
630
631
632 ArrOfInt_t edges_indices;
633 tri_lexicographique_tableau_indirect(duplicated_edges,edges_indices);
634
635 edges_of_cells.resize(nb_cells, nb_edges_per_cell);
636 nodes_of_edges.resize(0, nb_nodes_per_edge_max);
637
638
639 ArrOfInt_t& edges_of_cells_array = edges_of_cells;
640 int_t node_0,node_1,edges_counter;
641 node_0 = node_1 = edges_counter = -1;
642
643 for (int_t duplicated_edge=0; duplicated_edge<nb_duplicated_edges; ++duplicated_edge)
644 {
645 const int_t edge_index = edges_indices[duplicated_edge];
646 const int_t new_node_0 = duplicated_edges(edge_index, 0);
647 const int_t new_node_1 = duplicated_edges(edge_index, 1);
648 if (node_0 != new_node_0 || node_1 != new_node_1)
649 {
650 edges_counter++;
651 nodes_of_edges.resize(edges_counter+1, nb_nodes_per_edge_max);
652 nodes_of_edges(edges_counter, 0) = new_node_0;
653 nodes_of_edges(edges_counter, 1) = new_node_1;
654 for (int c=2; c<nb_nodes_per_edge_max; c++)
655 nodes_of_edges(edges_counter, c)=duplicated_edges(edge_index,c);
656 node_0 = new_node_0;
657 node_1 = new_node_1;
658 }
659 // la, ya un truc qui m'etonne : dans mon code, c'est plus complexe
660 edges_of_cells_array[edge_index] = edges_counter;
661 }
662
663 nodes_of_edges.resize(edges_counter+2, nb_nodes_per_edge_max);
664
665 nodes_of_edges.resize(edges_counter+1, nb_nodes_per_edge_max);
666}
667
668template<typename _SIZE_>
669void Impl_32_64<_SIZE_>::build_nodes(const DoubleTab_t& nodes_src, const IntTab_t& nodes_of_edges_src, DoubleTab_t& nodes_dest)
670{
671 assert( &(nodes_src) != &(nodes_dest) );
672
673 const int_t nb_nodes_src = nodes_src.dimension(0);
674 const int_t nb_edges_src = nodes_of_edges_src.dimension(0);
675
676 const int_t nb_nodes_dest = nb_nodes_src + nb_edges_src;
677
678 nodes_dest = nodes_src;
679 nodes_dest.resize(nb_nodes_dest,Objet_U::dimension);
680 int nb_node_per_edge_max= nodes_of_edges_src.dimension_int(1);
681 if (nb_node_per_edge_max==20)
682 for (int_t edge=0; edge<nb_edges_src; ++edge)
683 {
684 const int_t node_0 = nodes_of_edges_src(edge, 0);
685 const int_t node_1 = nodes_of_edges_src(edge, 1);
686 for (int i=0; i<Objet_U::dimension; ++i)
687 {
688 const double x = (nodes_src(node_0, i) + nodes_src(node_1, i)) * 0.5;
689 nodes_dest(nb_nodes_src + edge, i) = x;
690 }
691 }
692 else
693 for (int_t edge=0; edge<nb_edges_src; ++edge)
694 {
695 int nb=nb_node_per_edge_max;
696
697 while(nodes_of_edges_src(edge,nb-1)==-1) nb--;
698
699 double inv=1./nb;
700
701 const int_t node_0 = nodes_of_edges_src(edge, 0);
702 for (int i=0; i<Objet_U::dimension; ++i)
703 {
704 double x = nodes_src(node_0, i);
705 for (int c=1; c<nb; c++)
706 {
707 const int_t node_1 = nodes_of_edges_src(edge, c);
708 x+=nodes_src(node_1, i);
709 }
710 nodes_dest(nb_nodes_src + edge, i) = x*inv;
711 }
712 }
713}
714
715template<typename _SIZE_>
716typename Impl_32_64<_SIZE_>::int_t Impl_32_64<_SIZE_>::find_refined_node_index(const IntTab_t& nodes_of_cells_src, const IntTab_t& edges_of_cells_src,
717 int_t nb_nodes_src, int_t cell_src, int index)
718{
719 int_t node_index = -1;
720 if (index >= 0)
721 node_index = nodes_of_cells_src(cell_src,NODE_ID(index));
722 else
723 node_index = nb_nodes_src + edges_of_cells_src(cell_src,EDGE_ID(index));
724 return node_index;
725}
726
727template<typename _SIZE_>
728void Impl_32_64<_SIZE_>:: build_cells(const IntTab_t& nodes_of_cells_src, const IntTab_t& edges_of_cells_src, const IntTab& pattern,
729 int_t nb_nodes_src, IntTab_t& nodes_of_cells_dest)
730{
731 assert( &(nodes_of_cells_src) != &(nodes_of_cells_dest) );
732
733 const int_t nb_cells_src = nodes_of_cells_src.dimension(0);
734 const int nb_nodes_per_cell = nodes_of_cells_src.dimension_int(1);
735 const int nb_refined_cells_per_cell = pattern.dimension(0);
736
737 if (std::is_same<_SIZE_, int>::value)
738 {
739 _SIZE_ size = (_SIZE_) (nb_cells_src * nb_refined_cells_per_cell);
740 if (size < 0)
741 Process::exit("Refined mesh too big ! Update your data file by using int64 geometric interpretors, like Domaine_64, Mailler_64, Raffiner_simplexes_64, Partition_64.");
742 }
743 nodes_of_cells_dest.resize(nb_cells_src * nb_refined_cells_per_cell, nb_nodes_per_cell);
744
745 int_t nb_cells_dest = 0;
746 for (int_t cell_src=0; cell_src<nb_cells_src; ++cell_src)
747 {
748 for (int refined_cell=0; refined_cell<nb_refined_cells_per_cell; ++refined_cell)
749 {
750 for (int node_in_cell=0; node_in_cell<nb_nodes_per_cell; ++node_in_cell)
751 {
752 const int index = pattern(refined_cell,node_in_cell);
753 const int_t node = find_refined_node_index(nodes_of_cells_src,edges_of_cells_src,nb_nodes_src,cell_src,index);
754 nodes_of_cells_dest(nb_cells_dest,node_in_cell) = node;
755 }
756 ++nb_cells_dest;
757 }
758 }
759}
760
761
762template<typename _SIZE_>
764 const Type_Face& face_type,
765 const IntTab_t& nodes_of_cells_src,
766 const Static_Int_Lists_32_64<_SIZE_>& cells_of_nodes_src,
767 const IntTab_t& edges_of_cells_src,
768 const IntTab& faces_pattern,
769 const IntTab& faces_refinement_pattern,
770 const Domaine_t& domaine_dest,
771 Frontiere_t& dest)
772{
773 dest.associer_domaine(domaine_dest);
774 dest.typer_faces(face_type);
775 dest.nommer(src.le_nom());
776
777 const IntTab_t& nodes_of_faces_src = src.les_sommets_des_faces();
778 int_t nb_faces_src = nodes_of_faces_src.dimension(0);
779 int nb_nodes_per_face = nodes_of_faces_src.dimension_int(1);
780 int nb_faces_dest_per_face_src = faces_refinement_pattern.dimension_int(1);
781 int_t nb_nodes_src = cells_of_nodes_src.get_nb_lists();
782
783 IntTab_t nodes_of_faces_dest(nb_faces_src*nb_faces_dest_per_face_src,nb_nodes_per_face);
784 SmallArrOfTID_t nodes_of_current_face(nb_nodes_per_face);
785 SmallArrOfTID_t incident_cells;
786 bool is_internal_faces = (sub_type(Groupe_Faces_t, src) || sub_type(Joint, src) || sub_type(Bord_Interne_t, src)) ;
787
788 for (int_t face=0; face<nb_faces_src; ++face)
789 {
790 for (int node_in_face=0; node_in_face<nb_nodes_per_face; ++node_in_face)
791 nodes_of_current_face[node_in_face] = nodes_of_faces_src(face,node_in_face);
792
793 find_adjacent_elements(cells_of_nodes_src,nodes_of_current_face,incident_cells);
794 if ((incident_cells.size_array() != 1) && (!is_internal_faces))
795 {
796 // Cette erreur n'en est pas une pour les "bords internes, groupe_faces ou joints"...
797 // si le cas se presente, faire un test en essayant d'ignorer l'erreur...
798 Cerr << "Error in Raffiner_Simplexes_32_64.cpp 'build_frontier()'" << finl;
799 Cerr << " The boundary face " << face << " having nodes " << nodes_of_current_face << " has the following incident cells " << incident_cells << finl;
801 }
802 const int_t coarse_cell = incident_cells[0];
803 const int face_in_coarse_cell = Faces_builder_32_64<_SIZE_>::chercher_face_element(nodes_of_cells_src,
804 faces_pattern,
805 nodes_of_current_face,
806 coarse_cell);
807 if (face_in_coarse_cell < 0)
808 {
809 Cerr << "Error in Raffiner_Simplexes_32_64.cpp 'build_frontier()'" << finl;
810 Cerr << " Internal error in 'Faces_builder_32_64<_SIZE_>::chercher_face_element()'" << finl;
812 }
813
814 for (int fine_face=0; fine_face<nb_faces_dest_per_face_src; ++fine_face)
815 {
816 int_t face_dest = (face*nb_faces_dest_per_face_src)+fine_face;
817 for (int node_in_face=0; node_in_face<nb_nodes_per_face; ++node_in_face)
818 {
819 const int index = faces_refinement_pattern(face_in_coarse_cell,fine_face,node_in_face);
820 const int_t node_dest = find_refined_node_index(nodes_of_cells_src,edges_of_cells_src,nb_nodes_src,coarse_cell,index);
821 nodes_of_faces_dest(face_dest,node_in_face) = node_dest;
822 }
823 }
824 }
825 dest.les_sommets_des_faces() = nodes_of_faces_dest;
826}
827
828
829
830template<typename _SIZE_>
832{
833 using Impl_ = Impl_32_64<_SIZE_>;
834
835 using ArrOfInt_t = ArrOfInt_T<_SIZE_>;
836 using IntVect_t = IntVect_T<_SIZE_>;
837 using IntTab_t = IntTab_T<_SIZE_>;
838 using DoubleTab_t = DoubleTab_T<_SIZE_>;
839 using SmallArrOfTID_t = SmallArrOfTID_T<_SIZE_>;
840
841 using Sous_Domaine_t = Sous_Domaine_32_64<_SIZE_>;
842 using Bords_t = Bords_32_64<_SIZE_>;
843 using Bord_t = Bord_32_64<_SIZE_>;
844 using Groupes_Faces_t = Groupes_Faces_32_64<_SIZE_>;
845 using Groupe_Faces_t = Groupe_Faces_32_64<_SIZE_>;
846 using Bords_Internes_t = Bords_Internes_32_64<_SIZE_>;
847 using Bord_Interne_t = Bord_Interne_32_64<_SIZE_>;
848 using Joints_t = Joints_32_64<_SIZE_>;
849 using Joint_t = Joint_32_64<_SIZE_>;
850 using Raccords_t = Raccords_32_64<_SIZE_>;
851 using Raccord_t = OWN_PTR(Raccord_base_32_64<_SIZE_>);
852
853
854 const Nom& cell_type = src.type_elem()->que_suis_je();
855 const IntTab_t& nodes_of_cells_src = src.les_elems();
856 const DoubleTab_t& nodes_src = src.les_sommets();
857
858 IntTab edges_pattern;
859 ::build_edges_pattern(edges_pattern,cell_type);
860
861 IntTab faces_pattern;
862 ::build_faces_pattern(faces_pattern,cell_type);
863
864 IntTab cell_refinement_pattern;
865 ::build_cell_refinement_pattern(cell_refinement_pattern,cell_type);
866
867 IntTab face_refinement_pattern;
868 ::build_face_refinement_pattern(face_refinement_pattern,cell_type);
869
870 Static_Int_Lists_32_64<_SIZE_> cells_of_nodes_src;
871 ::construire_connectivite_som_elem(src.nb_som(), nodes_of_cells_src, cells_of_nodes_src,0);
872
873 IntTab_t edges_of_cells_src;
874 IntTab_t nodes_of_edges_src;
875 Impl_::build_edges(nodes_of_cells_src, edges_pattern, edges_of_cells_src, nodes_of_edges_src);
876
877 DoubleTab_t& nodes_dest = dest.les_sommets();
878 Impl_::build_nodes(nodes_src,nodes_of_edges_src,nodes_dest);
879
880 IntTab_t& nodes_of_cells_dest = dest.les_elems();
881 Impl_::build_cells(nodes_of_cells_src,edges_of_cells_src,cell_refinement_pattern,nodes_src.dimension(0),nodes_of_cells_dest);
882
883 // Rebuild sub-domains:
884 const int nb_refined_cells_per_cell = cell_refinement_pattern.dimension(0);
885 for (int i=0; i<dest.nb_ss_domaines(); i++)
886 {
887 Sous_Domaine_t& ssz = dest.ss_domaine(i);
888 Cerr << "Refining sub-domain " << ssz.le_nom() << finl;
889 IntVect_t old_polys = ssz.les_elems();
890 IntVect_t& les_polys = ssz.les_elems();
891 int_t old_size = old_polys.size_array();
892 les_polys.resize(old_size * nb_refined_cells_per_cell);
893 int_t new_poly=0;
894 for (auto& old_poly : old_polys)
895 {
896 for (int refined_cell = 0; refined_cell < nb_refined_cells_per_cell; ++refined_cell)
897 {
898 les_polys(new_poly) = old_poly * nb_refined_cells_per_cell + refined_cell;
899 new_poly++;
900 }
901 }
902 }
903
904 auto build_front_lambda_rac = [&] (const auto& boundaries_src_arg, auto& boundaries_dest_arg, auto&& new_obj)
905 {
906 boundaries_dest_arg.vide();
907 const int nb_boundaries = boundaries_src_arg.size();
908 for (int boundary=0; boundary<nb_boundaries; ++boundary)
909 {
910 boundaries_dest_arg.add(new_obj);
911 boundaries_dest_arg[boundary].typer(boundaries_src_arg[boundary]->que_suis_je());
912 const Type_Face& face_type = boundaries_src_arg[boundary]->faces().type_face();
913 Impl_::build_frontier(boundaries_src_arg[boundary].valeur(),
914 face_type,
915 nodes_of_cells_src, cells_of_nodes_src, edges_of_cells_src,
916 faces_pattern, face_refinement_pattern,
917 dest,
918 boundaries_dest_arg[boundary].valeur());
919 }
920 };
921
922 // Almost the same, without .valeur():
923 auto build_front_lambda = [&] (const auto& boundaries_src_arg, auto& boundaries_dest_arg, auto&& new_obj)
924 {
925 boundaries_dest_arg.vide();
926 const int nb_boundaries_loc = boundaries_src_arg.size();
927 for (int boundary=0; boundary<nb_boundaries_loc; ++boundary)
928 {
929 boundaries_dest_arg.add(new_obj);
930 const Type_Face& face_type = boundaries_src_arg[boundary].faces().type_face();
931 Impl_::build_frontier(boundaries_src_arg[boundary],
932 face_type,
933 nodes_of_cells_src, cells_of_nodes_src, edges_of_cells_src,
934 faces_pattern, face_refinement_pattern,
935 dest,
936 boundaries_dest_arg[boundary]);
937 }
938 };
939
940
941 {
942 const Bords_t& boundaries_src = src.faces_bord();
943 Bords_t& boundaries_dest = dest.faces_bord();
944 build_front_lambda(boundaries_src, boundaries_dest, Bord_t());
945 }
946
947 {
948 const Raccords_t& boundaries_src = src.faces_raccord();
949 Raccords_t& boundaries_dest = dest.faces_raccord();
950 build_front_lambda_rac(boundaries_src, boundaries_dest, Raccord_t());
951 }
952
953 {
954 const Bords_Internes_t& boundaries_src = src.bords_int();
955 Bords_Internes_t& boundaries_dest = dest.bords_int();
956 build_front_lambda(boundaries_src, boundaries_dest, Bord_Interne_t());
957 }
958
959 {
960 const Groupes_Faces_t& boundaries_src = src.groupes_faces();
961 Groupes_Faces_t& boundaries_dest = dest.groupes_faces();
962 build_front_lambda(boundaries_src, boundaries_dest, Groupe_Faces_t());
963 }
964
965 {
966 const Joints_t& boundaries_src = src.faces_joint();
967 const int nb_boundaries = boundaries_src.size();
968 Joints_t& boundaries_dest = dest.faces_joint();
969 build_front_lambda(boundaries_src, boundaries_dest, Joint_t());
970
971 for (int boundary=0; boundary<nb_boundaries; ++boundary)
972 {
973 Joint_t& joint_dest=boundaries_dest[boundary];
974 joint_dest.affecte_PEvoisin(boundaries_src[boundary].PEvoisin());
975 joint_dest.affecte_epaisseur(boundaries_src[boundary].epaisseur());
976
977 // creation des SOMMETS communs
978 ArrOfInt_t& liste_sommets = joint_dest.set_joint_item(JOINT_ITEM::SOMMET).set_items_communs();
979
980 // On prend tous les sommets des faces de joint:
981 const IntTab_t& som_faces = joint_dest.faces().les_sommets();
982 liste_sommets = som_faces;
983 // on ajoute les sommets du joint d'origine pour
984 // les sommets isoles
985 const ArrOfInt_t& som_isoles = boundaries_src[boundary].joint_item(JOINT_ITEM::SOMMET).items_communs();
986 const int_t n = som_isoles.size_array();
987 array_trier_retirer_doublons(liste_sommets);
988 ArrOfInt_t liste_sommets_old(liste_sommets);
989 for (int_t i = 0; i < n; i++)
990 liste_sommets.append_array(som_isoles[i]);
991 // Retirer les doublons de la liste
992 array_trier_retirer_doublons(liste_sommets);
993 int_t n1=liste_sommets.size_array();
994
995 //if (n0!=liste_sommets.size_array())
996 {
997
998 SmallArrOfTID_t sommets_to_find(2);
999 SmallArrOfTID_t incident_cells;
1000
1001 // on doit trouver tous les sommets oublies, c'est ceux en plus.
1002 ArrOfInt_t oublie;// (n1-n0);
1003 const ArrOfInt_t& liste_sommets_org= som_isoles;
1004 int_t norg=som_isoles.size_array();
1005 // les liste sont tries
1006 oublie=liste_sommets;
1007
1008 // pour chaque sommet oblie on regarde si on a une arrete commune en regardant tous les sommets de la liste
1009 for (int_t nio=0; nio<n1; nio++)
1010 {
1011 int_t io=oublie[nio];
1012 sommets_to_find[0]=io;
1013 for (int_t ns=nio+1; ns<norg; ns++)
1014 {
1015 int_t s=liste_sommets_org[ns];
1016 if (s==io)
1017 continue;
1018 sommets_to_find[1]=s;
1019 find_adjacent_elements(cells_of_nodes_src,sommets_to_find,incident_cells);
1020 int_t nb_nodes_src = cells_of_nodes_src.get_nb_lists();
1021 if (incident_cells.size_array()>0)
1022 {
1023 for (int ne=0; ne<incident_cells.size_array(); ne++)
1024 {
1025 int_t elem=incident_cells[ne];
1026 int nb_nodes_per_cells = nodes_of_cells_src.dimension_int(1);
1027 int_t local0=-1,local1=-1;
1028 for (int i=0; i<nb_nodes_per_cells; i++)
1029 {
1030 if (nodes_of_cells_src(elem,i)==io)
1031 local0=i;
1032 if (nodes_of_cells_src(elem,i)==s)
1033 local1=i;
1034 }
1035 if ((local0==-1)||(local1==-1))
1036 {
1037 Cerr<<" pB arrete ?"<<finl;
1038 Process::exit();
1039 }
1040 if (local1<local0)
1041 std::swap(local0,local1);
1042
1043 int nb_edges_pattern=edges_pattern.dimension(0);
1044 int nb_nodes_per_edge_max = edges_pattern.dimension(1);
1045 int ok=-1;
1046 for (int e=0; e<nb_edges_pattern; e++)
1047 for (int c=0; c<nb_nodes_per_edge_max-1; c++)
1048 {
1049 if ((local0==edges_pattern(e,c))&&(local1==edges_pattern(e,c+1)))
1050 {
1051 ok=e;
1052 break;
1053 }
1054 }
1055 if (ok==-1)
1056 {
1057 Cerr<<" pB edge ?"<<finl;
1058 Process::exit();
1059 }
1060
1061 const int_t node = Impl_::find_refined_node_index(nodes_of_cells_src,edges_of_cells_src,nb_nodes_src,elem,-(ok+1));
1062 for (int dir=0; dir<Objet_U::dimension; dir++)
1063 {
1064 double test=nodes_dest(node,dir)-(nodes_dest(io,dir)+nodes_dest(s,dir))*0.5;
1065 if (std::fabs(test)>1e-7)
1066 {
1067 Cerr<<" pB position ?"<<test <<finl;
1068 Process::exit();
1069 }
1070 }
1071
1072 liste_sommets.append_array(node);
1073 }
1074 }
1075 }
1076
1077 }
1078 array_trier_retirer_doublons(liste_sommets);
1079 }
1080 }
1081 }
1082 // Copy periodic boundaries:
1083 dest.bords_perio() = src.bords_perio();
1084}
1085
1086template<typename _SIZE_>
1088{
1089 this->associer_domaine(is);
1090
1091 Domaine_t& domain = this->domaine();
1093
1094 Domaine_t initial_domain(domain);
1095 refine_domain(initial_domain,domain);
1096
1097 const Noms& list_bord_perio = domain.bords_perio();
1098
1099 // Fix vertex and face ordering:
1100 for(const auto& b: list_bord_perio)
1101 {
1103 dec.associer_domaine(domain);
1104 dec.nom_bord() = b;
1105 dec.adapt_som_and_faces();
1106 }
1107
1109
1110 return is;
1111}
1112
1113
1114template class Raffiner_Simplexes_32_64<int>;
1115#if INT_is_64_ == 2
1117#endif
1118
1119
Classe Bord Cette classe represente un bord d'un domaine, c'est un type de frontiere.
Definition Bord.h:32
Classe Bord_Interne La classe sert a representer un ensemble de faces qui sont internes.
Classe Bords Cette classe represente une liste d'objets de type Bord.
Definition Bords.h:28
Class Bords_Internes Cette classe represente une liste d'objets de type Bords_Interne.
Cet interprete doit etre utilise en sequentiel (avant decoupage) si les sommets opposes d'un bord per...
void adapt_som_and_faces()
Main routine recording the periodic boundaries in the domain and performing the appropriate reorderin...
classe Domaine_32_64 un Domaine est un maillage compose d'un ensemble d'elements geometriques de meme...
Definition Domaine.h:62
const Sous_Domaine_t & ss_domaine(int i) const
Definition Domaine.h:290
DoubleTab_t & les_sommets()
Definition Domaine.h:113
Bords_t & faces_bord()
Definition Domaine.h:198
int nb_ss_domaines() const
Definition Domaine.h:289
Raccords_t & faces_raccord()
Definition Domaine.h:253
IntTab_t & les_elems()
Definition Domaine.h:129
Bords_Internes_t & bords_int()
Definition Domaine.h:213
Joints_t & faces_joint()
Definition Domaine.h:265
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
Definition Domaine.h:121
Groupes_Faces_t & groupes_faces()
Definition Domaine.h:224
const Noms & bords_perio() const
Definition Domaine.h:278
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
static int chercher_face_element(const IntTab_t &elem_som, const IntTab &faces_element_ref, const SmallArrOfTID_t &une_face, const int_t elem)
Classe Frontiere.
Definition Frontiere.h:32
void nommer(const Nom &) override
Donne un nom a la frontiere.
Definition Frontiere.cpp:74
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Frontiere.h:49
void typer_faces(const Motcle &)
Type les faces de la frontiere.
Definition Frontiere.cpp:96
void associer_domaine(const Domaine_t &)
Associe la frontiere au domaine dont elle depend.
Definition Frontiere.cpp:63
IntTab_t & les_sommets_des_faces()
Renvoie les sommets des faces de la frontiere.
Classe Groupe_Face La classe sert a representer une selection de faces lu dans le fichier med.
Class Groupes_Faces Cette classe represente une liste d'objets de type Groupe_Faces.
static int_t find_refined_node_index(const IntTab_t &nodes_of_cells_src, const IntTab_t &edges_of_cells_src, int_t nb_nodes_src, int_t cell_src, int index)
static void build_nodes(const DoubleTab_t &nodes_src, const IntTab_t &nodes_of_edges_src, DoubleTab_t &nodes_dest)
Domaine_32_64< _SIZE_ > Domaine_t
DoubleTab_T< _SIZE_ > DoubleTab_t
static void build_frontier(const Frontiere_t &src, const Type_Face &face_type, const IntTab_t &nodes_of_cells_src, const Static_Int_Lists_32_64< _SIZE_ > &cells_of_nodes_src, const IntTab_t &edges_of_cells_src, const IntTab &faces_pattern, const IntTab &faces_refinement_pattern, const Domaine_t &domaine_dest, Frontiere_t &dest)
ArrOfInt_T< _SIZE_ > ArrOfInt_t
IntVect_T< _SIZE_ > IntVect_t
Frontiere_32_64< _SIZE_ > Frontiere_t
Groupe_Faces_32_64< _SIZE_ > Groupe_Faces_t
IntTab_T< _SIZE_ > IntTab_t
SmallArrOfTID_T< _SIZE_ > SmallArrOfTID_t
static void build_edges(const IntTab_t &nodes_of_cells, const IntTab &edges_pattern, IntTab_t &edges_of_cells, IntTab_t &nodes_of_edges)
static void build_cells(const IntTab_t &nodes_of_cells_src, const IntTab_t &edges_of_cells_src, const IntTab &pattern, int_t nb_nodes_src, IntTab_t &nodes_of_cells_dest)
Sous_Domaine_32_64< _SIZE_ > Sous_Domaine_t
Bord_Interne_32_64< _SIZE_ > Bord_Interne_t
classe Interprete_geometrique_base .
La classe Joint est une Frontiere qui contient les faces et les sommets de joint avec le domaine PEvo...
Definition Joint.h:34
Classe Joints Cette classe represente une liste d'objet de type Joint.
Definition Joints.h:28
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
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
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe Raccord_base Cette classe est simplement une frontiere, c'est la classe de base de la.
Classe Raccords Cette represente une liste d'objets de type Raccord.
Definition Raccords.h:29
: class Raffiner_Simplexes
Entree & interpreter_(Entree &is) override
void refine_domain(const Domaine_t &src, Domaine_t &dest)
Domaine_32_64< _SIZE_ > Domaine_t
static void init_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
Create parallel descriptors for the vertex and element arrays of the domain (necessary because Scatte...
Definition Scatter.cpp:2742
static void uninit_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
methode utilisee par les interpretes qui modifient le domaine (sequentiel), detruit les descripteurs ...
Definition Scatter.cpp:2757
Classe de base des flux de sortie.
Definition Sortie.h:52
Sous_Domaine represents a volumic sub-domain i.e. a sub set of elements of a Domaine.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Cette classe permet de stocker des listes d'entiers accessibles en temps constant.
int_t get_nb_lists() const
renvoie le nombre de listes stockees
_SIZE_ size_array() const
int dimension_int(int d) const
Definition TRUSTTab.tpp:152
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133