ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_rsystus.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 15116 byte(s)
Log Message:
structure de l'écriture

File Contents

# User Rev Content
1 francois 283 /* lecture des fichiers */
2     #include <stdio.h>
3     #include <string.h>
4     #include <stdlib.h>
5     #include "m3d_const.h"
6     #include "m3d_hotes.h"
7     #include "m3d_struct.h"
8     #include "m3d_erreur.h"
9     #include "prototype.h"
10     extern int format ;
11     extern GEST_MEM *gest ;
12     extern int nb_max_noe ;
13     void m3d_rsystus(int *nb_noeud,int *nb_ele,float *coord,int *numele,int *ierr)
14     {
15     FILE *stream ;
16     char line[MAX_LINE] ;
17     char temp[MAX_LINE] ;
18     char tabel[MAX_LINE] ;
19     int j,i, index;
20     /* declaration des fonctions */
21     char *ext_ele ;
22     int *corresp, itype ;
23     int *old, *neww, *tablin, *numele2;
24     float *coord2 ;
25    
26     *ierr = FAUX ;
27     j = 0 ;
28     itype = 0 ;
29    
30     if (format == SYSTUS)
31     {
32     temp[0] = 0 ;
33     strcpy(temp,gest->buffer) ;
34    
35     /* ouverture du fichier */
36     if (!(stream = fopen(temp,"r")))
37     {
38     *ierr = VRAI ;
39     m3d_erreur(ERR_OPEN);
40     return ;
41     }
42     /* lecture des 2 lignes d'entetes */
43     for (i=0;i<2;i++)
44     {
45     if (!fgets(line,MAX_LINE,stream))
46     {
47     *ierr = VRAI ;
48     m3d_erreur(ERR_FORMAT);
49     return ;
50     }
51     }
52     /* le maillage est il quadratique ou lineaire */
53    
54     /* lecture du nombre de noeuds */
55     index = 1 ;
56     while ((index != -1) && (index!=0))
57     {
58     if (!fgets(line,MAX_LINE,stream))
59     {
60     *ierr = VRAI ;
61     m3d_erreur(ERR_FORMAT);
62     return ;
63     }
64     tabel[0] = 0 ;
65     strncat(tabel,line,5) ;/* 5 premiers caracteres */
66     index = atoi(tabel) ;
67     }
68     if (index==0)
69     {
70     *ierr = VRAI ;
71     m3d_erreur(ERR_FORMAT);
72     return ;
73     }
74     /* on pointe sur -1 */
75     /* lecture du nombre de noeuds */
76     tabel[0] = 0 ;
77     strncat(tabel,line+5,5) ;/* 5 caracteres suivants */
78     *nb_noeud = atoi(tabel) ;
79     if (*nb_noeud>=nb_max_noe)
80     {
81     *ierr = VRAI ;
82     m3d_erreur(ERR_NB_NOE);
83     return ;
84     }
85     j = 0 ;
86     for (i=0;i<*nb_noeud;i++)
87     {
88     if (!fgets(line,MAX_LINE,stream))
89     {
90     *ierr = VRAI ;
91     m3d_erreur(ERR_FORMAT);
92     return ;
93     }
94     /* lecture du plus grand numero de noeud */
95     if (sscanf(line,"%d",&index)!=1)
96     {
97     *ierr = VRAI ;
98     m3d_erreur(ERR_FORMAT);
99     return ;
100     }
101     if (index>j) j = index ;
102     }
103     /* rewind */
104     rewind(stream) ;
105     /* alloc du tableau de correspondance */
106     corresp = (int*)calloc(j+1,sizeof(int)) ;
107     if (corresp == NULL)
108     {
109     *ierr = VRAI ;
110     m3d_erreur(ERR_ALLOC);
111     return ;
112     }
113     /* plus grand numero */
114     gest->numax = j ;
115     gest->tabcor = (int*)calloc((*nb_noeud)+1,sizeof(int)) ;
116     if (gest->tabcor == NULL)
117     {
118     *ierr = VRAI ;
119     m3d_erreur(ERR_ALLOC);
120     return ;
121     }
122     /* lecture des 2 lignes d'entetes */
123     for (i=0;i<2;i++)
124     {
125     if (!fgets(line,MAX_LINE,stream))
126     {
127     *ierr = VRAI ;
128     m3d_erreur(ERR_FORMAT);
129     return ;
130     }
131     }
132    
133     /* lecture du nombre de noeuds */
134     index = 1 ;
135     while ((index != -1) && (index!=0))
136     {
137     if (!fgets(line,MAX_LINE,stream))
138     {
139     *ierr = VRAI ;
140     m3d_erreur(ERR_FORMAT);
141     return ;
142     }
143     tabel[0] = 0 ;
144     strncat(tabel,line,5) ;/* 5 premiers caracteres */
145     index = atoi(tabel) ;
146     }
147     if (index==0)
148     {
149     *ierr = VRAI ;
150     m3d_erreur(ERR_FORMAT);
151     return ;
152     }
153     /* on pointe sur -1 */
154     /* lecture du nombre de noeuds */
155     tabel[0] = 0 ;
156     strncat(tabel,line+5,5) ;/* 5 caracteres suivants */
157     *nb_noeud = atoi(tabel) ;
158     for (i=0;i<*nb_noeud;i++)
159     {
160     if (!fgets(line,MAX_LINE,stream))
161     {
162     *ierr = VRAI ;
163     m3d_erreur(ERR_FORMAT);
164     return ;
165     }
166     if (sscanf(line,"%d",&j)!=1)
167     {
168     *ierr = VRAI ;
169     m3d_erreur(ERR_FORMAT);
170     return ;
171     }
172     corresp[j] = i + 1 ;
173     gest->tabcor[i+1] = j ;
174     }
175    
176     index = 1 ;
177     while ((index != -2) && (index!=0))
178     {
179     if (!fgets(line,MAX_LINE,stream))
180     {
181     *ierr = VRAI ;
182     m3d_erreur(ERR_FORMAT);
183     return ;
184     }
185     tabel[0] = 0 ;
186     strncat(tabel,line,5) ;/* 5 premiers caracteres */
187     index = atoi(tabel) ;
188     }
189     if (index==0)
190     {
191     *ierr = VRAI ;
192     m3d_erreur(ERR_FORMAT);
193     return ;
194     }
195    
196     /* lecture du nombre d'element */
197     tabel[0] = 0 ;
198     strncat(tabel,line+5,5) ;/* 5 caracteres suivants */
199     *nb_ele = atoi(tabel) ;
200     /* le maillage est il quadratique */
201     if (!fgets(line,MAX_LINE,stream))
202     {
203     *ierr = VRAI ;
204     m3d_erreur(ERR_FORMAT);
205     return ;
206     }
207     if (sscanf(line,"%d %d",&i,&itype)!=1)
208     if (itype == 2003) gest->is_qua = FAUX ;
209     else if (itype == 2006) gest->is_qua = VRAI ;
210     else
211     {
212     *ierr = VRAI ;
213     m3d_erreur(ERR_TYPE_ELE) ;
214     return ;
215     }
216     /* rewind */
217     rewind(stream) ;
218     /* traitement maillage lineaire */
219     if (gest->is_qua == FAUX)
220     {
221     /* lecture des 2 lignes d'entetes */
222     for (i=0;i<2;i++)
223     {
224     if (!fgets(line,MAX_LINE,stream))
225     {
226     *ierr = VRAI ;
227     m3d_erreur(ERR_FORMAT);
228     return ;
229     }
230     }
231    
232     index = 1 ;
233     while ((index != -1) && (index!=0))
234     {
235     if (!fgets(line,MAX_LINE,stream))
236     {
237     *ierr = VRAI ;
238     m3d_erreur(ERR_FORMAT);
239     return ;
240     }
241     tabel[0] = 0 ;
242     strncat(tabel,line,5) ;/* 5 premiers caracteres */
243     index = atoi(tabel) ;
244     }
245     for (i=0;i<*nb_noeud;i++)
246     {
247     if (!fgets(line,MAX_LINE,stream))
248     {
249     *ierr = VRAI ;
250     m3d_erreur(ERR_FORMAT);
251     return ;
252     }
253    
254     /* coordonnees */
255     if (sscanf(line,"%d %f %f %f",&j,coord+3*i,coord+3*i+1,coord+3*i+2)!=4)
256     {
257     *ierr = VRAI ;
258     m3d_erreur(ERR_FORMAT);
259     return ;
260     }
261     }
262     index = 1 ;
263     while ((index != -2) && (index!=0))
264     {
265     if (!fgets(line,MAX_LINE,stream))
266     {
267     *ierr = VRAI ;
268     m3d_erreur(ERR_FORMAT);
269     return ;
270     }
271     tabel[0] = 0 ;
272     strncat(tabel,line,5) ;/* 5 premiers caracteres */
273     index = atoi(tabel) ;
274     }
275     if (index==0)
276     {
277     *ierr = VRAI ;
278     m3d_erreur(ERR_FORMAT);
279     return ;
280     }
281     for (i=0;i<*nb_ele;i++)
282     {
283     if (!fgets(line,MAX_LINE,stream))
284     {
285     *ierr = VRAI ;
286     m3d_erreur(ERR_FORMAT);
287     return ;
288     }
289     tabel[0] = 0 ;
290     strncat(tabel,line+20,5) ;/* 5 premiers caracteres */
291     numele[3*i] = corresp[atoi(tabel)] ;
292     tabel[0] = 0 ;
293     strncat(tabel,line+25,5) ;/* 5 premiers caracteres */
294     numele[3*i+1] = corresp[atoi(tabel)] ;
295     tabel[0] = 0 ;
296     strncat(tabel,line+30,5) ;/* 5 premiers caracteres */
297     numele[3*i+2] = corresp[atoi(tabel)] ;
298     }
299     }
300     /* fin de traitement des mailles lineaires */
301     else /* mailles quadratiques */
302     {
303     /* tableau des coordonnees des noeuds quadratiques,
304     le maillage se fait evidemment en lineaire puis on fait un simple
305     post-traitement */
306    
307     /* lecture des noeuds ->on remplit coord2 */
308     gest->coord2 = (float*)calloc(3*(*nb_noeud),sizeof(float)) ;
309     if (gest->coord2 == NULL)
310     {
311     *ierr = VRAI ;
312     m3d_erreur(ERR_ALLOC);
313     return ;
314     }
315     coord2 = gest->coord2 ;
316     gest->tablin = (int*)calloc((*nb_noeud)+1,sizeof(int)) ;
317     /* les noeuds sont ils des noeuds du maillage */
318     if (gest->tablin == NULL)
319     {
320     *ierr = VRAI ;
321     m3d_erreur(ERR_ALLOC);
322     return ;
323     }
324     tablin = gest->tablin ;
325     for (i=0;i<=*nb_noeud;i++) tablin[i] = VRAI ;
326     gest->neww = (int*)calloc((*nb_noeud)+1,sizeof(int)) ;
327     if (gest->neww == NULL)
328     {
329     *ierr = VRAI ;
330     m3d_erreur(ERR_ALLOC);
331     return ;
332     }
333     neww = gest->neww ;
334     gest->old = (int*)calloc((*nb_noeud)+1,sizeof(int)) ;
335     if (gest->old == NULL)
336     {
337     *ierr = VRAI ;
338     m3d_erreur(ERR_ALLOC);
339     return ;
340     }
341     old = gest->old ;
342     /* ouverture du fichier */
343     if (!(stream = fopen(temp,"r")))
344     {
345     *ierr = VRAI ;
346     m3d_erreur(ERR_OPEN);
347     return ;
348     }
349     /* lecture des 2 lignes d'entetes */
350     for (i=0;i<2;i++)
351     {
352     if (!fgets(line,MAX_LINE,stream))
353     {
354     *ierr = VRAI ;
355     m3d_erreur(ERR_FORMAT);
356     return ;
357     }
358     }
359    
360     index = 1 ;
361     while ((index != -1) && (index!=0))
362     {
363     if (!fgets(line,MAX_LINE,stream))
364     {
365     *ierr = VRAI ;
366     m3d_erreur(ERR_FORMAT);
367     return ;
368     }
369     tabel[0] = 0 ;
370     strncat(tabel,line,5) ;/* 5 premiers caracteres */
371     index = atoi(tabel) ;
372     }
373     gest->nb_noe_qua = *nb_noeud ;
374     for (i=0;i<*nb_noeud;i++)
375     {
376     if (!fgets(line,MAX_LINE,stream))
377     {
378     *ierr = VRAI ;
379     m3d_erreur(ERR_FORMAT);
380     return ;
381     }
382    
383     /* coordonnees */
384     if (sscanf(line,"%d %f %f %f",&j,coord2+3*i,coord2+3*i+1,coord2+3*i+2)!=4)
385     {
386     *ierr = VRAI ;
387     m3d_erreur(ERR_FORMAT);
388     return ;
389     }
390     }
391     /* on a rempli le tableau des noeuds quadratiques */
392     /* parcours des elements gestions des noeuds quadratiques */
393     /* reperer les numeros de noeuds quadratiques */
394     index = 1 ;
395     while ((index != -2) && (index!=0))
396     {
397     if (!fgets(line,MAX_LINE,stream))
398     {
399     *ierr = VRAI ;
400     m3d_erreur(ERR_FORMAT);
401     return ;
402     }
403     tabel[0] = 0 ;
404     strncat(tabel,line,5) ;/* 5 premiers caracteres */
405     index = atoi(tabel) ;
406     }
407     if (index==0)
408     {
409     *ierr = VRAI ;
410     m3d_erreur(ERR_FORMAT);
411     return ;
412     }
413     gest->numele2 = (int*)calloc(6 * (*nb_ele),sizeof(int)) ;
414     if (gest->numele2 == NULL)
415     {
416     *ierr = VRAI ;
417     m3d_erreur(ERR_ALLOC);
418     return ;
419     }
420     numele2 = gest->numele2 ;
421     for (i=0;i<*nb_ele;i++)
422     {
423     if (!fgets(line,MAX_LINE,stream))
424     {
425     *ierr = VRAI ;
426     m3d_erreur(ERR_FORMAT);
427     return ;
428     }
429     tabel[0] = 0 ;
430     strncat(tabel,line+20,5) ;/* 5 premiers caracteres */
431     numele[3*i] = corresp[atoi(tabel)] ;
432     numele2[6*i] = numele[3*i] ;
433     tabel[0] = 0 ;
434     strncat(tabel,line+25,5) ;/* 5 premiers caracteres */
435     numele2[6*i+1] = corresp[atoi(tabel)] ;
436     tablin[corresp[atoi(tabel)]] = FAUX ;
437     tabel[0] = 0 ;
438     strncat(tabel,line+30,5) ;/* 5 premiers caracteres */
439     numele[3*i+1] = corresp[atoi(tabel)] ;
440     numele2[6*i+2] = numele[3*i+1] ;
441     tabel[0] = 0 ;
442     strncat(tabel,line+35,5) ;/* 5 premiers caracteres */
443     numele2[6*i+3] = corresp[atoi(tabel)] ;
444     tablin[corresp[atoi(tabel)]] = FAUX ;
445     tabel[0] = 0 ;
446     strncat(tabel,line+40,5) ;/* 5 premiers caracteres */
447     numele[3*i+2] = corresp[atoi(tabel)] ;
448     numele2[6*i+4] = numele[3*i+2] ;
449     tabel[0] = 0 ;
450     strncat(tabel,line+45,5) ;/* 5 premiers caracteres */
451     numele2[6*i+5] = corresp[atoi(tabel)] ;
452     tablin[corresp[atoi(tabel)]] = FAUX ;
453     }
454     /* parcours du tableau des coordonnees coord2 */
455     *nb_noeud = 0 ;
456     for (i=1;i<=gest->nb_noe_qua;i++)/* numeros fortran */
457     {
458     if (tablin[i]==VRAI)
459     {
460     coord[x(*nb_noeud)] = coord2[x(i-1)] ;
461     coord[y(*nb_noeud)] = coord2[y(i-1)] ;
462     coord[z(*nb_noeud)] = coord2[z(i-1)] ;
463     *nb_noeud = *nb_noeud + 1 ;
464     /* correspondance */
465     neww[i] = *nb_noeud ;
466     old[*nb_noeud] = i ;
467     }
468     }
469     /* renumerotation des elements */
470     for (i=0;i<*nb_ele;i++)/* numeros fortran */
471     {
472     numele[3*i] = neww[numele[3*i]] ;
473     numele[3*i+1] = neww[numele[3*i+1]] ;
474     numele[3*i+2] = neww[numele[3*i+2]] ;
475     }
476     }
477     fclose(stream) ;
478     free(corresp) ;
479     }
480     else
481     {
482     *ierr = VRAI ;
483     m3d_erreur(ERR_FORMAT);
484     return ;
485     }
486     return ;
487     }