Memosa-FVM  0.2
ElecDiagonalTensor.h File Reference
#include "NumType.h"
#include "Vector.h"
#include <sstream>
#include "ElecOffDiagonalTensor.h"
Include dependency graph for ElecDiagonalTensor.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  ElecDiagonalTensor< T, N >
 

Functions

template<class T , int N>
ostream & operator<< (ostream &os, const ElecDiagonalTensor< T, N > &v)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator+ (const ElecDiagonalTensor< T, N > &a, const ElecDiagonalTensor< T, N > &b)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator- (const ElecDiagonalTensor< T, N > &a, const ElecDiagonalTensor< T, N > &b)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator- (const ElecDiagonalTensor< T, N > &a)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator* (const ElecDiagonalTensor< T, N > &a, const ElecDiagonalTensor< T, N > &b)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator* (const T s, const ElecDiagonalTensor< T, N > &a)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator* (const ElecDiagonalTensor< T, N > &a, const T s)
 
template<class T , int N>
Vector< T, N+1 > operator* (const ElecDiagonalTensor< T, N > &a, const Vector< T, N+1 > &b)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator/ (const ElecDiagonalTensor< T, N > &a, const T s)
 
template<class T , int N>
Vector< T, N+1 > operator/ (const Vector< T, N+1 > &a, const ElecDiagonalTensor< T, N > &b)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator/ (const ElecDiagonalTensor< T, N > &a, const ElecDiagonalTensor< T, N > &b)
 
template<class T , int N>
ElecDiagonalTensor< T, N > operator/ (const T s, const ElecDiagonalTensor< T, N > &a)
 
template<class T , int N>
DiagToOffDiag (const ElecDiagonalTensor< T, N > &x)
 

Function Documentation

template<class T , int N>
T DiagToOffDiag ( const ElecDiagonalTensor< T, N > &  x)

Definition at line 409 of file ElecDiagonalTensor.h.

410 {
411  throw CException("diag to offdiag not defined");
412 }
template<class T , int N>
ElecDiagonalTensor<T,N> operator* ( const ElecDiagonalTensor< T, N > &  a,
const ElecDiagonalTensor< T, N > &  b 
)

Definition at line 320 of file ElecDiagonalTensor.h.

321 {
322  throw CException("no operator defined for diag * diag");
323 }
template<class T , int N>
ElecDiagonalTensor<T,N> operator* ( const T  s,
const ElecDiagonalTensor< T, N > &  a 
)

Definition at line 327 of file ElecDiagonalTensor.h.

328 {
329  return ElecDiagonalTensor<T,N>(a) *= s;
330 }
template<class T , int N>
ElecDiagonalTensor<T,N> operator* ( const ElecDiagonalTensor< T, N > &  a,
const T  s 
)

Definition at line 334 of file ElecDiagonalTensor.h.

335 {
336  return ElecDiagonalTensor<T,N>(a) *= s;
337 }
template<class T , int N>
Vector<T,N+1> operator* ( const ElecDiagonalTensor< T, N > &  a,
const Vector< T, N+1 > &  b 
)

Definition at line 341 of file ElecDiagonalTensor.h.

342 {
343  Vector<T,N+1> r;
344  r = 0;
345  for(int i=0; i<N; i++){
346  r[i] = a[i]*b[i]+a[N+i]*b[N];
347  }
348  for(int i=0; i<=N; i++)
349  r[N] += a[2*N+i]*b[i];
350 
351  return r;
352 }
Definition: Vector.h:19
template<class T , int N>
ElecDiagonalTensor<T,N> operator+ ( const ElecDiagonalTensor< T, N > &  a,
const ElecDiagonalTensor< T, N > &  b 
)

Definition at line 299 of file ElecDiagonalTensor.h.

300 {
301  return ElecDiagonalTensor<T,N>(a) += b;
302 }
template<class T , int N>
ElecDiagonalTensor<T,N> operator- ( const ElecDiagonalTensor< T, N > &  a,
const ElecDiagonalTensor< T, N > &  b 
)

Definition at line 306 of file ElecDiagonalTensor.h.

307 {
308  return ElecDiagonalTensor<T,N>(a) -= b;
309 }
template<class T , int N>
ElecDiagonalTensor<T,N> operator- ( const ElecDiagonalTensor< T, N > &  a)

Definition at line 313 of file ElecDiagonalTensor.h.

314 {
315  return -ElecDiagonalTensor<T,N>(a);
316 }
template<class T , int N>
ElecDiagonalTensor<T,N> operator/ ( const ElecDiagonalTensor< T, N > &  a,
const T  s 
)

Definition at line 356 of file ElecDiagonalTensor.h.

357 {
358  return ElecDiagonalTensor<T,N>(a) /= s;
359 }
template<class T , int N>
Vector<T,N+1> operator/ ( const Vector< T, N+1 > &  a,
const ElecDiagonalTensor< T, N > &  b 
)

Definition at line 363 of file ElecDiagonalTensor.h.

364 {
365  //solve bx = a and return x
366  //rename Mx = v where M=b v=a
367  Vector<T,N+1> x;
368  Vector<T,N+1> v;
370  x = 0;
371  M = b;
372  v = a;
373 
374  //first step: eleminate M to upper diagonal
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]);
379  }
380  }
381 
382  //second step: go backward to solve x
383  if (M[3*N] != 0.0)
384  x[N] = v[N] / M[3*N];
385  for(int i=0; i<N; i++){
386  if (M[i] != 0.0)
387  x[i] = (v[i] - M[N+i]*x[N]) / M[i];
388  }
389 
390  return x;
391 }
Definition: Vector.h:19
template<class T , int N>
ElecDiagonalTensor<T,N> operator/ ( const ElecDiagonalTensor< T, N > &  a,
const ElecDiagonalTensor< T, N > &  b 
)

Definition at line 396 of file ElecDiagonalTensor.h.

397 {
398  throw CException("operator not defined for diag/diag");
399 }
template<class T , int N>
ElecDiagonalTensor<T,N> operator/ ( const T  s,
const ElecDiagonalTensor< T, N > &  a 
)

Definition at line 403 of file ElecDiagonalTensor.h.

404 {
405  throw CException("operator not defined for s/diag");
406 }
template<class T , int N>
ostream& operator<< ( ostream &  os,
const ElecDiagonalTensor< T, N > &  v 
)
inline

Definition at line 289 of file ElecDiagonalTensor.h.

References ElecDiagonalTensor< T, N >::printFromC().

291 {
292  v.printFromC(os);
293  return os;
294 }
void printFromC(ostream &os) const