Memosa-FVM  0.2
DiagonalMatrix.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 _DIAGONALMATRIX_H_
6 #define _DIAGONALMATRIX_H_
7 
8 
9 
10 #include "Matrix.h"
11 #include "CRConnectivity.h"
12 #include "Array.h"
13 
14 
15 template<class Diag, class X>
16 class DiagonalMatrix : public Matrix
17 {
18 public:
20  typedef Array<X> XArray;
21 
22  DiagonalMatrix(const int length) :
23  Matrix(),
24  _length(length),
25  _diag(_length)
26  {
27  logCtor();
28  }
29 
30  virtual ~DiagonalMatrix(){}
31 
32  DEFINE_TYPENAME("DiagonalMatrix<"
35  +">");
36 
37  virtual void multiply(IContainer& yB, const IContainer& xB) const
38  {
39  XArray& y = dynamic_cast<XArray&>(yB);
40  const XArray& x = dynamic_cast<const XArray&>(xB);
41  for(int i=0; i<_length; i++)
42  {
43  y[i] = _diag[i]*x[i];
44  }
45  }
46 
47  virtual void multiplyAndAdd(IContainer& yB, const IContainer& xB) const
48  {
49  XArray& y = dynamic_cast<XArray&>(yB);
50  const XArray& x = dynamic_cast<const XArray&>(xB);
51  for(int i=0; i<_length; i++)
52  {
53  y[i] += _diag[i]*x[i];
54  }
55  }
56 
57  virtual void forwardGS(IContainer& xB, IContainer& bB, IContainer&) const
58  {
59  XArray& x = dynamic_cast<XArray&>(xB);
60  const XArray& b = dynamic_cast<const XArray&>(bB);
61  for(int i=0; i<_length; i++)
62  x[i] = -b[i]/_diag[i];
63  }
64 
65  virtual void reverseGS(IContainer& xB, IContainer& bB,IContainer& r) const
66  {
67  forwardGS(xB,bB,r);
68  }
69 
70  virtual void solveBoundary(IContainer& xB, IContainer& bB,IContainer& r) const
71  {
72  forwardGS(xB,bB,r);
73  }
74 
75  virtual void computeResidual(const IContainer& xB, const IContainer& bB,
76  IContainer& rB) const
77  {
78  const XArray& x = dynamic_cast<const XArray&>(xB);
79  const XArray& b = dynamic_cast<const XArray&>(bB);
80  XArray& r = dynamic_cast<XArray&>(rB);
81 
82  for(int nr=0; nr<_length; nr++)
83  {
84  r[nr] = b[nr] + _diag[nr]*x[nr];
85  }
86  }
87 
88  virtual void transpose() {}
89 
90  Diag& operator[](int n) {return _diag[n];}
91  const Diag& operator[](int n) const {return _diag[n];}
92 
93  void addToDiag(const int i, const Diag& d)
94  {
95  _diag[i] += d;
96  }
97 
98  void unitize()
99  {
101  }
102 
103  void unitize(const int i)
104  {
106  }
107 
108  virtual shared_ptr<CRConnectivity>
110  const CRConnectivity& coarseToFine,
111  const StorageSite& coarseRowSite,
112  const StorageSite& coarseColSite)
113  {
114  // we don't really need one but all matrices are supposed to supply one
115  return shared_ptr<CRConnectivity>(new CRConnectivity(coarseRowSite,coarseColSite));
116  }
117 
118  virtual shared_ptr<Matrix>
119  createCoarseMatrix(const IContainer& gCoarseIndex,
120  const CRConnectivity& coarseToFine,
121  const CRConnectivity& )
122  {
123  const int nCoarseRows = coarseToFine.getRowDim();
124 
125  shared_ptr<DiagonalMatrix> coarseMatrix(new DiagonalMatrix(nCoarseRows));
126 
127  Array<Diag>& coarseDiag = coarseMatrix->_diag;
128  coarseDiag.zero();
129 
130  for(int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
131  {
132  // loop over the fine rows that make up this coarse row
133  const int nFine = coarseToFine.getCount(nrCoarse);
134  for(int nfr=0; nfr<nFine; nfr++)
135  {
136  const int nrFine = coarseToFine(nrCoarse,nfr);
137 
138  coarseDiag[nrCoarse] += _diag[nrFine];
139 
140  }
141  }
142 
143  return coarseMatrix;
144  }
145 
146  virtual void initAssembly()
147  {
148  _diag.zero();
149  }
150 
151  virtual bool isInvertible() {return true;}
152 
153 private:
154  const int _length;
156 };
157 #endif
158 
int getCount(const int i) const
virtual void zero()
Definition: Array.h:281
virtual void transpose()
virtual bool isInvertible()
virtual void solveBoundary(IContainer &xB, IContainer &bB, IContainer &r) const
Diag & operator[](int n)
virtual shared_ptr< Matrix > createCoarseMatrix(const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const CRConnectivity &)
Array< Diag > _diag
DiagonalMatrix(const int length)
virtual void multiply(IContainer &yB, const IContainer &xB) const
Array< X > XArray
#define logCtor()
Definition: RLogInterface.h:26
virtual shared_ptr< CRConnectivity > createCoarseConnectivity(const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const StorageSite &coarseRowSite, const StorageSite &coarseColSite)
const Diag & operator[](int n) const
virtual void initAssembly()
const int _length
virtual void forwardGS(IContainer &xB, IContainer &bB, IContainer &) const
void addToDiag(const int i, const Diag &d)
Definition: Matrix.h:16
virtual void multiplyAndAdd(IContainer &yB, const IContainer &xB) const
virtual ~DiagonalMatrix()
virtual void reverseGS(IContainer &xB, IContainer &bB, IContainer &r) const
void unitize(const int i)
DEFINE_TYPENAME("DiagonalMatrix<"+NumTypeTraits< Diag >::getTypeName()+","+NumTypeTraits< X >::getTypeName()+">")
int getRowDim() const
Array< Diag > DiagArray
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const