mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	MILC Interface
This commit is contained in:
		@@ -84,15 +84,6 @@ ImprovedStaggeredFermion<Impl>::ImprovedStaggeredFermion(GaugeField &_Uthin, Gau
 | 
			
		||||
{
 | 
			
		||||
  ImportGauge(_Uthin,_Ufat);
 | 
			
		||||
}
 | 
			
		||||
template <class Impl>
 | 
			
		||||
ImprovedStaggeredFermion<Impl>::ImprovedStaggeredFermion(GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid,
 | 
			
		||||
							 GridRedBlackCartesian &Hgrid, RealD _mass,
 | 
			
		||||
							 const ImplParams &p)
 | 
			
		||||
  : ImprovedStaggeredFermion(Fgrid,Hgrid,_mass,1.0,1.0,1.0,p)
 | 
			
		||||
{
 | 
			
		||||
  ImportGaugeSimple(_Utriple,_Ufat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////////////////////////////
 | 
			
		||||
  // Momentum space propagator should be 
 | 
			
		||||
@@ -106,11 +97,6 @@ ImprovedStaggeredFermion<Impl>::ImprovedStaggeredFermion(GaugeField &_Utriple, G
 | 
			
		||||
  // of above link to implmement fourier based solver.
 | 
			
		||||
  ////////////////////////////////////////////////////////////
 | 
			
		||||
template <class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion<Impl>::ImportGauge(const GaugeField &_Uthin) 
 | 
			
		||||
{
 | 
			
		||||
  ImportGauge(_Uthin,_Uthin);
 | 
			
		||||
};
 | 
			
		||||
template <class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion<Impl>::ImportGaugeSimple(const GaugeField &_Utriple,const GaugeField &_Ufat) 
 | 
			
		||||
{
 | 
			
		||||
  /////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -133,6 +119,20 @@ void ImprovedStaggeredFermion<Impl>::ImportGaugeSimple(const GaugeField &_Utripl
 | 
			
		||||
    PokeIndex<LorentzIndex>(Umu, -U, mu+4);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  CopyGaugeCheckerboards();
 | 
			
		||||
}
 | 
			
		||||
template <class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion<Impl>::ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U) 
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  Umu   = _U;
 | 
			
		||||
  UUUmu = _UUU;
 | 
			
		||||
  CopyGaugeCheckerboards();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion<Impl>::CopyGaugeCheckerboards(void)
 | 
			
		||||
{
 | 
			
		||||
  pickCheckerboard(Even, UmuEven,  Umu);
 | 
			
		||||
  pickCheckerboard(Odd,  UmuOdd ,  Umu);
 | 
			
		||||
  pickCheckerboard(Even, UUUmuEven,UUUmu);
 | 
			
		||||
@@ -168,10 +168,7 @@ void ImprovedStaggeredFermion<Impl>::ImportGauge(const GaugeField &_Uthin,const
 | 
			
		||||
    PokeIndex<LorentzIndex>(UUUmu, U*(-0.5*c2/u0/u0/u0), mu+4);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even, UmuEven, Umu);
 | 
			
		||||
  pickCheckerboard(Odd,  UmuOdd , Umu);
 | 
			
		||||
  pickCheckerboard(Even, UUUmuEven, UUUmu);
 | 
			
		||||
  pickCheckerboard(Odd,   UUUmuOdd, UUUmu);
 | 
			
		||||
  CopyGaugeCheckerboards();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
@@ -110,30 +110,29 @@ class ImprovedStaggeredFermion : public StaggeredKernels<Impl>, public ImprovedS
 | 
			
		||||
  void DhopInternalOverlappedComms(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,DoubledGaugeField &UUU,
 | 
			
		||||
                    const FermionField &in, FermionField &out, int dag);
 | 
			
		||||
 | 
			
		||||
  // Constructor
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Grid own interface Constructor
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  ImprovedStaggeredFermion(GaugeField &_Uthin, GaugeField &_Ufat, GridCartesian &Fgrid,
 | 
			
		||||
			   GridRedBlackCartesian &Hgrid, RealD _mass,
 | 
			
		||||
			   RealD _c1, RealD _c2,RealD _u0,
 | 
			
		||||
			   const ImplParams &p = ImplParams());
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // MILC constructor no coefficients; premultiply links by desired scaling
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  ImprovedStaggeredFermion(GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid,
 | 
			
		||||
			   GridRedBlackCartesian &Hgrid, RealD _mass,
 | 
			
		||||
			   const ImplParams &p = ImplParams());
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // A don't initialise the gauge field constructor; largely internal
 | 
			
		||||
  // MILC constructor no gauge fields
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  ImprovedStaggeredFermion(GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass,
 | 
			
		||||
			   RealD _c1, RealD _c2,RealD _u0,
 | 
			
		||||
			   RealD _c1=1.0, RealD _c2=1.0,RealD _u0=1.0,
 | 
			
		||||
			   const ImplParams &p = ImplParams());
 | 
			
		||||
 | 
			
		||||
  // DoubleStore impl dependent
 | 
			
		||||
  void ImportGaugeSimple(const GaugeField &_Utriple, const GaugeField &_Ufat);
 | 
			
		||||
  void ImportGauge(const GaugeField &_Uthin, const GaugeField &_Ufat);
 | 
			
		||||
  void ImportGauge(const GaugeField &_Uthin);
 | 
			
		||||
  void ImportGauge      (const GaugeField &_Uthin ) { assert(0); }
 | 
			
		||||
  void ImportGauge      (const GaugeField &_Uthin  ,const GaugeField &_Ufat);
 | 
			
		||||
  void ImportGaugeSimple(const GaugeField &_UUU    ,const GaugeField &_U);
 | 
			
		||||
  void ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U);
 | 
			
		||||
  DoubledGaugeField &GetU(void)   { return Umu ; } ;
 | 
			
		||||
  DoubledGaugeField &GetUUU(void) { return UUUmu; };
 | 
			
		||||
  void CopyGaugeCheckerboards(void);
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////////////////////////////////////////
 | 
			
		||||
  // Data members require to support the functionality
 | 
			
		||||
 
 | 
			
		||||
@@ -128,7 +128,14 @@ ImprovedStaggeredFermion5D<Impl>::ImprovedStaggeredFermion5D(GridCartesian
 | 
			
		||||
  StencilEven.BuildSurfaceList(LLs,vol4);
 | 
			
		||||
  StencilOdd.BuildSurfaceList(LLs,vol4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion5D<Impl>::CopyGaugeCheckerboards(void)
 | 
			
		||||
{
 | 
			
		||||
  pickCheckerboard(Even, UmuEven,  Umu);
 | 
			
		||||
  pickCheckerboard(Odd,  UmuOdd ,  Umu);
 | 
			
		||||
  pickCheckerboard(Even, UUUmuEven,UUUmu);
 | 
			
		||||
  pickCheckerboard(Odd,  UUUmuOdd, UUUmu);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
ImprovedStaggeredFermion5D<Impl>::ImprovedStaggeredFermion5D(GaugeField &_Uthin,GaugeField &_Ufat,
 | 
			
		||||
							     GridCartesian         &FiveDimGrid,
 | 
			
		||||
@@ -144,26 +151,7 @@ ImprovedStaggeredFermion5D<Impl>::ImprovedStaggeredFermion5D(GaugeField &_Uthin,
 | 
			
		||||
{
 | 
			
		||||
  ImportGauge(_Uthin,_Ufat);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
ImprovedStaggeredFermion5D<Impl>::ImprovedStaggeredFermion5D(GaugeField &_Utriple,GaugeField &_Ufat,
 | 
			
		||||
							     GridCartesian         &FiveDimGrid,
 | 
			
		||||
							     GridRedBlackCartesian &FiveDimRedBlackGrid,
 | 
			
		||||
							     GridCartesian         &FourDimGrid,
 | 
			
		||||
							     GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
			
		||||
							     RealD _mass,
 | 
			
		||||
							     const ImplParams &p) :
 | 
			
		||||
  ImprovedStaggeredFermion5D(FiveDimGrid,FiveDimRedBlackGrid,
 | 
			
		||||
			     FourDimGrid,FourDimRedBlackGrid,
 | 
			
		||||
			     _mass,1.0,1.0,1.0,p)
 | 
			
		||||
{
 | 
			
		||||
  ImportGaugeSimple(_Utriple,_Ufat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion5D<Impl>::ImportGauge(const GaugeField &_Uthin) 
 | 
			
		||||
{
 | 
			
		||||
  ImportGauge(_Uthin,_Uthin);
 | 
			
		||||
};
 | 
			
		||||
///////////////////////////////////////////////////
 | 
			
		||||
// For MILC use; pass three link U's and 1 link U
 | 
			
		||||
///////////////////////////////////////////////////
 | 
			
		||||
@@ -188,10 +176,17 @@ void ImprovedStaggeredFermion5D<Impl>::ImportGaugeSimple(const GaugeField &_Utri
 | 
			
		||||
    Impl::InsertGaugeField(Umu,-U,mu+4);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  pickCheckerboard(Even, UmuEven,  Umu);
 | 
			
		||||
  pickCheckerboard(Odd,  UmuOdd ,  Umu);
 | 
			
		||||
  pickCheckerboard(Even, UUUmuEven,UUUmu);
 | 
			
		||||
  pickCheckerboard(Odd,  UUUmuOdd, UUUmu);
 | 
			
		||||
  CopyGaugeCheckerboards();
 | 
			
		||||
}
 | 
			
		||||
template <class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion5D<Impl>::ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U) 
 | 
			
		||||
{
 | 
			
		||||
  /////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Trivial import; phases and fattening and such like preapplied
 | 
			
		||||
  /////////////////////////////////////////////////////////////////
 | 
			
		||||
  Umu   = _U;
 | 
			
		||||
  UUUmu = _UUU;
 | 
			
		||||
  CopyGaugeCheckerboards();
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion5D<Impl>::ImportGauge(const GaugeField &_Uthin,const GaugeField &_Ufat)
 | 
			
		||||
@@ -221,10 +216,7 @@ void ImprovedStaggeredFermion5D<Impl>::ImportGauge(const GaugeField &_Uthin,cons
 | 
			
		||||
    PokeIndex<LorentzIndex>(UUUmu, U*(-0.5*c2/u0/u0/u0), mu+4);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  pickCheckerboard(Even, UmuEven, Umu);
 | 
			
		||||
  pickCheckerboard(Odd,  UmuOdd , Umu);
 | 
			
		||||
  pickCheckerboard(Even, UUUmuEven, UUUmu);
 | 
			
		||||
  pickCheckerboard(Odd,  UUUmuOdd, UUUmu);
 | 
			
		||||
  CopyGaugeCheckerboards();
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void ImprovedStaggeredFermion5D<Impl>::DhopDir(const FermionField &in, FermionField &out,int dir5,int disp)
 | 
			
		||||
 
 | 
			
		||||
@@ -139,15 +139,9 @@ namespace QCD {
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    // Constructors
 | 
			
		||||
    // -- No Gauge field 
 | 
			
		||||
    ImprovedStaggeredFermion5D(GridCartesian         &FiveDimGrid,
 | 
			
		||||
			       GridRedBlackCartesian &FiveDimRedBlackGrid,
 | 
			
		||||
			       GridCartesian         &FourDimGrid,
 | 
			
		||||
			       GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
			
		||||
			       double _mass,
 | 
			
		||||
			       RealD _c1, RealD _c2,RealD _u0,
 | 
			
		||||
			       const ImplParams &p= ImplParams());
 | 
			
		||||
    // -- Thin link and fat link, with coefficients
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    // Grid internal interface -- Thin link and fat link, with coefficients
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    ImprovedStaggeredFermion5D(GaugeField &_Uthin,
 | 
			
		||||
			       GaugeField &_Ufat,
 | 
			
		||||
			       GridCartesian         &FiveDimGrid,
 | 
			
		||||
@@ -160,19 +154,24 @@ namespace QCD {
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    // MILC constructor ; triple links, no rescale factors; must be externally pre multiplied
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    ImprovedStaggeredFermion5D(GaugeField &_Utriple,
 | 
			
		||||
			       GaugeField &_Ufat,
 | 
			
		||||
			       GridCartesian         &FiveDimGrid,
 | 
			
		||||
    ImprovedStaggeredFermion5D(GridCartesian         &FiveDimGrid,
 | 
			
		||||
			       GridRedBlackCartesian &FiveDimRedBlackGrid,
 | 
			
		||||
			       GridCartesian         &FourDimGrid,
 | 
			
		||||
			       GridRedBlackCartesian &FourDimRedBlackGrid,
 | 
			
		||||
			       double _mass,
 | 
			
		||||
			       RealD _c1=1.0, RealD _c2=1.0,RealD _u0=1.0,
 | 
			
		||||
			       const ImplParams &p= ImplParams());
 | 
			
		||||
 | 
			
		||||
    // DoubleStore
 | 
			
		||||
    void ImportGauge(const GaugeField &_U);
 | 
			
		||||
    void ImportGauge(const GaugeField &_Uthin,const GaugeField &_Ufat);
 | 
			
		||||
    void ImportGaugeSimple(const GaugeField &_Uthin,const GaugeField &_Ufat);
 | 
			
		||||
    // DoubleStore gauge field in operator
 | 
			
		||||
    void ImportGauge      (const GaugeField &_Uthin ) { assert(0); }
 | 
			
		||||
    void ImportGauge      (const GaugeField &_Uthin  ,const GaugeField &_Ufat);
 | 
			
		||||
    void ImportGaugeSimple(const GaugeField &_UUU,const GaugeField &_U);
 | 
			
		||||
    void ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U);
 | 
			
		||||
    // Give a reference; can be used to do an assignment or copy back out after import
 | 
			
		||||
    // if Carleton wants to cache them and not use the ImportSimple
 | 
			
		||||
    DoubledGaugeField &GetU(void)   { return Umu ; } ;
 | 
			
		||||
    DoubledGaugeField &GetUUU(void) { return UUUmu; };
 | 
			
		||||
    void CopyGaugeCheckerboards(void);
 | 
			
		||||
    
 | 
			
		||||
    ///////////////////////////////////////////////////////////////
 | 
			
		||||
    // Data members require to support the functionality
 | 
			
		||||
 
 | 
			
		||||
@@ -141,6 +141,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  t1=usecond();
 | 
			
		||||
 
 | 
			
		||||
  std::cout<<GridLogMessage << "Called Ds ASM"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm src "<< norm2(src)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(tmp)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl;
 | 
			
		||||
 | 
			
		||||
@@ -160,7 +161,8 @@ int main (int argc, char ** argv)
 | 
			
		||||
  localConvert(sresult,tmp);
 | 
			
		||||
 
 | 
			
		||||
  std::cout<<GridLogMessage << "Called sDs unroll"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(sresult)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm ssrc "<< norm2(ssrc)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm sresult "<< norm2(sresult)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -181,6 +183,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
  localConvert(sresult,tmp);
 | 
			
		||||
 
 | 
			
		||||
  std::cout<<GridLogMessage << "Called sDs asm"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm ssrc   "<< norm2(ssrc)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "norm result "<< norm2(sresult)<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)*extra<<std::endl;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user