FrontISTR  6.0.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_INP) {
765  *type = HECMW_CTRL_FTYPE_INP;
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 type = -1;
877  int refine = 0;
878  char name[HECMW_NAME_LEN + 1] = "";
879  enum {
880  ST_FINISHED,
881  ST_HEADER_LINE,
882  ST_HEADER_LINE_PARAM,
883  ST_DATA_LINE,
884  };
885  state = ST_HEADER_LINE;
886 
887  while (state != ST_FINISHED) {
888  if (state == ST_HEADER_LINE) {
889  if (read_mesh_header()) return -1;
890 
891  /* set next state */
892  state = ST_HEADER_LINE_PARAM;
893 
894  } else if (state == ST_HEADER_LINE_PARAM) {
895  token = HECMW_ctrllex_next_token();
896 
897  if (token == HECMW_CTRLLEX_K_NAME) {
898  /* must */
899  if (read_mesh_head_param_name(name, sizeof(name))) return -1;
900 
901  flag_name = 1;
902 
903  } else if (token == HECMW_CTRLLEX_K_TYPE) {
904  /* must */
905  if (read_mesh_head_param_type(&type)) return -1;
906 
907  flag_type = 1;
908 
909  } else if (token == HECMW_CTRLLEX_K_IO) {
910  /* optional */
911  if (read_mesh_head_param_io(&io)) return -1;
912 
913  } else if (token == HECMW_CTRLLEX_K_REFINE) {
914  /* optional */
915  if (read_mesh_head_param_refine(&refine)) return -1;
916 
917  } else {
918  set_err_token(token, HECMW_UTIL_E0010, "Unknown parameter");
919  return -1;
920  }
921 
922  /* check next parameter */
923  token = HECMW_ctrllex_next_token();
924 
925  if (token == HECMW_CTRLLEX_NL) {
926  /* check NAME */
927  if (!flag_name) {
928  set_err(HECMW_UTIL_E0011, "");
929  return -1;
930  }
931 
932  /* check TYPE */
933  if (!flag_type) {
934  set_err(HECMW_UTIL_E0012, "");
935  return -1;
936  }
937 
938  state = ST_DATA_LINE;
939 
940  } else if (token == ',') {
941  ; /* continue this state */
942 
943  } else {
944  set_err_token(token, HECMW_UTIL_E0010, "Unknown parameter");
945  return -1;
946  }
947 
948  } else if (state == ST_DATA_LINE) {
949  HECMW_assert(flag_name);
950  HECMW_assert(flag_type);
951 
952  if (read_mesh_data(name, type, io, refine)) return -1;
953 
954  state = ST_FINISHED;
955 
956  } else {
957  HECMW_assert(0);
958  }
959  }
960 
961  /* check */
962  if (!strcmp(name, "fstrMSH") && type == HECMW_CTRL_FTYPE_HECMW_ENTIRE &&
963  HECMW_comm_get_size() > 1) {
964  set_err_token(token, HECMW_UTIL_E0010, "Invalid TYPE");
965  return -1;
966  }
967 
968  return 0;
969 }
970 
971 /*----------------------------------------------------------------------------*/
972 
973 static int read_meshgrp_header(void) {
974  int token;
975  /* !MESH GROUP */
976  token = HECMW_ctrllex_next_token();
977 
978  if (token != HECMW_CTRLLEX_H_MESH_GROUP) {
979  set_err(HECMW_UTIL_E0050, "!MESH GROUP required");
980  return -1;
981  }
982 
983  /* ',' */
984  token = HECMW_ctrllex_next_token();
985 
986  if (token != ',') {
987  set_err_token(token, HECMW_UTIL_E0050, "',' required after !MESH GROUP");
988  return -1;
989  }
990 
991  return 0;
992 }
993 
994 static int read_meshgrp_head_param_name(char *name, size_t name_len) {
995  int token;
996  char *p;
997  token = HECMW_ctrllex_next_token();
998 
999  if (token != '=') {
1000  set_err_token(token, HECMW_UTIL_E0050, "'=' required after NAME");
1001  return -1;
1002  }
1003 
1004  /* NAME value */
1005  token = HECMW_ctrllex_next_token();
1006 
1007  if (token != HECMW_CTRLLEX_NAME) {
1008  set_err_token(token, HECMW_UTIL_E0050,
1009  "NAME must begin with a letter or '_'");
1010  return -1;
1011  }
1012 
1013  p = HECMW_ctrllex_get_text();
1014 
1015  if (strlen(p) > HECMW_NAME_LEN) {
1016  set_err(HECMW_IO_E0001, "");
1017  return -1;
1018  }
1019 
1020  snprintf(name, name_len, "%s", p);
1021 
1022  /* check */
1023  if (get_mesh_entry(name) || get_mesh_grp_entry(name)) {
1024  set_err(HECMW_UTIL_E0053, "");
1025  return -1;
1026  }
1027 
1028  return 0;
1029 }
1030 
1031 static int read_meshgrp_data(char *name) {
1032  int i, token, n_mesh, n_mesh_max;
1033  char *p, **q;
1034  char **mesh = NULL;
1035  struct mesh_grp_entry *meshgrp = NULL;
1036  struct mesh_entry *ment;
1037  n_mesh_max = 10; /* default */
1038  mesh = HECMW_malloc(sizeof(*mesh) * n_mesh_max);
1039 
1040  if (mesh == NULL) {
1041  HECMW_set_error(errno, "");
1042  return -1;
1043  }
1044 
1045  n_mesh = 0;
1046 
1047  while (1) {
1048  /* filename */
1049  token = HECMW_ctrllex_next_token();
1050 
1051  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1052  if (n_mesh == 0) {
1053  set_err_token(token, HECMW_UTIL_E0050, "name_ID required");
1054  return -1;
1055  }
1056 
1058  break;
1059  }
1060 
1061  p = HECMW_ctrllex_get_text();
1062 
1063  if (strlen(p) > HECMW_FILENAME_LEN) {
1064  set_err(HECMW_IO_E0002, "");
1065  return -1;
1066  }
1067 
1068  if ((ment = get_mesh_entry(p)) == NULL) {
1069  set_err_token(token, HECMW_UTIL_E0052, "name_ID: %s", p);
1070  return -1;
1071  }
1072 
1073  if (!is_entire_mesh(ment->type)) {
1074  set_err_token(token, HECMW_UTIL_E0055, "name_ID: %s", p);
1075  return -1;
1076  }
1077 
1078  if (n_mesh == n_mesh_max) {
1079  n_mesh_max *= 2;
1080  q = HECMW_realloc(mesh, sizeof(*mesh) * n_mesh_max);
1081 
1082  if (q == NULL) {
1083  HECMW_set_error(errno, "");
1084  return -1;
1085  }
1086 
1087  mesh = q;
1088  }
1089 
1090  mesh[n_mesh] = HECMW_strdup(p);
1091 
1092  if (mesh[n_mesh] == NULL) {
1093  HECMW_set_error(errno, "");
1094  return -1;
1095  }
1096 
1097  n_mesh++;
1098  /* ',' or NL*/
1099  token = HECMW_ctrllex_next_token();
1100 
1101  if (token != HECMW_CTRLLEX_NL && token != ',') {
1102  set_err_token(token, HECMW_UTIL_E0050,
1103  "',' or NL required after name_ID");
1104  return -1;
1105  }
1106  }
1107 
1108  /* create */
1109  meshgrp = make_mesh_group_entry(name, n_mesh, mesh);
1110 
1111  if (meshgrp == NULL) return -1;
1112 
1113  /* add */
1114  if (add_mesh_group_entry(meshgrp)) return -1;
1115 
1116  for (i = 0; i < n_mesh; i++) {
1117  HECMW_free(mesh[i]);
1118  }
1119 
1120  HECMW_free(mesh);
1121  return 0;
1122 }
1123 
1124 static int read_meshgrp(void) {
1125  int token, state;
1126  int flag_name = 0; /* flag for NAME */
1127  char name[HECMW_NAME_LEN + 1] = "";
1128  enum {
1129  ST_FINISHED,
1130  ST_HEADER_LINE,
1131  ST_HEADER_LINE_PARAM,
1132  ST_DATA_LINE,
1133  };
1134  state = ST_HEADER_LINE;
1135 
1136  while (state != ST_FINISHED) {
1137  if (state == ST_HEADER_LINE) {
1138  if (read_meshgrp_header()) return -1;
1139 
1140  /* set next state */
1141  state = ST_HEADER_LINE_PARAM;
1142 
1143  } else if (state == ST_HEADER_LINE_PARAM) {
1144  token = HECMW_ctrllex_next_token();
1145 
1146  if (token == HECMW_CTRLLEX_K_NAME) {
1147  /* must */
1148  if (read_meshgrp_head_param_name(name, sizeof(name))) return -1;
1149 
1150  flag_name = 1;
1151 
1152  } else {
1153  set_err_token(token, HECMW_UTIL_E0050, "Unknown parameter");
1154  return -1;
1155  }
1156 
1157  /* check next parameter */
1158  token = HECMW_ctrllex_next_token();
1159 
1160  if (token == HECMW_CTRLLEX_NL) {
1161  /* check NAME */
1162  if (!flag_name) {
1163  set_err(HECMW_UTIL_E0051, "");
1164  return -1;
1165  }
1166 
1167  state = ST_DATA_LINE;
1168 
1169  } else if (token == ',') {
1170  ; /* continue this state */
1171 
1172  } else {
1173  set_err_token(token, HECMW_UTIL_E0050, "Unknown parameter");
1174  return -1;
1175  }
1176 
1177  } else if (state == ST_DATA_LINE) {
1178  HECMW_assert(flag_name);
1179 
1180  if (read_meshgrp_data(name)) return -1;
1181 
1182  state = ST_FINISHED;
1183 
1184  } else {
1185  HECMW_assert(0);
1186  }
1187  }
1188 
1189  return 0;
1190 }
1191 
1192 /*----------------------------------------------------------------------------*/
1193 
1194 static int read_result_head(void) {
1195  int token;
1196  /* !RESULT */
1197  token = HECMW_ctrllex_next_token();
1198 
1199  if (token != HECMW_CTRLLEX_H_RESULT) {
1200  set_err(HECMW_UTIL_E0020, "!RESULT required");
1201  return -1;
1202  }
1203 
1204  /* ',' */
1205  token = HECMW_ctrllex_next_token();
1206 
1207  if (token != ',') {
1208  set_err_token(token, HECMW_UTIL_E0020, "',' required after !RESULT");
1209  return -1;
1210  }
1211 
1212  return 0;
1213 }
1214 
1215 static int read_result_param_name(char *name, size_t name_len) {
1216  int token;
1217  char *p;
1218  token = HECMW_ctrllex_next_token();
1219 
1220  if (token != '=') {
1221  set_err_token(token, HECMW_UTIL_E0020, "'=' required after NAME");
1222  return -1;
1223  }
1224 
1225  /* NAME value */
1226  token = HECMW_ctrllex_next_token();
1227 
1228  if (token != HECMW_CTRLLEX_NAME) {
1229  set_err_token(token, HECMW_UTIL_E0020,
1230  "NAME must begin with a letter or '_'");
1231  return -1;
1232  }
1233 
1234  p = HECMW_ctrllex_get_text();
1235 
1236  if (strlen(p) > HECMW_NAME_LEN) {
1237  set_err(HECMW_IO_E0001, "");
1238  return -1;
1239  }
1240 
1241  snprintf(name, name_len, "%s", p);
1242 
1243  /* check */
1244  if (get_result_entry(name)) {
1245  set_err(HECMW_UTIL_E0023, "");
1246  return -1;
1247  }
1248 
1249  return 0;
1250 }
1251 
1252 static int read_result_param_io(int *io) {
1253  int token;
1254  token = HECMW_ctrllex_next_token();
1255 
1256  if (token != '=') {
1257  set_err_token(token, HECMW_UTIL_E0020, "'=' required after IO");
1258  return -1;
1259  }
1260 
1261  /* IO value */
1262  token = HECMW_ctrllex_next_token();
1263 
1264  if (token == HECMW_CTRLLEX_K_IN) {
1266 
1267  } else if (token == HECMW_CTRLLEX_K_OUT) {
1269 
1270  } else {
1271  set_err_token(token, HECMW_UTIL_E0020, "Invalid IO");
1272  return -1;
1273  }
1274 
1275  return 0;
1276 }
1277 
1278 static int read_result_param_type(int *fg_text) {
1279  int token;
1280  char s[HECMW_NAME_LEN + 1];
1281  char *p;
1282  char *sp;
1283  token = HECMW_ctrllex_next_token();
1284 
1285  if (token != '=') {
1286  set_err_token(token, HECMW_UTIL_E0020, "'=' required after TYPE");
1287  return -1;
1288  }
1289 
1290  /* TYPE value */
1291  token = HECMW_ctrllex_next_token();
1292  p = HECMW_ctrllex_get_text();
1293 
1294  if (strlen(p) > HECMW_NAME_LEN) {
1295  set_err(HECMW_UTIL_E0020, "");
1296  return -1;
1297  }
1298 
1299  sp = s;
1300 
1301  while (*p) {
1302  *sp = (char)toupper(*p);
1303  p++;
1304  sp++;
1305  }
1306 
1307  *sp = 0;
1308 
1309  if (strcmp(s, "TEXT") == 0) {
1310  *fg_text = 1;
1311 
1312  } else if (strcmp(s, "BINARY") == 0) {
1313  *fg_text = 0;
1314 
1315  } else {
1316  set_err(HECMW_UTIL_E0020, "TEXT or BINARY required");
1317  return -1;
1318  }
1319 
1320  return 0;
1321 }
1322 
1323 static int read_result_data(char *name, int io, int fg_text) {
1324  int token;
1325  char *p;
1326  struct result_entry *result;
1327  /* filename */
1328  token = HECMW_ctrllex_next_token();
1329 
1330  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1331  set_err_token(token, HECMW_UTIL_E0020, "Invalid filename");
1332  }
1333 
1334  p = HECMW_ctrllex_get_text();
1335 
1336  if (strlen(p) > HECMW_FILENAME_LEN) {
1337  set_err(HECMW_IO_E0002, "NL required after filename");
1338  return -1;
1339  }
1340 
1341  /* create */
1342  result = make_result_entry(name, io, fg_text, p);
1343 
1344  if (result == NULL) return -1;
1345 
1346  /* add */
1347  if (add_result_entry(result)) return -1;
1348 
1349  /* NL*/
1350  token = HECMW_ctrllex_next_token();
1351 
1352  if (token != HECMW_CTRLLEX_NL) {
1353  set_err_token(token, HECMW_UTIL_E0020, "NL required after filename");
1354  return -1;
1355  }
1356 
1357  return 0;
1358 }
1359 
1360 static int read_result(void) {
1361  int token, state;
1362  int flag_name = 0; /* flag for NAME */
1363  int flag_io = 0; /* flag for IO */
1364  int io;
1365  int fg_text; /* default : text */
1366  char name[HECMW_NAME_LEN + 1] = "";
1367  enum {
1368  ST_FINISHED,
1369  ST_HEADER_LINE,
1370  ST_HEADER_LINE_PARAM,
1371  ST_DATA_LINE,
1372  };
1373  fg_text = 1;
1374  state = ST_HEADER_LINE;
1375 
1376  while (state != ST_FINISHED) {
1377  if (state == ST_HEADER_LINE) {
1378  if (read_result_head()) return -1;
1379 
1380  state = ST_HEADER_LINE_PARAM;
1381 
1382  } else if (state == ST_HEADER_LINE_PARAM) {
1383  token = HECMW_ctrllex_next_token();
1384 
1385  if (token == HECMW_CTRLLEX_K_NAME) {
1386  /* must */
1387  if (read_result_param_name(name, sizeof(name))) return -1;
1388 
1389  flag_name = 1;
1390 
1391  } else if (token == HECMW_CTRLLEX_K_IO) {
1392  /* must */
1393  if (read_result_param_io(&io)) return -1;
1394 
1395  flag_io = 1;
1396 
1397  } else if (token == HECMW_CTRLLEX_K_TYPE) {
1398  /* option */
1399  if (read_result_param_type(&fg_text)) return -1;
1400 
1401  } else {
1402  set_err_token(token, HECMW_UTIL_E0020, "Unknown parameter");
1403  return -1;
1404  }
1405 
1406  /* check next parameter */
1407  token = HECMW_ctrllex_next_token();
1408 
1409  if (token == HECMW_CTRLLEX_NL) {
1410  /* check NAME */
1411  if (!flag_name) {
1412  set_err(HECMW_UTIL_E0021, "");
1413  return -1;
1414  }
1415 
1416  /* check IO */
1417  if (!flag_io) {
1418  set_err(HECMW_UTIL_E0022, "");
1419  return -1;
1420  }
1421 
1422  state = ST_DATA_LINE;
1423 
1424  } else if (token == ',') {
1425  ; /* continue this state */
1426 
1427  } else {
1428  set_err_token(token, HECMW_UTIL_E0020, "Unknown parameter");
1429  return -1;
1430  }
1431 
1432  } else if (state == ST_DATA_LINE) {
1433  HECMW_assert(flag_name);
1434 
1435  if (read_result_data(name, io, fg_text)) return -1;
1436 
1437  state = ST_FINISHED;
1438 
1439  } else {
1440  HECMW_assert(0);
1441  }
1442  }
1443 
1444  return 0;
1445 }
1446 
1447 /*----------------------------------------------------------------------------*/
1448 
1449 static int read_restart_head(void) {
1450  int token;
1451  /* !RESULT */
1452  token = HECMW_ctrllex_next_token();
1453 
1454  if (token != HECMW_CTRLLEX_H_RESTART) {
1455  set_err(HECMW_UTIL_E0040, "!RESTART required");
1456  return -1;
1457  }
1458 
1459  /* ',' */
1460  token = HECMW_ctrllex_next_token();
1461 
1462  if (token != ',') {
1463  set_err_token(token, HECMW_UTIL_E0040, "',' required after !RESTART");
1464  return -1;
1465  }
1466 
1467  return 0;
1468 }
1469 
1470 static int read_restart_param_name(char *name, size_t name_len) {
1471  int token;
1472  char *p;
1473  token = HECMW_ctrllex_next_token();
1474 
1475  if (token != '=') {
1476  set_err_token(token, HECMW_UTIL_E0040, "'=' required after NAME");
1477  return -1;
1478  }
1479 
1480  /* NAME value */
1481  token = HECMW_ctrllex_next_token();
1482 
1483  if (token != HECMW_CTRLLEX_NAME) {
1484  set_err_token(token, HECMW_UTIL_E0040,
1485  "NAME must begin with a letter or '_'");
1486  return -1;
1487  }
1488 
1489  p = HECMW_ctrllex_get_text();
1490 
1491  if (strlen(p) > HECMW_NAME_LEN) {
1492  set_err(HECMW_IO_E0001, "");
1493  return -1;
1494  }
1495 
1496  snprintf(name, name_len, "%s", p);
1497 
1498  /* check */
1499  if (get_restart_entry(name)) {
1500  set_err(HECMW_UTIL_E0043, "");
1501  return -1;
1502  }
1503 
1504  return 0;
1505 }
1506 
1507 static int read_restart_param_io(int *io) {
1508  int token;
1509  token = HECMW_ctrllex_next_token();
1510 
1511  if (token != '=') {
1512  set_err_token(token, HECMW_UTIL_E0040, "'=' required after IO");
1513  return -1;
1514  }
1515 
1516  /* IO value */
1517  token = HECMW_ctrllex_next_token();
1518 
1519  if (token == HECMW_CTRLLEX_K_IN) {
1521 
1522  } else if (token == HECMW_CTRLLEX_K_OUT) {
1524 
1525  } else if (token == HECMW_CTRLLEX_K_INOUT) {
1527 
1528  } else {
1529  set_err_token(token, HECMW_UTIL_E0040, "Invalid IO");
1530  return -1;
1531  }
1532 
1533  return 0;
1534 }
1535 
1536 static int read_restart_data(char *name, int io) {
1537  int token;
1538  char *p;
1539  struct restart_entry *restart;
1540  /* filename */
1541  token = HECMW_ctrllex_next_token();
1542 
1543  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1544  set_err_token(token, HECMW_UTIL_E0040, "Invalid filename");
1545  }
1546 
1547  p = HECMW_ctrllex_get_text();
1548 
1549  if (strlen(p) > HECMW_FILENAME_LEN) {
1550  set_err(HECMW_IO_E0002, "NL required after filename");
1551  return -1;
1552  }
1553 
1554  /* create */
1555  restart = make_restart_entry(name, io, p);
1556 
1557  if (restart == NULL) return -1;
1558 
1559  /* add */
1560  if (add_restart_entry(restart)) return -1;
1561 
1562  /* NL*/
1563  token = HECMW_ctrllex_next_token();
1564 
1565  if (token != HECMW_CTRLLEX_NL) {
1566  set_err_token(token, HECMW_UTIL_E0040, "NL required after filename");
1567  return -1;
1568  }
1569 
1570  return 0;
1571 }
1572 
1573 static int read_restart(void) {
1574  int token, state;
1575  int flag_name = 0; /* flag for NAME */
1576  int flag_io = 0; /* flag for IO */
1577  int io;
1578  char name[HECMW_NAME_LEN + 1] = "";
1579  enum {
1580  ST_FINISHED,
1581  ST_HEADER_LINE,
1582  ST_HEADER_LINE_PARAM,
1583  ST_DATA_LINE,
1584  };
1585  state = ST_HEADER_LINE;
1586 
1587  while (state != ST_FINISHED) {
1588  if (state == ST_HEADER_LINE) {
1589  if (read_restart_head()) return -1;
1590 
1591  /* set next state */
1592  state = ST_HEADER_LINE_PARAM;
1593 
1594  } else if (state == ST_HEADER_LINE_PARAM) {
1595  token = HECMW_ctrllex_next_token();
1596 
1597  if (token == HECMW_CTRLLEX_K_NAME) {
1598  /* must */
1599  if (read_restart_param_name(name, sizeof(name))) return -1;
1600 
1601  flag_name = 1;
1602 
1603  } else if (token == HECMW_CTRLLEX_K_IO) {
1604  /* must */
1605  if (read_restart_param_io(&io)) return -1;
1606 
1607  flag_io = 1;
1608 
1609  } else {
1610  set_err_token(token, HECMW_UTIL_E0040, "Unknown parameter");
1611  return -1;
1612  }
1613 
1614  /* check next parameter */
1615  token = HECMW_ctrllex_next_token();
1616 
1617  if (token == HECMW_CTRLLEX_NL) {
1618  /* check NAME */
1619  if (!flag_name) {
1620  set_err(HECMW_UTIL_E0041, "");
1621  return -1;
1622  }
1623 
1624  /* check IO */
1625  if (!flag_io) {
1626  set_err(HECMW_UTIL_E0042, "");
1627  return -1;
1628  }
1629 
1630  state = ST_DATA_LINE;
1631 
1632  } else if (token == ',') {
1633  ; /* continue this state */
1634 
1635  } else {
1636  set_err_token(token, HECMW_UTIL_E0040, "Unknown parameter");
1637  return -1;
1638  }
1639 
1640  } else if (state == ST_DATA_LINE) {
1641  HECMW_assert(flag_name);
1642  HECMW_assert(flag_io);
1643 
1644  if (read_restart_data(name, io)) return -1;
1645 
1646  state = ST_FINISHED;
1647 
1648  } else {
1649  HECMW_assert(0);
1650  }
1651  }
1652 
1653  return 0;
1654 }
1655 
1656 /*----------------------------------------------------------------------------*/
1657 
1658 static int read_control_head(void) {
1659  int token;
1660  /* !CONTROL */
1661  token = HECMW_ctrllex_next_token();
1662 
1663  if (token != HECMW_CTRLLEX_H_CONTROL) {
1664  set_err(HECMW_UTIL_E0030, "!CONTROL required");
1665  return -1;
1666  }
1667 
1668  /* ',' */
1669  token = HECMW_ctrllex_next_token();
1670 
1671  if (token != ',') {
1672  set_err_token(token, HECMW_UTIL_E0030, "',' required after !CONTROL");
1673  return -1;
1674  }
1675 
1676  return 0;
1677 }
1678 
1679 static int read_control_head_param_name(char *name, size_t name_len) {
1680  int token;
1681  char *p;
1682  token = HECMW_ctrllex_next_token();
1683 
1684  if (token != '=') {
1685  set_err_token(token, HECMW_UTIL_E0030, "'=' required after NAME");
1686  return -1;
1687  }
1688 
1689  /* NAME value */
1690  token = HECMW_ctrllex_next_token();
1691 
1692  if (token != HECMW_CTRLLEX_NAME) {
1693  set_err_token(token, HECMW_UTIL_E0030,
1694  "NAME must begin with a letter or '_'");
1695  return -1;
1696  }
1697 
1698  p = HECMW_ctrllex_get_text();
1699 
1700  if (strlen(p) > HECMW_NAME_LEN) {
1701  set_err(HECMW_IO_E0001, "");
1702  return -1;
1703  }
1704 
1705  snprintf(name, name_len, "%s", p);
1706 
1707  /* check */
1708  if (get_ctrl_entry(name)) {
1709  set_err(HECMW_UTIL_E0032, "");
1710  return -1;
1711  }
1712 
1713  return 0;
1714 }
1715 
1716 static int read_control_data(char *name) {
1717  int token;
1718  char *p;
1719  struct ctrl_entry *control;
1720  /* filename */
1721  token = HECMW_ctrllex_next_token();
1722 
1723  if (token != HECMW_CTRLLEX_NAME && token != HECMW_CTRLLEX_FILENAME) {
1724  set_err_token(token, HECMW_UTIL_E0030, "Invalid filename");
1725  return -1;
1726  }
1727 
1728  p = HECMW_ctrllex_get_text();
1729 
1730  if (strlen(p) > HECMW_FILENAME_LEN) {
1731  set_err(HECMW_IO_E0002, "NL required after filename");
1732  return -1;
1733  }
1734 
1735  /* create */
1736  control = make_ctrl_entry(name, p);
1737 
1738  if (control == NULL) {
1739  return -1;
1740  }
1741 
1742  /* add */
1743  if (add_ctrl_entry(control)) {
1744  return -1;
1745  }
1746 
1747  /* NL*/
1748  token = HECMW_ctrllex_next_token();
1749 
1750  if (token != HECMW_CTRLLEX_NL) {
1751  set_err_token(token, HECMW_UTIL_E0030, "NL required after filename");
1752  return -1;
1753  }
1754 
1755  return 0;
1756 }
1757 
1758 static int read_control(void) {
1759  int token, state;
1760  int flag_name = 0; /* flag for NAME */
1761  char name[HECMW_NAME_LEN + 1] = "";
1762  enum {
1763  ST_FINISHED,
1764  ST_HEADER_LINE,
1765  ST_HEADER_LINE_PARAM,
1766  ST_DATA_LINE,
1767  };
1768  state = ST_HEADER_LINE;
1769 
1770  while (state != ST_FINISHED) {
1771  if (state == ST_HEADER_LINE) {
1772  if (read_control_head()) return -1;
1773 
1774  /* set next state */
1775  state = ST_HEADER_LINE_PARAM;
1776 
1777  } else if (state == ST_HEADER_LINE_PARAM) {
1778  token = HECMW_ctrllex_next_token();
1779 
1780  if (token == HECMW_CTRLLEX_K_NAME) {
1781  /* must */
1782  if (read_control_head_param_name(name, sizeof(name))) return -1;
1783 
1784  flag_name = 1;
1785 
1786  } else {
1787  set_err_token(token, HECMW_UTIL_E0030, "Unknown parameter");
1788  return -1;
1789  }
1790 
1791  /* check next parameter */
1792  token = HECMW_ctrllex_next_token();
1793 
1794  if (token == HECMW_CTRLLEX_NL) {
1795  /* check NAME */
1796  if (!flag_name) {
1797  set_err(HECMW_UTIL_E0031, "");
1798  return -1;
1799  }
1800 
1801  state = ST_DATA_LINE;
1802 
1803  } else if (token == ',') {
1804  ; /* continue this state */
1805 
1806  } else {
1807  set_err_token(token, HECMW_UTIL_E0030, "Unknown parameter");
1808  return -1;
1809  }
1810 
1811  } else if (state == ST_DATA_LINE) {
1812  HECMW_assert(flag_name);
1813 
1814  if (read_control_data(name)) return -1;
1815 
1816  state = ST_FINISHED;
1817 
1818  } else {
1819  HECMW_assert(0);
1820  }
1821  }
1822 
1823  return 0;
1824 }
1825 
1826 /*----------------------------------------------------------------------------*/
1827 
1828 static int read_subdir_head(void) {
1829  int token;
1830  /* !SUBDIR */
1831  token = HECMW_ctrllex_next_token();
1832 
1833  if (token != HECMW_CTRLLEX_H_SUBDIR) {
1834  set_err(HECMW_UTIL_E0060, "!SUBDIR required");
1835  return -1;
1836  }
1837 
1838  /* ',' */
1839  token = HECMW_ctrllex_next_token();
1840 
1841  if (token != ',') {
1842  set_err_token(token, HECMW_UTIL_E0060, "',' required after !SUBDIR");
1843  return -1;
1844  }
1845 
1846  return 0;
1847 }
1848 
1849 static int read_subdir_head_param_limit(void) {
1850  int token;
1851  token = HECMW_ctrllex_next_token();
1852 
1853  if (token != '=') {
1854  set_err_token(token, HECMW_UTIL_E0060, "'=' required after LIMIT");
1855  return -1;
1856  }
1857 
1858  /* LIMIT value */
1859  token = HECMW_ctrllex_next_token();
1860 
1861  if (token != HECMW_CTRLLEX_INT) {
1862  set_err_token(token, HECMW_UTIL_E0060, "Invalid LIMIT");
1863  return -1;
1864 
1865  } else {
1866  nlimit = HECMW_ctrllex_get_number();
1867  }
1868 
1869  return 0;
1870 }
1871 
1872 static int read_subdir(void) {
1873  int token, state;
1874  int flag_name = 0; /* flag for NAME */
1875  enum {
1876  ST_FINISHED,
1877  ST_HEADER_LINE,
1878  ST_HEADER_LINE_PARAM,
1879  };
1880  nlimit = 5000;
1881  state = ST_HEADER_LINE;
1882 
1883  while (state != ST_FINISHED) {
1884  if (state == ST_HEADER_LINE) {
1885  if (read_subdir_head()) return -1;
1886 
1887  /* set next state */
1888  state = ST_HEADER_LINE_PARAM;
1889 
1890  } else if (state == ST_HEADER_LINE_PARAM) {
1891  token = HECMW_ctrllex_next_token();
1892 
1893  if (token == HECMW_CTRLLEX_K_ON) {
1894  /* must */
1895  subdir_on = 1;
1896  flag_name = 1;
1897 
1898  } else if (token == HECMW_CTRLLEX_K_OFF) {
1899  /* must */
1900  subdir_on = 0;
1901  flag_name = 1;
1902 
1903  } else if (token == HECMW_CTRLLEX_K_LIMIT) {
1904  if (read_subdir_head_param_limit()) return -1;
1905 
1906  } else {
1907  set_err_token(token, HECMW_UTIL_E0060, "Unknown parameter");
1908  return -1;
1909  }
1910 
1911  /* check next parameter */
1912  token = HECMW_ctrllex_next_token();
1913 
1914  if (token == HECMW_CTRLLEX_NL) {
1915  if (!flag_name) {
1916  set_err(HECMW_UTIL_E0061, "");
1917  return -1;
1918  }
1919 
1920  state = ST_FINISHED;
1921 
1922  } else if (token == ',') {
1923  ; /* continue this state */
1924 
1925  } else {
1926  set_err_token(token, HECMW_UTIL_E0060, "Unknown parameter");
1927  return -1;
1928  }
1929 
1930  } else {
1931  HECMW_assert(0);
1932  }
1933  }
1934 
1935  return 0;
1936 }
1937 
1938 /*------------------------------------------------------------------------------
1939  ReadFunc table
1940 */
1941 
1942 typedef int (*ReadFunc)(void);
1943 
1944 static struct read_func_table {
1945  int token;
1946  ReadFunc func;
1947 } read_func_table[] = {
1948  {HECMW_CTRLLEX_H_CONTROL, read_control},
1949  {HECMW_CTRLLEX_H_MESH, read_mesh},
1950  {HECMW_CTRLLEX_H_MESH_GROUP, read_meshgrp},
1951  {HECMW_CTRLLEX_H_RESULT, read_result},
1952  {HECMW_CTRLLEX_H_RESTART, read_restart},
1953  {HECMW_CTRLLEX_H_SUBDIR, read_subdir},
1954 };
1955 
1956 #define N_READ_FUNC (sizeof(read_func_table) / sizeof(read_func_table[0]))
1957 
1958 /* static int (* get_read_func(int token))(void) */
1959 static ReadFunc get_read_func(int token) {
1960  int i;
1961 
1962  for (i = 0; i < N_READ_FUNC; i++) {
1963  if (token == read_func_table[i].token) {
1964  return read_func_table[i].func;
1965  }
1966  }
1967 
1968  return NULL;
1969 }
1970 
1971 /*----------------------------------------------------------------------------*/
1972 
1973 static int parse(void) {
1974  int token;
1975  ReadFunc func;
1976 
1977  while ((token = HECMW_ctrllex_next_token())) {
1978  if (token == HECMW_CTRLLEX_NL) continue;
1979 
1980  func = get_read_func(token);
1981 
1982  if (func == NULL) {
1983  char *p = HECMW_ctrllex_get_text();
1984 
1985  if (p[0] == '!') {
1986  set_err(HECMW_UTIL_E0004, "");
1987 
1988  } else {
1989  set_err(HECMW_UTIL_E0005, "");
1990  }
1991 
1992  return -1;
1993  }
1994 
1995  HECMW_ctrllex_unput_token(); /* unput !XXXX */
1996 
1997  if ((*func)()) return -1;
1998  }
1999 
2000  return 0;
2001 }
2002 
2003 int HECMW_ctrl_init_ex(const char *ctrlfile) {
2004  FILE *fp;
2005  HECMW_log(HECMW_LOG_DEBUG, "Getting control data");
2006 
2007  if (ctrlfile == NULL) {
2008  HECMW_set_error(HECMW_ALL_E0101, "Not specified control file name");
2009  return -1;
2010  }
2011 
2012  snprintf(ctrl_filename, sizeof(ctrl_filename), "%s", ctrlfile);
2013  HECMW_log(HECMW_LOG_DEBUG, "Control file is '%s'", ctrl_filename);
2014 
2015  if ((fp = fopen(ctrl_filename, "r")) == NULL) {
2016  HECMW_set_error(HECMW_UTIL_E0001, "File: %s, %s", ctrl_filename,
2017  strerror(errno));
2018  return -1;
2019  }
2020 
2021  if (HECMW_ctrllex_set_input(fp)) return -1;
2022 
2023  if (parse()) {
2024  return -1;
2025  }
2026 
2027  if (fclose(fp)) {
2028  HECMW_set_error(HECMW_UTIL_E0002, "File: %s, %s", ctrl_filename,
2029  strerror(errno));
2030  return -1;
2031  }
2032 
2033  return 0;
2034 }
2035 
2037 
2039  HECMW_log(HECMW_LOG_DEBUG, "Finalizing control data");
2040  free_ctrl_entry();
2041  free_mesh_entry();
2042  free_mesh_grp_entry();
2043  free_result_entry();
2044  free_restart_entry();
2045  return 0;
2046 }
2047 
2049  int i;
2050 
2051  for (i = 0; i < meshfiles->n_mesh; i++) {
2052  HECMW_free(meshfiles->meshfiles[i].filename);
2053  }
2054 
2055  HECMW_free(meshfiles->meshfiles);
2056  HECMW_free(meshfiles);
2057 }
2058 
2059 static struct hecmw_ctrl_meshfiles *make_meshfiles_struct(
2060  int n_mesh, struct mesh_entry **mesh, int n_rank, int i_rank,
2061  int flag_rank_none) {
2062  int i, flag_rank, nrank, myrank, irank;
2063  char *fname;
2064  char *retval;
2065  struct hecmw_ctrl_meshfiles *files;
2066  char prefix[32];
2067  files = HECMW_malloc(sizeof(*files));
2068 
2069  if (files == NULL) {
2070  HECMW_set_error(errno, "");
2071  return NULL;
2072  }
2073 
2074  if (n_rank == 0) {
2075  nrank = HECMW_comm_get_size();
2077 
2078  } else {
2079  nrank = n_rank;
2080  myrank = i_rank;
2081  }
2082 
2083  files->n_mesh = n_mesh;
2084  files->meshfiles = HECMW_malloc(sizeof(*files->meshfiles) * n_mesh);
2085 
2086  if (files->meshfiles == NULL) {
2087  HECMW_set_error(errno, "");
2088  return NULL;
2089  }
2090 
2091  for (i = 0; i < n_mesh; i++) {
2092  struct hecmw_ctrl_meshfile *file = &files->meshfiles[i];
2093  struct mesh_entry *ment = mesh[i];
2094  file->type = ment->type;
2095  file->io = ment->io;
2096  file->refine = ment->refine;
2097 
2098  if (flag_rank_none) {
2099  flag_rank = 0;
2100 
2101  } else {
2102  if (is_entire_mesh(file->type)) {
2103  flag_rank = 0;
2104 
2105  } else {
2106  flag_rank = 1;
2107  }
2108  }
2109 
2110  fname = HECMW_malloc(sizeof(char) * (HECMW_FILENAME_LEN + 1));
2111 
2112  if (fname == NULL) {
2113  HECMW_set_error(errno, "");
2114  return NULL;
2115  }
2116 
2117  if (ment->type == HECMW_CTRL_FTYPE_HECMW_ENTIRE) {
2118  retval = make_filename_r(NULL, NULL, NULL, ment->filename, "", myrank,
2119  flag_rank, fname, HECMW_FILENAME_LEN);
2120 
2121  } else {
2122  if (subdir_on && nrank > nlimit) {
2123  irank = myrank / nlimit;
2124  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2125  retval = make_filename_r("MESH", NULL, prefix, ment->filename, "", myrank,
2126  flag_rank, fname, HECMW_FILENAME_LEN);
2127 
2128  } else if (subdir_on && ment->type == HECMW_CTRL_FTYPE_HECMW_DIST) {
2129  retval = make_filename_r("MESH", NULL, NULL, ment->filename, "", myrank,
2130  flag_rank, fname, HECMW_FILENAME_LEN);
2131 
2132  } else if (subdir_on && nrank > 1) {
2133  retval = make_filename_r("MESH", NULL, NULL, ment->filename, "", myrank,
2134  flag_rank, fname, HECMW_FILENAME_LEN);
2135 
2136  } else {
2137  retval = make_filename_r(NULL, NULL, NULL, ment->filename, "", myrank,
2138  flag_rank, fname, HECMW_FILENAME_LEN);
2139  }
2140  }
2141 
2142  if (retval == NULL) {
2143  HECMW_set_error(HECMW_IO_E0002, "Cannot create mesh filename");
2144  HECMW_free(fname);
2145  return NULL;
2146  }
2147 
2148  file->filename = fname;
2149  }
2150 
2151  return files;
2152 }
2153 
2154 static struct hecmw_ctrl_meshfiles *get_meshfiles(char *name_ID, int n_rank,
2155  int i_rank,
2156  int flag_rank_none) {
2157  struct mesh_entry *mesh;
2158  struct mesh_grp_entry *mesh_grp;
2159  struct hecmw_ctrl_meshfiles *files = NULL;
2160  mesh_grp = get_mesh_grp_entry(name_ID);
2161 
2162  if (mesh_grp) {
2163  files = make_meshfiles_struct(mesh_grp->n_mesh, mesh_grp->mesh, n_rank,
2164  i_rank, flag_rank_none);
2165 
2166  if (files == NULL) return NULL;
2167  }
2168 
2169  if (files == NULL) {
2170  mesh = get_mesh_entry(name_ID);
2171 
2172  if (mesh) {
2173  files = make_meshfiles_struct(1, &mesh, n_rank, i_rank, flag_rank_none);
2174 
2175  if (files == NULL) return NULL;
2176  }
2177  }
2178 
2179  if (files == NULL) {
2180  HECMW_set_error(HECMW_UTIL_E0014, "NAME: %s", name_ID);
2181  return NULL;
2182  }
2183 
2184  return files;
2185 }
2186 
2188  return get_meshfiles(name_ID, 0, 0, 0);
2189 }
2190 
2192  return get_meshfiles(name_ID, 0, 0, 1);
2193 }
2194 
2196  int n_rank,
2197  int i_rank) {
2198  return get_meshfiles(name_ID, n_rank, i_rank, 0);
2199 }
2200 
2202  int n_rank,
2203  int i_rank) {
2204  return get_meshfiles(name_ID, n_rank, i_rank, 1);
2205 }
2206 
2207 int HECMW_ctrl_get_entire_mesh(char* filename,int len){
2208  struct hecmw_ctrl_meshfiles *files;
2209  files = HECMW_ctrl_get_meshfiles("fstrMSH");
2210  if (files == NULL) return 0;
2211 
2212  if (files->n_mesh == 1 &&
2214  snprintf(filename, len, "%s", files->meshfiles[0].filename);
2216  return 1;
2217  }
2219  return 0;
2220 }
2221 
2222 static char *get_result_file(char *name_ID, int istep, int n_rank,
2223  int i_rank, int *fg_text, int flag_rank_none) {
2224  int nrank, myrank, irank;
2225  char *fname, *retfname;
2226  struct result_entry *result;
2227  char subname[32], prefix[32];
2228  result = get_result_entry(name_ID);
2229 
2230  if (result == NULL) {
2231  HECMW_set_error(HECMW_UTIL_E0024, "NAME: %s",
2232  name_ID ? name_ID : "Not specified");
2233  return NULL;
2234  }
2235 
2236  if (n_rank == 0) {
2237  nrank = HECMW_comm_get_size();
2239 
2240  } else {
2241  nrank = n_rank;
2242  myrank = i_rank;
2243  }
2244 
2245  if (subdir_on && !strcmp(name_ID, "vis_out")) {
2246  fname = make_filename(name_ID, NULL, NULL, result->filename, "", myrank,
2247  flag_rank_none);
2248 
2249  } else if (subdir_on && nrank > nlimit) {
2250  snprintf(subname, sizeof(subname), "STEP%d", istep);
2251  irank = myrank / nlimit;
2252  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2253  fname = make_filename(name_ID, subname, prefix, result->filename, "",
2254  myrank, flag_rank_none);
2255 
2256  } else if (subdir_on) {
2257  snprintf(subname, sizeof(subname), "STEP%d", istep);
2258  fname = make_filename(name_ID, subname, NULL, result->filename, "", myrank,
2259  flag_rank_none);
2260 
2261  } else {
2262  fname = make_filename(NULL, NULL, NULL, result->filename, "", myrank,
2263  flag_rank_none);
2264  }
2265 
2266  if (fname == NULL) {
2267  HECMW_set_error(HECMW_IO_E0002, "Cannot create result filename");
2268  return NULL;
2269  }
2270 
2271  retfname = HECMW_strdup(fname);
2272 
2273  if (retfname == NULL) {
2274  HECMW_set_error(errno, "");
2275  return NULL;
2276  }
2277 
2278  *fg_text = result->fg_text;
2279  return retfname;
2280 }
2281 
2282 static char *get_filename_body(char *file) {
2283  static char filename[HECMW_FILENAME_LEN+1];
2284  snprintf(filename, sizeof(filename), "%s", file);
2285  return filename;
2286 }
2287 
2288 static char *get_result_filebody(char *name_ID) {
2289  struct result_entry *result;
2290  char *fname, *retfname;
2291 
2292  result = get_result_entry(name_ID);
2293 
2294  if (result == NULL) {
2295  HECMW_set_error(HECMW_UTIL_E0024, "NAME: %s",
2296  name_ID ? name_ID : "Not specified");
2297  return NULL;
2298  }
2299 
2300  fname = get_filename_body(result->filename);
2301 
2302  retfname = HECMW_strdup(fname);
2303 
2304  if (retfname == NULL) {
2305  HECMW_set_error(errno, "");
2306  return NULL;
2307  }
2308 
2309  return retfname;
2310 }
2311 
2312 char *HECMW_ctrl_get_result_file(char *name_ID, int istep,
2313  int *fg_text) {
2314  return get_result_file(name_ID, istep, 0, 0, fg_text, 1);
2315 }
2316 
2318  int *fg_text) {
2319  return get_result_file(name_ID, istep, 0, 0, fg_text, 0);
2320 }
2321 
2323  int n_rank, int i_rank, int *fg_text) {
2324  return get_result_file(name_ID, istep, n_rank, i_rank, fg_text, 1);
2325 }
2326 
2328  int n_rank, int i_rank,
2329  int *fg_text) {
2330  return get_result_file(name_ID, istep, n_rank, i_rank, fg_text, 0);
2331 }
2332 
2334  return get_result_filebody(name_ID);
2335 }
2336 
2338  int nrank, myrank, irank;
2339  char *fname, *retfname;
2340  struct restart_entry *restart;
2341  char prefix[32];
2342  restart = get_restart_entry(name_ID);
2343 
2344  if (restart == NULL) {
2345  HECMW_set_error(HECMW_UTIL_E0044, "NAME: %s",
2346  name_ID ? name_ID : "Not specified");
2347  return NULL;
2348  }
2349 
2350  nrank = HECMW_comm_get_size();
2352 
2353  if (subdir_on && nrank > nlimit) {
2354  irank = myrank / nlimit;
2355  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2356  fname =
2357  make_filename(name_ID, NULL, prefix, restart->filename, "", myrank, 1);
2358 
2359  } else if (subdir_on) {
2360  fname =
2361  make_filename(name_ID, NULL, NULL, restart->filename, "", myrank, 1);
2362 
2363  } else {
2364  fname = make_filename(NULL, NULL, NULL, restart->filename, "", myrank, 1);
2365  }
2366 
2367  if (fname == NULL) {
2368  HECMW_set_error(HECMW_IO_E0002, "Cannot create restart filename");
2369  return NULL;
2370  }
2371 
2372  retfname = HECMW_strdup(fname);
2373 
2374  if (retfname == NULL) {
2375  HECMW_set_error(errno, "");
2376  return NULL;
2377  }
2378 
2379  return retfname;
2380 }
2381 
2383  int nrank, myrank, irank;
2384  char *fname, *retfname;
2385  struct restart_entry *p;
2386  char prefix[32];
2387  p = get_restart_entry_by_io(io);
2388 
2389  if (p == NULL) {
2391  return NULL;
2392  }
2393 
2394  nrank = HECMW_comm_get_size();
2396 
2397  if (subdir_on && nrank > nlimit) {
2398  irank = myrank / nlimit;
2399  snprintf(prefix, sizeof(prefix), "TRUNK%d", irank);
2400  fname = make_filename(p->name_ID, NULL, prefix, p->filename, "", myrank, 1);
2401 
2402  } else if (subdir_on) {
2403  fname = make_filename(p->name_ID, NULL, NULL, p->filename, "", myrank, 1);
2404 
2405  } else {
2406  fname = make_filename(NULL, NULL, NULL, p->filename, "", myrank, 1);
2407  }
2408 
2409  if (fname == NULL) {
2410  HECMW_set_error(HECMW_IO_E0002, "Cannot create restart filename");
2411  return NULL;
2412  }
2413 
2414  retfname = HECMW_strdup(fname);
2415 
2416  if (retfname == NULL) {
2417  HECMW_set_error(errno, "");
2418  return NULL;
2419  }
2420 
2421  return retfname;
2422 }
2423 
2425  char *fname;
2426  struct ctrl_entry *ctrl;
2427  ctrl = get_ctrl_entry(name_ID);
2428 
2429  if (ctrl == NULL) {
2430  HECMW_set_error(HECMW_UTIL_E0033, "NAME: %s",
2431  name_ID ? name_ID : "Not specified");
2432  return NULL;
2433  }
2434 
2435  fname = HECMW_strdup(ctrl->filename);
2436  return fname;
2437 }
2438 
2440  return get_ctrl_entry(name_ID) ? 1 : 0;
2441 }
2442 
2444  char fname[HECMW_FILENAME_LEN + 1];
2445  char dirname[HECMW_FILENAME_LEN + 1];
2446  char *token;
2447  char separator[10];
2448  char *saveptr;
2449  mode_t mode;
2450  DIR *dp;
2451 #ifndef _WINDOWS
2452  mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
2453 #endif
2454  strcpy(fname, filename);
2455  snprintf(separator, sizeof(separator), "%c", HECMW_get_path_separator());
2456 #if defined(__WIN32__) || defined(__WIN64__)
2457  /* strtok is thread-safe on Windows */
2458  token = strtok(fname, separator);
2459  snprintf(dirname, sizeof(dirname), "%s", token);
2460  token = strtok(NULL, separator);
2461 #else
2462  token = strtok_r(fname, separator, &saveptr);
2463  snprintf(dirname, sizeof(dirname), "%s", token);
2464  token = strtok_r(NULL, separator, &saveptr);
2465 #endif
2466 
2467  while (token) {
2468  if ((dp = opendir(dirname)) == NULL) {
2469 #ifndef _WINDOWS
2470 
2471  if (mkdir(dirname, mode) != 0) {
2472 #else
2473 
2474  if (mkdir(dirname) != 0) {
2475 #endif
2476 
2477  if (errno != EEXIST) return -1;
2478  }
2479 
2480  } else {
2481  closedir(dp);
2482  }
2483 
2484  strcat(dirname, separator);
2485  strcat(dirname, token);
2486 #if defined(__WIN32__) || defined(__WIN64__)
2487  token = strtok(NULL, separator);
2488 #else
2489  token = strtok_r(NULL, separator, &saveptr);
2490 #endif
2491  }
2492 
2493  return 0;
2494 }
2495 
2496 int HECMW_ctrl_is_subdir(void) { return subdir_on; }
2497 
2498 /*---------------------------------------------------------------------------*/
2499 
2500 void hecmw_ctrl_init_if(int *err) {
2501  *err = 1;
2502 
2503  if (HECMW_ctrl_init()) return;
2504 
2505  *err = 0;
2506 }
2507 
2508 void hecmw_ctrl_init_if_(int *err) { hecmw_ctrl_init_if(err); }
2509 
2511 
2512 void HECMW_CTRL_INIT_IF(int *err) { hecmw_ctrl_init_if(err); }
2513 
2514 /*---------------------------------------------------------------------------*/
2515 
2516 void hecmw_ctrl_init_ex_if(char *ctrlfile, int *err, int len) {
2517  char c_ctrlfile[HECMW_FILENAME_LEN + 1];
2518  *err = 1;
2519 
2520  if (HECMW_strcpy_f2c_r(ctrlfile, len, c_ctrlfile, sizeof(c_ctrlfile)) == NULL)
2521  return;
2522 
2523  if (HECMW_ctrl_init_ex(c_ctrlfile)) return;
2524 
2525  *err = 0;
2526 }
2527 
2528 void hecmw_ctrl_init_ex_if_(char *ctrlfile, int *err, int len) {
2529  hecmw_ctrl_init_ex_if(ctrlfile, err, len);
2530 }
2531 
2532 void hecmw_ctrl_init_ex_if__(char *ctrlfile, int *err, int len) {
2533  hecmw_ctrl_init_ex_if(ctrlfile, err, len);
2534 }
2535 
2536 void HECMW_CTRL_INIT_EX_IF(char *ctrlfile, int *err, int len) {
2537  hecmw_ctrl_init_ex_if(ctrlfile, err, len);
2538 }
2539 
2540 /*---------------------------------------------------------------------------*/
2541 
2543 
2545 
2547 
2549 
2550 /*---------------------------------------------------------------------------*/
2551 
2552 void hecmw_ctrl_get_control_file_if(char *name_ID, char *buf, int *err,
2553  int name_len, int buf_len) {
2554  char c_name_ID[HECMW_NAME_LEN + 1];
2555  char *c_buf;
2556  int ret;
2557  *err = 1;
2558 
2559  if (HECMW_strcpy_f2c_r(name_ID, name_len, c_name_ID, sizeof(c_name_ID)) ==
2560  NULL)
2561  return;
2562 
2563  if ((c_buf = HECMW_ctrl_get_control_file(c_name_ID)) == NULL) return;
2564 
2565  ret = HECMW_strcpy_c2f(c_buf, buf, buf_len);
2566  HECMW_free(c_buf);
2567 
2568  if (ret == 0) return;
2569 
2570  *err = 0;
2571 }
2572 
2573 void hecmw_ctrl_get_control_file_if_(char *name_ID, char *buf, int *err,
2574  int name_len, int buf_len) {
2575  hecmw_ctrl_get_control_file_if(name_ID, buf, err, name_len, buf_len);
2576 }
2577 
2578 void hecmw_ctrl_get_control_file_if__(char *name_ID, char *buf, int *err,
2579  int name_len, int buf_len) {
2580  hecmw_ctrl_get_control_file_if(name_ID, buf, err, name_len, buf_len);
2581 }
2582 
2583 void HECMW_CTRL_GET_CONTROL_FILE_IF(char *name_ID, char *buf, int *err,
2584  int name_len, int buf_len) {
2585  hecmw_ctrl_get_control_file_if(name_ID, buf, err, name_len, buf_len);
2586 }
2587 
2588 /*---------------------------------------------------------------------------*/
2589 
2590 void hecmw_ctrl_make_subdir(char *filename, int *err, int len) {
2591  char fname[HECMW_FILENAME_LEN + 1];
2592  *err = 1;
2593 
2594  if (HECMW_strcpy_f2c_r(filename, len, fname, sizeof(fname)) == NULL) return;
2595 
2596  if (HECMW_ctrl_make_subdir(fname) != 0) return;
2597 
2598  *err = 0;
2599 }
2600 
2601 void hecmw_ctrl_make_subdir_(char *filename, int *err, int len) {
2602  hecmw_ctrl_make_subdir(filename, err, len);
2603 }
2604 
2605 void hecmw_ctrl_make_subdir__(char *filename, int *err, int len) {
2606  hecmw_ctrl_make_subdir(filename, err, len);
2607 }
2608 
2609 void HECMW_CTRL_MAKE_SUBDIR(char *filename, int *err, int len) {
2610  hecmw_ctrl_make_subdir(filename, err, len);
2611 }
2612 
2613 /*---------------------------------------------------------------------------*/
2614 
2615 void hecmw_ctrl_is_subdir(int *flag, int *limit) {
2616  *flag = subdir_on;
2617  *limit = nlimit;
2618 }
2619 
2620 void hecmw_ctrl_is_subdir_(int *flag, int *limit) {
2621  hecmw_ctrl_is_subdir(flag, limit);
2622 }
2623 
2624 void hecmw_ctrl_is_subdir__(int *flag, int *limit) {
2625  hecmw_ctrl_is_subdir(flag, limit);
2626 }
2627 
2628 void HECMW_CTRL_IS_SUBDIR(int *flag, int *limit) {
2629  hecmw_ctrl_is_subdir(flag, limit);
2630 }
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:87
#define HECMW_MSG_LEN
Definition: hecmw_config.h:89
#define HECMW_NAME_LEN
Definition: hecmw_config.h:85
char * HECMW_ctrl_get_result_file(char *name_ID, int istep, int *fg_text)
int HECMW_ctrl_get_entire_mesh(char *filename, int len)
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_INP
Definition: hecmw_control.h:20
#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
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_INP
Definition: hecmw_ctrllex.h:25
@ 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_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:107
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