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) {
884 ST_HEADER_LINE_PARAM,
887 state = ST_HEADER_LINE;
889 while (state != ST_FINISHED) {
890 if (state == ST_HEADER_LINE) {
891 if (read_mesh_header())
return -1;
894 state = ST_HEADER_LINE_PARAM;
896 }
else if (state == ST_HEADER_LINE_PARAM) {
901 if (read_mesh_head_param_name(name,
sizeof(name)))
return -1;
907 if (read_mesh_head_param_type(&
type))
return -1;
913 if (read_mesh_head_param_io(&
io))
return -1;
919 if (read_mesh_head_param_refine(&
refine))
return -1;
944 state = ST_DATA_LINE;
946 }
else if (token ==
',') {
954 }
else if (state == ST_DATA_LINE) {
979 static int read_meshgrp_header(
void) {
1000 static int read_meshgrp_head_param_name(
char *name,
size_t name_len) {
1015 "NAME must begin with a letter or '_'");
1026 snprintf(name, name_len,
"%s", p);
1029 if (get_mesh_entry(name) || get_mesh_grp_entry(name)) {
1037 static int read_meshgrp_data(
char *name) {
1038 int i, token, n_mesh, n_mesh_max;
1074 if ((ment = get_mesh_entry(p)) ==
NULL) {
1079 if (!is_entire_mesh(ment->
type)) {
1084 if (n_mesh == n_mesh_max) {
1098 if (mesh[n_mesh] ==
NULL) {
1109 "',' or NL required after name_ID");
1115 meshgrp = make_mesh_group_entry(name, n_mesh, mesh);
1117 if (meshgrp ==
NULL)
return -1;
1120 if (add_mesh_group_entry(meshgrp))
return -1;
1122 for (i = 0; i < n_mesh; i++) {
1130 static int read_meshgrp(
void) {
1137 ST_HEADER_LINE_PARAM,
1140 state = ST_HEADER_LINE;
1142 while (state != ST_FINISHED) {
1143 if (state == ST_HEADER_LINE) {
1144 if (read_meshgrp_header())
return -1;
1147 state = ST_HEADER_LINE_PARAM;
1149 }
else if (state == ST_HEADER_LINE_PARAM) {
1154 if (read_meshgrp_head_param_name(name,
sizeof(name)))
return -1;
1173 state = ST_DATA_LINE;
1175 }
else if (token ==
',') {
1183 }
else if (state == ST_DATA_LINE) {
1186 if (read_meshgrp_data(name))
return -1;
1188 state = ST_FINISHED;
1200 static int read_result_head(
void) {
1221 static int read_result_param_name(
char *name,
size_t name_len) {
1236 "NAME must begin with a letter or '_'");
1247 snprintf(name, name_len,
"%s", p);
1250 if (get_result_entry(name)) {
1258 static int read_result_param_io(
int *
io) {
1284 static int read_result_param_type(
int *fg_text) {
1315 if (strcmp(s,
"TEXT") == 0) {
1318 }
else if (strcmp(s,
"BINARY") == 0) {
1329 static int read_result_data(
char *name,
int io,
int fg_text) {
1348 result = make_result_entry(name,
io,
fg_text, p);
1350 if (result ==
NULL)
return -1;
1353 if (add_result_entry(result))
return -1;
1366 static int read_result(
void) {
1376 ST_HEADER_LINE_PARAM,
1380 state = ST_HEADER_LINE;
1382 while (state != ST_FINISHED) {
1383 if (state == ST_HEADER_LINE) {
1384 if (read_result_head())
return -1;
1386 state = ST_HEADER_LINE_PARAM;
1388 }
else if (state == ST_HEADER_LINE_PARAM) {
1393 if (read_result_param_name(name,
sizeof(name)))
return -1;
1399 if (read_result_param_io(&
io))
return -1;
1405 if (read_result_param_type(&
fg_text))
return -1;
1428 state = ST_DATA_LINE;
1430 }
else if (token ==
',') {
1438 }
else if (state == ST_DATA_LINE) {
1441 if (read_result_data(name,
io,
fg_text))
return -1;
1443 state = ST_FINISHED;
1455 static int read_restart_head(
void) {
1476 static int read_restart_param_name(
char *name,
size_t name_len) {
1491 "NAME must begin with a letter or '_'");
1502 snprintf(name, name_len,
"%s", p);
1505 if (get_restart_entry(name)) {
1513 static int read_restart_param_io(
int *
io) {
1542 static int read_restart_data(
char *name,
int io) {
1561 restart = make_restart_entry(name,
io, p);
1563 if (restart ==
NULL)
return -1;
1566 if (add_restart_entry(restart))
return -1;
1579 static int read_restart(
void) {
1588 ST_HEADER_LINE_PARAM,
1591 state = ST_HEADER_LINE;
1593 while (state != ST_FINISHED) {
1594 if (state == ST_HEADER_LINE) {
1595 if (read_restart_head())
return -1;
1598 state = ST_HEADER_LINE_PARAM;
1600 }
else if (state == ST_HEADER_LINE_PARAM) {
1605 if (read_restart_param_name(name,
sizeof(name)))
return -1;
1611 if (read_restart_param_io(&
io))
return -1;
1636 state = ST_DATA_LINE;
1638 }
else if (token ==
',') {
1646 }
else if (state == ST_DATA_LINE) {
1650 if (read_restart_data(name,
io))
return -1;
1652 state = ST_FINISHED;
1664 static int read_control_head(
void) {
1685 static int read_control_head_param_name(
char *name,
size_t name_len) {
1700 "NAME must begin with a letter or '_'");
1711 snprintf(name, name_len,
"%s", p);
1714 if (get_ctrl_entry(name)) {
1722 static int read_control_data(
char *name) {
1742 control = make_ctrl_entry(name, p);
1744 if (control ==
NULL) {
1749 if (add_ctrl_entry(control)) {
1764 static int read_control(
void) {
1771 ST_HEADER_LINE_PARAM,
1774 state = ST_HEADER_LINE;
1776 while (state != ST_FINISHED) {
1777 if (state == ST_HEADER_LINE) {
1778 if (read_control_head())
return -1;
1781 state = ST_HEADER_LINE_PARAM;
1783 }
else if (state == ST_HEADER_LINE_PARAM) {
1788 if (read_control_head_param_name(name,
sizeof(name)))
return -1;
1807 state = ST_DATA_LINE;
1809 }
else if (token ==
',') {
1817 }
else if (state == ST_DATA_LINE) {
1820 if (read_control_data(name))
return -1;
1822 state = ST_FINISHED;
1834 static int read_subdir_head(
void) {
1855 static int read_subdir_head_param_limit(
void) {
1878 static int read_subdir(
void) {
1884 ST_HEADER_LINE_PARAM,
1887 state = ST_HEADER_LINE;
1889 while (state != ST_FINISHED) {
1890 if (state == ST_HEADER_LINE) {
1891 if (read_subdir_head())
return -1;
1894 state = ST_HEADER_LINE_PARAM;
1896 }
else if (state == ST_HEADER_LINE_PARAM) {
1910 if (read_subdir_head_param_limit())
return -1;
1926 state = ST_FINISHED;
1928 }
else if (token ==
',') {
1950 static struct read_func_table {
1953 } read_func_table[] = {
1962 #define N_READ_FUNC (sizeof(read_func_table) / sizeof(read_func_table[0]))
1965 static ReadFunc get_read_func(
int token) {
1969 if (token == read_func_table[i].token) {
1970 return read_func_table[i].func;
1979 static int parse(
void) {
1986 func = get_read_func(token);
2003 if ((*func)())
return -1;
2013 if (ctrlfile ==
NULL) {
2018 snprintf(ctrl_filename,
sizeof(ctrl_filename),
"%s", ctrlfile);
2021 if ((fp = fopen(ctrl_filename,
"r")) ==
NULL) {
2048 free_mesh_grp_entry();
2049 free_result_entry();
2050 free_restart_entry();
2057 for (i = 0; i < meshfiles->
n_mesh; i++) {
2067 int flag_rank_none) {
2068 int i, flag_rank, nrank,
myrank, irank;
2075 if (files ==
NULL) {
2097 for (i = 0; i <
n_mesh; i++) {
2101 file->
io = ment->
io;
2104 if (flag_rank_none) {
2108 if (is_entire_mesh(file->
type)) {
2118 if (fname ==
NULL) {
2128 if (subdir_on && nrank > nlimit) {
2130 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2138 }
else if (subdir_on && nrank > 1) {
2148 if (retval ==
NULL) {
2162 int flag_rank_none) {
2166 mesh_grp = get_mesh_grp_entry(name_ID);
2169 files = make_meshfiles_struct(mesh_grp->
n_mesh, mesh_grp->
mesh, n_rank,
2170 i_rank, flag_rank_none);
2175 if (files ==
NULL) {
2176 mesh = get_mesh_entry(name_ID);
2179 files = make_meshfiles_struct(1, &mesh, n_rank, i_rank, flag_rank_none);
2185 if (files ==
NULL) {
2194 return get_meshfiles(name_ID, 0, 0, 0);
2198 return get_meshfiles(name_ID, 0, 0, 1);
2204 return get_meshfiles(name_ID, n_rank, i_rank, 0);
2210 return get_meshfiles(name_ID, n_rank, i_rank, 1);
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;
2218 char subname[32], prefix[32];
2219 result = get_result_entry(
name_ID);
2221 if (result ==
NULL) {
2236 if (subdir_on && !strcmp(
name_ID,
"vis_out")) {
2240 }
else if (subdir_on && nrank > nlimit) {
2241 snprintf(subname,
sizeof(subname),
"STEP%d", istep);
2243 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2247 }
else if (subdir_on) {
2248 snprintf(subname,
sizeof(subname),
"STEP%d", istep);
2257 if (fname ==
NULL) {
2264 if (retfname ==
NULL) {
2273 static char *get_filename_body(
char *file) {
2279 static char *get_result_filebody(
char *
name_ID) {
2281 char *fname, *retfname;
2283 result = get_result_entry(
name_ID);
2285 if (result ==
NULL) {
2291 fname = get_filename_body(result->
filename);
2295 if (retfname ==
NULL) {
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);
2319 int n_rank,
int i_rank,
2321 return get_result_file(
name_ID, istep, n_rank, i_rank,
fg_text, 0);
2325 return get_result_filebody(
name_ID);
2329 int nrank,
myrank, irank;
2330 char *fname, *retfname;
2333 restart = get_restart_entry(
name_ID);
2335 if (restart ==
NULL) {
2344 if (subdir_on && nrank > nlimit) {
2346 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2350 }
else if (subdir_on) {
2358 if (fname ==
NULL) {
2365 if (retfname ==
NULL) {
2374 int nrank,
myrank, irank;
2375 char *fname, *retfname;
2378 p = get_restart_entry_by_io(
io);
2388 if (subdir_on && nrank > nlimit) {
2390 snprintf(prefix,
sizeof(prefix),
"TRUNK%d", irank);
2393 }
else if (subdir_on) {
2400 if (fname ==
NULL) {
2407 if (retfname ==
NULL) {
2418 ctrl = get_ctrl_entry(
name_ID);
2431 return get_ctrl_entry(
name_ID) ? 1 : 0;
2443 mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
2447 #if defined(__WIN32__) || defined(__WIN64__)
2450 snprintf(dirname,
sizeof(dirname),
"%s", token);
2453 token = strtok_r(fname,
separator, &saveptr);
2454 snprintf(dirname,
sizeof(dirname),
"%s", token);
2459 if ((dp = opendir(dirname)) ==
NULL) {
2462 if (mkdir(dirname, mode) != 0) {
2465 if (mkdir(dirname) != 0) {
2468 if (errno != EEXIST)
return -1;
2476 strcat(dirname, token);
2477 #if defined(__WIN32__) || defined(__WIN64__)
2544 int name_len,
int buf_len) {
2559 if (ret == 0)
return;
2565 int name_len,
int buf_len) {
2570 int name_len,
int buf_len) {
2575 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)
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_FEMAP
#define HECMW_CTRL_FTYPE_NASTRAN
#define HECMW_CTRL_FTYPE_GEOFEM
#define HECMW_CTRL_FILE_IO_IN
#define HECMW_CTRL_FILE_IO_INOUT
#define HECMW_CTRL_FTYPE_ABAQUS
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