ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_boucle.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 13899 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_boucle.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_boucle.h"
27     #include "ot_mathematique.h"
28 francois 375 #include "mg_definition.h"
29 francois 283 #include <math.h>
30     //#include "message.h"
31    
32     MG_BOUCLE::MG_BOUCLE(unsigned long num,class MG_FACE* mgface):MG_ELEMENT_COTOPOLOGIQUE(num),face(mgface),poutre(NULL)
33     {
34     }
35    
36    
37     MG_BOUCLE::MG_BOUCLE(class MG_FACE* mgface):MG_ELEMENT_COTOPOLOGIQUE(),face(mgface),poutre(NULL)
38     {
39     }
40    
41     MG_BOUCLE::MG_BOUCLE(unsigned long num,class MG_POUTRE* mgpou):MG_ELEMENT_COTOPOLOGIQUE(num),face(NULL),poutre(mgpou)
42     {
43     }
44    
45    
46     MG_BOUCLE::MG_BOUCLE(class MG_POUTRE* mgpou):MG_ELEMENT_COTOPOLOGIQUE(),face(NULL),poutre(mgpou)
47     {
48     }
49    
50    
51     MG_BOUCLE::MG_BOUCLE(MG_BOUCLE& mdd):MG_ELEMENT_COTOPOLOGIQUE(),face(mdd.face),lst_coarete(mdd.lst_coarete)
52     {
53     }
54    
55    
56     MG_BOUCLE::~MG_BOUCLE()
57     {
58     }
59    
60    
61     void MG_BOUCLE::ajouter_mg_coarete(class MG_COARETE* mgcoarete)
62     {
63     lst_coarete.insert(lst_coarete.end(),mgcoarete);
64     }
65    
66     int MG_BOUCLE::get_nb_mg_coarete(void)
67     {
68     return lst_coarete.size();
69     }
70    
71    
72     MG_COARETE* MG_BOUCLE::get_mg_coarete(int num)
73     {
74     return lst_coarete[num];
75     }
76    
77     void MG_BOUCLE::supprimer_mg_coarete(class MG_COARETE* mgcoarete)
78     {
79     std::vector<MG_COARETE*>::iterator i;
80     for (i=lst_coarete.begin();i!=lst_coarete.end();i++)
81     {
82     if ((*i)==mgcoarete)
83     {
84     lst_coarete.erase(i);
85     return;
86     }
87     }
88     }
89    
90     MG_FACE* MG_BOUCLE::get_mg_face(void)
91     {
92     return face;
93     }
94    
95     MG_COARETE* MG_BOUCLE::get_mg_coarete_suivante(MG_COARETE* coare)
96     {
97     MG_COARETE* coaretesuivante=NULL;
98     MG_SOMMET* mgsommet;
99     if (coare->get_orientation()==MEME_SENS) mgsommet=coare->get_arete()->get_cosommet2()->get_sommet();
100     else mgsommet=coare->get_arete()->get_cosommet1()->get_sommet();
101     double xyz[3];
102     mgsommet->get_point()->evaluer(xyz);
103     int nb=lst_coarete.size();
104     MG_COARETE* mgcoaretetmp=NULL;
105     double angleref=0.;
106     double angleref2=0.;
107     int trouve=0;
108     for (int i=0;i<nb;i++)
109     {
110     MG_COARETE* mgcoarete_suivante=lst_coarete[i];
111     MG_SOMMET* mgsommet_suivant;
112     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
113     else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
114     if (mgsommet==mgsommet_suivant)
115     {
116     if (trouve==0)
117     {
118     trouve=1;
119     mgcoaretetmp=mgcoarete_suivante;
120     }
121     else
122     {
123     //angleref
124     double uv[2];
125     face->inverser(uv,xyz);
126     double normal[3];
127     face->calcul_normale_unitaire(uv,normal);
128     double dir1[3];
129     double dir2[3];
130     MG_COSOMMET* mgcosommet;
131     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet2();
132     else mgcosommet=coare->get_arete()->get_cosommet1();
133     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
134     if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
135     else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
136     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
137     int sens1=coare->get_orientation();
138     int sens2=mgcoaretetmp->get_orientation();
139     OT_VECTEUR_3D vec1(-dir1[0]*sens1,-dir1[1]*sens1,-dir1[2]*sens1);
140     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
141     vec1.norme();
142     vec2.norme();
143     OT_VECTEUR_3D nor=normal&vec1;
144     double cs=vec1*vec2;
145     double sn=-1*(vec2*nor);
146     angleref=acos(cs);
147     if (sn<0) angleref=-angleref;
148     if (angleref<0) angleref=angleref+2.*M_PI;
149     if (coare->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
150     if (angleref<1e-10)
151     {
152     double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmin());
153     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
154     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
155     vec2.norme();
156     double cs=vec1*vec2;
157     double sn=-1*(vec2*nor);
158     angleref=acos(cs);
159     if (sn<0) angleref2=-angleref2;
160     if (angleref<0) angleref2=angleref2+2.*M_PI;
161     }
162     //angle
163     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet2();
164     else mgcosommet=coare->get_arete()->get_cosommet1();
165     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
166     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
167     else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
168     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
169     sens1=coare->get_orientation();
170     sens2=mgcoarete_suivante->get_orientation();
171     vec1.change_x(-dir1[0]*sens1);
172     vec1.change_y(-dir1[1]*sens1);
173     vec1.change_z(-dir1[2]*sens1);
174     vec2.change_x(dir2[0]*sens2);
175     vec2.change_y(dir2[1]*sens2);
176     vec2.change_z(dir2[2]*sens2);
177     vec1.norme();
178     vec2.norme();
179     nor=normal&vec1;
180     cs=vec1*vec2;
181     sn=-1*(vec2*nor);
182     double angle=acos(cs);
183     if (sn<0) angle=-angle;
184     if (angle<0) angle=angle+2.*M_PI;
185     if (coare->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
186     if (angle<angleref)
187     {
188     angleref=angle;
189     mgcoaretetmp=mgcoarete_suivante;
190     }
191     else if ((angle<1e-10) && (angleref<1e-10))
192     {
193     double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmin());
194     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
195     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
196     vec2.norme();
197     double cs=vec1*vec2;
198     double sn=-1*(vec2*nor);
199     angle=acos(cs);
200     if (sn<0) angle=-angle;
201     if (angle<0) angle=angle+2.*M_PI;
202     if (angle<angleref2)
203     mgcoaretetmp=mgcoarete_suivante;
204    
205     }
206    
207     }
208     }
209     }
210     coaretesuivante=mgcoaretetmp;
211     return coaretesuivante;
212     }
213    
214     MG_COARETE* MG_BOUCLE::get_mg_coarete_precedente(MG_COARETE* coare)
215     {
216     MG_COARETE* coareteprecedente=NULL;
217     MG_SOMMET* mgsommet;
218     if (coare->get_orientation()==MEME_SENS) mgsommet=coare->get_arete()->get_cosommet1()->get_sommet();
219     else mgsommet=coare->get_arete()->get_cosommet2()->get_sommet();
220     double xyz[3];
221     mgsommet->get_point()->evaluer(xyz);
222     int nb=lst_coarete.size();
223     MG_COARETE* mgcoaretetmp=NULL;
224     double angleref=0.;
225     double angleref2=0.;
226     int trouve=0;
227     for (int i=0;i<nb;i++)
228     {
229     MG_COARETE* mgcoarete_suivante=lst_coarete[i];
230     MG_SOMMET* mgsommet_suivant;
231     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
232     else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
233     if (mgsommet==mgsommet_suivant)
234     {
235     if (trouve==0)
236     {
237     trouve=1;
238     mgcoaretetmp=mgcoarete_suivante;
239     }
240     else
241     {
242     //angleref
243     double uv[2];
244     face->inverser(uv,xyz);
245     double normal[3];
246     face->calcul_normale_unitaire(uv,normal);
247     double dir1[3];
248     double dir2[3];
249     MG_COSOMMET* mgcosommet;
250     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet1();
251     else mgcosommet=coare->get_arete()->get_cosommet2();
252     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
253     if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
254     else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
255     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
256     int sens1=coare->get_orientation();
257     int sens2=mgcoaretetmp->get_orientation();
258     OT_VECTEUR_3D vec1(dir1[0]*sens1,dir1[1]*sens1,dir1[2]*sens1);
259     OT_VECTEUR_3D vec2(-dir2[0]*sens2,-dir2[1]*sens2,-dir2[2]*sens2);
260     vec1.norme();
261     vec2.norme();
262     OT_VECTEUR_3D nor=normal&vec1;
263     double cs=vec1*vec2;
264     double sn=-1*(vec2*nor);
265     angleref=acos(cs);
266     if (sn<0) angleref=-angleref;
267     if (angleref<0) angleref=angleref+2.*M_PI;
268     if (coare->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
269     if (angleref<1e-10)
270     {
271     double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmin());
272     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
273     OT_VECTEUR_3D vec2(-dir2[0]*sens2,-dir2[1]*sens2,-dir2[2]*sens2);
274     vec2.norme();
275     double cs=vec1*vec2;
276     double sn=-1*(vec2*nor);
277     angleref=acos(cs);
278     if (sn<0) angleref2=-angleref2;
279     if (angleref<0) angleref2=angleref2+2.*M_PI;
280     }
281     //angle
282     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet1();
283     else mgcosommet=coare->get_arete()->get_cosommet2();
284     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
285     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
286     else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
287     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
288     sens1=coare->get_orientation();
289     sens2=mgcoarete_suivante->get_orientation();
290     vec1.change_x(dir1[0]*sens1);
291     vec1.change_y(dir1[1]*sens1);
292     vec1.change_z(dir1[2]*sens1);
293     vec2.change_x(-dir2[0]*sens2);
294     vec2.change_y(-dir2[1]*sens2);
295     vec2.change_z(-dir2[2]*sens2);
296     vec1.norme();
297     vec2.norme();
298     nor=normal&vec1;
299     cs=vec1*vec2;
300     sn=-1*(vec2*nor);
301     double angle=acos(cs);
302     if (sn<0) angle=-angle;
303     if (angle<0) angle=angle+2.*M_PI;
304     if (coare->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
305     if (angle<angleref)
306     {
307     angleref=angle;
308     mgcoaretetmp=mgcoarete_suivante;
309     }
310     else if ((angle<1e-10) && (angleref<1e-10))
311     {
312     double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmin());
313     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
314     OT_VECTEUR_3D vec2(-dir2[0]*sens2,-dir2[1]*sens2,-dir2[2]*sens2);
315     vec2.norme();
316     double cs=vec1*vec2;
317     double sn=-1*(vec2*nor);
318     angle=acos(cs);
319     if (sn<0) angle=-angle;
320     if (angle<0) angle=angle+2.*M_PI;
321     if (angle<angleref2)
322     mgcoaretetmp=mgcoarete_suivante;
323    
324     }
325    
326     }
327     }
328     }
329     coareteprecedente=mgcoaretetmp;
330     return coareteprecedente;
331     }
332    
333 francois 763 void MG_BOUCLE::enregistrer(std::ostream& o,double version)
334 francois 283 {
335     if (face!=NULL) o << "%" << get_id() << "=BOUCLE($"<< face->get_id() << ",(";
336     if (poutre!=NULL) o << "%" << get_id() << "=BOUCLE($"<< poutre->get_id() << ",(";
337     for (unsigned int i=0;i<lst_coarete.size();i++)
338     {
339     o << "$" << lst_coarete[i]->get_id();
340     if (i!=lst_coarete.size()-1) o << ",";
341     else o << ")";
342     }
343     o << ");" << std::endl;
344     }
345    
346    
347    
348