inlib  1.2.0
/Users/barrand/private/dev/softinex/old/inexlib-1.2/inlib/inlib/a4
Go to the documentation of this file.
00001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
00002 // See the file inlib.license for terms.
00003 
00004 #ifndef inlib_a4
00005 #define inlib_a4
00006 
00007 #include "sqm"
00008 
00009 #include <cmath> //sqrt
00010 
00011 namespace inlib {
00012 namespace a4 {
00013 
00014 // vec is an a4
00015 
00016 template <class T>
00017 class vec : public array<T> {
00018 public:
00019   vec():array<T>(1,4){}
00020   vec(const T a_vec[4]):array<T>(1,4) {
00021     array<T>::m_vector[0] = a_vec[0];
00022     array<T>::m_vector[1] = a_vec[1];
00023     array<T>::m_vector[2] = a_vec[2];
00024     array<T>::m_vector[3] = a_vec[3];
00025   }
00026   vec(const T& a0,const T& a1,const T& a2,const T& a3):array<T>(1,4) {
00027     array<T>::m_vector[0] = a0;
00028     array<T>::m_vector[1] = a1;
00029     array<T>::m_vector[2] = a2;
00030     array<T>::m_vector[3] = a3;
00031   }
00032   virtual ~vec() {}
00033 public:
00034   vec(const vec& a_from):array<T>(a_from){}
00035   vec& operator=(const vec& a_from) {
00036     array<T>::operator=(a_from);
00037     return *this;
00038   }
00039 public:
00040   void set_value(const T& a1,const T& a2,const T& a3,const T& a4) {
00041     array<T>::m_vector[0] = a1;
00042     array<T>::m_vector[1] = a2;
00043     array<T>::m_vector[2] = a3;
00044     array<T>::m_vector[3] = a4;
00045   }
00046   T v0() const { return array<T>::m_vector[0];}
00047   T v1() const { return array<T>::m_vector[1];}
00048   T v2() const { return array<T>::m_vector[2];}
00049   T v3() const { return array<T>::m_vector[3];}
00050 
00051   void v0(const T& a_value) { array<T>::m_vector[0] = a_value;}
00052   void v1(const T& a_value) { array<T>::m_vector[1] = a_value;}
00053   void v2(const T& a_value) { array<T>::m_vector[2] = a_value;}
00054   void v3(const T& a_value) { array<T>::m_vector[3] = a_value;}
00055 
00056   bool set_value(unsigned int a_index,const T& a_value) { 
00057     if(a_index>=4) return false;
00058     array<T>::m_vector[a_index] = a_value;
00059     return true;
00060   }
00061 
00062   T length() const {
00063     T m0 = array<T>::m_vector[0];
00064     T m1 = array<T>::m_vector[1];
00065     T m2 = array<T>::m_vector[2];
00066     T m3 = array<T>::m_vector[3];
00067     return (T)::sqrt(m0*m0+m1*m1+m2*m2+m3*m3);
00068   }
00069   T normalize() {
00070     T norme = length();
00071     if(norme==T()) return 0;
00072     divide(norme);
00073     return norme;
00074   }
00075 };
00076 
00077 // sqm is an a44
00078 
00079 template <class T>
00080 class sqm : public inlib::sqm<T> {
00081 public:
00082   sqm(): inlib::sqm<T>(4){}
00083   virtual ~sqm() {}
00084 public:
00085   sqm(const sqm& a_from): inlib::sqm<T>(a_from){}
00086   sqm& operator=(const sqm& a_from) {
00087     inlib::sqm<T>::operator=(a_from);
00088     return *this;
00089   }
00090 public:
00091   void v00(const T& a_value){array<T>::m_vector[0+0*4] = a_value;}
00092   void v10(const T& a_value){array<T>::m_vector[1+0*4] = a_value;}
00093   void v20(const T& a_value){array<T>::m_vector[2+0*4] = a_value;}
00094   void v30(const T& a_value){array<T>::m_vector[3+0*4] = a_value;}
00095 
00096   void v01(const T& a_value){array<T>::m_vector[0+1*4] = a_value;}
00097   void v11(const T& a_value){array<T>::m_vector[1+1*4] = a_value;}
00098   void v21(const T& a_value){array<T>::m_vector[2+1*4] = a_value;}
00099   void v31(const T& a_value){array<T>::m_vector[3+1*4] = a_value;}
00100 
00101   void v02(const T& a_value){array<T>::m_vector[0+2*4] = a_value;}
00102   void v12(const T& a_value){array<T>::m_vector[1+2*4] = a_value;}
00103   void v22(const T& a_value){array<T>::m_vector[2+2*4] = a_value;}
00104   void v32(const T& a_value){array<T>::m_vector[3+2*4] = a_value;}
00105 
00106   void v03(const T& a_value){array<T>::m_vector[0+3*4] = a_value;}
00107   void v13(const T& a_value){array<T>::m_vector[1+3*4] = a_value;}
00108   void v23(const T& a_value){array<T>::m_vector[2+3*4] = a_value;}
00109   void v33(const T& a_value){array<T>::m_vector[3+3*4] = a_value;}
00110 
00111   T v00() const {return array<T>::m_vector[0+0*4];}
00112   T v10() const {return array<T>::m_vector[1+0*4];}
00113   T v20() const {return array<T>::m_vector[2+0*4];}
00114   T v30() const {return array<T>::m_vector[3+0*4];}
00115 
00116   T v01() const {return array<T>::m_vector[0+1*4];}
00117   T v11() const {return array<T>::m_vector[1+1*4];}
00118   T v21() const {return array<T>::m_vector[2+1*4];}
00119   T v31() const {return array<T>::m_vector[3+1*4];}
00120 
00121   T v02() const {return array<T>::m_vector[0+2*4];}
00122   T v12() const {return array<T>::m_vector[1+2*4];}
00123   T v22() const {return array<T>::m_vector[2+2*4];}
00124   T v32() const {return array<T>::m_vector[3+2*4];}
00125 
00126   T v03() const {return array<T>::m_vector[0+3*4];}
00127   T v13() const {return array<T>::m_vector[1+3*4];}
00128   T v23() const {return array<T>::m_vector[2+3*4];}
00129   T v33() const {return array<T>::m_vector[3+3*4];}
00130 
00131   virtual T determinant() const {
00132     T e00 =  D33(v11(),v12(),v13(),
00133                       v21(),v22(),v23(),
00134                       v31(),v32(),v33());
00135     T e01 = -D33(v01(),v02(),v03(),
00136                       v21(),v22(),v23(),
00137                       v31(),v32(),v33());
00138     T e02 =  D33(v01(),v02(),v03(),
00139                       v11(),v12(),v13(),
00140                       v31(),v32(),v33());
00141     T e03 = -D33(v01(),v02(),v03(),
00142                       v11(),v12(),v13(),
00143                       v21(),v22(),v23());
00144                   
00145     return (  v00() * e00
00146             + v10() * e01
00147             + v20() * e02
00148             + v30() * e03);
00149   }
00150 
00151   bool invert(sqm<T>& a_result) const {
00152     // Twice faster than the generic invertion method.
00153     a_result.v00(
00154       D33(v11(),v12(),v13(),
00155           v21(),v22(),v23(),
00156         v31(),v32(),v33()));
00157     a_result.v01(
00158       -D33(v01(),v02(),v03(),
00159          v21(),v22(),v23(),
00160            v31(),v32(),v33()));
00161     a_result.v02(
00162       D33(v01(),v02(),v03(),
00163           v11(),v12(),v13(),
00164         v31(),v32(),v33()));
00165     a_result.v03(
00166      -D33(v01(),v02(),v03(),
00167           v11(),v12(),v13(),
00168         v21(),v22(),v23()));
00169                     
00170     T deter =
00171         v00() * a_result.v00()
00172       + v10() * a_result.v01()
00173       + v20() * a_result.v02()
00174       + v30() * a_result.v03();
00175   
00176     if(deter==array<T>::zero()) return false;
00177                     
00178     a_result.v10(
00179      -D33(v10(),v12(),v13(),
00180           v20(),v22(),v23(),
00181           v30(),v32(),v33()));
00182     a_result.v11(
00183       D33(v00(),v02(),v03(),
00184         v20(),v22(),v23(),
00185         v30(),v32(),v33()));
00186     a_result.v12(
00187      -D33(v00(),v02(),v03(),
00188           v10(),v12(),v13(),
00189         v30(),v32(),v33()));
00190     a_result.v13(
00191       D33(v00(),v02(),v03(),
00192         v10(),v12(),v13(),
00193         v20(),v22(),v23()));
00194                     
00195     a_result.v20(
00196       D33(v10(),v11(),v13(),
00197         v20(),v21(),v23(),
00198         v30(),v31(),v33()));
00199     a_result.v21(
00200      -D33(v00(),v01(),v03(),
00201         v20(),v21(),v23(),
00202         v30(),v31(),v33()));
00203     a_result.v22(
00204       D33(v00(),v01(),v03(),
00205         v10(),v11(),v13(),
00206         v30(),v31(),v33()));
00207     a_result.v23(
00208      -D33(v00(),v01(),v03(),
00209         v10(),v11(),v13(),
00210         v20(),v21(),v23()));
00211                     
00212     a_result.v30(
00213      -D33(v10(),v11(),v12(),
00214         v20(),v21(),v22(),
00215         v30(),v31(),v32()));
00216     a_result.v31(
00217       D33(v00(),v01(),v02(),
00218         v20(),v21(),v22(),
00219         v30(),v31(),v32()));
00220     a_result.v32(
00221      -D33(v00(),v01(),v02(),
00222         v10(),v11(),v12(),
00223         v30(),v31(),v32()));
00224     a_result.v33(
00225       D33(v00(),v01(),v02(),
00226         v10(),v11(),v12(),
00227         v20(),v21(),v22()));
00228   
00229     a_result.multiply(1./deter);  
00230   
00231     return true;
00232   }
00233 
00234 private:
00235   T D33(const T& a_11,const T& a_12,const T& a_13,const T& a_21,const T& a_22,const T& a_23,const T& a_31,const T& a_32,const T& a_33) const {
00236     return (a_11 * (a_22 * a_33 - a_32 * a_23)- a_21 * (a_12 * a_33 - a_32 * a_13) + a_31 * (a_12 * a_23 - a_22 * a_13));
00237   }
00238 };
00239 
00240 template <class T>
00241 inline sqm<T> operator-(const sqm<T>& a1,const sqm<T>& a2) {
00242   sqm<T> res(a1);
00243   res.subtract(a2);
00244   return res;
00245 }
00246 template <class T>
00247 inline sqm<T> operator+(const sqm<T>& a1,const sqm<T>& a2) {
00248   sqm<T> res(a1);
00249   res.add(a2);
00250   return res;
00251 }
00252 template <class T>
00253 inline sqm<T> operator*(const sqm<T>& a1,const sqm<T>& a2) {
00254   sqm<T> res;
00255   a1.mx_mul(a2,res);
00256   return res;
00257 }
00258 
00259 template <class T>
00260 inline sqm<T> commutator(const sqm<T>& a1,const sqm<T>& a2) {
00261   return a1*a2-a2*a1;
00262 }
00263 template <class T>
00264 inline sqm<T> anticommutator(const sqm<T>& a1,const sqm<T>& a2) {
00265   return a1*a2+a2*a1;
00266 }
00267 
00268 template <class T>
00269 class cbm : public array<T> { //cbm for cubic matrix.
00270 public:
00271   cbm():array<T>(3,4){}
00272   virtual ~cbm() {}
00273 public:
00274   cbm(const cbm& a_from):array<T>(a_from){}
00275   cbm& operator=(const cbm& a_from){
00276     inlib::array<T>::operator=(a_from);
00277     return *this;
00278   }
00279 public:
00280   T value(unsigned int a1,unsigned int a2,unsigned int a3) const { 
00281     return array<T>::m_vector[a1 + a2 * 4 + a3 * 16];
00282   }
00283 
00284   void v(unsigned int a1,unsigned int a2,unsigned int a3,const T& a_value) { 
00285     array<T>::m_vector[a1 + a2 * 4 + a3 * 16] = a_value;
00286   }
00287 
00288   void v000(const T& a_value){array<T>::m_vector[0+0*4+0*16] = a_value;}
00289   void v100(const T& a_value){array<T>::m_vector[1+0*4+0*16] = a_value;}
00290   void v200(const T& a_value){array<T>::m_vector[2+0*4+0*16] = a_value;}
00291   void v300(const T& a_value){array<T>::m_vector[3+0*4+0*16] = a_value;}
00292   void v010(const T& a_value){array<T>::m_vector[0+1*4+0*16] = a_value;}
00293   void v110(const T& a_value){array<T>::m_vector[1+1*4+0*16] = a_value;}
00294   void v210(const T& a_value){array<T>::m_vector[2+1*4+0*16] = a_value;}
00295   void v310(const T& a_value){array<T>::m_vector[3+1*4+0*16] = a_value;}
00296   void v020(const T& a_value){array<T>::m_vector[0+2*4+0*16] = a_value;}
00297   void v120(const T& a_value){array<T>::m_vector[1+2*4+0*16] = a_value;}
00298   void v220(const T& a_value){array<T>::m_vector[2+2*4+0*16] = a_value;}
00299   void v320(const T& a_value){array<T>::m_vector[3+2*4+0*16] = a_value;}
00300   void v030(const T& a_value){array<T>::m_vector[0+3*4+0*16] = a_value;}
00301   void v130(const T& a_value){array<T>::m_vector[1+3*4+0*16] = a_value;}
00302   void v230(const T& a_value){array<T>::m_vector[2+3*4+0*16] = a_value;}
00303   void v330(const T& a_value){array<T>::m_vector[3+3*4+0*16] = a_value;}
00304 
00305   void v001(const T& a_value){array<T>::m_vector[0+0*4+1*16] = a_value;}
00306   void v101(const T& a_value){array<T>::m_vector[1+0*4+1*16] = a_value;}
00307   void v201(const T& a_value){array<T>::m_vector[2+0*4+1*16] = a_value;}
00308   void v301(const T& a_value){array<T>::m_vector[3+0*4+1*16] = a_value;}
00309   void v011(const T& a_value){array<T>::m_vector[0+1*4+1*16] = a_value;}
00310   void v111(const T& a_value){array<T>::m_vector[1+1*4+1*16] = a_value;}
00311   void v211(const T& a_value){array<T>::m_vector[2+1*4+1*16] = a_value;}
00312   void v311(const T& a_value){array<T>::m_vector[3+1*4+1*16] = a_value;}
00313   void v021(const T& a_value){array<T>::m_vector[0+2*4+1*16] = a_value;}
00314   void v121(const T& a_value){array<T>::m_vector[1+2*4+1*16] = a_value;}
00315   void v221(const T& a_value){array<T>::m_vector[2+2*4+1*16] = a_value;}
00316   void v321(const T& a_value){array<T>::m_vector[3+2*4+1*16] = a_value;}
00317   void v031(const T& a_value){array<T>::m_vector[0+3*4+1*16] = a_value;}
00318   void v131(const T& a_value){array<T>::m_vector[1+3*4+1*16] = a_value;}
00319   void v231(const T& a_value){array<T>::m_vector[2+3*4+1*16] = a_value;}
00320   void v331(const T& a_value){array<T>::m_vector[3+3*4+1*16] = a_value;}
00321 
00322   void v002(const T& a_value){array<T>::m_vector[0+0*4+2*16] = a_value;}
00323   void v102(const T& a_value){array<T>::m_vector[1+0*4+2*16] = a_value;}
00324   void v202(const T& a_value){array<T>::m_vector[2+0*4+2*16] = a_value;}
00325   void v302(const T& a_value){array<T>::m_vector[3+0*4+2*16] = a_value;}
00326   void v012(const T& a_value){array<T>::m_vector[0+1*4+2*16] = a_value;}
00327   void v112(const T& a_value){array<T>::m_vector[1+1*4+2*16] = a_value;}
00328   void v212(const T& a_value){array<T>::m_vector[2+1*4+2*16] = a_value;}
00329   void v312(const T& a_value){array<T>::m_vector[3+1*4+2*16] = a_value;}
00330   void v022(const T& a_value){array<T>::m_vector[0+2*4+2*16] = a_value;}
00331   void v122(const T& a_value){array<T>::m_vector[1+2*4+2*16] = a_value;}
00332   void v222(const T& a_value){array<T>::m_vector[2+2*4+2*16] = a_value;}
00333   void v322(const T& a_value){array<T>::m_vector[3+2*4+2*16] = a_value;}
00334   void v032(const T& a_value){array<T>::m_vector[0+3*4+2*16] = a_value;}
00335   void v132(const T& a_value){array<T>::m_vector[1+3*4+2*16] = a_value;}
00336   void v232(const T& a_value){array<T>::m_vector[2+3*4+2*16] = a_value;}
00337   void v332(const T& a_value){array<T>::m_vector[3+3*4+2*16] = a_value;}
00338 
00339   void v003(const T& a_value){array<T>::m_vector[0+0*4+3*16] = a_value;}
00340   void v103(const T& a_value){array<T>::m_vector[1+0*4+3*16] = a_value;}
00341   void v203(const T& a_value){array<T>::m_vector[2+0*4+3*16] = a_value;}
00342   void v303(const T& a_value){array<T>::m_vector[3+0*4+3*16] = a_value;}
00343   void v013(const T& a_value){array<T>::m_vector[0+1*4+3*16] = a_value;}
00344   void v113(const T& a_value){array<T>::m_vector[1+1*4+3*16] = a_value;}
00345   void v213(const T& a_value){array<T>::m_vector[2+1*4+3*16] = a_value;}
00346   void v313(const T& a_value){array<T>::m_vector[3+1*4+3*16] = a_value;}
00347   void v023(const T& a_value){array<T>::m_vector[0+2*4+3*16] = a_value;}
00348   void v123(const T& a_value){array<T>::m_vector[1+2*4+3*16] = a_value;}
00349   void v223(const T& a_value){array<T>::m_vector[2+2*4+3*16] = a_value;}
00350   void v323(const T& a_value){array<T>::m_vector[3+2*4+3*16] = a_value;}
00351   void v033(const T& a_value){array<T>::m_vector[0+3*4+3*16] = a_value;}
00352   void v133(const T& a_value){array<T>::m_vector[1+3*4+3*16] = a_value;}
00353   void v233(const T& a_value){array<T>::m_vector[2+3*4+3*16] = a_value;}
00354   void v333(const T& a_value){array<T>::m_vector[3+3*4+3*16] = a_value;}
00355 
00356 };
00357 
00358 }}
00359 
00360 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines