FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_result.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 <stddef.h>
9 #include <string.h>
10 #include <errno.h>
11 #include <ctype.h>
12 #include "hecmw_util.h"
13 #include "hecmw_config.h"
14 #include "hecmw_bin_io.h"
15 #include "hecmw_result.h"
16 #include "hecmw_result_io.h"
17 #include "hecmw_result_io_bin.h"
18 #include "hecmw_result_io_txt.h"
19 
20 
21 void HECMW_result_free(struct hecmwST_result_data *result) {
22  int i;
23 
24  if (result == NULL) return;
25 
26  if (result->ng_component > 0) {
27  HECMW_free(result->ng_dof);
28  HECMW_free(result->global_val_item);
29  for (i = 0; i < result->ng_component; i++) {
30  HECMW_free(result->global_label[i]);
31  }
32  HECMW_free(result->global_label);
33  }
34 
35  if (result->nn_component > 0) {
36  HECMW_free(result->nn_dof);
37  HECMW_free(result->node_val_item);
38  for (i = 0; i < result->nn_component; i++) {
39  HECMW_free(result->node_label[i]);
40  }
41  HECMW_free(result->node_label);
42  }
43 
44  if (result->ne_component > 0) {
45  HECMW_free(result->ne_dof);
46  HECMW_free(result->elem_val_item);
47  for (i = 0; i < result->ne_component; i++) {
48  HECMW_free(result->elem_label[i]);
49  }
50  HECMW_free(result->elem_label);
51  }
52 
53  HECMW_free(result);
54 }
55 
57  int i_step, char *header, char *comment) {
58  return HECMW_result_io_init(
59  hecMESH->n_node, hecMESH->n_elem, hecMESH->global_node_ID,
60  hecMESH->global_elem_ID, hecMESH->n_elem_type, hecMESH->elem_type_index,
61  hecMESH->elem_type_item, i_step, header, comment);
62 }
63 
66  return 0;
67 }
68 
69 
70 /*---------------------------------------------------------------------------*/
71 /* UNIVERSAL I/O */
72 /*---------------------------------------------------------------------------*/
73 
74 int HECMW_result_write_by_name(char *name_ID) {
75  char *basename, filename[HECMW_FILENAME_LEN + 1];
76  int fg_text, ret;
77 
78  if ((basename =
79  HECMW_ctrl_get_result_file(name_ID, ResIO.istep, &fg_text)) == NULL)
80  return -1;
81 
82  ret = snprintf(filename, sizeof(filename), "%s.%d", basename, ResIO.istep);
83  HECMW_free(basename);
84  if (ret > HECMW_FILENAME_LEN) return -1;
85 
86  if (fg_text) {
87  if (HECMW_result_io_txt_write_by_fname(filename)) return -1;
88  } else {
89  if (HECMW_result_io_bin_write_by_fname(filename)) return -1;
90  }
91 
92  return 0;
93 }
94 
96  struct hecmwST_result_data *result,
97  int n_node, int n_elem, char *header, char *comment) {
98  char *basename, filename[HECMW_FILENAME_LEN + 1];
99  int fg_text, ret;
100 
101  if ((basename =
102  HECMW_ctrl_get_result_file(name_ID, ResIO.istep, &fg_text)) == NULL)
103  return -1;
104 
105  ret = snprintf(filename, sizeof(filename), "%s.%d", basename, ResIO.istep);
106  HECMW_free(basename);
107  if (ret > HECMW_FILENAME_LEN) return -1;
108 
109  if (fg_text) {
110  if (HECMW_result_io_txt_write_ST_by_fname(filename, result, n_node, n_elem,
111  header, comment))
112  return -1;
113  } else {
114  if (HECMW_result_io_bin_write_ST_by_fname(filename, result, n_node, n_elem,
115  header, comment))
116  return -1;
117  }
118 
119  return 0;
120 }
121 
122 int HECMW_result_write_by_addfname(char *name_ID, char *addfname) {
123  char *basename, filename[HECMW_FILENAME_LEN + 1];
124  char base_mod[HECMW_FILENAME_LEN + 1];
125  int fg_text, myrank, ret;
126  char *dot;
127 
128  if ((basename = HECMW_ctrl_get_result_fileheader(name_ID, ResIO.istep,
129  &fg_text)) == NULL)
130  return -1;
131 
132  /* Insert addfname before the last '.' in basename.
133  e.g. basename="model.res", addfname="_precheck" -> "model_precheck.res" */
134  snprintf(base_mod, sizeof(base_mod), "%s", basename);
135  dot = strrchr(base_mod, '.');
136  if (dot != NULL) {
137  char suffix[HECMW_FILENAME_LEN + 1];
138  snprintf(suffix, sizeof(suffix), "%s", dot);
139  *dot = '\0';
140  snprintf(dot, sizeof(base_mod) - (dot - base_mod), "%s%s", addfname, suffix);
141  } else {
142  strncat(base_mod, addfname, sizeof(base_mod) - strlen(base_mod) - 1);
143  }
144 
146  ret = snprintf(filename, sizeof(filename), "%s.%d.%d", base_mod,
147  myrank, ResIO.istep);
148  HECMW_free(basename);
149  if (ret > HECMW_FILENAME_LEN) return -1;
150 
151  if (fg_text) {
152  if (HECMW_result_io_txt_write_by_fname(filename)) return -1;
153  } else {
154  if (HECMW_result_io_bin_write_by_fname(filename)) return -1;
155  }
156 
157  return 0;
158 }
159 
160 int HECMW_result_checkfile_by_name(char *name_ID, int i_step) {
161  char *basename, filename[HECMW_FILENAME_LEN + 1];
162  int fg_text, ret;
163  FILE *fp;
164 
165  if ((basename = HECMW_ctrl_get_result_file(name_ID, i_step,
166  &fg_text)) == NULL)
167  return -1;
168 
169  ret = snprintf(filename, sizeof(filename), "%s.%d", basename, i_step);
170  HECMW_free(basename);
171  if (ret > HECMW_FILENAME_LEN) return -1;
172 
173  fp = fopen(filename, "r");
174  if (fp == NULL) return -1;
175  fclose(fp);
176 
177  return 0;
178 }
179 
181  struct hecmwST_result_data *result;
182 
183  if (HECMW_result_io_bin_judge_file(filename)) {
184  result = HECMW_result_io_bin_read_by_fname(filename);
185  } else {
186  result = HECMW_result_io_txt_read_by_fname(filename);
187  }
188 
189  return result;
190 }
191 
193  int i_step) {
194  char *basename, filename[HECMW_FILENAME_LEN + 1];
195  struct hecmwST_result_data *result;
196  int fg_text, ret;
197 
198  if ((basename = HECMW_ctrl_get_result_file(name_ID, i_step,
199  &fg_text)) == NULL)
200  return NULL;
201 
202  ret = snprintf(filename, sizeof(filename), "%s.%d", basename, i_step);
203  HECMW_free(basename);
204  if (ret > HECMW_FILENAME_LEN) return NULL;
205 
206  if ((result = HECMW_result_read_by_fname(filename)) == NULL) return NULL;
207 
208  return result;
209 }
210 
211 /*---------------------------------------------------------------------------*/
212 /* etc. */
213 /*---------------------------------------------------------------------------*/
214 
215 int HECMW_result_get_nnode(void) { return ResIO.nnode; }
216 
217 int HECMW_result_get_nelem(void) { return ResIO.nelem; }
218 
219 char *HECMW_result_get_header(char *buff, size_t buff_size) {
220  snprintf(buff, buff_size, "%s", ResIO.head);
221  return buff;
222 }
223 
224 char *HECMW_result_get_comment(char *buff, size_t buff_size) {
225  snprintf(buff, buff_size, "%s", ResIO.comment_line);
226  return buff;
227 }
228 
229 int *HECMW_result_get_nodeID(int *buff) {
230  int i;
231  for (i = 0; i < ResIO.nnode; i++) {
232  buff[i] = ResIO.node_global_ID[i];
233  }
234  return buff;
235 }
236 
237 int *HECMW_result_get_elemID(int *buff) {
238  int i;
239  for (i = 0; i < ResIO.nelem; i++) {
240  buff[i] = ResIO.elem_global_ID[i];
241  }
242  return buff;
243 }
244 
248 }
249 
253 }
254 
255 /*---------------------------------------------------------------------------*/
256 /* FORTRAN INTERFACE */
257 /*---------------------------------------------------------------------------*/
258 
259 void hecmw_result_init_if(int *n_node, int *n_elem, int *nodeID, int *elemID,
260  int *n_elem_type, int *elem_type_index, int *elem_type_item,
261  int *i_step, char *header, char *comment, int *err,
262  int len) {
263  char header_str[HECMW_HEADER_LEN + 1];
264  char comment_str[HECMW_MSG_LEN + 1];
265 
266  *err = 1;
267  if (HECMW_strcpy_f2c_r(header, len, header_str, sizeof(header_str)) == NULL)
268  return;
269  if (HECMW_strcpy_f2c_r(comment, len, comment_str, sizeof(comment_str)) == NULL)
270  return;
271  if (HECMW_result_io_init(*n_node, *n_elem, nodeID, elemID,
272  *n_elem_type, elem_type_index, elem_type_item,
273  *i_step, header_str, comment_str))
274  return;
275  *err = 0;
276 }
277 
278 void hecmw_result_init_if_(int *n_node, int *n_elem, int *nodeID, int *elemID,
279  int *n_elem_type, int *elem_type_index, int *elem_type_item,
280  int *i_step, char *header, char *comment, int *err,
281  int len) {
282  hecmw_result_init_if(n_node, n_elem, nodeID, elemID,
283  n_elem_type, elem_type_index, elem_type_item,
284  i_step, header, comment, err, len);
285 }
286 
287 void hecmw_result_init_if__(int *n_node, int *n_elem, int *nodeID, int *elemID,
288  int *n_elem_type, int *elem_type_index, int *elem_type_item,
289  int *i_step, char *header, char *comment, int *err,
290  int len) {
291  hecmw_result_init_if(n_node, n_elem, nodeID, elemID,
292  n_elem_type, elem_type_index, elem_type_item,
293  i_step, header, comment, err, len);
294 }
295 
296 void HECMW_RESULT_INIT_IF(int *n_node, int *n_elem, int *nodeID, int *elemID,
297  int *n_elem_type, int *elem_type_index, int *elem_type_item,
298  int *i_step, char *header, char *comment, int *err,
299  int len) {
300  hecmw_result_init_if(n_node, n_elem, nodeID, elemID,
301  n_elem_type, elem_type_index, elem_type_item,
302  i_step, header, comment, err, len);
303 }
304 
305 /*---------------------------------------------------------------------------*/
306 
307 void hecmw_result_finalize_if(int *err) {
308  *err = 1;
309  if (HECMW_result_finalize()) return;
310  *err = 0;
311 }
312 
314 
316 
318 
319 /*---------------------------------------------------------------------------*/
320 
321 void hecmw_result_add_if(int *dtype, int *n_dof, char *label,
322  double *ptr, int *err, int len) {
323  char label_str[HECMW_NAME_LEN + 1];
324 
325  *err = 1;
326 
327  if (HECMW_strcpy_f2c_r(label, len, label_str, sizeof(label_str)) == NULL)
328  return;
329 
330  if (HECMW_result_io_add(*dtype, *n_dof, label_str, ptr)) return;
331 
332  *err = 0;
333 }
334 
335 void hecmw_result_add_if_(int *dtype, int *n_dof, char *label,
336  double *ptr, int *err, int len) {
337  hecmw_result_add_if(dtype, n_dof, label, ptr, err, len);
338 }
339 
340 void hecmw_result_add_if__(int *dtype, int *n_dof, char *label,
341  double *ptr, int *err, int len) {
342  hecmw_result_add_if(dtype, n_dof, label, ptr, err, len);
343 }
344 
345 void HECMW_RESULT_ADD_IF(int *dtype, int *n_dof, char *label,
346  double *ptr, int *err, int len) {
347  hecmw_result_add_if(dtype, n_dof, label, ptr, err, len);
348 }
349 
350 /*----------------------------------------------------------------------------*/
351 
352 void hecmw_result_write_by_name_if(char *name_ID, int *err, int len) {
353  char name_ID_str[HECMW_NAME_LEN + 1];
354 
355  *err = 1;
356 
357  if (HECMW_strcpy_f2c_r(name_ID, len, name_ID_str, sizeof(name_ID_str)) ==
358  NULL)
359  return;
360 
361  if (HECMW_result_write_by_name(name_ID_str)) return;
362 
363  *err = 0;
364 }
365 
366 void hecmw_result_write_by_name_if_(char *name_ID, int *err, int len) {
367  hecmw_result_write_by_name_if(name_ID, err, len);
368 }
369 
370 void hecmw_result_write_by_name_if__(char *name_ID, int *err, int len) {
371  hecmw_result_write_by_name_if(name_ID, err, len);
372 }
373 
374 void HECMW_RESULT_WRITE_BY_NAME_IF(char *name_ID, int *err, int len) {
375  hecmw_result_write_by_name_if(name_ID, err, len);
376 }
377 
378 /*---------------------------------------------------------------------------*/
379 
380 void hecmw_result_write_by_addfname_if(char *name_ID, char *addfname, int *err,
381  int len1, int len2) {
382  char name_ID_str[HECMW_NAME_LEN + 1];
383  char addfname_str[HECMW_NAME_LEN + 1];
384 
385  *err = 1;
386 
387  if (HECMW_strcpy_f2c_r(name_ID, len1, name_ID_str, sizeof(name_ID_str)) ==
388  NULL)
389  return;
390  if (HECMW_strcpy_f2c_r(addfname, len2, addfname_str, sizeof(name_ID_str)) ==
391  NULL)
392  return;
393 
394  if (HECMW_result_write_by_addfname(name_ID_str, addfname_str)) return;
395 
396  *err = 0;
397 }
398 
399 void hecmw_result_write_by_addfname_if_(char *name_ID, char *addfname, int *err,
400  int len1, int len2) {
401  hecmw_result_write_by_addfname_if(name_ID, addfname, err, len1, len2);
402 }
403 
404 void hecmw_result_write_by_addfname_if__(char *name_ID, char *addfname,
405  int *err, int len1, int len2) {
406  hecmw_result_write_by_addfname_if(name_ID, addfname, err, len1, len2);
407 }
408 
409 void HECMW_RESULT_WRITE_BY_ADDFNAME_IF(char *name_ID, char *addfname, int *err,
410  int len1, int len2) {
411  hecmw_result_write_by_addfname_if(name_ID, addfname, err, len1, len2);
412 }
413 
414 /*----------------------------------------------------------------------------*/
415 
416 void hecmw_result_checkfile_by_name_if(char *name_ID, int *i_step, int *err, int len) {
417  char name_ID_str[HECMW_NAME_LEN + 1];
418 
419  *err = 1;
420 
421  if (HECMW_strcpy_f2c_r(name_ID, len, name_ID_str, sizeof(name_ID_str)) ==
422  NULL)
423  return;
424 
425  if (HECMW_result_checkfile_by_name(name_ID_str, *i_step)) return;
426 
427  *err = 0;
428 }
429 
430 void hecmw_result_checkfile_by_name_if_(char *name_ID, int *i_step, int *err, int len) {
431  hecmw_result_checkfile_by_name_if(name_ID, i_step, err, len);
432 }
433 
434 void hecmw_result_checkfile_by_name_if__(char *name_ID, int *i_step, int *err, int len) {
435  hecmw_result_checkfile_by_name_if(name_ID, i_step, err, len);
436 }
437 
438 void HECMW_RESULT_CHECKFILE_BY_NAME_IF(char *name_ID, int *i_step, int *err, int len) {
439  hecmw_result_checkfile_by_name_if(name_ID, i_step, err, len);
440 }
int HECMW_comm_get_rank(void)
Definition: hecmw_comm.c:759
#define HECMW_FILENAME_LEN
Definition: hecmw_config.h:74
#define HECMW_MSG_LEN
Definition: hecmw_config.h:76
#define HECMW_HEADER_LEN
Definition: hecmw_config.h:70
#define HECMW_NAME_LEN
Definition: hecmw_config.h:72
char * HECMW_ctrl_get_result_file(char *name_ID, int istep, int *fg_text)
char * HECMW_ctrl_get_result_fileheader(char *name_ID, int istep, int *fg_text)
#define NULL
char * HECMW_strcpy_f2c_r(const char *fstr, int flen, char *buf, int bufsize)
Definition: hecmw_lib_fc.c:44
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
void hecmw_result_checkfile_by_name_if_(char *name_ID, int *i_step, int *err, int len)
Definition: hecmw_result.c:430
void hecmw_result_init_if_(int *n_node, int *n_elem, int *nodeID, int *elemID, int *n_elem_type, int *elem_type_index, int *elem_type_item, int *i_step, char *header, char *comment, int *err, int len)
Definition: hecmw_result.c:278
int * HECMW_result_get_nodeID(int *buff)
Definition: hecmw_result.c:229
void hecmw_result_write_by_name_if__(char *name_ID, int *err, int len)
Definition: hecmw_result.c:370
void hecmw_result_write_by_addfname_if(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:380
int HECMW_result_get_nnode(void)
Definition: hecmw_result.c:215
void HECMW_result_free_nodeID(void)
Definition: hecmw_result.c:245
char * HECMW_result_get_header(char *buff, size_t buff_size)
Definition: hecmw_result.c:219
void hecmw_result_write_by_addfname_if__(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:404
int HECMW_result_get_nelem(void)
Definition: hecmw_result.c:217
int HECMW_result_init(struct hecmwST_local_mesh *hecMESH, int i_step, char *header, char *comment)
Definition: hecmw_result.c:56
void HECMW_RESULT_WRITE_BY_NAME_IF(char *name_ID, int *err, int len)
Definition: hecmw_result.c:374
void HECMW_RESULT_WRITE_BY_ADDFNAME_IF(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:409
void hecmw_result_init_if(int *n_node, int *n_elem, int *nodeID, int *elemID, int *n_elem_type, int *elem_type_index, int *elem_type_item, int *i_step, char *header, char *comment, int *err, int len)
Definition: hecmw_result.c:259
int HECMW_result_write_by_name(char *name_ID)
Definition: hecmw_result.c:74
int HECMW_result_checkfile_by_name(char *name_ID, int i_step)
Definition: hecmw_result.c:160
void HECMW_RESULT_INIT_IF(int *n_node, int *n_elem, int *nodeID, int *elemID, int *n_elem_type, int *elem_type_index, int *elem_type_item, int *i_step, char *header, char *comment, int *err, int len)
Definition: hecmw_result.c:296
void HECMW_RESULT_FINALIZE_IF(int *err)
Definition: hecmw_result.c:317
void HECMW_result_free(struct hecmwST_result_data *result)
Definition: hecmw_result.c:21
struct hecmwST_result_data * HECMW_result_read_by_fname(char *filename)
Definition: hecmw_result.c:180
void hecmw_result_write_by_name_if(char *name_ID, int *err, int len)
Definition: hecmw_result.c:352
struct hecmwST_result_data * HECMW_result_read_by_name(char *name_ID, int i_step)
Definition: hecmw_result.c:192
void hecmw_result_add_if__(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:340
void hecmw_result_checkfile_by_name_if__(char *name_ID, int *i_step, int *err, int len)
Definition: hecmw_result.c:434
char * HECMW_result_get_comment(char *buff, size_t buff_size)
Definition: hecmw_result.c:224
void hecmw_result_write_by_name_if_(char *name_ID, int *err, int len)
Definition: hecmw_result.c:366
void HECMW_RESULT_CHECKFILE_BY_NAME_IF(char *name_ID, int *i_step, int *err, int len)
Definition: hecmw_result.c:438
void hecmw_result_finalize_if_(int *err)
Definition: hecmw_result.c:313
void HECMW_RESULT_ADD_IF(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:345
void hecmw_result_write_by_addfname_if_(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:399
int * HECMW_result_get_elemID(int *buff)
Definition: hecmw_result.c:237
void hecmw_result_finalize_if__(int *err)
Definition: hecmw_result.c:315
void hecmw_result_checkfile_by_name_if(char *name_ID, int *i_step, int *err, int len)
Definition: hecmw_result.c:416
void hecmw_result_finalize_if(int *err)
Definition: hecmw_result.c:307
void hecmw_result_add_if_(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:335
void HECMW_result_free_elemID(void)
Definition: hecmw_result.c:250
int HECMW_result_finalize(void)
Definition: hecmw_result.c:64
int HECMW_result_write_ST_by_name(char *name_ID, struct hecmwST_result_data *result, int n_node, int n_elem, char *header, char *comment)
Definition: hecmw_result.c:95
void hecmw_result_init_if__(int *n_node, int *n_elem, int *nodeID, int *elemID, int *n_elem_type, int *elem_type_index, int *elem_type_item, int *i_step, char *header, char *comment, int *err, int len)
Definition: hecmw_result.c:287
void hecmw_result_add_if(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:321
int HECMW_result_write_by_addfname(char *name_ID, char *addfname)
Definition: hecmw_result.c:122
void HECMW_result_io_finalize()
int HECMW_result_io_init(int n_node, int n_elem, int *nodeID, int *elemID, int n_elem_type, int *elem_type_index, int *elem_type_item, int i_step, char *header, char *comment)
int HECMW_result_io_add(int dtype, int n_dof, char *label, double *ptr)
struct hecmwST_result_io_data ResIO
int HECMW_result_io_bin_judge_file(char *filename)
struct hecmwST_result_data * HECMW_result_io_bin_read_by_fname(char *filename)
int HECMW_result_io_bin_write_ST_by_fname(char *filename, struct hecmwST_result_data *result, int n_node, int n_elem, char *header, char *comment)
int HECMW_result_io_bin_write_by_fname(char *filename)
int HECMW_result_io_txt_write_by_fname(char *filename)
int HECMW_result_io_txt_write_ST_by_fname(char *filename, struct hecmwST_result_data *result, int n_node, int n_elem, char *header, char *comment)
struct hecmwST_result_data * HECMW_result_io_txt_read_by_fname(char *filename)
integer(kind=kint) myrank
PARALLEL EXECUTION.
Definition: m_fstr.F90:98
double * elem_val_item
Definition: hecmw_result.h:23
double * global_val_item
Definition: hecmw_result.h:21
double * node_val_item
Definition: hecmw_result.h:22
char comment_line[HECMW_MSG_LEN+1]
char head[HECMW_HEADER_LEN+1]