inlib
1.2.0
|
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