ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_tenseur.cpp
Revision: 70
Committed: Mon Mar 31 21:03:48 2008 UTC (17 years, 1 month ago) by souaissa
Original Path: magic/lib/outil/outil/src/ot_tenseur.cpp
File size: 9319 byte(s)
Log Message:
ot_tenseur fonctionne en double2

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     #include <conio.h>
10     #include <stdio.h>
11 souaissa 69 #include <assert.h>
12 francois 17 //---------------------------------------------------------------------------
13 souaissa 58
14 francois 17 #pragma package(smart_init)
15    
16    
17    
18 souaissa 69
19     OT_TENSEUR::OT_TENSEUR()
20 souaissa 58 {
21 souaissa 69 Dim1=0;
22     Dim2=0;
23 souaissa 70 data=0;
24 souaissa 58 }
25 souaissa 70
26 souaissa 69 OT_TENSEUR::OT_TENSEUR(int n)
27 souaissa 58 {
28 souaissa 69 Dim1=n;
29     Dim2=n;
30 souaissa 70
31     data =new double2[n*n];
32     for(int i=0;i<Dim1*Dim2;i++) data[i]=0;
33     }
34    
35 souaissa 69 OT_TENSEUR::OT_TENSEUR(int n,int m)
36 francois 17 {
37 souaissa 69 Dim1=n;
38     Dim2=m;
39 souaissa 70
40     data =new double2[n*m];
41     for(int i=0;i<Dim1*Dim2;i++) data[i]=0;
42 souaissa 58 }
43 souaissa 70
44    
45    
46 souaissa 69 OT_TENSEUR:: OT_TENSEUR(vector<OT_VECTEUR_4DD>& v)
47 francois 17 {
48 souaissa 70
49 souaissa 69 Dim1=v.size();
50     Dim2=Dim1;
51     int Dim= Dim1*Dim2 ;
52 souaissa 70 data=new double2[Dim];
53     for(int i=0;i<Dim1;i++)
54     {
55     OT_VECTEUR_4DD z1=v[i];
56     for (int j=0;j<Dim2;j++)
57     {
58     OT_VECTEUR_4DD z2=v[j];
59     double2 prscal=z1*z2;
60     data[i*Dim2+j]=prscal;
61     }
62 souaissa 69 }
63 francois 17
64    
65     }
66    
67 souaissa 69 OT_TENSEUR::OT_TENSEUR(vector<OT_VECTEUR_4DD>&v1,vector<OT_VECTEUR_4DD>&v2)
68 souaissa 58 {
69 francois 17
70 souaissa 69 Dim1=v1.size();
71     Dim2=v2.size();
72     int Dim= Dim1*Dim2 ;
73 souaissa 70 data=new double2[Dim];
74     for(int i=0;i<Dim1;i++)
75     {
76     OT_VECTEUR_4DD z1=v1[i];
77     for (int j=0;j<Dim2;j++)
78     {
79     OT_VECTEUR_4DD z2=v2[j];
80     double2 prscal=z1*z2;
81     data[i*Dim2+j]=prscal;
82     }
83 souaissa 69 }
84 francois 17
85 souaissa 69
86 souaissa 58 }
87 francois 17
88 souaissa 69
89     OT_TENSEUR::~OT_TENSEUR()
90 souaissa 58 {
91 souaissa 69 Dim1=0;
92     Dim2=0;
93 souaissa 70
94     if (data!=NULL) delete [] data;
95 souaissa 58 }
96 francois 17
97    
98 souaissa 69 OT_TENSEUR::OT_TENSEUR(const OT_TENSEUR& ot)
99 francois 17 {
100 souaissa 69 Dim1=ot.Dim1;
101     Dim2=ot.Dim2;
102 souaissa 70 data=new double2[Dim1*Dim2];
103    
104     for(int i=0;i<Dim1;i++)
105     {
106     for (int j=0;j<Dim2;j++)
107     {
108     data[i*Dim2+j]=ot(i,j);
109     }
110     }
111 francois 17 }
112    
113 souaissa 58
114 souaissa 69 OT_TENSEUR& OT_TENSEUR:: operator =(const OT_TENSEUR& ot)
115 francois 17 {
116 souaissa 58
117 souaissa 69 if(this==&ot) return *this ;
118 souaissa 70
119     if(data) delete [] data;
120    
121 souaissa 69 Dim1=ot.Dim1;
122     Dim2=ot.Dim2;
123 souaissa 70 data=new double2[Dim1*Dim2];
124    
125     for(int i=0;i<Dim1;i++) {
126     for (int j=0;j<Dim2;j++) {
127     data[i*Dim2+j]=ot.data[i*Dim2+j];
128     }
129     }
130    
131    
132 souaissa 69 return *this;
133 francois 17 }
134    
135 souaissa 69 int operator==( OT_TENSEUR& t1, OT_TENSEUR&t2)
136 francois 17 {
137 souaissa 69 if(t1.Get_NbRows()!=t2.Get_NbRows()||t1.Get_NbCols()!=t2.Get_NbCols()) return 0;
138 souaissa 58 else {
139 souaissa 69 for(int i=0;i<t1.Get_NbRows();i++)
140 souaissa 58 {
141 souaissa 69 for(int j=0;j<t1.Get_NbCols();j++)
142 souaissa 58 {
143     if(t1(i,j)!=t2(i,j)) return 0;
144     }
145 francois 17
146 souaissa 58 }
147     }
148     return 1;
149     }
150 francois 17
151    
152 souaissa 69
153     double2&OT_TENSEUR:: operator()(int i,int j)
154 souaissa 58 {
155 souaissa 69 assert(i<Dim1&&j<Dim2);
156    
157 souaissa 70 return data[i*Dim2+j];
158 souaissa 58 }
159 francois 17
160    
161 souaissa 70
162     double2& OT_TENSEUR:: operator()(int i,int j)const
163 souaissa 58 {
164 souaissa 69 assert(i<Dim1&&j<Dim2);
165    
166 souaissa 70 return data[i*Dim2+j];
167 souaissa 58 }
168 francois 17
169 souaissa 58
170 souaissa 70
171 souaissa 69 int OT_TENSEUR:: Get_NbRows()const
172 francois 17 {
173 souaissa 69 return Dim1;
174 francois 17 }
175    
176 souaissa 69
177    
178     int OT_TENSEUR:: Get_NbCols()const
179 souaissa 58 {
180 souaissa 69 return Dim2;
181 souaissa 58 }
182 francois 17
183    
184 souaissa 58
185 souaissa 70 int OT_TENSEUR:: est_til_equivalent( OT_TENSEUR& tns)
186 souaissa 58 {
187     vector<int> check;
188    
189 souaissa 69 for(int i=0;i<tns.Get_NbRows();i++)
190 souaissa 58 {
191    
192 souaissa 69 vector<double2> lig1;
193     for(int ix1=0;ix1<Dim2;ix1++) lig1.insert(lig1.end(),data[i*Dim2+ix1]);
194    
195     for(int j=0;j<Dim2;j++)
196 francois 17 {
197 souaissa 69 int p=-1;
198 souaissa 58 if(!existe(check,j,p))
199     {
200     vector<int>trouve;
201     vector<double2>valeur;
202     vector<double2> lig2;
203 souaissa 69 for(int ix2=0;ix2<Dim2;ix2++) lig2.insert(lig2.end(),tns(j,ix2));
204     for(int r=0;r<Dim2;r++)
205 souaissa 58 {
206 souaissa 69 double2 val=lig1[r];
207     val=val.get_fabs();
208 souaissa 70 //val.set_dx(0.01);
209 souaissa 58 int indx1=-1;
210 francois 17
211 souaissa 69 for(int s=0;s<Dim2;s++)
212 souaissa 58 { int pos1;
213 souaissa 69 double2 vall=lig2[s];
214     vall=vall.get_fabs();
215 souaissa 70 //vall.set_dx(0.01);
216 souaissa 58 if (val==vall&&!existe(trouve,s,indx1))//&&!existe(valeur,vall,pos1))
217     {
218     trouve.insert(trouve.end(),s);
219     valeur.insert(valeur.end(),val);
220     break;
221     }
222    
223     }
224    
225     }
226     int t_trouve=trouve.size();
227 souaissa 69 if (t_trouve==Dim2)
228 souaissa 58 {
229     check.insert(check.end(),j);
230     break;
231    
232 francois 17 }
233 souaissa 58
234     }
235     }
236     continue;
237     }
238     int t_chek=check.size();
239 souaissa 69 if (t_chek==Dim1)return 1;
240 souaissa 58 else return 0;
241 francois 17
242 souaissa 58 }
243    
244    
245    
246 souaissa 69 template <class T> int OT_TENSEUR:: existe(const vector<T>& vct,T val,int& idx)
247 souaissa 58 {
248 francois 17
249 souaissa 58 if(val<0) val=-val;
250 souaissa 69 for(unsigned int i=0;i<vct.size();i++)
251 souaissa 58 {
252     double x=vct[i];
253     if(x<0) val=-val;
254     if(x==val){
255     idx=i; return 1; }
256     }
257     idx=-1;
258     return 0;
259     }
260 souaissa 69
261    
262     OT_TENSEUR operator+( OT_TENSEUR& ot1, OT_TENSEUR& ot2)
263     {
264     assert (ot1.Get_NbRows()==ot2.Get_NbRows()&&ot1.Get_NbCols()==ot2.Get_NbCols());
265 souaissa 70 OT_TENSEUR res(ot1.Get_NbRows(),ot1.Get_NbCols());
266 souaissa 69 for(int i=0;i<ot1.Get_NbRows();i++)
267     {
268     for(int j=0;j<ot2.Get_NbCols();j++)
269     {
270     res(i,j)=ot1(i,j)+ot2(i,j);
271     }
272     }
273    
274     return res;
275     }
276    
277    
278 souaissa 70 OT_TENSEUR operator*( double2& coef, OT_TENSEUR& ot)
279     {
280     OT_TENSEUR T=ot;
281     for(int i=0;i<ot.Get_NbRows();i++)
282     for(int j=0;j<ot.Get_NbCols();j++)
283 souaissa 69
284 souaissa 70 T(i,j)=coef*T(i,j);
285    
286     return T;
287    
288     }
289    
290     OT_TENSEUR operator*(OT_TENSEUR& ot , double2& coef)
291     {
292     return coef*ot;
293     }
294    
295     OT_TENSEUR OT_TENSEUR:: transpose()
296     {
297     OT_TENSEUR TMP(Dim2,Dim1);
298     for(int i=0;i<Dim1;i++) {
299     for(int j=0;j<Dim2;j++)
300     {
301     TMP(j,i)=(*this)(i,j); // ot(i,j);
302     }
303     }
304     return TMP;
305     }
306    
307     OT_TENSEUR operator*( OT_TENSEUR& ot1, OT_TENSEUR& ot2)
308     {
309     int dim1=ot1.Get_NbRows();
310     int dim3= ot1.Get_NbCols();
311     int dim2=ot2.Get_NbCols();
312     OT_TENSEUR TMP (dim1,dim2);
313    
314     for(int i=0;i<dim1;i++)
315     {
316     for(int j=0;j<dim2;j++)
317     {
318     for(int k=0;k<dim3;k++)
319     TMP(i,j)=TMP(i,j)+ot1(i,k)*ot2(k,j);
320     }
321     }
322     return TMP;
323     }
324    
325 souaissa 69 std::ostream& operator<<(std::ostream& os, OT_TENSEUR& tns){
326 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
327     os<<"# TENSEUR: DIM1= "<< tns.Get_NbRows()<<" , DIM2: "<<tns.Get_NbCols()<<" #"<<endl;
328     os<<"------------------------------------------------------------------------------------"<<endl;
329 souaissa 69 for(int i=0;i<tns.Get_NbRows();i++) {
330     for(int j=0;j<tns.Get_NbCols();j++) {
331     os<<setw(18)<<tns(i,j);
332     }
333     os<<endl;
334     }
335 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
336 souaissa 69 return os;
337     }
338    
339    
340    
341     void OT_TENSEUR::get_orthogonalisation(OT_TENSEUR& a,OT_VECTEUR_4DD& d,OT_TENSEUR& v,int n,int&nrot)
342     {
343    
344     static const int ITMAX=50;
345     double2 zro=0.0;
346     int n1=n-1,n2=1/(n*n),ip1,iq1;// ,ip,j,i,iq// n=3,
347     double2 tresh,theta,tau,t,sm,s,h,g,c;
348     double2 *b=new double2[n]; // OT_VECTEUR_3D b,z;
349     double2 *z=new double2[n];
350    
351     for(int ip=0;ip<n;ip++)
352     {
353     for(int iq=0;iq<n;iq++)
354     //v[ip*n+iq]=0.0;
355     v(ip,iq)=0.0;
356     v(ip,ip)=1.0;
357     b[(unsigned int)ip]=d[(unsigned int)ip]=a(ip,ip);
358     z[(unsigned int)ip]=0.0;
359     }
360     nrot=0;
361     for(int i=1;i<=ITMAX;i++)
362     {
363     sm=0.0;
364     for(int ip=0;ip<n1;ip++)
365     for(int iq=ip+1;iq<n;iq++)
366     sm =sm+(a(ip,iq)).get_fabs();
367     if(sm==zro)
368     return;
369     if(i<4)
370     tresh=0.2*sm*n2;
371     else
372     tresh=0.0;
373     for(int ip=0;ip<n1;ip++)
374     for(int iq=ip+1;iq<n;iq++)
375     {
376     g=100*(a(ip,iq)).get_fabs();
377     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())
378     a(ip,iq)=0.0;
379     else if((a(ip,iq)).get_fabs()>tresh)
380     {
381     h=d[(unsigned int)iq]-d[(unsigned int)ip];
382     if(((h).get_fabs()+g)==(h).get_fabs())
383     t=a(ip,iq)/h;
384     else
385     {
386     theta=0.5*h/a(ip,iq);
387     t=1.0/((theta).get_fabs()+sqrt(1.0+theta*theta));
388     if(theta<zro)t=zro-t;
389     }
390     c=1.0/sqrt(1+t*t);
391     s=t*c;
392     tau=s/(1.0+c);
393     h=t*a(ip,iq);
394     z[(unsigned int)ip]=z[(unsigned int)ip]-h;
395     z[(unsigned int)iq]=z[(unsigned int)iq]+h;
396     d[(unsigned int)ip]=d[(unsigned int)ip]-h;
397     d[(unsigned int)iq]=d[(unsigned int)iq]+h;
398     a(ip,iq)=0.0;
399     ip1=ip-1;
400     iq1=iq-1;
401     for(int j=0;j<=ip1;j++)
402     {
403     g=a(j,ip);
404     h=a(j,iq);
405     a(j,ip)=g-s*(h+g*tau);
406     a(j,iq)=h+s*(g-h*tau);
407     }
408     for(int j=ip+1;j<=iq1;j++)
409     {
410     g=a(ip,j);
411     h=a(j,iq);
412     a(ip,j)=g-s*(h+g*tau);
413     a(j,iq)=h+s*(g-h*tau);
414     }
415     for(int j=iq+1;j<n;j++)
416     {
417     g=a(ip,j);
418     h=a(iq,j);
419     a(ip,j)=g-s*(h+g*tau);
420     a(iq,j)=h+s*(g-h*tau);
421     }
422     for(int j=0;j<n;j++)
423     {
424     g=v(j,ip);
425     h=v(j,iq);
426     v(j,ip)=g-s*(h+g*tau);
427     v(j,iq)=h+s*(g-h*tau);
428     }
429     ++nrot;
430     }
431     }
432     for(int ip=0;ip<n;ip++)
433     {
434     b[(unsigned int)ip]=b[(unsigned int)ip]+z[(unsigned int)ip];
435     d[(unsigned int)ip]=b[(unsigned int)ip];
436     z[(unsigned int)ip]=0.0;
437     }
438     }
439    
440    
441     delete [] b;
442     delete [] z;
443 souaissa 70
444 souaissa 58 }
445 francois 17
446 souaissa 69
447 souaissa 58
448    
449    
450    
451    
452    
453    
454    
455