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
24 #define min(a,b) ((a) <= (b) ? (a) : (b))
25 #define max(a,b) ((a) >= (b) ? (a) : (b))
26
frd_sen(double * co,ITG * nk,double * dstn,ITG * inum,ITG * nmethod,ITG * kode,char * filab,double * time,ITG * nstate_,ITG * istep,ITG * iinc,ITG * mode,ITG * noddiam,char * description,ITG * mi,ITG * ngraph,ITG * ne,double * cs,char * set,ITG * nset,ITG * istartset,ITG * iendset,ITG * ialset,char * jobnamec,char * output,double * v,ITG * iobject,char * objectset,ITG * ntrans,ITG * inotr,double * trab,ITG * idesvar,char * orname,ITG * icoordinate,ITG * inorm,ITG * irand,ITG * ishape)27 void frd_sen(double *co,ITG *nk,double *dstn,ITG *inum,ITG *nmethod,
28 ITG *kode,char *filab,double *time,ITG *nstate_,
29 ITG *istep,ITG *iinc,ITG *mode,ITG *noddiam,char *description,
30 ITG *mi,ITG *ngraph,ITG *ne,double *cs,char *set,ITG *nset,
31 ITG *istartset,ITG *iendset,ITG *ialset,
32 char *jobnamec,char *output,double *v,ITG *iobject,
33 char *objectset,ITG *ntrans,ITG *inotr,double *trab,
34 ITG *idesvar,char *orname,ITG *icoordinate,ITG *inorm,
35 ITG *irand,ITG *ishape){
36
37 /* stores the results in frd format
38
39 iselect selects which nodes are to be stored:
40 iselect=-1 means only those nodes for which inum negative
41 ist, i.e. network nodes
42 iselect=+1 means only those nodes for which inum positive
43 ist, i.e. structural nodes
44 iselect=0 means both of the above */
45
46 FILE *f1;
47
48 char m1[4]=" -1",m2[4]=" -2",m3[4]=" -3",fneig[132]="",text[132];
49
50 static ITG icounter=0,nkcoords;
51
52 ITG null,one,i,noutloc,iset,iselect,two,three,nout,noutplus,noutmin,
53 mt=mi[1]+1,ioutall=0;
54
55 ITG ncompscalar=1,ifieldscalar[1]={1},icompscalar[1]={0},
56 nfieldscalar[2]={1,0};
57 ITG ncomptensoro=6,ifieldtensoro[6]={1,1,1,1,1,1},
58 icomptensoro[6]={0,1,2,3,5,4},nfieldtensoro[2]={6,0},
59 ncomptensord=2,ifieldtensord[4]={1,1},icomptensord[2]={0,1},
60 nfieldtensord[2]={2,0};
61 ITG ncompvector=3,ifieldvector[3]={1,1,1},icompvector[3]={0,1,2},
62 nfieldvector1[2]={3,0};
63
64 double pi,oner;
65
66 strcpy(fneig,jobnamec);
67 strcat(fneig,".frd");
68
69 if((f1=fopen(fneig,"ab"))==NULL){
70 printf("*ERROR in frd: cannot open frd file for writing...");
71 exit(0);
72 }
73
74 /* check whether all results have to be stored (also those
75 corresponding to inactive nodes or elements) */
76
77 if(strcmp1(&output[3],"a")==0) ioutall=1;
78
79 pi=4.*atan(1.);
80 null=0;
81 one=1;two=2;three=3;
82 oner=1.;
83
84 /* determining nout, noutplus and noutmin
85 nout: number of structural and network nodes
86 noutplus: number of structural nodes
87 noutmin: number of network nodes */
88
89 if(*nmethod!=0){
90 nout=0;
91 noutplus=0;
92 noutmin=0;
93 if(ioutall==0){
94 for(i=0;i<*nk;i++){
95 if(inum[i]==0) continue;
96 nout++;
97 if(inum[i]>0) noutplus++;
98 if(inum[i]<0) noutmin++;
99 }
100 }else{
101 for(i=0;i<*nk;i++){
102 nout++;
103 if(inum[i]>0) noutplus++;
104 if(inum[i]<0) noutmin++;
105 }
106 }
107 }else{
108 nout=*nk;
109 }
110
111 nkcoords=*nk;
112 iselect=1;
113
114 if(*inorm==1){
115
116 /* storing the normals to the structure */
117
118 frdset(&filab[4002],set,&iset,istartset,iendset,ialset,
119 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
120 ngraph);
121
122 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
123 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
124
125 fprintf(f1," -4 NORM 4 1\n");
126 fprintf(f1," -5 NORMX 1 2 1 0\n");
127 fprintf(f1," -5 NORMY 1 2 2 0\n");
128 fprintf(f1," -5 NORMZ 1 2 3 0\n");
129 fprintf(f1," -5 ALL 1 2 0 0 1ALL\n");
130
131 frdselect(v,v,&iset,&nkcoords,inum,m1,istartset,iendset,
132 ialset,ngraph,&ncompvector,ifieldvector,icompvector,
133 nfieldvector1,&iselect,m2,f1,output,m3);
134
135 }else if(*ishape==1){
136
137 /* storing the shape updates to the structure */
138
139 frdset(&filab[4002],set,&iset,istartset,iendset,ialset,
140 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
141 ngraph);
142
143 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
144 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
145
146 fprintf(f1," -4 SEVE 4 1\n");
147 fprintf(f1," -5 SEVEX 1 2 1 0\n");
148 fprintf(f1," -5 SEVEY 1 2 2 0\n");
149 fprintf(f1," -5 SEVEZ 1 2 3 0\n");
150 fprintf(f1," -5 ALL 1 2 0 0 1ALL\n");
151
152 frdselect(v,v,&iset,&nkcoords,inum,m1,istartset,iendset,
153 ialset,ngraph,&ncompvector,ifieldvector,icompvector,
154 nfieldvector1,&iselect,m2,f1,output,m3);
155
156 }else if(*irand==1){
157
158 /* storing the normals to the structure */
159
160 iselect=0;
161
162 frdset(&filab[87],set,&iset,istartset,iendset,ialset,
163 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
164 ngraph);
165
166 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
167 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
168
169 fprintf(f1," -4 RANDSCA 1 1\n");
170 fprintf(f1," -5 RAND 1 1 0 0\n");
171
172 frdselect(v,v,&iset,&nkcoords,inum,m1,istartset,iendset,
173 ialset,ngraph,&ncompscalar,ifieldscalar,icompscalar,
174 nfieldscalar,&iselect,m2,f1,output,m3);
175
176 }else if(*irand==2){
177
178 /* storing the random vectors in the structure */
179
180 frdset(&filab[4002],set,&iset,istartset,iendset,ialset,
181 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
182 ngraph);
183
184 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
185 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
186
187 fprintf(f1," -4 RANDVEC 4 1\n");
188 fprintf(f1," -5 RANDX 1 2 1 0\n");
189 fprintf(f1," -5 RANDY 1 2 2 0\n");
190 fprintf(f1," -5 RANDZ 1 2 3 0\n");
191 fprintf(f1," -5 ALL 1 2 0 0 1ALL\n");
192
193 frdselect(v,v,&iset,&nkcoords,inum,m1,istartset,iendset,
194 ialset,ngraph,&ncompvector,ifieldvector,icompvector,
195 nfieldvector1,&iselect,m2,f1,output,m3);
196
197 }else if(*irand==3){
198
199 /* storing the normals to the structure */
200
201 iselect=0;
202
203 frdset(&filab[87],set,&iset,istartset,iendset,ialset,
204 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
205 ngraph);
206
207 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
208 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
209
210 fprintf(f1," -4 MEANSCA 1 1\n");
211 fprintf(f1," -5 MEAN 1 1 0 0\n");
212
213 frdselect(v,v,&iset,&nkcoords,inum,m1,istartset,iendset,
214 ialset,ngraph,&ncompscalar,ifieldscalar,icompscalar,
215 nfieldscalar,&iselect,m2,f1,output,m3);
216
217 }else if(*irand==4){
218
219 /* storing the random vectors in the structure */
220
221 frdset(&filab[4002],set,&iset,istartset,iendset,ialset,
222 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
223 ngraph);
224
225 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
226 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
227
228 fprintf(f1," -4 MEANVEC 4 1\n");
229 fprintf(f1," -5 MEANX 1 2 1 0\n");
230 fprintf(f1," -5 MEANY 1 2 2 0\n");
231 fprintf(f1," -5 MEANZ 1 2 3 0\n");
232 fprintf(f1," -5 ALL 1 2 0 0 1ALL\n");
233
234 frdselect(v,v,&iset,&nkcoords,inum,m1,istartset,iendset,
235 ialset,ngraph,&ncompvector,ifieldvector,icompvector,
236 nfieldvector1,&iselect,m2,f1,output,m3);
237
238 }else if(*irand==5){
239
240 /* storing the normals to the structure */
241
242 iselect=0;
243
244 frdset(&filab[87],set,&iset,istartset,iendset,ialset,
245 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
246 ngraph);
247
248 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
249 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
250
251 fprintf(f1," -4 LOCREL 1 1\n");
252 fprintf(f1," -5 LOCREL 1 1 0 0\n");
253
254 frdselect(v,v,&iset,&nkcoords,inum,m1,istartset,iendset,
255 ialset,ngraph,&ncompscalar,ifieldscalar,icompscalar,
256 nfieldscalar,&iselect,m2,f1,output,m3);
257
258 }else if(*icoordinate!=1){
259
260 /* storing the orientation sensitivities in the nodes */
261
262 if((strcmp1(&objectset[(*iobject-1)*405],"ALL-DISP")==0)||
263 (strcmp1(&objectset[(*iobject-1)*405],"EIGENFREQUENCY")==0)||
264 (strcmp1(&objectset[(*iobject-1)*405],"GREEN")==0)){
265
266 frdset(&filab[4002],set,&iset,istartset,iendset,ialset,
267 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
268 ngraph);
269
270 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
271 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
272
273 strcpy1(&text[0]," -4 4 1",23);
274 strcpy1(&text[5],"D",1);
275 strcpy1(&text[6],&orname[80*(*idesvar/3)],5);
276 if(*idesvar-(*idesvar/3)*3==0){
277 strcpy1(&text[11],"Rx",2);
278 text[23]='\0';
279 fprintf(f1,"%s\n",text);
280 fprintf(f1," -5 dD1dRx 1 2 1 0\n");
281 fprintf(f1," -5 dD2dRx 1 2 1 0\n");
282 fprintf(f1," -5 dD3dRx 1 2 1 0\n");
283 }else if(*idesvar-(*idesvar/3)*3==1){
284 strcpy1(&text[11],"Ry",2);
285 text[23]='\0';
286 fprintf(f1,"%s\n",text);
287 fprintf(f1," -5 dD1dRy 1 2 1 0\n");
288 fprintf(f1," -5 dD2dRy 1 2 1 0\n");
289 fprintf(f1," -5 dD3dRy 1 2 1 0\n");
290 }else{
291 strcpy1(&text[11],"Rz",2);
292 text[23]='\0';
293 fprintf(f1,"%s\n",text);
294 fprintf(f1," -5 dD1dRz 1 2 1 0\n");
295 fprintf(f1," -5 dD2dRz 1 2 1 0\n");
296 fprintf(f1," -5 dD3dRz 1 2 1 0\n");
297 }
298 fprintf(f1," -5 ALL 1 2 0 0 1ALL\n");
299
300 frdvector(v,&iset,ntrans,&filab[4002],&nkcoords,inum,m1,inotr,
301 trab,co,istartset,iendset,ialset,mi,ngraph,f1,output,m3);
302
303 if(*noddiam>=0){
304
305 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
306 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
307
308 strcpy1(&text[0]," -4 4 1",23);
309 strcpy1(&text[5],"D",1);
310 strcpy1(&text[6],&orname[80*(*idesvar/3)],5);
311 if(*idesvar-(*idesvar/3)*3==0){
312 strcpy1(&text[10],"RxI",3);
313 text[23]='\0';
314 fprintf(f1,"%s\n",text);
315 fprintf(f1," -5 dD1dRx 1 2 1 0\n");
316 fprintf(f1," -5 dD2dRx 1 2 1 0\n");
317 fprintf(f1," -5 dD3dRx 1 2 1 0\n");
318 }else if(*idesvar-(*idesvar/3)*3==1){
319 strcpy1(&text[10],"RyI",3);
320 text[23]='\0';
321 fprintf(f1,"%s\n",text);
322 fprintf(f1," -5 dD1dRy 1 2 1 0\n");
323 fprintf(f1," -5 dD2dRy 1 2 1 0\n");
324 fprintf(f1," -5 dD3dRy 1 2 1 0\n");
325 }else{
326 strcpy1(&text[10],"RzI",3);
327 text[23]='\0';
328 fprintf(f1,"%s\n",text);
329 fprintf(f1," -5 dD1dRz 1 2 1 0\n");
330 fprintf(f1," -5 dD2dRz 1 2 1 0\n");
331 fprintf(f1," -5 dD3dRz 1 2 1 0\n");
332 }
333 fprintf(f1," -5 ALL 1 2 0 0 1ALL\n");
334
335 frdvector(&v[*nk*mt],&iset,ntrans,&filab[4002],&nkcoords,inum,m1,inotr,
336 trab,co,istartset,iendset,ialset,mi,ngraph,f1,output,m3);
337 }
338
339 }else if(strcmp1(&objectset[(*iobject-1)*405],"STRESS")==0){
340
341 frdset(&filab[4002],set,&iset,istartset,iendset,ialset,
342 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
343 ngraph);
344
345 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
346 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
347
348 strcpy1(&text[0]," -4 6 1",23);
349 strcpy1(&text[5],"S",1);
350 strcpy1(&text[6],&orname[80*(*idesvar/3)],5);
351 if(*idesvar-(*idesvar/3)*3==0){
352 strcpy1(&text[11],"Rx",2);
353 text[23]='\0';
354 fprintf(f1,"%s\n",text);
355 fprintf(f1," -5 dSXXdRx 1 4 1 1\n");
356 fprintf(f1," -5 dSYYdRx 1 4 2 2\n");
357 fprintf(f1," -5 dSZZdRx 1 4 3 3\n");
358 fprintf(f1," -5 dSXYdRx 1 4 1 2\n");
359 fprintf(f1," -5 dSYZdRx 1 4 2 3\n");
360 fprintf(f1," -5 dSZXdRx 1 4 3 1\n");
361 }else if(*idesvar-(*idesvar/3)*3==1){
362 strcpy1(&text[11],"Ry",2);
363 text[23]='\0';
364 fprintf(f1,"%s\n",text);
365 fprintf(f1," -5 dSXXdRy 1 4 1 1\n");
366 fprintf(f1," -5 dSYYdRy 1 4 2 2\n");
367 fprintf(f1," -5 dSZZdRy 1 4 3 3\n");
368 fprintf(f1," -5 dSXYdRy 1 4 1 2\n");
369 fprintf(f1," -5 dSYZdRy 1 4 2 3\n");
370 fprintf(f1," -5 dSZXdRy 1 4 3 1\n");
371 }else{
372 strcpy1(&text[11],"Rz",2);
373 text[23]='\0';
374 fprintf(f1,"%s\n",text);
375 fprintf(f1," -5 dSXXdRz 1 4 1 1\n");
376 fprintf(f1," -5 dSYYdRz 1 4 2 2\n");
377 fprintf(f1," -5 dSZZdRz 1 4 3 3\n");
378 fprintf(f1," -5 dSXYdRz 1 4 1 2\n");
379 fprintf(f1," -5 dSYZdRz 1 4 2 3\n");
380 fprintf(f1," -5 dSZXdRz 1 4 3 1\n");
381 }
382
383 frdselect(dstn,dstn,&iset,&nkcoords,inum,m1,istartset,iendset,
384 ialset,ngraph,&ncomptensoro,ifieldtensoro,icomptensoro,
385 nfieldtensoro,&iselect,m2,f1,output,m3);
386
387 }
388
389 }else{
390
391 /* storing the coordinate sensitivities in the nodes */
392
393 frdset(&filab[4002],set,&iset,istartset,iendset,ialset,
394 inum,&noutloc,&nout,nset,&noutmin,&noutplus,&iselect,
395 ngraph);
396
397 frdheader(&icounter,&oner,time,&pi,noddiam,cs,&null,mode,
398 &noutloc,description,kode,nmethod,f1,output,istep,iinc);
399
400 if(strcmp1(&objectset[*iobject*405],"STRAINENERGY")==0){
401 fprintf(f1," -4 SENENER 2 1\n");
402 }else if(strcmp1(&objectset[*iobject*405],"MASS")==0){
403 fprintf(f1," -4 SENMASS 2 1\n");
404 }else if(strcmp1(&objectset[*iobject*405],"ALL-DISP")==0){
405 fprintf(f1," -4 SENDISA 2 1\n");
406 }else if(strcmp1(&objectset[*iobject*405],"X-DISP")==0){
407 fprintf(f1," -4 SENDISX 2 1\n");
408 }else if(strcmp1(&objectset[*iobject*405],"Y-DISP")==0){
409 fprintf(f1," -4 SENDISY 2 1\n");
410 }else if(strcmp1(&objectset[*iobject*405],"Z-DISP")==0){
411 fprintf(f1," -4 SENDISZ 2 1\n");
412 }else if(strcmp1(&objectset[*iobject*405],"STRESS")==0){
413 fprintf(f1," -4 SENSTRE 2 1\n");
414 }else if(strcmp1(&objectset[*iobject*405],"MODALSTRESS")==0){
415 fprintf(f1," -4 SENSTRE 2 1\n");
416 }else if(strcmp1(&objectset[*iobject*405],"EIGENFREQUENCY")==0){
417 fprintf(f1," -4 SENFREQ 2 1\n");
418 }else if(strcmp1(&objectset[*iobject*405],"MAXMEMBERSIZE")==0){
419 fprintf(f1," -4 SENTHCK 2 1\n");
420 }else if(strcmp1(&objectset[*iobject*405],"MINMEMBERSIZE")==0){
421 fprintf(f1," -4 SENTHCK 2 1\n");
422 }else if(strcmp1(&objectset[*iobject*405],"FIXGROWTH")==0){
423 fprintf(f1," -4 SENGROW 2 1\n");
424 }else if(strcmp1(&objectset[*iobject*405],"FIXSHRINKAGE")==0){
425 fprintf(f1," -4 SENSHRN 2 1\n");
426 }else if(strcmp1(&objectset[*iobject*405],"PROJECTGRAD")==0){
427 fprintf(f1," -4 PRJGRAD 2 1\n");
428 }
429
430 fprintf(f1," -5 DFDN 1 1 1 0\n");
431 fprintf(f1," -5 DFDNFIL 1 1 2 0\n");
432
433 frdselect(&v[2**nk**iobject],v,&iset,&nkcoords,inum,m1,istartset,
434 iendset,ialset,ngraph,&ncomptensord,ifieldtensord,icomptensord,
435 nfieldtensord,&iselect,m2,f1,output,m3);
436
437 }
438
439 fclose(f1);
440 return;
441
442 }
443