diff --git a/tests/Test_general_stencil.cc b/tests/Test_general_stencil.cc new file mode 100644 index 00000000..418cd61f --- /dev/null +++ b/tests/Test_general_stencil.cc @@ -0,0 +1,163 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_stencil.cc + + Copyright (C) 2015 + +Author: Peter Boyle +Author: Peter Boyle +Author: paboyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include +#include + +using namespace std; +using namespace Grid; + +int main(int argc, char ** argv) +{ + Grid_init(&argc, &argv); + + // typedef LatticeColourMatrix Field; + typedef LatticeComplex Field; + typedef typename Field::vector_object vobj; + typedef typename vobj::scalar_object sobj; + + auto latt_size = GridDefaultLatt(); + auto simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); + auto mpi_layout = GridDefaultMpi(); + + double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; + + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian rbFine(&Fine); + GridParallelRNG fRNG(&Fine); + + // fRNG.SeedFixedIntegers(std::vector({45,12,81,9}); + std::vector seeds({1,2,3,4}); + fRNG.SeedFixedIntegers(seeds); + + Field Foo(&Fine); + Field Bar(&Fine); + Field Check(&Fine); + Field Diff(&Fine); + LatticeComplex lex(&Fine); + + lex = Zero(); + random(fRNG,Foo); + gaussian(fRNG,Bar); + + for (int i=0;i shifts(1,shift); + GeneralLocalStencil gStencil(&Fine,shifts); + + Bar = Cshift(Foo,dir1,disp1); + Bar = Cshift(Bar,dir2,disp2); + + // Implement a stencil code that should agree with cshift! + for(int i=0;ioSites();i++){ + int permute_type; + auto SE = gStencil.GetEntry(0,i); + auto check = Check.View(); + auto foo = Foo.View(); + + // Encapsulate in a general wrapper + check[i] = foo[SE->_offset]; auto tmp=check[i]; + if (SE->_permute & 0x1 ) { permute(check[i],tmp,0); tmp=check[i];} + if (SE->_permute & 0x2 ) { permute(check[i],tmp,1); tmp=check[i];} + if (SE->_permute & 0x4 ) { permute(check[i],tmp,2); tmp=check[i];} + if (SE->_permute & 0x8 ) { permute(check[i],tmp,3); tmp=check[i];} + } + + Real nrmC = norm2(Check); + Real nrmB = norm2(Bar); + Diff = Check-Bar; + Real nrm = norm2(Diff); + std::cout< 0){ + std::cout <<"Coor (" << coor[0]<<","< 1.0e-4) { + auto check = Check.View(); + auto bar = Bar.View(); + for(int i=0;i 1.0e-4) exit(-1); + + }} + } + }} + Grid_finalize(); +}