ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_tenseur.cpp
Revision: 102
Committed: Mon May 26 11:51:43 2008 UTC (16 years, 11 months ago) by francois
Original Path: magic/lib/outil/outil/src/ot_tenseur.cpp
File size: 11781 byte(s)
Log Message:
mise a jour linux des versions lib

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 70 OT_TENSEUR operator*( double2& coef, OT_TENSEUR& ot)
319     {
320     OT_TENSEUR T=ot;
321     for(int i=0;i<ot.Get_NbRows();i++)
322     for(int j=0;j<ot.Get_NbCols();j++)
323 souaissa 69
324 souaissa 70 T(i,j)=coef*T(i,j);
325    
326     return T;
327    
328     }
329    
330 francois 102 OT_TENSEUR operator*(OT_TENSEUR& ot , double2& coef)
331 souaissa 70 {
332     return coef*ot;
333 francois 102 }
334    
335     OT_TENSEUR OT_TENSEUR:: transpose()
336     {
337     OT_TENSEUR TMP(Dim2,Dim1);
338     for(int i=0;i<Dim1;i++) {
339 souaissa 70 for(int j=0;j<Dim2;j++)
340     {
341     TMP(j,i)=(*this)(i,j); // ot(i,j);
342     }
343 francois 102 }
344     return TMP;
345 souaissa 70 }
346    
347 francois 102 OT_TENSEUR operator*( OT_TENSEUR& ot1, OT_TENSEUR& ot2)
348     {
349     int dim1=ot1.Get_NbRows();
350     int dim3= ot1.Get_NbCols();
351     int dim2=ot2.Get_NbCols();
352     OT_TENSEUR TMP (dim1,dim2);
353    
354     for(int i=0;i<dim1;i++)
355     {
356     for(int j=0;j<dim2;j++)
357     {
358     for(int k=0;k<dim3;k++)
359     TMP(i,j)=TMP(i,j)+ot1(i,k)*ot2(k,j);
360     }
361     }
362     return TMP;
363     }
364    
365 souaissa 69 std::ostream& operator<<(std::ostream& os, OT_TENSEUR& tns){
366 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
367     os<<"# TENSEUR: DIM1= "<< tns.Get_NbRows()<<" , DIM2: "<<tns.Get_NbCols()<<" #"<<endl;
368     os<<"------------------------------------------------------------------------------------"<<endl;
369 souaissa 69 for(int i=0;i<tns.Get_NbRows();i++) {
370     for(int j=0;j<tns.Get_NbCols();j++) {
371     os<<setw(18)<<tns(i,j);
372     }
373     os<<endl;
374     }
375 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
376 souaissa 69 return os;
377     }
378    
379    
380    
381     void OT_TENSEUR::get_orthogonalisation(OT_TENSEUR& a,OT_VECTEUR_4DD& d,OT_TENSEUR& v,int n,int&nrot)
382 francois 102 {
383    
384     static const int ITMAX=50;
385     double2 zro=0.0;
386     int n1=n-1,n2=1/(n*n),ip1,iq1;// ,ip,j,i,iq// n=3,
387     double2 tresh,theta,tau,t,sm,s,h,g,c;
388     double2 *b=new double2[n]; // OT_VECTEUR_3D b,z;
389     double2 *z=new double2[n];
390    
391     for(int ip=0;ip<n;ip++)
392     {
393     for(int iq=0;iq<n;iq++)
394     //v[ip*n+iq]=0.0;
395     v(ip,iq)=0.0;
396     v(ip,ip)=1.0;
397     b[(unsigned int)ip]=d[(unsigned int)ip]=a(ip,ip);
398     z[(unsigned int)ip]=0.0;
399     }
400     nrot=0;
401     for(int i=1;i<=ITMAX;i++)
402     {
403     sm=0.0;
404     for(int ip=0;ip<n1;ip++)
405     for(int iq=ip+1;iq<n;iq++)
406     sm =sm+(a(ip,iq)).get_fabs();
407     if(sm==zro)
408     return;
409     if(i<4)
410     tresh=0.2*sm*n2;
411     else
412     tresh=0.0;
413     for(int ip=0;ip<n1;ip++)
414     for(int iq=ip+1;iq<n;iq++)
415     {
416     g=100*(a(ip,iq)).get_fabs();
417     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())
418     a(ip,iq)=0.0;
419     else if((a(ip,iq)).get_fabs()>tresh)
420     {
421     h=d[(unsigned int)iq]-d[(unsigned int)ip];
422     if(((h).get_fabs()+g)==(h).get_fabs())
423     t=a(ip,iq)/h;
424     else
425     {
426     theta=0.5*h/a(ip,iq);
427     t=1.0/((theta).get_fabs()+sqrt(1.0+theta*theta));
428     if(theta<zro)t=zro-t;
429     }
430     c=1.0/sqrt(1+t*t);
431     s=t*c;
432     tau=s/(1.0+c);
433     h=t*a(ip,iq);
434     z[(unsigned int)ip]=z[(unsigned int)ip]-h;
435     z[(unsigned int)iq]=z[(unsigned int)iq]+h;
436     d[(unsigned int)ip]=d[(unsigned int)ip]-h;
437     d[(unsigned int)iq]=d[(unsigned int)iq]+h;
438     a(ip,iq)=0.0;
439     ip1=ip-1;
440     iq1=iq-1;
441     for(int j=0;j<=ip1;j++)
442     {
443     g=a(j,ip);
444     h=a(j,iq);
445     a(j,ip)=g-s*(h+g*tau);
446     a(j,iq)=h+s*(g-h*tau);
447     }
448     for(int j=ip+1;j<=iq1;j++)
449     {
450     g=a(ip,j);
451     h=a(j,iq);
452     a(ip,j)=g-s*(h+g*tau);
453     a(j,iq)=h+s*(g-h*tau);
454     }
455     for(int j=iq+1;j<n;j++)
456     {
457     g=a(ip,j);
458     h=a(iq,j);
459     a(ip,j)=g-s*(h+g*tau);
460     a(iq,j)=h+s*(g-h*tau);
461     }
462     for(int j=0;j<n;j++)
463     {
464     g=v(j,ip);
465     h=v(j,iq);
466     v(j,ip)=g-s*(h+g*tau);
467     v(j,iq)=h+s*(g-h*tau);
468     }
469     ++nrot;
470     }
471     }
472     for(int ip=0;ip<n;ip++)
473     {
474     b[(unsigned int)ip]=b[(unsigned int)ip]+z[(unsigned int)ip];
475     d[(unsigned int)ip]=b[(unsigned int)ip];
476     z[(unsigned int)ip]=0.0;
477     }
478     }
479    
480    
481     delete [] b;
482     delete [] z;
483    
484 souaissa 58 }
485 francois 17
486 souaissa 69
487 souaissa 58
488 souaissa 80
489 francois 102 int OT_TENSEUR::listes_equivalentes(std::vector<double2>& list1,std::vector<double2>& list2,std::vector<unsigned int>& indx)
490 souaissa 80
491 francois 102 {
492 souaissa 80
493    
494    
495 francois 102 int compt=0;
496 souaissa 80
497 francois 102 int pos=-1;
498 souaissa 80
499 francois 102 int exist=0;
500    
501    
502     for(int i=0;i<list1.size();i++)
503    
504     {
505    
506     double2 val1=list1[i];
507    
508     double prc=1e-3;
509    
510     double prcc;
511    
512     if(pos==-1)
513    
514     {
515    
516     for(int k=0;k< list2.size();k++)
517    
518     {
519    
520     double2 val2=list2[k];
521    
522     prcc =val2.get_x()-val1.get_x();
523    
524     prcc =prcc/val2.get_x();
525    
526     if( fabs(prcc)<prc){
527    
528     indx.insert(indx.end(),k);
529    
530     pos=k;
531    
532     compt++;
533    
534     break;
535    
536     }
537    
538     }
539    
540     }
541    
542    
543     else
544    
545     {
546    
547     for( int r=0;r<list2.size();r++)
548    
549     {
550    
551     double2 vval2=list2[r];
552    
553     for(int j=0;j<indx.size();j++)
554    
555     {
556    
557     exist=0;
558    
559     if (r==indx[j])
560    
561     {
562    
563     exist=1;
564    
565     break;
566    
567     }
568    
569     }
570    
571     prcc =vval2.get_x()-val1.get_x();
572    
573     prcc =prcc/vval2.get_x();
574    
575     if(fabs(prcc)<prc&&!exist) // vval2==val1
576    
577     {
578    
579     indx.insert(indx.end(),r);
580    
581     pos=r;
582    
583     compt++;
584    
585     break;
586    
587     }
588    
589     }
590    
591     }
592    
593    
594     }
595    
596    
597     if (compt==list1.size())return 1;
598    
599     else return 0;
600    
601    
602     }
603    
604    
605    
606    
607    
608