ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_tetra.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 8602 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 174 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 5 //------------------------------------------------------------
7 francois 174 // 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 5 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_tetra.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 174 // Version du 02/03/2006 � 11H22
21 5 //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mg_tetra.h"
27     #include "mg_maillage.h"
28    
29 francois 35 MG_TETRA::MG_TETRA(unsigned long num,MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_NOEUD *mgnoeud4,class MG_TRIANGLE* mgtriangle1,class MG_TRIANGLE* mgtriangle2,class MG_TRIANGLE* mgtriangle3,class MG_TRIANGLE* mgtriangle4,int origine):MG_ELEMENT_MAILLAGE(num,topo,origine),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),noeud4(mgnoeud4),triangle1(mgtriangle1),triangle2(mgtriangle2),triangle3(mgtriangle3),triangle4(mgtriangle4)
30 5 {
31     init_tetra();
32     }
33    
34 francois 35 MG_TETRA::MG_TETRA(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_NOEUD *mgnoeud4,class MG_TRIANGLE* mgtriangle1,class MG_TRIANGLE* mgtriangle2,class MG_TRIANGLE* mgtriangle3,class MG_TRIANGLE* mgtriangle4,int origine):MG_ELEMENT_MAILLAGE(topo,origine),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),noeud4(mgnoeud4),triangle1(mgtriangle1),triangle2(mgtriangle2),triangle3(mgtriangle3),triangle4(mgtriangle4)
35 5 {
36     init_tetra();
37     }
38    
39    
40     MG_TETRA::MG_TETRA(MG_TETRA& mdd):MG_ELEMENT_MAILLAGE(mdd),noeud1(mdd.noeud1),noeud2(mdd.noeud2),noeud3(mdd.noeud3),noeud4(mdd.noeud4),triangle1(mdd.triangle1),triangle2(mdd.triangle2),triangle3(mdd.triangle3),triangle4(mdd.triangle4)
41     {
42     init_tetra();
43     }
44    
45     MG_TETRA* MG_TETRA::dupliquer(MG_MAILLAGE *mgmai,long decalage)
46     {
47     MG_NOEUD* nd1=mgmai->get_mg_noeudid(noeud1->get_id()+decalage);
48     MG_NOEUD* nd2=mgmai->get_mg_noeudid(noeud2->get_id()+decalage);
49     MG_NOEUD* nd3=mgmai->get_mg_noeudid(noeud3->get_id()+decalage);
50     MG_NOEUD* nd4=mgmai->get_mg_noeudid(noeud4->get_id()+decalage);
51     MG_TRIANGLE* tri1=mgmai->get_mg_triangleid(triangle1->get_id()+decalage);
52     MG_TRIANGLE* tri2=mgmai->get_mg_triangleid(triangle2->get_id()+decalage);
53     MG_TRIANGLE* tri3=mgmai->get_mg_triangleid(triangle3->get_id()+decalage);
54     MG_TRIANGLE* tri4=mgmai->get_mg_triangleid(triangle4->get_id()+decalage);
55 francois 35 MG_TETRA* tet=new MG_TETRA(this->get_id()+decalage,liaison_topologique,nd1,nd2,nd3,nd4,tri1,tri2,tri3,tri4,DUPLIQUER);
56 5 mgmai->ajouter_mg_tetra(tet);
57     return tet;
58     }
59    
60     MG_TETRA::~MG_TETRA()
61     {
62     if (noeud1!=NULL) noeud1->get_lien_tetra()->supprimer(this);
63     if (noeud2!=NULL) noeud2->get_lien_tetra()->supprimer(this);
64     if (noeud3!=NULL) noeud3->get_lien_tetra()->supprimer(this);
65     if (noeud4!=NULL) noeud4->get_lien_tetra()->supprimer(this);
66     unsigned long noeudminid=std::min(noeud1->get_id(),noeud2->get_id());
67     noeudminid=std::min(noeudminid,noeud3->get_id());
68     noeudminid=std::min(noeudminid,noeud4->get_id());
69     if (noeud1!=NULL)
70     if (noeud1->get_id()==noeudminid) noeud1->get_lien_petit_tetra()->supprimer(this);
71     if (noeud2!=NULL)
72     if (noeud2->get_id()==noeudminid) noeud2->get_lien_petit_tetra()->supprimer(this);
73     if (noeud3!=NULL)
74     if (noeud3->get_id()==noeudminid) noeud3->get_lien_petit_tetra()->supprimer(this);
75     if (noeud4!=NULL)
76     if (noeud4->get_id()==noeudminid) noeud4->get_lien_petit_tetra()->supprimer(this);
77     if (triangle1!=NULL) {triangle1->decrementer();triangle1->get_lien_tetra()->supprimer(this);}
78     if (triangle2!=NULL) {triangle2->decrementer();triangle2->get_lien_tetra()->supprimer(this);}
79     if (triangle3!=NULL) {triangle3->decrementer();triangle3->get_lien_tetra()->supprimer(this);}
80     if (triangle4!=NULL) {triangle4->decrementer();triangle4->get_lien_tetra()->supprimer(this);}
81     if (liaison_topologique==NULL) return;
82     if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_maillage()->supprimer(this);
83     }
84    
85     void MG_TETRA::init_tetra(void)
86     {
87     if (noeud1!=NULL) noeud1->get_lien_tetra()->ajouter(this);
88     if (noeud2!=NULL) noeud2->get_lien_tetra()->ajouter(this);
89     if (noeud3!=NULL) noeud3->get_lien_tetra()->ajouter(this);
90     if (noeud4!=NULL) noeud4->get_lien_tetra()->ajouter(this);
91     unsigned long noeudminid=std::min(noeud1->get_id(),noeud2->get_id());
92     noeudminid=std::min(noeudminid,noeud3->get_id());
93     noeudminid=std::min(noeudminid,noeud4->get_id());
94     if (noeud1!=NULL)
95     if (noeud1->get_id()==noeudminid) noeud1->get_lien_petit_tetra()->ajouter(this);
96     if (noeud2!=NULL)
97     if (noeud2->get_id()==noeudminid) noeud2->get_lien_petit_tetra()->ajouter(this);
98     if (noeud3!=NULL)
99     if (noeud3->get_id()==noeudminid) noeud3->get_lien_petit_tetra()->ajouter(this);
100     if (noeud4!=NULL)
101     if (noeud4->get_id()==noeudminid) noeud4->get_lien_petit_tetra()->ajouter(this);
102     if (triangle1!=NULL) {triangle1->incrementer();triangle1->get_lien_tetra()->ajouter(this);}
103     if (triangle2!=NULL) {triangle2->incrementer();triangle2->get_lien_tetra()->ajouter(this);}
104     if (triangle3!=NULL) {triangle3->incrementer();triangle3->get_lien_tetra()->ajouter(this);}
105     if (triangle4!=NULL) {triangle4->incrementer();triangle4->get_lien_tetra()->ajouter(this);}
106     if (liaison_topologique==NULL) return;
107     if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_maillage()->ajouter(this);
108     }
109    
110    
111     int MG_TETRA::get_type_entite(void)
112     {
113     return IDMG_TETRA;
114     }
115    
116    
117    
118    
119    
120     MG_NOEUD* MG_TETRA::get_noeud1(void)
121     {
122     return noeud1;
123     }
124    
125     MG_NOEUD* MG_TETRA::get_noeud2(void)
126     {
127     return noeud2;
128     }
129    
130     MG_NOEUD* MG_TETRA::get_noeud3(void)
131     {
132     return noeud3;
133     }
134    
135     MG_NOEUD* MG_TETRA::get_noeud4(void)
136     {
137     return noeud4;
138     }
139    
140     MG_TRIANGLE* MG_TETRA::get_triangle1(void)
141     {
142     return triangle1;
143     }
144    
145     MG_TRIANGLE* MG_TETRA::get_triangle2(void)
146     {
147     return triangle2;
148     }
149    
150     MG_TRIANGLE* MG_TETRA::get_triangle3(void)
151     {
152     return triangle3;
153     }
154    
155     MG_TRIANGLE* MG_TETRA::get_triangle4(void)
156     {
157     return triangle4;
158     }
159    
160    
161     int MG_TETRA::get_dimension(void)
162     {
163     return 3;
164     }
165    
166    
167     BOITE_3D MG_TETRA::get_boite_3D(void)
168     {
169     double coo1[3];
170     double coo2[3];
171     double coo3[3];
172     double coo4[3];
173     coo1[0]=noeud1->get_x();
174     coo1[1]=noeud1->get_y();
175     coo1[2]=noeud1->get_z();
176     coo2[0]=noeud2->get_x();
177     coo2[1]=noeud2->get_y();
178     coo2[2]=noeud2->get_z();
179     coo3[0]=noeud3->get_x();
180     coo3[1]=noeud3->get_y();
181     coo3[2]=noeud3->get_z();
182     coo4[0]=noeud4->get_x();
183     coo4[1]=noeud4->get_y();
184     coo4[2]=noeud4->get_z();
185     double xmin,ymin,zmin,xmax,ymax,zmax;
186     xmin=std::min(coo1[0],coo2[0]);
187     xmin=std::min(xmin,coo3[0]);
188     xmin=std::min(xmin,coo4[0]);
189     xmax=std::max(coo1[0],coo2[0]);
190     xmax=std::max(xmax,coo3[0]);
191     xmax=std::max(xmax,coo4[0]);
192     ymin=std::min(coo1[1],coo2[1]);
193     ymin=std::min(ymin,coo3[1]);
194     ymin=std::min(ymin,coo4[1]);
195     ymax=std::max(coo1[1],coo2[1]);
196     ymax=std::max(ymax,coo3[1]);
197     ymax=std::max(ymax,coo4[1]);
198     zmin=std::min(coo1[2],coo2[2]);
199     zmin=std::min(zmin,coo3[2]);
200     zmin=std::min(zmin,coo4[2]);
201     zmax=std::max(coo1[2],coo2[2]);
202     zmax=std::max(zmax,coo3[2]);
203     zmax=std::max(zmax,coo4[2]);
204     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
205     return boite;
206     }
207 francois 174 void MG_TETRA::extrapoler_solution_noeud(void)
208     {
209     noeud1->change_solution(solution);
210     noeud2->change_solution(solution);
211     noeud3->change_solution(solution);
212     noeud4->change_solution(solution);
213     }
214 5
215     void MG_TETRA::enregistrer(std::ostream& o)
216     {
217 francois 195 if ((liaison_topologique==NULL) && (MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO!=3)) return;
218 francois 35 if (liaison_topologique==NULL) o << "%" << get_id() << "=TETRAEDRE(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << ",$" << noeud3->get_id() << ",$" << noeud4->get_id() << "," << origine_creation << ");" << std::endl;
219     else if (liaison_topologique->get_dimension()==3) o << "%" << get_id() << "=TETRAEDRE($"<< get_lien_topologie()->get_id() << ",$" << noeud1->get_id() << ",$" << noeud2->get_id() << ",$" << noeud3->get_id() << ",$" << noeud4->get_id() << "," << origine_creation << ");" << std::endl;
220 5 }
221    
222    
223    
224    
225    
226