From e89bd8f150c261357a0e6896c7eb5ed9bfb56332 Mon Sep 17 00:00:00 2001 From: Alejandro Gallo Date: Wed, 9 Feb 2022 19:35:00 +0100 Subject: [PATCH] Add correct conjugate templated function --- atrip.org | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/atrip.org b/atrip.org index 8e4ec91..32b0b89 100644 --- a/atrip.org +++ b/atrip.org @@ -21,6 +21,9 @@ The algorithm uses two main data types, the =Slice= and the namespace atrip { +template FF maybeConjugate(const FF a) { return a; } +template <> Complex maybeConjugate(const Complex a) { return std::conj(a); } + namespace traits { template bool isComplex() { return false; }; template <> bool isComplex() { return true; }; @@ -1521,12 +1524,12 @@ namespace atrip { , X(Zijk_[j + No*k + No*No*i]) , Y(Zijk_[k + No*i + No*No*j]) , Z(Zijk_[k + No*j + No*No*i]) - , A(std::conj(Tijk_[i + No*j + No*No*k])) - , B(std::conj(Tijk_[i + No*k + No*No*j])) - , C(std::conj(Tijk_[j + No*i + No*No*k])) - , D(std::conj(Tijk_[j + No*k + No*No*i])) - , E(std::conj(Tijk_[k + No*i + No*No*j])) - , F(std::conj(Tijk_[k + No*j + No*No*i])) + , A(maybeConjugate(Tijk_[i + No*j + No*No*k])) + , B(maybeConjugate(Tijk_[i + No*k + No*No*j])) + , C(maybeConjugate(Tijk_[j + No*i + No*No*k])) + , D(maybeConjugate(Tijk_[j + No*k + No*No*i])) + , E(maybeConjugate(Tijk_[k + No*i + No*No*j])) + , F(maybeConjugate(Tijk_[k + No*j + No*No*i])) , value = 3.0 * ( A * U + B * V @@ -1583,9 +1586,9 @@ namespace atrip { , U(Zijk_[i + No*j + No*No*k]) , V(Zijk_[j + No*k + No*No*i]) , W(Zijk_[k + No*i + No*No*j]) - , A(std::conj(Tijk_[i + No*j + No*No*k])) - , B(std::conj(Tijk_[j + No*k + No*No*i])) - , C(std::conj(Tijk_[k + No*i + No*No*j])) + , A(maybeConjugate(Tijk_[i + No*j + No*No*k])) + , B(maybeConjugate(Tijk_[j + No*k + No*No*i])) + , C(maybeConjugate(Tijk_[k + No*i + No*No*j])) , value = F(3.0) * ( A * U + B * V @@ -1701,14 +1704,9 @@ namespace atrip { , _t_buffer.data() \ , (int const*)&NoNo \ ); - #define MAYBE_CONJ(_conj, _buffer) \ - if (traits::isComplex()) { \ - for (size_t __i = 0; __i < NoNoNo; ++__i) \ - _conj[__i] = std::conj(_buffer[__i]); \ - } else { \ - for (size_t __i = 0; __i < NoNoNo; ++__i) \ - _conj[__i] = _buffer[__i]; \ - } + #define MAYBE_CONJ(_conj, _buffer) \ + for (size_t __i = 0; __i < NoNoNo; ++__i) \ + _conj[__i] = maybeConjugate(_buffer[__i]); \ const size_t NoNoNo = No*NoNo; std::vector _t_buffer; @@ -2259,11 +2257,12 @@ Atrip::Output Atrip::run(Atrip::Input const& in) { const double doublesFlops = double(No) - ,* double(No) - ,* double(No) - ,* (double(No) + double(Nv)) - ,* 2 - ,* 6 + * double(No) + * double(No) + * (double(No) + double(Nv)) + * 1 + * (traits::isComplex() ? 2.0 : 1.0) + * 6 / 1e9 ;