FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_io_geofem.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 <errno.h>
10 #include "hecmw_util.h"
11 #include "hecmw_common.h"
12 #include "hecmw_gflex.h"
13 #include "hecmw_io_mesh.h"
14 
15 static char grid_filename[HECMW_FILENAME_LEN + 1] = "Unknown";
16 
17 /*----------------------------------------------------------------------------*/
18 
19 static void do_logging(int loglv, int msgno, int add_location, const char *fmt,
20  va_list ap) {
21  char line[100] = "";
22  char msg[HECMW_MSG_LEN + 1];
23 
24  HECMW_vsnprintf(msg, sizeof(msg), fmt, ap);
25  if (add_location) {
26  char *s = "";
27  if (strlen(msg) > 0) s = ": ";
28  snprintf(line, sizeof(line), "%s:%d%s", grid_filename, HECMW_gflex_get_lineno(), s);
29  }
30  if (loglv == HECMW_LOG_ERROR) {
31  HECMW_set_error(msgno, "%s%s", line, msg);
32  } else {
33  HECMW_print_msg(loglv, msgno, "%s%s", line, msg);
34  }
35 }
36 
37 static void set_err(int msgno, const char *fmt, ...) {
38  va_list ap;
39 
40  va_start(ap, fmt);
41  do_logging(HECMW_LOG_ERROR, msgno, 1, fmt, ap);
42  va_end(ap);
43 }
44 
45 static void set_err_token(int token, int msgno, const char *fmt, ...) {
46  int msg_no;
47  va_list ap;
48 
49  if (!token) {
50  msg_no = HECMW_IO_GEOFEM_E0003;
51  } else {
52  msg_no = msgno;
53  }
54  va_start(ap, fmt);
55  do_logging(HECMW_LOG_ERROR, msg_no, 1, fmt, ap);
56  va_end(ap);
57 }
58 
59 /*-----------------------------------------------------------------------------
60  * read functions
61  */
62 
63 static int read_pe(void) {
64  int token, n_neighbor_pe;
65 
66  /* PE-ID */
68  if (token != HECMW_GFLEX_INT) {
69  set_err_token(token, HECMW_IO_GEOFEM_E0004, "PE-ID required");
70  return -1;
71  }
72 
73  /* NEIBPEtot */
75  if (token != HECMW_GFLEX_INT) {
76  set_err_token(token, HECMW_IO_GEOFEM_E0004, "NEIBOEtot required");
77  return -1;
78  }
79  n_neighbor_pe = HECMW_gflex_get_number();
80  if (n_neighbor_pe < 0) {
81  set_err(HECMW_IO_GEOFEM_E0301, "");
82  return -1;
83  }
84  if (n_neighbor_pe != 0) {
85  set_err(HECMW_IO_GEOFEM_E0301, "");
86  return -1;
87  }
88 
89  token = HECMW_gflex_next_token();
90  if (token != HECMW_GFLEX_NL) {
91  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
92  return -1;
93  }
94 
95  /* ESSENTIAL BLANK LINE */
96  token = HECMW_gflex_next_token();
97  if (token != HECMW_GFLEX_NL) {
98  set_err_token(token, HECMW_IO_GEOFEM_E0004, "Needs ESSENTIAL BLANK LINE");
99  return -1;
100  }
101 
102  return 0;
103 }
104 
105 static int read_node(void) {
106  int nnode, nninternal, i, token;
107 
108  /* NODtot */
110  if (token != HECMW_GFLEX_INT) {
111  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
112  return -1;
113  }
114  nnode = HECMW_gflex_get_number();
115  if (nnode <= 0) {
116  set_err(HECMW_IO_GEOFEM_E0311, "");
117  return -1;
118  }
119 
120  /* intNODtot */
122  if (token != HECMW_GFLEX_INT) {
123  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
124  return -1;
125  }
126  nninternal = HECMW_gflex_get_number();
127  if (nninternal <= 0) {
128  set_err(HECMW_IO_GEOFEM_E0312, "");
129  return -1;
130  }
131  if (nnode != nninternal) {
132  set_err(HECMW_IO_GEOFEM_E0313, "");
133  return -1;
134  }
135 
136  for (i = 0; i < nnode; i++) {
137  int id;
138  double x, y, z;
139 
140  /* nGlobalID */
142  if (token != HECMW_GFLEX_INT) {
143  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
144  return -1;
145  }
146  id = HECMW_gflex_get_number();
147  if (id <= 0) {
148  set_err(HECMW_IO_GEOFEM_E0314, "");
149  return -1;
150  }
151 
152  /* X */
154  if (token != HECMW_GFLEX_DOUBLE && token != HECMW_GFLEX_INT) {
155  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
156  return -1;
157  }
159 
160  /* Y */
162  if (token != HECMW_GFLEX_DOUBLE && token != HECMW_GFLEX_INT) {
163  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
164  return -1;
165  }
167 
168  /* Z */
170  if (token != HECMW_GFLEX_DOUBLE && token != HECMW_GFLEX_INT) {
171  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
172  return -1;
173  }
175 
176  /* add node */
177  if (HECMW_io_add_node(id, x, y, z) == NULL) {
178  return -1;
179  }
180 
181  /* add node to group */
182  if (HECMW_io_add_ngrp("ALL", 1, &id) < 0) { /* always add to 'ALL' */
183  return -1;
184  }
185  }
186 
187  /* end of NODE */
188  token = HECMW_gflex_next_token();
189  if (token != HECMW_GFLEX_NL) {
190  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
191  return -1;
192  }
193 
194  return 0;
195 }
196 
197 static int read_elem(void) {
198  int i, j, n, token, nelem;
199  int *elem_type;
200 
201  /* ELMtot */
203  if (token != HECMW_GFLEX_INT) {
204  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
205  return -1;
206  }
207  nelem = HECMW_gflex_get_number();
208  if (nelem <= 0) {
209  set_err(HECMW_IO_GEOFEM_E0321, "");
210  return -1;
211  }
212 
213  /* ELMtype */
214  elem_type = HECMW_malloc(sizeof(*elem_type) * nelem);
215  if (elem_type == NULL) {
216  HECMW_set_error(errno, "");
217  return -1;
218  }
219  for (i = 0; i < nelem; i++) {
221  if (token != HECMW_GFLEX_INT) {
222  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
223  return -1;
224  }
225  elem_type[i] = HECMW_gflex_get_number();
227  if (n == -1) {
228  set_err(HECMW_IO_GEOFEM_E0322, "");
229  return -1;
230  }
231  }
232 
233  /* eGlobalID, connectivity */
234  for (i = 0; i < nelem; i++) {
235  int id, hecmw_type;
236  int node[HECMW_MAX_NODE_MAX];
237 
238  /* eGlobalID */
240  if (token != HECMW_GFLEX_INT) {
241  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
242  return -1;
243  }
244  id = HECMW_gflex_get_number();
245  if (id <= 0) {
246  set_err(HECMW_IO_GEOFEM_E0324, "Invalid Element ID");
247  return -1;
248  }
249 
250  hecmw_type = HECMW_get_etype_GeoFEM2HECMW(elem_type[i]);
251  n = HECMW_get_max_node(hecmw_type);
252  for (j = 0; j < n; j++) {
253  /* connectivity */
255  if (token != HECMW_GFLEX_INT) {
256  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
257  return -1;
258  }
259  node[j] = HECMW_gflex_get_number();
260  if (node[j] <= 0) {
261  set_err(HECMW_IO_GEOFEM_E0323, "");
262  return -1;
263  }
264  }
265 
266  /* add element */
267  if (HECMW_io_add_elem(id, hecmw_type, node, 0, NULL) == NULL) {
268  return -1;
269  }
270 
271  /* add element to eroup */
272  if (HECMW_io_add_egrp("ALL", 1, &id) < 0) { /* always add to 'ALL' */
273  return -1;
274  }
275  }
276 
277  /* end of ELEMENT */
278  token = HECMW_gflex_next_token();
279  if (token != HECMW_GFLEX_NL) {
280  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
281  return -1;
282  }
283 
284  HECMW_free(elem_type);
285 
286  return 0;
287 }
288 
289 static int read_import(void) {
290  int token;
291 
292  /* ESSENTIAL BLANK LINE */
293  token = HECMW_gflex_next_token();
294  if (token != HECMW_GFLEX_NL) {
295  set_err_token(token, HECMW_IO_GEOFEM_E0004, "Needs ESSENTIAL BLANK LINE");
296  return -1;
297  }
298  return 0;
299 }
300 
301 static int read_export(void) {
302  int token;
303 
304  /* ESSENTIAL BLANK LINE */
305  token = HECMW_gflex_next_token();
306  if (token != HECMW_GFLEX_NL) {
307  set_err_token(token, HECMW_IO_GEOFEM_E0004, "Needs ESSENTIAL BLANK LINE");
308  return -1;
309  }
310  return 0;
311 }
312 
313 static int read_ngrp(void) {
314  int i, j, n, token, ngrp;
315  int *grp_index;
316 
317  /* NODgrpTOT */
319  if (token != HECMW_GFLEX_INT) {
320  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
321  return -1;
322  }
323  ngrp = HECMW_gflex_get_number();
324  if (ngrp < 0) {
325  set_err(HECMW_IO_GEOFEM_E0341, "");
326  return -1;
327  }
328  if (ngrp == 0) {
329  token = HECMW_gflex_next_token();
330  if (token != HECMW_GFLEX_NL) {
331  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
332  return -1;
333  }
334  /* ESSENTIAL BLANK LINE */
335  token = HECMW_gflex_next_token();
336  if (token != HECMW_GFLEX_NL) {
337  set_err_token(token, HECMW_IO_GEOFEM_E0004, "Needs ESSENTIAL BLANK LINE");
338  return -1;
339  }
340  return 0;
341  }
342 
343  /* NODgrpINDEX */
344  grp_index = HECMW_malloc(sizeof(*grp_index) * (ngrp + 1));
345  if (grp_index == NULL) {
346  HECMW_set_error(errno, "");
347  return -1;
348  }
349  grp_index[0] = 0;
350  for (i = 0; i < ngrp; i++) {
352  if (token != HECMW_GFLEX_INT) {
353  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
354  return -1;
355  }
356  grp_index[i + 1] = HECMW_gflex_get_number();
357  if (grp_index[i + 1] <= 0) {
358  set_err(HECMW_IO_GEOFEM_E0342, "");
359  return -1;
360  }
361  }
362 
363  for (i = 0; i < ngrp; i++) {
364  char *p, name[HECMW_NAME_LEN + 1];
365  int *node;
366 
367  /* NODgrpNAME */
369  if (token != HECMW_GFLEX_NAME) {
370  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
371  return -1;
372  }
373  p = HECMW_gflex_get_text();
374  if (strlen(p) > HECMW_NAME_LEN) {
375  set_err(HECMW_IO_E0001, "");
376  return -1;
377  }
378  snprintf(name, sizeof(name), "%s", p);
379 
380  /* NODgrpITEM */
381  n = grp_index[i + 1] - grp_index[i];
382  node = HECMW_malloc(sizeof(*node) * n);
383  if (node == NULL) {
384  HECMW_set_error(errno, "");
385  return -1;
386  }
387  for (j = 0; j < n; j++) {
389  if (token != HECMW_GFLEX_INT) {
390  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
391  return -1;
392  }
393  node[j] = HECMW_gflex_get_number();
394  if (node[j] <= 0) {
395  set_err(HECMW_IO_GEOFEM_E0343, "");
396  return -1;
397  }
398  }
399 
400  /* add node to node group */
401  if (HECMW_io_add_ngrp(name, n, node) < 0) {
402  return -1;
403  }
404 
405  HECMW_free(node);
406  }
407 
408  /* end of NGRP */
409  token = HECMW_gflex_next_token();
410  if (token != HECMW_GFLEX_NL) {
411  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
412  return -1;
413  }
414 
415  HECMW_free(grp_index);
416 
417  return 0;
418 }
419 
420 static int read_egrp(void) {
421  int i, j, n, token, ngrp;
422  int *grp_index;
423 
424  /* ELMgrpTOT */
426  if (token != HECMW_GFLEX_INT) {
427  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
428  return -1;
429  }
430  ngrp = HECMW_gflex_get_number();
431  if (ngrp < 0) {
432  set_err(HECMW_IO_GEOFEM_E0351, "");
433  return -1;
434  }
435  if (ngrp == 0) {
436  token = HECMW_gflex_next_token();
437  if (token != HECMW_GFLEX_NL) {
438  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
439  return -1;
440  }
441  /* ESSENTIAL BLANK LINE */
442  token = HECMW_gflex_next_token();
443  if (token != HECMW_GFLEX_NL) {
444  set_err_token(token, HECMW_IO_GEOFEM_E0004, "Needs ESSENTIAL BLANK LINE");
445  return -1;
446  }
447  return 0;
448  }
449 
450  /* ELMgrpINDEX */
451  grp_index = HECMW_malloc(sizeof(*grp_index) * (ngrp + 1));
452  if (grp_index == NULL) {
453  HECMW_set_error(errno, "");
454  return -1;
455  }
456  grp_index[0] = 0;
457  for (i = 0; i < ngrp; i++) {
459  if (token != HECMW_GFLEX_INT) {
460  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
461  return -1;
462  }
463  grp_index[i + 1] = HECMW_gflex_get_number();
464  if (grp_index[i + 1] <= 0) {
465  set_err(HECMW_IO_GEOFEM_E0352, "");
466  return -1;
467  }
468  }
469 
470  for (i = 0; i < ngrp; i++) {
471  char *p, name[HECMW_NAME_LEN + 1];
472  int *elem;
473 
474  /* ELMgrpNAME */
476  if (token != HECMW_GFLEX_NAME) {
477  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
478  return -1;
479  }
480  p = HECMW_gflex_get_text();
481  if (strlen(p) > HECMW_NAME_LEN) {
482  set_err(HECMW_IO_E0001, "");
483  return -1;
484  }
485  snprintf(name, sizeof(name), "%s", p);
486 
487  /* ELMgrpITEM */
488  n = grp_index[i + 1] - grp_index[i];
489  elem = HECMW_malloc(sizeof(*elem) * n);
490  if (elem == NULL) {
491  HECMW_set_error(errno, "");
492  return -1;
493  }
494  for (j = 0; j < n; j++) {
496  if (token != HECMW_GFLEX_INT) {
497  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
498  return -1;
499  }
500  elem[j] = HECMW_gflex_get_number();
501  if (elem[j] <= 0) {
502  set_err(HECMW_IO_GEOFEM_E0353, "");
503  return -1;
504  }
505  }
506 
507  /* add node to node group */
508  if (HECMW_io_add_egrp(name, n, elem) < 0) {
509  return -1;
510  }
511 
512  HECMW_free(elem);
513  }
514 
515  /* end of EGRP */
516  token = HECMW_gflex_next_token();
517  if (token != HECMW_GFLEX_NL) {
518  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
519  return -1;
520  }
521 
522  HECMW_free(grp_index);
523 
524  return 0;
525 }
526 
527 static int read_sgrp(void) {
528  int i, j, n, token, ngrp;
529  int *grp_index;
530 
531  /* SUFgrpTOT */
533  if (token != HECMW_GFLEX_INT) {
534  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
535  return -1;
536  }
537  ngrp = HECMW_gflex_get_number();
538  if (ngrp < 0) {
539  set_err(HECMW_IO_GEOFEM_E0361, "");
540  return -1;
541  }
542  if (ngrp == 0) {
543  token = HECMW_gflex_next_token();
544  if (token != HECMW_GFLEX_NL) {
545  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
546  return -1;
547  }
548  /* ESSENTIAL BLANK LINE */
549  token = HECMW_gflex_next_token();
550  if (token != HECMW_GFLEX_NL) {
551  set_err_token(token, HECMW_IO_GEOFEM_E0004, "Needs ESSENTIAL BLANK LINE");
552  return -1;
553  }
554  return 0;
555  }
556 
557  /* SUFgrpINDEX */
558  grp_index = HECMW_malloc(sizeof(*grp_index) * (ngrp + 1));
559  if (grp_index == NULL) {
560  HECMW_set_error(errno, "");
561  return -1;
562  }
563  grp_index[0] = 0;
564  for (i = 0; i < ngrp; i++) {
566  if (token != HECMW_GFLEX_INT) {
567  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
568  return -1;
569  }
570  grp_index[i + 1] = HECMW_gflex_get_number();
571  if (grp_index[i + 1] <= 0) {
572  set_err(HECMW_IO_GEOFEM_E0362, "");
573  return -1;
574  }
575  }
576 
577  for (i = 0; i < ngrp; i++) {
578  char *p, name[HECMW_NAME_LEN + 1];
579  int *elem, *surf;
580 
581  /* SUFgrpNAME */
583  if (token != HECMW_GFLEX_NAME) {
584  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
585  return -1;
586  }
587  p = HECMW_gflex_get_text();
588  if (strlen(p) > HECMW_NAME_LEN) {
589  set_err(HECMW_IO_E0001, "");
590  return -1;
591  }
592  snprintf(name, sizeof(name), "%s", p);
593 
594  /* SUFgrpITEM */
595  n = grp_index[i + 1] - grp_index[i];
596  elem = HECMW_malloc(sizeof(*elem) * n);
597  if (elem == NULL) {
598  HECMW_set_error(errno, "");
599  return -1;
600  }
601  surf = HECMW_malloc(sizeof(*surf) * n);
602  if (surf == NULL) {
603  HECMW_set_error(errno, "");
604  return -1;
605  }
606  for (j = 0; j < n; j++) {
608  if (token != HECMW_GFLEX_INT) {
609  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
610  return -1;
611  }
612  elem[j] = HECMW_gflex_get_number();
613  if (elem[j] <= 0) {
614  set_err(HECMW_IO_GEOFEM_E0363, "");
615  return -1;
616  }
617  }
618  for (j = 0; j < n; j++) {
620  if (token != HECMW_GFLEX_INT) {
621  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
622  return -1;
623  }
624  surf[j] = HECMW_gflex_get_number();
625  if (surf[j] <= 0) {
626  set_err(HECMW_IO_GEOFEM_E0363, "");
627  return -1;
628  }
629  }
630 
631  /* add to surf group */
632  if (HECMW_io_add_sgrp(name, n, elem, surf) < 0) {
633  return -1;
634  }
635 
636  HECMW_free(elem);
637  HECMW_free(surf);
638  }
639 
640  /* end of SGRP */
641  token = HECMW_gflex_next_token();
642  if (token != HECMW_GFLEX_NL) {
643  set_err_token(token, HECMW_IO_GEOFEM_E0004, "");
644  return -1;
645  }
646 
647  HECMW_free(grp_index);
648 
649  return 0;
650 }
651 
652 static int parse(void) {
653  if (read_pe()) return -1;
654  if (read_node()) return -1;
655  if (read_elem()) return -1;
656  if (read_import()) return -1;
657  if (read_export()) return -1;
658  if (read_ngrp()) return -1;
659  if (read_egrp()) return -1;
660  if (read_sgrp()) return -1;
661 
662  return 0;
663 }
664 
665 /* read only. Not make hecmwST_local_mesh */
666 int HECMW_read_geofem_mesh(const char *filename) {
667  FILE *fp;
668 
669  HECMW_log(HECMW_LOG_DEBUG, "Start to read GeoFEM mesh");
670 
671  if (filename == NULL) {
673  "Not specified filename for GeoFEM mesh input routine");
674  return -1;
675  }
676  HECMW_log(HECMW_LOG_DEBUG, "GeoFEM mesh file is '%s'", filename);
677 
678  if (strlen(filename) > HECMW_FILENAME_LEN) {
680  return -1;
681  }
682 
683  snprintf(grid_filename, sizeof(grid_filename), "%s", filename);
684  HECMW_io_set_gridfile(grid_filename);
685 
686  if ((fp = fopen(filename, "r")) == NULL) {
687  HECMW_set_error(HECMW_IO_HEC_E0001, "File: %s, %s", filename,
688  strerror(errno));
689  return -1;
690  }
691 
692  if (HECMW_gflex_set_input(fp)) return -1;
693 
694  HECMW_log(HECMW_LOG_DEBUG, "Parsing...");
695  if (parse()) {
696  return -1;
697  }
698 
699  if (fclose(fp)) {
700  HECMW_set_error(HECMW_IO_HEC_E0002, "File: %s, %s", filename,
701  strerror(errno));
702  return -1;
703  }
704 
705  snprintf(grid_filename, sizeof(grid_filename), "Unknown");
706 
707  return 0;
708 }
709 
710 struct hecmwST_local_mesh *HECMW_get_geofem_mesh(const char *filename) {
711  struct hecmwST_local_mesh *local_mesh;
712 
713  if (HECMW_io_init()) return NULL;
714  if (HECMW_io_pre_process()) return NULL;
715  if (HECMW_read_geofem_mesh(filename)) return NULL;
716  if (HECMW_io_post_process()) return NULL;
717  local_mesh = HECMW_io_make_local_mesh();
718  if (local_mesh == NULL) return NULL;
719  if (HECMW_io_finalize()) return NULL;
720 
721  snprintf(grid_filename, sizeof(grid_filename), "Unknown");
722 
723  return local_mesh;
724 }
#define HECMW_MAX_NODE_MAX
#define HECMW_FILENAME_LEN
Definition: hecmw_config.h:74
#define HECMW_MSG_LEN
Definition: hecmw_config.h:76
#define HECMW_NAME_LEN
Definition: hecmw_config.h:72
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:33
int HECMW_get_max_node(int etype)
Definition: hecmw_etype.c:413
int HECMW_get_etype_GeoFEM2HECMW(int etype)
Definition: hecmw_etype.c:344
int HECMW_gflex_next_token_skip(int skip_token)
int HECMW_gflex_set_input(FILE *fp)
int HECMW_gflex_get_lineno(void)
double HECMW_gflex_get_number(void)
int HECMW_gflex_next_token(void)
@ HECMW_GFLEX_NAME
Definition: hecmw_gflex.h:15
@ HECMW_GFLEX_INT
Definition: hecmw_gflex.h:13
@ HECMW_GFLEX_NL
Definition: hecmw_gflex.h:12
@ HECMW_GFLEX_DOUBLE
Definition: hecmw_gflex.h:14
char * HECMW_gflex_get_text(void)
struct hecmwST_local_mesh * HECMW_get_geofem_mesh(const char *filename)
int HECMW_read_geofem_mesh(const char *filename)
int HECMW_io_add_ngrp(const char *name, int nnode, int *node)
int HECMW_io_add_sgrp(const char *name, int n_item, int *elem, int *surf)
int HECMW_io_add_egrp(const char *name, int nelem, int *elem)
struct hecmwST_local_mesh * HECMW_io_make_local_mesh(void)
int HECMW_io_init(void)
struct hecmw_io_element * HECMW_io_add_elem(int id, int type, int *node, int nmatitem, double *matitem)
int HECMW_io_pre_process(void)
struct hecmw_io_node * HECMW_io_add_node(int id, double x, double y, double z)
int HECMW_io_post_process(void)
int HECMW_io_set_gridfile(char *gridfile)
int HECMW_io_finalize(void)
#define NULL
int HECMW_log(int loglv, const char *fmt,...)
Definition: hecmw_log.c:260
#define HECMW_LOG_ERROR
Definition: hecmw_log.h:15
#define HECMW_LOG_DEBUG
Definition: hecmw_log.h:21
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
#define HECMW_IO_HEC_E0002
Definition: hecmw_msgno.h:191
#define HECMW_IO_GEOFEM_E0362
Definition: hecmw_msgno.h:188
#define HECMW_IO_GEOFEM_E0353
Definition: hecmw_msgno.h:186
#define HECMW_IO_GEOFEM_E0363
Definition: hecmw_msgno.h:189
#define HECMW_IO_GEOFEM_E0322
Definition: hecmw_msgno.h:176
#define HECMW_IO_GEOFEM_E0361
Definition: hecmw_msgno.h:187
#define HECMW_IO_GEOFEM_E0351
Definition: hecmw_msgno.h:184
#define HECMW_IO_HEC_E0001
Definition: hecmw_msgno.h:190
#define HECMW_IO_GEOFEM_E0004
Definition: hecmw_msgno.h:167
#define HECMW_IO_GEOFEM_E0312
Definition: hecmw_msgno.h:172
#define HECMW_IO_GEOFEM_E0341
Definition: hecmw_msgno.h:181
#define HECMW_IO_GEOFEM_E0301
Definition: hecmw_msgno.h:168
#define HECMW_IO_GEOFEM_E0324
Definition: hecmw_msgno.h:178
#define HECMW_IO_GEOFEM_E0323
Definition: hecmw_msgno.h:177
#define HECMW_IO_GEOFEM_E0343
Definition: hecmw_msgno.h:183
#define HECMW_IO_GEOFEM_E0321
Definition: hecmw_msgno.h:175
#define HECMW_IO_GEOFEM_E0313
Definition: hecmw_msgno.h:173
#define HECMW_IO_E0002
Definition: hecmw_msgno.h:138
#define HECMW_IO_GEOFEM_E0342
Definition: hecmw_msgno.h:182
#define HECMW_IO_E0001
Definition: hecmw_msgno.h:137
#define HECMW_IO_GEOFEM_E0314
Definition: hecmw_msgno.h:174
#define HECMW_IO_GEOFEM_E0311
Definition: hecmw_msgno.h:171
#define HECMW_IO_GEOFEM_E0352
Definition: hecmw_msgno.h:185
#define HECMW_IO_GEOFEM_E0003
Definition: hecmw_msgno.h:166
void HECMW_print_msg(int loglv, int msgno, const char *fmt,...)
Definition: hecmw_util.c:138
int HECMW_vsnprintf(char *str, size_t size, const char *format, va_list ap)
Definition: hecmw_util.c:145