ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_tenseur.cpp
Revision: 151
Committed: Tue Sep 9 18:51:20 2008 UTC (16 years, 8 months ago) by souaissa
Original Path: magic/lib/outil/outil/src/ot_tenseur.cpp
File size: 12561 byte(s)
Log Message:
mise a jour des classes outils

File Contents

# User Rev Content
1 souaissa 58 //---------------------------------------------------------------------------
2 francois 17 #include "gestionversion.h"
3    
4     #pragma hdrstop
5 souaissa 58
6 francois 17 #include "ot_tenseur.h"
7 souaissa 58
8     #include <iomanip>
9 francois 102 //#include <conio.h>
10 souaissa 58 #include <stdio.h>
11 souaissa 69 #include <assert.h>
12 souaissa 86 #include <math.h>
13 francois 17 //---------------------------------------------------------------------------
14 souaissa 58
15 francois 17 #pragma package(smart_init)
16    
17    
18    
19 souaissa 69
20     OT_TENSEUR::OT_TENSEUR()
21 souaissa 58 {
22 souaissa 69 Dim1=0;
23     Dim2=0;
24 souaissa 70 data=0;
25 souaissa 58 }
26 souaissa 70
27 souaissa 69 OT_TENSEUR::OT_TENSEUR(int n)
28 souaissa 58 {
29 souaissa 69 Dim1=n;
30     Dim2=n;
31 souaissa 80 double2 zero(0.);
32 souaissa 70 data =new double2[n*n];
33 souaissa 80 for(int i=0;i<Dim1*Dim2;i++) data[i]=zero;
34 souaissa 70 }
35    
36 souaissa 69 OT_TENSEUR::OT_TENSEUR(int n,int m)
37 francois 17 {
38 souaissa 69 Dim1=n;
39     Dim2=m;
40 souaissa 80 double2 zero(0.);
41 souaissa 70 data =new double2[n*m];
42 souaissa 80 for(int i=0;i<Dim1*Dim2;i++) data[i]=zero;
43 souaissa 58 }
44 souaissa 70
45    
46    
47 souaissa 69 OT_TENSEUR:: OT_TENSEUR(vector<OT_VECTEUR_4DD>& v)
48 francois 17 {
49 souaissa 70
50 souaissa 69 Dim1=v.size();
51     Dim2=Dim1;
52 souaissa 86 double2 zero=0.;
53 souaissa 93 double2 prec=1e-6;
54     prec.set_dx(1e-8);
55 souaissa 86 double2 c=0.5;
56 souaissa 93 OT_VECTEUR_4DD VCT_NUL(1e-7,1e-7,1e-7,1e-7), w;
57 souaissa 69 int Dim= Dim1*Dim2 ;
58 souaissa 70 data=new double2[Dim];
59     for(int i=0;i<Dim1;i++)
60     {
61     OT_VECTEUR_4DD z1=v[i];
62     for (int j=0;j<Dim2;j++)
63     {
64     OT_VECTEUR_4DD z2=v[j];
65     double2 prscal=z1*z2;
66 souaissa 86 w=z1^z2;
67 souaissa 93 double2 wnorm=w.norme();
68     if(wnorm<prec)
69 souaissa 86 {
70     if(prscal<zero && prscal.get_fabs()>c) prscal= -1.;
71     if(prscal>zero && prscal.get_fabs()>c) prscal= 1.;
72     if(prscal<zero && prscal.get_fabs()<c) prscal= 0.;
73     if(prscal>zero && prscal.get_fabs()<c) prscal= 0.;
74     }
75 souaissa 80 double2 val= prscal.get_fabs();
76     if(val.get_x()<=val.get_dx()) {
77     prscal=0.;
78     prscal.set_dx(val.get_dx());
79     }
80 souaissa 70 data[i*Dim2+j]=prscal;
81     }
82 souaissa 69 }
83 francois 17
84    
85     }
86    
87 souaissa 69 OT_TENSEUR::OT_TENSEUR(vector<OT_VECTEUR_4DD>&v1,vector<OT_VECTEUR_4DD>&v2)
88 souaissa 58 {
89 francois 17
90 souaissa 69 Dim1=v1.size();
91     Dim2=v2.size();
92     int Dim= Dim1*Dim2 ;
93 souaissa 70 data=new double2[Dim];
94     for(int i=0;i<Dim1;i++)
95     {
96     OT_VECTEUR_4DD z1=v1[i];
97     for (int j=0;j<Dim2;j++)
98     {
99     OT_VECTEUR_4DD z2=v2[j];
100     double2 prscal=z1*z2;
101 souaissa 80 double2 val= prscal.get_fabs();
102     if(val.get_x()<=val.get_dx()) {
103     prscal=0.;
104     prscal.set_dx(val.get_dx());
105     }
106 souaissa 70 data[i*Dim2+j]=prscal;
107     }
108 souaissa 69 }
109 francois 17
110 souaissa 69
111 souaissa 58 }
112 francois 17
113 souaissa 69
114     OT_TENSEUR::~OT_TENSEUR()
115 souaissa 58 {
116 souaissa 69 Dim1=0;
117     Dim2=0;
118 souaissa 70
119     if (data!=NULL) delete [] data;
120 souaissa 58 }
121 francois 17
122    
123 souaissa 69 OT_TENSEUR::OT_TENSEUR(const OT_TENSEUR& ot)
124 francois 17 {
125 souaissa 69 Dim1=ot.Dim1;
126     Dim2=ot.Dim2;
127 souaissa 70 data=new double2[Dim1*Dim2];
128    
129     for(int i=0;i<Dim1;i++)
130     {
131     for (int j=0;j<Dim2;j++)
132     {
133     data[i*Dim2+j]=ot(i,j);
134     }
135     }
136 francois 17 }
137    
138 souaissa 58
139 souaissa 69 OT_TENSEUR& OT_TENSEUR:: operator =(const OT_TENSEUR& ot)
140 francois 17 {
141 souaissa 58
142 souaissa 69 if(this==&ot) return *this ;
143 souaissa 70
144     if(data) delete [] data;
145    
146 souaissa 69 Dim1=ot.Dim1;
147     Dim2=ot.Dim2;
148 souaissa 70 data=new double2[Dim1*Dim2];
149    
150     for(int i=0;i<Dim1;i++) {
151     for (int j=0;j<Dim2;j++) {
152     data[i*Dim2+j]=ot.data[i*Dim2+j];
153     }
154     }
155    
156    
157 souaissa 69 return *this;
158 francois 17 }
159    
160 souaissa 69 int operator==( OT_TENSEUR& t1, OT_TENSEUR&t2)
161 francois 17 {
162 souaissa 69 if(t1.Get_NbRows()!=t2.Get_NbRows()||t1.Get_NbCols()!=t2.Get_NbCols()) return 0;
163 souaissa 58 else {
164 souaissa 69 for(int i=0;i<t1.Get_NbRows();i++)
165 souaissa 58 {
166 souaissa 69 for(int j=0;j<t1.Get_NbCols();j++)
167 souaissa 58 {
168 souaissa 75 double2 val1=t1(i,j);
169     double2 val2=t2(i,j);
170     if(val1==val2) continue;
171     else return 0;
172 souaissa 58 }
173 francois 17
174 souaissa 58 }
175     }
176     return 1;
177     }
178 francois 17
179    
180 souaissa 69
181     double2&OT_TENSEUR:: operator()(int i,int j)
182 souaissa 58 {
183 souaissa 69 assert(i<Dim1&&j<Dim2);
184 souaissa 80 double2 prciseion=0.0;
185     if(data[i*Dim2+j].get_fabs()<=prciseion)
186     {
187     data[i*Dim2+j]=0.;
188 souaissa 69
189 souaissa 80 }
190 souaissa 70 return data[i*Dim2+j];
191 souaissa 58 }
192 francois 17
193    
194 souaissa 70
195     double2& OT_TENSEUR:: operator()(int i,int j)const
196 souaissa 58 {
197 souaissa 69 assert(i<Dim1&&j<Dim2);
198 souaissa 80 double2 prciseion=0.0;
199     if(data[i*Dim2+j].get_fabs()<=prciseion)
200     {
201     data[i*Dim2+j]=0.;
202 souaissa 69
203 souaissa 80 }
204 souaissa 70 return data[i*Dim2+j];
205 souaissa 58 }
206 francois 17
207 souaissa 58
208 souaissa 70
209 souaissa 69 int OT_TENSEUR:: Get_NbRows()const
210 francois 17 {
211 souaissa 69 return Dim1;
212 francois 17 }
213    
214 souaissa 69
215    
216     int OT_TENSEUR:: Get_NbCols()const
217 souaissa 58 {
218 souaissa 69 return Dim2;
219 souaissa 58 }
220 francois 17
221    
222 souaissa 58
223 souaissa 70 int OT_TENSEUR:: est_til_equivalent( OT_TENSEUR& tns)
224 souaissa 58 {
225 souaissa 86
226     if (Dim1!=tns.Get_NbRows()||Dim2!=tns.Get_NbCols()) return 0;
227 souaissa 58 vector<int> check;
228    
229 souaissa 69 for(int i=0;i<tns.Get_NbRows();i++)
230 souaissa 58 {
231    
232 souaissa 69 vector<double2> lig1;
233     for(int ix1=0;ix1<Dim2;ix1++) lig1.insert(lig1.end(),data[i*Dim2+ix1]);
234    
235     for(int j=0;j<Dim2;j++)
236 francois 17 {
237 souaissa 69 int p=-1;
238 souaissa 58 if(!existe(check,j,p))
239     {
240     vector<int>trouve;
241     vector<double2>valeur;
242     vector<double2> lig2;
243 souaissa 69 for(int ix2=0;ix2<Dim2;ix2++) lig2.insert(lig2.end(),tns(j,ix2));
244     for(int r=0;r<Dim2;r++)
245 souaissa 58 {
246 souaissa 69 double2 val=lig1[r];
247     val=val.get_fabs();
248 souaissa 80
249 souaissa 58 int indx1=-1;
250 francois 17
251 souaissa 69 for(int s=0;s<Dim2;s++)
252 souaissa 58 { int pos1;
253 souaissa 69 double2 vall=lig2[s];
254     vall=vall.get_fabs();
255 souaissa 80
256     if (val==vall&&!existe(trouve,s,indx1))
257 souaissa 58 {
258     trouve.insert(trouve.end(),s);
259     valeur.insert(valeur.end(),val);
260     break;
261     }
262    
263     }
264    
265     }
266     int t_trouve=trouve.size();
267 souaissa 69 if (t_trouve==Dim2)
268 souaissa 58 {
269     check.insert(check.end(),j);
270     break;
271    
272 francois 17 }
273 souaissa 58
274     }
275     }
276     continue;
277     }
278     int t_chek=check.size();
279 souaissa 69 if (t_chek==Dim1)return 1;
280 souaissa 58 else return 0;
281 francois 17
282 souaissa 58 }
283    
284    
285    
286 souaissa 69 template <class T> int OT_TENSEUR:: existe(const vector<T>& vct,T val,int& idx)
287 souaissa 58 {
288 francois 17
289 souaissa 58 if(val<0) val=-val;
290 souaissa 69 for(unsigned int i=0;i<vct.size();i++)
291 souaissa 58 {
292     double x=vct[i];
293     if(x<0) val=-val;
294     if(x==val){
295     idx=i; return 1; }
296     }
297     idx=-1;
298     return 0;
299     }
300 souaissa 69
301    
302     OT_TENSEUR operator+( OT_TENSEUR& ot1, OT_TENSEUR& ot2)
303     {
304     assert (ot1.Get_NbRows()==ot2.Get_NbRows()&&ot1.Get_NbCols()==ot2.Get_NbCols());
305 souaissa 70 OT_TENSEUR res(ot1.Get_NbRows(),ot1.Get_NbCols());
306 souaissa 69 for(int i=0;i<ot1.Get_NbRows();i++)
307     {
308     for(int j=0;j<ot2.Get_NbCols();j++)
309     {
310     res(i,j)=ot1(i,j)+ot2(i,j);
311     }
312     }
313    
314     return res;
315     }
316    
317    
318 souaissa 151 vector<double2> operator*( OT_TENSEUR& ot1, vector<double2>& v)
319     {
320     assert (ot1.Get_NbCols()==v.size());
321     vector<double2> res(ot1.Get_NbCols());
322     for(int i=0;i<ot1.Get_NbRows();i++)
323     {
324     res[i]=double2(0.0);
325     for(int j=0;j<ot1.Get_NbCols();j++)
326     {
327     res[i]=res[i]+ot1(i,j)+v[j];
328     }
329     }
330    
331     return res;
332    
333    
334     }
335    
336 souaissa 70 OT_TENSEUR operator*( double2& coef, OT_TENSEUR& ot)
337     {
338     OT_TENSEUR T=ot;
339     for(int i=0;i<ot.Get_NbRows();i++)
340     for(int j=0;j<ot.Get_NbCols();j++)
341 souaissa 69
342 souaissa 70 T(i,j)=coef*T(i,j);
343    
344     return T;
345    
346     }
347    
348 francois 102 OT_TENSEUR operator*(OT_TENSEUR& ot , double2& coef)
349 souaissa 70 {
350     return coef*ot;
351 francois 102 }
352    
353     OT_TENSEUR OT_TENSEUR:: transpose()
354     {
355     OT_TENSEUR TMP(Dim2,Dim1);
356     for(int i=0;i<Dim1;i++) {
357 souaissa 70 for(int j=0;j<Dim2;j++)
358     {
359     TMP(j,i)=(*this)(i,j); // ot(i,j);
360     }
361 francois 102 }
362     return TMP;
363 souaissa 70 }
364    
365 francois 102 OT_TENSEUR operator*( OT_TENSEUR& ot1, OT_TENSEUR& ot2)
366     {
367     int dim1=ot1.Get_NbRows();
368     int dim3= ot1.Get_NbCols();
369     int dim2=ot2.Get_NbCols();
370     OT_TENSEUR TMP (dim1,dim2);
371    
372     for(int i=0;i<dim1;i++)
373     {
374     for(int j=0;j<dim2;j++)
375     {
376     for(int k=0;k<dim3;k++)
377     TMP(i,j)=TMP(i,j)+ot1(i,k)*ot2(k,j);
378     }
379     }
380     return TMP;
381     }
382    
383 souaissa 69 std::ostream& operator<<(std::ostream& os, OT_TENSEUR& tns){
384 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
385     os<<"# TENSEUR: DIM1= "<< tns.Get_NbRows()<<" , DIM2: "<<tns.Get_NbCols()<<" #"<<endl;
386     os<<"------------------------------------------------------------------------------------"<<endl;
387 souaissa 69 for(int i=0;i<tns.Get_NbRows();i++) {
388     for(int j=0;j<tns.Get_NbCols();j++) {
389     os<<setw(18)<<tns(i,j);
390     }
391     os<<endl;
392     }
393 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
394 souaissa 69 return os;
395     }
396    
397    
398    
399     void OT_TENSEUR::get_orthogonalisation(OT_TENSEUR& a,OT_VECTEUR_4DD& d,OT_TENSEUR& v,int n,int&nrot)
400 francois 102 {
401    
402     static const int ITMAX=50;
403     double2 zro=0.0;
404     int n1=n-1,n2=1/(n*n),ip1,iq1;// ,ip,j,i,iq// n=3,
405     double2 tresh,theta,tau,t,sm,s,h,g,c;
406     double2 *b=new double2[n]; // OT_VECTEUR_3D b,z;
407     double2 *z=new double2[n];
408    
409     for(int ip=0;ip<n;ip++)
410     {
411     for(int iq=0;iq<n;iq++)
412     //v[ip*n+iq]=0.0;
413     v(ip,iq)=0.0;
414     v(ip,ip)=1.0;
415     b[(unsigned int)ip]=d[(unsigned int)ip]=a(ip,ip);
416     z[(unsigned int)ip]=0.0;
417     }
418     nrot=0;
419     for(int i=1;i<=ITMAX;i++)
420     {
421     sm=0.0;
422     for(int ip=0;ip<n1;ip++)
423     for(int iq=ip+1;iq<n;iq++)
424     sm =sm+(a(ip,iq)).get_fabs();
425     if(sm==zro)
426     return;
427     if(i<4)
428     tresh=0.2*sm*n2;
429     else
430     tresh=0.0;
431     for(int ip=0;ip<n1;ip++)
432     for(int iq=ip+1;iq<n;iq++)
433     {
434     g=100*(a(ip,iq)).get_fabs();
435     if(i>4&&((d[(unsigned int)ip]+g).get_fabs()==d[(unsigned int)ip].get_fabs())&&((d[(unsigned int)iq])+g).get_fabs()==d[(unsigned int)iq].get_fabs())
436     a(ip,iq)=0.0;
437     else if((a(ip,iq)).get_fabs()>tresh)
438     {
439     h=d[(unsigned int)iq]-d[(unsigned int)ip];
440     if(((h).get_fabs()+g)==(h).get_fabs())
441     t=a(ip,iq)/h;
442     else
443     {
444     theta=0.5*h/a(ip,iq);
445     t=1.0/((theta).get_fabs()+sqrt(1.0+theta*theta));
446     if(theta<zro)t=zro-t;
447     }
448     c=1.0/sqrt(1+t*t);
449     s=t*c;
450     tau=s/(1.0+c);
451     h=t*a(ip,iq);
452     z[(unsigned int)ip]=z[(unsigned int)ip]-h;
453     z[(unsigned int)iq]=z[(unsigned int)iq]+h;
454     d[(unsigned int)ip]=d[(unsigned int)ip]-h;
455     d[(unsigned int)iq]=d[(unsigned int)iq]+h;
456     a(ip,iq)=0.0;
457     ip1=ip-1;
458     iq1=iq-1;
459     for(int j=0;j<=ip1;j++)
460     {
461     g=a(j,ip);
462     h=a(j,iq);
463     a(j,ip)=g-s*(h+g*tau);
464     a(j,iq)=h+s*(g-h*tau);
465     }
466     for(int j=ip+1;j<=iq1;j++)
467     {
468     g=a(ip,j);
469     h=a(j,iq);
470     a(ip,j)=g-s*(h+g*tau);
471     a(j,iq)=h+s*(g-h*tau);
472     }
473     for(int j=iq+1;j<n;j++)
474     {
475     g=a(ip,j);
476     h=a(iq,j);
477     a(ip,j)=g-s*(h+g*tau);
478     a(iq,j)=h+s*(g-h*tau);
479     }
480     for(int j=0;j<n;j++)
481     {
482     g=v(j,ip);
483     h=v(j,iq);
484     v(j,ip)=g-s*(h+g*tau);
485     v(j,iq)=h+s*(g-h*tau);
486     }
487     ++nrot;
488     }
489     }
490     for(int ip=0;ip<n;ip++)
491     {
492     b[(unsigned int)ip]=b[(unsigned int)ip]+z[(unsigned int)ip];
493     d[(unsigned int)ip]=b[(unsigned int)ip];
494     z[(unsigned int)ip]=0.0;
495     }
496     }
497    
498    
499     delete [] b;
500     delete [] z;
501    
502 souaissa 58 }
503 francois 17
504 souaissa 69
505 souaissa 58
506 souaissa 80
507 francois 102 int OT_TENSEUR::listes_equivalentes(std::vector<double2>& list1,std::vector<double2>& list2,std::vector<unsigned int>& indx)
508 souaissa 80
509 francois 102 {
510 souaissa 151 int compt=0;
511     int pos=-1;
512     int exist=0;
513     for(int i=0;i<list1.size();i++)
514     {
515     double2 val1=list1[i];
516     double prc=1e-3;
517     double prcc;
518     if(pos==-1)
519     {
520     for(int k=0;k< list2.size();k++)
521     {
522     double2 val2=list2[k];
523     prcc =val2.get_x()-val1.get_x();
524     prcc =prcc/val2.get_x();
525     if( fabs(prcc)<prc){
526     indx.insert(indx.end(),k);
527     pos=k;
528     compt++;
529     break;
530     }
531     }
532     }
533 souaissa 80
534    
535 souaissa 151 else {
536     for( int r=0;r<list2.size();r++)
537     {
538     double2 vval2=list2[r];
539     for(int j=0;j<indx.size();j++)
540     {
541     exist=0;
542     if (r==indx[j])
543     {
544     exist=1;
545     break;
546     }
547     }
548 souaissa 80
549 souaissa 151 prcc =vval2.get_x()-val1.get_x();
550     prcc =prcc/vval2.get_x();
551 souaissa 80
552 souaissa 151 if(fabs(prcc)<prc&&!exist) // vval2==val1
553     {
554     indx.insert(indx.end(),r);
555     pos=r;
556     compt++;
557     break;
558     }
559 souaissa 80
560 souaissa 151 }
561 francois 102 }
562     }
563    
564     if (compt==list1.size())return 1;
565     else return 0;
566    
567    
568     }
569    
570    
571    
572    
573    
574