#ifndef GRID_ALGORITHM_COARSENED_MATRIX_H #define GRID_ALGORITHM_COARSENED_MATRIX_H #include namespace Grid { class Geometry { public: int npoint; int dimension; std::vector directions ; std::vector displacements; Geometry(int _d) : dimension(_d), npoint(2*_d+1), directions(npoint), displacements(npoint) { for(int d=0;d GetDelta(int point) { std::vector delta(dimension,0); delta[directions[point]] = displacements[point]; return delta; }; }; // Fine Object == (per site) type of fine field // nbasis == number of deflation vectors template class CoarsenedMatrix : public SparseMatrixBase > > { public: typedef iVector siteVector; typedef Lattice > CoarseVector; typedef Lattice > CoarseMatrix; typedef Lattice< CComplex > CoarseScalar; // used for inner products on fine field typedef Lattice FineField; //////////////////// // Data members //////////////////// Geometry geom; GridBase * _grid; CartesianStencil Stencil; std::vector A; std::vector > comm_buf; /////////////////////// // Interface /////////////////////// GridBase * Grid(void) { return _grid; }; // this is all the linalg routines need to know RealD M (const CoarseVector &in, CoarseVector &out){ SimpleCompressor compressor; Stencil.HaloExchange(in,comm_buf,compressor); //PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ siteVector res = zero; siteVector tmp; siteVector nbr; int offset,local,perm; for(int point=0;point > &linop,std::vector > & subspace){ FineField phi(FineGrid); FineField Mphi(FineGrid); CoarseVector Proj(Grid()); CoarseScalar InnerProd(Grid()); // Orthogonalise the subblocks over the basis blockOrthogonalise(InnerProd,subspace); // Compute the matrix elements of linop between this orthonormal // set of vectors. for(int i=0;ioSites();ss++){ for(int j=0;j