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