14 #define MASK_BIT(map, bit) ((map) |= (bit))
15 #define EVAL_BIT(map, bit) ((map) & (bit))
16 #define INV_BIT(map, bit) ((map) ^= (bit))
17 #define CLEAR_BIT(map, bit) \
22 #define BIT_DOF_THREE 2
24 #define BIT_DOF_FOUR 8
25 #define BIT_DOF_ALL (BIT_DOF_TWO | BIT_DOF_THREE | BIT_DOF_SIX | BIT_DOF_FOUR)
27 #define HECMW_COMMON_EQUATION_BLOCK_NAME "EQUATION_BLOCK"
29 #define NEIGHBOR_RANK 2
36 #define dw_node_flag(ptr, nmemb) dw_node_flag_(ptr, nmemb, __FILE__, __LINE__)
38 #define dw_node_flag(ptr, nmemb) ((void)0)
79 old = local_mesh->
node;
82 for (i = 0; i < local_mesh->
n_node; i++) {
83 new[3 * i] = old[3 * (node_new2old[i] - 1)];
84 new[3 * i + 1] = old[3 * (node_new2old[i] - 1) + 1];
85 new[3 * i + 2] = old[3 * (node_new2old[i] - 1) + 2];
88 local_mesh->
node =
new;
112 for (i = 0; i < local_mesh->
n_node; i++) {
113 new[2 * i] = old[2 * (node_new2old[i] - 1)];
114 new[2 * i + 1] = old[2 * (node_new2old[i] - 1) + 1];
141 for (i = 0; i < local_mesh->
n_node; i++) {
142 new[i] = old[node_new2old[i] - 1];
157 int *new_index, *old_index;
158 double *new_item, *old_item;
164 if (new_index ==
NULL) {
170 if (new_item ==
NULL) {
180 for (counter = 0, i = 0; i < local_mesh->
n_node; i++) {
181 old_id = node_new2old[i];
183 for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
184 new_item[counter++] = old_item[j];
186 new_index[i + 1] = counter;
220 if (!local_mesh->
mpc->
n_mpc)
return 0;
243 j < local_mesh->node_group->grp_index[i + 1]; j++) {
257 int *node_new2old,
int *node_old2new) {
259 if (old2new_node(local_mesh, node_new2old))
return -1;
262 if (old2new_node_ID(local_mesh, node_new2old))
return -1;
265 if (old2new_global_node_ID(local_mesh, node_new2old))
return -1;
269 if (old2new_node_init_val(local_mesh, node_new2old))
return -1;
273 if (old2new_elem_node_item(local_mesh, node_old2new))
return -1;
277 if (old2new_mpc_item(local_mesh, node_old2new))
return -1;
282 if (old2new_node_grp_item(local_mesh, node_old2new))
return -1;
309 for (i = 0; i < local_mesh->
n_elem; i++) {
310 new[i] = local_mesh->
elem_type[elem_new2old[i] - 1];
325 int *new_index, *old_index;
326 int *new_item, *old_item;
332 if (new_index ==
NULL) {
338 if (new_item ==
NULL) {
348 for (counter = 0, i = 0; i < local_mesh->
n_elem; i++) {
349 old_id = elem_new2old[i];
351 for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
352 new_item[counter++] = old_item[j];
354 new_index[i + 1] = counter;
384 for (i = 0; i < local_mesh->
n_elem; i++) {
385 new[2 * i] = old[2 * (elem_new2old[i] - 1)];
386 new[2 * i + 1] = old[2 * (elem_new2old[i] - 1) + 1];
413 for (i = 0; i < local_mesh->
n_elem; i++) {
414 new[i] = old[elem_new2old[i] - 1];
441 for (i = 0; i < local_mesh->
n_elem; i++) {
442 new[i] = local_mesh->
section_ID[elem_new2old[i] - 1];
457 int *new_index, *old_index;
458 int *new_item, *old_item;
464 if (new_index ==
NULL) {
470 if (new_item ==
NULL) {
480 for (counter = 0, i = 0; i < local_mesh->
n_elem; i++) {
481 old_id = elem_new2old[i];
483 for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
484 new_item[counter++] = old_item[j];
486 new_index[i + 1] = counter;
552 int *elem_new2old,
int *elem_old2new) {
554 if (old2new_elem_type(local_mesh, elem_new2old))
return -1;
557 if (old2new_elem_node(local_mesh, elem_new2old))
return -1;
560 if (old2new_elem_ID(local_mesh, elem_new2old))
return -1;
563 if (old2new_global_elem_ID(local_mesh, elem_new2old))
return -1;
566 if (old2new_section_ID(local_mesh, elem_new2old))
return -1;
569 if (old2new_mat_ID(local_mesh, elem_new2old))
return -1;
572 if (old2new_elem_internal_list(local_mesh, elem_old2new))
return -1;
576 if (old2new_elem_grp_item(local_mesh, elem_old2new))
return -1;
581 if (old2new_surf_grp_item(local_mesh, elem_old2new))
return -1;
598 int n_eqn_block, eqn_block_idx;
604 eqn_block_idx = get_eqn_block_idx( local_mesh );
612 new_item = (
int *)
HECMW_calloc( n_eqn_block,
sizeof(
int) );
613 if( new_item ==
NULL ) {
618 for( js=0, i=grp->
grp_index[eqn_block_idx]; i<grp->
grp_index[eqn_block_idx+1]; i++ ) {
619 new_item[eqn_block_old2new[i-grp->
grp_index[eqn_block_idx]]] = grp->
grp_item[i] - js;
623 for( counter=0, i=0; i<n_eqn_block; i++ ) {
624 counter += new_item[i];
637 old2new_eqn_block_info(
struct hecmwST_local_mesh *local_mesh,
int *eqn_block_old2new )
640 if(old2new_eqn_block( local_mesh, eqn_block_old2new ))
return -1;
660 for (i = 0; i < local_mesh->
n_elem; i++) {
697 int *counter,
int *elem_new2old,
729 for (j = 0; j < local_mesh->
n_elem; j++) {
731 elem_new2old[elems] = j + 1;
732 elem_old2new[j] = elems + 1;
757 if (counter ==
NULL) {
763 if (elem_new2old ==
NULL) {
769 if (elem_old2new ==
NULL) {
775 if (count_each_elem_type(local_mesh, counter)) {
780 if (set_n_elem_type(local_mesh, counter)) {
785 if (set_elem_type_index(local_mesh, counter, elem_new2old, elem_old2new)) {
790 if (old2new_elem_info(local_mesh, elem_new2old, elem_old2new)) {
809 char *node_flag,
const int is,
const int ie,
810 const int n_comp,
const int n_dof) {
814 for (i = is; i < ie; i++) {
817 for (j = 0; j < n_comp; j++) {
819 MASK_BIT(node_flag[node - 1], n_dof);
965 if (mask_node_dof_inner(local_mesh, node_flag, is, ie, n_comp, n_dof))
976 char *node_flag,
int *node_new2old,
977 int *node_old2new,
char *dof_flag,
int *n_dof_tot) {
982 for (i = 0; i < local_mesh->
n_node; i++) {
984 node_old2new[i] = counter + 1;
985 node_new2old[counter] = i + 1;
995 for (i = 0; i < local_mesh->
n_node; i++) {
997 node_old2new[i] = counter + 1;
998 node_new2old[counter] = i + 1;
1008 for (i = 0; i < local_mesh->
n_node; i++) {
1010 node_old2new[i] = counter + 1;
1011 node_new2old[counter] = i + 1;
1021 for (i = 0; i < local_mesh->
n_node; i++) {
1023 node_old2new[i] = counter + 1;
1024 node_new2old[counter] = i + 1;
1044 char *node_flag,
char *block_flag,
const int eqn_block_idx )
1050 for( js=0, i=grp->
grp_index[eqn_block_idx]; i<grp->
grp_index[eqn_block_idx+1]; i++ ) {
1051 for( dof_max=0, j=js; j<grp->
grp_item[i]; j++ ) {
1066 char *node_flag,
char *block_flag,
1067 int *node_new2old,
int *node_old2new,
int *block_old2new,
1068 const int n_eqn_block,
const int eqn_block_idx,
1069 char *dof_flag,
int *n_dof_tot )
1073 int counter=0, blocks=0;
1077 for( js=0, i=0; i<n_eqn_block; i++ ) {
1079 block_old2new[i] = blocks++;
1081 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1082 node_old2new[j] = counter+1;
1083 node_new2old[counter] = j+1;
1095 for( js=0, i=0; i<n_eqn_block; i++ ) {
1097 block_old2new[i] = blocks++;
1099 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1100 node_old2new[j] = counter+1;
1101 node_new2old[counter] = j+1;
1113 for( js=0, i=0; i<n_eqn_block; i++ ) {
1115 block_old2new[i] = blocks++;
1117 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1118 node_old2new[j] = counter+1;
1119 node_new2old[counter] = j+1;
1131 for( js=0, i=0; i<n_eqn_block; i++ ) {
1133 block_old2new[i] = blocks++;
1135 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1136 node_old2new[j] = counter+1;
1137 node_new2old[counter] = j+1;
1156 char *node_flag,
int *node_new2old,
int *node_old2new,
1157 char *dof_flag,
int *n_dof_tot )
1162 int n_eqn_block, eqn_block_idx;
1165 eqn_block_idx = get_eqn_block_idx( local_mesh );
1166 if( eqn_block_idx < 0 ) {
1175 block_flag = (
char *)
HECMW_calloc( n_eqn_block,
sizeof(
char) );
1176 if( block_flag ==
NULL ) {
1181 block_old2new = (
int *)
HECMW_malloc(
sizeof(
int)*n_eqn_block );
1182 if( block_old2new ==
NULL ) {
1188 if(mask_eqn_block( local_mesh, node_flag, block_flag, eqn_block_idx ))
return -1;
1191 if(reorder_node_dof_4mpc_inner( local_mesh, node_flag, block_flag, node_new2old, node_old2new, block_old2new, n_eqn_block, eqn_block_idx, dof_flag, n_dof_tot ))
return -1;
1194 if(old2new_eqn_block_info( local_mesh, block_old2new ))
return -1;
1245 char *dof_flag,
int *n_dof_tot) {
1315 char dof_flag =
'\0';
1323 if (node_flag ==
NULL) {
1329 if (node_new2old ==
NULL) {
1335 if (node_old2new ==
NULL) {
1345 if (mask_node_dof(local_mesh, node_flag)) {
1367 if (reorder_node_dof(local_mesh, node_flag, node_new2old, node_old2new,
1368 &dof_flag, n_dof_tot)) {
1380 if (count_n_dof_grp(local_mesh, &dof_flag)) {
1384 if (create_node_dof_item(local_mesh, &dof_flag, n_dof_tot)) {
1389 if (old2new_node_info(local_mesh, node_new2old, node_old2new)) {
1408 int *mpc_node_flag,
int *mpc_index_flag) {
1409 int node, min_group, group;
1412 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1419 for (j = js; j < je; j++) {
1424 group = mpc_node_flag[node - 1];
1425 mpc_node_flag[node - 1] = (group < 0) ? i : group;
1428 min_group = (mpc_index_flag[mpc_node_flag[node - 1]] < min_group)
1429 ? mpc_index_flag[mpc_node_flag[node - 1]]
1434 for (j = js; j < je; j++) {
1436 group = mpc_node_flag[node - 1];
1438 mpc_index_flag[group] = min_group;
1440 mpc_index_flag[i] = min_group;
1444 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1445 group = mpc_index_flag[i];
1446 mpc_index_flag[i] = mpc_index_flag[group];
1457 int *mpc_index_flag,
int *mpc_group2block) {
1464 if (n_block ==
NULL) {
1470 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1471 block = mpc_index_flag[i];
1477 for (counter = 0, i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1478 if (n_block[i]) mpc_group2block[i] = counter++;
1496 int *mpc_node_flag) {
1499 for (i = 0; i < local_mesh->
n_node; i++) {
1500 if (mpc_node_flag[i] < 0) (eqn_block->
n_eqn_block)++;
1511 int *mpc_node_flag,
int *mpc_index_flag,
1512 int *mpc_group2block) {
1516 for (counter = eqn_block->
n_mpc_block, i = 0; i < local_mesh->n_node; i++) {
1517 if (mpc_node_flag[i] >= 0) {
1518 mpc_node_flag[i] = mpc_group2block[mpc_index_flag[mpc_node_flag[i]]];
1520 mpc_node_flag[i] = counter++;
1534 int *mpc_node_flag,
int *mpc_group2block) {
1540 if (n_block ==
NULL) {
1553 for (i = 0; i < local_mesh->
n_node; i++) {
1554 (n_block[mpc_node_flag[i]])++;
1577 int *mpc_node_flag,
int *node_old2new,
1578 int *node_new2old) {
1584 if (n_block ==
NULL) {
1589 for (i = 0; i < local_mesh->
n_node; i++) {
1591 n_block[mpc_node_flag[i]];
1592 node_old2new[i] = new_id + 1;
1593 node_new2old[new_id] = i + 1;
1594 (n_block[mpc_node_flag[i]])++;
1660 int *mpc_node_flag, *mpc_index_flag, *mpc_group2block;
1661 int *node_old2new, *node_new2old;
1665 if (local_mesh->
mpc->
n_mpc == 0)
return 0;
1669 if (mpc_node_flag ==
NULL) {
1673 for (i = 0; i < local_mesh->
n_node; i++) {
1674 mpc_node_flag[i] = -1;
1678 if (mpc_index_flag ==
NULL) {
1682 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1683 mpc_index_flag[i] = i;
1688 if (eqn_block ==
NULL) {
1694 if (set_mpc_block(local_mesh, mpc_node_flag, mpc_index_flag)) {
1700 if (mpc_group2block ==
NULL) {
1704 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) mpc_group2block[i] = -1;
1706 if (count_mpc_block(local_mesh, eqn_block, mpc_index_flag, mpc_group2block)) {
1711 if (count_eqn_block(local_mesh, eqn_block, mpc_node_flag)) {
1716 if (set_eqn_block_of_node(local_mesh, eqn_block, mpc_node_flag,
1717 mpc_index_flag, mpc_group2block)) {
1722 if (create_eqn_block_index(local_mesh, eqn_block, mpc_node_flag,
1732 if (node_old2new ==
NULL) {
1738 if (node_new2old ==
NULL) {
1743 if (create_old2new_node(local_mesh, eqn_block, mpc_node_flag, node_old2new,
1748 if (old2new_node_info(local_mesh, node_new2old, node_old2new)) {
1757 if (reconstruct_node_grp(local_mesh, eqn_block)) {