3
Tensor3::Tensor3(int a, int b, int c, double val) : Tensor(0, 9), _a(a), _b(b), _c(c)
7
_data.push_back(CLHEP::HepMatrix(a,b,0));
13
Tensor3& Tensor3::operator*=(double t)
15
for(int ia=0; ia<_a; ia++)
16
for(int ib=0; ib<_b; ib++)
17
for(int ic=0; ic<_c; ic++)
22
Tensor3& Tensor3::operator/=(double t)
24
for(int ia=0; ia<_a; ia++)
25
for(int ib=0; ib<_b; ib++)
26
for(int ic=0; ic<_c; ic++)
31
Tensor3& Tensor3::operator+=(double t)
33
for(int ia=0; ia<_a; ia++)
34
for(int ib=0; ib<_b; ib++)
35
for(int ic=0; ic<_c; ic++)
40
Tensor3& Tensor3::operator-=(double t)
42
for(int ia=0; ia<_a; ia++)
43
for(int ib=0; ib<_b; ib++)
44
for(int ic=0; ic<_c; ic++)
49
Tensor3 Tensor3::operator-() const
56
Tensor3 operator/(const Tensor3& t1, const double d1)
59
std::vector<int> size = out.Size();
60
for(int ia=0; ia<size[0]; ia++)
61
for(int ib=0; ib<size[1]; ib++)
62
for(int ic=0; ic<size[2]; ic++)
67
CLHEP::HepVector Tensor3::Poisson(CLHEP::HepVector v) const
70
//loop over upper diagonal of \mathbf{T}, add the partial derivative wrt \vec{v}.
71
int dimension = v.num_row();
72
CLHEP::HepVector vOut(dimension);
73
for(int i=0; i<dimension; i++)
74
for(int j=0; j<dimension; j++)
75
vOut[i] += dGdUi(j, v)*Delta(i, GetConjugate(j))*pow(-1, j+1);
79
std::vector<Tensor*> Tensor3::Exponential(int maxOrder) const
81
//:T_i:^n is of order n*(i-2)+1
82
//so :T_3:^n is of order n+1
83
int maxPower = maxOrder-1;
85
std::vector<Tensor*> out; // sum(:t:^n)
86
out.push_back(this->Clone());
87
for(int n=2; n<=maxPower; n++)
90
Tensor* current = out.back();
91
out.push_back(new Tensor(current->Poisson(*this)/nFact));
96
CLHEP::HepVector Tensor3::ExponentialPoisson(CLHEP::HepVector v, int maxOrder) const
98
std::vector<Tensor*> ExpT = Exponential(maxOrder);
100
for(unsigned int i=0; i<ExpT.size(); i++)
101
out += ExpT[i]->Poisson(v);
105
double Tensor3::dGdUi(int i, CLHEP::HepVector v) const
108
int dimension = v.num_row();
109
for(int p=0; p<dimension; p++)
110
for(int q=p; q<dimension; q++)
111
for(int r=q; r<dimension; r++)
112
dGdUi += _data[p][q][r]*(v[q]*v[r]*Delta(i,p) + v[p]*v[r]*Delta(i,q) + v[p]*v[q]*Delta(i,r));
116
void Tensor3::Print(std::ostream& out) const
118
for(int i=0; i<_c; i++)
119
out << _data[i] << "\n";
122
bool Tensor3::IsZero() const
124
for(int i=0; i< _a; i++)
125
for(int j=0; i<_b; j++)
126
for(int k=0; k<_c; k++)
127
if(_data[i][j][k] > 1e-10 || _data[i][j][k] < -1e-10) return false;
131
Tensor3 operator+(const Tensor3& t1, const Tensor3& t2)
134
std::vector<int> size = t3.Size();
135
for(int ia=0; ia<size[0]; ia++)
136
for(int ib=0; ib<size[1]; ib++)
137
for(int ic=0; ic<size[2]; ic++)
138
t3[ia][ib][ic] = t1[ia][ib][ic]+t2[ia][ib][ic];
142
Tensor3 operator-(const Tensor3& t1, const Tensor3& t2)
145
std::vector<int> size = t3.Size();
146
for(int ia=0; ia<size[0]; ia++)
147
for(int ib=0; ib<size[1]; ib++)
148
for(int ic=0; ic<size[2]; ic++)
149
t3[ia][ib][ic] = t1[ia][ib][ic]-t2[ia][ib][ic];
153
std::ostream& operator<<(std::ostream& out, const Tensor3& t1)
159
void Tensor3::SetAllFields(double value)
161
std::vector<int> size = Size();
162
for(int ia=0; ia<size[0]; ia++)
163
for(int ib=0; ib<size[1]; ib++)
164
for(int ic=0; ic<size[2]; ic++)
165
(*this)[ia][ib][ic] = value;
168
std::vector<int> Tensor3::Size() const
170
std::vector<int> size(3);