mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Merge branch 'develop' into hisq_fat_links
This commit is contained in:
commit
8bb078db25
@ -44,7 +44,7 @@ public:
|
|||||||
ConfigurationBase() {}
|
ConfigurationBase() {}
|
||||||
virtual ~ConfigurationBase() {}
|
virtual ~ConfigurationBase() {}
|
||||||
virtual void set_Field(Field& U) =0;
|
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_SmearedU() =0;
|
||||||
virtual Field &get_U(bool smeared = false) = 0;
|
virtual Field &get_U(bool smeared = false) = 0;
|
||||||
};
|
};
|
||||||
|
@ -284,11 +284,12 @@ public:
|
|||||||
|
|
||||||
TheIntegrator.print_timer();
|
TheIntegrator.print_timer();
|
||||||
|
|
||||||
|
TheIntegrator.Smearer.set_Field(Ucur);
|
||||||
for (int obs = 0; obs < Observables.size(); obs++) {
|
for (int obs = 0; obs < Observables.size(); obs++) {
|
||||||
std::cout << GridLogDebug << "Observables # " << obs << std::endl;
|
std::cout << GridLogDebug << "Observables # " << obs << std::endl;
|
||||||
std::cout << GridLogDebug << "Observables total " << Observables.size() << std::endl;
|
std::cout << GridLogDebug << "Observables total " << Observables.size() << std::endl;
|
||||||
std::cout << GridLogDebug << "Observables pointer " << Observables[obs] << 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;
|
std::cout << GridLogHMC << ":::::::::::::::::::::::::::::::::::::::::::" << std::endl;
|
||||||
}
|
}
|
||||||
|
@ -35,13 +35,16 @@ class CheckpointerParameters : Serializable {
|
|||||||
public:
|
public:
|
||||||
GRID_SERIALIZABLE_CLASS_MEMBERS(CheckpointerParameters,
|
GRID_SERIALIZABLE_CLASS_MEMBERS(CheckpointerParameters,
|
||||||
std::string, config_prefix,
|
std::string, config_prefix,
|
||||||
|
std::string, smeared_prefix,
|
||||||
std::string, rng_prefix,
|
std::string, rng_prefix,
|
||||||
int, saveInterval,
|
int, saveInterval,
|
||||||
|
bool, saveSmeared,
|
||||||
std::string, format, );
|
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")
|
int savemodulo = 1, const std::string &f = "IEEE64BIG")
|
||||||
: config_prefix(cf),
|
: config_prefix(cf),
|
||||||
|
smeared_prefix(sf),
|
||||||
rng_prefix(rn),
|
rng_prefix(rn),
|
||||||
saveInterval(savemodulo),
|
saveInterval(savemodulo),
|
||||||
format(f){};
|
format(f){};
|
||||||
@ -61,13 +64,21 @@ template <class Impl>
|
|||||||
class BaseHmcCheckpointer : public HmcObservable<typename Impl::Field> {
|
class BaseHmcCheckpointer : public HmcObservable<typename Impl::Field> {
|
||||||
public:
|
public:
|
||||||
void build_filenames(int traj, CheckpointerParameters &Params,
|
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;
|
std::ostringstream os;
|
||||||
os << Params.rng_prefix << "." << traj;
|
os << Params.rng_prefix << "." << traj;
|
||||||
rng_file = os.str();
|
rng_file = os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
os << Params.smeared_prefix << "." << traj;
|
||||||
|
smear_file = os.str();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << Params.config_prefix << "." << traj;
|
os << Params.config_prefix << "." << traj;
|
||||||
@ -84,6 +95,11 @@ public:
|
|||||||
}
|
}
|
||||||
virtual void initialize(const CheckpointerParameters &Params) = 0;
|
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,
|
virtual void CheckpointRestore(int traj, typename Impl::Field &U,
|
||||||
GridSerialRNG &sRNG,
|
GridSerialRNG &sRNG,
|
||||||
GridParallelRNG &pRNG) = 0;
|
GridParallelRNG &pRNG) = 0;
|
||||||
|
@ -61,11 +61,14 @@ public:
|
|||||||
fout.close();
|
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) {
|
if ((traj % Params.saveInterval) == 0) {
|
||||||
std::string config, rng;
|
std::string config, rng, smr;
|
||||||
this->build_filenames(traj, Params, config, rng);
|
this->build_filenames(traj, Params, config, smr, rng);
|
||||||
|
|
||||||
uint32_t nersc_csum;
|
uint32_t nersc_csum;
|
||||||
uint32_t scidac_csuma;
|
uint32_t scidac_csuma;
|
||||||
@ -74,9 +77,15 @@ public:
|
|||||||
BinarySimpleUnmunger<sobj_double, sobj> munge;
|
BinarySimpleUnmunger<sobj_double, sobj> munge;
|
||||||
truncate(rng);
|
truncate(rng);
|
||||||
BinaryIO::writeRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb);
|
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);
|
nersc_csum,scidac_csuma,scidac_csumb);
|
||||||
|
|
||||||
std::cout << GridLogMessage << "Written Binary Configuration " << config
|
std::cout << GridLogMessage << "Written Binary Configuration " << config
|
||||||
@ -85,6 +94,18 @@ public:
|
|||||||
<< scidac_csuma <<"/"
|
<< scidac_csuma <<"/"
|
||||||
<< scidac_csumb
|
<< scidac_csumb
|
||||||
<< std::dec << std::endl;
|
<< 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) {
|
GridParallelRNG &pRNG) {
|
||||||
if ((traj % Params.saveInterval) == 0) {
|
if ((traj % Params.saveInterval) == 0) {
|
||||||
std::string config, rng;
|
std::string config, rng, smr;
|
||||||
this->build_filenames(traj, Params, config, rng);
|
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;
|
uint32_t nersc_csum,scidac_csuma,scidac_csumb;
|
||||||
BinaryIO::writeRNG(sRNG, pRNG, rng, 0,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 _IldgWriter(grid->IsBoss());
|
||||||
_IldgWriter.open(config);
|
_IldgWriter.open(config);
|
||||||
_IldgWriter.writeConfiguration<GaugeStats>(U, traj, config, config);
|
_IldgWriter.writeConfiguration<GaugeStats>(SmartConfig.get_U(false), traj, config, config);
|
||||||
_IldgWriter.close();
|
_IldgWriter.close();
|
||||||
|
|
||||||
std::cout << GridLogMessage << "Written ILDG Configuration on " << config
|
std::cout << GridLogMessage << "Written ILDG Configuration on " << config
|
||||||
@ -88,6 +98,21 @@ public:
|
|||||||
<< scidac_csuma<<"/"
|
<< scidac_csuma<<"/"
|
||||||
<< scidac_csumb
|
<< scidac_csumb
|
||||||
<< std::dec << std::endl;
|
<< 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
|
Params.format = "IEEE64BIG"; // fixed, overwrite any other choice
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG,
|
virtual void TrajectoryComplete(int traj,
|
||||||
GridParallelRNG &pRNG) {
|
ConfigurationBase<GaugeField> &SmartConfig,
|
||||||
|
GridSerialRNG &sRNG,
|
||||||
|
GridParallelRNG &pRNG)
|
||||||
|
{
|
||||||
if ((traj % Params.saveInterval) == 0) {
|
if ((traj % Params.saveInterval) == 0) {
|
||||||
std::string config, rng;
|
std::string config, rng, smr;
|
||||||
this->build_filenames(traj, Params, config, rng);
|
this->build_filenames(traj, Params, config, smr, rng);
|
||||||
|
|
||||||
int precision32 = 1;
|
int precision32 = 1;
|
||||||
int tworow = 0;
|
int tworow = 0;
|
||||||
NerscIO::writeRNGState(sRNG, pRNG, rng);
|
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,
|
void CheckpointRestore(int traj, GaugeField &U, GridSerialRNG &sRNG,
|
||||||
GridParallelRNG &pRNG) {
|
GridParallelRNG &pRNG) {
|
||||||
std::string config, rng;
|
std::string config, rng, smr;
|
||||||
this->build_filenames(traj, Params, config, rng);
|
this->build_filenames(traj, Params, config, smr, rng );
|
||||||
this->check_filename(rng);
|
this->check_filename(rng);
|
||||||
this->check_filename(config);
|
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) {
|
GridParallelRNG &pRNG) {
|
||||||
if ((traj % Params.saveInterval) == 0) {
|
if ((traj % Params.saveInterval) == 0) {
|
||||||
std::string config, rng;
|
std::string config, rng,smr;
|
||||||
this->build_filenames(traj, Params, config, rng);
|
this->build_filenames(traj, Params, config, smr, rng);
|
||||||
GridBase *grid = U.Grid();
|
GridBase *grid = SmartConfig.get_U(false).Grid();
|
||||||
uint32_t nersc_csum,scidac_csuma,scidac_csumb;
|
uint32_t nersc_csum,scidac_csuma,scidac_csumb;
|
||||||
BinaryIO::writeRNG(sRNG, pRNG, rng, 0,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 _ScidacWriter(grid->IsBoss());
|
||||||
_ScidacWriter.open(config);
|
_ScidacWriter.open(config);
|
||||||
_ScidacWriter.writeScidacFieldRecord(U, MData);
|
_ScidacWriter.writeScidacFieldRecord(SmartConfig.get_U(false), MData);
|
||||||
_ScidacWriter.close();
|
_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;
|
std::cout << GridLogMessage << "Written Scidac Configuration on " << config << std::endl;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -66,6 +66,7 @@ public:
|
|||||||
template <class FieldImplementation_, class SmearingPolicy, class RepresentationPolicy>
|
template <class FieldImplementation_, class SmearingPolicy, class RepresentationPolicy>
|
||||||
class Integrator {
|
class Integrator {
|
||||||
protected:
|
protected:
|
||||||
|
public:
|
||||||
typedef FieldImplementation_ FieldImplementation;
|
typedef FieldImplementation_ FieldImplementation;
|
||||||
typedef typename FieldImplementation::Field MomentaField; //for readability
|
typedef typename FieldImplementation::Field MomentaField; //for readability
|
||||||
typedef typename FieldImplementation::Field Field;
|
typedef typename FieldImplementation::Field Field;
|
||||||
@ -96,7 +97,6 @@ protected:
|
|||||||
{
|
{
|
||||||
t_P[level] += ep;
|
t_P[level] += ep;
|
||||||
update_P(P, U, level, ep);
|
update_P(P, U, level, ep);
|
||||||
|
|
||||||
std::cout << GridLogIntegrator << "[" << level << "] P " << " dt " << ep << " : t_P " << t_P[level] << std::endl;
|
std::cout << GridLogIntegrator << "[" << level << "] P " << " dt " << ep << " : t_P " << t_P[level] << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,28 +130,20 @@ protected:
|
|||||||
Field force(U.Grid());
|
Field force(U.Grid());
|
||||||
conformable(U.Grid(), Mom.Grid());
|
conformable(U.Grid(), Mom.Grid());
|
||||||
|
|
||||||
Field& Us = Smearer.get_U(as[level].actions.at(a)->is_smeared);
|
|
||||||
double start_force = usecond();
|
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_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();
|
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();
|
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
|
force = FieldImplementation::projectForce(force); // Ta for gauge fields
|
||||||
double end_force = usecond();
|
double end_force = usecond();
|
||||||
|
|
||||||
// DumpSliceNorm("force ",force,Nd-1);
|
|
||||||
MomFilter->applyFilter(force);
|
MomFilter->applyFilter(force);
|
||||||
|
|
||||||
std::cout << GridLogIntegrator << " update_P : Level [" << level <<"]["<<a <<"] "<<name<<" dt "<<ep<< std::endl;
|
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 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;
|
Real impulse_abs = force_abs * ep * HMC_MOMENTUM_DENOMINATOR;
|
||||||
@ -377,14 +369,9 @@ public:
|
|||||||
auto name = as[level].actions.at(actionID)->action_name();
|
auto name = as[level].actions.at(actionID)->action_name();
|
||||||
std::cout << GridLogMessage << "refresh [" << level << "][" << actionID << "] "<<name << std::endl;
|
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_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();
|
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
|
// get gauge field from the SmearingPolicy and
|
||||||
// based on the boolean is_smeared in actionID
|
// 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;
|
std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] action eval " << std::endl;
|
||||||
as[level].actions.at(actionID)->S_timer_start();
|
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();
|
as[level].actions.at(actionID)->S_timer_stop();
|
||||||
std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] H = " << Hterm << std::endl;
|
std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] H = " << Hterm << std::endl;
|
||||||
H += Hterm;
|
H += Hterm;
|
||||||
@ -469,11 +455,10 @@ public:
|
|||||||
for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) {
|
for (int actionID = 0; actionID < as[level].actions.size(); ++actionID) {
|
||||||
// get gauge field from the SmearingPolicy and
|
// get gauge field from the SmearingPolicy and
|
||||||
// based on the boolean is_smeared in actionID
|
// 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;
|
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();
|
as[level].actions.at(actionID)->S_timer_stop();
|
||||||
|
|
||||||
std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] H = " << Hterm << std::endl;
|
std::cout << GridLogMessage << "S [" << level << "][" << actionID << "] H = " << Hterm << std::endl;
|
||||||
|
@ -34,6 +34,13 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
template <class Field>
|
template <class Field>
|
||||||
class HmcObservable {
|
class HmcObservable {
|
||||||
public:
|
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,
|
virtual void TrajectoryComplete(int traj,
|
||||||
Field &U,
|
Field &U,
|
||||||
GridSerialRNG &sRNG,
|
GridSerialRNG &sRNG,
|
||||||
|
@ -42,6 +42,18 @@ public:
|
|||||||
// necessary for HmcObservable compatibility
|
// necessary for HmcObservable compatibility
|
||||||
typedef typename Impl::Field Field;
|
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,
|
void TrajectoryComplete(int traj,
|
||||||
Field &U,
|
Field &U,
|
||||||
GridSerialRNG &sRNG,
|
GridSerialRNG &sRNG,
|
||||||
|
@ -19,13 +19,13 @@ public:
|
|||||||
|
|
||||||
NoSmearing(): ThinLinks(NULL) {}
|
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;
|
return *ThinLinks;
|
||||||
}
|
}
|
||||||
@ -235,7 +235,7 @@ public:
|
|||||||
: smearingLevels(0), StoutSmearing(nullptr), SmearedSet(), ThinLinks(NULL) {}
|
: smearingLevels(0), StoutSmearing(nullptr), SmearedSet(), ThinLinks(NULL) {}
|
||||||
|
|
||||||
// attach the smeared routines to the thin links U and fill the smeared set
|
// 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();
|
double start = usecond();
|
||||||
fill_smearedSet(U);
|
fill_smearedSet(U);
|
||||||
@ -245,7 +245,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//====================================================================
|
//====================================================================
|
||||||
void smeared_force(GaugeField &SigmaTilde) const
|
virtual void smeared_force(GaugeField &SigmaTilde)
|
||||||
{
|
{
|
||||||
if (smearingLevels > 0)
|
if (smearingLevels > 0)
|
||||||
{
|
{
|
||||||
@ -272,14 +272,16 @@ public:
|
|||||||
}
|
}
|
||||||
double end = usecond();
|
double end = usecond();
|
||||||
double time = (end - start)/ 1e3;
|
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
|
} // 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
|
// get the config, thin links by default
|
||||||
if (smeared)
|
if (smeared)
|
||||||
|
@ -131,6 +131,7 @@ public:
|
|||||||
AdjMatrixField X(grid);
|
AdjMatrixField X(grid);
|
||||||
Complex ci(0,1);
|
Complex ci(0,1);
|
||||||
|
|
||||||
|
RealD t0 = usecond();
|
||||||
Ident = ComplexD(1.0);
|
Ident = ComplexD(1.0);
|
||||||
for(int d=0;d<Nd;d++){
|
for(int d=0;d<Nd;d++){
|
||||||
Umu[d] = peekLorentz(U, d);
|
Umu[d] = peekLorentz(U, d);
|
||||||
@ -161,6 +162,8 @@ public:
|
|||||||
// Assemble the N matrix
|
// Assemble the N matrix
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
// Computes ALL the staples -- could compute one only and do it here
|
// Computes ALL the staples -- could compute one only and do it here
|
||||||
|
RealD time;
|
||||||
|
time=-usecond();
|
||||||
this->StoutSmearing->BaseSmear(C, U);
|
this->StoutSmearing->BaseSmear(C, U);
|
||||||
Cmu = peekLorentz(C, mu);
|
Cmu = peekLorentz(C, mu);
|
||||||
|
|
||||||
@ -169,7 +172,10 @@ public:
|
|||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
// Ta so Z lives in Lie algabra
|
// Ta so Z lives in Lie algabra
|
||||||
Zx = Ta(Cmu * adj(Umu[mu]));
|
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
|
// Move Z to the Adjoint Rep == make_adjoint_representation
|
||||||
ZxAd = Zero();
|
ZxAd = Zero();
|
||||||
for(int b=0;b<8;b++) {
|
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
|
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.
|
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)!
|
// J(x) = 1 + Sum_k=1..N (-Zac)^k/(k+1)!
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
time=-usecond();
|
||||||
X=1.0;
|
X=1.0;
|
||||||
JxAd = X;
|
JxAd = X;
|
||||||
mZxAd = (-1.0)*ZxAd;
|
mZxAd = (-1.0)*ZxAd;
|
||||||
@ -193,10 +202,13 @@ public:
|
|||||||
kpfac = kpfac /(k+1);
|
kpfac = kpfac /(k+1);
|
||||||
JxAd = JxAd + X * kpfac;
|
JxAd = JxAd + X * kpfac;
|
||||||
}
|
}
|
||||||
|
time+=usecond();
|
||||||
|
std::cout << GridLogMessage << "Jx took "<<time<< " us"<<std::endl;
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
// dJ(x)/dxe
|
// dJ(x)/dxe
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
time=-usecond();
|
||||||
std::vector<AdjMatrixField> dJdX; dJdX.resize(8,grid);
|
std::vector<AdjMatrixField> dJdX; dJdX.resize(8,grid);
|
||||||
AdjMatrixField tbXn(grid);
|
AdjMatrixField tbXn(grid);
|
||||||
AdjMatrixField sumXtbX(grid);
|
AdjMatrixField sumXtbX(grid);
|
||||||
@ -220,12 +232,17 @@ public:
|
|||||||
}
|
}
|
||||||
dJdX[b] = -dt2;
|
dJdX[b] = -dt2;
|
||||||
}
|
}
|
||||||
|
time+=usecond();
|
||||||
|
std::cout << GridLogMessage << "dJx took "<<time<< " us"<<std::endl;
|
||||||
/////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////
|
||||||
// Mask Umu for this link
|
// Mask Umu for this link
|
||||||
/////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////
|
||||||
|
time=-usecond();
|
||||||
PlaqL = Ident;
|
PlaqL = Ident;
|
||||||
PlaqR = Utmp*adj(Cmu);
|
PlaqR = Utmp*adj(Cmu);
|
||||||
ComputeNxy(PlaqL,PlaqR,NxxAd);
|
ComputeNxy(PlaqL,PlaqR,NxxAd);
|
||||||
|
time+=usecond();
|
||||||
|
std::cout << GridLogMessage << "ComputeNxy took "<<time<< " us"<<std::endl;
|
||||||
|
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
// Mab
|
// Mab
|
||||||
@ -236,8 +253,12 @@ public:
|
|||||||
/////////////////////////
|
/////////////////////////
|
||||||
// invert the 8x8
|
// invert the 8x8
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
|
time=-usecond();
|
||||||
MpAdInv = Inverse(MpAd);
|
MpAdInv = Inverse(MpAd);
|
||||||
|
time+=usecond();
|
||||||
|
std::cout << GridLogMessage << "MpAdInv took "<<time<< " us"<<std::endl;
|
||||||
|
|
||||||
|
RealD t3a = usecond();
|
||||||
/////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////
|
||||||
// Nxx Mp^-1
|
// Nxx Mp^-1
|
||||||
/////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////
|
||||||
@ -283,6 +304,7 @@ public:
|
|||||||
GaugeField Fdet2(grid);
|
GaugeField Fdet2(grid);
|
||||||
GaugeLinkField Fdet_pol(grid); // one polarisation
|
GaugeLinkField Fdet_pol(grid); // one polarisation
|
||||||
|
|
||||||
|
RealD t4 = usecond();
|
||||||
for(int nu=0;nu<Nd;nu++){
|
for(int nu=0;nu<Nd;nu++){
|
||||||
|
|
||||||
if (nu!=mu) {
|
if (nu!=mu) {
|
||||||
@ -291,20 +313,29 @@ public:
|
|||||||
// | |
|
// | |
|
||||||
// x== // nu polarisation -- clockwise
|
// x== // nu polarisation -- clockwise
|
||||||
|
|
||||||
|
time=-usecond();
|
||||||
PlaqL=Ident;
|
PlaqL=Ident;
|
||||||
|
|
||||||
PlaqR=(-rho)*Gimpl::CovShiftForward(Umu[nu], nu,
|
PlaqR=(-rho)*Gimpl::CovShiftForward(Umu[nu], nu,
|
||||||
Gimpl::CovShiftForward(Umu[mu], mu,
|
Gimpl::CovShiftForward(Umu[mu], mu,
|
||||||
Gimpl::CovShiftBackward(Umu[nu], nu,
|
Gimpl::CovShiftBackward(Umu[nu], nu,
|
||||||
Gimpl::CovShiftIdentityBackward(Utmp, mu))));
|
Gimpl::CovShiftIdentityBackward(Utmp, mu))));
|
||||||
|
time+=usecond();
|
||||||
|
std::cout << GridLogMessage << "PlaqLR took "<<time<< " us"<<std::endl;
|
||||||
|
|
||||||
|
time=-usecond();
|
||||||
dJdXe_nMpInv_y = dJdXe_nMpInv;
|
dJdXe_nMpInv_y = dJdXe_nMpInv;
|
||||||
ComputeNxy(PlaqL,PlaqR,Nxy);
|
ComputeNxy(PlaqL,PlaqR,Nxy);
|
||||||
Fdet1_nu = transpose(Nxy)*dJdXe_nMpInv_y;
|
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;
|
PlaqR=(-1.0)*PlaqR;
|
||||||
Compute_MpInvJx_dNxxdSy(PlaqL,PlaqR,MpInvJx,FdetV);
|
Compute_MpInvJx_dNxxdSy(PlaqL,PlaqR,MpInvJx,FdetV);
|
||||||
Fdet2_nu = FdetV;
|
Fdet2_nu = FdetV;
|
||||||
|
time+=usecond();
|
||||||
|
std::cout << GridLogMessage << "Compute_MpInvJx_dNxxSy (occurs 6x) took "<<time<< " us"<<std::endl;
|
||||||
|
|
||||||
// x==
|
// x==
|
||||||
// | |
|
// | |
|
||||||
@ -416,6 +447,7 @@ public:
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
RealD t5 = usecond();
|
||||||
|
|
||||||
Fdet1_mu = Fdet1_mu + transpose(NxxAd)*dJdXe_nMpInv;
|
Fdet1_mu = Fdet1_mu + transpose(NxxAd)*dJdXe_nMpInv;
|
||||||
|
|
||||||
@ -423,6 +455,13 @@ public:
|
|||||||
InsertForce(Fdet2,Fdet2_mu,mu);
|
InsertForce(Fdet2,Fdet2_mu,mu);
|
||||||
|
|
||||||
force= (-0.5)*( Fdet1 + Fdet2);
|
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)
|
RealD logDetJacobianLevel(const GaugeField &U,int smr)
|
||||||
{
|
{
|
||||||
@ -696,10 +735,10 @@ private:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
/* Standard constructor */
|
/* 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)
|
: 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
|
// was resized in base class
|
||||||
assert(this->SmearedSet.size()==Nsmear);
|
assert(this->SmearedSet.size()==Nsmear);
|
||||||
@ -712,7 +751,6 @@ public:
|
|||||||
for (unsigned int i = 0; i < this->smearingLevels; ++i) {
|
for (unsigned int i = 0; i < this->smearingLevels; ++i) {
|
||||||
|
|
||||||
masks.push_back(*(new LatticeLorentzComplex(_UGrid)));
|
masks.push_back(*(new LatticeLorentzComplex(_UGrid)));
|
||||||
if (domask) {
|
|
||||||
|
|
||||||
int mu= (i/2) %Nd;
|
int mu= (i/2) %Nd;
|
||||||
int cb= (i%2);
|
int cb= (i%2);
|
||||||
@ -727,11 +765,6 @@ public:
|
|||||||
setCheckerboard(tmp,tmpcb);
|
setCheckerboard(tmp,tmpcb);
|
||||||
PokeIndex<LorentzIndex>(masks[i],tmp, mu);
|
PokeIndex<LorentzIndex>(masks[i],tmp, mu);
|
||||||
|
|
||||||
} else {
|
|
||||||
for(int mu=0;mu<Nd;mu++){
|
|
||||||
PokeIndex<LorentzIndex>(masks[i],one, mu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
delete UrbGrid;
|
delete UrbGrid;
|
||||||
}
|
}
|
||||||
@ -764,10 +797,14 @@ public:
|
|||||||
tmp_mu = peekLorentz(*this->ThinLinks, mu) * peekLorentz(force, mu);
|
tmp_mu = peekLorentz(*this->ThinLinks, mu) * peekLorentz(force, mu);
|
||||||
pokeLorentz(SigmaTilde, tmp_mu, mu);
|
pokeLorentz(SigmaTilde, tmp_mu, mu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double end = usecond();
|
double end = usecond();
|
||||||
double time = (end - start)/ 1e3;
|
double time = (end - start)/ 1e3;
|
||||||
std::cout << GridLogMessage << " GaugeConfigurationMasked: Smeared Force chain rule took " << time << " ms" << std::endl;
|
std::cout << GridLogMessage << " GaugeConfigurationMasked: Smeared Force chain rule took " << time << " ms" << std::endl;
|
||||||
|
|
||||||
} // if smearingLevels = 0 do nothing
|
} // if smearingLevels = 0 do nothing
|
||||||
|
SigmaTilde=Gimpl::projectForce(SigmaTilde); // Ta
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -2,15 +2,11 @@
|
|||||||
|
|
||||||
Grid physics library, www.github.com/paboyle/Grid
|
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
|
Copyright (C) 2015
|
||||||
|
|
||||||
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
|
|
||||||
Author: Peter Boyle <paboyle@ph.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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -34,6 +34,59 @@ directory
|
|||||||
|
|
||||||
NAMESPACE_BEGIN(Grid);
|
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>
|
template <int ncolour>
|
||||||
class SU {
|
class SU {
|
||||||
public:
|
public:
|
||||||
@ -741,8 +794,14 @@ public:
|
|||||||
typedef Lattice<vMatrixType> LatticeMatrixType;
|
typedef Lattice<vMatrixType> LatticeMatrixType;
|
||||||
|
|
||||||
LatticeMatrixType Umu(out.Grid());
|
LatticeMatrixType Umu(out.Grid());
|
||||||
|
LatticeMatrixType tmp(out.Grid());
|
||||||
for (int mu = 0; mu < Nd; mu++) {
|
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);
|
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>
|
template<int N>
|
||||||
Lattice<iScalar<iScalar<iMatrix<vComplexD, N> > > > Inverse(const Lattice<iScalar<iScalar<iMatrix<vComplexD, N> > > > &Umu)
|
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;
|
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).
|
||||||
// Explicit specialisation for SU(3).
|
// Explicit specialisation for SU(3).
|
||||||
static void
|
static void
|
||||||
|
46
systems/Sunspot/benchmarks/bench.pbs
Normal file
46
systems/Sunspot/benchmarks/bench.pbs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#PBS -l select=1:system=sunspot,place=scatter
|
||||||
|
#PBS -A LatticeQCD_aesp_CNDA
|
||||||
|
#PBS -l walltime=01:00:00
|
||||||
|
#PBS -N dwf
|
||||||
|
#PBS -k doe
|
||||||
|
|
||||||
|
HDIR=/home/paboyle/
|
||||||
|
module use /soft/testing/modulefiles/
|
||||||
|
module load intel-UMD23.05.25593.11/23.05.25593.11
|
||||||
|
module load tools/pti-gpu
|
||||||
|
export LD_LIBRARY_PATH=$HDIR/tools/lib64:$LD_LIBRARY_PATH
|
||||||
|
export PATH=$HDIR/tools/bin:$PATH
|
||||||
|
|
||||||
|
export TZ='/usr/share/zoneinfo/US/Central'
|
||||||
|
export OMP_PROC_BIND=spread
|
||||||
|
export OMP_NUM_THREADS=3
|
||||||
|
unset OMP_PLACES
|
||||||
|
|
||||||
|
cd $PBS_O_WORKDIR
|
||||||
|
|
||||||
|
qsub jobscript.pbs
|
||||||
|
|
||||||
|
echo Jobid: $PBS_JOBID
|
||||||
|
echo Running on host `hostname`
|
||||||
|
echo Running on nodes `cat $PBS_NODEFILE`
|
||||||
|
|
||||||
|
echo NODES
|
||||||
|
cat $PBS_NODEFILE
|
||||||
|
NNODES=`wc -l < $PBS_NODEFILE`
|
||||||
|
NRANKS=12 # Number of MPI ranks per node
|
||||||
|
NDEPTH=4 # Number of hardware threads per rank, spacing between MPI ranks on a node
|
||||||
|
NTHREADS=$OMP_NUM_THREADS # Number of OMP threads per rank, given to OMP_NUM_THREADS
|
||||||
|
|
||||||
|
NTOTRANKS=$(( NNODES * NRANKS ))
|
||||||
|
|
||||||
|
echo "NUM_NODES=${NNODES} TOTAL_RANKS=${NTOTRANKS} RANKS_PER_NODE=${NRANKS} THREADS_PER_RANK=${OMP_NUM_THREADS}"
|
||||||
|
echo "OMP_PROC_BIND=$OMP_PROC_BIND OMP_PLACES=$OMP_PLACES"
|
||||||
|
|
||||||
|
|
||||||
|
CMD="mpiexec -np ${NTOTRANKS} -ppn ${NRANKS} -d ${NDEPTH} --cpu-bind=depth -envall \
|
||||||
|
./gpu_tile_compact.sh \
|
||||||
|
./Benchmark_dwf_fp32 --mpi 1.1.2.6 --grid 16.32.64.192 --comms-overlap \
|
||||||
|
--shm-mpi 0 --shm 2048 --device-mem 32000 --accelerator-threads 32"
|
||||||
|
|
52
systems/Sunspot/benchmarks/gpu_tile_compact.sh
Executable file
52
systems/Sunspot/benchmarks/gpu_tile_compact.sh
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
display_help() {
|
||||||
|
echo " Will map gpu tile to rank in compact and then round-robin fashion"
|
||||||
|
echo " Usage (only work for one node of ATS/PVC):"
|
||||||
|
echo " mpiexec --np N gpu_tile_compact.sh ./a.out"
|
||||||
|
echo
|
||||||
|
echo " Example 3 GPU of 2 Tiles with 7 Ranks:"
|
||||||
|
echo " 0 Rank 0.0"
|
||||||
|
echo " 1 Rank 0.1"
|
||||||
|
echo " 2 Rank 1.0"
|
||||||
|
echo " 3 Rank 1.1"
|
||||||
|
echo " 4 Rank 2.0"
|
||||||
|
echo " 5 Rank 2.1"
|
||||||
|
echo " 6 Rank 0.0"
|
||||||
|
echo
|
||||||
|
echo " Hacked together by apl@anl.gov, please contact if bug found"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#This give the exact GPU count i915 knows about and I use udev to only enumerate the devices with physical presence.
|
||||||
|
#works? num_gpu=$(/usr/bin/udevadm info /sys/module/i915/drivers/pci\:i915/* |& grep -v Unknown | grep -c "P: /devices")
|
||||||
|
num_gpu=6
|
||||||
|
num_tile=2
|
||||||
|
|
||||||
|
if [ "$#" -eq 0 ] || [ "$1" == "--help" ] || [ "$1" == "-h" ] || [ "$num_gpu" = 0 ]; then
|
||||||
|
display_help
|
||||||
|
fi
|
||||||
|
|
||||||
|
gpu_id=$(( (PALS_LOCAL_RANKID / num_tile ) % num_gpu ))
|
||||||
|
tile_id=$((PALS_LOCAL_RANKID % num_tile))
|
||||||
|
|
||||||
|
unset EnableWalkerPartition
|
||||||
|
export EnableImplicitScaling=0
|
||||||
|
export ZE_ENABLE_PCI_ID_DEVICE_ORDER=1
|
||||||
|
export ZE_AFFINITY_MASK=$gpu_id.$tile_id
|
||||||
|
export ONEAPI_DEVICE_FILTER=gpu,level_zero
|
||||||
|
export SYCL_PI_LEVEL_ZERO_DEVICE_SCOPE_EVENTS=0
|
||||||
|
export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
|
||||||
|
export SYCL_PI_LEVEL_ZERO_USE_COPY_ENGINE=0:2
|
||||||
|
export SYCL_PI_LEVEL_ZERO_USE_COPY_ENGINE_FOR_D2D_COPY=1
|
||||||
|
#export SYCL_PI_LEVEL_ZERO_USM_RESIDENT=1
|
||||||
|
|
||||||
|
echo "rank $PALS_RANKID ; local rank $PALS_LOCAL_RANKID ; ZE_AFFINITY_MASK=$ZE_AFFINITY_MASK"
|
||||||
|
|
||||||
|
if [ $PALS_LOCAL_RANKID = 0 ]
|
||||||
|
then
|
||||||
|
onetrace --chrome-device-timeline "$@"
|
||||||
|
# "$@"
|
||||||
|
else
|
||||||
|
"$@"
|
||||||
|
fi
|
16
systems/Sunspot/config-command
Normal file
16
systems/Sunspot/config-command
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
TOOLS=$HOME/tools
|
||||||
|
../../configure \
|
||||||
|
--enable-simd=GPU \
|
||||||
|
--enable-gen-simd-width=64 \
|
||||||
|
--enable-comms=mpi-auto \
|
||||||
|
--enable-accelerator-cshift \
|
||||||
|
--disable-gparity \
|
||||||
|
--disable-fermion-reps \
|
||||||
|
--enable-shm=nvlink \
|
||||||
|
--enable-accelerator=sycl \
|
||||||
|
--enable-unified=no \
|
||||||
|
MPICXX=mpicxx \
|
||||||
|
CXX=icpx \
|
||||||
|
LDFLAGS="-fiopenmp -fsycl -fsycl-device-code-split=per_kernel -fsycl-device-lib=all -lze_loader -lapmidg -L$TOOLS/lib64/" \
|
||||||
|
CXXFLAGS="-fiopenmp -fsycl-unnamed-lambda -fsycl -I$INSTALL/include -Wno-tautological-compare -I$HOME/ -I$TOOLS/include"
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
BREW=/opt/local/
|
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 std;
|
||||||
using namespace Grid;
|
using namespace Grid;
|
||||||
|
|
||||||
|
typedef MobiusFermionD FermionAction;
|
||||||
|
typedef WilsonImplD FimplD;
|
||||||
|
typedef WilsonImplD FermionImplPolicy;
|
||||||
|
|
||||||
template<class Gimpl>
|
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
|
LatticeGaugeField U = smU.get_U(false); // unsmeared config
|
||||||
GridBase *UGrid = U.Grid();
|
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 << " Force test for "<<action.action_name()<<std::endl;
|
||||||
std::cout << GridLogMessage << "*********************************************************"<<std::endl;
|
std::cout << GridLogMessage << "*********************************************************"<<std::endl;
|
||||||
|
|
||||||
RealD eps=0.005;
|
RealD eps=0.01;
|
||||||
|
|
||||||
std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
|
std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
|
||||||
std::cout << GridLogMessage << " Refresh "<<action.action_name()<<std::endl;
|
std::cout << GridLogMessage << " Refresh "<<action.action_name()<<std::endl;
|
||||||
std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
|
std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
|
||||||
|
|
||||||
Gimpl::generate_momenta(P,sRNG,RNG4);
|
Gimpl::generate_momenta(P,sRNG,RNG4);
|
||||||
Filter.applyFilter(P);
|
// Filter.applyFilter(P);
|
||||||
|
|
||||||
action.refresh(smU,sRNG,RNG4);
|
action.refresh(smU,sRNG,RNG4);
|
||||||
|
|
||||||
@ -76,7 +79,7 @@ void ForceTest(Action<LatticeGaugeField> &action,SmearedConfigurationMasked<Peri
|
|||||||
std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
|
std::cout << GridLogMessage << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<std::endl;
|
||||||
action.deriv(smU,UdSdU);
|
action.deriv(smU,UdSdU);
|
||||||
UdSdU = Ta(UdSdU);
|
UdSdU = Ta(UdSdU);
|
||||||
Filter.applyFilter(UdSdU);
|
// Filter.applyFilter(UdSdU);
|
||||||
|
|
||||||
DumpSliceNorm("Force",UdSdU,Nd-1);
|
DumpSliceNorm("Force",UdSdU,Nd-1);
|
||||||
|
|
||||||
@ -94,7 +97,7 @@ void ForceTest(Action<LatticeGaugeField> &action,SmearedConfigurationMasked<Peri
|
|||||||
for(int mu=0;mu<Nd;mu++){
|
for(int mu=0;mu<Nd;mu++){
|
||||||
auto UdSdUmu = PeekIndex<LorentzIndex>(UdSdU,mu);
|
auto UdSdUmu = PeekIndex<LorentzIndex>(UdSdU,mu);
|
||||||
Pmu= PeekIndex<LorentzIndex>(P,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);
|
ComplexD dSpred = sum(dS);
|
||||||
RealD diff = S2-S1-dSpred.real();
|
RealD diff = S2-S1-dSpred.real();
|
||||||
@ -125,7 +128,10 @@ int main (int argc, char ** argv)
|
|||||||
const int Ls=12;
|
const int Ls=12;
|
||||||
const int Nt = latt_size[3];
|
const int Nt = latt_size[3];
|
||||||
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
||||||
|
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
||||||
GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
|
GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
|
||||||
|
GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
|
||||||
|
|
||||||
|
|
||||||
///////////////////// Gauge Field and Gauge Forces ////////////////////////////
|
///////////////////// Gauge Field and Gauge Forces ////////////////////////////
|
||||||
LatticeGaugeField U(UGrid);
|
LatticeGaugeField U(UGrid);
|
||||||
@ -141,17 +147,40 @@ int main (int argc, char ** argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
RealD beta=6.0;
|
WilsonGaugeActionR PlaqAction(6.0);
|
||||||
WilsonGaugeActionR PlaqAction(beta);
|
IwasakiGaugeActionR RectAction(2.13);
|
||||||
IwasakiGaugeActionR RectAction(beta);
|
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
|
// Plaquette only FTHMC smearer
|
||||||
////////////////////////////////////////////////
|
////////////////////////////////////////////////
|
||||||
double rho = 0.1;
|
double rho = 0.1;
|
||||||
Smear_Stout<PeriodicGimplR> Smearer(rho);
|
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);
|
JacobianAction<PeriodicGimplR> Jacobian(&SmartConfig);
|
||||||
|
|
||||||
@ -159,12 +188,32 @@ int main (int argc, char ** argv)
|
|||||||
// Run some tests
|
// Run some tests
|
||||||
////////////////////////////////////////////////
|
////////////////////////////////////////////////
|
||||||
MomentumFilterNone<LatticeGaugeField> FilterNone;
|
MomentumFilterNone<LatticeGaugeField> FilterNone;
|
||||||
|
|
||||||
|
std::cout << " ********* FIELD TRANSFORM SMEARING ***** "<<std::endl;
|
||||||
|
|
||||||
SmartConfig.set_Field(U);
|
SmartConfig.set_Field(U);
|
||||||
ForceTest<GimplTypesR>(PlaqAction,SmartConfig,FilterNone);
|
ForceTest<GimplTypesR>(PlaqAction,SmartConfig,FilterNone);
|
||||||
|
|
||||||
SmartConfig.set_Field(U);
|
SmartConfig.set_Field(U);
|
||||||
ForceTest<GimplTypesR>(RectAction,SmartConfig,FilterNone);
|
ForceTest<GimplTypesR>(RectAction,SmartConfig,FilterNone);
|
||||||
|
|
||||||
SmartConfig.set_Field(U);
|
SmartConfig.set_Field(U);
|
||||||
ForceTest<GimplTypesR>(Jacobian,SmartConfig,FilterNone);
|
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();
|
Grid_finalize();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user