1 /***********************************************************************
2 *
3 *               *****   ***    ***
4 *                  *   *   *  *   *
5 *                 *     ***    ***
6 *                *     *   *  *   *
7 *               *****   ***    ***
8 *
9 * A FREE Finite Elements Analysis Program in ANSI C for the Windows & UNIX OS.
10 *
11 * Composed and edited and copyright by
12 * Professor Dr.-Ing. Frank Rieg, University of Bayreuth, Germany
13 *
14 * eMail:
15 * frank.rieg@uni-bayreuth.de
16 * dr.frank.rieg@t-online.de
17 *
18 * V15.0  November 18, 2015
19 *
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2, or (at your option)
23 * any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28 * GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
31 * along with this program; see the file COPYING.  If not, write to
32 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
33 ***********************************************************************/
34 /***********************************************************************
35 * ri1x88
36 * 18.11.2015 Rieg
37 ***********************************************************************/
38 
39 /*----------------------------------------------------------------------
40 * Windows
41 *---------------------------------------------------------------------*/
42 #ifdef FR_WIN
43 #include <z88o.h>
44 #include <stdio.h>           /* fprintf,fgets,sscanf */
45 #endif
46 
47 /*----------------------------------------------------------------------
48 * UNIX
49 *---------------------------------------------------------------------*/
50 #ifdef FR_UNIX
51 #include <z88o.h>
52 #include <stdio.h>           /* fprintf,fgets,sscanf */
53 #endif
54 
55 /***********************************************************************
56 * Leseformate
57 ***********************************************************************/
58 #ifdef FR_XINT
59 #define PDB "%d "
60 #define PD "%d"
61 #endif
62 
63 #ifdef FR_XLONG
64 #define PDB "%ld "
65 #define PD "%ld"
66 #endif
67 
68 #ifdef FR_XLOLO
69 #define PDB "%lld "
70 #define PD "%lld"
71 #endif
72 
73 #ifdef FR_XDOUB
74 #define PGB "%lg "
75 #define PG "%lg"
76 #endif
77 
78 #ifdef FR_XQUAD
79 #define PGB "%Lg "
80 #define PG "%Lg"
81 #endif
82 
83 /***********************************************************************
84 * Functions
85 ***********************************************************************/
86 int wlog88o(FR_INT4,int);
87 
88 /***********************************************************************
89 * Function ri1x88
90 ***********************************************************************/
ri1x88(void)91 int ri1x88(void)
92 {
93 extern FILE *fi1;
94 
95 extern FR_DOUBLEAY x;
96 extern FR_DOUBLEAY y;
97 extern FR_DOUBLEAY z;
98 
99 extern FR_INT4AY ityp;
100 extern FR_INT4AY koffs;
101 extern FR_INT4AY koi;
102 extern FR_INT4AY ivon;
103 extern FR_INT4AY ibis;
104 
105 extern FR_INT4 MAXE,MAXK,MAXKOI;
106 extern FR_INT4 ndim,nkp,ne,nfg,kflag,ipflag;
107 
108 FR_DOUBLE radius,phi;
109 
110 FR_INT4 i,idummy,jdummy,kofold;
111 
112 char cline[256];
113 
114 kflag= 0;  /* sicherheitshalber */
115 
116 /***********************************************************************
117 * Eintrag in z88o.log
118 ***********************************************************************/
119 wlog88o(0,LOG_REAI1);
120 
121 /***********************************************************************
122 * Einlesen der allgemeinen Strukturdaten
123 ***********************************************************************/
124 fgets(cline,256,fi1);
125 sscanf(cline,PDB PDB PDB PDB PD,&ndim,&nkp,&ne,&nfg,&kflag);
126 
127 /***********************************************************************
128 * Speicher und Dimension checken
129 ***********************************************************************/
130 if(nkp >= MAXK-1)
131   {
132   wlog88o(MAXK,LOG_EXMAXK);
133   return(AL_EXMAXK);
134   }
135 
136 if(ne >= MAXE-1)
137   {
138   wlog88o(MAXE,LOG_EXMAXE);
139   return(AL_EXMAXE);
140   }
141 
142 if(ndim < 2 || ndim > 3)
143   {
144   wlog88o(0,LOG_WRONGDIM);
145   return(AL_WRONGDIM);
146   }
147 
148 /***********************************************************************
149 * Einlesen der Koordinaten
150 ***********************************************************************/
151 if(ndim== 3)
152   {
153   for(i= 1; i <= nkp; i++)
154     {
155     fgets(cline,256,fi1);
156     sscanf(cline,PDB PDB PGB PGB PG,&idummy,&jdummy,&x[i],&y[i],&z[i]);
157     }
158   }
159 else
160   {
161   for(i= 1; i <= nkp; i++)
162     {
163     fgets(cline,256,fi1);
164     sscanf(cline,PDB PDB PGB PG,&idummy,&jdummy,&x[i],&y[i]);
165     }
166   }
167 
168 /*----------------------------------------------------------------------
169 * ggf auf kartesische Koordinaten umrechnen
170 *---------------------------------------------------------------------*/
171 if(kflag == 1)
172   {
173   for(i= 1; i <= nkp; i++)
174      {
175      radius= x[i];
176      phi= 3.141593/180.* y[i];
177      x[i]= radius*FR_COS(phi);
178      y[i]= radius*FR_SIN(phi);
179      }
180    }
181 
182 /*----------------------------------------------------------------------
183 * wenn Platten, dann z-Koordinaten beistellen und ndim auf 3 setzen
184 *---------------------------------------------------------------------*/
185 if(ipflag != 0)
186   {
187   ndim= 3;
188   for(i= 1; i <= nkp; i++)
189     z[i]= 0.;
190   }
191 
192 /***********************************************************************
193 * Einlesen der Koinzidenz
194 ***********************************************************************/
195 for(i= 1; i <= ne; i++)
196   {
197   fgets(cline,256,fi1);
198   sscanf(cline,PDB PD,&idummy,&ityp[i]);
199 
200 /*----------------------------------------------------------------------
201 * den Koinzidenzvektor koi & den zugehoerigen Pointervektor koffs
202 * auffuellen
203 *---------------------------------------------------------------------*/
204 /*======================================================================
205 * Elementtypen 1, 7, 8 & 20 & 23
206 *=====================================================================*/
207   if(ityp[i]== 1  || ityp[i]== 7 || ityp[i]== 8 ||
208      ityp[i]== 20 || ityp[i]== 23)
209     {
210     if(i== 1)  koffs[1]= 1;
211     else       koffs[i]= koffs[i-1] + kofold;
212 
213     if(koffs[i]+8 >= MAXKOI-1)
214       {
215       wlog88o(MAXKOI,LOG_EXMAXKOI);
216       return(AL_EXMAXKOI);
217       }
218 
219     fgets(cline,256,fi1);
220     sscanf(cline,PDB PDB PDB PDB PDB PDB PDB PD,
221     &koi[koffs[i]   ], &koi[koffs[i] +1],
222     &koi[koffs[i] +2], &koi[koffs[i] +3],
223     &koi[koffs[i] +4], &koi[koffs[i] +5],
224     &koi[koffs[i] +6], &koi[koffs[i] +7]);
225 
226     kofold= 8;
227     }
228 
229 /*======================================================================
230 * Elementtypen 2, 4, 5 , 9 & 13, 25
231 *=====================================================================*/
232   if(ityp[i]== 2 || ityp[i]== 4  || ityp[i]== 5 ||
233      ityp[i]== 9 || ityp[i]== 13 || ityp[i]== 25)
234     {
235     if(i== 1)  koffs[1]= 1;
236     else       koffs[i]= koffs[i-1] + kofold;
237 
238     if(koffs[i]+2 >= MAXKOI-1)
239       {
240       wlog88o(MAXKOI,LOG_EXMAXKOI);
241       return(AL_EXMAXKOI);
242       }
243 
244     fgets(cline,256,fi1);
245     sscanf(cline,PDB PD,
246     &koi[koffs[i]   ], &koi[koffs[i] +1]);
247 
248     kofold= 2;
249     }
250 
251 /*======================================================================
252 * Elementtyp 3, 14,15,18 & 24
253 *=====================================================================*/
254   if(ityp[i]== 3  || ityp[i]== 14 || ityp[i]== 15 ||
255      ityp[i]== 18 || ityp[i]== 24)
256     {
257     if(i== 1)  koffs[1]= 1;
258     else       koffs[i]= koffs[i-1] + kofold;
259 
260     if(koffs[i]+6 >= MAXKOI-1)
261       {
262       wlog88o(MAXKOI,LOG_EXMAXKOI);
263       return(AL_EXMAXKOI);
264       }
265 
266     fgets(cline,256,fi1);
267     sscanf(cline,PDB PDB PDB PDB PDB PD,
268     &koi[koffs[i]   ], &koi[koffs[i] +1],
269     &koi[koffs[i] +2], &koi[koffs[i] +3],
270     &koi[koffs[i] +4], &koi[koffs[i] +5]);
271 
272     kofold= 6;
273     }
274 
275 /*======================================================================
276 * Elementtyp 6
277 *=====================================================================*/
278   if(ityp[i]== 6)
279     {
280     if(i== 1)  koffs[1]= 1;
281     else       koffs[i]= koffs[i-1] + kofold;
282 
283     if(koffs[i]+3 >= MAXKOI-1)
284       {
285       wlog88o(MAXKOI,LOG_EXMAXKOI);
286       return(AL_EXMAXKOI);
287       }
288 
289     fgets(cline,256,fi1);
290     sscanf(cline,PDB PDB PD,
291     &koi[koffs[i]   ], &koi[koffs[i] +1],
292     &koi[koffs[i] +2]);
293 
294     kofold= 3;
295     }
296 
297 /*======================================================================
298 * Elementtypen 10
299 *=====================================================================*/
300   if(ityp[i]== 10)
301     {
302     if(i== 1)  koffs[1]= 1;
303     else       koffs[i]= koffs[i-1] + kofold;
304 
305     if(koffs[i]+20 >= MAXKOI-1)
306       {
307       wlog88o(MAXKOI,LOG_EXMAXKOI);
308       return(AL_EXMAXKOI);
309       }
310 
311     fgets(cline,256,fi1);
312     sscanf(cline,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
313     &koi[koffs[i]    ], &koi[koffs[i]  +1],
314     &koi[koffs[i]  +2], &koi[koffs[i]  +3],
315     &koi[koffs[i]  +4], &koi[koffs[i]  +5],
316     &koi[koffs[i]  +6], &koi[koffs[i]  +7],
317     &koi[koffs[i]  +8], &koi[koffs[i]  +9],
318     &koi[koffs[i] +10], &koi[koffs[i] +11],
319     &koi[koffs[i] +12], &koi[koffs[i] +13],
320     &koi[koffs[i] +14], &koi[koffs[i] +15],
321     &koi[koffs[i] +16], &koi[koffs[i] +17],
322     &koi[koffs[i] +18], &koi[koffs[i] +19]);
323 
324     kofold= 20;
325     }
326 
327 /*======================================================================
328 * Elementtypen 11 & 12 & 22
329 *=====================================================================*/
330   if(ityp[i]== 11 || ityp[i]== 12 || ityp[i]== 22)
331     {
332     if(i== 1)  koffs[1]= 1;
333     else       koffs[i]= koffs[i-1] + kofold;
334 
335     if(koffs[i]+12 >= MAXKOI-1)
336       {
337       wlog88o(MAXKOI,LOG_EXMAXKOI);
338       return(AL_EXMAXKOI);
339       }
340 
341     fgets(cline,256,fi1);
342     sscanf(cline,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
343     &koi[koffs[i]    ], &koi[koffs[i] + 1],
344     &koi[koffs[i] + 2], &koi[koffs[i] + 3],
345     &koi[koffs[i] + 4], &koi[koffs[i] + 5],
346     &koi[koffs[i] + 6], &koi[koffs[i] + 7],
347     &koi[koffs[i] + 8], &koi[koffs[i] + 9],
348     &koi[koffs[i] +10], &koi[koffs[i] +11]);
349 
350     kofold= 12;
351     }
352 
353 /*======================================================================
354 * Elementtypen 16
355 *=====================================================================*/
356   if(ityp[i]== 16)
357     {
358     if(i== 1)  koffs[1]= 1;
359     else       koffs[i]= koffs[i-1] + kofold;
360 
361     if(koffs[i]+10 >= MAXKOI-1)
362       {
363       wlog88o(MAXKOI,LOG_EXMAXKOI);
364       return(AL_EXMAXKOI);
365       }
366 
367     fgets(cline,256,fi1);
368     sscanf(cline,PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
369     &koi[koffs[i]   ], &koi[koffs[i] +1],
370     &koi[koffs[i] +2], &koi[koffs[i] +3],
371     &koi[koffs[i] +4], &koi[koffs[i] +5],
372     &koi[koffs[i] +6], &koi[koffs[i] +7],
373     &koi[koffs[i] +8], &koi[koffs[i] +9]);
374 
375     kofold= 10;
376     }
377 
378 /*======================================================================
379 * Elementtypen 17
380 *=====================================================================*/
381   if(ityp[i]== 17)
382     {
383     if(i== 1)  koffs[1]= 1;
384     else       koffs[i]= koffs[i-1] + kofold;
385 
386     if(koffs[i]+4 >= MAXKOI-1)
387       {
388       wlog88o(MAXKOI,LOG_EXMAXKOI);
389       return(AL_EXMAXKOI);
390       }
391 
392     fgets(cline,256,fi1);
393     sscanf(cline,PDB PDB PDB PD,
394     &koi[koffs[i]   ], &koi[koffs[i] +1],
395     &koi[koffs[i] +2], &koi[koffs[i] +3]);
396 
397     kofold= 4;
398     }
399 
400 /*======================================================================
401 * Elementtypen 19 u. 21
402 *=====================================================================*/
403   if(ityp[i]== 19 || ityp[i]== 21)
404     {
405     if(i== 1)  koffs[1]= 1;
406     else       koffs[i]= koffs[i-1] + kofold;
407 
408     if(koffs[i]+16 >= MAXKOI-1)
409       {
410       wlog88o(MAXKOI,LOG_EXMAXKOI);
411       return(AL_EXMAXKOI);
412       }
413 
414     fgets(cline,256,fi1);
415     sscanf(cline,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
416     &koi[koffs[i]    ], &koi[koffs[i]  +1],
417     &koi[koffs[i]  +2], &koi[koffs[i]  +3],
418     &koi[koffs[i]  +4], &koi[koffs[i]  +5],
419     &koi[koffs[i]  +6], &koi[koffs[i]  +7],
420     &koi[koffs[i]  +8], &koi[koffs[i]  +9],
421     &koi[koffs[i] +10], &koi[koffs[i] +11],
422     &koi[koffs[i] +12], &koi[koffs[i] +13],
423     &koi[koffs[i] +14], &koi[koffs[i] +15]);
424 
425     kofold= 16;
426     }
427 
428   } /* ende Koinzidenz */
429 
430 wlog88o(0,LOG_REAI1OK);
431 return 0;
432 }
433