#ifndef GRID_VECTOR_UNOPS #define GRID_VECTOR_UNOPS namespace Grid { template struct SqrtRealFunctor { scalar operator()(const scalar &a) const { return sqrt(real(a)); } }; template struct RSqrtRealFunctor { scalar operator()(const scalar &a) const { return scalar(1.0/sqrt(real(a))); } }; template struct CosRealFunctor { scalar operator()(const scalar &a) const { return cos(real(a)); } }; template struct SinRealFunctor { scalar operator()(const scalar &a) const { return sin(real(a)); } }; template struct PowRealFunctor { double y; PowRealFunctor(double _y) : y(_y) {}; scalar operator()(const scalar &a) const { return pow(real(a),y); } }; template struct ModIntFunctor { Integer y; ModIntFunctor(Integer _y) : y(_y) {}; scalar operator()(const scalar &a) const { return Integer(a)%y; } }; template < class S, class V > inline Grid_simd sqrt(const Grid_simd &r) { return SimdApply(SqrtRealFunctor(),r); } template < class S, class V > inline Grid_simd rsqrt(const Grid_simd &r) { return SimdApply(RSqrtRealFunctor(),r); } template < class S, class V > inline Grid_simd cos(const Grid_simd &r) { return SimdApply(CosRealFunctor(),r); } template < class S, class V > inline Grid_simd sin(const Grid_simd &r) { return SimdApply(CosRealFunctor(),r); } template < class S, class V > inline Grid_simd pow(const Grid_simd &r,double y) { return SimdApply(PowRealFunctor(y),r); } template < class S, class V > inline Grid_simd mod(const Grid_simd &r,Integer y) { return SimdApply(ModIntFunctor(y),r); } } #endif