25#ifdef GRID_WARN_SUBOPTIMAL
26#warning "Optimisation alert all these reduction loops are NOT threaded "
34 typedef typename vobj::scalar_object sobj;
35 typedef typename vobj::vector_type vector_type;
52 int ostride=FullGrid->
_ostride[Orthog];
58 std::vector<vobj> s_x(Nblock);
60 thread_loop_collapse2( (
int n=0;n<nblock;n++),{
61 for(
int b=0;b<block;b++){
64 for(
int i=0;i<Nblock;i++){
65 s_x[i] = X_v[o+i*ostride];
69 for(
int i=0;i<Nblock;i++){
70 dot = Y_v[o+i*ostride];
71 for(
int j=0;j<Nblock;j++){
72 dot = dot + s_x[j]*(scale*aa(j,i));
83 typedef typename vobj::scalar_object sobj;
84 typedef typename vobj::vector_type vector_type;
96 int ostride=FullGrid->
_ostride[Orthog];
103 std::vector<vobj> s_x(Nblock);
105 thread_loop_collapse2( (
int n=0;n<nblock;n++),{
106 for(
int b=0;b<block;b++){
107 int o = n*stride + b;
109 for(
int i=0;i<Nblock;i++){
110 s_x[i] = X_v[o+i*ostride];
114 for(
int i=0;i<Nblock;i++){
115 dot = s_x[0]*(scale*aa(0,i));
116 for(
int j=1;j<Nblock;j++){
117 dot = dot + s_x[j]*(scale*aa(j,i));
119 R_v[o+i*ostride]=dot;
130 typedef typename vobj::scalar_object sobj;
131 typedef typename vobj::vector_type vector_type;
141 mat = Eigen::MatrixXcd::Zero(Nblock,Nblock);
153 int ostride=FullGrid->
_ostride[Orthog];
155 typedef typename vobj::vector_typeD vector_typeD;
159 std::vector<vobj> Left(Nblock);
160 std::vector<vobj> Right(Nblock);
161 Eigen::MatrixXcd mat_thread = Eigen::MatrixXcd::Zero(Nblock,Nblock);
163 thread_loop_collapse2((
int n=0;n<nblock;n++),{
164 for(
int b=0;b<block;b++){
166 int o = n*stride + b;
168 for(
int i=0;i<Nblock;i++){
169 Left [i] = lhs_v[o+i*ostride];
170 Right[i] = rhs_v[o+i*ostride];
173 for(
int i=0;i<Nblock;i++){
174 for(
int j=0;j<Nblock;j++){
178 mat_thread(i,j) += std::complex<double>(
real(z),
imag(z));
186 for(
int i=0;i<Nblock;i++){
187 for(
int j=0;j<Nblock;j++){
static void sliceMulMatrix(Lattice< vobj > &R, Eigen::MatrixXcd &aa, const Lattice< vobj > &X, int Orthog, RealD scale=1.0)
static void sliceMaddMatrix(Lattice< vobj > &R, Eigen::MatrixXcd &aa, const Lattice< vobj > &X, const Lattice< vobj > &Y, int Orthog, RealD scale=1.0)
static void sliceInnerProductMatrix(Eigen::MatrixXcd &mat, const Lattice< vobj > &lhs, const Lattice< vobj > &rhs, int Orthog)
Lattice< vobj > real(const Lattice< vobj > &lhs)
Lattice< vobj > imag(const Lattice< vobj > &lhs)
ComplexD innerProduct(const Lattice< vobj > &left, const Lattice< vobj > &right)
vobj::scalar_object sum(const vobj *arg, Integer osites)
#define autoView(l_v, l, mode)
#define NAMESPACE_BEGIN(A)
std::complex< RealD > ComplexD
accelerator_inline ComplexD Reduce(const ComplexD &r)
accelerator_inline std::enable_if<!isGridTensor< T >::value, T >::type TensorRemove(T arg)
const Coordinate & GlobalDimensions(void)
GridBase * Grid(void) const