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