22 #ifdef HECMW_WITH_REFINER
24 #include "rcapRefiner.h"
31 static const int *get_enode_h2r(
int etype,
int *ierror) {
33 static const int enode_pyr_h2r[13] = {4, 0, 1, 2, 3, 9, 10,
35 static const int enode_rod2_h2r[3] = {0, 2, 1};
74 enode_h2r = enode_pyr_h2r;
78 enode_h2r = enode_rod2_h2r;
82 "Element type %d not supported for rerinement.\n", etype);
90 static const int *get_enode_r2h(
int etype,
int *ierror) {
92 static const int enode_pyr_r2h[13] = {1, 2, 3, 4, 0, 9, 10,
94 static const int enode_rod2_r2h[3] = {0, 2, 1};
133 enode_r2h = enode_pyr_r2h;
137 enode_r2h = enode_rod2_r2h;
141 "Element type %d not supported for refinement.\n", etype);
151 const int *enode_h2r;
153 int nn, istart, iend;
158 enode_h2r = get_enode_h2r(etype, &ierror);
160 if (enode_h2r ==
NULL)
continue;
164 for (j = istart; j < iend; j++) {
166 for (j = 0; j < nn; j++) temp_enode[j] = enode[enode_h2r[j]];
167 for (j = 0; j < nn; j++) enode[j] = temp_enode[j];
176 const int *enode_r2h;
178 int nn, istart, iend;
183 enode_r2h = get_enode_r2h(etype, &ierror);
185 if (enode_r2h ==
NULL)
continue;
189 for (j = istart; j < iend; j++) {
191 for (j = 0; j < nn; j++) temp_enode[j] = enode[enode_r2h[j]];
192 for (j = 0; j < nn; j++) enode[j] = temp_enode[j];
203 static const int *get_sid_h2r(
int etype,
int *ierror) {
214 static const int sid_tri_h2r[4] = {-1, 2, 0, 1};
215 static const int sid_qua_h2r[5] = {-1, 0, 1, 2, 3};
216 static const int sid_tet_h2r[5] = {-1, 3, 2, 0, 1};
217 static const int sid_pri_h2r[6] = {-1, 0, 1, 2, 3, 4};
218 static const int sid_hex_h2r[7] = {-1, 0, 1, 2, 3, 4, 5};
219 static const int sid_pyr_h2r[6] = {-1, 3, 1,
227 sid_h2r = sid_tri_h2r;
231 sid_h2r = sid_qua_h2r;
236 sid_h2r = sid_tet_h2r;
240 sid_h2r = sid_pri_h2r;
245 sid_h2r = sid_hex_h2r;
249 sid_h2r = sid_pyr_h2r;
265 "Element type %d not supported for refinement.\n", etype);
272 static const int *get_sid_r2h(
int etype,
int *ierror) {
283 static const int sid_tri_r2h[3] = {2, 3, 1};
284 static const int sid_qua_r2h[4] = {1, 2, 3, 4};
285 static const int sid_tet_r2h[4] = {3, 4, 2, 1};
286 static const int sid_pri_r2h[5] = {1, 2, 3, 4, 5};
287 static const int sid_hex_r2h[6] = {1, 2, 3, 4, 5, 6};
288 static const int sid_pyr_r2h[5] = {3, 2, 4, 1,
296 sid_r2h = sid_tri_r2h;
300 sid_r2h = sid_qua_r2h;
305 sid_r2h = sid_tet_r2h;
309 sid_r2h = sid_pri_r2h;
314 sid_r2h = sid_hex_r2h;
318 sid_r2h = sid_pyr_r2h;
334 "Element type %d not supported for refinement.\n", etype);
349 int *sid_p = &(grp->
grp_item[2 * i + 1]);
357 if (sid_h2r) *sid_p = sid_h2r[*sid_p];
370 int *sid_p = &(grp->
grp_item[2 * i + 1]);
378 if (sid_r2h) *sid_p = sid_r2h[*sid_p];
394 static int get_elem_ndiv(
int etype,
int *ierror) {
410 "Element type %d not supported for refinement.\n", etype);
431 fp_dump = fopen(fname,
"w");
432 if (fp_dump ==
NULL) {
433 fprintf(stderr,
"Error: cannot open file %s\n", fname);
454 for (i = 1; i < grp->
n_grp; i++) {
458 snprintf(rcap_name,
sizeof(rcap_name),
"NG_%s", grp->
grp_name[i]);
466 fp_dump = fopen(fname,
"w");
467 if (fp_dump ==
NULL) {
468 fprintf(stderr,
"Error: cannot open file %s\n", fname);
470 int len = strlen(rcap_name);
472 fwrite(&len,
sizeof(
int), 1, fp_dump);
473 fwrite(rcap_name,
sizeof(
char), len, fp_dump);
474 fwrite(&num,
sizeof(
int), 1, fp_dump);
475 fwrite(array,
sizeof(
int), num, fp_dump);
480 rcapAppendNodeGroup(rcap_name, num, array);
491 for (i = 0; i < grp->
n_grp; i++) {
494 int *array = grp->
grp_item + start * 2;
498 for (j = 0; j < num; j++) {
499 int elem = array[j * 2];
500 int surf = array[j * 2 + 1];
512 snprintf(rcap_name,
sizeof(rcap_name),
"SG_%s", grp->
grp_name[i]);
522 fp_dump = fopen(fname,
"w");
523 if (fp_dump ==
NULL) {
524 fprintf(stderr,
"Error: cannot open file %s\n", fname);
526 int len = strlen(rcap_name);
527 HECMW_log(
HECMW_LOG_DEBUG,
"RCAP: writing strlen(dataname), dataname[], num, faceArray[0..2*num-1] to %s\n", fname);
528 fwrite(&len,
sizeof(
int), 1, fp_dump);
529 fwrite(rcap_name,
sizeof(
char), len, fp_dump);
530 fwrite(&num,
sizeof(
int), 1, fp_dump);
531 fwrite(array,
sizeof(
int), num*2, fp_dump);
536 rcapAppendFaceGroup(rcap_name, num, array);
544 const char *cad_filename,
545 const char *part_filename) {
554 rcapInitRefiner(1, 1);
555 if (cad_filename !=
NULL) {
559 rcapSetCADFilename(cad_filename);
561 if (part_filename !=
NULL) {
565 rcapSetPartitionFilename(part_filename);
581 static void clear_refiner(
void) {
603 static int elem_type_hecmw2rcap(
int etype) {
608 return RCAP_SEGMENT2;
610 return RCAP_TRIANGLE;
612 return RCAP_TRIANGLE2;
620 return RCAP_TETRAHEDRON;
622 return RCAP_TETRAHEDRON;
624 return RCAP_TETRAHEDRON2;
632 return RCAP_PYRAMID2;
634 return RCAP_HEXAHEDRON;
636 return RCAP_HEXAHEDRON;
638 return RCAP_HEXAHEDRON2;
642 return RCAP_SEGMENT2;
646 return RCAP_TRIANGLE;
648 return RCAP_TRIANGLE2;
650 return RCAP_TRIANGLE;
658 return RCAP_TRIANGLE;
660 return RCAP_TRIANGLE2;
666 return RCAP_UNKNOWNTYPE;
669 static int reorder_enode_33struct(
int etype,
int n_elem,
670 int *elem_node_item_ref) {
671 int nn, nn_2, ndiv, nn_tot, ierror;
674 int *enode1, *enode2;
677 ndiv = get_elem_ndiv(etype, &ierror);
680 enode1 = elem_node_item_ref;
681 enode2 = enode1 + nn_2 * ndiv;
682 for (j = 0; j < n_elem; j++) {
685 for (k = 0; k < ndiv; k++) {
686 for (l = 0; l < nn_2; l++) {
687 tmp_p[l] = enode1[l];
688 tmp_p[nn_2 + l] = enode2[l];
694 for (k = 0; k < nn_tot; k++) {
697 enode1 += nn_2 * ndiv;
698 enode2 += nn_2 * ndiv;
707 size_t n_enode_ref_tot;
708 long long *elem_node_index_ref;
709 int *elem_node_item_ref;
719 int etype, istart, iend, n_elem, etype_rcap, nn;
725 n_elem = iend - istart;
730 if (is33) n_elem *= 2;
731 etype_rcap = elem_type_hecmw2rcap(etype);
736 HECMW_log(
HECMW_LOG_DEBUG,
"RCAP: calling rcapRefineElement(num=%d, etype=%d, nodeArray, NULL)\n", n_elem, etype_rcap);
740 snprintf(fname,
sizeof(fname),
"dump_rcapRefineElement_pre_%d.%d", etype,
HECMW_comm_get_rank());
741 fp_dump = fopen(fname,
"w");
742 if (fp_dump ==
NULL) {
743 fprintf(stderr,
"Error: cannot open file %s\n", fname);
747 fwrite(&n_elem,
sizeof(
int), 1, fp_dump);
748 fwrite(&etype_rcap,
sizeof(
int), 1, fp_dump);
749 fwrite(elem_node_item,
sizeof(
int), nn * n_elem, fp_dump);
754 n_elem_ref = rcapRefineElement(n_elem, etype_rcap, elem_node_item,
NULL);
766 ndiv = get_elem_ndiv(etype, &ierror);
771 n_elem_ref_tot += n_elem_ref;
773 n_enode_ref_tot += n_elem_ref * nn;
783 (
long long *)
HECMW_malloc(
sizeof(
long long) * (n_elem_ref_tot + 1));
804 int etype, istart, iend, n_elem, etype_rcap, n_elem_ref, nn;
810 n_elem = iend - istart;
813 if (n_elem == 0)
continue;
817 for (j = 0; j < n_elem * nn; j++) {
825 if (is33) n_elem *= 2;
826 etype_rcap = elem_type_hecmw2rcap(etype);
830 HECMW_log(
HECMW_LOG_DEBUG,
"RCAP: calling rcapRefineElement(num=%d, etype=%d, nodeArray, resultNodeArray)\n", n_elem, etype_rcap);
832 n_elem_ref = rcapRefineElement(n_elem, etype_rcap, elem_node_item,
838 snprintf(fname,
sizeof(fname),
"dump_rcapRefineElement_%d.%d", etype,
HECMW_comm_get_rank());
839 fp_dump = fopen(fname,
"w");
840 if (fp_dump ==
NULL) {
841 fprintf(stderr,
"Error: cannot open file %s\n", fname);
845 "RCAP: writing num, etype, nodeArray[0..%d*num-1], num_ref, resultNodeArray[0..%d*num_ref-1] to %s\n",
847 fwrite(&n_elem,
sizeof(
int), 1, fp_dump);
848 fwrite(&etype_rcap,
sizeof(
int), 1, fp_dump);
849 fwrite(elem_node_item,
sizeof(
int), nn * n_elem, fp_dump);
850 fwrite(&n_elem_ref,
sizeof(
int), 1, fp_dump);
851 fwrite(elem_node_item_ref,
sizeof(
int), nn * n_elem_ref, fp_dump);
860 reorder_enode_33struct(etype, n_elem, elem_node_item_ref);
863 for (j = 0; j < n_elem_ref; j++) {
864 elem_node_index_ref[j + 1] = elem_node_index_ref[j] + nn;
865 if (elem_node_index_ref[j + 1] < elem_node_index_ref[j]) {
867 "Integer overflow detected while creating elem_node_index\n");
871 elem_node_index_ref += n_elem_ref;
872 elem_node_item_ref += nn * n_elem_ref;
873 n_elem_ref_tot += n_elem_ref;
918 fp_dump = fopen(fname,
"w");
919 if (fp_dump ==
NULL) {
920 fprintf(stderr,
"Error: cannot open file %s\n", fname);
924 fwrite(&(ref_mesh->
n_node_gross),
sizeof(
int), 1, fp_dump);
925 fwrite(&one,
sizeof(
int), 1, fp_dump);
937 int ref_n_node_gross) {
956 for (i = 1; i < grp->
n_grp; i++) {
972 ref_grp->
grp_index[1] = ref_n_node_gross;
974 for (i = 1; i < grp->
n_grp; i++) {
975 snprintf(rcap_name,
sizeof(rcap_name),
"NG_%s", grp->
grp_name[i]);
977 ref_grp->
grp_index[i] + rcapGetNodeGroupCount(rcap_name);
989 for (i = 0; i < ref_n_node_gross; i++) {
993 for (i = 1; i < grp->
n_grp; i++) {
995 int num = ref_grp->
grp_index[i + 1] - start;
997 int *array = ref_grp->
grp_item + start;
998 snprintf(rcap_name,
sizeof(rcap_name),
"NG_%s", grp->
grp_name[i]);
999 rcapGetNodeGroup(rcap_name, num, array);
1013 int n_elem,
int *elem_list) {
1014 int i, eid, etype, ierror, ndiv;
1016 for (i = 0; i < n_elem; i++) {
1020 ndiv = get_elem_ndiv(etype, &ierror);
1021 if (ierror)
return -1;
1030 int i, etype, ierror, ndiv;
1031 int etype_idx, eid_type;
1039 ndiv = get_elem_ndiv(etype, &ierror);
1040 if (ierror)
return -1;
1055 offset = ref_mesh->
elem_type_index[etype_idx] + (eid_type - 1) * ndiv + 1;
1056 for (i = 0; i < ndiv; i++) {
1057 eid_ref[i] = offset + i;
1064 int n_elem,
int *elem_list,
1065 int *elem_list_ref) {
1067 int eid_ref[NDIV_MAX];
1068 int *el_ref = elem_list_ref;
1070 for (i = 0; i < n_elem; i++) {
1071 int ndiv = get_refined_elements(mesh, ref_mesh, elem_list[i], eid_ref);
1072 if (ndiv < 0)
return -1;
1073 for (j = 0; j < ndiv; j++) {
1074 el_ref[j] = eid_ref[j];
1109 for (i = 1; i < grp->
n_grp; i++) {
1125 ref_grp->
grp_index[1] = ref_n_elem_gross;
1127 for (i = 1; i < grp->
n_grp; i++) {
1128 int start, n_elem, n_elem_ref;
1133 n_elem_ref = get_refined_element_count(mesh, n_elem, elem_list);
1147 for (i = 0; i < ref_n_elem_gross; i++) {
1151 for (i = 1; i < grp->
n_grp; i++) {
1152 int start, start_ref, n_elem, n_elem_ref, ret;
1153 int *elem_list, *elem_list_ref;
1155 n_elem_ref = ref_grp->
grp_index[i + 1] - start_ref;
1157 if (n_elem_ref == 0)
continue;
1161 elem_list_ref = ref_grp->
grp_item + start_ref;
1162 ret = get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list,
1193 for (i = 0; i < grp->
n_grp; i++) {
1208 for (i = 0; i < grp->
n_grp; i++) {
1210 int num = grp->
grp_index[i + 1] - start;
1211 int *array = grp->
grp_item + start * 2;
1212 int num_sh, num_other;
1215 snprintf(rcap_name,
sizeof(rcap_name),
"SG_%s", grp->
grp_name[i]);
1216 num_other = rcapGetFaceGroupCount(rcap_name);
1220 for (j = 0; j < num; j++) {
1221 int elem = array[j * 2];
1226 num_sh *= NDIV_SURF;
1243 for (i = 0; i < grp->
n_grp; i++) {
1245 int start, num_tot, n_elem, ret;
1246 int start_ref, num_ref, num_tot_ref, n_elem_ref;
1247 int *array, *array_ref, *elem_list, *elem_list_ref;
1250 num_tot_ref = ref_grp->
grp_index[i + 1] - start_ref;
1251 if (num_tot_ref == 0)
continue;
1252 array_ref = ref_grp->
grp_item + start_ref * 2;
1255 snprintf(rcap_name,
sizeof(rcap_name),
"SG_%s", grp->
grp_name[i]);
1256 num_ref = rcapGetFaceGroupCount(rcap_name);
1257 rcapGetFaceGroup(rcap_name, num_ref, array_ref);
1259 num_tot_ref -= num_ref;
1260 if (num_tot_ref == 0)
continue;
1261 array_ref += num_ref * 2;
1272 num_tot = grp->
grp_index[i + 1] - start;
1274 for (j = 0; j < num_tot; j++) {
1275 int elem, etype, surf;
1276 elem = array[j * 2];
1277 surf = array[j * 2 + 1];
1294 n_elem_ref = n_elem * NDIV_SURF;
1295 elem_list_ref = (
int *)
HECMW_calloc(n_elem_ref,
sizeof(
int));
1296 if (elem_list_ref ==
NULL) {
1300 ret = get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list, elem_list_ref);
1302 for (j = 0; j < n_elem_ref; j++) {
1303 array_ref[j * 2] = elem_list_ref[j];
1304 array_ref[j * 2 + 1] = 1;
1308 num_tot_ref -= n_elem_ref;
1309 array_ref += n_elem_ref * 2;
1316 n_elem_ref = n_elem * NDIV_SURF;
1317 elem_list_ref = (
int *)
HECMW_calloc(n_elem_ref,
sizeof(
int));
1318 if (elem_list_ref ==
NULL) {
1322 ret = get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list, elem_list_ref);
1324 for (j = 0; j < n_elem_ref; j++) {
1325 array_ref[j * 2] = elem_list_ref[j];
1326 array_ref[j * 2 + 1] = 2;
1330 num_tot_ref -= n_elem_ref;
1355 if (refine_elem_group_info(mesh, ref_mesh) !=
HECMW_SUCCESS) {
1358 if (refine_surf_group_info(mesh, ref_mesh) !=
HECMW_SUCCESS) {
1385 elem_ID_ref = ref_mesh->
elem_ID;
1387 int etype, istart, iend, n_elem, ierror, ndiv;
1391 n_elem = iend - istart;
1392 ndiv = get_elem_ndiv(etype, &ierror);
1395 for (j = 0; j < n_elem; j++) {
1396 int rank = elem_ID_org[1];
1397 for (k = 0; k < ndiv; k++) {
1399 elem_ID_ref[0] = -count;
1400 elem_ID_ref[1] = rank;
1411 static int shift_new_global_ID(
int *min_ID,
int n_new) {
1419 if (n_new_all ==
NULL) {
1426 for (i = 0; i < my_rank; i++) *min_ID -= n_new_all[i];
1435 int *global_elem_ID_org;
1436 int *global_elem_ID_ref;
1447 if (global_elem_ID_org[i] < min_ID)
1448 min_ID = global_elem_ID_org[i];
1451 if (shift_new_global_ID(&min_ID, ref_mesh->
n_elem_gross -
1456 int etype, istart, iend, n_elem, ierror, ndiv;
1460 n_elem = iend - istart;
1461 ndiv = get_elem_ndiv(etype, &ierror);
1464 for (j = 0; j < n_elem; j++) {
1465 global_elem_ID_ref[0] = global_elem_ID_org[0];
1466 for (k = 1; k < ndiv; k++) {
1468 global_elem_ID_ref[k] = min_ID;
1470 global_elem_ID_org += 1;
1471 global_elem_ID_ref += ndiv;
1490 int etype, istart, iend, n_elem, ierror, ndiv;
1494 n_elem = iend - istart;
1495 ndiv = get_elem_ndiv(etype, &ierror);
1498 for (j = 0; j < n_elem; j++) {
1499 for (k = 0; k < ndiv; k++) {
1500 elem_type_ref[k] = etype;
1502 elem_type_ref += ndiv;
1511 int *section_ID_org;
1512 int *section_ID_ref;
1522 int etype, istart, iend, n_elem, ierror, ndiv;
1526 n_elem = iend - istart;
1527 ndiv = get_elem_ndiv(etype, &ierror);
1530 for (j = 0; j < n_elem; j++) {
1531 int sect_id = section_ID_org[0];
1532 for (k = 0; k < ndiv; k++) {
1533 section_ID_ref[k] = sect_id;
1535 section_ID_org += 1;
1536 section_ID_ref += ndiv;
1545 int *elem_mat_ID_index_org;
1546 int *elem_mat_ID_index_ref;
1558 int etype, istart, iend, n_elem, ierror, ndiv;
1562 n_elem = iend - istart;
1563 ndiv = get_elem_ndiv(etype, &ierror);
1566 for (j = 0; j < n_elem; j++) {
1567 int n = elem_mat_ID_index_org[1] - elem_mat_ID_index_org[0];
1568 for (k = 0; k < ndiv; k++) {
1569 elem_mat_ID_index_ref[k + 1] = elem_mat_ID_index_ref[k] + n;
1571 elem_mat_ID_index_org += 1;
1572 elem_mat_ID_index_ref += ndiv;
1581 int *elem_mat_ID_index_org;
1582 int *elem_mat_ID_item_org;
1583 int *elem_mat_ID_item_ref;
1595 int etype, istart, iend, n_elem, ierror, ndiv;
1599 n_elem = iend - istart;
1600 ndiv = get_elem_ndiv(etype, &ierror);
1603 for (j = 0; j < n_elem; j++) {
1604 int n = elem_mat_ID_index_org[1] - elem_mat_ID_index_org[0];
1605 for (k = 0; k < ndiv; k++) {
1606 for (l = 0; l < n; l++) {
1607 elem_mat_ID_item_ref[l] = elem_mat_ID_item_org[l];
1609 elem_mat_ID_item_ref += n;
1611 elem_mat_ID_index_org += 1;
1612 elem_mat_ID_item_org += n;
1623 if (rebuild_global_elem_ID(mesh, ref_mesh) !=
HECMW_SUCCESS)
1627 if (rebuild_elem_mat_ID_index(mesh, ref_mesh) !=
HECMW_SUCCESS)
1629 if (rebuild_elem_mat_ID_item(mesh, ref_mesh) !=
HECMW_SUCCESS)
1661 ref_mesh->
node_ID[2 * i] = -count;
1729 int start, n_elem, n_elem_ref, ret;
1730 int *elem_list, *elem_list_ref;
1734 n_elem_ref = get_refined_element_count(mesh, n_elem, elem_list);
1739 get_refined_elem_list(mesh, ref_mesh, n_elem, elem_list, elem_list_ref);
1745 static int elem_type_rcap2hecmw(
int etype) {
1753 case RCAP_TRIANGLE2:
1759 case RCAP_TETRAHEDRON:
1761 case RCAP_TETRAHEDRON2:
1771 case RCAP_HEXAHEDRON:
1773 case RCAP_HEXAHEDRON2:
1779 static int get_rcap_elem_max_node(
int etype_rcap) {
1780 int etype_hecmw = elem_type_rcap2hecmw(etype_rcap);
1784 static int determine_node_rank_of_purely_external_elems(
1787 int eid, rank, k, nid;
1792 rank = ref_mesh->
elem_ID[2 * (eid - 1) + 1];
1794 if (rank >= 0)
continue;
1798 for (k = 0; k < nn; k++) {
1799 nid = elem_nodes[k];
1800 if (nid <= mesh->n_node_gross)
continue;
1832 for (k = 0; k < nn; k++) {
1845 int orig_type_rcap = rcapGetOriginal(bnode, original);
1852 nn = get_rcap_elem_max_node(orig_type_rcap);
1854 for (k = 0; k < nn; k++) {
1859 rank = ref_mesh->
node_ID[2 * (original[k] - 1) + 1];
1863 if (rank < 0) rank = -rank - 1;
1865 if (rank < min_rank) min_rank = rank;
1866 if (max_rank < rank) max_rank = rank;
1868 HECMW_assert(0 <= min_rank && min_rank < mesh->n_subdomain);
1869 HECMW_assert(0 <= max_rank && max_rank < mesh->n_subdomain);
1873 ref_mesh->
node_ID[2 * (bnode - 1) + 1] = min_rank;
1875 ref_mesh->
node_ID[2 * (bnode - 1) + 1] = max_rank;
1882 if (determine_node_rank_of_purely_external_elems(mesh, ref_mesh) !=
HECMW_SUCCESS)
1889 static int *conv_index_ucd2hec(
int etype)
1891 static int conv_index_ucd2hec_rod1[] = {0, 1};
1892 static int conv_index_ucd2hec_rod2[] = {0, -1, 2};
1893 static int conv_index_ucd2hec_tri1[] = {0, 1, 2};
1894 static int conv_index_ucd2hec_tri2[] = {0, 1, 2, -1, -1, -1};
1895 static int conv_index_ucd2hec_qua1[] = {0, 1, 2, 3};
1896 static int conv_index_ucd2hec_qua2[] = {0, 1, 2, 3, -1, -1, -1, -1};
1897 static int conv_index_ucd2hec_tet1[] = {0, 3, 2, 1};
1898 static int conv_index_ucd2hec_tet2[] = {0, 3, 2, 1, -1, -1, -1, -1, -1, -1};
1899 static int conv_index_ucd2hec_pri1[] = {3, 4, 5, 0, 1, 2};
1900 static int conv_index_ucd2hec_pri2[] = {3, 4, 5, 0, 1, 2, -1, -1,
1901 -1, -1, -1, -1, -1, -1, -1};
1902 static int conv_index_ucd2hec_hex1[] = {4, 5, 6, 7, 0, 1, 2, 3};
1903 static int conv_index_ucd2hec_hex2[] = {4, 5, 6, 7, 0, 1, 2, 3, -1, -1,
1904 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
1905 static int conv_index_ucd2hec_pyr1[] = {4, 0, 1, 2, 3};
1906 static int conv_index_ucd2hec_pyr2[] = {4, 0, 1, 2, 3, -1, -1,
1907 -1, -1, -1, -1, -1, -1};
1908 static int conv_index_ucd2hec_mst1[] = {0, 1, 2, 3};
1909 static int conv_index_ucd2hec_mst2[] = {0, 1, 2, 3, -1, -1, -1, -1};
1910 static int conv_index_ucd2hec_msq1[] = {0, 1, 2, 3, 4};
1911 static int conv_index_ucd2hec_msq2[] = {0, 1, 2, 3, 4, -1, -1, -1, -1};
1912 static int conv_index_ucd2hec_jtt1[] = {3, 4, 5, 0, 1, 2};
1913 static int conv_index_ucd2hec_jtt2[] = {3, 4, 5, 0, 1, 2,
1914 -1, -1, -1, -1, -1, -1};
1915 static int conv_index_ucd2hec_jtq1[] = {4, 5, 6, 7, 0, 1, 2, 3};
1916 static int conv_index_ucd2hec_jtq2[] = {4, 5, 6, 7, 0, 1, 2, 3,
1917 -1, -1, -1, -1, -1, -1, -1, -1};
1919 static int conv_index_ucd2hec_bem1[] = {0, 1};
1920 static int conv_index_ucd2hec_bem2[] = {0, -1, 1};
1922 static int conv_index_ucd2hec_sht1[] = {0, 1, 2};
1923 static int conv_index_ucd2hec_sht2[] = {0, 1, 2, -1, -1, -1};
1924 static int conv_index_ucd2hec_shq1[] = {0, 1, 2, 3};
1925 static int conv_index_ucd2hec_shq2[] = {0, 1, 2, 3, -1, -1, -1, -1};
1926 static int conv_index_ucd2hec_ln[] = {0, 1};
1929 return conv_index_ucd2hec_rod1;
1931 return conv_index_ucd2hec_rod2;
1933 return conv_index_ucd2hec_tri1;
1935 return conv_index_ucd2hec_tri2;
1937 return conv_index_ucd2hec_qua1;
1939 return conv_index_ucd2hec_qua2;
1941 return conv_index_ucd2hec_tet1;
1943 return conv_index_ucd2hec_tet2;
1945 return conv_index_ucd2hec_pri1;
1947 return conv_index_ucd2hec_pri2;
1949 return conv_index_ucd2hec_hex1;
1951 return conv_index_ucd2hec_hex2;
1953 return conv_index_ucd2hec_pyr1;
1955 return conv_index_ucd2hec_pyr2;
1957 return conv_index_ucd2hec_mst1;
1959 return conv_index_ucd2hec_mst2;
1961 return conv_index_ucd2hec_msq1;
1963 return conv_index_ucd2hec_msq2;
1965 return conv_index_ucd2hec_jtt1;
1967 return conv_index_ucd2hec_jtt2;
1969 return conv_index_ucd2hec_jtq1;
1971 return conv_index_ucd2hec_jtq2;
1973 return conv_index_ucd2hec_sht1;
1975 return conv_index_ucd2hec_sht2;
1977 return conv_index_ucd2hec_shq1;
1979 return conv_index_ucd2hec_shq2;
2016 return conv_index_ucd2hec_ln;
2022 static void write_elem_with_mismatching_refinement(
const struct hecmwST_local_mesh *mesh,
2034 int n_shared_elem_node;
2035 int n_shared_elem_r;
2036 int n_shared_elem_node_r;
2037 int *shared_elem_node_index_l =
NULL;
2038 int *shared_elem_node_item_l =
NULL;
2039 int *shared_elem_node_index_r =
NULL;
2040 int *shared_elem_node_item_r =
NULL;
2045 n_shared_elem_node = 0;
2046 for (j = 0; j < n_shared_elem; j++) {
2050 for (k = 0; k < nn; k++) {
2051 nid = elem_nodes[k];
2053 for (l = 0; l < n_shared_node; l++) {
2058 n_shared_elem_node += nn;
2072 send_buf[0] = n_shared_elem;
2073 send_buf[1] = n_shared_elem_node;
2077 HECMW_Isend(shared_elem_node_index_l, n_shared_elem + 1,
HECMW_INT, irank, tag, comm, &requests[1]);
2079 HECMW_Isend(shared_elem_node_item_l, n_shared_elem_node,
HECMW_INT, irank, tag, comm, &requests[2]);
2086 n_shared_elem_r = recv_buf[0];
2087 n_shared_elem_node_r = recv_buf[1];
2089 shared_elem_node_index_r = (
int *)
HECMW_malloc(
sizeof(
int) * (n_shared_elem_r + 1));
2090 if (shared_elem_node_index_r ==
NULL) {
2094 shared_elem_node_item_r = (
int *)
HECMW_malloc(
sizeof(
int) * n_shared_elem_node_r);
2095 if (shared_elem_node_item_r ==
NULL) {
2101 HECMW_Recv(shared_elem_node_index_r, n_shared_elem_r + 1,
HECMW_INT, irank, tag, comm, &statuses[1]);
2103 HECMW_Recv(shared_elem_node_item_r, n_shared_elem_node_r,
HECMW_INT, irank, tag, comm, &statuses[2]);
2108 if (n_shared_elem != n_shared_elem_r) {
2112 for (j = 0; j < n_shared_elem; j++) {
2114 if (shared_elem_node_index_l[j+1] != shared_elem_node_index_r[j+1]) {
2118 for (k = shared_elem_node_index_l[j]; k < shared_elem_node_index_l[j+1]; k++) {
2119 if (shared_elem_node_item_l[k] != shared_elem_node_item_r[k]) {
2121 k - shared_elem_node_index_l[j] + 1, j+1);
2131 for (k = 0; k < nn; k++) {
2132 nid = elem_nodes[k];
2134 ref_mesh->
node[3*(nid-1)], ref_mesh->
node[3*(nid-1)+1], ref_mesh->
node[3*(nid-1)+2]);
2144 if (shared_elem_node_index_r !=
NULL)
HECMW_free(shared_elem_node_index_r);
2145 if (shared_elem_node_item_r !=
NULL)
HECMW_free(shared_elem_node_item_r);
2162 snprintf(fname,
sizeof(fname),
"shared_%d_%d.inp",
mesh->
my_rank, irank);
2164 fp = fopen(fname,
"w");
2168 fprintf(fp,
"%d %d 1 1 0\n", n_shared_node, n_shared_elem);
2169 for (j = 0; j < n_shared_node; j++) {
2171 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]);
2173 for (j = 0; j < n_shared_elem; j++) {
2178 int *index_ucd = conv_index_ucd2hec(etype);
2181 for (k = 0; k < nn; k++) {
2182 if (index_ucd[k] < 0)
continue;
2183 nid = elem_nodes[index_ucd[k]];
2184 for (l = 0; l < n_shared_node; l++) {
2187 fprintf(fp,
" %d", l+1);
2199 int *n_shared_nodes;
2206 int n_error = 0, n_error_g;
2207 int i, j, k, irank, tag, nid, rank;
2224 if (n_shared_nodes ==
NULL) {
2231 if (shared_nodes ==
NULL) {
2238 if (shared_ranks ==
NULL) {
2244 if (send_buf ==
NULL) {
2252 if (requests ==
NULL) {
2258 if (statuses ==
NULL) {
2281 for (k = 0; k < nn; k++) {
2298 send_buf[4*i+3] = n_shared_nodes[i];
2312 if (recv_buf[0] != send_buf[4*i]) {
2314 "number of shared elements %d not match with %d in rank %d\n",
2315 send_buf[4*i], recv_buf[0], irank);
2318 if (recv_buf[1] != send_buf[4*i+1]) {
2320 "number of refined shared elements %d not match with %d in rank %d\n",
2321 send_buf[4*i+1], recv_buf[1], irank);
2323 if (recv_buf[2] != send_buf[4*i+2]) {
2325 "number of new shared nodes before rmdup %d not match with %d in rank %d\n",
2326 send_buf[4*i+2], recv_buf[2], irank);
2329 if (recv_buf[3] != send_buf[4*i+3]) {
2331 "number of new shared nodes %d not match with %d in rank %d\n",
2332 send_buf[4*i+3], recv_buf[3], irank);
2334 write_elem_with_mismatching_refinement(mesh, ref_mesh, shared, shared_nodes, i);
2335 write_refined_shared_in_ucd(mesh, ref_mesh, shared, shared_nodes, i);
2353 for (j = 0; j < n_shared_nodes[i]; j++) {
2355 rank = ref_mesh->
node_ID[2 * (nid - 1) + 1];
2368 int *recv_ranks = (
int *)
HECMW_malloc(
sizeof(
int) * n_shared_nodes[i]);
2369 if (recv_ranks ==
NULL) {
2378 for (j = 0; j < n_shared_nodes[i]; j++) {
2381 "rank of new shared node %d: %d not match with %d in rank %d\n",
2411 static int count_internal(
int my_rank,
int n,
int *ID) {
2413 for (i = 0; i < n; i++) {
2414 if (ID[2 * i + 1] == my_rank) {
2415 ID[2 * i] = ++count;
2421 static int count_purely_external(
int n,
int *ID) {
2423 for (i = 0; i < n; i++) {
2424 if (ID[2 * i + 1] < 0) {
2431 static int *new_internal_list(
int my_rank,
int n,
int n_internal,
int *ID) {
2435 internal_list = (
int *)
HECMW_malloc(
sizeof(
int) * n_internal);
2436 if (internal_list ==
NULL) {
2441 for (i = 0, k = 0; i < n; i++) {
2442 if (ID[2 * i + 1] == my_rank) {
2443 internal_list[k] = i + 1;
2447 return internal_list;
2451 int **index,
int **item) {
2456 if (*index ==
NULL) {
2461 for (i = 0; i < n; i++) {
2463 if ((*index)[i + 1] < (*index)[i]) {
2465 "Integer overflow detected while creating index array\n");
2471 if ((*index)[n] == 0) {
2475 *item = (
int *)
HECMW_malloc(
sizeof(
int) * (*index)[n]);
2476 if (*item ==
NULL) {
2481 for (i = 0; i < n; i++) {
2499 if (new_shared ==
NULL) {
2505 if (new_export ==
NULL) {
2511 if (new_import ==
NULL) {
2534 int etype = ref_mesh->
elem_type[eid - 1];
2537 int myrank_included = 0;
2538 int rank_i_included = 0;
2545 for (k = 0; k < nn; k++) {
2546 int rank = ref_mesh->
node_ID[2 * (elem_nodes[k] - 1) + 1];
2550 if (rank < 0) rank = -rank - 1;
2552 if (rank < min_rank) min_rank = rank;
2555 myrank_included = 1;
2557 }
else if (rank == rank_i) {
2558 rank_i_included = 1;
2562 HECMW_assert(0 <= min_rank && min_rank < mesh->n_subdomain);
2564 ref_mesh->
elem_ID[2 * (eid - 1) + 1] = min_rank;
2571 if (myrank_included && rank_i_included) {
2575 }
else if (myrank_included == 0) {
2578 ref_mesh->
elem_ID[2 * (eid - 1) + 1] = -min_rank - 1;
2676 static int mark_purely_external_nodes(
int my_rank,
2690 int rank = ref_mesh->
node_ID[2 * i + 1];
2691 if (rank == my_rank || rank < 0)
continue;
2695 ref_mesh->
node_ID[2 * i + 1] = -rank - 1;
2711 return rebuild_comm_tables_serial(mesh, ref_mesh);
2720 "Partitioning-type must be node-based for refinement.\n");
2727 if (shared ==
NULL) {
2734 if (get_refined_shared(mesh, ref_mesh, shared) !=
HECMW_SUCCESS) {
2739 if (determine_node_rank(mesh, shared, ref_mesh) !=
HECMW_SUCCESS) {
2744 if (check_node_rank(mesh, shared, ref_mesh) !=
HECMW_SUCCESS) {
2756 if (new_shared_export_import(mesh, shared, ref_mesh) !=
HECMW_SUCCESS) {
2804 int i, irank, js, je, len, tag, nsend;
2809 int n_error = 0, n_error_g;
2825 if (send_buf == 0) {
2832 if (requests ==
NULL) {
2838 if (statuses ==
NULL) {
2849 send_buf[i] = je - js;
2861 if (len != je - js) {
2863 "inconsistent length of import (%d) with export on rank %d (%d)\n",
2875 if (irank < ref_mesh->my_rank)
continue;
2878 send_buf[i] = je - js;
2886 if (ref_mesh->
my_rank < irank)
continue;
2892 if (len != je - js) {
2894 "inconsistent length of shared (%d) with rank %d (%d)\n",
2914 int *sendbuf, *recvbuf, *srbuf;
2915 int i, j, irank, js, je, len, nid, tag, nsend, rank, lid;
2916 int *item_p, *sendbuf_p, *recvbuf_p, *srbuf_p;
2929 if (requests ==
NULL) {
2935 if (statuses ==
NULL) {
2945 if (sendbuf ==
NULL) {
2955 sendbuf_p = sendbuf + js;
2956 for (j = 0; j < len; j++) {
2957 nid = item_p[j] - 1;
2958 lid = ref_mesh->
node_ID[2 * nid];
2971 if (recvbuf ==
NULL) {
2981 recvbuf_p = recvbuf + js;
2986 for (j = 0; j < len; j++) {
2987 nid = item_p[j] - 1;
2990 ref_mesh->
node_ID[2 * nid] = lid;
3002 if (srbuf ==
NULL) {
3009 if (irank < ref_mesh->my_rank)
continue;
3013 srbuf_p = srbuf + js;
3015 for (j = 0; j < len; j++) {
3016 nid = item_p[j] - 1;
3017 rank = ref_mesh->
elem_ID[2 * nid + 1];
3018 lid = ref_mesh->
elem_ID[2 * nid];
3019 if (rank == ref_mesh->
my_rank && lid > 0) {
3033 if (ref_mesh->
my_rank < irank)
continue;
3037 srbuf_p = srbuf + js;
3043 for (j = 0; j < len; j++) {
3045 if (lid < 0)
continue;
3046 nid = item_p[j] - 1;
3047 rank = ref_mesh->
elem_ID[2 * nid + 1];
3049 if (rank < 0)
continue;
3050 ref_mesh->
elem_ID[2 * nid] = lid;
3068 const int *ro_item_v;
3069 int n_refine, offset, cnt, cnt2, i, j;
3076 if (ref_reforg ==
NULL) {
3086 ref_reforg->
index[0] = 0;
3087 for (i = 1; i < n_refine; i++) {
3090 ref_reforg->
index[n_refine] =
3091 ref_reforg->
index[n_refine - 1] + ref_mesh->
n_node;
3102 for (i = 1; i <= ref_reforg->
index[n_refine - 1]; i++) {
3105 offset = ref_reforg->
index[n_refine - 1];
3111 for (i = 0; i < ref_mesh->
n_node; i++) {
3114 if (iold < mesh->n_node_gross) {
3121 int orig_type_rcap = rcapGetOriginal(iold + 1, original);
3124 nn = get_rcap_elem_max_node(orig_type_rcap);
3125 for (j = 0; j < nn; j++) {
3126 int org = original[j];
3132 ref_reforg->
item_index[offset + i + 1] = cnt;
3143 for (i = 0; i < cnt; i++) {
3149 for (i = 0; i < cnt2; i++) {
3150 ref_reforg->
item_item[cnt + i] = ro_item_v[i];
3154 fprintf(stderr,
"refine_origin->index:\n");
3155 for( i=0; i <= n_refine; i++ ) {
3156 fprintf(stderr,
" %d", ref_reforg->
index[i]);
3157 if( i % 10 == 9 ) fprintf(stderr,
"\n");
3159 if( i % 10 != 0 ) fprintf(stderr,
"\n");
3160 fprintf(stderr,
"refine_origin->item_index:\n");
3161 for( i=0; i <= ref_reforg->
index[n_refine]; i++) {
3162 fprintf(stderr,
" %d", ref_reforg->
item_index[i]);
3163 if( i % 10 == 9 ) fprintf(stderr,
"\n");
3165 if( i % 10 != 0 ) fprintf(stderr,
"\n");
3166 fprintf(stderr,
"refine_origin->item_item:\n");
3167 for( i=0; i < ref_reforg->
item_index[ref_reforg->
index[n_refine]]; i++ ) {
3168 fprintf(stderr,
" %d", ref_reforg->
item_item[i]);
3169 if( i % 10 == 9 ) fprintf(stderr,
"\n");
3171 if( i % 10 != 0 ) fprintf(stderr,
"\n");
3202 if (rebuild_n_node_refine_hist(mesh, ref_mesh) !=
HECMW_SUCCESS)
3229 if (renumber_nodes_generate_tables(ref_mesh) !=
HECMW_SUCCESS)
3231 if (renumber_elements_generate_tables(ref_mesh) !=
HECMW_SUCCESS)
3341 int etype, ierror, ndiv, nelem;
3343 ndiv = get_elem_ndiv(etype, &ierror);
3454 for (i = 0; i < sect->
n_sect; i++) {
3464 for (i = 0; i < sect->
n_sect; i++) {
3475 for (i = 0; i < sect->
n_sect + 1; i++) {
3499 for (i = 0; i < sect->
n_sect + 1; i++) {
3523 for (i = 0; i < sect->
n_sect + 1; i++) {
3549 if (mat->
n_mat == 0) {
3572 for (i = 0; i < mat->
n_mat; i++) {
3586 for (i = 0; i < mat->
n_mat + 1; i++) {
3635 static int copy_mpc_info(
const struct hecmwST_mpc *mpc,
3641 if (mpc->
n_mpc == 0) {
3668 for ( i = 0; i < mpc->
n_mpc + 1; i++ ) {
3708 for ( i = 0; i < mpc->
n_mpc; i++ ) {
3722 if (amp->
n_amp <= 0) {
3744 for (i = 0; i < amp->
n_amp; i++) {
3758 for (i = 0; i < amp->
n_amp; i++) {
3768 for (i = 0; i < amp->
n_amp; i++) {
3778 for (i = 0; i < amp->
n_amp; i++) {
3788 for (i = 0; i < amp->
n_amp + 1; i++) {
3829 for (i = 0; i < cp->
n_pair; i++) {
3843 for (i = 0; i < cp->
n_pair; i++) {
3853 for (i = 0; i < cp->
n_pair; i++) {
3863 for (i = 0; i < cp->
n_pair; i++) {
3873 for (i = 0; i < cp->
n_pair; i++) {
3912 int count_in, count_ex, count_pex;
3913 int *old2new, *new2old;
3920 if (old2new ==
NULL) {
3925 if (new2old ==
NULL) {
3935 old2new[i] = count_in;
3936 new2old[count_in] = i;
3938 }
else if (rank >= 0) {
3939 old2new[i] = count_ex;
3940 new2old[count_ex] = i;
3943 old2new[i] = count_pex;
3944 new2old[count_pex] = i;
3972 if (new_node_ID ==
NULL) {
3977 int old = new2old[i];
3979 new_node_ID[2 * i + 1] =
mesh->
node_ID[2 * old + 1];
3986 int *new_global_node_ID =
3988 if (new_global_node_ID ==
NULL) {
3993 int old = new2old[i];
4003 if (new_node ==
NULL) {
4008 int old = new2old[i];
4010 for (j = 0; j < 3; j++) new_node[3 * i + j] =
mesh->
node[3 * old + j];
4018 int *new_node_init_val_index =
4020 if (new_node_init_val_index ==
NULL) {
4024 new_node_init_val_index[0] = 0;
4026 int old = new2old[i];
4029 new_node_init_val_index[i + 1] = new_node_init_val_index[i] + ninit;
4034 double *new_node_init_val_item = (
double *)
HECMW_malloc(
4036 if (new_node_init_val_item ==
NULL) {
4041 int old = new2old[i];
4042 int idx_new = new_node_init_val_index[i];
4046 for (j = 0; j < ninit; j++) {
4047 new_node_init_val_item[idx_new + j] =
4066 int new = old2new[old - 1] + 1;
4073 int new = old2new[old - 1] + 1;
4079 int new = old2new[old - 1] + 1;
4085 int new = old2new[old - 1] + 1;
4091 int new = old2new[old - 1] + 1;
4097 static int delete_external_items(
int n_elem,
int n_grp,
int *
index,
int *item,
4102 for (i = 0; i < n_grp; i++) {
4103 int end =
index[i + 1];
4104 for (j = start; j < end; j++) {
4105 if (item[j * n_memb] > n_elem) {
4108 for (k = 0; k < n_memb; k++)
4109 item[(j - n_del) * n_memb + k] = item[j * n_memb + k];
4114 index[i + 1] = end - n_del;
4119 static int delete_external_equations(
int n_node,
struct hecmwST_mpc *mpc) {
4120 int iold, inew, jold, jnew;
4123 int *mpc_index_new, *mpc_item_new, *mpc_dof_new;
4124 double *mpc_val_new, *mpc_const_new;
4126 if (active_eqn ==
NULL) {
4131 for (iold = 0; iold < mpc->
n_mpc; iold++) {
4133 for (jold = mpc->
mpc_index[iold]; jold < mpc->mpc_index[iold+1]; jold++) {
4134 if (mpc->
mpc_item[jold] > n_node) {
4140 active_eqn[n_mpc_new] = iold;
4144 mpc_index_new = (
int *)
HECMW_malloc(
sizeof(
int) * (n_mpc_new + 1));
4145 if (mpc_index_new ==
NULL) {
4149 mpc_index_new[0] = 0;
4150 if (n_mpc_new == 0) {
4151 mpc_item_new =
NULL;
4154 mpc_const_new =
NULL;
4156 for (inew = 0; inew < n_mpc_new; inew++) {
4157 iold = active_eqn[inew];
4158 mpc_index_new[inew+1] = mpc_index_new[inew] + (mpc->
mpc_index[iold+1] - mpc->
mpc_index[iold]);
4160 mpc_item_new = (
int *)
HECMW_malloc(
sizeof(
int) * mpc_index_new[n_mpc_new]);
4161 if (mpc_item_new ==
NULL) {
4165 mpc_dof_new = (
int *)
HECMW_malloc(
sizeof(
int) * mpc_index_new[n_mpc_new]);
4166 if (mpc_dof_new ==
NULL) {
4170 mpc_val_new = (
double *)
HECMW_malloc(
sizeof(
double) * mpc_index_new[n_mpc_new]);
4171 if (mpc_val_new ==
NULL) {
4175 mpc_const_new = (
double *)
HECMW_malloc(
sizeof(
double) * n_mpc_new);
4176 if (mpc_const_new ==
NULL) {
4180 for (inew = 0; inew < n_mpc_new; inew++) {
4181 iold = active_eqn[inew];
4182 for (jold = mpc->
mpc_index[iold], jnew = mpc_index_new[inew]; jold < mpc->mpc_index[iold+1]; jold++, jnew++) {
4183 mpc_item_new[jnew] = mpc->
mpc_item[jold];
4184 mpc_dof_new[jnew] = mpc->
mpc_dof[jold];
4185 mpc_val_new[jnew] = mpc->
mpc_val[jold];
4187 mpc_const_new[inew] = mpc->
mpc_const[iold];
4191 mpc->
n_mpc = n_mpc_new;
4250 int count_rel, count_pex;
4251 int *old2new, *new2old;
4258 if (old2new ==
NULL) {
4263 if (new2old ==
NULL) {
4272 old2new[i] = count_rel;
4273 new2old[count_rel] = i;
4276 old2new[i] = count_pex;
4277 new2old[count_pex] = i;
4305 if (new_elem_ID ==
NULL) {
4310 int old = new2old[i];
4312 new_elem_ID[2 * i + 1] =
mesh->
elem_ID[2 * old + 1];
4319 int *new_global_elem_ID =
4321 if (new_global_elem_ID ==
NULL) {
4326 int old = new2old[i];
4335 if (new_elem_type ==
NULL) {
4340 int old = new2old[i];
4360 long long *new_elem_node_index =
4364 if (new_elem_node_index ==
NULL || new_elem_node_item ==
NULL) {
4368 new_elem_node_index[0] = 0;
4370 int old = new2old[i];
4372 new_elem_node_index[i + 1] = new_elem_node_index[i] + nn;
4375 int old = new2old[i];
4377 long long start_new = new_elem_node_index[i];
4378 long long nn = new_elem_node_index[i + 1] - start_new;
4380 for (j = 0; j < nn; j++)
4391 if (new_section_ID ==
NULL) {
4396 int old = new2old[i];
4404 int *new_emID_index, *new_emID_item;
4407 if (new_emID_index ==
NULL) {
4413 if (new_emID_item ==
NULL) {
4417 new_emID_index[0] = 0;
4419 int old, js_old, je_old, len, js_new, j;
4423 len = je_old - js_old;
4424 js_new = new_emID_index[i];
4425 new_emID_index[i + 1] = js_new + len;
4426 for (j = 0; j < len; j++) {
4442 int new = old2new[old - 1] + 1;
4448 int new = old2new[old - 1] + 1;
4454 int new = old2new[old - 1] + 1;
4460 int new = old2new[old - 1] + 1;
4553 int **memb_index,
int **memb_item) {
4559 *memb_index = (
int *)
HECMW_calloc(nn_int + 1,
sizeof(
int));
4560 if (*memb_index ==
NULL) {
4564 for (i = 1; i < grp->
n_grp; i++) {
4567 if (node <= nn_int) (*memb_index)[node]++;
4570 for (i = 0; i < nn_int; i++) (*memb_index)[i + 1] += (*memb_index)[i];
4572 *memb_item = (
int *)
HECMW_malloc(
sizeof(
int) * ((*memb_index)[nn_int] + 1));
4574 if (*memb_item ==
NULL || cnt ==
NULL) {
4578 for (i = 1; i < grp->
n_grp; i++) {
4581 if (node > nn_int)
continue;
4582 (*memb_item)[(*memb_index)[node - 1] + cnt[node - 1]] = i;
4597 const int *nb_flag,
const int *memb_index,
4598 const int *memb_item,
4600 double **dbuf,
int *dlen) {
4606 int i, j, k, node, n, ninit, d;
4609 for (i = 0; i < cp->
n_pair; i++) {
4611 if (!nb_flag[i] || !is_node_slave_pair(cp, i))
continue;
4613 for (j = grp->
grp_index[gid - 1]; j < grp->grp_index[gid]; j++) {
4619 for (i = 0; i < nn_int; i++) {
4627 for (k = 0; k < n; k++) {
4637 for (j = memb_index[node - 1]; j < memb_index[node]; j++) {
4644 *dbuf = (
double *)
HECMW_malloc(
sizeof(
double) * (*dlen + 1));
4645 if (*dbuf ==
NULL) {
4650 for (k = 0; k < n; k++) {
4652 for (j = 0; j < 3; j++) (*dbuf)[d++] =
mesh->
node[3 * (node - 1) + j];
4655 j < mesh->node_init_val_index[node]; j++) {
4665 struct added_nodes {
4671 int n_coord, n_init;
4681 int rank,
const int *ibuf,
4682 const double *dbuf,
int dlen,
4683 struct added_nodes *added,
4686 int i, j, k, ip, dp, lid, nmemb, ninit, max_lid;
4690 added->coord,
sizeof(
double) * (added->n_coord + 3 * n + 1));
4692 added->init,
sizeof(
double) * (added->n_init + dlen - 3 * n + 1));
4693 if (added->coord ==
NULL || added->init ==
NULL) {
4700 for (ip = 1, k = 0; k < n; k++) {
4702 if (lid > max_lid) max_lid = lid;
4703 ip += 3 + ibuf[ip + 2] + 1;
4705 lid2node = (
int *)
HECMW_malloc(
sizeof(
int) * (max_lid + 1));
4706 if (lid2node ==
NULL) {
4710 for (i = 0; i <= max_lid; i++) lid2node[i] = -1;
4714 if (lid <= max_lid) lid2node[lid] = i;
4717 for (ip = 1, dp = 0, k = 0; k < n; k++) {
4719 nmemb = ibuf[ip + 2];
4720 ninit = ibuf[ip + 3 + nmemb];
4721 if (lid2node[lid] < 0) {
4726 for (j = 0; j < nmemb; j++) {
4731 for (j = 0; j < 3; j++) added->coord[added->n_coord++] = dbuf[dp + j];
4732 for (j = 0; j < ninit; j++) {
4733 added->init[added->n_init++] = dbuf[dp + 3 + j];
4737 ip += 3 + nmemb + 1;
4746 const struct added_nodes *added,
4752 int ng_new = ng_old + n_add;
4761 #define SHIFTED(node) ((node) > nn_old ? (node) + n_add : (node))
4764 double *new_node = (
double *)
HECMW_malloc(
sizeof(
double) * ng_new * 3);
4765 int *new_node_ID = (
int *)
HECMW_malloc(
sizeof(
int) * ng_new * 2);
4766 int *new_global_ID = (
int *)
HECMW_malloc(
sizeof(
int) * ng_new);
4767 if (new_node ==
NULL || new_node_ID ==
NULL || new_global_ID ==
NULL) {
4771 for (i = 0; i < ng_old; i++) {
4772 int inew = SHIFTED(i + 1) - 1;
4773 for (j = 0; j < 3; j++) new_node[3 * inew + j] =
mesh->
node[3 * i + j];
4775 new_node_ID[2 * inew + 1] =
mesh->
node_ID[2 * i + 1];
4778 for (k = 0; k < n_add; k++) {
4779 int inew = nn_old + k;
4780 for (j = 0; j < 3; j++) new_node[3 * inew + j] = added->coord[3 * k + j];
4782 new_node_ID[2 * inew + 1] =
4796 int *new_index = (
int *)
HECMW_malloc(
sizeof(
int) * (ng_new + 1));
4799 if (new_index ==
NULL || new_val ==
NULL) {
4804 for (i = 0; i < ng_new; i++) {
4805 if (i < nn_old || i >= nn_old + n_add) {
4806 int iold = i < nn_old ? i : i - n_add;
4808 j < mesh->node_init_val_index[iold + 1]; j++) {
4815 new_val[pos++] = added->init[j];
4818 new_index[i + 1] = pos;
4842 int *new_item = (
int *)
HECMW_malloc(
sizeof(
int) * (n_item + 1));
4844 if (new_index ==
NULL || new_item ==
NULL) {
4849 for (i = 0; i < grp->
n_grp; i++) {
4851 new_item[pos++] = SHIFTED(grp->
grp_item[j]);
4853 for (k = 0; k < n_add; k++) {
4856 int in_grp = (i == 0);
4857 for (j = js; j < je && !in_grp; j++) {
4860 if (in_grp) new_item[pos++] = nn_old + k + 1;
4862 new_index[i + 1] = pos;
4874 int *new_imp_index, *new_imp_item, *new_exp_index, *new_exp_item;
4877 new_imp_index = (
int *)
HECMW_malloc(
sizeof(
int) * (n_nb + 1));
4878 new_imp_item = (
int *)
HECMW_malloc(
sizeof(
int) * (n_imp + 1));
4879 new_exp_index = (
int *)
HECMW_malloc(
sizeof(
int) * (n_nb + 1));
4880 new_exp_item = (
int *)
HECMW_malloc(
sizeof(
int) * (n_exp + 1));
4881 if (new_imp_index ==
NULL || new_imp_item ==
NULL ||
4882 new_exp_index ==
NULL || new_exp_item ==
NULL) {
4886 new_imp_index[0] = 0;
4887 for (pos = 0, i = 0; i < n_nb; i++) {
4894 new_imp_index[i + 1] = pos;
4896 new_exp_index[0] = 0;
4897 for (pos = 0, i = 0; i < n_nb; i++) {
4904 new_exp_index[i + 1] = pos;
4917 int *old2new = (
int *)
HECMW_malloc(
sizeof(
int) * ng_new);
4918 int *new2old = (
int *)
HECMW_malloc(
sizeof(
int) * ng_new);
4919 if (old2new ==
NULL || new2old ==
NULL) {
4923 for (i = 0; i < ng_old; i++) {
4926 for (k = 0; k < n_add; k++) old2new[ng_old + k] = nn_old + k;
4927 for (i = 0; i < ng_new; i++) new2old[old2new[i]] = i;
4940 reforg->
item_index,
sizeof(
int) * (last + n_add + 1));
4945 for (k = 1; k <= n_add; k++) reforg->
item_index[last + k] = count;
4963 int *my_flag, *nb_flag, *len_send, *len_recv;
4964 int *memb_index, *memb_item;
4967 struct added_nodes added;
4968 int i, k, n_node_pair, tag, n_add, n_add_prev;
4974 for (n_node_pair = 0, i = 0; i < n_pair; i++) {
4975 if (is_node_slave_pair(cp, i)) n_node_pair++;
4985 nb_flag = (
int *)
HECMW_malloc(
sizeof(
int) * n_pair * n_nb);
4986 len_send = (
int *)
HECMW_malloc(
sizeof(
int) * n_nb * 2);
4987 len_recv = (
int *)
HECMW_malloc(
sizeof(
int) * n_nb * 2);
4990 dbuf = (
double **)
HECMW_malloc(
sizeof(
double *) * n_nb * 2);
4993 if (requests ==
NULL || statuses ==
NULL || my_flag ==
NULL ||
4994 nb_flag ==
NULL || len_send ==
NULL || len_recv ==
NULL ||
4999 lid_added = imp_added + n_nb;
5000 exp_added = imp_added + n_nb * 2;
5005 for (i = 0; i < n_pair; i++) {
5006 my_flag[i] = is_node_slave_pair(cp, i) && has_internal_master(mesh, i);
5009 for (i = 0; i < n_nb; i++) {
5013 for (i = 0; i < n_nb; i++) {
5015 tag, comm, statuses + i);
5020 if (get_internal_node_membership(mesh, &memb_index, &memb_item) !=
5023 for (i = 0; i < n_nb; i++) {
5024 if (pack_contact_slave_nodes(mesh, nb_flag + n_pair * i, memb_index,
5025 memb_item, ibuf + i, dbuf + i,
5032 for (i = 0; i < n_nb; i++) {
5034 comm, requests + i);
5036 for (i = 0; i < n_nb; i++) {
5041 for (i = 0; i < n_nb; i++) {
5058 for (i = 0; i < n_nb; i++) {
5061 (
double *)
HECMW_malloc(
sizeof(
double) * (len_recv[2 * i + 1] + 1));
5062 if (dbuf[n_nb + i] ==
NULL) {
5073 dbuf[n_nb + i], len_recv[2 * i + 1],
5077 for (k = n_add_prev; k < n_add; k++) {
5084 for (i = 0; i < n_nb; i++) {
5089 for (i = 0; i < n_nb; i++) {
5094 for (i = 0; i < n_nb; i++) {
5098 for (i = 0; i < n_nb; i++) {
5105 if (insert_external_nodes(mesh, &added, imp_added, exp_added) !=
5109 for (i = 0; i < n_nb * 2; i++) {
5158 const char *cad_filename,
const char *part_filename) {
5166 if ((*mesh)->n_refine > 0) {
5171 if (prepare_refiner(*mesh, cad_filename, part_filename) !=
HECMW_SUCCESS)
5174 for (i = 0; i < refine; i++) {
5176 if (ref_mesh ==
NULL) {
5214 const char *cad_filename,
const char *part_filename) {
int HECMW_bit_array_init(struct hecmw_bit_array *ba, size_t len)
int HECMW_bit_array_get(struct hecmw_bit_array *ba, size_t index)
void HECMW_bit_array_set(struct hecmw_bit_array *ba, size_t index)
void HECMW_bit_array_finalize(struct hecmw_bit_array *ba)
int HECMW_Isend(void *buffer, int count, HECMW_Datatype datatype, int dest, int tag, HECMW_Comm comm, HECMW_Request *request)
int HECMW_Waitall(int count, HECMW_Request *array_of_requests, HECMW_Status *array_of_statuses)
HECMW_Comm HECMW_comm_get_comm(void)
int HECMW_Allreduce(void *sendbuf, void *recvbuf, int count, HECMW_Datatype datatype, HECMW_Op op, HECMW_Comm comm)
int HECMW_comm_get_rank(void)
int HECMW_Recv(void *buffer, int count, HECMW_Datatype datatype, int source, int tag, HECMW_Comm comm, HECMW_Status *status)
int HECMW_comm_get_size(void)
int HECMW_Allgather(void *sendbuf, int sendcount, HECMW_Datatype sendtype, void *recvbuf, int recvcount, HECMW_Datatype recvtype, HECMW_Comm comm)
#define HECMW_ETYPE_TET1_4
#define HECMW_ETYPE_ROD31
#define HECMW_MAX_NODE_MAX
#define HECMW_ETYPE_HEX1_4
MPI_Request HECMW_Request
int HECMW_partcontact_get_owner(int flag_partcontact)
struct hecmwST_local_mesh * HECMW_dist_alloc()
void HECMW_dist_free(struct hecmwST_local_mesh *mesh)
int HECMW_dist_refine(struct hecmwST_local_mesh **mesh, int refine, const char *cad_filename, const char *part_filename)
struct hecmwST_local_mesh * mesh
int HECMW_set_error(int errorno, const char *fmt,...)
int HECMW_get_max_node(int etype)
int HECMW_is_etype_33struct(int etype)
int HECMW_is_etype_link(int etype)
int HECMW_is_etype_surface(int etype)
int HECMW_is_etype_truss(int etype)
char * HECMW_get_ucd_label(int etype)
int HECMW_is_etype_patch(int etype)
int HECMW_is_etype_beam(int etype)
int HECMW_is_etype_solid(int etype)
int HECMW_is_etype_shell(int etype)
int HECMW_is_etype_rod(int etype)
int HECMW_log(int loglv, const char *fmt,...)
#define HECMW_calloc(nmemb, size)
#define HECMW_realloc(ptr, size)
#define HECMW_malloc(size)
int HECMW_set_int_iter_next(struct hecmw_set_int *set, int *value)
void HECMW_set_int_finalize(struct hecmw_set_int *set)
int HECMW_set_int_add(struct hecmw_set_int *set, int value)
int HECMW_set_int_init(struct hecmw_set_int *set)
void HECMW_set_int_iter_init(struct hecmw_set_int *set)
size_t HECMW_set_int_check_dup(struct hecmw_set_int *set)
#define HECMW_FLAG_PARTTYPE_UNKNOWN
#define HECMW_CONTACT_TYPE_NODE_SURF
#define HECMW_CONTACT_TYPE_NODE_ELEM
#define HECMW_FLAG_PARTCONTACT_OWNER_MASTER
#define HECMW_FLAG_PARTTYPE_NODEBASED
void HECMW_abort(HECMW_Comm comm)
#define HECMW_assert(cond)
int HECMW_varray_int_rmdup(struct hecmw_varray_int *varray)
size_t HECMW_varray_int_nval(const struct hecmw_varray_int *varray)
int * HECMW_varray_int_get_v(struct hecmw_varray_int *varray)
int HECMW_varray_int_get(const struct hecmw_varray_int *varray, size_t index)
int HECMW_varray_int_init(struct hecmw_varray_int *varray)
void HECMW_varray_int_finalize(struct hecmw_varray_int *varray)
const int * HECMW_varray_int_get_cv(const struct hecmw_varray_int *varray)
int HECMW_varray_int_append(struct hecmw_varray_int *varray, int value)
int HECMW_varray_int_cat(struct hecmw_varray_int *varray, const struct hecmw_varray_int *varray2)
int HECMW_varray_int_resize(struct hecmw_varray_int *varray, size_t len)
int * amp_type_definition
struct hecmwST_section * section
int * adapt_children_item
int * adapt_children_index
struct hecmwST_amplitude * amp
struct hecmwST_material * material
struct hecmwST_refine_origin * refine_origin
struct hecmwST_node_grp * node_group
double * node_init_val_item
struct hecmwST_contact_pair * contact_pair
struct hecmwST_surf_grp * surf_group
long long * elem_node_index
char gridfile[HECMW_FILENAME_LEN+1]
char header[HECMW_HEADER_LEN+1]
int hecmw_flag_partcontact
struct hecmwST_elem_grp * elem_group
int * node_init_val_index
int * when_i_was_refined_node
int * when_i_was_refined_elem