mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 14:04:32 +00:00 
			
		
		
		
	Merge branch 'feature/dirichlet' of https://github.com/paboyle/Grid into feature/dirichlet
This commit is contained in:
		@@ -42,6 +42,8 @@ public:
 | 
			
		||||
  bool is_smeared = false;
 | 
			
		||||
  RealD deriv_norm_sum;
 | 
			
		||||
  RealD deriv_max_sum;
 | 
			
		||||
  RealD Fdt_norm_sum;
 | 
			
		||||
  RealD Fdt_max_sum;
 | 
			
		||||
  int   deriv_num;
 | 
			
		||||
  RealD deriv_us;
 | 
			
		||||
  RealD S_us;
 | 
			
		||||
@@ -51,12 +53,17 @@ public:
 | 
			
		||||
    deriv_num=0;
 | 
			
		||||
    deriv_norm_sum = deriv_max_sum=0.0;
 | 
			
		||||
  }
 | 
			
		||||
  void  deriv_log(RealD nrm, RealD max) { deriv_max_sum+=max; deriv_norm_sum+=nrm; deriv_num++;}
 | 
			
		||||
  RealD deriv_max_average(void)         { return deriv_max_sum/deriv_num; };
 | 
			
		||||
  RealD deriv_norm_average(void)        { return deriv_norm_sum/deriv_num; };
 | 
			
		||||
  void  deriv_log(RealD nrm, RealD max,RealD Fdt_nrm,RealD Fdt_max) {
 | 
			
		||||
    deriv_max_sum+=max; deriv_norm_sum+=nrm;
 | 
			
		||||
    Fdt_max_sum+=Fdt_max; Fdt_norm_sum+=Fdt_nrm; deriv_num++;
 | 
			
		||||
  }
 | 
			
		||||
  RealD deriv_max_average(void)       { return deriv_max_sum/deriv_num; };
 | 
			
		||||
  RealD deriv_norm_average(void)      { return deriv_norm_sum/deriv_num; };
 | 
			
		||||
  RealD Fdt_max_average(void)         { return Fdt_max_sum/deriv_num; };
 | 
			
		||||
  RealD Fdt_norm_average(void)        { return Fdt_norm_sum/deriv_num; };
 | 
			
		||||
  RealD deriv_timer(void)        { return deriv_us; };
 | 
			
		||||
  RealD S_timer(void)            { return deriv_us; };
 | 
			
		||||
  RealD refresh_timer(void)      { return deriv_us; };
 | 
			
		||||
  RealD S_timer(void)            { return S_us; };
 | 
			
		||||
  RealD refresh_timer(void)      { return refresh_us; };
 | 
			
		||||
  void deriv_timer_start(void)   { deriv_us-=usecond(); }
 | 
			
		||||
  void deriv_timer_stop(void)    { deriv_us+=usecond(); }
 | 
			
		||||
  void refresh_timer_start(void) { refresh_us-=usecond(); }
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ struct GparityWilsonImplParams {
 | 
			
		||||
  Coordinate twists;
 | 
			
		||||
                     //mu=Nd-1 is assumed to be the time direction and a twist value of 1 indicates antiperiodic BCs
 | 
			
		||||
  Coordinate dirichlet; // Blocksize of dirichlet BCs
 | 
			
		||||
  GparityWilsonImplParams() : twists(Nd, 0), dirichlet(Nd, 0) {};
 | 
			
		||||
  GparityWilsonImplParams() : twists(Nd, 0) { dirichlet.resize(0); };
 | 
			
		||||
};
 | 
			
		||||
  
 | 
			
		||||
struct WilsonImplParams {
 | 
			
		||||
@@ -48,13 +48,13 @@ struct WilsonImplParams {
 | 
			
		||||
  AcceleratorVector<Real,Nd> twist_n_2pi_L;
 | 
			
		||||
  AcceleratorVector<Complex,Nd> boundary_phases;
 | 
			
		||||
  WilsonImplParams()  {
 | 
			
		||||
    dirichlet.resize(Nd,0);
 | 
			
		||||
    dirichlet.resize(0);
 | 
			
		||||
    boundary_phases.resize(Nd, 1.0);
 | 
			
		||||
      twist_n_2pi_L.resize(Nd, 0.0);
 | 
			
		||||
  };
 | 
			
		||||
  WilsonImplParams(const AcceleratorVector<Complex,Nd> phi) : boundary_phases(phi), overlapCommsCompute(false) {
 | 
			
		||||
    twist_n_2pi_L.resize(Nd, 0.0);
 | 
			
		||||
    dirichlet.resize(Nd,0);
 | 
			
		||||
    dirichlet.resize(0);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +62,7 @@ struct StaggeredImplParams {
 | 
			
		||||
  Coordinate dirichlet; // Blocksize of dirichlet BCs
 | 
			
		||||
  StaggeredImplParams()
 | 
			
		||||
  {
 | 
			
		||||
    dirichlet.resize(Nd,0);
 | 
			
		||||
    dirichlet.resize(0);
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
@@ -67,6 +67,36 @@ NAMESPACE_BEGIN(Grid);
 | 
			
		||||
      virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}      
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    template<class Impl,class ImplF>
 | 
			
		||||
    class OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction : public GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF> {
 | 
			
		||||
    public:
 | 
			
		||||
      typedef OneFlavourRationalParams Params;
 | 
			
		||||
    private:
 | 
			
		||||
      static RationalActionParams transcribe(const Params &in){
 | 
			
		||||
	RationalActionParams out;
 | 
			
		||||
	out.inv_pow = 2;
 | 
			
		||||
	out.lo = in.lo;
 | 
			
		||||
	out.hi = in.hi;
 | 
			
		||||
	out.MaxIter = in.MaxIter;
 | 
			
		||||
	out.action_tolerance = out.md_tolerance = in.tolerance;
 | 
			
		||||
	out.action_degree = out.md_degree = in.degree;
 | 
			
		||||
	out.precision = in.precision;
 | 
			
		||||
	out.BoundsCheckFreq = in.BoundsCheckFreq;
 | 
			
		||||
	return out;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
      OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction(FermionOperator<Impl>  &_NumOp, 
 | 
			
		||||
								 FermionOperator<Impl>  &_DenOp, 
 | 
			
		||||
								 FermionOperator<ImplF>  &_NumOpF, 
 | 
			
		||||
								 FermionOperator<ImplF>  &_DenOpF, 
 | 
			
		||||
								 const Params & p, Integer ReliableUpdateFreq
 | 
			
		||||
							) : 
 | 
			
		||||
	GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF>(_NumOp, _DenOp,_NumOpF, _DenOpF, transcribe(p),ReliableUpdateFreq){}
 | 
			
		||||
 | 
			
		||||
      virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}      
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
NAMESPACE_END(Grid);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -153,7 +153,7 @@ protected:
 | 
			
		||||
      Real force_max   = std::sqrt(maxLocalNorm2(force));
 | 
			
		||||
      Real impulse_max = force_max * ep * HMC_MOMENTUM_DENOMINATOR;    
 | 
			
		||||
 | 
			
		||||
      as[level].actions.at(a)->deriv_log(force_abs,force_max);
 | 
			
		||||
      as[level].actions.at(a)->deriv_log(force_abs,force_max,impulse_abs,impulse_max);
 | 
			
		||||
      
 | 
			
		||||
      std::cout << GridLogIntegrator<< "["<<level<<"]["<<a<<"] Force average: " << force_abs <<" "<<name<<std::endl;
 | 
			
		||||
      std::cout << GridLogIntegrator<< "["<<level<<"]["<<a<<"] Force max    : " << force_max <<" "<<name<<std::endl;
 | 
			
		||||
@@ -285,6 +285,8 @@ public:
 | 
			
		||||
		  <<"["<<level<<"]["<< actionID<<"] : "
 | 
			
		||||
		  <<" force max " << as[level].actions.at(actionID)->deriv_max_average()
 | 
			
		||||
		  <<" norm "      << as[level].actions.at(actionID)->deriv_norm_average()
 | 
			
		||||
		  <<" Fdt max  "  << as[level].actions.at(actionID)->Fdt_max_average()
 | 
			
		||||
		  <<" norm "      << as[level].actions.at(actionID)->Fdt_norm_average()
 | 
			
		||||
		  <<" calls "     << as[level].actions.at(actionID)->deriv_num
 | 
			
		||||
		  << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -711,7 +711,9 @@ public:
 | 
			
		||||
    this->_comms_recv.resize(npoints); 
 | 
			
		||||
    this->same_node.resize(npoints);
 | 
			
		||||
 | 
			
		||||
    if ( p.dirichlet.size() ) DirichletBlock(p.dirichlet); // comms send/recv set up
 | 
			
		||||
    if ( p.dirichlet.size() ==0 ) p.dirichlet.resize(grid->Nd(),0);
 | 
			
		||||
 | 
			
		||||
    DirichletBlock(p.dirichlet); // comms send/recv set up
 | 
			
		||||
 | 
			
		||||
    _unified_buffer_size=0;
 | 
			
		||||
    surface_list.resize(0);
 | 
			
		||||
 
 | 
			
		||||
@@ -190,7 +190,7 @@ void Lambda6Apply(uint64_t num1, uint64_t num2, uint64_t num3,
 | 
			
		||||
 | 
			
		||||
#define accelerator_barrier(dummy)					\
 | 
			
		||||
  {									\
 | 
			
		||||
    cudaStreamSynchronize(cpuStream);					\
 | 
			
		||||
    cudaDeviceSynchronize();						\
 | 
			
		||||
    cudaError err = cudaGetLastError();					\
 | 
			
		||||
    if ( cudaSuccess != err ) {						\
 | 
			
		||||
      printf("accelerator_barrier(): Cuda error %s \n",			\
 | 
			
		||||
@@ -362,11 +362,11 @@ accelerator_inline int acceleratorSIMTlane(int Nsimd) {
 | 
			
		||||
    dim3 hip_blocks ((num1+nt-1)/nt,num2,1); \
 | 
			
		||||
    if(hip_threads.x * hip_threads.y * hip_threads.z <= 64){ \
 | 
			
		||||
      hipLaunchKernelGGL(LambdaApply64,hip_blocks,hip_threads,		\
 | 
			
		||||
			 0,cpuStream,					\
 | 
			
		||||
			 0,0/*cpuStream*/,				\
 | 
			
		||||
			 num1,num2,nsimd, lambda);			\
 | 
			
		||||
    } else { \
 | 
			
		||||
      hipLaunchKernelGGL(LambdaApply,hip_blocks,hip_threads,		\
 | 
			
		||||
			 0,cpuStream,					\
 | 
			
		||||
			 0,0/*cpuStream*/,				\
 | 
			
		||||
			 num1,num2,nsimd, lambda);			\
 | 
			
		||||
    } \
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -128,8 +128,14 @@ template<class FermionOperatorD, class FermionOperatorF, class SchurOperatorD, c
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      // Make a mixed precision conjugate gradient
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      MixedPrecisionConjugateGradient<FieldD,FieldF> MPCG(Tolerance,MaxInnerIterations,MaxOuterIterations,SinglePrecGrid5,LinOpF,LinOpD);
 | 
			
		||||
#if 1
 | 
			
		||||
      RealD delta=1.e-4;
 | 
			
		||||
      std::cout << GridLogMessage << "Calling reliable update Conjugate Gradient" <<std::endl;
 | 
			
		||||
      ConjugateGradientReliableUpdate<FieldD,FieldF> MPCG(Tolerance,MaxInnerIterations*MaxOuterIterations,delta,SinglePrecGrid5,LinOpF,LinOpD);
 | 
			
		||||
#else      
 | 
			
		||||
      std::cout << GridLogMessage << "Calling mixed precision Conjugate Gradient" <<std::endl;
 | 
			
		||||
      MixedPrecisionConjugateGradient<FieldD,FieldF> MPCG(Tolerance,MaxInnerIterations,MaxOuterIterations,SinglePrecGrid5,LinOpF,LinOpD);
 | 
			
		||||
#endif
 | 
			
		||||
      MPCG(src,psi);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
@@ -165,7 +171,7 @@ int main(int argc, char **argv) {
 | 
			
		||||
  //  MD.name    = std::string("Force Gradient");
 | 
			
		||||
  typedef GenericHMCRunner<MinimumNorm2> HMCWrapper;
 | 
			
		||||
  MD.name    = std::string("MinimumNorm2");
 | 
			
		||||
  MD.MDsteps =  4;
 | 
			
		||||
  MD.MDsteps =  6;
 | 
			
		||||
  MD.trajL   = 1.0;
 | 
			
		||||
 | 
			
		||||
  HMCparameters HMCparams;
 | 
			
		||||
@@ -208,7 +214,8 @@ int main(int argc, char **argv) {
 | 
			
		||||
  Real light_mass   = 7.8e-4;
 | 
			
		||||
  Real strange_mass = 0.02132;
 | 
			
		||||
  Real pv_mass      = 1.0;
 | 
			
		||||
  std::vector<Real> hasenbusch({ light_mass, 3.8e-3, 0.0145, 0.045, 0.108, 0.25, 0.51 , pv_mass });
 | 
			
		||||
  //  std::vector<Real> hasenbusch({ light_mass, 3.8e-3, 0.0145, 0.045, 0.108, 0.25, 0.51 , pv_mass });
 | 
			
		||||
  std::vector<Real> hasenbusch({ light_mass, 5e-3, 0.0145, 0.045, 0.108, 0.25, 0.51 , pv_mass });
 | 
			
		||||
 | 
			
		||||
  // FIXME:
 | 
			
		||||
  // Same in MC and MD
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										470
									
								
								HMC/Mobius2p1f_DD_RHMC_96I_mixedmshift.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										470
									
								
								HMC/Mobius2p1f_DD_RHMC_96I_mixedmshift.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,470 @@
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 | 
			
		||||
Source file: ./tests/Test_hmc_EODWFRatio.cc
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015-2016
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
 | 
			
		||||
Author: Guido Cossu <guido.cossu@ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
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 <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
NAMESPACE_BEGIN(Grid);
 | 
			
		||||
 | 
			
		||||
template<class FermionOperatorD, class FermionOperatorF, class SchurOperatorD, class  SchurOperatorF> 
 | 
			
		||||
  class MixedPrecisionConjugateGradientOperatorFunction : public OperatorFunction<typename FermionOperatorD::FermionField> {
 | 
			
		||||
  public:
 | 
			
		||||
    typedef typename FermionOperatorD::FermionField FieldD;
 | 
			
		||||
    typedef typename FermionOperatorF::FermionField FieldF;
 | 
			
		||||
 | 
			
		||||
    using OperatorFunction<FieldD>::operator();
 | 
			
		||||
 | 
			
		||||
    RealD   Tolerance;
 | 
			
		||||
    RealD   InnerTolerance; //Initial tolerance for inner CG. Defaults to Tolerance but can be changed
 | 
			
		||||
    Integer MaxInnerIterations;
 | 
			
		||||
    Integer MaxOuterIterations;
 | 
			
		||||
    GridBase* SinglePrecGrid4; //Grid for single-precision fields
 | 
			
		||||
    GridBase* SinglePrecGrid5; //Grid for single-precision fields
 | 
			
		||||
    RealD OuterLoopNormMult; //Stop the outer loop and move to a final double prec solve when the residual is OuterLoopNormMult * Tolerance
 | 
			
		||||
 | 
			
		||||
    FermionOperatorF &FermOpF;
 | 
			
		||||
    FermionOperatorD &FermOpD;;
 | 
			
		||||
    SchurOperatorF &LinOpF;
 | 
			
		||||
    SchurOperatorD &LinOpD;
 | 
			
		||||
 | 
			
		||||
    Integer TotalInnerIterations; //Number of inner CG iterations
 | 
			
		||||
    Integer TotalOuterIterations; //Number of restarts
 | 
			
		||||
    Integer TotalFinalStepIterations; //Number of CG iterations in final patch-up step
 | 
			
		||||
 | 
			
		||||
    MixedPrecisionConjugateGradientOperatorFunction(RealD tol, 
 | 
			
		||||
						    Integer maxinnerit, 
 | 
			
		||||
						    Integer maxouterit, 
 | 
			
		||||
						    GridBase* _sp_grid4, 
 | 
			
		||||
						    GridBase* _sp_grid5, 
 | 
			
		||||
						    FermionOperatorF &_FermOpF,
 | 
			
		||||
						    FermionOperatorD &_FermOpD,
 | 
			
		||||
						    SchurOperatorF   &_LinOpF,
 | 
			
		||||
						    SchurOperatorD   &_LinOpD): 
 | 
			
		||||
      LinOpF(_LinOpF),
 | 
			
		||||
      LinOpD(_LinOpD),
 | 
			
		||||
      FermOpF(_FermOpF),
 | 
			
		||||
      FermOpD(_FermOpD),
 | 
			
		||||
      Tolerance(tol), 
 | 
			
		||||
      InnerTolerance(tol), 
 | 
			
		||||
      MaxInnerIterations(maxinnerit), 
 | 
			
		||||
      MaxOuterIterations(maxouterit), 
 | 
			
		||||
      SinglePrecGrid4(_sp_grid4),
 | 
			
		||||
      SinglePrecGrid5(_sp_grid5),
 | 
			
		||||
      OuterLoopNormMult(100.) 
 | 
			
		||||
    { 
 | 
			
		||||
      /* Debugging instances of objects; references are stored
 | 
			
		||||
      std::cout << GridLogMessage << " Mixed precision CG wrapper LinOpF " <<std::hex<< &LinOpF<<std::dec <<std::endl;
 | 
			
		||||
      std::cout << GridLogMessage << " Mixed precision CG wrapper LinOpD " <<std::hex<< &LinOpD<<std::dec <<std::endl;
 | 
			
		||||
      std::cout << GridLogMessage << " Mixed precision CG wrapper FermOpF " <<std::hex<< &FermOpF<<std::dec <<std::endl;
 | 
			
		||||
      std::cout << GridLogMessage << " Mixed precision CG wrapper FermOpD " <<std::hex<< &FermOpD<<std::dec <<std::endl;
 | 
			
		||||
      */
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    void operator()(LinearOperatorBase<FieldD> &LinOpU, const FieldD &src, FieldD &psi) {
 | 
			
		||||
 | 
			
		||||
      std::cout << GridLogMessage << " Mixed precision CG wrapper operator() "<<std::endl;
 | 
			
		||||
 | 
			
		||||
      SchurOperatorD * SchurOpU = static_cast<SchurOperatorD *>(&LinOpU);
 | 
			
		||||
      
 | 
			
		||||
      //      std::cout << GridLogMessage << " Mixed precision CG wrapper operator() FermOpU " <<std::hex<< &(SchurOpU->_Mat)<<std::dec <<std::endl;
 | 
			
		||||
      //      std::cout << GridLogMessage << " Mixed precision CG wrapper operator() FermOpD " <<std::hex<< &(LinOpD._Mat) <<std::dec <<std::endl;
 | 
			
		||||
      // Assumption made in code to extract gauge field
 | 
			
		||||
      // We could avoid storing LinopD reference alltogether ?
 | 
			
		||||
      assert(&(SchurOpU->_Mat)==&(LinOpD._Mat));
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      // Must snarf a single precision copy of the gauge field in Linop_d argument
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      typedef typename FermionOperatorF::GaugeField GaugeFieldF;
 | 
			
		||||
      typedef typename FermionOperatorF::GaugeLinkField GaugeLinkFieldF;
 | 
			
		||||
      typedef typename FermionOperatorD::GaugeField GaugeFieldD;
 | 
			
		||||
      typedef typename FermionOperatorD::GaugeLinkField GaugeLinkFieldD;
 | 
			
		||||
 | 
			
		||||
      GridBase * GridPtrF = SinglePrecGrid4;
 | 
			
		||||
      GridBase * GridPtrD = FermOpD.Umu.Grid();
 | 
			
		||||
      GaugeFieldF     U_f  (GridPtrF);
 | 
			
		||||
      GaugeLinkFieldF Umu_f(GridPtrF);
 | 
			
		||||
      //      std::cout << " Dim gauge field "<<GridPtrF->Nd()<<std::endl; // 4d
 | 
			
		||||
      //      std::cout << " Dim gauge field "<<GridPtrD->Nd()<<std::endl; // 4d
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      // Moving this to a Clone method of fermion operator would allow to duplicate the 
 | 
			
		||||
      // physics parameters and decrease gauge field copies
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      GaugeLinkFieldD Umu_d(GridPtrD);
 | 
			
		||||
      for(int mu=0;mu<Nd*2;mu++){ 
 | 
			
		||||
	Umu_d = PeekIndex<LorentzIndex>(FermOpD.Umu, mu);
 | 
			
		||||
	precisionChange(Umu_f,Umu_d);
 | 
			
		||||
	PokeIndex<LorentzIndex>(FermOpF.Umu, Umu_f, mu);
 | 
			
		||||
      }
 | 
			
		||||
      pickCheckerboard(Even,FermOpF.UmuEven,FermOpF.Umu);
 | 
			
		||||
      pickCheckerboard(Odd ,FermOpF.UmuOdd ,FermOpF.Umu);
 | 
			
		||||
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      // Make a mixed precision conjugate gradient
 | 
			
		||||
      ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
#if 1
 | 
			
		||||
      RealD delta=1.e-4;
 | 
			
		||||
      std::cout << GridLogMessage << "Calling reliable update Conjugate Gradient" <<std::endl;
 | 
			
		||||
      ConjugateGradientReliableUpdate<FieldD,FieldF> MPCG(Tolerance,MaxInnerIterations*MaxOuterIterations,delta,SinglePrecGrid5,LinOpF,LinOpD);
 | 
			
		||||
#else      
 | 
			
		||||
      std::cout << GridLogMessage << "Calling mixed precision Conjugate Gradient" <<std::endl;
 | 
			
		||||
      MixedPrecisionConjugateGradient<FieldD,FieldF> MPCG(Tolerance,MaxInnerIterations,MaxOuterIterations,SinglePrecGrid5,LinOpF,LinOpD);
 | 
			
		||||
#endif
 | 
			
		||||
      MPCG(src,psi);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
NAMESPACE_END(Grid);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  using namespace Grid;
 | 
			
		||||
 | 
			
		||||
  Grid_init(&argc, &argv);
 | 
			
		||||
  int threads = GridThread::GetThreads();
 | 
			
		||||
 | 
			
		||||
   // Typedefs to simplify notation
 | 
			
		||||
  typedef WilsonImplR FermionImplPolicy;
 | 
			
		||||
  typedef WilsonImplF FermionImplPolicyF;
 | 
			
		||||
 | 
			
		||||
  typedef MobiusFermionR FermionAction;
 | 
			
		||||
  typedef MobiusFermionF FermionActionF;
 | 
			
		||||
  typedef typename FermionAction::FermionField FermionField;
 | 
			
		||||
  typedef typename FermionActionF::FermionField FermionFieldF;
 | 
			
		||||
 | 
			
		||||
  typedef Grid::XmlReader       Serialiser;
 | 
			
		||||
 | 
			
		||||
  //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 | 
			
		||||
  IntegratorParameters MD;
 | 
			
		||||
  //  typedef GenericHMCRunner<LeapFrog> HMCWrapper;
 | 
			
		||||
  //  MD.name    = std::string("Leap Frog");
 | 
			
		||||
  //  typedef GenericHMCRunner<ForceGradient> HMCWrapper;
 | 
			
		||||
  //  MD.name    = std::string("Force Gradient");
 | 
			
		||||
  typedef GenericHMCRunner<MinimumNorm2> HMCWrapper;
 | 
			
		||||
  MD.name    = std::string("MinimumNorm2");
 | 
			
		||||
  MD.MDsteps =  6;
 | 
			
		||||
  MD.trajL   = 1.0;
 | 
			
		||||
 | 
			
		||||
  HMCparameters HMCparams;
 | 
			
		||||
  HMCparams.StartTrajectory  = 1077;
 | 
			
		||||
  HMCparams.Trajectories     = 1;
 | 
			
		||||
  HMCparams.NoMetropolisUntil=  0;
 | 
			
		||||
  // "[HotStart, ColdStart, TepidStart, CheckpointStart]\n";
 | 
			
		||||
  //  HMCparams.StartingType     =std::string("ColdStart");
 | 
			
		||||
  HMCparams.StartingType     =std::string("CheckpointStart");
 | 
			
		||||
  HMCparams.MD = MD;
 | 
			
		||||
  HMCWrapper TheHMC(HMCparams);
 | 
			
		||||
 | 
			
		||||
  // Grid from the command line arguments --grid and --mpi
 | 
			
		||||
  TheHMC.Resources.AddFourDimGrid("gauge"); // use default simd lanes decomposition
 | 
			
		||||
 | 
			
		||||
  CheckpointerParameters CPparams;
 | 
			
		||||
  CPparams.config_prefix = "ckpoint_DDHMC_lat";
 | 
			
		||||
  CPparams.rng_prefix    = "ckpoint_DDHMC_rng";
 | 
			
		||||
  CPparams.saveInterval  = 1;
 | 
			
		||||
  CPparams.format        = "IEEE64BIG";
 | 
			
		||||
  TheHMC.Resources.LoadNerscCheckpointer(CPparams);
 | 
			
		||||
 | 
			
		||||
  RNGModuleParameters RNGpar;
 | 
			
		||||
  RNGpar.serial_seeds = "1 2 3 4 5";
 | 
			
		||||
  RNGpar.parallel_seeds = "6 7 8 9 10";
 | 
			
		||||
  TheHMC.Resources.SetRNGSeeds(RNGpar);
 | 
			
		||||
 | 
			
		||||
  // Construct observables
 | 
			
		||||
  // here there is too much indirection
 | 
			
		||||
  typedef PlaquetteMod<HMCWrapper::ImplPolicy> PlaqObs;
 | 
			
		||||
  TheHMC.Resources.AddObservable<PlaqObs>();
 | 
			
		||||
  //////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
  const int Ls      = 12;
 | 
			
		||||
  RealD M5  = 1.8;
 | 
			
		||||
  RealD b   = 1.5;
 | 
			
		||||
  RealD c   = 0.5;
 | 
			
		||||
  Real beta         = 2.31;
 | 
			
		||||
  //  Real light_mass   = 5.4e-4;
 | 
			
		||||
  Real light_mass   = 7.8e-4;
 | 
			
		||||
  Real strange_mass = 0.02132;
 | 
			
		||||
  Real pv_mass      = 1.0;
 | 
			
		||||
  //  std::vector<Real> hasenbusch({ light_mass, 3.8e-3, 0.0145, 0.045, 0.108, 0.25, 0.51 , pv_mass });
 | 
			
		||||
  std::vector<Real> hasenbusch({ light_mass, 5e-3, 0.0145, 0.045, 0.108, 0.25, 0.51 , pv_mass });
 | 
			
		||||
 | 
			
		||||
  // FIXME:
 | 
			
		||||
  // Same in MC and MD
 | 
			
		||||
  // Need to mix precision too
 | 
			
		||||
  OneFlavourRationalParams SFRp; // Strange
 | 
			
		||||
  SFRp.lo       = 4.0e-3;
 | 
			
		||||
  SFRp.hi       = 90.0;
 | 
			
		||||
  SFRp.MaxIter  = 60000;
 | 
			
		||||
  SFRp.tolerance= 1.0e-8;
 | 
			
		||||
  SFRp.mdtolerance= 1.0e-6;
 | 
			
		||||
  SFRp.degree   = 12;
 | 
			
		||||
  SFRp.precision= 50;
 | 
			
		||||
  SFRp.BoundsCheckFreq=0;
 | 
			
		||||
 | 
			
		||||
  OneFlavourRationalParams OFRp; // Up/down
 | 
			
		||||
  OFRp.lo       = 2.0e-5;
 | 
			
		||||
  OFRp.hi       = 90.0;
 | 
			
		||||
  OFRp.MaxIter  = 60000;
 | 
			
		||||
  OFRp.tolerance= 1.0e-8;
 | 
			
		||||
  OFRp.mdtolerance= 1.0e-6;
 | 
			
		||||
  //  OFRp.degree   = 20; converges
 | 
			
		||||
  //  OFRp.degree   = 16;
 | 
			
		||||
  OFRp.degree   = 12;
 | 
			
		||||
  OFRp.precision= 80;
 | 
			
		||||
  OFRp.BoundsCheckFreq=0;
 | 
			
		||||
 | 
			
		||||
  auto GridPtr   = TheHMC.Resources.GetCartesian();
 | 
			
		||||
  auto GridRBPtr = TheHMC.Resources.GetRBCartesian();
 | 
			
		||||
 | 
			
		||||
  typedef SchurDiagMooeeOperator<FermionActionF,FermionFieldF> LinearOperatorF;
 | 
			
		||||
  typedef SchurDiagMooeeOperator<FermionAction ,FermionField > LinearOperatorD;
 | 
			
		||||
  typedef MixedPrecisionConjugateGradientOperatorFunction<MobiusFermionD,MobiusFermionF,LinearOperatorD,LinearOperatorF> MxPCG;
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Domain decomposed
 | 
			
		||||
  ////////////////////////////////////////////////////////////////
 | 
			
		||||
  Coordinate latt4  = GridPtr->GlobalDimensions();
 | 
			
		||||
  Coordinate mpi    = GridPtr->ProcessorGrid();
 | 
			
		||||
  Coordinate shm;
 | 
			
		||||
 | 
			
		||||
  GlobalSharedMemory::GetShmDims(mpi,shm);
 | 
			
		||||
  
 | 
			
		||||
  Coordinate CommDim(Nd);
 | 
			
		||||
  for(int d=0;d<Nd;d++) CommDim[d]= (mpi[d]/shm[d])>1 ? 1 : 0;
 | 
			
		||||
 | 
			
		||||
  Coordinate NonDirichlet(Nd+1,0);
 | 
			
		||||
  Coordinate Dirichlet(Nd+1,0);
 | 
			
		||||
  Dirichlet[1] = CommDim[0]*latt4[0]/mpi[0] * shm[0];
 | 
			
		||||
  Dirichlet[2] = CommDim[1]*latt4[1]/mpi[1] * shm[1];
 | 
			
		||||
  Dirichlet[3] = CommDim[2]*latt4[2]/mpi[2] * shm[2];
 | 
			
		||||
  Dirichlet[4] = CommDim[3]*latt4[3]/mpi[3] * shm[3];
 | 
			
		||||
 | 
			
		||||
  Coordinate Block4(Nd);
 | 
			
		||||
  Block4[0] = Dirichlet[1];
 | 
			
		||||
  Block4[1] = Dirichlet[2];
 | 
			
		||||
  Block4[2] = Dirichlet[3];
 | 
			
		||||
  Block4[3] = Dirichlet[4];
 | 
			
		||||
 | 
			
		||||
  int Width=3;
 | 
			
		||||
  TheHMC.Resources.SetMomentumFilter(new DDHMCFilter<WilsonImplR::Field>(Block4,Width));
 | 
			
		||||
 | 
			
		||||
  //////////////////////////
 | 
			
		||||
  // Fermion Grids
 | 
			
		||||
  //////////////////////////
 | 
			
		||||
  auto FGrid     = SpaceTimeGrid::makeFiveDimGrid(Ls,GridPtr);
 | 
			
		||||
  auto FrbGrid   = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,GridPtr);
 | 
			
		||||
 | 
			
		||||
  Coordinate simdF = GridDefaultSimd(Nd,vComplexF::Nsimd());
 | 
			
		||||
  auto GridPtrF   = SpaceTimeGrid::makeFourDimGrid(latt4,simdF,mpi);
 | 
			
		||||
  auto GridRBPtrF = SpaceTimeGrid::makeFourDimRedBlackGrid(GridPtrF);
 | 
			
		||||
  auto FGridF     = SpaceTimeGrid::makeFiveDimGrid(Ls,GridPtrF);
 | 
			
		||||
  auto FrbGridF   = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,GridPtrF);
 | 
			
		||||
 | 
			
		||||
  IwasakiGaugeActionR GaugeAction(beta);
 | 
			
		||||
 | 
			
		||||
  // temporarily need a gauge field
 | 
			
		||||
  LatticeGaugeField U(GridPtr);
 | 
			
		||||
  LatticeGaugeFieldF UF(GridPtrF);
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << " Running the HMC "<< std::endl;
 | 
			
		||||
  TheHMC.ReadCommandLine(argc,argv);  // params on CML or from param file
 | 
			
		||||
  TheHMC.initializeGaugeFieldAndRNGs(U);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // These lines are unecessary if BC are all periodic
 | 
			
		||||
  std::vector<Complex> boundary = {1,1,1,-1};
 | 
			
		||||
  FermionAction::ImplParams Params(boundary);
 | 
			
		||||
  Params.dirichlet=NonDirichlet;
 | 
			
		||||
  FermionAction::ImplParams ParamsDir(boundary);
 | 
			
		||||
  ParamsDir.dirichlet=Dirichlet;
 | 
			
		||||
 | 
			
		||||
  //  double StoppingCondition = 1e-14;
 | 
			
		||||
  //  double MDStoppingCondition = 1e-9;
 | 
			
		||||
  double StoppingCondition = 1e-10;
 | 
			
		||||
  double MDStoppingCondition = 1e-7;
 | 
			
		||||
  double MDStoppingConditionLoose = 1e-6;
 | 
			
		||||
  double MaxCGIterations = 300000;
 | 
			
		||||
  ConjugateGradient<FermionField>  CG(StoppingCondition,MaxCGIterations);
 | 
			
		||||
  ConjugateGradient<FermionField>  MDCG(MDStoppingCondition,MaxCGIterations);
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  // Collect actions
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  ActionLevel<HMCWrapper::Field> Level1(1);
 | 
			
		||||
  ActionLevel<HMCWrapper::Field> Level2(4);
 | 
			
		||||
  ActionLevel<HMCWrapper::Field> Level3(8);
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  // Strange action
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  FermionAction StrangeOp (U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,strange_mass,M5,b,c, Params);
 | 
			
		||||
  FermionAction StrangePauliVillarsOp(U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,pv_mass,  M5,b,c, Params);
 | 
			
		||||
 | 
			
		||||
  FermionAction StrangeOpDir (U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,strange_mass,M5,b,c, ParamsDir);
 | 
			
		||||
  FermionAction StrangePauliVillarsOpDir(U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,pv_mass,  M5,b,c, ParamsDir);
 | 
			
		||||
  
 | 
			
		||||
  OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> StrangePseudoFermionBdy(StrangeOpDir,StrangeOp,SFRp);
 | 
			
		||||
  OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> StrangePseudoFermionLocal(StrangePauliVillarsOpDir,StrangeOpDir,SFRp);
 | 
			
		||||
  OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> StrangePseudoFermionPVBdy(StrangePauliVillarsOp,StrangePauliVillarsOpDir,SFRp);
 | 
			
		||||
  Level1.push_back(&StrangePseudoFermionBdy);
 | 
			
		||||
  Level2.push_back(&StrangePseudoFermionLocal);
 | 
			
		||||
  Level1.push_back(&StrangePseudoFermionPVBdy);
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  // up down action
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  std::vector<Real> light_den;
 | 
			
		||||
  std::vector<Real> light_num;
 | 
			
		||||
  std::vector<int> dirichlet_den;
 | 
			
		||||
  std::vector<int> dirichlet_num;
 | 
			
		||||
 | 
			
		||||
  int n_hasenbusch = hasenbusch.size();
 | 
			
		||||
  light_den.push_back(light_mass);  dirichlet_den.push_back(0);
 | 
			
		||||
  for(int h=0;h<n_hasenbusch;h++){
 | 
			
		||||
    light_den.push_back(hasenbusch[h]); dirichlet_den.push_back(1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for(int h=0;h<n_hasenbusch;h++){
 | 
			
		||||
    light_num.push_back(hasenbusch[h]); dirichlet_num.push_back(1);
 | 
			
		||||
  }
 | 
			
		||||
  light_num.push_back(pv_mass);  dirichlet_num.push_back(0);
 | 
			
		||||
 | 
			
		||||
  std::vector<FermionAction *> Numerators;
 | 
			
		||||
  std::vector<FermionActionF *> NumeratorsF;
 | 
			
		||||
  std::vector<FermionAction *> Denominators;
 | 
			
		||||
  std::vector<FermionActionF *> DenominatorsF;
 | 
			
		||||
  std::vector<TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy> *> Quotients;
 | 
			
		||||
 | 
			
		||||
#define MIXED_PRECISION
 | 
			
		||||
#ifdef MIXED_PRECISION
 | 
			
		||||
  std::vector<OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF> *> Bdys;
 | 
			
		||||
#else
 | 
			
		||||
  std::vector<OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> *> Bdys;
 | 
			
		||||
#endif
 | 
			
		||||
  std::vector<MxPCG *> ActionMPCG;
 | 
			
		||||
  std::vector<MxPCG *> MPCG;
 | 
			
		||||
 | 
			
		||||
  typedef SchurDiagMooeeOperator<FermionActionF,FermionFieldF> LinearOperatorF;
 | 
			
		||||
  typedef SchurDiagMooeeOperator<FermionAction ,FermionField > LinearOperatorD;
 | 
			
		||||
  std::vector<LinearOperatorD *> LinOpD;
 | 
			
		||||
  std::vector<LinearOperatorF *> LinOpF; 
 | 
			
		||||
  
 | 
			
		||||
  for(int h=0;h<n_hasenbusch+1;h++){
 | 
			
		||||
    std::cout << GridLogMessage
 | 
			
		||||
	      << " 2f quotient Action ";
 | 
			
		||||
    std::cout << "det D("<<light_den[h]<<")";
 | 
			
		||||
    if ( dirichlet_den[h] ) std::cout << "^dirichlet    ";
 | 
			
		||||
    std::cout << "/ det D("<<light_num[h]<<")";
 | 
			
		||||
    if ( dirichlet_num[h] ) std::cout << "^dirichlet    ";
 | 
			
		||||
    std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
    FermionAction::ImplParams ParamsNum(boundary);
 | 
			
		||||
    FermionAction::ImplParams ParamsDen(boundary);
 | 
			
		||||
    FermionActionF::ImplParams ParamsNumF(boundary);
 | 
			
		||||
    FermionActionF::ImplParams ParamsDenF(boundary);
 | 
			
		||||
    
 | 
			
		||||
    if ( dirichlet_num[h]==1) ParamsNum.dirichlet = Dirichlet;
 | 
			
		||||
    else                      ParamsNum.dirichlet = NonDirichlet;
 | 
			
		||||
    Numerators.push_back  (new FermionAction(U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,light_num[h],M5,b,c, ParamsNum));
 | 
			
		||||
 | 
			
		||||
    if ( dirichlet_den[h]==1) ParamsDen.dirichlet = Dirichlet;
 | 
			
		||||
    else                      ParamsDen.dirichlet = NonDirichlet;
 | 
			
		||||
 | 
			
		||||
    Denominators.push_back(new FermionAction(U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,light_den[h],M5,b,c, ParamsDen));
 | 
			
		||||
 | 
			
		||||
    ParamsDenF.dirichlet = ParamsDen.dirichlet;
 | 
			
		||||
    DenominatorsF.push_back(new FermionActionF(UF,*FGridF,*FrbGridF,*GridPtrF,*GridRBPtrF,light_den[h],M5,b,c, ParamsDenF));
 | 
			
		||||
 | 
			
		||||
    ParamsNumF.dirichlet = ParamsNum.dirichlet;
 | 
			
		||||
    NumeratorsF.push_back  (new FermionActionF(UF,*FGridF,*FrbGridF,*GridPtrF,*GridRBPtrF,light_num[h],M5,b,c, ParamsNumF));
 | 
			
		||||
 | 
			
		||||
    LinOpD.push_back(new LinearOperatorD(*Denominators[h]));
 | 
			
		||||
    LinOpF.push_back(new LinearOperatorF(*DenominatorsF[h]));
 | 
			
		||||
 | 
			
		||||
    double conv  = MDStoppingCondition;
 | 
			
		||||
    if (h<3) conv= MDStoppingConditionLoose; // Relax on first two hasenbusch factors
 | 
			
		||||
    const int MX_inner = 5000;
 | 
			
		||||
    MPCG.push_back(new MxPCG(conv,
 | 
			
		||||
			     MX_inner,
 | 
			
		||||
			     MaxCGIterations,
 | 
			
		||||
			     GridPtrF,
 | 
			
		||||
			     FrbGridF,
 | 
			
		||||
			     *DenominatorsF[h],*Denominators[h],
 | 
			
		||||
			     *LinOpF[h], *LinOpD[h]) );
 | 
			
		||||
 | 
			
		||||
    ActionMPCG.push_back(new MxPCG(StoppingCondition,
 | 
			
		||||
				   MX_inner,
 | 
			
		||||
				   MaxCGIterations,
 | 
			
		||||
				   GridPtrF,
 | 
			
		||||
				   FrbGridF,
 | 
			
		||||
				   *DenominatorsF[h],*Denominators[h],
 | 
			
		||||
				   *LinOpF[h], *LinOpD[h]) );
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    if(h!=0) {
 | 
			
		||||
      //      Quotients.push_back (new TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],MDCG,CG));
 | 
			
		||||
      Quotients.push_back (new TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],*MPCG[h],*ActionMPCG[h],CG));
 | 
			
		||||
    } else {
 | 
			
		||||
#ifdef MIXED_PRECISION
 | 
			
		||||
      Bdys.push_back( new OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF>(
 | 
			
		||||
			   *Numerators[h],*Denominators[h],
 | 
			
		||||
			   *NumeratorsF[h],*DenominatorsF[h],
 | 
			
		||||
			   OFRp, 500) );
 | 
			
		||||
#else
 | 
			
		||||
      Bdys.push_back( new OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],OFRp));
 | 
			
		||||
      Bdys.push_back( new OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],OFRp));
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int nquo=Quotients.size();
 | 
			
		||||
  Level1.push_back(Bdys[0]);
 | 
			
		||||
  Level1.push_back(Bdys[1]);
 | 
			
		||||
  for(int h=0;h<nquo-1;h++){
 | 
			
		||||
    Level2.push_back(Quotients[h]);
 | 
			
		||||
  }
 | 
			
		||||
  Level2.push_back(Quotients[nquo-1]);
 | 
			
		||||
 | 
			
		||||
  /////////////////////////////////////////////////////////////
 | 
			
		||||
  // Gauge action
 | 
			
		||||
  /////////////////////////////////////////////////////////////
 | 
			
		||||
  Level3.push_back(&GaugeAction);
 | 
			
		||||
  TheHMC.TheAction.push_back(Level1);
 | 
			
		||||
  TheHMC.TheAction.push_back(Level2);
 | 
			
		||||
  TheHMC.TheAction.push_back(Level3);
 | 
			
		||||
  std::cout << GridLogMessage << " Action complete "<< std::endl;
 | 
			
		||||
  /////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
  TheHMC.Run();  // no smearing
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
} // main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -98,9 +98,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
    std::cout<<GridLogMessage<<"Called warmup"<<std::endl;
 | 
			
		||||
    double t0=usecond();
 | 
			
		||||
    for(int i=0;i<ncall;i++){
 | 
			
		||||
      __SSC_START;
 | 
			
		||||
      Dw.Dhop(src,result,0);
 | 
			
		||||
      __SSC_STOP;
 | 
			
		||||
    }
 | 
			
		||||
    double t1=usecond();
 | 
			
		||||
    FGrid->Barrier();
 | 
			
		||||
@@ -141,9 +139,7 @@ int main (int argc, char ** argv)
 | 
			
		||||
    std::cout<<GridLogMessage<<"Called warmup"<<std::endl;
 | 
			
		||||
    double t0=usecond();
 | 
			
		||||
    for(int i=0;i<ncall;i++){
 | 
			
		||||
      __SSC_START;
 | 
			
		||||
      DwD.Dhop(src_d,result_d,0);
 | 
			
		||||
      __SSC_STOP;
 | 
			
		||||
    }
 | 
			
		||||
    double t1=usecond();
 | 
			
		||||
    FGrid_d->Barrier();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user