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