OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
MVector.cpp
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015, Chris Rogers
3 * All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 * 1. Redistributions of source code must retain the above copyright notice,
7 * this list of conditions and the following disclaimer.
8 * 2. Redistributions in binary form must reproduce the above copyright notice,
9 * this list of conditions and the following disclaimer in the documentation
10 * and/or other materials provided with the distribution.
11 * 3. Neither the name of STFC nor the names of its contributors may be used to
12 * endorse or promote products derived from this software without specific
13 * prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
30
31namespace interpolation {
33
34 std::ostream& operator<<(std::ostream& out, m_complex c) {
35 out << re(c) << " r " << im(c) << " i";
36 return out;
37 }
38
39 std::istream& operator>>(std::istream& in, m_complex& c) {
40 std::string dummy;
41 in >> re(c) >> dummy >> im(c) >> dummy;
42 return in;
43 }
44
46
47 template MVector<double>::MVector(size_t i);
48 template MVector<m_complex>::MVector(size_t i);
49
50 template MVector<double>::MVector(const MVector<double>&);
51 template MVector<m_complex>::MVector(const MVector<m_complex>&);
52 template MVector<double>::MVector(size_t i, double value);
53 template MVector<m_complex>::MVector(size_t i, m_complex value);
54
55 template void MVector<double>::build_vector(const double* data_begin, const double* data_end);
57 const m_complex* data_begin, const m_complex* data_end);
58
59 template std::ostream& operator<<(std::ostream& out, MVector<double> v);
60 template std::ostream& operator<<(std::ostream& out, MVector<m_complex> v);
61 template std::istream& operator>>(std::istream& out, MVector<double>& v);
62 template std::istream& operator>>(std::istream& out, MVector<m_complex>& v);
63 template MVector<double> MVector<double>::sub(size_t n1, size_t n2) const;
64 template MVector<m_complex> MVector<m_complex>::sub(size_t n1, size_t n2) const;
65
66 template <typename Tmplt>
67 MVector<Tmplt>::MVector(size_t i) : _vector(nullptr) {
68 build_vector(i);
69 }
70
71 template <typename Tmplt>
72 MVector<Tmplt>::MVector(const MVector<Tmplt>& mv) : _vector(nullptr) {
73 *this = mv;
74 }
75
76 template <typename Tmplt>
77 MVector<Tmplt>::MVector(size_t size, Tmplt value) : _vector(nullptr) {
78 build_vector(size);
79 for (size_t i = 0; i < size; i++)
80 operator()(i + 1) = value;
81 }
82
83 template <>
85 if (_vector != nullptr) gsl_vector_free((gsl_vector*)_vector);
86 _vector = gsl_vector_alloc(size);
87 }
88
89 template <>
91 if (_vector != nullptr) gsl_vector_complex_free((gsl_vector_complex*)_vector);
92 _vector = gsl_vector_complex_alloc(size);
93 }
94
95 template <class Tmplt>
96 void MVector<Tmplt>::build_vector(const Tmplt* data_begin, const Tmplt* data_end) {
97 build_vector(data_end - data_begin);
98 for (size_t i = 0; i < num_row(); i++)
99 operator()(i + 1) = data_begin[i];
100 }
101
102 template <class Tmplt>
103 size_t MVector<Tmplt>::num_row() const {
104 if (_vector != nullptr)
105 return ((gsl_vector*)_vector)->size;
106 else
107 return 0;
108 }
109 template size_t MVector<double>::num_row() const;
110 template size_t MVector<m_complex>::num_row() const;
111
112 template <>
113 const double& MVector<double>::operator()(const size_t i) const {
114 return *gsl_vector_ptr((gsl_vector*)_vector, i - 1);
115 }
116 template <>
117 const m_complex& MVector<m_complex>::operator()(const size_t i) const {
118 return *gsl_vector_complex_ptr((gsl_vector_complex*)_vector, i - 1);
119 }
120 template <>
121 double& MVector<double>::operator()(const size_t i) {
122 return *gsl_vector_ptr((gsl_vector*)_vector, i - 1);
123 }
124 template <>
126 return *gsl_vector_complex_ptr((gsl_vector_complex*)_vector, i - 1);
127 }
128
129 template <class Tmplt>
131 MMatrix<Tmplt> mat = MMatrix<Tmplt>(1, num_row());
132 for (size_t i = 1; i <= num_row(); i++)
133 mat(1, i) = this->operator()(i);
134 return mat;
135 }
136 template MMatrix<double> MVector<double>::T() const;
138
139 template <class Tmplt>
140 bool operator==(const MVector<Tmplt>& c1, const MVector<Tmplt>& c2) {
141 if (c1.num_row() != c2.num_row()) return false;
142 for (size_t i = 0; i < c1.num_row(); i++)
143 if (c1(i + 1) != c2(i + 1)) return false;
144 return true;
145 }
146 template bool operator==(const MVector<double>& c1, const MVector<double>& c2);
147 template bool operator==(const MVector<m_complex>& c1, const MVector<m_complex>& c2);
148
149 template <>
151 if (&mv == this) return *this;
152 delete_vector();
153 if (!mv._vector) {
154 _vector = nullptr;
155 return *this;
156 }
157 _vector = gsl_vector_alloc(mv.num_row());
158 gsl_vector_memcpy((gsl_vector*)_vector, (const gsl_vector*)mv._vector);
159 return *this;
160 }
161
162 template <>
164 if (&mv == this) return *this;
165 delete_vector();
166 if (!mv._vector) {
167 _vector = nullptr;
168 return *this;
169 }
170 _vector = gsl_vector_complex_alloc(mv.num_row());
172 (gsl_vector_complex*)_vector, (const gsl_vector_complex*)mv._vector);
173 return *this;
174 }
175
176 template <class Tmplt>
177 std::ostream& operator<<(std::ostream& out, MVector<Tmplt> v) {
178 out << v.num_row() << "\n";
179 for (size_t i = 0; i < v.num_row(); i++)
180 out << " " << v(i + 1) << "\n";
181 return out;
182 }
183
184 template <class Tmplt>
185 std::istream& operator>>(std::istream& in, MVector<Tmplt>& v) {
186 size_t n;
187 in >> n;
188 v = MVector<Tmplt>(n);
189 for (size_t i = 1; i <= v.num_row(); i++)
190 in >> v(i);
191 return in;
192 }
193
194 template <class Tmplt>
195 MVector<Tmplt> MVector<Tmplt>::sub(size_t n1, size_t n2) const {
196 MVector<Tmplt> temp(n2 - n1 + 1);
197 for (size_t i = n1; i <= n2; i++)
198 temp(i - n1 + 1) = operator()(i);
199 return temp;
200 }
201
203 MVector<m_complex> c(real.num_row());
204 for (size_t i = 1; i <= real.num_row(); i++)
205 c(i) = m_complex_build(real(i));
206 return c;
207 }
208
210 MVector<m_complex> c(real.num_row());
211 for (size_t i = 1; i <= real.num_row(); i++)
212 c(i) = m_complex_build(real(i), im(i));
213 return c;
214 }
215
217 MVector<double> d(c.num_row());
218 for (size_t i = 1; i <= c.num_row(); i++)
219 d(i) = re(c(i));
220 return d;
221 }
222
224 MVector<double> d(c.num_row());
225 for (size_t i = 1; i <= c.num_row(); i++)
226 d(i) = im(c(i));
227 return d;
228 }
229
230} // namespace interpolation
void gsl_vector_free(gsl_vector *v)
Free a vector allocated by gsl_vector_alloc.
Definition GSLMatrix.h:160
gsl_complex * gsl_vector_complex_ptr(gsl_vector_complex *v, size_t i)
Return pointer to element in a complex vector.
Definition GSLMatrix.h:252
gsl_vector * gsl_vector_alloc(size_t n)
Allocate a zero-initialized real vector of length .
Definition GSLMatrix.h:147
void gsl_vector_memcpy(gsl_vector *dest, const gsl_vector *src)
Definition GSLMatrix.h:374
double * gsl_vector_ptr(gsl_vector *v, size_t i)
Return pointer to element in a real vector.
Definition GSLMatrix.h:236
void gsl_vector_complex_memcpy(gsl_vector_complex *dest, const gsl_vector_complex *src)
Copy src into dest (complex vectors).
Definition GSLMatrix.h:387
gsl_vector_complex * gsl_vector_complex_alloc(size_t n)
Allocate a zero-initialized complex vector of length .
Definition GSLMatrix.h:171
void gsl_vector_complex_free(gsl_vector_complex *v)
Free a vector allocated by gsl_vector_complex_alloc.
Definition GSLMatrix.h:186
MMatrix< Tmplt > T() const
Definition MVector.cpp:130
MVector< Tmplt > & operator=(const MVector< Tmplt > &mv)
MVector< Tmplt > sub(size_t n1, size_t n2) const
Definition MVector.cpp:195
void build_vector(size_t size)
Tmplt & operator()(size_t i)
size_t num_row() const
Definition MVector.cpp:103
m_complex m_complex_build(double r, double i)
Definition MVector.h:60
bool operator==(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
MMatrix< m_complex > complex(MMatrix< double > real)
Definition MMatrix.cpp:399
gsl_complex m_complex
Definition MVector.h:58
template std::istream & operator>>(std::istream &in, MMatrix< double > &mat)
MMatrix< double > re(MMatrix< m_complex > mc)
Definition MMatrix.cpp:383
std::ostream & operator<<(std::ostream &out, const Mesh::Iterator &it)
Definition Mesh.cpp:33
MMatrix< double > im(MMatrix< m_complex > mc)
Definition MMatrix.cpp:391
Complex number stored as .
Definition GSLComplex.h:27
Dense complex vector with stride.
Definition GSLMatrix.h:76
Dense real vector with stride.
Definition GSLMatrix.h:61