ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_structure.cpp
Revision: 576
Committed: Wed Oct 22 18:13:01 2014 UTC (10 years, 6 months ago) by francois
File size: 11783 byte(s)
Log Message:
ajout d'une geometrie virtuelle dans le maillage structure pour pouvoir saisir des conditions aux limites. ajout de conditions aux limites pour le thermique

File Contents

# User Rev Content
1 chebbi 463 #include <stdio.h>
2     #include <math.h>
3     #include "mg_gestionnaire.h"
4     #include "mailleur3d_structure.h"
5     #include "mg_maillage.h"
6     #include "fem_maillage.h"
7     #include "fem_hexa20.h"
8     #include "mg_geometrie.h"
9 francois 576 #include "mg_sommet_noeud.h"
10     #include "mg_arete_element.h"
11     #include "mg_face_element.h"
12     #include "mg_volume_element.h"
13 chebbi 463 #include <vector>
14    
15    
16     MAILLEUR3D_STRUCTURE::MAILLEUR3D_STRUCTURE(double xmintmp, double xmaxtmp, double ymintmp, double ymaxtmp, double zmintmp, double zmaxtmp
17 francois 576 , int ntmp, int mtmp, int ktmp,MG_GESTIONNAIRE*gesttmp,int avecgeo):MAILLEUR(false),
18     xmin(xmintmp),xmax(xmaxtmp),ymin(ymintmp),ymax(ymaxtmp),zmin(zmintmp),zmax(zmaxtmp),n(ntmp),m(mtmp),k(ktmp),gest(gesttmp),geovirtuel(avecgeo)
19 chebbi 463 {
20     }
21    
22     MAILLEUR3D_STRUCTURE::MAILLEUR3D_STRUCTURE( MAILLEUR3D_STRUCTURE& mdd):MAILLEUR(mdd),
23     xmin(mdd.xmin),xmax(mdd.xmax),ymin(mdd.ymin),ymax(mdd.ymax),zmin(mdd.zmin),zmax(mdd.zmax),n(mdd.n),m(mdd.m),k(mdd.k),gest(mdd.gest)
24     {
25     }
26    
27     MAILLEUR3D_STRUCTURE::~MAILLEUR3D_STRUCTURE()
28     {
29     }
30    
31 francois 551 void MAILLEUR3D_STRUCTURE::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
32 chebbi 463 {
33     affiche((char*)"Création d'un maillage MG structuré");
34     double intx, inty, intz;
35     intx=fabs(xmax-xmin)/n;
36     inty=fabs(ymax-ymin)/m;
37     intz=fabs(zmax-zmin)/k;
38     MG_GEOMETRIE* geo= NULL;
39 francois 576 MG_SOMMET_NOEUD *som1=NULL;
40     MG_SOMMET_NOEUD *som2=NULL;
41     MG_SOMMET_NOEUD *som3=NULL;
42     MG_SOMMET_NOEUD *som4=NULL;
43     MG_SOMMET_NOEUD *som5=NULL;
44     MG_SOMMET_NOEUD *som6=NULL;
45     MG_SOMMET_NOEUD *som7=NULL;
46     MG_SOMMET_NOEUD *som8=NULL;
47     MG_ARETE_ELEMENT* are1=NULL;
48     MG_ARETE_ELEMENT* are2=NULL;
49     MG_ARETE_ELEMENT* are3=NULL;
50     MG_ARETE_ELEMENT* are4=NULL;
51     MG_ARETE_ELEMENT* are5=NULL;
52     MG_ARETE_ELEMENT* are6=NULL;
53     MG_ARETE_ELEMENT* are7=NULL;
54     MG_ARETE_ELEMENT* are8=NULL;
55     MG_ARETE_ELEMENT* are9=NULL;
56     MG_ARETE_ELEMENT* are10=NULL;
57     MG_ARETE_ELEMENT* are11=NULL;
58     MG_ARETE_ELEMENT* are12=NULL;
59     MG_FACE_ELEMENT* face1=NULL;
60     MG_FACE_ELEMENT* face2=NULL;
61     MG_FACE_ELEMENT* face3=NULL;
62     MG_FACE_ELEMENT* face4=NULL;
63     MG_FACE_ELEMENT* face5=NULL;
64     MG_FACE_ELEMENT* face6=NULL;
65     MG_VOLUME_ELEMENT* vol=NULL;
66     if (geovirtuel==true)
67     {
68     geo=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL");
69     gest->ajouter_mg_geometrie(geo);
70     som1=new MG_SOMMET_NOEUD(NULL);
71     geo->ajouter_mg_sommet(som1);
72     som2=new MG_SOMMET_NOEUD(NULL);
73     geo->ajouter_mg_sommet(som2);
74     som3=new MG_SOMMET_NOEUD(NULL);
75     geo->ajouter_mg_sommet(som3);
76     som4=new MG_SOMMET_NOEUD(NULL);
77     geo->ajouter_mg_sommet(som4);
78     som5=new MG_SOMMET_NOEUD(NULL);
79     geo->ajouter_mg_sommet(som5);
80     som6=new MG_SOMMET_NOEUD(NULL);
81     geo->ajouter_mg_sommet(som6);
82     som7=new MG_SOMMET_NOEUD(NULL);
83     geo->ajouter_mg_sommet(som7);
84     som8=new MG_SOMMET_NOEUD(NULL);
85     geo->ajouter_mg_sommet(som8);
86     are1=new MG_ARETE_ELEMENT();
87     geo->ajouter_mg_arete(are1);
88     are2=new MG_ARETE_ELEMENT();
89     geo->ajouter_mg_arete(are2);
90     are3=new MG_ARETE_ELEMENT();
91     geo->ajouter_mg_arete(are3);
92     are4=new MG_ARETE_ELEMENT();
93     geo->ajouter_mg_arete(are4);
94     are5=new MG_ARETE_ELEMENT();
95     geo->ajouter_mg_arete(are5);
96     are6=new MG_ARETE_ELEMENT();
97     geo->ajouter_mg_arete(are6);
98     are7=new MG_ARETE_ELEMENT();
99     geo->ajouter_mg_arete(are7);
100     are8=new MG_ARETE_ELEMENT();
101     geo->ajouter_mg_arete(are8);
102     are9=new MG_ARETE_ELEMENT();
103     geo->ajouter_mg_arete(are9);
104     are10=new MG_ARETE_ELEMENT();
105     geo->ajouter_mg_arete(are10);
106     are11=new MG_ARETE_ELEMENT();
107     geo->ajouter_mg_arete(are11);
108     are12=new MG_ARETE_ELEMENT();
109     geo->ajouter_mg_arete(are12);
110     face1=new MG_FACE_ELEMENT();
111     geo->ajouter_mg_face(face1);
112     face2=new MG_FACE_ELEMENT();
113     geo->ajouter_mg_face(face2);
114     face3=new MG_FACE_ELEMENT();
115     geo->ajouter_mg_face(face3);
116     face4=new MG_FACE_ELEMENT();
117     geo->ajouter_mg_face(face4);
118     face5=new MG_FACE_ELEMENT();
119     geo->ajouter_mg_face(face5);
120     face6=new MG_FACE_ELEMENT();
121     geo->ajouter_mg_face(face6);
122     vol=new MG_VOLUME_ELEMENT();
123     geo->ajouter_mg_volume(vol);
124     }
125     MG_MAILLAGE* mai=new MG_MAILLAGE(geo);
126 chebbi 463 gest->ajouter_mg_maillage(mai);
127     std::vector<MG_NOEUD*> vecnod;
128     for (int l=0; l<=k ;l++)
129     {
130     for (int j=0; j<=m;j++)
131     {
132     for (int i=0; i<=n;i++)
133     {
134 francois 576 MG_ELEMENT_TOPOLOGIQUE *topo=NULL;
135     if (geovirtuel)
136     {
137     if ((i==0) && (j==0) && (l==0)) topo=som1;
138     else if ((i==0) && (j==m) && (l==0)) topo=som2;
139     else if ((i==0) && (j==m) && (l==k)) topo=som3;
140     else if ((i==0) && (j==0) && (l==k)) topo=som4;
141     else if ((i==n) && (j==0) && (l==0)) topo=som5;
142     else if ((i==n) && (j==m) && (l==0)) topo=som6;
143     else if ((i==n) && (j==m) && (l==k)) topo=som7;
144     else if ((i==n) && (j==0) && (l==k)) topo=som8;
145     else if ((j==0) && (l==0)) topo=are1;
146     else if ((j==m) && (l==0)) topo=are2;
147     else if ((j==m) && (l==k)) topo=are3;
148     else if ((j==0) && (l==k)) topo=are4;
149     else if ((i==0) && (l==0)) topo=are5;
150     else if ((i==n) && (l==0)) topo=are6;
151     else if ((i==n) && (l==k)) topo=are7;
152     else if ((i==0) && (l==k)) topo=are8;
153     else if ((i==0) && (j==0)) topo=are9;
154     else if ((i==n) && (j==0)) topo=are10;
155     else if ((i==n) && (j==m)) topo=are11;
156     else if ((i==0) && (j==m)) topo=are12;
157     else if (i==0) topo=face1;
158     else if (i==n) topo=face2;
159     else if (j==0) topo=face3;
160     else if (j==m) topo=face4;
161     else if (l==0) topo=face5;
162     else if (l==k) topo=face6;
163     else topo=vol;
164     }
165     double z=zmin+(l*intz);
166 chebbi 463 double y=ymin+(j*inty);
167     double x=xmin+(i*intx);
168 francois 576 MG_NOEUD* nou=mai->ajouter_mg_noeud(topo,x,y,z,MAILLEUR_AUTO);
169 chebbi 463 vecnod.push_back(nou);
170 francois 576 if (geovirtuel)
171     {
172     if ((i==0) && (j==0) && (l==0)) som1->change_mg_noeud(nou);
173     else if ((i==0) && (j==m) && (l==0)) som2->change_mg_noeud(nou);
174     else if ((i==0) && (j==m) && (l==k)) som3->change_mg_noeud(nou);
175     else if ((i==0) && (j==0) && (l==k)) som4->change_mg_noeud(nou);
176     else if ((i==n) && (j==0) && (l==0)) som5->change_mg_noeud(nou);
177     else if ((i==n) && (j==m) && (l==0)) som6->change_mg_noeud(nou);
178     else if ((i==n) && (j==m) && (l==k)) som7->change_mg_noeud(nou);
179     else if ((i==n) && (j==0) && (l==k)) som8->change_mg_noeud(nou);
180     }
181     }
182 chebbi 463 }
183     }
184 francois 576 if (geovirtuel)
185     {
186     for(int i=0; i<n;i++)
187     {
188     int j=0,l=0;
189     MG_NOEUD* nod1=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
190     MG_NOEUD* nod2=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
191     mai->ajouter_mg_segment(are1,nod1,nod2,MAILLEUR_AUTO);
192     j=m,l=0;
193     MG_NOEUD* nod3=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
194     MG_NOEUD* nod4=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
195     mai->ajouter_mg_segment(are2,nod3,nod4,MAILLEUR_AUTO);
196     j=m,l=k;
197     MG_NOEUD* nod5=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
198     MG_NOEUD* nod6=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
199     mai->ajouter_mg_segment(are3,nod5,nod6,MAILLEUR_AUTO);
200     j=0,l=k;
201     MG_NOEUD* nod7=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
202     MG_NOEUD* nod8=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
203     mai->ajouter_mg_segment(are4,nod7,nod8,MAILLEUR_AUTO);
204     }
205     for(int j=0; j<m;j++)
206     {
207     int i=0,l=0;
208     MG_NOEUD* nod1=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
209     MG_NOEUD* nod2=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
210     mai->ajouter_mg_segment(are5,nod1,nod2,MAILLEUR_AUTO);
211     i=n,l=0;
212     MG_NOEUD* nod3=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
213     MG_NOEUD* nod4=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
214     mai->ajouter_mg_segment(are6,nod3,nod4,MAILLEUR_AUTO);
215     i=n,l=k;
216     MG_NOEUD* nod5=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
217     MG_NOEUD* nod6=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
218     mai->ajouter_mg_segment(are7,nod5,nod6,MAILLEUR_AUTO);
219     i=0,l=k;
220     MG_NOEUD* nod7=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
221     MG_NOEUD* nod8=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
222     mai->ajouter_mg_segment(are8,nod7,nod8,MAILLEUR_AUTO);
223     }
224     for(int l=0; l<k;l++)
225     {
226     int i=0,j=0;
227     MG_NOEUD* nod1=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
228     MG_NOEUD* nod2=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
229     mai->ajouter_mg_segment(are9,nod1,nod2,MAILLEUR_AUTO);
230     i=n,j=0;
231     MG_NOEUD* nod3=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
232     MG_NOEUD* nod4=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
233     mai->ajouter_mg_segment(are10,nod3,nod4,MAILLEUR_AUTO);
234     i=n,j=m;
235     MG_NOEUD* nod5=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
236     MG_NOEUD* nod6=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
237     mai->ajouter_mg_segment(are11,nod5,nod6,MAILLEUR_AUTO);
238     i=0,j=m;
239     MG_NOEUD* nod7=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
240     MG_NOEUD* nod8=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
241     mai->ajouter_mg_segment(are12,nod7,nod8,MAILLEUR_AUTO);
242     }
243     for (int j=0;j<m;j++)
244     for (int l=0;l<k;l++)
245     {
246     int i=0;
247     MG_NOEUD* nod1=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
248     MG_NOEUD* nod2=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
249     MG_NOEUD* nod3=vecnod[i+((n+1)*(j+1))+((l+1)*(m+1)*(n+1))];
250     MG_NOEUD* nod4=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
251     i=n;
252     MG_NOEUD* nod5=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
253     MG_NOEUD* nod6=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
254     MG_NOEUD* nod7=vecnod[i+((n+1)*(j+1))+((l+1)*(m+1)*(n+1))];
255     MG_NOEUD* nod8=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
256     mai->ajouter_mg_quadrangle(face1,nod1,nod4,nod3,nod2,MAILLEUR_AUTO);
257     mai->ajouter_mg_quadrangle(face2,nod5,nod6,nod7,nod8,MAILLEUR_AUTO);
258     }
259     for (int i=0;i<n;i++)
260     for (int l=0;l<k;l++)
261     {
262     int j=0;
263     MG_NOEUD* nod1=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
264     MG_NOEUD* nod2=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
265     MG_NOEUD* nod3=vecnod[(i+1)+((n+1)*j)+((l+1)*(m+1)*(n+1))];
266     MG_NOEUD* nod4=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
267     j=m;
268     MG_NOEUD* nod5=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
269     MG_NOEUD* nod6=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
270     MG_NOEUD* nod7=vecnod[(i+1)+((n+1)*j)+((l+1)*(m+1)*(n+1))];
271     MG_NOEUD* nod8=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
272     mai->ajouter_mg_quadrangle(face3,nod1,nod2,nod3,nod4,MAILLEUR_AUTO);
273     mai->ajouter_mg_quadrangle(face4,nod7,nod6,nod5,nod8,MAILLEUR_AUTO);
274     }
275     for (int i=0;i<n;i++)
276     for (int j=0;j<m;j++)
277     {
278     int l=0;
279     MG_NOEUD* nod1=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
280     MG_NOEUD* nod2=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
281     MG_NOEUD* nod3=vecnod[(i+1)+((n+1)*(j+1))+(l*(m+1)*(n+1))];
282     MG_NOEUD* nod4=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
283     l=k;
284     MG_NOEUD* nod5=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
285     MG_NOEUD* nod6=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
286     MG_NOEUD* nod7=vecnod[(i+1)+((n+1)*(j+1))+(l*(m+1)*(n+1))];
287     MG_NOEUD* nod8=vecnod[i+((n+1)*(j+1))+(l*(m+1)*(n+1))];
288     mai->ajouter_mg_quadrangle(face5,nod1,nod4,nod3,nod2,MAILLEUR_AUTO);
289     mai->ajouter_mg_quadrangle(face6,nod5,nod6,nod7,nod8,MAILLEUR_AUTO);
290     }
291     }
292     for(int l=0; l<k;l++)
293 chebbi 463 {
294     for(int j=0; j<m;j++)
295     {
296     for(int i=0; i<n;i++)
297     {
298     MG_NOEUD* nod1=vecnod[i+((n+1)*j)+(l*(m+1)*(n+1))];
299     MG_NOEUD* nod2=vecnod[(i+1)+((n+1)*j)+(l*(m+1)*(n+1))];
300     MG_NOEUD* nod3=vecnod[(i+1)+(n+1)*(j+1)+(l*(m+1)*(n+1))];
301     MG_NOEUD* nod4=vecnod[i+(n+1)*(j+1)+(l*(m+1)*(n+1))];
302     MG_NOEUD* nod5=vecnod[i+((n+1)*j)+((l+1)*(m+1)*(n+1))];
303     MG_NOEUD* nod6=vecnod[(i+1)+((n+1)*j)+((l+1)*(m+1)*(n+1))];
304     MG_NOEUD* nod7=vecnod[(i+1)+(n+1)*(j+1)+((l+1)*(m+1)*(n+1))];
305     MG_NOEUD* nod8=vecnod[i+(n+1)*(j+1)+((l+1)*(m+1)*(n+1))];
306 francois 576 MG_HEXA *hexa=mai->ajouter_mg_hexa(vol,nod1,nod2,nod3,nod4,nod5,nod6,nod7,nod8,MAILLEUR_AUTO);
307     }
308 chebbi 463 }
309     }
310 francois 465 BOITE_3D b(xmin,ymin,zmin,xmax,ymax,zmax);
311     mai->change_param_structure(b,n,m,k);
312 chebbi 463 affiche((char*)"Création d'un maillage FEM structuré");
313     FEM_MAILLAGE* fem = new FEM_MAILLAGE(geo, mai,1);
314     gest->ajouter_fem_maillage(fem);
315     fem->construire();
316     }