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