5 #ifndef _ELECDIAGONALTENSOR_H_
6 #define _ELECDIAGONALTENSOR_H_
34 template <
class T,
int N>
48 for(
int i=0; i<
TN; i++)
54 for(
int i=0; i<N; i++)
56 for(
int i=N; i<
TN; i++)
84 os <<
_data[i] <<
" " ;
90 for(
int i=0; i<
TN; i++)
101 for(
int i=N; i<
TN; i++)
108 for(
int i=0;i<
TN;i++)
115 for(
int i=0;i<
TN;i++)
124 for(
int i=0;i<
TN;i++)
131 for(
int i=0;i<
TN;i++)
152 for(
int i=0;i<
TN;i++)
167 throw CException(
"operator not defined for diag /= s");
168 for(
int i=0;i<
TN;i++)
176 throw CException(
"no operator defined for /= diag");
182 throw CException(
"operator not defined for diag *= s");
183 for(
int i=0;i<
TN;i++)
191 throw CException(
"no operator defined for *= diag");
196 for(
int i=0;i<TN;i++) _data[i] = NumTypeTraits<T>::getZero();
202 for(
int i=0; i<N; i++)
209 return mag2() < tolerance*tolerance;
227 for(
int i=0; i<N; i++)
236 for(
int i=0; i<N; i++)
244 for(
int i=0; i<N; i++)
251 for(
int i=0; i<N; i++)
257 for(
int i=0; i<N; i++)
263 for(
int i=0; i<N; i++)
269 for(
int i=0; i<N; i++)
275 for(
int i=0; i<N; i++)
288 template<
class T,
int N>
297 template<
class T,
int N>
304 template<
class T,
int N>
311 template<
class T,
int N>
318 template<
class T,
int N>
322 throw CException(
"no operator defined for diag * diag");
325 template<
class T,
int N>
332 template<
class T,
int N>
339 template<
class T,
int N>
345 for(
int i=0; i<N; i++){
346 r[i] = a[i]*b[i]+a[N+i]*b[N];
348 for(
int i=0; i<=N; i++)
349 r[N] += a[2*N+i]*b[i];
354 template<
class T,
int N>
361 template<
class T,
int N>
375 for(
int i=0; i<N;i++){
376 if(M[2*N+i] !=0.0 && M[i] != 0.0){
377 M[3*N] -= M[N+i] * (M[2*N+i]/M[i]);
378 v[N] -= v[i] * (M[2*N+i]/M[i]);
384 x[N] = v[N] / M[3*N];
385 for(
int i=0; i<N; i++){
387 x[i] = (v[i] - M[N+i]*x[N]) / M[i];
394 template<
class T,
int N>
398 throw CException(
"operator not defined for diag/diag");
401 template<
class T,
int N>
405 throw CException(
"operator not defined for s/diag");
408 template<
class T,
int N>
411 throw CException(
"diag to offdiag not defined");
static void setMax(ElecDiagonalTensor &x, const ElecDiagonalTensor &y)
static ElecDiagonalTensor getUnity()
NumTypeTraits< T >::T_BuiltIn T_BuiltIn
ElecDiagonalTensor< T, N > operator/(const ElecDiagonalTensor< T, N > &a, const T s)
static void getShape(int *shp)
static void reduceSum(T_Scalar &sum, const This_T &x)
ElecDiagonalTensor< T, N > This_T
NumTypeTraits< T >::T_Scalar T_Scalar
ElecDiagonalTensor & operator+=(const T s)
ElecDiagonalTensor & operator=(const ElecOffDiagonalTensor< T, N > &o)
ElecDiagonalTensor(const T &o)
ElecDiagonalTensor & operator-=(const ElecDiagonalTensor &o)
static void write(FILE *fp, const ElecDiagonalTensor &x)
ElecDiagonalTensor & operator*=(const T s)
ElecDiagonalTensor & operator/=(const ElecDiagonalTensor &o)
ElecDiagonalTensor & operator/=(const T s)
ElecDiagonalTensor< T, N > operator+(const ElecDiagonalTensor< T, N > &a, const ElecDiagonalTensor< T, N > &b)
ElecDiagonalTensor & operator+=(const ElecOffDiagonalTensor< T, N > &o)
void printFromC(ostream &os) const
ElecDiagonalTensor(const ElecDiagonalTensor &o)
T DiagToOffDiag(const ElecDiagonalTensor< T, N > &x)
static ElecDiagonalTensor getNegativeUnity()
ElecDiagonalTensor & operator=(const T &o)
static void normalize(ElecDiagonalTensor &x, const ElecDiagonalTensor &y)
ElecDiagonalTensor & operator+=(const ElecDiagonalTensor &o)
static void accumulateDotProduct(ElecDiagonalTensor &sum, const ElecDiagonalTensor &v0, const ElecDiagonalTensor &v1)
ElecDiagonalTensor & operator=(const ElecDiagonalTensor &o)
ElecDiagonalTensor & operator*=(const ElecDiagonalTensor &o)
ostream & operator<<(ostream &os, const ElecDiagonalTensor< T, N > &v)
string intAsString(const int i)
ElecDiagonalTensor & operator-=(const T s)
bool operator<(const double tolerance) const
static ElecDiagonalTensor getZero()
static void accumulateOneNorm(ElecDiagonalTensor &sum, const ElecDiagonalTensor &v)
ElecDiagonalTensor< T, N > operator*(const ElecDiagonalTensor< T, N > &a, const ElecDiagonalTensor< T, N > &b)
static double doubleMeasure(const ElecDiagonalTensor &x)
static void safeDivide(ElecDiagonalTensor &x, const ElecDiagonalTensor &y)
static int getDimension()
const T & operator[](int n) const
static string getTypeName()
ElecDiagonalTensor operator-()
ElecDiagonalTensor< T, N > operator-(const ElecDiagonalTensor< T, N > &a, const ElecDiagonalTensor< T, N > &b)