ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/optimisation/src/mg_lissage.cpp
Revision: 222
Committed: Thu Nov 19 19:14:16 2009 UTC (15 years, 5 months ago) by francois
Original Path: magic/lib/optimisation/optimisation/src/mg_lissage.cpp
File size: 5819 byte(s)
Log Message:
Divers corrections : vectorisation  toxfem et extraction de peau.

File Contents

# User Rev Content
1 francois 222 #include "gestionversion.h"
2     #include "mg_lissage.h"
3     #include "fem_solution.h"
4     #include "fem_maillage.h"
5     #include "mg_maillage.h"
6     #include "mg_gestionnaire.h"
7     #include "mg_triangle_peau.h"
8     #include <stdio.h>
9     #include <string.h>
10     //---------------------------------------------------------------------------
11    
12    
13     MG_LISSAGE::MG_LISSAGE()
14     {
15     }
16    
17    
18     MG_LISSAGE::~MG_LISSAGE()
19     {
20     }
21    
22     void MG_LISSAGE::extract_skin(FEM_MAILLAGE* mai,MG_GESTIONNAIRE& gest2)
23     {
24    
25     //�tape 0 - On commence par mettre � z�ro tous les nouveau_numero des triangles et des noeuds du maillage
26     MG_MAILLAGE* mg_mai = (MG_MAILLAGE*)mai->get_mg_maillage();
27     LISTE_MG_TRIANGLE::iterator it_tri;
28     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
29     {
30     mgtri->change_nouveau_numero(0);
31     }
32     LISTE_MG_NOEUD::iterator it_noeud;
33     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
34     {
35     mgnoeud->change_nouveau_numero(0);
36     }
37    
38     //�tape 1 - On boucle ensuite tous les t�tra�dres pour ajouter un compteur du nombre de fois qu'un triangle appartient � 1 t�tra
39     LISTE_FEM_TETRA::iterator it_tetra;
40     for (FEM_TETRA* tet=mai->get_premier_tetra(it_tetra);tet!=NULL;tet=mai->get_suivant_tetra(it_tetra))
41     {
42     MG_TETRA* mgtet=(MG_TETRA*)tet->get_mg_element_maillage();
43     int origine = mgtet->get_origine();
44     if (origine == OPTIMISE)
45     {
46     int num1 = mgtet->get_triangle1()->get_nouveau_numero();
47     int num2 = mgtet->get_triangle2()->get_nouveau_numero();
48     int num3 = mgtet->get_triangle3()->get_nouveau_numero();
49     int num4 = mgtet->get_triangle4()->get_nouveau_numero();
50     num1++;
51     num2++;
52     num3++;
53     num4++;
54     mgtet->get_triangle1()->change_nouveau_numero(num1);
55     mgtet->get_triangle2()->change_nouveau_numero(num2);
56     mgtet->get_triangle3()->change_nouveau_numero(num3);
57     mgtet->get_triangle4()->change_nouveau_numero(num4);
58     }
59     }
60    
61     //�tape 2 - On boucle l'ensemble des triangles identifi�s � l'�tape 1 pour identifier les noeuds leur appartenant
62     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
63     {
64     int num = mgtri->get_nouveau_numero();
65     if (num == 1)
66     {
67     MG_NOEUD* noeud1 = mgtri->get_noeud1();
68     MG_NOEUD* noeud2 = mgtri->get_noeud2();
69     MG_NOEUD* noeud3 = mgtri->get_noeud3();
70     noeud1->change_nouveau_numero(1);
71     noeud2->change_nouveau_numero(1);
72     noeud3->change_nouveau_numero(1);
73     }
74     }
75    
76     //�tape 3 - On cr�e un nouveau gestionnaire et un nouveau maillage
77    
78    
79     MG_MAILLAGE* mai2 = new MG_MAILLAGE(NULL);
80     gest2.ajouter_mg_maillage(mai2);
81    
82     // //�tape 4 - On boucle l'ensemble des noeuds identifi�s � l'�tape 2 pour les recr�er dans le second maillage
83     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
84     {
85     int num = mgnoeud->get_nouveau_numero();
86     if (num == 1)
87     {
88     double x = mgnoeud->get_x();
89     double y = mgnoeud->get_y();
90     double z = mgnoeud->get_z();
91     MG_NOEUD* noeud1 = new MG_NOEUD(NULL,x,y,z,TRIANGULATION);
92     mai2->ajouter_mg_noeud(noeud1);
93     mgnoeud->change_nouveau_numero(noeud1->get_id());
94     }
95     }
96    
97     // //�tape 5 - On boucle l'ensemble des triangles identifi�s � l'�tape 1 pour les recr�er dans le maillage 2
98     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
99     {
100     int num = mgtri->get_nouveau_numero();
101     if (num == 1)
102     {
103     MG_NOEUD* noeud1 = mgtri->get_noeud1();
104     MG_NOEUD* noeud2 = mgtri->get_noeud2();
105     MG_NOEUD* noeud3 = mgtri->get_noeud3();
106     MG_NOEUD* node1 = mai2->get_mg_noeudid(noeud1->get_nouveau_numero());
107     MG_NOEUD* node2 = mai2->get_mg_noeudid(noeud2->get_nouveau_numero());
108     MG_NOEUD* node3 = mai2->get_mg_noeudid(noeud3->get_nouveau_numero());
109     MG_TRIANGLE_PEAU* tri2 = insere_triangle(NULL,node1,node2,node3,mai2);
110     }
111     }
112    
113     }
114    
115     MG_TRIANGLE_PEAU* MG_LISSAGE::insere_triangle(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,MG_MAILLAGE* mg_maillage)
116     {
117     MG_TRIANGLE_PEAU* voisin1=NULL,*voisin2=NULL,*voisin3=NULL;
118     MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
119     MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
120     MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
121     if (mgsegment1==NULL)
122     {
123     mgsegment1=mg_maillage->ajouter_mg_segment(topo,mgnoeud1,mgnoeud2,TRIANGULATION);
124     voisin1=NULL;
125     }
126     else voisin1=recherche_voisin(mgnoeud1,mgnoeud2);
127     if (mgsegment2==NULL)
128     {
129     mgsegment2=mg_maillage->ajouter_mg_segment(topo,mgnoeud2,mgnoeud3,TRIANGULATION);
130     voisin2=NULL;
131     }
132     else voisin2=recherche_voisin(mgnoeud2,mgnoeud3);
133     if (mgsegment3==NULL)
134     {
135     mgsegment3=mg_maillage->ajouter_mg_segment(topo,mgnoeud3,mgnoeud1,TRIANGULATION);
136     voisin3=NULL;
137     }
138     else voisin3=recherche_voisin(mgnoeud1,mgnoeud3);
139     MG_TRIANGLE_PEAU* mtriangle=new MG_TRIANGLE_PEAU(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,TRIANGULATION);
140     mg_maillage->ajouter_mg_triangle(mtriangle);
141     mtriangle->change_voisin1(voisin1);
142     mtriangle->change_voisin2(voisin2);
143     mtriangle->change_voisin3(voisin3);
144     return mtriangle;
145     }
146    
147     MG_TRIANGLE_PEAU* MG_LISSAGE::recherche_voisin(MG_NOEUD* mg_noeud1,MG_NOEUD* mg_noeud2)
148     {
149     int nb1=mg_noeud1->get_lien_triangle()->get_nb();
150     int nb2=mg_noeud2->get_lien_triangle()->get_nb();
151     for (int i=0;i<nb1;i++)
152     for (int j=0;j<nb2;j++)
153     if (mg_noeud1->get_lien_triangle()->get(i)==mg_noeud2->get_lien_triangle()->get(j)) return (MG_TRIANGLE_PEAU*)mg_noeud1->get_lien_triangle()->get(i);
154     return NULL;
155     }