PFASST++
interface.hpp
Go to the documentation of this file.
1 
5 #ifndef _PFASST__QUADRATURE__INTERFACE_HPP_
6 #define _PFASST__QUADRATURE__INTERFACE_HPP_
7 
8 #include <cassert>
9 #include <vector>
10 using namespace std;
11 
12 #include <Eigen/Dense>
13 template<typename scalar>
14 using Matrix = Eigen::Matrix<scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
15 
16 template<typename scalar>
17 using Index = typename Matrix<scalar>::Index;
18 
19 #include "pfasst/globals.hpp"
20 #include "pfasst/interfaces.hpp"
22 
23 
24 namespace pfasst
25 {
26  namespace quadrature
27  {
32  enum class QuadratureType : int {
33  GaussLegendre = 0
34  , GaussLobatto = 1
35  , GaussRadau = 2
36  , ClenshawCurtis = 3
37  , Uniform = 4
38  , UNDEFINED = -1
39  };
40 
41 
42  template<typename scalar>
43  static Polynomial<scalar> build_polynomial(const size_t node, const vector<scalar>& nodes)
44  {
45  const size_t num_nodes = nodes.size();
46  Polynomial<scalar> p(num_nodes + 1), p1(num_nodes + 1);
47  p[0] = 1.0;
48 
49  for (size_t m = 0; m < num_nodes; ++m) {
50  if (m == node) { continue; }
51 
52  // p_{m+1}(x) = (x - x_j) * p_m(x)
53  p1[0] = scalar(0.0);
54  for (size_t j = 0; j < num_nodes; ++j) { p1[j + 1] = p[j]; }
55  for (size_t j = 0; j < num_nodes + 1; ++j) { p1[j] -= p[j] * nodes[m]; }
56  for (size_t j = 0; j < num_nodes + 1; ++j) { p[j] = p1[j]; }
57  }
58 
59  return p;
60  }
61 
62 
79  template<typename scalar>
80  static Matrix<scalar> compute_q_matrix(const vector<scalar>& from, const vector<scalar>& to)
81  {
82  const size_t to_size = to.size();
83  const size_t from_size = from.size();
84  assert(to_size >= 1 && from_size >= 1);
85 
86  Matrix<scalar> q_mat = Matrix<scalar>::Zero(to_size, from_size);
87 
88  for (size_t m = 0; m < from_size; ++m) {
90  // evaluate integrals
91  auto den = p.evaluate(from[m]);
92  auto P = p.integrate();
93  for (size_t j = 0; j < to_size; ++j) {
94  q_mat(j, m) = (P.evaluate(to[j]) - P.evaluate(0.0)) / den;
95  }
96  }
97 
98  return q_mat;
99  }
100 
101 
112  template<typename scalar>
113  static Matrix<scalar> compute_q_matrix(const vector<scalar>& nodes)
114  {
115  return compute_q_matrix<scalar>(nodes, nodes);
116  }
117 
118 
130  template<typename scalar>
132  {
133  Matrix<scalar> q_mat = Matrix<scalar>::Zero(s_mat.rows(), s_mat.cols());
134  q_mat.col(0) = s_mat.col(0);
135  for (Index<scalar> q_mat_col = 1; q_mat_col < q_mat.cols(); ++q_mat_col) {
136  q_mat.col(q_mat_col) = q_mat.col(q_mat_col - 1) + s_mat.col(q_mat_col);
137  }
138  return q_mat;
139  }
140 
141 
157  template<typename scalar>
159  {
160  Matrix<scalar> s_mat = Matrix<scalar>::Zero(q_mat.rows(), q_mat.cols());
161  s_mat.row(0) = q_mat.row(0);
162  for (Index<scalar> row = 1; row < s_mat.rows(); ++row) {
163  s_mat.row(row) = q_mat.row(row) - q_mat.row(row - 1);
164  }
165  return s_mat;
166  }
167 
168 
180  template<typename scalar>
181  static Matrix<scalar> compute_s_matrix(const vector<scalar>& from, const vector<scalar>& to)
182  {
183  return compute_s_matrix(compute_q_matrix(from, to));
184  }
185 
186 
199  template<typename scalar>
200  static vector<scalar> compute_q_vec(const vector<scalar>& nodes)
201  {
202  const size_t num_nodes = nodes.size();
203  assert(num_nodes >= 1);
204 
205  vector<scalar> q_vec = vector<scalar>(num_nodes, scalar(0.0));
206 
207  for (size_t m = 0; m < num_nodes; ++m) {
208  Polynomial<scalar> p = build_polynomial(m, nodes);
209  // evaluate integrals
210  auto den = p.evaluate(nodes[m]);
211  auto P = p.integrate();
212  q_vec[m] = (P.evaluate(scalar(1.0)) - P.evaluate(scalar(0.0))) / den;
213  }
214 
215  return q_vec;
216  }
217 
231  template<typename precision = pfasst::time_precision>
233  {
234  protected:
236  static const bool LEFT_IS_NODE = false;
237  static const bool RIGHT_IS_NODE = false;
238 
239  size_t num_nodes;
242  vector<precision> q_vec; // XXX: black spot
244  vector<precision> nodes;
246 
247  public:
249 
252  explicit IQuadrature(const size_t num_nodes);
256  IQuadrature();
257  virtual ~IQuadrature() = default;
259 
261  virtual const Matrix<precision>& get_q_mat() const;
262  virtual const Matrix<precision>& get_s_mat() const;
263  virtual const Matrix<precision>& get_b_mat() const;
264  virtual const vector<precision>& get_q_vec() const;
265  virtual const vector<precision>& get_nodes() const;
266  virtual size_t get_num_nodes() const;
267 
272  virtual bool left_is_node() const;
277  virtual bool right_is_node() const;
279 
283  precision expected_error() const;
284 
285  protected:
287 
291  virtual void compute_nodes();
292  virtual void compute_weights();
294  };
295  } // ::pfasst::quadrature
296 } // ::pfasst
297 
299 
300 #endif // _PFASST__QUADRATURE__INTERFACE_HPP_
Representation of a polynomial including differentiation, integration and root finding.
Definition: polynomial.hpp:28
vector< precision > q_vec
Definition: interface.hpp:242
typename Matrix< scalar >::Index Index
Definition: interface.hpp:17
Interface for quadrature handlers.
Definition: interface.hpp:232
Quadrature handler for Clenshaw-Curtis quadrature.
QuadratureType
Quadrature type descriptors.
Definition: interface.hpp:32
Polynomial< CoeffT > integrate() const
Integrates this polynomial.
Quadrature handler for uniform distributed nodes.
Definition: uniform.hpp:23
STL namespace.
vector< precision > nodes
Definition: interface.hpp:244
Quadrature handler for Gauss-Lobatto quadrature.
Matrix< precision > b_mat
Definition: interface.hpp:243
Quadrature handler for Gauss-Radau quadrature.
Definition: gauss_radau.hpp:23
vector< precision > compute_nodes(size_t nnodes, QuadratureType qtype)
Compute quadrature nodes for given quadrature type descriptor.
Definition: quadrature.hpp:84
Quadrature handler for Gauss-Legendre quadrature.
Matrix< precision > q_mat
Definition: interface.hpp:240
interfaces for SDC/MLSDC/PFASST algorithms.
static vector< scalar > compute_q_vec(const vector< scalar > &nodes)
Compute vector \( q \) for integration from \( 0 \) to \( 1 \) for given set of nodes.
Definition: interface.hpp:200
Matrix< precision > s_mat
Definition: interface.hpp:241
static Matrix< scalar > compute_s_matrix(const vector< scalar > &from, const vector< scalar > &to)
Compute node-to-node quadrature matrix \( S \) from two given sets of nodes.
Definition: interface.hpp:181
Eigen::Matrix< scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > Matrix
static Matrix< scalar > compute_q_matrix(const Matrix< scalar > &s_mat)
Compute quadrature matrix \( Q \) from a given node-to-node quadrature matrix \( S \)...
Definition: interface.hpp:131
static Polynomial< scalar > build_polynomial(const size_t node, const vector< scalar > &nodes)
Definition: interface.hpp:43
xtype evaluate(const xtype x) const
Evaluate polynomial for given value.
Definition: polynomial.hpp:95