Memosa-FVM  0.2
phononbase/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 #include "MatrixJML.h"
9 #include "Array.h"
10 #include "ArrayBase.h"
11 #include "NumType.h"
12 #include <math.h>
13 
14 template<class T>
15 class ArrowHeadMatrix : public MatrixJML<T>
16 {
17  public:
18  typedef Array<T> TArray;
20 
21  ArrowHeadMatrix(const int order):
22  _elements(3*order-2),
24  _order(order)
25  {
26  _values=0.;
27  }
28 
29  T& operator()(const int i, const int j)
30  {
31  int index;
32  if(i==j)
33  {
34  index=(i-1);
35  return _values[index];
36  }
37  else if(j==_order)
38  {
39  index=i-1+_order;
40  return _values[index];
41  }
42  else if(i==_order)
43  {
44  index=2*_order+j-2;
45  return _values[index];
46  }
47  else
48  {
49  throw CException("Invalid index: Arrowhead matrix");
50  return _values[0];
51  }
52  }
53 
54  T& getElement(const int i,const int j)
55  {
56  int index;
57  if(i==j)
58  {
59  index=(i-1);
60  return _values[index];
61  }
62  else if(j==_order)
63  {
64  index=i-1+_order;
65  return _values[index];
66  }
67  else if(i==_order)
68  {
69  index=2*_order+j-2;
70  return _values[index];
71  }
72  else
73  {
74  throw CException("Invalid index: Arrowhead matrix");
75  return _values[0];
76  }
77  }
78 
79  void printElement(const int& i,const int& j)
80  {
81  int index;
82  if(i==j)
83  {
84  index=(i-1);
85  cout<<_values[index];
86  }
87  else if(j==_order)
88  {
89  index=i-1+_order;
90  cout<<_values[index];
91  }
92  else if(i==_order)
93  {
94  index=2*_order+j-2;
95  cout<<_values[index];
96  }
97  else
98  {
99  throw CException("Invalid index for Arrowhead matrix");
100  }
101  }
102 
103  void print()
104  {
105  for(int i=1;i<_order+1;i++)
106  {
107  for(int j=1;j<_order+1;j++)
108  {
109  if((i==j)||(i==_order)||(j==_order))
110  {
111  printElement(i,j);
112  cout<<" ";
113  }
114  else
115  cout<<0<<" ";
116  }
117  cout<<endl;
118  }
119  }
120 
121  void Solve(TArray& bVec)
122  {
123 
124  //Replaces bVec with solution vector.
125 
126  T ani;
127  T ain;
128  T aii;
129  T alpha;
130  T beta;
131 
132  alpha=0.;
133  beta=0.;
134 
135 
136  for(int i=1;i<_order;i++)
137  {
138  ani=(*this)(_order,i);
139  aii=(*this)(i,i);
140  ain=(*this)(i,_order);
141 
142  alpha+=ani*bVec[i-1]/aii;
143  beta+=ani*ain/aii;
144  }
145 
146  T bn;
147  bn=(bVec[_order-1]-alpha)/((*this)(_order,_order)-beta);
148 
149  for(int i=1;i<_order;i++)
150  {
151  ain=(*this)(i,_order);
152  aii=(*this)(i,i);
153  bVec[i-1]=(bVec[i-1]-ain*bn)/aii;
154  }
155 
156  bVec[_order-1]=bn;
157  }
158 
159  void SolveDiag(TArray& bVec)
160  {
161  for(int i=1;i<_order;i++)
162  bVec[i-1]/=(*this)(i,i);
163 
164  bVec[_order-1]=0;
165  }
166 
167  void smoothGS(TArray& bVec)
168  {
169  T& dT=bVec[_order-1];
170  T sum(0);
171 
172  for(int i=1;i<_order;i++)
173  {
174  bVec[i-1]=(bVec[i-1]-(*this)(i,_order)*dT)/(*this)(i,i);
175  sum+=(*this)(i,i)*bVec[i-1];
176  }
177 
178  dT=(bVec[_order-1]-sum)/(*this)(_order,_order);
179 
180  }
181 
182  void DummySolve()
183  {
184  TArray bVec(_order);
185  bVec=1.;
186  //Replaces bVec with solution vector.
187 
188  T ani;
189  T ain;
190  T aii;
191  T alpha;
192  T beta;
193 
194  alpha=0.;
195  beta=0.;
196 
197  for(int i=1;i<_order;i++)
198  {
199  ani=(*this)(_order,i);
200  aii=(*this)(i,i);
201  ain=(*this)(i,_order);
202  alpha+=ani*bVec[i-1]/aii;
203  beta+=ani*ain/aii;
204  }
205 
206  T bn;
207  bn=(bVec[_order-1]-alpha)/((*this)(_order,_order)-beta);
208 
209  for(int i=1;i<_order;i++)
210  {
211  ain=(*this)(i,_order);
212  aii=(*this)(i,i);
213  bVec[i-1]=(bVec[i-1]-ain*bn)/aii;
214  }
215 
216  bVec[_order-1]=bn;
217  }
218 
219  void SolveBotCol(TArray& bVec)
220  {
221 
222  T sum(0);
223  for(int i=1;i<_order+1;i++)
224  sum+=getElement(_order,i);
225 
226  bVec[_order-1]/=sum;
227 
228  }
229 
230  void zero()
231  {
232  for(int i=0;i<_elements;i++)
233  _values[i]=T_Scalar(0);
234  }
235 
236  void ones()
237  {
238  for(int i=0;i<_elements;i++)
239  _values[i]=T_Scalar(1);
240  }
241 
243  {
244  T trace=0.;
245  for(int i=0;i<_order;i++)
246  trace+=fabs(_values[i]);
247  return trace;
248  }
249 
250  void multiply(const TArray& x, TArray& b)
251  { //Ax=b
252  int len=x.getLength();
253  if(len==_order)
254  {
255  b.zero();
256  for(int i=0;i<_order-1;i++)
257  b[i]=_values[i]*x[i]+_values[i-1+_order]*x[_order-1];
258 
259  b[_order-1]+=_values[_order-1]*x[_order-1];
260  for(int i=0;i<_order-1;i++)
261  b[_order-1]+=_values[2*_order+i-2]*x[i];
262  }
263  else
264  throw CException("Array length does not match matrix order!");
265  }
266 
267  private:
270  int _order;
271 
272 };
273 
274 #endif
void multiply(const TArray &x, TArray &b)
virtual void zero()
Definition: Array.h:281
T & getElement(const int i, const int j)
ArrowHeadMatrix(const int order)
NumTypeTraits< X >::T_Scalar T_Scalar
void smoothGS(TArray &bVec)
void Solve(TArray &bVec)
void SolveBotCol(TArray &bVec)
void printElement(const int &i, const int &j)
T_Scalar & getElement(const int i, const int j)
T & operator()(const int i, const int j)
Tangent fabs(const Tangent &a)
Definition: Tangent.h:312
Definition: Array.h:14
void SolveDiag(TArray &bVec)
NumTypeTraits< T >::T_Scalar T_Scalar
int getLength() const
Definition: Array.h:87