diff --git a/Solver/STensor33.cpp b/Solver/STensor33.cpp new file mode 100644 index 0000000000000000000000000000000000000000..96582fe0ae878a93f54296fd1ef93b9e3b8a5cc2 --- /dev/null +++ b/Solver/STensor33.cpp @@ -0,0 +1,20 @@ +#include "STensor33.h" + +void STensor33::print (const char *s) const +{ + char format[512]; + const char l[256]="%12.5E %12.5E %12.5E \n"; + sprintf (format, " tensor3 %s : \n %s %s %s \n %s %s %s \n %s %s %s \n",s, l,l,l, l,l,l, l,l,l); + printf(format,s,_val[ 0],_val[ 1],_val[ 2], + _val[ 3],_val[ 4],_val[ 5], + _val[ 6],_val[ 7],_val[ 8], + + _val[ 9],_val[10],_val[11], + _val[12],_val[13],_val[14], + _val[15],_val[16],_val[17], + + _val[18],_val[19],_val[20], + _val[21],_val[22],_val[23], + _val[24],_val[25],_val[26]); +} + diff --git a/Solver/STensor33.h b/Solver/STensor33.h new file mode 100644 index 0000000000000000000000000000000000000000..7795c866b6ea452e6e9936355282185d052b5c11 --- /dev/null +++ b/Solver/STensor33.h @@ -0,0 +1,185 @@ +#ifndef _STENSOR33_H_ +#define _STENSOR33_H_ + +#include "STensor3.h" +#include "fullMatrix.h" +#include "Numeric.h" + + +// concrete class for general 3rd-order tensor in three-dimensional space + +class STensor33 { + protected: + // 000 001 002 010 ... 211 212 220 221 222 + double _val[27]; + public: + inline int getIndex(int i, int j, int k) const + { + static int _index[3][3][3] = {{{0,1,2},{3,4,5},{6,7,8}},{{9,10,11},{12,13,14},{15,16,17}},{{18,19,20},{21,22,23},{24,25,26}}}; + return _index[i][j][k]; + } + STensor33(const STensor33& other) + { + for (int i = 0; i < 27; i++) _val[i] = other._val[i]; + } + // default constructor, null tensor + STensor33(const double v = 0.0) + { + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + _val[getIndex(i, j, k)]=v; + } + inline double &operator()(int i, int j,int k) + { + return _val[getIndex(i, j, k)]; + } + inline double operator()(int i, int j, int k) const + { + return _val[getIndex(i, j, k)]; + } + STensor33 operator + (const STensor33 &other) const + { + STensor33 res(*this); + for (int i = 0; i < 27; i++) res._val[i] += other._val[i]; + return res; + } + STensor33& operator += (const STensor33 &other) + { + for (int i = 0; i < 27; i++) _val[i] += other._val[i]; + return *this; + } + STensor33& operator *= (const double &other) + { + for (int i = 0; i < 27; i++) _val[i] *= other; + return *this; + } + STensor33 transpose (int n, int m) const + { + STensor33 ithis; + if ((n==0 && m==1) || (n==1 && m==0)) + { + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + ithis(i,j,k) = (*this)(j,i,k); + return ithis; + } + if ((n==0 && m==2) || (n==2 && m==0)) + { + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + ithis(i,j,k) = (*this)(k,j,i); + return ithis; + } + if ((n==1 && m==2) || (n==2 && m==1)) + { + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + ithis(i,j,k) = (*this)(i,k,j); + return ithis; + } + return ithis+=(*this); + } +/* STensor33& operator *= (const STensor33 &other) + { +// to be implemented + return *this; + }*/ + void print(const char *) const; +}; + +// tensor product +inline void tensprod(const SVector3 &a, const STensor3 &b, STensor33 &c) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + c(i,j,k)=a(i)*b(j,k); +} +inline void tensprod(const STensor3 &a, const SVector3 &b, STensor33 &c) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + c(i,j,k)=a(i,j)*b(k); +} + +inline double dot(const STensor33 &a, const STensor33 &b) +{ + double prod=0; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + prod+=a(i,j,k)*b(i,j,k); + return prod; +} + +// full contracted product +inline STensor33 operator*(const STensor33 &t, double m) +{ + STensor33 val(t); + val *= m; + return val; +} +inline STensor33 operator*(double m,const STensor33 &t) +{ + STensor33 val(t); + val *= m; + return val; +} + +inline STensor3 operator*(const STensor33 &t, const SVector3 &m) +{ + STensor3 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + val(i,j)+=t(i,j,k)*m(k); + return val; +} +inline STensor3 operator*( const SVector3 &m , const STensor33 &t) +{ + STensor3 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + val(j,k)+=m(i)*t(i,j,k); + return val; +} + +inline SVector3 operator*(const STensor33 &t, const STensor3 &m) +{ + SVector3 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + val(i)+=t(i,j,k)*m(k,j); + return val; +} +inline SVector3 operator*( const STensor3 &m , const STensor33 &t) +{ + SVector3 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + val(k)+=m(j,i)*t(i,j,k); + return val; +} + +inline double operator*(const STensor33 &m, const STensor33 &t) +{ + double val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + val+=m(i,j,k)*t(k,j,i); + return val; +} + + + +#endif + diff --git a/Solver/STensor43.cpp b/Solver/STensor43.cpp index cb46e4ebc1bd4ed8533c438565cd3eb14083a48b..90904f64c9954a6040fa88290fdbce7e8b91b1bc 100644 --- a/Solver/STensor43.cpp +++ b/Solver/STensor43.cpp @@ -3,9 +3,21 @@ void STensor43::print (const char *s) const { - printf("STensor43::print to be implemented \n"); -/* printf(" tensor4 %s : \n %12.5E %12.5E %12.5E \n %12.5E %12.5E %12.5E \n %12.5E %12.5E %12.5E \n",s, - (*this)(0,0),(*this)(0,1),(*this)(0,2), - (*this)(1,0),(*this)(1,1),(*this)(1,2), - (*this)(2,0),(*this)(2,1),(*this)(2,2));*/ + char format[2048]; + const char l[256]="%12.5E %12.5E %12.5E %12.5E %12.5E %12.5E %12.5E %12.5E %12.5E \n"; + sprintf (format, " tensor4 %s : \n %s %s %s \n %s %s %s \n %s %s %s \n",s, l,l,l, l,l,l, l,l,l); + printf(format,s,_val[ 0],_val[ 1],_val[ 2], _val[ 3],_val[ 4],_val[ 5], _val[ 6],_val[ 7],_val[ 8], + _val[ 9],_val[10],_val[11], _val[12],_val[13],_val[14], _val[15],_val[16],_val[17], + _val[18],_val[19],_val[20], _val[21],_val[22],_val[23], _val[24],_val[25],_val[26], + + _val[27],_val[28],_val[29], _val[30],_val[31],_val[32], _val[33],_val[34],_val[35], + _val[36],_val[37],_val[38], _val[39],_val[40],_val[41], _val[42],_val[43],_val[44], + _val[45],_val[46],_val[47], _val[48],_val[49],_val[50], _val[51],_val[52],_val[53], + + _val[54],_val[55],_val[56], _val[57],_val[58],_val[59], _val[60],_val[61],_val[62], + _val[63],_val[64],_val[65], _val[66],_val[67],_val[68], _val[69],_val[70],_val[71], + _val[72],_val[73],_val[74], _val[75],_val[76],_val[77], _val[78],_val[79],_val[80]); } + + + diff --git a/Solver/STensor43.h b/Solver/STensor43.h index 351c39657fae03aa4b94327e976f469d3069ef43..9c983f8f65f1d2ebbd5948e65d6905e6ea8ab61b 100644 --- a/Solver/STensor43.h +++ b/Solver/STensor43.h @@ -1,12 +1,13 @@ + #ifndef _STENSOR43_H_ #define _STENSOR43_H_ -#include "STensor3.h" +#include "STensor33.h" #include "fullMatrix.h" #include "Numeric.h" -// concrete class for general 3x3 matrix +// concrete class for general 3rd-order tensor in three-dimensional space class STensor43 { protected: @@ -31,13 +32,10 @@ class STensor43 { for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) for (int l = 0; l < 3; l++) - { - _val[getIndex(i, j, k, l)]= 0.; if ((i==k)&&(j==l)) - _val[getIndex(i, j, k, l)]+=0.5*v; - if ((i==l)&&(j==k)) - _val[getIndex(i, j, k, l)]+=0.5*v; - } + _val[getIndex(i, j, k, l)]=v; + else + _val[getIndex(i, j, k, l)]=0.0; } inline double &operator()(int i, int j,int k, int l) { @@ -63,14 +61,7 @@ class STensor43 { for (int i = 0; i < 81; i++) _val[i] *= other; return *this; } -/* STensor43& operator *= (const STensor43 &other) - { -// to be implemented - return *this; - }*/ - void print(const char *) const; - - STensor43 transpose (int n, int m) const + STensor43 transpose (int n, int m) const { STensor43 ithis; if ((n==0 && m==1) || (n==1 && m==0)) @@ -129,7 +120,12 @@ class STensor43 { } return ithis+=(*this); } - +/* STensor43& operator *= (const STensor43 &other) + { +// to be implemented + return *this; + }*/ + void print(const char *) const; }; // tensor product @@ -142,6 +138,23 @@ inline void tensprod(const STensor3 &a, const STensor3 &b, STensor43 &c) c(i,j,k,l)=a(i,j)*b(k,l); } +inline void tensprod(const SVector3 &a, const STensor33 &b, STensor43 &c) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = 0; l < 3; l++) + c(i,j,k,l)=a(i)*b(j,k,l); +} +inline void tensprod(const STensor33 &a, const SVector3 &b, STensor43 &c) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = 0; l < 3; l++) + c(i,j,k,l)=a(i,j,k)*b(l); +} + inline double dot(const STensor43 &a, const STensor43 &b) { double prod=0; @@ -153,13 +166,13 @@ inline double dot(const STensor43 &a, const STensor43 &b) return prod; } +// full contracted product inline STensor43 operator*(const STensor43 &t, double m) { STensor43 val(t); val *= m; return val; } - inline STensor43 operator*(double m,const STensor43 &t) { STensor43 val(t); @@ -167,6 +180,27 @@ inline STensor43 operator*(double m,const STensor43 &t) return val; } +inline STensor33 operator*(const STensor43 &t, const SVector3 &m) +{ + STensor33 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = 0; l < 3; l++) + val(i,j,k)+=t(i,j,k,l)*m(l); + return val; +} +inline STensor33 operator*( const SVector3 &m , const STensor43 &t) +{ + STensor33 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = 0; l < 3; l++) + val(j,k,l)+=m(i)*t(i,j,k,l); + return val; +} + inline STensor3 operator*(const STensor43 &t, const STensor3 &m) { STensor3 val(0.); @@ -174,10 +208,9 @@ inline STensor3 operator*(const STensor43 &t, const STensor3 &m) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) for (int l = 0; l < 3; l++) - val(i,j)+=t(i,j,k,l)*m(k,l); + val(i,j)+=t(i,j,k,l)*m(l,k); return val; } - inline STensor3 operator*( const STensor3 &m , const STensor43 &t) { STensor3 val(0.); @@ -185,10 +218,44 @@ inline STensor3 operator*( const STensor3 &m , const STensor43 &t) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) for (int l = 0; l < 3; l++) - val(k,l)+=t(i,j,k,l)*m(i,j); + val(k,l)+=m(j,i)*t(i,j,k,l); return val; } +inline SVector3 operator*(const STensor43 &t, const STensor33 &m) +{ + SVector3 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = 0; l < 3; l++) + val(i)+=t(i,j,k,l)*m(l,k,j); + return val; +} +inline SVector3 operator*( const STensor33 &m , const STensor43 &t) +{ + SVector3 val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = 0; l < 3; l++) + val(l)+=m(k,j,i)*t(i,j,k,l); + return val; +} + +inline double operator*( const STensor43 &m , const STensor43 &t) +{ + double val(0.); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = 0; l < 3; l++) + val+=m(i,j,k,l)*t(l,k,j,i); + return val; +} + + #endif +