21 #ifdef HECMW_WITH_REFINER
23 #include "rcapRefiner.h"
30 static const int *get_enode_h2r(
int etype,
int *ierror) {
32 static const int enode_pyr_h2r[13] = {4, 0, 1, 2, 3, 9, 10,
34 static const int enode_rod2_h2r[3] = {0, 2, 1};
73 enode_h2r = enode_pyr_h2r;
77 enode_h2r = enode_rod2_h2r;
81 "Element type %d not supported for rerinement.\n", etype);
89 static const int *get_enode_r2h(
int etype,
int *ierror) {
91 static const int enode_pyr_r2h[13] = {1, 2, 3, 4, 0, 9, 10,
93 static const int enode_rod2_r2h[3] = {0, 2, 1};
132 enode_r2h = enode_pyr_r2h;
136 enode_r2h = enode_rod2_r2h;
140 "Element type %d not supported for refinement.\n", etype);
150 const int *enode_h2r;
152 int nn, istart, iend;
157 enode_h2r = get_enode_h2r(etype, &ierror);
159 if (enode_h2r ==
NULL)
continue;
163 for (j = istart; j < iend; j++) {
165 for (j = 0; j < nn; j++) temp_enode[j] = enode[enode_h2r[j]];
166 for (j = 0; j < nn; j++) enode[j] = temp_enode[j];
175 const int *enode_r2h;
177 int nn, istart, iend;
182 enode_r2h = get_enode_r2h(etype, &ierror);
184 if (enode_r2h ==
NULL)
continue;
188 for (j = istart; j < iend; j++) {
190 for (j = 0; j < nn; j++) temp_enode[j] = enode[enode_r2h[j]];
191 for (j = 0; j < nn; j++) enode[j] = temp_enode[j];
202 static const int *get_sid_h2r(
int etype,
int *ierror) {
213 static const int sid_tri_h2r[4] = {-1, 2, 0, 1};
214 static const int sid_qua_h2r[5] = {-1, 0, 1, 2, 3};
215 static const int sid_tet_h2r[5] = {-1, 3, 2, 0, 1};
216 static const int sid_pri_h2r[6] = {-1, 0, 1, 2, 3, 4};
217 static const int sid_hex_h2r[7] = {-1, 0, 1, 2, 3, 4, 5};
218 static const int sid_pyr_h2r[6] = {-1, 3, 1,
226 sid_h2r = sid_tri_h2r;
230 sid_h2r = sid_qua_h2r;
235 sid_h2r = sid_tet_h2r;
239 sid_h2r = sid_pri_h2r;
244 sid_h2r = sid_hex_h2r;
248 sid_h2r = sid_pyr_h2r;
264 "Element type %d not supported for refinement.\n", etype);
271 static const int *get_sid_r2h(
int etype,
int *ierror) {
282 static const int sid_tri_r2h[3] = {2, 3, 1};
283 static const int sid_qua_r2h[4] = {1, 2, 3, 4};
284 static const int sid_tet_r2h[4] = {3, 4, 2, 1};
285 static const int sid_pri_r2h[5] = {1, 2, 3, 4, 5};
286 static const int sid_hex_r2h[6] = {1, 2, 3, 4, 5, 6};
287 static const int sid_pyr_r2h[5] = {3, 2, 4, 1,
295 sid_r2h = sid_tri_r2h;
299 sid_r2h = sid_qua_r2h;
304 sid_r2h = sid_tet_r2h;
308 sid_r2h = sid_pri_r2h;
313 sid_r2h = sid_hex_r2h;
317 sid_r2h = sid_pyr_r2h;
333 "Element type %d not supported for refinement.\n", etype);
348 int *sid_p = &(grp->
grp_item[2 * i + 1]);
356 if (sid_h2r) *sid_p = sid_h2r[*sid_p];
369 int *sid_p = &(grp->
grp_item[2 * i + 1]);
377 if (sid_r2h) *sid_p = sid_r2h[*sid_p];
393 static int get_elem_ndiv(
int etype,
int *ierror) {
409 "Element type %d not supported for refinement.\n", etype);
430 fp_dump = fopen(fname,
"w");
431 if (fp_dump ==
NULL) {
432 fprintf(stderr,
"Error: cannot open file %s\n", fname);
453 for (i = 1; i < grp->
n_grp; i++) {
457 sprintf(rcap_name,
"NG_%s", grp->
grp_name[i]);
465 fp_dump = fopen(fname,
"w");
466 if (fp_dump ==
NULL) {
467 fprintf(stderr,
"Error: cannot open file %s\n", fname);
469 int len = strlen(rcap_name);
471 fwrite(&len,
sizeof(
int), 1, fp_dump);
472 fwrite(rcap_name,
sizeof(
char), len, fp_dump);
473 fwrite(&num,
sizeof(
int), 1, fp_dump);
474 fwrite(array,
sizeof(
int), num, fp_dump);
479 rcapAppendNodeGroup(rcap_name, num, array);
490 for (i = 0; i < grp->
n_grp; i++) {
493 int *array = grp->
grp_item + start * 2;
497 for (j = 0; j < num; j++) {
498 int elem = array[j * 2];
499 int surf = array[j * 2 + 1];
511 sprintf(rcap_name,
"SG_%s", grp->
grp_name[i]);
521 fp_dump = fopen(fname,
"w");
522 if (fp_dump ==
NULL) {
523 fprintf(stderr,
"Error: cannot open file %s\n", fname);
525 int len = strlen(rcap_name);
526 HECMW_log(
HECMW_LOG_DEBUG,
"RCAP: writing strlen(dataname), dataname[], num, faceArray[0..2*num-1] to %s\n", fname);
527 fwrite(&len,
sizeof(
int), 1, fp_dump);
528 fwrite(rcap_name,
sizeof(
char), len, fp_dump);
529 fwrite(&num,
sizeof(
int), 1, fp_dump);
530 fwrite(array,
sizeof(
int), num*2, fp_dump);
535 rcapAppendFaceGroup(rcap_name, num, array);
543 const char *cad_filename,
544 const char *part_filename) {
553 rcapInitRefiner(1, 1);
554 if (cad_filename !=
NULL) {
558 rcapSetCADFilename(cad_filename);
560 if (part_filename !=
NULL) {
564 rcapSetPartitionFilename(part_filename);
580 static void clear_refiner(
void) {
602 static int elem_type_hecmw2rcap(
int etype) {
607 return RCAP_SEGMENT2;
609 return RCAP_TRIANGLE;
611 return RCAP_TRIANGLE2;
619 return RCAP_TETRAHEDRON;
621 return RCAP_TETRAHEDRON;
623 return RCAP_TETRAHEDRON2;
631 return RCAP_PYRAMID2;
633 return RCAP_HEXAHEDRON;
635 return RCAP_HEXAHEDRON;
637 return RCAP_HEXAHEDRON2;
641 return RCAP_SEGMENT2;
645 return RCAP_TRIANGLE;
647 return RCAP_TRIANGLE2;
649 return RCAP_TRIANGLE;
657 return RCAP_TRIANGLE;
659 return RCAP_TRIANGLE2;
665 return RCAP_UNKNOWNTYPE;
668 static int reorder_enode_33struct(
int etype,
int n_elem,
669 int *elem_node_item_ref) {
670 int nn, nn_2, ndiv, nn_tot, ierror;
673 int *enode1, *enode2;
676 ndiv = get_elem_ndiv(etype, &ierror);
679 enode1 = elem_node_item_ref;
680 enode2 = enode1 + nn_2 * ndiv;
681 for (j = 0; j < n_elem; j++) {
684 for (k = 0; k < ndiv; k++) {
685 for (l = 0; l < nn_2; l++) {
686 tmp_p[l] = enode1[l];
687 tmp_p[nn_2 + l] = enode2[l];
693 for (k = 0; k < nn_tot; k++) {
696 enode1 += nn_2 * ndiv;
697 enode2 += nn_2 * ndiv;
706 size_t n_enode_ref_tot;
707 int *elem_node_index_ref;
708 int *elem_node_item_ref;
718 int etype, istart, iend, n_elem, etype_rcap, nn;
724 n_elem = iend - istart;
729 if (is33) n_elem *= 2;
730 etype_rcap = elem_type_hecmw2rcap(etype);
735 HECMW_log(
HECMW_LOG_DEBUG,
"RCAP: calling rcapRefineElement(num=%d, etype=%d, nodeArray, NULL)\n", n_elem, etype_rcap);
740 fp_dump = fopen(fname,
"w");
741 if (fp_dump ==
NULL) {
742 fprintf(stderr,
"Error: cannot open file %s\n", fname);
746 fwrite(&n_elem,
sizeof(
int), 1, fp_dump);
747 fwrite(&etype_rcap,
sizeof(
int), 1, fp_dump);
748 fwrite(elem_node_item,
sizeof(
int), nn * n_elem, fp_dump);
753 n_elem_ref = rcapRefineElement(n_elem, etype_rcap, elem_node_item,
NULL);
765 ndiv = get_elem_ndiv(etype, &ierror);
770 n_elem_ref_tot += n_elem_ref;
772 n_enode_ref_tot += n_elem_ref * nn;
782 (
int *)
HECMW_malloc(
sizeof(
int) * (n_elem_ref_tot + 1));
803 int etype, istart, iend, n_elem, etype_rcap, n_elem_ref, nn, jstart;
808 n_elem = iend - istart;
812 for (j = 0; j < n_elem * nn; j++) {
820 if (is33) n_elem *= 2;
821 etype_rcap = elem_type_hecmw2rcap(etype);
825 HECMW_log(
HECMW_LOG_DEBUG,
"RCAP: calling rcapRefineElement(num=%d, etype=%d, nodeArray, resultNodeArray)\n", n_elem, etype_rcap);
827 n_elem_ref = rcapRefineElement(n_elem, etype_rcap, elem_node_item,
834 fp_dump = fopen(fname,
"w");
835 if (fp_dump ==
NULL) {
836 fprintf(stderr,
"Error: cannot open file %s\n", fname);
840 "RCAP: writing num, etype, nodeArray[0..%d*num-1], num_ref, resultNodeArray[0..%d*num_ref-1] to %s\n",
842 fwrite(&n_elem,
sizeof(
int), 1, fp_dump);
843 fwrite(&etype_rcap,
sizeof(
int), 1, fp_dump);
844 fwrite(elem_node_item,
sizeof(
int), nn * n_elem, fp_dump);
845 fwrite(&n_elem_ref,
sizeof(
int), 1, fp_dump);
846 fwrite(elem_node_item_ref,
sizeof(
int), nn * n_elem_ref, fp_dump);
855 reorder_enode_33struct(etype, n_elem, elem_node_item_ref);
858 for (j = 0; j < n_elem_ref; j++) {
859 elem_node_index_ref[j + 1] = elem_node_index_ref[j] + nn;
860 if (elem_node_index_ref[j + 1] < elem_node_index_ref[j]) {
862 "Integer overflow detected while creating elem_node_index\n");
866 elem_node_index_ref += n_elem_ref;
867 elem_node_item_ref += nn * n_elem_ref;
868 n_elem_ref_tot += n_elem_ref;
913 fp_dump = fopen(fname,
"w");
914 if (fp_dump ==
NULL) {
915 fprintf(stderr,
"Error: cannot open file %s\n", fname);
919 fwrite(&(ref_mesh->
n_node_gross),
sizeof(
int), 1, fp_dump);
920 fwrite(&one,
sizeof(
int), 1, fp_dump);
932 int ref_n_node_gross) {
951 for (i = 1; i < grp->
n_grp; i++) {
967 ref_grp->
grp_index[1] = ref_n_node_gross;
969 for (i = 1; i < grp->
n_grp; i++) {
970 sprintf(rcap_name,
"NG_%s", grp->
grp_name[i]);
972 ref_grp->
grp_index[i] + rcapGetNodeGroupCount(rcap_name);
984 for (i = 0; i < ref_n_node_gross; i++) {
988 for (i = 1; i < grp->
n_grp; i++) {
990 int num = ref_grp->
grp_index[i + 1] - start;
992 int *array = ref_grp->
grp_item + start;
993 sprintf(rcap_name,
"NG_%s", grp->
grp_name[i]);
994 rcapGetNodeGroup(rcap_name, num, array);
1008 int n_elem,
int *elem_list) {
1009 int i, eid, etype, ierror, ndiv;
1011 for (i = 0; i < n_elem; i++) {
1015 ndiv = get_elem_ndiv(etype, &ierror);
1016 if (ierror)
return -1;
1025 int i, etype, ierror, ndiv;
1026 int etype_idx, eid_type;
1034 ndiv = get_elem_ndiv(etype, &ierror);
1035 if (ierror)
return -1;
1050 offset = ref_mesh->
elem_type_index[etype_idx] + (eid_type - 1) * ndiv + 1;
1051 for (i = 0; i < ndiv; i++) {
1052 eid_ref[i] = offset + i;
1059 int n_elem,
int *elem_list,
1060 int *elem_list_ref) {
1062 int eid_ref[NDIV_MAX];
1063 int *el_ref = elem_list_ref;
1065 for (i = 0; i < n_elem; i++) {
1066 int ndiv = get_refined_elements(mesh, ref_mesh, elem_list[i], eid_ref);
1067 if (ndiv < 0)
return -1;
1068 for (j = 0; j < ndiv; j++) {
1069 el_ref[j] = eid_ref[j];
1104 for (i = 1; i < grp->
n_grp; i++) {
1120 ref_grp->
grp_index[1] = ref_n_elem_gross;
1122 for (i = 1; i < grp->
n_grp; i++) {
1123 int start, n_elem, n_elem_ref;
1128 n_elem_ref = get_refined_element_count(mesh, n_elem, elem_list);
1142 for (i = 0; i < ref_n_elem_gross; i++) {
1146 for (i = 1; i < grp->
n_grp; i++) {
1147 int start, start_ref, n_elem, n_elem_ref, ret;
1148 int *elem_list, *elem_list_ref;
1150 n_elem_ref = ref_grp->
grp_index[i + 1] - start_ref;
1152 if (n_elem_ref == 0)
continue;
1156 elem_list_ref = ref_grp->
grp_item + start_ref;
1157 ret = get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list,
1188 for (i = 0; i < grp->
n_grp; i++) {
1203 for (i = 0; i < grp->
n_grp; i++) {
1205 int num = grp->
grp_index[i + 1] - start;
1206 int *array = grp->
grp_item + start * 2;
1207 int num_sh, num_other;
1210 sprintf(rcap_name,
"SG_%s", grp->
grp_name[i]);
1211 num_other = rcapGetFaceGroupCount(rcap_name);
1215 for (j = 0; j < num; j++) {
1216 int elem = array[j * 2];
1221 num_sh *= NDIV_SURF;
1238 for (i = 0; i < grp->
n_grp; i++) {
1240 int start, num_tot, n_elem, ret;
1241 int start_ref, num_ref, num_tot_ref, n_elem_ref;
1242 int *array, *array_ref, *elem_list, *elem_list_ref;
1245 num_tot_ref = ref_grp->
grp_index[i + 1] - start_ref;
1246 if (num_tot_ref == 0)
continue;
1247 array_ref = ref_grp->
grp_item + start_ref * 2;
1250 sprintf(rcap_name,
"SG_%s", grp->
grp_name[i]);
1251 num_ref = rcapGetFaceGroupCount(rcap_name);
1252 rcapGetFaceGroup(rcap_name, num_ref, array_ref);
1254 num_tot_ref -= num_ref;
1255 if (num_tot_ref == 0)
continue;
1256 array_ref += num_ref * 2;
1267 num_tot = grp->
grp_index[i + 1] - start;
1269 for (j = 0; j < num_tot; j++) {
1270 int elem, etype, surf;
1271 elem = array[j * 2];
1272 surf = array[j * 2 + 1];
1289 n_elem_ref = n_elem * NDIV_SURF;
1290 elem_list_ref = (
int *)
HECMW_calloc(n_elem_ref,
sizeof(
int));
1291 if (elem_list_ref ==
NULL) {
1295 ret = get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list, elem_list_ref);
1297 for (j = 0; j < n_elem_ref; j++) {
1298 array_ref[j * 2] = elem_list_ref[j];
1299 array_ref[j * 2 + 1] = 1;
1303 num_tot_ref -= n_elem_ref;
1304 array_ref += n_elem_ref * 2;
1311 n_elem_ref = n_elem * NDIV_SURF;
1312 elem_list_ref = (
int *)
HECMW_calloc(n_elem_ref,
sizeof(
int));
1313 if (elem_list_ref ==
NULL) {
1317 ret = get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list, elem_list_ref);
1319 for (j = 0; j < n_elem_ref; j++) {
1320 array_ref[j * 2] = elem_list_ref[j];
1321 array_ref[j * 2 + 1] = 2;
1325 num_tot_ref -= n_elem_ref;
1350 if (refine_elem_group_info(mesh, ref_mesh) !=
HECMW_SUCCESS) {
1353 if (refine_surf_group_info(mesh, ref_mesh) !=
HECMW_SUCCESS) {
1380 elem_ID_ref = ref_mesh->
elem_ID;
1382 int etype, istart, iend, n_elem, ierror, ndiv;
1386 n_elem = iend - istart;
1387 ndiv = get_elem_ndiv(etype, &ierror);
1390 for (j = 0; j < n_elem; j++) {
1391 int rank = elem_ID_org[1];
1392 for (k = 0; k < ndiv; k++) {
1394 elem_ID_ref[0] = -count;
1395 elem_ID_ref[1] = rank;
1408 int *global_elem_ID_org;
1409 int *global_elem_ID_ref;
1420 if (global_elem_ID_org[i] < min_ID)
1421 min_ID = global_elem_ID_org[i];
1425 int etype, istart, iend, n_elem, ierror, ndiv;
1429 n_elem = iend - istart;
1430 ndiv = get_elem_ndiv(etype, &ierror);
1433 for (j = 0; j < n_elem; j++) {
1434 global_elem_ID_ref[0] = global_elem_ID_org[0];
1435 for (k = 1; k < ndiv; k++) {
1437 global_elem_ID_ref[k] = min_ID;
1439 global_elem_ID_org += 1;
1440 global_elem_ID_ref += ndiv;
1459 int etype, istart, iend, n_elem, ierror, ndiv;
1463 n_elem = iend - istart;
1464 ndiv = get_elem_ndiv(etype, &ierror);
1467 for (j = 0; j < n_elem; j++) {
1468 for (k = 0; k < ndiv; k++) {
1469 elem_type_ref[k] = etype;
1471 elem_type_ref += ndiv;
1480 int *section_ID_org;
1481 int *section_ID_ref;
1491 int etype, istart, iend, n_elem, ierror, ndiv;
1495 n_elem = iend - istart;
1496 ndiv = get_elem_ndiv(etype, &ierror);
1499 for (j = 0; j < n_elem; j++) {
1500 int sect_id = section_ID_org[0];
1501 for (k = 0; k < ndiv; k++) {
1502 section_ID_ref[k] = sect_id;
1504 section_ID_org += 1;
1505 section_ID_ref += ndiv;
1514 int *elem_mat_ID_index_org;
1515 int *elem_mat_ID_index_ref;
1527 int etype, istart, iend, n_elem, ierror, ndiv;
1531 n_elem = iend - istart;
1532 ndiv = get_elem_ndiv(etype, &ierror);
1535 for (j = 0; j < n_elem; j++) {
1536 int n = elem_mat_ID_index_org[1] - elem_mat_ID_index_org[0];
1537 for (k = 0; k < ndiv; k++) {
1538 elem_mat_ID_index_ref[k + 1] = elem_mat_ID_index_ref[k] + n;
1540 elem_mat_ID_index_org += 1;
1541 elem_mat_ID_index_ref += ndiv;
1550 int *elem_mat_ID_index_org;
1551 int *elem_mat_ID_item_org;
1552 int *elem_mat_ID_item_ref;
1564 int etype, istart, iend, n_elem, ierror, ndiv;
1568 n_elem = iend - istart;
1569 ndiv = get_elem_ndiv(etype, &ierror);
1572 for (j = 0; j < n_elem; j++) {
1573 int n = elem_mat_ID_index_org[1] - elem_mat_ID_index_org[0];
1574 for (k = 0; k < ndiv; k++) {
1575 for (l = 0; l < n; l++) {
1576 elem_mat_ID_item_ref[l] = elem_mat_ID_item_org[l];
1578 elem_mat_ID_item_ref += n;
1580 elem_mat_ID_index_org += 1;
1581 elem_mat_ID_item_org += n;
1592 if (rebuild_global_elem_ID(mesh, ref_mesh) !=
HECMW_SUCCESS)
1596 if (rebuild_elem_mat_ID_index(mesh, ref_mesh) !=
HECMW_SUCCESS)
1598 if (rebuild_elem_mat_ID_item(mesh, ref_mesh) !=
HECMW_SUCCESS)
1630 ref_mesh->
node_ID[2 * i] = -count;
1698 int start, n_elem, n_elem_ref, ret;
1699 int *elem_list, *elem_list_ref;
1703 n_elem_ref = get_refined_element_count(mesh, n_elem, elem_list);
1708 get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list, elem_list_ref);
1714 static int elem_type_rcap2hecmw(
int etype) {
1722 case RCAP_TRIANGLE2:
1728 case RCAP_TETRAHEDRON:
1730 case RCAP_TETRAHEDRON2:
1740 case RCAP_HEXAHEDRON:
1742 case RCAP_HEXAHEDRON2:
1748 static int get_rcap_elem_max_node(
int etype_rcap) {
1749 int etype_hecmw = elem_type_rcap2hecmw(etype_rcap);
1753 static int determine_node_rank_of_purely_external_elems(
1756 int eid, rank, nn, k, nid;
1760 rank = ref_mesh->
elem_ID[2 * (eid - 1) + 1];
1762 if (rank >= 0)
continue;
1766 for (k = 0; k < nn; k++) {
1767 nid = elem_nodes[k];
1768 if (nid <= mesh->n_node_gross)
continue;
1800 for (k = 0; k < nn; k++) {
1813 int orig_type_rcap = rcapGetOriginal(bnode, original);
1820 nn = get_rcap_elem_max_node(orig_type_rcap);
1822 for (k = 0; k < nn; k++) {
1827 rank = ref_mesh->
node_ID[2 * (original[k] - 1) + 1];
1831 if (rank < 0) rank = -rank - 1;
1833 if (rank < min_rank) min_rank = rank;
1834 if (max_rank < rank) max_rank = rank;
1836 HECMW_assert(0 <= min_rank && min_rank < mesh->n_subdomain);
1837 HECMW_assert(0 <= max_rank && max_rank < mesh->n_subdomain);
1841 ref_mesh->
node_ID[2 * (bnode - 1) + 1] = min_rank;
1843 ref_mesh->
node_ID[2 * (bnode - 1) + 1] = max_rank;
1850 if (determine_node_rank_of_purely_external_elems(mesh, ref_mesh) !=
HECMW_SUCCESS)
1857 static int *conv_index_ucd2hec(
int etype)
1859 static int conv_index_ucd2hec_rod1[] = {0, 1};
1860 static int conv_index_ucd2hec_rod2[] = {0, -1, 2};
1861 static int conv_index_ucd2hec_tri1[] = {0, 1, 2};
1862 static int conv_index_ucd2hec_tri2[] = {0, 1, 2, -1, -1, -1};
1863 static int conv_index_ucd2hec_qua1[] = {0, 1, 2, 3};
1864 static int conv_index_ucd2hec_qua2[] = {0, 1, 2, 3, -1, -1, -1, -1};
1865 static int conv_index_ucd2hec_tet1[] = {0, 3, 2, 1};
1866 static int conv_index_ucd2hec_tet2[] = {0, 3, 2, 1, -1, -1, -1, -1, -1, -1};
1867 static int conv_index_ucd2hec_pri1[] = {3, 4, 5, 0, 1, 2};
1868 static int conv_index_ucd2hec_pri2[] = {3, 4, 5, 0, 1, 2, -1, -1,
1869 -1, -1, -1, -1, -1, -1, -1};
1870 static int conv_index_ucd2hec_hex1[] = {4, 5, 6, 7, 0, 1, 2, 3};
1871 static int conv_index_ucd2hec_hex2[] = {4, 5, 6, 7, 0, 1, 2, 3, -1, -1,
1872 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
1873 static int conv_index_ucd2hec_pyr1[] = {4, 0, 1, 2, 3};
1874 static int conv_index_ucd2hec_pyr2[] = {4, 0, 1, 2, 3, -1, -1,
1875 -1, -1, -1, -1, -1, -1};
1876 static int conv_index_ucd2hec_mst1[] = {0, 1, 2, 3};
1877 static int conv_index_ucd2hec_mst2[] = {0, 1, 2, 3, -1, -1, -1, -1};
1878 static int conv_index_ucd2hec_msq1[] = {0, 1, 2, 3, 4};
1879 static int conv_index_ucd2hec_msq2[] = {0, 1, 2, 3, 4, -1, -1, -1, -1};
1880 static int conv_index_ucd2hec_jtt1[] = {3, 4, 5, 0, 1, 2};
1881 static int conv_index_ucd2hec_jtt2[] = {3, 4, 5, 0, 1, 2,
1882 -1, -1, -1, -1, -1, -1};
1883 static int conv_index_ucd2hec_jtq1[] = {4, 5, 6, 7, 0, 1, 2, 3};
1884 static int conv_index_ucd2hec_jtq2[] = {4, 5, 6, 7, 0, 1, 2, 3,
1885 -1, -1, -1, -1, -1, -1, -1, -1};
1887 static int conv_index_ucd2hec_bem1[] = {0, 1};
1888 static int conv_index_ucd2hec_bem2[] = {0, -1, 1};
1890 static int conv_index_ucd2hec_sht1[] = {0, 1, 2};
1891 static int conv_index_ucd2hec_sht2[] = {0, 1, 2, -1, -1, -1};
1892 static int conv_index_ucd2hec_shq1[] = {0, 1, 2, 3};
1893 static int conv_index_ucd2hec_shq2[] = {0, 1, 2, 3, -1, -1, -1, -1};
1894 static int conv_index_ucd2hec_ln[] = {0, 1};
1897 return conv_index_ucd2hec_rod1;
1899 return conv_index_ucd2hec_rod2;
1901 return conv_index_ucd2hec_tri1;
1903 return conv_index_ucd2hec_tri2;
1905 return conv_index_ucd2hec_qua1;
1907 return conv_index_ucd2hec_qua2;
1909 return conv_index_ucd2hec_tet1;
1911 return conv_index_ucd2hec_tet2;
1913 return conv_index_ucd2hec_pri1;
1915 return conv_index_ucd2hec_pri2;
1917 return conv_index_ucd2hec_hex1;
1919 return conv_index_ucd2hec_hex2;
1921 return conv_index_ucd2hec_pyr1;
1923 return conv_index_ucd2hec_pyr2;
1925 return conv_index_ucd2hec_mst1;
1927 return conv_index_ucd2hec_mst2;
1929 return conv_index_ucd2hec_msq1;
1931 return conv_index_ucd2hec_msq2;
1933 return conv_index_ucd2hec_jtt1;
1935 return conv_index_ucd2hec_jtt2;
1937 return conv_index_ucd2hec_jtq1;
1939 return conv_index_ucd2hec_jtq2;
1941 return conv_index_ucd2hec_sht1;
1943 return conv_index_ucd2hec_sht2;
1945 return conv_index_ucd2hec_shq1;
1947 return conv_index_ucd2hec_shq2;
1984 return conv_index_ucd2hec_ln;
1990 static void write_elem_with_mismatching_refinement(
const struct hecmwST_local_mesh *mesh,
2002 int n_shared_elem_node;
2003 int n_shared_elem_r;
2004 int n_shared_elem_node_r;
2005 int *shared_elem_node_index_l =
NULL;
2006 int *shared_elem_node_item_l =
NULL;
2007 int *shared_elem_node_index_r =
NULL;
2008 int *shared_elem_node_item_r =
NULL;
2013 n_shared_elem_node = 0;
2014 for (j = 0; j < n_shared_elem; j++) {
2018 for (k = 0; k < nn; k++) {
2019 nid = elem_nodes[k];
2021 for (l = 0; l < n_shared_node; l++) {
2026 n_shared_elem_node += nn;
2040 send_buf[0] = n_shared_elem;
2041 send_buf[1] = n_shared_elem_node;
2045 HECMW_Isend(shared_elem_node_index_l, n_shared_elem + 1,
HECMW_INT, irank, tag, comm, &requests[1]);
2047 HECMW_Isend(shared_elem_node_item_l, n_shared_elem_node,
HECMW_INT, irank, tag, comm, &requests[2]);
2054 n_shared_elem_r = recv_buf[0];
2055 n_shared_elem_node_r = recv_buf[1];
2057 shared_elem_node_index_r = (
int *)
HECMW_malloc(
sizeof(
int) * (n_shared_elem_r + 1));
2058 if (shared_elem_node_index_r ==
NULL) {
2062 shared_elem_node_item_r = (
int *)
HECMW_malloc(
sizeof(
int) * n_shared_elem_node_r);
2063 if (shared_elem_node_item_r ==
NULL) {
2069 HECMW_Recv(shared_elem_node_index_r, n_shared_elem_r + 1,
HECMW_INT, irank, tag, comm, &statuses[1]);
2071 HECMW_Recv(shared_elem_node_item_r, n_shared_elem_node_r,
HECMW_INT, irank, tag, comm, &statuses[2]);
2076 if (n_shared_elem != n_shared_elem_r) {
2080 for (j = 0; j < n_shared_elem; j++) {
2082 if (shared_elem_node_index_l[j+1] != shared_elem_node_index_r[j+1]) {
2086 for (k = shared_elem_node_index_l[j]; k < shared_elem_node_index_l[j+1]; k++) {
2087 if (shared_elem_node_item_l[k] != shared_elem_node_item_r[k]) {
2089 k - shared_elem_node_index_l[j] + 1, j+1);
2099 for (k = 0; k < nn; k++) {
2100 nid = elem_nodes[k];
2102 ref_mesh->
node[3*(nid-1)], ref_mesh->
node[3*(nid-1)+1], ref_mesh->
node[3*(nid-1)+2]);
2112 if (shared_elem_node_index_r !=
NULL)
HECMW_free(shared_elem_node_index_r);
2113 if (shared_elem_node_item_r !=
NULL)
HECMW_free(shared_elem_node_item_r);
2130 sprintf(fname,
"shared_%d_%d.inp",
mesh->
my_rank, irank);
2132 fp = fopen(fname,
"w");
2136 fprintf(fp,
"%d %d 1 1 0\n", n_shared_node, n_shared_elem);
2137 for (j = 0; j < n_shared_node; j++) {
2139 fprintf(fp,
"%d %e %e %e\n", j+1, ref_mesh->
node[3*(nid-1)], ref_mesh->
node[3*(nid-1)+1], ref_mesh->
node[3*(nid-1)+2]);
2141 for (j = 0; j < n_shared_elem; j++) {
2146 int *index_ucd = conv_index_ucd2hec(etype);
2149 for (k = 0; k < nn; k++) {
2150 if (index_ucd[k] < 0)
continue;
2151 nid = elem_nodes[index_ucd[k]];
2152 for (l = 0; l < n_shared_node; l++) {
2155 fprintf(fp,
" %d", l+1);
2167 int *n_shared_nodes;
2174 int n_error = 0, n_error_g;
2175 int i, j, k, irank, tag, nid, rank;
2181 if (n_shared_nodes ==
NULL) {
2188 if (shared_nodes ==
NULL) {
2195 if (shared_ranks ==
NULL) {
2201 if (send_buf ==
NULL) {
2209 if (requests ==
NULL) {
2215 if (statuses ==
NULL) {
2238 for (k = 0; k < nn; k++) {
2255 send_buf[4*i+3] = n_shared_nodes[i];
2269 if (recv_buf[0] != send_buf[4*i]) {
2271 "number of shared elements %d not match with %d in rank %d\n",
2272 send_buf[4*i], recv_buf[0], irank);
2275 if (recv_buf[1] != send_buf[4*i+1]) {
2277 "number of refined shared elements %d not match with %d in rank %d\n",
2278 send_buf[4*i+1], recv_buf[1], irank);
2280 if (recv_buf[2] != send_buf[4*i+2]) {
2282 "number of new shared nodes before rmdup %d not match with %d in rank %d\n",
2283 send_buf[4*i+2], recv_buf[2], irank);
2286 if (recv_buf[3] != send_buf[4*i+3]) {
2288 "number of new shared nodes %d not match with %d in rank %d\n",
2289 send_buf[4*i+3], recv_buf[3], irank);
2291 write_elem_with_mismatching_refinement(mesh, ref_mesh, shared, shared_nodes, i);
2292 write_refined_shared_in_ucd(mesh, ref_mesh, shared, shared_nodes, i);
2310 for (j = 0; j < n_shared_nodes[i]; j++) {
2312 rank = ref_mesh->
node_ID[2 * (nid - 1) + 1];
2325 int *recv_ranks = (
int *)
HECMW_malloc(
sizeof(
int) * n_shared_nodes[i]);
2326 if (recv_ranks ==
NULL) {
2335 for (j = 0; j < n_shared_nodes[i]; j++) {
2338 "rank of new shared node %d: %d not match with %d in rank %d\n",
2368 static int count_internal(
int my_rank,
int n,
int *ID) {
2370 for (i = 0; i < n; i++) {
2371 if (ID[2 * i + 1] == my_rank) {
2372 ID[2 * i] = ++count;
2378 static int count_purely_external(
int n,
int *ID) {
2380 for (i = 0; i < n; i++) {
2381 if (ID[2 * i + 1] < 0) {
2388 static int *new_internal_list(
int my_rank,
int n,
int n_internal,
int *ID) {
2392 internal_list = (
int *)
HECMW_malloc(
sizeof(
int) * n_internal);
2393 if (internal_list ==
NULL) {
2398 for (i = 0, k = 0; i < n; i++) {
2399 if (ID[2 * i + 1] == my_rank) {
2400 internal_list[k] = i + 1;
2404 return internal_list;
2408 int **index,
int **item) {
2413 if (*index ==
NULL) {
2418 for (i = 0; i < n; i++) {
2420 if ((*index)[i + 1] < (*index)[i]) {
2422 "Integer overflow detected while creating index array\n");
2428 if ((*index)[n] == 0) {
2432 *item = (
int *)
HECMW_malloc(
sizeof(
int) * (*index)[n]);
2433 if (*item ==
NULL) {
2438 for (i = 0; i < n; i++) {
2456 if (new_shared ==
NULL) {
2462 if (new_export ==
NULL) {
2468 if (new_import ==
NULL) {
2491 int etype = ref_mesh->
elem_type[eid - 1];
2494 int myrank_included = 0;
2495 int rank_i_included = 0;
2502 for (k = 0; k < nn; k++) {
2503 int rank = ref_mesh->
node_ID[2 * (elem_nodes[k] - 1) + 1];
2507 if (rank < 0) rank = -rank - 1;
2509 if (rank < min_rank) min_rank = rank;
2512 myrank_included = 1;
2514 }
else if (rank == rank_i) {
2515 rank_i_included = 1;
2519 HECMW_assert(0 <= min_rank && min_rank < mesh->n_subdomain);
2521 ref_mesh->
elem_ID[2 * (eid - 1) + 1] = min_rank;
2528 if (myrank_included && rank_i_included) {
2532 }
else if (myrank_included == 0) {
2535 ref_mesh->
elem_ID[2 * (eid - 1) + 1] = -min_rank - 1;
2633 static int mark_purely_external_nodes(
int my_rank,
2647 int rank = ref_mesh->
node_ID[2 * i + 1];
2648 if (rank == my_rank || rank < 0)
continue;
2652 ref_mesh->
node_ID[2 * i + 1] = -rank - 1;
2665 return rebuild_comm_tables_serial(mesh, ref_mesh);
2674 "Partitioning-type must be node-based for refinement.\n");
2681 if (shared ==
NULL) {
2688 if (get_refined_shared(mesh, ref_mesh, shared) !=
HECMW_SUCCESS) {
2693 if (determine_node_rank(mesh, shared, ref_mesh) !=
HECMW_SUCCESS) {
2698 if (check_node_rank(mesh, shared, ref_mesh) !=
HECMW_SUCCESS) {
2710 if (new_shared_export_import(mesh, shared, ref_mesh) !=
HECMW_SUCCESS) {
2758 int i, irank, js, je, len, tag, nsend;
2763 int n_error = 0, n_error_g;
2772 if (send_buf == 0) {
2779 if (requests ==
NULL) {
2785 if (statuses ==
NULL) {
2796 send_buf[i] = je - js;
2808 if (len != je - js) {
2810 "inconsistent length of import (%d) with export on rank %d (%d)\n",
2822 if (irank < ref_mesh->my_rank)
continue;
2825 send_buf[i] = je - js;
2833 if (ref_mesh->
my_rank < irank)
continue;
2839 if (len != je - js) {
2841 "inconsistent length of shared (%d) with rank %d (%d)\n",
2861 int *sendbuf, *recvbuf, *srbuf;
2862 int i, j, irank, js, je, len, nid, tag, nsend, rank, lid;
2863 int *item_p, *sendbuf_p, *recvbuf_p, *srbuf_p;
2876 if (requests ==
NULL) {
2882 if (statuses ==
NULL) {
2892 if (sendbuf ==
NULL) {
2902 sendbuf_p = sendbuf + js;
2903 for (j = 0; j < len; j++) {
2904 nid = item_p[j] - 1;
2905 lid = ref_mesh->
node_ID[2 * nid];
2918 if (recvbuf ==
NULL) {
2928 recvbuf_p = recvbuf + js;
2933 for (j = 0; j < len; j++) {
2934 nid = item_p[j] - 1;
2937 ref_mesh->
node_ID[2 * nid] = lid;
2949 if (srbuf ==
NULL) {
2956 if (irank < ref_mesh->my_rank)
continue;
2960 srbuf_p = srbuf + js;
2962 for (j = 0; j < len; j++) {
2963 nid = item_p[j] - 1;
2964 rank = ref_mesh->
elem_ID[2 * nid + 1];
2965 lid = ref_mesh->
elem_ID[2 * nid];
2966 if (rank == ref_mesh->
my_rank && lid > 0) {
2980 if (ref_mesh->
my_rank < irank)
continue;
2984 srbuf_p = srbuf + js;
2990 for (j = 0; j < len; j++) {
2992 if (lid < 0)
continue;
2993 nid = item_p[j] - 1;
2994 rank = ref_mesh->
elem_ID[2 * nid + 1];
2996 if (rank < 0)
continue;
2997 ref_mesh->
elem_ID[2 * nid] = lid;
3015 const int *ro_item_v;
3016 int n_refine, offset, cnt, cnt2, i, j;
3023 if (ref_reforg ==
NULL) {
3033 ref_reforg->
index[0] = 0;
3034 for (i = 1; i < n_refine; i++) {
3037 ref_reforg->
index[n_refine] =
3038 ref_reforg->
index[n_refine - 1] + ref_mesh->
n_node;
3049 for (i = 1; i <= ref_reforg->
index[n_refine - 1]; i++) {
3052 offset = ref_reforg->
index[n_refine - 1];
3058 for (i = 0; i < ref_mesh->
n_node; i++) {
3061 if (iold < mesh->n_node_gross) {
3068 int orig_type_rcap = rcapGetOriginal(iold + 1, original);
3071 nn = get_rcap_elem_max_node(orig_type_rcap);
3072 for (j = 0; j < nn; j++) {
3073 int org = original[j];
3079 ref_reforg->
item_index[offset + i + 1] = cnt;
3090 for (i = 0; i < cnt; i++) {
3096 for (i = 0; i < cnt2; i++) {
3097 ref_reforg->
item_item[cnt + i] = ro_item_v[i];
3101 fprintf(stderr,
"refine_origin->index:\n");
3102 for( i=0; i <= n_refine; i++ ) {
3103 fprintf(stderr,
" %d", ref_reforg->
index[i]);
3104 if( i % 10 == 9 ) fprintf(stderr,
"\n");
3106 if( i % 10 != 0 ) fprintf(stderr,
"\n");
3107 fprintf(stderr,
"refine_origin->item_index:\n");
3108 for( i=0; i <= ref_reforg->
index[n_refine]; i++) {
3109 fprintf(stderr,
" %d", ref_reforg->
item_index[i]);
3110 if( i % 10 == 9 ) fprintf(stderr,
"\n");
3112 if( i % 10 != 0 ) fprintf(stderr,
"\n");
3113 fprintf(stderr,
"refine_origin->item_item:\n");
3114 for( i=0; i < ref_reforg->
item_index[ref_reforg->
index[n_refine]]; i++ ) {
3115 fprintf(stderr,
" %d", ref_reforg->
item_item[i]);
3116 if( i % 10 == 9 ) fprintf(stderr,
"\n");
3118 if( i % 10 != 0 ) fprintf(stderr,
"\n");
3149 if (rebuild_n_node_refine_hist(mesh, ref_mesh) !=
HECMW_SUCCESS)
3176 if (renumber_nodes_generate_tables(ref_mesh) !=
HECMW_SUCCESS)
3178 if (renumber_elements_generate_tables(ref_mesh) !=
HECMW_SUCCESS)
3288 int etype, ierror, ndiv, nelem;
3290 ndiv = get_elem_ndiv(etype, &ierror);
3401 for (i = 0; i < sect->
n_sect; i++) {
3411 for (i = 0; i < sect->
n_sect; i++) {
3422 for (i = 0; i < sect->
n_sect + 1; i++) {
3446 for (i = 0; i < sect->
n_sect + 1; i++) {
3470 for (i = 0; i < sect->
n_sect + 1; i++) {
3496 if (mat->
n_mat == 0) {
3519 for (i = 0; i < mat->
n_mat; i++) {
3533 for (i = 0; i < mat->
n_mat + 1; i++) {
3582 static int copy_mpc_info(
const struct hecmwST_mpc *mpc,
3588 if (mpc->
n_mpc == 0) {
3615 for ( i = 0; i < mpc->
n_mpc + 1; i++ ) {
3655 for ( i = 0; i < mpc->
n_mpc; i++ ) {
3669 if (amp->
n_amp == 0) {
3691 for (i = 0; i < amp->
n_amp; i++) {
3705 for (i = 0; i < amp->
n_amp; i++) {
3715 for (i = 0; i < amp->
n_amp; i++) {
3725 for (i = 0; i < amp->
n_amp; i++) {
3735 for (i = 0; i < amp->
n_amp + 1; i++) {
3776 for (i = 0; i < cp->
n_pair; i++) {
3790 for (i = 0; i < cp->
n_pair; i++) {
3800 for (i = 0; i < cp->
n_pair; i++) {
3810 for (i = 0; i < cp->
n_pair; i++) {
3820 for (i = 0; i < cp->
n_pair; i++) {
3859 int count_in, count_ex, count_pex;
3860 int *old2new, *new2old;
3867 if (old2new ==
NULL) {
3872 if (new2old ==
NULL) {
3882 old2new[i] = count_in;
3883 new2old[count_in] = i;
3885 }
else if (rank >= 0) {
3886 old2new[i] = count_ex;
3887 new2old[count_ex] = i;
3890 old2new[i] = count_pex;
3891 new2old[count_pex] = i;
3919 if (new_node_ID ==
NULL) {
3924 int old = new2old[i];
3926 new_node_ID[2 * i + 1] =
mesh->
node_ID[2 * old + 1];
3933 int *new_global_node_ID =
3935 if (new_global_node_ID ==
NULL) {
3940 int old = new2old[i];
3950 if (new_node ==
NULL) {
3955 int old = new2old[i];
3957 for (j = 0; j < 3; j++) new_node[3 * i + j] =
mesh->
node[3 * old + j];
3965 int *new_node_init_val_index =
3967 if (new_node_init_val_index ==
NULL) {
3971 new_node_init_val_index[0] = 0;
3973 int old = new2old[i];
3976 new_node_init_val_index[i + 1] = new_node_init_val_index[i] + ninit;
3981 double *new_node_init_val_item = (
double *)
HECMW_malloc(
3983 if (new_node_init_val_item ==
NULL) {
3988 int old = new2old[i];
3989 int idx_new = new_node_init_val_index[i];
3993 for (j = 0; j < ninit; j++) {
3994 new_node_init_val_item[idx_new + j] =
4011 int new = old2new[old - 1] + 1;
4017 int new = old2new[old - 1] + 1;
4023 int new = old2new[old - 1] + 1;
4029 int new = old2new[old - 1] + 1;
4035 int new = old2new[old - 1] + 1;
4041 static int delete_external_items(
int n_elem,
int n_grp,
int *
index,
int *item,
4046 for (i = 0; i < n_grp; i++) {
4047 int end =
index[i + 1];
4048 for (j = start; j < end; j++) {
4049 if (item[j * n_memb] > n_elem) {
4052 for (k = 0; k < n_memb; k++)
4053 item[(j - n_del) * n_memb + k] = item[j * n_memb + k];
4058 index[i + 1] = end - n_del;
4063 static int delete_external_equations(
int n_node,
struct hecmwST_mpc *mpc) {
4064 int iold, inew, jold, jnew;
4067 int *mpc_index_new, *mpc_item_new, *mpc_dof_new;
4068 double *mpc_val_new, *mpc_const_new;
4070 if (active_eqn ==
NULL) {
4075 for (iold = 0; iold < mpc->
n_mpc; iold++) {
4077 for (jold = mpc->
mpc_index[iold]; jold < mpc->mpc_index[iold+1]; jold++) {
4078 if (mpc->
mpc_item[jold] > n_node) {
4084 active_eqn[n_mpc_new] = iold;
4088 mpc_index_new = (
int *)
HECMW_malloc(
sizeof(
int) * (n_mpc_new + 1));
4089 if (mpc_index_new ==
NULL) {
4093 mpc_index_new[0] = 0;
4094 if (n_mpc_new == 0) {
4095 mpc_item_new =
NULL;
4098 mpc_const_new =
NULL;
4100 for (inew = 0; inew < n_mpc_new; inew++) {
4101 iold = active_eqn[inew];
4102 mpc_index_new[inew+1] = mpc_index_new[inew] + (mpc->
mpc_index[iold+1] - mpc->
mpc_index[iold]);
4104 mpc_item_new = (
int *)
HECMW_malloc(
sizeof(
int) * mpc_index_new[n_mpc_new]);
4105 if (mpc_item_new ==
NULL) {
4109 mpc_dof_new = (
int *)
HECMW_malloc(
sizeof(
int) * mpc_index_new[n_mpc_new]);
4110 if (mpc_dof_new ==
NULL) {
4114 mpc_val_new = (
double *)
HECMW_malloc(
sizeof(
double) * mpc_index_new[n_mpc_new]);
4115 if (mpc_val_new ==
NULL) {
4119 mpc_const_new = (
double *)
HECMW_malloc(
sizeof(
double) * n_mpc_new);
4120 if (mpc_const_new ==
NULL) {
4124 for (inew = 0; inew < n_mpc_new; inew++) {
4125 iold = active_eqn[inew];
4126 for (jold = mpc->
mpc_index[iold], jnew = mpc_index_new[inew]; jold < mpc->mpc_index[iold+1]; jold++, jnew++) {
4127 mpc_item_new[jnew] = mpc->
mpc_item[jold];
4128 mpc_dof_new[jnew] = mpc->
mpc_dof[jold];
4129 mpc_val_new[jnew] = mpc->
mpc_val[jold];
4131 mpc_const_new[inew] = mpc->
mpc_const[iold];
4135 mpc->
n_mpc = n_mpc_new;
4194 int count_rel, count_pex;
4195 int *old2new, *new2old;
4202 if (old2new ==
NULL) {
4207 if (new2old ==
NULL) {
4216 old2new[i] = count_rel;
4217 new2old[count_rel] = i;
4220 old2new[i] = count_pex;
4221 new2old[count_pex] = i;
4249 if (new_elem_ID ==
NULL) {
4254 int old = new2old[i];
4256 new_elem_ID[2 * i + 1] =
mesh->
elem_ID[2 * old + 1];
4263 int *new_global_elem_ID =
4265 if (new_global_elem_ID ==
NULL) {
4270 int old = new2old[i];
4279 if (new_elem_type ==
NULL) {
4284 int old = new2old[i];
4304 int *new_elem_node_index =
4308 if (new_elem_node_index ==
NULL || new_elem_node_item ==
NULL) {
4312 new_elem_node_index[0] = 0;
4314 int old = new2old[i];
4316 new_elem_node_index[i + 1] = new_elem_node_index[i] + nn;
4319 int old = new2old[i];
4321 int start_new = new_elem_node_index[i];
4322 int nn = new_elem_node_index[i + 1] - start_new;
4324 for (j = 0; j < nn; j++)
4335 if (new_section_ID ==
NULL) {
4340 int old = new2old[i];
4348 int *new_emID_index, *new_emID_item;
4351 if (new_emID_index ==
NULL) {
4357 if (new_emID_item ==
NULL) {
4361 new_emID_index[0] = 0;
4363 int old, js_old, je_old, len, js_new, j;
4367 len = je_old - js_old;
4368 js_new = new_emID_index[i];
4369 new_emID_index[i + 1] = js_new + len;
4370 for (j = 0; j < len; j++) {
4386 int new = old2new[old - 1] + 1;
4392 int new = old2new[old - 1] + 1;
4398 int new = old2new[old - 1] + 1;
4404 int new = old2new[old - 1] + 1;
4477 const char *cad_filename,
const char *part_filename) {
4485 if ((*mesh)->n_refine > 0) {
4490 if (prepare_refiner(*mesh, cad_filename, part_filename) !=
HECMW_SUCCESS)
4493 for (i = 0; i < refine; i++) {
4495 if (ref_mesh ==
NULL) {
4531 const char *cad_filename,
const char *part_filename) {