mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 05:24:32 +00:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
			5bfa88be85
			...
			feature/ft
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					09146cfc43 | ||
| 
						 | 
					a450e96827 | ||
| 
						 | 
					0f3678b9be | ||
| 
						 | 
					8dd8338e14 | ||
| 
						 | 
					11e0dc9851 | ||
| 
						 | 
					f4ef6dae43 | ||
| 
						 | 
					b6e147372b | ||
| 
						 | 
					3a4a662dc6 | ||
| 
						 | 
					8d06bda6fb | 
@@ -44,7 +44,7 @@ public:
 | 
			
		||||
  ConfigurationBase() {}
 | 
			
		||||
  virtual ~ConfigurationBase() {}
 | 
			
		||||
  virtual void set_Field(Field& U) =0;
 | 
			
		||||
  virtual void smeared_force(Field&) const = 0;
 | 
			
		||||
  virtual void smeared_force(Field&) = 0;
 | 
			
		||||
  virtual Field& get_SmearedU() =0;
 | 
			
		||||
  virtual Field &get_U(bool smeared = false) = 0;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -284,11 +284,12 @@ public:
 | 
			
		||||
 | 
			
		||||
      TheIntegrator.print_timer();
 | 
			
		||||
      
 | 
			
		||||
      TheIntegrator.Smearer.set_Field(Ucur);
 | 
			
		||||
      for (int obs = 0; obs < Observables.size(); obs++) {
 | 
			
		||||
      	std::cout << GridLogDebug << "Observables # " << obs << std::endl;
 | 
			
		||||
      	std::cout << GridLogDebug << "Observables total " << Observables.size() << std::endl;
 | 
			
		||||
      	std::cout << GridLogDebug << "Observables pointer " << Observables[obs] << std::endl;
 | 
			
		||||
        Observables[obs]->TrajectoryComplete(traj + 1, Ucur, sRNG, pRNG);
 | 
			
		||||
        Observables[obs]->TrajectoryComplete(traj + 1, TheIntegrator.Smearer, sRNG, pRNG);
 | 
			
		||||
      }
 | 
			
		||||
      std::cout << GridLogHMC << ":::::::::::::::::::::::::::::::::::::::::::" << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -35,13 +35,16 @@ class CheckpointerParameters : Serializable {
 | 
			
		||||
public:
 | 
			
		||||
  GRID_SERIALIZABLE_CLASS_MEMBERS(CheckpointerParameters, 
 | 
			
		||||
				  std::string, config_prefix, 
 | 
			
		||||
				  std::string, smeared_prefix, 
 | 
			
		||||
				  std::string, rng_prefix, 
 | 
			
		||||
				  int, saveInterval, 
 | 
			
		||||
				  bool, saveSmeared, 
 | 
			
		||||
				  std::string, format, );
 | 
			
		||||
 | 
			
		||||
  CheckpointerParameters(std::string cf = "cfg", std::string rn = "rng",
 | 
			
		||||
  CheckpointerParameters(std::string cf = "cfg", std::string sf="cfg_smr" , std::string rn = "rng",
 | 
			
		||||
			 int savemodulo = 1, const std::string &f = "IEEE64BIG")
 | 
			
		||||
    : config_prefix(cf),
 | 
			
		||||
      smeared_prefix(sf),
 | 
			
		||||
      rng_prefix(rn),
 | 
			
		||||
      saveInterval(savemodulo),
 | 
			
		||||
      format(f){};
 | 
			
		||||
@@ -61,13 +64,21 @@ template <class Impl>
 | 
			
		||||
class BaseHmcCheckpointer : public HmcObservable<typename Impl::Field> {
 | 
			
		||||
public:
 | 
			
		||||
  void build_filenames(int traj, CheckpointerParameters &Params,
 | 
			
		||||
                       std::string &conf_file, std::string &rng_file) {
 | 
			
		||||
                       std::string &conf_file,
 | 
			
		||||
                       std::string &smear_file,
 | 
			
		||||
		       std::string &rng_file) {
 | 
			
		||||
    {
 | 
			
		||||
      std::ostringstream os;
 | 
			
		||||
      os << Params.rng_prefix << "." << traj;
 | 
			
		||||
      rng_file = os.str();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
      std::ostringstream os;
 | 
			
		||||
      os << Params.smeared_prefix << "." << traj;
 | 
			
		||||
      smear_file = os.str();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
      std::ostringstream os;
 | 
			
		||||
      os << Params.config_prefix << "." << traj;
 | 
			
		||||
@@ -84,6 +95,11 @@ public:
 | 
			
		||||
  }
 | 
			
		||||
  virtual void initialize(const CheckpointerParameters &Params) = 0;
 | 
			
		||||
 | 
			
		||||
  virtual void TrajectoryComplete(int traj,
 | 
			
		||||
                                  typename Impl::Field &U,
 | 
			
		||||
                                  GridSerialRNG &sRNG,
 | 
			
		||||
                                  GridParallelRNG &pRNG) { assert(0); } ; // HMC should pass the smart config with smeared and unsmeared
 | 
			
		||||
  
 | 
			
		||||
  virtual void CheckpointRestore(int traj, typename Impl::Field &U,
 | 
			
		||||
                                 GridSerialRNG &sRNG,
 | 
			
		||||
                                 GridParallelRNG &pRNG) = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -61,11 +61,14 @@ public:
 | 
			
		||||
    fout.close();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void TrajectoryComplete(int traj, Field &U, GridSerialRNG &sRNG, GridParallelRNG &pRNG) {
 | 
			
		||||
  void TrajectoryComplete(int traj,
 | 
			
		||||
			  ConfigurationBase<Field> &SmartConfig,
 | 
			
		||||
			  GridSerialRNG &sRNG, GridParallelRNG &pRNG)
 | 
			
		||||
  {
 | 
			
		||||
 | 
			
		||||
    if ((traj % Params.saveInterval) == 0) {
 | 
			
		||||
      std::string config, rng;
 | 
			
		||||
      this->build_filenames(traj, Params, config, rng);
 | 
			
		||||
      std::string config, rng, smr;
 | 
			
		||||
      this->build_filenames(traj, Params, config, smr, rng);
 | 
			
		||||
 | 
			
		||||
      uint32_t nersc_csum;
 | 
			
		||||
      uint32_t scidac_csuma;
 | 
			
		||||
@@ -74,9 +77,15 @@ public:
 | 
			
		||||
      BinarySimpleUnmunger<sobj_double, sobj> munge;
 | 
			
		||||
      truncate(rng);
 | 
			
		||||
      BinaryIO::writeRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb);
 | 
			
		||||
      truncate(config);
 | 
			
		||||
      std::cout << GridLogMessage << "Written Binary RNG " << rng
 | 
			
		||||
                << " checksum " << std::hex 
 | 
			
		||||
		<< nersc_csum   <<"/"
 | 
			
		||||
		<< scidac_csuma   <<"/"
 | 
			
		||||
		<< scidac_csumb 
 | 
			
		||||
		<< std::dec << std::endl;
 | 
			
		||||
 | 
			
		||||
      BinaryIO::writeLatticeObject<vobj, sobj_double>(U, config, munge, 0, Params.format,
 | 
			
		||||
      truncate(config);
 | 
			
		||||
      BinaryIO::writeLatticeObject<vobj, sobj_double>(SmartConfig.get_U(false), config, munge, 0, Params.format,
 | 
			
		||||
						      nersc_csum,scidac_csuma,scidac_csumb);
 | 
			
		||||
 | 
			
		||||
      std::cout << GridLogMessage << "Written Binary Configuration " << config
 | 
			
		||||
@@ -85,6 +94,18 @@ public:
 | 
			
		||||
		<< scidac_csuma   <<"/"
 | 
			
		||||
		<< scidac_csumb 
 | 
			
		||||
		<< std::dec << std::endl;
 | 
			
		||||
 | 
			
		||||
      if ( Params.saveSmeared ) {
 | 
			
		||||
	truncate(smr);
 | 
			
		||||
	BinaryIO::writeLatticeObject<vobj, sobj_double>(SmartConfig.get_U(true), smr, munge, 0, Params.format,
 | 
			
		||||
							nersc_csum,scidac_csuma,scidac_csumb);
 | 
			
		||||
	std::cout << GridLogMessage << "Written Binary Smeared Configuration " << smr
 | 
			
		||||
                << " checksum " << std::hex 
 | 
			
		||||
		<< nersc_csum   <<"/"
 | 
			
		||||
		<< scidac_csuma   <<"/"
 | 
			
		||||
		<< scidac_csumb 
 | 
			
		||||
		<< std::dec << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -69,17 +69,27 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG,
 | 
			
		||||
  void TrajectoryComplete(int traj,
 | 
			
		||||
			  ConfigurationBase<GaugeField> &SmartConfig,
 | 
			
		||||
			  GridSerialRNG &sRNG,
 | 
			
		||||
                          GridParallelRNG &pRNG) {
 | 
			
		||||
    if ((traj % Params.saveInterval) == 0) {
 | 
			
		||||
      std::string config, rng;
 | 
			
		||||
      std::string config, rng, smr;
 | 
			
		||||
      this->build_filenames(traj, Params, config, rng);
 | 
			
		||||
      GridBase *grid = U.Grid();
 | 
			
		||||
      GridBase *grid = SmartConfig.get_U(false).Grid();
 | 
			
		||||
      uint32_t nersc_csum,scidac_csuma,scidac_csumb;
 | 
			
		||||
      BinaryIO::writeRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb);
 | 
			
		||||
      std::cout << GridLogMessage << "Written BINARY RNG " << rng
 | 
			
		||||
                << " checksum " << std::hex 
 | 
			
		||||
		<< nersc_csum<<"/"
 | 
			
		||||
		<< scidac_csuma<<"/"
 | 
			
		||||
		<< scidac_csumb
 | 
			
		||||
		<< std::dec << std::endl;
 | 
			
		||||
 | 
			
		||||
      
 | 
			
		||||
      IldgWriter _IldgWriter(grid->IsBoss());
 | 
			
		||||
      _IldgWriter.open(config);
 | 
			
		||||
      _IldgWriter.writeConfiguration<GaugeStats>(U, traj, config, config);
 | 
			
		||||
      _IldgWriter.writeConfiguration<GaugeStats>(SmartConfig.get_U(false), traj, config, config);
 | 
			
		||||
      _IldgWriter.close();
 | 
			
		||||
 | 
			
		||||
      std::cout << GridLogMessage << "Written ILDG Configuration on " << config
 | 
			
		||||
@@ -88,6 +98,21 @@ public:
 | 
			
		||||
		<< scidac_csuma<<"/"
 | 
			
		||||
		<< scidac_csumb
 | 
			
		||||
		<< std::dec << std::endl;
 | 
			
		||||
 | 
			
		||||
      if ( Params.saveSmeared ) { 
 | 
			
		||||
	IldgWriter _IldgWriter(grid->IsBoss());
 | 
			
		||||
	_IldgWriter.open(smr);
 | 
			
		||||
	_IldgWriter.writeConfiguration<GaugeStats>(SmartConfig.get_U(true), traj, config, config);
 | 
			
		||||
	_IldgWriter.close();
 | 
			
		||||
 | 
			
		||||
	std::cout << GridLogMessage << "Written ILDG Configuration on " << smr
 | 
			
		||||
                << " checksum " << std::hex 
 | 
			
		||||
		<< nersc_csum<<"/"
 | 
			
		||||
		<< scidac_csuma<<"/"
 | 
			
		||||
		<< scidac_csumb
 | 
			
		||||
		<< std::dec << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -52,23 +52,29 @@ public:
 | 
			
		||||
    Params.format = "IEEE64BIG";  // fixed, overwrite any other choice
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG,
 | 
			
		||||
                          GridParallelRNG &pRNG) {
 | 
			
		||||
  virtual void TrajectoryComplete(int traj,
 | 
			
		||||
                                  ConfigurationBase<GaugeField> &SmartConfig,
 | 
			
		||||
                                  GridSerialRNG &sRNG,
 | 
			
		||||
                                  GridParallelRNG &pRNG)
 | 
			
		||||
  {
 | 
			
		||||
    if ((traj % Params.saveInterval) == 0) {
 | 
			
		||||
      std::string config, rng;
 | 
			
		||||
      this->build_filenames(traj, Params, config, rng);
 | 
			
		||||
      std::string config, rng, smr;
 | 
			
		||||
      this->build_filenames(traj, Params, config, smr, rng);
 | 
			
		||||
      
 | 
			
		||||
      int precision32 = 1;
 | 
			
		||||
      int tworow = 0;
 | 
			
		||||
      NerscIO::writeRNGState(sRNG, pRNG, rng);
 | 
			
		||||
      NerscIO::writeConfiguration<GaugeStats>(U, config, tworow, precision32);
 | 
			
		||||
      NerscIO::writeConfiguration<GaugeStats>(SmartConfig.get_U(false), config, tworow, precision32);
 | 
			
		||||
      if ( Params.saveSmeared ) {
 | 
			
		||||
	NerscIO::writeConfiguration<GaugeStats>(SmartConfig.get_U(true), smr, tworow, precision32);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  void CheckpointRestore(int traj, GaugeField &U, GridSerialRNG &sRNG,
 | 
			
		||||
                         GridParallelRNG &pRNG) {
 | 
			
		||||
    std::string config, rng;
 | 
			
		||||
    this->build_filenames(traj, Params, config, rng);
 | 
			
		||||
    std::string config, rng, smr;
 | 
			
		||||
    this->build_filenames(traj, Params, config, smr, rng );
 | 
			
		||||
    this->check_filename(rng);
 | 
			
		||||
    this->check_filename(config);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -70,19 +70,37 @@ class ScidacHmcCheckpointer : public BaseHmcCheckpointer<Implementation> {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void TrajectoryComplete(int traj, Field &U, GridSerialRNG &sRNG,
 | 
			
		||||
  void TrajectoryComplete(int traj, 
 | 
			
		||||
			  ConfigurationBase<Field> &SmartConfig,
 | 
			
		||||
			  GridSerialRNG &sRNG,
 | 
			
		||||
                          GridParallelRNG &pRNG) {
 | 
			
		||||
    if ((traj % Params.saveInterval) == 0) {
 | 
			
		||||
      std::string config, rng;
 | 
			
		||||
      this->build_filenames(traj, Params, config, rng);
 | 
			
		||||
      GridBase *grid = U.Grid();
 | 
			
		||||
      std::string config, rng,smr;
 | 
			
		||||
      this->build_filenames(traj, Params, config, smr, rng);
 | 
			
		||||
      GridBase *grid = SmartConfig.get_U(false).Grid();
 | 
			
		||||
      uint32_t nersc_csum,scidac_csuma,scidac_csumb;
 | 
			
		||||
      BinaryIO::writeRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb);
 | 
			
		||||
      std::cout << GridLogMessage << "Written Binary RNG " << rng
 | 
			
		||||
                << " checksum " << std::hex 
 | 
			
		||||
		<< nersc_csum   <<"/"
 | 
			
		||||
		<< scidac_csuma   <<"/"
 | 
			
		||||
		<< scidac_csumb 
 | 
			
		||||
		<< std::dec << std::endl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
	ScidacWriter _ScidacWriter(grid->IsBoss());
 | 
			
		||||
	_ScidacWriter.open(config);
 | 
			
		||||
      _ScidacWriter.writeScidacFieldRecord(U, MData);
 | 
			
		||||
	_ScidacWriter.writeScidacFieldRecord(SmartConfig.get_U(false), MData);
 | 
			
		||||
	_ScidacWriter.close();
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      if ( Params.saveSmeared ) {
 | 
			
		||||
	ScidacWriter _ScidacWriter(grid->IsBoss());
 | 
			
		||||
	_ScidacWriter.open(smr);
 | 
			
		||||
	_ScidacWriter.writeScidacFieldRecord(SmartConfig.get_U(true), MData);
 | 
			
		||||
	_ScidacWriter.close();
 | 
			
		||||
      }
 | 
			
		||||
      std::cout << GridLogMessage << "Written Scidac Configuration on " << config << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -66,6 +66,7 @@ public:
 | 
			
		||||
template <class FieldImplementation_, class SmearingPolicy, class RepresentationPolicy>
 | 
			
		||||
class Integrator {
 | 
			
		||||
protected:
 | 
			
		||||
public:
 | 
			
		||||
  typedef FieldImplementation_ FieldImplementation;
 | 
			
		||||
  typedef typename FieldImplementation::Field MomentaField;  //for readability
 | 
			
		||||
  typedef typename FieldImplementation::Field Field;
 | 
			
		||||
@@ -96,7 +97,6 @@ protected:
 | 
			
		||||
  {
 | 
			
		||||
    t_P[level] += ep;
 | 
			
		||||
    update_P(P, U, level, ep);
 | 
			
		||||
 | 
			
		||||
    std::cout << GridLogIntegrator << "[" << level << "] P " << " dt " << ep << " : t_P " << t_P[level] << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -130,28 +130,20 @@ protected:
 | 
			
		||||
      Field force(U.Grid());
 | 
			
		||||
      conformable(U.Grid(), Mom.Grid());
 | 
			
		||||
 | 
			
		||||
      Field& Us = Smearer.get_U(as[level].actions.at(a)->is_smeared);
 | 
			
		||||
      double start_force = usecond();
 | 
			
		||||
 | 
			
		||||
      std::cout << GridLogMessage << "AuditForce["<<level<<"]["<<a<<"] before"<<std::endl;
 | 
			
		||||
      
 | 
			
		||||
      as[level].actions.at(a)->deriv_timer_start();
 | 
			
		||||
      as[level].actions.at(a)->deriv(Us, force);  // deriv should NOT include Ta
 | 
			
		||||
      as[level].actions.at(a)->deriv(Smearer, force);  // deriv should NOT include Ta
 | 
			
		||||
      as[level].actions.at(a)->deriv_timer_stop();
 | 
			
		||||
 | 
			
		||||
      std::cout << GridLogMessage << "AuditForce["<<level<<"]["<<a<<"] after"<<std::endl;
 | 
			
		||||
 | 
			
		||||
      std::cout << GridLogIntegrator << "Smearing (on/off): " << as[level].actions.at(a)->is_smeared << std::endl;
 | 
			
		||||
      auto name = as[level].actions.at(a)->action_name();
 | 
			
		||||
      if (as[level].actions.at(a)->is_smeared) Smearer.smeared_force(force);
 | 
			
		||||
 | 
			
		||||
      force = FieldImplementation::projectForce(force); // Ta for gauge fields
 | 
			
		||||
      double end_force = usecond();
 | 
			
		||||
      
 | 
			
		||||
      //      DumpSliceNorm("force ",force,Nd-1);
 | 
			
		||||
      MomFilter->applyFilter(force);
 | 
			
		||||
 | 
			
		||||
      std::cout << GridLogIntegrator << " update_P : Level [" << level <<"]["<<a <<"] "<<name<<" dt "<<ep<<  std::endl;
 | 
			
		||||
      DumpSliceNorm("force filtered ",force,Nd-1);
 | 
			
		||||
      
 | 
			
		||||
      Real force_abs   = std::sqrt(norm2(force)/U.Grid()->gSites()); //average per-site norm.  nb. norm2(latt) = \sum_x norm2(latt[x]) 
 | 
			
		||||
      Real impulse_abs = force_abs * ep * HMC_MOMENTUM_DENOMINATOR;    
 | 
			
		||||
@@ -377,14 +369,9 @@ public:
 | 
			
		||||
	auto name = as[level].actions.at(actionID)->action_name();
 | 
			
		||||
        std::cout << GridLogMessage << "refresh [" << level << "][" << actionID << "] "<<name << std::endl;
 | 
			
		||||
 | 
			
		||||
        Field& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared);
 | 
			
		||||
 | 
			
		||||
	std::cout << GridLogMessage << "AuditRefresh["<<level<<"]["<<actionID<<"] before"<<std::endl;
 | 
			
		||||
 | 
			
		||||
	as[level].actions.at(actionID)->refresh_timer_start();
 | 
			
		||||
        as[level].actions.at(actionID)->refresh(Us, sRNG, pRNG);
 | 
			
		||||
        as[level].actions.at(actionID)->refresh(Smearer, sRNG, pRNG);
 | 
			
		||||
	as[level].actions.at(actionID)->refresh_timer_stop();
 | 
			
		||||
	std::cout << GridLogMessage << "AuditRefresh["<<level<<"]["<<actionID<<"] after"<<std::endl;
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@@ -425,10 +412,9 @@ public:
 | 
			
		||||
 | 
			
		||||
        // get gauge field from the SmearingPolicy and
 | 
			
		||||
        // based on the boolean is_smeared in actionID
 | 
			
		||||
        Field& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared);
 | 
			
		||||
        std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] action eval " << std::endl;
 | 
			
		||||
	        as[level].actions.at(actionID)->S_timer_start();
 | 
			
		||||
        Hterm = as[level].actions.at(actionID)->S(Us);
 | 
			
		||||
        Hterm = as[level].actions.at(actionID)->S(Smearer);
 | 
			
		||||
   	        as[level].actions.at(actionID)->S_timer_stop();
 | 
			
		||||
        std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] H = " << Hterm << std::endl;
 | 
			
		||||
        H += Hterm;
 | 
			
		||||
@@ -469,11 +455,10 @@ public:
 | 
			
		||||
      for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) {
 | 
			
		||||
        // get gauge field from the SmearingPolicy and
 | 
			
		||||
        // based on the boolean is_smeared in actionID
 | 
			
		||||
        Field& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared);
 | 
			
		||||
        std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] action eval " << std::endl;
 | 
			
		||||
	        as[level].actions.at(actionID)->S_timer_start();
 | 
			
		||||
 | 
			
		||||
        Hterm = as[level].actions.at(actionID)->Sinitial(Us);
 | 
			
		||||
	as[level].actions.at(actionID)->S_timer_start();
 | 
			
		||||
        Hterm = as[level].actions.at(actionID)->S(Smearer);
 | 
			
		||||
	as[level].actions.at(actionID)->S_timer_stop();
 | 
			
		||||
 | 
			
		||||
        std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] H = " << Hterm << std::endl;
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,13 @@ NAMESPACE_BEGIN(Grid);
 | 
			
		||||
template <class Field>
 | 
			
		||||
class HmcObservable {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual void TrajectoryComplete(int traj,
 | 
			
		||||
                                  ConfigurationBase<Field> &SmartConfig,
 | 
			
		||||
                                  GridSerialRNG &sRNG,
 | 
			
		||||
                                  GridParallelRNG &pRNG)
 | 
			
		||||
  {
 | 
			
		||||
    TrajectoryComplete(traj,SmartConfig.get_U(false),sRNG,pRNG); // Unsmeared observable
 | 
			
		||||
  };
 | 
			
		||||
  virtual void TrajectoryComplete(int traj,
 | 
			
		||||
                                  Field &U,
 | 
			
		||||
                                  GridSerialRNG &sRNG,
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,18 @@ public:
 | 
			
		||||
  // necessary for HmcObservable compatibility
 | 
			
		||||
  typedef typename Impl::Field Field;
 | 
			
		||||
 | 
			
		||||
  virtual void TrajectoryComplete(int traj,
 | 
			
		||||
                                  ConfigurationBase<Field> &SmartConfig,
 | 
			
		||||
                                  GridSerialRNG &sRNG,
 | 
			
		||||
                                  GridParallelRNG &pRNG)
 | 
			
		||||
  {
 | 
			
		||||
    std::cout << GridLogMessage << "+++++++++++++++++++"<<std::endl;
 | 
			
		||||
    std::cout << GridLogMessage << "Unsmeared plaquette"<<std::endl;
 | 
			
		||||
    TrajectoryComplete(traj,SmartConfig.get_U(false),sRNG,pRNG); // Unsmeared observable
 | 
			
		||||
    std::cout << GridLogMessage << "Smeared plaquette"<<std::endl;
 | 
			
		||||
    TrajectoryComplete(traj,SmartConfig.get_U(true),sRNG,pRNG); // Unsmeared observable
 | 
			
		||||
    std::cout << GridLogMessage << "+++++++++++++++++++"<<std::endl;
 | 
			
		||||
  };
 | 
			
		||||
  void TrajectoryComplete(int traj,
 | 
			
		||||
                          Field &U,
 | 
			
		||||
                          GridSerialRNG &sRNG,
 | 
			
		||||
 
 | 
			
		||||
@@ -19,13 +19,13 @@ public:
 | 
			
		||||
 | 
			
		||||
  NoSmearing(): ThinLinks(NULL) {}
 | 
			
		||||
 | 
			
		||||
  void set_Field(Field& U) { ThinLinks = &U; }
 | 
			
		||||
  virtual void set_Field(Field& U) { ThinLinks = &U; }
 | 
			
		||||
 | 
			
		||||
  void smeared_force(Field&) const {}
 | 
			
		||||
  virtual void smeared_force(Field&) {}
 | 
			
		||||
 | 
			
		||||
  Field& get_SmearedU() { return *ThinLinks; }
 | 
			
		||||
  virtual Field& get_SmearedU() { return *ThinLinks; }
 | 
			
		||||
 | 
			
		||||
  Field &get_U(bool smeared = false)
 | 
			
		||||
  virtual Field &get_U(bool smeared = false)
 | 
			
		||||
  {
 | 
			
		||||
    return *ThinLinks;
 | 
			
		||||
  }
 | 
			
		||||
@@ -235,7 +235,7 @@ public:
 | 
			
		||||
    : smearingLevels(0), StoutSmearing(nullptr), SmearedSet(), ThinLinks(NULL) {}
 | 
			
		||||
 | 
			
		||||
  // attach the smeared routines to the thin links U and fill the smeared set
 | 
			
		||||
  void set_Field(GaugeField &U)
 | 
			
		||||
  virtual void set_Field(GaugeField &U)
 | 
			
		||||
  {
 | 
			
		||||
    double start = usecond();
 | 
			
		||||
    fill_smearedSet(U);
 | 
			
		||||
@@ -245,7 +245,7 @@ public:
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //====================================================================
 | 
			
		||||
  void smeared_force(GaugeField &SigmaTilde) const
 | 
			
		||||
  virtual void smeared_force(GaugeField &SigmaTilde) 
 | 
			
		||||
  {
 | 
			
		||||
    if (smearingLevels > 0)
 | 
			
		||||
    {
 | 
			
		||||
@@ -272,14 +272,16 @@ public:
 | 
			
		||||
      }
 | 
			
		||||
      double end = usecond();
 | 
			
		||||
      double time = (end - start)/ 1e3;
 | 
			
		||||
      std::cout << GridLogMessage << "Smearing force in " << time << " ms" << std::endl;  
 | 
			
		||||
      std::cout << GridLogMessage << " GaugeConfiguration: Smeared Force chain rule took " << time << " ms" << std::endl;
 | 
			
		||||
    }  // if smearingLevels = 0 do nothing
 | 
			
		||||
    SigmaTilde=Gimpl::projectForce(SigmaTilde); // Ta
 | 
			
		||||
      
 | 
			
		||||
  }
 | 
			
		||||
  //====================================================================
 | 
			
		||||
 | 
			
		||||
  GaugeField& get_SmearedU() { return SmearedSet[smearingLevels - 1]; }
 | 
			
		||||
  virtual GaugeField& get_SmearedU() { return SmearedSet[smearingLevels - 1]; }
 | 
			
		||||
 | 
			
		||||
  GaugeField &get_U(bool smeared = false)
 | 
			
		||||
  virtual GaugeField &get_U(bool smeared = false)
 | 
			
		||||
  {
 | 
			
		||||
    // get the config, thin links by default
 | 
			
		||||
    if (smeared)
 | 
			
		||||
 
 | 
			
		||||
@@ -131,6 +131,7 @@ public:
 | 
			
		||||
    AdjMatrixField  X(grid);
 | 
			
		||||
    Complex ci(0,1);
 | 
			
		||||
 | 
			
		||||
    RealD t0 = usecond();
 | 
			
		||||
    Ident = ComplexD(1.0);
 | 
			
		||||
    for(int d=0;d<Nd;d++){
 | 
			
		||||
      Umu[d] = peekLorentz(U, d);
 | 
			
		||||
@@ -161,6 +162,8 @@ public:
 | 
			
		||||
    // Assemble the N matrix
 | 
			
		||||
    //////////////////////////////////////////////////////////////////
 | 
			
		||||
    // Computes ALL the staples -- could compute one only and do it here
 | 
			
		||||
    RealD time;
 | 
			
		||||
    time=-usecond();
 | 
			
		||||
    this->StoutSmearing->BaseSmear(C, U);
 | 
			
		||||
    Cmu = peekLorentz(C, mu);
 | 
			
		||||
 | 
			
		||||
@@ -169,7 +172,10 @@ public:
 | 
			
		||||
    //////////////////////////////////////////////////////////////////
 | 
			
		||||
    // Ta so Z lives in Lie algabra
 | 
			
		||||
    Zx  = Ta(Cmu * adj(Umu[mu]));
 | 
			
		||||
    time+=usecond();
 | 
			
		||||
    std::cout << GridLogMessage << "Z took "<<time<< " us"<<std::endl;
 | 
			
		||||
 | 
			
		||||
    time=-usecond();
 | 
			
		||||
    // Move Z to the Adjoint Rep == make_adjoint_representation
 | 
			
		||||
    ZxAd = Zero();
 | 
			
		||||
    for(int b=0;b<8;b++) {
 | 
			
		||||
@@ -180,10 +186,13 @@ public:
 | 
			
		||||
      cplx = 2.0*trace(ci*tb*Zx); // my convention 1/2 delta ba
 | 
			
		||||
      ZxAd = ZxAd + cplx * TRb; // is this right? YES - Guido used Anti herm Ta's and with bloody wrong sign.
 | 
			
		||||
    }
 | 
			
		||||
    time+=usecond();
 | 
			
		||||
    std::cout << GridLogMessage << "ZxAd took "<<time<< " us"<<std::endl;
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////////////
 | 
			
		||||
    // J(x) = 1 + Sum_k=1..N (-Zac)^k/(k+1)!
 | 
			
		||||
    //////////////////////////////////////
 | 
			
		||||
    time=-usecond();
 | 
			
		||||
    X=1.0; 
 | 
			
		||||
    JxAd = X;
 | 
			
		||||
    mZxAd = (-1.0)*ZxAd; 
 | 
			
		||||
@@ -193,10 +202,13 @@ public:
 | 
			
		||||
      kpfac = kpfac /(k+1);
 | 
			
		||||
      JxAd = JxAd + X * kpfac;
 | 
			
		||||
    }
 | 
			
		||||
    time+=usecond();
 | 
			
		||||
    std::cout << GridLogMessage << "Jx took "<<time<< " us"<<std::endl;
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////////////
 | 
			
		||||
    // dJ(x)/dxe
 | 
			
		||||
    //////////////////////////////////////
 | 
			
		||||
    time=-usecond();
 | 
			
		||||
    std::vector<AdjMatrixField>  dJdX;    dJdX.resize(8,grid);
 | 
			
		||||
    AdjMatrixField tbXn(grid);
 | 
			
		||||
    AdjMatrixField sumXtbX(grid);
 | 
			
		||||
@@ -220,12 +232,17 @@ public:
 | 
			
		||||
      }
 | 
			
		||||
      dJdX[b] = -dt2; 
 | 
			
		||||
    }
 | 
			
		||||
    time+=usecond();
 | 
			
		||||
    std::cout << GridLogMessage << "dJx took "<<time<< " us"<<std::endl;
 | 
			
		||||
    /////////////////////////////////////////////////////////////////
 | 
			
		||||
    // Mask Umu for this link
 | 
			
		||||
    /////////////////////////////////////////////////////////////////
 | 
			
		||||
    time=-usecond();
 | 
			
		||||
    PlaqL = Ident;
 | 
			
		||||
    PlaqR = Utmp*adj(Cmu);
 | 
			
		||||
    ComputeNxy(PlaqL,PlaqR,NxxAd);
 | 
			
		||||
    time+=usecond();
 | 
			
		||||
    std::cout << GridLogMessage << "ComputeNxy took "<<time<< " us"<<std::endl;
 | 
			
		||||
    
 | 
			
		||||
    ////////////////////////////
 | 
			
		||||
    // Mab
 | 
			
		||||
@@ -236,8 +253,12 @@ public:
 | 
			
		||||
    /////////////////////////
 | 
			
		||||
    // invert the 8x8
 | 
			
		||||
    /////////////////////////
 | 
			
		||||
    time=-usecond();
 | 
			
		||||
    MpAdInv = Inverse(MpAd);
 | 
			
		||||
    time+=usecond();
 | 
			
		||||
    std::cout << GridLogMessage << "MpAdInv took "<<time<< " us"<<std::endl;
 | 
			
		||||
    
 | 
			
		||||
    RealD t3a = usecond();
 | 
			
		||||
    /////////////////////////////////////////////////////////////////
 | 
			
		||||
    // Nxx Mp^-1
 | 
			
		||||
    /////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -283,6 +304,7 @@ public:
 | 
			
		||||
    GaugeField Fdet2(grid);
 | 
			
		||||
    GaugeLinkField Fdet_pol(grid); // one polarisation
 | 
			
		||||
 | 
			
		||||
    RealD t4 = usecond();
 | 
			
		||||
    for(int nu=0;nu<Nd;nu++){
 | 
			
		||||
 | 
			
		||||
      if (nu!=mu) {
 | 
			
		||||
@@ -291,20 +313,29 @@ public:
 | 
			
		||||
	//    |  |
 | 
			
		||||
	//    x==    // nu polarisation -- clockwise
 | 
			
		||||
 | 
			
		||||
	time=-usecond();
 | 
			
		||||
	PlaqL=Ident;
 | 
			
		||||
 | 
			
		||||
	PlaqR=(-rho)*Gimpl::CovShiftForward(Umu[nu], nu,
 | 
			
		||||
 	       Gimpl::CovShiftForward(Umu[mu], mu,
 | 
			
		||||
	         Gimpl::CovShiftBackward(Umu[nu], nu,
 | 
			
		||||
		   Gimpl::CovShiftIdentityBackward(Utmp, mu))));
 | 
			
		||||
	time+=usecond();
 | 
			
		||||
	std::cout << GridLogMessage << "PlaqLR took "<<time<< " us"<<std::endl;
 | 
			
		||||
 | 
			
		||||
	time=-usecond();
 | 
			
		||||
	dJdXe_nMpInv_y =   dJdXe_nMpInv;
 | 
			
		||||
	ComputeNxy(PlaqL,PlaqR,Nxy);
 | 
			
		||||
	Fdet1_nu = transpose(Nxy)*dJdXe_nMpInv_y;
 | 
			
		||||
	time+=usecond();
 | 
			
		||||
	std::cout << GridLogMessage << "ComputeNxy (occurs 6x) took "<<time<< " us"<<std::endl;
 | 
			
		||||
 | 
			
		||||
	time=-usecond();
 | 
			
		||||
	PlaqR=(-1.0)*PlaqR;
 | 
			
		||||
	Compute_MpInvJx_dNxxdSy(PlaqL,PlaqR,MpInvJx,FdetV);
 | 
			
		||||
	Fdet2_nu = FdetV;
 | 
			
		||||
	time+=usecond();
 | 
			
		||||
	std::cout << GridLogMessage << "Compute_MpInvJx_dNxxSy (occurs 6x) took "<<time<< " us"<<std::endl;
 | 
			
		||||
	
 | 
			
		||||
	//    x==
 | 
			
		||||
	//    |  |
 | 
			
		||||
@@ -416,6 +447,7 @@ public:
 | 
			
		||||
	
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    RealD t5 = usecond();
 | 
			
		||||
 | 
			
		||||
    Fdet1_mu = Fdet1_mu + transpose(NxxAd)*dJdXe_nMpInv;
 | 
			
		||||
 | 
			
		||||
@@ -423,6 +455,13 @@ public:
 | 
			
		||||
    InsertForce(Fdet2,Fdet2_mu,mu);
 | 
			
		||||
 | 
			
		||||
    force= (-0.5)*( Fdet1 + Fdet2);
 | 
			
		||||
    RealD t1 = usecond();
 | 
			
		||||
    std::cout << GridLogMessage << " logDetJacobianForce level took "<<t1-t0<<" us "<<std::endl;
 | 
			
		||||
    std::cout << GridLogMessage << " logDetJacobianForce t3-t0 "<<t3a-t0<<" us "<<std::endl;
 | 
			
		||||
    std::cout << GridLogMessage << " logDetJacobianForce t4-t3 dJdXe_nMpInv "<<t4-t3a<<" us "<<std::endl;
 | 
			
		||||
    std::cout << GridLogMessage << " logDetJacobianForce t5-t4 mu nu loop "<<t5-t4<<" us "<<std::endl;
 | 
			
		||||
    std::cout << GridLogMessage << " logDetJacobianForce t1-t5 "<<t1-t5<<" us "<<std::endl;
 | 
			
		||||
    std::cout << GridLogMessage << " logDetJacobianForce level took "<<t1-t0<<" us "<<std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  RealD logDetJacobianLevel(const GaugeField &U,int smr)
 | 
			
		||||
  {
 | 
			
		||||
@@ -696,10 +735,10 @@ private:
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
  /* Standard constructor */
 | 
			
		||||
  SmearedConfigurationMasked(GridCartesian* _UGrid, unsigned int Nsmear, Smear_Stout<Gimpl>& Stout,bool domask=false)
 | 
			
		||||
  SmearedConfigurationMasked(GridCartesian* _UGrid, unsigned int Nsmear, Smear_Stout<Gimpl>& Stout)
 | 
			
		||||
    : SmearedConfiguration<Gimpl>(_UGrid, Nsmear,Stout)
 | 
			
		||||
  {
 | 
			
		||||
    if(domask) assert(Nsmear%(2*Nd)==0); // Or multiply by 8??
 | 
			
		||||
    assert(Nsmear%(2*Nd)==0); // Or multiply by 8??
 | 
			
		||||
 | 
			
		||||
    // was resized in base class
 | 
			
		||||
    assert(this->SmearedSet.size()==Nsmear);
 | 
			
		||||
@@ -712,7 +751,6 @@ public:
 | 
			
		||||
    for (unsigned int i = 0; i < this->smearingLevels; ++i) {
 | 
			
		||||
 | 
			
		||||
      masks.push_back(*(new LatticeLorentzComplex(_UGrid)));
 | 
			
		||||
      if (domask) {
 | 
			
		||||
 | 
			
		||||
      int mu= (i/2) %Nd;
 | 
			
		||||
      int cb= (i%2);
 | 
			
		||||
@@ -727,11 +765,6 @@ public:
 | 
			
		||||
      setCheckerboard(tmp,tmpcb);
 | 
			
		||||
      PokeIndex<LorentzIndex>(masks[i],tmp, mu);
 | 
			
		||||
	
 | 
			
		||||
      } else {
 | 
			
		||||
	for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
	  PokeIndex<LorentzIndex>(masks[i],one, mu);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    delete UrbGrid;
 | 
			
		||||
  }
 | 
			
		||||
@@ -764,10 +797,14 @@ public:
 | 
			
		||||
        tmp_mu = peekLorentz(*this->ThinLinks, mu) * peekLorentz(force, mu);
 | 
			
		||||
        pokeLorentz(SigmaTilde, tmp_mu, mu);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      double end = usecond();
 | 
			
		||||
      double time = (end - start)/ 1e3;
 | 
			
		||||
      std::cout << GridLogMessage << " GaugeConfigurationMasked: Smeared Force chain rule took " << time << " ms" << std::endl;
 | 
			
		||||
 | 
			
		||||
    }  // if smearingLevels = 0 do nothing
 | 
			
		||||
    SigmaTilde=Gimpl::projectForce(SigmaTilde); // Ta
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -2,15 +2,11 @@
 | 
			
		||||
 | 
			
		||||
Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 | 
			
		||||
Source file: ./lib/qcd/action/gauge/WilsonGaugeAction.h
 | 
			
		||||
Source file: ./lib/qcd/action/gauge/JacobianAction.h
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: neo <cossu@post.kek.jp>
 | 
			
		||||
Author: paboyle <paboyle@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
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,59 @@ directory
 | 
			
		||||
 | 
			
		||||
NAMESPACE_BEGIN(Grid);
 | 
			
		||||
 | 
			
		||||
template<int N, class Vec>
 | 
			
		||||
Lattice<iScalar<iScalar<iScalar<Vec> > > > Determinant(const Lattice<iScalar<iScalar<iMatrix<Vec, N> > > > &Umu)
 | 
			
		||||
{
 | 
			
		||||
  GridBase *grid=Umu.Grid();
 | 
			
		||||
  auto lvol = grid->lSites();
 | 
			
		||||
  Lattice<iScalar<iScalar<iScalar<Vec> > > > ret(grid);
 | 
			
		||||
 | 
			
		||||
  autoView(Umu_v,Umu,CpuRead);
 | 
			
		||||
  autoView(ret_v,ret,CpuWrite);
 | 
			
		||||
  thread_for(site,lvol,{
 | 
			
		||||
    Eigen::MatrixXcd EigenU = Eigen::MatrixXcd::Zero(N,N);
 | 
			
		||||
    Coordinate lcoor;
 | 
			
		||||
    grid->LocalIndexToLocalCoor(site, lcoor);
 | 
			
		||||
    iScalar<iScalar<iMatrix<ComplexD, N> > > Us;
 | 
			
		||||
    peekLocalSite(Us, Umu_v, lcoor);
 | 
			
		||||
    for(int i=0;i<N;i++){
 | 
			
		||||
      for(int j=0;j<N;j++){
 | 
			
		||||
	EigenU(i,j) = Us()()(i,j);
 | 
			
		||||
      }}
 | 
			
		||||
    ComplexD detD  = EigenU.determinant();
 | 
			
		||||
    typename Vec::scalar_type det(detD.real(),detD.imag());
 | 
			
		||||
    pokeLocalSite(det,ret_v,lcoor);
 | 
			
		||||
  });
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<int N, class Vec>
 | 
			
		||||
static void ProjectSUn(Lattice<iScalar<iScalar<iMatrix<Vec, N> > > > &Umu)
 | 
			
		||||
{
 | 
			
		||||
  Umu      = ProjectOnGroup(Umu);
 | 
			
		||||
  auto det = Determinant(Umu);
 | 
			
		||||
 | 
			
		||||
  det = conjugate(det);
 | 
			
		||||
 | 
			
		||||
  for(int i=0;i<N;i++){
 | 
			
		||||
    auto element = PeekIndex<ColourIndex>(Umu,N-1,i);
 | 
			
		||||
    element = element * det;
 | 
			
		||||
    PokeIndex<ColourIndex>(Umu,element,Nc-1,i);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
template<int N,class Vec>
 | 
			
		||||
static void ProjectSUn(Lattice<iVector<iScalar<iMatrix<Vec, N> >,Nd> > &U)
 | 
			
		||||
{
 | 
			
		||||
  GridBase *grid=U.Grid();
 | 
			
		||||
  // Reunitarise
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    auto Umu = PeekIndex<LorentzIndex>(U,mu);
 | 
			
		||||
    Umu      = ProjectOnGroup(Umu);
 | 
			
		||||
    ProjectSUn(Umu);
 | 
			
		||||
    PokeIndex<LorentzIndex>(U,Umu,mu);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <int ncolour>
 | 
			
		||||
class SU {
 | 
			
		||||
public:
 | 
			
		||||
@@ -741,8 +794,14 @@ public:
 | 
			
		||||
    typedef Lattice<vMatrixType> LatticeMatrixType;
 | 
			
		||||
 | 
			
		||||
    LatticeMatrixType Umu(out.Grid());
 | 
			
		||||
    LatticeMatrixType tmp(out.Grid());
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
      LieRandomize(pRNG, Umu, 1.0);
 | 
			
		||||
      //      LieRandomize(pRNG, Umu, 1.0);
 | 
			
		||||
      //      PokeIndex<LorentzIndex>(out, Umu, mu);
 | 
			
		||||
      gaussian(pRNG,Umu);
 | 
			
		||||
      tmp = Ta(Umu);
 | 
			
		||||
      taExp(tmp,Umu);
 | 
			
		||||
      ProjectSUn(Umu);
 | 
			
		||||
      PokeIndex<LorentzIndex>(out, Umu, mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -798,30 +857,6 @@ public:
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<int N>
 | 
			
		||||
LatticeComplexD Determinant(const Lattice<iScalar<iScalar<iMatrix<vComplexD, N> > > > &Umu)
 | 
			
		||||
{
 | 
			
		||||
  GridBase *grid=Umu.Grid();
 | 
			
		||||
  auto lvol = grid->lSites();
 | 
			
		||||
  LatticeComplexD ret(grid);
 | 
			
		||||
 | 
			
		||||
  autoView(Umu_v,Umu,CpuRead);
 | 
			
		||||
  autoView(ret_v,ret,CpuWrite);
 | 
			
		||||
  thread_for(site,lvol,{
 | 
			
		||||
    Eigen::MatrixXcd EigenU = Eigen::MatrixXcd::Zero(N,N);
 | 
			
		||||
    Coordinate lcoor;
 | 
			
		||||
    grid->LocalIndexToLocalCoor(site, lcoor);
 | 
			
		||||
    iScalar<iScalar<iMatrix<ComplexD, N> > > Us;
 | 
			
		||||
    peekLocalSite(Us, Umu_v, lcoor);
 | 
			
		||||
    for(int i=0;i<N;i++){
 | 
			
		||||
      for(int j=0;j<N;j++){
 | 
			
		||||
	EigenU(i,j) = Us()()(i,j);
 | 
			
		||||
      }}
 | 
			
		||||
    ComplexD det = EigenU.determinant();
 | 
			
		||||
    pokeLocalSite(det,ret_v,lcoor);
 | 
			
		||||
  });
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
template<int N>
 | 
			
		||||
Lattice<iScalar<iScalar<iMatrix<vComplexD, N> > > > Inverse(const Lattice<iScalar<iScalar<iMatrix<vComplexD, N> > > > &Umu)
 | 
			
		||||
{
 | 
			
		||||
@@ -851,32 +886,6 @@ Lattice<iScalar<iScalar<iMatrix<vComplexD, N> > > > Inverse(const Lattice<iScala
 | 
			
		||||
  });
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
template<int N>
 | 
			
		||||
static void ProjectSUn(Lattice<iScalar<iScalar<iMatrix<vComplexD, N> > > > &Umu)
 | 
			
		||||
{
 | 
			
		||||
  Umu      = ProjectOnGroup(Umu);
 | 
			
		||||
  auto det = Determinant(Umu);
 | 
			
		||||
 | 
			
		||||
  det = conjugate(det);
 | 
			
		||||
 | 
			
		||||
  for(int i=0;i<N;i++){
 | 
			
		||||
    auto element = PeekIndex<ColourIndex>(Umu,N-1,i);
 | 
			
		||||
    element = element * det;
 | 
			
		||||
    PokeIndex<ColourIndex>(Umu,element,Nc-1,i);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
template<int N>
 | 
			
		||||
static void ProjectSUn(Lattice<iVector<iScalar<iMatrix<vComplexD, N> >,Nd> > &U)
 | 
			
		||||
{
 | 
			
		||||
  GridBase *grid=U.Grid();
 | 
			
		||||
  // Reunitarise
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    auto Umu = PeekIndex<LorentzIndex>(U,mu);
 | 
			
		||||
    Umu      = ProjectOnGroup(Umu);
 | 
			
		||||
    ProjectSUn(Umu);
 | 
			
		||||
    PokeIndex<LorentzIndex>(U,Umu,mu);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
// Explicit specialisation for SU(3).
 | 
			
		||||
// Explicit specialisation for SU(3).
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
BREW=/opt/local/
 | 
			
		||||
MPICXX=mpicxx CXX=c++-12 ../../configure --enable-simd=GEN --enable-comms=mpi-auto --enable-unified=yes --prefix $HOME/QCD/GridInstall --with-lime=/Users/peterboyle/QCD/SciDAC/install/ --with-openssl=$BREW --disable-fermion-reps --disable-gparity 
 | 
			
		||||
MPICXX=mpicxx CXX=c++-12 ../../configure --enable-simd=GEN --enable-comms=mpi-auto --enable-unified=yes --prefix $HOME/QCD/GridInstall --with-lime=/Users/peterboyle/QCD/SciDAC/install/ --with-openssl=$BREW --disable-fermion-reps --disable-gparity --disable-debug
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,9 +32,12 @@ Author: Peter Boyle <pboyle@bnl.gov>
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
 | 
			
		||||
typedef MobiusFermionD FermionAction;
 | 
			
		||||
typedef WilsonImplD FimplD;
 | 
			
		||||
typedef WilsonImplD FermionImplPolicy;
 | 
			
		||||
 | 
			
		||||
template<class Gimpl>
 | 
			
		||||
void ForceTest(Action<LatticeGaugeField> &action,SmearedConfigurationMasked<PeriodicGimplR> & smU,MomentumFilterBase<LatticeGaugeField> &Filter)
 | 
			
		||||
void ForceTest(Action<LatticeGaugeField> &action,ConfigurationBase<LatticeGaugeField> & smU,MomentumFilterBase<LatticeGaugeField> &Filter)
 | 
			
		||||
{
 | 
			
		||||
  LatticeGaugeField U = smU.get_U(false); // unsmeared config
 | 
			
		||||
  GridBase *UGrid = U.Grid();
 | 
			
		||||
@@ -51,14 +54,14 @@ void ForceTest(Action<LatticeGaugeField> &action,SmearedConfigurationMasked<Peri
 | 
			
		||||
  std::cout << GridLogMessage << " Force test for "<<action.action_name()<<std::endl;
 | 
			
		||||
  std::cout << GridLogMessage << "*********************************************************"<<std::endl;
 | 
			
		||||
  
 | 
			
		||||
  RealD eps=0.005;
 | 
			
		||||
  RealD eps=0.01;
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
 | 
			
		||||
  std::cout << GridLogMessage << " Refresh "<<action.action_name()<<std::endl;
 | 
			
		||||
  std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
 | 
			
		||||
  
 | 
			
		||||
  Gimpl::generate_momenta(P,sRNG,RNG4);
 | 
			
		||||
  Filter.applyFilter(P);
 | 
			
		||||
  //  Filter.applyFilter(P);
 | 
			
		||||
 | 
			
		||||
  action.refresh(smU,sRNG,RNG4);
 | 
			
		||||
 | 
			
		||||
@@ -76,7 +79,7 @@ void ForceTest(Action<LatticeGaugeField> &action,SmearedConfigurationMasked<Peri
 | 
			
		||||
  std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
 | 
			
		||||
  action.deriv(smU,UdSdU);
 | 
			
		||||
  UdSdU = Ta(UdSdU);
 | 
			
		||||
  Filter.applyFilter(UdSdU);
 | 
			
		||||
  //  Filter.applyFilter(UdSdU);
 | 
			
		||||
 | 
			
		||||
  DumpSliceNorm("Force",UdSdU,Nd-1);
 | 
			
		||||
  
 | 
			
		||||
@@ -94,7 +97,7 @@ void ForceTest(Action<LatticeGaugeField> &action,SmearedConfigurationMasked<Peri
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    auto UdSdUmu = PeekIndex<LorentzIndex>(UdSdU,mu);
 | 
			
		||||
    Pmu= PeekIndex<LorentzIndex>(P,mu);
 | 
			
		||||
    dS = dS - trace(Pmu*UdSdUmu)*eps*2.0*2.0;
 | 
			
		||||
    dS = dS - trace(Pmu*UdSdUmu)*eps*2.0*HMC_MOMENTUM_DENOMINATOR;
 | 
			
		||||
  }
 | 
			
		||||
  ComplexD dSpred    = sum(dS);
 | 
			
		||||
  RealD diff =  S2-S1-dSpred.real();
 | 
			
		||||
@@ -125,7 +128,10 @@ int main (int argc, char ** argv)
 | 
			
		||||
  const int Ls=12;
 | 
			
		||||
  const int Nt = latt_size[3];
 | 
			
		||||
  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
 | 
			
		||||
  GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
 | 
			
		||||
  GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
 | 
			
		||||
  GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  ///////////////////// Gauge Field and Gauge Forces ////////////////////////////
 | 
			
		||||
  LatticeGaugeField U(UGrid);
 | 
			
		||||
@@ -141,17 +147,40 @@ int main (int argc, char ** argv)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  RealD beta=6.0;
 | 
			
		||||
  WilsonGaugeActionR  PlaqAction(beta);
 | 
			
		||||
  IwasakiGaugeActionR RectAction(beta);
 | 
			
		||||
  WilsonGaugeActionR  PlaqAction(6.0);
 | 
			
		||||
  IwasakiGaugeActionR RectAction(2.13);
 | 
			
		||||
  PlaqAction.is_smeared = true;  
 | 
			
		||||
  RectAction.is_smeared = true;  
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  // Fermion Action
 | 
			
		||||
  ////////////////////////////////////
 | 
			
		||||
  RealD mass=0.01; 
 | 
			
		||||
  RealD pvmass=1.0; 
 | 
			
		||||
  RealD M5=1.8; 
 | 
			
		||||
  RealD b=1.5;
 | 
			
		||||
  RealD c=0.5;
 | 
			
		||||
  
 | 
			
		||||
  // Double versions
 | 
			
		||||
  std::vector<Complex> boundary = {1,1,1,-1};
 | 
			
		||||
  FermionAction::ImplParams Params(boundary);
 | 
			
		||||
  FermionAction DdwfPeriodic(U,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c,Params);
 | 
			
		||||
  FermionAction PVPeriodic  (U,*FGrid,*FrbGrid,*UGrid,*UrbGrid,pvmass,M5,b,c,Params);
 | 
			
		||||
 | 
			
		||||
  double StoppingCondition = 1.0e-8;
 | 
			
		||||
  double MaxCGIterations = 50000;
 | 
			
		||||
  ConjugateGradient<LatticeFermion>  CG(StoppingCondition,MaxCGIterations);
 | 
			
		||||
 | 
			
		||||
  TwoFlavourRatioPseudoFermionAction<FimplD> Nf2(PVPeriodic, DdwfPeriodic,CG,CG);
 | 
			
		||||
  Nf2.is_smeared = true;  
 | 
			
		||||
  
 | 
			
		||||
  ////////////////////////////////////////////////
 | 
			
		||||
  // Plaquette only FTHMC smearer
 | 
			
		||||
  ////////////////////////////////////////////////
 | 
			
		||||
  double rho = 0.1;
 | 
			
		||||
  Smear_Stout<PeriodicGimplR> Smearer(rho);
 | 
			
		||||
  SmearedConfigurationMasked<PeriodicGimplR> SmartConfig(UGrid,2*Nd,Smearer,true);
 | 
			
		||||
  SmearedConfigurationMasked<PeriodicGimplR> SmartConfig(UGrid,2*Nd,Smearer);
 | 
			
		||||
  SmearedConfiguration<PeriodicGimplR> StoutConfig(UGrid,1,Smearer);
 | 
			
		||||
 | 
			
		||||
  JacobianAction<PeriodicGimplR> Jacobian(&SmartConfig);
 | 
			
		||||
  
 | 
			
		||||
@@ -159,12 +188,32 @@ int main (int argc, char ** argv)
 | 
			
		||||
  // Run some tests
 | 
			
		||||
  ////////////////////////////////////////////////
 | 
			
		||||
  MomentumFilterNone<LatticeGaugeField> FilterNone;
 | 
			
		||||
 | 
			
		||||
  std::cout << " *********  FIELD TRANSFORM SMEARING ***** "<<std::endl;
 | 
			
		||||
 | 
			
		||||
  SmartConfig.set_Field(U);
 | 
			
		||||
  ForceTest<GimplTypesR>(PlaqAction,SmartConfig,FilterNone);
 | 
			
		||||
 | 
			
		||||
  SmartConfig.set_Field(U);
 | 
			
		||||
  ForceTest<GimplTypesR>(RectAction,SmartConfig,FilterNone);
 | 
			
		||||
 | 
			
		||||
  SmartConfig.set_Field(U);
 | 
			
		||||
  ForceTest<GimplTypesR>(Jacobian,SmartConfig,FilterNone);
 | 
			
		||||
 | 
			
		||||
  SmartConfig.set_Field(U);
 | 
			
		||||
  ForceTest<GimplTypesR>(Nf2,SmartConfig,FilterNone);
 | 
			
		||||
 | 
			
		||||
  std::cout << " *********    STOUT SMEARING ***** "<<std::endl;
 | 
			
		||||
 | 
			
		||||
  StoutConfig.set_Field(U);
 | 
			
		||||
  ForceTest<GimplTypesR>(PlaqAction,StoutConfig,FilterNone);
 | 
			
		||||
 | 
			
		||||
  StoutConfig.set_Field(U);
 | 
			
		||||
  ForceTest<GimplTypesR>(RectAction,StoutConfig,FilterNone);
 | 
			
		||||
  
 | 
			
		||||
  StoutConfig.set_Field(U);
 | 
			
		||||
  ForceTest<GimplTypesR>(Nf2,StoutConfig,FilterNone);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user