From 377db1bc0818c0949907c254fdff6a66788f2f29 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 27 May 2026 22:24:52 -0400 Subject: [PATCH] Tensor_inner: move scalar innerProductD overloads before norm2 for ADL visibility Co-Authored-By: Claude Sonnet 4.6 --- Grid/tensors/Tensor_inner.h | 51 ++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/Grid/tensors/Tensor_inner.h b/Grid/tensors/Tensor_inner.h index 05f265d7..830d6993 100644 --- a/Grid/tensors/Tensor_inner.h +++ b/Grid/tensors/Tensor_inner.h @@ -32,6 +32,33 @@ Author: Christoph Lehner NAMESPACE_BEGIN(Grid); +////////////////////////////////////// +// innerProductD scalar overloads must be visible before norm2 is defined +////////////////////////////////////// +accelerator_inline ComplexD innerProductD(const ComplexF &l,const ComplexF &r){ return innerProduct(l,r); } +accelerator_inline ComplexD innerProductD(const ComplexD &l,const ComplexD &r){ return innerProduct(l,r); } +accelerator_inline RealD innerProductD(const RealD &l,const RealD &r){ return innerProduct(l,r); } +accelerator_inline RealD innerProductD(const RealF &l,const RealF &r){ return innerProduct(l,r); } + +accelerator_inline vComplexD innerProductD(const vComplexD &l,const vComplexD &r){ return innerProduct(l,r); } +accelerator_inline vRealD innerProductD(const vRealD &l,const vRealD &r){ return innerProduct(l,r); } +accelerator_inline vComplexD innerProductD(const vComplexF &l,const vComplexF &r) +{ + vComplexD la,lb; + vComplexD 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); +} +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); +} + /////////////////////////////////////////////////////////////////////////////////////// // innerProduct Scalar x Scalar -> Scalar // innerProduct Vector x Vector -> Scalar @@ -138,30 +165,8 @@ auto Reduce (const iScalar& lhs) -> iScalar ////////////////////////////////////// // innerProductD : if single promote to double and evaluate with sum 2x +// (scalar/vector overloads are declared above norm2 for ADL visibility) ////////////////////////////////////// -accelerator_inline ComplexD innerProductD(const ComplexF &l,const ComplexF &r){ return innerProduct(l,r); } -accelerator_inline ComplexD innerProductD(const ComplexD &l,const ComplexD &r){ return innerProduct(l,r); } -accelerator_inline RealD innerProductD(const RealD &l,const RealD &r){ return innerProduct(l,r); } -accelerator_inline RealD innerProductD(const RealF &l,const RealF &r){ return innerProduct(l,r); } - -accelerator_inline vComplexD innerProductD(const vComplexD &l,const vComplexD &r){ return innerProduct(l,r); } -accelerator_inline vRealD innerProductD(const vRealD &l,const vRealD &r){ return innerProduct(l,r); } -accelerator_inline vComplexD innerProductD(const vComplexF &l,const vComplexF &r) -{ - vComplexD la,lb; - vComplexD 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); -} -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); -} // Now do it for vector, matrix, scalar template accelerator_inline