FrontISTR  5.7.0
Large-scale structural analysis program with finit element method
hecmw_restart.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 <errno.h>
10 #include "hecmw_util.h"
11 #include "hecmw_config.h"
12 #include "hecmw_restart.h"
13 
14 struct restart_list {
15  void *data;
16  size_t size;
17  struct restart_list *next;
18 };
19 
20 static struct restart_list *first_list = NULL;
21 static struct restart_list *previ_list = NULL;
22 static FILE *restart_fp;
23 
24 static void clear(void) {
25  struct restart_list *p, *q;
26 
27  for (p = first_list; p; p = q) {
28  q = p->next;
29  HECMW_free(p->data);
30  HECMW_free(p);
31  }
32  first_list = NULL;
33  previ_list = NULL;
34 }
35 
36 int HECMW_restart_open_by_name(char *name_ID) {
37  char *filename;
38 
39  if (name_ID) {
40  if ((filename = HECMW_ctrl_get_restart_file(name_ID)) == NULL) return -1;
41  } else {
42  /* io is bitmap */
44  if ((filename = HECMW_ctrl_get_restart_file_by_io(io)) == NULL) return -1;
45  }
46 
47  if ((restart_fp = fopen(filename, "rb")) == NULL) {
48  HECMW_set_error(HECMW_UTIL_E0101, "File: %s, %s", filename,
49  HECMW_strmsg(errno));
50  HECMW_free(filename);
51  return -1;
52  }
53  HECMW_free(filename);
54  return 0;
55 }
56 
58 
60  if (restart_fp == NULL) return 0;
61  if (fclose(restart_fp)) {
63  return -1;
64  }
65  restart_fp = NULL;
66  return 0;
67 }
68 
69 static int restart_read(void *ptr, size_t size, size_t nmemb, FILE *stream) {
70  int rc, msgno;
71 
72  rc = fread(ptr, size, nmemb, stream);
73  if (rc != nmemb) {
74  if (feof(stream)) {
75  msgno = HECMW_UTIL_E0104;
76  } else if (ferror(stream)) {
77  msgno = HECMW_UTIL_E0105;
78  }
79  return msgno;
80  }
81  return 0;
82 }
83 
84 void *HECMW_restart_read(void *addr) {
85  int rc;
86  size_t size;
87  void *data;
88 
89  if (restart_fp == NULL) {
91  return NULL;
92  }
93 
94  /* read size */
95  rc = restart_read(&size, sizeof(size), 1, restart_fp);
96  if (rc) {
97  HECMW_set_error(rc, "");
98  return NULL;
99  }
100 
101  /* read data */
102  if (addr == NULL) {
104  if (data == NULL) {
105  HECMW_set_error(errno, "");
106  return NULL;
107  }
108  } else {
109  data = addr;
110  }
111  rc = restart_read(data, size, 1, restart_fp);
112  if (rc) {
113  HECMW_set_error(rc, "");
114  return NULL;
115  }
116 
117  return data;
118 }
119 
120 int HECMW_restart_add(void *data, size_t size) {
121  struct restart_list *rst;
122 
123  rst = HECMW_malloc(sizeof(*rst));
124  if (rst == NULL) {
125  HECMW_set_error(errno, "");
126  return -1;
127  }
128 
129  rst->data = data;
130  rst->size = size;
131  rst->next = NULL;
132 
133  if (previ_list != NULL) previ_list->next = rst;
134  previ_list = rst;
135  if (first_list == NULL) first_list = rst;
136 
137  return 0;
138 }
139 
140 int HECMW_restart_add_int(int *data, int n_data) {
141  return HECMW_restart_add(data, sizeof(int) * n_data);
142 }
143 
144 int HECMW_restart_add_double(double *data, int n_data) {
145  return HECMW_restart_add(data, sizeof(double) * n_data);
146 }
147 
148 static int restart_write(const void *ptr, size_t size, size_t nmemb,
149  FILE *stream) {
150  int rc, msgno;
151 
152  rc = fwrite(ptr, size, nmemb, stream);
153  if (rc != nmemb) {
154  if (feof(stream)) {
155  msgno = HECMW_UTIL_E0104;
156  } else if (ferror(stream)) {
157  msgno = HECMW_UTIL_E0105;
158  }
159  return msgno;
160  }
161  return 0;
162 }
163 
164 int HECMW_restart_write_by_name(char *name_ID) {
165  FILE *fp;
166  struct restart_list *p;
167  char *filename;
168  int rc;
169 
170  if (previ_list == NULL) return 0;
171 
172  if (name_ID) {
173  if ((filename = HECMW_ctrl_get_restart_file(name_ID)) == NULL) return -1;
174  } else {
175  /* io is bitmap */
177  if ((filename = HECMW_ctrl_get_restart_file_by_io(io)) == NULL) return -1;
178  }
179 
180  if (HECMW_ctrl_is_subdir()) {
181  if (HECMW_ctrl_make_subdir(filename)) {
182  HECMW_free(filename);
183  return -1;
184  }
185  }
186 
187  if ((fp = fopen(filename, "wb")) == NULL) {
188  HECMW_set_error(HECMW_UTIL_E0101, "File: %s, %s", filename,
189  HECMW_strmsg(errno));
190  HECMW_free(filename);
191  return -1;
192  }
193  HECMW_free(filename);
194 
195  for (p = first_list; p; p = p->next) {
196  /* write size */
197  rc = restart_write(&p->size, sizeof(p->size), 1, fp);
198  if (rc) {
199  HECMW_set_error(rc, "");
200  return -1;
201  }
202  /* write data */
203  rc = restart_write(p->data, p->size, 1, fp);
204  if (rc) {
205  HECMW_set_error(rc, "");
206  return -1;
207  }
208  }
209 
210  if (fclose(fp)) {
211  HECMW_set_error(errno, "");
212  return -1;
213  }
214 
215  clear();
216 
217  return 0;
218 }
219 
221 
222 /*----------------------------------------------------------------------------*/
223 
224 void hecmw_restart_open_by_name_if(char *name_ID, int *err, int len) {
225  char *name = NULL;
226  char cname[HECMW_NAME_LEN + 1];
227 
228  *err = 1;
229 
230  if (name_ID) {
231  if (HECMW_strcpy_f2c_r(name_ID, len, cname, sizeof(cname)) == NULL) return;
232  name = cname;
233  }
234 
235  if (HECMW_restart_open_by_name(name)) return;
236 
237  *err = 0;
238 }
239 
240 void hecmw_restart_open_by_name_if_(char *name_ID, int *err, int len) {
241  hecmw_restart_open_by_name_if(name_ID, err, len);
242 }
243 
244 void hecmw_restart_open_by_name_if__(char *name_ID, int *err, int len) {
245  hecmw_restart_open_by_name_if(name_ID, err, len);
246 }
247 
248 void HECMW_RESTART_OPEN_BY_NAME_IF(char *name_ID, int *err, int len) {
249  hecmw_restart_open_by_name_if(name_ID, err, len);
250 }
251 
252 /*----------------------------------------------------------------------------*/
253 
254 void hecmw_restart_open_if(int *err) {
256 }
257 
259 
261 
263 
264 /*----------------------------------------------------------------------------*/
265 
266 void hecmw_restart_close_if(int *err) { *err = HECMW_restart_close() ? 1 : 0; }
267 
269 
271 
273 
274 /*----------------------------------------------------------------------------*/
275 
276 void hecmw_restart_read_int_if(int *dst, int *err) {
277  *err = 1;
278 
279  if (dst == NULL) {
281  return;
282  }
283  if (HECMW_restart_read(dst) == NULL) return;
284 
285  *err = 0;
286 }
287 
288 void hecmw_restart_read_int_if_(int *dst, int *err) {
289  hecmw_restart_read_int_if(dst, err);
290 }
291 
292 void hecmw_restart_read_int_if__(int *dst, int *err) {
293  hecmw_restart_read_int_if(dst, err);
294 }
295 
296 void HECMW_RESTART_READ_INT_IF(int *dst, int *err) {
297  hecmw_restart_read_int_if(dst, err);
298 }
299 
300 /*----------------------------------------------------------------------------*/
301 
302 void hecmw_restart_read_real_if(double *dst, int *err) {
303  *err = 1;
304 
305  if (dst == NULL) {
307  return;
308  }
309  if (HECMW_restart_read(dst) == NULL) return;
310 
311  *err = 0;
312 }
313 
314 void hecmw_restart_read_real_if_(double *dst, int *err) {
315  hecmw_restart_read_real_if(dst, err);
316 }
317 
318 void hecmw_restart_read_real_if__(double *dst, int *err) {
319  hecmw_restart_read_real_if(dst, err);
320 }
321 
322 void HECMW_RESTART_READ_REAL_IF(double *dst, int *err) {
323  hecmw_restart_read_real_if(dst, err);
324 }
325 
326 /*----------------------------------------------------------------------------*/
327 
328 static void *restart_add_alloc(void *data, int byte, int n_data) {
329  int size;
330  void *cdata;
331 
332  size = byte * n_data;
333  cdata = HECMW_malloc(size);
334  if (cdata == NULL) {
335  HECMW_set_error(errno, "");
336  return NULL;
337  }
338  memcpy(cdata, data, size);
339 
340  return cdata;
341 }
342 
343 void hecmw_restart_add_int_if(int *data, int *n_data, int *err) {
344  int *cdata;
345 
346  cdata = restart_add_alloc(data, sizeof(int), *n_data);
347  if (cdata == NULL) {
348  *err = 1;
349  return;
350  }
351 
352  *err = HECMW_restart_add_int(cdata, *n_data);
353 }
354 
355 void hecmw_restart_add_int_if_(int *data, int *n_data, int *err) {
356  hecmw_restart_add_int_if(data, n_data, err);
357 }
358 
359 void hecmw_restart_add_int_if__(int *data, int *n_data, int *err) {
360  hecmw_restart_add_int_if(data, n_data, err);
361 }
362 
363 void HECMW_RESTART_ADD_INT_IF(int *data, int *n_data, int *err) {
364  hecmw_restart_add_int_if(data, n_data, err);
365 }
366 
367 /*----------------------------------------------------------------------------*/
368 
369 void hecmw_restart_add_real_if(double *data, int *n_data, int *err) {
370  void *cdata;
371 
372  cdata = restart_add_alloc(data, sizeof(double), *n_data);
373  if (cdata == NULL) {
374  *err = 1;
375  return;
376  }
377  *err = HECMW_restart_add_double(cdata, *n_data);
378 }
379 
380 void hecmw_restart_add_real_if_(double *data, int *n_data, int *err) {
381  hecmw_restart_add_real_if(data, n_data, err);
382 }
383 
384 void hecmw_restart_add_real_if__(double *data, int *n_data, int *err) {
385  hecmw_restart_add_real_if(data, n_data, err);
386 }
387 
388 void HECMW_RESTART_ADD_REAL_IF(double *data, int *n_data, int *err) {
389  hecmw_restart_add_real_if(data, n_data, err);
390 }
391 
392 /*----------------------------------------------------------------------------*/
393 
394 void hecmw_restart_write_by_name_if(char *name_ID, int *err, int len) {
395  char *name = NULL;
396  char cname[HECMW_NAME_LEN + 1];
397 
398  *err = 1;
399 
400  if (name_ID) {
401  if (HECMW_strcpy_f2c_r(name_ID, len, cname, sizeof(cname)) == NULL) return;
402  name = cname;
403  }
404 
405  if (HECMW_restart_write_by_name(name)) return;
406 
407  *err = 0;
408 }
409 
410 void hecmw_restart_write_by_name_if_(char *name_ID, int *err, int len) {
411  hecmw_restart_write_by_name_if(name_ID, err, len);
412 }
413 
414 void hecmw_restart_write_by_name_if__(char *name_ID, int *err, int len) {
415  hecmw_restart_write_by_name_if(name_ID, err, len);
416 }
417 
418 void HECMW_RESTART_WRITE_BY_NAME_IF(char *name_ID, int *err, int len) {
419  hecmw_restart_write_by_name_if(name_ID, err, len);
420 }
421 
422 /*----------------------------------------------------------------------------*/
423 
424 void hecmw_restart_write_if(int *err) {
426 }
427 
429 
431 
hecmw_restart_read_int_if_
void hecmw_restart_read_int_if_(int *dst, int *err)
Definition: hecmw_restart.c:288
hecmw_restart_add_int_if_
void hecmw_restart_add_int_if_(int *data, int *n_data, int *err)
Definition: hecmw_restart.c:355
hecmw_restart_write_by_name_if_
void hecmw_restart_write_by_name_if_(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:410
HECMW_RESTART_ADD_INT_IF
void HECMW_RESTART_ADD_INT_IF(int *data, int *n_data, int *err)
Definition: hecmw_restart.c:363
hecmw_restart_add_real_if__
void hecmw_restart_add_real_if__(double *data, int *n_data, int *err)
Definition: hecmw_restart.c:384
HECMW_malloc
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
restart_list::next
struct restart_list * next
Definition: hecmw_restart.c:20
hecmw_restart_read_real_if
void hecmw_restart_read_real_if(double *dst, int *err)
Definition: hecmw_restart.c:302
HECMW_restart_add_int
int HECMW_restart_add_int(int *data, int n_data)
Definition: hecmw_restart.c:140
HECMW_restart_write
int HECMW_restart_write(void)
Definition: hecmw_restart.c:220
hecmw_restart_read_real_if__
void hecmw_restart_read_real_if__(double *dst, int *err)
Definition: hecmw_restart.c:318
HECMW_restart_close
int HECMW_restart_close(void)
Definition: hecmw_restart.c:59
HECMW_RESTART_WRITE_BY_NAME_IF
void HECMW_RESTART_WRITE_BY_NAME_IF(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:418
HECMW_RESTART_WRITE_IF
void HECMW_RESTART_WRITE_IF(int *err)
Definition: hecmw_restart.c:432
HECMW_restart_read
void * HECMW_restart_read(void *addr)
Definition: hecmw_restart.c:84
hecmw_restart_close_if
void hecmw_restart_close_if(int *err)
Definition: hecmw_restart.c:266
HECMW_ctrl_make_subdir
int HECMW_ctrl_make_subdir(char *filename)
Definition: hecmw_control.c:2447
HECMW_UTIL_E0101
#define HECMW_UTIL_E0101
Definition: hecmw_msgno.h:363
hecmw_restart_close_if_
void hecmw_restart_close_if_(int *err)
Definition: hecmw_restart.c:268
HECMW_RESTART_READ_REAL_IF
void HECMW_RESTART_READ_REAL_IF(double *dst, int *err)
Definition: hecmw_restart.c:322
HECMW_CTRL_FILE_IO_IN
#define HECMW_CTRL_FILE_IO_IN
Definition: hecmw_control.h:28
hecmw_restart_write_if__
void hecmw_restart_write_if__(int *err)
Definition: hecmw_restart.c:430
hecmw_restart_read_int_if
void hecmw_restart_read_int_if(int *dst, int *err)
Definition: hecmw_restart.c:276
HECMW_NAME_LEN
#define HECMW_NAME_LEN
Definition: hecmw_config.h:70
hecmw_config.h
HECMW_RESTART_READ_INT_IF
void HECMW_RESTART_READ_INT_IF(int *dst, int *err)
Definition: hecmw_restart.c:296
HECMW_restart_add
int HECMW_restart_add(void *data, size_t size)
Definition: hecmw_restart.c:120
HECMW_restart_add_double
int HECMW_restart_add_double(double *data, int n_data)
Definition: hecmw_restart.c:144
HECMW_restart_write_by_name
int HECMW_restart_write_by_name(char *name_ID)
Definition: hecmw_restart.c:164
hecmw_restart_write_if_
void hecmw_restart_write_if_(int *err)
Definition: hecmw_restart.c:428
data
CNFData data
Definition: neu_reporter.cpp:18
hecmw_restart_write_by_name_if__
void hecmw_restart_write_by_name_if__(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:414
HECMW_strmsg
char * HECMW_strmsg(int msgno)
Definition: hecmw_msg.c:31
HECMW_ALL_E0101
#define HECMW_ALL_E0101
Definition: hecmw_msgno.h:8
hecmw_restart_read_int_if__
void hecmw_restart_read_int_if__(int *dst, int *err)
Definition: hecmw_restart.c:292
hecmw_restart_open_by_name_if_
void hecmw_restart_open_by_name_if_(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:240
hecmw_restart_write_by_name_if
void hecmw_restart_write_by_name_if(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:394
hecmw_restart_add_int_if__
void hecmw_restart_add_int_if__(int *data, int *n_data, int *err)
Definition: hecmw_restart.c:359
hecmw_restart_open_if__
void hecmw_restart_open_if__(int *err)
Definition: hecmw_restart.c:260
HECMW_ctrl_get_restart_file
char * HECMW_ctrl_get_restart_file(char *name_ID)
Definition: hecmw_control.c:2341
hecmw_restart_open_by_name_if
void hecmw_restart_open_by_name_if(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:224
hecmw_restart_open_by_name_if__
void hecmw_restart_open_by_name_if__(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:244
hecmw_restart_read_real_if_
void hecmw_restart_read_real_if_(double *dst, int *err)
Definition: hecmw_restart.c:314
hecmw_restart_add_int_if
void hecmw_restart_add_int_if(int *data, int *n_data, int *err)
Definition: hecmw_restart.c:343
HECMW_strcpy_f2c_r
char * HECMW_strcpy_f2c_r(const char *fstr, int flen, char *buf, int bufsize)
Definition: hecmw_lib_fc.c:45
HECMW_UTIL_E0104
#define HECMW_UTIL_E0104
Definition: hecmw_msgno.h:366
hecmw_restart_write_if
void hecmw_restart_write_if(int *err)
Definition: hecmw_restart.c:424
hecmw_restart_open_if_
void hecmw_restart_open_if_(int *err)
Definition: hecmw_restart.c:258
HECMW_restart_open
int HECMW_restart_open(void)
Definition: hecmw_restart.c:57
HECMW_UTIL_E0102
#define HECMW_UTIL_E0102
Definition: hecmw_msgno.h:364
HECMW_restart_open_by_name
int HECMW_restart_open_by_name(char *name_ID)
Definition: hecmw_restart.c:36
HECMW_UTIL_E0103
#define HECMW_UTIL_E0103
Definition: hecmw_msgno.h:365
HECMW_CTRL_FILE_IO_OUT
#define HECMW_CTRL_FILE_IO_OUT
Definition: hecmw_control.h:30
HECMW_set_error
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:37
restart_list::data
void * data
Definition: hecmw_restart.c:18
HECMW_CTRL_FILE_IO_INOUT
#define HECMW_CTRL_FILE_IO_INOUT
Definition: hecmw_control.h:37
NULL
#define NULL
Definition: hecmw_io_nastran.c:30
HECMW_free
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
HECMW_ctrl_get_restart_file_by_io
char * HECMW_ctrl_get_restart_file_by_io(int io)
Definition: hecmw_control.c:2386
hecmw_restart_add_real_if_
void hecmw_restart_add_real_if_(double *data, int *n_data, int *err)
Definition: hecmw_restart.c:380
restart_list
Definition: hecmw_restart.c:14
HECMW_RESTART_OPEN_IF
void HECMW_RESTART_OPEN_IF(int *err)
Definition: hecmw_restart.c:262
hecmw_restart.h
hecmw_util.h
HECMW_UTIL_E0105
#define HECMW_UTIL_E0105
Definition: hecmw_msgno.h:367
HECMW_RESTART_OPEN_BY_NAME_IF
void HECMW_RESTART_OPEN_BY_NAME_IF(char *name_ID, int *err, int len)
Definition: hecmw_restart.c:248
hecmw_restart_add_real_if
void hecmw_restart_add_real_if(double *data, int *n_data, int *err)
Definition: hecmw_restart.c:369
restart_list::size
size_t size
Definition: hecmw_restart.c:19
HECMW_ctrl_is_subdir
int HECMW_ctrl_is_subdir(void)
Definition: hecmw_control.c:2500
hecmw_restart_close_if__
void hecmw_restart_close_if__(int *err)
Definition: hecmw_restart.c:270
HECMW_RESTART_ADD_REAL_IF
void HECMW_RESTART_ADD_REAL_IF(double *data, int *n_data, int *err)
Definition: hecmw_restart.c:388
hecmw_restart_open_if
void hecmw_restart_open_if(int *err)
Definition: hecmw_restart.c:254
HECMW_RESTART_CLOSE_IF
void HECMW_RESTART_CLOSE_IF(int *err)
Definition: hecmw_restart.c:272