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