ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_update2.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 10523 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

# User Rev Content
1 5
2     #include <stdio.h>
3     #include "m3d_struct.h"
4     #include "m3d_const.h"
5     #include "m3d_hotes.h"
6     #include "m3d_erreur.h"
7     #include "prototype.h"
8     extern int debug;
9     extern int nb_max_ele ;
10     extern GEST_MEM *gest ;
11     int m3d_update2(FACE *face,NOEUD *nc,FACE **tab_front,int *hist)
12     {
13     TETRAEDRE *ele ;
14     FACE *face1, *face2, *face3, *courant ;
15     NOEUD *nj1, *nj2, *nj3 , *n1, *n2, *n3 ;
16     int j1, j2, j3, num_c ;
17     int min_j ;
18     int is_face1, is_face2, is_face3, type, ierr ;
19     float *coord ;
20     int *numele ;
21    
22    
23     ierr = FAUX ;
24     coord = gest->coord ;
25     numele = gest->numele ;
26     n1 = n2 = n3 = NULL ;
27     is_face1 = FAUX ;
28     is_face2 = FAUX ;
29     is_face3 = FAUX ;
30    
31     nj1 = face->n1 ;
32     nj2 = face->n2 ;
33     nj3 = face->n3 ;
34    
35     j1 = nj1->num ;
36     j2 = nj2->num ;
37     j3 = nj3->num ;
38    
39    
40     num_c = nc->num ;
41    
42     /* si le noeud est sur le front sa cardinalite est non nulle */
43     face1 = NULL ;
44     face2 = NULL ;
45     face3 = NULL ;
46    
47     /* recherche de la face j3 j2 num_c */
48     min_j = min(j3,j2) ;
49     min_j = min(min_j,num_c) ;
50     if (min_j==j3)
51     {
52     n1 = nj3 ;
53     n2 = nj2 ;
54     n3 = nc ;
55     }
56     if (min_j==j2)
57     {
58     n1 = nj2 ;
59     n2 = nc ;
60     n3 = nj3 ;
61     }
62    
63     if (min_j==num_c)
64     {
65     n1 = nc ;
66     n2 = nj3 ;
67     n3 = nj2 ;
68     }
69     /* recherche de la face dans tab_front OPTI et ATTENTE */
70     courant = tab_front[2*OPTI] ;
71     face1 = NULL ;
72     while ((face1 == NULL) && (courant!=NULL))
73     {
74     if (((courant->n1==n1)&&(courant->n2==n2)&&(courant->n3==n3)) ||
75     ((courant->n1==n1)&&(courant->n2==n3)&&(courant->n3==n2)) )
76     {
77     face1 = courant ;
78     }
79     courant = courant->suivant ;
80     }
81     if (face1 == NULL)
82     {
83     courant = tab_front[2*ATTENTE] ;
84     while ((face1 == NULL) && (courant!=NULL))
85     {
86     if (((courant->n1==n1)&&(courant->n2==n2)&&(courant->n3==n3)) ||
87     ((courant->n1==n1)&&(courant->n2==n3)&&(courant->n3==n2)) )
88     {
89     face1 = courant ;
90     }
91     courant = courant->suivant ;
92     }
93     }
94    
95     if (face1!=NULL)
96     {
97     is_face1 = VRAI ;
98     if (tab_front[2*(face1->essai)]==NULL)
99     {
100     if (debug) printf("%s\n"," erreur liste tab_front vide M3D_UPDATE ") ;
101     return(FAUX) ;
102     }
103     }
104    
105     /* recherche de la face j1 j3 num_c */
106     min_j = min(j1,j3) ;
107     min_j = min(min_j,num_c) ;
108     if (min_j==j1)
109     {
110     n1 = nj1 ;
111     n2 = nj3 ;
112     n3 = nc ;
113     }
114     if (min_j==j3)
115     {
116     n1 = nj3 ;
117     n2 = nc ;
118     n3 = nj1 ;
119     }
120     if (min_j==num_c)
121     {
122     n1 = nc ;
123     n2 = nj1 ;
124     n3 = nj3 ;
125     }
126     /* recherche de la face dans tab_front OPTI et ATTENTE */
127     courant = tab_front[2*OPTI] ;
128     face2 = NULL ;
129     while ((face2 == NULL) && (courant!=NULL))
130     {
131     if (((courant->n1==n1)&&(courant->n2==n2)&&(courant->n3==n3)) ||
132     ((courant->n1==n1)&&(courant->n2==n3)&&(courant->n3==n2)) )
133     {
134     face2 = courant ;
135     }
136     courant = courant->suivant ;
137     }
138     if (face2 == NULL)
139     {
140     courant = tab_front[2*ATTENTE] ;
141     while ((face2 == NULL) && (courant!=NULL))
142     {
143     if (((courant->n1==n1)&&(courant->n2==n2)&&(courant->n3==n3)) ||
144     ((courant->n1==n1)&&(courant->n2==n3)&&(courant->n3==n2)) )
145     {
146     face2 = courant ;
147     }
148     courant = courant->suivant ;
149     }
150     }
151    
152     if (face2 != NULL)
153     {
154     is_face2 = VRAI ;
155     if (tab_front[2*(face2->essai)]==NULL)
156     {
157     if (debug) printf("%s\n"," erreur liste tab_front vide M3D_UPDATE ") ;
158     return(FAUX) ;
159     }
160     }
161    
162     /* recherche de la face j2 j1 num_c */
163     min_j = min(j2,j1) ;
164     min_j = min(min_j,num_c) ;
165     if (min_j==j2)
166     {
167     n1 = nj2 ;
168     n2 = nj1 ;
169     n3 = nc ;
170     }
171     if (min_j==j1)
172     {
173     n1 = nj1 ;
174     n2 = nc ;
175     n3 = nj2 ;
176     }
177     if (min_j==num_c)
178     {
179     n1 = nc ;
180     n2 = nj2 ;
181     n3 = nj1 ;
182     }
183     /* recherche de la face n1,n2,n3 */
184     /* recherche de la face dans tab_front OPTI et ATTENTE */
185     courant = tab_front[2*OPTI] ;
186     face3 = NULL ;
187     while ((face3 == NULL) && (courant!=NULL))
188     {
189     if (((courant->n1==n1)&&(courant->n2==n2)&&(courant->n3==n3)) ||
190     ((courant->n1==n1)&&(courant->n2==n3)&&(courant->n3==n2)) )
191     {
192     face3 = courant ;
193     }
194     courant = courant->suivant ;
195     }
196     if (face3 == NULL)
197     {
198     courant = tab_front[2*ATTENTE] ;
199     face3 = NULL ;
200     while ((face3 == NULL) && (courant!=NULL))
201     {
202     if (((courant->n1==n1)&&(courant->n2==n2)&&(courant->n3==n3)) ||
203     ((courant->n1==n1)&&(courant->n2==n3)&&(courant->n3==n2)) )
204     {
205     face3 = courant ;
206     }
207     courant = courant->suivant ;
208     }
209     }
210     if (face3 != NULL)
211     {
212     is_face3 = VRAI ;
213     if (tab_front[2*(face3->essai)]==NULL)
214     {
215     if (debug) printf("%s\n"," erreur liste tab_front vide M3D_UPDATE ") ;
216     return(FAUX) ;
217     }
218     }
219    
220     /*
221     ----------------------------------------------------------------------------------------------------
222     constitution des tetraedres : attention ! passage C a fortran, les noeuds sont numerotes a partir de
223     zero (indice du premier noeud dans x[], y[], z[] , pour le retour a fortran on incremente de 1 les numeros
224     des noeuds
225     ----------------------------------------------------------------------------------------------------
226     */
227     /* creation d'un element */
228     ele = m3d_c_tetra() ;
229     if (ele == NULL) return(FAUX) ;
230     /* ************************************************************************* */
231     /* mise a jour du front */
232     /* ************************************************************************* */
233    
234     /* detruire la face du front */
235    
236     type = REMOVE ;
237     m3d_front(coord,face,tab_front,type,&ierr) ;
238     if (ierr == VRAI)
239     {
240     if (debug) printf("%s\n"," Erreur m3d_front REMOVE face M3D_UPDATE ") ;
241     return(FAUX) ;
242     }
243     /* si le noeud est sur le front sa cardinalite est non nulle */
244     if (is_face1 ==VRAI)
245     {
246     type = REMOVE ;
247     m3d_front(coord,face1,tab_front,type,&ierr) ;
248     if (ierr == VRAI)
249     {
250     if (debug) printf("%s\n"," Erreur m3d_front REMOVE face M3D_UPDATE ") ;
251     return(FAUX) ;
252     }
253     }
254     if (is_face2 ==VRAI)
255     {
256     type = REMOVE ;
257     m3d_front(coord,face2,tab_front,type,&ierr) ;
258     if (ierr == VRAI)
259     {
260     if (debug) printf("%s\n"," Erreur m3d_front REMOVE face M3D_UPDATE ") ;
261     return(FAUX) ;
262     }
263     }
264     if (is_face3 ==VRAI)
265     {
266     type = REMOVE ;
267     m3d_front(coord,face3,tab_front,type,&ierr) ;
268     if (ierr == VRAI)
269     {
270     if (debug) printf("%s\n"," Erreur m3d_front REMOVE face M3D_UPDATE ") ;
271     return(FAUX) ;
272     }
273     }
274     /* on ne verifie pas que la face que l'on cree existe deja , a faire par la suite */
275     if (is_face1 == FAUX)
276     {
277     face1 = NULL ;
278     face1 = m3d_c_face(nc,nj2,nj3) ;
279     if (face1 == NULL)
280     {
281     if (debug) printf("%s\n"," erreur alloc M3D_UPDATE ") ;
282     return(FAUX) ;
283     }
284     face1->hist = *hist ;
285     if (*hist == GENERATION)
286     {
287     /* inserer la face en tete de liste des face courantes a TRAITER EN PRIORITE */
288     type = CREER_GEN ;
289    
290     }
291     else if (*hist == FACE_GENEREE)
292     {
293     type = CREER_FACE_GEN ;
294     }
295     else
296     {
297     type = CREER ;
298     }
299     m3d_front(coord,face1,tab_front,type,&ierr) ;
300     if (ierr == VRAI)
301     {
302     if (debug) printf("%s\n"," Erreur m3d_front creation face1 M3D_UPDATE ") ;
303     return(FAUX) ;
304     }
305     }
306     if (is_face2 == FAUX)
307     {
308     face2 = NULL ;
309     face2 = m3d_c_face(nc,nj3,nj1) ;
310     if (face2 == NULL) return(FAUX) ;
311     face2->hist = *hist ;
312     if (*hist == GENERATION)
313     {
314     /* inserer la face en tete de liste des face courantes a TRAITER EN PRIORITE */
315     type = CREER_GEN ;
316    
317     }
318     else if (*hist == FACE_GENEREE)
319     {
320     type = CREER_FACE_GEN ;
321     }
322     else
323     {
324     type = CREER ;
325     }
326     m3d_front(coord,face2,tab_front,type,&ierr) ;
327     if (ierr == VRAI)
328     {
329     if (debug) printf("%s\n"," Erreur m3d_front creation face2 M3D_UPDATE ") ;
330     return(FAUX) ;
331     }
332     }
333    
334     if (is_face3 == FAUX)
335     {
336     face3 = NULL ;
337     face3 = m3d_c_face(nc,nj1,nj2) ;
338     if (face3 == NULL) return(FAUX) ;
339     face3->hist = *hist ;
340     if (*hist == GENERATION)
341     {
342     /* inserer la face en tete de liste des face courantes a TRAITER EN PRIORITE */
343     type = CREER_GEN ;
344    
345     }
346     else if (*hist == FACE_GENEREE)
347     {
348     type = CREER_FACE_GEN ;
349     }
350     else
351     {
352     type = CREER ;
353     }
354     m3d_front(coord,face3,tab_front,type,&ierr) ;
355     if (ierr == VRAI)
356     {
357     if (debug) printf("%s\n"," Erreur m3d_front creation face3 M3D_UPDATE ") ;
358     return(FAUX) ;
359     }
360     }
361     /* affectation */
362     /* element cree par la face */
363    
364     /* face creatrice du tetraedre */
365     ele->face1 = face ;
366     ele->face2 = face1 ;
367     ele->face3 = face2 ;
368     ele->face4 = face3 ;
369    
370     (face->n1)->mark2 ++ ;
371     (face->n2)->mark2 ++ ;
372     (face->n3)->mark2 ++ ;
373     nc->mark2 ++ ;
374    
375     /* chainage tetra octree */
376     /*
377     if (!m3d_it_oct(ele,face->n1,face->n2,face->n3,nc))
378     {
379     if (debug) printf("%s\n"," Erreur m3d_it_oct M3D_UPDATE ") ;
380     return(FAUX) ;
381     }
382     */
383     if (!m3d_it_noe(ele))
384     {
385     if (debug) printf("%s\n"," Erreur m3d_it_noe M3D_UPDATE ") ;
386     return(FAUX) ;
387     }
388    
389     if (face->tetra1==NULL) face->tetra1 = ele ;
390     else face->tetra2 = ele ;
391    
392     if (is_face1==FAUX)
393     {
394     face1->tetra1 = ele ;
395     }
396     else
397     {
398     if ((face1->tetra1!=NULL)&&(face1->tetra2!=NULL))
399     {
400     if (debug) printf("%s\n"," Erreur face absorbee libre face1 M3D_UPDATE ") ;
401     return(FAUX) ;
402     }
403    
404     if (face1->tetra1==NULL) face1->tetra1 = ele ;
405     else face1->tetra2 = ele ;
406     }
407    
408     if (is_face2==FAUX)
409     {
410     face2->tetra1 = ele ;
411     }
412     else
413     {
414     if ((face2->tetra1!=NULL)&&(face2->tetra2!=NULL))
415     {
416     if (debug) printf("%s\n"," Erreur face absorbee libre face2 M3D_UPDATE ") ;
417     return(FAUX) ;
418     }
419    
420     if (face2->tetra1==NULL) face2->tetra1 = ele ;
421     else face2->tetra2 = ele ;
422     }
423    
424     if (is_face3==FAUX)
425     {
426     face3->tetra1 = ele ;
427     }
428     else
429     {
430     if ((face3->tetra1!=NULL)&&(face3->tetra2!=NULL))
431     {
432     if (debug) printf("%s\n"," Erreur face absorbee libre face3 M3D_UPDATE ") ;
433     return(FAUX) ;
434     }
435    
436     if (face3->tetra1==NULL) face3->tetra1 = ele ;
437     else face3->tetra2 = ele ;
438     }
439     if (NBR(tetra) >= nb_max_ele)
440     {
441     if (debug) printf("%s\n","erreur dimension M3D_UPDATE") ;
442     return(FAUX) ;
443     }
444     numele[4*(ele->num)] = j1 ;
445     numele[4*(ele->num)+1] = j2 ;
446     numele[4*(ele->num)+2] = j3 ;
447     numele[4*(ele->num)+3] = num_c ;
448     j1 = NBR(tetra)/5000 ;
449     j1 = NBR(tetra) - 5000 * j1 ;
450     if ((j1 == 0) && (debug)) printf(" nombre de tetraedres : %d \n",NBR(tetra)) ;
451     return(VRAI) ;
452     }
453