1 /* --------------------------------------------------------------------  */
2 /*                          CALCULIX                                     */
3 /*                   - GRAPHICAL INTERFACE -                             */
4 /*                                                                       */
5 /*     A 3-dimensional pre- and post-processor for finite elements       */
6 /*              Copyright (C) 1996 Klaus Wittig                          */
7 /*                                                                       */
8 /*     This program is free software; you can redistribute it and/or     */
9 /*     modify it under the terms of the GNU General Public License as    */
10 /*     published by the Free Software Foundation; version 2 of           */
11 /*     the License.                                                      */
12 /*                                                                       */
13 /*     This program is distributed in the hope that it will be useful,   */
14 /*     but WITHOUT ANY WARRANTY; without even the implied warranty of    */
15 /*     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the      */
16 /*     GNU General Public License for more details.                      */
17 /*                                                                       */
18 /*     You should have received a copy of the GNU General Public License */
19 /*     along with this program; if not, write to the Free Software       */
20 /*     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.         */
21 /* --------------------------------------------------------------------  */
22 /*
23 Jan 2016 Peter Heppel added an optional parameter to read <file> ng
24  new parameter is ndsb (NoDeleteShellsorBeams) if  you want to keep them.
25  (It would be better if this parameter contained vsb  for read volume ,
26  shell or beams)
27 
28 Jan 2016 Peter Heppel added a reader for quad8 elements -
29 although I'm guessing that .mat should be 10
30 */
31 
32 #include <cgx.h>
33 
34 #define TEST     0
35 
36 #define INI_FIELD_SIZE 100000
37 
38 extern Sets      *setx;
39 extern Summen    *anzx;
40 extern Alias     *alias;
41 extern SumGeo    anzGeo[1];
42 extern SumAsci   sumAsci[1];
43 
readNG(char * datin,Summen * apre,Sets ** sptr,Nodes ** nptr,Elements ** eptr,Datasets ** lptr)44 int readNG( char *datin, Summen *apre, Sets **sptr, Nodes **nptr, Elements **eptr, Datasets **lptr )
45 {
46   FILE *handle;
47   int i=0;
48 
49   char rec_str[MAX_LINE_LENGTH], buffer[MAX_LINE_LENGTH], name[MAX_LINE_LENGTH];
50   int  node_field_size, elem_field_size;
51   int  e_nmax=1, e_nmin=1;
52   int  length, sum,n;
53 
54   Nodes     *node=NULL;
55   Elements  *elem=NULL;
56 
57   anzx=apre;
58   setx=*sptr;
59 
60   node_field_size=INI_FIELD_SIZE;
61   do
62   {
63     if ( (node = (Nodes *)realloc( (Nodes *)node, (node_field_size+1) * sizeof(Nodes))) == NULL )
64     {
65       printf("WARNING: in readfrd() is INI_FIELD_SIZE:%d to large and is reduced\n", node_field_size );
66       node_field_size/=2;
67     }
68     if(node_field_size<100)
69     {
70       printf("\n\n ERROR: not enough memory in readfrd()\n\n");
71       exit(-1);
72     }
73   }while(!node);
74 
75   elem_field_size=INI_FIELD_SIZE;
76   do
77   {
78     if((elem = (Elements *)realloc( (Elements *)elem, (elem_field_size+1) * sizeof(Elements))) == NULL )
79     {
80       printf("WARNING: in readfrd() is INI_FIELD_SIZE:%d to large and is reduced\n", elem_field_size );
81       elem_field_size/=2;
82     }
83     if(elem_field_size<100)
84     {
85       printf("\n\n ERROR: not enough memory in readfrd()\n\n");
86       exit(-1);
87     }
88   }while(!elem);
89 
90 
91   /* Open the files and check to see that it was opened correctly */
92   handle = fopen (datin, "r");
93   if ( handle== NULL )  { printf ("ERROR: The input file \"%s\" could not be opened.\n\n", datin); return(-1); }
94   else  printf (" file:%s opened\n", datin);
95 
96   printf (" reading NG format\n");
97 
98   strcpy(anzx->model, datin);
99   printf (" MODEL NAME:  %s", anzx->model);
100 
101   do
102   {
103     length = frecord( handle, rec_str);
104     if(compare(rec_str,"surfaceelements",6)==6) break;
105     if (rec_str[length] == (char)EOF) break;
106   }while(1);
107 
108   /* jump the nr of elems */
109   length = frecord( handle, rec_str);
110   sscanf(rec_str, "%d", &sum);
111   for(i=0; i<sum; i++)
112   {
113     do { length = frecord( handle, rec_str); }while(!length);
114     //printf("surf:%s\n",rec_str);
115     if (rec_str[length] == (char)EOF) break;
116 
117     if (anzx->e>=elem_field_size)
118     {
119       elem_field_size=anzx->e+100;
120       if((elem=(Elements *)realloc((Elements *)elem,(elem_field_size+1)*sizeof(Elements)))==NULL)
121       {
122         printf("\n\n ERROR: realloc failed, elem-index:%d\n\n", anzx->e);
123         return(-1);
124       }
125     }
126     elem[anzx->e].nr    = anzx->e+1;
127     elem[anzx->e].group = 1;
128     elem[anzx->e].type  = 0;
129     if (elem[anzx->e].nr >  anzx->emax)  anzx->emax=elem[anzx->e].nr;
130     if (elem[anzx->e].nr <  anzx->emin)  anzx->emin=elem[anzx->e].nr;
131     sscanf(rec_str, "%*s %*s %*s %*s %d", &n );
132     if(n==3)
133     {
134       elem[anzx->e].type  = 7;
135       elem[anzx->e].mat   = 7;
136       sscanf(rec_str, "%*s %d %*s %*s %*s %d %d %d", &elem[anzx->e].mat, &elem[anzx->e].nod[0], &elem[anzx->e].nod[1], &elem[anzx->e].nod[2] );
137     }
138     else if(n==6)
139     {
140       elem[anzx->e].type  = 8;
141       elem[anzx->e].mat   = 8;
142       sscanf(rec_str, "%*s %d %*s %*s %*s %d %d %d %d %d %d", &elem[anzx->e].mat, &elem[anzx->e].nod[0], &elem[anzx->e].nod[1], &elem[anzx->e].nod[2], &elem[anzx->e].nod[4], &elem[anzx->e].nod[5], &elem[anzx->e].nod[3] );
143     }
144     else if(n==8)   //Peter qu8
145     {
146       elem[anzx->e].type  = 10;
147       elem[anzx->e].mat   = 10; // (peter) I'm guessing here
148       sscanf(rec_str, "%*s %d %*s %*s %*s %d %d %d %d %d %d %d %d", &elem[anzx->e].mat,
149               &elem[anzx->e].nod[0],
150               &elem[anzx->e].nod[1],
151               &elem[anzx->e].nod[2],
152               &elem[anzx->e].nod[3],
153               &elem[anzx->e].nod[4],
154               &elem[anzx->e].nod[6],
155               &elem[anzx->e].nod[7],
156               &elem[anzx->e].nod[5]
157 
158               );
159     }
160     else printf("elem-type not known, nr of nodes:%d\n", n);
161     anzx->etype[elem[anzx->e].type]++;
162     anzx->e++;
163   }
164 
165   do
166   {
167     length = frecord( handle, rec_str);
168     if(compare(rec_str,"volumeelements",6)==6) break;
169     if (rec_str[length] == (char)EOF) break;
170   }while(1);
171 
172   /* jump the nr of elems */
173   length = frecord( handle, rec_str);
174   sscanf(rec_str, "%d", &sum);
175   for(i=0; i<sum; i++)
176   {
177     length = frecord( handle, rec_str);
178     //printf("volu:%s\n",rec_str);
179     if (rec_str[length] == (char)EOF) break;
180 
181     if (anzx->e>=elem_field_size)
182     {
183       elem_field_size=anzx->e+100;
184       if((elem=(Elements *)realloc((Elements *)elem,(elem_field_size+1)*sizeof(Elements)))==NULL)
185       {
186         printf("\n\n ERROR: realloc failed, elem-index:%d\n\n", anzx->e);
187         return(-1);
188       }
189     }
190     elem[anzx->e].nr    = anzx->e+1;
191     elem[anzx->e].group = 1;
192     elem[anzx->e].type  = 0;
193     if (elem[anzx->e].nr >  anzx->emax)  anzx->emax=elem[anzx->e].nr;
194     if (elem[anzx->e].nr <  anzx->emin)  anzx->emin=elem[anzx->e].nr;
195     sscanf(rec_str, "%*s %d", &n );
196     if(n==4)
197     {
198       elem[anzx->e].mat   = 3;
199       elem[anzx->e].type  = 3;
200       sscanf(rec_str, "%d %*s %d %d %d %d", &elem[anzx->e].mat, &elem[anzx->e].nod[0], &elem[anzx->e].nod[2], &elem[anzx->e].nod[1], &elem[anzx->e].nod[3] );
201     }
202     else if(n==10)
203     {
204       elem[anzx->e].mat   = 6;
205       elem[anzx->e].type  = 6;
206       sscanf(rec_str, "%d %*s  %d %d %d %d %d %d %d %d %d %d", &elem[anzx->e].mat, &elem[anzx->e].nod[0], &elem[anzx->e].nod[2], &elem[anzx->e].nod[1],
207       &elem[anzx->e].nod[3], &elem[anzx->e].nod[6], &elem[anzx->e].nod[4], &elem[anzx->e].nod[7], &elem[anzx->e].nod[5], &elem[anzx->e].nod[9], &elem[anzx->e].nod[8] );
208     }
209     else printf("elem-type not known, nr of nodes:%d\n", n);
210     anzx->etype[elem[anzx->e].type]++;
211     anzx->e++;
212   }
213 
214 
215   do
216   {
217     length = frecord( handle, rec_str);
218     if(compare(rec_str,"edgesegments",6)==6) break;
219     if (rec_str[length] == (char)EOF) break;
220   }while(1);
221 
222   /* jump the nr of elems */
223   length = frecord( handle, rec_str);
224   sscanf(rec_str, "%d", &sum);
225   for(i=0; i<sum; i++)
226   {
227     length = frecord( handle, rec_str);
228     //printf("edge:%s\n",rec_str);
229     if (rec_str[length] == (char)EOF) break;
230 
231     if (anzx->e>=elem_field_size)
232     {
233       elem_field_size=anzx->e+100;
234       if((elem=(Elements *)realloc((Elements *)elem,(elem_field_size+1)*sizeof(Elements)))==NULL)
235       {
236         printf("\n\n ERROR: realloc failed, elem-index:%d\n\n", anzx->e);
237         return(-1);
238       }
239     }
240     elem[anzx->e].nr    = anzx->e+1;
241     elem[anzx->e].group = 1;
242     elem[anzx->e].mat   = 1;
243     elem[anzx->e].type  = 11;
244     if (elem[anzx->e].nr >  anzx->emax)  anzx->emax=elem[anzx->e].nr;
245     if (elem[anzx->e].nr <  anzx->emin)  anzx->emin=elem[anzx->e].nr;
246     sscanf(rec_str, "%d %*s %d %d", &elem[anzx->e].mat, &elem[anzx->e].nod[0], &elem[anzx->e].nod[1] );
247     anzx->etype[elem[anzx->e].type]++;
248     anzx->e++;
249   }
250 
251   do
252   {
253     length = frecord( handle, rec_str);
254     if (rec_str[length] == (char)EOF) break;
255     if(compare(rec_str,"points",4)==4) break;
256   }while(1);
257 
258   /* jump the nr of points */
259   length = frecord( handle, rec_str);
260   sscanf(rec_str, "%d", &sum);
261   for(i=0; i<sum; i++)
262   {
263     length = frecord( handle, rec_str);
264     if (rec_str[length] == (char)EOF) break;
265     //printf("node:%s\n",rec_str);
266     //node[anzx->n].nr = anzx->n;
267     node[anzx->n].nr = anzx->n+1;
268     if (node[anzx->n].nr>=node_field_size)
269     {
270       node_field_size=node[anzx->n].nr+100;
271       if ( (node = (Nodes *)realloc((Nodes *)node, (node_field_size+1) * sizeof(Nodes))) == NULL )
272       {
273         printf("\n\n ERROR: realloc failed, nodenr:%d\n\n", node[anzx->n].nr) ;
274         return(-1);
275       }
276     }
277     node[node[anzx->n].nr].indx=anzx->n;
278 
279     sscanf(rec_str,"%lf %lf %lf", &node[node[anzx->n].nr].nx,&node[node[anzx->n].nr].ny,&node[node[anzx->n].nr].nz);
280     if (node[anzx->n].nr >  anzx->nmax)  anzx->nmax=node[anzx->n].nr;
281     if (node[anzx->n].nr <  anzx->nmin)  anzx->nmin=node[anzx->n].nr;
282     anzx->n++;
283   }
284 
285   fclose(handle);
286 
287   node_field_size=anzx->nmax+1;
288   if((node =(Nodes *)realloc( (Nodes *)node, node_field_size*sizeof(Nodes)))==NULL)
289     printf("\n\n ERROR: realloc failed\n\n") ;
290   else
291     printf ("\n %d nodes reallocated \n",anzx->nmax);
292 
293   elem_field_size=anzx->e+1;
294   if ( (elem = (Elements *)realloc((Elements *)elem, elem_field_size * sizeof(Elements))) == NULL )
295     printf("\n\n ERROR: in readfrd realloc failed\n\n") ;
296   else
297     printf ("\n %d elements reallocated \n", anzx->e);
298 
299   if ( e_nmax > (anzx->nmax) )
300   {
301     printf ("\nWARNING: element requestes a nodename higher than allocated\n\n");
302     printf (" e_nmax=%d e_nmin=%d\n", e_nmax, e_nmin );
303   }
304   if ( e_nmin < 1 )
305   {
306     printf ("\nWARNING: element requestes a nodename lower than allocated\n\n");
307     printf (" e_nmax=%d e_nmin=%d\n", e_nmax, e_nmin );
308   }
309 
310 
311   for (i=0; i<anzx->e; i++)
312   {
313     sprintf(name,"%d",  elem[i].nr);
314     sprintf(buffer, "+set%d", elem[i].mat );
315     pre_setax( buffer, "e", name );
316   }
317   for (i=0; i<anzx->e; i++)
318   {
319     sprintf(name,"%d", elem[i].nr);
320     sprintf(buffer, "+typ%d", elem[i].type );
321     pre_setax( buffer, "e", name );
322   }
323 
324   *sptr = setx;
325   *nptr = node;
326   *eptr = elem;
327   return(1);
328 }
329 
330