ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 968
Committed: Sun Sep 16 15:27:49 2018 UTC (6 years, 8 months ago) by couturad
File size: 43545 byte(s)
Log Message:
Ajout d'une condition de sortie et d'un renvoi d'erreur pour le mailleur FEM.
Subdivision des fichiers mstruct_analyse.h/.cpp en sous fichiers pour une meilleure lisibilite.
Ajout d'une analyse des modules d'elasticite.
Ajout d'une analyse de l'energie.
Reconfiguration du main de microstructure.exe (suppression d'actions obsolètes).
Reconfiguration des fichiers generer_nb_ves, post_process.

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 couturad 926 #include <fstream>
32 francois 283 #include "ot_mathematique.h"
33    
34    
35 couturad 926 OT_HISTOGRAMME::OT_HISTOGRAMME(void)
36     {
37     m_i_min=0;
38     m_i_max=0;
39     m_init=false;
40     m_largeur_colonne=0;
41     }
42 couturad 919
43     OT_HISTOGRAMME::OT_HISTOGRAMME(double largeur_colonne):m_largeur_colonne(largeur_colonne)
44     {
45     m_i_min=0;
46     m_i_max=0;
47     m_init=false;
48     }
49    
50 couturad 968 OT_HISTOGRAMME::OT_HISTOGRAMME(OT_HISTOGRAMME& mdd)
51 couturad 926 {
52     m_largeur_colonne=mdd.m_largeur_colonne;
53     m_i_min=mdd.m_i_min;
54     m_i_max=mdd.m_i_max;
55     m_init=mdd.m_init;
56 couturad 968 m_map_colonne=mdd.m_map_colonne;
57 couturad 926 }
58    
59 couturad 919 OT_HISTOGRAMME::~OT_HISTOGRAMME(void)
60     {
61     m_map_colonne.clear();
62     }
63    
64 couturad 926 void OT_HISTOGRAMME::fixe_largeur_colonne(double largeur_colonne)
65     {
66     m_largeur_colonne=largeur_colonne;
67     }
68    
69     double OT_HISTOGRAMME::get_largeur_colonne(void)
70     {
71     return m_largeur_colonne;
72     }
73    
74 couturad 919 void OT_HISTOGRAMME::ajouter_valeur(double x,double val)
75     {
76     long i = (long)(x/m_largeur_colonne);
77     ajouter_valeur(i,val);
78     }
79    
80     void OT_HISTOGRAMME::ajouter_valeur(long int i, double val)
81     {
82 couturad 926 if(!m_init)
83 couturad 919 {
84     m_i_min=i;
85     m_i_max=i;
86     m_map_colonne.insert(std::pair<long,double>(i,val));
87     m_init=true;
88     }
89     else if(i>m_i_max)
90     {
91 couturad 968 // for(long j=i-1;j>m_i_max;j--)
92     // m_map_colonne.insert(std::pair<long,double>(j,0.0));
93 couturad 919 m_i_max=i;
94     m_map_colonne.insert(std::pair<long,double>(i,val));
95     }
96     else if(i<m_i_min)
97     {
98 couturad 968 // for(long j=i+1;j<m_i_min;j++)
99     // m_map_colonne.insert(std::pair<long,double>(j,0.0));
100 couturad 919 m_i_min=i;
101     m_map_colonne.insert(std::pair<long,double>(i,val));
102     }
103     else
104     {
105 couturad 968 std::map<long,double>::iterator it;
106     it=m_map_colonne.find(i);
107     if(it==m_map_colonne.end())
108     {
109     m_map_colonne.insert(std::pair<long,double>(i,val));
110     }
111     else it->second+=val;
112 couturad 919 }
113     }
114    
115 couturad 968 int OT_HISTOGRAMME::get_valeur(double x, double& val)
116 couturad 919 {
117     long i = (long)(x/m_largeur_colonne);
118 couturad 968 return get_valeur(i,val);
119     }
120    
121     int OT_HISTOGRAMME::get_valeur(long i, double& val)
122     {
123 couturad 919 std::map<long,double>::iterator it;
124     it=m_map_colonne.find(i);
125     if(it==m_map_colonne.end())
126     {
127 couturad 968 return 0;
128 couturad 919 }
129 couturad 968 val=it->second;
130     return 1;
131 couturad 919 }
132    
133 couturad 968
134 couturad 926 int OT_HISTOGRAMME::get_premiere_valeur(std::map< long, double >::iterator& it,double &valeur)
135 couturad 919 {
136     it=m_map_colonne.begin();
137 couturad 926 if(it==m_map_colonne.end()) return 0;
138 couturad 919 valeur = it->second;
139 couturad 926 return 1;
140     }
141    
142     int OT_HISTOGRAMME::get_suivante_valeur(std::map< long, double >::iterator& it,double &valeur)
143     {
144     it++;
145     if(it==m_map_colonne.end()) return 0;
146     valeur = it->second;
147     return 1;
148     }
149    
150     int OT_HISTOGRAMME::get_premiere_valeur(std::map< long, double >::iterator& it,double &valeur,double &borne_min,double &borne_max)
151     {
152     it=m_map_colonne.begin();
153     if(it==m_map_colonne.end()) return 0;
154     valeur = it->second;
155 couturad 919 borne_min=(it->first)*m_largeur_colonne;
156 couturad 926 borne_max=(it->first)*m_largeur_colonne+m_largeur_colonne;
157     return 1;
158 couturad 919 }
159    
160 couturad 926 int OT_HISTOGRAMME::get_suivante_valeur(std::map< long, double >::iterator& it,double &valeur,double &borne_min,double &borne_max)
161 couturad 919 {
162     it++;
163 couturad 926 if(it==m_map_colonne.end()) return 0;
164 couturad 919 valeur = it->second;
165     borne_min=(it->first)*m_largeur_colonne;
166 couturad 926 borne_max=(it->first)*m_largeur_colonne+m_largeur_colonne;
167     return 1;
168 couturad 919 }
169    
170 couturad 926 int OT_HISTOGRAMME::get_premiere_valeur(std::map< long, double >::iterator& it, double &valeur, long int& i)
171     {
172     it=m_map_colonne.begin();
173     if(it==m_map_colonne.end()) return 0;
174     valeur = it->second;
175     i = it->first;
176     return 1;
177     }
178    
179     int OT_HISTOGRAMME::get_suivante_valeur(std::map< long, double >::iterator& it, double &valeur, long int& i)
180     {
181     it++;
182     if(it==m_map_colonne.end()) return 0;
183     valeur = it->second;
184     i = it->first;
185     return 1;
186     }
187    
188 couturad 919 long int OT_HISTOGRAMME::get_nb_colonne(void)
189     {
190     return m_map_colonne.size();
191     }
192    
193     double OT_HISTOGRAMME::get_x_min(void)
194     {
195     return m_i_min*m_largeur_colonne;
196     }
197    
198     double OT_HISTOGRAMME::get_x_max(void)
199     {
200 couturad 926 return m_i_max*m_largeur_colonne+m_largeur_colonne;
201 couturad 919 }
202    
203 couturad 926 OT_HISTOGRAMME& OT_HISTOGRAMME::operator=(OT_HISTOGRAMME& mdd)
204     {
205     m_largeur_colonne=mdd.m_largeur_colonne;
206     m_i_min=mdd.m_i_min;
207     m_i_max=mdd.m_i_max;
208     m_init=mdd.m_init;
209     m_map_colonne=mdd.m_map_colonne;
210     }
211 couturad 919
212 couturad 966 OT_HISTOGRAMME & OT_HISTOGRAMME::operator=(const OT_HISTOGRAMME& mdd)
213     {
214     m_largeur_colonne=mdd.m_largeur_colonne;
215     m_i_min=mdd.m_i_min;
216     m_i_max=mdd.m_i_max;
217     m_init=mdd.m_init;
218     m_map_colonne=mdd.m_map_colonne;
219     }
220    
221    
222 couturad 951 void OT_HISTOGRAMME::enregistrer_bin(std::ofstream& ofstr)
223 couturad 926 {
224     ofstr.write((char*)&m_init,sizeof(bool));
225     ofstr.write((char*)&m_i_min,sizeof(long));
226     ofstr.write((char*)&m_i_max,sizeof(long));
227     ofstr.write((char*)&m_largeur_colonne,sizeof(double));
228     long nb_colonne = get_nb_colonne();
229     ofstr.write((char*)&nb_colonne,sizeof(long));
230     std::map<long,double>::iterator it;
231     for(it=m_map_colonne.begin();it!=m_map_colonne.end();it++)
232     {
233     long i = it->first;
234     ofstr.write((char*)&i,sizeof(long));
235     double val = it->second;
236     ofstr.write((char*)&val,sizeof(double));
237     }
238     }
239    
240 couturad 951 void OT_HISTOGRAMME::ouvrir_bin(std::ifstream& ifstr)
241 couturad 926 {
242     ifstr.read((char*)&m_init,sizeof(bool));
243     ifstr.read((char*)&m_i_min,sizeof(long));
244     ifstr.read((char*)&m_i_max,sizeof(long));
245     ifstr.read((char*)&m_largeur_colonne,sizeof(double));
246     long nb_colonne;
247     ifstr.read((char*)&nb_colonne,sizeof(long));
248     for(long j=0;j<nb_colonne;j++)
249     {
250     long k;
251     ifstr.read((char*)&k,sizeof(long));
252     double val;
253     ifstr.read((char*)&val,sizeof(double));
254     ajouter_valeur(k,val);
255     }
256     }
257    
258 couturad 951 void OT_HISTOGRAMME::exporter(std::ofstream& ofstrm)
259 couturad 926 {
260     ofstrm << "x_min x_max x_milieu valeur" << std::endl;
261     std::map<long,double>::iterator it_his;
262     double val;
263     double borne_min,borne_max;
264     int k=get_premiere_valeur(it_his,val,borne_min,borne_max);
265     while(k!=0)
266     {
267     double borne_mid = borne_min+m_largeur_colonne/2.;
268     ofstrm << borne_min << " " << borne_max << " " << borne_mid << " " << val << std::endl;
269     k=get_suivante_valeur(it_his,val,borne_min,borne_max);
270     }
271     }
272    
273    
274 couturad 906 OT_QUATERNION::OT_QUATERNION(void)
275     {
276     valeur[0]=0;
277     valeur[1]=0;
278     valeur[2]=0;
279     valeur[3]=0;
280     }
281 francois 283
282 couturad 906 OT_QUATERNION::OT_QUATERNION(double x, double y, double z, double w)
283     {
284     valeur[0]=x;
285     valeur[1]=y;
286     valeur[2]=z;
287     valeur[3]=w;
288     }
289    
290     OT_QUATERNION::OT_QUATERNION(OT_QUATERNION& mdd)
291     {
292     valeur[0]=mdd.valeur[0];
293     valeur[1]=mdd.valeur[1];
294     valeur[2]=mdd.valeur[2];
295     valeur[3]=mdd.valeur[3];
296     }
297    
298     double OT_QUATERNION::get_x(void)
299     {
300     return valeur[0];
301     }
302    
303     void OT_QUATERNION::change_x(double x)
304     {
305     valeur[0]=x;
306     }
307    
308     double OT_QUATERNION::get_y(void)
309     {
310     return valeur[1];
311     }
312    
313     void OT_QUATERNION::change_y(double y)
314     {
315     valeur[1]=y;
316     }
317    
318     double OT_QUATERNION::get_z(void)
319     {
320     return valeur[2];
321     }
322    
323     void OT_QUATERNION::change_z(double z)
324     {
325     valeur[2]=z;
326     }
327    
328     double OT_QUATERNION::get_w(void)
329     {
330     return valeur[3];
331     }
332    
333     void OT_QUATERNION::change_w(double w)
334     {
335     valeur[3]=w;
336     }
337    
338     OT_QUATERNION& OT_QUATERNION::operator=(OT_QUATERNION& mdd)
339     {
340     valeur[0]=mdd.valeur[0];
341     valeur[1]=mdd.valeur[1];
342     valeur[2]=mdd.valeur[2];
343     valeur[3]=mdd.valeur[3];
344     return *this;
345     }
346    
347    
348 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double x,double y,double z)
349 foucault 27 {
350 francois 283 valeur[0]=x;
351     valeur[1]=y;
352     valeur[2]=z;
353 foucault 27 }
354 francois 249
355    
356 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz)
357     {
358     valeur[0]=xyz[0];
359     valeur[1]=xyz[1];
360     valeur[2]=xyz[2];
361     }
362 francois 249
363 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz1,double *xyz2)
364     {
365     valeur[0]=xyz2[0]-xyz1[0];
366     valeur[1]=xyz2[1]-xyz1[1];
367     valeur[2]=xyz2[2]-xyz1[2];
368     }
369 souaissa 69
370 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd)
371     {
372     valeur[0]=mdd.valeur[0];
373     valeur[1]=mdd.valeur[1];
374     valeur[2]=mdd.valeur[2];
375     }
376    
377     OT_VECTEUR_3D::OT_VECTEUR_3D(void)
378     {
379     valeur[0]=0.;
380     valeur[1]=0.;
381     valeur[2]=0.;
382     }
383    
384     double OT_VECTEUR_3D::get_x(void) const
385     {
386     return valeur[0];
387     }
388    
389    
390     double OT_VECTEUR_3D::get_y(void) const
391     {
392     return valeur[1];
393     }
394    
395    
396     double OT_VECTEUR_3D::get_z(void) const
397     {
398     return valeur[2];
399     }
400    
401     void OT_VECTEUR_3D::change_x(double x)
402     {
403     valeur[0]=x;
404     }
405    
406     void OT_VECTEUR_3D::change_y(double y)
407     {
408     valeur[1]=y;
409     }
410    
411     void OT_VECTEUR_3D::change_z(double z)
412     {
413     valeur[2]=z;
414     }
415    
416     double* OT_VECTEUR_3D::get_xyz(void)
417     {
418     return valeur;
419     }
420    
421     OT_VECTEUR_3D::operator const double* () const
422     {
423     return valeur;
424     }
425    
426     OT_VECTEUR_3D::operator double* ()
427     {
428     return valeur;
429     }
430    
431     double OT_VECTEUR_3D::operator[] (int i) const
432     {
433     return valeur[i];
434     }
435    
436     double & OT_VECTEUR_3D::operator[] (int i)
437     {
438     return valeur[i];
439     }
440    
441     double OT_VECTEUR_3D::operator() (int i) const
442     {
443     return valeur[i];
444     }
445     double & OT_VECTEUR_3D::operator() (int i)
446     {
447     return valeur[i];
448     }
449    
450     double OT_VECTEUR_3D::get_longueur(void) const
451     {
452     return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
453     }
454    
455     double OT_VECTEUR_3D::get_longueur2(void) const
456     {
457     return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
458     }
459    
460    
461     void OT_VECTEUR_3D::norme(void)
462     {
463     double longueur=get_longueur();
464     if (longueur != 0)
465     {
466     valeur[0]=valeur[0]/longueur;
467     valeur[2]=valeur[2]/longueur;
468     valeur[1]=valeur[1]/longueur;
469     }
470     }
471    
472     OT_VECTEUR_3D OT_VECTEUR_3D::gram_shmidt(const OT_VECTEUR_3D& vint)
473     {
474     OT_VECTEUR_3D v(0.,0.,0.);
475     double alpha=(*this)*vint;
476     v= *this-alpha*vint;
477     return v;
478     }
479    
480     OT_VECTEUR_3D OT_VECTEUR_3D::unite(int i)
481     {
482     OT_VECTEUR_3D v(0.,0.,0.);
483     v[i]=1.;
484     return v;
485     }
486    
487    
488     int OT_VECTEUR_3D::compare_valeur (const OT_VECTEUR_3D& mdd) const
489     {
490     return memcmp(valeur, mdd.valeur, 3*sizeof(double));
491     }
492    
493     bool OT_VECTEUR_3D::operator== (const OT_VECTEUR_3D& mdd) const
494     {
495     return compare_valeur(mdd) == 0;
496     }
497    
498     bool OT_VECTEUR_3D::operator!= (const OT_VECTEUR_3D& mdd) const
499     {
500     return compare_valeur(mdd) != 0;
501     }
502    
503     bool OT_VECTEUR_3D::operator< (const OT_VECTEUR_3D& mdd) const
504     {
505     return compare_valeur(mdd) < 0;
506     }
507    
508     bool OT_VECTEUR_3D::operator<= (const OT_VECTEUR_3D& mdd) const
509     {
510     return compare_valeur(mdd) <= 0;
511     }
512    
513     bool OT_VECTEUR_3D::operator> (const OT_VECTEUR_3D& mdd) const
514     {
515     return compare_valeur(mdd) > 0;
516     }
517    
518     bool OT_VECTEUR_3D::operator>= (const OT_VECTEUR_3D& mdd) const
519     {
520     return compare_valeur(mdd) >= 0;
521     }
522    
523     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec)
524     {
525     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<"}, ";
526     return __os;
527     }
528    
529     OT_VECTEUR_3D operator/ (const OT_VECTEUR_3D& mdd1, double diviseur)
530     {
531     OT_VECTEUR_3D kQuot;
532    
533     if ( diviseur != (double)0.0 )
534     {
535     double facteur = ((double)1.0)/diviseur;
536     kQuot.valeur[0] = facteur*mdd1.valeur[0];
537     kQuot.valeur[1] = facteur*mdd1.valeur[1];
538     kQuot.valeur[2] = facteur*mdd1.valeur[2];
539     }
540     else
541     {
542     kQuot.valeur[0] = 1E300;
543     kQuot.valeur[1] = 1E300;
544     kQuot.valeur[2] = 1E300;
545     }
546    
547     return kQuot;
548     }
549    
550     OT_VECTEUR_3D operator- (const OT_VECTEUR_3D& mdd1)
551     {
552     return OT_VECTEUR_3D(
553     -mdd1.valeur[0],
554     -mdd1.valeur[1],
555     -mdd1.valeur[2]);
556     }
557    
558     double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
559     {
560     double tmp;
561     tmp=mdd1.valeur[0]*mdd2.valeur[0]+mdd1.valeur[1]*mdd2.valeur[1]+mdd1.valeur[2]*mdd2.valeur[2];
562     return tmp;
563     }
564    
565     OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2)
566     {
567     OT_VECTEUR_3D tmp;
568     tmp.valeur[0]=mdd1*mdd2.valeur[0];
569     tmp.valeur[1]=mdd1*mdd2.valeur[1];
570     tmp.valeur[2]=mdd1*mdd2.valeur[2];
571     return tmp;
572     }
573    
574     OT_VECTEUR_3D& OT_VECTEUR_3D::operator+= (const OT_VECTEUR_3D& mdd)
575     {
576     valeur[0] += mdd.valeur[0];
577     valeur[1] += mdd.valeur[1];
578     valeur[2] += mdd.valeur[2];
579     return *this;
580     }
581     OT_VECTEUR_3D& OT_VECTEUR_3D::operator-= (const OT_VECTEUR_3D& mdd)
582     {
583     valeur[0] -= mdd.valeur[0];
584     valeur[1] -= mdd.valeur[1];
585     valeur[2] -= mdd.valeur[2];
586     return *this;
587     }
588     OT_VECTEUR_3D& OT_VECTEUR_3D::operator*= (double facteur)
589     {
590     valeur[0] *= facteur;
591     valeur[1] *= facteur;
592     valeur[2] *= facteur;
593     return *this;
594     }
595     OT_VECTEUR_3D& OT_VECTEUR_3D::operator/= (double diviseur)
596     {
597     if ( diviseur != (double)0.0 )
598     {
599     double facteur = ((double)1.0)/diviseur;
600     valeur[0] *= facteur;
601     valeur[1] *= facteur;
602     valeur[2] *= facteur;
603     }
604     else
605     {
606     valeur[0] = 1E300;
607     valeur[1] = 1E300;
608     valeur[2] = 1E300;
609     }
610    
611     return *this;
612     }
613    
614     OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
615     {
616     OT_VECTEUR_3D tmp;
617     tmp.valeur[0]=mdd1.valeur[1]*mdd2.valeur[2]-mdd1.valeur[2]*mdd2.valeur[1];
618     tmp.valeur[1]=mdd1.valeur[2]*mdd2.valeur[0]-mdd1.valeur[0]*mdd2.valeur[2];
619     tmp.valeur[2]=mdd1.valeur[0]*mdd2.valeur[1]-mdd1.valeur[1]*mdd2.valeur[0];
620     return tmp;
621     }
622    
623     double OT_VECTEUR_3D::diff(void)
624     {
625     return 0.33333333333333*(fabs(valeur[0])+fabs(valeur[1])+fabs(valeur[2]));
626     }
627    
628    
629     OT_MATRICE_3D::OT_MATRICE_3D(OT_VECTEUR_3D& colonne1,OT_VECTEUR_3D& colonne2,OT_VECTEUR_3D& colonne3)
630     {
631     vec[0]=colonne1;
632     vec[1]=colonne2;
633     vec[2]=colonne3;
634     }
635    
636     OT_MATRICE_3D::OT_MATRICE_3D(const OT_MATRICE_3D& mdd)
637     {
638     vec[0]=mdd.vec[0];
639     vec[1]=mdd.vec[1];
640     vec[2]=mdd.vec[2];
641     }
642    
643     OT_MATRICE_3D::OT_MATRICE_3D(void)
644     {
645     for (int i=0;i<3;i++)
646     {
647     for (int j=0;j<3;j++)
648     {
649     vec[i][j]=0.;
650     }
651    
652     }
653    
654     }
655     std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat)
656     {
657    
658     __os << "{ ";
659     for (unsigned i=0; i<3; i++)
660     {
661     __os << "[ "<< __mat(i,0)<<" ]\t [ "<<__mat(i,1) <<" ]\t [ "<<__mat(i,2);
662     if (i+1 < 3)
663     __os << std::endl << " ";
664     }
665     __os << " }" << std::endl;
666     return __os;
667     }
668    
669     OT_VECTEUR_3D & OT_MATRICE_3D::operator [](int i)
670     {
671     return vec[i];
672     }
673    
674     OT_MATRICE_3D::OT_MATRICE_3D(double* t)
675     {
676     for (int i=0;i<3;i++)
677     {
678     for (int j=0;j<3;j++)
679     {
680     vec[i][j]=t[i*3+j];
681     }
682    
683     }
684     }
685    
686     double OT_MATRICE_3D::valeur(int iLigne, int iCol) const
687     {
688     return vec[iCol][iLigne];
689     }
690     double & OT_MATRICE_3D::valeur(int iLigne, int iCol)
691     {
692     return vec[iCol][iLigne];
693     }
694     double OT_MATRICE_3D::operator() (int iLigne, int iCol) const
695     {
696     return vec[iCol][iLigne];
697     }
698     double & OT_MATRICE_3D::operator() (int iLigne, int iCol)
699     {
700     return vec[iCol][iLigne];
701     }
702     double OT_MATRICE_3D::get_determinant()
703     {
704     double coFacteur0 = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
705     double coFacteur1 = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
706     double coFacteur2 = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
707     double determinant = valeur(0,0)*coFacteur0 + valeur(0,1)*coFacteur1 + valeur(0,2)*coFacteur2;
708     return determinant;
709     }
710     void OT_MATRICE_3D::identite(void)
711     {
712     for (unsigned i = 0; i<3; i++)
713     for (unsigned j = 0; j < 3; j++)
714     vec[i][j] = (i==j) ? 1.0 : 0.0 ;
715     }
716    
717     void OT_MATRICE_3D::transpose(OT_MATRICE_3D& res) const
718     {
719     for (unsigned i = 0; i<3; i++)
720     for (unsigned j = 0; j < 3; j++)
721     res.vec[i][j] = vec[j][i];
722     }
723    
724     OT_MATRICE_3D OT_MATRICE_3D::transpose() const
725     {
726     OT_MATRICE_3D temp;
727     for (unsigned i = 0; i<3; i++)
728     for (unsigned j = 0; j < 3; j++)
729     temp.valeur(i,j) =valeur(j,i);
730    
731     return temp;
732     }
733    
734     OT_MATRICE_3D OT_MATRICE_3D::inverse () const
735     {
736     // Invert a 3x3 using cofactors. This is faster than using a generic
737     // Gaussian elimination because of the loop overhead of such a method.
738    
739     OT_MATRICE_3D matInverse;
740    
741     matInverse.valeur(0,0) = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
742     matInverse.valeur(0,1) = valeur(0,2)*valeur(2,1) - valeur(0,1)*valeur(2,2);
743     matInverse.valeur(0,2) = valeur(0,1)*valeur(1,2) - valeur(0,2)*valeur(1,1);
744     matInverse.valeur(1,0) = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
745     matInverse.valeur(1,1) = valeur(0,0)*valeur(2,2) - valeur(0,2)*valeur(2,0);
746     matInverse.valeur(1,2) = valeur(0,2)*valeur(1,0) - valeur(0,0)*valeur(1,2);
747     matInverse.valeur(2,0) = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
748     matInverse.valeur(2,1) = valeur(0,1)*valeur(2,0) - valeur(0,0)*valeur(2,1);
749     matInverse.valeur(2,2) = valeur(0,0)*valeur(1,1) - valeur(0,1)*valeur(1,0);
750    
751     double det = valeur(0,0)*matInverse(0,0) + valeur(0,1)*matInverse(1,0)+
752     valeur(0,2)*matInverse(2,0);
753    
754     if ( fabs(det) <= 1E-100 )
755     {
756     matInverse.identite();
757     return matInverse;
758     }
759    
760     double invDet = 1/det;
761    
762     for (int i=0; i<3; i++)
763     for (int j=0; j<3; j++)
764     matInverse.vec[i][j] *= invDet;
765    
766     return matInverse;
767     }
768    
769     void OT_MATRICE_3D::change_vecteur1(OT_VECTEUR_3D v)
770     {
771     vec[0]=v;
772     }
773     void OT_MATRICE_3D::change_vecteur2(OT_VECTEUR_3D v)
774     {
775     vec[1]=v;
776     }
777     void OT_MATRICE_3D::change_vecteur3(OT_VECTEUR_3D v)
778     {
779     vec[2]=v;
780     }
781     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur1(void)
782     {
783     return vec[0];
784     }
785     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur2(void)
786     {
787     return vec[1];
788     }
789     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur3(void)
790     {
791     return vec[2];
792     }
793    
794    
795    
796     OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
797     {
798     OT_MATRICE_3D tmp;
799     for (int i=0;i<3;i++) {
800     for (int j=0;j<3;j++) tmp(i,j)= mdd1(i,j)+mdd2(i,j);
801     }
802     return tmp;
803     }
804    
805    
806     OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2)
807     {
808     OT_VECTEUR_3D tmp;
809     tmp(0)=mdd1(0,0)*mdd2(0)+mdd1(0,1)*mdd2(1)+mdd1(0,2)*mdd2(2);
810     tmp(1)=mdd1(1,0)*mdd2(0)+mdd1(1,1)*mdd2(1)+mdd1(1,2)*mdd2(2);
811     tmp(2)=mdd1(2,0)*mdd2(0)+mdd1(2,1)*mdd2(1)+mdd1(2,2)*mdd2(2);
812     return tmp;
813     }
814    
815     OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
816     {
817     OT_VECTEUR_3D tmp;
818     tmp(0)=mdd1(0)+mdd2(0);
819     tmp(1)=mdd1(1)+mdd2(1);
820     tmp(2)=mdd1(2)+mdd2(2);
821     return tmp;
822     }
823    
824     OT_VECTEUR_3D operator-(const class OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
825     {
826     OT_VECTEUR_3D tmp;
827     tmp.valeur[0]=mdd1.valeur[0]-mdd2.valeur[0];
828     tmp.valeur[1]=mdd1.valeur[1]-mdd2.valeur[1];
829     tmp.valeur[2]=mdd1.valeur[2]-mdd2.valeur[2];
830     return tmp;
831     }
832    
833     OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
834     {
835     OT_MATRICE_3D tmp;
836     for (int i=0; i<3; i++)
837     for (int j=0; j<3; j++)
838     {
839     tmp(i,j) = 0;
840     for (int k=0; k<3; k++)
841     tmp(i,j) += mdd1(i,k)*mdd2(k,j);
842     }
843     return tmp;
844     }
845    
846     #ifdef ot_vecteur_4d
847     OT_VECTEUR_4D::OT_VECTEUR_4D (double v[4])
848     {
849     for (int i=0; i<4; i++)
850     valeur[i]=v[i];
851     }
852    
853     OT_VECTEUR_4D::OT_VECTEUR_4D (double x, double y, double z, double w)
854     {
855     valeur[0] = x;
856     valeur[1] = y;
857     valeur[2] = z;
858     valeur[3] = w;
859     }
860    
861     OT_VECTEUR_4D::OT_VECTEUR_4D (const OT_VECTEUR_4D & v)
862     {
863     for (int i=0; i<4; i++)
864     valeur[i]=v[i];
865     }
866    
867    
868     double & OT_VECTEUR_4D::operator()(int i)
869     {
870     return valeur[i];
871     }
872    
873     double OT_VECTEUR_4D::operator()(int i) const
874     {
875     return valeur[i];
876     }
877    
878     double & OT_VECTEUR_4D::operator[](int i)
879     {
880     return valeur[i];
881     }
882    
883     double OT_VECTEUR_4D::operator[](int i) const
884     {
885     return valeur[i];
886     }
887    
888     OT_VECTEUR_4D::operator const double* () const
889     {
890     return valeur;
891     }
892    
893     OT_VECTEUR_4D::operator double* ()
894     {
895     return valeur;
896     }
897    
898     double OT_VECTEUR_4D::get_x(void) const
899     {
900     return valeur[0];
901     }
902     double & OT_VECTEUR_4D::x(void)
903     {
904     return valeur[0];
905     }
906     double OT_VECTEUR_4D::get_y(void) const
907     {
908     return valeur[1];
909     }
910     double & OT_VECTEUR_4D::y(void)
911     {
912     return valeur[1];
913     }
914     double OT_VECTEUR_4D::get_z(void) const
915     {
916     return valeur[2];
917     }
918     double & OT_VECTEUR_4D::z(void)
919     {
920     return valeur[2];
921     }
922     double OT_VECTEUR_4D::get_w(void) const
923     {
924     return valeur[3];
925     }
926     double & OT_VECTEUR_4D::w(void)
927     {
928     return valeur[3];
929     }
930     void OT_VECTEUR_4D::change_x(double x)
931     {
932     valeur[0] = x;
933     }
934     void OT_VECTEUR_4D::change_y(double y)
935     {
936     valeur[1] = y;
937     }
938     void OT_VECTEUR_4D::change_z(double z)
939     {
940     valeur[2] = z;
941     }
942     void OT_VECTEUR_4D::change_w(double w)
943     {
944     valeur[3] = w;
945     }
946     double* OT_VECTEUR_4D::get_xyzw(void)
947     {
948     return valeur;
949     }
950    
951     OT_VECTEUR_4D OT_VECTEUR_4D::operator+ (const OT_VECTEUR_4D & a)
952     {
953     return OT_VECTEUR_4D(
954     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
955     );
956     }
957    
958     OT_VECTEUR_4D OT_VECTEUR_4D::operator- (const OT_VECTEUR_4D & a)
959     {
960     return OT_VECTEUR_4D(
961     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
962     );
963     }
964    
965     OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a)
966     {
967     return OT_VECTEUR_4D(
968     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
969     );
970     }
971     OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV)
972     {
973     return OT_VECTEUR_4D(
974     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
975     );
976     }
977    
978     OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a)
979     {
980     double inv = 1/a;
981     return OT_VECTEUR_4D(
982     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
983     );
984     }
985    
986    
987     OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV)
988     {
989     double inv = 1/a;
990     return OT_VECTEUR_4D(
991     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
992     );
993     }
994    
995     double OT_VECTEUR_4D::operator* (const OT_VECTEUR_4D & a)
996     {
997     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
998     }
999    
1000    
1001     OT_VECTEUR_4D& OT_VECTEUR_4D::operator+= (const OT_VECTEUR_4D& rkV)
1002     {
1003     valeur[0] += rkV.valeur[0];
1004     valeur[1] += rkV.valeur[1];
1005     valeur[2] += rkV.valeur[2];
1006     valeur[3] += rkV.valeur[3];
1007     return *this;
1008     }
1009    
1010     OT_VECTEUR_4D& OT_VECTEUR_4D::operator-= (const OT_VECTEUR_4D& rkV)
1011     {
1012     valeur[0] -= rkV.valeur[0];
1013     valeur[1] -= rkV.valeur[1];
1014     valeur[2] -= rkV.valeur[2];
1015     valeur[3] -= rkV.valeur[3];
1016     return *this;
1017     }
1018     OT_VECTEUR_4D& OT_VECTEUR_4D::operator*= (double fScalar)
1019     {
1020     valeur[0] *= fScalar;
1021     valeur[1] *= fScalar;
1022     valeur[2] *= fScalar;
1023     valeur[3] *= fScalar;
1024     return *this;
1025     }
1026     OT_VECTEUR_4D& OT_VECTEUR_4D::operator/= (double fScalar)
1027     {
1028     double a = 1/fScalar;
1029     valeur[0] *= a;
1030     valeur[1] *= a;
1031     valeur[2] *= a;
1032     valeur[3] *= a;
1033     return *this;
1034     }
1035     OT_VECTEUR_4D &OT_VECTEUR_4D::operator= (double a)
1036     {
1037     valeur[0]=valeur[1]=valeur[2]=valeur[3]=a;
1038     return *this;
1039     }
1040    
1041     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec)
1042     {
1043     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<", "<<__vec[3]<<"}, ";
1044     return __os;
1045     }
1046     #endif // ot_vecteur_4d
1047    
1048    
1049    
1050     // ot_vecteur_3d
1051    
1052    
1053    
1054     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 v[3])
1055     {
1056     for (int i=0; i<3; i++)
1057     valeur[i]=v[i];
1058     }
1059    
1060     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 x, double2 y, double2 z)
1061     {
1062     valeur[0] = x;
1063     valeur[1] = y;
1064     valeur[2] = z;
1065     }
1066    
1067 francois 550 OT_VECTEUR_3DD::OT_VECTEUR_3DD(double2 *xyz1,double2 *xyz2)
1068     {
1069     valeur[0]=xyz2[0]-xyz1[0];
1070     valeur[1]=xyz2[1]-xyz1[1];
1071     valeur[2]=xyz2[2]-xyz1[2];
1072     }
1073    
1074 francois 283 OT_VECTEUR_3DD::OT_VECTEUR_3DD (const OT_VECTEUR_3DD & v)
1075     {
1076     for (int i=0; i<3; i++)
1077     valeur[i]=v[i];
1078     }
1079    
1080    
1081     double2 & OT_VECTEUR_3DD::operator()(int i)
1082     {
1083     return valeur[i];
1084     }
1085    
1086     double2 OT_VECTEUR_3DD::operator()(int i) const
1087     {
1088     return valeur[i];
1089     }
1090    
1091     double2 & OT_VECTEUR_3DD::operator[](int i)
1092     {
1093     return valeur[i];
1094     }
1095    
1096     double2 OT_VECTEUR_3DD::operator[](int i) const
1097     {
1098     return valeur[i];
1099     }
1100    
1101     OT_VECTEUR_3DD::operator const double2* () const
1102     {
1103     return valeur;
1104     }
1105    
1106     OT_VECTEUR_3DD::operator double2* ()
1107     {
1108     return valeur;
1109     }
1110    
1111     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator =(const OT_VECTEUR_3DD& v3d)
1112     {
1113     if (this==&v3d) return *this;
1114     valeur [0]=v3d.get_x();
1115     valeur [1]=v3d.get_y();
1116     valeur [2]=v3d.get_z();
1117     return *this;
1118     }
1119     double2 OT_VECTEUR_3DD::norme()
1120     {
1121     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
1122     nor=sqrt(nor);
1123     return nor;
1124     }
1125     OT_VECTEUR_3DD OT_VECTEUR_3DD::vecteur_norme()
1126     {
1127     OT_VECTEUR_3DD nor;
1128     double2 zero=0.;
1129     double2 norme= this->norme() ;
1130     nor=(*this)*(1./norme);
1131     return nor;
1132     }
1133 francois 550 double2 OT_VECTEUR_3DD::get_longueur(void)
1134     {
1135     return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
1136     }
1137 francois 283
1138 francois 550 double2 OT_VECTEUR_3DD::get_longueur2(void)
1139     {
1140     return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
1141     }
1142    
1143 francois 283 double2 OT_VECTEUR_3DD::get_x(void) const
1144     {
1145     return valeur[0];
1146     }
1147     double2 & OT_VECTEUR_3DD::x(void)
1148     {
1149     return valeur[0];
1150     }
1151     double2 OT_VECTEUR_3DD::get_y(void) const
1152     {
1153     return valeur[1];
1154     }
1155     double2 & OT_VECTEUR_3DD::y(void)
1156     {
1157     return valeur[1];
1158     }
1159     double2 OT_VECTEUR_3DD::get_z(void) const
1160     {
1161     return valeur[2];
1162     }
1163     double2 & OT_VECTEUR_3DD::z(void)
1164     {
1165     return valeur[2];
1166     }
1167     void OT_VECTEUR_3DD::change_x(double2 x)
1168     {
1169     valeur[0] = x;
1170     }
1171     void OT_VECTEUR_3DD::change_y(double2 y)
1172     {
1173     valeur[1] = y;
1174     }
1175     void OT_VECTEUR_3DD::change_z(double2 z)
1176     {
1177     valeur[2] = z;
1178     }
1179     double2* OT_VECTEUR_3DD::get_xyz(void)
1180     {
1181     return valeur;
1182     }
1183    
1184     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator+ (const OT_VECTEUR_3DD & a)
1185     {
1186     return OT_VECTEUR_3DD(
1187     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2]);
1188     }
1189    
1190     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator- (const OT_VECTEUR_3DD & a)
1191     {
1192     return OT_VECTEUR_3DD(
1193     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2));
1194     }
1195    
1196     OT_VECTEUR_3DD operator* (const OT_VECTEUR_3DD & rkV, const double2 a)
1197     {
1198     return OT_VECTEUR_3DD(
1199     a*rkV[0],a*rkV[1],a*rkV[2]);
1200     }
1201     OT_VECTEUR_3DD operator* (const double2 a, const OT_VECTEUR_3DD & rkV)
1202     {
1203     return OT_VECTEUR_3DD(
1204     a*rkV[0],a*rkV[1],a*rkV[2]);
1205     }
1206    
1207     OT_VECTEUR_3DD operator/ (const OT_VECTEUR_3DD & rkV, const double2 a)
1208     {
1209     double2 inv = 1/a;
1210     return OT_VECTEUR_3DD(
1211     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
1212     }
1213    
1214    
1215     OT_VECTEUR_3DD operator/ (const double2 a, const OT_VECTEUR_3DD & rkV)
1216     {
1217     double2 inv = 1/a;
1218     return OT_VECTEUR_3DD(
1219     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
1220     }
1221     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator&(const OT_VECTEUR_3DD& v2)
1222     {
1223     OT_VECTEUR_3DD tmp;
1224     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
1225     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
1226     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
1227     return tmp;
1228     }
1229     double2 OT_VECTEUR_3DD::operator* (const OT_VECTEUR_3DD & a)
1230     {
1231     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2];
1232     }
1233    
1234    
1235     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator+= (const OT_VECTEUR_3DD& rkV)
1236     {
1237     valeur[0] = valeur[0] +rkV.valeur[0];
1238     valeur[1] = valeur[1] +rkV.valeur[1];
1239     valeur[2] = valeur[2] +rkV.valeur[2];
1240     return *this;
1241     }
1242    
1243     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator-= (const OT_VECTEUR_3DD& rkV)
1244     {
1245     valeur[0] = valeur[0] -rkV.valeur[0];
1246     valeur[1] = valeur[1] -rkV.valeur[1];
1247     valeur[2] = valeur[2] -rkV.valeur[2];
1248     return *this;
1249     }
1250     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator*= (double2 fScalar)
1251     {
1252     valeur[0] =valeur[0] * fScalar;
1253     valeur[1] =valeur[1] * fScalar;
1254     valeur[2] =valeur[2] * fScalar;
1255     return *this;
1256     }
1257     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator/= (double2 fScalar)
1258     {
1259     double2 a = 1/fScalar;
1260     valeur[0] =valeur[0] * a;
1261     valeur[1] =valeur[1] * a;
1262     valeur[2] =valeur[2] * a;
1263     return *this;
1264     }
1265    
1266    
1267     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3DD & __vec)
1268     {
1269 couturad 951 __os << "[ "<<std::setw(20)<< __vec[0]<<std::setw(4)<<", "<<std::setw(20)<<__vec[1]<<", "<<std::setw(20)<<__vec[2]<<std::setw(4)<<", "<<std::setw(20)<<"] ";
1270 francois 283 return __os;
1271     }
1272    
1273     int OT_VECTEUR_3DD::compare_valeur (const OT_VECTEUR_3DD& mdd) const
1274     {
1275     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2])
1276     return 1;
1277     else return 0;
1278    
1279     }
1280    
1281     bool OT_VECTEUR_3DD::operator==(const OT_VECTEUR_3DD& mdd) const
1282     {
1283     return compare_valeur(mdd);
1284     }
1285    
1286    
1287    
1288    
1289    
1290    
1291    
1292    
1293    
1294    
1295     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 v[4])
1296     {
1297     for (int i=0; i<4; i++)
1298     valeur[i]=v[i];
1299     }
1300    
1301     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 x, double2 y, double2 z, double2 w)
1302     {
1303     valeur[0] = x;
1304     valeur[1] = y;
1305     valeur[2] = z;
1306     valeur[3] = w;
1307     }
1308    
1309     OT_VECTEUR_4DD::OT_VECTEUR_4DD (const OT_VECTEUR_4DD & v)
1310     {
1311     for (int i=0; i<4; i++)
1312     valeur[i]=v[i];
1313     }
1314    
1315    
1316     double2 & OT_VECTEUR_4DD::operator()(int i)
1317     {
1318     return valeur[i];
1319     }
1320    
1321     double2 OT_VECTEUR_4DD::operator()(int i) const
1322     {
1323     return valeur[i];
1324     }
1325    
1326     double2 & OT_VECTEUR_4DD::operator[](int i)
1327     {
1328     return valeur[i];
1329     }
1330    
1331     double2 OT_VECTEUR_4DD::operator[](int i) const
1332     {
1333     return valeur[i];
1334     }
1335    
1336     OT_VECTEUR_4DD::operator const double2* () const
1337     {
1338     return valeur;
1339     }
1340    
1341     OT_VECTEUR_4DD::operator double2* ()
1342     {
1343     return valeur;
1344     }
1345    
1346     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator =(const OT_VECTEUR_4DD& v4d)
1347     {
1348     if (this==&v4d) return *this;
1349     valeur [0]=v4d.get_x();
1350     valeur [1]=v4d.get_y();
1351     valeur [2]=v4d.get_z();
1352     valeur [3]=v4d.get_w();
1353     return *this;
1354     }
1355     double2 OT_VECTEUR_4DD::norme()
1356     {
1357     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2]+valeur [3]*valeur [3];
1358     nor=nor^0.5;
1359     return nor;
1360     }
1361     OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme()
1362     {
1363     OT_VECTEUR_4DD nor;
1364     double2 zero=0.;
1365     double2 norme= this->norme() ;
1366     assert(norme!=zero) ;
1367     nor=(*this)*(1./norme);
1368     return nor;
1369     }
1370    
1371 francois 363 OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme_3d()
1372     {
1373     double2 norme= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
1374     norme=norme^0.5;
1375     OT_VECTEUR_4DD nor;
1376     double2 zero=0.;
1377     assert(norme!=zero) ;
1378     nor.change_x(valeur[0]/norme);
1379     nor.change_y(valeur[1]/norme);
1380     nor.change_z(valeur[2]/norme);
1381     nor.change_w(valeur[3]);
1382     return nor;
1383     }
1384 francois 283 double2 OT_VECTEUR_4DD::get_x(void) const
1385     {
1386     return valeur[0];
1387     }
1388     double2 & OT_VECTEUR_4DD::x(void)
1389     {
1390     return valeur[0];
1391     }
1392     double2 OT_VECTEUR_4DD::get_y(void) const
1393     {
1394     return valeur[1];
1395     }
1396     double2 & OT_VECTEUR_4DD::y(void)
1397     {
1398     return valeur[1];
1399     }
1400     double2 OT_VECTEUR_4DD::get_z(void) const
1401     {
1402     return valeur[2];
1403     }
1404     double2 & OT_VECTEUR_4DD::z(void)
1405     {
1406     return valeur[2];
1407     }
1408     double2 OT_VECTEUR_4DD::get_w(void) const
1409     {
1410     return valeur[3];
1411     }
1412     double2 & OT_VECTEUR_4DD::w(void)
1413     {
1414     return valeur[3];
1415     }
1416     void OT_VECTEUR_4DD::change_x(double2 x)
1417     {
1418     valeur[0] = x;
1419     }
1420     void OT_VECTEUR_4DD::change_y(double2 y)
1421     {
1422     valeur[1] = y;
1423     }
1424     void OT_VECTEUR_4DD::change_z(double2 z)
1425     {
1426     valeur[2] = z;
1427     }
1428     void OT_VECTEUR_4DD::change_w(double2 w)
1429     {
1430     valeur[3] = w;
1431     }
1432     double2* OT_VECTEUR_4DD::get_xyzw(void)
1433     {
1434     return valeur;
1435     }
1436    
1437     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator+ (const OT_VECTEUR_4DD & a)
1438     {
1439     return OT_VECTEUR_4DD(
1440     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
1441     );
1442     }
1443    
1444     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator- (const OT_VECTEUR_4DD & a)
1445     {
1446     return OT_VECTEUR_4DD(
1447     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
1448     );
1449     }
1450    
1451     OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a)
1452     {
1453     return OT_VECTEUR_4DD(
1454     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1455     );
1456     }
1457     OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV)
1458     {
1459     return OT_VECTEUR_4DD(
1460     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1461     );
1462     }
1463    
1464     OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a)
1465     {
1466     double2 inv = 1/a;
1467     return OT_VECTEUR_4DD(
1468     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1469     );
1470     }
1471    
1472    
1473     OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV)
1474     {
1475     double2 inv = 1/a;
1476     return OT_VECTEUR_4DD(
1477     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1478     );
1479     }
1480     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator^(const OT_VECTEUR_4DD& v2)
1481     {
1482     OT_VECTEUR_4DD tmp;
1483     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
1484     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
1485     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
1486     tmp[3]= 0;
1487     //tmp[3]= valeur[1]*v2[2]-valeur[2]*v2[1];
1488     return tmp;
1489     }
1490     double2 OT_VECTEUR_4DD::operator* (const OT_VECTEUR_4DD & a)
1491     {
1492     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
1493     }
1494    
1495    
1496     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator+= (const OT_VECTEUR_4DD& rkV)
1497     {
1498     valeur[0] = valeur[0] +rkV.valeur[0];
1499     valeur[1] = valeur[1] +rkV.valeur[1];
1500     valeur[2] = valeur[2] +rkV.valeur[2];
1501     valeur[3] = valeur[3] +rkV.valeur[3];
1502     return *this;
1503     }
1504    
1505     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator-= (const OT_VECTEUR_4DD& rkV)
1506     {
1507     valeur[0] = valeur[0] -rkV.valeur[0];
1508     valeur[1] = valeur[1] -rkV.valeur[1];
1509     valeur[2] = valeur[2] -rkV.valeur[2];
1510     valeur[3] = valeur[3] -rkV.valeur[3];
1511     return *this;
1512     }
1513     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator*= (double2 fScalar)
1514     {
1515     valeur[0] =valeur[0] * fScalar;
1516     valeur[1] =valeur[1] * fScalar;
1517     valeur[2] =valeur[2] * fScalar;
1518     valeur[3] =valeur[3] * fScalar;
1519     return *this;
1520     }
1521     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator/= (double2 fScalar)
1522     {
1523     double2 a = 1/fScalar;
1524     valeur[0] =valeur[0] * a;
1525     valeur[1] =valeur[1] * a;
1526     valeur[2] =valeur[2] * a;
1527     valeur[3] =valeur[3] * a;
1528     return *this;
1529     }
1530    
1531    
1532     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec)
1533     {
1534 couturad 951 __os << "[ "<<std::setw(20)<< __vec[0]<<std::setw(4)<<", "<<std::setw(20)<<__vec[1]<<", "<<std::setw(20)<<__vec[2]<<std::setw(4)<<", "<<std::setw(20)<<__vec[3]<<std::setw(4)<<"] ";
1535 francois 283 return __os;
1536     }
1537    
1538     int OT_VECTEUR_4DD::compare_valeur (const OT_VECTEUR_4DD& mdd) const
1539     {
1540     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2]&&valeur[3]==mdd.valeur[3])
1541     return 1;
1542     else return 0;
1543    
1544     }
1545    
1546     bool OT_VECTEUR_4DD::operator==(const OT_VECTEUR_4DD& mdd) const
1547     {
1548     return compare_valeur(mdd);
1549     }
1550    
1551    
1552    
1553 francois 743 bool OT_VECTEUR_4DD::est_nul(void)
1554     {
1555     double2 ZERO(0.);
1556     if (valeur[0]==ZERO&&valeur[1]==ZERO &&valeur[2]==ZERO&&valeur[3]==ZERO)
1557     return true;
1558     return false;
1559     }
1560 francois 283
1561 francois 743 bool OT_VECTEUR_4DD::est_nul_3d(void)
1562     {
1563     double2 ZERO(0.);
1564     if (valeur[0]==ZERO&&valeur[1]==ZERO &&valeur[2]==ZERO)
1565     return true;
1566     return false;
1567     }
1568 francois 283
1569    
1570    
1571    
1572    
1573    
1574    
1575    
1576    
1577    
1578    
1579 francois 743
1580 francois 283 int OPERATEUR::egal(double a,double b,double eps)
1581     {
1582     double res=fabs(a-b);
1583     if (res<eps) return(1);
1584     return(0);
1585     }
1586    
1587 couturad 906 int OPERATEUR::egal(double* xyz1, double* xyz2, double eps)
1588     {
1589     if(fabs(xyz1[0]-xyz2[0])<eps)
1590     if(fabs(xyz1[1]-xyz2[1])<eps)
1591     if(fabs(xyz1[2]-xyz2[2])<eps)
1592     return 1;
1593     return 0;
1594     }
1595 francois 283
1596 couturad 906
1597    
1598 francois 283 double OPERATEUR::qualite_triangle(double* noeud1,double* noeud2,double* noeud3)
1599     {
1600     OT_VECTEUR_3D vec12(noeud1,noeud2);
1601     OT_VECTEUR_3D vec13(noeud1,noeud3);
1602     OT_VECTEUR_3D vec23(noeud2,noeud3);
1603     double d12=vec12.get_longueur();
1604     double d13=vec13.get_longueur();
1605     double d23=vec23.get_longueur();
1606 couturad 951 double dmax=std::max(d12,d13);
1607     dmax=std::max(dmax,d23);
1608 francois 283 double p=0.5*(d12+d13+d23);
1609     double crit=(p-d12)*(p-d13)*(p-d23)/p;
1610     if (crit<0) crit=0.;
1611     crit=sqrt(crit);
1612     crit=crit/dmax;
1613     crit=crit*3.4641101614;
1614     return crit;
1615     }
1616    
1617     void OPERATEUR::doubleto2int(double val,int& val1,int& val2)
1618     {
1619     int *p=(int*)(&(val));
1620     val1=(*p);
1621     val2=(*(p+1));
1622     }
1623    
1624     double OPERATEUR::qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4)
1625     {
1626     OT_VECTEUR_3D ab(noeud1,noeud2);
1627     OT_VECTEUR_3D ac(noeud1,noeud3);
1628     OT_VECTEUR_3D cb(noeud3,noeud2);
1629     OT_VECTEUR_3D db(noeud4,noeud2);
1630     OT_VECTEUR_3D da(noeud4,noeud1);
1631     OT_VECTEUR_3D dc(noeud4,noeud3);
1632     double dab=ab.get_longueur();
1633     double dac=ac.get_longueur();
1634     double dcb=cb.get_longueur();
1635     double ddb=db.get_longueur();
1636     double dda=da.get_longueur();
1637     double ddc=dc.get_longueur();
1638    
1639 couturad 951 double dmax=std::max(dab,dac);
1640     dmax=std::max(dmax,dcb);
1641     dmax=std::max(dmax,ddb);
1642     dmax=std::max(dmax,dda);
1643     dmax=std::max(dmax,ddc);
1644 francois 283
1645     OT_VECTEUR_3D pvec=ab&ac;
1646     double vol=pvec*da;
1647     if (vol>0.) return 0.;
1648     vol=fabs(vol);
1649     double som=pvec.get_longueur()/2.;
1650     pvec=ab&da;
1651     som=som+pvec.get_longueur()/2.;
1652     pvec=ac&dc;
1653     som=som+pvec.get_longueur()/2.;
1654     pvec=cb&db;
1655     som=som+pvec.get_longueur()/2.;
1656     double crit=vol/som/dmax/0.408249;
1657     return crit;
1658     }
1659    
1660 francois 418 int OPERATEUR::estdansletetra(double *xyz1,double *xyz2,double *xyz3,double *xyz4,double x,double y, double z)
1661     {
1662     OT_VECTEUR_3D v1(xyz2[0]-xyz1[0],xyz2[1]-xyz1[1],xyz2[2]-xyz1[2]);
1663     OT_VECTEUR_3D v2(xyz3[0]-xyz1[0],xyz3[1]-xyz1[1],xyz3[2]-xyz1[2]);
1664     OT_VECTEUR_3D v3(xyz4[0]-xyz1[0],xyz4[1]-xyz1[1],xyz4[2]-xyz1[2]);
1665     OT_VECTEUR_3D v4(x-xyz1[0],y-xyz1[1],z-xyz1[2]);
1666     OT_MATRICE_3D mat(v1,v2,v3);
1667     OT_MATRICE_3D mat1(v4,v2,v3);
1668     OT_MATRICE_3D mat2(v1,v4,v3);
1669     OT_MATRICE_3D mat3(v1,v2,v4);
1670     double det=mat.get_determinant();
1671     double xsi=mat1.get_determinant()/det;
1672     double eta=mat2.get_determinant()/det;
1673     double dseta=mat3.get_determinant()/det;
1674     int reponse1=1;
1675     int reponse2=1;
1676     double eps=0.0000001;
1677     if (xsi<-eps) reponse1=0;
1678     if (eta<-eps) reponse1=0;
1679     if (dseta<-eps) reponse1=0;
1680     if (xsi+eta+dseta>1.+eps) reponse1=0;
1681     if (xsi<eps) reponse2=0;
1682     if (eta<eps) reponse2=0;
1683     if (dseta<eps) reponse2=0;
1684     if (xsi+eta+dseta>1.-eps) reponse2=0;
1685     int face1=0,face2=0,face3=0,face4=0;
1686     if ((reponse1==1) && (reponse2==0))
1687     {
1688     if (dseta<eps) face1=1;
1689     if (eta<eps) face2=1;
1690     if (xsi<eps) face3=1;
1691     if (xsi+eta+dseta>1.-eps) face4=1;
1692     }
1693     return reponse1+2*reponse2+4*face1+8*face2+16*face3+32*face4;
1694     }
1695 francois 283
1696    
1697 francois 418
1698    
1699     int OPERATEUR::projeteestdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z)
1700     {
1701     OT_VECTEUR_3D vec1(xyz1,xyz2);
1702     OT_VECTEUR_3D vec2(xyz1,xyz3);
1703     OT_VECTEUR_3D n=vec1&vec2;
1704     n.norme();
1705     double d=-(n.get_x()*xyz1[0]+n.get_y()*xyz1[1]+n.get_z()*xyz1[2]);
1706     double t=-(n.get_x()*x+n.get_y()*y+n.get_z()*z+d);
1707     double xx=x+t*n.get_x();
1708     double yy=y+t*n.get_y();
1709     double zz=z+t*n.get_z();
1710     return estdansletriangle(xyz1,xyz2,xyz3,xx,yy,zz);
1711     }
1712    
1713    
1714     int OPERATEUR::estdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z)
1715     {
1716     OT_VECTEUR_3D vec1(xyz1,xyz2);
1717     OT_VECTEUR_3D vec2(xyz1,xyz3);
1718     OT_VECTEUR_3D vecb(x-xyz1[0],y-xyz1[1],z-xyz1[2]);
1719     OT_MATRICE_3D m(vec1,vec2,vecb);
1720     double det=m.get_determinant();
1721     double eps=1e-10*((vec1&vec2)*(vec1&vec2));
1722     if (fabs(det)>eps) return 0;
1723     double ab[3]={vec1.get_x(),vec1.get_y(),vec1.get_z()};
1724     double ac[3]={vec2.get_x(),vec2.get_y(),vec2.get_z()};
1725     double b[3]={vecb.get_x(),vecb.get_y(),vecb.get_z()};
1726     det=ab[0]*ac[1]-ab[1]*ac[0];
1727     int n1,n2;
1728     if (fabs(det)>eps)
1729     {
1730     n1=0;
1731     n2=1;
1732     }
1733     else
1734     {
1735     det=ab[0]*ac[2]-ab[2]*ac[0];
1736     if (fabs(det)>eps)
1737     {
1738     n1=0;
1739     n2=2;
1740     }
1741     else
1742     {
1743     det=ab[1]*ac[2]-ab[2]*ac[1];
1744     n1=1;
1745     n2=2;
1746     }
1747     }
1748     double xsi=(b[n1]*ac[n2]-b[n2]*ac[n1])/det;
1749     double eta=(ab[n1]*b[n2]-ab[n2]*b[n1])/det;
1750     int reponse1=1;
1751     int reponse2=1;
1752     eps=0.0000001;
1753     if (xsi<-eps) reponse1=0;
1754     if (eta<-eps) reponse1=0;
1755     if (xsi+eta>1.+eps) reponse1=0;
1756     if (xsi<eps) reponse2=0;
1757     if (eta<eps) reponse2=0;
1758     if (xsi+eta>1.-eps) reponse2=0;
1759     int arete1=0,arete2=0,arete3=0;
1760     if ((reponse1==1) && (reponse2==0))
1761     {
1762     if (eta<eps) arete1=1;
1763     if (xsi<eps) arete3=1;
1764     if (xsi+eta>1.-eps) arete2=1;
1765     }
1766     return reponse1+2*reponse2+4*arete1+8*arete2+16*arete3;
1767     }
1768    
1769    
1770    
1771    
1772     int OPERATEUR::compare_etat_tetra(int etat,int valeur)
1773     {
1774     int faceinte=etat&1;
1775     int inte=(etat&2)>>1;
1776     int face1=(etat&4)>>2;
1777     int face2=(etat&8)>>3;
1778     int face3=(etat&16)>>4;
1779     int face4=(etat&32)>>5;
1780     if ((faceinte==1) && (valeur==INTERIEUR)) return 1;
1781     if ((inte==1) && (valeur==INTERIEUR)) return 1;
1782     if (/*(face==0) && */(inte==1) && (valeur==STRICTINTERIEUR)) return 1;
1783     if ((faceinte==1) && (inte==0) && (valeur==SUR_FACE)) return 1;
1784     if ((face1==1) && (valeur==FACE1)) return 1;
1785     if ((face2==1) && (valeur==FACE2)) return 1;
1786     if ((face3==1) && (valeur==FACE3)) return 1;
1787     if ((face4==1) && (valeur==FACE4)) return 1;
1788     if ((face1==1) && (face2==1) && (valeur==ARETE1)) return 1;
1789     if ((face1==1) && (face3==1) && (valeur==ARETE2)) return 1;
1790     if ((face2==1) && (face3==1) && (valeur==ARETE3)) return 1;
1791     if ((face1==1) && (face4==1) && (valeur==ARETE4)) return 1;
1792     if ((face2==1) && (face4==1) && (valeur==ARETE5)) return 1;
1793     if ((face3==1) && (face4==1) && (valeur==ARETE6)) return 1;
1794     if ((face1==1) && (face2==1) && (face3==1) && (valeur==SOMMET1)) return 1;
1795     if ((face1==1) && (face2==1) && (face4==1) && (valeur==SOMMET2)) return 1;
1796     if ((face1==1) && (face3==1) && (face4==1) && (valeur==SOMMET3)) return 1;
1797     if ((face2==1) && (face3==1) && (face4==1) && (valeur==SOMMET4)) return 1;
1798     return 0;
1799     }
1800    
1801     int OPERATEUR::compare_etat_triangle(int etat,int valeur)
1802     {
1803     int areteinte=etat&1;
1804     int inte=(etat&2)>>1;
1805     int arete1=(etat&4)>>2;
1806     int arete2=(etat&8)>>3;
1807     int arete3=(etat&16)>>4;
1808     if ((areteinte==1) && (valeur==INTERIEUR)) return 1;
1809     if ((inte==1) && (valeur==INTERIEUR)) return 1;
1810     if ((inte==1) && (valeur==STRICTINTERIEUR)) return 1;
1811     if ((areteinte==1) && (inte==0) && (valeur==SUR_ARETE)) return 1;
1812     if ((arete1==1) && (valeur==ARETE1)) return 1;
1813     if ((arete2==1) && (valeur==ARETE2)) return 1;
1814     if ((arete3==1) && (valeur==ARETE3)) return 1;
1815     if ((arete1==1) && (arete2==1) && (valeur==SOMMET2)) return 1;
1816     if ((arete2==1) && (arete3==1) && (valeur==SOMMET3)) return 1;
1817     if ((arete3==1) && (arete1==1) && (valeur==SOMMET1)) return 1;
1818     return 0;
1819     }
1820    
1821 couturad 926 double OPERATEUR::taille_tetra(double* noeud1, double* noeud2, double* noeud3, double* noeud4)
1822     {
1823     OT_VECTEUR_3D ab(noeud1,noeud2);
1824     OT_VECTEUR_3D ac(noeud1,noeud3);
1825     OT_VECTEUR_3D cb(noeud3,noeud2);
1826     OT_VECTEUR_3D db(noeud4,noeud2);
1827     OT_VECTEUR_3D da(noeud4,noeud1);
1828     OT_VECTEUR_3D dc(noeud4,noeud3);
1829     double dab=ab.get_longueur();
1830     double dac=ac.get_longueur();
1831     double dcb=cb.get_longueur();
1832     double ddb=db.get_longueur();
1833     double dda=da.get_longueur();
1834     double ddc=dc.get_longueur();
1835 couturad 951 double dmax=std::max(dab,dac);
1836     dmax=std::max(dmax,dcb);
1837     dmax=std::max(dmax,ddb);
1838     dmax=std::max(dmax,dda);
1839     dmax=std::max(dmax,ddc);
1840 couturad 926 return dmax;
1841     }
1842 francois 418
1843 couturad 926 double OPERATEUR::taille_triangle(double* noeud1, double* noeud2, double* noeud3)
1844     {
1845     OT_VECTEUR_3D vec12(noeud1,noeud2);
1846     OT_VECTEUR_3D vec13(noeud1,noeud3);
1847     OT_VECTEUR_3D vec23(noeud2,noeud3);
1848     double d12=vec12.get_longueur();
1849     double d13=vec13.get_longueur();
1850     double d23=vec23.get_longueur();
1851 couturad 951 double dmax=std::max(d12,d13);
1852     dmax=std::max(dmax,d23);
1853 couturad 926 return dmax;
1854     }
1855    
1856    
1857 francois 283 template <int N> DOUBLEN<N>::DOUBLEN()
1858     {
1859     tab[0]=-1;
1860     }
1861    
1862     template <int N> DOUBLEN<N>::DOUBLEN(DOUBLEN& mdd)
1863     {
1864     for (int i=0;i<N;i++)
1865     tab[i]=mdd.tab[i];
1866     }
1867    
1868     template <int N> DOUBLEN<N>::DOUBLEN(double *v)
1869     {
1870     for (int i=0;i<N;i++)
1871     tab[i]=v[i];
1872     }
1873    
1874     template <int N> DOUBLEN<N>::~DOUBLEN()
1875     {
1876     }
1877    
1878     template <int N> double DOUBLEN<N>::get_valeur(int num)
1879     {
1880     return tab[num];
1881     }
1882    
1883     template <int N> void DOUBLEN<N>::change_valeur(int num,double val)
1884     {
1885     tab[num]=val;
1886     }
1887    
1888     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(DOUBLEN<N> & mdd)
1889     {
1890     for (int i=0;i<N;i++)
1891     tab[i]=mdd.tab[i];
1892     return *this;
1893     }
1894    
1895     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(const DOUBLEN<N> & mdd)
1896     {
1897     for (int i=0;i<N;i++)
1898     tab[i]=mdd.tab[i];
1899     return *this;
1900     }
1901    
1902    
1903     #ifdef BORLANDCPP
1904     // instanciation pour Windows (Borland c++)
1905     template class __export DOUBLEN<1>;
1906     template class __export DOUBLEN<4>;
1907     template class __export DOUBLEN<10>;
1908     #else
1909     #ifdef GCC
1910     // instanciation pour Unix (g++)
1911     template class DOUBLEN<1>;
1912     template class DOUBLEN<4>;
1913     template class DOUBLEN<10>;
1914     #else
1915     // instanciation pour Windows (Visual Studio)
1916     #endif
1917     #endif
1918    
1919