ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_tetra.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 9275 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
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     // mg_tetra.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mg_tetra.h"
27     #include "mg_maillage.h"
28    
29     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     {
31     init_tetra();
32     }
33    
34     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     {
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     MG_TETRA* tet=new MG_TETRA(this->get_id()+decalage,liaison_topologique,nd1,nd2,nd3,nd4,tri1,tri2,tri3,tri4,DUPLIQUER);
56     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) {
78     triangle1->decrementer();
79     triangle1->get_lien_tetra()->supprimer(this);
80     }
81     if (triangle2!=NULL) {
82     triangle2->decrementer();
83     triangle2->get_lien_tetra()->supprimer(this);
84     }
85     if (triangle3!=NULL) {
86     triangle3->decrementer();
87     triangle3->get_lien_tetra()->supprimer(this);
88     }
89     if (triangle4!=NULL) {
90     triangle4->decrementer();
91     triangle4->get_lien_tetra()->supprimer(this);
92     }
93 francois 663 if (liaison_topologique!=NULL)
94     if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_maillage()->supprimer(this);
95 francois 283 }
96    
97     void MG_TETRA::init_tetra(void)
98     {
99     if (noeud1!=NULL) noeud1->get_lien_tetra()->ajouter(this);
100     if (noeud2!=NULL) noeud2->get_lien_tetra()->ajouter(this);
101     if (noeud3!=NULL) noeud3->get_lien_tetra()->ajouter(this);
102     if (noeud4!=NULL) noeud4->get_lien_tetra()->ajouter(this);
103     unsigned long noeudminid=std::min(noeud1->get_id(),noeud2->get_id());
104     noeudminid=std::min(noeudminid,noeud3->get_id());
105     noeudminid=std::min(noeudminid,noeud4->get_id());
106     if (noeud1!=NULL)
107     if (noeud1->get_id()==noeudminid) noeud1->get_lien_petit_tetra()->ajouter(this);
108     if (noeud2!=NULL)
109     if (noeud2->get_id()==noeudminid) noeud2->get_lien_petit_tetra()->ajouter(this);
110     if (noeud3!=NULL)
111     if (noeud3->get_id()==noeudminid) noeud3->get_lien_petit_tetra()->ajouter(this);
112     if (noeud4!=NULL)
113     if (noeud4->get_id()==noeudminid) noeud4->get_lien_petit_tetra()->ajouter(this);
114     if (triangle1!=NULL) {
115     triangle1->incrementer();
116     triangle1->get_lien_tetra()->ajouter(this);
117     }
118     if (triangle2!=NULL) {
119     triangle2->incrementer();
120     triangle2->get_lien_tetra()->ajouter(this);
121     }
122     if (triangle3!=NULL) {
123     triangle3->incrementer();
124     triangle3->get_lien_tetra()->ajouter(this);
125     }
126     if (triangle4!=NULL) {
127     triangle4->incrementer();
128     triangle4->get_lien_tetra()->ajouter(this);
129     }
130     if (liaison_topologique==NULL) return;
131     if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_maillage()->ajouter(this);
132     }
133    
134    
135     int MG_TETRA::get_type_entite(void)
136     {
137     return IDMG_TETRA;
138     }
139    
140    
141    
142    
143    
144     MG_NOEUD* MG_TETRA::get_noeud1(void)
145     {
146     return noeud1;
147     }
148    
149     MG_NOEUD* MG_TETRA::get_noeud2(void)
150     {
151     return noeud2;
152     }
153    
154     MG_NOEUD* MG_TETRA::get_noeud3(void)
155     {
156     return noeud3;
157     }
158    
159     MG_NOEUD* MG_TETRA::get_noeud4(void)
160     {
161     return noeud4;
162     }
163    
164     MG_TRIANGLE* MG_TETRA::get_triangle1(void)
165     {
166     return triangle1;
167     }
168    
169     MG_TRIANGLE* MG_TETRA::get_triangle2(void)
170     {
171     return triangle2;
172     }
173    
174     MG_TRIANGLE* MG_TETRA::get_triangle3(void)
175     {
176     return triangle3;
177     }
178    
179     MG_TRIANGLE* MG_TETRA::get_triangle4(void)
180     {
181     return triangle4;
182     }
183    
184 francois 702 void MG_TETRA::inverse_sens(void)
185     {
186     MG_NOEUD* noeud=noeud4;
187     noeud4=noeud3;
188     noeud3=noeud;
189     MG_TRIANGLE* triangle=triangle1;
190     triangle1=triangle2;
191     triangle2=triangle;
192     }
193 francois 283
194 francois 702
195 francois 283 int MG_TETRA::get_dimension(void)
196     {
197     return 3;
198     }
199    
200    
201     BOITE_3D MG_TETRA::get_boite_3D(void)
202     {
203     double coo1[3];
204     double coo2[3];
205     double coo3[3];
206     double coo4[3];
207     coo1[0]=noeud1->get_x();
208     coo1[1]=noeud1->get_y();
209     coo1[2]=noeud1->get_z();
210     coo2[0]=noeud2->get_x();
211     coo2[1]=noeud2->get_y();
212     coo2[2]=noeud2->get_z();
213     coo3[0]=noeud3->get_x();
214     coo3[1]=noeud3->get_y();
215     coo3[2]=noeud3->get_z();
216     coo4[0]=noeud4->get_x();
217     coo4[1]=noeud4->get_y();
218     coo4[2]=noeud4->get_z();
219     double xmin,ymin,zmin,xmax,ymax,zmax;
220     xmin=std::min(coo1[0],coo2[0]);
221     xmin=std::min(xmin,coo3[0]);
222     xmin=std::min(xmin,coo4[0]);
223     xmax=std::max(coo1[0],coo2[0]);
224     xmax=std::max(xmax,coo3[0]);
225     xmax=std::max(xmax,coo4[0]);
226     ymin=std::min(coo1[1],coo2[1]);
227     ymin=std::min(ymin,coo3[1]);
228     ymin=std::min(ymin,coo4[1]);
229     ymax=std::max(coo1[1],coo2[1]);
230     ymax=std::max(ymax,coo3[1]);
231     ymax=std::max(ymax,coo4[1]);
232     zmin=std::min(coo1[2],coo2[2]);
233     zmin=std::min(zmin,coo3[2]);
234     zmin=std::min(zmin,coo4[2]);
235     zmax=std::max(coo1[2],coo2[2]);
236     zmax=std::max(zmax,coo3[2]);
237     zmax=std::max(zmax,coo4[2]);
238     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
239     return boite;
240     }
241     void MG_TETRA::extrapoler_solution_noeud(void)
242     {
243 francois 377 for (int j=0;j<MAX_TYPE_SOLUTION;j++)
244     {
245     noeud1->change_solution(solution[j],j);
246     noeud2->change_solution(solution[j],j);
247     noeud3->change_solution(solution[j],j);
248     noeud4->change_solution(solution[j],j);
249     }
250 francois 283 }
251    
252 francois 763 void MG_TETRA::enregistrer(std::ostream& o,double version)
253 francois 283 {
254     if ((liaison_topologique==NULL) && (MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO!=3)) return;
255     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;
256     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;
257     }
258    
259    
260    
261    
262    
263