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, HECMW_FILENAME_LEN + 1, "%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, HECMW_FILENAME_LEN + 1, "%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  strncpy(base_mod, basename, HECMW_FILENAME_LEN);
135  base_mod[HECMW_FILENAME_LEN] = '\0';
136  dot = strrchr(base_mod, '.');
137  if (dot != NULL) {
138  char suffix[HECMW_FILENAME_LEN + 1];
139  strncpy(suffix, dot, HECMW_FILENAME_LEN);
140  suffix[HECMW_FILENAME_LEN] = '\0';
141  *dot = '\0';
142  snprintf(dot, HECMW_FILENAME_LEN - (dot - base_mod), "%s%s", addfname, suffix);
143  } else {
144  strncat(base_mod, addfname, HECMW_FILENAME_LEN - strlen(base_mod));
145  }
146 
148  ret = snprintf(filename, HECMW_FILENAME_LEN + 1, "%s.%d.%d", base_mod,
149  myrank, ResIO.istep);
150  HECMW_free(basename);
151  if (ret > HECMW_FILENAME_LEN) return -1;
152 
153  if (fg_text) {
154  if (HECMW_result_io_txt_write_by_fname(filename)) return -1;
155  } else {
156  if (HECMW_result_io_bin_write_by_fname(filename)) return -1;
157  }
158 
159  return 0;
160 }
161 
162 int HECMW_result_checkfile_by_name(char *name_ID, int i_step) {
163  char *basename, filename[HECMW_FILENAME_LEN + 1];
164  int fg_text, ret;
165  FILE *fp;
166 
167  if ((basename = HECMW_ctrl_get_result_file(name_ID, i_step,
168  &fg_text)) == NULL)
169  return -1;
170 
171  ret = snprintf(filename, HECMW_FILENAME_LEN + 1, "%s.%d", basename, i_step);
172  HECMW_free(basename);
173  if (ret > HECMW_FILENAME_LEN) return -1;
174 
175  fp = fopen(filename, "r");
176  if (fp == NULL) return -1;
177  fclose(fp);
178 
179  return 0;
180 }
181 
183  struct hecmwST_result_data *result;
184 
185  if (HECMW_result_io_bin_judge_file(filename)) {
186  result = HECMW_result_io_bin_read_by_fname(filename);
187  } else {
188  result = HECMW_result_io_txt_read_by_fname(filename);
189  }
190 
191  return result;
192 }
193 
195  int i_step) {
196  char *basename, filename[HECMW_FILENAME_LEN + 1];
197  struct hecmwST_result_data *result;
198  int fg_text, ret;
199 
200  if ((basename = HECMW_ctrl_get_result_file(name_ID, i_step,
201  &fg_text)) == NULL)
202  return NULL;
203 
204  ret = snprintf(filename, HECMW_FILENAME_LEN + 1, "%s.%d", basename, i_step);
205  HECMW_free(basename);
206  if (ret > HECMW_FILENAME_LEN) return NULL;
207 
208  if ((result = HECMW_result_read_by_fname(filename)) == NULL) return NULL;
209 
210  return result;
211 }
212 
213 /*---------------------------------------------------------------------------*/
214 /* etc. */
215 /*---------------------------------------------------------------------------*/
216 
217 int HECMW_result_get_nnode(void) { return ResIO.nnode; }
218 
219 int HECMW_result_get_nelem(void) { return ResIO.nelem; }
220 
221 char *HECMW_result_get_header(char *buff) {
222  strcpy(buff, ResIO.head);
223  return buff;
224 }
225 
226 char *HECMW_result_get_comment(char *buff) {
227  strcpy(buff, ResIO.comment_line);
228  return buff;
229 }
230 
231 int *HECMW_result_get_nodeID(int *buff) {
232  int i;
233  for (i = 0; i < ResIO.nnode; i++) {
234  buff[i] = ResIO.node_global_ID[i];
235  }
236  return buff;
237 }
238 
239 int *HECMW_result_get_elemID(int *buff) {
240  int i;
241  for (i = 0; i < ResIO.nelem; i++) {
242  buff[i] = ResIO.elem_global_ID[i];
243  }
244  return buff;
245 }
246 
250 }
251 
255 }
256 
257 /*---------------------------------------------------------------------------*/
258 /* FORTRAN INTERFACE */
259 /*---------------------------------------------------------------------------*/
260 
261 void hecmw_result_init_if(int *n_node, int *n_elem, int *nodeID, int *elemID,
262  int *n_elem_type, int *elem_type_index, int *elem_type_item,
263  int *i_step, char *header, char *comment, int *err,
264  int len) {
265  char header_str[HECMW_HEADER_LEN + 1];
266  char comment_str[HECMW_MSG_LEN + 1];
267 
268  *err = 1;
269  if (HECMW_strcpy_f2c_r(header, len, header_str, sizeof(header_str)) == NULL)
270  return;
271  if (HECMW_strcpy_f2c_r(comment, len, comment_str, sizeof(comment_str)) == NULL)
272  return;
273  if (HECMW_result_io_init(*n_node, *n_elem, nodeID, elemID,
274  *n_elem_type, elem_type_index, elem_type_item,
275  *i_step, header_str, comment_str))
276  return;
277  *err = 0;
278 }
279 
280 void hecmw_result_init_if_(int *n_node, int *n_elem, int *nodeID, int *elemID,
281  int *n_elem_type, int *elem_type_index, int *elem_type_item,
282  int *i_step, char *header, char *comment, int *err,
283  int len) {
284  hecmw_result_init_if(n_node, n_elem, nodeID, elemID,
285  n_elem_type, elem_type_index, elem_type_item,
286  i_step, header, comment, err, len);
287 }
288 
289 void hecmw_result_init_if__(int *n_node, int *n_elem, int *nodeID, int *elemID,
290  int *n_elem_type, int *elem_type_index, int *elem_type_item,
291  int *i_step, char *header, char *comment, int *err,
292  int len) {
293  hecmw_result_init_if(n_node, n_elem, nodeID, elemID,
294  n_elem_type, elem_type_index, elem_type_item,
295  i_step, header, comment, err, len);
296 }
297 
298 void HECMW_RESULT_INIT_IF(int *n_node, int *n_elem, int *nodeID, int *elemID,
299  int *n_elem_type, int *elem_type_index, int *elem_type_item,
300  int *i_step, char *header, char *comment, int *err,
301  int len) {
302  hecmw_result_init_if(n_node, n_elem, nodeID, elemID,
303  n_elem_type, elem_type_index, elem_type_item,
304  i_step, header, comment, err, len);
305 }
306 
307 /*---------------------------------------------------------------------------*/
308 
309 void hecmw_result_finalize_if(int *err) {
310  *err = 1;
311  if (HECMW_result_finalize()) return;
312  *err = 0;
313 }
314 
316 
318 
320 
321 /*---------------------------------------------------------------------------*/
322 
323 void hecmw_result_add_if(int *dtype, int *n_dof, char *label,
324  double *ptr, int *err, int len) {
325  char label_str[HECMW_NAME_LEN + 1];
326 
327  *err = 1;
328 
329  if (HECMW_strcpy_f2c_r(label, len, label_str, sizeof(label_str)) == NULL)
330  return;
331 
332  if (HECMW_result_io_add(*dtype, *n_dof, label_str, ptr)) return;
333 
334  *err = 0;
335 }
336 
337 void hecmw_result_add_if_(int *dtype, int *n_dof, char *label,
338  double *ptr, int *err, int len) {
339  hecmw_result_add_if(dtype, n_dof, label, ptr, err, len);
340 }
341 
342 void hecmw_result_add_if__(int *dtype, int *n_dof, char *label,
343  double *ptr, int *err, int len) {
344  hecmw_result_add_if(dtype, n_dof, label, ptr, err, len);
345 }
346 
347 void HECMW_RESULT_ADD_IF(int *dtype, int *n_dof, char *label,
348  double *ptr, int *err, int len) {
349  hecmw_result_add_if(dtype, n_dof, label, ptr, err, len);
350 }
351 
352 /*----------------------------------------------------------------------------*/
353 
354 void hecmw_result_write_by_name_if(char *name_ID, int *err, int len) {
355  char name_ID_str[HECMW_NAME_LEN + 1];
356 
357  *err = 1;
358 
359  if (HECMW_strcpy_f2c_r(name_ID, len, name_ID_str, sizeof(name_ID_str)) ==
360  NULL)
361  return;
362 
363  if (HECMW_result_write_by_name(name_ID_str)) return;
364 
365  *err = 0;
366 }
367 
368 void hecmw_result_write_by_name_if_(char *name_ID, int *err, int len) {
369  hecmw_result_write_by_name_if(name_ID, err, len);
370 }
371 
372 void hecmw_result_write_by_name_if__(char *name_ID, int *err, int len) {
373  hecmw_result_write_by_name_if(name_ID, err, len);
374 }
375 
376 void HECMW_RESULT_WRITE_BY_NAME_IF(char *name_ID, int *err, int len) {
377  hecmw_result_write_by_name_if(name_ID, err, len);
378 }
379 
380 /*---------------------------------------------------------------------------*/
381 
382 void hecmw_result_write_by_addfname_if(char *name_ID, char *addfname, int *err,
383  int len1, int len2) {
384  char name_ID_str[HECMW_NAME_LEN + 1];
385  char addfname_str[HECMW_NAME_LEN + 1];
386 
387  *err = 1;
388 
389  if (HECMW_strcpy_f2c_r(name_ID, len1, name_ID_str, sizeof(name_ID_str)) ==
390  NULL)
391  return;
392  if (HECMW_strcpy_f2c_r(addfname, len2, addfname_str, sizeof(name_ID_str)) ==
393  NULL)
394  return;
395 
396  if (HECMW_result_write_by_addfname(name_ID_str, addfname_str)) return;
397 
398  *err = 0;
399 }
400 
401 void hecmw_result_write_by_addfname_if_(char *name_ID, char *addfname, int *err,
402  int len1, int len2) {
403  hecmw_result_write_by_addfname_if(name_ID, addfname, err, len1, len2);
404 }
405 
406 void hecmw_result_write_by_addfname_if__(char *name_ID, char *addfname,
407  int *err, int len1, int len2) {
408  hecmw_result_write_by_addfname_if(name_ID, addfname, err, len1, len2);
409 }
410 
411 void HECMW_RESULT_WRITE_BY_ADDFNAME_IF(char *name_ID, char *addfname, int *err,
412  int len1, int len2) {
413  hecmw_result_write_by_addfname_if(name_ID, addfname, err, len1, len2);
414 }
415 
416 /*----------------------------------------------------------------------------*/
417 
418 void hecmw_result_checkfile_by_name_if(char *name_ID, int *i_step, int *err, int len) {
419  char name_ID_str[HECMW_NAME_LEN + 1];
420 
421  *err = 1;
422 
423  if (HECMW_strcpy_f2c_r(name_ID, len, name_ID_str, sizeof(name_ID_str)) ==
424  NULL)
425  return;
426 
427  if (HECMW_result_checkfile_by_name(name_ID_str, *i_step)) return;
428 
429  *err = 0;
430 }
431 
432 void hecmw_result_checkfile_by_name_if_(char *name_ID, int *i_step, int *err, int len) {
433  hecmw_result_checkfile_by_name_if(name_ID, i_step, err, len);
434 }
435 
436 void hecmw_result_checkfile_by_name_if__(char *name_ID, int *i_step, int *err, int len) {
437  hecmw_result_checkfile_by_name_if(name_ID, i_step, err, len);
438 }
439 
440 void HECMW_RESULT_CHECKFILE_BY_NAME_IF(char *name_ID, int *i_step, int *err, int len) {
441  hecmw_result_checkfile_by_name_if(name_ID, i_step, err, len);
442 }
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:45
#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:432
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:280
int * HECMW_result_get_nodeID(int *buff)
Definition: hecmw_result.c:231
void hecmw_result_write_by_name_if__(char *name_ID, int *err, int len)
Definition: hecmw_result.c:372
void hecmw_result_write_by_addfname_if(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:382
int HECMW_result_get_nnode(void)
Definition: hecmw_result.c:217
void HECMW_result_free_nodeID(void)
Definition: hecmw_result.c:247
void hecmw_result_write_by_addfname_if__(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:406
int HECMW_result_get_nelem(void)
Definition: hecmw_result.c:219
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:376
void HECMW_RESULT_WRITE_BY_ADDFNAME_IF(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:411
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:261
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:162
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:298
void HECMW_RESULT_FINALIZE_IF(int *err)
Definition: hecmw_result.c:319
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:182
void hecmw_result_write_by_name_if(char *name_ID, int *err, int len)
Definition: hecmw_result.c:354
char * HECMW_result_get_comment(char *buff)
Definition: hecmw_result.c:226
struct hecmwST_result_data * HECMW_result_read_by_name(char *name_ID, int i_step)
Definition: hecmw_result.c:194
void hecmw_result_add_if__(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:342
void hecmw_result_checkfile_by_name_if__(char *name_ID, int *i_step, int *err, int len)
Definition: hecmw_result.c:436
void hecmw_result_write_by_name_if_(char *name_ID, int *err, int len)
Definition: hecmw_result.c:368
void HECMW_RESULT_CHECKFILE_BY_NAME_IF(char *name_ID, int *i_step, int *err, int len)
Definition: hecmw_result.c:440
void hecmw_result_finalize_if_(int *err)
Definition: hecmw_result.c:315
void HECMW_RESULT_ADD_IF(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:347
void hecmw_result_write_by_addfname_if_(char *name_ID, char *addfname, int *err, int len1, int len2)
Definition: hecmw_result.c:401
int * HECMW_result_get_elemID(int *buff)
Definition: hecmw_result.c:239
void hecmw_result_finalize_if__(int *err)
Definition: hecmw_result.c:317
void hecmw_result_checkfile_by_name_if(char *name_ID, int *i_step, int *err, int len)
Definition: hecmw_result.c:418
void hecmw_result_finalize_if(int *err)
Definition: hecmw_result.c:309
void hecmw_result_add_if_(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:337
char * HECMW_result_get_header(char *buff)
Definition: hecmw_result.c:221
void HECMW_result_free_elemID(void)
Definition: hecmw_result.c:252
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:289
void hecmw_result_add_if(int *dtype, int *n_dof, char *label, double *ptr, int *err, int len)
Definition: hecmw_result.c:323
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]