ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/r3d_update.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Original Path: magic/lib/diamesh/diamesh/src/r3d_update.cpp
File size: 8483 byte(s)
Log Message:

File Contents

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