ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_adaptatif.cpp
Revision: 35
Committed: Thu Aug 16 21:24:14 2007 UTC (17 years, 9 months ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur_adaptatif.cpp
File size: 8284 byte(s)
Log Message:
Mailleur 3D + divers bugs + origine des elements de maillages

File Contents

# User Rev Content
1 francois 35 //------------------------------------------------------------
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     // mailleur0d.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_adaptatif.h"
27     #include "mg_solution.h"
28     #include "mg_maillage.h"
29     #include "fct_taille.h"
30     #include "mailleur0d.h"
31     #include "mailleur1d.h"
32     #include "mailleur2d.h"
33     #include <math.h>
34    
35    
36    
37     MAILLEUR_ADAPTATIF::MAILLEUR_ADAPTATIF(MG_MAILLAGE* mai,FCT_TAILLE* carte,double coef):MAILLEUR(),mg_maillage(mai),metrique(carte),limite(coef)
38     {
39     }
40    
41     MAILLEUR_ADAPTATIF::~MAILLEUR_ADAPTATIF()
42     {
43     }
44    
45     void MAILLEUR_ADAPTATIF::maille(void)
46     {
47     MG_SOLUTION* sol=mg_maillage->calculer_carte_taille_reelle("temp.soltmp");
48     sol->active_solution(0);
49     int nb_noeud=mg_maillage->get_nb_mg_noeud();
50     TPL_MAP_ENTITE<MG_TETRA*> lsttetra;
51     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri;
52     TPL_MAP_ENTITE<MG_SEGMENT*> lstseg;
53     for (int i=0;i<nb_noeud;i++)
54     {
55     MG_NOEUD* noeud=mg_maillage->get_mg_noeud(i);
56     double *xyz=noeud->get_coord();
57     double tenseur[9];
58     metrique->evaluer(xyz,tenseur);
59     double val=1./sqrt(tenseur[0]);
60     double err=fabs((val-noeud->get_solution())/noeud->get_solution());
61     if (err>limite)
62     {
63     int nb_tetra=noeud->get_lien_tetra()->get_nb();
64     if (nb_tetra!=0)
65     {
66     for (int j=0;j<nb_tetra;j++)
67     lsttetra.ajouter(noeud->get_lien_tetra()->get(j));
68     }
69     int nb_tri=noeud->get_lien_triangle()->get_nb();
70     if (nb_tri!=0)
71     {
72     for (int j=0;j<nb_tri;j++)
73     if (noeud->get_lien_triangle()->get(j)->get_lien_topologie()->get_dimension()==2)
74     lsttri.ajouter(noeud->get_lien_triangle()->get(j));
75     }
76     int nb_seg=noeud->get_lien_segment()->get_nb();
77     if (nb_seg!=0)
78     {
79     for (int j=0;j<nb_seg;j++)
80     if (noeud->get_lien_segment()->get(j)->get_lien_topologie()->get_dimension()==1)
81     lstseg.ajouter(noeud->get_lien_segment()->get(j));
82     }
83    
84     }
85     }
86     delete sol;
87     for (int i=0;i<lsttetra.get_nb();i++)
88     mg_maillage->supprimer_mg_tetraid(lsttetra.get(i)->get_id());
89     for (int i=0;i<lsttri.get_nb();i++)
90     mg_maillage->supprimer_mg_triangleid(lsttri.get(i)->get_id());
91     for (int i=0;i<lstseg.get_nb();i++)
92     mg_maillage->supprimer_mg_segmentid(lstseg.get(i)->get_id());
93     lsttetra.vide();
94     lsttri.vide();
95     lstseg.vide();
96     nb_noeud=mg_maillage->get_nb_mg_noeud();
97     for (int i=0;i<nb_noeud;i++)
98     {
99     MG_NOEUD* noeud=mg_maillage->get_mg_noeud(i);
100     if (noeud->get_lien_topologie()->get_dimension()==1)
101     {
102     int nb_seg_sur_arete=0;
103     int nb_seg=noeud->get_lien_segment()->get_nb();
104     for (int j=0;j<nb_seg;j++)
105     if (noeud->get_lien_segment()->get(j)->get_lien_topologie()->get_dimension()==1)
106     nb_seg_sur_arete++;
107    
108     if (nb_seg_sur_arete==0)
109     {
110     int nb_tri=noeud->get_lien_triangle()->get_nb();
111     for (int j=0;j<nb_tri;j++)
112     if (noeud->get_lien_triangle()->get(j)->get_lien_topologie()->get_dimension()==2)
113     lsttri.ajouter(noeud->get_lien_triangle()->get(j));
114     int nb_tetra=noeud->get_lien_tetra()->get_nb();
115     for (int j=0;j<nb_tetra;j++)
116     lsttetra.ajouter(noeud->get_lien_tetra()->get(j));
117     }
118     }
119     if (noeud->get_lien_topologie()->get_dimension()==2)
120     {
121     int nb_tri_sur_face=0;
122     int nb_tri=noeud->get_lien_triangle()->get_nb();
123     for (int j=0;j<nb_tri;j++)
124     if (noeud->get_lien_triangle()->get(j)->get_lien_topologie()->get_dimension()==2)
125     nb_tri_sur_face++;
126    
127     if (nb_tri_sur_face==0)
128     {
129     int nb_tetra=noeud->get_lien_tetra()->get_nb();
130     for (int j=0;j<nb_tetra;j++)
131     lsttetra.ajouter(noeud->get_lien_tetra()->get(j));
132     }
133     }
134     }
135     for (int i=0;i<lsttetra.get_nb();i++)
136     mg_maillage->supprimer_mg_tetraid(lsttetra.get(i)->get_id());
137     for (int i=0;i<lsttri.get_nb();i++)
138     mg_maillage->supprimer_mg_triangleid(lsttri.get(i)->get_id());
139     for (int i=0;i<lstseg.get_nb();i++)
140     mg_maillage->supprimer_mg_segmentid(lstseg.get(i)->get_id());
141     MAILLEUR0D m0d(mg_maillage,mg_maillage->get_mg_geometrie());
142     m0d.adapte();
143     int nb_arete=mg_maillage->get_mg_geometrie()->get_nb_mg_arete();
144     for (int i=0;i<nb_arete;i++)
145     {
146     MG_ARETE* arete=mg_maillage->get_mg_geometrie()->get_mg_arete(i);
147     MAILLEUR1D m1d(mg_maillage,mg_maillage->get_mg_geometrie(),arete,metrique);
148     m1d.adapte();
149     }
150     int nb_face=mg_maillage->get_mg_geometrie()->get_nb_mg_face();
151     for (int i=0;i<nb_face;i++)
152     {
153     MG_FACE* face=mg_maillage->get_mg_geometrie()->get_mg_face(i);
154     int nb_tri=face->get_lien_maillage()->get_nb();
155     TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttri;
156     for (int j=0;j<nb_tri;j++)
157     {
158     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(j);
159     MG_NOEUD* noeud1=tri->get_noeud1();
160     MG_NOEUD* noeud2=tri->get_noeud2();
161     MG_NOEUD* noeud3=tri->get_noeud3();
162     double *xyz1,*xyz2,*xyz3;
163     xyz1=noeud1->get_coord();
164     xyz2=noeud2->get_coord();
165     xyz3=noeud3->get_coord();
166     MG_NOEUD* noeudtmp1=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
167     MG_NOEUD* noeudtmp2=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
168     MG_NOEUD* noeudtmp3=new MG_NOEUD(NULL,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
169     MG_TRIANGLE* tritmp=new MG_TRIANGLE(NULL,noeudtmp1,noeudtmp2,noeudtmp3,NULL,NULL,NULL,IMPOSE);
170     lsttri.ajouter(tritmp);
171     }
172     for (int j=0;j<nb_tri;j++)
173     {
174     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(0);
175     mg_maillage->supprimer_mg_triangleid(tri->get_id());
176     }
177     MAILLEUR2D m2d(mg_maillage,mg_maillage->get_mg_geometrie(),face,metrique);
178     m2d.maille(face,NULL,&lsttri);
179     for (int j=0;j<nb_tri;j++)
180     {
181     MG_TRIANGLE* tri=lsttri.get(0);
182     MG_NOEUD* noeud1=tri->get_noeud1();
183     MG_NOEUD* noeud2=tri->get_noeud2();
184     MG_NOEUD* noeud3=tri->get_noeud3();
185     lsttri.supprimer(tri);
186     delete tri;
187     delete noeud1;
188     delete noeud2;
189     delete noeud3;
190     }
191    
192     }
193    
194     }
195    
196    
197