Grid 0.7.0
Grid_vector_unops.h
Go to the documentation of this file.
1/*************************************************************************************
2
3Grid physics library, www.github.com/paboyle/Grid
4
5Source file: ./lib/simd/Grid_vector_unops.h
6
7Copyright (C) 2015
8
9Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
10Author: Peter Boyle <paboyle@ph.ed.ac.uk>
11Author: neo <cossu@post.kek.jp>
12Author: paboyle <paboyle@ph.ed.ac.uk>
13
14This program is free software; you can redistribute it and/or modify
15it under the terms of the GNU General Public License as published by
16the Free Software Foundation; either version 2 of the License, or
17(at your option) any later version.
18
19This program is distributed in the hope that it will be useful,
20but WITHOUT ANY WARRANTY; without even the implied warranty of
21MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22GNU General Public License for more details.
23
24You should have received a copy of the GNU General Public License along
25with this program; if not, write to the Free Software Foundation, Inc.,
2651 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27
28See the full license in the file "LICENSE" in the top level distribution
29directory
30*************************************************************************************/
31 /* END LEGAL */
32#pragma once
33
34#include <cmath>
35
37
38template <class scalar>
40 accelerator scalar operator()(const scalar &a) const { return sqrt(real(a)); }
41};
42
43template <class scalar>
45 accelerator scalar operator()(const scalar &a) const {
46 return scalar(1.0 / sqrt(real(a)));
47 }
48};
49
50template <class scalar>
52 accelerator scalar operator()(const scalar &a) const { return cos(real(a)); }
53};
54
55template <class scalar>
57 accelerator scalar operator()(const scalar &a) const { return sin(real(a)); }
58};
59
60template <class scalar>
62 accelerator scalar operator()(const scalar &a) const { return acos(real(a)); }
63};
64
65template <class scalar>
67 accelerator scalar operator()(const scalar &a) const { return asin(real(a)); }
68};
69template <class scalar>
71 accelerator scalar operator()(const scalar &a) const { return log(real(a)); }
72};
73template <class scalar>
74struct ExpFunctor {
75 accelerator scalar operator()(const scalar &a) const { return exp(a); }
76};
77template <class scalar>
78struct NotFunctor {
79 accelerator scalar operator()(const scalar &a) const { return (!a); }
80};
81template <class scalar>
83 accelerator scalar operator()(const scalar &a) const { return std::abs(real(a)); }
84};
85template <class scalar>
87 double y;
88 accelerator PowRealFunctor(double _y) : y(_y){};
89 accelerator scalar operator()(const scalar &a) const { return pow(real(a), y); }
90};
91
92template <class scalar>
96 accelerator scalar operator()(const scalar &a) const { return Integer(a) % y; }
97};
98
99template <class scalar>
103 accelerator scalar operator()(const scalar &a) const { return Integer(a) / y; }
104};
105
106template <class scalar>
108 accelerator scalar operator()(const scalar &a) const { return real(a); }
109};
110template <class scalar>
112 accelerator scalar operator()(const scalar &a) const { return imag(a); }
113};
114
115// Unary operations
117template <class S, class V>
119 return SimdApply(RealFunctor<S>(), r);
120}
121template <class S, class V>
123 return SimdApply(ImagFunctor<S>(), r);
124}
125template <class S, class V>
127 return SimdApply(SqrtRealFunctor<S>(), r);
128}
129template <class S, class V>
131 return SimdApply(CosRealFunctor<S>(), r);
132}
133template <class S, class V>
135 return SimdApply(SinRealFunctor<S>(), r);
136}
137template <class S, class V>
139 return SimdApply(AcosRealFunctor<S>(), r);
140}
141template <class S, class V>
143 return SimdApply(AsinRealFunctor<S>(), r);
144}
145template <class S, class V>
147 return SimdApply(LogRealFunctor<S>(), r);
148}
149template <class S, class V>
151 return SimdApply(AbsRealFunctor<S>(), r);
152}
153template <class S, class V>
155 return SimdApply(ExpFunctor<S>(), r);
156}
157template <class S, class V>
159 return SimdApply(NotFunctor<S>(), r);
160}
161template <class S, class V>
163 return SimdApply(PowRealFunctor<S>(y), r);
164}
165template <class S, class V>
167 return SimdApply(ModIntFunctor<S>(y), r);
168}
169template <class S, class V>
171 return SimdApply(DivIntFunctor<S>(y), r);
172}
173
174template <class S, class V>
176 return SimdApply(RealFunctor<S>(), r);
177}
178template <class S, class V>
180 return SimdApply(ImagFunctor<S>(), r);
181}
182template <class S, class V>
186template <class S, class V>
188 return SimdApply(CosRealFunctor<S>(), r);
189}
190template <class S, class V>
192 return SimdApply(SinRealFunctor<S>(), r);
193}
194template <class S, class V>
198template <class S, class V>
202template <class S, class V>
204 return SimdApply(LogRealFunctor<S>(), r);
205}
206template <class S, class V>
208 return SimdApply(AbsRealFunctor<S>(), r);
209}
210template <class S, class V>
212 return SimdApply(ExpFunctor<S>(), r);
213}
214template <class S, class V>
216 return SimdApply(NotFunctor<S>(), r);
217}
218template <class S, class V>
220 return SimdApply(PowRealFunctor<S>(y), r);
221}
222template <class S, class V>
224 return SimdApply(ModIntFunctor<S>(y), r);
225}
226template <class S, class V>
228 return SimdApply(DivIntFunctor<S>(y), r);
229}
230
231
233// Allows us to assign into **conformable** real vectors from complex
235template <class scalar>
237 accelerator scalar operator()(const scalar &x, const scalar &y) const { return x & y; }
238};
239template <class scalar>
240struct OrFunctor {
241 accelerator scalar operator()(const scalar &x, const scalar &y) const { return x | y; }
242};
243template <class scalar>
245 accelerator scalar operator()(const scalar &x, const scalar &y) const { return x && y; }
246};
247template <class scalar>
249 accelerator scalar operator()(const scalar &x, const scalar &y) const { return x || y; }
250};
251
253// Calls to simd binop functors
255template <class S, class V>
257 const Grid_simd<S, V> &y) {
258 return SimdApplyBinop(AndFunctor<S>(), x, y);
259}
260template <class S, class V>
262 const Grid_simd<S, V> &y) {
263 return SimdApplyBinop(AndAndFunctor<S>(), x, y);
264}
265template <class S, class V>
267 const Grid_simd<S, V> &y) {
268 return SimdApplyBinop(OrFunctor<S>(), x, y);
269}
270template <class S, class V>
272 const Grid_simd<S, V> &y) {
273 return SimdApplyBinop(OrOrFunctor<S>(), x, y);
274}
#define accelerator_inline
#define accelerator
accelerator_inline Grid_simd< S, V > cos(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > div(const Grid_simd< S, V > &r, Integer y)
accelerator_inline Grid_simd< S, V > operator&&(const Grid_simd< S, V > &x, const Grid_simd< S, V > &y)
accelerator_inline Grid_simd< S, V > imag(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > operator|(const Grid_simd< S, V > &x, const Grid_simd< S, V > &y)
accelerator_inline Grid_simd< S, V > abs(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > mod(const Grid_simd< S, V > &r, Integer y)
accelerator_inline Grid_simd< S, V > asin(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > pow(const Grid_simd< S, V > &r, double y)
accelerator_inline Grid_simd< S, V > sin(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > real(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > Not(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > acos(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > exp(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > operator||(const Grid_simd< S, V > &x, const Grid_simd< S, V > &y)
accelerator_inline Grid_simd< S, V > operator&(const Grid_simd< S, V > &x, const Grid_simd< S, V > &y)
accelerator_inline Grid_simd< S, V > sqrt(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > log(const Grid_simd< S, V > &r)
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
uint32_t Integer
Definition Simd.h:58
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &x, const scalar &y) const
accelerator scalar operator()(const scalar &x, const scalar &y) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator DivIntFunctor(Integer _y)
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator ModIntFunctor(Integer _y)
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &x, const scalar &y) const
accelerator scalar operator()(const scalar &x, const scalar &y) const
accelerator PowRealFunctor(double _y)
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const
accelerator scalar operator()(const scalar &a) const