#ifndef _MULT_IMPL #define _MULT_IMPL #include //Options for _mult_impl: //MULT_IMPL_BASIC :not using any external libraries //MULT_IMPL_BLOCK_BASIC :blocked matrix implementation without external libraries //MULT_IMPL_GSL :blocked matrix implementation using GSL BLAS (and I think other BLAS can be slotted in by linking to the appropriate libraries) //MULT_IMPL_GRID :using Grid library SIMD intrinsics with a hand-crafted wrapper #define MULT_IMPL_GSL //#define MULT_IMPL_GRID #if defined(MULT_IMPL_BASIC) # include #elif defined(MULT_IMPL_BLOCK_BASIC) # include #elif defined(MULT_IMPL_GSL) # include #elif defined(MULT_IMPL_GRID) # include #else # error Must specify a MULT_IMPL_* in alg/a2a/mult_impl.h #endif //Matrix product of meson field pairs //out(t1,t4) = l(t1,t2) * r(t3,t4) (The stored timeslices are only used to unpack TimePackedIndex so it doesn't matter if t2 and t3 are thrown away; their indices are contracted over hence the times are not needed) template class lA2AfieldL, template class lA2AfieldR, template class rA2AfieldL, template class rA2AfieldR > void mult(A2AmesonField &out, const A2AmesonField &l, const A2AmesonField &r, const bool node_local){ _mult_impl::mult(out,l,r, node_local); } #endif