/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: ./tests/Test_gparity.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 using namespace std; using namespace Grid; ; //typedef GparityDomainWallFermionD GparityDiracOp; //typedef DomainWallFermionD StandardDiracOp; //#define DOP_PARAMS typedef GparityMobiusFermionD GparityDiracOp; typedef MobiusFermionD StandardDiracOp; #define DOP_PARAMS ,1.5, 0.5 typedef typename GparityDiracOp::FermionField GparityFermionField; typedef typename GparityDiracOp::GaugeField GparityGaugeField; typedef typename GparityFermionField::vector_type vComplexType; typedef typename StandardDiracOp::FermionField StandardFermionField; typedef typename StandardDiracOp::GaugeField StandardGaugeField; enum{ same_vComplex = std::is_same::value }; static_assert(same_vComplex == 1, "Dirac Operators must have same underlying SIMD complex type"); int main (int argc, char ** argv) { int nu = 0; int tbc_aprd = 0; //use antiperiodic BCs in the time direction? Grid_init(&argc,&argv); for(int i=1;i> nu; std::cout << GridLogMessage << "Set Gparity direction to " << nu << std::endl; }else if(std::string(argv[i]) == "--Tbc-APRD"){ tbc_aprd = 1; std::cout << GridLogMessage << "Using antiperiodic BCs in the time direction" << std::endl; } } std::cout << GridLogMessage<< "*****************************************************************" < latt_2f(Nd,L); Coordinate latt_2f = GridDefaultLatt(); Coordinate latt_1f(latt_2f); latt_1f[nu] = 2*latt_2f[nu]; int L = latt_2f[nu]; Coordinate simd_layout = GridDefaultSimd(Nd,vComplexType::Nsimd()); std::cout << GridLogMessage << "SIMD layout: "; for(int i=0;i seeds4({1,2,3,4}); std::vector seeds5({5,6,7,8}); GridParallelRNG RNG5_2f(FGrid_2f); RNG5_2f.SeedFixedIntegers(seeds5); GridParallelRNG RNG4_2f(UGrid_2f); RNG4_2f.SeedFixedIntegers(seeds4); GparityGaugeField Umu_2f(UGrid_2f); SU::HotConfiguration(RNG4_2f,Umu_2f); StandardFermionField src (FGrid_2f); StandardFermionField tmpsrc(FGrid_2f); GparityFermionField src_2f(FGrid_2f); StandardFermionField src_1f(FGrid_1f); // Replicate fermion source random(RNG5_2f,src); PokeIndex<0>(src_2f,src,0); tmpsrc=src*2.0; PokeIndex<0>(src_2f,tmpsrc,1); StandardFermionField result_1f(FGrid_1f); result_1f=Zero(); StandardGaugeField Umu_1f(UGrid_1f); Replicate(Umu_2f,Umu_1f); //Coordinate grid for reference LatticeInteger xcoor_1f(UGrid_1f); LatticeCoordinate(xcoor_1f,nu); //Copy-conjugate the gauge field //First C-shift the lattice by Lx/2 { StandardGaugeField Umu_shift = conjugate( Cshift(Umu_1f,nu,L) ); Umu_1f = where( xcoor_1f >= Integer(L), Umu_shift, Umu_1f ); // hack test to check the same Replicate(Umu_2f,Umu_shift); Umu_shift=Umu_shift-Umu_1f; cout << GridLogMessage << "Umu diff " << norm2(Umu_shift)<(Umu_1f,nu)) Unu(UGrid_1f); Unu = PeekIndex(Umu_1f,nu); Unu = where(xcoor_1f == Integer(2*L-1), -Unu, Unu); PokeIndex(Umu_1f,Unu,nu); } //Coordinate grid for reference LatticeInteger xcoor_1f5(FGrid_1f); LatticeCoordinate(xcoor_1f5,1+nu); Replicate(src,src_1f); src_1f = where( xcoor_1f5 >= Integer(L), 2.0*src_1f,src_1f ); RealD mass=0.0; RealD M5=1.8; //Standard Dirac op AcceleratorVector bc_std(Nd, 1.0); if(tbc_aprd) bc_std[Nd-1] = -1.; //antiperiodic time BC StandardDiracOp::ImplParams std_params(bc_std); StandardDiracOp Ddwf(Umu_1f,*FGrid_1f,*FrbGrid_1f,*UGrid_1f,*UrbGrid_1f,mass,M5 DOP_PARAMS, std_params); StandardFermionField src_o_1f(FrbGrid_1f); StandardFermionField result_o_1f(FrbGrid_1f); pickCheckerboard(Odd,src_o_1f,src_1f); result_o_1f=Zero(); SchurDiagMooeeOperator HermOpEO(Ddwf); ConjugateGradient CG(1.0e-8,10000); CG(HermOpEO,src_o_1f,result_o_1f); //Gparity Dirac op std::vector twists(Nd,0); twists[nu] = 1; if(tbc_aprd) twists[Nd-1] = 1; GparityDiracOp::ImplParams params; params.twists = twists; GparityDiracOp GPDdwf(Umu_2f,*FGrid_2f,*FrbGrid_2f,*UGrid_2f,*UrbGrid_2f,mass,M5 DOP_PARAMS,params); for(int disp=-1;disp<=1;disp+=2) for(int mu=0;mu<5;mu++) { GparityFermionField Dsrc_2f(FGrid_2f); StandardFermionField Dsrc_1f(FGrid_1f); StandardFermionField Dsrc_2freplica(FGrid_1f); StandardFermionField Dsrc_2freplica0(FGrid_1f); StandardFermionField Dsrc_2freplica1(FGrid_1f); if ( mu ==0 ) { std::cout << GridLogMessage<< " Cross checking entire hopping term"<(Dsrc_2f,0); StandardFermionField Dsrc_2f1(FGrid_2f); Dsrc_2f1 = PeekIndex<0>(Dsrc_2f,1); // Dsrc_2f1 = Dsrc_2f1 - Dsrc_2f0; // std::cout << GridLogMessage << " Cross check two halves " <= Integer(L), Dsrc_2freplica1,Dsrc_2freplica0 ); Dsrc_2freplica = Dsrc_2freplica - Dsrc_1f ; std::cout << GridLogMessage << " Cross check against doubled latt " < CG2f(1.0e-8,10000); SchurDiagMooeeOperator HermOpEO2f(GPDdwf); CG2f(HermOpEO2f,src_o_2f,result_o_2f); std::cout << "2f cb "<(result_o_2f,0); //flavor 0, odd cb res1o = PeekIndex<0>(result_o_2f,1); //flavor 1, odd cb std::cout << "res cb "<= Integer(L), replica1,replica0 ); replica0 = Zero(); setCheckerboard(replica0,result_o_1f); std::cout << "Norm2 solutions 1f reconstructed from 2f: " <