Vlasiator ebf0dd394 on dev (v5.4.0 + 1054 commits)
Loading...
Searching...
No Matches
vectorclass_fallback.h
Go to the documentation of this file.
1/*
2 * This file is part of Vlasiator.
3 * Copyright 2010-2016 Finnish Meteorological Institute
4 *
5 * For details of usage, see the COPYING file and read the "Rules of the Road"
6 * at http://www.physics.helsinki.fi/vlasiator/
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22#ifndef VECTORCLASS_PORTABLE_H
23#define VECTORCLASS_PORTABLE_H
24
26#include <math.h>
27#include <stdio.h>
28#include <initializer_list>
29// Prefetching does nothing in the fallback vectorclass, if no system implementation
30// is available
31//#ifndef _mm_prefetch
32//#define _mm_prefetch(...)
33//#endif
34
35template <typename T>
37{
38 public:
39 T val[VECL] __attribute__((aligned(32)));
42 /*
43 VecSimple(T a,T b,T c,T d);
44 VecSimple(T a,T b,T c,T d, T e,T f,T g,T h);
45 VecSimple(T a,T b,T c,T d,T e,T f,T g,T h,T i,T j,T k,T l,T m,T n,T o,T p);
46 VecSimple(T a,T b,T c,T d,T e,T f,T g,T h,T i,T j,T k,T l,T m,T n,T o,T p,T q,T r,T s,T t,T u,T v,T w,T x,T y,T z,T aa,T bb,T cc,T dd,T ee,T ff);
47 */
49 ARCH_HOSTDEV VecSimple<T> & load(T const * p);
50 ARCH_HOSTDEV VecSimple<T> & load_a(T const * p);
51 ARCH_HOSTDEV VecSimple<T> & insert(int i,T const &x);
52 ARCH_HOSTDEV void store(T * p) const;
53 ARCH_HOSTDEV void store_a(T * p) const;
55 ARCH_HOSTDEV T operator [](int i) const;
56 ARCH_HOSTDEV T & operator [](int i);
59 // Pass vector values as an initializer list instead of a bunch of arguments.
60 ARCH_HOSTDEV VecSimple(std::initializer_list<T> list)
61 {
62 if (list.size() == 1) {
63 for(int i=0; i<VECL; ++i) {
64 val[i] = *(list.begin());
65 }
66 } else if (list.size() == VECL) {
67 unsigned int i = 0;
68 for(auto it = list.begin(); it != list.end(); ++it) {
69 val[i] = *it;
70 ++i;
71 }
72 } else {
73 printf("Constructing a vector with a number of elements not equal to 1 or VECL = %d \nInitializer_list size = %lu\n", VECL, list.size());
74 }
75 }
76
77};
79
80template <class T>
82{
83 VecSimple<T> temp;
84 for(unsigned int i=0;i<VECL;i++) {
85 temp.insert(i, fabs(l.val[i]));
86 }
87 return temp;
88}
89
90template <class T>
92{
93 VecSimple<T> temp;
94 for(unsigned int i=0;i<VECL;i++) {
95 temp.insert(i, sqrt(l.val[i]));
96 }
97 return temp;
98}
99
100template <class T>
102{
103 VecSimple<T> temp;
104 for(unsigned int i=0;i<VECL;i++) {
105 temp.insert(i, l.val[i]+r.val[i]);
106 }
107 return temp;
108}
109
110template <class T, class S>
111static ARCH_HOSTDEV inline VecSimple<T> operator + (const S l, const VecSimple<T> &r){
112 VecSimple<T> temp;
113 for(unsigned int i=0;i<VECL;i++) {
114 temp.insert(i, l+r.val[i]);
115 }
116 return temp;
117}
118
119template <class T, class S>
120static ARCH_HOSTDEV inline VecSimple<T> operator + (const VecSimple<T> &l, const S r){
121 VecSimple<T> temp;
122 for(unsigned int i=0;i<VECL;i++) {
123 temp.insert(i, l.val[i]+r);
124 }
125 return temp;
126}
127
128template <class T>
130{
131 VecSimple<T> temp;
132 for(unsigned int i=0;i<VECL;i++) {
133 temp.insert(i, -r.val[i]);
134 }
135 return temp;
136}
137
138template <class T>
140{
141 VecSimple<T> temp;
142 for(unsigned int i=0;i<VECL;i++) {
143 temp.insert(i, l.val[i]-r.val[i]);
144 }
145 return temp;
146}
147
148template <class T, class S>
149static ARCH_HOSTDEV inline VecSimple<T> operator - (const S l, const VecSimple<T> &r){
150 VecSimple<T> temp;
151 for(unsigned int i=0;i<VECL;i++) {
152 temp.insert(i, l-r.val[i]);
153 }
154 return temp;
155}
156
157template <class T, class S>
158static ARCH_HOSTDEV inline VecSimple<T> operator - (const VecSimple<T> &l, const S r){
159 VecSimple<T> temp;
160 for(unsigned int i=0;i<VECL;i++) {
161 temp.insert(i, l.val[i]-r);
162 }
163 return temp;
164}
165
166template <class T>
168{
169 VecSimple<T> temp;
170 for(unsigned int i=0;i<VECL;i++) {
171 temp.insert(i, l.val[i]*r.val[i]);
172 }
173 return temp;
174}
175
176template <class T, class S>
177static ARCH_HOSTDEV inline VecSimple<T> operator * (const VecSimple<T> &l, const S r)
178{
179 VecSimple<T> temp;
180 for(unsigned int i=0;i<VECL;i++) {
181 temp.insert(i, l.val[i]*r);
182 }
183 return temp;
184}
185
186template <class T, class S>
187static ARCH_HOSTDEV inline VecSimple<T> operator * (const S l,const VecSimple<T> &r)
188{
189 VecSimple<T> temp;
190 for(unsigned int i=0;i<VECL;i++) {
191 temp.insert(i, l*r.val[i]);
192 }
193 return temp;
194}
195
196
197
198template <class T>
200{
201 VecSimple<T> temp;
202 for(unsigned int i=0;i<VECL;i++) {
203 temp.insert(i, l.val[i]/r.val[i]);
204 }
205 return temp;
206}
207
208template <class T, class S>
209static ARCH_HOSTDEV inline VecSimple<T> operator / (const VecSimple<T> &l, const S r)
210{
211 VecSimple<T> temp;
212 for(unsigned int i=0;i<VECL;i++) {
213 temp.insert(i, l.val[i]/r);
214 }
215 return temp;
216}
217
218template <class T, class S>
219static ARCH_HOSTDEV inline VecSimple<T> operator / (const S l, const VecSimple<T> &r )
220{
221 VecSimple<T> temp;
222 for(unsigned int i=0;i<VECL;i++) {
223 temp.insert(i, l/r.val[i]);
224 }
225 return temp;
226}
227
228template <class T>
230 l=l+r;
231 return l;
232}
233
234template <class T, class S>
235static ARCH_HOSTDEV inline VecSimple<T> & operator += (VecSimple<T> &l, const S r){
236 l = l+r;
237 return l;
238}
239
240template <class T>
242 l=l*r;
243 return l;
244}
245
246template <class T, class S>
247static ARCH_HOSTDEV inline VecSimple<T> & operator *= (VecSimple<T> &l, const S r){
248 l = l*r;
249 return l;
250}
251
252template <class T>
254 l=l-r;
255 return l;
256}
257
258template <class T, class S>
259static ARCH_HOSTDEV inline VecSimple<T> & operator -= (VecSimple<T> &l, const S r){
260 l = l - r;
261 return l;
262}
263
264template <class T>
266{
267 VecSimple<bool> temp;
268 for(unsigned int i=0;i<VECL;i++) {
269 temp.insert(i, l.val[i] || r.val[i]);
270 }
271 return temp;
272}
273
274
275template <class T>
277{
278 VecSimple<bool> temp;
279 for(unsigned int i=0;i<VECL;i++) {
280 temp.insert(i, l.val[i] && r.val[i]);
281 }
282 return temp;
283}
284
285template <class T>
287{
288 VecSimple<bool> temp;
289 for(unsigned int i=0;i<VECL;i++) {
290 temp.insert(i, l.val[i] == r.val[i]);
291 }
292 return temp;
293}
294
295template <class T, class S>
296static ARCH_HOSTDEV inline VecSimple<bool> operator == (const VecSimple<T> &l, const S r)
297{
298 VecSimple<bool> temp;
299 for(unsigned int i=0;i<VECL;i++) {
300 temp.insert(i, l.val[i] == r);
301 }
302 return temp;
303}
304
305template <class T, class S>
306static ARCH_HOSTDEV inline VecSimple<bool> operator != (const VecSimple<T> &l, const S r)
307{
308 VecSimple<bool> temp;
309 for(unsigned int i=0;i<VECL;i++) {
310 temp.insert(i, l.val[i] != r);
311 }
312 return temp;
313}
314
315template <class T>
317{
318 VecSimple<bool> temp;
319 for(unsigned int i=0;i<VECL;i++) {
320 temp.insert(i, !l.val[i]);
321 }
322 return temp;
323}
324
325
326template <class T>
328{
329 VecSimple<bool> temp;
330 for(unsigned int i=0;i<VECL;i++) {
331 temp.insert(i, l.val[i] > r.val[i]);
332 }
333 return temp;
334}
335
336
337template <class T, class S>
338static ARCH_HOSTDEV inline VecSimple<bool> operator > (const VecSimple<T> &l, const S r)
339{
340 VecSimple<bool> temp;
341 for(unsigned int i=0;i<VECL;i++) {
342 temp.insert(i, l.val[i] > r);
343 }
344 return temp;
345}
346
347
348
349template <class T, class S>
350static ARCH_HOSTDEV inline VecSimple<bool> operator > (const S l,const VecSimple<T> &r)
351{
352 VecSimple<bool> temp;
353 for(unsigned int i=0;i<VECL;i++) {
354 temp.insert(i, l > r.val[i]);
355 }
356 return temp;
357}
358
359
360template <class T>
362{
363 VecSimple<bool> temp;
364 for(unsigned int i=0;i<VECL;i++) {
365 temp.insert(i, l.val[i] >= r.val[i]);
366 }
367 return temp;
368}
369
370
371template <class T, class S>
372static ARCH_HOSTDEV inline VecSimple<bool> operator >= (const VecSimple<T> &l, const S r)
373{
374 VecSimple<bool> temp;
375 for(unsigned int i=0;i<VECL;i++) {
376 temp.insert(i, l.val[i] >= r);
377 }
378 return temp;
379}
380
381
382
383template <class T, class S>
384static ARCH_HOSTDEV inline VecSimple<bool> operator >= (const S l,const VecSimple<T> &r)
385{
386 VecSimple<bool> temp;
387 for(unsigned int i=0;i<VECL;i++) {
388 temp.insert(i, l >= r.val[i]);
389 }
390 return temp;
391}
392
393
394
395template <class T>
397{
398 VecSimple<bool> temp;
399 for(unsigned int i=0;i<VECL;i++) {
400 temp.insert(i, l.val[i] < r.val[i]);
401 }
402 return temp;
403}
404
405
406template <class T, class S>
407static ARCH_HOSTDEV inline VecSimple<bool> operator < (const VecSimple<T> &l,const S r)
408{
409 VecSimple<bool> temp;
410 for(unsigned int i=0;i<VECL;i++) {
411 temp.insert(i, l.val[i] < r);
412 }
413 return temp;
414}
415
416template <class T, class S>
417static ARCH_HOSTDEV inline VecSimple<bool> operator < (const S l, const VecSimple<T> &r)
418{
419 VecSimple<bool> temp;
420 for(unsigned int i=0;i<VECL;i++) {
421 temp.insert(i, l < r.val[i]);
422 }
423 return temp;
424}
425
426
427
428template <class T>
430{
431 VecSimple<bool> temp;
432 for(unsigned int i=0;i<VECL;i++) {
433 temp.insert(i, l.val[i] <= r.val[i]);
434 }
435 return temp;
436}
437
438
439template <class T, class S>
440static ARCH_HOSTDEV inline VecSimple<bool> operator <= (const VecSimple<T> &l,const S r)
441{
442 VecSimple<bool> temp;
443 for(unsigned int i=0;i<VECL;i++) {
444 temp.insert(i, l.val[i] <= r);
445 }
446 return temp;
447}
448
449template <class T, class S>
450static ARCH_HOSTDEV inline VecSimple<bool> operator <= (const S l, const VecSimple<T> &r)
451{
452 VecSimple<bool> temp;
453 for(unsigned int i=0;i<VECL;i++) {
454 temp.insert(i, l <= r.val[i]);
455 }
456 return temp;
457}
458
459
460
461
462template <class T>
463static ARCH_HOSTDEV inline VecSimple<T> min(VecSimple<T> const & l, VecSimple<T> const & r){
464 VecSimple<T> temp;
465 for(unsigned int i=0;i<VECL;i++) {
466 temp.insert(i, l.val[i] < r.val[i] ? l.val[i] : r.val[i]);
467 }
468 return temp;
469}
470
471template <class T, class S>
472static ARCH_HOSTDEV inline VecSimple<T> min(S const l, VecSimple<T> const & r){
473 VecSimple<T> temp;
474 for(unsigned int i=0;i<VECL;i++) {
475 temp.insert(i, l < r.val[i] ? l : r.val[i]);
476 }
477 return temp;
478}
479
480template <class T>
481static ARCH_HOSTDEV inline VecSimple<T> max(VecSimple<T> const & l, VecSimple<T> const & r){
482 VecSimple<T> temp;
483 for(unsigned int i=0;i<VECL;i++) {
484 temp.insert(i, l.val[i] > r.val[i] ? l.val[i] : r.val[i]);
485 }
486 return temp;
487}
488
489
490template <class T, class S>
491static ARCH_HOSTDEV inline VecSimple<T> max(VecSimple<T> const & l, S const r){
492 VecSimple<T> temp;
493 for(unsigned int i=0;i<VECL;i++) {
494 temp.insert(i, l.val[i] > r ? l.val[i] : r);
495 }
496 return temp;
497}
498
499
500template <class T, class S>
501static ARCH_HOSTDEV inline VecSimple<T> max(S const l, VecSimple<T> const & r){
502 VecSimple<T> temp;
503 for(unsigned int i=0;i<VECL;i++) {
504 temp.insert(i, r.val[i] > l ? r.val[i] : l);
505 }
506 return temp;
507}
508
509
510
511template <class T>
512static ARCH_HOSTDEV inline VecSimple<T> select(VecSimple<bool> const & a, VecSimple<T> const & b, VecSimple<T> const & c){
513 VecSimple<T> temp;
514 for(unsigned int i=0;i<VECL;i++) {
515 temp.insert(i, a.val[i] ? b.val[i] : c.val[i]);
516 }
517 return temp;
518}
519
520
521template <class T, class S>
522static ARCH_HOSTDEV inline VecSimple<T> select(VecSimple<bool> const & a, S const b, VecSimple<T> const & c){
523 VecSimple<T> temp;
524 for(unsigned int i=0;i<VECL;i++) {
525 temp.insert(i, a.val[i] ? b : c.val[i]);
526 }
527 return temp;
528}
529
530
531template <class T, class S>
532static ARCH_HOSTDEV inline VecSimple<T> select(VecSimple<bool> const & a, VecSimple<T> const & b, S const c){
533 VecSimple<T> temp;
534 for(unsigned int i=0;i<VECL;i++) {
535 temp.insert(i, a.val[i] ? b.val[i] : c);
536 }
537 return temp;
538}
539
540
541template <class T>
542static ARCH_HOSTDEV inline VecSimple<T> select(VecSimple<bool> const & a, T const b, T const c){
543 VecSimple<T> temp;
544 for(unsigned int i=0;i<VECL;i++) {
545 temp.insert(i, a.val[i] ? b : c);
546 }
547 return temp;
548}
549
550template <class T>
551static ARCH_HOSTDEV inline bool horizontal_or(VecSimple<T> const & a){
552 bool temp = a.val[0];
553 for(unsigned int i=1;i<VECL;i++) {
554 temp = temp || a.val[i];
555 }
556 return temp;
557}
558
559template <class T>
560static ARCH_HOSTDEV inline bool horizontal_and(VecSimple<T> const & a){
561 bool temp = a.val[0];
562 for(unsigned int i=1;i<VECL;i++) {
563 temp = temp && a.val[i];
564 }
565 return temp;
566}
567
568template <class T>
569static ARCH_HOSTDEV inline T horizontal_add(VecSimple<T> const & a){
570 T temp = a.val[0];
571 for(unsigned int i=1;i<VECL;i++) {
572 temp += a.val[i];
573 }
574 return temp;
575}
576
577template <class T>
579 VecSimple<int> temp;
580 for(unsigned int i=0;i<VECL;i++) {
581 temp.insert(i, (int)a.val[i]);
582 }
583 return temp;
584}
585
586template <class T>
588 // function roundi: round to nearest integer or even.
589 //std::fesetround(FE_TONEAREST);
590 VecSimple<int> temp;
591 for(unsigned int i=0;i<VECL;i++) {
592 temp.insert(i, std::nearbyint(a.val[i]));
593 }
594 return temp;
595}
596
597template <class T>
599 VecSimple<T> temp;
600 for(unsigned int i=0;i<VECL;i++) {
601 temp.insert(i, floor(a.val[i]));
602 }
603 return temp;
604}
605
606template <class T>
609 for(unsigned int i=0;i<VECL;i++) {
610 temp.insert(i, (double)a.val[i]);
611 }
612 return temp;
613}
614
615template <class T>
617 VecSimple<float> temp;
618 for(unsigned int i=0;i<VECL;i++) {
619 temp.insert(i, (float)a.val[i]);
620 }
621 return temp;
622}
623
624
625
626
627template <typename T>
629
630template <typename T>
632{
633 for(unsigned int i=0;i<VECL;i++) {
634 val[i]=x;
635 }
636}
637
638
639
640template <typename T>
642{
643 for(unsigned int i=0;i<VECL;i++) {
644 val[i]=x.val[i];
645 }
646}
647// Member function to load from array (unaligned)
648template <typename T>
650{
651 for(unsigned int i=0;i<VECL;i++) {
652 val[i]=p[i];
653 }
654 return *this;
655}
656// Member function to load from array, aligned by 32
657template <typename T>
659{
660 return this->load(p);
661}
662template <typename T>
664{
665 val[i]=x;
666 return *this;
667}
668// Member function to store into array (unaligned)
669template <typename T>
670ARCH_HOSTDEV inline void VecSimple<T>::store(T * p) const
671{
672 for(unsigned int i=0;i<VECL;i++) {
673 p[i]=val[i];
674 }
675}
676// Member function to store into array, aligned by 32
677template <typename T>
678ARCH_HOSTDEV inline void VecSimple<T>::store_a(T * p) const
679{
680 this->store(p);
681}
682template <typename T>
684{
685 for(unsigned int i=0;i<VECL;i++) {
686 val[i]=r.val[i];
687 }
688 return *this;
689}
690template <typename T>
692{
693 return val[i];
694}
695template <typename T>
697{
698 return val[i];
699}
700template <typename T>
702{
703 for(unsigned int i=0;i<VECL;i++) {
704 val[i]++;
705 }
706 return *this;
707}
708template <typename T>
710{
711 for(unsigned int i=0;i<VECL;i++)
712 val[i]--;
713 return *this;
714}
715
716#endif
for i
Definition Dispersion.m:24
Constants c
Definition Dispersion.m:45
#define ARCH_HOSTDEV
ARCH_HOSTDEV VecSimple< T > & load(T const *p)
ARCH_HOSTDEV void store_a(T *p) const
ARCH_HOSTDEV VecSimple< T > & insert(int i, T const &x)
ARCH_HOSTDEV VecSimple< T > operator++(int)
ARCH_HOSTDEV VecSimple< T > operator--(int)
ARCH_HOSTDEV void store(T *p) const
T val[VECL] __attribute__((aligned(32)))
ARCH_HOSTDEV VecSimple< T > & load_a(T const *p)
ARCH_HOSTDEV VecSimple(std::initializer_list< T > list)
ARCH_HOSTDEV VecSimple()
ARCH_HOSTDEV T operator[](int i) const
ARCH_HOSTDEV VecSimple< T > & operator=(VecSimple< T > const &r)
static ARCH_HOSTDEV VecSimple< T > operator*(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< T > & operator+=(VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< T > min(VecSimple< T > const &l, VecSimple< T > const &r)
static ARCH_HOSTDEV VecSimple< bool > operator!=(const VecSimple< T > &l, const S r)
static ARCH_HOSTDEV bool horizontal_or(VecSimple< T > const &a)
static ARCH_HOSTDEV VecSimple< T > sqrt(const VecSimple< T > &l)
static ARCH_HOSTDEV void no_subnormals()
static ARCH_HOSTDEV VecSimple< bool > operator!(const VecSimple< T > &l)
static ARCH_HOSTDEV VecSimple< bool > operator<=(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< bool > operator<(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< T > operator+(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< int > roundi(VecSimple< T > const &a)
static ARCH_HOSTDEV VecSimple< T > max(VecSimple< T > const &l, VecSimple< T > const &r)
static ARCH_HOSTDEV VecSimple< bool > operator>=(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< T > select(VecSimple< bool > const &a, VecSimple< T > const &b, VecSimple< T > const &c)
static ARCH_HOSTDEV VecSimple< int > truncate_to_int(VecSimple< T > const &a)
static ARCH_HOSTDEV T horizontal_add(VecSimple< T > const &a)
static ARCH_HOSTDEV VecSimple< bool > operator>(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< bool > operator==(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< bool > operator&&(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< float > to_float(VecSimple< T > const &a)
static ARCH_HOSTDEV VecSimple< T > abs(const VecSimple< T > &l)
static ARCH_HOSTDEV VecSimple< T > & operator-=(VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< double > to_double(VecSimple< T > const &a)
static ARCH_HOSTDEV VecSimple< T > floor(VecSimple< T > const &a)
static ARCH_HOSTDEV VecSimple< T > & operator*=(VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< T > operator/(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< T > operator-(const VecSimple< T > &r)
static ARCH_HOSTDEV VecSimple< bool > operator||(const VecSimple< T > &l, const VecSimple< T > &r)
static ARCH_HOSTDEV bool horizontal_and(VecSimple< T > const &a)