Memosa-FVM  0.2
esbgkbase/ArrowHeadMatrix.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _ARROWHEADMATRIX_H_
6 #define _ARROWHEADMATRIX_H_
7 
8 #ifdef FVM_PARALLEL
9 #include <mpi.h>
10 #endif
11 
12 #include "NumType.h"
13 #include "Array.h"
14 #include "ArrayBase.h"
15 #include "Vector.h"
16 #include "VectorTranspose.h"
17 #include "SquareTensor.h"
18 #include "StorageSite.h"
19 
20 template<class X, int K>
22 {
23 public:
24 
25  typedef Array<X> XArray;
31 
32  ArrowHeadMatrix(const int order) :
33  _order(order),
34  _numDir(order-3),
35  _d(_numDir),
36  _r(_numDir),
37  _c(_numDir),
38  _l(3),
39  _bl(),
40  _xl()
41  {
42  _d.zero();
43  _r.zero();
44  _c.zero();
45  _l.zero();
46  _bl.zero();
47  _xl.zero();
48  }
49 
50  T_Scalar& getElement(const int i,const int j)
51  {
52  int index;
53  if(i<=_numDir)
54  {
55  index=(i-1);
56  if(i==j)
57  return _d[index];
58  else
59  return _c[index][j-_order+2];
60  }
61  else
62  {
63  index=(j-1);
64  if(j<=_order-3)
65  return (_r[index])[i-_order+2];
66  else
67  return _l(i-_order+2,j-_order+2);
68  }
69  }
70 
71  void Solve(XArray& bVec)
72  {
73  _bl[0]=bVec[_order-3];
74  _bl[1]=bVec[_order-2];
75  _bl[2]=bVec[_order-1];
76  for(int i=0; i<_numDir; i++)
77  {
78  _l-=((_c[i]).getTensor(_r[i]))/_d[i];
79  _bl-=_r[i]*bVec[i]/_d[i];
80  }
81 
82  _xl=_bl/_l;
83 
84  for(int i=0; i<_order-3; i++)
85  bVec[i]=(bVec[i]-_c[i]*_xl)/_d[i];
86  bVec[_order-3]=_xl[0];
87  bVec[_order-2]=_xl[1];
88  bVec[_order-1]=_xl[2];
89  }
90 
91  void zero()
92  {
93  _d.zero();
94  _r.zero();
95  _c.zero();
96  _l.zero();
97  }
98 
100  {
101  T_Scalar trace=0.;
102  for(int i=0;i<_order-3;i++)
103  trace+=fabs(_d[i]);
104  trace+=(fabs(_l(0,0))+fabs(_l(1,1))+fabs(_l(2,2)));
105  return trace;
106  }
107 
108  void multiply(const XArray& x, XArray& b)
109  {
110  int len=x.getLength();
111  if(len==_order)
112  {
113  b.zero();
114  for(int i=0;i<_order-3;i++)
115  b[i]=_d[i]*x[i]+_c[i][0]*x[_order-3]+_c[i][1]*x[_order-2]+_c[i][2]*x[_order-1];
116 
117  b[_order-3]+=_l(0,0)*x[_order-3];
118  b[_order-2]+=_l(1,1)*x[_order-2];
119  b[_order-1]+=_l(2,2)*x[_order-1];
120  for(int i=0;i<_order-3;i++)
121  {
122  b[_order-3]+=_r[i][0]*x[i];
123  b[_order-2]+=_r[i][1]*x[i];
124  b[_order-1]+=_r[i][2]*x[i];
125  }
126  }
127  else
128  throw CException("Array length does not match matrix order!");
129  }
130 
131 
132 private:
133 
134  const int _order;
135  const int _numDir;
142 };
143 
144 #endif
virtual void zero()
Definition: Array.h:281
SquareTensor< X, K > TensorXK
Array< Vector< X, K > > VectorXKArray
ArrowHeadMatrix(const int order)
NumTypeTraits< X >::T_Scalar T_Scalar
Array< VectorTranspose< X, K > > TVectorXKArray
void multiply(const XArray &x, XArray &b)
T_Scalar & getElement(const int i, const int j)
Tangent fabs(const Tangent &a)
Definition: Tangent.h:312
void Solve(XArray &bVec)
void zero()
Definition: Vector.h:156
int getLength() const
Definition: Array.h:87