tridiagonalOperator.hpp
1 #ifndef MARIAN_TRIDIAGONALOPERATOR_HPP
2 #define MARIAN_TRIDIAGONALOPERATOR_HPP
3 
4 #include <vector>
5 #include <iostream>
6 
7 namespace marian {
8 
36  public:
41  explicit TridiagonalOperator(unsigned int size);
42  TridiagonalOperator(unsigned int size, double low, double mid, double upp);
43 
49  TridiagonalOperator(const std::vector<double>& low, const std::vector<double>& mid, const std::vector<double>& upp):
50  size_(mid.size()), low_(low), mid_(mid), upp_(upp) {};
52 
56 
57  static TridiagonalOperator DPlus(int n, double h);
58  static TridiagonalOperator DMinus(int n, double h);
59  static TridiagonalOperator DZero(int n, double h);
60  static TridiagonalOperator DZero(const std::vector<double>& grid);
61  static TridiagonalOperator DPlusMinus(int n, double h);
62  static TridiagonalOperator DPlusMinus(const std::vector<double>& grid);
63  static TridiagonalOperator I(int n);
64  static TridiagonalOperator I(const std::vector<double>& grid);
66 
71  int size() const { return size_; }
72  double low(int) const;
73  double mid(int) const;
74  double upp(int) const;
76 
78  void setFirstRow(double, double);
79  void setMidRow(int, double, double, double);
80  void setMidRows(double, double, double);
81  void setLastRow(double, double);
82 
84 
85  virtual ~TridiagonalOperator(){};
86 
87  friend std::ostream & operator<<(std::ostream &s, const TridiagonalOperator& A);
90  friend TridiagonalOperator operator*(double, const TridiagonalOperator&);
91  friend TridiagonalOperator operator*(const TridiagonalOperator&, double);
92  friend TridiagonalOperator operator/(const TridiagonalOperator&, double);
93  friend std::vector<double> operator*(const TridiagonalOperator&, std::vector<double>);
94  private:
95  unsigned int size_;
96  std::vector<double> low_;
97  std::vector<double> mid_;
98  std::vector<double> upp_;
99  };
100 
116  TridiagonalOperator to(n);
117  double inv = 1.0 / h;
118  to.setFirstRow(1.0, 0.0);
119  to.setMidRows(0.0, -inv, inv);
120  to.setLastRow(0.0, 1.0);
121  return to;
122  }
123 
124 
140  TridiagonalOperator to(n);
141  double inv = 1.0 / h;
142  to.setFirstRow(1.0, 0.0);
143  to.setMidRows(-inv, inv, 0.0);
144  to.setLastRow(0.0, 1.0);
145  return to;
146  }
147 
162  TridiagonalOperator to(n);
163  double inv = 1.0 / (2.0*h);
164  to.setFirstRow(1.0, 0.0);
165  to.setMidRows(-inv, 0.0, inv);
166  to.setLastRow(0.0, 1.0);
167  return to;
168  }
169 
186  inline TridiagonalOperator TridiagonalOperator::DZero(const std::vector<double>& grid) {
187  TridiagonalOperator to(grid.size());
188  to.setFirstRow(1.0, 0.0);
189  for (unsigned int i = 2; i < grid.size(); ++i) {
190  double hm = grid.at(i-1) - grid.at(i-2);
191  double hp = grid.at(i) - grid.at(i-1);
192  double num = hm*hp*(hp+hm);
193  to.setMidRow(i, -hp*hp / num, (hp*hp - hm*hm) / num ,hm * hm / num);
194  }
195  to.setLastRow(0.0, 1.0);
196  return to;
197  }
213  TridiagonalOperator to(n);
214  double inv = 1.0 / (h*h);
215  to.setFirstRow(1.0, 0.0);
216  to.setMidRows(inv, -2.0*inv, inv);
217  to.setLastRow(0.0, 1.0);
218  return to;
219  }
220 
237  inline TridiagonalOperator TridiagonalOperator::DPlusMinus(const std::vector<double>& grid) {
238  TridiagonalOperator to(grid.size());
239  to.setFirstRow(1.0, 0.0);
240  for (unsigned int i = 2; i < grid.size()-1; ++i) {
241  double hm = grid.at(i-1) - grid.at(i-2);
242  double hp = grid.at(i) - grid.at(i-1);
243  double num = hm*hp*(hp+hm);
244  to.setMidRow(i, 2.0*hp / num, -2.0*(hp + hm) / num ,2.0 * hm / num);
245  }
246  to.setLastRow(0.0, 1.0);
247  return to;
248  }
249 
250 
260  TridiagonalOperator to(n);
261  to.setFirstRow(1.0, 0.0);
262  to.setMidRows(0.0, 1.0, 0.0);
263  to.setLastRow(0.0, 1.0);
264  return to;
265  }
266 
275  inline TridiagonalOperator TridiagonalOperator::I(const std::vector<double>& grid) {
276  TridiagonalOperator to(grid.size());
277  to.setFirstRow(1.0, 0.0);
278  to.setMidRows(0.0, 1.0, 0.0);
279  to.setLastRow(0.0, 1.0);
280  return to;
281  }
282 } //namespace marian
283 
284 #endif /* MARIAN_TRIDIAGONALOPERATOR_HPP */
unsigned int size_
Size of matrix.
Definition: tridiagonalOperator.hpp:95
std::vector< double > low_
Lower diagonal.
Definition: tridiagonalOperator.hpp:96
friend TridiagonalOperator operator/(const TridiagonalOperator &, double)
Overloading of / operator for TridiagonalOperator and a real number.
Definition: tridiagonalOperator.cpp:216
void setMidRow(int, double, double, double)
Set i-th row.
Definition: tridiagonalOperator.cpp:74
double low(int) const
Value of r-th row in low diagonal.
Definition: tridiagonalOperator.cpp:38
void setLastRow(double, double)
Set first row.
Definition: tridiagonalOperator.cpp:99
void setFirstRow(double, double)
Set first row.
Definition: tridiagonalOperator.cpp:62
friend TridiagonalOperator operator*(double, const TridiagonalOperator &)
Overloading of * operator for TridiagonalOperator and a real number.
Definition: tridiagonalOperator.cpp:171
double mid(int) const
Value of r-th row in mid diagonal.
Definition: tridiagonalOperator.cpp:46
std::vector< double > mid_
Mid diagonal.
Definition: tridiagonalOperator.hpp:97
Definition: backwardKolmogorovEq.cpp:5
TridiagonalOperator()
Default constructor.
Definition: tridiagonalOperator.hpp:40
static TridiagonalOperator I(int n)
Creates tridiagonal operator representing identity matrix.
Definition: tridiagonalOperator.hpp:259
int size() const
Return size of tridiagonal matrix.
Definition: tridiagonalOperator.hpp:71
std::vector< double > upp_
upper diagonal
Definition: tridiagonalOperator.hpp:98
void setMidRows(double, double, double)
Set middle rows.
Definition: tridiagonalOperator.cpp:86
friend TridiagonalOperator operator-(const TridiagonalOperator &, const TridiagonalOperator &)
Overloading of - operator.
Definition: tridiagonalOperator.cpp:148
static TridiagonalOperator DMinus(int n, double h)
Creates tridiagonal operator representing backward differentiating of function f. ...
Definition: tridiagonalOperator.hpp:139
TridiagonalOperator is used to define differentiating operator for PDE being solved.
Definition: tridiagonalOperator.hpp:35
static TridiagonalOperator DZero(int n, double h)
Creates tridiagonal operator representing central differentiating of function f.
Definition: tridiagonalOperator.hpp:161
friend TridiagonalOperator operator+(const TridiagonalOperator &, const TridiagonalOperator &)
Overloading of + operator.
Definition: tridiagonalOperator.cpp:126
static TridiagonalOperator DPlus(int n, double h)
Creates tridiagonal operator representing forward differentiating of function f.
Definition: tridiagonalOperator.hpp:115
friend std::ostream & operator<<(std::ostream &s, const TridiagonalOperator &A)
Overloading of << operator.
Definition: tridiagonalOperator.cpp:108
double upp(int) const
Value of r-th row in upp diagonal.
Definition: tridiagonalOperator.cpp:54
TridiagonalOperator(const std::vector< double > &low, const std::vector< double > &mid, const std::vector< double > &upp)
Constructor.
Definition: tridiagonalOperator.hpp:49
static TridiagonalOperator DPlusMinus(int n, double h)
Creates tridiagonal operator representing central second differentiating of function f...
Definition: tridiagonalOperator.hpp:212