gslpp_vector_double.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 HEPfit Collaboration
3  * All rights reserved.
4  *
5  * For the licensing terms see doc/COPYING.
6  */
7 
8 #include <stdlib.h>
9 #include <iostream>
10 #ifndef __GSL_BLAS_H__
11 #include <gsl/gsl_blas.h>
12 #endif
13 #ifndef GSLPP_VECTOR_DOUBLE_H
14 #include "gslpp_vector_double.h"
15 #endif
16 #ifndef GSLPP_VECTOR_COMPLEX_H
17 #include "gslpp_vector_complex.h"
18 #endif
19 
20 namespace gslpp
21 {
23  vector<double>::vector(const size_t& size, const double& a)
24  {
25  _vector = gsl_vector_alloc(size);
26  gsl_vector_set_all(_vector, a);
27  }
28 
29  vector<double>::vector(const size_t& size)
30  {
31  _vector = gsl_vector_alloc(size);
32  gsl_vector_set_all(_vector, 0.);
33  }
34 
37  {
38  _vector = gsl_vector_alloc(v.size());
39  gsl_vector_memcpy(_vector, v.as_gsl_type_ptr());
40  }
41 
42  vector<double>::vector(const gsl_vector& v)
43  {
44  _vector = gsl_vector_alloc(v.size);
45  gsl_vector_memcpy(_vector, &v);
46  }
47 
48  vector<double>::vector(const gsl_vector* v)
49  {
50  _vector = gsl_vector_alloc(v->size);
51  gsl_vector_memcpy(_vector, v);
52  }
53 
56  {
57  gsl_vector_free(_vector);
58  }
59 
61  const double& vector<double>::operator()(const size_t& i) const
62  {
63  const double *x = gsl_vector_const_ptr(_vector, i);
64  return *x;
65  }
66 
68  double& vector<double>::operator()(const size_t& i)
69  {
70  double *x = gsl_vector_ptr(_vector, i);
71  return *x;
72  }
73 
76  {
77  gsl_vector_memcpy(_vector, v.as_gsl_type_ptr());
78  return *this;
79  }
80 
82  size_t vector<double>::size() const
83  {
84  return _vector->size;
85  }
86 
88  double vector<double>::mod() const
89  {
90  return gsl_blas_dnrm2(_vector);
91  }
92 
94  double vector<double>::max() const
95  {
96  return gsl_vector_max(_vector);
97  }
98 
100  double vector<double>::min() const
101  {
102  return gsl_vector_min(_vector);
103  }
104 
107  {
108  return _vector;
109  }
110 
112  {
113  return const_cast<gsl_vector&>(*_vector);
114  }
115 
116  const gsl_vector& vector<double>::as_gsl_type() const
117  {
118  return const_cast<gsl_vector&>(*_vector);
119  }
120 
123  {
124  vector<double> v1(_vector);
125  if (gsl_vector_scale(v1.as_gsl_type_ptr(), -1.))
126  {
127  std::cout << "\n Error in vector<double> unary -" << std::endl;
128  exit(EXIT_FAILURE);
129  }
130  return v1;
131  }
132 
135  {
136  vector<double> v1(_vector);
137  if (gsl_vector_add(v1.as_gsl_type_ptr(), v.as_gsl_type_ptr()))
138  {
139  std::cout << "\n Error in vector<double> +" << std::endl;
140  exit(EXIT_FAILURE);
141  }
142  return v1;
143  }
146  {
147  vector<double> v1(_vector);
148  if (gsl_vector_sub(v1.as_gsl_type_ptr(), v.as_gsl_type_ptr()))
149  {
150  std::cout << "\n Error in vector<double> -" << std::endl;
151  exit(EXIT_FAILURE);
152  }
153  return v1;
154  }
157  {
158  double a=0.;
159  vector<double> v1(_vector);
160  if(gsl_blas_ddot(v1.as_gsl_type_ptr(), v.as_gsl_type_ptr(), &a))
161  {
162  std::cout << "\n Error in vector<double> *" << std::endl;
163  exit(EXIT_FAILURE);
164  }
165  return a;
166  }
168 // vector<double> vector<double>::operator^(const vector<double>& v)
169 // {
170 // std::cout << "\n To be implemented" << std::endl;
171 // exit(EXIT_FAILURE);
172 // }
173 
176  {
177  *this = *this + v;
178  return *this;
179  }
182  {
183  *this = *this - v;
184  return *this;
185  }
186 
189  {
190  vector<double> v1(_vector);
191  if (gsl_vector_add_constant(v1.as_gsl_type_ptr(), a))
192  {
193  std::cout << "\n Error in vector<double> + (double)" << std::endl;
194  exit(EXIT_FAILURE);
195  }
196  return v1;
197  }
200  {
201  vector<double> v1(_vector);
202  if (gsl_vector_add_constant(v1.as_gsl_type_ptr(), -a))
203  {
204  std::cout << "\n Error in vector<double> - (double)" << std::endl;
205  exit(EXIT_FAILURE);
206  }
207  return v1;
208  }
211  {
212  vector<double> v1(_vector);
213  if (gsl_vector_scale(v1.as_gsl_type_ptr(), a))
214  {
215  std::cout << "\n Error in vector<double> * (double)" << std::endl;
216  exit(EXIT_FAILURE);
217  }
218  return v1;
219  }
222  {
223  vector<double> v1(_vector);
224  if (gsl_vector_scale(v1.as_gsl_type_ptr(), 1./a))
225  {
226  std::cout << "\n Error in vector<double> / (double)" << std::endl;
227  exit(EXIT_FAILURE);
228  }
229  return v1;
230  }
233  {
234  *this = *this + a;
235  return *this;
236  }
239  {
240  *this = *this - a;
241  return *this;
242  }
245  {
246  *this = *this * a;
247  return *this;
248  }
251  {
252  *this = *this / a;
253  return *this;
254  }
257  {
258  vector<complex> v1(*this);
259  return v1+z;
260  }
263  {
264  vector<complex> v1(*this);
265  return v1-z;
266  }
269  {
270  vector<complex> v1(*this);
271  return v1*z;
272  }
275  {
276  vector<complex> v1(*this);
277  return v1/z;
278  }
280  std::ostream& operator<<(std::ostream& output, const vector<double>& v)
281  {
282  size_t i;
283  output << "(";
284  for (i=0; i<v.size()-1; i++)
285  output << v(i) << ",";
286  output << v(i) << ")";
287  return output;
288  }
289 
291  {
292  return v+a;
293  }
294 
296  {
297  return -v+a;
298  }
299 
301  {
302  return v*a;
303  }
304 
306  {
307  return v+z;
308  }
309 
311  {
312  return -v+z;
313  }
314 
316  {
317  return v*z;
318  }
319 }
vector< complex > operator+(const complex &z, vector< double > v)
complex operator*(const double &x1, const complex &z2)
A class for constructing and defining operations on complex vectors.
vector< complex > operator*(const complex &z, vector< double > v)
complex operator/(const double &x1, const complex &z2)
vector< complex > operator-(const complex &z, vector< double > v)
A class for constructing and defining operations on real vectors.
A base class for defining operations on vectors, both real and complex.
complex operator+(const double &x1, const complex &z2)
A class for defining operations on and functions of complex numbers.
Definition: gslpp_complex.h:35
complex operator-(const double &x1, const complex &z2)
Complex number, vector and matrix manipulation using GSL.
gsl_vector * as_gsl_type_ptr() const