ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_coque.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 6211 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_coque.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_coque.h"
27 gervaislavoie 328 #include "mg_maillage.h"
28     #include "ot_mathematique.h"
29 francois 283 //#include "message.h"
30    
31     MG_COQUE::MG_COQUE(std::string idori,unsigned long num):MG_ELEMENT_TOPOLOGIQUE(num,idori),num_materiau(-1)
32     {
33     }
34    
35     MG_COQUE::MG_COQUE(std::string idori):MG_ELEMENT_TOPOLOGIQUE(idori),num_materiau(-1)
36     {
37     }
38    
39     MG_COQUE::MG_COQUE(MG_COQUE& mdd):MG_ELEMENT_TOPOLOGIQUE(mdd),lst_coquille(mdd.lst_coquille)
40     {
41     }
42    
43     MG_COQUE::~MG_COQUE()
44     {
45     }
46    
47     void MG_COQUE::ajouter_mg_coquille(class MG_COQUILLE* mgcoq)
48     {
49     lst_coquille.insert(lst_coquille.end(),mgcoq);
50     }
51    
52     void MG_COQUE::supprimer_mg_coquille(class MG_COQUILLE* mgcoq)
53     {
54     std::vector<MG_COQUILLE*>::iterator i;
55     for (i=lst_coquille.begin();i!=lst_coquille.end();i++)
56     {
57     if ((*i)==mgcoq)
58     {
59     lst_coquille.erase(i);
60     return;
61     }
62     }
63     }
64    
65    
66 francois 581 bool MG_COQUE::est_une_coque_element(void)
67     {
68     return false;
69     }
70    
71 francois 283 int MG_COQUE::get_nb_mg_coquille(void)
72     {
73     return lst_coquille.size();
74     }
75    
76     MG_COQUILLE* MG_COQUE::get_mg_coquille(int num)
77     {
78     return lst_coquille[num];
79     }
80    
81     int MG_COQUE::get_dimension(void)
82     {
83     return 2;
84     }
85     void MG_COQUE::get_topologie_sousjacente(TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lst)
86     {
87     int nbcoq=lst_coquille.size();
88     for (int i=0;i<nbcoq;i++)
89     {
90     MG_COQUILLE* coq=lst_coquille[i];
91     int nbface=coq->get_nb_mg_coface();
92     for (int j=0;j<nbface;j++)
93     {
94     MG_FACE* face=coq->get_mg_coface(j)->get_face();
95     lst->ajouter(face);
96     face->get_topologie_sousjacente(lst);
97     }
98     }
99     }
100 francois 763 void MG_COQUE::enregistrer(std::ostream& o,double version)
101 francois 283 {
102     o << "%" << get_id() << "=COQUE(" << get_idoriginal() << ",(";
103     for (unsigned int i=0;i<lst_coquille.size();i++)
104     {
105     o << "$" << lst_coquille[i]->get_id();
106     if (i!=lst_coquille.size()-1) o << ",";
107     else o << ")";
108     }
109     int nb=get_nb_ccf();
110     o << "," << num_materiau << "," << nb;
111     if (nb!=0)
112     {
113     o << ",(";
114     for (int i=0;i<nb;i++)
115     {
116     char nom[3];
117     get_type_ccf(i,nom);
118     o << "(" << nom << "," << get_valeur_ccf(i) << ")";
119     if (i!=nb-1) o << "," ;
120     }
121     o << ")";
122     }
123     o << ");" << std::endl;
124     }
125    
126 gervaislavoie 328 void MG_COQUE::orienter(class MG_MAILLAGE* mai)
127     {
128     double point[3]; // Coordonnées X, Y et Z du point d'orientation
129     int nbccf=get_nb_ccf();
130     for (int k=0;k<nbccf;k++)
131     {
132     char typeccf[2];
133     get_type_ccf(k,typeccf);
134     if (typeccf[0]=='C')
135     {
136     if (typeccf[1]=='x') point[0]=get_valeur_ccf(k);
137     if (typeccf[1]=='y') point[1]=get_valeur_ccf(k);
138     if (typeccf[1]=='z') point[2]=get_valeur_ccf(k);
139     }
140     }
141     double dist_min=1e300;
142     MG_NOEUD* noeud_plus_pres;
143     LISTE_MG_NOEUD::iterator it;
144     for (MG_NOEUD* noeud_actuel=mai->get_premier_noeud(it);noeud_actuel;noeud_actuel=mai->get_suivant_noeud(it))
145     {
146     double *xyz_actuel=noeud_actuel->get_coord();
147     OT_VECTEUR_3D vec_actuel(xyz_actuel,point);
148     double distance_actuelle=vec_actuel.get_longueur();
149     if (distance_actuelle<dist_min)
150     {
151     dist_min=distance_actuelle;
152     noeud_plus_pres=noeud_actuel;
153     }
154     }
155     MG_TRIANGLE* tri=(MG_TRIANGLE*)noeud_plus_pres->get_lien_triangle()->get(0);
156     MG_NOEUD* no1;
157     MG_NOEUD* no2;
158     MG_NOEUD* no3;
159    
160     no1=tri->get_noeud1();
161     no2=tri->get_noeud2();
162     no3=tri->get_noeud3();
163    
164     MG_FACE* face=(MG_FACE*)(tri->get_lien_topologie());
165     double *xyzn1=no1->get_coord();
166     double *xyzn2=no2->get_coord();
167     double *xyzn3=no3->get_coord();
168    
169     // Pour vérifier l'ordre des vecteurs pour le calcul de la normale d'un triangle
170     double uv[2];
171     face->inverser(uv,xyzn1); // Changement de système de coordonnées
172     double normale[3];
173     face->calcul_normale_unitaire(uv,normale);
174    
175     OT_VECTEUR_3D vec1(xyzn1,xyzn3);
176     OT_VECTEUR_3D vec2(xyzn1,xyzn2);
177     OT_VECTEUR_3D norm=vec1&vec2; // Normale au triangle
178     norm.norme();
179     double ps=norm*normale;
180     double *xyz_plus_pres=noeud_plus_pres->get_coord();
181     OT_VECTEUR_3D vec_plus_pres(xyz_plus_pres,point);
182     vec_plus_pres.norme();
183     ps=norm*vec_plus_pres;
184     ps=norm*vec_plus_pres;
185    
186     if (ps<0) // Il faut inverser le signe de la coface
187     {
188     int nbcofaces=get_mg_coquille(0)->get_nb_mg_coface();
189     for (int i=0;i<nbcofaces;i++)
190     {
191     MG_COFACE* cof=get_mg_coquille(0)->get_mg_coface(i);
192     int signe=cof->get_orientation();
193 gervaislavoie 332 MG_FACE* f=cof->get_face();
194     cof->change(f,-1*signe);
195 gervaislavoie 328 }
196     }
197     }
198 francois 632 BOITE_3D MG_COQUE::get_boite_3D(int pas_echantillon)
199     {
200     BOITE_3D boitevol;
201     int nb_coquille=get_nb_mg_coquille();
202     for (int i=0;i<nb_coquille;i++)
203     {
204     MG_COQUILLE* coq=get_mg_coquille(i);
205     int nb_face=coq->get_nb_mg_coface();
206     for (int j=0;j<nb_face;j++)
207     {
208     MG_FACE* face=coq->get_mg_coface(j)->get_face();
209     BOITE_3D tmp=face->get_boite_3D(pas_echantillon);
210     if ((i==0) && (j==0)) boitevol=tmp;
211     else boitevol=tmp+boitevol;
212     }
213     }
214     return boitevol;
215     }
216 francois 283 void MG_COQUE::change_num_materiau(int num)
217     {
218     num_materiau=num;
219     }
220    
221     int MG_COQUE::get_num_materiau(void)
222     {
223     return num_materiau;
224     }
225    
226     VCT& MG_COQUE::get_vectorisation(void)
227     {
228     VCT *p=NULL;
229     return *p;
230     }