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 long long *new_index;
326 long long *old_index;
327 int *new_item, *old_item;
334 if (new_index ==
NULL) {
340 if (new_item ==
NULL) {
350 for (counter = 0, i = 0; i < local_mesh->
n_elem; i++) {
351 old_id = elem_new2old[i];
353 for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
354 new_item[counter++] = old_item[j];
356 new_index[i + 1] = counter;
386 for (i = 0; i < local_mesh->
n_elem; i++) {
387 new[2 * i] = old[2 * (elem_new2old[i] - 1)];
388 new[2 * i + 1] = old[2 * (elem_new2old[i] - 1) + 1];
415 for (i = 0; i < local_mesh->
n_elem; i++) {
416 new[i] = old[elem_new2old[i] - 1];
443 for (i = 0; i < local_mesh->
n_elem; i++) {
444 new[i] = local_mesh->
section_ID[elem_new2old[i] - 1];
459 int *new_index, *old_index;
460 int *new_item, *old_item;
466 if (new_index ==
NULL) {
472 if (new_item ==
NULL) {
482 for (counter = 0, i = 0; i < local_mesh->
n_elem; i++) {
483 old_id = elem_new2old[i];
485 for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
486 new_item[counter++] = old_item[j];
488 new_index[i + 1] = counter;
554 int *elem_new2old,
int *elem_old2new) {
556 if (old2new_elem_type(local_mesh, elem_new2old))
return -1;
559 if (old2new_elem_node(local_mesh, elem_new2old))
return -1;
562 if (old2new_elem_ID(local_mesh, elem_new2old))
return -1;
565 if (old2new_global_elem_ID(local_mesh, elem_new2old))
return -1;
568 if (old2new_section_ID(local_mesh, elem_new2old))
return -1;
571 if (old2new_mat_ID(local_mesh, elem_new2old))
return -1;
574 if (old2new_elem_internal_list(local_mesh, elem_old2new))
return -1;
578 if (old2new_elem_grp_item(local_mesh, elem_old2new))
return -1;
583 if (old2new_surf_grp_item(local_mesh, elem_old2new))
return -1;
600 int n_eqn_block, eqn_block_idx;
606 eqn_block_idx = get_eqn_block_idx( local_mesh );
614 new_item = (
int *)
HECMW_calloc( n_eqn_block,
sizeof(
int) );
615 if( new_item ==
NULL ) {
620 for( js=0, i=grp->
grp_index[eqn_block_idx]; i<grp->
grp_index[eqn_block_idx+1]; i++ ) {
621 new_item[eqn_block_old2new[i-grp->
grp_index[eqn_block_idx]]] = grp->
grp_item[i] - js;
625 for( counter=0, i=0; i<n_eqn_block; i++ ) {
626 counter += new_item[i];
639 old2new_eqn_block_info(
struct hecmwST_local_mesh *local_mesh,
int *eqn_block_old2new )
642 if(old2new_eqn_block( local_mesh, eqn_block_old2new ))
return -1;
662 for (i = 0; i < local_mesh->
n_elem; i++) {
699 int *counter,
int *elem_new2old,
731 for (j = 0; j < local_mesh->
n_elem; j++) {
733 elem_new2old[elems] = j + 1;
734 elem_old2new[j] = elems + 1;
759 if (counter ==
NULL) {
765 if (elem_new2old ==
NULL) {
771 if (elem_old2new ==
NULL) {
777 if (count_each_elem_type(local_mesh, counter)) {
782 if (set_n_elem_type(local_mesh, counter)) {
787 if (set_elem_type_index(local_mesh, counter, elem_new2old, elem_old2new)) {
792 if (old2new_elem_info(local_mesh, elem_new2old, elem_old2new)) {
811 char *node_flag,
const int is,
const int ie,
812 const int n_comp,
const int n_dof) {
817 for (i = is; i < ie; i++) {
820 for (j = 0; j < n_comp; j++) {
822 MASK_BIT(node_flag[node - 1], n_dof);
968 if (mask_node_dof_inner(local_mesh, node_flag, is, ie, n_comp, n_dof))
979 char *node_flag,
int *node_new2old,
980 int *node_old2new,
char *dof_flag,
int *n_dof_tot) {
985 for (i = 0; i < local_mesh->
n_node; i++) {
987 node_old2new[i] = counter + 1;
988 node_new2old[counter] = i + 1;
998 for (i = 0; i < local_mesh->
n_node; i++) {
1000 node_old2new[i] = counter + 1;
1001 node_new2old[counter] = i + 1;
1011 for (i = 0; i < local_mesh->
n_node; i++) {
1013 node_old2new[i] = counter + 1;
1014 node_new2old[counter] = i + 1;
1024 for (i = 0; i < local_mesh->
n_node; i++) {
1026 node_old2new[i] = counter + 1;
1027 node_new2old[counter] = i + 1;
1047 char *node_flag,
char *block_flag,
const int eqn_block_idx )
1053 for( js=0, i=grp->
grp_index[eqn_block_idx]; i<grp->
grp_index[eqn_block_idx+1]; i++ ) {
1054 for( dof_max=0, j=js; j<grp->
grp_item[i]; j++ ) {
1069 char *node_flag,
char *block_flag,
1070 int *node_new2old,
int *node_old2new,
int *block_old2new,
1071 const int n_eqn_block,
const int eqn_block_idx,
1072 char *dof_flag,
int *n_dof_tot )
1076 int counter=0, blocks=0;
1080 for( js=0, i=0; i<n_eqn_block; i++ ) {
1082 block_old2new[i] = blocks++;
1084 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1085 node_old2new[j] = counter+1;
1086 node_new2old[counter] = j+1;
1098 for( js=0, i=0; i<n_eqn_block; i++ ) {
1100 block_old2new[i] = blocks++;
1102 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1103 node_old2new[j] = counter+1;
1104 node_new2old[counter] = j+1;
1116 for( js=0, i=0; i<n_eqn_block; i++ ) {
1118 block_old2new[i] = blocks++;
1120 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1121 node_old2new[j] = counter+1;
1122 node_new2old[counter] = j+1;
1134 for( js=0, i=0; i<n_eqn_block; i++ ) {
1136 block_old2new[i] = blocks++;
1138 for( j=js; j<grp->
grp_item[idx+i]; j++ ) {
1139 node_old2new[j] = counter+1;
1140 node_new2old[counter] = j+1;
1159 char *node_flag,
int *node_new2old,
int *node_old2new,
1160 char *dof_flag,
int *n_dof_tot )
1165 int n_eqn_block, eqn_block_idx;
1168 eqn_block_idx = get_eqn_block_idx( local_mesh );
1169 if( eqn_block_idx < 0 ) {
1178 block_flag = (
char *)
HECMW_calloc( n_eqn_block,
sizeof(
char) );
1179 if( block_flag ==
NULL ) {
1184 block_old2new = (
int *)
HECMW_malloc(
sizeof(
int)*n_eqn_block );
1185 if( block_old2new ==
NULL ) {
1191 if(mask_eqn_block( local_mesh, node_flag, block_flag, eqn_block_idx ))
return -1;
1194 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;
1197 if(old2new_eqn_block_info( local_mesh, block_old2new ))
return -1;
1248 char *dof_flag,
int *n_dof_tot) {
1318 char dof_flag =
'\0';
1326 if (node_flag ==
NULL) {
1332 if (node_new2old ==
NULL) {
1338 if (node_old2new ==
NULL) {
1348 if (mask_node_dof(local_mesh, node_flag)) {
1370 if (reorder_node_dof(local_mesh, node_flag, node_new2old, node_old2new,
1371 &dof_flag, n_dof_tot)) {
1383 if (count_n_dof_grp(local_mesh, &dof_flag)) {
1387 if (create_node_dof_item(local_mesh, &dof_flag, n_dof_tot)) {
1392 if (old2new_node_info(local_mesh, node_new2old, node_old2new)) {
1411 int *mpc_node_flag,
int *mpc_index_flag) {
1412 int node, min_group, group;
1415 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1422 for (j = js; j < je; j++) {
1427 group = mpc_node_flag[node - 1];
1428 mpc_node_flag[node - 1] = (group < 0) ? i : group;
1431 min_group = (mpc_index_flag[mpc_node_flag[node - 1]] < min_group)
1432 ? mpc_index_flag[mpc_node_flag[node - 1]]
1437 for (j = js; j < je; j++) {
1439 group = mpc_node_flag[node - 1];
1441 mpc_index_flag[group] = min_group;
1443 mpc_index_flag[i] = min_group;
1447 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1448 group = mpc_index_flag[i];
1449 mpc_index_flag[i] = mpc_index_flag[group];
1460 int *mpc_index_flag,
int *mpc_group2block) {
1467 if (n_block ==
NULL) {
1473 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1474 block = mpc_index_flag[i];
1480 for (counter = 0, i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1481 if (n_block[i]) mpc_group2block[i] = counter++;
1499 int *mpc_node_flag) {
1502 for (i = 0; i < local_mesh->
n_node; i++) {
1503 if (mpc_node_flag[i] < 0) (eqn_block->
n_eqn_block)++;
1514 int *mpc_node_flag,
int *mpc_index_flag,
1515 int *mpc_group2block) {
1519 for (counter = eqn_block->
n_mpc_block, i = 0; i < local_mesh->n_node; i++) {
1520 if (mpc_node_flag[i] >= 0) {
1521 mpc_node_flag[i] = mpc_group2block[mpc_index_flag[mpc_node_flag[i]]];
1523 mpc_node_flag[i] = counter++;
1537 int *mpc_node_flag,
int *mpc_group2block) {
1543 if (n_block ==
NULL) {
1556 for (i = 0; i < local_mesh->
n_node; i++) {
1557 (n_block[mpc_node_flag[i]])++;
1580 int *mpc_node_flag,
int *node_old2new,
1581 int *node_new2old) {
1587 if (n_block ==
NULL) {
1592 for (i = 0; i < local_mesh->
n_node; i++) {
1594 n_block[mpc_node_flag[i]];
1595 node_old2new[i] = new_id + 1;
1596 node_new2old[new_id] = i + 1;
1597 (n_block[mpc_node_flag[i]])++;
1663 int *mpc_node_flag, *mpc_index_flag, *mpc_group2block;
1664 int *node_old2new, *node_new2old;
1668 if (local_mesh->
mpc->
n_mpc == 0)
return 0;
1672 if (mpc_node_flag ==
NULL) {
1676 for (i = 0; i < local_mesh->
n_node; i++) {
1677 mpc_node_flag[i] = -1;
1681 if (mpc_index_flag ==
NULL) {
1685 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) {
1686 mpc_index_flag[i] = i;
1691 if (eqn_block ==
NULL) {
1697 if (set_mpc_block(local_mesh, mpc_node_flag, mpc_index_flag)) {
1703 if (mpc_group2block ==
NULL) {
1707 for (i = 0; i < local_mesh->
mpc->
n_mpc; i++) mpc_group2block[i] = -1;
1709 if (count_mpc_block(local_mesh, eqn_block, mpc_index_flag, mpc_group2block)) {
1714 if (count_eqn_block(local_mesh, eqn_block, mpc_node_flag)) {
1719 if (set_eqn_block_of_node(local_mesh, eqn_block, mpc_node_flag,
1720 mpc_index_flag, mpc_group2block)) {
1725 if (create_eqn_block_index(local_mesh, eqn_block, mpc_node_flag,
1735 if (node_old2new ==
NULL) {
1741 if (node_new2old ==
NULL) {
1746 if (create_old2new_node(local_mesh, eqn_block, mpc_node_flag, node_old2new,
1751 if (old2new_node_info(local_mesh, node_new2old, node_old2new)) {
1760 if (reconstruct_node_grp(local_mesh, eqn_block)) {
#define HECMW_ETYPE_TET1_4
#define HECMW_ETYPE_TRI22
#define HECMW_MESH_DOF_SIX
#define HECMW_MESH_DOF_TOT
#define HECMW_MESH_DOF_THREE
#define HECMW_MESH_ETYPE_MAX
#define HECMW_COMMON_E_ALLOCATION
#define HECMW_MESH_DOF_TWO
#define HECMW_COMMON_E_OUT_OF_RANGE
#define HECMW_ETYPE_SPGDPT1
#define HECMW_ETYPE_ROD31
#define HECMW_COMMON_W_NO_EQN_BLOCK
#define HECMW_MESH_DOF_MAX
#define HECMW_ETYPE_HEX1_4
#define HECMW_ETYPE_TET22
#define HECMW_MESH_DOF_FOUR
int HECMW_set_error(int errorno, const char *fmt,...)
int HECMW_get_etype_UTIL2HECMW(int etype)
int HECMW_get_max_node(int etype)
int HECMW_get_etype_HECMW2UTIL(int etype)
#define HECMW_calloc(nmemb, size)
#define HECMW_realloc(ptr, size)
#define HECMW_malloc(size)
#define CLEAR_BIT(map, bit)
int HECMW_reorder(struct hecmwST_local_mesh *local_mesh)
int HECMW_reorder_elem_type(struct hecmwST_local_mesh *local_mesh)
int HECMW_reorder_node_dof(struct hecmwST_local_mesh *local_mesh)
#define EVAL_BIT(map, bit)
#define HECMW_COMMON_EQUATION_BLOCK_NAME
int HECMW_reorder_node_mpc(struct hecmwST_local_mesh *local_mesh)
#define MASK_BIT(map, bit)
void HECMW_print_msg(int loglv, int msgno, const char *fmt,...)
#define HECMW_assert(cond)
struct hecmwST_node_grp * node_group
double * node_init_val_item
struct hecmwST_surf_grp * surf_group
long long * elem_node_index
struct hecmwST_elem_grp * elem_group
int * node_init_val_index