1 |
//------------------------------------------------------------ |
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 |
|
324 |
|
325 |
void MAILLEUR_FEM::construire_quadratique(FEM_MAILLAGE* fem,TPL_MAP_ENTITE<MG_SEGMENT*> &mini,MG_MAILLAGE* maillage,MG_GEOMETRIE* mg_geometrie) |
326 |
{ |
327 |
LISTE_MG_NOEUD::iterator it_nd; |
328 |
MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_nd); |
329 |
std::vector<FEM_NOEUD*> lstnoeuddirect; |
330 |
unsigned int i=0; |
331 |
while (mgnoeud) |
332 |
{ |
333 |
mgnoeud->change_nouveau_numero(i); |
334 |
FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud); |
335 |
femnoeud->change_numero(i+1); |
336 |
i++ ; |
337 |
fem->ajouter_fem_noeud(femnoeud); |
338 |
//mgnoeud=maillage->get_suivant_noeud(it_nd); |
339 |
lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud); |
340 |
if (mgnoeud->get_lien_topologie()!=NULL) |
341 |
if (mgnoeud->get_lien_topologie()->get_dimension()==0) |
342 |
{ |
343 |
FEM_ELEMENT0* femele=new FEM_ELEMENT0(mgnoeud->get_lien_topologie(),mgnoeud,&femnoeud); |
344 |
fem->ajouter_fem_element0(femele); |
345 |
} |
346 |
mgnoeud=maillage->get_suivant_noeud(it_nd); |
347 |
|
348 |
} |
349 |
int dimsansgeo=0; |
350 |
if (mg_geometrie==NULL) |
351 |
{ |
352 |
if (maillage->get_nb_mg_tetra()!=0) dimsansgeo=3; |
353 |
else if (maillage->get_nb_mg_triangle()!=0) dimsansgeo=2; |
354 |
else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1; |
355 |
} |
356 |
if (mg_geometrie!=NULL) |
357 |
if (strcmp(mg_geometrie->get_type_geometrie(),"VIRTUEL")==0) |
358 |
{ |
359 |
if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3; |
360 |
else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2; |
361 |
else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1; |
362 |
} |
363 |
int nbmgnoeud = maillage->get_nb_mg_noeud(); |
364 |
|
365 |
LISTE_MG_SEGMENT::iterator it_seg; |
366 |
MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg); |
367 |
FEM_MAILLAGE_QUADRATIQUE_OUTILS ou ; |
368 |
i=0; |
369 |
while (mgseg) |
370 |
{ |
371 |
mgseg->change_nouveau_numero(i++); |
372 |
MG_NOEUD *noeud1=mgseg->get_noeud1(); |
373 |
MG_NOEUD *noeud2=mgseg->get_noeud2(); |
374 |
double *xyz1=noeud1->get_coord(); |
375 |
double *xyz2=noeud2->get_coord(); |
376 |
double xori=0.5*(xyz1[0]+xyz2[0]); |
377 |
double yori=0.5*(xyz1[1]+xyz2[1]); |
378 |
double zori=0.5*(xyz1[2]+xyz2[2]); |
379 |
FEM_NOEUD* femnoeud; |
380 |
if (mgseg->get_lien_topologie()!=NULL) |
381 |
if (mgseg->get_lien_topologie()->get_dimension()==1) |
382 |
{ |
383 |
MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie()); |
384 |
double t1,t2,tm; |
385 |
arete->inverser(t1,xyz1); |
386 |
arete->inverser(t2,xyz2); |
387 |
if (arete->get_courbe()->est_periodique()) |
388 |
if (t1>t2) t2=t2+arete->get_courbe()->get_periode(); |
389 |
double t=0.5*(t1+t2); |
390 |
double xyz[2],xyz3[2]; |
391 |
arete->evaluer(t,xyz); |
392 |
double L3=0,L4=0,j=0.0; |
393 |
double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2); |
394 |
double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2); |
395 |
|
396 |
if (L1/L2 >1.01) |
397 |
{ |
398 |
do |
399 |
{ |
400 |
j+=0.0001; |
401 |
tm=(-t+t1)*j+t; |
402 |
arete->evaluer(tm,xyz3); |
403 |
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
404 |
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
405 |
|
406 |
}while (0.5-(L4/(L3+L4))>=0.0001); |
407 |
|
408 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
409 |
} |
410 |
|
411 |
if (L2/L1 >1.01) |
412 |
{ |
413 |
do |
414 |
{ |
415 |
j+=0.0001; |
416 |
tm=(-t+t2)*j+t; |
417 |
arete->evaluer(tm,xyz3); |
418 |
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
419 |
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
420 |
|
421 |
}while (0.5-(L3/(L3+L4))>=0.0001); |
422 |
|
423 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
424 |
} |
425 |
|
426 |
if(j == 0) |
427 |
{ |
428 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori); |
429 |
} |
430 |
|
431 |
} |
432 |
if (mgseg->get_lien_topologie()!=NULL) |
433 |
if (mgseg->get_lien_topologie()->get_dimension()==2) |
434 |
{ |
435 |
MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie()); |
436 |
double uv1[2],uv2[2]; |
437 |
OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v()); |
438 |
face->inverser(uv1,xyz1); |
439 |
face->inverser(uv2,xyz2); |
440 |
if (face->get_surface()->est_periodique_u()==1) |
441 |
{ |
442 |
double eps=1e-10*face->get_surface()->get_periode_u(); |
443 |
if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u(); |
444 |
if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u(); |
445 |
if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u(); |
446 |
if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u(); |
447 |
} |
448 |
if (face->get_surface()->est_periodique_v()==1) |
449 |
{ |
450 |
double eps=1e-10*face->get_surface()->get_periode_v(); |
451 |
if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v(); |
452 |
if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v(); |
453 |
if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v(); |
454 |
if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v(); |
455 |
} |
456 |
double du=decalage.calcul_decalage_parametre_u(uv1[0]); |
457 |
double dv=decalage.calcul_decalage_parametre_v(uv1[1]); |
458 |
double u1=decalage.decalage_parametre_u(uv1[0],du); |
459 |
double v1=decalage.decalage_parametre_v(uv1[1],dv); |
460 |
double u2=decalage.decalage_parametre_u(uv2[0],du); |
461 |
double v2=decalage.decalage_parametre_v(uv2[1],dv); |
462 |
double uv[2],uv3[2],xyz[3],xyz3[3]; |
463 |
double milieu[3]; |
464 |
milieu[0]=0.5*(xyz1[0]+xyz2[0]); |
465 |
milieu[1]=0.5*(xyz1[1]+xyz2[1]); |
466 |
milieu[2]=0.5*(xyz1[2]+xyz2[2]); |
467 |
face->inverser(uv,milieu); |
468 |
|
469 |
face->evaluer(uv,xyz); |
470 |
double L3=0,L4=0,j=0; |
471 |
double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2); |
472 |
double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2); |
473 |
if (L1/L2 >1.01) |
474 |
{ |
475 |
do |
476 |
{ |
477 |
j+=0.0001; |
478 |
if ((uv1[0]<uv[0]) && (uv2[0]<uv[0]) && (uv1[0]<uv2[0])) uv1[0]=uv1[0]+face->get_surface()->get_periode_u(); |
479 |
if ((uv1[1]<uv[1]) && (uv2[1]<uv[1]) && (uv1[1]<uv2[1])) uv1[1]=uv1[1]+face->get_surface()->get_periode_v(); |
480 |
|
481 |
uv3[0]=(-uv[0]+uv1[0])*j+uv[0]; |
482 |
uv3[1]=(-uv[1]+uv1[1])*j+uv[1]; |
483 |
|
484 |
face->evaluer(uv3,xyz3); |
485 |
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
486 |
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
487 |
|
488 |
}while ( 0.5-(L4/(L3+L4)) >=0.0001); |
489 |
|
490 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
491 |
} |
492 |
|
493 |
if (L2/L1 >1.01) |
494 |
{ |
495 |
do |
496 |
{ |
497 |
j+=0.0001; |
498 |
if ((uv1[0]<uv[0]) && (uv2[0]<uv[0]) && (uv2[0]<uv1[0])) uv2[0]=uv2[0]+face->get_surface()->get_periode_u(); |
499 |
if ((uv1[1]<uv[1]) && (uv2[1]<uv[1]) && (uv2[1]<uv1[1])) uv2[1]=uv2[1]+face->get_surface()->get_periode_v(); |
500 |
|
501 |
uv3[0]=(-uv[0]+uv2[0])*j+uv[0]; |
502 |
uv3[1]=(-uv[1]+uv2[1])*j+uv[1]; |
503 |
|
504 |
face->evaluer(uv3,xyz3); |
505 |
L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2); |
506 |
L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2); |
507 |
|
508 |
}while (0.5-(L3/(L3+L4)) >=0.0001); |
509 |
|
510 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori); |
511 |
} |
512 |
|
513 |
if (j == 0.0) |
514 |
{ |
515 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori); |
516 |
} |
517 |
|
518 |
} |
519 |
if (mgseg->get_lien_topologie()!=NULL) |
520 |
{ |
521 |
if (mgseg->get_lien_topologie()->get_dimension()==3) |
522 |
{ |
523 |
double x=0.5*(xyz1[0]+xyz2[0]); |
524 |
double y=0.5*(xyz1[1]+xyz2[1]); |
525 |
double z=0.5*(xyz1[2]+xyz2[2]); |
526 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z); |
527 |
} |
528 |
} |
529 |
else |
530 |
{ |
531 |
double x=0.5*(xyz1[0]+xyz2[0]); |
532 |
double y=0.5*(xyz1[1]+xyz2[1]); |
533 |
double z=0.5*(xyz1[2]+xyz2[2]); |
534 |
femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z); |
535 |
} |
536 |
femnoeud->change_numero(i+nbmgnoeud+1); |
537 |
fem->ajouter_fem_noeud(femnoeud); |
538 |
mgseg=maillage->get_suivant_segment(it_seg); |
539 |
lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud); |
540 |
} |
541 |
|
542 |
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1))) |
543 |
{ |
544 |
|
545 |
mgseg=maillage->get_premier_segment(it_seg); |
546 |
while (mgseg) |
547 |
{ |
548 |
if (mgseg->get_lien_topologie()!=NULL) |
549 |
if (mgseg->get_lien_topologie()->get_dimension()!=1) |
550 |
{ |
551 |
mgseg=maillage->get_suivant_segment(it_seg); |
552 |
continue; |
553 |
} |
554 |
if (mg_geometrie!=NULL) |
555 |
if (mgseg->get_lien_topologie()==NULL) |
556 |
if (dimsansgeo!=1) |
557 |
{ |
558 |
mgseg=maillage->get_suivant_segment(it_seg); |
559 |
continue; |
560 |
} |
561 |
FEM_NOEUD *tabnoeud[3]; |
562 |
tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()]; |
563 |
tabnoeud[1]=lstnoeuddirect[mgseg->get_nouveau_numero()+nbmgnoeud]; |
564 |
tabnoeud[2]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()]; |
565 |
FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud); |
566 |
fem->ajouter_fem_element1(seg); |
567 |
mgseg=maillage->get_suivant_segment(it_seg); |
568 |
} |
569 |
} |
570 |
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2))) |
571 |
{ |
572 |
LISTE_MG_TRIANGLE::iterator it_tri; |
573 |
MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri); |
574 |
while (mgtri) |
575 |
{ |
576 |
if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) |
577 |
{ |
578 |
mgtri=maillage->get_suivant_triangle(it_tri); |
579 |
continue; |
580 |
} |
581 |
if (mg_geometrie!=NULL) |
582 |
if (mgtri->get_lien_topologie()==NULL) |
583 |
if (dimsansgeo!=2) |
584 |
{ |
585 |
mgtri=maillage->get_suivant_triangle(it_tri); |
586 |
continue; |
587 |
} |
588 |
FEM_NOEUD *tabnoeud[6]; |
589 |
tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()]; |
590 |
tabnoeud[1]=lstnoeuddirect[mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud]; |
591 |
tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()]; |
592 |
tabnoeud[3]=lstnoeuddirect[mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud]; |
593 |
tabnoeud[4]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()]; |
594 |
tabnoeud[5]=lstnoeuddirect[mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud]; |
595 |
FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud); |
596 |
fem->ajouter_fem_element2(tri); |
597 |
mgtri=maillage->get_suivant_triangle(it_tri); |
598 |
} |
599 |
LISTE_MG_QUADRANGLE::iterator it_quad; |
600 |
MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad); |
601 |
while (mgquad) |
602 |
{ |
603 |
if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) { |
604 |
mgquad=maillage->get_suivant_quadrangle(it_quad); |
605 |
continue; |
606 |
} |
607 |
if (mg_geometrie!=NULL) |
608 |
if (mgquad->get_lien_topologie()==NULL) |
609 |
if (dimsansgeo!=2) |
610 |
{ |
611 |
mgquad=maillage->get_suivant_quadrangle(it_quad); |
612 |
continue; |
613 |
} |
614 |
FEM_NOEUD *tabnoeud[8]; |
615 |
tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()]; |
616 |
tabnoeud[1]=lstnoeuddirect[mgquad->get_segment1()->get_nouveau_numero()+nbmgnoeud]; |
617 |
tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()]; |
618 |
tabnoeud[3]=lstnoeuddirect[mgquad->get_segment2()->get_nouveau_numero()+nbmgnoeud]; |
619 |
tabnoeud[4]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()]; |
620 |
tabnoeud[5]=lstnoeuddirect[mgquad->get_segment3()->get_nouveau_numero()+nbmgnoeud]; |
621 |
tabnoeud[6]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()]; |
622 |
tabnoeud[7]=lstnoeuddirect[mgquad->get_segment4()->get_nouveau_numero()+nbmgnoeud]; |
623 |
FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(mgquad,tabnoeud); |
624 |
fem->ajouter_fem_element2(quad); |
625 |
mgquad=maillage->get_suivant_quadrangle(it_quad); |
626 |
} |
627 |
} |
628 |
if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3))) |
629 |
{ |
630 |
|
631 |
int nbpas=(int)param.get_valeur("Quadratisation_pas"); |
632 |
int recal=(int)param.get_valeur("Quadratisation_jmin"); |
633 |
double dismin=param.get_valeur("Quadratisation_dis"); |
634 |
LISTE_MG_TETRA::iterator it_tetra; |
635 |
MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra); |
636 |
while (mgtetra) |
637 |
{ |
638 |
FEM_NOEUD *tabnoeud[10]; |
639 |
tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()]; |
640 |
tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
641 |
tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()]; |
642 |
tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
643 |
tabnoeud[4]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()]; |
644 |
tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
645 |
tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
646 |
tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
647 |
tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
648 |
tabnoeud[9]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()]; |
649 |
FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud); |
650 |
fem->ajouter_fem_element3(tet); |
651 |
if (recal==1) |
652 |
{ |
653 |
FEM_MAILLAGE_QUADRATIQUE_OUTILS ou; |
654 |
double dis=ou.get_distorsion2(tet); |
655 |
if (dis<dismin-1e-12) |
656 |
{ |
657 |
OT_VECTEUR_3D vec[10]; |
658 |
OT_VECTEUR_3D depart[10]; |
659 |
for (int i=0;i<9;i++) |
660 |
{ |
661 |
if ((i==0) || (i==2) || (i==4)) continue; |
662 |
double* xyzori=tet->get_fem_noeud(i)->get_coord_ori(); |
663 |
double* xyz=tet->get_fem_noeud(i)->get_coord(); |
664 |
vec[i].change_x(xyz[0]-xyzori[0]); |
665 |
vec[i].change_y(xyz[1]-xyzori[1]); |
666 |
vec[i].change_z(xyz[2]-xyzori[2]); |
667 |
depart[i].change_x(xyz[0]); |
668 |
depart[i].change_y(xyz[1]); |
669 |
depart[i].change_z(xyz[2]); |
670 |
} |
671 |
int pas=0; |
672 |
while (dis<dismin-1e-12) |
673 |
{ |
674 |
for (int i=0;i<9;i++) |
675 |
{ |
676 |
if ((i==0) || (i==2) || (i==4)) continue; |
677 |
double* xyz=tet->get_fem_noeud(i)->get_coord(); |
678 |
tet->get_fem_noeud(i)->change_x(depart[i].get_x()-pas*1./1./nbpas*vec[i].get_x()); |
679 |
tet->get_fem_noeud(i)->change_y(depart[i].get_y()-pas*1./1./nbpas*vec[i].get_y()); |
680 |
tet->get_fem_noeud(i)->change_z(depart[i].get_z()-pas*1./1./nbpas*vec[i].get_z()); |
681 |
} |
682 |
dis=ou.get_distorsion2(tet); |
683 |
pas++; |
684 |
} |
685 |
char mess[255]; |
686 |
sprintf(mess," Tetra %lu replacé à %.2lf%% de sa position optimale",tet->get_id(),(pas-1.)*1./nbpas*100.); |
687 |
affiche(mess); |
688 |
} |
689 |
} |
690 |
mgtetra=maillage->get_suivant_tetra(it_tetra); |
691 |
|
692 |
|
693 |
} |
694 |
LISTE_MG_HEXA::iterator it_hexa; |
695 |
MG_HEXA* mghex=maillage->get_premier_hexa(it_hexa); |
696 |
while (mghex) |
697 |
{ |
698 |
FEM_NOEUD *tabnoeud[20]; |
699 |
tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()]; |
700 |
tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
701 |
tabnoeud[2]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()]; |
702 |
tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
703 |
tabnoeud[4]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()]; |
704 |
tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
705 |
tabnoeud[6]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()]; |
706 |
tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
707 |
tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
708 |
tabnoeud[9]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
709 |
tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
710 |
tabnoeud[11]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
711 |
tabnoeud[12]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()]; |
712 |
tabnoeud[13]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud5()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
713 |
tabnoeud[14]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()]; |
714 |
tabnoeud[15]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud6()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
715 |
tabnoeud[16]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()]; |
716 |
tabnoeud[17]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud7()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
717 |
tabnoeud[18]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()]; |
718 |
tabnoeud[19]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud8()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
719 |
FEM_HEXA20* hex=new FEM_HEXA20(mghex,tabnoeud); |
720 |
fem->ajouter_fem_element3(hex); |
721 |
mghex=maillage->get_suivant_hexa(it_hexa); |
722 |
} |
723 |
LISTE_MG_PENTA::iterator it_pen; |
724 |
MG_PENTA* mgpen=maillage->get_premier_penta(it_pen); |
725 |
while (mgpen) |
726 |
{ |
727 |
FEM_NOEUD *tabnoeud[15]; |
728 |
tabnoeud[0]=lstnoeuddirect[mgpen->get_noeud1()->get_nouveau_numero()]; |
729 |
tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
730 |
tabnoeud[2]=lstnoeuddirect[mgpen->get_noeud2()->get_nouveau_numero()]; |
731 |
tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
732 |
tabnoeud[4]=lstnoeuddirect[mgpen->get_noeud3()->get_nouveau_numero()]; |
733 |
tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
734 |
tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
735 |
tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
736 |
tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
737 |
tabnoeud[9]=lstnoeuddirect[mgpen->get_noeud4()->get_nouveau_numero()]; |
738 |
tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
739 |
tabnoeud[11]=lstnoeuddirect[mgpen->get_noeud5()->get_nouveau_numero()]; |
740 |
tabnoeud[12]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud5()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
741 |
tabnoeud[13]=lstnoeuddirect[mgpen->get_noeud6()->get_nouveau_numero()]; |
742 |
tabnoeud[14]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud]; |
743 |
FEM_PENTA15* pen=new FEM_PENTA15(mgpen,tabnoeud); |
744 |
fem->ajouter_fem_element3(pen); |
745 |
mgpen=maillage->get_suivant_penta(it_pen); |
746 |
} |
747 |
} |
748 |
} |
749 |
|
750 |
|
751 |
|
752 |
|
753 |
void MAILLEUR_FEM::optimise_numerotation(FEM_MAILLAGE* fem) |
754 |
{ |
755 |
FEM_NOEUD* noeud=fem->get_fem_noeud(0); |
756 |
FEM_GRAPH_NOEUD *graph; |
757 |
graph=new FEM_GRAPH_NOEUD(noeud,fem); |
758 |
int e=graph->get_excentricite(); |
759 |
TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau(); |
760 |
int nbdernierniveau=dernierniveau.get_nb(); |
761 |
for (int i=0;i<nbdernierniveau;i++) |
762 |
{ |
763 |
FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),fem); |
764 |
int etmp=graphtmp->get_excentricite(); |
765 |
if (etmp>e) |
766 |
{ |
767 |
delete graph; |
768 |
graph=graphtmp; |
769 |
dernierniveau=graph->get_dernier_niveau(); |
770 |
nbdernierniveau=dernierniveau.get_nb(); |
771 |
i=-1; |
772 |
e=etmp; |
773 |
} |
774 |
else delete graphtmp; |
775 |
} |
776 |
int numero=fem->get_nb_fem_noeud(); |
777 |
for (int i=0;i<e+1;i++) |
778 |
{ |
779 |
TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i); |
780 |
int nbnoeud=niveau.get_nb(); |
781 |
for (int j=0;j<nbnoeud;j++) |
782 |
{ |
783 |
FEM_NOEUD* noeud=niveau.get(j); |
784 |
noeud->change_numero_opt(numero); |
785 |
numero--; |
786 |
} |
787 |
} |
788 |
|
789 |
|
790 |
delete graph; |
791 |
} |
792 |
|
793 |
|
794 |
void MAILLEUR_FEM::copie_numerotation_opt(FEM_MAILLAGE* fem) |
795 |
{ |
796 |
int nbnoeud=fem->get_nb_fem_noeud(); |
797 |
for (int i=0;i<nbnoeud;i++) |
798 |
{ |
799 |
FEM_NOEUD* noeud=fem->get_fem_noeud(i); |
800 |
noeud->change_numero(noeud->get_numero_opt()); |
801 |
} |
802 |
|
803 |
} |
804 |
|