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