16#include <Raffiner_Simplexes.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>
30Add_synonym(Raffiner_Simplexes,
"Raffiner_isotrope");
41template<
typename _SIZE_>
48template<
typename _SIZE_>
56template<
typename _SIZE_>
76 int_t nb_nodes_src,
int_t cell_src,
int index);
80 const Type_Face& face_type,
84 const IntTab& faces_pattern,
85 const IntTab& faces_refinement_pattern,
94#define NODE_ID(num) num
96#define EDGE_ID(num) (-num-1)
101void fill_tab_2(
const int *t,
int n,
int m, IntTab& tab)
105 for (
int i=0; i<n; ++i)
106 for (
int j=0; j<m; ++j)
111 Cerr <<
"Error in Raffiner_Simplexes_32_64 'filltab_2'" << finl;
116void fill_tab_2_new(
const int *t,
int n,
int m, IntTab& tab)
121 for (
int i=0; i<n; ++i)
125 for (
int j=0; j<nb; ++j)
127 tab(i,j) = t[compt++];
133 Cerr <<
"Error in Raffiner_Simplexes_32_64 'filltab_2_new'" << finl;
139void fill_tab_3(
const int *t,
int n,
int m,
int p, IntTab& tab)
143 for (
int i=0; i<n; ++i)
145 for (
int j=0; j<m; ++j)
147 for (
int k=0; k<p; ++k)
149 tab(i,j,k) = t[(i*m+j)*p+k];
156 Cerr <<
"Error in Raffiner_Simplexes_32_64 'filltab_3'" << finl;
162void build_quadrangle_cell_refinement_pattern(IntTab& pattern)
164 const int t[] = { NODE_ID(0), EDGE_ID(0), EDGE_ID(3), EDGE_ID(4),
165 EDGE_ID(0), NODE_ID(1), EDGE_ID(4),EDGE_ID(1),
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
169 fill_tab_2(t, 4, 4, pattern);
172void build_triangle_cell_refinement_pattern(IntTab& pattern)
174 const int t[] = { NODE_ID(0), EDGE_ID(0), EDGE_ID(1),
175 EDGE_ID(0), NODE_ID(1), EDGE_ID(2),
176 EDGE_ID(1), EDGE_ID(2), NODE_ID(2),
177 EDGE_ID(2), EDGE_ID(1), EDGE_ID(0), -1
179 fill_tab_2(t, 4, 3, pattern);
182void build_tetrahedron_cell_refinement_pattern(IntTab& pattern)
184 const int t[] = { NODE_ID(0), EDGE_ID(0), EDGE_ID(1), EDGE_ID(2) ,
185 EDGE_ID(0), NODE_ID(1), EDGE_ID(3), EDGE_ID(4) ,
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
193 fill_tab_2(t, 8, 4, pattern);
204void build_hexa_cell_refinement_pattern(IntTab& pattern)
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),
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),
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),
221 fill_tab_2(t, 8, 8, pattern);
224int type_elem(
const Nom& cell_type)
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);
241void build_cell_refinement_pattern(IntTab& pattern,
const Nom& cell_type)
243 int rank = type_elem(cell_type);
247 build_triangle_cell_refinement_pattern(pattern);
250 build_tetrahedron_cell_refinement_pattern(pattern);
253 build_quadrangle_cell_refinement_pattern(pattern);
256 build_hexa_cell_refinement_pattern(pattern);
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;
267void build_quadrangle_face_refinement_pattern(IntTab& pattern)
269 const int t[] = { NODE_ID(0), EDGE_ID(0),
270 EDGE_ID(0), NODE_ID(1),
272 NODE_ID(3), EDGE_ID(1),
273 EDGE_ID(1), NODE_ID(1),
275 NODE_ID(3), EDGE_ID(2),
276 EDGE_ID(2), NODE_ID(2),
278 NODE_ID(0), EDGE_ID(3),
279 EDGE_ID(3), NODE_ID(2),-1
281 fill_tab_3(t, 4, 2, 2, pattern);
284void build_triangle_face_refinement_pattern(IntTab& pattern)
286 const int t[] = { NODE_ID(2), EDGE_ID(2),
287 EDGE_ID(2), NODE_ID(1),
289 NODE_ID(0), EDGE_ID(1),
290 EDGE_ID(1), NODE_ID(2),
292 NODE_ID(1), EDGE_ID(0),
293 EDGE_ID(0), NODE_ID(0), -1
295 fill_tab_3(t, 3, 2, 2, pattern);
298void build_tetrahedron_face_refinement_pattern(IntTab& pattern)
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),
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),
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),
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
321 fill_tab_3(t, 4, 4, 3, pattern);
324void build_hexa_face_refinement_pattern(IntTab& pattern)
326 const int t[] = { NODE_ID(0), EDGE_ID(3), EDGE_ID(5), EDGE_ID(8),
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),
331 NODE_ID(0), EDGE_ID(0), EDGE_ID(5), EDGE_ID(6),
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),
337 NODE_ID(0), EDGE_ID(0), EDGE_ID(3), EDGE_ID(4),
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),
342 NODE_ID(1), EDGE_ID(1), EDGE_ID(7), EDGE_ID(10),
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),
347 NODE_ID(2), EDGE_ID(2), EDGE_ID(11), EDGE_ID(12),
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),
352 NODE_ID(4), EDGE_ID(14), EDGE_ID(17), EDGE_ID(18),
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),
360 fill_tab_3(t, 6, 4, 4, pattern);
364void build_face_refinement_pattern(IntTab& pattern,
const Nom& cell_type)
366 int rank = type_elem(cell_type);
370 build_triangle_face_refinement_pattern(pattern);
373 build_tetrahedron_face_refinement_pattern(pattern);
376 build_quadrangle_face_refinement_pattern(pattern);
379 build_hexa_face_refinement_pattern(pattern);
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;
390void build_quadrangle_edges_pattern(IntTab& pattern)
392 const int t[] = { 2,0, 1 ,
399 fill_tab_2_new(t, 5, 4, pattern);
402void build_triangle_edges_pattern(IntTab& pattern)
404 const int t[] = { 0, 1 ,
408 fill_tab_2(t, 3, 2, pattern);
411void build_tetrahedron_edges_pattern(IntTab& pattern)
413 const int t[] = { 0, 1 ,
420 fill_tab_2(t, 6, 2, pattern);
443void build_hexa_edges_pattern(IntTab& pattern)
446 const int t[] = { 2, 0, 1 ,
451 2, 0,4, 4,0,5,1,4 ,2, 1,5 ,
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,
454 2,4,5, 2,5,7, 2,6,7, 2,4,6 , 4,4,7,5,6,
457 fill_tab_2_new(t, 19, 8, pattern);
460void build_edges_pattern(IntTab& pattern,
const Nom& cell_type)
463 int rank = type_elem(cell_type);
467 build_triangle_edges_pattern(pattern);
470 build_tetrahedron_edges_pattern(pattern);
473 build_quadrangle_edges_pattern(pattern);
476 build_hexa_edges_pattern(pattern);
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;
486void build_quadrangle_faces_pattern(IntTab& pattern)
488 const int t[] = { 0, 1 ,
493 fill_tab_2(t, 4, 2, pattern);
496void build_triangle_faces_pattern(IntTab& pattern)
498 const int t[] = { 2, 1 ,
502 fill_tab_2(t, 3, 2, pattern);
505void build_tetrahedron_faces_pattern(IntTab& pattern)
507 const int t[] = { 1, 2, 3,
512 fill_tab_2(t, 4, 3, pattern);
515void build_hexa_faces_pattern(IntTab& pattern)
517 const int t[] = { 0, 2, 4, 6 ,
524 fill_tab_2(t, 6, 4, pattern);
528void build_faces_pattern(IntTab& pattern,
const Nom& cell_type)
531 int rank = type_elem(cell_type);
535 build_triangle_faces_pattern(pattern);
538 build_tetrahedron_faces_pattern(pattern);
541 build_quadrangle_faces_pattern(pattern);
544 build_hexa_faces_pattern(pattern);
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;
558template <
typename _SIZE_>
563 const int nb_edges_per_cell = edges_pattern.
dimension(0);
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)
570 for (
int edge_in_cell=0; edge_in_cell<nb_edges_per_cell; ++edge_in_cell)
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);
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);
583 int it=nb_nodes_per_edge_max;
584 while ( edges_pattern(edge_in_cell,it-1)==-1) it--;
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);
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);
596 std::swap(node_0,node_1);
598 std::swap(node_2,node_3);
601 duplicated_edges(nb_duplicated_edges,2)=node_0;
602 duplicated_edges(nb_duplicated_edges,3)=node_1;
608 assert(node_2!=node_0);
609 duplicated_edges(nb_duplicated_edges,2)=node_2;
610 duplicated_edges(nb_duplicated_edges,3)=node_3;
612 for (
int c=4; c<nb_nodes_per_edge_max; c++)
613 duplicated_edges(nb_duplicated_edges,c)=-1;
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;
619 for (
int c=2; c<nb_nodes_per_edge_max; c++)
621 int node=edges_pattern(edge_in_cell,c);
623 duplicated_edges(nb_duplicated_edges,c)=-1;
625 duplicated_edges(nb_duplicated_edges,c)=nodes_of_cells(cell,node);
627 ++nb_duplicated_edges;
633 tri_lexicographique_tableau_indirect(duplicated_edges,edges_indices);
635 edges_of_cells.
resize(nb_cells, nb_edges_per_cell);
636 nodes_of_edges.
resize(0, nb_nodes_per_edge_max);
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;
643 for (
int_t duplicated_edge=0; duplicated_edge<nb_duplicated_edges; ++duplicated_edge)
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)
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);
660 edges_of_cells_array[edge_index] = edges_counter;
663 nodes_of_edges.
resize(edges_counter+2, nb_nodes_per_edge_max);
665 nodes_of_edges.
resize(edges_counter+1, nb_nodes_per_edge_max);
668template<
typename _SIZE_>
671 assert( &(nodes_src) != &(nodes_dest) );
676 const int_t nb_nodes_dest = nb_nodes_src + nb_edges_src;
678 nodes_dest = nodes_src;
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)
684 const int_t node_0 = nodes_of_edges_src(edge, 0);
685 const int_t node_1 = nodes_of_edges_src(edge, 1);
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;
693 for (
int_t edge=0; edge<nb_edges_src; ++edge)
695 int nb=nb_node_per_edge_max;
697 while(nodes_of_edges_src(edge,nb-1)==-1) nb--;
701 const int_t node_0 = nodes_of_edges_src(edge, 0);
704 double x = nodes_src(node_0, i);
705 for (
int c=1; c<nb; c++)
707 const int_t node_1 = nodes_of_edges_src(edge, c);
708 x+=nodes_src(node_1, i);
710 nodes_dest(nb_nodes_src + edge, i) = x*inv;
715template<
typename _SIZE_>
717 int_t nb_nodes_src,
int_t cell_src,
int index)
719 int_t node_index = -1;
721 node_index = nodes_of_cells_src(cell_src,NODE_ID(index));
723 node_index = nb_nodes_src + edges_of_cells_src(cell_src,EDGE_ID(index));
727template<
typename _SIZE_>
731 assert( &(nodes_of_cells_src) != &(nodes_of_cells_dest) );
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);
737 if (std::is_same<_SIZE_, int>::value)
739 _SIZE_ size = (_SIZE_) (nb_cells_src * nb_refined_cells_per_cell);
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.");
743 nodes_of_cells_dest.
resize(nb_cells_src * nb_refined_cells_per_cell, nb_nodes_per_cell);
745 int_t nb_cells_dest = 0;
746 for (
int_t cell_src=0; cell_src<nb_cells_src; ++cell_src)
748 for (
int refined_cell=0; refined_cell<nb_refined_cells_per_cell; ++refined_cell)
750 for (
int node_in_cell=0; node_in_cell<nb_nodes_per_cell; ++node_in_cell)
752 const int index = pattern(refined_cell,node_in_cell);
754 nodes_of_cells_dest(nb_cells_dest,node_in_cell) = node;
762template<
typename _SIZE_>
764 const Type_Face& face_type,
768 const IntTab& faces_pattern,
769 const IntTab& faces_refinement_pattern,
780 int nb_faces_dest_per_face_src = faces_refinement_pattern.
dimension_int(1);
783 IntTab_t nodes_of_faces_dest(nb_faces_src*nb_faces_dest_per_face_src,nb_nodes_per_face);
788 for (
int_t face=0; face<nb_faces_src; ++face)
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);
793 find_adjacent_elements(cells_of_nodes_src,nodes_of_current_face,incident_cells);
794 if ((incident_cells.
size_array() != 1) && (!is_internal_faces))
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;
802 const int_t coarse_cell = incident_cells[0];
805 nodes_of_current_face,
807 if (face_in_coarse_cell < 0)
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;
814 for (
int fine_face=0; fine_face<nb_faces_dest_per_face_src; ++fine_face)
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)
819 const int index = faces_refinement_pattern(face_in_coarse_cell,fine_face,node_in_face);
821 nodes_of_faces_dest(face_dest,node_in_face) = node_dest;
830template<
typename _SIZE_>
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_>;
855 const IntTab_t& nodes_of_cells_src = src.
les_elems();
858 IntTab edges_pattern;
859 ::build_edges_pattern(edges_pattern,cell_type);
861 IntTab faces_pattern;
862 ::build_faces_pattern(faces_pattern,cell_type);
864 IntTab cell_refinement_pattern;
865 ::build_cell_refinement_pattern(cell_refinement_pattern,cell_type);
867 IntTab face_refinement_pattern;
868 ::build_face_refinement_pattern(face_refinement_pattern,cell_type);
871 ::construire_connectivite_som_elem(src.
nb_som(), nodes_of_cells_src, cells_of_nodes_src,0);
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);
878 Impl_::build_nodes(nodes_src,nodes_of_edges_src,nodes_dest);
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);
884 const int nb_refined_cells_per_cell = cell_refinement_pattern.
dimension(0);
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);
894 for (
auto& old_poly : old_polys)
896 for (
int refined_cell = 0; refined_cell < nb_refined_cells_per_cell; ++refined_cell)
898 les_polys(new_poly) = old_poly * nb_refined_cells_per_cell + refined_cell;
904 auto build_front_lambda_rac = [&] (
const auto& boundaries_src_arg,
auto& boundaries_dest_arg,
auto&& new_obj)
906 boundaries_dest_arg.vide();
907 const int nb_boundaries = boundaries_src_arg.size();
908 for (
int boundary=0; boundary<nb_boundaries; ++boundary)
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(),
915 nodes_of_cells_src, cells_of_nodes_src, edges_of_cells_src,
916 faces_pattern, face_refinement_pattern,
918 boundaries_dest_arg[boundary].valeur());
923 auto build_front_lambda = [&] (
const auto& boundaries_src_arg,
auto& boundaries_dest_arg,
auto&& new_obj)
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)
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],
933 nodes_of_cells_src, cells_of_nodes_src, edges_of_cells_src,
934 faces_pattern, face_refinement_pattern,
936 boundaries_dest_arg[boundary]);
942 const Bords_t& boundaries_src = src.
faces_bord();
944 build_front_lambda(boundaries_src, boundaries_dest, Bord_t());
950 build_front_lambda_rac(boundaries_src, boundaries_dest, Raccord_t());
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());
962 build_front_lambda(boundaries_src, boundaries_dest, Groupe_Faces_t());
966 const Joints_t& boundaries_src = src.
faces_joint();
967 const int nb_boundaries = boundaries_src.size();
969 build_front_lambda(boundaries_src, boundaries_dest, Joint_t());
971 for (
int boundary=0; boundary<nb_boundaries; ++boundary)
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());
978 ArrOfInt_t& liste_sommets = joint_dest.set_joint_item(JOINT_ITEM::SOMMET).set_items_communs();
981 const IntTab_t& som_faces = joint_dest.faces().les_sommets();
982 liste_sommets = som_faces;
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]);
992 array_trier_retirer_doublons(liste_sommets);
993 int_t n1=liste_sommets.size_array();
998 SmallArrOfTID_t sommets_to_find(2);
999 SmallArrOfTID_t incident_cells;
1003 const ArrOfInt_t& liste_sommets_org= som_isoles;
1004 int_t norg=som_isoles.size_array();
1006 oublie=liste_sommets;
1009 for (
int_t nio=0; nio<n1; nio++)
1011 int_t io=oublie[nio];
1012 sommets_to_find[0]=io;
1013 for (
int_t ns=nio+1; ns<norg; ns++)
1015 int_t s=liste_sommets_org[ns];
1018 sommets_to_find[1]=s;
1019 find_adjacent_elements(cells_of_nodes_src,sommets_to_find,incident_cells);
1021 if (incident_cells.size_array()>0)
1023 for (
int ne=0; ne<incident_cells.size_array(); ne++)
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++)
1030 if (nodes_of_cells_src(elem,i)==io)
1032 if (nodes_of_cells_src(elem,i)==s)
1035 if ((local0==-1)||(local1==-1))
1037 Cerr<<
" pB arrete ?"<<finl;
1041 std::swap(local0,local1);
1043 int nb_edges_pattern=edges_pattern.
dimension(0);
1044 int nb_nodes_per_edge_max = edges_pattern.
dimension(1);
1046 for (
int e=0; e<nb_edges_pattern; e++)
1047 for (
int c=0; c<nb_nodes_per_edge_max-1; c++)
1049 if ((local0==edges_pattern(e,c))&&(local1==edges_pattern(e,c+1)))
1057 Cerr<<
" pB edge ?"<<finl;
1061 const int_t node = Impl_::find_refined_node_index(nodes_of_cells_src,edges_of_cells_src,nb_nodes_src,elem,-(ok+1));
1064 double test=nodes_dest(node,dir)-(nodes_dest(io,dir)+nodes_dest(s,dir))*0.5;
1065 if (std::fabs(test)>1e-7)
1067 Cerr<<
" pB position ?"<<test <<finl;
1072 liste_sommets.append_array(node);
1078 array_trier_retirer_doublons(liste_sommets);
1086template<
typename _SIZE_>
1100 for(
const auto& b: list_bord_perio)
Class Bord This class represents a boundary of a domain, it is a type of frontier.
Class Bord_Interne The class serves to represent a set of faces that are internal.
Class Bords This class represents a list of objects of type Bord.
Class Bords_Internes This class represents a list of objects of type Bords_Interne.
This interpreter must be used in sequential (before mesh splitting) if the opposite vertices of a per...
void adapt_som_and_faces()
Main routine recording the periodic boundaries in the domain and performing the appropriate reorderin...
class Domaine_32_64 A Domain is a mesh composed of a set of geometric elements of the same type.
const Sous_Domaine_t & ss_domaine(int i) const
DoubleTab_t & les_sommets()
int nb_ss_domaines() const
Raccords_t & faces_raccord()
Bords_Internes_t & bords_int()
int_t nb_som() const
Returns the number of vertices of the domain.
Groupes_Faces_t & groupes_faces()
const Noms & bords_perio() const
Class defining operators and methods for all reading operation in an input flow (file,...
static int chercher_face_element(const IntTab_t &elem_som, const IntTab &faces_element_ref, const SmallArrOfTID_t &une_face, const int_t elem)
void nommer(const Nom &) override
Gives a name to the boundary.
const Nom & le_nom() const override
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
void typer_faces(const Motcle &)
Sets the type of the boundary faces.
void associer_domaine(const Domaine_t &)
Associates the boundary to the domain it belongs to.
IntTab_t & les_sommets_des_faces()
Returns the vertices of the boundary faces.
Groupe_Face class — represents a selection of faces read from a med file.
Groupes_Faces class — represents a list of Groupe_Faces objects.
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
Class Interprete_geometrique_base.
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
The Joint class is a Frontiere that contains the joint faces and vertices with the neighboring domain...
Joints class — represents a list of Joint objects.
A character string (Nom) in uppercase.
An array of Motcle objects.
class Nom: a character string for naming TRUST objects.
An array of character strings (VECT(Nom)).
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Class Raccord_base This class is simply a boundary; it is the base class of the.
Class Raccords This represents a list of Raccord type objects.
: 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...
static void uninit_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
Method used by interpreters that modify the domain (sequential), destroys the descriptors of vertices...
Base class for output streams.
Sous_Domaine represents a volumic sub-domain i.e. a sub set of elements of a Domaine.
const Nom & le_nom() const override
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
This class allows storing lists of integers accessible in constant time.
int_t get_nb_lists() const
Returns the number of stored lists.
_SIZE_ size_array() const
int dimension_int(int d) const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const