FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_couple_boundary_info.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 <string.h>
9 #include <assert.h>
10 #include <errno.h>
11 
12 #include "hecmw_msgno.h"
13 #include "hecmw_common_define.h"
14 #include "hecmw_struct.h"
15 
16 #include "hecmw_couple_define.h"
17 #include "hecmw_couple_struct.h"
18 #include "hecmw_couple_table.h"
19 #include "hecmw_couple_control.h"
20 #include "hecmw_couple_info.h"
22 
23 struct link_list {
24  int item;
25  struct link_list *next;
26 };
27 
28 /*================================================================================================*/
29 
30 static void free_link_list(struct link_list *r) {
31  struct link_list *p, *q;
32 
33  for (p = r; p; p = q) {
34  q = p->next;
35  HECMW_free(p);
36  }
37 }
38 
40  struct hecmw_couple_boundary *boundary) {
41  if (boundary == NULL) return;
42 
43  if (boundary->node) {
44  HECMW_free(boundary->node->item);
45  HECMW_free(boundary->node);
46  }
47  if (boundary->elem) {
48  HECMW_free(boundary->elem->item);
49  HECMW_free(boundary->elem);
50  }
51  if (boundary->surf) {
52  HECMW_free(boundary->surf->item);
53  HECMW_free(boundary->surf);
54  }
55  HECMW_free(boundary->elem_node_index);
56  HECMW_free(boundary->elem_node_item);
57 
58  HECMW_free(boundary);
59  boundary = NULL;
60 }
61 
63  struct hecmw_couple_boundary *boundary = NULL;
64  int size;
65 
66  size = sizeof(struct hecmw_couple_boundary);
67  boundary = (struct hecmw_couple_boundary *)HECMW_malloc(size);
68  if (boundary == NULL) {
69  HECMW_set_error(errno, "");
70  goto error;
71  }
72  boundary->node = NULL;
73  boundary->elem = NULL;
74  boundary->surf = NULL;
75 
78 
79  size = sizeof(struct hecmw_couple_boundary_item);
80  boundary->node = (struct hecmw_couple_boundary_item *)HECMW_malloc(size);
81  if (boundary->node == NULL) {
82  HECMW_set_error(errno, "");
83  goto error;
84  }
85  boundary->node->n = 0;
86  boundary->node->item = NULL;
87 
88  boundary->elem = (struct hecmw_couple_boundary_item *)HECMW_malloc(size);
89  if (boundary->elem == NULL) {
90  HECMW_set_error(errno, "");
91  goto error;
92  }
93  boundary->elem->n = 0;
94  boundary->elem->item = NULL;
95 
96  boundary->surf = (struct hecmw_couple_boundary_item *)HECMW_malloc(size);
97  if (boundary->surf == NULL) {
98  HECMW_set_error(errno, "");
99  goto error;
100  }
101  boundary->surf->n = 0;
102  boundary->surf->item = NULL;
103 
104  boundary->elem_node_item = NULL;
105  boundary->elem_node_index = NULL;
106 
107  return boundary;
108 
109 error:
111  return NULL;
112 }
113 
114 /*================================================================================================*/
115 
116 static int check_group_name(int n_grp_mesh, char **grp_name_mesh,
117  const char *grp_name_ctrl) {
118  int i;
119 
120  for (i = 0; i < n_grp_mesh; i++) {
121  if ((strcmp(grp_name_ctrl, grp_name_mesh[i])) == 0) return i;
122  }
123 
124  return -1;
125 }
126 
127 static int check_node_group_name(const struct hecmwST_local_mesh *mesh,
128  const struct hecmw_couple_group *group) {
129  struct hecmwST_node_grp *node_grp = mesh->node_group;
130  int i;
131 
132  for (i = 0; i < group->n_grp; i++) {
133  if (check_group_name(node_grp->n_grp, node_grp->grp_name,
134  group->grp_name[i]) < 0) {
135  HECMW_set_error(HECMWCPL_E_UNDEF_GRPNAME, "node group: %s",
136  group->grp_name[i]);
137  return -1;
138  }
139  }
140 
141  return 0;
142 }
143 
144 static int check_elem_group_name(const struct hecmwST_local_mesh *mesh,
145  const struct hecmw_couple_group *group) {
146  struct hecmwST_elem_grp *elem_grp = mesh->elem_group;
147  int i;
148 
149  for (i = 0; i < group->n_grp; i++) {
150  if (check_group_name(elem_grp->n_grp, elem_grp->grp_name,
151  group->grp_name[i]) < 0) {
152  HECMW_set_error(HECMWCPL_E_UNDEF_GRPNAME, "element group: %s",
153  group->grp_name[i]);
154  return -1;
155  }
156  }
157 
158  return 0;
159 }
160 
161 static int check_surf_group_name(const struct hecmwST_local_mesh *mesh,
162  const struct hecmw_couple_group *group) {
163  struct hecmwST_surf_grp *surf_grp = mesh->surf_group;
164  int i;
165 
166  for (i = 0; i < group->n_grp; i++) {
167  if (check_group_name(surf_grp->n_grp, surf_grp->grp_name,
168  group->grp_name[i]) < 0) {
169  HECMW_set_error(HECMWCPL_E_UNDEF_GRPNAME, "surface group: %s",
170  group->grp_name[i]);
171  return HECMW_ERROR;
172  }
173  }
174 
175  return 0;
176 }
177 
178 /*------------------------------------------------------------------------------------------------*/
179 
180 static int set_boundary_node_by_node(const struct hecmwST_local_mesh *mesh,
181  const struct hecmw_couple_group *group,
182  struct hecmw_couple_boundary *boundary) {
183  int *mask = NULL;
184  int node, index, n, i, j;
185 
187  if (group->n_grp == 0) return 0;
188 
189  /* mask boundary nodes */
190  mask = (int *)HECMW_malloc(sizeof(int) * mesh->n_node);
191  if (mask == NULL) {
192  HECMW_set_error(errno, "");
193  return -1;
194  }
195  for (i = 0; i < mesh->n_node; i++) {
196  mask[i] = HECMW_COUPLE_FALSE;
197  }
198 
199  for (i = 0; i < group->n_grp; i++) {
200  index = check_group_name(mesh->node_group->n_grp,
201  mesh->node_group->grp_name, group->grp_name[i]);
202  HECMW_assert(index >= 0);
203 
204  for (j = mesh->node_group->grp_index[index];
205  j < mesh->node_group->grp_index[index + 1]; j++) {
206  node = mesh->node_group->grp_item[j];
207  mask[node - 1] = HECMW_COUPLE_TRUE;
208  }
209  }
210 
211  /* number of boundary nodes */
212  for (n = 0, i = 0; i < mesh->n_node; i++) {
213  if (mask[i] == HECMW_COUPLE_TRUE) n++;
214  }
215  boundary->node->n = n;
216  if (boundary->node->n == 0) {
217  HECMW_free(mask);
218  return 0;
219  }
220 
221  /* ids of boundary node */
222  boundary->node->item = (int *)HECMW_calloc(boundary->node->n, sizeof(int));
223  if (boundary->node->item == NULL) {
224  HECMW_set_error(errno, "");
225  goto error;
226  }
227  for (n = 0, i = 0; i < mesh->n_node; i++) {
228  if (mask[i] == HECMW_COUPLE_TRUE) boundary->node->item[n++] = j + 1;
229  }
230  HECMW_assert(n == boundary->node->n);
231 
232  HECMW_free(mask);
233  return 0;
234 
235 error:
236  HECMW_free(mask);
237  return -1;
238 }
239 
240 static int set_boundary_elem_by_elem(const struct hecmwST_local_mesh *mesh,
241  const struct hecmw_couple_group *group,
242  struct hecmw_couple_boundary *boundary) {
243  int *mask = NULL;
244  int elem, index, n, i, j;
245 
247  if (group->n_grp == 0) return 0;
248 
249  /* mask boundary nodes */
250  mask = (int *)HECMW_malloc(sizeof(int) * mesh->n_elem);
251  if (mask == NULL) {
252  HECMW_set_error(errno, "");
253  return -1;
254  }
255  for (i = 0; i < mesh->n_elem; i++) {
256  mask[i] = HECMW_COUPLE_FALSE;
257  }
258 
259  for (i = 0; i < group->n_grp; i++) {
260  index = check_group_name(mesh->elem_group->n_grp,
261  mesh->elem_group->grp_name, group->grp_name[i]);
262  HECMW_assert(index >= 0);
263 
264  for (j = mesh->elem_group->grp_index[index];
265  j < mesh->elem_group->grp_index[index + 1]; j++) {
266  elem = mesh->elem_group->grp_item[j];
267  mask[elem - 1] = HECMW_COUPLE_TRUE;
268  }
269  }
270 
271  /* number of boundary nodes */
272  for (n = 0, i = 0; i < mesh->n_elem; i++) {
273  if (mask[i] == HECMW_COUPLE_TRUE) n++;
274  }
275  boundary->elem->n = n;
276  if (boundary->elem->n == 0) {
277  HECMW_free(mask);
278  return 0;
279  }
280 
281  /* ids of boundary node */
282  boundary->elem->item = (int *)HECMW_calloc(boundary->elem->n, sizeof(int));
283  if (boundary->elem->item == NULL) {
284  HECMW_set_error(errno, "");
285  goto error;
286  }
287  for (n = 0, i = 0; i < mesh->n_elem; i++) {
288  if (mask[i] == HECMW_COUPLE_TRUE) boundary->elem->item[n++] = j + 1;
289  }
290  HECMW_assert(n == boundary->elem->n);
291 
292  HECMW_free(mask);
293  return 0;
294 
295 error:
296  HECMW_free(mask);
297  return -1;
298 }
299 
300 static int set_boundary_node_by_elem(const struct hecmwST_local_mesh *mesh,
301  struct hecmw_couple_boundary *boundary) {
302  int *mask = NULL;
303  int elem, node, size, n, i;
304  long long j;
305 
306  /* mask boundary nodes */
307  mask = (int *)HECMW_malloc(sizeof(int) * mesh->n_node);
308  if (mask == NULL) {
309  HECMW_set_error(errno, "");
310  goto error;
311  }
312  for (i = 0; i < mesh->n_node; i++) {
313  mask[i] = HECMW_COUPLE_FALSE;
314  }
315 
316  for (n = 0, i = 0; i < boundary->elem->n; i++) {
317  elem = boundary->elem->item[i];
318  for (j = mesh->elem_node_index[elem - 1]; j < mesh->elem_node_index[elem];
319  j++) {
320  node = mesh->elem_node_item[j];
321  if (mask[node - 1] < 0) {
322  mask[node - 1] = n++;
323  }
324  }
325  }
326 
327  /* number of boundary nodes */
328  for (n = 0, i = 0; i < mesh->n_node; i++) {
329  if (mask[i] >= 0) n++;
330  }
331  boundary->node->n = n;
332  if (boundary->node->n == 0) {
333  HECMW_free(mask);
334  return 0;
335  }
336 
337  /* ids of boundary node */
338  boundary->node->item = (int *)HECMW_malloc(sizeof(int) * boundary->node->n);
339  if (boundary->node->item == NULL) {
340  HECMW_set_error(errno, "");
341  goto error;
342  }
343  for (n = 0, i = 0; i < mesh->n_node; i++) {
344  if (mask[i] >= 0) {
345  boundary->node->item[mask[i]] = i + 1;
346  }
347  }
348 
349  /* connectivity of component nodes */
350  boundary->elem_node_index =
351  (int *)HECMW_calloc(boundary->elem->n + 1, sizeof(int));
352  if (boundary->elem_node_index == NULL) {
353  HECMW_set_error(errno, "");
354  goto error;
355  }
356  for (i = 0; i < boundary->elem->n; i++) {
357  elem = boundary->elem->item[i];
358  boundary->elem_node_index[i + 1] =
359  boundary->elem_node_index[i] +
360  HECMW_get_max_node(mesh->elem_type[elem - 1]);
361  }
362 
363  size = sizeof(int) * boundary->elem_node_index[boundary->elem->n];
364  boundary->elem_node_item = (int *)HECMW_malloc(size);
365  if (boundary->elem_node_item == NULL) {
366  HECMW_set_error(errno, "");
367  goto error;
368  }
369  for (n = 0, i = 0; i < boundary->elem->n; i++) {
370  elem = boundary->elem->item[i];
371  for (j = mesh->elem_node_index[elem - 1]; j < mesh->elem_node_index[elem];
372  j++) {
373  node = mesh->elem_node_item[j];
374  boundary->elem_node_item[n] = mask[node - 1];
375  }
376  }
377 
378  HECMW_free(mask);
379  return 0;
380 
381 error:
382  HECMW_free(mask);
383  return -1;
384 }
385 
386 static int set_boundary_surf_by_surf(const struct hecmwST_local_mesh *mesh,
387  const struct hecmw_couple_group *group,
388  struct hecmw_couple_boundary *boundary) {
389  struct link_list *mask, *p;
390  int size, index, elem, surf, is_exist, n, i, j;
391 
393  if (group->n_grp == 0) return 0;
394 
395  /* mask boundary surfaces */
396  mask =
397  (struct link_list *)HECMW_malloc(sizeof(struct link_list) * mesh->n_elem);
398  if (mask == NULL) {
399  HECMW_set_error(errno, "");
400  goto error;
401  }
402  for (i = 0; i < mesh->n_elem; i++) {
403  mask[i].item = 0;
404  mask[i].next = NULL;
405  }
406 
407  for (n = 0, i = 0; i < group->n_grp; i++) {
408  index = check_group_name(mesh->surf_group->n_grp,
409  mesh->surf_group->grp_name, group->grp_name[i]);
410  HECMW_assert(index >= 0);
411 
412  for (j = mesh->surf_group->grp_index[index];
413  j < mesh->surf_group->grp_index[index + 1]; j++) {
414  elem = mesh->surf_group->grp_item[2 * j];
415  surf = mesh->surf_group->grp_item[2 * j + 1];
416 
417  is_exist = HECMW_COUPLE_FALSE;
418  p = &mask[elem - 1];
419  while (p->next) {
420  if (p->next->item == surf) {
421  is_exist = HECMW_COUPLE_TRUE;
422  break;
423  }
424  }
425 
426  if (is_exist == HECMW_COUPLE_FALSE) {
427  p->next = (struct link_list *)HECMW_malloc(sizeof(struct link_list));
428  if (p->next == NULL) {
429  HECMW_set_error(errno, "");
430  goto error;
431  }
432  p->next->item = surf;
433  p->next->next = NULL;
434  n++;
435  }
436  }
437  }
438 
439  /* number of boundary surfaces */
440  boundary->surf->n = n;
441  if (boundary->surf->n == 0) {
442  HECMW_free(mask);
443  return 0;
444  }
445 
446  /* ids of boundary surface */
447  boundary->surf->item =
448  (int *)HECMW_calloc(boundary->surf->n * 2, sizeof(int));
449  if (boundary->surf->item == NULL) {
450  HECMW_set_error(errno, "");
451  goto error;
452  }
453  for (n = 0, i = 0; i < mesh->n_elem; i++) {
454  for (p = mask[i].next; p; p = p->next) {
455  boundary->surf->item[2 * n] = i + 1;
456  boundary->surf->item[2 * n + 1] = p->item;
457  n++;
458  }
459  }
460 
461  for (i = 0; i < mesh->n_elem; i++) {
462  free_link_list(mask[i].next);
463  }
464  HECMW_free(mask);
465 
466  return 0;
467 
468 error:
469  for (i = 0; i < mesh->n_elem; i++) {
470  free_link_list(mask[i].next);
471  }
472  HECMW_free(mask);
473 
474  return -1;
475 }
476 
477 static int set_boundary_node_by_surf(const struct hecmwST_local_mesh *mesh,
478  struct hecmw_couple_boundary *boundary) {
479  int *mask = NULL;
480  int elem, surf, node, offset, size, n, i, j;
481  long long node_index;
482 
483  /* mask boundary nodes */
484  mask = (int *)HECMW_malloc(sizeof(int) * mesh->n_node);
485  if (mask == NULL) {
486  HECMW_set_error(errno, "");
487  goto error;
488  }
489  for (i = 0; i < mesh->n_node; i++) {
490  mask[i] = -1;
491  }
492  for (n = 0, i = 0; i < boundary->surf->n; i++) {
493  elem = boundary->surf->item[2 * i];
494  surf = boundary->surf->item[2 * i + 1];
495  node_index = mesh->elem_node_index[elem - 1];
496 
497  if (mesh->elem_type[elem - 1] ==
498  HECMW_ETYPE_TET1) { /* 1st-order Tetra */
499  for (j = 0; j < 3; j++) {
500  offset = hecmw_surf_node_table_tet1[surf - 1][j];
501  node = mesh->elem_node_item[node_index + offset - 1];
502  if (mask[node - 1] < 0) {
503  mask[node - 1] = n++;
504  }
505  }
506  } else if (mesh->elem_type[elem - 1] ==
507  HECMW_ETYPE_HEX1) { /* 1st-order Hexa */
508  for (j = 0; j < 4; j++) {
509  offset = hecmw_surf_node_table_hex1[surf - 1][j];
510  node = mesh->elem_node_item[node_index + offset - 1];
511  if (mask[node - 1] < 0) {
512  mask[node - 1] = n++;
513  }
514  }
515  } else { /* error */
517  mesh->elem_type[elem - 1]);
518  goto error;
519  }
520  }
521 
522  /* number of boundary nodes */
523  for (n = 0, i = 0; i < mesh->n_node; i++) {
524  if (mask[i] >= 0) n++;
525  }
526  boundary->node->n = n;
527  if (boundary->node->n == 0) {
528  HECMW_free(mask);
529  return 0;
530  }
531 
532  /* ids of boundary node */
533  boundary->node->item = (int *)HECMW_malloc(sizeof(int) * boundary->node->n);
534  if (boundary->node->item == NULL) {
535  HECMW_set_error(errno, "");
536  goto error;
537  }
538  for (n = 0, i = 0; i < mesh->n_node; i++) {
539  if (mask[i] >= 0) {
540  boundary->node->item[mask[i]] = i + 1;
541  }
542  }
543 
544  /* connectivity of component nodes */
545  boundary->elem_node_index =
546  (int *)HECMW_calloc(boundary->surf->n + 1, sizeof(int));
547  if (boundary->elem_node_index == NULL) {
548  HECMW_set_error(errno, "");
549  goto error;
550  }
551  for (i = 0; i < boundary->surf->n; i++) {
552  elem = boundary->surf->item[2 * i];
553  if (mesh->elem_type[elem - 1] == HECMW_ETYPE_TET1) {
554  boundary->elem_node_index[i + 1] = boundary->elem_node_index[i] + 3;
555  } else if (mesh->elem_type[elem - 1] == HECMW_ETYPE_HEX1) {
556  boundary->elem_node_index[i + 1] = boundary->elem_node_index[i] + 4;
557  }
558  }
559 
560  size = sizeof(int) * boundary->elem_node_index[boundary->surf->n];
561  boundary->elem_node_item = (int *)HECMW_malloc(size);
562  if (boundary->elem_node_item == NULL) {
563  HECMW_set_error(errno, "");
564  goto error;
565  }
566  for (n = 0, i = 0; i < boundary->surf->n; i++) {
567  elem = boundary->surf->item[2 * i];
568  surf = boundary->surf->item[2 * i + 1];
569  node_index = mesh->elem_node_index[elem - 1];
570  if (mesh->elem_type[elem - 1] ==
571  HECMW_ETYPE_TET1) { /* 1st-order Tetra */
572  for (j = 0; j < 3; j++) {
573  offset = hecmw_surf_node_table_tet1[surf - 1][j];
574  node = mesh->elem_node_item[node_index + offset - 1];
575  boundary->elem_node_item[n++] = mask[node - 1];
576  }
577  } else if (mesh->elem_type[elem - 1] ==
578  HECMW_ETYPE_HEX1) { /* 1st-order Hexa */
579  for (j = 0; j < 4; j++) {
580  offset = hecmw_surf_node_table_hex1[surf - 1][j];
581  node = mesh->elem_node_item[node_index + offset - 1];
582  boundary->elem_node_item[n++] = mask[node - 1];
583  }
584  } else { /* error */
586  mesh->elem_type[elem - 1]);
587  goto error;
588  }
589  }
590 
591  HECMW_free(mask);
592  return 0;
593 
594 error:
595  HECMW_free(mask);
596  return -1;
597 }
598 
599 /*================================================================================================*/
600 
602  const char *boundary_id, int unit_specifier,
603  const struct hecmwST_local_mesh *mesh) {
604  struct hecmw_couple_boundary *boundary = NULL;
605  struct hecmw_couple_group *group = NULL;
606 
607  if (boundary_id == NULL) {
609  "HECMW_couple_set_boundary_info(): 'boundary_id' is NULL");
610  return NULL;
611  }
612  if (mesh == NULL) {
614  "HECMW_couple_set_boundary_info(): 'mesh' is NULL");
615  return NULL;
616  }
617 
618  if ((boundary = HECMW_couple_alloc_boundary_info()) == NULL) return NULL;
619 
620  if ((group = HECMW_couple_ctrl_get_group(boundary_id, unit_specifier)) ==
621  NULL)
622  goto error;
623 
624  if (group->geom_type == HECMW_COUPLE_NODE_GROUP) { /* Node Group
625  */
627  "In current version, node group is not supported");
628  goto error;
629 
630  /*
631  boundary->geom_type = group->geom_type;
632  boundary->data_type = group->data_type;
633  if(check_node_group_name(mesh, group)) goto error;
634  if(set_boundary_node_by_node(mesh, group, boundary)) goto error;
635  */
636 
637  } else if (group->geom_type ==
638  HECMW_COUPLE_ELEMENT_GROUP) { /* Element Group */
640  "In current version, element group is not supported");
641  goto error;
642 
643  /*
644  boundary->geom_type = group->geom_type;
645  boundary->data_type = group->data_type;
646  if(check_elem_group_name(mesh, group)) goto error;
647  if(set_boundary_elem_by_elem(mesh, group, boundary)) goto error;
648  if(set_boundary_node_by_elem(mesh, boundary)) goto error;
649  */
650 
651  } else if (group->geom_type ==
652  HECMW_COUPLE_SURFACE_GROUP) { /* Surface Group */
653  boundary->geom_type = group->geom_type;
654  boundary->data_type = group->data_type;
655  if (check_surf_group_name(mesh, group)) goto error;
656  if (set_boundary_surf_by_surf(mesh, group, boundary)) goto error;
657  if (set_boundary_node_by_surf(mesh, boundary)) goto error;
658 
659  } else { /* Error */
661  goto error;
662  }
663 
665  return boundary;
666 
667 error:
670  return NULL;
671 }
#define HECMW_ETYPE_HEX1
#define HECMW_ETYPE_TET1
#define HECMW_ERROR
Definition: hecmw_config.h:68
struct hecmw_couple_boundary * HECMW_couple_alloc_boundary_info(void)
void HECMW_couple_free_boundary_info(struct hecmw_couple_boundary *boundary)
struct hecmw_couple_boundary * HECMW_couple_set_boundary_info(const char *boundary_id, int unit_specifier, const struct hecmwST_local_mesh *mesh)
struct hecmw_couple_group * HECMW_couple_ctrl_get_group(const char *boundary_id, int unit_specifier)
void HECMW_couple_ctrl_free_group(struct hecmw_couple_group *grp_info)
#define HECMW_COUPLE_ELEMENT_GROUP
#define HECMW_COUPLE_TRUE
#define HECMWCPL_E_NONSUPPORT_GEOMTYPE
#define HECMW_COUPLE_NODE_GROUP
#define HECMWCPL_E_UNDEF_GRPNAME
#define HECMW_COUPLE_FALSE
#define HECMWCPL_E_NONSUPPORT_ETYPE
#define HECMW_COUPLE_GROUP_UNDEF
#define HECMWCPL_E_INVALID_ARG
#define HECMW_COUPLE_SURFACE_GROUP
#define HECMWCPL_E_INVALID_GEOMTYPE
struct hecmwST_local_mesh * mesh
Definition: hecmw_repart.h:71
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:37
int HECMW_get_max_node(int etype)
Definition: hecmw_etype.c:413
#define NULL
#define HECMW_calloc(nmemb, size)
Definition: hecmw_malloc.h:21
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
#define HECMW_assert(cond)
Definition: hecmw_util.h:40
struct hecmw_couple_boundary_item * elem
struct hecmw_couple_boundary_item * node
struct hecmw_couple_boundary_item * surf
struct hecmwST_node_grp * node_group
Definition: hecmw_struct.h:249
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