1 |
francois |
883 |
//------------------------------------------------------------ |
2 |
|
|
//------------------------------------------------------------ |
3 |
|
|
// MAGiC |
4 |
|
|
// Jean Christophe Cuilli�re et Vincent FRANCOIS |
5 |
|
|
// D�partement de G�nie M�canique - UQTR |
6 |
|
|
//------------------------------------------------------------ |
7 |
|
|
// Le projet MAGIC est un projet de recherche du d�partement |
8 |
|
|
// de g�nie m�canique de l'Universit� du Qu�bec � |
9 |
|
|
// Trois Rivi�res |
10 |
|
|
// Les librairies ne peuvent �tre utilis�es sans l'accord |
11 |
|
|
// des auteurs (contact : francois@uqtr.ca) |
12 |
|
|
//------------------------------------------------------------ |
13 |
|
|
//------------------------------------------------------------ |
14 |
|
|
// |
15 |
|
|
// mailleur.cpp |
16 |
|
|
// |
17 |
|
|
//------------------------------------------------------------ |
18 |
|
|
//------------------------------------------------------------ |
19 |
|
|
// COPYRIGHT 2000 |
20 |
|
|
// Version du 02/03/2006 � 11H23 |
21 |
|
|
//------------------------------------------------------------ |
22 |
|
|
//------------------------------------------------------------ |
23 |
|
|
|
24 |
|
|
|
25 |
|
|
#include "gestionversion.h" |
26 |
|
|
#include "mailleur_fem.h" |
27 |
|
|
#include "mg_gestionnaire.h" |
28 |
|
|
#include "fem_segment2.h" |
29 |
|
|
#include "fem_mini_segment2.h" |
30 |
|
|
#include "fem_segment3.h" |
31 |
|
|
#include "fem_triangle3.h" |
32 |
|
|
#include "fem_triangle6.h" |
33 |
|
|
#include "fem_quadrangle4.h" |
34 |
|
|
#include "fem_quadrangle8.h" |
35 |
|
|
#include "fem_tetra4.h" |
36 |
|
|
#include "fem_tetra10.h" |
37 |
|
|
#include "fem_hexa8.h" |
38 |
|
|
#include "fem_hexa20.h" |
39 |
|
|
#include "fem_penta6.h" |
40 |
|
|
#include "fem_penta15.h" |
41 |
|
|
#include "fem_graph_noeud.h" |
42 |
|
|
#include "fem_maillage_quadratique_outils.h" |
43 |
|
|
#include "ot_decalage_parametre.h" |
44 |
|
|
|
45 |
|
|
|
46 |
|
|
|
47 |
|
|
MAILLEUR_FEM::MAILLEUR_FEM(OT_CPU* comp):MAILLEUR(false,comp) |
48 |
|
|
{ |
49 |
|
|
|
50 |
|
|
} |
51 |
|
|
|
52 |
|
|
MAILLEUR_FEM::MAILLEUR_FEM(MAILLEUR_FEM &mdd):MAILLEUR(mdd) |
53 |
|
|
{ |
54 |
|
|
ini_param(); |
55 |
|
|
} |
56 |
|
|
|
57 |
|
|
|
58 |
|
|
MAILLEUR_FEM::~MAILLEUR_FEM() |
59 |
|
|
{ |
60 |
|
|
} |
61 |
|
|
|
62 |
|
|
|
63 |
|
|
void MAILLEUR_FEM::maille(FEM_MAILLAGE* fem,int num) |
64 |
|
|
{ |
65 |
|
|
int degre=fem->get_degre(); |
66 |
|
|
MG_MAILLAGE* maillage=fem->get_mg_maillage(); |
67 |
|
|
MG_GEOMETRIE* mg_geometrie=maillage->get_mg_geometrie(); |
68 |
|
|
TPL_MAP_ENTITE<MG_SEGMENT*> mini; |
69 |
|
|
if (mg_geometrie!=NULL) |
70 |
|
|
if (mg_geometrie->get_nb_mg_poutre()!=0) |
71 |
|
|
if (mg_geometrie->get_nb_mg_volume()!=0) |
72 |
|
|
recherche_connexion_multidimension(mini,maillage,mg_geometrie); |
73 |
|
|
if (degre==1) construire_lineaire(fem,mini,maillage,mg_geometrie); |
74 |
|
|
if (degre==2) construire_quadratique(fem,mini,maillage,mg_geometrie); |
75 |
|
|
if (num>0) optimise_numerotation(fem); |
76 |
|
|
if (num>1) copie_numerotation_opt(fem); |
77 |
|
|
BOITE_3D b; |
78 |
|
|
int nx,ny,nz; |
79 |
|
|
bool structure=maillage->get_param_structure(b,nx,ny,nz); |
80 |
|
|
if (structure==true) |
81 |
|
|
fem->change_param_structure(b,nx,ny,nz); |
82 |
|
|
} |
83 |
|
|
|
84 |
|
|
|
85 |
|
|
void MAILLEUR_FEM::recherche_connexion_multidimension(TPL_MAP_ENTITE<MG_SEGMENT*> &mini,MG_MAILLAGE* maillage,MG_GEOMETRIE* mg_geometrie) |
86 |
|
|
{ |
87 |
|
|
LISTE_MG_NOEUD::iterator it; |
88 |
|
|
for (MG_NOEUD* no=maillage->get_premier_noeud(it);no!=NULL;no=maillage->get_suivant_noeud(it)) |
89 |
|
|
{ |
90 |
|
|
if ((no->get_lien_hexa()->get_nb()>0) || (no->get_lien_tetra()->get_nb())) |
91 |
|
|
if (no->get_lien_segment()->get_nb()>0) |
92 |
|
|
{ |
93 |
|
|
bool estjoint=false; |
94 |
|
|
for (int i=0;i<no->get_lien_segment()->get_nb();i++) |
95 |
|
|
{ |
96 |
|
|
LISTE_MG_POUTRE::iterator itp; |
97 |
|
|
for (MG_POUTRE* pou=mg_geometrie->get_premier_poutre(itp);pou!=NULL;pou=mg_geometrie->get_suivant_poutre(itp)) |
98 |
|
|
if (pou->contient_element(no->get_lien_segment()->get(i))) {estjoint=true;} |
99 |
|
|
} |
100 |
|
|
if (estjoint) |
101 |
|
|
{ |
102 |
|
|
for (int i=0;i<no->get_lien_segment()->get_nb();i++) |
103 |
|
|
{ |
104 |
|
|
bool bord=false; |
105 |
|
|
LISTE_MG_POUTRE::iterator itp; |
106 |
|
|
int nbele2=no->get_lien_segment()->get(i)->get_lien_triangle()->get_nb(); |
107 |
|
|
for (int j=0;j<nbele2;j++) |
108 |
|
|
if (no->get_lien_segment()->get(i)->get_lien_triangle()->get(j)->get_lien_tetra()->get_nb()>0) |
109 |
|
|
if (no->get_lien_segment()->get(i)->get_lien_triangle()->get(j)->get_lien_tetra()->get_nb()<2) bord=true; |
110 |
|
|
nbele2=no->get_lien_segment()->get(i)->get_lien_quadrangle()->get_nb(); |
111 |
|
|
for (int j=0;j<nbele2;j++) |
112 |
|
|
if (no->get_lien_segment()->get(i)->get_lien_quadrangle()->get(j)->get_lien_hexa()->get_nb()>0) |
113 |
|
|
if (no->get_lien_segment()->get(i)->get_lien_quadrangle()->get(j)->get_lien_hexa()->get_nb()<2) bord=true; |
114 |
|
|
if (bord==true) mini.ajouter(no->get_lien_segment()->get(i)); |
115 |
|
|
} |
116 |
|
|
//std::cout << no->get_id() << " est un joint 1D-3D : " << mini.get_nb() << " mini " << std::endl; |
117 |
|
|
|
118 |
|
|
} |
119 |
|
|
} |
120 |
|
|
|
121 |
|
|
} |
122 |
|
|
LISTE_MG_TRIANGLE::iterator itt; |
123 |
|
|
for (MG_TRIANGLE* tri=maillage->get_premier_triangle(itt);tri!=NULL;tri=maillage->get_suivant_triangle(itt)) |
124 |
|
|
if (tri->get_origine()==MAGIC::ORIGINE::SECTION) |
125 |
|
|
{ |
126 |
|
|
mini.ajouter(tri->get_segment1()); |
127 |
|
|
mini.ajouter(tri->get_segment2()); |
128 |
|
|
mini.ajouter(tri->get_segment3()); |
129 |
|
|
} |
130 |
|
|
|
131 |
|
|
LISTE_MG_QUADRANGLE::iterator itq; |
132 |
|
|
for (MG_QUADRANGLE* qua=maillage->get_premier_quadrangle(itq);qua!=NULL;qua=maillage->get_suivant_quadrangle(itq)) |
133 |
|
|
if (qua->get_origine()==MAGIC::ORIGINE::SECTION) |
134 |
|
|
{ |
135 |
|
|
mini.ajouter(qua->get_segment1()); |
136 |
|
|
mini.ajouter(qua->get_segment2()); |
137 |
|
|
mini.ajouter(qua->get_segment3()); |
138 |
|
|
mini.ajouter(qua->get_segment4()); |
139 |
|
|
} |
140 |
|
|
|
141 |
|
|
|
142 |
|
|
} |
143 |
|
|
|
144 |
|
|
|
145 |
|
|
|
146 |
|
|
|
147 |
|
|
void MAILLEUR_FEM::construire_lineaire(FEM_MAILLAGE* fem,TPL_MAP_ENTITE<MG_SEGMENT*> &mini,MG_MAILLAGE* maillage,MG_GEOMETRIE* mg_geometrie) |
148 |
|
|
{ |
149 |
|
|
LISTE_MG_NOEUD::iterator it_noeud; |
150 |
|
|
MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_noeud); |
151 |
|
|
std::vector<FEM_NOEUD*> lstnoeuddirect; |
152 |
|
|
unsigned int i=0; |
153 |
|
|
while (mgnoeud) |
154 |
|
|
{ |
155 |
|
|
mgnoeud->change_nouveau_numero(i); |
156 |
|
|
FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud); |
157 |
|
|
femnoeud->change_numero(i+1); |
158 |
|
|
i++; |
159 |
|
|
fem->ajouter_fem_noeud(femnoeud); |
160 |
|
|
lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud); |
161 |
|
|
if (mgnoeud->get_lien_topologie()!=NULL) |
162 |
|
|
if (mgnoeud->get_lien_topologie()->get_dimension()==0) |
163 |
|
|
{ |
164 |
|
|
FEM_ELEMENT0* femele=new FEM_ELEMENT0(mgnoeud->get_lien_topologie(),mgnoeud,&femnoeud); |
165 |
|
|
fem-> ajouter_fem_element0(femele); |
166 |
|
|
} |
167 |
|
|
mgnoeud=maillage->get_suivant_noeud(it_noeud); |
168 |
|
|
|
169 |
|
|
} |
170 |
|
|
int dimsansgeo=0; |
171 |
|
|
if (mg_geometrie==NULL) |
172 |
|
|
{ |
173 |
|
|
if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3; |
174 |
|
|
else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2; |
175 |
|
|
else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1; |
176 |
|
|
} |
177 |
|
|
if (mg_geometrie!=NULL) |
178 |
|
|
if (strcmp(mg_geometrie->get_type_geometrie(),"VIRTUEL")==0) |
179 |
|
|
{ |
180 |
|
|
if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3; |
181 |
|
|
else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2; |
182 |
|
|
else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1; |
183 |
|
|
} |
184 |
|
|
|
185 |
|
|
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1))) |
186 |
|
|
{ |
187 |
|
|
LISTE_MG_SEGMENT::iterator it_seg; |
188 |
|
|
MG_SEGMENT * mgseg = maillage->get_premier_segment(it_seg); |
189 |
|
|
while (mgseg) |
190 |
|
|
{ |
191 |
|
|
if (mgseg->get_lien_topologie()!=NULL) |
192 |
|
|
if (mgseg->get_lien_topologie()->get_dimension()!=1) |
193 |
|
|
{ |
194 |
|
|
mgseg=maillage->get_suivant_segment(it_seg); |
195 |
|
|
continue; |
196 |
|
|
} |
197 |
|
|
if (mg_geometrie!=NULL) |
198 |
|
|
if (mgseg->get_lien_topologie()==NULL) |
199 |
|
|
if (dimsansgeo!=1) |
200 |
|
|
{ |
201 |
|
|
mgseg=maillage->get_suivant_segment(it_seg); |
202 |
|
|
continue; |
203 |
|
|
} |
204 |
|
|
FEM_NOEUD *tabnoeud[2]; |
205 |
|
|
tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()]; |
206 |
|
|
tabnoeud[1]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()]; |
207 |
|
|
FEM_SEGMENT2* seg=new FEM_SEGMENT2(mgseg,tabnoeud); |
208 |
|
|
fem->ajouter_fem_element1(seg); |
209 |
|
|
mgseg=maillage->get_suivant_segment(it_seg); |
210 |
|
|
} |
211 |
|
|
TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itm; |
212 |
|
|
for (MG_SEGMENT* mgseg=mini.get_premier(itm);mgseg!=NULL;mgseg=mini.get_suivant(itm)) |
213 |
|
|
{ |
214 |
|
|
FEM_NOEUD *tabnoeud[2]; |
215 |
|
|
tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()]; |
216 |
|
|
tabnoeud[1]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()]; |
217 |
|
|
FEM_SEGMENT2* seg=new FEM_MINI_SEGMENT2(mgseg,tabnoeud); |
218 |
|
|
fem->ajouter_fem_element1(seg); |
219 |
|
|
} |
220 |
|
|
} |
221 |
|
|
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2))) |
222 |
|
|
{ |
223 |
|
|
LISTE_MG_TRIANGLE::iterator it_tri; |
224 |
|
|
MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri); |
225 |
|
|
while (mgtri) |
226 |
|
|
{ |
227 |
|
|
if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) |
228 |
|
|
{ |
229 |
|
|
mgtri=maillage->get_suivant_triangle(it_tri); |
230 |
|
|
continue; |
231 |
|
|
} |
232 |
|
|
if (mg_geometrie!=NULL) |
233 |
|
|
if (mgtri->get_lien_topologie()==NULL) |
234 |
|
|
if (dimsansgeo!=2) |
235 |
|
|
{ |
236 |
|
|
mgtri=maillage->get_suivant_triangle(it_tri); |
237 |
|
|
continue; |
238 |
|
|
} |
239 |
|
|
FEM_NOEUD *tabnoeud[3]; |
240 |
|
|
tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()]; |
241 |
|
|
tabnoeud[1]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()]; |
242 |
|
|
tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()]; |
243 |
|
|
FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(mgtri,tabnoeud); |
244 |
|
|
fem->ajouter_fem_element2(tri); |
245 |
|
|
mgtri=maillage->get_suivant_triangle(it_tri); |
246 |
|
|
} |
247 |
|
|
LISTE_MG_QUADRANGLE::iterator it_quad; |
248 |
|
|
MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad); |
249 |
|
|
while (mgquad) |
250 |
|
|
{ |
251 |
|
|
if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) { |
252 |
|
|
mgquad=maillage->get_suivant_quadrangle(it_quad); |
253 |
|
|
continue; |
254 |
|
|
} |
255 |
|
|
if (mg_geometrie!=NULL) |
256 |
|
|
if (mgquad->get_lien_topologie()==NULL) |
257 |
|
|
if (dimsansgeo!=2) |
258 |
|
|
{ |
259 |
|
|
mgquad=maillage->get_suivant_quadrangle(it_quad); |
260 |
|
|
continue; |
261 |
|
|
} |
262 |
|
|
FEM_NOEUD *tabnoeud[4]; |
263 |
|
|
tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()]; |
264 |
|
|
tabnoeud[1]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()]; |
265 |
|
|
tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()]; |
266 |
|
|
tabnoeud[3]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()]; |
267 |
|
|
FEM_QUADRANGLE4* quad=new FEM_QUADRANGLE4(mgquad,tabnoeud); |
268 |
|
|
fem->ajouter_fem_element2(quad); |
269 |
|
|
mgquad=maillage->get_suivant_quadrangle(it_quad); |
270 |
|
|
} |
271 |
|
|
} |
272 |
|
|
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3))) |
273 |
|
|
{ |
274 |
|
|
LISTE_MG_TETRA::iterator it_tetra; |
275 |
|
|
MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra); |
276 |
|
|
while (mgtetra) |
277 |
|
|
{ |
278 |
|
|
FEM_NOEUD *tabnoeud[4]; |
279 |
|
|
tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()]; |
280 |
|
|
tabnoeud[1]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()]; |
281 |
|
|
tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()]; |
282 |
|
|
tabnoeud[3]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()]; |
283 |
|
|
FEM_TETRA4* tet=new FEM_TETRA4(mgtetra,tabnoeud); |
284 |
|
|
fem->ajouter_fem_element3(tet); |
285 |
|
|
mgtetra=maillage->get_suivant_tetra(it_tetra); |
286 |
|
|
} |
287 |
|
|
LISTE_MG_HEXA::iterator it_hex; |
288 |
|
|
MG_HEXA* mghex=maillage->get_premier_hexa(it_hex); |
289 |
|
|
while (mghex) |
290 |
|
|
{ |
291 |
|
|
FEM_NOEUD *tabnoeud[8]; |
292 |
|
|
tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()]; |
293 |
|
|
tabnoeud[1]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()]; |
294 |
|
|
tabnoeud[2]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()]; |
295 |
|
|
tabnoeud[3]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()]; |
296 |
|
|
tabnoeud[4]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()]; |
297 |
|
|
tabnoeud[5]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()]; |
298 |
|
|
tabnoeud[6]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()]; |
299 |
|
|
tabnoeud[7]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()]; |
300 |
|
|
FEM_HEXA8* hex=new FEM_HEXA8(mghex,tabnoeud); |
301 |
|
|
fem->ajouter_fem_element3(hex); |
302 |
|
|
mghex=maillage->get_suivant_hexa(it_hex); |
303 |
|
|
} |
304 |
|
|
LISTE_MG_PENTA::iterator it_pen; |
305 |
|
|
MG_PENTA* mgpen=maillage->get_premier_penta(it_pen); |
306 |
|
|
while (mgpen) |
307 |
|
|
{ |
308 |
|
|
FEM_NOEUD *tabnoeud[8]; |
309 |
|
|
tabnoeud[0]=lstnoeuddirect[mgpen->get_noeud1()->get_nouveau_numero()]; |
310 |
|
|
tabnoeud[1]=lstnoeuddirect[mgpen->get_noeud2()->get_nouveau_numero()]; |
311 |
|
|
tabnoeud[2]=lstnoeuddirect[mgpen->get_noeud3()->get_nouveau_numero()]; |
312 |
|
|
tabnoeud[3]=lstnoeuddirect[mgpen->get_noeud4()->get_nouveau_numero()]; |
313 |
|
|
tabnoeud[4]=lstnoeuddirect[mgpen->get_noeud5()->get_nouveau_numero()]; |
314 |
|
|
tabnoeud[5]=lstnoeuddirect[mgpen->get_noeud6()->get_nouveau_numero()]; |
315 |
|
|
FEM_PENTA6* pen=new FEM_PENTA6(mgpen,tabnoeud); |
316 |
|
|
fem->ajouter_fem_element3(pen); |
317 |
|
|
mgpen=maillage->get_suivant_penta(it_pen); |
318 |
|
|
} |
319 |
|
|
} |
320 |
|
|
} |
321 |
|
|
|
322 |
|
|
|
323 |
francois |
915 |
void MAILLEUR_FEM::recal_element_quadratique(FEM_MAILLAGE* fem) |
324 |
|
|
{ |
325 |
|
|
int nbpas=(int)param.get_valeur("Quadratisation_pas"); |
326 |
|
|
double dismin=param.get_valeur("Quadratisation_dis"); |
327 |
|
|
int nbpassemax=(int)param.get_valeur("Quadratisation_nbpassemax"); |
328 |
|
|
int nbpasse=1; |
329 |
|
|
for (int passe=0;passe<nbpasse;passe++) |
330 |
|
|
{ |
331 |
|
|
LISTE_FEM_ELEMENT3::iterator itele3; |
332 |
|
|
bool recale=false; |
333 |
|
|
for (FEM_ELEMENT3* tet=fem->get_premier_element3(itele3);tet;tet=fem->get_suivant_element3(itele3)) |
334 |
|
|
{ |
335 |
|
|
FEM_MAILLAGE_QUADRATIQUE_OUTILS ou; |
336 |
|
|
double dis=ou.get_distorsion2(tet); |
337 |
|
|
double jmin; |
338 |
|
|
if (dis<dismin-1e-12) |
339 |
|
|
{ |
340 |
|
|
OT_VECTEUR_3D vec[10]; |
341 |
|
|
OT_VECTEUR_3D depart[10]; |
342 |
|
|
for (int i=0;i<9;i++) |
343 |
|
|
{ |
344 |
|
|
if ((i==0) || (i==2) || (i==4)) continue; |
345 |
|
|
double* xyzori=tet->get_fem_noeud(i)->get_coord_ori(); |
346 |
|
|
double* xyz=tet->get_fem_noeud(i)->get_coord(); |
347 |
|
|
vec[i].change_x(xyz[0]-xyzori[0]); |
348 |
|
|
vec[i].change_y(xyz[1]-xyzori[1]); |
349 |
|
|
vec[i].change_z(xyz[2]-xyzori[2]); |
350 |
|
|
depart[i].change_x(xyz[0]); |
351 |
|
|
depart[i].change_y(xyz[1]); |
352 |
|
|
depart[i].change_z(xyz[2]); |
353 |
|
|
} |
354 |
|
|
int pas=0; |
355 |
|
|
while (dis<dismin-1e-12) |
356 |
|
|
{ |
357 |
|
|
for (int i=0;i<9;i++) |
358 |
|
|
{ |
359 |
|
|
if ((i==0) || (i==2) || (i==4)) continue; |
360 |
|
|
double* xyz=tet->get_fem_noeud(i)->get_coord(); |
361 |
|
|
tet->get_fem_noeud(i)->change_x(depart[i].get_x()-pas*1./1./nbpas*vec[i].get_x()); |
362 |
|
|
tet->get_fem_noeud(i)->change_y(depart[i].get_y()-pas*1./1./nbpas*vec[i].get_y()); |
363 |
|
|
tet->get_fem_noeud(i)->change_z(depart[i].get_z()-pas*1./1./nbpas*vec[i].get_z()); |
364 |
|
|
} |
365 |
|
|
dis=ou.get_distorsion2(tet); |
366 |
|
|
jmin=ou.get_jmin(tet); |
367 |
|
|
pas++; |
368 |
|
|
} |
369 |
|
|
char mess[255]; |
370 |
|
|
if (passe==0) sprintf(mess," Passe %d : Tetra %lu replacé à %.2lf%% de sa position optimale\t jmin=%le distorsion=%le",passe+1,tet->get_id(),(pas-1.)*1./nbpas*100.,jmin,dis); |
371 |
|
|
else sprintf(mess," Passe %d : Tetra %lu replacé à %.2lf%% de sa position precedente\t jmin=%le distorsion=%le",passe+1,tet->get_id(),(pas-1.)*1./nbpas*100.,jmin,dis); |
372 |
|
|
affiche(mess); |
373 |
|
|
recale=true; |
374 |
|
|
} |
375 |
|
|
} |
376 |
|
|
nbpasse++; |
377 |
|
|
if (nbpasse>nbpassemax) nbpasse=nbpassemax; |
378 |
|
|
} |
379 |
|
|
} |
380 |
francois |
883 |
|
381 |
|
|
|
382 |
|
|
void MAILLEUR_FEM::construire_quadratique(FEM_MAILLAGE* fem,TPL_MAP_ENTITE<MG_SEGMENT*> &mini,MG_MAILLAGE* maillage,MG_GEOMETRIE* mg_geometrie) |
383 |
|
|
{ |
384 |
francois |
915 |
int recal=(int)param.get_valeur("Quadratisation_jmin"); |
385 |
francois |
883 |
LISTE_MG_NOEUD::iterator it_nd; |
386 |
|
|
MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_nd); |
387 |
|
|
std::vector<FEM_NOEUD*> lstnoeuddirect; |
388 |
|
|
unsigned int i=0; |
389 |
|
|
while (mgnoeud) |
390 |
|
|
{ |
391 |
|
|
mgnoeud->change_nouveau_numero(i); |
392 |
|
|
FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud); |
393 |
|
|
femnoeud->change_numero(i+1); |
394 |
|
|
i++ ; |
395 |
|
|
fem->ajouter_fem_noeud(femnoeud); |
396 |
|
|
//mgnoeud=maillage->get_suivant_noeud(it_nd); |
397 |
|
|
lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud); |
398 |
|
|
if (mgnoeud->get_lien_topologie()!=NULL) |
399 |
|
|
if (mgnoeud->get_lien_topologie()->get_dimension()==0) |
400 |
|
|
{ |
401 |
|
|
FEM_ELEMENT0* femele=new FEM_ELEMENT0(mgnoeud->get_lien_topologie(),mgnoeud,&femnoeud); |
402 |
|
|
fem->ajouter_fem_element0(femele); |
403 |
|
|
} |
404 |
|
|
mgnoeud=maillage->get_suivant_noeud(it_nd); |
405 |
|
|
|
406 |
|
|
} |
407 |
|
|
int dimsansgeo=0; |
408 |
|
|
if (mg_geometrie==NULL) |
409 |
|
|
{ |
410 |
|
|
if (maillage->get_nb_mg_tetra()!=0) dimsansgeo=3; |
411 |
|
|
else if (maillage->get_nb_mg_triangle()!=0) dimsansgeo=2; |
412 |
|
|
else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1; |
413 |
|
|
} |
414 |
|
|
if (mg_geometrie!=NULL) |
415 |
|
|
if (strcmp(mg_geometrie->get_type_geometrie(),"VIRTUEL")==0) |
416 |
|
|
{ |
417 |
|
|
if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3; |
418 |
|
|
else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2; |
419 |
|
|
else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1; |
420 |
|
|
} |
421 |
|
|
int nbmgnoeud = maillage->get_nb_mg_noeud(); |
422 |
|
|
|
423 |
|
|
LISTE_MG_SEGMENT::iterator it_seg; |
424 |
|
|
MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg); |
425 |
|
|
FEM_MAILLAGE_QUADRATIQUE_OUTILS ou ; |
426 |
|
|
i=0; |
427 |
|
|
while (mgseg) |
428 |
|
|
{ |
429 |
|
|
mgseg->change_nouveau_numero(i++); |
430 |
|
|
MG_NOEUD *noeud1=mgseg->get_noeud1(); |
431 |
|
|
MG_NOEUD *noeud2=mgseg->get_noeud2(); |
432 |
|
|
double *xyz1=noeud1->get_coord(); |
433 |
|
|
double *xyz2=noeud2->get_coord(); |
434 |
|
|
double xori=0.5*(xyz1[0]+xyz2[0]); |
435 |
|
|
double yori=0.5*(xyz1[1]+xyz2[1]); |
436 |
|
|
double zori=0.5*(xyz1[2]+xyz2[2]); |
437 |
|
|
FEM_NOEUD* femnoeud; |
438 |
|
|
if (mgseg->get_lien_topologie()!=NULL) |
439 |
|
|
if (mgseg->get_lien_topologie()->get_dimension()==1) |
440 |
|
|
{ |
441 |
|
|
MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie()); |
442 |
|
|
double t1,t2,tm; |
443 |
|
|
arete->inverser(t1,xyz1); |
444 |
|
|
arete->inverser(t2,xyz2); |
445 |
|
|
if (arete->get_courbe()->est_periodique()) |
446 |
|
|
if (t1>t2) t2=t2+arete->get_courbe()->get_periode(); |
447 |
|
|
double t=0.5*(t1+t2); |
448 |
|
|
double xyz[2],xyz3[2]; |
449 |
|
|
arete->evaluer(t,xyz); |
450 |
|
|
double L3=0,L4=0,j=0.0; |
451 |
|
|
double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2); |
452 |
|
|
double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2); |
453 |
|
|
|
454 |
|
|
if (L1/L2 >1.01) |
455 |
|
|
{ |
456 |
|
|
do |
457 |
|
|
{ |
458 |
|
|
j+=0.0001; |
459 |
|
|
tm=(-t+t1)*j+t; |
460 |
|
|
arete->evaluer(tm,xyz3); |
461 |
|
|
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
462 |
|
|
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
463 |
|
|
|
464 |
|
|
}while (0.5-(L4/(L3+L4))>=0.0001); |
465 |
|
|
|
466 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
467 |
|
|
} |
468 |
|
|
|
469 |
|
|
if (L2/L1 >1.01) |
470 |
|
|
{ |
471 |
|
|
do |
472 |
|
|
{ |
473 |
|
|
j+=0.0001; |
474 |
|
|
tm=(-t+t2)*j+t; |
475 |
|
|
arete->evaluer(tm,xyz3); |
476 |
|
|
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
477 |
|
|
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
478 |
|
|
|
479 |
|
|
}while (0.5-(L3/(L3+L4))>=0.0001); |
480 |
|
|
|
481 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
482 |
|
|
} |
483 |
|
|
|
484 |
|
|
if(j == 0) |
485 |
|
|
{ |
486 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori); |
487 |
|
|
} |
488 |
|
|
|
489 |
|
|
} |
490 |
|
|
if (mgseg->get_lien_topologie()!=NULL) |
491 |
|
|
if (mgseg->get_lien_topologie()->get_dimension()==2) |
492 |
|
|
{ |
493 |
|
|
MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie()); |
494 |
|
|
double uv1[2],uv2[2]; |
495 |
|
|
OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v()); |
496 |
|
|
face->inverser(uv1,xyz1); |
497 |
|
|
face->inverser(uv2,xyz2); |
498 |
|
|
if (face->get_surface()->est_periodique_u()==1) |
499 |
|
|
{ |
500 |
|
|
double eps=1e-10*face->get_surface()->get_periode_u(); |
501 |
|
|
if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u(); |
502 |
|
|
if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u(); |
503 |
|
|
if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u(); |
504 |
|
|
if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u(); |
505 |
|
|
} |
506 |
|
|
if (face->get_surface()->est_periodique_v()==1) |
507 |
|
|
{ |
508 |
|
|
double eps=1e-10*face->get_surface()->get_periode_v(); |
509 |
|
|
if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v(); |
510 |
|
|
if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v(); |
511 |
|
|
if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v(); |
512 |
|
|
if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v(); |
513 |
|
|
} |
514 |
|
|
double du=decalage.calcul_decalage_parametre_u(uv1[0]); |
515 |
|
|
double dv=decalage.calcul_decalage_parametre_v(uv1[1]); |
516 |
|
|
double u1=decalage.decalage_parametre_u(uv1[0],du); |
517 |
|
|
double v1=decalage.decalage_parametre_v(uv1[1],dv); |
518 |
|
|
double u2=decalage.decalage_parametre_u(uv2[0],du); |
519 |
|
|
double v2=decalage.decalage_parametre_v(uv2[1],dv); |
520 |
|
|
double uv[2],uv3[2],xyz[3],xyz3[3]; |
521 |
|
|
double milieu[3]; |
522 |
|
|
milieu[0]=0.5*(xyz1[0]+xyz2[0]); |
523 |
|
|
milieu[1]=0.5*(xyz1[1]+xyz2[1]); |
524 |
|
|
milieu[2]=0.5*(xyz1[2]+xyz2[2]); |
525 |
|
|
face->inverser(uv,milieu); |
526 |
|
|
|
527 |
|
|
face->evaluer(uv,xyz); |
528 |
|
|
double L3=0,L4=0,j=0; |
529 |
|
|
double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2); |
530 |
|
|
double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2); |
531 |
|
|
if (L1/L2 >1.01) |
532 |
|
|
{ |
533 |
|
|
do |
534 |
|
|
{ |
535 |
|
|
j+=0.0001; |
536 |
|
|
if ((uv1[0]<uv[0]) && (uv2[0]<uv[0]) && (uv1[0]<uv2[0])) uv1[0]=uv1[0]+face->get_surface()->get_periode_u(); |
537 |
|
|
if ((uv1[1]<uv[1]) && (uv2[1]<uv[1]) && (uv1[1]<uv2[1])) uv1[1]=uv1[1]+face->get_surface()->get_periode_v(); |
538 |
|
|
|
539 |
|
|
uv3[0]=(-uv[0]+uv1[0])*j+uv[0]; |
540 |
|
|
uv3[1]=(-uv[1]+uv1[1])*j+uv[1]; |
541 |
|
|
|
542 |
|
|
face->evaluer(uv3,xyz3); |
543 |
|
|
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
544 |
|
|
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
545 |
|
|
|
546 |
|
|
}while ( 0.5-(L4/(L3+L4)) >=0.0001); |
547 |
|
|
|
548 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
549 |
|
|
} |
550 |
|
|
|
551 |
|
|
if (L2/L1 >1.01) |
552 |
|
|
{ |
553 |
|
|
do |
554 |
|
|
{ |
555 |
|
|
j+=0.0001; |
556 |
|
|
if ((uv1[0]<uv[0]) && (uv2[0]<uv[0]) && (uv2[0]<uv1[0])) uv2[0]=uv2[0]+face->get_surface()->get_periode_u(); |
557 |
|
|
if ((uv1[1]<uv[1]) && (uv2[1]<uv[1]) && (uv2[1]<uv1[1])) uv2[1]=uv2[1]+face->get_surface()->get_periode_v(); |
558 |
|
|
|
559 |
|
|
uv3[0]=(-uv[0]+uv2[0])*j+uv[0]; |
560 |
|
|
uv3[1]=(-uv[1]+uv2[1])*j+uv[1]; |
561 |
|
|
|
562 |
|
|
face->evaluer(uv3,xyz3); |
563 |
|
|
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
564 |
|
|
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
565 |
|
|
|
566 |
|
|
}while (0.5-(L3/(L3+L4)) >=0.0001); |
567 |
|
|
|
568 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
569 |
|
|
} |
570 |
|
|
|
571 |
|
|
if (j == 0.0) |
572 |
|
|
{ |
573 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori); |
574 |
|
|
} |
575 |
|
|
|
576 |
|
|
} |
577 |
|
|
if (mgseg->get_lien_topologie()!=NULL) |
578 |
|
|
{ |
579 |
|
|
if (mgseg->get_lien_topologie()->get_dimension()==3) |
580 |
|
|
{ |
581 |
|
|
double x=0.5*(xyz1[0]+xyz2[0]); |
582 |
|
|
double y=0.5*(xyz1[1]+xyz2[1]); |
583 |
|
|
double z=0.5*(xyz1[2]+xyz2[2]); |
584 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z); |
585 |
|
|
} |
586 |
|
|
} |
587 |
|
|
else |
588 |
|
|
{ |
589 |
|
|
double x=0.5*(xyz1[0]+xyz2[0]); |
590 |
|
|
double y=0.5*(xyz1[1]+xyz2[1]); |
591 |
|
|
double z=0.5*(xyz1[2]+xyz2[2]); |
592 |
|
|
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z); |
593 |
|
|
} |
594 |
|
|
femnoeud->change_numero(i+nbmgnoeud+1); |
595 |
|
|
fem->ajouter_fem_noeud(femnoeud); |
596 |
|
|
mgseg=maillage->get_suivant_segment(it_seg); |
597 |
|
|
lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud); |
598 |
|
|
} |
599 |
|
|
|
600 |
|
|
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1))) |
601 |
|
|
{ |
602 |
|
|
|
603 |
|
|
mgseg=maillage->get_premier_segment(it_seg); |
604 |
|
|
while (mgseg) |
605 |
|
|
{ |
606 |
|
|
if (mgseg->get_lien_topologie()!=NULL) |
607 |
|
|
if (mgseg->get_lien_topologie()->get_dimension()!=1) |
608 |
|
|
{ |
609 |
|
|
mgseg=maillage->get_suivant_segment(it_seg); |
610 |
|
|
continue; |
611 |
|
|
} |
612 |
|
|
if (mg_geometrie!=NULL) |
613 |
|
|
if (mgseg->get_lien_topologie()==NULL) |
614 |
|
|
if (dimsansgeo!=1) |
615 |
|
|
{ |
616 |
|
|
mgseg=maillage->get_suivant_segment(it_seg); |
617 |
|
|
continue; |
618 |
|
|
} |
619 |
|
|
FEM_NOEUD *tabnoeud[3]; |
620 |
|
|
tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()]; |
621 |
|
|
tabnoeud[1]=lstnoeuddirect[mgseg->get_nouveau_numero()+nbmgnoeud]; |
622 |
|
|
tabnoeud[2]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()]; |
623 |
|
|
FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud); |
624 |
|
|
fem->ajouter_fem_element1(seg); |
625 |
|
|
mgseg=maillage->get_suivant_segment(it_seg); |
626 |
|
|
} |
627 |
|
|
} |
628 |
|
|
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2))) |
629 |
|
|
{ |
630 |
|
|
LISTE_MG_TRIANGLE::iterator it_tri; |
631 |
|
|
MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri); |
632 |
|
|
while (mgtri) |
633 |
|
|
{ |
634 |
|
|
if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) |
635 |
|
|
{ |
636 |
|
|
mgtri=maillage->get_suivant_triangle(it_tri); |
637 |
|
|
continue; |
638 |
|
|
} |
639 |
|
|
if (mg_geometrie!=NULL) |
640 |
|
|
if (mgtri->get_lien_topologie()==NULL) |
641 |
|
|
if (dimsansgeo!=2) |
642 |
|
|
{ |
643 |
|
|
mgtri=maillage->get_suivant_triangle(it_tri); |
644 |
|
|
continue; |
645 |
|
|
} |
646 |
|
|
FEM_NOEUD *tabnoeud[6]; |
647 |
|
|
tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()]; |
648 |
|
|
tabnoeud[1]=lstnoeuddirect[mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud]; |
649 |
|
|
tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()]; |
650 |
|
|
tabnoeud[3]=lstnoeuddirect[mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud]; |
651 |
|
|
tabnoeud[4]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()]; |
652 |
|
|
tabnoeud[5]=lstnoeuddirect[mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud]; |
653 |
|
|
FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud); |
654 |
|
|
fem->ajouter_fem_element2(tri); |
655 |
|
|
mgtri=maillage->get_suivant_triangle(it_tri); |
656 |
|
|
} |
657 |
|
|
LISTE_MG_QUADRANGLE::iterator it_quad; |
658 |
|
|
MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad); |
659 |
|
|
while (mgquad) |
660 |
|
|
{ |
661 |
|
|
if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) { |
662 |
|
|
mgquad=maillage->get_suivant_quadrangle(it_quad); |
663 |
|
|
continue; |
664 |
|
|
} |
665 |
|
|
if (mg_geometrie!=NULL) |
666 |
|
|
if (mgquad->get_lien_topologie()==NULL) |
667 |
|
|
if (dimsansgeo!=2) |
668 |
|
|
{ |
669 |
|
|
mgquad=maillage->get_suivant_quadrangle(it_quad); |
670 |
|
|
continue; |
671 |
|
|
} |
672 |
|
|
FEM_NOEUD *tabnoeud[8]; |
673 |
|
|
tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()]; |
674 |
|
|
tabnoeud[1]=lstnoeuddirect[mgquad->get_segment1()->get_nouveau_numero()+nbmgnoeud]; |
675 |
|
|
tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()]; |
676 |
|
|
tabnoeud[3]=lstnoeuddirect[mgquad->get_segment2()->get_nouveau_numero()+nbmgnoeud]; |
677 |
|
|
tabnoeud[4]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()]; |
678 |
|
|
tabnoeud[5]=lstnoeuddirect[mgquad->get_segment3()->get_nouveau_numero()+nbmgnoeud]; |
679 |
|
|
tabnoeud[6]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()]; |
680 |
|
|
tabnoeud[7]=lstnoeuddirect[mgquad->get_segment4()->get_nouveau_numero()+nbmgnoeud]; |
681 |
|
|
FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(mgquad,tabnoeud); |
682 |
|
|
fem->ajouter_fem_element2(quad); |
683 |
|
|
mgquad=maillage->get_suivant_quadrangle(it_quad); |
684 |
|
|
} |
685 |
|
|
} |
686 |
|
|
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3))) |
687 |
|
|
{ |
688 |
|
|
|
689 |
francois |
915 |
LISTE_MG_TETRA::iterator it_tetra; |
690 |
francois |
883 |
MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra); |
691 |
|
|
while (mgtetra) |
692 |
|
|
{ |
693 |
|
|
FEM_NOEUD *tabnoeud[10]; |
694 |
|
|
tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()]; |
695 |
|
|
tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
696 |
|
|
tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()]; |
697 |
|
|
tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
698 |
|
|
tabnoeud[4]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()]; |
699 |
|
|
tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
700 |
|
|
tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
701 |
|
|
tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
702 |
|
|
tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
703 |
|
|
tabnoeud[9]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()]; |
704 |
|
|
FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud); |
705 |
|
|
fem->ajouter_fem_element3(tet); |
706 |
francois |
915 |
mgtetra=maillage->get_suivant_tetra(it_tetra); |
707 |
|
|
} |
708 |
|
|
if (recal==1) recal_element_quadratique(fem); |
709 |
|
|
|
710 |
francois |
883 |
|
711 |
francois |
915 |
|
712 |
francois |
883 |
LISTE_MG_HEXA::iterator it_hexa; |
713 |
|
|
MG_HEXA* mghex=maillage->get_premier_hexa(it_hexa); |
714 |
|
|
while (mghex) |
715 |
|
|
{ |
716 |
|
|
FEM_NOEUD *tabnoeud[20]; |
717 |
|
|
tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()]; |
718 |
|
|
tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
719 |
|
|
tabnoeud[2]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()]; |
720 |
|
|
tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
721 |
|
|
tabnoeud[4]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()]; |
722 |
|
|
tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
723 |
|
|
tabnoeud[6]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()]; |
724 |
|
|
tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
725 |
|
|
tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
726 |
|
|
tabnoeud[9]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
727 |
|
|
tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
728 |
|
|
tabnoeud[11]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
729 |
|
|
tabnoeud[12]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()]; |
730 |
|
|
tabnoeud[13]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud5()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
731 |
|
|
tabnoeud[14]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()]; |
732 |
|
|
tabnoeud[15]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud6()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
733 |
|
|
tabnoeud[16]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()]; |
734 |
|
|
tabnoeud[17]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud7()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
735 |
|
|
tabnoeud[18]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()]; |
736 |
|
|
tabnoeud[19]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud8()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
737 |
|
|
FEM_HEXA20* hex=new FEM_HEXA20(mghex,tabnoeud); |
738 |
|
|
fem->ajouter_fem_element3(hex); |
739 |
|
|
mghex=maillage->get_suivant_hexa(it_hexa); |
740 |
|
|
} |
741 |
|
|
LISTE_MG_PENTA::iterator it_pen; |
742 |
|
|
MG_PENTA* mgpen=maillage->get_premier_penta(it_pen); |
743 |
|
|
while (mgpen) |
744 |
|
|
{ |
745 |
|
|
FEM_NOEUD *tabnoeud[15]; |
746 |
|
|
tabnoeud[0]=lstnoeuddirect[mgpen->get_noeud1()->get_nouveau_numero()]; |
747 |
|
|
tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
748 |
|
|
tabnoeud[2]=lstnoeuddirect[mgpen->get_noeud2()->get_nouveau_numero()]; |
749 |
|
|
tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
750 |
|
|
tabnoeud[4]=lstnoeuddirect[mgpen->get_noeud3()->get_nouveau_numero()]; |
751 |
|
|
tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
752 |
|
|
tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
753 |
|
|
tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
754 |
|
|
tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
755 |
|
|
tabnoeud[9]=lstnoeuddirect[mgpen->get_noeud4()->get_nouveau_numero()]; |
756 |
|
|
tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
757 |
|
|
tabnoeud[11]=lstnoeuddirect[mgpen->get_noeud5()->get_nouveau_numero()]; |
758 |
|
|
tabnoeud[12]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud5()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
759 |
|
|
tabnoeud[13]=lstnoeuddirect[mgpen->get_noeud6()->get_nouveau_numero()]; |
760 |
|
|
tabnoeud[14]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
761 |
|
|
FEM_PENTA15* pen=new FEM_PENTA15(mgpen,tabnoeud); |
762 |
|
|
fem->ajouter_fem_element3(pen); |
763 |
|
|
mgpen=maillage->get_suivant_penta(it_pen); |
764 |
|
|
} |
765 |
|
|
} |
766 |
|
|
} |
767 |
|
|
|
768 |
|
|
|
769 |
|
|
|
770 |
|
|
|
771 |
|
|
void MAILLEUR_FEM::optimise_numerotation(FEM_MAILLAGE* fem) |
772 |
|
|
{ |
773 |
|
|
FEM_NOEUD* noeud=fem->get_fem_noeud(0); |
774 |
|
|
FEM_GRAPH_NOEUD *graph; |
775 |
|
|
graph=new FEM_GRAPH_NOEUD(noeud,fem); |
776 |
|
|
int e=graph->get_excentricite(); |
777 |
|
|
TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau(); |
778 |
|
|
int nbdernierniveau=dernierniveau.get_nb(); |
779 |
|
|
for (int i=0;i<nbdernierniveau;i++) |
780 |
|
|
{ |
781 |
|
|
FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),fem); |
782 |
|
|
int etmp=graphtmp->get_excentricite(); |
783 |
|
|
if (etmp>e) |
784 |
|
|
{ |
785 |
|
|
delete graph; |
786 |
|
|
graph=graphtmp; |
787 |
|
|
dernierniveau=graph->get_dernier_niveau(); |
788 |
|
|
nbdernierniveau=dernierniveau.get_nb(); |
789 |
|
|
i=-1; |
790 |
|
|
e=etmp; |
791 |
|
|
} |
792 |
|
|
else delete graphtmp; |
793 |
|
|
} |
794 |
|
|
int numero=fem->get_nb_fem_noeud(); |
795 |
|
|
for (int i=0;i<e+1;i++) |
796 |
|
|
{ |
797 |
|
|
TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i); |
798 |
|
|
int nbnoeud=niveau.get_nb(); |
799 |
|
|
for (int j=0;j<nbnoeud;j++) |
800 |
|
|
{ |
801 |
|
|
FEM_NOEUD* noeud=niveau.get(j); |
802 |
|
|
noeud->change_numero_opt(numero); |
803 |
|
|
numero--; |
804 |
|
|
} |
805 |
|
|
} |
806 |
|
|
|
807 |
|
|
|
808 |
|
|
delete graph; |
809 |
|
|
} |
810 |
|
|
|
811 |
|
|
|
812 |
|
|
void MAILLEUR_FEM::copie_numerotation_opt(FEM_MAILLAGE* fem) |
813 |
|
|
{ |
814 |
|
|
int nbnoeud=fem->get_nb_fem_noeud(); |
815 |
|
|
for (int i=0;i<nbnoeud;i++) |
816 |
|
|
{ |
817 |
|
|
FEM_NOEUD* noeud=fem->get_fem_noeud(i); |
818 |
|
|
noeud->change_numero(noeud->get_numero_opt()); |
819 |
|
|
} |
820 |
|
|
|
821 |
|
|
} |
822 |
|
|
|