FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_io_hec.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 <errno.h>
9 #include <stdbool.h>
10 #include "hecmw_util.h"
11 #include "hecmw_heclex.h"
12 #include "hecmw_io_hec.h"
13 #include "hecmw_io_mesh.h"
14 #include "hecmw_io_struct.h"
15 #include "hecmw_struct.h"
16 #include "hecmw_config.h"
17 #include "hecmw_system.h"
18 #include "hecmw_dist.h"
19 #include "hecmw_dist_print.h"
20 #include "hecmw_common.h"
21 #include "hecmw_path.h"
22 #include "hecmw_conn_conv.h"
23 
24 static char grid_filename[HECMW_FILENAME_LEN + 1] = "Unknown";
25 static char include_filename[HECMW_FILENAME_LEN + 1] = "Unknown";
26 
27 static int connectivity_type = HECMW_CONNTYPE_HECMW;
28 
29 /*----------------------------------------------------------------------------*/
30 
31 static void do_logging(int loglv, int msgno, int add_location, const char *fmt,
32  va_list ap) {
33  char line[100] = "";
34  char msg[HECMW_MSG_LEN + 1];
35  char *p;
36 
37  HECMW_vsnprintf(msg, sizeof(msg), fmt, ap);
38  if (add_location) {
39  char *s = "";
40  if (strlen(msg) > 0) s = ": ";
41  p = HECMW_heclex_is_including() ? include_filename : grid_filename;
42  HECMW_snprintf(line, sizeof(line), "%s:%d%s", p, HECMW_heclex_get_lineno(),
43  s);
44  }
45  if (loglv == HECMW_LOG_ERROR) {
46  HECMW_set_error(msgno, "%s%s", line, msg);
47  } else {
48  HECMW_print_msg(loglv, msgno, "%s%s", line, msg);
49  }
50 }
51 
52 static void set_err(int msgno, const char *fmt, ...) {
53  va_list ap;
54 
55  va_start(ap, fmt);
56  do_logging(HECMW_LOG_ERROR, msgno, 1, fmt, ap);
57  va_end(ap);
58 }
59 
60 static void set_err_token(int token, int msgno, const char *fmt, ...) {
61  int msg_no;
62  va_list ap;
63 
64  if (!token) {
65  msg_no = HECMW_IO_HEC_E0003;
66  } else {
67  msg_no = msgno;
68  }
69  va_start(ap, fmt);
70  do_logging(HECMW_LOG_ERROR, msg_no, 1, fmt, ap);
71  va_end(ap);
72 }
73 
74 /*-----------------------------------------------------------------------------
75  ReadFunc
76 */
77 
78 static int read_input(int msgno_invalid_token) {
79  int token;
80  char *p;
81 
82  token = HECMW_heclex_next_token();
83  if (token != '=') {
84  set_err_token(token, msgno_invalid_token, "'=' required after INPUT");
85  return -1;
86  }
87  token = HECMW_heclex_next_token();
88  if (token != HECMW_HECLEX_FILENAME && token != HECMW_HECLEX_NAME) {
89  set_err_token(token, msgno_invalid_token, "Invalid filename for INPUT");
90  return -1;
91  }
93  if (strlen(p) > HECMW_FILENAME_LEN) {
94  set_err(HECMW_IO_E0002, "");
95  return -1;
96  }
97  if (HECMW_is_absolute_path(p)) {
98  if (strlen(p) > HECMW_FILENAME_LEN) {
99  set_err(HECMW_IO_E0002, "");
100  return -1;
101  }
102  strcpy(include_filename, p);
103  } else {
104  char separator[10];
105  char *dname = HECMW_dirname(grid_filename);
106  sprintf(separator, "%c", HECMW_get_path_separator());
107  if (strlen(dname) + strlen(separator) + strlen(p) > HECMW_FILENAME_LEN) {
108  set_err(HECMW_IO_E0002, "");
109  return -1;
110  }
111  sprintf(include_filename, "%s%s%s", dname, separator, p);
112  }
113  return 0;
114 }
115 
116 /*----------------------------------------------------------------------------*/
117 
118 static int read_amp_head(void) {
119  int token;
120 
121  /* !AMPLITUDE */
122  token = HECMW_heclex_next_token();
123  if (token != HECMW_HECLEX_H_AMPLITUDE) {
124  set_err_token(token, HECMW_IO_HEC_E0100, "!AMPLITUDE required");
125  return -1;
126  }
127 
128  token = HECMW_heclex_next_token();
129  if (token != ',') {
130  set_err_token(token, HECMW_IO_HEC_E0100, "',' required after !AMPLITUDE");
131  return -1;
132  }
133 
134  return 0;
135 }
136 
137 static int read_amp_param_name(char *name) {
138  int token;
139  char *p;
140 
141  token = HECMW_heclex_next_token();
142  if (token != '=') {
143  set_err_token(token, HECMW_IO_HEC_E0100, "'=' required after NAME");
144  return -1;
145  }
146  token = HECMW_heclex_next_token();
147  if (token != HECMW_HECLEX_NAME) {
148  set_err_token(token, HECMW_IO_HEC_E0100,
149  "NAME must begin with a letter or '_'");
150  return -1;
151  }
152  p = HECMW_heclex_get_text();
153  if (strlen(p) > HECMW_NAME_LEN) {
154  set_err(HECMW_IO_E0001, "");
155  return -1;
156  }
157  strcpy(name, p);
158  HECMW_toupper(name);
159  if (HECMW_io_is_reserved_name(name)) {
160  set_err(HECMW_IO_E0003, "");
161  return -1;
162  }
163  return 0;
164 }
165 
166 static int read_amp_param_type(int *type) {
167  int token;
168 
169  token = HECMW_heclex_next_token();
170  if (token != '=') {
171  set_err_token(token, HECMW_IO_HEC_E0100, "'=' required after TYPE");
172  return -1;
173  }
174  token = HECMW_heclex_next_token();
175  if (token != HECMW_HECLEX_K_TIMEVALUE) {
176  set_err_token(token, HECMW_IO_HEC_E0100, "Invalid TYPE");
177  return -1;
178  }
179  *type = HECMW_HECLEX_K_TIMEVALUE;
180  return 0;
181 }
182 
183 static int read_amp_param_definition(int *definition) {
184  int token;
185 
186  token = HECMW_heclex_next_token();
187  if (token != '=') {
188  set_err_token(token, HECMW_IO_HEC_E0100, "'=' required after DEFINITION");
189  return -1;
190  }
191  token = HECMW_heclex_next_token();
192  if (token != HECMW_HECLEX_K_TABULAR) {
193  set_err_token(token, HECMW_IO_HEC_E0100, "Invalid DEFINITION");
194  return -1;
195  }
196  *definition = HECMW_AMP_TYPEDEF_TABULAR;
197  return 0;
198 }
199 
200 static int read_amp_param_time(int *time) {
201  int token;
202 
203  token = HECMW_heclex_next_token();
204  if (token != '=') {
205  set_err_token(token, HECMW_IO_HEC_E0100, "'=' after TIME required");
206  return -1;
207  }
208  token = HECMW_heclex_next_token();
209  if (token != HECMW_HECLEX_K_STEP_TIME) {
210  set_err_token(token, HECMW_IO_HEC_E0100, "Invalid TIME");
211  return -1;
212  }
213  *time = HECMW_AMP_TYPETIME_STEP;
214  return 0;
215 }
216 
217 static int read_amp_param_value(int *value) {
218  int token;
219 
220  token = HECMW_heclex_next_token();
221  if (token != '=') {
222  set_err_token(token, HECMW_IO_HEC_E0100, "'=' required after VALUE");
223  return -1;
224  }
225  token = HECMW_heclex_next_token();
226  if (token == HECMW_HECLEX_K_RELATIVE) {
228  } else if (token == HECMW_HECLEX_K_ABSOLUTE) {
230  } else {
231  set_err_token(token, HECMW_IO_HEC_E0100, "Invalid VALUE");
232  return -1;
233  }
234  return 0;
235 }
236 
237 static int read_amp_data(char *name, int type, int definition, int time,
238  int value) {
239  int i, token;
240  const int NITEM = 4;
241 
242  i = 0;
243  while (1) {
244  double val, t, tmp;
245 
246  token = HECMW_heclex_next_token();
247  if (i != 0 && token == HECMW_HECLEX_NL) break;
248  /* VAL */
249  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
250  set_err_token(token, HECMW_IO_HEC_E0100, "VAL required");
251  return -1;
252  }
253  val = HECMW_heclex_get_number();
254 
255  /* ',' */
256  token = HECMW_heclex_next_token();
257  if (token != ',') {
258  set_err_token(token, HECMW_IO_HEC_E0100, "',' required after VAL");
259  return -1;
260  }
261 
262  /* T */
263  token = HECMW_heclex_next_token();
264  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
265  set_err_token(token, HECMW_IO_HEC_E0100, "T required");
266  return -1;
267  }
269 
270  /* type ABAQUS*/
271  if (type == HECMW_HECLEX_K_TIMEVALUE) {
272  tmp = val;
273  val = t;
274  t = tmp;
275  }
276 
277  /* add */
278  if (HECMW_io_add_amp(name, definition, time, value, val, t) == NULL) {
279  return -1;
280  }
281 
282  i++;
283 
284  /* ',' or NL */
285  token = HECMW_heclex_next_token();
286  if (token != ',' && token != HECMW_HECLEX_NL) {
287  set_err_token(token, HECMW_IO_HEC_E0100, "',' or NL required");
288  return -1;
289  }
290  if (token == ',' && i == NITEM) {
291  token = HECMW_heclex_next_token();
292  if (token != HECMW_HECLEX_NL) {
293  set_err_token(token, HECMW_IO_HEC_E0100, "Only %d items allow per line",
294  NITEM);
295  return -1;
296  }
297  break;
298  }
299  if (token == HECMW_HECLEX_NL) break;
300  }
301  return 0;
302 }
303 
304 static int read_amplitude(void) {
305  int token, state;
306  int type = -1;
307  int definition = HECMW_AMP_TYPEDEF_TABULAR;
308  int time = HECMW_AMP_TYPETIME_STEP;
309  int value = HECMW_AMP_TYPEVAL_RELATIVE;
310  int flag_name = 0; /* flag for NAME */
311  int flag_type = 0; /* flag for TYPE */
312  int flag_definition = 0; /* flag for DEFINITION */
313  int flag_time = 0; /* flag for TIME */
314  int flag_value = 0; /* flag for VALUE */
315  int flag_input = 0; /* flag for INPUT */
316  char name[HECMW_NAME_LEN + 1] = "";
317  enum {
318  ST_FINISHED,
319  ST_HEADER_LINE,
320  ST_HEADER_LINE_PARAM,
321  ST_DATA_INCLUDE,
322  ST_DATA_LINE,
323  ST_FINALIZE
324  };
325 
326  state = ST_HEADER_LINE;
327  while (state != ST_FINISHED) {
328  if (state == ST_HEADER_LINE) {
329  if (read_amp_head()) return -1;
330  state = ST_HEADER_LINE_PARAM;
331  } else if (state == ST_HEADER_LINE_PARAM) {
332  token = HECMW_heclex_next_token();
333  if (token == HECMW_HECLEX_K_NAME) {
334  /* must */
335  if (read_amp_param_name(name)) return -1;
336  flag_name = 1;
337  } else if (token == HECMW_HECLEX_K_TYPE) {
338  /* optional */
339  if (read_amp_param_type(&type)) return -1;
340  flag_type = 1;
341  } else if (token == HECMW_HECLEX_K_DEFINITION) {
342  /* optional */
343  if (read_amp_param_definition(&definition)) return -1;
344  flag_definition = 1;
345  } else if (token == HECMW_HECLEX_K_TIME) {
346  /* optional */
347  if (read_amp_param_time(&time)) return -1;
348  flag_time = 1;
349  } else if (token == HECMW_HECLEX_K_VALUE) {
350  /* optional */
351  if (read_amp_param_value(&value)) return -1;
352  flag_value = 1;
353  } else if (token == HECMW_HECLEX_K_INPUT) {
354  /* optional */
355  if (read_input(HECMW_IO_HEC_E0100)) return -1;
356  flag_input = 1;
357  } else {
358  set_err_token(token, HECMW_IO_HEC_E0100, "Unknown parameter");
359  return -1;
360  }
361 
362  /* check next state */
363  token = HECMW_heclex_next_token();
364  if (token == HECMW_HECLEX_NL) {
365  /* check NAME */
366  if (!flag_name) {
367  set_err(HECMW_IO_HEC_E0101, "");
368  return -1;
369  }
370  state = flag_input ? ST_DATA_INCLUDE : ST_DATA_LINE;
371  } else if (token == ',') {
372  ; /* continue this state */
373  } else {
374  set_err_token(token, HECMW_IO_HEC_E0100, "Unknown parameter");
375  return -1;
376  }
377  } else if (state == ST_DATA_INCLUDE) {
378  HECMW_assert(flag_input);
379  HECMW_assert(flag_name);
380 
381  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
382  state = ST_DATA_LINE;
383  } else if (state == ST_DATA_LINE) {
384  HECMW_assert(flag_name);
385  if (read_amp_data(name, type, definition, time, value)) return -1;
386 
387  /* check next state */
388  token = HECMW_heclex_next_token();
389  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
390  state = ST_FINISHED;
391  }
393  } else {
394  HECMW_assert(0);
395  }
396  }
397  HECMW_log(HECMW_LOG_DEBUG, "read_amplitude done");
398  return 0;
399 }
400 
401 /*----------------------------------------------------------------------------*/
402 
403 static int read_contact_or_insert_pair_head(int *last_token, int *type) {
404  int token;
405 
406  /* !CONTACT */
407  token = HECMW_heclex_next_token();
408  if ( token == HECMW_HECLEX_H_CONTACT_PAIR ){
410  } else if ( token == HECMW_HECLEX_H_EMBED_PAIR ){
412  } else {
413  set_err_token(token, HECMW_IO_HEC_E2100, "!CONTACT or !EMBED required");
414  return -1;
415  }
416 
417  token = HECMW_heclex_next_token();
418  if (token != ',' && token != HECMW_HECLEX_NL) {
419  set_err_token(token, HECMW_IO_HEC_E2100,
420  "',' or NL required after !CONTACT");
421  return -1;
422  }
423  *last_token = token;
424 
425  return 0;
426 }
427 
428 static int read_contact_pair_param_name(char *name) {
429  int token;
430  char *p;
431 
432  token = HECMW_heclex_next_token();
433  if (token != '=') {
434  set_err_token(token, HECMW_IO_HEC_E2100, "'=' required after NAME");
435  return -1;
436  }
437  token = HECMW_heclex_next_token();
438  if (token != HECMW_HECLEX_NAME) {
439  set_err_token(token, HECMW_IO_HEC_E2100,
440  "NAME must begin with a letter or '_'");
441  return -1;
442  }
443  p = HECMW_heclex_get_text();
444  if (strlen(p) > HECMW_NAME_LEN) {
445  set_err(HECMW_IO_E0001, "");
446  return -1;
447  }
448  strcpy(name, p);
449  HECMW_toupper(name);
450  if (HECMW_io_is_reserved_name(name)) {
451  set_err(HECMW_IO_E0003, "");
452  return -1;
453  }
454  return 0;
455 }
456 
457 static int read_contact_pair_param_type(int *type) {
458  int token;
459 
460  token = HECMW_heclex_next_token();
461  if (token != '=') {
462  set_err_token(token, HECMW_IO_HEC_E2100, "'=' required after TYPE");
463  return -1;
464  }
465  token = HECMW_heclex_next_token();
466  if (token == HECMW_HECLEX_K_NODE_SURF) {
468  } else if (token == HECMW_HECLEX_K_SURF_SURF) {
470  } else if (token == HECMW_HECLEX_K_NODE_ELEM) {
472  } else {
473  set_err_token(token, HECMW_IO_HEC_E2100, "Invalid TYPE");
474  return -1;
475  }
476  return 0;
477 }
478 
479 static int read_contact_pair_data(char *name, int type) {
480  int token;
481  char *slave_grp, *master_grp;
482 
483  slave_grp = NULL;
484  master_grp = NULL;
485 
486  /* SLAVE NODE/SURF GROUP */
487  token = HECMW_heclex_next_token();
488  if (token == HECMW_HECLEX_NAME) {
489  slave_grp = HECMW_heclex_get_text();
490  if (strlen(slave_grp) > HECMW_NAME_LEN) {
491  set_err(HECMW_IO_E0001, "");
492  return -1;
493  }
494  HECMW_toupper(slave_grp);
495  slave_grp = HECMW_strdup(slave_grp);
496  if (slave_grp == NULL) {
497  HECMW_set_error(errno, "");
498  return -1;
499  }
500  } else {
501  if (type == HECMW_CONTACT_TYPE_NODE_SURF) {
502  set_err_token(token, HECMW_IO_HEC_E2100, "NGROUP name required");
503  } else if (type == HECMW_CONTACT_TYPE_SURF_SURF) {
504  set_err_token(token, HECMW_IO_HEC_E2100, "SGROUP name required");
505  } else if (type == HECMW_CONTACT_TYPE_NODE_ELEM) {
506  set_err_token(token, HECMW_IO_HEC_E2100, "NGROUP name required");
507  } else {
508  HECMW_assert(0);
509  }
510  return -1;
511  }
512 
513  /* ',' */
514  token = HECMW_heclex_next_token();
515  if (token != ',') {
516  set_err_token(token, HECMW_IO_HEC_E2100, "',' required after SGROUP");
517  return -1;
518  }
519 
520  /* MASTER SURF GROUP */
521  token = HECMW_heclex_next_token();
522  if (token == HECMW_HECLEX_NAME) {
523  master_grp = HECMW_heclex_get_text();
524  if (strlen(master_grp) > HECMW_NAME_LEN) {
525  set_err(HECMW_IO_E0001, "");
526  return -1;
527  }
528  HECMW_toupper(master_grp);
529  master_grp = HECMW_strdup(master_grp);
530  if (master_grp == NULL) {
531  HECMW_set_error(errno, "");
532  return -1;
533  }
534  } else {
535  set_err_token(token, HECMW_IO_HEC_E2100, "SGROUP name required");
536  return -1;
537  }
538 
539  /* NL */
540  token = HECMW_heclex_next_token();
541  if (token != HECMW_HECLEX_NL) {
542  set_err_token(token, HECMW_IO_HEC_E1000, "NL required after NGROUP");
543  return -1;
544  }
545 
546  /* add */
547  if (HECMW_io_add_contact(name, type, slave_grp, master_grp) == NULL) {
548  return -1;
549  };
550  HECMW_free(slave_grp);
551  HECMW_free(master_grp);
552 
553  return 0;
554 }
555 
556 static int read_contact_pair(void) {
557  int token, state;
558  int type = HECMW_CONTACT_TYPE_NODE_SURF;
559  int flag_name = 0; /* flag for NAME */
560  int flag_input = 0; /* flag for INPUT */
561  char name[HECMW_NAME_LEN + 1] = "";
562  enum {
563  ST_FINISHED,
564  ST_HEADER_LINE,
565  ST_HEADER_LINE_PARAM,
566  ST_DATA_INCLUDE,
567  ST_DATA_LINE,
568  };
569 
570  state = ST_HEADER_LINE;
571  while (state != ST_FINISHED) {
572  if (state == ST_HEADER_LINE) {
573  if (read_contact_or_insert_pair_head(&token,&type)) return -1;
574  if (token == HECMW_HECLEX_NL) {
575  state = ST_DATA_LINE;
576  } else if (token == ',') {
577  state = ST_HEADER_LINE_PARAM;
578  } else {
579  HECMW_assert(0);
580  }
581  } else if (state == ST_HEADER_LINE_PARAM) {
582  token = HECMW_heclex_next_token();
583  if (token == HECMW_HECLEX_K_NAME) {
584  /* must */
585  if (read_contact_pair_param_name(name)) return -1;
586  flag_name = 1;
587  } else if (token == HECMW_HECLEX_K_TYPE) {
588  /* optional */
589  if (read_contact_pair_param_type(&type)) return -1;
590  } else if (token == HECMW_HECLEX_K_INPUT) {
591  /* oprtional */
592  if (read_input(HECMW_IO_HEC_E2100)) return -1;
593  flag_input = 1;
594  } else {
595  set_err_token(token, HECMW_IO_HEC_E2100, "Unknown parameter");
596  return -1;
597  }
598 
599  /* check next parameter */
600  token = HECMW_heclex_next_token();
601  if (token == HECMW_HECLEX_NL) {
602  /* check NAME */
603  if (!flag_name) {
604  set_err(HECMW_IO_HEC_E2101, "");
605  return -1;
606  }
607  if (flag_input) {
608  state = ST_DATA_INCLUDE;
609  } else {
610  state = ST_DATA_LINE;
611  }
612  } else if (token == ',') {
613  ; /* continue this state */
614  } else {
615  set_err_token(token, HECMW_IO_HEC_E2100, "Unknown parameter");
616  return -1;
617  }
618  } else if (state == ST_DATA_INCLUDE) {
619  HECMW_assert(flag_input);
620 
621  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
622  state = ST_DATA_LINE;
623  } else if (state == ST_DATA_LINE) {
624  if (read_contact_pair_data(name, type)) return -1;
625 
626  /* check next state */
627  token = HECMW_heclex_next_token();
628  if (token != HECMW_HECLEX_NAME) {
629  state = ST_FINISHED;
630  }
632  } else {
633  HECMW_assert(0);
634  }
635  }
636  HECMW_log(HECMW_LOG_DEBUG, "read_contact done");
637  return 0;
638 }
639 
640 /*----------------------------------------------------------------------------*/
641 #if 0
642 static int
643 read_ecopy(void)
644 {
645  fprintf(stderr, "!ECOPY has not implemented yet\n");
647  return 0;
648 }
649 
650 
651 static int
652 read_egen(void)
653 {
654  fprintf(stderr, "!EGEN has not implemented yet\n");
656  return 0;
657 }
658 #endif
659 
660 /*----------------------------------------------------------------------------*/
661 
662 static int read_egrp_head(void) {
663  int token;
664 
665  /* !EGROUP */
666  token = HECMW_heclex_next_token();
667  if (token != HECMW_HECLEX_H_EGROUP) {
668  set_err_token(token, HECMW_IO_HEC_E0500, "!EGROUP required");
669  return -1;
670  }
671 
672  token = HECMW_heclex_next_token();
673  if (token != ',') {
674  set_err_token(token, HECMW_IO_HEC_E0500, "',' required after !EGROUP");
675  return -1;
676  }
677 
678  return 0;
679 }
680 
681 static int read_egrp_param_egrp(char *egrp) {
682  int token;
683  char *p;
684 
685  token = HECMW_heclex_next_token();
686  if (token != '=') {
687  set_err_token(token, HECMW_IO_HEC_E0500, "'=' required after EGRP");
688  return -1;
689  }
690  token = HECMW_heclex_next_token();
691  if (token != HECMW_HECLEX_NAME) {
692  set_err_token(token, HECMW_IO_HEC_E0500,
693  "EGRP must begin with a letter or '_'");
694  return -1;
695  }
696  p = HECMW_heclex_get_text();
697  if (strlen(p) > HECMW_NAME_LEN) {
698  set_err(HECMW_IO_E0001, "");
699  return -1;
700  }
701  strcpy(egrp, p);
702  HECMW_toupper(egrp);
703  if (HECMW_io_is_reserved_name(egrp)) {
704  set_err(HECMW_IO_E0003, "");
705  return -1;
706  }
707  if (strcmp(egrp, "ALL") == 0) {
708  set_err(HECMW_IO_E0003, "Reserved name: %s", egrp);
709  return -1;
710  }
711  return 0;
712 }
713 
714 static int read_egrp_data(char *egrp) {
715  int i, n, *elem, token;
716  struct hecmw_io_id *head, *prev, *p, *q;
717 
718  n = 0;
719  prev = NULL;
720  head = NULL;
721  while (1) {
722  struct hecmw_io_id *id;
723 
724  token = HECMW_heclex_next_token();
725  if (n != 0 && token == HECMW_HECLEX_NL) break;
726 
727  id = HECMW_malloc(sizeof(*id));
728  if (id == NULL) {
729  HECMW_set_error(errno, "");
730  return -1;
731  }
732 
733  /* elemX */
734  if (token != HECMW_HECLEX_INT) {
735  set_err_token(token, HECMW_IO_HEC_E0500, "Element ID required");
736  return -1;
737  }
738  id->id = HECMW_heclex_get_number();
739  id->next = NULL;
740  if (head == NULL) {
741  head = id;
742  } else {
743  prev->next = id;
744  }
745  prev = id;
746  n++;
747 
748  /* ',' or NL */
749  token = HECMW_heclex_next_token();
750  if (token != ',' && token != HECMW_HECLEX_NL) {
751  set_err_token(token, HECMW_IO_HEC_E0500,
752  "',' or NL required after element ID");
753  return -1;
754  }
755  if (token == HECMW_HECLEX_NL) break;
756  }
757  HECMW_assert(head);
758  HECMW_assert(n > 0);
759 
760  /* add elem to group */
761  elem = HECMW_malloc(sizeof(*elem) * n);
762  if (elem == NULL) {
763  HECMW_set_error(errno, "");
764  return -1;
765  }
766  i = 0;
767  p = head;
768  while (p) {
769  elem[i++] = p->id;
770  q = p;
771  p = p->next;
772  HECMW_free(q);
773  }
774  if (HECMW_io_add_egrp(egrp, n, elem) < 0) {
775  return -1;
776  }
777  HECMW_free(elem);
778 
779  return 0;
780 }
781 
782 static int read_egrp_generate(char *egrp) {
783  int i, n, id, *elem, token;
784  int elem1, elem2, elem3;
785 
786  while (1) {
787  /* elem1 */
788  token = HECMW_heclex_next_token();
789  if (token != HECMW_HECLEX_INT) {
790  set_err_token(token, HECMW_IO_HEC_E0500, "elem1 required");
791  return -1;
792  }
793  elem1 = HECMW_heclex_get_number();
794  if (elem1 <= 0) {
795  set_err(HECMW_IO_HEC_E0502, "");
796  return -1;
797  }
798 
799  /* ',' */
800  token = HECMW_heclex_next_token();
801  if (token != ',') {
802  set_err_token(token, HECMW_IO_HEC_E0500, "',' required after elem1");
803  return -1;
804  }
805 
806  /* elem2 */
807  token = HECMW_heclex_next_token();
808  if (token != HECMW_HECLEX_INT) {
809  set_err_token(token, HECMW_IO_HEC_E0500, "elem2 required");
810  return -1;
811  }
812  elem2 = HECMW_heclex_get_number();
813  if (elem2 <= 0) {
814  set_err(HECMW_IO_HEC_E0502, "");
815  return -1;
816  }
817 
818  /* ',' or NL */
819  token = HECMW_heclex_next_token();
820  if (token == ',') {
821  /* elem3 */
822  token = HECMW_heclex_next_token();
823  if (token != HECMW_HECLEX_INT) {
824  set_err_token(token, HECMW_IO_HEC_E0500, "Increment required");
825  return -1;
826  }
827  elem3 = HECMW_heclex_get_number();
828  if (elem3 <= 0) {
829  set_err(HECMW_IO_HEC_E0502, "");
830  return -1;
831  }
832 
833  /* NL */
834  token = HECMW_heclex_next_token();
835  if (token != HECMW_HECLEX_NL) {
836  set_err_token(token, HECMW_IO_HEC_E0500, "NL required after increment");
837  return -1;
838  }
839  } else if (token == HECMW_HECLEX_NL) {
840  elem3 = 1;
841  } else {
842  set_err_token(token, HECMW_IO_HEC_E0500,
843  "',' or NL required after elem2");
844  return -1;
845  }
846  HECMW_assert(token == HECMW_HECLEX_NL);
847 
848  /* make element */
849  if (elem1 > elem2) {
850  set_err(HECMW_IO_HEC_E0503,
851  "Cannot generate between %d and %d with an increment of %d",
852  elem1, elem2, elem3);
853  return -1;
854  }
855  if ((elem2 - elem1) % elem3) {
856  set_err(HECMW_IO_HEC_E0503,
857  "Cannot generate between %d and %d with an increment of %d",
858  elem1, elem2, elem3);
859  return -1;
860  }
861 
862  n = (elem2 - elem1) / elem3 + 1;
863  elem = HECMW_malloc(sizeof(*elem) * n);
864  if (elem == NULL) {
865  HECMW_set_error(errno, "");
866  return -1;
867  }
868 
869  i = 0;
870  for (id = elem1; id <= elem2; id += elem3) {
871  elem[i++] = id;
872  }
873  HECMW_assert(i == n);
874  if (HECMW_io_add_egrp(egrp, n, elem) < 0) return -1;
875  HECMW_free(elem);
876 
877  /* check next state */
878  token = HECMW_heclex_next_token();
879  if (token != HECMW_HECLEX_INT) {
881  break;
882  }
884  }
885  return 0;
886 }
887 
888 static int read_egroup(void) {
889  int token, state;
890  int flag_egrp = 0; /* flag for EGRP */
891  int flag_generate = 0; /* flag for GENERATE */
892  int flag_input = 0; /* flag for INPUT */
893  char egrp[HECMW_NAME_LEN + 1] = "";
894  enum {
895  ST_FINISHED,
896  ST_HEADER_LINE,
897  ST_HEADER_LINE_PARAM,
898  ST_DATA_INCLUDE,
899  ST_DATA_LINE,
900  ST_DATA_LINE_GENERATE
901  };
902 
903  state = ST_HEADER_LINE;
904  while (state != ST_FINISHED) {
905  if (state == ST_HEADER_LINE) {
906  if (read_egrp_head()) return -1;
907  state = ST_HEADER_LINE_PARAM;
908  } else if (state == ST_HEADER_LINE_PARAM) {
909  token = HECMW_heclex_next_token();
910  if (token == HECMW_HECLEX_K_EGRP) {
911  /* must */
912  if (read_egrp_param_egrp(egrp)) return -1;
913  flag_egrp = 1;
914  } else if (token == HECMW_HECLEX_K_GENERATE) {
915  /* oprtional */
916  flag_generate = 1;
917  } else if (token == HECMW_HECLEX_K_INPUT) {
918  /* oprtional */
919  if (read_input(HECMW_IO_HEC_E0500)) return -1;
920  flag_input = 1;
921  } else {
922  set_err_token(token, HECMW_IO_HEC_E0500, "Unknown parameter");
923  return -1;
924  }
925 
926  /* check next parameter */
927  token = HECMW_heclex_next_token();
928  if (token == HECMW_HECLEX_NL) {
929  if (flag_input) {
930  state = ST_DATA_INCLUDE;
931  } else if (flag_generate) {
932  state = ST_DATA_LINE_GENERATE;
933  } else {
934  state = ST_DATA_LINE;
935  }
936  /* check */
937  if (!flag_egrp) {
938  set_err(HECMW_IO_HEC_E0501, "");
939  return -1;
940  }
941  } else if (token == ',') {
942  ; /* continue this state */
943  } else {
944  set_err_token(token, HECMW_IO_HEC_E0500, "Unknown parameter");
945  return -1;
946  }
947  } else if (state == ST_DATA_INCLUDE) {
948  HECMW_assert(flag_input);
949  HECMW_assert(flag_egrp);
950 
951  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
952  state = flag_generate ? ST_DATA_LINE_GENERATE : ST_DATA_LINE;
953  } else if (state == ST_DATA_LINE) {
954  HECMW_assert(!flag_generate);
955  HECMW_assert(flag_egrp);
956 
957  if (read_egrp_data(egrp)) return -1;
958 
959  /* check next state */
960  token = HECMW_heclex_next_token();
961  if (token != HECMW_HECLEX_INT) {
962  state = ST_FINISHED;
963  }
965  } else if (state == ST_DATA_LINE_GENERATE) {
966  HECMW_assert(flag_generate);
967  HECMW_assert(flag_egrp);
968 
969  if (read_egrp_generate(egrp)) return -1;
970  state = ST_FINISHED;
971  } else {
972  HECMW_assert(0);
973  }
974  }
975  HECMW_log(HECMW_LOG_DEBUG, "read_egroup done");
976  return 0;
977 }
978 
979 /*----------------------------------------------------------------------------*/
980 
981 static int read_elem_head(void) {
982  int token;
983 
984  /* !ELEMENT */
985  token = HECMW_heclex_next_token();
986  if (token != HECMW_HECLEX_H_ELEMENT) {
987  set_err_token(token, HECMW_IO_HEC_E0600, "!ELEMENT required");
988  return -1;
989  }
990 
991  token = HECMW_heclex_next_token();
992  if (token != ',') {
993  set_err_token(token, HECMW_IO_HEC_E0600, "',' required after !ELEMENT");
994  return -1;
995  }
996 
997  return 0;
998 }
999 
1000 static int read_elem_param_type(int *type) {
1001  int token;
1002 
1003  token = HECMW_heclex_next_token();
1004  if (token != '=') {
1005  set_err_token(token, HECMW_IO_HEC_E0600, "'=' required after TYPE");
1006  return -1;
1007  }
1008  token = HECMW_heclex_next_token();
1009  if (token != HECMW_HECLEX_INT) {
1010  set_err_token(token, HECMW_IO_HEC_E0600, "Invalid TYPE");
1011  return -1;
1012  }
1013  *type = HECMW_heclex_get_number();
1014  if (HECMW_get_max_node(*type) == -1) {
1015  set_err(HECMW_IO_HEC_E0601, "Invalid type: %d", *type);
1016  return -1;
1017  }
1018  return 0;
1019 }
1020 
1021 static int read_elem_param_egrp(char *egrp) {
1022  int token;
1023  char *p;
1024 
1025  token = HECMW_heclex_next_token();
1026  if (token != '=') {
1027  set_err_token(token, HECMW_IO_HEC_E0600, "'=' required after EGRP");
1028  return -1;
1029  }
1030  token = HECMW_heclex_next_token();
1031  if (token != HECMW_HECLEX_NAME) {
1032  set_err_token(token, HECMW_IO_HEC_E0600,
1033  "EGRP must begin with a letter or '_'");
1034  return -1;
1035  }
1036  p = HECMW_heclex_get_text();
1037  if (strlen(p) > HECMW_NAME_LEN) {
1038  set_err(HECMW_IO_E0001, "");
1039  return -1;
1040  }
1041  strcpy(egrp, p);
1042  HECMW_toupper(egrp);
1043  if (HECMW_io_is_reserved_name(egrp)) {
1044  set_err(HECMW_IO_E0003, "");
1045  return -1;
1046  }
1047  if (strcmp(egrp, "ALL") == 0) {
1048  set_err(HECMW_IO_E0003, "Reserved name: %s", egrp);
1049  return -1;
1050  }
1051  return 0;
1052 }
1053 
1054 static int read_elem_param_nmatitem(int *nmatitem) {
1055  int token;
1056 
1057  token = HECMW_heclex_next_token();
1058  if (token != '=') {
1059  set_err_token(token, HECMW_IO_HEC_E0600, "'=' required after MATITEM");
1060  return -1;
1061  }
1062  token = HECMW_heclex_next_token();
1063  if (token != HECMW_HECLEX_INT) {
1064  set_err_token(token, HECMW_IO_HEC_E0602, "");
1065  return -1;
1066  }
1067  *nmatitem = HECMW_heclex_get_number();
1068  if (*nmatitem < 0) {
1069  set_err_token(token, HECMW_IO_HEC_E0602, "");
1070  return -1;
1071  }
1072  return 0;
1073 }
1074 
1075 static int read_elem_data_conn(int *id, int nnode, int *node) {
1076  int token, i;
1077 
1078  /* element ID */
1079  token = HECMW_heclex_next_token();
1080  if (token != HECMW_HECLEX_INT) {
1081  set_err_token(token, HECMW_IO_HEC_E0603, "");
1082  return -1;
1083  }
1084  *id = HECMW_heclex_get_number();
1085  if (*id <= 0) {
1086  set_err_token(token, HECMW_IO_HEC_E0603, "");
1087  return -1;
1088  }
1089 
1090  /* ',' */
1091  token = HECMW_heclex_next_token();
1092  if (token != ',') {
1093  set_err_token(token, HECMW_IO_HEC_E0600, "',' required after element ID");
1094  return -1;
1095  }
1096 
1097  /* connectivity */
1098  i = 0;
1099  while (1) {
1100  token = HECMW_heclex_next_token();
1101  if (i != 0 && token == HECMW_HECLEX_NL) continue;
1102  if (token != HECMW_HECLEX_INT) {
1103  set_err(HECMW_IO_HEC_E0604, "");
1104  return -1;
1105  }
1106  node[i] = HECMW_heclex_get_number();
1107  if (node[i] <= 0) {
1108  set_err(HECMW_IO_HEC_E0604, "");
1109  return -1;
1110  }
1111 
1112  if (i == nnode - 1) break;
1113 
1114  /* ',' or NL */
1115  token = HECMW_heclex_next_token();
1116  if (token != ',' && token != HECMW_HECLEX_NL) {
1117  set_err_token(token, HECMW_IO_HEC_E0600,
1118  "',' or NL required after connectivity");
1119  return -1;
1120  }
1121 
1122  i++;
1123  }
1124  return 0;
1125 }
1126 
1127 static int read_elem_data_mat(int nmatitem, double *matitem) {
1128  int token, i;
1129 
1130  /* default value */
1131  for (i = 0; i < nmatitem; i++) {
1132  matitem[i] = 0.0;
1133  }
1134 
1135  /* MATITEM */
1136  for (i = 0; i < nmatitem; i++) {
1137  token = HECMW_heclex_next_token();
1138  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
1139  set_err_token(token, HECMW_IO_HEC_E0600, "required MATITEM");
1140  return -1;
1141  }
1142  matitem[i] = HECMW_heclex_get_number();
1143 
1144  /* ',' or NL */
1145  token = HECMW_heclex_next_token();
1146  if (token != ',' && token != HECMW_HECLEX_NL) {
1147  set_err_token(token, HECMW_IO_HEC_E0600, "',' or NL required after MAT");
1148  return -1;
1149  }
1150  if (i == nmatitem - 1) {
1151  if (token != HECMW_HECLEX_NL) {
1152  set_err_token(token, HECMW_IO_HEC_E0600, "NL required after MAT");
1153  return -1;
1154  }
1155  } else {
1156  if (token != ',') {
1157  set_err_token(token, HECMW_IO_HEC_E0600, "',' required after MAT");
1158  return -1;
1159  }
1160  }
1161  }
1162  return 0;
1163 }
1164 
1165 static int read_element(void) {
1166  int token, state;
1167  int id;
1168  int nnode = 0;
1169  int *node = NULL;
1170  double *matitem = NULL;
1171  int nmatitem = 0;
1172  int type = -1;
1173  int flag_type = 0; /* flag for TYPE */
1174  int flag_egrp = 0; /* flag for EGRP */
1175  int flag_matitem = 0; /* flag for MATITEM */
1176  int flag_input = 0; /* flag for INPUT */
1177  char egrp[HECMW_NAME_LEN + 1] = "";
1178  enum {
1179  st_finished,
1180  st_header_line,
1181  st_header_line_param,
1182  st_prepare,
1183  st_data_include,
1184  st_data_line_conn, /* read element ID and connectivity */
1185  st_data_line_matitem, /* read MATITEM */
1186  st_data_line_regist,
1187  st_finalize
1188  };
1189 
1190  state = st_header_line;
1191  while (state != st_finished) {
1192  if (state == st_header_line) {
1193  if (read_elem_head()) return -1;
1194  state = st_header_line_param;
1195  } else if (state == st_header_line_param) {
1196  token = HECMW_heclex_next_token();
1197  if (token == HECMW_HECLEX_K_TYPE) {
1198  /* must */
1199  if (read_elem_param_type(&type)) return -1;
1200  flag_type = 1;
1201  } else if (token == HECMW_HECLEX_K_EGRP) {
1202  /* optional */
1203  if (read_elem_param_egrp(egrp)) return -1;
1204  flag_egrp = 1;
1205  } else if (token == HECMW_HECLEX_K_MATITEM) {
1206  /* optional */
1207  if (read_elem_param_nmatitem(&nmatitem)) return -1;
1208  flag_matitem = 1;
1209  } else if (token == HECMW_HECLEX_K_INPUT) {
1210  /* optional */
1211  if (read_input(HECMW_IO_HEC_E0600)) return -1;
1212  flag_input = 1;
1213  } else {
1214  set_err_token(token, HECMW_IO_HEC_E0600, "Unknown parameter");
1215  return -1;
1216  }
1217 
1218  /* check next state */
1219  token = HECMW_heclex_next_token();
1220  if (token == HECMW_HECLEX_NL) {
1221  /* check TYPE */
1222  if (!flag_type) {
1223  set_err(HECMW_IO_HEC_E0606, "");
1224  return -1;
1225  }
1226  state = st_prepare;
1227  } else if (token == ',') {
1228  ; /* continue this state */
1229  } else {
1230  set_err_token(token, HECMW_IO_HEC_E0600, "Unknown parameter");
1231  return -1;
1232  }
1233  } else if (state == st_prepare) {
1234  HECMW_assert(flag_type);
1235  HECMW_assert(type != -1);
1236 
1237  /* get # of connectivity */
1238  nnode = HECMW_get_max_node(type);
1239  HECMW_assert(nnode > 0);
1240  HECMW_assert(nnode <= HECMW_MAX_NODE_MAX);
1241 
1242  node = HECMW_malloc(sizeof(*node) * nnode);
1243  if (node == NULL) {
1244  HECMW_set_error(errno, "");
1245  return -1;
1246  }
1247 
1248  /* nmatitem */
1249  HECMW_assert(nmatitem >= 0);
1250 
1251  if (flag_matitem && nmatitem) {
1252  HECMW_assert(nmatitem > 0);
1253  matitem = HECMW_malloc(sizeof(*matitem) * nmatitem);
1254  if (matitem == NULL) {
1255  HECMW_set_error(errno, "");
1256  return -1;
1257  }
1258  } else {
1259  matitem = NULL;
1260  }
1261 
1262  /* set next state */
1263  state = flag_input ? st_data_include : st_data_line_conn;
1264  } else if (state == st_data_include) {
1265  HECMW_assert(flag_input);
1266  HECMW_assert(flag_type);
1267 
1268  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
1269  state = st_data_line_conn;
1270  } else if (state == st_data_line_conn) {
1271  HECMW_assert(flag_type);
1272 
1273  if (read_elem_data_conn(&id, nnode, node)) return -1;
1274  if (HECMW_convert_connectivity(connectivity_type, type, node)) return -1;
1275 
1276  /* check next state */
1277  token = HECMW_heclex_next_token();
1278  if (flag_matitem) {
1279  if (token != ',' && token != HECMW_HECLEX_NL) {
1280  set_err_token(token, HECMW_IO_HEC_E0600,
1281  "',' or NL required after connectivity");
1282  return -1;
1283  }
1284  if (token == ',') {
1285  token = HECMW_heclex_next_token();
1286  if (token != HECMW_HECLEX_NL) {
1288  }
1289  }
1290  state = st_data_line_matitem;
1291  } else {
1292  if (token != HECMW_HECLEX_NL) {
1293  set_err_token(token, HECMW_IO_HEC_E0600, "NL required");
1294  return -1;
1295  }
1296  state = st_data_line_regist;
1297  }
1298  } else if (state == st_data_line_matitem) {
1299  HECMW_assert(flag_matitem);
1300  HECMW_assert(nmatitem > 0);
1301  HECMW_assert(matitem);
1302  HECMW_assert(flag_type);
1303 
1304  if (read_elem_data_mat(nmatitem, matitem)) return -1;
1305  state = st_data_line_regist;
1306  } else if (state == st_data_line_regist) {
1307  HECMW_assert(node);
1308  HECMW_assert(flag_type);
1309 
1310  /* add element */
1311  if (HECMW_io_add_elem(id, type, node, nmatitem, matitem) == NULL) {
1312  return -1;
1313  }
1314 
1315  /* add element to eroup */
1316  if (HECMW_io_add_egrp("ALL", 1, &id) < 0) return -1;
1317 
1318  if (flag_egrp) {
1319  if (HECMW_io_add_egrp(egrp, 1, &id) < 0) {
1320  return -1;
1321  }
1322  }
1323 
1324  /* check next state */
1325  token = HECMW_heclex_next_token();
1326  if (token == HECMW_HECLEX_INT) {
1327  state = st_data_line_conn;
1328  } else {
1329  state = st_finalize;
1330  }
1332  } else if (state == st_finalize) {
1333  HECMW_free(node);
1334  HECMW_free(matitem);
1335 
1336  /* set next state */
1337  state = st_finished;
1338  } else {
1339  HECMW_assert(0);
1340  }
1341  }
1342  HECMW_log(HECMW_LOG_DEBUG, "read_element done");
1343  return 0;
1344 }
1345 
1346 /*----------------------------------------------------------------------------*/
1347 
1348 static int read_equation_head(int *last_token) {
1349  int token;
1350 
1351  /* !EQUATION */
1352  token = HECMW_heclex_next_token();
1353  if (token != HECMW_HECLEX_H_EQUATION) {
1354  set_err_token(token, HECMW_IO_HEC_E0700, "!EQUATION required");
1355  return -1;
1356  }
1357 
1358  token = HECMW_heclex_next_token();
1359  if (token != ',' && token != HECMW_HECLEX_NL) {
1360  set_err_token(token, HECMW_IO_HEC_E0700,
1361  "',' or NL required after !EQUATION");
1362  return -1;
1363  }
1364  *last_token = token;
1365 
1366  return 0;
1367 }
1368 
1369 static int read_equation_data_line1(int *neq, double *cnst) {
1370  int token;
1371  char *p;
1372 
1373  /* NEQ */
1374  token = HECMW_heclex_next_token();
1375 
1376  if (token != HECMW_HECLEX_INT && token != HECMW_HECLEX_NAME) {
1377  set_err_token(token, HECMW_IO_HEC_E0700, "required NEQ");
1378  return -1;
1379  }
1380 
1381  if (token == HECMW_HECLEX_NAME) {
1382  p = HECMW_heclex_get_text();
1383  if (strcmp(p, "link") == 0 || strcmp(p, "LINK") == 0) {
1384  *neq = 2;
1385  *cnst = 0.0;
1386  }
1388  return 0;
1389  }
1390 
1391  *neq = HECMW_heclex_get_number();
1392  if (*neq < 2) {
1393  set_err(HECMW_IO_HEC_E0701, "");
1394  return -1;
1395  }
1396 
1397  /* ',' */
1398  token = HECMW_heclex_next_token();
1399  if (token == ',') {
1400  /* const */
1401  token = HECMW_heclex_next_token();
1402  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
1403  set_err_token(token, HECMW_IO_HEC_E0700, "required CONST");
1404  return -1;
1405  }
1406  *cnst = HECMW_heclex_get_number();
1407  } else {
1408  *cnst = 0.0;
1410  }
1411 
1412  /* NL */
1413  token = HECMW_heclex_next_token();
1414  if (token != HECMW_HECLEX_NL) {
1415  set_err_token(token, HECMW_IO_HEC_E0700, "NL required after NEQ");
1416  return -1;
1417  }
1418 
1419  return 0;
1420 }
1421 
1422 static int read_equation_data_line2(int neq, double cnst) {
1423  int i, token;
1424  int is_node = 0;
1425  int is_ngrp = 0;
1426  int is_link = 0;
1427  int is_beam = 0;
1428  const int NITEM = 100;
1429  char *p;
1430  struct hecmw_io_mpcitem *mpcitem;
1431  bool isAllDof = false;
1432 
1433  mpcitem = HECMW_malloc(sizeof(*mpcitem) * neq);
1434  if (mpcitem == NULL) {
1435  HECMW_set_error(errno, "");
1436  return -1;
1437  }
1438 
1439  token = HECMW_heclex_next_token();
1440  if (token == HECMW_HECLEX_NAME) {
1441  p = HECMW_heclex_get_text();
1442  if (strcmp(p, "link") == 0 || strcmp(p, "LINK") == 0) {
1443  is_link = 1;
1444  }
1445  }
1447 
1448  if (is_link == 0) {
1449  isAllDof = false;
1450  for (i = 0; i < neq; i++) {
1451  token = HECMW_heclex_next_token();
1452  if (i != 0 && token == HECMW_HECLEX_NL) break;
1453 
1454  /* nod */
1455  if (token == HECMW_HECLEX_INT) {
1456  if (is_ngrp) {
1457  set_err(HECMW_IO_HEC_E0702, "");
1458  return -1;
1459  }
1460  mpcitem[i].node = HECMW_heclex_get_number();
1461  strcpy(mpcitem[i].ngrp, "");
1462  is_node = 1;
1463  } else if (token == HECMW_HECLEX_NAME) {
1464  char *p = HECMW_heclex_get_text();
1465  if (is_node) {
1466  set_err(HECMW_IO_HEC_E0702, "");
1467  return -1;
1468  }
1469  if (strlen(p) > HECMW_NAME_LEN) {
1470  set_err(HECMW_IO_E0001, "");
1471  return -1;
1472  }
1473  strcpy(mpcitem[i].ngrp, p);
1474  HECMW_toupper(mpcitem[i].ngrp);
1475  if (HECMW_io_is_reserved_name(mpcitem[i].ngrp)) {
1476  set_err(HECMW_IO_E0003, "");
1477  return -1;
1478  }
1479  mpcitem[i].node = -1;
1480  is_ngrp = 1;
1481  } else {
1482  set_err_token(token, HECMW_IO_HEC_E0700, "Node ID or NGRP required");
1483  return -1;
1484  }
1485 
1486  /* ',' */
1487  token = HECMW_heclex_next_token();
1488  if (token != ',') {
1489  set_err_token(token, HECMW_IO_HEC_E0700, "',' required after node");
1490  return -1;
1491  }
1492 
1493  /* DOF */
1494  token = HECMW_heclex_next_token();
1495  if (token != HECMW_HECLEX_INT) {
1496  set_err(HECMW_IO_HEC_E0703, "");
1497  return -1;
1498  }
1499  mpcitem[i].dof = HECMW_heclex_get_number();
1500  if (mpcitem[i].dof == 0) {
1501  isAllDof = true;
1502  mpcitem[i].dof = 1;
1503  }
1504  if (HECMW_io_check_mpc_dof(mpcitem[i].dof)) {
1505  set_err(HECMW_IO_HEC_E0703, "");
1506  return -1;
1507  }
1508 
1509  /* ',' */
1510  token = HECMW_heclex_next_token();
1511  if (token != ',') {
1512  set_err_token(token, HECMW_IO_HEC_E0700, "',' required after DOF");
1513  return -1;
1514  }
1515 
1516  /* A */
1517  token = HECMW_heclex_next_token();
1518  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
1519  set_err_token(token, HECMW_IO_HEC_E0700, "A(coefficient) required ");
1520  return -1;
1521  }
1522  mpcitem[i].a = HECMW_heclex_get_number();
1523 
1524  /* ',' or NL */
1525  token = HECMW_heclex_next_token();
1526  if (token != ',' && token != HECMW_HECLEX_NL) {
1527  set_err_token(token, HECMW_IO_HEC_E0700,
1528  "',' or NL required after coefficient");
1529  return -1;
1530  }
1531  if (token == ',' && i == NITEM - 1) {
1532  token = HECMW_heclex_next_token();
1533  if (token != HECMW_HECLEX_NL) {
1534  set_err_token(token, HECMW_IO_HEC_E0700, "NL required");
1535  return -1;
1536  }
1537  continue;
1538  }
1539  if (token == HECMW_HECLEX_NL) continue;
1540  }
1541 
1542  /* add */
1543  if (isAllDof) {
1544  for (i = 0; i < neq; i++) {
1545  mpcitem[i].dof = 1;
1546  }
1547  if (HECMW_io_add_mpc(neq, mpcitem, cnst) == NULL) return -1;
1548  for (i = 0; i < neq; i++) {
1549  mpcitem[i].dof = 2;
1550  }
1551  if (HECMW_io_add_mpc(neq, mpcitem, cnst) == NULL) return -1;
1552  for (i = 0; i < neq; i++) {
1553  mpcitem[i].dof = 3;
1554  }
1555  if (HECMW_io_add_mpc(neq, mpcitem, cnst) == NULL) return -1;
1556 
1557  } else {
1558  if (HECMW_io_add_mpc(neq, mpcitem, cnst) == NULL) return -1;
1559  }
1560  HECMW_free(mpcitem);
1561 
1562  /* link */
1563  } else if (is_link == 1) {
1564  token = HECMW_heclex_next_token();
1565 
1566  /* ',' */
1567  token = HECMW_heclex_next_token();
1568  if (token != ',') {
1569  set_err_token(token, HECMW_IO_HEC_E0700, "',' required after DOF");
1570  return -1;
1571  }
1572 
1573  token = HECMW_heclex_next_token();
1574  if (token != HECMW_HECLEX_INT) {
1575  return -1;
1576  }
1577  mpcitem[0].node = HECMW_heclex_get_number();
1578  strcpy(mpcitem[0].ngrp, "");
1579  mpcitem[0].a = 1.0;
1580 
1581  /* ',' */
1582  token = HECMW_heclex_next_token();
1583  if (token != ',') {
1584  set_err_token(token, HECMW_IO_HEC_E0700, "',' required after DOF");
1585  return -1;
1586  }
1587 
1588  token = HECMW_heclex_next_token();
1589  if (token != HECMW_HECLEX_INT) {
1590  return -1;
1591  }
1592  mpcitem[1].node = HECMW_heclex_get_number();
1593  strcpy(mpcitem[1].ngrp, "");
1594  mpcitem[1].a = -1.0;
1595 
1596  /* add 1 */
1597  mpcitem[0].dof = 1;
1598  mpcitem[1].dof = 1;
1599  if (HECMW_io_add_mpc(neq, mpcitem, cnst) == NULL) return -1;
1600  /* add 2 */
1601  mpcitem[0].dof = 2;
1602  mpcitem[1].dof = 2;
1603  if (HECMW_io_add_mpc(neq, mpcitem, cnst) == NULL) return -1;
1604  /* add 3 */
1605  mpcitem[0].dof = 3;
1606  mpcitem[1].dof = 3;
1607  if (HECMW_io_add_mpc(neq, mpcitem, cnst) == NULL) return -1;
1608  HECMW_free(mpcitem);
1609 
1610  token = HECMW_heclex_next_token();
1611  if (token != HECMW_HECLEX_NL) {
1612  return -1;
1613  }
1614  }
1615 
1616  return 0;
1617 }
1618 
1619 static int read_equation(void) {
1620  int token, state;
1621  int neq = -1;
1622  double cnst = 0.0;
1623  int flag_input = 0; /* flag for INPUT */
1624  char *p;
1625  enum {
1626  ST_FINISHED,
1627  ST_HEADER_LINE,
1628  ST_HEADER_LINE_PARAM,
1629  ST_DATA_INCLUDE,
1630  ST_DATA_LINE1,
1631  ST_DATA_LINE2
1632  };
1633 
1634  state = ST_HEADER_LINE;
1635  while (state != ST_FINISHED) {
1636  if (state == ST_HEADER_LINE) {
1637  if (read_equation_head(&token)) return -1;
1638  if (token == ',') {
1639  state = ST_HEADER_LINE_PARAM;
1640  } else if (token == HECMW_HECLEX_NL) {
1641  state = ST_DATA_LINE1;
1642  } else {
1643  HECMW_assert(0);
1644  }
1645  } else if (state == ST_HEADER_LINE_PARAM) {
1646  token = HECMW_heclex_next_token();
1647  if (token == HECMW_HECLEX_K_INPUT) {
1648  /* optional */
1649  if (read_input(HECMW_IO_HEC_E0700)) return -1;
1650  flag_input = 1;
1651  } else {
1652  set_err_token(token, HECMW_IO_HEC_E0700, "Unknown parameter");
1653  return -1;
1654  }
1655 
1656  /* check next state */
1657  token = HECMW_heclex_next_token();
1658  if (token == HECMW_HECLEX_NL) {
1659  state = flag_input ? ST_DATA_INCLUDE : ST_DATA_LINE1;
1660  } else {
1661  set_err_token(token, HECMW_IO_HEC_E0700, "NL required");
1662  return -1;
1663  }
1664  } else if (state == ST_DATA_INCLUDE) {
1665  HECMW_assert(flag_input);
1666 
1667  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
1668  state = ST_DATA_LINE1;
1669  } else if (state == ST_DATA_LINE1) {
1670  if (read_equation_data_line1(&neq, &cnst)) return -1;
1671  state = ST_DATA_LINE2;
1672  } else if (state == ST_DATA_LINE2) {
1673  HECMW_assert(neq != -1);
1674  if (read_equation_data_line2(neq, cnst)) return -1;
1675 
1676  /* check next state */
1677  token = HECMW_heclex_next_token();
1678  if (token == HECMW_HECLEX_INT) {
1679  state = ST_DATA_LINE1;
1680  } else if (token == HECMW_HECLEX_NAME) {
1681  p = HECMW_heclex_get_text();
1682  if (strcmp(p, "link") == 0 || strcmp(p, "LINK") == 0) {
1683  state = ST_DATA_LINE1;
1684  } else {
1685  state = ST_FINISHED;
1686  }
1687  } else {
1688  state = ST_FINISHED;
1689  }
1691  } else {
1692  HECMW_assert(0);
1693  }
1694  }
1695  HECMW_log(HECMW_LOG_DEBUG, "read_equation done");
1696  return 0;
1697 }
1698 
1699 /*----------------------------------------------------------------------------*/
1700 
1701 static int read_header(void) {
1702  int token, len;
1703  char *p;
1704  struct hecmw_io_header *header;
1705 
1706  header = HECMW_malloc(sizeof(struct hecmw_io_header));
1707  if (header == NULL) {
1708  HECMW_set_error(errno, "");
1709  return -1;
1710  }
1711 
1712  /* !HEADER */
1713  token = HECMW_heclex_next_token();
1714  if (token != HECMW_HECLEX_H_HEADER) {
1715  set_err_token(token, HECMW_IO_HEC_E0800, "!HEADER required");
1716  return -1;
1717  }
1718 
1719  /* get header data */
1720  token = HECMW_heclex_next_token();
1721  if (token != HECMW_HECLEX_HEADER) {
1722  set_err_token(token, HECMW_IO_HEC_E0800, "TITLE required after !HEADER");
1723  return -1;
1724  }
1725  p = HECMW_heclex_get_text();
1726  while (*p && *p == ' ') p++;
1727  if (p == NULL) p = "";
1728  len = strlen(p);
1729  if (len > HECMW_HEADER_LEN) len = HECMW_HEADER_LEN;
1730  strncpy(header->header, p, len);
1731  header->header[len] = '\0';
1732 
1733  /* Note:
1734  * NL is ignored by LEX until the end of the header data.
1735  */
1736 
1737  /* Ignore the rest of the header data */
1739  ;
1741 
1742  /* set */
1744 
1745  HECMW_log(HECMW_LOG_DEBUG, "read_header done");
1746  return 0;
1747 }
1748 
1749 /*----------------------------------------------------------------------------*/
1750 
1751 static int read_include(void) {
1752  int token;
1753 
1754  /* !INCLUDE */
1755  token = HECMW_heclex_next_token();
1756  if (token != HECMW_HECLEX_H_INCLUDE) {
1757  set_err_token(token, HECMW_IO_HEC_E0900, "!INCLUDE required");
1758  return -1;
1759  }
1760 
1761  /* ',' */
1762  token = HECMW_heclex_next_token();
1763  if (token != ',') {
1764  set_err_token(token, HECMW_IO_HEC_E0900, "',' required after !INCLUDE");
1765  return -1;
1766  }
1767 
1768  /* INPUT */
1769  token = HECMW_heclex_next_token();
1770  if (token != HECMW_HECLEX_K_INPUT) {
1771  set_err_token(token, HECMW_IO_HEC_E0901, "");
1772  return -1;
1773  }
1774 
1775  /* =filename */
1776  if (read_input(HECMW_IO_HEC_E0900)) return -1;
1777 
1778  /* NL */
1779  token = HECMW_heclex_next_token();
1780  if (token != HECMW_HECLEX_NL) {
1781  set_err_token(token, HECMW_IO_HEC_E0900, "NL required after INPUT value");
1782  return -1;
1783  }
1784 
1785  /* include */
1786  if (HECMW_heclex_switch_to_include(include_filename)) {
1787  return -1;
1788  }
1789 
1790  HECMW_log(HECMW_LOG_DEBUG, "read_include done");
1791  return 0;
1792 }
1793 
1794 /*----------------------------------------------------------------------------*/
1795 
1796 static int read_initial_head(void) {
1797  int token;
1798 
1799  /* !INITIAL CONDITION */
1800  token = HECMW_heclex_next_token();
1801  if (token != HECMW_HECLEX_H_INITIAL) {
1802  set_err_token(token, HECMW_IO_HEC_E1000, "!INITIAL CONDITION required");
1803  return -1;
1804  }
1805 
1806  token = HECMW_heclex_next_token();
1807  if (token != ',') {
1808  set_err_token(token, HECMW_IO_HEC_E1001, "");
1809  return -1;
1810  }
1811 
1812  return 0;
1813 }
1814 
1815 static int read_initial_param_type(int *type) {
1816  int token;
1817 
1818  token = HECMW_heclex_next_token();
1819  if (token != '=') {
1820  set_err_token(token, HECMW_IO_HEC_E1000, "'=' required after TYPE");
1821  return -1;
1822  }
1823  token = HECMW_heclex_next_token();
1824  if (token != HECMW_HECLEX_K_TEMPERATURE) {
1825  set_err_token(token, HECMW_IO_HEC_E1000, "TEMPERATURE required");
1826  return -1;
1827  }
1829  return 0;
1830 }
1831 
1832 static int read_initial_data(int type) {
1833  int node, token;
1834  char *ngrp;
1835  double val;
1836 
1837  /* node or ngrp */
1838  node = -1;
1839  ngrp = NULL;
1840  token = HECMW_heclex_next_token();
1841  if (token == HECMW_HECLEX_INT) {
1842  node = HECMW_heclex_get_number();
1843  if (node <= 0) {
1844  set_err(HECMW_IO_HEC_E1002, "");
1845  return -1;
1846  }
1847  } else if (token == HECMW_HECLEX_NAME) {
1848  ngrp = HECMW_heclex_get_text();
1849  if (strlen(ngrp) > HECMW_NAME_LEN) {
1850  set_err(HECMW_IO_E0001, "");
1851  return -1;
1852  }
1853  HECMW_toupper(ngrp);
1854  ngrp = HECMW_strdup(ngrp);
1855  if (ngrp == NULL) {
1856  HECMW_set_error(errno, "");
1857  return -1;
1858  }
1859  } else {
1860  set_err_token(token, HECMW_IO_HEC_E1000, "Node ID or NGROUP name required");
1861  return -1;
1862  }
1863 
1864  /* ',' */
1865  token = HECMW_heclex_next_token();
1866  if (token != ',') {
1867  set_err_token(token, HECMW_IO_HEC_E1000, "',' required after node");
1868  return -1;
1869  }
1870 
1871  /* VAL */
1872  token = HECMW_heclex_next_token();
1873  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
1874  set_err_token(token, HECMW_IO_HEC_E1000, "VAL required");
1875  return -1;
1876  }
1877  val = HECMW_heclex_get_number();
1878 
1879  /* NL */
1880  token = HECMW_heclex_next_token();
1881  if (token != HECMW_HECLEX_NL) {
1882  set_err_token(token, HECMW_IO_HEC_E1000, "NL required after VAL");
1883  return -1;
1884  }
1885 
1886  /* add */
1887  HECMW_assert(type != -1);
1888  if (HECMW_io_add_initial(type, node, ngrp, val) == NULL) {
1889  return -1;
1890  };
1891  HECMW_free(ngrp);
1892 
1893  return 0;
1894 }
1895 
1896 static int read_initial(void) {
1897  int token, state;
1898  int type = -1;
1899  int flag_type = 0; /* flag for TYPE */
1900  int flag_input = 0; /* flag for INPUT */
1901  enum {
1902  ST_FINISHED,
1903  ST_HEADER_LINE,
1904  ST_HEADER_LINE_PARAM,
1905  ST_DATA_INCLUDE,
1906  ST_DATA_LINE
1907  };
1908 
1909  state = ST_HEADER_LINE;
1910  while (state != ST_FINISHED) {
1911  if (state == ST_HEADER_LINE) {
1912  if (read_initial_head()) return -1;
1913  state = ST_HEADER_LINE_PARAM;
1914  } else if (state == ST_HEADER_LINE_PARAM) {
1915  token = HECMW_heclex_next_token();
1916  if (token == HECMW_HECLEX_K_TYPE) {
1917  /* must */
1918  if (read_initial_param_type(&type)) return -1;
1919  flag_type = 1;
1920  } else if (token == HECMW_HECLEX_K_INPUT) {
1921  /* oprtional */
1922  if (read_input(HECMW_IO_HEC_E1000)) return -1;
1923  flag_input = 1;
1924  } else {
1925  set_err_token(token, HECMW_IO_HEC_E1000, "Unknown parameter");
1926  return -1;
1927  }
1928 
1929  /* check next parameter */
1930  token = HECMW_heclex_next_token();
1931  if (token == HECMW_HECLEX_NL) {
1932  if (flag_input) {
1933  state = ST_DATA_INCLUDE;
1934  } else {
1935  state = ST_DATA_LINE;
1936  }
1937  /* check */
1938  if (!flag_type) {
1939  set_err(HECMW_IO_HEC_E1001, "");
1940  return -1;
1941  }
1942  } else if (token == ',') {
1943  ; /* continue this state */
1944  } else {
1945  set_err_token(token, HECMW_IO_HEC_E1000, "Unknown parameter");
1946  return -1;
1947  }
1948  } else if (state == ST_DATA_INCLUDE) {
1949  HECMW_assert(flag_input);
1950  HECMW_assert(flag_type);
1951  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
1952  state = ST_DATA_LINE;
1953  } else if (state == ST_DATA_LINE) {
1954  HECMW_assert(flag_type);
1955  if (read_initial_data(type)) return -1;
1956 
1957  /* check next state */
1958  token = HECMW_heclex_next_token();
1959  if (token != HECMW_HECLEX_INT && token != HECMW_HECLEX_NAME) {
1960  state = ST_FINISHED;
1961  }
1963  } else {
1964  HECMW_assert(0);
1965  }
1966  }
1967  HECMW_log(HECMW_LOG_DEBUG, "read_initial done");
1968  return 0;
1969 }
1970 
1971 /*----------------------------------------------------------------------------*/
1972 
1973 static int read_matitem_head(int *item, int *last_token) {
1974  int token;
1975 
1976  /* !ITEM */
1977  token = HECMW_heclex_next_token();
1978  if (token != HECMW_HECLEX_H_ITEM) {
1979  set_err_token(token, HECMW_IO_HEC_E1100, "!ITEM required");
1980  return -1;
1981  }
1982 
1983  /* '=' */
1984  token = HECMW_heclex_next_token();
1985  if (token != '=') {
1986  set_err_token(token, HECMW_IO_HEC_E1100, "'=' required after !ITEM");
1987  return -1;
1988  }
1989 
1990  /* ITEM */
1991  token = HECMW_heclex_next_token();
1992  if (token != HECMW_HECLEX_INT) {
1993  set_err_token(token, HECMW_IO_HEC_E1100, "required !ITEM value");
1994  return -1;
1995  }
1996  *item = HECMW_heclex_get_number();
1997  if (*item <= 0) {
1998  set_err(HECMW_IO_HEC_E1104, "");
1999  return -1;
2000  }
2001 
2002  /* ',' or NL */
2003  token = HECMW_heclex_next_token();
2004  if (token != ',' && token != HECMW_HECLEX_NL) {
2005  set_err_token(token, HECMW_IO_HEC_E1100, "',' or NL after !ITEM value");
2006  return -1;
2007  }
2008  *last_token = token;
2009 
2010  return 0;
2011 }
2012 
2013 static int read_matitem_param_subitem(int *subitem) {
2014  int token;
2015 
2016  /* optional */
2017  token = HECMW_heclex_next_token();
2018  if (token != '=') {
2019  set_err_token(token, HECMW_IO_HEC_E1100, "'=' required after SUBITEM");
2020  return -1;
2021  }
2022  token = HECMW_heclex_next_token();
2023  if (token != HECMW_HECLEX_INT) {
2024  set_err_token(token, HECMW_IO_HEC_E1100, "SUBITEM value required");
2025  return -1;
2026  }
2027  *subitem = HECMW_heclex_get_number();
2028  if (*subitem <= 0) {
2029  set_err(HECMW_IO_HEC_E1106, "");
2030  return -1;
2031  }
2032  return 0;
2033 }
2034 
2035 static int read_matitem_data(int subitem, int depend_temp,
2036  struct hecmw_io_matitem *matitem) {
2037  int i, token;
2038  double *val;
2039  double temp = 0.0;
2040  struct hecmw_io_matsubitem *p, *q, *msitem;
2041 
2042  msitem = HECMW_malloc(sizeof(*msitem));
2043  if (msitem == NULL) {
2044  HECMW_set_error(errno, "");
2045  return -1;
2046  }
2047 
2048  val = HECMW_malloc(sizeof(*val) * subitem);
2049  if (val == NULL) {
2050  HECMW_set_error(errno, "");
2051  return -1;
2052  }
2053 
2054  for (i = 0; i < subitem; i++) {
2055  val[i] = 0.0; /* default value */
2056  }
2057 
2058  for (i = 0; i < subitem; i++) {
2059  /* VAL */
2060  token = HECMW_heclex_next_token();
2061  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
2062  val[i] = HECMW_heclex_get_number();
2063  } else if (token == ',') {
2065  } else if (token == HECMW_HECLEX_NL) {
2066  break;
2067  } else {
2068  set_err_token(token, HECMW_IO_HEC_E1100, "VAL or ',' or NL reuqired");
2069  return -1;
2070  }
2071 
2072  /* ',' or NL*/
2073  token = HECMW_heclex_next_token();
2074  if (token != ',' && token != HECMW_HECLEX_NL) {
2075  set_err_token(token, HECMW_IO_HEC_E1100, "',' or NL required after VAL");
2076  return -1;
2077  }
2078  if (token == HECMW_HECLEX_NL) break;
2079  }
2080 
2081  if (token != HECMW_HECLEX_NL) {
2082  /* TEMP or NL */
2083  token = HECMW_heclex_next_token();
2084  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
2085  temp = HECMW_heclex_get_number();
2086  } else if (token == HECMW_HECLEX_NL) {
2087  ;
2088  } else {
2089  set_err_token(token, HECMW_IO_HEC_E1100, "Temperature or NL required");
2090  return -1;
2091  }
2092  }
2093 
2094  if (depend_temp) {
2095  /* previous TEMP */
2096  q = NULL;
2097  for (p = matitem->subitem; p; p = (q = p)->next)
2098  ;
2099  if (q && temp <= q->temp) {
2100  set_err(HECMW_IO_HEC_E1107, "");
2101  return -1;
2102  }
2103  }
2104 
2105  if (token != HECMW_HECLEX_NL) {
2106  /* NL */
2107  token = HECMW_heclex_next_token();
2108  if (token != HECMW_HECLEX_NL) {
2109  set_err_token(token, HECMW_IO_HEC_E1100, "NL required");
2110  return -1;
2111  }
2112  }
2113 
2114  /* set */
2115  msitem->val = val;
2116  msitem->temp = temp;
2117  msitem->next = NULL;
2118 
2119  q = NULL;
2120  for (p = matitem->subitem; p; p = (q = p)->next)
2121  ;
2122  if (q == NULL) {
2123  matitem->subitem = msitem;
2124  } else {
2125  q->next = msitem;
2126  }
2127 
2128  return 0;
2129 }
2130 
2131 static int read_matitem(struct hecmw_io_matitem *matitem) {
2132  int token, state;
2133  int item = -1;
2134  int subitem = 1;
2135  int flag_item = 0; /* flag for !ITEM */
2136  int flag_subitem = 0; /* flag for SUBITEM */
2137  int depend_temp = 0;
2138  enum {
2139  ST_FINISHED,
2140  ST_HEADER_LINE,
2141  ST_HEADER_LINE_PARAM,
2142  ST_PREPARE,
2143  ST_DATA_LINE
2144  };
2145 
2146  HECMW_assert(matitem);
2147 
2148  state = ST_HEADER_LINE;
2149  while (state != ST_FINISHED) {
2150  if (state == ST_HEADER_LINE) {
2151  if (read_matitem_head(&item, &token)) return -1;
2152  if (token == ',') {
2153  state = ST_HEADER_LINE_PARAM;
2154  } else if (token == HECMW_HECLEX_NL) {
2155  state = ST_PREPARE;
2156  }
2157  flag_item = 1;
2158  } else if (state == ST_HEADER_LINE_PARAM) {
2159  token = HECMW_heclex_next_token();
2160  if (token == HECMW_HECLEX_K_SUBITEM) {
2161  if (read_matitem_param_subitem(&subitem)) return -1;
2162  flag_subitem = 1;
2163  } else {
2164  set_err_token(token, HECMW_IO_HEC_E1100, "Unknown parameter");
2165  return -1;
2166  }
2167 
2168  /* NL */
2169  token = HECMW_heclex_next_token();
2170  if (token != HECMW_HECLEX_NL) {
2171  set_err_token(token, HECMW_IO_HEC_E1100, "NL required after SUBITEM");
2172  return -1;
2173  }
2174 
2175  /* set next state */
2176  state = ST_PREPARE;
2177  } else if (state == ST_PREPARE) {
2178  HECMW_assert(flag_item);
2179  HECMW_assert(item > 0);
2180  HECMW_assert(subitem > 0);
2181 
2182  matitem->item = item;
2183  matitem->nval = subitem;
2184  matitem->subitem = NULL;
2185 
2186  depend_temp = 0;
2187 
2188  /* set next state */
2189  state = ST_DATA_LINE;
2190  } else if (state == ST_DATA_LINE) {
2191  HECMW_assert(flag_item);
2192  HECMW_assert(item > 0);
2193  HECMW_assert(subitem > 0);
2194 
2195  if (read_matitem_data(subitem, depend_temp, matitem)) return -1;
2196  depend_temp = 1;
2197 
2198  /* check next state */
2199  token = HECMW_heclex_next_token();
2200  if (token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT) {
2201  state = ST_FINISHED;
2202  }
2204  } else {
2205  HECMW_assert(0);
2206  }
2207  }
2208  return 0;
2209 }
2210 
2211 static int read_material_head(void) {
2212  int token;
2213 
2214  /* !MATERIAL */
2215  token = HECMW_heclex_next_token();
2216  if (token != HECMW_HECLEX_H_MATERIAL) {
2217  set_err_token(token, HECMW_IO_HEC_E1100, "!MATERIAL required");
2218  return -1;
2219  }
2220 
2221  token = HECMW_heclex_next_token();
2222  if (token != ',') {
2223  set_err_token(token, HECMW_IO_HEC_E1101, "");
2224  return -1;
2225  }
2226 
2227  return 0;
2228 }
2229 
2230 static int read_material_param_name(char *name) {
2231  int token;
2232  char *p;
2233 
2234  token = HECMW_heclex_next_token();
2235  if (token != '=') {
2236  set_err_token(token, HECMW_IO_HEC_E1100, "'=' required after NAME");
2237  return -1;
2238  }
2239  token = HECMW_heclex_next_token();
2240  if (token != HECMW_HECLEX_NAME) {
2241  set_err_token(token, HECMW_IO_HEC_E1100,
2242  "NAME must begin with a letter or '_'");
2243  return -1;
2244  }
2245  p = HECMW_heclex_get_text();
2246  if (strlen(p) > HECMW_NAME_LEN) {
2247  set_err(HECMW_IO_E0001, "");
2248  return -1;
2249  }
2250  strcpy(name, p);
2251  HECMW_toupper(name);
2252  if (HECMW_io_is_reserved_name(name)) {
2253  set_err(HECMW_IO_E0003, "");
2254  return -1;
2255  }
2256  if (HECMW_io_get_mat(name)) {
2257  set_err(HECMW_IO_HEC_E1102, "%s already exists", name);
2258  return -1;
2259  }
2260  return 0;
2261 }
2262 
2263 static int read_material_param_item(int *item) {
2264  int token;
2265 
2266  token = HECMW_heclex_next_token();
2267  if (token != '=') {
2268  set_err_token(token, HECMW_IO_HEC_E1100, "'=' required after ITEM");
2269  return -1;
2270  }
2271  token = HECMW_heclex_next_token();
2272  if (token != HECMW_HECLEX_INT) {
2273  set_err_token(token, HECMW_IO_HEC_E1100, "Invalid ITEM");
2274  return -1;
2275  }
2276  *item = HECMW_heclex_get_number();
2277  if (*item <= 0) {
2278  set_err(HECMW_IO_HEC_E1103, "");
2279  return -1;
2280  }
2281  return 0;
2282 }
2283 
2284 static int matitem_comp(const void *matitem1, const void *matitem2) {
2285  const struct hecmw_io_matitem *m1, *m2;
2286 
2287  m1 = matitem1;
2288  m2 = matitem2;
2289 
2290  if (m1->item == m2->item) return 0;
2291  if (m1->item < m2->item) {
2292  return -1;
2293  } else {
2294  return 1;
2295  }
2296 }
2297 
2298 static int read_material_data(int item, char *name) {
2299  int i;
2300  struct hecmw_io_material *mat;
2301  struct hecmw_io_matitem *matitem;
2302 
2303  mat = HECMW_malloc(sizeof(*mat));
2304  if (mat == NULL) {
2305  HECMW_set_error(errno, "");
2306  return -1;
2307  }
2308 
2309  matitem = HECMW_malloc(sizeof(*matitem) * item);
2310  if (matitem == NULL) {
2311  HECMW_set_error(errno, "");
2312  return -1;
2313  }
2314 
2315  for (i = 0; i < item; i++) {
2316  if (read_matitem(&matitem[i])) return -1;
2317  }
2318 
2319  /* sort */
2320  qsort(matitem, item, sizeof(*matitem), matitem_comp);
2321 
2322  /* check !ITEM value */
2323  for (i = 0; i < item; i++) {
2324  if (matitem[i].item != i + 1) {
2325  HECMW_set_error(HECMW_IO_HEC_E1105, "In MATERIAL %s", name);
2326  return -1;
2327  }
2328  }
2329 
2330  /* set */
2331  strcpy(mat->name, name);
2332  mat->nitem = item;
2333  mat->item = matitem;
2334  mat->next = NULL;
2335 
2336  /* add */
2337  if (HECMW_io_add_mat(name, mat) == NULL) return -1;
2338 
2339  return 0;
2340 }
2341 
2342 static int read_material(void) {
2343  int token, state;
2344  int item = 1;
2345  int flag_name = 0; /* flag for NAME */
2346  int flag_item = 0; /* flag for ITEM */
2347  int flag_input = 0; /* flag for INPUT */
2348  char name[HECMW_NAME_LEN + 1] = "";
2349  enum {
2350  ST_FINISHED,
2351  ST_HEADER_LINE,
2352  ST_HEADER_LINE_PARAM,
2353  ST_DATA_INCLUDE,
2354  ST_DATA_LINE
2355  };
2356 
2357  state = ST_HEADER_LINE;
2358  while (state != ST_FINISHED) {
2359  if (state == ST_HEADER_LINE) {
2360  if (read_material_head()) return -1;
2361  state = ST_HEADER_LINE_PARAM;
2362  } else if (state == ST_HEADER_LINE_PARAM) {
2363  token = HECMW_heclex_next_token();
2364  if (token == HECMW_HECLEX_K_NAME) {
2365  /* must */
2366  if (read_material_param_name(name)) return -1;
2367  flag_name = 1;
2368  } else if (token == HECMW_HECLEX_K_ITEM) {
2369  /* optioanal */
2370  if (read_material_param_item(&item)) return -1;
2371  flag_item = 1;
2372  } else if (token == HECMW_HECLEX_K_INPUT) {
2373  /* oprtional */
2374  if (read_input(HECMW_IO_HEC_E1100)) return -1;
2375  flag_input = 1;
2376  } else {
2377  set_err_token(token, HECMW_IO_HEC_E1100, "Unknown parameter");
2378  return -1;
2379  }
2380 
2381  /* check next parameter */
2382  token = HECMW_heclex_next_token();
2383  if (token == HECMW_HECLEX_NL) {
2384  /* check */
2385  if (!flag_name) {
2386  set_err(HECMW_IO_HEC_E1101, "");
2387  return -1;
2388  }
2389  state = flag_input ? ST_DATA_INCLUDE : ST_DATA_LINE;
2390  } else if (token == ',') {
2391  ; /* continue this state */
2392  } else {
2393  set_err_token(token, HECMW_IO_HEC_E1100, "Unknown parameter");
2394  return -1;
2395  }
2396  } else if (state == ST_DATA_INCLUDE) {
2397  HECMW_assert(flag_input);
2398  HECMW_assert(flag_name);
2399  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
2400  state = ST_DATA_LINE;
2401  } else if (state == ST_DATA_LINE) {
2402  HECMW_assert(flag_name);
2403  if (read_material_data(item, name)) return -1;
2404  state = ST_FINISHED;
2405  } else {
2406  HECMW_assert(0);
2407  }
2408  }
2409  HECMW_log(HECMW_LOG_DEBUG, "read_material done");
2410  return 0;
2411 }
2412 
2413 /*----------------------------------------------------------------------------*/
2414 #if 0
2415 static int
2416 read_ncopy(void)
2417 {
2418  fprintf(stderr, "!NCOPY has not implemented yet\n");
2420  return 0;
2421 }
2422 
2423 
2424 static int
2425 read_nfill(void)
2426 {
2427  fprintf(stderr, "!NFILL has not implemented yet\n");
2429  return 0;
2430 }
2431 
2432 
2433 static int
2434 read_ngen(void)
2435 {
2436  fprintf(stderr, "!NGEN has not implemented yet\n");
2438  return 0;
2439 }
2440 #endif
2441 
2442 /*----------------------------------------------------------------------------*/
2443 
2444 static int read_ngrp_head(void) {
2445  int token;
2446 
2447  /* !NGROUP */
2448  token = HECMW_heclex_next_token();
2449  if (token != HECMW_HECLEX_H_NGROUP) {
2450  set_err_token(token, HECMW_IO_HEC_E1500, "!NGROUP required");
2451  return -1;
2452  }
2453 
2454  token = HECMW_heclex_next_token();
2455  if (token != ',') {
2456  set_err_token(token, HECMW_IO_HEC_E1500, "',' required after !NGROUP");
2457  return -1;
2458  }
2459 
2460  return 0;
2461 }
2462 
2463 static int read_ngrp_param_ngrp(char *ngrp) {
2464  int token;
2465  char *p;
2466 
2467  token = HECMW_heclex_next_token();
2468  if (token != '=') {
2469  set_err_token(token, HECMW_IO_HEC_E1500, "'=' required after NGRP");
2470  return -1;
2471  }
2472  token = HECMW_heclex_next_token();
2473  if (token != HECMW_HECLEX_NAME) {
2474  set_err_token(token, HECMW_IO_HEC_E1500,
2475  "NGRP must begin with a letter or '_'");
2476  return -1;
2477  }
2478  p = HECMW_heclex_get_text();
2479  if (strlen(p) > HECMW_NAME_LEN) {
2480  set_err(HECMW_IO_E0001, "");
2481  return -1;
2482  }
2483  strcpy(ngrp, p);
2484  HECMW_toupper(ngrp);
2485  if (HECMW_io_is_reserved_name(ngrp)) {
2486  set_err(HECMW_IO_E0003, "");
2487  return -1;
2488  }
2489  if (strcmp(ngrp, "EQUATION_BLOCK") == 0) {
2490  HECMW_set_error(HECMW_IO_E0003, "Reserved name: %s", ngrp);
2491  return -1;
2492  }
2493  if (strcmp(ngrp, "ALL") == 0) {
2494  HECMW_set_error(HECMW_IO_E0003, "Reserved name: %s", ngrp);
2495  return -1;
2496  }
2497  return 0;
2498 }
2499 
2500 static int read_ngrp_data(char *ngrp) {
2501  int i, n, *node, token;
2502  struct hecmw_io_id *head, *prev, *p, *q;
2503 
2504  n = 0;
2505  prev = NULL;
2506  head = NULL;
2507  while (1) {
2508  struct hecmw_io_id *id;
2509 
2510  token = HECMW_heclex_next_token();
2511  if (n != 0 && token == HECMW_HECLEX_NL) break;
2512 
2513  id = HECMW_malloc(sizeof(*id));
2514  if (id == NULL) {
2515  HECMW_set_error(errno, "");
2516  return -1;
2517  }
2518 
2519  /* nodX */
2520  if (token != HECMW_HECLEX_INT) {
2521  set_err_token(token, HECMW_IO_HEC_E1500, "Node ID required");
2522  return -1;
2523  }
2524  id->id = HECMW_heclex_get_number();
2525  id->next = NULL;
2526  if (head == NULL) {
2527  head = id;
2528  } else {
2529  prev->next = id;
2530  }
2531  prev = id;
2532  n++;
2533 
2534  /* ',' or NL */
2535  token = HECMW_heclex_next_token();
2536  if (token != ',' && token != HECMW_HECLEX_NL) {
2537  set_err_token(token, HECMW_IO_HEC_E1500,
2538  "',' or NL required after node ID");
2539  return -1;
2540  }
2541  if (token == HECMW_HECLEX_NL) break;
2542  }
2543  HECMW_assert(head);
2544  HECMW_assert(n > 0);
2545 
2546  /* add node to group */
2547  node = HECMW_malloc(sizeof(*node) * n);
2548  if (node == NULL) {
2549  HECMW_set_error(errno, "");
2550  return -1;
2551  }
2552  i = 0;
2553  p = head;
2554  while (p) {
2555  node[i++] = p->id;
2556  q = p;
2557  p = p->next;
2558  HECMW_free(q);
2559  }
2560  if (HECMW_io_add_ngrp(ngrp, n, node) < 0) return -1;
2561  HECMW_free(node);
2562 
2563  return 0;
2564 }
2565 
2566 static int read_ngrp_generate(char *ngrp) {
2567  int i, n, id, *node, token;
2568  int nod1, nod2, nod3;
2569 
2570  while (1) {
2571  /* nod1 */
2572  token = HECMW_heclex_next_token();
2573  if (token != HECMW_HECLEX_INT) {
2574  set_err_token(token, HECMW_IO_HEC_E1500, "nod1 required");
2575  return -1;
2576  }
2577  nod1 = HECMW_heclex_get_number();
2578  if (nod1 <= 0) {
2579  set_err(HECMW_IO_HEC_E1502, "");
2580  return -1;
2581  }
2582 
2583  /* ',' */
2584  token = HECMW_heclex_next_token();
2585  if (token != ',') {
2586  set_err_token(token, HECMW_IO_HEC_E1500, "',' required after nod1");
2587  return -1;
2588  }
2589 
2590  /* nod2 */
2591  token = HECMW_heclex_next_token();
2592  if (token != HECMW_HECLEX_INT) {
2593  set_err_token(token, HECMW_IO_HEC_E1500, "nod2 required");
2594  return -1;
2595  }
2596  nod2 = HECMW_heclex_get_number();
2597  if (nod2 <= 0) {
2598  set_err(HECMW_IO_HEC_E1502, "");
2599  return -1;
2600  }
2601 
2602  /* ',' or NL */
2603  token = HECMW_heclex_next_token();
2604  if (token == ',') {
2605  /* nod3 */
2606  token = HECMW_heclex_next_token();
2607  if (token != HECMW_HECLEX_INT) {
2608  set_err_token(token, HECMW_IO_HEC_E1500, "Increment required");
2609  return -1;
2610  }
2611  nod3 = HECMW_heclex_get_number();
2612  if (nod3 <= 0) {
2613  set_err(HECMW_IO_HEC_E1502, "");
2614  return -1;
2615  }
2616 
2617  /* NL */
2618  token = HECMW_heclex_next_token();
2619  if (token != HECMW_HECLEX_NL) {
2620  set_err_token(token, HECMW_IO_HEC_E1500, "NL required after increment");
2621  return -1;
2622  }
2623  } else if (token == HECMW_HECLEX_NL) {
2624  nod3 = 1;
2625  } else {
2626  set_err_token(token, HECMW_IO_HEC_E1500, "',' or NL required after nod2");
2627  return -1;
2628  }
2629  HECMW_assert(token == HECMW_HECLEX_NL);
2630 
2631  /* make node */
2632  if (nod1 > nod2) {
2633  set_err(HECMW_IO_HEC_E1503,
2634  "Cannot generate between %d and %d with an increment of %d", nod1,
2635  nod2, nod3);
2636  return -1;
2637  }
2638  if ((nod2 - nod1) % nod3) {
2639  set_err(HECMW_IO_HEC_E1503,
2640  "Cannot generate between %d and %d with an increment of %d", nod1,
2641  nod2, nod3);
2642  return -1;
2643  }
2644 
2645  n = (nod2 - nod1) / nod3 + 1;
2646  node = HECMW_malloc(sizeof(int) * n);
2647  if (node == NULL) {
2648  HECMW_set_error(errno, "");
2649  return -1;
2650  }
2651 
2652  i = 0;
2653  for (id = nod1; id <= nod2; id += nod3) {
2654  node[i++] = id;
2655  }
2656  HECMW_assert(i == n);
2657  if (HECMW_io_add_ngrp(ngrp, n, node) < 0) return -1;
2658  HECMW_free(node);
2659 
2660  /* check next state */
2661  token = HECMW_heclex_next_token();
2662  if (token != HECMW_HECLEX_INT) {
2664  break;
2665  }
2667  }
2668  return 0;
2669 }
2670 
2671 static int read_ngroup(void) {
2672  int token, state;
2673  int flag_ngrp = 0; /* flag for NGRP */
2674  int flag_generate = 0; /* flag for GENERATE */
2675  int flag_input = 0; /* flag for INPUT */
2676  char ngrp[HECMW_NAME_LEN + 1] = "";
2677  enum {
2678  st_finished,
2679  st_header_line,
2680  st_header_line_param,
2681  st_data_include,
2682  st_data_line,
2683  st_data_line_generate
2684  };
2685 
2686  state = st_header_line;
2687  while (state != st_finished) {
2688  if (state == st_header_line) {
2689  if (read_ngrp_head()) return -1;
2690  state = st_header_line_param;
2691  } else if (state == st_header_line_param) {
2692  token = HECMW_heclex_next_token();
2693  if (token == HECMW_HECLEX_K_NGRP) {
2694  /* must */
2695  if (read_ngrp_param_ngrp(ngrp)) return -1;
2696  flag_ngrp = 1;
2697  } else if (token == HECMW_HECLEX_K_GENERATE) {
2698  /* oprtional */
2699  flag_generate = 1;
2700  } else if (token == HECMW_HECLEX_K_INPUT) {
2701  /* oprtional */
2702  if (read_input(HECMW_IO_HEC_E1500)) return -1;
2703  flag_input = 1;
2704  } else {
2705  set_err_token(token, HECMW_IO_HEC_E1500, "Unknown parameter");
2706  return -1;
2707  }
2708 
2709  /* check next parameter */
2710  token = HECMW_heclex_next_token();
2711  if (token == HECMW_HECLEX_NL) {
2712  if (flag_input) {
2713  state = st_data_include;
2714  } else if (flag_generate) {
2715  state = st_data_line_generate;
2716  } else {
2717  state = st_data_line;
2718  }
2719  /* check */
2720  if (!flag_ngrp) {
2721  set_err(HECMW_IO_HEC_E1501, "");
2722  return -1;
2723  }
2724  } else if (token == ',') {
2725  ; /* continue this state */
2726  } else {
2727  set_err_token(token, HECMW_IO_HEC_E1500, "Unknown parameter");
2728  return -1;
2729  }
2730  } else if (state == st_data_include) {
2731  HECMW_assert(flag_input);
2732  HECMW_assert(flag_ngrp);
2733  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
2734  state = flag_generate ? st_data_line_generate : st_data_line;
2735  } else if (state == st_data_line) {
2736  HECMW_assert(flag_ngrp);
2737  if (read_ngrp_data(ngrp)) return -1;
2738 
2739  /* check next state */
2740  token = HECMW_heclex_next_token();
2741  if (token != HECMW_HECLEX_INT) {
2742  state = st_finished;
2743  }
2745  } else if (state == st_data_line_generate) {
2746  HECMW_assert(flag_generate);
2747  HECMW_assert(flag_ngrp);
2748  if (read_ngrp_generate(ngrp)) return -1;
2749  state = st_finished;
2750  } else {
2751  HECMW_assert(0);
2752  }
2753  }
2754  HECMW_log(HECMW_LOG_DEBUG, "read_ngroup done");
2755  return 0;
2756 }
2757 
2758 /*----------------------------------------------------------------------------*/
2759 
2760 static int read_node_head(int *last_token) {
2761  int token;
2762 
2763  /* !NODE */
2764  token = HECMW_heclex_next_token();
2765  if (token != HECMW_HECLEX_H_NODE) {
2766  set_err_token(token, HECMW_IO_HEC_E1600, "!NODE required");
2767  return -1;
2768  }
2769 
2770  token = HECMW_heclex_next_token();
2771  if (token != ',' && token != HECMW_HECLEX_NL) {
2772  set_err_token(token, HECMW_IO_HEC_E1600, "',' or NL required after !NODE");
2773  return -1;
2774  }
2775  *last_token = token;
2776 
2777  return 0;
2778 }
2779 
2780 static int read_node_param_system(int *system) {
2781  int token;
2782 
2783  token = HECMW_heclex_next_token();
2784  if (token != '=') {
2785  set_err_token(token, HECMW_IO_HEC_E1600, "'=' required after SYSTEM");
2786  return -1;
2787  }
2788  token = HECMW_heclex_next_token();
2789  if (token != 'C' && token != 'R') {
2790  set_err_token(token, HECMW_IO_HEC_E1600, "Invalid SYSTEM");
2791  return -1;
2792  }
2793  *system = token;
2794  return 0;
2795 }
2796 
2797 static int read_node_param_ngrp(char *ngrp) {
2798  int token;
2799  char *p;
2800 
2801  token = HECMW_heclex_next_token();
2802  if (token != '=') {
2803  set_err_token(token, HECMW_IO_HEC_E1600, "'=' required after NGRP");
2804  return -1;
2805  }
2806  token = HECMW_heclex_next_token();
2807  if (token != HECMW_HECLEX_NAME) {
2808  set_err_token(token, HECMW_IO_HEC_E1600,
2809  "NGRP must begin with a letter or '_'");
2810  return -1;
2811  }
2812  p = HECMW_heclex_get_text();
2813  if (strlen(p) > HECMW_NAME_LEN) {
2814  set_err(HECMW_IO_E0001, "");
2815  return -1;
2816  }
2817  strcpy(ngrp, p);
2818  HECMW_toupper(ngrp);
2819  if (HECMW_io_is_reserved_name(ngrp)) {
2820  set_err(HECMW_IO_E0003, "");
2821  return -1;
2822  }
2823  if (strcmp(ngrp, "ALL") == 0) {
2824  HECMW_set_error(HECMW_IO_E0003, "Reserved name: %s", ngrp);
2825  return -1;
2826  }
2827  return 0;
2828 }
2829 
2830 static int read_node_data(int *id_arg, double *x_arg, double *y_arg,
2831  double *z_arg) {
2832  int id, token;
2833  double x, y, z;
2834 
2835  /* node ID */
2836  token = HECMW_heclex_next_token();
2837  if (token == HECMW_HECLEX_INT) {
2838  id = HECMW_heclex_get_number();
2839  if (id <= 0) {
2840  set_err(HECMW_IO_HEC_E1601, "");
2841  return -1;
2842  }
2843  } else {
2844  set_err(HECMW_IO_HEC_E1601, "");
2845  return -1;
2846  }
2847 
2848  /* ',' */
2849  token = HECMW_heclex_next_token();
2850  if (token != ',') {
2851  set_err_token(token, HECMW_IO_HEC_E1600, "',' required after nood ID");
2852  return -1;
2853  }
2854 
2855  x = y = z = 0.0;
2856  while (1) {
2857  /* X */
2858  token = HECMW_heclex_next_token();
2859  if (token == HECMW_HECLEX_NL) break;
2860  if (token == ',') {
2862  } else if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
2864  } else {
2865  set_err_token(token, HECMW_IO_HEC_E1600, "X required");
2866  return -1;
2867  }
2868 
2869  /* ',' */
2870  token = HECMW_heclex_next_token();
2871  if (token == HECMW_HECLEX_NL) break;
2872  if (token != ',') {
2873  set_err_token(token, HECMW_IO_HEC_E1600, "',' required after X");
2874  return -1;
2875  }
2876 
2877  /* Y */
2878  token = HECMW_heclex_next_token();
2879  if (token == HECMW_HECLEX_NL) break;
2880  if (token == ',') {
2882  } else if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
2884  } else {
2885  set_err_token(token, HECMW_IO_HEC_E1600, "Y required");
2886  return -1;
2887  }
2888 
2889  /* ',' */
2890  token = HECMW_heclex_next_token();
2891  if (token == HECMW_HECLEX_NL) break;
2892  if (token != ',') {
2893  set_err_token(token, HECMW_IO_HEC_E1600, "',' required after Y");
2894  return -1;
2895  }
2896 
2897  /* Z */
2898  token = HECMW_heclex_next_token();
2899  if (token == HECMW_HECLEX_NL) break;
2900  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
2902  } else {
2903  set_err_token(token, HECMW_IO_HEC_E1600, "Z required");
2904  return -1;
2905  }
2906 
2907  /* ',' or NL */
2908  token = HECMW_heclex_next_token();
2909  if (token == HECMW_HECLEX_NL) break;
2910  if (token == ',') {
2911  token = HECMW_heclex_next_token();
2912  if (token != HECMW_HECLEX_NL) {
2913  set_err_token(token, HECMW_IO_HEC_E1600, "NL required after Z");
2914  return -1;
2915  }
2916  }
2917 
2918  break;
2919  }
2920 
2921  *id_arg = id;
2922  *x_arg = x;
2923  *y_arg = y;
2924  *z_arg = z;
2925 
2926  return 0;
2927 }
2928 
2929 static int read_node_convert_coord(int system, double *x, double *y,
2930  double *z) {
2931  struct hecmw_coord coord, result;
2932 
2933  /* prepare */
2934  coord.x = *x;
2935  coord.y = *y;
2936  coord.z = *z;
2937 
2938  /* reflect parameter SYSTEM */
2939  if (system == 'C') {
2940  coord.y = HECMW_degree_to_radian(coord.y);
2941  if (HECMW_cylindrical_to_cartesian(&coord, &result)) {
2942  HECMW_assert(0);
2943  }
2944  coord = result;
2945  }
2946 
2947  /* reflect !SYSTEM */
2948  if (HECMW_system(HECMW_io_get_system(), &coord, &result)) {
2949  HECMW_assert(0);
2950  }
2951 
2952  *x = result.x;
2953  *y = result.y;
2954  *z = result.z;
2955 
2956  return 0;
2957 }
2958 
2959 static int read_node(void) {
2960  int token, state;
2961  int system = 'R'; /* C:cylindrical coordinates, R:cartesian coordinates */
2962  int flag_system = 0; /* flag for SYSTEM */
2963  int flag_ngrp = 0; /* flag for NGRP */
2964  int flag_input = 0; /* flag for INPUT */
2965  char ngrp[HECMW_NAME_LEN + 1] = "";
2966  enum {
2967  ST_FINISHED,
2968  ST_HEADER_LINE,
2969  ST_HEADER_LINE_PARAM,
2970  ST_DATA_INCLUDE,
2971  ST_DATA_LINE
2972  };
2973 
2974  state = ST_HEADER_LINE;
2975  while (state != ST_FINISHED) {
2976  if (state == ST_HEADER_LINE) {
2977  if (read_node_head(&token)) return -1;
2978  if (token == HECMW_HECLEX_NL) {
2979  state = ST_DATA_LINE;
2980  } else if (token == ',') {
2981  state = ST_HEADER_LINE_PARAM;
2982  } else {
2983  HECMW_assert(0);
2984  }
2985  } else if (state == ST_HEADER_LINE_PARAM) {
2986  token = HECMW_heclex_next_token();
2987  if (token == HECMW_HECLEX_K_SYSTEM) {
2988  /* optional */
2989  if (read_node_param_system(&system)) return -1;
2990  flag_system = 1;
2991  } else if (token == HECMW_HECLEX_K_NGRP) {
2992  /* optional */
2993  if (read_node_param_ngrp(ngrp)) return -1;
2994  flag_ngrp = 1;
2995  } else if (token == HECMW_HECLEX_K_INPUT) {
2996  /* optional */
2997  if (read_input(HECMW_IO_HEC_E1600)) return -1;
2998  flag_input = 1;
2999  } else {
3000  set_err_token(token, HECMW_IO_HEC_E1600, "Unknown parameter");
3001  return -1;
3002  }
3003 
3004  /* check next parameter */
3005  token = HECMW_heclex_next_token();
3006  if (token == HECMW_HECLEX_NL) {
3007  state = flag_input ? ST_DATA_INCLUDE : ST_DATA_LINE;
3008  } else if (token == ',') {
3009  ; /* continue this state */
3010  } else {
3011  set_err_token(token, HECMW_IO_HEC_E1600, "Unknown parameter");
3012  return -1;
3013  }
3014  } else if (state == ST_DATA_INCLUDE) {
3015  HECMW_assert(flag_input);
3016  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
3017  state = ST_DATA_LINE;
3018  } else if (state == ST_DATA_LINE) {
3019  int id;
3020  double x, y, z;
3021 
3022  if (read_node_data(&id, &x, &y, &z)) return -1;
3023  if (read_node_convert_coord(system, &x, &y, &z)) return -1;
3024 
3025  /* add node */
3026  if (HECMW_io_add_node(id, x, y, z) == NULL) return -1;
3027 
3028  /* add node to group */
3029  if (HECMW_io_add_ngrp("ALL", 1, &id) < 0) return -1;
3030 
3031  if (flag_ngrp) {
3032  if (HECMW_io_add_ngrp(ngrp, 1, &id) < 0) return -1;
3033  }
3034 
3035  /* check next state */
3036  token = HECMW_heclex_next_token();
3037  if (token != HECMW_HECLEX_INT) {
3038  state = ST_FINISHED;
3039  } else {
3040  state = ST_DATA_LINE;
3041  }
3043  } else {
3044  HECMW_assert(0);
3045  }
3046  }
3047  HECMW_log(HECMW_LOG_DEBUG, "read_node done");
3048  return 0;
3049 }
3050 
3051 /*----------------------------------------------------------------------------*/
3052 
3053 static int read_section_head(void) {
3054  int token;
3055 
3056  /* !SECTION */
3057  token = HECMW_heclex_next_token();
3058  if (token != HECMW_HECLEX_H_SECTION) {
3059  set_err_token(token, HECMW_IO_HEC_E1700, "!SECTION required");
3060  return -1;
3061  }
3062 
3063  token = HECMW_heclex_next_token();
3064  if (token != ',') {
3065  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after !SECTION");
3066  return -1;
3067  }
3068 
3069  return 0;
3070 }
3071 
3072 static int read_section_param_type(int *type) {
3073  int token;
3074 
3075  token = HECMW_heclex_next_token();
3076  if (token != '=') {
3077  set_err_token(token, HECMW_IO_HEC_E1700, "'=' required after TYPE");
3078  return -1;
3079  }
3080  token = HECMW_heclex_next_token();
3081  if (token == HECMW_HECLEX_K_SOLID) {
3082  *type = HECMW_SECT_TYPE_SOLID;
3083  } else if (token == HECMW_HECLEX_K_SHELL) {
3084  *type = HECMW_SECT_TYPE_SHELL;
3085  } else if (token == HECMW_HECLEX_K_BEAM) {
3086  *type = HECMW_SECT_TYPE_BEAM;
3087  } else if (token == HECMW_HECLEX_K_INTERFACE) {
3088  *type = HECMW_SECT_TYPE_INTERFACE;
3089  } else {
3090  set_err_token(token, HECMW_IO_HEC_E1700, "Invalid TYPE");
3091  return -1;
3092  }
3093  return 0;
3094 }
3095 
3096 static int read_section_param_egrp(char *egrp) {
3097  int token;
3098  char *p;
3099 
3100  token = HECMW_heclex_next_token();
3101  if (token != '=') {
3102  set_err_token(token, HECMW_IO_HEC_E1700, "'=' reuqired after EGRP");
3103  return -1;
3104  }
3105  token = HECMW_heclex_next_token();
3106  if (token != HECMW_HECLEX_NAME) {
3107  set_err_token(token, HECMW_IO_HEC_E1700,
3108  "EGRP must begin with a letter or '_'");
3109  return -1;
3110  }
3111  p = HECMW_heclex_get_text();
3112  if (strlen(p) > HECMW_NAME_LEN) {
3113  set_err(HECMW_IO_E0001, "");
3114  return -1;
3115  }
3116  strcpy(egrp, p);
3117  HECMW_toupper(egrp);
3118  if (HECMW_io_is_reserved_name(egrp)) {
3119  set_err(HECMW_IO_E0003, "");
3120  return -1;
3121  }
3122  return 0;
3123 }
3124 
3125 static int read_section_param_material(char *material) {
3126  int token;
3127  char *p;
3128 
3129  token = HECMW_heclex_next_token();
3130  if (token != '=') {
3131  set_err_token(token, HECMW_IO_HEC_E1700, "'=' reuqired after MATERIAL");
3132  return -1;
3133  }
3134  token = HECMW_heclex_next_token();
3135  if (token != HECMW_HECLEX_NAME) {
3136  set_err_token(token, HECMW_IO_HEC_E1700,
3137  "MATERIAL must begin with a letter or '_'");
3138  return -1;
3139  }
3140  p = HECMW_heclex_get_text();
3141  if (strlen(p) > HECMW_NAME_LEN) {
3142  set_err(HECMW_IO_E0001, "");
3143  return -1;
3144  }
3145  strcpy(material, p);
3146  HECMW_toupper(material);
3147  if (HECMW_io_is_reserved_name(material)) {
3148  set_err(HECMW_IO_E0003, "");
3149  return -1;
3150  }
3151  return 0;
3152 }
3153 
3154 #if 0
3155 static int
3156 read_section_param_composite(int *composite)
3157 {
3158  int token;
3159 
3160  *composite = 1; /* default value */
3161  token = HECMW_heclex_next_token();
3162  if(token == '=') {
3163  token = HECMW_heclex_next_token();
3164  if(token != HECMW_HECLEX_INT) {
3165  set_err_token(token, HECMW_IO_HEC_E1700, "COMPOSITE value reuqired");
3166  return -1;
3167  }
3168  *composite = HECMW_heclex_get_number();
3169  } else {
3171  }
3172  if(*composite <= 0) {
3173  set_err(HECMW_IO_HEC_E1704, "");
3174  return -1;
3175  }
3176  return 0;
3177 }
3178 #endif
3179 
3180 static int read_section_param_secopt(int *secopt_arg) {
3181  int token, secopt;
3182 
3183  token = HECMW_heclex_next_token();
3184  if (token != '=') {
3185  set_err_token(token, HECMW_IO_HEC_E1700, "'=' required after SECOPT");
3186  return -1;
3187  }
3188  token = HECMW_heclex_next_token();
3189  if (token != HECMW_HECLEX_INT) {
3190  set_err_token(token, HECMW_IO_HEC_E1700, "SECOPT value reuqired");
3191  return -1;
3192  }
3193  secopt = HECMW_heclex_get_number();
3194  if (secopt != HECMW_SECT_OPT_PSTRESS && secopt != HECMW_SECT_OPT_PSTRAIN &&
3195  secopt != HECMW_SECT_OPT_ASYMMETRY &&
3196  secopt != HECMW_SECT_OPT_PSTRESS_RI &&
3197  secopt != HECMW_SECT_OPT_PSTRAIN_RI &&
3198  secopt != HECMW_SECT_OPT_ASYMMETRY_RI) {
3199  set_err_token(token, HECMW_IO_HEC_E1700, "Invalid SECOPT");
3200  return -1;
3201  }
3202 
3203  *secopt_arg = secopt;
3204 
3205  return 0;
3206 }
3207 
3208 static int read_section_solid(union hecmw_io_section_item *sect_item) {
3209  int token;
3210  double thickness;
3211 
3212  /* THICKNESS */
3213  token = HECMW_heclex_next_token();
3214  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3215  thickness = HECMW_heclex_get_number();
3216 
3217  /* NL */
3218  token = HECMW_heclex_next_token();
3219  if (token != HECMW_HECLEX_NL) {
3220  set_err_token(token, HECMW_IO_HEC_E1700, "NL required after THICKNESS");
3221  return -1;
3222  }
3223  } else {
3224  thickness = 1.0;
3226  }
3227 
3228  if (thickness <= 0.0) {
3229  set_err(HECMW_IO_HEC_E1705, "");
3230  return -1;
3231  }
3232 
3233  /* set */
3234  sect_item->solid.thickness = thickness;
3235 
3236  return 0;
3237 }
3238 
3239 static int read_section_shell(union hecmw_io_section_item *sect_item) {
3240  double thickness;
3241  int token, integpoints;
3242 
3243  /* THICKNESS */
3244  token = HECMW_heclex_next_token();
3245  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3246  thickness = HECMW_heclex_get_number();
3247  } else {
3248  set_err_token(token, HECMW_IO_HEC_E1700, "THICKNESS reuiqred");
3249  return -1;
3250  }
3251  if (thickness <= 0.0) {
3252  set_err(HECMW_IO_HEC_E1705, "");
3253  return -1;
3254  }
3255 
3256  /* ',' */
3257  token = HECMW_heclex_next_token();
3258  if (token != ',') {
3259  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after THICKNESS");
3260  return -1;
3261  }
3262 
3263  /* INTEGPOINTS */
3264  token = HECMW_heclex_next_token();
3265  if (token == HECMW_HECLEX_INT) {
3266  integpoints = HECMW_heclex_get_number();
3267  } else {
3268  set_err_token(token, HECMW_IO_HEC_E1700, "INTEGPOINTS required");
3269  return -1;
3270  }
3271  if (integpoints <= 0) {
3272  set_err(HECMW_IO_HEC_E1706, "");
3273  return -1;
3274  }
3275 
3276  /* NL */
3277  token = HECMW_heclex_next_token();
3278  if (token != HECMW_HECLEX_NL) {
3279  set_err_token(token, HECMW_IO_HEC_E1700, "NL required after INTEGPOINTS");
3280  return -1;
3281  }
3282 
3283  /* set */
3284  sect_item->shell.thickness = thickness;
3285  sect_item->shell.integpoints = integpoints;
3286 
3287  return 0;
3288 }
3289 
3290 static int read_section_beam(union hecmw_io_section_item *sect_item) {
3291  double nx, ny, nz, area, Iyy, Izz, Jx;
3292  int token;
3293 
3294  /* vx */
3295  token = HECMW_heclex_next_token();
3296  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3297  nx = HECMW_heclex_get_number();
3298  } else {
3299  set_err_token(token, HECMW_IO_HEC_E1700, "vx reuiqred");
3300  return -1;
3301  }
3302 
3303  /* ',' */
3304  token = HECMW_heclex_next_token();
3305  if (token != ',') {
3306  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after vx");
3307  return -1;
3308  }
3309 
3310  /* vy */
3311  token = HECMW_heclex_next_token();
3312  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3313  ny = HECMW_heclex_get_number();
3314  } else {
3315  set_err_token(token, HECMW_IO_HEC_E1700, "vy reuiqred");
3316  return -1;
3317  }
3318 
3319  /* ',' */
3320  token = HECMW_heclex_next_token();
3321  if (token != ',') {
3322  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after vy");
3323  return -1;
3324  }
3325 
3326  /* vz */
3327  token = HECMW_heclex_next_token();
3328  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3329  nz = HECMW_heclex_get_number();
3330  } else {
3331  set_err_token(token, HECMW_IO_HEC_E1700, "vz reuiqred");
3332  return -1;
3333  }
3334 
3335  /* ',' */
3336  token = HECMW_heclex_next_token();
3337  if (token != ',') {
3338  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after vz");
3339  return -1;
3340  }
3341 
3342  /* area */
3343  token = HECMW_heclex_next_token();
3344  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3345  area = HECMW_heclex_get_number();
3346  } else {
3347  set_err_token(token, HECMW_IO_HEC_E1700, "area required");
3348  return -1;
3349  }
3350  if (area <= 0) {
3351  set_err(HECMW_IO_HEC_E1707, "");
3352  return -1;
3353  }
3354 
3355  /* ',' */
3356  token = HECMW_heclex_next_token();
3357  if (token != ',') {
3358  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after vz");
3359  return -1;
3360  }
3361 
3362  /* Iyy */
3363  token = HECMW_heclex_next_token();
3364  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3365  Iyy = HECMW_heclex_get_number();
3366  } else {
3367  set_err_token(token, HECMW_IO_HEC_E1700, "Iyy reuiqred");
3368  return -1;
3369  }
3370  if (Iyy <= 0) {
3371  set_err(HECMW_IO_HEC_E1708, "");
3372  return -1;
3373  }
3374 
3375  /* ',' */
3376  token = HECMW_heclex_next_token();
3377  if (token != ',') {
3378  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after Iyy");
3379  return -1;
3380  }
3381 
3382  /* Izz */
3383  token = HECMW_heclex_next_token();
3384  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3385  Izz = HECMW_heclex_get_number();
3386  } else {
3387  set_err_token(token, HECMW_IO_HEC_E1700, "Izz reuiqred");
3388  return -1;
3389  }
3390  if (Izz <= 0) {
3391  set_err(HECMW_IO_HEC_E1709, "");
3392  return -1;
3393  }
3394 
3395  /* ',' */
3396  token = HECMW_heclex_next_token();
3397  if (token != ',') {
3398  set_err_token(token, HECMW_IO_HEC_E1700, "',' required after Izz");
3399  return -1;
3400  }
3401 
3402  /* Jx */
3403  token = HECMW_heclex_next_token();
3404  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3405  Jx = HECMW_heclex_get_number();
3406  } else {
3407  set_err_token(token, HECMW_IO_HEC_E1700, "Jx reuiqred");
3408  return -1;
3409  }
3410  if (Jx <= 0) {
3411  set_err(HECMW_IO_HEC_E1710, "");
3412  return -1;
3413  }
3414 
3415  /* NL */
3416  token = HECMW_heclex_next_token();
3417  if (token != HECMW_HECLEX_NL) {
3418  set_err_token(token, HECMW_IO_HEC_E1700, "NL required after Jx");
3419  return -1;
3420  }
3421 
3422  /* set */
3423  sect_item->beam.vxyz[0] = nx;
3424  sect_item->beam.vxyz[1] = ny;
3425  sect_item->beam.vxyz[2] = nz;
3426  sect_item->beam.area = area;
3427  sect_item->beam.Iyy = Iyy;
3428  sect_item->beam.Izz = Izz;
3429  sect_item->beam.Jx = Jx;
3430 
3431  return 0;
3432 }
3433 
3434 static int read_section_interface(union hecmw_io_section_item *sect_item) {
3435  int token;
3436  double thickness;
3437  double gapcon = 0.0;
3438  double gaprad1 = 0.0;
3439  double gaprad2 = 0.0;
3440 
3441  while (1) {
3442  /* THICKNESS */
3443  token = HECMW_heclex_next_token();
3444  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3445  thickness = HECMW_heclex_get_number();
3446  } else {
3447  set_err_token(token, HECMW_IO_HEC_E1700, "THICKNESS required");
3448  return -1;
3449  }
3450  if (thickness <= 0.0) {
3451  set_err(HECMW_IO_HEC_E1705, "");
3452  return -1;
3453  }
3454 
3455  /* ',' or NL */
3456  token = HECMW_heclex_next_token();
3457  if (token != ',' && token != HECMW_HECLEX_NL) {
3458  set_err_token(token, HECMW_IO_HEC_E1700,
3459  "',' or NL reuqired after THICKNESS");
3460  return -1;
3461  }
3462  if (token == HECMW_HECLEX_NL) break;
3463 
3464  /* GAPCON */
3465  token = HECMW_heclex_next_token();
3466  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3467  gapcon = HECMW_heclex_get_number();
3468  } else if (token == ',') {
3470  } else if (token == HECMW_HECLEX_NL) {
3471  break;
3472  } else {
3473  set_err_token(token, HECMW_IO_HEC_E1700, "GAPCON reuiqred");
3474  return -1;
3475  }
3476 
3477  /* ',' or NL */
3478  token = HECMW_heclex_next_token();
3479  if (token != ',' && token != HECMW_HECLEX_NL) {
3480  set_err_token(token, HECMW_IO_HEC_E1700,
3481  "',' or NL reuiqred after GAPCON");
3482  return -1;
3483  }
3484  if (token == HECMW_HECLEX_NL) break;
3485 
3486  /* GAPRAD1 */
3487  token = HECMW_heclex_next_token();
3488  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3489  gaprad1 = HECMW_heclex_get_number();
3490  } else if (token == ',') {
3492  } else if (token == HECMW_HECLEX_NL) {
3493  break;
3494  } else {
3495  set_err_token(token, HECMW_IO_HEC_E1700, "GAPRAD1 reuiqred");
3496  return -1;
3497  }
3498 
3499  /* ',' or NL */
3500  token = HECMW_heclex_next_token();
3501  if (token != ',' && token != HECMW_HECLEX_NL) {
3502  set_err_token(token, HECMW_IO_HEC_E1700,
3503  "',' or NL reuqired after GAPRAD1");
3504  return -1;
3505  }
3506  if (token == HECMW_HECLEX_NL) break;
3507 
3508  /* GAPRAD2 */
3509  token = HECMW_heclex_next_token();
3510  if (token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3511  gaprad2 = HECMW_heclex_get_number();
3512  } else if (token == HECMW_HECLEX_NL) {
3514  } else {
3515  set_err_token(token, HECMW_IO_HEC_E1700, "GAPRAD2 reuiqred");
3516  return -1;
3517  }
3518 
3519  /* NL */
3520  token = HECMW_heclex_next_token();
3521  if (token != HECMW_HECLEX_NL) {
3522  set_err_token(token, HECMW_IO_HEC_E1700, "NL required after GAPRAD2");
3523  return -1;
3524  }
3525  break;
3526  }
3527 
3528  /* set */
3529  sect_item->interface.thickness = thickness;
3530  sect_item->interface.gapcon = gapcon;
3531  sect_item->interface.gaprad1 = gaprad1;
3532  sect_item->interface.gaprad2 = gaprad2;
3533 
3534  return 0;
3535 }
3536 
3537 static int read_section(void) {
3538  int token, state;
3539  int type = -1;
3540  int secopt = 0;
3541  int composite = -1;
3542  union hecmw_io_section_item sect_item;
3543  int flag_type = 0; /* flag for TYPE */
3544  int flag_egrp = 0; /* flag for EGRP */
3545  int flag_material = 0; /* flag for MATERIAL */
3546  int flag_composite = 0; /* flag for COMPOSITE */
3547  int flag_secopt = 0; /* flag for SECOPT */
3548  int flag_input = 0; /* flag for INPUT */
3549  char egrp[HECMW_NAME_LEN + 1] = "";
3550  char material[HECMW_NAME_LEN + 1] = "ALL";
3551  enum {
3552  ST_FINISHED,
3553  ST_HEADER_LINE,
3554  ST_HEADER_LINE_PARAM,
3555  ST_DATA_INCLUDE,
3556  ST_DATA_LINE_SOLID,
3557  ST_DATA_LINE_SHELL,
3558  ST_DATA_LINE_BEAM,
3559  ST_DATA_LINE_INTERFACE,
3560  ST_DATA_LINE_REGIST
3561  };
3562 
3563  state = ST_HEADER_LINE;
3564  while (state != ST_FINISHED) {
3565  if (state == ST_HEADER_LINE) {
3566  if (read_section_head()) return -1;
3567  state = ST_HEADER_LINE_PARAM;
3568  } else if (state == ST_HEADER_LINE_PARAM) {
3569  token = HECMW_heclex_next_token();
3570  if (token == HECMW_HECLEX_K_TYPE) {
3571  /* must */
3572  if (read_section_param_type(&type)) return -1;
3573  flag_type = 1;
3574  } else if (token == HECMW_HECLEX_K_EGRP) {
3575  /* must */
3576  if (read_section_param_egrp(egrp)) return -1;
3577  flag_egrp = 1;
3578  } else if (token == HECMW_HECLEX_K_MATERIAL) {
3579  /* optional */
3580  if (flag_composite) {
3581  set_err(HECMW_IO_HEC_E1703, "");
3582  return -1;
3583  }
3584  if (read_section_param_material(material)) return -1;
3585  flag_material = 1;
3586 #if 0
3587  } else if(token == HECMW_HECLEX_K_COMPOSITE) {
3588  /* optional */
3589  if(flag_material) {
3590  set_err(HECMW_IO_HEC_E1703, "");
3591  return -1;
3592  }
3593  if(read_section_param_composite(&composite)) return -1;
3594  flag_composite = 1;
3595 #endif
3596  } else if (token == HECMW_HECLEX_K_SECOPT) {
3597  /* optional */
3598  if (read_section_param_secopt(&secopt)) return -1;
3599  flag_secopt = 1;
3600  } else if (token == HECMW_HECLEX_K_INPUT) {
3601  /* optional */
3602  if (read_input(HECMW_IO_HEC_E1700)) return -1;
3603  flag_input = 1;
3604  } else {
3605  set_err_token(token, HECMW_IO_HEC_E1700, "Unknown parameter");
3606  return -1;
3607  }
3608 
3609  /* check next parameter */
3610  token = HECMW_heclex_next_token();
3611  if (token == HECMW_HECLEX_NL) {
3612  /* check */
3613  if (!flag_type) {
3614  set_err(HECMW_IO_HEC_E1701, "");
3615  return -1;
3616  }
3617  if (!flag_egrp) {
3618  set_err(HECMW_IO_HEC_E1702, "");
3619  return -1;
3620  }
3621  /* set next state */
3622  if (flag_input) {
3623  state = ST_DATA_INCLUDE;
3624  } else if (type == HECMW_SECT_TYPE_SOLID) {
3625  state = ST_DATA_LINE_SOLID;
3626  } else if (type == HECMW_SECT_TYPE_SHELL) {
3627  state = ST_DATA_LINE_SHELL;
3628  } else if (type == HECMW_SECT_TYPE_BEAM) {
3629  state = ST_DATA_LINE_BEAM;
3630  } else if (type == HECMW_SECT_TYPE_INTERFACE) {
3631  state = ST_DATA_LINE_INTERFACE;
3632  } else {
3633  HECMW_assert(0);
3634  }
3635  } else if (token == ',') {
3636  ; /* continue this state */
3637  } else {
3638  set_err_token(token, HECMW_IO_HEC_E1700, "Unknown parameter");
3639  return -1;
3640  }
3641  } else if (state == ST_DATA_INCLUDE) {
3642  HECMW_assert(flag_input);
3643 
3644  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
3645 
3646  /* set next state */
3647  if (type == HECMW_SECT_TYPE_SOLID) {
3648  state = ST_DATA_LINE_SOLID;
3649  } else if (type == HECMW_SECT_TYPE_SHELL) {
3650  state = ST_DATA_LINE_SHELL;
3651  } else if (type == HECMW_SECT_TYPE_BEAM) {
3652  state = ST_DATA_LINE_BEAM;
3653  } else if (type == HECMW_SECT_TYPE_INTERFACE) {
3654  state = ST_DATA_LINE_INTERFACE;
3655  } else {
3656  HECMW_assert(0);
3657  }
3658  } else if (state == ST_DATA_LINE_SOLID) {
3659  HECMW_assert(flag_egrp);
3660  HECMW_assert(flag_type);
3662 
3663  if (read_section_solid(&sect_item)) return -1;
3664  state = ST_DATA_LINE_REGIST;
3665  } else if (state == ST_DATA_LINE_SHELL) {
3666  HECMW_assert(flag_egrp);
3667  HECMW_assert(flag_type);
3669 
3670  if (read_section_shell(&sect_item)) return -1;
3671  state = ST_DATA_LINE_REGIST;
3672  } else if (state == ST_DATA_LINE_BEAM) {
3673  HECMW_assert(flag_egrp);
3674  HECMW_assert(flag_type);
3676 
3677  if (read_section_beam(&sect_item)) return -1;
3678  state = ST_DATA_LINE_REGIST;
3679  } else if (state == ST_DATA_LINE_INTERFACE) {
3680  HECMW_assert(flag_egrp);
3681  HECMW_assert(flag_type);
3683 
3684  if (read_section_interface(&sect_item)) return -1;
3685  state = ST_DATA_LINE_REGIST;
3686  } else if (state == ST_DATA_LINE_REGIST) {
3687  struct hecmw_io_section sect;
3688  HECMW_assert(flag_type);
3689  HECMW_assert(flag_egrp);
3690 
3691  /* set */
3692  strcpy(sect.egrp, egrp);
3693  strcpy(sect.material, material);
3694  sect.composite = composite;
3695  sect.secopt = secopt;
3696  sect.type = type;
3697  sect.sect = sect_item;
3698  sect.next = NULL;
3699 
3700  /* add */
3701  if (HECMW_io_add_sect(&sect) == NULL) return -1;
3702 
3703  /* set next state */
3704  state = ST_FINISHED;
3705  } else {
3706  HECMW_assert(0);
3707  }
3708  }
3709  HECMW_log(HECMW_LOG_DEBUG, "read_section done");
3710  return 0;
3711 }
3712 
3713 /*----------------------------------------------------------------------------*/
3714 
3715 static int read_sgrp_head(void) {
3716  int token;
3717 
3718  /* !SGROUP */
3719  token = HECMW_heclex_next_token();
3720  if (token != HECMW_HECLEX_H_SGROUP) {
3721  set_err_token(token, HECMW_IO_HEC_E1800, "!SGROUP required");
3722  return -1;
3723  }
3724 
3725  token = HECMW_heclex_next_token();
3726  if (token != ',') {
3727  set_err_token(token, HECMW_IO_HEC_E1800, "',' required after !SGROUP");
3728  return -1;
3729  }
3730 
3731  return 0;
3732 }
3733 
3734 static int read_sgrp_param_sgrp(char *sgrp) {
3735  int token;
3736  char *p;
3737 
3738  token = HECMW_heclex_next_token();
3739  if (token != '=') {
3740  set_err_token(token, HECMW_IO_HEC_E1800, "'=' required after SGRP");
3741  return -1;
3742  }
3743  token = HECMW_heclex_next_token();
3744  if (token != HECMW_HECLEX_NAME) {
3745  set_err_token(token, HECMW_IO_HEC_E1800,
3746  "SGRP must begin with a letter or '_'");
3747  return -1;
3748  }
3749  p = HECMW_heclex_get_text();
3750  if (strlen(p) > HECMW_NAME_LEN) {
3751  set_err(HECMW_IO_E0001, "");
3752  return -1;
3753  }
3754  strcpy(sgrp, p);
3755  HECMW_toupper(sgrp);
3756  if (HECMW_io_is_reserved_name(sgrp)) {
3757  set_err(HECMW_IO_E0003, "");
3758  return -1;
3759  }
3760  return 0;
3761 }
3762 
3763 static int read_sgrp_data(char *sgrp) {
3764  int i, n, *elem, *surf, token;
3765  struct hecmw_io_id *elem_head, *surf_head, *elem_prev, *surf_prev;
3766  struct hecmw_io_id *eid, *sid, *pe, *qe, *ps, *qs;
3767 
3768  n = 0;
3769  elem_head = surf_head = NULL;
3770  elem_prev = surf_prev = NULL;
3771  while (1) {
3772  token = HECMW_heclex_next_token();
3773  if (n != 0 && token == HECMW_HECLEX_NL) break;
3774 
3775  eid = HECMW_malloc(sizeof(*eid));
3776  if (eid == NULL) {
3777  HECMW_set_error(errno, "");
3778  return -1;
3779  }
3780  eid->next = NULL;
3781 
3782  /* elemX */
3783  if (token != HECMW_HECLEX_INT) {
3784  set_err_token(token, HECMW_IO_HEC_E1800, "Element ID required");
3785  return -1;
3786  }
3787  eid->id = HECMW_heclex_get_number();
3788 
3789  if (elem_head == NULL) {
3790  elem_head = elem_prev = eid;
3791  } else {
3792  elem_prev->next = eid;
3793  elem_prev = eid;
3794  }
3795 
3796  /* ',' */
3797  token = HECMW_heclex_next_token();
3798  if (token != ',') {
3799  set_err_token(token, HECMW_IO_HEC_E1800, "',' reuqired after element ID");
3800  return -1;
3801  }
3802 
3803  sid = HECMW_malloc(sizeof(*sid));
3804  if (sid == NULL) {
3805  HECMW_set_error(errno, "");
3806  return -1;
3807  }
3808  sid->next = NULL;
3809 
3810  /* lsufX */
3811  token = HECMW_heclex_next_token();
3812  if (token != HECMW_HECLEX_INT) {
3813  set_err_token(token, HECMW_IO_HEC_E1800, "Surface ID required");
3814  return -1;
3815  }
3816  sid->id = HECMW_heclex_get_number();
3817 
3818  if (surf_head == NULL) {
3819  surf_head = surf_prev = sid;
3820  } else {
3821  surf_prev->next = sid;
3822  surf_prev = sid;
3823  }
3824 
3825  n++;
3826 
3827  /* ',' or NL */
3828  token = HECMW_heclex_next_token();
3829  if (token != ',' && token != HECMW_HECLEX_NL) {
3830  set_err_token(token, HECMW_IO_HEC_E1800,
3831  "',' or NL required after surface ID");
3832  return -1;
3833  }
3834  if (token == HECMW_HECLEX_NL) break;
3835  }
3836 
3837  if (n > 0) {
3838  /* add elem and surf to group */
3839  elem = HECMW_malloc(sizeof(*elem) * n);
3840  if (elem == NULL) {
3841  HECMW_set_error(errno, "");
3842  return -1;
3843  }
3844  surf = HECMW_malloc(sizeof(*surf) * n);
3845  if (surf == NULL) {
3846  HECMW_set_error(errno, "");
3847  return -1;
3848  }
3849  i = 0;
3850  qe = qs = NULL;
3851  pe = elem_head;
3852  ps = surf_head;
3853  for (i = 0; i < n; i++) {
3854  HECMW_assert(pe);
3855  HECMW_assert(ps);
3856  elem[i] = pe->id;
3857  surf[i] = ps->id;
3858  qe = pe;
3859  qs = ps;
3860  pe = pe->next;
3861  ps = ps->next;
3862  HECMW_free(qe);
3863  HECMW_free(qs);
3864  }
3865  if (HECMW_io_add_sgrp(sgrp, n, elem, surf) < 0) return -1;
3866 
3867  HECMW_free(elem);
3868  HECMW_free(surf);
3869  }
3870 
3871  return 0;
3872 }
3873 
3874 static int read_sgroup(void) {
3875  int token, state;
3876  int flag_sgrp = 0; /* flag for SGRP */
3877  int flag_input = 0; /* flag for INPUT */
3878  char sgrp[HECMW_NAME_LEN + 1] = "";
3879  enum {
3880  ST_FINISHED,
3881  ST_HEADER_LINE,
3882  ST_HEADER_LINE_PARAM,
3883  ST_DATA_INCLUDE,
3884  ST_DATA_LINE
3885  };
3886 
3887  state = ST_HEADER_LINE;
3888  while (state != ST_FINISHED) {
3889  if (state == ST_HEADER_LINE) {
3890  if (read_sgrp_head()) return -1;
3891  state = ST_HEADER_LINE_PARAM;
3892  } else if (state == ST_HEADER_LINE_PARAM) {
3893  token = HECMW_heclex_next_token();
3894  if (token == HECMW_HECLEX_K_SGRP) {
3895  /* must */
3896  if (read_sgrp_param_sgrp(sgrp)) return -1;
3897  flag_sgrp = 1;
3898  } else if (token == HECMW_HECLEX_K_INPUT) {
3899  /* oprtional */
3900  if (read_input(HECMW_IO_HEC_E1800)) return -1;
3901  flag_input = 1;
3902  } else {
3903  set_err_token(token, HECMW_IO_HEC_E1800, "Unknown parameter");
3904  return -1;
3905  }
3906 
3907  /* check next parameter */
3908  token = HECMW_heclex_next_token();
3909  if (token == HECMW_HECLEX_NL) {
3910  /* check */
3911  if (!flag_sgrp) {
3912  set_err(HECMW_IO_HEC_E1801, "");
3913  return -1;
3914  }
3915  state = flag_input ? ST_DATA_INCLUDE : ST_DATA_LINE;
3916  } else if (token == ',') {
3917  ; /* continue this state */
3918  } else {
3919  set_err_token(token, HECMW_IO_HEC_E1800, "Unknown parameter");
3920  return -1;
3921  }
3922  } else if (state == ST_DATA_INCLUDE) {
3923  HECMW_assert(flag_input);
3924  HECMW_assert(flag_sgrp);
3925  if (HECMW_heclex_switch_to_include(include_filename)) return -1;
3926  state = ST_DATA_LINE;
3927  } else if (state == ST_DATA_LINE) {
3928  HECMW_assert(flag_sgrp);
3929  if (read_sgrp_data(sgrp)) return -1;
3930 
3931  /* check next state */
3932  token = HECMW_heclex_next_token();
3933  if (token != HECMW_HECLEX_INT) {
3934  state = ST_FINISHED;
3935  } else {
3936  state = ST_DATA_LINE;
3937  }
3939  } else {
3940  HECMW_assert(0);
3941  }
3942  }
3943  HECMW_log(HECMW_LOG_DEBUG, "read_sgroup done");
3944  return 0;
3945 }
3946 
3947 /*----------------------------------------------------------------------------*/
3948 #if 0
3949 static int
3950 read_system_head(void)
3951 {
3952  int token;
3953 
3954  /* !SYSTEM */
3955  token = HECMW_heclex_next_token();
3956  if(token != HECMW_HECLEX_H_SYSTEM) {
3957  set_err_token(token, HECMW_IO_HEC_E1900, "!SYSTEM required");
3958  return -1;
3959  }
3960 
3961  /* NL */
3962  token = HECMW_heclex_next_token();
3963  if(token != HECMW_HECLEX_NL) {
3964  set_err_token(token, HECMW_IO_HEC_E1900, "NL required after !SYSTEM");
3965  return -1;
3966  }
3967 
3968  return 0;
3969 }
3970 
3971 
3972 static int
3973 read_system_data_line1a(struct hecmw_system_param *system, int *last_token)
3974 {
3975  int token;
3976 
3977  /* Xa */
3978  token = HECMW_heclex_next_token();
3979  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3980  system->xa = HECMW_heclex_get_number();
3981  } else if(token == ',') {
3982  system->xa = 0.0;
3984  } else {
3985  set_err_token(token, HECMW_IO_HEC_E1900, "Xa required");
3986  return -1;
3987  }
3988 
3989  /* ',' */
3990  token = HECMW_heclex_next_token();
3991  if(token != ',') {
3992  set_err_token(token, HECMW_IO_HEC_E1900, "',' required after Xa");
3993  return -1;
3994  }
3995 
3996  /* Ya */
3997  token = HECMW_heclex_next_token();
3998  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
3999  system->ya = HECMW_heclex_get_number();
4000  } else if(token == ',') {
4001  system->ya = 0.0;
4003  } else {
4004  set_err_token(token, HECMW_IO_HEC_E1900, "Ya required");
4005  return -1;
4006  }
4007 
4008  /* ',' */
4009  token = HECMW_heclex_next_token();
4010  if(token != ',') {
4011  set_err_token(token, HECMW_IO_HEC_E1900, "',' required after Ya");
4012  return -1;
4013  }
4014 
4015  /* Za */
4016  token = HECMW_heclex_next_token();
4017  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
4018  system->za = HECMW_heclex_get_number();
4019  } else if(token == ',' || token == HECMW_HECLEX_NL) {
4020  system->za = 0.0;
4022  } else {
4023  set_err_token(token, HECMW_IO_HEC_E1900, "Za required");
4024  return -1;
4025  }
4026 
4027  /* ',' or NL */
4028  token = HECMW_heclex_next_token();
4029  if(token != ',' && token != HECMW_HECLEX_NL) {
4030  set_err_token(token, HECMW_IO_HEC_E1900, "',' or NL required after Za");
4031  return -1;
4032  }
4033  *last_token = token;
4034 
4035  return 0;
4036 }
4037 
4038 
4039 static int
4040 read_system_data_line1b(struct hecmw_system_param *system)
4041 {
4042  int token;
4043 
4044  /* Xb */
4045  token = HECMW_heclex_next_token();
4046  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
4047  system->xb = HECMW_heclex_get_number();
4048  } else if(token == ',') {
4049  system->xb = 0.0;
4051  } else {
4052  set_err_token(token, HECMW_IO_HEC_E1900, "Xb required");
4053  return -1;
4054  }
4055 
4056  /* ',' */
4057  token = HECMW_heclex_next_token();
4058  if(token != ',') {
4059  set_err_token(token, HECMW_IO_HEC_E1900, "',' required after Xb");
4060  return -1;
4061  }
4062 
4063  /* Yb */
4064  token = HECMW_heclex_next_token();
4065  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
4066  system->yb = HECMW_heclex_get_number();
4067  } else if(token == ',') {
4068  system->yb = 0.0;
4070  } else {
4071  set_err_token(token, HECMW_IO_HEC_E1900, "Yb required");
4072  return -1;
4073  }
4074 
4075  /* ',' */
4076  token = HECMW_heclex_next_token();
4077  if(token != ',') {
4078  set_err_token(token, HECMW_IO_HEC_E1900, "',' required after Yb");
4079  return -1;
4080  }
4081 
4082  /* Zb */
4083  token = HECMW_heclex_next_token();
4084  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
4085  system->zb = HECMW_heclex_get_number();
4086  } else if(token == HECMW_HECLEX_NL) {
4087  system->zb = 0.0;
4089  } else {
4090  set_err_token(token, HECMW_IO_HEC_E1900, "Zb required");
4091  return -1;
4092  }
4093 
4094  /*NL */
4095  token = HECMW_heclex_next_token();
4096  if(token != HECMW_HECLEX_NL) {
4097  set_err_token(token, HECMW_IO_HEC_E1900, "NL required after Zb");
4098  return -1;
4099  }
4100 
4101  return 0;
4102 }
4103 
4104 
4105 static int
4106 read_system_data_line2(struct hecmw_system_param *system)
4107 {
4108  int token;
4109 
4110  /* Xc */
4111  token = HECMW_heclex_next_token();
4112  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
4113  system->xc = HECMW_heclex_get_number();
4114  } else if(token == ',') {
4115  system->xc = 0.0;
4117  } else {
4118  set_err_token(token, HECMW_IO_HEC_E1900, "Xc required");
4119  return -1;
4120  }
4121 
4122  /* ',' */
4123  token = HECMW_heclex_next_token();
4124  if(token != ',') {
4125  set_err_token(token, HECMW_IO_HEC_E1900, "',' required after Xc");
4126  return -1;
4127  }
4128 
4129  /* Yc */
4130  token = HECMW_heclex_next_token();
4131  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
4132  system->yc = HECMW_heclex_get_number();
4133  } else if(token == ',') {
4134  system->yc = 0.0;
4136  } else {
4137  set_err_token(token, HECMW_IO_HEC_E1900, "Yc required");
4138  return -1;
4139  }
4140 
4141  /* ',' */
4142  token = HECMW_heclex_next_token();
4143  if(token != ',') {
4144  set_err_token(token, HECMW_IO_HEC_E1900, "',' required after Yc");
4145  return -1;
4146  }
4147 
4148  /* Zc */
4149  token = HECMW_heclex_next_token();
4150  if(token == HECMW_HECLEX_DOUBLE || token == HECMW_HECLEX_INT) {
4151  system->zc = HECMW_heclex_get_number();
4152  } else if(token == HECMW_HECLEX_NL) {
4153  system->zc = 0.0;
4155  } else {
4156  set_err_token(token, HECMW_IO_HEC_E1900, "Zc required");
4157  return -1;
4158  }
4159 
4160  /* NL */
4161  token = HECMW_heclex_next_token();
4162  if(token != HECMW_HECLEX_NL) {
4163  set_err_token(token, HECMW_IO_HEC_E1900, "NL required after Zc");
4164  return -1;
4165  }
4166 
4167  return 0;
4168 }
4169 
4170 
4171 static int
4172 read_system(void)
4173 {
4174  int token,state;
4175  struct hecmw_system_param *system;
4176  enum {
4177  ST_FINISHED,
4178  ST_HEADER_LINE,
4179  ST_DATA_LINE1,
4180  ST_DATA_LINE2
4181  };
4182 
4183  system = HECMW_malloc(sizeof(*system));
4184  if(system == NULL) {
4185  HECMW_set_error(errno, "");
4186  return -1;
4187  }
4188 
4189  /* default values */
4190  system->xa = 0.0;
4191  system->ya = 0.0;
4192  system->za = 0.0;
4193  system->xb = 0.0;
4194  system->yb = 0.0;
4195  system->zb = 0.0;
4196  system->xc = 0.0;
4197  system->yc = 0.0;
4198  system->zc = 0.0;
4199 
4200  state = ST_HEADER_LINE;
4201  while(state != ST_FINISHED) {
4202  if(state == ST_HEADER_LINE) {
4203  if(read_system_head()) return -1;
4204  /* check next state */
4205  token = HECMW_heclex_next_token();
4206  if(token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT && token != ',') {
4207  /* clear !SYSTEM */
4208  HECMW_free(system);
4209  system = NULL;
4210  state = ST_FINISHED;
4211  } else {
4212  state = ST_DATA_LINE1;
4213  }
4215  } else if(state == ST_DATA_LINE1) {
4216  if(read_system_data_line1a(system, &token)) return -1;
4217  if(token == HECMW_HECLEX_NL) {
4218  state = ST_FINISHED;
4219  continue;
4220  }
4221  HECMW_assert(token == ',');
4222 
4223  if(read_system_data_line1b(system)) return -1;
4224  token = HECMW_heclex_next_token();
4225  if(token != HECMW_HECLEX_DOUBLE && token != HECMW_HECLEX_INT && token != ',') {
4226  state = ST_FINISHED;
4227  } else {
4228  state = ST_DATA_LINE2;
4229  }
4231  } else if(state == ST_DATA_LINE2) {
4232  if(read_system_data_line2(system)) return -1;
4233  state = ST_FINISHED;
4234  } else {
4235  HECMW_assert(0);
4236  }
4237  }
4238 
4239  /* set */
4240  HECMW_io_set_system(system);
4241 
4242  HECMW_log(HECMW_LOG_DEBUG, "read_system done");
4243  return 0;
4244 }
4245 #endif
4246 
4247 /*----------------------------------------------------------------------------*/
4248 
4249 static int read_zero(void) {
4250  int token;
4251  double zero;
4252  struct hecmw_io_zero *new_zero;
4253 
4254  /* !ZERO */
4255  token = HECMW_heclex_next_token();
4256  if (token != HECMW_HECLEX_H_ZERO) {
4257  set_err_token(token, HECMW_IO_HEC_E2000, "!ZERO required");
4258  return -1;
4259  }
4260 
4261  /* NL */
4262  token = HECMW_heclex_next_token();
4263  if (token != HECMW_HECLEX_NL) {
4264  set_err_token(token, HECMW_IO_HEC_E2000, "NL reqyured after !ZERO");
4265  return -1;
4266  }
4267 
4268  /* ZERO */
4269  token = HECMW_heclex_next_token();
4270  if (token != HECMW_HECLEX_INT && token != HECMW_HECLEX_DOUBLE) {
4271  set_err_token(token, HECMW_IO_HEC_E2000, "ZERO required");
4272  return -1;
4273  }
4275 
4276  /* NL */
4277  token = HECMW_heclex_next_token();
4278  if (token != HECMW_HECLEX_NL) {
4279  set_err_token(token, HECMW_IO_HEC_E2000, "NL reqyured after ZERO");
4280  return -1;
4281  }
4282 
4283  new_zero = HECMW_malloc(sizeof(*new_zero));
4284  if (new_zero == NULL) {
4285  HECMW_set_error(errno, "");
4286  return -1;
4287  }
4288  new_zero->zero = zero;
4289 
4290  /* set */
4291  HECMW_io_set_zero(new_zero);
4292 
4293  HECMW_log(HECMW_LOG_DEBUG, "read_zero done");
4294  return 0;
4295 }
4296 
4297 /*----------------------------------------------------------------------------*/
4298 
4299 static int read_connectivity(void) {
4300  int token, type;
4301 
4302  /* !CONNECTIVITY */
4303  token = HECMW_heclex_next_token();
4304  if (token != HECMW_HECLEX_H_CONNECTIVITY) {
4305  set_err_token(token, HECMW_IO_HEC_E0200, "!CONNECTIVITY required");
4306  return -1;
4307  }
4308 
4309  /* , or NL */
4310  token = HECMW_heclex_next_token();
4311  if (token != ',' && token != HECMW_HECLEX_NL) {
4312  set_err_token(token, HECMW_IO_HEC_E0200,
4313  "',' or NL reqyured after !CONNECTIVITY");
4314  return -1;
4315  }
4316  if (token == HECMW_HECLEX_NL) {
4317  connectivity_type = HECMW_CONNTYPE_HECMW; /* set default value */
4318  return 0;
4319  }
4320 
4321  /* TYPE */
4322  token = HECMW_heclex_next_token();
4323  if (token != HECMW_HECLEX_K_TYPE) {
4324  set_err_token(token, HECMW_IO_HEC_E0200, "TYPE required");
4325  return -1;
4326  }
4327 
4328  /* = */
4329  token = HECMW_heclex_next_token();
4330  if (token != '=') {
4331  set_err_token(token, HECMW_IO_HEC_E0200, "'=' reqyured after TYPE");
4332  return -1;
4333  }
4334 
4335  /* TYPE value */
4336  token = HECMW_heclex_next_token();
4337  switch (token) {
4338  case HECMW_HECLEX_K_HECMW:
4339  type = HECMW_CONNTYPE_HECMW;
4340  break;
4341  case HECMW_HECLEX_K_ABAQUS:
4342  type = HECMW_CONNTYPE_ABAQUS;
4343  break;
4345  type = HECMW_CONNTYPE_NASTRAN;
4346  break;
4347  default:
4348  set_err_token(token, HECMW_IO_HEC_E0200, "Unsupported connectivity TYPE");
4349  return -1;
4350  }
4351 
4352  /* NL */
4353  token = HECMW_heclex_next_token();
4354  if (token != HECMW_HECLEX_NL) {
4355  set_err_token(token, HECMW_IO_HEC_E0200, "NL reqyured after TYPE value");
4356  return -1;
4357  }
4358 
4359  connectivity_type = type;
4360 
4361  HECMW_log(HECMW_LOG_DEBUG, "read_connectivity done");
4362  return 0;
4363 }
4364 
4365 /*------------------------------------------------------------------------------
4366  ReadFunc table
4367 */
4368 
4369 typedef int (*ReadFunc)(void);
4370 
4371 static struct read_func_table {
4372  int token;
4373  ReadFunc func;
4374 } read_func_table[] = {
4375  {HECMW_HECLEX_H_AMPLITUDE, read_amplitude},
4376  {HECMW_HECLEX_H_CONNECTIVITY, read_connectivity},
4377  {HECMW_HECLEX_H_CONTACT_PAIR, read_contact_pair},
4378  {HECMW_HECLEX_H_EMBED_PAIR, read_contact_pair},
4379  /* { HECMW_HECLEX_H_ECOPY, read_ecopy }, */
4380  /* { HECMW_HECLEX_H_EGEN, read_egen }, */
4381  {HECMW_HECLEX_H_EGROUP, read_egroup},
4382  {HECMW_HECLEX_H_ELEMENT, read_element},
4383  {HECMW_HECLEX_H_EQUATION, read_equation},
4384  {HECMW_HECLEX_H_HEADER, read_header},
4385  {HECMW_HECLEX_H_INCLUDE, read_include},
4386  {HECMW_HECLEX_H_INITIAL, read_initial},
4387  {HECMW_HECLEX_H_MATERIAL, read_material},
4388  /* { HECMW_HECLEX_H_NCOPY, read_ncopy }, */
4389  /* { HECMW_HECLEX_H_NFILL, read_nfill }, */
4390  /* { HECMW_HECLEX_H_NGEN, read_ngen }, */
4391  {HECMW_HECLEX_H_NGROUP, read_ngroup},
4392  {HECMW_HECLEX_H_NODE, read_node},
4393  {HECMW_HECLEX_H_SECTION, read_section},
4394  {HECMW_HECLEX_H_SGROUP, read_sgroup},
4395  /* { HECMW_HECLEX_H_SYSTEM, read_system }, */
4396  {HECMW_HECLEX_H_ZERO, read_zero},
4397 };
4398 
4399 #define N_READ_FUNC (sizeof(read_func_table) / sizeof(read_func_table[0]))
4400 
4401 /* static int (* get_read_func(int token))(void) */
4402 static ReadFunc get_read_func(int token) {
4403  int i;
4404 
4405  for (i = 0; i < N_READ_FUNC; i++) {
4406  if (token == read_func_table[i].token) {
4407  return read_func_table[i].func;
4408  }
4409  }
4410  return NULL;
4411 }
4412 
4413 static int parse(void) {
4414  int token;
4415  ReadFunc func;
4416 
4417  while ((token = HECMW_heclex_next_token())) {
4418  if (token == HECMW_HECLEX_NL) continue;
4419  if (token == HECMW_HECLEX_H_END) {
4420  /* stop reading */
4421  return 0;
4422  }
4423  func = get_read_func(token);
4424  if (func == NULL) {
4425  char *p = HECMW_heclex_get_text();
4426  if (p[0] == '!') {
4427  set_err(HECMW_IO_HEC_E0099, "");
4428  } else {
4429  set_err(HECMW_IO_HEC_E0098, "");
4430  }
4431  return -1;
4432  }
4433  HECMW_heclex_unput_token(); /* unput !XXXX */
4434  if ((*func)()) return -1;
4435  }
4436  return 0;
4437 }
4438 
4439 /* read only. Not make hecmwST_local_mesh */
4440 int HECMW_read_entire_mesh(const char *filename) {
4441  FILE *fp;
4442 
4443  HECMW_log(HECMW_LOG_DEBUG, "Start to read HECMW-ENTIRE mesh");
4444 
4445  if (filename == NULL) {
4448  "Not specified filename for HECMW-ENTIRE mesh input routine");
4449  return -1;
4450  }
4451  HECMW_log(HECMW_LOG_DEBUG, "HECMW-ENTIRE mesh file is '%s'", filename);
4452 
4453  if (strlen(filename) > HECMW_FILENAME_LEN) {
4455  return -1;
4456  }
4457 
4458  strcpy(grid_filename, filename);
4459  HECMW_io_set_gridfile(grid_filename);
4460 
4461  if ((fp = fopen(filename, "r")) == NULL) {
4462  HECMW_set_error(HECMW_IO_HEC_E0001, "File: %s, %s", filename,
4463  strerror(errno));
4464  return -1;
4465  }
4466 
4467  if (HECMW_heclex_set_input(fp)) return -1;
4468 
4469  HECMW_log(HECMW_LOG_DEBUG, "Parsing...");
4470  if (parse()) {
4471  return -1;
4472  }
4473 
4474  if (fclose(fp)) {
4475  HECMW_set_error(HECMW_IO_HEC_E0002, "File: %s, %s", filename,
4476  strerror(errno));
4477  return -1;
4478  }
4479 
4480  strcpy(grid_filename, "Unknown");
4481 
4482  return 0;
4483 }
4484 
4485 struct hecmwST_local_mesh *HECMW_get_entire_mesh(const char *filename) {
4486  struct hecmwST_local_mesh *local_mesh;
4487 
4488  if (HECMW_io_init()) return NULL;
4489  if (HECMW_io_pre_process()) return NULL;
4490  if (HECMW_read_entire_mesh(filename)) return NULL;
4491  if (HECMW_io_post_process()) return NULL;
4492  local_mesh = HECMW_io_make_local_mesh();
4493  if (local_mesh == NULL) return NULL;
4494  if (HECMW_io_finalize()) return NULL;
4495 
4496  strcpy(grid_filename, "Unknown");
4497 
4498  return local_mesh;
4499 }
HECMW_Comm HECMW_comm_get_comm(void)
Definition: hecmw_comm.c:751
#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_HEADER_LEN
Definition: hecmw_config.h:70
#define HECMW_NAME_LEN
Definition: hecmw_config.h:72
int HECMW_convert_connectivity(int from, int hecmw_etype, int *conn)
#define HECMW_CONNTYPE_ABAQUS
#define HECMW_CONNTYPE_NASTRAN
#define HECMW_CONNTYPE_HECMW
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
int HECMW_cylindrical_to_cartesian(const struct hecmw_coord *coord, struct hecmw_coord *result)
double HECMW_degree_to_radian(double deg)
char * HECMW_heclex_get_text(void)
int HECMW_heclex_next_token(void)
double HECMW_heclex_get_number(void)
int HECMW_heclex_switch_to_include(const char *filename)
int HECMW_heclex_unput_token(void)
int HECMW_heclex_get_lineno(void)
int HECMW_heclex_set_input(FILE *fp)
@ HECMW_HECLEX_K_SURF_SURF
Definition: hecmw_heclex.h:70
@ HECMW_HECLEX_K_GENERATE
Definition: hecmw_heclex.h:50
@ HECMW_HECLEX_H_EGROUP
Definition: hecmw_heclex.h:25
@ HECMW_HECLEX_H_ELEMENT
Definition: hecmw_heclex.h:26
@ HECMW_HECLEX_K_INPUT
Definition: hecmw_heclex.h:52
@ HECMW_HECLEX_K_TABULAR
Definition: hecmw_heclex.h:73
@ HECMW_HECLEX_K_SHELL
Definition: hecmw_heclex.h:66
@ HECMW_HECLEX_H_EMBED_PAIR
Definition: hecmw_heclex.h:22
@ HECMW_HECLEX_K_TYPE
Definition: hecmw_heclex.h:76
@ HECMW_HECLEX_H_EQUATION
Definition: hecmw_heclex.h:28
@ HECMW_HECLEX_K_SYSTEM
Definition: hecmw_heclex.h:71
@ HECMW_HECLEX_K_COMPOSITE
Definition: hecmw_heclex.h:47
@ HECMW_HECLEX_DOUBLE
Definition: hecmw_heclex.h:14
@ HECMW_HECLEX_INT
Definition: hecmw_heclex.h:13
@ HECMW_HECLEX_K_ABAQUS
Definition: hecmw_heclex.h:44
@ HECMW_HECLEX_H_ZERO
Definition: hecmw_heclex.h:42
@ HECMW_HECLEX_H_ITEM
Definition: hecmw_heclex.h:32
@ HECMW_HECLEX_K_BEAM
Definition: hecmw_heclex.h:46
@ HECMW_HECLEX_FILENAME
Definition: hecmw_heclex.h:16
@ HECMW_HECLEX_K_SUBITEM
Definition: hecmw_heclex.h:69
@ HECMW_HECLEX_K_VALUE
Definition: hecmw_heclex.h:77
@ HECMW_HECLEX_K_DEFINITION
Definition: hecmw_heclex.h:48
@ HECMW_HECLEX_H_NODE
Definition: hecmw_heclex.h:38
@ HECMW_HECLEX_K_EGRP
Definition: hecmw_heclex.h:49
@ HECMW_HECLEX_K_MATERIAL
Definition: hecmw_heclex.h:55
@ HECMW_HECLEX_H_END
Definition: hecmw_heclex.h:27
@ HECMW_HECLEX_K_SOLID
Definition: hecmw_heclex.h:67
@ HECMW_HECLEX_H_CONNECTIVITY
Definition: hecmw_heclex.h:20
@ HECMW_HECLEX_H_NGROUP
Definition: hecmw_heclex.h:37
@ HECMW_HECLEX_K_ABSOLUTE
Definition: hecmw_heclex.h:45
@ HECMW_HECLEX_K_RELATIVE
Definition: hecmw_heclex.h:62
@ HECMW_HECLEX_K_HECMW
Definition: hecmw_heclex.h:51
@ HECMW_HECLEX_H_INITIAL
Definition: hecmw_heclex.h:31
@ HECMW_HECLEX_K_NGRP
Definition: hecmw_heclex.h:59
@ HECMW_HECLEX_K_NAME
Definition: hecmw_heclex.h:57
@ HECMW_HECLEX_K_NASTRAN
Definition: hecmw_heclex.h:58
@ HECMW_HECLEX_H_MATERIAL
Definition: hecmw_heclex.h:33
@ HECMW_HECLEX_K_NODE_SURF
Definition: hecmw_heclex.h:60
@ HECMW_HECLEX_HEADER
Definition: hecmw_heclex.h:17
@ HECMW_HECLEX_K_SECOPT
Definition: hecmw_heclex.h:63
@ HECMW_HECLEX_H_AMPLITUDE
Definition: hecmw_heclex.h:19
@ HECMW_HECLEX_H_CONTACT_PAIR
Definition: hecmw_heclex.h:21
@ HECMW_HECLEX_NL
Definition: hecmw_heclex.h:12
@ HECMW_HECLEX_K_INTERFACE
Definition: hecmw_heclex.h:53
@ HECMW_HECLEX_K_STEP_TIME
Definition: hecmw_heclex.h:68
@ HECMW_HECLEX_H_INCLUDE
Definition: hecmw_heclex.h:30
@ HECMW_HECLEX_K_ITEM
Definition: hecmw_heclex.h:54
@ HECMW_HECLEX_H_SECTION
Definition: hecmw_heclex.h:39
@ HECMW_HECLEX_K_NODE_ELEM
Definition: hecmw_heclex.h:61
@ HECMW_HECLEX_K_SGRP
Definition: hecmw_heclex.h:65
@ HECMW_HECLEX_H_SGROUP
Definition: hecmw_heclex.h:40
@ HECMW_HECLEX_H_SYSTEM
Definition: hecmw_heclex.h:41
@ HECMW_HECLEX_NAME
Definition: hecmw_heclex.h:15
@ HECMW_HECLEX_K_TEMPERATURE
Definition: hecmw_heclex.h:74
@ HECMW_HECLEX_H_HEADER
Definition: hecmw_heclex.h:29
@ HECMW_HECLEX_K_MATITEM
Definition: hecmw_heclex.h:56
@ HECMW_HECLEX_K_TIME
Definition: hecmw_heclex.h:75
@ HECMW_HECLEX_K_TIMEVALUE
Definition: hecmw_heclex.h:78
int HECMW_heclex_is_including(void)
int HECMW_read_entire_mesh(const char *filename)
struct hecmwST_local_mesh * HECMW_get_entire_mesh(const char *filename)
int(* ReadFunc)(void)
#define N_READ_FUNC
struct hecmw_io_mpc * HECMW_io_add_mpc(int neq, const struct hecmw_io_mpcitem *mpcitem, double cnst)
int HECMW_io_check_mpc_dof(int dof)
int HECMW_io_is_reserved_name(const char *name)
int HECMW_io_add_ngrp(const char *name, int nnode, int *node)
struct hecmw_io_section * HECMW_io_add_sect(struct hecmw_io_section *sect)
int HECMW_io_add_sgrp(const char *name, int n_item, int *elem, int *surf)
struct hecmw_io_amplitude * HECMW_io_add_amp(const char *name, int definition, int time, int value, double val, double t)
int HECMW_io_add_egrp(const char *name, int nelem, int *elem)
struct hecmw_io_initial * HECMW_io_add_initial(int type, int node, const char *ngrp, double val)
struct hecmw_io_contact * HECMW_io_add_contact(const char *name, int type, const char *slave_grp, const char *master_grp)
struct hecmw_io_material * HECMW_io_add_mat(const char *name, struct hecmw_io_material *mat)
struct hecmwST_local_mesh * HECMW_io_make_local_mesh(void)
void HECMW_io_set_zero(struct hecmw_io_zero *zero)
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)
void HECMW_io_set_system(struct hecmw_system_param *system)
struct hecmw_io_node * HECMW_io_add_node(int id, double x, double y, double z)
int HECMW_io_post_process(void)
struct hecmw_io_material * HECMW_io_get_mat(const char *name)
int HECMW_io_set_gridfile(char *gridfile)
int HECMW_io_finalize(void)
struct hecmw_system_param * HECMW_io_get_system(void)
void HECMW_io_set_header(struct hecmw_io_header *header)
#define NULL
#define HECMW_INITIAL_TYPE_TEMPERATURE
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_strdup(s)
Definition: hecmw_malloc.h:23
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
#define HECMW_IO_HEC_E0002
Definition: hecmw_msgno.h:191
#define HECMW_IO_HEC_E0600
Definition: hecmw_msgno.h:204
#define HECMW_IO_HEC_E1106
Definition: hecmw_msgno.h:227
#define HECMW_IO_HEC_E0601
Definition: hecmw_msgno.h:205
#define HECMW_IO_HEC_E0604
Definition: hecmw_msgno.h:208
#define HECMW_IO_HEC_E2000
Definition: hecmw_msgno.h:252
#define HECMW_IO_HEC_E0900
Definition: hecmw_msgno.h:216
#define HECMW_IO_HEC_E2101
Definition: hecmw_msgno.h:254
#define HECMW_IO_HEC_E1500
Definition: hecmw_msgno.h:232
#define HECMW_IO_HEC_E1104
Definition: hecmw_msgno.h:225
#define HECMW_IO_HEC_E1100
Definition: hecmw_msgno.h:221
#define HECMW_IO_HEC_E1700
Definition: hecmw_msgno.h:238
#define HECMW_IO_HEC_E1800
Definition: hecmw_msgno.h:249
#define HECMW_IO_HEC_E1709
Definition: hecmw_msgno.h:247
#define HECMW_IO_HEC_E1105
Definition: hecmw_msgno.h:226
#define HECMW_IO_HEC_E1001
Definition: hecmw_msgno.h:219
#define HECMW_IO_HEC_E0701
Definition: hecmw_msgno.h:212
#define HECMW_IO_HEC_E0702
Definition: hecmw_msgno.h:213
#define HECMW_IO_HEC_E0001
Definition: hecmw_msgno.h:190
#define HECMW_IO_HEC_E1103
Definition: hecmw_msgno.h:224
#define HECMW_IO_HEC_E1710
Definition: hecmw_msgno.h:248
#define HECMW_IO_HEC_E0098
Definition: hecmw_msgno.h:193
#define HECMW_IO_HEC_E2100
Definition: hecmw_msgno.h:253
#define HECMW_IO_HEC_E1702
Definition: hecmw_msgno.h:240
#define HECMW_IO_HEC_E0703
Definition: hecmw_msgno.h:214
#define HECMW_IO_HEC_E0003
Definition: hecmw_msgno.h:192
#define HECMW_IO_HEC_E1708
Definition: hecmw_msgno.h:246
#define HECMW_IO_HEC_E1704
Definition: hecmw_msgno.h:242
#define HECMW_IO_HEC_E0606
Definition: hecmw_msgno.h:210
#define HECMW_IO_HEC_E1900
Definition: hecmw_msgno.h:251
#define HECMW_IO_HEC_E0800
Definition: hecmw_msgno.h:215
#define HECMW_IO_HEC_E1706
Definition: hecmw_msgno.h:244
#define HECMW_IO_HEC_E1502
Definition: hecmw_msgno.h:234
#define HECMW_IO_HEC_E1707
Definition: hecmw_msgno.h:245
#define HECMW_IO_HEC_E0099
Definition: hecmw_msgno.h:194
#define HECMW_IO_HEC_E0100
Definition: hecmw_msgno.h:195
#define HECMW_IO_HEC_E0602
Definition: hecmw_msgno.h:206
#define HECMW_IO_E0003
Definition: hecmw_msgno.h:139
#define HECMW_IO_HEC_E1000
Definition: hecmw_msgno.h:218
#define HECMW_IO_HEC_E1703
Definition: hecmw_msgno.h:241
#define HECMW_IO_HEC_E1002
Definition: hecmw_msgno.h:220
#define HECMW_IO_HEC_E1107
Definition: hecmw_msgno.h:228
#define HECMW_IO_HEC_E0502
Definition: hecmw_msgno.h:202
#define HECMW_IO_E0002
Definition: hecmw_msgno.h:138
#define HECMW_IO_HEC_E1102
Definition: hecmw_msgno.h:223
#define HECMW_IO_HEC_E0501
Definition: hecmw_msgno.h:201
#define HECMW_IO_HEC_E0901
Definition: hecmw_msgno.h:217
#define HECMW_IO_HEC_E1801
Definition: hecmw_msgno.h:250
#define HECMW_IO_HEC_E1501
Definition: hecmw_msgno.h:233
#define HECMW_IO_HEC_E0500
Definition: hecmw_msgno.h:200
#define HECMW_IO_HEC_E0200
Definition: hecmw_msgno.h:197
#define HECMW_IO_HEC_E1101
Definition: hecmw_msgno.h:222
#define HECMW_IO_HEC_E0700
Definition: hecmw_msgno.h:211
#define HECMW_IO_HEC_E1503
Definition: hecmw_msgno.h:235
#define HECMW_IO_HEC_E1600
Definition: hecmw_msgno.h:236
#define HECMW_IO_HEC_E1601
Definition: hecmw_msgno.h:237
#define HECMW_IO_HEC_E1705
Definition: hecmw_msgno.h:243
#define HECMW_IO_E0001
Definition: hecmw_msgno.h:137
#define HECMW_IO_HEC_E0503
Definition: hecmw_msgno.h:203
#define HECMW_IO_HEC_E0603
Definition: hecmw_msgno.h:207
#define HECMW_IO_HEC_E0101
Definition: hecmw_msgno.h:196
#define HECMW_IO_HEC_E1701
Definition: hecmw_msgno.h:239
char * HECMW_dirname(const char *path)
Definition: hecmw_path.c:167
int HECMW_get_path_separator(void)
Definition: hecmw_path.c:34
int HECMW_is_absolute_path(const char *path)
Definition: hecmw_path.c:45
#define HECMW_AMP_TYPEDEF_TABULAR
Definition: hecmw_struct.h:62
#define HECMW_SECT_TYPE_SOLID
Definition: hecmw_struct.h:15
#define HECMW_SECT_OPT_PSTRAIN
Definition: hecmw_struct.h:22
#define HECMW_SECT_TYPE_SHELL
Definition: hecmw_struct.h:16
#define HECMW_SECT_TYPE_INTERFACE
Definition: hecmw_struct.h:18
#define HECMW_SECT_OPT_ASYMMETRY_RI
Definition: hecmw_struct.h:26
#define HECMW_CONTACT_TYPE_NODE_SURF
Definition: hecmw_struct.h:125
#define HECMW_SECT_OPT_PSTRESS
Definition: hecmw_struct.h:21
#define HECMW_CONTACT_TYPE_NODE_ELEM
Definition: hecmw_struct.h:127
#define HECMW_AMP_TYPEVAL_RELATIVE
Definition: hecmw_struct.h:68
#define HECMW_AMP_TYPEVAL_ABSOLUTE
Definition: hecmw_struct.h:69
#define HECMW_CONTACT_TYPE_SURF_SURF
Definition: hecmw_struct.h:126
#define HECMW_SECT_OPT_ASYMMETRY
Definition: hecmw_struct.h:23
#define HECMW_SECT_TYPE_BEAM
Definition: hecmw_struct.h:17
#define HECMW_AMP_TYPETIME_STEP
Definition: hecmw_struct.h:65
#define HECMW_SECT_OPT_PSTRAIN_RI
Definition: hecmw_struct.h:25
#define HECMW_SECT_OPT_PSTRESS_RI
Definition: hecmw_struct.h:24
int HECMW_system(struct hecmw_system_param *param, struct hecmw_coord *coord, struct hecmw_coord *result)
Definition: hecmw_system.c:12
void HECMW_abort(HECMW_Comm comm)
Definition: hecmw_util.c:88
char * HECMW_toupper(char *s)
Definition: hecmw_util.c:102
void HECMW_print_msg(int loglv, int msgno, const char *fmt,...)
Definition: hecmw_util.c:138
int HECMW_snprintf(char *str, size_t size, const char *format,...)
Definition: hecmw_util.c:153
int HECMW_vsnprintf(char *str, size_t size, const char *format, va_list ap)
Definition: hecmw_util.c:145
#define HECMW_assert(cond)
Definition: hecmw_util.h:40
Separator_result * separator
Definition: matrix_repart.c:16
char header[HECMW_HEADER_LEN+1]
struct hecmw_io_id * next
struct hecmw_io_material * next
struct hecmw_io_material::hecmw_io_matitem * item
char name[HECMW_NAME_LEN+1]
char egrp[HECMW_NAME_LEN+1]
union hecmw_io_section::hecmw_io_section_item sect
char material[HECMW_NAME_LEN+1]