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)
Classe Bord Cette classe represente un bord d'un domaine, c'est un type de frontiere.
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.
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...
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
Renvoie le nombre de sommets du domaine.
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
Donne un nom a la frontiere.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
void typer_faces(const Motcle &)
Type les faces de la frontiere.
void associer_domaine(const Domaine_t &)
Associe la frontiere au domaine dont elle depend.
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 .
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
La classe Joint est une Frontiere qui contient les faces et les sommets de joint avec le domaine PEvo...
Classe Joints Cette classe represente une liste d'objet de type Joint.
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Un tableau de chaine de caracteres (VECT(Nom)).
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
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.
: 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)
methode utilisee par les interpretes qui modifient le domaine (sequentiel), detruit les descripteurs ...
Classe de base des flux de sortie.
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
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const