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