ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_tenseur.cpp
Revision: 258
Committed: Thu Aug 12 19:10:34 2010 UTC (15 years ago) by francois
File size: 14218 byte(s)
Log Message:
Mise a jour toxfem + parametrisation compilation toxfem + bug 
comparaison

File Contents

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