FrontISTR  5.8.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  sprintf(head,"%s %d.%d",head,HECMW_RESULT_FILEVER_MAJOR,HECMW_RESULT_FILEVER_MINOR);
404  }
405  rc = fprintf(fp, "%s\n", head);
406  if(rc < 0) {
408  return -1;
409  }
410 
411  return 0;
412 }
413 
414 
415 static int output_result_global_ST(struct hecmwST_result_data *result, char *comment, FILE *fp) {
416  size_t len;
417  int i,j,k,n,rc;
418  char *p,*q;
419  char comment_line[HECMW_MSG_LEN+1];
420 
421  if(comment == NULL) {
422  comment_line[0] = '\0';
423  } else {
424  len = 0;
425  p = comment;
426  q = comment_line;
427  while(len < sizeof(comment_line)-1 && *p && *p != '\n') {
428  *q++ = *p++;
429  len++;
430  }
431  *q++ = '\0';
432  }
433 
434  /* comment */
435  rc = fprintf(fp, "*comment\n");
436  if(rc < 0) {
437  HECMW_set_error(HECMW_UTIL_E0205, "*comment");
438  return -1;
439  }
440  rc = fprintf(fp, "%s\n", comment);
441  if(rc < 0) {
442  HECMW_set_error(HECMW_UTIL_E0205, "comment");
443  return -1;
444  }
445 
446 
447  /* global header */
448  rc = fprintf(fp, "*global\n");
449  if(rc < 0) {
450  HECMW_set_error(HECMW_UTIL_E0205, "*global");
451  return -1;
452  }
453 
454  /* ng_component */
455  rc = fprintf(fp, "%d\n", result->ng_component);
456  if(rc < 0) {
457  HECMW_set_error(HECMW_UTIL_E0205, "ng_comp");
458  return -1;
459  }
460 
461  /* ng_dof */
462  n = 0;
463  for(i=0; i < result->ng_component; i++) {
464  rc = fprintf(fp, "%d%c", result->ng_dof[i], (n+1)%COL_INT ? ' ' : '\n');
465  if(rc < 0) {
467  return -1;
468  }
469  n++;
470  }
471  if(n % COL_INT) {
472  rc = fprintf(fp, "\n");
473  if(rc < 0) {
474  HECMW_set_error(HECMW_UTIL_E0205, "global_label");
475  return -1;
476  }
477  }
478 
479  /* global_label */
480  for(i=0; i < result->ng_component; i++) {
481  rc = fprintf(fp, "%s\n", result->global_label[i]);
482  if(rc < 0) {
484  return -1;
485  }
486  }
487 
488  /* global_val_item */
489  if(result->ng_component == 0) return 0;
490  n = 0;
491  for(j=0; j < result->ng_component; j++) {
492  for(k=0; k < result->ng_dof[j]; k++) {
493  rc = fprintf(fp, "%.16E%c", result->global_val_item[n], (n+1)%COL_DOUBLE ? ' ' : '\n');
494  if(rc < 0) {
495  HECMW_set_error(HECMW_UTIL_E0205, "global_val_item");
496  return -1;
497  }
498  n++;
499  }
500  }
501  if(n % COL_DOUBLE) {
502  rc = fprintf(fp, "\n");
503  if(rc < 0) {
505  return -1;
506  }
507  }
508 
509  /* dataheader */
510  rc = fprintf(fp, "*data\n");
511  if(rc < 0) {
513  return -1;
514  }
515 
516  return 0;
517 }
518 
519 
520 static int output_result_dataheader_ST(struct hecmwST_result_data *result,
521  int n_node, int n_elem, FILE *fp) {
522  int rc;
523 
524  /* n_node, n_elem */
525  rc = fprintf(fp, "%d %d\n", n_node, n_elem);
526  if(rc < 0) {
527  HECMW_set_error(HECMW_UTIL_E0205, "n_node,n_elem");
528  return -1;
529  }
530 
531  /* nn_component, ne_component */
532  rc = fprintf(fp, "%d %d\n", result->nn_component, result->ne_component);
533  if(rc < 0) {
534  HECMW_set_error(HECMW_UTIL_E0205, "nn_comp,ne_comp");
535  return -1;
536  }
537 
538  return 0;
539 }
540 
541 
542 static int output_result_node_ST(struct hecmwST_result_data *result, int n_node, FILE *fp) {
543  int i,j,k,n,m,rc;
544 
545  /* nn_dof */
546  n = 0;
547  for(i=0; i < result->nn_component; i++) {
548  rc = fprintf(fp, "%d%c", result->nn_dof[i], (n+1)%COL_INT ? ' ' : '\n');
549  if(rc < 0) {
551  return -1;
552  }
553  n++;
554  }
555  if(n % COL_INT) {
556  rc = fprintf(fp, "\n");
557  if(rc < 0) {
558  HECMW_set_error(HECMW_UTIL_E0205, "node_label");
559  return -1;
560  }
561  }
562 
563  /* node_label */
564  for(i=0; i < result->nn_component; i++) {
565  rc = fprintf(fp, "%s\n", result->node_label[i]);
566  if(rc < 0) {
568  return -1;
569  }
570  }
571 
572  /* node_val_item */
573  if(result->nn_component == 0) return 0;
574  m = 0;
575  for(i=0; i < n_node; i++) {
576  rc = fprintf(fp, "%d \n", ResIO.node_global_ID[i]);
577  if(rc < 0) {
578  HECMW_set_error(HECMW_UTIL_E0205, "node_global_ID");
579  return -1;
580  }
581  n = 0;
582  for(j=0; j < result->nn_component; j++) {
583  for(k=0; k < result->nn_dof[j]; k++) {
584  rc = fprintf(fp, "%.16E%c", result->node_val_item[m], (n+1)%COL_DOUBLE ? ' ' : '\n');
585  if(rc < 0) {
586  HECMW_set_error(HECMW_UTIL_E0205, "node_val_item");
587  return -1;
588  }
589  n++;
590  m++;
591  }
592  }
593  if(n % COL_DOUBLE) {
594  rc = fprintf(fp, "\n");
595  if(rc < 0) {
597  return -1;
598  }
599  }
600  }
601 
602  return 0;
603 }
604 
605 
606 static int output_result_elem_ST(struct hecmwST_result_data *result, int n_elem, FILE *fp) {
607  int i,j,k,n,m,rc;
608 
609  /* ne_dof */
610  n = 0;
611  for(i=0; i < result->ne_component; i++) {
612  rc = fprintf(fp, "%d%c", result->ne_dof[i], (n+1)%COL_INT ? ' ' : '\n');
613  if(rc < 0) {
615  return -1;
616  }
617  n++;
618  }
619  if(n % COL_INT) {
620  rc = fprintf(fp, "\n");
621  if(rc < 0) {
623  return -1;
624  }
625  }
626 
627  /* elem_label */
628  for(i=0; i < result->ne_component; i++) {
629  rc = fprintf(fp, "%s\n", result->elem_label[i]);
630  if(rc < 0) {
631  HECMW_set_error(HECMW_UTIL_E0205, "elem_label");
632  return -1;
633  }
634  }
635 
636  /* elem_val_item */
637  if(result->ne_component == 0) return 0;
638  m = 0;
639  for(i=0; i < n_elem; i++) {
640  rc = fprintf(fp, "%d\n", ResIO.elem_global_ID[i]);
641  if(rc < 0) {
642  HECMW_set_error(HECMW_UTIL_E0205, "elem_global_ID");
643  return -1;
644  }
645  n = 0;
646  for(j=0; j < result->ne_component; j++) {
647  for(k=0; k < result->ne_dof[j]; k++) {
648  rc = fprintf(fp, "%.16E%c", result->elem_val_item[m], (n+1)%COL_DOUBLE ? ' ' : '\n');
649  if(rc < 0) {
650  HECMW_set_error(HECMW_UTIL_E0205, "elem_val_item");
651  return -1;
652  }
653  n++;
654  m++;
655  }
656  }
657  if(n % COL_DOUBLE) {
658  rc = fprintf(fp, "\n");
659  if(rc < 0) {
661  return -1;
662  }
663  }
664  }
665 
666  return 0;
667 }
668 
669 
670 static int output_result_data_ST(struct hecmwST_result_data *result, int n_node, int n_elem,
671  char *header, char *comment, FILE *fp) {
672  HECMW_assert(fp);
673 
674  if(output_result_header_ST(result, header, fp)) {
675  return -1;
676  }
677  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
678  if(output_result_global_ST(result, comment, fp)) {
679  return -1;
680  }
681  }
682  if(output_result_dataheader_ST(result, n_node, n_elem, fp)) {
683  return -1;
684  }
685  if(output_result_node_ST(result, n_node, fp)) {
686  return -1;
687  }
688  if(output_result_elem_ST(result, n_elem, fp)) {
689  return -1;
690  }
691 
692  return 0;
693 }
694 
695 /*---------------------------------------------------------------------------*/
696 
698  struct hecmwST_result_data *result,
699  int n_node, int n_elem, char *header, char *comment) {
700  FILE *fp = NULL;
701 
702  if (HECMW_ctrl_is_subdir()) {
703  if (HECMW_ctrl_make_subdir(filename)) {
704  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename,
705  HECMW_strmsg(errno));
706  goto error;
707  }
708  }
709 
710  if ((fp = fopen(filename, "w")) == NULL) {
711  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename,
712  HECMW_strmsg(errno));
713  goto error;
714  }
715 
716  if (output_result_data_ST(result, n_node, n_elem, header, comment, fp)) {
717  goto error;
718  }
719 
720  if (fclose(fp)) {
722  goto error;
723  }
724  fp = NULL;
725 
726  return 0;
727 error:
728  if (fp) fclose(fp);
729  return -1;
730 }
731 
732 
733 /*---------------------------------------------------------------------------*/
734 /* TEXT MODE I/O ---- input_result */
735 /*---------------------------------------------------------------------------*/
736 
737 
738 static int get_line(char *buf, int bufsize, FILE *fp) {
739  if(fgets(buf, bufsize, fp) == NULL) {
740  HECMW_set_error(HECMW_UTIL_E0205, "get_line");
741  return -1;
742  }
743  return strlen(Line_Buf);
744 }
745 
746 
747 static int input_result_header(struct hecmwST_result_data *result, FILE *fp) {
748  char *ptr;
749 
750  /* header */
751  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
752  return -1;
753  }
754  Line_Buf[ strlen(Line_Buf)-1 ] = 0;/* remove CR/LF*/
755  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
756  ptr = strtok(Line_Buf, " ");
757  sprintf(Line_Buf, "%s", ptr);
758  }
759  strcpy( ResIO.head, Line_Buf );
760 
761  return 0;
762 }
763 
764 
765 static int input_result_global(struct hecmwST_result_data *result, FILE *fp) {
766 #define DELIM " \n"
767  int i,rc,n;
768  char *p,*buf;
769 
770  /* comment */
771  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) { //skip comment header
772  return -1;
773  }
774  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
775  return -1;
776  }
777  Line_Buf[ strlen(Line_Buf)-1 ] = 0;/* remove CR/LF*/
778  strcpy( ResIO.comment_line, Line_Buf );
779 
780 
781  /* skip global header */
782  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
783  return -1;
784  }
785 
786  /* ng_component */
787  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
788  return -1;
789  }
790  if(sscanf(Line_Buf, "%d", &result->ng_component) != 1) {
791  HECMW_set_error(HECMW_UTIL_E0205, "ng_comp");
792  return -1;
793  }
794 
795  if(result->ng_component <= 0) {
796  return 0;
797  }
798 
799  /* ng_dof */
800  result->ng_dof = HECMW_malloc(sizeof(*result->ng_dof)*result->ng_component);
801  if(result->ng_dof == NULL) {
802  HECMW_set_error(errno, "");
803  return -1;
804  }
805 
806  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
807  return -1;
808  }
809  i = n = 0;
810  buf = Line_Buf;
811  while(i < result->ng_component) {
812  p = strtok(buf, DELIM);
813  if(p == NULL) {
814  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
815  return -1;
816  }
817  buf = Line_Buf;
818  continue;
819  }
820  buf = NULL;
821  rc = sscanf(p, "%d", &result->ng_dof[i]);
822  if(rc == EOF) {
824  return -1;
825  }
826  if(rc != 1) {
828  return -1;
829  }
830  n += result->ng_dof[i];
831  i++;
832  }
833 
834  /* global_label */
835  result->global_label = HECMW_malloc(sizeof(*result->global_label)*result->ng_component);
836  if(result->global_label == NULL) {
837  HECMW_set_error(errno, "");
838  return -1;
839  }
840 
841  for(i=0; i < result->ng_component; i++) {
842  char label[HECMW_NAME_LEN+1];
843  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
844  return -1;
845  }
846  rc = sscanf(Line_Buf, "%s", label);
847  if(rc == EOF) {
849  return -1;
850  }
851  if(rc != 1) {
852  HECMW_set_error(HECMW_UTIL_E0205, "global_label");
853  return -1;
854  }
855  result->global_label[i] = HECMW_strdup(label);
856  if(result->global_label[i] == NULL) {
857  HECMW_set_error(errno, "");
858  return -1;
859  }
860  }
861  /* global_val_item */
862  result->global_val_item = HECMW_malloc(sizeof(*result->global_val_item)*n);
863  if(result->global_val_item == NULL) {
864  HECMW_set_error(errno, "");
865  return -1;
866  }
867 
868  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
869  return -1;
870  }
871  i = 0;
872  buf = Line_Buf;
873  while(i < n) {
874  p = strtok(buf, DELIM);
875  if(p == NULL) {
876  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
877  return -1;
878  }
879  buf = Line_Buf;
880  continue;
881  }
882  buf = NULL;
883  rc = sscanf(p, "%lf", &result->global_val_item[i]);
884  if(rc == EOF) {
886  return -1;
887  }
888  if(rc != 1) {
889  HECMW_set_error(HECMW_UTIL_E0205, "global_val_item");
890  return -1;
891  }
892  i++;
893  }
894 
895  /* skip data header */
896  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
897  return -1;
898  }
899 
900  return 0;
901 }
902 
903 
904 static int input_result_dataheader(struct hecmwST_result_data *result,
905  int *n_node, int *n_elem, FILE *fp) {
906 
907  /* n_node, n_elem */
908  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
909  return -1;
910  }
911  if(sscanf(Line_Buf, "%d%d", n_node, n_elem) != 2) {
912  HECMW_set_error(HECMW_UTIL_E0205, "n_node,n_elem");
913  return -1;
914  }
915 
916  /* nn_component, ne_component */
917  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
918  return -1;
919  }
920  if(sscanf(Line_Buf, "%d%d", &result->nn_component, &result->ne_component) != 2) {
921  HECMW_set_error(HECMW_UTIL_E0205, "nn_comp,ne_comp");
922  return -1;
923  }
924 
925  return 0;
926 }
927 
928 
929 static int input_result_node(struct hecmwST_result_data *result, int n_node, FILE *fp) {
930 #define DELIM " \n"
931  int i,rc,n;
932  int label_counter;
933  char *p,*buf;
934 
935  if(result->nn_component <= 0) {
936  return 0;
937  }
938 
939  /* nn_dof */
940  result->nn_dof = HECMW_malloc(sizeof(*result->nn_dof)*result->nn_component);
941  if(result->nn_dof == NULL) {
942  HECMW_set_error(errno, "");
943  return -1;
944  }
945 
946  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
947  return -1;
948  }
949  i = n = 0;
950  buf = Line_Buf;
951  while(i < result->nn_component) {
952  p = strtok(buf, DELIM);
953  if(p == NULL) {
954  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
955  return -1;
956  }
957  buf = Line_Buf;
958  continue;
959  }
960  buf = NULL;
961  rc = sscanf(p, "%d", &result->nn_dof[i]);
962  if(rc == EOF) {
964  return -1;
965  }
966  if(rc != 1) {
968  return -1;
969  }
970  n += result->nn_dof[i];
971  i++;
972  }
973 
974  /* node_label */
975  result->node_label = HECMW_malloc(sizeof(*result->node_label)*result->nn_component);
976  if(result->node_label == NULL) {
977  HECMW_set_error(errno, "");
978  return -1;
979  }
980 
981  for(i=0; i < result->nn_component; i++) {
982  char label[HECMW_NAME_LEN+1];
983  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
984  return -1;
985  }
986  rc = sscanf(Line_Buf, "%s", label);
987  if(rc == EOF) {
989  return -1;
990  }
991  if(rc != 1) {
992  HECMW_set_error(HECMW_UTIL_E0205, "node_label");
993  return -1;
994  }
995  result->node_label[i] = HECMW_strdup(label);
996  if(result->node_label[i] == NULL) {
997  HECMW_set_error(errno, "");
998  return -1;
999  }
1000  }
1001  /* node_val_item */
1003  if(ResIO.node_global_ID == NULL) {
1004  HECMW_set_error(errno, "");
1005  return -1;
1006  }
1007  result->node_val_item = HECMW_malloc(sizeof(*result->node_val_item)*n*n_node);
1008  if(result->node_val_item == NULL) {
1009  HECMW_set_error(errno, "");
1010  return -1;
1011  }
1012 
1013  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1014  return -1;
1015  }
1016  i = 0;
1017  label_counter = 0;
1018  n++; /**** For global node ID ****/
1019  buf = Line_Buf;
1020  while(i < n*n_node) {
1021  p = strtok(buf, DELIM);
1022  if(p == NULL) {
1023  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1024  return -1;
1025  }
1026  buf = Line_Buf;
1027  continue;
1028  }
1029  buf = NULL;
1030  if ( (i%n) == 0 ) {
1031  rc = sscanf(p, "%d", &ResIO.node_global_ID[label_counter]);
1032  label_counter++;
1033  } else {
1034  rc = sscanf(p, "%lf", &result->node_val_item[i-label_counter]);
1035  }
1036  if(rc == EOF) {
1038  return -1;
1039  }
1040  if(rc != 1) {
1041  HECMW_set_error(HECMW_UTIL_E0205, "node_val_item");
1042  return -1;
1043  }
1044  i++;
1045  }
1046 
1047  return 0;
1048 }
1049 
1050 
1051 static int input_result_elem(struct hecmwST_result_data *result, int n_elem, FILE *fp) {
1052 #define DELIM " \n"
1053  int i,rc,n;
1054  int label_counter;
1055  char *p,*buf;
1056 
1057  if(result->ne_component <= 0) {
1058  return 0;
1059  }
1060 
1061  /* ne_dof */
1062  result->ne_dof = HECMW_malloc(sizeof(*result->ne_dof)*result->ne_component);
1063  if(result->ne_dof == NULL) {
1064  HECMW_set_error(errno, "");
1065  return -1;
1066  }
1067 
1068  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1069  return -1;
1070  }
1071  i = n = 0;
1072  buf = Line_Buf;
1073  while(i < result->ne_component) {
1074 
1075  p = strtok(buf, DELIM);
1076  if(p == NULL) {
1077  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1078  return -1;
1079  }
1080  buf = Line_Buf;
1081  continue;
1082  }
1083  buf = NULL;
1084  rc = sscanf(p, "%d", &result->ne_dof[i]);
1085  if(rc == EOF) {
1087  return -1;
1088  }
1089  if(rc != 1) {
1090  HECMW_set_error(HECMW_UTIL_E0205, "ne_dof");
1091  return -1;
1092  }
1093  n += result->ne_dof[i];
1094  i++;
1095  }
1096 
1097  /* elem_label */
1098  result->elem_label = HECMW_malloc(sizeof(*result->elem_label)*result->ne_component);
1099  if(result->elem_label == NULL) {
1100  HECMW_set_error(errno, "");
1101  return -1;
1102  }
1103 
1104  for(i=0; i < result->ne_component; i++) {
1105  char label[HECMW_NAME_LEN+1];
1106  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1107  return -1;
1108  }
1109  rc = sscanf(Line_Buf, "%s", label);
1110  if(rc == EOF) {
1112  return -1;
1113  }
1114  if(rc != 1) {
1115  HECMW_set_error(HECMW_UTIL_E0205, "elem_label");
1116  return -1;
1117  }
1118  result->elem_label[i] = HECMW_strdup(label);
1119  if(result->elem_label[i] == NULL) {
1120  HECMW_set_error(errno, "");
1121  return -1;
1122  }
1123  }
1124 
1125  /* elem_val_item */
1127  if(ResIO.elem_global_ID == NULL) {
1128  HECMW_set_error(errno, "");
1129  return -1;
1130  }
1131  result->elem_val_item = HECMW_malloc(sizeof(*result->elem_val_item)*n*n_elem);
1132  if(result->elem_val_item == NULL) {
1133  HECMW_set_error(errno, "");
1134  return -1;
1135  }
1136 
1137  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1138  return -1;
1139  }
1140  i = 0;
1141  label_counter = 0;
1142  n++; /**** For global element ID ****/
1143  buf = Line_Buf;
1144  while(i < n*n_elem) {
1145  p = strtok(buf, DELIM);
1146  if(p == NULL) {
1147  if(get_line(Line_Buf, sizeof(Line_Buf), fp) < 0) {
1148  return -1;
1149  }
1150  buf = Line_Buf;
1151  continue;
1152  }
1153  buf = NULL;
1154  if ( (i%n) == 0 ) {
1155  rc = sscanf(p, "%d", &ResIO.elem_global_ID[label_counter]);
1156  label_counter++;
1157  } else {
1158  rc = sscanf(p, "%lf", &result->elem_val_item[i-label_counter]);
1159  }
1160  if(rc == EOF) {
1162  return -1;
1163  }
1164  if(rc != 1) {
1165  HECMW_set_error(HECMW_UTIL_E0205, "elem_val_item");
1166  return -1;
1167  }
1168  i++;
1169  }
1170 
1171  return 0;
1172 }
1173 
1174 
1175 static struct hecmwST_result_data *input_result_data(FILE *fp) {
1176  int n_node, n_elem;
1177  struct hecmwST_result_data *result;
1178 
1179  HECMW_assert(fp);
1180 
1181  result = HECMW_calloc(1, sizeof(*result));
1182  if(result == NULL) {
1183  HECMW_set_error(errno, "");
1184  return NULL;
1185  }
1186  if(input_result_header(result, fp)) {
1187  return NULL;
1188  }
1189  if( HECMW_RESULT_FILEVER_MAJOR > 1 ){
1190  if(input_result_global(result, fp)) {
1191  return NULL;
1192  }
1193  }
1194  if(input_result_dataheader(result, &n_node, &n_elem, fp)) {
1195  return NULL;
1196  }
1197  ResIO.nnode = n_node;
1198  ResIO.nelem = n_elem;
1199  if(input_result_node(result, n_node, fp)) {
1200  return NULL;
1201  }
1202  if(input_result_elem(result, n_elem, fp)) {
1203  return NULL;
1204  }
1205 
1206  return result;
1207 }
1208 
1209 /*---------------------------------------------------------------------------*/
1210 
1212  FILE *fp;
1213  struct hecmwST_result_data *result;
1214 
1215  if((fp = fopen(filename, "r")) == NULL) {
1216  HECMW_set_error(HECMW_UTIL_E0201, "File: %s, %s", filename, HECMW_strmsg(errno));
1217  return NULL;
1218  }
1219 
1220  result = input_result_data(fp);
1221  if(result == NULL) {
1222  return NULL;
1223  }
1224 
1225  if(fclose(fp)) {
1227  return NULL;
1228  }
1229 
1230  return result;
1231 }
#define HECMW_MSG_LEN
Definition: hecmw_config.h:74
#define HECMW_HEADER_LEN
Definition: hecmw_config.h:68
#define HECMW_NAME_LEN
Definition: hecmw_config.h:70
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