From 429ad2a71a5d629cc7fb4062036fe03c00b38df9 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 19 Aug 2026 19:42:56 -0400 Subject: [PATCH] sComplex and lexLattice prep work --- Grid/tensors/Tensor_inner.h | 39 ++++++++++++++- Grid/tensors/Tensor_traits.h | 93 ++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 2 deletions(-) diff --git a/Grid/tensors/Tensor_inner.h b/Grid/tensors/Tensor_inner.h index 05f265d72..02dbf608a 100644 --- a/Grid/tensors/Tensor_inner.h +++ b/Grid/tensors/Tensor_inner.h @@ -155,12 +155,27 @@ accelerator_inline vComplexD innerProductD(const vComplexF &l,const vComplexF &r return innerProduct(la,ra) + innerProduct(lb,rb); } accelerator_inline vRealD innerProductD(const vRealF &l,const vRealF &r) -{ +{ vRealD la,lb; vRealD ra,rb; Optimization::PrecisionChange::StoD(l.v,la.v,lb.v); Optimization::PrecisionChange::StoD(r.v,ra.v,rb.v); - return innerProduct(la,ra) + innerProduct(lb,rb); + return innerProduct(la,ra) + innerProduct(lb,rb); +} + +accelerator_inline sComplexD innerProductD(const sComplexD &l,const sComplexD &r){ return innerProduct(l,r); } +accelerator_inline sRealD innerProductD(const sRealD &l,const sRealD &r){ return innerProduct(l,r); } +accelerator_inline sComplexD innerProductD(const sComplexF &l,const sComplexF &r) +{ + sComplexD ret; + ret.v = innerProduct(ComplexD(l.v),ComplexD(r.v)); + return ret; +} +accelerator_inline sRealD innerProductD(const sRealF &l,const sRealF &r) +{ + sRealD ret; + ret.v = innerProduct(RealD(l.v),RealD(r.v)); + return ret; } // Now do it for vector, matrix, scalar @@ -212,6 +227,26 @@ accelerator_inline RealD innerProductD2(const RealF &l,const RealF &r){ accelerator_inline vComplexD innerProductD2(const vComplexD &l,const vComplexD &r){ return innerProduct(l,r); } accelerator_inline vRealD innerProductD2(const vRealD &l,const vRealD &r){ return innerProduct(l,r); } +// Lex chart. One lane, so the promotion is not a doubling and there is no +// sComplexD2 counterpart to vComplexD2. +accelerator_inline sComplexD innerProductD2(const sComplexD &l,const sComplexD &r){ return innerProduct(l,r); } +accelerator_inline sRealD innerProductD2(const sRealD &l,const sRealD &r){ return innerProduct(l,r); } + +accelerator_inline sComplexD innerProductD2(const sComplexF &l,const sComplexF &r) +{ + sComplexD dl,dr; + precisionChange(&dl,&l,1); + precisionChange(&dr,&r,1); + return innerProduct(dl,dr); +} +accelerator_inline sRealD innerProductD2(const sRealF &l,const sRealF &r) +{ + sRealD dl,dr; + precisionChange(&dl,&l,1); + precisionChange(&dr,&r,1); + return innerProduct(dl,dr); +} + accelerator_inline vComplexD2 innerProductD2(const vComplexF &l,const vComplexF &r) { vComplexD2 dl,dr; diff --git a/Grid/tensors/Tensor_traits.h b/Grid/tensors/Tensor_traits.h index 8bfdedcff..8ac8f7e00 100644 --- a/Grid/tensors/Tensor_traits.h +++ b/Grid/tensors/Tensor_traits.h @@ -56,6 +56,10 @@ NAMESPACE_BEGIN(Grid); template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; + template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; + template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; + template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; + template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; template<> struct isGridFundamental : public std::true_type { static constexpr bool notvalue = false; }; @@ -103,6 +107,7 @@ NAMESPACE_BEGIN(Grid); typedef RealD scalar_objectD; typedef ComplexF Complexified; typedef RealF Realified; + typedef Integer Integerified; typedef RealD DoublePrecision; typedef RealD DoublePrecision2; }; @@ -116,6 +121,7 @@ NAMESPACE_BEGIN(Grid); typedef RealD scalar_objectD; typedef ComplexD Complexified; typedef RealD Realified; + typedef Integer Integerified; typedef RealD DoublePrecision; typedef RealD DoublePrecision2; }; @@ -129,6 +135,7 @@ NAMESPACE_BEGIN(Grid); typedef ComplexD scalar_objectD; typedef ComplexF Complexified; typedef RealF Realified; + typedef Integer Integerified; typedef ComplexD DoublePrecision; typedef ComplexD DoublePrecision2; }; @@ -142,6 +149,7 @@ NAMESPACE_BEGIN(Grid); typedef ComplexD scalar_objectD; typedef ComplexD Complexified; typedef RealD Realified; + typedef Integer Integerified; typedef ComplexD DoublePrecision; typedef ComplexD DoublePrecision2; }; @@ -157,6 +165,7 @@ NAMESPACE_BEGIN(Grid); typedef scalar_typeD scalar_objectD; typedef scalar_type Complexified; typedef RealF Realified; + typedef Integer Integerified; typedef scalar_typeD DoublePrecision; typedef scalar_typeD DoublePrecision2; }; @@ -170,6 +179,7 @@ NAMESPACE_BEGIN(Grid); typedef scalar_typeD scalar_objectD; typedef scalar_type Complexified; typedef RealD Realified; + typedef Integer Integerified; typedef scalar_typeD DoublePrecision; typedef scalar_typeD DoublePrecision2; }; @@ -185,6 +195,7 @@ NAMESPACE_BEGIN(Grid); typedef Integer scalar_objectD; typedef void Complexified; typedef void Realified; + typedef Integer Integerified; typedef void DoublePrecision; typedef void DoublePrecision2; }; @@ -199,6 +210,7 @@ NAMESPACE_BEGIN(Grid); typedef RealD scalar_objectD; typedef vComplexF Complexified; typedef vRealF Realified; + typedef vInteger Integerified; typedef vRealD DoublePrecision; typedef vRealD2 DoublePrecision2; }; @@ -212,6 +224,7 @@ NAMESPACE_BEGIN(Grid); typedef RealD scalar_objectD; typedef vComplexD Complexified; typedef vRealD Realified; + typedef vInteger Integerified; typedef vRealD DoublePrecision; typedef vRealD DoublePrecision2; }; @@ -225,6 +238,7 @@ NAMESPACE_BEGIN(Grid); typedef RealD scalar_objectD; typedef vComplexD2 Complexified; typedef vRealD2 Realified; + typedef vInteger Integerified; typedef vRealD2 DoublePrecision; typedef vRealD2 DoublePrecision2; }; @@ -239,6 +253,7 @@ NAMESPACE_BEGIN(Grid); typedef RealD scalar_objectD; typedef vComplexH Complexified; typedef vRealH Realified; + typedef vInteger Integerified; typedef vRealD DoublePrecision; typedef vRealD DoublePrecision2; }; @@ -253,6 +268,7 @@ NAMESPACE_BEGIN(Grid); typedef ComplexD scalar_objectD; typedef vComplexH Complexified; typedef vRealH Realified; + typedef vInteger Integerified; typedef vComplexD DoublePrecision; typedef vComplexD DoublePrecision2; }; @@ -266,6 +282,7 @@ NAMESPACE_BEGIN(Grid); typedef ComplexD scalar_objectD; typedef vComplexF Complexified; typedef vRealF Realified; + typedef vInteger Integerified; typedef vComplexD DoublePrecision; typedef vComplexD2 DoublePrecision2; }; @@ -279,6 +296,7 @@ NAMESPACE_BEGIN(Grid); typedef ComplexD scalar_objectD; typedef vComplexD Complexified; typedef vRealD Realified; + typedef vInteger Integerified; typedef vComplexD DoublePrecision; typedef vComplexD DoublePrecision2; }; @@ -292,6 +310,7 @@ NAMESPACE_BEGIN(Grid); typedef ComplexD scalar_objectD; typedef vComplexD2 Complexified; typedef vRealD2 Realified; + typedef vInteger Integerified; typedef vComplexD2 DoublePrecision; typedef vComplexD2 DoublePrecision2; }; @@ -305,6 +324,77 @@ NAMESPACE_BEGIN(Grid); typedef Integer scalar_objectD; typedef void Complexified; typedef void Realified; + typedef vInteger Integerified; + typedef void DoublePrecision; + typedef void DoublePrecision2; + }; + template<> struct GridTypeMapper : public GridTypeMapper_Base { + typedef RealF scalar_type; + typedef RealD scalar_typeD; + typedef sRealF vector_type; + typedef sRealD vector_typeD; + typedef sRealF tensor_reduced; + typedef RealF scalar_object; + typedef RealD scalar_objectD; + typedef sComplexF Complexified; + typedef sRealF Realified; + typedef sInteger Integerified; + typedef sRealD DoublePrecision; + typedef sRealD DoublePrecision2; + }; + template<> struct GridTypeMapper : public GridTypeMapper_Base { + typedef RealD scalar_type; + typedef RealD scalar_typeD; + typedef sRealD vector_type; + typedef sRealD vector_typeD; + typedef sRealD tensor_reduced; + typedef RealD scalar_object; + typedef RealD scalar_objectD; + typedef sComplexD Complexified; + typedef sRealD Realified; + typedef sInteger Integerified; + typedef sRealD DoublePrecision; + typedef sRealD DoublePrecision2; + }; + template<> struct GridTypeMapper : public GridTypeMapper_Base { + typedef ComplexF scalar_type; + typedef ComplexD scalar_typeD; + typedef sComplexF vector_type; + typedef sComplexD vector_typeD; + typedef sComplexF tensor_reduced; + typedef ComplexF scalar_object; + typedef ComplexD scalar_objectD; + typedef sComplexF Complexified; + typedef sRealF Realified; + typedef sInteger Integerified; + typedef sComplexD DoublePrecision; + typedef sComplexD DoublePrecision2; + }; + template<> struct GridTypeMapper : public GridTypeMapper_Base { + typedef ComplexD scalar_type; + typedef ComplexD scalar_typeD; + typedef sComplexD vector_type; + typedef sComplexD vector_typeD; + typedef sComplexD tensor_reduced; + typedef ComplexD scalar_object; + typedef ComplexD scalar_objectD; + typedef sComplexD Complexified; + typedef sRealD Realified; + typedef sInteger Integerified; + typedef sComplexD DoublePrecision; + typedef sComplexD DoublePrecision2; + }; + template<> struct GridTypeMapper : public GridTypeMapper_Base { + typedef Integer scalar_type; + typedef Integer scalar_typeD; + typedef sInteger vector_type; + typedef sInteger vector_typeD; + typedef sInteger tensor_reduced; + typedef Integer scalar_object; + typedef Integer scalar_objectD; + typedef void Complexified; + typedef void Realified; + typedef sInteger Integerified; typedef void DoublePrecision; typedef void DoublePrecision2; }; @@ -324,6 +414,7 @@ NAMESPACE_BEGIN(Grid); using scalar_objectD = iScalar; using Complexified = iScalar; using Realified = iScalar; + using Integerified = iScalar; using DoublePrecision = iScalar; using DoublePrecision2= iScalar; static constexpr int Rank = BaseTraits::Rank + 1; @@ -339,6 +430,7 @@ NAMESPACE_BEGIN(Grid); using scalar_objectD = iVector; using Complexified = iVector; using Realified = iVector; + using Integerified = iVector; using DoublePrecision = iVector; using DoublePrecision2= iVector; static constexpr int Rank = BaseTraits::Rank + 1; @@ -354,6 +446,7 @@ NAMESPACE_BEGIN(Grid); using scalar_objectD = iMatrix; using Complexified = iMatrix; using Realified = iMatrix; + using Integerified = iMatrix; using DoublePrecision = iMatrix; using DoublePrecision2= iMatrix; static constexpr int Rank = BaseTraits::Rank + 2;