13 #include <sys/types.h>
21 static int table_entire_mesh[] = {
69 static int subdir_on = 0;
85 static int is_entire_mesh(
int type) {
87 n =
sizeof(table_entire_mesh) /
sizeof(table_entire_mesh[0]);
89 for (i = 0; i < n; i++) {
90 if (table_entire_mesh[i] == type)
return 1;
97 static char *make_filename(
char *dir,
char *subdir,
char *prefix,
char *file,
98 char *suffix,
int myrank,
int flag_rank) {
107 if (dir && strlen(dir) > 0) {
114 if (subdir && strlen(subdir) > 0) {
122 if (prefix && strlen(prefix) > 0) {
141 snprintf(rank,
sizeof(rank),
".%d",
myrank);
152 static char *make_filename_r(
char *dir,
char *subdir,
char *prefix,
char *file,
153 char *suffix,
int myrank,
int flag_rank,
157 size_t flen = (size_t)filename_len;
165 if (dir && strlen(dir) > 0) {
171 if (subdir && strlen(subdir) > 0) {
172 if ((len + strlen(subdir) + strlen(
separator)) > flen)
return NULL;
177 if (prefix && strlen(prefix) > 0) {
178 if ((len + strlen(prefix) + strlen(
separator)) > flen)
return NULL;
183 if ((len + strlen(file)) > flen)
return NULL;
185 len += snprintf(
filename + len, flen + 1 - len,
"%s", file);
188 if ((len + strlen(suffix)) > flen)
return NULL;
190 len += snprintf(
filename + len, flen + 1 - len,
"%s", suffix);
194 snprintf(rank,
sizeof(rank),
".%d",
myrank);
196 if ((len + strlen(rank)) > flen)
return NULL;
198 len += snprintf(
filename + len, flen + 1 - len,
"%s", rank);
206 static void free_mesh_entry(
void) {
209 for (p = mesh_ent; p; p = q) {
219 static void free_mesh_grp_entry(
void) {
222 for (p = mesh_grp_ent; p; p = q) {
232 static void free_restart_entry(
void) {
235 for (p = restart_ent; p; p = q) {
245 static void free_result_entry(
void) {
248 for (p = result_ent; p; p = q) {
258 static void free_ctrl_entry(
void) {
261 for (p = ctrl_ent; p; p = q) {
278 for (p = mesh_ent; p; p = p->
next) {
290 for (p = mesh_grp_ent; p; p = p->
next) {
302 for (p = restart_ent; p; p = p->
next) {
312 for (p = restart_ent; p; p = p->
next) {
313 if (p->
io &
io)
return p;
324 for (p = result_ent; p; p = p->
next) {
336 for (p = ctrl_ent; p; p = p->
next) {
388 static int add_mesh_entry(
struct mesh_entry *mesh) {
392 for (p = mesh_ent; p; p = (q = p)->
next)
411 if (meshgrp ==
NULL) {
431 for (i = 0; i <
n_mesh; i++) {
432 meshgrp->
mesh[i] = get_mesh_entry(
mesh[i]);
434 if (meshgrp->
mesh[i] ==
NULL)
goto error;
454 for (p = mesh_grp_ent; p; p = (q = p)->
next)
473 if (result ==
NULL) {
509 static int add_result_entry(
struct result_entry *result) {
513 for (p = result_ent; p; p = (q = p)->
next)
532 if (restart ==
NULL) {
567 static int add_restart_entry(
struct restart_entry *restart) {
571 for (p = restart_ent; p; p = (q = p)->
next)
575 restart_ent = restart;
623 static int add_ctrl_entry(
struct ctrl_entry *ctrl) {
627 for (p = ctrl_ent; p; p = (q = p)->
next)
642 static void do_logging(
int loglv,
int msgno,
int add_location,
const char *fmt,
651 if (strlen(msg) > 0) s =
": ";
653 snprintf(line,
sizeof(line),
"%s:%d%s", ctrl_filename,
660 static void set_err(
int msgno,
const char *fmt, ...) {
667 static void set_err_token(
int token,
int msgno,
const char *fmt, ...) {
685 static int read_mesh_header(
void) {
706 static int read_mesh_head_param_name(
char *name,
size_t name_len) {
721 "NAME must begin with a letter or '_'");
732 snprintf(name, name_len,
"%s", p);
735 if (get_mesh_entry(name) || get_mesh_grp_entry(name)) {
743 static int read_mesh_head_param_type(
int *type) {
783 static int read_mesh_head_param_io(
int *io) {
809 static int read_mesh_head_param_refine(
int *refine) {
832 static int read_mesh_data(
char *name,
int type,
int io,
int refine) {
854 if (mesh ==
NULL)
return -1;
857 if (add_mesh_entry(mesh))
return -1;
870 static int read_mesh(
void) {
882 ST_HEADER_LINE_PARAM,
885 state = ST_HEADER_LINE;
887 while (state != ST_FINISHED) {
888 if (state == ST_HEADER_LINE) {
889 if (read_mesh_header())
return -1;
892 state = ST_HEADER_LINE_PARAM;
894 }
else if (state == ST_HEADER_LINE_PARAM) {
899 if (read_mesh_head_param_name(name,
sizeof(name)))
return -1;
905 if (read_mesh_head_param_type(&
type))
return -1;
911 if (read_mesh_head_param_io(&
io))
return -1;
915 if (read_mesh_head_param_refine(&
refine))
return -1;
938 state = ST_DATA_LINE;
940 }
else if (token ==
',') {
948 }
else if (state == ST_DATA_LINE) {
973 static int read_meshgrp_header(
void) {
994 static int read_meshgrp_head_param_name(
char *name,
size_t name_len) {
1009 "NAME must begin with a letter or '_'");
1020 snprintf(name, name_len,
"%s", p);
1023 if (get_mesh_entry(name) || get_mesh_grp_entry(name)) {
1031 static int read_meshgrp_data(
char *name) {
1032 int i, token, n_mesh, n_mesh_max;
1068 if ((ment = get_mesh_entry(p)) ==
NULL) {
1073 if (!is_entire_mesh(ment->
type)) {
1078 if (n_mesh == n_mesh_max) {
1092 if (mesh[n_mesh] ==
NULL) {
1103 "',' or NL required after name_ID");
1109 meshgrp = make_mesh_group_entry(name, n_mesh, mesh);
1111 if (meshgrp ==
NULL)
return -1;
1114 if (add_mesh_group_entry(meshgrp))
return -1;
1116 for (i = 0; i < n_mesh; i++) {
1124 static int read_meshgrp(
void) {
1131 ST_HEADER_LINE_PARAM,
1134 state = ST_HEADER_LINE;
1136 while (state != ST_FINISHED) {
1137 if (state == ST_HEADER_LINE) {
1138 if (read_meshgrp_header())
return -1;
1141 state = ST_HEADER_LINE_PARAM;
1143 }
else if (state == ST_HEADER_LINE_PARAM) {
1148 if (read_meshgrp_head_param_name(name,
sizeof(name)))
return -1;
1167 state = ST_DATA_LINE;
1169 }
else if (token ==
',') {
1177 }
else if (state == ST_DATA_LINE) {
1180 if (read_meshgrp_data(name))
return -1;
1182 state = ST_FINISHED;
1194 static int read_result_head(
void) {
1215 static int read_result_param_name(
char *name,
size_t name_len) {
1230 "NAME must begin with a letter or '_'");
1241 snprintf(name, name_len,
"%s", p);
1244 if (get_result_entry(name)) {
1252 static int read_result_param_io(
int *
io) {
1278 static int read_result_param_type(
int *fg_text) {
1309 if (strcmp(s,
"TEXT") == 0) {
1312 }
else if (strcmp(s,
"BINARY") == 0) {
1323 static int read_result_data(
char *name,
int io,
int fg_text) {
1342 result = make_result_entry(name,
io,
fg_text, p);
1344 if (result ==
NULL)
return -1;
1347 if (add_result_entry(result))
return -1;
1360 static int read_result(
void) {
1370 ST_HEADER_LINE_PARAM,
1374 state = ST_HEADER_LINE;
1376 while (state != ST_FINISHED) {
1377 if (state == ST_HEADER_LINE) {
1378 if (read_result_head())
return -1;
1380 state = ST_HEADER_LINE_PARAM;
1382 }
else if (state == ST_HEADER_LINE_PARAM) {
1387 if (read_result_param_name(name,
sizeof(name)))
return -1;
1393 if (read_result_param_io(&
io))
return -1;
1399 if (read_result_param_type(&
fg_text))
return -1;
1422 state = ST_DATA_LINE;
1424 }
else if (token ==
',') {
1432 }
else if (state == ST_DATA_LINE) {
1435 if (read_result_data(name,
io,
fg_text))
return -1;
1437 state = ST_FINISHED;
1449 static int read_restart_head(
void) {
1470 static int read_restart_param_name(
char *name,
size_t name_len) {
1485 "NAME must begin with a letter or '_'");
1496 snprintf(name, name_len,
"%s", p);
1499 if (get_restart_entry(name)) {
1507 static int read_restart_param_io(
int *
io) {
1536 static int read_restart_data(
char *name,
int io) {
1555 restart = make_restart_entry(name,
io, p);
1557 if (restart ==
NULL)
return -1;
1560 if (add_restart_entry(restart))
return -1;
1573 static int read_restart(
void) {
1582 ST_HEADER_LINE_PARAM,
1585 state = ST_HEADER_LINE;
1587 while (state != ST_FINISHED) {
1588 if (state == ST_HEADER_LINE) {
1589 if (read_restart_head())
return -1;
1592 state = ST_HEADER_LINE_PARAM;
1594 }
else if (state == ST_HEADER_LINE_PARAM) {
1599 if (read_restart_param_name(name,
sizeof(name)))
return -1;
1605 if (read_restart_param_io(&
io))
return -1;
1630 state = ST_DATA_LINE;
1632 }
else if (token ==
',') {
1640 }
else if (state == ST_DATA_LINE) {
1644 if (read_restart_data(name,
io))
return -1;
1646 state = ST_FINISHED;
1658 static int read_control_head(
void) {
1679 static int read_control_head_param_name(
char *name,
size_t name_len) {
1694 "NAME must begin with a letter or '_'");
1705 snprintf(name, name_len,
"%s", p);
1708 if (get_ctrl_entry(name)) {
1716 static int read_control_data(
char *name) {
1736 control = make_ctrl_entry(name, p);
1738 if (control ==
NULL) {
1743 if (add_ctrl_entry(control)) {
1758 static int read_control(
void) {
1765 ST_HEADER_LINE_PARAM,
1768 state = ST_HEADER_LINE;
1770 while (state != ST_FINISHED) {
1771 if (state == ST_HEADER_LINE) {
1772 if (read_control_head())
return -1;
1775 state = ST_HEADER_LINE_PARAM;
1777 }
else if (state == ST_HEADER_LINE_PARAM) {
1782 if (read_control_head_param_name(name,
sizeof(name)))
return -1;
1801 state = ST_DATA_LINE;
1803 }
else if (token ==
',') {
1811 }
else if (state == ST_DATA_LINE) {
1814 if (read_control_data(name))
return -1;
1816 state = ST_FINISHED;
1828 static int read_subdir_head(
void) {
1849 static int read_subdir_head_param_limit(
void) {
1872 static int read_subdir(
void) {
1878 ST_HEADER_LINE_PARAM,
1881 state = ST_HEADER_LINE;
1883 while (state != ST_FINISHED) {
1884 if (state == ST_HEADER_LINE) {
1885 if (read_subdir_head())
return -1;
1888 state = ST_HEADER_LINE_PARAM;
1890 }
else if (state == ST_HEADER_LINE_PARAM) {
1904 if (read_subdir_head_param_limit())
return -1;
1920 state = ST_FINISHED;
1922 }
else if (token ==
',') {
1944 static struct read_func_table {
1947 } read_func_table[] = {
1956 #define N_READ_FUNC (sizeof(read_func_table) / sizeof(read_func_table[0]))
1959 static ReadFunc get_read_func(
int token) {
1963 if (token == read_func_table[i].token) {
1964 return read_func_table[i].func;
1973 static int parse(
void) {
1980 func = get_read_func(token);
1997 if ((*func)())
return -1;
2007 if (ctrlfile ==
NULL) {
2012 snprintf(ctrl_filename,
sizeof(ctrl_filename),
"%s", ctrlfile);
2015 if ((fp = fopen(ctrl_filename,
"r")) ==
NULL) {
2042 free_mesh_grp_entry();
2043 free_result_entry();
2044 free_restart_entry();
2051 for (i = 0; i < meshfiles->
n_mesh; i++) {
2061 int flag_rank_none) {
2062 int i, flag_rank, nrank,
myrank, irank;
2069 if (files ==
NULL) {
2091 for (i = 0; i <
n_mesh; i++) {
2095 file->
io = ment->
io;
2098 if (flag_rank_none) {
2102 if (is_entire_mesh(file->
type)) {
2112 if (fname ==
NULL) {
2122 if (subdir_on && nrank > nlimit) {
2124 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2132 }
else if (subdir_on && nrank > 1) {
2142 if (retval ==
NULL) {
2156 int flag_rank_none) {
2160 mesh_grp = get_mesh_grp_entry(name_ID);
2163 files = make_meshfiles_struct(mesh_grp->
n_mesh, mesh_grp->
mesh, n_rank,
2164 i_rank, flag_rank_none);
2169 if (files ==
NULL) {
2170 mesh = get_mesh_entry(name_ID);
2173 files = make_meshfiles_struct(1, &mesh, n_rank, i_rank, flag_rank_none);
2179 if (files ==
NULL) {
2188 return get_meshfiles(name_ID, 0, 0, 0);
2192 return get_meshfiles(name_ID, 0, 0, 1);
2198 return get_meshfiles(name_ID, n_rank, i_rank, 0);
2204 return get_meshfiles(name_ID, n_rank, i_rank, 1);
2210 if (files ==
NULL)
return 0;
2212 if (files->
n_mesh == 1 &&
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;
2227 char subname[32], prefix[32];
2228 result = get_result_entry(
name_ID);
2230 if (result ==
NULL) {
2245 if (subdir_on && !strcmp(
name_ID,
"vis_out")) {
2249 }
else if (subdir_on && nrank > nlimit) {
2250 snprintf(subname,
sizeof(subname),
"STEP%d", istep);
2252 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2256 }
else if (subdir_on) {
2257 snprintf(subname,
sizeof(subname),
"STEP%d", istep);
2266 if (fname ==
NULL) {
2273 if (retfname ==
NULL) {
2282 static char *get_filename_body(
char *file) {
2288 static char *get_result_filebody(
char *
name_ID) {
2290 char *fname, *retfname;
2292 result = get_result_entry(
name_ID);
2294 if (result ==
NULL) {
2300 fname = get_filename_body(result->
filename);
2304 if (retfname ==
NULL) {
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);
2328 int n_rank,
int i_rank,
2330 return get_result_file(
name_ID, istep, n_rank, i_rank,
fg_text, 0);
2334 return get_result_filebody(
name_ID);
2338 int nrank,
myrank, irank;
2339 char *fname, *retfname;
2342 restart = get_restart_entry(
name_ID);
2344 if (restart ==
NULL) {
2353 if (subdir_on && nrank > nlimit) {
2355 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2359 }
else if (subdir_on) {
2367 if (fname ==
NULL) {
2374 if (retfname ==
NULL) {
2383 int nrank,
myrank, irank;
2384 char *fname, *retfname;
2387 p = get_restart_entry_by_io(
io);
2397 if (subdir_on && nrank > nlimit) {
2399 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2402 }
else if (subdir_on) {
2409 if (fname ==
NULL) {
2416 if (retfname ==
NULL) {
2427 ctrl = get_ctrl_entry(
name_ID);
2440 return get_ctrl_entry(
name_ID) ? 1 : 0;
2452 mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
2456 #if defined(__WIN32__) || defined(__WIN64__)
2459 snprintf(dirname,
sizeof(dirname),
"%s", token);
2462 token = strtok_r(fname,
separator, &saveptr);
2463 snprintf(dirname,
sizeof(dirname),
"%s", token);
2468 if ((dp = opendir(dirname)) ==
NULL) {
2471 if (mkdir(dirname, mode) != 0) {
2474 if (mkdir(dirname) != 0) {
2477 if (errno != EEXIST)
return -1;
2485 strcat(dirname, token);
2486 #if defined(__WIN32__) || defined(__WIN64__)
2553 int name_len,
int buf_len) {
2568 if (ret == 0)
return;
2574 int name_len,
int buf_len) {
2579 int name_len,
int buf_len) {
2584 int name_len,
int buf_len) {
int HECMW_comm_get_rank(void)
int HECMW_comm_get_size(void)
#define HECMW_FILENAME_LEN
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)
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
#define HECMW_CTRL_FTYPE_HECMW_ENTIRE
#define HECMW_CTRL_FILE_IO_OUT
#define HECMW_CTRL_FTYPE_INP
#define HECMW_CTRL_FTYPE_FEMAP
#define HECMW_CTRL_FTYPE_NASTRAN
#define HECMW_CTRL_FTYPE_GEOFEM
#define HECMW_CTRL_FILE_IO_IN
#define HECMW_CTRL_FILE_IO_INOUT
double HECMW_ctrllex_get_number(void)
char * HECMW_ctrllex_get_text(void)
int HECMW_ctrllex_unput_token(void)
@ HECMW_CTRLLEX_H_CONTROL
@ HECMW_CTRLLEX_H_RESTART
@ HECMW_CTRLLEX_K_HECMW_ENTIRE
@ HECMW_CTRLLEX_K_NASTRAN
@ HECMW_CTRLLEX_K_HECMW_DIST
@ HECMW_CTRLLEX_H_MESH_GROUP
int HECMW_ctrllex_set_input(FILE *fp)
int HECMW_ctrllex_next_token(void)
int HECMW_ctrllex_get_lineno(void)
struct hecmwST_local_mesh * mesh
int HECMW_set_error(int errorno, const char *fmt,...)
int HECMW_strcpy_c2f(const char *cstr, char *fstr, int flen)
char * HECMW_strcpy_f2c_r(const char *fstr, int flen, char *buf, int bufsize)
int HECMW_log(int loglv, const char *fmt,...)
#define HECMW_calloc(nmemb, size)
#define HECMW_realloc(ptr, size)
#define HECMW_malloc(size)
int HECMW_get_path_separator(void)
int HECMW_vsnprintf(char *str, size_t size, const char *format, va_list ap)
#define HECMW_assert(cond)
Separator_result * separator
integer(kind=kint) myrank
PARALLEL EXECUTION.
struct hecmw_ctrl_meshfile * meshfiles
struct mesh_grp_entry * next
struct mesh_entry ** mesh
struct restart_entry * next
struct result_entry * next