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