ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_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/m3d_update.cpp
File size: 8677 byte(s)
Log Message:

File Contents

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