FrontISTR  5.8.0
Large-scale structural analysis program with finit element method
hecmw_reorder.c
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include "hecmw_struct.h"
9 #include "hecmw_util.h"
10 #include "hecmw_common_define.h"
11 #include "hecmw_etype.h"
12 #include "hecmw_reorder.h"
13 
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) \
18  ((map) |= (bit)); \
19  ((map) ^= (bit))
20 
21 #define BIT_DOF_TWO 1
22 #define BIT_DOF_THREE 2
23 #define BIT_DOF_SIX 4
24 #define BIT_DOF_FOUR 8
25 #define BIT_DOF_ALL (BIT_DOF_TWO | BIT_DOF_THREE | BIT_DOF_SIX | BIT_DOF_FOUR)
26 
27 #define HECMW_COMMON_EQUATION_BLOCK_NAME "EQUATION_BLOCK"
28 #define MY_RANK 1
29 #define NEIGHBOR_RANK 2
30 #define BOTH_RANK 3
31 #define MPC_BLOCK 4
32 #define CANDIDATE 8
33 #define ALL_BIT 255
34 
35 #ifdef DEBUG
36 #define dw_node_flag(ptr, nmemb) dw_node_flag_(ptr, nmemb, __FILE__, __LINE__)
37 #else
38 #define dw_node_flag(ptr, nmemb) ((void)0)
39 #endif
40 
45 };
46 
47 /*----------------------------------------------------------------------------*/
48 #if 0
49 static int
50 get_eqn_block_idx( struct hecmwST_local_mesh *local_mesh )
51 {
52  int i;
53 
54  for( i=0; i<local_mesh->node_group->n_grp; i++ )
55  if( !strcmp( local_mesh->node_group->grp_name[i], HECMW_COMMON_EQUATION_BLOCK_NAME ) ) return i;
56 
57  return -1;
58 }
59 #endif
60 
61 /* */
62 /* convert node id from old to new */
63 /* */
64 
65 /*----------------------------------------------------------------------------*/
66 /* nodal coordinates < node > */
67 /*----------------------------------------------------------------------------*/
68 static int old2new_node(struct hecmwST_local_mesh *local_mesh,
69  int *node_new2old) {
70  double *new, *old;
71  int i;
72 
73  new = (double *)HECMW_malloc(sizeof(double) * local_mesh->n_node * 3);
74  if (new == NULL) {
76  return -1;
77  }
78 
79  old = local_mesh->node;
80  HECMW_assert(old);
81 
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];
86  }
87 
88  local_mesh->node = new;
89 
90  HECMW_free(old);
91 
92  return 0;
93 }
94 
95 /*----------------------------------------------------------------------------*/
96 /* local node id & belonging domain of node < node_ID > */
97 /*----------------------------------------------------------------------------*/
98 static int old2new_node_ID(struct hecmwST_local_mesh *local_mesh,
99  int *node_new2old) {
100  int *new, *old;
101  int i;
102 
103  new = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_node * 2);
104  if (new == NULL) {
106  return -1;
107  }
108 
109  old = local_mesh->node_ID;
110  HECMW_assert(old);
111 
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];
115  }
116 
117  local_mesh->node_ID = new;
118 
119  HECMW_free(old);
120 
121  return 0;
122 }
123 
124 /*----------------------------------------------------------------------------*/
125 /* global node id */
126 /*----------------------------------------------------------------------------*/
127 static int old2new_global_node_ID(struct hecmwST_local_mesh *local_mesh,
128  int *node_new2old) {
129  int *new, *old;
130  int i;
131 
132  new = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_node);
133  if (new == NULL) {
135  return -1;
136  }
137 
138  old = local_mesh->global_node_ID;
139  HECMW_assert(old);
140 
141  for (i = 0; i < local_mesh->n_node; i++) {
142  new[i] = old[node_new2old[i] - 1];
143  }
144 
145  local_mesh->global_node_ID = new;
146 
147  HECMW_free(old);
148 
149  return 0;
150 }
151 
152 /*----------------------------------------------------------------------------*/
153 /* initial conditions of node */
154 /*----------------------------------------------------------------------------*/
155 static int old2new_node_init_val(struct hecmwST_local_mesh *local_mesh,
156  int *node_new2old) {
157  int *new_index, *old_index;
158  double *new_item, *old_item;
159  int old_id;
160  int counter;
161  int i, j;
162 
163  new_index = (int *)HECMW_calloc(local_mesh->n_node + 1, sizeof(int));
164  if (new_index == NULL) {
166  return -1;
167  }
168  new_item = (double *)HECMW_malloc(
169  sizeof(double) * local_mesh->node_init_val_index[local_mesh->n_node]);
170  if (new_item == NULL) {
172  return -1;
173  }
174 
175  old_index = local_mesh->node_init_val_index;
176  old_item = local_mesh->node_init_val_item;
177  HECMW_assert(old_index);
178  HECMW_assert(old_item);
179 
180  for (counter = 0, i = 0; i < local_mesh->n_node; i++) {
181  old_id = node_new2old[i];
182 
183  for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
184  new_item[counter++] = old_item[j];
185  }
186  new_index[i + 1] = counter;
187  }
188 
189  local_mesh->node_init_val_index = new_index;
190  local_mesh->node_init_val_item = new_item;
191 
192  HECMW_free(old_item);
193  HECMW_free(old_index);
194 
195  return 0;
196 }
197 
198 /*----------------------------------------------------------------------------*/
199 /* component nodes of element < elem_node_item > */
200 /*----------------------------------------------------------------------------*/
201 static int old2new_elem_node_item(struct hecmwST_local_mesh *local_mesh,
202  int *node_old2new) {
203  long long i;
204 
205  for (i = 0; i < local_mesh->elem_node_index[local_mesh->n_elem]; i++) {
206  local_mesh->elem_node_item[i] =
207  node_old2new[local_mesh->elem_node_item[i] - 1];
208  }
209 
210  return 0;
211 }
212 
213 /*----------------------------------------------------------------------------*/
214 /* MPC group < local_mesh->mpc > */
215 /*----------------------------------------------------------------------------*/
216 static int old2new_mpc_item(struct hecmwST_local_mesh *local_mesh,
217  int *node_old2new) {
218  int i;
219 
220  if (!local_mesh->mpc->n_mpc) return 0;
221 
222  for (i = 0; i < local_mesh->mpc->mpc_index[local_mesh->mpc->n_mpc]; i++) {
223  local_mesh->mpc->mpc_item[i] =
224  node_old2new[local_mesh->mpc->mpc_item[i] - 1];
225  }
226 
227  return 0;
228 }
229 
230 /*----------------------------------------------------------------------------*/
231 /* node group < local_mesh->node_group->grp_item > */
232 /*----------------------------------------------------------------------------*/
233 static int old2new_node_grp_item(struct hecmwST_local_mesh *local_mesh,
234  int *node_old2new) {
235  int i, j;
236 
237  if (!local_mesh->node_group->n_grp) return 0;
238 
239  for (i = 0; i < local_mesh->node_group->n_grp; i++) {
240  if (strcmp(local_mesh->node_group->grp_name[i],
242  for (j = local_mesh->node_group->grp_index[i];
243  j < local_mesh->node_group->grp_index[i + 1]; j++) {
244  local_mesh->node_group->grp_item[j] =
245  node_old2new[local_mesh->node_group->grp_item[j] - 1];
246  }
247  }
248  }
249 
250  return 0;
251 }
252 
253 /*============================================================================*/
254 /* convert node id from old to new */
255 /*============================================================================*/
256 static int old2new_node_info(struct hecmwST_local_mesh *local_mesh,
257  int *node_new2old, int *node_old2new) {
258  /* nodal coordinates */
259  if (old2new_node(local_mesh, node_new2old)) return -1;
260 
261  /* local node id & belonging domain of node */
262  if (old2new_node_ID(local_mesh, node_new2old)) return -1;
263 
264  /* global node id */
265  if (old2new_global_node_ID(local_mesh, node_new2old)) return -1;
266 
267  /* initial conditions of node */
268  if (local_mesh->hecmw_flag_initcon) {
269  if (old2new_node_init_val(local_mesh, node_new2old)) return -1;
270  }
271 
272  /* component nodes of element */
273  if (old2new_elem_node_item(local_mesh, node_old2new)) return -1;
274 
275  /* MPC group */
276  if (local_mesh->mpc->n_mpc) {
277  if (old2new_mpc_item(local_mesh, node_old2new)) return -1;
278  }
279 
280  /* node group */
281  if (local_mesh->node_group->n_grp) {
282  if (old2new_node_grp_item(local_mesh, node_old2new)) return -1;
283  }
284 
285  return 0;
286 }
287 
288 /* */
289 /* convert element id from old to new */
290 /* */
291 
292 /*----------------------------------------------------------------------------*/
293 /* finite element type < elem_type > */
294 /*----------------------------------------------------------------------------*/
295 static int old2new_elem_type(struct hecmwST_local_mesh *local_mesh,
296  int *elem_new2old) {
297  int *new, *old;
298  int i;
299 
300  new = HECMW_malloc(sizeof(int) * local_mesh->n_elem);
301  if (new == NULL) {
303  return -1;
304  }
305 
306  old = local_mesh->elem_type;
307  HECMW_assert(old);
308 
309  for (i = 0; i < local_mesh->n_elem; i++) {
310  new[i] = local_mesh->elem_type[elem_new2old[i] - 1];
311  }
312 
313  local_mesh->elem_type = new;
314 
315  HECMW_free(old);
316 
317  return 0;
318 }
319 
320 /*----------------------------------------------------------------------------*/
321 /* component nodes of element < elem_node_index, elem_node_item > */
322 /*----------------------------------------------------------------------------*/
323 static int old2new_elem_node(struct hecmwST_local_mesh *local_mesh,
324  int *elem_new2old) {
325  long long *new_index;
326  long long *old_index;
327  int *new_item, *old_item;
328  int old_id;
329  long long counter;
330  int i;
331  long long j;
332 
333  new_index = HECMW_calloc(local_mesh->n_elem + 1, sizeof(long long));
334  if (new_index == NULL) {
336  return -1;
337  }
338  new_item = HECMW_malloc(sizeof(int) *
339  local_mesh->elem_node_index[local_mesh->n_elem]);
340  if (new_item == NULL) {
342  return -1;
343  }
344 
345  old_index = local_mesh->elem_node_index;
346  old_item = local_mesh->elem_node_item;
347  HECMW_assert(old_index);
348  HECMW_assert(old_item);
349 
350  for (counter = 0, i = 0; i < local_mesh->n_elem; i++) {
351  old_id = elem_new2old[i];
352 
353  for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
354  new_item[counter++] = old_item[j];
355  }
356  new_index[i + 1] = counter;
357  }
358  HECMW_assert(counter > local_mesh->n_elem);
359 
360  local_mesh->elem_node_index = new_index;
361  local_mesh->elem_node_item = new_item;
362 
363  HECMW_free(old_item);
364  HECMW_free(old_index);
365 
366  return 0;
367 }
368 
369 /*----------------------------------------------------------------------------*/
370 /* local element ID & belonging domain of element < elem_ID > */
371 /*----------------------------------------------------------------------------*/
372 static int old2new_elem_ID(struct hecmwST_local_mesh *local_mesh,
373  int *elem_new2old) {
374  int *new, *old;
375  int i;
376 
377  new = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_elem * 2);
378  if (new == NULL) {
380  return -1;
381  }
382 
383  old = local_mesh->elem_ID;
384  HECMW_assert(old);
385 
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];
389  }
390 
391  local_mesh->elem_ID = new;
392 
393  HECMW_free(old);
394 
395  return 0;
396 }
397 
398 /*----------------------------------------------------------------------------*/
399 /* global element id < global_elem_ID > */
400 /*----------------------------------------------------------------------------*/
401 static int old2new_global_elem_ID(struct hecmwST_local_mesh *local_mesh,
402  int *elem_new2old) {
403  int *new, *old;
404  int i;
405 
406  new = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_elem);
407  if (new == NULL) {
409  return -1;
410  }
411 
412  old = local_mesh->global_elem_ID;
413  HECMW_assert(old);
414 
415  for (i = 0; i < local_mesh->n_elem; i++) {
416  new[i] = old[elem_new2old[i] - 1];
417  }
418 
419  local_mesh->global_elem_ID = new;
420 
421  HECMW_free(old);
422 
423  return 0;
424 }
425 
426 /*----------------------------------------------------------------------------*/
427 /* section id < section_ID > */
428 /*----------------------------------------------------------------------------*/
429 static int old2new_section_ID(struct hecmwST_local_mesh *local_mesh,
430  int *elem_new2old) {
431  int *new, *old;
432  int i;
433 
434  new = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_elem);
435  if (new == NULL) {
437  return -1;
438  }
439 
440  old = local_mesh->section_ID;
441  HECMW_assert(old);
442 
443  for (i = 0; i < local_mesh->n_elem; i++) {
444  new[i] = local_mesh->section_ID[elem_new2old[i] - 1];
445  }
446 
447  local_mesh->section_ID = new;
448 
449  HECMW_free(old);
450 
451  return 0;
452 }
453 
454 /*----------------------------------------------------------------------------*/
455 /* material id < elem_mat_ID_index, elem_mat_ID_item > */
456 /*----------------------------------------------------------------------------*/
457 static int old2new_mat_ID(struct hecmwST_local_mesh *local_mesh,
458  int *elem_new2old) {
459  int *new_index, *old_index;
460  int *new_item, *old_item;
461  int old_id;
462  int counter;
463  int i, j;
464 
465  new_index = (int *)HECMW_calloc(local_mesh->n_elem + 1, sizeof(int));
466  if (new_index == NULL) {
468  return -1;
469  }
470  new_item = (int *)HECMW_malloc(
471  sizeof(int) * local_mesh->elem_mat_ID_index[local_mesh->n_elem]);
472  if (new_item == NULL) {
474  return -1;
475  }
476 
477  old_index = local_mesh->elem_mat_ID_index;
478  old_item = local_mesh->elem_mat_ID_item;
479  HECMW_assert(old_index);
480  HECMW_assert(old_item);
481 
482  for (counter = 0, i = 0; i < local_mesh->n_elem; i++) {
483  old_id = elem_new2old[i];
484 
485  for (j = old_index[old_id - 1]; j < old_index[old_id]; j++) {
486  new_item[counter++] = old_item[j];
487  }
488  new_index[i + 1] = counter;
489  }
490  HECMW_assert(counter >= local_mesh->n_elem);
491 
492  local_mesh->elem_mat_ID_index = new_index;
493  local_mesh->elem_mat_ID_item = new_item;
494 
495  HECMW_free(old_item);
496  HECMW_free(old_index);
497 
498  return 0;
499 }
500 
501 /*----------------------------------------------------------------------------*/
502 /* list of internal element < elem_internal_list > */
503 /*----------------------------------------------------------------------------*/
504 static int old2new_elem_internal_list(struct hecmwST_local_mesh *local_mesh,
505  int *elem_old2new) {
506  int i;
507 
508  for (i = 0; i < local_mesh->ne_internal; i++) {
509  local_mesh->elem_internal_list[i] =
510  elem_old2new[local_mesh->elem_internal_list[i] - 1];
511  }
512 
513  return 0;
514 }
515 
516 /*----------------------------------------------------------------------------*/
517 /* element group < elem_group->grp_item > */
518 /*----------------------------------------------------------------------------*/
519 static int old2new_elem_grp_item(struct hecmwST_local_mesh *local_mesh,
520  int *elem_old2new) {
521  int i;
522 
523  for (i = 0;
524  i < local_mesh->elem_group->grp_index[local_mesh->elem_group->n_grp];
525  i++) {
526  local_mesh->elem_group->grp_item[i] =
527  elem_old2new[local_mesh->elem_group->grp_item[i] - 1];
528  }
529 
530  return 0;
531 }
532 
533 /*----------------------------------------------------------------------------*/
534 /* surface group < surf_group->grp_item > */
535 /*----------------------------------------------------------------------------*/
536 static int old2new_surf_grp_item(struct hecmwST_local_mesh *local_mesh,
537  int *elem_old2new) {
538  int i;
539 
540  for (i = 0;
541  i < local_mesh->surf_group->grp_index[local_mesh->surf_group->n_grp];
542  i++) {
543  local_mesh->surf_group->grp_item[2 * i] =
544  elem_old2new[local_mesh->surf_group->grp_item[2 * i] - 1];
545  }
546 
547  return 0;
548 }
549 
550 /*============================================================================*/
551 /* convert element id from old to new */
552 /*============================================================================*/
553 static int old2new_elem_info(struct hecmwST_local_mesh *local_mesh,
554  int *elem_new2old, int *elem_old2new) {
555  /* finite element type */
556  if (old2new_elem_type(local_mesh, elem_new2old)) return -1;
557 
558  /* component nodes of element */
559  if (old2new_elem_node(local_mesh, elem_new2old)) return -1;
560 
561  /* local element id & belonging domain of element */
562  if (old2new_elem_ID(local_mesh, elem_new2old)) return -1;
563 
564  /* global element id */
565  if (old2new_global_elem_ID(local_mesh, elem_new2old)) return -1;
566 
567  /* section id */
568  if (old2new_section_ID(local_mesh, elem_new2old)) return -1;
569 
570  /* material id */
571  if (old2new_mat_ID(local_mesh, elem_new2old)) return -1;
572 
573  /* list of internal element */
574  if (old2new_elem_internal_list(local_mesh, elem_old2new)) return -1;
575 
576  /* element group */
577  if (local_mesh->elem_group->n_grp) {
578  if (old2new_elem_grp_item(local_mesh, elem_old2new)) return -1;
579  }
580 
581  /* surface group */
582  if (local_mesh->surf_group->n_grp) {
583  if (old2new_surf_grp_item(local_mesh, elem_old2new)) return -1;
584  }
585 
586  return 0;
587 }
588 
589 /* */
590 /* reorder member of EQUATION_BLOCK */
591 /* */
592 #if 0
593 /*----------------------------------------------------------------------------*/
594 /* node group ( only EQUATION_BLOCK ) < node_group->grp_item > */
595 /*----------------------------------------------------------------------------*/
596 static int
597 old2new_eqn_block( struct hecmwST_local_mesh *local_mesh, int *eqn_block_old2new )
598 {
599  struct hecmwST_node_grp *grp=local_mesh->node_group;
600  int n_eqn_block, eqn_block_idx;
601  int *new_item;
602  int counter;
603  int i, js;
604 
605  /* index of EQUATION_BLOCK */
606  eqn_block_idx = get_eqn_block_idx( local_mesh );
607  HECMW_assert( eqn_block_idx >= 0 );
608 
609  /* number of EQUATION_BLOCKs */
610  n_eqn_block = grp->grp_index[eqn_block_idx+1] - grp->grp_index[eqn_block_idx];
611  HECMW_assert( n_eqn_block > 0 );
612 
613  /* order EQUATION_BLOCK */
614  new_item = (int *)HECMW_calloc( n_eqn_block, sizeof(int) );
615  if( new_item == NULL ) {
617  return -1;
618  }
619 
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;
622  js = grp->grp_item[i];
623  }
624 
625  for( counter=0, i=0; i<n_eqn_block; i++ ) {
626  counter += new_item[i];
627  grp->grp_item[grp->grp_index[eqn_block_idx]+i] = counter;
628  }
629 
630  HECMW_free( new_item );
631 
632  return 0;
633 }
634 
635 /*============================================================================*/
636 /* reorder member of EQUATION_BLOCK */
637 /*============================================================================*/
638 static int
639 old2new_eqn_block_info( struct hecmwST_local_mesh *local_mesh, int *eqn_block_old2new )
640 {
641  /* node group ( only EQUATION_BLOCK ) */
642  if(old2new_eqn_block( local_mesh, eqn_block_old2new )) return -1;
643 
644  return 0;
645 }
646 #endif
647 /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
648 
649 /* */
650 /* reorder element according to finite element type */
651 /* */
652 
653 /*----------------------------------------------------------------------------*/
654 /* count elements of each finite element type */
655 /*----------------------------------------------------------------------------*/
656 static int count_each_elem_type(struct hecmwST_local_mesh *local_mesh,
657  int *counter) {
658  int etype;
659  int i;
660 
661  /* count elements of each finite element type */
662  for (i = 0; i < local_mesh->n_elem; i++) {
663  etype = HECMW_get_etype_HECMW2UTIL(local_mesh->elem_type[i]);
664  counter[etype]++;
665  }
666 
667  return 0;
668 }
669 
670 /*----------------------------------------------------------------------------*/
671 /* count element types in mesh */
672 /*----------------------------------------------------------------------------*/
673 static int set_n_elem_type(struct hecmwST_local_mesh *local_mesh,
674  int *counter) {
675  int i;
676 
677  /* count element types */
678  local_mesh->n_elem_type = 0;
679  for (i = 0; i < HECMW_MESH_ETYPE_MAX + 1; i++) {
680  if (counter[i]) {
681  (local_mesh->n_elem_type)++;
682  }
683  }
684 
685  /* check data */
686  if (local_mesh->n_elem_type <= 0) {
688  return -1;
689  }
690 
691  return 0;
692 }
693 
694 /*----------------------------------------------------------------------------*/
695 /* create item and index for finite element type & set conversion table */
696 /* between old and new element id */
697 /*----------------------------------------------------------------------------*/
698 static int set_elem_type_index(struct hecmwST_local_mesh *local_mesh,
699  int *counter, int *elem_new2old,
700  int *elem_old2new) {
701  int etype;
702  int types, elems;
703  int i, j;
704 
705  /* allocation */
706  if (local_mesh->elem_type_index) {
707  HECMW_free(local_mesh->elem_type_index);
708  }
709  local_mesh->elem_type_index =
710  (int *)HECMW_calloc(local_mesh->n_elem_type + 1, sizeof(int));
711  if (local_mesh->elem_type_index == NULL) {
713  return -1;
714  }
715 
716  if (local_mesh->elem_type_item) {
717  HECMW_free(local_mesh->elem_type_item);
718  }
719  local_mesh->elem_type_item =
720  (int *)HECMW_malloc(sizeof(int) * local_mesh->n_elem_type);
721  if (local_mesh->elem_type_item == NULL) {
723  return -1;
724  }
725 
726  /* create index for element type */
727  for (elems = 0, types = 0, i = 0; i < HECMW_MESH_ETYPE_MAX + 1; i++) {
728  if (counter[i]) {
729  etype = HECMW_get_etype_UTIL2HECMW(i);
730 
731  for (j = 0; j < local_mesh->n_elem; j++) {
732  if (local_mesh->elem_type[j] == etype) {
733  elem_new2old[elems] = j + 1;
734  elem_old2new[j] = elems + 1;
735  elems++;
736  }
737  }
738  local_mesh->elem_type_index[types + 1] = elems;
739  local_mesh->elem_type_item[types] = etype;
740  types++;
741  }
742  }
743 
744  return 0;
745 }
746 
747 /*============================================================================*/
748 /* reoreder element according to finite element type */
749 /*============================================================================*/
750 extern int HECMW_reorder_elem_type(struct hecmwST_local_mesh *local_mesh) {
751  int *counter; /* counter of elements */
752  int *elem_new2old,
753  *elem_old2new; /* conversion table between old and new element id */
754 
755  HECMW_assert(local_mesh);
756 
757  /* allocation */
758  counter = (int *)HECMW_calloc(HECMW_MESH_ETYPE_MAX + 1, sizeof(int));
759  if (counter == NULL) {
761  return -1;
762  }
763 
764  elem_new2old = (int *)HECMW_calloc(local_mesh->n_elem, sizeof(int));
765  if (elem_new2old == NULL) {
767  return -1;
768  }
769 
770  elem_old2new = (int *)HECMW_calloc(local_mesh->n_elem, sizeof(int));
771  if (elem_old2new == NULL) {
773  return -1;
774  }
775 
776  /* count elements of each element type */
777  if (count_each_elem_type(local_mesh, counter)) {
778  return -1;
779  }
780 
781  /* count finite element types in data */
782  if (set_n_elem_type(local_mesh, counter)) {
783  return -1;
784  }
785 
786  /* create index for finite element type */
787  if (set_elem_type_index(local_mesh, counter, elem_new2old, elem_old2new)) {
788  return -1;
789  }
790 
791  /* reorder relevant arrays */
792  if (old2new_elem_info(local_mesh, elem_new2old, elem_old2new)) {
793  return -1;
794  }
795 
796  HECMW_free(counter);
797  HECMW_free(elem_new2old);
798  HECMW_free(elem_old2new);
799 
800  return 0;
801 }
802 
803 /* */
804 /* reorder node according to DOF */
805 /* */
806 
807 /*----------------------------------------------------------------------------*/
808 /* mask node according to DOF */
809 /*----------------------------------------------------------------------------*/
810 static int mask_node_dof_inner(struct hecmwST_local_mesh *local_mesh,
811  char *node_flag, const int is, const int ie,
812  const int n_comp, const int n_dof) {
813  long long nidx;
814  int node;
815  int i, j;
816 
817  for (i = is; i < ie; i++) {
818  nidx = local_mesh->elem_node_index[i];
819 
820  for (j = 0; j < n_comp; j++) {
821  node = local_mesh->elem_node_item[nidx + j];
822  MASK_BIT(node_flag[node - 1], n_dof);
823  }
824  }
825 
826  return 0;
827 }
828 
829 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
830 static int mask_node_dof(struct hecmwST_local_mesh *local_mesh,
831  char *node_flag) {
832  int n_comp, n_dof;
833  int is, ie;
834  int i;
835  n_dof = -1;
836 
837  for (i = 0; i < local_mesh->n_elem_type; i++) {
838  is = local_mesh->elem_type_index[i];
839  ie = local_mesh->elem_type_index[i + 1];
840  n_comp = HECMW_get_max_node(local_mesh->elem_type_item[i]);
841 
842  switch (local_mesh->elem_type_item[i]) {
843  /* line element */
844  case HECMW_ETYPE_ROD1:
845  case HECMW_ETYPE_ROD2:
846  n_dof = BIT_DOF_TWO;
847  break;
848 
849  /* surface element */
850  case HECMW_ETYPE_TRI1:
851  case HECMW_ETYPE_TRI2:
852  case HECMW_ETYPE_TRI22:
853  case HECMW_ETYPE_QUA1:
854  case HECMW_ETYPE_QUA2:
855  n_dof = BIT_DOF_TWO;
856  break;
857 
858  /* solid element */
859  case HECMW_ETYPE_TET1:
860  case HECMW_ETYPE_TET2:
861  case HECMW_ETYPE_TET22:
862  case HECMW_ETYPE_PRI1:
863  case HECMW_ETYPE_PRI2:
864  case HECMW_ETYPE_HEX1:
865  case HECMW_ETYPE_HEX2:
866  case HECMW_ETYPE_PYR1:
867  case HECMW_ETYPE_PYR2:
868  case HECMW_ETYPE_ROD31:
869  n_dof = BIT_DOF_THREE;
870  break;
871  case HECMW_ETYPE_TET1_4:
872  case HECMW_ETYPE_HEX1_4:
873  n_dof = BIT_DOF_FOUR;
874  break;
875 
876  /* master-slave type element */
877  case HECMW_ETYPE_MST1:
878  case HECMW_ETYPE_MST2:
879  case HECMW_ETYPE_MSQ1:
880  case HECMW_ETYPE_MSQ2:
881  n_dof = BIT_DOF_THREE;
882  break;
883 
884  /* interface element */
885  case HECMW_ETYPE_JTB1:
886  case HECMW_ETYPE_SPGDPT1:
887  case HECMW_ETYPE_JTT1:
888  case HECMW_ETYPE_JTT2:
889  case HECMW_ETYPE_JTQ1:
890  case HECMW_ETYPE_JTQ2:
891  n_dof = BIT_DOF_THREE;
892  break;
893 
894  /* beam element */
895  case HECMW_ETYPE_BEM1:
896  case HECMW_ETYPE_BEM2:
897  n_dof = BIT_DOF_SIX;
898  break;
899 
900  /* surface shell element */
901  case HECMW_ETYPE_SHT1:
902  case HECMW_ETYPE_SHT2:
903  case HECMW_ETYPE_SHQ1:
904  case HECMW_ETYPE_SHQ2:
905  case HECMW_ETYPE_SHQ3:
906  n_dof = BIT_DOF_SIX;
907  break;
908 
909  /* surface shell element (351 361) */
910  case HECMW_ETYPE_SHT6:
911  case HECMW_ETYPE_SHQ8:
912  case HECMW_ETYPE_BEM3:
913  n_dof = BIT_DOF_THREE;
914  break;
915 
916  /* patch element */
917  case HECMW_ETYPE_PTT1:
918  case HECMW_ETYPE_PTT2:
919  case HECMW_ETYPE_PTQ1:
920  case HECMW_ETYPE_PTQ2:
921  n_dof = BIT_DOF_THREE;
922  break;
923 
924  /* link element for MPC */
925  case HECMW_ETYPE_LN11:
926  case HECMW_ETYPE_LN12:
927  case HECMW_ETYPE_LN13:
928  case HECMW_ETYPE_LN14:
929  case HECMW_ETYPE_LN15:
930  case HECMW_ETYPE_LN16:
931  case HECMW_ETYPE_LN21:
932  case HECMW_ETYPE_LN22:
933  case HECMW_ETYPE_LN23:
934  case HECMW_ETYPE_LN24:
935  case HECMW_ETYPE_LN25:
936  case HECMW_ETYPE_LN26:
937  case HECMW_ETYPE_LN31:
938  case HECMW_ETYPE_LN32:
939  case HECMW_ETYPE_LN33:
940  case HECMW_ETYPE_LN34:
941  case HECMW_ETYPE_LN35:
942  case HECMW_ETYPE_LN36:
943  case HECMW_ETYPE_LN41:
944  case HECMW_ETYPE_LN42:
945  case HECMW_ETYPE_LN43:
946  case HECMW_ETYPE_LN44:
947  case HECMW_ETYPE_LN45:
948  case HECMW_ETYPE_LN46:
949  case HECMW_ETYPE_LN51:
950  case HECMW_ETYPE_LN52:
951  case HECMW_ETYPE_LN53:
952  case HECMW_ETYPE_LN54:
953  case HECMW_ETYPE_LN55:
954  case HECMW_ETYPE_LN56:
955  case HECMW_ETYPE_LN61:
956  case HECMW_ETYPE_LN62:
957  case HECMW_ETYPE_LN63:
958  case HECMW_ETYPE_LN64:
959  case HECMW_ETYPE_LN65:
960  case HECMW_ETYPE_LN66:
961  n_dof = BIT_DOF_TWO;
962  break;
963 
964  default:
965  HECMW_assert(0);
966  }
967 
968  if (mask_node_dof_inner(local_mesh, node_flag, is, ie, n_comp, n_dof))
969  return -1;
970  }
971 
972  return 0;
973 }
974 
975 /*----------------------------------------------------------------------------*/
976 /* reorder node according to DOF & create conversion table */
977 /*----------------------------------------------------------------------------*/
978 static int reorder_node_dof(struct hecmwST_local_mesh *local_mesh,
979  char *node_flag, int *node_new2old,
980  int *node_old2new, char *dof_flag, int *n_dof_tot) {
981  int counter = 0;
982  int i;
983 
984  /* six DOF */
985  for (i = 0; i < local_mesh->n_node; i++) {
986  if (EVAL_BIT(node_flag[i], BIT_DOF_SIX)) {
987  node_old2new[i] = counter + 1;
988  node_new2old[counter] = i + 1;
989  counter++;
990 
991  (n_dof_tot[HECMW_MESH_DOF_SIX])++;
992  MASK_BIT(*dof_flag, BIT_DOF_SIX);
993  CLEAR_BIT(node_flag[i], BIT_DOF_ALL);
994  }
995  }
996 
997  /* four DOF */
998  for (i = 0; i < local_mesh->n_node; i++) {
999  if (EVAL_BIT(node_flag[i], BIT_DOF_FOUR)) {
1000  node_old2new[i] = counter + 1;
1001  node_new2old[counter] = i + 1;
1002  counter++;
1003 
1004  (n_dof_tot[HECMW_MESH_DOF_FOUR])++;
1005  MASK_BIT(*dof_flag, BIT_DOF_FOUR);
1006  CLEAR_BIT(node_flag[i], BIT_DOF_ALL);
1007  }
1008  }
1009 
1010  /* three DOF */
1011  for (i = 0; i < local_mesh->n_node; i++) {
1012  if (EVAL_BIT(node_flag[i], BIT_DOF_THREE)) {
1013  node_old2new[i] = counter + 1;
1014  node_new2old[counter] = i + 1;
1015  counter++;
1016 
1017  (n_dof_tot[HECMW_MESH_DOF_THREE])++;
1018  MASK_BIT(*dof_flag, BIT_DOF_THREE);
1019  CLEAR_BIT(node_flag[i], BIT_DOF_ALL);
1020  }
1021  }
1022 
1023  /* two DOF */
1024  for (i = 0; i < local_mesh->n_node; i++) {
1025  if (EVAL_BIT(node_flag[i], BIT_DOF_TWO)) {
1026  node_old2new[i] = counter + 1;
1027  node_new2old[counter] = i + 1;
1028  counter++;
1029 
1030  (n_dof_tot[HECMW_MESH_DOF_TWO])++;
1031  MASK_BIT(*dof_flag, BIT_DOF_TWO);
1032  CLEAR_BIT(node_flag[i], BIT_DOF_ALL);
1033  }
1034  }
1035 
1036  HECMW_assert(counter == local_mesh->n_node);
1037 
1038  return 0;
1039 }
1040 
1041 /*----------------------------------------------------------------------------*/
1042 /* reorder node according to DOF with EQUATION_BLOCK */
1043 /*----------------------------------------------------------------------------*/
1044 #if 0 /* commented out by K.Goto; begin */
1045 static int
1046 mask_eqn_block( struct hecmwST_local_mesh *local_mesh,
1047  char *node_flag, char *block_flag, const int eqn_block_idx )
1048 {
1049  struct hecmwST_node_grp *grp=local_mesh->node_group;
1050  int dof_max;
1051  int i, j, js;
1052 
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++ ) {
1055  if( EVAL_BIT( node_flag[j], BIT_DOF_TWO ) ) MASK_BIT( block_flag[i-grp->grp_index[eqn_block_idx]], BIT_DOF_TWO );
1056  if( EVAL_BIT( node_flag[j], BIT_DOF_THREE ) ) MASK_BIT( block_flag[i-grp->grp_index[eqn_block_idx]], BIT_DOF_THREE );
1057  if( EVAL_BIT( node_flag[j], BIT_DOF_SIX ) ) MASK_BIT( block_flag[i-grp->grp_index[eqn_block_idx]], BIT_DOF_SIX );
1058  if( EVAL_BIT( node_flag[j], BIT_DOF_FOUR) ) MASK_BIT( block_flag[i-grp->grp_index[eqn_block_idx]], BIT_DOF_FOUR );
1059  }
1060  js = grp->grp_item[i];
1061  }
1062 
1063  return 0;
1064 }
1065 
1066 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1067 static int
1068 reorder_node_dof_4mpc_inner( struct hecmwST_local_mesh *local_mesh,
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 )
1073 {
1074  struct hecmwST_node_grp *grp=local_mesh->node_group;
1075  int idx=grp->grp_index[eqn_block_idx];
1076  int counter=0, blocks=0;
1077  int i, j, js;
1078 
1079  /* six DOF */
1080  for( js=0, i=0; i<n_eqn_block; i++ ) {
1081  if( EVAL_BIT( block_flag[i], BIT_DOF_SIX ) ) {
1082  block_old2new[i] = blocks++;
1083 
1084  for( j=js; j<grp->grp_item[idx+i]; j++ ) {
1085  node_old2new[j] = counter+1;
1086  node_new2old[counter] = j+1;
1087  counter++;
1088 
1089  (n_dof_tot[HECMW_MESH_DOF_SIX])++;
1090  }
1091  MASK_BIT( *dof_flag, BIT_DOF_SIX );
1092  CLEAR_BIT( block_flag[i], BIT_DOF_ALL );
1093  }
1094  js = grp->grp_item[idx+i];
1095  }
1096 
1097  /* four DOF */
1098  for( js=0, i=0; i<n_eqn_block; i++ ) {
1099  if( EVAL_BIT( block_flag[i], BIT_DOF_FOUR ) ) {
1100  block_old2new[i] = blocks++;
1101 
1102  for( j=js; j<grp->grp_item[idx+i]; j++ ) {
1103  node_old2new[j] = counter+1;
1104  node_new2old[counter] = j+1;
1105  counter++;
1106 
1107  (n_dof_tot[HECMW_MESH_DOF_FOUR])++;
1108  }
1109  MASK_BIT( *dof_flag, BIT_DOF_FOUR );
1110  CLEAR_BIT( block_flag[i], BIT_DOF_ALL );
1111  }
1112  js = grp->grp_item[idx+i];
1113  }
1114 
1115  /* three DOF */
1116  for( js=0, i=0; i<n_eqn_block; i++ ) {
1117  if( EVAL_BIT( block_flag[i], BIT_DOF_THREE ) ) {
1118  block_old2new[i] = blocks++;
1119 
1120  for( j=js; j<grp->grp_item[idx+i]; j++ ) {
1121  node_old2new[j] = counter+1;
1122  node_new2old[counter] = j+1;
1123  counter++;
1124 
1125  (n_dof_tot[HECMW_MESH_DOF_THREE])++;
1126  }
1127  MASK_BIT( *dof_flag, BIT_DOF_THREE );
1128  CLEAR_BIT( block_flag[i], BIT_DOF_ALL );
1129  }
1130  js = grp->grp_item[idx+i];
1131  }
1132 
1133  /* two DOF */
1134  for( js=0, i=0; i<n_eqn_block; i++ ) {
1135  if( EVAL_BIT( block_flag[i], BIT_DOF_TWO ) ) {
1136  block_old2new[i] = blocks++;
1137 
1138  for( j=js; j<grp->grp_item[idx+i]; j++ ) {
1139  node_old2new[j] = counter+1;
1140  node_new2old[counter] = j+1;
1141  counter++;
1142 
1143  (n_dof_tot[HECMW_MESH_DOF_TWO])++;
1144  }
1145  MASK_BIT( *dof_flag, BIT_DOF_TWO );
1146  CLEAR_BIT( block_flag[i], BIT_DOF_ALL );
1147  }
1148  js = grp->grp_item[idx+i];
1149  }
1150 
1151  HECMW_assert( counter == local_mesh->n_node );
1152 
1153  return 0;
1154 }
1155 
1156 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1157 static int
1158 reorder_node_dof_4mpc( struct hecmwST_local_mesh *local_mesh,
1159  char *node_flag, int *node_new2old, int *node_old2new,
1160  char *dof_flag, int *n_dof_tot )
1161 {
1162  struct hecmwST_node_grp *grp=local_mesh->node_group;
1163  char *block_flag;
1164  int *block_old2new;
1165  int n_eqn_block, eqn_block_idx;
1166 
1167  /* group id of EQUATION_BLOCK */
1168  eqn_block_idx = get_eqn_block_idx( local_mesh );
1169  if( eqn_block_idx < 0 ) {
1171  return 1;
1172  }
1173 
1174  /* number of EQUATION_BLOCKs */
1175  n_eqn_block = grp->grp_index[eqn_block_idx+1] - grp->grp_index[eqn_block_idx];
1176 
1177  /* allocation */
1178  block_flag = (char *)HECMW_calloc( n_eqn_block, sizeof(char) );
1179  if( block_flag == NULL ) {
1181  return -1;
1182  }
1183 
1184  block_old2new = (int *)HECMW_malloc( sizeof(int)*n_eqn_block );
1185  if( block_old2new == NULL ) {
1187  return -1;
1188  }
1189 
1190  /* mask EQUATION_BLOCK according to DOF */
1191  if(mask_eqn_block( local_mesh, node_flag, block_flag, eqn_block_idx )) return -1;
1192 
1193  /* reorder nodes according to DOF with EQUATION_BLOCK */
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;
1195 
1196  /* reorder relevant arrays */
1197  if(old2new_eqn_block_info( local_mesh, block_old2new )) return -1;
1198 
1199  /* free */
1200  HECMW_free( block_flag );
1201  HECMW_free( block_old2new );
1202 
1203  return 0;
1204 }
1205 #endif /* commented out by K.Goto; end */
1206 
1207 /*----------------------------------------------------------------------------*/
1208 /* count number of DOF groups & set maximal number of DOF */
1209 /*----------------------------------------------------------------------------*/
1210 static int count_n_dof_grp(struct hecmwST_local_mesh *local_mesh,
1211  char *dof_flag) {
1212  local_mesh->n_dof_grp = 0;
1213 
1214  /* two DOF */
1215  if (EVAL_BIT(*dof_flag, BIT_DOF_TWO)) {
1216  (local_mesh->n_dof_grp)++;
1217  local_mesh->n_dof = HECMW_MESH_DOF_TWO;
1218  }
1219 
1220  /* three DOF */
1221  if (EVAL_BIT(*dof_flag, BIT_DOF_THREE)) {
1222  (local_mesh->n_dof_grp)++;
1223  local_mesh->n_dof = HECMW_MESH_DOF_THREE;
1224  }
1225 
1226  /* four DOF */
1227  if (EVAL_BIT(*dof_flag, BIT_DOF_FOUR)) {
1228  (local_mesh->n_dof_grp)++;
1229  local_mesh->n_dof = HECMW_MESH_DOF_FOUR;
1230  }
1231 
1232  /* six DOF */
1233  if (EVAL_BIT(*dof_flag, BIT_DOF_SIX)) {
1234  (local_mesh->n_dof_grp)++;
1235  local_mesh->n_dof = HECMW_MESH_DOF_SIX;
1236  }
1237 
1238  HECMW_assert(local_mesh->n_dof_grp > 0 &&
1239  local_mesh->n_dof_grp <= HECMW_MESH_DOF_TOT);
1240 
1241  return 0;
1242 }
1243 
1244 /*----------------------------------------------------------------------------*/
1245 /* create index for DOF group & its value */
1246 /*----------------------------------------------------------------------------*/
1247 static int create_node_dof_item(struct hecmwST_local_mesh *local_mesh,
1248  char *dof_flag, int *n_dof_tot) {
1249  int counter = 0;
1250 
1251  /* allocation */
1252  if (local_mesh->node_dof_index) {
1253  HECMW_free(local_mesh->node_dof_index);
1254  }
1255  local_mesh->node_dof_index =
1256  (int *)HECMW_calloc(local_mesh->n_dof_grp + 1, sizeof(int));
1257  if (local_mesh->node_dof_index == NULL) {
1259  return -1;
1260  }
1261 
1262  if (local_mesh->node_dof_item) {
1263  HECMW_free(local_mesh->node_dof_item);
1264  }
1265  local_mesh->node_dof_item =
1266  (int *)HECMW_malloc(sizeof(int) * local_mesh->n_dof_grp);
1267  if (local_mesh->node_dof_item == NULL) {
1269  return -1;
1270  }
1271 
1272  /* six DOF */
1273  if (EVAL_BIT(*dof_flag, BIT_DOF_SIX)) {
1274  local_mesh->node_dof_index[counter + 1] =
1275  local_mesh->node_dof_index[counter] + n_dof_tot[HECMW_MESH_DOF_SIX];
1276  local_mesh->node_dof_item[counter] = HECMW_MESH_DOF_SIX;
1277  counter++;
1278  }
1279 
1280  /* four DOF */
1281  if (EVAL_BIT(*dof_flag, BIT_DOF_FOUR)) {
1282  local_mesh->node_dof_index[counter + 1] =
1283  local_mesh->node_dof_index[counter] + n_dof_tot[HECMW_MESH_DOF_FOUR];
1284  local_mesh->node_dof_item[counter] = HECMW_MESH_DOF_FOUR;
1285  counter++;
1286  }
1287 
1288  /* three DOF */
1289  if (EVAL_BIT(*dof_flag, BIT_DOF_THREE)) {
1290  local_mesh->node_dof_index[counter + 1] =
1291  local_mesh->node_dof_index[counter] + n_dof_tot[HECMW_MESH_DOF_THREE];
1292  local_mesh->node_dof_item[counter] = HECMW_MESH_DOF_THREE;
1293  counter++;
1294  }
1295 
1296  /* two DOF */
1297  if (EVAL_BIT(*dof_flag, BIT_DOF_TWO)) {
1298  local_mesh->node_dof_index[counter + 1] =
1299  local_mesh->node_dof_index[counter] + n_dof_tot[HECMW_MESH_DOF_TWO];
1300  local_mesh->node_dof_item[counter] = HECMW_MESH_DOF_TWO;
1301  counter++;
1302  }
1303 
1304  HECMW_assert(counter == local_mesh->n_dof_grp);
1305  HECMW_assert(local_mesh->node_dof_index[local_mesh->n_dof_grp] ==
1306  local_mesh->n_node);
1307 
1308  return 0;
1309 }
1310 
1311 /*============================================================================*/
1312 /* reorder nodes according to DOF */
1313 /*============================================================================*/
1314 extern int HECMW_reorder_node_dof(struct hecmwST_local_mesh *local_mesh) {
1315  int *node_new2old,
1316  *node_old2new; /* conversion table between old and new node id */
1317  char *node_flag; /* for masking */
1318  char dof_flag = '\0';
1319  int n_dof_tot[HECMW_MESH_DOF_MAX + 1];
1320  int i;
1321 
1322  HECMW_assert(local_mesh);
1323 
1324  /* allocation */
1325  node_flag = (char *)HECMW_calloc(local_mesh->n_node, sizeof(char));
1326  if (node_flag == NULL) {
1328  return -1;
1329  }
1330 
1331  node_new2old = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_node);
1332  if (node_new2old == NULL) {
1334  return -1;
1335  }
1336 
1337  node_old2new = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_node);
1338  if (node_old2new == NULL) {
1340  return -1;
1341  }
1342 
1343  for (i = 0; i < HECMW_MESH_DOF_MAX + 1; i++) {
1344  n_dof_tot[i] = 0;
1345  }
1346 
1347  /* mask node */
1348  if (mask_node_dof(local_mesh, node_flag)) {
1349  return -1;
1350  }
1351 
1352  /* reorder node */
1353  /* commented out by K.Goto; begin */
1354  /*
1355  if( local_mesh->mpc->n_mpc ) {
1356  int rtc;
1357  if((rtc = reorder_node_dof_4mpc( local_mesh, node_flag, node_new2old,
1358  node_old2new, &dof_flag, n_dof_tot )) < 0) {
1359  return -1;
1360  }
1361  if( rtc ) {
1362  if(reorder_node_dof( local_mesh, node_flag, node_new2old, node_old2new,
1363  &dof_flag, n_dof_tot )) {
1364  return -1;
1365  }
1366  }
1367  } else {
1368  */
1369  /* commented out by K.Goto; end */
1370  if (reorder_node_dof(local_mesh, node_flag, node_new2old, node_old2new,
1371  &dof_flag, n_dof_tot)) {
1372  return -1;
1373  }
1374  /* commented out by K.Goto; begin */
1375  /*
1376  }
1377  */
1378  /* commented out by K.Goto; end */
1379 
1380  HECMW_free(node_flag);
1381 
1382  /* create DOF information */
1383  if (count_n_dof_grp(local_mesh, &dof_flag)) {
1384  return -1;
1385  }
1386 
1387  if (create_node_dof_item(local_mesh, &dof_flag, n_dof_tot)) {
1388  return -1;
1389  }
1390 
1391  /* reorder relevant arrays */
1392  if (old2new_node_info(local_mesh, node_new2old, node_old2new)) {
1393  return -1;
1394  }
1395 
1396  /* free */
1397  HECMW_free(node_new2old);
1398  HECMW_free(node_old2new);
1399 
1400  return 0;
1401 }
1402 
1403 /* */
1404 /* reorder node according to MPC group */
1405 /* */
1406 
1407 /*----------------------------------------------------------------------------*/
1408 /* mask MPC group */
1409 /*----------------------------------------------------------------------------*/
1410 static int set_mpc_block(struct hecmwST_local_mesh *local_mesh,
1411  int *mpc_node_flag, int *mpc_index_flag) {
1412  int node, min_group, group;
1413  int i, j, js, je;
1414 
1415  for (i = 0; i < local_mesh->mpc->n_mpc; i++) {
1416  js = local_mesh->mpc->mpc_index[i];
1417  je = local_mesh->mpc->mpc_index[i + 1];
1418 
1419  /* MPC???롼?פγ???????????륰?롼?פ?mpc_node_flag ?˳?? */
1420  /* ??PC???롼?פν????????Ã¥???mpc_index_flag ?˳?? (??? */
1421  min_group = i;
1422  for (j = js; j < je; j++) {
1423  node = local_mesh->mpc->mpc_item[j];
1424 
1425  /* ?????Ƥ?????????????Î¥??롼?פ˽?????Ƥ????? ??group >= 0 */
1426  /* ¾?Î¥??롼?פ˽?????Ƥ??ʤ?????group < 0 */
1427  group = mpc_node_flag[node - 1];
1428  mpc_node_flag[node - 1] = (group < 0) ? i : group;
1429 
1430  /* i????PC???롼?פγ????ν?????륰?롼?פκǾ????롼?פ?? */
1431  min_group = (mpc_index_flag[mpc_node_flag[node - 1]] < min_group)
1432  ? mpc_index_flag[mpc_node_flag[node - 1]]
1433  : min_group;
1434  }
1435 
1436  /* i????PC???롼?פγ???????????Ƥ??륰?롼?פϺǾ????롼?פ????*/
1437  for (j = js; j < je; j++) {
1438  node = local_mesh->mpc->mpc_item[j];
1439  group = mpc_node_flag[node - 1];
1440 
1441  mpc_index_flag[group] = min_group;
1442  }
1443  mpc_index_flag[i] = min_group;
1444  }
1445 
1446  /* ???롼?פ?????????*/
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];
1450  }
1451 
1452  return 0;
1453 }
1454 
1455 /*----------------------------------------------------------------------------*/
1456 /* count MPC blocks */
1457 /*----------------------------------------------------------------------------*/
1458 static int count_mpc_block(struct hecmwST_local_mesh *local_mesh,
1459  struct equation_block *eqn_block,
1460  int *mpc_index_flag, int *mpc_group2block) {
1461  int *n_block;
1462  int block, counter;
1463  int i;
1464 
1465  /* allocation */
1466  n_block = (int *)HECMW_calloc(local_mesh->mpc->n_mpc, sizeof(int));
1467  if (n_block == NULL) {
1469  return -1;
1470  }
1471 
1472  /* count MPC groups in each MPC block */
1473  for (i = 0; i < local_mesh->mpc->n_mpc; i++) {
1474  block = mpc_index_flag[i];
1475  n_block[block]++;
1476  }
1477 
1478  /* count MPC blocks */
1479  /* create conversion table from "MPC group ID" to "MPC block ID" */
1480  for (counter = 0, i = 0; i < local_mesh->mpc->n_mpc; i++) {
1481  if (n_block[i]) mpc_group2block[i] = counter++;
1482  }
1483 
1484  /* number of MPC blocks */
1485  eqn_block->n_mpc_block = counter;
1486  eqn_block->n_eqn_block = counter;
1487 
1488  /* free */
1489  HECMW_free(n_block);
1490 
1491  return 0;
1492 }
1493 
1494 /*----------------------------------------------------------------------------*/
1495 /* count EQUATION_BLOCKs */
1496 /*----------------------------------------------------------------------------*/
1497 static int count_eqn_block(struct hecmwST_local_mesh *local_mesh,
1498  struct equation_block *eqn_block,
1499  int *mpc_node_flag) {
1500  int i;
1501 
1502  for (i = 0; i < local_mesh->n_node; i++) {
1503  if (mpc_node_flag[i] < 0) (eqn_block->n_eqn_block)++;
1504  }
1505 
1506  return 0;
1507 }
1508 
1509 /*----------------------------------------------------------------------------*/
1510 /* set EQUATION_BLOCK id to node */
1511 /*----------------------------------------------------------------------------*/
1512 static int set_eqn_block_of_node(struct hecmwST_local_mesh *local_mesh,
1513  struct equation_block *eqn_block,
1514  int *mpc_node_flag, int *mpc_index_flag,
1515  int *mpc_group2block) {
1516  int counter;
1517  int i;
1518 
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]]];
1522  } else {
1523  mpc_node_flag[i] = counter++;
1524  }
1525  }
1526 
1527  HECMW_assert(counter == eqn_block->n_eqn_block);
1528 
1529  return 0;
1530 }
1531 
1532 /*----------------------------------------------------------------------------*/
1533 /* create EQUATION_BLOCK */
1534 /*----------------------------------------------------------------------------*/
1535 static int create_eqn_block_index(struct hecmwST_local_mesh *local_mesh,
1536  struct equation_block *eqn_block,
1537  int *mpc_node_flag, int *mpc_group2block) {
1538  int *n_block;
1539  int i;
1540 
1541  /* allocation */
1542  n_block = (int *)HECMW_calloc(eqn_block->n_eqn_block, sizeof(int));
1543  if (n_block == NULL) {
1545  return -1;
1546  }
1547 
1548  eqn_block->eqn_block_index =
1549  (int *)HECMW_calloc(eqn_block->n_eqn_block + 1, sizeof(int));
1550  if (eqn_block->eqn_block_index == NULL) {
1552  return -1;
1553  }
1554 
1555  /* count nodes in each EQUATION_BLOCK */
1556  for (i = 0; i < local_mesh->n_node; i++) {
1557  (n_block[mpc_node_flag[i]])++;
1558  }
1559 
1560  /* create index for EQUATION_BLOCK */
1561  for (i = 0; i < eqn_block->n_eqn_block; i++) {
1562  eqn_block->eqn_block_index[i + 1] =
1563  eqn_block->eqn_block_index[i] + n_block[i];
1564  }
1565 
1566  /* free */
1567  HECMW_free(n_block);
1568 
1569  HECMW_assert(eqn_block->eqn_block_index[eqn_block->n_eqn_block] ==
1570  local_mesh->n_node);
1571 
1572  return 0;
1573 }
1574 
1575 /*----------------------------------------------------------------------------*/
1576 /* create conversion table of node */
1577 /*----------------------------------------------------------------------------*/
1578 static int create_old2new_node(struct hecmwST_local_mesh *local_mesh,
1579  struct equation_block *eqn_block,
1580  int *mpc_node_flag, int *node_old2new,
1581  int *node_new2old) {
1582  int *n_block;
1583  int new_id;
1584  int i;
1585 
1586  n_block = (int *)HECMW_calloc(eqn_block->n_eqn_block, sizeof(int));
1587  if (n_block == NULL) {
1589  return -1;
1590  }
1591 
1592  for (i = 0; i < local_mesh->n_node; i++) {
1593  new_id = eqn_block->eqn_block_index[mpc_node_flag[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]])++;
1598  }
1599 
1600  HECMW_free(n_block);
1601 
1602  return 0;
1603 }
1604 
1605 /*----------------------------------------------------------------------------*/
1606 /* reconstruct node group information */
1607 /*----------------------------------------------------------------------------*/
1608 static int reconstruct_node_grp(struct hecmwST_local_mesh *local_mesh,
1609  struct equation_block *eqn_block) {
1610  struct hecmwST_node_grp *grp = local_mesh->node_group;
1611  int i;
1612 
1613  /* number of node groups */
1614  (grp->n_grp)++;
1615 
1616  /* index for node group */
1617  grp->grp_index =
1618  (int *)HECMW_realloc(grp->grp_index, sizeof(int) * (grp->n_grp + 1));
1619  if (grp->grp_index == NULL) {
1621  return -1;
1622  }
1623 
1624  grp->grp_index[grp->n_grp] =
1625  grp->grp_index[grp->n_grp - 1] + eqn_block->n_eqn_block;
1626 
1627  /* name of node group */
1628  grp->grp_name =
1629  (char **)HECMW_realloc(grp->grp_name, sizeof(char *) * grp->n_grp);
1630  if (grp->grp_name == NULL) {
1632  return -1;
1633  }
1634  grp->grp_name[grp->n_grp - 1] =
1635  (char *)HECMW_malloc(sizeof(char *) * (HECMW_NAME_LEN + 1));
1636  if (grp->grp_name[grp->n_grp - 1] == NULL) {
1638  return -1;
1639  }
1640 
1641  strcpy(grp->grp_name[grp->n_grp - 1], HECMW_COMMON_EQUATION_BLOCK_NAME);
1642 
1643  /* member of node group */
1644  grp->grp_item = (int *)HECMW_realloc(
1645  grp->grp_item, sizeof(int) * grp->grp_index[grp->n_grp]);
1646  if (grp->grp_item == NULL) {
1648  return -1;
1649  }
1650 
1651  for (i = 0; i < eqn_block->n_eqn_block; i++) {
1652  grp->grp_item[grp->grp_index[grp->n_grp - 1] + i] =
1653  eqn_block->eqn_block_index[i + 1];
1654  }
1655 
1656  return 0;
1657 }
1658 
1659 /*============================================================================*/
1660 /* reorder node according to MPC group */
1661 /*============================================================================*/
1662 extern int HECMW_reorder_node_mpc(struct hecmwST_local_mesh *local_mesh) {
1663  int *mpc_node_flag, *mpc_index_flag, *mpc_group2block;
1664  int *node_old2new, *node_new2old;
1665  int i;
1666  struct equation_block *eqn_block;
1667 
1668  if (local_mesh->mpc->n_mpc == 0) return 0;
1669 
1670  /* allocation */
1671  mpc_node_flag = (int *)HECMW_calloc(local_mesh->n_node, sizeof(int));
1672  if (mpc_node_flag == NULL) {
1674  return -1;
1675  }
1676  for (i = 0; i < local_mesh->n_node; i++) {
1677  mpc_node_flag[i] = -1;
1678  }
1679 
1680  mpc_index_flag = (int *)HECMW_malloc(sizeof(int) * local_mesh->mpc->n_mpc);
1681  if (mpc_index_flag == NULL) {
1683  return -1;
1684  }
1685  for (i = 0; i < local_mesh->mpc->n_mpc; i++) {
1686  mpc_index_flag[i] = i;
1687  }
1688 
1689  eqn_block =
1690  (struct equation_block *)HECMW_malloc(sizeof(struct equation_block));
1691  if (eqn_block == NULL) {
1693  return -1;
1694  }
1695 
1696  /* group together */
1697  if (set_mpc_block(local_mesh, mpc_node_flag, mpc_index_flag)) {
1698  return -1;
1699  }
1700 
1701  /* count MPC blocks */
1702  mpc_group2block = (int *)HECMW_malloc(sizeof(int) * local_mesh->mpc->n_mpc);
1703  if (mpc_group2block == NULL) {
1705  return -1;
1706  }
1707  for (i = 0; i < local_mesh->mpc->n_mpc; i++) mpc_group2block[i] = -1;
1708 
1709  if (count_mpc_block(local_mesh, eqn_block, mpc_index_flag, mpc_group2block)) {
1710  return -1;
1711  }
1712 
1713  /* count EQUATION_BLOCKs */
1714  if (count_eqn_block(local_mesh, eqn_block, mpc_node_flag)) {
1715  return -1;
1716  }
1717 
1718  /* set EQUATION_BLOCK to node */
1719  if (set_eqn_block_of_node(local_mesh, eqn_block, mpc_node_flag,
1720  mpc_index_flag, mpc_group2block)) {
1721  return -1;
1722  }
1723 
1724  /* create EQUATION_BLOCK */
1725  if (create_eqn_block_index(local_mesh, eqn_block, mpc_node_flag,
1726  mpc_group2block)) {
1727  return -1;
1728  }
1729 
1730  HECMW_free(mpc_index_flag);
1731  HECMW_free(mpc_group2block);
1732 
1733  /* create conversion table between old and new node id */
1734  node_old2new = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_node);
1735  if (node_old2new == NULL) {
1737  return -1;
1738  }
1739 
1740  node_new2old = (int *)HECMW_malloc(sizeof(int) * local_mesh->n_node);
1741  if (node_new2old == NULL) {
1743  return -1;
1744  }
1745 
1746  if (create_old2new_node(local_mesh, eqn_block, mpc_node_flag, node_old2new,
1747  node_new2old)) {
1748  return -1;
1749  }
1750 
1751  if (old2new_node_info(local_mesh, node_new2old, node_old2new)) {
1752  return -1;
1753  }
1754 
1755  HECMW_free(mpc_node_flag);
1756  HECMW_free(node_old2new);
1757  HECMW_free(node_new2old);
1758 
1759  /* reconstruct node group */
1760  if (reconstruct_node_grp(local_mesh, eqn_block)) {
1761  return -1;
1762  }
1763 
1764  HECMW_free(eqn_block->eqn_block_index);
1765  HECMW_free(eqn_block);
1766 
1767  return 0;
1768 }
1769 
1770 /* */
1771 /* reorder node & element */
1772 /* */
1773 
1774 extern int HECMW_reorder(struct hecmwST_local_mesh *local_mesh) {
1775  HECMW_assert(local_mesh);
1776 
1777  /* reorder element according to finite element type */
1778  if (HECMW_reorder_elem_type(local_mesh)) return -1;
1779 
1780  /* reorder node according to MPC group */
1781  /* commented out by K.Goto; begin */
1782  /* if(HECMW_reorder_node_mpc( local_mesh )) return -1; */
1783  /* commented out by K.Goto; end */
1784 
1785  /* reorder node according to node dof */
1786  if (HECMW_reorder_node_dof(local_mesh)) return -1;
1787 
1788  return 0;
1789 }
#define HECMW_ETYPE_PRI1
#define HECMW_ETYPE_PRI2
#define HECMW_ETYPE_LN24
#define HECMW_ETYPE_MST1
#define HECMW_ETYPE_TET1_4
#define HECMW_ETYPE_TRI22
#define HECMW_ETYPE_BEM3
#define HECMW_MESH_DOF_SIX
#define HECMW_ETYPE_LN54
#define HECMW_ETYPE_LN51
#define HECMW_ETYPE_LN15
#define HECMW_ETYPE_JTB1
#define HECMW_ETYPE_PYR1
#define HECMW_ETYPE_LN66
#define HECMW_ETYPE_LN65
#define HECMW_ETYPE_LN11
#define HECMW_ETYPE_LN43
#define HECMW_ETYPE_QUA2
#define HECMW_ETYPE_LN42
#define HECMW_MESH_DOF_TOT
#define HECMW_ETYPE_LN32
#define HECMW_MESH_DOF_THREE
#define HECMW_MESH_ETYPE_MAX
#define HECMW_ETYPE_LN55
#define HECMW_COMMON_E_ALLOCATION
#define HECMW_ETYPE_MSQ2
#define HECMW_ETYPE_LN61
#define HECMW_ETYPE_JTQ2
#define HECMW_ETYPE_LN22
#define HECMW_ETYPE_SHQ1
#define HECMW_ETYPE_SHT1
#define HECMW_ETYPE_TET2
#define HECMW_MESH_DOF_TWO
#define HECMW_ETYPE_PTQ1
#define HECMW_ETYPE_JTT2
#define HECMW_ETYPE_PTT1
#define HECMW_COMMON_E_OUT_OF_RANGE
#define HECMW_ETYPE_LN26
#define HECMW_ETYPE_LN33
#define HECMW_ETYPE_LN53
#define HECMW_ETYPE_LN64
#define HECMW_ETYPE_LN13
#define HECMW_ETYPE_LN46
#define HECMW_ETYPE_SPGDPT1
#define HECMW_ETYPE_SHT2
#define HECMW_ETYPE_LN34
#define HECMW_ETYPE_TRI1
#define HECMW_ETYPE_SHT6
#define HECMW_ETYPE_LN41
#define HECMW_ETYPE_ROD2
#define HECMW_ETYPE_ROD31
#define HECMW_ETYPE_HEX1
#define HECMW_ETYPE_JTT1
#define HECMW_ETYPE_ROD1
#define HECMW_ETYPE_LN62
#define HECMW_ETYPE_LN45
#define HECMW_COMMON_W_NO_EQN_BLOCK
#define HECMW_ETYPE_JTQ1
#define HECMW_MESH_DOF_MAX
#define HECMW_ETYPE_BEM1
#define HECMW_ETYPE_QUA1
#define HECMW_ETYPE_BEM2
#define HECMW_ETYPE_SHQ8
#define HECMW_ETYPE_LN35
#define HECMW_ETYPE_LN63
#define HECMW_ETYPE_LN25
#define HECMW_ETYPE_PYR2
#define HECMW_ETYPE_LN36
#define HECMW_ETYPE_TET1
#define HECMW_ETYPE_LN52
#define HECMW_ETYPE_LN16
#define HECMW_ETYPE_HEX1_4
#define HECMW_ETYPE_LN12
#define HECMW_ETYPE_SHQ3
#define HECMW_ETYPE_MSQ1
#define HECMW_ETYPE_TET22
#define HECMW_ETYPE_LN23
#define HECMW_ETYPE_HEX2
#define HECMW_ETYPE_TRI2
#define HECMW_ETYPE_PTT2
#define HECMW_ETYPE_LN31
#define HECMW_MESH_DOF_FOUR
#define HECMW_ETYPE_LN21
#define HECMW_ETYPE_PTQ2
#define HECMW_ETYPE_LN56
#define HECMW_ETYPE_LN44
#define HECMW_ETYPE_MST2
#define HECMW_ETYPE_SHQ2
#define HECMW_ETYPE_LN14
#define HECMW_NAME_LEN
Definition: hecmw_config.h:70
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:37
int HECMW_get_etype_UTIL2HECMW(int etype)
Definition: hecmw_etype.c:10
int HECMW_get_max_node(int etype)
Definition: hecmw_etype.c:413
int HECMW_get_etype_HECMW2UTIL(int etype)
Definition: hecmw_etype.c:177
#define NULL
#define HECMW_LOG_WARN
Definition: hecmw_log.h:17
#define HECMW_calloc(nmemb, size)
Definition: hecmw_malloc.h:21
#define HECMW_realloc(ptr, size)
Definition: hecmw_malloc.h:22
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
#define CLEAR_BIT(map, bit)
Definition: hecmw_reorder.c:17
#define BIT_DOF_FOUR
Definition: hecmw_reorder.c:24
#define BIT_DOF_ALL
Definition: hecmw_reorder.c:25
int HECMW_reorder(struct hecmwST_local_mesh *local_mesh)
#define BIT_DOF_SIX
Definition: hecmw_reorder.c:23
#define BIT_DOF_THREE
Definition: hecmw_reorder.c:22
int HECMW_reorder_elem_type(struct hecmwST_local_mesh *local_mesh)
int HECMW_reorder_node_dof(struct hecmwST_local_mesh *local_mesh)
#define BIT_DOF_TWO
Definition: hecmw_reorder.c:21
#define EVAL_BIT(map, bit)
Definition: hecmw_reorder.c:15
#define HECMW_COMMON_EQUATION_BLOCK_NAME
Definition: hecmw_reorder.c:27
int HECMW_reorder_node_mpc(struct hecmwST_local_mesh *local_mesh)
#define MASK_BIT(map, bit)
Definition: hecmw_reorder.c:14
void HECMW_print_msg(int loglv, int msgno, const char *fmt,...)
Definition: hecmw_util.c:138
#define HECMW_assert(cond)
Definition: hecmw_util.h:40
int * eqn_block_index
Definition: hecmw_reorder.c:44
struct hecmwST_mpc * mpc
Definition: hecmw_struct.h:247
struct hecmwST_node_grp * node_group
Definition: hecmw_struct.h:249
double * node_init_val_item
Definition: hecmw_struct.h:181
struct hecmwST_surf_grp * surf_group
Definition: hecmw_struct.h:251
long long * elem_node_index
Definition: hecmw_struct.h:195
struct hecmwST_elem_grp * elem_group
Definition: hecmw_struct.h:250
int * mpc_index
Definition: hecmw_struct.h:50
int * mpc_item
Definition: hecmw_struct.h:51