ViennaCL - The Vienna Computing Library  1.2.0
vandermonde_matrix_operations.hpp
Go to the documentation of this file.
1 #ifndef VIENNACL_LINALG_VANDERMONDE_MATRIX_OPERATIONS_HPP_
2 #define VIENNACL_LINALG_VANDERMONDE_MATRIX_OPERATIONS_HPP_
3 
4 /* =========================================================================
5  Copyright (c) 2010-2011, Institute for Microelectronics,
6  Institute for Analysis and Scientific Computing,
7  TU Wien.
8 
9  -----------------
10  ViennaCL - The Vienna Computing Library
11  -----------------
12 
13  Project Head: Karl Rupp rupp@iue.tuwien.ac.at
14 
15  (A list of authors and contributors can be found in the PDF manual)
16 
17  License: MIT (X11), see file LICENSE in the base directory
18 ============================================================================= */
19 
24 #include "viennacl/forwards.h"
25 #include "viennacl/ocl/device.hpp"
26 #include "viennacl/ocl/handle.hpp"
27 #include "viennacl/ocl/kernel.hpp"
28 #include "viennacl/scalar.hpp"
29 #include "viennacl/vector.hpp"
30 #include "viennacl/tools/tools.hpp"
31 #include "viennacl/fft.hpp"
32 //#include "viennacl/linalg/kernels/coordinate_matrix_kernels.h"
33 
34 namespace viennacl
35 {
36  namespace linalg
37  {
38 
39 
40  // A * x
48  template<class SCALARTYPE, unsigned int ALIGNMENT, unsigned int VECTOR_ALIGNMENT>
49  vector_expression<const vandermonde_matrix<SCALARTYPE, ALIGNMENT>,
50  const vector<SCALARTYPE, VECTOR_ALIGNMENT>,
53  {
56  op_prod >(mat, vec);
57  }
58 
59  // A * x
68  template<class SCALARTYPE, unsigned int ALIGNMENT, unsigned int VECTOR_ALIGNMENT>
73  size_t NUM_THREADS)
74  {
77  viennacl::op_prod >(mat, vec);
78  }
79 
88  template<class SCALARTYPE, unsigned int ALIGNMENT, unsigned int VECTOR_ALIGNMENT>
92  {
93  assert(mat.size1() == result.size());
94  assert(mat.size2() == vec.size());
95 
96  //fft::vandermonde_prod<SCALARTYPE>(mat.handle(), vec.handle(), result.handle(), mat.size1());
97  viennacl::linalg::kernels::fft<SCALARTYPE, 1>::init();
98 
100  .get_program(viennacl::linalg::kernels::fft<SCALARTYPE, 1>::program_name())
101  .get_kernel("vandermonde_prod");
102  viennacl::ocl::enqueue(kernel(mat, vec, result, static_cast<cl_uint>(mat.size1())));
103  }
104 
105  } //namespace linalg
106 
107 
108 
113  template <typename SCALARTYPE, unsigned int ALIGNMENT>
114  template <unsigned int MAT_ALIGNMENT>
118  viennacl::op_prod> & proxy)
119  {
120  // check for the special case x = A * x
121  if (proxy.rhs().handle() == this->handle())
122  {
123  viennacl::vector<SCALARTYPE, ALIGNMENT> result(proxy.rhs().size());
124  viennacl::linalg::prod_impl(proxy.lhs(), proxy.rhs(), result);
125  *this = result;
126  return *this;
127  }
128  else
129  {
130  viennacl::linalg::prod_impl(proxy.lhs(), proxy.rhs(), *this);
131  return *this;
132  }
133  return *this;
134  }
135 
136  //v += A * x
141  template <typename SCALARTYPE, unsigned int ALIGNMENT>
142  template <unsigned int MAT_ALIGNMENT>
146  op_prod> & proxy)
147  {
148  vector<SCALARTYPE, ALIGNMENT> result(proxy.lhs().size1());
149  viennacl::linalg::prod_impl(proxy.lhs(), proxy.rhs(), result);
150  *this += result;
151  return *this;
152  }
153 
158  template <typename SCALARTYPE, unsigned int ALIGNMENT>
159  template <unsigned int MAT_ALIGNMENT>
163  op_prod> & proxy)
164  {
165  vector<SCALARTYPE, ALIGNMENT> result(proxy.get_lhs().size1());
166  viennacl::linalg::prod_impl(proxy.lhs(), proxy.rhs(), result);
167  *this -= result;
168  return *this;
169  }
170 
171 
172  //free functions:
177  template <typename SCALARTYPE, unsigned int ALIGNMENT>
178  template <unsigned int MAT_ALIGNMENT>
182  op_prod> & proxy)
183  {
184  assert(proxy.get_lhs().size1() == size());
186  viennacl::linalg::prod_impl(proxy.lhs(), proxy.rhs(), result);
187  result += *this;
188  return result;
189  }
190 
195  template <typename SCALARTYPE, unsigned int ALIGNMENT>
196  template <unsigned int MAT_ALIGNMENT>
200  op_prod> & proxy)
201  {
202  assert(proxy.get_lhs().size1() == size());
204  viennacl::linalg::prod_impl(proxy.lhs(), proxy.rhs(), result);
205  result = *this - result;
206  return result;
207  }
208 
209 } //namespace viennacl
210 
211 
212 #endif