Memosa-FVM  0.2
CometMatrix.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 _COMETMATRIX_H_
6 #define _COMETMATRIX_H_
7 
8 #include "MatrixJML.h"
9 #include "Array.h"
10 #include "ArrayBase.h"
11 #include "NumType.h"
12 #include "SquareMatrixESBGK.h"
13 #include <omp.h>
14 
15 template<class T>
16 class CometMatrix : public MatrixJML<T>
17 {
18  public:
19  typedef Array<T> TArray;
21 
22  CometMatrix(const int order):
23  _elements(7*order-18),
25  _order(order),
26  _AMat(3),
27  _vel(3)
28  {
29  _values=0.;
30  _AMat.zero();
31  _vel=0;
32  }
33 
34  T& getElement(const int i,const int j)
35  {
36  int index;
37  if(i==j)
38  {
39  index=(i-1);
40  return _values[index];
41  }
42  else if(j==_order)
43  {
44  index=_order+3*i-1;
45  return _values[index];
46  }
47  else if(j==_order-1)
48  {
49  index=_order+3*i-2;
50  return _values[index];
51  }
52  else if(j==_order-2)
53  {
54  index=_order+3*i-3;
55  return _values[index];
56  }
57  else if(i==_order)
58  {
59  index=6*_order+j-16;
60  return _values[index];
61  }
62  else if(i==_order-1)
63  {
64  index=5*_order+j-13;
65  return _values[index];
66  }
67  else if(i==_order-2)
68  {
69  index=4*_order+j-10;
70  return _values[index];
71  }
72  else
73  {
74  throw CException("Invalid index for Comet 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]<<endl;
86  }
87  else if(j==_order)
88  {
89  index=i-1+_order;
90  cout<<_values[index]<<endl;
91  }
92  else if(i==_order)
93  {
94  index=2*_order+j-2;
95  cout<<_values[index]<<endl;
96  }
97  else
98  {
99  throw CException("Invalid index for Comet matrix");
100  }
101  }
102 
103  void Solve(TArray& bVec)
104  {
105 
106  //Replaces bVec with solution vector.
107 
108  T an1i;
109  T an2i;
110  T an3i;
111  T ain1;
112  T ain2;
113  T ain3;
114  T aii;
115  T alpha0;
116  T alpha1;
117  T alpha2;
118 
119  alpha0=0.;
120  alpha1=0.;
121  alpha2=0.;
122 
123  //#pragma omp parallel for default(shared) private(i,an1i,an2i,an3i,aii,ain1,ain2,ain3)
124  {
125  for(int i=1;i<_order-2;i++)
126  {
127  an1i=getElement(_order-2,i);
128  an2i=getElement(_order-1,i);
129  an3i=getElement(_order,i);
130  aii=getElement(i,i);
131  ain1=getElement(i,_order-2);
132  ain2=getElement(i,_order-1);
133  ain3=getElement(i,_order);
134 
135  _AMat.getElement(1,1)-=an1i*ain1/aii;
136  _AMat.getElement(1,2)-=an1i*ain2/aii;
137  _AMat.getElement(1,3)-=an1i*ain3/aii;
138 
139  _AMat.getElement(2,1)-=an2i*ain1/aii;
140  _AMat.getElement(2,2)-=an2i*ain2/aii;
141  _AMat.getElement(2,3)-=an2i*ain3/aii;
142 
143  _AMat.getElement(3,1)-=an3i*ain1/aii;
144  _AMat.getElement(3,2)-=an3i*ain2/aii;
145  _AMat.getElement(3,3)-=an3i*ain3/aii;
146 
147  alpha0+=an1i*bVec[i-1]/aii;
148  alpha1+=an2i*bVec[i-1]/aii;
149  alpha2+=an3i*bVec[i-1]/aii;
150  }
151  }
152 
153  _AMat.getElement(1,1)+=getElement(_order-2,_order-2);
154  _AMat.getElement(2,2)+=getElement(_order-1,_order-1);
155  _AMat.getElement(3,3)+=getElement(_order,_order);
156 
157  _vel[0]=(bVec[_order-3]-alpha0);
158  _vel[1]=(bVec[_order-2]-alpha1);
159  _vel[2]=(bVec[_order-1]-alpha2);
160 
161  _AMat.Solve(_vel);
162 
163  bVec[_order-3]=_vel[0];
164  bVec[_order-2]=_vel[1];
165  bVec[_order-1]=_vel[2];
166 
167  //#pragma omp parallel for default(shared) private(i,aii,ain1,ain2,ain3)
168  {
169  for(int i=1;i<_order-2;i++)
170  {
171  ain1=getElement(i,_order-2);
172  ain2=getElement(i,_order-1);
173  ain3=getElement(i,_order);
174  aii=getElement(i,i);
175  bVec[i-1]=(bVec[i-1]-ain1*bVec[_order-3]-ain2*bVec[_order-2]-ain3*bVec[_order-1])/aii;
176  }
177  }
178  }
179 
180  void zero()
181  {
182  for(int i=0;i<_elements;i++)
183  _values[i]=T_Scalar(0);
184  }
185 
187  {
188  T trace=0.;
189  for(int i=0;i<_order;i++)
190  trace+=fabs(_values[i]);
191  return trace;
192  }
193 
194  private:
197  int _order;
200 
201 };
202 
203 #endif
CometMatrix(const int order)
Definition: CometMatrix.h:22
SquareMatrixESBGK< T > _AMat
Definition: CometMatrix.h:198
TArray _values
Definition: CometMatrix.h:196
Array< T > TArray
Definition: CometMatrix.h:19
void printElement(const int &i, const int &j)
Definition: CometMatrix.h:79
NumTypeTraits< T >::T_Scalar T_Scalar
Definition: CometMatrix.h:20
void Solve(TArray &bVec)
Definition: CometMatrix.h:103
Tangent fabs(const Tangent &a)
Definition: Tangent.h:312
Definition: Array.h:14
TArray _vel
Definition: CometMatrix.h:199
void zero()
Definition: CometMatrix.h:180
T & getElement(const int i, const int j)
Definition: CometMatrix.h:34