mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Conjugate coefficients on adjoint
This commit is contained in:
		@@ -48,17 +48,18 @@ void CayleyFermion5D<Impl>::M5D(const FermionField &psi,
 | 
			
		||||
				std::vector<Coeff_t> &diag,
 | 
			
		||||
				std::vector<Coeff_t> &upper)
 | 
			
		||||
{
 | 
			
		||||
  Coeff_t one(1.0);
 | 
			
		||||
  int Ls=this->Ls;
 | 
			
		||||
  for(int s=0;s<Ls;s++){
 | 
			
		||||
    if ( s==0 ) {
 | 
			
		||||
      axpby_ssp_pminus(chi,diag[s],phi,upper[s],psi,s,s+1);
 | 
			
		||||
      axpby_ssp_pplus (chi,1.0,chi,lower[s],psi,s,Ls-1);
 | 
			
		||||
      axpby_ssp_pplus (chi,one,chi,lower[s],psi,s,Ls-1);
 | 
			
		||||
    } else if ( s==(Ls-1)) { 
 | 
			
		||||
      axpby_ssp_pminus(chi,diag[s],phi,upper[s],psi,s,0);
 | 
			
		||||
      axpby_ssp_pplus (chi,1.0,chi,lower[s],psi,s,s-1);
 | 
			
		||||
      axpby_ssp_pplus (chi,one,chi,lower[s],psi,s,s-1);
 | 
			
		||||
    } else {
 | 
			
		||||
      axpby_ssp_pminus(chi,diag[s],phi,upper[s],psi,s,s+1);
 | 
			
		||||
      axpby_ssp_pplus(chi,1.0,chi,lower[s],psi,s,s-1);
 | 
			
		||||
      axpby_ssp_pplus(chi,one,chi,lower[s],psi,s,s-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -70,17 +71,18 @@ void CayleyFermion5D<Impl>::M5Ddag(const FermionField &psi,
 | 
			
		||||
				   std::vector<Coeff_t> &diag,
 | 
			
		||||
				   std::vector<Coeff_t> &upper)
 | 
			
		||||
{
 | 
			
		||||
  Coeff_t one(1.0);
 | 
			
		||||
  int Ls=this->Ls;
 | 
			
		||||
  for(int s=0;s<Ls;s++){
 | 
			
		||||
    if ( s==0 ) {
 | 
			
		||||
      axpby_ssp_pplus (chi,diag[s],phi,upper[s],psi,s,s+1);
 | 
			
		||||
      axpby_ssp_pminus(chi,1.0,chi,lower[s],psi,s,Ls-1);
 | 
			
		||||
      axpby_ssp_pminus(chi,one,chi,lower[s],psi,s,Ls-1);
 | 
			
		||||
    } else if ( s==(Ls-1)) { 
 | 
			
		||||
      axpby_ssp_pplus (chi,diag[s],phi,upper[s],psi,s,0);
 | 
			
		||||
      axpby_ssp_pminus(chi,1.0,chi,lower[s],psi,s,s-1);
 | 
			
		||||
      axpby_ssp_pminus(chi,one,chi,lower[s],psi,s,s-1);
 | 
			
		||||
    } else {
 | 
			
		||||
      axpby_ssp_pplus (chi,diag[s],phi,upper[s],psi,s,s+1);
 | 
			
		||||
      axpby_ssp_pminus(chi,1.0,chi,lower[s],psi,s,s-1);
 | 
			
		||||
      axpby_ssp_pminus(chi,one,chi,lower[s],psi,s,s-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -88,62 +90,68 @@ void CayleyFermion5D<Impl>::M5Ddag(const FermionField &psi,
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void CayleyFermion5D<Impl>::MooeeInv    (const FermionField &psi, FermionField &chi)
 | 
			
		||||
{
 | 
			
		||||
  Coeff_t one(1.0);
 | 
			
		||||
  Coeff_t czero(0.0);
 | 
			
		||||
  chi.checkerboard=psi.checkerboard;
 | 
			
		||||
  int Ls=this->Ls;
 | 
			
		||||
  // Apply (L^{\prime})^{-1}
 | 
			
		||||
  axpby_ssp (chi,1.0,psi,     0.0,psi,0,0);      // chi[0]=psi[0]
 | 
			
		||||
  axpby_ssp (chi,one,psi,     czero,psi,0,0);      // chi[0]=psi[0]
 | 
			
		||||
  for (int s=1;s<Ls;s++){
 | 
			
		||||
    axpby_ssp_pplus(chi,1.0,psi,-lee[s-1],chi,s,s-1);// recursion Psi[s] -lee P_+ chi[s-1]
 | 
			
		||||
    axpby_ssp_pplus(chi,one,psi,-lee[s-1],chi,s,s-1);// recursion Psi[s] -lee P_+ chi[s-1]
 | 
			
		||||
  }
 | 
			
		||||
  // L_m^{-1} 
 | 
			
		||||
  for (int s=0;s<Ls-1;s++){ // Chi[ee] = 1 - sum[s<Ls-1] -leem[s]P_- chi
 | 
			
		||||
    axpby_ssp_pminus(chi,1.0,chi,-leem[s],chi,Ls-1,s);
 | 
			
		||||
    axpby_ssp_pminus(chi,one,chi,-leem[s],chi,Ls-1,s);
 | 
			
		||||
  }
 | 
			
		||||
  // U_m^{-1} D^{-1}
 | 
			
		||||
  for (int s=0;s<Ls-1;s++){
 | 
			
		||||
    // Chi[s] + 1/d chi[s] 
 | 
			
		||||
    axpby_ssp_pplus(chi,1.0/dee[s],chi,-ueem[s]/dee[Ls-1],chi,s,Ls-1);
 | 
			
		||||
    axpby_ssp_pplus(chi,one/dee[s],chi,-ueem[s]/dee[Ls-1],chi,s,Ls-1);
 | 
			
		||||
  }	
 | 
			
		||||
  axpby_ssp(chi,1.0/dee[Ls-1],chi,0.0,chi,Ls-1,Ls-1); // Modest avoidable 
 | 
			
		||||
  axpby_ssp(chi,one/dee[Ls-1],chi,czero,chi,Ls-1,Ls-1); // Modest avoidable 
 | 
			
		||||
  
 | 
			
		||||
  // Apply U^{-1}
 | 
			
		||||
  for (int s=Ls-2;s>=0;s--){
 | 
			
		||||
    axpby_ssp_pminus (chi,1.0,chi,-uee[s],chi,s,s+1);  // chi[Ls]
 | 
			
		||||
    axpby_ssp_pminus (chi,one,chi,-uee[s],chi,s,s+1);  // chi[Ls]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void CayleyFermion5D<Impl>::MooeeInvDag (const FermionField &psi, FermionField &chi)
 | 
			
		||||
{
 | 
			
		||||
  Coeff_t one(1.0);
 | 
			
		||||
  Coeff_t czero(0.0);
 | 
			
		||||
  chi.checkerboard=psi.checkerboard;
 | 
			
		||||
  int Ls=this->Ls;
 | 
			
		||||
  // Apply (U^{\prime})^{-dagger}
 | 
			
		||||
  axpby_ssp (chi,1.0,psi,     0.0,psi,0,0);      // chi[0]=psi[0]
 | 
			
		||||
  axpby_ssp (chi,one,psi,     czero,psi,0,0);      // chi[0]=psi[0]
 | 
			
		||||
  for (int s=1;s<Ls;s++){
 | 
			
		||||
    axpby_ssp_pminus(chi,1.0,psi,-uee[s-1],chi,s,s-1);
 | 
			
		||||
    axpby_ssp_pminus(chi,one,psi,-conjugate(uee[s-1]),chi,s,s-1);
 | 
			
		||||
  }
 | 
			
		||||
  // U_m^{-\dagger} 
 | 
			
		||||
  for (int s=0;s<Ls-1;s++){
 | 
			
		||||
    axpby_ssp_pplus(chi,1.0,chi,-ueem[s],chi,Ls-1,s);
 | 
			
		||||
    axpby_ssp_pplus(chi,one,chi,-conjugate(ueem[s]),chi,Ls-1,s);
 | 
			
		||||
  }
 | 
			
		||||
  // L_m^{-\dagger} D^{-dagger}
 | 
			
		||||
  for (int s=0;s<Ls-1;s++){
 | 
			
		||||
    axpby_ssp_pminus(chi,1.0/dee[s],chi,-leem[s]/dee[Ls-1],chi,s,Ls-1);
 | 
			
		||||
    axpby_ssp_pminus(chi,one/conjugate(dee[s]),chi,-conjugate(leem[s]/dee[Ls-1]),chi,s,Ls-1);
 | 
			
		||||
  }	
 | 
			
		||||
  axpby_ssp(chi,1.0/dee[Ls-1],chi,0.0,chi,Ls-1,Ls-1); // Modest avoidable 
 | 
			
		||||
  axpby_ssp(chi,one/conjugate(dee[Ls-1]),chi,czero,chi,Ls-1,Ls-1); // Modest avoidable 
 | 
			
		||||
  
 | 
			
		||||
  // Apply L^{-dagger}
 | 
			
		||||
  for (int s=Ls-2;s>=0;s--){
 | 
			
		||||
    axpby_ssp_pplus (chi,1.0,chi,-lee[s],chi,s,s+1);  // chi[Ls]
 | 
			
		||||
    axpby_ssp_pplus (chi,one,chi,-conjugate(lee[s]),chi,s,s+1);  // chi[Ls]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef CAYLEY_DPERP_LINALG
 | 
			
		||||
  INSTANTIATE(WilsonImplF);
 | 
			
		||||
  INSTANTIATE(WilsonImplD);
 | 
			
		||||
  INSTANTIATE(GparityWilsonImplF);
 | 
			
		||||
  INSTANTIATE(GparityWilsonImplD);
 | 
			
		||||
  INSTANTIATE_DPERP(WilsonImplF);
 | 
			
		||||
  INSTANTIATE_DPERP(WilsonImplD);
 | 
			
		||||
  INSTANTIATE_DPERP(GparityWilsonImplF);
 | 
			
		||||
  INSTANTIATE_DPERP(GparityWilsonImplD);
 | 
			
		||||
  INSTANTIATE_DPERP(ZWilsonImplF);
 | 
			
		||||
  INSTANTIATE_DPERP(ZWilsonImplD);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user