1 /*     CalculiX - A 3-dimensional finite element program                 */
2 /*              Copyright (C) 1998-2021 Guido Dhondt                          */
3 
4 /*     This program is free software; you can redistribute it and/or     */
5 /*     modify it under the terms of the GNU General Public License as    */
6 /*     published by the Free Software Foundation(version 2);    */
7 /*                                                                       */
8 
9 /*     This program is distributed in the hope that it will be useful,   */
10 /*     but WITHOUT ANY WARRANTY; without even the implied warranty of    */
11 /*     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the      */
12 /*     GNU General Public License for more details.                      */
13 
14 /*     You should have received a copy of the GNU General Public License */
15 /*     along with this program; if not, write to the Free Software       */
16 /*     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.         */
17 
18 #include <stdlib.h>
19 #include <math.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include "CalculiX.h"
23 
frdvector(double * v,ITG * iset,ITG * ntrans,char * filabl,ITG * nkcoords,ITG * inum,char * m1,ITG * inotr,double * trab,double * co,ITG * istartset,ITG * iendset,ITG * ialset,ITG * mi,ITG * ngraph,FILE * f1,char * output,char * m3)24 void frdvector(double *v,ITG *iset,ITG *ntrans,char * filabl,ITG *nkcoords,
25                ITG *inum,char *m1,ITG *inotr,double *trab,double *co,
26                ITG *istartset,ITG *iendset,ITG *ialset,ITG *mi,ITG *ngraph,
27                FILE *f1,char *output,char *m3){
28 
29   ITG i,k,l,m,nksegment;
30 
31   int iw;
32 
33   float fl;
34 
35   double a[9],db;
36 
37   if(*iset==0){
38     if((*ntrans==0)||(strcmp1(&filabl[5],"G")==0)){
39       for(i=0;i<*nkcoords;i++){
40 	if(inum[i]<=0) continue;
41 	if(strcmp1(output,"asc")==0){
42 	  fprintf(f1,"%3s%10" ITGFORMAT "%12.5E%12.5E%12.5E\n",m1,i+1,
43                   (float)v[(mi[1]+1)*i+1],
44 		  (float)v[(mi[1]+1)*i+2],(float)v[(mi[1]+1)*i+3]);
45 	}else if(strcmp1(output,"bin")==0){
46 	  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
47 	  fl=(float)v[(mi[1]+1)*i+1];fwrite(&fl,sizeof(float),1,f1);
48 	  fl=(float)v[(mi[1]+1)*i+2];fwrite(&fl,sizeof(float),1,f1);
49 	  fl=(float)v[(mi[1]+1)*i+3];fwrite(&fl,sizeof(float),1,f1);
50 	}else{
51 	  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
52 	  db=v[(mi[1]+1)*i+1];fwrite(&db,sizeof(double),1,f1);
53 	  db=v[(mi[1]+1)*i+2];fwrite(&db,sizeof(double),1,f1);
54 	  db=v[(mi[1]+1)*i+3];fwrite(&db,sizeof(double),1,f1);
55 	}
56       }
57     }else{
58       for(i=0;i<*nkcoords;i++){
59 	if(inum[i]<=0) continue;
60 	if(inotr[2*i]==0){
61 	  if(strcmp1(output,"asc")==0){
62 	    fprintf(f1,"%3s%10" ITGFORMAT "%12.5E%12.5E%12.5E\n",m1,i+1,
63                     (float)v[(mi[1]+1)*i+1],
64 		    (float)v[(mi[1]+1)*i+2],(float)v[(mi[1]+1)*i+3]);
65 	  }else if(strcmp1(output,"bin")==0){
66 	    iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
67 	    fl=(float)v[(mi[1]+1)*i+1];fwrite(&fl,sizeof(float),1,f1);
68 	    fl=(float)v[(mi[1]+1)*i+2];fwrite(&fl,sizeof(float),1,f1);
69 	    fl=(float)v[(mi[1]+1)*i+3];fwrite(&fl,sizeof(float),1,f1);
70 	  }else{
71 	    iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
72 	    db=v[(mi[1]+1)*i+1];fwrite(&db,sizeof(double),1,f1);
73 	    db=v[(mi[1]+1)*i+2];fwrite(&db,sizeof(double),1,f1);
74 	    db=v[(mi[1]+1)*i+3];fwrite(&db,sizeof(double),1,f1);
75 	  }
76 	}else{
77 	  FORTRAN(transformatrix,(&trab[7*(inotr[2*i]-1)],&co[3*i],a));
78 	  if(strcmp1(output,"asc")==0){
79 	    fprintf(f1,"%3s%10" ITGFORMAT "%12.5E%12.5E%12.5E\n",m1,i+1,
80 		    (float)(v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2]),
81 		    (float)(v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5]),
82 		    (float)(v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8]));
83 	  }else if(strcmp1(output,"bin")==0){
84 	    iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
85 	    fl=(float)v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2];
86 	    fwrite(&fl,sizeof(float),1,f1);
87 	    fl=(float)v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5];
88 	    fwrite(&fl,sizeof(float),1,f1);
89 	    fl=(float)v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8];
90 	    fwrite(&fl,sizeof(float),1,f1);
91 	  }else{
92 	    iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
93 	    db=v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2];
94 	    fwrite(&db,sizeof(double),1,f1);
95 	    db=v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5];
96 	    fwrite(&db,sizeof(double),1,f1);
97 	    db=v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8];
98 	    fwrite(&db,sizeof(double),1,f1);
99 	  }
100 	}
101       }
102     }
103   }else{
104     nksegment=(*nkcoords)/(*ngraph);
105     for(k=istartset[*iset-1]-1;k<iendset[*iset-1];k++){
106       if(ialset[k]>0){
107 	for(l=0;l<*ngraph;l++){
108 	  i=ialset[k]+l*nksegment-1;
109 	  if(inum[i]<=0) continue;
110 	  if((*ntrans==0)||(strcmp1(&filabl[5],"G")==0)||(inotr[2*i]==0)){
111 	      if(strcmp1(output,"asc")==0){
112 		  fprintf(f1,"%3s%10" ITGFORMAT "%12.5E%12.5E%12.5E\n",m1,i+1,(float)v[(mi[1]+1)*i+1],
113 			  (float)v[(mi[1]+1)*i+2],(float)v[(mi[1]+1)*i+3]);
114 	      }else if(strcmp1(output,"bin")==0){
115 		  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
116 		  fl=(float)v[(mi[1]+1)*i+1];fwrite(&fl,sizeof(float),1,f1);
117 		  fl=(float)v[(mi[1]+1)*i+2];fwrite(&fl,sizeof(float),1,f1);
118 		  fl=(float)v[(mi[1]+1)*i+3];fwrite(&fl,sizeof(float),1,f1);
119 	      }else{
120 		  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
121 		  db=v[(mi[1]+1)*i+1];fwrite(&db,sizeof(double),1,f1);
122 		  db=v[(mi[1]+1)*i+2];fwrite(&db,sizeof(double),1,f1);
123 		  db=v[(mi[1]+1)*i+3];fwrite(&db,sizeof(double),1,f1);
124 	      }
125 	  }else{
126 	      FORTRAN(transformatrix,(&trab[7*(inotr[2*i]-1)],&co[3*i],a));
127 	      if(strcmp1(output,"asc")==0){
128 		  fprintf(f1,"%3s%10" ITGFORMAT "%12.5E%12.5E%12.5E\n",m1,i+1,
129 			  (float)(v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2]),
130 			  (float)(v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5]),
131 			  (float)(v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8]));
132 	      }else if(strcmp1(output,"bin")==0){
133 		  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
134 		  fl=(float)v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2];
135 		  fwrite(&fl,sizeof(float),1,f1);
136 		  fl=(float)v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5];
137 		  fwrite(&fl,sizeof(float),1,f1);
138 		  fl=(float)v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8];
139 		  fwrite(&fl,sizeof(float),1,f1);
140 	      }else{
141 		  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
142 		  db=v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2];
143 		  fwrite(&db,sizeof(double),1,f1);
144 		  db=v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5];
145 		  fwrite(&db,sizeof(double),1,f1);
146 		  db=v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8];
147 		  fwrite(&db,sizeof(double),1,f1);
148 	      }
149 	  }
150 	}
151       }else{
152 	l=ialset[k-2];
153 	do{
154 	  l-=ialset[k];
155 	  if(l>=ialset[k-1]) break;
156 	  for(m=0;m<*ngraph;m++){
157 	    i=l+m*nksegment-1;
158 	    if(inum[i]<=0) continue;
159 	    if((*ntrans==0)||(strcmp1(&filabl[5],"G")==0)||(inotr[2*i]==0)){
160 		if(strcmp1(output,"asc")==0){
161 		    fprintf(f1,"%3s%10" ITGFORMAT "%12.5E%12.5E%12.5E\n",m1,i+1,(float)v[(mi[1]+1)*i+1],
162 			    (float)v[(mi[1]+1)*i+2],(float)v[(mi[1]+1)*i+3]);
163 		}else if(strcmp1(output,"bin")==0){
164 		    iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
165 		    fl=(float)v[(mi[1]+1)*i+1];fwrite(&fl,sizeof(float),1,f1);
166 		    fl=(float)v[(mi[1]+1)*i+2];fwrite(&fl,sizeof(float),1,f1);
167 		    fl=(float)v[(mi[1]+1)*i+3];fwrite(&fl,sizeof(float),1,f1);
168 		}else{
169 		    iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
170 		    db=v[(mi[1]+1)*i+1];fwrite(&db,sizeof(double),1,f1);
171 		    db=v[(mi[1]+1)*i+2];fwrite(&db,sizeof(double),1,f1);
172 		    db=v[(mi[1]+1)*i+3];fwrite(&db,sizeof(double),1,f1);
173 		}
174 	    }else{
175 	      FORTRAN(transformatrix,(&trab[7*(inotr[2*i]-1)],&co[3*i],a));
176 	      if(strcmp1(output,"asc")==0){
177 		  fprintf(f1,"%3s%10" ITGFORMAT "%12.5E%12.5E%12.5E\n",m1,i+1,
178 			  (float)(v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+
179 				  v[(mi[1]+1)*i+3]*a[2]),
180 			  (float)(v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+
181 				  v[(mi[1]+1)*i+3]*a[5]),
182 			  (float)(v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+
183 				  v[(mi[1]+1)*i+3]*a[8]));
184 	      }else if(strcmp1(output,"bin")==0){
185 		  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
186 		  fl=(float)v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2];
187 		  fwrite(&fl,sizeof(float),1,f1);
188 		  fl=(float)v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5];
189 		  fwrite(&fl,sizeof(float),1,f1);
190 		  fl=(float)v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8];
191 		  fwrite(&fl,sizeof(float),1,f1);
192 	      }else{
193 		  iw=(int)(i+1);fwrite(&iw,sizeof(int),1,f1);
194 		  db=v[(mi[1]+1)*i+1]*a[0]+v[(mi[1]+1)*i+2]*a[1]+v[(mi[1]+1)*i+3]*a[2];
195 		  fwrite(&db,sizeof(double),1,f1);
196 		  db=v[(mi[1]+1)*i+1]*a[3]+v[(mi[1]+1)*i+2]*a[4]+v[(mi[1]+1)*i+3]*a[5];
197 		  fwrite(&db,sizeof(double),1,f1);
198 		  db=v[(mi[1]+1)*i+1]*a[6]+v[(mi[1]+1)*i+2]*a[7]+v[(mi[1]+1)*i+3]*a[8];
199 		  fwrite(&db,sizeof(double),1,f1);
200 	      }
201 	    }
202 	  }
203 	}while(1);
204       }
205     }
206   }
207 
208   if(strcmp1(output,"asc")==0)fprintf(f1,"%3s\n",m3);
209 
210   return;
211 
212 }
213 
214