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

File Contents

# User Rev Content
1 5 #include <stdio.h>
2     #include <stdlib.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     #define NB_TRAITE 1000
9     #define NB_ITER 2
10     extern GEST_MEM *gest ;
11     extern int debug ;
12     extern float crit_min ;
13     extern int lissage ;
14     /* routine de tete du mailleur */
15     int m3d_best(void)
16     {
17     int i, *numele, nb, nb_tetra, j ;
18     TETRAEDRE *tetra, *tab_del[10000],*tab_tetra[NB_TRAITE] ;
19     NOEUD *m3d_c_noe() ;
20     FACE *tab_coq[100] ;
21     FACE *tab_front[20] ;
22     float crit;
23     int tabele[3000] ;
24     int *neww ;
25     int tab_connec[400] ;
26     int old[100] ;
27     float vcoord[300] ;
28     int nb_node, nb_face ;
29     int ierr = 0 ;
30     int nb_cree ;
31     int nb_noeud = 0 ;
32     int level, gtrouve,nb_essai,k ;
33     float *coord ;
34     NOEUD *noe_g ;
35     OCT *oct ;
36     /* table de 100 faces */
37    
38     if (!lissage) return(VRAI) ;
39     /* sortie de maillage */
40     /* examen de la qualite des tetras */
41     coord = gest->coord ;
42     numele = gest->numele ;
43    
44     /* ************************************************************ */
45     /* BOUGE DE POINTS */
46     /* ************************************************************ */
47    
48     for (j=0;j<NB_ITER;j++)
49     {
50     for (i=gest->nb_init;i<gest->nb_noeud;i++)
51     {
52     if (!m3d_move(i))
53     {
54     return(FAUX) ;
55     }
56     }
57     }
58    
59     /* TETRAEDRES A DETRUIRE */
60     nb = 0 ;
61     for (i=0;i<gest->nb_tetra;i++)
62     {
63     /* adresse du tetra */
64     ADRESSE(tetra,i,tetra)
65     if (tetra->mark!=KILLED)
66     {
67     /* calcul du critere */
68     crit = m3d_e_qual(gest->coord,numele[4*i],numele[4*i+1],numele[4*i+2],numele[4*i+3]) ;
69     if (crit<crit_min)
70     {
71     tab_del[nb] = tetra ;
72     nb++ ;
73     if (nb>9999) return(FAUX) ;
74     }
75     }
76     }
77    
78     /* determination de la coquille */
79     neww = (int*)calloc(2*gest->nb_noeud,sizeof(int)) ;
80     ERREUR_ALLOC_FAUX(neww)
81     for (i=0;i<nb;i++)
82     {
83     /* autour du tetra */
84     tetra = tab_del[i] ;
85     if (tetra->mark != KILLED)
86     {
87     level = 1 ;
88     gtrouve = FAUX ;
89     while ((gtrouve == FAUX) && (level<7))
90     {
91     nb_node = 0 ;
92     nb_face = 0 ;
93     nb_tetra = 0 ;
94     for (j=0;j<100;j++) old[j] = -1 ;
95     ierr = FAUX ;
96     /* ************************************************************ */
97     /* REMAILLAGE AUTOUR D'UNE ARETE */
98     /* ************************************************************ */
99    
100     if (!m3d_arete(tetra,level,&nb_node,&nb_face,vcoord,tabele,neww,old,tab_tetra,&nb_tetra,tab_coq))
101     {
102     return(FAUX) ;
103     }
104     if (nb_node != 0)
105     {
106     nb_cree = 0 ;
107     r3dtet(vcoord,nb_node,&nb_noeud,tabele,nb_face,tab_connec,&nb_cree,&ierr) ;
108     r3d_lib() ;
109     if (ierr == FAUX) gtrouve = VRAI ;/* remaillage possible */
110     else ierr = FAUX ;
111     }
112     level++ ;
113     }
114    
115     level = 0 ;
116     while ((gtrouve == FAUX) && (level<4))
117     {
118     nb_node = 0 ;
119     nb_face = 0 ;
120     nb_tetra = 0 ;
121     for (j=0;j<100;j++) old[j] = -1 ;
122     ierr = FAUX ;
123     /* ************************************************************ */
124     /* SUPRESSION D'UNE FACE */
125     /* ************************************************************ */
126    
127     if (!m3d_coq(tetra,level,&nb_node,&nb_face,vcoord,tabele,neww,old,tab_tetra,&nb_tetra,tab_coq))
128     {
129     return(FAUX) ;
130     }
131     if (nb_node != 0)
132     {
133     nb_cree = 0 ;
134     r3dtet(vcoord,nb_node,&nb_noeud,tabele,nb_face,tab_connec,&nb_cree,&ierr) ;
135     r3d_lib() ;
136     if (ierr == FAUX) gtrouve = VRAI ;/* remaillage possible */
137     else ierr = FAUX ;
138     }
139     level++ ;
140     }
141    
142     if (gtrouve == FAUX)
143     /* ************************************************************ */
144     /* INSERTION DE POINTS */
145     /* ************************************************************ */
146     {
147     nb_node = 0 ;
148     nb_face = 0 ;
149     nb_tetra = 0 ;
150     for (j=0;j<100;j++) old[j] = -1 ;
151     if (!m3d_break(tetra,&nb_node,&nb_face,vcoord,tabele,neww,old,tab_tetra,&nb_tetra,tab_coq,tab_connec))
152     {
153     return(FAUX) ;
154     }
155     if (nb_node != 0)
156     {
157     gtrouve = VRAI ;
158     nb_cree = nb_face ;
159     nb_noeud = nb_node + 1 ;
160     }
161     }
162    
163     if (gtrouve == VRAI) /* on a remaille la coquille */
164     {
165     /* retour a la numerotation initiale */
166     for (j=0;j<nb_cree;j++)
167     {
168     for (k=0;k<4;k++)
169     {
170     /* le noeud est un noeud deja existant */
171     if (tab_connec[4*j+k]<nb_node) tab_connec[4*j+k] = old[(tab_connec[4*j+k])] ;
172     else /* un npeud a ete cree */
173     {
174     if (old[(tab_connec[4*j+k])] == -1) /* creation du noeud */
175     {
176     noe_g = m3d_c_noe() ;
177     if (noe_g == NULL) return(FAUX) ;
178     coord[x(noe_g->num)] = vcoord[x(tab_connec[4*j+k])] ;
179     coord[y(noe_g->num)] = vcoord[y(tab_connec[4*j+k])] ;
180     coord[z(noe_g->num)] = vcoord[z(tab_connec[4*j+k])] ;
181     old[(tab_connec[4*j+k])] = noe_g->num ;
182     }
183     tab_connec[4*j+k] = old[(tab_connec[4*j+k])] ;
184     }
185     }
186     }
187     /* destruction des tetraedres */
188     nb_essai = 10 ;
189     for (j=0;j<nb_essai;j++)
190     {
191     tab_front[2*j] = NULL ;
192     tab_front[2*j+1] = NULL ;
193     }
194     for (j=0;j<nb_tetra;j++)
195     {
196     if (tab_tetra[j]->mark != KILLED)
197     if (!m3d_d_tetra(tab_tetra[j],tab_front)) return(FAUX) ;
198     }
199     /* reconstruction du maillage */
200     if (!m3d_recons(tab_front,tab_connec,nb_cree))
201     {
202     return(FAUX) ;
203     }
204     }
205     }
206     }
207     crit_min = 0.1 ;
208     free(neww) ;
209     return(VRAI) ;
210     }
211