mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Exposing support for Ncolours and Ndimensions and JSON input file for the ScalarAction
This commit is contained in:
		@@ -40,9 +40,9 @@ namespace QCD {
 | 
			
		||||
  typedef ScalarAction<ScalarImplF>                 ScalarActionF;
 | 
			
		||||
  typedef ScalarAction<ScalarImplD>                 ScalarActionD;
 | 
			
		||||
 | 
			
		||||
  typedef ScalarInteractionAction<ScalarAdjImplR>   ScalarAdjActionR;
 | 
			
		||||
  typedef ScalarInteractionAction<ScalarAdjImplF>   ScalarAdjActionF;
 | 
			
		||||
  typedef ScalarInteractionAction<ScalarAdjImplD>   ScalarAdjActionD;
 | 
			
		||||
  template <int Colours, int Dimensions> using ScalarAdjActionR = ScalarInteractionAction<ScalarNxNAdjImplR<Colours>, Dimensions>;
 | 
			
		||||
  template <int Colours, int Dimensions> using ScalarAdjActionF = ScalarInteractionAction<ScalarNxNAdjImplF<Colours>, Dimensions>;
 | 
			
		||||
  template <int Colours, int Dimensions> using ScalarAdjActionD = ScalarInteractionAction<ScalarNxNAdjImplD<Colours>, Dimensions>;
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,10 @@ class ScalarImplTypes {
 | 
			
		||||
  typedef ScalarAdjMatrixImplTypes<vComplexF, QCD::Nc> ScalarAdjImplF;
 | 
			
		||||
  typedef ScalarAdjMatrixImplTypes<vComplexD, QCD::Nc> ScalarAdjImplD;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  template <int Colours > using ScalarNxNAdjImplR = ScalarAdjMatrixImplTypes<vComplex,   Colours >;
 | 
			
		||||
  template <int Colours > using ScalarNxNAdjImplF = ScalarAdjMatrixImplTypes<vComplexF,  Colours >;
 | 
			
		||||
  template <int Colours > using ScalarNxNAdjImplD = ScalarAdjMatrixImplTypes<vComplexD,  Colours >;
 | 
			
		||||
  
 | 
			
		||||
  //}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,11 +37,11 @@ directory
 | 
			
		||||
namespace Grid {
 | 
			
		||||
  // FIXME drop the QCD namespace everywhere here
 | 
			
		||||
 | 
			
		||||
template <class Impl>
 | 
			
		||||
class ScalarInteractionAction : public QCD::Action<typename Impl::Field> {
 | 
			
		||||
public:
 | 
			
		||||
  template <class Impl, int Ndim >
 | 
			
		||||
  class ScalarInteractionAction : public QCD::Action<typename Impl::Field> {
 | 
			
		||||
  public:
 | 
			
		||||
    INHERIT_FIELD_TYPES(Impl);
 | 
			
		||||
private:
 | 
			
		||||
  private:
 | 
			
		||||
    RealD mass_square;
 | 
			
		||||
    RealD lambda;
 | 
			
		||||
 | 
			
		||||
@@ -50,14 +50,19 @@ private:
 | 
			
		||||
    typedef CartesianStencil<vobj,vobj> Stencil;
 | 
			
		||||
 | 
			
		||||
    SimpleCompressor<vobj> compressor;
 | 
			
		||||
    int npoint = 8;
 | 
			
		||||
    std::vector<int> directions    = {0,1,2,3,0,1,2,3};  // forcing 4 dimensions
 | 
			
		||||
    std::vector<int> displacements = {1,1,1,1, -1,-1,-1,-1};
 | 
			
		||||
    int npoint = 2*Ndim;
 | 
			
		||||
    std::vector<int> directions;//    = {0,1,2,3,0,1,2,3};  // forcing 4 dimensions
 | 
			
		||||
    std::vector<int> displacements;//  = {1,1,1,1, -1,-1,-1,-1};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
    ScalarInteractionAction(RealD ms, RealD l) : mass_square(ms), lambda(l){}
 | 
			
		||||
    ScalarInteractionAction(RealD ms, RealD l) : mass_square(ms), lambda(l), displacements(2*Ndim,0), directions(2*Ndim,0){
 | 
			
		||||
      for (int mu = 0 ; mu < Ndim; mu++){
 | 
			
		||||
		directions[mu]         = mu; directions[mu+Ndim]    = mu;
 | 
			
		||||
		displacements[mu]      =  1; displacements[mu+Ndim] = -1;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual std::string LogParameters() {
 | 
			
		||||
      std::stringstream sstream;
 | 
			
		||||
@@ -71,75 +76,74 @@ private:
 | 
			
		||||
    virtual void refresh(const Field &U, GridParallelRNG &pRNG) {}
 | 
			
		||||
 | 
			
		||||
    virtual RealD S(const Field &p) {
 | 
			
		||||
        static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
 | 
			
		||||
        phiStencil.HaloExchange(p, compressor);
 | 
			
		||||
 | 
			
		||||
        Field action(p._grid), pshift(p._grid), phisquared(p._grid);
 | 
			
		||||
        phisquared = p*p;
 | 
			
		||||
        action = (2.0*QCD::Nd + mass_square)*phisquared + lambda*phisquared*phisquared;
 | 
			
		||||
        for (int mu = 0; mu < QCD::Nd; mu++) {
 | 
			
		||||
            //  pshift = Cshift(p, mu, +1);  // not efficient, implement with stencils
 | 
			
		||||
            PARALLEL_FOR_LOOP
 | 
			
		||||
            for (int i = 0; i < p._grid->oSites(); i++) {
 | 
			
		||||
                int permute_type;
 | 
			
		||||
                StencilEntry *SE;
 | 
			
		||||
                vobj temp2;
 | 
			
		||||
                vobj *temp;
 | 
			
		||||
                vobj *t_p;
 | 
			
		||||
 | 
			
		||||
                SE = phiStencil.GetEntry(permute_type, mu, i);
 | 
			
		||||
                t_p  = &p._odata[i];
 | 
			
		||||
                if ( SE->_is_local ) {
 | 
			
		||||
                    temp = &p._odata[SE->_offset];
 | 
			
		||||
                    if ( SE->_permute ) {
 | 
			
		||||
                        permute(temp2, *temp, permute_type);
 | 
			
		||||
                        action._odata[i] -= temp2*(*t_p) + (*t_p)*temp2;
 | 
			
		||||
                    } else {
 | 
			
		||||
                  action._odata[i] -= *temp*(*t_p) + (*t_p)*(*temp);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                  action._odata[i] -= phiStencil.CommBuf()[SE->_offset]*(*t_p) + (*t_p)*phiStencil.CommBuf()[SE->_offset];
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            //  action -= pshift*p + p*pshift;
 | 
			
		||||
        }
 | 
			
		||||
        // NB the trace in the algebra is normalised to 1/2
 | 
			
		||||
        // minus sign coming from the antihermitian fields
 | 
			
		||||
        return -(TensorRemove(sum(trace(action)))).real();
 | 
			
		||||
      assert(p._grid->Nd() == Ndim);
 | 
			
		||||
      static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
 | 
			
		||||
      phiStencil.HaloExchange(p, compressor);
 | 
			
		||||
      Field action(p._grid), pshift(p._grid), phisquared(p._grid);
 | 
			
		||||
      phisquared = p*p;
 | 
			
		||||
      action = (2.0*Ndim + mass_square)*phisquared + lambda*phisquared*phisquared;
 | 
			
		||||
      for (int mu = 0; mu < Ndim; mu++) {
 | 
			
		||||
	//  pshift = Cshift(p, mu, +1);  // not efficient, implement with stencils
 | 
			
		||||
	parallel_for (int i = 0; i < p._grid->oSites(); i++) {
 | 
			
		||||
	  int permute_type;
 | 
			
		||||
	  StencilEntry *SE;
 | 
			
		||||
	  vobj temp2;
 | 
			
		||||
	  vobj *temp;
 | 
			
		||||
	  vobj *t_p;
 | 
			
		||||
	    
 | 
			
		||||
	  SE = phiStencil.GetEntry(permute_type, mu, i);
 | 
			
		||||
	  t_p  = &p._odata[i];
 | 
			
		||||
	  if ( SE->_is_local ) {
 | 
			
		||||
	    temp = &p._odata[SE->_offset];
 | 
			
		||||
	    if ( SE->_permute ) {
 | 
			
		||||
	      permute(temp2, *temp, permute_type);
 | 
			
		||||
	      action._odata[i] -= temp2*(*t_p) + (*t_p)*temp2;
 | 
			
		||||
	    } else {
 | 
			
		||||
	      action._odata[i] -= *temp*(*t_p) + (*t_p)*(*temp);
 | 
			
		||||
	    }
 | 
			
		||||
	  } else {
 | 
			
		||||
	    action._odata[i] -= phiStencil.CommBuf()[SE->_offset]*(*t_p) + (*t_p)*phiStencil.CommBuf()[SE->_offset];
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
	//  action -= pshift*p + p*pshift;
 | 
			
		||||
      }
 | 
			
		||||
      // NB the trace in the algebra is normalised to 1/2
 | 
			
		||||
      // minus sign coming from the antihermitian fields
 | 
			
		||||
      return -(TensorRemove(sum(trace(action)))).real();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    virtual void deriv(const Field &p, Field &force) {
 | 
			
		||||
        force = (2.0*QCD::Nd + mass_square)*p + 2.0*lambda*p*p*p;
 | 
			
		||||
        // move this outside
 | 
			
		||||
        static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
 | 
			
		||||
        phiStencil.HaloExchange(p, compressor);
 | 
			
		||||
 | 
			
		||||
        //for (int mu = 0; mu < QCD::Nd; mu++) force -= Cshift(p, mu, -1) + Cshift(p, mu, 1);
 | 
			
		||||
        for (int point = 0; point < npoint; point++) {
 | 
			
		||||
            PARALLEL_FOR_LOOP
 | 
			
		||||
            for (int i = 0; i < p._grid->oSites(); i++) {
 | 
			
		||||
                vobj *temp;
 | 
			
		||||
                vobj temp2;
 | 
			
		||||
                int permute_type;
 | 
			
		||||
                StencilEntry *SE;
 | 
			
		||||
                SE = phiStencil.GetEntry(permute_type, point, i);
 | 
			
		||||
 | 
			
		||||
                if ( SE->_is_local ) {
 | 
			
		||||
                    temp = &p._odata[SE->_offset];
 | 
			
		||||
                    if ( SE->_permute ) {
 | 
			
		||||
                        permute(temp2, *temp, permute_type);
 | 
			
		||||
                        force._odata[i] -= temp2;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        force._odata[i] -= *temp;
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    force._odata[i] -= phiStencil.CommBuf()[SE->_offset];
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      assert(p._grid->Nd() == Ndim);
 | 
			
		||||
      force = (2.0*Ndim + mass_square)*p + 2.0*lambda*p*p*p;
 | 
			
		||||
      // move this outside
 | 
			
		||||
      static Stencil phiStencil(p._grid, npoint, 0, directions, displacements);
 | 
			
		||||
      phiStencil.HaloExchange(p, compressor);
 | 
			
		||||
      
 | 
			
		||||
      //for (int mu = 0; mu < QCD::Nd; mu++) force -= Cshift(p, mu, -1) + Cshift(p, mu, 1);
 | 
			
		||||
      for (int point = 0; point < npoint; point++) {
 | 
			
		||||
	parallel_for (int i = 0; i < p._grid->oSites(); i++) {
 | 
			
		||||
	  vobj *temp;
 | 
			
		||||
	  vobj temp2;
 | 
			
		||||
	  int permute_type;
 | 
			
		||||
	  StencilEntry *SE;
 | 
			
		||||
	  SE = phiStencil.GetEntry(permute_type, point, i);
 | 
			
		||||
	  
 | 
			
		||||
	  if ( SE->_is_local ) {
 | 
			
		||||
	    temp = &p._odata[SE->_offset];
 | 
			
		||||
	    if ( SE->_permute ) {
 | 
			
		||||
	      permute(temp2, *temp, permute_type);
 | 
			
		||||
	      force._odata[i] -= temp2;
 | 
			
		||||
	    } else {
 | 
			
		||||
	      force._odata[i] -= *temp;
 | 
			
		||||
	    }
 | 
			
		||||
	  } else {
 | 
			
		||||
	    force._odata[i] -= phiStencil.CommBuf()[SE->_offset];
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
}  // namespace Grid
 | 
			
		||||
 | 
			
		||||
#endif  // SCALAR_INT_ACTION_H
 | 
			
		||||
 
 | 
			
		||||
@@ -210,6 +210,9 @@ typedef HMCWrapperTemplate<ScalarImplR, MinimumNorm2, ScalarFields>
 | 
			
		||||
typedef HMCWrapperTemplate<ScalarAdjImplR, MinimumNorm2, ScalarMatrixFields>
 | 
			
		||||
    ScalarAdjGenericHMCRunner;
 | 
			
		||||
 | 
			
		||||
template <int Colours> 
 | 
			
		||||
using ScalarNxNAdjGenericHMCRunner = HMCWrapperTemplate < ScalarNxNAdjImplR<Colours>, MinimumNorm2, ScalarNxNMatrixFields<Colours> >;
 | 
			
		||||
 | 
			
		||||
}  // namespace QCD
 | 
			
		||||
}  // namespace Grid
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,9 @@ typedef Representations<FundamentalRepresentation> NoHirep;
 | 
			
		||||
typedef Representations<EmptyRep<typename ScalarImplR::Field> > ScalarFields;
 | 
			
		||||
typedef Representations<EmptyRep<typename ScalarAdjImplR::Field> > ScalarMatrixFields;
 | 
			
		||||
 | 
			
		||||
template < int Colours> 
 | 
			
		||||
using ScalarNxNMatrixFields = Representations<EmptyRep<typename ScalarNxNAdjImplR<Colours>::Field> >;
 | 
			
		||||
 | 
			
		||||
// Helper classes to access the elements
 | 
			
		||||
// Strips the first N parameters from the tuple
 | 
			
		||||
// sequence of classes to obtain the S sequence
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user