#ifndef GRID_LATTICE_REDUCTION_H #define GRID_LATTICE_REDUCTION_H namespace Grid { //////////////////////////////////////////////////////////////////////////////////////////////////// // Reduction operations //////////////////////////////////////////////////////////////////////////////////////////////////// template inline RealD norm2(const Lattice &arg){ typedef typename vobj::scalar_type scalar; typedef typename vobj::vector_type vector; decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; scalar nrm; //FIXME make this loop parallelisable vnrm=zero; for(int ss=0;ssoSites(); ss++){ vnrm = vnrm + innerProduct(arg._odata[ss],arg._odata[ss]); } vector vvnrm =TensorRemove(vnrm) ; nrm = Reduce(vvnrm); arg._grid->GlobalSum(nrm); return real(nrm); } template inline auto innerProduct(const Lattice &left,const Lattice &right) ->decltype(innerProduct(left._odata[0],right._odata[0])) { typedef typename vobj::scalar_type scalar; decltype(innerProduct(left._odata[0],right._odata[0])) vnrm=zero; scalar nrm; //FIXME make this loop parallelisable for(int ss=0;ssoSites(); ss++){ vnrm = vnrm + innerProduct(left._odata[ss],right._odata[ss]); } nrm = Reduce(vnrm); right._grid->GlobalSum(nrm); return nrm; } template inline typename vobj::scalar_object sum(const Lattice &arg){ GridBase *grid=arg._grid; int Nsimd = grid->Nsimd(); typedef typename vobj::scalar_object sobj; typedef typename vobj::scalar_type scalar_type; vobj vsum; sobj ssum; vsum=zero; ssum=zero; for(int ss=0;ssoSites(); ss++){ vsum = vsum + arg._odata[ss]; } std::vector buf(Nsimd); std::vector pointers(Nsimd); for(int i=0;iGlobalSum(ssum); return ssum; } } #endif