FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_control.c
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <errno.h>
10 #include <ctype.h>
11 #include <dirent.h>
12 #include <sys/stat.h>
13 #include <sys/types.h>
14 #include "hecmw_util.h"
15 #include "hecmw_control.h"
16 #include "hecmw_ctrllex.h"
17 #include "hecmw_path.h"
18 
19 static char ctrl_filename[HECMW_FILENAME_LEN + 1];
20 
21 static int table_entire_mesh[] = {
25 };
26 
27 struct mesh_entry {
28  char *name_ID;
29  int type;
30  int io;
31  int refine;
32  char *filename;
33  struct mesh_entry *next;
34 };
35 
37  char *name_ID;
38  int n_mesh;
39  struct mesh_entry **mesh;
41 };
42 
43 struct restart_entry {
44  char *name_ID;
45  int io;
46  /*#define HECMW_CTRL_FILE_IO_IN 1*/
47  /*#define HECMW_CTRL_FILE_IO_OUT 2*/
48  /* #define HECMW_CTRL_FILE_IO_INOUT 4 */
49  char *filename;
51 };
52 
53 struct result_entry {
54  char *name_ID;
55  int io;
56  /*#define HECMW_CTRL_FILE_IO_IN 1*/
57  /*#define HECMW_CTRL_FILE_IO_OUT 2*/
58  int fg_text; /* 1:text(default), 0:binary */
59  char *filename;
60  struct result_entry *next;
61 };
62 
63 struct ctrl_entry {
64  char *name_ID;
65  char *filename;
66  struct ctrl_entry *next;
67 };
68 
69 static int subdir_on = 0;
70 
71 static int nlimit;
72 
73 static struct ctrl_entry *ctrl_ent;
74 
75 static struct mesh_entry *mesh_ent;
76 
77 static struct mesh_grp_entry *mesh_grp_ent;
78 
79 static struct restart_entry *restart_ent;
80 
81 static struct result_entry *result_ent;
82 
83 /*----------------------------------------------------------------------------*/
84 
85 static int is_entire_mesh(int type) {
86  int i, n;
87  n = sizeof(table_entire_mesh) / sizeof(table_entire_mesh[0]);
88 
89  for (i = 0; i < n; i++) {
90  if (table_entire_mesh[i] == type) return 1;
91  }
92 
93  return 0;
94 }
95 
96 /* return dir + subdir + prefix + file + suffix + .rank */
97 static char *make_filename(char *dir, char *subdir, char *prefix, char *file,
98  char *suffix, int myrank, int flag_rank) {
99  static char filename[HECMW_FILENAME_LEN + 1];
100  char rank[10];
101  char separator[10];
102  size_t len = 0;
103 
104  filename[0] = '\0';
105  snprintf(separator, sizeof(separator), "%c", HECMW_get_path_separator());
106 
107  if (dir && strlen(dir) > 0) {
108  if ((strlen(dir) + strlen(separator)) > HECMW_FILENAME_LEN) return NULL;
109 
110  len += snprintf(filename + len, sizeof(filename) - len, "%s%s", dir,
111  separator);
112  }
113 
114  if (subdir && strlen(subdir) > 0) {
115  if ((len + strlen(subdir) + strlen(separator)) > HECMW_FILENAME_LEN)
116  return NULL;
117 
118  len += snprintf(filename + len, sizeof(filename) - len, "%s%s", subdir,
119  separator);
120  }
121 
122  if (prefix && strlen(prefix) > 0) {
123  if ((len + strlen(prefix) + strlen(separator)) > HECMW_FILENAME_LEN)
124  return NULL;
125 
126  len += snprintf(filename + len, sizeof(filename) - len, "%s%s", prefix,
127  separator);
128  }
129 
130  if ((len + strlen(file)) > HECMW_FILENAME_LEN) return NULL;
131 
132  len += snprintf(filename + len, sizeof(filename) - len, "%s", file);
133 
134  if (suffix) {
135  if ((len + strlen(suffix)) > HECMW_FILENAME_LEN) return NULL;
136 
137  len += snprintf(filename + len, sizeof(filename) - len, "%s", suffix);
138  }
139 
140  if (flag_rank) {
141  snprintf(rank, sizeof(rank), ".%d", myrank);
142 
143  if ((len + strlen(rank)) > HECMW_FILENAME_LEN) return NULL;
144 
145  len += snprintf(filename + len, sizeof(filename) - len, "%s", rank);
146  }
147 
148  return filename;
149 }
150 
151 /* return dir + subdir + prefix + file + suffix + .rank (thread-safe version) */
152 static char *make_filename_r(char *dir, char *subdir, char *prefix, char *file,
153  char *suffix, int myrank, int flag_rank,
154  char *filename, int filename_len) {
155  char rank[10];
156  char separator[10];
157  size_t flen = (size_t)filename_len;
158  size_t len = 0;
159 
161 
162  filename[0] = '\0';
163  snprintf(separator, sizeof(separator), "%c", HECMW_get_path_separator());
164 
165  if (dir && strlen(dir) > 0) {
166  if ((strlen(dir) + strlen(separator)) > flen) return NULL;
167 
168  len += snprintf(filename + len, flen + 1 - len, "%s%s", dir, separator);
169  }
170 
171  if (subdir && strlen(subdir) > 0) {
172  if ((len + strlen(subdir) + strlen(separator)) > flen) return NULL;
173 
174  len += snprintf(filename + len, flen + 1 - len, "%s%s", subdir, separator);
175  }
176 
177  if (prefix && strlen(prefix) > 0) {
178  if ((len + strlen(prefix) + strlen(separator)) > flen) return NULL;
179 
180  len += snprintf(filename + len, flen + 1 - len, "%s%s", prefix, separator);
181  }
182 
183  if ((len + strlen(file)) > flen) return NULL;
184 
185  len += snprintf(filename + len, flen + 1 - len, "%s", file);
186 
187  if (suffix) {
188  if ((len + strlen(suffix)) > flen) return NULL;
189 
190  len += snprintf(filename + len, flen + 1 - len, "%s", suffix);
191  }
192 
193  if (flag_rank) {
194  snprintf(rank, sizeof(rank), ".%d", myrank);
195 
196  if ((len + strlen(rank)) > flen) return NULL;
197 
198  len += snprintf(filename + len, flen + 1 - len, "%s", rank);
199  }
200 
201  return filename;
202 }
203 
204 /*----------------------------------------------------------------------------*/
205 
206 static void free_mesh_entry(void) {
207  struct mesh_entry *p, *q;
208 
209  for (p = mesh_ent; p; p = q) {
210  q = p->next;
211  HECMW_free(p->name_ID);
212  HECMW_free(p->filename);
213  HECMW_free(p);
214  }
215 
216  mesh_ent = NULL;
217 }
218 
219 static void free_mesh_grp_entry(void) {
220  struct mesh_grp_entry *p, *q;
221 
222  for (p = mesh_grp_ent; p; p = q) {
223  q = p->next;
224  HECMW_free(p->name_ID);
225  HECMW_free(p->mesh); /* free only mesh array */
226  HECMW_free(p);
227  }
228 
229  mesh_grp_ent = NULL;
230 }
231 
232 static void free_restart_entry(void) {
233  struct restart_entry *p, *q;
234 
235  for (p = restart_ent; p; p = q) {
236  q = p->next;
237  HECMW_free(p->name_ID);
238  HECMW_free(p->filename);
239  HECMW_free(p);
240  }
241 
242  restart_ent = NULL;
243 }
244 
245 static void free_result_entry(void) {
246  struct result_entry *p, *q;
247 
248  for (p = result_ent; p; p = q) {
249  q = p->next;
250  HECMW_free(p->name_ID);
251  HECMW_free(p->filename);
252  HECMW_free(p);
253  }
254 
255  result_ent = NULL;
256 }
257 
258 static void free_ctrl_entry(void) {
259  struct ctrl_entry *p, *q;
260 
261  for (p = ctrl_ent; p; p = q) {
262  q = p->next;
263  HECMW_free(p->name_ID);
264  HECMW_free(p->filename);
265  HECMW_free(p);
266  }
267 
268  ctrl_ent = NULL;
269 }
270 
271 /*----------------------------------------------------------------------------*/
272 
273 static struct mesh_entry *get_mesh_entry(char *name_ID) {
274  struct mesh_entry *p;
275 
276  if (name_ID == NULL) return NULL;
277 
278  for (p = mesh_ent; p; p = p->next) {
279  if (strcmp(p->name_ID, name_ID) == 0) return p;
280  }
281 
282  return NULL;
283 }
284 
285 static struct mesh_grp_entry *get_mesh_grp_entry(char *name_ID) {
286  struct mesh_grp_entry *p;
287 
288  if (name_ID == NULL) return NULL;
289 
290  for (p = mesh_grp_ent; p; p = p->next) {
291  if (strcmp(p->name_ID, name_ID) == 0) return p;
292  }
293 
294  return NULL;
295 }
296 
297 static struct restart_entry *get_restart_entry(char *name_ID) {
298  struct restart_entry *p;
299 
300  if (name_ID == NULL) return NULL;
301 
302  for (p = restart_ent; p; p = p->next) {
303  if (strcmp(p->name_ID, name_ID) == 0) return p;
304  }
305 
306  return NULL;
307 }
308 
309 static struct restart_entry *get_restart_entry_by_io(int io) {
310  struct restart_entry *p;
311 
312  for (p = restart_ent; p; p = p->next) {
313  if (p->io & io) return p; /* attention!! arg io is bitmap */
314  }
315 
316  return NULL;
317 }
318 
319 static struct result_entry *get_result_entry(char *name_ID) {
320  struct result_entry *p;
321 
322  if (name_ID == NULL) return NULL;
323 
324  for (p = result_ent; p; p = p->next) {
325  if (strcmp(p->name_ID, name_ID) == 0) return p;
326  }
327 
328  return NULL;
329 }
330 
331 static struct ctrl_entry *get_ctrl_entry(char *name_ID) {
332  struct ctrl_entry *p;
333 
334  if (name_ID == NULL) return NULL;
335 
336  for (p = ctrl_ent; p; p = p->next) {
337  if (strcmp(p->name_ID, name_ID) == 0) return p;
338  }
339 
340  return NULL;
341 }
342 
343 /*----------------------------------------------------------------------------*/
344 
345 static struct mesh_entry *make_mesh_entry(char *name_ID, int type, int io,
346  int refine, char *filename) {
347  char *p;
348  struct mesh_entry *mesh = NULL;
349  mesh = HECMW_calloc(1, sizeof(*mesh));
350 
351  if (mesh == NULL) {
352  HECMW_set_error(errno, "");
353  goto error;
354  }
355 
356  mesh->type = type;
357  mesh->io = io;
358  mesh->refine = refine;
359  mesh->next = NULL;
360  p = HECMW_strdup(name_ID);
361 
362  if (p == NULL) {
363  HECMW_set_error(errno, "");
364  goto error;
365  }
366 
367  mesh->name_ID = p;
368  p = HECMW_strdup(filename);
369 
370  if (p == NULL) {
371  HECMW_set_error(errno, "");
372  goto error;
373  }
374 
375  mesh->filename = p;
376  return mesh;
377 error:
378 
379  if (mesh) {
380  HECMW_free(mesh->name_ID);
381  HECMW_free(mesh->filename);
382  HECMW_free(mesh);
383  }
384 
385  return NULL;
386 }
387 
388 static int add_mesh_entry(struct mesh_entry *mesh) {
389  struct mesh_entry *p, *q;
390  q = NULL;
391 
392  for (p = mesh_ent; p; p = (q = p)->next)
393  ;
394 
395  if (q == NULL) {
396  mesh_ent = mesh;
397 
398  } else {
399  q->next = mesh;
400  }
401 
402  return 0;
403 }
404 
405 static struct mesh_grp_entry *make_mesh_group_entry(char *name_ID, int n_mesh,
406  char **mesh) {
407  int i;
408  struct mesh_grp_entry *meshgrp = NULL;
409  meshgrp = HECMW_calloc(1, sizeof(*meshgrp));
410 
411  if (meshgrp == NULL) {
412  HECMW_set_error(errno, "");
413  goto error;
414  }
415 
416  meshgrp->name_ID = HECMW_strdup(name_ID);
417 
418  if (meshgrp->name_ID == NULL) {
419  HECMW_set_error(errno, "");
420  goto error;
421  }
422 
423  meshgrp->n_mesh = n_mesh;
424  meshgrp->mesh = HECMW_calloc(n_mesh, sizeof(*meshgrp->mesh));
425 
426  if (meshgrp->mesh == NULL) {
427  HECMW_set_error(errno, "");
428  goto error;
429  }
430 
431  for (i = 0; i < n_mesh; i++) {
432  meshgrp->mesh[i] = get_mesh_entry(mesh[i]);
433 
434  if (meshgrp->mesh[i] == NULL) goto error;
435  }
436 
437  meshgrp->next = NULL;
438  return meshgrp;
439 error:
440 
441  if (meshgrp) {
442  HECMW_free(meshgrp->name_ID);
443  HECMW_free(meshgrp->mesh);
444  HECMW_free(meshgrp);
445  }
446 
447  return NULL;
448 }
449 
450 static int add_mesh_group_entry(struct mesh_grp_entry *mesh) {
451  struct mesh_grp_entry *p, *q;
452  q = NULL;
453 
454  for (p = mesh_grp_ent; p; p = (q = p)->next)
455  ;
456 
457  if (q == NULL) {
458  mesh_grp_ent = mesh;
459 
460  } else {
461  q->next = mesh;
462  }
463 
464  return 0;
465 }
466 
467 static struct result_entry *make_result_entry(char *name_ID, int io,
468  int fg_text, char *filename) {
469  char *p;
470  struct result_entry *result = NULL;
471  result = HECMW_calloc(1, sizeof(*result));
472 
473  if (result == NULL) {
474  HECMW_set_error(errno, "");
475  goto error;
476  }
477 
478  result->io = io;
479  result->fg_text = fg_text;
480  result->next = NULL;
481  p = HECMW_strdup(name_ID);
482 
483  if (p == NULL) {
484  HECMW_set_error(errno, "");
485  goto error;
486  }
487 
488  result->name_ID = p;
489  p = HECMW_strdup(filename);
490 
491  if (p == NULL) {
492  HECMW_set_error(errno, "");
493  goto error;
494  }
495 
496  result->filename = p;
497  return result;
498 error:
499 
500  if (result) {
501  HECMW_free(result->name_ID);
502  HECMW_free(result->filename);
503  HECMW_free(result);
504  }
505 
506  return NULL;
507 }
508 
509 static int add_result_entry(struct result_entry *result) {
510  struct result_entry *p, *q;
511  q = NULL;
512 
513  for (p = result_ent; p; p = (q = p)->next)
514  ;
515 
516  if (q == NULL) {
517  result_ent = result;
518 
519  } else {
520  q->next = result;
521  }
522 
523  return 0;
524 }
525 
526 static struct restart_entry *make_restart_entry(char *name_ID, int io,
527  char *filename) {
528  char *p;
529  struct restart_entry *restart = NULL;
530  restart = HECMW_calloc(1, sizeof(*restart));
531 
532  if (restart == NULL) {
533  HECMW_set_error(errno, "");
534  goto error;
535  }
536 
537  restart->io = io;
538  restart->next = NULL;
539  p = HECMW_strdup(name_ID);
540 
541  if (p == NULL) {
542  HECMW_set_error(errno, "");
543  goto error;
544  }
545 
546  restart->name_ID = p;
547  p = HECMW_strdup(filename);
548 
549  if (p == NULL) {
550  HECMW_set_error(errno, "");
551  goto error;
552  }
553 
554  restart->filename = p;
555  return restart;
556 error:
557 
558  if (restart) {
559  HECMW_free(restart->name_ID);
560  HECMW_free(restart->filename);
561  HECMW_free(restart);
562  }
563 
564  return NULL;
565 }
566 
567 static int add_restart_entry(struct restart_entry *restart) {
568  struct restart_entry *p, *q;
569  q = NULL;
570 
571  for (p = restart_ent; p; p = (q = p)->next)
572  ;
573 
574  if (q == NULL) {
575  restart_ent = restart;
576 
577  } else {
578  q->next = restart;
579  }
580 
581  return 0;
582 }
583 
584 static struct ctrl_entry *make_ctrl_entry(char *name_ID, char *filename) {
585  char *p;
586  struct ctrl_entry *ctrl = NULL;
587  ctrl = HECMW_calloc(1, sizeof(*ctrl));
588 
589  if (ctrl == NULL) {
590  HECMW_set_error(errno, "");
591  goto error;
592  }
593 
594  ctrl->next = NULL;
595  p = HECMW_strdup(name_ID);
596 
597  if (p == NULL) {
598  HECMW_set_error(errno, "");
599  goto error;
600  }
601 
602  ctrl->name_ID = p;
603  p = HECMW_strdup(filename);
604 
605  if (p == NULL) {
606  HECMW_set_error(errno, "");
607  goto error;
608  }
609 
610  ctrl->filename = p;
611  return ctrl;
612 error:
613 
614  if (ctrl) {
615  HECMW_free(ctrl->name_ID);
616  HECMW_free(ctrl->filename);
617  HECMW_free(ctrl);
618  }
619 
620  return NULL;
621 }
622 
623 static int add_ctrl_entry(struct ctrl_entry *ctrl) {
624  struct ctrl_entry *p, *q;
625  q = NULL;
626 
627  for (p = ctrl_ent; p; p = (q = p)->next)
628  ;
629 
630  if (q == NULL) {
631  ctrl_ent = ctrl;
632 
633  } else {
634  q->next = ctrl;
635  }
636 
637  return 0;
638 }
639 
640 /*----------------------------------------------------------------------------*/
641 
642 static void do_logging(int loglv, int msgno, int add_location, const char *fmt,
643  va_list ap) {
644  char line[100] = "";
645  char msg[HECMW_MSG_LEN + 1];
646  HECMW_vsnprintf(msg, sizeof(msg), fmt, ap);
647 
648  if (add_location) {
649  char *s = "";
650 
651  if (strlen(msg) > 0) s = ": ";
652 
653  snprintf(line, sizeof(line), "%s:%d%s", ctrl_filename,
655  }
656 
657  HECMW_set_error(msgno, "%s%s", line, msg);
658 }
659 
660 static void set_err(int msgno, const char *fmt, ...) {
661  va_list ap;
662  va_start(ap, fmt);
663  do_logging(HECMW_LOG_ERROR, msgno, 1, fmt, ap);
664  va_end(ap);
665 }
666 
667 static void set_err_token(int token, int msgno, const char *fmt, ...) {
668  int msg_no;
669  va_list ap;
670 
671  if (!token) {
672  msg_no = HECMW_UTIL_E0003;
673 
674  } else {
675  msg_no = msgno;
676  }
677 
678  va_start(ap, fmt);
679  do_logging(HECMW_LOG_ERROR, msg_no, 1, fmt, ap);
680  va_end(ap);
681 }
682 
683 /*----------------------------------------------------------------------------*/
684 
685 static int read_mesh_header(void) {
686  int token;
687  /* !MESH */
688  token = HECMW_ctrllex_next_token();
689 
690  if (token != HECMW_CTRLLEX_H_MESH) {
691  set_err(HECMW_UTIL_E0010, "!MESH required");
692  return -1;
693  }
694 
695  /* ',' */
696  token = HECMW_ctrllex_next_token();
697 
698  if (token != ',') {
699  set_err_token(token, HECMW_UTIL_E0010, "',' required after !MESH");
700  return -1;
701  }
702 
703  return 0;
704 }
705 
706 static int read_mesh_head_param_name(char *name, size_t name_len) {
707  int token;
708  char *p;
709  token = HECMW_ctrllex_next_token();
710 
711  if (token != '=') {
712  set_err_token(token, HECMW_UTIL_E0010, "'=' required after NAME");
713  return -1;
714  }
715 
716  /* NAME value */
717  token = HECMW_ctrllex_next_token();
718 
719  if (token != HECMW_CTRLLEX_NAME) {
720  set_err_token(token, HECMW_UTIL_E0010,
721  "NAME must begin with a letter or '_'");
722  return -1;
723  }
724 
726 
727  if (strlen(p) > HECMW_NAME_LEN) {
728  set_err(HECMW_IO_E0001, "");
729  return -1;
730  }
731 
732  snprintf(name, name_len, "%s", p);
733 
734  /* check */
735  if (get_mesh_entry(name) || get_mesh_grp_entry(name)) {
736  set_err(HECMW_UTIL_E0013, "");
737  return -1;
738  }
739 
740  return 0;
741 }
742 
743 static int read_mesh_head_param_type(int *type) {
744  int token;
745  token = HECMW_ctrllex_next_token();
746 
747  if (token != '=') {
748  set_err_token(token, HECMW_UTIL_E0010, "'=' required after TYPE");
749  return -1;
750  }
751 
752  /* TYPE value */
753  token = HECMW_ctrllex_next_token();
754 
755  if (token == HECMW_CTRLLEX_K_HECMW_DIST) {
757 
758  } else if (token == HECMW_CTRLLEX_K_HECMW_ENTIRE) {
760 
761  } else if (token == HECMW_CTRLLEX_K_GEOFEM) {
762  *type = HECMW_CTRL_FTYPE_GEOFEM;
763 
764  } else if (token == HECMW_CTRLLEX_K_ABAQUS) {
765  *type = HECMW_CTRL_FTYPE_ABAQUS;
766 
767  } else if (token == HECMW_CTRLLEX_K_NASTRAN) {
768  *type = HECMW_CTRL_FTYPE_NASTRAN;
769 #if 0
770 
771  } else if (token == HECMW_CTRLLEX_K_FEMAP) {
772  *type = HECMW_CTRL_FTYPE_FEMAP;
773 #endif
774 
775  } else {
776  set_err_token(token, HECMW_UTIL_E0010, "Invalid TYPE");
777  return -1;
778  }
779 
780  return 0;
781 }
782 
783 static int read_mesh_head_param_io(int *io) {
784  int token;
785  token = HECMW_ctrllex_next_token();
786 
787  if (token != '=') {
788  set_err_token(token, HECMW_UTIL_E0010, "'=' required after IO");
789  return -1;
790  }
791 
792  /* IO value */
793  token = HECMW_ctrllex_next_token();
794 
795  if (token == HECMW_CTRLLEX_K_IN) {
796  *io = HECMW_CTRL_FILE_IO_IN;
797 
798  } else if (token == HECMW_CTRLLEX_K_OUT) {
800 
801  } else {
802  set_err_token(token, HECMW_UTIL_E0010, "Invalid IO");
803  return -1;
804  }
805 
806  return 0;
807 }
808 
809 static int read_mesh_head_param_refine(int *refine) {
810  int token;
811  token = HECMW_ctrllex_next_token();
812 
813  if (token != '=') {
814  set_err_token(token, HECMW_UTIL_E0010, "'=' required after REFINE");
815  return -1;
816  }
817 
818  /* REFINE value */
819  token = HECMW_ctrllex_next_token();
820 
821  if (token != HECMW_CTRLLEX_INT) {
822  set_err_token(token, HECMW_UTIL_E0010, "Invalid REFINE");
823  return -1;
824 
825  } else {
826  *refine = HECMW_ctrllex_get_number();
827  }
828 
829  return 0;
830 }
831 
832 static int read_mesh_data(char *name, int type, int io, int refine) {
833  int token;
834  char *p;
835  struct mesh_entry *mesh;
836  /* filename */
837  token = HECMW_ctrllex_next_token();
838 
839  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
840  set_err_token(token, HECMW_UTIL_E0010, "Invalid filename");
841  return -1;
842  }
843 
845 
846  if (strlen(p) > HECMW_FILENAME_LEN) {
847  set_err(HECMW_IO_E0002, "");
848  return -1;
849  }
850 
851  /* create */
852  mesh = make_mesh_entry(name, type, io, refine, p);
853 
854  if (mesh == NULL) return -1;
855 
856  /* add */
857  if (add_mesh_entry(mesh)) return -1;
858 
859  /* NL*/
860  token = HECMW_ctrllex_next_token();
861 
862  if (token != HECMW_CTRLLEX_NL) {
863  set_err_token(token, HECMW_UTIL_E0010, "NL required after filename");
864  return -1;
865  }
866 
867  return 0;
868 }
869 
870 static int read_mesh(void) {
871  int state;
872  int token = -1;
873  int flag_name = 0; /* flag for NAME */
874  int flag_type = 0; /* flag for TYPE */
875  int flag_io = 0; /* flag for IO */
876  int flag_refine = 0; /* flag for REFINE */
877  int type = -1;
879  int refine = 0;
880  char name[HECMW_NAME_LEN + 1] = "";
881  enum {
882  ST_FINISHED,
883  ST_HEADER_LINE,
884  ST_HEADER_LINE_PARAM,
885  ST_DATA_LINE,
886  };
887  state = ST_HEADER_LINE;
888 
889  while (state != ST_FINISHED) {
890  if (state == ST_HEADER_LINE) {
891  if (read_mesh_header()) return -1;
892 
893  /* set next state */
894  state = ST_HEADER_LINE_PARAM;
895 
896  } else if (state == ST_HEADER_LINE_PARAM) {
897  token = HECMW_ctrllex_next_token();
898 
899  if (token == HECMW_CTRLLEX_K_NAME) {
900  /* must */
901  if (read_mesh_head_param_name(name, sizeof(name))) return -1;
902 
903  flag_name = 1;
904 
905  } else if (token == HECMW_CTRLLEX_K_TYPE) {
906  /* must */
907  if (read_mesh_head_param_type(&type)) return -1;
908 
909  flag_type = 1;
910 
911  } else if (token == HECMW_CTRLLEX_K_IO) {
912  /* optional */
913  if (read_mesh_head_param_io(&io)) return -1;
914 
915  flag_io = 1;
916 
917  } else if (token == HECMW_CTRLLEX_K_REFINE) {
918  /* optional */
919  if (read_mesh_head_param_refine(&refine)) return -1;
920 
921  flag_refine = 1;
922 
923  } else {
924  set_err_token(token, HECMW_UTIL_E0010, "Unknown parameter");
925  return -1;
926  }
927 
928  /* check next parameter */
929  token = HECMW_ctrllex_next_token();
930 
931  if (token == HECMW_CTRLLEX_NL) {
932  /* check NAME */
933  if (!flag_name) {
934  set_err(HECMW_UTIL_E0011, "");
935  return -1;
936  }
937 
938  /* check TYPE */
939  if (!flag_type) {
940  set_err(HECMW_UTIL_E0012, "");
941  return -1;
942  }
943 
944  state = ST_DATA_LINE;
945 
946  } else if (token == ',') {
947  ; /* continue this state */
948 
949  } else {
950  set_err_token(token, HECMW_UTIL_E0010, "Unknown parameter");
951  return -1;
952  }
953 
954  } else if (state == ST_DATA_LINE) {
955  HECMW_assert(flag_name);
956  HECMW_assert(flag_type);
957 
958  if (read_mesh_data(name, type, io, refine)) return -1;
959 
960  state = ST_FINISHED;
961 
962  } else {
963  HECMW_assert(0);
964  }
965  }
966 
967  /* check */
968  if (!strcmp(name, "fstrMSH") && type == HECMW_CTRL_FTYPE_HECMW_ENTIRE &&
969  HECMW_comm_get_size() > 1) {
970  set_err_token(token, HECMW_UTIL_E0010, "Invalid TYPE");
971  return -1;
972  }
973 
974  return 0;
975 }
976 
977 /*----------------------------------------------------------------------------*/
978 
979 static int read_meshgrp_header(void) {
980  int token;
981  /* !MESH GROUP */
982  token = HECMW_ctrllex_next_token();
983 
984  if (token != HECMW_CTRLLEX_H_MESH_GROUP) {
985  set_err(HECMW_UTIL_E0050, "!MESH GROUP required");
986  return -1;
987  }
988 
989  /* ',' */
990  token = HECMW_ctrllex_next_token();
991 
992  if (token != ',') {
993  set_err_token(token, HECMW_UTIL_E0050, "',' required after !MESH GROUP");
994  return -1;
995  }
996 
997  return 0;
998 }
999 
1000 static int read_meshgrp_head_param_name(char *name, size_t name_len) {
1001  int token;
1002  char *p;
1003  token = HECMW_ctrllex_next_token();
1004 
1005  if (token != '=') {
1006  set_err_token(token, HECMW_UTIL_E0050, "'=' required after NAME");
1007  return -1;
1008  }
1009 
1010  /* NAME value */
1011  token = HECMW_ctrllex_next_token();
1012 
1013  if (token != HECMW_CTRLLEX_NAME) {
1014  set_err_token(token, HECMW_UTIL_E0050,
1015  "NAME must begin with a letter or '_'");
1016  return -1;
1017  }
1018 
1019  p = HECMW_ctrllex_get_text();
1020 
1021  if (strlen(p) > HECMW_NAME_LEN) {
1022  set_err(HECMW_IO_E0001, "");
1023  return -1;
1024  }
1025 
1026  snprintf(name, name_len, "%s", p);
1027 
1028  /* check */
1029  if (get_mesh_entry(name) || get_mesh_grp_entry(name)) {
1030  set_err(HECMW_UTIL_E0053, "");
1031  return -1;
1032  }
1033 
1034  return 0;
1035 }
1036 
1037 static int read_meshgrp_data(char *name) {
1038  int i, token, n_mesh, n_mesh_max;
1039  char *p, **q;
1040  char **mesh = NULL;
1041  struct mesh_grp_entry *meshgrp = NULL;
1042  struct mesh_entry *ment;
1043  n_mesh_max = 10; /* default */
1044  mesh = HECMW_malloc(sizeof(*mesh) * n_mesh_max);
1045 
1046  if (mesh == NULL) {
1047  HECMW_set_error(errno, "");
1048  return -1;
1049  }
1050 
1051  n_mesh = 0;
1052 
1053  while (1) {
1054  /* filename */
1055  token = HECMW_ctrllex_next_token();
1056 
1057  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1058  if (n_mesh == 0) {
1059  set_err_token(token, HECMW_UTIL_E0050, "name_ID required");
1060  return -1;
1061  }
1062 
1064  break;
1065  }
1066 
1067  p = HECMW_ctrllex_get_text();
1068 
1069  if (strlen(p) > HECMW_FILENAME_LEN) {
1070  set_err(HECMW_IO_E0002, "");
1071  return -1;
1072  }
1073 
1074  if ((ment = get_mesh_entry(p)) == NULL) {
1075  set_err_token(token, HECMW_UTIL_E0052, "name_ID: %s", p);
1076  return -1;
1077  }
1078 
1079  if (!is_entire_mesh(ment->type)) {
1080  set_err_token(token, HECMW_UTIL_E0055, "name_ID: %s", p);
1081  return -1;
1082  }
1083 
1084  if (n_mesh == n_mesh_max) {
1085  n_mesh_max *= 2;
1086  q = HECMW_realloc(mesh, sizeof(*mesh) * n_mesh_max);
1087 
1088  if (q == NULL) {
1089  HECMW_set_error(errno, "");
1090  return -1;
1091  }
1092 
1093  mesh = q;
1094  }
1095 
1096  mesh[n_mesh] = HECMW_strdup(p);
1097 
1098  if (mesh[n_mesh] == NULL) {
1099  HECMW_set_error(errno, "");
1100  return -1;
1101  }
1102 
1103  n_mesh++;
1104  /* ',' or NL*/
1105  token = HECMW_ctrllex_next_token();
1106 
1107  if (token != HECMW_CTRLLEX_NL && token != ',') {
1108  set_err_token(token, HECMW_UTIL_E0050,
1109  "',' or NL required after name_ID");
1110  return -1;
1111  }
1112  }
1113 
1114  /* create */
1115  meshgrp = make_mesh_group_entry(name, n_mesh, mesh);
1116 
1117  if (meshgrp == NULL) return -1;
1118 
1119  /* add */
1120  if (add_mesh_group_entry(meshgrp)) return -1;
1121 
1122  for (i = 0; i < n_mesh; i++) {
1123  HECMW_free(mesh[i]);
1124  }
1125 
1126  HECMW_free(mesh);
1127  return 0;
1128 }
1129 
1130 static int read_meshgrp(void) {
1131  int token, state;
1132  int flag_name = 0; /* flag for NAME */
1133  char name[HECMW_NAME_LEN + 1] = "";
1134  enum {
1135  ST_FINISHED,
1136  ST_HEADER_LINE,
1137  ST_HEADER_LINE_PARAM,
1138  ST_DATA_LINE,
1139  };
1140  state = ST_HEADER_LINE;
1141 
1142  while (state != ST_FINISHED) {
1143  if (state == ST_HEADER_LINE) {
1144  if (read_meshgrp_header()) return -1;
1145 
1146  /* set next state */
1147  state = ST_HEADER_LINE_PARAM;
1148 
1149  } else if (state == ST_HEADER_LINE_PARAM) {
1150  token = HECMW_ctrllex_next_token();
1151 
1152  if (token == HECMW_CTRLLEX_K_NAME) {
1153  /* must */
1154  if (read_meshgrp_head_param_name(name, sizeof(name))) return -1;
1155 
1156  flag_name = 1;
1157 
1158  } else {
1159  set_err_token(token, HECMW_UTIL_E0050, "Unknown parameter");
1160  return -1;
1161  }
1162 
1163  /* check next parameter */
1164  token = HECMW_ctrllex_next_token();
1165 
1166  if (token == HECMW_CTRLLEX_NL) {
1167  /* check NAME */
1168  if (!flag_name) {
1169  set_err(HECMW_UTIL_E0051, "");
1170  return -1;
1171  }
1172 
1173  state = ST_DATA_LINE;
1174 
1175  } else if (token == ',') {
1176  ; /* continue this state */
1177 
1178  } else {
1179  set_err_token(token, HECMW_UTIL_E0050, "Unknown parameter");
1180  return -1;
1181  }
1182 
1183  } else if (state == ST_DATA_LINE) {
1184  HECMW_assert(flag_name);
1185 
1186  if (read_meshgrp_data(name)) return -1;
1187 
1188  state = ST_FINISHED;
1189 
1190  } else {
1191  HECMW_assert(0);
1192  }
1193  }
1194 
1195  return 0;
1196 }
1197 
1198 /*----------------------------------------------------------------------------*/
1199 
1200 static int read_result_head(void) {
1201  int token;
1202  /* !RESULT */
1203  token = HECMW_ctrllex_next_token();
1204 
1205  if (token != HECMW_CTRLLEX_H_RESULT) {
1206  set_err(HECMW_UTIL_E0020, "!RESULT required");
1207  return -1;
1208  }
1209 
1210  /* ',' */
1211  token = HECMW_ctrllex_next_token();
1212 
1213  if (token != ',') {
1214  set_err_token(token, HECMW_UTIL_E0020, "',' required after !RESULT");
1215  return -1;
1216  }
1217 
1218  return 0;
1219 }
1220 
1221 static int read_result_param_name(char *name, size_t name_len) {
1222  int token;
1223  char *p;
1224  token = HECMW_ctrllex_next_token();
1225 
1226  if (token != '=') {
1227  set_err_token(token, HECMW_UTIL_E0020, "'=' required after NAME");
1228  return -1;
1229  }
1230 
1231  /* NAME value */
1232  token = HECMW_ctrllex_next_token();
1233 
1234  if (token != HECMW_CTRLLEX_NAME) {
1235  set_err_token(token, HECMW_UTIL_E0020,
1236  "NAME must begin with a letter or '_'");
1237  return -1;
1238  }
1239 
1240  p = HECMW_ctrllex_get_text();
1241 
1242  if (strlen(p) > HECMW_NAME_LEN) {
1243  set_err(HECMW_IO_E0001, "");
1244  return -1;
1245  }
1246 
1247  snprintf(name, name_len, "%s", p);
1248 
1249  /* check */
1250  if (get_result_entry(name)) {
1251  set_err(HECMW_UTIL_E0023, "");
1252  return -1;
1253  }
1254 
1255  return 0;
1256 }
1257 
1258 static int read_result_param_io(int *io) {
1259  int token;
1260  token = HECMW_ctrllex_next_token();
1261 
1262  if (token != '=') {
1263  set_err_token(token, HECMW_UTIL_E0020, "'=' required after IO");
1264  return -1;
1265  }
1266 
1267  /* IO value */
1268  token = HECMW_ctrllex_next_token();
1269 
1270  if (token == HECMW_CTRLLEX_K_IN) {
1272 
1273  } else if (token == HECMW_CTRLLEX_K_OUT) {
1275 
1276  } else {
1277  set_err_token(token, HECMW_UTIL_E0020, "Invalid IO");
1278  return -1;
1279  }
1280 
1281  return 0;
1282 }
1283 
1284 static int read_result_param_type(int *fg_text) {
1285  int token;
1286  char s[HECMW_NAME_LEN + 1];
1287  char *p;
1288  char *sp;
1289  token = HECMW_ctrllex_next_token();
1290 
1291  if (token != '=') {
1292  set_err_token(token, HECMW_UTIL_E0020, "'=' required after TYPE");
1293  return -1;
1294  }
1295 
1296  /* TYPE value */
1297  token = HECMW_ctrllex_next_token();
1298  p = HECMW_ctrllex_get_text();
1299 
1300  if (strlen(p) > HECMW_NAME_LEN) {
1301  set_err(HECMW_UTIL_E0020, "");
1302  return -1;
1303  }
1304 
1305  sp = s;
1306 
1307  while (*p) {
1308  *sp = (char)toupper(*p);
1309  p++;
1310  sp++;
1311  }
1312 
1313  *sp = 0;
1314 
1315  if (strcmp(s, "TEXT") == 0) {
1316  *fg_text = 1;
1317 
1318  } else if (strcmp(s, "BINARY") == 0) {
1319  *fg_text = 0;
1320 
1321  } else {
1322  set_err(HECMW_UTIL_E0020, "TEXT or BINARY required");
1323  return -1;
1324  }
1325 
1326  return 0;
1327 }
1328 
1329 static int read_result_data(char *name, int io, int fg_text) {
1330  int token;
1331  char *p;
1332  struct result_entry *result;
1333  /* filename */
1334  token = HECMW_ctrllex_next_token();
1335 
1336  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1337  set_err_token(token, HECMW_UTIL_E0020, "Invalid filename");
1338  }
1339 
1340  p = HECMW_ctrllex_get_text();
1341 
1342  if (strlen(p) > HECMW_FILENAME_LEN) {
1343  set_err(HECMW_IO_E0002, "NL required after filename");
1344  return -1;
1345  }
1346 
1347  /* create */
1348  result = make_result_entry(name, io, fg_text, p);
1349 
1350  if (result == NULL) return -1;
1351 
1352  /* add */
1353  if (add_result_entry(result)) return -1;
1354 
1355  /* NL*/
1356  token = HECMW_ctrllex_next_token();
1357 
1358  if (token != HECMW_CTRLLEX_NL) {
1359  set_err_token(token, HECMW_UTIL_E0020, "NL required after filename");
1360  return -1;
1361  }
1362 
1363  return 0;
1364 }
1365 
1366 static int read_result(void) {
1367  int token, state;
1368  int flag_name = 0; /* flag for NAME */
1369  int flag_io = 0; /* flag for IO */
1370  int io;
1371  int fg_text; /* default : text */
1372  char name[HECMW_NAME_LEN + 1] = "";
1373  enum {
1374  ST_FINISHED,
1375  ST_HEADER_LINE,
1376  ST_HEADER_LINE_PARAM,
1377  ST_DATA_LINE,
1378  };
1379  fg_text = 1;
1380  state = ST_HEADER_LINE;
1381 
1382  while (state != ST_FINISHED) {
1383  if (state == ST_HEADER_LINE) {
1384  if (read_result_head()) return -1;
1385 
1386  state = ST_HEADER_LINE_PARAM;
1387 
1388  } else if (state == ST_HEADER_LINE_PARAM) {
1389  token = HECMW_ctrllex_next_token();
1390 
1391  if (token == HECMW_CTRLLEX_K_NAME) {
1392  /* must */
1393  if (read_result_param_name(name, sizeof(name))) return -1;
1394 
1395  flag_name = 1;
1396 
1397  } else if (token == HECMW_CTRLLEX_K_IO) {
1398  /* must */
1399  if (read_result_param_io(&io)) return -1;
1400 
1401  flag_io = 1;
1402 
1403  } else if (token == HECMW_CTRLLEX_K_TYPE) {
1404  /* option */
1405  if (read_result_param_type(&fg_text)) return -1;
1406 
1407  } else {
1408  set_err_token(token, HECMW_UTIL_E0020, "Unknown parameter");
1409  return -1;
1410  }
1411 
1412  /* check next parameter */
1413  token = HECMW_ctrllex_next_token();
1414 
1415  if (token == HECMW_CTRLLEX_NL) {
1416  /* check NAME */
1417  if (!flag_name) {
1418  set_err(HECMW_UTIL_E0021, "");
1419  return -1;
1420  }
1421 
1422  /* check IO */
1423  if (!flag_io) {
1424  set_err(HECMW_UTIL_E0022, "");
1425  return -1;
1426  }
1427 
1428  state = ST_DATA_LINE;
1429 
1430  } else if (token == ',') {
1431  ; /* continue this state */
1432 
1433  } else {
1434  set_err_token(token, HECMW_UTIL_E0020, "Unknown parameter");
1435  return -1;
1436  }
1437 
1438  } else if (state == ST_DATA_LINE) {
1439  HECMW_assert(flag_name);
1440 
1441  if (read_result_data(name, io, fg_text)) return -1;
1442 
1443  state = ST_FINISHED;
1444 
1445  } else {
1446  HECMW_assert(0);
1447  }
1448  }
1449 
1450  return 0;
1451 }
1452 
1453 /*----------------------------------------------------------------------------*/
1454 
1455 static int read_restart_head(void) {
1456  int token;
1457  /* !RESULT */
1458  token = HECMW_ctrllex_next_token();
1459 
1460  if (token != HECMW_CTRLLEX_H_RESTART) {
1461  set_err(HECMW_UTIL_E0040, "!RESTART required");
1462  return -1;
1463  }
1464 
1465  /* ',' */
1466  token = HECMW_ctrllex_next_token();
1467 
1468  if (token != ',') {
1469  set_err_token(token, HECMW_UTIL_E0040, "',' required after !RESTART");
1470  return -1;
1471  }
1472 
1473  return 0;
1474 }
1475 
1476 static int read_restart_param_name(char *name, size_t name_len) {
1477  int token;
1478  char *p;
1479  token = HECMW_ctrllex_next_token();
1480 
1481  if (token != '=') {
1482  set_err_token(token, HECMW_UTIL_E0040, "'=' required after NAME");
1483  return -1;
1484  }
1485 
1486  /* NAME value */
1487  token = HECMW_ctrllex_next_token();
1488 
1489  if (token != HECMW_CTRLLEX_NAME) {
1490  set_err_token(token, HECMW_UTIL_E0040,
1491  "NAME must begin with a letter or '_'");
1492  return -1;
1493  }
1494 
1495  p = HECMW_ctrllex_get_text();
1496 
1497  if (strlen(p) > HECMW_NAME_LEN) {
1498  set_err(HECMW_IO_E0001, "");
1499  return -1;
1500  }
1501 
1502  snprintf(name, name_len, "%s", p);
1503 
1504  /* check */
1505  if (get_restart_entry(name)) {
1506  set_err(HECMW_UTIL_E0043, "");
1507  return -1;
1508  }
1509 
1510  return 0;
1511 }
1512 
1513 static int read_restart_param_io(int *io) {
1514  int token;
1515  token = HECMW_ctrllex_next_token();
1516 
1517  if (token != '=') {
1518  set_err_token(token, HECMW_UTIL_E0040, "'=' required after IO");
1519  return -1;
1520  }
1521 
1522  /* IO value */
1523  token = HECMW_ctrllex_next_token();
1524 
1525  if (token == HECMW_CTRLLEX_K_IN) {
1527 
1528  } else if (token == HECMW_CTRLLEX_K_OUT) {
1530 
1531  } else if (token == HECMW_CTRLLEX_K_INOUT) {
1533 
1534  } else {
1535  set_err_token(token, HECMW_UTIL_E0040, "Invalid IO");
1536  return -1;
1537  }
1538 
1539  return 0;
1540 }
1541 
1542 static int read_restart_data(char *name, int io) {
1543  int token;
1544  char *p;
1545  struct restart_entry *restart;
1546  /* filename */
1547  token = HECMW_ctrllex_next_token();
1548 
1549  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1550  set_err_token(token, HECMW_UTIL_E0040, "Invalid filename");
1551  }
1552 
1553  p = HECMW_ctrllex_get_text();
1554 
1555  if (strlen(p) > HECMW_FILENAME_LEN) {
1556  set_err(HECMW_IO_E0002, "NL required after filename");
1557  return -1;
1558  }
1559 
1560  /* create */
1561  restart = make_restart_entry(name, io, p);
1562 
1563  if (restart == NULL) return -1;
1564 
1565  /* add */
1566  if (add_restart_entry(restart)) return -1;
1567 
1568  /* NL*/
1569  token = HECMW_ctrllex_next_token();
1570 
1571  if (token != HECMW_CTRLLEX_NL) {
1572  set_err_token(token, HECMW_UTIL_E0040, "NL required after filename");
1573  return -1;
1574  }
1575 
1576  return 0;
1577 }
1578 
1579 static int read_restart(void) {
1580  int token, state;
1581  int flag_name = 0; /* flag for NAME */
1582  int flag_io = 0; /* flag for IO */
1583  int io;
1584  char name[HECMW_NAME_LEN + 1] = "";
1585  enum {
1586  ST_FINISHED,
1587  ST_HEADER_LINE,
1588  ST_HEADER_LINE_PARAM,
1589  ST_DATA_LINE,
1590  };
1591  state = ST_HEADER_LINE;
1592 
1593  while (state != ST_FINISHED) {
1594  if (state == ST_HEADER_LINE) {
1595  if (read_restart_head()) return -1;
1596 
1597  /* set next state */
1598  state = ST_HEADER_LINE_PARAM;
1599 
1600  } else if (state == ST_HEADER_LINE_PARAM) {
1601  token = HECMW_ctrllex_next_token();
1602 
1603  if (token == HECMW_CTRLLEX_K_NAME) {
1604  /* must */
1605  if (read_restart_param_name(name, sizeof(name))) return -1;
1606 
1607  flag_name = 1;
1608 
1609  } else if (token == HECMW_CTRLLEX_K_IO) {
1610  /* must */
1611  if (read_restart_param_io(&io)) return -1;
1612 
1613  flag_io = 1;
1614 
1615  } else {
1616  set_err_token(token, HECMW_UTIL_E0040, "Unknown parameter");
1617  return -1;
1618  }
1619 
1620  /* check next parameter */
1621  token = HECMW_ctrllex_next_token();
1622 
1623  if (token == HECMW_CTRLLEX_NL) {
1624  /* check NAME */
1625  if (!flag_name) {
1626  set_err(HECMW_UTIL_E0041, "");
1627  return -1;
1628  }
1629 
1630  /* check IO */
1631  if (!flag_io) {
1632  set_err(HECMW_UTIL_E0042, "");
1633  return -1;
1634  }
1635 
1636  state = ST_DATA_LINE;
1637 
1638  } else if (token == ',') {
1639  ; /* continue this state */
1640 
1641  } else {
1642  set_err_token(token, HECMW_UTIL_E0040, "Unknown parameter");
1643  return -1;
1644  }
1645 
1646  } else if (state == ST_DATA_LINE) {
1647  HECMW_assert(flag_name);
1648  HECMW_assert(flag_io);
1649 
1650  if (read_restart_data(name, io)) return -1;
1651 
1652  state = ST_FINISHED;
1653 
1654  } else {
1655  HECMW_assert(0);
1656  }
1657  }
1658 
1659  return 0;
1660 }
1661 
1662 /*----------------------------------------------------------------------------*/
1663 
1664 static int read_control_head(void) {
1665  int token;
1666  /* !CONTROL */
1667  token = HECMW_ctrllex_next_token();
1668 
1669  if (token != HECMW_CTRLLEX_H_CONTROL) {
1670  set_err(HECMW_UTIL_E0030, "!CONTROL required");
1671  return -1;
1672  }
1673 
1674  /* ',' */
1675  token = HECMW_ctrllex_next_token();
1676 
1677  if (token != ',') {
1678  set_err_token(token, HECMW_UTIL_E0030, "',' required after !CONTROL");
1679  return -1;
1680  }
1681 
1682  return 0;
1683 }
1684 
1685 static int read_control_head_param_name(char *name, size_t name_len) {
1686  int token;
1687  char *p;
1688  token = HECMW_ctrllex_next_token();
1689 
1690  if (token != '=') {
1691  set_err_token(token, HECMW_UTIL_E0030, "'=' required after NAME");
1692  return -1;
1693  }
1694 
1695  /* NAME value */
1696  token = HECMW_ctrllex_next_token();
1697 
1698  if (token != HECMW_CTRLLEX_NAME) {
1699  set_err_token(token, HECMW_UTIL_E0030,
1700  "NAME must begin with a letter or '_'");
1701  return -1;
1702  }
1703 
1704  p = HECMW_ctrllex_get_text();
1705 
1706  if (strlen(p) > HECMW_NAME_LEN) {
1707  set_err(HECMW_IO_E0001, "");
1708  return -1;
1709  }
1710 
1711  snprintf(name, name_len, "%s", p);
1712 
1713  /* check */
1714  if (get_ctrl_entry(name)) {
1715  set_err(HECMW_UTIL_E0032, "");
1716  return -1;
1717  }
1718 
1719  return 0;
1720 }
1721 
1722 static int read_control_data(char *name) {
1723  int token;
1724  char *p;
1725  struct ctrl_entry *control;
1726  /* filename */
1727  token = HECMW_ctrllex_next_token();
1728 
1729  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1730  set_err_token(token, HECMW_UTIL_E0030, "Invalid filename");
1731  return -1;
1732  }
1733 
1734  p = HECMW_ctrllex_get_text();
1735 
1736  if (strlen(p) > HECMW_FILENAME_LEN) {
1737  set_err(HECMW_IO_E0002, "NL required after filename");
1738  return -1;
1739  }
1740 
1741  /* create */
1742  control = make_ctrl_entry(name, p);
1743 
1744  if (control == NULL) {
1745  return -1;
1746  }
1747 
1748  /* add */
1749  if (add_ctrl_entry(control)) {
1750  return -1;
1751  }
1752 
1753  /* NL*/
1754  token = HECMW_ctrllex_next_token();
1755 
1756  if (token != HECMW_CTRLLEX_NL) {
1757  set_err_token(token, HECMW_UTIL_E0030, "NL required after filename");
1758  return -1;
1759  }
1760 
1761  return 0;
1762 }
1763 
1764 static int read_control(void) {
1765  int token, state;
1766  int flag_name = 0; /* flag for NAME */
1767  char name[HECMW_NAME_LEN + 1] = "";
1768  enum {
1769  ST_FINISHED,
1770  ST_HEADER_LINE,
1771  ST_HEADER_LINE_PARAM,
1772  ST_DATA_LINE,
1773  };
1774  state = ST_HEADER_LINE;
1775 
1776  while (state != ST_FINISHED) {
1777  if (state == ST_HEADER_LINE) {
1778  if (read_control_head()) return -1;
1779 
1780  /* set next state */
1781  state = ST_HEADER_LINE_PARAM;
1782 
1783  } else if (state == ST_HEADER_LINE_PARAM) {
1784  token = HECMW_ctrllex_next_token();
1785 
1786  if (token == HECMW_CTRLLEX_K_NAME) {
1787  /* must */
1788  if (read_control_head_param_name(name, sizeof(name))) return -1;
1789 
1790  flag_name = 1;
1791 
1792  } else {
1793  set_err_token(token, HECMW_UTIL_E0030, "Unknown parameter");
1794  return -1;
1795  }
1796 
1797  /* check next parameter */
1798  token = HECMW_ctrllex_next_token();
1799 
1800  if (token == HECMW_CTRLLEX_NL) {
1801  /* check NAME */
1802  if (!flag_name) {
1803  set_err(HECMW_UTIL_E0031, "");
1804  return -1;
1805  }
1806 
1807  state = ST_DATA_LINE;
1808 
1809  } else if (token == ',') {
1810  ; /* continue this state */
1811 
1812  } else {
1813  set_err_token(token, HECMW_UTIL_E0030, "Unknown parameter");
1814  return -1;
1815  }
1816 
1817  } else if (state == ST_DATA_LINE) {
1818  HECMW_assert(flag_name);
1819 
1820  if (read_control_data(name)) return -1;
1821 
1822  state = ST_FINISHED;
1823 
1824  } else {
1825  HECMW_assert(0);
1826  }
1827  }
1828 
1829  return 0;
1830 }
1831 
1832 /*----------------------------------------------------------------------------*/
1833 
1834 static int read_subdir_head(void) {
1835  int token;
1836  /* !SUBDIR */
1837  token = HECMW_ctrllex_next_token();
1838 
1839  if (token != HECMW_CTRLLEX_H_SUBDIR) {
1840  set_err(HECMW_UTIL_E0060, "!SUBDIR required");
1841  return -1;
1842  }
1843 
1844  /* ',' */
1845  token = HECMW_ctrllex_next_token();
1846 
1847  if (token != ',') {
1848  set_err_token(token, HECMW_UTIL_E0060, "',' required after !SUBDIR");
1849  return -1;
1850  }
1851 
1852  return 0;
1853 }
1854 
1855 static int read_subdir_head_param_limit(void) {
1856  int token;
1857  token = HECMW_ctrllex_next_token();
1858 
1859  if (token != '=') {
1860  set_err_token(token, HECMW_UTIL_E0060, "'=' required after LIMIT");
1861  return -1;
1862  }
1863 
1864  /* LIMIT value */
1865  token = HECMW_ctrllex_next_token();
1866 
1867  if (token != HECMW_CTRLLEX_INT) {
1868  set_err_token(token, HECMW_UTIL_E0060, "Invalid LIMIT");
1869  return -1;
1870 
1871  } else {
1872  nlimit = HECMW_ctrllex_get_number();
1873  }
1874 
1875  return 0;
1876 }
1877 
1878 static int read_subdir(void) {
1879  int token, state;
1880  int flag_name = 0; /* flag for NAME */
1881  enum {
1882  ST_FINISHED,
1883  ST_HEADER_LINE,
1884  ST_HEADER_LINE_PARAM,
1885  };
1886  nlimit = 5000;
1887  state = ST_HEADER_LINE;
1888 
1889  while (state != ST_FINISHED) {
1890  if (state == ST_HEADER_LINE) {
1891  if (read_subdir_head()) return -1;
1892 
1893  /* set next state */
1894  state = ST_HEADER_LINE_PARAM;
1895 
1896  } else if (state == ST_HEADER_LINE_PARAM) {
1897  token = HECMW_ctrllex_next_token();
1898 
1899  if (token == HECMW_CTRLLEX_K_ON) {
1900  /* must */
1901  subdir_on = 1;
1902  flag_name = 1;
1903 
1904  } else if (token == HECMW_CTRLLEX_K_OFF) {
1905  /* must */
1906  subdir_on = 0;
1907  flag_name = 1;
1908 
1909  } else if (token == HECMW_CTRLLEX_K_LIMIT) {
1910  if (read_subdir_head_param_limit()) return -1;
1911 
1912  } else {
1913  set_err_token(token, HECMW_UTIL_E0060, "Unknown parameter");
1914  return -1;
1915  }
1916 
1917  /* check next parameter */
1918  token = HECMW_ctrllex_next_token();
1919 
1920  if (token == HECMW_CTRLLEX_NL) {
1921  if (!flag_name) {
1922  set_err(HECMW_UTIL_E0061, "");
1923  return -1;
1924  }
1925 
1926  state = ST_FINISHED;
1927 
1928  } else if (token == ',') {
1929  ; /* continue this state */
1930 
1931  } else {
1932  set_err_token(token, HECMW_UTIL_E0060, "Unknown parameter");
1933  return -1;
1934  }
1935 
1936  } else {
1937  HECMW_assert(0);
1938  }
1939  }
1940 
1941  return 0;
1942 }
1943 
1944 /*------------------------------------------------------------------------------
1945  ReadFunc table
1946 */
1947 
1948 typedef int (*ReadFunc)(void);
1949 
1950 static struct read_func_table {
1951  int token;
1952  ReadFunc func;
1953 } read_func_table[] = {
1954  {HECMW_CTRLLEX_H_CONTROL, read_control},
1955  {HECMW_CTRLLEX_H_MESH, read_mesh},
1956  {HECMW_CTRLLEX_H_MESH_GROUP, read_meshgrp},
1957  {HECMW_CTRLLEX_H_RESULT, read_result},
1958  {HECMW_CTRLLEX_H_RESTART, read_restart},
1959  {HECMW_CTRLLEX_H_SUBDIR, read_subdir},
1960 };
1961 
1962 #define N_READ_FUNC (sizeof(read_func_table) / sizeof(read_func_table[0]))
1963 
1964 /* static int (* get_read_func(int token))(void) */
1965 static ReadFunc get_read_func(int token) {
1966  int i;
1967 
1968  for (i = 0; i < N_READ_FUNC; i++) {
1969  if (token == read_func_table[i].token) {
1970  return read_func_table[i].func;
1971  }
1972  }
1973 
1974  return NULL;
1975 }
1976 
1977 /*----------------------------------------------------------------------------*/
1978 
1979 static int parse(void) {
1980  int token;
1981  ReadFunc func;
1982 
1983  while ((token = HECMW_ctrllex_next_token())) {
1984  if (token == HECMW_CTRLLEX_NL) continue;
1985 
1986  func = get_read_func(token);
1987 
1988  if (func == NULL) {
1989  char *p = HECMW_ctrllex_get_text();
1990 
1991  if (p[0] == '!') {
1992  set_err(HECMW_UTIL_E0004, "");
1993 
1994  } else {
1995  set_err(HECMW_UTIL_E0005, "");
1996  }
1997 
1998  return -1;
1999  }
2000 
2001  HECMW_ctrllex_unput_token(); /* unput !XXXX */
2002 
2003  if ((*func)()) return -1;
2004  }
2005 
2006  return 0;
2007 }
2008 
2009 int HECMW_ctrl_init_ex(const char *ctrlfile) {
2010  FILE *fp;
2011  HECMW_log(HECMW_LOG_DEBUG, "Getting control data");
2012 
2013  if (ctrlfile == NULL) {
2014  HECMW_set_error(HECMW_ALL_E0101, "Not specified control file name");
2015  return -1;
2016  }
2017 
2018  snprintf(ctrl_filename, sizeof(ctrl_filename), "%s", ctrlfile);
2019  HECMW_log(HECMW_LOG_DEBUG, "Control file is '%s'", ctrl_filename);
2020 
2021  if ((fp = fopen(ctrl_filename, "r")) == NULL) {
2022  HECMW_set_error(HECMW_UTIL_E0001, "File: %s, %s", ctrl_filename,
2023  strerror(errno));
2024  return -1;
2025  }
2026 
2027  if (HECMW_ctrllex_set_input(fp)) return -1;
2028 
2029  if (parse()) {
2030  return -1;
2031  }
2032 
2033  if (fclose(fp)) {
2034  HECMW_set_error(HECMW_UTIL_E0002, "File: %s, %s", ctrl_filename,
2035  strerror(errno));
2036  return -1;
2037  }
2038 
2039  return 0;
2040 }
2041 
2043 
2045  HECMW_log(HECMW_LOG_DEBUG, "Finalizing control data");
2046  free_ctrl_entry();
2047  free_mesh_entry();
2048  free_mesh_grp_entry();
2049  free_result_entry();
2050  free_restart_entry();
2051  return 0;
2052 }
2053 
2055  int i;
2056 
2057  for (i = 0; i < meshfiles->n_mesh; i++) {
2058  HECMW_free(meshfiles->meshfiles[i].filename);
2059  }
2060 
2061  HECMW_free(meshfiles->meshfiles);
2062  HECMW_free(meshfiles);
2063 }
2064 
2065 static struct hecmw_ctrl_meshfiles *make_meshfiles_struct(
2066  int n_mesh, struct mesh_entry **mesh, int n_rank, int i_rank,
2067  int flag_rank_none) {
2068  int i, flag_rank, nrank, myrank, irank;
2069  char *fname;
2070  char *retval;
2071  struct hecmw_ctrl_meshfiles *files;
2072  char prefix[32];
2073  files = HECMW_malloc(sizeof(*files));
2074 
2075  if (files == NULL) {
2076  HECMW_set_error(errno, "");
2077  return NULL;
2078  }
2079 
2080  if (n_rank == 0) {
2081  nrank = HECMW_comm_get_size();
2083 
2084  } else {
2085  nrank = n_rank;
2086  myrank = i_rank;
2087  }
2088 
2089  files->n_mesh = n_mesh;
2090  files->meshfiles = HECMW_malloc(sizeof(*files->meshfiles) * n_mesh);
2091 
2092  if (files->meshfiles == NULL) {
2093  HECMW_set_error(errno, "");
2094  return NULL;
2095  }
2096 
2097  for (i = 0; i < n_mesh; i++) {
2098  struct hecmw_ctrl_meshfile *file = &files->meshfiles[i];
2099  struct mesh_entry *ment = mesh[i];
2100  file->type = ment->type;
2101  file->io = ment->io;
2102  file->refine = ment->refine;
2103 
2104  if (flag_rank_none) {
2105  flag_rank = 0;
2106 
2107  } else {
2108  if (is_entire_mesh(file->type)) {
2109  flag_rank = 0;
2110 
2111  } else {
2112  flag_rank = 1;
2113  }
2114  }
2115 
2116  fname = HECMW_malloc(sizeof(char) * (HECMW_FILENAME_LEN + 1));
2117 
2118  if (fname == NULL) {
2119  HECMW_set_error(errno, "");
2120  return NULL;
2121  }
2122 
2123  if (ment->type == HECMW_CTRL_FTYPE_HECMW_ENTIRE) {
2124  retval = make_filename_r(NULL, NULL, NULL, ment->filename, "", myrank,
2125  flag_rank, fname, HECMW_FILENAME_LEN);
2126 
2127  } else {
2128  if (subdir_on && nrank > nlimit) {
2129  irank = myrank / nlimit;
2130  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2131  retval = make_filename_r("MESH", NULL, prefix, ment->filename, "", myrank,
2132  flag_rank, fname, HECMW_FILENAME_LEN);
2133 
2134  } else if (subdir_on && ment->type == HECMW_CTRL_FTYPE_HECMW_DIST) {
2135  retval = make_filename_r("MESH", NULL, NULL, ment->filename, "", myrank,
2136  flag_rank, fname, HECMW_FILENAME_LEN);
2137 
2138  } else if (subdir_on && nrank > 1) {
2139  retval = make_filename_r("MESH", NULL, NULL, ment->filename, "", myrank,
2140  flag_rank, fname, HECMW_FILENAME_LEN);
2141 
2142  } else {
2143  retval = make_filename_r(NULL, NULL, NULL, ment->filename, "", myrank,
2144  flag_rank, fname, HECMW_FILENAME_LEN);
2145  }
2146  }
2147 
2148  if (retval == NULL) {
2149  HECMW_set_error(HECMW_IO_E0002, "Cannot create mesh filename");
2150  HECMW_free(fname);
2151  return NULL;
2152  }
2153 
2154  file->filename = fname;
2155  }
2156 
2157  return files;
2158 }
2159 
2160 static struct hecmw_ctrl_meshfiles *get_meshfiles(char *name_ID, int n_rank,
2161  int i_rank,
2162  int flag_rank_none) {
2163  struct mesh_entry *mesh;
2164  struct mesh_grp_entry *mesh_grp;
2165  struct hecmw_ctrl_meshfiles *files = NULL;
2166  mesh_grp = get_mesh_grp_entry(name_ID);
2167 
2168  if (mesh_grp) {
2169  files = make_meshfiles_struct(mesh_grp->n_mesh, mesh_grp->mesh, n_rank,
2170  i_rank, flag_rank_none);
2171 
2172  if (files == NULL) return NULL;
2173  }
2174 
2175  if (files == NULL) {
2176  mesh = get_mesh_entry(name_ID);
2177 
2178  if (mesh) {
2179  files = make_meshfiles_struct(1, &mesh, n_rank, i_rank, flag_rank_none);
2180 
2181  if (files == NULL) return NULL;
2182  }
2183  }
2184 
2185  if (files == NULL) {
2186  HECMW_set_error(HECMW_UTIL_E0014, "NAME: %s", name_ID);
2187  return NULL;
2188  }
2189 
2190  return files;
2191 }
2192 
2194  return get_meshfiles(name_ID, 0, 0, 0);
2195 }
2196 
2198  return get_meshfiles(name_ID, 0, 0, 1);
2199 }
2200 
2202  int n_rank,
2203  int i_rank) {
2204  return get_meshfiles(name_ID, n_rank, i_rank, 0);
2205 }
2206 
2208  int n_rank,
2209  int i_rank) {
2210  return get_meshfiles(name_ID, n_rank, i_rank, 1);
2211 }
2212 
2213 static char *get_result_file(char *name_ID, int istep, int n_rank,
2214  int i_rank, int *fg_text, int flag_rank_none) {
2215  int nrank, myrank, irank;
2216  char *fname, *retfname;
2217  struct result_entry *result;
2218  char subname[32], prefix[32];
2219  result = get_result_entry(name_ID);
2220 
2221  if (result == NULL) {
2222  HECMW_set_error(HECMW_UTIL_E0024, "NAME: %s",
2223  name_ID ? name_ID : "Not specified");
2224  return NULL;
2225  }
2226 
2227  if (n_rank == 0) {
2228  nrank = HECMW_comm_get_size();
2230 
2231  } else {
2232  nrank = n_rank;
2233  myrank = i_rank;
2234  }
2235 
2236  if (subdir_on && !strcmp(name_ID, "vis_out")) {
2237  fname = make_filename(name_ID, NULL, NULL, result->filename, "", myrank,
2238  flag_rank_none);
2239 
2240  } else if (subdir_on && nrank > nlimit) {
2241  snprintf(subname, sizeof(subname), "STEP%d", istep);
2242  irank = myrank / nlimit;
2243  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2244  fname = make_filename(name_ID, subname, prefix, result->filename, "",
2245  myrank, flag_rank_none);
2246 
2247  } else if (subdir_on) {
2248  snprintf(subname, sizeof(subname), "STEP%d", istep);
2249  fname = make_filename(name_ID, subname, NULL, result->filename, "", myrank,
2250  flag_rank_none);
2251 
2252  } else {
2253  fname = make_filename(NULL, NULL, NULL, result->filename, "", myrank,
2254  flag_rank_none);
2255  }
2256 
2257  if (fname == NULL) {
2258  HECMW_set_error(HECMW_IO_E0002, "Cannot create result filename");
2259  return NULL;
2260  }
2261 
2262  retfname = HECMW_strdup(fname);
2263 
2264  if (retfname == NULL) {
2265  HECMW_set_error(errno, "");
2266  return NULL;
2267  }
2268 
2269  *fg_text = result->fg_text;
2270  return retfname;
2271 }
2272 
2273 static char *get_filename_body(char *file) {
2274  static char filename[HECMW_FILENAME_LEN+1];
2275  snprintf(filename, sizeof(filename), "%s", file);
2276  return filename;
2277 }
2278 
2279 static char *get_result_filebody(char *name_ID) {
2280  struct result_entry *result;
2281  char *fname, *retfname;
2282 
2283  result = get_result_entry(name_ID);
2284 
2285  if (result == NULL) {
2286  HECMW_set_error(HECMW_UTIL_E0024, "NAME: %s",
2287  name_ID ? name_ID : "Not specified");
2288  return NULL;
2289  }
2290 
2291  fname = get_filename_body(result->filename);
2292 
2293  retfname = HECMW_strdup(fname);
2294 
2295  if (retfname == NULL) {
2296  HECMW_set_error(errno, "");
2297  return NULL;
2298  }
2299 
2300  return retfname;
2301 }
2302 
2303 char *HECMW_ctrl_get_result_file(char *name_ID, int istep,
2304  int *fg_text) {
2305  return get_result_file(name_ID, istep, 0, 0, fg_text, 1);
2306 }
2307 
2309  int *fg_text) {
2310  return get_result_file(name_ID, istep, 0, 0, fg_text, 0);
2311 }
2312 
2314  int n_rank, int i_rank, int *fg_text) {
2315  return get_result_file(name_ID, istep, n_rank, i_rank, fg_text, 1);
2316 }
2317 
2319  int n_rank, int i_rank,
2320  int *fg_text) {
2321  return get_result_file(name_ID, istep, n_rank, i_rank, fg_text, 0);
2322 }
2323 
2325  return get_result_filebody(name_ID);
2326 }
2327 
2329  int nrank, myrank, irank;
2330  char *fname, *retfname;
2331  struct restart_entry *restart;
2332  char prefix[32];
2333  restart = get_restart_entry(name_ID);
2334 
2335  if (restart == NULL) {
2336  HECMW_set_error(HECMW_UTIL_E0044, "NAME: %s",
2337  name_ID ? name_ID : "Not specified");
2338  return NULL;
2339  }
2340 
2341  nrank = HECMW_comm_get_size();
2343 
2344  if (subdir_on && nrank > nlimit) {
2345  irank = myrank / nlimit;
2346  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2347  fname =
2348  make_filename(name_ID, NULL, prefix, restart->filename, "", myrank, 1);
2349 
2350  } else if (subdir_on) {
2351  fname =
2352  make_filename(name_ID, NULL, NULL, restart->filename, "", myrank, 1);
2353 
2354  } else {
2355  fname = make_filename(NULL, NULL, NULL, restart->filename, "", myrank, 1);
2356  }
2357 
2358  if (fname == NULL) {
2359  HECMW_set_error(HECMW_IO_E0002, "Cannot create restart filename");
2360  return NULL;
2361  }
2362 
2363  retfname = HECMW_strdup(fname);
2364 
2365  if (retfname == NULL) {
2366  HECMW_set_error(errno, "");
2367  return NULL;
2368  }
2369 
2370  return retfname;
2371 }
2372 
2374  int nrank, myrank, irank;
2375  char *fname, *retfname;
2376  struct restart_entry *p;
2377  char prefix[32];
2378  p = get_restart_entry_by_io(io);
2379 
2380  if (p == NULL) {
2382  return NULL;
2383  }
2384 
2385  nrank = HECMW_comm_get_size();
2387 
2388  if (subdir_on && nrank > nlimit) {
2389  irank = myrank / nlimit;
2390  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2391  fname = make_filename(p->name_ID, NULL, prefix, p->filename, "", myrank, 1);
2392 
2393  } else if (subdir_on) {
2394  fname = make_filename(p->name_ID, NULL, NULL, p->filename, "", myrank, 1);
2395 
2396  } else {
2397  fname = make_filename(NULL, NULL, NULL, p->filename, "", myrank, 1);
2398  }
2399 
2400  if (fname == NULL) {
2401  HECMW_set_error(HECMW_IO_E0002, "Cannot create restart filename");
2402  return NULL;
2403  }
2404 
2405  retfname = HECMW_strdup(fname);
2406 
2407  if (retfname == NULL) {
2408  HECMW_set_error(errno, "");
2409  return NULL;
2410  }
2411 
2412  return retfname;
2413 }
2414 
2416  char *fname;
2417  struct ctrl_entry *ctrl;
2418  ctrl = get_ctrl_entry(name_ID);
2419 
2420  if (ctrl == NULL) {
2421  HECMW_set_error(HECMW_UTIL_E0033, "NAME: %s",
2422  name_ID ? name_ID : "Not specified");
2423  return NULL;
2424  }
2425 
2426  fname = HECMW_strdup(ctrl->filename);
2427  return fname;
2428 }
2429 
2431  return get_ctrl_entry(name_ID) ? 1 : 0;
2432 }
2433 
2435  char fname[HECMW_FILENAME_LEN + 1];
2436  char dirname[HECMW_FILENAME_LEN + 1];
2437  char *token;
2438  char separator[10];
2439  char *saveptr;
2440  mode_t mode;
2441  DIR *dp;
2442 #ifndef _WINDOWS
2443  mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
2444 #endif
2445  strcpy(fname, filename);
2446  snprintf(separator, sizeof(separator), "%c", HECMW_get_path_separator());
2447 #if defined(__WIN32__) || defined(__WIN64__)
2448  /* strtok is thread-safe on Windows */
2449  token = strtok(fname, separator);
2450  snprintf(dirname, sizeof(dirname), "%s", token);
2451  token = strtok(NULL, separator);
2452 #else
2453  token = strtok_r(fname, separator, &saveptr);
2454  snprintf(dirname, sizeof(dirname), "%s", token);
2455  token = strtok_r(NULL, separator, &saveptr);
2456 #endif
2457 
2458  while (token) {
2459  if ((dp = opendir(dirname)) == NULL) {
2460 #ifndef _WINDOWS
2461 
2462  if (mkdir(dirname, mode) != 0) {
2463 #else
2464 
2465  if (mkdir(dirname) != 0) {
2466 #endif
2467 
2468  if (errno != EEXIST) return -1;
2469  }
2470 
2471  } else {
2472  closedir(dp);
2473  }
2474 
2475  strcat(dirname, separator);
2476  strcat(dirname, token);
2477 #if defined(__WIN32__) || defined(__WIN64__)
2478  token = strtok(NULL, separator);
2479 #else
2480  token = strtok_r(NULL, separator, &saveptr);
2481 #endif
2482  }
2483 
2484  return 0;
2485 }
2486 
2487 int HECMW_ctrl_is_subdir(void) { return subdir_on; }
2488 
2489 /*---------------------------------------------------------------------------*/
2490 
2491 void hecmw_ctrl_init_if(int *err) {
2492  *err = 1;
2493 
2494  if (HECMW_ctrl_init()) return;
2495 
2496  *err = 0;
2497 }
2498 
2499 void hecmw_ctrl_init_if_(int *err) { hecmw_ctrl_init_if(err); }
2500 
2502 
2503 void HECMW_CTRL_INIT_IF(int *err) { hecmw_ctrl_init_if(err); }
2504 
2505 /*---------------------------------------------------------------------------*/
2506 
2507 void hecmw_ctrl_init_ex_if(char *ctrlfile, int *err, int len) {
2508  char c_ctrlfile[HECMW_FILENAME_LEN + 1];
2509  *err = 1;
2510 
2511  if (HECMW_strcpy_f2c_r(ctrlfile, len, c_ctrlfile, sizeof(c_ctrlfile)) == NULL)
2512  return;
2513 
2514  if (HECMW_ctrl_init_ex(c_ctrlfile)) return;
2515 
2516  *err = 0;
2517 }
2518 
2519 void hecmw_ctrl_init_ex_if_(char *ctrlfile, int *err, int len) {
2520  hecmw_ctrl_init_ex_if(ctrlfile, err, len);
2521 }
2522 
2523 void hecmw_ctrl_init_ex_if__(char *ctrlfile, int *err, int len) {
2524  hecmw_ctrl_init_ex_if(ctrlfile, err, len);
2525 }
2526 
2527 void HECMW_CTRL_INIT_EX_IF(char *ctrlfile, int *err, int len) {
2528  hecmw_ctrl_init_ex_if(ctrlfile, err, len);
2529 }
2530 
2531 /*---------------------------------------------------------------------------*/
2532 
2534 
2536 
2538 
2540 
2541 /*---------------------------------------------------------------------------*/
2542 
2543 void hecmw_ctrl_get_control_file_if(char *name_ID, char *buf, int *err,
2544  int name_len, int buf_len) {
2545  char c_name_ID[HECMW_NAME_LEN + 1];
2546  char *c_buf;
2547  int ret;
2548  *err = 1;
2549 
2550  if (HECMW_strcpy_f2c_r(name_ID, name_len, c_name_ID, sizeof(c_name_ID)) ==
2551  NULL)
2552  return;
2553 
2554  if ((c_buf = HECMW_ctrl_get_control_file(c_name_ID)) == NULL) return;
2555 
2556  ret = HECMW_strcpy_c2f(c_buf, buf, buf_len);
2557  HECMW_free(c_buf);
2558 
2559  if (ret == 0) return;
2560 
2561  *err = 0;
2562 }
2563 
2564 void hecmw_ctrl_get_control_file_if_(char *name_ID, char *buf, int *err,
2565  int name_len, int buf_len) {
2566  hecmw_ctrl_get_control_file_if(name_ID, buf, err, name_len, buf_len);
2567 }
2568 
2569 void hecmw_ctrl_get_control_file_if__(char *name_ID, char *buf, int *err,
2570  int name_len, int buf_len) {
2571  hecmw_ctrl_get_control_file_if(name_ID, buf, err, name_len, buf_len);
2572 }
2573 
2574 void HECMW_CTRL_GET_CONTROL_FILE_IF(char *name_ID, char *buf, int *err,
2575  int name_len, int buf_len) {
2576  hecmw_ctrl_get_control_file_if(name_ID, buf, err, name_len, buf_len);
2577 }
2578 
2579 /*---------------------------------------------------------------------------*/
2580 
2581 void hecmw_ctrl_make_subdir(char *filename, int *err, int len) {
2582  char fname[HECMW_FILENAME_LEN + 1];
2583  *err = 1;
2584 
2585  if (HECMW_strcpy_f2c_r(filename, len, fname, sizeof(fname)) == NULL) return;
2586 
2587  if (HECMW_ctrl_make_subdir(fname) != 0) return;
2588 
2589  *err = 0;
2590 }
2591 
2592 void hecmw_ctrl_make_subdir_(char *filename, int *err, int len) {
2593  hecmw_ctrl_make_subdir(filename, err, len);
2594 }
2595 
2596 void hecmw_ctrl_make_subdir__(char *filename, int *err, int len) {
2597  hecmw_ctrl_make_subdir(filename, err, len);
2598 }
2599 
2600 void HECMW_CTRL_MAKE_SUBDIR(char *filename, int *err, int len) {
2601  hecmw_ctrl_make_subdir(filename, err, len);
2602 }
2603 
2604 /*---------------------------------------------------------------------------*/
2605 
2606 void hecmw_ctrl_is_subdir(int *flag, int *limit) {
2607  *flag = subdir_on;
2608  *limit = nlimit;
2609 }
2610 
2611 void hecmw_ctrl_is_subdir_(int *flag, int *limit) {
2612  hecmw_ctrl_is_subdir(flag, limit);
2613 }
2614 
2615 void hecmw_ctrl_is_subdir__(int *flag, int *limit) {
2616  hecmw_ctrl_is_subdir(flag, limit);
2617 }
2618 
2619 void HECMW_CTRL_IS_SUBDIR(int *flag, int *limit) {
2620  hecmw_ctrl_is_subdir(flag, limit);
2621 }
int HECMW_comm_get_rank(void)
Definition: hecmw_comm.c:759
int HECMW_comm_get_size(void)
Definition: hecmw_comm.c:755
#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
char * HECMW_ctrl_get_result_file(char *name_ID, int istep, int *fg_text)
char * HECMW_ctrl_get_restart_file(char *name_ID)
void hecmw_ctrl_init_if_(int *err)
int HECMW_ctrl_init(void)
void HECMW_ctrl_free_meshfiles(struct hecmw_ctrl_meshfiles *meshfiles)
void HECMW_CTRL_INIT_IF(int *err)
void hecmw_ctrl_init_ex_if__(char *ctrlfile, int *err, int len)
void hecmw_ctrl_init_if(int *err)
struct hecmw_ctrl_meshfiles * HECMW_ctrl_get_meshfiles(char *name_ID)
char * HECMW_ctrl_get_result_filebody(char *name_ID)
void hecmw_ctrl_finalize_if_(void)
void hecmw_ctrl_make_subdir__(char *filename, int *err, int len)
void hecmw_ctrl_is_subdir(int *flag, int *limit)
void hecmw_ctrl_is_subdir__(int *flag, int *limit)
void hecmw_ctrl_is_subdir_(int *flag, int *limit)
char * HECMW_ctrl_get_control_file(char *name_ID)
char * HECMW_ctrl_get_result_file_sub(char *name_ID, int istep, int n_rank, int i_rank, int *fg_text)
void HECMW_CTRL_FINALIZE_IF(void)
void hecmw_ctrl_init_if__(int *err)
struct hecmw_ctrl_meshfiles * HECMW_ctrl_get_meshfiles_header_sub(char *name_ID, int n_rank, int i_rank)
char * HECMW_ctrl_get_restart_file_by_io(int io)
void hecmw_ctrl_make_subdir_(char *filename, int *err, int len)
char * HECMW_ctrl_get_result_fileheader_sub(char *name_ID, int istep, int n_rank, int i_rank, int *fg_text)
void hecmw_ctrl_get_control_file_if__(char *name_ID, char *buf, int *err, int name_len, int buf_len)
struct hecmw_ctrl_meshfiles * HECMW_ctrl_get_meshfiles_header(char *name_ID)
void HECMW_CTRL_INIT_EX_IF(char *ctrlfile, int *err, int len)
int HECMW_ctrl_is_exists_control(char *name_ID)
void hecmw_ctrl_finalize_if__(void)
int HECMW_ctrl_is_subdir(void)
char * HECMW_ctrl_get_result_fileheader(char *name_ID, int istep, int *fg_text)
void hecmw_ctrl_finalize_if(void)
void HECMW_CTRL_MAKE_SUBDIR(char *filename, int *err, int len)
void hecmw_ctrl_get_control_file_if(char *name_ID, char *buf, int *err, int name_len, int buf_len)
struct hecmw_ctrl_meshfiles * HECMW_ctrl_get_meshfiles_sub(char *name_ID, int n_rank, int i_rank)
void HECMW_CTRL_GET_CONTROL_FILE_IF(char *name_ID, char *buf, int *err, int name_len, int buf_len)
int(* ReadFunc)(void)
#define N_READ_FUNC
void hecmw_ctrl_init_ex_if_(char *ctrlfile, int *err, int len)
int HECMW_ctrl_finalize(void)
void hecmw_ctrl_get_control_file_if_(char *name_ID, char *buf, int *err, int name_len, int buf_len)
void hecmw_ctrl_make_subdir(char *filename, int *err, int len)
void hecmw_ctrl_init_ex_if(char *ctrlfile, int *err, int len)
int HECMW_ctrl_make_subdir(char *filename)
void HECMW_CTRL_IS_SUBDIR(int *flag, int *limit)
int HECMW_ctrl_init_ex(const char *ctrlfile)
#define HECMW_CTRL_FTYPE_HECMW_DIST
Definition: hecmw_control.h:14
#define HECMW_CTRL_FILE
Definition: hecmw_control.h:9
#define HECMW_CTRL_FTYPE_HECMW_ENTIRE
Definition: hecmw_control.h:16
#define HECMW_CTRL_FILE_IO_OUT
Definition: hecmw_control.h:30
#define HECMW_CTRL_FTYPE_FEMAP
Definition: hecmw_control.h:24
#define HECMW_CTRL_FTYPE_NASTRAN
Definition: hecmw_control.h:22
#define HECMW_CTRL_FTYPE_GEOFEM
Definition: hecmw_control.h:18
#define HECMW_CTRL_FILE_IO_IN
Definition: hecmw_control.h:28
#define HECMW_CTRL_FILE_IO_INOUT
Definition: hecmw_control.h:37
#define HECMW_CTRL_FTYPE_ABAQUS
Definition: hecmw_control.h:20
double HECMW_ctrllex_get_number(void)
char * HECMW_ctrllex_get_text(void)
int HECMW_ctrllex_unput_token(void)
@ HECMW_CTRLLEX_K_IO
Definition: hecmw_ctrllex.h:33
@ HECMW_CTRLLEX_K_NAME
Definition: hecmw_ctrllex.h:35
@ HECMW_CTRLLEX_H_RESULT
Definition: hecmw_ctrllex.h:21
@ HECMW_CTRLLEX_K_REFINE
Definition: hecmw_ctrllex.h:40
@ HECMW_CTRLLEX_H_CONTROL
Definition: hecmw_ctrllex.h:18
@ HECMW_CTRLLEX_H_SUBDIR
Definition: hecmw_ctrllex.h:23
@ HECMW_CTRLLEX_K_LIMIT
Definition: hecmw_ctrllex.h:34
@ HECMW_CTRLLEX_H_MESH
Definition: hecmw_ctrllex.h:19
@ HECMW_CTRLLEX_K_OFF
Definition: hecmw_ctrllex.h:38
@ HECMW_CTRLLEX_H_RESTART
Definition: hecmw_ctrllex.h:22
@ HECMW_CTRLLEX_K_GEOFEM
Definition: hecmw_ctrllex.h:28
@ HECMW_CTRLLEX_K_HECMW_ENTIRE
Definition: hecmw_ctrllex.h:30
@ HECMW_CTRLLEX_INT
Definition: hecmw_ctrllex.h:13
@ HECMW_CTRLLEX_K_OUT
Definition: hecmw_ctrllex.h:39
@ HECMW_CTRLLEX_K_NASTRAN
Definition: hecmw_ctrllex.h:36
@ HECMW_CTRLLEX_K_HECMW_DIST
Definition: hecmw_ctrllex.h:29
@ HECMW_CTRLLEX_K_ABAQUS
Definition: hecmw_ctrllex.h:25
@ HECMW_CTRLLEX_FILENAME
Definition: hecmw_ctrllex.h:16
@ HECMW_CTRLLEX_K_ON
Definition: hecmw_ctrllex.h:37
@ HECMW_CTRLLEX_K_TYPE
Definition: hecmw_ctrllex.h:41
@ HECMW_CTRLLEX_H_MESH_GROUP
Definition: hecmw_ctrllex.h:20
@ HECMW_CTRLLEX_K_INOUT
Definition: hecmw_ctrllex.h:32
@ HECMW_CTRLLEX_NL
Definition: hecmw_ctrllex.h:12
@ HECMW_CTRLLEX_NAME
Definition: hecmw_ctrllex.h:15
@ HECMW_CTRLLEX_K_IN
Definition: hecmw_ctrllex.h:31
@ HECMW_CTRLLEX_K_FEMAP
Definition: hecmw_ctrllex.h:27
int HECMW_ctrllex_set_input(FILE *fp)
int HECMW_ctrllex_next_token(void)
int HECMW_ctrllex_get_lineno(void)
struct hecmwST_local_mesh * mesh
Definition: hecmw_repart.h:71
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:33
#define NULL
int HECMW_strcpy_c2f(const char *cstr, char *fstr, int flen)
Definition: hecmw_lib_fc.c:70
char * HECMW_strcpy_f2c_r(const char *fstr, int flen, char *buf, int bufsize)
Definition: hecmw_lib_fc.c:44
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_calloc(nmemb, size)
Definition: hecmw_malloc.h:21
#define HECMW_realloc(ptr, size)
Definition: hecmw_malloc.h:22
#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_UTIL_E0031
Definition: hecmw_msgno.h:346
#define HECMW_UTIL_E0011
Definition: hecmw_msgno.h:335
#define HECMW_UTIL_E0030
Definition: hecmw_msgno.h:345
#define HECMW_UTIL_E0013
Definition: hecmw_msgno.h:337
#define HECMW_UTIL_E0041
Definition: hecmw_msgno.h:350
#define HECMW_UTIL_E0051
Definition: hecmw_msgno.h:356
#define HECMW_UTIL_E0033
Definition: hecmw_msgno.h:348
#define HECMW_UTIL_E0050
Definition: hecmw_msgno.h:355
#define HECMW_UTIL_E0004
Definition: hecmw_msgno.h:332
#define HECMW_UTIL_E0022
Definition: hecmw_msgno.h:341
#define HECMW_UTIL_E0012
Definition: hecmw_msgno.h:336
#define HECMW_UTIL_E0020
Definition: hecmw_msgno.h:339
#define HECMW_UTIL_E0032
Definition: hecmw_msgno.h:347
#define HECMW_UTIL_E0023
Definition: hecmw_msgno.h:342
#define HECMW_UTIL_E0044
Definition: hecmw_msgno.h:353
#define HECMW_ALL_E0101
Definition: hecmw_msgno.h:8
#define HECMW_UTIL_E0002
Definition: hecmw_msgno.h:330
#define HECMW_UTIL_E0052
Definition: hecmw_msgno.h:357
#define HECMW_UTIL_E0053
Definition: hecmw_msgno.h:358
#define HECMW_UTIL_E0014
Definition: hecmw_msgno.h:338
#define HECMW_UTIL_E0060
Definition: hecmw_msgno.h:361
#define HECMW_IO_E0002
Definition: hecmw_msgno.h:138
#define HECMW_UTIL_E0005
Definition: hecmw_msgno.h:333
#define HECMW_UTIL_E0021
Definition: hecmw_msgno.h:340
#define HECMW_UTIL_E0040
Definition: hecmw_msgno.h:349
#define HECMW_UTIL_E0061
Definition: hecmw_msgno.h:362
#define HECMW_UTIL_E0055
Definition: hecmw_msgno.h:360
#define HECMW_UTIL_E0045
Definition: hecmw_msgno.h:354
#define HECMW_IO_E0001
Definition: hecmw_msgno.h:137
#define HECMW_UTIL_E0024
Definition: hecmw_msgno.h:343
#define HECMW_UTIL_E0042
Definition: hecmw_msgno.h:351
#define HECMW_UTIL_E0010
Definition: hecmw_msgno.h:334
#define HECMW_UTIL_E0001
Definition: hecmw_msgno.h:329
#define HECMW_UTIL_E0043
Definition: hecmw_msgno.h:352
#define HECMW_UTIL_E0003
Definition: hecmw_msgno.h:331
int HECMW_get_path_separator(void)
Definition: hecmw_path.c:34
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
void toupper(char *s)
Definition: hecd_util.cpp:38
integer(kind=kint) myrank
PARALLEL EXECUTION.
Definition: m_fstr.F90:98
Definition: hecmw_control.c:63
char * name_ID
Definition: hecmw_control.c:64
char * filename
Definition: hecmw_control.c:65
struct ctrl_entry * next
Definition: hecmw_control.c:66
struct hecmw_ctrl_meshfile * meshfiles
Definition: hecmw_control.h:42
Definition: hecmw_control.c:27
int type
Definition: hecmw_control.c:29
int refine
Definition: hecmw_control.c:31
char * filename
Definition: hecmw_control.c:32
int io
Definition: hecmw_control.c:30
char * name_ID
Definition: hecmw_control.c:28
struct mesh_entry * next
Definition: hecmw_control.c:33
Definition: hecmw_control.c:36
char * name_ID
Definition: hecmw_control.c:37
int n_mesh
Definition: hecmw_control.c:38
struct mesh_grp_entry * next
Definition: hecmw_control.c:40
struct mesh_entry ** mesh
Definition: hecmw_control.c:39
Definition: hecmw_control.c:43
char * name_ID
Definition: hecmw_control.c:44
int io
Definition: hecmw_control.c:45
char * filename
Definition: hecmw_control.c:49
struct restart_entry * next
Definition: hecmw_control.c:50
Definition: hecmw_control.c:53
int io
Definition: hecmw_control.c:55
int fg_text
Definition: hecmw_control.c:58
struct result_entry * next
Definition: hecmw_control.c:60
char * filename
Definition: hecmw_control.c:59
char * name_ID
Definition: hecmw_control.c:54