ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/o3d_update_coq.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 7070 byte(s)
Log Message:

File Contents

# Content
1 /*****************************************************************
2
3 o3d_update_coq.cpp Type:func
4
5 Mise a jour des struct apres le remaillage d une coquille
6
7 Date de creation : 11-3-1999 15 :24 :8
8 Derniere version : 11-3-1999 15 :24 :8
9
10 Vincent FRANCOIS
11
12 *****************************************************************/
13
14
15
16
17
18 /**************************/
19 /* include */
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <math.h>
24 #include "const.h"
25 #include "memoire.h"
26 #include "struct.h"
27 #include "struct3d.h"
28 #include "prototype.h"
29
30
31 /**************************/
32 /* variables globales */
33 extern struct environnment env;
34 extern struct s_mesh *mesh;
35
36
37
38 /**************************/
39 /* programme principal */
40
41 void o3d_update_coq(struct coquille *coque)
42 {
43 struct s_noeud *no,*no1,*no2,*no3,*no4;
44 struct s_tetra *tet,**l_tetra,*tmp,*tmp2,*tettmp;
45 struct s_triangle *tri1,*tri2,*tri3,*tri4;
46 float crit;
47 int i,j,k,num,cas;
48 int n1,n2,n3,n4,nummin;
49
50
51 /* remplacement des anciens tetra */
52 l_tetra=(struct s_tetra **)calloc(mesh->nb_tetra+1,sizeof(struct s_tetra *));
53 ERREUR_ALLOC(l_tetra);
54
55 for (i=0;i<coque->n;i++)
56 {
57 tet=coque->tet[i];
58 for (k=0;k<4;k++)
59 {
60 if (k==0) no=ADRESSE(tet->n1,noeud,mesh->);
61 if (k==1) no=ADRESSE(tet->n2,noeud,mesh->);
62 if (k==2) no=ADRESSE(tet->n3,noeud,mesh->);
63 if (k==3) no=ADRESSE(tet->n4,noeud,mesh->);
64 j=0;
65 while ( (j<no->nb_tetra) )
66 {
67 if (no->tetra[j]==tet)
68 {
69 if (j!=(no->nb_tetra-1))
70 {
71 memcpy(l_tetra,&(no->tetra[j+1]),(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
72 memcpy(&(no->tetra[j]),l_tetra,(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
73 }
74 no->tetra[no->nb_tetra-1]=NULL;
75 no->nb_tetra--;
76 }
77 else j++;
78 }
79 }
80 MINI(nummin,tet->n1,tet->n2);
81 MINI(nummin,nummin,tet->n3);
82 MINI(nummin,nummin,tet->n4);
83 no=ADRESSE(nummin,noeud,mesh->);
84 tettmp=no->tete_tet_petit;
85 if (tettmp==tet)
86 {
87 no->tete_tet_petit=no->tete_tet_petit->suiv;
88 if (no->tete_tet_petit==NULL) no->queue_tet_petit=NULL;
89 }
90 else
91 {
92 while (tettmp->suiv!=tet) tettmp=tettmp->suiv;
93 tettmp->suiv=tettmp->suiv->suiv;
94 if (tettmp->suiv==NULL) no->queue_tet_petit=tettmp;
95 }
96 tet->suiv=NULL;
97 cas=(int)(tet->crit*10.);
98 tmp=tet->suivant;
99 tmp2=tet->precedent;
100 if (tet->precedent!=NULL) tet->precedent->suivant=tmp;
101 else mesh->tete_tetra[cas]=tmp;
102 if (tet->suivant!=NULL) tet->suivant->precedent=tmp2;
103 else mesh->queue_tetra[cas]=tmp2;
104 tet->precedent=NULL;
105 tet->suivant=NULL;
106 tet->n1=(-1);
107 tet->n2=(-1);
108 tet->n3=(-1);
109 tet->n4=(-1);
110 tet->crit=0.;
111 tet->opt=0;
112 if (tet->triangle[0]->type==FACE) {tet->triangle[0]->tetra[0]=NULL;tet->triangle[0]->tetra[1]=NULL;}
113 else if (tet->triangle[0]->tetra[0]==tet) {tet->triangle[0]->tetra[0]=tet->triangle[0]->tetra[1];tet->triangle[0]->tetra[1]=NULL;}
114 if (tet->triangle[1]->type==FACE) {tet->triangle[1]->tetra[0]=NULL;tet->triangle[1]->tetra[1]=NULL;}
115 else if (tet->triangle[1]->tetra[0]==tet) {tet->triangle[1]->tetra[0]=tet->triangle[1]->tetra[1];tet->triangle[1]->tetra[1]=NULL;}
116 if (tet->triangle[2]->type==FACE) {tet->triangle[2]->tetra[0]=NULL;tet->triangle[2]->tetra[1]=NULL;}
117 else if (tet->triangle[2]->tetra[0]==tet) {tet->triangle[2]->tetra[0]=tet->triangle[2]->tetra[1];tet->triangle[2]->tetra[1]=NULL;}
118 if (tet->triangle[3]->type==FACE) {tet->triangle[3]->tetra[0]=NULL;tet->triangle[3]->tetra[1]=NULL;}
119 else if (tet->triangle[3]->tetra[0]==tet) {tet->triangle[3]->tetra[0]=tet->triangle[3]->tetra[1];tet->triangle[3]->tetra[1]=NULL;}
120 tet->triangle[0]=NULL;
121 tet->triangle[1]=NULL;
122 tet->triangle[2]=NULL;
123 tet->triangle[3]=NULL;
124 }
125
126 for (i=0;i<2*coque->n-4;i++)
127 {
128 if (i<coque->n)
129 tet=coque->tet[i];
130 else
131 {
132 NEW_ENTITE(tet,tetra,mesh->);
133 tet->num=mesh->nb_tetra-1;
134 }
135 n1=coque->new_tetra[4*i];
136 n2=coque->new_tetra[4*i+1];
137 n3=coque->new_tetra[4*i+2];
138 n4=coque->new_tetra[4*i+3];
139 crit=m3d_cal_qual(n1,n2,n3,n4);
140 if (crit==0.)
141 {
142 n3=coque->new_tetra[4*i+3];
143 n4=coque->new_tetra[4*i+2];
144 }
145 m3d_i_triangle(&tri1,n1,n3,n2,TOTAL);
146 m3d_i_triangle(&tri2,n1,n2,n4,TOTAL);
147 m3d_i_triangle(&tri3,n2,n3,n4,TOTAL);
148 m3d_i_triangle(&tri4,n1,n4,n3,TOTAL);
149 tri1->front=2;
150 tri2->front=2;
151 tri3->front=2;
152 tri4->front=2;
153 if (tri1->tetra[0]==NULL) tri1->tetra[0]=tet; else tri1->tetra[1]=tet;
154 if (tri2->tetra[0]==NULL) tri2->tetra[0]=tet; else tri2->tetra[1]=tet;
155 if (tri3->tetra[0]==NULL) tri3->tetra[0]=tet; else tri3->tetra[1]=tet;
156 if (tri4->tetra[0]==NULL) tri4->tetra[0]=tet; else tri4->tetra[1]=tet;
157 tet->n1=n1;
158 tet->n2=n2;
159 tet->n3=n3;
160 tet->n4=n4;
161 tet->type=BODY;
162 tet->num_ent=0;
163 tet->crit=m3d_cal_qual(tet->n1,tet->n2,tet->n3,tet->n4);
164 tet->triangle[0]=tri1;
165 tet->triangle[1]=tri2;
166 tet->triangle[2]=tri3;
167 tet->triangle[3]=tri4;
168 tet->etat=ACTIF;
169 strcpy(tet->front,"Optimi");
170 no1=ADRESSE(tet->n1,noeud,mesh->);
171 no2=ADRESSE(tet->n2,noeud,mesh->);
172 no3=ADRESSE(tet->n3,noeud,mesh->);
173 no4=ADRESSE(tet->n4,noeud,mesh->);
174 NEW_POINTEUR(num,tetra,no1->);
175 no1->tetra[num]=tet;
176 NEW_POINTEUR(num,tetra,no2->);
177 no2->tetra[num]=tet;
178 NEW_POINTEUR(num,tetra,no3->);
179 no3->tetra[num]=tet;
180 NEW_POINTEUR(num,tetra,no4->);
181 no4->tetra[num]=tet;
182 MINI(nummin,tet->n1,tet->n2);
183 MINI(nummin,nummin,tet->n3);
184 MINI(nummin,nummin,tet->n4);
185 no=ADRESSE(nummin,noeud,mesh->);
186 if (no->tete_tet_petit==NULL)
187 {
188 no->tete_tet_petit=tet;
189 no->queue_tet_petit=tet;
190 }
191 else
192 {
193 no->queue_tet_petit->suiv=tet;
194 no->queue_tet_petit=tet;
195 }
196 m3d_ord_tet(tet);
197 }
198 free(l_tetra);
199 }