ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_tenseur.cpp
Revision: 175
Committed: Thu Apr 23 19:38:52 2009 UTC (16 years ago) by francois
Original Path: magic/lib/outil/outil/src/ot_tenseur.cpp
File size: 12789 byte(s)
Log Message:
Verification de compatibilité borland + visu avec separation possible de l'origine des mailles + visu des solutions sur les elements + nouvelles origine pour tenir compte des resultats d'optimisation

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 francois 175 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 francois 17
186 souaissa 69
187 francois 175
188     double2& OT_TENSEUR:: operator()(int i,int j)
189 souaissa 58 {
190 souaissa 69 assert(i<Dim1&&j<Dim2);
191 souaissa 80 double2 prciseion=0.0;
192     if(data[i*Dim2+j].get_fabs()<=prciseion)
193     {
194     data[i*Dim2+j]=0.;
195 souaissa 69
196 souaissa 80 }
197 souaissa 70 return data[i*Dim2+j];
198 souaissa 58 }
199 francois 17
200    
201 souaissa 70
202     double2& OT_TENSEUR:: operator()(int i,int j)const
203 souaissa 58 {
204 souaissa 69 assert(i<Dim1&&j<Dim2);
205 souaissa 80 double2 prciseion=0.0;
206     if(data[i*Dim2+j].get_fabs()<=prciseion)
207     {
208     data[i*Dim2+j]=0.;
209 souaissa 69
210 souaissa 80 }
211 souaissa 70 return data[i*Dim2+j];
212 souaissa 58 }
213 francois 17
214 souaissa 58
215 souaissa 70
216 souaissa 69 int OT_TENSEUR:: Get_NbRows()const
217 francois 17 {
218 souaissa 69 return Dim1;
219 francois 17 }
220    
221 souaissa 69
222    
223     int OT_TENSEUR:: Get_NbCols()const
224 souaissa 58 {
225 souaissa 69 return Dim2;
226 souaissa 58 }
227 francois 17
228    
229 souaissa 58
230 souaissa 70 int OT_TENSEUR:: est_til_equivalent( OT_TENSEUR& tns)
231 souaissa 58 {
232 souaissa 86
233     if (Dim1!=tns.Get_NbRows()||Dim2!=tns.Get_NbCols()) return 0;
234 souaissa 58 vector<int> check;
235    
236 souaissa 69 for(int i=0;i<tns.Get_NbRows();i++)
237 souaissa 58 {
238    
239 souaissa 69 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 francois 17 {
244 souaissa 69 int p=-1;
245 souaissa 58 if(!existe(check,j,p))
246     {
247     vector<int>trouve;
248     vector<double2>valeur;
249     vector<double2> lig2;
250 souaissa 69 for(int ix2=0;ix2<Dim2;ix2++) lig2.insert(lig2.end(),tns(j,ix2));
251     for(int r=0;r<Dim2;r++)
252 souaissa 58 {
253 souaissa 69 double2 val=lig1[r];
254     val=val.get_fabs();
255 souaissa 80
256 souaissa 58 int indx1=-1;
257 francois 17
258 souaissa 69 for(int s=0;s<Dim2;s++)
259 souaissa 58 { int pos1;
260 souaissa 69 double2 vall=lig2[s];
261     vall=vall.get_fabs();
262 souaissa 80
263     if (val==vall&&!existe(trouve,s,indx1))
264 souaissa 58 {
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 souaissa 69 if (t_trouve==Dim2)
275 souaissa 58 {
276     check.insert(check.end(),j);
277     break;
278    
279 francois 17 }
280 souaissa 58
281     }
282     }
283     continue;
284     }
285     int t_chek=check.size();
286 souaissa 69 if (t_chek==Dim1)return 1;
287 souaissa 58 else return 0;
288 francois 17
289 souaissa 58 }
290    
291    
292    
293 souaissa 69 template <class T> int OT_TENSEUR:: existe(const vector<T>& vct,T val,int& idx)
294 souaissa 58 {
295 francois 17
296 souaissa 58 if(val<0) val=-val;
297 souaissa 69 for(unsigned int i=0;i<vct.size();i++)
298 souaissa 58 {
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 souaissa 69
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 souaissa 70 OT_TENSEUR res(ot1.Get_NbRows(),ot1.Get_NbCols());
313 souaissa 69 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 souaissa 151 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 souaissa 70 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 souaissa 69
349 souaissa 70 T(i,j)=coef*T(i,j);
350    
351     return T;
352    
353     }
354    
355 francois 102 OT_TENSEUR operator*(OT_TENSEUR& ot , double2& coef)
356 souaissa 70 {
357     return coef*ot;
358 francois 102 }
359    
360     OT_TENSEUR OT_TENSEUR:: transpose()
361     {
362     OT_TENSEUR TMP(Dim2,Dim1);
363     for(int i=0;i<Dim1;i++) {
364 souaissa 70 for(int j=0;j<Dim2;j++)
365     {
366     TMP(j,i)=(*this)(i,j); // ot(i,j);
367     }
368 francois 102 }
369     return TMP;
370 souaissa 70 }
371    
372 francois 102 OT_TENSEUR operator*( OT_TENSEUR& ot1, OT_TENSEUR& ot2)
373     {
374     int dim1=ot1.Get_NbRows();
375     int dim3= ot1.Get_NbCols();
376     int dim2=ot2.Get_NbCols();
377     OT_TENSEUR TMP (dim1,dim2);
378    
379     for(int i=0;i<dim1;i++)
380     {
381     for(int j=0;j<dim2;j++)
382     {
383     for(int k=0;k<dim3;k++)
384     TMP(i,j)=TMP(i,j)+ot1(i,k)*ot2(k,j);
385     }
386     }
387     return TMP;
388     }
389    
390 souaissa 69 std::ostream& operator<<(std::ostream& os, OT_TENSEUR& tns){
391 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
392     os<<"# TENSEUR: DIM1= "<< tns.Get_NbRows()<<" , DIM2: "<<tns.Get_NbCols()<<" #"<<endl;
393     os<<"------------------------------------------------------------------------------------"<<endl;
394 souaissa 69 for(int i=0;i<tns.Get_NbRows();i++) {
395     for(int j=0;j<tns.Get_NbCols();j++) {
396     os<<setw(18)<<tns(i,j);
397     }
398     os<<endl;
399     }
400 souaissa 70 os<<"------------------------------------------------------------------------------------"<<endl;
401 souaissa 69 return os;
402     }
403    
404    
405    
406     void OT_TENSEUR::get_orthogonalisation(OT_TENSEUR& a,OT_VECTEUR_4DD& d,OT_TENSEUR& v,int n,int&nrot)
407 francois 102 {
408    
409     static const int ITMAX=50;
410     double2 zro=0.0;
411     int n1=n-1,n2=1/(n*n),ip1,iq1;// ,ip,j,i,iq// n=3,
412     double2 tresh,theta,tau,t,sm,s,h,g,c;
413     double2 *b=new double2[n]; // OT_VECTEUR_3D b,z;
414     double2 *z=new double2[n];
415    
416     for(int ip=0;ip<n;ip++)
417     {
418     for(int iq=0;iq<n;iq++)
419     //v[ip*n+iq]=0.0;
420     v(ip,iq)=0.0;
421     v(ip,ip)=1.0;
422     b[(unsigned int)ip]=d[(unsigned int)ip]=a(ip,ip);
423     z[(unsigned int)ip]=0.0;
424     }
425     nrot=0;
426     for(int i=1;i<=ITMAX;i++)
427     {
428     sm=0.0;
429     for(int ip=0;ip<n1;ip++)
430     for(int iq=ip+1;iq<n;iq++)
431     sm =sm+(a(ip,iq)).get_fabs();
432     if(sm==zro)
433     return;
434     if(i<4)
435     tresh=0.2*sm*n2;
436     else
437     tresh=0.0;
438     for(int ip=0;ip<n1;ip++)
439     for(int iq=ip+1;iq<n;iq++)
440     {
441     g=100*(a(ip,iq)).get_fabs();
442     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())
443     a(ip,iq)=0.0;
444     else if((a(ip,iq)).get_fabs()>tresh)
445     {
446     h=d[(unsigned int)iq]-d[(unsigned int)ip];
447     if(((h).get_fabs()+g)==(h).get_fabs())
448     t=a(ip,iq)/h;
449     else
450     {
451     theta=0.5*h/a(ip,iq);
452     t=1.0/((theta).get_fabs()+sqrt(1.0+theta*theta));
453     if(theta<zro)t=zro-t;
454     }
455     c=1.0/sqrt(1+t*t);
456     s=t*c;
457     tau=s/(1.0+c);
458     h=t*a(ip,iq);
459     z[(unsigned int)ip]=z[(unsigned int)ip]-h;
460     z[(unsigned int)iq]=z[(unsigned int)iq]+h;
461     d[(unsigned int)ip]=d[(unsigned int)ip]-h;
462     d[(unsigned int)iq]=d[(unsigned int)iq]+h;
463     a(ip,iq)=0.0;
464     ip1=ip-1;
465     iq1=iq-1;
466     for(int j=0;j<=ip1;j++)
467     {
468     g=a(j,ip);
469     h=a(j,iq);
470     a(j,ip)=g-s*(h+g*tau);
471     a(j,iq)=h+s*(g-h*tau);
472     }
473     for(int j=ip+1;j<=iq1;j++)
474     {
475     g=a(ip,j);
476     h=a(j,iq);
477     a(ip,j)=g-s*(h+g*tau);
478     a(j,iq)=h+s*(g-h*tau);
479     }
480     for(int j=iq+1;j<n;j++)
481     {
482     g=a(ip,j);
483     h=a(iq,j);
484     a(ip,j)=g-s*(h+g*tau);
485     a(iq,j)=h+s*(g-h*tau);
486     }
487     for(int j=0;j<n;j++)
488     {
489     g=v(j,ip);
490     h=v(j,iq);
491     v(j,ip)=g-s*(h+g*tau);
492     v(j,iq)=h+s*(g-h*tau);
493     }
494     ++nrot;
495     }
496     }
497     for(int ip=0;ip<n;ip++)
498     {
499     b[(unsigned int)ip]=b[(unsigned int)ip]+z[(unsigned int)ip];
500     d[(unsigned int)ip]=b[(unsigned int)ip];
501     z[(unsigned int)ip]=0.0;
502     }
503     }
504    
505    
506     delete [] b;
507     delete [] z;
508    
509 souaissa 58 }
510 francois 17
511 souaissa 69
512 souaissa 58
513 souaissa 80
514 francois 102 int OT_TENSEUR::listes_equivalentes(std::vector<double2>& list1,std::vector<double2>& list2,std::vector<unsigned int>& indx)
515 souaissa 80
516 francois 102 {
517 souaissa 151 int compt=0;
518     int pos=-1;
519     int exist=0;
520     for(int i=0;i<list1.size();i++)
521     {
522     double2 val1=list1[i];
523     double prc=1e-3;
524     double prcc;
525     if(pos==-1)
526     {
527     for(int k=0;k< list2.size();k++)
528     {
529     double2 val2=list2[k];
530     prcc =val2.get_x()-val1.get_x();
531 francois 163 if (fabs(val2.get_x())>val2.get_dx())
532     prcc =prcc/val2.get_x();
533 souaissa 151 if( fabs(prcc)<prc){
534     indx.insert(indx.end(),k);
535     pos=k;
536     compt++;
537     break;
538     }
539     }
540     }
541 souaissa 80
542    
543 souaissa 151 else {
544     for( int r=0;r<list2.size();r++)
545     {
546     double2 vval2=list2[r];
547     for(int j=0;j<indx.size();j++)
548     {
549     exist=0;
550     if (r==indx[j])
551     {
552     exist=1;
553     break;
554     }
555     }
556 souaissa 80
557 souaissa 151 prcc =vval2.get_x()-val1.get_x();
558 francois 163 if(fabs(vval2.get_x())>vval2.get_dx())
559 souaissa 151 prcc =prcc/vval2.get_x();
560 souaissa 80
561 souaissa 151 if(fabs(prcc)<prc&&!exist) // vval2==val1
562     {
563     indx.insert(indx.end(),r);
564     pos=r;
565     compt++;
566     break;
567     }
568 souaissa 80
569 souaissa 151 }
570 francois 102 }
571     }
572    
573     if (compt==list1.size())return 1;
574     else return 0;
575    
576    
577     }
578    
579    
580    
581    
582    
583