119RefinedMesh :: refineMeshGlobally(
Domain *d,
int level, std :: vector< RefinedElement > &refinedElementList)
121 int jj, kk = 0, j1, j2, j3, j4, type;
122 long node, elem, nd, pos = 0, p, number, size;
123 long i, j, k, m, n, node1, node2, node3, node4, elem1, elem2;
124 long refine_nodes, fine_node_id, refine_node_id;
125 long mesh_edge_id, fine_edge_id, fine_quad_id, fine_hexa_id;
126 long *tmp_array_start [ 4 ], *tmp_array_end [ 4 ];
127 long *tmp_array_cen [ 6 ], *tmp_array [ 12 ];
128 int swap [ 6 ], flag;
131 IntArray *connectivity = NULL, *boundary = NULL;
133 long fe_nodes = 0, fe_elems = 0;
134 long fe_edges = 0, fe_faces = 0, fe_quads = 0, fe_tetras = 0, fe_hexas = 0, fe_pyrams = 0, fe_wedges = 0;
135 long edge_id = 0, face_id = 0, quad_id = 0, tetra_id = 0, hexa_id = 0;
136 long mesh_edges = 0, mesh_faces = 0, mesh_quads = 0;
137 long fine_nodes = 0, fine_edges = 0, fine_quads = 0, fine_hexas = 0;
139 fe_node_rec *fe_node = NULL, *fe_node_array = NULL;
140 fe_edge_rec *fe_edge = NULL, *fe_edge_array = NULL;
141 fe_face_rec *fe_face = NULL, *fe_face_array = NULL;
142 fe_quad_rec *fe_quad = NULL, *fe_quad_array = NULL;
144 fe_hexa_rec *fe_hexa = NULL, *fe_hexa_array = NULL;
146 fe_node_rec *fine_node = NULL, *fine_node_array = NULL;
150 fe_node_rec *nd1 = NULL, *nd2 = NULL, *nd3 = NULL, *nd4 = NULL;
153 mesh_face_rec *mesh_face = NULL, *mesh_face_array = NULL, *mesh_fc [ 4 ];
154 mesh_quad_rec *mesh_quad = NULL, *mesh_quad_array = NULL, *mesh_qd [ 6 ];
156#ifdef COMPLETE_DATA_STRUCTURE
157 tmp_face_rec *tmp_face = NULL, *tmp_face_array = NULL, *tmp_fc = NULL;
158 tmp_quad_rec *tmp_quad = NULL, *tmp_quad_array = NULL, *tmp_qd = NULL;
161 tmp_tetra_rec *tmp_tetra = NULL, *tmp_tetra_array = NULL, *tmp_tet = NULL;
162 tmp_hexa_rec *tmp_hexa = NULL, *tmp_hexa_array = NULL, *tmp_hx = NULL;
168 long *node_num_elems = NULL, *node_con_elems = NULL;
169 long *node_num_nodes = NULL, *node_con_nodes = NULL;
173 short face_ed_nd [ 3 ] [ 2 ] = { { 0, 1 }, { 1, 2 }, { 2, 0 } };
174 short quad_ed_nd [ 4 ] [ 2 ] = { { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 0 } };
178 short tetra_fc_nd [ 4 ] [ 3 ] = { { 0, 1, 2 }, { 0, 1, 3 }, { 1, 2, 3 }, { 2, 0, 3 } };
182 short hexa_fc_nd [ 6 ] [ 4 ] = { { 0, 1, 2, 3 }, { 0, 1, 5, 4 }, { 1, 2, 6, 5 }, { 2, 3, 7, 6 }, { 3, 0, 4, 7 }, { 7, 6, 5, 4 } };
184 short quad_con_nd [ 4 ] [ 2 ] = { { 1, 3 }, { 2, 0 }, { 3, 1 }, { 0, 2 } };
185 short hexa_con_nd [ 8 ] [ 3 ] = { { 1, 3, 4 }, { 2, 0, 5 }, { 3, 1, 6 }, { 0, 2, 7 }, { 7, 5, 0 }, { 4, 6, 1 }, { 5, 7, 2 }, { 6, 4, 3 } };
190 for ( i = 0; i < fe_elems; i++ ) {
214 if ( fe_nodes == 0 ) {
218 if ( fe_nodes != 0 ) {
224 if ( fe_edges != 0 ) {
230 if ( fe_faces != 0 ) {
236 if ( fe_quads != 0 ) {
242 if ( fe_tetras != 0 ) {
248 if ( fe_hexas != 0 ) {
254 fe_node = fe_node_array;
255 for ( i = 0; i < fe_nodes; i++, fe_node++ ) {
259 edge_id = face_id = quad_id = tetra_id = hexa_id = 0;
260 for ( i = 0; i < fe_elems; i++ ) {
264 fe_edge = & ( fe_edge_array [ edge_id++ ] );
265 for ( j = 0; j < 2; j++ ) {
267 if ( nd <= 0 || nd > fe_nodes ) {
271 fe_edge->
node [ j ] = & ( fe_node_array [ nd - 1 ] );
276 fe_face = & ( fe_face_array [ face_id++ ] );
277 for ( j = 0; j < 3; j++ ) {
279 if ( nd <= 0 || nd > fe_nodes ) {
283 fe_face->
node [ j ] = & ( fe_node_array [ nd - 1 ] );
288 fe_quad = & ( fe_quad_array [ quad_id++ ] );
289 for ( j = 0; j < 4; j++ ) {
291 if ( nd <= 0 || nd > fe_nodes ) {
295 fe_quad->
node [ j ] = & ( fe_node_array [ nd - 1 ] );
300 fe_tetra = & ( fe_tetra_array [ tetra_id++ ] );
301 for ( j = 0; j < 4; j++ ) {
303 if ( nd <= 0 || nd > fe_nodes ) {
307 fe_tetra->
node [ j ] = & ( fe_node_array [ nd - 1 ] );
312 fe_hexa = & ( fe_hexa_array [ hexa_id++ ] );
313 for ( j = 0; j < 8; j++ ) {
315 if ( nd <= 0 || nd > fe_nodes ) {
319 fe_hexa->
node [ j ] = & ( fe_node_array [ nd - 1 ] );
331 if ( ( node_num_elems = (
long * ) calloc( fe_nodes + 1,
sizeof(
long ) ) ) == NULL ) {
335 fe_edge = fe_edge_array;
336 for ( i = 0; i < fe_edges; i++, fe_edge++ ) {
337 for ( j = 0; j < 2; j++ ) {
338 nd = fe_edge->
node [ j ]->
id;
339 node_num_elems [ nd - 1 ]++;
343 fe_face = fe_face_array;
344 for ( i = 0; i < fe_faces; i++, fe_face++ ) {
345 for ( j = 0; j < 3; j++ ) {
346 nd = fe_face->
node [ j ]->
id;
347 node_num_elems [ nd - 1 ]++;
351 fe_quad = fe_quad_array;
352 for ( i = 0; i < fe_quads; i++, fe_quad++ ) {
353 for ( j = 0; j < 4; j++ ) {
354 nd = fe_quad->
node [ j ]->
id;
355 node_num_elems [ nd - 1 ]++;
359 fe_tetra = fe_tetra_array;
360 for ( i = 0; i < fe_tetras; i++, fe_tetra++ ) {
361 for ( j = 0; j < 4; j++ ) {
362 nd = fe_tetra->
node [ j ]->
id;
363 node_num_elems [ nd - 1 ]++;
367 fe_hexa = fe_hexa_array;
368 for ( i = 0; i < fe_hexas; i++, fe_hexa++ ) {
369 for ( j = 0; j < 8; j++ ) {
370 nd = fe_hexa->
node [ j ]->
id;
371 node_num_elems [ nd - 1 ]++;
378 for ( i = 0; i < fe_nodes; i++ ) {
379 number = node_num_elems [ i ];
380 node_num_elems [ i ] = pos;
384 node_num_elems [ fe_nodes ] = size = pos;
385 if ( ( node_con_elems = (
long * ) calloc( size,
sizeof(
long ) ) ) == NULL ) {
391 fe_edge = fe_edge_array;
392 for ( i = 0; i < fe_edges; i++, fe_edge++ ) {
393 for ( j = 0; j < 2; j++ ) {
394 nd = fe_edge->
node [ j ]->
id;
395 node_con_elems [ node_num_elems [ nd - 1 ]++ ] = i + 1;
399 fe_face = fe_face_array;
400 for ( i = 0; i < fe_faces; i++, fe_face++ ) {
401 for ( j = 0; j < 3; j++ ) {
402 nd = fe_face->
node [ j ]->
id;
403 node_con_elems [ node_num_elems [ nd - 1 ]++ ] = i + 1 + fe_edges;
407 fe_quad = fe_quad_array;
408 for ( i = 0; i < fe_quads; i++, fe_quad++ ) {
409 for ( j = 0; j < 4; j++ ) {
410 nd = fe_quad->
node [ j ]->
id;
411 node_con_elems [ node_num_elems [ nd - 1 ]++ ] = i + 1 + fe_edges + fe_faces;
415 fe_tetra = fe_tetra_array;
416 for ( i = 0; i < fe_tetras; i++, fe_tetra++ ) {
417 for ( j = 0; j < 4; j++ ) {
418 nd = fe_tetra->
node [ j ]->
id;
419 node_con_elems [ node_num_elems [ nd - 1 ]++ ] = i + 1 + fe_edges + fe_faces + fe_quads;
423 fe_hexa = fe_hexa_array;
424 for ( i = 0; i < fe_hexas; i++, fe_hexa++ ) {
425 for ( j = 0; j < 8; j++ ) {
426 nd = fe_hexa->
node [ j ]->
id;
427 node_con_elems [ node_num_elems [ nd - 1 ]++ ] = i + 1 + fe_edges + fe_faces + fe_quads + fe_tetras;
434 for ( i = 0; i < fe_nodes; i++ ) {
435 number = node_num_elems [ i ] - pos;
436 node_num_elems [ i ] = pos;
441 for ( i = 0; i < fe_nodes; i++ ) {
442 OOFEM_LOG_DEBUG(
"node %ld: %ld:", i + 1, node_num_elems [ i + 1 ] - node_num_elems [ i ]);
443 for ( j = node_num_elems [ i ]; j < node_num_elems [ i + 1 ]; j++ ) {
444 switch (
elem_type(node_con_elems [ j ]) ) {
473 if ( ( node_num_nodes = (
long * ) calloc( fe_nodes + 1,
sizeof(
long ) ) ) == NULL ) {
477 fe_node = fe_node_array;
478 for ( i = 0; i < fe_nodes; i++, fe_node++ ) {
480 for ( j = node_num_elems [ i ]; j < node_num_elems [ node ]; j++ ) {
481 elem = node_con_elems [ j ];
486 fe_edge = & ( fe_edge_array [ elem - 1 ] );
487 for ( k = 0; k < 2; k++ ) {
488 nd = fe_edge->
node [ k ]->
id;
489 if ( nd != node && nd > 0 ) {
490 fe_edge->
node [ k ]->
id = -nd;
491 node_num_nodes [ i ]++;
498 fe_face = & ( fe_face_array [ elem - 1 ] );
499 for ( k = 0; k < 3; k++ ) {
500 nd = fe_face->
node [ k ]->
id;
501 if ( nd != node && nd > 0 ) {
502 fe_face->
node [ k ]->
id = -nd;
503 node_num_nodes [ i ]++;
510 fe_quad = & ( fe_quad_array [ elem - 1 ] );
511 for ( k = 0; k < 4; k++ ) {
512 if ( fe_node == fe_quad->
node [ k ] ) {
513 for ( m = 0; m < 2; m++ ) {
514 nd = fe_quad->
node [ quad_con_nd [ k ] [ m ] ]->
id;
516 fe_quad->
node [ quad_con_nd [ k ] [ m ] ]->
id = -nd;
517 node_num_nodes [ i ]++;
528 fe_tetra = & ( fe_tetra_array [ elem - 1 ] );
529 for ( k = 0; k < 4; k++ ) {
530 nd = fe_tetra->
node [ k ]->
id;
531 if ( nd != node && nd > 0 ) {
532 fe_tetra->
node [ k ]->
id = -nd;
533 node_num_nodes [ i ]++;
540 fe_hexa = & ( fe_hexa_array [ elem - 1 ] );
541 for ( k = 0; k < 8; k++ ) {
542 if ( fe_node == fe_hexa->
node [ k ] ) {
543 for ( m = 0; m < 3; m++ ) {
544 nd = fe_hexa->
node [ hexa_con_nd [ k ] [ m ] ]->
id;
546 fe_hexa->
node [ hexa_con_nd [ k ] [ m ] ]->
id = -nd;
547 node_num_nodes [ i ]++;
564 for ( j = node_num_elems [ i ]; j < node_num_elems [ node ]; j++ ) {
565 elem = node_con_elems [ j ];
570 fe_edge = & ( fe_edge_array [ elem - 1 ] );
571 for ( k = 0; k < 2; k++ ) {
578 fe_face = & ( fe_face_array [ elem - 1 ] );
579 for ( k = 0; k < 3; k++ ) {
586 fe_quad = & ( fe_quad_array [ elem - 1 ] );
587 for ( k = 0; k < 4; k++ ) {
594 fe_tetra = & ( fe_tetra_array [ elem - 1 ] );
595 for ( k = 0; k < 4; k++ ) {
596 fe_tetra->
node [ k ]->
id = abs(fe_tetra->
node [ k ]->
id);
602 fe_hexa = & ( fe_hexa_array [ elem - 1 ] );
603 for ( k = 0; k < 8; k++ ) {
618 for ( i = 0; i < fe_nodes; i++ ) {
619 number = node_num_nodes [ i ];
620 node_num_nodes [ i ] = pos;
624 node_num_nodes [ fe_nodes ] = size = pos;
625 if ( ( node_con_nodes = (
long * ) calloc( size,
sizeof(
long ) ) ) == NULL ) {
629 mesh_edges = size / 2;
633 fe_node = fe_node_array;
634 for ( i = 0; i < fe_nodes; i++, fe_node++ ) {
636 for ( j = node_num_elems [ i ]; j < node_num_elems [ node ]; j++ ) {
637 elem = node_con_elems [ j ];
642 fe_edge = & ( fe_edge_array [ elem - 1 ] );
643 for ( k = 0; k < 2; k++ ) {
644 nd = fe_edge->
node [ k ]->
id;
645 if ( nd != node && nd > 0 ) {
646 fe_edge->
node [ k ]->
id = -nd;
647 node_con_nodes [ node_num_nodes [ i ]++ ] = nd;
654 fe_face = & ( fe_face_array [ elem - 1 ] );
655 for ( k = 0; k < 3; k++ ) {
656 nd = fe_face->
node [ k ]->
id;
657 if ( nd != node && nd > 0 ) {
658 fe_face->
node [ k ]->
id = -nd;
659 node_con_nodes [ node_num_nodes [ i ]++ ] = nd;
666 fe_quad = & ( fe_quad_array [ elem - 1 ] );
667 for ( k = 0; k < 4; k++ ) {
668 if ( fe_node == fe_quad->
node [ k ] ) {
669 for ( m = 0; m < 2; m++ ) {
670 nd = fe_quad->
node [ quad_con_nd [ k ] [ m ] ]->
id;
672 fe_quad->
node [ quad_con_nd [ k ] [ m ] ]->
id = -nd;
673 node_con_nodes [ node_num_nodes [ i ]++ ] = nd;
684 fe_tetra = & ( fe_tetra_array [ elem - 1 ] );
685 for ( k = 0; k < 4; k++ ) {
686 nd = fe_tetra->
node [ k ]->
id;
687 if ( nd != node && nd > 0 ) {
688 fe_tetra->
node [ k ]->
id = -nd;
689 node_con_nodes [ node_num_nodes [ i ]++ ] = nd;
696 fe_hexa = & ( fe_hexa_array [ elem - 1 ] );
697 for ( k = 0; k < 8; k++ ) {
698 if ( fe_node == fe_hexa->
node [ k ] ) {
699 for ( m = 0; m < 3; m++ ) {
700 nd = fe_hexa->
node [ hexa_con_nd [ k ] [ m ] ]->
id;
702 fe_hexa->
node [ hexa_con_nd [ k ] [ m ] ]->
id = -nd;
703 node_con_nodes [ node_num_nodes [ i ]++ ] = nd;
720 for ( j = node_num_elems [ i ]; j < node_num_elems [ node ]; j++ ) {
721 elem = node_con_elems [ j ];
726 fe_edge = & ( fe_edge_array [ elem - 1 ] );
727 for ( k = 0; k < 2; k++ ) {
734 fe_face = & ( fe_face_array [ elem - 1 ] );
735 for ( k = 0; k < 3; k++ ) {
742 fe_quad = & ( fe_quad_array [ elem - 1 ] );
743 for ( k = 0; k < 4; k++ ) {
750 fe_tetra = & ( fe_tetra_array [ elem - 1 ] );
751 for ( k = 0; k < 4; k++ ) {
752 fe_tetra->
node [ k ]->
id = abs(fe_tetra->
node [ k ]->
id);
758 fe_hexa = & ( fe_hexa_array [ elem - 1 ] );
759 for ( k = 0; k < 8; k++ ) {
774 for ( i = 0; i < fe_nodes; i++ ) {
775 number = node_num_nodes [ i ] - pos;
776 node_num_nodes [ i ] = pos;
781 for ( i = 0; i < fe_nodes; i++ ) {
782 OOFEM_LOG_DEBUG(
"node %ld: %ld:", i + 1, node_num_nodes [ i + 1 ] - node_num_nodes [ i ]);
783 for ( j = node_num_nodes [ i ]; j < node_num_nodes [ i + 1 ]; j++ ) {
793#ifdef COMPLETE_DATA_STRUCTURE
794 if ( fe_faces != 0 ) {
795 if ( ( tmp_face_array = ( tmp_face_rec * ) calloc( fe_faces,
sizeof( tmp_face_rec ) ) ) == NULL ) {
800 if ( fe_quads != 0 ) {
801 if ( ( tmp_quad_array = ( tmp_quad_rec * ) calloc( fe_quads,
sizeof( tmp_quad_rec ) ) ) == NULL ) {
808 if ( fe_tetras != 0 ) {
814 if ( fe_hexas != 0 ) {
820#ifdef COMPLETE_DATA_STRUCTURE
824 fe_face = fe_face_array;
825 for ( i = 0; i < fe_faces; i++, fe_face++ ) {
827 for ( j = 0; j < 3; j++ ) {
828 j1 = face_ed_nd [ j ] [ 0 ];
829 j2 = face_ed_nd [ j ] [ 1 ];
830 node1 = fe_face->
node [ j1 ]->
id;
831 node2 = fe_face->
node [ j2 ]->
id;
832 for ( k = node_num_elems [ node1 - 1 ]; k < node_num_elems [ node1 ]; k++ ) {
833 elem2 = node_con_elems [ k ];
834 if ( elem2 == elem1 ) {
839 for ( m = node_num_elems [ node2 - 1 ]; m < node_num_elems [ node2 ]; m++ ) {
840 if ( elem2 == node_con_elems [ m ] ) {
844 if ( ( & ( tmp_face_array [ i ] ) )->ngb_elem_id [ j ] != 0 ) {
848 ( & ( tmp_face_array [ i ] ) )->ngb_elem_id [ j ] = elem2;
857 fe_quad = fe_quad_array;
858 for ( i = 0; i < fe_quads; i++, fe_quad++ ) {
860 for ( j = 0; j < 4; j++ ) {
861 j1 = quad_ed_nd [ j ] [ 0 ];
862 j2 = quad_ed_nd [ j ] [ 1 ];
863 node1 = fe_quad->
node [ j1 ]->
id;
864 node2 = fe_quad->
node [ j2 ]->
id;
865 for ( k = node_num_elems [ node1 - 1 ]; k < node_num_elems [ node1 ]; k++ ) {
866 elem2 = node_con_elems [ k ];
867 if ( elem2 == elem1 ) {
872 for ( m = node_num_elems [ node2 - 1 ]; m < node_num_elems [ node2 ]; m++ ) {
873 if ( elem2 == node_con_elems [ m ] ) {
877 if ( ( & ( tmp_quad_array [ i ] ) )->ngb_elem_id [ j ] != 0 ) {
881 ( & ( tmp_quad_array [ i ] ) )->ngb_elem_id [ j ] = elem2;
891 tmp_face = tmp_face_array;
892 for ( i = 0; i < fe_faces; i++, tmp_face++ ) {
894 for ( j = 0; j < 3; j++ ) {
895 switch (
elem_type(tmp_face->ngb_elem_id [ j ]) ) {
908 tmp_quad = tmp_quad_array;
909 for ( i = 0; i < fe_quads; i++, tmp_quad++ ) {
911 for ( j = 0; j < 4; j++ ) {
912 switch (
elem_type(tmp_quad->ngb_elem_id [ j ]) ) {
932 fe_tetra = fe_tetra_array;
933 for ( i = 0; i < fe_tetras; i++, fe_tetra++ ) {
936 for ( j = 0; j < 4; j++ ) {
937 j1 = tetra_fc_nd [ j ] [ 0 ];
938 j2 = tetra_fc_nd [ j ] [ 1 ];
939 j3 = tetra_fc_nd [ j ] [ 2 ];
940 node1 = fe_tetra->
node [ j1 ]->
id;
941 node2 = fe_tetra->
node [ j2 ]->
id;
942 node3 = fe_tetra->
node [ j3 ]->
id;
943 for ( k = node_num_elems [ node1 - 1 ]; k < node_num_elems [ node1 ]; k++ ) {
944 elem2 = node_con_elems [ k ];
945 if ( elem2 == elem1 ) {
953 for ( m = node_num_elems [ node2 - 1 ]; m < node_num_elems [ node2 ]; m++ ) {
954 if ( elem2 != node_con_elems [ m ] ) {
958 for ( n = node_num_elems [ node3 - 1 ]; n < node_num_elems [ node3 ]; n++ ) {
959 if ( elem2 == node_con_elems [ n ] ) {
960 ( & ( tmp_tetra_array [ i ] ) )->ngb_elem_id [ j ] = elem2;
961 if ( elem1 > elem2 ) {
965 k = node_num_elems [ node1 ];
966 m = node_num_elems [ node2 ];
975 fe_hexa = fe_hexa_array;
976 for ( i = 0; i < fe_hexas; i++, fe_hexa++ ) {
979 for ( j = 0; j < 6; j++ ) {
980 j1 = hexa_fc_nd [ j ] [ 0 ];
981 j2 = hexa_fc_nd [ j ] [ 1 ];
982 j3 = hexa_fc_nd [ j ] [ 2 ];
983 j4 = hexa_fc_nd [ j ] [ 3 ];
984 node1 = fe_hexa->
node [ j1 ]->
id;
985 node2 = fe_hexa->
node [ j2 ]->
id;
986 node3 = fe_hexa->
node [ j3 ]->
id;
987 node4 = fe_hexa->
node [ j4 ]->
id;
988 for ( k = node_num_elems [ node1 - 1 ]; k < node_num_elems [ node1 ]; k++ ) {
989 elem2 = node_con_elems [ k ];
990 if ( elem2 == elem1 ) {
998 for ( m = node_num_elems [ node2 - 1 ]; m < node_num_elems [ node2 ]; m++ ) {
999 if ( elem2 != node_con_elems [ m ] ) {
1003 for ( n = node_num_elems [ node3 - 1 ]; n < node_num_elems [ node3 ]; n++ ) {
1004 if ( elem2 != node_con_elems [ n ] ) {
1008 for ( p = node_num_elems [ node4 - 1 ]; p < node_num_elems [ node4 ]; p++ ) {
1009 if ( elem2 == node_con_elems [ p ] ) {
1010 ( & ( tmp_hexa_array [ i ] ) )->ngb_elem_id [ j ] = elem2;
1011 if ( elem1 > elem2 ) {
1015 k = node_num_elems [ node1 ];
1016 m = node_num_elems [ node2 ];
1017 n = node_num_elems [ node3 ];
1028 tmp_tetra = tmp_tetra_array;
1029 for ( i = 0; i < fe_tetras; i++, tmp_tetra++ ) {
1031 for ( j = 0; j < 4; j++ ) {
1042 tmp_hexa = tmp_hexa_array;
1043 for ( i = 0; i < fe_hexas; i++, tmp_hexa++ ) {
1045 for ( j = 0; j < 6; j++ ) {
1059 if ( mesh_edges != 0 ) {
1065 if ( mesh_faces != 0 ) {
1071 if ( mesh_quads != 0 ) {
1077 fine_nodes = mesh_edges + mesh_faces + mesh_quads + fe_faces + fe_quads + fe_tetras + fe_pyrams + fe_wedges + fe_hexas;
1079 fine_edges = fe_edges * 2;
1080 fine_quads = fe_faces * 3 + fe_quads * 4;
1081 fine_hexas = fe_tetras * 4 + fe_pyrams * 8 + fe_wedges * 8 + fe_hexas * 8;
1083 if ( fine_nodes != 0 ) {
1089 if ( fine_edges != 0 ) {
1095 if ( fine_quads != 0 ) {
1101 if ( fine_hexas != 0 ) {
1107 fine_node_id = fe_nodes;
1108 fine_node = fine_node_array;
1111 mesh_edge = mesh_edge_array;
1113 if ( fe_edges != 0 ) {
1116 fe_edge = fe_edge_array;
1117 for ( i = 0; i < fe_edges; i++, fe_edge++ ) {
1118 node1 = ( nd1 = fe_edge->
node [ 0 ] )->
id;
1119 node2 = ( nd2 = fe_edge->
node [ 1 ] )->
id;
1121 fine_node->
id = ++fine_node_id;
1125 mesh_edge->
node [ 0 ] = nd1;
1126 mesh_edge->
node [ 1 ] = nd2;
1131 for ( k = node_num_nodes [ node1 - 1 ]; k < node_num_nodes [ node1 ]; k++ ) {
1132 if ( node_con_nodes [ k ] == node2 ) {
1133 node_con_nodes [ k ] = -mesh_edge_id;
1138 for ( k = node_num_nodes [ node2 - 1 ]; k < node_num_nodes [ node2 ]; k++ ) {
1139 if ( node_con_nodes [ k ] == node1 ) {
1140 node_con_nodes [ k ] = -mesh_edge_id;
1149#ifdef COMPLETE_DATA_STRUCTURE
1153 fe_face = fe_face_array;
1154 tmp_face = tmp_face_array;
1155 for ( i = 0; i < fe_faces; i++, fe_face++, tmp_face++ ) {
1157 for ( j = 0; j < 3; j++ ) {
1158 elem2 = tmp_face->ngb_elem_id [ j ];
1160 if ( elem2 == 0 || elem1 < elem2 ) {
1161 j1 = face_ed_nd [ j ] [ 0 ];
1162 j2 = face_ed_nd [ j ] [ 1 ];
1163 node1 = ( nd1 = fe_face->
node [ j1 ] )->
id;
1164 node2 = ( nd2 = fe_face->
node [ j2 ] )->
id;
1166 fine_node->
id = ++fine_node_id;
1170 if ( node1 < node2 ) {
1171 mesh_edge->
node [ 0 ] = nd1;
1172 mesh_edge->
node [ 1 ] = nd2;
1174 mesh_edge->
node [ 0 ] = nd2;
1175 mesh_edge->
node [ 1 ] = nd1;
1181 for ( k = node_num_nodes [ node1 - 1 ]; k < node_num_nodes [ node1 ]; k++ ) {
1182 node = node_con_nodes [ k ];
1183 if ( node == node2 ) {
1184 node_con_nodes [ k ] = -mesh_edge_id;
1189 for ( k = node_num_nodes [ node2 - 1 ]; k < node_num_nodes [ node2 ]; k++ ) {
1190 node = node_con_nodes [ k ];
1191 if ( node == node1 ) {
1192 node_con_nodes [ k ] = -mesh_edge_id;
1197 tmp_face->edge [ j ] = mesh_edge;
1202 tmp_fc = & ( tmp_face_array [ elem - 1 ] );
1203 for ( k = 0; k < 3; k++ ) {
1204 if ( tmp_fc->ngb_elem_id [ k ] == elem1 ) {
1205 tmp_fc->edge [ k ] = mesh_edge;
1213 tmp_qd = & ( tmp_quad_array [ elem - 1 ] );
1214 for ( k = 0; k < 4; k++ ) {
1215 if ( tmp_qd->ngb_elem_id [ k ] == elem1 ) {
1216 tmp_qd->edge [ k ] = mesh_edge;
1228 fe_quad = fe_quad_array;
1229 tmp_quad = tmp_quad_array;
1230 for ( i = 0; i < fe_quads; i++, fe_quad++, tmp_quad++ ) {
1232 for ( j = 0; j < 4; j++ ) {
1233 elem2 = tmp_quad->ngb_elem_id [ j ];
1235 if ( elem2 == 0 || elem1 < elem2 ) {
1236 j1 = quad_ed_nd [ j ] [ 0 ];
1237 j2 = quad_ed_nd [ j ] [ 1 ];
1238 node1 = ( nd1 = fe_quad->
node [ j1 ] )->
id;
1239 node2 = ( nd2 = fe_quad->
node [ j2 ] )->
id;
1241 fine_node->
id = ++fine_node_id;
1245 if ( node1 < node2 ) {
1246 mesh_edge->
node [ 0 ] = nd1;
1247 mesh_edge->
node [ 1 ] = nd2;
1249 mesh_edge->
node [ 0 ] = nd2;
1250 mesh_edge->
node [ 1 ] = nd1;
1256 for ( k = node_num_nodes [ node1 - 1 ]; k < node_num_nodes [ node1 ]; k++ ) {
1257 node = node_con_nodes [ k ];
1258 if ( node == node2 ) {
1259 node_con_nodes [ k ] = -mesh_edge_id;
1264 for ( k = node_num_nodes [ node2 - 1 ]; k < node_num_nodes [ node2 ]; k++ ) {
1265 node = node_con_nodes [ k ];
1266 if ( node == node1 ) {
1267 node_con_nodes [ k ] = -mesh_edge_id;
1272 tmp_quad->edge [ j ] = mesh_edge;
1277 tmp_fc = & ( tmp_face_array [ elem - 1 ] );
1278 for ( k = 0; k < 3; k++ ) {
1279 if ( tmp_fc->ngb_elem_id [ k ] == elem1 ) {
1280 tmp_fc->edge [ k ] = mesh_edge;
1288 tmp_qd = & ( tmp_quad_array [ elem - 1 ] );
1289 for ( k = 0; k < 4; k++ ) {
1290 if ( tmp_qd->ngb_elem_id [ k ] == elem1 ) {
1291 tmp_qd->edge [ k ] = mesh_edge;
1307 for ( i = 0; i < fe_nodes; i++ ) {
1309 for ( j = node_num_nodes [ i ]; j < node_num_nodes [ node ]; j++ ) {
1312 nd = node_con_nodes [ j ];
1314 node_con_nodes [ j ] = -nd;
1325 nd1 = & ( fe_node_array [ node - 1 ] );
1326 nd2 = & ( fe_node_array [ nd - 1 ] );
1328 fine_node->
id = ++fine_node_id;
1332 mesh_edge->
node [ 0 ] = nd1;
1333 mesh_edge->
node [ 1 ] = nd2;
1337 node_con_nodes [ j ] = ++mesh_edge_id;
1339 for ( k = node_num_nodes [ nd - 1 ]; k < node_num_nodes [ nd ]; k++ ) {
1340 if ( node_con_nodes [ k ] == node ) {
1341 node_con_nodes [ k ] = -mesh_edge_id;
1350 mesh_face = mesh_face_array;
1352 fe_tetra = fe_tetra_array;
1353 tmp_tetra = tmp_tetra_array;
1354 for ( i = 0; i < fe_tetras; i++, fe_tetra++, tmp_tetra++ ) {
1356 for ( j = 0; j < 4; j++ ) {
1359 if ( elem2 == 0 || elem1 < elem2 ) {
1360 j1 = tetra_fc_nd [ j ] [ 0 ];
1361 j2 = tetra_fc_nd [ j ] [ 1 ];
1362 j3 = tetra_fc_nd [ j ] [ 2 ];
1363 nd1 = fe_tetra->
node [ j1 ];
1364 nd2 = fe_tetra->
node [ j2 ];
1365 nd3 = fe_tetra->
node [ j3 ];
1367 fine_node->
id = ++fine_node_id;
1369 mesh_face->
node [ 0 ] = nd1;
1370 mesh_face->
node [ 1 ] = nd2;
1371 mesh_face->
node [ 2 ] = nd3;
1374 tmp_tetra->
face [ j ] = mesh_face;
1378 tmp_tet = & ( tmp_tetra_array [ elem - 1 ] );
1379 for ( k = 0; k < 4; k++ ) {
1380 if ( tmp_tet->ngb_elem_id [ k ] == elem1 ) {
1381 tmp_tet->face [ k ] = mesh_face;
1394 mesh_quad = mesh_quad_array;
1396 fe_hexa = fe_hexa_array;
1397 tmp_hexa = tmp_hexa_array;
1398 for ( i = 0; i < fe_hexas; i++, fe_hexa++, tmp_hexa++ ) {
1400 for ( j = 0; j < 6; j++ ) {
1403 if ( elem2 == 0 || elem1 < elem2 ) {
1404 j1 = hexa_fc_nd [ j ] [ 0 ];
1405 j2 = hexa_fc_nd [ j ] [ 1 ];
1406 j3 = hexa_fc_nd [ j ] [ 2 ];
1407 j4 = hexa_fc_nd [ j ] [ 3 ];
1408 nd1 = fe_hexa->
node [ j1 ];
1409 nd2 = fe_hexa->
node [ j2 ];
1410 nd3 = fe_hexa->
node [ j3 ];
1411 nd4 = fe_hexa->
node [ j4 ];
1413 fine_node->
id = ++fine_node_id;
1415 mesh_quad->
node [ 0 ] = nd1;
1416 mesh_quad->
node [ 1 ] = nd2;
1417 mesh_quad->
node [ 2 ] = nd3;
1418 mesh_quad->
node [ 3 ] = nd4;
1421 tmp_hexa->
quad [ j ] = mesh_quad;
1425 tmp_hx = & ( tmp_hexa_array [ elem - 1 ] );
1426 for ( k = 0; k < 6; k++ ) {
1427 if ( tmp_hx->ngb_elem_id [ k ] == elem1 ) {
1428 tmp_hx->quad [ k ] = mesh_quad;
1440 refine_nodes += mesh_edges * level * 2;
1441 refine_nodes += mesh_faces * ( level * 3 + level * level * 3 );
1442 refine_nodes += mesh_quads * ( level * 4 + level * level * 4 );
1443 refine_nodes += fe_faces * ( level * 3 + level * level * 3 );
1444 refine_nodes += fe_quads * ( level * 4 + level * level * 4 );
1445 refine_nodes += fe_tetras * ( level * 4 + level * level * 6 + level * level * level * 4 );
1446 refine_nodes += fe_hexas * ( level * 6 + level * level * 12 + level * level * level * 8 );
1448 refine_node_id = fe_nodes + fine_nodes;
1452 mesh_edge = mesh_edge_array;
1453 for ( i = 0; i < mesh_edges; i++, mesh_edge++ ) {
1454 for ( j = 0; j < 2; j++ ) {
1455 if ( ( mesh_edge->
fine_id [ j ] = (
int * ) calloc( level + 2,
sizeof(
int ) ) ) == NULL ) {
1460 for ( k = 1; k < level + 1; k++ ) {
1461 mesh_edge->
fine_id [ j ] [ k ] = ++refine_node_id;
1480 for ( j = 0; j < 4; j++ ) {
1481 if ( ( tmp_array_start [ j ] = (
long * ) calloc( level + 2,
sizeof(
long ) ) ) == NULL ) {
1485 if ( ( tmp_array_end [ j ] = (
long * ) calloc( level + 2,
sizeof(
long ) ) ) == NULL ) {
1489 if ( ( tmp_array_cen [ j ] = (
long * ) calloc( level + 2,
sizeof(
long ) ) ) == NULL ) {
1496 mesh_face = mesh_face_array;
1497 for ( i = 0; i < mesh_faces; i++, mesh_face++ ) {
1498 for ( j = 0; j < 3; j++ ) {
1499 j1 = face_ed_nd [ j ] [ 0 ];
1500 j2 = face_ed_nd [ j ] [ 1 ];
1502 node1 = mesh_face->
node [ j1 ]->
id;
1503 node2 = mesh_face->
node [ j2 ]->
id;
1507 if ( node1 < node2 ) {
1508 for ( k = node_num_nodes [ node1 - 1 ]; k < node_num_nodes [ node1 ]; k++ ) {
1509 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1510 if ( mesh_edge->
node [ 1 ]->
id == node2 ) {
1511 for ( m = 0; m < level + 2; m++ ) {
1512 tmp_array_start [ j ] [ m ] = mesh_edge->
fine_id [ 0 ] [ m ];
1513 tmp_array_end [ j ] [ m ] = mesh_edge->
fine_id [ 1 ] [ m ];
1520 for ( k = node_num_nodes [ node2 - 1 ]; k < node_num_nodes [ node2 ]; k++ ) {
1521 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1522 if ( mesh_edge->
node [ 1 ]->
id == node1 ) {
1523 for ( m = 0; m < level + 2; m++ ) {
1524 tmp_array_start [ j ] [ m ] = mesh_edge->
fine_id [ 1 ] [ m ];
1525 tmp_array_end [ j ] [ m ] = mesh_edge->
fine_id [ 0 ] [ m ];
1533 tmp_array_cen [ j ] [ 0 ] = mesh_edge->
mid_node->
id;
1534 for ( m = 1; m < level + 1; m++ ) {
1535 tmp_array_cen [ j ] [ m ] = ++refine_node_id;
1538 tmp_array_cen [ j ] [ level + 1 ] = mesh_face->
mid_node->
id;
1541 for ( j = 0; j < 3; j++ ) {
1542 if ( ( mesh_face->
fine_id [ j ] = (
int * ) calloc( ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
1546 if ( ( jj = j - 1 ) < 0 ) {
1550 j1 = face_ed_nd [ jj ] [ 0 ];
1551 j2 = face_ed_nd [ jj ] [ 1 ];
1554 for ( k = 0; k < level + 2; k++ ) {
1555 mesh_face->
fine_id [ j ] [ pos++ ] = tmp_array_start [ j2 ] [ k ];
1558 for ( k = 1; k < level + 1; k++ ) {
1559 mesh_face->
fine_id [ j ] [ pos++ ] = tmp_array_end [ j1 ] [ k ];
1560 for ( m = 1; m < level + 1; m++ ) {
1561 mesh_face->
fine_id [ j ] [ pos++ ] = ++refine_node_id;
1564 mesh_face->
fine_id [ j ] [ pos++ ] = tmp_array_cen [ j2 ] [ k ];
1567 for ( k = 0; k < level + 2; k++ ) {
1568 mesh_face->
fine_id [ j ] [ pos++ ] = tmp_array_cen [ j1 ] [ k ];
1575 mesh_quad = mesh_quad_array;
1576 for ( i = 0; i < mesh_quads; i++, mesh_quad++ ) {
1577 for ( j = 0; j < 4; j++ ) {
1578 j1 = quad_ed_nd [ j ] [ 0 ];
1579 j2 = quad_ed_nd [ j ] [ 1 ];
1581 node1 = mesh_quad->
node [ j1 ]->
id;
1582 node2 = mesh_quad->
node [ j2 ]->
id;
1586 if ( node1 < node2 ) {
1587 for ( k = node_num_nodes [ node1 - 1 ]; k < node_num_nodes [ node1 ]; k++ ) {
1588 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1589 if ( mesh_edge->
node [ 1 ]->
id == node2 ) {
1590 for ( m = 0; m < level + 2; m++ ) {
1591 tmp_array_start [ j ] [ m ] = mesh_edge->
fine_id [ 0 ] [ m ];
1592 tmp_array_end [ j ] [ m ] = mesh_edge->
fine_id [ 1 ] [ m ];
1599 for ( k = node_num_nodes [ node2 - 1 ]; k < node_num_nodes [ node2 ]; k++ ) {
1600 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1601 if ( mesh_edge->
node [ 1 ]->
id == node1 ) {
1602 for ( m = 0; m < level + 2; m++ ) {
1603 tmp_array_start [ j ] [ m ] = mesh_edge->
fine_id [ 1 ] [ m ];
1604 tmp_array_end [ j ] [ m ] = mesh_edge->
fine_id [ 0 ] [ m ];
1612 tmp_array_cen [ j ] [ 0 ] = mesh_edge->
mid_node->
id;
1613 for ( m = 1; m < level + 1; m++ ) {
1614 tmp_array_cen [ j ] [ m ] = ++refine_node_id;
1617 tmp_array_cen [ j ] [ level + 1 ] = mesh_quad->
mid_node->
id;
1620 for ( j = 0; j < 4; j++ ) {
1621 if ( ( mesh_quad->
fine_id [ j ] = (
int * ) calloc( ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
1625 if ( ( jj = j - 1 ) < 0 ) {
1629 j1 = quad_ed_nd [ jj ] [ 0 ];
1630 j2 = quad_ed_nd [ jj ] [ 1 ];
1633 for ( k = 0; k < level + 2; k++ ) {
1634 mesh_quad->
fine_id [ j ] [ pos++ ] = tmp_array_start [ j2 ] [ k ];
1637 for ( k = 1; k < level + 1; k++ ) {
1638 mesh_quad->
fine_id [ j ] [ pos++ ] = tmp_array_end [ j1 ] [ k ];
1639 for ( m = 1; m < level + 1; m++ ) {
1640 mesh_quad->
fine_id [ j ] [ pos++ ] = ++refine_node_id;
1643 mesh_quad->
fine_id [ j ] [ pos++ ] = tmp_array_cen [ j2 ] [ k ];
1646 for ( k = 0; k < level + 2; k++ ) {
1647 mesh_quad->
fine_id [ j ] [ pos++ ] = tmp_array_cen [ j1 ] [ k ];
1652#ifdef COMPLETE_DATA_STRUCTURE
1653 if ( node_num_nodes != NULL ) {
1654 free(node_num_nodes);
1657 if ( node_con_nodes != NULL ) {
1658 free(node_con_nodes);
1670 mesh_edge = mesh_edge_array;
1671 for ( i = 0; i < fe_edges; i++, mesh_edge++ ) {
1672 for ( j = 0; j < 2; j++ ) {
1673 fine_edge = & ( fine_edge_array [ fine_edge_id++ ] );
1674 if ( ( fine_edge->
fine_id = (
int * ) calloc( ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
1678 for ( k = 0; k < level + 2; k++ ) {
1688 fe_face = fe_face_array;
1689 for ( i = 0; i < fe_faces; i++, fe_face++, fine_node++ ) {
1690 fine_node->
id = ++fine_node_id;
1692#ifdef COMPLETE_DATA_STRUCTURE
1693 tmp_face = & tmp_face_array [ i ];
1696 for ( j = 0; j < 3; j++ ) {
1697 j1 = face_ed_nd [ j ] [ 0 ];
1698 j2 = face_ed_nd [ j ] [ 1 ];
1700 node1 = fe_face->
node [ j1 ]->
id;
1701 node2 = fe_face->
node [ j2 ]->
id;
1703#ifdef COMPLETE_DATA_STRUCTURE
1704 mesh_edge = tmp_face->edge [ j ];
1709 if ( node1 < node2 ) {
1710#ifndef COMPLETE_DATA_STRUCTURE
1711 for ( k = node_num_nodes [ node1 - 1 ]; k < node_num_nodes [ node1 ]; k++ ) {
1712 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1713 if ( mesh_edge->
node [ 1 ]->
id == node2 ) {
1720 for ( k = 0; k < level + 2; k++ ) {
1721 tmp_array_start [ j ] [ k ] = mesh_edge->
fine_id [ 0 ] [ k ];
1722 tmp_array_end [ j ] [ k ] = mesh_edge->
fine_id [ 1 ] [ k ];
1725#ifndef COMPLETE_DATA_STRUCTURE
1726 for ( k = node_num_nodes [ node2 - 1 ]; k < node_num_nodes [ node2 ]; k++ ) {
1727 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1728 if ( mesh_edge->
node [ 1 ]->
id == node1 ) {
1735 for ( k = 0; k < level + 2; k++ ) {
1736 tmp_array_start [ j ] [ k ] = mesh_edge->
fine_id [ 1 ] [ k ];
1737 tmp_array_end [ j ] [ k ] = mesh_edge->
fine_id [ 0 ] [ k ];
1741 tmp_array_cen [ j ] [ 0 ] = mesh_edge->
mid_node->
id;
1742 for ( k = 1; k < level + 1; k++ ) {
1743 tmp_array_cen [ j ] [ k ] = ++refine_node_id;
1746 tmp_array_cen [ j ] [ level + 1 ] = fine_node->
id;
1749 for ( j = 0; j < 3; j++ ) {
1750 fine_quad = & ( fine_quad_array [ fine_quad_id++ ] );
1751 if ( ( fine_quad->
fine_id = (
int * ) calloc( ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
1755 if ( ( jj = j - 1 ) < 0 ) {
1759 j1 = face_ed_nd [ jj ] [ 0 ];
1760 j2 = face_ed_nd [ jj ] [ 1 ];
1763 for ( k = 0; k < level + 2; k++ ) {
1764 fine_quad->
fine_id [ pos++ ] = tmp_array_start [ j2 ] [ k ];
1767 for ( k = 1; k < level + 1; k++ ) {
1768 fine_quad->
fine_id [ pos++ ] = tmp_array_end [ j1 ] [ k ];
1769 for ( m = 1; m < level + 1; m++ ) {
1770 fine_quad->
fine_id [ pos++ ] = ++refine_node_id;
1773 fine_quad->
fine_id [ pos++ ] = tmp_array_cen [ j2 ] [ k ];
1776 for ( k = 0; k < level + 2; k++ ) {
1777 fine_quad->
fine_id [ pos++ ] = tmp_array_cen [ j1 ] [ k ];
1782 fe_quad = fe_quad_array;
1783 for ( i = 0; i < fe_quads; i++, fe_quad++, fine_node++ ) {
1784 fine_node->
id = ++fine_node_id;
1786#ifdef COMPLETE_DATA_STRUCTURE
1787 tmp_quad = & ( tmp_quad_array [ i ] );
1790 for ( j = 0; j < 4; j++ ) {
1791 j1 = quad_ed_nd [ j ] [ 0 ];
1792 j2 = quad_ed_nd [ j ] [ 1 ];
1794 node1 = fe_quad->
node [ j1 ]->
id;
1795 node2 = fe_quad->
node [ j2 ]->
id;
1797#ifdef COMPLETE_DATA_STRUCTURE
1798 mesh_edge = tmp_quad->edge [ j ];
1803 if ( node1 < node2 ) {
1804#ifndef COMPLETE_DATA_STRUCTURE
1805 for ( k = node_num_nodes [ node1 - 1 ]; k < node_num_nodes [ node1 ]; k++ ) {
1806 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1807 if ( mesh_edge->
node [ 1 ]->
id == node2 ) {
1814 for ( k = 0; k < level + 2; k++ ) {
1815 tmp_array_start [ j ] [ k ] = mesh_edge->
fine_id [ 0 ] [ k ];
1816 tmp_array_end [ j ] [ k ] = mesh_edge->
fine_id [ 1 ] [ k ];
1819#ifndef COMPLETE_DATA_STRUCTURE
1820 for ( k = node_num_nodes [ node2 - 1 ]; k < node_num_nodes [ node2 ]; k++ ) {
1821 mesh_edge = & ( mesh_edge_array [ node_con_nodes [ k ] - 1 ] );
1822 if ( mesh_edge->
node [ 1 ]->
id == node1 ) {
1829 for ( k = 0; k < level + 2; k++ ) {
1830 tmp_array_start [ j ] [ k ] = mesh_edge->
fine_id [ 1 ] [ k ];
1831 tmp_array_end [ j ] [ k ] = mesh_edge->
fine_id [ 0 ] [ k ];
1835 tmp_array_cen [ j ] [ 0 ] = mesh_edge->
mid_node->
id;
1836 for ( k = 1; k < level + 1; k++ ) {
1837 tmp_array_cen [ j ] [ k ] = ++refine_node_id;
1840 tmp_array_cen [ j ] [ level + 1 ] = fine_node->
id;
1843 for ( j = 0; j < 4; j++ ) {
1844 fine_quad = & ( fine_quad_array [ fine_quad_id++ ] );
1845 if ( ( fine_quad->
fine_id = (
int * ) calloc( ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
1849 if ( ( jj = j - 1 ) < 0 ) {
1853 j1 = quad_ed_nd [ jj ] [ 0 ];
1854 j2 = quad_ed_nd [ jj ] [ 1 ];
1857 for ( k = 0; k < level + 2; k++ ) {
1858 fine_quad->
fine_id [ pos++ ] = tmp_array_start [ j2 ] [ k ];
1861 for ( k = 1; k < level + 1; k++ ) {
1862 fine_quad->
fine_id [ pos++ ] = tmp_array_end [ j1 ] [ k ];
1863 for ( m = 1; m < level + 1; m++ ) {
1864 fine_quad->
fine_id [ pos++ ] = ++refine_node_id;
1867 fine_quad->
fine_id [ pos++ ] = tmp_array_cen [ j2 ] [ k ];
1870 for ( k = 0; k < level + 2; k++ ) {
1871 fine_quad->
fine_id [ pos++ ] = tmp_array_cen [ j1 ] [ k ];
1876 for ( j = 0; j < 4; j++ ) {
1877 free(tmp_array_start [ j ]);
1878 free(tmp_array_end [ j ]);
1879 free(tmp_array_cen [ j ]);
1882#ifdef COMPLETE_DATA_STRUCTURE
1883 if ( tmp_face_array != NULL ) {
1884 free(tmp_face_array);
1887 if ( tmp_quad_array != NULL ) {
1888 free(tmp_quad_array);
1892 if ( node_num_nodes != NULL ) {
1893 free(node_num_nodes);
1896 if ( node_con_nodes != NULL ) {
1897 free(node_con_nodes);
1902 mesh_edge = mesh_edge_array;
1903 for ( i = 0; i < mesh_edges; i++, mesh_edge++ ) {
1904 for ( j = 0; j < 2; j++ ) {
1905 if ( mesh_edge->
fine_id [ j ] != NULL ) {
1906 free(mesh_edge->
fine_id [ j ]);
1911 if ( mesh_edge_array != NULL ) {
1912 free(mesh_edge_array);
1917 for ( j = 0; j < 6; j++ ) {
1918 if ( ( tmp_array_cen [ j ] = (
long * ) calloc( level + 2,
sizeof(
long ) ) ) == NULL ) {
1923 for ( j = 0; j < 12; j++ ) {
1924 if ( ( tmp_array [ j ] = (
long * ) calloc( ( level + 2 ) * ( level + 2 ),
sizeof(
long ) ) ) == NULL ) {
1931 fe_tetra = fe_tetra_array;
1932 tmp_tetra = tmp_tetra_array;
1933 for ( i = 0; i < fe_tetras; i++, fe_tetra++, tmp_tetra++, fine_node++ ) {
1934 fine_node->
id = ++fine_node_id;
1936 for ( j = 0; j < 4; j++ ) {
1938 for ( k = 1; k < level + 1; k++ ) {
1939 tmp_array_cen [ j ] [ k ] = ++refine_node_id;
1942 tmp_array_cen [ j ] [ level + 1 ] = fine_node->
id;
1949 for ( j = 0; j < 4; j++ ) {
1950 mesh_face = mesh_fc [ j ] = tmp_tetra->
face [ j ];
1951 for ( k = 0; k < 3; k++ ) {
1952 if ( mesh_face->
node [ k ] == fe_tetra->
node [ tetra_fc_nd [ j ] [ 0 ] ] ) {
1953 if ( ( kk = k + 1 ) == 3 ) {
1957 if ( mesh_face->
node [ kk ] == fe_tetra->
node [ tetra_fc_nd [ j ] [ 1 ] ] ) {
1972 for ( j = 0; j < 3; j++ ) {
1975 p = ( level + 2 ) * ( level + 1 );
1976 mesh_face = mesh_fc [ 0 ];
1977 #pragma GCC diagnostic push
1979 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
1980 for ( k = 0; k < 3; k++ ) {
1981 if ( mesh_face->
node [ k ] == fe_tetra->
node [ j ] ) {
1982 if ( swap [ 0 ] == 1 ) {
1985 if ( ( kk = k + 1 ) == 3 ) {
1993 #pragma GCC diagnostic pop
1995 for ( m = 0; m < level + 2; m++ ) {
1996 tmp_array [ j ] [ pos++ ] = mesh_face->
fine_id [ kk ] [ p++ ];
2000 p = ( level + 2 ) * ( level + 1 );
2001 mesh_face = mesh_fc [ j + 1 ];
2002 for ( k = 0; k < 3; k++ ) {
2003 if ( mesh_face->
node [ k ] == fe_tetra->
node [ j ] ) {
2004 if ( swap [ j + 1 ] == 1 ) {
2007 if ( ( kk = k + 1 ) == 3 ) {
2016 for ( n = 1; n < level + 1; n++ ) {
2017 tmp_array [ j ] [ pos++ ] = mesh_face->
fine_id [ kk ] [ ++p ];
2018 for ( m = 0; m < level; m++ ) {
2019 tmp_array [ j ] [ pos++ ] = ++refine_node_id;
2022 tmp_array [ j ] [ pos++ ] = tmp_array_cen [ 0 ] [ n ];
2026 for ( m = 0; m < level + 2; m++ ) {
2027 tmp_array [ j ] [ pos++ ] = tmp_array_cen [ j + 1 ] [ m ];
2034 for ( j = 0; j < 3; j++ ) {
2035 j1 = face_ed_nd [ j ] [ 0 ];
2036 j2 = face_ed_nd [ j ] [ 1 ];
2040 p = ( level + 2 ) * ( level + 1 );
2041 mesh_face = mesh_fc [ j + 1 ];
2042 for ( k = 0; k < 3; k++ ) {
2043 if ( mesh_face->
node [ k ] == fe_tetra->
node [ 3 ] ) {
2044 if ( swap [ j + 1 ] == 1 ) {
2047 if ( ( kk = k + 1 ) == 3 ) {
2056 for ( m = 0; m < level + 2; m++ ) {
2057 tmp_array [ j + 3 ] [ pos++ ] = mesh_face->
fine_id [ kk ] [ p++ ];
2060 if ( ( jj = j ) == 0 ) {
2065 p = ( level + 2 ) * ( level + 1 );
2066 mesh_face = mesh_fc [ jj ];
2067 for ( k = 0; k < 3; k++ ) {
2068 if ( mesh_face->
node [ k ] == fe_tetra->
node [ j ] ) {
2069 if ( swap [ jj ] == 1 ) {
2072 if ( ( kk = k + 1 ) == 3 ) {
2081 for ( n = 1; n < level + 1; n++ ) {
2082 tmp_array [ j + 3 ] [ pos++ ] = mesh_face->
fine_id [ kk ] [ ++p ];
2083 for ( m = 0; m < level; m++ ) {
2084 tmp_array [ j + 3 ] [ pos++ ] = ++refine_node_id;
2087 tmp_array [ j + 3 ] [ pos++ ] = tmp_array_cen [ j + 1 ] [ n ];
2091 for ( m = 0; m < level + 2; m++ ) {
2092 tmp_array [ j + 3 ] [ pos++ ] = tmp_array_cen [ jj ] [ m ];
2109 for ( j = 0; j < 3; j++ ) {
2110 fine_hexa = & ( fine_hexa_array [ fine_hexa_id++ ] );
2111 if ( ( fine_hexa->
fine_id = (
int * ) calloc( ( level + 2 ) * ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
2115 mesh_face = mesh_fc [ 0 ];
2116 for ( k = 0; k < 3; k++ ) {
2117 if ( mesh_face->
node [ k ] == fe_tetra->
node [ j ] ) {
2122 if ( swap [ 0 ] == 1 ) {
2123 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2124 for ( m = 0; m < level + 2; m++, pos++ ) {
2129 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2130 for ( m = 0; m < level + 2; m++, pos++ ) {
2136 mesh_face = mesh_fc [ j + 1 ];
2137 for ( k = 0; k < 3; k++ ) {
2138 if ( mesh_face->
node [ k ] == fe_tetra->
node [ j ] ) {
2143 if ( swap [ j + 1 ] == 1 ) {
2144 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2145 for ( m = 0; m < level + 2; m++, pos++ ) {
2150 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2151 for ( m = 0; m < level + 2; m++, pos++ ) {
2157 if ( ( jj = j ) == 0 ) {
2161 mesh_face = mesh_fc [ jj ];
2162 for ( k = 0; k < 3; k++ ) {
2163 if ( mesh_face->
node [ k ] == fe_tetra->
node [ j ] ) {
2168 if ( swap [ jj ] == 1 ) {
2169 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2170 for ( m = 0; m < level + 2; m++, pos++ ) {
2175 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2176 for ( m = 0; m < level + 2; m++, pos++ ) {
2182 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2183 for ( m = 0; m < level + 2; m++, pos++ ) {
2185 matrix_3d(fine_hexa->
fine_id, m, level + 1, n) = tmp_array [ jj - 1 ] [ pos ];
2186 matrix_3d(fine_hexa->
fine_id, m, n, level + 1) = tmp_array [ j + 3 ] [ pos ];
2191 for ( k = 1; k < level + 1; k++ ) {
2192 for ( n = 1; n < level + 1; n++ ) {
2193 for ( m = 1; m < level + 1; m++ ) {
2203 fine_hexa = & ( fine_hexa_array [ fine_hexa_id++ ] );
2204 if ( ( fine_hexa->
fine_id = (
int * ) calloc( ( level + 2 ) * ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
2208 mesh_face = mesh_fc [ 1 ];
2209 for ( k = 0; k < 3; k++ ) {
2210 if ( mesh_face->
node [ k ] == fe_tetra->
node [ 3 ] ) {
2215 if ( swap [ 1 ] == 1 ) {
2216 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2217 for ( m = 0; m < level + 2; m++, pos++ ) {
2222 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2223 for ( m = 0; m < level + 2; m++, pos++ ) {
2229 mesh_face = mesh_fc [ 2 ];
2230 for ( k = 0; k < 3; k++ ) {
2231 if ( mesh_face->
node [ k ] == fe_tetra->
node [ 3 ] ) {
2236 if ( swap [ 2 ] == 1 ) {
2237 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2238 for ( m = 0; m < level + 2; m++, pos++ ) {
2243 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2244 for ( m = 0; m < level + 2; m++, pos++ ) {
2250 mesh_face = mesh_fc [ 3 ];
2251 for ( k = 0; k < 3; k++ ) {
2252 if ( mesh_face->
node [ k ] == fe_tetra->
node [ 3 ] ) {
2257 if ( swap [ 3 ] == 1 ) {
2258 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2259 for ( m = 0; m < level + 2; m++, pos++ ) {
2264 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2265 for ( m = 0; m < level + 2; m++, pos++ ) {
2271 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2272 for ( m = 0; m < level + 2; m++, pos++ ) {
2273 matrix_3d(fine_hexa->
fine_id, level + 1, n, m) = tmp_array [ 0 + 3 ] [ pos ];
2274 matrix_3d(fine_hexa->
fine_id, m, level + 1, n) = tmp_array [ 2 + 3 ] [ pos ];
2275 matrix_3d(fine_hexa->
fine_id, n, m, level + 1) = tmp_array [ 1 + 3 ] [ pos ];
2280 for ( k = 1; k < level + 1; k++ ) {
2281 for ( n = 1; n < level + 1; n++ ) {
2282 for ( m = 1; m < level + 1; m++ ) {
2290 fe_hexa = fe_hexa_array;
2291 tmp_hexa = tmp_hexa_array;
2292 for ( i = 0; i < fe_hexas; i++, fe_hexa++, tmp_hexa++, fine_node++ ) {
2293 fine_node->
id = ++fine_node_id;
2295 for ( j = 0; j < 6; j++ ) {
2297 for ( k = 1; k < level + 1; k++ ) {
2298 tmp_array_cen [ j ] [ k ] = ++refine_node_id;
2301 tmp_array_cen [ j ] [ level + 1 ] = fine_node->
id;
2308 for ( j = 0; j < 6; j++ ) {
2309 mesh_quad = mesh_qd [ j ] = tmp_hexa->
quad [ j ];
2310 for ( k = 0; k < 4; k++ ) {
2311 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ hexa_fc_nd [ j ] [ 0 ] ] ) {
2312 if ( ( kk = k + 1 ) == 4 ) {
2316 if ( mesh_quad->
node [ kk ] == fe_hexa->
node [ hexa_fc_nd [ j ] [ 1 ] ] ) {
2331 for ( j = 0; j < 4; j++ ) {
2334 p = ( level + 2 ) * ( level + 1 );
2335 mesh_quad = mesh_qd [ 0 ];
2336 #pragma GCC diagnostic push
2338 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
2339 for ( k = 0; k < 4; k++ ) {
2340 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j ] ) {
2341 if ( swap [ 0 ] == 1 ) {
2344 if ( ( kk = k + 1 ) == 4 ) {
2352 #pragma GCC diagnostic pop
2354 for ( m = 0; m < level + 2; m++ ) {
2355 tmp_array [ j ] [ pos++ ] = mesh_quad->
fine_id [ kk ] [ p++ ];
2359 p = ( level + 2 ) * ( level + 1 );
2360 mesh_quad = mesh_qd [ j + 1 ];
2361 for ( k = 0; k < 4; k++ ) {
2362 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j ] ) {
2363 if ( swap [ j + 1 ] == 1 ) {
2366 if ( ( kk = k + 1 ) == 4 ) {
2375 for ( n = 1; n < level + 1; n++ ) {
2376 tmp_array [ j ] [ pos++ ] = mesh_quad->
fine_id [ kk ] [ ++p ];
2377 for ( m = 0; m < level; m++ ) {
2378 tmp_array [ j ] [ pos++ ] = ++refine_node_id;
2381 tmp_array [ j ] [ pos++ ] = tmp_array_cen [ 0 ] [ n ];
2385 for ( m = 0; m < level + 2; m++ ) {
2386 tmp_array [ j ] [ pos++ ] = tmp_array_cen [ j + 1 ] [ m ];
2394 for ( j = 0; j < 4; j++ ) {
2397 p = ( level + 2 ) * ( level + 1 );
2398 mesh_quad = mesh_qd [ 5 ];
2399 #pragma GCC diagnostic push
2401 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
2402 for ( k = 0; k < 4; k++ ) {
2403 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j + 4 ] ) {
2404 if ( swap [ 5 ] == 0 ) {
2407 if ( ( kk = k + 1 ) == 4 ) {
2415 #pragma GCC diagnostic pop
2417 for ( m = 0; m < level + 2; m++ ) {
2418 tmp_array [ j + 4 ] [ pos++ ] = mesh_quad->
fine_id [ kk ] [ p++ ];
2422 p = ( level + 2 ) * ( level + 1 );
2423 mesh_quad = mesh_qd [ j + 1 ];
2424 for ( k = 0; k < 4; k++ ) {
2425 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j + 4 ] ) {
2426 if ( swap [ j + 1 ] == 0 ) {
2429 if ( ( kk = k + 1 ) == 4 ) {
2438 for ( n = 1; n < level + 1; n++ ) {
2439 tmp_array [ j + 4 ] [ pos++ ] = mesh_quad->
fine_id [ kk ] [ ++p ];
2440 for ( m = 0; m < level; m++ ) {
2441 tmp_array [ j + 4 ] [ pos++ ] = ++refine_node_id;
2444 tmp_array [ j + 4 ] [ pos++ ] = tmp_array_cen [ 5 ] [ n ];
2448 for ( m = 0; m < level + 2; m++ ) {
2449 tmp_array [ j + 4 ] [ pos++ ] = tmp_array_cen [ j + 1 ] [ m ];
2456 for ( j = 0; j < 4; j++ ) {
2459 p = ( level + 2 ) * ( level + 1 );
2460 mesh_quad = mesh_qd [ j + 1 ];
2461 for ( k = 0; k < 4; k++ ) {
2462 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j + 4 ] ) {
2463 if ( swap [ j + 1 ] == 1 ) {
2466 if ( ( kk = k + 1 ) == 4 ) {
2475 for ( m = 0; m < level + 2; m++ ) {
2476 tmp_array [ j + 8 ] [ pos++ ] = mesh_quad->
fine_id [ kk ] [ p++ ];
2479 if ( ( jj = j ) == 0 ) {
2484 p = ( level + 2 ) * ( level + 1 );
2485 mesh_quad = mesh_qd [ jj ];
2486 for ( k = 0; k < 4; k++ ) {
2487 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j ] ) {
2488 if ( swap [ jj ] == 1 ) {
2491 if ( ( kk = k + 1 ) == 4 ) {
2500 for ( n = 1; n < level + 1; n++ ) {
2501 tmp_array [ j + 8 ] [ pos++ ] = mesh_quad->
fine_id [ kk ] [ ++p ];
2502 for ( m = 0; m < level; m++ ) {
2503 tmp_array [ j + 8 ] [ pos++ ] = ++refine_node_id;
2506 tmp_array [ j + 8 ] [ pos++ ] = tmp_array_cen [ j + 1 ] [ n ];
2510 for ( m = 0; m < level + 2; m++ ) {
2511 tmp_array [ j + 8 ] [ pos++ ] = tmp_array_cen [ jj ] [ m ];
2528 for ( j = 0; j < 4; j++ ) {
2529 fine_hexa = & ( fine_hexa_array [ fine_hexa_id++ ] );
2530 if ( ( fine_hexa->
fine_id = (
int * ) calloc( ( level + 2 ) * ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
2534 mesh_quad = mesh_qd [ 0 ];
2535 for ( k = 0; k < 4; k++ ) {
2536 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j ] ) {
2541 if ( swap [ 0 ] == 1 ) {
2542 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2543 for ( m = 0; m < level + 2; m++, pos++ ) {
2548 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2549 for ( m = 0; m < level + 2; m++, pos++ ) {
2555 mesh_quad = mesh_qd [ j + 1 ];
2556 for ( k = 0; k < 4; k++ ) {
2557 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j ] ) {
2562 if ( swap [ j + 1 ] == 1 ) {
2563 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2564 for ( m = 0; m < level + 2; m++, pos++ ) {
2569 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2570 for ( m = 0; m < level + 2; m++, pos++ ) {
2576 if ( ( jj = j ) == 0 ) {
2580 mesh_quad = mesh_qd [ jj ];
2581 for ( k = 0; k < 4; k++ ) {
2582 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j ] ) {
2587 if ( swap [ jj ] == 1 ) {
2588 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2589 for ( m = 0; m < level + 2; m++, pos++ ) {
2594 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2595 for ( m = 0; m < level + 2; m++, pos++ ) {
2601 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2602 for ( m = 0; m < level + 2; m++, pos++ ) {
2604 matrix_3d(fine_hexa->
fine_id, m, level + 1, n) = tmp_array [ jj - 1 ] [ pos ];
2605 matrix_3d(fine_hexa->
fine_id, m, n, level + 1) = tmp_array [ j + 8 ] [ pos ];
2610 for ( k = 1; k < level + 1; k++ ) {
2611 for ( n = 1; n < level + 1; n++ ) {
2612 for ( m = 1; m < level + 1; m++ ) {
2622 for ( j = 0; j < 4; j++ ) {
2623 fine_hexa = & ( fine_hexa_array [ fine_hexa_id++ ] );
2624 if ( ( fine_hexa->
fine_id = (
int * ) calloc( ( level + 2 ) * ( level + 2 ) * ( level + 2 ),
sizeof(
int ) ) ) == NULL ) {
2628 mesh_quad = mesh_qd [ 5 ];
2629 for ( k = 0; k < 4; k++ ) {
2630 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j + 4 ] ) {
2635 if ( swap [ 5 ] == 1 ) {
2636 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2637 for ( m = 0; m < level + 2; m++, pos++ ) {
2642 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2643 for ( m = 0; m < level + 2; m++, pos++ ) {
2649 mesh_quad = mesh_qd [ j + 1 ];
2650 for ( k = 0; k < 4; k++ ) {
2651 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j + 4 ] ) {
2656 if ( swap [ j + 1 ] == 1 ) {
2657 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2658 for ( m = 0; m < level + 2; m++, pos++ ) {
2663 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2664 for ( m = 0; m < level + 2; m++, pos++ ) {
2670 if ( ( jj = j ) == 0 ) {
2674 mesh_quad = mesh_qd [ jj ];
2675 for ( k = 0; k < 4; k++ ) {
2676 if ( mesh_quad->
node [ k ] == fe_hexa->
node [ j + 4 ] ) {
2681 if ( swap [ jj ] == 1 ) {
2682 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2683 for ( m = 0; m < level + 2; m++, pos++ ) {
2688 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2689 for ( m = 0; m < level + 2; m++, pos++ ) {
2695 for ( pos = 0, n = 0; n < level + 2; n++ ) {
2696 for ( m = 0; m < level + 2; m++, pos++ ) {
2697 matrix_3d(fine_hexa->
fine_id, level + 1, m, n) = tmp_array [ jj - 1 + 4 ] [ pos ];
2698 matrix_3d(fine_hexa->
fine_id, m, level + 1, n) = tmp_array [ j + 4 ] [ pos ];
2699 matrix_3d(fine_hexa->
fine_id, n, m, level + 1) = tmp_array [ j + 8 ] [ pos ];
2704 for ( k = 1; k < level + 1; k++ ) {
2705 for ( n = 1; n < level + 1; n++ ) {
2706 for ( m = 1; m < level + 1; m++ ) {
2715 for ( j = 0; j < 6; j++ ) {
2716 free(tmp_array_cen [ j ]);
2717 free(tmp_array [ j ]);
2718 free(tmp_array [ j + 6 ]);
2721 if ( fe_node_array != NULL ) {
2722 free(fe_node_array);
2725 if ( fe_edge_array != NULL ) {
2726 free(fe_edge_array);
2729 if ( fe_face_array != NULL ) {
2730 free(fe_face_array);
2733 if ( fe_quad_array != NULL ) {
2734 free(fe_quad_array);
2737 if ( fe_tetra_array != NULL ) {
2738 free(fe_tetra_array);
2741 if ( fe_hexa_array != NULL ) {
2742 free(fe_hexa_array);
2745 mesh_face = mesh_face_array;
2746 for ( i = 0; i < mesh_faces; i++, mesh_face++ ) {
2747 for ( j = 0; j < 3; j++ ) {
2748 if ( mesh_face->
fine_id [ j ] != NULL ) {
2749 free(mesh_face->
fine_id [ j ]);
2754 mesh_quad = mesh_quad_array;
2755 for ( i = 0; i < mesh_quads; i++, mesh_quad++ ) {
2756 for ( j = 0; j < 4; j++ ) {
2757 if ( mesh_quad->
fine_id [ j ] != NULL ) {
2758 free(mesh_quad->
fine_id [ j ]);
2763 if ( mesh_face_array != NULL ) {
2764 free(mesh_face_array);
2767 if ( mesh_quad_array != NULL ) {
2768 free(mesh_quad_array);
2820 if ( fine_node_array != NULL ) {
2821 free(fine_node_array);
2828 edge_id = face_id = quad_id = tetra_id = hexa_id = 0;
2829 for ( i = 0; i < fe_elems; i++ ) {
2837 fine_edge = & ( fine_edge_array [ pos ] );
2838 for ( j = 0; j < 2; j++, fine_edge++ ) {
2840 connectivity->
resize(level + 2);
2841 for ( k = 0; k < level + 2; k++ ) {
2842 connectivity->
at(k + 1) = fine_edge->
fine_id [ k ];
2846 for ( j = 0; j < 2; j++ ) {
2852 node = ( & ( fine_edge_array [ pos + j ] ) )->fine_id [ 0 ];
2853 if ( node_num_elems [ node ] - node_num_elems [ node - 1 ] == 1 ) {
2854 boundary->at(j + 1) = 1;
2856 boundary->at(j + 1) = 0;
2863 case EGT_triangle_1:
2865 fine_quad = & ( fine_quad_array [ pos ] );
2866 for ( j = 0; j < 3; j++, fine_quad++ ) {
2868 connectivity->
resize( ( level + 2 ) * ( level + 2 ) );
2869 for ( k = 0; k < ( level + 2 ) * ( level + 2 ); k++ ) {
2870 connectivity->
at(k + 1) = fine_quad->
fine_id [ k ];
2878 for ( j = 0; j < 3; j++ ) {
2879 boundary->at(j + 1) = 1;
2881 j1 = face_ed_nd [ j ] [ 0 ];
2882 j2 = face_ed_nd [ j ] [ 1 ];
2890 node1 = ( & ( fine_quad_array [ pos + j1 ] ) )->fine_id [ 0 ];
2891 node2 = ( & ( fine_quad_array [ pos + j2 ] ) )->fine_id [ 0 ];
2894 for ( k = node_num_elems [ node1 - 1 ]; k < node_num_elems [ node1 ]; k++ ) {
2895 elem2 = node_con_elems [ k ];
2896 if ( elem2 == elem1 ) {
2901 for ( m = node_num_elems [ node2 - 1 ]; m < node_num_elems [ node2 ]; m++ ) {
2902 if ( elem2 == node_con_elems [ m ] ) {
2903 boundary->at(j + 1) = flag = 0;
2919 pos = fe_faces * 3 + quad_id * 4;
2920 fine_quad = & ( fine_quad_array [ pos ] );
2921 for ( j = 0; j < 4; j++, fine_quad++ ) {
2923 connectivity->
resize( ( level + 2 ) * ( level + 2 ) );
2924 for ( k = 0; k < ( level + 2 ) * ( level + 2 ); k++ ) {
2925 connectivity->
at(k + 1) = fine_quad->
fine_id [ k ];
2933 for ( j = 0; j < 4; j++ ) {
2934 boundary->at(j + 1) = 1;
2936 j1 = quad_ed_nd [ j ] [ 0 ];
2937 j2 = quad_ed_nd [ j ] [ 1 ];
2945 node1 = ( & ( fine_quad_array [ pos + j1 ] ) )->fine_id [ 0 ];
2946 node2 = ( & ( fine_quad_array [ pos + j2 ] ) )->fine_id [ 0 ];
2949 for ( k = node_num_elems [ node1 - 1 ]; k < node_num_elems [ node1 ]; k++ ) {
2950 elem2 = node_con_elems [ k ];
2951 if ( elem2 == elem1 ) {
2956 for ( m = node_num_elems [ node2 - 1 ]; m < node_num_elems [ node2 ]; m++ ) {
2957 if ( elem2 == node_con_elems [ m ] ) {
2958 boundary->at(j + 1) = flag = 0;
2975 fine_hexa = & ( fine_hexa_array [ pos ] );
2976 for ( j = 0; j < 4; j++, fine_hexa++ ) {
2978 connectivity->
resize( ( level + 2 ) * ( level + 2 ) * ( level + 2 ) );
2979 for ( k = 0; k < ( level + 2 ) * ( level + 2 ) * ( level + 2 ); k++ ) {
2980 connectivity->
at(k + 1) = fine_hexa->
fine_id [ k ];
2984 tmp_tetra = & ( tmp_tetra_array [ tetra_id ] );
2985 for ( j = 0; j < 4; j++ ) {
2987 boundary->at(j + 1) = 0;
2989 boundary->at(j + 1) = 1;
2997 pos = fe_tetras * 4 + hexa_id * 8;
2998 fine_hexa = & ( fine_hexa_array [ pos ] );
2999 for ( j = 0; j < 8; j++, fine_hexa++ ) {
3001 connectivity->
resize( ( level + 2 ) * ( level + 2 ) * ( level + 2 ) );
3002 for ( k = 0; k < ( level + 2 ) * ( level + 2 ) * ( level + 2 ); k++ ) {
3003 connectivity->
at(k + 1) = fine_hexa->
fine_id [ k ];
3007 tmp_hexa = & ( tmp_hexa_array [ hexa_id ] );
3008 for ( j = 0; j < 6; j++ ) {
3010 boundary->at(j + 1) = 0;
3012 boundary->at(j + 1) = 1;
3027 if ( node_num_elems != NULL ) {
3028 free(node_num_elems);
3031 if ( node_con_elems != NULL ) {
3032 free(node_con_elems);
3035 if ( tmp_tetra_array != NULL ) {
3036 free(tmp_tetra_array);
3039 if ( tmp_hexa_array != NULL ) {
3040 free(tmp_hexa_array);
3043 fine_edge = fine_edge_array;
3044 for ( i = 0; i < fine_edges; i++, fine_edge++ ) {
3045 if ( fine_edge->
fine_id != NULL ) {
3050 fine_quad = fine_quad_array;
3051 for ( i = 0; i < fine_quads; i++, fine_quad++ ) {
3052 if ( fine_quad->
fine_id != NULL ) {
3057 fine_hexa = fine_hexa_array;
3058 for ( i = 0; i < fine_hexas; i++, fine_hexa++ ) {
3059 if ( fine_hexa->
fine_id != NULL ) {
3064 if ( fine_edge_array != NULL ) {
3065 free(fine_edge_array);
3068 if ( fine_quad_array != NULL ) {
3069 free(fine_quad_array);
3072 if ( fine_hexa_array != NULL ) {
3073 free(fine_hexa_array);
3076 this->
nodes = fe_nodes + fine_nodes + refine_nodes;
3077 this->
edges = fine_edges * ( level + 1 );
3078 this->
quads = fine_quads * ( level + 1 ) * ( level + 1 );
3079 this->
hexas = fine_hexas * ( level + 1 ) * ( level + 1 ) * ( level + 1 );