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