ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 363
Committed: Thu Oct 18 22:12:03 2012 UTC (12 years, 6 months ago) by francois
File size: 29685 byte(s)
Log Message:
Mise a jour pour publi sur la comparaison

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // ot_mathematique.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <iomanip>
27     #include <math.h>
28     #include <string.h>
29     #include <assert.h>
30     #include <algorithm>
31     #include "ot_mathematique.h"
32    
33     using namespace std;
34    
35    
36     OT_VECTEUR_3D::OT_VECTEUR_3D(double x,double y,double z)
37 foucault 27 {
38 francois 283 valeur[0]=x;
39     valeur[1]=y;
40     valeur[2]=z;
41 foucault 27 }
42 francois 249
43    
44 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz)
45     {
46     valeur[0]=xyz[0];
47     valeur[1]=xyz[1];
48     valeur[2]=xyz[2];
49     }
50 francois 249
51 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz1,double *xyz2)
52     {
53     valeur[0]=xyz2[0]-xyz1[0];
54     valeur[1]=xyz2[1]-xyz1[1];
55     valeur[2]=xyz2[2]-xyz1[2];
56     }
57 souaissa 69
58 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd)
59     {
60     valeur[0]=mdd.valeur[0];
61     valeur[1]=mdd.valeur[1];
62     valeur[2]=mdd.valeur[2];
63     }
64    
65     OT_VECTEUR_3D::OT_VECTEUR_3D(void)
66     {
67     valeur[0]=0.;
68     valeur[1]=0.;
69     valeur[2]=0.;
70     }
71    
72     double OT_VECTEUR_3D::get_x(void) const
73     {
74     return valeur[0];
75     }
76    
77    
78     double OT_VECTEUR_3D::get_y(void) const
79     {
80     return valeur[1];
81     }
82    
83    
84     double OT_VECTEUR_3D::get_z(void) const
85     {
86     return valeur[2];
87     }
88    
89     void OT_VECTEUR_3D::change_x(double x)
90     {
91     valeur[0]=x;
92     }
93    
94     void OT_VECTEUR_3D::change_y(double y)
95     {
96     valeur[1]=y;
97     }
98    
99     void OT_VECTEUR_3D::change_z(double z)
100     {
101     valeur[2]=z;
102     }
103    
104     double* OT_VECTEUR_3D::get_xyz(void)
105     {
106     return valeur;
107     }
108    
109     OT_VECTEUR_3D::operator const double* () const
110     {
111     return valeur;
112     }
113    
114     OT_VECTEUR_3D::operator double* ()
115     {
116     return valeur;
117     }
118    
119     double OT_VECTEUR_3D::operator[] (int i) const
120     {
121     return valeur[i];
122     }
123    
124     double & OT_VECTEUR_3D::operator[] (int i)
125     {
126     return valeur[i];
127     }
128    
129     double OT_VECTEUR_3D::operator() (int i) const
130     {
131     return valeur[i];
132     }
133     double & OT_VECTEUR_3D::operator() (int i)
134     {
135     return valeur[i];
136     }
137    
138     double OT_VECTEUR_3D::get_longueur(void) const
139     {
140     return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
141     }
142    
143     double OT_VECTEUR_3D::get_longueur2(void) const
144     {
145     return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
146     }
147    
148    
149     void OT_VECTEUR_3D::norme(void)
150     {
151     double longueur=get_longueur();
152     if (longueur != 0)
153     {
154     valeur[0]=valeur[0]/longueur;
155     valeur[2]=valeur[2]/longueur;
156     valeur[1]=valeur[1]/longueur;
157     }
158     }
159    
160     OT_VECTEUR_3D OT_VECTEUR_3D::gram_shmidt(const OT_VECTEUR_3D& vint)
161     {
162     OT_VECTEUR_3D v(0.,0.,0.);
163     double alpha=(*this)*vint;
164     v= *this-alpha*vint;
165     return v;
166     }
167    
168     OT_VECTEUR_3D OT_VECTEUR_3D::unite(int i)
169     {
170     OT_VECTEUR_3D v(0.,0.,0.);
171     v[i]=1.;
172     return v;
173     }
174    
175    
176     int OT_VECTEUR_3D::compare_valeur (const OT_VECTEUR_3D& mdd) const
177     {
178     return memcmp(valeur, mdd.valeur, 3*sizeof(double));
179     }
180    
181     bool OT_VECTEUR_3D::operator== (const OT_VECTEUR_3D& mdd) const
182     {
183     return compare_valeur(mdd) == 0;
184     }
185    
186     bool OT_VECTEUR_3D::operator!= (const OT_VECTEUR_3D& mdd) const
187     {
188     return compare_valeur(mdd) != 0;
189     }
190    
191     bool OT_VECTEUR_3D::operator< (const OT_VECTEUR_3D& mdd) const
192     {
193     return compare_valeur(mdd) < 0;
194     }
195    
196     bool OT_VECTEUR_3D::operator<= (const OT_VECTEUR_3D& mdd) const
197     {
198     return compare_valeur(mdd) <= 0;
199     }
200    
201     bool OT_VECTEUR_3D::operator> (const OT_VECTEUR_3D& mdd) const
202     {
203     return compare_valeur(mdd) > 0;
204     }
205    
206     bool OT_VECTEUR_3D::operator>= (const OT_VECTEUR_3D& mdd) const
207     {
208     return compare_valeur(mdd) >= 0;
209     }
210    
211     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec)
212     {
213     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<"}, ";
214     return __os;
215     }
216    
217     OT_VECTEUR_3D operator/ (const OT_VECTEUR_3D& mdd1, double diviseur)
218     {
219     OT_VECTEUR_3D kQuot;
220    
221     if ( diviseur != (double)0.0 )
222     {
223     double facteur = ((double)1.0)/diviseur;
224     kQuot.valeur[0] = facteur*mdd1.valeur[0];
225     kQuot.valeur[1] = facteur*mdd1.valeur[1];
226     kQuot.valeur[2] = facteur*mdd1.valeur[2];
227     }
228     else
229     {
230     kQuot.valeur[0] = 1E300;
231     kQuot.valeur[1] = 1E300;
232     kQuot.valeur[2] = 1E300;
233     }
234    
235     return kQuot;
236     }
237    
238     OT_VECTEUR_3D operator- (const OT_VECTEUR_3D& mdd1)
239     {
240     return OT_VECTEUR_3D(
241     -mdd1.valeur[0],
242     -mdd1.valeur[1],
243     -mdd1.valeur[2]);
244     }
245    
246     double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
247     {
248     double tmp;
249     tmp=mdd1.valeur[0]*mdd2.valeur[0]+mdd1.valeur[1]*mdd2.valeur[1]+mdd1.valeur[2]*mdd2.valeur[2];
250     return tmp;
251     }
252    
253     OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2)
254     {
255     OT_VECTEUR_3D tmp;
256     tmp.valeur[0]=mdd1*mdd2.valeur[0];
257     tmp.valeur[1]=mdd1*mdd2.valeur[1];
258     tmp.valeur[2]=mdd1*mdd2.valeur[2];
259     return tmp;
260     }
261    
262     OT_VECTEUR_3D& OT_VECTEUR_3D::operator+= (const OT_VECTEUR_3D& mdd)
263     {
264     valeur[0] += mdd.valeur[0];
265     valeur[1] += mdd.valeur[1];
266     valeur[2] += mdd.valeur[2];
267     return *this;
268     }
269     OT_VECTEUR_3D& OT_VECTEUR_3D::operator-= (const OT_VECTEUR_3D& mdd)
270     {
271     valeur[0] -= mdd.valeur[0];
272     valeur[1] -= mdd.valeur[1];
273     valeur[2] -= mdd.valeur[2];
274     return *this;
275     }
276     OT_VECTEUR_3D& OT_VECTEUR_3D::operator*= (double facteur)
277     {
278     valeur[0] *= facteur;
279     valeur[1] *= facteur;
280     valeur[2] *= facteur;
281     return *this;
282     }
283     OT_VECTEUR_3D& OT_VECTEUR_3D::operator/= (double diviseur)
284     {
285     if ( diviseur != (double)0.0 )
286     {
287     double facteur = ((double)1.0)/diviseur;
288     valeur[0] *= facteur;
289     valeur[1] *= facteur;
290     valeur[2] *= facteur;
291     }
292     else
293     {
294     valeur[0] = 1E300;
295     valeur[1] = 1E300;
296     valeur[2] = 1E300;
297     }
298    
299     return *this;
300     }
301    
302     OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
303     {
304     OT_VECTEUR_3D tmp;
305     tmp.valeur[0]=mdd1.valeur[1]*mdd2.valeur[2]-mdd1.valeur[2]*mdd2.valeur[1];
306     tmp.valeur[1]=mdd1.valeur[2]*mdd2.valeur[0]-mdd1.valeur[0]*mdd2.valeur[2];
307     tmp.valeur[2]=mdd1.valeur[0]*mdd2.valeur[1]-mdd1.valeur[1]*mdd2.valeur[0];
308     return tmp;
309     }
310    
311     double OT_VECTEUR_3D::diff(void)
312     {
313     return 0.33333333333333*(fabs(valeur[0])+fabs(valeur[1])+fabs(valeur[2]));
314     }
315    
316    
317     OT_MATRICE_3D::OT_MATRICE_3D(OT_VECTEUR_3D& colonne1,OT_VECTEUR_3D& colonne2,OT_VECTEUR_3D& colonne3)
318     {
319     vec[0]=colonne1;
320     vec[1]=colonne2;
321     vec[2]=colonne3;
322     }
323    
324     OT_MATRICE_3D::OT_MATRICE_3D(const OT_MATRICE_3D& mdd)
325     {
326     vec[0]=mdd.vec[0];
327     vec[1]=mdd.vec[1];
328     vec[2]=mdd.vec[2];
329     }
330    
331     OT_MATRICE_3D::OT_MATRICE_3D(void)
332     {
333     for (int i=0;i<3;i++)
334     {
335     for (int j=0;j<3;j++)
336     {
337     vec[i][j]=0.;
338     }
339    
340     }
341    
342     }
343     std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat)
344     {
345    
346     __os << "{ ";
347     for (unsigned i=0; i<3; i++)
348     {
349     __os << "[ "<< __mat(i,0)<<" ]\t [ "<<__mat(i,1) <<" ]\t [ "<<__mat(i,2);
350     if (i+1 < 3)
351     __os << std::endl << " ";
352     }
353     __os << " }" << std::endl;
354     return __os;
355     }
356    
357     OT_VECTEUR_3D & OT_MATRICE_3D::operator [](int i)
358     {
359     return vec[i];
360     }
361    
362     OT_MATRICE_3D::OT_MATRICE_3D(double* t)
363     {
364     for (int i=0;i<3;i++)
365     {
366     for (int j=0;j<3;j++)
367     {
368     vec[i][j]=t[i*3+j];
369     }
370    
371     }
372     }
373    
374     double OT_MATRICE_3D::valeur(int iLigne, int iCol) const
375     {
376     return vec[iCol][iLigne];
377     }
378     double & OT_MATRICE_3D::valeur(int iLigne, int iCol)
379     {
380     return vec[iCol][iLigne];
381     }
382     double OT_MATRICE_3D::operator() (int iLigne, int iCol) const
383     {
384     return vec[iCol][iLigne];
385     }
386     double & OT_MATRICE_3D::operator() (int iLigne, int iCol)
387     {
388     return vec[iCol][iLigne];
389     }
390     double OT_MATRICE_3D::get_determinant()
391     {
392     double coFacteur0 = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
393     double coFacteur1 = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
394     double coFacteur2 = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
395     double determinant = valeur(0,0)*coFacteur0 + valeur(0,1)*coFacteur1 + valeur(0,2)*coFacteur2;
396     return determinant;
397     }
398     void OT_MATRICE_3D::identite(void)
399     {
400     for (unsigned i = 0; i<3; i++)
401     for (unsigned j = 0; j < 3; j++)
402     vec[i][j] = (i==j) ? 1.0 : 0.0 ;
403     }
404    
405     void OT_MATRICE_3D::transpose(OT_MATRICE_3D& res) const
406     {
407     for (unsigned i = 0; i<3; i++)
408     for (unsigned j = 0; j < 3; j++)
409     res.vec[i][j] = vec[j][i];
410     }
411    
412     OT_MATRICE_3D OT_MATRICE_3D::transpose() const
413     {
414     OT_MATRICE_3D temp;
415     for (unsigned i = 0; i<3; i++)
416     for (unsigned j = 0; j < 3; j++)
417     temp.valeur(i,j) =valeur(j,i);
418    
419     return temp;
420     }
421    
422     OT_MATRICE_3D OT_MATRICE_3D::inverse () const
423     {
424     // Invert a 3x3 using cofactors. This is faster than using a generic
425     // Gaussian elimination because of the loop overhead of such a method.
426    
427     OT_MATRICE_3D matInverse;
428    
429     matInverse.valeur(0,0) = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
430     matInverse.valeur(0,1) = valeur(0,2)*valeur(2,1) - valeur(0,1)*valeur(2,2);
431     matInverse.valeur(0,2) = valeur(0,1)*valeur(1,2) - valeur(0,2)*valeur(1,1);
432     matInverse.valeur(1,0) = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
433     matInverse.valeur(1,1) = valeur(0,0)*valeur(2,2) - valeur(0,2)*valeur(2,0);
434     matInverse.valeur(1,2) = valeur(0,2)*valeur(1,0) - valeur(0,0)*valeur(1,2);
435     matInverse.valeur(2,0) = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
436     matInverse.valeur(2,1) = valeur(0,1)*valeur(2,0) - valeur(0,0)*valeur(2,1);
437     matInverse.valeur(2,2) = valeur(0,0)*valeur(1,1) - valeur(0,1)*valeur(1,0);
438    
439     double det = valeur(0,0)*matInverse(0,0) + valeur(0,1)*matInverse(1,0)+
440     valeur(0,2)*matInverse(2,0);
441    
442     if ( fabs(det) <= 1E-100 )
443     {
444     matInverse.identite();
445     return matInverse;
446     }
447    
448     double invDet = 1/det;
449    
450     for (int i=0; i<3; i++)
451     for (int j=0; j<3; j++)
452     matInverse.vec[i][j] *= invDet;
453    
454     return matInverse;
455     }
456    
457     void OT_MATRICE_3D::change_vecteur1(OT_VECTEUR_3D v)
458     {
459     vec[0]=v;
460     }
461     void OT_MATRICE_3D::change_vecteur2(OT_VECTEUR_3D v)
462     {
463     vec[1]=v;
464     }
465     void OT_MATRICE_3D::change_vecteur3(OT_VECTEUR_3D v)
466     {
467     vec[2]=v;
468     }
469     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur1(void)
470     {
471     return vec[0];
472     }
473     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur2(void)
474     {
475     return vec[1];
476     }
477     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur3(void)
478     {
479     return vec[2];
480     }
481    
482    
483    
484     OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
485     {
486     OT_MATRICE_3D tmp;
487     for (int i=0;i<3;i++) {
488     for (int j=0;j<3;j++) tmp(i,j)= mdd1(i,j)+mdd2(i,j);
489     }
490     return tmp;
491     }
492    
493    
494     OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2)
495     {
496     OT_VECTEUR_3D tmp;
497     tmp(0)=mdd1(0,0)*mdd2(0)+mdd1(0,1)*mdd2(1)+mdd1(0,2)*mdd2(2);
498     tmp(1)=mdd1(1,0)*mdd2(0)+mdd1(1,1)*mdd2(1)+mdd1(1,2)*mdd2(2);
499     tmp(2)=mdd1(2,0)*mdd2(0)+mdd1(2,1)*mdd2(1)+mdd1(2,2)*mdd2(2);
500     return tmp;
501     }
502    
503     OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
504     {
505     OT_VECTEUR_3D tmp;
506     tmp(0)=mdd1(0)+mdd2(0);
507     tmp(1)=mdd1(1)+mdd2(1);
508     tmp(2)=mdd1(2)+mdd2(2);
509     return tmp;
510     }
511    
512     OT_VECTEUR_3D operator-(const class OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
513     {
514     OT_VECTEUR_3D tmp;
515     tmp.valeur[0]=mdd1.valeur[0]-mdd2.valeur[0];
516     tmp.valeur[1]=mdd1.valeur[1]-mdd2.valeur[1];
517     tmp.valeur[2]=mdd1.valeur[2]-mdd2.valeur[2];
518     return tmp;
519     }
520    
521     OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
522     {
523     OT_MATRICE_3D tmp;
524     for (int i=0; i<3; i++)
525     for (int j=0; j<3; j++)
526     {
527     tmp(i,j) = 0;
528     for (int k=0; k<3; k++)
529     tmp(i,j) += mdd1(i,k)*mdd2(k,j);
530     }
531     return tmp;
532     }
533    
534     #ifdef ot_vecteur_4d
535     OT_VECTEUR_4D::OT_VECTEUR_4D (double v[4])
536     {
537     for (int i=0; i<4; i++)
538     valeur[i]=v[i];
539     }
540    
541     OT_VECTEUR_4D::OT_VECTEUR_4D (double x, double y, double z, double w)
542     {
543     valeur[0] = x;
544     valeur[1] = y;
545     valeur[2] = z;
546     valeur[3] = w;
547     }
548    
549     OT_VECTEUR_4D::OT_VECTEUR_4D (const OT_VECTEUR_4D & v)
550     {
551     for (int i=0; i<4; i++)
552     valeur[i]=v[i];
553     }
554    
555    
556     double & OT_VECTEUR_4D::operator()(int i)
557     {
558     return valeur[i];
559     }
560    
561     double OT_VECTEUR_4D::operator()(int i) const
562     {
563     return valeur[i];
564     }
565    
566     double & OT_VECTEUR_4D::operator[](int i)
567     {
568     return valeur[i];
569     }
570    
571     double OT_VECTEUR_4D::operator[](int i) const
572     {
573     return valeur[i];
574     }
575    
576     OT_VECTEUR_4D::operator const double* () const
577     {
578     return valeur;
579     }
580    
581     OT_VECTEUR_4D::operator double* ()
582     {
583     return valeur;
584     }
585    
586     double OT_VECTEUR_4D::get_x(void) const
587     {
588     return valeur[0];
589     }
590     double & OT_VECTEUR_4D::x(void)
591     {
592     return valeur[0];
593     }
594     double OT_VECTEUR_4D::get_y(void) const
595     {
596     return valeur[1];
597     }
598     double & OT_VECTEUR_4D::y(void)
599     {
600     return valeur[1];
601     }
602     double OT_VECTEUR_4D::get_z(void) const
603     {
604     return valeur[2];
605     }
606     double & OT_VECTEUR_4D::z(void)
607     {
608     return valeur[2];
609     }
610     double OT_VECTEUR_4D::get_w(void) const
611     {
612     return valeur[3];
613     }
614     double & OT_VECTEUR_4D::w(void)
615     {
616     return valeur[3];
617     }
618     void OT_VECTEUR_4D::change_x(double x)
619     {
620     valeur[0] = x;
621     }
622     void OT_VECTEUR_4D::change_y(double y)
623     {
624     valeur[1] = y;
625     }
626     void OT_VECTEUR_4D::change_z(double z)
627     {
628     valeur[2] = z;
629     }
630     void OT_VECTEUR_4D::change_w(double w)
631     {
632     valeur[3] = w;
633     }
634     double* OT_VECTEUR_4D::get_xyzw(void)
635     {
636     return valeur;
637     }
638    
639     OT_VECTEUR_4D OT_VECTEUR_4D::operator+ (const OT_VECTEUR_4D & a)
640     {
641     return OT_VECTEUR_4D(
642     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
643     );
644     }
645    
646     OT_VECTEUR_4D OT_VECTEUR_4D::operator- (const OT_VECTEUR_4D & a)
647     {
648     return OT_VECTEUR_4D(
649     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
650     );
651     }
652    
653     OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a)
654     {
655     return OT_VECTEUR_4D(
656     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
657     );
658     }
659     OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV)
660     {
661     return OT_VECTEUR_4D(
662     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
663     );
664     }
665    
666     OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a)
667     {
668     double inv = 1/a;
669     return OT_VECTEUR_4D(
670     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
671     );
672     }
673    
674    
675     OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV)
676     {
677     double inv = 1/a;
678     return OT_VECTEUR_4D(
679     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
680     );
681     }
682    
683     double OT_VECTEUR_4D::operator* (const OT_VECTEUR_4D & a)
684     {
685     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
686     }
687    
688    
689     OT_VECTEUR_4D& OT_VECTEUR_4D::operator+= (const OT_VECTEUR_4D& rkV)
690     {
691     valeur[0] += rkV.valeur[0];
692     valeur[1] += rkV.valeur[1];
693     valeur[2] += rkV.valeur[2];
694     valeur[3] += rkV.valeur[3];
695     return *this;
696     }
697    
698     OT_VECTEUR_4D& OT_VECTEUR_4D::operator-= (const OT_VECTEUR_4D& rkV)
699     {
700     valeur[0] -= rkV.valeur[0];
701     valeur[1] -= rkV.valeur[1];
702     valeur[2] -= rkV.valeur[2];
703     valeur[3] -= rkV.valeur[3];
704     return *this;
705     }
706     OT_VECTEUR_4D& OT_VECTEUR_4D::operator*= (double fScalar)
707     {
708     valeur[0] *= fScalar;
709     valeur[1] *= fScalar;
710     valeur[2] *= fScalar;
711     valeur[3] *= fScalar;
712     return *this;
713     }
714     OT_VECTEUR_4D& OT_VECTEUR_4D::operator/= (double fScalar)
715     {
716     double a = 1/fScalar;
717     valeur[0] *= a;
718     valeur[1] *= a;
719     valeur[2] *= a;
720     valeur[3] *= a;
721     return *this;
722     }
723     OT_VECTEUR_4D &OT_VECTEUR_4D::operator= (double a)
724     {
725     valeur[0]=valeur[1]=valeur[2]=valeur[3]=a;
726     return *this;
727     }
728    
729     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec)
730     {
731     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<", "<<__vec[3]<<"}, ";
732     return __os;
733     }
734     #endif // ot_vecteur_4d
735    
736    
737    
738     // ot_vecteur_3d
739    
740    
741    
742     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 v[3])
743     {
744     for (int i=0; i<3; i++)
745     valeur[i]=v[i];
746     }
747    
748     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 x, double2 y, double2 z)
749     {
750     valeur[0] = x;
751     valeur[1] = y;
752     valeur[2] = z;
753     }
754    
755     OT_VECTEUR_3DD::OT_VECTEUR_3DD (const OT_VECTEUR_3DD & v)
756     {
757     for (int i=0; i<3; i++)
758     valeur[i]=v[i];
759     }
760    
761    
762     double2 & OT_VECTEUR_3DD::operator()(int i)
763     {
764     return valeur[i];
765     }
766    
767     double2 OT_VECTEUR_3DD::operator()(int i) const
768     {
769     return valeur[i];
770     }
771    
772     double2 & OT_VECTEUR_3DD::operator[](int i)
773     {
774     return valeur[i];
775     }
776    
777     double2 OT_VECTEUR_3DD::operator[](int i) const
778     {
779     return valeur[i];
780     }
781    
782     OT_VECTEUR_3DD::operator const double2* () const
783     {
784     return valeur;
785     }
786    
787     OT_VECTEUR_3DD::operator double2* ()
788     {
789     return valeur;
790     }
791    
792     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator =(const OT_VECTEUR_3DD& v3d)
793     {
794     if (this==&v3d) return *this;
795     valeur [0]=v3d.get_x();
796     valeur [1]=v3d.get_y();
797     valeur [2]=v3d.get_z();
798     return *this;
799     }
800     double2 OT_VECTEUR_3DD::norme()
801     {
802     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
803     nor=sqrt(nor);
804     return nor;
805     }
806     OT_VECTEUR_3DD OT_VECTEUR_3DD::vecteur_norme()
807     {
808     OT_VECTEUR_3DD nor;
809     double2 zero=0.;
810     double2 norme= this->norme() ;
811     nor=(*this)*(1./norme);
812     return nor;
813     }
814    
815     double2 OT_VECTEUR_3DD::get_x(void) const
816     {
817     return valeur[0];
818     }
819     double2 & OT_VECTEUR_3DD::x(void)
820     {
821     return valeur[0];
822     }
823     double2 OT_VECTEUR_3DD::get_y(void) const
824     {
825     return valeur[1];
826     }
827     double2 & OT_VECTEUR_3DD::y(void)
828     {
829     return valeur[1];
830     }
831     double2 OT_VECTEUR_3DD::get_z(void) const
832     {
833     return valeur[2];
834     }
835     double2 & OT_VECTEUR_3DD::z(void)
836     {
837     return valeur[2];
838     }
839     void OT_VECTEUR_3DD::change_x(double2 x)
840     {
841     valeur[0] = x;
842     }
843     void OT_VECTEUR_3DD::change_y(double2 y)
844     {
845     valeur[1] = y;
846     }
847     void OT_VECTEUR_3DD::change_z(double2 z)
848     {
849     valeur[2] = z;
850     }
851     double2* OT_VECTEUR_3DD::get_xyz(void)
852     {
853     return valeur;
854     }
855    
856     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator+ (const OT_VECTEUR_3DD & a)
857     {
858     return OT_VECTEUR_3DD(
859     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2]);
860     }
861    
862     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator- (const OT_VECTEUR_3DD & a)
863     {
864     return OT_VECTEUR_3DD(
865     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2));
866     }
867    
868     OT_VECTEUR_3DD operator* (const OT_VECTEUR_3DD & rkV, const double2 a)
869     {
870     return OT_VECTEUR_3DD(
871     a*rkV[0],a*rkV[1],a*rkV[2]);
872     }
873     OT_VECTEUR_3DD operator* (const double2 a, const OT_VECTEUR_3DD & rkV)
874     {
875     return OT_VECTEUR_3DD(
876     a*rkV[0],a*rkV[1],a*rkV[2]);
877     }
878    
879     OT_VECTEUR_3DD operator/ (const OT_VECTEUR_3DD & rkV, const double2 a)
880     {
881     double2 inv = 1/a;
882     return OT_VECTEUR_3DD(
883     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
884     }
885    
886    
887     OT_VECTEUR_3DD operator/ (const double2 a, const OT_VECTEUR_3DD & rkV)
888     {
889     double2 inv = 1/a;
890     return OT_VECTEUR_3DD(
891     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
892     }
893     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator&(const OT_VECTEUR_3DD& v2)
894     {
895     OT_VECTEUR_3DD tmp;
896     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
897     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
898     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
899     return tmp;
900     }
901     double2 OT_VECTEUR_3DD::operator* (const OT_VECTEUR_3DD & a)
902     {
903     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2];
904     }
905    
906    
907     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator+= (const OT_VECTEUR_3DD& rkV)
908     {
909     valeur[0] = valeur[0] +rkV.valeur[0];
910     valeur[1] = valeur[1] +rkV.valeur[1];
911     valeur[2] = valeur[2] +rkV.valeur[2];
912     return *this;
913     }
914    
915     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator-= (const OT_VECTEUR_3DD& rkV)
916     {
917     valeur[0] = valeur[0] -rkV.valeur[0];
918     valeur[1] = valeur[1] -rkV.valeur[1];
919     valeur[2] = valeur[2] -rkV.valeur[2];
920     return *this;
921     }
922     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator*= (double2 fScalar)
923     {
924     valeur[0] =valeur[0] * fScalar;
925     valeur[1] =valeur[1] * fScalar;
926     valeur[2] =valeur[2] * fScalar;
927     return *this;
928     }
929     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator/= (double2 fScalar)
930     {
931     double2 a = 1/fScalar;
932     valeur[0] =valeur[0] * a;
933     valeur[1] =valeur[1] * a;
934     valeur[2] =valeur[2] * a;
935     return *this;
936     }
937    
938    
939     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3DD & __vec)
940     {
941     __os << "[ "<<setw(20)<< __vec[0]<<setw(4)<<", "<<setw(20)<<__vec[1]<<", "<<setw(20)<<__vec[2]<<setw(4)<<", "<<setw(20)<<"] ";
942     return __os;
943     }
944    
945     int OT_VECTEUR_3DD::compare_valeur (const OT_VECTEUR_3DD& mdd) const
946     {
947     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2])
948     return 1;
949     else return 0;
950    
951     }
952    
953     bool OT_VECTEUR_3DD::operator==(const OT_VECTEUR_3DD& mdd) const
954     {
955     return compare_valeur(mdd);
956     }
957    
958    
959    
960    
961    
962    
963    
964    
965    
966    
967     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 v[4])
968     {
969     for (int i=0; i<4; i++)
970     valeur[i]=v[i];
971     }
972    
973     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 x, double2 y, double2 z, double2 w)
974     {
975     valeur[0] = x;
976     valeur[1] = y;
977     valeur[2] = z;
978     valeur[3] = w;
979     }
980    
981     OT_VECTEUR_4DD::OT_VECTEUR_4DD (const OT_VECTEUR_4DD & v)
982     {
983     for (int i=0; i<4; i++)
984     valeur[i]=v[i];
985     }
986    
987    
988     double2 & OT_VECTEUR_4DD::operator()(int i)
989     {
990     return valeur[i];
991     }
992    
993     double2 OT_VECTEUR_4DD::operator()(int i) const
994     {
995     return valeur[i];
996     }
997    
998     double2 & OT_VECTEUR_4DD::operator[](int i)
999     {
1000     return valeur[i];
1001     }
1002    
1003     double2 OT_VECTEUR_4DD::operator[](int i) const
1004     {
1005     return valeur[i];
1006     }
1007    
1008     OT_VECTEUR_4DD::operator const double2* () const
1009     {
1010     return valeur;
1011     }
1012    
1013     OT_VECTEUR_4DD::operator double2* ()
1014     {
1015     return valeur;
1016     }
1017    
1018     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator =(const OT_VECTEUR_4DD& v4d)
1019     {
1020     if (this==&v4d) return *this;
1021     valeur [0]=v4d.get_x();
1022     valeur [1]=v4d.get_y();
1023     valeur [2]=v4d.get_z();
1024     valeur [3]=v4d.get_w();
1025     return *this;
1026     }
1027     double2 OT_VECTEUR_4DD::norme()
1028     {
1029     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2]+valeur [3]*valeur [3];
1030     nor=nor^0.5;
1031     return nor;
1032     }
1033     OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme()
1034     {
1035     OT_VECTEUR_4DD nor;
1036     double2 zero=0.;
1037     double2 norme= this->norme() ;
1038     assert(norme!=zero) ;
1039     nor=(*this)*(1./norme);
1040     return nor;
1041     }
1042    
1043 francois 363 OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme_3d()
1044     {
1045     double2 norme= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
1046     norme=norme^0.5;
1047     OT_VECTEUR_4DD nor;
1048     double2 zero=0.;
1049     assert(norme!=zero) ;
1050     nor.change_x(valeur[0]/norme);
1051     nor.change_y(valeur[1]/norme);
1052     nor.change_z(valeur[2]/norme);
1053     nor.change_w(valeur[3]);
1054     return nor;
1055     }
1056 francois 283 double2 OT_VECTEUR_4DD::get_x(void) const
1057     {
1058     return valeur[0];
1059     }
1060     double2 & OT_VECTEUR_4DD::x(void)
1061     {
1062     return valeur[0];
1063     }
1064     double2 OT_VECTEUR_4DD::get_y(void) const
1065     {
1066     return valeur[1];
1067     }
1068     double2 & OT_VECTEUR_4DD::y(void)
1069     {
1070     return valeur[1];
1071     }
1072     double2 OT_VECTEUR_4DD::get_z(void) const
1073     {
1074     return valeur[2];
1075     }
1076     double2 & OT_VECTEUR_4DD::z(void)
1077     {
1078     return valeur[2];
1079     }
1080     double2 OT_VECTEUR_4DD::get_w(void) const
1081     {
1082     return valeur[3];
1083     }
1084     double2 & OT_VECTEUR_4DD::w(void)
1085     {
1086     return valeur[3];
1087     }
1088     void OT_VECTEUR_4DD::change_x(double2 x)
1089     {
1090     valeur[0] = x;
1091     }
1092     void OT_VECTEUR_4DD::change_y(double2 y)
1093     {
1094     valeur[1] = y;
1095     }
1096     void OT_VECTEUR_4DD::change_z(double2 z)
1097     {
1098     valeur[2] = z;
1099     }
1100     void OT_VECTEUR_4DD::change_w(double2 w)
1101     {
1102     valeur[3] = w;
1103     }
1104     double2* OT_VECTEUR_4DD::get_xyzw(void)
1105     {
1106     return valeur;
1107     }
1108    
1109     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator+ (const OT_VECTEUR_4DD & a)
1110     {
1111     return OT_VECTEUR_4DD(
1112     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
1113     );
1114     }
1115    
1116     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator- (const OT_VECTEUR_4DD & a)
1117     {
1118     return OT_VECTEUR_4DD(
1119     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
1120     );
1121     }
1122    
1123     OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a)
1124     {
1125     return OT_VECTEUR_4DD(
1126     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1127     );
1128     }
1129     OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV)
1130     {
1131     return OT_VECTEUR_4DD(
1132     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1133     );
1134     }
1135    
1136     OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a)
1137     {
1138     double2 inv = 1/a;
1139     return OT_VECTEUR_4DD(
1140     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1141     );
1142     }
1143    
1144    
1145     OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV)
1146     {
1147     double2 inv = 1/a;
1148     return OT_VECTEUR_4DD(
1149     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1150     );
1151     }
1152     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator^(const OT_VECTEUR_4DD& v2)
1153     {
1154     OT_VECTEUR_4DD tmp;
1155     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
1156     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
1157     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
1158     tmp[3]= 0;
1159     //tmp[3]= valeur[1]*v2[2]-valeur[2]*v2[1];
1160     return tmp;
1161     }
1162     double2 OT_VECTEUR_4DD::operator* (const OT_VECTEUR_4DD & a)
1163     {
1164     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
1165     }
1166    
1167    
1168     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator+= (const OT_VECTEUR_4DD& rkV)
1169     {
1170     valeur[0] = valeur[0] +rkV.valeur[0];
1171     valeur[1] = valeur[1] +rkV.valeur[1];
1172     valeur[2] = valeur[2] +rkV.valeur[2];
1173     valeur[3] = valeur[3] +rkV.valeur[3];
1174     return *this;
1175     }
1176    
1177     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator-= (const OT_VECTEUR_4DD& rkV)
1178     {
1179     valeur[0] = valeur[0] -rkV.valeur[0];
1180     valeur[1] = valeur[1] -rkV.valeur[1];
1181     valeur[2] = valeur[2] -rkV.valeur[2];
1182     valeur[3] = valeur[3] -rkV.valeur[3];
1183     return *this;
1184     }
1185     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator*= (double2 fScalar)
1186     {
1187     valeur[0] =valeur[0] * fScalar;
1188     valeur[1] =valeur[1] * fScalar;
1189     valeur[2] =valeur[2] * fScalar;
1190     valeur[3] =valeur[3] * fScalar;
1191     return *this;
1192     }
1193     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator/= (double2 fScalar)
1194     {
1195     double2 a = 1/fScalar;
1196     valeur[0] =valeur[0] * a;
1197     valeur[1] =valeur[1] * a;
1198     valeur[2] =valeur[2] * a;
1199     valeur[3] =valeur[3] * a;
1200     return *this;
1201     }
1202    
1203    
1204     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec)
1205     {
1206     __os << "[ "<<setw(20)<< __vec[0]<<setw(4)<<", "<<setw(20)<<__vec[1]<<", "<<setw(20)<<__vec[2]<<setw(4)<<", "<<setw(20)<<__vec[3]<<setw(4)<<"] ";
1207     return __os;
1208     }
1209    
1210     int OT_VECTEUR_4DD::compare_valeur (const OT_VECTEUR_4DD& mdd) const
1211     {
1212     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2]&&valeur[3]==mdd.valeur[3])
1213     return 1;
1214     else return 0;
1215    
1216     }
1217    
1218     bool OT_VECTEUR_4DD::operator==(const OT_VECTEUR_4DD& mdd) const
1219     {
1220     return compare_valeur(mdd);
1221     }
1222    
1223    
1224    
1225    
1226    
1227    
1228    
1229    
1230    
1231    
1232    
1233    
1234    
1235    
1236    
1237     int OPERATEUR::egal(double a,double b,double eps)
1238     {
1239     double res=fabs(a-b);
1240     if (res<eps) return(1);
1241     return(0);
1242     }
1243    
1244    
1245     double OPERATEUR::qualite_triangle(double* noeud1,double* noeud2,double* noeud3)
1246     {
1247     OT_VECTEUR_3D vec12(noeud1,noeud2);
1248     OT_VECTEUR_3D vec13(noeud1,noeud3);
1249     OT_VECTEUR_3D vec23(noeud2,noeud3);
1250     double d12=vec12.get_longueur();
1251     double d13=vec13.get_longueur();
1252     double d23=vec23.get_longueur();
1253     double dmax=max(d12,d13);
1254     dmax=max(dmax,d23);
1255     double p=0.5*(d12+d13+d23);
1256     double crit=(p-d12)*(p-d13)*(p-d23)/p;
1257     if (crit<0) crit=0.;
1258     crit=sqrt(crit);
1259     crit=crit/dmax;
1260     crit=crit*3.4641101614;
1261     return crit;
1262     }
1263    
1264     void OPERATEUR::doubleto2int(double val,int& val1,int& val2)
1265     {
1266     int *p=(int*)(&(val));
1267     val1=(*p);
1268     val2=(*(p+1));
1269     }
1270    
1271     double OPERATEUR::qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4)
1272     {
1273     OT_VECTEUR_3D ab(noeud1,noeud2);
1274     OT_VECTEUR_3D ac(noeud1,noeud3);
1275     OT_VECTEUR_3D cb(noeud3,noeud2);
1276     OT_VECTEUR_3D db(noeud4,noeud2);
1277     OT_VECTEUR_3D da(noeud4,noeud1);
1278     OT_VECTEUR_3D dc(noeud4,noeud3);
1279     double dab=ab.get_longueur();
1280     double dac=ac.get_longueur();
1281     double dcb=cb.get_longueur();
1282     double ddb=db.get_longueur();
1283     double dda=da.get_longueur();
1284     double ddc=dc.get_longueur();
1285    
1286     double dmax=max(dab,dac);
1287     dmax=max(dmax,dcb);
1288     dmax=max(dmax,ddb);
1289     dmax=max(dmax,dda);
1290     dmax=max(dmax,ddc);
1291    
1292     OT_VECTEUR_3D pvec=ab&ac;
1293     double vol=pvec*da;
1294     if (vol>0.) return 0.;
1295     vol=fabs(vol);
1296     double som=pvec.get_longueur()/2.;
1297     pvec=ab&da;
1298     som=som+pvec.get_longueur()/2.;
1299     pvec=ac&dc;
1300     som=som+pvec.get_longueur()/2.;
1301     pvec=cb&db;
1302     som=som+pvec.get_longueur()/2.;
1303     double crit=vol/som/dmax/0.408249;
1304     return crit;
1305     }
1306    
1307    
1308    
1309     template <int N> DOUBLEN<N>::DOUBLEN()
1310     {
1311     tab[0]=-1;
1312     }
1313    
1314     template <int N> DOUBLEN<N>::DOUBLEN(DOUBLEN& mdd)
1315     {
1316     for (int i=0;i<N;i++)
1317     tab[i]=mdd.tab[i];
1318     }
1319    
1320     template <int N> DOUBLEN<N>::DOUBLEN(double *v)
1321     {
1322     for (int i=0;i<N;i++)
1323     tab[i]=v[i];
1324     }
1325    
1326     template <int N> DOUBLEN<N>::~DOUBLEN()
1327     {
1328     }
1329    
1330     template <int N> double DOUBLEN<N>::get_valeur(int num)
1331     {
1332     return tab[num];
1333     }
1334    
1335     template <int N> void DOUBLEN<N>::change_valeur(int num,double val)
1336     {
1337     tab[num]=val;
1338     }
1339    
1340     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(DOUBLEN<N> & mdd)
1341     {
1342     for (int i=0;i<N;i++)
1343     tab[i]=mdd.tab[i];
1344     return *this;
1345     }
1346    
1347     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(const DOUBLEN<N> & mdd)
1348     {
1349     for (int i=0;i<N;i++)
1350     tab[i]=mdd.tab[i];
1351     return *this;
1352     }
1353    
1354    
1355     #ifdef BORLANDCPP
1356     // instanciation pour Windows (Borland c++)
1357     template class __export DOUBLEN<1>;
1358     template class __export DOUBLEN<4>;
1359     template class __export DOUBLEN<10>;
1360     #else
1361     #ifdef GCC
1362     // instanciation pour Unix (g++)
1363     template class DOUBLEN<1>;
1364     template class DOUBLEN<4>;
1365     template class DOUBLEN<10>;
1366     #else
1367     // instanciation pour Windows (Visual Studio)
1368     #endif
1369     #endif
1370    
1371