ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/optimisation/src/opt_noeud.cpp
Revision: 495
Committed: Thu Mar 20 19:43:02 2014 UTC (11 years, 1 month ago) by gervaislavoie
File size: 4467 byte(s)
Log Message:
Mise a jour de la methode du mouvement normal.

Minimisation, par l'algorithme du gradient, d'une fonction f definie comme la somme de la difference au carre entre la norme du gradient de deplacement de chaque triangle et la valeur seuil imposee.

La methode fonctionne globalement mais il reste quelques problemes mineurs:

- Gradient non respecte si plus d'un noeud d'un triangle, ayant 3 noeuds mobiles au debut de l'iteration, sont bloques au cours de cette iteration (l'algo diverge).

- Gradient non respecte pour certains noeuds reintegres au processus d'optimisation et dont tous les noeuds voisins sont fixes (l'algo diverge).

File Contents

# User Rev Content
1 gervaislavoie 332 #include "gestionversion.h"
2 francois 470 #include "fem_noeud.h"
3 gervaislavoie 332 #include "mg_maillage.h"
4     #include "opt_noeud.h"
5    
6    
7 francois 470 OPT_NOEUD::OPT_NOEUD(FEM_NOEUD* noeud):fem_noeud(noeud)
8 gervaislavoie 332 {
9 francois 470 xyz0[0]=fem_noeud->get_x();
10     xyz0[1]=fem_noeud->get_y();
11     xyz0[2]=fem_noeud->get_z();
12    
13 gervaislavoie 495 normale[0]=0.; //Enlever
14 francois 470 normale[1]=0.;
15     normale[2]=0.;
16    
17 gervaislavoie 495 normale_initiale[0]=0.; //Enlever
18 francois 470 normale_initiale[1]=0.;
19     normale_initiale[2]=0.;
20 gervaislavoie 332 }
21    
22 francois 470 OPT_NOEUD::OPT_NOEUD(OPT_NOEUD& mdd):fem_noeud(mdd.fem_noeud)
23 gervaislavoie 332 {
24 francois 470 xyz0[0]=mdd.get_x_initial();
25     xyz0[1]=mdd.get_y_initial();
26     xyz0[2]=mdd.get_z_initial();
27    
28     normale[0]=mdd.normale[0];
29     normale[1]=mdd.normale[1];
30     normale[2]=mdd.normale[2];
31    
32     normale_initiale[0]=mdd.normale_initiale[0];
33     normale_initiale[1]=mdd.normale_initiale[1];
34     normale_initiale[2]=mdd.normale_initiale[2];
35 gervaislavoie 332 }
36    
37     OPT_NOEUD::~OPT_NOEUD()
38 francois 470 {
39    
40 gervaislavoie 332 }
41    
42 francois 470 FEM_NOEUD* OPT_NOEUD::get_fem_noeud(void)
43     {
44     return fem_noeud;
45     }
46    
47 gervaislavoie 332 int OPT_NOEUD::get_num(void)
48     {
49     return num;
50     }
51    
52     void OPT_NOEUD::change_num(int val)
53     {
54 gervaislavoie 398 num=val;
55 gervaislavoie 332 }
56    
57 gervaislavoie 495 int OPT_NOEUD::get_mvt_normal(void)
58 gervaislavoie 398 {
59 gervaislavoie 495 return mvt_normal;
60 gervaislavoie 398 }
61 gervaislavoie 495 void OPT_NOEUD::change_mvt_normal(int mvt)
62     {
63     mvt_normal=mvt;
64     }
65 gervaislavoie 398
66 gervaislavoie 495 /*int OPT_NOEUD::get_contrainte(void)
67 gervaislavoie 398 {
68 gervaislavoie 495 return contrainte;
69 gervaislavoie 398 }
70    
71 gervaislavoie 495 void OPT_NOEUD::change_contrainte(int cont)
72 gervaislavoie 398 {
73 gervaislavoie 495 contrainte=cont;
74     }*/
75    
76     int OPT_NOEUD::get_gradient(void)
77     {
78     return gradient;
79 francois 470 }
80    
81 gervaislavoie 495 void OPT_NOEUD::change_gradient(int grad)
82 francois 470 {
83 gervaislavoie 495 gradient=grad;
84 francois 470 }
85    
86 gervaislavoie 495 /*int OPT_NOEUD::get_fixe_au_depart(void)
87 francois 470 {
88 gervaislavoie 495 return fixe_au_depart;
89 gervaislavoie 398 }
90    
91 gervaislavoie 495 void OPT_NOEUD::change_fixe_au_depart(int fixe)
92 gervaislavoie 398 {
93 gervaislavoie 495 fixe_au_depart=fixe;
94     }*/
95    
96     int OPT_NOEUD::get_mobile_au_depart(void)
97     {
98     return mobile_au_depart;
99 gervaislavoie 398 }
100    
101 gervaislavoie 495 void OPT_NOEUD::change_mobile_au_depart(int mob)
102     {
103     mobile_au_depart=mob;
104     }
105    
106     int OPT_NOEUD::get_mobile(void)
107     {
108     return mobile;
109     }
110    
111     void OPT_NOEUD::change_mobile(int mob)
112     {
113     mobile=mob;
114     }
115    
116     int OPT_NOEUD::get_a_replacer(void)
117     {
118     return a_replacer;
119     }
120    
121     void OPT_NOEUD::change_a_replacer(int replacer)
122     {
123     a_replacer=replacer;
124     }
125    
126     int OPT_NOEUD::get_a_ete_replace(void)
127     {
128     return a_ete_replace;
129     }
130    
131     void OPT_NOEUD::change_a_ete_replace(int replace)
132     {
133     a_ete_replace=replace;
134     }
135    
136 francois 470 double OPT_NOEUD::get_terme_gradient_f(void)
137 gervaislavoie 398 {
138     return terme_gradient_f;
139     }
140    
141     void OPT_NOEUD::change_terme_gradient_f(double valeur)
142     {
143     terme_gradient_f=valeur;
144     }
145    
146 gervaislavoie 495 double OPT_NOEUD::get_sol_deplacement(void )
147     {
148     return sol_deplacement;
149     }
150    
151     void OPT_NOEUD::change_sol_deplacement(double deplacement)
152     {
153     sol_deplacement=deplacement;
154     }
155    
156 gervaislavoie 332 unsigned long OPT_NOEUD::get_id(void)
157     {
158 francois 470 return fem_noeud->get_id();
159 gervaislavoie 332 }
160    
161     double OPT_NOEUD::get_x(void)
162     {
163 francois 470 return fem_noeud->get_x();
164 gervaislavoie 332 }
165    
166     double OPT_NOEUD::get_y(void)
167     {
168 francois 470 return fem_noeud->get_y();
169 gervaislavoie 332 }
170    
171     double OPT_NOEUD::get_z(void)
172     {
173 francois 470 return fem_noeud->get_z();
174 gervaislavoie 332 }
175    
176 gervaislavoie 398 double OPT_NOEUD::get_x_initial(void)
177     {
178 francois 470 return xyz0[0];
179 gervaislavoie 398 }
180    
181     double OPT_NOEUD::get_y_initial(void)
182     {
183 francois 470 return xyz0[1];
184 gervaislavoie 398 }
185    
186     double OPT_NOEUD::get_z_initial(void)
187     {
188 francois 470 return xyz0[2];
189 gervaislavoie 398 }
190    
191 gervaislavoie 332 double* OPT_NOEUD::get_coord(void)
192     {
193 francois 470 return fem_noeud->get_coord();
194 gervaislavoie 332 }
195    
196 francois 470 double OPT_NOEUD::get_norme_orientee_deplacement(void)
197     {
198     return norme_orientee_deplacement;
199     }
200 gervaislavoie 332
201 francois 470 void OPT_NOEUD::change_norme_orientee_deplacement(void)
202     {
203     OT_VECTEUR_3D n=get_normale_initiale();
204     OT_VECTEUR_3D D(get_x()-get_x_initial(),get_y()-get_y_initial(),get_z()-get_z_initial());
205    
206     int signe=1;
207     double ps_D_n=D*n;
208     if (ps_D_n<0)
209     signe=-1;
210     norme_orientee_deplacement=D.get_longueur()*signe;
211     }
212    
213 gervaislavoie 332 void OPT_NOEUD::change_normale(OT_VECTEUR_3D vec)
214     {
215     normale=vec;
216     }
217    
218     OT_VECTEUR_3D OPT_NOEUD::get_normale(void)
219     {
220     return normale;
221     }
222    
223     OT_VECTEUR_3D OPT_NOEUD::get_normale_initiale(void)
224     {
225 gervaislavoie 398 return normale_initiale;
226 gervaislavoie 332 }
227    
228     void OPT_NOEUD::change_normale_initiale(void)
229     {
230 gervaislavoie 398 normale_initiale=normale;
231 gervaislavoie 332 }
232    
233     void OPT_NOEUD::change_x(double xx)
234     {
235 francois 470 fem_noeud->change_x(xx);
236 gervaislavoie 332 }
237    
238     void OPT_NOEUD::change_y(double yy)
239     {
240 francois 470 fem_noeud->change_y(yy);
241 gervaislavoie 332 }
242    
243     void OPT_NOEUD::change_z(double zz)
244     {
245 francois 470 fem_noeud->change_z(zz);
246 gervaislavoie 332 }
247    
248 gervaislavoie 398 void OPT_NOEUD::change_x_initial(double x_initial)
249     {
250 francois 470 xyz0[0]=x_initial;
251 gervaislavoie 398 }
252    
253     void OPT_NOEUD::change_y_initial(double y_initial)
254     {
255 francois 470 xyz0[1]=y_initial;
256 gervaislavoie 398 }
257    
258     void OPT_NOEUD::change_z_initial(double z_initial)
259     {
260 francois 470 xyz0[2]=z_initial;
261 gervaislavoie 398 }
262    
263 gervaislavoie 332 void OPT_NOEUD::change_coord(double *coo)
264     {
265 francois 470 fem_noeud->change_coord(coo);
266 gervaislavoie 332 }
267    
268 francois 470 void OPT_NOEUD::change_solution(double val)
269 gervaislavoie 332 {
270 francois 470 fem_noeud->change_solution(val);
271 gervaislavoie 332 }
272    
273     double OPT_NOEUD::get_solution(void)
274     {
275 francois 470 fem_noeud->get_solution();
276 gervaislavoie 332 }