FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_result_io_txt.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 <string.h>
9 #include <errno.h>
10 #include "hecmw_util.h"
11 #include "hecmw_result.h"
12 #include "hecmw_result_io.h"
13 
14 #define COL_INT 10
15 #define COL_DOUBLE 5
16 
17 #define LINEBUF_SIZE 1023
18 static char Line_Buf[LINEBUF_SIZE + 1];
19 
20 /*---------------------------------------------------------------------------*/
21 /* TEXT MODE I/O ---- output_result */
22 /*---------------------------------------------------------------------------*/
23 
24 
25 static int output_result_header(FILE *fp) {
26  int rc;
27 
28  /* header */
30  char temp_head[HECMW_HEADER_LEN + 16];
31  snprintf(temp_head, sizeof(temp_head), "%s %d.%d", ResIO.head, HECMW_RESULT_FILEVER_MAJOR, HECMW_RESULT_FILEVER_MINOR);
32  snprintf(ResIO.head, sizeof(ResIO.head), "%s", temp_head);
33  }
34  rc = fprintf(fp, "%s\n", ResIO.head);
35  if(rc < 0) {
37  return -1;
38  }
39 
40  return 0;
41 }
42 
43 
44 static int output_result_global(FILE *fp) {
45  int i,j,k,n,rc,ng_comp;
46  struct result_list *p,**data;
47 
48  /* comment */
49  rc = fprintf(fp, "*comment\n");
50  if(rc < 0) {
51  HECMW_set_error(HECMW_UTIL_E0205, "*comment");
52  return -1;
53  }
54  rc = fprintf(fp, "%s\n", ResIO.comment_line);
55  if(rc < 0) {
57  return -1;
58  }
59 
60  /* global header */
61  rc = fprintf(fp, "*global\n");
62  if(rc < 0) {
64  return -1;
65  }
66 
67  /* ng_component */
68  rc = fprintf(fp, "%d\n", HECMW_result_io_count_ng_comp());
69  if(rc < 0) {
71  return -1;
72  }
73 
74  /* ng_dof */
75  n = 0;
76  for(p=ResIO.global_list; p; p=p->next) {
77  rc = fprintf(fp, "%d%c", p->n_dof, (n+1)%COL_INT ? ' ' : '\n');
78  if(rc < 0) {
80  return -1;
81  }
82  n++;
83  }
84  if(n % COL_INT) {
85  rc = fprintf(fp, "\n");
86  if(rc < 0) {
88  return -1;
89  }
90  }
91 
92  /* global_label */
93  for(p=ResIO.global_list; p; p=p->next) {
94  rc = fprintf(fp, "%s\n", p->label);
95  if(rc < 0) {
96  HECMW_set_error(HECMW_UTIL_E0205, "global_label");
97  return -1;
98  }
99  }
100 
101  /* global_val_item */
102  ng_comp = HECMW_result_io_count_ng_comp();
103  if(ng_comp == 0) return 0;
104  data = HECMW_malloc(sizeof(*data) * ng_comp);
105  if(data == NULL) {
106  HECMW_set_error(errno, "");
107  return -1;
108  }
109  i = 0;
110  for(p=ResIO.global_list; p; p=p->next) {
111  data[i++] = p;
112  }
113  n = 0;
114  for(j=0; j < ng_comp; j++) {
115  p = data[j];
116  for(k=0; k < p->n_dof; k++) {
117  rc = fprintf(fp, "%.16E%c", p->ptr[k], (n+1)%COL_DOUBLE ? ' ' : '\n');
118  if(rc < 0) {
119  HECMW_set_error(HECMW_UTIL_E0205, "global_val_item");
120  return -1;
121  }
122  n++;
123  }
124  }
125  if(n % COL_DOUBLE) {
126  rc = fprintf(fp, "\n");
127  if(rc < 0) {
129  return -1;
130  }
131  }
132  HECMW_free(data);
133 
134  return 0;
135 }
136 
137 
138 static int output_result_dataheader(FILE *fp) {
139  int rc;
140 
141  /* n_node, n_elem */
142  rc = fprintf(fp, "%d %d\n", ResIO.nnode, ResIO.nelem);
143  if(rc < 0) {
144  HECMW_set_error(HECMW_UTIL_E0205, "nnode,nelem");
145  return -1;
146  }
147 
148  /* nn_component, ne_component */
149  rc = fprintf(fp, "%d %d\n", HECMW_result_io_count_nn_comp(), HECMW_result_io_count_ne_comp());
150  if(rc < 0) {
151  HECMW_set_error(HECMW_UTIL_E0205, "nn_comp,ne_comp");
152  return -1;
153  }
154 
155  return 0;
156 }
157 
158 
159 static int output_result_node(FILE *fp) {
160  int i,j,k,n,rc,nn_comp;
161  struct result_list *p,**data;
162 
163  /* nn_dof */
164  n = 0;
165  for(p=ResIO.node_list; p; p=p->next) {
166  rc = fprintf(fp, "%d%c", p->n_dof, (n+1)%COL_INT ? ' ' : '\n');
167  if(rc < 0) {
169  return -1;
170  }
171  n++;
172  }
173  if(n % COL_INT) {
174  rc = fprintf(fp, "\n");
175  if(rc < 0) {
177  return -1;
178  }
179  }
180 
181  /* node_label */
182  for(p=ResIO.node_list; p; p=p->next) {
183  rc = fprintf(fp, "%s\n", p->label);
184  if(rc < 0) {
185  HECMW_set_error(HECMW_UTIL_E0205, "node_label");
186  return -1;
187  }
188  }
189 
190  /* node_val_item */
191  nn_comp = HECMW_result_io_count_nn_comp();
192  if(nn_comp == 0) return 0;
193  data = HECMW_malloc(sizeof(*data) * nn_comp);
194  if(data == NULL) {
195  HECMW_set_error(errno, "");
196  return -1;
197  }
198  i = 0;
199  for(p=ResIO.node_list; p; p=p->next) {
200  data[i++] = p;
201  }
202  for(i=0; i < ResIO.nnode; i++) {
203  rc = fprintf(fp, "%d \n", ResIO.node_global_ID[i]);
204  if(rc < 0) {
205  HECMW_set_error(HECMW_UTIL_E0205, "node_global_ID");
206  return -1;
207  }
208  n = 0;
209  for(j=0; j < nn_comp; j++) {
210  p = data[j];
211  for(k=0; k < p->n_dof; k++) {
212  rc = fprintf(fp, "%.16E%c", p->ptr[i*p->n_dof+k], (n+1)%COL_DOUBLE ? ' ' : '\n');
213  if(rc < 0) {
214  HECMW_set_error(HECMW_UTIL_E0205, "node_val_item");
215  return -1;
216  }
217  n++;
218  }
219  }
220  if(n % COL_DOUBLE) {
221  rc = fprintf(fp, "\n");
222  if(rc < 0) {
224  return -1;
225  }
226  }
227  }
228  HECMW_free(data);
229 
230  return 0;
231 }
232 
233 
234 static int output_result_elem(FILE *fp) {
235  int i,j,k,n,rc,ne_comp;
236  struct result_list *p,**data;
237 
238  /* ne_dof */
239  n = 0;
240  for(p=ResIO.elem_list; p; p=p->next) {
241  rc = fprintf(fp, "%d%c", p->n_dof, (n+1)%COL_INT ? ' ' : '\n');
242  if(rc < 0) {
244  return -1;
245  }
246  n++;
247  }
248  if(n % COL_INT) {
249  rc = fprintf(fp, "\n");
250  if(rc < 0) {
252  return -1;
253  }
254  }
255 
256  /* elem_label */
257  for(p=ResIO.elem_list; p; p=p->next) {
258  rc = fprintf(fp, "%s\n", p->label);
259  if(rc < 0) {
260  HECMW_set_error(HECMW_UTIL_E0205, "elem_label");
261  return -1;
262  }
263  }
264 
265  /* elem_val_item */
266  ne_comp = HECMW_result_io_count_ne_comp();
267  if(ne_comp == 0) return 0;
268  data = HECMW_malloc(sizeof(*data) * ne_comp);
269  if(data == NULL) {
270  HECMW_set_error(errno, "");
271  return -1;
272  }
273  i = 0;
274  for(p=ResIO.elem_list; p; p=p->next) {
275  data[i++] = p;
276  }
277  for(i=0; i < ResIO.nelem; i++) {
278  rc = fprintf(fp, "%d\n", ResIO.elem_global_ID[i]);
279  if(rc < 0) {
280  HECMW_set_error(HECMW_UTIL_E0205, "elem_global_ID");
281  return -1;
282  }
283  n = 0;
284  for(j=0; j < ne_comp; j++) {
285  p = data[j];
286  for(k=0; k < p->n_dof; k++) {
287  rc = fprintf(fp, "%.16E%c", p->ptr[i*p->n_dof+k], (n+1)%COL_DOUBLE ? ' ' : '\n');
288  if(rc < 0) {
289  HECMW_set_error(HECMW_UTIL_E0205, "elem_val_item");
290  return -1;
291  }
292  n++;
293  }
294  }
295  if(n % COL_DOUBLE) {
296  rc = fprintf(fp, "\n");
297  if(rc < 0) {
299  return -1;
300  }
301  }
302  }
303  HECMW_free(data);
304 
305  return 0;
306 }
307 
308 
309 static int output_result_data(FILE *fp) {
310  int rc;
311  HECMW_assert(fp);
312 
313  if(output_result_header(fp)) {
314  return -1;
315  }
316  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
317  if(output_result_global(fp)) {
318  return -1;
319  }
320  /* data header */
321  rc = fprintf(fp, "*data\n");
322  if(rc < 0) {
324  return -1;
325  }
326  }
327  if(output_result_dataheader(fp)) {
328  return -1;
329  }
330  if(output_result_node(fp)) {
331  return -1;
332  }
333  if(output_result_elem(fp)) {
334  return -1;
335  }
336 
337  return 0;
338 }
339 
340 /*---------------------------------------------------------------------------*/
341 
343  FILE *fp = NULL;
344 
345  if (HECMW_ctrl_is_subdir()) {
346  if (HECMW_ctrl_make_subdir(filename)) {
347  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename,
348  HECMW_strmsg(errno));
349  goto error;
350  }
351  }
352 
353  if ((fp = fopen(filename, "w")) == NULL) {
354  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename,
355  HECMW_strmsg(errno));
356  goto error;
357  }
358 
359  if (output_result_data(fp)) {
360  goto error;
361  }
362 
363  if (fclose(fp)) {
365  goto error;
366  }
367  fp = NULL;
368 
369  return 0;
370 error:
371  if (fp) fclose(fp);
372  return -1;
373 }
374 
375 
376 /*---------------------------------------------------------------------------*/
377 /* TEXT MODE I/O ---- output_result_ST */
378 /*---------------------------------------------------------------------------*/
379 
380 
381 static int output_result_header_ST(struct hecmwST_result_data *result, char *header, FILE *fp) {
382  size_t len;
383  int rc;
384  char *p,*q;
385  char head[HECMW_HEADER_LEN+1];
386 
387  if(header == NULL) {
388  head[0] = '\0';
389  } else {
390  len = 0;
391  p = header;
392  q = head;
393  while(len < sizeof(head)-1 && *p && *p != '\n') {
394  *q++ = *p++;
395  len++;
396  }
397  *q++ = '\0';
398  }
399 
400  /* header */
401  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
402  char tmp[HECMW_HEADER_LEN+1];
403  snprintf(tmp, sizeof(tmp), "%s %d.%d", head, HECMW_RESULT_FILEVER_MAJOR, HECMW_RESULT_FILEVER_MINOR);
404  memcpy(head, tmp, sizeof(head));
405  }
406  rc = fprintf(fp, "%s\n", head);
407  if(rc < 0) {
409  return -1;
410  }
411 
412  return 0;
413 }
414 
415 
416 static int output_result_global_ST(struct hecmwST_result_data *result, char *comment, FILE *fp) {
417  size_t len;
418  int i,j,k,n,rc;
419  char *p,*q;
420  char comment_line[HECMW_MSG_LEN+1];
421 
422  if(comment == NULL) {
423  comment_line[0] = '\0';
424  } else {
425  len = 0;
426  p = comment;
427  q = comment_line;
428  while(len < sizeof(comment_line)-1 && *p && *p != '\n') {
429  *q++ = *p++;
430  len++;
431  }
432  *q++ = '\0';
433  }
434 
435  /* comment */
436  rc = fprintf(fp, "*comment\n");
437  if(rc < 0) {
438  HECMW_set_error(HECMW_UTIL_E0205, "*comment");
439  return -1;
440  }
441  rc = fprintf(fp, "%s\n", comment);
442  if(rc < 0) {
443  HECMW_set_error(HECMW_UTIL_E0205, "comment");
444  return -1;
445  }
446 
447 
448  /* global header */
449  rc = fprintf(fp, "*global\n");
450  if(rc < 0) {
451  HECMW_set_error(HECMW_UTIL_E0205, "*global");
452  return -1;
453  }
454 
455  /* ng_component */
456  rc = fprintf(fp, "%d\n", result->ng_component);
457  if(rc < 0) {
458  HECMW_set_error(HECMW_UTIL_E0205, "ng_comp");
459  return -1;
460  }
461 
462  /* ng_dof */
463  n = 0;
464  for(i=0; i < result->ng_component; i++) {
465  rc = fprintf(fp, "%d%c", result->ng_dof[i], (n+1)%COL_INT ? ' ' : '\n');
466  if(rc < 0) {
468  return -1;
469  }
470  n++;
471  }
472  if(n % COL_INT) {
473  rc = fprintf(fp, "\n");
474  if(rc < 0) {
475  HECMW_set_error(HECMW_UTIL_E0205, "global_label");
476  return -1;
477  }
478  }
479 
480  /* global_label */
481  for(i=0; i < result->ng_component; i++) {
482  rc = fprintf(fp, "%s\n", result->global_label[i]);
483  if(rc < 0) {
485  return -1;
486  }
487  }
488 
489  /* global_val_item */
490  if(result->ng_component == 0) return 0;
491  n = 0;
492  for(j=0; j < result->ng_component; j++) {
493  for(k=0; k < result->ng_dof[j]; k++) {
494  rc = fprintf(fp, "%.16E%c", result->global_val_item[n], (n+1)%COL_DOUBLE ? ' ' : '\n');
495  if(rc < 0) {
496  HECMW_set_error(HECMW_UTIL_E0205, "global_val_item");
497  return -1;
498  }
499  n++;
500  }
501  }
502  if(n % COL_DOUBLE) {
503  rc = fprintf(fp, "\n");
504  if(rc < 0) {
506  return -1;
507  }
508  }
509 
510  /* dataheader */
511  rc = fprintf(fp, "*data\n");
512  if(rc < 0) {
514  return -1;
515  }
516 
517  return 0;
518 }
519 
520 
521 static int output_result_dataheader_ST(struct hecmwST_result_data *result,
522  int n_node, int n_elem, FILE *fp) {
523  int rc;
524 
525  /* n_node, n_elem */
526  rc = fprintf(fp, "%d %d\n", n_node, n_elem);
527  if(rc < 0) {
528  HECMW_set_error(HECMW_UTIL_E0205, "n_node,n_elem");
529  return -1;
530  }
531 
532  /* nn_component, ne_component */
533  rc = fprintf(fp, "%d %d\n", result->nn_component, result->ne_component);
534  if(rc < 0) {
535  HECMW_set_error(HECMW_UTIL_E0205, "nn_comp,ne_comp");
536  return -1;
537  }
538 
539  return 0;
540 }
541 
542 
543 static int output_result_node_ST(struct hecmwST_result_data *result, int n_node, FILE *fp) {
544  int i,j,k,n,m,rc;
545 
546  /* nn_dof */
547  n = 0;
548  for(i=0; i < result->nn_component; i++) {
549  rc = fprintf(fp, "%d%c", result->nn_dof[i], (n+1)%COL_INT ? ' ' : '\n');
550  if(rc < 0) {
552  return -1;
553  }
554  n++;
555  }
556  if(n % COL_INT) {
557  rc = fprintf(fp, "\n");
558  if(rc < 0) {
559  HECMW_set_error(HECMW_UTIL_E0205, "node_label");
560  return -1;
561  }
562  }
563 
564  /* node_label */
565  for(i=0; i < result->nn_component; i++) {
566  rc = fprintf(fp, "%s\n", result->node_label[i]);
567  if(rc < 0) {
569  return -1;
570  }
571  }
572 
573  /* node_val_item */
574  if(result->nn_component == 0) return 0;
575  m = 0;
576  for(i=0; i < n_node; i++) {
577  rc = fprintf(fp, "%d \n", ResIO.node_global_ID[i]);
578  if(rc < 0) {
579  HECMW_set_error(HECMW_UTIL_E0205, "node_global_ID");
580  return -1;
581  }
582  n = 0;
583  for(j=0; j < result->nn_component; j++) {
584  for(k=0; k < result->nn_dof[j]; k++) {
585  rc = fprintf(fp, "%.16E%c", result->node_val_item[m], (n+1)%COL_DOUBLE ? ' ' : '\n');
586  if(rc < 0) {
587  HECMW_set_error(HECMW_UTIL_E0205, "node_val_item");
588  return -1;
589  }
590  n++;
591  m++;
592  }
593  }
594  if(n % COL_DOUBLE) {
595  rc = fprintf(fp, "\n");
596  if(rc < 0) {
598  return -1;
599  }
600  }
601  }
602 
603  return 0;
604 }
605 
606 
607 static int output_result_elem_ST(struct hecmwST_result_data *result, int n_elem, FILE *fp) {
608  int i,j,k,n,m,rc;
609 
610  /* ne_dof */
611  n = 0;
612  for(i=0; i < result->ne_component; i++) {
613  rc = fprintf(fp, "%d%c", result->ne_dof[i], (n+1)%COL_INT ? ' ' : '\n');
614  if(rc < 0) {
616  return -1;
617  }
618  n++;
619  }
620  if(n % COL_INT) {
621  rc = fprintf(fp, "\n");
622  if(rc < 0) {
624  return -1;
625  }
626  }
627 
628  /* elem_label */
629  for(i=0; i < result->ne_component; i++) {
630  rc = fprintf(fp, "%s\n", result->elem_label[i]);
631  if(rc < 0) {
632  HECMW_set_error(HECMW_UTIL_E0205, "elem_label");
633  return -1;
634  }
635  }
636 
637  /* elem_val_item */
638  if(result->ne_component == 0) return 0;
639  m = 0;
640  for(i=0; i < n_elem; i++) {
641  rc = fprintf(fp, "%d\n", ResIO.elem_global_ID[i]);
642  if(rc < 0) {
643  HECMW_set_error(HECMW_UTIL_E0205, "elem_global_ID");
644  return -1;
645  }
646  n = 0;
647  for(j=0; j < result->ne_component; j++) {
648  for(k=0; k < result->ne_dof[j]; k++) {
649  rc = fprintf(fp, "%.16E%c", result->elem_val_item[m], (n+1)%COL_DOUBLE ? ' ' : '\n');
650  if(rc < 0) {
651  HECMW_set_error(HECMW_UTIL_E0205, "elem_val_item");
652  return -1;
653  }
654  n++;
655  m++;
656  }
657  }
658  if(n % COL_DOUBLE) {
659  rc = fprintf(fp, "\n");
660  if(rc < 0) {
662  return -1;
663  }
664  }
665  }
666 
667  return 0;
668 }
669 
670 
671 static int output_result_data_ST(struct hecmwST_result_data *result, int n_node, int n_elem,
672  char *header, char *comment, FILE *fp) {
673  HECMW_assert(fp);
674 
675  if(output_result_header_ST(result, header, fp)) {
676  return -1;
677  }
678  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
679  if(output_result_global_ST(result, comment, fp)) {
680  return -1;
681  }
682  }
683  if(output_result_dataheader_ST(result, n_node, n_elem, fp)) {
684  return -1;
685  }
686  if(output_result_node_ST(result, n_node, fp)) {
687  return -1;
688  }
689  if(output_result_elem_ST(result, n_elem, fp)) {
690  return -1;
691  }
692 
693  return 0;
694 }
695 
696 /*---------------------------------------------------------------------------*/
697 
699  struct hecmwST_result_data *result,
700  int n_node, int n_elem, char *header, char *comment) {
701  FILE *fp = NULL;
702 
703  if (HECMW_ctrl_is_subdir()) {
704  if (HECMW_ctrl_make_subdir(filename)) {
705  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename,
706  HECMW_strmsg(errno));
707  goto error;
708  }
709  }
710 
711  if ((fp = fopen(filename, "w")) == NULL) {
712  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename,
713  HECMW_strmsg(errno));
714  goto error;
715  }
716 
717  if (output_result_data_ST(result, n_node, n_elem, header, comment, fp)) {
718  goto error;
719  }
720 
721  if (fclose(fp)) {
723  goto error;
724  }
725  fp = NULL;
726 
727  return 0;
728 error:
729  if (fp) fclose(fp);
730  return -1;
731 }
732 
733 
734 /*---------------------------------------------------------------------------*/
735 /* TEXT MODE I/O ---- input_result */
736 /*---------------------------------------------------------------------------*/
737 
738 
739 static int get_line(char *buf, int bufsize, FILE *fp) {
740  if(fgets(buf, bufsize, fp) == NULL) {
741  HECMW_set_error(HECMW_UTIL_E0205, "get_line");
742  return -1;
743  }
744  return strlen(Line_Buf);
745 }
746 
747 
748 static int input_result_header(struct hecmwST_result_data *result, FILE *fp) {
749  char *ptr;
750 
751  /* header */
752  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
753  return -1;
754  }
755  Line_Buf[ strlen(Line_Buf)-1 ] = 0;/* remove CR/LF*/
756  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
757  ptr = strtok(Line_Buf, " ");
758  if(ptr != Line_Buf) {
759  size_t len = strlen(ptr);
760  memmove(Line_Buf, ptr, len + 1);
761  } else {
762  ptr[strlen(ptr)] = '\0';
763  }
764  }
765  snprintf(ResIO.head, sizeof(ResIO.head), "%s", Line_Buf);
766 
767  return 0;
768 }
769 
770 
771 static int input_result_global(struct hecmwST_result_data *result, FILE *fp) {
772 #define DELIM " \n"
773  int i,rc,n;
774  char *p,*buf;
775 
776  /* comment */
777  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) { //skip comment header
778  return -1;
779  }
780  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
781  return -1;
782  }
783  Line_Buf[ strlen(Line_Buf)-1 ] = 0;/* remove CR/LF*/
784  snprintf(ResIO.comment_line, sizeof(ResIO.comment_line), "%s", Line_Buf);
785 
786 
787  /* skip global header */
788  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
789  return -1;
790  }
791 
792  /* ng_component */
793  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
794  return -1;
795  }
796  if(sscanf(Line_Buf, "%d", &result->ng_component) != 1) {
797  HECMW_set_error(HECMW_UTIL_E0205, "ng_comp");
798  return -1;
799  }
800 
801  if(result->ng_component <= 0) {
802  return 0;
803  }
804 
805  /* ng_dof */
806  result->ng_dof = HECMW_malloc(sizeof(*result->ng_dof)*result->ng_component);
807  if(result->ng_dof == NULL) {
808  HECMW_set_error(errno, "");
809  return -1;
810  }
811 
812  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
813  return -1;
814  }
815  i = n = 0;
816  buf = Line_Buf;
817  while(i < result->ng_component) {
818  p = strtok(buf, DELIM);
819  if(p == NULL) {
820  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
821  return -1;
822  }
823  buf = Line_Buf;
824  continue;
825  }
826  buf = NULL;
827  rc = sscanf(p, "%d", &result->ng_dof[i]);
828  if(rc == EOF) {
830  return -1;
831  }
832  if(rc != 1) {
834  return -1;
835  }
836  n += result->ng_dof[i];
837  i++;
838  }
839 
840  /* global_label */
841  result->global_label = HECMW_malloc(sizeof(*result->global_label)*result->ng_component);
842  if(result->global_label == NULL) {
843  HECMW_set_error(errno, "");
844  return -1;
845  }
846 
847  for(i=0; i < result->ng_component; i++) {
848  char label[HECMW_NAME_LEN+1];
849  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
850  return -1;
851  }
852  rc = sscanf(Line_Buf, "%63s", label);
853  if(rc == EOF) {
855  return -1;
856  }
857  if(rc != 1) {
858  HECMW_set_error(HECMW_UTIL_E0205, "global_label");
859  return -1;
860  }
861  result->global_label[i] = HECMW_strdup(label);
862  if(result->global_label[i] == NULL) {
863  HECMW_set_error(errno, "");
864  return -1;
865  }
866  }
867  /* global_val_item */
868  result->global_val_item = HECMW_malloc(sizeof(*result->global_val_item)*n);
869  if(result->global_val_item == NULL) {
870  HECMW_set_error(errno, "");
871  return -1;
872  }
873 
874  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
875  return -1;
876  }
877  i = 0;
878  buf = Line_Buf;
879  while(i < n) {
880  p = strtok(buf, DELIM);
881  if(p == NULL) {
882  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
883  return -1;
884  }
885  buf = Line_Buf;
886  continue;
887  }
888  buf = NULL;
889  rc = sscanf(p, "%lf", &result->global_val_item[i]);
890  if(rc == EOF) {
892  return -1;
893  }
894  if(rc != 1) {
895  HECMW_set_error(HECMW_UTIL_E0205, "global_val_item");
896  return -1;
897  }
898  i++;
899  }
900 
901  /* skip data header */
902  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
903  return -1;
904  }
905 
906  return 0;
907 }
908 
909 
910 static int input_result_dataheader(struct hecmwST_result_data *result,
911  int *n_node, int *n_elem, FILE *fp) {
912 
913  /* n_node, n_elem */
914  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
915  return -1;
916  }
917  if(sscanf(Line_Buf, "%d%d", n_node, n_elem) != 2) {
918  HECMW_set_error(HECMW_UTIL_E0205, "n_node,n_elem");
919  return -1;
920  }
921 
922  /* nn_component, ne_component */
923  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
924  return -1;
925  }
926  if(sscanf(Line_Buf, "%d%d", &result->nn_component, &result->ne_component) != 2) {
927  HECMW_set_error(HECMW_UTIL_E0205, "nn_comp,ne_comp");
928  return -1;
929  }
930 
931  return 0;
932 }
933 
934 
935 static int input_result_node(struct hecmwST_result_data *result, int n_node, FILE *fp) {
936 #define DELIM " \n"
937  int i,rc,n;
938  int label_counter;
939  char *p,*buf;
940 
941  if(result->nn_component <= 0) {
942  return 0;
943  }
944 
945  /* nn_dof */
946  result->nn_dof = HECMW_malloc(sizeof(*result->nn_dof)*result->nn_component);
947  if(result->nn_dof == NULL) {
948  HECMW_set_error(errno, "");
949  return -1;
950  }
951 
952  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
953  return -1;
954  }
955  i = n = 0;
956  buf = Line_Buf;
957  while(i < result->nn_component) {
958  p = strtok(buf, DELIM);
959  if(p == NULL) {
960  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
961  return -1;
962  }
963  buf = Line_Buf;
964  continue;
965  }
966  buf = NULL;
967  rc = sscanf(p, "%d", &result->nn_dof[i]);
968  if(rc == EOF) {
970  return -1;
971  }
972  if(rc != 1) {
974  return -1;
975  }
976  n += result->nn_dof[i];
977  i++;
978  }
979 
980  /* node_label */
981  result->node_label = HECMW_malloc(sizeof(*result->node_label)*result->nn_component);
982  if(result->node_label == NULL) {
983  HECMW_set_error(errno, "");
984  return -1;
985  }
986 
987  for(i=0; i < result->nn_component; i++) {
988  char label[HECMW_NAME_LEN+1];
989  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
990  return -1;
991  }
992  rc = sscanf(Line_Buf, "%63s", label);
993  if(rc == EOF) {
995  return -1;
996  }
997  if(rc != 1) {
998  HECMW_set_error(HECMW_UTIL_E0205, "node_label");
999  return -1;
1000  }
1001  result->node_label[i] = HECMW_strdup(label);
1002  if(result->node_label[i] == NULL) {
1003  HECMW_set_error(errno, "");
1004  return -1;
1005  }
1006  }
1007  /* node_val_item */
1009  if(ResIO.node_global_ID == NULL) {
1010  HECMW_set_error(errno, "");
1011  return -1;
1012  }
1013  result->node_val_item = HECMW_malloc(sizeof(*result->node_val_item)*n*n_node);
1014  if(result->node_val_item == NULL) {
1015  HECMW_set_error(errno, "");
1016  return -1;
1017  }
1018 
1019  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1020  return -1;
1021  }
1022  i = 0;
1023  label_counter = 0;
1024  n++; /**** For global node ID ****/
1025  buf = Line_Buf;
1026  while(i < n*n_node) {
1027  p = strtok(buf, DELIM);
1028  if(p == NULL) {
1029  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1030  return -1;
1031  }
1032  buf = Line_Buf;
1033  continue;
1034  }
1035  buf = NULL;
1036  if ( (i%n) == 0 ) {
1037  rc = sscanf(p, "%d", &ResIO.node_global_ID[label_counter]);
1038  label_counter++;
1039  } else {
1040  rc = sscanf(p, "%lf", &result->node_val_item[i-label_counter]);
1041  }
1042  if(rc == EOF) {
1044  return -1;
1045  }
1046  if(rc != 1) {
1047  HECMW_set_error(HECMW_UTIL_E0205, "node_val_item");
1048  return -1;
1049  }
1050  i++;
1051  }
1052 
1053  return 0;
1054 }
1055 
1056 
1057 static int input_result_elem(struct hecmwST_result_data *result, int n_elem, FILE *fp) {
1058 #define DELIM " \n"
1059  int i,rc,n;
1060  int label_counter;
1061  char *p,*buf;
1062 
1063  if(result->ne_component <= 0) {
1064  return 0;
1065  }
1066 
1067  /* ne_dof */
1068  result->ne_dof = HECMW_malloc(sizeof(*result->ne_dof)*result->ne_component);
1069  if(result->ne_dof == NULL) {
1070  HECMW_set_error(errno, "");
1071  return -1;
1072  }
1073 
1074  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1075  return -1;
1076  }
1077  i = n = 0;
1078  buf = Line_Buf;
1079  while(i < result->ne_component) {
1080 
1081  p = strtok(buf, DELIM);
1082  if(p == NULL) {
1083  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1084  return -1;
1085  }
1086  buf = Line_Buf;
1087  continue;
1088  }
1089  buf = NULL;
1090  rc = sscanf(p, "%d", &result->ne_dof[i]);
1091  if(rc == EOF) {
1093  return -1;
1094  }
1095  if(rc != 1) {
1096  HECMW_set_error(HECMW_UTIL_E0205, "ne_dof");
1097  return -1;
1098  }
1099  n += result->ne_dof[i];
1100  i++;
1101  }
1102 
1103  /* elem_label */
1104  result->elem_label = HECMW_malloc(sizeof(*result->elem_label)*result->ne_component);
1105  if(result->elem_label == NULL) {
1106  HECMW_set_error(errno, "");
1107  return -1;
1108  }
1109 
1110  for(i=0; i < result->ne_component; i++) {
1111  char label[HECMW_NAME_LEN+1];
1112  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1113  return -1;
1114  }
1115  rc = sscanf(Line_Buf, "%63s", label);
1116  if(rc == EOF) {
1118  return -1;
1119  }
1120  if(rc != 1) {
1121  HECMW_set_error(HECMW_UTIL_E0205, "elem_label");
1122  return -1;
1123  }
1124  result->elem_label[i] = HECMW_strdup(label);
1125  if(result->elem_label[i] == NULL) {
1126  HECMW_set_error(errno, "");
1127  return -1;
1128  }
1129  }
1130 
1131  /* elem_val_item */
1133  if(ResIO.elem_global_ID == NULL) {
1134  HECMW_set_error(errno, "");
1135  return -1;
1136  }
1137  result->elem_val_item = HECMW_malloc(sizeof(*result->elem_val_item)*n*n_elem);
1138  if(result->elem_val_item == NULL) {
1139  HECMW_set_error(errno, "");
1140  return -1;
1141  }
1142 
1143  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1144  return -1;
1145  }
1146  i = 0;
1147  label_counter = 0;
1148  n++; /**** For global element ID ****/
1149  buf = Line_Buf;
1150  while(i < n*n_elem) {
1151  p = strtok(buf, DELIM);
1152  if(p == NULL) {
1153  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1154  return -1;
1155  }
1156  buf = Line_Buf;
1157  continue;
1158  }
1159  buf = NULL;
1160  if ( (i%n) == 0 ) {
1161  rc = sscanf(p, "%d", &ResIO.elem_global_ID[label_counter]);
1162  label_counter++;
1163  } else {
1164  rc = sscanf(p, "%lf", &result->elem_val_item[i-label_counter]);
1165  }
1166  if(rc == EOF) {
1168  return -1;
1169  }
1170  if(rc != 1) {
1171  HECMW_set_error(HECMW_UTIL_E0205, "elem_val_item");
1172  return -1;
1173  }
1174  i++;
1175  }
1176 
1177  return 0;
1178 }
1179 
1180 
1181 static struct hecmwST_result_data *input_result_data(FILE *fp) {
1182  int n_node, n_elem;
1183  struct hecmwST_result_data *result;
1184 
1185  HECMW_assert(fp);
1186 
1187  result = HECMW_calloc(1, sizeof(*result));
1188  if(result == NULL) {
1189  HECMW_set_error(errno, "");
1190  return NULL;
1191  }
1192  if(input_result_header(result, fp)) {
1193  return NULL;
1194  }
1195  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
1196  if(input_result_global(result, fp)) {
1197  return NULL;
1198  }
1199  }
1200  if(input_result_dataheader(result, &n_node, &n_elem, fp)) {
1201  return NULL;
1202  }
1203  ResIO.nnode = n_node;
1204  ResIO.nelem = n_elem;
1205  if(input_result_node(result, n_node, fp)) {
1206  return NULL;
1207  }
1208  if(input_result_elem(result, n_elem, fp)) {
1209  return NULL;
1210  }
1211 
1212  return result;
1213 }
1214 
1215 /*---------------------------------------------------------------------------*/
1216 
1218  FILE *fp;
1219  struct hecmwST_result_data *result;
1220 
1221  if((fp = fopen(filename, "r")) == NULL) {
1222  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename, HECMW_strmsg(errno));
1223  return NULL;
1224  }
1225 
1226  result = input_result_data(fp);
1227  if(result == NULL) {
1228  return NULL;
1229  }
1230 
1231  if(fclose(fp)) {
1233  return NULL;
1234  }
1235 
1236  return result;
1237 }
#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
int HECMW_ctrl_is_subdir(void)
int HECMW_ctrl_make_subdir(char *filename)
int HECMW_set_error(int errorno, const char *fmt,...)
Definition: hecmw_error.c:33
#define NULL
#define HECMW_calloc(nmemb, size)
Definition: hecmw_malloc.h:21
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
#define HECMW_strdup(s)
Definition: hecmw_malloc.h:23
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
char * HECMW_strmsg(int msgno)
Definition: hecmw_msg.c:31
#define HECMW_UTIL_E0204
Definition: hecmw_msgno.h:371
#define HECMW_UTIL_E0205
Definition: hecmw_msgno.h:372
#define HECMW_UTIL_E0201
Definition: hecmw_msgno.h:368
#define HECMW_UTIL_E0202
Definition: hecmw_msgno.h:369
int HECMW_result_io_count_ng_comp(void)
int HECMW_result_io_count_ne_comp(void)
int HECMW_result_io_count_nn_comp(void)
struct hecmwST_result_io_data ResIO
#define HECMW_RESULT_FILEVER_MINOR
#define HECMW_RESULT_FILEVER_MAJOR
#define COL_DOUBLE
int HECMW_result_io_txt_write_by_fname(char *filename)
#define DELIM
#define LINEBUF_SIZE
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)
#define COL_INT
#define HECMW_assert(cond)
Definition: hecmw_util.h:40
CNFData data
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]
struct result_list * global_list
struct result_list * node_list
char head[HECMW_HEADER_LEN+1]
struct result_list * elem_list
double * ptr
struct result_list * next