From ef0fe2bcc12c95d37a8b537ba1694da22da8ab41 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Tue, 21 Mar 2017 11:39:46 +0000 Subject: [PATCH 001/620] Added empty ScalarFV module --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MScalar/ScalarFV.cc | 40 +++++++++++++++++++ extras/Hadrons/Modules/MScalar/ScalarFV.hpp | 44 +++++++++++++++++++++ extras/Hadrons/modules.inc | 4 +- 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 extras/Hadrons/Modules/MScalar/ScalarFV.cc create mode 100644 extras/Hadrons/Modules/MScalar/ScalarFV.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index a25419c5..b482eded 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.cc b/extras/Hadrons/Modules/MScalar/ScalarFV.cc new file mode 100644 index 00000000..26f9f648 --- /dev/null +++ b/extras/Hadrons/Modules/MScalar/ScalarFV.cc @@ -0,0 +1,40 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalar; + +/****************************************************************************** +* TScalarFV implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +TScalarFV::TScalarFV(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +std::vector TScalarFV::getInput(void) +{ + std::vector in; + + return in; +} + +std::vector TScalarFV::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +void TScalarFV::setup(void) +{ + +} + +// execution /////////////////////////////////////////////////////////////////// +void TScalarFV::execute(void) +{ + +} diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.hpp b/extras/Hadrons/Modules/MScalar/ScalarFV.hpp new file mode 100644 index 00000000..d350bcae --- /dev/null +++ b/extras/Hadrons/Modules/MScalar/ScalarFV.hpp @@ -0,0 +1,44 @@ +#ifndef Hadrons_ScalarFV_hpp_ +#define Hadrons_ScalarFV_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * ScalarFV * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalar) + +class ScalarFVPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarFVPar, + unsigned int, i); +}; + +class TScalarFV: public Module +{ +public: + // constructor + TScalarFV(const std::string name); + // destructor + virtual ~TScalarFV(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(ScalarFV, TScalarFV, MScalar); + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_ScalarFV_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index dfbe85ff..f368bbdc 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -4,7 +4,8 @@ modules_cc =\ Modules/MGauge/StochEm.cc \ Modules/MGauge/Unit.cc \ Modules/MScalar/ChargedProp.cc \ - Modules/MScalar/FreeProp.cc + Modules/MScalar/FreeProp.cc \ + Modules/MScalar/ScalarFV.cc modules_hpp =\ Modules/MAction/DWF.hpp \ @@ -18,6 +19,7 @@ modules_hpp =\ Modules/MScalar/ChargedProp.hpp \ Modules/MScalar/FreeProp.hpp \ Modules/MScalar/Scalar.hpp \ + Modules/MScalar/ScalarFV.hpp \ Modules/MSolver/RBPrecCG.hpp \ Modules/MSource/Point.hpp \ Modules/MSource/SeqGamma.hpp \ From a04eb7df5d53e72ce501d5e13c8ef051d3a28442 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 24 Mar 2017 12:43:28 +0900 Subject: [PATCH 002/620] Starting Clover term --- .vscode/settings.json | 3 + lib/qcd/action/fermion/WilsonCloverFermion.cc | 98 +++++++++++++++++++ lib/qcd/action/fermion/WilsonCloverFermion.h | 76 ++++++++++++++ 3 files changed, 177 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 lib/qcd/action/fermion/WilsonCloverFermion.cc create mode 100644 lib/qcd/action/fermion/WilsonCloverFermion.h diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..20af2f68 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +// Place your settings in this file to overwrite default and user settings. +{ +} \ No newline at end of file diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc new file mode 100644 index 00000000..1d59474e --- /dev/null +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -0,0 +1,98 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./lib/qcd/action/fermion/WilsonTMFermion.cc + + Copyright (C) 2015 + +Author: paboyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include + +namespace Grid { +namespace QCD { + + /* + * BF sequence + * + void bfmbase::MooeeInv(Fermion_t psi, + Fermion_t chi, + int dag, int cb) + + double m = this->mass; + double tm = this->twistedmass; + double mtil = 4.0+this->mass; + + double sq = mtil*mtil + tm*tm; + + double a = mtil/sq; + double b = -tm /sq; + if(dag) b=-b; + axpibg5x(chi,psi,a,b); + + void bfmbase::Mooee(Fermion_t psi, + Fermion_t chi, + int dag,int cb) + double a = 4.0+this->mass; + double b = this->twistedmass; + if(dag) b=-b; + axpibg5x(chi,psi,a,b); + */ + + template + void WilsonTMFermion::Mooee(const FermionField &in, FermionField &out) { + RealD a = 4.0+this->mass; + RealD b = this->mu; + out.checkerboard = in.checkerboard; + axpibg5x(out,in,a,b); + } + template + void WilsonTMFermion::MooeeDag(const FermionField &in, FermionField &out) { + RealD a = 4.0+this->mass; + RealD b = -this->mu; + out.checkerboard = in.checkerboard; + axpibg5x(out,in,a,b); + } + template + void WilsonTMFermion::MooeeInv(const FermionField &in, FermionField &out) { + RealD m = this->mass; + RealD tm = this->mu; + RealD mtil = 4.0+this->mass; + RealD sq = mtil*mtil+tm*tm; + RealD a = mtil/sq; + RealD b = -tm /sq; + axpibg5x(out,in,a,b); + } + template + void WilsonTMFermion::MooeeInvDag(const FermionField &in, FermionField &out) { + RealD m = this->mass; + RealD tm = this->mu; + RealD mtil = 4.0+this->mass; + RealD sq = mtil*mtil+tm*tm; + RealD a = mtil/sq; + RealD b = tm /sq; + axpibg5x(out,in,a,b); + } + + FermOpTemplateInstantiate(WilsonTMFermion); + +} +} diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h new file mode 100644 index 00000000..5901cb2f --- /dev/null +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -0,0 +1,76 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./lib/qcd/action/fermion/WilsonTMFermion.h + + Copyright (C) 2015 + +Author: paboyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#ifndef GRID_QCD_WILSON_TM_FERMION_H +#define GRID_QCD_WILSON_TM_FERMION_H + +#include + +namespace Grid { + + namespace QCD { + + template + class WilsonTMFermion : public WilsonFermion + { + public: + INHERIT_IMPL_TYPES(Impl); + public: + + virtual void Instantiatable(void) {}; + // Constructors + WilsonTMFermion(GaugeField &_Umu, + GridCartesian &Fgrid, + GridRedBlackCartesian &Hgrid, + RealD _mass, + RealD _mu, + const ImplParams &p= ImplParams() + ) : + WilsonFermion(_Umu, + Fgrid, + Hgrid, + _mass,p) + + { + mu = _mu; + } + + + // allow override for twisted mass and clover + virtual void Mooee(const FermionField &in, FermionField &out) ; + virtual void MooeeDag(const FermionField &in, FermionField &out) ; + virtual void MooeeInv(const FermionField &in, FermionField &out) ; + virtual void MooeeInvDag(const FermionField &in, FermionField &out) ; + + private: + RealD mu; // TwistedMass parameter + + }; + +}} + +#endif From 54c10a42cc5e5c46e55b4aa8faba6930927e56e1 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 24 Mar 2017 11:42:32 +0000 Subject: [PATCH 003/620] Add source and emField inputs to ScalarFV module --- extras/Hadrons/Modules/MScalar/ScalarFV.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.cc b/extras/Hadrons/Modules/MScalar/ScalarFV.cc index 26f9f648..e7a72abe 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarFV.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarFV.cc @@ -15,7 +15,7 @@ TScalarFV::TScalarFV(const std::string name) // dependencies/products /////////////////////////////////////////////////////// std::vector TScalarFV::getInput(void) { - std::vector in; + std::vector in = {par().source, par().emField}; return in; } From 0c006fbfaac3d47c892fb1305002149d7f7fc31b Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 24 Mar 2017 11:59:09 +0000 Subject: [PATCH 004/620] Add ScalarFV inputs to ScalarFV.hpp --- extras/Hadrons/Modules/MScalar/ScalarFV.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.hpp b/extras/Hadrons/Modules/MScalar/ScalarFV.hpp index d350bcae..f7802bda 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarFV.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarFV.hpp @@ -16,6 +16,11 @@ class ScalarFVPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarFVPar, + std::string, emField, + std::string, source, + double, mass, + double, charge, + std::string, output, unsigned int, i); }; From 85516e9c7c5f1fb3096777e2995a7005f2fbc675 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 24 Mar 2017 17:13:55 +0000 Subject: [PATCH 005/620] Output all terms of scalar propagator separately --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 90 +++++++++++++++---- .../Hadrons/Modules/MScalar/ChargedProp.hpp | 5 +- 2 files changed, 78 insertions(+), 17 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 40d4504c..b76ea8d2 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -23,7 +23,8 @@ std::vector TChargedProp::getInput(void) std::vector TChargedProp::getOutput(void) { - std::vector out = {getName()}; + std::vector out = {getName(), getName()+"_0", getName()+"_D1", + getName()+"_D1D1", getName()+"_D2"}; return out; } @@ -38,6 +39,10 @@ void TChargedProp::setup(void) phaseName_.push_back("_shiftphase_" + std::to_string(mu)); } GFSrcName_ = "_" + getName() + "_DinvSrc"; + prop0Name_ = getName() + "_0"; + propD1Name_ = getName() + "_D1"; + propD1D1Name_ = getName() + "_D1D1"; + propD2Name_ = getName() + "_D2"; if (!env().hasRegisteredObject(freeMomPropName_)) { env().registerLattice(freeMomPropName_); @@ -53,7 +58,14 @@ void TChargedProp::setup(void) { env().registerLattice(GFSrcName_); } + if (!env().hasRegisteredObject(prop0Name_)) + { + env().registerLattice(prop0Name_); + } env().registerLattice(getName()); + env().registerLattice(propD1Name_); + env().registerLattice(propD1D1Name_); + env().registerLattice(propD2Name_); } // execution /////////////////////////////////////////////////////////////////// @@ -64,7 +76,7 @@ void TChargedProp::execute(void) Complex ci(0.0,1.0); FFT fft(env().getGrid()); - // cache free scalar propagator + // cache momentum-space free scalar propagator if (!env().hasCreatedObject(freeMomPropName_)) { LOG(Message) << "Caching momentum space free scalar propagator" @@ -88,6 +100,17 @@ void TChargedProp::execute(void) { GFSrc_ = env().getObject(GFSrcName_); } + // cache free scalar propagator + if (!env().hasCreatedObject(prop0Name_)) + { + prop0_ = env().createLattice(prop0Name_); + *prop0_ = *GFSrc_; + fft.FFT_all_dim(*prop0_, *prop0_, FFT::backward); + } + else + { + prop0_ = env().getObject(prop0Name_); + } // cache phases if (!env().hasCreatedObject(phaseName_[0])) { @@ -117,30 +140,33 @@ void TChargedProp::execute(void) << ", charge= " << par().charge << ")..." << std::endl; ScalarField &prop = *env().createLattice(getName()); + ScalarField &propD1 = *env().createLattice(propD1Name_); + ScalarField &propD1D1 = *env().createLattice(propD1D1Name_); + ScalarField &propD2 = *env().createLattice(propD2Name_); ScalarField buf(env().getGrid()); ScalarField &GFSrc = *GFSrc_, &G = *freeMomProp_; double q = par().charge; - // G*F*Src - prop = GFSrc; - - // - q*G*momD1*G*F*Src (momD1 = F*D1*Finv) + // -G*momD1*G*F*Src (momD1 = F*D1*Finv) buf = GFSrc; momD1(buf, fft); - buf = G*buf; - prop = prop - q*buf; + buf = -G*buf; + fft.FFT_all_dim(propD1, buf, FFT::backward); - // + q^2*G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) + // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) + buf = -buf; momD1(buf, fft); - prop = prop + q*q*G*buf; + propD1D1 = G*buf; + fft.FFT_all_dim(propD1D1, propD1D1, FFT::backward); - // - q^2*G*momD2*G*F*Src (momD2 = F*D2*Finv) + // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); - prop = prop - q*q*G*buf; + buf = -G*buf; + fft.FFT_all_dim(propD2, buf, FFT::backward); - // final FT - fft.FFT_all_dim(prop, prop, FFT::backward); + // full charged scalar propagator + prop = (*prop0_) + q*propD1 + q*q*propD1D1 + q*q*propD2; // OUTPUT IF NECESSARY if (!par().output.empty()) @@ -155,14 +181,48 @@ void TChargedProp::execute(void) std::vector vecBuf; std::vector result; + write(writer, "charge", q); + + // Write full propagator sliceSum(prop, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) { result[t] = TensorRemove(vecBuf[t]); } - write(writer, "charge", q); write(writer, "prop", result); + + // Write free propagator + sliceSum(*prop0_, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_0", result); + + // Write propagator D1 term + sliceSum(propD1, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_D1", result); + + // Write propagator D1D1 term + sliceSum(propD1D1, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_D1D1", result); + + // Write propagator D2 term + sliceSum(propD2, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_D2", result); } } diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 8bb5faa0..6a6c6c39 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -45,9 +45,10 @@ private: void momD1(ScalarField &s, FFT &fft); void momD2(ScalarField &s, FFT &fft); private: - std::string freeMomPropName_, GFSrcName_; + std::string freeMomPropName_, GFSrcName_, prop0Name_, + propD1Name_, propD1D1Name_, propD2Name_; std::vector phaseName_; - ScalarField *freeMomProp_, *GFSrc_; + ScalarField *freeMomProp_, *GFSrc_, *prop0_; std::vector phase_; EmField *A; }; From 5fdc05782b4578b21ba66421ec58753c32ec9350 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 27 Mar 2017 10:54:16 +0900 Subject: [PATCH 006/620] More in the clover fermion class --- lib/qcd/action/fermion/WilsonCloverFermion.h | 81 +++++++++----------- lib/qcd/action/fermion/WilsonFermion.h | 4 +- 2 files changed, 40 insertions(+), 45 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index 5901cb2f..41131e5d 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -1,12 +1,13 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid + Grid physics library, www.github.com/paboyle/Grid Source file: ./lib/qcd/action/fermion/WilsonTMFermion.h - Copyright (C) 2015 + Copyright (C) 2017 Author: paboyle +Author: Guido Cossu 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 @@ -24,53 +25,47 @@ Author: paboyle See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ - /* END LEGAL */ -#ifndef GRID_QCD_WILSON_TM_FERMION_H -#define GRID_QCD_WILSON_TM_FERMION_H +/* END LEGAL */ +#ifndef GRID_QCD_WILSON_CLOVER_FERMION_H +#define GRID_QCD_WILSON_CLOVER_FERMION_H #include namespace Grid { +namespace QCD { - namespace QCD { +template +class WilsonCloverFermion : public WilsonFermion { +public: + INHERIT_IMPL_TYPES(Impl); - template - class WilsonTMFermion : public WilsonFermion - { - public: - INHERIT_IMPL_TYPES(Impl); - public: +public: + virtual void Instantiatable(void){}; + // Constructors + WilsonCloverFermion(GaugeField &_Umu, GridCartesian &Fgrid, + GridRedBlackCartesian &Hgrid, + RealD _mass, + RealD _csw, + const ImplParams &p = ImplParams()) : WilsonFermion(_Umu, + Fgrid, + Hgrid, + _mass, p) + { + csw = _csw; + } - virtual void Instantiatable(void) {}; - // Constructors - WilsonTMFermion(GaugeField &_Umu, - GridCartesian &Fgrid, - GridRedBlackCartesian &Hgrid, - RealD _mass, - RealD _mu, - const ImplParams &p= ImplParams() - ) : - WilsonFermion(_Umu, - Fgrid, - Hgrid, - _mass,p) + virtual RealD M(const FermionField& in, FermionField& out); + virtual RealD Mdag(const FermionField& in, FermionField& out); - { - mu = _mu; - } + virtual void Mooee(const FermionField &in, FermionField &out); + virtual void MooeeDag(const FermionField &in, FermionField &out); + virtual void MooeeInv(const FermionField &in, FermionField &out); + virtual void MooeeInvDag(const FermionField &in, FermionField &out); +private: + RealD csw; // Clover coefficient +}; +} +} - // allow override for twisted mass and clover - virtual void Mooee(const FermionField &in, FermionField &out) ; - virtual void MooeeDag(const FermionField &in, FermionField &out) ; - virtual void MooeeInv(const FermionField &in, FermionField &out) ; - virtual void MooeeInvDag(const FermionField &in, FermionField &out) ; - - private: - RealD mu; // TwistedMass parameter - - }; - -}} - -#endif +#endif // GRID_QCD_WILSON_CLOVER_FERMION_H diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index 933be732..50f4f884 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -65,8 +65,8 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { // override multiply; cut number routines if pass dagger argument // and also make interface more uniformly consistent ////////////////////////////////////////////////////////////////// - RealD M(const FermionField &in, FermionField &out); - RealD Mdag(const FermionField &in, FermionField &out); + virtual RealD M(const FermionField &in, FermionField &out); + virtual RealD Mdag(const FermionField &in, FermionField &out); ///////////////////////////////////////////////////////// // half checkerboard operations From fff484eca5a88b01c61b1a638faf75d4b00e5304 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 27 Mar 2017 15:12:57 +0900 Subject: [PATCH 007/620] Populating Clover fermions methods --- lib/qcd/action/Actions.h | 11 +- lib/qcd/action/fermion/WilsonCloverFermion.cc | 134 ++++++++++-------- lib/qcd/action/fermion/WilsonCloverFermion.h | 28 +++- 3 files changed, 103 insertions(+), 70 deletions(-) diff --git a/lib/qcd/action/Actions.h b/lib/qcd/action/Actions.h index 4a30f8c3..b825ac49 100644 --- a/lib/qcd/action/Actions.h +++ b/lib/qcd/action/Actions.h @@ -142,11 +142,10 @@ typedef SymanzikGaugeAction ConjugateSymanzikGaugeAction //////////////////////////////////////////// #include // 4d wilson like -#include // 4d wilson like +#include // 4d wilson like +#include // 4d wilson like #include // 5d base used by all 5d overlap types -//#include - #include // Cayley types #include #include @@ -188,10 +187,16 @@ typedef WilsonFermion WilsonTwoIndexSymmetricFermi typedef WilsonFermion WilsonTwoIndexSymmetricFermionF; typedef WilsonFermion WilsonTwoIndexSymmetricFermionD; +// Twisted mass fermion typedef WilsonTMFermion WilsonTMFermionR; typedef WilsonTMFermion WilsonTMFermionF; typedef WilsonTMFermion WilsonTMFermionD; +// Clover fermions +typedef WilsonCloverFermion WilsonCloverFermionR; +typedef WilsonCloverFermion WilsonCloverFermionF; +typedef WilsonCloverFermion WilsonCloverFermionD; + typedef DomainWallFermion DomainWallFermionR; typedef DomainWallFermion DomainWallFermionF; typedef DomainWallFermion DomainWallFermionD; diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 1d59474e..0cc82f62 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -1,12 +1,13 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid + Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/qcd/action/fermion/WilsonTMFermion.cc + Source file: ./lib/qcd/action/fermion/WilsonCloverFermion.cc - Copyright (C) 2015 + Copyright (C) 2017 -Author: paboyle + Author: paboyle + Author: Guido Cossu 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 @@ -24,75 +25,82 @@ Author: paboyle See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ - /* END LEGAL */ +/* END LEGAL */ #include +#include namespace Grid { namespace QCD { - /* - * BF sequence - * - void bfmbase::MooeeInv(Fermion_t psi, - Fermion_t chi, - int dag, int cb) + template + void WilsonCloverFermion::AddCloverTerm(const FermionField& in, + FermionField& out){ + FermionField tmp(out._grid); + tmp = zero; + // the product sigma_munu Fmunu is hermitian + tmp += Bx*(Gamma(Gamma::Algebra::SigmaYZ)*in); + tmp += By*(Gamma(Gamma::Algebra::MinusSigmaXZ)*in); + tmp += Bz*(Gamma(Gamma::Algebra::SigmaXY)*in); + tmp += Ex*(Gamma(Gamma::Algebra::MinusSigmaXT)*in); + tmp += Ey*(Gamma(Gamma::Algebra::MinusSigmaYT)*in); + tmp += Ez*(Gamma(Gamma::Algebra::MinusSigmaZT)*in); + out += tmp*csw; // check signs - double m = this->mass; - double tm = this->twistedmass; - double mtil = 4.0+this->mass; + } - double sq = mtil*mtil + tm*tm; - double a = mtil/sq; - double b = -tm /sq; - if(dag) b=-b; - axpibg5x(chi,psi,a,b); - - void bfmbase::Mooee(Fermion_t psi, - Fermion_t chi, - int dag,int cb) - double a = 4.0+this->mass; - double b = this->twistedmass; - if(dag) b=-b; - axpibg5x(chi,psi,a,b); - */ - - template - void WilsonTMFermion::Mooee(const FermionField &in, FermionField &out) { - RealD a = 4.0+this->mass; - RealD b = this->mu; + template + RealD WilsonCloverFermion::M(const FermionField& in, FermionField& out) { + // Wilson term out.checkerboard = in.checkerboard; - axpibg5x(out,in,a,b); - } - template - void WilsonTMFermion::MooeeDag(const FermionField &in, FermionField &out) { - RealD a = 4.0+this->mass; - RealD b = -this->mu; - out.checkerboard = in.checkerboard; - axpibg5x(out,in,a,b); - } - template - void WilsonTMFermion::MooeeInv(const FermionField &in, FermionField &out) { - RealD m = this->mass; - RealD tm = this->mu; - RealD mtil = 4.0+this->mass; - RealD sq = mtil*mtil+tm*tm; - RealD a = mtil/sq; - RealD b = -tm /sq; - axpibg5x(out,in,a,b); - } - template - void WilsonTMFermion::MooeeInvDag(const FermionField &in, FermionField &out) { - RealD m = this->mass; - RealD tm = this->mu; - RealD mtil = 4.0+this->mass; - RealD sq = mtil*mtil+tm*tm; - RealD a = mtil/sq; - RealD b = tm /sq; - axpibg5x(out,in,a,b); + this->Dhop(in, out, DaggerNo); + // Clover term + // apply the sigma and Fmunu + AddCloverTerm(in, out); + // overall factor + return axpy_norm(out, 4 + this->mass, in, out); } - FermOpTemplateInstantiate(WilsonTMFermion); + template + RealD WilsonCloverFermion::Mdag(const FermionField& in, FermionField& out) { + // Wilson term + out.checkerboard = in.checkerboard; + this->Dhop(in, out, DaggerYes); + // Clover term + // apply the sigma and Fmunu + AddCloverTerm(in, out); + return axpy_norm(out, 4 + this->mass, in, out); + } + + template + void WilsonCloverFermion::ImportGauge(const GaugeField& _Umu) { + this->ImportGauge(_Umu); + // Compute the field strength terms + + // Invert the Moo, Mee terms (?) + } + + + template + void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) { + out.checkerboard = in.checkerboard; + + } + + template + void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &out) { + assert(0); // not implemented yet + } + template + void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &out) { + assert(0); // not implemented yet + } + template + void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out) { + assert(0); // not implemented yet + } + + FermOpTemplateInstantiate(WilsonCloverFermion); } } diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index 41131e5d..d3785cac 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -2,12 +2,12 @@ Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/qcd/action/fermion/WilsonTMFermion.h + Source file: ./lib/qcd/action/fermion/WilsonCloverFermion.h Copyright (C) 2017 -Author: paboyle -Author: Guido Cossu + Author: paboyle + Author: Guido Cossu 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 @@ -40,6 +40,8 @@ public: INHERIT_IMPL_TYPES(Impl); public: + typedef WilsonFermion WilsonBase; + virtual void Instantiatable(void){}; // Constructors WilsonCloverFermion(GaugeField &_Umu, GridCartesian &Fgrid, @@ -49,9 +51,17 @@ public: const ImplParams &p = ImplParams()) : WilsonFermion(_Umu, Fgrid, Hgrid, - _mass, p) + _mass, p), + Bx(_Umu._grid), + By(_Umu._grid), + Bz(_Umu._grid), + Ex(_Umu._grid), + Ey(_Umu._grid), + Ez(_Umu._grid) { csw = _csw; + assert(Nd == 4); // require 4 dimensions + } virtual RealD M(const FermionField& in, FermionField& out); @@ -62,8 +72,18 @@ public: virtual void MooeeInv(const FermionField &in, FermionField &out); virtual void MooeeInvDag(const FermionField &in, FermionField &out); + void ImportGauge(const GaugeField &_Umu); private: + // here fixing the 4 dimensions, make it more general? + + // Field strengths + GaugeLinkField Bx, By, Bz, Ex, Ey, Ez; + RealD csw; // Clover coefficient + + + // Methods + void AddCloverTerm(const FermionField& in, FermionField& out); }; } } From 5e549ebd8b645ba6b7c39548b1ded42b629c6011 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 27 Mar 2017 16:43:15 +0900 Subject: [PATCH 008/620] Adding force terms --- lib/qcd/QCD.h | 6 ++- lib/qcd/action/fermion/WilsonCloverFermion.cc | 29 ++++++++++- lib/qcd/action/fermion/WilsonCloverFermion.h | 6 ++- lib/qcd/utils/WilsonLoops.h | 50 +++++++++++++++++++ 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/lib/qcd/QCD.h b/lib/qcd/QCD.h index f434bdd9..1c24ecdd 100644 --- a/lib/qcd/QCD.h +++ b/lib/qcd/QCD.h @@ -35,7 +35,11 @@ namespace Grid{ namespace QCD { - + static const int Xdir = 0; + static const int Ydir = 1; + static const int Zdir = 2; + static const int Tdir = 3; + static const int Xp = 0; static const int Yp = 1; static const int Zp = 2; diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 0cc82f62..b94c72c0 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -76,6 +76,12 @@ namespace QCD { void WilsonCloverFermion::ImportGauge(const GaugeField& _Umu) { this->ImportGauge(_Umu); // Compute the field strength terms + WilsonLoops::FieldStrength(Bx, _Umu, Ydir, Zdir); + WilsonLoops::FieldStrength(By, _Umu, Zdir, Xdir); + WilsonLoops::FieldStrength(Bz, _Umu, Xdir, Ydir); + WilsonLoops::FieldStrength(Ex, _Umu, Tdir, Xdir); + WilsonLoops::FieldStrength(Ey, _Umu, Tdir, Ydir); + WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); // Invert the Moo, Mee terms (?) } @@ -84,7 +90,7 @@ namespace QCD { template void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) { out.checkerboard = in.checkerboard; - + assert(0); // to be completed } template @@ -100,6 +106,27 @@ namespace QCD { assert(0); // not implemented yet } + // Derivative parts + template + void WilsonCloverFermion::MDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ + GaugeField tmp(mat._grid); + this->DhopDeriv(mat, U, V, dag); + MooDeriv(tmp, U, V, dag); + mat += tmp; + } + + // Derivative parts + template + void WilsonCloverFermion::MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ + assert(0); // not implemented yet + } + + // Derivative parts + template + void WilsonCloverFermion::MeeDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ + assert(0); // not implemented yet + } + FermOpTemplateInstantiate(WilsonCloverFermion); } diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index d3785cac..e942de1f 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -61,7 +61,6 @@ public: { csw = _csw; assert(Nd == 4); // require 4 dimensions - } virtual RealD M(const FermionField& in, FermionField& out); @@ -72,6 +71,11 @@ public: virtual void MooeeInv(const FermionField &in, FermionField &out); virtual void MooeeInvDag(const FermionField &in, FermionField &out); + virtual void MDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag); + virtual void MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag); + virtual void MeeDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag); + + void ImportGauge(const GaugeField &_Umu); private: // here fixing the 4 dimensions, make it more general? diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index 03d45c07..ca2b2b8d 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -256,6 +256,56 @@ public: } } + //////////////////////////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu, lower part + //////////////////////////////////////////////////////////////////////// + static void StapleLower(GaugeMat &staple, const GaugeLorentz &Umu, int mu, + int nu) { + if (nu != mu) { + GridBase *grid = Umu._grid; + + std::vector U(Nd, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d);// some redundant copies + } + + // mu + // ^ + // |__> nu + + // __ + // | + // |__ + // + // + staple = Gimpl::ShiftStaple( + Gimpl::CovShiftBackward(U[nu], nu, + Gimpl::CovShiftBackward(U[mu], mu, U[nu])), + mu); + } + } + + ////////////////////////////////////////////////////// + // Field Strength + ////////////////////////////////////////////////////// + static void FieldStrength(GaugeMat &FS, const GaugeLorentz &Umu, int mu, int nu){ + // Fmn +--<--+ Ut +--<--+ + // | | | | + // (x)+-->--+ +-->--+(x) + // | | | | + // +--<--+ +--<--+ + + GaugeMat Vup(Umu._grid), Vdn(Umu._grid); + StapleUpper(Vup, Umu, mu, nu);// coalesce these two (up low) + StapleLower(Vdn, Umu, mu, nu); + GaugeMat v = adj(Vup) - adj(Vdn); + GaugeMat u = PeekIndex(Umu, mu); // some redundant copies + GaugeMat vu = v*u; + FS = 0.25*Ta(u*v - Cshift(vu, mu, +1)); + } + + + ////////////////////////////////////////////////////// // Similar to above for rectangle is required ////////////////////////////////////////////////////// From 3750b9ffeefb31e8bfb9b30b2266b83acdc7d4ff Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 27 Mar 2017 16:53:32 +0900 Subject: [PATCH 009/620] Deleting MPI test for OSX in Travis --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ae3efda8..055adee1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,5 +102,3 @@ script: - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=mpi-auto - make -j4 - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mpirun.openmpi -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mpirun -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi - From 483fd3cfa1e65d894f27b9f04aa14301d644416e Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 27 Mar 2017 13:24:51 +0100 Subject: [PATCH 010/620] Add propagator expansion terms as inputs to ScalarFV --- extras/Hadrons/Modules/MScalar/ScalarFV.cc | 7 ++++++- extras/Hadrons/Modules/MScalar/ScalarFV.hpp | 9 ++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.cc b/extras/Hadrons/Modules/MScalar/ScalarFV.cc index e7a72abe..2a50a62f 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarFV.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarFV.cc @@ -15,7 +15,12 @@ TScalarFV::TScalarFV(const std::string name) // dependencies/products /////////////////////////////////////////////////////// std::vector TScalarFV::getInput(void) { - std::vector in = {par().source, par().emField}; + std::string prop0Name = par().scalarProp + "_0"; + std::string propD1Name = par().scalarProp + "_D1"; + std::string propD1D1Name = par().scalarProp + "_D1D1"; + std::string propD2Name = par().scalarProp + "_D2"; + std::vector in = {par().source, par().emField, par().scalarProp, + prop0Name, propD1Name, propD1D1Name, propD2Name}; return in; } diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.hpp b/extras/Hadrons/Modules/MScalar/ScalarFV.hpp index f7802bda..fda174db 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarFV.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarFV.hpp @@ -18,14 +18,17 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarFVPar, std::string, emField, std::string, source, - double, mass, + std::string, scalarProp, double, charge, - std::string, output, - unsigned int, i); + std::string, output); }; class TScalarFV: public Module { +public: + SCALAR_TYPE_ALIASES(SIMPL,); + typedef PhotonR::GaugeField EmField; + typedef PhotonR::GaugeLinkField EmComp; public: // constructor TScalarFV(const std::string name); From 4512dbdf584e07acaec4fc86f25985446fc89aa7 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 27 Mar 2017 15:02:16 +0100 Subject: [PATCH 011/620] Rename module ScalarFV to ScalarVP --- extras/Hadrons/Modules.hpp | 2 +- .../MScalar/{ScalarFV.cc => ScalarVP.cc} | 27 ++++++++++--------- .../MScalar/{ScalarFV.hpp => ScalarVP.hpp} | 22 ++++++++------- extras/Hadrons/modules.inc | 4 +-- 4 files changed, 29 insertions(+), 26 deletions(-) rename extras/Hadrons/Modules/MScalar/{ScalarFV.cc => ScalarVP.cc} (54%) rename extras/Hadrons/Modules/MScalar/{ScalarFV.hpp => ScalarVP.hpp} (69%) diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index b482eded..c1d90e3a 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc similarity index 54% rename from extras/Hadrons/Modules/MScalar/ScalarFV.cc rename to extras/Hadrons/Modules/MScalar/ScalarVP.cc index 2a50a62f..dff636dd 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarFV.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -1,31 +1,32 @@ -#include +#include using namespace Grid; using namespace Hadrons; using namespace MScalar; /****************************************************************************** -* TScalarFV implementation * +* TScalarVP implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// -TScalarFV::TScalarFV(const std::string name) -: Module(name) +TScalarVP::TScalarVP(const std::string name) +: Module(name) {} // dependencies/products /////////////////////////////////////////////////////// -std::vector TScalarFV::getInput(void) +std::vector TScalarVP::getInput(void) { - std::string prop0Name = par().scalarProp + "_0"; - std::string propD1Name = par().scalarProp + "_D1"; - std::string propD1D1Name = par().scalarProp + "_D1D1"; - std::string propD2Name = par().scalarProp + "_D2"; + prop0Name_ = par().scalarProp + "_0"; + propD1Name_ = par().scalarProp + "_D1"; + propD1D1Name_ = par().scalarProp + "_D1D1"; + propD2Name_ = par().scalarProp + "_D2"; std::vector in = {par().source, par().emField, par().scalarProp, - prop0Name, propD1Name, propD1D1Name, propD2Name}; + prop0Name_, propD1Name_, propD1D1Name_, + propD2Name_}; return in; } -std::vector TScalarFV::getOutput(void) +std::vector TScalarVP::getOutput(void) { std::vector out = {getName()}; @@ -33,13 +34,13 @@ std::vector TScalarFV::getOutput(void) } // setup /////////////////////////////////////////////////////////////////////// -void TScalarFV::setup(void) +void TScalarVP::setup(void) { } // execution /////////////////////////////////////////////////////////////////// -void TScalarFV::execute(void) +void TScalarVP::execute(void) { } diff --git a/extras/Hadrons/Modules/MScalar/ScalarFV.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp similarity index 69% rename from extras/Hadrons/Modules/MScalar/ScalarFV.hpp rename to extras/Hadrons/Modules/MScalar/ScalarVP.hpp index fda174db..3c3be434 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarFV.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -1,5 +1,5 @@ -#ifndef Hadrons_ScalarFV_hpp_ -#define Hadrons_ScalarFV_hpp_ +#ifndef Hadrons_ScalarVP_hpp_ +#define Hadrons_ScalarVP_hpp_ #include #include @@ -8,14 +8,14 @@ BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * ScalarFV * + * ScalarVP * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalar) -class ScalarFVPar: Serializable +class ScalarVPPar: Serializable { public: - GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarFVPar, + GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarVPPar, std::string, emField, std::string, source, std::string, scalarProp, @@ -23,7 +23,7 @@ public: std::string, output); }; -class TScalarFV: public Module +class TScalarVP: public Module { public: SCALAR_TYPE_ALIASES(SIMPL,); @@ -31,9 +31,9 @@ public: typedef PhotonR::GaugeLinkField EmComp; public: // constructor - TScalarFV(const std::string name); + TScalarVP(const std::string name); // destructor - virtual ~TScalarFV(void) = default; + virtual ~TScalarVP(void) = default; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); @@ -41,12 +41,14 @@ public: virtual void setup(void); // execution virtual void execute(void); +private: + std::string prop0Name_, propD1Name_, propD1D1Name_, propD2Name_; }; -MODULE_REGISTER_NS(ScalarFV, TScalarFV, MScalar); +MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); END_MODULE_NAMESPACE END_HADRONS_NAMESPACE -#endif // Hadrons_ScalarFV_hpp_ +#endif // Hadrons_ScalarVP_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index f368bbdc..383cb6b5 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -5,7 +5,7 @@ modules_cc =\ Modules/MGauge/Unit.cc \ Modules/MScalar/ChargedProp.cc \ Modules/MScalar/FreeProp.cc \ - Modules/MScalar/ScalarFV.cc + Modules/MScalar/ScalarVP.cc modules_hpp =\ Modules/MAction/DWF.hpp \ @@ -19,7 +19,7 @@ modules_hpp =\ Modules/MScalar/ChargedProp.hpp \ Modules/MScalar/FreeProp.hpp \ Modules/MScalar/Scalar.hpp \ - Modules/MScalar/ScalarFV.hpp \ + Modules/MScalar/ScalarVP.hpp \ Modules/MSolver/RBPrecCG.hpp \ Modules/MSource/Point.hpp \ Modules/MSource/SeqGamma.hpp \ From 9f755e0379e192826a593d758a53124bd28b781a Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 27 Mar 2017 16:49:18 +0100 Subject: [PATCH 012/620] Add functions momD1 and momD2 to ScalarVP --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 68 ++++++++++++++++++++- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 5 ++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index dff636dd..423fb1a2 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -15,7 +15,7 @@ TScalarVP::TScalarVP(const std::string name) // dependencies/products /////////////////////////////////////////////////////// std::vector TScalarVP::getInput(void) { - prop0Name_ = par().scalarProp + "_0"; + prop0Name_ = par().scalarProp + "_0"; propD1Name_ = par().scalarProp + "_D1"; propD1D1Name_ = par().scalarProp + "_D1D1"; propD2Name_ = par().scalarProp + "_D2"; @@ -36,11 +36,77 @@ std::vector TScalarVP::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// void TScalarVP::setup(void) { + phaseName_.clear(); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + phaseName_.push_back("_shiftphase_" + std::to_string(mu)); + } } // execution /////////////////////////////////////////////////////////////////// void TScalarVP::execute(void) { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + phase_.push_back(env().getObject(phaseName_[mu])); + } } + +void TScalarVP::momD1(ScalarField &s, EmField &A, FFT &fft) +{ + ScalarField buf(env().getGrid()), result(env().getGrid()), + Amu(env().getGrid()); + Complex ci(0.0,1.0); + + result = zero; + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + Amu = peekLorentz(A, mu); + buf = (*phase_[mu])*s; + fft.FFT_all_dim(buf, buf, FFT::backward); + buf = Amu*buf; + fft.FFT_all_dim(buf, buf, FFT::forward); + result = result - ci*buf; + } + fft.FFT_all_dim(s, s, FFT::backward); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + Amu = peekLorentz(A, mu); + buf = Amu*s; + fft.FFT_all_dim(buf, buf, FFT::forward); + result = result + ci*adj(*phase_[mu])*buf; + } + + s = result; +} + +void TScalarVP::momD2(ScalarField &s, EmField &Asquared, FFT &fft) +{ + ScalarField buf(env().getGrid()), result(env().getGrid()), + A2mu(env().getGrid()); + + result = zero; + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + A2mu = peekLorentz(Asquared, mu); + buf = (*phase_[mu])*s; + fft.FFT_all_dim(buf, buf, FFT::backward); + buf = A2mu*buf; + fft.FFT_all_dim(buf, buf, FFT::forward); + result = result + .5*buf; + } + fft.FFT_all_dim(s, s, FFT::backward); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + A2mu = peekLorentz(Asquared, mu); + buf = A2mu*s; + fft.FFT_all_dim(buf, buf, FFT::forward); + result = result + .5*adj(*phase_[mu])*buf; + } + + s = result; +} diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 3c3be434..92a4f246 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -41,8 +41,13 @@ public: virtual void setup(void); // execution virtual void execute(void); +private: + void momD1(ScalarField &s, EmField &A, FFT &fft); + void momD2(ScalarField &s, EmField &Asquared, FFT &fft); private: std::string prop0Name_, propD1Name_, propD1D1Name_, propD2Name_; + std::vector phaseName_; + std::vector phase_; }; MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); From 1ed69816b9ecb9838c0a9d613e08fc2fc042afa2 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 30 Mar 2017 11:14:27 +0100 Subject: [PATCH 013/620] First steps for the force term --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 13 ++++++++++++- lib/qcd/utils/WilsonLoops.h | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index b94c72c0..7e51dcfe 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -82,8 +82,10 @@ namespace QCD { WilsonLoops::FieldStrength(Ex, _Umu, Tdir, Xdir); WilsonLoops::FieldStrength(Ey, _Umu, Tdir, Ydir); WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); + // Save the contracted term with sigma + // into a dense matrix site by site - // Invert the Moo, Mee terms (?) + // Invert the Moo, Mee terms (using Eigen) } @@ -110,6 +112,14 @@ namespace QCD { template void WilsonCloverFermion::MDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ GaugeField tmp(mat._grid); + + conformable(U._grid, _grid); + conformable(U._grid, V._grid); + conformable(U._grid, mat._grid); + + mat.checkerboard = U.checkerboard; + tmp.checkerboard = U.checkerboard; + this->DhopDeriv(mat, U, V, dag); MooDeriv(tmp, U, V, dag); mat += tmp; @@ -118,6 +128,7 @@ namespace QCD { // Derivative parts template void WilsonCloverFermion::MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ + assert(0); // not implemented yet } diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index ca2b2b8d..1984d2b8 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -301,7 +301,7 @@ public: GaugeMat v = adj(Vup) - adj(Vdn); GaugeMat u = PeekIndex(Umu, mu); // some redundant copies GaugeMat vu = v*u; - FS = 0.25*Ta(u*v - Cshift(vu, mu, +1)); + FS = 0.25*Ta(u*v + Cshift(vu, mu, +1));// need jsut the antihermite part } From b8ae787b5e3e50646085b5ea0dc74dd825dd9489 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 30 Mar 2017 11:33:15 +0100 Subject: [PATCH 014/620] Correcting a simple typo --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 1 - lib/qcd/utils/WilsonLoops.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 7e51dcfe..5d5d6622 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -113,7 +113,6 @@ namespace QCD { void WilsonCloverFermion::MDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ GaugeField tmp(mat._grid); - conformable(U._grid, _grid); conformable(U._grid, V._grid); conformable(U._grid, mat._grid); diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index 1984d2b8..143b283a 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -301,7 +301,7 @@ public: GaugeMat v = adj(Vup) - adj(Vdn); GaugeMat u = PeekIndex(Umu, mu); // some redundant copies GaugeMat vu = v*u; - FS = 0.25*Ta(u*v + Cshift(vu, mu, +1));// need jsut the antihermite part + FS = 0.25*Ta(u*v + Cshift(vu, mu, +1)); } From 6fd82228bfcc949e60ba229600d44c251caffd38 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 5 Apr 2017 10:51:44 +0100 Subject: [PATCH 015/620] Working on the derivative --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 5d5d6622..e588de42 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -127,7 +127,7 @@ namespace QCD { // Derivative parts template void WilsonCloverFermion::MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ - + // Compute the 8 terms of the derivative assert(0); // not implemented yet } From 26ebe41fef37d310bba59d378060a26749c1a54b Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 10 Apr 2017 16:33:54 +0100 Subject: [PATCH 016/620] QedFVol: Implement charged propagator calculation within ScalarVP module --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 2 +- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 230 ++++++++++++++++-- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 16 +- 3 files changed, 225 insertions(+), 23 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index b76ea8d2..b68b144d 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -100,7 +100,7 @@ void TChargedProp::execute(void) { GFSrc_ = env().getObject(GFSrcName_); } - // cache free scalar propagator + // cache position-space free scalar propagator if (!env().hasCreatedObject(prop0Name_)) { prop0_ = env().createLattice(prop0Name_); diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 423fb1a2..66cdea7e 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -15,13 +15,7 @@ TScalarVP::TScalarVP(const std::string name) // dependencies/products /////////////////////////////////////////////////////// std::vector TScalarVP::getInput(void) { - prop0Name_ = par().scalarProp + "_0"; - propD1Name_ = par().scalarProp + "_D1"; - propD1D1Name_ = par().scalarProp + "_D1D1"; - propD2Name_ = par().scalarProp + "_D2"; - std::vector in = {par().source, par().emField, par().scalarProp, - prop0Name_, propD1Name_, propD1D1Name_, - propD2Name_}; + std::vector in = {par().source, par().emField}; return in; } @@ -36,26 +30,229 @@ std::vector TScalarVP::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// void TScalarVP::setup(void) { + freeMomPropName_ = FREEMOMPROP(par().mass); + GFSrcName_ = "_" + getName() + "_DinvSrc"; + prop0Name_ = getName() + "_prop0"; + propQName_ = getName() + "_propQ"; + propSunName_ = getName() + "_propSun"; + propTadName_ = getName() + "_propTad"; + phaseName_.clear(); + muGFSrcName_.clear(); + muProp0Name_.clear(); + muPropQName_.clear(); + muPropSunName_.clear(); + muPropTadName_.clear(); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { phaseName_.push_back("_shiftphase_" + std::to_string(mu)); + muGFSrcName.push_back("_" + getName() + "_DinvSrc_" + std::to_string(mu)); + muProp0Name_.push_back(getName() + "_prop0_" + std::to_string(mu)); + muPropQName_.push_back(getName() + "_propQ_" + std::to_string(mu)); + muPropSunName_.push_back(getName() + "_propSun_" + std::to_string(mu)); + muPropTadName_.push_back(getName() + "_propTad_" + std::to_string(mu)); } + if (!env().hasRegisteredObject(freeMomPropName_)) + { + env().registerLattice(freeMomPropName_); + } + if (!env().hasRegisteredObject(phaseName_[0])) + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + env().registerLattice(phaseName_[mu]); + } + } + if (!env().hasRegisteredObject(GFSrcName_)) + { + env().registerLattice(GFSrcName_); + } + if (!env().hasRegisteredObject(muGFSrcName_[0])) + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + env().registerLattice(muGFSrcName_[mu]); + } + } + if (!env().hasRegisteredObject(prop0Name_)) + { + env().registerLattice(prop0Name_); + } + if (!env().hasRegisteredObject(muProp0Name_[0])) + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + env().registerLattice(muProp0Name_[mu]); + } + } + env().registerLattice(propQName_); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + env().registerLattice(muPropQName_[mu]); + } + env().registerLattice(propSunName_); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + env().registerLattice(muPropSunName_[mu]); + } + env().registerLattice(propTadName_); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + env().registerLattice(muPropTadName_[mu]); + } + env().registerLattice(getName()); } // execution /////////////////////////////////////////////////////////////////// void TScalarVP::execute(void) { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) + // CACHING ANALYTIC EXPRESSIONS + ScalarField &source = *env().getObject(par().source); + Complex ci(0.0,1.0); + FFT fft(env().getGrid()); + + // cache momentum-space free scalar propagator + if (!env().hasCreatedObject(freeMomPropName_)) { - phase_.push_back(env().getObject(phaseName_[mu])); + LOG(Message) << "Caching momentum space free scalar propagator" + << " (mass= " << par().mass << ")..." << std::endl; + freeMomProp_ = env().createLattice(freeMomPropName_); + Scalar::MomentumSpacePropagator(*freeMomProp_, par().mass); + } + else + { + freeMomProp_ = env().getObject(freeMomPropName_); + } + // cache phases + if (!env().hasCreatedObject(phaseName_[0])) + { + std::vector &l = env().getGrid()->_fdimensions; + + LOG(Message) << "Caching shift phases..." << std::endl; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + Real twoPiL = M_PI*2./l[mu]; + + phase_.push_back(env().createLattice(phaseName_[mu])); + LatticeCoordinate(*(phase_[mu]), mu); + *(phase_[mu]) = exp(ci*twoPiL*(*(phase_[mu]))); + } + } + else + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + phase_.push_back(env().getObject(phaseName_[mu])); + } + } + // cache G*F*src + if (!env().hasCreatedObject(GFSrcName_)) + { + GFSrc_ = env().createLattice(GFSrcName_); + fft.FFT_all_dim(*GFSrc_, source, FFT::forward); + *GFSrc_ = (*freeMomProp_)*(*GFSrc_); + } + else + { + GFSrc_ = env().getObject(GFSrcName_); + } + // cache G*exp(i*k_mu)*F*src + if (!env().hasCreatedObject(muGFSrcName_[0])) + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + muGFSrc_.push_back(env().createLattice(muGFSrcName_[mu])); + fft.FFT_all_dim(*(muGFSrc_[mu]), source, FFT::forward); + *(muGFSrc_[mu]) = (*freeMomProp_)*(*phase_[mu])*(*muGFSrc_[mu]); + } + } + else + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + muGFSrc_.push_back(env().getObject(muGFSrcName_[mu])); + } + } + // cache position-space free scalar propagators + if (!env().hasCreatedObject(prop0Name_)) + { + prop0_ = env().createLattice(prop0Name_); + fft.FFT_all_dim(*prop0_, *GFSrc_, FFT::backward); + } + else + { + prop0_ = env().getObject(prop0Name_); + } + if (!env().hasCreatedObject(muProp0Name_[0])) + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + muProp0_.push_back(env().createLattice(muProp0Name_[mu])); + fft.FFT_all_dim(*(muProp0_[mu]), *(muGFSrc_[mu]), FFT::backward); + } + } + else + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + muProp0_.push_back(env().getObject(muProp0Name_[mu])); + } } + // PROPAGATOR CALCULATION + // Propagator from unshifted source + ScalarField &propQ = *env().createLattice(propQName_); + ScalarField &propSun = *env().createLattice(propSunName_); + ScalarField &propTad = *env().createLattice(propTadName_); + chargedProp(propQ, propSun, propTad, *GFSrc_, fft); + + // Propagators from shifted sources + std::vector muPropQ_, muPropSun_, muPropTad_; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + muPropQ_.push_back(env().createLattice(muPropQName_[mu])); + muPropSun_.push_back(env().createLattice(muPropSunName_[mu])); + muPropTad_.push_back(env().createLattice(muPropTadName_[mu])); + chargedProp(*(muPropQ_[mu]), *(muPropSun_[mu]), *(muPropTad_[mu]), + *(muGFSrc_[mu]), fft); + } + } -void TScalarVP::momD1(ScalarField &s, EmField &A, FFT &fft) +// Calculate O(q) and O(q^2) terms of momentum-space charged propagator +void TScalarVP::chargedProp(ScalarField &prop_q, ScalarField &prop_sun, + ScalarField &prop_tad, ScalarField &GFSrc, + FFT &fft) { + Complex ci(0.0,1.0); + double q = par().charge; + ScalarField &G = *freeMomProp_; + ScalarField buf(env().getGrid()); + + LOG(Message) << "Computing charged scalar propagator" + << " (mass= " << par().mass + << ", charge= " << q << ")..." << std::endl; + + // -q*G*momD1*G*F*Src (momD1 = F*D1*Finv) + buf = GFSrc; + momD1(buf, fft); + buf = G*buf; + prop_q = -q*buf; + + // q*q*G*momD1*G*momD1*G*F*Src + momD1(buf, fft); + prop_sun = q*q*G*buf; + + // -q*q*G*momD2*G*F*Src (momD2 = F*D2*Finv) + buf = GFSrc; + momD2(buf, fft); + prop_tad = -q*q*G*buf; +} + +void TScalarVP::momD1(ScalarField &s, FFT &fft) +{ + EmField &A = *env().getObject(par().emField); ScalarField buf(env().getGrid()), result(env().getGrid()), Amu(env().getGrid()); Complex ci(0.0,1.0); @@ -83,27 +280,28 @@ void TScalarVP::momD1(ScalarField &s, EmField &A, FFT &fft) s = result; } -void TScalarVP::momD2(ScalarField &s, EmField &Asquared, FFT &fft) +void TScalarVP::momD2(ScalarField &s, FFT &fft) { + EmField &A = *env().getObject(par().emField); ScalarField buf(env().getGrid()), result(env().getGrid()), - A2mu(env().getGrid()); + Amu(env().getGrid()); result = zero; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - A2mu = peekLorentz(Asquared, mu); + Amu = peekLorentz(A, mu); buf = (*phase_[mu])*s; fft.FFT_all_dim(buf, buf, FFT::backward); - buf = A2mu*buf; + buf = Amu*Amu*buf; fft.FFT_all_dim(buf, buf, FFT::forward); result = result + .5*buf; } fft.FFT_all_dim(s, s, FFT::backward); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - A2mu = peekLorentz(Asquared, mu); - buf = A2mu*s; + Amu = peekLorentz(A, mu); + buf = Amu*Amu*s; fft.FFT_all_dim(buf, buf, FFT::forward); result = result + .5*adj(*phase_[mu])*buf; } diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 92a4f246..9d57a62a 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -18,7 +18,7 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarVPPar, std::string, emField, std::string, source, - std::string, scalarProp, + double, mass, double, charge, std::string, output); }; @@ -42,12 +42,16 @@ public: // execution virtual void execute(void); private: - void momD1(ScalarField &s, EmField &A, FFT &fft); - void momD2(ScalarField &s, EmField &Asquared, FFT &fft); + void momD1(ScalarField &s, FFT &fft); + void momD2(ScalarField &s, FFT &fft); private: - std::string prop0Name_, propD1Name_, propD1D1Name_, propD2Name_; - std::vector phaseName_; - std::vector phase_; + std::string freeMomPropName_, GFSrcName_, prop0Name_, + propQName_, propSunName_, propTadName_; + std::vector phaseName_, muGFSrcName_, muProp0Name_, + muPropQName, muPropSunName_, muPropTadName_; + ScalarField *freeMomProp_, *GFSrc_, *prop0_; + std::vector phase_, muGFSrc_, muProp0_; + emField *A; }; MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); From c8e6f58e24ac04b0387bafd33334189528212627 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 13 Apr 2017 17:04:37 +0100 Subject: [PATCH 017/620] Fix typos in ScalarVP --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 3 ++- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 66cdea7e..79cc5574 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -1,4 +1,5 @@ #include +#include using namespace Grid; using namespace Hadrons; @@ -46,7 +47,7 @@ void TScalarVP::setup(void) for (unsigned int mu = 0; mu < env().getNd(); ++mu) { phaseName_.push_back("_shiftphase_" + std::to_string(mu)); - muGFSrcName.push_back("_" + getName() + "_DinvSrc_" + std::to_string(mu)); + muGFSrcName_.push_back("_" + getName() + "_DinvSrc_" + std::to_string(mu)); muProp0Name_.push_back(getName() + "_prop0_" + std::to_string(mu)); muPropQName_.push_back(getName() + "_propQ_" + std::to_string(mu)); muPropSunName_.push_back(getName() + "_propSun_" + std::to_string(mu)); diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 9d57a62a..1a2b82fb 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -42,16 +42,19 @@ public: // execution virtual void execute(void); private: + void chargedProp(ScalarField &prop_q, ScalarField &prop_sun, + ScalarField &prop_tad, ScalarField &GFSrc, + FFT &fft); void momD1(ScalarField &s, FFT &fft); void momD2(ScalarField &s, FFT &fft); private: std::string freeMomPropName_, GFSrcName_, prop0Name_, propQName_, propSunName_, propTadName_; std::vector phaseName_, muGFSrcName_, muProp0Name_, - muPropQName, muPropSunName_, muPropTadName_; + muPropQName_, muPropSunName_, muPropTadName_; ScalarField *freeMomProp_, *GFSrc_, *prop0_; std::vector phase_, muGFSrc_, muProp0_; - emField *A; + EmField *A; }; MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); From b69499630276813e217ac211e765d13c9a4e16a0 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 14 Apr 2017 13:30:14 +0100 Subject: [PATCH 018/620] adding comments --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index e588de42..c7fd211d 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -128,6 +128,17 @@ namespace QCD { template void WilsonCloverFermion::MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ // Compute the 8 terms of the derivative + + // Pseudocode + // Using Chroma as a template + + // for loop on mu and nu, but upper matrix + // take the outer product factor * U x (sigma_mu_nu V) + + // derivative of loops + // end of loop + + assert(0); // not implemented yet } From bd466a55a89b98c54dbc1287e15feb558a372de4 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Tue, 25 Apr 2017 10:04:03 +0100 Subject: [PATCH 019/620] QedFVol: remove charge dependence in chargedProp function of ScalarVP --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 79cc5574..ed777387 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -23,8 +23,17 @@ std::vector TScalarVP::getInput(void) std::vector TScalarVP::getOutput(void) { - std::vector out = {getName()}; + std::vector out = {getName(), getName()+"_propQ", + getName()+"_propSun", + getName()+"_propTad"}; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + out.push_back(getName() + "_propQ_" + std::to_string(mu)); + out.push_back(getName() + "_propSun_" + std::to_string(mu)); + out.push_back(getName() + "_propTad_" + std::to_string(mu)); + } + return out; } @@ -112,6 +121,7 @@ void TScalarVP::execute(void) ScalarField &source = *env().getObject(par().source); Complex ci(0.0,1.0); FFT fft(env().getGrid()); + double q = par().charge; // cache momentum-space free scalar propagator if (!env().hasCreatedObject(freeMomPropName_)) @@ -227,28 +237,28 @@ void TScalarVP::chargedProp(ScalarField &prop_q, ScalarField &prop_sun, FFT &fft) { Complex ci(0.0,1.0); - double q = par().charge; - ScalarField &G = *freeMomProp_; + ScalarField &G = *freeMomProp_; ScalarField buf(env().getGrid()); LOG(Message) << "Computing charged scalar propagator" << " (mass= " << par().mass - << ", charge= " << q << ")..." << std::endl; + << ", charge= " << par().charge << ")..." + << std::endl; - // -q*G*momD1*G*F*Src (momD1 = F*D1*Finv) + // -G*momD1*G*F*Src (momD1 = F*D1*Finv) buf = GFSrc; momD1(buf, fft); buf = G*buf; - prop_q = -q*buf; + prop_q = -buf; - // q*q*G*momD1*G*momD1*G*F*Src + // G*momD1*G*momD1*G*F*Src momD1(buf, fft); - prop_sun = q*q*G*buf; + prop_sun = G*buf; - // -q*q*G*momD2*G*F*Src (momD2 = F*D2*Finv) + // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); - prop_tad = -q*q*G*buf; + prop_tad = -G*buf; } void TScalarVP::momD1(ScalarField &s, FFT &fft) From 3ac27e559678f456d512f58670617b26ca1529e5 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 27 Apr 2017 14:17:50 +0100 Subject: [PATCH 020/620] QedFVol: remove unnecessary copies of free propagator from shifted sources in ScalarVP --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 57 ++------------------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 6 +-- 2 files changed, 8 insertions(+), 55 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index ed777387..5a5ef4f0 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -48,16 +48,12 @@ void TScalarVP::setup(void) propTadName_ = getName() + "_propTad"; phaseName_.clear(); - muGFSrcName_.clear(); - muProp0Name_.clear(); muPropQName_.clear(); muPropSunName_.clear(); muPropTadName_.clear(); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { phaseName_.push_back("_shiftphase_" + std::to_string(mu)); - muGFSrcName_.push_back("_" + getName() + "_DinvSrc_" + std::to_string(mu)); - muProp0Name_.push_back(getName() + "_prop0_" + std::to_string(mu)); muPropQName_.push_back(getName() + "_propQ_" + std::to_string(mu)); muPropSunName_.push_back(getName() + "_propSun_" + std::to_string(mu)); muPropTadName_.push_back(getName() + "_propTad_" + std::to_string(mu)); @@ -78,24 +74,10 @@ void TScalarVP::setup(void) { env().registerLattice(GFSrcName_); } - if (!env().hasRegisteredObject(muGFSrcName_[0])) - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - env().registerLattice(muGFSrcName_[mu]); - } - } if (!env().hasRegisteredObject(prop0Name_)) { env().registerLattice(prop0Name_); } - if (!env().hasRegisteredObject(muProp0Name_[0])) - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - env().registerLattice(muProp0Name_[mu]); - } - } env().registerLattice(propQName_); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { @@ -168,23 +150,6 @@ void TScalarVP::execute(void) { GFSrc_ = env().getObject(GFSrcName_); } - // cache G*exp(i*k_mu)*F*src - if (!env().hasCreatedObject(muGFSrcName_[0])) - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - muGFSrc_.push_back(env().createLattice(muGFSrcName_[mu])); - fft.FFT_all_dim(*(muGFSrc_[mu]), source, FFT::forward); - *(muGFSrc_[mu]) = (*freeMomProp_)*(*phase_[mu])*(*muGFSrc_[mu]); - } - } - else - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - muGFSrc_.push_back(env().getObject(muGFSrcName_[mu])); - } - } // cache position-space free scalar propagators if (!env().hasCreatedObject(prop0Name_)) { @@ -195,21 +160,6 @@ void TScalarVP::execute(void) { prop0_ = env().getObject(prop0Name_); } - if (!env().hasCreatedObject(muProp0Name_[0])) - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - muProp0_.push_back(env().createLattice(muProp0Name_[mu])); - fft.FFT_all_dim(*(muProp0_[mu]), *(muGFSrc_[mu]), FFT::backward); - } - } - else - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - muProp0_.push_back(env().getObject(muProp0Name_[mu])); - } - } // PROPAGATOR CALCULATION // Propagator from unshifted source @@ -220,15 +170,18 @@ void TScalarVP::execute(void) // Propagators from shifted sources std::vector muPropQ_, muPropSun_, muPropTad_; + ScalarField buf(env().getGrid()); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { muPropQ_.push_back(env().createLattice(muPropQName_[mu])); muPropSun_.push_back(env().createLattice(muPropSunName_[mu])); muPropTad_.push_back(env().createLattice(muPropTadName_[mu])); + + buf = adj(*phase_[mu])*(*GFSrc_); chargedProp(*(muPropQ_[mu]), *(muPropSun_[mu]), *(muPropTad_[mu]), - *(muGFSrc_[mu]), fft); + buf, fft); } - + } // Calculate O(q) and O(q^2) terms of momentum-space charged propagator diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 1a2b82fb..0d93dc45 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -50,10 +50,10 @@ private: private: std::string freeMomPropName_, GFSrcName_, prop0Name_, propQName_, propSunName_, propTadName_; - std::vector phaseName_, muGFSrcName_, muProp0Name_, - muPropQName_, muPropSunName_, muPropTadName_; + std::vector phaseName_, muPropQName_, muPropSunName_, + muPropTadName_; ScalarField *freeMomProp_, *GFSrc_, *prop0_; - std::vector phase_, muGFSrc_, muProp0_; + std::vector phase_; EmField *A; }; From 5553b8d2b86a1fa4b44a304e4fab9ab3e8001f16 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 28 Apr 2017 15:23:34 +0100 Subject: [PATCH 021/620] Clover term compiles, not tested --- lib/qcd/action/fermion/Fermion.h | 2 +- lib/qcd/action/fermion/WilsonCloverFermion.cc | 144 ++++++---- lib/qcd/action/fermion/WilsonCloverFermion.h | 59 ++-- tests/core/Test_wilson_clover.cc | 251 ++++++++++++++++++ 4 files changed, 383 insertions(+), 73 deletions(-) create mode 100644 tests/core/Test_wilson_clover.cc diff --git a/lib/qcd/action/fermion/Fermion.h b/lib/qcd/action/fermion/Fermion.h index 2eaf42fa..9d999c6d 100644 --- a/lib/qcd/action/fermion/Fermion.h +++ b/lib/qcd/action/fermion/Fermion.h @@ -49,7 +49,7 @@ Author: Peter Boyle #include // 4d wilson like #include // 4d wilson like -#include // 4d wilson like +#include // 4d wilson clover fermions #include // 5d base used by all 5d overlap types #include diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index c7fd211d..ebea565b 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -27,28 +27,35 @@ *************************************************************************************/ /* END LEGAL */ #include +#include #include namespace Grid { namespace QCD { - template - void WilsonCloverFermion::AddCloverTerm(const FermionField& in, - FermionField& out){ - FermionField tmp(out._grid); - tmp = zero; - // the product sigma_munu Fmunu is hermitian - tmp += Bx*(Gamma(Gamma::Algebra::SigmaYZ)*in); - tmp += By*(Gamma(Gamma::Algebra::MinusSigmaXZ)*in); - tmp += Bz*(Gamma(Gamma::Algebra::SigmaXY)*in); - tmp += Ex*(Gamma(Gamma::Algebra::MinusSigmaXT)*in); - tmp += Ey*(Gamma(Gamma::Algebra::MinusSigmaYT)*in); - tmp += Ez*(Gamma(Gamma::Algebra::MinusSigmaZT)*in); - out += tmp*csw; // check signs - - } +//WilsonLoop::CloverPlaquette +///////////////////////////////////////////////////// +//// Clover plaquette combination in mu,nu plane with Double Stored U +//////////////////////////////////////////////////// +//static void CloverPlaquette(GaugeMat &Q, const std::vector &U, +// const int mu, const int nu){ +// Q = zero; +// Q += Gimpl::CovShiftBackward( +// U[mu], mu, Gimpl::CovShiftBackward( +// U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[nu] ))); +// Q += Gimpl::CovShiftForward( +// U[mu], mu, Gimpl::CovShiftForward( +// U[nu], nu, Gimpl::CovShiftBackward(U[mu], mu, U[nu+Nd] ))); +// Q += Gimpl::CovShiftBackward( +// U[nu], nu, Gimpl::CovShiftForward( +// U[mu], mu, Gimpl::CovShiftForward(U[nu], nu, U[mu+Nd] ))); +// Q += Gimpl::CovShiftForward( +// U[mu], mu, Gimpl::CovShiftBackward( +// U[nu], nu, Gimpl::CovShiftBackward(U[mu], mu, U[nu] ))); +// } +// *NOT* EO template RealD WilsonCloverFermion::M(const FermionField& in, FermionField& out) { // Wilson term @@ -56,7 +63,7 @@ namespace QCD { this->Dhop(in, out, DaggerNo); // Clover term // apply the sigma and Fmunu - AddCloverTerm(in, out); + Mooee(in, out); // overall factor return axpy_norm(out, 4 + this->mass, in, out); } @@ -68,13 +75,16 @@ namespace QCD { this->Dhop(in, out, DaggerYes); // Clover term // apply the sigma and Fmunu - AddCloverTerm(in, out); + MooeeDag(in, out); return axpy_norm(out, 4 + this->mass, in, out); } template void WilsonCloverFermion::ImportGauge(const GaugeField& _Umu) { this->ImportGauge(_Umu); + GridBase* grid = _Umu._grid; + assert(Nd==4); //only works in 4 dim + typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid); // Compute the field strength terms WilsonLoops::FieldStrength(Bx, _Umu, Ydir, Zdir); WilsonLoops::FieldStrength(By, _Umu, Zdir, Xdir); @@ -82,31 +92,77 @@ namespace QCD { WilsonLoops::FieldStrength(Ex, _Umu, Tdir, Xdir); WilsonLoops::FieldStrength(Ey, _Umu, Tdir, Ydir); WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); - // Save the contracted term with sigma - // into a dense matrix site by site - // Invert the Moo, Mee terms (using Eigen) + // Compute the Clover Operator acting on Colour and Spin + CloverTerm = fillClover(Bx)*(Gamma(Gamma::Algebra::SigmaYZ)); + CloverTerm += fillClover(By)*(Gamma(Gamma::Algebra::MinusSigmaXZ)); + CloverTerm += fillClover(Bz)*(Gamma(Gamma::Algebra::SigmaXY)); + CloverTerm += fillClover(Ex)*(Gamma(Gamma::Algebra::MinusSigmaXT)); + CloverTerm += fillClover(Ey)*(Gamma(Gamma::Algebra::MinusSigmaYT)); + CloverTerm += fillClover(Ez)*(Gamma(Gamma::Algebra::MinusSigmaZT)); + CloverTerm *= csw; + + + int lvol = _Umu._grid->lSites(); + int DimRep = Impl::Dimension; + + Eigen::MatrixXcd EigenCloverOp = Eigen::MatrixXcd::Zero(Ns*DimRep,Ns*DimRep); + Eigen::MatrixXcd EigenInvCloverOp = Eigen::MatrixXcd::Zero(Ns*DimRep,Ns*DimRep); + + std::vector lcoor; + typename SiteCloverType::scalar_object Qx = zero, Qxinv = zero; + + for (int site = 0; site < lvol; site++){ + grid->LocalIndexToLocalCoor(site,lcoor); + EigenCloverOp=Eigen::MatrixXcd::Zero(Ns*DimRep,Ns*DimRep); + peekLocalSite(Qx,CloverTerm,lcoor); + Qxinv = zero; + for(int j = 0; j < Ns; j++) + for (int k = 0; k < Ns; k++) + for(int a = 0; a < DimRep; a++) + for(int b = 0; b < DimRep; b++) + EigenCloverOp(a+j*DimRep,b+k*DimRep) = Qx()(j,k)(a,b); + + EigenInvCloverOp = EigenCloverOp.inverse(); + for(int j = 0; j < Ns; j++) + for (int k = 0; k < Ns; k++) + for(int a = 0; a < DimRep; a++) + for(int b = 0; b < DimRep; b++) + Qxinv()(j,k)(a,b) = EigenInvCloverOp(a+j*DimRep,b+k*DimRep); + + pokeLocalSite(Qxinv,CloverTermInv,lcoor); + } + } + + template + void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out){ + this -> MooeeInternal(in, out, DaggerNo, InverseNo); + } + + template + void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &out){ + this -> MooeeInternal(in, out, DaggerNo, InverseYes); + } + + template + void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &out){ + this -> MooeeInternal(in, out, DaggerNo, InverseYes); + } + + template + void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out){ + this -> MooeeInternal(in, out, DaggerNo, InverseYes); } template - void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) { - out.checkerboard = in.checkerboard; - assert(0); // to be completed - } + void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv){ + out.checkerboard = in.checkerboard; + CloverFieldType *Clover; - template - void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &out) { - assert(0); // not implemented yet - } - template - void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &out) { - assert(0); // not implemented yet - } - template - void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out) { - assert(0); // not implemented yet - } + Clover = (inv) ? &CloverTermInv : &CloverTerm; + if(dag){ out = adj(*Clover)*in;} else {out = *Clover*in;} + } // MooeeInternal // Derivative parts template @@ -128,17 +184,6 @@ namespace QCD { template void WilsonCloverFermion::MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ // Compute the 8 terms of the derivative - - // Pseudocode - // Using Chroma as a template - - // for loop on mu and nu, but upper matrix - // take the outer product factor * U x (sigma_mu_nu V) - - // derivative of loops - // end of loop - - assert(0); // not implemented yet } @@ -148,7 +193,10 @@ namespace QCD { assert(0); // not implemented yet } - FermOpTemplateInstantiate(WilsonCloverFermion); +FermOpTemplateInstantiate(WilsonCloverFermion); // now only for the fundamental representation +//AdjointFermOpTemplateInstantiate(WilsonCloverFermion); +//TwoIndexFermOpTemplateInstantiate(WilsonCloverFermion); +//GparityFermOpTemplateInstantiate(WilsonCloverFermion); } } diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index e942de1f..0fa0d57d 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -31,14 +31,20 @@ #include -namespace Grid { -namespace QCD { +namespace Grid +{ +namespace QCD +{ template -class WilsonCloverFermion : public WilsonFermion { +class WilsonCloverFermion : public WilsonFermion +{ public: + // Types definitions INHERIT_IMPL_TYPES(Impl); - + template using iImplClover = iScalar, Ns> >; + typedef iImplClover SiteCloverType; + typedef Lattice CloverFieldType; public: typedef WilsonFermion WilsonBase; @@ -51,43 +57,48 @@ public: const ImplParams &p = ImplParams()) : WilsonFermion(_Umu, Fgrid, Hgrid, - _mass, p), - Bx(_Umu._grid), - By(_Umu._grid), - Bz(_Umu._grid), - Ex(_Umu._grid), - Ey(_Umu._grid), - Ez(_Umu._grid) + _mass, p), + CloverTerm(&Fgrid), + CloverTermInv(&Fgrid) { csw = _csw; assert(Nd == 4); // require 4 dimensions } - virtual RealD M(const FermionField& in, FermionField& out); - virtual RealD Mdag(const FermionField& in, FermionField& out); + virtual RealD M(const FermionField &in, FermionField &out); + virtual RealD Mdag(const FermionField &in, FermionField &out); virtual void Mooee(const FermionField &in, FermionField &out); virtual void MooeeDag(const FermionField &in, FermionField &out); virtual void MooeeInv(const FermionField &in, FermionField &out); virtual void MooeeInvDag(const FermionField &in, FermionField &out); + virtual void MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv); - virtual void MDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag); - virtual void MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag); - virtual void MeeDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag); - + virtual void MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag); + virtual void MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag); + virtual void MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag); void ImportGauge(const GaugeField &_Umu); + private: // here fixing the 4 dimensions, make it more general? - // Field strengths - GaugeLinkField Bx, By, Bz, Ex, Ey, Ez; + RealD csw; // Clover coefficient + CloverFieldType CloverTerm, CloverTermInv; // Clover term + // eventually these two can be compressed into 6x6 blocks instead of the 12x12 + // using the DeGrand-Rossi basis for the gamma matrices - RealD csw; // Clover coefficient - - - // Methods - void AddCloverTerm(const FermionField& in, FermionField& out); + CloverFieldType fillClover(const GaugeLinkField& F){ + CloverFieldType T(F._grid); + PARALLEL_FOR_LOOP + for (int i = 0; i < CloverTerm._grid->oSites(); i++){ + for (int s1 = 0; s1 < Nc; s1++) + for (int s2 = 0; s2 < Nc; s2++) + T._odata[i]()(s1,s2) = F._odata[i]()(); + } + return T; + } + }; } } diff --git a/tests/core/Test_wilson_clover.cc b/tests/core/Test_wilson_clover.cc new file mode 100644 index 00000000..08516d80 --- /dev/null +++ b/tests/core/Test_wilson_clover.cc @@ -0,0 +1,251 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./benchmarks/Benchmark_wilson.cc + + Copyright (C) 2015 + + Author: Guido Cossu + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); + + int threads = GridThread::GetThreads(); + std::cout< seeds({1,2,3,4}); + GridParallelRNG pRNG(&Grid); + pRNG.SeedFixedIntegers(seeds); + // pRNG.SeedFixedIntegers(std::vector({45,12,81,9}); + + typedef typename WilsonCloverFermionR::FermionField FermionField; + typename WilsonCloverFermionR::ImplParams params; + + FermionField src (&Grid); random(pRNG,src); + FermionField result(&Grid); result=zero; + FermionField ref(&Grid); ref=zero; + FermionField tmp(&Grid); tmp=zero; + FermionField err(&Grid); tmp=zero; + FermionField phi (&Grid); random(pRNG,phi); + FermionField chi (&Grid); random(pRNG,chi); + LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu); + std::vector U(4,&Grid); + + + double volume=1; + for(int mu=0;mu(Umu,mu); + /* Debug force unit + U[mu] = 1.0; + PokeIndex(Umu,U[mu],mu); + */ + } + + ref = zero; + + RealD mass=0.1; + RealD csw = 1.0; + + { // Simple clover implementation + + // ref = ref + mass * src; + } + + WilsonCloverFermionR Dwc(Umu,Grid,RBGrid,mass,csw,params); + + + std::cout< * = < chi | Deo^dag| phi> "< HermOpEO(Dwc); + HermOpEO.MpcDagMpc(chi_e,dchi_e,t1,t2); + HermOpEO.MpcDagMpc(chi_o,dchi_o,t1,t2); + + HermOpEO.MpcDagMpc(phi_e,dphi_e,t1,t2); + HermOpEO.MpcDagMpc(phi_o,dphi_o,t1,t2); + + pDce = innerProduct(phi_e,dchi_e); + pDco = innerProduct(phi_o,dchi_o); + cDpe = innerProduct(chi_e,dphi_e); + cDpo = innerProduct(chi_o,dphi_o); + + std::cout< Date: Fri, 28 Apr 2017 15:51:05 +0100 Subject: [PATCH 022/620] Correcting the M and Mdag in the clover term --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 277 +++++++++--------- 1 file changed, 146 insertions(+), 131 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index ebea565b..3ab481ce 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -30,13 +30,15 @@ #include #include -namespace Grid { -namespace QCD { +namespace Grid +{ +namespace QCD +{ -//WilsonLoop::CloverPlaquette -///////////////////////////////////////////////////// -//// Clover plaquette combination in mu,nu plane with Double Stored U -//////////////////////////////////////////////////// +//WilsonLoop::CloverPlaquette +///////////////////////////////////////////////////// +//// Clover plaquette combination in mu,nu plane with Double Stored U +//////////////////////////////////////////////////// //static void CloverPlaquette(GaugeMat &Q, const std::vector &U, // const int mu, const int nu){ // Q = zero; @@ -54,149 +56,162 @@ namespace QCD { // U[nu], nu, Gimpl::CovShiftBackward(U[mu], mu, U[nu] ))); // } +// *NOT* EO +template +RealD WilsonCloverFermion::M(const FermionField &in, FermionField &out) +{ + // Wilson term + out.checkerboard = in.checkerboard; + this->Dhop(in, out, DaggerNo); + // Clover term + // apply the sigma and Fmunu + FermionField temp(out._grid); + Mooee(in, temp); + // overall factor + out += temp; + return axpy_norm(out, 4 + this->mass, in, out); +} -// *NOT* EO - template - RealD WilsonCloverFermion::M(const FermionField& in, FermionField& out) { - // Wilson term - out.checkerboard = in.checkerboard; - this->Dhop(in, out, DaggerNo); - // Clover term - // apply the sigma and Fmunu - Mooee(in, out); - // overall factor - return axpy_norm(out, 4 + this->mass, in, out); +template +RealD WilsonCloverFermion::Mdag(const FermionField &in, FermionField &out) +{ + // Wilson term + out.checkerboard = in.checkerboard; + this->Dhop(in, out, DaggerYes); + // Clover term + // apply the sigma and Fmunu + FermionField temp(out._grid); + MooeeDag(in, temp); + out+=temp; + return axpy_norm(out, 4 + this->mass, in, out); +} + +template +void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) +{ + this->ImportGauge(_Umu); + GridBase *grid = _Umu._grid; + assert(Nd == 4); // only works in 4 dim + typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid); + + // Compute the field strength terms + WilsonLoops::FieldStrength(Bx, _Umu, Ydir, Zdir); + WilsonLoops::FieldStrength(By, _Umu, Zdir, Xdir); + WilsonLoops::FieldStrength(Bz, _Umu, Xdir, Ydir); + WilsonLoops::FieldStrength(Ex, _Umu, Tdir, Xdir); + WilsonLoops::FieldStrength(Ey, _Umu, Tdir, Ydir); + WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); + + // Compute the Clover Operator acting on Colour and Spin + CloverTerm = fillClover(Bx) * (Gamma(Gamma::Algebra::SigmaYZ)); + CloverTerm += fillClover(By) * (Gamma(Gamma::Algebra::MinusSigmaXZ)); + CloverTerm += fillClover(Bz) * (Gamma(Gamma::Algebra::SigmaXY)); + CloverTerm += fillClover(Ex) * (Gamma(Gamma::Algebra::MinusSigmaXT)); + CloverTerm += fillClover(Ey) * (Gamma(Gamma::Algebra::MinusSigmaYT)); + CloverTerm += fillClover(Ez) * (Gamma(Gamma::Algebra::MinusSigmaZT)); + CloverTerm *= csw; + + int lvol = _Umu._grid->lSites(); + int DimRep = Impl::Dimension; + + Eigen::MatrixXcd EigenCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); + Eigen::MatrixXcd EigenInvCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); + + std::vector lcoor; + typename SiteCloverType::scalar_object Qx = zero, Qxinv = zero; + + for (int site = 0; site < lvol; site++) + { + grid->LocalIndexToLocalCoor(site, lcoor); + EigenCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); + peekLocalSite(Qx, CloverTerm, lcoor); + Qxinv = zero; + for (int j = 0; j < Ns; j++) + for (int k = 0; k < Ns; k++) + for (int a = 0; a < DimRep; a++) + for (int b = 0; b < DimRep; b++) + EigenCloverOp(a + j * DimRep, b + k * DimRep) = Qx()(j, k)(a, b); + + EigenInvCloverOp = EigenCloverOp.inverse(); + for (int j = 0; j < Ns; j++) + for (int k = 0; k < Ns; k++) + for (int a = 0; a < DimRep; a++) + for (int b = 0; b < DimRep; b++) + Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep); + + pokeLocalSite(Qxinv, CloverTermInv, lcoor); } +} - template - RealD WilsonCloverFermion::Mdag(const FermionField& in, FermionField& out) { - // Wilson term - out.checkerboard = in.checkerboard; - this->Dhop(in, out, DaggerYes); - // Clover term - // apply the sigma and Fmunu - MooeeDag(in, out); - return axpy_norm(out, 4 + this->mass, in, out); - } +template +void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) +{ + this->MooeeInternal(in, out, DaggerNo, InverseNo); +} - template - void WilsonCloverFermion::ImportGauge(const GaugeField& _Umu) { - this->ImportGauge(_Umu); - GridBase* grid = _Umu._grid; - assert(Nd==4); //only works in 4 dim - typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid); - // Compute the field strength terms - WilsonLoops::FieldStrength(Bx, _Umu, Ydir, Zdir); - WilsonLoops::FieldStrength(By, _Umu, Zdir, Xdir); - WilsonLoops::FieldStrength(Bz, _Umu, Xdir, Ydir); - WilsonLoops::FieldStrength(Ex, _Umu, Tdir, Xdir); - WilsonLoops::FieldStrength(Ey, _Umu, Tdir, Ydir); - WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); +template +void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &out) +{ + this->MooeeInternal(in, out, DaggerNo, InverseYes); +} - // Compute the Clover Operator acting on Colour and Spin - CloverTerm = fillClover(Bx)*(Gamma(Gamma::Algebra::SigmaYZ)); - CloverTerm += fillClover(By)*(Gamma(Gamma::Algebra::MinusSigmaXZ)); - CloverTerm += fillClover(Bz)*(Gamma(Gamma::Algebra::SigmaXY)); - CloverTerm += fillClover(Ex)*(Gamma(Gamma::Algebra::MinusSigmaXT)); - CloverTerm += fillClover(Ey)*(Gamma(Gamma::Algebra::MinusSigmaYT)); - CloverTerm += fillClover(Ez)*(Gamma(Gamma::Algebra::MinusSigmaZT)); - CloverTerm *= csw; +template +void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &out) +{ + this->MooeeInternal(in, out, DaggerNo, InverseYes); +} +template +void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out) +{ + this->MooeeInternal(in, out, DaggerNo, InverseYes); +} - int lvol = _Umu._grid->lSites(); - int DimRep = Impl::Dimension; +template +void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv) +{ + out.checkerboard = in.checkerboard; + CloverFieldType *Clover; - Eigen::MatrixXcd EigenCloverOp = Eigen::MatrixXcd::Zero(Ns*DimRep,Ns*DimRep); - Eigen::MatrixXcd EigenInvCloverOp = Eigen::MatrixXcd::Zero(Ns*DimRep,Ns*DimRep); - - std::vector lcoor; - typename SiteCloverType::scalar_object Qx = zero, Qxinv = zero; + Clover = (inv) ? &CloverTermInv : &CloverTerm; + if (dag){ out = adj(*Clover) * in;} else { out = *Clover * in;} +} // MooeeInternal - for (int site = 0; site < lvol; site++){ - grid->LocalIndexToLocalCoor(site,lcoor); - EigenCloverOp=Eigen::MatrixXcd::Zero(Ns*DimRep,Ns*DimRep); - peekLocalSite(Qx,CloverTerm,lcoor); - Qxinv = zero; - for(int j = 0; j < Ns; j++) - for (int k = 0; k < Ns; k++) - for(int a = 0; a < DimRep; a++) - for(int b = 0; b < DimRep; b++) - EigenCloverOp(a+j*DimRep,b+k*DimRep) = Qx()(j,k)(a,b); +// Derivative parts +template +void WilsonCloverFermion::MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) +{ + GaugeField tmp(mat._grid); - EigenInvCloverOp = EigenCloverOp.inverse(); - for(int j = 0; j < Ns; j++) - for (int k = 0; k < Ns; k++) - for(int a = 0; a < DimRep; a++) - for(int b = 0; b < DimRep; b++) - Qxinv()(j,k)(a,b) = EigenInvCloverOp(a+j*DimRep,b+k*DimRep); + conformable(U._grid, V._grid); + conformable(U._grid, mat._grid); - pokeLocalSite(Qxinv,CloverTermInv,lcoor); - } - } + mat.checkerboard = U.checkerboard; + tmp.checkerboard = U.checkerboard; - template - void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out){ - this -> MooeeInternal(in, out, DaggerNo, InverseNo); - } + this->DhopDeriv(mat, U, V, dag); + MooDeriv(tmp, U, V, dag); + mat += tmp; +} - template - void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &out){ - this -> MooeeInternal(in, out, DaggerNo, InverseYes); - } +// Derivative parts +template +void WilsonCloverFermion::MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) +{ + // Compute the 8 terms of the derivative + assert(0); // not implemented yet +} - template - void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &out){ - this -> MooeeInternal(in, out, DaggerNo, InverseYes); - } - - template - void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out){ - this -> MooeeInternal(in, out, DaggerNo, InverseYes); - } - - - template - void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv){ - out.checkerboard = in.checkerboard; - CloverFieldType *Clover; - - Clover = (inv) ? &CloverTermInv : &CloverTerm; - if(dag){ out = adj(*Clover)*in;} else {out = *Clover*in;} - } // MooeeInternal - - // Derivative parts - template - void WilsonCloverFermion::MDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ - GaugeField tmp(mat._grid); - - conformable(U._grid, V._grid); - conformable(U._grid, mat._grid); - - mat.checkerboard = U.checkerboard; - tmp.checkerboard = U.checkerboard; - - this->DhopDeriv(mat, U, V, dag); - MooDeriv(tmp, U, V, dag); - mat += tmp; - } - - // Derivative parts - template - void WilsonCloverFermion::MooDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ - // Compute the 8 terms of the derivative - assert(0); // not implemented yet - } - - // Derivative parts - template - void WilsonCloverFermion::MeeDeriv(GaugeField&mat, const FermionField&U, const FermionField&V, int dag){ - assert(0); // not implemented yet - } +// Derivative parts +template +void WilsonCloverFermion::MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) +{ + assert(0); // not implemented yet +} FermOpTemplateInstantiate(WilsonCloverFermion); // now only for the fundamental representation //AdjointFermOpTemplateInstantiate(WilsonCloverFermion); //TwoIndexFermOpTemplateInstantiate(WilsonCloverFermion); //GparityFermOpTemplateInstantiate(WilsonCloverFermion); - } } From 62a64d9108cf260cb0f5d3dd18aa0695568cc432 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 1 May 2017 11:06:21 +0100 Subject: [PATCH 023/620] EO support, wip --- .vscode/settings.json | 38 +++++++++++++++++++ lib/qcd/action/fermion/WilsonCloverFermion.cc | 15 +++++++- lib/qcd/action/fermion/WilsonCloverFermion.h | 8 +++- tests/core/Test_wilson_clover.cc | 3 +- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 20af2f68..dd8f0473 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,41 @@ // Place your settings in this file to overwrite default and user settings. { + "files.associations": { + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "array": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "condition_variable": "cpp", + "cstdint": "cpp", + "exception": "cpp", + "slist": "cpp", + "functional": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "limits": "cpp", + "memory": "cpp", + "mutex": "cpp", + "new": "cpp", + "ratio": "cpp", + "stdexcept": "cpp", + "system_error": "cpp", + "thread": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "utility": "cpp" + } } \ No newline at end of file diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 3ab481ce..e1900830 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -91,7 +91,6 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) { this->ImportGauge(_Umu); GridBase *grid = _Umu._grid; - assert(Nd == 4); // only works in 4 dim typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid); // Compute the field strength terms @@ -140,6 +139,11 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep); pokeLocalSite(Qxinv, CloverTermInv, lcoor); + // Separate the even and odd parts. + pickCheckerboard(Even, CloverTermEven, CloverTerm); + pickCheckerboard( Odd, CloverTermOdd, CloverTerm); + pickCheckerboard(Even, CloverTermInvEven, CloverTermInv); + pickCheckerboard( Odd, CloverTermInvOdd, CloverTermInv); } } @@ -172,8 +176,15 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie { out.checkerboard = in.checkerboard; CloverFieldType *Clover; + if (in.checkerboard == Odd){ + std::cout << "Calling clover term Odd" << std::endl; + Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; + } + if (in.checkerboard == Even){ + std::cout << "Calling clover term Even" << std::endl; + Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; + } - Clover = (inv) ? &CloverTermInv : &CloverTerm; if (dag){ out = adj(*Clover) * in;} else { out = *Clover * in;} } // MooeeInternal diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index 0fa0d57d..c9e7be39 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -59,7 +59,11 @@ public: Hgrid, _mass, p), CloverTerm(&Fgrid), - CloverTermInv(&Fgrid) + CloverTermInv(&Fgrid), + CloverTermEven(&Hgrid), + CloverTermOdd(&Hgrid), + CloverTermInvEven(&Hgrid), + CloverTermInvOdd(&Hgrid) { csw = _csw; assert(Nd == 4); // require 4 dimensions @@ -85,6 +89,8 @@ private: RealD csw; // Clover coefficient CloverFieldType CloverTerm, CloverTermInv; // Clover term + CloverFieldType CloverTermEven, CloverTermOdd; + CloverFieldType CloverTermInvEven, CloverTermInvOdd; // Clover term // eventually these two can be compressed into 6x6 blocks instead of the 12x12 // using the DeGrand-Rossi basis for the gamma matrices diff --git a/tests/core/Test_wilson_clover.cc b/tests/core/Test_wilson_clover.cc index 08516d80..3df69e3b 100644 --- a/tests/core/Test_wilson_clover.cc +++ b/tests/core/Test_wilson_clover.cc @@ -191,8 +191,9 @@ int main (int argc, char ** argv) Dwc.MooeeInv(src_e,phi_e); Dwc.Mooee(chi_o,src_o); +exit(1); Dwc.MooeeInv(src_o,phi_o); - + setCheckerboard(phi,phi_e); setCheckerboard(phi,phi_o); From 2f0dd83016075d7541a0ef86289af64cfae73fed Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 3 May 2017 12:53:41 +0100 Subject: [PATCH 024/620] Calculate HVP using a single contraction of O(alpha) charged propagators. --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 131 ++++++++++++++++++++ extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 18 +-- 2 files changed, 142 insertions(+), 7 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 5a5ef4f0..9689a63f 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -32,6 +32,11 @@ std::vector TScalarVP::getOutput(void) out.push_back(getName() + "_propQ_" + std::to_string(mu)); out.push_back(getName() + "_propSun_" + std::to_string(mu)); out.push_back(getName() + "_propTad_" + std::to_string(mu)); + + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + out.push_back(getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu)); + } } return out; @@ -51,12 +56,22 @@ void TScalarVP::setup(void) muPropQName_.clear(); muPropSunName_.clear(); muPropTadName_.clear(); + vpTensorName_.clear(); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) { phaseName_.push_back("_shiftphase_" + std::to_string(mu)); muPropQName_.push_back(getName() + "_propQ_" + std::to_string(mu)); muPropSunName_.push_back(getName() + "_propSun_" + std::to_string(mu)); muPropTadName_.push_back(getName() + "_propTad_" + std::to_string(mu)); + + std::vector vpTensorName_mu; + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + vpTensorName_mu.push_back(getName() + "_" + std::to_string(mu) + + "_" + std::to_string(nu)); + } + vpTensorName_.push_back(vpTensorName_mu); } if (!env().hasRegisteredObject(freeMomPropName_)) @@ -93,6 +108,13 @@ void TScalarVP::setup(void) { env().registerLattice(muPropTadName_[mu]); } + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + env().registerLattice(vpTensorName_[mu][nu]); + } + } env().registerLattice(getName()); } @@ -182,6 +204,115 @@ void TScalarVP::execute(void) buf, fft); } + // CONTRACTIONS + vpTensor_.clear(); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + std::vector vpTensor_mu; + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + vpTensor_mu.push_back(env().createLattice(vpTensorName_[mu][nu])); + } + vpTensor_.push_back(vpTensor_mu); + } + ScalarField prop1(env().getGrid()), prop2(env().getGrid()); + EmField &A = *env().getObject(par().emField); + ScalarField Amu(env().getGrid()); + TComplex Anu0; + std::vector coor0 = {0, 0, 0, 0}; + + // Position-space implementation + prop1 = *GFSrc_ + q*propQ + q*q*propSun + q*q*propTad; + fft.FFT_all_dim(prop1, prop1, FFT::backward); + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + peekSite(Anu0, peekLorentz(A, nu), coor0); + prop2 = adj(*phase_[nu])*(*GFSrc_) + q*(*(muPropQ_[nu])) + + q*q*(*(muPropSun_[nu]) + *(muPropTad_[nu])); + fft.FFT_all_dim(prop2, prop2, FFT::backward); + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + LOG(Message) << "Computing Pi[" << mu << "][" << nu << "]..." + << std::endl; + Amu = peekLorentz(A, mu); + ScalarField &pi_mu_nu = *(vpTensor_[mu][nu]); + pi_mu_nu = adj(prop2) + * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) + * Cshift(prop1, mu, 1) + * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + pi_mu_nu -= Cshift(adj(prop2), mu, 1) + * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) + * prop1 + * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + pi_mu_nu = 2.0*real(pi_mu_nu); + } + } + + // // Momentum-space implementation + // ScalarField propbuf1(env().getGrid()), propbuf2(env().getGrid()); + // prop1 = *GFSrc_ + q*propQ + q*q*propSun + q*q*propTad; + // for (unsigned int nu = 0; nu < env().getNd(); ++nu) + // { + // peekSite(Anu0, peekLorentz(A, nu), coor0); + // prop2 = adj(*phase_[nu])*(*GFSrc_) + q*(*(muPropQ_[nu])) + // + q*q*(*(muPropSun_[nu]) + *(muPropTad_[nu])); + + // for (unsigned int mu = 0; mu < env().getNd(); ++mu) + // { + // LOG(Message) << "Computing Pi[" << mu << "][" << nu << "]..." + // << std::endl; + // Amu = peekLorentz(A, mu); + // ScalarField &pi_mu_nu = *(vpTensor_[mu][nu]); + // propbuf1 = (*phase_[mu])*prop1; + // fft.FFT_all_dim(propbuf1, propbuf1, FFT::backward); + // fft.FFT_all_dim(propbuf2, prop2, FFT::backward); + // pi_mu_nu = adj(propbuf2) + // * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) + // * propbuf1 + // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + // propbuf2 = (*phase_[mu])*prop2; + // fft.FFT_all_dim(propbuf1, prop1, FFT::backward); + // fft.FFT_all_dim(propbuf2, propbuf2, FFT::backward); + // pi_mu_nu -= adj(propbuf2) + // * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) + // * propbuf1 + // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + // pi_mu_nu = 2.0*real(pi_mu_nu); + // } + // } + + // OUTPUT IF NECESSARY + if (!par().output.empty()) + { + std::string filename = par().output + "." + + std::to_string(env().getTrajectory()); + + LOG(Message) << "Saving zero-momentum projection to '" + << filename << "'..." << std::endl; + + CorrWriter writer(filename); + std::vector vecBuf; + std::vector result; + + write(writer, "charge", q); + write(writer, "mass", par().mass); + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + sliceSum(*(vpTensor_[mu][nu]), vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + } + } } // Calculate O(q) and O(q^2) terms of momentum-space charged propagator diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 0d93dc45..fbe73d85 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -48,13 +48,17 @@ private: void momD1(ScalarField &s, FFT &fft); void momD2(ScalarField &s, FFT &fft); private: - std::string freeMomPropName_, GFSrcName_, prop0Name_, - propQName_, propSunName_, propTadName_; - std::vector phaseName_, muPropQName_, muPropSunName_, - muPropTadName_; - ScalarField *freeMomProp_, *GFSrc_, *prop0_; - std::vector phase_; - EmField *A; + std::string freeMomPropName_, GFSrcName_, + prop0Name_, propQName_, + propSunName_, propTadName_; + std::vector phaseName_, muPropQName_, + muPropSunName_, muPropTadName_; + std::vector > vpTensorName_; + ScalarField *freeMomProp_, *GFSrc_, + *prop0_; + std::vector phase_; + std::vector > vpTensor_; + EmField *A; }; MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); From db3837be22a6f654e2da45414a4692886ea38d56 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 3 May 2017 13:26:49 +0100 Subject: [PATCH 025/620] =?UTF-8?q?QedFVol:=20Change=20=E2=80=9Cdouble?= =?UTF-8?q?=E2=80=9D=20to=20=E2=80=9CReal=E2=80=9D=20in=20ScalarVP.cc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 9689a63f..7745c40e 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -125,7 +125,7 @@ void TScalarVP::execute(void) ScalarField &source = *env().getObject(par().source); Complex ci(0.0,1.0); FFT fft(env().getGrid()); - double q = par().charge; + Real q = par().charge; // cache momentum-space free scalar propagator if (!env().hasCreatedObject(freeMomPropName_)) From 6cb563a40c97c4a443e6f2d5621d7c8c12f5b04e Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 5 May 2017 17:12:41 +0100 Subject: [PATCH 026/620] QedFVol: Access HVP tensor using a vector> instead of vector> --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 64 +++++---------------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 1 - 2 files changed, 15 insertions(+), 50 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 7745c40e..880b3ffd 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -205,15 +205,15 @@ void TScalarVP::execute(void) } // CONTRACTIONS - vpTensor_.clear(); + std::vector > vpTensor; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - std::vector vpTensor_mu; + std::vector vpTensor_mu; for (unsigned int nu = 0; nu < env().getNd(); ++nu) { - vpTensor_mu.push_back(env().createLattice(vpTensorName_[mu][nu])); + vpTensor_mu.push_back(*env().createLattice(vpTensorName_[mu][nu])); } - vpTensor_.push_back(vpTensor_mu); + vpTensor.push_back(vpTensor_mu); } ScalarField prop1(env().getGrid()), prop2(env().getGrid()); EmField &A = *env().getObject(par().emField); @@ -221,7 +221,6 @@ void TScalarVP::execute(void) TComplex Anu0; std::vector coor0 = {0, 0, 0, 0}; - // Position-space implementation prop1 = *GFSrc_ + q*propQ + q*q*propSun + q*q*propTad; fft.FFT_all_dim(prop1, prop1, FFT::backward); for (unsigned int nu = 0; nu < env().getNd(); ++nu) @@ -231,57 +230,24 @@ void TScalarVP::execute(void) + q*q*(*(muPropSun_[nu]) + *(muPropTad_[nu])); fft.FFT_all_dim(prop2, prop2, FFT::backward); + std::vector pi_nu; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { LOG(Message) << "Computing Pi[" << mu << "][" << nu << "]..." << std::endl; Amu = peekLorentz(A, mu); - ScalarField &pi_mu_nu = *(vpTensor_[mu][nu]); - pi_mu_nu = adj(prop2) - * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) - * Cshift(prop1, mu, 1) - * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); - pi_mu_nu -= Cshift(adj(prop2), mu, 1) - * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) - * prop1 - * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); - pi_mu_nu = 2.0*real(pi_mu_nu); + vpTensor[mu][nu] = adj(prop2) + * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) + * Cshift(prop1, mu, 1) + * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) + * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) + * prop1 + * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + vpTensor[mu][nu] = 2.0*real(vpTensor[mu][nu]); } } - // // Momentum-space implementation - // ScalarField propbuf1(env().getGrid()), propbuf2(env().getGrid()); - // prop1 = *GFSrc_ + q*propQ + q*q*propSun + q*q*propTad; - // for (unsigned int nu = 0; nu < env().getNd(); ++nu) - // { - // peekSite(Anu0, peekLorentz(A, nu), coor0); - // prop2 = adj(*phase_[nu])*(*GFSrc_) + q*(*(muPropQ_[nu])) - // + q*q*(*(muPropSun_[nu]) + *(muPropTad_[nu])); - - // for (unsigned int mu = 0; mu < env().getNd(); ++mu) - // { - // LOG(Message) << "Computing Pi[" << mu << "][" << nu << "]..." - // << std::endl; - // Amu = peekLorentz(A, mu); - // ScalarField &pi_mu_nu = *(vpTensor_[mu][nu]); - // propbuf1 = (*phase_[mu])*prop1; - // fft.FFT_all_dim(propbuf1, propbuf1, FFT::backward); - // fft.FFT_all_dim(propbuf2, prop2, FFT::backward); - // pi_mu_nu = adj(propbuf2) - // * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) - // * propbuf1 - // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); - // propbuf2 = (*phase_[mu])*prop2; - // fft.FFT_all_dim(propbuf1, prop1, FFT::backward); - // fft.FFT_all_dim(propbuf2, propbuf2, FFT::backward); - // pi_mu_nu -= adj(propbuf2) - // * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) - // * propbuf1 - // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); - // pi_mu_nu = 2.0*real(pi_mu_nu); - // } - // } - // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -302,7 +268,7 @@ void TScalarVP::execute(void) { for (unsigned int nu = 0; nu < env().getNd(); ++nu) { - sliceSum(*(vpTensor_[mu][nu]), vecBuf, Tp); + sliceSum(vpTensor[mu][nu], vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) { diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index fbe73d85..9d884575 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -57,7 +57,6 @@ private: ScalarField *freeMomProp_, *GFSrc_, *prop0_; std::vector phase_; - std::vector > vpTensor_; EmField *A; }; From 914f180fa31ca19b0710d393221f56785141b67c Mon Sep 17 00:00:00 2001 From: James Harrison Date: Tue, 9 May 2017 11:46:25 +0100 Subject: [PATCH 027/620] QedFVol: Implement exact O(alpha) vacuum polarisation. --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 119 ++++++++++++++------ extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 3 +- 2 files changed, 85 insertions(+), 37 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 880b3ffd..6e9be923 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -30,8 +30,6 @@ std::vector TScalarVP::getOutput(void) for (unsigned int mu = 0; mu < env().getNd(); ++mu) { out.push_back(getName() + "_propQ_" + std::to_string(mu)); - out.push_back(getName() + "_propSun_" + std::to_string(mu)); - out.push_back(getName() + "_propTad_" + std::to_string(mu)); for (unsigned int nu = 0; nu < env().getNd(); ++nu) { @@ -54,16 +52,12 @@ void TScalarVP::setup(void) phaseName_.clear(); muPropQName_.clear(); - muPropSunName_.clear(); - muPropTadName_.clear(); vpTensorName_.clear(); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { phaseName_.push_back("_shiftphase_" + std::to_string(mu)); muPropQName_.push_back(getName() + "_propQ_" + std::to_string(mu)); - muPropSunName_.push_back(getName() + "_propSun_" + std::to_string(mu)); - muPropTadName_.push_back(getName() + "_propTad_" + std::to_string(mu)); std::vector vpTensorName_mu; for (unsigned int nu = 0; nu < env().getNd(); ++nu) @@ -99,16 +93,8 @@ void TScalarVP::setup(void) env().registerLattice(muPropQName_[mu]); } env().registerLattice(propSunName_); - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - env().registerLattice(muPropSunName_[mu]); - } env().registerLattice(propTadName_); for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - env().registerLattice(muPropTadName_[mu]); - } - for (unsigned int mu = 0; mu < env().getNd(); ++mu) { for (unsigned int nu = 0; nu < env().getNd(); ++nu) { @@ -191,17 +177,16 @@ void TScalarVP::execute(void) chargedProp(propQ, propSun, propTad, *GFSrc_, fft); // Propagators from shifted sources - std::vector muPropQ_, muPropSun_, muPropTad_; - ScalarField buf(env().getGrid()); + std::vector muPropQ; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - muPropQ_.push_back(env().createLattice(muPropQName_[mu])); - muPropSun_.push_back(env().createLattice(muPropSunName_[mu])); - muPropTad_.push_back(env().createLattice(muPropTadName_[mu])); + muPropQ.push_back(*env().createLattice(muPropQName_[mu])); - buf = adj(*phase_[mu])*(*GFSrc_); - chargedProp(*(muPropQ_[mu]), *(muPropSun_[mu]), *(muPropTad_[mu]), - buf, fft); + // -G*momD1*G*F*tau_mu*Src (momD1 = F*D1*Finv) + muPropQ[mu] = adj(*phase_[mu])*(*GFSrc_); + momD1(muPropQ[mu], fft); + muPropQ[mu] = -(*freeMomProp_)*muPropQ[mu]; + fft.FFT_all_dim(muPropQ[mu], muPropQ[mu], FFT::backward); } // CONTRACTIONS @@ -221,33 +206,94 @@ void TScalarVP::execute(void) TComplex Anu0; std::vector coor0 = {0, 0, 0, 0}; - prop1 = *GFSrc_ + q*propQ + q*q*propSun + q*q*propTad; - fft.FFT_all_dim(prop1, prop1, FFT::backward); + // Free VP + + // Charged VP for (unsigned int nu = 0; nu < env().getNd(); ++nu) { peekSite(Anu0, peekLorentz(A, nu), coor0); - prop2 = adj(*phase_[nu])*(*GFSrc_) + q*(*(muPropQ_[nu])) - + q*q*(*(muPropSun_[nu]) + *(muPropTad_[nu])); - fft.FFT_all_dim(prop2, prop2, FFT::backward); - std::vector pi_nu; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { LOG(Message) << "Computing Pi[" << mu << "][" << nu << "]..." << std::endl; Amu = peekLorentz(A, mu); - vpTensor[mu][nu] = adj(prop2) - * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) - * Cshift(prop1, mu, 1) - * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + + // "Exchange" terms + prop1 = *prop0_ + q*propQ; + prop2 = Cshift(*prop0_, nu, -1) + q*muPropQ[nu]; + vpTensor[mu][nu] = adj(prop2) * (1.0 + ci*q*Amu) + * Cshift(prop1, mu, 1) * (1.0 + ci*q*Anu0); + vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * (1.0 - ci*q*Amu) + * prop1 * (1.0 + ci*q*Anu0); + + // Subtract O(alpha^2) term + prop1 = q*propQ; + prop2 = q*muPropQ[nu]; + vpTensor[mu][nu] -= adj(prop2) * ci*q*Amu + * Cshift(prop1, mu, 1) * ci*q*Anu0; + vpTensor[mu][nu] += Cshift(adj(prop2), mu, 1) * (-ci)*q*Amu + * prop1 * ci*q*Anu0; + + // Sunset+tadpole from source + prop1 = q*q*(propSun + propTad); + prop2 = Cshift(*prop0_, nu, -1); + vpTensor[mu][nu] += adj(prop2) * Cshift(prop1, mu, 1); + vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * prop1; + + // Sunset+tadpole from shifted source + prop1 = Cshift(prop1, nu, -1); + vpTensor[mu][nu] += Cshift(adj(*prop0_), mu, 1) * prop1; + vpTensor[mu][nu] -= adj(*prop0_) * Cshift(prop1, mu, 1); + + // Source tadpole + prop1 = *prop0_; + vpTensor[mu][nu] += adj(prop2) + * Cshift(prop1, mu, 1) + * (-0.5)*q*q*Anu0*Anu0; vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) - * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) * prop1 - * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + * (-0.5)*q*q*Anu0*Anu0; + + // Sink tadpole + vpTensor[mu][nu] += adj(prop2) + * (-0.5)*q*q*Amu*Amu + * Cshift(prop1, mu, 1); + vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) + * (-0.5)*q*q*Amu*Amu + * prop1; + vpTensor[mu][nu] = 2.0*real(vpTensor[mu][nu]); } } + // prop1 = *GFSrc_ + q*propQ + q*q*propSun + q*q*propTad; + // fft.FFT_all_dim(prop1, prop1, FFT::backward); + // for (unsigned int nu = 0; nu < env().getNd(); ++nu) + // { + // peekSite(Anu0, peekLorentz(A, nu), coor0); + // prop2 = adj(*phase_[nu])*(*GFSrc_) + q*(*(muPropQ_[nu])) + // + q*q*(*(muPropSun_[nu]) + *(muPropTad_[nu])); + // fft.FFT_all_dim(prop2, prop2, FFT::backward); + + // std::vector pi_nu; + // for (unsigned int mu = 0; mu < env().getNd(); ++mu) + // { + // LOG(Message) << "Computing Pi[" << mu << "][" << nu << "]..." + // << std::endl; + // Amu = peekLorentz(A, mu); + // vpTensor[mu][nu] = adj(prop2) + // * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) + // * Cshift(prop1, mu, 1) + // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + // vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) + // * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) + // * prop1 + // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); + // vpTensor[mu][nu] = 2.0*real(vpTensor[mu][nu]); + // } + // } + // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -281,7 +327,7 @@ void TScalarVP::execute(void) } } -// Calculate O(q) and O(q^2) terms of momentum-space charged propagator +// Calculate O(q) and O(q^2) terms of position-space charged propagator void TScalarVP::chargedProp(ScalarField &prop_q, ScalarField &prop_sun, ScalarField &prop_tad, ScalarField &GFSrc, FFT &fft) @@ -300,15 +346,18 @@ void TScalarVP::chargedProp(ScalarField &prop_q, ScalarField &prop_sun, momD1(buf, fft); buf = G*buf; prop_q = -buf; + fft.FFT_all_dim(prop_q, prop_q, FFT::backward); // G*momD1*G*momD1*G*F*Src momD1(buf, fft); prop_sun = G*buf; + fft.FFT_all_dim(prop_sun, prop_sun, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); prop_tad = -G*buf; + fft.FFT_all_dim(prop_tad, prop_tad, FFT::backward); } void TScalarVP::momD1(ScalarField &s, FFT &fft) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 9d884575..e0bdd034 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -51,8 +51,7 @@ private: std::string freeMomPropName_, GFSrcName_, prop0Name_, propQName_, propSunName_, propTadName_; - std::vector phaseName_, muPropQName_, - muPropSunName_, muPropTadName_; + std::vector phaseName_, muPropQName_; std::vector > vpTensorName_; ScalarField *freeMomProp_, *GFSrc_, *prop0_; From 5cfc0180aaab83f80c0d8b92d25bbbe97cce57f7 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Tue, 9 May 2017 12:46:57 +0100 Subject: [PATCH 028/620] QedFVol: Output free VP along with charged VP. --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 96 ++++++++++----------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 3 +- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 6e9be923..f6f40700 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -23,7 +23,7 @@ std::vector TScalarVP::getInput(void) std::vector TScalarVP::getOutput(void) { - std::vector out = {getName(), getName()+"_propQ", + std::vector out = {getName()+"_propQ", getName()+"_propSun", getName()+"_propTad"}; @@ -34,6 +34,7 @@ std::vector TScalarVP::getOutput(void) for (unsigned int nu = 0; nu < env().getNd(); ++nu) { out.push_back(getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu)); + out.push_back(getName() + "_free_" + std::to_string(mu) + "_" + std::to_string(nu)); } } @@ -53,6 +54,7 @@ void TScalarVP::setup(void) phaseName_.clear(); muPropQName_.clear(); vpTensorName_.clear(); + freeVpTensorName_.clear(); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { @@ -60,12 +62,16 @@ void TScalarVP::setup(void) muPropQName_.push_back(getName() + "_propQ_" + std::to_string(mu)); std::vector vpTensorName_mu; + std::vector freeVpTensorName_mu; for (unsigned int nu = 0; nu < env().getNd(); ++nu) { vpTensorName_mu.push_back(getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu)); + freeVpTensorName_mu.push_back(getName() + "_free_" + std::to_string(mu) + + "_" + std::to_string(nu)); } vpTensorName_.push_back(vpTensorName_mu); + freeVpTensorName_.push_back(freeVpTensorName_mu); } if (!env().hasRegisteredObject(freeMomPropName_)) @@ -90,7 +96,7 @@ void TScalarVP::setup(void) env().registerLattice(propQName_); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - env().registerLattice(muPropQName_[mu]); + env().registerLattice(muPropQName_[mu]); } env().registerLattice(propSunName_); env().registerLattice(propTadName_); @@ -99,9 +105,9 @@ void TScalarVP::setup(void) for (unsigned int nu = 0; nu < env().getNd(); ++nu) { env().registerLattice(vpTensorName_[mu][nu]); + env().registerLattice(freeVpTensorName_[mu][nu]); } } - env().registerLattice(getName()); } // execution /////////////////////////////////////////////////////////////////// @@ -171,12 +177,18 @@ void TScalarVP::execute(void) // PROPAGATOR CALCULATION // Propagator from unshifted source + LOG(Message) << "Computing O(alpha) charged scalar propagator" + << " (mass= " << par().mass + << ", charge= " << q << ")..." + << std::endl; ScalarField &propQ = *env().createLattice(propQName_); ScalarField &propSun = *env().createLattice(propSunName_); ScalarField &propTad = *env().createLattice(propTadName_); chargedProp(propQ, propSun, propTad, *GFSrc_, fft); // Propagators from shifted sources + LOG(Message) << "Computing O(q) charged scalar propagators..." + << std::endl; std::vector muPropQ; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { @@ -190,25 +202,25 @@ void TScalarVP::execute(void) } // CONTRACTIONS - std::vector > vpTensor; - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - std::vector vpTensor_mu; - for (unsigned int nu = 0; nu < env().getNd(); ++nu) - { - vpTensor_mu.push_back(*env().createLattice(vpTensorName_[mu][nu])); - } - vpTensor.push_back(vpTensor_mu); - } ScalarField prop1(env().getGrid()), prop2(env().getGrid()); EmField &A = *env().getObject(par().emField); ScalarField Amu(env().getGrid()); TComplex Anu0; std::vector coor0 = {0, 0, 0, 0}; + std::vector > vpTensor, freeVpTensor; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + std::vector vpTensor_mu; + std::vector freeVpTensor_mu; + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + vpTensor_mu.push_back(*env().createLattice(vpTensorName_[mu][nu])); + freeVpTensor_mu.push_back(*env().createLattice(freeVpTensorName_[mu][nu])); + } + vpTensor.push_back(vpTensor_mu); + freeVpTensor.push_back(freeVpTensor_mu); + } - // Free VP - - // Charged VP for (unsigned int nu = 0; nu < env().getNd(); ++nu) { peekSite(Anu0, peekLorentz(A, nu), coor0); @@ -219,9 +231,15 @@ void TScalarVP::execute(void) << std::endl; Amu = peekLorentz(A, mu); + // Free VP + prop1 = *prop0_; + prop2 = Cshift(*prop0_, nu, -1); + freeVpTensor[mu][nu] = adj(prop2) * Cshift(prop1, mu, 1); + freeVpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * prop1; + // "Exchange" terms - prop1 = *prop0_ + q*propQ; - prop2 = Cshift(*prop0_, nu, -1) + q*muPropQ[nu]; + prop1 += q*propQ; + prop2 += q*muPropQ[nu]; vpTensor[mu][nu] = adj(prop2) * (1.0 + ci*q*Amu) * Cshift(prop1, mu, 1) * (1.0 + ci*q*Anu0); vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * (1.0 - ci*q*Amu) @@ -267,33 +285,6 @@ void TScalarVP::execute(void) } } - // prop1 = *GFSrc_ + q*propQ + q*q*propSun + q*q*propTad; - // fft.FFT_all_dim(prop1, prop1, FFT::backward); - // for (unsigned int nu = 0; nu < env().getNd(); ++nu) - // { - // peekSite(Anu0, peekLorentz(A, nu), coor0); - // prop2 = adj(*phase_[nu])*(*GFSrc_) + q*(*(muPropQ_[nu])) - // + q*q*(*(muPropSun_[nu]) + *(muPropTad_[nu])); - // fft.FFT_all_dim(prop2, prop2, FFT::backward); - - // std::vector pi_nu; - // for (unsigned int mu = 0; mu < env().getNd(); ++mu) - // { - // LOG(Message) << "Computing Pi[" << mu << "][" << nu << "]..." - // << std::endl; - // Amu = peekLorentz(A, mu); - // vpTensor[mu][nu] = adj(prop2) - // * (1.0 + ci*q*Amu - 0.5*q*q*Amu*Amu) - // * Cshift(prop1, mu, 1) - // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); - // vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) - // * (1.0 - ci*q*Amu - 0.5*q*q*Amu*Amu) - // * prop1 - // * (1.0 + ci*q*Anu0 - 0.5*q*q*Anu0*Anu0); - // vpTensor[mu][nu] = 2.0*real(vpTensor[mu][nu]); - // } - // } - // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -322,6 +313,16 @@ void TScalarVP::execute(void) } write(writer, "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), result); + + sliceSum(freeVpTensor[mu][nu], vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, + "Pi_"+std::to_string(mu)+"_"+std::to_string(nu)+"_free", + result); } } } @@ -335,11 +336,6 @@ void TScalarVP::chargedProp(ScalarField &prop_q, ScalarField &prop_sun, Complex ci(0.0,1.0); ScalarField &G = *freeMomProp_; ScalarField buf(env().getGrid()); - - LOG(Message) << "Computing charged scalar propagator" - << " (mass= " << par().mass - << ", charge= " << par().charge << ")..." - << std::endl; // -G*momD1*G*F*Src (momD1 = F*D1*Finv) buf = GFSrc; diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index e0bdd034..4629f6e6 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -52,7 +52,8 @@ private: prop0Name_, propQName_, propSunName_, propTadName_; std::vector phaseName_, muPropQName_; - std::vector > vpTensorName_; + std::vector > vpTensorName_, + freeVpTensorName_; ScalarField *freeMomProp_, *GFSrc_, *prop0_; std::vector phase_; From 009f48a9045c87c13ec2fde2b3630446bd65bbb6 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 7 Jun 2017 16:34:09 +0100 Subject: [PATCH 029/620] QedFVol: Add missing factor of 2 in free vacuum polarisation --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index f6f40700..13591d83 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -185,6 +185,63 @@ void TScalarVP::execute(void) ScalarField &propSun = *env().createLattice(propSunName_); ScalarField &propTad = *env().createLattice(propTadName_); chargedProp(propQ, propSun, propTad, *GFSrc_, fft); + // // OUTPUT IF NECESSARY + // if (!par().output.empty()) + // { + // ScalarField fullProp = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; + // std::string filename = par().output + "_prop_000." + + // std::to_string(env().getTrajectory()); + + // LOG(Message) << "Saving zero-momentum projection to '" + // << filename << "'..." << std::endl; + + // CorrWriter writer(filename); + // std::vector vecBuf; + // std::vector result; + + // write(writer, "charge", q); + + // // Write full propagator + // sliceSum(fullProp, vecBuf, Tp); + // result.resize(vecBuf.size()); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop", result); + + // // Write free propagator + // sliceSum(*prop0_, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_0", result); + + // // Write propagator D1 term + // sliceSum(propD1, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_q", result); + + // // Write propagator D1D1 term + // sliceSum(propD1D1, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_sun", result); + + // // Write propagator D2 term + // sliceSum(propD2, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_tad", result); + // } // Propagators from shifted sources LOG(Message) << "Computing O(q) charged scalar propagators..." @@ -281,6 +338,7 @@ void TScalarVP::execute(void) * (-0.5)*q*q*Amu*Amu * prop1; + freeVpTensor[mu][nu] = 2.0*real(freeVpTensor[mu][nu]); vpTensor[mu][nu] = 2.0*real(vpTensor[mu][nu]); } } From e38612e6fa71c57bf64fca975580a036be021cbb Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 7 Jun 2017 17:42:00 +0100 Subject: [PATCH 030/620] QedFVol: Update ScalarVP module for compatibility with new scalar action --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 2 +- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 13591d83..c91b98ae 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -125,7 +125,7 @@ void TScalarVP::execute(void) LOG(Message) << "Caching momentum space free scalar propagator" << " (mass= " << par().mass << ")..." << std::endl; freeMomProp_ = env().createLattice(freeMomPropName_); - Scalar::MomentumSpacePropagator(*freeMomProp_, par().mass); + SIMPL::MomentumSpacePropagator(*freeMomProp_, par().mass); } else { diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 4629f6e6..fdbad6f6 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -1,5 +1,5 @@ -#ifndef Hadrons_ScalarVP_hpp_ -#define Hadrons_ScalarVP_hpp_ +#ifndef Hadrons_MScalar_ScalarVP_hpp_ +#define Hadrons_MScalar_ScalarVP_hpp_ #include #include @@ -66,4 +66,4 @@ END_MODULE_NAMESPACE END_HADRONS_NAMESPACE -#endif // Hadrons_ScalarVP_hpp_ +#endif // Hadrons_MScalar_ScalarVP_hpp_ From 20ac13fdf36d2d82fd0403b1d92d9771849889d6 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 8 Jun 2017 17:43:39 +0100 Subject: [PATCH 031/620] QedFVol: add ChargedProp as an input to ScalarVP module, instead of calculating scalar propagator within ScalarVP. --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 50 ++-- .../Hadrons/Modules/MScalar/ChargedProp.hpp | 2 +- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 240 ++---------------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 8 +- 4 files changed, 51 insertions(+), 249 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index be64b5ec..a9089056 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -23,8 +23,8 @@ std::vector TChargedProp::getInput(void) std::vector TChargedProp::getOutput(void) { - std::vector out = {getName(), getName()+"_0", getName()+"_D1", - getName()+"_D1D1", getName()+"_D2"}; + std::vector out = {getName(), getName()+"_Q", + getName()+"_Sun", getName()+"_Tad"}; return out; } @@ -40,9 +40,9 @@ void TChargedProp::setup(void) } GFSrcName_ = "_" + getName() + "_DinvSrc"; prop0Name_ = getName() + "_0"; - propD1Name_ = getName() + "_D1"; - propD1D1Name_ = getName() + "_D1D1"; - propD2Name_ = getName() + "_D2"; + propQName_ = getName() + "_Q"; + propSunName_ = getName() + "_Sun"; + propTadName_ = getName() + "_Tad"; if (!env().hasRegisteredObject(freeMomPropName_)) { env().registerLattice(freeMomPropName_); @@ -63,9 +63,9 @@ void TChargedProp::setup(void) env().registerLattice(prop0Name_); } env().registerLattice(getName()); - env().registerLattice(propD1Name_); - env().registerLattice(propD1D1Name_); - env().registerLattice(propD2Name_); + env().registerLattice(propQName_); + env().registerLattice(propSunName_); + env().registerLattice(propTadName_); } // execution /////////////////////////////////////////////////////////////////// @@ -140,9 +140,9 @@ void TChargedProp::execute(void) << ", charge= " << par().charge << ")..." << std::endl; ScalarField &prop = *env().createLattice(getName()); - ScalarField &propD1 = *env().createLattice(propD1Name_); - ScalarField &propD1D1 = *env().createLattice(propD1D1Name_); - ScalarField &propD2 = *env().createLattice(propD2Name_); + ScalarField &propQ = *env().createLattice(propQName_); + ScalarField &propSun = *env().createLattice(propSunName_); + ScalarField &propTad = *env().createLattice(propTadName_); ScalarField buf(env().getGrid()); ScalarField &GFSrc = *GFSrc_, &G = *freeMomProp_; double q = par().charge; @@ -151,22 +151,22 @@ void TChargedProp::execute(void) buf = GFSrc; momD1(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propD1, buf, FFT::backward); + fft.FFT_all_dim(propQ, buf, FFT::backward); // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) buf = -buf; momD1(buf, fft); - propD1D1 = G*buf; - fft.FFT_all_dim(propD1D1, propD1D1, FFT::backward); + propSun = G*buf; + fft.FFT_all_dim(propSun, propSun, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propD2, buf, FFT::backward); + fft.FFT_all_dim(propTad, buf, FFT::backward); // full charged scalar propagator - prop = (*prop0_) + q*propD1 + q*q*propD1D1 + q*q*propD2; + prop = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; // OUTPUT IF NECESSARY if (!par().output.empty()) @@ -200,29 +200,29 @@ void TChargedProp::execute(void) } write(writer, "prop_0", result); - // Write propagator D1 term - sliceSum(propD1, vecBuf, Tp); + // Write propagator O(q) term + sliceSum(propQ, vecBuf, Tp); for (unsigned int t = 0; t < vecBuf.size(); ++t) { result[t] = TensorRemove(vecBuf[t]); } - write(writer, "prop_D1", result); + write(writer, "prop_Q", result); - // Write propagator D1D1 term - sliceSum(propD1D1, vecBuf, Tp); + // Write propagator sunset term + sliceSum(propSun, vecBuf, Tp); for (unsigned int t = 0; t < vecBuf.size(); ++t) { result[t] = TensorRemove(vecBuf[t]); } - write(writer, "prop_D1D1", result); + write(writer, "prop_Sun", result); - // Write propagator D2 term - sliceSum(propD2, vecBuf, Tp); + // Write propagator tadpole term + sliceSum(propTad, vecBuf, Tp); for (unsigned int t = 0; t < vecBuf.size(); ++t) { result[t] = TensorRemove(vecBuf[t]); } - write(writer, "prop_D2", result); + write(writer, "prop_Tad", result); } } diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index aeb92179..369fff30 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -46,7 +46,7 @@ private: void momD2(ScalarField &s, FFT &fft); private: std::string freeMomPropName_, GFSrcName_, prop0Name_, - propD1Name_, propD1D1Name_, propD2Name_; + propQName_, propSunName_, propTadName_; std::vector phaseName_; ScalarField *freeMomProp_, *GFSrc_, *prop0_; std::vector phase_; diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index c91b98ae..7a3b4f9e 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -1,3 +1,4 @@ +#include #include #include @@ -16,16 +17,19 @@ TScalarVP::TScalarVP(const std::string name) // dependencies/products /////////////////////////////////////////////////////// std::vector TScalarVP::getInput(void) { - std::vector in = {par().source, par().emField}; + propQName_ = par().scalarProp + "_Q"; + propSunName_ = par().scalarProp + "_Sun"; + propTadName_ = par().scalarProp + "_Tad"; + + std::vector in = {par().emField, propQName_, propSunName_, + propTadName_}; return in; } std::vector TScalarVP::getOutput(void) { - std::vector out = {getName()+"_propQ", - getName()+"_propSun", - getName()+"_propTad"}; + std::vector out; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { @@ -44,12 +48,9 @@ std::vector TScalarVP::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// void TScalarVP::setup(void) { - freeMomPropName_ = FREEMOMPROP(par().mass); - GFSrcName_ = "_" + getName() + "_DinvSrc"; - prop0Name_ = getName() + "_prop0"; - propQName_ = getName() + "_propQ"; - propSunName_ = getName() + "_propSun"; - propTadName_ = getName() + "_propTad"; + freeMomPropName_ = FREEMOMPROP(static_cast(env().getModule(par().scalarProp))->par().mass); + GFSrcName_ = "_" + par().scalarProp + "_DinvSrc"; + prop0Name_ = par().scalarProp + "_0"; phaseName_.clear(); muPropQName_.clear(); @@ -74,174 +75,38 @@ void TScalarVP::setup(void) freeVpTensorName_.push_back(freeVpTensorName_mu); } - if (!env().hasRegisteredObject(freeMomPropName_)) - { - env().registerLattice(freeMomPropName_); - } - if (!env().hasRegisteredObject(phaseName_[0])) - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - env().registerLattice(phaseName_[mu]); - } - } - if (!env().hasRegisteredObject(GFSrcName_)) - { - env().registerLattice(GFSrcName_); - } - if (!env().hasRegisteredObject(prop0Name_)) - { - env().registerLattice(prop0Name_); - } - env().registerLattice(propQName_); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { env().registerLattice(muPropQName_[mu]); - } - env().registerLattice(propSunName_); - env().registerLattice(propTadName_); - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { + for (unsigned int nu = 0; nu < env().getNd(); ++nu) { env().registerLattice(vpTensorName_[mu][nu]); env().registerLattice(freeVpTensorName_[mu][nu]); } - } + } } // execution /////////////////////////////////////////////////////////////////// void TScalarVP::execute(void) { - // CACHING ANALYTIC EXPRESSIONS - ScalarField &source = *env().getObject(par().source); + // Get objects cached by ChargedProp module Complex ci(0.0,1.0); FFT fft(env().getGrid()); - Real q = par().charge; + Real q = static_cast(env().getModule(par().scalarProp))->par().charge; - // cache momentum-space free scalar propagator - if (!env().hasCreatedObject(freeMomPropName_)) + freeMomProp_ = env().getObject(freeMomPropName_); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - LOG(Message) << "Caching momentum space free scalar propagator" - << " (mass= " << par().mass << ")..." << std::endl; - freeMomProp_ = env().createLattice(freeMomPropName_); - SIMPL::MomentumSpacePropagator(*freeMomProp_, par().mass); - } - else - { - freeMomProp_ = env().getObject(freeMomPropName_); - } - // cache phases - if (!env().hasCreatedObject(phaseName_[0])) - { - std::vector &l = env().getGrid()->_fdimensions; - - LOG(Message) << "Caching shift phases..." << std::endl; - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - Real twoPiL = M_PI*2./l[mu]; - - phase_.push_back(env().createLattice(phaseName_[mu])); - LatticeCoordinate(*(phase_[mu]), mu); - *(phase_[mu]) = exp(ci*twoPiL*(*(phase_[mu]))); - } - } - else - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - phase_.push_back(env().getObject(phaseName_[mu])); - } - } - // cache G*F*src - if (!env().hasCreatedObject(GFSrcName_)) - { - GFSrc_ = env().createLattice(GFSrcName_); - fft.FFT_all_dim(*GFSrc_, source, FFT::forward); - *GFSrc_ = (*freeMomProp_)*(*GFSrc_); - } - else - { - GFSrc_ = env().getObject(GFSrcName_); - } - // cache position-space free scalar propagators - if (!env().hasCreatedObject(prop0Name_)) - { - prop0_ = env().createLattice(prop0Name_); - fft.FFT_all_dim(*prop0_, *GFSrc_, FFT::backward); - } - else - { - prop0_ = env().getObject(prop0Name_); + phase_.push_back(env().getObject(phaseName_[mu])); } + GFSrc_ = env().getObject(GFSrcName_); + prop0_ = env().getObject(prop0Name_); - // PROPAGATOR CALCULATION // Propagator from unshifted source - LOG(Message) << "Computing O(alpha) charged scalar propagator" - << " (mass= " << par().mass - << ", charge= " << q << ")..." - << std::endl; - ScalarField &propQ = *env().createLattice(propQName_); - ScalarField &propSun = *env().createLattice(propSunName_); - ScalarField &propTad = *env().createLattice(propTadName_); - chargedProp(propQ, propSun, propTad, *GFSrc_, fft); - // // OUTPUT IF NECESSARY - // if (!par().output.empty()) - // { - // ScalarField fullProp = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; - // std::string filename = par().output + "_prop_000." + - // std::to_string(env().getTrajectory()); - - // LOG(Message) << "Saving zero-momentum projection to '" - // << filename << "'..." << std::endl; - - // CorrWriter writer(filename); - // std::vector vecBuf; - // std::vector result; - - // write(writer, "charge", q); - - // // Write full propagator - // sliceSum(fullProp, vecBuf, Tp); - // result.resize(vecBuf.size()); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop", result); - - // // Write free propagator - // sliceSum(*prop0_, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_0", result); - - // // Write propagator D1 term - // sliceSum(propD1, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_q", result); - - // // Write propagator D1D1 term - // sliceSum(propD1D1, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_sun", result); - - // // Write propagator D2 term - // sliceSum(propD2, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_tad", result); - // } + ScalarField &propQ = *env().getObject(propQName_); + ScalarField &propSun = *env().getObject(propSunName_); + ScalarField &propTad = *env().getObject(propTadName_); // Propagators from shifted sources LOG(Message) << "Computing O(q) charged scalar propagators..." @@ -357,7 +222,7 @@ void TScalarVP::execute(void) std::vector result; write(writer, "charge", q); - write(writer, "mass", par().mass); + write(writer, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { @@ -386,34 +251,6 @@ void TScalarVP::execute(void) } } -// Calculate O(q) and O(q^2) terms of position-space charged propagator -void TScalarVP::chargedProp(ScalarField &prop_q, ScalarField &prop_sun, - ScalarField &prop_tad, ScalarField &GFSrc, - FFT &fft) -{ - Complex ci(0.0,1.0); - ScalarField &G = *freeMomProp_; - ScalarField buf(env().getGrid()); - - // -G*momD1*G*F*Src (momD1 = F*D1*Finv) - buf = GFSrc; - momD1(buf, fft); - buf = G*buf; - prop_q = -buf; - fft.FFT_all_dim(prop_q, prop_q, FFT::backward); - - // G*momD1*G*momD1*G*F*Src - momD1(buf, fft); - prop_sun = G*buf; - fft.FFT_all_dim(prop_sun, prop_sun, FFT::backward); - - // -G*momD2*G*F*Src (momD2 = F*D2*Finv) - buf = GFSrc; - momD2(buf, fft); - prop_tad = -G*buf; - fft.FFT_all_dim(prop_tad, prop_tad, FFT::backward); -} - void TScalarVP::momD1(ScalarField &s, FFT &fft) { EmField &A = *env().getObject(par().emField); @@ -443,32 +280,3 @@ void TScalarVP::momD1(ScalarField &s, FFT &fft) s = result; } - -void TScalarVP::momD2(ScalarField &s, FFT &fft) -{ - EmField &A = *env().getObject(par().emField); - ScalarField buf(env().getGrid()), result(env().getGrid()), - Amu(env().getGrid()); - - result = zero; - - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - Amu = peekLorentz(A, mu); - buf = (*phase_[mu])*s; - fft.FFT_all_dim(buf, buf, FFT::backward); - buf = Amu*Amu*buf; - fft.FFT_all_dim(buf, buf, FFT::forward); - result = result + .5*buf; - } - fft.FFT_all_dim(s, s, FFT::backward); - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - Amu = peekLorentz(A, mu); - buf = Amu*Amu*s; - fft.FFT_all_dim(buf, buf, FFT::forward); - result = result + .5*adj(*phase_[mu])*buf; - } - - s = result; -} diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index fdbad6f6..81071ca0 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -17,9 +17,7 @@ class ScalarVPPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarVPPar, std::string, emField, - std::string, source, - double, mass, - double, charge, + std::string, scalarProp, std::string, output); }; @@ -42,11 +40,7 @@ public: // execution virtual void execute(void); private: - void chargedProp(ScalarField &prop_q, ScalarField &prop_sun, - ScalarField &prop_tad, ScalarField &GFSrc, - FFT &fft); void momD1(ScalarField &s, FFT &fft); - void momD2(ScalarField &s, FFT &fft); private: std::string freeMomPropName_, GFSrcName_, prop0Name_, propQName_, From 42f0afcbfa7c1ecbaf57380a8722f46d00d892d7 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 9 Jun 2017 18:08:40 +0100 Subject: [PATCH 032/620] QedFVol: Output all scalar VP diagrams separately --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 276 ++++++++++++++++----- 1 file changed, 214 insertions(+), 62 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 7a3b4f9e..19cdbb9a 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -126,7 +126,7 @@ void TScalarVP::execute(void) // CONTRACTIONS ScalarField prop1(env().getGrid()), prop2(env().getGrid()); EmField &A = *env().getObject(par().emField); - ScalarField Amu(env().getGrid()); + ScalarField Amu(env().getGrid()), tmp_vp(env().getGrid()); TComplex Anu0; std::vector coor0 = {0, 0, 0, 0}; std::vector > vpTensor, freeVpTensor; @@ -143,6 +143,33 @@ void TScalarVP::execute(void) freeVpTensor.push_back(freeVpTensor_mu); } + // Open output files if necessary + CorrWriter *writer, *writer0, *writerD; + std::vector vecBuf; + std::vector result; + if (!par().output.empty()) + { + std::string filename = par().output + "." + + std::to_string(env().getTrajectory()); + std::string filename0 = par().output + "_free." + + std::to_string(env().getTrajectory()); + std::string filenameD = par().output + "_diagrams." + + std::to_string(env().getTrajectory()); + + // LOG(Message) << "Saving zero-momentum projection to '" + // << filename << "'..." << std::endl; + writer = new CorrWriter(filename); + writer0 = new CorrWriter(filename0); + writerD = new CorrWriter(filenameD); + + write(*writer, "charge", q); + write(*writer, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + write(*writer0, "charge", 0.0); + write(*writer0, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + write(*writerD, "charge", q); + write(*writerD, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + } + for (unsigned int nu = 0; nu < env().getNd(); ++nu) { peekSite(Anu0, peekLorentz(A, nu), coor0); @@ -158,75 +185,207 @@ void TScalarVP::execute(void) prop2 = Cshift(*prop0_, nu, -1); freeVpTensor[mu][nu] = adj(prop2) * Cshift(prop1, mu, 1); freeVpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * prop1; + freeVpTensor[mu][nu] = 2.0*real(freeVpTensor[mu][nu]); + + // Output if necessary + if (!par().output.empty()) + { + sliceSum(freeVpTensor[mu][nu], vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writer0, + "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } // "Exchange" terms prop1 += q*propQ; prop2 += q*muPropQ[nu]; - vpTensor[mu][nu] = adj(prop2) * (1.0 + ci*q*Amu) - * Cshift(prop1, mu, 1) * (1.0 + ci*q*Anu0); - vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * (1.0 - ci*q*Amu) - * prop1 * (1.0 + ci*q*Anu0); + tmp_vp = adj(prop2) * (1.0 + ci*q*Amu) + * Cshift(prop1, mu, 1) * (1.0 + ci*q*Anu0); + tmp_vp -= Cshift(adj(prop2), mu, 1) * (1.0 - ci*q*Amu) + * prop1 * (1.0 + ci*q*Anu0); + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] = tmp_vp*1.0; + + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_exchange_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } // Subtract O(alpha^2) term prop1 = q*propQ; prop2 = q*muPropQ[nu]; - vpTensor[mu][nu] -= adj(prop2) * ci*q*Amu - * Cshift(prop1, mu, 1) * ci*q*Anu0; - vpTensor[mu][nu] += Cshift(adj(prop2), mu, 1) * (-ci)*q*Amu - * prop1 * ci*q*Anu0; + tmp_vp = Cshift(adj(prop2), mu, 1) * (-ci)*q*Amu + * prop1 * ci*q*Anu0; + tmp_vp -= adj(prop2) * ci*q*Amu + * Cshift(prop1, mu, 1) * ci*q*Anu0; + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] += tmp_vp; - // Sunset+tadpole from source - prop1 = q*q*(propSun + propTad); + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_alpha2_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + + // Sunset from unshifted source + prop1 = q*q*propSun; prop2 = Cshift(*prop0_, nu, -1); - vpTensor[mu][nu] += adj(prop2) * Cshift(prop1, mu, 1); - vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * prop1; + tmp_vp = adj(prop2) * Cshift(prop1, mu, 1); + tmp_vp -= Cshift(adj(prop2), mu, 1) * prop1; + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] += tmp_vp; - // Sunset+tadpole from shifted source + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_sunset_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + + // Sunset from shifted source prop1 = Cshift(prop1, nu, -1); - vpTensor[mu][nu] += Cshift(adj(*prop0_), mu, 1) * prop1; - vpTensor[mu][nu] -= adj(*prop0_) * Cshift(prop1, mu, 1); + tmp_vp = Cshift(adj(*prop0_), mu, 1) * prop1; + tmp_vp -= adj(*prop0_) * Cshift(prop1, mu, 1); + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] += tmp_vp; + + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_sunset_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + + // Tadpole from unshifted source + prop1 = q*q*propTad; + prop2 = Cshift(*prop0_, nu, -1); + tmp_vp = adj(prop2) * Cshift(prop1, mu, 1); + tmp_vp -= Cshift(adj(prop2), mu, 1) * prop1; + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] += tmp_vp; + + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_tadpole_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + + // Tadpole from shifted source + prop1 = Cshift(prop1, nu, -1); + tmp_vp = Cshift(adj(*prop0_), mu, 1) * prop1; + tmp_vp -= adj(*prop0_) * Cshift(prop1, mu, 1); + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] += tmp_vp; + + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_tadpole_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } // Source tadpole prop1 = *prop0_; - vpTensor[mu][nu] += adj(prop2) - * Cshift(prop1, mu, 1) - * (-0.5)*q*q*Anu0*Anu0; - vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) - * prop1 - * (-0.5)*q*q*Anu0*Anu0; + tmp_vp = adj(prop2) + * Cshift(prop1, mu, 1) + * (-0.5)*q*q*Anu0*Anu0; + tmp_vp -= Cshift(adj(prop2), mu, 1) + * prop1 + * (-0.5)*q*q*Anu0*Anu0; + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] += tmp_vp; + + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_sourcetadpole_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } // Sink tadpole - vpTensor[mu][nu] += adj(prop2) - * (-0.5)*q*q*Amu*Amu - * Cshift(prop1, mu, 1); - vpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) - * (-0.5)*q*q*Amu*Amu - * prop1; + tmp_vp = adj(prop2) + * (-0.5)*q*q*Amu*Amu + * Cshift(prop1, mu, 1); + tmp_vp -= Cshift(adj(prop2), mu, 1) + * (-0.5)*q*q*Amu*Amu + * prop1; + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] += tmp_vp; - freeVpTensor[mu][nu] = 2.0*real(freeVpTensor[mu][nu]); - vpTensor[mu][nu] = 2.0*real(vpTensor[mu][nu]); - } - } + // Output if necessary + if (!par().output.empty()) + { + sliceSum(tmp_vp, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD, + "Pi_sinktadpole_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } - // OUTPUT IF NECESSARY - if (!par().output.empty()) - { - std::string filename = par().output + "." + - std::to_string(env().getTrajectory()); - - LOG(Message) << "Saving zero-momentum projection to '" - << filename << "'..." << std::endl; - - CorrWriter writer(filename); - std::vector vecBuf; - std::vector result; - - write(writer, "charge", q); - write(writer, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - for (unsigned int nu = 0; nu < env().getNd(); ++nu) + // Output if necessary + if (!par().output.empty()) { sliceSum(vpTensor[mu][nu], vecBuf, Tp); result.resize(vecBuf.size()); @@ -234,21 +393,14 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(writer, "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - - sliceSum(freeVpTensor[mu][nu], vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, - "Pi_"+std::to_string(mu)+"_"+std::to_string(nu)+"_free", + write(*writer, "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), result); } } } + delete writer; + delete writer0; + delete writerD; } void TScalarVP::momD1(ScalarField &s, FFT &fft) From 20e92a7009fe8c0e5523bd7c4b2d689f600cb5b4 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 12 Jun 2017 18:27:32 +0100 Subject: [PATCH 033/620] QedVFol: Allow output of scalar propagator and vacuum polarisation projected to arbitrary lattice momentum, not just zero-momentum. --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 121 ++++--- .../Hadrons/Modules/MScalar/ChargedProp.hpp | 3 +- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 318 ++++++++++++------ extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 3 +- 4 files changed, 302 insertions(+), 143 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index a9089056..285b237a 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -171,58 +171,91 @@ void TChargedProp::execute(void) // OUTPUT IF NECESSARY if (!par().output.empty()) { - std::string filename = par().output + "." + + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + std::vector mom = strToVec(par().outputMom[i_p]); + std::string filename = par().output + "_" + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]) + + "." + std::to_string(env().getTrajectory()); - - LOG(Message) << "Saving zero-momentum projection to '" + + LOG(Message) << "Saving (" << par().outputMom[i_p] << ") momentum projection to '" << filename << "'..." << std::endl; - - CorrWriter writer(filename); - std::vector vecBuf; - std::vector result; - - write(writer, "charge", q); - // Write full propagator - sliceSum(prop, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop", result); + CorrWriter writer(filename); + std::vector vecBuf; + std::vector result; - // Write free propagator - sliceSum(*prop0_, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_0", result); + write(writer, "charge", q); + write(writer, "mass", par().mass); - // Write propagator O(q) term - sliceSum(propQ, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Q", result); + // Write full propagator + buf = prop; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + buf = buf*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(buf, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop", result); - // Write propagator sunset term - sliceSum(propSun, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Sun", result); + // Write free propagator + buf = *prop0_; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + buf = buf*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_0", result); - // Write propagator tadpole term - sliceSum(propTad, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); + // Write propagator O(q) term + buf = propQ; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + buf = buf*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Q", result); + + // Write propagator sunset term + buf = propSun; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + buf = buf*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Sun", result); + + // Write propagator tadpole term + buf = propTad; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + buf = buf*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Tad", result); } - write(writer, "prop_Tad", result); } } diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 369fff30..92b89f9f 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -20,7 +20,8 @@ public: std::string, source, double, mass, double, charge, - std::string, output); + std::string, output, + std::vector, outputMom); }; class TChargedProp: public Module diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 19cdbb9a..e4f4e820 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -90,7 +90,7 @@ void TScalarVP::setup(void) // execution /////////////////////////////////////////////////////////////////// void TScalarVP::execute(void) { - // Get objects cached by ChargedProp module + // Get objects cached by ChargedProp module Complex ci(0.0,1.0); FFT fft(env().getGrid()); Real q = static_cast(env().getModule(par().scalarProp))->par().charge; @@ -144,32 +144,49 @@ void TScalarVP::execute(void) } // Open output files if necessary - CorrWriter *writer, *writer0, *writerD; - std::vector vecBuf; - std::vector result; + std::vector writer, writer0, writerD; if (!par().output.empty()) { - std::string filename = par().output + "." + - std::to_string(env().getTrajectory()); - std::string filename0 = par().output + "_free." + - std::to_string(env().getTrajectory()); - std::string filenameD = par().output + "_diagrams." + - std::to_string(env().getTrajectory()); - - // LOG(Message) << "Saving zero-momentum projection to '" - // << filename << "'..." << std::endl; - writer = new CorrWriter(filename); - writer0 = new CorrWriter(filename0); - writerD = new CorrWriter(filenameD); - - write(*writer, "charge", q); - write(*writer, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - write(*writer0, "charge", 0.0); - write(*writer0, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - write(*writerD, "charge", q); - write(*writerD, "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - } + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + std::vector mom = strToVec(par().outputMom[i_p]); + std::string filename = par().output + "_" + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]) + + "." + + std::to_string(env().getTrajectory()); + std::string filename0 = par().output + "_" + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]) + + "_free." + + std::to_string(env().getTrajectory()); + std::string filenameD = par().output + "_" + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]) + + "_diagrams." + + std::to_string(env().getTrajectory()); + + CorrWriter *writer_i = new CorrWriter(filename); + writer.push_back(writer_i); + CorrWriter *writer0_i = new CorrWriter(filename0); + writer0.push_back(writer0_i); + CorrWriter *writerD_i = new CorrWriter(filenameD); + writerD.push_back(writerD_i); + + write(*writer[i_p], "charge", q); + write(*writer[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + write(*writer0[i_p], "charge", 0.0); + write(*writer0[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + write(*writerD[i_p], "charge", q); + write(*writerD[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + } + } + std::vector vecBuf; + std::vector result; + ScalarField vpPhase(env().getGrid()); + + // Do contractions for (unsigned int nu = 0; nu < env().getNd(); ++nu) { peekSite(Anu0, peekLorentz(A, nu), coor0); @@ -190,15 +207,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(freeVpTensor[mu][nu], vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = freeVpTensor[mu][nu]; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writer0[i_p], + "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writer0, - "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // "Exchange" terms @@ -209,20 +236,30 @@ void TScalarVP::execute(void) tmp_vp -= Cshift(adj(prop2), mu, 1) * (1.0 - ci*q*Amu) * prop1 * (1.0 + ci*q*Anu0); tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] = tmp_vp*1.0; + vpTensor[mu][nu] = tmp_vp; // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_exchange_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_exchange_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Subtract O(alpha^2) term @@ -238,15 +275,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_alpha2_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_alpha2_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Sunset from unshifted source @@ -260,15 +307,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_sunset_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_sunset_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Sunset from shifted source @@ -281,15 +338,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_sunset_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_sunset_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Tadpole from unshifted source @@ -303,15 +370,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_tadpole_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_tadpole_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Tadpole from shifted source @@ -324,15 +401,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_tadpole_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_tadpole_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Source tadpole @@ -349,15 +436,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_sourcetadpole_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_sourcetadpole_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Sink tadpole @@ -373,34 +470,61 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - sliceSum(tmp_vp, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writerD[i_p], + "Pi_sinktadpole_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writerD, - "Pi_sinktadpole_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } // Output if necessary if (!par().output.empty()) { - sliceSum(vpTensor[mu][nu], vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + std::vector mom; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - result[t] = TensorRemove(vecBuf[t]); + mom = strToVec(par().outputMom[i_p]); + vpPhase = vpTensor[mu][nu]; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + } + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(*writer[i_p], + "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), + result); } - write(*writer, "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), - result); } } } - delete writer; - delete writer0; - delete writerD; + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + delete writer[i_p]; + delete writer0[i_p]; + delete writerD[i_p]; + } + } } void TScalarVP::momD1(ScalarField &s, FFT &fft) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 81071ca0..e4a6e825 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -18,7 +18,8 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarVPPar, std::string, emField, std::string, scalarProp, - std::string, output); + std::string, output, + std::vector, outputMom); }; class TScalarVP: public Module From 75ee6cfc86e2365baf0a50cd4bf317e7c6fb097a Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 4 Aug 2017 16:08:07 +0100 Subject: [PATCH 034/620] Debugging the Clover term --- .gitignore | 2 + .vscode/settings.json | 11 ++- lib/cartesian/Cartesian_base.h | 2 + lib/cartesian/Cartesian_full.h | 5 +- lib/cartesian/Cartesian_red_black.h | 1 + lib/qcd/action/fermion/WilsonCloverFermion.cc | 78 +++++++-------- lib/qcd/action/fermion/WilsonCloverFermion.h | 99 +++++++++++++++++-- tests/core/Test_wilson_clover.cc | 3 +- 8 files changed, 149 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index d743ee06..6b92b1a4 100644 --- a/.gitignore +++ b/.gitignore @@ -123,3 +123,5 @@ make-bin-BUCK.sh lib/qcd/spin/gamma-gen/*.h lib/qcd/spin/gamma-gen/*.cc +.vscode/settings.json +settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json index dd8f0473..3e49029b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -36,6 +36,15 @@ "tuple": "cpp", "type_traits": "cpp", "typeinfo": "cpp", - "utility": "cpp" + "utility": "cpp", + "iostream": "cpp", + "strstream": "cpp", + "complex": "cpp", + "fstream": "cpp", + "iomanip": "cpp", + "istream": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "streambuf": "cpp" } } \ No newline at end of file diff --git a/lib/cartesian/Cartesian_base.h b/lib/cartesian/Cartesian_base.h index 0db6ce0d..e435bbba 100644 --- a/lib/cartesian/Cartesian_base.h +++ b/lib/cartesian/Cartesian_base.h @@ -69,6 +69,8 @@ public: std::vector _lstart; // local start of array in gcoors _processor_coor[d]*_ldimensions[d] std::vector _lend ; // local end of array in gcoors _processor_coor[d]*_ldimensions[d]+_ldimensions_[d]-1 + bool _isCheckerBoarded; + public: //////////////////////////////////////////////////////////////// diff --git a/lib/cartesian/Cartesian_full.h b/lib/cartesian/Cartesian_full.h index b0e47fa4..3be3e8cd 100644 --- a/lib/cartesian/Cartesian_full.h +++ b/lib/cartesian/Cartesian_full.h @@ -69,6 +69,7 @@ public: /////////////////////// // Grid information /////////////////////// + _isCheckerBoarded = false; _ndimension = dimensions.size(); _fdimensions.resize(_ndimension); @@ -76,8 +77,8 @@ public: _ldimensions.resize(_ndimension); _rdimensions.resize(_ndimension); _simd_layout.resize(_ndimension); - _lstart.resize(_ndimension); - _lend.resize(_ndimension); + _lstart.resize(_ndimension); + _lend.resize(_ndimension); _ostride.resize(_ndimension); _istride.resize(_ndimension); diff --git a/lib/cartesian/Cartesian_red_black.h b/lib/cartesian/Cartesian_red_black.h index 3037de00..a440538a 100644 --- a/lib/cartesian/Cartesian_red_black.h +++ b/lib/cartesian/Cartesian_red_black.h @@ -139,6 +139,7 @@ public: /////////////////////// // Grid information /////////////////////// + _isCheckerBoarded = true; _checker_dim = checker_dim; assert(checker_dim_mask[checker_dim]==1); _ndimension = dimensions.size(); diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index e1900830..f8b62ba4 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -35,27 +35,6 @@ namespace Grid namespace QCD { -//WilsonLoop::CloverPlaquette -///////////////////////////////////////////////////// -//// Clover plaquette combination in mu,nu plane with Double Stored U -//////////////////////////////////////////////////// -//static void CloverPlaquette(GaugeMat &Q, const std::vector &U, -// const int mu, const int nu){ -// Q = zero; -// Q += Gimpl::CovShiftBackward( -// U[mu], mu, Gimpl::CovShiftBackward( -// U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[nu] ))); -// Q += Gimpl::CovShiftForward( -// U[mu], mu, Gimpl::CovShiftForward( -// U[nu], nu, Gimpl::CovShiftBackward(U[mu], mu, U[nu+Nd] ))); -// Q += Gimpl::CovShiftBackward( -// U[nu], nu, Gimpl::CovShiftForward( -// U[mu], mu, Gimpl::CovShiftForward(U[nu], nu, U[mu+Nd] ))); -// Q += Gimpl::CovShiftForward( -// U[mu], mu, Gimpl::CovShiftBackward( -// U[nu], nu, Gimpl::CovShiftBackward(U[mu], mu, U[nu] ))); -// } - // *NOT* EO template RealD WilsonCloverFermion::M(const FermionField &in, FermionField &out) @@ -89,10 +68,10 @@ RealD WilsonCloverFermion::Mdag(const FermionField &in, FermionField &out) template void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) { - this->ImportGauge(_Umu); + WilsonFermion::ImportGauge(_Umu); GridBase *grid = _Umu._grid; typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid); - + // Compute the field strength terms WilsonLoops::FieldStrength(Bx, _Umu, Ydir, Zdir); WilsonLoops::FieldStrength(By, _Umu, Zdir, Xdir); @@ -102,12 +81,12 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); // Compute the Clover Operator acting on Colour and Spin - CloverTerm = fillClover(Bx) * (Gamma(Gamma::Algebra::SigmaYZ)); - CloverTerm += fillClover(By) * (Gamma(Gamma::Algebra::MinusSigmaXZ)); - CloverTerm += fillClover(Bz) * (Gamma(Gamma::Algebra::SigmaXY)); - CloverTerm += fillClover(Ex) * (Gamma(Gamma::Algebra::MinusSigmaXT)); - CloverTerm += fillClover(Ey) * (Gamma(Gamma::Algebra::MinusSigmaYT)); - CloverTerm += fillClover(Ez) * (Gamma(Gamma::Algebra::MinusSigmaZT)); + CloverTerm = fillCloverYZ(Bx); + CloverTerm += fillCloverXZ(By); + CloverTerm += fillCloverXY(Bz); + CloverTerm += fillCloverXT(Ex); + CloverTerm += fillCloverYT(Ey); + CloverTerm += fillCloverZT(Ez) ; CloverTerm *= csw; int lvol = _Umu._grid->lSites(); @@ -130,8 +109,11 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) for (int a = 0; a < DimRep; a++) for (int b = 0; b < DimRep; b++) EigenCloverOp(a + j * DimRep, b + k * DimRep) = Qx()(j, k)(a, b); + //std::cout << EigenCloverOp << std::endl; + EigenInvCloverOp = EigenCloverOp.inverse(); + //std::cout << EigenInvCloverOp << std::endl; for (int j = 0; j < Ns; j++) for (int k = 0; k < Ns; k++) for (int a = 0; a < DimRep; a++) @@ -139,17 +121,21 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep); pokeLocalSite(Qxinv, CloverTermInv, lcoor); - // Separate the even and odd parts. - pickCheckerboard(Even, CloverTermEven, CloverTerm); - pickCheckerboard( Odd, CloverTermOdd, CloverTerm); - pickCheckerboard(Even, CloverTermInvEven, CloverTermInv); - pickCheckerboard( Odd, CloverTermInvOdd, CloverTermInv); } + + // Separate the even and odd parts. + pickCheckerboard(Even, CloverTermEven, CloverTerm); + pickCheckerboard( Odd, CloverTermOdd, CloverTerm); + + pickCheckerboard(Even, CloverTermInvEven, CloverTermInv); + pickCheckerboard( Odd, CloverTermInvOdd, CloverTermInv); + } template void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) { + conformable(in,out); this->MooeeInternal(in, out, DaggerNo, InverseNo); } @@ -176,15 +162,27 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie { out.checkerboard = in.checkerboard; CloverFieldType *Clover; - if (in.checkerboard == Odd){ - std::cout << "Calling clover term Odd" << std::endl; - Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; + assert(in.checkerboard == Odd || in.checkerboard == Even); + + if (in._grid->_isCheckerBoarded) + { + if (in.checkerboard == Odd) + { + std::cout << "Calling clover term Odd" << std::endl; + Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; + } + else + { + std::cout << "Calling clover term Even" << std::endl; + Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; + } } - if (in.checkerboard == Even){ - std::cout << "Calling clover term Even" << std::endl; - Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; + else + { + Clover = (inv) ? &CloverTermInv : &CloverTerm; } + std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; if (dag){ out = adj(*Clover) * in;} else { out = *Clover * in;} } // MooeeInternal diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index c9e7be39..fd9d1f60 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -94,17 +94,102 @@ private: // eventually these two can be compressed into 6x6 blocks instead of the 12x12 // using the DeGrand-Rossi basis for the gamma matrices - CloverFieldType fillClover(const GaugeLinkField& F){ + CloverFieldType fillCloverYZ(const GaugeLinkField &F) + { CloverFieldType T(F._grid); + T = zero; PARALLEL_FOR_LOOP - for (int i = 0; i < CloverTerm._grid->oSites(); i++){ - for (int s1 = 0; s1 < Nc; s1++) - for (int s2 = 0; s2 < Nc; s2++) - T._odata[i]()(s1,s2) = F._odata[i]()(); + for (int i = 0; i < CloverTerm._grid->oSites(); i++) + { + T._odata[i]()(0, 1) = timesMinusI(F._odata[i]()()); + T._odata[i]()(1, 0) = timesMinusI(F._odata[i]()()); + T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); + T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); } - return T; - } + return T; +} + + CloverFieldType fillCloverXZ(const GaugeLinkField &F) + { + CloverFieldType T(F._grid); + T = zero; + PARALLEL_FOR_LOOP + for (int i = 0; i < CloverTerm._grid->oSites(); i++) + { + T._odata[i]()(0, 1) = -F._odata[i]()(); + T._odata[i]()(1, 0) = F._odata[i]()(); + T._odata[i]()(2, 3) = -F._odata[i]()(); + T._odata[i]()(3, 2) = F._odata[i]()(); + } + + return T; +} + + CloverFieldType fillCloverXY(const GaugeLinkField &F) + { + CloverFieldType T(F._grid); + T = zero; + PARALLEL_FOR_LOOP + for (int i = 0; i < CloverTerm._grid->oSites(); i++) + { + T._odata[i]()(0, 0) = timesMinusI(F._odata[i]()()); + T._odata[i]()(1, 1) = timesI(F._odata[i]()()); + T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); + T._odata[i]()(3, 3) = timesI(F._odata[i]()()); + } + + return T; +} + + CloverFieldType fillCloverXT(const GaugeLinkField &F) + { + CloverFieldType T(F._grid); + T = zero; + PARALLEL_FOR_LOOP + for (int i = 0; i < CloverTerm._grid->oSites(); i++) + { + T._odata[i]()(0, 1) = timesMinusI(F._odata[i]()()); + T._odata[i]()(1, 0) = timesMinusI(F._odata[i]()()); + T._odata[i]()(2, 3) = timesI(F._odata[i]()()); + T._odata[i]()(3, 2) = timesI(F._odata[i]()()); + } + + return T; +} + + CloverFieldType fillCloverYT(const GaugeLinkField &F) + { + CloverFieldType T(F._grid); + T = zero; + PARALLEL_FOR_LOOP + for (int i = 0; i < CloverTerm._grid->oSites(); i++) + { + T._odata[i]()(0, 1) = (F._odata[i]()()); + T._odata[i]()(1, 0) = -(F._odata[i]()()); + T._odata[i]()(2, 3) = -(F._odata[i]()()); + T._odata[i]()(3, 2) = (F._odata[i]()()); + } + + return T; +} + + CloverFieldType fillCloverZT(const GaugeLinkField &F) + { + CloverFieldType T(F._grid); + T = zero; + PARALLEL_FOR_LOOP + for (int i = 0; i < CloverTerm._grid->oSites(); i++) + { + T._odata[i]()(0, 0) = timesMinusI(F._odata[i]()()); + T._odata[i]()(1, 1) = timesI(F._odata[i]()()); + T._odata[i]()(2, 2) = timesI(F._odata[i]()()); + T._odata[i]()(3, 3) = timesMinusI(F._odata[i]()()); + } + + return T; +} + }; } } diff --git a/tests/core/Test_wilson_clover.cc b/tests/core/Test_wilson_clover.cc index 3df69e3b..1b208e2d 100644 --- a/tests/core/Test_wilson_clover.cc +++ b/tests/core/Test_wilson_clover.cc @@ -91,7 +91,7 @@ int main (int argc, char ** argv) } WilsonCloverFermionR Dwc(Umu,Grid,RBGrid,mass,csw,params); - + Dwc.ImportGauge(Umu); std::cout< Date: Tue, 15 Aug 2017 10:50:44 +0100 Subject: [PATCH 035/620] Correction of the dagger version of the Clover --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index f8b62ba4..ce120846 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -142,19 +142,22 @@ void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) template void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &out) { - this->MooeeInternal(in, out, DaggerNo, InverseYes); + conformable(in,out); + this->MooeeInternal(in, out, DaggerYes, InverseYes); } template void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &out) { + conformable(in,out); this->MooeeInternal(in, out, DaggerNo, InverseYes); } template void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out) { - this->MooeeInternal(in, out, DaggerNo, InverseYes); + conformable(in,out); + this->MooeeInternal(in, out, DaggerYes, InverseYes); } template @@ -183,7 +186,10 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie } std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; - if (dag){ out = adj(*Clover) * in;} else { out = *Clover * in;} + std::cout << GridLogMessage << "in.checkerboard " << in.checkerboard << std::endl; + std::cout << GridLogMessage << "out.checkerboard " << out.checkerboard << std::endl; + out = *Clover * in; + //if (dag){ out = adj(*Clover) * in;} else { out = *Clover * in;} } // MooeeInternal // Derivative parts From cc4afb978d0defaa8e81a5a555fd5ff11c8e8437 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 24 Aug 2017 17:31:44 +0100 Subject: [PATCH 036/620] Fix bug in non-zero momentum projection --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 25 ++++++++-- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 50 +++++++++++++++---- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 285b237a..1b901bf1 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -194,7 +194,10 @@ void TChargedProp::execute(void) buf = prop; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - buf = buf*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } } sliceSum(buf, vecBuf, Tp); result.resize(vecBuf.size()); @@ -208,7 +211,10 @@ void TChargedProp::execute(void) buf = *prop0_; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - buf = buf*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } } sliceSum(buf, vecBuf, Tp); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -221,7 +227,10 @@ void TChargedProp::execute(void) buf = propQ; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - buf = buf*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } } sliceSum(buf, vecBuf, Tp); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -234,7 +243,10 @@ void TChargedProp::execute(void) buf = propSun; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - buf = buf*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } } sliceSum(buf, vecBuf, Tp); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -247,7 +259,10 @@ void TChargedProp::execute(void) buf = propTad; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - buf = buf*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } } sliceSum(buf, vecBuf, Tp); for (unsigned int t = 0; t < vecBuf.size(); ++t) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index e4f4e820..4d923802 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -214,7 +214,10 @@ void TScalarVP::execute(void) vpPhase = freeVpTensor[mu][nu]; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -248,7 +251,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -282,7 +288,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -314,7 +323,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -345,7 +357,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -377,7 +392,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -408,7 +426,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -443,7 +464,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -477,7 +501,10 @@ void TScalarVP::execute(void) vpPhase = tmp_vp; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); @@ -501,7 +528,10 @@ void TScalarVP::execute(void) vpPhase = vpTensor[mu][nu]; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - vpPhase = vpPhase*pow(adj(*phase_[j]), mom[j]); + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); From 91676d1dda82e0e4779dbe64f0605be3db102142 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 1 Sep 2017 15:48:30 +0100 Subject: [PATCH 037/620] =?UTF-8?q?Fix=20=E2=80=9CMAP=5FANONYMOUS=20undefi?= =?UTF-8?q?ned=E2=80=9D=20error=20on=20OSX.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/communicator/Communicator_base.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/communicator/Communicator_base.cc b/lib/communicator/Communicator_base.cc index 956de0d2..ba9de1cc 100644 --- a/lib/communicator/Communicator_base.cc +++ b/lib/communicator/Communicator_base.cc @@ -148,6 +148,11 @@ void *CartesianCommunicator::ShmBufferTranslate(int rank,void * local_p) { void CartesianCommunicator::ShmInitGeneric(void){ #if 1 +#if !defined(MAP_ANONYMOUS) + #define NO_MAP_ANONYMOUS + #define MAP_ANONYMOUS MAP_ANON +#endif + int mmap_flag = MAP_SHARED | MAP_ANONYMOUS; #ifdef MAP_HUGETLB if ( Hugepages ) mmap_flag |= MAP_HUGETLB; @@ -162,6 +167,11 @@ void CartesianCommunicator::ShmInitGeneric(void){ ShmCommBuf=(void *)&ShmBufStorageVector[0]; #endif bzero(ShmCommBuf,MAX_MPI_SHM_BYTES); + +#if defined(NO_MAP_ANONYMOUS) + #undef MAP_ANONYMOUS + #undef NO_MAP_ANONYMOUS +#endif } #endif From 91eaace19de25f45db52420a10350b36c548ad5e Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 15 Sep 2017 11:33:45 +0100 Subject: [PATCH 038/620] Added support for FFT accelerated updates --- lib/qcd/action/scalar/ScalarImpl.h | 129 +++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 15 deletions(-) diff --git a/lib/qcd/action/scalar/ScalarImpl.h b/lib/qcd/action/scalar/ScalarImpl.h index f85ab840..3755d0ee 100644 --- a/lib/qcd/action/scalar/ScalarImpl.h +++ b/lib/qcd/action/scalar/ScalarImpl.h @@ -16,12 +16,12 @@ class ScalarImplTypes { typedef iImplField SiteField; typedef SiteField SitePropagator; typedef SiteField SiteComplex; - + typedef Lattice Field; typedef Field ComplexField; typedef Field FermionField; typedef Field PropagatorField; - + static inline void generate_momenta(Field& P, GridParallelRNG& pRNG){ gaussian(pRNG, P); } @@ -47,54 +47,58 @@ class ScalarImplTypes { static inline void ColdConfiguration(GridParallelRNG &pRNG, Field &U) { U = 1.0; } - + static void MomentumSpacePropagator(Field &out, RealD m) { GridBase *grid = out._grid; Field kmu(grid), one(grid); const unsigned int nd = grid->_ndimension; std::vector &l = grid->_fdimensions; - + one = Complex(1.0,0.0); out = m*m; for(int mu = 0; mu < nd; mu++) { Real twoPiL = M_PI*2./l[mu]; - + LatticeCoordinate(kmu,mu); kmu = 2.*sin(.5*twoPiL*kmu); out = out + kmu*kmu; } out = one/out; } - + static void FreePropagator(const Field &in, Field &out, const Field &momKernel) { FFT fft((GridCartesian *)in._grid); Field inFT(in._grid); - + fft.FFT_all_dim(inFT, in, FFT::forward); inFT = inFT*momKernel; fft.FFT_all_dim(out, inFT, FFT::backward); } - + static void FreePropagator(const Field &in, Field &out, RealD m) { Field momKernel(in._grid); - + MomentumSpacePropagator(momKernel, m); FreePropagator(in, out, momKernel); } - + }; + + #define USE_FFT_ACCELERATION + + template class ScalarAdjMatrixImplTypes { public: typedef S Simd; typedef QCD::SU Group; - + template using iImplField = iScalar>>; template @@ -103,24 +107,119 @@ class ScalarImplTypes { typedef iImplField SiteField; typedef SiteField SitePropagator; typedef iImplComplex SiteComplex; - + typedef Lattice Field; typedef Lattice ComplexField; typedef Field FermionField; typedef Field PropagatorField; + + static void MomentaSquare(ComplexField& out){ + GridBase *grid = out._grid; + const std::vector &l = grid->FullDimensions(); + ComplexField kmu(grid); + + for(int mu = 0; mu < grid->Nd(); mu++) + { + Real twoPiL = M_PI*2.0/l[mu]; + LatticeCoordinate(kmu,mu); + kmu = 2.0*sin(0.5*twoPiL*kmu); + out += kmu*kmu; + } + } + + static void MomentumSpacePropagator(ComplexField &out, RealD m) + { + GridBase *grid = out._grid; + ComplexField one(grid); one = Complex(1.0,0.0); + out = m*m; + MomentaSquare(out); + out = one/out; + } + + static inline void generate_momenta(Field& P, GridParallelRNG& pRNG) { + #ifndef USE_FFT_ACCELERATION Group::GaussianFundamentalLieAlgebraMatrix(pRNG, P); + #else + + Field Ptmp(P._grid), Pp(P._grid); + Group::GaussianFundamentalLieAlgebraMatrix(pRNG, Ptmp); + // if we change the mass I need a renormalization here + // transform and multiply by (M*M+p*p)^-1 + GridCartesian *Grid = dynamic_cast(P._grid); + FFT theFFT(Grid); + ComplexField p2(Grid); + RealD M = 1.0; + p2= zero; + + theFFT.FFT_all_dim(Pp,Ptmp,FFT::forward); + MomentaSquare(p2); + p2 += M*M; + p2 = sqrt(p2); + Pp *= p2; + theFFT.FFT_all_dim(P,Pp,FFT::backward); + + #endif //USE_FFT_ACCELERATION } static inline Field projectForce(Field& P) {return P;} static inline void update_field(Field& P, Field& U, double ep) { + #ifndef USE_FFT_ACCELERATION U += P*ep; + #else + // Here we can eventually add the Fourier acceleration + // FFT transform P(x) -> P(p) + // divide by (M^2+p^2) M external parameter (how to pass?) + // P'(p) = P(p)/(M^2+p^2) + // Transform back -> P'(x) + // U += P'(x)*ep + + // the dynamic cast is safe + GridCartesian *Grid = dynamic_cast(U._grid); + FFT theFFT(Grid); + Field Pp(Grid), Pnew(Grid); + std::vector full_dim = Grid->FullDimensions(); + + theFFT.FFT_all_dim(Pp,P,FFT::forward); + RealD M = 1.0; + static bool first_call = true; + static ComplexField p2(Grid); + if (first_call){ + MomentumSpacePropagator(p2,M); + first_call = false; + } + Pp *= p2; + theFFT.FFT_all_dim(Pnew,Pp,FFT::backward); + U += Pnew * ep; + + #endif //USE_FFT_ACCELERATION } - static inline RealD FieldSquareNorm(Field& U) { + static inline RealD FieldSquareNorm(Field &U) + { + #ifndef USE_FFT_ACCELERATION return (TensorRemove(sum(trace(U*U))).real()); + #else + // In case of Fourier acceleration we have to: + // compute U(p)*U(p)/(M^2+p^2)) Parseval theorem + // 1 FFT needed U(x) -> U(p) + // M to be passed + + GridCartesian *Grid = dynamic_cast(U._grid); + FFT theFFT(Grid); + Field Up(Grid), Utilde(Grid); + std::vector full_dim = Grid->FullDimensions(); + + theFFT.FFT_all_dim(Up, U, FFT::forward); + RealD M = 1.0; + ComplexField p2(Grid); + MomentumSpacePropagator(p2,M); + Field Up2 = Up*p2; + // from the definition of the DFT we need to divide by the volume + return (-TensorRemove(sum(trace(adj(Up)*Up2))).real()/U._grid->gSites()); + #endif //USE_FFT_ACCELERATION } static inline void HotConfiguration(GridParallelRNG &pRNG, Field &U) { @@ -146,7 +245,7 @@ class ScalarImplTypes { typedef ScalarImplTypes ScalarImplCR; typedef ScalarImplTypes ScalarImplCF; typedef ScalarImplTypes ScalarImplCD; - + // Hardcoding here the size of the matrices typedef ScalarAdjMatrixImplTypes ScalarAdjImplR; typedef ScalarAdjMatrixImplTypes ScalarAdjImplF; @@ -155,7 +254,7 @@ class ScalarImplTypes { template using ScalarNxNAdjImplR = ScalarAdjMatrixImplTypes; template using ScalarNxNAdjImplF = ScalarAdjMatrixImplTypes; template using ScalarNxNAdjImplD = ScalarAdjMatrixImplTypes; - + //} } From b542d349b8784fdd47339977e94575a7fdef5a58 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 15 Sep 2017 11:48:36 +0100 Subject: [PATCH 039/620] Minor cosmetic changes --- lib/qcd/action/scalar/ScalarImpl.h | 137 ++++++++++++++--------------- 1 file changed, 68 insertions(+), 69 deletions(-) diff --git a/lib/qcd/action/scalar/ScalarImpl.h b/lib/qcd/action/scalar/ScalarImpl.h index 3755d0ee..3dd3cc70 100644 --- a/lib/qcd/action/scalar/ScalarImpl.h +++ b/lib/qcd/action/scalar/ScalarImpl.h @@ -91,6 +91,9 @@ class ScalarImplTypes { #define USE_FFT_ACCELERATION + #ifdef USE_FFT_ACCELERATION + #define FFT_MASS 0.707 + #endif template @@ -113,113 +116,109 @@ class ScalarImplTypes { typedef Field FermionField; typedef Field PropagatorField; + static void MomentaSquare(ComplexField &out) + { + GridBase *grid = out._grid; + const std::vector &l = grid->FullDimensions(); + ComplexField kmu(grid); - static void MomentaSquare(ComplexField& out){ - GridBase *grid = out._grid; - const std::vector &l = grid->FullDimensions(); - ComplexField kmu(grid); - - for(int mu = 0; mu < grid->Nd(); mu++) + for (int mu = 0; mu < grid->Nd(); mu++) { - Real twoPiL = M_PI*2.0/l[mu]; - LatticeCoordinate(kmu,mu); - kmu = 2.0*sin(0.5*twoPiL*kmu); - out += kmu*kmu; + Real twoPiL = M_PI * 2.0 / l[mu]; + LatticeCoordinate(kmu, mu); + kmu = 2.0 * sin(0.5 * twoPiL * kmu); + out += kmu * kmu; } } static void MomentumSpacePropagator(ComplexField &out, RealD m) { - GridBase *grid = out._grid; - ComplexField one(grid); one = Complex(1.0,0.0); - out = m*m; + GridBase *grid = out._grid; + ComplexField one(grid); + one = Complex(1.0, 0.0); + out = m * m; MomentaSquare(out); - out = one/out; + out = one / out; } - - static inline void generate_momenta(Field& P, GridParallelRNG& pRNG) { - #ifndef USE_FFT_ACCELERATION + static inline void generate_momenta(Field &P, GridParallelRNG &pRNG) + { +#ifndef USE_FFT_ACCELERATION Group::GaussianFundamentalLieAlgebraMatrix(pRNG, P); - #else - - Field Ptmp(P._grid), Pp(P._grid); - Group::GaussianFundamentalLieAlgebraMatrix(pRNG, Ptmp); - // if we change the mass I need a renormalization here - // transform and multiply by (M*M+p*p)^-1 - GridCartesian *Grid = dynamic_cast(P._grid); - FFT theFFT(Grid); - ComplexField p2(Grid); - RealD M = 1.0; - p2= zero; +#else - theFFT.FFT_all_dim(Pp,Ptmp,FFT::forward); + Field Pgaussian(P._grid), Pp(P._grid); + ComplexField p2(P._grid); p2 = zero; + RealD M = FFT_MASS; + + Group::GaussianFundamentalLieAlgebraMatrix(pRNG, Pgaussian); + + FFT theFFT((GridCartesian*)P._grid); + theFFT.FFT_all_dim(Pp, Pgaussian, FFT::forward); MomentaSquare(p2); - p2 += M*M; + p2 += M * M; p2 = sqrt(p2); Pp *= p2; - theFFT.FFT_all_dim(P,Pp,FFT::backward); - - #endif //USE_FFT_ACCELERATION + theFFT.FFT_all_dim(P, Pp, FFT::backward); + +#endif //USE_FFT_ACCELERATION } static inline Field projectForce(Field& P) {return P;} - static inline void update_field(Field& P, Field& U, double ep) { - #ifndef USE_FFT_ACCELERATION - U += P*ep; - #else - // Here we can eventually add the Fourier acceleration + static inline void update_field(Field &P, Field &U, double ep) + { +#ifndef USE_FFT_ACCELERATION + U += P * ep; +#else // FFT transform P(x) -> P(p) // divide by (M^2+p^2) M external parameter (how to pass?) // P'(p) = P(p)/(M^2+p^2) // Transform back -> P'(x) // U += P'(x)*ep - - // the dynamic cast is safe - GridCartesian *Grid = dynamic_cast(U._grid); - FFT theFFT(Grid); - Field Pp(Grid), Pnew(Grid); - std::vector full_dim = Grid->FullDimensions(); - theFFT.FFT_all_dim(Pp,P,FFT::forward); - RealD M = 1.0; + Field Pp(U._grid), P_FFT(U._grid); + static ComplexField p2(U._grid); + RealD M = FFT_MASS; + + FFT theFFT((GridCartesian*)U._grid); + theFFT.FFT_all_dim(Pp, P, FFT::forward); + static bool first_call = true; - static ComplexField p2(Grid); - if (first_call){ - MomentumSpacePropagator(p2,M); - first_call = false; + if (first_call) + { + // avoid recomputing + MomentumSpacePropagator(p2, M); + first_call = false; } Pp *= p2; - theFFT.FFT_all_dim(Pnew,Pp,FFT::backward); - U += Pnew * ep; - - #endif //USE_FFT_ACCELERATION + theFFT.FFT_all_dim(P_FFT, Pp, FFT::backward); + U += P_FFT * ep; + +#endif //USE_FFT_ACCELERATION } static inline RealD FieldSquareNorm(Field &U) { - #ifndef USE_FFT_ACCELERATION - return (TensorRemove(sum(trace(U*U))).real()); - #else +#ifndef USE_FFT_ACCELERATION + return (TensorRemove(sum(trace(U * U))).real()); +#else // In case of Fourier acceleration we have to: // compute U(p)*U(p)/(M^2+p^2)) Parseval theorem // 1 FFT needed U(x) -> U(p) // M to be passed - - GridCartesian *Grid = dynamic_cast(U._grid); - FFT theFFT(Grid); - Field Up(Grid), Utilde(Grid); - std::vector full_dim = Grid->FullDimensions(); - + + FFT theFFT((GridCartesian*)U._grid); + Field Up(U._grid); + theFFT.FFT_all_dim(Up, U, FFT::forward); - RealD M = 1.0; - ComplexField p2(Grid); - MomentumSpacePropagator(p2,M); - Field Up2 = Up*p2; + RealD M = FFT_MASS; + ComplexField p2(U._grid); + MomentumSpacePropagator(p2, M); + Field Up2 = Up * p2; // from the definition of the DFT we need to divide by the volume - return (-TensorRemove(sum(trace(adj(Up)*Up2))).real()/U._grid->gSites()); - #endif //USE_FFT_ACCELERATION + return (-TensorRemove(sum(trace(adj(Up) * Up2))).real() / U._grid->gSites()); +#endif //USE_FFT_ACCELERATION } static inline void HotConfiguration(GridParallelRNG &pRNG, Field &U) { From 999c62359046674117c0e0e1348072e002622c15 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 18 Sep 2017 14:39:04 +0100 Subject: [PATCH 040/620] Solving a memory leak in Communicator_mpi --- lib/cartesian/Cartesian_base.h | 3 + lib/cartesian/Cartesian_full.h | 3 + lib/communicator/Communicator_base.h | 1 + lib/communicator/Communicator_mpi.cc | 7 + .../action/scalar/ScalarInteractionAction.h | 220 ++++++++++-------- 5 files changed, 135 insertions(+), 99 deletions(-) diff --git a/lib/cartesian/Cartesian_base.h b/lib/cartesian/Cartesian_base.h index f4f9a269..0c67e951 100644 --- a/lib/cartesian/Cartesian_base.h +++ b/lib/cartesian/Cartesian_base.h @@ -50,6 +50,9 @@ public: GridBase(const std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; + virtual ~GridBase() = default; + + // Physics Grid information. std::vector _simd_layout;// Which dimensions get relayed out over simd lanes. std::vector _fdimensions;// (full) Global dimensions of array prior to cb removal diff --git a/lib/cartesian/Cartesian_full.h b/lib/cartesian/Cartesian_full.h index 815e3b22..62481bb8 100644 --- a/lib/cartesian/Cartesian_full.h +++ b/lib/cartesian/Cartesian_full.h @@ -93,6 +93,7 @@ public: // Use a reduced simd grid _ldimensions[d] = _gdimensions[d] / _processors[d]; //local dimensions + //std::cout << _ldimensions[d] << " " << _gdimensions[d] << " " << _processors[d] << std::endl; assert(_ldimensions[d] * _processors[d] == _gdimensions[d]); _rdimensions[d] = _ldimensions[d] / _simd_layout[d]; //overdecomposition @@ -137,6 +138,8 @@ public: block = block * _rdimensions[d]; } }; + + virtual ~GridCartesian() = default; }; } #endif diff --git a/lib/communicator/Communicator_base.h b/lib/communicator/Communicator_base.h index ac866ced..ada017b0 100644 --- a/lib/communicator/Communicator_base.h +++ b/lib/communicator/Communicator_base.h @@ -152,6 +152,7 @@ class CartesianCommunicator { // Constructor of any given grid //////////////////////////////////////////////// CartesianCommunicator(const std::vector &pdimensions_in); + virtual ~CartesianCommunicator(); //////////////////////////////////////////////////////////////////////////////////////// // Wraps MPI_Cart routines, or implements equivalent on other impls diff --git a/lib/communicator/Communicator_mpi.cc b/lib/communicator/Communicator_mpi.cc index bd2a62fb..a3427b00 100644 --- a/lib/communicator/Communicator_mpi.cc +++ b/lib/communicator/Communicator_mpi.cc @@ -75,6 +75,13 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) assert(Size==_Nprocessors); } + +CartesianCommunicator::~CartesianCommunicator(){ + if (communicator && !MPI::Is_finalized()) + MPI_Comm_free(&communicator); +} + + void CartesianCommunicator::GlobalSum(uint32_t &u){ int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); assert(ierr==0); diff --git a/lib/qcd/action/scalar/ScalarInteractionAction.h b/lib/qcd/action/scalar/ScalarInteractionAction.h index 4d189352..a681b62c 100644 --- a/lib/qcd/action/scalar/ScalarInteractionAction.h +++ b/lib/qcd/action/scalar/ScalarInteractionAction.h @@ -30,119 +30,141 @@ directory #ifndef SCALAR_INT_ACTION_H #define SCALAR_INT_ACTION_H - // Note: this action can completely absorb the ScalarAction for real float fields // use the scalarObjs to generalise the structure -namespace Grid { - // FIXME drop the QCD namespace everywhere here +namespace Grid +{ +// FIXME drop the QCD namespace everywhere here - template - class ScalarInteractionAction : public QCD::Action { - public: - INHERIT_FIELD_TYPES(Impl); - private: - RealD mass_square; - RealD lambda; +template +class ScalarInteractionAction : public QCD::Action +{ +public: + INHERIT_FIELD_TYPES(Impl); +private: + RealD mass_square; + RealD lambda; - typedef typename Field::vector_object vobj; - typedef CartesianStencil Stencil; + typedef typename Field::vector_object vobj; + typedef CartesianStencil Stencil; - SimpleCompressor compressor; - int npoint = 2*Ndim; - std::vector directions;// = {0,1,2,3,0,1,2,3}; // forcing 4 dimensions - std::vector displacements;// = {1,1,1,1, -1,-1,-1,-1}; + SimpleCompressor compressor; + int npoint = 2 * Ndim; + std::vector directions; // = {0,1,2,3,0,1,2,3}; // forcing 4 dimensions + std::vector displacements; // = {1,1,1,1, -1,-1,-1,-1}; - - public: - - ScalarInteractionAction(RealD ms, RealD l) : mass_square(ms), lambda(l), displacements(2*Ndim,0), directions(2*Ndim,0){ - for (int mu = 0 ; mu < Ndim; mu++){ - directions[mu] = mu; directions[mu+Ndim] = mu; - displacements[mu] = 1; displacements[mu+Ndim] = -1; - } +public: + ScalarInteractionAction(RealD ms, RealD l) : mass_square(ms), lambda(l), displacements(2 * Ndim, 0), directions(2 * Ndim, 0) + { + for (int mu = 0; mu < Ndim; mu++) + { + directions[mu] = mu; + directions[mu + Ndim] = mu; + displacements[mu] = 1; + displacements[mu + Ndim] = -1; } + } - virtual std::string LogParameters() { - std::stringstream sstream; - sstream << GridLogMessage << "[ScalarAction] lambda : " << lambda << std::endl; - sstream << GridLogMessage << "[ScalarAction] mass_square : " << mass_square << std::endl; - return sstream.str(); - } + virtual std::string LogParameters() + { + std::stringstream sstream; + sstream << GridLogMessage << "[ScalarAction] lambda : " << lambda << std::endl; + sstream << GridLogMessage << "[ScalarAction] mass_square : " << mass_square << std::endl; + return sstream.str(); + } - virtual std::string action_name() {return "ScalarAction";} + virtual std::string action_name() { return "ScalarAction"; } - virtual void refresh(const Field &U, GridParallelRNG &pRNG) {} + virtual void refresh(const Field &U, GridParallelRNG &pRNG) {} - virtual RealD S(const Field &p) { - assert(p._grid->Nd() == Ndim); - static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); - phiStencil.HaloExchange(p, compressor); - Field action(p._grid), pshift(p._grid), phisquared(p._grid); - phisquared = p*p; - action = (2.0*Ndim + mass_square)*phisquared - lambda/24.*phisquared*phisquared; - for (int mu = 0; mu < Ndim; mu++) { - // pshift = Cshift(p, mu, +1); // not efficient, implement with stencils - parallel_for (int i = 0; i < p._grid->oSites(); i++) { - int permute_type; - StencilEntry *SE; - vobj temp2; - const vobj *temp, *t_p; - - SE = phiStencil.GetEntry(permute_type, mu, i); - t_p = &p._odata[i]; - if ( SE->_is_local ) { - temp = &p._odata[SE->_offset]; - if ( SE->_permute ) { - permute(temp2, *temp, permute_type); - action._odata[i] -= temp2*(*t_p) + (*t_p)*temp2; - } else { - action._odata[i] -= (*temp)*(*t_p) + (*t_p)*(*temp); - } - } else { - action._odata[i] -= phiStencil.CommBuf()[SE->_offset]*(*t_p) + (*t_p)*phiStencil.CommBuf()[SE->_offset]; - } - } - // action -= pshift*p + p*pshift; - } - // NB the trace in the algebra is normalised to 1/2 - // minus sign coming from the antihermitian fields - return -(TensorRemove(sum(trace(action)))).real(); - }; - - virtual void deriv(const Field &p, Field &force) { - assert(p._grid->Nd() == Ndim); - force = (2.0*Ndim + mass_square)*p - lambda/12.*p*p*p; - // move this outside - static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); - phiStencil.HaloExchange(p, compressor); - - //for (int mu = 0; mu < QCD::Nd; mu++) force -= Cshift(p, mu, -1) + Cshift(p, mu, 1); - for (int point = 0; point < npoint; point++) { - parallel_for (int i = 0; i < p._grid->oSites(); i++) { - const vobj *temp; - vobj temp2; - int permute_type; - StencilEntry *SE; - SE = phiStencil.GetEntry(permute_type, point, i); - - if ( SE->_is_local ) { - temp = &p._odata[SE->_offset]; - if ( SE->_permute ) { - permute(temp2, *temp, permute_type); - force._odata[i] -= temp2; - } else { - force._odata[i] -= *temp; - } - } else { - force._odata[i] -= phiStencil.CommBuf()[SE->_offset]; - } - } + virtual RealD S(const Field &p) + { + assert(p._grid->Nd() == Ndim); + static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); + phiStencil.HaloExchange(p, compressor); + Field action(p._grid), pshift(p._grid), phisquared(p._grid); + phisquared = p * p; + action = (2.0 * Ndim + mass_square) * phisquared - lambda / 24. * phisquared * phisquared; + for (int mu = 0; mu < Ndim; mu++) + { + // pshift = Cshift(p, mu, +1); // not efficient, implement with stencils + parallel_for(int i = 0; i < p._grid->oSites(); i++) + { + int permute_type; + StencilEntry *SE; + vobj temp2; + const vobj *temp, *t_p; + + SE = phiStencil.GetEntry(permute_type, mu, i); + t_p = &p._odata[i]; + if (SE->_is_local) + { + temp = &p._odata[SE->_offset]; + if (SE->_permute) + { + permute(temp2, *temp, permute_type); + action._odata[i] -= temp2 * (*t_p) + (*t_p) * temp2; + } + else + { + action._odata[i] -= (*temp) * (*t_p) + (*t_p) * (*temp); + } + } + else + { + action._odata[i] -= phiStencil.CommBuf()[SE->_offset] * (*t_p) + (*t_p) * phiStencil.CommBuf()[SE->_offset]; + } } + // action -= pshift*p + p*pshift; } + // NB the trace in the algebra is normalised to 1/2 + // minus sign coming from the antihermitian fields + return -(TensorRemove(sum(trace(action)))).real(); }; - -} // namespace Grid -#endif // SCALAR_INT_ACTION_H + virtual void deriv(const Field &p, Field &force) + { + assert(p._grid->Nd() == Ndim); + force = (2.0 * Ndim + mass_square) * p - lambda / 12. * p * p * p; + // move this outside + static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); + phiStencil.HaloExchange(p, compressor); + + //for (int mu = 0; mu < QCD::Nd; mu++) force -= Cshift(p, mu, -1) + Cshift(p, mu, 1); + for (int point = 0; point < npoint; point++) + { + parallel_for(int i = 0; i < p._grid->oSites(); i++) + { + const vobj *temp; + vobj temp2; + int permute_type; + StencilEntry *SE; + SE = phiStencil.GetEntry(permute_type, point, i); + + if (SE->_is_local) + { + temp = &p._odata[SE->_offset]; + if (SE->_permute) + { + permute(temp2, *temp, permute_type); + force._odata[i] -= temp2; + } + else + { + force._odata[i] -= *temp; + } + } + else + { + force._odata[i] -= phiStencil.CommBuf()[SE->_offset]; + } + } + } + } +}; + +} // namespace Grid + +#endif // SCALAR_INT_ACTION_H From 9a827d0242f7164a4bc02c5b8cefe606878fcb84 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 18 Sep 2017 14:55:51 +0100 Subject: [PATCH 041/620] Fixing a compilation error --- lib/communicator/Communicator_mpi3.cc | 3 +++ lib/communicator/Communicator_mpi3_leader.cc | 3 +++ lib/communicator/Communicator_mpit.cc | 3 +++ lib/communicator/Communicator_none.cc | 2 ++ lib/communicator/Communicator_shmem.cc | 3 +++ 5 files changed, 14 insertions(+) diff --git a/lib/communicator/Communicator_mpi3.cc b/lib/communicator/Communicator_mpi3.cc index 44aa1024..bb256e79 100644 --- a/lib/communicator/Communicator_mpi3.cc +++ b/lib/communicator/Communicator_mpi3.cc @@ -587,6 +587,9 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) } } }; + +CartesianCommunicator::~CartesianCommunicator() = default; + void CartesianCommunicator::GlobalSum(uint32_t &u){ int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); assert(ierr==0); diff --git a/lib/communicator/Communicator_mpi3_leader.cc b/lib/communicator/Communicator_mpi3_leader.cc index 6e26bd3e..da863508 100644 --- a/lib/communicator/Communicator_mpi3_leader.cc +++ b/lib/communicator/Communicator_mpi3_leader.cc @@ -830,6 +830,9 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) MPI_Cart_coords(communicator,_processor,_ndimension,&_processor_coor[0]); }; +CartesianCommunicator::~CartesianCommunicator() = default; + + void CartesianCommunicator::GlobalSum(uint32_t &u){ int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); assert(ierr==0); diff --git a/lib/communicator/Communicator_mpit.cc b/lib/communicator/Communicator_mpit.cc index eb6ef87d..7b7ec14c 100644 --- a/lib/communicator/Communicator_mpit.cc +++ b/lib/communicator/Communicator_mpit.cc @@ -80,6 +80,9 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) assert(Size==_Nprocessors); } + +CartesianCommunicator::~CartesianCommunicator() = default; + void CartesianCommunicator::GlobalSum(uint32_t &u){ int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); assert(ierr==0); diff --git a/lib/communicator/Communicator_none.cc b/lib/communicator/Communicator_none.cc index 5319ab93..a4e6cf54 100644 --- a/lib/communicator/Communicator_none.cc +++ b/lib/communicator/Communicator_none.cc @@ -53,6 +53,8 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) } } +CartesianCommunicator::~CartesianCommunicator() = default; + void CartesianCommunicator::GlobalSum(float &){} void CartesianCommunicator::GlobalSumVector(float *,int N){} void CartesianCommunicator::GlobalSum(double &){} diff --git a/lib/communicator/Communicator_shmem.cc b/lib/communicator/Communicator_shmem.cc index 3c76c808..826471c4 100644 --- a/lib/communicator/Communicator_shmem.cc +++ b/lib/communicator/Communicator_shmem.cc @@ -98,6 +98,9 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) assert(Size==_Nprocessors); } +CartesianCommunicator::~CartesianCommunicator() = default; + + void CartesianCommunicator::GlobalSum(uint32_t &u){ static long long source ; static long long dest ; From 56478d63a5589e0ece63d7394b3c5167d5ef11bd Mon Sep 17 00:00:00 2001 From: David Preti Date: Sun, 24 Sep 2017 19:32:15 +0200 Subject: [PATCH 042/620] clover + test (valence) --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 126 +++++++++++++++--- lib/qcd/action/fermion/WilsonCloverFermion.h | 35 +++-- tests/core/Test_wilson_clover.cc | 44 +++--- 3 files changed, 142 insertions(+), 63 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index f8b62ba4..54e72353 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -86,8 +86,8 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) CloverTerm += fillCloverXY(Bz); CloverTerm += fillCloverXT(Ex); CloverTerm += fillCloverYT(Ey); - CloverTerm += fillCloverZT(Ez) ; - CloverTerm *= csw; + CloverTerm += fillCloverZT(Ez); + CloverTerm *= 0.5 * csw; // FieldStrength normalization? should be ( -i/8 ). Is it the anti-symmetric combination? int lvol = _Umu._grid->lSites(); int DimRep = Impl::Dimension; @@ -109,7 +109,7 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) for (int a = 0; a < DimRep; a++) for (int b = 0; b < DimRep; b++) EigenCloverOp(a + j * DimRep, b + k * DimRep) = Qx()(j, k)(a, b); - //std::cout << EigenCloverOp << std::endl; + // if (site==0) std::cout << "site =" << site << "\n" << EigenCloverOp << std::endl; EigenInvCloverOp = EigenCloverOp.inverse(); @@ -119,6 +119,7 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) for (int a = 0; a < DimRep; a++) for (int b = 0; b < DimRep; b++) Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep); + // if (site==0) std::cout << "site =" << site << "\n" << EigenInvCloverOp << std::endl; pokeLocalSite(Qxinv, CloverTermInv, lcoor); } @@ -127,8 +128,17 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) pickCheckerboard(Even, CloverTermEven, CloverTerm); pickCheckerboard( Odd, CloverTermOdd, CloverTerm); + + pickCheckerboard(Even, CloverTermDagEven, adj(CloverTerm)); + pickCheckerboard( Odd, CloverTermDagOdd, adj(CloverTerm)); + + pickCheckerboard(Even, CloverTermInvEven, CloverTermInv); pickCheckerboard( Odd, CloverTermInvOdd, CloverTermInv); + + + pickCheckerboard(Even, CloverTermInvDagEven, adj(CloverTermInv)); + pickCheckerboard( Odd, CloverTermInvDagOdd, adj(CloverTermInv)); } @@ -142,7 +152,7 @@ void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) template void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &out) { - this->MooeeInternal(in, out, DaggerNo, InverseYes); + this->MooeeInternal(in, out, DaggerYes, InverseNo); } template @@ -154,7 +164,7 @@ void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &o template void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out) { - this->MooeeInternal(in, out, DaggerNo, InverseYes); + this->MooeeInternal(in, out, DaggerYes, InverseYes); } template @@ -164,26 +174,98 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie CloverFieldType *Clover; assert(in.checkerboard == Odd || in.checkerboard == Even); - if (in._grid->_isCheckerBoarded) - { - if (in.checkerboard == Odd) - { - std::cout << "Calling clover term Odd" << std::endl; - Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; + + + + if (dag){ + if (in._grid->_isCheckerBoarded){ + if (in.checkerboard == Odd){ + std::cout << "Calling clover term adj Odd" << std::endl; + Clover = (inv) ? &CloverTermInvDagOdd : &CloverTermDagOdd; + +/* test + int DimRep = Impl::Dimension; + Eigen::MatrixXcd A = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); + std::vector lcoor; + typename SiteCloverType::scalar_object Qx2 = zero; + GridBase *grid = in._grid; + int site = 0 ; + grid->LocalIndexToLocalCoor(site, lcoor); + peekLocalSite(Qx2, *Clover, lcoor); + for (int j = 0; j < Ns; j++) + for (int k = 0; k < Ns; k++) + for (int a = 0; a < DimRep; a++) + for (int b = 0; b < DimRep; b++) + A(a + j * DimRep, b + k * DimRep) = Qx2()(j, k)(a, b); + std::cout << "adj Odd =" << site << "\n" << A << std::endl; + end test */ + + + + } else { + std::cout << "Calling clover term adj Even" << std::endl; + Clover = (inv) ? &CloverTermInvDagEven : &CloverTermDagEven; + +/* test + int DimRep = Impl::Dimension; + Eigen::MatrixXcd A = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); + std::vector lcoor; + typename SiteCloverType::scalar_object Qx2 = zero; + GridBase *grid = in._grid; + int site = 0 ; + grid->LocalIndexToLocalCoor(site, lcoor); + peekLocalSite(Qx2, *Clover, lcoor); + for (int j = 0; j < Ns; j++) + for (int k = 0; k < Ns; k++) + for (int a = 0; a < DimRep; a++) + for (int b = 0; b < DimRep; b++) + A(a + j * DimRep, b + k * DimRep) = Qx2()(j, k)(a, b); + std::cout << "adj Odd =" << site << "\n" << A << std::endl; + end test */ + + } - else - { - std::cout << "Calling clover term Even" << std::endl; - Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; - } - } - else - { - Clover = (inv) ? &CloverTermInv : &CloverTerm; + std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; + out = *Clover * in; + } else { + Clover = (inv) ? &CloverTermInv : &CloverTerm; + out = adj(*Clover) * in; } - std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; - if (dag){ out = adj(*Clover) * in;} else { out = *Clover * in;} + + + + } else { + if (in._grid->_isCheckerBoarded){ + + if (in.checkerboard == Odd){ + std::cout << "Calling clover term Odd" << std::endl; + Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; + } else { + std::cout << "Calling clover term Even" << std::endl; + Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; + } + out = *Clover * in; + std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; + } else { + Clover = (inv) ? &CloverTermInv : &CloverTerm; + out = *Clover * in; + } + } + + + + + + + +/* + } else { + out = *Clover * in; + } + */ + + } // MooeeInternal // Derivative parts diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index fd9d1f60..e8654513 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -63,7 +63,11 @@ public: CloverTermEven(&Hgrid), CloverTermOdd(&Hgrid), CloverTermInvEven(&Hgrid), - CloverTermInvOdd(&Hgrid) + CloverTermInvOdd(&Hgrid), + CloverTermDagEven(&Hgrid), //test + CloverTermDagOdd(&Hgrid), //test + CloverTermInvDagEven(&Hgrid), //test + CloverTermInvDagOdd(&Hgrid) //test { csw = _csw; assert(Nd == 4); // require 4 dimensions @@ -91,6 +95,11 @@ private: CloverFieldType CloverTerm, CloverTermInv; // Clover term CloverFieldType CloverTermEven, CloverTermOdd; CloverFieldType CloverTermInvEven, CloverTermInvOdd; // Clover term + + CloverFieldType CloverTermInvDagEven, CloverTermInvDagOdd; //test + CloverFieldType CloverTermDagEven, CloverTermDagOdd; //test + + // eventually these two can be compressed into 6x6 blocks instead of the 12x12 // using the DeGrand-Rossi basis for the gamma matrices @@ -149,10 +158,10 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 1) = timesMinusI(F._odata[i]()()); - T._odata[i]()(1, 0) = timesMinusI(F._odata[i]()()); - T._odata[i]()(2, 3) = timesI(F._odata[i]()()); - T._odata[i]()(3, 2) = timesI(F._odata[i]()()); + T._odata[i]()(0, 1) = timesI(F._odata[i]()()); //fixed + T._odata[i]()(1, 0) = timesI(F._odata[i]()()); //fixed + T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); //fixed + T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); //fixed } return T; @@ -165,10 +174,10 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 1) = (F._odata[i]()()); - T._odata[i]()(1, 0) = -(F._odata[i]()()); - T._odata[i]()(2, 3) = -(F._odata[i]()()); - T._odata[i]()(3, 2) = (F._odata[i]()()); + T._odata[i]()(0, 1) = -(F._odata[i]()()); //fixed + T._odata[i]()(1, 0) = (F._odata[i]()()); //fixed + T._odata[i]()(2, 3) = (F._odata[i]()()); //fixed + T._odata[i]()(3, 2) = -(F._odata[i]()()); //fixed } return T; @@ -181,10 +190,10 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 0) = timesMinusI(F._odata[i]()()); - T._odata[i]()(1, 1) = timesI(F._odata[i]()()); - T._odata[i]()(2, 2) = timesI(F._odata[i]()()); - T._odata[i]()(3, 3) = timesMinusI(F._odata[i]()()); + T._odata[i]()(0, 0) = timesI(F._odata[i]()()); //fixed + T._odata[i]()(1, 1) = timesMinusI(F._odata[i]()()); //fixed + T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); //fixed + T._odata[i]()(3, 3) = timesI(F._odata[i]()()); //fixed } return T; diff --git a/tests/core/Test_wilson_clover.cc b/tests/core/Test_wilson_clover.cc index 1b208e2d..9e5b246e 100644 --- a/tests/core/Test_wilson_clover.cc +++ b/tests/core/Test_wilson_clover.cc @@ -172,11 +172,6 @@ int main (int argc, char ** argv) std::cout< HermOpEO(Dwc); - HermOpEO.MpcDagMpc(chi_e,dchi_e,t1,t2); - HermOpEO.MpcDagMpc(chi_o,dchi_o,t1,t2); + Dwc.MooeeDag(chi_e,src_e); + Dwc.MooeeInv(src_e,phi_e); - HermOpEO.MpcDagMpc(phi_e,dphi_e,t1,t2); - HermOpEO.MpcDagMpc(phi_o,dphi_o,t1,t2); + Dwc.MooeeDag(chi_o,src_o); + Dwc.MooeeInv(src_o,phi_o); - pDce = innerProduct(phi_e,dchi_e); - pDco = innerProduct(phi_o,dchi_o); - cDpe = innerProduct(chi_e,dphi_e); - cDpo = innerProduct(chi_o,dphi_o); - - std::cout< Date: Thu, 28 Sep 2017 13:34:33 -0400 Subject: [PATCH 043/620] QedFVol: fix problem with JSON wanting gcc 4.9 --- lib/json/json.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/json/json.hpp b/lib/json/json.hpp index e7c42920..9d589120 100644 --- a/lib/json/json.hpp +++ b/lib/json/json.hpp @@ -63,7 +63,7 @@ SOFTWARE. #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" #endif #elif defined(__GNUC__) - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900 + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40805 #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" #endif #endif From a02193300234b91a756710fa4b7cc99e96302a4d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 29 Sep 2017 16:09:34 +0100 Subject: [PATCH 044/620] Scalar: SU(N) action change to t'Hooft scaling --- lib/qcd/action/scalar/ScalarInteractionAction.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/qcd/action/scalar/ScalarInteractionAction.h b/lib/qcd/action/scalar/ScalarInteractionAction.h index a681b62c..9d855137 100644 --- a/lib/qcd/action/scalar/ScalarInteractionAction.h +++ b/lib/qcd/action/scalar/ScalarInteractionAction.h @@ -44,8 +44,9 @@ public: INHERIT_FIELD_TYPES(Impl); private: - RealD mass_square; - RealD lambda; + RealD mass_square; + RealD lambda; + const unsigned int N = Impl::Group::Dimension; typedef typename Field::vector_object vobj; typedef CartesianStencil Stencil; @@ -85,8 +86,8 @@ public: static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); phiStencil.HaloExchange(p, compressor); Field action(p._grid), pshift(p._grid), phisquared(p._grid); - phisquared = p * p; - action = (2.0 * Ndim + mass_square) * phisquared - lambda / 24. * phisquared * phisquared; + phisquared = p*p; + action = (2.*Ndim + mass_square) * phisquared - phisquared * phisquared; for (int mu = 0; mu < Ndim; mu++) { // pshift = Cshift(p, mu, +1); // not efficient, implement with stencils @@ -121,13 +122,13 @@ public: } // NB the trace in the algebra is normalised to 1/2 // minus sign coming from the antihermitian fields - return -(TensorRemove(sum(trace(action)))).real(); + return -(TensorRemove(sum(trace(action)))).real()*N/lambda; }; virtual void deriv(const Field &p, Field &force) { assert(p._grid->Nd() == Ndim); - force = (2.0 * Ndim + mass_square) * p - lambda / 12. * p * p * p; + force = (2.0 * Ndim + mass_square) * p - 2. * p * p * p; // move this outside static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); phiStencil.HaloExchange(p, compressor); @@ -162,6 +163,7 @@ public: } } } + force *= N/lambda; } }; From 05c1c88440a9b00c4a35e8487ab92a27afb48aea Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 3 Oct 2017 14:26:20 +0100 Subject: [PATCH 045/620] Scalar: more action generalisation --- lib/qcd/action/scalar/ScalarInteractionAction.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/qcd/action/scalar/ScalarInteractionAction.h b/lib/qcd/action/scalar/ScalarInteractionAction.h index 9d855137..3848751d 100644 --- a/lib/qcd/action/scalar/ScalarInteractionAction.h +++ b/lib/qcd/action/scalar/ScalarInteractionAction.h @@ -46,6 +46,7 @@ public: private: RealD mass_square; RealD lambda; + RealD g; const unsigned int N = Impl::Group::Dimension; typedef typename Field::vector_object vobj; @@ -57,7 +58,7 @@ private: std::vector displacements; // = {1,1,1,1, -1,-1,-1,-1}; public: - ScalarInteractionAction(RealD ms, RealD l) : mass_square(ms), lambda(l), displacements(2 * Ndim, 0), directions(2 * Ndim, 0) + ScalarInteractionAction(RealD ms, RealD l, RealD gval) : mass_square(ms), lambda(l), g(gval), displacements(2 * Ndim, 0), directions(2 * Ndim, 0) { for (int mu = 0; mu < Ndim; mu++) { @@ -73,6 +74,7 @@ public: std::stringstream sstream; sstream << GridLogMessage << "[ScalarAction] lambda : " << lambda << std::endl; sstream << GridLogMessage << "[ScalarAction] mass_square : " << mass_square << std::endl; + sstream << GridLogMessage << "[ScalarAction] g : " << g << std::endl; return sstream.str(); } @@ -86,8 +88,8 @@ public: static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); phiStencil.HaloExchange(p, compressor); Field action(p._grid), pshift(p._grid), phisquared(p._grid); - phisquared = p*p; - action = (2.*Ndim + mass_square) * phisquared - phisquared * phisquared; + phisquared = p * p; + action = (2.0 * Ndim + mass_square) * phisquared - lambda * phisquared * phisquared; for (int mu = 0; mu < Ndim; mu++) { // pshift = Cshift(p, mu, +1); // not efficient, implement with stencils @@ -122,13 +124,13 @@ public: } // NB the trace in the algebra is normalised to 1/2 // minus sign coming from the antihermitian fields - return -(TensorRemove(sum(trace(action)))).real()*N/lambda; + return -(TensorRemove(sum(trace(action)))).real()*N/g; }; virtual void deriv(const Field &p, Field &force) { assert(p._grid->Nd() == Ndim); - force = (2.0 * Ndim + mass_square) * p - 2. * p * p * p; + force = (2. * Ndim + mass_square) * p - 2. * lambda * p * p * p; // move this outside static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); phiStencil.HaloExchange(p, compressor); @@ -163,7 +165,7 @@ public: } } } - force *= N/lambda; + force *= N/g; } }; From 8784f2a88d780c7134574cf452d7c5550bda5769 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 3 Oct 2017 14:38:10 +0100 Subject: [PATCH 046/620] post-merge fix --- lib/communicator/Communicator_none.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/communicator/Communicator_none.cc b/lib/communicator/Communicator_none.cc index c97a181b..40feefec 100644 --- a/lib/communicator/Communicator_none.cc +++ b/lib/communicator/Communicator_none.cc @@ -56,8 +56,6 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) } } -CartesianCommunicator::~CartesianCommunicator() = default; - void CartesianCommunicator::GlobalSum(float &){} void CartesianCommunicator::GlobalSumVector(float *,int N){} void CartesianCommunicator::GlobalSum(double &){} From d38cee73bf1a9cc14bfa0e1f8aefcb2b99bdbb8d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 3 Oct 2017 17:29:34 +0100 Subject: [PATCH 047/620] Scalar: easier Fourier acceleration parametrisation through -D flags --- lib/qcd/action/scalar/ScalarImpl.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/qcd/action/scalar/ScalarImpl.h b/lib/qcd/action/scalar/ScalarImpl.h index 3dd3cc70..650f4d17 100644 --- a/lib/qcd/action/scalar/ScalarImpl.h +++ b/lib/qcd/action/scalar/ScalarImpl.h @@ -89,13 +89,12 @@ class ScalarImplTypes { }; - - #define USE_FFT_ACCELERATION - #ifdef USE_FFT_ACCELERATION - #define FFT_MASS 0.707 + #ifdef USE_FFT_ACCELERATION + #ifndef FFT_MASS + #error "USE_FFT_ACCELERATION is defined but not FFT_MASS" #endif - - + #endif + template class ScalarAdjMatrixImplTypes { public: From d810e8c8fb765236fadcc23d76daf9a2eb0f3144 Mon Sep 17 00:00:00 2001 From: David Preti Date: Thu, 5 Oct 2017 10:13:53 +0200 Subject: [PATCH 048/620] first attempt to write C terms in clover derivative. Some shifts to be fixed --- lib/perfmon/PerfCount.h | 3 +- lib/perfmon/Stat.cc | 30 ++++---- lib/qcd/action/fermion/WilsonCloverFermion.cc | 75 +++++++++++++++---- 3 files changed, 77 insertions(+), 31 deletions(-) diff --git a/lib/perfmon/PerfCount.h b/lib/perfmon/PerfCount.h index 73d2c70f..cb27c283 100644 --- a/lib/perfmon/PerfCount.h +++ b/lib/perfmon/PerfCount.h @@ -90,9 +90,10 @@ inline uint64_t cyclecount(void){ } #elif defined __x86_64__ inline uint64_t cyclecount(void){ - return __rdtsc(); + //return __rdtsc(); // unsigned int dummy; // return __rdtscp(&dummy); +return 0; // <- remove this; } #else diff --git a/lib/perfmon/Stat.cc b/lib/perfmon/Stat.cc index 3f47fd83..75679412 100644 --- a/lib/perfmon/Stat.cc +++ b/lib/perfmon/Stat.cc @@ -57,35 +57,37 @@ void PmuStat::start(void) pmu_start(); ++count; xmemctrs(&mrstart, &mwstart); - tstart = __rdtsc(); + //tstart = __rdtsc(); +tstart=0; #endif } void PmuStat::enter(int t) { #ifdef __x86_64__ - counters[0][t] = __rdpmc(0); - counters[1][t] = __rdpmc(1); - counters[2][t] = __rdpmc((1<<30)|0); - counters[3][t] = __rdpmc((1<<30)|1); - counters[4][t] = __rdpmc((1<<30)|2); - counters[5][t] = __rdtsc(); + counters[0][t] = 0;//__rdpmc(0); + counters[1][t] = 0;//__rdpmc(1); + counters[2][t] = 0;//__rdpmc((1<<30)|0); + counters[3][t] = 0;//__rdpmc((1<<30)|1); + counters[4][t] = 0;//__rdpmc((1<<30)|2); + counters[5][t] = 0;//__rdtsc(); #endif } void PmuStat::exit(int t) { #ifdef __x86_64__ - counters[0][t] = __rdpmc(0) - counters[0][t]; - counters[1][t] = __rdpmc(1) - counters[1][t]; - counters[2][t] = __rdpmc((1<<30)|0) - counters[2][t]; - counters[3][t] = __rdpmc((1<<30)|1) - counters[3][t]; - counters[4][t] = __rdpmc((1<<30)|2) - counters[4][t]; - counters[5][t] = __rdtsc() - counters[5][t]; + counters[0][t] = 0;//__rdpmc(0) - counters[0][t]; + counters[1][t] = 0;// __rdpmc(1) - counters[1][t]; + counters[2][t] = 0;// __rdpmc((1<<30)|0) - counters[2][t]; + counters[3][t] = 0;// __rdpmc((1<<30)|1) - counters[3][t]; + counters[4][t] = 0;// __rdpmc((1<<30)|2) - counters[4][t]; + counters[5][t] = 0;// __rdtsc() - counters[5][t]; #endif } void PmuStat::accum(int nthreads) { #ifdef __x86_64__ - tend = __rdtsc(); + // tend = __rdtsc(); + tend =0 ; xmemctrs(&mrend, &mwend); pmu_stop(); for (int t = 0; t < nthreads; ++t) { diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 54e72353..bc996ccb 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -253,25 +253,14 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie } } - - - - - - -/* - } else { - out = *Clover * in; - } - */ - - } // MooeeInternal // Derivative parts template void WilsonCloverFermion::MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) { + + GaugeField tmp(mat._grid); conformable(U._grid, V._grid); @@ -287,10 +276,64 @@ void WilsonCloverFermion::MDeriv(GaugeField &mat, const FermionField &U, c // Derivative parts template -void WilsonCloverFermion::MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) +void WilsonCloverFermion::MooDeriv(GaugeField &mat, const FermionField &X, const FermionField &Y, int dag) { - // Compute the 8 terms of the derivative - assert(0); // not implemented yet + +GridBase *grid = mat._grid; + +GaugeLinkField Lambda(grid), tmp(grid); +Lambda = zero; //Y*dag(X)+X*dag(Y); // I have to peek spin and decide the color structure + +conformable(mat._grid, X._grid); +conformable(Y._grid, X._grid); + +std::vector C1p(Nd,grid), C2p(Nd,grid), C3p(Nd,grid), C4p(Nd,grid); +std::vector C1m(Nd,grid), C2m(Nd,grid), C3m(Nd,grid), C4m(Nd,grid); +std::vector U(Nd, mat._grid); + +for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(mat, mu); + C1p[mu]=zero; C2p[mu]=zero; C3p[mu]=zero; C4p[mu]=zero; + C1m[mu]=zero; C2m[mu]=zero; C3m[mu]=zero; C4m[mu]=zero; +} + + +for (int mu=0;mu<4;mu++){ + for (int nu=0;nu<4;nu++){ +// insertion in upper staple + tmp = Impl::CovShiftIdentityBackward(Lambda, nu) * U[nu]; + C1p[mu]+= Cshift(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Cshift(U[nu], nu, -1))), mu, 1); + + tmp = Impl::CovShiftIdentityForward(Lambda, mu) * U[mu]; + C2p[mu]+= Cshift(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Cshift(U[nu], nu, -1))), mu, 1); + + tmp = Impl::CovShiftIdentityForward(Lambda, nu) * U[nu]; + C3p[mu]+= Cshift(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Cshift(tmp, nu, -1))), mu, 1); + + tmp = Lambda; + C4p[mu]+= Cshift(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Cshift(U[nu], nu, -1))),mu,1) * tmp; + +// insertion in lower staple + tmp = Impl::CovShiftIdentityForward(Lambda, nu) * U[nu]; + C1m[mu]+= Cshift(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu, 1); + + tmp = Cshift(Cshift(Lambda, nu, 2),mu, 1) * U[mu]; + C2m[mu]+= Cshift(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, U[nu])), mu ,1); + + tmp = Cshift(Lambda, nu, 2) * U[nu]; + C3m[mu]+= Cshift(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu, 1); + + tmp = Lambda; + C4m[mu]+= Cshift(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu, 1)* tmp; + } +} + + +//Still implementing. Have to be tested, and understood how to project EO + + + + } // Derivative parts From 15d690e9b9bd79e3ee9b6dae1a12753f131c024f Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 9 Oct 2017 09:59:58 +0100 Subject: [PATCH 049/620] Adding the cartesian communicator destructor --- lib/communicator/Communicator_none.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/communicator/Communicator_none.cc b/lib/communicator/Communicator_none.cc index 40feefec..4b9029d6 100644 --- a/lib/communicator/Communicator_none.cc +++ b/lib/communicator/Communicator_none.cc @@ -56,6 +56,9 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) } } +CartesianCommunicator::~CartesianCommunicator(){} + + void CartesianCommunicator::GlobalSum(float &){} void CartesianCommunicator::GlobalSumVector(float *,int N){} void CartesianCommunicator::GlobalSum(double &){} From a80e43dbcf4b3106f75ee2c35ea56e6145fd4c9b Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 11 Oct 2017 16:44:51 -0400 Subject: [PATCH 050/620] Added infinite-volume photon in Photon.h (not checked yet) --- lib/qcd/action/gauge/Photon.h | 112 +++++++++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 16 deletions(-) diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 7e21a1de..c8e3109a 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -58,7 +58,7 @@ namespace QCD{ public: INHERIT_GIMPL_TYPES(Gimpl); GRID_SERIALIZABLE_ENUM(Gauge, undef, feynman, 1, coulomb, 2, landau, 3); - GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2); + GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2, qedInf, 3); public: Photon(Gauge gauge, ZmScheme zmScheme); virtual ~Photon(void) = default; @@ -69,6 +69,7 @@ namespace QCD{ void StochasticField(GaugeField &out, GridParallelRNG &rng, const GaugeLinkField &weight); private: + void infVolPropagator(GaugeLinkField &out); void invKHatSquared(GaugeLinkField &out); void zmSub(GaugeLinkField &out); private: @@ -95,6 +96,32 @@ namespace QCD{ MomentumSpacePropagator(prop_k,in_k); theFFT.FFT_all_dim(out,prop_k,FFT::backward); } + + template + void Photon::infVolPropagator(GaugeLinkField &out) + { + GridBase *grid = out._grid; + GaugeLinkField xmu(grid), one(grid); + const unsigned int nd = grid->_ndimension; + std::vector &l = grid->_fdimensions; + std::vector x0(nd,0); + TComplex Tone = Complex(1.0,0.0); + TComplex Tzero = Complex(0.0,0.0); + FFT fft(grid); + + one = Complex(1.0,0.0); + out = zero; + for(int mu = 0; mu < nd; mu++) + { + LatticeCoordinate(xmu,mu); + xmu = where(xmu < latt_size[mu]/2, xmu, xmu-latt_size[mu]/2); + out = out + 4*M_PI*M_PI*xmu*xmu; + } + pokeSite(Tone, out, x0); + out = one/out; + pokeSite(Tzero, out, x0); + fft.FFT_all_dim(out, out, FFT::forward); + } template void Photon::invKHatSquared(GaugeLinkField &out) @@ -163,13 +190,28 @@ namespace QCD{ void Photon::MomentumSpacePropagator(const GaugeField &in, GaugeField &out) { - GridBase *grid = out._grid; - LatticeComplex k2Inv(grid); + GridBase *grid = out._grid; + LatticeComplex momProp(grid); - invKHatSquared(k2Inv); - zmSub(k2Inv); + switch (zmScheme_) + { + case ZmScheme::qedTL: + case ZmScheme::qedL: + { + invKHatSquared(momProp); + zmSub(momProp); + break; + } + case ZmScheme::qedInf: + { + infVolPropagator(momProp); + break; + } + default: + break; + } - out = in*k2Inv; + out = in*momProp; } template @@ -179,14 +221,30 @@ namespace QCD{ const unsigned int nd = grid->_ndimension; std::vector latt_size = grid->_fdimensions; - Integer vol = 1; - for(int d = 0; d < nd; d++) + switch (zmScheme_) { - vol = vol * latt_size[d]; + case ZmScheme::qedTL: + case ZmScheme::qedL: + { + Integer vol = 1; + for(int d = 0; d < nd; d++) + { + vol = vol * latt_size[d]; + } + invKHatSquared(weight); + weight = sqrt(vol*real(weight)); + zmSub(weight); + break; + } + case ZmScheme::qedInf: + { + infVolPropagator(weight); + weight = sqrt(real(weight)); + break; + } + default: + break; } - invKHatSquared(weight); - weight = sqrt(vol*real(weight)); - zmSub(weight); } template @@ -209,12 +267,34 @@ namespace QCD{ GaugeField aTilde(grid); FFT fft(grid); - for(int mu = 0; mu < nd; mu++) + switch (zmScheme_) { - gaussian(rng, r); - r = weight*r; - pokeLorentz(aTilde, r, mu); + case ZmScheme::qedTL: + case ZmScheme::qedL: + { + for(int mu = 0; mu < nd; mu++) + { + gaussian(rng, r); + r = weight*r; + pokeLorentz(aTilde, r, mu); + } + break; + } + case ZmScheme::qedInf: + { + Complex shift(1., 1.); // This needs to be a GaugeLink element? + for(int mu = 0; mu < nd; mu++) + { + bernoulli(rng, r); + r = weight*(2.*r - shift); + pokeLorentz(aTilde, r, mu); + } + break; + } + default: + break; } + fft.FFT_all_dim(out, aTilde, FFT::backward); out = real(out); From 317ddfedee2104de5bfb96d9174dc31542af9797 Mon Sep 17 00:00:00 2001 From: pretidav Date: Mon, 16 Oct 2017 02:47:33 +0200 Subject: [PATCH 051/620] updated test clover + first attempt derivative clove term (still missing spin part) --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 79 +++++---- lib/qcd/action/fermion/WilsonCloverFermion.h | 16 +- tests/core/Test_wilson_clover.cc | 156 ++++++++++++++---- 3 files changed, 180 insertions(+), 71 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index bc996ccb..7f58f277 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -46,7 +46,6 @@ RealD WilsonCloverFermion::M(const FermionField &in, FermionField &out) // apply the sigma and Fmunu FermionField temp(out._grid); Mooee(in, temp); - // overall factor out += temp; return axpy_norm(out, 4 + this->mass, in, out); } @@ -89,6 +88,7 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) CloverTerm += fillCloverZT(Ez); CloverTerm *= 0.5 * csw; // FieldStrength normalization? should be ( -i/8 ). Is it the anti-symmetric combination? + int lvol = _Umu._grid->lSites(); int DimRep = Impl::Dimension; @@ -98,20 +98,21 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) std::vector lcoor; typename SiteCloverType::scalar_object Qx = zero, Qxinv = zero; + for (int site = 0; site < lvol; site++) { grid->LocalIndexToLocalCoor(site, lcoor); EigenCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); peekLocalSite(Qx, CloverTerm, lcoor); Qxinv = zero; +//if (csw!=0){ for (int j = 0; j < Ns; j++) for (int k = 0; k < Ns; k++) for (int a = 0; a < DimRep; a++) for (int b = 0; b < DimRep; b++) EigenCloverOp(a + j * DimRep, b + k * DimRep) = Qx()(j, k)(a, b); - // if (site==0) std::cout << "site =" << site << "\n" << EigenCloverOp << std::endl; - - + // if (site==0) std::cout << "site =" << site << "\n" << EigenCloverOp << std::endl; + EigenInvCloverOp = EigenCloverOp.inverse(); //std::cout << EigenInvCloverOp << std::endl; for (int j = 0; j < Ns; j++) @@ -120,9 +121,11 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) for (int b = 0; b < DimRep; b++) Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep); // if (site==0) std::cout << "site =" << site << "\n" << EigenInvCloverOp << std::endl; - +// } pokeLocalSite(Qxinv, CloverTermInv, lcoor); - } + } + + // Separate the even and odd parts. pickCheckerboard(Even, CloverTermEven, CloverTerm); @@ -180,7 +183,7 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie if (dag){ if (in._grid->_isCheckerBoarded){ if (in.checkerboard == Odd){ - std::cout << "Calling clover term adj Odd" << std::endl; +// std::cout << "Calling clover term adj Odd" << std::endl; Clover = (inv) ? &CloverTermInvDagOdd : &CloverTermDagOdd; /* test @@ -203,7 +206,7 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie } else { - std::cout << "Calling clover term adj Even" << std::endl; +// std::cout << "Calling clover term adj Even" << std::endl; Clover = (inv) ? &CloverTermInvDagEven : &CloverTermDagEven; /* test @@ -225,7 +228,7 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie } - std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; + // std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; out = *Clover * in; } else { Clover = (inv) ? &CloverTermInv : &CloverTerm; @@ -239,14 +242,14 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie if (in._grid->_isCheckerBoarded){ if (in.checkerboard == Odd){ - std::cout << "Calling clover term Odd" << std::endl; + // std::cout << "Calling clover term Odd" << std::endl; Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; } else { - std::cout << "Calling clover term Even" << std::endl; + // std::cout << "Calling clover term Even" << std::endl; Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; } out = *Clover * in; - std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; + // std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; } else { Clover = (inv) ? &CloverTermInv : &CloverTerm; out = *Clover * in; @@ -281,8 +284,12 @@ void WilsonCloverFermion::MooDeriv(GaugeField &mat, const FermionField &X, GridBase *grid = mat._grid; +//GaugeLinkField Lambdaodd(grid), Lambdaeven(grid), tmp(grid); +//Lambdaodd = zero; //Yodd*dag(Xodd)+Xodd*dag(Yodd); // I have to peek spin and decide the color structure +//Lambdaeven = zero; //Teven*dag(Xeven)+Xeven*dag(Yeven) + 2*(Dee^-1) + GaugeLinkField Lambda(grid), tmp(grid); -Lambda = zero; //Y*dag(X)+X*dag(Y); // I have to peek spin and decide the color structure +Lambda=zero; conformable(mat._grid, X._grid); conformable(Y._grid, X._grid); @@ -297,37 +304,53 @@ for (int mu = 0; mu < Nd; mu++) { C1m[mu]=zero; C2m[mu]=zero; C3m[mu]=zero; C4m[mu]=zero; } +/* + PARALLEL_FOR_LOOP + for (int i = 0; i < CloverTerm._grid->oSites(); i++) + { + T._odata[i]()(0, 1) = timesMinusI(F._odata[i]()()); + T._odata[i]()(1, 0) = timesMinusI(F._odata[i]()()); + T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); + T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); + } +*/ + +for (int i=0;i<4;i++){ //spin + for(int j=0;j<4;j++){ //spin + +for (int mu=0;mu<4;mu++){ //color + for (int nu=0;nu<4;nu++){ //color -for (int mu=0;mu<4;mu++){ - for (int nu=0;nu<4;nu++){ // insertion in upper staple - tmp = Impl::CovShiftIdentityBackward(Lambda, nu) * U[nu]; - C1p[mu]+= Cshift(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Cshift(U[nu], nu, -1))), mu, 1); + tmp = Lambda * U[nu]; + C1p[mu]+=Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - tmp = Impl::CovShiftIdentityForward(Lambda, mu) * U[mu]; - C2p[mu]+= Cshift(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Cshift(U[nu], nu, -1))), mu, 1); + tmp = Lambda * U[mu]; + C2p[mu]+= Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); tmp = Impl::CovShiftIdentityForward(Lambda, nu) * U[nu]; - C3p[mu]+= Cshift(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Cshift(tmp, nu, -1))), mu, 1); + C3p[mu]+= Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu); tmp = Lambda; - C4p[mu]+= Cshift(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Cshift(U[nu], nu, -1))),mu,1) * tmp; + C4p[mu]+= Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))),mu) * tmp; // insertion in lower staple - tmp = Impl::CovShiftIdentityForward(Lambda, nu) * U[nu]; - C1m[mu]+= Cshift(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu, 1); + tmp = Lambda * U[nu]; + C1m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu); - tmp = Cshift(Cshift(Lambda, nu, 2),mu, 1) * U[mu]; - C2m[mu]+= Cshift(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, U[nu])), mu ,1); + tmp = Lambda * U[mu]; + C2m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, U[nu])), mu); - tmp = Cshift(Lambda, nu, 2) * U[nu]; - C3m[mu]+= Cshift(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu, 1); + tmp = Lambda * U[nu]; + C3m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu); tmp = Lambda; - C4m[mu]+= Cshift(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu, 1)* tmp; + C4m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu)* tmp; } } +} +} //Still implementing. Have to be tested, and understood how to project EO diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index e8654513..7840af90 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -44,7 +44,7 @@ public: INHERIT_IMPL_TYPES(Impl); template using iImplClover = iScalar, Ns> >; typedef iImplClover SiteCloverType; - typedef Lattice CloverFieldType; + typedef Lattice CloverFieldType; public: typedef WilsonFermion WilsonBase; @@ -91,14 +91,12 @@ public: private: // here fixing the 4 dimensions, make it more general? - RealD csw; // Clover coefficient - CloverFieldType CloverTerm, CloverTermInv; // Clover term - CloverFieldType CloverTermEven, CloverTermOdd; - CloverFieldType CloverTermInvEven, CloverTermInvOdd; // Clover term - - CloverFieldType CloverTermInvDagEven, CloverTermInvDagOdd; //test - CloverFieldType CloverTermDagEven, CloverTermDagOdd; //test - + RealD csw; // Clover coefficient + CloverFieldType CloverTerm=zero, CloverTermInv=zero; // Clover term + CloverFieldType CloverTermEven=zero, CloverTermOdd=zero; // Clover term EO + CloverFieldType CloverTermInvEven=zero, CloverTermInvOdd=zero; // Clover term Inv EO + CloverFieldType CloverTermDagEven=zero, CloverTermDagOdd=zero; // Clover term Dag EO + CloverFieldType CloverTermInvDagEven=zero, CloverTermInvDagOdd=zero; // Clover term Inv Dag EO // eventually these two can be compressed into 6x6 blocks instead of the 12x12 // using the DeGrand-Rossi basis for the gamma matrices diff --git a/tests/core/Test_wilson_clover.cc b/tests/core/Test_wilson_clover.cc index 9e5b246e..9a5fffe2 100644 --- a/tests/core/Test_wilson_clover.cc +++ b/tests/core/Test_wilson_clover.cc @@ -55,13 +55,15 @@ int main (int argc, char ** argv) typedef typename WilsonCloverFermionR::FermionField FermionField; typename WilsonCloverFermionR::ImplParams params; - FermionField src (&Grid); random(pRNG,src); - FermionField result(&Grid); result=zero; - FermionField ref(&Grid); ref=zero; - FermionField tmp(&Grid); tmp=zero; - FermionField err(&Grid); tmp=zero; - FermionField phi (&Grid); random(pRNG,phi); - FermionField chi (&Grid); random(pRNG,chi); + FermionField src (&Grid); random(pRNG,src); + FermionField result(&Grid); result=zero; + FermionField result2(&Grid); result2=zero; + FermionField ref(&Grid); ref=zero; + FermionField tmp(&Grid); tmp=zero; + FermionField err(&Grid); err=zero; + FermionField err2(&Grid); err2=zero; + FermionField phi (&Grid); random(pRNG,phi); + FermionField chi (&Grid); random(pRNG,chi); LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu); std::vector U(4,&Grid); @@ -71,24 +73,9 @@ int main (int argc, char ** argv) volume=volume*latt_size[mu]; } - // Only one non-zero (y) - for(int mu=0;mu(Umu,mu); - /* Debug force unit - U[mu] = 1.0; - PokeIndex(Umu,U[mu],mu); - */ - } - - ref = zero; - - RealD mass=0.1; + RealD mass= 0.1; RealD csw = 1.0; - { // Simple clover implementation - - // ref = ref + mass * src; - } WilsonCloverFermionR Dwc(Umu,Grid,RBGrid,mass,csw,params); Dwc.ImportGauge(Umu); @@ -176,27 +163,26 @@ int main (int argc, char ** argv) std::cout< seeds2({5,6,7,8}); + GridParallelRNG pRNG2(&Grid); pRNG2.SeedFixedIntegers(seeds2); + LatticeColourMatrix Omega(&Grid); + LatticeColourMatrix ShiftedOmega(&Grid); + LatticeGaugeField U_prime(&Grid); U_prime=zero; + LatticeColourMatrix U_prime_mu(&Grid); U_prime_mu=zero; + SU::LieRandomize(pRNG2, Omega, 1.0); + for (int mu=0;mu Date: Tue, 17 Oct 2017 14:03:57 +0100 Subject: [PATCH 052/620] Add module for unit EM field --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MGauge/UnitEm.cc | 68 ++++++++++++++++++++++++ extras/Hadrons/Modules/MGauge/UnitEm.hpp | 67 +++++++++++++++++++++++ extras/Hadrons/modules.inc | 2 + lib/qcd/action/gauge/Photon.h | 18 +++++++ 5 files changed, 156 insertions(+) create mode 100644 extras/Hadrons/Modules/MGauge/UnitEm.cc create mode 100644 extras/Hadrons/Modules/MGauge/UnitEm.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 4e1e62f7..78bb213d 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc new file mode 100644 index 00000000..906be4cc --- /dev/null +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -0,0 +1,68 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MGauge/StochEm.cc + +Copyright (C) 2015 +Copyright (C) 2016 + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MGauge; + +/****************************************************************************** +* TStochEm implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +TUnitEm::TUnitEm(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +std::vector TUnitEm::getInput(void) +{ + return std::vector(); +} + +std::vector TUnitEm::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +void TUnitEm::setup(void) +{ + env().registerLattice(getName()); +} + +// execution /////////////////////////////////////////////////////////////////// +void TUnitEm::execute(void) +{ + PhotonR photon(); + EmField &a = *env().createLattice(getName()); + LOG(Message) << "Generating unit EM potential..." << std::endl; + photon.UnitField(a); +} diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.hpp b/extras/Hadrons/Modules/MGauge/UnitEm.hpp new file mode 100644 index 00000000..ea910929 --- /dev/null +++ b/extras/Hadrons/Modules/MGauge/UnitEm.hpp @@ -0,0 +1,67 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp + +Copyright (C) 2015 +Copyright (C) 2016 + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MGauge_UnitEm_hpp_ +#define Hadrons_MGauge_UnitEm_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * StochEm * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MGauge) + +class TUnitEm: public Module +{ +public: + typedef PhotonR::GaugeField EmField; + typedef PhotonR::GaugeLinkField EmComp; +public: + // constructor + TUnitEm(const std::string name); + // destructor + virtual ~TUnitEm(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(UnitEm, TUnitEm, MGauge); + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MGauge_UnitEm_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 29d63f58..b3c65de0 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -6,6 +6,7 @@ modules_cc =\ Modules/MGauge/Random.cc \ Modules/MGauge/StochEm.cc \ Modules/MGauge/Unit.cc \ + Modules/MGauge/UnitEm.cc \ Modules/MScalar/ChargedProp.cc \ Modules/MScalar/FreeProp.cc \ Modules/MScalar/ScalarVP.cc @@ -26,6 +27,7 @@ modules_hpp =\ Modules/MGauge/Random.hpp \ Modules/MGauge/StochEm.hpp \ Modules/MGauge/Unit.hpp \ + Modules/MGauge/UnitEm.hpp \ Modules/MLoop/NoiseLoop.hpp \ Modules/MScalar/ChargedProp.hpp \ Modules/MScalar/FreeProp.hpp \ diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 7e21a1de..1429c2ba 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -68,6 +68,7 @@ namespace QCD{ void StochasticField(GaugeField &out, GridParallelRNG &rng); void StochasticField(GaugeField &out, GridParallelRNG &rng, const GaugeLinkField &weight); + void UnitField(GaugeField &out); private: void invKHatSquared(GaugeLinkField &out); void zmSub(GaugeLinkField &out); @@ -219,6 +220,23 @@ namespace QCD{ out = real(out); } + + template + void Photon::UnitField(GaugeField &out) + { + auto *grid = dynamic_cast(out._grid); + const unsigned int nd = grid->_ndimension; + GaugeLinkField r(grid); + + r = Complex(1.0,0.0); + + for(int mu = 0; mu < nd; mu++) + { + pokeLorentz(out, r, mu); + } + + out = real(out); + } // template // void Photon::FeynmanGaugeMomentumSpacePropagator_L(GaugeField &out, // const GaugeField &in) From 98b1439ff9d1f2ebbe5def84d9e792cc12748672 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 20 Oct 2017 16:24:09 +0100 Subject: [PATCH 053/620] QedFVol: pass arbitrary input values to photon constructor in UnitEm --- extras/Hadrons/Modules/MGauge/UnitEm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index 906be4cc..f33dfed3 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -61,7 +61,7 @@ void TUnitEm::setup(void) // execution /////////////////////////////////////////////////////////////////// void TUnitEm::execute(void) { - PhotonR photon(); + PhotonR photon(0, 0); // Just chose arbitrary input values here EmField &a = *env().createLattice(getName()); LOG(Message) << "Generating unit EM potential..." << std::endl; photon.UnitField(a); From c4339397956396c0deeba1ab9638a350183a734e Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 20 Oct 2017 16:27:58 +0100 Subject: [PATCH 054/620] QedFVol: Temporarily remove incomplete implementation of infinite-volume photon --- lib/qcd/action/gauge/Photon.h | 112 +++++----------------------------- 1 file changed, 16 insertions(+), 96 deletions(-) diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 3744d56a..1429c2ba 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -58,7 +58,7 @@ namespace QCD{ public: INHERIT_GIMPL_TYPES(Gimpl); GRID_SERIALIZABLE_ENUM(Gauge, undef, feynman, 1, coulomb, 2, landau, 3); - GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2, qedInf, 3); + GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2); public: Photon(Gauge gauge, ZmScheme zmScheme); virtual ~Photon(void) = default; @@ -70,7 +70,6 @@ namespace QCD{ const GaugeLinkField &weight); void UnitField(GaugeField &out); private: - void infVolPropagator(GaugeLinkField &out); void invKHatSquared(GaugeLinkField &out); void zmSub(GaugeLinkField &out); private: @@ -97,32 +96,6 @@ namespace QCD{ MomentumSpacePropagator(prop_k,in_k); theFFT.FFT_all_dim(out,prop_k,FFT::backward); } - - template - void Photon::infVolPropagator(GaugeLinkField &out) - { - GridBase *grid = out._grid; - GaugeLinkField xmu(grid), one(grid); - const unsigned int nd = grid->_ndimension; - std::vector &l = grid->_fdimensions; - std::vector x0(nd,0); - TComplex Tone = Complex(1.0,0.0); - TComplex Tzero = Complex(0.0,0.0); - FFT fft(grid); - - one = Complex(1.0,0.0); - out = zero; - for(int mu = 0; mu < nd; mu++) - { - LatticeCoordinate(xmu,mu); - xmu = where(xmu < latt_size[mu]/2, xmu, xmu-latt_size[mu]/2); - out = out + 4*M_PI*M_PI*xmu*xmu; - } - pokeSite(Tone, out, x0); - out = one/out; - pokeSite(Tzero, out, x0); - fft.FFT_all_dim(out, out, FFT::forward); - } template void Photon::invKHatSquared(GaugeLinkField &out) @@ -191,28 +164,13 @@ namespace QCD{ void Photon::MomentumSpacePropagator(const GaugeField &in, GaugeField &out) { - GridBase *grid = out._grid; - LatticeComplex momProp(grid); + GridBase *grid = out._grid; + LatticeComplex k2Inv(grid); - switch (zmScheme_) - { - case ZmScheme::qedTL: - case ZmScheme::qedL: - { - invKHatSquared(momProp); - zmSub(momProp); - break; - } - case ZmScheme::qedInf: - { - infVolPropagator(momProp); - break; - } - default: - break; - } + invKHatSquared(k2Inv); + zmSub(k2Inv); - out = in*momProp; + out = in*k2Inv; } template @@ -222,30 +180,14 @@ namespace QCD{ const unsigned int nd = grid->_ndimension; std::vector latt_size = grid->_fdimensions; - switch (zmScheme_) + Integer vol = 1; + for(int d = 0; d < nd; d++) { - case ZmScheme::qedTL: - case ZmScheme::qedL: - { - Integer vol = 1; - for(int d = 0; d < nd; d++) - { - vol = vol * latt_size[d]; - } - invKHatSquared(weight); - weight = sqrt(vol*real(weight)); - zmSub(weight); - break; - } - case ZmScheme::qedInf: - { - infVolPropagator(weight); - weight = sqrt(real(weight)); - break; - } - default: - break; + vol = vol * latt_size[d]; } + invKHatSquared(weight); + weight = sqrt(vol*real(weight)); + zmSub(weight); } template @@ -268,34 +210,12 @@ namespace QCD{ GaugeField aTilde(grid); FFT fft(grid); - switch (zmScheme_) + for(int mu = 0; mu < nd; mu++) { - case ZmScheme::qedTL: - case ZmScheme::qedL: - { - for(int mu = 0; mu < nd; mu++) - { - gaussian(rng, r); - r = weight*r; - pokeLorentz(aTilde, r, mu); - } - break; - } - case ZmScheme::qedInf: - { - Complex shift(1., 1.); // This needs to be a GaugeLink element? - for(int mu = 0; mu < nd; mu++) - { - bernoulli(rng, r); - r = weight*(2.*r - shift); - pokeLorentz(aTilde, r, mu); - } - break; - } - default: - break; + gaussian(rng, r); + r = weight*r; + pokeLorentz(aTilde, r, mu); } - fft.FFT_all_dim(out, aTilde, FFT::backward); out = real(out); From 2e50b55ae4245ed7b0e9a01761cacdbea25f26bb Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 23 Oct 2017 13:32:26 +0100 Subject: [PATCH 055/620] Changes in the Makefile to compile against Chroma on Linux --- tests/qdpxx/Makefile.am | 3 ++- tests/qdpxx/Makefile.am.qdpxx | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/qdpxx/Makefile.am b/tests/qdpxx/Makefile.am index f7f30b85..bbcd0412 100644 --- a/tests/qdpxx/Makefile.am +++ b/tests/qdpxx/Makefile.am @@ -1,4 +1,5 @@ AM_CXXFLAGS += `chroma-config --cxxflags` -AM_LDFLAGS += `chroma-config --ldflags` `chroma-config --libs` +AM_LDFLAGS += `chroma-config --ldflags` +LIBS += `chroma-config --libs` include Make.inc diff --git a/tests/qdpxx/Makefile.am.qdpxx b/tests/qdpxx/Makefile.am.qdpxx index 3ccfa4b8..f212413f 100644 --- a/tests/qdpxx/Makefile.am.qdpxx +++ b/tests/qdpxx/Makefile.am.qdpxx @@ -1,6 +1,7 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/include `chroma-config --cxxflags` -AM_LDFLAGS = -L$(top_builddir)/lib `chroma-config --ldflags` `chroma-config --libs` +AM_LDFLAGS = -L$(top_builddir)/lib `chroma-config --ldflags` +AM_LIBS = `chroma-config --libs` include Make.inc From 6391b2a1d0ae8128dafa25349be754a198b978d3 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 23 Oct 2017 14:42:35 +0100 Subject: [PATCH 056/620] Added test for Wilson and Clover fermions --- .vscode/settings.json | 3 +- tests/qdpxx/Test_qdpxx_wilson.cc | 463 +++++++++++++++++++++++++++++++ 2 files changed, 465 insertions(+), 1 deletion(-) create mode 100644 tests/qdpxx/Test_qdpxx_wilson.cc diff --git a/.vscode/settings.json b/.vscode/settings.json index 3e49029b..f13d503b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -45,6 +45,7 @@ "istream": "cpp", "ostream": "cpp", "sstream": "cpp", - "streambuf": "cpp" + "streambuf": "cpp", + "algorithm": "cpp" } } \ No newline at end of file diff --git a/tests/qdpxx/Test_qdpxx_wilson.cc b/tests/qdpxx/Test_qdpxx_wilson.cc new file mode 100644 index 00000000..70a8b1bf --- /dev/null +++ b/tests/qdpxx/Test_qdpxx_wilson.cc @@ -0,0 +1,463 @@ +/************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/qdpxx/Test_qdpxx_wilson.cc + + Copyright (C) 2017 + + Author: Guido Cossu + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ +/* END LEGAL */ + +#include + +// Mass +double mq = 0.1; + +// Define Wilson Types +typedef Grid::QCD::WilsonImplR::FermionField FermionField; +typedef Grid::QCD::LatticeGaugeField GaugeField; + +#include +#include +#include + +enum ChromaAction +{ + Wilson, // Wilson + WilsonClover // CloverFermions +}; + +void make_gauge(GaugeField &lat, FermionField &src); +void calc_grid(ChromaAction CA, GaugeField &lat, FermionField &src, FermionField &res, int dag); +void calc_chroma(ChromaAction CA, GaugeField &lat, FermionField &src, FermionField &res, int dag); + +namespace Chroma +{ + +class ChromaWrapper +{ +public: + typedef multi1d U; + typedef LatticeFermion T4; + + static void ImportGauge(GaugeField &gr, + QDP::multi1d &ch) + { + Grid::QCD::LorentzColourMatrix LCM; + Grid::Complex cc; + QDP::ColorMatrix cm; + QDP::Complex c; + + std::vector x(4); + QDP::multi1d cx(4); + std::vector gd = gr._grid->GlobalDimensions(); + + for (x[0] = 0; x[0] < gd[0]; x[0]++) + { + for (x[1] = 0; x[1] < gd[1]; x[1]++) + { + for (x[2] = 0; x[2] < gd[2]; x[2]++) + { + for (x[3] = 0; x[3] < gd[3]; x[3]++) + { + cx[0] = x[0]; + cx[1] = x[1]; + cx[2] = x[2]; + cx[3] = x[3]; + Grid::peekSite(LCM, gr, x); + + for (int mu = 0; mu < 4; mu++) + { + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + cc = LCM(mu)()(i, j); + c = QDP::cmplx(QDP::Real(real(cc)), QDP::Real(imag(cc))); + QDP::pokeColor(cm, c, i, j); + } + } + QDP::pokeSite(ch[mu], cm, cx); + } + } + } + } + } + } + + static void ExportGauge(GaugeField &gr, + QDP::multi1d &ch) + { + Grid::QCD::LorentzColourMatrix LCM; + Grid::Complex cc; + QDP::ColorMatrix cm; + QDP::Complex c; + + std::vector x(4); + QDP::multi1d cx(4); + std::vector gd = gr._grid->GlobalDimensions(); + + for (x[0] = 0; x[0] < gd[0]; x[0]++) + { + for (x[1] = 0; x[1] < gd[1]; x[1]++) + { + for (x[2] = 0; x[2] < gd[2]; x[2]++) + { + for (x[3] = 0; x[3] < gd[3]; x[3]++) + { + cx[0] = x[0]; + cx[1] = x[1]; + cx[2] = x[2]; + cx[3] = x[3]; + + for (int mu = 0; mu < 4; mu++) + { + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + cm = QDP::peekSite(ch[mu], cx); + c = QDP::peekColor(cm, i, j); + cc = Grid::Complex(toDouble(real(c)), toDouble(imag(c))); + LCM(mu) + ()(i, j) = cc; + } + } + } + Grid::pokeSite(LCM, gr, x); + } + } + } + } + } + + // Specific for Wilson Fermions + static void ImportFermion(Grid::QCD::LatticeFermion &gr, + QDP::LatticeFermion &ch) + { + Grid::QCD::SpinColourVector F; + Grid::Complex c; + + QDP::Fermion cF; + QDP::SpinVector cS; + QDP::Complex cc; + + std::vector x(4); // explicit 4d fermions in Grid + QDP::multi1d cx(4); + std::vector gd = gr._grid->GlobalDimensions(); + + for (x[0] = 0; x[0] < gd[0]; x[0]++) + { + for (x[1] = 0; x[1] < gd[1]; x[1]++) + { + for (x[2] = 0; x[2] < gd[2]; x[2]++) + { + for (x[3] = 0; x[3] < gd[3]; x[3]++) + { + cx[0] = x[0]; + cx[1] = x[1]; + cx[2] = x[2]; + cx[3] = x[3]; + + Grid::peekSite(F, gr, x); + + for (int j = 0; j < 3; j++) + { + for (int sp = 0; sp < 4; sp++) + { + + c = F()(sp)(j); + + cc = QDP::cmplx(QDP::Real(real(c)), QDP::Real(imag(c))); + + QDP::pokeSpin(cS, cc, sp); + } + QDP::pokeColor(cF, cS, j); + } + QDP::pokeSite(ch, cF, cx); + } + } + } + } + } + + // Specific for 4d Wilson fermions + static void ExportFermion(Grid::QCD::LatticeFermion &gr, + QDP::LatticeFermion &ch) + { + Grid::QCD::SpinColourVector F; + Grid::Complex c; + + QDP::Fermion cF; + QDP::SpinVector cS; + QDP::Complex cc; + + std::vector x(4); // 4d fermions + QDP::multi1d cx(4); + std::vector gd = gr._grid->GlobalDimensions(); + + for (x[0] = 0; x[0] < gd[0]; x[0]++) + { + for (x[1] = 0; x[1] < gd[1]; x[1]++) + { + for (x[2] = 0; x[2] < gd[2]; x[2]++) + { + for (x[3] = 0; x[3] < gd[3]; x[3]++) + { + cx[0] = x[0]; + cx[1] = x[1]; + cx[2] = x[2]; + cx[3] = x[3]; + + cF = QDP::peekSite(ch, cx); + for (int sp = 0; sp < 4; sp++) + { + for (int j = 0; j < 3; j++) + { + cS = QDP::peekColor(cF, j); + cc = QDP::peekSpin(cS, sp); + c = Grid::Complex(QDP::toDouble(QDP::real(cc)), + QDP::toDouble(QDP::imag(cc))); + F() + (sp)(j) = c; + } + } + Grid::pokeSite(F, gr, x); + } + } + } + } + } + + static Handle> GetLinOp(U &u, ChromaAction params) + { + QDP::Real _mq(mq); + QDP::multi1d bcs(QDP::Nd); + + // Boundary conditions + bcs[0] = bcs[1] = bcs[2] = bcs[3] = 1; + + if (params == Wilson) + { + + Chroma::WilsonFermActParams p; + p.Mass = _mq; + + Chroma::Handle> fbc(new Chroma::SimpleFermBC(bcs)); + Chroma::Handle> cfs(new Chroma::CreateSimpleFermState(fbc)); + Chroma::UnprecWilsonFermAct S_f(cfs, p); + Chroma::Handle> ffs(S_f.createState(u)); + return S_f.linOp(ffs); + } + + if (params == WilsonClover) + { + Chroma::CloverFermActParams p; + p.Mass = _mq; + p.clovCoeffR = QDP::Real(1.0); + p.clovCoeffT = QDP::Real(1.0); + Real u0 = QDP::Real(0.0); + + + Chroma::Handle> fbc(new Chroma::SimpleFermBC(bcs)); + Chroma::Handle> cfs(new Chroma::CreateSimpleFermState(fbc)); + Chroma::UnprecCloverFermAct S_f(cfs, p); + Chroma::Handle> ffs(S_f.createState(u)); + return S_f.linOp(ffs); + } + } +}; +} // namespace Chroma + +int main(int argc, char **argv) +{ + + /******************************************************** + * Setup QDP + *********************************************************/ + Chroma::initialize(&argc, &argv); + Chroma::WilsonTypeFermActs4DEnv::registerAll(); + + /******************************************************** + * Setup Grid + *********************************************************/ + Grid::Grid_init(&argc, &argv); + Grid::GridCartesian *UGrid = Grid::QCD::SpaceTimeGrid::makeFourDimGrid(Grid::GridDefaultLatt(), + Grid::GridDefaultSimd(Grid::QCD::Nd, Grid::vComplex::Nsimd()), + Grid::GridDefaultMpi()); + + std::vector gd = UGrid->GlobalDimensions(); + QDP::multi1d nrow(QDP::Nd); + for (int mu = 0; mu < 4; mu++) + nrow[mu] = gd[mu]; + + QDP::Layout::setLattSize(nrow); + QDP::Layout::create(); + + GaugeField Ug(UGrid); + FermionField src(UGrid); + FermionField res_chroma(UGrid); + FermionField res_grid(UGrid); + + std::vector ActionList({Wilson, WilsonClover}); + std::vector ActionName({"Wilson", "WilsonClover"}); + + { + + for (int i = 0; i < ActionList.size(); i++) + { + std::cout << "*****************************" << std::endl; + std::cout << "Action " << ActionName[i] << std::endl; + std::cout << "*****************************" << std::endl; + make_gauge(Ug, src); // fills the gauge field and the fermion field with random numbers + + for (int dag = 0; dag < 2; dag++) + { + + { + + std::cout << "Dag = " << dag << std::endl; + + calc_chroma(ActionList[i], Ug, src, res_chroma, dag); + + // Remove the normalisation of Chroma Gauge links ???????? + std::cout << "Norm of Chroma " << ActionName[i] << " multiply " << Grid::norm2(res_chroma) << std::endl; + calc_grid(ActionList[i], Ug, src, res_grid, dag); + + std::cout << "Norm of gauge " << Grid::norm2(Ug) << std::endl; + + std::cout << "Norm of Grid " << ActionName[i] << " multiply " << Grid::norm2(res_grid) << std::endl; + + res_chroma = res_chroma - res_grid; + std::cout << "Norm of difference " << Grid::norm2(res_chroma) << std::endl; + } + } + + std::cout << "Finished test " << std::endl; + + Chroma::finalize(); + } + } +} + + +void calc_chroma(ChromaAction action, GaugeField &lat, FermionField &src, FermionField &res, int dag) +{ + QDP::multi1d u(4); + Chroma::ChromaWrapper::ImportGauge(lat, u); + + QDP::LatticeFermion check; + QDP::LatticeFermion result; + QDP::LatticeFermion psi; + + Chroma::ChromaWrapper::ImportFermion(src, psi); + + for (int mu = 0; mu < 4; mu++) + { + std::cout << "Imported Gauge norm [" << mu << "] " << QDP::norm2(u[mu]) << std::endl; + } + std::cout << "Imported Fermion norm " << QDP::norm2(psi) << std::endl; + + typedef QDP::LatticeFermion T; + typedef QDP::multi1d U; + + auto linop = Chroma::ChromaWrapper::GetLinOp(u, action); + + printf("Calling Chroma Linop\n"); + fflush(stdout); + + if (dag) + (*linop)(check, psi, Chroma::MINUS); + else + (*linop)(check, psi, Chroma::PLUS); + + printf("Called Chroma Linop\n"); + fflush(stdout); + + // std::cout << "Calling Chroma Linop " << std::endl; + // linop->evenEvenLinOp(tmp, psi, isign); + // check[rb[0]] = tmp; + // linop->oddOddLinOp(tmp, psi, isign); + // check[rb[1]] = tmp; + // linop->evenOddLinOp(tmp, psi, isign); + // check[rb[0]] += tmp; + // linop->oddEvenLinOp(tmp, psi, isign); + // check[rb[1]] += tmp; + + Chroma::ChromaWrapper::ExportFermion(res, check); +} + +void make_gauge(GaugeField &Umu, FermionField &src) +{ + using namespace Grid; + using namespace Grid::QCD; + + std::vector seeds4({1, 2, 3, 4}); + + Grid::GridCartesian *UGrid = (Grid::GridCartesian *)Umu._grid; + Grid::GridParallelRNG RNG4(UGrid); + RNG4.SeedFixedIntegers(seeds4); + Grid::QCD::SU3::HotConfiguration(RNG4, Umu); + Grid::gaussian(RNG4, src); +} + +void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD::LatticeFermion &src, Grid::QCD::LatticeFermion &res, int dag) +{ + using namespace Grid; + using namespace Grid::QCD; + + Grid::GridCartesian *UGrid = (Grid::GridCartesian *)Umu._grid; + Grid::GridRedBlackCartesian *UrbGrid = Grid::QCD::SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); + + Grid::RealD _mass = mq; + + if (action == Wilson) + { + + Grid::QCD::WilsonFermionR Wf(Umu, *UGrid, *UrbGrid, _mass); + + std::cout << Grid::GridLogMessage << " Calling Grid Wilson Fermion multiply " << std::endl; + + if (dag) + Wf.Mdag(src, res); + else + Wf.M(src, res); + return; + } + + if (action == WilsonClover) + { + Grid::RealD _csw = 1.0; + + Grid::QCD::WilsonCloverFermionR Wf(Umu, *UGrid, *UrbGrid, _mass, _csw); + Wf.ImportGauge(Umu); + + std::cout << Grid::GridLogMessage << " Calling Grid Wilson Clover Fermion multiply " << std::endl; + + if (dag) + Wf.Mdag(src, res); + else + Wf.M(src, res); + return; + } + + assert(0); +} From 031c94e02e0644701f4eb2337a2dd684615f29c0 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 23 Oct 2017 18:27:34 +0100 Subject: [PATCH 057/620] Debugging process for the clover term --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 11 ++-- lib/qcd/action/fermion/WilsonCloverFermion.h | 24 ++++----- tests/qdpxx/Test_qdpxx_wilson.cc | 52 +++++++++++++++++-- 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 7f58f277..5e7e0034 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -71,10 +71,10 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) GridBase *grid = _Umu._grid; typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid); - // Compute the field strength terms - WilsonLoops::FieldStrength(Bx, _Umu, Ydir, Zdir); + // Compute the field strength terms mu>nu + WilsonLoops::FieldStrength(Bx, _Umu, Zdir, Ydir); WilsonLoops::FieldStrength(By, _Umu, Zdir, Xdir); - WilsonLoops::FieldStrength(Bz, _Umu, Xdir, Ydir); + WilsonLoops::FieldStrength(Bz, _Umu, Ydir, Xdir); WilsonLoops::FieldStrength(Ex, _Umu, Tdir, Xdir); WilsonLoops::FieldStrength(Ey, _Umu, Tdir, Ydir); WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); @@ -86,7 +86,7 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) CloverTerm += fillCloverXT(Ex); CloverTerm += fillCloverYT(Ey); CloverTerm += fillCloverZT(Ez); - CloverTerm *= 0.5 * csw; // FieldStrength normalization? should be ( -i/8 ). Is it the anti-symmetric combination? + CloverTerm *= (0.5) * csw; int lvol = _Umu._grid->lSites(); @@ -232,7 +232,8 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie out = *Clover * in; } else { Clover = (inv) ? &CloverTermInv : &CloverTerm; - out = adj(*Clover) * in; + //out = adj(*Clover) * in; + out = adj(CloverTerm) * in; } diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index 7840af90..18386485 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -156,10 +156,10 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 1) = timesI(F._odata[i]()()); //fixed - T._odata[i]()(1, 0) = timesI(F._odata[i]()()); //fixed - T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); //fixed - T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); //fixed + T._odata[i]()(0, 1) = timesI(F._odata[i]()()); + T._odata[i]()(1, 0) = timesI(F._odata[i]()()); + T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); + T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); } return T; @@ -172,10 +172,10 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 1) = -(F._odata[i]()()); //fixed - T._odata[i]()(1, 0) = (F._odata[i]()()); //fixed - T._odata[i]()(2, 3) = (F._odata[i]()()); //fixed - T._odata[i]()(3, 2) = -(F._odata[i]()()); //fixed + T._odata[i]()(0, 1) = -(F._odata[i]()()); + T._odata[i]()(1, 0) = (F._odata[i]()()); + T._odata[i]()(2, 3) = (F._odata[i]()()); + T._odata[i]()(3, 2) = -(F._odata[i]()()); } return T; @@ -188,10 +188,10 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 0) = timesI(F._odata[i]()()); //fixed - T._odata[i]()(1, 1) = timesMinusI(F._odata[i]()()); //fixed - T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); //fixed - T._odata[i]()(3, 3) = timesI(F._odata[i]()()); //fixed + T._odata[i]()(0, 0) = timesI(F._odata[i]()()); + T._odata[i]()(1, 1) = timesMinusI(F._odata[i]()()); + T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); + T._odata[i]()(3, 3) = timesI(F._odata[i]()()); } return T; diff --git a/tests/qdpxx/Test_qdpxx_wilson.cc b/tests/qdpxx/Test_qdpxx_wilson.cc index 70a8b1bf..1e1f6a23 100644 --- a/tests/qdpxx/Test_qdpxx_wilson.cc +++ b/tests/qdpxx/Test_qdpxx_wilson.cc @@ -29,7 +29,7 @@ #include // Mass -double mq = 0.1; +double mq = 0.0; // Define Wilson Types typedef Grid::QCD::WilsonImplR::FermionField FermionField; @@ -274,7 +274,7 @@ public: p.Mass = _mq; p.clovCoeffR = QDP::Real(1.0); p.clovCoeffT = QDP::Real(1.0); - Real u0 = QDP::Real(0.0); + Real u0 = QDP::Real(1.0); Chroma::Handle> fbc(new Chroma::SimpleFermBC(bcs)); @@ -316,6 +316,8 @@ int main(int argc, char **argv) FermionField src(UGrid); FermionField res_chroma(UGrid); FermionField res_grid(UGrid); + FermionField only_wilson(UGrid); + FermionField difference(UGrid); std::vector ActionList({Wilson, WilsonClover}); std::vector ActionName({"Wilson", "WilsonClover"}); @@ -346,8 +348,19 @@ int main(int argc, char **argv) std::cout << "Norm of Grid " << ActionName[i] << " multiply " << Grid::norm2(res_grid) << std::endl; - res_chroma = res_chroma - res_grid; - std::cout << "Norm of difference " << Grid::norm2(res_chroma) << std::endl; + difference = res_chroma - res_grid; + std::cout << "Norm of difference " << Grid::norm2(difference) << std::endl; + + // Isolate Clover term + calc_grid(Wilson, Ug, src, only_wilson, dag);// Wilson term + res_grid -= only_wilson; + res_chroma -= only_wilson; + + std::cout << "Chroma:" << res_chroma << std::endl; + std::cout << "Grid :" << res_grid << std::endl; + + + } } @@ -416,7 +429,36 @@ void make_gauge(GaugeField &Umu, FermionField &src) Grid::GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4); Grid::QCD::SU3::HotConfiguration(RNG4, Umu); - Grid::gaussian(RNG4, src); + + // Fermion field + //Grid::gaussian(RNG4, src); + Grid::QCD::SpinColourVector F; + Grid::Complex c; + + std::vector x(4); // 4d fermions + std::vector gd = src._grid->GlobalDimensions(); + + for (x[0] = 0; x[0] < gd[0]; x[0]++) + { + for (x[1] = 0; x[1] < gd[1]; x[1]++) + { + for (x[2] = 0; x[2] < gd[2]; x[2]++) + { + for (x[3] = 0; x[3] < gd[3]; x[3]++) + { + for (int sp = 0; sp < 1; sp++) + { + for (int j = 1; j < 2; j++)// colours + { + c = Grid::Complex(1.0, 0.0); + F()(sp)(j) = c; + } + } + Grid::pokeSite(F, src, x); + } + } + } + } } void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD::LatticeFermion &src, Grid::QCD::LatticeFermion &res, int dag) From 6579dd30ff6fd12378c0386d2ca317980586faff Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 23 Oct 2017 18:47:00 +0100 Subject: [PATCH 058/620] More debug test --- tests/qdpxx/Test_qdpxx_wilson.cc | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/tests/qdpxx/Test_qdpxx_wilson.cc b/tests/qdpxx/Test_qdpxx_wilson.cc index 1e1f6a23..8046c00d 100644 --- a/tests/qdpxx/Test_qdpxx_wilson.cc +++ b/tests/qdpxx/Test_qdpxx_wilson.cc @@ -276,7 +276,6 @@ public: p.clovCoeffT = QDP::Real(1.0); Real u0 = QDP::Real(1.0); - Chroma::Handle> fbc(new Chroma::SimpleFermBC(bcs)); Chroma::Handle> cfs(new Chroma::CreateSimpleFermState(fbc)); Chroma::UnprecCloverFermAct S_f(cfs, p); @@ -350,17 +349,16 @@ int main(int argc, char **argv) difference = res_chroma - res_grid; std::cout << "Norm of difference " << Grid::norm2(difference) << std::endl; - + // Isolate Clover term - calc_grid(Wilson, Ug, src, only_wilson, dag);// Wilson term + calc_grid(Wilson, Ug, src, only_wilson, dag); // Wilson term res_grid -= only_wilson; res_chroma -= only_wilson; - + std::cout << "Chroma:" << res_chroma << std::endl; std::cout << "Grid :" << res_grid << std::endl; - - - + difference = (res_grid-res_chroma); + std::cout << "Difference :" << difference << std::endl; } } @@ -371,7 +369,6 @@ int main(int argc, char **argv) } } - void calc_chroma(ChromaAction action, GaugeField &lat, FermionField &src, FermionField &res, int dag) { QDP::multi1d u(4); @@ -429,12 +426,14 @@ void make_gauge(GaugeField &Umu, FermionField &src) Grid::GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4); Grid::QCD::SU3::HotConfiguration(RNG4, Umu); - + // Fermion field //Grid::gaussian(RNG4, src); Grid::QCD::SpinColourVector F; Grid::Complex c; + + std::vector x(4); // 4d fermions std::vector gd = src._grid->GlobalDimensions(); @@ -446,15 +445,20 @@ void make_gauge(GaugeField &Umu, FermionField &src) { for (x[3] = 0; x[3] < gd[3]; x[3]++) { - for (int sp = 0; sp < 1; sp++) + for (int sp = 0; sp < 4; sp++) { - for (int j = 1; j < 2; j++)// colours + for (int j = 0; j < 3; j++) // colours { - c = Grid::Complex(1.0, 0.0); - F()(sp)(j) = c; + F()(sp)(j) = Grid::Complex(0.0,0.0); + if (((sp == 0)|| (sp==3)) && (j==0)) + { + c = Grid::Complex(1.0, 0.0); + F()(sp)(j) = c; + } } } Grid::pokeSite(F, src, x); + } } } From cbda4f66e0cdfdcd1405cf6b1c20a8ea55e976ad Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 24 Oct 2017 10:20:13 +0100 Subject: [PATCH 059/620] Debug of the field strength --- lib/qcd/utils/WilsonLoops.h | 4 +++- tests/qdpxx/Test_qdpxx_wilson.cc | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index ff49cf4e..fe813298 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -337,7 +337,9 @@ static void StapleMult(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { GaugeMat v = Vup - Vdn; GaugeMat u = PeekIndex(Umu, mu); // some redundant copies GaugeMat vu = v*u; - FS = 0.25*Ta(u*v + Cshift(vu, mu, -1)); + //FS = 0.25*Ta(u*v + Cshift(vu, mu, -1)); + FS = (u*v + Cshift(vu, mu, -1)); + FS = 0.125*(FS - adj(FS)); } static Real TopologicalCharge(GaugeLorentz &U){ diff --git a/tests/qdpxx/Test_qdpxx_wilson.cc b/tests/qdpxx/Test_qdpxx_wilson.cc index 8046c00d..7e2b3f7e 100644 --- a/tests/qdpxx/Test_qdpxx_wilson.cc +++ b/tests/qdpxx/Test_qdpxx_wilson.cc @@ -351,6 +351,7 @@ int main(int argc, char **argv) std::cout << "Norm of difference " << Grid::norm2(difference) << std::endl; // Isolate Clover term + /* calc_grid(Wilson, Ug, src, only_wilson, dag); // Wilson term res_grid -= only_wilson; res_chroma -= only_wilson; @@ -359,6 +360,7 @@ int main(int argc, char **argv) std::cout << "Grid :" << res_grid << std::endl; difference = (res_grid-res_chroma); std::cout << "Difference :" << difference << std::endl; + */ } } @@ -428,7 +430,8 @@ void make_gauge(GaugeField &Umu, FermionField &src) Grid::QCD::SU3::HotConfiguration(RNG4, Umu); // Fermion field - //Grid::gaussian(RNG4, src); + Grid::gaussian(RNG4, src); + /* Grid::QCD::SpinColourVector F; Grid::Complex c; @@ -450,7 +453,7 @@ void make_gauge(GaugeField &Umu, FermionField &src) for (int j = 0; j < 3; j++) // colours { F()(sp)(j) = Grid::Complex(0.0,0.0); - if (((sp == 0)|| (sp==3)) && (j==0)) + if (((sp == 0)|| (sp==3)) && (j==2)) { c = Grid::Complex(1.0, 0.0); F()(sp)(j) = c; @@ -463,6 +466,8 @@ void make_gauge(GaugeField &Umu, FermionField &src) } } } + */ + } void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD::LatticeFermion &src, Grid::QCD::LatticeFermion &res, int dag) From ec8cd11c1f7fce1c3deee79977745ba4f6c9776c Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 24 Oct 2017 13:21:17 +0100 Subject: [PATCH 060/620] Cleanup and prepare for pull request --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 279 ++++++++---------- lib/qcd/action/fermion/WilsonCloverFermion.h | 104 +++---- tests/core/Test_wilson_clover.cc | 10 +- tests/qdpxx/Test_qdpxx_wilson.cc | 172 +++++------ 4 files changed, 258 insertions(+), 307 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 5e7e0034..73e2bf69 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -39,29 +39,33 @@ namespace QCD template RealD WilsonCloverFermion::M(const FermionField &in, FermionField &out) { + FermionField temp(out._grid); + // Wilson term out.checkerboard = in.checkerboard; this->Dhop(in, out, DaggerNo); + // Clover term - // apply the sigma and Fmunu - FermionField temp(out._grid); Mooee(in, temp); + out += temp; - return axpy_norm(out, 4 + this->mass, in, out); + return norm2(out); } template RealD WilsonCloverFermion::Mdag(const FermionField &in, FermionField &out) { + FermionField temp(out._grid); + // Wilson term out.checkerboard = in.checkerboard; this->Dhop(in, out, DaggerYes); + // Clover term - // apply the sigma and Fmunu - FermionField temp(out._grid); MooeeDag(in, temp); - out+=temp; - return axpy_norm(out, 4 + this->mass, in, out); + + out += temp; + return norm2(out); } template @@ -80,14 +84,14 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); // Compute the Clover Operator acting on Colour and Spin - CloverTerm = fillCloverYZ(Bx); + CloverTerm = fillCloverYZ(Bx); CloverTerm += fillCloverXZ(By); CloverTerm += fillCloverXY(Bz); CloverTerm += fillCloverXT(Ex); CloverTerm += fillCloverYT(Ey); CloverTerm += fillCloverZT(Ez); - CloverTerm *= (0.5) * csw; - + CloverTerm *= (0.5) * csw; + CloverTerm += (4.0 + this->mass); int lvol = _Umu._grid->lSites(); int DimRep = Impl::Dimension; @@ -98,21 +102,20 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) std::vector lcoor; typename SiteCloverType::scalar_object Qx = zero, Qxinv = zero; - for (int site = 0; site < lvol; site++) { grid->LocalIndexToLocalCoor(site, lcoor); EigenCloverOp = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); peekLocalSite(Qx, CloverTerm, lcoor); Qxinv = zero; -//if (csw!=0){ + //if (csw!=0){ for (int j = 0; j < Ns; j++) for (int k = 0; k < Ns; k++) for (int a = 0; a < DimRep; a++) for (int b = 0; b < DimRep; b++) EigenCloverOp(a + j * DimRep, b + k * DimRep) = Qx()(j, k)(a, b); - // if (site==0) std::cout << "site =" << site << "\n" << EigenCloverOp << std::endl; - + // if (site==0) std::cout << "site =" << site << "\n" << EigenCloverOp << std::endl; + EigenInvCloverOp = EigenCloverOp.inverse(); //std::cout << EigenInvCloverOp << std::endl; for (int j = 0; j < Ns; j++) @@ -120,35 +123,29 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) for (int a = 0; a < DimRep; a++) for (int b = 0; b < DimRep; b++) Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep); - // if (site==0) std::cout << "site =" << site << "\n" << EigenInvCloverOp << std::endl; -// } + // if (site==0) std::cout << "site =" << site << "\n" << EigenInvCloverOp << std::endl; + // } pokeLocalSite(Qxinv, CloverTermInv, lcoor); - } - + } - - // Separate the even and odd parts. + // Separate the even and odd parts pickCheckerboard(Even, CloverTermEven, CloverTerm); - pickCheckerboard( Odd, CloverTermOdd, CloverTerm); - + pickCheckerboard(Odd, CloverTermOdd, CloverTerm); pickCheckerboard(Even, CloverTermDagEven, adj(CloverTerm)); - pickCheckerboard( Odd, CloverTermDagOdd, adj(CloverTerm)); - + pickCheckerboard(Odd, CloverTermDagOdd, adj(CloverTerm)); pickCheckerboard(Even, CloverTermInvEven, CloverTermInv); - pickCheckerboard( Odd, CloverTermInvOdd, CloverTermInv); - + pickCheckerboard(Odd, CloverTermInvOdd, CloverTermInv); pickCheckerboard(Even, CloverTermInvDagEven, adj(CloverTermInv)); - pickCheckerboard( Odd, CloverTermInvDagOdd, adj(CloverTermInv)); - + pickCheckerboard(Odd, CloverTermInvDagOdd, adj(CloverTermInv)); } template void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) { - conformable(in,out); + conformable(in, out); this->MooeeInternal(in, out, DaggerNo, InverseNo); } @@ -177,85 +174,50 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie CloverFieldType *Clover; assert(in.checkerboard == Odd || in.checkerboard == Even); - - - - if (dag){ - if (in._grid->_isCheckerBoarded){ - if (in.checkerboard == Odd){ -// std::cout << "Calling clover term adj Odd" << std::endl; - Clover = (inv) ? &CloverTermInvDagOdd : &CloverTermDagOdd; - -/* test - int DimRep = Impl::Dimension; - Eigen::MatrixXcd A = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); - std::vector lcoor; - typename SiteCloverType::scalar_object Qx2 = zero; - GridBase *grid = in._grid; - int site = 0 ; - grid->LocalIndexToLocalCoor(site, lcoor); - peekLocalSite(Qx2, *Clover, lcoor); - for (int j = 0; j < Ns; j++) - for (int k = 0; k < Ns; k++) - for (int a = 0; a < DimRep; a++) - for (int b = 0; b < DimRep; b++) - A(a + j * DimRep, b + k * DimRep) = Qx2()(j, k)(a, b); - std::cout << "adj Odd =" << site << "\n" << A << std::endl; - end test */ - - - - } else { -// std::cout << "Calling clover term adj Even" << std::endl; - Clover = (inv) ? &CloverTermInvDagEven : &CloverTermDagEven; - -/* test - int DimRep = Impl::Dimension; - Eigen::MatrixXcd A = Eigen::MatrixXcd::Zero(Ns * DimRep, Ns * DimRep); - std::vector lcoor; - typename SiteCloverType::scalar_object Qx2 = zero; - GridBase *grid = in._grid; - int site = 0 ; - grid->LocalIndexToLocalCoor(site, lcoor); - peekLocalSite(Qx2, *Clover, lcoor); - for (int j = 0; j < Ns; j++) - for (int k = 0; k < Ns; k++) - for (int a = 0; a < DimRep; a++) - for (int b = 0; b < DimRep; b++) - A(a + j * DimRep, b + k * DimRep) = Qx2()(j, k)(a, b); - std::cout << "adj Odd =" << site << "\n" << A << std::endl; - end test */ - - + if (dag) + { + if (in._grid->_isCheckerBoarded) + { + if (in.checkerboard == Odd) + { + Clover = (inv) ? &CloverTermInvDagOdd : &CloverTermDagOdd; + } + else + { + Clover = (inv) ? &CloverTermInvDagEven : &CloverTermDagEven; + } + out = *Clover * in; + } + else + { + Clover = (inv) ? &CloverTermInv : &CloverTerm; + out = adj(*Clover) * in; } - // std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; - out = *Clover * in; - } else { - Clover = (inv) ? &CloverTermInv : &CloverTerm; - //out = adj(*Clover) * in; - out = adj(CloverTerm) * in; } + else + { + if (in._grid->_isCheckerBoarded) + { - - - - } else { - if (in._grid->_isCheckerBoarded){ - - if (in.checkerboard == Odd){ - // std::cout << "Calling clover term Odd" << std::endl; - Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; - } else { - // std::cout << "Calling clover term Even" << std::endl; - Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; - } - out = *Clover * in; - // std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; - } else { - Clover = (inv) ? &CloverTermInv : &CloverTerm; - out = *Clover * in; + if (in.checkerboard == Odd) + { + // std::cout << "Calling clover term Odd" << std::endl; + Clover = (inv) ? &CloverTermInvOdd : &CloverTermOdd; + } + else + { + // std::cout << "Calling clover term Even" << std::endl; + Clover = (inv) ? &CloverTermInvEven : &CloverTermEven; + } + out = *Clover * in; + // std::cout << GridLogMessage << "*Clover.checkerboard " << (*Clover).checkerboard << std::endl; + } + else + { + Clover = (inv) ? &CloverTermInv : &CloverTerm; + out = *Clover * in; + } } - } } // MooeeInternal @@ -264,7 +226,6 @@ template void WilsonCloverFermion::MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) { - GaugeField tmp(mat._grid); conformable(U._grid, V._grid); @@ -282,30 +243,37 @@ void WilsonCloverFermion::MDeriv(GaugeField &mat, const FermionField &U, c template void WilsonCloverFermion::MooDeriv(GaugeField &mat, const FermionField &X, const FermionField &Y, int dag) { - -GridBase *grid = mat._grid; -//GaugeLinkField Lambdaodd(grid), Lambdaeven(grid), tmp(grid); -//Lambdaodd = zero; //Yodd*dag(Xodd)+Xodd*dag(Yodd); // I have to peek spin and decide the color structure -//Lambdaeven = zero; //Teven*dag(Xeven)+Xeven*dag(Yeven) + 2*(Dee^-1) + GridBase *grid = mat._grid; -GaugeLinkField Lambda(grid), tmp(grid); -Lambda=zero; + //GaugeLinkField Lambdaodd(grid), Lambdaeven(grid), tmp(grid); + //Lambdaodd = zero; //Yodd*dag(Xodd)+Xodd*dag(Yodd); // I have to peek spin and decide the color structure + //Lambdaeven = zero; //Teven*dag(Xeven)+Xeven*dag(Yeven) + 2*(Dee^-1) -conformable(mat._grid, X._grid); -conformable(Y._grid, X._grid); + GaugeLinkField Lambda(grid), tmp(grid); + Lambda = zero; -std::vector C1p(Nd,grid), C2p(Nd,grid), C3p(Nd,grid), C4p(Nd,grid); -std::vector C1m(Nd,grid), C2m(Nd,grid), C3m(Nd,grid), C4m(Nd,grid); -std::vector U(Nd, mat._grid); + conformable(mat._grid, X._grid); + conformable(Y._grid, X._grid); -for (int mu = 0; mu < Nd; mu++) { - U[mu] = PeekIndex(mat, mu); - C1p[mu]=zero; C2p[mu]=zero; C3p[mu]=zero; C4p[mu]=zero; - C1m[mu]=zero; C2m[mu]=zero; C3m[mu]=zero; C4m[mu]=zero; -} + std::vector C1p(Nd, grid), C2p(Nd, grid), C3p(Nd, grid), C4p(Nd, grid); + std::vector C1m(Nd, grid), C2m(Nd, grid), C3m(Nd, grid), C4m(Nd, grid); + std::vector U(Nd, mat._grid); -/* + for (int mu = 0; mu < Nd; mu++) + { + U[mu] = PeekIndex(mat, mu); + C1p[mu] = zero; + C2p[mu] = zero; + C3p[mu] = zero; + C4p[mu] = zero; + C1m[mu] = zero; + C2m[mu] = zero; + C3m[mu] = zero; + C4m[mu] = zero; + } + + /* PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { @@ -314,50 +282,49 @@ for (int mu = 0; mu < Nd; mu++) { T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); } -*/ +*/ -for (int i=0;i<4;i++){ //spin - for(int j=0;j<4;j++){ //spin + for (int i = 0; i < 4; i++) + { //spin + for (int j = 0; j < 4; j++) + { //spin -for (int mu=0;mu<4;mu++){ //color - for (int nu=0;nu<4;nu++){ //color + for (int mu = 0; mu < 4; mu++) + { //color + for (int nu = 0; nu < 4; nu++) + { //color -// insertion in upper staple - tmp = Lambda * U[nu]; - C1p[mu]+=Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); + // insertion in upper staple + tmp = Lambda * U[nu]; + C1p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - tmp = Lambda * U[mu]; - C2p[mu]+= Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); + tmp = Lambda * U[mu]; + C2p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - tmp = Impl::CovShiftIdentityForward(Lambda, nu) * U[nu]; - C3p[mu]+= Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu); - - tmp = Lambda; - C4p[mu]+= Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))),mu) * tmp; + tmp = Impl::CovShiftIdentityForward(Lambda, nu) * U[nu]; + C3p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu); -// insertion in lower staple - tmp = Lambda * U[nu]; - C1m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu); + tmp = Lambda; + C4p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu) * tmp; - tmp = Lambda * U[mu]; - C2m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, U[nu])), mu); + // insertion in lower staple + tmp = Lambda * U[nu]; + C1m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu); - tmp = Lambda * U[nu]; - C3m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu); + tmp = Lambda * U[mu]; + C2m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, U[nu])), mu); - tmp = Lambda; - C4m[mu]+= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu)* tmp; + tmp = Lambda * U[nu]; + C3m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu); + + tmp = Lambda; + C4m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu) * tmp; + } + } + } } -} - -} -} - -//Still implementing. Have to be tested, and understood how to project EO - - - + //Still implementing. Have to be tested, and understood how to project EO } // Derivative parts diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index 18386485..34482941 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -26,6 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ + #ifndef GRID_QCD_WILSON_CLOVER_FERMION_H #define GRID_QCD_WILSON_CLOVER_FERMION_H @@ -42,9 +43,11 @@ class WilsonCloverFermion : public WilsonFermion public: // Types definitions INHERIT_IMPL_TYPES(Impl); - template using iImplClover = iScalar, Ns> >; - typedef iImplClover SiteCloverType; - typedef Lattice CloverFieldType; + template + using iImplClover = iScalar, Ns>>; + typedef iImplClover SiteCloverType; + typedef Lattice CloverFieldType; + public: typedef WilsonFermion WilsonBase; @@ -58,19 +61,21 @@ public: Fgrid, Hgrid, _mass, p), - CloverTerm(&Fgrid), - CloverTermInv(&Fgrid), - CloverTermEven(&Hgrid), - CloverTermOdd(&Hgrid), - CloverTermInvEven(&Hgrid), - CloverTermInvOdd(&Hgrid), - CloverTermDagEven(&Hgrid), //test - CloverTermDagOdd(&Hgrid), //test - CloverTermInvDagEven(&Hgrid), //test - CloverTermInvDagOdd(&Hgrid) //test + CloverTerm(&Fgrid), + CloverTermInv(&Fgrid), + CloverTermEven(&Hgrid), + CloverTermOdd(&Hgrid), + CloverTermInvEven(&Hgrid), + CloverTermInvOdd(&Hgrid), + CloverTermDagEven(&Hgrid), + CloverTermDagOdd(&Hgrid), + CloverTermInvDagEven(&Hgrid), + CloverTermInvDagOdd(&Hgrid) { csw = _csw; assert(Nd == 4); // require 4 dimensions + + if (csw == 0) std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw = 0" << std::endl; } virtual RealD M(const FermionField &in, FermionField &out); @@ -91,12 +96,12 @@ public: private: // here fixing the 4 dimensions, make it more general? - RealD csw; // Clover coefficient - CloverFieldType CloverTerm=zero, CloverTermInv=zero; // Clover term - CloverFieldType CloverTermEven=zero, CloverTermOdd=zero; // Clover term EO - CloverFieldType CloverTermInvEven=zero, CloverTermInvOdd=zero; // Clover term Inv EO - CloverFieldType CloverTermDagEven=zero, CloverTermDagOdd=zero; // Clover term Dag EO - CloverFieldType CloverTermInvDagEven=zero, CloverTermInvDagOdd=zero; // Clover term Inv Dag EO + RealD csw; // Clover coefficient + CloverFieldType CloverTerm, CloverTermInv; // Clover term + CloverFieldType CloverTermEven, CloverTermOdd; // Clover term EO + CloverFieldType CloverTermInvEven, CloverTermInvOdd; // Clover term Inv EO + CloverFieldType CloverTermDagEven, CloverTermDagOdd; // Clover term Dag EO + CloverFieldType CloverTermInvDagEven, CloverTermInvDagOdd; // Clover term Inv Dag EO // eventually these two can be compressed into 6x6 blocks instead of the 12x12 // using the DeGrand-Rossi basis for the gamma matrices @@ -113,9 +118,9 @@ private: T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); } - - return T; -} + + return T; + } CloverFieldType fillCloverXZ(const GaugeLinkField &F) { @@ -129,9 +134,9 @@ private: T._odata[i]()(2, 3) = -F._odata[i]()(); T._odata[i]()(3, 2) = F._odata[i]()(); } - - return T; -} + + return T; + } CloverFieldType fillCloverXY(const GaugeLinkField &F) { @@ -145,9 +150,9 @@ private: T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); T._odata[i]()(3, 3) = timesI(F._odata[i]()()); } - - return T; -} + + return T; + } CloverFieldType fillCloverXT(const GaugeLinkField &F) { @@ -156,14 +161,14 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 1) = timesI(F._odata[i]()()); - T._odata[i]()(1, 0) = timesI(F._odata[i]()()); - T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); - T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); + T._odata[i]()(0, 1) = timesI(F._odata[i]()()); + T._odata[i]()(1, 0) = timesI(F._odata[i]()()); + T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); + T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); } - - return T; -} + + return T; + } CloverFieldType fillCloverYT(const GaugeLinkField &F) { @@ -172,14 +177,14 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 1) = -(F._odata[i]()()); - T._odata[i]()(1, 0) = (F._odata[i]()()); - T._odata[i]()(2, 3) = (F._odata[i]()()); - T._odata[i]()(3, 2) = -(F._odata[i]()()); + T._odata[i]()(0, 1) = -(F._odata[i]()()); + T._odata[i]()(1, 0) = (F._odata[i]()()); + T._odata[i]()(2, 3) = (F._odata[i]()()); + T._odata[i]()(3, 2) = -(F._odata[i]()()); } - - return T; -} + + return T; + } CloverFieldType fillCloverZT(const GaugeLinkField &F) { @@ -188,17 +193,16 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { - T._odata[i]()(0, 0) = timesI(F._odata[i]()()); - T._odata[i]()(1, 1) = timesMinusI(F._odata[i]()()); - T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); - T._odata[i]()(3, 3) = timesI(F._odata[i]()()); + T._odata[i]()(0, 0) = timesI(F._odata[i]()()); + T._odata[i]()(1, 1) = timesMinusI(F._odata[i]()()); + T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); + T._odata[i]()(3, 3) = timesI(F._odata[i]()()); } - - return T; -} + return T; + } }; } } -#endif // GRID_QCD_WILSON_CLOVER_FERMION_H +#endif // GRID_QCD_WILSON_CLOVER_FERMION_H diff --git a/tests/core/Test_wilson_clover.cc b/tests/core/Test_wilson_clover.cc index 9a5fffe2..9a55f6b2 100644 --- a/tests/core/Test_wilson_clover.cc +++ b/tests/core/Test_wilson_clover.cc @@ -237,7 +237,7 @@ int main (int argc, char ** argv) setCheckerboard(src,src_o); - //Gauge Transformation + ////////////////////// Gauge Transformation std::vector seeds2({5,6,7,8}); GridParallelRNG pRNG2(&Grid); pRNG2.SeedFixedIntegers(seeds2); LatticeColourMatrix Omega(&Grid); @@ -251,7 +251,7 @@ int main (int argc, char ** argv) U_prime_mu=Omega*U[mu]*adj(ShiftedOmega); pokeLorentz(U_prime,U_prime_mu,mu); } - + ///////////////// WilsonCloverFermionR Dwc_prime(U_prime,Grid,RBGrid,mass,csw,params); Dwc_prime.ImportGauge(U_prime); @@ -298,7 +298,7 @@ int main (int argc, char ** argv) std::cout< +#include +#include +#include // Mass -double mq = 0.0; +double mq = 0.01; // Define Wilson Types typedef Grid::QCD::WilsonImplR::FermionField FermionField; typedef Grid::QCD::LatticeGaugeField GaugeField; -#include -#include -#include - enum ChromaAction { Wilson, // Wilson WilsonClover // CloverFermions }; -void make_gauge(GaugeField &lat, FermionField &src); -void calc_grid(ChromaAction CA, GaugeField &lat, FermionField &src, FermionField &res, int dag); -void calc_chroma(ChromaAction CA, GaugeField &lat, FermionField &src, FermionField &res, int dag); - namespace Chroma { @@ -286,91 +281,6 @@ public: }; } // namespace Chroma -int main(int argc, char **argv) -{ - - /******************************************************** - * Setup QDP - *********************************************************/ - Chroma::initialize(&argc, &argv); - Chroma::WilsonTypeFermActs4DEnv::registerAll(); - - /******************************************************** - * Setup Grid - *********************************************************/ - Grid::Grid_init(&argc, &argv); - Grid::GridCartesian *UGrid = Grid::QCD::SpaceTimeGrid::makeFourDimGrid(Grid::GridDefaultLatt(), - Grid::GridDefaultSimd(Grid::QCD::Nd, Grid::vComplex::Nsimd()), - Grid::GridDefaultMpi()); - - std::vector gd = UGrid->GlobalDimensions(); - QDP::multi1d nrow(QDP::Nd); - for (int mu = 0; mu < 4; mu++) - nrow[mu] = gd[mu]; - - QDP::Layout::setLattSize(nrow); - QDP::Layout::create(); - - GaugeField Ug(UGrid); - FermionField src(UGrid); - FermionField res_chroma(UGrid); - FermionField res_grid(UGrid); - FermionField only_wilson(UGrid); - FermionField difference(UGrid); - - std::vector ActionList({Wilson, WilsonClover}); - std::vector ActionName({"Wilson", "WilsonClover"}); - - { - - for (int i = 0; i < ActionList.size(); i++) - { - std::cout << "*****************************" << std::endl; - std::cout << "Action " << ActionName[i] << std::endl; - std::cout << "*****************************" << std::endl; - make_gauge(Ug, src); // fills the gauge field and the fermion field with random numbers - - for (int dag = 0; dag < 2; dag++) - { - - { - - std::cout << "Dag = " << dag << std::endl; - - calc_chroma(ActionList[i], Ug, src, res_chroma, dag); - - // Remove the normalisation of Chroma Gauge links ???????? - std::cout << "Norm of Chroma " << ActionName[i] << " multiply " << Grid::norm2(res_chroma) << std::endl; - calc_grid(ActionList[i], Ug, src, res_grid, dag); - - std::cout << "Norm of gauge " << Grid::norm2(Ug) << std::endl; - - std::cout << "Norm of Grid " << ActionName[i] << " multiply " << Grid::norm2(res_grid) << std::endl; - - difference = res_chroma - res_grid; - std::cout << "Norm of difference " << Grid::norm2(difference) << std::endl; - - // Isolate Clover term - /* - calc_grid(Wilson, Ug, src, only_wilson, dag); // Wilson term - res_grid -= only_wilson; - res_chroma -= only_wilson; - - std::cout << "Chroma:" << res_chroma << std::endl; - std::cout << "Grid :" << res_grid << std::endl; - difference = (res_grid-res_chroma); - std::cout << "Difference :" << difference << std::endl; - */ - } - } - - std::cout << "Finished test " << std::endl; - - Chroma::finalize(); - } - } -} - void calc_chroma(ChromaAction action, GaugeField &lat, FermionField &src, FermionField &res, int dag) { QDP::multi1d u(4); @@ -467,7 +377,6 @@ void make_gauge(GaugeField &Umu, FermionField &src) } } */ - } void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD::LatticeFermion &src, Grid::QCD::LatticeFermion &res, int dag) @@ -512,3 +421,76 @@ void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD assert(0); } + +int main(int argc, char **argv) +{ + + /******************************************************** + * Setup QDP + *********************************************************/ + Chroma::initialize(&argc, &argv); + Chroma::WilsonTypeFermActs4DEnv::registerAll(); + + /******************************************************** + * Setup Grid + *********************************************************/ + Grid::Grid_init(&argc, &argv); + Grid::GridCartesian *UGrid = Grid::QCD::SpaceTimeGrid::makeFourDimGrid(Grid::GridDefaultLatt(), + Grid::GridDefaultSimd(Grid::QCD::Nd, Grid::vComplex::Nsimd()), + Grid::GridDefaultMpi()); + + std::vector gd = UGrid->GlobalDimensions(); + QDP::multi1d nrow(QDP::Nd); + for (int mu = 0; mu < 4; mu++) + nrow[mu] = gd[mu]; + + QDP::Layout::setLattSize(nrow); + QDP::Layout::create(); + + GaugeField Ug(UGrid); + FermionField src(UGrid); + FermionField res_chroma(UGrid); + FermionField res_grid(UGrid); + FermionField only_wilson(UGrid); + FermionField difference(UGrid); + + std::vector ActionList({Wilson, WilsonClover}); + std::vector ActionName({"Wilson", "WilsonClover"}); + + { + + for (int i = 0; i < ActionList.size(); i++) + { + std::cout << "*****************************" << std::endl; + std::cout << "Action " << ActionName[i] << std::endl; + std::cout << "*****************************" << std::endl; + make_gauge(Ug, src); // fills the gauge field and the fermion field with random numbers + + for (int dag = 0; dag < 2; dag++) + { + + { + + std::cout << "Dag = " << dag << std::endl; + + calc_chroma(ActionList[i], Ug, src, res_chroma, dag); + + // Remove the normalisation of Chroma Gauge links ???????? + std::cout << "Norm of Chroma " << ActionName[i] << " multiply " << Grid::norm2(res_chroma) << std::endl; + calc_grid(ActionList[i], Ug, src, res_grid, dag); + + std::cout << "Norm of gauge " << Grid::norm2(Ug) << std::endl; + + std::cout << "Norm of Grid " << ActionName[i] << " multiply " << Grid::norm2(res_grid) << std::endl; + + difference = res_chroma - res_grid; + std::cout << "Norm of difference " << Grid::norm2(difference) << std::endl; + } + } + + std::cout << "Finished test " << std::endl; + + Chroma::finalize(); + } + } +} From 657779374be6b8e02ce8eb6452316acc310fdf26 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 24 Oct 2017 13:27:17 +0100 Subject: [PATCH 061/620] Adding vscode to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6b92b1a4..8eccbc7d 100644 --- a/.gitignore +++ b/.gitignore @@ -123,5 +123,6 @@ make-bin-BUCK.sh lib/qcd/spin/gamma-gen/*.h lib/qcd/spin/gamma-gen/*.cc +.vscode/ .vscode/settings.json settings.json From 2986aa76f80f2857d846c0e48f508de8299052a3 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 24 Oct 2017 13:32:02 +0100 Subject: [PATCH 062/620] Restoring Perfcounts --- lib/perfmon/PerfCount.h | 3 +-- lib/perfmon/Stat.cc | 30 ++++++++++++++---------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/lib/perfmon/PerfCount.h b/lib/perfmon/PerfCount.h index cb27c283..73d2c70f 100644 --- a/lib/perfmon/PerfCount.h +++ b/lib/perfmon/PerfCount.h @@ -90,10 +90,9 @@ inline uint64_t cyclecount(void){ } #elif defined __x86_64__ inline uint64_t cyclecount(void){ - //return __rdtsc(); + return __rdtsc(); // unsigned int dummy; // return __rdtscp(&dummy); -return 0; // <- remove this; } #else diff --git a/lib/perfmon/Stat.cc b/lib/perfmon/Stat.cc index 75679412..3f47fd83 100644 --- a/lib/perfmon/Stat.cc +++ b/lib/perfmon/Stat.cc @@ -57,37 +57,35 @@ void PmuStat::start(void) pmu_start(); ++count; xmemctrs(&mrstart, &mwstart); - //tstart = __rdtsc(); -tstart=0; + tstart = __rdtsc(); #endif } void PmuStat::enter(int t) { #ifdef __x86_64__ - counters[0][t] = 0;//__rdpmc(0); - counters[1][t] = 0;//__rdpmc(1); - counters[2][t] = 0;//__rdpmc((1<<30)|0); - counters[3][t] = 0;//__rdpmc((1<<30)|1); - counters[4][t] = 0;//__rdpmc((1<<30)|2); - counters[5][t] = 0;//__rdtsc(); + counters[0][t] = __rdpmc(0); + counters[1][t] = __rdpmc(1); + counters[2][t] = __rdpmc((1<<30)|0); + counters[3][t] = __rdpmc((1<<30)|1); + counters[4][t] = __rdpmc((1<<30)|2); + counters[5][t] = __rdtsc(); #endif } void PmuStat::exit(int t) { #ifdef __x86_64__ - counters[0][t] = 0;//__rdpmc(0) - counters[0][t]; - counters[1][t] = 0;// __rdpmc(1) - counters[1][t]; - counters[2][t] = 0;// __rdpmc((1<<30)|0) - counters[2][t]; - counters[3][t] = 0;// __rdpmc((1<<30)|1) - counters[3][t]; - counters[4][t] = 0;// __rdpmc((1<<30)|2) - counters[4][t]; - counters[5][t] = 0;// __rdtsc() - counters[5][t]; + counters[0][t] = __rdpmc(0) - counters[0][t]; + counters[1][t] = __rdpmc(1) - counters[1][t]; + counters[2][t] = __rdpmc((1<<30)|0) - counters[2][t]; + counters[3][t] = __rdpmc((1<<30)|1) - counters[3][t]; + counters[4][t] = __rdpmc((1<<30)|2) - counters[4][t]; + counters[5][t] = __rdtsc() - counters[5][t]; #endif } void PmuStat::accum(int nthreads) { #ifdef __x86_64__ - // tend = __rdtsc(); - tend =0 ; + tend = __rdtsc(); xmemctrs(&mrend, &mwend); pmu_stop(); for (int t = 0; t < nthreads; ++t) { From 91b8bf061323e5aeb73f84c41345a07447a90e47 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 26 Oct 2017 18:23:55 +0100 Subject: [PATCH 063/620] Debugging force term --- lib/qcd/action/fermion/FermionOperatorImpl.h | 52 ++++- lib/qcd/action/fermion/WilsonCloverFermion.cc | 30 +-- lib/qcd/action/fermion/WilsonCloverFermion.h | 128 ++++++++++- tests/forces/Test_wilson_force.cc | 7 +- tests/forces/Test_wilsonclover_force.cc | 209 ++++++++++++++++++ 5 files changed, 395 insertions(+), 31 deletions(-) create mode 100644 tests/forces/Test_wilsonclover_force.cc diff --git a/lib/qcd/action/fermion/FermionOperatorImpl.h b/lib/qcd/action/fermion/FermionOperatorImpl.h index 9d24deb2..89bd9a15 100644 --- a/lib/qcd/action/fermion/FermionOperatorImpl.h +++ b/lib/qcd/action/fermion/FermionOperatorImpl.h @@ -254,8 +254,22 @@ namespace QCD { GaugeLinkField link(mat._grid); link = TraceIndex(outerProduct(Btilde,A)); PokeIndex(mat,link,mu); - } + } + + inline void outerProductImpl(PropagatorField &mat, const FermionField &B, const FermionField &A){ + mat = outerProduct(B,A); + } + + inline void TraceSpinImpl(GaugeLinkField &mat, PropagatorField&P) { + mat = TraceIndex(P); + } + inline void extractLinkField(std::vector &mat, DoubledGaugeField &Uds){ + for (int mu = 0; mu < Nd; mu++) + mat[mu] = PeekIndex(Uds, mu); + } + + inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã,int mu){ int Ls=Btilde._grid->_fdimensions[0]; @@ -373,6 +387,19 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres assert(0); } + inline void outerProductImpl(PropagatorField &mat, const FermionField &Btilde, const FermionField &A){ + assert(0); + } + + inline void TraceSpinImpl(GaugeLinkField &mat, PropagatorField&P) { + assert(0); + } + + inline void extractLinkField(std::vector &mat, DoubledGaugeField &Uds){ + assert(0); + } + + inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã, int mu) { assert(0); @@ -611,6 +638,25 @@ class GparityWilsonImpl : public ConjugateGaugeImpl(P); + parallel_for(auto ss = tmp.begin(); ss < tmp.end(); ss++) { + mat[ss]() = tmp[ss](0, 0) + conjugate(tmp[ss](1, 1)); + } + */ + } + + inline void extractLinkField(std::vector &mat, DoubledGaugeField &Uds){ + assert(0); + } + inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã, int mu) { int Ls = Btilde._grid->_fdimensions[0]; @@ -751,8 +797,8 @@ class StaggeredImpl : public PeriodicGaugeImpl(outerProduct(Btilde,A)); PokeIndex(mat,link,mu); - } - + } + inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã,int mu){ assert (0); // Must never hit diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 1dd12f52..2159fffc 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -43,11 +43,15 @@ RealD WilsonCloverFermion::M(const FermionField &in, FermionField &out) // Wilson term out.checkerboard = in.checkerboard; - this->Dhop(in, out, DaggerNo); + //this->Dhop(in, out, DaggerNo); // Clover term Mooee(in, temp); + //hack + out = zero; + + out += temp; return norm2(out); } @@ -59,11 +63,14 @@ RealD WilsonCloverFermion::Mdag(const FermionField &in, FermionField &out) // Wilson term out.checkerboard = in.checkerboard; - this->Dhop(in, out, DaggerYes); + //this->Dhop(in, out, DaggerYes); // Clover term MooeeDag(in, temp); + //hack + out = zero; + out += temp; return norm2(out); } @@ -84,7 +91,7 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); // Compute the Clover Operator acting on Colour and Spin - CloverTerm = fillCloverYZ(Bx); + CloverTerm = fillCloverYZ(Bx); CloverTerm += fillCloverXZ(By); CloverTerm += fillCloverXY(Bz); CloverTerm += fillCloverXT(Ex); @@ -223,23 +230,6 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie } // MooeeInternal -// Derivative parts -template -void WilsonCloverFermion::MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) -{ - - GaugeField tmp(mat._grid); - - conformable(U._grid, V._grid); - conformable(U._grid, mat._grid); - - mat.checkerboard = U.checkerboard; - tmp.checkerboard = U.checkerboard; - - this->DhopDeriv(mat, U, V, dag); - MooDeriv(tmp, U, V, dag); - mat += tmp; -} // Derivative parts template diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index 34482941..d8a42129 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -67,15 +67,18 @@ public: CloverTermOdd(&Hgrid), CloverTermInvEven(&Hgrid), CloverTermInvOdd(&Hgrid), - CloverTermDagEven(&Hgrid), - CloverTermDagOdd(&Hgrid), - CloverTermInvDagEven(&Hgrid), - CloverTermInvDagOdd(&Hgrid) + CloverTermDagEven(&Hgrid), + CloverTermDagOdd(&Hgrid), + CloverTermInvDagEven(&Hgrid), + CloverTermInvDagOdd(&Hgrid) { csw = _csw; assert(Nd == 4); // require 4 dimensions - if (csw == 0) std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw = 0" << std::endl; + if (csw == 0) + std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw = 0" << std::endl; + + ImportGauge(_Umu); } virtual RealD M(const FermionField &in, FermionField &out); @@ -87,16 +90,127 @@ public: virtual void MooeeInvDag(const FermionField &in, FermionField &out); virtual void MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv); - virtual void MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag); + //virtual void MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag); virtual void MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag); virtual void MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag); void ImportGauge(const GaugeField &_Umu); + // Derivative parts unpreconditioned pseudofermions + void MDeriv(GaugeField &force, const FermionField &X, const FermionField &Y, int dag) + { + conformable(X._grid, Y._grid); + conformable(X._grid, force._grid); + GaugeLinkField force_mu(force._grid), lambda(force._grid); + GaugeField clover_force(force._grid); + PropagatorField Lambda(force._grid); + + // Here we are hitting some performance issues: + // need to extract the components of the DoubledGaugeField + // for each call + // Possible solution + // Create a vector object to store them? (cons: wasting space) + std::vector U(Nd, this->Umu._grid); + + Impl::extractLinkField(U, this->Umu); + + force = zero; + // Derivative of the Wilson hopping term + //this->DhopDeriv(force, X, Y, dag); + + /////////////////////////////////////////////////////////// + // Clover term derivative + /////////////////////////////////////////////////////////// + Impl::outerProductImpl(Lambda, X, Y); + + Gamma::Algebra sigma[] = { + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::MinusSigmaXY, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::MinusSigmaXZ, + Gamma::Algebra::MinusSigmaYZ, + Gamma::Algebra::SigmaZT, + Gamma::Algebra::MinusSigmaXT, + Gamma::Algebra::MinusSigmaYT, + Gamma::Algebra::MinusSigmaZT}; + + /* + sigma_{\mu \nu}= + | 0 sigma[0] sigma[1] sigma[2] | + | sigma[3] 0 sigma[4] sigma[5] | + | sigma[6] sigma[7] 0 sigma[8] | + | sigma[9] sigma[10] sigma[11] 0 | + */ + + int count = 0; + clover_force = zero; + for (int mu = 0; mu < 4; mu++) + { + force_mu = zero; + for (int nu = 0; nu < 4; nu++) + { + if (mu == nu) continue; + PropagatorField Slambda = Gamma(sigma[count]) * Lambda; + Impl::TraceSpinImpl(lambda, Slambda); //traceSpin + force_mu += Cmunu(U, lambda, mu, nu); + count++; + } + + pokeLorentz(clover_force, U[mu] * force_mu, mu); + } + clover_force *= csw / 8.; + force += clover_force; + } + + // Computing C_{\mu \nu}(x) as in Eq.(B.39) in Zbigniew Sroczynski's PhD thesis + GaugeLinkField Cmunu(std::vector &U, GaugeLinkField &lambda, int mu, int nu) + { + conformable(lambda._grid, U[0]._grid); + GaugeLinkField out(lambda._grid), tmp(lambda._grid); + + // insertion in upper staple + // please check redundancy of shift operations + + // C1+ + tmp = lambda * U[nu]; + out = Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); + + // C2+ + tmp = U[mu] * Impl::CovShiftIdentityForward(adj(lambda), mu); + out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); + + // C3+ + tmp = U[nu] * Impl::CovShiftIdentityForward(adj(lambda), nu); + out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu); + + // C4+ + out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu) * lambda; + + // insertion in lower staple + // C1- + out -= Impl::ShiftStaple(lambda, mu) * Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu); + + // C2- + tmp = adj(lambda) * U[nu]; + out -= Impl::ShiftStaple(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu); + + // C3- + tmp = lambda * U[nu]; + out -= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu); + + // C4- + out -= Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu) * lambda; + + return out; + } + private: // here fixing the 4 dimensions, make it more general? - RealD csw; // Clover coefficient + RealD csw; // Clover coefficient CloverFieldType CloverTerm, CloverTermInv; // Clover term CloverFieldType CloverTermEven, CloverTermOdd; // Clover term EO CloverFieldType CloverTermInvEven, CloverTermInvOdd; // Clover term Inv EO diff --git a/tests/forces/Test_wilson_force.cc b/tests/forces/Test_wilson_force.cc index 1f34a48a..f834726b 100644 --- a/tests/forces/Test_wilson_force.cc +++ b/tests/forces/Test_wilson_force.cc @@ -50,7 +50,12 @@ int main (int argc, char ** argv) std::vector seeds({1,2,3,4}); GridParallelRNG pRNG(&Grid); - pRNG.SeedFixedIntegers(std::vector({45,12,81,9})); + std::vector vrand(4); + std::srand(std::time(0)); + std::generate(vrand.begin(), vrand.end(), std::rand); + std::cout << GridLogMessage << vrand << std::endl; + pRNG.SeedFixedIntegers(vrand); + //pRNG.SeedFixedIntegers(std::vector({45,12,81,9})); LatticeFermion phi (&Grid); gaussian(pRNG,phi); LatticeFermion Mphi (&Grid); diff --git a/tests/forces/Test_wilsonclover_force.cc b/tests/forces/Test_wilsonclover_force.cc new file mode 100644 index 00000000..c99cfa98 --- /dev/null +++ b/tests/forces/Test_wilsonclover_force.cc @@ -0,0 +1,209 @@ +/************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_wilson_force.cc + + Copyright (C) 2015 + +Author: Peter Boyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ +/* END LEGAL */ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main(int argc, char **argv) +{ + Grid_init(&argc, &argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd, vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + GridCartesian Grid(latt_size, simd_layout, mpi_layout); + GridRedBlackCartesian RBGrid(&Grid); + + int threads = GridThread::GetThreads(); + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + std::vector seeds({1, 2, 3, 4}); + + GridParallelRNG pRNG(&Grid); + std::vector vrand(4); + std::srand(std::time(0)); + std::generate(vrand.begin(), vrand.end(), std::rand); + std::cout << GridLogMessage << vrand << std::endl; + pRNG.SeedFixedIntegers(vrand); + + LatticeFermion phi(&Grid); + gaussian(pRNG, phi); + LatticeFermion Mphi(&Grid); + LatticeFermion MphiPrime(&Grid); + + LatticeGaugeField U(&Grid); + + SU3::HotConfiguration(pRNG,U); + //SU3::ColdConfiguration(pRNG, U); + + //////////////////////////////////// + // Unmodified matrix element + //////////////////////////////////// + RealD mass = -4.0; //kills the diagonal term + Real csw = 1.0; + WilsonCloverFermionR Dw(U, Grid, RBGrid, mass, csw); + + Dw.M(phi, Mphi); + ComplexD S = innerProduct(Mphi, Mphi); // Action : pdag MdagM p + + // get the deriv of phidag MdagM phi with respect to "U" + LatticeGaugeField UdSdU(&Grid); + LatticeGaugeField tmp(&Grid); + + Dw.MDeriv(tmp, Mphi, phi, DaggerNo); UdSdU = tmp; + Dw.MDeriv(tmp, phi, Mphi, DaggerYes); UdSdU += tmp; + // Take the traceless antihermitian component + UdSdU = Ta(UdSdU); + + //////////////////////////////////// + // Modify the gauge field a little + //////////////////////////////////// + RealD dt = 0.0001; + RealD Hmom = 0.0; + RealD Hmomprime = 0.0; + RealD Hmompp = 0.0; + LatticeColourMatrix mommu(&Grid); + LatticeColourMatrix forcemu(&Grid); + LatticeGaugeField mom(&Grid); + LatticeGaugeField Uprime(&Grid); + + for (int mu = 0; mu < Nd; mu++) { + // Traceless antihermitian momentum; gaussian in lie alg + SU3::GaussianFundamentalLieAlgebraMatrix(pRNG, mommu); + Hmom -= real(sum(trace(mommu * mommu))); + PokeIndex(mom, mommu, mu); + } + + parallel_for(int ss=0;ssoSites();ss++){ + for (int mu = 0; mu < Nd; mu++) + Uprime[ss]._internal[mu] = ProjectOnGroup(Exponentiate(mom[ss]._internal[mu], dt, 12) * U[ss]._internal[mu]); + } + + std::cout << GridLogMessage << "Initial mom hamiltonian is " << Hmom << std::endl; + + // New action + Dw.ImportGauge(Uprime); + Dw.M(phi, MphiPrime); + + ComplexD Sprime = innerProduct(MphiPrime, MphiPrime); + + ////////////////////////////////////////////// + // Use derivative to estimate dS + ////////////////////////////////////////////// + + /////////////////////////////////////////////////////// + std::cout << GridLogMessage << "Antihermiticity tests - 1 " << std::endl; + for (int mu = 0; mu < Nd; mu++) + { + mommu = PeekIndex(mom, mu); + std::cout << GridLogMessage << " Mommu " << norm2(mommu) << std::endl; + mommu = mommu + adj(mommu); + std::cout << GridLogMessage << " Test: Mommu + Mommudag " << norm2(mommu) << std::endl; + mommu = PeekIndex(UdSdU, mu); + std::cout << GridLogMessage << " dsdumu " << norm2(mommu) << std::endl; + mommu = mommu + adj(mommu); + std::cout << GridLogMessage << " Test: dsdumu + dag " << norm2(mommu) << std::endl; + std::cout << "" << std::endl; + } + //////////////////////////////////////////////////////// + + LatticeComplex dS(&Grid); + dS = zero; + LatticeComplex dSmom(&Grid); + dSmom = zero; + LatticeComplex dSmom2(&Grid); + dSmom2 = zero; + + + // need for this??? + // ultimately it is just a 2.0 factor in UdSdU + for (int mu = 0; mu < Nd; mu++) + { + mommu = PeekIndex(UdSdU, mu); // P_mu = + mommu = Ta(mommu) * 2.0; // Mom = (P_mu - P_mu^dag) - trace(P_mu - P_mu^dag) + PokeIndex(UdSdU, mommu, mu); // UdSdU_mu = Mom + } + + std::cout << GridLogMessage<< "Antihermiticity tests - 2 " << std::endl; + for (int mu = 0; mu < Nd; mu++) + { + mommu = PeekIndex(mom, mu); + std::cout << GridLogMessage << " Mommu " << norm2(mommu) << std::endl; + mommu = mommu + adj(mommu); + std::cout << GridLogMessage << " Mommu + Mommudag " << norm2(mommu) << std::endl; + mommu = PeekIndex(UdSdU, mu); + std::cout << GridLogMessage << " dsdumu " << norm2(mommu) << std::endl; + mommu = mommu + adj(mommu); + std::cout << GridLogMessage << " dsdumu + dag " << norm2(mommu) << std::endl; + std::cout << "" << std::endl; + } + ///////////////////////////////////////////////////// + + + for (int mu = 0; mu < Nd; mu++) + { + forcemu = PeekIndex(UdSdU, mu); + mommu = PeekIndex(mom, mu); + + // Update PF action density + dS = dS + trace(mommu * forcemu) * dt; + + dSmom = dSmom - trace(mommu * forcemu) * dt; + dSmom2 = dSmom2 - trace(forcemu * forcemu) * (0.25 * dt * dt); + + // Update mom action density + mommu = mommu + forcemu * (dt * 0.5); + + Hmomprime -= real(sum(trace(mommu * mommu))); + } + + ComplexD dSpred = sum(dS); + ComplexD dSm = sum(dSmom); + ComplexD dSm2 = sum(dSmom2); + + std::cout << GridLogMessage << "Initial mom hamiltonian is " << Hmom << std::endl; + std::cout << GridLogMessage << "Final mom hamiltonian is " << Hmomprime << std::endl; + std::cout << GridLogMessage << "Delta mom hamiltonian is " << Hmomprime - Hmom << std::endl; + + std::cout << GridLogMessage << " S " << S << std::endl; + std::cout << GridLogMessage << " Sprime " << Sprime << std::endl; + std::cout << GridLogMessage << "dS " << Sprime - S << std::endl; + std::cout << GridLogMessage << "predict dS " << dSpred << std::endl; + std::cout << GridLogMessage << "dSm " << dSm << std::endl; + std::cout << GridLogMessage << "dSm2" << dSm2 << std::endl; + + std::cout << GridLogMessage << "Total dS " << Hmomprime - Hmom + Sprime - S << std::endl; + + assert(fabs(real(Sprime - S - dSpred)) < 1.0); + + std::cout << GridLogMessage << "Done" << std::endl; + Grid_finalize(); +} From 76bcf6cd8c767b0f3a254b3407b951cdf0782d6d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 26 Oct 2017 18:45:41 +0100 Subject: [PATCH 064/620] Deleting vscode settings file --- .vscode/settings.json | 51 ------------------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index f13d503b..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,51 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.associations": { - "cctype": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "csignal": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "array": "cpp", - "atomic": "cpp", - "*.tcc": "cpp", - "chrono": "cpp", - "codecvt": "cpp", - "condition_variable": "cpp", - "cstdint": "cpp", - "exception": "cpp", - "slist": "cpp", - "functional": "cpp", - "initializer_list": "cpp", - "iosfwd": "cpp", - "limits": "cpp", - "memory": "cpp", - "mutex": "cpp", - "new": "cpp", - "ratio": "cpp", - "stdexcept": "cpp", - "system_error": "cpp", - "thread": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "typeinfo": "cpp", - "utility": "cpp", - "iostream": "cpp", - "strstream": "cpp", - "complex": "cpp", - "fstream": "cpp", - "iomanip": "cpp", - "istream": "cpp", - "ostream": "cpp", - "sstream": "cpp", - "streambuf": "cpp", - "algorithm": "cpp" - } -} \ No newline at end of file From f941c4ee180aa20b3f3a24a939018357457e5bbf Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Sun, 29 Oct 2017 11:43:33 +0000 Subject: [PATCH 065/620] Clover term force ok --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 9 +- lib/qcd/action/fermion/WilsonCloverFermion.h | 24 ++-- lib/qcd/utils/WilsonLoops.h | 2 +- tests/forces/Test_wilsonclover_force.cc | 118 +++++++++++++++--- 4 files changed, 118 insertions(+), 35 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 2159fffc..e678835a 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -48,10 +48,7 @@ RealD WilsonCloverFermion::M(const FermionField &in, FermionField &out) // Clover term Mooee(in, temp); - //hack - out = zero; - - + out= zero; out += temp; return norm2(out); } @@ -68,9 +65,7 @@ RealD WilsonCloverFermion::Mdag(const FermionField &in, FermionField &out) // Clover term MooeeDag(in, temp); - //hack - out = zero; - + out=zero; out += temp; return norm2(out); } diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index d8a42129..402a9a7e 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -122,6 +122,8 @@ public: // Clover term derivative /////////////////////////////////////////////////////////// Impl::outerProductImpl(Lambda, X, Y); + //std::cout << "Lambda:" << Lambda << std::endl; + Gamma::Algebra sigma[] = { Gamma::Algebra::SigmaXY, @@ -153,16 +155,18 @@ public: for (int nu = 0; nu < 4; nu++) { if (mu == nu) continue; - PropagatorField Slambda = Gamma(sigma[count]) * Lambda; - Impl::TraceSpinImpl(lambda, Slambda); //traceSpin - force_mu += Cmunu(U, lambda, mu, nu); + PropagatorField Slambda = Gamma(sigma[count]) * Lambda; // sigma checked + Impl::TraceSpinImpl(lambda, Slambda); // traceSpin ok + force_mu -= Cmunu(U, lambda, mu, nu); // checked count++; } pokeLorentz(clover_force, U[mu] * force_mu, mu); } - clover_force *= csw / 8.; + clover_force *= csw; force += clover_force; + + } // Computing C_{\mu \nu}(x) as in Eq.(B.39) in Zbigniew Sroczynski's PhD thesis @@ -170,20 +174,19 @@ public: { conformable(lambda._grid, U[0]._grid); GaugeLinkField out(lambda._grid), tmp(lambda._grid); - // insertion in upper staple // please check redundancy of shift operations - + // C1+ tmp = lambda * U[nu]; out = Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - + // C2+ - tmp = U[mu] * Impl::CovShiftIdentityForward(adj(lambda), mu); + tmp = U[mu] * Impl::ShiftStaple(adj(lambda), mu); out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - + // C3+ - tmp = U[nu] * Impl::CovShiftIdentityForward(adj(lambda), nu); + tmp = U[nu] * Impl::ShiftStaple(adj(lambda), nu); out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu); // C4+ @@ -259,6 +262,7 @@ private: PARALLEL_FOR_LOOP for (int i = 0; i < CloverTerm._grid->oSites(); i++) { + T._odata[i]()(0, 0) = timesMinusI(F._odata[i]()()); T._odata[i]()(1, 1) = timesI(F._odata[i]()()); T._odata[i]()(2, 2) = timesMinusI(F._odata[i]()()); diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index fe813298..86609ffc 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -327,7 +327,7 @@ static void StapleMult(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { static void FieldStrength(GaugeMat &FS, const GaugeLorentz &Umu, int mu, int nu){ // Fmn +--<--+ Ut +--<--+ // | | | | - // (x)+-->--+ +-->--+(x) + // (x)+-->--+ +-->--+(x) - h.c. // | | | | // +--<--+ +--<--+ diff --git a/tests/forces/Test_wilsonclover_force.cc b/tests/forces/Test_wilsonclover_force.cc index c99cfa98..82adb8ab 100644 --- a/tests/forces/Test_wilsonclover_force.cc +++ b/tests/forces/Test_wilsonclover_force.cc @@ -1,6 +1,6 @@ /************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid + Grid physics library, www.github.com/paboyle/Grid Source file: ./tests/Test_wilson_force.cc @@ -45,14 +45,17 @@ int main(int argc, char **argv) int threads = GridThread::GetThreads(); std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; - std::vector seeds({1, 2, 3, 4}); + std::vector seeds({1, 2, 30, 50}); GridParallelRNG pRNG(&Grid); + std::vector vrand(4); std::srand(std::time(0)); std::generate(vrand.begin(), vrand.end(), std::rand); std::cout << GridLogMessage << vrand << std::endl; pRNG.SeedFixedIntegers(vrand); + + //pRNG.SeedFixedIntegers(seeds); LatticeFermion phi(&Grid); gaussian(pRNG, phi); @@ -61,16 +64,53 @@ int main(int argc, char **argv) LatticeGaugeField U(&Grid); - SU3::HotConfiguration(pRNG,U); +/* + std::vector x(4); // 4d fermions + std::vector gd = Grid.GlobalDimensions(); + Grid::QCD::SpinColourVector F; + Grid::Complex c; + + phi = zero; + for (x[0] = 0; x[0] < 1; x[0]++) + { + for (x[1] = 0; x[1] < 1; x[1]++) + { + for (x[2] = 0; x[2] < 1; x[2]++) + { + for (x[3] = 0; x[3] < 1; x[3]++) + { + for (int sp = 0; sp < 4; sp++) + { + for (int j = 0; j < 3; j++) // colours + { + F()(sp)(j) = Grid::Complex(0.0,0.0); + if (((sp == 0) && (j==0))) + { + c = Grid::Complex(1.0, 0.0); + F()(sp)(j) = c; + } + } + } + Grid::pokeSite(F, phi, x); + + } + } + } + } +*/ + + std::vector site = {0, 0, 0, 0}; + SU3::HotConfiguration(pRNG, U); //SU3::ColdConfiguration(pRNG, U); + //////////////////////////////////// // Unmodified matrix element //////////////////////////////////// RealD mass = -4.0; //kills the diagonal term Real csw = 1.0; WilsonCloverFermionR Dw(U, Grid, RBGrid, mass, csw); - + Dw.ImportGauge(U); Dw.M(phi, Mphi); ComplexD S = innerProduct(Mphi, Mphi); // Action : pdag MdagM p @@ -78,11 +118,23 @@ int main(int argc, char **argv) LatticeGaugeField UdSdU(&Grid); LatticeGaugeField tmp(&Grid); - Dw.MDeriv(tmp, Mphi, phi, DaggerNo); UdSdU = tmp; - Dw.MDeriv(tmp, phi, Mphi, DaggerYes); UdSdU += tmp; + //////////////////////////////////////////// + Dw.MDeriv(tmp, Mphi, phi, DaggerNo); + UdSdU = tmp; + Dw.MDeriv(tmp, phi, Mphi, DaggerYes); + UdSdU += tmp; + ///////////////////////////////////////////// + // Take the traceless antihermitian component - UdSdU = Ta(UdSdU); - + //UdSdU = Ta(UdSdU); + + //std::cout << UdSdU << std::endl; + //SU3::LatticeAlgebraVector hforce(&Grid); + LatticeColourMatrix mommu(&Grid); + //mommu = PeekIndex(UdSdU, 0); + //SU3::projectOnAlgebra(hforce, mommu); + //std::cout << hforce << std::endl; + //////////////////////////////////// // Modify the gauge field a little //////////////////////////////////// @@ -90,28 +142,63 @@ int main(int argc, char **argv) RealD Hmom = 0.0; RealD Hmomprime = 0.0; RealD Hmompp = 0.0; - LatticeColourMatrix mommu(&Grid); LatticeColourMatrix forcemu(&Grid); LatticeGaugeField mom(&Grid); LatticeGaugeField Uprime(&Grid); + for (int mu = 0; mu < Nd; mu++) { // Traceless antihermitian momentum; gaussian in lie alg SU3::GaussianFundamentalLieAlgebraMatrix(pRNG, mommu); Hmom -= real(sum(trace(mommu * mommu))); PokeIndex(mom, mommu, mu); } + /* + SU3::AlgebraVector h; + SU3::LatticeAlgebraVector hl(&Grid); + h()()(0) = 1.0; + hl = zero; + pokeSite(h, hl, site); + SU3::FundamentalLieAlgebraMatrix(hl, mommu); + mom = zero; + PokeIndex(mom, mommu, 0); + Hmom -= real(sum(trace(mommu * mommu))); + */ + /* parallel_for(int ss=0;ssoSites();ss++){ - for (int mu = 0; mu < Nd; mu++) + for (int mu = 0; mu < Nd; mu++) Uprime[ss]._internal[mu] = ProjectOnGroup(Exponentiate(mom[ss]._internal[mu], dt, 12) * U[ss]._internal[mu]); - } + } +*/ + + for (int mu = 0; mu < Nd; mu++) + { + parallel_for(auto i = mom.begin(); i < mom.end(); i++) + { + Uprime[i](mu) = U[i](mu); + Uprime[i](mu) += mom[i](mu) * U[i](mu) * dt; + Uprime[i](mu) += mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt / 2.0); + Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt / 6.0); + Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt * dt / 24.0); + Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt * dt * dt / 120.0); + Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt * dt * dt * dt / 720.0); + } + } std::cout << GridLogMessage << "Initial mom hamiltonian is " << Hmom << std::endl; - + // New action + LatticeGaugeField diff(&Grid); + diff = Uprime - U; + //std::cout << "Diff:" << diff << std::endl; Dw.ImportGauge(Uprime); Dw.M(phi, MphiPrime); + LatticeFermion DiffFermion(&Grid); + DiffFermion = MphiPrime - Mphi; + //std::cout << "DiffFermion:" << DiffFermion << std::endl; + //std::cout << "Mphi:" << Mphi << std::endl; + //std::cout << "MphiPrime:" << MphiPrime << std::endl; ComplexD Sprime = innerProduct(MphiPrime, MphiPrime); @@ -143,16 +230,14 @@ int main(int argc, char **argv) dSmom2 = zero; - // need for this??? - // ultimately it is just a 2.0 factor in UdSdU for (int mu = 0; mu < Nd; mu++) { - mommu = PeekIndex(UdSdU, mu); // P_mu = + mommu = PeekIndex(UdSdU, mu); // P_mu = mommu = Ta(mommu) * 2.0; // Mom = (P_mu - P_mu^dag) - trace(P_mu - P_mu^dag) PokeIndex(UdSdU, mommu, mu); // UdSdU_mu = Mom } - std::cout << GridLogMessage<< "Antihermiticity tests - 2 " << std::endl; + std::cout << GridLogMessage << "Antihermiticity tests - 2 " << std::endl; for (int mu = 0; mu < Nd; mu++) { mommu = PeekIndex(mom, mu); @@ -167,7 +252,6 @@ int main(int argc, char **argv) } ///////////////////////////////////////////////////// - for (int mu = 0; mu < Nd; mu++) { forcemu = PeekIndex(UdSdU, mu); From 749189fd7209181f7923cb77ba8075c0efaf420b Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Sun, 29 Oct 2017 12:03:08 +0000 Subject: [PATCH 066/620] Full clover force correct --- lib/qcd/action/fermion/WilsonCloverFermion.cc | 6 +- lib/qcd/action/fermion/WilsonCloverFermion.h | 2 +- tests/forces/Test_wilsonclover_force.cc | 123 ++---------------- 3 files changed, 15 insertions(+), 116 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index e678835a..fff970a2 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -43,12 +43,11 @@ RealD WilsonCloverFermion::M(const FermionField &in, FermionField &out) // Wilson term out.checkerboard = in.checkerboard; - //this->Dhop(in, out, DaggerNo); + this->Dhop(in, out, DaggerNo); // Clover term Mooee(in, temp); - out= zero; out += temp; return norm2(out); } @@ -60,12 +59,11 @@ RealD WilsonCloverFermion::Mdag(const FermionField &in, FermionField &out) // Wilson term out.checkerboard = in.checkerboard; - //this->Dhop(in, out, DaggerYes); + this->Dhop(in, out, DaggerYes); // Clover term MooeeDag(in, temp); - out=zero; out += temp; return norm2(out); } diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index 402a9a7e..cd13b225 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -116,7 +116,7 @@ public: force = zero; // Derivative of the Wilson hopping term - //this->DhopDeriv(force, X, Y, dag); + this->DhopDeriv(force, X, Y, dag); /////////////////////////////////////////////////////////// // Clover term derivative diff --git a/tests/forces/Test_wilsonclover_force.cc b/tests/forces/Test_wilsonclover_force.cc index 82adb8ab..bcf67be4 100644 --- a/tests/forces/Test_wilsonclover_force.cc +++ b/tests/forces/Test_wilsonclover_force.cc @@ -48,13 +48,12 @@ int main(int argc, char **argv) std::vector seeds({1, 2, 30, 50}); GridParallelRNG pRNG(&Grid); - + std::vector vrand(4); std::srand(std::time(0)); std::generate(vrand.begin(), vrand.end(), std::rand); std::cout << GridLogMessage << vrand << std::endl; pRNG.SeedFixedIntegers(vrand); - //pRNG.SeedFixedIntegers(seeds); LatticeFermion phi(&Grid); @@ -64,50 +63,14 @@ int main(int argc, char **argv) LatticeGaugeField U(&Grid); -/* - std::vector x(4); // 4d fermions - std::vector gd = Grid.GlobalDimensions(); - Grid::QCD::SpinColourVector F; - Grid::Complex c; - - phi = zero; - for (x[0] = 0; x[0] < 1; x[0]++) - { - for (x[1] = 0; x[1] < 1; x[1]++) - { - for (x[2] = 0; x[2] < 1; x[2]++) - { - for (x[3] = 0; x[3] < 1; x[3]++) - { - for (int sp = 0; sp < 4; sp++) - { - for (int j = 0; j < 3; j++) // colours - { - F()(sp)(j) = Grid::Complex(0.0,0.0); - if (((sp == 0) && (j==0))) - { - c = Grid::Complex(1.0, 0.0); - F()(sp)(j) = c; - } - } - } - Grid::pokeSite(F, phi, x); - - } - } - } - } -*/ - std::vector site = {0, 0, 0, 0}; SU3::HotConfiguration(pRNG, U); - //SU3::ColdConfiguration(pRNG, U); - + //SU3::ColdConfiguration(pRNG, U);// Clover term zero //////////////////////////////////// // Unmodified matrix element //////////////////////////////////// - RealD mass = -4.0; //kills the diagonal term + RealD mass = 0.1; Real csw = 1.0; WilsonCloverFermionR Dw(U, Grid, RBGrid, mass, csw); Dw.ImportGauge(U); @@ -125,103 +88,42 @@ int main(int argc, char **argv) UdSdU += tmp; ///////////////////////////////////////////// - // Take the traceless antihermitian component - //UdSdU = Ta(UdSdU); - - //std::cout << UdSdU << std::endl; - //SU3::LatticeAlgebraVector hforce(&Grid); - LatticeColourMatrix mommu(&Grid); - //mommu = PeekIndex(UdSdU, 0); - //SU3::projectOnAlgebra(hforce, mommu); - //std::cout << hforce << std::endl; - //////////////////////////////////// // Modify the gauge field a little //////////////////////////////////// - RealD dt = 0.0001; + RealD dt = 0.00005; RealD Hmom = 0.0; RealD Hmomprime = 0.0; RealD Hmompp = 0.0; + LatticeColourMatrix mommu(&Grid); LatticeColourMatrix forcemu(&Grid); LatticeGaugeField mom(&Grid); LatticeGaugeField Uprime(&Grid); - - for (int mu = 0; mu < Nd; mu++) { + for (int mu = 0; mu < Nd; mu++) + { // Traceless antihermitian momentum; gaussian in lie alg SU3::GaussianFundamentalLieAlgebraMatrix(pRNG, mommu); Hmom -= real(sum(trace(mommu * mommu))); PokeIndex(mom, mommu, mu); - } - /* - SU3::AlgebraVector h; - SU3::LatticeAlgebraVector hl(&Grid); - h()()(0) = 1.0; - hl = zero; - pokeSite(h, hl, site); - SU3::FundamentalLieAlgebraMatrix(hl, mommu); - mom = zero; - PokeIndex(mom, mommu, 0); - Hmom -= real(sum(trace(mommu * mommu))); - */ - /* - parallel_for(int ss=0;ssoSites();ss++){ - for (int mu = 0; mu < Nd; mu++) - Uprime[ss]._internal[mu] = ProjectOnGroup(Exponentiate(mom[ss]._internal[mu], dt, 12) * U[ss]._internal[mu]); - } -*/ - - for (int mu = 0; mu < Nd; mu++) - { - parallel_for(auto i = mom.begin(); i < mom.end(); i++) + parallel_for(int ss = 0; ss < mom._grid->oSites(); ss++) { - Uprime[i](mu) = U[i](mu); - Uprime[i](mu) += mom[i](mu) * U[i](mu) * dt; - Uprime[i](mu) += mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt / 2.0); - Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt / 6.0); - Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt * dt / 24.0); - Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt * dt * dt / 120.0); - Uprime[i](mu) += mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * mom[i](mu) * U[i](mu) * (dt * dt * dt * dt * dt * dt / 720.0); + Uprime[ss]._internal[mu] = ProjectOnGroup(Exponentiate(mom[ss]._internal[mu], dt, 12) * U[ss]._internal[mu]); } } std::cout << GridLogMessage << "Initial mom hamiltonian is " << Hmom << std::endl; // New action - LatticeGaugeField diff(&Grid); - diff = Uprime - U; - //std::cout << "Diff:" << diff << std::endl; Dw.ImportGauge(Uprime); Dw.M(phi, MphiPrime); - LatticeFermion DiffFermion(&Grid); - DiffFermion = MphiPrime - Mphi; - //std::cout << "DiffFermion:" << DiffFermion << std::endl; - //std::cout << "Mphi:" << Mphi << std::endl; - //std::cout << "MphiPrime:" << MphiPrime << std::endl; - ComplexD Sprime = innerProduct(MphiPrime, MphiPrime); ////////////////////////////////////////////// // Use derivative to estimate dS ////////////////////////////////////////////// - /////////////////////////////////////////////////////// - std::cout << GridLogMessage << "Antihermiticity tests - 1 " << std::endl; - for (int mu = 0; mu < Nd; mu++) - { - mommu = PeekIndex(mom, mu); - std::cout << GridLogMessage << " Mommu " << norm2(mommu) << std::endl; - mommu = mommu + adj(mommu); - std::cout << GridLogMessage << " Test: Mommu + Mommudag " << norm2(mommu) << std::endl; - mommu = PeekIndex(UdSdU, mu); - std::cout << GridLogMessage << " dsdumu " << norm2(mommu) << std::endl; - mommu = mommu + adj(mommu); - std::cout << GridLogMessage << " Test: dsdumu + dag " << norm2(mommu) << std::endl; - std::cout << "" << std::endl; - } - //////////////////////////////////////////////////////// - LatticeComplex dS(&Grid); dS = zero; LatticeComplex dSmom(&Grid); @@ -229,7 +131,6 @@ int main(int argc, char **argv) LatticeComplex dSmom2(&Grid); dSmom2 = zero; - for (int mu = 0; mu < Nd; mu++) { mommu = PeekIndex(UdSdU, mu); // P_mu = @@ -237,7 +138,7 @@ int main(int argc, char **argv) PokeIndex(UdSdU, mommu, mu); // UdSdU_mu = Mom } - std::cout << GridLogMessage << "Antihermiticity tests - 2 " << std::endl; + std::cout << GridLogMessage << "Antihermiticity tests" << std::endl; for (int mu = 0; mu < Nd; mu++) { mommu = PeekIndex(mom, mu); @@ -279,8 +180,8 @@ int main(int argc, char **argv) std::cout << GridLogMessage << " S " << S << std::endl; std::cout << GridLogMessage << " Sprime " << Sprime << std::endl; - std::cout << GridLogMessage << "dS " << Sprime - S << std::endl; - std::cout << GridLogMessage << "predict dS " << dSpred << std::endl; + std::cout << GridLogMessage << "dS (S' - S) :" << Sprime - S << std::endl; + std::cout << GridLogMessage << "predict dS (force) :" << dSpred << std::endl; std::cout << GridLogMessage << "dSm " << dSm << std::endl; std::cout << GridLogMessage << "dSm2" << dSm2 << std::endl; From b07a354a3394bc30b3c237580d58418a9494717d Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 30 Oct 2017 14:20:44 +0000 Subject: [PATCH 067/620] QedFVol: output scalar propagator before FFT in spatial directions. --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 204 +++++++++++------- 1 file changed, 126 insertions(+), 78 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 1b901bf1..6ffda844 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -151,23 +151,25 @@ void TChargedProp::execute(void) buf = GFSrc; momD1(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propQ, buf, FFT::backward); + fft.FFT_dim(propQ, buf, env().getNd()-1, FFT::backward); // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) buf = -buf; momD1(buf, fft); propSun = G*buf; - fft.FFT_all_dim(propSun, propSun, FFT::backward); + fft.FFT_dim(propSun, propSun, env().getNd()-1, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propTad, buf, FFT::backward); - - // full charged scalar propagator - prop = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; + fft.FFT_dim(propTad, buf, env().getNd()-1, FFT::backward); + // full charged scalar propagator + buf = GFSrc; + fft.FFT_dim(buf, buf, env().getNd()-1, FFT::backward); + prop = buf + q*propQ + q*q*propSun + q*q*propTad; + // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -184,94 +186,140 @@ void TChargedProp::execute(void) << filename << "'..." << std::endl; CorrWriter writer(filename); - std::vector vecBuf; - std::vector result; + // std::vector vecBuf; + std::vector result, result0, resultQ, resultSun, resultTad; + result.resize(env().getGrid()->_ldimensions[env().getNd()-1]); + result0.resize(env().getGrid()->_ldimensions[env().getNd()-1]); + resultQ.resize(env().getGrid()->_ldimensions[env().getNd()-1]); + resultSun.resize(env().getGrid()->_ldimensions[env().getNd()-1]); + resultTad.resize(env().getGrid()->_ldimensions[env().getNd()-1]); write(writer, "charge", q); write(writer, "mass", par().mass); - // Write full propagator - buf = prop; + TComplex site; + std::vector whichmom; + whichmom.resize(env().getNd()); + for (unsigned int j = 0; j < env().getNd()-1; ++j) { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } + whichmom[j] = mom[j]; } - sliceSum(buf, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + + for (unsigned int t = 0; t < env().getGrid()->_ldimensions[env().getNd()-1]; ++t) { - result[t] = TensorRemove(vecBuf[t]); + whichmom[env().getNd()-1] = t; + // Write full propagator + peekSite(site, prop, whichmom); + result[t]=TensorRemove(site); + // Write free propagator + peekSite(site, buf, whichmom); + result0[t]=TensorRemove(site); + // Write propagator O(q) term + peekSite(site, propQ, whichmom); + resultQ[t]=TensorRemove(site); + // Write propagator sunset term + peekSite(site, propSun, whichmom); + resultSun[t]=TensorRemove(site); + // Write propagator tadpole term + peekSite(site, propTad, whichmom); + resultTad[t]=TensorRemove(site); } write(writer, "prop", result); + write(writer, "prop_0", result0); + write(writer, "prop_Q", resultQ); + write(writer, "prop_Sun", resultSun); + write(writer, "prop_Tad", resultTad); - // Write free propagator - buf = *prop0_; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_0", result); + // // Write full propagator + // buf = prop; + // for (unsigned int j = 0; j < env().getNd()-1; ++j) + // { + // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + // { + // buf = buf*adj(*phase_[j]); + // } + // } + // sliceSum(buf, vecBuf, Tp); + // result.resize(vecBuf.size()); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop", result); - // Write propagator O(q) term - buf = propQ; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Q", result); + // // Write free propagator + // buf = *prop0_; + // for (unsigned int j = 0; j < env().getNd()-1; ++j) + // { + // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + // { + // buf = buf*adj(*phase_[j]); + // } + // } + // sliceSum(buf, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_0", result); - // Write propagator sunset term - buf = propSun; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Sun", result); + // // Write propagator O(q) term + // buf = propQ; + // for (unsigned int j = 0; j < env().getNd()-1; ++j) + // { + // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + // { + // buf = buf*adj(*phase_[j]); + // } + // } + // sliceSum(buf, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_Q", result); - // Write propagator tadpole term - buf = propTad; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Tad", result); + // // Write propagator sunset term + // buf = propSun; + // for (unsigned int j = 0; j < env().getNd()-1; ++j) + // { + // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + // { + // buf = buf*adj(*phase_[j]); + // } + // } + // sliceSum(buf, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_Sun", result); + + // // Write propagator tadpole term + // buf = propTad; + // for (unsigned int j = 0; j < env().getNd()-1; ++j) + // { + // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + // { + // buf = buf*adj(*phase_[j]); + // } + // } + // sliceSum(buf, vecBuf, Tp); + // for (unsigned int t = 0; t < vecBuf.size(); ++t) + // { + // result[t] = TensorRemove(vecBuf[t]); + // } + // write(writer, "prop_Tad", result); } } + + std::vector mask(env().getNd(),1); + mask[env().getNd()-1] = 0; + fft.FFT_dim_mask(prop, prop, mask, FFT::backward); + fft.FFT_dim_mask(propQ, propQ, mask, FFT::backward); + fft.FFT_dim_mask(propSun, propSun, mask, FFT::backward); + fft.FFT_dim_mask(propTad, propTad, mask, FFT::backward); } void TChargedProp::momD1(ScalarField &s, FFT &fft) From 0d4e31ca58ff63903b8832838ab7eba3b0f6a4a6 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 30 Oct 2017 15:46:50 +0000 Subject: [PATCH 068/620] QedFVol: Calculate phase factors for momentum projections once per configuration only. --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 81 ----------- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 131 ++++-------------- 2 files changed, 28 insertions(+), 184 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 6ffda844..3aaf3d5e 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -230,87 +230,6 @@ void TChargedProp::execute(void) write(writer, "prop_Q", resultQ); write(writer, "prop_Sun", resultSun); write(writer, "prop_Tad", resultTad); - - // // Write full propagator - // buf = prop; - // for (unsigned int j = 0; j < env().getNd()-1; ++j) - // { - // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - // { - // buf = buf*adj(*phase_[j]); - // } - // } - // sliceSum(buf, vecBuf, Tp); - // result.resize(vecBuf.size()); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop", result); - - // // Write free propagator - // buf = *prop0_; - // for (unsigned int j = 0; j < env().getNd()-1; ++j) - // { - // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - // { - // buf = buf*adj(*phase_[j]); - // } - // } - // sliceSum(buf, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_0", result); - - // // Write propagator O(q) term - // buf = propQ; - // for (unsigned int j = 0; j < env().getNd()-1; ++j) - // { - // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - // { - // buf = buf*adj(*phase_[j]); - // } - // } - // sliceSum(buf, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_Q", result); - - // // Write propagator sunset term - // buf = propSun; - // for (unsigned int j = 0; j < env().getNd()-1; ++j) - // { - // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - // { - // buf = buf*adj(*phase_[j]); - // } - // } - // sliceSum(buf, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_Sun", result); - - // // Write propagator tadpole term - // buf = propTad; - // for (unsigned int j = 0; j < env().getNd()-1; ++j) - // { - // for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - // { - // buf = buf*adj(*phase_[j]); - // } - // } - // sliceSum(buf, vecBuf, Tp); - // for (unsigned int t = 0; t < vecBuf.size(); ++t) - // { - // result[t] = TensorRemove(vecBuf[t]); - // } - // write(writer, "prop_Tad", result); } } diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 4d923802..297a823d 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -144,13 +144,19 @@ void TScalarVP::execute(void) } // Open output files if necessary + std::vector vecBuf; + std::vector result; + ScalarField vpPhase(env().getGrid()); std::vector writer, writer0, writerD; + std::vector momphases; if (!par().output.empty()) { + LOG(Message) << "Preparing output files..." << std::endl; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { std::vector mom = strToVec(par().outputMom[i_p]); + // Open output files std::string filename = par().output + "_" + std::to_string(mom[0]) + std::to_string(mom[1]) + std::to_string(mom[2]) @@ -180,11 +186,20 @@ void TScalarVP::execute(void) write(*writer0[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); write(*writerD[i_p], "charge", q); write(*writerD[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + + // Calculate phase factors + vpPhase = Complex(1.0,0.0); + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*(*phase_[j]); + } + } + vpPhase = adj(vpPhase); + momphases.push_back(vpPhase); } } - std::vector vecBuf; - std::vector result; - ScalarField vpPhase(env().getGrid()); // Do contractions for (unsigned int nu = 0; nu < env().getNd(); ++nu) @@ -207,18 +222,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = freeVpTensor[mu][nu]; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = freeVpTensor[mu][nu]*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -244,18 +250,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -281,18 +278,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -316,18 +304,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -350,18 +329,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -385,18 +355,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -419,18 +380,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -457,18 +409,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -494,18 +437,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -521,18 +455,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = vpTensor[mu][nu]; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = vpTensor[mu][nu]*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) From fa5e4add47bfdb2d0c54486ebb99236b9db11326 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 31 Oct 2017 18:20:38 +0000 Subject: [PATCH 069/620] Added support for anisotropy to the WilsonFermion class --- lib/qcd/action/fermion/WilsonFermion.cc | 42 ++++++++++++++++++++----- lib/qcd/action/fermion/WilsonFermion.h | 21 +++++++++++-- tests/qdpxx/Test_qdpxx_wilson.cc | 28 ++++++++++++++--- 3 files changed, 76 insertions(+), 15 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonFermion.cc b/lib/qcd/action/fermion/WilsonFermion.cc index 19f9674d..55ef5a51 100644 --- a/lib/qcd/action/fermion/WilsonFermion.cc +++ b/lib/qcd/action/fermion/WilsonFermion.cc @@ -47,7 +47,8 @@ int WilsonFermionStatic::HandOptDslash; template WilsonFermion::WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, - const ImplParams &p) + const ImplParams &p, + const WilsonAnisotropyCoefficients &anis) : Kernels(p), _grid(&Fgrid), _cbgrid(&Hgrid), @@ -60,16 +61,41 @@ WilsonFermion::WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid, Umu(&Fgrid), UmuEven(&Hgrid), UmuOdd(&Hgrid), - _tmp(&Hgrid) + _tmp(&Hgrid), + anisotropyCoeff(anis) { // Allocate the required comms buffer ImportGauge(_Umu); + if (anisotropyCoeff.isAnisotropic){ + diag_mass = mass + 1.0 + (Nd-1)*(anisotropyCoeff.nu / anisotropyCoeff.xi_0); + } else { + diag_mass = 4.0 + mass; + } + + } template void WilsonFermion::ImportGauge(const GaugeField &_Umu) { GaugeField HUmu(_Umu._grid); - HUmu = _Umu * (-0.5); + + //Here multiply the anisotropy coefficients + if (anisotropyCoeff.isAnisotropic) + { + + for (int mu = 0; mu < Nd; mu++) + { + GaugeLinkField U_dir = (-0.5)*PeekIndex(_Umu, mu); + if (mu != anisotropyCoeff.t_direction) + U_dir *= (anisotropyCoeff.nu / anisotropyCoeff.xi_0); + + PokeIndex(HUmu, U_dir, mu); + } + } + else + { + HUmu = _Umu * (-0.5); + } Impl::DoubleStore(GaugeGrid(), Umu, HUmu); pickCheckerboard(Even, UmuEven, Umu); pickCheckerboard(Odd, UmuOdd, Umu); @@ -83,14 +109,14 @@ template RealD WilsonFermion::M(const FermionField &in, FermionField &out) { out.checkerboard = in.checkerboard; Dhop(in, out, DaggerNo); - return axpy_norm(out, 4 + mass, in, out); + return axpy_norm(out, diag_mass, in, out); } template RealD WilsonFermion::Mdag(const FermionField &in, FermionField &out) { out.checkerboard = in.checkerboard; Dhop(in, out, DaggerYes); - return axpy_norm(out, 4 + mass, in, out); + return axpy_norm(out, diag_mass, in, out); } template @@ -114,7 +140,7 @@ void WilsonFermion::MeooeDag(const FermionField &in, FermionField &out) { template void WilsonFermion::Mooee(const FermionField &in, FermionField &out) { out.checkerboard = in.checkerboard; - typename FermionField::scalar_type scal(4.0 + mass); + typename FermionField::scalar_type scal(diag_mass); out = scal * in; } @@ -127,7 +153,7 @@ void WilsonFermion::MooeeDag(const FermionField &in, FermionField &out) { template void WilsonFermion::MooeeInv(const FermionField &in, FermionField &out) { out.checkerboard = in.checkerboard; - out = (1.0/(4.0+mass))*in; + out = (1.0/(diag_mass))*in; } template @@ -204,7 +230,7 @@ void WilsonFermion::DerivInternal(StencilImpl &st, DoubledGaugeField &U, FermionField Btilde(B._grid); FermionField Atilde(B._grid); - Atilde = A; + Atilde = A;//redundant st.HaloExchange(B, compressor); diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index 50f4f884..7b2b5206 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -44,6 +44,19 @@ class WilsonFermionStatic { static const int npoint = 8; }; +struct WilsonAnisotropyCoefficients{ + bool isAnisotropic; + int t_direction; + double xi_0; + double nu; + + WilsonAnisotropyCoefficients(): + isAnisotropic(false), + t_direction(Nd-1), + xi_0(1.0), + nu(1.0){} +}; + template class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { public: @@ -117,8 +130,9 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { // Constructor WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid, - GridRedBlackCartesian &Hgrid, RealD _mass, - const ImplParams &p = ImplParams()); + GridRedBlackCartesian &Hgrid, RealD _mass, + const ImplParams &p = ImplParams(), + const WilsonAnisotropyCoefficients &anis = WilsonAnisotropyCoefficients() ); // DoubleStore impl dependent void ImportGauge(const GaugeField &_Umu); @@ -130,6 +144,7 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { // protected: public: RealD mass; + RealD diag_mass; GridBase *_grid; GridBase *_cbgrid; @@ -146,6 +161,8 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { LebesgueOrder Lebesgue; LebesgueOrder LebesgueEvenOdd; + + WilsonAnisotropyCoefficients anisotropyCoeff; }; typedef WilsonFermion WilsonFermionF; diff --git a/tests/qdpxx/Test_qdpxx_wilson.cc b/tests/qdpxx/Test_qdpxx_wilson.cc index 6e6eb213..a084ebad 100644 --- a/tests/qdpxx/Test_qdpxx_wilson.cc +++ b/tests/qdpxx/Test_qdpxx_wilson.cc @@ -32,7 +32,7 @@ #include // Mass -double mq = 0.02; +double mq = 0.1; // Define Wilson Types typedef Grid::QCD::WilsonImplR::FermionField FermionField; @@ -255,6 +255,12 @@ public: Chroma::WilsonFermActParams p; p.Mass = _mq; + AnisoParam_t _apar; + _apar.anisoP = true; + _apar.t_dir = 3; // in 4d + _apar.xi_0 = 2.0; + _apar.nu = 1.0; + p.anisoParam = _apar; Chroma::Handle> fbc(new Chroma::SimpleFermBC(bcs)); Chroma::Handle> cfs(new Chroma::CreateSimpleFermState(fbc)); @@ -269,7 +275,13 @@ public: p.Mass = _mq; p.clovCoeffR = QDP::Real(1.0); p.clovCoeffT = QDP::Real(1.0); - Real u0 = QDP::Real(1.0); + p.u0 = QDP::Real(1.0); + AnisoParam_t _apar; + _apar.anisoP = false; + _apar.t_dir = 3; // in 4d + _apar.xi_0 = 2.0; + _apar.nu = 1.0; + p.anisoParam = _apar; Chroma::Handle> fbc(new Chroma::SimpleFermBC(bcs)); Chroma::Handle> cfs(new Chroma::CreateSimpleFermState(fbc)); @@ -391,8 +403,13 @@ void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD if (action == Wilson) { - - Grid::QCD::WilsonFermionR Wf(Umu, *UGrid, *UrbGrid, _mass); + WilsonAnisotropyCoefficients anis; + anis.isAnisotropic = true; + anis.t_direction = 3; + anis.xi_0 = 2.0; + anis.nu = 1.0; + WilsonImplParams iParam; + Grid::QCD::WilsonFermionR Wf(Umu, *UGrid, *UrbGrid, _mass, iParam, anis); std::cout << Grid::GridLogMessage << " Calling Grid Wilson Fermion multiply " << std::endl; @@ -406,7 +423,8 @@ void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD if (action == WilsonClover) { Grid::RealD _csw = 1.0; - + WilsonAnisotropyCoefficients anis; + WilsonImplParams implParam; Grid::QCD::WilsonCloverFermionR Wf(Umu, *UGrid, *UrbGrid, _mass, _csw); Wf.ImportGauge(Umu); From 8e057721a91c3d58bb3c076f111504aacb515906 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 1 Nov 2017 12:50:54 +0000 Subject: [PATCH 070/620] Anisotropic Clover term written and tested --- lib/algorithms/LinearOperator.h | 10 +- lib/qcd/action/fermion/WilsonCloverFermion.cc | 102 +--- lib/qcd/action/fermion/WilsonCloverFermion.h | 116 +++-- lib/qcd/action/fermion/WilsonFermion.h | 9 +- tests/core/Test_wilson_clover.cc | 492 ++++++++++-------- tests/forces/Test_wilsonclover_force.cc | 2 +- .../Test_hmc_EOWilsonCloverFermionGauge.cc | 139 +++++ .../hmc/Test_hmc_WilsonCloverFermionGauge.cc | 126 +++++ tests/qdpxx/Test_qdpxx_wilson.cc | 15 +- 9 files changed, 637 insertions(+), 374 deletions(-) create mode 100644 tests/hmc/Test_hmc_EOWilsonCloverFermionGauge.cc create mode 100644 tests/hmc/Test_hmc_WilsonCloverFermionGauge.cc diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index f1b8820e..ee97e96d 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -183,11 +183,13 @@ namespace Grid { virtual RealD Mpc (const Field &in, Field &out) =0; virtual RealD MpcDag (const Field &in, Field &out) =0; virtual void MpcDagMpc(const Field &in, Field &out,RealD &ni,RealD &no) { - Field tmp(in._grid); + Field tmp(in._grid); + tmp.checkerboard = in.checkerboard; ni=Mpc(in,tmp); no=MpcDag(tmp,out); } virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ + out.checkerboard = in.checkerboard; MpcDagMpc(in,out,n1,n2); } virtual void HermOp(const Field &in, Field &out){ @@ -215,13 +217,15 @@ namespace Grid { public: SchurDiagMooeeOperator (Matrix &Mat): _Mat(Mat){}; virtual RealD Mpc (const Field &in, Field &out) { - Field tmp(in._grid); -// std::cout <<"grid pointers: in._grid="<< in._grid << " out._grid=" << out._grid << " _Mat.Grid=" << _Mat.Grid() << " _Mat.RedBlackGrid=" << _Mat.RedBlackGrid() << std::endl; + Field tmp(in._grid); + tmp.checkerboard = !in.checkerboard; + //std::cout <<"grid pointers: in._grid="<< in._grid << " out._grid=" << out._grid << " _Mat.Grid=" << _Mat.Grid() << " _Mat.RedBlackGrid=" << _Mat.RedBlackGrid() << std::endl; _Mat.Meooe(in,tmp); _Mat.MooeeInv(tmp,out); _Mat.Meooe(out,tmp); + //std::cout << "cb in " << in.checkerboard << " cb out " << out.checkerboard << std::endl; _Mat.Mooee(in,out); return axpy_norm(out,-1.0,tmp,out); } diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index fff970a2..3ec90e06 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -84,14 +84,14 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) WilsonLoops::FieldStrength(Ez, _Umu, Tdir, Zdir); // Compute the Clover Operator acting on Colour and Spin - CloverTerm = fillCloverYZ(Bx); - CloverTerm += fillCloverXZ(By); - CloverTerm += fillCloverXY(Bz); - CloverTerm += fillCloverXT(Ex); - CloverTerm += fillCloverYT(Ey); - CloverTerm += fillCloverZT(Ez); - CloverTerm *= (0.5) * csw; - CloverTerm += (4.0 + this->mass); + // multiply here by the clover coefficients for the anisotropy + CloverTerm = fillCloverYZ(Bx) * csw_r; + CloverTerm += fillCloverXZ(By) * csw_r; + CloverTerm += fillCloverXY(Bz) * csw_r; + CloverTerm += fillCloverXT(Ex) * csw_t; + CloverTerm += fillCloverYT(Ey) * csw_t; + CloverTerm += fillCloverZT(Ez) * csw_t; + CloverTerm += diag_mass; int lvol = _Umu._grid->lSites(); int DimRep = Impl::Dimension; @@ -145,7 +145,6 @@ void WilsonCloverFermion::ImportGauge(const GaugeField &_Umu) template void WilsonCloverFermion::Mooee(const FermionField &in, FermionField &out) { - conformable(in, out); this->MooeeInternal(in, out, DaggerNo, InverseNo); } @@ -158,14 +157,12 @@ void WilsonCloverFermion::MooeeDag(const FermionField &in, FermionField &o template void WilsonCloverFermion::MooeeInv(const FermionField &in, FermionField &out) { - conformable(in,out); this->MooeeInternal(in, out, DaggerNo, InverseYes); } template void WilsonCloverFermion::MooeeInvDag(const FermionField &in, FermionField &out) { - conformable(in,out); this->MooeeInternal(in, out, DaggerYes, InverseYes); } @@ -228,88 +225,7 @@ void WilsonCloverFermion::MooeeInternal(const FermionField &in, FermionFie template void WilsonCloverFermion::MooDeriv(GaugeField &mat, const FermionField &X, const FermionField &Y, int dag) { - - GridBase *grid = mat._grid; - - //GaugeLinkField Lambdaodd(grid), Lambdaeven(grid), tmp(grid); - //Lambdaodd = zero; //Yodd*dag(Xodd)+Xodd*dag(Yodd); // I have to peek spin and decide the color structure - //Lambdaeven = zero; //Teven*dag(Xeven)+Xeven*dag(Yeven) + 2*(Dee^-1) - - GaugeLinkField Lambda(grid), tmp(grid); - Lambda = zero; - - conformable(mat._grid, X._grid); - conformable(Y._grid, X._grid); - - std::vector C1p(Nd, grid), C2p(Nd, grid), C3p(Nd, grid), C4p(Nd, grid); - std::vector C1m(Nd, grid), C2m(Nd, grid), C3m(Nd, grid), C4m(Nd, grid); - std::vector U(Nd, mat._grid); - - for (int mu = 0; mu < Nd; mu++) - { - U[mu] = PeekIndex(mat, mu); - C1p[mu] = zero; - C2p[mu] = zero; - C3p[mu] = zero; - C4p[mu] = zero; - C1m[mu] = zero; - C2m[mu] = zero; - C3m[mu] = zero; - C4m[mu] = zero; - } - - /* - PARALLEL_FOR_LOOP - for (int i = 0; i < CloverTerm._grid->oSites(); i++) - { - T._odata[i]()(0, 1) = timesMinusI(F._odata[i]()()); - T._odata[i]()(1, 0) = timesMinusI(F._odata[i]()()); - T._odata[i]()(2, 3) = timesMinusI(F._odata[i]()()); - T._odata[i]()(3, 2) = timesMinusI(F._odata[i]()()); - } -*/ - - for (int i = 0; i < 4; i++) - { //spin - for (int j = 0; j < 4; j++) - { //spin - - for (int mu = 0; mu < 4; mu++) - { //color - for (int nu = 0; nu < 4; nu++) - { //color - - // insertion in upper staple - tmp = Lambda * U[nu]; - C1p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - - tmp = Lambda * U[mu]; - C2p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - - tmp = Impl::CovShiftIdentityForward(Lambda, nu) * U[nu]; - C3p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu); - - tmp = Lambda; - C4p[mu] += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu) * tmp; - - // insertion in lower staple - tmp = Lambda * U[nu]; - C1m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu); - - tmp = Lambda * U[mu]; - C2m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, U[nu])), mu); - - tmp = Lambda * U[nu]; - C3m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, tmp)), mu); - - tmp = Lambda; - C4m[mu] += Impl::ShiftStaple(Impl::CovShiftBackward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, U[nu])), mu) * tmp; - } - } - } - } - - //Still implementing. Have to be tested, and understood how to project EO + assert(0); } // Derivative parts diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/lib/qcd/action/fermion/WilsonCloverFermion.h index cd13b225..268564c0 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.h +++ b/lib/qcd/action/fermion/WilsonCloverFermion.h @@ -6,8 +6,8 @@ Copyright (C) 2017 - Author: paboyle Author: Guido Cossu + Author: David Preti <> 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 @@ -37,6 +37,22 @@ namespace Grid namespace QCD { +/////////////////////////////////////////////////////////////////// +// Wilson Clover +// +// Operator ( with anisotropy coefficients): +// +// Q = 1 + (Nd-1)/xi_0 + m +// + W_t + (nu/xi_0) * W_s +// - 1/2*[ csw_t * sum_s (sigma_ts F_ts) + (csw_s/xi_0) * sum_ss (sigma_ss F_ss) ] +// +// s spatial, t temporal directions. +// where W_t and W_s are the temporal and spatial components of the +// Wilson Dirac operator +// +// csw_r = csw_t to recover the isotropic version +////////////////////////////////////////////////////////////////// + template class WilsonCloverFermion : public WilsonFermion { @@ -55,28 +71,43 @@ public: // Constructors WilsonCloverFermion(GaugeField &_Umu, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, - RealD _mass, - RealD _csw, - const ImplParams &p = ImplParams()) : WilsonFermion(_Umu, - Fgrid, - Hgrid, - _mass, p), - CloverTerm(&Fgrid), - CloverTermInv(&Fgrid), - CloverTermEven(&Hgrid), - CloverTermOdd(&Hgrid), - CloverTermInvEven(&Hgrid), - CloverTermInvOdd(&Hgrid), - CloverTermDagEven(&Hgrid), - CloverTermDagOdd(&Hgrid), - CloverTermInvDagEven(&Hgrid), - CloverTermInvDagOdd(&Hgrid) + const RealD _mass, + const RealD _csw_r = 0.0, + const RealD _csw_t = 0.0, + const WilsonAnisotropyCoefficients &clover_anisotropy = WilsonAnisotropyCoefficients(), + const ImplParams &impl_p = ImplParams()) : WilsonFermion(_Umu, + Fgrid, + Hgrid, + _mass, impl_p, clover_anisotropy), + CloverTerm(&Fgrid), + CloverTermInv(&Fgrid), + CloverTermEven(&Hgrid), + CloverTermOdd(&Hgrid), + CloverTermInvEven(&Hgrid), + CloverTermInvOdd(&Hgrid), + CloverTermDagEven(&Hgrid), + CloverTermDagOdd(&Hgrid), + CloverTermInvDagEven(&Hgrid), + CloverTermInvDagOdd(&Hgrid) { - csw = _csw; assert(Nd == 4); // require 4 dimensions - if (csw == 0) - std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw = 0" << std::endl; + if (clover_anisotropy.isAnisotropic) + { + csw_r = _csw_r * 0.5 / clover_anisotropy.xi_0; + diag_mass = _mass + 1.0 + (Nd - 1) * (clover_anisotropy.nu / clover_anisotropy.xi_0); + } + else + { + csw_r = _csw_r * 0.5; + diag_mass = 4.0 + _mass; + } + csw_t = _csw_t * 0.5; + + if (csw_r == 0) + std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw_r = 0" << std::endl; + if (csw_t == 0) + std::cout << GridLogWarning << "Initializing WilsonCloverFermion with csw_t = 0" << std::endl; ImportGauge(_Umu); } @@ -105,15 +136,15 @@ public: GaugeField clover_force(force._grid); PropagatorField Lambda(force._grid); - // Here we are hitting some performance issues: + // Guido: Here we are hitting some performance issues: // need to extract the components of the DoubledGaugeField // for each call // Possible solution // Create a vector object to store them? (cons: wasting space) std::vector U(Nd, this->Umu._grid); - + Impl::extractLinkField(U, this->Umu); - + force = zero; // Derivative of the Wilson hopping term this->DhopDeriv(force, X, Y, dag); @@ -121,10 +152,9 @@ public: /////////////////////////////////////////////////////////// // Clover term derivative /////////////////////////////////////////////////////////// - Impl::outerProductImpl(Lambda, X, Y); + Impl::outerProductImpl(Lambda, X, Y); //std::cout << "Lambda:" << Lambda << std::endl; - Gamma::Algebra sigma[] = { Gamma::Algebra::SigmaXY, Gamma::Algebra::SigmaXZ, @@ -148,25 +178,34 @@ public: */ int count = 0; - clover_force = zero; + clover_force = zero; for (int mu = 0; mu < 4; mu++) { force_mu = zero; for (int nu = 0; nu < 4; nu++) { - if (mu == nu) continue; + if (mu == nu) + continue; + + RealD factor; + if (nu == 4 || mu == 4) + { + factor = 2.0 * csw_t; + } + else + { + factor = 2.0 * csw_r; + } PropagatorField Slambda = Gamma(sigma[count]) * Lambda; // sigma checked - Impl::TraceSpinImpl(lambda, Slambda); // traceSpin ok - force_mu -= Cmunu(U, lambda, mu, nu); // checked + Impl::TraceSpinImpl(lambda, Slambda); // traceSpin ok + force_mu -= factor*Cmunu(U, lambda, mu, nu); // checked count++; } pokeLorentz(clover_force, U[mu] * force_mu, mu); } - clover_force *= csw; + //clover_force *= csw; force += clover_force; - - } // Computing C_{\mu \nu}(x) as in Eq.(B.39) in Zbigniew Sroczynski's PhD thesis @@ -176,15 +215,15 @@ public: GaugeLinkField out(lambda._grid), tmp(lambda._grid); // insertion in upper staple // please check redundancy of shift operations - + // C1+ tmp = lambda * U[nu]; out = Impl::ShiftStaple(Impl::CovShiftForward(tmp, nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - + // C2+ tmp = U[mu] * Impl::ShiftStaple(adj(lambda), mu); out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(tmp, mu, Impl::CovShiftIdentityBackward(U[nu], nu))), mu); - + // C3+ tmp = U[nu] * Impl::ShiftStaple(adj(lambda), nu); out += Impl::ShiftStaple(Impl::CovShiftForward(U[nu], nu, Impl::CovShiftBackward(U[mu], mu, Impl::CovShiftIdentityBackward(tmp, nu))), mu); @@ -213,16 +252,17 @@ public: private: // here fixing the 4 dimensions, make it more general? - RealD csw; // Clover coefficient + RealD csw_r; // Clover coefficient - spatial + RealD csw_t; // Clover coefficient - temporal + RealD diag_mass; // Mass term CloverFieldType CloverTerm, CloverTermInv; // Clover term CloverFieldType CloverTermEven, CloverTermOdd; // Clover term EO CloverFieldType CloverTermInvEven, CloverTermInvOdd; // Clover term Inv EO CloverFieldType CloverTermDagEven, CloverTermDagOdd; // Clover term Dag EO CloverFieldType CloverTermInvDagEven, CloverTermInvDagOdd; // Clover term Inv Dag EO - // eventually these two can be compressed into 6x6 blocks instead of the 12x12 + // eventually these can be compressed into 6x6 blocks instead of the 12x12 // using the DeGrand-Rossi basis for the gamma matrices - CloverFieldType fillCloverYZ(const GaugeLinkField &F) { CloverFieldType T(F._grid); diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index 7b2b5206..ca5eba8b 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -45,10 +45,11 @@ class WilsonFermionStatic { }; struct WilsonAnisotropyCoefficients{ - bool isAnisotropic; - int t_direction; - double xi_0; - double nu; + GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonAnisotropyCoefficients, + bool, isAnisotropic, + int, t_direction, + double, xi_0, + double, nu); WilsonAnisotropyCoefficients(): isAnisotropic(false), diff --git a/tests/core/Test_wilson_clover.cc b/tests/core/Test_wilson_clover.cc index 9a55f6b2..9281e298 100644 --- a/tests/core/Test_wilson_clover.cc +++ b/tests/core/Test_wilson_clover.cc @@ -1,4 +1,4 @@ - /************************************************************************************* +/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid @@ -24,302 +24,334 @@ See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ - /* END LEGAL */ +/* END LEGAL */ #include using namespace std; using namespace Grid; using namespace Grid::QCD; -int main (int argc, char ** argv) +int main(int argc, char **argv) { - Grid_init(&argc,&argv); + Grid_init(&argc, &argv); - std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); - std::vector mpi_layout = GridDefaultMpi(); - GridCartesian Grid(latt_size,simd_layout,mpi_layout); - GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd, vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size, simd_layout, mpi_layout); + GridRedBlackCartesian RBGrid(&Grid); int threads = GridThread::GetThreads(); - std::cout< seeds({1,2,3,4}); - GridParallelRNG pRNG(&Grid); + std::vector seeds({1, 2, 3, 4}); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); // pRNG.SeedFixedIntegers(std::vector({45,12,81,9}); - typedef typename WilsonCloverFermionR::FermionField FermionField; - typename WilsonCloverFermionR::ImplParams params; + typedef typename WilsonCloverFermionR::FermionField FermionField; + typename WilsonCloverFermionR::ImplParams params; + WilsonAnisotropyCoefficients anis; - FermionField src (&Grid); random(pRNG,src); - FermionField result(&Grid); result=zero; - FermionField result2(&Grid); result2=zero; - FermionField ref(&Grid); ref=zero; - FermionField tmp(&Grid); tmp=zero; - FermionField err(&Grid); err=zero; - FermionField err2(&Grid); err2=zero; - FermionField phi (&Grid); random(pRNG,phi); - FermionField chi (&Grid); random(pRNG,chi); - LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu); - std::vector U(4,&Grid); + FermionField src(&Grid); + random(pRNG, src); + FermionField result(&Grid); + result = zero; + FermionField result2(&Grid); + result2 = zero; + FermionField ref(&Grid); + ref = zero; + FermionField tmp(&Grid); + tmp = zero; + FermionField err(&Grid); + err = zero; + FermionField err2(&Grid); + err2 = zero; + FermionField phi(&Grid); + random(pRNG, phi); + FermionField chi(&Grid); + random(pRNG, chi); + LatticeGaugeField Umu(&Grid); + SU3::HotConfiguration(pRNG, Umu); + std::vector U(4, &Grid); - - double volume=1; - for(int mu=0;mu * = < chi | Deo^dag| phi> "< * = < chi | Deo^dag| phi> " << std::endl; + std::cout << GridLogMessage << "==============================================================" << std::endl; - FermionField dchi_e (&RBGrid); - FermionField dchi_o (&RBGrid); + FermionField chi_e(&RBGrid); + FermionField chi_o(&RBGrid); - FermionField phi_e (&RBGrid); - FermionField phi_o (&RBGrid); + FermionField dchi_e(&RBGrid); + FermionField dchi_o(&RBGrid); - FermionField dphi_e (&RBGrid); - FermionField dphi_o (&RBGrid); + FermionField phi_e(&RBGrid); + FermionField phi_o(&RBGrid); - pickCheckerboard(Even,chi_e,chi); - pickCheckerboard(Odd ,chi_o,chi); - pickCheckerboard(Even,phi_e,phi); - pickCheckerboard(Odd ,phi_o,phi); + FermionField dphi_e(&RBGrid); + FermionField dphi_o(&RBGrid); - Dwc.Meooe(chi_e,dchi_o); - Dwc.Meooe(chi_o,dchi_e); - Dwc.MeooeDag(phi_e,dphi_o); - Dwc.MeooeDag(phi_o,dphi_e); + pickCheckerboard(Even, chi_e, chi); + pickCheckerboard(Odd, chi_o, chi); + pickCheckerboard(Even, phi_e, phi); + pickCheckerboard(Odd, phi_o, phi); - ComplexD pDce = innerProduct(phi_e,dchi_e); - ComplexD pDco = innerProduct(phi_o,dchi_o); - ComplexD cDpe = innerProduct(chi_e,dphi_e); - ComplexD cDpo = innerProduct(chi_o,dphi_o); + Dwc.Meooe(chi_e, dchi_o); + Dwc.Meooe(chi_o, dchi_e); + Dwc.MeooeDag(phi_e, dphi_o); + Dwc.MeooeDag(phi_o, dphi_e); - std::cout< seeds2({5,6,7,8}); - GridParallelRNG pRNG2(&Grid); pRNG2.SeedFixedIntegers(seeds2); + std::vector seeds2({5, 6, 7, 8}); + GridParallelRNG pRNG2(&Grid); + pRNG2.SeedFixedIntegers(seeds2); LatticeColourMatrix Omega(&Grid); LatticeColourMatrix ShiftedOmega(&Grid); - LatticeGaugeField U_prime(&Grid); U_prime=zero; - LatticeColourMatrix U_prime_mu(&Grid); U_prime_mu=zero; + LatticeGaugeField U_prime(&Grid); + U_prime = zero; + LatticeColourMatrix U_prime_mu(&Grid); + U_prime_mu = zero; SU::LieRandomize(pRNG2, Omega, 1.0); - for (int mu=0;mu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include + +int main(int argc, char **argv) { + using namespace Grid; + using namespace Grid::QCD; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunner HMCWrapper; // Uses the default minimum norm + typedef WilsonImplR FermionImplPolicy; + typedef WilsonCloverFermionR FermionAction; + typedef typename FermionAction::FermionField FermionField; + + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + + // Grid from the command line + TheHMC.Resources.AddFourDimGrid("gauge"); + // Possibile to create the module by hand + // hardcoding parameters or using a Reader + + + // Checkpointer definition + CheckpointerParameters CPparams; + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar; + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + // here there is too much indirection + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + RealD beta = 5.6 ; + WilsonGaugeActionR Waction(beta); + + // temporarily need a gauge field + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + LatticeGaugeField U(GridPtr); + + Real mass = 0.01; + Real csw = 1.0; + + FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass, csw); + + ConjugateGradient CG(1.0e-8, 2000); + + TwoFlavourEvenOddPseudoFermionAction Nf2(FermOp, CG, CG); + + // Set smearing (true/false), default: false + Nf2.is_smeared = false; + + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2); + + ActionLevel Level2(4); + Level2.push_back(&Waction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + ///////////////////////////////////////////////////////////// + + /* + double rho = 0.1; // smearing parameter + int Nsmear = 2; // number of smearing levels + Smear_Stout Stout(rho); + SmearedConfiguration SmearingPolicy( + UGrid, Nsmear, Stout); + */ + + // HMC parameters are serialisable + TheHMC.Parameters.MD.MDsteps = 20; + TheHMC.Parameters.MD.trajL = 1.0; + + TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + TheHMC.Run(); // no smearing + // TheHMC.Run(SmearingPolicy); // for smearing + + Grid_finalize(); + +} // main + + + + + + + diff --git a/tests/hmc/Test_hmc_WilsonCloverFermionGauge.cc b/tests/hmc/Test_hmc_WilsonCloverFermionGauge.cc new file mode 100644 index 00000000..322bb304 --- /dev/null +++ b/tests/hmc/Test_hmc_WilsonCloverFermionGauge.cc @@ -0,0 +1,126 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./tests/Test_hmc_WilsonFermionGauge.cc + +Copyright (C) 2017 + +Author: Guido Cossu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include + +int main(int argc, char **argv) +{ + using namespace Grid; + using namespace Grid::QCD; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunner HMCWrapper; // Uses the default minimum norm + typedef WilsonImplR FermionImplPolicy; + typedef WilsonCloverFermionR FermionAction; + typedef typename FermionAction::FermionField FermionField; + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + + // Grid from the command line + TheHMC.Resources.AddFourDimGrid("gauge"); + + // Checkpointer definition + CheckpointerParameters CPparams; + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar; + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + RealD beta = 5.6; + WilsonGaugeActionR Waction(beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + // temporarily need a gauge field + LatticeGaugeField U(GridPtr); + + Real mass = 0.01; + Real csw = 1.0; + + FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass, csw); + ConjugateGradient CG(1.0e-8, 5000); + + TwoFlavourPseudoFermionAction Nf2(FermOp, CG, CG); + + // Set smearing (true/false), default: false + Nf2.is_smeared = false; + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2); + + ActionLevel Level2(4); + Level2.push_back(&Waction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + ///////////////////////////////////////////////////////////// + + /* + double rho = 0.1; // smearing parameter + int Nsmear = 2; // number of smearing levels + Smear_Stout Stout(rho); + SmearedConfiguration SmearingPolicy( + UGrid, Nsmear, Stout); + */ + + // HMC parameters are serialisable + TheHMC.Parameters.MD.MDsteps = 20; + TheHMC.Parameters.MD.trajL = 1.0; + + TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + TheHMC.Run(); // no smearing + // TheHMC.Run(SmearingPolicy); // for smearing + + Grid_finalize(); + +} // main diff --git a/tests/qdpxx/Test_qdpxx_wilson.cc b/tests/qdpxx/Test_qdpxx_wilson.cc index a084ebad..29e9c9ce 100644 --- a/tests/qdpxx/Test_qdpxx_wilson.cc +++ b/tests/qdpxx/Test_qdpxx_wilson.cc @@ -274,10 +274,10 @@ public: Chroma::CloverFermActParams p; p.Mass = _mq; p.clovCoeffR = QDP::Real(1.0); - p.clovCoeffT = QDP::Real(1.0); + p.clovCoeffT = QDP::Real(2.0); p.u0 = QDP::Real(1.0); AnisoParam_t _apar; - _apar.anisoP = false; + _apar.anisoP = true; _apar.t_dir = 3; // in 4d _apar.xi_0 = 2.0; _apar.nu = 1.0; @@ -422,10 +422,15 @@ void calc_grid(ChromaAction action, Grid::QCD::LatticeGaugeField &Umu, Grid::QCD if (action == WilsonClover) { - Grid::RealD _csw = 1.0; + Grid::RealD _csw_r = 1.0; + Grid::RealD _csw_t = 2.0; WilsonAnisotropyCoefficients anis; - WilsonImplParams implParam; - Grid::QCD::WilsonCloverFermionR Wf(Umu, *UGrid, *UrbGrid, _mass, _csw); + anis.isAnisotropic = true; + anis.t_direction = 3; + anis.xi_0 = 2.0; + anis.nu = 1.0; + WilsonImplParams CloverImplParam; + Grid::QCD::WilsonCloverFermionR Wf(Umu, *UGrid, *UrbGrid, _mass, _csw_r, _csw_t, anis, CloverImplParam); Wf.ImportGauge(Umu); std::cout << Grid::GridLogMessage << " Calling Grid Wilson Clover Fermion multiply " << std::endl; From 7b42ac9982da4b9f6c9ae0934ccef62506672425 Mon Sep 17 00:00:00 2001 From: pretidav Date: Thu, 2 Nov 2017 21:58:16 +0100 Subject: [PATCH 071/620] added polyakov loop observable to the hmc --- lib/qcd/modules/ObservableModules.h | 13 ++++ lib/qcd/observables/hmc_observable.h | 2 + lib/qcd/observables/polyakov_loop.h | 68 +++++++++++++++++++ lib/qcd/utils/WilsonLoops.h | 23 +++++++ .../hmc/Test_hmc_WilsonCloverFermionGauge.cc | 3 + 5 files changed, 109 insertions(+) create mode 100644 lib/qcd/observables/polyakov_loop.h diff --git a/lib/qcd/modules/ObservableModules.h b/lib/qcd/modules/ObservableModules.h index 24511617..fbffc236 100644 --- a/lib/qcd/modules/ObservableModules.h +++ b/lib/qcd/modules/ObservableModules.h @@ -92,6 +92,19 @@ class PlaquetteMod: public ObservableModule, NoParameters> PlaquetteMod(): ObsBase(NoParameters()){} }; +template < class Impl > +class PolyakovMod: public ObservableModule, NoParameters>{ + typedef ObservableModule, NoParameters> ObsBase; + using ObsBase::ObsBase; // for constructors + + // acquire resource + virtual void initialize(){ + this->ObservablePtr.reset(new PolyakovLogger()); + } + public: + PolyakovMod(): ObsBase(NoParameters()){} +}; + template < class Impl > class TopologicalChargeMod: public ObservableModule, TopologyObsParameters>{ diff --git a/lib/qcd/observables/hmc_observable.h b/lib/qcd/observables/hmc_observable.h index db629ce7..fcf11774 100644 --- a/lib/qcd/observables/hmc_observable.h +++ b/lib/qcd/observables/hmc_observable.h @@ -45,5 +45,7 @@ class HmcObservable { #include "plaquette.h" #include "topological_charge.h" +#include "polyakov_loop.h" + #endif // HMC_OBSERVABLE_H diff --git a/lib/qcd/observables/polyakov_loop.h b/lib/qcd/observables/polyakov_loop.h new file mode 100644 index 00000000..d708b474 --- /dev/null +++ b/lib/qcd/observables/polyakov_loop.h @@ -0,0 +1,68 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./lib/qcd/modules/polyakov_line.h + +Copyright (C) 2017 + +Author: David Preti + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ + +#ifndef HMC_POLYAKOV_H +#define HMC_POLYAKOV_H + +namespace Grid { +namespace QCD { + +// this is only defined for a gauge theory +template +class PolyakovLogger : public HmcObservable { + public: + // here forces the Impl to be of gauge fields + // if not the compiler will complain + INHERIT_GIMPL_TYPES(Impl); + + // necessary for HmcObservable compatibility + typedef typename Impl::Field Field; + + void TrajectoryComplete(int traj, + Field &U, + GridSerialRNG &sRNG, + GridParallelRNG &pRNG) { + + ComplexD polyakov = WilsonLoops::avgPolyakovLoop(U); + + int def_prec = std::cout.precision(); + + std::cout << GridLogMessage + << std::setprecision(std::numeric_limits::digits10 + 1) + << "Polyakov Loop: [ " << traj << " ] "<< polyakov << std::endl; + + std::cout.precision(def_prec); + + } +}; + +} // namespace QCD +} // namespace Grid + +#endif // HMC_POLYAKOV_H diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index 86609ffc..1e57015c 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -123,6 +123,29 @@ public: return sumplaq / vol / faces / Nc; // Nd , Nc dependent... FIXME } + + ////////////////////////////////////////////////// + // average over all x,y,z the temporal loop + ////////////////////////////////////////////////// + static ComplexD avgPolyakovLoop(const GaugeField &Umu) { //assume Nd=4 + GaugeMat Ut(Umu._grid), P(Umu._grid); + ComplexD out; + int T = Umu._grid->GlobalDimensions()[3]; + int X = Umu._grid->GlobalDimensions()[0]; + int Y = Umu._grid->GlobalDimensions()[1]; + int Z = Umu._grid->GlobalDimensions()[2]; + + std::cout << X << Y << Z << T << std::endl; + Ut = peekLorentz(Umu,3); //Select temporal direction + P = Ut; + for (int t=1;t PlaqObs; TheHMC.Resources.AddObservable(); + + typedef PolyakovMod PolyakovObs; + TheHMC.Resources.AddObservable(); ////////////////////////////////////////////// ///////////////////////////////////////////////////////////// From e0f13495245cfed766448a0c72d522813c426ce2 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 3 Nov 2017 09:22:41 +0000 Subject: [PATCH 072/620] QedFVol: Undo optimisation of charged propagator --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 131 +++++++++++------- 1 file changed, 82 insertions(+), 49 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 3aaf3d5e..1b901bf1 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -151,25 +151,23 @@ void TChargedProp::execute(void) buf = GFSrc; momD1(buf, fft); buf = -G*buf; - fft.FFT_dim(propQ, buf, env().getNd()-1, FFT::backward); + fft.FFT_all_dim(propQ, buf, FFT::backward); // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) buf = -buf; momD1(buf, fft); propSun = G*buf; - fft.FFT_dim(propSun, propSun, env().getNd()-1, FFT::backward); + fft.FFT_all_dim(propSun, propSun, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); buf = -G*buf; - fft.FFT_dim(propTad, buf, env().getNd()-1, FFT::backward); - - // full charged scalar propagator - buf = GFSrc; - fft.FFT_dim(buf, buf, env().getNd()-1, FFT::backward); - prop = buf + q*propQ + q*q*propSun + q*q*propTad; + fft.FFT_all_dim(propTad, buf, FFT::backward); + // full charged scalar propagator + prop = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; + // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -186,59 +184,94 @@ void TChargedProp::execute(void) << filename << "'..." << std::endl; CorrWriter writer(filename); - // std::vector vecBuf; - std::vector result, result0, resultQ, resultSun, resultTad; - result.resize(env().getGrid()->_ldimensions[env().getNd()-1]); - result0.resize(env().getGrid()->_ldimensions[env().getNd()-1]); - resultQ.resize(env().getGrid()->_ldimensions[env().getNd()-1]); - resultSun.resize(env().getGrid()->_ldimensions[env().getNd()-1]); - resultTad.resize(env().getGrid()->_ldimensions[env().getNd()-1]); + std::vector vecBuf; + std::vector result; write(writer, "charge", q); write(writer, "mass", par().mass); - TComplex site; - std::vector whichmom; - whichmom.resize(env().getNd()); - + // Write full propagator + buf = prop; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - whichmom[j] = mom[j]; + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } } - - for (unsigned int t = 0; t < env().getGrid()->_ldimensions[env().getNd()-1]; ++t) + sliceSum(buf, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) { - whichmom[env().getNd()-1] = t; - // Write full propagator - peekSite(site, prop, whichmom); - result[t]=TensorRemove(site); - // Write free propagator - peekSite(site, buf, whichmom); - result0[t]=TensorRemove(site); - // Write propagator O(q) term - peekSite(site, propQ, whichmom); - resultQ[t]=TensorRemove(site); - // Write propagator sunset term - peekSite(site, propSun, whichmom); - resultSun[t]=TensorRemove(site); - // Write propagator tadpole term - peekSite(site, propTad, whichmom); - resultTad[t]=TensorRemove(site); + result[t] = TensorRemove(vecBuf[t]); } write(writer, "prop", result); - write(writer, "prop_0", result0); - write(writer, "prop_Q", resultQ); - write(writer, "prop_Sun", resultSun); - write(writer, "prop_Tad", resultTad); + + // Write free propagator + buf = *prop0_; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_0", result); + + // Write propagator O(q) term + buf = propQ; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Q", result); + + // Write propagator sunset term + buf = propSun; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Sun", result); + + // Write propagator tadpole term + buf = propTad; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Tad", result); } } - - std::vector mask(env().getNd(),1); - mask[env().getNd()-1] = 0; - fft.FFT_dim_mask(prop, prop, mask, FFT::backward); - fft.FFT_dim_mask(propQ, propQ, mask, FFT::backward); - fft.FFT_dim_mask(propSun, propSun, mask, FFT::backward); - fft.FFT_dim_mask(propTad, propTad, mask, FFT::backward); } void TChargedProp::momD1(ScalarField &s, FFT &fft) From c645d33db5a6bab5e3255c0dd2287e7f26bf849c Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 3 Nov 2017 10:59:26 +0000 Subject: [PATCH 073/620] QedFVol: Redo optimisation of charged propagator, and fix I/O bug --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 131 +++++++----------- 1 file changed, 49 insertions(+), 82 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 1b901bf1..cb7e6c79 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -151,23 +151,25 @@ void TChargedProp::execute(void) buf = GFSrc; momD1(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propQ, buf, FFT::backward); + fft.FFT_dim(propQ, buf, env().getNd()-1, FFT::backward); // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) buf = -buf; momD1(buf, fft); propSun = G*buf; - fft.FFT_all_dim(propSun, propSun, FFT::backward); + fft.FFT_dim(propSun, propSun, env().getNd()-1, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propTad, buf, FFT::backward); - - // full charged scalar propagator - prop = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; + fft.FFT_dim(propTad, buf, env().getNd()-1, FFT::backward); + // full charged scalar propagator + buf = GFSrc; + fft.FFT_dim(buf, buf, env().getNd()-1, FFT::backward); + prop = buf + q*propQ + q*q*propSun + q*q*propTad; + // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -184,94 +186,59 @@ void TChargedProp::execute(void) << filename << "'..." << std::endl; CorrWriter writer(filename); - std::vector vecBuf; - std::vector result; + // std::vector vecBuf; + std::vector result, result0, resultQ, resultSun, resultTad; + result.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + result0.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + resultQ.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + resultSun.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + resultTad.resize(env().getGrid()->_fdimensions[env().getNd()-1]); write(writer, "charge", q); write(writer, "mass", par().mass); - // Write full propagator - buf = prop; + TComplex site; + std::vector whichmom; + whichmom.resize(env().getNd()); + for (unsigned int j = 0; j < env().getNd()-1; ++j) { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } + whichmom[j] = mom[j]; } - sliceSum(buf, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + + for (unsigned int t = 0; t < env().getGrid()->_fdimensions[env().getNd()-1]; ++t) { - result[t] = TensorRemove(vecBuf[t]); + whichmom[env().getNd()-1] = t; + // Write full propagator + peekSite(site, prop, whichmom); + result[t]=TensorRemove(site); + // Write free propagator + peekSite(site, buf, whichmom); + result0[t]=TensorRemove(site); + // Write propagator O(q) term + peekSite(site, propQ, whichmom); + resultQ[t]=TensorRemove(site); + // Write propagator sunset term + peekSite(site, propSun, whichmom); + resultSun[t]=TensorRemove(site); + // Write propagator tadpole term + peekSite(site, propTad, whichmom); + resultTad[t]=TensorRemove(site); } write(writer, "prop", result); - - // Write free propagator - buf = *prop0_; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_0", result); - - // Write propagator O(q) term - buf = propQ; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Q", result); - - // Write propagator sunset term - buf = propSun; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Sun", result); - - // Write propagator tadpole term - buf = propTad; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Tad", result); + write(writer, "prop_0", result0); + write(writer, "prop_Q", resultQ); + write(writer, "prop_Sun", resultSun); + write(writer, "prop_Tad", resultTad); } } + + std::vector mask(env().getNd(),1); + mask[env().getNd()-1] = 0; + fft.FFT_dim_mask(prop, prop, mask, FFT::backward); + fft.FFT_dim_mask(propQ, propQ, mask, FFT::backward); + fft.FFT_dim_mask(propSun, propSun, mask, FFT::backward); + fft.FFT_dim_mask(propTad, propTad, mask, FFT::backward); } void TChargedProp::momD1(ScalarField &s, FFT &fft) From 9f2a57e334876d347e8c7d5c8a4eb83228bed9ae Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 3 Nov 2017 13:10:11 +0000 Subject: [PATCH 074/620] QedFVol: Undo optimisation of scalar VP, to reduce memory requirements --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 131 ++++++++++++++++----- 1 file changed, 103 insertions(+), 28 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 297a823d..4d923802 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -144,19 +144,13 @@ void TScalarVP::execute(void) } // Open output files if necessary - std::vector vecBuf; - std::vector result; - ScalarField vpPhase(env().getGrid()); std::vector writer, writer0, writerD; - std::vector momphases; if (!par().output.empty()) { - LOG(Message) << "Preparing output files..." << std::endl; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { std::vector mom = strToVec(par().outputMom[i_p]); - // Open output files std::string filename = par().output + "_" + std::to_string(mom[0]) + std::to_string(mom[1]) + std::to_string(mom[2]) @@ -186,20 +180,11 @@ void TScalarVP::execute(void) write(*writer0[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); write(*writerD[i_p], "charge", q); write(*writerD[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - - // Calculate phase factors - vpPhase = Complex(1.0,0.0); - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*(*phase_[j]); - } - } - vpPhase = adj(vpPhase); - momphases.push_back(vpPhase); } } + std::vector vecBuf; + std::vector result; + ScalarField vpPhase(env().getGrid()); // Do contractions for (unsigned int nu = 0; nu < env().getNd(); ++nu) @@ -222,9 +207,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = freeVpTensor[mu][nu]*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = freeVpTensor[mu][nu]; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -250,9 +244,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -278,9 +281,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -304,9 +316,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -329,9 +350,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -355,9 +385,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -380,9 +419,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -409,9 +457,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -437,9 +494,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = tmp_vp*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = tmp_vp; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -455,9 +521,18 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { + std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = vpTensor[mu][nu]*momphases[i_p]; + mom = strToVec(par().outputMom[i_p]); + vpPhase = vpTensor[mu][nu]; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*adj(*phase_[j]); + } + } sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) From 95af55128e1c85bdc3028b8012c5f169fa2ef379 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 3 Nov 2017 18:46:16 +0000 Subject: [PATCH 075/620] =?UTF-8?q?QedFVol:=20Redo=20optimisation=20of=20s?= =?UTF-8?q?calar=20VP=20(extra=20memory=20requirements=20were=20not=20the?= =?UTF-8?q?=20problem),=20and=20undo=20optimisation=20of=20charged=20propa?= =?UTF-8?q?gator=20(which=20seemed=20to=20be=20causing=20HDF5=20errors,=20?= =?UTF-8?q?although=20I=20don=E2=80=99t=20know=20why).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 131 +++++++++++------- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 131 ++++-------------- 2 files changed, 110 insertions(+), 152 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index cb7e6c79..1b901bf1 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -151,25 +151,23 @@ void TChargedProp::execute(void) buf = GFSrc; momD1(buf, fft); buf = -G*buf; - fft.FFT_dim(propQ, buf, env().getNd()-1, FFT::backward); + fft.FFT_all_dim(propQ, buf, FFT::backward); // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) buf = -buf; momD1(buf, fft); propSun = G*buf; - fft.FFT_dim(propSun, propSun, env().getNd()-1, FFT::backward); + fft.FFT_all_dim(propSun, propSun, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); buf = -G*buf; - fft.FFT_dim(propTad, buf, env().getNd()-1, FFT::backward); - - // full charged scalar propagator - buf = GFSrc; - fft.FFT_dim(buf, buf, env().getNd()-1, FFT::backward); - prop = buf + q*propQ + q*q*propSun + q*q*propTad; + fft.FFT_all_dim(propTad, buf, FFT::backward); + // full charged scalar propagator + prop = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; + // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -186,59 +184,94 @@ void TChargedProp::execute(void) << filename << "'..." << std::endl; CorrWriter writer(filename); - // std::vector vecBuf; - std::vector result, result0, resultQ, resultSun, resultTad; - result.resize(env().getGrid()->_fdimensions[env().getNd()-1]); - result0.resize(env().getGrid()->_fdimensions[env().getNd()-1]); - resultQ.resize(env().getGrid()->_fdimensions[env().getNd()-1]); - resultSun.resize(env().getGrid()->_fdimensions[env().getNd()-1]); - resultTad.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + std::vector vecBuf; + std::vector result; write(writer, "charge", q); write(writer, "mass", par().mass); - TComplex site; - std::vector whichmom; - whichmom.resize(env().getNd()); - + // Write full propagator + buf = prop; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - whichmom[j] = mom[j]; + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } } - - for (unsigned int t = 0; t < env().getGrid()->_fdimensions[env().getNd()-1]; ++t) + sliceSum(buf, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) { - whichmom[env().getNd()-1] = t; - // Write full propagator - peekSite(site, prop, whichmom); - result[t]=TensorRemove(site); - // Write free propagator - peekSite(site, buf, whichmom); - result0[t]=TensorRemove(site); - // Write propagator O(q) term - peekSite(site, propQ, whichmom); - resultQ[t]=TensorRemove(site); - // Write propagator sunset term - peekSite(site, propSun, whichmom); - resultSun[t]=TensorRemove(site); - // Write propagator tadpole term - peekSite(site, propTad, whichmom); - resultTad[t]=TensorRemove(site); + result[t] = TensorRemove(vecBuf[t]); } write(writer, "prop", result); - write(writer, "prop_0", result0); - write(writer, "prop_Q", resultQ); - write(writer, "prop_Sun", resultSun); - write(writer, "prop_Tad", resultTad); + + // Write free propagator + buf = *prop0_; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_0", result); + + // Write propagator O(q) term + buf = propQ; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Q", result); + + // Write propagator sunset term + buf = propSun; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Sun", result); + + // Write propagator tadpole term + buf = propTad; + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + buf = buf*adj(*phase_[j]); + } + } + sliceSum(buf, vecBuf, Tp); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + write(writer, "prop_Tad", result); } } - - std::vector mask(env().getNd(),1); - mask[env().getNd()-1] = 0; - fft.FFT_dim_mask(prop, prop, mask, FFT::backward); - fft.FFT_dim_mask(propQ, propQ, mask, FFT::backward); - fft.FFT_dim_mask(propSun, propSun, mask, FFT::backward); - fft.FFT_dim_mask(propTad, propTad, mask, FFT::backward); } void TChargedProp::momD1(ScalarField &s, FFT &fft) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 4d923802..297a823d 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -144,13 +144,19 @@ void TScalarVP::execute(void) } // Open output files if necessary + std::vector vecBuf; + std::vector result; + ScalarField vpPhase(env().getGrid()); std::vector writer, writer0, writerD; + std::vector momphases; if (!par().output.empty()) { + LOG(Message) << "Preparing output files..." << std::endl; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { std::vector mom = strToVec(par().outputMom[i_p]); + // Open output files std::string filename = par().output + "_" + std::to_string(mom[0]) + std::to_string(mom[1]) + std::to_string(mom[2]) @@ -180,11 +186,20 @@ void TScalarVP::execute(void) write(*writer0[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); write(*writerD[i_p], "charge", q); write(*writerD[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + + // Calculate phase factors + vpPhase = Complex(1.0,0.0); + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*(*phase_[j]); + } + } + vpPhase = adj(vpPhase); + momphases.push_back(vpPhase); } } - std::vector vecBuf; - std::vector result; - ScalarField vpPhase(env().getGrid()); // Do contractions for (unsigned int nu = 0; nu < env().getNd(); ++nu) @@ -207,18 +222,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = freeVpTensor[mu][nu]; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = freeVpTensor[mu][nu]*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -244,18 +250,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -281,18 +278,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -316,18 +304,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -350,18 +329,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -385,18 +355,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -419,18 +380,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -457,18 +409,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -494,18 +437,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = tmp_vp; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -521,18 +455,9 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - std::vector mom; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - mom = strToVec(par().outputMom[i_p]); - vpPhase = vpTensor[mu][nu]; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - vpPhase = vpPhase*adj(*phase_[j]); - } - } + vpPhase = vpTensor[mu][nu]*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) From c79606a5dc4acfc4ba1453262b344031bee8a07b Mon Sep 17 00:00:00 2001 From: pretidav Date: Fri, 3 Nov 2017 22:46:32 +0100 Subject: [PATCH 076/620] Test production code wilson clover. Still missing QObs measurement on-the-fly. --- lib/qcd/utils/WilsonLoops.h | 1 - tests/hmc/Test_hmc_WCFG_Production.cc | 210 ++++++++++++++++++++++++++ 2 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 tests/hmc/Test_hmc_WCFG_Production.cc diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index 1e57015c..cdd76ecc 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -135,7 +135,6 @@ public: int Y = Umu._grid->GlobalDimensions()[1]; int Z = Umu._grid->GlobalDimensions()[2]; - std::cout << X << Y << Z << T << std::endl; Ut = peekLorentz(Umu,3); //Select temporal direction P = Ut; for (int t=1;t + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include + + +namespace Grid{ + struct FermionParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(FermionParameters, + double, mass, + double, csw, + double, StoppingCondition, + int, MaxCGIterations, + bool, ApplySmearing); + }; + + + struct WilsonCloverHMCParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverHMCParameters, + double, gauge_beta, + FermionParameters, WilsonClover) + + template + WilsonCloverHMCParameters(Reader& Reader){ + read(Reader, "Action", *this); + } + }; + + struct SmearingParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(SmearingParameters, + double, rho, + Integer, Nsmear) + + template + SmearingParameters(Reader& Reader){ + read(Reader, "StoutSmearing", *this); + } + + }; + + +} + +int main(int argc, char **argv) +{ + using namespace Grid; + using namespace Grid::QCD; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunner HMCWrapper; // Uses the default minimum norm + typedef WilsonImplR FermionImplPolicy; + typedef WilsonCloverFermionR FermionAction; + typedef typename FermionAction::FermionField FermionField; + typedef Grid::JSONReader Serialiser; + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + + // Grid from the command line + TheHMC.ReadCommandLine(argc, argv); + if (TheHMC.ParameterFile.empty()){ + std::cout << "Input file not specified." + << "Use --ParameterFile option in the command line.\nAborting" + << std::endl; + exit(1); + } + Serialiser Reader(TheHMC.ParameterFile); + WilsonCloverHMCParameters MyParams(Reader); + + // Apply smearing to the fermionic action + bool ApplySmearing = MyParams.WilsonClover.ApplySmearing; + + TheHMC.Resources.AddFourDimGrid("gauge"); + + // Checkpointer definition + CheckpointerParameters CPparams(Reader); + + /* + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + */ + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar(Reader); + /* + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + */ + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + + typedef PolyakovMod PolyakovObs; + TheHMC.Resources.AddObservable(); + + //typedef TopologicalChargeMod QObs; + //TopologyObsParameters TopParams(Reader); + //TheHMC.Resources.AddObservable(TopParams); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + + //RealD beta = 5.6; + WilsonGaugeActionR Waction(MyParams.gauge_beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + // temporarily need a gauge field + LatticeGaugeField U(GridPtr); + + //Real mass = 0.01; + //Real csw = 1.0; + + Real mass = MyParams.WilsonClover.mass; + Real csw = MyParams.WilsonClover.csw; + + std::cout << "mass and csw" << mass << " and " << csw << std::endl; + + FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass, csw, csw); + ConjugateGradient CG(MyParams.WilsonClover.StoppingCondition, MyParams.WilsonClover.MaxCGIterations); + TwoFlavourPseudoFermionAction Nf2(FermOp, CG, CG); + + // Set smearing (true/false), default: false + Nf2.is_smeared = ApplySmearing; + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2); + + ActionLevel Level2(4); + Level2.push_back(&Waction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + ///////////////////////////////////////////////////////////// + + + /* + double rho = 0.1; // smearing parameter + int Nsmear = 2; // number of smearing levels + Smear_Stout Stout(rho); + SmearedConfiguration SmearingPolicy( + UGrid, Nsmear, Stout); + */ + + // HMC parameters are serialisable + + TheHMC.Parameters.initialize(Reader); + //TheHMC.Parameters.MD.MDsteps = 20; + //TheHMC.Parameters.MD.trajL = 1.0; + + if (ApplySmearing){ + SmearingParameters SmPar(Reader); + //double rho = 0.1; // smearing parameter + //int Nsmear = 3; // number of smearing levels + Smear_Stout Stout(SmPar.rho); + SmearedConfiguration SmearingPolicy(GridPtr, SmPar.Nsmear, Stout); + TheHMC.Run(SmearingPolicy); // for smearing + } else { + TheHMC.Run(); // no smearing + } + + //TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + //TheHMC.Run(); // no smearing + // TheHMC.Run(SmearingPolicy); // for smearing + + Grid_finalize(); + +} // main From 915f610da0c986c43ee706f8716ebbb453b0342c Mon Sep 17 00:00:00 2001 From: pretidav Date: Sat, 4 Nov 2017 01:17:06 +0100 Subject: [PATCH 077/620] clover 2indexSymm hmc production test created. clover 2indexAsymm and clover mixed to be filled. --- lib/qcd/action/fermion/Fermion.h | 17 ++ lib/qcd/action/fermion/FermionOperatorImpl.h | 4 + lib/qcd/action/fermion/WilsonCloverFermion.cc | 6 +- tests/hmc/Test_hmc_WC2ASFG_Production.cc | 129 +++++++++++ tests/hmc/Test_hmc_WC2SFG_Production.cc | 212 ++++++++++++++++++ tests/hmc/Test_hmc_WCMixedRepFG_Production.cc | 139 ++++++++++++ 6 files changed, 504 insertions(+), 3 deletions(-) create mode 100644 tests/hmc/Test_hmc_WC2ASFG_Production.cc create mode 100644 tests/hmc/Test_hmc_WC2SFG_Production.cc create mode 100644 tests/hmc/Test_hmc_WCMixedRepFG_Production.cc diff --git a/lib/qcd/action/fermion/Fermion.h b/lib/qcd/action/fermion/Fermion.h index bc8397ba..2a008cb7 100644 --- a/lib/qcd/action/fermion/Fermion.h +++ b/lib/qcd/action/fermion/Fermion.h @@ -106,6 +106,10 @@ typedef WilsonFermion WilsonTwoIndexSymmetricFermi typedef WilsonFermion WilsonTwoIndexSymmetricFermionF; typedef WilsonFermion WilsonTwoIndexSymmetricFermionD; +typedef WilsonFermion WilsonTwoIndexAntiSymmetricFermionR; +typedef WilsonFermion WilsonTwoIndexAntiSymmetricFermionF; +typedef WilsonFermion WilsonTwoIndexAntiSymmetricFermionD; + // Twisted mass fermion typedef WilsonTMFermion WilsonTMFermionR; typedef WilsonTMFermion WilsonTMFermionF; @@ -116,6 +120,19 @@ typedef WilsonCloverFermion WilsonCloverFermionR; typedef WilsonCloverFermion WilsonCloverFermionF; typedef WilsonCloverFermion WilsonCloverFermionD; +typedef WilsonCloverFermion WilsonCloverAdjFermionR; +typedef WilsonCloverFermion WilsonCloverAdjFermionF; +typedef WilsonCloverFermion WilsonCloverAdjFermionD; + +typedef WilsonCloverFermion WilsonCloverTwoIndexSymmetricFermionR; +typedef WilsonCloverFermion WilsonCloverTwoIndexSymmetricFermionF; +typedef WilsonCloverFermion WilsonCloverTwoIndexSymmetricFermionD; + +typedef WilsonCloverFermion WilsonCloverTwoIndexAntiSymmetricFermionR; +typedef WilsonCloverFermion WilsonCloverTwoIndexAntiSymmetricFermionF; +typedef WilsonCloverFermion WilsonCloverTwoIndexAntiSymmetricFermionD; + +// Domain Wall fermions typedef DomainWallFermion DomainWallFermionR; typedef DomainWallFermion DomainWallFermionF; typedef DomainWallFermion DomainWallFermionD; diff --git a/lib/qcd/action/fermion/FermionOperatorImpl.h b/lib/qcd/action/fermion/FermionOperatorImpl.h index 89bd9a15..85d6ffea 100644 --- a/lib/qcd/action/fermion/FermionOperatorImpl.h +++ b/lib/qcd/action/fermion/FermionOperatorImpl.h @@ -1004,6 +1004,10 @@ typedef WilsonImpl Wilso typedef WilsonImpl WilsonTwoIndexSymmetricImplF; // Float typedef WilsonImpl WilsonTwoIndexSymmetricImplD; // Double +typedef WilsonImpl WilsonTwoIndexAntiSymmetricImplR; // Real.. whichever prec +typedef WilsonImpl WilsonTwoIndexAntiSymmetricImplF; // Float +typedef WilsonImpl WilsonTwoIndexAntiSymmetricImplD; // Double + typedef DomainWallVec5dImpl DomainWallVec5dImplR; // Real.. whichever prec typedef DomainWallVec5dImpl DomainWallVec5dImplF; // Float typedef DomainWallVec5dImpl DomainWallVec5dImplD; // Double diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 3ec90e06..3c082446 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -235,9 +235,9 @@ void WilsonCloverFermion::MeeDeriv(GaugeField &mat, const FermionField &U, assert(0); // not implemented yet } -FermOpTemplateInstantiate(WilsonCloverFermion); // now only for the fundamental representation -//AdjointFermOpTemplateInstantiate(WilsonCloverFermion); -//TwoIndexFermOpTemplateInstantiate(WilsonCloverFermion); +FermOpTemplateInstantiate(WilsonCloverFermion); +AdjointFermOpTemplateInstantiate(WilsonCloverFermion); +TwoIndexFermOpTemplateInstantiate(WilsonCloverFermion); //GparityFermOpTemplateInstantiate(WilsonCloverFermion); } } diff --git a/tests/hmc/Test_hmc_WC2ASFG_Production.cc b/tests/hmc/Test_hmc_WC2ASFG_Production.cc new file mode 100644 index 00000000..b0d1d3a4 --- /dev/null +++ b/tests/hmc/Test_hmc_WC2ASFG_Production.cc @@ -0,0 +1,129 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./tests/Test_hmc_WilsonAdjointFermionGauge.cc + +Copyright (C) 2015 + +Author: Peter Boyle +Author: neo + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include "Grid/Grid.h" + +int main(int argc, char **argv) { + using namespace Grid; + using namespace Grid::QCD; + + // Here change the allowed (higher) representations + typedef Representations< FundamentalRepresentation, TwoIndexAntiSymmetricRepresentation > TheRepresentations; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunnerHirep HMCWrapper; + + typedef WilsonTwoIndexAntiSymmetricImplR FermionImplPolicy; // gauge field implemetation for the pseudofermions + typedef WilsonTwoIndexAntiSymmetricFermionR FermionAction; // type of lattice fermions (Wilson, DW, ...) + typedef typename FermionAction::FermionField FermionField; + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + + // Grid from the command line + TheHMC.Resources.AddFourDimGrid("gauge"); + // Possibile to create the module by hand + // hardcoding parameters or using a Reader + + + // Checkpointer definition + CheckpointerParameters CPparams; + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar; + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + RealD beta = 2.25 ; + WilsonGaugeActionR Waction(beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + // temporarily need a gauge field + TwoIndexSymmetricRepresentation::LatticeField U(GridPtr); + + Real mass = -0.95; + + // Can we define an overloaded operator that does not need U and initialises + // it with zeroes? + FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass); + + ConjugateGradient CG(1.0e-8, 2000, false); + + TwoFlavourPseudoFermionAction Nf2(FermOp, CG, CG); + + // Set smearing (true/false), default: false + Nf2.is_smeared = false; + + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2); + + ActionLevel Level2(4); + Level2.push_back(&Waction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + + // HMC parameters are serialisable + TheHMC.Parameters.MD.MDsteps = 20; + TheHMC.Parameters.MD.trajL = 1.0; + + TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + TheHMC.Run(); // no smearing + // TheHMC.Run(SmearingPolicy); // for smearing + + Grid_finalize(); + +} // main + + diff --git a/tests/hmc/Test_hmc_WC2SFG_Production.cc b/tests/hmc/Test_hmc_WC2SFG_Production.cc new file mode 100644 index 00000000..8d5fc458 --- /dev/null +++ b/tests/hmc/Test_hmc_WC2SFG_Production.cc @@ -0,0 +1,212 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./tests/Test_hmc_WilsonFermionGauge.cc + +Copyright (C) 2017 + +Author: Guido Cossu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include + + +namespace Grid{ + struct FermionParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(FermionParameters, + double, mass, + double, csw, + double, StoppingCondition, + int, MaxCGIterations, + bool, ApplySmearing); + }; + + + struct WilsonCloverHMCParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverHMCParameters, + double, gauge_beta, + FermionParameters, WilsonClover) + + template + WilsonCloverHMCParameters(Reader& Reader){ + read(Reader, "Action", *this); + } + }; + + struct SmearingParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(SmearingParameters, + double, rho, + Integer, Nsmear) + + template + SmearingParameters(Reader& Reader){ + read(Reader, "StoutSmearing", *this); + } + + }; + + +} + +int main(int argc, char **argv) +{ + using namespace Grid; + using namespace Grid::QCD; + + typedef Representations< FundamentalRepresentation, TwoIndexSymmetricRepresentation > TheRepresentations; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunnerHirep HMCWrapper; // Uses the default minimum norm + typedef WilsonTwoIndexSymmetricImplR FermionImplPolicy; // gauge field implemetation for the pseudofermions + typedef WilsonCloverTwoIndexSymmetricFermionR FermionAction; // type of lattice fermions (Wilson, DW, ...) + typedef typename FermionAction::FermionField FermionField; + typedef Grid::JSONReader Serialiser; + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + + // Grid from the command line + TheHMC.ReadCommandLine(argc, argv); + if (TheHMC.ParameterFile.empty()){ + std::cout << "Input file not specified." + << "Use --ParameterFile option in the command line.\nAborting" + << std::endl; + exit(1); + } + Serialiser Reader(TheHMC.ParameterFile); + WilsonCloverHMCParameters MyParams(Reader); + + // Apply smearing to the fermionic action + bool ApplySmearing = MyParams.WilsonClover.ApplySmearing; + + TheHMC.Resources.AddFourDimGrid("gauge"); + + // Checkpointer definition + CheckpointerParameters CPparams(Reader); + + /* + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + */ + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar(Reader); + /* + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + */ + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + + typedef PolyakovMod PolyakovObs; + TheHMC.Resources.AddObservable(); + + //typedef TopologicalChargeMod QObs; + //TopologyObsParameters TopParams(Reader); + //TheHMC.Resources.AddObservable(TopParams); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + + //RealD beta = 5.6; + WilsonGaugeActionR Waction(MyParams.gauge_beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + // temporarily need a gauge field + TwoIndexSymmetricRepresentation::LatticeField U(GridPtr); + + //Real mass = 0.01; + //Real csw = 1.0; + + Real mass = MyParams.WilsonClover.mass; + Real csw = MyParams.WilsonClover.csw; + + std::cout << "mass and csw" << mass << " and " << csw << std::endl; + + FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass, csw, csw); + ConjugateGradient CG(MyParams.WilsonClover.StoppingCondition, MyParams.WilsonClover.MaxCGIterations); + TwoFlavourPseudoFermionAction Nf2(FermOp, CG, CG); + + // Set smearing (true/false), default: false + Nf2.is_smeared = ApplySmearing; + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2); + + ActionLevel Level2(4); + Level2.push_back(&Waction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + ///////////////////////////////////////////////////////////// + + + /* + double rho = 0.1; // smearing parameter + int Nsmear = 2; // number of smearing levels + Smear_Stout Stout(rho); + SmearedConfiguration SmearingPolicy( + UGrid, Nsmear, Stout); + */ + + // HMC parameters are serialisable + + TheHMC.Parameters.initialize(Reader); + //TheHMC.Parameters.MD.MDsteps = 20; + //TheHMC.Parameters.MD.trajL = 1.0; + + if (ApplySmearing){ + SmearingParameters SmPar(Reader); + //double rho = 0.1; // smearing parameter + //int Nsmear = 3; // number of smearing levels + Smear_Stout Stout(SmPar.rho); + SmearedConfiguration SmearingPolicy(GridPtr, SmPar.Nsmear, Stout); + TheHMC.Run(SmearingPolicy); // for smearing + } else { + TheHMC.Run(); // no smearing + } + + //TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + //TheHMC.Run(); // no smearing + // TheHMC.Run(SmearingPolicy); // for smearing + + Grid_finalize(); + +} // main diff --git a/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc b/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc new file mode 100644 index 00000000..b54345cf --- /dev/null +++ b/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc @@ -0,0 +1,139 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./tests/Test_hmc_WilsonAdjointFermionGauge.cc + +Copyright (C) 2015 + +Author: Peter Boyle +Author: Peter Boyle +Author: neo +Author: paboyle + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include "Grid/Grid.h" + + + + +int main(int argc, char **argv) { + using namespace Grid; + using namespace Grid::QCD; + + // Here change the allowed (higher) representations + typedef Representations< FundamentalRepresentation, AdjointRepresentation , TwoIndexSymmetricRepresentation> TheRepresentations; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunnerHirep HMCWrapper; + + typedef WilsonAdjImplR AdjImplPolicy; // gauge field implemetation for the pseudofermions + typedef WilsonAdjFermionR AdjFermionAction; // type of lattice fermions (Wilson, DW, ...) + typedef WilsonTwoIndexSymmetricImplR SymmImplPolicy; + typedef WilsonTwoIndexSymmetricFermionR SymmFermionAction; + + + typedef typename AdjFermionAction::FermionField AdjFermionField; + typedef typename SymmFermionAction::FermionField SymmFermionField; + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + + // Grid from the command line + TheHMC.Resources.AddFourDimGrid("gauge"); + // Possibile to create the module by hand + // hardcoding parameters or using a Reader + + + // Checkpointer definition + CheckpointerParameters CPparams; + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar; + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + RealD beta = 2.25 ; + WilsonGaugeActionR Waction(beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + // temporarily need a gauge field + AdjointRepresentation::LatticeField UA(GridPtr); + TwoIndexSymmetricRepresentation::LatticeField US(GridPtr); + + Real adjoint_mass = -0.1; + Real symm_mass = -0.5; + AdjFermionAction AdjFermOp(UA, *GridPtr, *GridRBPtr, adjoint_mass); + SymmFermionAction SymmFermOp(US, *GridPtr, *GridRBPtr, symm_mass); + + ConjugateGradient CG_adj(1.0e-8, 10000, false); + ConjugateGradient CG_symm(1.0e-8, 10000, false); + + // Pass two solvers: one for the force computation and one for the action + TwoFlavourPseudoFermionAction Nf2_Adj(AdjFermOp, CG_adj, CG_adj); + TwoFlavourPseudoFermionAction Nf2_Symm(SymmFermOp, CG_symm, CG_symm); + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2_Adj); + Level1.push_back(&Nf2_Symm); + + + ActionLevel Level2(4); + Level2.push_back(&Waction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + + // HMC parameters are serialisable + TheHMC.Parameters.MD.MDsteps = 20; + TheHMC.Parameters.MD.trajL = 1.0; + + TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + TheHMC.Run(); // no smearing + + Grid_finalize(); + +} // main + + From a4934292182ffa1e96a5ecad2062f3ce06727f1c Mon Sep 17 00:00:00 2001 From: pretidav Date: Sat, 4 Nov 2017 18:16:54 +0100 Subject: [PATCH 078/620] added Production tests for MixedRep, Adj, 2S, 2AS. Still missing QObs. The HMC is not printing correctly all the actions and forces. --- lib/qcd/action/fermion/FermionCore.h | 4 +- lib/qcd/action/fermion/WilsonKernelsHand.cc | 3 +- tests/hmc/Test_hmc_WC2ASFG_Production.cc | 162 +++++++++---- tests/hmc/Test_hmc_WCMixedRepFG_Production.cc | 215 ++++++++++++------ tests/hmc/Test_hmc_WCadjFG_Production.cc | 213 +++++++++++++++++ 5 files changed, 491 insertions(+), 106 deletions(-) create mode 100644 tests/hmc/Test_hmc_WCadjFG_Production.cc diff --git a/lib/qcd/action/fermion/FermionCore.h b/lib/qcd/action/fermion/FermionCore.h index 17006961..60632c3a 100644 --- a/lib/qcd/action/fermion/FermionCore.h +++ b/lib/qcd/action/fermion/FermionCore.h @@ -70,7 +70,9 @@ Author: Peter Boyle #define TwoIndexFermOpTemplateInstantiate(A) \ template class A; \ - template class A; + template class A; \ + template class A; \ + template class A; #define FermOp5dVecTemplateInstantiate(A) \ template class A; \ diff --git a/lib/qcd/action/fermion/WilsonKernelsHand.cc b/lib/qcd/action/fermion/WilsonKernelsHand.cc index 80b81714..aa6b5f6b 100644 --- a/lib/qcd/action/fermion/WilsonKernelsHand.cc +++ b/lib/qcd/action/fermion/WilsonKernelsHand.cc @@ -946,5 +946,6 @@ INSTANTIATE_THEM(DomainWallVec5dImplFH); INSTANTIATE_THEM(DomainWallVec5dImplDF); INSTANTIATE_THEM(ZDomainWallVec5dImplFH); INSTANTIATE_THEM(ZDomainWallVec5dImplDF); - +INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplF); +INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplD); }} diff --git a/tests/hmc/Test_hmc_WC2ASFG_Production.cc b/tests/hmc/Test_hmc_WC2ASFG_Production.cc index b0d1d3a4..d255ab5d 100644 --- a/tests/hmc/Test_hmc_WC2ASFG_Production.cc +++ b/tests/hmc/Test_hmc_WC2ASFG_Production.cc @@ -2,12 +2,11 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: ./tests/Test_hmc_WilsonAdjointFermionGauge.cc +Source file: ./tests/Test_hmc_WilsonFermionGauge.cc -Copyright (C) 2015 +Copyright (C) 2017 -Author: Peter Boyle -Author: neo +Author: Guido Cossu 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 @@ -27,103 +26,188 @@ See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include "Grid/Grid.h" +#include -int main(int argc, char **argv) { + +namespace Grid{ + struct FermionParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(FermionParameters, + double, mass, + double, csw, + double, StoppingCondition, + int, MaxCGIterations, + bool, ApplySmearing); + }; + + + struct WilsonCloverHMCParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverHMCParameters, + double, gauge_beta, + FermionParameters, WilsonClover) + + template + WilsonCloverHMCParameters(Reader& Reader){ + read(Reader, "Action", *this); + } + }; + + struct SmearingParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(SmearingParameters, + double, rho, + Integer, Nsmear) + + template + SmearingParameters(Reader& Reader){ + read(Reader, "StoutSmearing", *this); + } + + }; + + +} + +int main(int argc, char **argv) +{ using namespace Grid; using namespace Grid::QCD; - // Here change the allowed (higher) representations - typedef Representations< FundamentalRepresentation, TwoIndexAntiSymmetricRepresentation > TheRepresentations; + typedef Representations< FundamentalRepresentation, TwoIndexAntiSymmetricRepresentation > TheRepresentations; Grid_init(&argc, &argv); int threads = GridThread::GetThreads(); // here make a routine to print all the relevant information on the run std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; - // Typedefs to simplify notation - typedef GenericHMCRunnerHirep HMCWrapper; - + // Typedefs to simplify notation + typedef GenericHMCRunnerHirep HMCWrapper; // Uses the default minimum norm typedef WilsonTwoIndexAntiSymmetricImplR FermionImplPolicy; // gauge field implemetation for the pseudofermions - typedef WilsonTwoIndexAntiSymmetricFermionR FermionAction; // type of lattice fermions (Wilson, DW, ...) + typedef WilsonCloverTwoIndexAntiSymmetricFermionR FermionAction; // type of lattice fermions (Wilson, DW, ...) typedef typename FermionAction::FermionField FermionField; + typedef Grid::JSONReader Serialiser; //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: HMCWrapper TheHMC; // Grid from the command line - TheHMC.Resources.AddFourDimGrid("gauge"); - // Possibile to create the module by hand - // hardcoding parameters or using a Reader + TheHMC.ReadCommandLine(argc, argv); + if (TheHMC.ParameterFile.empty()){ + std::cout << "Input file not specified." + << "Use --ParameterFile option in the command line.\nAborting" + << std::endl; + exit(1); + } + Serialiser Reader(TheHMC.ParameterFile); + WilsonCloverHMCParameters MyParams(Reader); + // Apply smearing to the fermionic action + bool ApplySmearing = MyParams.WilsonClover.ApplySmearing; + + TheHMC.Resources.AddFourDimGrid("gauge"); // Checkpointer definition - CheckpointerParameters CPparams; + CheckpointerParameters CPparams(Reader); + + /* CPparams.config_prefix = "ckpoint_lat"; CPparams.rng_prefix = "ckpoint_rng"; CPparams.saveInterval = 5; CPparams.format = "IEEE64BIG"; + */ TheHMC.Resources.LoadNerscCheckpointer(CPparams); - RNGModuleParameters RNGpar; + RNGModuleParameters RNGpar(Reader); + /* RNGpar.serial_seeds = "1 2 3 4 5"; RNGpar.parallel_seeds = "6 7 8 9 10"; TheHMC.Resources.SetRNGSeeds(RNGpar); + */ + TheHMC.Resources.SetRNGSeeds(RNGpar); // Construct observables typedef PlaquetteMod PlaqObs; TheHMC.Resources.AddObservable(); + + typedef PolyakovMod PolyakovObs; + TheHMC.Resources.AddObservable(); + + //typedef TopologicalChargeMod QObs; + //TopologyObsParameters TopParams(Reader); + //TheHMC.Resources.AddObservable(TopParams); ////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // Collect actions, here use more encapsulation - // need wrappers of the fermionic classes + // need wrappers of the fermionic classes // that have a complex construction // standard - RealD beta = 2.25 ; - WilsonGaugeActionR Waction(beta); - - auto GridPtr = TheHMC.Resources.GetCartesian(); + + //RealD beta = 5.6; + WilsonGaugeActionR Waction(MyParams.gauge_beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); // temporarily need a gauge field - TwoIndexSymmetricRepresentation::LatticeField U(GridPtr); + TwoIndexAntiSymmetricRepresentation::LatticeField U(GridPtr); - Real mass = -0.95; + //Real mass = 0.01; + //Real csw = 1.0; - // Can we define an overloaded operator that does not need U and initialises - // it with zeroes? - FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass); + Real mass = MyParams.WilsonClover.mass; + Real csw = MyParams.WilsonClover.csw; - ConjugateGradient CG(1.0e-8, 2000, false); + std::cout << "mass and csw" << mass << " and " << csw << std::endl; + FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass, csw, csw); + ConjugateGradient CG(MyParams.WilsonClover.StoppingCondition, MyParams.WilsonClover.MaxCGIterations); TwoFlavourPseudoFermionAction Nf2(FermOp, CG, CG); // Set smearing (true/false), default: false - Nf2.is_smeared = false; + Nf2.is_smeared = ApplySmearing; - - // Collect actions - ActionLevel Level1(1); + // Collect actions + ActionLevel Level1(1); Level1.push_back(&Nf2); - ActionLevel Level2(4); + ActionLevel Level2(4); Level2.push_back(&Waction); TheHMC.TheAction.push_back(Level1); TheHMC.TheAction.push_back(Level2); + ///////////////////////////////////////////////////////////// - // HMC parameters are serialisable - TheHMC.Parameters.MD.MDsteps = 20; - TheHMC.Parameters.MD.trajL = 1.0; - TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file - TheHMC.Run(); // no smearing + /* + double rho = 0.1; // smearing parameter + int Nsmear = 2; // number of smearing levels + Smear_Stout Stout(rho); + SmearedConfiguration SmearingPolicy( + UGrid, Nsmear, Stout); + */ + + // HMC parameters are serialisable + + TheHMC.Parameters.initialize(Reader); + //TheHMC.Parameters.MD.MDsteps = 20; + //TheHMC.Parameters.MD.trajL = 1.0; + + if (ApplySmearing){ + SmearingParameters SmPar(Reader); + //double rho = 0.1; // smearing parameter + //int Nsmear = 3; // number of smearing levels + Smear_Stout Stout(SmPar.rho); + SmearedConfiguration SmearingPolicy(GridPtr, SmPar.Nsmear, Stout); + TheHMC.Run(SmearingPolicy); // for smearing + } else { + TheHMC.Run(); // no smearing + } + + //TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + //TheHMC.Run(); // no smearing // TheHMC.Run(SmearingPolicy); // for smearing Grid_finalize(); } // main - diff --git a/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc b/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc index b54345cf..a79452f4 100644 --- a/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc +++ b/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc @@ -32,6 +32,40 @@ directory #include "Grid/Grid.h" +namespace Grid{ + struct FermionParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(FermionParameters, + double, mass, + double, csw, + double, StoppingCondition, + int, MaxCGIterations, + bool, ApplySmearing); + }; + + struct WilsonCloverHMCParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverHMCParameters, + double, gauge_beta, + FermionParameters, WilsonCloverFund, + FermionParameters, WilsonCloverAS) + + template + WilsonCloverHMCParameters(Reader& Reader){ + read(Reader, "Action", *this); + } + }; + + struct SmearingParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(SmearingParameters, + double, rho, + Integer, Nsmear) + + template + SmearingParameters(Reader& Reader){ + read(Reader, "StoutSmearing", *this); + } + + }; +} int main(int argc, char **argv) { @@ -39,7 +73,7 @@ int main(int argc, char **argv) { using namespace Grid::QCD; // Here change the allowed (higher) representations - typedef Representations< FundamentalRepresentation, AdjointRepresentation , TwoIndexSymmetricRepresentation> TheRepresentations; + typedef Representations< FundamentalRepresentation, TwoIndexAntiSymmetricRepresentation> TheRepresentations; Grid_init(&argc, &argv); int threads = GridThread::GetThreads(); @@ -49,91 +83,142 @@ int main(int argc, char **argv) { // Typedefs to simplify notation typedef GenericHMCRunnerHirep HMCWrapper; - typedef WilsonAdjImplR AdjImplPolicy; // gauge field implemetation for the pseudofermions - typedef WilsonAdjFermionR AdjFermionAction; // type of lattice fermions (Wilson, DW, ...) - typedef WilsonTwoIndexSymmetricImplR SymmImplPolicy; - typedef WilsonTwoIndexSymmetricFermionR SymmFermionAction; + typedef WilsonImplR FundImplPolicy; + typedef WilsonCloverFermionR FundFermionAction; + typedef typename FundFermionAction::FermionField FundFermionField; + typedef WilsonTwoIndexAntiSymmetricImplR ASymmImplPolicy; + typedef WilsonCloverTwoIndexAntiSymmetricFermionR ASymmFermionAction; + typedef typename ASymmFermionAction::FermionField ASymmFermionField; - typedef typename AdjFermionAction::FermionField AdjFermionField; - typedef typename SymmFermionAction::FermionField SymmFermionField; - + typedef Grid::JSONReader Serialiser; //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: HMCWrapper TheHMC; - - // Grid from the command line - TheHMC.Resources.AddFourDimGrid("gauge"); - // Possibile to create the module by hand - // hardcoding parameters or using a Reader - - - // Checkpointer definition - CheckpointerParameters CPparams; - CPparams.config_prefix = "ckpoint_lat"; - CPparams.rng_prefix = "ckpoint_rng"; - CPparams.saveInterval = 5; - CPparams.format = "IEEE64BIG"; - TheHMC.Resources.LoadNerscCheckpointer(CPparams); - - RNGModuleParameters RNGpar; - RNGpar.serial_seeds = "1 2 3 4 5"; - RNGpar.parallel_seeds = "6 7 8 9 10"; - TheHMC.Resources.SetRNGSeeds(RNGpar); - - // Construct observables - typedef PlaquetteMod PlaqObs; - TheHMC.Resources.AddObservable(); - ////////////////////////////////////////////// - - ///////////////////////////////////////////////////////////// - // Collect actions, here use more encapsulation - // need wrappers of the fermionic classes - // that have a complex construction - // standard - RealD beta = 2.25 ; - WilsonGaugeActionR Waction(beta); + // Grid from the command line + TheHMC.ReadCommandLine(argc, argv); + if (TheHMC.ParameterFile.empty()){ + std::cout << "Input file not specified." + << "Use --ParameterFile option in the command line.\nAborting" + << std::endl; + exit(1); + } + Serialiser Reader(TheHMC.ParameterFile); + WilsonCloverHMCParameters MyParams(Reader); + + // Apply smearing to the fermionic action + bool ApplySmearingFund = MyParams.WilsonCloverFund.ApplySmearing; + bool ApplySmearingAS = MyParams.WilsonCloverAS.ApplySmearing; - auto GridPtr = TheHMC.Resources.GetCartesian(); - auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); - // temporarily need a gauge field - AdjointRepresentation::LatticeField UA(GridPtr); - TwoIndexSymmetricRepresentation::LatticeField US(GridPtr); + TheHMC.Resources.AddFourDimGrid("gauge"); + + // Checkpointer definition + CheckpointerParameters CPparams(Reader); + + /* + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + */ + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar(Reader); + /* + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + */ + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + + typedef PolyakovMod PolyakovObs; + TheHMC.Resources.AddObservable(); + + //typedef TopologicalChargeMod QObs; + //TopologyObsParameters TopParams(Reader); + //TheHMC.Resources.AddObservable(TopParams); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + + //RealD beta = 5.6; + WilsonGaugeActionR Waction(MyParams.gauge_beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + // temporarily need a gauge field + FundamentalRepresentation::LatticeField UF(GridPtr); + TwoIndexAntiSymmetricRepresentation::LatticeField UAS(GridPtr); - Real adjoint_mass = -0.1; - Real symm_mass = -0.5; - AdjFermionAction AdjFermOp(UA, *GridPtr, *GridRBPtr, adjoint_mass); - SymmFermionAction SymmFermOp(US, *GridPtr, *GridRBPtr, symm_mass); - ConjugateGradient CG_adj(1.0e-8, 10000, false); - ConjugateGradient CG_symm(1.0e-8, 10000, false); + Real Fundmass = MyParams.WilsonCloverFund.mass; + Real Fundcsw = MyParams.WilsonCloverFund.csw; + Real ASmass = MyParams.WilsonCloverAS.mass; + Real AScsw = MyParams.WilsonCloverAS.csw; - // Pass two solvers: one for the force computation and one for the action - TwoFlavourPseudoFermionAction Nf2_Adj(AdjFermOp, CG_adj, CG_adj); - TwoFlavourPseudoFermionAction Nf2_Symm(SymmFermOp, CG_symm, CG_symm); + + + std::cout << "Fund: mass and csw" << Fundmass << " and " << Fundcsw << std::endl; + std::cout << "AS : mass and csw" << ASmass << " and " << AScsw << std::endl; + + + FundFermionAction FundFermOp(UF, *GridPtr, *GridRBPtr, Fundmass, Fundcsw, Fundcsw); + ConjugateGradient CG_Fund(MyParams.WilsonCloverFund.StoppingCondition, MyParams.WilsonCloverFund.MaxCGIterations); + TwoFlavourPseudoFermionAction Nf2_Fund(FundFermOp, CG_Fund, CG_Fund); + + ASymmFermionAction ASFermOp(UAS, *GridPtr, *GridRBPtr, ASmass, AScsw, AScsw); + ConjugateGradient CG_AS(MyParams.WilsonCloverAS.StoppingCondition, MyParams.WilsonCloverAS.MaxCGIterations); + TwoFlavourPseudoFermionAction Nf2_AS(ASFermOp, CG_AS, CG_AS); + + Nf2_Fund.is_smeared = ApplySmearingFund; + Nf2_AS.is_smeared = ApplySmearingAS; + // Collect actions - ActionLevel Level1(1); - Level1.push_back(&Nf2_Adj); - Level1.push_back(&Nf2_Symm); + ActionLevel Level1(1); + Level1.push_back(&Nf2_Fund); + Level1.push_back(&Nf2_AS); - ActionLevel Level2(4); + ActionLevel Level2(4); Level2.push_back(&Waction); TheHMC.TheAction.push_back(Level1); TheHMC.TheAction.push_back(Level2); - // HMC parameters are serialisable - TheHMC.Parameters.MD.MDsteps = 20; - TheHMC.Parameters.MD.trajL = 1.0; + TheHMC.Parameters.initialize(Reader); + //TheHMC.Parameters.MD.MDsteps = 20; + //TheHMC.Parameters.MD.trajL = 1.0; +/* + if (ApplySmearingFund || ApplySmearingAS){ + SmearingParameters SmPar(Reader); + //double rho = 0.1; // smearing parameter + //int Nsmear = 3; // number of smearing levels + Smear_Stout Stout(SmPar.rho); + SmearedConfiguration SmearingPolicy(GridPtr, SmPar.Nsmear, Stout); + TheHMC.Run(SmearingPolicy); // for smearing + } else { + TheHMC.Run(); // no smearing + } +*/ + TheHMC.Run(); - TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file - TheHMC.Run(); // no smearing + + //TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + //TheHMC.Run(); // no smearing + // TheHMC.Run(SmearingPolicy); // for smearing Grid_finalize(); } // main - - diff --git a/tests/hmc/Test_hmc_WCadjFG_Production.cc b/tests/hmc/Test_hmc_WCadjFG_Production.cc new file mode 100644 index 00000000..b99c1189 --- /dev/null +++ b/tests/hmc/Test_hmc_WCadjFG_Production.cc @@ -0,0 +1,213 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./tests/Test_hmc_WilsonFermionGauge.cc + +Copyright (C) 2017 + +Author: Guido Cossu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include + + +namespace Grid{ + struct FermionParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(FermionParameters, + double, mass, + double, csw, + double, StoppingCondition, + int, MaxCGIterations, + bool, ApplySmearing); + }; + + + struct WilsonCloverHMCParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverHMCParameters, + double, gauge_beta, + FermionParameters, WilsonClover) + + template + WilsonCloverHMCParameters(Reader& Reader){ + read(Reader, "Action", *this); + } + }; + + struct SmearingParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(SmearingParameters, + double, rho, + Integer, Nsmear) + + template + SmearingParameters(Reader& Reader){ + read(Reader, "StoutSmearing", *this); + } + + }; + + +} + +int main(int argc, char **argv) +{ + using namespace Grid; + using namespace Grid::QCD; + + typedef Representations< FundamentalRepresentation, AdjointRepresentation > TheRepresentations; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunnerHirep HMCWrapper; // Uses the default minimum norm + typedef WilsonAdjImplR FermionImplPolicy; // gauge field implemetation for the pseudofermions + typedef WilsonCloverAdjFermionR FermionAction; // type of lattice fermions (Wilson, DW, ...) + typedef typename FermionAction::FermionField FermionField; + typedef Grid::JSONReader Serialiser; + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + + // Grid from the command line + TheHMC.ReadCommandLine(argc, argv); + if (TheHMC.ParameterFile.empty()){ + std::cout << "Input file not specified." + << "Use --ParameterFile option in the command line.\nAborting" + << std::endl; + exit(1); + } + Serialiser Reader(TheHMC.ParameterFile); + WilsonCloverHMCParameters MyParams(Reader); + + // Apply smearing to the fermionic action + bool ApplySmearing = MyParams.WilsonClover.ApplySmearing; + + TheHMC.Resources.AddFourDimGrid("gauge"); + + // Checkpointer definition + CheckpointerParameters CPparams(Reader); + + /* + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + */ + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + RNGModuleParameters RNGpar(Reader); + /* + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + TheHMC.Resources.SetRNGSeeds(RNGpar); + */ + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + + typedef PolyakovMod PolyakovObs; + TheHMC.Resources.AddObservable(); + + //typedef TopologicalChargeMod QObs; + //TopologyObsParameters TopParams(Reader); + //TheHMC.Resources.AddObservable(TopParams); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + + //RealD beta = 5.6; + WilsonGaugeActionR Waction(MyParams.gauge_beta); + + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + + // temporarily need a gauge field + AdjointRepresentation::LatticeField U(GridPtr); + + //Real mass = 0.01; + //Real csw = 1.0; + + Real mass = MyParams.WilsonClover.mass; + Real csw = MyParams.WilsonClover.csw; + + std::cout << "mass and csw" << mass << " and " << csw << std::endl; + + FermionAction FermOp(U, *GridPtr, *GridRBPtr, mass, csw, csw); + ConjugateGradient CG(MyParams.WilsonClover.StoppingCondition, MyParams.WilsonClover.MaxCGIterations); + TwoFlavourPseudoFermionAction Nf2(FermOp, CG, CG); + + // Set smearing (true/false), default: false + Nf2.is_smeared = ApplySmearing; + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2); + + ActionLevel Level2(4); + Level2.push_back(&Waction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + ///////////////////////////////////////////////////////////// + + + /* + double rho = 0.1; // smearing parameter + int Nsmear = 2; // number of smearing levels + Smear_Stout Stout(rho); + SmearedConfiguration SmearingPolicy( + UGrid, Nsmear, Stout); + */ + + // HMC parameters are serialisable + + TheHMC.Parameters.initialize(Reader); + //TheHMC.Parameters.MD.MDsteps = 20; + //TheHMC.Parameters.MD.trajL = 1.0; + + if (ApplySmearing){ + SmearingParameters SmPar(Reader); + //double rho = 0.1; // smearing parameter + //int Nsmear = 3; // number of smearing levels + Smear_Stout Stout(SmPar.rho); + SmearedConfiguration SmearingPolicy(GridPtr, SmPar.Nsmear, Stout); + TheHMC.Run(SmearingPolicy); // for smearing + } else { + TheHMC.Run(); // no smearing + } + + //TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + //TheHMC.Run(); // no smearing + // TheHMC.Run(SmearingPolicy); // for smearing + + Grid_finalize(); + +} // main + From 840814c7769b33c2a6af28e68d85f5517866289c Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 6 Nov 2017 16:34:55 +0000 Subject: [PATCH 079/620] QedFVol: Patch to fix MPI communicators error --- lib/communicator/Communicator_mpi.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/communicator/Communicator_mpi.cc b/lib/communicator/Communicator_mpi.cc index ef612f98..e123aaa4 100644 --- a/lib/communicator/Communicator_mpi.cc +++ b/lib/communicator/Communicator_mpi.cc @@ -55,9 +55,9 @@ void CartesianCommunicator::Init(int *argc, char ***argv) { CartesianCommunicator::~CartesianCommunicator() { - int MPI_is_finalised; - MPI_Finalized(&MPI_is_finalised); - if (communicator && MPI_is_finalised) + // int MPI_is_finalised; + // MPI_Finalized(&MPI_is_finalised); + if (communicator && !MPI::Is_finalized()) MPI_Comm_free(&communicator); } From 0c668bf46aabe20421227d59fe347c1828fa8932 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Tue, 7 Nov 2017 14:46:39 +0000 Subject: [PATCH 080/620] QedFVol: Write to output files from one process only. --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 136 +++++++----------- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 126 ++++++++++------ 2 files changed, 134 insertions(+), 128 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 1b901bf1..33c3d4dd 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -151,23 +151,25 @@ void TChargedProp::execute(void) buf = GFSrc; momD1(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propQ, buf, FFT::backward); + fft.FFT_dim(propQ, buf, env().getNd()-1, FFT::backward); // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) buf = -buf; momD1(buf, fft); propSun = G*buf; - fft.FFT_all_dim(propSun, propSun, FFT::backward); + fft.FFT_dim(propSun, propSun, env().getNd()-1, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) buf = GFSrc; momD2(buf, fft); buf = -G*buf; - fft.FFT_all_dim(propTad, buf, FFT::backward); - - // full charged scalar propagator - prop = (*prop0_) + q*propQ + q*q*propSun + q*q*propTad; + fft.FFT_dim(propTad, buf, env().getNd()-1, FFT::backward); + // full charged scalar propagator + buf = GFSrc; + fft.FFT_dim(buf, buf, env().getNd()-1, FFT::backward); + prop = buf + q*propQ + q*q*propSun + q*q*propTad; + // OUTPUT IF NECESSARY if (!par().output.empty()) { @@ -183,95 +185,63 @@ void TChargedProp::execute(void) LOG(Message) << "Saving (" << par().outputMom[i_p] << ") momentum projection to '" << filename << "'..." << std::endl; - CorrWriter writer(filename); - std::vector vecBuf; - std::vector result; + // std::vector vecBuf; + std::vector result, result0, resultQ, resultSun, resultTad; + result.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + result0.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + resultQ.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + resultSun.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + resultTad.resize(env().getGrid()->_fdimensions[env().getNd()-1]); - write(writer, "charge", q); - write(writer, "mass", par().mass); + TComplex site; + std::vector whichmom; + whichmom.resize(env().getNd()); - // Write full propagator - buf = prop; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } + whichmom[j] = mom[j]; } - sliceSum(buf, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop", result); - // Write free propagator - buf = *prop0_; - for (unsigned int j = 0; j < env().getNd()-1; ++j) + for (unsigned int t = 0; t < env().getGrid()->_fdimensions[env().getNd()-1]; ++t) { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } + whichmom[env().getNd()-1] = t; + // Write full propagator + peekSite(site, prop, whichmom); + result[t]=TensorRemove(site); + // Write free propagator + peekSite(site, buf, whichmom); + result0[t]=TensorRemove(site); + // Write propagator O(q) term + peekSite(site, propQ, whichmom); + resultQ[t]=TensorRemove(site); + // Write propagator sunset term + peekSite(site, propSun, whichmom); + resultSun[t]=TensorRemove(site); + // Write propagator tadpole term + peekSite(site, propTad, whichmom); + resultTad[t]=TensorRemove(site); } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) + + if (env().getGrid()->IsBoss()) { - result[t] = TensorRemove(vecBuf[t]); + CorrWriter writer(filename); + write(writer, "charge", q); + write(writer, "mass", par().mass); + write(writer, "prop", result); + write(writer, "prop_0", result0); + write(writer, "prop_Q", resultQ); + write(writer, "prop_Sun", resultSun); + write(writer, "prop_Tad", resultTad); } - write(writer, "prop_0", result); - - // Write propagator O(q) term - buf = propQ; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Q", result); - - // Write propagator sunset term - buf = propSun; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Sun", result); - - // Write propagator tadpole term - buf = propTad; - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - buf = buf*adj(*phase_[j]); - } - } - sliceSum(buf, vecBuf, Tp); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(writer, "prop_Tad", result); } } + + std::vector mask(env().getNd(),1); + mask[env().getNd()-1] = 0; + fft.FFT_dim_mask(prop, prop, mask, FFT::backward); + fft.FFT_dim_mask(propQ, propQ, mask, FFT::backward); + fft.FFT_dim_mask(propSun, propSun, mask, FFT::backward); + fft.FFT_dim_mask(propTad, propTad, mask, FFT::backward); } void TChargedProp::momD1(ScalarField &s, FFT &fft) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 297a823d..b8cdb7e3 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -173,19 +173,22 @@ void TScalarVP::execute(void) + "_diagrams." + std::to_string(env().getTrajectory()); - CorrWriter *writer_i = new CorrWriter(filename); - writer.push_back(writer_i); - CorrWriter *writer0_i = new CorrWriter(filename0); - writer0.push_back(writer0_i); - CorrWriter *writerD_i = new CorrWriter(filenameD); - writerD.push_back(writerD_i); + if (env().getGrid()->IsBoss()) + { + CorrWriter *writer_i = new CorrWriter(filename); + writer.push_back(writer_i); + CorrWriter *writer0_i = new CorrWriter(filename0); + writer0.push_back(writer0_i); + CorrWriter *writerD_i = new CorrWriter(filenameD); + writerD.push_back(writerD_i); - write(*writer[i_p], "charge", q); - write(*writer[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - write(*writer0[i_p], "charge", 0.0); - write(*writer0[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - write(*writerD[i_p], "charge", q); - write(*writerD[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + write(*writer[i_p], "charge", q); + write(*writer[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + write(*writer0[i_p], "charge", 0.0); + write(*writer0[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + write(*writerD[i_p], "charge", q); + write(*writerD[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); + } // Calculate phase factors vpPhase = Complex(1.0,0.0); @@ -231,9 +234,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writer0[i_p], - "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writer0[i_p], + "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -259,9 +265,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_exchange_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_exchange_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -287,9 +296,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_alpha2_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_alpha2_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -313,9 +325,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_sunset_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_sunset_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -338,9 +353,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_sunset_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_sunset_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -364,9 +382,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_tadpole_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_tadpole_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -389,9 +410,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_tadpole_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_tadpole_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -418,9 +442,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_sourcetadpole_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_sourcetadpole_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -446,9 +473,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writerD[i_p], - "Pi_sinktadpole_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writerD[i_p], + "Pi_sinktadpole_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } @@ -464,9 +494,12 @@ void TScalarVP::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(*writer[i_p], - "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), - result); + if (env().getGrid()->IsBoss()) + { + write(*writer[i_p], + "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } } } } @@ -475,9 +508,12 @@ void TScalarVP::execute(void) { for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - delete writer[i_p]; - delete writer0[i_p]; - delete writerD[i_p]; + if (env().getGrid()->IsBoss()) + { + delete writer[i_p]; + delete writer0[i_p]; + delete writerD[i_p]; + } } } } From 59d9ccf70cfaa57078aafe81aa3455f8e05b7d48 Mon Sep 17 00:00:00 2001 From: pretidav Date: Wed, 8 Nov 2017 22:02:32 +0100 Subject: [PATCH 081/620] restored WilsonKernelsHand.cc and added Qtop to production codes --- lib/qcd/action/fermion/WilsonKernelsHand.cc | 2 -- tests/hmc/Test_hmc_WCMixedRepFG_Production.cc | 6 +++--- tests/hmc/Test_hmc_WCadjFG_Production.cc | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonKernelsHand.cc b/lib/qcd/action/fermion/WilsonKernelsHand.cc index aa6b5f6b..90e6cb9b 100644 --- a/lib/qcd/action/fermion/WilsonKernelsHand.cc +++ b/lib/qcd/action/fermion/WilsonKernelsHand.cc @@ -946,6 +946,4 @@ INSTANTIATE_THEM(DomainWallVec5dImplFH); INSTANTIATE_THEM(DomainWallVec5dImplDF); INSTANTIATE_THEM(ZDomainWallVec5dImplFH); INSTANTIATE_THEM(ZDomainWallVec5dImplDF); -INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplF); -INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplD); }} diff --git a/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc b/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc index a79452f4..aa5cce85 100644 --- a/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc +++ b/tests/hmc/Test_hmc_WCMixedRepFG_Production.cc @@ -140,9 +140,9 @@ int main(int argc, char **argv) { typedef PolyakovMod PolyakovObs; TheHMC.Resources.AddObservable(); - //typedef TopologicalChargeMod QObs; - //TopologyObsParameters TopParams(Reader); - //TheHMC.Resources.AddObservable(TopParams); + typedef TopologicalChargeMod QObs; + TopologyObsParameters TopParams(Reader); + TheHMC.Resources.AddObservable(TopParams); ////////////////////////////////////////////// ///////////////////////////////////////////////////////////// diff --git a/tests/hmc/Test_hmc_WCadjFG_Production.cc b/tests/hmc/Test_hmc_WCadjFG_Production.cc index b99c1189..48cea756 100644 --- a/tests/hmc/Test_hmc_WCadjFG_Production.cc +++ b/tests/hmc/Test_hmc_WCadjFG_Production.cc @@ -131,9 +131,9 @@ int main(int argc, char **argv) typedef PolyakovMod PolyakovObs; TheHMC.Resources.AddObservable(); - //typedef TopologicalChargeMod QObs; - //TopologyObsParameters TopParams(Reader); - //TheHMC.Resources.AddObservable(TopParams); + typedef TopologicalChargeMod QObs; + TopologyObsParameters TopParams(Reader); + TheHMC.Resources.AddObservable(TopParams); ////////////////////////////////////////////// ///////////////////////////////////////////////////////////// From 6a15e2e8ef25e54c966d44169c7f2ab4d6d1c1d0 Mon Sep 17 00:00:00 2001 From: pretidav Date: Sun, 12 Nov 2017 14:16:19 +0100 Subject: [PATCH 082/620] Added WilsonTwoIndexAntiSymmImpl instantiation in WilsonKernelsHand.cc (shoud not be necessary) --- lib/qcd/action/fermion/WilsonKernelsHand.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/qcd/action/fermion/WilsonKernelsHand.cc b/lib/qcd/action/fermion/WilsonKernelsHand.cc index 90e6cb9b..aa6b5f6b 100644 --- a/lib/qcd/action/fermion/WilsonKernelsHand.cc +++ b/lib/qcd/action/fermion/WilsonKernelsHand.cc @@ -946,4 +946,6 @@ INSTANTIATE_THEM(DomainWallVec5dImplFH); INSTANTIATE_THEM(DomainWallVec5dImplDF); INSTANTIATE_THEM(ZDomainWallVec5dImplFH); INSTANTIATE_THEM(ZDomainWallVec5dImplDF); +INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplF); +INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplD); }} From 1f1d77b01a308a7716d429b09bb0ffa01cd7f835 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 14 Nov 2017 10:01:48 +0000 Subject: [PATCH 083/620] Performance metrics for the Scalar Action force term --- lib/qcd/action/scalar/ScalarImpl.h | 4 ++ .../action/scalar/ScalarInteractionAction.h | 62 ++++++++++++++----- lib/qcd/hmc/GenericHMCrunner.h | 2 +- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/lib/qcd/action/scalar/ScalarImpl.h b/lib/qcd/action/scalar/ScalarImpl.h index 650f4d17..55f5049d 100644 --- a/lib/qcd/action/scalar/ScalarImpl.h +++ b/lib/qcd/action/scalar/ScalarImpl.h @@ -168,7 +168,11 @@ class ScalarImplTypes { static inline void update_field(Field &P, Field &U, double ep) { #ifndef USE_FFT_ACCELERATION + double t0=usecond(); U += P * ep; + double t1=usecond(); + double total_time = (t1-t0)/1e6; + std::cout << GridLogIntegrator << "Total time for updating field (s) : " << total_time << std::endl; #else // FFT transform P(x) -> P(p) // divide by (M^2+p^2) M external parameter (how to pass?) diff --git a/lib/qcd/action/scalar/ScalarInteractionAction.h b/lib/qcd/action/scalar/ScalarInteractionAction.h index 3848751d..8738b647 100644 --- a/lib/qcd/action/scalar/ScalarInteractionAction.h +++ b/lib/qcd/action/scalar/ScalarInteractionAction.h @@ -44,18 +44,18 @@ public: INHERIT_FIELD_TYPES(Impl); private: - RealD mass_square; - RealD lambda; - RealD g; - const unsigned int N = Impl::Group::Dimension; + RealD mass_square; + RealD lambda; + RealD g; + const unsigned int N = Impl::Group::Dimension; typedef typename Field::vector_object vobj; typedef CartesianStencil Stencil; SimpleCompressor compressor; int npoint = 2 * Ndim; - std::vector directions; // = {0,1,2,3,0,1,2,3}; // forcing 4 dimensions - std::vector displacements; // = {1,1,1,1, -1,-1,-1,-1}; + std::vector directions; // + std::vector displacements; // public: ScalarInteractionAction(RealD ms, RealD l, RealD gval) : mass_square(ms), lambda(l), g(gval), displacements(2 * Ndim, 0), directions(2 * Ndim, 0) @@ -124,39 +124,55 @@ public: } // NB the trace in the algebra is normalised to 1/2 // minus sign coming from the antihermitian fields - return -(TensorRemove(sum(trace(action)))).real()*N/g; + return -(TensorRemove(sum(trace(action)))).real() * N / g; }; virtual void deriv(const Field &p, Field &force) { + double t0 = usecond(); assert(p._grid->Nd() == Ndim); force = (2. * Ndim + mass_square) * p - 2. * lambda * p * p * p; + double interm_t = usecond(); + // move this outside static Stencil phiStencil(p._grid, npoint, 0, directions, displacements); - phiStencil.HaloExchange(p, compressor); + phiStencil.HaloExchange(p, compressor); + double halo_t = usecond(); + int chunk = 128; //for (int mu = 0; mu < QCD::Nd; mu++) force -= Cshift(p, mu, -1) + Cshift(p, mu, 1); + + // inverting the order of the loops slows down the code(! g++ 7) + // cannot try to reduce the number of force writes by factor npoint... + // use cache blocking for (int point = 0; point < npoint; point++) { - parallel_for(int i = 0; i < p._grid->oSites(); i++) - { - const vobj *temp; - vobj temp2; + +#pragma omp parallel +{ int permute_type; StencilEntry *SE; + const vobj *temp; + +#pragma omp for schedule(static, chunk) + for (int i = 0; i < p._grid->oSites(); i++) + { SE = phiStencil.GetEntry(permute_type, point, i); + // prefetch next p? if (SE->_is_local) { temp = &p._odata[SE->_offset]; + if (SE->_permute) { + vobj temp2; permute(temp2, *temp, permute_type); force._odata[i] -= temp2; } else { - force._odata[i] -= *temp; + force._odata[i] -= *temp; // slow part. Dominated by this read/write (BW) } } else @@ -164,9 +180,27 @@ public: force._odata[i] -= phiStencil.CommBuf()[SE->_offset]; } } + } - force *= N/g; } + force *= N / g; + + double t1 = usecond(); + double total_time = (t1 - t0) / 1e6; + double interm_time = (interm_t - t0) / 1e6; + double halo_time = (halo_t - interm_t) / 1e6; + double stencil_time = (t1 - halo_t) / 1e6; + std::cout << GridLogIntegrator << "Total time for force computation (s) : " << total_time << std::endl; + std::cout << GridLogIntegrator << "Intermediate time for force computation (s): " << interm_time << std::endl; + std::cout << GridLogIntegrator << "Halo time in force computation (s) : " << halo_time << std::endl; + std::cout << GridLogIntegrator << "Stencil time in force computation (s) : " << stencil_time << std::endl; + double flops = p._grid->gSites() * (14 * N * N * N + 18 * N * N + 2); + double flops_no_stencil = p._grid->gSites() * (14 * N * N * N + 6 * N * N + 2); + double Gflops = flops / (total_time * 1e9); + double Gflops_no_stencil = flops_no_stencil / (interm_time * 1e9); + std::cout << GridLogIntegrator << "Flops: " << flops << " - Gflop/s : " << Gflops << std::endl; + std::cout << GridLogIntegrator << "Flops NS: " << flops_no_stencil << " - Gflop/s NS: " << Gflops_no_stencil << std::endl; +} }; } // namespace Grid diff --git a/lib/qcd/hmc/GenericHMCrunner.h b/lib/qcd/hmc/GenericHMCrunner.h index 4f6c1af0..26fec3d5 100644 --- a/lib/qcd/hmc/GenericHMCrunner.h +++ b/lib/qcd/hmc/GenericHMCrunner.h @@ -211,7 +211,7 @@ typedef HMCWrapperTemplate ScalarAdjGenericHMCRunner; template -using ScalarNxNAdjGenericHMCRunner = HMCWrapperTemplate < ScalarNxNAdjImplR, MinimumNorm2, ScalarNxNMatrixFields >; +using ScalarNxNAdjGenericHMCRunner = HMCWrapperTemplate < ScalarNxNAdjImplR, ForceGradient, ScalarNxNMatrixFields >; } // namespace QCD } // namespace Grid From 6bc136b1d0b9e5308ce531f67273a525b0549990 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 13 Dec 2017 17:31:01 +0000 Subject: [PATCH 084/620] Add module for calculating diagrams required for HVP counter-terms --- extras/Hadrons/Modules.hpp | 1 + .../Hadrons/Modules/MScalar/VPCounterTerms.cc | 257 ++++++++++++++++++ .../Modules/MScalar/VPCounterTerms.hpp | 55 ++++ extras/Hadrons/modules.inc | 4 +- 4 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 extras/Hadrons/Modules/MScalar/VPCounterTerms.cc create mode 100644 extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 78bb213d..1aa4b74d 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc new file mode 100644 index 00000000..17dd1abe --- /dev/null +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc @@ -0,0 +1,257 @@ +#include +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalar; + +/****************************************************************************** +* TVPCounterTerms implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +TVPCounterTerms::TVPCounterTerms(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +std::vector TVPCounterTerms::getInput(void) +{ + std::vector in = {par().source}; + + return in; +} + +std::vector TVPCounterTerms::getOutput(void) +{ + std::vector out; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +void TVPCounterTerms::setup(void) +{ + freeMomPropName_ = FREEMOMPROP(par().mass); + phaseName_.clear(); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + phaseName_.push_back("_shiftphase_" + std::to_string(mu)); + } + GFSrcName_ = "_" + getName() + "_DinvSrc"; + phatsqName_ = "_" + getName() + "_pHatSquared"; + prop0Name_ = getName() + "_freeProp"; + twoscalarName_ = getName() + "_2scalarProp"; + twoscalarVertexName_ = getName() + "_2scalarProp_withvertex"; + psquaredName_ = getName() + "_psquaredProp"; + env().registerLattice(freeMomPropName_); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + env().registerLattice(phaseName_[mu]); + } + env().registerLattice(phatsqName_); + env().registerLattice(GFSrcName_); + env().registerLattice(prop0Name_); + env().registerLattice(twoscalarName_); + env().registerLattice(twoscalarVertexName_); + env().registerLattice(psquaredName_); +} + +// execution /////////////////////////////////////////////////////////////////// +void TVPCounterTerms::execute(void) +{ + ScalarField &source = *env().getObject(par().source); + Complex ci(0.0,1.0); + FFT fft(env().getGrid()); + ScalarField buf(env().getGrid()), tmp_vp(env().getGrid()); + + // Momentum-space free scalar propagator + ScalarField &G = *env().createLattice(freeMomPropName_); + SIMPL::MomentumSpacePropagator(G, par().mass); + + // Phases and hat{p}^2 + ScalarField &phatsq = *env().createLattice(phatsqName_); + std::vector &l = env().getGrid()->_fdimensions; + + LOG(Message) << "Calculating shift phases..." << std::endl; + phatsq = zero; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + Real twoPiL = M_PI*2./l[mu]; + + phase_.push_back(env().createLattice(phaseName_[mu])); + LatticeCoordinate(buf, mu); + *(phase_[mu]) = exp(ci*twoPiL*buf); + buf = 2.*sin(.5*twoPiL*buf); + phatsq = phatsq + buf*buf; + } + + // G*F*src + ScalarField &GFSrc = *env().createLattice(GFSrcName_); + fft.FFT_all_dim(GFSrc, source, FFT::forward); + GFSrc = G*GFSrc; + + // Position-space free scalar propagator + ScalarField &prop0 = *env().createLattice(prop0Name_); + prop0 = GFSrc; + fft.FFT_all_dim(prop0, prop0, FFT::backward); + + // Propagators for counter-terms + ScalarField &twoscalarProp = *env().createLattice(twoscalarName_); + ScalarField &twoscalarVertexProp = *env().createLattice(twoscalarVertexName_); + ScalarField &psquaredProp = *env().createLattice(psquaredName_); + + twoscalarProp = G*GFSrc; + fft.FFT_all_dim(twoscalarProp, twoscalarProp, FFT::backward); + + twoscalarVertexProp = zero; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + buf = GFSrc; + twoscalarVertexProp = twoscalarVertexProp + .5*((*phase_[mu]) + adj(*phase_[mu]))*buf; + } + twoscalarVertexProp = G*twoscalarVertexProp; + fft.FFT_all_dim(twoscalarVertexProp, twoscalarVertexProp, FFT::backward); + + psquaredProp = G*phatsq*GFSrc; + fft.FFT_all_dim(psquaredProp, psquaredProp, FFT::backward); + + // Open output files if necessary + std::vector vecBuf; + std::vector result; + ScalarField vpPhase(env().getGrid()); + std::vector writer; + std::vector momphases; + if (!par().output.empty()) + { + LOG(Message) << "Preparing output files..." << std::endl; + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + std::vector mom = strToVec(par().outputMom[i_p]); + + // Open output files + std::string filename = par().output + "_" + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]) + + "." + + std::to_string(env().getTrajectory()); + + if (env().getGrid()->IsBoss()) + { + CorrWriter *writer_i = new CorrWriter(filename); + writer.push_back(writer_i); + + write(*writer[i_p], "mass", par().mass); + } + + // Calculate phase factors + vpPhase = Complex(1.0,0.0); + for (unsigned int j = 0; j < env().getNd()-1; ++j) + { + for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) + { + vpPhase = vpPhase*(*phase_[j]); + } + } + vpPhase = adj(vpPhase); + momphases.push_back(vpPhase); + } + } + + // Contractions + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + buf = adj(Cshift(prop0, nu, -1)); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + // Three-scalar loop (no vertex) + tmp_vp = buf * Cshift(twoscalarProp, mu, 1); + tmp_vp -= Cshift(buf, mu, 1) * twoscalarProp; + tmp_vp = 2.0*real(tmp_vp); + + // Output if necessary + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + vpPhase = tmp_vp*momphases[i_p]; + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + if (env().getGrid()->IsBoss()) + { + write(*writer[i_p], + "NoVertex_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + } + } + + // Three-scalar loop (tadpole vertex) + tmp_vp = buf * Cshift(twoscalarVertexProp, mu, 1); + tmp_vp -= Cshift(buf, mu, 1) * twoscalarVertexProp; + tmp_vp = 2.0*real(tmp_vp); + + // Output if necessary + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + vpPhase = tmp_vp*momphases[i_p]; + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + if (env().getGrid()->IsBoss()) + { + write(*writer[i_p], + "TadVertex_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + } + } + + // Three-scalar loop (hat{p}^2 insertion) + tmp_vp = buf * Cshift(psquaredProp, mu, 1); + tmp_vp -= Cshift(buf, mu, 1) * psquaredProp; + tmp_vp = 2.0*real(tmp_vp); + + // Output if necessary + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + vpPhase = tmp_vp*momphases[i_p]; + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + if (env().getGrid()->IsBoss()) + { + write(*writer[i_p], + "pSquaredInsertion_"+std::to_string(mu)+"_"+std::to_string(nu), + result); + } + } + } + } + } + + // Close output files if necessary + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + if (env().getGrid()->IsBoss()) + { + delete writer[i_p]; + } + } + } +} diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp new file mode 100644 index 00000000..6bd6db8e --- /dev/null +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -0,0 +1,55 @@ +#ifndef Hadrons_MScalar_VPCounterTerms_hpp_ +#define Hadrons_MScalar_VPCounterTerms_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * VPCounterTerms * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalar) + +class VPCounterTermsPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(VPCounterTermsPar, + std::string, source, + double, mass, + std::string, output, + std::vector, outputMom); +}; + +class TVPCounterTerms: public Module +{ +public: + SCALAR_TYPE_ALIASES(SIMPL,); +public: + // constructor + TVPCounterTerms(const std::string name); + // destructor + virtual ~TVPCounterTerms(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + std::string freeMomPropName_, GFSrcName_, phatsqName_, prop0Name_, + twoscalarName_, twoscalarVertexName_, + psquaredName_, psquaredVertexName_; + std::vector phaseName_; + std::vector phase_; +}; + +MODULE_REGISTER_NS(VPCounterTerms, TVPCounterTerms, MScalar); + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalar_VPCounterTerms_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index b3c65de0..fa1fe319 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -9,7 +9,8 @@ modules_cc =\ Modules/MGauge/UnitEm.cc \ Modules/MScalar/ChargedProp.cc \ Modules/MScalar/FreeProp.cc \ - Modules/MScalar/ScalarVP.cc + Modules/MScalar/ScalarVP.cc \ + Modules/MScalar/VPCounterTerms.cc modules_hpp =\ Modules/MAction/DWF.hpp \ @@ -33,6 +34,7 @@ modules_hpp =\ Modules/MScalar/FreeProp.hpp \ Modules/MScalar/Scalar.hpp \ Modules/MScalar/ScalarVP.hpp \ + Modules/MScalar/VPCounterTerms.hpp \ Modules/MSink/Point.hpp \ Modules/MSolver/RBPrecCG.hpp \ Modules/MSource/Point.hpp \ From 581be32ed24b9a39aaf22fd05cda185f13cb884e Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 14 Dec 2017 13:42:41 +0000 Subject: [PATCH 085/620] Implement infrared improvement for v=0 on-shell self-energy --- extras/Hadrons/Modules/MGauge/StochEm.cc | 2 +- extras/Hadrons/Modules/MGauge/StochEm.hpp | 3 +- extras/Hadrons/Modules/MGauge/UnitEm.cc | 2 +- lib/qcd/action/gauge/Photon.h | 34 ++++++++++++++++++++--- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index c7a9fc4f..8f84fe94 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -67,7 +67,7 @@ void TStochEm::setup(void) // execution /////////////////////////////////////////////////////////////////// void TStochEm::execute(void) { - PhotonR photon(par().gauge, par().zmScheme); + PhotonR photon(par().gauge, par().zmScheme, par().improvement); EmField &a = *env().createLattice(getName()); EmComp *w; diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index 12ce9fdc..b6bfa262 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -44,7 +44,8 @@ class StochEmPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(StochEmPar, PhotonR::Gauge, gauge, - PhotonR::ZmScheme, zmScheme); + PhotonR::ZmScheme, zmScheme, + Integer, improvement); }; class TStochEm: public Module diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index f33dfed3..747ef142 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -61,7 +61,7 @@ void TUnitEm::setup(void) // execution /////////////////////////////////////////////////////////////////// void TUnitEm::execute(void) { - PhotonR photon(0, 0); // Just chose arbitrary input values here + PhotonR photon(0, 0, 0); // Just chose arbitrary input values here EmField &a = *env().createLattice(getName()); LOG(Message) << "Generating unit EM potential..." << std::endl; photon.UnitField(a); diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 1429c2ba..e0329bed 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -60,7 +60,7 @@ namespace QCD{ GRID_SERIALIZABLE_ENUM(Gauge, undef, feynman, 1, coulomb, 2, landau, 3); GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2); public: - Photon(Gauge gauge, ZmScheme zmScheme); + Photon(Gauge gauge, ZmScheme zmScheme, Integer improvement); virtual ~Photon(void) = default; void FreePropagator(const GaugeField &in, GaugeField &out); void MomentumSpacePropagator(const GaugeField &in, GaugeField &out); @@ -75,13 +75,14 @@ namespace QCD{ private: Gauge gauge_; ZmScheme zmScheme_; + Integer improvement_; }; typedef Photon PhotonR; template - Photon::Photon(Gauge gauge, ZmScheme zmScheme) - : gauge_(gauge), zmScheme_(zmScheme) + Photon::Photon(Gauge gauge, ZmScheme zmScheme, Integer improvement) + : gauge_(gauge), zmScheme_(zmScheme), improvement_(improvement) {} template @@ -128,6 +129,7 @@ namespace QCD{ { GridBase *grid = out._grid; const unsigned int nd = grid->_ndimension; + std::vector &l = grid->_fdimensions; switch (zmScheme_) { @@ -149,9 +151,33 @@ namespace QCD{ for(int d = 0; d < grid->_ndimension - 1; d++) { LatticeCoordinate(coor,d); + coor = where(coor < Integer(l[d]/2), coor, coor-Integer(l[d])); spNrm = spNrm + coor*coor; } out = where(spNrm == Integer(0), 0.*out, out); + + // IR improvement + switch (improvement_) + { + case 0: + break; + case 1: + { + Real f1 = sqrt(2.48560548); + out = where(spNrm == Integer(1), f1*out, out); + break; + } + case 2: + { + Real f1 = sqrt(4.93053406); + Real f2 = sqrt(-1.44492857); + out = where(spNrm == Integer(1), f1*out, out); + out = where(spNrm == Integer(2), f2*out, out); + break; + } + default: + break; + } break; } @@ -159,7 +185,7 @@ namespace QCD{ break; } } - + template void Photon::MomentumSpacePropagator(const GaugeField &in, GaugeField &out) From 55e39df30f1953e0d54b79d2b1c6061093468e76 Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Fri, 22 Dec 2017 11:36:31 +0000 Subject: [PATCH 086/620] tadpole insertion for DWF --- lib/qcd/action/fermion/WilsonFermion5D.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/lib/qcd/action/fermion/WilsonFermion5D.cc index 393ee7f3..bc703187 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.cc +++ b/lib/qcd/action/fermion/WilsonFermion5D.cc @@ -833,9 +833,12 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, for (unsigned int s = 0; s < LLs; ++s) { bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); + bool tadpole_sign = (curr_type == Current::Tadpole); + bool switch_sgn = tadpole_sign || axial_sign; + Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sF], q_out._odata[sF], Umu, sU, - mu, t_mask, axial_sign); + mu, t_mask, switch_sgn); ++sF; } } From 935cd1e173e6f50f5185efb30e6b9c3b92790c3d Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Fri, 22 Dec 2017 11:38:45 +0000 Subject: [PATCH 087/620] conserved current insertion summed over Lorentzindex --- extras/Hadrons/Modules.hpp | 67 ++----- .../Modules/MSource/SeqConservedSummed.hpp | 165 ++++++++++++++++++ extras/Hadrons/modules.inc | 46 ++--- 3 files changed, 208 insertions(+), 70 deletions(-) create mode 100644 extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index e1f06f32..a52b9a6e 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,60 +1,31 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015 -Copyright (C) 2016 -Copyright (C) 2017 - -Author: Antonin Portelli - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ - -#include -#include -#include -#include -#include -#include +#include #include -#include +#include +#include +#include #include -#include +#include +#include #include -#include -#include -#include -#include -#include +#include +#include +#include #include -#include #include +#include #include #include #include -#include +#include +#include +#include #include #include #include -#include #include -#include -#include +#include +#include +#include +#include +#include +#include diff --git a/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp b/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp new file mode 100644 index 00000000..2296701a --- /dev/null +++ b/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp @@ -0,0 +1,165 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/SeqConservedSummed.hpp + +Copyright (C) 2017 + +Author: Andrew Lawson +Author: Vera Guelpers + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ + +#ifndef Hadrons_MSource_SeqConservedSummed_hpp_ +#define Hadrons_MSource_SeqConservedSummed_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/* + + Sequential source summed over the Lorentz index of current + ----------------------------- + * src_x = sum_mu q_x * theta(x_3 - tA) * theta(tB - x_3) * J_mu * exp(i x.mom) + + * options: + - q: input propagator (string) + - action: fermion action used for propagator q (string) + - tA: begin timeslice (integer) + - tB: end timesilce (integer) + - curr_type: type of conserved current to insert (Current) + - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") + + */ + +/****************************************************************************** + * SeqConservedSummed * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MSource) + +class SeqConservedSummedPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(SeqConservedSummedPar, + std::string, q, + std::string, action, + unsigned int, tA, + unsigned int, tB, + Current, curr_type, + std::string, mom); +}; + +template +class TSeqConservedSummed: public Module +{ +public: + FERM_TYPE_ALIASES(FImpl,); +public: + // constructor + TSeqConservedSummed(const std::string name); + // destructor + virtual ~TSeqConservedSummed(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(SeqConservedSummed, TSeqConservedSummed, MSource); + +/****************************************************************************** + * TSeqConservedSummed implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TSeqConservedSummed::TSeqConservedSummed(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TSeqConservedSummed::getInput(void) +{ + std::vector in = {par().q, par().action}; + + return in; +} + +template +std::vector TSeqConservedSummed::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TSeqConservedSummed::setup(void) +{ + auto Ls_ = env().getObjectLs(par().action); + env().template registerLattice(getName(), Ls_); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TSeqConservedSummed::execute(void) +{ + if (par().tA == par().tB) + { + LOG(Message) << "Generating sequential source with conserved " + << par().curr_type << " current insertion summed over mu at " + << "t = " << par().tA << std::endl; + } + else + { + LOG(Message) << "Generating sequential source with conserved " + << par().curr_type << " current insertion summed over mu for " + << par().tA << " <= t <= " + << par().tB << std::endl; + } + PropagatorField &src = *env().template createLattice(getName()); + auto src_buf = src; + PropagatorField &q = *env().template getObject(par().q); + FMat &mat = *(env().template getObject(par().action)); + + std::vector mom = strToVec(par().mom); + src = zero; + for(int mu=0;mu<=3;mu++) + { + mat.SeqConservedCurrent(q, src_buf, par().curr_type, mu, + mom, par().tA, par().tB); + src += src_buf; + + } + +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_SeqConservedSummed_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index fbbb2eb9..1ad4750a 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,42 +1,44 @@ modules_cc =\ Modules/MContraction/WeakHamiltonianEye.cc \ - Modules/MContraction/WeakHamiltonianNonEye.cc \ Modules/MContraction/WeakNeutral4ptDisc.cc \ - Modules/MGauge/Load.cc \ + Modules/MContraction/WeakHamiltonianNonEye.cc \ + Modules/MScalar/FreeProp.cc \ + Modules/MScalar/ChargedProp.cc \ Modules/MGauge/Random.cc \ Modules/MGauge/StochEm.cc \ Modules/MGauge/Unit.cc \ - Modules/MScalar/ChargedProp.cc \ - Modules/MScalar/FreeProp.cc + Modules/MGauge/Load.cc modules_hpp =\ - Modules/MAction/DWF.hpp \ - Modules/MAction/Wilson.hpp \ - Modules/MContraction/Baryon.hpp \ - Modules/MContraction/DiscLoop.hpp \ - Modules/MContraction/Gamma3pt.hpp \ - Modules/MContraction/Meson.hpp \ + Modules/MSolver/RBPrecCG.hpp \ Modules/MContraction/WardIdentity.hpp \ - Modules/MContraction/WeakHamiltonian.hpp \ + Modules/MContraction/Meson.hpp \ + Modules/MContraction/Gamma3pt.hpp \ + Modules/MContraction/DiscLoop.hpp \ Modules/MContraction/WeakHamiltonianEye.hpp \ - Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/Baryon.hpp \ + Modules/MContraction/WeakHamiltonian.hpp \ Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MFermion/GaugeProp.hpp \ - Modules/MGauge/Load.hpp \ - Modules/MGauge/Random.hpp \ - Modules/MGauge/StochEm.hpp \ - Modules/MGauge/Unit.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MUtilities/TestSeqGamma.hpp \ + Modules/MUtilities/TestSeqConserved.hpp \ Modules/MLoop/NoiseLoop.hpp \ - Modules/MScalar/ChargedProp.hpp \ Modules/MScalar/FreeProp.hpp \ + Modules/MScalar/ChargedProp.hpp \ Modules/MScalar/Scalar.hpp \ Modules/MSink/Point.hpp \ Modules/MSink/Smear.hpp \ - Modules/MSolver/RBPrecCG.hpp \ + Modules/MFermion/GaugeProp.hpp \ + Modules/MSource/SeqConservedSummed.hpp \ + Modules/MSource/Wall.hpp \ Modules/MSource/Point.hpp \ Modules/MSource/SeqConserved.hpp \ Modules/MSource/SeqGamma.hpp \ - Modules/MSource/Wall.hpp \ Modules/MSource/Z2.hpp \ - Modules/MUtilities/TestSeqConserved.hpp \ - Modules/MUtilities/TestSeqGamma.hpp + Modules/MGauge/Load.hpp \ + Modules/MGauge/StochEm.hpp \ + Modules/MGauge/Random.hpp \ + Modules/MGauge/Unit.hpp \ + Modules/MAction/DWF.hpp \ + Modules/MAction/Wilson.hpp + From 4ce63af7d5945b89043797b4de1613f0fbaf4798 Mon Sep 17 00:00:00 2001 From: pretidav Date: Fri, 22 Dec 2017 19:02:07 +0100 Subject: [PATCH 088/620] Working on Hadrons with Hirep. (QCD is set for SU4) --- extras/Hadrons/Modules.hpp | 42 ++--- .../Hadrons/Modules/MAction/WilsonClover.hpp | 142 +++++++++++++++ extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 13 +- extras/Hadrons/Modules/MGauge/FundtoHirep.cc | 75 ++++++++ extras/Hadrons/Modules/MGauge/FundtoHirep.hpp | 77 ++++++++ extras/Hadrons/modules.inc | 51 +++--- lib/qcd/QCD.h | 18 +- lib/qcd/action/fermion/WilsonFermion.h | 3 +- tests/hadrons/Test_hadrons_2AS_spectrum.cc | 168 ++++++++++++++++++ tests/lanczos/Test_WCMultiRep_lanczos.cc | 108 +++++++++++ 10 files changed, 637 insertions(+), 60 deletions(-) create mode 100644 extras/Hadrons/Modules/MAction/WilsonClover.hpp create mode 100644 extras/Hadrons/Modules/MGauge/FundtoHirep.cc create mode 100644 extras/Hadrons/Modules/MGauge/FundtoHirep.hpp create mode 100644 tests/hadrons/Test_hadrons_2AS_spectrum.cc create mode 100644 tests/lanczos/Test_WCMultiRep_lanczos.cc diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index c27254aa..262795e8 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,25 +1,27 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/extras/Hadrons/Modules/MAction/WilsonClover.hpp new file mode 100644 index 00000000..44b1f0b7 --- /dev/null +++ b/extras/Hadrons/Modules/MAction/WilsonClover.hpp @@ -0,0 +1,142 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/Wilson.hpp + +Copyright (C) 2015 +Copyright (C) 2016 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ + +#ifndef Hadrons_MAction_WilsonClover_hpp_ +#define Hadrons_MAction_WilsonClover_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * TWilson quark action * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MAction) + +class WilsonCloverPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverPar, + std::string, gauge, + double , mass, + double , csw_r, + double , csw_t, + WilsonAnisotropyCoefficients ,clover_anisotropy, + std::string, boundary + ); +}; + +template +class TWilsonClover: public Module +{ +public: + FGS_TYPE_ALIASES(FImpl,); +public: + // constructor + TWilsonClover(const std::string name); + // destructor + virtual ~TWilsonClover(void) = default; + // dependencies/products + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(WilsonClover, TWilsonClover, MAction); + +/****************************************************************************** + * TWilsonClover template implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TWilsonClover::TWilsonClover(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TWilsonClover::getInput(void) +{ + std::vector in = {par().gauge}; + + return in; +} + +template +std::vector TWilsonClover::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TWilsonClover::setup(void) +{ + unsigned int size; + + size = 2*env().template lattice4dSize(); + env().registerObject(getName(), size); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TWilsonClover::execute() +{ + LOG(Message) << "Setting up TWilsonClover fermion matrix with m= " << par().mass + << " using gauge field '" << par().gauge << "'" << std::endl; + LOG(Message) << "Fermion boundary conditions: " << par().boundary + << std::endl; + LOG(Message) << "clover term csw_r= " << par().csw_r + << " csw_t= " << par().csw_t + << std::endl; + auto &U = *env().template getObject(par().gauge); + auto &grid = *env().getGrid(); + auto &gridRb = *env().getRbGrid(); + std::vector boundary = strToVec(par().boundary); + typename WilsonCloverFermion::ImplParams implParams(boundary); + FMat *fMatPt = new WilsonCloverFermion(U, grid, gridRb, par().mass, + par().csw_r, + par().csw_t, + par().clover_anisotropy, + implParams); + env().setObject(getName(), fMatPt); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_WilsonClover_hpp_ diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index b4f9edcc..4e802710 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -43,7 +43,6 @@ private: }; MODULE_REGISTER_NS(GaugeProp, TGaugeProp, MFermion); - /****************************************************************************** * TGaugeProp implementation * ******************************************************************************/ @@ -103,7 +102,7 @@ void TGaugeProp::execute(void) LOG(Message) << "Inverting using solver '" << par().solver << "' on source '" << par().source << "'" << std::endl; for (unsigned int s = 0; s < Ns; ++s) - for (unsigned int c = 0; c < Nc; ++c) + for (unsigned int c = 0; c < FImpl::Dimension; ++c) { LOG(Message) << "Inversion for spin= " << s << ", color= " << c << std::endl; @@ -112,12 +111,12 @@ void TGaugeProp::execute(void) { if (Ls_ == 1) { - PropToFerm(source, fullSrc, s, c); + PropToFerm(source, fullSrc, s, c); } else { source = zero; - PropToFerm(tmp, fullSrc, s, c); + PropToFerm(tmp, fullSrc, s, c); InsertSlice(tmp, source, 0, 0); InsertSlice(tmp, source, Ls_-1, 0); axpby_ssp_pplus(source, 0., source, 1., source, 0, 0); @@ -133,12 +132,12 @@ void TGaugeProp::execute(void) } else { - PropToFerm(source, fullSrc, s, c); + PropToFerm(source, fullSrc, s, c); } } sol = zero; solver(sol, source); - FermToProp(prop, sol, s, c); + FermToProp(prop, sol, s, c); // create 4D propagators from 5D one if necessary if (Ls_ > 1) { @@ -148,7 +147,7 @@ void TGaugeProp::execute(void) axpby_ssp_pminus(sol, 0., sol, 1., sol, 0, 0); axpby_ssp_pplus(sol, 1., sol, 1., sol, 0, Ls_-1); ExtractSlice(tmp, sol, 0, 0); - FermToProp(p4d, tmp, s, c); + FermToProp(p4d, tmp, s, c); } } } diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc new file mode 100644 index 00000000..f15a3b7c --- /dev/null +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc @@ -0,0 +1,75 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.cc + +Copyright (C) 2015 +Copyright (C) 2016 + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ + +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MGauge; + +// constructor ///////////////////////////////////////////////////////////////// +template +TFundtoHirep::TFundtoHirep(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TFundtoHirep::getInput(void) +{ + std::vector in; + return in; +} + +template +std::vector TFundtoHirep::getOutput(void) +{ + std::vector out = {getName()}; + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TFundtoHirep::setup(void) +{ + env().template registerLattice(getName()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TFundtoHirep::execute(void) +{ + auto &U = *env().template getObject(par().gaugeconf); + LOG(Message) << "Transforming Representation" << std::endl; + + Rep TargetRepresentation(U._grid); + TargetRepresentation.update_representation(U); + + typename Rep::LatticeField &URep = *env().template createLattice(getName()); + URep = TargetRepresentation.U; +} diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp new file mode 100644 index 00000000..6f072783 --- /dev/null +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp @@ -0,0 +1,77 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.hpp + +Copyright (C) 2015 +Copyright (C) 2016 + +Author: David Preti + Guido Cossu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ + +#ifndef Hadrons_MGauge_FundtoHirep_hpp_ +#define Hadrons_MGauge_FundtoHirep_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Load a NERSC configuration * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MGauge) + +class FundtoHirepPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(FundtoHirepPar, + std::string, gaugeconf); +}; + +template +class TFundtoHirep: public Module +{ +public: + // constructor + TFundtoHirep(const std::string name); + // destructor + virtual ~TFundtoHirep(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + void setup(void); + // execution + void execute(void); +}; + +//MODULE_REGISTER_NS(FundtoAdjoint, TFundtoHirep, MGauge); +//MODULE_REGISTER_NS(FundtoTwoIndexSym, TFundtoHirep, MGauge); +//MODULE_REGISTER_NS(FundtoTwoIndexAsym, TFundtoHirep, MGauge); + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MGauge_FundtoHirep_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 669b08ba..089341c1 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,38 +1,41 @@ modules_cc =\ + Modules/MScalar/ChargedProp.cc \ + Modules/MScalar/FreeProp.cc \ Modules/MContraction/WeakHamiltonianEye.cc \ Modules/MContraction/WeakHamiltonianNonEye.cc \ Modules/MContraction/WeakNeutral4ptDisc.cc \ - Modules/MGauge/Load.cc \ - Modules/MGauge/Random.cc \ Modules/MGauge/StochEm.cc \ Modules/MGauge/Unit.cc \ - Modules/MScalar/ChargedProp.cc \ - Modules/MScalar/FreeProp.cc + Modules/MGauge/Load.cc \ + Modules/MGauge/FundtoHirep.cc \ + Modules/MGauge/Random.cc modules_hpp =\ - Modules/MAction/DWF.hpp \ - Modules/MAction/Wilson.hpp \ - Modules/MContraction/Baryon.hpp \ - Modules/MContraction/DiscLoop.hpp \ - Modules/MContraction/Gamma3pt.hpp \ - Modules/MContraction/Meson.hpp \ - Modules/MContraction/WeakHamiltonian.hpp \ - Modules/MContraction/WeakHamiltonianEye.hpp \ - Modules/MContraction/WeakHamiltonianNonEye.hpp \ - Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MFermion/GaugeProp.hpp \ - Modules/MGauge/Load.hpp \ - Modules/MGauge/Random.hpp \ - Modules/MGauge/StochEm.hpp \ - Modules/MGauge/Unit.hpp \ Modules/MLoop/NoiseLoop.hpp \ Modules/MScalar/ChargedProp.hpp \ - Modules/MScalar/FreeProp.hpp \ Modules/MScalar/Scalar.hpp \ + Modules/MScalar/FreeProp.hpp \ + Modules/MSource/Wall.hpp \ + Modules/MSource/SeqGamma.hpp \ + Modules/MSource/Point.hpp \ + Modules/MSource/Z2.hpp \ + Modules/MFermion/GaugeProp.hpp \ + Modules/MContraction/Meson.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MContraction/DiscLoop.hpp \ + Modules/MContraction/Baryon.hpp \ + Modules/MContraction/Gamma3pt.hpp \ + Modules/MContraction/WeakNeutral4ptDisc.hpp \ + Modules/MContraction/WeakHamiltonian.hpp \ Modules/MSink/Point.hpp \ Modules/MSolver/RBPrecCG.hpp \ - Modules/MSource/Point.hpp \ - Modules/MSource/SeqGamma.hpp \ - Modules/MSource/Wall.hpp \ - Modules/MSource/Z2.hpp + Modules/MGauge/StochEm.hpp \ + Modules/MGauge/FundtoHirep.hpp \ + Modules/MGauge/Unit.hpp \ + Modules/MGauge/Load.hpp \ + Modules/MGauge/Random.hpp \ + Modules/MAction/WilsonClover.hpp \ + Modules/MAction/DWF.hpp \ + Modules/MAction/Wilson.hpp diff --git a/lib/qcd/QCD.h b/lib/qcd/QCD.h index 9913a071..2caea7e9 100644 --- a/lib/qcd/QCD.h +++ b/lib/qcd/QCD.h @@ -49,7 +49,7 @@ namespace QCD { static const int Zm = 6; static const int Tm = 7; - static const int Nc=3; + static const int Nc=4; static const int Ns=4; static const int Nd=4; static const int Nhs=2; // half spinor @@ -421,15 +421,16 @@ namespace QCD { ////////////////////////////////////////////// // Fermion <-> propagator assignements ////////////////////////////////////////////// - template - void FermToProp(Prop &p, const Ferm &f, const int s, const int c) + //template + template + void FermToProp(typename Fimpl::PropagatorField &p, const typename Fimpl::FermionField &f, const int s, const int c) { - for(int j = 0; j < Ns; ++j) + for(int j = 0; j < Ns; ++j) { auto pjs = peekSpin(p, j, s); auto fj = peekSpin(f, j); - for(int i = 0; i < Nc; ++i) + for(int i = 0; i < Fimpl::Dimension; ++i) { pokeColour(pjs, peekColour(fj, i), i, c); } @@ -437,15 +438,16 @@ namespace QCD { } } - template - void PropToFerm(Ferm &f, const Prop &p, const int s, const int c) + //template + template + void PropToFerm(typename Fimpl::FermionField &f, const typename Fimpl::PropagatorField &p, const int s, const int c) { for(int j = 0; j < Ns; ++j) { auto pjs = peekSpin(p, j, s); auto fj = peekSpin(f, j); - for(int i = 0; i < Nc; ++i) + for(int i = 0; i < Fimpl::Dimension; ++i) { pokeColour(fj, peekColour(pjs, i, c), i); } diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index ca5eba8b..0aea4b68 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -44,7 +44,8 @@ class WilsonFermionStatic { static const int npoint = 8; }; -struct WilsonAnisotropyCoefficients{ + struct WilsonAnisotropyCoefficients: Serializable + { GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonAnisotropyCoefficients, bool, isAnisotropic, int, t_direction, diff --git a/tests/hadrons/Test_hadrons_2AS_spectrum.cc b/tests/hadrons/Test_hadrons_2AS_spectrum.cc new file mode 100644 index 00000000..2f519834 --- /dev/null +++ b/tests/hadrons/Test_hadrons_2AS_spectrum.cc @@ -0,0 +1,168 @@ +/******************************************************************************* + Grid physics library, www.github.com/paboyle/Grid + + Source file: tests/hadrons/Test_hadrons_spectrum.cc + + Copyright (C) 2015 + + Author: Antonin Portelli + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution + directory. + *******************************************************************************/ + +#include + +using namespace Grid; +using namespace Hadrons; + + + BEGIN_HADRONS_NAMESPACE + BEGIN_MODULE_NAMESPACE(MFermion) + MODULE_REGISTER_NS(GaugeProp2AS, TGaugeProp, MFermion); + END_MODULE_NAMESPACE + BEGIN_MODULE_NAMESPACE(MSource) + MODULE_REGISTER_NS(Point2AS, TPoint, MSource); + END_MODULE_NAMESPACE + BEGIN_MODULE_NAMESPACE(MContraction) + MODULE_REGISTER_NS(Meson2AS, ARG(TMeson), MContraction); +// MODULE_REGISTER_NS(BaryonMultirep, ARG(TBaryon), MContraction); + END_MODULE_NAMESPACE + BEGIN_MODULE_NAMESPACE(MSink) + MODULE_REGISTER_NS(ScalarPoint2AS, TPoint, MSink); + END_MODULE_NAMESPACE + BEGIN_MODULE_NAMESPACE(MSolver) + MODULE_REGISTER_NS(RBPrecCG2AS, TRBPrecCG, MSolver); + END_MODULE_NAMESPACE + BEGIN_MODULE_NAMESPACE(MAction) + MODULE_REGISTER_NS(WilsonClover2AS, TWilsonClover, MAction); + END_MODULE_NAMESPACE + END_HADRONS_NAMESPACE + + +int main(int argc, char *argv[]) +{ + // initialization ////////////////////////////////////////////////////////// + Grid_init(&argc, &argv); + HadronsLogError.Active(GridLogError.isActive()); + HadronsLogWarning.Active(GridLogWarning.isActive()); + HadronsLogMessage.Active(GridLogMessage.isActive()); + HadronsLogIterative.Active(GridLogIterative.isActive()); + HadronsLogDebug.Active(GridLogDebug.isActive()); + LOG(Message) << "Grid initialized" << std::endl; + // run setup /////////////////////////////////////////////////////////////// + Application application; + std::vector flavour = {"l", "s"}; + std::vector mass = {-0.01, -0.04}; + double csw = 1.0; + // global parameters + Application::GlobalPar globalPar; + globalPar.trajCounter.start = 1500; + globalPar.trajCounter.end = 1520; + globalPar.trajCounter.step = 20; + globalPar.seed = "1 2 3 4"; + application.setPar(globalPar); + // gauge field + application.createModule("gauge"); + MSource::Point2AS::Par ptPar; + ptPar.position = "0 0 0 0"; + application.createModule("pt", ptPar); + // sink + MSink::ScalarPoint2AS::Par sinkPar; + sinkPar.mom = "0 0 0"; + application.createModule("sink", sinkPar); + + // set fermion boundary conditions to be periodic space, antiperiodic time. + std::string boundary = "1 1 1 -1"; + + for (unsigned int i = 0; i < flavour.size(); ++i) + { + // actions + MAction::WilsonClover2AS::Par actionPar; + actionPar.gauge = "gauge"; + actionPar.mass = mass[i]; + actionPar.csw_r = csw; + actionPar.csw_t = csw; + actionPar.clover_anisotropy.isAnisotropic= false; + actionPar.clover_anisotropy.t_direction = Nd-1 ; + actionPar.clover_anisotropy.xi_0 = 1.0 ; + actionPar.clover_anisotropy.nu = 1.0 ; + actionPar.boundary = boundary; + application.createModule("WilsonClover2AS_" + flavour[i], actionPar); + + // solvers + MSolver::RBPrecCG2AS::Par solverPar; + solverPar.action = "WilsonClover2AS_" + flavour[i]; + solverPar.residual = 1.0e-8; + application.createModule("CG_" + flavour[i], + solverPar); + + // propagators + MFermion::GaugeProp2AS::Par quarkPar; + quarkPar.solver = "CG_" + flavour[i]; + quarkPar.source = "pt"; + application.createModule("Qpt_" + flavour[i], quarkPar); + quarkPar.source = "z2"; + application.createModule("QZ2_" + flavour[i], quarkPar); + } + for (unsigned int i = 0; i < flavour.size(); ++i) + for (unsigned int j = i; j < flavour.size(); ++j) + { + MContraction::Meson2AS::Par mesPar; + + mesPar.output = "mesons2AS/pt_" + flavour[i] + flavour[j]; + mesPar.q1 = "Qpt_" + flavour[i]; + mesPar.q2 = "Qpt_" + flavour[j]; + mesPar.gammas = "all"; + mesPar.sink = "sink"; + application.createModule("meson_pt_" + + flavour[i] + flavour[j], + mesPar); + + // mesPar.output = "mesons2AS/Z2_" + flavour[i] + flavour[j]; + // mesPar.q1 = "QZ2_" + flavour[i]; + // mesPar.q2 = "QZ2_" + flavour[j]; + // mesPar.gammas = "all"; + // mesPar.sink = "sink"; + // application.createModule("meson_Z2_" + // + flavour[i] + flavour[j], + // mesPar); + } + for (unsigned int i = 0; i < flavour.size(); ++i) + for (unsigned int j = i; j < flavour.size(); ++j) + for (unsigned int k = j; k < flavour.size(); ++k) + { + MContraction::Baryon::Par barPar; + + barPar.output = "baryons/pt_" + flavour[i] + flavour[j] + flavour[k]; + barPar.q1 = "Qpt_" + flavour[i]; + barPar.q2 = "Qpt_" + flavour[j]; + barPar.q3 = "Qpt_" + flavour[k]; + application.createModule( + "baryon_pt_" + flavour[i] + flavour[j] + flavour[k], barPar); + } + + // execution + application.saveParameterFile("spectrum.xml"); + application.run(); + + // epilogue + LOG(Message) << "Grid is finalizing now" << std::endl; + Grid_finalize(); + + return EXIT_SUCCESS; +} diff --git a/tests/lanczos/Test_WCMultiRep_lanczos.cc b/tests/lanczos/Test_WCMultiRep_lanczos.cc new file mode 100644 index 00000000..e8549234 --- /dev/null +++ b/tests/lanczos/Test_WCMultiRep_lanczos.cc @@ -0,0 +1,108 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./tests/Test_dwf_lanczos.cc + +Copyright (C) 2015 + +Author: Peter Boyle + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +typedef WilsonFermionR FermionOp; +typedef typename WilsonFermionR::FermionField FermionField; + + +RealD AllZero(RealD x) { return 0.; } + +int main(int argc, char** argv) { + Grid_init(&argc, &argv); + + GridCartesian* UGrid = SpaceTimeGrid::makeFourDimGrid( + GridDefaultLatt(), GridDefaultSimd(Nd, vComplex::Nsimd()), + GridDefaultMpi()); + GridRedBlackCartesian* UrbGrid = + SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); + GridCartesian* FGrid = UGrid; + GridRedBlackCartesian* FrbGrid = UrbGrid; + printf("UGrid=%p UrbGrid=%p FGrid=%p FrbGrid=%p\n", UGrid, UrbGrid, FGrid, + FrbGrid); + + std::vector seeds4({1, 2, 3, 4}); + std::vector seeds5({5, 6, 7, 8}); + GridParallelRNG RNG5(FGrid); + RNG5.SeedFixedIntegers(seeds5); + GridParallelRNG RNG4(UGrid); + RNG4.SeedFixedIntegers(seeds4); + GridParallelRNG RNG5rb(FrbGrid); + RNG5.SeedFixedIntegers(seeds5); + + LatticeGaugeField Umu(UGrid); + SU3::HotConfiguration(RNG4, Umu); + +/* + std::vector U(4, UGrid); + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); + } +*/ + + RealD mass = -0.1; + RealD M5 = 1.8; + RealD mob_b = 1.5; + FermionOp WilsonOperator(Umu,*FGrid,*FrbGrid,mass); + MdagMLinearOperator HermOp(WilsonOperator); /// <----- + //SchurDiagTwoOperator HermOp(WilsonOperator); + + const int Nstop = 20; + const int Nk = 60; + const int Np = 60; + const int Nm = Nk + Np; + const int MaxIt = 10000; + RealD resid = 1.0e-6; + + std::vector Coeffs{0, 1.}; + Polynomial PolyX(Coeffs); + Chebyshev Cheb(0.0, 10., 12); + ImplicitlyRestartedLanczos IRL(HermOp, PolyX, Nstop, Nk, Nm, + resid, MaxIt); + + std::vector eval(Nm); + FermionField src(FGrid); + gaussian(RNG5, src); + std::vector evec(Nm, FGrid); + for (int i = 0; i < 1; i++) { + std::cout << i << " / " << Nm << " grid pointer " << evec[i]._grid + << std::endl; + }; + + int Nconv; + IRL.calc(eval, evec, src, Nconv); + + std::cout << eval << std::endl; + + Grid_finalize(); +} From 185da83454961773a4666d4fff45724abb426f5b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 26 Dec 2017 14:05:17 +0100 Subject: [PATCH 089/620] Hadrons: new MIO module namespace, NERSC loader moved there --- extras/Hadrons/Modules.hpp | 9 +++--- .../{MGauge/Load.cc => MIO/LoadNersc.cc} | 25 +++++++--------- .../{MGauge/Load.hpp => MIO/LoadNersc.hpp} | 30 ++++++++----------- extras/Hadrons/modules.inc | 8 ++--- 4 files changed, 32 insertions(+), 40 deletions(-) rename extras/Hadrons/Modules/{MGauge/Load.cc => MIO/LoadNersc.cc} (81%) rename extras/Hadrons/Modules/{MGauge/Load.hpp => MIO/LoadNersc.hpp} (75%) diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index cf381d0f..3ae2f9a7 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -2,13 +2,12 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules.hpp +Source file: Modules.hpp -Copyright (C) 2015 -Copyright (C) 2016 -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 @@ -46,7 +45,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include -#include #include #include #include @@ -58,3 +56,4 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include diff --git a/extras/Hadrons/Modules/MGauge/Load.cc b/extras/Hadrons/Modules/MIO/LoadNersc.cc similarity index 81% rename from extras/Hadrons/Modules/MGauge/Load.cc rename to extras/Hadrons/Modules/MIO/LoadNersc.cc index b168a010..2c35d2e1 100644 --- a/extras/Hadrons/Modules/MGauge/Load.cc +++ b/extras/Hadrons/Modules/MIO/LoadNersc.cc @@ -2,12 +2,10 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/Load.cc +Source file: LoadNersc.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 -Author: Antonin Portelli 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 @@ -26,30 +24,29 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ - -#include +#include using namespace Grid; using namespace Hadrons; -using namespace MGauge; +using namespace MIO; /****************************************************************************** -* TLoad implementation * +* TLoadNersc implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// -TLoad::TLoad(const std::string name) -: Module(name) +TLoadNersc::TLoadNersc(const std::string name) +: Module(name) {} // dependencies/products /////////////////////////////////////////////////////// -std::vector TLoad::getInput(void) +std::vector TLoadNersc::getInput(void) { std::vector in; return in; } -std::vector TLoad::getOutput(void) +std::vector TLoadNersc::getOutput(void) { std::vector out = {getName()}; @@ -57,13 +54,13 @@ std::vector TLoad::getOutput(void) } // setup /////////////////////////////////////////////////////////////////////// -void TLoad::setup(void) +void TLoadNersc::setup(void) { envCreateLat(LatticeGaugeField, getName()); } // execution /////////////////////////////////////////////////////////////////// -void TLoad::execute(void) +void TLoadNersc::execute(void) { FieldMetaData header; std::string fileName = par().file + "." diff --git a/extras/Hadrons/Modules/MGauge/Load.hpp b/extras/Hadrons/Modules/MIO/LoadNersc.hpp similarity index 75% rename from extras/Hadrons/Modules/MGauge/Load.hpp rename to extras/Hadrons/Modules/MIO/LoadNersc.hpp index a338af79..5bd251c3 100644 --- a/extras/Hadrons/Modules/MGauge/Load.hpp +++ b/extras/Hadrons/Modules/MIO/LoadNersc.hpp @@ -2,12 +2,10 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/Load.hpp +Source file: LoadNersc.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 -Author: Antonin Portelli 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 @@ -26,9 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ - -#ifndef Hadrons_MGauge_Load_hpp_ -#define Hadrons_MGauge_Load_hpp_ +#ifndef Hadrons_MIO_LoadNersc_hpp_ +#define Hadrons_MIO_LoadNersc_hpp_ #include #include @@ -37,38 +34,37 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * Load a NERSC configuration * + * Load a NERSC configuration * ******************************************************************************/ -BEGIN_MODULE_NAMESPACE(MGauge) +BEGIN_MODULE_NAMESPACE(MIO) -class LoadPar: Serializable +class LoadNerscPar: Serializable { public: - GRID_SERIALIZABLE_CLASS_MEMBERS(LoadPar, + GRID_SERIALIZABLE_CLASS_MEMBERS(LoadNerscPar, std::string, file); }; -class TLoad: public Module +class TLoadNersc: public Module { public: // constructor - TLoad(const std::string name); + TLoadNersc(const std::string name); // destructor - virtual ~TLoad(void) = default; + virtual ~TLoadNersc(void) = default; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); -protected: // setup virtual void setup(void); // execution virtual void execute(void); }; -MODULE_REGISTER_NS(Load, TLoad, MGauge); +MODULE_REGISTER_NS(LoadNersc, TLoadNersc, MIO); END_MODULE_NAMESPACE END_HADRONS_NAMESPACE -#endif // Hadrons_MGauge_Load_hpp_ +#endif // Hadrons_MIO_LoadNersc_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 199bb5cd..85fa0971 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -2,12 +2,12 @@ modules_cc =\ Modules/MContraction/WeakHamiltonianEye.cc \ Modules/MContraction/WeakNeutral4ptDisc.cc \ Modules/MContraction/WeakHamiltonianNonEye.cc \ - Modules/MGauge/Load.cc \ Modules/MGauge/Unit.cc \ Modules/MGauge/StochEm.cc \ Modules/MGauge/Random.cc \ Modules/MScalar/FreeProp.cc \ - Modules/MScalar/ChargedProp.cc + Modules/MScalar/ChargedProp.cc \ + Modules/MIO/LoadNersc.cc modules_hpp =\ Modules/MContraction/Baryon.hpp \ @@ -28,7 +28,6 @@ modules_hpp =\ Modules/MSink/Smear.hpp \ Modules/MSink/Point.hpp \ Modules/MSolver/RBPrecCG.hpp \ - Modules/MGauge/Load.hpp \ Modules/MGauge/Unit.hpp \ Modules/MGauge/Random.hpp \ Modules/MGauge/StochEm.hpp \ @@ -39,5 +38,6 @@ modules_hpp =\ Modules/MScalar/Scalar.hpp \ Modules/MScalar/ChargedProp.hpp \ Modules/MAction/DWF.hpp \ - Modules/MAction/Wilson.hpp + Modules/MAction/Wilson.hpp \ + Modules/MIO/LoadNersc.hpp From 8b30c5956c7e78250303a1a80e6fd0cd79a7682a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 26 Dec 2017 14:16:47 +0100 Subject: [PATCH 090/620] Hadrons: copyright update --- extras/Hadrons/Application.cc | 3 +- extras/Hadrons/Application.hpp | 3 +- extras/Hadrons/Environment.cc | 3 +- extras/Hadrons/Environment.hpp | 3 +- extras/Hadrons/Exceptions.cc | 4 +-- extras/Hadrons/Exceptions.hpp | 2 +- extras/Hadrons/Factory.hpp | 3 +- extras/Hadrons/GeneticScheduler.hpp | 3 +- extras/Hadrons/Global.cc | 3 +- extras/Hadrons/Global.hpp | 4 +-- extras/Hadrons/Graph.hpp | 3 +- extras/Hadrons/HadronsXmlRun.cc | 3 +- extras/Hadrons/HadronsXmlSchedule.cc | 3 +- extras/Hadrons/Module.cc | 3 +- extras/Hadrons/Module.hpp | 3 +- extras/Hadrons/ModuleFactory.hpp | 3 +- extras/Hadrons/Modules.hpp | 2 +- extras/Hadrons/Modules/MAction/DWF.hpp | 4 +-- extras/Hadrons/Modules/MAction/Wilson.hpp | 4 +-- .../Hadrons/Modules/MContraction/Baryon.hpp | 4 +-- .../Hadrons/Modules/MContraction/DiscLoop.hpp | 5 ++-- .../Hadrons/Modules/MContraction/Gamma3pt.hpp | 5 ++-- extras/Hadrons/Modules/MContraction/Meson.hpp | 6 ++-- .../Modules/MContraction/WardIdentity.hpp | 5 ++-- .../Modules/MContraction/WeakHamiltonian.hpp | 5 ++-- .../MContraction/WeakHamiltonianEye.cc | 5 ++-- .../MContraction/WeakHamiltonianEye.hpp | 5 ++-- .../MContraction/WeakHamiltonianNonEye.cc | 5 ++-- .../MContraction/WeakHamiltonianNonEye.hpp | 5 ++-- .../MContraction/WeakNeutral4ptDisc.cc | 5 ++-- .../MContraction/WeakNeutral4ptDisc.hpp | 5 ++-- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 6 ++-- extras/Hadrons/Modules/MGauge/Random.cc | 3 +- extras/Hadrons/Modules/MGauge/Random.hpp | 3 +- extras/Hadrons/Modules/MGauge/StochEm.cc | 4 +-- extras/Hadrons/Modules/MGauge/StochEm.hpp | 4 +-- extras/Hadrons/Modules/MGauge/Unit.cc | 3 +- extras/Hadrons/Modules/MGauge/Unit.hpp | 3 +- extras/Hadrons/Modules/MIO/LoadNersc.cc | 3 +- extras/Hadrons/Modules/MIO/LoadNersc.hpp | 3 +- extras/Hadrons/Modules/MLoop/NoiseLoop.hpp | 5 ++-- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 28 +++++++++++++++++++ .../Hadrons/Modules/MScalar/ChargedProp.hpp | 27 ++++++++++++++++++ extras/Hadrons/Modules/MScalar/FreeProp.cc | 27 ++++++++++++++++++ extras/Hadrons/Modules/MScalar/FreeProp.hpp | 27 ++++++++++++++++++ extras/Hadrons/Modules/MScalar/Scalar.hpp | 27 ++++++++++++++++++ extras/Hadrons/Modules/MSink/Point.hpp | 3 +- extras/Hadrons/Modules/MSink/Smear.hpp | 5 ++-- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 3 +- extras/Hadrons/Modules/MSource/Point.hpp | 4 +-- .../Hadrons/Modules/MSource/SeqConserved.hpp | 7 +++-- extras/Hadrons/Modules/MSource/SeqGamma.hpp | 5 ++-- extras/Hadrons/Modules/MSource/Wall.hpp | 5 ++-- extras/Hadrons/Modules/MSource/Z2.hpp | 3 +- .../Modules/MUtilities/TestSeqConserved.hpp | 5 ++-- .../Modules/MUtilities/TestSeqGamma.hpp | 5 ++-- extras/Hadrons/VirtualMachine.cc | 2 +- extras/Hadrons/VirtualMachine.hpp | 2 +- scripts/copyright | 5 ++-- 59 files changed, 238 insertions(+), 108 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 9a3366d4..6d5d6776 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Application.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Application.hpp b/extras/Hadrons/Application.hpp index 4b2ce77b..8cd15433 100644 --- a/extras/Hadrons/Application.hpp +++ b/extras/Hadrons/Application.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Application.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index 6de13e86..82b0dda1 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Environment.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index 7f1bc26d..e9bfffe1 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Environment.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Exceptions.cc b/extras/Hadrons/Exceptions.cc index bf532c21..eedc03b1 100644 --- a/extras/Hadrons/Exceptions.cc +++ b/extras/Hadrons/Exceptions.cc @@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Exceptions.cc -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli @@ -54,4 +54,4 @@ CONST_EXC(Io, Runtime("IO error: " + msg, loc)) CONST_EXC(Memory, Runtime("memory error: " + msg, loc)) CONST_EXC(Parsing, Runtime("parsing error: " + msg, loc)) CONST_EXC(Program, Runtime("program error: " + msg, loc)) -CONST_EXC(System, Runtime("system error: " + msg, loc)) \ No newline at end of file +CONST_EXC(System, Runtime("system error: " + msg, loc)) diff --git a/extras/Hadrons/Exceptions.hpp b/extras/Hadrons/Exceptions.hpp index 8f04ab41..ab588e5e 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/extras/Hadrons/Exceptions.hpp @@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Exceptions.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Factory.hpp b/extras/Hadrons/Factory.hpp index 65ce03ca..705a639e 100644 --- a/extras/Hadrons/Factory.hpp +++ b/extras/Hadrons/Factory.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Factory.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/GeneticScheduler.hpp b/extras/Hadrons/GeneticScheduler.hpp index f199f1ed..9a6476c3 100644 --- a/extras/Hadrons/GeneticScheduler.hpp +++ b/extras/Hadrons/GeneticScheduler.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/GeneticScheduler.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 130ede96..fc41424c 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Global.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index ebfe94dc..1b4e5f9a 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Global.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Graph.hpp b/extras/Hadrons/Graph.hpp index a9c240fa..67694aa8 100644 --- a/extras/Hadrons/Graph.hpp +++ b/extras/Hadrons/Graph.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Graph.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/HadronsXmlRun.cc b/extras/Hadrons/HadronsXmlRun.cc index 0dff8f9a..07eb096e 100644 --- a/extras/Hadrons/HadronsXmlRun.cc +++ b/extras/Hadrons/HadronsXmlRun.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/HadronsXmlRun.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/HadronsXmlSchedule.cc b/extras/Hadrons/HadronsXmlSchedule.cc index a8ca9a63..6b167690 100644 --- a/extras/Hadrons/HadronsXmlSchedule.cc +++ b/extras/Hadrons/HadronsXmlSchedule.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/HadronsXmlSchedule.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Module.cc b/extras/Hadrons/Module.cc index e5ef0fe4..54978f93 100644 --- a/extras/Hadrons/Module.cc +++ b/extras/Hadrons/Module.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Module.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index b71f779d..2ba425e4 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Module.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/ModuleFactory.hpp b/extras/Hadrons/ModuleFactory.hpp index 48ab305c..d5c703fa 100644 --- a/extras/Hadrons/ModuleFactory.hpp +++ b/extras/Hadrons/ModuleFactory.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/ModuleFactory.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 3ae2f9a7..7f7c5dc7 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: Modules.hpp +Source file: extras/Hadrons/Modules.hpp Copyright (C) 2015-2018 diff --git a/extras/Hadrons/Modules/MAction/DWF.hpp b/extras/Hadrons/Modules/MAction/DWF.hpp index d99f1165..4dfd06cf 100644 --- a/extras/Hadrons/Modules/MAction/DWF.hpp +++ b/extras/Hadrons/Modules/MAction/DWF.hpp @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MAction/DWF.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MAction/Wilson.hpp b/extras/Hadrons/Modules/MAction/Wilson.hpp index 8ef755bb..6467b3ee 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.hpp +++ b/extras/Hadrons/Modules/MAction/Wilson.hpp @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MAction/Wilson.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/Baryon.hpp b/extras/Hadrons/Modules/MContraction/Baryon.hpp index 1ef2e257..625c7108 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.hpp +++ b/extras/Hadrons/Modules/MContraction/Baryon.hpp @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/Baryon.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp index ef50061c..3d08f0eb 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp +++ b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/DiscLoop.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp index fb9a9d4b..68701aeb 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp +++ b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/Gamma3pt.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index 46bbdb2e..5cf504e3 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -4,12 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/Meson.hpp -Copyright (C) 2015 -Copyright (C) 2016 -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli - Andrew Lawson +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp index 556450a8..2801d88c 100644 --- a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp +++ b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WardIdentity.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp index 7df40370..9d8ada98 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc index 43dfa609..b79c09e7 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp index 3a2b9309..24f39f6c 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc index 8a7113e3..e66b6ee7 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp index eb5abe3c..c4cd66f1 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc index 18423f3e..e0a00472 100644 --- a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc +++ b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp index f26d4636..5de2a751 100644 --- a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp +++ b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index 05b3d17a..33787a0b 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -4,12 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MFermion/GaugeProp.hpp -Copyright (C) 2015 -Copyright (C) 2016 -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli - Andrew Lawson +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MGauge/Random.cc b/extras/Hadrons/Modules/MGauge/Random.cc index 97afd338..962fc243 100644 --- a/extras/Hadrons/Modules/MGauge/Random.cc +++ b/extras/Hadrons/Modules/MGauge/Random.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/Random.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Modules/MGauge/Random.hpp b/extras/Hadrons/Modules/MGauge/Random.hpp index a07130e4..51a08dbb 100644 --- a/extras/Hadrons/Modules/MGauge/Random.hpp +++ b/extras/Hadrons/Modules/MGauge/Random.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/Random.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index c5318573..21b7f626 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -4,9 +4,9 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/StochEm.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 +Author: Antonin Portelli 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 diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index bacb5172..87b70880 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -4,9 +4,9 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 +Author: Antonin Portelli 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 diff --git a/extras/Hadrons/Modules/MGauge/Unit.cc b/extras/Hadrons/Modules/MGauge/Unit.cc index 8bee1ecc..38b5f3aa 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.cc +++ b/extras/Hadrons/Modules/MGauge/Unit.cc @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/Unit.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Modules/MGauge/Unit.hpp b/extras/Hadrons/Modules/MGauge/Unit.hpp index c1650cc7..d6ce5a6b 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.hpp +++ b/extras/Hadrons/Modules/MGauge/Unit.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/Unit.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Modules/MIO/LoadNersc.cc b/extras/Hadrons/Modules/MIO/LoadNersc.cc index 2c35d2e1..f20606fc 100644 --- a/extras/Hadrons/Modules/MIO/LoadNersc.cc +++ b/extras/Hadrons/Modules/MIO/LoadNersc.cc @@ -2,10 +2,11 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: LoadNersc.cc +Source file: extras/Hadrons/Modules/MIO/LoadNersc.cc Copyright (C) 2015-2018 +Author: Antonin Portelli 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 diff --git a/extras/Hadrons/Modules/MIO/LoadNersc.hpp b/extras/Hadrons/Modules/MIO/LoadNersc.hpp index 5bd251c3..d6742e1e 100644 --- a/extras/Hadrons/Modules/MIO/LoadNersc.hpp +++ b/extras/Hadrons/Modules/MIO/LoadNersc.hpp @@ -2,10 +2,11 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: LoadNersc.hpp +Source file: extras/Hadrons/Modules/MIO/LoadNersc.hpp Copyright (C) 2015-2018 +Author: Antonin Portelli 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 diff --git a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp b/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp index 512c731a..e61bf163 100644 --- a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp +++ b/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MLoop/NoiseLoop.hpp -Copyright (C) 2016 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 6cb75a28..da82617f 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -1,3 +1,31 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/ChargedProp.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: James Harrison + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index cfcce28e..4d43aec2 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/ChargedProp.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalar_ChargedProp_hpp_ #define Hadrons_MScalar_ChargedProp_hpp_ diff --git a/extras/Hadrons/Modules/MScalar/FreeProp.cc b/extras/Hadrons/Modules/MScalar/FreeProp.cc index 924db288..ee86b9db 100644 --- a/extras/Hadrons/Modules/MScalar/FreeProp.cc +++ b/extras/Hadrons/Modules/MScalar/FreeProp.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/FreeProp.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include diff --git a/extras/Hadrons/Modules/MScalar/FreeProp.hpp b/extras/Hadrons/Modules/MScalar/FreeProp.hpp index 6b956134..df17f44e 100644 --- a/extras/Hadrons/Modules/MScalar/FreeProp.hpp +++ b/extras/Hadrons/Modules/MScalar/FreeProp.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/FreeProp.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalar_FreeProp_hpp_ #define Hadrons_MScalar_FreeProp_hpp_ diff --git a/extras/Hadrons/Modules/MScalar/Scalar.hpp b/extras/Hadrons/Modules/MScalar/Scalar.hpp index db702ff2..7272f1b3 100644 --- a/extras/Hadrons/Modules/MScalar/Scalar.hpp +++ b/extras/Hadrons/Modules/MScalar/Scalar.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/Scalar.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_Scalar_hpp_ #define Hadrons_Scalar_hpp_ diff --git a/extras/Hadrons/Modules/MSink/Point.hpp b/extras/Hadrons/Modules/MSink/Point.hpp index 43be3009..c5f6eff0 100644 --- a/extras/Hadrons/Modules/MSink/Point.hpp +++ b/extras/Hadrons/Modules/MSink/Point.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSink/Point.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MSink/Smear.hpp b/extras/Hadrons/Modules/MSink/Smear.hpp index e85ab263..e72dece0 100644 --- a/extras/Hadrons/Modules/MSink/Smear.hpp +++ b/extras/Hadrons/Modules/MSink/Smear.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSink/Smear.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index bb4f3f62..54c0f2d8 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Modules/MSource/Point.hpp b/extras/Hadrons/Modules/MSource/Point.hpp index 1d8241cf..ac6df252 100644 --- a/extras/Hadrons/Modules/MSource/Point.hpp +++ b/extras/Hadrons/Modules/MSource/Point.hpp @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSource/Point.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.hpp b/extras/Hadrons/Modules/MSource/SeqConserved.hpp index 3e8ef457..ee8d8d56 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/extras/Hadrons/Modules/MSource/SeqConserved.hpp @@ -2,11 +2,12 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/SeqConserved.hpp +Source file: extras/Hadrons/Modules/MSource/SeqConserved.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.hpp b/extras/Hadrons/Modules/MSource/SeqGamma.hpp index abad5ace..40eda29f 100644 --- a/extras/Hadrons/Modules/MSource/SeqGamma.hpp +++ b/extras/Hadrons/Modules/MSource/SeqGamma.hpp @@ -4,11 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSource/SeqGamma.hpp -Copyright (C) 2015 -Copyright (C) 2016 -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MSource/Wall.hpp b/extras/Hadrons/Modules/MSource/Wall.hpp index 9d5f1f46..5853b11a 100644 --- a/extras/Hadrons/Modules/MSource/Wall.hpp +++ b/extras/Hadrons/Modules/MSource/Wall.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSource/Wall.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MSource/Z2.hpp b/extras/Hadrons/Modules/MSource/Z2.hpp index 3593cb34..4414e37f 100644 --- a/extras/Hadrons/Modules/MSource/Z2.hpp +++ b/extras/Hadrons/Modules/MSource/Z2.hpp @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSource/Z2.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp index 0647884c..6ee1e3c2 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp +++ b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp index fd53eab8..df35d887 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp +++ b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp @@ -4,9 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 -Author: Andrew Lawson +Author: Antonin Portelli +Author: Lanny91 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 diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index e0035bc1..d47bafb7 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/VirtualMachine.cc -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/extras/Hadrons/VirtualMachine.hpp b/extras/Hadrons/VirtualMachine.hpp index 3af7d914..19a74f94 100644 --- a/extras/Hadrons/VirtualMachine.hpp +++ b/extras/Hadrons/VirtualMachine.hpp @@ -4,7 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/VirtualMachine.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 Author: Antonin Portelli diff --git a/scripts/copyright b/scripts/copyright index cc9ed6e5..a461b54c 100755 --- a/scripts/copyright +++ b/scripts/copyright @@ -11,8 +11,7 @@ Grid physics library, www.github.com/paboyle/Grid Source file: $1 -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 EOF @@ -60,4 +59,4 @@ shift done - +rm message tmp.fil From e8ac75055c0566fc56663240e07d2d8340ad5799 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 27 Dec 2017 14:24:29 +0100 Subject: [PATCH 091/620] Hadrons: binary configuration loader --- extras/Hadrons/Global.hpp | 6 +- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MIO/LoadBinary.hpp | 140 ++++++++++++++++++++++ extras/Hadrons/modules.inc | 3 +- 4 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 extras/Hadrons/Modules/MIO/LoadBinary.hpp diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 1b4e5f9a..c68edafd 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -61,6 +61,9 @@ using Grid::operator<<; #ifndef SIMPL #define SIMPL ScalarImplCR #endif +#ifndef GIMPL +#define GIMPL GimplTypesR +#endif BEGIN_HADRONS_NAMESPACE @@ -84,7 +87,8 @@ typedef std::function SolverFn##suffix; #define SINK_TYPE_ALIASES(suffix)\ -typedef std::function SinkFn##suffix; +typedef std::function SinkFn##suffix; #define FGS_TYPE_ALIASES(FImpl, suffix)\ FERM_TYPE_ALIASES(FImpl, suffix)\ diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 7f7c5dc7..e50d2b0b 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -57,3 +57,4 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.hpp b/extras/Hadrons/Modules/MIO/LoadBinary.hpp new file mode 100644 index 00000000..5e45dfd8 --- /dev/null +++ b/extras/Hadrons/Modules/MIO/LoadBinary.hpp @@ -0,0 +1,140 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MIO/LoadBinary.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MIO_LoadBinary_hpp_ +#define Hadrons_MIO_LoadBinary_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Load a binary configurations * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MIO) + +class LoadBinaryPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(LoadBinaryPar, + std::string, file, + std::string, format); +}; + +template +class TLoadBinary: public Module +{ +public: + typedef typename Impl::Field Field; + typedef typename Impl::Simd Simd; + typedef typename Field::vector_object vobj; + typedef typename vobj::scalar_object sobj; + typedef typename sobj::DoublePrecision sobj_double; + typedef BinarySimpleMunger Munger; +public: + // constructor + TLoadBinary(const std::string name); + // destructor + virtual ~TLoadBinary(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(LoadBinary, TLoadBinary, MIO); +MODULE_REGISTER_NS(LoadBinaryScalarSU2, TLoadBinary>, MIO); +MODULE_REGISTER_NS(LoadBinaryScalarSU3, TLoadBinary>, MIO); +MODULE_REGISTER_NS(LoadBinaryScalarSU4, TLoadBinary>, MIO); +MODULE_REGISTER_NS(LoadBinaryScalarSU5, TLoadBinary>, MIO); +MODULE_REGISTER_NS(LoadBinaryScalarSU6, TLoadBinary>, MIO); + +/****************************************************************************** + * TLoadBinary implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TLoadBinary::TLoadBinary(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TLoadBinary::getInput(void) +{ + std::vector in; + + return in; +} + +template +std::vector TLoadBinary::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TLoadBinary::setup(void) +{ + envCreateLat(Field, getName()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TLoadBinary::execute(void) +{ + Munger munge; + uint32_t nersc_csum, scidac_csuma, scidac_csumb; + auto &U = envGet(Field, getName()); + std::string filename = par().file + "." + + std::to_string(vm().getTrajectory()); + + LOG(Message) << "Loading " << par().format + << "binary configuration from file '" << filename + << "'" << std::endl; + BinaryIO::readLatticeObject(U, filename, munge, 0, + par().format, nersc_csum, + scidac_csuma, scidac_csumb); + LOG(Message) << "Checksums:" << std::endl; + LOG(Message) << " NERSC " << nersc_csum << std::endl; + LOG(Message) << " SciDAC A " << scidac_csuma << std::endl; + LOG(Message) << " SciDAC B " << scidac_csumb << std::endl; +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MIO_LoadBinary_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 85fa0971..6e1ef6dc 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -39,5 +39,6 @@ modules_hpp =\ Modules/MScalar/ChargedProp.hpp \ Modules/MAction/DWF.hpp \ Modules/MAction/Wilson.hpp \ - Modules/MIO/LoadNersc.hpp + Modules/MIO/LoadNersc.hpp \ + Modules/MIO/LoadBinary.hpp From 0d612039ed4c16c5dc0234bc243a631f6e7173b8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 29 Dec 2017 16:58:23 +0100 Subject: [PATCH 092/620] Hadrons: prettier Grid logging (non-intrusive) --- extras/Hadrons/Application.cc | 1 + extras/Hadrons/Global.cc | 15 +++++++++++++++ extras/Hadrons/Global.hpp | 2 ++ extras/Hadrons/HadronsXmlRun.cc | 6 ------ extras/Hadrons/HadronsXmlSchedule.cc | 6 ------ lib/log/Log.h | 9 ++++++++- 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 6d5d6776..7ba98ade 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -42,6 +42,7 @@ using namespace Hadrons; // constructors //////////////////////////////////////////////////////////////// Application::Application(void) { + initLogger(); LOG(Message) << "Modules available:" << std::endl; auto list = ModuleFactory::getInstance().getBuilderList(); for (auto &m: list) diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index fc41424c..942a4243 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -38,6 +38,21 @@ HadronsLogger Hadrons::HadronsLogMessage(1,"Message"); HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative"); HadronsLogger Hadrons::HadronsLogDebug(1,"Debug"); +void Hadrons::initLogger(void) +{ + auto w = std::string("Hadrons").length(); + GridLogError.setTopWidth(w); + GridLogWarning.setTopWidth(w); + GridLogMessage.setTopWidth(w); + GridLogIterative.setTopWidth(w); + GridLogDebug.setTopWidth(w); + HadronsLogError.Active(GridLogError.isActive()); + HadronsLogWarning.Active(GridLogWarning.isActive()); + HadronsLogMessage.Active(GridLogMessage.isActive()); + HadronsLogIterative.Active(GridLogIterative.isActive()); + HadronsLogDebug.Active(GridLogDebug.isActive()); +} + // type utilities ////////////////////////////////////////////////////////////// constexpr unsigned int maxNameSize = 1024u; diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index c68edafd..274e1934 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -112,6 +112,8 @@ extern HadronsLogger HadronsLogMessage; extern HadronsLogger HadronsLogIterative; extern HadronsLogger HadronsLogDebug; +void initLogger(void); + // singleton pattern #define SINGLETON(name)\ public:\ diff --git a/extras/Hadrons/HadronsXmlRun.cc b/extras/Hadrons/HadronsXmlRun.cc index 07eb096e..680f234b 100644 --- a/extras/Hadrons/HadronsXmlRun.cc +++ b/extras/Hadrons/HadronsXmlRun.cc @@ -54,12 +54,6 @@ int main(int argc, char *argv[]) // initialization Grid_init(&argc, &argv); - HadronsLogError.Active(GridLogError.isActive()); - HadronsLogWarning.Active(GridLogWarning.isActive()); - HadronsLogMessage.Active(GridLogMessage.isActive()); - HadronsLogIterative.Active(GridLogIterative.isActive()); - HadronsLogDebug.Active(GridLogDebug.isActive()); - LOG(Message) << "Grid initialized" << std::endl; // execution Application application(parameterFileName); diff --git a/extras/Hadrons/HadronsXmlSchedule.cc b/extras/Hadrons/HadronsXmlSchedule.cc index 6b167690..55f3b231 100644 --- a/extras/Hadrons/HadronsXmlSchedule.cc +++ b/extras/Hadrons/HadronsXmlSchedule.cc @@ -48,12 +48,6 @@ int main(int argc, char *argv[]) // initialization Grid_init(&argc, &argv); - HadronsLogError.Active(GridLogError.isActive()); - HadronsLogWarning.Active(GridLogWarning.isActive()); - HadronsLogMessage.Active(GridLogMessage.isActive()); - HadronsLogIterative.Active(GridLogIterative.isActive()); - HadronsLogDebug.Active(GridLogDebug.isActive()); - LOG(Message) << "Grid initialized" << std::endl; // execution Application application; diff --git a/lib/log/Log.h b/lib/log/Log.h index ddff4c1d..011a7250 100644 --- a/lib/log/Log.h +++ b/lib/log/Log.h @@ -86,6 +86,7 @@ protected: Colours &Painter; int active; int timing_mode; + int topWidth{-1}; static int timestamp; std::string name, topName; std::string COLOUR; @@ -124,11 +125,17 @@ public: Reset(); } } + void setTopWidth(const int w) {topWidth = w;} friend std::ostream& operator<< (std::ostream& stream, Logger& log){ if ( log.active ) { - stream << log.background()<< std::left << log.topName << log.background()<< " : "; + stream << log.background()<< std::left; + if (log.topWidth > 0) + { + stream << std::setw(log.topWidth); + } + stream << log.topName << log.background()<< " : "; stream << log.colour() << std::left << log.name << log.background() << " : "; if ( log.timestamp ) { log.StopWatch->Stop(); From dd62f2f371cce3236f4e38dfd8502b0a68fa01ba Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 29 Dec 2017 16:58:44 +0100 Subject: [PATCH 093/620] Hadrons: log message fix --- extras/Hadrons/Modules/MIO/LoadBinary.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.hpp b/extras/Hadrons/Modules/MIO/LoadBinary.hpp index 5e45dfd8..d9a8b5f8 100644 --- a/extras/Hadrons/Modules/MIO/LoadBinary.hpp +++ b/extras/Hadrons/Modules/MIO/LoadBinary.hpp @@ -122,7 +122,7 @@ void TLoadBinary::execute(void) + std::to_string(vm().getTrajectory()); LOG(Message) << "Loading " << par().format - << "binary configuration from file '" << filename + << " binary configuration from file '" << filename << "'" << std::endl; BinaryIO::readLatticeObject(U, filename, munge, 0, par().format, nersc_csum, From 9028e278e4ededffb45b4d2e510c79860d536584 Mon Sep 17 00:00:00 2001 From: David Preti Date: Sat, 6 Jan 2018 15:57:38 +0100 Subject: [PATCH 094/620] Trying to fix a bug with SU4 mesons (still under investigation) --- extras/Hadrons/Modules/MGauge/Load.cc | 3 +- extras/Hadrons/Modules/MGauge/Random.cc | 2 +- extras/Hadrons/Modules/MGauge/Unit.cc | 2 +- tests/hadrons/Test_hadrons_wilsonFund.cc | 160 +++++++++++++++++++++++ 4 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 tests/hadrons/Test_hadrons_wilsonFund.cc diff --git a/extras/Hadrons/Modules/MGauge/Load.cc b/extras/Hadrons/Modules/MGauge/Load.cc index 062e7e98..97be9539 100644 --- a/extras/Hadrons/Modules/MGauge/Load.cc +++ b/extras/Hadrons/Modules/MGauge/Load.cc @@ -66,7 +66,8 @@ void TLoad::setup(void) void TLoad::execute(void) { FieldMetaData header; - std::string fileName = par().file + "." + + std::string fileName = par().file + "ckpoint_lat." + std::to_string(env().getTrajectory()); LOG(Message) << "Loading NERSC configuration from file '" << fileName diff --git a/extras/Hadrons/Modules/MGauge/Random.cc b/extras/Hadrons/Modules/MGauge/Random.cc index c10fdfc3..5c063361 100644 --- a/extras/Hadrons/Modules/MGauge/Random.cc +++ b/extras/Hadrons/Modules/MGauge/Random.cc @@ -65,5 +65,5 @@ void TRandom::execute(void) { LOG(Message) << "Generating random gauge configuration" << std::endl; LatticeGaugeField &U = *env().createLattice(getName()); - SU3::HotConfiguration(*env().get4dRng(), U); + SU4::HotConfiguration(*env().get4dRng(), U); } diff --git a/extras/Hadrons/Modules/MGauge/Unit.cc b/extras/Hadrons/Modules/MGauge/Unit.cc index 18d75c59..12696ee9 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.cc +++ b/extras/Hadrons/Modules/MGauge/Unit.cc @@ -65,5 +65,5 @@ void TUnit::execute(void) { LOG(Message) << "Creating unit gauge configuration" << std::endl; LatticeGaugeField &U = *env().createLattice(getName()); - SU3::ColdConfiguration(*env().get4dRng(), U); + SU4::ColdConfiguration(*env().get4dRng(), U); } diff --git a/tests/hadrons/Test_hadrons_wilsonFund.cc b/tests/hadrons/Test_hadrons_wilsonFund.cc new file mode 100644 index 00000000..aff8a670 --- /dev/null +++ b/tests/hadrons/Test_hadrons_wilsonFund.cc @@ -0,0 +1,160 @@ +/******************************************************************************* + Grid physics library, www.github.com/paboyle/Grid + + Source file: tests/hadrons/Test_hadrons_spectrum.cc + + Copyright (C) 2015 + + Author: Antonin Portelli + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution + directory. + *******************************************************************************/ + +#include + +using namespace Grid; +using namespace Hadrons; + +int main(int argc, char *argv[]) +{ + // initialization ////////////////////////////////////////////////////////// + Grid_init(&argc, &argv); + HadronsLogError.Active(GridLogError.isActive()); + HadronsLogWarning.Active(GridLogWarning.isActive()); + HadronsLogMessage.Active(GridLogMessage.isActive()); + HadronsLogIterative.Active(GridLogIterative.isActive()); + HadronsLogDebug.Active(GridLogDebug.isActive()); + LOG(Message) << "Grid initialized" << std::endl; + + // run setup /////////////////////////////////////////////////////////////// + Application application; + std::vector flavour = {"l"}; + std::vector mass = {-0.1}; + double csw = 0.0; + + // global parameters + Application::GlobalPar globalPar; + + globalPar.trajCounter.start = 1; + globalPar.trajCounter.end = 2; + globalPar.trajCounter.step = 1; + + globalPar.trajCounter.start = 309; + globalPar.trajCounter.end = 310; + globalPar.trajCounter.step = 1; + globalPar.seed = "1 2 3 4"; + application.setPar(globalPar); + // gauge field + application.createModule("gauge"); + //application.createModule("gauge"); + + // sources + //MSource::Z2::Par z2Par; + //z2Par.tA = 0; + //z2Par.tB = 0; + //application.createModule("z2", z2Par); + MSource::Point::Par ptPar; + ptPar.position = "0 0 0 0"; + application.createModule("pt", ptPar); + // sink + MSink::Point::Par sinkPar; + sinkPar.mom = "0 0 0"; + application.createModule("sink", sinkPar); + + // set fermion boundary conditions to be periodic space, antiperiodic time. + std::string boundary = "1 1 1 -1"; + + for (unsigned int i = 0; i < flavour.size(); ++i) + { + // actions + MAction::WilsonClover::Par actionPar; + actionPar.gauge = "gauge"; + actionPar.mass = mass[i]; + actionPar.boundary = boundary; + actionPar.csw_r = csw; + actionPar.csw_t = csw; + + // !!!!! Check if Anisotropy works !!!!! + actionPar.clover_anisotropy.isAnisotropic= false; + actionPar.clover_anisotropy.t_direction = 3 ; // Explicit for D=4 + actionPar.clover_anisotropy.xi_0 = 1.0 ; + actionPar.clover_anisotropy.nu = 1.0 ; + + application.createModule("WilsonClover_" + flavour[i], actionPar); + + // solvers + MSolver::RBPrecCG::Par solverPar; + solverPar.action = "WilsonClover_" + flavour[i]; + solverPar.residual = 1.0e-8; + application.createModule("CG_" + flavour[i], + solverPar); + + // propagators + MFermion::GaugeProp::Par quarkPar; + quarkPar.solver = "CG_" + flavour[i]; + quarkPar.source = "pt"; + application.createModule("Qpt_" + flavour[i], quarkPar); + // quarkPar.source = "z2"; + // application.createModule("QZ2_" + flavour[i], quarkPar); + } + for (unsigned int i = 0; i < flavour.size(); ++i) + for (unsigned int j = i; j < flavour.size(); ++j) + { + MContraction::Meson::Par mesPar; + + mesPar.output = "Fund_mesons/pt_" + flavour[i] + flavour[j]; + mesPar.q1 = "Qpt_" + flavour[i]; + mesPar.q2 = "Qpt_" + flavour[j]; + mesPar.gammas = "all"; + mesPar.sink = "sink"; + application.createModule("meson_pt_" + + flavour[i] + flavour[j], + mesPar); + // mesPar.output = "mesons/Z2_" + flavour[i] + flavour[j]; + // mesPar.q1 = "QZ2_" + flavour[i]; + // mesPar.q2 = "QZ2_" + flavour[j]; + // mesPar.gammas = "all"; + // mesPar.sink = "sink"; + // application.createModule("meson_Z2_" + // + flavour[i] + flavour[j], + // mesPar); + } + for (unsigned int i = 0; i < flavour.size(); ++i) + for (unsigned int j = i; j < flavour.size(); ++j) + for (unsigned int k = j; k < flavour.size(); ++k) + { + MContraction::Baryon::Par barPar; + + barPar.output = "Fund_baryons/pt_" + flavour[i] + flavour[j] + flavour[k]; + barPar.q1 = "Qpt_" + flavour[i]; + barPar.q2 = "Qpt_" + flavour[j]; + barPar.q3 = "Qpt_" + flavour[k]; + application.createModule( + "baryon_pt_" + flavour[i] + flavour[j] + flavour[k], barPar); + } + + // execution + application.saveParameterFile("WilsonClover_spectrum.xml"); + application.run(); + + // epilogue + LOG(Message) << "Grid is finalizing now" << std::endl; + Grid_finalize(); + + return EXIT_SUCCESS; +} From 24162c9eadb6316f2125c2430c51440969cd2310 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Tue, 9 Jan 2018 13:02:52 +0000 Subject: [PATCH 095/620] Staggered overlap comms comput --- .../fermion/ImprovedStaggeredFermion5D.cc | 164 ++++++ .../fermion/ImprovedStaggeredFermion5D.h | 19 + lib/qcd/action/fermion/StaggeredKernels.cc | 389 +++++++------- lib/qcd/action/fermion/StaggeredKernels.h | 79 ++- lib/qcd/action/fermion/StaggeredKernelsAsm.cc | 106 +++- .../action/fermion/StaggeredKernelsHand.cc | 497 ++++++++++-------- lib/qcd/action/fermion/WilsonCompressor.h | 59 +-- lib/qcd/action/fermion/WilsonFermion5D.cc | 3 +- lib/stencil/Stencil.h | 40 +- lib/util/Init.cc | 2 + 10 files changed, 869 insertions(+), 489 deletions(-) diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc index 7d988d89..2df4c044 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc @@ -124,6 +124,15 @@ ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Uthin, // Allocate the required comms buffer ImportGauge(_Uthin,_Ufat); + + int LLs = FiveDimGrid._rdimensions[0]; + int vol4= FourDimGrid.oSites(); + Stencil.BuildSurfaceList(LLs,vol4); + + vol4=FourDimRedBlackGrid.oSites(); + StencilEven.BuildSurfaceList(LLs,vol4); + StencilOdd.BuildSurfaceList(LLs,vol4); + } template @@ -223,6 +232,157 @@ void ImprovedStaggeredFermion5D::DhopDerivOE(GaugeField &mat, assert(0); } +/*CHANGE */ +template +void ImprovedStaggeredFermion5D::DhopInternal(StencilImpl & st, LebesgueOrder &lo, + DoubledGaugeField & U,DoubledGaugeField & UUU, + const FermionField &in, FermionField &out,int dag) +{ + DhopTotalTime-=usecond(); +#ifdef GRID_OMP + if ( StaggeredKernelsStatic::Comms == StaggeredKernelsStatic::CommsAndCompute ) + DhopInternalOverlappedComms(st,lo,U,UUU,in,out,dag); + else +#endif + DhopInternalSerialComms(st,lo,U,UUU,in,out,dag); + DhopTotalTime+=usecond(); +} + +template +void ImprovedStaggeredFermion5D::DhopInternalOverlappedComms(StencilImpl & st, LebesgueOrder &lo, + DoubledGaugeField & U,DoubledGaugeField & UUU, + const FermionField &in, FermionField &out,int dag) +{ +#ifdef GRID_OMP + // assert((dag==DaggerNo) ||(dag==DaggerYes)); + + Compressor compressor; + + int LLs = in._grid->_rdimensions[0]; + int len = U._grid->oSites(); + + DhopFaceTime-=usecond(); + st.Prepare(); + st.HaloGather(in,compressor); + // st.HaloExchangeOptGather(in,compressor); // Wilson compressor + st.CommsMergeSHM(compressor);// Could do this inside parallel region overlapped with comms + DhopFaceTime+=usecond(); + + double ctime=0; + double ptime=0; + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // Ugly explicit thread mapping introduced for OPA reasons. + ////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma omp parallel reduction(max:ctime) reduction(max:ptime) + { + int tid = omp_get_thread_num(); + int nthreads = omp_get_num_threads(); + int ncomms = CartesianCommunicator::nCommThreads; + if (ncomms == -1) ncomms = 1; + assert(nthreads > ncomms); + if (tid >= ncomms) { + double start = usecond(); + nthreads -= ncomms; + int ttid = tid - ncomms; + int n = U._grid->oSites(); // 4d vol + int chunk = n / nthreads; + int rem = n % nthreads; + int myblock, myn; + if (ttid < rem) { + myblock = ttid * chunk + ttid; + myn = chunk+1; + } else { + myblock = ttid*chunk + rem; + myn = chunk; + } + + // do the compute + if (dag == DaggerYes) { + for (int ss = myblock; ss < myblock+myn; ++ss) { + int sU = ss; + // Interior = 1; Exterior = 0; must implement for staggered + Kernels::DhopSiteDag(st,lo,U,UUU,st.CommBuf(),LLs,sU,in,out,1,0); //<--------- + } + } else { + for (int ss = myblock; ss < myblock+myn; ++ss) { + // Interior = 1; Exterior = 0; + int sU = ss; + Kernels::DhopSite(st,lo,U,UUU,st.CommBuf(),LLs,sU,in,out,1,0); //<------------ + } + } + ptime = usecond() - start; + } else { + double start = usecond(); + st.CommunicateThreaded(); + ctime = usecond() - start; + } + } + DhopCommTime += ctime; + DhopComputeTime+=ptime; + + // First to enter, last to leave timing + st.CollateThreads(); + + DhopFaceTime-=usecond(); + st.CommsMerge(compressor); + DhopFaceTime+=usecond(); + + DhopComputeTime2-=usecond(); + if (dag == DaggerYes) { + int sz=st.surface_list.size(); + parallel_for (int ss = 0; ss < sz; ss++) { + int sU = st.surface_list[ss]; + Kernels::DhopSiteDag(st,lo,U,UUU,st.CommBuf(),LLs,sU,in,out,0,1); //<---------- + } + } else { + int sz=st.surface_list.size(); + parallel_for (int ss = 0; ss < sz; ss++) { + int sU = st.surface_list[ss]; + Kernels::DhopSite(st,lo,U,UUU,st.CommBuf(),LLs,sU,in,out,0,1);//<---------- + } + } + DhopComputeTime2+=usecond(); +#else + assert(0); +#endif + +} + +template +void ImprovedStaggeredFermion5D::DhopInternalSerialComms(StencilImpl & st, LebesgueOrder &lo, + DoubledGaugeField & U,DoubledGaugeField & UUU, + const FermionField &in, FermionField &out,int dag) +{ + Compressor compressor; + int LLs = in._grid->_rdimensions[0]; + + + + DhopTotalTime -= usecond(); + DhopCommTime -= usecond(); + st.HaloExchange(in,compressor); + DhopCommTime += usecond(); + + DhopComputeTime -= usecond(); + // Dhop takes the 4d grid from U, and makes a 5d index for fermion + if (dag == DaggerYes) { + parallel_for (int ss = 0; ss < U._grid->oSites(); ss++) { + int sU=ss; + Kernels::DhopSiteDag(st, lo, U, UUU, st.CommBuf(), LLs, sU,in, out); + } + } else { + parallel_for (int ss = 0; ss < U._grid->oSites(); ss++) { + int sU=ss; + Kernels::DhopSite(st,lo,U,UUU,st.CommBuf(),LLs,sU,in,out); + } + } + DhopComputeTime += usecond(); + DhopTotalTime += usecond(); +} +/*CHANGE END*/ + +/* ORG template void ImprovedStaggeredFermion5D::DhopInternal(StencilImpl & st, LebesgueOrder &lo, DoubledGaugeField & U,DoubledGaugeField & UUU, @@ -254,6 +414,7 @@ void ImprovedStaggeredFermion5D::DhopInternal(StencilImpl & st, LebesgueOr DhopComputeTime += usecond(); DhopTotalTime += usecond(); } +*/ template @@ -336,6 +497,9 @@ void ImprovedStaggeredFermion5D::ZeroCounters(void) DhopTotalTime = 0; DhopCommTime = 0; DhopComputeTime = 0; + DhopFaceTime = 0; + + Stencil.ZeroCounters(); StencilEven.ZeroCounters(); StencilOdd.ZeroCounters(); diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h index ca1a955a..e21142b8 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h @@ -64,6 +64,8 @@ namespace QCD { double DhopCalls; double DhopCommTime; double DhopComputeTime; + double DhopComputeTime2; + double DhopFaceTime; /////////////////////////////////////////////////////////////// // Implement the abstract base @@ -119,6 +121,23 @@ namespace QCD { FermionField &out, int dag); + void DhopInternalOverlappedComms(StencilImpl & st, + LebesgueOrder &lo, + DoubledGaugeField &U, + DoubledGaugeField &UUU, + const FermionField &in, + FermionField &out, + int dag); + + void DhopInternalSerialComms(StencilImpl & st, + LebesgueOrder &lo, + DoubledGaugeField &U, + DoubledGaugeField &UUU, + const FermionField &in, + FermionField &out, + int dag); + + // Constructors ImprovedStaggeredFermion5D(GaugeField &_Uthin, GaugeField &_Ufat, diff --git a/lib/qcd/action/fermion/StaggeredKernels.cc b/lib/qcd/action/fermion/StaggeredKernels.cc index b6ec14c7..ea44cdd8 100644 --- a/lib/qcd/action/fermion/StaggeredKernels.cc +++ b/lib/qcd/action/fermion/StaggeredKernels.cc @@ -32,223 +32,242 @@ namespace Grid { namespace QCD { int StaggeredKernelsStatic::Opt= StaggeredKernelsStatic::OptGeneric; +int StaggeredKernelsStatic::Comms = StaggeredKernelsStatic::CommsAndCompute; + +#define GENERIC_STENCIL_LEG(U,Dir,skew,multLink) \ + SE = st.GetEntry(ptype, Dir+skew, sF); \ + if (SE->_is_local ) { \ + if (SE->_permute) { \ + chi_p = χ \ + permute(chi, in._odata[SE->_offset], ptype); \ + } else { \ + chi_p = &in._odata[SE->_offset]; \ + } \ + } else { \ + chi_p = &buf[SE->_offset]; \ + } \ + multLink(Uchi, U._odata[sU], *chi_p, Dir); + +#define GENERIC_STENCIL_LEG_INT(U,Dir,skew,multLink) \ + SE = st.GetEntry(ptype, Dir+skew, sF); \ + if (SE->_is_local ) { \ + if (SE->_permute) { \ + chi_p = χ \ + permute(chi, in._odata[SE->_offset], ptype); \ + } else { \ + chi_p = &in._odata[SE->_offset]; \ + } \ + } else if ( st.same_node[Dir] ) { \ + chi_p = &buf[SE->_offset]; \ + } \ + if (SE->_is_local || st.same_node[Dir] ) { \ + multLink(Uchi, U._odata[sU], *chi_p, Dir); \ + } + +#define GENERIC_STENCIL_LEG_EXT(U,Dir,skew,multLink) \ + SE = st.GetEntry(ptype, Dir+skew, sF); \ + if ((!SE->_is_local) && (!st.same_node[Dir]) ) { \ + nmu++; \ + chi_p = &buf[SE->_offset]; \ + multLink(Uchi, U._odata[sU], *chi_p, Dir); \ + } template StaggeredKernels::StaggeredKernels(const ImplParams &p) : Base(p){}; -//////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// // Generic implementation; move to different file? -//////////////////////////////////////////// - +// Int, Ext, Int+Ext cases for comms overlap +//////////////////////////////////////////////////////////////////////////////////// template -void StaggeredKernels::DhopSiteDepth(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, - SiteSpinor *buf, int sF, - int sU, const FermionField &in, SiteSpinor &out,int threeLink) { +void StaggeredKernels::DhopSiteGeneric(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out, int dag) { const SiteSpinor *chi_p; SiteSpinor chi; SiteSpinor Uchi; StencilEntry *SE; int ptype; - int skew = 0; - if (threeLink) skew=8; - /////////////////////////// - // Xp - /////////////////////////// + int skew; - SE = st.GetEntry(ptype, Xp+skew, sF); - if (SE->_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; + for(int s=0;s_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; - } - Impl::multLinkAdd(Uchi, U._odata[sU], *chi_p, Yp); - - /////////////////////////// - // Zp - /////////////////////////// - SE = st.GetEntry(ptype, Zp+skew, sF); - if (SE->_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; - } - Impl::multLinkAdd(Uchi, U._odata[sU], *chi_p, Zp); - - /////////////////////////// - // Tp - /////////////////////////// - SE = st.GetEntry(ptype, Tp+skew, sF); - if (SE->_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; - } - Impl::multLinkAdd(Uchi, U._odata[sU], *chi_p, Tp); - - /////////////////////////// - // Xm - /////////////////////////// - SE = st.GetEntry(ptype, Xm+skew, sF); - if (SE->_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; - } - Impl::multLinkAdd(Uchi, U._odata[sU], *chi_p, Xm); - - /////////////////////////// - // Ym - /////////////////////////// - SE = st.GetEntry(ptype, Ym+skew, sF); - if (SE->_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; - } - Impl::multLinkAdd(Uchi, U._odata[sU], *chi_p, Ym); - - /////////////////////////// - // Zm - /////////////////////////// - SE = st.GetEntry(ptype, Zm+skew, sF); - if (SE->_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; - } - Impl::multLinkAdd(Uchi, U._odata[sU], *chi_p, Zm); - - /////////////////////////// - // Tm - /////////////////////////// - SE = st.GetEntry(ptype, Tm+skew, sF); - if (SE->_is_local) { - if (SE->_permute) { - chi_p = χ - permute(chi, in._odata[SE->_offset], ptype); - } else { - chi_p = &in._odata[SE->_offset]; - } - } else { - chi_p = &buf[SE->_offset]; - } - Impl::multLinkAdd(Uchi, U._odata[sU], *chi_p, Tm); - - vstream(out, Uchi); }; + /////////////////////////////////////////////////// + // Only contributions from interior of our node + /////////////////////////////////////////////////// +template +void StaggeredKernels::DhopSiteGenericInt(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { + const SiteSpinor *chi_p; + SiteSpinor chi; + SiteSpinor Uchi; + StencilEntry *SE; + int ptype; + int skew ; + + for(int s=0;s +void StaggeredKernels::DhopSiteGenericExt(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { + const SiteSpinor *chi_p; + SiteSpinor chi; + SiteSpinor Uchi; + StencilEntry *SE; + int ptype; + int nmu=0; + int skew ; + + for(int s=0;s void StaggeredKernels::DhopSiteDag(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, DoubledGaugeField &UUU, - SiteSpinor *buf, int LLs, int sU, - const FermionField &in, FermionField &out) { - SiteSpinor naik; - SiteSpinor naive; - int oneLink =0; - int threeLink=1; + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out, + int interior,int exterior) +{ int dag=1; - switch(Opt) { -#ifdef AVX512 - //FIXME; move the sign into the Asm routine - case OptInlineAsm: - DhopSiteAsm(st,lo,U,UUU,buf,LLs,sU,in,out); - for(int s=0;s void StaggeredKernels::DhopSiteAsm(StencilImpl &st, LebesgueOrder &lo, - DoubledGaugeField &U, - DoubledGaugeField &UUU, - SiteSpinor *buf, int LLs, - int sU, const FermionField &in, FermionField &out) + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { assert(0); }; @@ -645,10 +681,9 @@ void StaggeredKernels::DhopSiteAsm(StencilImpl &st, LebesgueOrder &lo, // This is the single precision 5th direction vectorised kernel #include template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, LebesgueOrder &lo, - DoubledGaugeField &U, - DoubledGaugeField &UUU, - SiteSpinor *buf, int LLs, - int sU, const FermionField &in, FermionField &out) + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { #ifdef AVX512 uint64_t gauge0,gauge1,gauge2,gauge3; @@ -685,7 +720,11 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl MULT_ADD_LS(gauge0,gauge1,gauge2,gauge3); addr0 = (uint64_t) &out._odata[sF]; - REDUCE(addr0); + if ( dag ) { + nREDUCE(addr0); + } else { + REDUCE(addr0); + } } #else assert(0); @@ -695,10 +734,9 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl #include template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, LebesgueOrder &lo, - DoubledGaugeField &U, - DoubledGaugeField &UUU, - SiteSpinor *buf, int LLs, - int sU, const FermionField &in, FermionField &out) + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { #ifdef AVX512 uint64_t gauge0,gauge1,gauge2,gauge3; @@ -734,7 +772,11 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl MULT_ADD_LS(gauge0,gauge1,gauge2,gauge3); addr0 = (uint64_t) &out._odata[sF]; - REDUCE(addr0); + if ( dag ) { + nREDUCE(addr0); + } else { + REDUCE(addr0); + } } #else assert(0); @@ -776,10 +818,9 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl #include template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, LebesgueOrder &lo, - DoubledGaugeField &U, - DoubledGaugeField &UUU, - SiteSpinor *buf, int LLs, - int sU, const FermionField &in, FermionField &out) + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { #ifdef AVX512 uint64_t gauge0,gauge1,gauge2,gauge3; @@ -832,7 +873,11 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, MULT_ADD_XYZT(gauge2,gauge3); addr0 = (uint64_t) &out._odata[sF]; - REDUCEa(addr0); + if ( dag ) { + nREDUCEa(addr0); + } else { + REDUCEa(addr0); + } } #else assert(0); @@ -841,10 +886,9 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, #include template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, LebesgueOrder &lo, - DoubledGaugeField &U, - DoubledGaugeField &UUU, - SiteSpinor *buf, int LLs, - int sU, const FermionField &in, FermionField &out) + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { #ifdef AVX512 uint64_t gauge0,gauge1,gauge2,gauge3; @@ -897,7 +941,11 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, MULT_ADD_XYZT(gauge2,gauge3); addr0 = (uint64_t) &out._odata[sF]; - REDUCEa(addr0); + if ( dag ) { + nREDUCEa(addr0); + } else { + REDUCEa(addr0); + } } #else assert(0); @@ -909,7 +957,7 @@ template <> void StaggeredKernels::DhopSiteAsm(StencilImpl &st, DoubledGaugeField &U, \ DoubledGaugeField &UUU, \ SiteSpinor *buf, int LLs, \ - int sU, const FermionField &in, FermionField &out); + int sU, const FermionField &in, FermionField &out,int dag); KERNEL_INSTANTIATE(StaggeredKernels,DhopSiteAsm,StaggeredImplD); KERNEL_INSTANTIATE(StaggeredKernels,DhopSiteAsm,StaggeredImplF); diff --git a/lib/qcd/action/fermion/StaggeredKernelsHand.cc b/lib/qcd/action/fermion/StaggeredKernelsHand.cc index 7de8480c..47ebdd86 100644 --- a/lib/qcd/action/fermion/StaggeredKernelsHand.cc +++ b/lib/qcd/action/fermion/StaggeredKernelsHand.cc @@ -28,7 +28,6 @@ Author: paboyle /* END LEGAL */ #include -#define REGISTER #define LOAD_CHI(b) \ const SiteSpinor & ref (b[offset]); \ @@ -59,7 +58,7 @@ Author: paboyle UChi ## _1 += U_12*Chi_2;\ UChi ## _2 += U_22*Chi_2; -#define MULT_ADD(A,UChi) \ +#define MULT_ADD(U,A,UChi) \ auto & ref(U._odata[sU](A)); \ Impl::loadLinkElement(U_00,ref()(0,0)); \ Impl::loadLinkElement(U_10,ref()(1,0)); \ @@ -82,241 +81,319 @@ Author: paboyle #define PERMUTE_DIR(dir) \ - permute##dir(Chi_0,Chi_0);\ - permute##dir(Chi_1,Chi_1);\ - permute##dir(Chi_2,Chi_2); + permute##dir(Chi_0,Chi_0); \ + permute##dir(Chi_1,Chi_1); \ + permute##dir(Chi_2,Chi_2); + + +#define HAND_STENCIL_LEG_BASE(Dir,Perm,skew) \ + SE=st.GetEntry(ptype,Dir+skew,sF); \ + offset = SE->_offset; \ + local = SE->_is_local; \ + perm = SE->_permute; \ + if ( local ) { \ + LOAD_CHI(in._odata); \ + if ( perm) { \ + PERMUTE_DIR(Perm); \ + } \ + } else { \ + LOAD_CHI(buf); \ + } + +#define HAND_STENCIL_LEG_BEGIN(Dir,Perm,skew,even) \ + HAND_STENCIL_LEG_BASE(Dir,Perm,skew) \ + { \ + MULT(Dir,even); \ + } + +#define HAND_STENCIL_LEG(U,Dir,Perm,skew,even) \ + HAND_STENCIL_LEG_BASE(Dir,Perm,skew) \ + { \ + MULT_ADD(U,Dir,even); \ + } + + + +#define HAND_STENCIL_LEG_INT(U,Dir,Perm,skew,even) \ + SE=st.GetEntry(ptype,Dir+skew,sF); \ + offset = SE->_offset; \ + local = SE->_is_local; \ + perm = SE->_permute; \ + if ( local ) { \ + LOAD_CHI(in._odata); \ + if ( perm) { \ + PERMUTE_DIR(Perm); \ + } \ + } else if ( st.same_node[Dir] ) { \ + LOAD_CHI(buf); \ + } \ + if (SE->_is_local || st.same_node[Dir] ) { \ + MULT_ADD(U,Dir,even); \ + } + +#define HAND_STENCIL_LEG_EXT(U,Dir,Perm,skew,even) \ + SE=st.GetEntry(ptype,Dir+skew,sF); \ + offset = SE->_offset; \ + local = SE->_is_local; \ + perm = SE->_permute; \ + if ((!SE->_is_local) && (!st.same_node[Dir]) ) { \ + nmu++; \ + { LOAD_CHI(buf); } \ + { MULT_ADD(U,Dir,even); } \ + } namespace Grid { namespace QCD { template -void StaggeredKernels::DhopSiteHand(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,DoubledGaugeField &UUU, - SiteSpinor *buf, int LLs, - int sU, const FermionField &in, FermionField &out, int dag) -{ - SiteSpinor naik; - SiteSpinor naive; - int oneLink =0; - int threeLink=1; - int skew(0); - Real scale(1.0); - - if(dag) scale = -1.0; - - for(int s=0;s -void StaggeredKernels::DhopSiteDepthHand(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, - SiteSpinor *buf, int sF, - int sU, const FermionField &in, SiteSpinor &out,int threeLink) +void StaggeredKernels::DhopSiteHand(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U,DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) { typedef typename Simd::scalar_type S; typedef typename Simd::vector_type V; - REGISTER Simd even_0; // 12 regs on knc - REGISTER Simd even_1; - REGISTER Simd even_2; - REGISTER Simd odd_0; // 12 regs on knc - REGISTER Simd odd_1; - REGISTER Simd odd_2; + Simd even_0; // 12 regs on knc + Simd even_1; + Simd even_2; + Simd odd_0; // 12 regs on knc + Simd odd_1; + Simd odd_2; - REGISTER Simd Chi_0; // two spinor; 6 regs - REGISTER Simd Chi_1; - REGISTER Simd Chi_2; - - REGISTER Simd U_00; // two rows of U matrix - REGISTER Simd U_10; - REGISTER Simd U_20; - REGISTER Simd U_01; - REGISTER Simd U_11; - REGISTER Simd U_21; // 2 reg left. - REGISTER Simd U_02; - REGISTER Simd U_12; - REGISTER Simd U_22; - - int skew = 0; - if (threeLink) skew=8; + Simd Chi_0; // two spinor; 6 regs + Simd Chi_1; + Simd Chi_2; + + Simd U_00; // two rows of U matrix + Simd U_10; + Simd U_20; + Simd U_01; + Simd U_11; + Simd U_21; // 2 reg left. + Simd U_02; + Simd U_12; + Simd U_22; + SiteSpinor result; int offset,local,perm, ptype; + StencilEntry *SE; + int skew; - // Xp - SE=st.GetEntry(ptype,Xp+skew,sF); - offset = SE->_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(3); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... - } - } else { - LOAD_CHI(buf); - } - { - MULT(Xp,even); - } - - // Yp - SE=st.GetEntry(ptype,Yp+skew,sF); - offset = SE->_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(2); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... - } - } else { - LOAD_CHI(buf); - } - { - MULT(Yp,odd); - } + for(int s=0;s_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(1); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... + skew = 0; + HAND_STENCIL_LEG_BEGIN(Xp,3,skew,even); + HAND_STENCIL_LEG_BEGIN(Yp,2,skew,odd); + HAND_STENCIL_LEG (U,Zp,1,skew,even); + HAND_STENCIL_LEG (U,Tp,0,skew,odd); + HAND_STENCIL_LEG (U,Xm,3,skew,even); + HAND_STENCIL_LEG (U,Ym,2,skew,odd); + HAND_STENCIL_LEG (U,Zm,1,skew,even); + HAND_STENCIL_LEG (U,Tm,0,skew,odd); + skew = 8; + HAND_STENCIL_LEG(UUU,Xp,3,skew,even); + HAND_STENCIL_LEG(UUU,Yp,2,skew,odd); + HAND_STENCIL_LEG(UUU,Zp,1,skew,even); + HAND_STENCIL_LEG(UUU,Tp,0,skew,odd); + HAND_STENCIL_LEG(UUU,Xm,3,skew,even); + HAND_STENCIL_LEG(UUU,Ym,2,skew,odd); + HAND_STENCIL_LEG(UUU,Zm,1,skew,even); + HAND_STENCIL_LEG(UUU,Tm,0,skew,odd); + + if ( dag ) { + result()()(0) = - even_0 - odd_0; + result()()(1) = - even_1 - odd_1; + result()()(2) = - even_2 - odd_2; + } else { + result()()(0) = even_0 + odd_0; + result()()(1) = even_1 + odd_1; + result()()(2) = even_2 + odd_2; } - } else { - LOAD_CHI(buf); + vstream(out._odata[sF],result); } - { - MULT_ADD(Zp,even); - } - - // Tp - SE=st.GetEntry(ptype,Tp+skew,sF); - offset = SE->_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(0); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... - } - } else { - LOAD_CHI(buf); - } - { - MULT_ADD(Tp,odd); - } - - // Xm - SE=st.GetEntry(ptype,Xm+skew,sF); - offset = SE->_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(3); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... - } - } else { - LOAD_CHI(buf); - } - { - MULT_ADD(Xm,even); - } - - - // Ym - SE=st.GetEntry(ptype,Ym+skew,sF); - offset = SE->_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(2); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... - } - } else { - LOAD_CHI(buf); - } - { - MULT_ADD(Ym,odd); - } - - // Zm - SE=st.GetEntry(ptype,Zm+skew,sF); - offset = SE->_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(1); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... - } - } else { - LOAD_CHI(buf); - } - { - MULT_ADD(Zm,even); - } - - // Tm - SE=st.GetEntry(ptype,Tm+skew,sF); - offset = SE->_offset; - local = SE->_is_local; - perm = SE->_permute; - - if ( local ) { - LOAD_CHI(in._odata); - if ( perm) { - PERMUTE_DIR(0); // T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... - } - } else { - LOAD_CHI(buf); - } - { - MULT_ADD(Tm,odd); - } - - vstream(out()()(0),even_0+odd_0); - vstream(out()()(1),even_1+odd_1); - vstream(out()()(2),even_2+odd_2); - } + +template +void StaggeredKernels::DhopSiteHandInt(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) +{ + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + Simd even_0; // 12 regs on knc + Simd even_1; + Simd even_2; + Simd odd_0; // 12 regs on knc + Simd odd_1; + Simd odd_2; + + Simd Chi_0; // two spinor; 6 regs + Simd Chi_1; + Simd Chi_2; + + Simd U_00; // two rows of U matrix + Simd U_10; + Simd U_20; + Simd U_01; + Simd U_11; + Simd U_21; // 2 reg left. + Simd U_02; + Simd U_12; + Simd U_22; + + SiteSpinor result; + int offset,local,perm, ptype; + + StencilEntry *SE; + int skew; + + for(int s=0;s +void StaggeredKernels::DhopSiteHandExt(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, DoubledGaugeField &UUU, + SiteSpinor *buf, int LLs, int sU, + const FermionField &in, FermionField &out,int dag) +{ + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + Simd even_0; // 12 regs on knc + Simd even_1; + Simd even_2; + Simd odd_0; // 12 regs on knc + Simd odd_1; + Simd odd_2; + + Simd Chi_0; // two spinor; 6 regs + Simd Chi_1; + Simd Chi_2; + + Simd U_00; // two rows of U matrix + Simd U_10; + Simd U_20; + Simd U_01; + Simd U_11; + Simd U_21; // 2 reg left. + Simd U_02; + Simd U_12; + Simd U_22; + + SiteSpinor result; + int offset,local,perm, ptype; + + StencilEntry *SE; + int skew; + + for(int s=0;s::DhopSiteHand(StencilImpl &st, LebesgueOrder &lo, \ DoubledGaugeField &U,DoubledGaugeField &UUU, \ - SiteSpinor *buf, int LLs, \ - int sU, const FermionField &in, FermionField &out, int dag); + SiteSpinor *buf, int LLs, int sU, \ + const FermionField &in, FermionField &out, int dag); \ + \ + template void StaggeredKernels::DhopSiteHandInt(StencilImpl &st, LebesgueOrder &lo, \ + DoubledGaugeField &U,DoubledGaugeField &UUU, \ + SiteSpinor *buf, int LLs, int sU, \ + const FermionField &in, FermionField &out, int dag); \ + \ + template void StaggeredKernels::DhopSiteHandExt(StencilImpl &st, LebesgueOrder &lo, \ + DoubledGaugeField &U,DoubledGaugeField &UUU, \ + SiteSpinor *buf, int LLs, int sU, \ + const FermionField &in, FermionField &out, int dag); \ -#define DHOP_SITE_DEPTH_HAND_INSTANTIATE(IMPL) \ - template void StaggeredKernels::DhopSiteDepthHand(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, \ - SiteSpinor *buf, int sF, \ - int sU, const FermionField &in, SiteSpinor &out,int threeLink) ; DHOP_SITE_HAND_INSTANTIATE(StaggeredImplD); DHOP_SITE_HAND_INSTANTIATE(StaggeredImplF); DHOP_SITE_HAND_INSTANTIATE(StaggeredVec5dImplD); DHOP_SITE_HAND_INSTANTIATE(StaggeredVec5dImplF); -DHOP_SITE_DEPTH_HAND_INSTANTIATE(StaggeredImplD); -DHOP_SITE_DEPTH_HAND_INSTANTIATE(StaggeredImplF); -DHOP_SITE_DEPTH_HAND_INSTANTIATE(StaggeredVec5dImplD); -DHOP_SITE_DEPTH_HAND_INSTANTIATE(StaggeredVec5dImplF); -}} +} +} + diff --git a/lib/qcd/action/fermion/WilsonCompressor.h b/lib/qcd/action/fermion/WilsonCompressor.h index cc5c3c63..3660cc0b 100644 --- a/lib/qcd/action/fermion/WilsonCompressor.h +++ b/lib/qcd/action/fermion/WilsonCompressor.h @@ -267,41 +267,16 @@ public: } typedef CartesianCommunicator::CommsRequest_t CommsRequest_t; - std::vector same_node; - std::vector surface_list; - WilsonStencil(GridBase *grid, int npoints, int checkerboard, const std::vector &directions, const std::vector &distances) - : CartesianStencil (grid,npoints,checkerboard,directions,distances) , - same_node(npoints) + : CartesianStencil (grid,npoints,checkerboard,directions,distances) { ZeroCountersi(); - surface_list.resize(0); }; - void BuildSurfaceList(int Ls,int vol4){ - - // find same node for SHM - // Here we know the distance is 1 for WilsonStencil - for(int point=0;point_npoints;point++){ - same_node[point] = this->SameNode(point); - } - - for(int site = 0 ;site< vol4;site++){ - int local = 1; - for(int point=0;point_npoints;point++){ - if( (!this->GetNodeLocal(site*Ls,point)) && (!same_node[point]) ){ - local = 0; - } - } - if(local == 0) { - surface_list.push_back(site); - } - } - } template < class compressor> void HaloExchangeOpt(const Lattice &source,compressor &compress) @@ -362,23 +337,23 @@ public: int dag = compress.dag; int face_idx=0; if ( dag ) { - assert(same_node[Xp]==this->HaloGatherDir(source,XpCompress,Xp,face_idx)); - assert(same_node[Yp]==this->HaloGatherDir(source,YpCompress,Yp,face_idx)); - assert(same_node[Zp]==this->HaloGatherDir(source,ZpCompress,Zp,face_idx)); - assert(same_node[Tp]==this->HaloGatherDir(source,TpCompress,Tp,face_idx)); - assert(same_node[Xm]==this->HaloGatherDir(source,XmCompress,Xm,face_idx)); - assert(same_node[Ym]==this->HaloGatherDir(source,YmCompress,Ym,face_idx)); - assert(same_node[Zm]==this->HaloGatherDir(source,ZmCompress,Zm,face_idx)); - assert(same_node[Tm]==this->HaloGatherDir(source,TmCompress,Tm,face_idx)); + assert(this->same_node[Xp]==this->HaloGatherDir(source,XpCompress,Xp,face_idx)); + assert(this->same_node[Yp]==this->HaloGatherDir(source,YpCompress,Yp,face_idx)); + assert(this->same_node[Zp]==this->HaloGatherDir(source,ZpCompress,Zp,face_idx)); + assert(this->same_node[Tp]==this->HaloGatherDir(source,TpCompress,Tp,face_idx)); + assert(this->same_node[Xm]==this->HaloGatherDir(source,XmCompress,Xm,face_idx)); + assert(this->same_node[Ym]==this->HaloGatherDir(source,YmCompress,Ym,face_idx)); + assert(this->same_node[Zm]==this->HaloGatherDir(source,ZmCompress,Zm,face_idx)); + assert(this->same_node[Tm]==this->HaloGatherDir(source,TmCompress,Tm,face_idx)); } else { - assert(same_node[Xp]==this->HaloGatherDir(source,XmCompress,Xp,face_idx)); - assert(same_node[Yp]==this->HaloGatherDir(source,YmCompress,Yp,face_idx)); - assert(same_node[Zp]==this->HaloGatherDir(source,ZmCompress,Zp,face_idx)); - assert(same_node[Tp]==this->HaloGatherDir(source,TmCompress,Tp,face_idx)); - assert(same_node[Xm]==this->HaloGatherDir(source,XpCompress,Xm,face_idx)); - assert(same_node[Ym]==this->HaloGatherDir(source,YpCompress,Ym,face_idx)); - assert(same_node[Zm]==this->HaloGatherDir(source,ZpCompress,Zm,face_idx)); - assert(same_node[Tm]==this->HaloGatherDir(source,TpCompress,Tm,face_idx)); + assert(this->same_node[Xp]==this->HaloGatherDir(source,XmCompress,Xp,face_idx)); + assert(this->same_node[Yp]==this->HaloGatherDir(source,YmCompress,Yp,face_idx)); + assert(this->same_node[Zp]==this->HaloGatherDir(source,ZmCompress,Zp,face_idx)); + assert(this->same_node[Tp]==this->HaloGatherDir(source,TmCompress,Tp,face_idx)); + assert(this->same_node[Xm]==this->HaloGatherDir(source,XpCompress,Xm,face_idx)); + assert(this->same_node[Ym]==this->HaloGatherDir(source,YpCompress,Ym,face_idx)); + assert(this->same_node[Zm]==this->HaloGatherDir(source,ZpCompress,Zm,face_idx)); + assert(this->same_node[Tm]==this->HaloGatherDir(source,TpCompress,Tm,face_idx)); } this->face_table_computed=1; assert(this->u_comm_offset==this->_unified_buffer_size); diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/lib/qcd/action/fermion/WilsonFermion5D.cc index 1da58ddb..78124beb 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.cc +++ b/lib/qcd/action/fermion/WilsonFermion5D.cc @@ -444,8 +444,7 @@ void WilsonFermion5D::DhopInternalOverlappedComms(StencilImpl & st, Lebesg } } ptime = usecond() - start; - } - { + } else { double start = usecond(); st.CommunicateThreaded(); ctime = usecond() - start; diff --git a/lib/stencil/Stencil.h b/lib/stencil/Stencil.h index 887d8a7c..d1c4ae95 100644 --- a/lib/stencil/Stencil.h +++ b/lib/stencil/Stencil.h @@ -149,7 +149,9 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal std::vector _distances; std::vector _comm_buf_size; std::vector _permute_type; - + std::vector same_node; + std::vector surface_list; + Vector _entries; std::vector Packets; std::vector Mergers; @@ -200,7 +202,7 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal int dimension = _directions[point]; int displacement = _distances[point]; - assert( (displacement==1) || (displacement==-1)); + int pd = _grid->_processors[dimension]; int fd = _grid->_fdimensions[dimension]; @@ -215,9 +217,12 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal if ( ! comm_dim ) return 1; int nbr_proc; - if (displacement==1) nbr_proc = 1; - else nbr_proc = pd-1; + if (displacement>0) nbr_proc = 1; + else nbr_proc = pd-1; + // FIXME this logic needs to be sorted for three link term + // assert( (displacement==1) || (displacement==-1)); + // Present hack only works for >= 4^4 subvol per node _grid->ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank); void *shm = (void *) _grid->ShmBufferTranslate(recv_from_rank,u_recv_buf_p); @@ -539,6 +544,29 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal } }; + // Move interior/exterior split into the generic stencil + // FIXME Explicit Ls in interface is a pain. Should just use a vol + void BuildSurfaceList(int Ls,int vol4){ + + // find same node for SHM + // Here we know the distance is 1 for WilsonStencil + for(int point=0;point_npoints;point++){ + same_node[point] = this->SameNode(point); + } + + for(int site = 0 ;site< vol4;site++){ + int local = 1; + for(int point=0;point_npoints;point++){ + if( (!this->GetNodeLocal(site*Ls,point)) && (!same_node[point]) ){ + local = 0; + } + } + if(local == 0) { + surface_list.push_back(site); + } + } + } + CartesianStencil(GridBase *grid, int npoints, int checkerboard, @@ -549,7 +577,8 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal comm_bytes_thr(npoints), comm_enter_thr(npoints), comm_leave_thr(npoints), - comm_time_thr(npoints) + comm_time_thr(npoints), + same_node(npoints) { face_table_computed=0; _npoints = npoints; @@ -557,6 +586,7 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal _directions = directions; _distances = distances; _unified_buffer_size=0; + surface_list.resize(0); int osites = _grid->oSites(); diff --git a/lib/util/Init.cc b/lib/util/Init.cc index 031f8f5a..13b8f219 100644 --- a/lib/util/Init.cc +++ b/lib/util/Init.cc @@ -360,8 +360,10 @@ void Grid_init(int *argc,char ***argv) } if( GridCmdOptionExists(*argv,*argv+*argc,"--comms-overlap") ){ QCD::WilsonKernelsStatic::Comms = QCD::WilsonKernelsStatic::CommsAndCompute; + QCD::StaggeredKernelsStatic::Comms = QCD::StaggeredKernelsStatic::CommsAndCompute; } else { QCD::WilsonKernelsStatic::Comms = QCD::WilsonKernelsStatic::CommsThenCompute; + QCD::StaggeredKernelsStatic::Comms = QCD::StaggeredKernelsStatic::CommsThenCompute; } if( GridCmdOptionExists(*argv,*argv+*argc,"--comms-concurrent") ){ CartesianCommunicator::SetCommunicatorPolicy(CartesianCommunicator::CommunicatorPolicyConcurrent); From 58c7a13d545164c4c95cba4a8df4ea4e196d55e0 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 10 Jan 2018 10:59:58 +0000 Subject: [PATCH 096/620] Hadrons: result file macro with trajectory number --- extras/Hadrons/Global.cc | 7 +++++++ extras/Hadrons/Global.hpp | 13 +++++++++---- extras/Hadrons/Modules/MContraction/Baryon.hpp | 2 +- extras/Hadrons/Modules/MContraction/DiscLoop.hpp | 2 +- extras/Hadrons/Modules/MContraction/Gamma3pt.hpp | 2 +- extras/Hadrons/Modules/MContraction/Meson.hpp | 2 +- .../Modules/MContraction/WeakHamiltonianEye.cc | 2 +- .../Modules/MContraction/WeakHamiltonianNonEye.cc | 2 +- .../Modules/MContraction/WeakNeutral4ptDisc.cc | 2 +- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 2 +- 10 files changed, 24 insertions(+), 12 deletions(-) diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 942a4243..9a90a08c 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -67,3 +67,10 @@ std::string Hadrons::typeName(const std::type_info *info) return name; } + +// default writers/readers ///////////////////////////////////////////////////// +#ifdef HAVE_HDF5 +const std::string Hadrons::resultFileExt = "h5"; +#else +const std::string Hadrons::resultFileExt = "xml"; +#endif diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 274e1934..fc069ed6 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -167,14 +167,19 @@ std::string typeName(void) } // default writers/readers +extern const std::string resultFileExt; + #ifdef HAVE_HDF5 -typedef Hdf5Reader CorrReader; -typedef Hdf5Writer CorrWriter; +typedef Hdf5Reader ResultReader; +typedef Hdf5Writer ResultWriter; #else -typedef XmlReader CorrReader; -typedef XmlWriter CorrWriter; +typedef XmlReader ResultReader; +typedef XmlWriter ResultWriter; #endif +#define RESULT_FILE_NAME(name) \ +name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt + END_HADRONS_NAMESPACE #include diff --git a/extras/Hadrons/Modules/MContraction/Baryon.hpp b/extras/Hadrons/Modules/MContraction/Baryon.hpp index 625c7108..8966d95b 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.hpp +++ b/extras/Hadrons/Modules/MContraction/Baryon.hpp @@ -122,7 +122,7 @@ void TBaryon::execute(void) << " quarks '" << par().q1 << "', '" << par().q2 << "', and '" << par().q3 << "'" << std::endl; - CorrWriter writer(par().output); + ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(PropagatorField1, par().q1); auto &q2 = envGet(PropagatorField2, par().q2); auto &q3 = envGet(PropagatorField3, par().q2); diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp index 3d08f0eb..539abbbb 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp +++ b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp @@ -119,7 +119,7 @@ void TDiscLoop::execute(void) << "' using '" << par().q_loop << "' with " << par().gamma << " insertion." << std::endl; - CorrWriter writer(par().output); + ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q_loop = envGet(PropagatorField, par().q_loop); Gamma gamma(par().gamma); std::vector buf; diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp index 68701aeb..b4327a13 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp +++ b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp @@ -153,7 +153,7 @@ void TGamma3pt::execute(void) // Initialise variables. q2 and q3 are normal propagators, q1 may be // sink smeared. - CorrWriter writer(par().output); + ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(SlicedPropagator1, par().q1); auto &q2 = envGet(PropagatorField2, par().q2); auto &q3 = envGet(PropagatorField2, par().q3); diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index 5cf504e3..0197534d 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -172,7 +172,7 @@ void TMeson::execute(void) << " quarks '" << par().q1 << "' and '" << par().q2 << "'" << std::endl; - CorrWriter writer(par().output); + ResultWriter writer(RESULT_FILE_NAME(par().output)); std::vector buf; std::vector result; Gamma g5(Gamma::Algebra::Gamma5); diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc index b79c09e7..1d257fc7 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc @@ -104,7 +104,7 @@ void TWeakHamiltonianEye::execute(void) << par().q2 << ", '" << par().q3 << "' and '" << par().q4 << "'." << std::endl; - CorrWriter writer(par().output); + ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(SlicedPropagator, par().q1); auto &q2 = envGet(PropagatorField, par().q2); auto &q3 = envGet(PropagatorField, par().q3); diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc index e66b6ee7..2ad2e7dc 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc @@ -104,7 +104,7 @@ void TWeakHamiltonianNonEye::execute(void) << par().q2 << ", '" << par().q3 << "' and '" << par().q4 << "'." << std::endl; - CorrWriter writer(par().output); + ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(PropagatorField, par().q1); auto &q2 = envGet(PropagatorField, par().q2); auto &q3 = envGet(PropagatorField, par().q3); diff --git a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc index e0a00472..2c94b2ba 100644 --- a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc +++ b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc @@ -104,7 +104,7 @@ void TWeakNeutral4ptDisc::execute(void) << par().q2 << ", '" << par().q3 << "' and '" << par().q4 << "'." << std::endl; - CorrWriter writer(par().output); + ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(PropagatorField, par().q1); auto &q2 = envGet(PropagatorField, par().q2); auto &q3 = envGet(PropagatorField, par().q3); diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index da82617f..1470f1ad 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -133,7 +133,7 @@ void TChargedProp::execute(void) LOG(Message) << "Saving zero-momentum projection to '" << filename << "'..." << std::endl; - CorrWriter writer(filename); + ResultWriter writer(RESULT_FILE_NAME(par().output)); std::vector vecBuf; std::vector result; From 29f026c3758b6e5c1cd2fcaf6f11066f015d0284 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 10 Jan 2018 11:01:03 +0000 Subject: [PATCH 097/620] Hadrons: scalar SU(N) tr(phi^n) 1-pt function --- extras/Hadrons/Modules.hpp | 30 +--- extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 155 ++++++++++++++++++++ extras/Hadrons/make_module_list.sh | 30 ---- extras/Hadrons/modules.inc | 1 + 4 files changed, 157 insertions(+), 59 deletions(-) create mode 100644 extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index e50d2b0b..523ac101 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,32 +1,3 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Lanny91 - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ - #include #include #include @@ -56,5 +27,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp new file mode 100644 index 00000000..8c6bead7 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -0,0 +1,155 @@ +#ifndef Hadrons_MScalarSUN_TrPhi_hpp_ +#define Hadrons_MScalarSUN_TrPhi_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * TrPhi * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TrPhiPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TrPhiPar, + std::string, field, + unsigned int, maxPow, + std::string, output); +}; + +template +class TTrPhi: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, op, + Complex, value); + }; +public: + // constructor + TTrPhi(const std::string name); + // destructor + virtual ~TTrPhi(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + // output name generator + std::string outName(const unsigned int n); +}; + +MODULE_REGISTER_NS(TrPhiSU2, TTrPhi>, MScalarSUN); +MODULE_REGISTER_NS(TrPhiSU3, TTrPhi>, MScalarSUN); +MODULE_REGISTER_NS(TrPhiSU4, TTrPhi>, MScalarSUN); +MODULE_REGISTER_NS(TrPhiSU5, TTrPhi>, MScalarSUN); +MODULE_REGISTER_NS(TrPhiSU6, TTrPhi>, MScalarSUN); + +/****************************************************************************** + * TTrPhi implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTrPhi::TTrPhi(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTrPhi::getInput(void) +{ + std::vector in = {par().field}; + + return in; +} + +template +std::vector TTrPhi::getOutput(void) +{ + std::vector out; + + for (unsigned int n = 2; n <= par().maxPow; n += 2) + { + out.push_back(outName(n)); + } + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTrPhi::setup(void) +{ + if (par().maxPow < 2) + { + HADRON_ERROR(Size, "'maxPow' should be at least equal to 2"); + } + envTmpLat(Field, "phi2"); + envTmpLat(Field, "buf"); + for (unsigned int n = 2; n <= par().maxPow; n += 2) + { + envCreateLat(ComplexField, outName(n)); + } +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTrPhi::execute(void) +{ + LOG(Message) << "Computing tr(phi^n) for n even up to " << par().maxPow + << "..." << std::endl; + + std::vector result; + auto &phi = envGet(Field, par().field); + + envGetTmp(Field, phi2); + envGetTmp(Field, buf); + buf = 1.; + phi2 = -phi*phi; + for (unsigned int n = 2; n <= par().maxPow; n += 2) + { + auto &phin = envGet(ComplexField, outName(n)); + + buf = buf*phi2; + phin = trace(buf); + if (!par().output.empty()) + { + Result r; + + r.op = "phi" + std::to_string(n); + r.value = TensorRemove(sum(phin)); + result.push_back(r); + } + } + if (result.size() > 0) + { + ResultWriter writer(RESULT_FILE_NAME(par().output)); + + write(writer, "trphi", result); + } +} + +// output name generator /////////////////////////////////////////////////////// +template +std::string TTrPhi::outName(const unsigned int n) +{ + return getName() + "_" + std::to_string(n); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TrPhi_hpp_ diff --git a/extras/Hadrons/make_module_list.sh b/extras/Hadrons/make_module_list.sh index 8c6fa4da..ddc56ff6 100755 --- a/extras/Hadrons/make_module_list.sh +++ b/extras/Hadrons/make_module_list.sh @@ -7,36 +7,6 @@ echo 'modules_hpp =\' >> modules.inc find Modules -name '*.hpp' -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> modules.inc echo '' >> modules.inc rm -f Modules.hpp -echo "/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015 -Copyright (C) 2016 -Copyright (C) 2017 - -Author: Antonin Portelli - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file \"LICENSE\" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ -" > Modules.hpp for f in `find Modules -name '*.hpp'`; do echo "#include " >> Modules.hpp done diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 6e1ef6dc..00ef323f 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -39,6 +39,7 @@ modules_hpp =\ Modules/MScalar/ChargedProp.hpp \ Modules/MAction/DWF.hpp \ Modules/MAction/Wilson.hpp \ + Modules/MScalarSUN/TrPhi.hpp \ Modules/MIO/LoadNersc.hpp \ Modules/MIO/LoadBinary.hpp From b7cd7213085c7050f17c81ba2757c1d8ae63c914 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 10 Jan 2018 11:25:59 +0000 Subject: [PATCH 098/620] Hadrons: scalar SU(N) tr(mag^n) --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 119 ++++++++++++++++++++ extras/Hadrons/modules.inc | 1 + 3 files changed, 121 insertions(+) create mode 100644 extras/Hadrons/Modules/MScalarSUN/TrMag.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 523ac101..1d059a79 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp new file mode 100644 index 00000000..f33784fa --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -0,0 +1,119 @@ +#ifndef Hadrons_MScalarSUN_TrMag_hpp_ +#define Hadrons_MScalarSUN_TrMag_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * TrMag * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TrMagPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TrMagPar, + std::string, field, + unsigned int, maxPow, + std::string, output); +}; + +template +class TTrMag: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, op, + Real, value); + }; +public: + // constructor + TTrMag(const std::string name); + // destructor + virtual ~TTrMag(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(TrMagSU2, TTrMag>, MScalarSUN); +MODULE_REGISTER_NS(TrMagSU3, TTrMag>, MScalarSUN); +MODULE_REGISTER_NS(TrMagSU4, TTrMag>, MScalarSUN); +MODULE_REGISTER_NS(TrMagSU5, TTrMag>, MScalarSUN); +MODULE_REGISTER_NS(TrMagSU6, TTrMag>, MScalarSUN); + +/****************************************************************************** + * TTrMag implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTrMag::TTrMag(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTrMag::getInput(void) +{ + std::vector in = {par().field}; + + return in; +} + +template +std::vector TTrMag::getOutput(void) +{ + std::vector out = {}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTrMag::setup(void) +{} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTrMag::execute(void) +{ + LOG(Message) << "Computing tr(mag^n) for n even up to " << par().maxPow + << "..." << std::endl; + + std::vector result; + ResultWriter writer(RESULT_FILE_NAME(par().output)); + auto &phi = envGet(Field, par().field); + + auto m2 = sum(phi), mn = m2; + + m2 = -m2*m2; + mn = 1.; + for (unsigned int n = 2; n <= par().maxPow; n += 2) + { + Result r; + + mn = mn*m2; + r.op = "tr(mag^" + std::to_string(n) + ")"; + r.value = TensorRemove(trace(mn)).real(); + result.push_back(r); + } + write(writer, "trmag", result); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TrMag_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 00ef323f..cea4dc2a 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -39,6 +39,7 @@ modules_hpp =\ Modules/MScalar/ChargedProp.hpp \ Modules/MAction/DWF.hpp \ Modules/MAction/Wilson.hpp \ + Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/TrPhi.hpp \ Modules/MIO/LoadNersc.hpp \ Modules/MIO/LoadBinary.hpp From d9d1f43ba208fed87fae930e182e4b6cd550da6f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 10 Jan 2018 11:29:49 +0000 Subject: [PATCH 099/620] Hadrons: code cleaning --- extras/Hadrons/Modules.hpp | 28 ++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 31 +++++++++++++++-- extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 37 ++++++++++++++++++--- 3 files changed, 89 insertions(+), 7 deletions(-) diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 1d059a79..eea16839 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,3 +1,31 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Lanny91 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp index f33784fa..96eb794e 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TrMag.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_TrMag_hpp_ #define Hadrons_MScalarSUN_TrMag_hpp_ @@ -8,7 +35,7 @@ BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * TrMag * + * Module to compute tr(mag^n) * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) @@ -55,7 +82,7 @@ MODULE_REGISTER_NS(TrMagSU5, TTrMag>, MScalarSUN); MODULE_REGISTER_NS(TrMagSU6, TTrMag>, MScalarSUN); /****************************************************************************** - * TTrMag implementation * + * TTrMag implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index 8c6bead7..4586663d 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_TrPhi_hpp_ #define Hadrons_MScalarSUN_TrPhi_hpp_ @@ -8,7 +35,7 @@ BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * TrPhi * + * Module to compute tr(phi^n) * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) @@ -32,7 +59,7 @@ public: public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, std::string, op, - Complex, value); + Real, value); }; public: // constructor @@ -58,7 +85,7 @@ MODULE_REGISTER_NS(TrPhiSU5, TTrPhi>, MScalarSUN); MODULE_REGISTER_NS(TrPhiSU6, TTrPhi>, MScalarSUN); /****************************************************************************** - * TTrPhi implementation * + * TTrPhi implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template @@ -128,8 +155,8 @@ void TTrPhi::execute(void) { Result r; - r.op = "phi" + std::to_string(n); - r.value = TensorRemove(sum(phin)); + r.op = "tr(phi^" + std::to_string(n) + ")"; + r.value = TensorRemove(sum(phin)).real(); result.push_back(r); } } From a3affac963b85fa2f8de4296c58b31eaf737279b Mon Sep 17 00:00:00 2001 From: David Preti Date: Wed, 10 Jan 2018 14:56:54 +0100 Subject: [PATCH 100/620] SU3 restored + output filename for mesons and baryons fixed. --- extras/Hadrons/Modules/MContraction/Baryon.hpp | 4 +++- extras/Hadrons/Modules/MContraction/Meson.hpp | 4 +++- extras/Hadrons/Modules/MGauge/Random.cc | 2 +- extras/Hadrons/Modules/MGauge/Unit.cc | 2 +- lib/qcd/QCD.h | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/Baryon.hpp b/extras/Hadrons/Modules/MContraction/Baryon.hpp index 78bde5a2..358f7025 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.hpp +++ b/extras/Hadrons/Modules/MContraction/Baryon.hpp @@ -112,7 +112,9 @@ void TBaryon::execute(void) << " quarks '" << par().q1 << "', '" << par().q2 << "', and '" << par().q3 << "'" << std::endl; - CorrWriter writer(par().output); + std::string output_name = par().output + "." + std::to_string(env().getTrajectory()); + + CorrWriter writer(output_name); PropagatorField1 &q1 = *env().template getObject(par().q1); PropagatorField2 &q2 = *env().template getObject(par().q2); PropagatorField3 &q3 = *env().template getObject(par().q2); diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index 7810326a..5355bace 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -165,8 +165,10 @@ void TMeson::execute(void) LOG(Message) << "Computing meson contractions '" << getName() << "' using" << " quarks '" << par().q1 << "' and '" << par().q2 << "'" << std::endl; + + std::string output_name = par().output + "." + std::to_string(env().getTrajectory()); - CorrWriter writer(par().output); + CorrWriter writer(output_name); std::vector buf; std::vector result; Gamma g5(Gamma::Algebra::Gamma5); diff --git a/extras/Hadrons/Modules/MGauge/Random.cc b/extras/Hadrons/Modules/MGauge/Random.cc index 5c063361..c10fdfc3 100644 --- a/extras/Hadrons/Modules/MGauge/Random.cc +++ b/extras/Hadrons/Modules/MGauge/Random.cc @@ -65,5 +65,5 @@ void TRandom::execute(void) { LOG(Message) << "Generating random gauge configuration" << std::endl; LatticeGaugeField &U = *env().createLattice(getName()); - SU4::HotConfiguration(*env().get4dRng(), U); + SU3::HotConfiguration(*env().get4dRng(), U); } diff --git a/extras/Hadrons/Modules/MGauge/Unit.cc b/extras/Hadrons/Modules/MGauge/Unit.cc index 12696ee9..18d75c59 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.cc +++ b/extras/Hadrons/Modules/MGauge/Unit.cc @@ -65,5 +65,5 @@ void TUnit::execute(void) { LOG(Message) << "Creating unit gauge configuration" << std::endl; LatticeGaugeField &U = *env().createLattice(getName()); - SU4::ColdConfiguration(*env().get4dRng(), U); + SU3::ColdConfiguration(*env().get4dRng(), U); } diff --git a/lib/qcd/QCD.h b/lib/qcd/QCD.h index 2caea7e9..9c6d54d4 100644 --- a/lib/qcd/QCD.h +++ b/lib/qcd/QCD.h @@ -49,7 +49,7 @@ namespace QCD { static const int Zm = 6; static const int Tm = 7; - static const int Nc=4; + static const int Nc=3; static const int Ns=4; static const int Nd=4; static const int Nhs=2; // half spinor From cf858deb16a393270d4b14c702031aae50257da3 Mon Sep 17 00:00:00 2001 From: pretidav Date: Wed, 10 Jan 2018 18:43:02 +0100 Subject: [PATCH 101/620] Lanczos with 2 reps fixed (tobe tested) --- tests/lanczos/Test_WCMultiRep_lanczos.cc | 128 +++++++++++++++++------ 1 file changed, 95 insertions(+), 33 deletions(-) diff --git a/tests/lanczos/Test_WCMultiRep_lanczos.cc b/tests/lanczos/Test_WCMultiRep_lanczos.cc index e8549234..98180db1 100644 --- a/tests/lanczos/Test_WCMultiRep_lanczos.cc +++ b/tests/lanczos/Test_WCMultiRep_lanczos.cc @@ -32,8 +32,17 @@ using namespace std; using namespace Grid; using namespace Grid::QCD; -typedef WilsonFermionR FermionOp; -typedef typename WilsonFermionR::FermionField FermionField; + +//typedef WilsonCloverFermionR FermionOp; +//typedef typename WilsonFermionR::FermionField FermionField; + +typedef WilsonImplR FundImplPolicy; +typedef WilsonCloverFermionR FundFermionAction; +typedef typename FundFermionAction::FermionField FundFermionField; + +typedef WilsonTwoIndexAntiSymmetricImplR ASymmImplPolicy; +typedef WilsonCloverTwoIndexAntiSymmetricFermionR ASymmFermionAction; +typedef typename ASymmFermionAction::FermionField ASymmFermionField; RealD AllZero(RealD x) { return 0.; } @@ -60,49 +69,102 @@ int main(int argc, char** argv) { GridParallelRNG RNG5rb(FrbGrid); RNG5.SeedFixedIntegers(seeds5); - LatticeGaugeField Umu(UGrid); - SU3::HotConfiguration(RNG4, Umu); + GridParallelRNG pRNG(UGrid); + GridSerialRNG sRNG; -/* - std::vector U(4, UGrid); - for (int mu = 0; mu < Nd; mu++) { - U[mu] = PeekIndex(Umu, mu); - } -*/ + FundamentalRepresentation::LatticeField Umu(UGrid); + + TwoIndexAntiSymmetricRepresentation HiRep(UGrid); + TwoIndexAntiSymmetricRepresentation::LatticeField UmuAS(UGrid); - RealD mass = -0.1; - RealD M5 = 1.8; - RealD mob_b = 1.5; - FermionOp WilsonOperator(Umu,*FGrid,*FrbGrid,mass); - MdagMLinearOperator HermOp(WilsonOperator); /// <----- - //SchurDiagTwoOperator HermOp(WilsonOperator); + + CheckpointerParameters CPparams; + + CPparams.config_prefix = "ckpoint_lat"; + CPparams.rng_prefix = "ckpoint_rng"; + CPparams.format = "IEEE64BIG"; - const int Nstop = 20; - const int Nk = 60; - const int Np = 60; +//NerscHmcCheckpointer Checkpoint(std::string("ckpoint_lat"), + // std::string("ckpoint_rng"), 1); + +NerscHmcCheckpointer Checkpoint(CPparams); + + int CNFGSTART=1; + int CNFGEND=2; + int CNFGSTEP=1; + + Real Fundmass = -0.1; + Real Fundcsw = 1.0; + Real ASmass = -0.1; + Real AScsw = 1.0; + + std::cout << "Fund: mass and csw" << Fundmass << " and " << Fundcsw << std::endl; + std::cout << "AS : mass and csw" << ASmass << " and " << AScsw << std::endl; + + const int Nstop = 30; + const int Nk = 40; + const int Np = 40; const int Nm = Nk + Np; const int MaxIt = 10000; - RealD resid = 1.0e-6; + RealD resid = 1.0e-8; - std::vector Coeffs{0, 1.}; - Polynomial PolyX(Coeffs); - Chebyshev Cheb(0.0, 10., 12); - ImplicitlyRestartedLanczos IRL(HermOp, PolyX, Nstop, Nk, Nm, + for (int cnfg=CNFGSTART;cnfg<=CNFGEND;cnfg+=CNFGSTEP){ + Checkpoint.CheckpointRestore(cnfg,Umu, sRNG, pRNG); + + //SU4::HotConfiguration(RNG4, Umu); // temporary, then read. + + HiRep.update_representation(Umu); + UmuAS = HiRep.U; + + FundFermionAction FundFermOp(Umu,*FGrid,*FrbGrid, Fundmass, Fundcsw, Fundcsw); + MdagMLinearOperator HermOpFund(FundFermOp); /// <----- + + ASymmFermionAction ASFermOp(UmuAS,*FGrid,*FrbGrid, ASmass, AScsw, AScsw); + MdagMLinearOperator HermOpAS(ASFermOp); /// <----- + + std::vector Coeffs{0, -1.}; + Polynomial FundPolyX(Coeffs); + Chebyshev FundCheb(0.0, 10., 12); + ImplicitlyRestartedLanczos IRL_Fund(HermOpFund, FundPolyX, Nstop, Nk, Nm, resid, MaxIt); + + Polynomial ASPolyX(Coeffs); + Chebyshev ASCheb(0.0, 10., 12); + ImplicitlyRestartedLanczos IRL_AS(HermOpAS, ASPolyX, Nstop, Nk, Nm, + resid, MaxIt); + + std::vector Fundeval(Nm); + std::vector ASeval(Nm); - std::vector eval(Nm); - FermionField src(FGrid); - gaussian(RNG5, src); - std::vector evec(Nm, FGrid); + FundFermionField Fundsrc(FGrid); + ASymmFermionField ASsrc(FGrid); + + gaussian(RNG5, Fundsrc); + gaussian(RNG5, ASsrc); + + std::vector Fundevec(Nm, FGrid); + std::vector ASevec(Nm, FGrid); + for (int i = 0; i < 1; i++) { - std::cout << i << " / " << Nm << " grid pointer " << evec[i]._grid + std::cout << i << " / " << Nm << "Fund: grid pointer " << Fundevec[i]._grid << std::endl; }; + for (int i = 0; i < 1; i++) { + std::cout << i << " / " << Nm << "AS: grid pointer " << ASevec[i]._grid + << std::endl; + }; + + int FundNconv, ASNconv; + IRL_Fund.calc(Fundeval, Fundevec, Fundsrc, FundNconv); + IRL_AS.calc(ASeval, ASevec, ASsrc, ASNconv); - int Nconv; - IRL.calc(eval, evec, src, Nconv); - - std::cout << eval << std::endl; + for (int i=0;i #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp new file mode 100644 index 00000000..abfbf609 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -0,0 +1,184 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MScalarSUN_TwoPoint_hpp_ +#define Hadrons_MScalarSUN_TwoPoint_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * 2-pt functions for a given set of operators * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TwoPointPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointPar, + std::vector, op, + std::string, output); +}; + +template +class TTwoPoint: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, sink, + std::string, source, + std::vector, data); + }; +public: + // constructor + TTwoPoint(const std::string name); + // destructor + virtual ~TTwoPoint(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + // make 2-pt function + template + std::vector makeTwoPoint(const std::vector &sink, + const std::vector &source); +}; + +MODULE_REGISTER_NS(TwoPointSU2, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_NS(TwoPointSU3, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_NS(TwoPointSU4, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_NS(TwoPointSU5, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_NS(TwoPointSU6, TTwoPoint>, MScalarSUN); + +/****************************************************************************** + * TTwoPoint implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTwoPoint::TTwoPoint(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTwoPoint::getInput(void) +{ + return par().op; +} + +template +std::vector TTwoPoint::getOutput(void) +{ + std::vector out = {}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTwoPoint::setup(void) +{ + const unsigned int nt = env().getDim().back(); + envTmp(std::vector>, "slicedOp", 1, par().op.size(), + std::vector(nt)); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTwoPoint::execute(void) +{ + LOG(Message) << "Computing 2-point functions for operators:" << std::endl; + for (auto &o: par().op) + { + LOG(Message) << " '" << o << "'" << std::endl; + } + + ResultWriter writer(RESULT_FILE_NAME(par().output)); + const unsigned int nd = env().getDim().size(); + std::vector result; + + envGetTmp(std::vector>, slicedOp); + for (unsigned int i = 0; i < par().op.size(); ++i) + { + auto &op = envGet(ComplexField, par().op[i]); + + sliceSum(op, slicedOp[i], nd - 1); + } + for (unsigned int i = 0; i < par().op.size(); ++i) + for (unsigned int j = 0; j < par().op.size(); ++j) + { + Result r; + + r.sink = par().op[i]; + r.source = par().op[j]; + r.data = makeTwoPoint(slicedOp[i], slicedOp[j]); + result.push_back(r); + } + write(writer, "twopt", result); +} + +// make 2-pt function ////////////////////////////////////////////////////////// +template +template +std::vector TTwoPoint::makeTwoPoint( + const std::vector &sink, + const std::vector &source) +{ + assert(sink.size() == source.size()); + + unsigned int nt = sink.size(); + std::vector res(nt, 0.); + + for (unsigned int dt = 0; dt < nt; ++dt) + { + for (unsigned int t = 0; t < nt; ++t) + { + res[dt] += TensorRemove(trace(sink[(t+dt)%nt]*source[t])); + } + res[dt] *= 1./static_cast(nt); + } + + return res; +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TwoPoint_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index cea4dc2a..b1ccb8cc 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -40,6 +40,7 @@ modules_hpp =\ Modules/MAction/DWF.hpp \ Modules/MAction/Wilson.hpp \ Modules/MScalarSUN/TrMag.hpp \ + Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ Modules/MIO/LoadNersc.hpp \ Modules/MIO/LoadBinary.hpp From b7f8c5b823dbc0e0b22f7461bb7b7faf9fcc1e39 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 12 Jan 2018 14:38:27 +0000 Subject: [PATCH 103/620] Modify test to merge with the new Lanczos interface --- tests/lanczos/Test_WCMultiRep_lanczos.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/lanczos/Test_WCMultiRep_lanczos.cc b/tests/lanczos/Test_WCMultiRep_lanczos.cc index 98180db1..b6d69aee 100644 --- a/tests/lanczos/Test_WCMultiRep_lanczos.cc +++ b/tests/lanczos/Test_WCMultiRep_lanczos.cc @@ -124,13 +124,21 @@ NerscHmcCheckpointer Checkpoint(CPparams); std::vector Coeffs{0, -1.}; Polynomial FundPolyX(Coeffs); - Chebyshev FundCheb(0.0, 10., 12); - ImplicitlyRestartedLanczos IRL_Fund(HermOpFund, FundPolyX, Nstop, Nk, Nm, + //Chebyshev FundCheb(0.0, 10., 12); + + FunctionHermOp FundPolyXOp(FundPolyX,HermOpFund); + PlainHermOp FundOp (HermOpFund); + + ImplicitlyRestartedLanczos IRL_Fund(FundOp, FundPolyXOp, Nstop, Nk, Nm, resid, MaxIt); Polynomial ASPolyX(Coeffs); - Chebyshev ASCheb(0.0, 10., 12); - ImplicitlyRestartedLanczos IRL_AS(HermOpAS, ASPolyX, Nstop, Nk, Nm, + //Chebyshev ASCheb(0.0, 10., 12); + + FunctionHermOp ASPolyXOp(ASPolyX,HermOpAS); + PlainHermOp ASOp (HermOpAS); + + ImplicitlyRestartedLanczos IRL_AS(ASOp, ASPolyXOp, Nstop, Nk, Nm, resid, MaxIt); std::vector Fundeval(Nm); From b00d2d2c39f8fdc976446072faaa884e8596b777 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 17 Jan 2018 13:46:12 +0000 Subject: [PATCH 104/620] Correction of Representations compilation and small compilation error for Intel 17 --- lib/qcd/action/fermion/FermionOperatorImpl.h | 89 +++++++++++--------- lib/qcd/action/fermion/WilsonFermion.cc | 4 +- lib/qcd/action/fermion/WilsonFermion5D.cc | 4 +- lib/qcd/action/fermion/WilsonKernels.h | 8 +- lib/qcd/representations/adjoint.h | 1 + lib/qcd/representations/fundamental.h | 1 + lib/qcd/representations/two_index.h | 1 + 7 files changed, 58 insertions(+), 50 deletions(-) diff --git a/lib/qcd/action/fermion/FermionOperatorImpl.h b/lib/qcd/action/fermion/FermionOperatorImpl.h index 2b900569..c21a07ee 100644 --- a/lib/qcd/action/fermion/FermionOperatorImpl.h +++ b/lib/qcd/action/fermion/FermionOperatorImpl.h @@ -164,6 +164,7 @@ namespace QCD { public: static const int Dimension = Representation::Dimension; + static const bool isFundamental = Representation::isFundamental; static const bool LsVectorised=false; static const int Nhcs = Options::Nhcs; @@ -298,27 +299,28 @@ namespace QCD { //////////////////////////////////////////////////////////////////////////////////// // Single flavour four spinors with colour index, 5d redblack //////////////////////////////////////////////////////////////////////////////////// -template -class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepresentation> > { +template +class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Representation::Dimension> > { public: - typedef PeriodicGaugeImpl > Gimpl; + typedef PeriodicGaugeImpl > Gimpl; INHERIT_GIMPL_TYPES(Gimpl); - static const int Dimension = Nrepresentation; + static const int Dimension = Representation::Dimension; + static const bool isFundamental = Representation::isFundamental; static const bool LsVectorised=true; static const int Nhcs = Options::Nhcs; typedef typename Options::_Coeff_t Coeff_t; typedef typename Options::template PrecisionMapper::LowerPrecVector SimdL; - template using iImplSpinor = iScalar, Ns> >; - template using iImplPropagator = iScalar, Ns> >; - template using iImplHalfSpinor = iScalar, Nhs> >; - template using iImplHalfCommSpinor = iScalar, Nhcs> >; - template using iImplDoubledGaugeField = iVector >, Nds>; - template using iImplGaugeField = iVector >, Nd>; - template using iImplGaugeLink = iScalar > >; + template using iImplSpinor = iScalar, Ns> >; + template using iImplPropagator = iScalar, Ns> >; + template using iImplHalfSpinor = iScalar, Nhs> >; + template using iImplHalfCommSpinor = iScalar, Nhcs> >; + template using iImplDoubledGaugeField = iVector >, Nds>; + template using iImplGaugeField = iVector >, Nd>; + template using iImplGaugeLink = iScalar > >; typedef iImplSpinor SiteSpinor; typedef iImplPropagator SitePropagator; @@ -354,8 +356,8 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres const SiteHalfSpinor &chi, int mu, StencilEntry *SE, StencilImpl &St) { SiteGaugeLink UU; - for (int i = 0; i < Nrepresentation; i++) { - for (int j = 0; j < Nrepresentation; j++) { + for (int i = 0; i < Dimension; i++) { + for (int j = 0; j < Dimension; j++) { vsplat(UU()()(i, j), U(mu)()(i, j)); } } @@ -367,8 +369,8 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres const SitePropagator &chi, int mu) { SiteGaugeLink UU; - for (int i = 0; i < Nrepresentation; i++) { - for (int j = 0; j < Nrepresentation; j++) { + for (int i = 0; i < Dimension; i++) { + for (int j = 0; j < Dimension; j++) { vsplat(UU()()(i, j), U(mu)()(i, j)); } } @@ -472,25 +474,26 @@ class DomainWallVec5dImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepres //////////////////////////////////////////////////////////////////////////////////////// // Flavour doubled spinors; is Gparity the only? what about C*? //////////////////////////////////////////////////////////////////////////////////////// -template -class GparityWilsonImpl : public ConjugateGaugeImpl > { +template +class GparityWilsonImpl : public ConjugateGaugeImpl > { public: - static const int Dimension = Nrepresentation; + static const int Dimension = Representation::Dimension; + static const bool isFundamental = Representation::isFundamental; static const int Nhcs = Options::Nhcs; static const bool LsVectorised=false; - typedef ConjugateGaugeImpl< GaugeImplTypes > Gimpl; + typedef ConjugateGaugeImpl< GaugeImplTypes > Gimpl; INHERIT_GIMPL_TYPES(Gimpl); typedef typename Options::_Coeff_t Coeff_t; typedef typename Options::template PrecisionMapper::LowerPrecVector SimdL; - template using iImplSpinor = iVector, Ns>, Ngp>; - template using iImplPropagator = iVector, Ns>, Ngp>; - template using iImplHalfSpinor = iVector, Nhs>, Ngp>; - template using iImplHalfCommSpinor = iVector, Nhcs>, Ngp>; - template using iImplDoubledGaugeField = iVector >, Nds>, Ngp>; + template using iImplSpinor = iVector, Ns>, Ngp>; + template using iImplPropagator = iVector, Ns>, Ngp>; + template using iImplHalfSpinor = iVector, Nhs>, Ngp>; + template using iImplHalfCommSpinor = iVector, Nhcs>, Ngp>; + template using iImplDoubledGaugeField = iVector >, Nds>, Ngp>; typedef iImplSpinor SiteSpinor; typedef iImplPropagator SitePropagator; @@ -711,6 +714,7 @@ class StaggeredImpl : public PeriodicGaugeImpl > Gimpl; @@ -839,6 +843,7 @@ class StaggeredImpl : public PeriodicGaugeImpl > Gimpl; @@ -1033,29 +1038,29 @@ typedef WilsonImpl W typedef WilsonImpl WilsonTwoIndexAntiSymmetricImplF; // Float typedef WilsonImpl WilsonTwoIndexAntiSymmetricImplD; // Double -typedef DomainWallVec5dImpl DomainWallVec5dImplR; // Real.. whichever prec -typedef DomainWallVec5dImpl DomainWallVec5dImplF; // Float -typedef DomainWallVec5dImpl DomainWallVec5dImplD; // Double +typedef DomainWallVec5dImpl DomainWallVec5dImplR; // Real.. whichever prec +typedef DomainWallVec5dImpl DomainWallVec5dImplF; // Float +typedef DomainWallVec5dImpl DomainWallVec5dImplD; // Double -typedef DomainWallVec5dImpl DomainWallVec5dImplRL; // Real.. whichever prec -typedef DomainWallVec5dImpl DomainWallVec5dImplFH; // Float -typedef DomainWallVec5dImpl DomainWallVec5dImplDF; // Double +typedef DomainWallVec5dImpl DomainWallVec5dImplRL; // Real.. whichever prec +typedef DomainWallVec5dImpl DomainWallVec5dImplFH; // Float +typedef DomainWallVec5dImpl DomainWallVec5dImplDF; // Double -typedef DomainWallVec5dImpl ZDomainWallVec5dImplR; // Real.. whichever prec -typedef DomainWallVec5dImpl ZDomainWallVec5dImplF; // Float -typedef DomainWallVec5dImpl ZDomainWallVec5dImplD; // Double +typedef DomainWallVec5dImpl ZDomainWallVec5dImplR; // Real.. whichever prec +typedef DomainWallVec5dImpl ZDomainWallVec5dImplF; // Float +typedef DomainWallVec5dImpl ZDomainWallVec5dImplD; // Double -typedef DomainWallVec5dImpl ZDomainWallVec5dImplRL; // Real.. whichever prec -typedef DomainWallVec5dImpl ZDomainWallVec5dImplFH; // Float -typedef DomainWallVec5dImpl ZDomainWallVec5dImplDF; // Double +typedef DomainWallVec5dImpl ZDomainWallVec5dImplRL; // Real.. whichever prec +typedef DomainWallVec5dImpl ZDomainWallVec5dImplFH; // Float +typedef DomainWallVec5dImpl ZDomainWallVec5dImplDF; // Double -typedef GparityWilsonImpl GparityWilsonImplR; // Real.. whichever prec -typedef GparityWilsonImpl GparityWilsonImplF; // Float -typedef GparityWilsonImpl GparityWilsonImplD; // Double +typedef GparityWilsonImpl GparityWilsonImplR; // Real.. whichever prec +typedef GparityWilsonImpl GparityWilsonImplF; // Float +typedef GparityWilsonImpl GparityWilsonImplD; // Double -typedef GparityWilsonImpl GparityWilsonImplRL; // Real.. whichever prec -typedef GparityWilsonImpl GparityWilsonImplFH; // Float -typedef GparityWilsonImpl GparityWilsonImplDF; // Double +typedef GparityWilsonImpl GparityWilsonImplRL; // Real.. whichever prec +typedef GparityWilsonImpl GparityWilsonImplFH; // Float +typedef GparityWilsonImpl GparityWilsonImplDF; // Double typedef StaggeredImpl StaggeredImplR; // Real.. whichever prec typedef StaggeredImpl StaggeredImplF; // Float diff --git a/lib/qcd/action/fermion/WilsonFermion.cc b/lib/qcd/action/fermion/WilsonFermion.cc index 2336f4b6..dfaa6758 100644 --- a/lib/qcd/action/fermion/WilsonFermion.cc +++ b/lib/qcd/action/fermion/WilsonFermion.cc @@ -419,7 +419,7 @@ void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, conformable(_grid, q_in._grid); conformable(_grid, q_out._grid); Lattice> ph(_grid), coor(_grid); - Complex i(0.0,1.0); + ComplexD i(0.0,1.0); PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid); unsigned int tshift = (mu == Tp) ? 1 : 0; unsigned int LLt = GridDefaultLatt()[Tp]; @@ -431,7 +431,7 @@ void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, LatticeCoordinate(coor, mu); ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu]))); } - ph = exp((Real)(2*M_PI)*i*ph); + ph = exp((RealD)(2*M_PI)*i*ph); q_out = zero; LatticeInteger coords(_grid); diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/lib/qcd/action/fermion/WilsonFermion5D.cc index 393ee7f3..3e58fed6 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.cc +++ b/lib/qcd/action/fermion/WilsonFermion5D.cc @@ -793,7 +793,7 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, Lattice> ph(FermionGrid()), coor(FermionGrid()); PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()), tmp(FermionGrid()); - Complex i(0.0, 1.0); + ComplexD i(0.0, 1.0); unsigned int tshift = (mu == Tp) ? 1 : 0; unsigned int LLs = q_in._grid->_rdimensions[0]; unsigned int LLt = GridDefaultLatt()[Tp]; @@ -806,7 +806,7 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, LatticeCoordinate(coor, nu + 1); ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu]))); } - ph = exp((Real)(2*M_PI)*i*ph); + ph = exp((RealD)(2*M_PI)*i*ph); q_out = zero; LatticeInteger coords(_FourDimGrid); diff --git a/lib/qcd/action/fermion/WilsonKernels.h b/lib/qcd/action/fermion/WilsonKernels.h index ed8d6be9..2369c98d 100644 --- a/lib/qcd/action/fermion/WilsonKernels.h +++ b/lib/qcd/action/fermion/WilsonKernels.h @@ -55,7 +55,7 @@ template class WilsonKernels : public FermionOperator , public public: template - typename std::enable_if::type + typename std::enable_if::type DhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf, int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1) { @@ -99,7 +99,7 @@ public: } template - typename std::enable_if<(Impl::Dimension != 3 || (Impl::Dimension == 3 && Nc != 3)) && EnableBool, void>::type + typename std::enable_if<(Impl::isFundamental==false || (Impl::isFundamental==true && Nc != 3)) && EnableBool, void>::type DhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf, int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1 ) { // no kernel choice @@ -116,7 +116,7 @@ public: } template - typename std::enable_if::type + typename std::enable_if::type DhopSiteDag(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf, int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1) { @@ -161,7 +161,7 @@ public: } template - typename std::enable_if<(Impl::Dimension != 3 || (Impl::Dimension == 3 && Nc != 3)) && EnableBool,void>::type + typename std::enable_if<(Impl::isFundamental==false || (Impl::isFundamental==true && Nc != 3)) && EnableBool,void>::type DhopSiteDag(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,SiteHalfSpinor * buf, int sF, int sU, int Ls, int Ns, const FermionField &in, FermionField &out,int interior=1,int exterior=1) { diff --git a/lib/qcd/representations/adjoint.h b/lib/qcd/representations/adjoint.h index 078d12a1..052cd7a8 100644 --- a/lib/qcd/representations/adjoint.h +++ b/lib/qcd/representations/adjoint.h @@ -23,6 +23,7 @@ class AdjointRep { typedef typename SU_Adjoint::LatticeAdjMatrix LatticeMatrix; typedef typename SU_Adjoint::LatticeAdjField LatticeField; static const int Dimension = ncolour * ncolour - 1; + static const bool isFundamental = false; LatticeField U; diff --git a/lib/qcd/representations/fundamental.h b/lib/qcd/representations/fundamental.h index db52d893..9f039a07 100644 --- a/lib/qcd/representations/fundamental.h +++ b/lib/qcd/representations/fundamental.h @@ -19,6 +19,7 @@ template class FundamentalRep { public: static const int Dimension = ncolour; + static const bool isFundamental = true; // typdef to be used by the Representations class in HMC to get the // types for the higher representation fields diff --git a/lib/qcd/representations/two_index.h b/lib/qcd/representations/two_index.h index 082a52a5..2c7e8b3a 100644 --- a/lib/qcd/representations/two_index.h +++ b/lib/qcd/representations/two_index.h @@ -29,6 +29,7 @@ class TwoIndexRep { typedef typename SU_TwoIndex::LatticeTwoIndexMatrix LatticeMatrix; typedef typename SU_TwoIndex::LatticeTwoIndexField LatticeField; static const int Dimension = ncolour * (ncolour + S) / 2; + static const bool isFundamental = false; LatticeField U; From 219b3bd34f467fba233656519f34e6c5585e9d40 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 19 Jan 2018 17:14:11 +0000 Subject: [PATCH 105/620] Remove freeVpTensor object --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 25 +++++++++------------ extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 3 +-- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index b8cdb7e3..95e74394 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -38,7 +38,6 @@ std::vector TScalarVP::getOutput(void) for (unsigned int nu = 0; nu < env().getNd(); ++nu) { out.push_back(getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu)); - out.push_back(getName() + "_free_" + std::to_string(mu) + "_" + std::to_string(nu)); } } @@ -55,7 +54,6 @@ void TScalarVP::setup(void) phaseName_.clear(); muPropQName_.clear(); vpTensorName_.clear(); - freeVpTensorName_.clear(); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { @@ -63,16 +61,12 @@ void TScalarVP::setup(void) muPropQName_.push_back(getName() + "_propQ_" + std::to_string(mu)); std::vector vpTensorName_mu; - std::vector freeVpTensorName_mu; for (unsigned int nu = 0; nu < env().getNd(); ++nu) { vpTensorName_mu.push_back(getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu)); - freeVpTensorName_mu.push_back(getName() + "_free_" + std::to_string(mu) - + "_" + std::to_string(nu)); } vpTensorName_.push_back(vpTensorName_mu); - freeVpTensorName_.push_back(freeVpTensorName_mu); } for (unsigned int mu = 0; mu < env().getNd(); ++mu) @@ -82,7 +76,6 @@ void TScalarVP::setup(void) for (unsigned int nu = 0; nu < env().getNd(); ++nu) { env().registerLattice(vpTensorName_[mu][nu]); - env().registerLattice(freeVpTensorName_[mu][nu]); } } } @@ -129,18 +122,15 @@ void TScalarVP::execute(void) ScalarField Amu(env().getGrid()), tmp_vp(env().getGrid()); TComplex Anu0; std::vector coor0 = {0, 0, 0, 0}; - std::vector > vpTensor, freeVpTensor; + std::vector > vpTensor; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { std::vector vpTensor_mu; - std::vector freeVpTensor_mu; for (unsigned int nu = 0; nu < env().getNd(); ++nu) { vpTensor_mu.push_back(*env().createLattice(vpTensorName_[mu][nu])); - freeVpTensor_mu.push_back(*env().createLattice(freeVpTensorName_[mu][nu])); } vpTensor.push_back(vpTensor_mu); - freeVpTensor.push_back(freeVpTensor_mu); } // Open output files if necessary @@ -218,16 +208,17 @@ void TScalarVP::execute(void) // Free VP prop1 = *prop0_; prop2 = Cshift(*prop0_, nu, -1); - freeVpTensor[mu][nu] = adj(prop2) * Cshift(prop1, mu, 1); - freeVpTensor[mu][nu] -= Cshift(adj(prop2), mu, 1) * prop1; - freeVpTensor[mu][nu] = 2.0*real(freeVpTensor[mu][nu]); + tmp_vp = adj(prop2) * Cshift(prop1, mu, 1); + tmp_vp -= Cshift(adj(prop2), mu, 1) * prop1; + tmp_vp = 2.0*real(tmp_vp); + vpTensor[mu][nu] = tmp_vp; // Output if necessary if (!par().output.empty()) { for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = freeVpTensor[mu][nu]*momphases[i_p]; + vpPhase = tmp_vp*momphases[i_p]; sliceSum(vpPhase, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) @@ -243,6 +234,10 @@ void TScalarVP::execute(void) } } + // S + // X + // 4C + // "Exchange" terms prop1 += q*propQ; prop2 += q*muPropQ[nu]; diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index e4a6e825..2b9e988b 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -47,8 +47,7 @@ private: prop0Name_, propQName_, propSunName_, propTadName_; std::vector phaseName_, muPropQName_; - std::vector > vpTensorName_, - freeVpTensorName_; + std::vector > vpTensorName_; ScalarField *freeMomProp_, *GFSrc_, *prop0_; std::vector phase_; From 63982819c685b852e56fca552896afb78ebe4598 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Mon, 22 Jan 2018 11:03:39 +0000 Subject: [PATCH 106/620] No option to overlap comms and compute for asm implementation since different directions are interleaved in the kernels, introducing if else structure would be too painful --- lib/qcd/action/fermion/StaggeredKernels.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/qcd/action/fermion/StaggeredKernels.h b/lib/qcd/action/fermion/StaggeredKernels.h index c0c23caa..79de1a68 100644 --- a/lib/qcd/action/fermion/StaggeredKernels.h +++ b/lib/qcd/action/fermion/StaggeredKernels.h @@ -93,14 +93,6 @@ public: DoubledGaugeField &U,DoubledGaugeField &UUU, SiteSpinor * buf, int LLs, int sU, const FermionField &in, FermionField &out,int dag); - void DhopSiteAsmInt(StencilImpl &st, LebesgueOrder &lo, - DoubledGaugeField &U,DoubledGaugeField &UUU, - SiteSpinor * buf, int LLs, int sU, - const FermionField &in, FermionField &out,int dag); - void DhopSiteAsmExt(StencilImpl &st, LebesgueOrder &lo, - DoubledGaugeField &U, DoubledGaugeField &UUU, - SiteSpinor * buf, int LLs, int sU, - const FermionField &in, FermionField &out,int dag); /////////////////////////////////////////////////////////////////////////////////////////////////// // Generic interface; fan out to right routine /////////////////////////////////////////////////////////////////////////////////////////////////// From 97b9c6f03d1a813674cc2e1c52de50ebfac32fdf Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Mon, 22 Jan 2018 11:04:19 +0000 Subject: [PATCH 107/620] No option for interior/exterior split of asm kernels since different directions get interleaved --- lib/qcd/action/fermion/StaggeredKernels.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/qcd/action/fermion/StaggeredKernels.cc b/lib/qcd/action/fermion/StaggeredKernels.cc index ea44cdd8..b7e568c2 100644 --- a/lib/qcd/action/fermion/StaggeredKernels.cc +++ b/lib/qcd/action/fermion/StaggeredKernels.cc @@ -245,10 +245,9 @@ void StaggeredKernels::DhopSite(StencilImpl &st, LebesgueOrder &lo, Double case OptInlineAsm: if ( interior && exterior ) { DhopSiteAsm(st,lo,U,UUU,buf,LLs,sU,in,out,dag); - } else if ( interior ) { - DhopSiteAsmInt(st,lo,U,UUU,buf,LLs,sU,in,out,dag); - } else if ( exterior ) { - DhopSiteAsmExt(st,lo,U,UUU,buf,LLs,sU,in,out,dag); + } else { + std::cout << GridLogError << "Cannot overlap comms and compute with Staggered assembly"< Date: Mon, 22 Jan 2018 19:37:47 +0000 Subject: [PATCH 108/620] Hadrons: module for scalar operator divergence --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/Div.hpp | 166 ++++++++++++++++++++++ extras/Hadrons/modules.inc | 1 + 3 files changed, 168 insertions(+) create mode 100644 extras/Hadrons/Modules/MScalarSUN/Div.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 5834fb3f..6e123660 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -55,6 +55,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp new file mode 100644 index 00000000..6680cd79 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -0,0 +1,166 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/Div.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MScalarSUN_Div_hpp_ +#define Hadrons_MScalarSUN_Div_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Div * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class DivPar: Serializable +{ +public: + GRID_SERIALIZABLE_ENUM(DiffType, undef, forward, 1, backward, 2, central, 3); + GRID_SERIALIZABLE_CLASS_MEMBERS(DivPar, + std::vector, op, + DiffType, type, + std::string, output); +}; + +template +class TDiv: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + DivPar::DiffType, type, + Complex, value); + }; +public: + // constructor + TDiv(const std::string name); + // destructor + virtual ~TDiv(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(DivSU2, TDiv>, MScalarSUN); +MODULE_REGISTER_NS(DivSU3, TDiv>, MScalarSUN); +MODULE_REGISTER_NS(DivSU4, TDiv>, MScalarSUN); +MODULE_REGISTER_NS(DivSU5, TDiv>, MScalarSUN); +MODULE_REGISTER_NS(DivSU6, TDiv>, MScalarSUN); + +/****************************************************************************** + * TDiv implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TDiv::TDiv(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TDiv::getInput(void) +{ + return par().op; +} + +template +std::vector TDiv::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TDiv::setup(void) +{ + if (par().op.size() != env().getNd()) + { + HADRON_ERROR(Size, "the number of components differs from number of dimensions"); + } + envCreateLat(ComplexField, getName()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TDiv::execute(void) +{ + const auto nd = env().getNd(); + + LOG(Message) << "Computing the " << par().type << " divergence of ["; + for (unsigned int mu = 0; mu < nd; ++mu) + { + std::cout << par().op[mu] << ((mu == nd - 1) ? "]" : ", "); + } + std::cout << std::endl; + + auto &div = envGet(ComplexField, getName()); + div = zero; + for (unsigned int mu = 0; mu < nd; ++mu) + { + auto &op = envGet(ComplexField, par().op[mu]); + switch(par().type) + { + case DivPar::DiffType::backward: + div += op - Cshift(op, mu, -1); + break; + case DivPar::DiffType::forward: + div += Cshift(op, mu, 1) - op; + break; + case DivPar::DiffType::central: + div += 0.5*(Cshift(op, mu, 1) - Cshift(op, mu, -1)); + break; + } + } + if (!par().output.empty()) + { + Result r; + ResultWriter writer(RESULT_FILE_NAME(par().output)); + + r.type = par().type; + r.value = TensorRemove(sum(div)); + write(writer, "div", r); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_Div_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index b1ccb8cc..1c71301a 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -39,6 +39,7 @@ modules_hpp =\ Modules/MScalar/ChargedProp.hpp \ Modules/MAction/DWF.hpp \ Modules/MAction/Wilson.hpp \ + Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ From 6e3ce7423ef97f53987e768113e3fa4699a3e93e Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 22 Jan 2018 20:04:05 +0000 Subject: [PATCH 109/620] Hadrons: don't display module list at startup (too long) --- extras/Hadrons/Application.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 7ba98ade..39c898bc 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -43,12 +43,6 @@ using namespace Hadrons; Application::Application(void) { initLogger(); - LOG(Message) << "Modules available:" << std::endl; - auto list = ModuleFactory::getInstance().getBuilderList(); - for (auto &m: list) - { - LOG(Message) << " " << m << std::endl; - } auto dim = GridDefaultLatt(), mpi = GridDefaultMpi(), loc(dim); locVol_ = 1; for (unsigned int d = 0; d < dim.size(); ++d) From 389731d373e5f348c80a29520a4328414470c0a2 Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Tue, 23 Jan 2018 10:11:33 +0000 Subject: [PATCH 110/620] changed SeqConservedSummed.hpp to work with new hadrons interface --- .../Modules/MSource/SeqConservedSummed.hpp | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp b/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp index 2296701a..243d05f2 100644 --- a/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp +++ b/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp @@ -4,8 +4,9 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/SeqConservedSummed.hpp -Copyright (C) 2017 +Copyright (C) 2015-2018 +Author: Antonin Portelli Author: Andrew Lawson Author: Vera Guelpers @@ -82,6 +83,7 @@ public: // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); +protected: // setup virtual void setup(void); // execution @@ -121,7 +123,8 @@ template void TSeqConservedSummed::setup(void) { auto Ls_ = env().getObjectLs(par().action); - env().template registerLattice(getName(), Ls_); + envCreateLat(PropagatorField, getName(), Ls_); + envTmpLat(PropagatorField, "src_tmp"); } // execution /////////////////////////////////////////////////////////////////// @@ -141,18 +144,19 @@ void TSeqConservedSummed::execute(void) << par().tA << " <= t <= " << par().tB << std::endl; } - PropagatorField &src = *env().template createLattice(getName()); - auto src_buf = src; - PropagatorField &q = *env().template getObject(par().q); - FMat &mat = *(env().template getObject(par().action)); + auto &src = envGet(PropagatorField, getName()); + envGetTmp(PropagatorField, src_tmp); + src_tmp = src; + auto &q = envGet(PropagatorField, par().q); + auto &mat = envGet(FMat, par().action); std::vector mom = strToVec(par().mom); src = zero; for(int mu=0;mu<=3;mu++) { - mat.SeqConservedCurrent(q, src_buf, par().curr_type, mu, + mat.SeqConservedCurrent(q, src_tmp, par().curr_type, mu, mom, par().tA, par().tB); - src += src_buf; + src += src_tmp; } From ab3baeb38fef642e496ad8fb9b08f42ff91f5252 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Tue, 23 Jan 2018 17:07:45 +0000 Subject: [PATCH 111/620] Implement contractions and data output in functions; calculate diagrams S, X and 4C separately; output 2E and 2T instead of sunset_shifted, sunset_unshifted, tadpole_shifted, tadpole_unshifted; add comments. --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 525 +++++++++----------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 14 + 2 files changed, 241 insertions(+), 298 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 95e74394..93c51a77 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -6,6 +6,78 @@ using namespace Grid; using namespace Hadrons; using namespace MScalar; +/* + * Scalar QED vacuum polarisation up to O(alpha) + * + * + * _______ + * / \ ( adj(S(a\hat{nu}|x)) U_mu(x) S(0|x+a\hat{mu}) U_nu(0) ) + * Diagram notation: U_nu * * U_mu = 2 Re( - ) + * \_______/ ( adj(S(a\hat{nu}|x+a\hat{mu})) adj(U_mu(x)) S(0|x) U_nu(0) ) + * + * + * + * _______ + * / \ + * free = 1 * * 1 + * \_______/ + * + * + * + * _______ + * / \ + * S = iA_nu * * iA_mu + * \_______/ + * + * + * Delta_1 + * ___*___ + * / \ + * X = 1 * * 1 + * \___*___/ + * Delta_1 + * + * Delta_1 Delta_1 + * ___*___ ___*___ + * / \ / \ + * 1 * * iA_mu + iA_nu * * 1 + * \_______/ \_______/ + * 4C = _______ _______ + * / \ / \ + * + 1 * * iA_mu + iA_nu * * 1 + * \___*___/ \___*___/ + * Delta_1 Delta_1 + * + * Delta_1 Delta_1 + * _*___*_ _______ + * / \ / \ + * 2E = 1 * * 1 + 1 * * 1 + * \_______/ \_*___*_/ + * Delta_1 Delta_1 + * + * Delta_2 + * ___*___ _______ + * / \ / \ + * 2T = 1 * * 1 + 1 * * 1 + * \_______/ \___*___/ + * Delta_2 + * + * + * _______ + * / \ + * srcT = -A_nu^2/2 * * 1 + * \_______/ + * + * + * + * _______ + * / \ + * snkT = 1 * * -A_mu^2/2 + * \_______/ + * + * Full VP to O(alpha) = free + q^2*(S+X+4C+2E+2T+srcT+snkT) + */ + /****************************************************************************** * TScalarVP implementation * ******************************************************************************/ @@ -37,7 +109,8 @@ std::vector TScalarVP::getOutput(void) for (unsigned int nu = 0; nu < env().getNd(); ++nu) { - out.push_back(getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu)); + out.push_back(getName() + "_" + std::to_string(mu) + + "_" + std::to_string(nu)); } } @@ -119,8 +192,9 @@ void TScalarVP::execute(void) // CONTRACTIONS ScalarField prop1(env().getGrid()), prop2(env().getGrid()); EmField &A = *env().getObject(par().emField); - ScalarField Amu(env().getGrid()), tmp_vp(env().getGrid()); - TComplex Anu0; + ScalarField Amu(env().getGrid()), U_snk(env().getGrid()); + ScalarField tmp_vp1(env().getGrid()), tmp_vp2(env().getGrid()); + TComplex Anu0, U_src; std::vector coor0 = {0, 0, 0, 0}; std::vector > vpTensor; for (unsigned int mu = 0; mu < env().getNd(); ++mu) @@ -134,10 +208,7 @@ void TScalarVP::execute(void) } // Open output files if necessary - std::vector vecBuf; - std::vector result; - ScalarField vpPhase(env().getGrid()); - std::vector writer, writer0, writerD; + std::vector writer; std::vector momphases; if (!par().output.empty()) { @@ -147,50 +218,32 @@ void TScalarVP::execute(void) std::vector mom = strToVec(par().outputMom[i_p]); // Open output files - std::string filename = par().output + "_" + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]) - + "." + - std::to_string(env().getTrajectory()); - std::string filename0 = par().output + "_" + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]) - + "_free." + - std::to_string(env().getTrajectory()); - std::string filenameD = par().output + "_" + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]) - + "_diagrams." + - std::to_string(env().getTrajectory()); + std::string filename = par().output + "_" + + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]) + "." + + std::to_string(env().getTrajectory()); if (env().getGrid()->IsBoss()) { CorrWriter *writer_i = new CorrWriter(filename); writer.push_back(writer_i); - CorrWriter *writer0_i = new CorrWriter(filename0); - writer0.push_back(writer0_i); - CorrWriter *writerD_i = new CorrWriter(filenameD); - writerD.push_back(writerD_i); write(*writer[i_p], "charge", q); write(*writer[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - write(*writer0[i_p], "charge", 0.0); - write(*writer0[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - write(*writerD[i_p], "charge", q); - write(*writerD[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); } // Calculate phase factors - vpPhase = Complex(1.0,0.0); + tmp_vp1 = Complex(1.0,0.0); for (unsigned int j = 0; j < env().getNd()-1; ++j) { for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) { - vpPhase = vpPhase*(*phase_[j]); + tmp_vp1 = tmp_vp1*(*phase_[j]); } } - vpPhase = adj(vpPhase); - momphases.push_back(vpPhase); + tmp_vp1 = adj(tmp_vp1); + momphases.push_back(tmp_vp1); } } @@ -205,297 +258,132 @@ void TScalarVP::execute(void) << std::endl; Amu = peekLorentz(A, mu); - // Free VP - prop1 = *prop0_; - prop2 = Cshift(*prop0_, nu, -1); - tmp_vp = adj(prop2) * Cshift(prop1, mu, 1); - tmp_vp -= Cshift(adj(prop2), mu, 1) * prop1; - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] = tmp_vp; - + // free + prop1 = *prop0_; // S_0(0|x) + prop2 = Cshift(*prop0_, nu, -1); // S_0(0|x-a\hat{\nu}) + // = S_0(a\hat{\nu}|x) + U_src = Complex(1.0,0.0); + vpContraction(tmp_vp1, prop1, prop2, U_src, mu); + vpTensor[mu][nu] = tmp_vp1; // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writer0[i_p], - "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(writer, tmp_vp1, momphases, + "Pi_free_"+std::to_string(mu)+"_"+std::to_string(nu)); + } + + // srcT + tmp_vp2 = tmp_vp1 * (-0.5)*q*q*Anu0*Anu0; + vpTensor[mu][nu] += tmp_vp2; + // Output if necessary + if (!par().output.empty()) + { + writeVP(writer, tmp_vp2, momphases, + "Pi_srcT_"+std::to_string(mu)+"_"+std::to_string(nu)); + } + + // snkT + tmp_vp2 = tmp_vp1 * (-0.5)*q*q*Amu*Amu; + vpTensor[mu][nu] += tmp_vp2; + // Output if necessary + if (!par().output.empty()) + { + writeVP(writer, tmp_vp2, momphases, + "Pi_snkT_"+std::to_string(mu)+"_"+std::to_string(nu)); } // S - // X + prop1 = *prop0_; // S_0(0|x) + prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) + U_src = ci*q*Anu0; + U_snk = ci*q*Amu; + vpContraction(tmp_vp1, prop1, prop2, U_src, U_snk, mu); + vpTensor[mu][nu] += tmp_vp1; + // Output if necessary + if (!par().output.empty()) + { + writeVP(writer, tmp_vp1, momphases, + "Pi_S_"+std::to_string(mu)+"_"+std::to_string(nu)); + } + // 4C - - // "Exchange" terms - prop1 += q*propQ; - prop2 += q*muPropQ[nu]; - tmp_vp = adj(prop2) * (1.0 + ci*q*Amu) - * Cshift(prop1, mu, 1) * (1.0 + ci*q*Anu0); - tmp_vp -= Cshift(adj(prop2), mu, 1) * (1.0 - ci*q*Amu) - * prop1 * (1.0 + ci*q*Anu0); - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] = tmp_vp; - + prop1 = q*propQ; // q*S_1(0|x) + prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) + U_src = Complex(1.0,0.0); + U_snk = ci*q*Amu; + vpContraction(tmp_vp1, prop1, prop2, U_src, U_snk, mu); + U_src = ci*q*Anu0; + vpContraction(tmp_vp2, prop1, prop2, U_src, mu); + tmp_vp1 += tmp_vp2; + prop1 = *prop0_; // S_0(0|x) + prop2 = q*muPropQ[nu]; // q*S_1(a\hat{\nu}|x) + vpContraction(tmp_vp2, prop1, prop2, U_src, mu); + tmp_vp1 += tmp_vp2; + U_src = Complex(1.0,0.0); + U_snk = ci*q*Amu; + vpContraction(tmp_vp2, prop1, prop2, U_src, U_snk, mu); + tmp_vp1 += tmp_vp2; + vpTensor[mu][nu] += tmp_vp1; // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_exchange_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(writer, tmp_vp1, momphases, + "Pi_4C_"+std::to_string(mu)+"_"+std::to_string(nu)); } - // Subtract O(alpha^2) term - prop1 = q*propQ; - prop2 = q*muPropQ[nu]; - tmp_vp = Cshift(adj(prop2), mu, 1) * (-ci)*q*Amu - * prop1 * ci*q*Anu0; - tmp_vp -= adj(prop2) * ci*q*Amu - * Cshift(prop1, mu, 1) * ci*q*Anu0; - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] += tmp_vp; - + // X + prop1 = q*propQ; // q*S_1(0|x) + prop2 = q*muPropQ[nu]; // q*S_1(a\hat{\nu}|x) + U_src = Complex(1.0,0.0); + vpContraction(tmp_vp1, prop1, prop2, U_src, mu); + vpTensor[mu][nu] += tmp_vp1; // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_alpha2_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(writer, tmp_vp1, momphases, + "Pi_X_"+std::to_string(mu)+"_"+std::to_string(nu)); } - // Sunset from unshifted source - prop1 = q*q*propSun; - prop2 = Cshift(*prop0_, nu, -1); - tmp_vp = adj(prop2) * Cshift(prop1, mu, 1); - tmp_vp -= Cshift(adj(prop2), mu, 1) * prop1; - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] += tmp_vp; - + // 2E + prop1 = q*q*propSun; // q^2*S_\Sigma(0|x) + prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) + U_src = Complex(1.0,0.0); + vpContraction(tmp_vp1, prop1, prop2, U_src, mu); + prop1 = *prop0_; // S_0(0|x) + prop2 = q*q*Cshift(propSun, nu, -1); // q^2*S_\Sigma(0|x-a\hat{\nu}) + //(Note: = ) + vpContraction(tmp_vp2, prop1, prop2, U_src, mu); + tmp_vp1 += tmp_vp2; + vpTensor[mu][nu] += tmp_vp1; // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_sunset_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(writer, tmp_vp1, momphases, + "Pi_2E_"+std::to_string(mu)+"_"+std::to_string(nu)); } - // Sunset from shifted source - prop1 = Cshift(prop1, nu, -1); - tmp_vp = Cshift(adj(*prop0_), mu, 1) * prop1; - tmp_vp -= adj(*prop0_) * Cshift(prop1, mu, 1); - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] += tmp_vp; - + // 2T + prop1 = q*q*propTad; // q^2*S_T(0|x) + prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) + U_src = Complex(1.0,0.0); + vpContraction(tmp_vp1, prop1, prop2, U_src, mu); + prop1 = *prop0_; // S_0(0|x) + prop2 = q*q*Cshift(propTad, nu, -1); // q^2*S_T(0|x-a\hat{\nu}) + vpContraction(tmp_vp2, prop1, prop2, U_src, mu); + tmp_vp1 += tmp_vp2; + vpTensor[mu][nu] += tmp_vp1; // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_sunset_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(writer, tmp_vp1, momphases, + "Pi_2T_"+std::to_string(mu)+"_"+std::to_string(nu)); } - // Tadpole from unshifted source - prop1 = q*q*propTad; - prop2 = Cshift(*prop0_, nu, -1); - tmp_vp = adj(prop2) * Cshift(prop1, mu, 1); - tmp_vp -= Cshift(adj(prop2), mu, 1) * prop1; - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] += tmp_vp; - - // Output if necessary + // Output full VP if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_tadpole_unshifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } - } - - // Tadpole from shifted source - prop1 = Cshift(prop1, nu, -1); - tmp_vp = Cshift(adj(*prop0_), mu, 1) * prop1; - tmp_vp -= adj(*prop0_) * Cshift(prop1, mu, 1); - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] += tmp_vp; - - // Output if necessary - if (!par().output.empty()) - { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_tadpole_shifted_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } - } - - // Source tadpole - prop1 = *prop0_; - tmp_vp = adj(prop2) - * Cshift(prop1, mu, 1) - * (-0.5)*q*q*Anu0*Anu0; - tmp_vp -= Cshift(adj(prop2), mu, 1) - * prop1 - * (-0.5)*q*q*Anu0*Anu0; - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] += tmp_vp; - - // Output if necessary - if (!par().output.empty()) - { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_sourcetadpole_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } - } - - // Sink tadpole - tmp_vp = adj(prop2) - * (-0.5)*q*q*Amu*Amu - * Cshift(prop1, mu, 1); - tmp_vp -= Cshift(adj(prop2), mu, 1) - * (-0.5)*q*q*Amu*Amu - * prop1; - tmp_vp = 2.0*real(tmp_vp); - vpTensor[mu][nu] += tmp_vp; - - // Output if necessary - if (!par().output.empty()) - { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writerD[i_p], - "Pi_sinktadpole_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } - } - - // Output if necessary - if (!par().output.empty()) - { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = vpTensor[mu][nu]*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writer[i_p], - "Pi_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(writer, vpTensor[mu][nu], momphases, + "Pi_"+std::to_string(mu)+"_"+std::to_string(nu)); } } } @@ -506,13 +394,54 @@ void TScalarVP::execute(void) if (env().getGrid()->IsBoss()) { delete writer[i_p]; - delete writer0[i_p]; - delete writerD[i_p]; } } } } +void TScalarVP::vpContraction(ScalarField &vp, + ScalarField &prop_0_x, ScalarField &prop_nu_x, + TComplex u_src, ScalarField &u_snk, int mu) +{ + // Note: this function assumes a point source is used. + vp = adj(prop_nu_x) * u_snk * Cshift(prop_0_x, mu, 1) * u_src; + vp -= Cshift(adj(prop_nu_x), mu, 1) * adj(u_snk) * prop_0_x * u_src; + vp = 2.0*real(vp); +} + +void TScalarVP::vpContraction(ScalarField &vp, + ScalarField &prop_0_x, ScalarField &prop_nu_x, + TComplex u_src, int mu) +{ + // Note: this function assumes a point source is used. + vp = adj(prop_nu_x) * Cshift(prop_0_x, mu, 1) * u_src; + vp -= Cshift(adj(prop_nu_x), mu, 1) * prop_0_x * u_src; + vp = 2.0*real(vp); +} + +void TScalarVP::writeVP(const std::vector &writers, const ScalarField &vp, + const std::vector &momphases, std::string dsetName) +{ + std::vector vecBuf; + std::vector result; + ScalarField vpPhase(env().getGrid()); + + for (unsigned int i_p = 0; i_p < momphases.size(); ++i_p) + { + vpPhase = vp*momphases[i_p]; + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + if (env().getGrid()->IsBoss()) + { + write(*writers[i_p], dsetName, result); + } + } +} + void TScalarVP::momD1(ScalarField &s, FFT &fft) { EmField &A = *env().getObject(par().emField); diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 2b9e988b..564a7f39 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -41,6 +41,20 @@ public: // execution virtual void execute(void); private: + // conserved vector two-point contraction + void vpContraction(ScalarField &vp, + ScalarField &prop_0_x, ScalarField &prop_nu_x, + TComplex u_src, ScalarField &u_snk, int mu); + // conserved vector two-point contraction with unit gauge link at sink + void vpContraction(ScalarField &vp, + ScalarField &prop_0_x, ScalarField &prop_nu_x, + TComplex u_src, int mu); + // write momentum-projected vacuum polarisation to file(s) + void writeVP(const std::vector &writers, + const ScalarField &vp, + const std::vector &momphases, + std::string dsetName); + // momentum-space Delta_1 insertion void momD1(ScalarField &s, FFT &fft); private: std::string freeMomPropName_, GFSrcName_, From a1151fc734667cc6bc7156dbea19b512ee08e1c7 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 23 Jan 2018 17:26:50 +0000 Subject: [PATCH 112/620] Hadrons: MPI-safe serial IO --- extras/Hadrons/Application.cc | 55 +++++++++++-------- extras/Hadrons/Module.hpp | 7 +++ .../Hadrons/Modules/MContraction/Baryon.hpp | 3 +- .../Hadrons/Modules/MContraction/DiscLoop.hpp | 5 +- .../Hadrons/Modules/MContraction/Gamma3pt.hpp | 4 +- extras/Hadrons/Modules/MContraction/Meson.hpp | 3 +- .../MContraction/WeakHamiltonianEye.cc | 4 +- .../MContraction/WeakHamiltonianNonEye.cc | 4 +- .../MContraction/WeakNeutral4ptDisc.cc | 4 +- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 5 +- extras/Hadrons/Modules/MScalar/FreeProp.cc | 4 +- extras/Hadrons/Modules/MScalarSUN/Div.hpp | 3 +- extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 3 +- extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 4 +- .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 3 +- 15 files changed, 55 insertions(+), 56 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 39c898bc..8b2aba4a 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -132,24 +132,27 @@ void Application::parseParameterFile(const std::string parameterFileName) void Application::saveParameterFile(const std::string parameterFileName) { - XmlWriter writer(parameterFileName); - ObjectId id; - const unsigned int nMod = vm().getNModule(); - LOG(Message) << "Saving application to '" << parameterFileName << "'..." << std::endl; - write(writer, "parameters", getPar()); - push(writer, "modules"); - for (unsigned int i = 0; i < nMod; ++i) + if (env().getGrid()->IsBoss()) { - push(writer, "module"); - id.name = vm().getModuleName(i); - id.type = vm().getModule(i)->getRegisteredName(); - write(writer, "id", id); - vm().getModule(i)->saveParameters(writer, "options"); + XmlWriter writer(parameterFileName); + ObjectId id; + const unsigned int nMod = vm().getNModule(); + + write(writer, "parameters", getPar()); + push(writer, "modules"); + for (unsigned int i = 0; i < nMod; ++i) + { + push(writer, "module"); + id.name = vm().getModuleName(i); + id.type = vm().getModule(i)->getRegisteredName(); + write(writer, "id", id); + vm().getModule(i)->saveParameters(writer, "options"); + pop(writer); + } + pop(writer); pop(writer); } - pop(writer); - pop(writer); } // schedule computation //////////////////////////////////////////////////////// @@ -164,20 +167,24 @@ void Application::schedule(void) void Application::saveSchedule(const std::string filename) { - TextWriter writer(filename); - std::vector program; - - if (!scheduled_) - { - HADRON_ERROR(Definition, "Computation not scheduled"); - } LOG(Message) << "Saving current schedule to '" << filename << "'..." << std::endl; - for (auto address: program_) + if (env().getGrid()->IsBoss()) { - program.push_back(vm().getModuleName(address)); + TextWriter writer(filename); + std::vector program; + + if (!scheduled_) + { + HADRON_ERROR(Definition, "Computation not scheduled"); + } + + for (auto address: program_) + { + program.push_back(vm().getModuleName(address)); + } + write(writer, "schedule", program); } - write(writer, "schedule", program); } void Application::loadSchedule(const std::string filename) diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 2ba425e4..018a26f7 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -137,6 +137,13 @@ envTmp(type, name, Ls, env().getGrid(Ls)) #define envTmpLat(...)\ MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__) +#define saveResult(ioStem, name, result)\ +if (env().getGrid()->IsBoss())\ +{\ + ResultWriter _writer(RESULT_FILE_NAME(ioStem));\ + write(_writer, name, result);\ +} + /****************************************************************************** * Module class * ******************************************************************************/ diff --git a/extras/Hadrons/Modules/MContraction/Baryon.hpp b/extras/Hadrons/Modules/MContraction/Baryon.hpp index 8966d95b..f3bf360d 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.hpp +++ b/extras/Hadrons/Modules/MContraction/Baryon.hpp @@ -122,7 +122,6 @@ void TBaryon::execute(void) << " quarks '" << par().q1 << "', '" << par().q2 << "', and '" << par().q3 << "'" << std::endl; - ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(PropagatorField1, par().q1); auto &q2 = envGet(PropagatorField2, par().q2); auto &q3 = envGet(PropagatorField3, par().q2); @@ -131,7 +130,7 @@ void TBaryon::execute(void) // FIXME: do contractions - // write(writer, "meson", result); + // saveResult(par().output, "meson", result); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp index 539abbbb..4a30963f 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp +++ b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp @@ -119,7 +119,6 @@ void TDiscLoop::execute(void) << "' using '" << par().q_loop << "' with " << par().gamma << " insertion." << std::endl; - ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q_loop = envGet(PropagatorField, par().q_loop); Gamma gamma(par().gamma); std::vector buf; @@ -128,15 +127,13 @@ void TDiscLoop::execute(void) envGetTmp(LatticeComplex, c); c = trace(gamma*q_loop); sliceSum(c, buf, Tp); - result.gamma = par().gamma; result.corr.resize(buf.size()); for (unsigned int t = 0; t < buf.size(); ++t) { result.corr[t] = TensorRemove(buf[t]); } - - write(writer, "disc", result); + saveResult(par().output, "disc", result); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp index b4327a13..b615cd7b 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp +++ b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp @@ -153,7 +153,6 @@ void TGamma3pt::execute(void) // Initialise variables. q2 and q3 are normal propagators, q1 may be // sink smeared. - ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(SlicedPropagator1, par().q1); auto &q2 = envGet(PropagatorField2, par().q2); auto &q3 = envGet(PropagatorField2, par().q3); @@ -175,8 +174,7 @@ void TGamma3pt::execute(void) { result.corr[t] = TensorRemove(buf[t]); } - - write(writer, "gamma3pt", result); + saveResult(par().output, "gamma3pt", result); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index 0197534d..5d27c526 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -172,7 +172,6 @@ void TMeson::execute(void) << " quarks '" << par().q1 << "' and '" << par().q2 << "'" << std::endl; - ResultWriter writer(RESULT_FILE_NAME(par().output)); std::vector buf; std::vector result; Gamma g5(Gamma::Algebra::Gamma5); @@ -239,7 +238,7 @@ void TMeson::execute(void) } } } - write(writer, "meson", result); + saveResult(par().output, "meson", result); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc index 1d257fc7..da1c877e 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc @@ -104,7 +104,6 @@ void TWeakHamiltonianEye::execute(void) << par().q2 << ", '" << par().q3 << "' and '" << par().q4 << "'." << std::endl; - ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(SlicedPropagator, par().q1); auto &q2 = envGet(PropagatorField, par().q2); auto &q3 = envGet(PropagatorField, par().q3); @@ -147,5 +146,6 @@ void TWeakHamiltonianEye::execute(void) SUM_MU(expbuf, E_body[mu]*E_loop[mu]) MAKE_DIAG(expbuf, corrbuf, result[E_diag], "HW_E") - write(writer, "HW_Eye", result); + // IO + saveResult(par().output, "HW_Eye", result); } diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc index 2ad2e7dc..e7824d33 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc @@ -104,7 +104,6 @@ void TWeakHamiltonianNonEye::execute(void) << par().q2 << ", '" << par().q3 << "' and '" << par().q4 << "'." << std::endl; - ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(PropagatorField, par().q1); auto &q2 = envGet(PropagatorField, par().q2); auto &q3 = envGet(PropagatorField, par().q3); @@ -144,5 +143,6 @@ void TWeakHamiltonianNonEye::execute(void) SUM_MU(expbuf, W_i_side_loop[mu]*W_f_side_loop[mu]) MAKE_DIAG(expbuf, corrbuf, result[W_diag], "HW_W") - write(writer, "HW_NonEye", result); + // IO + saveResult(par().output, "HW_NonEye", result); } diff --git a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc index 2c94b2ba..0b7a2cde 100644 --- a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc +++ b/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc @@ -104,7 +104,6 @@ void TWeakNeutral4ptDisc::execute(void) << par().q2 << ", '" << par().q3 << "' and '" << par().q4 << "'." << std::endl; - ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &q1 = envGet(PropagatorField, par().q1); auto &q2 = envGet(PropagatorField, par().q2); auto &q3 = envGet(PropagatorField, par().q3); @@ -138,5 +137,6 @@ void TWeakNeutral4ptDisc::execute(void) expbuf *= curr; MAKE_DIAG(expbuf, corrbuf, result[neut_disc_2_diag], "HW_disc0_2") - write(writer, "HW_disc0", result); + // IO + saveResult(par().output, "HW_disc0", result); } diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 1470f1ad..7d59ac3e 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -133,7 +133,6 @@ void TChargedProp::execute(void) LOG(Message) << "Saving zero-momentum projection to '" << filename << "'..." << std::endl; - ResultWriter writer(RESULT_FILE_NAME(par().output)); std::vector vecBuf; std::vector result; @@ -143,8 +142,8 @@ void TChargedProp::execute(void) { result[t] = TensorRemove(vecBuf[t]); } - write(writer, "charge", q); - write(writer, "prop", result); + saveResult(par().output, "charge", q); + saveResult(par().output, "prop", result); } } diff --git a/extras/Hadrons/Modules/MScalar/FreeProp.cc b/extras/Hadrons/Modules/MScalar/FreeProp.cc index ee86b9db..8d256e3c 100644 --- a/extras/Hadrons/Modules/MScalar/FreeProp.cc +++ b/extras/Hadrons/Modules/MScalar/FreeProp.cc @@ -83,8 +83,6 @@ void TFreeProp::execute(void) if (!par().output.empty()) { - TextWriter writer(par().output + "." + - std::to_string(vm().getTrajectory())); std::vector buf; std::vector result; @@ -94,6 +92,6 @@ void TFreeProp::execute(void) { result[t] = TensorRemove(buf[t]); } - write(writer, "prop", result); + saveResult(par().output, "freeprop", result); } } diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index 6680cd79..cab6e88c 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -151,11 +151,10 @@ void TDiv::execute(void) if (!par().output.empty()) { Result r; - ResultWriter writer(RESULT_FILE_NAME(par().output)); r.type = par().type; r.value = TensorRemove(sum(div)); - write(writer, "div", r); + saveResult(par().output, "div", r); } } diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp index 96eb794e..2858984c 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -120,7 +120,6 @@ void TTrMag::execute(void) << "..." << std::endl; std::vector result; - ResultWriter writer(RESULT_FILE_NAME(par().output)); auto &phi = envGet(Field, par().field); auto m2 = sum(phi), mn = m2; @@ -136,7 +135,7 @@ void TTrMag::execute(void) r.value = TensorRemove(trace(mn)).real(); result.push_back(r); } - write(writer, "trmag", result); + saveResult(par().output, "trmag", result); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index 4586663d..4b305128 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -162,9 +162,7 @@ void TTrPhi::execute(void) } if (result.size() > 0) { - ResultWriter writer(RESULT_FILE_NAME(par().output)); - - write(writer, "trphi", result); + saveResult(par().output, "trphi", result); } } diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index abfbf609..58570dd5 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -129,7 +129,6 @@ void TTwoPoint::execute(void) LOG(Message) << " '" << o << "'" << std::endl; } - ResultWriter writer(RESULT_FILE_NAME(par().output)); const unsigned int nd = env().getDim().size(); std::vector result; @@ -150,7 +149,7 @@ void TTwoPoint::execute(void) r.data = makeTwoPoint(slicedOp[i], slicedOp[j]); result.push_back(r); } - write(writer, "twopt", result); + saveResult(par().output, "twopt", result); } // make 2-pt function ////////////////////////////////////////////////////////// From cff3bae1557f90077ec67d56c96eb72f817bb273 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 25 Jan 2018 13:46:31 +0100 Subject: [PATCH 113/620] Adding support for general Nc in the benchmark outputs --- benchmarks/Benchmark_dwf.cc | 15 ++++++---- benchmarks/Benchmark_dwf_sweep.cc | 11 ++++--- benchmarks/Benchmark_gparity.cc | 6 ++-- benchmarks/Benchmark_wilson.cc | 13 ++++++-- benchmarks/Benchmark_wilson_sweep.cc | 45 ++++++++++++++++++++++------ 5 files changed, 66 insertions(+), 24 deletions(-) diff --git a/benchmarks/Benchmark_dwf.cc b/benchmarks/Benchmark_dwf.cc index 73621bbe..1d9de772 100644 --- a/benchmarks/Benchmark_dwf.cc +++ b/benchmarks/Benchmark_dwf.cc @@ -48,7 +48,6 @@ int main (int argc, char ** argv) int threads = GridThread::GetThreads(); - std::cout< latt4 = GridDefaultLatt(); int Ls=16; @@ -57,6 +56,10 @@ int main (int argc, char ** argv) std::stringstream ss(argv[i+1]); ss >> Ls; } + GridLogLayout(); + + long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc); + GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); @@ -187,7 +190,7 @@ int main (int argc, char ** argv) FGrid->Barrier(); double volume=Ls; for(int mu=0;muBarrier(); double volume=Ls; for(int mu=0;muBarrier(); double volume=Ls; for(int mu=0;mu & latt4, int Ls, int threads,int report ) GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); + long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc); std::vector seeds4({1,2,3,4}); std::vector seeds5({5,6,7,8}); @@ -196,7 +198,7 @@ void benchDw(std::vector & latt4, int Ls, int threads,int report ) if ( ! report ) { double volume=Ls; for(int mu=0;mu & latt4, int Ls, int threads,int report ) if(!report){ double volume=Ls; for(int mu=0;mu & latt4, int Ls, int threads,int report ) #define CHECK_SDW void benchsDw(std::vector & latt4, int Ls, int threads, int report ) { + long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc); GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(latt4, GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); @@ -321,7 +324,7 @@ void benchsDw(std::vector & latt4, int Ls, int threads, int report ) Counter.Report(); } else { double volume=Ls; for(int mu=0;mu & latt4, int Ls, int threads, int report ) CounterSdw.Report(); } else { double volume=Ls; for(int mu=0;muBarrier(); double volume=Ls; for(int mu=0;muBarrier(); double volume=Ls; for(int mu=0;mu latt_size = GridDefaultLatt(); std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); @@ -61,10 +64,15 @@ int main (int argc, char ** argv) GridRedBlackCartesian RBGrid(&Grid); int threads = GridThread::GetThreads(); - std::cout< seeds({1,2,3,4}); GridParallelRNG pRNG(&Grid); @@ -134,9 +142,10 @@ int main (int argc, char ** argv) Dw.Dhop(src,result,0); } double t1=usecond(); - double flops=1344*volume*ncall; + double flops=single_site_flops*volume*ncall; std::cout<()); WilsonFermionR Dw(Umu,Grid,RBGrid,mass,params); - + + // Full operator + bench_wilson(src,result,Dw,volume,DaggerNo); + bench_wilson(src,result,Dw,volume,DaggerYes); + std::cout << "\t"; + // EO bench_wilson(src,result,Dw,volume,DaggerNo); bench_wilson(src,result,Dw,volume,DaggerYes); std::cout << std::endl; @@ -122,9 +132,26 @@ void bench_wilson ( int const dag ) { int ncall = 1000; + long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc); double t0 = usecond(); for(int i=0; i Date: Fri, 26 Jan 2018 16:33:48 +0000 Subject: [PATCH 114/620] BROKEN: Adapted scalarVP, UnitEm and VPCounterTerms modules to new Hadrons. Currently getting an assertion error from Communicator_mpi3.cc when I try to run. --- extras/Hadrons/Modules/MGauge/UnitEm.cc | 4 +- extras/Hadrons/Modules/MGauge/UnitEm.hpp | 1 + extras/Hadrons/Modules/MScalar/ChargedProp.cc | 33 +- .../Hadrons/Modules/MScalar/ChargedProp.hpp | 3 +- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 327 ++++++++++-------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 24 +- .../Hadrons/Modules/MScalar/VPCounterTerms.cc | 180 +++++----- .../Modules/MScalar/VPCounterTerms.hpp | 7 +- extras/Hadrons/modules.inc | 2 +- 9 files changed, 292 insertions(+), 289 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index 747ef142..a19161ac 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -55,14 +55,14 @@ std::vector TUnitEm::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// void TUnitEm::setup(void) { - env().registerLattice(getName()); + envCreateLat(EmField, getName()); } // execution /////////////////////////////////////////////////////////////////// void TUnitEm::execute(void) { PhotonR photon(0, 0, 0); // Just chose arbitrary input values here - EmField &a = *env().createLattice(getName()); + auto &a = envGet(EmField, getName()); LOG(Message) << "Generating unit EM potential..." << std::endl; photon.UnitField(a); } diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.hpp b/extras/Hadrons/Modules/MGauge/UnitEm.hpp index ea910929..1df45d4a 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.hpp +++ b/extras/Hadrons/Modules/MGauge/UnitEm.hpp @@ -52,6 +52,7 @@ public: // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); +protected: // setup virtual void setup(void); // execution diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index ee215116..5e65c43e 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -145,16 +145,16 @@ void TChargedProp::execute(void) for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { std::vector mom = strToVec(par().outputMom[i_p]); - std::string filename = par().output + "_" + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]) - + "." + - std::to_string(vm().getTrajectory()); + std::string filename = par().output + "_" + + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]); - LOG(Message) << "Saving (" << par().outputMom[i_p] << ") momentum projection to '" - << filename << "'..." << std::endl; + LOG(Message) << "Saving (" << par().outputMom[i_p] + << ") momentum projection to '" << filename << "'..." + << std::endl; - std::vector result, result0, resultQ, resultSun, resultTad; + std::vector result, result0, resultQ, resultSun, resultTad; result.resize(env().getGrid()->_fdimensions[env().getNd()-1]); result0.resize(result.size()); resultQ.resize(result.size()); @@ -189,13 +189,13 @@ void TChargedProp::execute(void) peekSite(site, propTad, whichmom); resultTad[t]=TensorRemove(site); } - saveResult(par().output, "charge", q); - saveResult(par().output, "mass", par().mass); - saveResult(par().output, "prop", result); - saveResult(par().output, "prop_0", result0); - saveResult(par().output, "prop_Q", resultQ); - saveResult(par().output, "prop_Sun", resultSun); - saveResult(par().output, "prop_Tad", resultTad); + saveResult(filename, "charge", q); + saveResult(filename, "mass", par().mass); + saveResult(filename, "prop", result); + saveResult(filename, "prop_0", result0); + saveResult(filename, "prop_Q", resultQ); + saveResult(filename, "prop_Sun", resultSun); + saveResult(filename, "prop_Tad", resultTad); } } @@ -231,7 +231,8 @@ void TChargedProp::makeCaches(void) } if (!prop0Done_) { - LOG(Message) << "Caching position-space free scalar propagator..." << std::endl; + LOG(Message) << "Caching position-space free scalar propagator..." + << std::endl; fft.FFT_all_dim(prop0, GFSrc, FFT::backward); } if (!phasesDone_) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 9dd3ce31..3a711361 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -75,7 +75,8 @@ private: void momD1(ScalarField &s, FFT &fft); void momD2(ScalarField &s, FFT &fft); private: - bool freeMomPropDone_, GFSrcDone_, prop0Done_, phasesDone_; + bool freeMomPropDone_, GFSrcDone_, prop0Done_, + phasesDone_; std::string freeMomPropName_, GFSrcName_, prop0Name_, propQName_, propSunName_, propTadName_, fftName_; std::vector phaseName_; diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 93c51a77..9a6106eb 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -9,12 +9,15 @@ using namespace MScalar; /* * Scalar QED vacuum polarisation up to O(alpha) * + * Conserved vector 2-point function diagram notation: + * _______ + * / \ + * U_nu * * U_mu + * \_______/ * - * _______ - * / \ ( adj(S(a\hat{nu}|x)) U_mu(x) S(0|x+a\hat{mu}) U_nu(0) ) - * Diagram notation: U_nu * * U_mu = 2 Re( - ) - * \_______/ ( adj(S(a\hat{nu}|x+a\hat{mu})) adj(U_mu(x)) S(0|x) U_nu(0) ) - * + * ( adj(S(a\hat{nu}|x)) U_mu(x) S(0|x+a\hat{mu}) U_nu(0) ) + * = 2 Re( - ) + * ( adj(S(a\hat{nu}|x+a\hat{mu})) adj(U_mu(x)) S(0|x) U_nu(0) ) * * * _______ @@ -89,12 +92,13 @@ TScalarVP::TScalarVP(const std::string name) // dependencies/products /////////////////////////////////////////////////////// std::vector TScalarVP::getInput(void) { + prop0Name_ = par().scalarProp + "_0"; propQName_ = par().scalarProp + "_Q"; propSunName_ = par().scalarProp + "_Sun"; propTadName_ = par().scalarProp + "_Tad"; - std::vector in = {par().emField, propQName_, propSunName_, - propTadName_}; + std::vector in = {par().emField, prop0Name_, propQName_, + propSunName_, propTadName_}; return in; } @@ -105,7 +109,7 @@ std::vector TScalarVP::getOutput(void) for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - out.push_back(getName() + "_propQ_" + std::to_string(mu)); + // out.push_back(getName() + "_propQ_" + std::to_string(mu)); for (unsigned int nu = 0; nu < env().getNd(); ++nu) { @@ -120,14 +124,13 @@ std::vector TScalarVP::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// void TScalarVP::setup(void) { - freeMomPropName_ = FREEMOMPROP(static_cast(env().getModule(par().scalarProp))->par().mass); - GFSrcName_ = "_" + par().scalarProp + "_DinvSrc"; - prop0Name_ = par().scalarProp + "_0"; - + freeMomPropName_ = FREEMOMPROP(static_cast(vm().getModule(par().scalarProp))->par().mass); + GFSrcName_ = par().scalarProp + "_DinvSrc"; + fftName_ = par().scalarProp + "_fft"; phaseName_.clear(); muPropQName_.clear(); vpTensorName_.clear(); - + momPhaseName_.clear(); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { phaseName_.push_back("_shiftphase_" + std::to_string(mu)); @@ -141,109 +144,111 @@ void TScalarVP::setup(void) } vpTensorName_.push_back(vpTensorName_mu); } + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + momPhaseName_.push_back("_momentumphase_" + std::to_string(i_p)); + } + } for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - env().registerLattice(muPropQName_[mu]); + envCreateLat(ScalarField, muPropQName_[mu]); for (unsigned int nu = 0; nu < env().getNd(); ++nu) { - env().registerLattice(vpTensorName_[mu][nu]); + envCreateLat(ScalarField, vpTensorName_[mu][nu]); } } + if (!par().output.empty()) + { + momPhasesDone_ = env().hasCreatedObject(momPhaseName_[0]); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + envCacheLat(ScalarField, momPhaseName_[i_p]); + } + } + envTmpLat(ScalarField, "buf"); + envTmpLat(ScalarField, "result"); + envTmpLat(ScalarField, "Amu"); + envTmpLat(ScalarField, "Usnk"); + envTmpLat(ScalarField, "tmpProp"); } // execution /////////////////////////////////////////////////////////////////// void TScalarVP::execute(void) { - // Get objects cached by ChargedProp module - Complex ci(0.0,1.0); - FFT fft(env().getGrid()); - Real q = static_cast(env().getModule(par().scalarProp))->par().charge; + // CACHING ANALYTIC EXPRESSIONS + makeCaches(); - freeMomProp_ = env().getObject(freeMomPropName_); + Complex ci(0.0,1.0); + Real q = static_cast(vm().getModule(par().scalarProp))->par().charge; + auto &prop0 = envGet(ScalarField, prop0Name_); + auto &propQ = envGet(ScalarField, propQName_); + auto &propSun = envGet(ScalarField, propSunName_); + auto &propTad = envGet(ScalarField, propTadName_); + auto &GFSrc = envGet(ScalarField, GFSrcName_); + auto &G = envGet(ScalarField, freeMomPropName_); + auto &fft = envGet(FFT, fftName_); + phase_.clear(); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - phase_.push_back(env().getObject(phaseName_[mu])); + auto &phmu = envGet(ScalarField, phaseName_[mu]); + phase_.push_back(&phmu); } - GFSrc_ = env().getObject(GFSrcName_); - prop0_ = env().getObject(prop0Name_); - - // Propagator from unshifted source - ScalarField &propQ = *env().getObject(propQName_); - ScalarField &propSun = *env().getObject(propSunName_); - ScalarField &propTad = *env().getObject(propTadName_); - - // Propagators from shifted sources + + // PROPAGATORS FROM SHIFTED SOURCES LOG(Message) << "Computing O(q) charged scalar propagators..." << std::endl; - std::vector muPropQ; + std::vector muPropQ; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - muPropQ.push_back(*env().createLattice(muPropQName_[mu])); + auto &propmu = envGet(ScalarField, muPropQName_[mu]); // -G*momD1*G*F*tau_mu*Src (momD1 = F*D1*Finv) - muPropQ[mu] = adj(*phase_[mu])*(*GFSrc_); - momD1(muPropQ[mu], fft); - muPropQ[mu] = -(*freeMomProp_)*muPropQ[mu]; - fft.FFT_all_dim(muPropQ[mu], muPropQ[mu], FFT::backward); + propmu = adj(*phase_[mu])*GFSrc; + momD1(propmu, fft); + propmu = -G*propmu; + fft.FFT_all_dim(propmu, propmu, FFT::backward); + + muPropQ.push_back(&propmu); } // CONTRACTIONS - ScalarField prop1(env().getGrid()), prop2(env().getGrid()); - EmField &A = *env().getObject(par().emField); - ScalarField Amu(env().getGrid()), U_snk(env().getGrid()); - ScalarField tmp_vp1(env().getGrid()), tmp_vp2(env().getGrid()); - TComplex Anu0, U_src; + auto &A = envGet(EmField, par().emField); + envGetTmp(ScalarField, buf); + envGetTmp(ScalarField, result); + envGetTmp(ScalarField, Amu); + envGetTmp(ScalarField, Usnk); + envGetTmp(ScalarField, tmpProp); + TComplex Anu0, Usrc; std::vector coor0 = {0, 0, 0, 0}; - std::vector > vpTensor; + std::vector > vpTensor; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - std::vector vpTensor_mu; + std::vector vpTensor_mu; for (unsigned int nu = 0; nu < env().getNd(); ++nu) { - vpTensor_mu.push_back(*env().createLattice(vpTensorName_[mu][nu])); + auto &vpmunu = envGet(ScalarField, vpTensorName_[mu][nu]); + vpTensor_mu.push_back(&vpmunu); } vpTensor.push_back(vpTensor_mu); } - // Open output files if necessary - std::vector writer; - std::vector momphases; + // Prepare output files if necessary if (!par().output.empty()) { LOG(Message) << "Preparing output files..." << std::endl; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { std::vector mom = strToVec(par().outputMom[i_p]); - - // Open output files std::string filename = par().output + "_" + std::to_string(mom[0]) + std::to_string(mom[1]) - + std::to_string(mom[2]) + "." - + std::to_string(env().getTrajectory()); - - if (env().getGrid()->IsBoss()) - { - CorrWriter *writer_i = new CorrWriter(filename); - writer.push_back(writer_i); - - write(*writer[i_p], "charge", q); - write(*writer[i_p], "mass", static_cast(env().getModule(par().scalarProp))->par().mass); - } - - // Calculate phase factors - tmp_vp1 = Complex(1.0,0.0); - for (unsigned int j = 0; j < env().getNd()-1; ++j) - { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - tmp_vp1 = tmp_vp1*(*phase_[j]); - } - } - tmp_vp1 = adj(tmp_vp1); - momphases.push_back(tmp_vp1); + + std::to_string(mom[2]); + saveResult(filename, "charge", q); + saveResult(filename, "mass", static_cast(vm().getModule(par().scalarProp))->par().mass); } } @@ -259,142 +264,156 @@ void TScalarVP::execute(void) Amu = peekLorentz(A, mu); // free - prop1 = *prop0_; // S_0(0|x) - prop2 = Cshift(*prop0_, nu, -1); // S_0(0|x-a\hat{\nu}) + tmpProp = Cshift(prop0, nu, -1); // S_0(0|x-a\hat{\nu}) // = S_0(a\hat{\nu}|x) - U_src = Complex(1.0,0.0); - vpContraction(tmp_vp1, prop1, prop2, U_src, mu); - vpTensor[mu][nu] = tmp_vp1; + Usrc = Complex(1.0,0.0); + vpContraction(buf, prop0, tmpProp, Usrc, mu); + *vpTensor[mu][nu] = buf; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp1, momphases, + writeVP(buf, "Pi_free_"+std::to_string(mu)+"_"+std::to_string(nu)); } // srcT - tmp_vp2 = tmp_vp1 * (-0.5)*q*q*Anu0*Anu0; - vpTensor[mu][nu] += tmp_vp2; + result = buf * (-0.5)*q*q*Anu0*Anu0; + *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp2, momphases, + writeVP(result, "Pi_srcT_"+std::to_string(mu)+"_"+std::to_string(nu)); } // snkT - tmp_vp2 = tmp_vp1 * (-0.5)*q*q*Amu*Amu; - vpTensor[mu][nu] += tmp_vp2; + result = buf * (-0.5)*q*q*Amu*Amu; + *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp2, momphases, + writeVP(result, "Pi_snkT_"+std::to_string(mu)+"_"+std::to_string(nu)); } // S - prop1 = *prop0_; // S_0(0|x) - prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) - U_src = ci*q*Anu0; - U_snk = ci*q*Amu; - vpContraction(tmp_vp1, prop1, prop2, U_src, U_snk, mu); - vpTensor[mu][nu] += tmp_vp1; + tmpProp = Cshift(prop0, nu, -1); // S_0(a\hat{\nu}|x) + Usrc = ci*Anu0; + Usnk = ci*Amu; + vpContraction(result, prop0, tmpProp, Usrc, Usnk, mu); + result = q*q*result; + *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp1, momphases, + writeVP(result, "Pi_S_"+std::to_string(mu)+"_"+std::to_string(nu)); } // 4C - prop1 = q*propQ; // q*S_1(0|x) - prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) - U_src = Complex(1.0,0.0); - U_snk = ci*q*Amu; - vpContraction(tmp_vp1, prop1, prop2, U_src, U_snk, mu); - U_src = ci*q*Anu0; - vpContraction(tmp_vp2, prop1, prop2, U_src, mu); - tmp_vp1 += tmp_vp2; - prop1 = *prop0_; // S_0(0|x) - prop2 = q*muPropQ[nu]; // q*S_1(a\hat{\nu}|x) - vpContraction(tmp_vp2, prop1, prop2, U_src, mu); - tmp_vp1 += tmp_vp2; - U_src = Complex(1.0,0.0); - U_snk = ci*q*Amu; - vpContraction(tmp_vp2, prop1, prop2, U_src, U_snk, mu); - tmp_vp1 += tmp_vp2; - vpTensor[mu][nu] += tmp_vp1; + tmpProp = Cshift(prop0, nu, -1); // S_0(a\hat{\nu}|x) + Usrc = Complex(1.0,0.0); + Usnk = ci*Amu; + vpContraction(result, propQ, tmpProp, Usrc, Usnk, mu); + Usrc = ci*Anu0; + vpContraction(buf, propQ, tmpProp, Usrc, mu); + result += buf; + vpContraction(buf, prop0, *muPropQ[nu], Usrc, mu); + result += buf; + Usrc = Complex(1.0,0.0); + Usnk = ci*Amu; + vpContraction(buf, prop0, *muPropQ[nu], Usrc, Usnk, mu); + result += buf; + result = q*q*result; + *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp1, momphases, + writeVP(result, "Pi_4C_"+std::to_string(mu)+"_"+std::to_string(nu)); } // X - prop1 = q*propQ; // q*S_1(0|x) - prop2 = q*muPropQ[nu]; // q*S_1(a\hat{\nu}|x) - U_src = Complex(1.0,0.0); - vpContraction(tmp_vp1, prop1, prop2, U_src, mu); - vpTensor[mu][nu] += tmp_vp1; + Usrc = Complex(1.0,0.0); + vpContraction(result, propQ, *muPropQ[nu], Usrc, mu); + result = q*q*result; + *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp1, momphases, + writeVP(result, "Pi_X_"+std::to_string(mu)+"_"+std::to_string(nu)); } // 2E - prop1 = q*q*propSun; // q^2*S_\Sigma(0|x) - prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) - U_src = Complex(1.0,0.0); - vpContraction(tmp_vp1, prop1, prop2, U_src, mu); - prop1 = *prop0_; // S_0(0|x) - prop2 = q*q*Cshift(propSun, nu, -1); // q^2*S_\Sigma(0|x-a\hat{\nu}) + tmpProp = Cshift(prop0, nu, -1); // S_0(a\hat{\nu}|x) + Usrc = Complex(1.0,0.0); + vpContraction(result, propSun, tmpProp, Usrc, mu); + tmpProp = Cshift(propSun, nu, -1); // S_\Sigma(0|x-a\hat{\nu}) //(Note: = ) - vpContraction(tmp_vp2, prop1, prop2, U_src, mu); - tmp_vp1 += tmp_vp2; - vpTensor[mu][nu] += tmp_vp1; + vpContraction(buf, prop0, tmpProp, Usrc, mu); + result += buf; + result = q*q*result; + *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp1, momphases, + writeVP(result, "Pi_2E_"+std::to_string(mu)+"_"+std::to_string(nu)); } // 2T - prop1 = q*q*propTad; // q^2*S_T(0|x) - prop2 = Cshift(*prop0_, nu, -1); // S_0(a\hat{\nu}|x) - U_src = Complex(1.0,0.0); - vpContraction(tmp_vp1, prop1, prop2, U_src, mu); - prop1 = *prop0_; // S_0(0|x) - prop2 = q*q*Cshift(propTad, nu, -1); // q^2*S_T(0|x-a\hat{\nu}) - vpContraction(tmp_vp2, prop1, prop2, U_src, mu); - tmp_vp1 += tmp_vp2; - vpTensor[mu][nu] += tmp_vp1; + tmpProp = Cshift(prop0, nu, -1); // S_0(a\hat{\nu}|x) + Usrc = Complex(1.0,0.0); + vpContraction(result, propTad, tmpProp, Usrc, mu); + tmpProp = Cshift(propTad, nu, -1); // S_T(0|x-a\hat{\nu}) + vpContraction(buf, prop0, tmpProp, Usrc, mu); + result += buf; + result = q*q*result; + *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, tmp_vp1, momphases, + writeVP(result, "Pi_2T_"+std::to_string(mu)+"_"+std::to_string(nu)); } // Output full VP if necessary if (!par().output.empty()) { - writeVP(writer, vpTensor[mu][nu], momphases, + writeVP(*vpTensor[mu][nu], "Pi_"+std::to_string(mu)+"_"+std::to_string(nu)); } } } - if (!par().output.empty()) +} + +void TScalarVP::makeCaches(void) +{ + envGetTmp(ScalarField, buf); + + if ( (!par().output.empty()) && (!momPhasesDone_) ) { + LOG(Message) << "Caching phases for momentum projections..." + << std::endl; + std::vector &l = env().getGrid()->_fdimensions; + Complex ci(0.0,1.0); + + // Calculate phase factors for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - if (env().getGrid()->IsBoss()) + std::vector mom = strToVec(par().outputMom[i_p]); + auto &momph_ip = envGet(ScalarField, momPhaseName_[i_p]); + momph_ip = zero; + for (unsigned int j = 0; j < env().getNd()-1; ++j) { - delete writer[i_p]; + Real twoPiL = M_PI*2./l[j]; + LatticeCoordinate(buf, j); + buf = mom[j]*twoPiL*buf; + momph_ip = momph_ip + buf; } + momph_ip = exp(-ci*momph_ip); + momPhase_.push_back(&momph_ip); } } } @@ -419,38 +438,40 @@ void TScalarVP::vpContraction(ScalarField &vp, vp = 2.0*real(vp); } -void TScalarVP::writeVP(const std::vector &writers, const ScalarField &vp, - const std::vector &momphases, std::string dsetName) +void TScalarVP::writeVP(const ScalarField &vp, std::string dsetName) { std::vector vecBuf; std::vector result; - ScalarField vpPhase(env().getGrid()); + envGetTmp(ScalarField, buf); - for (unsigned int i_p = 0; i_p < momphases.size(); ++i_p) + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - vpPhase = vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); + std::vector mom = strToVec(par().outputMom[i_p]); + std::string filename = par().output + "_" + + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]); + buf = vp*(*momPhase_[i_p]); + sliceSum(buf, vecBuf, Tp); result.resize(vecBuf.size()); for (unsigned int t = 0; t < vecBuf.size(); ++t) { result[t] = TensorRemove(vecBuf[t]); } - if (env().getGrid()->IsBoss()) - { - write(*writers[i_p], dsetName, result); - } + saveResult(filename, dsetName, result); } } void TScalarVP::momD1(ScalarField &s, FFT &fft) { - EmField &A = *env().getObject(par().emField); - ScalarField buf(env().getGrid()), result(env().getGrid()), - Amu(env().getGrid()); + auto &A = envGet(EmField, par().emField); Complex ci(0.0,1.0); - result = zero; + envGetTmp(ScalarField, buf); + envGetTmp(ScalarField, result); + envGetTmp(ScalarField, Amu); + result = zero; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { Amu = peekLorentz(A, mu); diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 564a7f39..fe351f05 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -8,7 +8,7 @@ BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * ScalarVP * + * Scalar vacuum polarisation * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalar) @@ -36,11 +36,13 @@ public: // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); +protected: // setup virtual void setup(void); // execution virtual void execute(void); private: + void makeCaches(void); // conserved vector two-point contraction void vpContraction(ScalarField &vp, ScalarField &prop_0_x, ScalarField &prop_nu_x, @@ -50,22 +52,22 @@ private: ScalarField &prop_0_x, ScalarField &prop_nu_x, TComplex u_src, int mu); // write momentum-projected vacuum polarisation to file(s) - void writeVP(const std::vector &writers, - const ScalarField &vp, - const std::vector &momphases, - std::string dsetName); + void writeVP(const ScalarField &vp, std::string dsetName); // momentum-space Delta_1 insertion void momD1(ScalarField &s, FFT &fft); private: + bool momPhasesDone_; std::string freeMomPropName_, GFSrcName_, prop0Name_, propQName_, - propSunName_, propTadName_; - std::vector phaseName_, muPropQName_; + propSunName_, propTadName_, + fftName_; + std::vector phaseName_, muPropQName_, + momPhaseName_; std::vector > vpTensorName_; - ScalarField *freeMomProp_, *GFSrc_, - *prop0_; - std::vector phase_; - EmField *A; + // ScalarField *freeMomProp_, *GFSrc_, + // *prop0_; + std::vector phase_, momPhase_; + // EmField *A; }; MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc index 17dd1abe..284b3f6c 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc @@ -37,39 +37,58 @@ void TVPCounterTerms::setup(void) { phaseName_.push_back("_shiftphase_" + std::to_string(mu)); } - GFSrcName_ = "_" + getName() + "_DinvSrc"; - phatsqName_ = "_" + getName() + "_pHatSquared"; + GFSrcName_ = getName() + "_DinvSrc"; + phatsqName_ = getName() + "_pHatSquared"; prop0Name_ = getName() + "_freeProp"; twoscalarName_ = getName() + "_2scalarProp"; twoscalarVertexName_ = getName() + "_2scalarProp_withvertex"; psquaredName_ = getName() + "_psquaredProp"; - env().registerLattice(freeMomPropName_); + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + momPhaseName_.push_back("_momentumphase_" + std::to_string(i_p)); + } + } + + envCreateLat(ScalarField, freeMomPropName_); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - env().registerLattice(phaseName_[mu]); + envCreateLat(ScalarField, phaseName_[mu]); } - env().registerLattice(phatsqName_); - env().registerLattice(GFSrcName_); - env().registerLattice(prop0Name_); - env().registerLattice(twoscalarName_); - env().registerLattice(twoscalarVertexName_); - env().registerLattice(psquaredName_); + envCreateLat(ScalarField, phatsqName_); + envCreateLat(ScalarField, GFSrcName_); + envCreateLat(ScalarField, prop0Name_); + envCreateLat(ScalarField, twoscalarName_); + envCreateLat(ScalarField, twoscalarVertexName_); + envCreateLat(ScalarField, psquaredName_); + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + envCacheLat(ScalarField, momPhaseName_[i_p]); + } + } + envTmpLat(ScalarField, "buf"); + envTmpLat(ScalarField, "tmp_vp"); + envTmpLat(ScalarField, "vpPhase"); } // execution /////////////////////////////////////////////////////////////////// void TVPCounterTerms::execute(void) { - ScalarField &source = *env().getObject(par().source); + auto &source = envGet(ScalarField, par().source); Complex ci(0.0,1.0); FFT fft(env().getGrid()); - ScalarField buf(env().getGrid()), tmp_vp(env().getGrid()); + envGetTmp(ScalarField, buf); + envGetTmp(ScalarField, tmp_vp); // Momentum-space free scalar propagator - ScalarField &G = *env().createLattice(freeMomPropName_); + auto &G = envGet(ScalarField, freeMomPropName_); SIMPL::MomentumSpacePropagator(G, par().mass); // Phases and hat{p}^2 - ScalarField &phatsq = *env().createLattice(phatsqName_); + auto &phatsq = envGet(ScalarField, phatsqName_); std::vector &l = env().getGrid()->_fdimensions; LOG(Message) << "Calculating shift phases..." << std::endl; @@ -77,28 +96,29 @@ void TVPCounterTerms::execute(void) for (unsigned int mu = 0; mu < env().getNd(); ++mu) { Real twoPiL = M_PI*2./l[mu]; - - phase_.push_back(env().createLattice(phaseName_[mu])); + auto &phmu = envGet(ScalarField, phaseName_[mu]); + LatticeCoordinate(buf, mu); - *(phase_[mu]) = exp(ci*twoPiL*buf); + phmu = exp(ci*twoPiL*buf); + phase_.push_back(&phmu); buf = 2.*sin(.5*twoPiL*buf); phatsq = phatsq + buf*buf; } // G*F*src - ScalarField &GFSrc = *env().createLattice(GFSrcName_); + auto &GFSrc = envGet(ScalarField, GFSrcName_); fft.FFT_all_dim(GFSrc, source, FFT::forward); GFSrc = G*GFSrc; // Position-space free scalar propagator - ScalarField &prop0 = *env().createLattice(prop0Name_); + auto &prop0 = envGet(ScalarField, prop0Name_); prop0 = GFSrc; fft.FFT_all_dim(prop0, prop0, FFT::backward); // Propagators for counter-terms - ScalarField &twoscalarProp = *env().createLattice(twoscalarName_); - ScalarField &twoscalarVertexProp = *env().createLattice(twoscalarVertexName_); - ScalarField &psquaredProp = *env().createLattice(psquaredName_); + auto &twoscalarProp = envGet(ScalarField, twoscalarName_); + auto &twoscalarVertexProp = envGet(ScalarField, twoscalarVertexName_); + auto &psquaredProp = envGet(ScalarField, psquaredName_); twoscalarProp = G*GFSrc; fft.FFT_all_dim(twoscalarProp, twoscalarProp, FFT::backward); @@ -115,12 +135,7 @@ void TVPCounterTerms::execute(void) psquaredProp = G*phatsq*GFSrc; fft.FFT_all_dim(psquaredProp, psquaredProp, FFT::backward); - // Open output files if necessary - std::vector vecBuf; - std::vector result; - ScalarField vpPhase(env().getGrid()); - std::vector writer; - std::vector momphases; + // Prepare output files if necessary if (!par().output.empty()) { LOG(Message) << "Preparing output files..." << std::endl; @@ -131,29 +146,21 @@ void TVPCounterTerms::execute(void) // Open output files std::string filename = par().output + "_" + std::to_string(mom[0]) + std::to_string(mom[1]) - + std::to_string(mom[2]) - + "." + - std::to_string(env().getTrajectory()); - - if (env().getGrid()->IsBoss()) - { - CorrWriter *writer_i = new CorrWriter(filename); - writer.push_back(writer_i); - - write(*writer[i_p], "mass", par().mass); - } + + std::to_string(mom[2]); + saveResult(filename, "mass", par().mass); // Calculate phase factors - vpPhase = Complex(1.0,0.0); + auto &momph_ip = envGet(ScalarField, momPhaseName_[i_p]); + momph_ip = Complex(1.0,0.0); for (unsigned int j = 0; j < env().getNd()-1; ++j) { for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) { - vpPhase = vpPhase*(*phase_[j]); + momph_ip = momph_ip*(*phase_[j]); } } - vpPhase = adj(vpPhase); - momphases.push_back(vpPhase); + momph_ip = adj(momph_ip); + momPhase_.push_back(&momph_ip); } } @@ -171,22 +178,7 @@ void TVPCounterTerms::execute(void) // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writer[i_p], - "NoVertex_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(tmp_vp, "NoVertex_"+std::to_string(mu)+"_"+std::to_string(nu)); } // Three-scalar loop (tadpole vertex) @@ -197,22 +189,7 @@ void TVPCounterTerms::execute(void) // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writer[i_p], - "TadVertex_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } + writeVP(tmp_vp, "TadVertex_"+std::to_string(mu)+"_"+std::to_string(nu)); } // Three-scalar loop (hat{p}^2 insertion) @@ -223,35 +200,32 @@ void TVPCounterTerms::execute(void) // Output if necessary if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - vpPhase = tmp_vp*momphases[i_p]; - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - if (env().getGrid()->IsBoss()) - { - write(*writer[i_p], - "pSquaredInsertion_"+std::to_string(mu)+"_"+std::to_string(nu), - result); - } - } - } - } - } - - // Close output files if necessary - if (!par().output.empty()) - { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - if (env().getGrid()->IsBoss()) - { - delete writer[i_p]; + writeVP(tmp_vp, "pSquaredInsertion_"+std::to_string(mu)+"_"+std::to_string(nu)); } } } } + +void TVPCounterTerms::writeVP(const ScalarField &vp, std::string dsetName) +{ + std::vector vecBuf; + std::vector result; + envGetTmp(ScalarField, vpPhase); + + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + std::vector mom = strToVec(par().outputMom[i_p]); + std::string filename = par().output + "_" + + std::to_string(mom[0]) + + std::to_string(mom[1]) + + std::to_string(mom[2]); + vpPhase = vp*(*momPhase_[i_p]); + sliceSum(vpPhase, vecBuf, Tp); + result.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + result[t] = TensorRemove(vecBuf[t]); + } + saveResult(filename, dsetName, result); + } +} diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp index 6bd6db8e..634206a6 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -34,16 +34,19 @@ public: // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); +protected: // setup virtual void setup(void); // execution virtual void execute(void); +private: + void writeVP(const ScalarField &vp, std::string dsetName); private: std::string freeMomPropName_, GFSrcName_, phatsqName_, prop0Name_, twoscalarName_, twoscalarVertexName_, psquaredName_, psquaredVertexName_; - std::vector phaseName_; - std::vector phase_; + std::vector phaseName_, momPhaseName_; + std::vector phase_, momPhase_; }; MODULE_REGISTER_NS(VPCounterTerms, TVPCounterTerms, MScalar); diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index c149e520..9f642c5b 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -10,7 +10,7 @@ modules_cc =\ Modules/MScalar/ChargedProp.cc \ Modules/MScalar/FreeProp.cc \ Modules/MScalar/ScalarVP.cc \ - Modules/MScalar/VPCounterTerms.cc + Modules/MScalar/VPCounterTerms.cc \ Modules/MIO/LoadNersc.cc modules_hpp =\ From cdf550845fe96e73c8ca5192e4d86d158507eace Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 26 Jan 2018 21:25:20 +0000 Subject: [PATCH 115/620] QedFVol: Fix bugs in StochEm.cc and ChargedProp.cc (still only works without MPI). --- extras/Hadrons/Modules/MGauge/StochEm.cc | 8 ++-- extras/Hadrons/Modules/MGauge/StochEm.hpp | 2 + extras/Hadrons/Modules/MScalar/ChargedProp.cc | 40 ++++++++--------- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 43 +++++++++++-------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 3 +- 5 files changed, 51 insertions(+), 45 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index cea60e84..1c59edee 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -57,10 +57,8 @@ std::vector TStochEm::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// void TStochEm::setup(void) { - if (!env().hasCreatedObject("_" + getName() + "_weight")) - { - envCacheLat(EmComp, "_" + getName() + "_weight"); - } + weightDone_ = env().hasCreatedObject("_" + getName() + "_weight"); + envCacheLat(EmComp, "_" + getName() + "_weight"); envCreateLat(EmField, getName()); } @@ -73,7 +71,7 @@ void TStochEm::execute(void) auto &a = envGet(EmField, getName()); auto &w = envGet(EmComp, "_" + getName() + "_weight"); - if (!env().hasCreatedObject("_" + getName() + "_weight")) + if (!weightDone_) { LOG(Message) << "Caching stochastic EM potential weight (gauge: " << par().gauge << ", zero-mode scheme: " diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index e3e059de..fa1b6f42 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -66,6 +66,8 @@ protected: virtual void setup(void); // execution virtual void execute(void); +private: + bool weightDone_; }; MODULE_REGISTER_NS(StochEm, TStochEm, MGauge); diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 5e65c43e..206734ce 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -117,26 +117,25 @@ void TChargedProp::execute(void) envGetTmp(ScalarField, buf); // -G*momD1*G*F*Src (momD1 = F*D1*Finv) - buf = GFSrc; - momD1(buf, fft); - buf = -G*buf; - fft.FFT_dim(propQ, buf, env().getNd()-1, FFT::backward); + propQ = GFSrc; + momD1(propQ, fft); + propQ = -G*propQ; + propSun = -propQ; + fft.FFT_dim(propQ, propQ, env().getNd()-1, FFT::backward); // G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) - buf = -buf; - momD1(buf, fft); - propSun = G*buf; + momD1(propSun, fft); + propSun = G*propSun; fft.FFT_dim(propSun, propSun, env().getNd()-1, FFT::backward); // -G*momD2*G*F*Src (momD2 = F*D2*Finv) - buf = GFSrc; - momD2(buf, fft); - buf = -G*buf; - fft.FFT_dim(propTad, buf, env().getNd()-1, FFT::backward); + propTad = GFSrc; + momD2(propTad, fft); + propTad = -G*propTad; + fft.FFT_dim(propTad, propTad, env().getNd()-1, FFT::backward); // full charged scalar propagator - buf = GFSrc; - fft.FFT_dim(buf, buf, env().getNd()-1, FFT::backward); + fft.FFT_dim(buf, GFSrc, env().getNd()-1, FFT::backward); prop = buf + q*propQ + q*q*propSun + q*q*propTad; // OUTPUT IF NECESSARY @@ -189,13 +188,14 @@ void TChargedProp::execute(void) peekSite(site, propTad, whichmom); resultTad[t]=TensorRemove(site); } - saveResult(filename, "charge", q); - saveResult(filename, "mass", par().mass); - saveResult(filename, "prop", result); - saveResult(filename, "prop_0", result0); - saveResult(filename, "prop_Q", resultQ); - saveResult(filename, "prop_Sun", resultSun); - saveResult(filename, "prop_Tad", resultTad); + ResultWriter writer(RESULT_FILE_NAME(filename)); + write(writer, "charge", q); + write(writer, "mass", par().mass); + write(writer, "prop", result); + write(writer, "prop_0", result0); + write(writer, "prop_Q", resultQ); + write(writer, "prop_Sun", resultSun); + write(writer, "prop_Tad", resultTad); } } diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 9a6106eb..6be00fd8 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -236,7 +236,8 @@ void TScalarVP::execute(void) vpTensor.push_back(vpTensor_mu); } - // Prepare output files if necessary + // Open output files if necessary + std::vector writer; if (!par().output.empty()) { LOG(Message) << "Preparing output files..." << std::endl; @@ -247,8 +248,10 @@ void TScalarVP::execute(void) + std::to_string(mom[0]) + std::to_string(mom[1]) + std::to_string(mom[2]); - saveResult(filename, "charge", q); - saveResult(filename, "mass", static_cast(vm().getModule(par().scalarProp))->par().mass); + ResultWriter *writer_i = new ResultWriter(RESULT_FILE_NAME(filename)); + writer.push_back(writer_i); + write(*writer_i, "charge", q); + write(*writer_i, "mass", static_cast(vm().getModule(par().scalarProp))->par().mass); } } @@ -272,7 +275,7 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(buf, + writeVP(writer, buf, "Pi_free_"+std::to_string(mu)+"_"+std::to_string(nu)); } @@ -282,7 +285,7 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(result, + writeVP(writer, result, "Pi_srcT_"+std::to_string(mu)+"_"+std::to_string(nu)); } @@ -292,7 +295,7 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(result, + writeVP(writer, result, "Pi_snkT_"+std::to_string(mu)+"_"+std::to_string(nu)); } @@ -306,7 +309,7 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(result, + writeVP(writer, result, "Pi_S_"+std::to_string(mu)+"_"+std::to_string(nu)); } @@ -329,7 +332,7 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(result, + writeVP(writer, result, "Pi_4C_"+std::to_string(mu)+"_"+std::to_string(nu)); } @@ -341,7 +344,7 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(result, + writeVP(writer, result, "Pi_X_"+std::to_string(mu)+"_"+std::to_string(nu)); } @@ -358,7 +361,7 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(result, + writeVP(writer, result, "Pi_2E_"+std::to_string(mu)+"_"+std::to_string(nu)); } @@ -374,18 +377,25 @@ void TScalarVP::execute(void) // Output if necessary if (!par().output.empty()) { - writeVP(result, + writeVP(writer, result, "Pi_2T_"+std::to_string(mu)+"_"+std::to_string(nu)); } // Output full VP if necessary if (!par().output.empty()) { - writeVP(*vpTensor[mu][nu], + writeVP(writer, *vpTensor[mu][nu], "Pi_"+std::to_string(mu)+"_"+std::to_string(nu)); } } } + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + delete writer[i_p]; + } + } } void TScalarVP::makeCaches(void) @@ -438,7 +448,7 @@ void TScalarVP::vpContraction(ScalarField &vp, vp = 2.0*real(vp); } -void TScalarVP::writeVP(const ScalarField &vp, std::string dsetName) +void TScalarVP::writeVP(std::vector &writer, const ScalarField &vp, std::string dsetName) { std::vector vecBuf; std::vector result; @@ -446,11 +456,6 @@ void TScalarVP::writeVP(const ScalarField &vp, std::string dsetName) for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - std::vector mom = strToVec(par().outputMom[i_p]); - std::string filename = par().output + "_" - + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]); buf = vp*(*momPhase_[i_p]); sliceSum(buf, vecBuf, Tp); result.resize(vecBuf.size()); @@ -458,7 +463,7 @@ void TScalarVP::writeVP(const ScalarField &vp, std::string dsetName) { result[t] = TensorRemove(vecBuf[t]); } - saveResult(filename, dsetName, result); + write(*writer[i_p], dsetName, result); } } diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index fe351f05..0839f654 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -52,7 +52,8 @@ private: ScalarField &prop_0_x, ScalarField &prop_nu_x, TComplex u_src, int mu); // write momentum-projected vacuum polarisation to file(s) - void writeVP(const ScalarField &vp, std::string dsetName); + void writeVP(std::vector &writer, const ScalarField &vp, + std::string dsetName); // momentum-space Delta_1 insertion void momD1(ScalarField &s, FFT &fft); private: From 507c4e9efcaa4ae7deb42d6cc7268bf04ff8734b Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Sat, 27 Jan 2018 10:59:55 +0100 Subject: [PATCH 116/620] Correcting an missing semicolumn in avx512 --- lib/simd/Grid_avx512.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/simd/Grid_avx512.h b/lib/simd/Grid_avx512.h index 85d27421..cce77a58 100644 --- a/lib/simd/Grid_avx512.h +++ b/lib/simd/Grid_avx512.h @@ -556,7 +556,7 @@ namespace Optimization { v3 = _mm256_add_epi32(v1, v2); v1 = _mm256_hadd_epi32(v3, v3); v2 = _mm256_hadd_epi32(v1, v1); - u1 = _mm256_castsi256_si128(v2) // upper half + u1 = _mm256_castsi256_si128(v2); // upper half u2 = _mm256_extracti128_si256(v2, 1); // lower half ret = _mm_add_epi32(u1, u2); return _mm_cvtsi128_si32(ret); From 4e0cf0cc286934821eaa333e2b1f640fb54e2b66 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Sat, 27 Jan 2018 15:15:25 +0000 Subject: [PATCH 117/620] QedFVol: Fix bug in ScalarVP.cc due to double use of temporary object. Still getting mpi3 errors when configured with enable-comms=mpi[-auto]. --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index 6be00fd8..a5e00ee0 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -270,17 +270,19 @@ void TScalarVP::execute(void) tmpProp = Cshift(prop0, nu, -1); // S_0(0|x-a\hat{\nu}) // = S_0(a\hat{\nu}|x) Usrc = Complex(1.0,0.0); - vpContraction(buf, prop0, tmpProp, Usrc, mu); - *vpTensor[mu][nu] = buf; + vpContraction(result, prop0, tmpProp, Usrc, mu); + *vpTensor[mu][nu] = result; // Output if necessary if (!par().output.empty()) { - writeVP(writer, buf, + writeVP(writer, result, "Pi_free_"+std::to_string(mu)+"_"+std::to_string(nu)); } + tmpProp = result; // Just using tmpProp as a temporary ScalarField + // here (buf is modified by calls to writeVP()) // srcT - result = buf * (-0.5)*q*q*Anu0*Anu0; + result = tmpProp * (-0.5)*q*q*Anu0*Anu0; *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) @@ -290,7 +292,7 @@ void TScalarVP::execute(void) } // snkT - result = buf * (-0.5)*q*q*Amu*Amu; + result = tmpProp * (-0.5)*q*q*Amu*Amu; *vpTensor[mu][nu] += result; // Output if necessary if (!par().output.empty()) From 655a69259a76b844ab06a2e78fbe8a0441dbf774 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Sun, 28 Jan 2018 17:02:46 +0100 Subject: [PATCH 118/620] Added support for GCC compilation for Skylake AVX512 --- configure.ac | 3 +++ lib/qcd/action/fermion/CayleyFermion5Dvec.cc | 4 ++-- lib/qcd/action/fermion/DomainWallEOFAFermionvec.cc | 2 +- lib/qcd/action/fermion/MobiusEOFAFermionvec.cc | 2 +- lib/simd/Intel512avx.h | 2 +- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 468d9d5f..3a6a2960 100644 --- a/configure.ac +++ b/configure.ac @@ -249,6 +249,9 @@ case ${ax_cv_cxx_compiler_vendor} in AVX512) AC_DEFINE([AVX512],[1],[AVX512 intrinsics]) SIMD_FLAGS='-mavx512f -mavx512pf -mavx512er -mavx512cd';; + SKL) + AC_DEFINE([AVX512],[1],[AVX512 intrinsics for SkyLake Xeon]) + SIMD_FLAGS='-march=skylake-avx512';; KNC) AC_DEFINE([IMCI],[1],[IMCI intrinsics for Knights Corner]) SIMD_FLAGS='';; diff --git a/lib/qcd/action/fermion/CayleyFermion5Dvec.cc b/lib/qcd/action/fermion/CayleyFermion5Dvec.cc index 653e6ab3..2b2eace7 100644 --- a/lib/qcd/action/fermion/CayleyFermion5Dvec.cc +++ b/lib/qcd/action/fermion/CayleyFermion5Dvec.cc @@ -469,7 +469,7 @@ void CayleyFermion5D::MooeeInternalAsm(const FermionField &psi, FermionFie } a0 = a0+incr; a1 = a1+incr; - a2 = a2+sizeof(Simd::scalar_type); + a2 = a2+sizeof(typename Simd::scalar_type); }} { int lexa = s1+LLs*site; @@ -701,7 +701,7 @@ void CayleyFermion5D::MooeeInternalZAsm(const FermionField &psi, FermionFi } a0 = a0+incr; a1 = a1+incr; - a2 = a2+sizeof(Simd::scalar_type); + a2 = a2+sizeof(typename Simd::scalar_type); }} { int lexa = s1+LLs*site; diff --git a/lib/qcd/action/fermion/DomainWallEOFAFermionvec.cc b/lib/qcd/action/fermion/DomainWallEOFAFermionvec.cc index 81ce448c..c95172a5 100644 --- a/lib/qcd/action/fermion/DomainWallEOFAFermionvec.cc +++ b/lib/qcd/action/fermion/DomainWallEOFAFermionvec.cc @@ -475,7 +475,7 @@ namespace QCD { } a0 = a0 + incr; a1 = a1 + incr; - a2 = a2 + sizeof(Simd::scalar_type); + a2 = a2 + sizeof(typename Simd::scalar_type); } } diff --git a/lib/qcd/action/fermion/MobiusEOFAFermionvec.cc b/lib/qcd/action/fermion/MobiusEOFAFermionvec.cc index c4eaf0f3..290ba158 100644 --- a/lib/qcd/action/fermion/MobiusEOFAFermionvec.cc +++ b/lib/qcd/action/fermion/MobiusEOFAFermionvec.cc @@ -853,7 +853,7 @@ namespace QCD { a0 = a0 + incr; a1 = a1 + incr; - a2 = a2 + sizeof(Simd::scalar_type); + a2 = a2 + sizeof(typename Simd::scalar_type); } } diff --git a/lib/simd/Intel512avx.h b/lib/simd/Intel512avx.h index 7b5964ad..def37b9b 100644 --- a/lib/simd/Intel512avx.h +++ b/lib/simd/Intel512avx.h @@ -79,7 +79,7 @@ Author: paboyle #define ZEND2f(Criir,Ciirr, tmp) "vshufps $0xb1," #Ciirr "," #Ciirr "," #tmp ";\n"\ "vsubps " #tmp "," #Ciirr "," #Criir"{%k7}" ";\n" -#define ZEND1d(Criir,Ciirr, tmp) "vshufpd $0x55," #Criir "," #Criir "," #tmp ";\n"\ +#define ZEND1d(Criir,Ciirr, tmp) "vshufpd $0x55," #Criir "," #Criir "," #tmp ";\n"\ "vaddps " #tmp "," #Criir "," #Criir"{%k6}" ";\n" #define ZEND2d(Criir,Ciirr, tmp) "vshufpd $0x55," #Ciirr "," #Ciirr "," #tmp ";\n"\ From fb24e3a7d24abb2bcdef4c85711ce0d25319a153 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 29 Jan 2018 11:11:45 +0100 Subject: [PATCH 119/620] Adding utilities for perf profiling --- benchmarks/Benchmark_wilson.cc | 24 +++++++++++- lib/util/Profiling.h | 72 ++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 lib/util/Profiling.h diff --git a/benchmarks/Benchmark_wilson.cc b/benchmarks/Benchmark_wilson.cc index d1499a76..754051f0 100644 --- a/benchmarks/Benchmark_wilson.cc +++ b/benchmarks/Benchmark_wilson.cc @@ -4,7 +4,7 @@ Source file: ./benchmarks/Benchmark_wilson.cc - Copyright (C) 2015 + Copyright (C) 2018 Author: Peter Boyle Author: paboyle @@ -32,6 +32,9 @@ using namespace std; using namespace Grid; using namespace Grid::QCD; + +#include "Grid/util/Profiling.h" + template struct scal { d internal; @@ -45,6 +48,7 @@ struct scal { }; bool overlapComms = false; +bool perfProfiling = false; int main (int argc, char ** argv) { @@ -53,6 +57,9 @@ int main (int argc, char ** argv) if( GridCmdOptionExists(argv,argv+argc,"--asynch") ){ overlapComms = true; } + if( GridCmdOptionExists(argv,argv+argc,"--perf") ){ + perfProfiling = true; + } long unsigned int single_site_flops = 8*QCD::Nc*(7+16*QCD::Nc); @@ -144,6 +151,21 @@ int main (int argc, char ** argv) double t1=usecond(); double flops=single_site_flops*volume*ncall; + if (perfProfiling){ + std::cout< + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ + +#ifndef GRID_PERF_PROFILING_H +#define GRID_PERF_PROFILING_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct System +{ + static void profile(const std::string& name,std::function body) { + std::string filename = name.find(".data") == std::string::npos ? (name + ".data") : name; + + // Launch profiler + pid_t pid; + std::stringstream s; + s << getpid(); + pid = fork(); + if (pid == 0) { + auto fd=open("/dev/null",O_RDWR); + dup2(fd,1); + dup2(fd,2); + exit(execl("/usr/bin/perf","perf","record","-o",filename.c_str(),"-p",s.str().c_str(),nullptr)); + } + + // Run body + body(); + + // Kill profiler + kill(pid,SIGINT); + waitpid(pid,nullptr,0); + } + + static void profile(std::function body) { + profile("perf.data",body); + } +}; + +#endif // GRID_PERF_PROFILING_H \ No newline at end of file From cd44e851f1021db5f895a4caf409c885b35d7bd9 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 30 Jan 2018 06:04:30 +0100 Subject: [PATCH 120/620] Fixing compilation error in FundtoHirep --- extras/Hadrons/Modules/MGauge/FundtoHirep.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc index f15a3b7c..31c5a34d 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc @@ -57,7 +57,7 @@ std::vector TFundtoHirep::getOutput(void) template void TFundtoHirep::setup(void) { - env().template registerLattice(getName()); + envCreateLat(typename Rep::LatticeField, getName()); } // execution /////////////////////////////////////////////////////////////////// @@ -70,6 +70,6 @@ void TFundtoHirep::execute(void) Rep TargetRepresentation(U._grid); TargetRepresentation.update_representation(U); - typename Rep::LatticeField &URep = *env().template createLattice(getName()); + auto &URep = envGet(typename Rep::LatticeField, getName()); URep = TargetRepresentation.U; } From 53bffb83d453080fe5dd16fb5601d16a94997d87 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 30 Jan 2018 12:42:36 +0100 Subject: [PATCH 121/620] Updating README with new SKL target --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13dd6996..5a92cdec 100644 --- a/README.md +++ b/README.md @@ -187,10 +187,11 @@ Alternatively, some CPU codenames can be directly used: | `` | Description | | ----------- | -------------------------------------- | | `KNL` | [Intel Xeon Phi codename Knights Landing](http://ark.intel.com/products/codename/48999/Knights-Landing) | +| `SKL` | [Intel Skylake with AVX512 extensions](https://ark.intel.com/products/codename/37572/Skylake#@server) | | `BGQ` | Blue Gene/Q | #### Notes: -- We currently support AVX512 only for the Intel compiler. Support for GCC and clang will appear in future versions of Grid when the AVX512 support within GCC and clang will be more advanced. +- We currently support AVX512 for the Intel compiler and GCC (SKL target). Support for clang will appear in future versions of Grid when the AVX512 support in the compiler will be more advanced. - For BG/Q only [bgclang](http://trac.alcf.anl.gov/projects/llvm-bgq) is supported. We do not presently plan to support more compilers for this platform. - BG/Q performances are currently rather poor. This is being investigated for future versions. - The vector size for the `GEN` target can be specified with the `configure` script option `--enable-gen-simd-width`. From f0fcdf75b5b7c6be03224a50b1157170e441b3b5 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 30 Jan 2018 12:44:20 +0100 Subject: [PATCH 122/620] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a92cdec..86506f52 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,7 @@ Alternatively, some CPU codenames can be directly used: | `BGQ` | Blue Gene/Q | #### Notes: -- We currently support AVX512 for the Intel compiler and GCC (SKL target). Support for clang will appear in future versions of Grid when the AVX512 support in the compiler will be more advanced. +- We currently support AVX512 for the Intel compiler and GCC (KNL and SKL target). Support for clang will appear in future versions of Grid when the AVX512 support in the compiler will be more advanced. - For BG/Q only [bgclang](http://trac.alcf.anl.gov/projects/llvm-bgq) is supported. We do not presently plan to support more compilers for this platform. - BG/Q performances are currently rather poor. This is being investigated for future versions. - The vector size for the `GEN` target can be specified with the `configure` script option `--enable-gen-simd-width`. From ac3b0ebc58cbccac051134a06c20686e20c241fd Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 1 Feb 2018 12:31:32 +0000 Subject: [PATCH 123/620] QedFVol: New structure for ChargedProp output files --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 83 ++++++++----------- .../Hadrons/Modules/MScalar/ChargedProp.hpp | 20 +++++ 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 206734ce..5f49c06e 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -114,7 +114,7 @@ void TChargedProp::execute(void) auto &G = envGet(ScalarField, freeMomPropName_); auto &fft = envGet(FFT, fftName_); double q = par().charge; - envGetTmp(ScalarField, buf); + envGetTmp(ScalarField, buf); // -G*momD1*G*F*Src (momD1 = F*D1*Finv) propQ = GFSrc; @@ -141,62 +141,52 @@ void TChargedProp::execute(void) // OUTPUT IF NECESSARY if (!par().output.empty()) { + Result result; + TComplex site; + std::vector siteCoor; + + LOG(Message) << "Saving momentum-projected propagator to '" + << RESULT_FILE_NAME(par().output) << "'..." + << std::endl; + result.projection.resize(par().outputMom.size()); + result.lattice_size = env().getGrid()->_fdimensions; + result.mass = par().mass; + result.charge = q; + siteCoor.resize(env().getNd()); for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - std::vector mom = strToVec(par().outputMom[i_p]); - std::string filename = par().output + "_" - + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]); + result.projection[i_p].momentum = strToVec(par().outputMom[i_p]); - LOG(Message) << "Saving (" << par().outputMom[i_p] - << ") momentum projection to '" << filename << "'..." - << std::endl; + LOG(Message) << "Calculating (" << par().outputMom[i_p] + << ") momentum projection" << std::endl; - std::vector result, result0, resultQ, resultSun, resultTad; - result.resize(env().getGrid()->_fdimensions[env().getNd()-1]); - result0.resize(result.size()); - resultQ.resize(result.size()); - resultSun.resize(result.size()); - resultTad.resize(result.size()); - - TComplex site; - std::vector whichmom; - whichmom.resize(env().getNd()); + result.projection[i_p].corr_0.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + result.projection[i_p].corr.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + result.projection[i_p].corr_Q.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + result.projection[i_p].corr_Sun.resize(env().getGrid()->_fdimensions[env().getNd()-1]); + result.projection[i_p].corr_Tad.resize(env().getGrid()->_fdimensions[env().getNd()-1]); for (unsigned int j = 0; j < env().getNd()-1; ++j) { - whichmom[j] = mom[j]; + siteCoor[j] = result.projection[i_p].momentum[j]; } - for (unsigned int t = 0; t < result.size(); ++t) + for (unsigned int t = 0; t < result.projection[i_p].corr.size(); ++t) { - whichmom[env().getNd()-1] = t; - // Write full propagator - peekSite(site, prop, whichmom); - result[t]=TensorRemove(site); - // Write free propagator - peekSite(site, buf, whichmom); - result0[t]=TensorRemove(site); - // Write propagator O(q) term - peekSite(site, propQ, whichmom); - resultQ[t]=TensorRemove(site); - // Write propagator sunset term - peekSite(site, propSun, whichmom); - resultSun[t]=TensorRemove(site); - // Write propagator tadpole term - peekSite(site, propTad, whichmom); - resultTad[t]=TensorRemove(site); + siteCoor[env().getNd()-1] = t; + peekSite(site, prop, siteCoor); + result.projection[i_p].corr[t]=TensorRemove(site); + peekSite(site, buf, siteCoor); + result.projection[i_p].corr_0[t]=TensorRemove(site); + peekSite(site, propQ, siteCoor); + result.projection[i_p].corr_Q[t]=TensorRemove(site); + peekSite(site, propSun, siteCoor); + result.projection[i_p].corr_Sun[t]=TensorRemove(site); + peekSite(site, propTad, siteCoor); + result.projection[i_p].corr_Tad[t]=TensorRemove(site); } - ResultWriter writer(RESULT_FILE_NAME(filename)); - write(writer, "charge", q); - write(writer, "mass", par().mass); - write(writer, "prop", result); - write(writer, "prop_0", result0); - write(writer, "prop_Q", resultQ); - write(writer, "prop_Sun", resultSun); - write(writer, "prop_Tad", resultTad); } + saveResult(par().output, "prop", result); } std::vector mask(env().getNd(),1); @@ -222,9 +212,8 @@ void TChargedProp::makeCaches(void) } if (!GFSrcDone_) { - FFT fft(env().getGrid()); auto &source = envGet(ScalarField, par().source); - + LOG(Message) << "Caching G*F*src..." << std::endl; fft.FFT_all_dim(GFSrc, source, FFT::forward); GFSrc = freeMomProp*GFSrc; diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 3a711361..810ebcaa 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -57,6 +57,26 @@ public: SCALAR_TYPE_ALIASES(SIMPL,); typedef PhotonR::GaugeField EmField; typedef PhotonR::GaugeLinkField EmComp; + class Projection: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Projection, + std::vector, momentum, + std::vector, corr, + std::vector, corr_0, + std::vector, corr_Q, + std::vector, corr_Sun, + std::vector, corr_Tad); + }; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::vector, lattice_size, + double, mass, + double, charge, + std::vector, projection); + }; public: // constructor TChargedProp(const std::string name); From 5f85473d6b04bc60feae1475798c9f13b4ea92d1 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 1 Feb 2018 12:46:39 +0000 Subject: [PATCH 124/620] QedFVol: Move Projection class into Result class --- .../Hadrons/Modules/MScalar/ChargedProp.hpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 810ebcaa..baa8c20f 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -57,20 +57,20 @@ public: SCALAR_TYPE_ALIASES(SIMPL,); typedef PhotonR::GaugeField EmField; typedef PhotonR::GaugeLinkField EmComp; - class Projection: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Projection, - std::vector, momentum, - std::vector, corr, - std::vector, corr_0, - std::vector, corr_Q, - std::vector, corr_Sun, - std::vector, corr_Tad); - }; class Result: Serializable { public: + class Projection: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Projection, + std::vector, momentum, + std::vector, corr, + std::vector, corr_0, + std::vector, corr_Q, + std::vector, corr_Sun, + std::vector, corr_Tad); + }; GRID_SERIALIZABLE_CLASS_MEMBERS(Result, std::vector, lattice_size, double, mass, From 896f3a8002b3116380e2293cf3ecca350c34ce5d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 1 Feb 2018 18:51:51 +0000 Subject: [PATCH 125/620] Fix to MPI for Hokusai system --- lib/communicator/SharedMemoryMPI.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index d7bd7c65..2a62b7ac 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -182,6 +182,7 @@ void GlobalSharedMemory::OptimalCommunicator(const std::vector &processors, #ifdef GRID_MPI3_SHMMMAP void GlobalSharedMemory::SharedMemoryAllocate(uint64_t bytes, int flags) { + std::cout << "SharedMemoryAllocate "<< bytes<< " MMAP implementation "< improvements = strToVec(par().improvement); + PhotonR photon(par().gauge, par().zmScheme, improvements); auto &a = envGet(EmField, getName()); auto &w = envGet(EmComp, "_" + getName() + "_weight"); diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index fa1b6f42..11519b52 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -45,7 +45,7 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(StochEmPar, PhotonR::Gauge, gauge, PhotonR::ZmScheme, zmScheme, - Integer, improvement); + std::string, improvement); }; class TStochEm: public Module diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index a19161ac..e23840f5 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -61,7 +61,7 @@ void TUnitEm::setup(void) // execution /////////////////////////////////////////////////////////////////// void TUnitEm::execute(void) { - PhotonR photon(0, 0, 0); // Just chose arbitrary input values here + PhotonR photon(0, 0, std::vector()); // Just chose arbitrary input values here auto &a = envGet(EmField, getName()); LOG(Message) << "Generating unit EM potential..." << std::endl; photon.UnitField(a); diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index e0329bed..d91a9980 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -60,7 +60,7 @@ namespace QCD{ GRID_SERIALIZABLE_ENUM(Gauge, undef, feynman, 1, coulomb, 2, landau, 3); GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2); public: - Photon(Gauge gauge, ZmScheme zmScheme, Integer improvement); + Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements); virtual ~Photon(void) = default; void FreePropagator(const GaugeField &in, GaugeField &out); void MomentumSpacePropagator(const GaugeField &in, GaugeField &out); @@ -75,14 +75,14 @@ namespace QCD{ private: Gauge gauge_; ZmScheme zmScheme_; - Integer improvement_; + std::vector improvement_; }; typedef Photon PhotonR; template - Photon::Photon(Gauge gauge, ZmScheme zmScheme, Integer improvement) - : gauge_(gauge), zmScheme_(zmScheme), improvement_(improvement) + Photon::Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements) + : gauge_(gauge), zmScheme_(zmScheme), improvement_(improvements) {} template @@ -157,29 +157,11 @@ namespace QCD{ out = where(spNrm == Integer(0), 0.*out, out); // IR improvement - switch (improvement_) + for(int i = 0; i < improvement_.size(); i++) { - case 0: - break; - case 1: - { - Real f1 = sqrt(2.48560548); - out = where(spNrm == Integer(1), f1*out, out); - break; - } - case 2: - { - Real f1 = sqrt(4.93053406); - Real f2 = sqrt(-1.44492857); - out = where(spNrm == Integer(1), f1*out, out); - out = where(spNrm == Integer(2), f2*out, out); - break; - } - default: - break; + Real f = sqrt(improvement_[i]+1); + out = where(spNrm == Integer(i+1), f*out, out); } - - break; } default: break; From b6fe03eb26a8725d4f52d3215104ea9743c071b0 Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Fri, 2 Feb 2018 15:29:38 +0000 Subject: [PATCH 127/620] BugFix: Now the stochatic EM potential weight is generated when calling for the first time --- extras/Hadrons/Modules/MGauge/StochEm.cc | 6 ++++-- extras/Hadrons/Modules/MGauge/StochEm.hpp | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index 21b7f626..cfbd28ef 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -57,9 +57,11 @@ std::vector TStochEm::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// void TStochEm::setup(void) { + create_weight = false; if (!env().hasCreatedObject("_" + getName() + "_weight")) { envCacheLat(EmComp, "_" + getName() + "_weight"); + create_weight = true; } envCreateLat(EmField, getName()); } @@ -67,13 +69,13 @@ void TStochEm::setup(void) // execution /////////////////////////////////////////////////////////////////// void TStochEm::execute(void) { - LOG(Message) << "Generating stochatic EM potential..." << std::endl; + LOG(Message) << "Generating stochastic EM potential..." << std::endl; PhotonR photon(par().gauge, par().zmScheme); auto &a = envGet(EmField, getName()); auto &w = envGet(EmComp, "_" + getName() + "_weight"); - if (!env().hasCreatedObject("_" + getName() + "_weight")) + if (create_weight) { LOG(Message) << "Caching stochatic EM potential weight (gauge: " << par().gauge << ", zero-mode scheme: " diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index 87b70880..05162443 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -60,6 +60,8 @@ public: // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); +private: + bool create_weight; protected: // setup virtual void setup(void); From c5b23c367e86a96605b2048c8f27d05e6d7066aa Mon Sep 17 00:00:00 2001 From: James Harrison Date: Mon, 5 Feb 2018 11:46:33 +0000 Subject: [PATCH 128/620] QedFVol: Fix segmentation fault when multiple propagator modules are used. --- extras/Hadrons/Modules/MScalar/ChargedProp.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/extras/Hadrons/Modules/MScalar/ChargedProp.cc index 5f49c06e..88c3dffd 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.cc @@ -240,6 +240,14 @@ void TChargedProp::makeCaches(void) phase_.push_back(&phmu); } } + else + { + phase_.clear(); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + phase_.push_back(env().getObject(phaseName_[mu])); + } + } } void TChargedProp::momD1(ScalarField &s, FFT &fft) From 594a262dcc911c5df344ffe0837a91779ddeaaed Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 7 Feb 2018 11:37:01 +0000 Subject: [PATCH 129/620] QedFVol: Remove redundant file Communicator_mpi.cc --- lib/communicator/Communicator_mpi.cc | 251 --------------------------- 1 file changed, 251 deletions(-) delete mode 100644 lib/communicator/Communicator_mpi.cc diff --git a/lib/communicator/Communicator_mpi.cc b/lib/communicator/Communicator_mpi.cc deleted file mode 100644 index e123aaa4..00000000 --- a/lib/communicator/Communicator_mpi.cc +++ /dev/null @@ -1,251 +0,0 @@ - /************************************************************************************* - - Grid physics library, www.github.com/paboyle/Grid - - Source file: ./lib/communicator/Communicator_mpi.cc - - Copyright (C) 2015 - -Author: Peter Boyle - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ -#include -#include -#include -#include - -namespace Grid { - - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// Info that is setup once and indept of cartesian layout -/////////////////////////////////////////////////////////////////////////////////////////////////// -MPI_Comm CartesianCommunicator::communicator_world; - -// Should error check all MPI calls. -void CartesianCommunicator::Init(int *argc, char ***argv) { - int flag; - int provided; - MPI_Initialized(&flag); // needed to coexist with other libs apparently - if ( !flag ) { - MPI_Init_thread(argc,argv,MPI_THREAD_MULTIPLE,&provided); - if ( provided != MPI_THREAD_MULTIPLE ) { - QCD::WilsonKernelsStatic::Comms = QCD::WilsonKernelsStatic::CommsThenCompute; - } - } - MPI_Comm_dup (MPI_COMM_WORLD,&communicator_world); - ShmInitGeneric(); -} - -CartesianCommunicator::~CartesianCommunicator() -{ - // int MPI_is_finalised; - // MPI_Finalized(&MPI_is_finalised); - if (communicator && !MPI::Is_finalized()) - MPI_Comm_free(&communicator); -} - -void CartesianCommunicator::GlobalSum(uint32_t &u){ - int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); - assert(ierr==0); -} -void CartesianCommunicator::GlobalSum(uint64_t &u){ - int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT64_T,MPI_SUM,communicator); - assert(ierr==0); -} -void CartesianCommunicator::GlobalXOR(uint32_t &u){ - int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_BXOR,communicator); - assert(ierr==0); -} -void CartesianCommunicator::GlobalXOR(uint64_t &u){ - int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT64_T,MPI_BXOR,communicator); - assert(ierr==0); -} -void CartesianCommunicator::GlobalSum(float &f){ - int ierr=MPI_Allreduce(MPI_IN_PLACE,&f,1,MPI_FLOAT,MPI_SUM,communicator); - assert(ierr==0); -} -void CartesianCommunicator::GlobalSumVector(float *f,int N) -{ - int ierr=MPI_Allreduce(MPI_IN_PLACE,f,N,MPI_FLOAT,MPI_SUM,communicator); - assert(ierr==0); -} -void CartesianCommunicator::GlobalSum(double &d) -{ - int ierr = MPI_Allreduce(MPI_IN_PLACE,&d,1,MPI_DOUBLE,MPI_SUM,communicator); - assert(ierr==0); -} -void CartesianCommunicator::GlobalSumVector(double *d,int N) -{ - int ierr = MPI_Allreduce(MPI_IN_PLACE,d,N,MPI_DOUBLE,MPI_SUM,communicator); - assert(ierr==0); -} -void CartesianCommunicator::ShiftedRanks(int dim,int shift,int &source,int &dest) -{ - int ierr=MPI_Cart_shift(communicator,dim,shift,&source,&dest); - assert(ierr==0); -} -int CartesianCommunicator::RankFromProcessorCoor(std::vector &coor) -{ - int rank; - int ierr=MPI_Cart_rank (communicator, &coor[0], &rank); - assert(ierr==0); - return rank; -} -void CartesianCommunicator::ProcessorCoorFromRank(int rank, std::vector &coor) -{ - coor.resize(_ndimension); - int ierr=MPI_Cart_coords (communicator, rank, _ndimension,&coor[0]); - assert(ierr==0); -} - -// Basic Halo comms primitive -void CartesianCommunicator::SendToRecvFrom(void *xmit, - int dest, - void *recv, - int from, - int bytes) -{ - std::vector reqs(0); - SendToRecvFromBegin(reqs,xmit,dest,recv,from,bytes); - SendToRecvFromComplete(reqs); -} - -void CartesianCommunicator::SendRecvPacket(void *xmit, - void *recv, - int sender, - int receiver, - int bytes) -{ - MPI_Status stat; - assert(sender != receiver); - int tag = sender; - if ( _processor == sender ) { - MPI_Send(xmit, bytes, MPI_CHAR,receiver,tag,communicator); - } - if ( _processor == receiver ) { - MPI_Recv(recv, bytes, MPI_CHAR,sender,tag,communicator,&stat); - } -} - -// Basic Halo comms primitive -void CartesianCommunicator::SendToRecvFromBegin(std::vector &list, - void *xmit, - int dest, - void *recv, - int from, - int bytes) -{ - int myrank = _processor; - int ierr; - if ( CommunicatorPolicy == CommunicatorPolicyConcurrent ) { - MPI_Request xrq; - MPI_Request rrq; - - ierr =MPI_Irecv(recv, bytes, MPI_CHAR,from,from,communicator,&rrq); - ierr|=MPI_Isend(xmit, bytes, MPI_CHAR,dest,_processor,communicator,&xrq); - - assert(ierr==0); - list.push_back(xrq); - list.push_back(rrq); - } else { - // Give the CPU to MPI immediately; can use threads to overlap optionally - ierr=MPI_Sendrecv(xmit,bytes,MPI_CHAR,dest,myrank, - recv,bytes,MPI_CHAR,from, from, - communicator,MPI_STATUS_IGNORE); - assert(ierr==0); - } -} -void CartesianCommunicator::SendToRecvFromComplete(std::vector &list) -{ - if ( CommunicatorPolicy == CommunicatorPolicyConcurrent ) { - int nreq=list.size(); - std::vector status(nreq); - int ierr = MPI_Waitall(nreq,&list[0],&status[0]); - assert(ierr==0); - } -} - -void CartesianCommunicator::Barrier(void) -{ - int ierr = MPI_Barrier(communicator); - assert(ierr==0); -} - -void CartesianCommunicator::Broadcast(int root,void* data, int bytes) -{ - int ierr=MPI_Bcast(data, - bytes, - MPI_BYTE, - root, - communicator); - assert(ierr==0); -} -void CartesianCommunicator::AllToAll(int dim,void *in,void *out,uint64_t words,uint64_t bytes) -{ - std::vector row(_ndimension,1); - assert(dim>=0 && dim<_ndimension); - - // Split the communicator - row[dim] = _processors[dim]; - - CartesianCommunicator Comm(row,*this); - Comm.AllToAll(in,out,words,bytes); -} -void CartesianCommunicator::AllToAll(void *in,void *out,uint64_t words,uint64_t bytes) -{ - // MPI is a pain and uses "int" arguments - // 64*64*64*128*16 == 500Million elements of data. - // When 24*4 bytes multiples get 50x 10^9 >>> 2x10^9 Y2K bug. - // (Turns up on 32^3 x 64 Gparity too) - MPI_Datatype object; - int iwords; - int ibytes; - iwords = words; - ibytes = bytes; - assert(words == iwords); // safe to cast to int ? - assert(bytes == ibytes); // safe to cast to int ? - MPI_Type_contiguous(ibytes,MPI_BYTE,&object); - MPI_Type_commit(&object); - MPI_Alltoall(in,iwords,object,out,iwords,object,communicator); - MPI_Type_free(&object); -} - /////////////////////////////////////////////////////// - // Should only be used prior to Grid Init finished. - // Check for this? - /////////////////////////////////////////////////////// -int CartesianCommunicator::RankWorld(void){ - int r; - MPI_Comm_rank(communicator_world,&r); - return r; -} -void CartesianCommunicator::BroadcastWorld(int root,void* data, int bytes) -{ - int ierr= MPI_Bcast(data, - bytes, - MPI_BYTE, - root, - communicator_world); - assert(ierr==0); -} - - - -} - From 9f202782c5da060acc337e247434ed74a916b2cc Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 7 Feb 2018 20:31:50 +0000 Subject: [PATCH 130/620] QedFVol: Change format of scalar VP output files, and save diagrams without charge factors for consistency with ChargedProp module. --- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 171 ++++++++++++-------- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 31 +++- 2 files changed, 129 insertions(+), 73 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index a5e00ee0..fdb9586e 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -236,22 +236,38 @@ void TScalarVP::execute(void) vpTensor.push_back(vpTensor_mu); } - // Open output files if necessary - std::vector writer; + // Prepare output data structure if necessary + Result outputData; if (!par().output.empty()) { - LOG(Message) << "Preparing output files..." << std::endl; + outputData.projection.resize(par().outputMom.size()); + outputData.lattice_size = env().getGrid()->_fdimensions; + outputData.mass = static_cast(vm().getModule(par().scalarProp))->par().mass; + outputData.charge = q; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - std::vector mom = strToVec(par().outputMom[i_p]); - std::string filename = par().output + "_" - + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]); - ResultWriter *writer_i = new ResultWriter(RESULT_FILE_NAME(filename)); - writer.push_back(writer_i); - write(*writer_i, "charge", q); - write(*writer_i, "mass", static_cast(vm().getModule(par().scalarProp))->par().mass); + outputData.projection[i_p].momentum = strToVec(par().outputMom[i_p]); + outputData.projection[i_p].pi.resize(env().getNd()); + outputData.projection[i_p].pi_free.resize(env().getNd()); + outputData.projection[i_p].pi_2E.resize(env().getNd()); + outputData.projection[i_p].pi_2T.resize(env().getNd()); + outputData.projection[i_p].pi_S.resize(env().getNd()); + outputData.projection[i_p].pi_4C.resize(env().getNd()); + outputData.projection[i_p].pi_X.resize(env().getNd()); + outputData.projection[i_p].pi_srcT.resize(env().getNd()); + outputData.projection[i_p].pi_snkT.resize(env().getNd()); + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + outputData.projection[i_p].pi[nu].resize(env().getNd()); + outputData.projection[i_p].pi_free[nu].resize(env().getNd()); + outputData.projection[i_p].pi_2E[nu].resize(env().getNd()); + outputData.projection[i_p].pi_2T[nu].resize(env().getNd()); + outputData.projection[i_p].pi_S[nu].resize(env().getNd()); + outputData.projection[i_p].pi_4C[nu].resize(env().getNd()); + outputData.projection[i_p].pi_X[nu].resize(env().getNd()); + outputData.projection[i_p].pi_srcT[nu].resize(env().getNd()); + outputData.projection[i_p].pi_snkT[nu].resize(env().getNd()); + } } } @@ -272,33 +288,42 @@ void TScalarVP::execute(void) Usrc = Complex(1.0,0.0); vpContraction(result, prop0, tmpProp, Usrc, mu); *vpTensor[mu][nu] = result; - // Output if necessary + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_free_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_free[mu][nu], result, + i_p); + } } tmpProp = result; // Just using tmpProp as a temporary ScalarField // here (buf is modified by calls to writeVP()) // srcT - result = tmpProp * (-0.5)*q*q*Anu0*Anu0; - *vpTensor[mu][nu] += result; - // Output if necessary + result = tmpProp * (-0.5)*Anu0*Anu0; + *vpTensor[mu][nu] += q*q*result; + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_srcT_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_srcT[mu][nu], result, + i_p); + } } // snkT - result = tmpProp * (-0.5)*q*q*Amu*Amu; - *vpTensor[mu][nu] += result; - // Output if necessary + result = tmpProp * (-0.5)*Amu*Amu; + *vpTensor[mu][nu] += q*q*result; + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_snkT_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_snkT[mu][nu], result, + i_p); + } } // S @@ -306,13 +331,15 @@ void TScalarVP::execute(void) Usrc = ci*Anu0; Usnk = ci*Amu; vpContraction(result, prop0, tmpProp, Usrc, Usnk, mu); - result = q*q*result; - *vpTensor[mu][nu] += result; - // Output if necessary + *vpTensor[mu][nu] += q*q*result; + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_S_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_S[mu][nu], result, + i_p); + } } // 4C @@ -329,25 +356,29 @@ void TScalarVP::execute(void) Usnk = ci*Amu; vpContraction(buf, prop0, *muPropQ[nu], Usrc, Usnk, mu); result += buf; - result = q*q*result; - *vpTensor[mu][nu] += result; - // Output if necessary + *vpTensor[mu][nu] += q*q*result; + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_4C_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_4C[mu][nu], result, + i_p); + } } // X Usrc = Complex(1.0,0.0); vpContraction(result, propQ, *muPropQ[nu], Usrc, mu); - result = q*q*result; - *vpTensor[mu][nu] += result; - // Output if necessary + *vpTensor[mu][nu] += q*q*result; + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_X_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_X[mu][nu], result, + i_p); + } } // 2E @@ -358,13 +389,15 @@ void TScalarVP::execute(void) //(Note: = ) vpContraction(buf, prop0, tmpProp, Usrc, mu); result += buf; - result = q*q*result; - *vpTensor[mu][nu] += result; - // Output if necessary + *vpTensor[mu][nu] += q*q*result; + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_2E_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_2E[mu][nu], result, + i_p); + } } // 2T @@ -374,29 +407,36 @@ void TScalarVP::execute(void) tmpProp = Cshift(propTad, nu, -1); // S_T(0|x-a\hat{\nu}) vpContraction(buf, prop0, tmpProp, Usrc, mu); result += buf; - result = q*q*result; - *vpTensor[mu][nu] += result; - // Output if necessary + *vpTensor[mu][nu] += q*q*result; + // Do momentum projections if necessary if (!par().output.empty()) { - writeVP(writer, result, - "Pi_2T_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi_2T[mu][nu], result, + i_p); + } } - // Output full VP if necessary + // Do momentum projections of full VP if necessary if (!par().output.empty()) { - writeVP(writer, *vpTensor[mu][nu], - "Pi_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pi[mu][nu], + *vpTensor[mu][nu], i_p); + } } } } + + // OUTPUT IF NECESSARY if (!par().output.empty()) { - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) - { - delete writer[i_p]; - } + LOG(Message) << "Saving momentum-projected HVP to '" + << RESULT_FILE_NAME(par().output) << "'..." + << std::endl; + saveResult(par().output, "HVP", outputData); } } @@ -450,22 +490,17 @@ void TScalarVP::vpContraction(ScalarField &vp, vp = 2.0*real(vp); } -void TScalarVP::writeVP(std::vector &writer, const ScalarField &vp, std::string dsetName) +void TScalarVP::project(std::vector &projection, const ScalarField &vp, int i_p) { std::vector vecBuf; - std::vector result; envGetTmp(ScalarField, buf); - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + buf = vp*(*momPhase_[i_p]); + sliceSum(buf, vecBuf, Tp); + projection.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) { - buf = vp*(*momPhase_[i_p]); - sliceSum(buf, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - write(*writer[i_p], dsetName, result); + projection[t] = TensorRemove(vecBuf[t]); } } diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 0839f654..8e18f80e 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -28,6 +28,30 @@ public: SCALAR_TYPE_ALIASES(SIMPL,); typedef PhotonR::GaugeField EmField; typedef PhotonR::GaugeLinkField EmComp; + class Result: Serializable + { + public: + class Projection: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Projection, + std::vector, momentum, + std::vector>>, pi, + std::vector>>, pi_free, + std::vector>>, pi_2E, + std::vector>>, pi_2T, + std::vector>>, pi_S, + std::vector>>, pi_4C, + std::vector>>, pi_X, + std::vector>>, pi_srcT, + std::vector>>, pi_snkT); + }; + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::vector, lattice_size, + double, mass, + double, charge, + std::vector, projection); + }; public: // constructor TScalarVP(const std::string name); @@ -52,8 +76,8 @@ private: ScalarField &prop_0_x, ScalarField &prop_nu_x, TComplex u_src, int mu); // write momentum-projected vacuum polarisation to file(s) - void writeVP(std::vector &writer, const ScalarField &vp, - std::string dsetName); + void project(std::vector &projection, const ScalarField &vp, + int i_p); // momentum-space Delta_1 insertion void momD1(ScalarField &s, FFT &fft); private: @@ -65,10 +89,7 @@ private: std::vector phaseName_, muPropQName_, momPhaseName_; std::vector > vpTensorName_; - // ScalarField *freeMomProp_, *GFSrc_, - // *prop0_; std::vector phase_, momPhase_; - // EmField *A; }; MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); From 315f1146cd9acad43a571a6a081a724e0d372278 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Thu, 8 Feb 2018 20:40:45 +0000 Subject: [PATCH 131/620] QedFVol: Fix output of VPCounterTerms module. --- .../Hadrons/Modules/MScalar/VPCounterTerms.cc | 129 +++++++++--------- .../Modules/MScalar/VPCounterTerms.hpp | 19 ++- 2 files changed, 83 insertions(+), 65 deletions(-) diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc index 284b3f6c..b3393679 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc @@ -41,7 +41,6 @@ void TVPCounterTerms::setup(void) phatsqName_ = getName() + "_pHatSquared"; prop0Name_ = getName() + "_freeProp"; twoscalarName_ = getName() + "_2scalarProp"; - twoscalarVertexName_ = getName() + "_2scalarProp_withvertex"; psquaredName_ = getName() + "_psquaredProp"; if (!par().output.empty()) { @@ -60,7 +59,6 @@ void TVPCounterTerms::setup(void) envCreateLat(ScalarField, GFSrcName_); envCreateLat(ScalarField, prop0Name_); envCreateLat(ScalarField, twoscalarName_); - envCreateLat(ScalarField, twoscalarVertexName_); envCreateLat(ScalarField, psquaredName_); if (!par().output.empty()) { @@ -117,49 +115,44 @@ void TVPCounterTerms::execute(void) // Propagators for counter-terms auto &twoscalarProp = envGet(ScalarField, twoscalarName_); - auto &twoscalarVertexProp = envGet(ScalarField, twoscalarVertexName_); auto &psquaredProp = envGet(ScalarField, psquaredName_); twoscalarProp = G*GFSrc; fft.FFT_all_dim(twoscalarProp, twoscalarProp, FFT::backward); - twoscalarVertexProp = zero; - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - buf = GFSrc; - twoscalarVertexProp = twoscalarVertexProp + .5*((*phase_[mu]) + adj(*phase_[mu]))*buf; - } - twoscalarVertexProp = G*twoscalarVertexProp; - fft.FFT_all_dim(twoscalarVertexProp, twoscalarVertexProp, FFT::backward); - psquaredProp = G*phatsq*GFSrc; fft.FFT_all_dim(psquaredProp, psquaredProp, FFT::backward); - // Prepare output files if necessary + // Prepare output data structure if necessary + Result outputData; if (!par().output.empty()) { - LOG(Message) << "Preparing output files..." << std::endl; + outputData.projection.resize(par().outputMom.size()); + outputData.lattice_size = env().getGrid()->_fdimensions; + outputData.mass = par().mass; for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) { - std::vector mom = strToVec(par().outputMom[i_p]); - - // Open output files - std::string filename = par().output + "_" + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]); - saveResult(filename, "mass", par().mass); - + outputData.projection[i_p].momentum = strToVec(par().outputMom[i_p]); + outputData.projection[i_p].twoScalar.resize(env().getNd()); + outputData.projection[i_p].threeScalar.resize(env().getNd()); + outputData.projection[i_p].pSquaredInsertion.resize(env().getNd()); + for (unsigned int nu = 0; nu < env().getNd(); ++nu) + { + outputData.projection[i_p].twoScalar[nu].resize(env().getNd()); + outputData.projection[i_p].threeScalar[nu].resize(env().getNd()); + outputData.projection[i_p].pSquaredInsertion[nu].resize(env().getNd()); + } // Calculate phase factors auto &momph_ip = envGet(ScalarField, momPhaseName_[i_p]); - momph_ip = Complex(1.0,0.0); + momph_ip = zero; for (unsigned int j = 0; j < env().getNd()-1; ++j) { - for (unsigned int momcount = 0; momcount < mom[j]; ++momcount) - { - momph_ip = momph_ip*(*phase_[j]); - } + Real twoPiL = M_PI*2./l[j]; + LatticeCoordinate(buf, j); + buf = outputData.projection[i_p].momentum[j]*twoPiL*buf; + momph_ip = momph_ip + buf; } - momph_ip = adj(momph_ip); + momph_ip = exp(-ci*momph_ip); momPhase_.push_back(&momph_ip); } } @@ -170,62 +163,70 @@ void TVPCounterTerms::execute(void) buf = adj(Cshift(prop0, nu, -1)); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { + // Two-scalar loop + tmp_vp = buf * Cshift(prop0, mu, 1); + tmp_vp -= Cshift(buf, mu, 1) * prop0; + tmp_vp = 2.0*real(tmp_vp); + // Output if necessary + if (!par().output.empty()) + { + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].twoScalar[mu][nu], + tmp_vp, i_p); + } + } + // Three-scalar loop (no vertex) tmp_vp = buf * Cshift(twoscalarProp, mu, 1); tmp_vp -= Cshift(buf, mu, 1) * twoscalarProp; tmp_vp = 2.0*real(tmp_vp); - // Output if necessary if (!par().output.empty()) { - writeVP(tmp_vp, "NoVertex_"+std::to_string(mu)+"_"+std::to_string(nu)); - } - - // Three-scalar loop (tadpole vertex) - tmp_vp = buf * Cshift(twoscalarVertexProp, mu, 1); - tmp_vp -= Cshift(buf, mu, 1) * twoscalarVertexProp; - tmp_vp = 2.0*real(tmp_vp); - - // Output if necessary - if (!par().output.empty()) - { - writeVP(tmp_vp, "TadVertex_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].threeScalar[mu][nu], + tmp_vp, i_p); + } } // Three-scalar loop (hat{p}^2 insertion) tmp_vp = buf * Cshift(psquaredProp, mu, 1); tmp_vp -= Cshift(buf, mu, 1) * psquaredProp; tmp_vp = 2.0*real(tmp_vp); - // Output if necessary if (!par().output.empty()) { - writeVP(tmp_vp, "pSquaredInsertion_"+std::to_string(mu)+"_"+std::to_string(nu)); + for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + { + project(outputData.projection[i_p].pSquaredInsertion[mu][nu], + tmp_vp, i_p); + } } } } -} -void TVPCounterTerms::writeVP(const ScalarField &vp, std::string dsetName) -{ - std::vector vecBuf; - std::vector result; - envGetTmp(ScalarField, vpPhase); - - for (unsigned int i_p = 0; i_p < par().outputMom.size(); ++i_p) + // OUTPUT IF NECESSARY + if (!par().output.empty()) { - std::vector mom = strToVec(par().outputMom[i_p]); - std::string filename = par().output + "_" - + std::to_string(mom[0]) - + std::to_string(mom[1]) - + std::to_string(mom[2]); - vpPhase = vp*(*momPhase_[i_p]); - sliceSum(vpPhase, vecBuf, Tp); - result.resize(vecBuf.size()); - for (unsigned int t = 0; t < vecBuf.size(); ++t) - { - result[t] = TensorRemove(vecBuf[t]); - } - saveResult(filename, dsetName, result); + LOG(Message) << "Saving momentum-projected correlators to '" + << RESULT_FILE_NAME(par().output) << "'..." + << std::endl; + saveResult(par().output, "scalar_loops", outputData); + } +} + +void TVPCounterTerms::project(std::vector &projection, const ScalarField &vp, int i_p) +{ + std::vector vecBuf; + envGetTmp(ScalarField, vpPhase); + + vpPhase = vp*(*momPhase_[i_p]); + sliceSum(vpPhase, vecBuf, Tp); + projection.resize(vecBuf.size()); + for (unsigned int t = 0; t < vecBuf.size(); ++t) + { + projection[t] = TensorRemove(vecBuf[t]); } } diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp index 634206a6..a0c3688d 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -26,6 +26,23 @@ class TVPCounterTerms: public Module { public: SCALAR_TYPE_ALIASES(SIMPL,); + class Result: Serializable + { + public: + class Projection: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Projection, + std::vector, momentum, + std::vector>>, twoScalar, + std::vector>>, threeScalar, + std::vector>>, pSquaredInsertion); + }; + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::vector, lattice_size, + double, mass, + std::vector, projection); + }; public: // constructor TVPCounterTerms(const std::string name); @@ -40,7 +57,7 @@ protected: // execution virtual void execute(void); private: - void writeVP(const ScalarField &vp, std::string dsetName); + void project(std::vector &projection, const ScalarField &vp, int i_p); private: std::string freeMomPropName_, GFSrcName_, phatsqName_, prop0Name_, twoscalarName_, twoscalarVertexName_, From 49a0ae73eb097fc9e7de02897bcde6ff6a3db170 Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Mon, 12 Feb 2018 09:36:08 +0000 Subject: [PATCH 132/620] Insertion of photon field in seqential conserved current --- extras/Hadrons/Modules.hpp | 1 - .../Hadrons/Modules/MSource/SeqConserved.hpp | 93 ++++++++-- .../Modules/MSource/SeqConservedSummed.hpp | 169 ------------------ extras/Hadrons/modules.inc | 1 - lib/qcd/action/fermion/FermionOperator.h | 4 +- .../fermion/ImprovedStaggeredFermion.cc | 16 +- .../action/fermion/ImprovedStaggeredFermion.h | 12 +- .../fermion/ImprovedStaggeredFermion5D.cc | 15 +- .../fermion/ImprovedStaggeredFermion5D.h | 12 +- lib/qcd/action/fermion/WilsonFermion.cc | 90 ++++++++-- lib/qcd/action/fermion/WilsonFermion.h | 14 +- lib/qcd/action/fermion/WilsonFermion5D.cc | 127 +++++++++++-- lib/qcd/action/fermion/WilsonFermion5D.h | 10 +- tests/hadrons/Test_hadrons.hpp | 3 +- 14 files changed, 310 insertions(+), 257 deletions(-) delete mode 100644 extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index ed6254f4..734ff0fc 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -28,7 +28,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include -#include #include #include #include diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.hpp b/extras/Hadrons/Modules/MSource/SeqConserved.hpp index ee8d8d56..0fb23cc4 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/extras/Hadrons/Modules/MSource/SeqConserved.hpp @@ -2,12 +2,13 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/SeqConserved.hpp +Source file: extras/Hadrons/Modules/MContraction/SeqConserved.hpp Copyright (C) 2015-2018 Author: Antonin Portelli -Author: Lanny91 +Author: Andrew Lawson +Author: Vera Guelpers 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,13 +35,17 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include +#include + BEGIN_HADRONS_NAMESPACE /* - Sequential source + Sequential source with insertion of conserved current. + Additionally optional insertion of a photon field A_\mu(x). ----------------------------- - * src_x = q_x * theta(x_3 - tA) * theta(tB - x_3) * J_mu * exp(i x.mom) + * src_x = sum_{mu=mu_min}^{mu_max} + q_x * theta(x_3 - tA) * theta(tB - x_3) * J_mu * exp(i x.mom) (* A_\mu(x)) * options: - q: input propagator (string) @@ -48,8 +53,10 @@ BEGIN_HADRONS_NAMESPACE - tA: begin timeslice (integer) - tB: end timesilce (integer) - curr_type: type of conserved current to insert (Current) - - mu: Lorentz index of current to insert (integer) + - mu_min: begin Lorentz Index (integer) + - mu_max: end Lorentz Index (integer) - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") + - photon: optional photon field (string) */ @@ -67,8 +74,10 @@ public: unsigned int, tA, unsigned int, tB, Current, curr_type, - unsigned int, mu, - std::string, mom); + unsigned int, mu_min, + unsigned int, mu_max, + std::string, mom, + std::string, photon); }; template @@ -76,6 +85,8 @@ class TSeqConserved: public Module { public: FERM_TYPE_ALIASES(FImpl,); +public: + typedef PhotonR::GaugeField EmField; public: // constructor TSeqConserved(const std::string name); @@ -93,6 +104,7 @@ protected: MODULE_REGISTER_NS(SeqConserved, TSeqConserved, MSource); + /****************************************************************************** * TSeqConserved implementation * ******************************************************************************/ @@ -107,7 +119,8 @@ template std::vector TSeqConserved::getInput(void) { std::vector in = {par().q, par().action}; - + if (!par().photon.empty()) in.push_back(par().photon); + return in; } @@ -116,7 +129,7 @@ std::vector TSeqConserved::getOutput(void) { std::vector out = {getName()}; - return out; + return out; } // setup /////////////////////////////////////////////////////////////////////// @@ -125,6 +138,10 @@ void TSeqConserved::setup(void) { auto Ls_ = env().getObjectLs(par().action); envCreateLat(PropagatorField, getName(), Ls_); + envTmpLat(PropagatorField, "src_tmp"); + envTmpLat(LatticeComplex, "mom_phase"); + envTmpLat(LatticeComplex, "coor"); + envTmpLat(LatticeComplex, "latt_compl"); } // execution /////////////////////////////////////////////////////////////////// @@ -134,27 +151,71 @@ void TSeqConserved::execute(void) if (par().tA == par().tB) { LOG(Message) << "Generating sequential source with conserved " - << par().curr_type << " current insertion (mu = " - << par().mu << ") at " << "t = " << par().tA << std::endl; + << par().curr_type << " current at " + << "t = " << par().tA << std::endl; } else { LOG(Message) << "Generating sequential source with conserved " - << par().curr_type << " current insertion (mu = " - << par().mu << ") for " << par().tA << " <= t <= " + << par().curr_type << " current for " + << par().tA << " <= t <= " << par().tB << std::endl; } auto &src = envGet(PropagatorField, getName()); + envGetTmp(PropagatorField, src_tmp); + src_tmp = src; auto &q = envGet(PropagatorField, par().q); auto &mat = envGet(FMat, par().action); + envGetTmp(LatticeComplex, mom_phase); + envGetTmp(LatticeComplex, coor); + envGetTmp(LatticeComplex, latt_compl); + src = zero; + + //exp(ipx) std::vector mom = strToVec(par().mom); - mat.SeqConservedCurrent(q, src, par().curr_type, par().mu, - mom, par().tA, par().tB); + mom_phase = zero; + Complex i(0.0,1.0); + for(unsigned int mu = 0; mu < env().getNd(); mu++) + { + LatticeCoordinate(coor, mu); + mom_phase = mom_phase + (mom[mu]/env().getGrid()->_fdimensions[mu])*coor; + } + mom_phase = exp((Real)(2*M_PI)*i*mom_phase); + LOG(Message) << "Inserting momentum " << mom << std::endl; + + + + if (!par().photon.empty()) + { + LOG(Message) << "Inserting the stochastic photon field " << par().photon << std::endl; + } + + for(unsigned int mu=par().mu_min;mu<=par().mu_max;mu++) + { + if (!par().photon.empty()) + { + //Get the stochastic photon field, if required + auto &stoch_photon = envGet(EmField, par().photon); + latt_compl = PeekIndex(stoch_photon, mu) * mom_phase; + } + else + { + latt_compl = mom_phase; + } + + mat.SeqConservedCurrent(q, src_tmp, par().curr_type, mu, + par().tA, par().tB, latt_compl); + src += src_tmp; + + } + + } + END_MODULE_NAMESPACE END_HADRONS_NAMESPACE -#endif // Hadrons_SeqConserved_hpp_ +#endif // Hadrons_MSource_SeqConserved_hpp_ diff --git a/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp b/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp deleted file mode 100644 index 243d05f2..00000000 --- a/extras/Hadrons/Modules/MSource/SeqConservedSummed.hpp +++ /dev/null @@ -1,169 +0,0 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules/MContraction/SeqConservedSummed.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Andrew Lawson -Author: Vera Guelpers - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ - -#ifndef Hadrons_MSource_SeqConservedSummed_hpp_ -#define Hadrons_MSource_SeqConservedSummed_hpp_ - -#include -#include -#include - -BEGIN_HADRONS_NAMESPACE - -/* - - Sequential source summed over the Lorentz index of current - ----------------------------- - * src_x = sum_mu q_x * theta(x_3 - tA) * theta(tB - x_3) * J_mu * exp(i x.mom) - - * options: - - q: input propagator (string) - - action: fermion action used for propagator q (string) - - tA: begin timeslice (integer) - - tB: end timesilce (integer) - - curr_type: type of conserved current to insert (Current) - - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") - - */ - -/****************************************************************************** - * SeqConservedSummed * - ******************************************************************************/ -BEGIN_MODULE_NAMESPACE(MSource) - -class SeqConservedSummedPar: Serializable -{ -public: - GRID_SERIALIZABLE_CLASS_MEMBERS(SeqConservedSummedPar, - std::string, q, - std::string, action, - unsigned int, tA, - unsigned int, tB, - Current, curr_type, - std::string, mom); -}; - -template -class TSeqConservedSummed: public Module -{ -public: - FERM_TYPE_ALIASES(FImpl,); -public: - // constructor - TSeqConservedSummed(const std::string name); - // destructor - virtual ~TSeqConservedSummed(void) = default; - // dependency relation - virtual std::vector getInput(void); - virtual std::vector getOutput(void); -protected: - // setup - virtual void setup(void); - // execution - virtual void execute(void); -}; - -MODULE_REGISTER_NS(SeqConservedSummed, TSeqConservedSummed, MSource); - -/****************************************************************************** - * TSeqConservedSummed implementation * - ******************************************************************************/ -// constructor ///////////////////////////////////////////////////////////////// -template -TSeqConservedSummed::TSeqConservedSummed(const std::string name) -: Module(name) -{} - -// dependencies/products /////////////////////////////////////////////////////// -template -std::vector TSeqConservedSummed::getInput(void) -{ - std::vector in = {par().q, par().action}; - - return in; -} - -template -std::vector TSeqConservedSummed::getOutput(void) -{ - std::vector out = {getName()}; - - return out; -} - -// setup /////////////////////////////////////////////////////////////////////// -template -void TSeqConservedSummed::setup(void) -{ - auto Ls_ = env().getObjectLs(par().action); - envCreateLat(PropagatorField, getName(), Ls_); - envTmpLat(PropagatorField, "src_tmp"); -} - -// execution /////////////////////////////////////////////////////////////////// -template -void TSeqConservedSummed::execute(void) -{ - if (par().tA == par().tB) - { - LOG(Message) << "Generating sequential source with conserved " - << par().curr_type << " current insertion summed over mu at " - << "t = " << par().tA << std::endl; - } - else - { - LOG(Message) << "Generating sequential source with conserved " - << par().curr_type << " current insertion summed over mu for " - << par().tA << " <= t <= " - << par().tB << std::endl; - } - auto &src = envGet(PropagatorField, getName()); - envGetTmp(PropagatorField, src_tmp); - src_tmp = src; - auto &q = envGet(PropagatorField, par().q); - auto &mat = envGet(FMat, par().action); - - std::vector mom = strToVec(par().mom); - src = zero; - for(int mu=0;mu<=3;mu++) - { - mat.SeqConservedCurrent(q, src_tmp, par().curr_type, mu, - mom, par().tA, par().tB); - src += src_tmp; - - } - -} - -END_MODULE_NAMESPACE - -END_HADRONS_NAMESPACE - -#endif // Hadrons_SeqConservedSummed_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index d005caec..63b674d4 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -20,7 +20,6 @@ modules_hpp =\ Modules/MContraction/WardIdentity.hpp \ Modules/MContraction/WeakHamiltonianEye.hpp \ Modules/MFermion/GaugeProp.hpp \ - Modules/MSource/SeqConservedSummed.hpp \ Modules/MSource/SeqGamma.hpp \ Modules/MSource/Point.hpp \ Modules/MSource/Wall.hpp \ diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index 1d395d53..94e065cc 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -125,9 +125,9 @@ namespace Grid { PropagatorField &q_out, Current curr_type, unsigned int mu, - std::vector mom, unsigned int tmin, - unsigned int tmax)=0; + unsigned int tmax, + Lattice> &lattice_cmplx)=0; }; } diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc index 5005b1a2..3a296e52 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc @@ -407,17 +407,19 @@ void ImprovedStaggeredFermion::ContractConservedCurrent(PropagatorField &q } template -void ImprovedStaggeredFermion::SeqConservedCurrent(PropagatorField &q_in, - PropagatorField &q_out, - Current curr_type, - unsigned int mu, - std::vector mom, - unsigned int tmin, - unsigned int tmax) +void ImprovedStaggeredFermion::SeqConservedCurrent(PropagatorField &q_in, + PropagatorField &q_out, + Current curr_type, + unsigned int mu, + unsigned int tmin, + unsigned int tmax, + Lattice> &lattice_cmplx) { assert(0); + } + FermOpStaggeredTemplateInstantiate(ImprovedStaggeredFermion); //AdjointFermOpTemplateInstantiate(ImprovedStaggeredFermion); diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h index 9d5270c6..015eb6bb 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h @@ -166,13 +166,13 @@ class ImprovedStaggeredFermion : public StaggeredKernels, public ImprovedS PropagatorField &q_out, Current curr_type, unsigned int mu); - void SeqConservedCurrent(PropagatorField &q_in, + void SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, - Current curr_type, - unsigned int mu, - std::vector mom, - unsigned int tmin, - unsigned int tmax); + Current curr_type, + unsigned int mu, + unsigned int tmin, + unsigned int tmax, + Lattice> &lattice_cmplx); }; typedef ImprovedStaggeredFermion ImprovedStaggeredFermionF; diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc index 7308ff30..3640a26b 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc @@ -419,15 +419,16 @@ void ImprovedStaggeredFermion5D::ContractConservedCurrent(PropagatorField } template -void ImprovedStaggeredFermion5D::SeqConservedCurrent(PropagatorField &q_in, - PropagatorField &q_out, - Current curr_type, - unsigned int mu, - std::vector mom, - unsigned int tmin, - unsigned int tmax) +void ImprovedStaggeredFermion5D::SeqConservedCurrent(PropagatorField &q_in, + PropagatorField &q_out, + Current curr_type, + unsigned int mu, + unsigned int tmin, + unsigned int tmax, + Lattice> &lattice_cmplx) { assert(0); + } FermOpStaggeredTemplateInstantiate(ImprovedStaggeredFermion5D); diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h index 22fb9e7d..1c211938 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h @@ -178,13 +178,13 @@ namespace QCD { PropagatorField &q_out, Current curr_type, unsigned int mu); - void SeqConservedCurrent(PropagatorField &q_in, + void SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, - Current curr_type, - unsigned int mu, - std::vector mom, - unsigned int tmin, - unsigned int tmax); + Current curr_type, + unsigned int mu, + unsigned int tmin, + unsigned int tmax, + Lattice> &lattice_cmplx); }; }} diff --git a/lib/qcd/action/fermion/WilsonFermion.cc b/lib/qcd/action/fermion/WilsonFermion.cc index 1a020e8a..560c371d 100644 --- a/lib/qcd/action/fermion/WilsonFermion.cc +++ b/lib/qcd/action/fermion/WilsonFermion.cc @@ -381,40 +381,100 @@ void WilsonFermion::ContractConservedCurrent(PropagatorField &q_in_1, } } +//template +//void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, +// PropagatorField &q_out, +// Current curr_type, +// unsigned int mu, +// std::vector mom, +// unsigned int tmin, +// unsigned int tmax) +//{ +// conformable(_grid, q_in._grid); +// conformable(_grid, q_out._grid); +// Lattice> ph(_grid), coor(_grid); +// Complex i(0.0,1.0); +// PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid); +// unsigned int tshift = (mu == Tp) ? 1 : 0; +// unsigned int LLt = GridDefaultLatt()[Tp]; +// +// // Momentum projection +// ph = zero; +// for(unsigned int mu = 0; mu < Nd - 1; mu++) +// { +// LatticeCoordinate(coor, mu); +// ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu]))); +// } +// ph = exp((Real)(2*M_PI)*i*ph); +// +// q_out = zero; +// LatticeInteger coords(_grid); +// LatticeCoordinate(coords, Tp); +// +// // Need q(x + mu) and q(x - mu). +// tmp = Cshift(q_in, mu, 1); +// tmpFwd = tmp*ph; +// tmp = ph*q_in; +// tmpBwd = Cshift(tmp, mu, -1); +// +// parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) +// { +// // Compute the sequential conserved current insertion only if our simd +// // object contains a timeslice we need. +// vInteger t_mask = ((coords._odata[sU] >= tmin) && +// (coords._odata[sU] <= tmax)); +// Integer timeSlices = Reduce(t_mask); +// +// if (timeSlices > 0) +// { +// Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sU], +// q_out._odata[sU], +// Umu, sU, mu, t_mask); +// } +// +// // Repeat for backward direction. +// t_mask = ((coords._odata[sU] >= (tmin + tshift)) && +// (coords._odata[sU] <= (tmax + tshift))); +// +// //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3) +// unsigned int t0 = 0; +// if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 )); +// +// timeSlices = Reduce(t_mask); +// +// if (timeSlices > 0) +// { +// Kernels::SeqConservedCurrentSiteBwd(tmpBwd._odata[sU], +// q_out._odata[sU], +// Umu, sU, mu, t_mask); +// } +// } +//} + template void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, Current curr_type, unsigned int mu, - std::vector mom, unsigned int tmin, - unsigned int tmax) + unsigned int tmax, + Lattice> &lattice_cmplx) { conformable(_grid, q_in._grid); conformable(_grid, q_out._grid); - Lattice> ph(_grid), coor(_grid); Complex i(0.0,1.0); PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid); unsigned int tshift = (mu == Tp) ? 1 : 0; unsigned int LLt = GridDefaultLatt()[Tp]; - // Momentum projection - ph = zero; - for(unsigned int mu = 0; mu < Nd - 1; mu++) - { - LatticeCoordinate(coor, mu); - ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu]))); - } - ph = exp((Real)(2*M_PI)*i*ph); - q_out = zero; LatticeInteger coords(_grid); LatticeCoordinate(coords, Tp); // Need q(x + mu) and q(x - mu). tmp = Cshift(q_in, mu, 1); - tmpFwd = tmp*ph; - tmp = ph*q_in; + tmpFwd = tmp*lattice_cmplx; + tmp = lattice_cmplx*q_in; tmpBwd = Cshift(tmp, mu, -1); parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) @@ -449,6 +509,8 @@ void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, Umu, sU, mu, t_mask); } } + + } FermOpTemplateInstantiate(WilsonFermion); diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index feba40ed..db32529d 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -155,13 +155,13 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { PropagatorField &q_out, Current curr_type, unsigned int mu); - void SeqConservedCurrent(PropagatorField &q_in, - PropagatorField &q_out, - Current curr_type, - unsigned int mu, - std::vector mom, - unsigned int tmin, - unsigned int tmax); + void SeqConservedCurrent(PropagatorField &q_in, + PropagatorField &q_out, + Current curr_type, + unsigned int mu, + unsigned int tmin, + unsigned int tmax, + Lattice> &lattice_cmplx); }; typedef WilsonFermion WilsonFermionF; diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/lib/qcd/action/fermion/WilsonFermion5D.cc index bc703187..92280c13 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.cc +++ b/lib/qcd/action/fermion/WilsonFermion5D.cc @@ -779,18 +779,110 @@ void WilsonFermion5D::ContractConservedCurrent(PropagatorField &q_in_1, } +//template +//void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, +// PropagatorField &q_out, +// Current curr_type, +// unsigned int mu, +// std::vector mom, +// unsigned int tmin, +// unsigned int tmax) +//{ +// conformable(q_in._grid, FermionGrid()); +// conformable(q_in._grid, q_out._grid); +// Lattice> ph(FermionGrid()), coor(FermionGrid()); +// PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()), +// tmp(FermionGrid()); +// Complex i(0.0, 1.0); +// unsigned int tshift = (mu == Tp) ? 1 : 0; +// unsigned int LLs = q_in._grid->_rdimensions[0]; +// unsigned int LLt = GridDefaultLatt()[Tp]; +// +// // Momentum projection. +// ph = zero; +// for(unsigned int nu = 0; nu < Nd - 1; nu++) +// { +// // Shift coordinate lattice index by 1 to account for 5th dimension. +// LatticeCoordinate(coor, nu + 1); +// ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu]))); +// } +// ph = exp((Real)(2*M_PI)*i*ph); +// +// q_out = zero; +// LatticeInteger coords(_FourDimGrid); +// LatticeCoordinate(coords, Tp); +// +// +// // Need q(x + mu, s) and q(x - mu, s). 5D lattice so shift 4D coordinate mu +// // by one. +// tmp = Cshift(q_in, mu + 1, 1); +// tmpFwd = tmp*ph; +// tmp = ph*q_in; +// tmpBwd = Cshift(tmp, mu + 1, -1); +// +// parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) +// { +// // Compute the sequential conserved current insertion only if our simd +// // object contains a timeslice we need. +// vInteger t_mask = ((coords._odata[sU] >= tmin) && +// (coords._odata[sU] <= tmax)); +// Integer timeSlices = Reduce(t_mask); +// +// if (timeSlices > 0) +// { +// unsigned int sF = sU * LLs; +// for (unsigned int s = 0; s < LLs; ++s) +// { +// bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); +// bool tadpole_sign = (curr_type == Current::Tadpole); +// bool switch_sgn = tadpole_sign || axial_sign; +// +// Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sF], +// q_out._odata[sF], Umu, sU, +// mu, t_mask, switch_sgn); +// ++sF; +// } +// } +// +// // Repeat for backward direction. +// t_mask = ((coords._odata[sU] >= (tmin + tshift)) && +// (coords._odata[sU] <= (tmax + tshift))); +// +// //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3) +// unsigned int t0 = 0; +// if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 )); +// +// timeSlices = Reduce(t_mask); +// +// if (timeSlices > 0) +// { +// unsigned int sF = sU * LLs; +// for (unsigned int s = 0; s < LLs; ++s) +// { +// bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); +// Kernels::SeqConservedCurrentSiteBwd(tmpBwd._odata[sF], +// q_out._odata[sF], Umu, sU, +// mu, t_mask, axial_sign); +// ++sF; +// } +// } +// } +//} + + + + template void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, Current curr_type, unsigned int mu, - std::vector mom, unsigned int tmin, - unsigned int tmax) + unsigned int tmax, + Lattice> &lattice_cmplx) { conformable(q_in._grid, FermionGrid()); conformable(q_in._grid, q_out._grid); - Lattice> ph(FermionGrid()), coor(FermionGrid()); PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()), tmp(FermionGrid()); Complex i(0.0, 1.0); @@ -798,25 +890,26 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, unsigned int LLs = q_in._grid->_rdimensions[0]; unsigned int LLt = GridDefaultLatt()[Tp]; - // Momentum projection. - ph = zero; - for(unsigned int nu = 0; nu < Nd - 1; nu++) - { - // Shift coordinate lattice index by 1 to account for 5th dimension. - LatticeCoordinate(coor, nu + 1); - ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu]))); - } - ph = exp((Real)(2*M_PI)*i*ph); - q_out = zero; LatticeInteger coords(_FourDimGrid); LatticeCoordinate(coords, Tp); + + //QED: photon field is 4dim, but need a 5dim object to multiply to + // DWF PropagatorField + Lattice> lattice_cmplx_5d(FermionGrid()); + for (unsigned int s = 0; s < LLs; ++s) + { + InsertSlice(lattice_cmplx,lattice_cmplx_5d, s, 0); + } + + + // Need q(x + mu, s) and q(x - mu, s). 5D lattice so shift 4D coordinate mu // by one. tmp = Cshift(q_in, mu + 1, 1); - tmpFwd = tmp*ph; - tmp = ph*q_in; + tmpFwd = tmp*lattice_cmplx_5d; + tmp = lattice_cmplx_5d*q_in; tmpBwd = Cshift(tmp, mu + 1, -1); parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) @@ -868,6 +961,10 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, } } + + + + FermOpTemplateInstantiate(WilsonFermion5D); GparityFermOpTemplateInstantiate(WilsonFermion5D); diff --git a/lib/qcd/action/fermion/WilsonFermion5D.h b/lib/qcd/action/fermion/WilsonFermion5D.h index d66f4a1d..6a7c6c7d 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.h +++ b/lib/qcd/action/fermion/WilsonFermion5D.h @@ -222,13 +222,13 @@ namespace QCD { PropagatorField &q_out, Current curr_type, unsigned int mu); - void SeqConservedCurrent(PropagatorField &q_in, + void SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, - Current curr_type, + Current curr_type, unsigned int mu, - std::vector mom, - unsigned int tmin, - unsigned int tmax); + unsigned int tmin, + unsigned int tmax, + Lattice> &lattice_cmplx); }; }} diff --git a/tests/hadrons/Test_hadrons.hpp b/tests/hadrons/Test_hadrons.hpp index 0265f5a6..6188a580 100644 --- a/tests/hadrons/Test_hadrons.hpp +++ b/tests/hadrons/Test_hadrons.hpp @@ -263,7 +263,8 @@ inline void makeConservedSequentialSource(Application &application, seqPar.tA = tS; seqPar.tB = tS; seqPar.curr_type = curr; - seqPar.mu = mu; + seqPar.mu_min = mu; + seqPar.mu_min = mu; seqPar.mom = mom; application.createModule(srcName, seqPar); } From 237a8ec9181d87c115e1569456430187c071adb0 Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 12 Feb 2018 13:27:20 +0000 Subject: [PATCH 133/620] Communicator leak fixed (I think) --- lib/communicator/Communicator_mpi3.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/communicator/Communicator_mpi3.cc b/lib/communicator/Communicator_mpi3.cc index ef47d617..6732dcdf 100644 --- a/lib/communicator/Communicator_mpi3.cc +++ b/lib/communicator/Communicator_mpi3.cc @@ -49,6 +49,7 @@ void CartesianCommunicator::Init(int *argc, char ***argv) Grid_quiesce_nodes(); + // Never clean up as done once. MPI_Comm_dup (MPI_COMM_WORLD,&communicator_world); GlobalSharedMemory::Init(communicator_world); @@ -88,6 +89,8 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors) GlobalSharedMemory::OptimalCommunicator (processors,optimal_comm); // Remap using the shared memory optimising routine InitFromMPICommunicator(processors,optimal_comm); SetCommunicator(optimal_comm); + // Free the temp communicator + MPI_Comm_free(&optimal_comm); } ////////////////////////////////// @@ -183,8 +186,8 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors, } else { srank = 0; - comm_split = parent.communicator; - // std::cout << " Inherited communicator " < &processors, ////////////////////////////////////////////////////////////////////////////////////////////////////// SetCommunicator(comm_split); + // Free the temp communicator + MPI_Comm_free(&comm_split); + if(0){ std::cout << " ndim " <<_ndimension<<" " << parent._ndimension << std::endl; for(int d=0;d &processors, void CartesianCommunicator::InitFromMPICommunicator(const std::vector &processors, MPI_Comm communicator_base) { + //////////////////////////////////////////////////// + // Creates communicator, and the communicator_halo + //////////////////////////////////////////////////// _ndimension = processors.size(); _processor_coor.resize(_ndimension); From 7b8b2731e702838e3b5696faca6746f5f8157d02 Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 12 Feb 2018 16:06:31 +0000 Subject: [PATCH 134/620] Conj error for complex coeffs --- lib/qcd/action/fermion/CayleyFermion5D.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/qcd/action/fermion/CayleyFermion5D.cc b/lib/qcd/action/fermion/CayleyFermion5D.cc index eace6484..e053b98c 100644 --- a/lib/qcd/action/fermion/CayleyFermion5D.cc +++ b/lib/qcd/action/fermion/CayleyFermion5D.cc @@ -73,7 +73,7 @@ void CayleyFermion5D::DminusDag(const FermionField &psi, FermionField &chi this->DW(psi,tmp_f,DaggerYes); for(int s=0;s Date: Mon, 12 Feb 2018 17:18:10 +0000 Subject: [PATCH 135/620] QedFVol: Implement infinite-volume photon --- lib/qcd/action/gauge/Photon.h | 113 +++++++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 16 deletions(-) diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index d91a9980..76211b06 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -58,7 +58,7 @@ namespace QCD{ public: INHERIT_GIMPL_TYPES(Gimpl); GRID_SERIALIZABLE_ENUM(Gauge, undef, feynman, 1, coulomb, 2, landau, 3); - GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2); + GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2, qedInf, 3); public: Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements); virtual ~Photon(void) = default; @@ -70,6 +70,7 @@ namespace QCD{ const GaugeLinkField &weight); void UnitField(GaugeField &out); private: + void infVolPropagator(GaugeLinkField &out); void invKHatSquared(GaugeLinkField &out); void zmSub(GaugeLinkField &out); private: @@ -97,6 +98,33 @@ namespace QCD{ MomentumSpacePropagator(prop_k,in_k); theFFT.FFT_all_dim(out,prop_k,FFT::backward); } + + template + void Photon::infVolPropagator(GaugeLinkField &out) + { + auto *grid = dynamic_cast(out._grid); + LatticeReal xmu(grid); + GaugeLinkField one(grid); + const unsigned int nd = grid->_ndimension; + std::vector &l = grid->_fdimensions; + std::vector x0(nd,0); + TComplex Tone = Complex(1.0,0.0); + TComplex Tzero = Complex(0.0,0.0); + FFT fft(grid); + + one = Complex(1.0,0.0); + out = zero; + for(int mu = 0; mu < nd; mu++) + { + LatticeCoordinate(xmu,mu); + xmu = where(xmu < l[mu]/2.0, xmu, xmu-double(l[mu])); + out = out + toComplex(4*M_PI*M_PI*xmu*xmu); + } + pokeSite(Tone, out, x0); + out = one/out; + pokeSite(Tzero, out, x0); + fft.FFT_all_dim(out, out, FFT::forward); + } template void Photon::invKHatSquared(GaugeLinkField &out) @@ -172,13 +200,28 @@ namespace QCD{ void Photon::MomentumSpacePropagator(const GaugeField &in, GaugeField &out) { - GridBase *grid = out._grid; - LatticeComplex k2Inv(grid); + GridBase *grid = out._grid; + LatticeComplex momProp(grid); - invKHatSquared(k2Inv); - zmSub(k2Inv); + switch (zmScheme_) + { + case ZmScheme::qedTL: + case ZmScheme::qedL: + { + invKHatSquared(momProp); + zmSub(momProp); + break; + } + case ZmScheme::qedInf: + { + infVolPropagator(momProp); + break; + } + default: + break; + } - out = in*k2Inv; + out = in*momProp; } template @@ -188,14 +231,30 @@ namespace QCD{ const unsigned int nd = grid->_ndimension; std::vector latt_size = grid->_fdimensions; - Integer vol = 1; - for(int d = 0; d < nd; d++) + switch (zmScheme_) { - vol = vol * latt_size[d]; + case ZmScheme::qedTL: + case ZmScheme::qedL: + { + Integer vol = 1; + for(int d = 0; d < nd; d++) + { + vol = vol * latt_size[d]; + } + invKHatSquared(weight); + weight = sqrt(vol*real(weight)); + zmSub(weight); + break; + } + case ZmScheme::qedInf: + { + infVolPropagator(weight); + weight = sqrt(real(weight)); + break; + } + default: + break; } - invKHatSquared(weight); - weight = sqrt(vol*real(weight)); - zmSub(weight); } template @@ -218,12 +277,34 @@ namespace QCD{ GaugeField aTilde(grid); FFT fft(grid); - for(int mu = 0; mu < nd; mu++) + switch (zmScheme_) { - gaussian(rng, r); - r = weight*r; - pokeLorentz(aTilde, r, mu); + case ZmScheme::qedTL: + case ZmScheme::qedL: + { + for(int mu = 0; mu < nd; mu++) + { + gaussian(rng, r); + r = weight*r; + pokeLorentz(aTilde, r, mu); + } + break; + } + case ZmScheme::qedInf: + { + Complex shift(1., 1.); // This needs to be a GaugeLink element? + for(int mu = 0; mu < nd; mu++) + { + bernoulli(rng, r); + r = weight*(2.*r - shift); + pokeLorentz(aTilde, r, mu); + } + break; + } + default: + break; } + fft.FFT_all_dim(out, aTilde, FFT::backward); out = real(out); From dd8f2a64febf1c69ff5d05490536dcaaac645a92 Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 13 Feb 2018 02:08:49 +0000 Subject: [PATCH 136/620] INterface to suit hadrons on Lanczos --- .../iterative/ImplicitlyRestartedLanczos.h | 7 + .../iterative/LocalCoherenceLanczos.h | 187 ++++++++++++------ tests/debug/Test_cayley_coarsen_support.cc | 3 +- tests/debug/Test_cayley_ldop_cr.cc | 3 +- .../Test_dwf_compressed_lanczos_reorg.cc | 14 +- 5 files changed, 143 insertions(+), 71 deletions(-) diff --git a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h index 7b85c095..b4fca33a 100644 --- a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h +++ b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h @@ -181,6 +181,13 @@ enum IRLdiagonalisation { template class ImplicitlyRestartedLanczosHermOpTester : public ImplicitlyRestartedLanczosTester { public: + + static void Deflate(const std::vector &_v, + const std::vector& eval, + const Field& src_orig,Field& result) { + basisDeflate(_v,eval,src_orig,result); + } + LinearFunction &_HermOp; ImplicitlyRestartedLanczosHermOpTester(LinearFunction &HermOp) : _HermOp(HermOp) { }; int ReconstructEval(int j,RealD resid,Field &B, RealD &eval,RealD evalMaxApprox) diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/lib/algorithms/iterative/LocalCoherenceLanczos.h index d5d1bbc2..c530a572 100644 --- a/lib/algorithms/iterative/LocalCoherenceLanczos.h +++ b/lib/algorithms/iterative/LocalCoherenceLanczos.h @@ -70,21 +70,24 @@ public: typedef Lattice FineField; LinearOperatorBase &_Linop; - Aggregation &_Aggregate; + std::vector &subspace; - ProjectedHermOp(LinearOperatorBase& linop, Aggregation &aggregate) : - _Linop(linop), - _Aggregate(aggregate) { }; + ProjectedHermOp(LinearOperatorBase& linop, std::vector & _subspace) : + _Linop(linop), subspace(_subspace) + { + assert(subspace.size() >0); + }; void operator()(const CoarseField& in, CoarseField& out) { + GridBase *FineGrid = subspace[0]._grid; + int checkerboard = subspace[0].checkerboard; + + FineField fin (FineGrid); fin.checkerboard= checkerboard; + FineField fout(FineGrid); fout.checkerboard = checkerboard; - GridBase *FineGrid = _Aggregate.FineGrid; - FineField fin(FineGrid); - FineField fout(FineGrid); - - _Aggregate.PromoteFromSubspace(in,fin); std::cout< & _poly; LinearOperatorBase &_Linop; - Aggregation &_Aggregate; + std::vector &subspace; - ProjectedFunctionHermOp(OperatorFunction & poly,LinearOperatorBase& linop, - Aggregation &aggregate) : + ProjectedFunctionHermOp(OperatorFunction & poly, + LinearOperatorBase& linop, + std::vector & _subspace) : _poly(poly), _Linop(linop), - _Aggregate(aggregate) { }; + subspace(_subspace) + { }; void operator()(const CoarseField& in, CoarseField& out) { - - GridBase *FineGrid = _Aggregate.FineGrid; - - FineField fin(FineGrid) ;fin.checkerboard =_Aggregate.checkerboard; - FineField fout(FineGrid);fout.checkerboard =_Aggregate.checkerboard; - _Aggregate.PromoteFromSubspace(in,fin); std::cout< & _Poly; OperatorFunction & _smoother; LinearOperatorBase &_Linop; - Aggregation &_Aggregate; - RealD _coarse_relax_tol; + RealD _coarse_relax_tol; + std::vector &_subspace; + ImplicitlyRestartedLanczosSmoothedTester(LinearFunction &Poly, OperatorFunction &smoother, LinearOperatorBase &Linop, - Aggregation &Aggregate, + std::vector &subspace, RealD coarse_relax_tol=5.0e3) - : _smoother(smoother), _Linop(Linop),_Aggregate(Aggregate), _Poly(Poly), _coarse_relax_tol(coarse_relax_tol) { }; + : _smoother(smoother), _Linop(Linop), _Poly(Poly), _subspace(subspace), + _coarse_relax_tol(coarse_relax_tol) + { }; int TestConvergence(int j,RealD eresid,CoarseField &B, RealD &eval,RealD evalMaxApprox) { CoarseField v(B); RealD eval_poly = eval; + // Apply operator _Poly(B,v); @@ -168,14 +178,13 @@ class ImplicitlyRestartedLanczosSmoothedTester : public ImplicitlyRestartedLanc } int ReconstructEval(int j,RealD eresid,CoarseField &B, RealD &eval,RealD evalMaxApprox) { - GridBase *FineGrid = _Aggregate.FineGrid; - - int checkerboard = _Aggregate.checkerboard; - + GridBase *FineGrid = _subspace[0]._grid; + int checkerboard = _subspace[0].checkerboard; FineField fB(FineGrid);fB.checkerboard =checkerboard; FineField fv(FineGrid);fv.checkerboard =checkerboard; - _Aggregate.PromoteFromSubspace(B,fv); + blockPromote(B,fv,_subspace); + _smoother(_Linop,fv,fB); RealD eval_poly = eval; @@ -217,27 +226,80 @@ protected: int _checkerboard; LinearOperatorBase & _FineOp; - // FIXME replace Aggregation with vector of fine; the code reuse is too small for - // the hassle and complexity of cross coupling. - Aggregation _Aggregate; - std::vector evals_fine; - std::vector evals_coarse; - std::vector evec_coarse; + std::vector &evals_fine; + std::vector &evals_coarse; + std::vector &subspace; + std::vector &evec_coarse; + +private: + std::vector _evals_fine; + std::vector _evals_coarse; + std::vector _subspace; + std::vector _evec_coarse; + public: + static void Deflate(std::vector subspace, + std::vector evec_coarse, + std::vector eval_coarse, + const FineField& src_orig,FineField& result) + { + int N = (int)evec_coarse.size(); + CoarseField src_coarse(evec_coarse[0]._grid); + CoarseField res_coarse(evec_coarse[0]._grid); res_coarse = zero; + blockProject(src_orig,src_coarse,subspace); + for (int i=0;i &FineOp, - int checkerboard) : + GridBase *CoarseGrid, + LinearOperatorBase &FineOp, + int checkerboard) : _CoarseGrid(CoarseGrid), _FineGrid(FineGrid), - _Aggregate(CoarseGrid,FineGrid,checkerboard), _FineOp(FineOp), - _checkerboard(checkerboard) + _checkerboard(checkerboard), + evals_fine (_evals_fine), + evals_coarse(_evals_coarse), + subspace (_subspace), + evec_coarse(_evec_coarse) { evals_fine.resize(0); evals_coarse.resize(0); }; - void Orthogonalise(void ) { _Aggregate.Orthogonalise(); } + ////////////////////////////////////////////////////////////////////////// + // Alternate constructore, external storage for use by Hadrons module + ////////////////////////////////////////////////////////////////////////// + LocalCoherenceLanczos(GridBase *FineGrid, + GridBase *CoarseGrid, + LinearOperatorBase &FineOp, + int checkerboard, + std::vector &ext_subspace, + std::vector &ext_coarse, + std::vector &ext_eval_fine, + std::vector &ext_eval_coarse + ) : + _CoarseGrid(CoarseGrid), + _FineGrid(FineGrid), + _FineOp(FineOp), + _checkerboard(checkerboard), + evals_fine (ext_eval_fine), + evals_coarse(ext_eval_coarse), + subspace (ext_subspace), + evec_coarse (ext_coarse) + { + evals_fine.resize(0); + evals_coarse.resize(0); + }; + + void Orthogonalise(void ) { + CoarseScalar InnerProd(_CoarseGrid); + blockOrthogonalise(InnerProd,subspace);std::cout << GridLogMessage <<" Gramm-Schmidt pass 1"< static RealD normalise(T& v) { @@ -246,43 +308,44 @@ public: v = v * (1.0/nn); return nn; } - + /* void fakeFine(void) { int Nk = nbasis; - _Aggregate.subspace.resize(Nk,_FineGrid); - _Aggregate.subspace[0]=1.0; - _Aggregate.subspace[0].checkerboard=_checkerboard; - normalise(_Aggregate.subspace[0]); + subspace.resize(Nk,_FineGrid); + subspace[0]=1.0; + subspace[0].checkerboard=_checkerboard; + normalise(subspace[0]); PlainHermOp Op(_FineOp); for(int k=1;k Op(_FineOp); ImplicitlyRestartedLanczosHermOpTester SimpleTester(Op); for(int k=0;k ChebySmooth(cheby_smooth); - ProjectedFunctionHermOp ChebyOp (ChebySmooth,_FineOp,_Aggregate); - ImplicitlyRestartedLanczosSmoothedTester ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,_Aggregate,relax); + ProjectedFunctionHermOp ChebyOp (ChebySmooth,_FineOp,_subspace); + ImplicitlyRestartedLanczosSmoothedTester ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,subspace,relax); for(int k=0;k Op(_FineOp); evals_fine.resize(Nm); - _Aggregate.subspace.resize(Nm,_FineGrid); + subspace.resize(Nm,_FineGrid); ImplicitlyRestartedLanczos IRL(ChebyOp,Op,Nstop,Nk,Nm,resid,MaxIt,betastp,MinRes); FineField src(_FineGrid); src=1.0; src.checkerboard = _checkerboard; int Nconv; - IRL.calc(evals_fine,_Aggregate.subspace,src,Nconv,false); + IRL.calc(evals_fine,subspace,src,Nconv,false); // Shrink down to number saved assert(Nstop>=nbasis); assert(Nconv>=nbasis); evals_fine.resize(nbasis); - _Aggregate.subspace.resize(nbasis,_FineGrid); + subspace.resize(nbasis,_FineGrid); } void calcCoarse(ChebyParams cheby_op,ChebyParams cheby_smooth,RealD relax, int Nstop, int Nk, int Nm,RealD resid, RealD MaxIt, RealD betastp, int MinRes) { Chebyshev Cheby(cheby_op); - ProjectedHermOp Op(_FineOp,_Aggregate); - ProjectedFunctionHermOp ChebyOp (Cheby,_FineOp,_Aggregate); + ProjectedHermOp Op(_FineOp,_subspace); + ProjectedFunctionHermOp ChebyOp (Cheby,_FineOp,_subspace); ////////////////////////////////////////////////////////////////////////////////////////////////// // create a smoother and see if we can get a cheap convergence test and smooth inside the IRL ////////////////////////////////////////////////////////////////////////////////////////////////// Chebyshev ChebySmooth(cheby_smooth); - ImplicitlyRestartedLanczosSmoothedTester ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,_Aggregate,relax); + ImplicitlyRestartedLanczosSmoothedTester ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,_subspace,relax); evals_coarse.resize(Nm); evec_coarse.resize(Nm,_CoarseGrid); diff --git a/tests/debug/Test_cayley_coarsen_support.cc b/tests/debug/Test_cayley_coarsen_support.cc index c6532a0d..f57823e5 100644 --- a/tests/debug/Test_cayley_coarsen_support.cc +++ b/tests/debug/Test_cayley_coarsen_support.cc @@ -111,6 +111,7 @@ int main (int argc, char ** argv) std::cout< subspace(nbasis,FGrid); @@ -119,7 +120,7 @@ int main (int argc, char ** argv) MdagMLinearOperator HermDefOp(Ddwf); typedef Aggregation Subspace; - Subspace Aggregates(Coarse5d,FGrid); + Subspace Aggregates(Coarse5d,FGrid,cb); Aggregates.CreateSubspaceRandom(RNG5); subspace=Aggregates.subspace; diff --git a/tests/debug/Test_cayley_ldop_cr.cc b/tests/debug/Test_cayley_ldop_cr.cc index cbefdd46..c6005fd0 100644 --- a/tests/debug/Test_cayley_ldop_cr.cc +++ b/tests/debug/Test_cayley_ldop_cr.cc @@ -78,6 +78,7 @@ int main (int argc, char ** argv) RealD mass=0.1; RealD M5=1.5; + int cb=0; std::cout< HermDefOp(Ddwf); - Subspace Aggregates(Coarse5d,FGrid); + Subspace Aggregates(Coarse5d,FGrid,cb); Aggregates.CreateSubspace(RNG5,HermDefOp); diff --git a/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc b/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc index 4c702a33..3dff4b90 100644 --- a/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc +++ b/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc @@ -56,12 +56,12 @@ public: void checkpointFine(std::string evecs_file,std::string evals_file) { - assert(this->_Aggregate.subspace.size()==nbasis); + assert(this->subspace.size()==nbasis); emptyUserRecord record; Grid::QCD::ScidacWriter WR; WR.open(evecs_file); for(int k=0;k_Aggregate.subspace[k],record); + WR.writeScidacFieldRecord(this->subspace[k],record); } WR.close(); @@ -72,7 +72,7 @@ public: void checkpointFineRestore(std::string evecs_file,std::string evals_file) { this->evals_fine.resize(nbasis); - this->_Aggregate.subspace.resize(nbasis,this->_FineGrid); + this->subspace.resize(nbasis,this->_FineGrid); std::cout << GridLogIRL<< "checkpointFineRestore: Reading evals from "<_Aggregate.subspace[k].checkerboard=this->_checkerboard; - RD.readScidacFieldRecord(this->_Aggregate.subspace[k],record); + this->subspace[k].checkerboard=this->_checkerboard; + RD.readScidacFieldRecord(this->subspace[k],record); } RD.close(); @@ -221,7 +221,9 @@ int main (int argc, char ** argv) { std::cout << GridLogIRL<<"Checkpointing Fine evecs"< Date: Tue, 13 Feb 2018 02:11:37 +0000 Subject: [PATCH 137/620] Move deflate to right class --- .../iterative/ImplicitlyRestartedLanczos.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h index b4fca33a..7d5a1889 100644 --- a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h +++ b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h @@ -182,12 +182,6 @@ template class ImplicitlyRestartedLanczosHermOpTester : public Imp { public: - static void Deflate(const std::vector &_v, - const std::vector& eval, - const Field& src_orig,Field& result) { - basisDeflate(_v,eval,src_orig,result); - } - LinearFunction &_HermOp; ImplicitlyRestartedLanczosHermOpTester(LinearFunction &HermOp) : _HermOp(HermOp) { }; int ReconstructEval(int j,RealD resid,Field &B, RealD &eval,RealD evalMaxApprox) @@ -250,6 +244,13 @@ class ImplicitlyRestartedLanczos { ///////////////////////// public: + + static void Deflate(const std::vector &_v, + const std::vector& eval, + const Field& src_orig,Field& result) { + basisDeflate(_v,eval,src_orig,result); + } + ////////////////////////////////////////////////////////////////// // PAB: ////////////////////////////////////////////////////////////////// From c6e1f645737d6785d513246db47323afaa5850e2 Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Tue, 13 Feb 2018 09:30:23 +0000 Subject: [PATCH 138/620] Test for QED --- tests/hadrons/Test_QED.cc | 260 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 tests/hadrons/Test_QED.cc diff --git a/tests/hadrons/Test_QED.cc b/tests/hadrons/Test_QED.cc new file mode 100644 index 00000000..44dd0578 --- /dev/null +++ b/tests/hadrons/Test_QED.cc @@ -0,0 +1,260 @@ +/******************************************************************************* + Grid physics library, www.github.com/paboyle/Grid + + Source file: tests/hadrons/Test_hadrons_spectrum.cc + + Copyright (C) 2015-2018 + + Author: Antonin Portelli + Author: Vera Guelpers + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution + directory. + *******************************************************************************/ + +#include + +using namespace Grid; +using namespace Hadrons; + +int main(int argc, char *argv[]) +{ + // initialization ////////////////////////////////////////////////////////// + Grid_init(&argc, &argv); + HadronsLogError.Active(GridLogError.isActive()); + HadronsLogWarning.Active(GridLogWarning.isActive()); + HadronsLogMessage.Active(GridLogMessage.isActive()); + HadronsLogIterative.Active(GridLogIterative.isActive()); + HadronsLogDebug.Active(GridLogDebug.isActive()); + LOG(Message) << "Grid initialized" << std::endl; + + + // run setup /////////////////////////////////////////////////////////////// + Application application; + std::vector flavour = {"h"}; //{"l", "s", "c1", "c2", "c3"}; + std::vector mass = {.2}; //{.01, .04, .2 , .25 , .3 }; + + unsigned int nt = GridDefaultLatt()[Tp]; + + // global parameters + Application::GlobalPar globalPar; + globalPar.trajCounter.start = 1500; + globalPar.trajCounter.end = 1520; + globalPar.trajCounter.step = 20; + globalPar.seed = "1 2 3 4"; + application.setPar(globalPar); + // gauge field + application.createModule("gauge"); + // pt source + MSource::Point::Par ptPar; + ptPar.position = "0 0 0 0"; + application.createModule("pt", ptPar); + // sink + MSink::Point::Par sinkPar; + sinkPar.mom = "0 0 0"; + application.createModule("sink", sinkPar); + + // set fermion boundary conditions to be periodic space, antiperiodic time. + std::string boundary = "1 1 1 -1"; + + //stochastic photon field + MGauge::StochEm::Par photonPar; + photonPar.gauge = PhotonR::Gauge::feynman; + photonPar.zmScheme = PhotonR::ZmScheme::qedL; + application.createModule("ph_field", photonPar); + + + + for (unsigned int i = 0; i < flavour.size(); ++i) + { + // actions + MAction::DWF::Par actionPar; + actionPar.gauge = "gauge"; + actionPar.Ls = 8; + actionPar.M5 = 1.8; + actionPar.mass = mass[i]; + actionPar.boundary = boundary; + application.createModule("DWF_" + flavour[i], actionPar); + + + // solvers + MSolver::RBPrecCG::Par solverPar; + solverPar.action = "DWF_" + flavour[i]; + solverPar.residual = 1.0e-8; + application.createModule("CG_" + flavour[i], + solverPar); + + // propagators + MFermion::GaugeProp::Par quarkPar; + quarkPar.solver = "CG_" + flavour[i]; + quarkPar.source = "pt"; + application.createModule("Qpt_" + flavour[i], + quarkPar); + + + //seq sources with tadpole insertion + MSource::SeqConserved::Par seqPar_T; + seqPar_T.q = "Qpt_" + flavour[i] + "_5d"; + seqPar_T.action = "DWF_" + flavour[i]; + seqPar_T.tA = 0; + seqPar_T.tB = nt-1; + seqPar_T.curr_type = Current::Tadpole; + seqPar_T.mu_min = 0; + seqPar_T.mu_max = 3; + seqPar_T.mom = "0. 0. 0. 0."; + application.createModule("Qpt_" + flavour[i] + + "_seq_T", seqPar_T); + // seq propagator with tadpole insertion + MFermion::GaugeProp::Par quarkPar_seq_T; + quarkPar_seq_T.solver = "CG_" + flavour[i]; + quarkPar_seq_T.source = "Qpt_" + flavour[i] + "_seq_T"; + application.createModule("Qpt_" + flavour[i] + + "_seq_T" + flavour[i], + quarkPar_seq_T); + + + + //seq sources with conserved vector and photon insertion + MSource::SeqConserved::Par seqPar_V; + seqPar_V.q = "Qpt_" + flavour[i] + "_5d"; + seqPar_V.action = "DWF_" + flavour[i]; + seqPar_V.tA = 0; + seqPar_V.tB = nt-1; + seqPar_V.curr_type = Current::Vector; + seqPar_V.mu_min = 0; + seqPar_V.mu_max = 3; + seqPar_V.mom = "0. 0. 0. 0."; + seqPar_V.photon = "ph_field"; + application.createModule("Qpt_" + flavour[i] + + "_seq_V_ph", seqPar_V); + // seq propagator with conserved vector and photon insertion + MFermion::GaugeProp::Par quarkPar_seq_V; + quarkPar_seq_V.solver = "CG_" + flavour[i]; + quarkPar_seq_V.source = "Qpt_" + flavour[i] + "_seq_V_ph"; + application.createModule("Qpt_" + flavour[i] + + "_seq_V_ph_" + flavour[i], + quarkPar_seq_V); + + + + //double seq sources with conserved vector and photon insertion + //(for self energy) + MSource::SeqConserved::Par seqPar_VV; + seqPar_VV.q = "Qpt_" + flavour[i] + "_seq_V_ph_" + + flavour[i] + "_5d"; + seqPar_VV.action = "DWF_" + flavour[i]; + seqPar_VV.tA = 0; + seqPar_VV.tB = nt-1; + seqPar_VV.curr_type = Current::Vector; + seqPar_VV.mu_min = 0; + seqPar_VV.mu_max = 3; + seqPar_VV.mom = "0. 0. 0. 0."; + seqPar_VV.photon = "ph_field"; + application.createModule("Qpt_" + flavour[i] + + "_seq_V_ph" + flavour[i] + + "_seq_V_ph", seqPar_VV); + //double seq propagator with conserved vector and photon insertion + MFermion::GaugeProp::Par quarkPar_seq_VV; + quarkPar_seq_VV.solver = "CG_" + flavour[i]; + quarkPar_seq_VV.source = "Qpt_" + flavour[i] + "_seq_V_ph" + + flavour[i] + "_seq_V_ph"; + application.createModule("Qpt_" + flavour[i] + + "_seq_V_ph_" + flavour[i] + + "_seq_V_ph_" + flavour[i], + quarkPar_seq_VV); + + + + } + for (unsigned int i = 0; i < flavour.size(); ++i) + for (unsigned int j = i; j < flavour.size(); ++j) + { + //2pt function contraction + MContraction::Meson::Par mesPar; + mesPar.output = "QED/pt_" + flavour[i] + flavour[j]; + mesPar.q1 = "Qpt_" + flavour[i]; + mesPar.q2 = "Qpt_" + flavour[j]; + mesPar.gammas = ""; + mesPar.sink = "sink"; + application.createModule("meson_pt_" + + flavour[i] + flavour[j], + mesPar); + + + + //tadpole contraction + MContraction::Meson::Par mesPar_seq_T; + mesPar_seq_T.output = "QED/tadpole_pt_" + flavour[i] + "_T_" + + flavour[i] + "__" + flavour[j]; + mesPar_seq_T.q1 = "Qpt_" + flavour[i] + "_seq_T" + flavour[i]; + mesPar_seq_T.q2 = "Qpt_" + flavour[j]; + mesPar_seq_T.gammas = ""; + mesPar_seq_T.sink = "sink"; + application.createModule("meson_tadpole_pt_" + + flavour[i] + "_seq_T" + + flavour[i] + flavour[j], + mesPar_seq_T); + + + + //photon exchange contraction + MContraction::Meson::Par mesPar_seq_E; + mesPar_seq_E.output = "QED/exchange_pt_" + flavour[i] + "_V_ph_" + + flavour[i] + "__" + flavour[j] + "_V_ph_" + + flavour[j]; + mesPar_seq_E.q1 = "Qpt_" + flavour[i] + "_seq_V_ph_" + flavour[i]; + mesPar_seq_E.q2 = "Qpt_" + flavour[j] + "_seq_V_ph_" + flavour[j]; + mesPar_seq_E.gammas = ""; + mesPar_seq_E.sink = "sink"; + application.createModule("meson_exchange_pt_" + + flavour[i] + "_seq_V_ph_" + flavour[i] + + flavour[j] + "_seq_V_ph_" + flavour[j], + mesPar_seq_E); + + + + //self energy contraction + MContraction::Meson::Par mesPar_seq_S; + mesPar_seq_S.output = "QED/selfenergy_pt_" + flavour[i] + "_V_ph_" + + flavour[i] + "_V_ph_" + flavour[i] + "__" + + flavour[j]; + mesPar_seq_S.q1 = "Qpt_" + flavour[i] + "_seq_V_ph_" + flavour[i] + + "_seq_V_ph_" + flavour[i]; + mesPar_seq_S.q2 = "Qpt_" + flavour[j]; + mesPar_seq_S.gammas = ""; + mesPar_seq_S.sink = "sink"; + application.createModule("meson_selfenergy_pt_" + + flavour[i] + "_seq_V_ph_" + + flavour[i] + "_seq_V_ph_" + + flavour[i] + flavour[j], + mesPar_seq_S); + + } + + + + + // execution + application.saveParameterFile("QED.xml"); + application.run(); + + // epilogue + LOG(Message) << "Grid is finalizing now" << std::endl; + Grid_finalize(); + + return EXIT_SUCCESS; +} From c96483e3bd559ab4a20c12102534c37447179b4c Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 13 Feb 2018 11:39:07 +0000 Subject: [PATCH 139/620] Whitespace only change --- lib/algorithms/iterative/LocalCoherenceLanczos.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/lib/algorithms/iterative/LocalCoherenceLanczos.h index c530a572..4c05f4c7 100644 --- a/lib/algorithms/iterative/LocalCoherenceLanczos.h +++ b/lib/algorithms/iterative/LocalCoherenceLanczos.h @@ -28,7 +28,9 @@ Author: paboyle /* END LEGAL */ #ifndef GRID_LOCAL_COHERENCE_IRL_H #define GRID_LOCAL_COHERENCE_IRL_H + namespace Grid { + struct LanczosParams : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(LanczosParams, From d55212c998bba55b78bb676eb8a33f86fe6825cc Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Wed, 14 Feb 2018 10:45:18 +0000 Subject: [PATCH 140/620] restructure SeqConservedCurrent for DWF to need less memory --- lib/qcd/action/fermion/WilsonFermion5D.cc | 96 ++++++++++------------- 1 file changed, 43 insertions(+), 53 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/lib/qcd/action/fermion/WilsonFermion5D.cc index 92280c13..6b830a03 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.cc +++ b/lib/qcd/action/fermion/WilsonFermion5D.cc @@ -883,8 +883,7 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, { conformable(q_in._grid, FermionGrid()); conformable(q_in._grid, q_out._grid); - PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()), - tmp(FermionGrid()); + PropagatorField tmp(GaugeGrid()),tmp2(GaugeGrid()); Complex i(0.0, 1.0); unsigned int tshift = (mu == Tp) ? 1 : 0; unsigned int LLs = q_in._grid->_rdimensions[0]; @@ -895,69 +894,60 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, LatticeCoordinate(coords, Tp); - //QED: photon field is 4dim, but need a 5dim object to multiply to - // DWF PropagatorField - Lattice> lattice_cmplx_5d(FermionGrid()); for (unsigned int s = 0; s < LLs; ++s) - { - InsertSlice(lattice_cmplx,lattice_cmplx_5d, s, 0); - } - - - - // Need q(x + mu, s) and q(x - mu, s). 5D lattice so shift 4D coordinate mu - // by one. - tmp = Cshift(q_in, mu + 1, 1); - tmpFwd = tmp*lattice_cmplx_5d; - tmp = lattice_cmplx_5d*q_in; - tmpBwd = Cshift(tmp, mu + 1, -1); - - parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) { - // Compute the sequential conserved current insertion only if our simd - // object contains a timeslice we need. - vInteger t_mask = ((coords._odata[sU] >= tmin) && - (coords._odata[sU] <= tmax)); - Integer timeSlices = Reduce(t_mask); + bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); + bool tadpole_sign = (curr_type == Current::Tadpole); + bool switch_sgn = tadpole_sign || axial_sign; - if (timeSlices > 0) - { - unsigned int sF = sU * LLs; - for (unsigned int s = 0; s < LLs; ++s) + + //forward direction: Need q(x + mu, s)*A(x) + ExtractSlice(tmp2, q_in, s, 0); //q(x,s) + tmp = Cshift(tmp2, mu, 1); //q(x+mu,s) + tmp2 = tmp*lattice_cmplx; //q(x+mu,s)*A(x) + + parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) + { + // Compute the sequential conserved current insertion only if our simd + // object contains a timeslice we need. + vInteger t_mask = ((coords._odata[sU] >= tmin) && + (coords._odata[sU] <= tmax)); + Integer timeSlices = Reduce(t_mask); + + if (timeSlices > 0) { - bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); - bool tadpole_sign = (curr_type == Current::Tadpole); - bool switch_sgn = tadpole_sign || axial_sign; - - Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sF], - q_out._odata[sF], Umu, sU, - mu, t_mask, switch_sgn); - ++sF; + unsigned int sF = sU * LLs + s; + Kernels::SeqConservedCurrentSiteFwd(tmp2._odata[sU], + q_out._odata[sF], Umu, sU, + mu, t_mask, switch_sgn); } + } - // Repeat for backward direction. - t_mask = ((coords._odata[sU] >= (tmin + tshift)) && - (coords._odata[sU] <= (tmax + tshift))); + //backward direction: Need q(x - mu, s)*A(x-mu) + ExtractSlice(tmp2, q_in, s, 0); //q(x,s) + tmp = lattice_cmplx*tmp2; //q(x,s)*A(x) + tmp2 = Cshift(tmp, mu, -1); //q(x-mu,s)*A(x-mu,s) - //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3) - unsigned int t0 = 0; - if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 )); + parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) + { + vInteger t_mask = ((coords._odata[sU] >= (tmin + tshift)) && + (coords._odata[sU] <= (tmax + tshift))); - timeSlices = Reduce(t_mask); + //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3) + unsigned int t0 = 0; + if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 )); - if (timeSlices > 0) - { - unsigned int sF = sU * LLs; - for (unsigned int s = 0; s < LLs; ++s) + Integer timeSlices = Reduce(t_mask); + + if (timeSlices > 0) { - bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); - Kernels::SeqConservedCurrentSiteBwd(tmpBwd._odata[sF], - q_out._odata[sF], Umu, sU, - mu, t_mask, axial_sign); - ++sF; + unsigned int sF = sU * LLs + s; + Kernels::SeqConservedCurrentSiteBwd(tmp2._odata[sU], + q_out._odata[sF], Umu, sU, + mu, t_mask, axial_sign); } - } + } } } From 4680a977c3e961f949eed3b8ee1116f8839197b5 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 14 Feb 2018 16:30:09 +0000 Subject: [PATCH 141/620] QedFVol: set infinite-volume photon propagator to 1 at x=0, so that momentum-spage photon propagator is non-negative. Need to check whether this is sufficient for all volumes. --- lib/qcd/action/gauge/Photon.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 76211b06..4f86deb2 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -109,7 +109,7 @@ namespace QCD{ std::vector &l = grid->_fdimensions; std::vector x0(nd,0); TComplex Tone = Complex(1.0,0.0); - TComplex Tzero = Complex(0.0,0.0); + // TComplex Tzero = Complex(0.0,0.0); FFT fft(grid); one = Complex(1.0,0.0); @@ -122,7 +122,7 @@ namespace QCD{ } pokeSite(Tone, out, x0); out = one/out; - pokeSite(Tzero, out, x0); + // pokeSite(Tzero, out, x0); fft.FFT_all_dim(out, out, FFT::forward); } From 69e4ecc1d27c76c79d2e8951d75961ba1e002347 Mon Sep 17 00:00:00 2001 From: James Harrison Date: Wed, 14 Feb 2018 17:37:18 +0000 Subject: [PATCH 142/620] QedFVol: Fix single precision build error --- lib/qcd/action/gauge/Photon.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 4f86deb2..2bdf70dd 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -117,7 +117,8 @@ namespace QCD{ for(int mu = 0; mu < nd; mu++) { LatticeCoordinate(xmu,mu); - xmu = where(xmu < l[mu]/2.0, xmu, xmu-double(l[mu])); + Real lo2 = l[mu]/2.0; + xmu = where(xmu < lo2, xmu, xmu-double(l[mu])); out = out + toComplex(4*M_PI*M_PI*xmu*xmu); } pokeSite(Tone, out, x0); From e30a80a2340275774e464b5ce7b328f0ece84b44 Mon Sep 17 00:00:00 2001 From: Christopher Kelly Date: Thu, 15 Feb 2018 17:13:36 +0000 Subject: [PATCH 143/620] Relaxed constraints on MPI thread mode when not using multiple comms threads --- lib/communicator/Communicator_mpi3.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/communicator/Communicator_mpi3.cc b/lib/communicator/Communicator_mpi3.cc index 6732dcdf..eb0144f0 100644 --- a/lib/communicator/Communicator_mpi3.cc +++ b/lib/communicator/Communicator_mpi3.cc @@ -44,7 +44,10 @@ void CartesianCommunicator::Init(int *argc, char ***argv) MPI_Initialized(&flag); // needed to coexist with other libs apparently if ( !flag ) { MPI_Init_thread(argc,argv,MPI_THREAD_MULTIPLE,&provided); - assert (provided == MPI_THREAD_MULTIPLE); + //If only 1 comms thread we require any threading mode other than SINGLE, but for multiple comms threads we need MULTIPLE + if( (nCommThreads == 1 && provided == MPI_THREAD_SINGLE) || + (nCommThreads > 1 && provided != MPI_THREAD_MULTIPLE) ) + assert(0); } Grid_quiesce_nodes(); From 945684c470845d826fdbb8511ddf098a90779188 Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 20 Feb 2018 14:28:38 +0000 Subject: [PATCH 144/620] updates for deflation in the RB solver --- lib/algorithms/Algorithms.h | 1 + .../iterative/ImplicitlyRestartedLanczos.h | 19 ----------- .../iterative/LocalCoherenceLanczos.h | 16 +-------- lib/algorithms/iterative/SchurRedBlack.h | 33 ++++++++++++++++--- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/lib/algorithms/Algorithms.h b/lib/algorithms/Algorithms.h index 070a1019..ef147c53 100644 --- a/lib/algorithms/Algorithms.h +++ b/lib/algorithms/Algorithms.h @@ -39,6 +39,7 @@ Author: Peter Boyle #include #include +#include #include #include #include diff --git a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h index 7d5a1889..787cf15a 100644 --- a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h +++ b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h @@ -149,19 +149,6 @@ void basisSortInPlace(std::vector & _v,std::vector& sort_vals, boo basisReorderInPlace(_v,sort_vals,idx); } -// PAB: faster to compute the inner products first then fuse loops. -// If performance critical can improve. -template -void basisDeflate(const std::vector &_v,const std::vector& eval,const Field& src_orig,Field& result) { - result = zero; - assert(_v.size()==eval.size()); - int N = (int)_v.size(); - for (int i=0;i &_v, - const std::vector& eval, - const Field& src_orig,Field& result) { - basisDeflate(_v,eval,src_orig,result); - } - ////////////////////////////////////////////////////////////////// // PAB: ////////////////////////////////////////////////////////////////// diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/lib/algorithms/iterative/LocalCoherenceLanczos.h index 4c05f4c7..b8348c0c 100644 --- a/lib/algorithms/iterative/LocalCoherenceLanczos.h +++ b/lib/algorithms/iterative/LocalCoherenceLanczos.h @@ -31,6 +31,7 @@ Author: paboyle namespace Grid { + struct LanczosParams : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(LanczosParams, @@ -240,21 +241,6 @@ private: std::vector _evec_coarse; public: - static void Deflate(std::vector subspace, - std::vector evec_coarse, - std::vector eval_coarse, - const FineField& src_orig,FineField& result) - { - int N = (int)evec_coarse.size(); - CoarseField src_coarse(evec_coarse[0]._grid); - CoarseField res_coarse(evec_coarse[0]._grid); res_coarse = zero; - blockProject(src_orig,src_coarse,subspace); - for (int i=0;i - void operator() (Matrix & _Matrix,const Field &in, Field &out){ + void operator() (Matrix & _Matrix,const Field &in, Field &out){ + ZeroGuesser guess; + (*this)(_Matrix,in,out,guess); + } + template + void operator() (Matrix & _Matrix,const Field &in, Field &out, Guesser &guess){ // FIXME CGdiagonalMee not implemented virtual function // FIXME use CBfactorise to control schur decomp @@ -129,7 +134,6 @@ namespace Grid { pickCheckerboard(Odd ,src_o,in); pickCheckerboard(Even,sol_e,out); pickCheckerboard(Odd ,sol_o,out); - std::cout << GridLogMessage << " SchurRedBlackStaggeredSolve checkerboards picked" < - void operator() (Matrix & _Matrix,const Field &in, Field &out){ + void operator() (Matrix & _Matrix,const Field &in, Field &out){ + ZeroGuesser guess; + (*this)(_Matrix,in,out,guess); + } + template + void operator() (Matrix & _Matrix,const Field &in, Field &out,Guesser &guess){ // FIXME CGdiagonalMee not implemented virtual function // FIXME use CBfactorise to control schur decomp @@ -225,6 +235,7 @@ namespace Grid { // Call the red-black solver ////////////////////////////////////////////////////////////// std::cout< - void operator() (Matrix & _Matrix,const Field &in, Field &out){ + void operator() (Matrix & _Matrix,const Field &in, Field &out){ + ZeroGuesser guess; + (*this)(_Matrix,in,out,guess); + } + template + void operator() (Matrix & _Matrix,const Field &in, Field &out,Guesser &guess){ // FIXME CGdiagonalMee not implemented virtual function // FIXME use CBfactorise to control schur decomp @@ -305,6 +321,7 @@ namespace Grid { ////////////////////////////////////////////////////////////// std::cout< - void operator() (Matrix & _Matrix,const Field &in, Field &out){ + void operator() (Matrix & _Matrix,const Field &in, Field &out){ + ZeroGuesser guess; + (*this)(_Matrix,in,out,guess); + } + template + void operator() (Matrix & _Matrix,const Field &in, Field &out,Guesser &guess){ // FIXME CGdiagonalMee not implemented virtual function // FIXME use CBfactorise to control schur decomp @@ -385,6 +407,7 @@ namespace Grid { std::cout< Date: Tue, 20 Feb 2018 14:29:08 +0000 Subject: [PATCH 145/620] Deflation interface for solvers --- lib/algorithms/iterative/Deflation.h | 101 +++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 lib/algorithms/iterative/Deflation.h diff --git a/lib/algorithms/iterative/Deflation.h b/lib/algorithms/iterative/Deflation.h new file mode 100644 index 00000000..b6aa0d3d --- /dev/null +++ b/lib/algorithms/iterative/Deflation.h @@ -0,0 +1,101 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./lib/algorithms/iterative/ImplicitlyRestartedLanczos.h + + Copyright (C) 2015 + +Author: Peter Boyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#ifndef GRID_DEFLATION_H +#define GRID_DEFLATION_H + +namespace Grid { + +struct ZeroGuesser { +public: + template + void operator()(const Field &src,Field &guess) { guess = Zero(); }; +}; +struct SourceGuesser { +public: + template + void operator()(const Field &src,Field &guess) { guess = src; }; +}; + +//////////////////////////////// +// Fine grid deflation +//////////////////////////////// +template +struct DeflatedGuesser { +private: + const std::vector &evec; + const std::vector &eval; + +public: + + DeflatedGuesser(const std::vector & _evec,const std::vector & _eval) : evec(_evec), eval(_eval) {}; + + void operator()(const Field &src,Field &guess) { + guess = zero; + assert(evec.size()==eval.size()); + auto N = evec.size(); + for (int i=0;i +class LocalCoherenceDeflatedGuesser { +private: + const std::vector &subspace; + const std::vector &evec_coarse; + const std::vector &eval_coarse; +public: + + LocalCoherenceDeflatedGuesser(const std::vector &_subspace, + const std::vector &_evec_coarse, + const std::vector &_eval_coarse) + : subspace(_subspace), + evec_coarse(_evec_coarse), + eval_coarse(_eval_coarse) + { + } + + void operator()(const FineField &src,FineField &guess) { + int N = (int)evec_coarse.size(); + CoarseField src_coarse(evec_coarse[0]._grid); + CoarseField guess_coarse(evec_coarse[0]._grid); guess_coarse = zero; + blockProject(src,src_coarse,subspace); + for (int i=0;i Date: Tue, 20 Feb 2018 15:12:31 +0000 Subject: [PATCH 146/620] Extra communicator free that I had missed. Hard to audit them all as this is complex --- lib/communicator/Communicator_mpi3.cc | 12 ++++++++++-- lib/communicator/SharedMemory.h | 1 + lib/communicator/SharedMemoryMPI.cc | 4 ++++ lib/communicator/SharedMemoryNone.cc | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/communicator/Communicator_mpi3.cc b/lib/communicator/Communicator_mpi3.cc index eb0144f0..424b7973 100644 --- a/lib/communicator/Communicator_mpi3.cc +++ b/lib/communicator/Communicator_mpi3.cc @@ -89,10 +89,16 @@ void CartesianCommunicator::ProcessorCoorFromRank(int rank, std::vector &c CartesianCommunicator::CartesianCommunicator(const std::vector &processors) { MPI_Comm optimal_comm; - GlobalSharedMemory::OptimalCommunicator (processors,optimal_comm); // Remap using the shared memory optimising routine + //////////////////////////////////////////////////// + // Remap using the shared memory optimising routine + // The remap creates a comm which must be freed + //////////////////////////////////////////////////// + GlobalSharedMemory::OptimalCommunicator (processors,optimal_comm); InitFromMPICommunicator(processors,optimal_comm); SetCommunicator(optimal_comm); + /////////////////////////////////////////////////// // Free the temp communicator + /////////////////////////////////////////////////// MPI_Comm_free(&optimal_comm); } @@ -202,8 +208,10 @@ CartesianCommunicator::CartesianCommunicator(const std::vector &processors, // Take the right SHM buffers ////////////////////////////////////////////////////////////////////////////////////////////////////// SetCommunicator(comm_split); - + + /////////////////////////////////////////////// // Free the temp communicator + /////////////////////////////////////////////// MPI_Comm_free(&comm_split); if(0){ diff --git a/lib/communicator/SharedMemory.h b/lib/communicator/SharedMemory.h index 0f647dc6..9f6b1a25 100644 --- a/lib/communicator/SharedMemory.h +++ b/lib/communicator/SharedMemory.h @@ -133,6 +133,7 @@ class SharedMemory public: SharedMemory() {}; + ~SharedMemory(); /////////////////////////////////////////////////////////////////////////////////////// // set the buffers & sizes /////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index 2a62b7ac..9e5d8f15 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -399,5 +399,9 @@ void *SharedMemory::ShmBufferTranslate(int rank,void * local_p) return (void *) remote; } } +SharedMemory::~SharedMemory() +{ + MPI_Comm_free(&ShmComm); +}; } diff --git a/lib/communicator/SharedMemoryNone.cc b/lib/communicator/SharedMemoryNone.cc index 7feed7e4..a23e3c1c 100644 --- a/lib/communicator/SharedMemoryNone.cc +++ b/lib/communicator/SharedMemoryNone.cc @@ -122,5 +122,7 @@ void *SharedMemory::ShmBufferTranslate(int rank,void * local_p) { return NULL; } +SharedMemory::~SharedMemory() +{}; } From 0f468e2179d533c55b823c65ea0165e98500a3b0 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Thu, 22 Feb 2018 12:50:09 +0000 Subject: [PATCH 147/620] OverlappedComm for Staggered 5D and 4D. --- lib/algorithms/iterative/ConjugateGradient.h | 8 +- lib/qcd/action/fermion/FermionOperatorImpl.h | 73 +++++----- .../fermion/ImprovedStaggeredFermion.cc | 126 ++++++++++++++++-- .../action/fermion/ImprovedStaggeredFermion.h | 16 ++- .../fermion/ImprovedStaggeredFermion5D.cc | 67 +++++++++- .../fermion/ImprovedStaggeredFermion5D.h | 23 +++- tests/solver/Test_staggered_block_cg_prec.cc | 5 +- .../solver/Test_staggered_block_cg_unprec.cc | 7 +- tests/solver/Test_staggered_cg_prec.cc | 5 +- tests/solver/Test_staggered_cg_schur.cc | 5 +- tests/solver/Test_staggered_cg_unprec.cc | 5 +- 11 files changed, 269 insertions(+), 71 deletions(-) diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index 0d4e51c7..e1c796cd 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -54,6 +54,7 @@ class ConjugateGradient : public OperatorFunction { void operator()(LinearOperatorBase &Linop, const Field &src, Field &psi) { + psi.checkerboard = src.checkerboard; conformable(psi, src); @@ -101,7 +102,7 @@ class ConjugateGradient : public OperatorFunction { SolverTimer.Start(); int k; - for (k = 1; k <= MaxIterations; k++) { + for (k = 1; k <= MaxIterations*1000; k++) { c = cp; MatrixTimer.Start(); @@ -109,8 +110,9 @@ class ConjugateGradient : public OperatorFunction { MatrixTimer.Stop(); LinalgTimer.Start(); - // RealD qqck = norm2(mmp); - // ComplexD dck = innerProduct(p,mmp); + // AA + // RealD qqck = norm2(mmp); + // ComplexD dck = innerProduct(p,mmp); a = c / d; b_pred = a * (a * qq - d) / c; diff --git a/lib/qcd/action/fermion/FermionOperatorImpl.h b/lib/qcd/action/fermion/FermionOperatorImpl.h index 9d24deb2..42f222ac 100644 --- a/lib/qcd/action/fermion/FermionOperatorImpl.h +++ b/lib/qcd/action/fermion/FermionOperatorImpl.h @@ -689,7 +689,12 @@ class StaggeredImpl : public PeriodicGaugeImpl(U_ds, U, mu); + } inline void DoubleStore(GridBase *GaugeGrid, DoubledGaugeField &UUUds, // for Naik term DoubledGaugeField &Uds, @@ -728,8 +733,10 @@ class StaggeredImpl : public PeriodicGaugeImpl(Uds, U, mu); - PokeIndex(Uds, Udag, mu + 4); + InsertGaugeField(Uds,U,mu); + InsertGaugeField(Uds,Udag,mu+4); + // PokeIndex(Uds, U, mu); + // PokeIndex(Uds, Udag, mu + 4); // 3 hop based on thin links. Crazy huh ? U = PeekIndex(Uthin, mu); @@ -741,8 +748,8 @@ class StaggeredImpl : public PeriodicGaugeImpl(UUUds, UUU, mu); - PokeIndex(UUUds, UUUdag, mu+4); + InsertGaugeField(UUUds,UUU,mu); + InsertGaugeField(UUUds,UUUdag,mu+4); } } @@ -834,6 +841,23 @@ class StaggeredImpl : public PeriodicGaugeImpllSites(); lidx++) { + + SiteScalarGaugeLink ScalarU; + SiteDoubledGaugeField ScalarUds; + + std::vector lcoor; + GaugeGrid->LocalIndexToLocalCoor(lidx, lcoor); + peekLocalSite(ScalarUds, U_ds, lcoor); + + peekLocalSite(ScalarU, U, lcoor); + ScalarUds(mu) = ScalarU(); + + } + } inline void DoubleStore(GridBase *GaugeGrid, DoubledGaugeField &UUUds, // for Naik term DoubledGaugeField &Uds, @@ -875,23 +899,8 @@ class StaggeredImpl : public PeriodicGaugeImpllSites(); lidx++) { - SiteScalarGaugeLink ScalarU; - SiteDoubledGaugeField ScalarUds; - - std::vector lcoor; - GaugeGrid->LocalIndexToLocalCoor(lidx, lcoor); - peekLocalSite(ScalarUds, Uds, lcoor); - - peekLocalSite(ScalarU, U, lcoor); - ScalarUds(mu) = ScalarU(); - - peekLocalSite(ScalarU, Udag, lcoor); - ScalarUds(mu + 4) = ScalarU(); - - pokeLocalSite(ScalarUds, Uds, lcoor); - } + InsertGaugeField(Uds,U,mu); + InsertGaugeField(Uds,Udag,mu+4); // 3 hop based on thin links. Crazy huh ? U = PeekIndex(Uthin, mu); @@ -903,24 +912,8 @@ class StaggeredImpl : public PeriodicGaugeImpllSites(); lidx++) { - - SiteScalarGaugeLink ScalarU; - SiteDoubledGaugeField ScalarUds; - - std::vector lcoor; - GaugeGrid->LocalIndexToLocalCoor(lidx, lcoor); - - peekLocalSite(ScalarUds, UUUds, lcoor); - - peekLocalSite(ScalarU, UUU, lcoor); - ScalarUds(mu) = ScalarU(); - - peekLocalSite(ScalarU, UUUdag, lcoor); - ScalarUds(mu + 4) = ScalarU(); - - pokeLocalSite(ScalarUds, UUUds, lcoor); - } + InsertGaugeField(UUUds,UUU,mu); + InsertGaugeField(UUUds,UUUdag,mu+4); } } diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc index 5ce2b335..811e482d 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc @@ -44,6 +44,7 @@ ImprovedStaggeredFermionStatic::displacements({1, 1, 1, 1, -1, -1, -1, -1, 3, 3, template ImprovedStaggeredFermion::ImprovedStaggeredFermion(GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, + RealD _c1, RealD _c2,RealD _u0, const ImplParams &p) : Kernels(p), _grid(&Fgrid), @@ -62,6 +63,16 @@ ImprovedStaggeredFermion::ImprovedStaggeredFermion(GridCartesian &Fgrid, G UUUmuOdd(&Hgrid) , _tmp(&Hgrid) { + int vol4; + int LLs=1; + c1=_c1; + c2=_c2; + u0=_u0; + vol4= _grid->oSites(); + Stencil.BuildSurfaceList(LLs,vol4); + vol4= _cbgrid->oSites(); + StencilEven.BuildSurfaceList(LLs,vol4); + StencilOdd.BuildSurfaceList(LLs,vol4); } template @@ -69,18 +80,15 @@ ImprovedStaggeredFermion::ImprovedStaggeredFermion(GaugeField &_Uthin, Gau GridRedBlackCartesian &Hgrid, RealD _mass, RealD _c1, RealD _c2,RealD _u0, const ImplParams &p) - : ImprovedStaggeredFermion(Fgrid,Hgrid,_mass,p) + : ImprovedStaggeredFermion(Fgrid,Hgrid,_mass,_c1,_c2,_u0,p) { - c1=_c1; - c2=_c2; - u0=_u0; ImportGauge(_Uthin,_Ufat); } template -ImprovedStaggeredFermion::ImprovedStaggeredFermion(GaugeField &_Uthin,GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid, +ImprovedStaggeredFermion::ImprovedStaggeredFermion(GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, const ImplParams &p) - : ImprovedStaggeredFermion(Fgrid,Hgrid,_mass,p) + : ImprovedStaggeredFermion(Fgrid,Hgrid,_mass,1.0,1.0,1.0,p) { ImportGaugeSimple(_Utriple,_Ufat); } @@ -374,20 +382,116 @@ void ImprovedStaggeredFermion::DhopInternal(StencilImpl &st, LebesgueOrder DoubledGaugeField &U, DoubledGaugeField &UUU, const FermionField &in, - FermionField &out, int dag) { + FermionField &out, int dag) +{ +#ifdef GRID_OMP + if ( StaggeredKernelsStatic::Comms == StaggeredKernelsStatic::CommsAndCompute ) + DhopInternalOverlappedComms(st,lo,U,UUU,in,out,dag); + else +#endif + DhopInternalSerialComms(st,lo,U,UUU,in,out,dag); +} +template +void ImprovedStaggeredFermion::DhopInternalOverlappedComms(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, + DoubledGaugeField &UUU, + const FermionField &in, + FermionField &out, int dag) +{ +#ifdef GRID_OMP + Compressor compressor; + int len = U._grid->oSites(); + const int LLs = 1; + + st.Prepare(); + st.HaloGather(in,compressor); + st.CommsMergeSHM(compressor); + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // Ugly explicit thread mapping introduced for OPA reasons. + ////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma omp parallel + { + int tid = omp_get_thread_num(); + int nthreads = omp_get_num_threads(); + int ncomms = CartesianCommunicator::nCommThreads; + if (ncomms == -1) ncomms = 1; + assert(nthreads > ncomms); + + if (tid >= ncomms) { + nthreads -= ncomms; + int ttid = tid - ncomms; + int n = len; + int chunk = n / nthreads; + int rem = n % nthreads; + int myblock, myn; + if (ttid < rem) { + myblock = ttid * chunk + ttid; + myn = chunk+1; + } else { + myblock = ttid*chunk + rem; + myn = chunk; + } + + // do the compute + if (dag == DaggerYes) { + for (int ss = myblock; ss < myblock+myn; ++ss) { + int sU = ss; + // Interior = 1; Exterior = 0; must implement for staggered + Kernels::DhopSiteDag(st,lo,U,UUU,st.CommBuf(),1,sU,in,out,1,0); + } + } else { + for (int ss = myblock; ss < myblock+myn; ++ss) { + // Interior = 1; Exterior = 0; + int sU = ss; + Kernels::DhopSite(st,lo,U,UUU,st.CommBuf(),1,sU,in,out,1,0); + } + } + } else { + st.CommunicateThreaded(); + } + } + + // First to enter, last to leave timing + st.CommsMerge(compressor); + + if (dag == DaggerYes) { + int sz=st.surface_list.size(); + parallel_for (int ss = 0; ss < sz; ss++) { + int sU = st.surface_list[ss]; + Kernels::DhopSiteDag(st,lo,U,UUU,st.CommBuf(),1,sU,in,out,0,1); + } + } else { + int sz=st.surface_list.size(); + parallel_for (int ss = 0; ss < sz; ss++) { + int sU = st.surface_list[ss]; + Kernels::DhopSite(st,lo,U,UUU,st.CommBuf(),1,sU,in,out,0,1); + } + } +#else + assert(0); +#endif +} + + +template +void ImprovedStaggeredFermion::DhopInternalSerialComms(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, + DoubledGaugeField &UUU, + const FermionField &in, + FermionField &out, int dag) +{ assert((dag == DaggerNo) || (dag == DaggerYes)); Compressor compressor; st.HaloExchange(in, compressor); if (dag == DaggerYes) { - PARALLEL_FOR_LOOP - for (int sss = 0; sss < in._grid->oSites(); sss++) { + parallel_for (int sss = 0; sss < in._grid->oSites(); sss++) { Kernels::DhopSiteDag(st, lo, U, UUU, st.CommBuf(), 1, sss, in, out); } } else { - PARALLEL_FOR_LOOP - for (int sss = 0; sss < in._grid->oSites(); sss++) { + parallel_for (int sss = 0; sss < in._grid->oSites(); sss++) { Kernels::DhopSite(st, lo, U, UUU, st.CommBuf(), 1, sss, in, out); } } diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h index 7d1f2996..69d0aef4 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h @@ -105,21 +105,31 @@ class ImprovedStaggeredFermion : public StaggeredKernels, public ImprovedS void DhopInternal(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,DoubledGaugeField &UUU, const FermionField &in, FermionField &out, int dag); + void DhopInternalSerialComms(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,DoubledGaugeField &UUU, + const FermionField &in, FermionField &out, int dag); + void DhopInternalOverlappedComms(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,DoubledGaugeField &UUU, + const FermionField &in, FermionField &out, int dag); // Constructor ImprovedStaggeredFermion(GaugeField &_Uthin, GaugeField &_Ufat, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, - RealD _c1=9.0/8.0, RealD _c2=-1.0/24.0,RealD _u0=1.0, + RealD _c1, RealD _c2,RealD _u0, const ImplParams &p = ImplParams()); - ImprovedStaggeredFermion(GaugeField &_Uthin, GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid, + ////////////////////////////////////////////////////////////////////////// + // MILC constructor no coefficients; premultiply links by desired scaling + ////////////////////////////////////////////////////////////////////////// + ImprovedStaggeredFermion(GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, const ImplParams &p = ImplParams()); + ////////////////////////////////////////////////////////////////////////// + // A don't initialise the gauge field constructor; largely internal + ////////////////////////////////////////////////////////////////////////// ImprovedStaggeredFermion(GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, + RealD _c1, RealD _c2,RealD _u0, const ImplParams &p = ImplParams()); - // DoubleStore impl dependent void ImportGaugeSimple(const GaugeField &_Utriple, const GaugeField &_Ufat); void ImportGauge(const GaugeField &_Uthin, const GaugeField &_Ufat); diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc index 2df4c044..e5146d7a 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc @@ -41,8 +41,7 @@ ImprovedStaggeredFermion5DStatic::displacements({1, 1, 1, 1, -1, -1, -1, -1, 3, // 5d lattice for DWF. template -ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Uthin,GaugeField &_Ufat, - GridCartesian &FiveDimGrid, +ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, @@ -121,18 +120,43 @@ ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Uthin, assert(FiveDimGrid._simd_layout[0] ==1); } - - // Allocate the required comms buffer - ImportGauge(_Uthin,_Ufat); - int LLs = FiveDimGrid._rdimensions[0]; int vol4= FourDimGrid.oSites(); Stencil.BuildSurfaceList(LLs,vol4); vol4=FourDimRedBlackGrid.oSites(); StencilEven.BuildSurfaceList(LLs,vol4); - StencilOdd.BuildSurfaceList(LLs,vol4); + StencilOdd.BuildSurfaceList(LLs,vol4); +} +template +ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Uthin,GaugeField &_Ufat, + GridCartesian &FiveDimGrid, + GridRedBlackCartesian &FiveDimRedBlackGrid, + GridCartesian &FourDimGrid, + GridRedBlackCartesian &FourDimRedBlackGrid, + RealD _mass, + RealD _c1,RealD _c2, RealD _u0, + const ImplParams &p) : + ImprovedStaggeredFermion5D(FiveDimGrid,FiveDimRedBlackGrid, + FourDimGrid,FourDimRedBlackGrid, + _mass,_c1,_c2,_u0,p) +{ + ImportGauge(_Uthin,_Ufat); +} +template +ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Utriple,GaugeField &_Ufat, + GridCartesian &FiveDimGrid, + GridRedBlackCartesian &FiveDimRedBlackGrid, + GridCartesian &FourDimGrid, + GridRedBlackCartesian &FourDimRedBlackGrid, + RealD _mass, + const ImplParams &p) : + ImprovedStaggeredFermion5D(FiveDimGrid,FiveDimRedBlackGrid, + FourDimGrid,FourDimRedBlackGrid, + _mass,1.0,1.0,1.0,p) +{ + ImportGaugeSimple(_Utriple,_Ufat); } template @@ -140,6 +164,35 @@ void ImprovedStaggeredFermion5D::ImportGauge(const GaugeField &_Uthin) { ImportGauge(_Uthin,_Uthin); }; +/////////////////////////////////////////////////// +// For MILC use; pass three link U's and 1 link U +/////////////////////////////////////////////////// +template +void ImprovedStaggeredFermion5D::ImportGaugeSimple(const GaugeField &_Utriple,const GaugeField &_Ufat) +{ + ///////////////////////////////////////////////////////////////// + // Trivial import; phases and fattening and such like preapplied + ///////////////////////////////////////////////////////////////// + for (int mu = 0; mu < Nd; mu++) { + + auto U = PeekIndex(_Utriple, mu); + Impl::InsertGaugeField(UUUmu,U,mu); + + U = adj( Cshift(U, mu, -3)); + Impl::InsertGaugeField(UUUmu,-U,mu+4); + + U = PeekIndex(_Ufat, mu); + Impl::InsertGaugeField(Umu,U,mu); + + U = adj( Cshift(U, mu, -1)); + Impl::InsertGaugeField(Umu,-U,mu+4); + + } + pickCheckerboard(Even, UmuEven, Umu); + pickCheckerboard(Odd, UmuOdd , Umu); + pickCheckerboard(Even, UUUmuEven,UUUmu); + pickCheckerboard(Odd, UUUmuOdd, UUUmu); +} template void ImprovedStaggeredFermion5D::ImportGauge(const GaugeField &_Uthin,const GaugeField &_Ufat) { diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h index e21142b8..f2fce1c1 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h @@ -139,6 +139,15 @@ namespace QCD { // Constructors + // -- No Gauge field + ImprovedStaggeredFermion5D(GridCartesian &FiveDimGrid, + GridRedBlackCartesian &FiveDimRedBlackGrid, + GridCartesian &FourDimGrid, + GridRedBlackCartesian &FourDimRedBlackGrid, + double _mass, + RealD _c1, RealD _c2,RealD _u0, + const ImplParams &p= ImplParams()); + // -- Thin link and fat link, with coefficients ImprovedStaggeredFermion5D(GaugeField &_Uthin, GaugeField &_Ufat, GridCartesian &FiveDimGrid, @@ -146,12 +155,24 @@ namespace QCD { GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, double _mass, - RealD _c1=9.0/8.0, RealD _c2=-1.0/24.0,RealD _u0=1.0, + RealD _c1, RealD _c2,RealD _u0, + const ImplParams &p= ImplParams()); + //////////////////////////////////////////////////////////////////////////////////////////////// + // MILC constructor ; triple links, no rescale factors; must be externally pre multiplied + //////////////////////////////////////////////////////////////////////////////////////////////// + ImprovedStaggeredFermion5D(GaugeField &_Utriple, + GaugeField &_Ufat, + GridCartesian &FiveDimGrid, + GridRedBlackCartesian &FiveDimRedBlackGrid, + GridCartesian &FourDimGrid, + GridRedBlackCartesian &FourDimRedBlackGrid, + double _mass, const ImplParams &p= ImplParams()); // DoubleStore void ImportGauge(const GaugeField &_U); void ImportGauge(const GaugeField &_Uthin,const GaugeField &_Ufat); + void ImportGaugeSimple(const GaugeField &_Uthin,const GaugeField &_Ufat); /////////////////////////////////////////////////////////////// // Data members require to support the functionality diff --git a/tests/solver/Test_staggered_block_cg_prec.cc b/tests/solver/Test_staggered_block_cg_prec.cc index 0076e5a0..98a5074e 100644 --- a/tests/solver/Test_staggered_block_cg_prec.cc +++ b/tests/solver/Test_staggered_block_cg_prec.cc @@ -75,7 +75,10 @@ int main (int argc, char ** argv) LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(pRNG,Umu); RealD mass=0.003; - ImprovedStaggeredFermion5DR Ds(Umu,Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass); + RealD c1=9.0/8.0; + RealD c2=-1.0/24.0; + RealD u0=1.0; + ImprovedStaggeredFermion5DR Ds(Umu,Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,c1,c2,u0); SchurStaggeredOperator HermOp(Ds); ConjugateGradient CG(1.0e-8,10000); diff --git a/tests/solver/Test_staggered_block_cg_unprec.cc b/tests/solver/Test_staggered_block_cg_unprec.cc index 22051ef6..32a1448c 100644 --- a/tests/solver/Test_staggered_block_cg_unprec.cc +++ b/tests/solver/Test_staggered_block_cg_unprec.cc @@ -74,7 +74,10 @@ int main (int argc, char ** argv) LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(pRNG,Umu); RealD mass=0.003; - ImprovedStaggeredFermion5DR Ds(Umu,Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass); + RealD c1=9.0/8.0; + RealD c2=-1.0/24.0; + RealD u0=1.0; + ImprovedStaggeredFermion5DR Ds(Umu,Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,c1,c2,u0); MdagMLinearOperator HermOp(Ds); ConjugateGradient CG(1.0e-8,10000); @@ -86,7 +89,7 @@ int main (int argc, char ** argv) std::cout << GridLogMessage << "****************************************************************** "< HermOp4d(Ds4d); FermionField src4d(UGrid); random(pRNG,src4d); FermionField result4d(UGrid); result4d=zero; diff --git a/tests/solver/Test_staggered_cg_prec.cc b/tests/solver/Test_staggered_cg_prec.cc index 6bea97c2..167958ed 100644 --- a/tests/solver/Test_staggered_cg_prec.cc +++ b/tests/solver/Test_staggered_cg_prec.cc @@ -71,7 +71,10 @@ int main (int argc, char ** argv) } RealD mass=0.003; - ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass); + RealD c1=9.0/8.0; + RealD c2=-1.0/24.0; + RealD u0=1.0; + ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass,c1,c2,u0); FermionField res_o(&RBGrid); FermionField src_o(&RBGrid); diff --git a/tests/solver/Test_staggered_cg_schur.cc b/tests/solver/Test_staggered_cg_schur.cc index a5c25b85..03a173f9 100644 --- a/tests/solver/Test_staggered_cg_schur.cc +++ b/tests/solver/Test_staggered_cg_schur.cc @@ -65,7 +65,10 @@ int main (int argc, char ** argv) FermionField resid(&Grid); RealD mass=0.1; - ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass); + RealD c1=9.0/8.0; + RealD c2=-1.0/24.0; + RealD u0=1.0; + ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass,c1,c2,u0); ConjugateGradient CG(1.0e-8,10000); SchurRedBlackStaggeredSolve SchurSolver(CG); diff --git a/tests/solver/Test_staggered_cg_unprec.cc b/tests/solver/Test_staggered_cg_unprec.cc index eb33c004..3fae925a 100644 --- a/tests/solver/Test_staggered_cg_unprec.cc +++ b/tests/solver/Test_staggered_cg_unprec.cc @@ -73,7 +73,10 @@ int main (int argc, char ** argv) } RealD mass=0.1; - ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass); + RealD c1=9.0/8.0; + RealD c2=-1.0/24.0; + RealD u0=1.0; + ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass,c1,c2,u0); MdagMLinearOperator HermOp(Ds); ConjugateGradient CG(1.0e-6,10000); From ec3954ff5f1549ef43f8c81b57565f3990c910cb Mon Sep 17 00:00:00 2001 From: James Harrison Date: Fri, 23 Feb 2018 14:53:05 +0000 Subject: [PATCH 148/620] QedFVol: Add input parameter G(x=0) for infinite-volume photon --- extras/Hadrons/Modules/MGauge/StochEm.cc | 2 +- extras/Hadrons/Modules/MGauge/StochEm.hpp | 3 ++- extras/Hadrons/Modules/MGauge/UnitEm.cc | 2 +- lib/qcd/action/gauge/Photon.h | 12 +++++++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index 4c18b968..fec64699 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -68,7 +68,7 @@ void TStochEm::execute(void) LOG(Message) << "Generating stochastic EM potential..." << std::endl; std::vector improvements = strToVec(par().improvement); - PhotonR photon(par().gauge, par().zmScheme, improvements); + PhotonR photon(par().gauge, par().zmScheme, improvements, par().G0_qedInf); auto &a = envGet(EmField, getName()); auto &w = envGet(EmComp, "_" + getName() + "_weight"); diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index 11519b52..8ed58c4b 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -45,7 +45,8 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(StochEmPar, PhotonR::Gauge, gauge, PhotonR::ZmScheme, zmScheme, - std::string, improvement); + std::string, improvement, + Real, G0_qedInf); }; class TStochEm: public Module diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index e23840f5..ad842584 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -61,7 +61,7 @@ void TUnitEm::setup(void) // execution /////////////////////////////////////////////////////////////////// void TUnitEm::execute(void) { - PhotonR photon(0, 0, std::vector()); // Just chose arbitrary input values here + PhotonR photon(0, 0, std::vector(), 0.0); // Just chose arbitrary input values here auto &a = envGet(EmField, getName()); LOG(Message) << "Generating unit EM potential..." << std::endl; photon.UnitField(a); diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 2bdf70dd..bcfe40e0 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -60,7 +60,7 @@ namespace QCD{ GRID_SERIALIZABLE_ENUM(Gauge, undef, feynman, 1, coulomb, 2, landau, 3); GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2, qedInf, 3); public: - Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements); + Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements, Real G0); virtual ~Photon(void) = default; void FreePropagator(const GaugeField &in, GaugeField &out); void MomentumSpacePropagator(const GaugeField &in, GaugeField &out); @@ -77,13 +77,15 @@ namespace QCD{ Gauge gauge_; ZmScheme zmScheme_; std::vector improvement_; + Real G0_; }; typedef Photon PhotonR; template - Photon::Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements) - : gauge_(gauge), zmScheme_(zmScheme), improvement_(improvements) + Photon::Photon(Gauge gauge, ZmScheme zmScheme, + std::vector improvements, Real G0) + : gauge_(gauge), zmScheme_(zmScheme), improvement_(improvements), G0_(G0) {} template @@ -109,7 +111,7 @@ namespace QCD{ std::vector &l = grid->_fdimensions; std::vector x0(nd,0); TComplex Tone = Complex(1.0,0.0); - // TComplex Tzero = Complex(0.0,0.0); + TComplex Tzero = Complex(G0_,0.0); FFT fft(grid); one = Complex(1.0,0.0); @@ -123,7 +125,7 @@ namespace QCD{ } pokeSite(Tone, out, x0); out = one/out; - // pokeSite(Tzero, out, x0); + pokeSite(Tzero, out, x0); fft.FFT_all_dim(out, out, FFT::forward); } From fdbd42e542dee144c0fd238917baaee90399ffac Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 26 Feb 2018 19:22:43 +0000 Subject: [PATCH 149/620] Hadrons: first implementation of local coherence Lanczos --- extras/Hadrons/Environment.cc | 2 +- extras/Hadrons/Modules.hpp | 31 +-- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 211 ++++++++++++++++++ 3 files changed, 214 insertions(+), 30 deletions(-) create mode 100644 extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index 82b0dda1..6554122e 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -270,7 +270,7 @@ int Environment::getObjectModule(const std::string name) const unsigned int Environment::getObjectLs(const unsigned int address) const { - if (hasObject(address)) + if (hasCreatedObject(address)) { return object_[address].Ls; } diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 135934fb..d1f947a2 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,31 +1,3 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Lanny91 - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ #include #include #include @@ -43,11 +15,12 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include -#include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp new file mode 100644 index 00000000..1ce87c2b --- /dev/null +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -0,0 +1,211 @@ +#ifndef Hadrons_MSolver_LocalCoherenceLanczos_hpp_ +#define Hadrons_MSolver_LocalCoherenceLanczos_hpp_ + +#include +#include +#include +#include + +#ifndef DEFAULT_LANCZOS_NBASIS +#define DEFAULT_LANCZOS_NBASIS 60 +#endif + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * LocalCoherenceLanczos * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MSolver) + +class LocalCoherenceLanczosPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(LocalCoherenceLanczosPar, + std::string, action, + int, doFine, + int, doCoarse, + LanczosParams, fineParams, + LanczosParams, coarseParams, + ChebyParams, smoother, + RealD, coarseRelaxTol, + std::string, blockSize); +}; + +template +class TLocalCoherenceLanczos: public Module +{ +public: + FERM_TYPE_ALIASES(FImpl,); + typedef LocalCoherenceLanczos LCL; + typedef typename LCL::FineField FineField; + typedef typename LCL::CoarseField CoarseField; + typedef SchurDiagMooeeOperator SchurFMat; +public: + // constructor + TLocalCoherenceLanczos(const std::string name); + // destructor + virtual ~TLocalCoherenceLanczos(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + void makeCoarseGrid(void); +private: + std::vector coarseDim_; + int Ls_, cLs_{1}; + std::unique_ptr coarseGrid4_{nullptr}; + std::unique_ptr coarseGrid_{nullptr}; + std::unique_ptr coarseGrid4Rb_{nullptr}; + std::unique_ptr coarseGridRb_{nullptr}; + std::string fevecName_, cevecName_, fevalName_, cevalName_; +}; + +MODULE_REGISTER_NS(LocalCoherenceLanczos, + ARG(TLocalCoherenceLanczos), + MSolver); + +/****************************************************************************** + * TLocalCoherenceLanczos implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TLocalCoherenceLanczos::TLocalCoherenceLanczos(const std::string name) +: Module(name) +{ + fevecName_ = getName() + "_fineEvec"; + cevecName_ = getName() + "_coarseEvec"; + fevalName_ = getName() + "_fineEval"; + cevalName_ = getName() + "_coarseEval"; +} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TLocalCoherenceLanczos::getInput(void) +{ + std::vector in = {par().action}; + + return in; +} + +template +std::vector TLocalCoherenceLanczos::getOutput(void) +{ + std::vector out = {fevecName_, cevecName_, fevalName_, cevalName_}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TLocalCoherenceLanczos::makeCoarseGrid(void) +{ + int nd = env().getNd(); + std::vector blockSize = strToVec(par().blockSize); + auto fineDim = env().getDim(); + + Ls_ = env().getObjectLs(par().action); + env().createGrid(Ls_); + coarseDim_.resize(nd); + for (int d = 0; d < coarseDim_.size(); d++) + { + coarseDim_[d] = fineDim[d]/blockSize[d]; + if (coarseDim_[d]*blockSize[d] != fineDim[d]) + { + HADRON_ERROR(Size, "Fine dimension " + std::to_string(d) + + " (" + std::to_string(fineDim[d]) + + ") not divisible by coarse dimension (" + + std::to_string(coarseDim_[d]) + ")"); + } + } + if (blockSize.size() > nd) + { + cLs_ = Ls_/blockSize[nd]; + if (cLs_*blockSize[nd] != Ls_) + { + HADRON_ERROR(Size, "Fine Ls (" + std::to_string(Ls_) + + ") not divisible by coarse Ls (" + + std::to_string(cLs_) + ")"); + } + } + if (Ls_ > 1) + { + coarseGrid4_.reset(SpaceTimeGrid::makeFourDimGrid( + coarseDim_, GridDefaultSimd(nd, vComplex::Nsimd()), + GridDefaultMpi())); + coarseGrid4Rb_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(coarseGrid4_.get())); + coarseGrid_.reset(SpaceTimeGrid::makeFiveDimGrid(cLs_, coarseGrid4_.get())); + coarseGridRb_.reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(cLs_, coarseGrid4_.get())); + } + else + { + coarseGrid_.reset(SpaceTimeGrid::makeFourDimGrid( + coarseDim_, GridDefaultSimd(nd, vComplex::Nsimd()), + GridDefaultMpi())); + coarseGridRb_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(coarseGrid_.get())); + } +} + +template +void TLocalCoherenceLanczos::setup(void) +{ + LOG(Message) << "Setting up local coherence Lanczos eigensolver for" + << " action '" << par().action << "' (" << nBasis + << " eigenvectors)..." << std::endl; + + if (!coarseGrid_) + { + makeCoarseGrid(); + } + envCreate(std::vector, fevecName_, Ls_, par().fineParams.Nm, + env().getRbGrid(Ls_)); + envCreate(std::vector, cevecName_, Ls_, par().coarseParams.Nm, + coarseGridRb_.get()); + envCreate(std::vector, fevalName_, Ls_, par().fineParams.Nm); + envCreate(std::vector, cevalName_, Ls_, par().coarseParams.Nm); + envTmp(SchurFMat, "mat", Ls_, envGet(FMat, par().action)); + envGetTmp(SchurFMat, mat); + envTmp(LCL, "solver", Ls_, env().getRbGrid(Ls_), coarseGridRb_.get(), mat, Odd, + envGet(std::vector, fevecName_), + envGet(std::vector, cevecName_), + envGet(std::vector, fevalName_), + envGet(std::vector, cevalName_)); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TLocalCoherenceLanczos::execute(void) +{ + auto &fine = par().fineParams; + auto &coarse = par().coarseParams; + + envGetTmp(LCL, solver); + if (par().doFine) + { + LOG(Message) << "Performing fine grid IRL -- Nstop= " + << fine.Nstop << ", Nk= " << fine.Nk << ", Nm= " + << fine.Nm << std::endl; + solver.calcFine(fine.Cheby, fine.Nstop, fine.Nk, fine.Nm, fine.resid, + fine.MaxIt, fine.betastp, fine.MinRes); + LOG(Message) << "Orthogonalising" << std::endl; + solver.Orthogonalise(); + } + if (par().doCoarse) + { + LOG(Message) << "Performing coarse grid IRL -- Nstop= " + << fine.Nstop << ", Nk= " << fine.Nk << ", Nm= " + << fine.Nm << std::endl; + solver.calcCoarse(coarse.Cheby, par().smoother, par().coarseRelaxTol, + coarse.Nstop, coarse.Nk, coarse.Nm, coarse.resid, + coarse.MaxIt, coarse.betastp, coarse.MinRes); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MSolver_LocalCoherenceLanczos_hpp_ From 43578a3eb496fe97cfc791eb6a44584c0e1f738a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 26 Feb 2018 19:24:19 +0000 Subject: [PATCH 150/620] Hadrons: copyright update --- extras/Hadrons/Modules.hpp | 30 +++++++++++++++++++ .../Hadrons/Modules/MAction/WilsonClover.hpp | 8 ++--- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 2 ++ extras/Hadrons/Modules/MGauge/FundtoHirep.hpp | 6 ++-- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 27 +++++++++++++++++ extras/Hadrons/modules.inc | 5 ++-- 6 files changed, 67 insertions(+), 11 deletions(-) diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index d1f947a2..1334a9b4 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,3 +1,33 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Guido Cossu +Author: Lanny91 +Author: pretidav + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include #include diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/extras/Hadrons/Modules/MAction/WilsonClover.hpp index c369f086..d5174c6d 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/extras/Hadrons/Modules/MAction/WilsonClover.hpp @@ -2,12 +2,12 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/Wilson.hpp +Source file: extras/Hadrons/Modules/MAction/WilsonClover.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 -Author: Antonin Portelli +Author: Guido Cossu +Author: pretidav 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 diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index 412e92d5..45b9de6c 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -7,7 +7,9 @@ Source file: extras/Hadrons/Modules/MFermion/GaugeProp.hpp Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Guido Cossu Author: Lanny91 +Author: pretidav 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 diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp index 6f072783..4fba59f0 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp @@ -4,11 +4,9 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 -Author: David Preti - Guido Cossu +Author: pretidav 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 diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 1ce87c2b..5fd486fd 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MSolver_LocalCoherenceLanczos_hpp_ #define Hadrons_MSolver_LocalCoherenceLanczos_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 90602275..4a9b2630 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,6 +1,4 @@ modules_cc =\ - Modules/MScalar/ChargedProp.cc \ - Modules/MScalar/FreeProp.cc \ Modules/MContraction/WeakHamiltonianEye.cc \ Modules/MContraction/WeakNeutral4ptDisc.cc \ Modules/MContraction/WeakHamiltonianNonEye.cc \ @@ -30,11 +28,12 @@ modules_hpp =\ Modules/MSource/SeqConserved.hpp \ Modules/MSink/Smear.hpp \ Modules/MSink/Point.hpp \ + Modules/MSolver/LocalCoherenceLanczos.hpp \ Modules/MSolver/RBPrecCG.hpp \ Modules/MGauge/Unit.hpp \ Modules/MGauge/Random.hpp \ - Modules/MGauge/StochEm.hpp \ Modules/MGauge/FundtoHirep.hpp \ + Modules/MGauge/StochEm.hpp \ Modules/MUtilities/TestSeqGamma.hpp \ Modules/MUtilities/TestSeqConserved.hpp \ Modules/MLoop/NoiseLoop.hpp \ From 8a049f27b840cad2e54f822a9c3c28cf423d996a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 27 Feb 2018 13:46:59 +0000 Subject: [PATCH 151/620] Hadrons: Lanczos code improvement --- extras/Hadrons/Global.cc | 3 + extras/Hadrons/Global.hpp | 1 + extras/Hadrons/LanczosUtils.hpp | 88 +++++++++++++++++++ extras/Hadrons/Makefile.am | 1 + .../Modules/MSolver/LocalCoherenceLanczos.hpp | 80 +++++++++-------- 5 files changed, 135 insertions(+), 38 deletions(-) create mode 100644 extras/Hadrons/LanczosUtils.hpp diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 9a90a08c..b121434f 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -37,6 +37,7 @@ HadronsLogger Hadrons::HadronsLogWarning(1,"Warning"); HadronsLogger Hadrons::HadronsLogMessage(1,"Message"); HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative"); HadronsLogger Hadrons::HadronsLogDebug(1,"Debug"); +HadronsLogger Hadrons::HadronsLogIRL(1,"IRL"); void Hadrons::initLogger(void) { @@ -46,11 +47,13 @@ void Hadrons::initLogger(void) GridLogMessage.setTopWidth(w); GridLogIterative.setTopWidth(w); GridLogDebug.setTopWidth(w); + GridLogIRL.setTopWidth(w); HadronsLogError.Active(GridLogError.isActive()); HadronsLogWarning.Active(GridLogWarning.isActive()); HadronsLogMessage.Active(GridLogMessage.isActive()); HadronsLogIterative.Active(GridLogIterative.isActive()); HadronsLogDebug.Active(GridLogDebug.isActive()); + HadronsLogIRL.Active(GridLogIRL.isActive()); } // type utilities ////////////////////////////////////////////////////////////// diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index fc069ed6..7f60ebcb 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -111,6 +111,7 @@ extern HadronsLogger HadronsLogWarning; extern HadronsLogger HadronsLogMessage; extern HadronsLogger HadronsLogIterative; extern HadronsLogger HadronsLogDebug; +extern HadronsLogger HadronsLogIRL; void initLogger(void); diff --git a/extras/Hadrons/LanczosUtils.hpp b/extras/Hadrons/LanczosUtils.hpp new file mode 100644 index 00000000..e6a78753 --- /dev/null +++ b/extras/Hadrons/LanczosUtils.hpp @@ -0,0 +1,88 @@ +#ifndef Hadrons_LanczosUtils_hpp_ +#define Hadrons_LanczosUtils_hpp_ + +#include +#include + +BEGIN_HADRONS_NAMESPACE + +// Lanczos type +#ifndef HADRONS_DEFAULT_LANCZOS_NBASIS +#define HADRONS_DEFAULT_LANCZOS_NBASIS 60 +#endif + +template +using LCL = LocalCoherenceLanczos; + +template +struct EigenPack +{ + std::vector eval; + std::vector evec; + + EigenPack(void) = default; + + EigenPack(const size_t size, GridBase *grid) + { + resize(size, grid); + } + + void resize(const size_t size, GridBase *grid) + { + eval.resize(size); + evec.resize(size, grid); + } + + void read(const std::string fileStem) + { + std::string evecFilename = fileStem + "_evec.bin"; + std::string evalFilename = fileStem + "_eval.xml"; + emptyUserRecord record; + ScidacReader binReader; + XmlReader xmlReader(evalFilename); + + LOG(Message) << "Reading " << evec.size() << " eigenvectors from '" + << evecFilename << "'" << std::endl; + binReader.open(evecFilename); + for(int k = 0; k < evec.size(); ++k) + { + binReader.readScidacFieldRecord(evec[k], record); + } + binReader.close(); + LOG(Message) << "Reading " << eval.size() << " eigenvalues from '" + << evalFilename << "'" << std::endl; + Grid::read(xmlReader, "evals", eval); + } + + void write(const std::string fileStem) + { + std::string evecFilename = fileStem + "_evec.bin"; + std::string evalFilename = fileStem + "_eval.xml"; + emptyUserRecord record; + ScidacWriter binWriter; + XmlWriter xmlWriter(evalFilename); + + LOG(Message) << "Writing " << evec.size() << " eigenvectors to '" + << evecFilename << "'" << std::endl; + binWriter.open(fileStem + "_evec.bin"); + for(int k = 0; k < evec.size(); ++k) + { + binWriter.writeScidacFieldRecord(evec[k], record); + } + binWriter.close(); + LOG(Message) << "Writing " << eval.size() << " eigenvalues to '" + << evalFilename << "'" << std::endl; + Grid::write(xmlWriter, "evals", eval); + } +}; + +template +using FineEigenPack = EigenPack; + +template +using CoarseEigenPack = EigenPack::CoarseField>; + +END_HADRONS_NAMESPACE + +#endif // Hadrons_LanczosUtils_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index 3d07679a..477b93e4 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -21,6 +21,7 @@ nobase_libHadrons_a_HEADERS = \ GeneticScheduler.hpp \ Global.hpp \ Graph.hpp \ + LanczosUtils.hpp \ Module.hpp \ Modules.hpp \ ModuleFactory.hpp \ diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 5fd486fd..a41a7839 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -31,11 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include -#include - -#ifndef DEFAULT_LANCZOS_NBASIS -#define DEFAULT_LANCZOS_NBASIS 60 -#endif +#include BEGIN_HADRONS_NAMESPACE @@ -55,7 +51,8 @@ public: LanczosParams, coarseParams, ChebyParams, smoother, RealD, coarseRelaxTol, - std::string, blockSize); + std::string, blockSize, + std::string, output); }; template @@ -63,9 +60,9 @@ class TLocalCoherenceLanczos: public Module { public: FERM_TYPE_ALIASES(FImpl,); - typedef LocalCoherenceLanczos LCL; - typedef typename LCL::FineField FineField; - typedef typename LCL::CoarseField CoarseField; + typedef LCL LCL; + typedef FineEigenPack FineEigenPack; + typedef CoarseEigenPack CoarseEigenPack; typedef SchurDiagMooeeOperator SchurFMat; public: // constructor @@ -88,12 +85,12 @@ private: std::unique_ptr coarseGrid_{nullptr}; std::unique_ptr coarseGrid4Rb_{nullptr}; std::unique_ptr coarseGridRb_{nullptr}; - std::string fevecName_, cevecName_, fevalName_, cevalName_; + std::string fineName_, coarseName_; }; MODULE_REGISTER_NS(LocalCoherenceLanczos, - ARG(TLocalCoherenceLanczos), - MSolver); + ARG(TLocalCoherenceLanczos), + MSolver); /****************************************************************************** * TLocalCoherenceLanczos implementation * @@ -103,10 +100,8 @@ template TLocalCoherenceLanczos::TLocalCoherenceLanczos(const std::string name) : Module(name) { - fevecName_ = getName() + "_fineEvec"; - cevecName_ = getName() + "_coarseEvec"; - fevalName_ = getName() + "_fineEval"; - cevalName_ = getName() + "_coarseEval"; + fineName_ = getName() + "_fine"; + coarseName_ = getName() + "_coarse"; } // dependencies/products /////////////////////////////////////////////////////// @@ -121,7 +116,7 @@ std::vector TLocalCoherenceLanczos::getInput(void) template std::vector TLocalCoherenceLanczos::getOutput(void) { - std::vector out = {fevecName_, cevecName_, fevalName_, cevalName_}; + std::vector out = {fineName_, coarseName_}; return out; } @@ -187,47 +182,56 @@ void TLocalCoherenceLanczos::setup(void) { makeCoarseGrid(); } - envCreate(std::vector, fevecName_, Ls_, par().fineParams.Nm, + envCreate(FineEigenPack, fineName_, Ls_, par().fineParams.Nm, env().getRbGrid(Ls_)); - envCreate(std::vector, cevecName_, Ls_, par().coarseParams.Nm, + envCreate(CoarseEigenPack, coarseName_, Ls_, par().coarseParams.Nm, coarseGridRb_.get()); - envCreate(std::vector, fevalName_, Ls_, par().fineParams.Nm); - envCreate(std::vector, cevalName_, Ls_, par().coarseParams.Nm); + auto &fine = envGet(FineEigenPack, fineName_); + auto &coarse = envGet(CoarseEigenPack, coarseName_); envTmp(SchurFMat, "mat", Ls_, envGet(FMat, par().action)); envGetTmp(SchurFMat, mat); - envTmp(LCL, "solver", Ls_, env().getRbGrid(Ls_), coarseGridRb_.get(), mat, Odd, - envGet(std::vector, fevecName_), - envGet(std::vector, cevecName_), - envGet(std::vector, fevalName_), - envGet(std::vector, cevalName_)); + envTmp(LCL, "solver", Ls_, env().getRbGrid(Ls_), coarseGridRb_.get(), mat, + Odd, fine.evec, coarse.evec, fine.eval, coarse.eval); } // execution /////////////////////////////////////////////////////////////////// template void TLocalCoherenceLanczos::execute(void) { - auto &fine = par().fineParams; - auto &coarse = par().coarseParams; - + auto &finePar = par().fineParams; + auto &coarsePar = par().coarseParams; + auto &fine = envGet(FineEigenPack, fineName_); + auto &coarse = envGet(CoarseEigenPack, coarseName_); + envGetTmp(LCL, solver); if (par().doFine) { LOG(Message) << "Performing fine grid IRL -- Nstop= " - << fine.Nstop << ", Nk= " << fine.Nk << ", Nm= " - << fine.Nm << std::endl; - solver.calcFine(fine.Cheby, fine.Nstop, fine.Nk, fine.Nm, fine.resid, - fine.MaxIt, fine.betastp, fine.MinRes); + << finePar.Nstop << ", Nk= " << finePar.Nk << ", Nm= " + << finePar.Nm << std::endl; + solver.calcFine(finePar.Cheby, finePar.Nstop, finePar.Nk, finePar.Nm, + finePar.resid,finePar.MaxIt, finePar.betastp, + finePar.MinRes); LOG(Message) << "Orthogonalising" << std::endl; solver.Orthogonalise(); + if (!par().output.empty()) + { + fine.write(par().output + "_fine"); + } } if (par().doCoarse) { LOG(Message) << "Performing coarse grid IRL -- Nstop= " - << fine.Nstop << ", Nk= " << fine.Nk << ", Nm= " - << fine.Nm << std::endl; - solver.calcCoarse(coarse.Cheby, par().smoother, par().coarseRelaxTol, - coarse.Nstop, coarse.Nk, coarse.Nm, coarse.resid, - coarse.MaxIt, coarse.betastp, coarse.MinRes); + << coarsePar.Nstop << ", Nk= " << coarsePar.Nk << ", Nm= " + << coarsePar.Nm << std::endl; + solver.calcCoarse(coarsePar.Cheby, par().smoother, par().coarseRelaxTol, + coarsePar.Nstop, coarsePar.Nk, coarsePar.Nm, + coarsePar.resid, coarsePar.MaxIt, coarsePar.betastp, + coarsePar.MinRes); + if (!par().output.empty()) + { + coarse.write(par().output + "_coarse"); + } } } From 48282260956b914eae53ab0b32774bbbfc4e4334 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 27 Feb 2018 14:43:51 +0000 Subject: [PATCH 152/620] Hadrons: prettier log --- extras/Hadrons/Global.cc | 17 ++++++++++++++++- lib/log/Log.h | 10 ++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index b121434f..0164a1ab 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -41,19 +41,34 @@ HadronsLogger Hadrons::HadronsLogIRL(1,"IRL"); void Hadrons::initLogger(void) { - auto w = std::string("Hadrons").length(); + auto w = std::string("Hadrons").length(); + int cw = 8; + + GridLogError.setTopWidth(w); GridLogWarning.setTopWidth(w); GridLogMessage.setTopWidth(w); GridLogIterative.setTopWidth(w); GridLogDebug.setTopWidth(w); GridLogIRL.setTopWidth(w); + GridLogError.setChanWidth(cw); + GridLogWarning.setChanWidth(cw); + GridLogMessage.setChanWidth(cw); + GridLogIterative.setChanWidth(cw); + GridLogDebug.setChanWidth(cw); + GridLogIRL.setChanWidth(cw); HadronsLogError.Active(GridLogError.isActive()); HadronsLogWarning.Active(GridLogWarning.isActive()); HadronsLogMessage.Active(GridLogMessage.isActive()); HadronsLogIterative.Active(GridLogIterative.isActive()); HadronsLogDebug.Active(GridLogDebug.isActive()); HadronsLogIRL.Active(GridLogIRL.isActive()); + HadronsLogError.setChanWidth(cw); + HadronsLogWarning.setChanWidth(cw); + HadronsLogMessage.setChanWidth(cw); + HadronsLogIterative.setChanWidth(cw); + HadronsLogDebug.setChanWidth(cw); + HadronsLogIRL.setChanWidth(cw); } // type utilities ////////////////////////////////////////////////////////////// diff --git a/lib/log/Log.h b/lib/log/Log.h index 011a7250..b58c5d16 100644 --- a/lib/log/Log.h +++ b/lib/log/Log.h @@ -86,7 +86,7 @@ protected: Colours &Painter; int active; int timing_mode; - int topWidth{-1}; + int topWidth{-1}, chanWidth{-1}; static int timestamp; std::string name, topName; std::string COLOUR; @@ -126,6 +126,7 @@ public: } } void setTopWidth(const int w) {topWidth = w;} + void setChanWidth(const int w) {chanWidth = w;} friend std::ostream& operator<< (std::ostream& stream, Logger& log){ @@ -136,7 +137,12 @@ public: stream << std::setw(log.topWidth); } stream << log.topName << log.background()<< " : "; - stream << log.colour() << std::left << log.name << log.background() << " : "; + stream << log.colour() << std::left; + if (log.chanWidth > 0) + { + stream << std::setw(log.chanWidth); + } + stream << log.name << log.background() << " : "; if ( log.timestamp ) { log.StopWatch->Stop(); GridTime now = log.StopWatch->Elapsed(); From 16ebbfff2991b5bbaee5d2fa337dce0540ebb978 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 27 Feb 2018 18:45:23 +0000 Subject: [PATCH 153/620] Hadrons: Schur convention globally defined through a macro --- extras/Hadrons/Global.hpp | 12 ++++++++++++ .../Modules/MSolver/LocalCoherenceLanczos.hpp | 8 ++++---- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 13 ++++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 7f60ebcb..675a97c2 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -181,6 +181,18 @@ typedef XmlWriter ResultWriter; #define RESULT_FILE_NAME(name) \ name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt +// default Schur convention + +#ifndef HADRONS_DEFAULT_SCHUR +#define HADRONS_DEFAULT_SCHUR DiagMooee +#endif +#define _HADRONS_SCHUR_OP_(conv) Schur##conv##Operator +#define HADRONS_SCHUR_OP(conv) _HADRONS_SCHUR_OP_(conv) +#define HADRONS_DEFAULT_SCHUR_OP HADRONS_SCHUR_OP(HADRONS_DEFAULT_SCHUR) +#define _HADRONS_SCHUR_SOLVE_(conv) SchurRedBlack##conv##Solve +#define HADRONS_SCHUR_SOLVE(conv) _HADRONS_SCHUR_SOLVE_(conv) +#define HADRONS_DEFAULT_SCHUR_SOLVE HADRONS_SCHUR_SOLVE(HADRONS_DEFAULT_SCHUR) + END_HADRONS_NAMESPACE #include diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index a41a7839..387b9455 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -60,10 +60,10 @@ class TLocalCoherenceLanczos: public Module { public: FERM_TYPE_ALIASES(FImpl,); - typedef LCL LCL; - typedef FineEigenPack FineEigenPack; - typedef CoarseEigenPack CoarseEigenPack; - typedef SchurDiagMooeeOperator SchurFMat; + typedef LCL LCL; + typedef FineEigenPack FineEigenPack; + typedef CoarseEigenPack CoarseEigenPack; + typedef HADRONS_DEFAULT_SCHUR_OP SchurFMat; public: // constructor TLocalCoherenceLanczos(const std::string name); diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 54c0f2d8..77ce6cd4 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -43,9 +43,10 @@ BEGIN_MODULE_NAMESPACE(MSolver) class RBPrecCGPar: Serializable { public: - GRID_SERIALIZABLE_CLASS_MEMBERS(RBPrecCGPar, - std::string, action, - double , residual); + GRID_SERIALIZABLE_CLASS_MEMBERS(RBPrecCGPar , + std::string , action, + unsigned int , maxIteration, + double , residual); }; template @@ -117,14 +118,16 @@ void TRBPrecCG::setup(void) auto &mat = envGet(FMat, par().action); auto solver = [&mat, this](FermionField &sol, const FermionField &source) { - ConjugateGradient cg(par().residual, 10000); - SchurRedBlackDiagMooeeSolve schurSolver(cg); + ConjugateGradient cg(par().residual, + par().maxIteration); + HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); schurSolver(mat, source, sol); }; envCreate(SolverFn, getName(), Ls, solver); } + // execution /////////////////////////////////////////////////////////////////// template void TRBPrecCG::execute(void) From abb7d4d2f5026c348342e2d19c2f479a8a5b0755 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 27 Feb 2018 19:32:19 +0000 Subject: [PATCH 154/620] Hadrons: z-Mobius action --- extras/Hadrons/Global.hpp | 3 + extras/Hadrons/Modules.hpp | 31 +---- extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp | 116 ++++++++++++++++++ .../Modules/MSolver/LocalCoherenceLanczos.hpp | 3 + extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 3 +- extras/Hadrons/modules.inc | 1 + 6 files changed, 126 insertions(+), 31 deletions(-) create mode 100644 extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 675a97c2..ed8f4f32 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -58,6 +58,9 @@ using Grid::operator<<; #ifndef FIMPL #define FIMPL WilsonImplR #endif +#ifndef ZFIMPL +#define ZFIMPL ZWilsonImplR +#endif #ifndef SIMPL #define SIMPL ScalarImplCR #endif diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 1334a9b4..1b78a85d 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,33 +1,3 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Guido Cossu -Author: Lanny91 -Author: pretidav - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ #include #include #include @@ -60,6 +30,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp new file mode 100644 index 00000000..b0c614df --- /dev/null +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -0,0 +1,116 @@ +#ifndef Hadrons_MAction_ZMobiusDWF_hpp_ +#define Hadrons_MAction_ZMobiusDWF_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * ZMobiusDWF * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MAction) + +class ZMobiusDWFPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(ZMobiusDWFPar, + std::string , gauge, + unsigned int , Ls, + double , mass, + double , M5, + double , b, + double , c, + std::vector>, omega, + std::string , boundary); +}; + +template +class TZMobiusDWF: public Module +{ +public: + FGS_TYPE_ALIASES(FImpl,); +public: + // constructor + TZMobiusDWF(const std::string name); + // destructor + virtual ~TZMobiusDWF(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(ZMobiusDWF, TZMobiusDWF, MAction); + +/****************************************************************************** + * TZMobiusDWF implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TZMobiusDWF::TZMobiusDWF(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TZMobiusDWF::getInput(void) +{ + std::vector in = {par().gauge}; + + return in; +} + +template +std::vector TZMobiusDWF::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TZMobiusDWF::setup(void) +{ + LOG(Message) << "Setting up z-Mobius domain wall fermion matrix with m= " + << par().mass << ", M5= " << par().M5 << ", Ls= " + << ", b= " << par().b << ", c= " << par().c + << par().Ls << " using gauge field '" << par().gauge << "'" + << std::endl; + LOG(Message) << "Omegas: " << std::endl; + for (unsigned int i = 0; i < par().omega.size(); ++i) + { + LOG(Message) << " omega[" << i << "]= " << par().omega[i] << std::endl; + } + LOG(Message) << "Fermion boundary conditions: " << par().boundary + << std::endl; + + env().createGrid(par().Ls); + auto &U = envGet(LatticeGaugeField, par().gauge); + auto &g4 = *env().getGrid(); + auto &grb4 = *env().getRbGrid(); + auto &g5 = *env().getGrid(par().Ls); + auto &grb5 = *env().getRbGrid(par().Ls); + auto omega = par().omega; + std::vector boundary = strToVec(par().boundary); + typename ZMobiusFermion::ImplParams implParams(boundary); + envCreateDerived(FMat, ZMobiusFermion, getName(), par().Ls, U, g5, + grb5, g4, grb4, par().mass, par().M5, omega, + par().b, par().c, implParams); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TZMobiusDWF::execute(void) +{} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MAction_ZMobiusDWF_hpp_ diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 387b9455..feb1d0be 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -91,6 +91,9 @@ private: MODULE_REGISTER_NS(LocalCoherenceLanczos, ARG(TLocalCoherenceLanczos), MSolver); +MODULE_REGISTER_NS(ZLocalCoherenceLanczos, + ARG(TLocalCoherenceLanczos), + MSolver); /****************************************************************************** * TLocalCoherenceLanczos implementation * diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 77ce6cd4..2b914625 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -70,7 +70,8 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(RBPrecCG, TRBPrecCG, MSolver); +MODULE_REGISTER_NS(RBPrecCG, TRBPrecCG, MSolver); +MODULE_REGISTER_NS(ZRBPrecCG, TRBPrecCG, MSolver); /****************************************************************************** * TRBPrecCG template implementation * diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 4a9b2630..79db9396 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -43,6 +43,7 @@ modules_hpp =\ Modules/MAction/DWF.hpp \ Modules/MAction/Wilson.hpp \ Modules/MAction/WilsonClover.hpp \ + Modules/MAction/ZMobiusDWF.hpp \ Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ From 6ec42b4b82311b6eaa20e37dec49a17af6df0f95 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 12:27:29 +0000 Subject: [PATCH 155/620] LCL: external storage fix --- lib/algorithms/iterative/LocalCoherenceLanczos.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/lib/algorithms/iterative/LocalCoherenceLanczos.h index b8348c0c..3f997a01 100644 --- a/lib/algorithms/iterative/LocalCoherenceLanczos.h +++ b/lib/algorithms/iterative/LocalCoherenceLanczos.h @@ -373,14 +373,14 @@ public: RealD MaxIt, RealD betastp, int MinRes) { Chebyshev Cheby(cheby_op); - ProjectedHermOp Op(_FineOp,_subspace); - ProjectedFunctionHermOp ChebyOp (Cheby,_FineOp,_subspace); + ProjectedHermOp Op(_FineOp,subspace); + ProjectedFunctionHermOp ChebyOp (Cheby,_FineOp,subspace); ////////////////////////////////////////////////////////////////////////////////////////////////// // create a smoother and see if we can get a cheap convergence test and smooth inside the IRL ////////////////////////////////////////////////////////////////////////////////////////////////// Chebyshev ChebySmooth(cheby_smooth); - ImplicitlyRestartedLanczosSmoothedTester ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,_subspace,relax); + ImplicitlyRestartedLanczosSmoothedTester ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,subspace,relax); evals_coarse.resize(Nm); evec_coarse.resize(Nm,_CoarseGrid); From b8b05f143fa7bdf66d2b5bbeed193b74b32037fa Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 12:53:16 +0000 Subject: [PATCH 156/620] Hadrons: Lanczos more conservative type names --- extras/Hadrons/LanczosUtils.hpp | 12 +++++----- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 22 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/extras/Hadrons/LanczosUtils.hpp b/extras/Hadrons/LanczosUtils.hpp index e6a78753..ab3ddbd5 100644 --- a/extras/Hadrons/LanczosUtils.hpp +++ b/extras/Hadrons/LanczosUtils.hpp @@ -11,16 +11,13 @@ BEGIN_HADRONS_NAMESPACE #define HADRONS_DEFAULT_LANCZOS_NBASIS 60 #endif -template -using LCL = LocalCoherenceLanczos; - template struct EigenPack { + typedef T VectorType; std::vector eval; std::vector evec; - + EigenPack(void) = default; EigenPack(const size_t size, GridBase *grid) @@ -81,7 +78,10 @@ template using FineEigenPack = EigenPack; template -using CoarseEigenPack = EigenPack::CoarseField>; +using CoarseEigenPack = EigenPack< + typename LocalCoherenceLanczos::CoarseField>; END_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index feb1d0be..b708d59d 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -60,9 +60,11 @@ class TLocalCoherenceLanczos: public Module { public: FERM_TYPE_ALIASES(FImpl,); - typedef LCL LCL; - typedef FineEigenPack FineEigenPack; - typedef CoarseEigenPack CoarseEigenPack; + typedef LocalCoherenceLanczos LCL; + typedef FineEigenPack FinePack; + typedef CoarseEigenPack CoarsePack; typedef HADRONS_DEFAULT_SCHUR_OP SchurFMat; public: // constructor @@ -185,12 +187,10 @@ void TLocalCoherenceLanczos::setup(void) { makeCoarseGrid(); } - envCreate(FineEigenPack, fineName_, Ls_, par().fineParams.Nm, - env().getRbGrid(Ls_)); - envCreate(CoarseEigenPack, coarseName_, Ls_, par().coarseParams.Nm, - coarseGridRb_.get()); - auto &fine = envGet(FineEigenPack, fineName_); - auto &coarse = envGet(CoarseEigenPack, coarseName_); + envCreate(FinePack, fineName_, Ls_, par().fineParams.Nm, env().getRbGrid(Ls_)); + envCreate(CoarsePack, coarseName_, Ls_, par().coarseParams.Nm, coarseGridRb_.get()); + auto &fine = envGet(FinePack, fineName_); + auto &coarse = envGet(CoarsePack, coarseName_); envTmp(SchurFMat, "mat", Ls_, envGet(FMat, par().action)); envGetTmp(SchurFMat, mat); envTmp(LCL, "solver", Ls_, env().getRbGrid(Ls_), coarseGridRb_.get(), mat, @@ -203,8 +203,8 @@ void TLocalCoherenceLanczos::execute(void) { auto &finePar = par().fineParams; auto &coarsePar = par().coarseParams; - auto &fine = envGet(FineEigenPack, fineName_); - auto &coarse = envGet(CoarseEigenPack, coarseName_); + auto &fine = envGet(FinePack, fineName_); + auto &coarse = envGet(CoarsePack, coarseName_); envGetTmp(LCL, solver); if (par().doFine) From e418b044f747f0375cdf420699a3c026f5f82d1b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 12:57:28 +0000 Subject: [PATCH 157/620] Hadrons: code cleaning --- extras/Hadrons/LanczosUtils.hpp | 27 +++++++++++++++++ extras/Hadrons/Modules.hpp | 30 +++++++++++++++++++ .../Hadrons/Modules/MAction/WilsonClover.hpp | 1 + extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp | 27 +++++++++++++++++ extras/Hadrons/Modules/MGauge/FundtoHirep.hpp | 1 + extras/Hadrons/Modules/MIO/LoadNersc.cc | 2 -- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 18 +++++------ 7 files changed, 95 insertions(+), 11 deletions(-) diff --git a/extras/Hadrons/LanczosUtils.hpp b/extras/Hadrons/LanczosUtils.hpp index ab3ddbd5..f8e7693a 100644 --- a/extras/Hadrons/LanczosUtils.hpp +++ b/extras/Hadrons/LanczosUtils.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/LanczosUtils.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_LanczosUtils_hpp_ #define Hadrons_LanczosUtils_hpp_ diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 1b78a85d..57fa93a3 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,3 +1,33 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Guido Cossu +Author: Lanny91 +Author: pretidav + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include #include diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/extras/Hadrons/Modules/MAction/WilsonClover.hpp index d5174c6d..2967931c 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/extras/Hadrons/Modules/MAction/WilsonClover.hpp @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MAction/WilsonClover.hpp Copyright (C) 2015-2018 +Author: Antonin Portelli Author: Guido Cossu Author: pretidav diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp index b0c614df..fd812a2a 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MAction_ZMobiusDWF_hpp_ #define Hadrons_MAction_ZMobiusDWF_hpp_ diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp index 4fba59f0..508145bc 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.hpp Copyright (C) 2015-2018 +Author: Antonin Portelli Author: pretidav This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MIO/LoadNersc.cc b/extras/Hadrons/Modules/MIO/LoadNersc.cc index f20606fc..36a56d54 100644 --- a/extras/Hadrons/Modules/MIO/LoadNersc.cc +++ b/extras/Hadrons/Modules/MIO/LoadNersc.cc @@ -71,6 +71,4 @@ void TLoadNersc::execute(void) auto &U = envGet(LatticeGaugeField, getName()); NerscIO::readConfiguration(U, header, fileName); - LOG(Message) << "NERSC header:" << std::endl; - dump_meta_data(header, LOG(Message)); } diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index b708d59d..6ab0412a 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -44,15 +44,15 @@ class LocalCoherenceLanczosPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(LocalCoherenceLanczosPar, - std::string, action, - int, doFine, - int, doCoarse, - LanczosParams, fineParams, - LanczosParams, coarseParams, - ChebyParams, smoother, - RealD, coarseRelaxTol, - std::string, blockSize, - std::string, output); + std::string, action, + int, doFine, + int, doCoarse, + LanczosParams, fineParams, + LanczosParams, coarseParams, + ChebyParams, smoother, + RealD, coarseRelaxTol, + std::string, blockSize, + std::string, output); }; template From 5b937e3644dba95b6e1c3e868fc567ccf991c2ea Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 17:28:38 +0000 Subject: [PATCH 158/620] Hadrons: VM memory profiling fix --- extras/Hadrons/VirtualMachine.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index d47bafb7..c91667e7 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -424,11 +424,17 @@ void VirtualMachine::memoryProfile(const unsigned int address) cleanEnvironment(); for (auto &in: m->getInput()) { - memoryProfile(env().getObjectModule(in)); + if (!env().hasCreatedObject(in)) + { + memoryProfile(env().getObjectModule(in)); + } } for (auto &ref: m->getReference()) { - memoryProfile(env().getObjectModule(ref)); + if (!env().hasCreatedObject(ref)) + { + memoryProfile(env().getObjectModule(ref)); + } } m->setup(); updateProfile(address); From 4d2a32ae7ace84c8a762d5f97cd34146c8edbf7d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 18:03:44 +0000 Subject: [PATCH 159/620] Hadrons: z-Mobius message fix --- extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp index fd812a2a..518b88f2 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -105,9 +105,9 @@ template void TZMobiusDWF::setup(void) { LOG(Message) << "Setting up z-Mobius domain wall fermion matrix with m= " - << par().mass << ", M5= " << par().M5 << ", Ls= " + << par().mass << ", M5= " << par().M5 << ", Ls= " << par().Ls << ", b= " << par().b << ", c= " << par().c - << par().Ls << " using gauge field '" << par().gauge << "'" + << " using gauge field '" << par().gauge << "'" << std::endl; LOG(Message) << "Omegas: " << std::endl; for (unsigned int i = 0; i < par().omega.size(); ++i) From 15767a1491a36edd02ee29eeef4efd7ac1fd85fe Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 18:04:08 +0000 Subject: [PATCH 160/620] Hadrons: LCL fine convergence test --- extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 6ab0412a..e30788bd 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -215,6 +215,7 @@ void TLocalCoherenceLanczos::execute(void) solver.calcFine(finePar.Cheby, finePar.Nstop, finePar.Nk, finePar.Nm, finePar.resid,finePar.MaxIt, finePar.betastp, finePar.MinRes); + solver.testFine(finePar.resid*100.0); LOG(Message) << "Orthogonalising" << std::endl; solver.Orthogonalise(); if (!par().output.empty()) From e5ea84d5311e86aab789e771fb4557d6b87ef3cc Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 19:33:11 +0000 Subject: [PATCH 161/620] Hadrons: LCL: orthogonalise coarse evec --- extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index e30788bd..c9adc2a7 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -232,6 +232,8 @@ void TLocalCoherenceLanczos::execute(void) coarsePar.Nstop, coarsePar.Nk, coarsePar.Nm, coarsePar.resid, coarsePar.MaxIt, coarsePar.betastp, coarsePar.MinRes); + LOG(Message) << "Orthogonalising" << std::endl; + solver.Orthogonalise(); if (!par().output.empty()) { coarse.write(par().output + "_coarse"); From ba6db55cb0c9dd95e009420634860ad01003170c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 1 Mar 2018 23:30:58 +0000 Subject: [PATCH 162/620] Hadrons: reverse last commit --- extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index c9adc2a7..ae289ddf 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -233,7 +233,6 @@ void TLocalCoherenceLanczos::execute(void) coarsePar.resid, coarsePar.MaxIt, coarsePar.betastp, coarsePar.MinRes); LOG(Message) << "Orthogonalising" << std::endl; - solver.Orthogonalise(); if (!par().output.empty()) { coarse.write(par().output + "_coarse"); From c4274e1660ea529e5c9e8c396677ca61c8b11537 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 10:18:33 +0000 Subject: [PATCH 163/620] Hadrons: LCL cleaning --- extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index ae289ddf..3a299bd6 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -174,6 +174,7 @@ void TLocalCoherenceLanczos::makeCoarseGrid(void) GridDefaultMpi())); coarseGridRb_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(coarseGrid_.get())); } + LOG(Message) << "Coarse grid: " << coarseGrid_->GlobalDimensions() << std::endl; } template @@ -232,7 +233,8 @@ void TLocalCoherenceLanczos::execute(void) coarsePar.Nstop, coarsePar.Nk, coarsePar.Nm, coarsePar.resid, coarsePar.MaxIt, coarsePar.betastp, coarsePar.MinRes); - LOG(Message) << "Orthogonalising" << std::endl; + solver.testCoarse(coarsePar.resid*100.0, par().smoother, + par().coarseRelaxTol); if (!par().output.empty()) { coarse.write(par().output + "_coarse"); From 83a101db8332a0b26958635614293be20a661991 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 11:05:02 +0000 Subject: [PATCH 164/620] Hadrons: more LCL fixes --- extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp | 2 +- lib/algorithms/iterative/LocalCoherenceLanczos.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 3a299bd6..284b233b 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -174,7 +174,6 @@ void TLocalCoherenceLanczos::makeCoarseGrid(void) GridDefaultMpi())); coarseGridRb_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(coarseGrid_.get())); } - LOG(Message) << "Coarse grid: " << coarseGrid_->GlobalDimensions() << std::endl; } template @@ -188,6 +187,7 @@ void TLocalCoherenceLanczos::setup(void) { makeCoarseGrid(); } + LOG(Message) << "Coarse grid: " << coarseGrid_->GlobalDimensions() << std::endl; envCreate(FinePack, fineName_, Ls_, par().fineParams.Nm, env().getRbGrid(Ls_)); envCreate(CoarsePack, coarseName_, Ls_, par().coarseParams.Nm, coarseGridRb_.get()); auto &fine = envGet(FinePack, fineName_); diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/lib/algorithms/iterative/LocalCoherenceLanczos.h index 3f997a01..0c7f4f65 100644 --- a/lib/algorithms/iterative/LocalCoherenceLanczos.h +++ b/lib/algorithms/iterative/LocalCoherenceLanczos.h @@ -332,7 +332,7 @@ public: // create a smoother and see if we can get a cheap convergence test and smooth inside the IRL ////////////////////////////////////////////////////////////////////////////////////////////////// Chebyshev ChebySmooth(cheby_smooth); - ProjectedFunctionHermOp ChebyOp (ChebySmooth,_FineOp,_subspace); + ProjectedFunctionHermOp ChebyOp (ChebySmooth,_FineOp,subspace); ImplicitlyRestartedLanczosSmoothedTester ChebySmoothTester(ChebyOp,ChebySmooth,_FineOp,subspace,relax); for(int k=0;k Date: Fri, 2 Mar 2018 11:47:38 +0000 Subject: [PATCH 165/620] changes requested for the pull request --- .../Hadrons/Modules/MSource/SeqConserved.hpp | 44 +++++---- extras/Hadrons/modules.inc | 2 +- lib/qcd/action/fermion/FermionOperator.h | 2 +- .../fermion/ImprovedStaggeredFermion.cc | 2 +- .../action/fermion/ImprovedStaggeredFermion.h | 2 +- .../fermion/ImprovedStaggeredFermion5D.cc | 2 +- .../fermion/ImprovedStaggeredFermion5D.h | 2 +- lib/qcd/action/fermion/WilsonFermion.cc | 71 +------------- lib/qcd/action/fermion/WilsonFermion.h | 4 +- lib/qcd/action/fermion/WilsonFermion5D.cc | 94 +------------------ lib/qcd/action/fermion/WilsonFermion5D.h | 2 +- 11 files changed, 38 insertions(+), 189 deletions(-) diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.hpp b/extras/Hadrons/Modules/MSource/SeqConserved.hpp index 0fb23cc4..5c4a320b 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/extras/Hadrons/Modules/MSource/SeqConserved.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/SeqConserved.hpp +Source file: extras/Hadrons/Modules/MSource/SeqConserved.hpp Copyright (C) 2015-2018 @@ -35,8 +35,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include -#include - BEGIN_HADRONS_NAMESPACE /* @@ -100,6 +98,9 @@ protected: virtual void setup(void); // execution virtual void execute(void); +private: + bool SeqhasPhase_{false}; + std::string SeqmomphName_; }; MODULE_REGISTER_NS(SeqConserved, TSeqConserved, MSource); @@ -112,6 +113,7 @@ MODULE_REGISTER_NS(SeqConserved, TSeqConserved, MSource); template TSeqConserved::TSeqConserved(const std::string name) : Module(name) +, SeqmomphName_ (name + "_Seqmomph") {} // dependencies/products /////////////////////////////////////////////////////// @@ -139,7 +141,7 @@ void TSeqConserved::setup(void) auto Ls_ = env().getObjectLs(par().action); envCreateLat(PropagatorField, getName(), Ls_); envTmpLat(PropagatorField, "src_tmp"); - envTmpLat(LatticeComplex, "mom_phase"); + envCacheLat(LatticeComplex, SeqmomphName_); envTmpLat(LatticeComplex, "coor"); envTmpLat(LatticeComplex, "latt_compl"); } @@ -152,37 +154,45 @@ void TSeqConserved::execute(void) { LOG(Message) << "Generating sequential source with conserved " << par().curr_type << " current at " - << "t = " << par().tA << std::endl; + << "t = " << par().tA << " summed over the indices " + << par().mu_min << " <= mu <= " << par().mu_max + << std::endl; } else { LOG(Message) << "Generating sequential source with conserved " << par().curr_type << " current for " << par().tA << " <= t <= " - << par().tB << std::endl; + << par().tB << " summed over the indices " + << par().mu_min << " <= mu <= " << par().mu_max + << std::endl; } auto &src = envGet(PropagatorField, getName()); envGetTmp(PropagatorField, src_tmp); src_tmp = src; auto &q = envGet(PropagatorField, par().q); auto &mat = envGet(FMat, par().action); - envGetTmp(LatticeComplex, mom_phase); - envGetTmp(LatticeComplex, coor); envGetTmp(LatticeComplex, latt_compl); src = zero; //exp(ipx) - std::vector mom = strToVec(par().mom); - mom_phase = zero; - Complex i(0.0,1.0); - for(unsigned int mu = 0; mu < env().getNd(); mu++) - { - LatticeCoordinate(coor, mu); - mom_phase = mom_phase + (mom[mu]/env().getGrid()->_fdimensions[mu])*coor; + auto &mom_phase = envGet(LatticeComplex, SeqmomphName_); + if (!SeqhasPhase_) + { + std::vector mom = strToVec(par().mom); + mom_phase = zero; + Complex i(0.0,1.0); + envGetTmp(LatticeComplex, coor); + for(unsigned int mu = 0; mu < env().getNd(); mu++) + { + LatticeCoordinate(coor, mu); + mom_phase = mom_phase + (mom[mu]/env().getGrid()->_fdimensions[mu])*coor; + } + mom_phase = exp((Real)(2*M_PI)*i*mom_phase); + SeqhasPhase_ = true; } - mom_phase = exp((Real)(2*M_PI)*i*mom_phase); - LOG(Message) << "Inserting momentum " << mom << std::endl; + LOG(Message) << "Inserting momentum " << strToVec(par().mom) << std::endl; diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 8bf22cc0..90602275 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -49,5 +49,5 @@ modules_hpp =\ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ Modules/MIO/LoadNersc.hpp \ -Modules/MIO/LoadBinary.hpp + Modules/MIO/LoadBinary.hpp diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index 94e065cc..9eb74baa 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -127,7 +127,7 @@ namespace Grid { unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx)=0; + ComplexField &lattice_cmplx)=0; }; } diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc index 3a296e52..ed07fb5b 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc @@ -413,7 +413,7 @@ void ImprovedStaggeredFermion::SeqConservedCurrent(PropagatorField &q_in, unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx) + ComplexField &lattice_cmplx) { assert(0); diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h index 015eb6bb..d2426ef7 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h @@ -172,7 +172,7 @@ class ImprovedStaggeredFermion : public StaggeredKernels, public ImprovedS unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx); + ComplexField &lattice_cmplx); }; typedef ImprovedStaggeredFermion ImprovedStaggeredFermionF; diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc index 3640a26b..3510b8f1 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc @@ -425,7 +425,7 @@ void ImprovedStaggeredFermion5D::SeqConservedCurrent(PropagatorField &q_in unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx) + ComplexField &lattice_cmplx) { assert(0); diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h index 1c211938..e9cf2013 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h @@ -184,7 +184,7 @@ namespace QCD { unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx); + ComplexField &lattice_cmplx); }; }} diff --git a/lib/qcd/action/fermion/WilsonFermion.cc b/lib/qcd/action/fermion/WilsonFermion.cc index 5b14651b..2d9cf22d 100644 --- a/lib/qcd/action/fermion/WilsonFermion.cc +++ b/lib/qcd/action/fermion/WilsonFermion.cc @@ -407,75 +407,6 @@ void WilsonFermion::ContractConservedCurrent(PropagatorField &q_in_1, } } -//template -//void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, -// PropagatorField &q_out, -// Current curr_type, -// unsigned int mu, -// std::vector mom, -// unsigned int tmin, -// unsigned int tmax) -//{ -// conformable(_grid, q_in._grid); -// conformable(_grid, q_out._grid); -// Lattice> ph(_grid), coor(_grid); -// Complex i(0.0,1.0); -// PropagatorField tmpFwd(_grid), tmpBwd(_grid), tmp(_grid); -// unsigned int tshift = (mu == Tp) ? 1 : 0; -// unsigned int LLt = GridDefaultLatt()[Tp]; -// -// // Momentum projection -// ph = zero; -// for(unsigned int mu = 0; mu < Nd - 1; mu++) -// { -// LatticeCoordinate(coor, mu); -// ph = ph + mom[mu]*coor*((1./(_grid->_fdimensions[mu]))); -// } -// ph = exp((Real)(2*M_PI)*i*ph); -// -// q_out = zero; -// LatticeInteger coords(_grid); -// LatticeCoordinate(coords, Tp); -// -// // Need q(x + mu) and q(x - mu). -// tmp = Cshift(q_in, mu, 1); -// tmpFwd = tmp*ph; -// tmp = ph*q_in; -// tmpBwd = Cshift(tmp, mu, -1); -// -// parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) -// { -// // Compute the sequential conserved current insertion only if our simd -// // object contains a timeslice we need. -// vInteger t_mask = ((coords._odata[sU] >= tmin) && -// (coords._odata[sU] <= tmax)); -// Integer timeSlices = Reduce(t_mask); -// -// if (timeSlices > 0) -// { -// Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sU], -// q_out._odata[sU], -// Umu, sU, mu, t_mask); -// } -// -// // Repeat for backward direction. -// t_mask = ((coords._odata[sU] >= (tmin + tshift)) && -// (coords._odata[sU] <= (tmax + tshift))); -// -// //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3) -// unsigned int t0 = 0; -// if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 )); -// -// timeSlices = Reduce(t_mask); -// -// if (timeSlices > 0) -// { -// Kernels::SeqConservedCurrentSiteBwd(tmpBwd._odata[sU], -// q_out._odata[sU], -// Umu, sU, mu, t_mask); -// } -// } -//} template void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, @@ -484,7 +415,7 @@ void WilsonFermion::SeqConservedCurrent(PropagatorField &q_in, unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx) + ComplexField &lattice_cmplx) { conformable(_grid, q_in._grid); conformable(_grid, q_out._grid); diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index 1ef6451e..ea25ed7f 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -174,13 +174,13 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { PropagatorField &q_out, Current curr_type, unsigned int mu); - void SeqConservedCurrent(PropagatorField &q_in, + void SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, Current curr_type, unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx); + ComplexField &lattice_cmplx); }; typedef WilsonFermion WilsonFermionF; diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/lib/qcd/action/fermion/WilsonFermion5D.cc index 8a795a1e..6f82aad2 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.cc +++ b/lib/qcd/action/fermion/WilsonFermion5D.cc @@ -779,98 +779,6 @@ void WilsonFermion5D::ContractConservedCurrent(PropagatorField &q_in_1, } -//template -//void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, -// PropagatorField &q_out, -// Current curr_type, -// unsigned int mu, -// std::vector mom, -// unsigned int tmin, -// unsigned int tmax) -//{ -// conformable(q_in._grid, FermionGrid()); -// conformable(q_in._grid, q_out._grid); -// Lattice> ph(FermionGrid()), coor(FermionGrid()); -// PropagatorField tmpFwd(FermionGrid()), tmpBwd(FermionGrid()), -// tmp(FermionGrid()); -// Complex i(0.0, 1.0); -// unsigned int tshift = (mu == Tp) ? 1 : 0; -// unsigned int LLs = q_in._grid->_rdimensions[0]; -// unsigned int LLt = GridDefaultLatt()[Tp]; -// -// // Momentum projection. -// ph = zero; -// for(unsigned int nu = 0; nu < Nd - 1; nu++) -// { -// // Shift coordinate lattice index by 1 to account for 5th dimension. -// LatticeCoordinate(coor, nu + 1); -// ph = ph + mom[nu]*coor*((1./(_FourDimGrid->_fdimensions[nu]))); -// } -// ph = exp((Real)(2*M_PI)*i*ph); -// -// q_out = zero; -// LatticeInteger coords(_FourDimGrid); -// LatticeCoordinate(coords, Tp); -// -// -// // Need q(x + mu, s) and q(x - mu, s). 5D lattice so shift 4D coordinate mu -// // by one. -// tmp = Cshift(q_in, mu + 1, 1); -// tmpFwd = tmp*ph; -// tmp = ph*q_in; -// tmpBwd = Cshift(tmp, mu + 1, -1); -// -// parallel_for (unsigned int sU = 0; sU < Umu._grid->oSites(); ++sU) -// { -// // Compute the sequential conserved current insertion only if our simd -// // object contains a timeslice we need. -// vInteger t_mask = ((coords._odata[sU] >= tmin) && -// (coords._odata[sU] <= tmax)); -// Integer timeSlices = Reduce(t_mask); -// -// if (timeSlices > 0) -// { -// unsigned int sF = sU * LLs; -// for (unsigned int s = 0; s < LLs; ++s) -// { -// bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); -// bool tadpole_sign = (curr_type == Current::Tadpole); -// bool switch_sgn = tadpole_sign || axial_sign; -// -// Kernels::SeqConservedCurrentSiteFwd(tmpFwd._odata[sF], -// q_out._odata[sF], Umu, sU, -// mu, t_mask, switch_sgn); -// ++sF; -// } -// } -// -// // Repeat for backward direction. -// t_mask = ((coords._odata[sU] >= (tmin + tshift)) && -// (coords._odata[sU] <= (tmax + tshift))); -// -// //if tmax = LLt-1 (last timeslice) include timeslice 0 if the time is shifted (mu=3) -// unsigned int t0 = 0; -// if((tmax==LLt-1) && (tshift==1)) t_mask = (t_mask || (coords._odata[sU] == t0 )); -// -// timeSlices = Reduce(t_mask); -// -// if (timeSlices > 0) -// { -// unsigned int sF = sU * LLs; -// for (unsigned int s = 0; s < LLs; ++s) -// { -// bool axial_sign = ((curr_type == Current::Axial) && (s < (LLs / 2))); -// Kernels::SeqConservedCurrentSiteBwd(tmpBwd._odata[sF], -// q_out._odata[sF], Umu, sU, -// mu, t_mask, axial_sign); -// ++sF; -// } -// } -// } -//} - - - template void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, @@ -879,7 +787,7 @@ void WilsonFermion5D::SeqConservedCurrent(PropagatorField &q_in, unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx) + ComplexField &lattice_cmplx) { conformable(q_in._grid, FermionGrid()); conformable(q_in._grid, q_out._grid); diff --git a/lib/qcd/action/fermion/WilsonFermion5D.h b/lib/qcd/action/fermion/WilsonFermion5D.h index 6a7c6c7d..21da4c31 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.h +++ b/lib/qcd/action/fermion/WilsonFermion5D.h @@ -228,7 +228,7 @@ namespace QCD { unsigned int mu, unsigned int tmin, unsigned int tmax, - Lattice> &lattice_cmplx); + ComplexField &lattice_cmplx); }; }} From 37fe9442248f6a894220e6f0d0314fc247d69b25 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 14:14:11 +0000 Subject: [PATCH 166/620] Hadrons: scalar kinetic term --- extras/Hadrons/Modules.hpp | 31 +-- .../Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 198 ++++++++++++++++++ extras/Hadrons/modules.inc | 1 + 3 files changed, 200 insertions(+), 30 deletions(-) create mode 100644 extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 57fa93a3..274a6d86 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,33 +1,3 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Guido Cossu -Author: Lanny91 -Author: pretidav - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ #include #include #include @@ -65,5 +35,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp new file mode 100644 index 00000000..83e0c29e --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -0,0 +1,198 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp + +Copyright (C) 2015-2018 + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MScalarSUN_TrKinetic_hpp_ +#define Hadrons_MScalarSUN_TrKinetic_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * TrKinetic * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TrKineticPar: Serializable +{ +public: + GRID_SERIALIZABLE_ENUM(DiffType, undef, forward, 1, backward, 2, central, 3); + GRID_SERIALIZABLE_CLASS_MEMBERS(TrKineticPar, + std::string, field, + DiffType, type, + std::string, output); +}; + +template +class TTrKinetic: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, op, + Complex , value); + }; +public: + // constructor + TTrKinetic(const std::string name); + // destructor + virtual ~TTrKinetic(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + std::string outName(const unsigned int mu, const unsigned int nu); + std::string bufName(const unsigned int mu); +}; + +MODULE_REGISTER_NS(TrKineticSU2, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_NS(TrKineticSU3, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_NS(TrKineticSU4, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_NS(TrKineticSU5, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_NS(TrKineticSU6, TTrKinetic>, MScalarSUN); + +/****************************************************************************** + * TTrKinetic implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTrKinetic::TTrKinetic(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTrKinetic::getInput(void) +{ + std::vector in = {par().field}; + + return in; +} + +template +std::vector TTrKinetic::getOutput(void) +{ + std::vector out ; + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + out.push_back(outName(mu, nu)); + } + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTrKinetic::setup(void) +{ + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + envCreateLat(ComplexField, outName(mu, nu)); + } + envTmp(std::vector, "der", 1, env().getNd(), env().getGrid()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTrKinetic::execute(void) +{ + LOG(Message) << "Computing tr(d_mu phi*d_nu phi) using " << par().type + << " derivative" << std::endl; + + std::vector result; + auto &phi = envGet(Field, par().field); + + envGetTmp(std::vector, der); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + switch(par().type) + { + case TrKineticPar::DiffType::backward: + der[mu] = phi - Cshift(phi, mu, -1); + break; + case TrKineticPar::DiffType::forward: + der[mu] = Cshift(phi, mu, 1) - phi; + break; + case TrKineticPar::DiffType::central: + der[mu] = 0.5*(Cshift(phi, mu, 1) - Cshift(phi, mu, -1)); + break; + } + } + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + auto &out = envGet(ComplexField, outName(mu, nu)); + + out = -trace(der[mu]*der[nu]); + if (!par().output.empty()) + { + Result r; + + r.op = "tr(d_" + std::to_string(mu) + "phi*d_" + + std::to_string(nu) + "phi)"; + r.value = TensorRemove(sum(out)); + result.push_back(r); + } + } + if (result.size() > 0) + { + saveResult(par().output, "trkinetic", result); + } +} + +// variable name generators //////////////////////////////////////////////////// +template +std::string TTrKinetic::outName(const unsigned int mu, + const unsigned int nu) +{ + return getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu); +} + +template +std::string TTrKinetic::bufName(const unsigned int mu) +{ + return "d_" + std::to_string(mu); +} + + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TrKinetic_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 79db9396..3ee3fb69 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -48,6 +48,7 @@ modules_hpp =\ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ + Modules/MScalarSUN/TrKinetic.hpp \ Modules/MIO/LoadNersc.hpp \ Modules/MIO/LoadBinary.hpp From c0a929aef7e72bcc68e8a355c758d34cbe94f90c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 14:29:54 +0000 Subject: [PATCH 167/620] Hadrons: code cleaning --- extras/Hadrons/LanczosUtils.hpp | 2 +- extras/Hadrons/Modules.hpp | 30 +++++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/Div.hpp | 4 +-- .../Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 4 +-- extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 4 +-- .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 2 +- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 6 ++-- 8 files changed, 42 insertions(+), 11 deletions(-) diff --git a/extras/Hadrons/LanczosUtils.hpp b/extras/Hadrons/LanczosUtils.hpp index f8e7693a..a080da4b 100644 --- a/extras/Hadrons/LanczosUtils.hpp +++ b/extras/Hadrons/LanczosUtils.hpp @@ -112,4 +112,4 @@ using CoarseEigenPack = EigenPack< END_HADRONS_NAMESPACE -#endif // Hadrons_LanczosUtils_hpp_ \ No newline at end of file +#endif // Hadrons_LanczosUtils_hpp_ diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 274a6d86..dc0d2420 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,3 +1,33 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Guido Cossu +Author: Lanny91 +Author: pretidav + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index cab6e88c..7d5b08b2 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -35,7 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * Div * + * Divergence of a vector field * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) @@ -83,7 +83,7 @@ MODULE_REGISTER_NS(DivSU5, TDiv>, MScalarSUN); MODULE_REGISTER_NS(DivSU6, TDiv>, MScalarSUN); /****************************************************************************** - * TDiv implementation * + * TDiv implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index 83e0c29e..75318488 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp Copyright (C) 2015-2018 +Author: Antonin Portelli 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 diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp index 2858984c..d7d1cce7 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -35,7 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * Module to compute tr(mag^n) * + * Trace of powers of the magnetisation * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) @@ -117,7 +117,7 @@ template void TTrMag::execute(void) { LOG(Message) << "Computing tr(mag^n) for n even up to " << par().maxPow - << "..." << std::endl; + << std::endl; std::vector result; auto &phi = envGet(Field, par().field); diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index 4b305128..e5e2b0ef 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -35,7 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * Module to compute tr(phi^n) * + * Trace of powers of a scalar field * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) @@ -136,7 +136,7 @@ template void TTrPhi::execute(void) { LOG(Message) << "Computing tr(phi^n) for n even up to " << par().maxPow - << "..." << std::endl; + << std::endl; std::vector result; auto &phi = envGet(Field, par().field); diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 58570dd5..8772cfbe 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -87,7 +87,7 @@ MODULE_REGISTER_NS(TwoPointSU5, TTwoPoint>, MScalarSUN); MODULE_REGISTER_NS(TwoPointSU6, TTwoPoint>, MScalarSUN); /****************************************************************************** - * TTwoPoint implementation * + * TTwoPoint implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 284b233b..6e2103ce 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -36,8 +36,8 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * LocalCoherenceLanczos * - ******************************************************************************/ + * Local coherence Lanczos eigensolver * + *****************************************************************************/ BEGIN_MODULE_NAMESPACE(MSolver) class LocalCoherenceLanczosPar: Serializable @@ -98,7 +98,7 @@ MODULE_REGISTER_NS(ZLocalCoherenceLanczos, MSolver); /****************************************************************************** - * TLocalCoherenceLanczos implementation * + * TLocalCoherenceLanczos implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template From 550142bd6a2a4326b50871da51f362bc56fe10f7 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 14:30:45 +0000 Subject: [PATCH 168/620] Hadrons: more code cleaning --- extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index 75318488..19776bef 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -35,7 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * TrKinetic * + * Trace of kinetic term * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) @@ -86,7 +86,7 @@ MODULE_REGISTER_NS(TrKineticSU5, TTrKinetic>, MScalarSUN); MODULE_REGISTER_NS(TrKineticSU6, TTrKinetic>, MScalarSUN); /****************************************************************************** - * TTrKinetic implementation * + * TTrKinetic implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template From 614a0e8277f23c713ae6898b4744cc9c411d907f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 17:34:23 +0000 Subject: [PATCH 169/620] Hadrons: Scalar SU(N) utility functions --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/Div.hpp | 19 +---- .../Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 39 ++------- extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 17 +--- .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/Utils.hpp | 80 +++++++++++++++++++ extras/Hadrons/modules.inc | 1 + 8 files changed, 97 insertions(+), 62 deletions(-) create mode 100644 extras/Hadrons/Modules/MScalarSUN/Utils.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index dc0d2420..68b96822 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -65,6 +65,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index 7d5b08b2..0ecb1dbe 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -31,6 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -42,7 +43,6 @@ BEGIN_MODULE_NAMESPACE(MScalarSUN) class DivPar: Serializable { public: - GRID_SERIALIZABLE_ENUM(DiffType, undef, forward, 1, backward, 2, central, 3); GRID_SERIALIZABLE_CLASS_MEMBERS(DivPar, std::vector, op, DiffType, type, @@ -59,8 +59,8 @@ public: { public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - DivPar::DiffType, type, - Complex, value); + DiffType, type, + Complex, value); }; public: // constructor @@ -135,18 +135,7 @@ void TDiv::execute(void) for (unsigned int mu = 0; mu < nd; ++mu) { auto &op = envGet(ComplexField, par().op[mu]); - switch(par().type) - { - case DivPar::DiffType::backward: - div += op - Cshift(op, mu, -1); - break; - case DivPar::DiffType::forward: - div += Cshift(op, mu, 1) - op; - break; - case DivPar::DiffType::central: - div += 0.5*(Cshift(op, mu, 1) - Cshift(op, mu, -1)); - break; - } + dmuAcc(div, op, mu, par().type); } if (!par().output.empty()) { diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index 19776bef..f1b520de 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -31,6 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -42,7 +43,6 @@ BEGIN_MODULE_NAMESPACE(MScalarSUN) class TrKineticPar: Serializable { public: - GRID_SERIALIZABLE_ENUM(DiffType, undef, forward, 1, backward, 2, central, 3); GRID_SERIALIZABLE_CLASS_MEMBERS(TrKineticPar, std::string, field, DiffType, type, @@ -74,9 +74,6 @@ public: virtual void setup(void); // execution virtual void execute(void); -private: - std::string outName(const unsigned int mu, const unsigned int nu); - std::string bufName(const unsigned int mu); }; MODULE_REGISTER_NS(TrKineticSU2, TTrKinetic>, MScalarSUN); @@ -111,7 +108,7 @@ std::vector TTrKinetic::getOutput(void) for (unsigned int mu = 0; mu < env().getNd(); ++mu) for (unsigned int nu = mu; nu < env().getNd(); ++nu) { - out.push_back(outName(mu, nu)); + out.push_back(varName(getName(), mu, nu)); } return out; @@ -124,7 +121,7 @@ void TTrKinetic::setup(void) for (unsigned int mu = 0; mu < env().getNd(); ++mu) for (unsigned int nu = mu; nu < env().getNd(); ++nu) { - envCreateLat(ComplexField, outName(mu, nu)); + envCreateLat(ComplexField, varName(getName(), mu, nu)); } envTmp(std::vector, "der", 1, env().getNd(), env().getGrid()); } @@ -142,23 +139,12 @@ void TTrKinetic::execute(void) envGetTmp(std::vector, der); for (unsigned int mu = 0; mu < env().getNd(); ++mu) { - switch(par().type) - { - case TrKineticPar::DiffType::backward: - der[mu] = phi - Cshift(phi, mu, -1); - break; - case TrKineticPar::DiffType::forward: - der[mu] = Cshift(phi, mu, 1) - phi; - break; - case TrKineticPar::DiffType::central: - der[mu] = 0.5*(Cshift(phi, mu, 1) - Cshift(phi, mu, -1)); - break; - } + dmu(der[mu], phi, mu, par().type); } for (unsigned int mu = 0; mu < env().getNd(); ++mu) for (unsigned int nu = mu; nu < env().getNd(); ++nu) { - auto &out = envGet(ComplexField, outName(mu, nu)); + auto &out = envGet(ComplexField, varName(getName(), mu, nu)); out = -trace(der[mu]*der[nu]); if (!par().output.empty()) @@ -177,21 +163,6 @@ void TTrKinetic::execute(void) } } -// variable name generators //////////////////////////////////////////////////// -template -std::string TTrKinetic::outName(const unsigned int mu, - const unsigned int nu) -{ - return getName() + "_" + std::to_string(mu) + "_" + std::to_string(nu); -} - -template -std::string TTrKinetic::bufName(const unsigned int mu) -{ - return "d_" + std::to_string(mu); -} - - END_MODULE_NAMESPACE END_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp index d7d1cce7..879951d5 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -31,6 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index e5e2b0ef..aa98bfb3 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -31,6 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -73,9 +74,6 @@ public: virtual void setup(void); // execution virtual void execute(void); -private: - // output name generator - std::string outName(const unsigned int n); }; MODULE_REGISTER_NS(TrPhiSU2, TTrPhi>, MScalarSUN); @@ -109,7 +107,7 @@ std::vector TTrPhi::getOutput(void) for (unsigned int n = 2; n <= par().maxPow; n += 2) { - out.push_back(outName(n)); + out.push_back(varName(getName(), n)); } return out; @@ -127,7 +125,7 @@ void TTrPhi::setup(void) envTmpLat(Field, "buf"); for (unsigned int n = 2; n <= par().maxPow; n += 2) { - envCreateLat(ComplexField, outName(n)); + envCreateLat(ComplexField, varName(getName(), n)); } } @@ -147,7 +145,7 @@ void TTrPhi::execute(void) phi2 = -phi*phi; for (unsigned int n = 2; n <= par().maxPow; n += 2) { - auto &phin = envGet(ComplexField, outName(n)); + auto &phin = envGet(ComplexField, varName(getName(), n)); buf = buf*phi2; phin = trace(buf); @@ -166,13 +164,6 @@ void TTrPhi::execute(void) } } -// output name generator /////////////////////////////////////////////////////// -template -std::string TTrPhi::outName(const unsigned int n) -{ - return getName() + "_" + std::to_string(n); -} - END_MODULE_NAMESPACE END_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 8772cfbe..5227e95a 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -31,6 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp new file mode 100644 index 00000000..1a13f8f5 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp @@ -0,0 +1,80 @@ +#ifndef Hadrons_MScalarSUN_Utils_hpp_ +#define Hadrons_MScalarSUN_Utils_hpp_ + +#include +#include + +BEGIN_HADRONS_NAMESPACE + +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +GRID_SERIALIZABLE_ENUM(DiffType, undef, forward, 1, backward, 2, central, 3); + +template +inline void dmu(Field &out, const Field &in, const unsigned int mu, const DiffType type) +{ + auto & env = Environment::getInstance(); + + if (mu >= env.getNd()) + { + HADRON_ERROR(Range, "Derivative direction out of range"); + } + switch(type) + { + case DiffType::backward: + out = in - Cshift(in, mu, -1); + break; + case DiffType::forward: + out = Cshift(in, mu, 1) - in; + break; + case DiffType::central: + out = 0.5*(Cshift(in, mu, 1) - Cshift(in, mu, -1)); + break; + default: + HADRON_ERROR(Argument, "Derivative type invalid"); + break; + } +} + +template +inline void dmuAcc(Field &out, const Field &in, const unsigned int mu, const DiffType type) +{ + auto & env = Environment::getInstance(); + + if (mu >= env.getNd()) + { + HADRON_ERROR(Range, "Derivative direction out of range"); + } + switch(type) + { + case DiffType::backward: + out += in - Cshift(in, mu, -1); + break; + case DiffType::forward: + out += Cshift(in, mu, 1) - in; + break; + case DiffType::central: + out += 0.5*(Cshift(in, mu, 1) - Cshift(in, mu, -1)); + break; + default: + HADRON_ERROR(Argument, "Derivative type invalid"); + break; + } +} + +inline std::string varName(const std::string name, const unsigned int mu) +{ + return name + "_" + std::to_string(mu); +} + +inline std::string varName(const std::string name, const unsigned int mu, + const unsigned int nu) +{ + return name + "_" + std::to_string(mu) + "_" + std::to_string(nu); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_Utils_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 3ee3fb69..ea94179e 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -48,6 +48,7 @@ modules_hpp =\ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ + Modules/MScalarSUN/Utils.hpp \ Modules/MScalarSUN/TrKinetic.hpp \ Modules/MIO/LoadNersc.hpp \ Modules/MIO/LoadBinary.hpp From d9c435e282e3bce3ea42027f96475ceb74cdc959 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 17:35:12 +0000 Subject: [PATCH 170/620] Hadrons: Scalar SU(N) transverse projection module --- extras/Hadrons/Modules.hpp | 1 + .../Hadrons/Modules/MScalarSUN/TransProj.hpp | 158 ++++++++++++++++++ extras/Hadrons/modules.inc | 1 + 3 files changed, 160 insertions(+) create mode 100644 extras/Hadrons/Modules/MScalarSUN/TransProj.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 68b96822..d92f2661 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -66,6 +66,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp new file mode 100644 index 00000000..59b7097c --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -0,0 +1,158 @@ +#ifndef Hadrons_MScalarSUN_TransProj_hpp_ +#define Hadrons_MScalarSUN_TransProj_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Transverse projection * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TransProjPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TransProjPar, + std::string, op, + DiffType, type, + std::string, output); +}; + +template +class TTransProj: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, op, + Complex , value); + }; +public: + // constructor + TTransProj(const std::string name); + // destructor + virtual ~TTransProj(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + + virtual void execute(void); +}; + +MODULE_REGISTER_NS(TransProjSU2, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU3, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU4, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU5, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU6, TTransProj>, MScalarSUN); + +/****************************************************************************** + * TTransProj implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTransProj::TTransProj(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTransProj::getInput(void) +{ + std::vector in = {par().op}; + + return in; +} + +template +std::vector TTransProj::getOutput(void) +{ + std::vector out = {getName()}; + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + out.push_back(varName(getName(), mu, nu)); + } + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTransProj::setup(void) +{ + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + envCreateLat(ComplexField, varName(getName(), mu, nu)); + } + envTmpLat(ComplexField, "buf1"); + envTmpLat(ComplexField, "buf2"); + envTmpLat(ComplexField, "lap"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTransProj::execute(void) +{ + LOG(Message) << "Computing (delta_mu,nu d^2 - d_mu*d_nu)*op using " + << par().type << " derivatives and op= '" << par().op + << "'" << std::endl; + + std::vector result; + auto &op = envGet(ComplexField, par().op); + + envGetTmp(ComplexField, buf1); + envGetTmp(ComplexField, buf2); + envGetTmp(ComplexField, lap); + lap = zero; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + dmu(buf1, op, mu, par().type); + dmu(buf2, buf1, mu, par().type); + lap += buf2; + } + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + auto &out = envGet(ComplexField, varName(getName(), mu, nu)); + dmu(buf1, op, mu, par().type); + dmu(buf2, buf1, nu, par().type); + out = -buf2; + if (mu == nu) + { + out += lap; + } + if (!par().output.empty()) + { + Result r; + + r.op = "(delta_" + std::to_string(mu) + "," + std::to_string(nu) + + " d^2 - d_" + std::to_string(mu) + "*d_" + + std::to_string(nu) + ")*op"; + r.value = TensorRemove(sum(out)); + result.push_back(r); + } + } + if (result.size() > 0) + { + saveResult(par().output, "transproj", result); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TransProj_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index ea94179e..dbfa359c 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -49,6 +49,7 @@ modules_hpp =\ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ Modules/MScalarSUN/Utils.hpp \ + Modules/MScalarSUN/TransProj.hpp \ Modules/MScalarSUN/TrKinetic.hpp \ Modules/MIO/LoadNersc.hpp \ Modules/MIO/LoadBinary.hpp From 1d83521daadf983e6bb599982c2d5552eaadfc1d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 17:55:18 +0000 Subject: [PATCH 171/620] Hadrons: scalar SU(N) EMT --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 150 ++++++++++++++++++++++ extras/Hadrons/modules.inc | 1 + 3 files changed, 152 insertions(+) create mode 100644 extras/Hadrons/Modules/MScalarSUN/EMT.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index d92f2661..695dfd02 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -63,6 +63,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp new file mode 100644 index 00000000..7f1a612d --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -0,0 +1,150 @@ +#ifndef Hadrons_MScalarSUN_EMT_hpp_ +#define Hadrons_MScalarSUN_EMT_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Energy-momentum tensor * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class EMTPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(EMTPar, + std::string, kinetic, + std::string, phiPow, + std::string, improvement, + double , m2, + double , lambda, + double , g, + double , xi, + std::string, output); +}; + +template +class TEMT: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; +public: + // constructor + TEMT(const std::string name); + // destructor + virtual ~TEMT(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(EMTSU2, TEMT>, MScalarSUN); +MODULE_REGISTER_NS(EMTSU3, TEMT>, MScalarSUN); +MODULE_REGISTER_NS(EMTSU4, TEMT>, MScalarSUN); +MODULE_REGISTER_NS(EMTSU5, TEMT>, MScalarSUN); +MODULE_REGISTER_NS(EMTSU6, TEMT>, MScalarSUN); + +/****************************************************************************** + * TEMT implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TEMT::TEMT(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TEMT::getInput(void) +{ + std::vector in; + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + in.push_back(varName(par().kinetic, mu, nu)); + in.push_back(varName(par().improvement, mu, nu)); + } + in.push_back(varName(par().phiPow, 2)); + in.push_back(varName(par().phiPow, 4)); + + return in; +} + +template +std::vector TEMT::getOutput(void) +{ + std::vector out = {getName()}; + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + out.push_back(varName(getName(), mu, nu)); + } + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TEMT::setup(void) +{ + envCreateLat(ComplexField, getName()); + envTmpLat(ComplexField, "sumkin"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TEMT::execute(void) +{ + LOG(Message) << "Computing energy-momentum tensor" << std::endl; + LOG(Message) << " kinetic terms: '" << par().kinetic << "'" << std::endl; + LOG(Message) << " tr(phi^n): '" << par().phiPow << "'" << std::endl; + LOG(Message) << " improvement: '" << par().improvement << "'" << std::endl; + LOG(Message) << " m^2= " << par().m2 << std::endl; + LOG(Message) << " lambda= " << par().lambda << std::endl; + LOG(Message) << " g= " << par().g << std::endl; + LOG(Message) << " xi= " << par().xi << std::endl; + + const unsigned int N = SImpl::Group::Dimension; + auto &trphi2 = envGet(ComplexField, varName(par().phiPow, 2)); + auto &trphi4 = envGet(ComplexField, varName(par().phiPow, 4)); + + envGetTmp(ComplexField, sumkin); + sumkin = zero; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + auto &trkin = envGet(ComplexField, varName(par().kinetic, mu, mu)); + + sumkin += trkin; + } + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + auto &out = envGet(ComplexField, varName(getName(), mu, nu)); + auto &trkin = envGet(ComplexField, varName(par().kinetic, mu, nu)); + auto &imp = envGet(ComplexField, varName(par().improvement, mu, nu)); + + out = 2.*trkin + par().xi*imp; + if (mu == nu) + { + out -= sumkin + par().m2*trphi2 + par().lambda*trphi4; + } + out *= N/par().g; + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_EMT_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index dbfa359c..44df3091 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -46,6 +46,7 @@ modules_hpp =\ Modules/MAction/ZMobiusDWF.hpp \ Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TrMag.hpp \ + Modules/MScalarSUN/EMT.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ Modules/MScalarSUN/Utils.hpp \ From 018801d9731e8a01ecdef8c17fa9b773b5c85260 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 17:56:00 +0000 Subject: [PATCH 172/620] Hadrons: legal update --- extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 27 +++++++++++++++++++ .../Hadrons/Modules/MScalarSUN/TransProj.hpp | 27 +++++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/Utils.hpp | 27 +++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp index 7f1a612d..850efe6a 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/EMT.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_EMT_hpp_ #define Hadrons_MScalarSUN_EMT_hpp_ diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp index 59b7097c..09386cea 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TransProj.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_TransProj_hpp_ #define Hadrons_MScalarSUN_TransProj_hpp_ diff --git a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp index 1a13f8f5..1a17282a 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/Utils.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_Utils_hpp_ #define Hadrons_MScalarSUN_Utils_hpp_ From 2f4dac35313d342a36eb4a09ed3a04db717ff8c4 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 18:10:58 +0000 Subject: [PATCH 173/620] Hadrons: legal update --- extras/Hadrons/Modules/MGauge/StochEm.hpp | 1 + extras/Hadrons/Modules/MSource/SeqConserved.hpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index 05162443..9e2ba1fb 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -7,6 +7,7 @@ Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Vera Guelpers 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 diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.hpp b/extras/Hadrons/Modules/MSource/SeqConserved.hpp index 5c4a320b..d7780528 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/extras/Hadrons/Modules/MSource/SeqConserved.hpp @@ -7,8 +7,8 @@ Source file: extras/Hadrons/Modules/MSource/SeqConserved.hpp Copyright (C) 2015-2018 Author: Antonin Portelli -Author: Andrew Lawson -Author: Vera Guelpers +Author: Lanny91 +Author: Vera Guelpers 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 From c4baf876d4896318817dbcc7d5b03680c8142bc9 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 18:40:18 +0000 Subject: [PATCH 174/620] Hadrons: graph consistency check --- extras/Hadrons/VirtualMachine.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index c91667e7..1bd18100 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -296,7 +296,18 @@ void VirtualMachine::makeModuleGraph(void) { for (auto &in: module_[m].input) { - graph.addEdge(env().getObjectModule(in), m); + int min = env().getObjectModule(in); + + if (min < 0) + { + HADRON_ERROR(Definition, "object with address " + + std::to_string(in) + + " is not produced by any module"); + } + else + { + graph.addEdge(min, m); + } } } graph_ = graph; From 480708b9a0aac92e00a34bf1ba988f6e0994c215 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 19:19:37 +0000 Subject: [PATCH 175/620] Hadrons: safer error handling for HadronsXmlRun --- extras/Hadrons/Exceptions.hpp | 1 - extras/Hadrons/HadronsXmlRun.cc | 24 +++++++--- extras/Hadrons/HadronsXmlSchedule.cc | 65 ---------------------------- extras/Hadrons/Makefile.am | 5 +-- 4 files changed, 19 insertions(+), 76 deletions(-) delete mode 100644 extras/Hadrons/HadronsXmlSchedule.cc diff --git a/extras/Hadrons/Exceptions.hpp b/extras/Hadrons/Exceptions.hpp index ab588e5e..ce11618a 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/extras/Hadrons/Exceptions.hpp @@ -37,7 +37,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #define SRC_LOC std::string(__FUNCTION__) + " at " + std::string(__FILE__) + ":"\ + std::to_string(__LINE__) #define HADRON_ERROR(exc, msg)\ -LOG(Error) << msg << std::endl;\ throw(Exceptions::exc(msg, SRC_LOC)); #define DECL_EXC(name, base) \ diff --git a/extras/Hadrons/HadronsXmlRun.cc b/extras/Hadrons/HadronsXmlRun.cc index 680f234b..4fcfabf2 100644 --- a/extras/Hadrons/HadronsXmlRun.cc +++ b/extras/Hadrons/HadronsXmlRun.cc @@ -56,14 +56,26 @@ int main(int argc, char *argv[]) Grid_init(&argc, &argv); // execution - Application application(parameterFileName); - - application.parseParameterFile(parameterFileName); - if (!scheduleFileName.empty()) + try { - application.loadSchedule(scheduleFileName); + Application application(parameterFileName); + + application.parseParameterFile(parameterFileName); + if (!scheduleFileName.empty()) + { + application.loadSchedule(scheduleFileName); + } + application.run(); + } + catch (const std::exception& e) + { + LOG(Error) << "FATAL ERROR -- Exception " << typeName(&typeid(e)) << std::endl; + LOG(Error) << e.what() << std::endl; + LOG(Error) << "Aborting program" << std::endl; + Grid_finalize(); + + return EXIT_FAILURE; } - application.run(); // epilogue LOG(Message) << "Grid is finalizing now" << std::endl; diff --git a/extras/Hadrons/HadronsXmlSchedule.cc b/extras/Hadrons/HadronsXmlSchedule.cc deleted file mode 100644 index 55f3b231..00000000 --- a/extras/Hadrons/HadronsXmlSchedule.cc +++ /dev/null @@ -1,65 +0,0 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/HadronsXmlSchedule.cc - -Copyright (C) 2015-2018 - -Author: Antonin Portelli - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ - -#include - -using namespace Grid; -using namespace QCD; -using namespace Hadrons; - -int main(int argc, char *argv[]) -{ - // parse command line - std::string parameterFileName, scheduleFileName; - - if (argc < 3) - { - std::cerr << "usage: " << argv[0] << " [Grid options]"; - std::cerr << std::endl; - std::exit(EXIT_FAILURE); - } - parameterFileName = argv[1]; - scheduleFileName = argv[2]; - - // initialization - Grid_init(&argc, &argv); - - // execution - Application application; - - application.parseParameterFile(parameterFileName); - application.schedule(); - application.printSchedule(); - application.saveSchedule(scheduleFileName); - - // epilogue - LOG(Message) << "Grid is finalizing now" << std::endl; - Grid_finalize(); - - return EXIT_SUCCESS; -} diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index 477b93e4..3b393cd1 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -1,5 +1,5 @@ lib_LIBRARIES = libHadrons.a -bin_PROGRAMS = HadronsXmlRun HadronsXmlSchedule +bin_PROGRAMS = HadronsXmlRun include modules.inc @@ -29,6 +29,3 @@ nobase_libHadrons_a_HEADERS = \ HadronsXmlRun_SOURCES = HadronsXmlRun.cc HadronsXmlRun_LDADD = libHadrons.a -lGrid - -HadronsXmlSchedule_SOURCES = HadronsXmlSchedule.cc -HadronsXmlSchedule_LDADD = libHadrons.a -lGrid From 90f40009358acf4c8e75888c0425369c3dea1d4d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 19:20:01 +0000 Subject: [PATCH 176/620] Hadrons: scheduler debug less verbose --- extras/Hadrons/GeneticScheduler.hpp | 8 ++++---- extras/Hadrons/VirtualMachine.cc | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extras/Hadrons/GeneticScheduler.hpp b/extras/Hadrons/GeneticScheduler.hpp index 9a6476c3..d6f9bdee 100644 --- a/extras/Hadrons/GeneticScheduler.hpp +++ b/extras/Hadrons/GeneticScheduler.hpp @@ -130,7 +130,7 @@ void GeneticScheduler::nextGeneration(void) { initPopulation(); } - LOG(Debug) << "Starting population:\n" << *this << std::endl; + //LOG(Debug) << "Starting population:\n" << *this << std::endl; // random mutations //PARALLEL_FOR_LOOP @@ -138,7 +138,7 @@ void GeneticScheduler::nextGeneration(void) { doMutation(); } - LOG(Debug) << "After mutations:\n" << *this << std::endl; + //LOG(Debug) << "After mutations:\n" << *this << std::endl; // mating //PARALLEL_FOR_LOOP @@ -146,14 +146,14 @@ void GeneticScheduler::nextGeneration(void) { doCrossover(); } - LOG(Debug) << "After mating:\n" << *this << std::endl; + //LOG(Debug) << "After mating:\n" << *this << std::endl; // grim reaper auto it = population_.begin(); std::advance(it, par_.popSize); population_.erase(it, population_.end()); - LOG(Debug) << "After grim reaper:\n" << *this << std::endl; + //LOG(Debug) << "After grim reaper:\n" << *this << std::endl; } // evolution steps ///////////////////////////////////////////////////////////// diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index 1bd18100..1c60aa5b 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -549,7 +549,7 @@ VirtualMachine::Program VirtualMachine::schedule(const GeneticPar &par) gen = 0; do { - LOG(Debug) << "Generation " << gen << ":" << std::endl; + //LOG(Debug) << "Generation " << gen << ":" << std::endl; scheduler.nextGeneration(); if (gen != 0) { From fcac5c07722a3fb200a6e2ae62e998c526f44473 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 2 Mar 2018 19:20:23 +0000 Subject: [PATCH 177/620] Hadrons: scalar SU(N) fixes --- extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 8 ++++++-- extras/Hadrons/Modules/MScalarSUN/TransProj.hpp | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp index 850efe6a..8c1239df 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -110,7 +110,7 @@ std::vector TEMT::getInput(void) template std::vector TEMT::getOutput(void) { - std::vector out = {getName()}; + std::vector out; for (unsigned int mu = 0; mu < env().getNd(); ++mu) for (unsigned int nu = mu; nu < env().getNd(); ++nu) @@ -125,7 +125,11 @@ std::vector TEMT::getOutput(void) template void TEMT::setup(void) { - envCreateLat(ComplexField, getName()); + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + envCreateLat(ComplexField, varName(getName(), mu, nu)); + } envTmpLat(ComplexField, "sumkin"); } diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp index 09386cea..4532b4ab 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -104,7 +104,7 @@ std::vector TTransProj::getInput(void) template std::vector TTransProj::getOutput(void) { - std::vector out = {getName()}; + std::vector out; for (unsigned int mu = 0; mu < env().getNd(); ++mu) for (unsigned int nu = mu; nu < env().getNd(); ++nu) From 2e88408f5ce1bc1ba4052be07c4b1e94f0a99f5a Mon Sep 17 00:00:00 2001 From: Fionn O hOgain Date: Fri, 2 Mar 2018 22:27:41 +0000 Subject: [PATCH 178/620] Some changes needed for deflation interface --- lib/algorithms/iterative/Deflation.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/algorithms/iterative/Deflation.h b/lib/algorithms/iterative/Deflation.h index b6aa0d3d..b2239c55 100644 --- a/lib/algorithms/iterative/Deflation.h +++ b/lib/algorithms/iterative/Deflation.h @@ -59,7 +59,7 @@ public: assert(evec.size()==eval.size()); auto N = evec.size(); for (int i=0;i Date: Sat, 3 Mar 2018 13:42:36 +0000 Subject: [PATCH 179/620] Hadrons: basic GraphViz visualisation --- extras/Hadrons/VirtualMachine.cc | 43 +++++++++++++++++++++++++++++++ extras/Hadrons/VirtualMachine.hpp | 6 ++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index 1c60aa5b..eb1f68ba 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -111,6 +111,7 @@ void VirtualMachine::pushModule(VirtualMachine::ModPt &pt) { // output does not exists, add it env().addObject(out, address); + module_[address].output.push_back(env().getObjectAddress(out)); } else { @@ -313,6 +314,48 @@ void VirtualMachine::makeModuleGraph(void) graph_ = graph; } +// dump GraphViz graph ///////////////////////////////////////////////////////// +void VirtualMachine::dumpModuleGraph(std::ostream &out) +{ + makeModuleGraph(); + out << "digraph hadrons {" << std::endl; + out << "node [shape=record, fontname=\"Courier\", fontsize=\"11\"];" << std::endl; + out << "graph [fontname = \"Courier\", fontsize=\"11\"];" << std::endl; + out << "edge [fontname = \"Courier\", fontsize=\"11\"];"<< std::endl; + for (unsigned int m = 0; m < module_.size(); ++m) + { + + } + for (unsigned int m = 0; m < module_.size(); ++m) + { + for (auto &in: module_[m].input) + { + int min = env().getObjectModule(in); + + out << min << " -> " << m << " [ label = \"" + << env().getObjectName(in) << "\" ];" << std::endl; + } + } + for (unsigned int m = 0; m < module_.size(); ++m) + { + out << m << " [ label = \"{ " << getModule(m)->getRegisteredName() + << " | " << getModuleName(m) << "}\" ];" << std::endl; + } + out << "}\n" << std::endl; +} + +void VirtualMachine::dumpModuleGraph(void) +{ + dumpModuleGraph(std::cout); +} + +void VirtualMachine::dumpModuleGraph(const std::string filename) +{ + std::ofstream f(filename); + + dumpModuleGraph(f); +} + // memory profile ////////////////////////////////////////////////////////////// const VirtualMachine::MemoryProfile & VirtualMachine::getMemoryProfile(void) { diff --git a/extras/Hadrons/VirtualMachine.hpp b/extras/Hadrons/VirtualMachine.hpp index 19a74f94..68eeb0c0 100644 --- a/extras/Hadrons/VirtualMachine.hpp +++ b/extras/Hadrons/VirtualMachine.hpp @@ -84,7 +84,7 @@ private: const std::type_info *type{nullptr}; std::string name; ModPt data{nullptr}; - std::vector input; + std::vector input, output; size_t maxAllocated; }; public: @@ -120,6 +120,10 @@ public: void printContent(void) const; // module graph (could be a const reference if topoSort was const) Graph getModuleGraph(void); + // dump GraphViz graph + void dumpModuleGraph(std::ostream &out); + void dumpModuleGraph(void); + void dumpModuleGraph(const std::string filename); // memory profile const MemoryProfile &getMemoryProfile(void); // garbage collector From 1dc86efd26244d59c4db442ca6ee2853ac2d488d Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 5 Mar 2018 12:22:18 +0000 Subject: [PATCH 180/620] Finalize protection --- lib/communicator/SharedMemoryMPI.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index 9e5d8f15..45edbb07 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -401,7 +401,10 @@ void *SharedMemory::ShmBufferTranslate(int rank,void * local_p) } SharedMemory::~SharedMemory() { - MPI_Comm_free(&ShmComm); + int MPI_is_finalised; MPI_Finalized(&MPI_is_finalised); + if ( !MPI_is_finalised ) { + MPI_Comm_free(&ShmComm); + } }; } From c399c2b44dea7e6cc4ca6ee34adcd1a86b07c338 Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 5 Mar 2018 12:55:41 +0000 Subject: [PATCH 181/620] Guido broke the charge conjugate plaquette action with premature optimisation. This sector of the code does not matter for anything other than Guido's quenched HMC studies, and any plaq specific optimisations should be retained in a private branch instead of destroying the code simplicity. --- lib/qcd/action/gauge/WilsonGaugeAction.h | 12 ++++-------- lib/qcd/utils/WilsonLoops.h | 5 +++-- tests/forces/Test_gp_rect_force.cc | 4 ++-- tests/forces/Test_gpwilson_force.cc | 2 +- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/lib/qcd/action/gauge/WilsonGaugeAction.h b/lib/qcd/action/gauge/WilsonGaugeAction.h index 1ea780b7..77c2424c 100644 --- a/lib/qcd/action/gauge/WilsonGaugeAction.h +++ b/lib/qcd/action/gauge/WilsonGaugeAction.h @@ -71,18 +71,14 @@ class WilsonGaugeAction : public Action { RealD factor = 0.5 * beta / RealD(Nc); - //GaugeLinkField Umu(U._grid); + GaugeLinkField Umu(U._grid); GaugeLinkField dSdU_mu(U._grid); for (int mu = 0; mu < Nd; mu++) { - //Umu = PeekIndex(U, mu); + Umu = PeekIndex(U, mu); // Staple in direction mu - //WilsonLoops::Staple(dSdU_mu, U, mu); - //dSdU_mu = Ta(Umu * dSdU_mu) * factor; - - - WilsonLoops::StapleMult(dSdU_mu, U, mu); - dSdU_mu = Ta(dSdU_mu) * factor; + WilsonLoops::Staple(dSdU_mu, U, mu); + dSdU_mu = Ta(Umu * dSdU_mu) * factor; PokeIndex(dSdU, dSdU_mu, mu); } diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index cdd76ecc..6cf34e0c 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -212,6 +212,7 @@ public: // For the force term +/* static void StapleMult(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { GridBase *grid = Umu._grid; std::vector U(Nd, grid); @@ -225,7 +226,7 @@ static void StapleMult(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { for (int nu = 0; nu < Nd; nu++) { if (nu != mu) { - // this is ~10% faster than the Staple + // this is ~10% faster than the Staple -- PAB: so what it gives the WRONG answers for other BC's! tmp1 = Cshift(U[nu], mu, 1); tmp2 = Cshift(U[mu], nu, 1); staple += tmp1* adj(U[nu]*tmp2); @@ -235,7 +236,7 @@ static void StapleMult(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { } staple = U[mu]*staple; } - +*/ ////////////////////////////////////////////////// // the sum over all staples on each site ////////////////////////////////////////////////// diff --git a/tests/forces/Test_gp_rect_force.cc b/tests/forces/Test_gp_rect_force.cc index bb35c77a..6b3349e0 100644 --- a/tests/forces/Test_gp_rect_force.cc +++ b/tests/forces/Test_gp_rect_force.cc @@ -59,8 +59,8 @@ int main (int argc, char ** argv) double beta = 1.0; double c1 = 0.331; - //GparityPlaqPlusRectangleActionR Action(beta,c1); - ConjugateWilsonGaugeActionR Action(beta); + ConjugatePlaqPlusRectangleActionR Action(beta,c1); + // ConjugateWilsonGaugeActionR Action(beta); //WilsonGaugeActionR Action(beta); ComplexD S = Action.S(U); diff --git a/tests/forces/Test_gpwilson_force.cc b/tests/forces/Test_gpwilson_force.cc index ebde61a5..e52ed7ee 100644 --- a/tests/forces/Test_gpwilson_force.cc +++ b/tests/forces/Test_gpwilson_force.cc @@ -91,7 +91,7 @@ int main (int argc, char ** argv) //////////////////////////////////// // Modify the gauge field a little //////////////////////////////////// - RealD dt = 0.0001; + RealD dt = 0.01; LatticeColourMatrix mommu(UGrid); LatticeColourMatrix forcemu(UGrid); From cd51b9af99e0226a22112592682eb3bfe6c63fc2 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 5 Mar 2018 19:58:13 +0000 Subject: [PATCH 182/620] Torture yourself with namespace lookup 101 --- extras/Hadrons/Global.hpp | 7 +++- lib/serialisation/BaseIO.h | 82 +++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index ed8f4f32..e9f5933b 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -43,12 +43,15 @@ See the full license in the file "LICENSE" in the top level distribution directo namespace Grid {\ using namespace QCD;\ namespace Hadrons {\ -using Grid::operator<<; +using Grid::operator<<;\ +using Grid::operator>>; #define END_HADRONS_NAMESPACE }} #define BEGIN_MODULE_NAMESPACE(name)\ namespace name {\ -using Grid::operator<<; +using Grid::operator<<;\ +using Grid::operator>>; + #define END_MODULE_NAMESPACE } /* the 'using Grid::operator<<;' statement prevents a very nasty compilation diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index 24e1cec7..d2db8bfc 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -33,42 +33,6 @@ Author: Guido Cossu #include namespace Grid { - // Vector IO utilities /////////////////////////////////////////////////////// - // helper function to read space-separated values - template - std::vector strToVec(const std::string s) - { - std::istringstream sstr(s); - T buf; - std::vector v; - - while(!sstr.eof()) - { - sstr >> buf; - v.push_back(buf); - } - - return v; - } - - // output to streams for vectors - template < class T > - inline std::ostream & operator<<(std::ostream &os, const std::vector &v) - { - os << "["; - for (auto &x: v) - { - os << x << " "; - } - if (v.size() > 0) - { - os << "\b"; - } - os << "]"; - - return os; - } - // Vector element trait ////////////////////////////////////////////////////// template struct element @@ -151,15 +115,15 @@ namespace Grid { do { is.get(c); - } while (c != '<' && !is.eof()); - if (c == '<') + } while (c != '{' && !is.eof()); + if (c == '{') { int start = is.tellg(); do { is.get(c); - } while (c != '>' && !is.eof()); - if (c == '>') + } while (c != '}' && !is.eof()); + if (c == '}') { int end = is.tellg(); int psize = end - start - 1; @@ -182,7 +146,43 @@ namespace Grid { template inline std::ostream & operator<<(std::ostream &os, const std::pair &p) { - os << "<" << p.first << " " << p.second << ">"; + os << "{" << p.first << " " << p.second << "}"; + return os; + } + + // Vector IO utilities /////////////////////////////////////////////////////// + // helper function to read space-separated values + template + std::vector strToVec(const std::string s) + { + std::istringstream sstr(s); + T buf; + std::vector v; + + while(!sstr.eof()) + { + sstr >> buf; + v.push_back(buf); + } + + return v; + } + + // output to streams for vectors + template < class T > + inline std::ostream & operator<<(std::ostream &os, const std::vector &v) + { + os << "["; + for (auto &x: v) + { + os << x << " "; + } + if (v.size() > 0) + { + os << "\b"; + } + os << "]"; + return os; } From dda6c69d5b32aa7d108b225928b76b8e6748b265 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 5 Mar 2018 19:58:40 +0000 Subject: [PATCH 183/620] Hadrons: scalar SU(N) shift probes --- extras/Hadrons/Modules.hpp | 1 + .../Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 169 ++++++++++++++++++ extras/Hadrons/modules.inc | 1 + 3 files changed, 171 insertions(+) create mode 100644 extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 695dfd02..ee53faa8 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -61,6 +61,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp new file mode 100644 index 00000000..89059180 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -0,0 +1,169 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MScalarSUN_ShiftProbe_hpp_ +#define Hadrons_MScalarSUN_ShiftProbe_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Ward identity phi^n probe with fields at different positions * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +typedef std::pair ShiftPair; + +class ShiftProbePar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(ShiftProbePar, + std::string, field, + std::string, shifts, + std::string, output); +}; + +template +class TShiftProbe: public Module +{ +public: + + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, op, + Complex , value); + }; +public: + // constructor + TShiftProbe(const std::string name); + // destructor + virtual ~TShiftProbe(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(ShiftProbeSU2, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_NS(ShiftProbeSU3, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_NS(ShiftProbeSU4, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_NS(ShiftProbeSU5, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_NS(ShiftProbeSU6, TShiftProbe>, MScalarSUN); + +/****************************************************************************** + * TShiftProbe implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TShiftProbe::TShiftProbe(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TShiftProbe::getInput(void) +{ + std::vector in = {par().field}; + + return in; +} + +template +std::vector TShiftProbe::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TShiftProbe::setup(void) +{ + envTmpLat(Field, "acc"); + envCacheLat(ComplexField, getName()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TShiftProbe::execute(void) +{ + LOG(Message) << "Creating shift probe for shifts " << par().shifts + << std::endl; + + std::vector shift; + unsigned int sign; + auto &phi = envGet(Field, par().field); + auto &probe = envGet(ComplexField, getName()); + + shift = strToVec(par().shifts); + if (shift.size() % 2 != 0) + { + HADRON_ERROR(Size, "the number of shifts is odd"); + } + sign = (shift.size() % 4 == 0) ? 1 : -1; + for (auto &s: shift) + { + if (s.first >= env().getNd()) + { + HADRON_ERROR(Size, "dimension to large for shift <" + + std::to_string(s.first) + " " + + std::to_string(s.second) + ">" ); + } + } + envGetTmp(Field, acc); + acc = 1.; + for (unsigned int i = 0; i < shift.size(); ++i) + { + if (shift[i].second == 0) + { + acc *= phi; + } + else + { + acc *= Cshift(phi, shift[i].first, shift[i].second); + } + } + probe = sign*trace(acc); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_ShiftProbe_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 44df3091..c0be8aef 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -44,6 +44,7 @@ modules_hpp =\ Modules/MAction/Wilson.hpp \ Modules/MAction/WilsonClover.hpp \ Modules/MAction/ZMobiusDWF.hpp \ + Modules/MScalarSUN/ShiftProbe.hpp \ Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/EMT.hpp \ From c793947209aa0fb0111cf95b911e931b2c725d4c Mon Sep 17 00:00:00 2001 From: James Harrison Date: Tue, 6 Mar 2018 16:27:26 +0000 Subject: [PATCH 184/620] Add overloaded Photon constructors, with default parameters for IR improvements and infinite-volume G(x=0). --- extras/Hadrons/Modules/MGauge/UnitEm.cc | 2 +- lib/qcd/action/gauge/Photon.h | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index ad842584..e5536d7a 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -61,7 +61,7 @@ void TUnitEm::setup(void) // execution /////////////////////////////////////////////////////////////////// void TUnitEm::execute(void) { - PhotonR photon(0, 0, std::vector(), 0.0); // Just chose arbitrary input values here + PhotonR photon(0, 0); // Just chose arbitrary input values here auto &a = envGet(EmField, getName()); LOG(Message) << "Generating unit EM potential..." << std::endl; photon.UnitField(a); diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index bcfe40e0..f36df5ea 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -60,6 +60,9 @@ namespace QCD{ GRID_SERIALIZABLE_ENUM(Gauge, undef, feynman, 1, coulomb, 2, landau, 3); GRID_SERIALIZABLE_ENUM(ZmScheme, undef, qedL, 1, qedTL, 2, qedInf, 3); public: + Photon(Gauge gauge, ZmScheme zmScheme); + Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements); + Photon(Gauge gauge, ZmScheme zmScheme, Real G0); Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements, Real G0); virtual ~Photon(void) = default; void FreePropagator(const GaugeField &in, GaugeField &out); @@ -82,12 +85,30 @@ namespace QCD{ typedef Photon PhotonR; + template + Photon::Photon(Gauge gauge, ZmScheme zmScheme) + : gauge_(gauge), zmScheme_(zmScheme), improvement_(std::vector()), + G0_(0.15493339023106021408483720810737508876916113364521) + {} + + template + Photon::Photon(Gauge gauge, ZmScheme zmScheme, + std::vector improvements) + : gauge_(gauge), zmScheme_(zmScheme), improvement_(improvements), + G0_(0.15493339023106021408483720810737508876916113364521) + {} + + template + Photon::Photon(Gauge gauge, ZmScheme zmScheme, Real G0) + : gauge_(gauge), zmScheme_(zmScheme), improvement_(std::vector()), G0_(G0) + {} + template Photon::Photon(Gauge gauge, ZmScheme zmScheme, std::vector improvements, Real G0) : gauge_(gauge), zmScheme_(zmScheme), improvement_(improvements), G0_(G0) {} - + template void Photon::FreePropagator (const GaugeField &in,GaugeField &out) { From 485c5db0fe28b04c867caf33c879c58f9b924d96 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 6 Mar 2018 19:22:03 +0000 Subject: [PATCH 185/620] conversion of Grid tensors to nested std::vector in preparation for tensor serialisation --- lib/serialisation/BaseIO.h | 35 +++++++++++++++ tests/IO/Test_serialisation.cc | 78 +++++++--------------------------- 2 files changed, 51 insertions(+), 62 deletions(-) diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index 24e1cec7..1af5acc6 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -31,6 +31,7 @@ Author: Guido Cossu #define GRID_SERIALISATION_ABSTRACT_READER_H #include +#include namespace Grid { // Vector IO utilities /////////////////////////////////////////////////////// @@ -69,6 +70,40 @@ namespace Grid { return os; } + // convert Grid scalar tensors to std::vectors + template + void tensorToVec(V &v, const T& t) + { + v = t; + } + + template + void tensorToVec(V &v, const iScalar& t) + { + tensorToVec(v, t._internal); + } + + template + void tensorToVec(std::vector &v, const iVector& t) + { + v.resize(N); + for (unsigned int i = 0; i < N; i++) + { + tensorToVec(v[i], t._internal[i]); + } + } + + template + void tensorToVec(std::vector> &v, const iMatrix& t) + { + v.resize(N, std::vector(N)); + for (unsigned int i = 0; i < N; i++) + for (unsigned int j = 0; j < N; j++) + { + tensorToVec(v[i][j], t._internal[i][j]); + } + } + // Vector element trait ////////////////////////////////////////////////////// template struct element diff --git a/tests/IO/Test_serialisation.cc b/tests/IO/Test_serialisation.cc index 82638ad9..cdafd5c0 100644 --- a/tests/IO/Test_serialisation.cc +++ b/tests/IO/Test_serialisation.cc @@ -197,68 +197,22 @@ int main(int argc,char **argv) std::cout << flatdv.getVector() << std::endl; std::cout << std::endl; + std::cout << "==== Grid tensor to vector test" << std::endl; - std::cout << ".:::::: Testing JSON classes "<< std::endl; - - - { - JSONWriter JW("bother.json"); - - // test basic type writing - myenum a = myenum::red; - push(JW,"BasicTypes"); - write(JW,std::string("i16"),i16); - write(JW,"myenum",a); - write(JW,"u16",u16); - write(JW,"i32",i32); - write(JW,"u32",u32); - write(JW,"i64",i64); - write(JW,"u64",u64); - write(JW,"f",f); - write(JW,"d",d); - write(JW,"b",b); - pop(JW); - - - // test serializable class writing - myclass obj(1234); // non-trivial constructor - std::cout << obj << std::endl; - std::cout << "-- serialisable class writing to 'bother.json'..." << std::endl; - write(JW,"obj",obj); - JW.write("obj2", obj); - - - std::vector vec; - vec.push_back(myclass(1234)); - vec.push_back(myclass(5678)); - vec.push_back(myclass(3838)); - write(JW, "objvec", vec); - - } - - - { - JSONReader RD("bother.json"); - myclass jcopy1; - std::vector jveccopy1; - read(RD,"obj",jcopy1); - read(RD,"objvec", jveccopy1); - std::cout << "Loaded (JSON) -----------------" << std::endl; - std::cout << jcopy1 << std::endl << jveccopy1 << std::endl; - } - - -/* - // This is still work in progress - { - // Testing the next element function - JSONReader RD("test.json"); - RD.push("grid"); - RD.push("Observable"); - std::string name; - read(RD,"name", name); - } -*/ - + GridSerialRNG rng; + SpinColourMatrix scm; + SpinColourVector scv; + std::vector>>> scmv; + std::vector> scvv; + rng.SeedFixedIntegers(std::vector({42,10,81,9})); + random(rng, scm); + random(rng, scv); + std::cout << "Test spin-color matrix: " << scm << std::endl; + std::cout << "Test spin-color vector: " << scv << std::endl; + std::cout << "Converting to std::vector" << std::endl; + tensorToVec(scmv, scm); + tensorToVec(scvv, scv); + std::cout << "Spin-color matrix: " << scmv << std::endl; + std::cout << "Spin-color vector: " << scvv << std::endl; } From b9382020813d3872d4397da89dec16f68a950be6 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Wed, 7 Mar 2018 14:08:43 +0000 Subject: [PATCH 186/620] Overlapped Comm for Wilson DhopInternal --- lib/qcd/action/fermion/WilsonFermion.cc | 90 ++++++++++++++++++++++++- lib/qcd/action/fermion/WilsonFermion.h | 6 ++ lib/qcd/action/fermion/WilsonKernels.h | 41 +++++------ 3 files changed, 114 insertions(+), 23 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonFermion.cc b/lib/qcd/action/fermion/WilsonFermion.cc index 19f9674d..a7c69ac9 100644 --- a/lib/qcd/action/fermion/WilsonFermion.cc +++ b/lib/qcd/action/fermion/WilsonFermion.cc @@ -322,15 +322,98 @@ void WilsonFermion::DhopDirDisp(const FermionField &in, FermionField &out, parallel_for (int sss = 0; sss < in._grid->oSites(); sss++) { Kernels::DhopDir(Stencil, Umu, Stencil.CommBuf(), sss, sss, in, out, dirdisp, gamma); } -}; - +} +/*Change starts*/ template void WilsonFermion::DhopInternal(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, const FermionField &in, FermionField &out, int dag) { - assert((dag == DaggerNo) || (dag == DaggerYes)); +#ifdef GRID_OMP + if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) + DhopInternalOverlappedComms(st,lo,U,in,out,dag); + else +#endif + DhopInternalSerial(st,lo,U,in,out,dag); +} + +template +void WilsonFermion::DhopInternalOverlappedComms(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, + const FermionField &in, + FermionField &out, int dag) { + assert((dag == DaggerNo) || (dag == DaggerYes)); +#ifdef GRID_OMP + Compressor compressor; + int len = U._grid->oSites(); + const int LLs = 1; + + st.Prepare(); + st.HaloGather(in,compressor); + st.CommsMergeSHM(compressor); +#pragma omp parallel + { + int tid = omp_get_thread_num(); + int nthreads = omp_get_num_threads(); + int ncomms = CartesianCommunicator::nCommThreads; + if (ncomms == -1) ncomms = 1; + assert(nthreads > ncomms); + if (tid >= ncomms) { + nthreads -= ncomms; + int ttid = tid - ncomms; + int n = len; + int chunk = n / nthreads; + int rem = n % nthreads; + int myblock, myn; + if (ttid < rem) { + myblock = ttid * chunk + ttid; + myn = chunk+1; + } else { + myblock = ttid*chunk + rem; + myn = chunk; + } + // do the compute + if (dag == DaggerYes) { + + for (int sss = myblock; sss < myblock+myn; ++sss) { + Kernels::DhopSiteDag(st, lo, U, st.CommBuf(), sss, sss, 1, 1, in, out); + } + } else { + for (int sss = myblock; sss < myblock+myn; ++sss) { + Kernels::DhopSite(st, lo, U, st.CommBuf(), sss, sss, 1, 1, in, out); + } + } //else + + } else { + st.CommunicateThreaded(); + } + + Compressor compressor(dag); + + if (dag == DaggerYes) { + parallel_for (int sss = 0; sss < in._grid->oSites(); sss++) { + Kernels::DhopSiteDag(st, lo, U, st.CommBuf(), sss, sss, 1, 1, in, out); + } + } else { + parallel_for (int sss = 0; sss < in._grid->oSites(); sss++) { + Kernels::DhopSite(st, lo, U, st.CommBuf(), sss, sss, 1, 1, in, out); + } + } + + } //pragma +#else + assert(0); +#endif +}; + + +template +void WilsonFermion::DhopInternalSerial(StencilImpl &st, LebesgueOrder &lo, + DoubledGaugeField &U, + const FermionField &in, + FermionField &out, int dag) { + assert((dag == DaggerNo) || (dag == DaggerYes)); Compressor compressor(dag); st.HaloExchange(in, compressor); @@ -344,6 +427,7 @@ void WilsonFermion::DhopInternal(StencilImpl &st, LebesgueOrder &lo, } } }; +/*Change ends */ FermOpTemplateInstantiate(WilsonFermion); AdjointFermOpTemplateInstantiate(WilsonFermion); diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index 933be732..55433854 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -115,6 +115,12 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { void DhopInternal(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, const FermionField &in, FermionField &out, int dag); + void DhopInternalSerial(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, + const FermionField &in, FermionField &out, int dag); + + void DhopInternalOverlappedComms(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, + const FermionField &in, FermionField &out, int dag); + // Constructor WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, diff --git a/lib/qcd/action/fermion/WilsonKernels.h b/lib/qcd/action/fermion/WilsonKernels.h index 2cf52660..e84b52f9 100644 --- a/lib/qcd/action/fermion/WilsonKernels.h +++ b/lib/qcd/action/fermion/WilsonKernels.h @@ -53,7 +53,7 @@ template class WilsonKernels : public FermionOperator , public typedef FermionOperator Base; public: - + template typename std::enable_if::type DhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf, @@ -70,27 +70,27 @@ public: break; #endif case OptHandUnroll: - for (int site = 0; site < Ns; site++) { - for (int s = 0; s < Ls; s++) { - if(interior&&exterior) WilsonKernels::HandDhopSite(st,lo,U,buf,sF,sU,in,out); - else if (interior) WilsonKernels::HandDhopSiteInt(st,lo,U,buf,sF,sU,in,out); - else if (exterior) WilsonKernels::HandDhopSiteExt(st,lo,U,buf,sF,sU,in,out); - sF++; - } - sU++; - } + for (int site = 0; site < Ns; site++) { + for (int s = 0; s < Ls; s++) { + if(interior&&exterior) WilsonKernels::HandDhopSite(st,lo,U,buf,sF,sU,in,out); + else if (interior) WilsonKernels::HandDhopSiteInt(st,lo,U,buf,sF,sU,in,out); + else if (exterior) WilsonKernels::HandDhopSiteExt(st,lo,U,buf,sF,sU,in,out); + sF++; + } + sU++; + } break; case OptGeneric: - for (int site = 0; site < Ns; site++) { - for (int s = 0; s < Ls; s++) { - if(interior&&exterior) WilsonKernels::GenericDhopSite(st,lo,U,buf,sF,sU,in,out); - else if (interior) WilsonKernels::GenericDhopSiteInt(st,lo,U,buf,sF,sU,in,out); - else if (exterior) WilsonKernels::GenericDhopSiteExt(st,lo,U,buf,sF,sU,in,out); - else assert(0); - sF++; - } - sU++; - } + for (int site = 0; site < Ns; site++) { + for (int s = 0; s < Ls; s++) { + if(interior&&exterior) WilsonKernels::GenericDhopSite(st,lo,U,buf,sF,sU,in,out); + else if (interior) WilsonKernels::GenericDhopSiteInt(st,lo,U,buf,sF,sU,in,out); + else if (exterior) WilsonKernels::GenericDhopSiteExt(st,lo,U,buf,sF,sU,in,out); + else assert(0); + sF++; + } + sU++; + } break; default: assert(0); @@ -200,6 +200,7 @@ private: void GenericDhopSiteDagExt(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf, int sF, int sU, const FermionField &in, FermionField &out); + void AsmDhopSite(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U, SiteHalfSpinor * buf, int sF, int sU, int Ls, int Ns, const FermionField &in,FermionField &out); From 8b14096990ff0fe1969ace0bad933ff3dbbac8fc Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 7 Mar 2018 15:12:18 +0000 Subject: [PATCH 187/620] Conversion of Grid tensors to std::vector made more elegant, also pair syntax changed to (x y) to avoid issues with JSON/XML --- lib/serialisation/BaseIO.h | 128 ++++++++++++++++++++++++------------- 1 file changed, 83 insertions(+), 45 deletions(-) diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index 1af5acc6..5b37e1fb 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -34,74 +34,76 @@ Author: Guido Cossu #include namespace Grid { - // Vector IO utilities /////////////////////////////////////////////////////// - // helper function to read space-separated values + // Grid scalar tensors to nested std::vectors ////////////////////////////////// template - std::vector strToVec(const std::string s) + struct TensorToVec { - std::istringstream sstr(s); - T buf; - std::vector v; - - while(!sstr.eof()) - { - sstr >> buf; - v.push_back(buf); - } - - return v; - } - - // output to streams for vectors - template < class T > - inline std::ostream & operator<<(std::ostream &os, const std::vector &v) + typedef T type; + }; + + template + struct TensorToVec> { - os << "["; - for (auto &x: v) - { - os << x << " "; - } - if (v.size() > 0) - { - os << "\b"; - } - os << "]"; - - return os; - } - - // convert Grid scalar tensors to std::vectors - template - void tensorToVec(V &v, const T& t) + typedef TensorToVec::type type; + }; + + template + struct TensorToVec> + { + typedef TensorToVec::type type; + }; + + template + struct TensorToVec> + { + typedef std::vector::type> type; + }; + + template + struct TensorToVec> + { + typedef std::vector::type>> type; + }; + + template + TensorToVec::type tensorToVec(const T &t) { v = t; } template - void tensorToVec(V &v, const iScalar& t) + TensorToVec>::type tensorToVec(V &v, const iScalar& t) { - tensorToVec(v, t._internal); + return tensorToVec(t._internal); } - template - void tensorToVec(std::vector &v, const iVector& t) + template + TensorToVec>::type tensorToVec(const iVector& t) { + TensorToVec>::type v; + v.resize(N); for (unsigned int i = 0; i < N; i++) { - tensorToVec(v[i], t._internal[i]); + v[i] = tensorToVec(t._internal[i]); } + + return v; } - template - void tensorToVec(std::vector> &v, const iMatrix& t) + template + TensorToVec>::type tensorToVec(const iMatrix& t) { + TensorToVec>::type v; + v.resize(N, std::vector(N)); for (unsigned int i = 0; i < N; i++) for (unsigned int j = 0; j < N; j++) { - tensorToVec(v[i][j], t._internal[i][j]); + v[i][j] = tensorToVec(t._internal[i][j]); } + + return v; } // Vector element trait ////////////////////////////////////////////////////// @@ -217,7 +219,43 @@ namespace Grid { template inline std::ostream & operator<<(std::ostream &os, const std::pair &p) { - os << "<" << p.first << " " << p.second << ">"; + os << "{" << p.first << " " << p.second << "}"; + return os; + } + + // Vector IO utilities /////////////////////////////////////////////////////// + // helper function to read space-separated values + template + std::vector strToVec(const std::string s) + { + std::istringstream sstr(s); + T buf; + std::vector v; + + while(!sstr.eof()) + { + sstr >> buf; + v.push_back(buf); + } + + return v; + } + + // output to streams for vectors + template < class T > + inline std::ostream & operator<<(std::ostream &os, const std::vector &v) + { + os << "["; + for (auto &x: v) + { + os << x << " "; + } + if (v.size() > 0) + { + os << "\b"; + } + os << "]"; + return os; } From 90dbe03e1764c28f3afac7f53576dd4249f07ea8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 7 Mar 2018 15:12:18 +0000 Subject: [PATCH 188/620] Conversion of Grid tensors to std::vector made more elegant, also pair syntax changed to (x y) to avoid issues with JSON/XML --- lib/serialisation/BaseIO.h | 141 ++++++++++++++++++++------------- tests/IO/Test_serialisation.cc | 6 +- 2 files changed, 90 insertions(+), 57 deletions(-) diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index 1af5acc6..0a919aab 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -34,74 +34,73 @@ Author: Guido Cossu #include namespace Grid { - // Vector IO utilities /////////////////////////////////////////////////////// - // helper function to read space-separated values + // Grid scalar tensors to nested std::vectors ////////////////////////////////// template - std::vector strToVec(const std::string s) + struct TensorToVec { - std::istringstream sstr(s); - T buf; - std::vector v; - - while(!sstr.eof()) - { - sstr >> buf; - v.push_back(buf); - } - - return v; - } - - // output to streams for vectors - template < class T > - inline std::ostream & operator<<(std::ostream &os, const std::vector &v) + typedef T type; + }; + + template + struct TensorToVec> { - os << "["; - for (auto &x: v) - { - os << x << " "; - } - if (v.size() > 0) - { - os << "\b"; - } - os << "]"; - - return os; - } - - // convert Grid scalar tensors to std::vectors - template - void tensorToVec(V &v, const T& t) + typedef typename TensorToVec::type type; + }; + + template + struct TensorToVec> { - v = t; + typedef typename std::vector::type> type; + }; + + template + struct TensorToVec> + { + typedef typename std::vector::type>> type; + }; + + template + typename TensorToVec::type tensorToVec(const T &t) + { + return t; } - template - void tensorToVec(V &v, const iScalar& t) + template + typename TensorToVec>::type tensorToVec(const iScalar& t) { - tensorToVec(v, t._internal); + return tensorToVec(t._internal); } - template - void tensorToVec(std::vector &v, const iVector& t) + template + typename TensorToVec>::type tensorToVec(const iVector& t) { + typename TensorToVec>::type v; + v.resize(N); for (unsigned int i = 0; i < N; i++) { - tensorToVec(v[i], t._internal[i]); + v[i] = tensorToVec(t._internal[i]); } + + return v; } - template - void tensorToVec(std::vector> &v, const iMatrix& t) + template + typename TensorToVec>::type tensorToVec(const iMatrix& t) { - v.resize(N, std::vector(N)); + typename TensorToVec>::type v; + + v.resize(N); for (unsigned int i = 0; i < N; i++) - for (unsigned int j = 0; j < N; j++) { - tensorToVec(v[i][j], t._internal[i][j]); + v[i].resize(N); + for (unsigned int j = 0; j < N; j++) + { + v[i][j] = tensorToVec(t._internal[i][j]); + } } + + return v; } // Vector element trait ////////////////////////////////////////////////////// @@ -186,15 +185,15 @@ namespace Grid { do { is.get(c); - } while (c != '<' && !is.eof()); - if (c == '<') + } while (c != '(' && !is.eof()); + if (c == '(') { int start = is.tellg(); do { is.get(c); - } while (c != '>' && !is.eof()); - if (c == '>') + } while (c != ')' && !is.eof()); + if (c == ')') { int end = is.tellg(); int psize = end - start - 1; @@ -217,7 +216,43 @@ namespace Grid { template inline std::ostream & operator<<(std::ostream &os, const std::pair &p) { - os << "<" << p.first << " " << p.second << ">"; + os << "(" << p.first << " " << p.second << ")"; + return os; + } + + // Vector IO utilities /////////////////////////////////////////////////////// + // helper function to read space-separated values + template + std::vector strToVec(const std::string s) + { + std::istringstream sstr(s); + T buf; + std::vector v; + + while(!sstr.eof()) + { + sstr >> buf; + v.push_back(buf); + } + + return v; + } + + // output to streams for vectors + template < class T > + inline std::ostream & operator<<(std::ostream &os, const std::vector &v) + { + os << "["; + for (auto &x: v) + { + os << x << " "; + } + if (v.size() > 0) + { + os << "\b"; + } + os << "]"; + return os; } diff --git a/tests/IO/Test_serialisation.cc b/tests/IO/Test_serialisation.cc index cdafd5c0..d4b89652 100644 --- a/tests/IO/Test_serialisation.cc +++ b/tests/IO/Test_serialisation.cc @@ -202,8 +202,6 @@ int main(int argc,char **argv) GridSerialRNG rng; SpinColourMatrix scm; SpinColourVector scv; - std::vector>>> scmv; - std::vector> scvv; rng.SeedFixedIntegers(std::vector({42,10,81,9})); random(rng, scm); @@ -211,8 +209,8 @@ int main(int argc,char **argv) std::cout << "Test spin-color matrix: " << scm << std::endl; std::cout << "Test spin-color vector: " << scv << std::endl; std::cout << "Converting to std::vector" << std::endl; - tensorToVec(scmv, scm); - tensorToVec(scvv, scv); + auto scmv = tensorToVec(scm); + auto scvv = tensorToVec(scv); std::cout << "Spin-color matrix: " << scmv << std::endl; std::cout << "Spin-color vector: " << scvv << std::endl; } From 5e8af396fd2855d4cbc84931a1e0b99b86dbbb03 Mon Sep 17 00:00:00 2001 From: Dan H Date: Wed, 7 Mar 2018 13:11:51 -0500 Subject: [PATCH 189/620] Add print of the current git hash on Grid init. --- .gitignore | 1 + Makefile.am | 4 ++++ lib/util/Init.cc | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index dc59879f..49295fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -123,6 +123,7 @@ make-bin-BUCK.sh ##################### lib/qcd/spin/gamma-gen/*.h lib/qcd/spin/gamma-gen/*.cc +lib/version.h # vs code editor files # ######################## diff --git a/Makefile.am b/Makefile.am index 3a65cf1b..d507bf08 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,6 +5,10 @@ include $(top_srcdir)/doxygen.inc bin_SCRIPTS=grid-config +BUILT_SOURCES = version.h + +version.h: + echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d\\"%n" HEAD`" > $(srcdir)/lib/version.h .PHONY: bench check tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) diff --git a/lib/util/Init.cc b/lib/util/Init.cc index fb3d7a1e..b4ac14b7 100644 --- a/lib/util/Init.cc +++ b/lib/util/Init.cc @@ -49,6 +49,7 @@ Author: paboyle #include #include +#include #include @@ -288,6 +289,12 @@ void Grid_init(int *argc,char ***argv) std::cout << "but WITHOUT ANY WARRANTY; without even the implied warranty of"< Date: Thu, 8 Mar 2018 09:50:39 +0000 Subject: [PATCH 190/620] std::vector to tensor conversion + test units --- lib/serialisation/BaseIO.h | 32 +++++++++++++++++++++++++++++++ tests/IO/Test_serialisation.cc | 35 +++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index 0a919aab..d129b9e5 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -103,6 +103,38 @@ namespace Grid { return v; } + template + void vecToTensor(T &t, const typename TensorToVec::type &v) + { + t = v; + } + + + template + void vecToTensor(iScalar &t, const typename TensorToVec>::type &v) + { + vecToTensor(t._internal, v); + } + + template + void vecToTensor(iVector &t, const typename TensorToVec>::type &v) + { + for (unsigned int i = 0; i < N; i++) + { + vecToTensor(t._internal[i], v[i]); + } + } + + template + void vecToTensor(iMatrix &t, const typename TensorToVec>::type &v) + { + for (unsigned int i = 0; i < N; i++) + for (unsigned int j = 0; j < N; j++) + { + vecToTensor(t._internal[i][j], v[i][j]); + } + } + // Vector element trait ////////////////////////////////////////////////////// template struct element diff --git a/tests/IO/Test_serialisation.cc b/tests/IO/Test_serialisation.cc index d4b89652..93007e44 100644 --- a/tests/IO/Test_serialisation.cc +++ b/tests/IO/Test_serialisation.cc @@ -93,6 +93,24 @@ void ioTest(const std::string &filename, const O &object, const std::string &nam if (!good) exit(EXIT_FAILURE); } +template +void tensorConvTestFn(GridSerialRNG &rng, const std::string label) +{ + T t, ft; + Real n; + bool good; + + random(rng, t); + auto tv = tensorToVec(t); + vecToTensor(ft, tv); + n = norm2(t - ft); + good = (n == 0); + std::cout << label << " norm 2 diff: " << n << " -- " + << (good ? "success" : "failure") << std::endl; +} + +#define tensorConvTest(rng, type) tensorConvTestFn(rng, #type) + int main(int argc,char **argv) { std::cout << "==== basic IO" << std::endl; @@ -200,17 +218,12 @@ int main(int argc,char **argv) std::cout << "==== Grid tensor to vector test" << std::endl; GridSerialRNG rng; - SpinColourMatrix scm; - SpinColourVector scv; rng.SeedFixedIntegers(std::vector({42,10,81,9})); - random(rng, scm); - random(rng, scv); - std::cout << "Test spin-color matrix: " << scm << std::endl; - std::cout << "Test spin-color vector: " << scv << std::endl; - std::cout << "Converting to std::vector" << std::endl; - auto scmv = tensorToVec(scm); - auto scvv = tensorToVec(scv); - std::cout << "Spin-color matrix: " << scmv << std::endl; - std::cout << "Spin-color vector: " << scvv << std::endl; + tensorConvTest(rng, SpinColourMatrix); + tensorConvTest(rng, SpinColourVector); + tensorConvTest(rng, ColourMatrix); + tensorConvTest(rng, ColourVector); + tensorConvTest(rng, SpinMatrix); + tensorConvTest(rng, SpinVector); } From c49be8988be95f37c05741f6e807e41707c847b1 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 8 Mar 2018 09:51:22 +0000 Subject: [PATCH 191/620] Grid tensor serialisation --- lib/serialisation/Hdf5IO.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/serialisation/Hdf5IO.h b/lib/serialisation/Hdf5IO.h index 94ad9736..9140435d 100644 --- a/lib/serialisation/Hdf5IO.h +++ b/lib/serialisation/Hdf5IO.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "Hdf5Type.h" #ifndef H5_NO_NAMESPACE @@ -37,6 +38,12 @@ namespace Grid template typename std::enable_if>::is_number, void>::type writeDefault(const std::string &s, const std::vector &x); + template + void writeDefault(const std::string &s, const iScalar &t); + template + void writeDefault(const std::string &s, const iVector &t); + template + void writeDefault(const std::string &s, const iMatrix &t); private: template void writeSingleAttribute(const U &x, const std::string &name, @@ -147,6 +154,24 @@ namespace Grid } pop(); } + + template + void Hdf5Writer::writeDefault(const std::string &s, const iScalar &t) + { + writeDefault(s, tensorToVec(t)); + } + + template + void Hdf5Writer::writeDefault(const std::string &s, const iVector &t) + { + writeDefault(s, tensorToVec(t)); + } + + template + void Hdf5Writer::writeDefault(const std::string &s, const iMatrix &t) + { + writeDefault(s, tensorToVec(t)); + } // Reader template implementation //////////////////////////////////////////// template From 80302e95a84ffcbe9e0975241af575febc07c804 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Thu, 8 Mar 2018 15:34:03 +0000 Subject: [PATCH 192/620] MILC Interface --- .../fermion/ImprovedStaggeredFermion.cc | 33 ++++++------- .../action/fermion/ImprovedStaggeredFermion.h | 25 +++++----- .../fermion/ImprovedStaggeredFermion5D.cc | 48 ++++++++----------- .../fermion/ImprovedStaggeredFermion5D.h | 33 +++++++------ tests/core/Test_staggered5Dvec.cc | 5 +- 5 files changed, 67 insertions(+), 77 deletions(-) diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc index 811e482d..69a3fdc1 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc @@ -84,15 +84,6 @@ ImprovedStaggeredFermion::ImprovedStaggeredFermion(GaugeField &_Uthin, Gau { ImportGauge(_Uthin,_Ufat); } -template -ImprovedStaggeredFermion::ImprovedStaggeredFermion(GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid, - GridRedBlackCartesian &Hgrid, RealD _mass, - const ImplParams &p) - : ImprovedStaggeredFermion(Fgrid,Hgrid,_mass,1.0,1.0,1.0,p) -{ - ImportGaugeSimple(_Utriple,_Ufat); -} - //////////////////////////////////////////////////////////// // Momentum space propagator should be @@ -106,11 +97,6 @@ ImprovedStaggeredFermion::ImprovedStaggeredFermion(GaugeField &_Utriple, G // of above link to implmement fourier based solver. //////////////////////////////////////////////////////////// template -void ImprovedStaggeredFermion::ImportGauge(const GaugeField &_Uthin) -{ - ImportGauge(_Uthin,_Uthin); -}; -template void ImprovedStaggeredFermion::ImportGaugeSimple(const GaugeField &_Utriple,const GaugeField &_Ufat) { ///////////////////////////////////////////////////////////////// @@ -133,6 +119,20 @@ void ImprovedStaggeredFermion::ImportGaugeSimple(const GaugeField &_Utripl PokeIndex(Umu, -U, mu+4); } + CopyGaugeCheckerboards(); +} +template +void ImprovedStaggeredFermion::ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U) +{ + + Umu = _U; + UUUmu = _UUU; + CopyGaugeCheckerboards(); +} + +template +void ImprovedStaggeredFermion::CopyGaugeCheckerboards(void) +{ pickCheckerboard(Even, UmuEven, Umu); pickCheckerboard(Odd, UmuOdd , Umu); pickCheckerboard(Even, UUUmuEven,UUUmu); @@ -168,10 +168,7 @@ void ImprovedStaggeredFermion::ImportGauge(const GaugeField &_Uthin,const PokeIndex(UUUmu, U*(-0.5*c2/u0/u0/u0), mu+4); } - pickCheckerboard(Even, UmuEven, Umu); - pickCheckerboard(Odd, UmuOdd , Umu); - pickCheckerboard(Even, UUUmuEven, UUUmu); - pickCheckerboard(Odd, UUUmuOdd, UUUmu); + CopyGaugeCheckerboards(); } ///////////////////////////// diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h index 69d0aef4..c2c82073 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h @@ -110,30 +110,29 @@ class ImprovedStaggeredFermion : public StaggeredKernels, public ImprovedS void DhopInternalOverlappedComms(StencilImpl &st, LebesgueOrder &lo, DoubledGaugeField &U,DoubledGaugeField &UUU, const FermionField &in, FermionField &out, int dag); - // Constructor + ////////////////////////////////////////////////////////////////////////// + // Grid own interface Constructor + ////////////////////////////////////////////////////////////////////////// ImprovedStaggeredFermion(GaugeField &_Uthin, GaugeField &_Ufat, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, RealD _c1, RealD _c2,RealD _u0, const ImplParams &p = ImplParams()); ////////////////////////////////////////////////////////////////////////// - // MILC constructor no coefficients; premultiply links by desired scaling - ////////////////////////////////////////////////////////////////////////// - ImprovedStaggeredFermion(GaugeField &_Utriple, GaugeField &_Ufat, GridCartesian &Fgrid, - GridRedBlackCartesian &Hgrid, RealD _mass, - const ImplParams &p = ImplParams()); - - ////////////////////////////////////////////////////////////////////////// - // A don't initialise the gauge field constructor; largely internal + // MILC constructor no gauge fields ////////////////////////////////////////////////////////////////////////// ImprovedStaggeredFermion(GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, - RealD _c1, RealD _c2,RealD _u0, + RealD _c1=1.0, RealD _c2=1.0,RealD _u0=1.0, const ImplParams &p = ImplParams()); // DoubleStore impl dependent - void ImportGaugeSimple(const GaugeField &_Utriple, const GaugeField &_Ufat); - void ImportGauge(const GaugeField &_Uthin, const GaugeField &_Ufat); - void ImportGauge(const GaugeField &_Uthin); + void ImportGauge (const GaugeField &_Uthin ) { assert(0); } + void ImportGauge (const GaugeField &_Uthin ,const GaugeField &_Ufat); + void ImportGaugeSimple(const GaugeField &_UUU ,const GaugeField &_U); + void ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U); + DoubledGaugeField &GetU(void) { return Umu ; } ; + DoubledGaugeField &GetUUU(void) { return UUUmu; }; + void CopyGaugeCheckerboards(void); /////////////////////////////////////////////////////////////// // Data members require to support the functionality diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc index e5146d7a..df9f055e 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc @@ -128,7 +128,14 @@ ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GridCartesian StencilEven.BuildSurfaceList(LLs,vol4); StencilOdd.BuildSurfaceList(LLs,vol4); } - +template +void ImprovedStaggeredFermion5D::CopyGaugeCheckerboards(void) +{ + pickCheckerboard(Even, UmuEven, Umu); + pickCheckerboard(Odd, UmuOdd , Umu); + pickCheckerboard(Even, UUUmuEven,UUUmu); + pickCheckerboard(Odd, UUUmuOdd, UUUmu); +} template ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Uthin,GaugeField &_Ufat, GridCartesian &FiveDimGrid, @@ -144,26 +151,7 @@ ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Uthin, { ImportGauge(_Uthin,_Ufat); } -template -ImprovedStaggeredFermion5D::ImprovedStaggeredFermion5D(GaugeField &_Utriple,GaugeField &_Ufat, - GridCartesian &FiveDimGrid, - GridRedBlackCartesian &FiveDimRedBlackGrid, - GridCartesian &FourDimGrid, - GridRedBlackCartesian &FourDimRedBlackGrid, - RealD _mass, - const ImplParams &p) : - ImprovedStaggeredFermion5D(FiveDimGrid,FiveDimRedBlackGrid, - FourDimGrid,FourDimRedBlackGrid, - _mass,1.0,1.0,1.0,p) -{ - ImportGaugeSimple(_Utriple,_Ufat); -} -template -void ImprovedStaggeredFermion5D::ImportGauge(const GaugeField &_Uthin) -{ - ImportGauge(_Uthin,_Uthin); -}; /////////////////////////////////////////////////// // For MILC use; pass three link U's and 1 link U /////////////////////////////////////////////////// @@ -188,10 +176,17 @@ void ImprovedStaggeredFermion5D::ImportGaugeSimple(const GaugeField &_Utri Impl::InsertGaugeField(Umu,-U,mu+4); } - pickCheckerboard(Even, UmuEven, Umu); - pickCheckerboard(Odd, UmuOdd , Umu); - pickCheckerboard(Even, UUUmuEven,UUUmu); - pickCheckerboard(Odd, UUUmuOdd, UUUmu); + CopyGaugeCheckerboards(); +} +template +void ImprovedStaggeredFermion5D::ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U) +{ + ///////////////////////////////////////////////////////////////// + // Trivial import; phases and fattening and such like preapplied + ///////////////////////////////////////////////////////////////// + Umu = _U; + UUUmu = _UUU; + CopyGaugeCheckerboards(); } template void ImprovedStaggeredFermion5D::ImportGauge(const GaugeField &_Uthin,const GaugeField &_Ufat) @@ -221,10 +216,7 @@ void ImprovedStaggeredFermion5D::ImportGauge(const GaugeField &_Uthin,cons PokeIndex(UUUmu, U*(-0.5*c2/u0/u0/u0), mu+4); } - pickCheckerboard(Even, UmuEven, Umu); - pickCheckerboard(Odd, UmuOdd , Umu); - pickCheckerboard(Even, UUUmuEven, UUUmu); - pickCheckerboard(Odd, UUUmuOdd, UUUmu); + CopyGaugeCheckerboards(); } template void ImprovedStaggeredFermion5D::DhopDir(const FermionField &in, FermionField &out,int dir5,int disp) diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h index f2fce1c1..d9174ec8 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h @@ -139,15 +139,9 @@ namespace QCD { // Constructors - // -- No Gauge field - ImprovedStaggeredFermion5D(GridCartesian &FiveDimGrid, - GridRedBlackCartesian &FiveDimRedBlackGrid, - GridCartesian &FourDimGrid, - GridRedBlackCartesian &FourDimRedBlackGrid, - double _mass, - RealD _c1, RealD _c2,RealD _u0, - const ImplParams &p= ImplParams()); - // -- Thin link and fat link, with coefficients + //////////////////////////////////////////////////////////////////////////////////////////////// + // Grid internal interface -- Thin link and fat link, with coefficients + //////////////////////////////////////////////////////////////////////////////////////////////// ImprovedStaggeredFermion5D(GaugeField &_Uthin, GaugeField &_Ufat, GridCartesian &FiveDimGrid, @@ -160,19 +154,24 @@ namespace QCD { //////////////////////////////////////////////////////////////////////////////////////////////// // MILC constructor ; triple links, no rescale factors; must be externally pre multiplied //////////////////////////////////////////////////////////////////////////////////////////////// - ImprovedStaggeredFermion5D(GaugeField &_Utriple, - GaugeField &_Ufat, - GridCartesian &FiveDimGrid, + ImprovedStaggeredFermion5D(GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, double _mass, + RealD _c1=1.0, RealD _c2=1.0,RealD _u0=1.0, const ImplParams &p= ImplParams()); - - // DoubleStore - void ImportGauge(const GaugeField &_U); - void ImportGauge(const GaugeField &_Uthin,const GaugeField &_Ufat); - void ImportGaugeSimple(const GaugeField &_Uthin,const GaugeField &_Ufat); + + // DoubleStore gauge field in operator + void ImportGauge (const GaugeField &_Uthin ) { assert(0); } + void ImportGauge (const GaugeField &_Uthin ,const GaugeField &_Ufat); + void ImportGaugeSimple(const GaugeField &_UUU,const GaugeField &_U); + void ImportGaugeSimple(const DoubledGaugeField &_UUU,const DoubledGaugeField &_U); + // Give a reference; can be used to do an assignment or copy back out after import + // if Carleton wants to cache them and not use the ImportSimple + DoubledGaugeField &GetU(void) { return Umu ; } ; + DoubledGaugeField &GetUUU(void) { return UUUmu; }; + void CopyGaugeCheckerboards(void); /////////////////////////////////////////////////////////////// // Data members require to support the functionality diff --git a/tests/core/Test_staggered5Dvec.cc b/tests/core/Test_staggered5Dvec.cc index db76f792..2720c24c 100644 --- a/tests/core/Test_staggered5Dvec.cc +++ b/tests/core/Test_staggered5Dvec.cc @@ -141,6 +141,7 @@ int main (int argc, char ** argv) t1=usecond(); std::cout<" template @@ -252,42 +83,6 @@ namespace Grid { return os; } - // Vector IO utilities /////////////////////////////////////////////////////// - // helper function to read space-separated values - template - std::vector strToVec(const std::string s) - { - std::istringstream sstr(s); - T buf; - std::vector v; - - while(!sstr.eof()) - { - sstr >> buf; - v.push_back(buf); - } - - return v; - } - - // output to streams for vectors - template < class T > - inline std::ostream & operator<<(std::ostream &os, const std::vector &v) - { - os << "["; - for (auto &x: v) - { - os << x << " "; - } - if (v.size() > 0) - { - os << "\b"; - } - os << "]"; - - return os; - } - // Abstract writer/reader classes //////////////////////////////////////////// // static polymorphism implemented using CRTP idiom class Serializable; @@ -307,6 +102,12 @@ namespace Grid { template typename std::enable_if::value, void>::type write(const std::string& s, const U &output); + template + void write(const std::string &s, const iScalar &output); + template + void write(const std::string &s, const iVector &output); + template + void write(const std::string &s, const iMatrix &output); private: T *upcast; }; @@ -326,6 +127,12 @@ namespace Grid { template typename std::enable_if::value, void>::type read(const std::string& s, U &output); + template + void read(const std::string &s, iScalar &output); + template + void read(const std::string &s, iVector &output); + template + void read(const std::string &s, iMatrix &output); protected: template void fromString(U &output, const std::string &s); @@ -339,203 +146,9 @@ namespace Grid { }; template struct isWriter { static const bool value = false; - }; - - - - // Generic writer interface - // serializable base class - class Serializable - { - public: - template - static inline void write(Writer &WR,const std::string &s, - const Serializable &obj) - {} - - template - static inline void read(Reader &RD,const std::string &s, - Serializable &obj) - {} - - friend inline std::ostream & operator<<(std::ostream &os, - const Serializable &obj) - { - return os; - } }; - - // Flatten class template implementation ///////////////////////////////////// - template - void Flatten::accumulate(const Element &e) - { - flatVector_.push_back(e); - } - - template - template - void Flatten::accumulate(const W &v) - { - for (auto &e: v) - { - accumulate(e); - } - } - - template - void Flatten::accumulateDim(const Element &e) {}; - - template - template - void Flatten::accumulateDim(const W &v) - { - dim_.push_back(v.size()); - accumulateDim(v[0]); - } - - template - Flatten::Flatten(const V &vector) - : vector_(vector) - { - accumulate(vector_); - accumulateDim(vector_); - } - - template - const V & Flatten::getVector(void) - { - return vector_; - } - - template - const std::vector::Element> & - Flatten::getFlatVector(void) - { - return flatVector_; - } - - template - const std::vector & Flatten::getDim(void) - { - return dim_; - } - - // Reconstruct class template implementation ///////////////////////////////// - template - void Reconstruct::fill(std::vector &v) - { - for (auto &e: v) - { - e = flatVector_[ind_++]; - } - } - - template - template - void Reconstruct::fill(W &v) - { - for (auto &e: v) - { - fill(e); - } - } - - template - void Reconstruct::resize(std::vector &v, const unsigned int dim) - { - v.resize(dim_[dim]); - } - - template - template - void Reconstruct::resize(W &v, const unsigned int dim) - { - v.resize(dim_[dim]); - for (auto &e: v) - { - resize(e, dim + 1); - } - } - - template - Reconstruct::Reconstruct(const std::vector &flatVector, - const std::vector &dim) - : flatVector_(flatVector) - , dim_(dim) - { - resize(vector_, 0); - fill(vector_); - } - - template - const V & Reconstruct::getVector(void) - { - return vector_; - } - - template - const std::vector::Element> & - Reconstruct::getFlatVector(void) - { - return flatVector_; - } - - template - const std::vector & Reconstruct::getDim(void) - { - return dim_; - } - - // Generic writer interface ////////////////////////////////////////////////// - template - inline void push(Writer &w, const std::string &s) { - w.push(s); - } - - template - inline void push(Writer &w, const char *s) - { - w.push(std::string(s)); - } - - template - inline void pop(Writer &w) - { - w.pop(); - } - - template - inline void write(Writer &w, const std::string& s, const U &output) - { - w.write(s, output); - } - - // Generic reader interface - template - inline bool push(Reader &r, const std::string &s) - { - return r.push(s); - } - - template - inline bool push(Reader &r, const char *s) - { - return r.push(std::string(s)); - } - - template - inline void pop(Reader &r) - { - r.pop(); - } - - template - inline void read(Reader &r, const std::string &s, U &output) - { - r.read(s, output); - } - - // Writer template implementation //////////////////////////////////////////// + + // Writer template implementation template Writer::Writer(void) { @@ -569,6 +182,27 @@ namespace Grid { { upcast->writeDefault(s, output); } + + template + template + void Writer::write(const std::string &s, const iScalar &output) + { + upcast->writeDefault(s, tensorToVec(output)); + } + + template + template + void Writer::write(const std::string &s, const iVector &output) + { + upcast->writeDefault(s, tensorToVec(output)); + } + + template + template + void Writer::write(const std::string &s, const iMatrix &output) + { + upcast->writeDefault(s, tensorToVec(output)); + } // Reader template implementation template @@ -604,7 +238,37 @@ namespace Grid { { upcast->readDefault(s, output); } + + template + template + void Reader::read(const std::string &s, iScalar &output) + { + typename TensorToVec>::type v; + + upcast->readDefault(s, v); + vecToTensor(output, v); + } + + template + template + void Reader::read(const std::string &s, iVector &output) + { + typename TensorToVec>::type v; + + upcast->readDefault(s, v); + vecToTensor(output, v); + } + template + template + void Reader::read(const std::string &s, iMatrix &output) + { + typename TensorToVec>::type v; + + upcast->readDefault(s, v); + vecToTensor(output, v); + } + template template void Reader::fromString(U &output, const std::string &s) @@ -623,6 +287,76 @@ namespace Grid { abort(); } } + + // serializable base class /////////////////////////////////////////////////// + class Serializable + { + public: + template + static inline void write(Writer &WR,const std::string &s, + const Serializable &obj) + {} + + template + static inline void read(Reader &RD,const std::string &s, + Serializable &obj) + {} + + friend inline std::ostream & operator<<(std::ostream &os, + const Serializable &obj) + { + return os; + } + }; + + // Generic writer interface ////////////////////////////////////////////////// + template + inline void push(Writer &w, const std::string &s) { + w.push(s); + } + + template + inline void push(Writer &w, const char *s) + { + w.push(std::string(s)); + } + + template + inline void pop(Writer &w) + { + w.pop(); + } + + template + inline void write(Writer &w, const std::string& s, const U &output) + { + w.write(s, output); + } + + // Generic reader interface ////////////////////////////////////////////////// + template + inline bool push(Reader &r, const std::string &s) + { + return r.push(s); + } + + template + inline bool push(Reader &r, const char *s) + { + return r.push(std::string(s)); + } + + template + inline void pop(Reader &r) + { + r.pop(); + } + + template + inline void read(Reader &r, const std::string &s, U &output) + { + r.read(s, output); + } } #endif diff --git a/lib/serialisation/Hdf5IO.h b/lib/serialisation/Hdf5IO.h index 9140435d..12625ab8 100644 --- a/lib/serialisation/Hdf5IO.h +++ b/lib/serialisation/Hdf5IO.h @@ -38,12 +38,6 @@ namespace Grid template typename std::enable_if>::is_number, void>::type writeDefault(const std::string &s, const std::vector &x); - template - void writeDefault(const std::string &s, const iScalar &t); - template - void writeDefault(const std::string &s, const iVector &t); - template - void writeDefault(const std::string &s, const iMatrix &t); private: template void writeSingleAttribute(const U &x, const std::string &name, @@ -154,24 +148,6 @@ namespace Grid } pop(); } - - template - void Hdf5Writer::writeDefault(const std::string &s, const iScalar &t) - { - writeDefault(s, tensorToVec(t)); - } - - template - void Hdf5Writer::writeDefault(const std::string &s, const iVector &t) - { - writeDefault(s, tensorToVec(t)); - } - - template - void Hdf5Writer::writeDefault(const std::string &s, const iMatrix &t) - { - writeDefault(s, tensorToVec(t)); - } // Reader template implementation //////////////////////////////////////////// template diff --git a/lib/serialisation/VectorUtils.h b/lib/serialisation/VectorUtils.h new file mode 100644 index 00000000..f5c76b84 --- /dev/null +++ b/lib/serialisation/VectorUtils.h @@ -0,0 +1,336 @@ +#ifndef GRID_SERIALISATION_VECTORUTILS_H +#define GRID_SERIALISATION_VECTORUTILS_H + +#include +#include + +namespace Grid { + // Grid scalar tensors to nested std::vectors ////////////////////////////////// + template + struct TensorToVec + { + typedef T type; + }; + + template + struct TensorToVec> + { + typedef typename TensorToVec::type type; + }; + + template + struct TensorToVec> + { + typedef typename std::vector::type> type; + }; + + template + struct TensorToVec> + { + typedef typename std::vector::type>> type; + }; + + template + typename TensorToVec::type tensorToVec(const T &t) + { + return t; + } + + template + typename TensorToVec>::type tensorToVec(const iScalar& t) + { + return tensorToVec(t._internal); + } + + template + typename TensorToVec>::type tensorToVec(const iVector& t) + { + typename TensorToVec>::type v; + + v.resize(N); + for (unsigned int i = 0; i < N; i++) + { + v[i] = tensorToVec(t._internal[i]); + } + + return v; + } + + template + typename TensorToVec>::type tensorToVec(const iMatrix& t) + { + typename TensorToVec>::type v; + + v.resize(N); + for (unsigned int i = 0; i < N; i++) + { + v[i].resize(N); + for (unsigned int j = 0; j < N; j++) + { + v[i][j] = tensorToVec(t._internal[i][j]); + } + } + + return v; + } + + template + void vecToTensor(T &t, const typename TensorToVec::type &v) + { + t = v; + } + + + template + void vecToTensor(iScalar &t, const typename TensorToVec>::type &v) + { + vecToTensor(t._internal, v); + } + + template + void vecToTensor(iVector &t, const typename TensorToVec>::type &v) + { + for (unsigned int i = 0; i < N; i++) + { + vecToTensor(t._internal[i], v[i]); + } + } + + template + void vecToTensor(iMatrix &t, const typename TensorToVec>::type &v) + { + for (unsigned int i = 0; i < N; i++) + for (unsigned int j = 0; j < N; j++) + { + vecToTensor(t._internal[i][j], v[i][j]); + } + } + + // Vector element trait ////////////////////////////////////////////////////// + template + struct element + { + typedef T type; + static constexpr bool is_number = false; + }; + + template + struct element> + { + typedef typename element::type type; + static constexpr bool is_number = std::is_arithmetic::value + or is_complex::value + or element::is_number; + }; + + // Vector flattening utility class //////////////////////////////////////////// + // Class to flatten a multidimensional std::vector + template + class Flatten + { + public: + typedef typename element::type Element; + public: + explicit Flatten(const V &vector); + const V & getVector(void); + const std::vector & getFlatVector(void); + const std::vector & getDim(void); + private: + void accumulate(const Element &e); + template + void accumulate(const W &v); + void accumulateDim(const Element &e); + template + void accumulateDim(const W &v); + private: + const V &vector_; + std::vector flatVector_; + std::vector dim_; + }; + + // Class to reconstruct a multidimensional std::vector + template + class Reconstruct + { + public: + typedef typename element::type Element; + public: + Reconstruct(const std::vector &flatVector, + const std::vector &dim); + const V & getVector(void); + const std::vector & getFlatVector(void); + const std::vector & getDim(void); + private: + void fill(std::vector &v); + template + void fill(W &v); + void resize(std::vector &v, const unsigned int dim); + template + void resize(W &v, const unsigned int dim); + private: + V vector_; + const std::vector &flatVector_; + std::vector dim_; + size_t ind_{0}; + unsigned int dimInd_{0}; + }; + + // Flatten class template implementation + template + void Flatten::accumulate(const Element &e) + { + flatVector_.push_back(e); + } + + template + template + void Flatten::accumulate(const W &v) + { + for (auto &e: v) + { + accumulate(e); + } + } + + template + void Flatten::accumulateDim(const Element &e) {}; + + template + template + void Flatten::accumulateDim(const W &v) + { + dim_.push_back(v.size()); + accumulateDim(v[0]); + } + + template + Flatten::Flatten(const V &vector) + : vector_(vector) + { + accumulate(vector_); + accumulateDim(vector_); + } + + template + const V & Flatten::getVector(void) + { + return vector_; + } + + template + const std::vector::Element> & + Flatten::getFlatVector(void) + { + return flatVector_; + } + + template + const std::vector & Flatten::getDim(void) + { + return dim_; + } + + // Reconstruct class template implementation + template + void Reconstruct::fill(std::vector &v) + { + for (auto &e: v) + { + e = flatVector_[ind_++]; + } + } + + template + template + void Reconstruct::fill(W &v) + { + for (auto &e: v) + { + fill(e); + } + } + + template + void Reconstruct::resize(std::vector &v, const unsigned int dim) + { + v.resize(dim_[dim]); + } + + template + template + void Reconstruct::resize(W &v, const unsigned int dim) + { + v.resize(dim_[dim]); + for (auto &e: v) + { + resize(e, dim + 1); + } + } + + template + Reconstruct::Reconstruct(const std::vector &flatVector, + const std::vector &dim) + : flatVector_(flatVector) + , dim_(dim) + { + resize(vector_, 0); + fill(vector_); + } + + template + const V & Reconstruct::getVector(void) + { + return vector_; + } + + template + const std::vector::Element> & + Reconstruct::getFlatVector(void) + { + return flatVector_; + } + + template + const std::vector & Reconstruct::getDim(void) + { + return dim_; + } + + // Vector IO utilities /////////////////////////////////////////////////////// + // helper function to read space-separated values + template + std::vector strToVec(const std::string s) + { + std::istringstream sstr(s); + T buf; + std::vector v; + + while(!sstr.eof()) + { + sstr >> buf; + v.push_back(buf); + } + + return v; + } + + // output to streams for vectors + template < class T > + inline std::ostream & operator<<(std::ostream &os, const std::vector &v) + { + os << "["; + for (auto &x: v) + { + os << x << " "; + } + if (v.size() > 0) + { + os << "\b"; + } + os << "]"; + + return os; + } +} + +#endif \ No newline at end of file diff --git a/lib/tensors/Tensor_logical.h b/lib/tensors/Tensor_logical.h index 7ab3668b..58b2b03b 100644 --- a/lib/tensors/Tensor_logical.h +++ b/lib/tensors/Tensor_logical.h @@ -55,5 +55,38 @@ LOGICAL_BINOP(&); LOGICAL_BINOP(||); LOGICAL_BINOP(&&); +template +strong_inline bool operator==(const iScalar &t1, const iScalar &t2) +{ + return (t1._internal == t2._internal); +} + +template +strong_inline bool operator==(const iVector &t1, const iVector &t2) +{ + bool res = true; + + for (unsigned int i = 0; i < N; ++i) + { + res = (res && (t1._internal[i] == t2._internal[i])); + } + + return res; +} + +template +strong_inline bool operator==(const iMatrix &t1, const iMatrix &t2) +{ + bool res = true; + + for (unsigned int i = 0; i < N; ++i) + for (unsigned int j = 0; j < N; ++j) + { + res = (res && (t1._internal[i][j] == t2._internal[i][j])); + } + + return res; +} + } #endif diff --git a/tests/IO/Test_serialisation.cc b/tests/IO/Test_serialisation.cc index 93007e44..bca4d01c 100644 --- a/tests/IO/Test_serialisation.cc +++ b/tests/IO/Test_serialisation.cc @@ -45,7 +45,8 @@ public: bool , b, std::vector, array, std::vector >, twodimarray, - std::vector > >, cmplx3darray + std::vector > >, cmplx3darray, + SpinColourMatrix, scm ); myclass() {} myclass(int i) @@ -59,6 +60,12 @@ public: y=2*i; b=true; name="bother said pooh"; + scm()(0, 1)(2, 1) = 2.356; + scm()(3, 0)(1, 1) = 1.323; + scm()(2, 1)(0, 1) = 5.3336; + scm()(0, 2)(1, 1) = 6.336; + scm()(2, 1)(2, 2) = 7.344; + scm()(1, 1)(2, 0) = 8.3534; } }; @@ -113,6 +120,10 @@ void tensorConvTestFn(GridSerialRNG &rng, const std::string label) int main(int argc,char **argv) { + GridSerialRNG rng; + + rng.SeedFixedIntegers(std::vector({42,10,81,9})); + std::cout << "==== basic IO" << std::endl; XmlWriter WR("bother.xml"); @@ -138,7 +149,7 @@ int main(int argc,char **argv) std::cout << "-- serialisable class writing to 'bother.xml'..." << std::endl; write(WR,"obj",obj); WR.write("obj2", obj); - vec.push_back(myclass(1234)); + vec.push_back(obj); vec.push_back(myclass(5678)); vec.push_back(myclass(3838)); pair = std::make_pair(myenum::red, myenum::blue); @@ -149,8 +160,6 @@ int main(int argc,char **argv) std::cout << "-- serialisable class comparison:" << std::endl; std::cout << "vec[0] == obj: " << ((vec[0] == obj) ? "true" : "false") << std::endl; std::cout << "vec[1] == obj: " << ((vec[1] == obj) ? "true" : "false") << std::endl; - - write(WR, "objpair", pair); std::cout << "-- pair writing to std::cout:" << std::endl; std::cout << pair << std::endl; @@ -159,26 +168,20 @@ int main(int argc,char **argv) //// XML ioTest("iotest.xml", obj, "XML (object) "); ioTest("iotest.xml", vec, "XML (vector of objects)"); - ioTest("iotest.xml", pair, "XML (pair of objects)"); //// binary ioTest("iotest.bin", obj, "binary (object) "); ioTest("iotest.bin", vec, "binary (vector of objects)"); - ioTest("iotest.bin", pair, "binary (pair of objects)"); //// text ioTest("iotest.dat", obj, "text (object) "); ioTest("iotest.dat", vec, "text (vector of objects)"); - ioTest("iotest.dat", pair, "text (pair of objects)"); //// text ioTest("iotest.json", obj, "JSON (object) "); ioTest("iotest.json", vec, "JSON (vector of objects)"); - ioTest("iotest.json", pair, "JSON (pair of objects)"); //// HDF5 -#undef HAVE_HDF5 #ifdef HAVE_HDF5 ioTest("iotest.h5", obj, "HDF5 (object) "); ioTest("iotest.h5", vec, "HDF5 (vector of objects)"); - ioTest("iotest.h5", pair, "HDF5 (pair of objects)"); #endif std::cout << "\n==== vector flattening/reconstruction" << std::endl; @@ -216,10 +219,6 @@ int main(int argc,char **argv) std::cout << std::endl; std::cout << "==== Grid tensor to vector test" << std::endl; - - GridSerialRNG rng; - - rng.SeedFixedIntegers(std::vector({42,10,81,9})); tensorConvTest(rng, SpinColourMatrix); tensorConvTest(rng, SpinColourVector); tensorConvTest(rng, ColourMatrix); From 2f849ee25227dde692d93c2d571051d18e8068f4 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 8 Mar 2018 23:34:00 +0000 Subject: [PATCH 194/620] declaration fix --- lib/serialisation/BaseIO.h | 48 --------------------------------- lib/serialisation/VectorUtils.h | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index c9b3fb9e..298bff87 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -35,54 +35,6 @@ Author: Guido Cossu #include namespace Grid { - // Pair IO utilities ///////////////////////////////////////////////////////// - // helper function to parse input in the format "" - template - inline std::istream & operator>>(std::istream &is, std::pair &buf) - { - T1 buf1; - T2 buf2; - char c; - - // Search for "pair" delimiters. - do - { - is.get(c); - } while (c != '(' && !is.eof()); - if (c == '(') - { - int start = is.tellg(); - do - { - is.get(c); - } while (c != ')' && !is.eof()); - if (c == ')') - { - int end = is.tellg(); - int psize = end - start - 1; - - // Only read data between pair limiters. - is.seekg(start); - std::string tmpstr(psize, ' '); - is.read(&tmpstr[0], psize); - std::istringstream temp(tmpstr); - temp >> buf1 >> buf2; - buf = std::make_pair(buf1, buf2); - is.seekg(end); - } - } - is.peek(); - return is; - } - - // output to streams for pairs - template - inline std::ostream & operator<<(std::ostream &os, const std::pair &p) - { - os << "(" << p.first << " " << p.second << ")"; - return os; - } - // Abstract writer/reader classes //////////////////////////////////////////// // static polymorphism implemented using CRTP idiom class Serializable; diff --git a/lib/serialisation/VectorUtils.h b/lib/serialisation/VectorUtils.h index f5c76b84..6df9416d 100644 --- a/lib/serialisation/VectorUtils.h +++ b/lib/serialisation/VectorUtils.h @@ -5,6 +5,54 @@ #include namespace Grid { + // Pair IO utilities ///////////////////////////////////////////////////////// + // helper function to parse input in the format "" + template + inline std::istream & operator>>(std::istream &is, std::pair &buf) + { + T1 buf1; + T2 buf2; + char c; + + // Search for "pair" delimiters. + do + { + is.get(c); + } while (c != '(' && !is.eof()); + if (c == '(') + { + int start = is.tellg(); + do + { + is.get(c); + } while (c != ')' && !is.eof()); + if (c == ')') + { + int end = is.tellg(); + int psize = end - start - 1; + + // Only read data between pair limiters. + is.seekg(start); + std::string tmpstr(psize, ' '); + is.read(&tmpstr[0], psize); + std::istringstream temp(tmpstr); + temp >> buf1 >> buf2; + buf = std::make_pair(buf1, buf2); + is.seekg(end); + } + } + is.peek(); + return is; + } + + // output to streams for pairs + template + inline std::ostream & operator<<(std::ostream &os, const std::pair &p) + { + os << "(" << p.first << " " << p.second << ")"; + return os; + } + // Grid scalar tensors to nested std::vectors ////////////////////////////////// template struct TensorToVec From 70ec2faa98a86f904e1f63234e4ce1a602d939c5 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 9 Mar 2018 19:53:55 +0000 Subject: [PATCH 195/620] Hadrons: maximum iteration specified for tests and error if 0 --- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 8 +++++++- tests/hadrons/Test_QED.cc | 5 +++-- tests/hadrons/Test_hadrons.hpp | 5 +++-- tests/hadrons/Test_hadrons_2AS_spectrum.cc | 5 +++-- tests/hadrons/Test_hadrons_meson_3pt.cc | 5 +++-- tests/hadrons/Test_hadrons_spectrum.cc | 5 +++-- tests/hadrons/Test_hadrons_wilsonFund.cc | 5 +++-- 7 files changed, 25 insertions(+), 13 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 2b914625..4bff910e 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -111,9 +111,15 @@ std::vector TRBPrecCG::getOutput(void) template void TRBPrecCG::setup(void) { + if (par().maxIteration == 0) + { + HADRON_ERROR(Argument, "zero maximum iteration"); + } + LOG(Message) << "setting up Schur red-black preconditioned CG for" << " action '" << par().action << "' with residual " - << par().residual << std::endl; + << par().residual << ", maximum iteration " + << par().maxIteration << std::endl; auto Ls = env().getObjectLs(par().action); auto &mat = envGet(FMat, par().action); diff --git a/tests/hadrons/Test_QED.cc b/tests/hadrons/Test_QED.cc index 44dd0578..3377bf3c 100644 --- a/tests/hadrons/Test_QED.cc +++ b/tests/hadrons/Test_QED.cc @@ -93,8 +93,9 @@ int main(int argc, char *argv[]) // solvers MSolver::RBPrecCG::Par solverPar; - solverPar.action = "DWF_" + flavour[i]; - solverPar.residual = 1.0e-8; + solverPar.action = "DWF_" + flavour[i]; + solverPar.residual = 1.0e-8; + solverPar.maxIteration = 10000; application.createModule("CG_" + flavour[i], solverPar); diff --git a/tests/hadrons/Test_hadrons.hpp b/tests/hadrons/Test_hadrons.hpp index 6188a580..67124d6c 100644 --- a/tests/hadrons/Test_hadrons.hpp +++ b/tests/hadrons/Test_hadrons.hpp @@ -176,8 +176,9 @@ inline void makeRBPrecCGSolver(Application &application, std::string &solverName if (!(VirtualMachine::getInstance().hasModule(solverName))) { MSolver::RBPrecCG::Par solverPar; - solverPar.action = actionName; - solverPar.residual = residual; + solverPar.action = actionName; + solverPar.residual = residual; + solverPar.maxIteration = 10000; application.createModule(solverName, solverPar); } diff --git a/tests/hadrons/Test_hadrons_2AS_spectrum.cc b/tests/hadrons/Test_hadrons_2AS_spectrum.cc index 2f519834..b3906730 100644 --- a/tests/hadrons/Test_hadrons_2AS_spectrum.cc +++ b/tests/hadrons/Test_hadrons_2AS_spectrum.cc @@ -106,8 +106,9 @@ int main(int argc, char *argv[]) // solvers MSolver::RBPrecCG2AS::Par solverPar; - solverPar.action = "WilsonClover2AS_" + flavour[i]; - solverPar.residual = 1.0e-8; + solverPar.action = "WilsonClover2AS_" + flavour[i]; + solverPar.residual = 1.0e-8; + solverPar.maxIteration = 10000; application.createModule("CG_" + flavour[i], solverPar); diff --git a/tests/hadrons/Test_hadrons_meson_3pt.cc b/tests/hadrons/Test_hadrons_meson_3pt.cc index 382c39d4..b12ef472 100644 --- a/tests/hadrons/Test_hadrons_meson_3pt.cc +++ b/tests/hadrons/Test_hadrons_meson_3pt.cc @@ -82,8 +82,9 @@ int main(int argc, char *argv[]) // solvers MSolver::RBPrecCG::Par solverPar; - solverPar.action = "DWF_" + flavour[i]; - solverPar.residual = 1.0e-8; + solverPar.action = "DWF_" + flavour[i]; + solverPar.residual = 1.0e-8; + solverPar.maxIteration = 10000; application.createModule("CG_" + flavour[i], solverPar); } diff --git a/tests/hadrons/Test_hadrons_spectrum.cc b/tests/hadrons/Test_hadrons_spectrum.cc index 801674f7..682dcc9b 100644 --- a/tests/hadrons/Test_hadrons_spectrum.cc +++ b/tests/hadrons/Test_hadrons_spectrum.cc @@ -84,8 +84,9 @@ int main(int argc, char *argv[]) // solvers MSolver::RBPrecCG::Par solverPar; - solverPar.action = "DWF_" + flavour[i]; - solverPar.residual = 1.0e-8; + solverPar.action = "DWF_" + flavour[i]; + solverPar.residual = 1.0e-8; + solverPar.maxIteration = 10000; application.createModule("CG_" + flavour[i], solverPar); diff --git a/tests/hadrons/Test_hadrons_wilsonFund.cc b/tests/hadrons/Test_hadrons_wilsonFund.cc index 083d3b8c..36e751b6 100644 --- a/tests/hadrons/Test_hadrons_wilsonFund.cc +++ b/tests/hadrons/Test_hadrons_wilsonFund.cc @@ -96,8 +96,9 @@ int main(int argc, char *argv[]) // solvers MSolver::RBPrecCG::Par solverPar; - solverPar.action = "WilsonClover_" + flavour[i]; - solverPar.residual = 1.0e-8; + solverPar.action = "WilsonClover_" + flavour[i]; + solverPar.residual = 1.0e-8; + solverPar.maxIteration = 10000; application.createModule("CG_" + flavour[i], solverPar); From b801e1fcd637b402e381de98261386f11d0d8da4 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 9 Mar 2018 20:44:10 +0000 Subject: [PATCH 196/620] fclose should be called through a call to close() --- lib/parallelIO/IldgIO.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index b86e250f..b0bd7e2c 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -568,7 +568,6 @@ class IldgWriter : public ScidacWriter { writeLimeIldgLFN(header.ildg_lfn); // rec writeLimeLatticeBinaryObject(Umu,std::string(ILDG_BINARY_DATA)); // Closes message with checksum // limeDestroyWriter(LimeW); - fclose(File); } }; From e485a07133f0e8694f3e51e8167c84848f673060 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 9 Mar 2018 21:56:01 +0000 Subject: [PATCH 197/620] Hadrons: garbage collector debug output --- extras/Hadrons/VirtualMachine.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index eb1f68ba..8d253805 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -632,6 +632,15 @@ void VirtualMachine::executeProgram(const Program &p) const // build garbage collection schedule LOG(Debug) << "Building garbage collection schedule..." << std::endl; freeProg = makeGarbageSchedule(p); + for (unsigned int i = 0; i < freeProg.size(); ++i) + { + LOG(Debug) << std::setw(4) << i + 1 << ": ["; + for (auto &a: freeProg[i]) + { + std::cout << env().getObjectName(a) << " "; + } + std::cout << "]" << std::endl; + } // program execution LOG(Debug) << "Executing program..." << std::endl; From 229977c9553a4b6f9757fddec33dfe8b43b2cd7d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 9 Mar 2018 21:56:27 +0000 Subject: [PATCH 198/620] Hadrons: minor memory fix for ShiftProbe module --- extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index 89059180..8d52327e 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -116,7 +116,7 @@ template void TShiftProbe::setup(void) { envTmpLat(Field, "acc"); - envCacheLat(ComplexField, getName()); + envCreateLat(ComplexField, getName()); } // execution /////////////////////////////////////////////////////////////////// From 8462bbfe638702f027889cd45e51c9e7e8212837 Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Mon, 12 Mar 2018 18:02:12 +0000 Subject: [PATCH 199/620] Gamma input for meson contraction with round brackets --- extras/Hadrons/Modules/MContraction/Meson.hpp | 4 ++-- tests/hadrons/Test_QED.cc | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index 5d27c526..742ac96a 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -45,8 +45,8 @@ BEGIN_HADRONS_NAMESPACE - q1: input propagator 1 (string) - q2: input propagator 2 (string) - gammas: gamma products to insert at sink & source, pairs of gamma matrices - (space-separated strings) in angled brackets (i.e. ), - in a sequence (e.g. ""). + (space-separated strings) in round brackets (i.e. (g_sink g_src)), + in a sequence (e.g. "(Gamma5 Gamma5)(Gamma5 GammaT)"). Special values: "all" - perform all possible contractions. - sink: module to compute the sink to use in contraction (string). diff --git a/tests/hadrons/Test_QED.cc b/tests/hadrons/Test_QED.cc index 3377bf3c..c0bfacc6 100644 --- a/tests/hadrons/Test_QED.cc +++ b/tests/hadrons/Test_QED.cc @@ -189,7 +189,7 @@ int main(int argc, char *argv[]) mesPar.output = "QED/pt_" + flavour[i] + flavour[j]; mesPar.q1 = "Qpt_" + flavour[i]; mesPar.q2 = "Qpt_" + flavour[j]; - mesPar.gammas = ""; + mesPar.gammas = "(Gamma5 Gamma5)"; mesPar.sink = "sink"; application.createModule("meson_pt_" + flavour[i] + flavour[j], @@ -203,7 +203,7 @@ int main(int argc, char *argv[]) + flavour[i] + "__" + flavour[j]; mesPar_seq_T.q1 = "Qpt_" + flavour[i] + "_seq_T" + flavour[i]; mesPar_seq_T.q2 = "Qpt_" + flavour[j]; - mesPar_seq_T.gammas = ""; + mesPar_seq_T.gammas = "(Gamma5 Gamma5)"; mesPar_seq_T.sink = "sink"; application.createModule("meson_tadpole_pt_" + flavour[i] + "_seq_T" @@ -219,7 +219,7 @@ int main(int argc, char *argv[]) + flavour[j]; mesPar_seq_E.q1 = "Qpt_" + flavour[i] + "_seq_V_ph_" + flavour[i]; mesPar_seq_E.q2 = "Qpt_" + flavour[j] + "_seq_V_ph_" + flavour[j]; - mesPar_seq_E.gammas = ""; + mesPar_seq_E.gammas = "(Gamma5 Gamma5)"; mesPar_seq_E.sink = "sink"; application.createModule("meson_exchange_pt_" + flavour[i] + "_seq_V_ph_" + flavour[i] @@ -236,7 +236,7 @@ int main(int argc, char *argv[]) mesPar_seq_S.q1 = "Qpt_" + flavour[i] + "_seq_V_ph_" + flavour[i] + "_seq_V_ph_" + flavour[i]; mesPar_seq_S.q2 = "Qpt_" + flavour[j]; - mesPar_seq_S.gammas = ""; + mesPar_seq_S.gammas = "(Gamma5 Gamma5)"; mesPar_seq_S.sink = "sink"; application.createModule("meson_selfenergy_pt_" + flavour[i] + "_seq_V_ph_" From 0fb84fa34b11ef81dd4bef25661420e0a088dbef Mon Sep 17 00:00:00 2001 From: Dan H Date: Mon, 12 Mar 2018 17:03:48 -0400 Subject: [PATCH 200/620] Make compilation faster by moving print of git hash. --- lib/util/Init.cc | 7 +------ lib/util/Init.h | 1 + lib/util/version.cc | 12 ++++++++++++ 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 lib/util/version.cc diff --git a/lib/util/Init.cc b/lib/util/Init.cc index b4ac14b7..45a37a02 100644 --- a/lib/util/Init.cc +++ b/lib/util/Init.cc @@ -289,12 +289,7 @@ void Grid_init(int *argc,char ***argv) std::cout << "but WITHOUT ANY WARRANTY; without even the implied warranty of"< &simd, std::vector &mpi); + void printHash(void); }; #endif diff --git a/lib/util/version.cc b/lib/util/version.cc new file mode 100644 index 00000000..19759274 --- /dev/null +++ b/lib/util/version.cc @@ -0,0 +1,12 @@ +#include +#include +namespace Grid { + void printHash(){ +#ifdef GITHASH + std::cout << "Current Grid git commit hash=" << GITHASH << std::endl; +#else + std::cout << "Current Grid git commit hash is undefined. Check makefile." << std::endl; +#endif +#undef GITHASH +} +} From f57afe2079aad747b7ccd2d8f1835f2b58cb523b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 13 Mar 2018 13:51:09 +0000 Subject: [PATCH 201/620] Hadrons: much cleaner eigenpack implementation, to be tested --- extras/Hadrons/EigenPack.hpp | 213 ++++++++++++++++++ extras/Hadrons/Environment.cc | 99 +++++++- extras/Hadrons/Environment.hpp | 10 + extras/Hadrons/LanczosUtils.hpp | 115 ---------- extras/Hadrons/Makefile.am | 2 +- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 142 ++++-------- 6 files changed, 362 insertions(+), 219 deletions(-) create mode 100644 extras/Hadrons/EigenPack.hpp delete mode 100644 extras/Hadrons/LanczosUtils.hpp diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp new file mode 100644 index 00000000..eeb04d17 --- /dev/null +++ b/extras/Hadrons/EigenPack.hpp @@ -0,0 +1,213 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/EigenPack.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_EigenPack_hpp_ +#define Hadrons_EigenPack_hpp_ + +#include +#include + +BEGIN_HADRONS_NAMESPACE + +// Lanczos type +#ifndef HADRONS_DEFAULT_LANCZOS_NBASIS +#define HADRONS_DEFAULT_LANCZOS_NBASIS 60 +#endif + +template +class EigenPack +{ +public: + std::vector eval; + std::vector evec; +public: + EigenPack(void) = default; + virtual ~EigenPack(void) = default; + + EigenPack(const size_t size, GridBase *grid) + { + resize(size, grid); + } + + void resize(const size_t size, GridBase *grid) + { + eval.resize(size); + evec.resize(size, grid); + } + + virtual void read(const std::string fileStem, const int traj = -1) + { + std::string evecFilename, evalFilename; + + makeFilenames(evecFilename, evalFilename, fileStem, traj); + XmlReader xmlReader(evalFilename); + basicRead(evec, evecFilename, evec.size()); + LOG(Message) << "Reading " << eval.size() << " eigenvalues from '" + << evalFilename << "'" << std::endl; + Grid::read(xmlReader, "evals", eval); + } + + virtual void write(const std::string fileStem, const int traj = -1) + { + std::string evecFilename, evalFilename; + + makeFilenames(evecFilename, evalFilename, fileStem, traj); + XmlWriter xmlWriter(evalFilename); + basicWrite(evecFilename, evec, evec.size()); + LOG(Message) << "Writing " << eval.size() << " eigenvalues to '" + << evalFilename << "'" << std::endl; + Grid::write(xmlWriter, "evals", eval); + } +protected: + void makeFilenames(std::string &evecFilename, std::string &evalFilename, + const std::string stem, const int traj = -1) + { + std::string t = (traj < 0) ? "" : ("." + std::to_string(traj)); + + evecFilename = stem + "_evec" + t + ".bin"; + evalFilename = stem + "_eval" + t + ".xml"; + } + + template + static void basicRead(std::vector &evec, const std::string filename, + const unsigned int size) + { + emptyUserRecord record; + ScidacReader binReader; + + binReader.open(filename); + for(int k = 0; k < size; ++k) + { + binReader.readScidacFieldRecord(evec[k], record); + } + binReader.close(); + } + + template + static void basicWrite(const std::string filename, std::vector &evec, + const unsigned int size) + { + emptyUserRecord record; + ScidacWriter binWriter; + + binWriter.open(filename); + for(int k = 0; k < size; ++k) + { + binWriter.writeScidacFieldRecord(evec[k], record); + } + binWriter.close(); + } +}; + +template +class CoarseEigenPack: public EigenPack +{ +public: + std::vector evalCoarse; + std::vector evecCoarse; +public: + CoarseEigenPack(void) = default; + virtual ~CoarseEigenPack(void) = default; + + CoarseEigenPack(const size_t sizeFine, const size_t sizeCoarse, + GridBase *gridFine, GridBase *gridCoarse) + { + resize(sizeFine, sizeCoarse, gridFine, gridCoarse); + } + + void resize(const size_t sizeFine, const size_t sizeCoarse, + GridBase *gridFine, GridBase *gridCoarse) + { + EigenPack::resize(sizeFine, gridFine); + evalCoarse.resize(sizeCoarse); + evecCoarse.resize(sizeCoarse, gridCoarse); + } + + virtual void read(const std::string fileStem, const int traj = -1) + { + std::string evecFineFilename, evalFineFilename; + std::string evecCoarseFilename, evalCoarseFilename; + + this->makeFilenames(evecFineFilename, evalFineFilename, + fileStem + "_fine", traj); + this->makeFilenames(evecCoarseFilename, evalCoarseFilename, + fileStem + "_coarse", traj); + XmlReader xmlFineReader(evalFineFilename); + XmlReader xmlCoarseReader(evalCoarseFilename); + LOG(Message) << "Reading " << this->evec.size() << " fine eigenvectors from '" + << evecFineFilename << "'" << std::endl; + this->basicRead(this->evec, evecFineFilename, this->evec.size()); + LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" + << evecCoarseFilename << "'" << std::endl; + this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); + LOG(Message) << "Reading " << this->eval.size() << " fine eigenvalues from '" + << evalFineFilename << "'" << std::endl; + Grid::read(xmlFineReader, "evals", this->eval); + LOG(Message) << "Reading " << evalCoarse.size() << " coarse eigenvalues from '" + << evalCoarseFilename << "'" << std::endl; + Grid::read(xmlCoarseReader, "evals", evalCoarse); + } + + virtual void write(const std::string fileStem, const int traj = -1) + { + std::string evecFineFilename, evalFineFilename; + std::string evecCoarseFilename, evalCoarseFilename; + + this->makeFilenames(evecFineFilename, evalFineFilename, + fileStem + "_fine", traj); + this->makeFilenames(evecCoarseFilename, evalCoarseFilename, + fileStem + "_coarse", traj); + XmlWriter xmlFineWriter(evalFineFilename); + XmlWriter xmlCoarseWriter(evalCoarseFilename); + LOG(Message) << "Writing " << this->evec.size() << " fine eigenvectors to '" + << evecFineFilename << "'" << std::endl; + this->basicWrite(evecFineFilename, this->evec, this->evec.size()); + LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" + << evecCoarseFilename << "'" << std::endl; + this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); + LOG(Message) << "Writing " << this->eval.size() << " fine eigenvalues to '" + << evalFineFilename << "'" << std::endl; + Grid::write(xmlFineWriter, "evals", this->eval); + LOG(Message) << "Writing " << evalCoarse.size() << " coarse eigenvalues to '" + << evalCoarseFilename << "'" << std::endl; + Grid::write(xmlCoarseWriter, "evals", evalCoarse); + } +}; + +template +using FermionEigenPack = EigenPack; + +template +using CoarseFermionEigenPack = CoarseEigenPack< + typename FImpl::FermionField, + typename LocalCoherenceLanczos::CoarseField>; + +END_HADRONS_NAMESPACE + +#endif // Hadrons_EigenPack_hpp_ diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index 6554122e..9c9618f7 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -61,7 +61,7 @@ Environment::Environment(void) // grids /////////////////////////////////////////////////////////////////////// void Environment::createGrid(const unsigned int Ls) { - if (grid5d_.find(Ls) == grid5d_.end()) + if ((Ls > 1) and (grid5d_.find(Ls) == grid5d_.end())) { auto g = getGrid(); @@ -70,6 +70,53 @@ void Environment::createGrid(const unsigned int Ls) } } +void Environment::createCoarseGrid(const std::vector &blockSize, + const unsigned int Ls) +{ + int nd = getNd(); + std::vector fineDim = getDim(), coarseDim; + unsigned int cLs; + auto key4d = blockSize, key5d = blockSize; + + createGrid(Ls); + coarseDim.resize(nd); + for (int d = 0; d < coarseDim.size(); d++) + { + coarseDim[d] = fineDim[d]/blockSize[d]; + if (coarseDim[d]*blockSize[d] != fineDim[d]) + { + HADRON_ERROR(Size, "Fine dimension " + std::to_string(d) + + " (" + std::to_string(fineDim[d]) + + ") not divisible by coarse dimension (" + + std::to_string(coarseDim[d]) + ")"); + } + } + if (blockSize.size() > nd) + { + cLs = Ls/blockSize[nd]; + if (cLs*blockSize[nd] != Ls) + { + HADRON_ERROR(Size, "Fine Ls (" + std::to_string(Ls) + + ") not divisible by coarse Ls (" + + std::to_string(cLs) + ")"); + } + key4d.resize(nd); + key5d.push_back(Ls); + } + gridCoarse4d_[key4d].reset( + SpaceTimeGrid::makeFourDimGrid(coarseDim, + GridDefaultSimd(nd, vComplex::Nsimd()), GridDefaultMpi())); + gridCoarseRb4d_[key4d].reset( + SpaceTimeGrid::makeFourDimRedBlackGrid(gridCoarse4d_[key4d].get())); + if (Ls > 1) + { + gridCoarse5d_[key5d].reset( + SpaceTimeGrid::makeFiveDimGrid(cLs, gridCoarse4d_[key4d].get())); + gridCoarseRb5d_[key5d].reset( + SpaceTimeGrid::makeFiveDimRedBlackGrid(cLs, gridCoarse4d_[key4d].get())); + } +} + GridCartesian * Environment::getGrid(const unsigned int Ls) const { try @@ -104,7 +151,55 @@ GridRedBlackCartesian * Environment::getRbGrid(const unsigned int Ls) const } catch(std::out_of_range &) { - HADRON_ERROR(Definition, "no red-black 5D grid with Ls= " + std::to_string(Ls)); + HADRON_ERROR(Definition, "no red-black grid with Ls= " + std::to_string(Ls)); + } +} + +GridCartesian * Environment::getCoarseGrid( + const std::vector &blockSize, const unsigned int Ls) const +{ + auto key = blockSize; + + try + { + if (Ls == 1) + { + key.resize(getNd()); + return gridCoarse4d_.at(key).get(); + } + else + { + key.push_back(Ls); + return gridCoarse5d_.at(key).get(); + } + } + catch(std::out_of_range &) + { + HADRON_ERROR(Definition, "no coarse grid with Ls= " + std::to_string(Ls)); + } +} + +GridRedBlackCartesian * Environment::getRbCoarseGrid( + const std::vector &blockSize, const unsigned int Ls) const +{ + auto key = blockSize; + + try + { + if (Ls == 1) + { + key.resize(getNd()); + return gridCoarseRb4d_.at(key).get(); + } + else + { + key.push_back(Ls); + return gridCoarseRb5d_.at(key).get(); + } + } + catch(std::out_of_range &) + { + HADRON_ERROR(Definition, "no coarse red-black grid with Ls= " + std::to_string(Ls)); } } diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index e9bfffe1..3b1d45f8 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -86,8 +86,14 @@ private: public: // grids void createGrid(const unsigned int Ls); + void createCoarseGrid(const std::vector &blockSize, + const unsigned int Ls = 1); GridCartesian * getGrid(const unsigned int Ls = 1) const; GridRedBlackCartesian * getRbGrid(const unsigned int Ls = 1) const; + GridCartesian * getCoarseGrid(const std::vector &blockSize, + const unsigned int Ls = 1) const; + GridRedBlackCartesian * getRbCoarseGrid(const std::vector &blockSize, + const unsigned int Ls = 1) const; std::vector getDim(void) const; int getDim(const unsigned int mu) const; unsigned long int getLocalVolume(void) const; @@ -155,6 +161,10 @@ private: std::map grid5d_; GridRbPt gridRb4d_; std::map gridRb5d_; + std::map, GridPt> gridCoarse4d_; + std::map, GridRbPt> gridCoarseRb4d_; + std::map, GridPt> gridCoarse5d_; + std::map, GridRbPt> gridCoarseRb5d_; unsigned int nd_; // random number generator RngPt rng4d_; diff --git a/extras/Hadrons/LanczosUtils.hpp b/extras/Hadrons/LanczosUtils.hpp deleted file mode 100644 index a080da4b..00000000 --- a/extras/Hadrons/LanczosUtils.hpp +++ /dev/null @@ -1,115 +0,0 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/LanczosUtils.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ -#ifndef Hadrons_LanczosUtils_hpp_ -#define Hadrons_LanczosUtils_hpp_ - -#include -#include - -BEGIN_HADRONS_NAMESPACE - -// Lanczos type -#ifndef HADRONS_DEFAULT_LANCZOS_NBASIS -#define HADRONS_DEFAULT_LANCZOS_NBASIS 60 -#endif - -template -struct EigenPack -{ - typedef T VectorType; - std::vector eval; - std::vector evec; - - EigenPack(void) = default; - - EigenPack(const size_t size, GridBase *grid) - { - resize(size, grid); - } - - void resize(const size_t size, GridBase *grid) - { - eval.resize(size); - evec.resize(size, grid); - } - - void read(const std::string fileStem) - { - std::string evecFilename = fileStem + "_evec.bin"; - std::string evalFilename = fileStem + "_eval.xml"; - emptyUserRecord record; - ScidacReader binReader; - XmlReader xmlReader(evalFilename); - - LOG(Message) << "Reading " << evec.size() << " eigenvectors from '" - << evecFilename << "'" << std::endl; - binReader.open(evecFilename); - for(int k = 0; k < evec.size(); ++k) - { - binReader.readScidacFieldRecord(evec[k], record); - } - binReader.close(); - LOG(Message) << "Reading " << eval.size() << " eigenvalues from '" - << evalFilename << "'" << std::endl; - Grid::read(xmlReader, "evals", eval); - } - - void write(const std::string fileStem) - { - std::string evecFilename = fileStem + "_evec.bin"; - std::string evalFilename = fileStem + "_eval.xml"; - emptyUserRecord record; - ScidacWriter binWriter; - XmlWriter xmlWriter(evalFilename); - - LOG(Message) << "Writing " << evec.size() << " eigenvectors to '" - << evecFilename << "'" << std::endl; - binWriter.open(fileStem + "_evec.bin"); - for(int k = 0; k < evec.size(); ++k) - { - binWriter.writeScidacFieldRecord(evec[k], record); - } - binWriter.close(); - LOG(Message) << "Writing " << eval.size() << " eigenvalues to '" - << evalFilename << "'" << std::endl; - Grid::write(xmlWriter, "evals", eval); - } -}; - -template -using FineEigenPack = EigenPack; - -template -using CoarseEigenPack = EigenPack< - typename LocalCoherenceLanczos::CoarseField>; - -END_HADRONS_NAMESPACE - -#endif // Hadrons_LanczosUtils_hpp_ diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index 3b393cd1..3b945124 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -21,7 +21,7 @@ nobase_libHadrons_a_HEADERS = \ GeneticScheduler.hpp \ Global.hpp \ Graph.hpp \ - LanczosUtils.hpp \ + EigenPack.hpp \ Module.hpp \ Modules.hpp \ ModuleFactory.hpp \ diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 6e2103ce..3cc17bdc 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -31,7 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include -#include +#include BEGIN_HADRONS_NAMESPACE @@ -45,8 +45,7 @@ class LocalCoherenceLanczosPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(LocalCoherenceLanczosPar, std::string, action, - int, doFine, - int, doCoarse, + bool, doCoarse, LanczosParams, fineParams, LanczosParams, coarseParams, ChebyParams, smoother, @@ -63,8 +62,8 @@ public: typedef LocalCoherenceLanczos LCL; - typedef FineEigenPack FinePack; - typedef CoarseEigenPack CoarsePack; + typedef FermionEigenPack BasePack; + typedef CoarseFermionEigenPack CoarsePack; typedef HADRONS_DEFAULT_SCHUR_OP SchurFMat; public: // constructor @@ -79,15 +78,7 @@ public: // execution virtual void execute(void); private: - void makeCoarseGrid(void); -private: - std::vector coarseDim_; - int Ls_, cLs_{1}; - std::unique_ptr coarseGrid4_{nullptr}; - std::unique_ptr coarseGrid_{nullptr}; - std::unique_ptr coarseGrid4Rb_{nullptr}; - std::unique_ptr coarseGridRb_{nullptr}; - std::string fineName_, coarseName_; + std::string fineName_, coarseName_; }; MODULE_REGISTER_NS(LocalCoherenceLanczos, @@ -127,55 +118,6 @@ std::vector TLocalCoherenceLanczos::getOutput(void) } // setup /////////////////////////////////////////////////////////////////////// -template -void TLocalCoherenceLanczos::makeCoarseGrid(void) -{ - int nd = env().getNd(); - std::vector blockSize = strToVec(par().blockSize); - auto fineDim = env().getDim(); - - Ls_ = env().getObjectLs(par().action); - env().createGrid(Ls_); - coarseDim_.resize(nd); - for (int d = 0; d < coarseDim_.size(); d++) - { - coarseDim_[d] = fineDim[d]/blockSize[d]; - if (coarseDim_[d]*blockSize[d] != fineDim[d]) - { - HADRON_ERROR(Size, "Fine dimension " + std::to_string(d) - + " (" + std::to_string(fineDim[d]) - + ") not divisible by coarse dimension (" - + std::to_string(coarseDim_[d]) + ")"); - } - } - if (blockSize.size() > nd) - { - cLs_ = Ls_/blockSize[nd]; - if (cLs_*blockSize[nd] != Ls_) - { - HADRON_ERROR(Size, "Fine Ls (" + std::to_string(Ls_) - + ") not divisible by coarse Ls (" - + std::to_string(cLs_) + ")"); - } - } - if (Ls_ > 1) - { - coarseGrid4_.reset(SpaceTimeGrid::makeFourDimGrid( - coarseDim_, GridDefaultSimd(nd, vComplex::Nsimd()), - GridDefaultMpi())); - coarseGrid4Rb_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(coarseGrid4_.get())); - coarseGrid_.reset(SpaceTimeGrid::makeFiveDimGrid(cLs_, coarseGrid4_.get())); - coarseGridRb_.reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(cLs_, coarseGrid4_.get())); - } - else - { - coarseGrid_.reset(SpaceTimeGrid::makeFourDimGrid( - coarseDim_, GridDefaultSimd(nd, vComplex::Nsimd()), - GridDefaultMpi())); - coarseGridRb_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(coarseGrid_.get())); - } -} - template void TLocalCoherenceLanczos::setup(void) { @@ -183,19 +125,25 @@ void TLocalCoherenceLanczos::setup(void) << " action '" << par().action << "' (" << nBasis << " eigenvectors)..." << std::endl; - if (!coarseGrid_) - { - makeCoarseGrid(); - } - LOG(Message) << "Coarse grid: " << coarseGrid_->GlobalDimensions() << std::endl; - envCreate(FinePack, fineName_, Ls_, par().fineParams.Nm, env().getRbGrid(Ls_)); - envCreate(CoarsePack, coarseName_, Ls_, par().coarseParams.Nm, coarseGridRb_.get()); - auto &fine = envGet(FinePack, fineName_); - auto &coarse = envGet(CoarsePack, coarseName_); - envTmp(SchurFMat, "mat", Ls_, envGet(FMat, par().action)); + unsigned int Ls = env().getObjectLs(par().action); + auto blockSize = strToVec(par().blockSize); + + env().createCoarseGrid(blockSize, Ls); + + auto cg = env().getCoarseGrid(blockSize, Ls); + auto cgrb = env().getRbCoarseGrid(blockSize, Ls); + int cNm = (par().doCoarse) ? par().coarseParams.Nm : 0; + + LOG(Message) << "Coarse grid: " << cg->GlobalDimensions() << std::endl; + envCreateDerived(BasePack, CoarsePack, getName(), Ls, + par().fineParams.Nm, cNm, env().getRbGrid(Ls), cgrb); + + auto &epack = envGet(CoarsePack, getName()); + + envTmp(SchurFMat, "mat", Ls, envGet(FMat, par().action)); envGetTmp(SchurFMat, mat); - envTmp(LCL, "solver", Ls_, env().getRbGrid(Ls_), coarseGridRb_.get(), mat, - Odd, fine.evec, coarse.evec, fine.eval, coarse.eval); + envTmp(LCL, "solver", Ls, env().getRbGrid(Ls), cgrb, mat, + Odd, epack.evec, epack.evecCoarse, epack.eval, epack.evalCoarse); } // execution /////////////////////////////////////////////////////////////////// @@ -204,41 +152,33 @@ void TLocalCoherenceLanczos::execute(void) { auto &finePar = par().fineParams; auto &coarsePar = par().coarseParams; - auto &fine = envGet(FinePack, fineName_); - auto &coarse = envGet(CoarsePack, coarseName_); + auto &epack = envGet(CoarsePack, getName()); envGetTmp(LCL, solver); - if (par().doFine) - { - LOG(Message) << "Performing fine grid IRL -- Nstop= " - << finePar.Nstop << ", Nk= " << finePar.Nk << ", Nm= " - << finePar.Nm << std::endl; - solver.calcFine(finePar.Cheby, finePar.Nstop, finePar.Nk, finePar.Nm, - finePar.resid,finePar.MaxIt, finePar.betastp, - finePar.MinRes); - solver.testFine(finePar.resid*100.0); - LOG(Message) << "Orthogonalising" << std::endl; - solver.Orthogonalise(); - if (!par().output.empty()) - { - fine.write(par().output + "_fine"); - } - } + LOG(Message) << "Performing fine grid IRL -- Nstop= " + << finePar.Nstop << ", Nk= " << finePar.Nk << ", Nm= " + << finePar.Nm << std::endl; + solver.calcFine(finePar.Cheby, finePar.Nstop, finePar.Nk, finePar.Nm, + finePar.resid,finePar.MaxIt, finePar.betastp, + finePar.MinRes); + solver.testFine(finePar.resid*100.0); if (par().doCoarse) { + LOG(Message) << "Orthogonalising" << std::endl; + solver.Orthogonalise(); LOG(Message) << "Performing coarse grid IRL -- Nstop= " - << coarsePar.Nstop << ", Nk= " << coarsePar.Nk << ", Nm= " - << coarsePar.Nm << std::endl; + << coarsePar.Nstop << ", Nk= " << coarsePar.Nk << ", Nm= " + << coarsePar.Nm << std::endl; solver.calcCoarse(coarsePar.Cheby, par().smoother, par().coarseRelaxTol, - coarsePar.Nstop, coarsePar.Nk, coarsePar.Nm, + coarsePar.Nstop, coarsePar.Nk, coarsePar.Nm, coarsePar.resid, coarsePar.MaxIt, coarsePar.betastp, coarsePar.MinRes); solver.testCoarse(coarsePar.resid*100.0, par().smoother, - par().coarseRelaxTol); - if (!par().output.empty()) - { - coarse.write(par().output + "_coarse"); - } + par().coarseRelaxTol); + } + if (!par().output.empty()) + { + epack.write(par().output, vm().getTrajectory()); } } From b85f987b0b29756d320ee17056d15d1e39d5cf44 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 13 Mar 2018 16:09:22 +0000 Subject: [PATCH 202/620] Hadrons: error message channel verbose during profiling --- extras/Hadrons/VirtualMachine.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index 8d253805..ba963276 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -381,7 +381,6 @@ void VirtualMachine::makeMemoryProfile(void) env().protectObjects(false); GridLogMessage.Active(false); HadronsLogMessage.Active(false); - HadronsLogError.Active(false); for (auto it = program.rbegin(); it != program.rend(); ++it) { auto a = *it; @@ -397,7 +396,6 @@ void VirtualMachine::makeMemoryProfile(void) env().protectObjects(protect); GridLogMessage.Active(gmsg); HadronsLogMessage.Active(hmsg); - HadronsLogError.Active(err); LOG(Debug) << "Memory profile:" << std::endl; LOG(Debug) << "----------------" << std::endl; for (unsigned int a = 0; a < profile_.module.size(); ++a) From 78f8d475283269f43b7d26b5711edf8459a19bb5 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 13 Mar 2018 16:10:16 +0000 Subject: [PATCH 203/620] Hadrons: environment access to derived objects --- extras/Hadrons/Environment.hpp | 48 ++++++++++++++++++++++++++++------ extras/Hadrons/Module.hpp | 3 +++ 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index 3b1d45f8..637962b1 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -116,6 +116,10 @@ public: Ts && ... args); void setObjectModule(const unsigned int objAddress, const int modAddress); + template + T * getDerivedObject(const unsigned int address) const; + template + T * getDerivedObject(const std::string name) const; template T * getObject(const unsigned int address) const; template @@ -186,7 +190,7 @@ Holder::Holder(T *pt) template T & Holder::get(void) const { - return &objPt_.get(); + return *objPt_.get(); } template @@ -231,7 +235,7 @@ void Environment::createDerivedObject(const std::string name, object_[address].Ls = Ls; object_[address].data.reset(new Holder(new T(std::forward(args)...))); object_[address].size = MemoryProfiler::stats->maxAllocated - initMem; - object_[address].type = &typeid(T); + object_[address].type = &typeid(B); if (MemoryProfiler::stats == &memStats) { MemoryProfiler::stats = nullptr; @@ -241,7 +245,7 @@ void Environment::createDerivedObject(const std::string name, else if ((object_[address].storage != Storage::cache) or (object_[address].storage != storage) or (object_[address].name != name) or - (object_[address].type != &typeid(T))) + (object_[address].type != &typeid(B))) { HADRON_ERROR(Definition, "object '" + name + "' already allocated"); } @@ -256,21 +260,37 @@ void Environment::createObject(const std::string name, createDerivedObject(name, storage, Ls, std::forward(args)...); } -template -T * Environment::getObject(const unsigned int address) const +template +T * Environment::getDerivedObject(const unsigned int address) const { if (hasObject(address)) { if (hasCreatedObject(address)) { - if (auto h = dynamic_cast *>(object_[address].data.get())) + if (auto h = dynamic_cast *>(object_[address].data.get())) { - return h->getPt(); + if (&typeid(T) == &typeid(B)) + { + return dynamic_cast(h->getPt()); + } + else + { + if (auto hder = dynamic_cast(h->getPt())) + { + return hder; + } + else + { + HADRON_ERROR(Definition, "object with address " + std::to_string(address) + + " cannot be casted to '" + typeName(&typeid(T)) + + "' (has type '" + typeName(&typeid(h->get())) + "')"); + } + } } else { HADRON_ERROR(Definition, "object with address " + std::to_string(address) + - " does not have type '" + typeName(&typeid(T)) + + " does not have type '" + typeName(&typeid(B)) + "' (has type '" + getObjectType(address) + "')"); } } @@ -286,6 +306,18 @@ T * Environment::getObject(const unsigned int address) const } } +template +T * Environment::getDerivedObject(const std::string name) const +{ + return getDerivedObject(getObjectAddress(name)); +} + +template +T * Environment::getObject(const unsigned int address) const +{ + return getDerivedObject(address); +} + template T * Environment::getObject(const std::string name) const { diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 018a26f7..85c27472 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -91,6 +91,9 @@ static ns##mod##ModuleRegistrar ns##mod##ModuleRegistrarInstance; #define envGet(type, name)\ *env().template getObject(name) +#define envGetDerived(base, type, name)\ +*env().template getDerivedObject(name) + #define envGetTmp(type, var)\ type &var = *env().template getObject(getName() + "_tmp_" + #var) From 2d4d70d3ecda9cf817f36be7649796489ed35c7b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 13 Mar 2018 16:10:36 +0000 Subject: [PATCH 204/620] Hadrons: LCL fixes --- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 3cc17bdc..80717f32 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -77,8 +77,6 @@ public: virtual void setup(void); // execution virtual void execute(void); -private: - std::string fineName_, coarseName_; }; MODULE_REGISTER_NS(LocalCoherenceLanczos, @@ -95,10 +93,7 @@ MODULE_REGISTER_NS(ZLocalCoherenceLanczos, template TLocalCoherenceLanczos::TLocalCoherenceLanczos(const std::string name) : Module(name) -{ - fineName_ = getName() + "_fine"; - coarseName_ = getName() + "_coarse"; -} +{} // dependencies/products /////////////////////////////////////////////////////// template @@ -112,7 +107,7 @@ std::vector TLocalCoherenceLanczos::getInput(void) template std::vector TLocalCoherenceLanczos::getOutput(void) { - std::vector out = {fineName_, coarseName_}; + std::vector out = {getName()}; return out; } @@ -138,7 +133,7 @@ void TLocalCoherenceLanczos::setup(void) envCreateDerived(BasePack, CoarsePack, getName(), Ls, par().fineParams.Nm, cNm, env().getRbGrid(Ls), cgrb); - auto &epack = envGet(CoarsePack, getName()); + auto &epack = envGetDerived(BasePack, CoarsePack, getName()); envTmp(SchurFMat, "mat", Ls, envGet(FMat, par().action)); envGetTmp(SchurFMat, mat); @@ -152,7 +147,7 @@ void TLocalCoherenceLanczos::execute(void) { auto &finePar = par().fineParams; auto &coarsePar = par().coarseParams; - auto &epack = envGet(CoarsePack, getName()); + auto &epack = envGetDerived(BasePack, CoarsePack, getName()); envGetTmp(LCL, solver); LOG(Message) << "Performing fine grid IRL -- Nstop= " From 72344d1418ee165c0acf9c6cf4b3a373efadc085 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 13 Mar 2018 17:10:54 +0000 Subject: [PATCH 205/620] Hadrons: change default Schur convention to DiagTwo --- extras/Hadrons/Global.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index e9f5933b..12b9a029 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -190,7 +190,7 @@ name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt // default Schur convention #ifndef HADRONS_DEFAULT_SCHUR -#define HADRONS_DEFAULT_SCHUR DiagMooee +#define HADRONS_DEFAULT_SCHUR DiagTwo #endif #define _HADRONS_SCHUR_OP_(conv) Schur##conv##Operator #define HADRONS_SCHUR_OP(conv) _HADRONS_SCHUR_OP_(conv) From d516938707bf4fea9da60f7333126de8be77f992 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 14 Mar 2018 14:54:25 +0000 Subject: [PATCH 206/620] Hadrons: eigen packs I/O and deflation interface --- extras/Hadrons/EigenPack.hpp | 19 ++- extras/Hadrons/Environment.hpp | 22 +-- extras/Hadrons/Modules.hpp | 2 + extras/Hadrons/Modules/MGauge/FundtoHirep.cc | 12 +- .../Modules/MIO/LoadCoarseEigenPack.hpp | 126 ++++++++++++++++++ extras/Hadrons/Modules/MIO/LoadEigenPack.hpp | 121 +++++++++++++++++ extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 80 ++++++++--- extras/Hadrons/VirtualMachine.cc | 8 +- extras/Hadrons/modules.inc | 2 + lib/algorithms/iterative/Deflation.h | 27 ++-- lib/algorithms/iterative/SchurRedBlack.h | 8 +- lib/serialisation/BaseIO.h | 2 +- 12 files changed, 368 insertions(+), 61 deletions(-) create mode 100644 extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp create mode 100644 extras/Hadrons/Modules/MIO/LoadEigenPack.hpp diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index eeb04d17..d27e35b9 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -29,6 +29,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #define Hadrons_EigenPack_hpp_ #include +#include #include BEGIN_HADRONS_NAMESPACE @@ -38,12 +39,14 @@ BEGIN_HADRONS_NAMESPACE #define HADRONS_DEFAULT_LANCZOS_NBASIS 60 #endif -template +template class EigenPack { +public: + typedef F Field; public: std::vector eval; - std::vector evec; + std::vector evec; public: EigenPack(void) = default; virtual ~EigenPack(void) = default; @@ -123,12 +126,14 @@ protected: } }; -template -class CoarseEigenPack: public EigenPack +template +class CoarseEigenPack: public EigenPack { public: - std::vector evalCoarse; - std::vector evecCoarse; + typedef CoarseF CoarseField; +public: + std::vector evalCoarse; + std::vector evecCoarse; public: CoarseEigenPack(void) = default; virtual ~CoarseEigenPack(void) = default; @@ -142,7 +147,7 @@ public: void resize(const size_t sizeFine, const size_t sizeCoarse, GridBase *gridFine, GridBase *gridCoarse) { - EigenPack::resize(sizeFine, gridFine); + EigenPack::resize(sizeFine, gridFine); evalCoarse.resize(sizeCoarse); evecCoarse.resize(sizeCoarse, gridCoarse); } diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index 637962b1..0fb81250 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -78,7 +78,7 @@ private: Size size{0}; Storage storage{Storage::object}; unsigned int Ls{0}; - const std::type_info *type{nullptr}; + const std::type_info *type{nullptr}, *derivedType{nullptr}; std::string name; int module{-1}; std::unique_ptr data{nullptr}; @@ -230,22 +230,24 @@ void Environment::createDerivedObject(const std::string name, { MemoryProfiler::stats = &memStats; } - size_t initMem = MemoryProfiler::stats->currentlyAllocated; - object_[address].storage = storage; - object_[address].Ls = Ls; + size_t initMem = MemoryProfiler::stats->currentlyAllocated; + object_[address].storage = storage; + object_[address].Ls = Ls; object_[address].data.reset(new Holder(new T(std::forward(args)...))); - object_[address].size = MemoryProfiler::stats->maxAllocated - initMem; - object_[address].type = &typeid(B); + object_[address].size = MemoryProfiler::stats->maxAllocated - initMem; + object_[address].type = &typeid(B); + object_[address].derivedType = &typeid(T); if (MemoryProfiler::stats == &memStats) { MemoryProfiler::stats = nullptr; } } // object already exists, no error if it is a cache, error otherwise - else if ((object_[address].storage != Storage::cache) or - (object_[address].storage != storage) or - (object_[address].name != name) or - (object_[address].type != &typeid(B))) + else if ((object_[address].storage != Storage::cache) or + (object_[address].storage != storage) or + (object_[address].name != name) or + (object_[address].type != &typeid(B)) or + (object_[address].derivedType != &typeid(T))) { HADRON_ERROR(Definition, "object '" + name + "' already allocated"); } diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index ee53faa8..528faecd 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -70,5 +70,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include +#include #include diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc index 31c5a34d..ba8e9330 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc @@ -42,7 +42,8 @@ TFundtoHirep::TFundtoHirep(const std::string name) template std::vector TFundtoHirep::getInput(void) { - std::vector in; + std::vector in = {par().gaugeconf}; + return in; } @@ -50,6 +51,7 @@ template std::vector TFundtoHirep::getOutput(void) { std::vector out = {getName()}; + return out; } @@ -57,19 +59,19 @@ std::vector TFundtoHirep::getOutput(void) template void TFundtoHirep::setup(void) { - envCreateLat(typename Rep::LatticeField, getName()); + envCreateLat(Rep::LatticeField, getName()); } // execution /////////////////////////////////////////////////////////////////// template void TFundtoHirep::execute(void) { - auto &U = *env().template getObject(par().gaugeconf); LOG(Message) << "Transforming Representation" << std::endl; + auto &U = envGet(LatticeGaugeField, par().gaugeconf); + auto &URep = envGet(Rep::LatticeField, getName()); + Rep TargetRepresentation(U._grid); TargetRepresentation.update_representation(U); - - auto &URep = envGet(typename Rep::LatticeField, getName()); URep = TargetRepresentation.U; } diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp new file mode 100644 index 00000000..77c3a7ee --- /dev/null +++ b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp @@ -0,0 +1,126 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MIO_LoadCoarseEigenPack_hpp_ +#define Hadrons_MIO_LoadCoarseEigenPack_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Load local coherence eigen vectors/values package * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MIO) + +class LoadCoarseEigenPackPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(LoadCoarseEigenPackPar, + std::string, filestem, + unsigned int, sizeFine, + unsigned int, sizeCoarse, + unsigned int, Ls, + std::vector, blockSize); +}; + +template +class TLoadCoarseEigenPack: public Module +{ +public: + typedef CoarseEigenPack BasePack; +public: + // constructor + TLoadCoarseEigenPack(const std::string name); + // destructor + virtual ~TLoadCoarseEigenPack(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(LoadCoarseFermionEigenPack, + ARG(TLoadCoarseEigenPack>), MIO); + +/****************************************************************************** + * TLoadCoarseEigenPack implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TLoadCoarseEigenPack::TLoadCoarseEigenPack(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TLoadCoarseEigenPack::getInput(void) +{ + std::vector in; + + return in; +} + +template +std::vector TLoadCoarseEigenPack::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TLoadCoarseEigenPack::setup(void) +{ + env().createGrid(par().Ls); + env().createCoarseGrid(par().blockSize, par().Ls); + envCreateDerived(BasePack, Pack, getName(), par().Ls, par().sizeFine, + par().sizeCoarse, env().getRbGrid(par().Ls), + env().getCoarseGrid(par().blockSize, par().Ls)); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TLoadCoarseEigenPack::execute(void) +{ + auto &epack = envGetDerived(BasePack, Pack, getName()); + + epack.read(par().filestem, vm().getTrajectory()); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MIO_LoadCoarseEigenPack_hpp_ diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp new file mode 100644 index 00000000..bcc3f22b --- /dev/null +++ b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp @@ -0,0 +1,121 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MIO/LoadEigenPack.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MIO_LoadEigenPack_hpp_ +#define Hadrons_MIO_LoadEigenPack_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Load eigen vectors/values package * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MIO) + +class LoadEigenPackPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(LoadEigenPackPar, + std::string, filestem, + unsigned int, size, + unsigned int, Ls); +}; + +template +class TLoadEigenPack: public Module +{ +public: + typedef EigenPack BasePack; +public: + // constructor + TLoadEigenPack(const std::string name); + // destructor + virtual ~TLoadEigenPack(void) = default; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_NS(LoadFermionEigenPack, TLoadEigenPack>, MIO); + +/****************************************************************************** + * TLoadEigenPack implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TLoadEigenPack::TLoadEigenPack(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TLoadEigenPack::getInput(void) +{ + std::vector in; + + return in; +} + +template +std::vector TLoadEigenPack::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TLoadEigenPack::setup(void) +{ + env().createGrid(par().Ls); + envCreateDerived(BasePack, Pack, getName(), par().Ls, par().size, + env().getRbGrid(par().Ls)); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TLoadEigenPack::execute(void) +{ + auto &epack = envGetDerived(BasePack, Pack, getName()); + + epack.read(par().filestem, vm().getTrajectory()); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MIO_LoadEigenPack_hpp_ diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 4bff910e..4af81537 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -32,6 +32,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -44,15 +45,22 @@ class RBPrecCGPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(RBPrecCGPar , - std::string , action, - unsigned int , maxIteration, - double , residual); + std::string , action, + unsigned int, maxIteration, + double , residual, + std::string , eigenPack); }; -template +template class TRBPrecCG: public Module { public: + typedef FermionEigenPack EPack; + typedef CoarseFermionEigenPack CoarseEPack; + typedef DeflatedGuesser FineGuesser; + typedef LocalCoherenceDeflatedGuesser< + typename FImpl::FermionField, + typename CoarseEPack::CoarseField> CoarseGuesser; FGS_TYPE_ALIASES(FImpl,); public: // constructor @@ -70,37 +78,39 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(RBPrecCG, TRBPrecCG, MSolver); -MODULE_REGISTER_NS(ZRBPrecCG, TRBPrecCG, MSolver); +MODULE_REGISTER_NS(RBPrecCG, + ARG(TRBPrecCG), MSolver); +MODULE_REGISTER_NS(ZRBPrecCG, + ARG(TRBPrecCG), MSolver); /****************************************************************************** * TRBPrecCG template implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// -template -TRBPrecCG::TRBPrecCG(const std::string name) +template +TRBPrecCG::TRBPrecCG(const std::string name) : Module(name) {} // dependencies/products /////////////////////////////////////////////////////// -template -std::vector TRBPrecCG::getInput(void) +template +std::vector TRBPrecCG::getInput(void) { std::vector in = {}; return in; } -template -std::vector TRBPrecCG::getReference(void) +template +std::vector TRBPrecCG::getReference(void) { std::vector ref = {par().action}; return ref; } -template -std::vector TRBPrecCG::getOutput(void) +template +std::vector TRBPrecCG::getOutput(void) { std::vector out = {getName()}; @@ -108,8 +118,8 @@ std::vector TRBPrecCG::getOutput(void) } // setup /////////////////////////////////////////////////////////////////////// -template -void TRBPrecCG::setup(void) +template +void TRBPrecCG::setup(void) { if (par().maxIteration == 0) { @@ -121,23 +131,49 @@ void TRBPrecCG::setup(void) << par().residual << ", maximum iteration " << par().maxIteration << std::endl; - auto Ls = env().getObjectLs(par().action); - auto &mat = envGet(FMat, par().action); - auto solver = [&mat, this](FermionField &sol, const FermionField &source) + auto Ls = env().getObjectLs(par().action); + auto &mat = envGet(FMat, par().action); + std::string guesserName = getName() + "_guesser"; + + if (par().eigenPack.empty()) + { + env().template createDerivedObject, ZeroGuesser> + (guesserName, Environment::Storage::object, Ls); + } + else + { + try + { + auto &epack = envGetDerived(EPack, CoarseEPack, par().eigenPack); + + envCreateDerived(Guesser, CoarseGuesser, + guesserName, Ls, epack.evec, epack.evecCoarse, + epack.evalCoarse); + } + catch (Exceptions::Definition &e) + { + auto &epack = envGet(EPack, par().eigenPack); + + envCreateDerived(Guesser, FineGuesser, + guesserName, Ls, epack.evec, epack.eval); + } + } + auto &guesser = envGet(Guesser, guesserName); + auto solver = [&mat, &guesser, this](FermionField &sol, const FermionField &source) { ConjugateGradient cg(par().residual, par().maxIteration); HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); - schurSolver(mat, source, sol); + schurSolver(mat, source, sol, guesser); }; envCreate(SolverFn, getName(), Ls, solver); } // execution /////////////////////////////////////////////////////////////////// -template -void TRBPrecCG::execute(void) +template +void TRBPrecCG::execute(void) {} END_MODULE_NAMESPACE diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index ba963276..2b7f9620 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -632,12 +632,14 @@ void VirtualMachine::executeProgram(const Program &p) const freeProg = makeGarbageSchedule(p); for (unsigned int i = 0; i < freeProg.size(); ++i) { - LOG(Debug) << std::setw(4) << i + 1 << ": ["; + std::string msg = ""; + for (auto &a: freeProg[i]) { - std::cout << env().getObjectName(a) << " "; + msg += env().getObjectName(a) + " "; } - std::cout << "]" << std::endl; + msg += "]"; + LOG(Debug) << std::setw(4) << i + 1 << ": [" << msg << std::endl; } // program execution diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index c0be8aef..5932cc89 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -53,6 +53,8 @@ modules_hpp =\ Modules/MScalarSUN/Utils.hpp \ Modules/MScalarSUN/TransProj.hpp \ Modules/MScalarSUN/TrKinetic.hpp \ + Modules/MIO/LoadEigenPack.hpp \ Modules/MIO/LoadNersc.hpp \ + Modules/MIO/LoadCoarseEigenPack.hpp \ Modules/MIO/LoadBinary.hpp diff --git a/lib/algorithms/iterative/Deflation.h b/lib/algorithms/iterative/Deflation.h index b2239c55..316afe90 100644 --- a/lib/algorithms/iterative/Deflation.h +++ b/lib/algorithms/iterative/Deflation.h @@ -30,22 +30,31 @@ Author: Peter Boyle namespace Grid { -struct ZeroGuesser { +template +class Guesser { public: - template - void operator()(const Field &src,Field &guess) { guess = Zero(); }; + Guesser(void) = default; + virtual ~Guesser(void) = default; + virtual void operator()(const Field &src, Field &guess) = 0; }; -struct SourceGuesser { + +template +class ZeroGuesser: public Guesser { public: - template - void operator()(const Field &src,Field &guess) { guess = src; }; + virtual void operator()(const Field &src, Field &guess) { guess = zero; }; +}; + +template +class SourceGuesser: public Guesser { +public: + virtual void operator()(const Field &src, Field &guess) { guess = src; }; }; //////////////////////////////// // Fine grid deflation //////////////////////////////// template -struct DeflatedGuesser { +class DeflatedGuesser: public Guesser { private: const std::vector &evec; const std::vector &eval; @@ -54,7 +63,7 @@ public: DeflatedGuesser(const std::vector & _evec,const std::vector & _eval) : evec(_evec), eval(_eval) {}; - void operator()(const Field &src,Field &guess) { + virtual void operator()(const Field &src,Field &guess) { guess = zero; assert(evec.size()==eval.size()); auto N = evec.size(); @@ -66,7 +75,7 @@ public: }; template -class LocalCoherenceDeflatedGuesser { +class LocalCoherenceDeflatedGuesser: public Guesser { private: const std::vector &subspace; const std::vector &evec_coarse; diff --git a/lib/algorithms/iterative/SchurRedBlack.h b/lib/algorithms/iterative/SchurRedBlack.h index fac2030f..091330b2 100644 --- a/lib/algorithms/iterative/SchurRedBlack.h +++ b/lib/algorithms/iterative/SchurRedBlack.h @@ -108,7 +108,7 @@ namespace Grid { template void operator() (Matrix & _Matrix,const Field &in, Field &out){ - ZeroGuesser guess; + ZeroGuesser guess; (*this)(_Matrix,in,out,guess); } template @@ -195,7 +195,7 @@ namespace Grid { }; template void operator() (Matrix & _Matrix,const Field &in, Field &out){ - ZeroGuesser guess; + ZeroGuesser guess; (*this)(_Matrix,in,out,guess); } template @@ -280,7 +280,7 @@ namespace Grid { template void operator() (Matrix & _Matrix,const Field &in, Field &out){ - ZeroGuesser guess; + ZeroGuesser guess; (*this)(_Matrix,in,out,guess); } template @@ -365,7 +365,7 @@ namespace Grid { template void operator() (Matrix & _Matrix,const Field &in, Field &out){ - ZeroGuesser guess; + ZeroGuesser guess; (*this)(_Matrix,in,out,guess); } template diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index 298bff87..bc178e0d 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -232,7 +232,7 @@ namespace Grid { { is >> std::boolalpha >> output; } - catch(std::istringstream::failure &e) + catch(std::ios_base::failure &e) { std::cerr << "numerical conversion failure on '" << s << "' "; std::cerr << "(typeid: " << typeid(U).name() << ")" << std::endl; From d86936a3deb7c1670967874c21d5afb2d9ee051d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 16 Mar 2018 12:26:39 +0000 Subject: [PATCH 207/620] Eliminating deprecated lex_sites --- lib/lattice/Lattice_coordinate.h | 18 ------------------ tests/core/Test_main.cc | 1 - 2 files changed, 19 deletions(-) diff --git a/lib/lattice/Lattice_coordinate.h b/lib/lattice/Lattice_coordinate.h index 2e20ba17..19eceba8 100644 --- a/lib/lattice/Lattice_coordinate.h +++ b/lib/lattice/Lattice_coordinate.h @@ -52,23 +52,5 @@ namespace Grid { } }; - // LatticeCoordinate(); - // FIXME for debug; deprecate this; made obscelete by - template void lex_sites(Lattice &l){ - Real *v_ptr = (Real *)&l._odata[0]; - size_t o_len = l._grid->oSites(); - size_t v_len = sizeof(vobj)/sizeof(vRealF); - size_t vec_len = vRealF::Nsimd(); - - for(int i=0;i Date: Fri, 16 Mar 2018 21:37:03 +0000 Subject: [PATCH 208/620] Extra SHM option --- configure.ac | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 3a6a2960..aced6a9c 100644 --- a/configure.ac +++ b/configure.ac @@ -340,7 +340,7 @@ case ${ac_PRECISION} in esac ###################### Shared memory allocation technique under MPI3 -AC_ARG_ENABLE([shm],[AC_HELP_STRING([--enable-shm=shmopen|hugetlbfs], +AC_ARG_ENABLE([shm],[AC_HELP_STRING([--enable-shm=shmopen|hugetlbfs|shmnone], [Select SHM allocation technique])],[ac_SHM=${enable_shm}],[ac_SHM=shmopen]) case ${ac_SHM} in @@ -349,6 +349,10 @@ case ${ac_SHM} in AC_DEFINE([GRID_MPI3_SHMOPEN],[1],[GRID_MPI3_SHMOPEN] ) ;; + shmnone) + AC_DEFINE([GRID_MPI3_SHM_NONE],[1],[GRID_MPI3_SHM_NONE] ) + ;; + hugetlbfs) AC_DEFINE([GRID_MPI3_SHMMMAP],[1],[GRID_MPI3_SHMMMAP] ) ;; From 01568b0e62d94ac5d79da8c3edd1db9eea5928e3 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 16 Mar 2018 21:54:28 +0000 Subject: [PATCH 209/620] Add a new SHM option --- lib/communicator/SharedMemoryMPI.cc | 44 ++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index 45edbb07..1fa84dfb 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -226,6 +226,48 @@ void GlobalSharedMemory::SharedMemoryAllocate(uint64_t bytes, int flags) }; #endif // MMAP +#ifdef GRID_MPI3_SHM_NONE +void GlobalSharedMemory::SharedMemoryAllocate(uint64_t bytes, int flags) +{ + std::cout << "SharedMemoryAllocate "<< bytes<< " MMAP anonymous implementation "< Date: Fri, 16 Mar 2018 21:54:56 +0000 Subject: [PATCH 210/620] 4GB clean the offsets in parallel IO for multifile records --- lib/parallelIO/BinaryIO.h | 34 +++++++++++++++------------- lib/parallelIO/IldgIO.h | 47 +++++++++++++++++++++++++-------------- lib/parallelIO/NerscIO.h | 10 ++++----- 3 files changed, 53 insertions(+), 38 deletions(-) diff --git a/lib/parallelIO/BinaryIO.h b/lib/parallelIO/BinaryIO.h index b40a75af..39acf0e0 100644 --- a/lib/parallelIO/BinaryIO.h +++ b/lib/parallelIO/BinaryIO.h @@ -91,7 +91,7 @@ class BinaryIO { typedef typename vobj::scalar_object sobj; GridBase *grid = lat._grid; - int lsites = grid->lSites(); + uint64_t lsites = grid->lSites(); std::vector scalardata(lsites); unvectorizeToLexOrdArray(scalardata,lat); @@ -160,7 +160,9 @@ class BinaryIO { /* * Scidac csum is rather more heavyweight + * FIXME -- 128^3 x 256 x 16 will overflow. */ + int global_site; Lexicographic::CoorFromIndex(coor,local_site,local_vol); @@ -261,7 +263,7 @@ class BinaryIO { GridBase *grid, std::vector &iodata, std::string file, - Integer offset, + uint64_t offset, const std::string &format, int control, uint32_t &nersc_csum, uint32_t &scidac_csuma, @@ -523,7 +525,7 @@ class BinaryIO { static inline void readLatticeObject(Lattice &Umu, std::string file, munger munge, - Integer offset, + uint64_t offset, const std::string &format, uint32_t &nersc_csum, uint32_t &scidac_csuma, @@ -533,7 +535,7 @@ class BinaryIO { typedef typename vobj::Realified::scalar_type word; word w=0; GridBase *grid = Umu._grid; - int lsites = grid->lSites(); + uint64_t lsites = grid->lSites(); std::vector scalardata(lsites); std::vector iodata(lsites); // Munge, checksum, byte order in here @@ -544,7 +546,7 @@ class BinaryIO { GridStopWatch timer; timer.Start(); - parallel_for(int x=0;xBarrier(); @@ -560,7 +562,7 @@ class BinaryIO { static inline void writeLatticeObject(Lattice &Umu, std::string file, munger munge, - Integer offset, + uint64_t offset, const std::string &format, uint32_t &nersc_csum, uint32_t &scidac_csuma, @@ -569,7 +571,7 @@ class BinaryIO { typedef typename vobj::scalar_object sobj; typedef typename vobj::Realified::scalar_type word; word w=0; GridBase *grid = Umu._grid; - int lsites = grid->lSites(); + uint64_t lsites = grid->lSites(); std::vector scalardata(lsites); std::vector iodata(lsites); // Munge, checksum, byte order in here @@ -580,7 +582,7 @@ class BinaryIO { GridStopWatch timer; timer.Start(); unvectorizeToLexOrdArray(scalardata,Umu); - parallel_for(int x=0;xBarrier(); timer.Stop(); @@ -597,7 +599,7 @@ class BinaryIO { static inline void readRNG(GridSerialRNG &serial, GridParallelRNG ¶llel, std::string file, - Integer offset, + uint64_t offset, uint32_t &nersc_csum, uint32_t &scidac_csuma, uint32_t &scidac_csumb) @@ -610,8 +612,8 @@ class BinaryIO { std::string format = "IEEE32BIG"; GridBase *grid = parallel._grid; - int gsites = grid->gSites(); - int lsites = grid->lSites(); + uint64_t gsites = grid->gSites(); + uint64_t lsites = grid->lSites(); uint32_t nersc_csum_tmp = 0; uint32_t scidac_csuma_tmp = 0; @@ -626,7 +628,7 @@ class BinaryIO { nersc_csum,scidac_csuma,scidac_csumb); timer.Start(); - parallel_for(int lidx=0;lidx tmp(RngStateCount); std::copy(iodata[lidx].begin(),iodata[lidx].end(),tmp.begin()); parallel.SetState(tmp,lidx); @@ -659,7 +661,7 @@ class BinaryIO { static inline void writeRNG(GridSerialRNG &serial, GridParallelRNG ¶llel, std::string file, - Integer offset, + uint64_t offset, uint32_t &nersc_csum, uint32_t &scidac_csuma, uint32_t &scidac_csumb) @@ -670,8 +672,8 @@ class BinaryIO { typedef std::array RNGstate; GridBase *grid = parallel._grid; - int gsites = grid->gSites(); - int lsites = grid->lSites(); + uint64_t gsites = grid->gSites(); + uint64_t lsites = grid->lSites(); uint32_t nersc_csum_tmp; uint32_t scidac_csuma_tmp; @@ -684,7 +686,7 @@ class BinaryIO { timer.Start(); std::vector iodata(lsites); - parallel_for(int lidx=0;lidx tmp(RngStateCount); parallel.GetState(tmp,lidx); std::copy(tmp.begin(),tmp.end(),iodata[lidx].begin()); diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index b0bd7e2c..8655b24c 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -337,6 +337,20 @@ class GridLimeWriter : public BinaryIO { template void writeLimeLatticeBinaryObject(Lattice &field,std::string record_name) { + //////////////////////////////////////////////////////////////////// + // NB: FILE and iostream are jointly writing disjoint sequences in the + // the same file through different file handles (integer units). + // + // These are both buffered, so why I think this code is right is as follows. + // + // i) write record header to FILE *File, telegraphing the size; flush + // ii) ftello reads the offset from FILE *File . + // iii) iostream / MPI Open independently seek this offset. Write sequence direct to disk. + // Closes iostream and flushes. + // iv) fseek on FILE * to end of this disjoint section. + // v) Continue writing scidac record. + //////////////////////////////////////////////////////////////////// + //////////////////////////////////////////// // Create record header //////////////////////////////////////////// @@ -350,25 +364,24 @@ class GridLimeWriter : public BinaryIO { // std::cout << "W Gsites " <_gsites<(); BinarySimpleMunger munge; - BinaryIO::writeLatticeObject(field, filename, munge, offset, format,nersc_csum,scidac_csuma,scidac_csumb); - // fseek(File,0,SEEK_END); offset = ftello(File);std::cout << " offset now "<(field, filename, munge, offset1, format,nersc_csum,scidac_csuma,scidac_csumb); + + /////////////////////////////////////////// + // Wind forward and close the record + /////////////////////////////////////////// + fseek(File,0,SEEK_END); + unt64_t offset2 = ftello(File); // std::cout << " now at offset "<=0); //////////////////////////////////////// diff --git a/lib/parallelIO/NerscIO.h b/lib/parallelIO/NerscIO.h index 786839f2..e2c2bc39 100644 --- a/lib/parallelIO/NerscIO.h +++ b/lib/parallelIO/NerscIO.h @@ -57,7 +57,7 @@ namespace Grid { // for the header-reader static inline int readHeader(std::string file,GridBase *grid, FieldMetaData &field) { - int offset=0; + uint64_t offset=0; std::map header; std::string line; @@ -139,7 +139,7 @@ namespace Grid { typedef Lattice > GaugeField; GridBase *grid = Umu._grid; - int offset = readHeader(file,Umu._grid,header); + uint64_t offset = readHeader(file,Umu._grid,header); FieldMetaData clone(header); @@ -236,7 +236,7 @@ namespace Grid { GaugeStatistics(Umu,header); MachineCharacteristics(header); - int offset; + uint64_t offset; truncate(file); @@ -278,7 +278,7 @@ namespace Grid { header.plaquette=0.0; MachineCharacteristics(header); - int offset; + uint64_t offset; #ifdef RNG_RANLUX header.floating_point = std::string("UINT64"); @@ -313,7 +313,7 @@ namespace Grid { GridBase *grid = parallel._grid; - int offset = readHeader(file,grid,header); + uint64_t offset = readHeader(file,grid,header); FieldMetaData clone(header); From e1dcfd35538cf0e7ebe39d0c5f55c7427b921d38 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 16 Mar 2018 23:10:47 +0000 Subject: [PATCH 211/620] typo fix --- lib/parallelIO/IldgIO.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index 8655b24c..b81d1e43 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -378,7 +378,7 @@ class GridLimeWriter : public BinaryIO { // Wind forward and close the record /////////////////////////////////////////// fseek(File,0,SEEK_END); - unt64_t offset2 = ftello(File); // std::cout << " now at offset "< Date: Sat, 17 Mar 2018 09:35:01 +0000 Subject: [PATCH 212/620] Drop RB on coarse space ; that was a mistake --- tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc b/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc index 3dff4b90..b55b66d9 100644 --- a/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc +++ b/tests/lanczos/Test_dwf_compressed_lanczos_reorg.cc @@ -180,7 +180,6 @@ int main (int argc, char ** argv) { GridCartesian * CoarseGrid4 = SpaceTimeGrid::makeFourDimGrid(coarseLatt, GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); GridRedBlackCartesian * CoarseGrid4rb = SpaceTimeGrid::makeFourDimRedBlackGrid(CoarseGrid4); GridCartesian * CoarseGrid5 = SpaceTimeGrid::makeFiveDimGrid(cLs,CoarseGrid4); - GridRedBlackCartesian * CoarseGrid5rb = SpaceTimeGrid::makeFourDimRedBlackGrid(CoarseGrid5); // Gauge field LatticeGaugeField Umu(UGrid); @@ -206,7 +205,7 @@ int main (int argc, char ** argv) { const int nbasis= 60; assert(nbasis==Ns1); - LocalCoherenceLanczosScidac _LocalCoherenceLanczos(FrbGrid,CoarseGrid5rb,HermOp,Odd); + LocalCoherenceLanczosScidac _LocalCoherenceLanczos(FrbGrid,CoarseGrid5,HermOp,Odd); std::cout << GridLogMessage << "Constructed LocalCoherenceLanczos" << std::endl; assert( (Params.doFine)||(Params.doFineRead)); From cbc73a3fd176dd3b63e7bfafaf7a8dc35e7f27af Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 19 Mar 2018 13:11:38 +0000 Subject: [PATCH 213/620] Hadrons: CG guesser fix --- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 27 ++++++++++----------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 4af81537..8d1b0fc6 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -55,13 +55,14 @@ template class TRBPrecCG: public Module { public: + FGS_TYPE_ALIASES(FImpl,); typedef FermionEigenPack EPack; typedef CoarseFermionEigenPack CoarseEPack; + typedef std::shared_ptr> GuesserPt; typedef DeflatedGuesser FineGuesser; typedef LocalCoherenceDeflatedGuesser< typename FImpl::FermionField, typename CoarseEPack::CoarseField> CoarseGuesser; - FGS_TYPE_ALIASES(FImpl,); public: // constructor TRBPrecCG(const std::string name); @@ -131,41 +132,39 @@ void TRBPrecCG::setup(void) << par().residual << ", maximum iteration " << par().maxIteration << std::endl; - auto Ls = env().getObjectLs(par().action); - auto &mat = envGet(FMat, par().action); + auto Ls = env().getObjectLs(par().action); + auto &mat = envGet(FMat, par().action); std::string guesserName = getName() + "_guesser"; + GuesserPt guesser{nullptr}; if (par().eigenPack.empty()) { - env().template createDerivedObject, ZeroGuesser> - (guesserName, Environment::Storage::object, Ls); + guesser.reset(new ZeroGuesser()); } else { try { auto &epack = envGetDerived(EPack, CoarseEPack, par().eigenPack); - - envCreateDerived(Guesser, CoarseGuesser, - guesserName, Ls, epack.evec, epack.evecCoarse, - epack.evalCoarse); + + guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse, + epack.evalCoarse)); } catch (Exceptions::Definition &e) { auto &epack = envGet(EPack, par().eigenPack); - envCreateDerived(Guesser, FineGuesser, - guesserName, Ls, epack.evec, epack.eval); + guesser.reset(new FineGuesser(epack.evec, epack.eval)); } } - auto &guesser = envGet(Guesser, guesserName); - auto solver = [&mat, &guesser, this](FermionField &sol, const FermionField &source) + auto solver = [&mat, guesser, this](FermionField &sol, + const FermionField &source) { ConjugateGradient cg(par().residual, par().maxIteration); HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); - schurSolver(mat, source, sol, guesser); + schurSolver(mat, source, sol, *guesser); }; envCreate(SolverFn, getName(), Ls, solver); } From 62702dbcb805543ed1beb66fed073f5cc2a79e85 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 19 Mar 2018 17:56:53 +0000 Subject: [PATCH 214/620] Fixing bug in the Point sink causing NaNs --- extras/Hadrons/Modules/MSink/Point.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MSink/Point.hpp b/extras/Hadrons/Modules/MSink/Point.hpp index c5f6eff0..ee824c03 100644 --- a/extras/Hadrons/Modules/MSink/Point.hpp +++ b/extras/Hadrons/Modules/MSink/Point.hpp @@ -128,7 +128,7 @@ void TPoint::execute(void) envGetTmp(LatticeComplex, coor); p = strToVec(par().mom); ph = zero; - for(unsigned int mu = 0; mu < env().getNd(); mu++) + for(unsigned int mu = 0; mu < p.size(); mu++) { LatticeCoordinate(coor, mu); ph = ph + (p[mu]/env().getGrid()->_fdimensions[mu])*coor; From b1a38bde7ac133f984ee177583a93d918b34d26c Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 20 Mar 2018 18:01:32 +0000 Subject: [PATCH 215/620] Extra test for Gparity with plaquette action --- tests/forces/Test_gp_plaq_force.cc | 123 +++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 tests/forces/Test_gp_plaq_force.cc diff --git a/tests/forces/Test_gp_plaq_force.cc b/tests/forces/Test_gp_plaq_force.cc new file mode 100644 index 00000000..e121f21b --- /dev/null +++ b/tests/forces/Test_gp_plaq_force.cc @@ -0,0 +1,123 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_gp_rect_force.cc + + Copyright (C) 2015 + +Author: paboyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(&Grid); + + int threads = GridThread::GetThreads(); + std::cout< seeds({1,2,3,4}); + + GridParallelRNG pRNG(&Grid); + pRNG.SeedFixedIntegers(std::vector({45,12,81,9})); + + LatticeGaugeField U(&Grid); + + SU3::HotConfiguration(pRNG,U); + + double beta = 1.0; + double c1 = 0.331; + + //ConjugatePlaqPlusRectangleActionR Action(beta,c1); + ConjugateWilsonGaugeActionR Action(beta); + //WilsonGaugeActionR Action(beta); + + ComplexD S = Action.S(U); + + // get the deriv of phidag MdagM phi with respect to "U" + LatticeGaugeField UdSdU(&Grid); + + Action.deriv(U,UdSdU); + + //////////////////////////////////// + // Modify the gauge field a little + //////////////////////////////////// + RealD dt = 0.0001; + + LatticeColourMatrix mommu(&Grid); + LatticeColourMatrix forcemu(&Grid); + LatticeGaugeField mom(&Grid); + LatticeGaugeField Uprime(&Grid); + + for(int mu=0;mu(mom,mommu,mu); + + // fourth order exponential approx + parallel_for(auto i=mom.begin();i(UdSdU,mu); + mommu = PeekIndex(mom,mu); + + // Update gauge action density + // U = exp(p dt) U + // dU/dt = p U + // so dSdt = trace( dUdt dSdU) = trace( p UdSdUmu ) + + dS = dS - trace(mommu*UdSdUmu)*dt*2.0; + + } + ComplexD dSpred = sum(dS); + + std::cout << GridLogMessage << " S "< Date: Tue, 20 Mar 2018 18:16:15 +0000 Subject: [PATCH 216/620] Put a username in the path --- lib/communicator/SharedMemoryMPI.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index 1fa84dfb..8eebdc0f 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -27,6 +27,7 @@ Author: Peter Boyle /* END LEGAL */ #include +#include namespace Grid { @@ -288,7 +289,8 @@ void GlobalSharedMemory::SharedMemoryAllocate(uint64_t bytes, int flags) size_t size = bytes; - sprintf(shm_name,"/myGrid_mpi3_shm_%d_%d",WorldNode,r); + struct passwd *pw = getpwuid (getuid()); + sprintf(shm_name,"/Grid_%s_mpi3_shm_%d_%d",pw->pw_name,WorldNode,r); shm_unlink(shm_name); int fd=shm_open(shm_name,O_RDWR|O_CREAT,0666); From 60b57706c4bd264b39a765835d2cff0c19722bf0 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 21 Mar 2018 13:57:30 +0000 Subject: [PATCH 217/620] Small bug fix in the shm file names --- lib/communicator/SharedMemoryMPI.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index 8eebdc0f..d534a6d9 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -325,7 +325,8 @@ void GlobalSharedMemory::SharedMemoryAllocate(uint64_t bytes, int flags) size_t size = bytes ; - sprintf(shm_name,"/Grid_mpi3_shm_%d_%d",WorldNode,r); + struct passwd *pw = getpwuid (getuid()); + sprintf(shm_name,"/Grid_%s_mpi3_shm_%d_%d",pw->pw_name,WorldNode,r); int fd=shm_open(shm_name,O_RDWR,0666); if ( fd<0 ) { perror("failed shm_open"); assert(0); } From 07fe7d0cbe4de70bbfcfe3dbe60c2cedf1b8390c Mon Sep 17 00:00:00 2001 From: paboyle Date: Wed, 21 Mar 2018 14:26:04 +0000 Subject: [PATCH 218/620] Save file in current dir; print checksums --- tests/Test_dwf_mixedcg_prec.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/Test_dwf_mixedcg_prec.cc b/tests/Test_dwf_mixedcg_prec.cc index 2601b76c..0a8d6540 100644 --- a/tests/Test_dwf_mixedcg_prec.cc +++ b/tests/Test_dwf_mixedcg_prec.cc @@ -103,6 +103,27 @@ int main (int argc, char ** argv) std::cout << "Diff between mixed and regular CG: " << diff << std::endl; + std::string file1("./Propagator1"); + std::string file2("./Propagator2"); + emptyUserRecord record; + uint32_t nersc_csum; + uint32_t scidac_csuma; + uint32_t scidac_csumb; + typedef SpinColourVectorD FermionD; + typedef vSpinColourVectorD vFermionD; + + BinarySimpleMunger munge; + std::string format = getFormatString(); + BinaryIO::writeLatticeObject(result_o,file1,munge, 0, format, + nersc_csum,scidac_csuma,scidac_csumb); + + std::cout << " Mixed checksums "<(result_o_2,file1,munge, 0, format, + nersc_csum,scidac_csuma,scidac_csumb); + + std::cout << " CG checksums "< Date: Wed, 21 Mar 2018 20:38:19 -0400 Subject: [PATCH 219/620] Add dimension match check to precisionChange. --- lib/lattice/Lattice_transfer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 32c15d22..44f0337d 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -652,6 +652,7 @@ vectorizeFromLexOrdArray( std::vector &in, Lattice &out) template void precisionChange(Lattice &out, const Lattice &in){ assert(out._grid->Nd() == in._grid->Nd()); + assert(out._grid->FullDimensions() == in._grid->FullDimensions()); out.checkerboard = in.checkerboard; GridBase *in_grid=in._grid; GridBase *out_grid = out._grid; From 68168bf72dccbf6e1eb89f9be8c7479bd0dc2a7d Mon Sep 17 00:00:00 2001 From: Dan H Date: Wed, 21 Mar 2018 20:51:38 -0400 Subject: [PATCH 220/620] Revert "Add dimension match check to precisionChange." This reverts commit 8f601d9b39d3635f9972fb5f7326a905780bda5f. --- lib/lattice/Lattice_transfer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 44f0337d..32c15d22 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -652,7 +652,6 @@ vectorizeFromLexOrdArray( std::vector &in, Lattice &out) template void precisionChange(Lattice &out, const Lattice &in){ assert(out._grid->Nd() == in._grid->Nd()); - assert(out._grid->FullDimensions() == in._grid->FullDimensions()); out.checkerboard = in.checkerboard; GridBase *in_grid=in._grid; GridBase *out_grid = out._grid; From ccde8b817f7b906150ca581b860d25a515fd8a96 Mon Sep 17 00:00:00 2001 From: Dan H Date: Wed, 21 Mar 2018 20:58:04 -0400 Subject: [PATCH 221/620] Add dimension check to precisionChange. --- lib/lattice/Lattice_transfer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 32c15d22..44f0337d 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -652,6 +652,7 @@ vectorizeFromLexOrdArray( std::vector &in, Lattice &out) template void precisionChange(Lattice &out, const Lattice &in){ assert(out._grid->Nd() == in._grid->Nd()); + assert(out._grid->FullDimensions() == in._grid->FullDimensions()); out.checkerboard = in.checkerboard; GridBase *in_grid=in._grid; GridBase *out_grid = out._grid; From 5f8225461b51ae27587a7a25685e9c823ee682f6 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 23 Mar 2018 10:37:58 +0000 Subject: [PATCH 222/620] Fencing mixedcg test propagator write. LIME is still optional in Grid --- tests/Test_dwf_mixedcg_prec.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Test_dwf_mixedcg_prec.cc b/tests/Test_dwf_mixedcg_prec.cc index 0a8d6540..84849ff9 100644 --- a/tests/Test_dwf_mixedcg_prec.cc +++ b/tests/Test_dwf_mixedcg_prec.cc @@ -103,6 +103,7 @@ int main (int argc, char ** argv) std::cout << "Diff between mixed and regular CG: " << diff << std::endl; + #ifdef HAVE_LIME std::string file1("./Propagator1"); std::string file2("./Propagator2"); emptyUserRecord record; @@ -124,6 +125,8 @@ int main (int argc, char ** argv) nersc_csum,scidac_csuma,scidac_csumb); std::cout << " CG checksums "< Date: Fri, 23 Mar 2018 11:14:23 +0000 Subject: [PATCH 223/620] Fix to pass CI tests --- tests/Test_dwf_mixedcg_prec.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Test_dwf_mixedcg_prec.cc b/tests/Test_dwf_mixedcg_prec.cc index 84849ff9..a53d8921 100644 --- a/tests/Test_dwf_mixedcg_prec.cc +++ b/tests/Test_dwf_mixedcg_prec.cc @@ -104,6 +104,8 @@ int main (int argc, char ** argv) std::cout << "Diff between mixed and regular CG: " << diff << std::endl; #ifdef HAVE_LIME + if( GridCmdOptionExists(argv,argv+argc,"--checksums") ){ + std::string file1("./Propagator1"); std::string file2("./Propagator2"); emptyUserRecord record; @@ -125,6 +127,7 @@ int main (int argc, char ** argv) nersc_csum,scidac_csuma,scidac_csumb); std::cout << " CG checksums "< Date: Fri, 23 Mar 2018 11:27:56 +0000 Subject: [PATCH 224/620] Changes in messages in test dwf mixedprec --- tests/Test_dwf_mixedcg_prec.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/Test_dwf_mixedcg_prec.cc b/tests/Test_dwf_mixedcg_prec.cc index a53d8921..92567b6f 100644 --- a/tests/Test_dwf_mixedcg_prec.cc +++ b/tests/Test_dwf_mixedcg_prec.cc @@ -49,6 +49,8 @@ int main (int argc, char ** argv) const int Ls=8; + std::cout << GridLogMessage << "::::: NB: to enable a quick bit reproducibility check use the --checksums flag. " << std::endl; + GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexD::Nsimd()),GridDefaultMpi()); GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); @@ -90,24 +92,23 @@ int main (int argc, char ** argv) SchurDiagMooeeOperator HermOpEO(Ddwf); SchurDiagMooeeOperator HermOpEO_f(Ddwf_f); - std::cout << "Starting mixed CG" << std::endl; + std::cout << GridLogMessage << "::::::::::::: Starting mixed CG" << std::endl; MixedPrecisionConjugateGradient mCG(1.0e-8, 10000, 50, FrbGrid_f, HermOpEO_f, HermOpEO); mCG(src_o,result_o); - std::cout << "Starting regular CG" << std::endl; + std::cout << GridLogMessage << "::::::::::::: Starting regular CG" << std::endl; ConjugateGradient CG(1.0e-8,10000); CG(HermOpEO,src_o,result_o_2); LatticeFermionD diff_o(FrbGrid); RealD diff = axpy_norm(diff_o, -1.0, result_o, result_o_2); - std::cout << "Diff between mixed and regular CG: " << diff << std::endl; + std::cout << GridLogMessage << "::::::::::::: Diff between mixed and regular CG: " << diff << std::endl; #ifdef HAVE_LIME if( GridCmdOptionExists(argv,argv+argc,"--checksums") ){ std::string file1("./Propagator1"); - std::string file2("./Propagator2"); emptyUserRecord record; uint32_t nersc_csum; uint32_t scidac_csuma; @@ -121,12 +122,12 @@ int main (int argc, char ** argv) BinaryIO::writeLatticeObject(result_o,file1,munge, 0, format, nersc_csum,scidac_csuma,scidac_csumb); - std::cout << " Mixed checksums "<(result_o_2,file1,munge, 0, format, nersc_csum,scidac_csuma,scidac_csumb); - std::cout << " CG checksums "< Date: Mon, 26 Mar 2018 19:16:16 +0100 Subject: [PATCH 225/620] Lattice serialisation, just HDF5 for the moment --- lib/lattice/Lattice_transfer.h | 93 +++++++++++++++++++++++++++++++++ lib/serialisation/Hdf5IO.h | 64 ++++++++++++++++++++++- lib/serialisation/VectorUtils.h | 44 +++++++++++++++- 3 files changed, 199 insertions(+), 2 deletions(-) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 44f0337d..f988f310 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -599,6 +599,51 @@ unvectorizeToLexOrdArray(std::vector &out, const Lattice &in) extract1(in_vobj, out_ptrs, 0); } } + +template +typename std::enable_if::value && !isSIMDvectorized::value, void>::type +unvectorizeToRevLexOrdArray(std::vector &out, const Lattice &in) +{ + + typedef typename vobj::vector_type vtype; + + GridBase* in_grid = in._grid; + out.resize(in_grid->lSites()); + + int ndim = in_grid->Nd(); + int in_nsimd = vtype::Nsimd(); + + std::vector > in_icoor(in_nsimd); + + for(int lane=0; lane < in_nsimd; lane++){ + in_icoor[lane].resize(ndim); + in_grid->iCoorFromIindex(in_icoor[lane], lane); + } + + parallel_for(int in_oidx = 0; in_oidx < in_grid->oSites(); in_oidx++){ //loop over outer index + //Assemble vector of pointers to output elements + std::vector out_ptrs(in_nsimd); + + std::vector in_ocoor(ndim); + in_grid->oCoorFromOindex(in_ocoor, in_oidx); + + std::vector lcoor(in_grid->Nd()); + + for(int lane=0; lane < in_nsimd; lane++){ + for(int mu=0;mu_rdimensions[mu]*in_icoor[lane][mu]; + + int lex; + Lexicographic::IndexFromCoorReversed(lcoor, lex, in_grid->_ldimensions); + out_ptrs[lane] = &out[lex]; + } + + //Unpack into those ptrs + const vobj & in_vobj = in._odata[in_oidx]; + extract1(in_vobj, out_ptrs, 0); + } +} + //Copy SIMD-vectorized lattice to array of scalar objects in lexicographic order template typename std::enable_if::value @@ -648,6 +693,54 @@ vectorizeFromLexOrdArray( std::vector &in, Lattice &out) } } +template +typename std::enable_if::value + && !isSIMDvectorized::value, void>::type +vectorizeFromRevLexOrdArray( std::vector &in, Lattice &out) +{ + + typedef typename vobj::vector_type vtype; + + GridBase* grid = out._grid; + assert(in.size()==grid->lSites()); + + int ndim = grid->Nd(); + int nsimd = vtype::Nsimd(); + + std::vector > icoor(nsimd); + + for(int lane=0; lane < nsimd; lane++){ + icoor[lane].resize(ndim); + grid->iCoorFromIindex(icoor[lane],lane); + } + + parallel_for(uint64_t oidx = 0; oidx < grid->oSites(); oidx++){ //loop over outer index + //Assemble vector of pointers to output elements + std::vector ptrs(nsimd); + + std::vector ocoor(ndim); + grid->oCoorFromOindex(ocoor, oidx); + + std::vector lcoor(grid->Nd()); + + for(int lane=0; lane < nsimd; lane++){ + + for(int mu=0;mu_rdimensions[mu]*icoor[lane][mu]; + } + + int lex; + Lexicographic::IndexFromCoorReversed(lcoor, lex, grid->_ldimensions); + ptrs[lane] = &in[lex]; + } + + //pack from those ptrs + vobj vecobj; + merge1(vecobj, ptrs, 0); + out._odata[oidx] = vecobj; + } +} + //Convert a Lattice from one precision to another template void precisionChange(Lattice &out, const Lattice &in){ diff --git a/lib/serialisation/Hdf5IO.h b/lib/serialisation/Hdf5IO.h index 12625ab8..940bb11a 100644 --- a/lib/serialisation/Hdf5IO.h +++ b/lib/serialisation/Hdf5IO.h @@ -22,6 +22,8 @@ namespace Grid { + template class Lattice; + class Hdf5Writer: public Writer { public: @@ -33,6 +35,8 @@ namespace Grid template void writeDefault(const std::string &s, const U &x); template + void writeDefault(const std::string &s, const Lattice &field); + template typename std::enable_if>::is_number, void>::type writeDefault(const std::string &s, const std::vector &x); template @@ -60,6 +64,8 @@ namespace Grid template void readDefault(const std::string &s, U &output); template + void readDefault(const std::string &s, Lattice &field); + template typename std::enable_if>::is_number, void>::type readDefault(const std::string &s, std::vector &x); template @@ -98,7 +104,40 @@ namespace Grid template <> void Hdf5Writer::writeDefault(const std::string &s, const std::string &x); - + + + template + void Hdf5Writer::writeDefault(const std::string &s, const Lattice &field) + { + // alias scalar types + typedef std::vector ScalarLattice; + typedef typename U::scalar_type ScalarType; + + ScalarLattice scalField; + + unvectorizeToRevLexOrdArray(scalField, field); + + std::vector dim; + std::vector tDim; + + tensorDim(tDim, scalField[0]); + for (auto &d: field._grid->GlobalDimensions()) + { + dim.push_back(d); + } + for (auto &d: tDim) + { + dim.push_back(d); + } + + // write to file + H5NS::DataSpace dataSpace(dim.size(), dim.data()); + H5NS::DataSet dataSet; + + dataSet = group_.createDataSet(s, Hdf5Type::type(), dataSpace); + dataSet.write(scalField.data(), Hdf5Type::type()); + } + template typename std::enable_if>::is_number, void>::type Hdf5Writer::writeDefault(const std::string &s, const std::vector &x) @@ -169,6 +208,29 @@ namespace Grid template <> void Hdf5Reader::readDefault(const std::string &s, std::string &x); + template + void Hdf5Reader::readDefault(const std::string &s, Lattice &field) + { + // alias scalar types + typedef std::vector ScalarLattice; + typedef typename U::scalar_type ScalarType; + + ScalarLattice scalField; + H5NS::DataSet dataSet; + std::vector dim; + hsize_t size = 1; + + dataSet = group_.openDataSet(s); + for (auto &d: field._grid->GlobalDimensions()) + { + dim.push_back(d); + size *= d; + } + scalField.resize(size); + dataSet.read(scalField.data(), Hdf5Type::type()); + vectorizeFromRevLexOrdArray(scalField, field); + } + template typename std::enable_if>::is_number, void>::type Hdf5Reader::readDefault(const std::string &s, std::vector &x) diff --git a/lib/serialisation/VectorUtils.h b/lib/serialisation/VectorUtils.h index 6df9416d..e1095488 100644 --- a/lib/serialisation/VectorUtils.h +++ b/lib/serialisation/VectorUtils.h @@ -2,7 +2,7 @@ #define GRID_SERIALISATION_VECTORUTILS_H #include -#include +#include namespace Grid { // Pair IO utilities ///////////////////////////////////////////////////////// @@ -78,6 +78,48 @@ namespace Grid { typedef typename std::vector::type>> type; }; + template + void tensorDim(std::vector &dim, const T &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + } + + template + void tensorDim(std::vector &dim, const iScalar &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + tensorDim(dim, t._internal, false); + } + + template + void tensorDim(std::vector &dim, const iVector &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + dim.push_back(N); + tensorDim(dim, t._internal[0], false); + } + + template + void tensorDim(std::vector &dim, const iMatrix &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + dim.push_back(N); + dim.push_back(N); + tensorDim(dim, t._internal[0][0], false); + } + template typename TensorToVec::type tensorToVec(const T &t) { From 5ec903044da9fb5738e3be0c4aca41b6400dab31 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 27 Mar 2018 17:11:50 +0100 Subject: [PATCH 226/620] Serial IO code cleaning for std:: convention --- lib/serialisation/BinaryIO.cc | 17 ++++++++--------- lib/serialisation/JSON_IO.cc | 13 ++++++------- lib/serialisation/TextIO.cc | 15 +++++++-------- lib/serialisation/XmlIO.cc | 21 ++++++++++----------- 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/lib/serialisation/BinaryIO.cc b/lib/serialisation/BinaryIO.cc index 7133adc0..a4d26b69 100644 --- a/lib/serialisation/BinaryIO.cc +++ b/lib/serialisation/BinaryIO.cc @@ -29,15 +29,14 @@ Author: paboyle #include using namespace Grid; -using namespace std; // Writer implementation /////////////////////////////////////////////////////// -BinaryWriter::BinaryWriter(const string &fileName) -: file_(fileName, ios::binary|ios::out) +BinaryWriter::BinaryWriter(const std::string &fileName) +: file_(fileName, std::ios::binary|std::ios::out) {} template <> -void BinaryWriter::writeDefault(const string &s, const string &x) +void BinaryWriter::writeDefault(const std::string &s, const std::string &x) { uint64_t sz = x.size(); @@ -48,20 +47,20 @@ void BinaryWriter::writeDefault(const string &s, const string &x) } } -void BinaryWriter::writeDefault(const string &s, const char *x) +void BinaryWriter::writeDefault(const std::string &s, const char *x) { - string sx(x); + std::string sx(x); writeDefault(s, sx); } // Reader implementation /////////////////////////////////////////////////////// -BinaryReader::BinaryReader(const string &fileName) -: file_(fileName, ios::binary|ios::in) +BinaryReader::BinaryReader(const std::string &fileName) +: file_(fileName, std::ios::binary|std::ios::in) {} template <> -void BinaryReader::readDefault(const string &s, string &output) +void BinaryReader::readDefault(const std::string &s, std::string &output) { uint64_t sz; diff --git a/lib/serialisation/JSON_IO.cc b/lib/serialisation/JSON_IO.cc index 6a01aa84..98edc375 100644 --- a/lib/serialisation/JSON_IO.cc +++ b/lib/serialisation/JSON_IO.cc @@ -28,11 +28,10 @@ #include using namespace Grid; -using namespace std; // Writer implementation /////////////////////////////////////////////////////// -JSONWriter::JSONWriter(const string &fileName) -: fileName_(fileName), ss_("{ ", ostringstream::ate){} +JSONWriter::JSONWriter(const std::string &fileName) +: fileName_(fileName), ss_("{ ", std::ostringstream::ate){} JSONWriter::~JSONWriter(void) { @@ -46,7 +45,7 @@ JSONWriter::~JSONWriter(void) os << std::setw(2) << json::parse(ss_.str()) << std::endl; } -void JSONWriter::push(const string &s) +void JSONWriter::push(const std::string &s) { // adding a nested object if (s.size()) @@ -90,7 +89,7 @@ namespace Grid // Reader implementation /////////////////////////////////////////////////////// -JSONReader::JSONReader(const string &fileName) +JSONReader::JSONReader(const std::string &fileName) : fileName_(fileName) { std::ifstream file(fileName_); @@ -102,7 +101,7 @@ JSONReader::JSONReader(const string &fileName) jcur_ = jobject_; } -bool JSONReader::push(const string &s) +bool JSONReader::push(const std::string &s) { if (s.size()){ jold_.push_back(jcur_); @@ -159,7 +158,7 @@ bool JSONReader::nextElement(const std::string &s) } template <> -void JSONReader::readDefault(const string &s, string &output) +void JSONReader::readDefault(const std::string &s, std::string &output) { //cout << "JSONReader::readDefault(string) : " << s<< " " << jcur_ << endl; if (s.size()){ diff --git a/lib/serialisation/TextIO.cc b/lib/serialisation/TextIO.cc index 5e27dfbc..77c45fd9 100644 --- a/lib/serialisation/TextIO.cc +++ b/lib/serialisation/TextIO.cc @@ -30,17 +30,16 @@ #include using namespace Grid; -using namespace std; #define GRID_TEXT_INDENT 2 //number of spaces for indentation of levels // Writer implementation /////////////////////////////////////////////////////// -TextWriter::TextWriter(const string &fileName) -: file_(fileName, ios::out) +TextWriter::TextWriter(const std::string &fileName) +: file_(fileName, std::ios::out) {} -void TextWriter::push(const string &s) +void TextWriter::push(const std::string &s) { level_++; }; @@ -58,16 +57,16 @@ void TextWriter::indent(void) }; // Reader implementation /////////////////////////////////////////////////////// -TextReader::TextReader(const string &fileName) +TextReader::TextReader(const std::string &fileName) { - file_.open(fileName, ios::in); + file_.open(fileName, std::ios::in); if (!file_.is_open()) { std::cout << GridLogMessage << "TextReader: Error opening file " << fileName << std::endl; exit(1);// write better error handling } } -bool TextReader::push(const string &s) +bool TextReader::push(const std::string &s) { level_++; return true; @@ -91,7 +90,7 @@ void TextReader::checkIndent(void) } if (!check) { - cerr << "TextReader: mismatch on level " << level_ << std::endl; + std::cerr << "TextReader: mismatch on level " << level_ << std::endl; exit(1); } } diff --git a/lib/serialisation/XmlIO.cc b/lib/serialisation/XmlIO.cc index 8ac7422c..1828d7fc 100644 --- a/lib/serialisation/XmlIO.cc +++ b/lib/serialisation/XmlIO.cc @@ -29,10 +29,9 @@ Author: paboyle #include using namespace Grid; -using namespace std; // Writer implementation /////////////////////////////////////////////////////// -XmlWriter::XmlWriter(const string &fileName, string toplev) : fileName_(fileName) +XmlWriter::XmlWriter(const std::string &fileName, std::string toplev) : fileName_(fileName) { if ( toplev == std::string("") ) { node_=doc_; @@ -49,7 +48,7 @@ XmlWriter::~XmlWriter(void) } } -void XmlWriter::push(const string &s) +void XmlWriter::push(const std::string &s) { node_ = node_.append_child(s.c_str()); } @@ -65,13 +64,13 @@ std::string XmlWriter::XmlString(void) return oss.str(); } -XmlReader::XmlReader(const char *xmlstring,string toplev) : fileName_("") +XmlReader::XmlReader(const char *xmlstring,std::string toplev) : fileName_("") { pugi::xml_parse_result result; result = doc_.load_string(xmlstring); if ( !result ) { - cerr << "XML error description (from char *): " << result.description() << "\nXML\n"<< xmlstring << "\n"; - cerr << "XML error offset (from char *) " << result.offset << "\nXML\n"<< xmlstring <<"\n"; + std::cerr << "XML error description (from char *): " << result.description() << "\nXML\n"<< xmlstring << "\n"; + std::cerr << "XML error offset (from char *) " << result.offset << "\nXML\n"<< xmlstring <<"\n"; abort(); } if ( toplev == std::string("") ) { @@ -82,13 +81,13 @@ XmlReader::XmlReader(const char *xmlstring,string toplev) : fileName_("") } // Reader implementation /////////////////////////////////////////////////////// -XmlReader::XmlReader(const string &fileName,string toplev) : fileName_(fileName) +XmlReader::XmlReader(const std::string &fileName,std::string toplev) : fileName_(fileName) { pugi::xml_parse_result result; result = doc_.load_file(fileName_.c_str()); if ( !result ) { - cerr << "XML error description: " << result.description() <<" "<< fileName_ <<"\n"; - cerr << "XML error offset : " << result.offset <<" "<< fileName_ <<"\n"; + std::cerr << "XML error description: " << result.description() <<" "<< fileName_ <<"\n"; + std::cerr << "XML error offset : " << result.offset <<" "<< fileName_ <<"\n"; abort(); } if ( toplev == std::string("") ) { @@ -98,7 +97,7 @@ XmlReader::XmlReader(const string &fileName,string toplev) : fileName_(fileName) } } -bool XmlReader::push(const string &s) +bool XmlReader::push(const std::string &s) { if (node_.child(s.c_str())) { @@ -133,7 +132,7 @@ bool XmlReader::nextElement(const std::string &s) } template <> -void XmlReader::readDefault(const string &s, string &output) +void XmlReader::readDefault(const std::string &s, std::string &output) { if (node_.child(s.c_str())) { From a4d8512fb8088f005e5424a8917e12a66c321e19 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 27 Mar 2018 17:55:42 +0100 Subject: [PATCH 227/620] Revert "Lattice serialisation, just HDF5 for the moment" This reverts commit 8a0cf0194f4ea42d104690b69cc43a1982ebeae0. --- lib/lattice/Lattice_transfer.h | 93 --------------------------------- lib/serialisation/Hdf5IO.h | 64 +---------------------- lib/serialisation/VectorUtils.h | 44 +--------------- 3 files changed, 2 insertions(+), 199 deletions(-) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index f988f310..44f0337d 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -599,51 +599,6 @@ unvectorizeToLexOrdArray(std::vector &out, const Lattice &in) extract1(in_vobj, out_ptrs, 0); } } - -template -typename std::enable_if::value && !isSIMDvectorized::value, void>::type -unvectorizeToRevLexOrdArray(std::vector &out, const Lattice &in) -{ - - typedef typename vobj::vector_type vtype; - - GridBase* in_grid = in._grid; - out.resize(in_grid->lSites()); - - int ndim = in_grid->Nd(); - int in_nsimd = vtype::Nsimd(); - - std::vector > in_icoor(in_nsimd); - - for(int lane=0; lane < in_nsimd; lane++){ - in_icoor[lane].resize(ndim); - in_grid->iCoorFromIindex(in_icoor[lane], lane); - } - - parallel_for(int in_oidx = 0; in_oidx < in_grid->oSites(); in_oidx++){ //loop over outer index - //Assemble vector of pointers to output elements - std::vector out_ptrs(in_nsimd); - - std::vector in_ocoor(ndim); - in_grid->oCoorFromOindex(in_ocoor, in_oidx); - - std::vector lcoor(in_grid->Nd()); - - for(int lane=0; lane < in_nsimd; lane++){ - for(int mu=0;mu_rdimensions[mu]*in_icoor[lane][mu]; - - int lex; - Lexicographic::IndexFromCoorReversed(lcoor, lex, in_grid->_ldimensions); - out_ptrs[lane] = &out[lex]; - } - - //Unpack into those ptrs - const vobj & in_vobj = in._odata[in_oidx]; - extract1(in_vobj, out_ptrs, 0); - } -} - //Copy SIMD-vectorized lattice to array of scalar objects in lexicographic order template typename std::enable_if::value @@ -693,54 +648,6 @@ vectorizeFromLexOrdArray( std::vector &in, Lattice &out) } } -template -typename std::enable_if::value - && !isSIMDvectorized::value, void>::type -vectorizeFromRevLexOrdArray( std::vector &in, Lattice &out) -{ - - typedef typename vobj::vector_type vtype; - - GridBase* grid = out._grid; - assert(in.size()==grid->lSites()); - - int ndim = grid->Nd(); - int nsimd = vtype::Nsimd(); - - std::vector > icoor(nsimd); - - for(int lane=0; lane < nsimd; lane++){ - icoor[lane].resize(ndim); - grid->iCoorFromIindex(icoor[lane],lane); - } - - parallel_for(uint64_t oidx = 0; oidx < grid->oSites(); oidx++){ //loop over outer index - //Assemble vector of pointers to output elements - std::vector ptrs(nsimd); - - std::vector ocoor(ndim); - grid->oCoorFromOindex(ocoor, oidx); - - std::vector lcoor(grid->Nd()); - - for(int lane=0; lane < nsimd; lane++){ - - for(int mu=0;mu_rdimensions[mu]*icoor[lane][mu]; - } - - int lex; - Lexicographic::IndexFromCoorReversed(lcoor, lex, grid->_ldimensions); - ptrs[lane] = &in[lex]; - } - - //pack from those ptrs - vobj vecobj; - merge1(vecobj, ptrs, 0); - out._odata[oidx] = vecobj; - } -} - //Convert a Lattice from one precision to another template void precisionChange(Lattice &out, const Lattice &in){ diff --git a/lib/serialisation/Hdf5IO.h b/lib/serialisation/Hdf5IO.h index 940bb11a..12625ab8 100644 --- a/lib/serialisation/Hdf5IO.h +++ b/lib/serialisation/Hdf5IO.h @@ -22,8 +22,6 @@ namespace Grid { - template class Lattice; - class Hdf5Writer: public Writer { public: @@ -35,8 +33,6 @@ namespace Grid template void writeDefault(const std::string &s, const U &x); template - void writeDefault(const std::string &s, const Lattice &field); - template typename std::enable_if>::is_number, void>::type writeDefault(const std::string &s, const std::vector &x); template @@ -64,8 +60,6 @@ namespace Grid template void readDefault(const std::string &s, U &output); template - void readDefault(const std::string &s, Lattice &field); - template typename std::enable_if>::is_number, void>::type readDefault(const std::string &s, std::vector &x); template @@ -104,40 +98,7 @@ namespace Grid template <> void Hdf5Writer::writeDefault(const std::string &s, const std::string &x); - - - template - void Hdf5Writer::writeDefault(const std::string &s, const Lattice &field) - { - // alias scalar types - typedef std::vector ScalarLattice; - typedef typename U::scalar_type ScalarType; - - ScalarLattice scalField; - - unvectorizeToRevLexOrdArray(scalField, field); - - std::vector dim; - std::vector tDim; - - tensorDim(tDim, scalField[0]); - for (auto &d: field._grid->GlobalDimensions()) - { - dim.push_back(d); - } - for (auto &d: tDim) - { - dim.push_back(d); - } - - // write to file - H5NS::DataSpace dataSpace(dim.size(), dim.data()); - H5NS::DataSet dataSet; - - dataSet = group_.createDataSet(s, Hdf5Type::type(), dataSpace); - dataSet.write(scalField.data(), Hdf5Type::type()); - } - + template typename std::enable_if>::is_number, void>::type Hdf5Writer::writeDefault(const std::string &s, const std::vector &x) @@ -208,29 +169,6 @@ namespace Grid template <> void Hdf5Reader::readDefault(const std::string &s, std::string &x); - template - void Hdf5Reader::readDefault(const std::string &s, Lattice &field) - { - // alias scalar types - typedef std::vector ScalarLattice; - typedef typename U::scalar_type ScalarType; - - ScalarLattice scalField; - H5NS::DataSet dataSet; - std::vector dim; - hsize_t size = 1; - - dataSet = group_.openDataSet(s); - for (auto &d: field._grid->GlobalDimensions()) - { - dim.push_back(d); - size *= d; - } - scalField.resize(size); - dataSet.read(scalField.data(), Hdf5Type::type()); - vectorizeFromRevLexOrdArray(scalField, field); - } - template typename std::enable_if>::is_number, void>::type Hdf5Reader::readDefault(const std::string &s, std::vector &x) diff --git a/lib/serialisation/VectorUtils.h b/lib/serialisation/VectorUtils.h index e1095488..6df9416d 100644 --- a/lib/serialisation/VectorUtils.h +++ b/lib/serialisation/VectorUtils.h @@ -2,7 +2,7 @@ #define GRID_SERIALISATION_VECTORUTILS_H #include -#include +#include namespace Grid { // Pair IO utilities ///////////////////////////////////////////////////////// @@ -78,48 +78,6 @@ namespace Grid { typedef typename std::vector::type>> type; }; - template - void tensorDim(std::vector &dim, const T &t, const bool wipe = true) - { - if (wipe) - { - dim.clear(); - } - } - - template - void tensorDim(std::vector &dim, const iScalar &t, const bool wipe = true) - { - if (wipe) - { - dim.clear(); - } - tensorDim(dim, t._internal, false); - } - - template - void tensorDim(std::vector &dim, const iVector &t, const bool wipe = true) - { - if (wipe) - { - dim.clear(); - } - dim.push_back(N); - tensorDim(dim, t._internal[0], false); - } - - template - void tensorDim(std::vector &dim, const iMatrix &t, const bool wipe = true) - { - if (wipe) - { - dim.clear(); - } - dim.push_back(N); - dim.push_back(N); - tensorDim(dim, t._internal[0][0], false); - } - template typename TensorToVec::type tensorToVec(const T &t) { From c5a885dcd655a8f42114185f78fe5e821af44f2f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 29 Mar 2018 19:57:41 +0100 Subject: [PATCH 228/620] I/O benchmark --- benchmarks/Benchmark_IO.cc | 101 +++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 benchmarks/Benchmark_IO.cc diff --git a/benchmarks/Benchmark_IO.cc b/benchmarks/Benchmark_IO.cc new file mode 100644 index 00000000..26aac7ae --- /dev/null +++ b/benchmarks/Benchmark_IO.cc @@ -0,0 +1,101 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +#define MSG cout << GridLogMessage +#define SEP \ +"=============================================================================" +#ifndef BENCH_IO_LMAX +#define BENCH_IO_LMAX 40 +#endif + +typedef function WriterFn; +typedef function ReaderFn; + +string filestem(const int l) +{ + return "iobench_l" + to_string(l); +} + +void limeWrite(const string filestem, LatticeFermion &vec) +{ + emptyUserRecord record; + ScidacWriter binWriter; + + binWriter.open(filestem + ".bin"); + binWriter.writeScidacFieldRecord(vec, record); + binWriter.close(); +} + +void limeRead(LatticeFermion &vec, const string filestem) +{ + emptyUserRecord record; + ScidacReader binReader; + + binReader.open(filestem + ".bin"); + binReader.readScidacFieldRecord(vec, record); + binReader.close(); +} + +void writeBenchmark(const int l, const WriterFn &write) +{ + auto mpi = GridDefaultMpi(); + auto simd = GridDefaultSimd(Nd, vComplex::Nsimd()); + vector latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]}; + unique_ptr gPt(SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi)); + GridCartesian *g = gPt.get(); + GridParallelRNG rng(g); + LatticeFermion vec(g); + emptyUserRecord record; + ScidacWriter binWriter; + + cout << "-- Local volume " << l << "^4" << endl; + random(rng, vec); + write(filestem(l), vec); +} + +void readBenchmark(const int l, const ReaderFn &read) +{ + auto mpi = GridDefaultMpi(); + auto simd = GridDefaultSimd(Nd, vComplex::Nsimd()); + vector latt = {l*mpi[0], l*mpi[1], l*mpi[2], l*mpi[3]}; + unique_ptr gPt(SpaceTimeGrid::makeFourDimGrid(latt, simd, mpi)); + GridCartesian *g = gPt.get(); + LatticeFermion vec(g); + emptyUserRecord record; + ScidacReader binReader; + + cout << "-- Local volume " << l << "^4" << endl; + read(vec, filestem(l)); +} + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + auto simd = GridDefaultSimd(Nd,vComplex::Nsimd()); + auto mpi = GridDefaultMpi(); + + int64_t threads = GridThread::GetThreads(); + MSG << "Grid is setup to use " << threads << " threads" << endl; + MSG << SEP << endl; + MSG << "Benchmark Lime write" << endl; + MSG << SEP << endl; + for (int l = 4; l <= BENCH_IO_LMAX; l += 2) + { + writeBenchmark(l, limeWrite); + } + + MSG << "Benchmark Lime read" << endl; + MSG << SEP << endl; + for (int l = 4; l <= BENCH_IO_LMAX; l += 2) + { + readBenchmark(l, limeRead); + } + + Grid_finalize(); + + return EXIT_SUCCESS; +} \ No newline at end of file From 2f5add4d5f53d449002ca100a82b7f9c9a16c572 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 30 Mar 2018 12:30:58 +0100 Subject: [PATCH 229/620] Creation of file --- lib/parallelIO/BinaryIO.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/parallelIO/BinaryIO.h b/lib/parallelIO/BinaryIO.h index 39acf0e0..45fd522e 100644 --- a/lib/parallelIO/BinaryIO.h +++ b/lib/parallelIO/BinaryIO.h @@ -372,7 +372,7 @@ class BinaryIO { std::cout << GridLogMessage <<"IOobject: C++ read I/O " << file << " : " << iodata.size() * sizeof(fobj) << " bytes" << std::endl; std::ifstream fin; - fin.open(file, std::ios::binary | std::ios::in); + fin.open(file, std::ios::binary | std::ios::in); if (control & BINARYIO_MASTER_APPEND) { fin.seekg(-sizeof(fobj), fin.end); @@ -453,11 +453,15 @@ class BinaryIO { std::ofstream fout; fout.exceptions ( std::fstream::failbit | std::fstream::badbit ); try { - fout.open(file,std::ios::binary|std::ios::out|std::ios::in); + if (offset) { // Must already exist and contain data + fout.open(file,std::ios::binary|std::ios::out|std::ios::in); + } else { // Allow create + fout.open(file,std::ios::binary|std::ios::out); + } } catch (const std::fstream::failure& exc) { std::cout << GridLogError << "Error in opening the file " << file << " for output" < Date: Fri, 30 Mar 2018 12:41:30 +0100 Subject: [PATCH 230/620] Barrier required in parallel when we use ftell --- lib/parallelIO/IldgIO.h | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index b81d1e43..e29b1d39 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -350,26 +350,36 @@ class GridLimeWriter : public BinaryIO { // iv) fseek on FILE * to end of this disjoint section. // v) Continue writing scidac record. //////////////////////////////////////////////////////////////////// - + + GridBase *grid = field._grid; //////////////////////////////////////////// // Create record header //////////////////////////////////////////// typedef typename vobj::scalar_object sobj; int err; uint32_t nersc_csum,scidac_csuma,scidac_csumb; - uint64_t PayloadSize = sizeof(sobj) * field._grid->_gsites; + uint64_t PayloadSize = sizeof(sobj) * grid->_gsites; createLimeRecordHeader(record_name, 0, 0, PayloadSize); - + fflush(File); + // std::cout << "W sizeof(sobj)" <_gsites<Broadcast(0,(void *)&compare,sizeof(compare)); + + assert(compare == offset1 ); /////////////////////////////////////////// // Write by other means into the binary record /////////////////////////////////////////// - uint64_t offset1 = ftello(File); // std::cout << " Writing to offset "<(); BinarySimpleMunger munge; BinaryIO::writeLatticeObject(field, filename, munge, offset1, format,nersc_csum,scidac_csuma,scidac_csumb); @@ -380,7 +390,15 @@ class GridLimeWriter : public BinaryIO { fseek(File,0,SEEK_END); uint64_t offset2 = ftello(File); // std::cout << " now at offset "<Barrier(); + + ///////////////////////////////////////////////////////////// + // Check MPI-2 I/O did what we expect to file + ///////////////////////////////////////////////////////////// + assert( (offset2-offset1) == PayloadSize); err=limeWriterCloseRecord(LimeW); assert(err>=0); From ab6afd18ac2b6431544f92d147a530a7e21022b6 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 30 Mar 2018 13:39:20 +0100 Subject: [PATCH 231/620] Still compile if no LIME --- benchmarks/Benchmark_IO.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/benchmarks/Benchmark_IO.cc b/benchmarks/Benchmark_IO.cc index 26aac7ae..c8f2692a 100644 --- a/benchmarks/Benchmark_IO.cc +++ b/benchmarks/Benchmark_IO.cc @@ -1,3 +1,4 @@ +#ifdef HAVE_LIME #include using namespace std; @@ -98,4 +99,11 @@ int main (int argc, char ** argv) Grid_finalize(); return EXIT_SUCCESS; -} \ No newline at end of file +} +#else +#include +int main (int argc, char ** argv) +{ + return EXIT_SUCCESS; +} +#endif From a13c1091111d348ffe261c2c63863179d73ff2d0 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 30 Mar 2018 16:03:01 +0100 Subject: [PATCH 232/620] deterministic initialisation of field metadata --- lib/parallelIO/IldgIOtypes.h | 5 +++-- lib/parallelIO/MetaData.h | 18 ++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/parallelIO/IldgIOtypes.h b/lib/parallelIO/IldgIOtypes.h index 5b397e14..281b20f2 100644 --- a/lib/parallelIO/IldgIOtypes.h +++ b/lib/parallelIO/IldgIOtypes.h @@ -136,8 +136,9 @@ struct scidacRecord : Serializable { int, typesize, int, datacount); - scidacRecord() { version =1.0; } - + scidacRecord() + : version(1.0), recordtype(0), colors(0), spins(0), typesize(0), datacount(0) + {} }; //////////////////////// diff --git a/lib/parallelIO/MetaData.h b/lib/parallelIO/MetaData.h index ccc8b18f..55254786 100644 --- a/lib/parallelIO/MetaData.h +++ b/lib/parallelIO/MetaData.h @@ -81,18 +81,16 @@ namespace Grid { std::string, creation_date, std::string, archive_date, std::string, floating_point); - FieldMetaData(void) { - nd=4; - dimension.resize(4); - boundary.resize(4); - scidac_checksuma=0; - scidac_checksumb=0; - checksum=0; - } + // WARNING: non-initialised values might lead to twisted parallel IO + // issues, std::string are fine because they initliase to size 0 + // as per C++ standard. + FieldMetaData(void) + : nd(4), dimension(4,0), boundary(4, ""), data_start(0), + link_trace(0.), plaquette(0.), checksum(0), + scidac_checksuma(0), scidac_checksumb(0), sequence_number(0) + {} }; - - namespace QCD { using namespace Grid; From 276f113f288de9030468f84b8a0fef81a763ecbf Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 30 Mar 2018 16:17:05 +0100 Subject: [PATCH 233/620] IO uses master boss node for metadata. --- benchmarks/Benchmark_IO.cc | 7 +- lib/parallelIO/IldgIO.h | 144 ++++++++++-------- lib/qcd/hmc/checkpointers/ILDGCheckpointer.h | 4 +- tests/IO/Test_ildg_io.cc | 2 +- .../Test_dwf_compressed_lanczos_reorg.cc | 4 +- tests/solver/Test_dwf_mrhs_cg.cc | 4 +- 6 files changed, 94 insertions(+), 71 deletions(-) diff --git a/benchmarks/Benchmark_IO.cc b/benchmarks/Benchmark_IO.cc index c8f2692a..479ae037 100644 --- a/benchmarks/Benchmark_IO.cc +++ b/benchmarks/Benchmark_IO.cc @@ -1,5 +1,5 @@ -#ifdef HAVE_LIME #include +#ifdef HAVE_LIME using namespace std; using namespace Grid; @@ -23,7 +23,7 @@ string filestem(const int l) void limeWrite(const string filestem, LatticeFermion &vec) { emptyUserRecord record; - ScidacWriter binWriter; + ScidacWriter binWriter(vec._grid->IsBoss()); binWriter.open(filestem + ".bin"); binWriter.writeScidacFieldRecord(vec, record); @@ -50,7 +50,7 @@ void writeBenchmark(const int l, const WriterFn &write) GridParallelRNG rng(g); LatticeFermion vec(g); emptyUserRecord record; - ScidacWriter binWriter; + ScidacWriter binWriter(g->IsBoss()); cout << "-- Local volume " << l << "^4" << endl; random(rng, vec); @@ -101,7 +101,6 @@ int main (int argc, char ** argv) return EXIT_SUCCESS; } #else -#include int main (int argc, char ** argv) { return EXIT_SUCCESS; diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index e29b1d39..d1a684f3 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -272,8 +272,10 @@ class GridLimeReader : public BinaryIO { } }; -class GridLimeWriter : public BinaryIO { +class GridLimeWriter : public BinaryIO +{ public: + /////////////////////////////////////////////////// // FIXME: format for RNG? Now just binary out instead // FIXME: collective calls or not ? @@ -282,17 +284,24 @@ class GridLimeWriter : public BinaryIO { FILE *File; LimeWriter *LimeW; std::string filename; - + bool boss_node; + GridLimeWriter( bool isboss = true) { + boss_node = isboss; + } void open(const std::string &_filename) { filename= _filename; - File = fopen(filename.c_str(), "w"); - LimeW = limeCreateWriter(File); assert(LimeW != NULL ); + if ( boss_node ) { + File = fopen(filename.c_str(), "w"); + LimeW = limeCreateWriter(File); assert(LimeW != NULL ); + } } ///////////////////////////////////////////// // Close the file ///////////////////////////////////////////// void close(void) { - fclose(File); + if ( boss_node ) { + fclose(File); + } // limeDestroyWriter(LimeW); } /////////////////////////////////////////////////////// @@ -300,10 +309,12 @@ class GridLimeWriter : public BinaryIO { /////////////////////////////////////////////////////// int createLimeRecordHeader(std::string message, int MB, int ME, size_t PayloadSize) { - LimeRecordHeader *h; - h = limeCreateHeader(MB, ME, const_cast(message.c_str()), PayloadSize); - assert(limeWriteRecordHeader(h, LimeW) >= 0); - limeDestroyHeader(h); + if ( boss_node ) { + LimeRecordHeader *h; + h = limeCreateHeader(MB, ME, const_cast(message.c_str()), PayloadSize); + assert(limeWriteRecordHeader(h, LimeW) >= 0); + limeDestroyHeader(h); + } return LIME_SUCCESS; } //////////////////////////////////////////// @@ -312,28 +323,31 @@ class GridLimeWriter : public BinaryIO { template void writeLimeObject(int MB,int ME,serialisable_object &object,std::string object_name,std::string record_name) { - std::string xmlstring; - { - XmlWriter WR("",""); - write(WR,object_name,object); - xmlstring = WR.XmlString(); + if ( boss_node ) { + std::string xmlstring; + { + XmlWriter WR("",""); + write(WR,object_name,object); + xmlstring = WR.XmlString(); + } + // std::cout << "WriteLimeObject" << record_name <(record_name.c_str()), nbytes); + assert(h!= NULL); + + err=limeWriteRecordHeader(h, LimeW); assert(err>=0); + err=limeWriteRecordData(&xmlstring[0], &nbytes, LimeW); assert(err>=0); + err=limeWriterCloseRecord(LimeW); assert(err>=0); + limeDestroyHeader(h); } - // std::cout << "WriteLimeObject" << record_name <(record_name.c_str()), nbytes); - assert(h!= NULL); - - err=limeWriteRecordHeader(h, LimeW); assert(err>=0); - err=limeWriteRecordData(&xmlstring[0], &nbytes, LimeW); assert(err>=0); - err=limeWriterCloseRecord(LimeW); assert(err>=0); - limeDestroyHeader(h); - // std::cout << " File offset is now"< void writeLimeLatticeBinaryObject(Lattice &field,std::string record_name) { @@ -352,6 +366,8 @@ class GridLimeWriter : public BinaryIO { //////////////////////////////////////////////////////////////////// GridBase *grid = field._grid; + assert(boss_node == field._grid->IsBoss() ); + //////////////////////////////////////////// // Create record header //////////////////////////////////////////// @@ -359,8 +375,10 @@ class GridLimeWriter : public BinaryIO { int err; uint32_t nersc_csum,scidac_csuma,scidac_csumb; uint64_t PayloadSize = sizeof(sobj) * grid->_gsites; - createLimeRecordHeader(record_name, 0, 0, PayloadSize); - fflush(File); + if ( boss_node ) { + createLimeRecordHeader(record_name, 0, 0, PayloadSize); + fflush(File); + } // std::cout << "W sizeof(sobj)" <_gsites<Broadcast(0,(void *)&compare,sizeof(compare)); - - assert(compare == offset1 ); + uint64_t offset1; + if ( boss_node ) { + offset1 = ftello(File); + } + grid->Broadcast(0,(void *)&offset1,sizeof(offset1)); /////////////////////////////////////////// - // Write by other means into the binary record + // The above is collective. Write by other means into the binary record /////////////////////////////////////////// - std::string format = getFormatString(); BinarySimpleMunger munge; BinaryIO::writeLatticeObject(field, filename, munge, offset1, format,nersc_csum,scidac_csuma,scidac_csumb); @@ -387,21 +403,19 @@ class GridLimeWriter : public BinaryIO { /////////////////////////////////////////// // Wind forward and close the record /////////////////////////////////////////// - fseek(File,0,SEEK_END); - uint64_t offset2 = ftello(File); // std::cout << " now at offset "<Barrier(); + if ( boss_node ) { + fseek(File,0,SEEK_END); + uint64_t offset2 = ftello(File); // std::cout << " now at offset "<=0); + if ( boss_node ) { + err=limeWriterCloseRecord(LimeW); assert(err>=0); + } //////////////////////////////////////// // Write checksum element, propagaing forward from the BinaryIO // Always pair a checksum with a binary object, and close message @@ -411,21 +425,26 @@ class GridLimeWriter : public BinaryIO { std::stringstream streamb; streamb << std::hex << scidac_csumb; checksum.suma= streama.str(); checksum.sumb= streamb.str(); - // std::cout << GridLogMessage<<" writing scidac checksums "< - void writeScidacFileRecord(GridBase *grid,SerialisableUserFile &_userFile) - { - scidacFile _scidacFile(grid); - writeLimeObject(1,0,_scidacFile,_scidacFile.SerialisableClassName(),std::string(SCIDAC_PRIVATE_FILE_XML)); - writeLimeObject(0,1,_userFile,_userFile.SerialisableClassName(),std::string(SCIDAC_FILE_XML)); - } + ScidacWriter(bool isboss =true ) : GridLimeWriter(isboss) { }; + + template + void writeScidacFileRecord(GridBase *grid,SerialisableUserFile &_userFile) + { + scidacFile _scidacFile(grid); + if ( this->boss_node ) { + writeLimeObject(1,0,_scidacFile,_scidacFile.SerialisableClassName(),std::string(SCIDAC_PRIVATE_FILE_XML)); + writeLimeObject(0,1,_userFile,_userFile.SerialisableClassName(),std::string(SCIDAC_FILE_XML)); + } + } //////////////////////////////////////////////// // Write generic lattice field in scidac format //////////////////////////////////////////////// @@ -446,9 +465,12 @@ class ScidacWriter : public GridLimeWriter { ////////////////////////////////////////////// // Fill the Lime file record by record ////////////////////////////////////////////// - writeLimeObject(1,0,header ,std::string("FieldMetaData"),std::string(GRID_FORMAT)); // Open message - writeLimeObject(0,0,_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML)); - writeLimeObject(0,0,_scidacRecord,_scidacRecord.SerialisableClassName(),std::string(SCIDAC_PRIVATE_RECORD_XML)); + if ( this->boss_node ) { + writeLimeObject(1,0,header ,std::string("FieldMetaData"),std::string(GRID_FORMAT)); // Open message + writeLimeObject(0,0,_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML)); + writeLimeObject(0,0,_scidacRecord,_scidacRecord.SerialisableClassName(),std::string(SCIDAC_PRIVATE_RECORD_XML)); + } + // Collective call writeLimeLatticeBinaryObject(field,std::string(ILDG_BINARY_DATA)); // Closes message with checksum } }; @@ -515,6 +537,8 @@ class ScidacReader : public GridLimeReader { class IldgWriter : public ScidacWriter { public: + + IldgWriter(bool isboss) : ScidacWriter(isboss) {}; /////////////////////////////////// // A little helper diff --git a/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h b/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h index 3bcdc77a..9bcc33df 100644 --- a/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h +++ b/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h @@ -74,10 +74,10 @@ class ILDGHmcCheckpointer : public BaseHmcCheckpointer { if ((traj % Params.saveInterval) == 0) { std::string config, rng; this->build_filenames(traj, Params, config, rng); - + GridBase *grid = U._grid; uint32_t nersc_csum,scidac_csuma,scidac_csumb; BinaryIO::writeRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb); - IldgWriter _IldgWriter; + IldgWriter _IldgWriter(grid->IsBoss()); _IldgWriter.open(config); _IldgWriter.writeConfiguration(U, traj, config, config); _IldgWriter.close(); diff --git a/tests/IO/Test_ildg_io.cc b/tests/IO/Test_ildg_io.cc index 6aac2e38..55dd93b8 100644 --- a/tests/IO/Test_ildg_io.cc +++ b/tests/IO/Test_ildg_io.cc @@ -79,7 +79,7 @@ int main (int argc, char ** argv) std::cout <subspace.size()==nbasis); emptyUserRecord record; - Grid::QCD::ScidacWriter WR; + Grid::QCD::ScidacWriter WR(this->_FineGrid->IsBoss()); WR.open(evecs_file); for(int k=0;ksubspace[k],record); @@ -96,7 +96,7 @@ public: { int n = this->evec_coarse.size(); emptyUserRecord record; - Grid::QCD::ScidacWriter WR; + Grid::QCD::ScidacWriter WR(this->_CoarseGrid->IsBoss()); WR.open(evecs_file); for(int k=0;kevec_coarse[k],record); diff --git a/tests/solver/Test_dwf_mrhs_cg.cc b/tests/solver/Test_dwf_mrhs_cg.cc index 207e1331..72ba3d26 100644 --- a/tests/solver/Test_dwf_mrhs_cg.cc +++ b/tests/solver/Test_dwf_mrhs_cg.cc @@ -114,7 +114,7 @@ int main (int argc, char ** argv) { FGrid->Barrier(); - ScidacWriter _ScidacWriter; + ScidacWriter _ScidacWriter(FGrid->IsBoss()); _ScidacWriter.open(file); std::cout << GridLogMessage << "****************************************************************** "<IsBoss()); _ScidacWriter.open(filefn.str()); _ScidacWriter.writeScidacFieldRecord(src[n],record); _ScidacWriter.close(); From 68e6a58f123a6da1f540b156f61e8d5b2f8c61d7 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 3 Apr 2018 17:42:21 +0100 Subject: [PATCH 234/620] Hadrons: several Lanczos fixes and improvements --- extras/Hadrons/EigenPack.hpp | 53 +++++++++++++------ .../Modules/MIO/LoadCoarseEigenPack.hpp | 11 +++- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 15 +++--- .../iterative/LocalCoherenceLanczos.h | 8 +-- 4 files changed, 62 insertions(+), 25 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index d27e35b9..08811107 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -152,55 +152,78 @@ public: evecCoarse.resize(sizeCoarse, gridCoarse); } - virtual void read(const std::string fileStem, const int traj = -1) + void readFine(const std::string fileStem, const int traj = -1) { std::string evecFineFilename, evalFineFilename; std::string evecCoarseFilename, evalCoarseFilename; this->makeFilenames(evecFineFilename, evalFineFilename, fileStem + "_fine", traj); - this->makeFilenames(evecCoarseFilename, evalCoarseFilename, - fileStem + "_coarse", traj); XmlReader xmlFineReader(evalFineFilename); - XmlReader xmlCoarseReader(evalCoarseFilename); LOG(Message) << "Reading " << this->evec.size() << " fine eigenvectors from '" << evecFineFilename << "'" << std::endl; this->basicRead(this->evec, evecFineFilename, this->evec.size()); - LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" - << evecCoarseFilename << "'" << std::endl; - this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); LOG(Message) << "Reading " << this->eval.size() << " fine eigenvalues from '" << evalFineFilename << "'" << std::endl; Grid::read(xmlFineReader, "evals", this->eval); + } + + void readCoarse(const std::string fileStem, const int traj = -1) + { + std::string evecCoarseFilename, evalCoarseFilename; + + this->makeFilenames(evecCoarseFilename, evalCoarseFilename, + fileStem + "_coarse", traj); + XmlReader xmlCoarseReader(evalCoarseFilename); + LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" + << evecCoarseFilename << "'" << std::endl; + this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); LOG(Message) << "Reading " << evalCoarse.size() << " coarse eigenvalues from '" << evalCoarseFilename << "'" << std::endl; Grid::read(xmlCoarseReader, "evals", evalCoarse); } - virtual void write(const std::string fileStem, const int traj = -1) + virtual void read(const std::string fileStem, const int traj = -1) + { + readFine(fileStem, traj); + readCoarse(fileStem, traj); + } + + void writeFine(const std::string fileStem, const int traj = -1) { std::string evecFineFilename, evalFineFilename; - std::string evecCoarseFilename, evalCoarseFilename; this->makeFilenames(evecFineFilename, evalFineFilename, fileStem + "_fine", traj); - this->makeFilenames(evecCoarseFilename, evalCoarseFilename, - fileStem + "_coarse", traj); XmlWriter xmlFineWriter(evalFineFilename); - XmlWriter xmlCoarseWriter(evalCoarseFilename); LOG(Message) << "Writing " << this->evec.size() << " fine eigenvectors to '" << evecFineFilename << "'" << std::endl; this->basicWrite(evecFineFilename, this->evec, this->evec.size()); - LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" - << evecCoarseFilename << "'" << std::endl; - this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); LOG(Message) << "Writing " << this->eval.size() << " fine eigenvalues to '" << evalFineFilename << "'" << std::endl; Grid::write(xmlFineWriter, "evals", this->eval); + } + + void writeCoarse(const std::string fileStem, const int traj = -1) + { + std::string evecCoarseFilename, evalCoarseFilename; + + this->makeFilenames(evecCoarseFilename, evalCoarseFilename, + fileStem + "_coarse", traj); + XmlWriter xmlCoarseWriter(evalCoarseFilename); + LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" + << evecCoarseFilename << "'" << std::endl; + this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); LOG(Message) << "Writing " << evalCoarse.size() << " coarse eigenvalues to '" << evalCoarseFilename << "'" << std::endl; Grid::write(xmlCoarseWriter, "evals", evalCoarse); } + + virtual void write(const std::string fileStem, const int traj = -1) + { + writeFine(fileStem, traj); + writeCoarse(fileStem, traj); + } }; template diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp index 77c3a7ee..b88844f4 100644 --- a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp @@ -56,6 +56,9 @@ class TLoadCoarseEigenPack: public Module { public: typedef CoarseEigenPack BasePack; + template + using iImplScalar = iScalar>>; + typedef iImplScalar SiteComplex; public: // constructor TLoadCoarseEigenPack(const std::string name); @@ -114,9 +117,15 @@ void TLoadCoarseEigenPack::setup(void) template void TLoadCoarseEigenPack::execute(void) { - auto &epack = envGetDerived(BasePack, Pack, getName()); + auto cg = env().getCoarseGrid(par().blockSize, par().Ls); + auto &epack = envGetDerived(BasePack, Pack, getName()); + Lattice dummy(cg); epack.read(par().filestem, vm().getTrajectory()); + LOG(Message) << "Block Gramm-Schmidt pass 1"<< std::endl; + blockOrthogonalise(dummy, epack.evec); + LOG(Message) << "Block Gramm-Schmidt pass 2"<< std::endl; + blockOrthogonalise(dummy, epack.evec); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 80717f32..60b897c8 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -125,19 +125,18 @@ void TLocalCoherenceLanczos::setup(void) env().createCoarseGrid(blockSize, Ls); - auto cg = env().getCoarseGrid(blockSize, Ls); - auto cgrb = env().getRbCoarseGrid(blockSize, Ls); - int cNm = (par().doCoarse) ? par().coarseParams.Nm : 0; + auto cg = env().getCoarseGrid(blockSize, Ls); + int cNm = (par().doCoarse) ? par().coarseParams.Nm : 0; LOG(Message) << "Coarse grid: " << cg->GlobalDimensions() << std::endl; envCreateDerived(BasePack, CoarsePack, getName(), Ls, - par().fineParams.Nm, cNm, env().getRbGrid(Ls), cgrb); + par().fineParams.Nm, cNm, env().getRbGrid(Ls), cg); auto &epack = envGetDerived(BasePack, CoarsePack, getName()); envTmp(SchurFMat, "mat", Ls, envGet(FMat, par().action)); envGetTmp(SchurFMat, mat); - envTmp(LCL, "solver", Ls, env().getRbGrid(Ls), cgrb, mat, + envTmp(LCL, "solver", Ls, env().getRbGrid(Ls), cg, mat, Odd, epack.evec, epack.evecCoarse, epack.eval, epack.evalCoarse); } @@ -157,6 +156,10 @@ void TLocalCoherenceLanczos::execute(void) finePar.resid,finePar.MaxIt, finePar.betastp, finePar.MinRes); solver.testFine(finePar.resid*100.0); + if (!par().output.empty()) + { + epack.writeFine(par().output, vm().getTrajectory()); + } if (par().doCoarse) { LOG(Message) << "Orthogonalising" << std::endl; @@ -173,7 +176,7 @@ void TLocalCoherenceLanczos::execute(void) } if (!par().output.empty()) { - epack.write(par().output, vm().getTrajectory()); + epack.writeCoarse(par().output, vm().getTrajectory()); } } diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/lib/algorithms/iterative/LocalCoherenceLanczos.h index 0c7f4f65..66ded6eb 100644 --- a/lib/algorithms/iterative/LocalCoherenceLanczos.h +++ b/lib/algorithms/iterative/LocalCoherenceLanczos.h @@ -284,9 +284,11 @@ public: }; void Orthogonalise(void ) { - CoarseScalar InnerProd(_CoarseGrid); - blockOrthogonalise(InnerProd,subspace);std::cout << GridLogMessage <<" Gramm-Schmidt pass 1"< static RealD normalise(T& v) From 0260bc77055bcb1531cd2de091f0e6ba9c8a18e2 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 3 Apr 2018 18:55:46 +0100 Subject: [PATCH 235/620] Hadrons: eigen pack writing only for boss node --- extras/Hadrons/EigenPack.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 08811107..2bd3b622 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -115,7 +115,7 @@ protected: const unsigned int size) { emptyUserRecord record; - ScidacWriter binWriter; + ScidacWriter binWriter(evec[0]._grid->IsBoss()); binWriter.open(filename); for(int k = 0; k < size; ++k) From fb62035aa099e4b37fe388f437db099c92904f85 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 3 Apr 2018 19:49:11 +0100 Subject: [PATCH 236/620] Hadrons: do not create RB coarse grids --- extras/Hadrons/Environment.cc | 28 ---------------------------- extras/Hadrons/Environment.hpp | 4 ---- 2 files changed, 32 deletions(-) diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index 9c9618f7..35bb4648 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -106,14 +106,10 @@ void Environment::createCoarseGrid(const std::vector &blockSize, gridCoarse4d_[key4d].reset( SpaceTimeGrid::makeFourDimGrid(coarseDim, GridDefaultSimd(nd, vComplex::Nsimd()), GridDefaultMpi())); - gridCoarseRb4d_[key4d].reset( - SpaceTimeGrid::makeFourDimRedBlackGrid(gridCoarse4d_[key4d].get())); if (Ls > 1) { gridCoarse5d_[key5d].reset( SpaceTimeGrid::makeFiveDimGrid(cLs, gridCoarse4d_[key4d].get())); - gridCoarseRb5d_[key5d].reset( - SpaceTimeGrid::makeFiveDimRedBlackGrid(cLs, gridCoarse4d_[key4d].get())); } } @@ -179,30 +175,6 @@ GridCartesian * Environment::getCoarseGrid( } } -GridRedBlackCartesian * Environment::getRbCoarseGrid( - const std::vector &blockSize, const unsigned int Ls) const -{ - auto key = blockSize; - - try - { - if (Ls == 1) - { - key.resize(getNd()); - return gridCoarseRb4d_.at(key).get(); - } - else - { - key.push_back(Ls); - return gridCoarseRb5d_.at(key).get(); - } - } - catch(std::out_of_range &) - { - HADRON_ERROR(Definition, "no coarse red-black grid with Ls= " + std::to_string(Ls)); - } -} - unsigned int Environment::getNd(void) const { return nd_; diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index 0fb81250..f624f36e 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -92,8 +92,6 @@ public: GridRedBlackCartesian * getRbGrid(const unsigned int Ls = 1) const; GridCartesian * getCoarseGrid(const std::vector &blockSize, const unsigned int Ls = 1) const; - GridRedBlackCartesian * getRbCoarseGrid(const std::vector &blockSize, - const unsigned int Ls = 1) const; std::vector getDim(void) const; int getDim(const unsigned int mu) const; unsigned long int getLocalVolume(void) const; @@ -166,9 +164,7 @@ private: GridRbPt gridRb4d_; std::map gridRb5d_; std::map, GridPt> gridCoarse4d_; - std::map, GridRbPt> gridCoarseRb4d_; std::map, GridPt> gridCoarse5d_; - std::map, GridRbPt> gridCoarseRb5d_; unsigned int nd_; // random number generator RngPt rng4d_; From d3f857b1c9391fe2abc2b2153dc9e0ac7d1d3ff2 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 4 Apr 2018 16:36:37 +0100 Subject: [PATCH 237/620] Hadrons: proper metadata for eigenpacks --- extras/Hadrons/EigenPack.hpp | 70 +++++++++++++------ extras/Hadrons/Module.hpp | 21 +++++- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 10 +-- lib/parallelIO/IldgIO.h | 2 +- lib/serialisation/MacroMagic.h | 2 +- lib/serialisation/XmlIO.cc | 14 +++- lib/serialisation/XmlIO.h | 4 +- 7 files changed, 89 insertions(+), 34 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 2bd3b622..df180e9b 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -44,9 +44,23 @@ class EigenPack { public: typedef F Field; + struct PackRecord: Serializable + { + GRID_SERIALIZABLE_CLASS_MEMBERS(PackRecord, + std::string, operatorPar, + std::string, solverPar); + }; + struct VecRecord: Serializable + { + GRID_SERIALIZABLE_CLASS_MEMBERS(VecRecord, + unsigned int, index, + double, eval); + VecRecord(void): index(0), eval(0.) {} + }; public: std::vector eval; std::vector evec; + PackRecord record; public: EigenPack(void) = default; virtual ~EigenPack(void) = default; @@ -68,10 +82,10 @@ public: makeFilenames(evecFilename, evalFilename, fileStem, traj); XmlReader xmlReader(evalFilename); - basicRead(evec, evecFilename, evec.size()); LOG(Message) << "Reading " << eval.size() << " eigenvalues from '" << evalFilename << "'" << std::endl; Grid::read(xmlReader, "evals", eval); + basicRead(evec, evecFilename, evec.size()); } virtual void write(const std::string fileStem, const int traj = -1) @@ -80,10 +94,10 @@ public: makeFilenames(evecFilename, evalFilename, fileStem, traj); XmlWriter xmlWriter(evalFilename); - basicWrite(evecFilename, evec, evec.size()); LOG(Message) << "Writing " << eval.size() << " eigenvalues to '" << evalFilename << "'" << std::endl; Grid::write(xmlWriter, "evals", eval); + basicWrite(evecFilename, evec, evec.size()); } protected: void makeFilenames(std::string &evecFilename, std::string &evalFilename, @@ -96,31 +110,43 @@ protected: } template - static void basicRead(std::vector &evec, const std::string filename, - const unsigned int size) + void basicRead(std::vector &evec, const std::string filename, + const unsigned int size) { - emptyUserRecord record; ScidacReader binReader; binReader.open(filename); + binReader.readScidacFileRecord(evec[0]._grid, record); for(int k = 0; k < size; ++k) { - binReader.readScidacFieldRecord(evec[k], record); + VecRecord vecRecord; + + binReader.readScidacFieldRecord(evec[k], vecRecord); + if (vecRecord.index != k) + { + HADRON_ERROR(Io, "Eigenvector " + std::to_string(k) + " has a" + + " wrong index (expected " + std::to_string(vecRecord.index) + + ") in file '" + filename + "'"); + } } binReader.close(); } template - static void basicWrite(const std::string filename, std::vector &evec, - const unsigned int size) + void basicWrite(const std::string filename, std::vector &evec, + const unsigned int size) { - emptyUserRecord record; ScidacWriter binWriter(evec[0]._grid->IsBoss()); binWriter.open(filename); + binWriter.writeScidacFileRecord(evec[0]._grid, record); for(int k = 0; k < size; ++k) { - binWriter.writeScidacFieldRecord(evec[k], record); + VecRecord vecRecord; + + vecRecord.index = k; + vecRecord.eval = eval[k]; + binWriter.writeScidacFieldRecord(evec[k], vecRecord); } binWriter.close(); } @@ -160,12 +186,12 @@ public: this->makeFilenames(evecFineFilename, evalFineFilename, fileStem + "_fine", traj); XmlReader xmlFineReader(evalFineFilename); - LOG(Message) << "Reading " << this->evec.size() << " fine eigenvectors from '" - << evecFineFilename << "'" << std::endl; - this->basicRead(this->evec, evecFineFilename, this->evec.size()); LOG(Message) << "Reading " << this->eval.size() << " fine eigenvalues from '" << evalFineFilename << "'" << std::endl; Grid::read(xmlFineReader, "evals", this->eval); + LOG(Message) << "Reading " << this->evec.size() << " fine eigenvectors from '" + << evecFineFilename << "'" << std::endl; + this->basicRead(this->evec, evecFineFilename, this->evec.size()); } void readCoarse(const std::string fileStem, const int traj = -1) @@ -175,12 +201,12 @@ public: this->makeFilenames(evecCoarseFilename, evalCoarseFilename, fileStem + "_coarse", traj); XmlReader xmlCoarseReader(evalCoarseFilename); - LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" - << evecCoarseFilename << "'" << std::endl; - this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); LOG(Message) << "Reading " << evalCoarse.size() << " coarse eigenvalues from '" << evalCoarseFilename << "'" << std::endl; Grid::read(xmlCoarseReader, "evals", evalCoarse); + LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" + << evecCoarseFilename << "'" << std::endl; + this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); } virtual void read(const std::string fileStem, const int traj = -1) @@ -196,12 +222,12 @@ public: this->makeFilenames(evecFineFilename, evalFineFilename, fileStem + "_fine", traj); XmlWriter xmlFineWriter(evalFineFilename); - LOG(Message) << "Writing " << this->evec.size() << " fine eigenvectors to '" - << evecFineFilename << "'" << std::endl; - this->basicWrite(evecFineFilename, this->evec, this->evec.size()); LOG(Message) << "Writing " << this->eval.size() << " fine eigenvalues to '" << evalFineFilename << "'" << std::endl; Grid::write(xmlFineWriter, "evals", this->eval); + LOG(Message) << "Writing " << this->evec.size() << " fine eigenvectors to '" + << evecFineFilename << "'" << std::endl; + this->basicWrite(evecFineFilename, this->evec, this->evec.size()); } void writeCoarse(const std::string fileStem, const int traj = -1) @@ -211,12 +237,12 @@ public: this->makeFilenames(evecCoarseFilename, evalCoarseFilename, fileStem + "_coarse", traj); XmlWriter xmlCoarseWriter(evalCoarseFilename); - LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" - << evecCoarseFilename << "'" << std::endl; - this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); LOG(Message) << "Writing " << evalCoarse.size() << " coarse eigenvalues to '" << evalCoarseFilename << "'" << std::endl; Grid::write(xmlCoarseWriter, "evals", evalCoarse); + LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" + << evecCoarseFilename << "'" << std::endl; + this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); } virtual void write(const std::string fileStem, const int traj = -1) diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 85c27472..df13b8cb 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -172,6 +172,8 @@ public: // parse parameters virtual void parseParameters(XmlReader &reader, const std::string name) = 0; virtual void saveParameters(XmlWriter &writer, const std::string name) = 0; + // parameter string + virtual std::string parString(void) const = 0; // setup virtual void setup(void) {}; virtual void execute(void) = 0; @@ -200,9 +202,11 @@ public: // parse parameters virtual void parseParameters(XmlReader &reader, const std::string name); virtual void saveParameters(XmlWriter &writer, const std::string name); + // parameter string + virtual std::string parString(void) const; // parameter access - const P & par(void) const; - void setPar(const P &par); + const P & par(void) const; + void setPar(const P &par); private: P par_; }; @@ -225,6 +229,8 @@ public: push(writer, "options"); pop(writer); }; + // parameter string (empty) + virtual std::string parString(void) const {return "";}; }; /****************************************************************************** @@ -247,6 +253,17 @@ void Module

::saveParameters(XmlWriter &writer, const std::string name) write(writer, name, par_); } +template +std::string Module

::parString(void) const +{ + std::string xmlstring; + XmlWriter writer("",""); + + write(writer, par_.SerialisableClassName(), par_); + + return writer.string(); +} + template const P & Module

::par(void) const { diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 60b897c8..f4333f80 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -148,6 +148,8 @@ void TLocalCoherenceLanczos::execute(void) auto &coarsePar = par().coarseParams; auto &epack = envGetDerived(BasePack, CoarsePack, getName()); + epack.record.operatorPar = vm().getModule(par().action)->parString(); + epack.record.solverPar = parString(); envGetTmp(LCL, solver); LOG(Message) << "Performing fine grid IRL -- Nstop= " << finePar.Nstop << ", Nk= " << finePar.Nk << ", Nm= " @@ -173,10 +175,10 @@ void TLocalCoherenceLanczos::execute(void) coarsePar.MinRes); solver.testCoarse(coarsePar.resid*100.0, par().smoother, par().coarseRelaxTol); - } - if (!par().output.empty()) - { - epack.writeCoarse(par().output, vm().getTrajectory()); + if (!par().output.empty()) + { + epack.writeCoarse(par().output, vm().getTrajectory()); + } } } diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index d1a684f3..9a5271d1 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -328,7 +328,7 @@ class GridLimeWriter : public BinaryIO { XmlWriter WR("",""); write(WR,object_name,object); - xmlstring = WR.XmlString(); + xmlstring = WR.docString(); } // std::cout << "WriteLimeObject" << record_name <\ static inline void write(Writer &WR,const std::string &s, const cname &obj){ \ diff --git a/lib/serialisation/XmlIO.cc b/lib/serialisation/XmlIO.cc index 1828d7fc..b0d463c5 100644 --- a/lib/serialisation/XmlIO.cc +++ b/lib/serialisation/XmlIO.cc @@ -44,7 +44,7 @@ XmlWriter::XmlWriter(const std::string &fileName, std::string toplev) : fileName XmlWriter::~XmlWriter(void) { if ( fileName_ != std::string("") ) { - doc_.save_file(fileName_.c_str(), " "); + doc_.save_file(fileName_.c_str(), indent_.c_str()); } } @@ -57,10 +57,18 @@ void XmlWriter::pop(void) { node_ = node_.parent(); } -std::string XmlWriter::XmlString(void) + +std::string XmlWriter::docString(void) { std::ostringstream oss; - doc_.save(oss); + doc_.save(oss, indent_.c_str()); + return oss.str(); +} + +std::string XmlWriter::string(void) +{ + std::ostringstream oss; + doc_.save(oss, indent_.c_str(), pugi::format_default | pugi::format_no_declaration); return oss.str(); } diff --git a/lib/serialisation/XmlIO.h b/lib/serialisation/XmlIO.h index e37eb8d9..c12ef6e5 100644 --- a/lib/serialisation/XmlIO.h +++ b/lib/serialisation/XmlIO.h @@ -55,8 +55,10 @@ namespace Grid void writeDefault(const std::string &s, const U &x); template void writeDefault(const std::string &s, const std::vector &x); - std::string XmlString(void); + std::string docString(void); + std::string string(void); private: + const std::string indent_{" "}; pugi::xml_document doc_; pugi::xml_node node_; std::string fileName_; From ccfc0a5a890119c9b8a7e6f772c530810e15eb88 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 4 Apr 2018 17:19:22 +0100 Subject: [PATCH 238/620] Hadrons: better string representation of module parameters --- extras/Hadrons/Module.hpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index df13b8cb..08cf49a2 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -256,12 +256,11 @@ void Module

::saveParameters(XmlWriter &writer, const std::string name) template std::string Module

::parString(void) const { - std::string xmlstring; - XmlWriter writer("",""); + std::ostringstream s; - write(writer, par_.SerialisableClassName(), par_); + s << par(); - return writer.string(); + return s.str(); } template From 85c253ed4ac020ee38d3e103778ec114790138e4 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 4 Apr 2018 17:19:34 +0100 Subject: [PATCH 239/620] Test_serialisation MPI fix --- tests/IO/Test_serialisation.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/IO/Test_serialisation.cc b/tests/IO/Test_serialisation.cc index bca4d01c..15602e93 100644 --- a/tests/IO/Test_serialisation.cc +++ b/tests/IO/Test_serialisation.cc @@ -120,6 +120,8 @@ void tensorConvTestFn(GridSerialRNG &rng, const std::string label) int main(int argc,char **argv) { + Grid_init(&argc,&argv); + GridSerialRNG rng; rng.SeedFixedIntegers(std::vector({42,10,81,9})); From 9ce00f26f9c76d70b33d7f5090bd984270e15589 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 4 Apr 2018 17:44:56 +0100 Subject: [PATCH 240/620] not special characters in std::vector operator<< --- lib/serialisation/VectorUtils.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/serialisation/VectorUtils.h b/lib/serialisation/VectorUtils.h index 6df9416d..63aeeb2f 100644 --- a/lib/serialisation/VectorUtils.h +++ b/lib/serialisation/VectorUtils.h @@ -367,13 +367,13 @@ namespace Grid { inline std::ostream & operator<<(std::ostream &os, const std::vector &v) { os << "["; - for (auto &x: v) + for (unsigned int i = 0; i < v.size(); ++i) { - os << x << " "; - } - if (v.size() > 0) - { - os << "\b"; + os << v[i]; + if (i < v.size() - 1) + { + os << " "; + } } os << "]"; From 7dcf5c90e3358589c87f73206f989a3e6b287e34 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 13:16:28 +0100 Subject: [PATCH 241/620] Hadrons: eigenpack must be referred by solver when used --- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 8d1b0fc6..a47bb67e 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -107,6 +107,11 @@ std::vector TRBPrecCG::getReference(void) { std::vector ref = {par().action}; + if (!par().eigenPack.empty()) + { + ref.push_back(par().eigenPack); + } + return ref; } From 81050535a567353aeada7fd2f9e683aee5d5248b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 13:48:58 +0100 Subject: [PATCH 242/620] Hadrons: truncate eigenvalues when loading partial eigenpack --- extras/Hadrons/Modules/MIO/LoadEigenPack.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp index bcc3f22b..5d62b53d 100644 --- a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp @@ -112,6 +112,7 @@ void TLoadEigenPack::execute(void) auto &epack = envGetDerived(BasePack, Pack, getName()); epack.read(par().filestem, vm().getTrajectory()); + epack.eval.resize(par().size); } END_MODULE_NAMESPACE From 6b8ffbe73518e4aca665d217bff2e151f50d8e19 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 15:41:31 +0100 Subject: [PATCH 243/620] Hadrons: genetic minimum value type fix --- extras/Hadrons/GeneticScheduler.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/GeneticScheduler.hpp b/extras/Hadrons/GeneticScheduler.hpp index d6f9bdee..e8fcd2c2 100644 --- a/extras/Hadrons/GeneticScheduler.hpp +++ b/extras/Hadrons/GeneticScheduler.hpp @@ -57,7 +57,7 @@ public: virtual ~GeneticScheduler(void) = default; // access const Gene & getMinSchedule(void); - int getMinValue(void); + V getMinValue(void); // breed a new generation void nextGeneration(void); // heuristic benchmarks @@ -116,7 +116,7 @@ GeneticScheduler::getMinSchedule(void) } template -int GeneticScheduler::getMinValue(void) +V GeneticScheduler::getMinValue(void) { return population_.begin()->first; } From eddf023b8a9446fccfbf9bf0648defe35d6969b3 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 16:17:22 +0100 Subject: [PATCH 244/620] pugixml 1.9 update --- lib/pugixml/README.md | 44 - lib/pugixml/pugiconfig.hpp | 11 +- lib/pugixml/pugixml.cc | 3189 ++++++++++++++++++++---------------- lib/pugixml/pugixml.h | 201 ++- lib/pugixml/readme.txt | 6 +- lib/serialisation/XmlIO.cc | 65 +- lib/serialisation/XmlIO.h | 9 +- 7 files changed, 1935 insertions(+), 1590 deletions(-) delete mode 100644 lib/pugixml/README.md diff --git a/lib/pugixml/README.md b/lib/pugixml/README.md deleted file mode 100644 index 9d8a935f..00000000 --- a/lib/pugixml/README.md +++ /dev/null @@ -1,44 +0,0 @@ -pugixml [![Build Status](https://travis-ci.org/zeux/pugixml.svg?branch=master)](https://travis-ci.org/zeux/pugixml) [![Build status](https://ci.appveyor.com/api/projects/status/9hdks1doqvq8pwe7/branch/master?svg=true)](https://ci.appveyor.com/project/zeux/pugixml) -======= - -pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification -capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 -implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface -variants and conversions between different Unicode encodings (which happen automatically during parsing/saving). - -pugixml is used by a lot of projects, both open-source and proprietary, for performance and easy-to-use interface. - -## Documentation - -Documentation for the current release of pugixml is available on-line as two separate documents: - -* [Quick-start guide](http://pugixml.org/docs/quickstart.html), that aims to provide enough information to start using the library; -* [Complete reference manual](http://pugixml.org/docs/manual.html), that describes all features of the library in detail. - -You’re advised to start with the quick-start guide; however, many important library features are either not described in it at all or only mentioned briefly; if you require more information you should read the complete manual. - -## License -This library is available to anybody free of charge, under the terms of MIT License: - -Copyright (c) 2006-2015 Arseny Kapoulkine - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/lib/pugixml/pugiconfig.hpp b/lib/pugixml/pugiconfig.hpp index 5ee5131f..f739e062 100644 --- a/lib/pugixml/pugiconfig.hpp +++ b/lib/pugixml/pugiconfig.hpp @@ -1,7 +1,7 @@ /** - * pugixml parser - version 1.6 + * pugixml parser - version 1.9 * -------------------------------------------------------- - * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Copyright (C) 2006-2018, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) * Report bugs and download new versions at http://pugixml.org/ * * This library is distributed under the MIT License. See notice at the end @@ -17,6 +17,9 @@ // Uncomment this to enable wchar_t mode // #define PUGIXML_WCHAR_MODE +// Uncomment this to enable compact mode +// #define PUGIXML_COMPACT + // Uncomment this to disable XPath // #define PUGIXML_NO_XPATH @@ -46,7 +49,7 @@ #endif /** - * Copyright (c) 2006-2015 Arseny Kapoulkine + * Copyright (c) 2006-2018 Arseny Kapoulkine * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -59,7 +62,7 @@ * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/lib/pugixml/pugixml.cc b/lib/pugixml/pugixml.cc index a4f8fde2..dd08092c 100644 --- a/lib/pugixml/pugixml.cc +++ b/lib/pugixml/pugixml.cc @@ -1,7 +1,7 @@ /** - * pugixml parser - version 1.6 + * pugixml parser - version 1.9 * -------------------------------------------------------- - * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Copyright (C) 2006-2018, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) * Report bugs and download new versions at http://pugixml.org/ * * This library is distributed under the MIT License. See notice at the end @@ -20,6 +20,7 @@ #include #include #include +#include #ifdef PUGIXML_WCHAR_MODE # include @@ -28,9 +29,6 @@ #ifndef PUGIXML_NO_XPATH # include # include -# ifdef PUGIXML_NO_EXCEPTIONS -# include -# endif #endif #ifndef PUGIXML_NO_STL @@ -46,14 +44,17 @@ # pragma warning(push) # pragma warning(disable: 4127) // conditional expression is constant # pragma warning(disable: 4324) // structure was padded due to __declspec(align()) -# pragma warning(disable: 4611) // interaction between '_setjmp' and C++ object destruction is non-portable # pragma warning(disable: 4702) // unreachable code # pragma warning(disable: 4996) // this function or variable may be unsafe -# pragma warning(disable: 4793) // function compiled as native: presence of '_setjmp' makes a function unmanaged +#endif + +#if defined(_MSC_VER) && defined(__c2__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated" // this function or variable may be unsafe #endif #ifdef __INTEL_COMPILER -# pragma warning(disable: 177) // function was declared but never referenced +# pragma warning(disable: 177) // function was declared but never referenced # pragma warning(disable: 279) // controlling expression is constant # pragma warning(disable: 1478 1786) // function was declared "deprecated" # pragma warning(disable: 1684) // conversion from pointer to same-sized integral type @@ -75,17 +76,21 @@ # pragma diag_suppress=237 // controlling expression is constant #endif +#ifdef __TI_COMPILER_VERSION__ +# pragma diag_suppress 179 // function was declared but never referenced +#endif + // Inlining controls #if defined(_MSC_VER) && _MSC_VER >= 1300 # define PUGI__NO_INLINE __declspec(noinline) #elif defined(__GNUC__) # define PUGI__NO_INLINE __attribute__((noinline)) #else -# define PUGI__NO_INLINE +# define PUGI__NO_INLINE #endif // Branch weight controls -#if defined(__GNUC__) +#if defined(__GNUC__) && !defined(__c2__) # define PUGI__UNLIKELY(cond) __builtin_expect(cond, 0) #else # define PUGI__UNLIKELY(cond) (cond) @@ -101,10 +106,29 @@ # define PUGI__DMC_VOLATILE #endif +// Integer sanitizer workaround; we only apply this for clang since gcc8 has no_sanitize but not unsigned-integer-overflow and produces "attribute directive ignored" warnings +#if defined(__clang__) && defined(__has_attribute) +# if __has_attribute(no_sanitize) +# define PUGI__UNSIGNED_OVERFLOW __attribute__((no_sanitize("unsigned-integer-overflow"))) +# else +# define PUGI__UNSIGNED_OVERFLOW +# endif +#else +# define PUGI__UNSIGNED_OVERFLOW +#endif + // Borland C++ bug workaround for not defining ::memcpy depending on header include order (can't always use std::memcpy because some compilers don't have it at all) #if defined(__BORLANDC__) && !defined(__MEM_H_USING_LIST) using std::memcpy; using std::memmove; +using std::memset; +#endif + +// Some MinGW/GCC versions have headers that erroneously omit LLONG_MIN/LLONG_MAX/ULLONG_MAX definitions from limits.h in some configurations +#if defined(PUGIXML_HAS_LONG_LONG) && defined(__GNUC__) && !defined(LLONG_MAX) && !defined(LLONG_MIN) && !defined(ULLONG_MAX) +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define LLONG_MAX __LONG_LONG_MAX__ +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) #endif // In some environments MSVC is a compiler but the CRT lacks certain MSVC-specific features @@ -112,6 +136,16 @@ using std::memmove; # define PUGI__MSVC_CRT_VERSION _MSC_VER #endif +// Not all platforms have snprintf; we define a wrapper that uses snprintf if possible. This only works with buffers with a known size. +#if __cplusplus >= 201103 +# define PUGI__SNPRINTF(buf, ...) snprintf(buf, sizeof(buf), __VA_ARGS__) +#elif defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 +# define PUGI__SNPRINTF(buf, ...) _snprintf_s(buf, _countof(buf), _TRUNCATE, __VA_ARGS__) +#else +# define PUGI__SNPRINTF sprintf +#endif + +// We put implementation details into an anonymous namespace in source mode, but have to keep it in non-anonymous namespace in header-only mode to prevent binary bloat. #ifdef PUGIXML_HEADER_ONLY # define PUGI__NS_BEGIN namespace pugi { namespace impl { # define PUGI__NS_END } } @@ -130,9 +164,7 @@ using std::memmove; #endif // uintptr_t -#if !defined(_MSC_VER) || _MSC_VER >= 1600 -# include -#else +#if (defined(_MSC_VER) && _MSC_VER < 1600) || (defined(__BORLANDC__) && __BORLANDC__ < 0x561) namespace pugi { # ifndef _UINTPTR_T_DEFINED @@ -143,6 +175,8 @@ namespace pugi typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; } +#else +# include #endif // Memory allocation @@ -204,7 +238,7 @@ PUGI__NS_BEGIN for (size_t i = 0; i < count; ++i) if (lhs[i] != rhs[i]) return false; - + return lhs[count] == 0; } @@ -221,21 +255,14 @@ PUGI__NS_BEGIN return static_cast(end - s); #endif } - -#ifdef PUGIXML_WCHAR_MODE - // Convert string to wide string, assuming all symbols are ASCII - PUGI__FN void widen_ascii(wchar_t* dest, const char* source) - { - for (const char* i = source; *i; ++i) *dest++ = *i; - *dest = 0; - } -#endif PUGI__NS_END // auto_ptr-like object for exception recovery PUGI__NS_BEGIN - template struct auto_deleter + template struct auto_deleter { + typedef void (*D)(T*); + T* data; D deleter; @@ -277,67 +304,37 @@ PUGI__NS_BEGIN } } - void** find(const void* key) + void* find(const void* key) { - assert(key); - if (_capacity == 0) return 0; - size_t hashmod = _capacity - 1; - size_t bucket = hash(key) & hashmod; + item_t* item = get_item(key); + assert(item); + assert(item->key == key || (item->key == 0 && item->value == 0)); - for (size_t probe = 0; probe <= hashmod; ++probe) - { - item_t& probe_item = _items[bucket]; - - if (probe_item.key == key) - return &probe_item.value; - - if (probe_item.key == 0) - return 0; - - // hash collision, quadratic probing - bucket = (bucket + probe + 1) & hashmod; - } - - assert(!"Hash table is full"); - return 0; + return item->value; } - void** insert(const void* key) + void insert(const void* key, void* value) { - assert(key); - assert(_count < _capacity * 3 / 4); + assert(_capacity != 0 && _count < _capacity - _capacity / 4); - size_t hashmod = _capacity - 1; - size_t bucket = hash(key) & hashmod; + item_t* item = get_item(key); + assert(item); - for (size_t probe = 0; probe <= hashmod; ++probe) + if (item->key == 0) { - item_t& probe_item = _items[bucket]; - - if (probe_item.key == 0) - { - probe_item.key = key; - _count++; - return &probe_item.value; - } - - if (probe_item.key == key) - return &probe_item.value; - - // hash collision, quadratic probing - bucket = (bucket + probe + 1) & hashmod; + _count++; + item->key = key; } - assert(!"Hash table is full"); - return 0; + item->value = value; } - bool reserve() + bool reserve(size_t extra = 16) { - if (_count + 16 >= _capacity - _capacity / 4) - return rehash(); + if (_count + extra >= _capacity - _capacity / 4) + return rehash(_count + extra); return true; } @@ -354,9 +351,32 @@ PUGI__NS_BEGIN size_t _count; - bool rehash(); + bool rehash(size_t count); - static unsigned int hash(const void* key) + item_t* get_item(const void* key) + { + assert(key); + assert(_capacity > 0); + + size_t hashmod = _capacity - 1; + size_t bucket = hash(key) & hashmod; + + for (size_t probe = 0; probe <= hashmod; ++probe) + { + item_t& probe_item = _items[bucket]; + + if (probe_item.key == key || probe_item.key == 0) + return &probe_item; + + // hash collision, quadratic probing + bucket = (bucket + probe + 1) & hashmod; + } + + assert(false && "Hash table is full"); // unreachable + return 0; + } + + static PUGI__UNSIGNED_OVERFLOW unsigned int hash(const void* key) { unsigned int h = static_cast(reinterpret_cast(key)); @@ -371,27 +391,33 @@ PUGI__NS_BEGIN } }; - PUGI__FN_NO_INLINE bool compact_hash_table::rehash() + PUGI__FN_NO_INLINE bool compact_hash_table::rehash(size_t count) { + size_t capacity = 32; + while (count >= capacity - capacity / 4) + capacity *= 2; + compact_hash_table rt; - rt._capacity = (_capacity == 0) ? 32 : _capacity * 2; - rt._items = static_cast(xml_memory::allocate(sizeof(item_t) * rt._capacity)); + rt._capacity = capacity; + rt._items = static_cast(xml_memory::allocate(sizeof(item_t) * capacity)); if (!rt._items) return false; - memset(rt._items, 0, sizeof(item_t) * rt._capacity); + memset(rt._items, 0, sizeof(item_t) * capacity); for (size_t i = 0; i < _capacity; ++i) if (_items[i].key) - *rt.insert(_items[i].key) = _items[i].value; + rt.insert(_items[i].key, _items[i].value); if (_items) xml_memory::deallocate(_items); - _capacity = rt._capacity; + _capacity = capacity; _items = rt._items; + assert(_count == rt._count); + return true; } @@ -399,43 +425,33 @@ PUGI__NS_END #endif PUGI__NS_BEGIN - static const size_t xml_memory_page_size = - #ifdef PUGIXML_MEMORY_PAGE_SIZE - PUGIXML_MEMORY_PAGE_SIZE - #else - 32768 - #endif - ; - #ifdef PUGIXML_COMPACT static const uintptr_t xml_memory_block_alignment = 4; - - static const uintptr_t xml_memory_page_alignment = sizeof(void*); #else static const uintptr_t xml_memory_block_alignment = sizeof(void*); - - static const uintptr_t xml_memory_page_alignment = 64; - static const uintptr_t xml_memory_page_pointer_mask = ~(xml_memory_page_alignment - 1); #endif // extra metadata bits - static const uintptr_t xml_memory_page_contents_shared_mask = 32; - static const uintptr_t xml_memory_page_name_allocated_mask = 16; - static const uintptr_t xml_memory_page_value_allocated_mask = 8; - static const uintptr_t xml_memory_page_type_mask = 7; + static const uintptr_t xml_memory_page_contents_shared_mask = 64; + static const uintptr_t xml_memory_page_name_allocated_mask = 32; + static const uintptr_t xml_memory_page_value_allocated_mask = 16; + static const uintptr_t xml_memory_page_type_mask = 15; // combined masks for string uniqueness static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask; static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask; #ifdef PUGIXML_COMPACT + #define PUGI__GETHEADER_IMPL(object, page, flags) // unused #define PUGI__GETPAGE_IMPL(header) (header).get_page() #else - #define PUGI__GETPAGE_IMPL(header) reinterpret_cast((header) & impl::xml_memory_page_pointer_mask) + #define PUGI__GETHEADER_IMPL(object, page, flags) (((reinterpret_cast(object) - reinterpret_cast(page)) << 8) | (flags)) + // this macro casts pointers through void* to avoid 'cast increases required alignment of target type' warnings + #define PUGI__GETPAGE_IMPL(header) static_cast(const_cast(static_cast(reinterpret_cast(&header) - (header >> 8)))) #endif #define PUGI__GETPAGE(n) PUGI__GETPAGE_IMPL((n)->header) - #define PUGI__NODETYPE(n) static_cast(((n)->header & impl::xml_memory_page_type_mask) + 1) + #define PUGI__NODETYPE(n) static_cast((n)->header & impl::xml_memory_page_type_mask) struct xml_allocator; @@ -475,6 +491,14 @@ PUGI__NS_BEGIN #endif }; + static const size_t xml_memory_page_size = + #ifdef PUGIXML_MEMORY_PAGE_SIZE + (PUGIXML_MEMORY_PAGE_SIZE) + #else + 32768 + #endif + - sizeof(xml_memory_page); + struct xml_memory_string_header { uint16_t page_offset; // offset from page->data @@ -495,30 +519,21 @@ PUGI__NS_BEGIN size_t size = sizeof(xml_memory_page) + data_size; // allocate block with some alignment, leaving memory for worst-case padding - void* memory = xml_memory::allocate(size + xml_memory_page_alignment); + void* memory = xml_memory::allocate(size); if (!memory) return 0; - // align to next page boundary (note: this guarantees at least 1 usable byte before the page) - char* page_memory = reinterpret_cast((reinterpret_cast(memory) + xml_memory_page_alignment) & ~(xml_memory_page_alignment - 1)); - // prepare page structure - xml_memory_page* page = xml_memory_page::construct(page_memory); + xml_memory_page* page = xml_memory_page::construct(memory); assert(page); page->allocator = _root->allocator; - // record the offset for freeing the memory block - assert(page_memory > memory && page_memory - static_cast(memory) <= 127); - page_memory[-1] = static_cast(page_memory - static_cast(memory)); - return page; } static void deallocate_page(xml_memory_page* page) { - char* page_memory = reinterpret_cast(page); - - xml_memory::deallocate(page_memory - page_memory[-1]); + xml_memory::deallocate(page); } void* allocate_memory_oob(size_t size, xml_memory_page*& out_page); @@ -627,7 +642,7 @@ PUGI__NS_BEGIN // allocate memory for string and header block size_t size = sizeof(xml_memory_string_header) + length * sizeof(char_t); - + // round size up to block alignment boundary size_t full_size = (size + (xml_memory_block_alignment - 1)) & ~(xml_memory_block_alignment - 1); @@ -749,12 +764,12 @@ PUGI__NS_BEGIN void operator&=(uintptr_t mod) { - _flags &= mod; + _flags &= static_cast(mod); } void operator|=(uintptr_t mod) { - _flags |= mod; + _flags |= static_cast(mod); } uintptr_t operator&(uintptr_t mod) const @@ -764,10 +779,11 @@ PUGI__NS_BEGIN xml_memory_page* get_page() const { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings const char* page_marker = reinterpret_cast(this) - (_page << compact_alignment_log2); - const char* page = page_marker - *reinterpret_cast(page_marker); + const char* page = page_marker - *reinterpret_cast(static_cast(page_marker)); - return const_cast(reinterpret_cast(page)); + return const_cast(reinterpret_cast(static_cast(page))); } private: @@ -784,12 +800,12 @@ PUGI__NS_BEGIN template PUGI__FN_NO_INLINE T* compact_get_value(const void* object) { - return static_cast(*compact_get_page(object, header_offset)->allocator->_hash->find(object)); + return static_cast(compact_get_page(object, header_offset)->allocator->_hash->find(object)); } template PUGI__FN_NO_INLINE void compact_set_value(const void* object, T* value) { - *compact_get_page(object, header_offset)->allocator->_hash->insert(object) = value; + compact_get_page(object, header_offset)->allocator->_hash->insert(object, value); } template class compact_pointer @@ -836,7 +852,7 @@ PUGI__NS_BEGIN { uintptr_t base = reinterpret_cast(this) & ~(compact_alignment - 1); - return reinterpret_cast(base + ((_data - 1 + start) << compact_alignment_log2)); + return reinterpret_cast(base + (_data - 1 + start) * compact_alignment); } else return compact_get_value(this); @@ -847,7 +863,7 @@ PUGI__NS_BEGIN T* operator->() const { - return operator T*(); + return *this; } private: @@ -914,7 +930,7 @@ PUGI__NS_BEGIN { uintptr_t base = reinterpret_cast(this) & ~(compact_alignment - 1); - return reinterpret_cast(base + ((_data - 1 - 65533) << compact_alignment_log2)); + return reinterpret_cast(base + (_data - 1 - 65533) * compact_alignment); } else if (_data == 65534) return static_cast(compact_get_page(this, header_offset)->compact_shared_parent); @@ -927,7 +943,7 @@ PUGI__NS_BEGIN T* operator->() const { - return operator T*(); + return *this; } private: @@ -959,7 +975,8 @@ PUGI__NS_BEGIN if (static_cast(offset) < (65535 << 7)) { - uint16_t* base = reinterpret_cast(reinterpret_cast(this) - base_offset); + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + uint16_t* base = reinterpret_cast(static_cast(reinterpret_cast(this) - base_offset)); if (*base == 0) { @@ -1003,7 +1020,8 @@ PUGI__NS_BEGIN { xml_memory_page* page = compact_get_page(this, header_offset); - const uint16_t* base = reinterpret_cast(reinterpret_cast(this) - base_offset); + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + const uint16_t* base = reinterpret_cast(static_cast(reinterpret_cast(this) - base_offset)); assert(*base); ptrdiff_t offset = ((*base - 1) << 7) + (_data - 1); @@ -1048,7 +1066,7 @@ namespace pugi struct xml_node_struct { - xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(page, type - 1), namevalue_base(0) + xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(page, type), namevalue_base(0) { PUGI__STATIC_ASSERT(sizeof(xml_node_struct) == 12); } @@ -1075,8 +1093,9 @@ namespace pugi { struct xml_attribute_struct { - xml_attribute_struct(impl::xml_memory_page* page): header(reinterpret_cast(page)), name(0), value(0), prev_attribute_c(0), next_attribute(0) + xml_attribute_struct(impl::xml_memory_page* page): name(0), value(0), prev_attribute_c(0), next_attribute(0) { + header = PUGI__GETHEADER_IMPL(this, page, 0); } uintptr_t header; @@ -1090,8 +1109,9 @@ namespace pugi struct xml_node_struct { - xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(reinterpret_cast(page) | (type - 1)), name(0), value(0), parent(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0) + xml_node_struct(impl::xml_memory_page* page, xml_node_type type): name(0), value(0), parent(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0) { + header = PUGI__GETHEADER_IMPL(this, page, type); } uintptr_t header; @@ -1122,9 +1142,6 @@ PUGI__NS_BEGIN { xml_document_struct(xml_memory_page* page): xml_node_struct(page, node_document), xml_allocator(page), buffer(0), extra_buffers(0) { - #ifdef PUGIXML_COMPACT - _hash = &hash; - #endif } const char_t* buffer; @@ -1599,28 +1616,11 @@ PUGI__NS_BEGIN } }; - template struct wchar_selector; - - template <> struct wchar_selector<2> + struct utf8_decoder { - typedef uint16_t type; - typedef utf16_counter counter; - typedef utf16_writer writer; - }; + typedef uint8_t type; - template <> struct wchar_selector<4> - { - typedef uint32_t type; - typedef utf32_counter counter; - typedef utf32_writer writer; - }; - - typedef wchar_selector::counter wchar_counter; - typedef wchar_selector::writer wchar_writer; - - template struct utf_decoder - { - static inline typename Traits::value_type decode_utf8_block(const uint8_t* data, size_t size, typename Traits::value_type result) + template static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits) { const uint8_t utf8_byte_mask = 0x3f; @@ -1681,29 +1681,34 @@ PUGI__NS_BEGIN return result; } + }; - static inline typename Traits::value_type decode_utf16_block(const uint16_t* data, size_t size, typename Traits::value_type result) + template struct utf16_decoder + { + typedef uint16_t type; + + template static inline typename Traits::value_type process(const uint16_t* data, size_t size, typename Traits::value_type result, Traits) { - const uint16_t* end = data + size; - - while (data < end) + while (size) { - unsigned int lead = opt_swap::value ? endian_swap(*data) : *data; + uint16_t lead = opt_swap::value ? endian_swap(*data) : *data; // U+0000..U+D7FF if (lead < 0xD800) { result = Traits::low(result, lead); data += 1; + size -= 1; } // U+E000..U+FFFF else if (static_cast(lead - 0xE000) < 0x2000) { result = Traits::low(result, lead); data += 1; + size -= 1; } // surrogate pair lead - else if (static_cast(lead - 0xD800) < 0x400 && data + 1 < end) + else if (static_cast(lead - 0xD800) < 0x400 && size >= 2) { uint16_t next = opt_swap::value ? endian_swap(data[1]) : data[1]; @@ -1711,26 +1716,32 @@ PUGI__NS_BEGIN { result = Traits::high(result, 0x10000 + ((lead & 0x3ff) << 10) + (next & 0x3ff)); data += 2; + size -= 2; } else { data += 1; + size -= 1; } } else { data += 1; + size -= 1; } } return result; } + }; - static inline typename Traits::value_type decode_utf32_block(const uint32_t* data, size_t size, typename Traits::value_type result) + template struct utf32_decoder + { + typedef uint32_t type; + + template static inline typename Traits::value_type process(const uint32_t* data, size_t size, typename Traits::value_type result, Traits) { - const uint32_t* end = data + size; - - while (data < end) + while (size) { uint32_t lead = opt_swap::value ? endian_swap(*data) : *data; @@ -1739,53 +1750,76 @@ PUGI__NS_BEGIN { result = Traits::low(result, lead); data += 1; + size -= 1; } // U+10000..U+10FFFF else { result = Traits::high(result, lead); data += 1; + size -= 1; } } return result; } + }; - static inline typename Traits::value_type decode_latin1_block(const uint8_t* data, size_t size, typename Traits::value_type result) + struct latin1_decoder + { + typedef uint8_t type; + + template static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits) { - for (size_t i = 0; i < size; ++i) + while (size) { - result = Traits::low(result, data[i]); + result = Traits::low(result, *data); + data += 1; + size -= 1; } return result; } - - static inline typename Traits::value_type decode_wchar_block_impl(const uint16_t* data, size_t size, typename Traits::value_type result) - { - return decode_utf16_block(data, size, result); - } - - static inline typename Traits::value_type decode_wchar_block_impl(const uint32_t* data, size_t size, typename Traits::value_type result) - { - return decode_utf32_block(data, size, result); - } - - static inline typename Traits::value_type decode_wchar_block(const wchar_t* data, size_t size, typename Traits::value_type result) - { - return decode_wchar_block_impl(reinterpret_cast::type*>(data), size, result); - } }; - template PUGI__FN void convert_utf_endian_swap(T* result, const T* data, size_t length) + template struct wchar_selector; + + template <> struct wchar_selector<2> { - for (size_t i = 0; i < length; ++i) result[i] = endian_swap(data[i]); - } + typedef uint16_t type; + typedef utf16_counter counter; + typedef utf16_writer writer; + typedef utf16_decoder decoder; + }; + + template <> struct wchar_selector<4> + { + typedef uint32_t type; + typedef utf32_counter counter; + typedef utf32_writer writer; + typedef utf32_decoder decoder; + }; + + typedef wchar_selector::counter wchar_counter; + typedef wchar_selector::writer wchar_writer; + + struct wchar_decoder + { + typedef wchar_t type; + + template static inline typename Traits::value_type process(const wchar_t* data, size_t size, typename Traits::value_type result, Traits traits) + { + typedef wchar_selector::decoder decoder; + + return decoder::process(reinterpret_cast(data), size, result, traits); + } + }; #ifdef PUGIXML_WCHAR_MODE PUGI__FN void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length) { - for (size_t i = 0; i < length; ++i) result[i] = static_cast(endian_swap(static_cast::type>(data[i]))); + for (size_t i = 0; i < length; ++i) + result[i] = static_cast(endian_swap(static_cast::type>(data[i]))); } #endif PUGI__NS_END @@ -1832,7 +1866,7 @@ PUGI__NS_BEGIN ctx_digit = 8, // 0-9 ctx_symbol = 16 // Any symbol > 127, a-z, A-Z, 0-9, _, -, . }; - + static const unsigned char chartypex_table[256] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 2, 3, 3, // 0-15 @@ -1854,7 +1888,7 @@ PUGI__NS_BEGIN 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 }; - + #ifdef PUGIXML_WCHAR_MODE #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast(c) < 128 ? table[static_cast(c)] : table[128]) & (ct)) #else @@ -1877,12 +1911,71 @@ PUGI__NS_BEGIN if (sizeof(wchar_t) == 2) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be; - else + else return is_little_endian() ? encoding_utf32_le : encoding_utf32_be; } - PUGI__FN xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) + PUGI__FN bool parse_declaration_encoding(const uint8_t* data, size_t size, const uint8_t*& out_encoding, size_t& out_length) { + #define PUGI__SCANCHAR(ch) { if (offset >= size || data[offset] != ch) return false; offset++; } + #define PUGI__SCANCHARTYPE(ct) { while (offset < size && PUGI__IS_CHARTYPE(data[offset], ct)) offset++; } + + // check if we have a non-empty XML declaration + if (size < 6 || !((data[0] == '<') & (data[1] == '?') & (data[2] == 'x') & (data[3] == 'm') & (data[4] == 'l') && PUGI__IS_CHARTYPE(data[5], ct_space))) + return false; + + // scan XML declaration until the encoding field + for (size_t i = 6; i + 1 < size; ++i) + { + // declaration can not contain ? in quoted values + if (data[i] == '?') + return false; + + if (data[i] == 'e' && data[i + 1] == 'n') + { + size_t offset = i; + + // encoding follows the version field which can't contain 'en' so this has to be the encoding if XML is well formed + PUGI__SCANCHAR('e'); PUGI__SCANCHAR('n'); PUGI__SCANCHAR('c'); PUGI__SCANCHAR('o'); + PUGI__SCANCHAR('d'); PUGI__SCANCHAR('i'); PUGI__SCANCHAR('n'); PUGI__SCANCHAR('g'); + + // S? = S? + PUGI__SCANCHARTYPE(ct_space); + PUGI__SCANCHAR('='); + PUGI__SCANCHARTYPE(ct_space); + + // the only two valid delimiters are ' and " + uint8_t delimiter = (offset < size && data[offset] == '"') ? '"' : '\''; + + PUGI__SCANCHAR(delimiter); + + size_t start = offset; + + out_encoding = data + offset; + + PUGI__SCANCHARTYPE(ct_symbol); + + out_length = offset - start; + + PUGI__SCANCHAR(delimiter); + + return true; + } + } + + return false; + + #undef PUGI__SCANCHAR + #undef PUGI__SCANCHARTYPE + } + + PUGI__FN xml_encoding guess_buffer_encoding(const uint8_t* data, size_t size) + { + // skip encoding autodetection if input buffer is too small + if (size < 4) return encoding_utf8; + + uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3]; + // look for BOM in first few bytes if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be; if (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le; @@ -1895,13 +1988,32 @@ PUGI__NS_BEGIN if (d0 == 0x3c && d1 == 0 && d2 == 0 && d3 == 0) return encoding_utf32_le; if (d0 == 0 && d1 == 0x3c && d2 == 0 && d3 == 0x3f) return encoding_utf16_be; if (d0 == 0x3c && d1 == 0 && d2 == 0x3f && d3 == 0) return encoding_utf16_le; - if (d0 == 0x3c && d1 == 0x3f && d2 == 0x78 && d3 == 0x6d) return encoding_utf8; // look for utf16 < followed by node name (this may fail, but is better than utf8 since it's zero terminated so early) if (d0 == 0 && d1 == 0x3c) return encoding_utf16_be; if (d0 == 0x3c && d1 == 0) return encoding_utf16_le; - // no known BOM detected, assume utf8 + // no known BOM detected; parse declaration + const uint8_t* enc = 0; + size_t enc_length = 0; + + if (d0 == 0x3c && d1 == 0x3f && d2 == 0x78 && d3 == 0x6d && parse_declaration_encoding(data, size, enc, enc_length)) + { + // iso-8859-1 (case-insensitive) + if (enc_length == 10 + && (enc[0] | ' ') == 'i' && (enc[1] | ' ') == 's' && (enc[2] | ' ') == 'o' + && enc[3] == '-' && enc[4] == '8' && enc[5] == '8' && enc[6] == '5' && enc[7] == '9' + && enc[8] == '-' && enc[9] == '1') + return encoding_latin1; + + // latin1 (case-insensitive) + if (enc_length == 6 + && (enc[0] | ' ') == 'l' && (enc[1] | ' ') == 'a' && (enc[2] | ' ') == 't' + && (enc[3] | ' ') == 'i' && (enc[4] | ' ') == 'n' + && enc[5] == '1') + return encoding_latin1; + } + return encoding_utf8; } @@ -1919,15 +2031,10 @@ PUGI__NS_BEGIN // only do autodetection if no explicit encoding is requested if (encoding != encoding_auto) return encoding; - // skip encoding autodetection if input buffer is too small - if (size < 4) return encoding_utf8; - // try to guess encoding (based on XML specification, Appendix F.1) const uint8_t* data = static_cast(contents); - PUGI__DMC_VOLATILE uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3]; - - return guess_buffer_encoding(d0, d1, d2, d3); + return guess_buffer_encoding(data, size); } PUGI__FN bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) @@ -1994,38 +2101,13 @@ PUGI__NS_BEGIN return true; } - PUGI__FN bool convert_buffer_utf8(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size) + template PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D) { - const uint8_t* data = static_cast(contents); - size_t data_length = size; + const typename D::type* data = static_cast(contents); + size_t data_length = size / sizeof(typename D::type); // first pass: get length in wchar_t units - size_t length = utf_decoder::decode_utf8_block(data, data_length, 0); - - // allocate buffer of suitable length - char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); - if (!buffer) return false; - - // second pass: convert utf8 input to wchar_t - wchar_writer::value_type obegin = reinterpret_cast(buffer); - wchar_writer::value_type oend = utf_decoder::decode_utf8_block(data, data_length, obegin); - - assert(oend == obegin + length); - *oend = 0; - - out_buffer = buffer; - out_length = length + 1; - - return true; - } - - template PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) - { - const uint16_t* data = static_cast(contents); - size_t data_length = size / sizeof(uint16_t); - - // first pass: get length in wchar_t units - size_t length = utf_decoder::decode_utf16_block(data, data_length, 0); + size_t length = D::process(data, data_length, 0, wchar_counter()); // allocate buffer of suitable length char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); @@ -2033,57 +2115,7 @@ PUGI__NS_BEGIN // second pass: convert utf16 input to wchar_t wchar_writer::value_type obegin = reinterpret_cast(buffer); - wchar_writer::value_type oend = utf_decoder::decode_utf16_block(data, data_length, obegin); - - assert(oend == obegin + length); - *oend = 0; - - out_buffer = buffer; - out_length = length + 1; - - return true; - } - - template PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) - { - const uint32_t* data = static_cast(contents); - size_t data_length = size / sizeof(uint32_t); - - // first pass: get length in wchar_t units - size_t length = utf_decoder::decode_utf32_block(data, data_length, 0); - - // allocate buffer of suitable length - char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); - if (!buffer) return false; - - // second pass: convert utf32 input to wchar_t - wchar_writer::value_type obegin = reinterpret_cast(buffer); - wchar_writer::value_type oend = utf_decoder::decode_utf32_block(data, data_length, obegin); - - assert(oend == obegin + length); - *oend = 0; - - out_buffer = buffer; - out_length = length + 1; - - return true; - } - - PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size) - { - const uint8_t* data = static_cast(contents); - size_t data_length = size; - - // get length in wchar_t units - size_t length = data_length; - - // allocate buffer of suitable length - char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); - if (!buffer) return false; - - // convert latin1 input to wchar_t - wchar_writer::value_type obegin = reinterpret_cast(buffer); - wchar_writer::value_type oend = utf_decoder::decode_latin1_block(data, data_length, obegin); + wchar_writer::value_type oend = D::process(data, data_length, obegin, wchar_writer()); assert(oend == obegin + length); *oend = 0; @@ -2100,13 +2132,16 @@ PUGI__NS_BEGIN xml_encoding wchar_encoding = get_wchar_encoding(); // fast path: no conversion required - if (encoding == wchar_encoding) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + if (encoding == wchar_encoding) + return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); // only endian-swapping is required - if (need_endian_swap_utf(encoding, wchar_encoding)) return convert_buffer_endian_swap(out_buffer, out_length, contents, size, is_mutable); + if (need_endian_swap_utf(encoding, wchar_encoding)) + return convert_buffer_endian_swap(out_buffer, out_length, contents, size, is_mutable); // source encoding is utf8 - if (encoding == encoding_utf8) return convert_buffer_utf8(out_buffer, out_length, contents, size); + if (encoding == encoding_utf8) + return convert_buffer_generic(out_buffer, out_length, contents, size, utf8_decoder()); // source encoding is utf16 if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) @@ -2114,8 +2149,8 @@ PUGI__NS_BEGIN xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; return (native_encoding == encoding) ? - convert_buffer_utf16(out_buffer, out_length, contents, size, opt_false()) : - convert_buffer_utf16(out_buffer, out_length, contents, size, opt_true()); + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()); } // source encoding is utf32 @@ -2124,24 +2159,25 @@ PUGI__NS_BEGIN xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; return (native_encoding == encoding) ? - convert_buffer_utf32(out_buffer, out_length, contents, size, opt_false()) : - convert_buffer_utf32(out_buffer, out_length, contents, size, opt_true()); + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()); } // source encoding is latin1 - if (encoding == encoding_latin1) return convert_buffer_latin1(out_buffer, out_length, contents, size); + if (encoding == encoding_latin1) + return convert_buffer_generic(out_buffer, out_length, contents, size, latin1_decoder()); - assert(!"Invalid encoding"); + assert(false && "Invalid encoding"); // unreachable return false; } #else - template PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) + template PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D) { - const uint16_t* data = static_cast(contents); - size_t data_length = size / sizeof(uint16_t); + const typename D::type* data = static_cast(contents); + size_t data_length = size / sizeof(typename D::type); // first pass: get length in utf8 units - size_t length = utf_decoder::decode_utf16_block(data, data_length, 0); + size_t length = D::process(data, data_length, 0, utf8_counter()); // allocate buffer of suitable length char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); @@ -2149,32 +2185,7 @@ PUGI__NS_BEGIN // second pass: convert utf16 input to utf8 uint8_t* obegin = reinterpret_cast(buffer); - uint8_t* oend = utf_decoder::decode_utf16_block(data, data_length, obegin); - - assert(oend == obegin + length); - *oend = 0; - - out_buffer = buffer; - out_length = length + 1; - - return true; - } - - template PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) - { - const uint32_t* data = static_cast(contents); - size_t data_length = size / sizeof(uint32_t); - - // first pass: get length in utf8 units - size_t length = utf_decoder::decode_utf32_block(data, data_length, 0); - - // allocate buffer of suitable length - char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); - if (!buffer) return false; - - // second pass: convert utf32 input to utf8 - uint8_t* obegin = reinterpret_cast(buffer); - uint8_t* oend = utf_decoder::decode_utf32_block(data, data_length, obegin); + uint8_t* oend = D::process(data, data_length, obegin, utf8_writer()); assert(oend == obegin + length); *oend = 0; @@ -2210,7 +2221,7 @@ PUGI__NS_BEGIN if (postfix_length == 0) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); // first pass: get length in utf8 units - size_t length = prefix_length + utf_decoder::decode_latin1_block(postfix, postfix_length, 0); + size_t length = prefix_length + latin1_decoder::process(postfix, postfix_length, 0, utf8_counter()); // allocate buffer of suitable length char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); @@ -2220,7 +2231,7 @@ PUGI__NS_BEGIN memcpy(buffer, data, prefix_length); uint8_t* obegin = reinterpret_cast(buffer); - uint8_t* oend = utf_decoder::decode_latin1_block(postfix, postfix_length, obegin + prefix_length); + uint8_t* oend = latin1_decoder::process(postfix, postfix_length, obegin + prefix_length, utf8_writer()); assert(oend == obegin + length); *oend = 0; @@ -2234,7 +2245,8 @@ PUGI__NS_BEGIN PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable) { // fast path: no conversion required - if (encoding == encoding_utf8) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + if (encoding == encoding_utf8) + return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); // source encoding is utf16 if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) @@ -2242,8 +2254,8 @@ PUGI__NS_BEGIN xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; return (native_encoding == encoding) ? - convert_buffer_utf16(out_buffer, out_length, contents, size, opt_false()) : - convert_buffer_utf16(out_buffer, out_length, contents, size, opt_true()); + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()); } // source encoding is utf32 @@ -2252,14 +2264,15 @@ PUGI__NS_BEGIN xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; return (native_encoding == encoding) ? - convert_buffer_utf32(out_buffer, out_length, contents, size, opt_false()) : - convert_buffer_utf32(out_buffer, out_length, contents, size, opt_true()); + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()); } // source encoding is latin1 - if (encoding == encoding_latin1) return convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable); + if (encoding == encoding_latin1) + return convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable); - assert(!"Invalid encoding"); + assert(false && "Invalid encoding"); // unreachable return false; } #endif @@ -2267,20 +2280,20 @@ PUGI__NS_BEGIN PUGI__FN size_t as_utf8_begin(const wchar_t* str, size_t length) { // get length in utf8 characters - return utf_decoder::decode_wchar_block(str, length, 0); + return wchar_decoder::process(str, length, 0, utf8_counter()); } PUGI__FN void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length) { // convert to utf8 uint8_t* begin = reinterpret_cast(buffer); - uint8_t* end = utf_decoder::decode_wchar_block(str, length, begin); - + uint8_t* end = wchar_decoder::process(str, length, begin, utf8_writer()); + assert(begin + size == end); (void)!end; (void)!size; } - + #ifndef PUGIXML_NO_STL PUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length) { @@ -2302,7 +2315,7 @@ PUGI__NS_BEGIN const uint8_t* data = reinterpret_cast(str); // first pass: get length in wchar_t units - size_t length = utf_decoder::decode_utf8_block(data, size, 0); + size_t length = utf8_decoder::process(data, size, 0, wchar_counter()); // allocate resulting string std::basic_string result; @@ -2312,7 +2325,7 @@ PUGI__NS_BEGIN if (length > 0) { wchar_writer::value_type begin = reinterpret_cast(&result[0]); - wchar_writer::value_type end = utf_decoder::decode_utf8_block(data, size, begin); + wchar_writer::value_type end = utf8_decoder::process(data, size, begin, wchar_writer()); assert(begin + length == end); (void)!end; @@ -2340,17 +2353,15 @@ PUGI__NS_BEGIN } template - PUGI__FN bool strcpy_insitu(String& dest, Header& header, uintptr_t header_mask, const char_t* source) + PUGI__FN bool strcpy_insitu(String& dest, Header& header, uintptr_t header_mask, const char_t* source, size_t source_length) { - size_t source_length = strlength(source); - if (source_length == 0) { // empty string and null pointer are equivalent, so just deallocate old memory xml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator; if (header & header_mask) alloc->deallocate_string(dest); - + // mark the string as not allocated dest = 0; header &= ~header_mask; @@ -2360,8 +2371,9 @@ PUGI__NS_BEGIN else if (dest && strcpy_insitu_allow(source_length, header, header_mask, dest)) { // we can reuse old buffer, so just copy the new data (including zero terminator) - memcpy(dest, source, (source_length + 1) * sizeof(char_t)); - + memcpy(dest, source, source_length * sizeof(char_t)); + dest[source_length] = 0; + return true; } else @@ -2375,11 +2387,12 @@ PUGI__NS_BEGIN if (!buf) return false; // copy the string (including zero terminator) - memcpy(buf, source, (source_length + 1) * sizeof(char_t)); + memcpy(buf, source, source_length * sizeof(char_t)); + buf[source_length] = 0; // deallocate old buffer (*after* the above to protect against overlapping memory and/or allocation failures) if (header & header_mask) alloc->deallocate_string(dest); - + // the string is now allocated, so set the flag dest = buf; header |= header_mask; @@ -2392,11 +2405,11 @@ PUGI__NS_BEGIN { char_t* end; size_t size; - + gap(): end(0), size(0) { } - + // Push new gap, move s count bytes further (skipping the gap). // Collapse previous gap. void push(char_t*& s, size_t count) @@ -2407,14 +2420,14 @@ PUGI__NS_BEGIN assert(s >= end); memmove(end - size, end, reinterpret_cast(s) - reinterpret_cast(end)); } - + s += count; // end of current gap - + // "merge" two gaps end = s; size += count; } - + // Collapse all gaps, return past-the-end pointer char_t* flush(char_t* s) { @@ -2429,7 +2442,7 @@ PUGI__NS_BEGIN else return s; } }; - + PUGI__FN char_t* strconv_escape(char_t* s, gap& g) { char_t* stre = s + 1; @@ -2461,7 +2474,7 @@ PUGI__NS_BEGIN ch = *++stre; } - + ++stre; } else // &#... (dec code) @@ -2472,7 +2485,7 @@ PUGI__NS_BEGIN for (;;) { - if (static_cast(static_cast(ch) - '0') <= 9) + if (static_cast(ch - '0') <= 9) ucsc = 10 * ucsc + (ch - '0'); else if (ch == ';') break; @@ -2481,7 +2494,7 @@ PUGI__NS_BEGIN ch = *++stre; } - + ++stre; } @@ -2490,7 +2503,7 @@ PUGI__NS_BEGIN #else s = reinterpret_cast(utf8_writer::any(reinterpret_cast(s), ucsc)); #endif - + g.push(s, stre - s); return stre; } @@ -2505,7 +2518,7 @@ PUGI__NS_BEGIN { *s++ = '&'; ++stre; - + g.push(s, stre - s); return stre; } @@ -2530,7 +2543,7 @@ PUGI__NS_BEGIN { *s++ = '>'; ++stre; - + g.push(s, stre - s); return stre; } @@ -2543,7 +2556,7 @@ PUGI__NS_BEGIN { *s++ = '<'; ++stre; - + g.push(s, stre - s); return stre; } @@ -2556,7 +2569,7 @@ PUGI__NS_BEGIN { *s++ = '"'; ++stre; - + g.push(s, stre - s); return stre; } @@ -2566,7 +2579,7 @@ PUGI__NS_BEGIN default: break; } - + return stre; } @@ -2574,7 +2587,7 @@ PUGI__NS_BEGIN #define PUGI__ENDSWITH(c, e) ((c) == (e) || ((c) == 0 && endch == (e))) #define PUGI__SKIPWS() { while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; } #define PUGI__OPTSET(OPT) ( optmsk & (OPT) ) - #define PUGI__PUSHNODE(TYPE) { cursor = append_new_node(cursor, alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); } + #define PUGI__PUSHNODE(TYPE) { cursor = append_new_node(cursor, *alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); } #define PUGI__POPNODE() { cursor = cursor->parent; } #define PUGI__SCANFOR(X) { while (*s != 0 && !(X)) ++s; } #define PUGI__SCANWHILE(X) { while (X) ++s; } @@ -2586,21 +2599,21 @@ PUGI__NS_BEGIN PUGI__FN char_t* strconv_comment(char_t* s, char_t endch) { gap g; - + while (true) { PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_comment)); - + if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair { *s++ = '\n'; // replace first one with 0x0a - + if (*s == '\n') g.push(s, 1); } else if (s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')) // comment ends here { *g.flush(s) = 0; - + return s + (s[2] == '>' ? 3 : 2); } else if (*s == 0) @@ -2614,21 +2627,21 @@ PUGI__NS_BEGIN PUGI__FN char_t* strconv_cdata(char_t* s, char_t endch) { gap g; - + while (true) { PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_cdata)); - + if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair { *s++ = '\n'; // replace first one with 0x0a - + if (*s == '\n') g.push(s, 1); } else if (s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')) // CDATA ends here { *g.flush(s) = 0; - + return s + 1; } else if (*s == 0) @@ -2638,9 +2651,9 @@ PUGI__NS_BEGIN else ++s; } } - + typedef char_t* (*strconv_pcdata_t)(char_t*); - + template struct strconv_pcdata_impl { static char_t* parse(char_t* s) @@ -2662,13 +2675,13 @@ PUGI__NS_BEGIN --end; *end = 0; - + return s + 1; } else if (opt_eol::value && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair { *s++ = '\n'; // replace first one with 0x0a - + if (*s == '\n') g.push(s, 1); } else if (opt_escape::value && *s == '&') @@ -2691,7 +2704,7 @@ PUGI__NS_BEGIN } } }; - + PUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask) { PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_trim_pcdata == 0x0800); @@ -2706,12 +2719,12 @@ PUGI__NS_BEGIN case 5: return strconv_pcdata_impl::parse; case 6: return strconv_pcdata_impl::parse; case 7: return strconv_pcdata_impl::parse; - default: assert(false); return 0; // should not get here + default: assert(false); return 0; // unreachable } } typedef char_t* (*strconv_attribute_t)(char_t*, char_t); - + template struct strconv_attribute_impl { static char_t* parse_wnorm(char_t* s, char_t end_quote) @@ -2722,35 +2735,35 @@ PUGI__NS_BEGIN if (PUGI__IS_CHARTYPE(*s, ct_space)) { char_t* str = s; - + do ++str; while (PUGI__IS_CHARTYPE(*str, ct_space)); - + g.push(s, str - s); } while (true) { PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws | ct_space)); - + if (*s == end_quote) { char_t* str = g.flush(s); - + do *str-- = 0; while (PUGI__IS_CHARTYPE(*str, ct_space)); - + return s + 1; } else if (PUGI__IS_CHARTYPE(*s, ct_space)) { *s++ = ' '; - + if (PUGI__IS_CHARTYPE(*s, ct_space)) { char_t* str = s + 1; while (PUGI__IS_CHARTYPE(*str, ct_space)) ++str; - + g.push(s, str - s); } } @@ -2773,11 +2786,11 @@ PUGI__NS_BEGIN while (true) { PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws)); - + if (*s == end_quote) { *g.flush(s) = 0; - + return s + 1; } else if (PUGI__IS_CHARTYPE(*s, ct_space)) @@ -2785,7 +2798,7 @@ PUGI__NS_BEGIN if (*s == '\r') { *s++ = ' '; - + if (*s == '\n') g.push(s, 1); } else *s++ = ' '; @@ -2809,17 +2822,17 @@ PUGI__NS_BEGIN while (true) { PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); - + if (*s == end_quote) { *g.flush(s) = 0; - + return s + 1; } else if (*s == '\r') { *s++ = '\n'; - + if (*s == '\n') g.push(s, 1); } else if (opt_escape::value && *s == '&') @@ -2841,11 +2854,11 @@ PUGI__NS_BEGIN while (true) { PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); - + if (*s == end_quote) { *g.flush(s) = 0; - + return s + 1; } else if (opt_escape::value && *s == '&') @@ -2864,7 +2877,7 @@ PUGI__NS_BEGIN PUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask) { PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80); - + switch ((optmask >> 4) & 15) // get bitmask for flags (wconv wnorm eol escapes) { case 0: return strconv_attribute_impl::parse_simple; @@ -2883,7 +2896,7 @@ PUGI__NS_BEGIN case 13: return strconv_attribute_impl::parse_wnorm; case 14: return strconv_attribute_impl::parse_wnorm; case 15: return strconv_attribute_impl::parse_wnorm; - default: assert(false); return 0; // should not get here + default: assert(false); return 0; // unreachable } } @@ -2898,18 +2911,12 @@ PUGI__NS_BEGIN struct xml_parser { - xml_allocator alloc; - xml_allocator* alloc_state; + xml_allocator* alloc; char_t* error_offset; xml_parse_status error_status; - - xml_parser(xml_allocator* alloc_): alloc(*alloc_), alloc_state(alloc_), error_offset(0), error_status(status_ok) - { - } - ~xml_parser() + xml_parser(xml_allocator* alloc_): alloc(alloc_), error_offset(0), error_status(status_ok) { - *alloc_state = alloc; } // DOCTYPE consists of nested sections of the following possible types: @@ -3236,7 +3243,7 @@ PUGI__NS_BEGIN { strconv_attribute_t strconv_attribute = get_strconv_attribute(optmsk); strconv_pcdata_t strconv_pcdata = get_strconv_pcdata(optmsk); - + char_t ch = 0; xml_node_struct* cursor = root; char_t* mark = s; @@ -3267,10 +3274,10 @@ PUGI__NS_BEGIN while (true) { PUGI__SKIPWS(); // Eat any whitespace. - + if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #... { - xml_attribute_struct* a = append_new_attribute(cursor, alloc); // Make space for this attribute. + xml_attribute_struct* a = append_new_attribute(cursor, *alloc); // Make space for this attribute. if (!a) PUGI__THROW_ERROR(status_out_of_memory, s); a->name = s; // Save the offset. @@ -3285,7 +3292,7 @@ PUGI__NS_BEGIN ch = *s; ++s; } - + if (ch == '=') // '<... #=...' { PUGI__SKIPWS(); // Eat any whitespace. @@ -3297,7 +3304,7 @@ PUGI__NS_BEGIN a->value = s; // Save the offset. s = strconv_attribute(s, ch); - + if (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value); // After this line the loop continues from the start; @@ -3312,7 +3319,7 @@ PUGI__NS_BEGIN else if (*s == '/') { ++s; - + if (*s == '>') { PUGI__POPNODE(); @@ -3353,7 +3360,7 @@ PUGI__NS_BEGIN { // we stepped over null terminator, backtrack & handle closing tag --s; - + if (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s); } else PUGI__THROW_ERROR(status_bad_start_element, s); @@ -3362,20 +3369,22 @@ PUGI__NS_BEGIN { ++s; + mark = s; + char_t* name = cursor->name; - if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, s); - + if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, mark); + while (PUGI__IS_CHARTYPE(*s, ct_symbol)) { - if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, s); + if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, mark); } if (*name) { if (*s == 0 && name[0] == endch && name[1] == 0) PUGI__THROW_ERROR(status_bad_end_element, s); - else PUGI__THROW_ERROR(status_end_element_mismatch, s); + else PUGI__THROW_ERROR(status_end_element_mismatch, mark); } - + PUGI__POPNODE(); // Pop. PUGI__SKIPWS(); @@ -3429,23 +3438,31 @@ PUGI__NS_BEGIN if (!PUGI__OPTSET(parse_trim_pcdata)) s = mark; - + if (cursor->parent || PUGI__OPTSET(parse_fragment)) { - PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree. - cursor->value = s; // Save the offset. + if (PUGI__OPTSET(parse_embed_pcdata) && cursor->parent && !cursor->first_child && !cursor->value) + { + cursor->value = s; // Save the offset. + } + else + { + PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree. + + cursor->value = s; // Save the offset. + + PUGI__POPNODE(); // Pop since this is a standalone. + } s = strconv_pcdata(s); - - PUGI__POPNODE(); // Pop since this is a standalone. - + if (!*s) break; } else { PUGI__SCANFOR(*s == '<'); // '...<' if (!*s) break; - + ++s; } @@ -3493,14 +3510,14 @@ PUGI__NS_BEGIN // get last child of the root before parsing xml_node_struct* last_root_child = root->first_child ? root->first_child->prev_sibling_c + 0 : 0; - + // create parser on stack xml_parser parser(static_cast(xmldoc)); // save last character and make buffer zero-terminated (speeds up parsing) char_t endch = buffer[length - 1]; buffer[length - 1] = 0; - + // skip BOM to make sure it does not end up as part of parse output char_t* buffer_data = parse_skip_bom(buffer); @@ -3517,7 +3534,7 @@ PUGI__NS_BEGIN return make_parse_result(status_unrecognized_tag, length - 1); // check if there are any element nodes parsed - xml_node_struct* first_root_child_parsed = last_root_child ? last_root_child->next_sibling + 0 : root->first_child; + xml_node_struct* first_root_child_parsed = last_root_child ? last_root_child->next_sibling + 0 : root->first_child+ 0; if (!PUGI__OPTSET(parse_fragment) && !has_element_node_siblings(first_root_child_parsed)) return make_parse_result(status_no_document_element, length - 1); @@ -3561,12 +3578,36 @@ PUGI__NS_BEGIN return encoding_utf8; } + template PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T) + { + PUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type)); + + typename T::value_type end = D::process(reinterpret_cast(data), length, dest, T()); + + return static_cast(end - dest) * sizeof(*dest); + } + + template PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T, bool opt_swap) + { + PUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type)); + + typename T::value_type end = D::process(reinterpret_cast(data), length, dest, T()); + + if (opt_swap) + { + for (typename T::value_type i = dest; i != end; ++i) + *i = endian_swap(*i); + } + + return static_cast(end - dest) * sizeof(*dest); + } + #ifdef PUGIXML_WCHAR_MODE PUGI__FN size_t get_valid_length(const char_t* data, size_t length) { if (length < 1) return 0; - // discard last character if it's the lead of a surrogate pair + // discard last character if it's the lead of a surrogate pair return (sizeof(wchar_t) == 2 && static_cast(static_cast(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length; } @@ -3579,58 +3620,32 @@ PUGI__NS_BEGIN return length * sizeof(char_t); } - + // convert to utf8 if (encoding == encoding_utf8) - { - uint8_t* dest = r_u8; - uint8_t* end = utf_decoder::decode_wchar_block(data, length, dest); - - return static_cast(end - dest); - } + return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), utf8_writer()); // convert to utf16 if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) { - uint16_t* dest = r_u16; - - // convert to native utf16 - uint16_t* end = utf_decoder::decode_wchar_block(data, length, dest); - - // swap if necessary xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; - if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast(end - dest)); - - return static_cast(end - dest) * sizeof(uint16_t); + return convert_buffer_output_generic(r_u16, data, length, wchar_decoder(), utf16_writer(), native_encoding != encoding); } // convert to utf32 if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) { - uint32_t* dest = r_u32; - - // convert to native utf32 - uint32_t* end = utf_decoder::decode_wchar_block(data, length, dest); - - // swap if necessary xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; - if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast(end - dest)); - - return static_cast(end - dest) * sizeof(uint32_t); + return convert_buffer_output_generic(r_u32, data, length, wchar_decoder(), utf32_writer(), native_encoding != encoding); } // convert to latin1 if (encoding == encoding_latin1) - { - uint8_t* dest = r_u8; - uint8_t* end = utf_decoder::decode_wchar_block(data, length, dest); + return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), latin1_writer()); - return static_cast(end - dest); - } - - assert(!"Invalid encoding"); + assert(false && "Invalid encoding"); // unreachable return 0; } #else @@ -3654,43 +3669,22 @@ PUGI__NS_BEGIN { if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) { - uint16_t* dest = r_u16; - - // convert to native utf16 - uint16_t* end = utf_decoder::decode_utf8_block(reinterpret_cast(data), length, dest); - - // swap if necessary xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; - if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast(end - dest)); - - return static_cast(end - dest) * sizeof(uint16_t); + return convert_buffer_output_generic(r_u16, data, length, utf8_decoder(), utf16_writer(), native_encoding != encoding); } if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) { - uint32_t* dest = r_u32; - - // convert to native utf32 - uint32_t* end = utf_decoder::decode_utf8_block(reinterpret_cast(data), length, dest); - - // swap if necessary xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; - if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast(end - dest)); - - return static_cast(end - dest) * sizeof(uint32_t); + return convert_buffer_output_generic(r_u32, data, length, utf8_decoder(), utf32_writer(), native_encoding != encoding); } if (encoding == encoding_latin1) - { - uint8_t* dest = r_u8; - uint8_t* end = utf_decoder::decode_utf8_block(reinterpret_cast(data), length, dest); + return convert_buffer_output_generic(r_u8, data, length, utf8_decoder(), latin1_writer()); - return static_cast(end - dest); - } - - assert(!"Invalid encoding"); + assert(false && "Invalid encoding"); // unreachable return 0; } #endif @@ -3914,10 +3908,10 @@ PUGI__NS_BEGIN while (*s) { const char_t* prev = s; - + // While *s is a usual symbol PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPEX(ss, type)); - + writer.write_buffer(prev, static_cast(s - prev)); switch (*s) @@ -4083,7 +4077,7 @@ PUGI__NS_BEGIN writer.write(' '); } - writer.write_string(a->name ? a->name : default_name); + writer.write_string(a->name ? a->name + 0 : default_name); writer.write('=', '"'); if (a->value) @@ -4096,7 +4090,7 @@ PUGI__NS_BEGIN PUGI__FN bool node_output_start(xml_buffered_writer& writer, xml_node_struct* node, const char_t* indent, size_t indent_length, unsigned int flags, unsigned int depth) { const char_t* default_name = PUGIXML_TEXT(":anonymous"); - const char_t* name = node->name ? node->name : default_name; + const char_t* name = node->name ? node->name + 0 : default_name; writer.write('<'); writer.write_string(name); @@ -4104,24 +4098,61 @@ PUGI__NS_BEGIN if (node->first_attribute) node_output_attributes(writer, node, indent, indent_length, flags, depth); - if (!node->first_child) + // element nodes can have value if parse_embed_pcdata was used + if (!node->value) { - writer.write(' ', '/', '>'); + if (!node->first_child) + { + if (flags & format_no_empty_element_tags) + { + writer.write('>', '<', '/'); + writer.write_string(name); + writer.write('>'); - return false; + return false; + } + else + { + if ((flags & format_raw) == 0) + writer.write(' '); + + writer.write('/', '>'); + + return false; + } + } + else + { + writer.write('>'); + + return true; + } } else { writer.write('>'); - return true; + text_output(writer, node->value, ctx_special_pcdata, flags); + + if (!node->first_child) + { + writer.write('<', '/'); + writer.write_string(name); + writer.write('>'); + + return false; + } + else + { + return true; + } } } PUGI__FN void node_output_end(xml_buffered_writer& writer, xml_node_struct* node) { const char_t* default_name = PUGIXML_TEXT(":anonymous"); - const char_t* name = node->name ? node->name : default_name; + const char_t* name = node->name ? node->name + 0 : default_name; writer.write('<', '/'); writer.write_string(name); @@ -4148,7 +4179,7 @@ PUGI__NS_BEGIN case node_pi: writer.write('<', '?'); - writer.write_string(node->name ? node->name : default_name); + writer.write_string(node->name ? node->name + 0 : default_name); if (node->value) { @@ -4161,7 +4192,7 @@ PUGI__NS_BEGIN case node_declaration: writer.write('<', '?'); - writer.write_string(node->name ? node->name : default_name); + writer.write_string(node->name ? node->name + 0 : default_name); node_output_attributes(writer, node, PUGIXML_TEXT(""), 0, flags | format_raw, 0); writer.write('?', '>'); break; @@ -4180,7 +4211,7 @@ PUGI__NS_BEGIN break; default: - assert(!"Invalid node type"); + assert(false && "Invalid node type"); // unreachable } } @@ -4222,6 +4253,10 @@ PUGI__NS_BEGIN if (node_output_start(writer, node, indent, indent_length, flags, depth)) { + // element nodes can have value if parse_embed_pcdata was used + if (node->value) + indent_flags = 0; + node = node->first_child; depth++; continue; @@ -4355,7 +4390,7 @@ PUGI__NS_BEGIN source_header |= xml_memory_page_contents_shared_mask; } else - strcpy_insitu(dest, header, header_mask, source); + strcpy_insitu(dest, header, header_mask, source, strlength(source)); } } @@ -4388,6 +4423,7 @@ PUGI__NS_BEGIN while (sit && sit != sn) { + // when a tree is copied into one of the descendants, we need to skip that subtree to avoid an infinite loop if (sit != dn) { xml_node_struct* copy = append_new_node(dit, alloc, PUGI__NODETYPE(sit)); @@ -4438,39 +4474,96 @@ PUGI__NS_BEGIN } // get value with conversion functions - PUGI__FN int get_integer_base(const char_t* value) + template PUGI__FN PUGI__UNSIGNED_OVERFLOW U string_to_integer(const char_t* value, U minv, U maxv) { + U result = 0; const char_t* s = value; while (PUGI__IS_CHARTYPE(*s, ct_space)) s++; - if (*s == '-') - s++; + bool negative = (*s == '-'); - return (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) ? 16 : 10; + s += (*s == '+' || *s == '-'); + + bool overflow = false; + + if (s[0] == '0' && (s[1] | ' ') == 'x') + { + s += 2; + + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + + const char_t* start = s; + + for (;;) + { + if (static_cast(*s - '0') < 10) + result = result * 16 + (*s - '0'); + else if (static_cast((*s | ' ') - 'a') < 6) + result = result * 16 + ((*s | ' ') - 'a' + 10); + else + break; + + s++; + } + + size_t digits = static_cast(s - start); + + overflow = digits > sizeof(U) * 2; + } + else + { + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + + const char_t* start = s; + + for (;;) + { + if (static_cast(*s - '0') < 10) + result = result * 10 + (*s - '0'); + else + break; + + s++; + } + + size_t digits = static_cast(s - start); + + PUGI__STATIC_ASSERT(sizeof(U) == 8 || sizeof(U) == 4 || sizeof(U) == 2); + + const size_t max_digits10 = sizeof(U) == 8 ? 20 : sizeof(U) == 4 ? 10 : 5; + const char_t max_lead = sizeof(U) == 8 ? '1' : sizeof(U) == 4 ? '4' : '6'; + const size_t high_bit = sizeof(U) * 8 - 1; + + overflow = digits >= max_digits10 && !(digits == max_digits10 && (*start < max_lead || (*start == max_lead && result >> high_bit))); + } + + if (negative) + { + // Workaround for crayc++ CC-3059: Expected no overflow in routine. + #ifdef _CRAYC + return (overflow || result > ~minv + 1) ? minv : ~result + 1; + #else + return (overflow || result > 0 - minv) ? minv : 0 - result; + #endif + } + else + return (overflow || result > maxv) ? maxv : result; } PUGI__FN int get_value_int(const char_t* value) { - int base = get_integer_base(value); - - #ifdef PUGIXML_WCHAR_MODE - return static_cast(wcstol(value, 0, base)); - #else - return static_cast(strtol(value, 0, base)); - #endif + return string_to_integer(value, static_cast(INT_MIN), INT_MAX); } PUGI__FN unsigned int get_value_uint(const char_t* value) { - int base = get_integer_base(value); - - #ifdef PUGIXML_WCHAR_MODE - return static_cast(wcstoul(value, 0, base)); - #else - return static_cast(strtoul(value, 0, base)); - #endif + return string_to_integer(value, 0, UINT_MAX); } PUGI__FN double get_value_double(const char_t* value) @@ -4503,118 +4596,117 @@ PUGI__NS_BEGIN #ifdef PUGIXML_HAS_LONG_LONG PUGI__FN long long get_value_llong(const char_t* value) { - int base = get_integer_base(value); - - #ifdef PUGIXML_WCHAR_MODE - #ifdef PUGI__MSVC_CRT_VERSION - return _wcstoi64(value, 0, base); - #else - return wcstoll(value, 0, base); - #endif - #else - #ifdef PUGI__MSVC_CRT_VERSION - return _strtoi64(value, 0, base); - #else - return strtoll(value, 0, base); - #endif - #endif + return string_to_integer(value, static_cast(LLONG_MIN), LLONG_MAX); } PUGI__FN unsigned long long get_value_ullong(const char_t* value) { - int base = get_integer_base(value); - - #ifdef PUGIXML_WCHAR_MODE - #ifdef PUGI__MSVC_CRT_VERSION - return _wcstoui64(value, 0, base); - #else - return wcstoull(value, 0, base); - #endif - #else - #ifdef PUGI__MSVC_CRT_VERSION - return _strtoui64(value, 0, base); - #else - return strtoull(value, 0, base); - #endif - #endif + return string_to_integer(value, 0, ULLONG_MAX); } #endif + template PUGI__FN PUGI__UNSIGNED_OVERFLOW char_t* integer_to_string(char_t* begin, char_t* end, U value, bool negative) + { + char_t* result = end - 1; + U rest = negative ? 0 - value : value; + + do + { + *result-- = static_cast('0' + (rest % 10)); + rest /= 10; + } + while (rest); + + assert(result >= begin); + (void)begin; + + *result = '-'; + + return result + !negative; + } + // set value with conversion functions template - PUGI__FN bool set_value_buffer(String& dest, Header& header, uintptr_t header_mask, char (&buf)[128]) + PUGI__FN bool set_value_ascii(String& dest, Header& header, uintptr_t header_mask, char* buf) { #ifdef PUGIXML_WCHAR_MODE char_t wbuf[128]; - impl::widen_ascii(wbuf, buf); + assert(strlen(buf) < sizeof(wbuf) / sizeof(wbuf[0])); - return strcpy_insitu(dest, header, header_mask, wbuf); + size_t offset = 0; + for (; buf[offset]; ++offset) wbuf[offset] = buf[offset]; + + return strcpy_insitu(dest, header, header_mask, wbuf, offset); #else - return strcpy_insitu(dest, header, header_mask, buf); + return strcpy_insitu(dest, header, header_mask, buf, strlen(buf)); #endif } - template - PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, int value) + template + PUGI__FN bool set_value_integer(String& dest, Header& header, uintptr_t header_mask, U value, bool negative) { - char buf[128]; - sprintf(buf, "%d", value); - - return set_value_buffer(dest, header, header_mask, buf); - } + char_t buf[64]; + char_t* end = buf + sizeof(buf) / sizeof(buf[0]); + char_t* begin = integer_to_string(buf, end, value, negative); - template - PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, unsigned int value) - { - char buf[128]; - sprintf(buf, "%u", value); - - return set_value_buffer(dest, header, header_mask, buf); + return strcpy_insitu(dest, header, header_mask, begin, end - begin); } template PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, float value) { char buf[128]; - sprintf(buf, "%.9g", value); + PUGI__SNPRINTF(buf, "%.9g", value); - return set_value_buffer(dest, header, header_mask, buf); + return set_value_ascii(dest, header, header_mask, buf); } template PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, double value) { char buf[128]; - sprintf(buf, "%.17g", value); + PUGI__SNPRINTF(buf, "%.17g", value); - return set_value_buffer(dest, header, header_mask, buf); - } - - template - PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, bool value) - { - return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false")); - } - -#ifdef PUGIXML_HAS_LONG_LONG - template - PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, long long value) - { - char buf[128]; - sprintf(buf, "%lld", value); - - return set_value_buffer(dest, header, header_mask, buf); + return set_value_ascii(dest, header, header_mask, buf); } template - PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, unsigned long long value) + PUGI__FN bool set_value_bool(String& dest, Header& header, uintptr_t header_mask, bool value) { - char buf[128]; - sprintf(buf, "%llu", value); - - return set_value_buffer(dest, header, header_mask, buf); + return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"), value ? 4 : 5); + } + + PUGI__FN xml_parse_result load_buffer_impl(xml_document_struct* doc, xml_node_struct* root, void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own, char_t** out_buffer) + { + // check input buffer + if (!contents && size) return make_parse_result(status_io_error); + + // get actual encoding + xml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size); + + // get private buffer + char_t* buffer = 0; + size_t length = 0; + + if (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory); + + // delete original buffer if we performed a conversion + if (own && buffer != contents && contents) impl::xml_memory::deallocate(contents); + + // grab onto buffer if it's our buffer, user is responsible for deallocating contents himself + if (own || buffer != contents) *out_buffer = buffer; + + // store buffer for offset_debug + doc->buffer = buffer; + + // parse + xml_parse_result res = impl::xml_parser::parse(buffer, length, doc, root, options); + + // remember encoding + res.encoding = buffer_encoding; + + return res; } -#endif // we need to get length of entire file to load it in memory; the only (relatively) sane way to do it is via seek/tell trick PUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result) @@ -4644,7 +4736,7 @@ PUGI__NS_BEGIN // check for I/O errors if (length < 0) return status_io_error; - + // check for overflow size_t result = static_cast(length); @@ -4657,7 +4749,7 @@ PUGI__NS_BEGIN } // This function assumes that buffer has extra sizeof(char_t) writable bytes after size - PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding) + PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding) { // We only need to zero-terminate if encoding conversion does not do it for us #ifdef PUGIXML_WCHAR_MODE @@ -4681,7 +4773,7 @@ PUGI__NS_BEGIN return size; } - PUGI__FN xml_parse_result load_file_impl(xml_document& doc, FILE* file, unsigned int options, xml_encoding encoding) + PUGI__FN xml_parse_result load_file_impl(xml_document_struct* doc, FILE* file, unsigned int options, xml_encoding encoding, char_t** out_buffer) { if (!file) return make_parse_result(status_file_not_found); @@ -4689,7 +4781,7 @@ PUGI__NS_BEGIN size_t size = 0; xml_parse_status size_status = get_file_size(file, size); if (size_status != status_ok) return make_parse_result(size_status); - + size_t max_suffix_size = sizeof(char_t); // allocate buffer for the whole file @@ -4706,8 +4798,13 @@ PUGI__NS_BEGIN } xml_encoding real_encoding = get_buffer_encoding(encoding, contents, size); - - return doc.load_buffer_inplace_own(contents, zero_terminate_buffer(contents, size, real_encoding), options, real_encoding); + + return load_buffer_impl(doc, doc, contents, zero_terminate_buffer(contents, size, real_encoding), options, real_encoding, true, true, out_buffer); + } + + PUGI__FN void close_file(FILE* file) + { + fclose(file); } #ifndef PUGIXML_NO_STL @@ -4717,7 +4814,7 @@ PUGI__NS_BEGIN { void* memory = xml_memory::allocate(sizeof(xml_stream_chunk)); if (!memory) return 0; - + return new (memory) xml_stream_chunk(); } @@ -4827,14 +4924,14 @@ PUGI__NS_BEGIN // return buffer size_t actual_length = static_cast(stream.gcount()); assert(actual_length <= read_length); - + *out_buffer = buffer.release(); *out_size = actual_length * sizeof(T); return status_ok; } - template PUGI__FN xml_parse_result load_stream_impl(xml_document& doc, std::basic_istream& stream, unsigned int options, xml_encoding encoding) + template PUGI__FN xml_parse_result load_stream_impl(xml_document_struct* doc, std::basic_istream& stream, unsigned int options, xml_encoding encoding, char_t** out_buffer) { void* buffer = 0; size_t size = 0; @@ -4855,8 +4952,8 @@ PUGI__NS_BEGIN if (status != status_ok) return make_parse_result(status); xml_encoding real_encoding = get_buffer_encoding(encoding, buffer, size); - - return doc.load_buffer_inplace_own(buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding); + + return load_buffer_impl(doc, doc, buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding, true, true, out_buffer); } #endif @@ -4917,37 +5014,21 @@ PUGI__NS_BEGIN return ferror(file) == 0; } - PUGI__FN xml_parse_result load_buffer_impl(xml_document_struct* doc, xml_node_struct* root, void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own, char_t** out_buffer) + struct name_null_sentry { - // check input buffer - if (!contents && size) return make_parse_result(status_io_error); + xml_node_struct* node; + char_t* name; - // get actual encoding - xml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size); + name_null_sentry(xml_node_struct* node_): node(node_), name(node_->name) + { + node->name = 0; + } - // get private buffer - char_t* buffer = 0; - size_t length = 0; - - if (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory); - - // delete original buffer if we performed a conversion - if (own && buffer != contents && contents) impl::xml_memory::deallocate(contents); - - // grab onto buffer if it's our buffer, user is responsible for deallocating contents himself - if (own || buffer != contents) *out_buffer = buffer; - - // store buffer for offset_debug - doc->buffer = buffer; - - // parse - xml_parse_result res = impl::xml_parser::parse(buffer, length, doc, root, options); - - // remember encoding - res.encoding = buffer_encoding; - - return res; - } + ~name_null_sentry() + { + node->name = name; + } + }; PUGI__NS_END namespace pugi @@ -4991,7 +5072,7 @@ namespace pugi PUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0) { } - + PUGI__FN xml_tree_walker::~xml_tree_walker() { } @@ -5037,7 +5118,7 @@ namespace pugi { return (_attr == r._attr); } - + PUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const { return (_attr != r._attr); @@ -5047,17 +5128,17 @@ namespace pugi { return (_attr < r._attr); } - + PUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const { return (_attr > r._attr); } - + PUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const { return (_attr <= r._attr); } - + PUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const { return (_attr >= r._attr); @@ -5075,7 +5156,7 @@ namespace pugi PUGI__FN const char_t* xml_attribute::as_string(const char_t* def) const { - return (_attr && _attr->value) ? _attr->value : def; + return (_attr && _attr->value) ? _attr->value + 0 : def; } PUGI__FN int xml_attribute::as_int(int def) const @@ -5145,7 +5226,7 @@ namespace pugi set_value(rhs); return *this; } - + PUGI__FN xml_attribute& xml_attribute::operator=(int rhs) { set_value(rhs); @@ -5158,12 +5239,24 @@ namespace pugi return *this; } + PUGI__FN xml_attribute& xml_attribute::operator=(long rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(unsigned long rhs) + { + set_value(rhs); + return *this; + } + PUGI__FN xml_attribute& xml_attribute::operator=(double rhs) { set_value(rhs); return *this; } - + PUGI__FN xml_attribute& xml_attribute::operator=(float rhs) { set_value(rhs); @@ -5193,29 +5286,43 @@ namespace pugi PUGI__FN bool xml_attribute::set_name(const char_t* rhs) { if (!_attr) return false; - - return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs); + + return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs)); } - + PUGI__FN bool xml_attribute::set_value(const char_t* rhs) { if (!_attr) return false; - return impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + return impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)); } PUGI__FN bool xml_attribute::set_value(int rhs) { if (!_attr) return false; - return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0); } PUGI__FN bool xml_attribute::set_value(unsigned int rhs) { if (!_attr) return false; - return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, false); + } + + PUGI__FN bool xml_attribute::set_value(long rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0); + } + + PUGI__FN bool xml_attribute::set_value(unsigned long rhs) + { + if (!_attr) return false; + + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, false); } PUGI__FN bool xml_attribute::set_value(double rhs) @@ -5224,7 +5331,7 @@ namespace pugi return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); } - + PUGI__FN bool xml_attribute::set_value(float rhs) { if (!_attr) return false; @@ -5236,7 +5343,7 @@ namespace pugi { if (!_attr) return false; - return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + return impl::set_value_bool(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); } #ifdef PUGIXML_HAS_LONG_LONG @@ -5244,14 +5351,14 @@ namespace pugi { if (!_attr) return false; - return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0); } PUGI__FN bool xml_attribute::set_value(unsigned long long rhs) { if (!_attr) return false; - return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + return impl::set_value_integer(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, false); } #endif @@ -5274,7 +5381,7 @@ namespace pugi PUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p) { } - + PUGI__FN static void unspecified_bool_xml_node(xml_node***) { } @@ -5298,7 +5405,7 @@ namespace pugi { return iterator(0, _root); } - + PUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const { return attribute_iterator(_root ? _root->first_attribute + 0 : 0, _root); @@ -5308,7 +5415,7 @@ namespace pugi { return attribute_iterator(0, _root); } - + PUGI__FN xml_object_range xml_node::children() const { return xml_object_range(begin(), end()); @@ -5338,17 +5445,17 @@ namespace pugi { return (_root < r._root); } - + PUGI__FN bool xml_node::operator>(const xml_node& r) const { return (_root > r._root); } - + PUGI__FN bool xml_node::operator<=(const xml_node& r) const { return (_root <= r._root); } - + PUGI__FN bool xml_node::operator>=(const xml_node& r) const { return (_root >= r._root); @@ -5358,7 +5465,7 @@ namespace pugi { return !_root; } - + PUGI__FN const char_t* xml_node::name() const { return (_root && _root->name) ? _root->name + 0 : PUGIXML_TEXT(""); @@ -5368,12 +5475,12 @@ namespace pugi { return _root ? PUGI__NODETYPE(_root) : node_null; } - + PUGI__FN const char_t* xml_node::value() const { return (_root && _root->value) ? _root->value + 0 : PUGIXML_TEXT(""); } - + PUGI__FN xml_node xml_node::child(const char_t* name_) const { if (!_root) return xml_node(); @@ -5391,14 +5498,14 @@ namespace pugi for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute) if (i->name && impl::strequal(name_, i->name)) return xml_attribute(i); - + return xml_attribute(); } - + PUGI__FN xml_node xml_node::next_sibling(const char_t* name_) const { if (!_root) return xml_node(); - + for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling) if (i->name && impl::strequal(name_, i->name)) return xml_node(i); @@ -5413,7 +5520,7 @@ namespace pugi PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const { if (!_root) return xml_node(); - + for (xml_node_struct* i = _root->prev_sibling_c; i->next_sibling; i = i->prev_sibling_c) if (i->name && impl::strequal(name_, i->name)) return xml_node(i); @@ -5456,7 +5563,7 @@ namespace pugi PUGI__FN xml_node xml_node::previous_sibling() const { if (!_root) return xml_node(); - + if (_root->prev_sibling_c->next_sibling) return xml_node(_root->prev_sibling_c); else return xml_node(); } @@ -5479,7 +5586,11 @@ namespace pugi PUGI__FN const char_t* xml_node::child_value() const { if (!_root) return PUGIXML_TEXT(""); - + + // element nodes can have value if parse_embed_pcdata was used + if (PUGI__NODETYPE(_root) == node_element && _root->value) + return _root->value; + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) if (impl::is_text_node(i) && i->value) return i->value; @@ -5514,28 +5625,28 @@ namespace pugi PUGI__FN bool xml_node::set_name(const char_t* rhs) { - static const bool has_name[] = { false, false, true, false, false, false, true, true, false }; + xml_node_type type_ = _root ? PUGI__NODETYPE(_root) : node_null; - if (!_root || !has_name[PUGI__NODETYPE(_root)]) + if (type_ != node_element && type_ != node_pi && type_ != node_declaration) return false; - return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs); + return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs)); } - + PUGI__FN bool xml_node::set_value(const char_t* rhs) { - static const bool has_value[] = { false, false, false, true, true, true, true, false, true }; + xml_node_type type_ = _root ? PUGI__NODETYPE(_root) : node_null; - if (!_root || !has_value[PUGI__NODETYPE(_root)]) + if (type_ != node_pcdata && type_ != node_cdata && type_ != node_comment && type_ != node_pi && type_ != node_doctype) return false; - return impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs); + return impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)); } PUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_) { if (!impl::allow_insert_attribute(type())) return xml_attribute(); - + impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_attribute(); @@ -5545,14 +5656,14 @@ namespace pugi impl::append_attribute(a._attr, _root); a.set_name(name_); - + return a; } PUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_) { if (!impl::allow_insert_attribute(type())) return xml_attribute(); - + impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_attribute(); @@ -5570,7 +5681,7 @@ namespace pugi { if (!impl::allow_insert_attribute(type())) return xml_attribute(); if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); - + impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_attribute(); @@ -5588,7 +5699,7 @@ namespace pugi { if (!impl::allow_insert_attribute(type())) return xml_attribute(); if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); - + impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_attribute(); @@ -5675,7 +5786,7 @@ namespace pugi PUGI__FN xml_node xml_node::append_child(xml_node_type type_) { if (!impl::allow_insert_child(type(), type_)) return xml_node(); - + impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_node(); @@ -5695,12 +5806,12 @@ namespace pugi impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_node(); - + xml_node n(impl::allocate_node(alloc, type_)); if (!n) return xml_node(); impl::prepend_node(n._root, _root); - + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); return n; @@ -5713,7 +5824,7 @@ namespace pugi impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_node(); - + xml_node n(impl::allocate_node(alloc, type_)); if (!n) return xml_node(); @@ -5731,7 +5842,7 @@ namespace pugi impl::xml_allocator& alloc = impl::get_allocator(_root); if (!alloc.reserve()) return xml_node(); - + xml_node n(impl::allocate_node(alloc, type_)); if (!n) return xml_node(); @@ -5963,31 +6074,27 @@ namespace pugi // disable document_buffer_order optimization since in a document with multiple buffers comparing buffer pointers does not make sense doc->header |= impl::xml_memory_page_contents_shared_mask; - + // get extra buffer element (we'll store the document fragment buffer there so that we can deallocate it later) impl::xml_memory_page* page = 0; - impl::xml_extra_buffer* extra = static_cast(doc->allocate_memory(sizeof(impl::xml_extra_buffer), page)); + impl::xml_extra_buffer* extra = static_cast(doc->allocate_memory(sizeof(impl::xml_extra_buffer) + sizeof(void*), page)); (void)page; if (!extra) return impl::make_parse_result(status_out_of_memory); + #ifdef PUGIXML_COMPACT + // align the memory block to a pointer boundary; this is required for compact mode where memory allocations are only 4b aligned + // note that this requires up to sizeof(void*)-1 additional memory, which the allocation above takes into account + extra = reinterpret_cast((reinterpret_cast(extra) + (sizeof(void*) - 1)) & ~(sizeof(void*) - 1)); + #endif + // add extra buffer to the list extra->buffer = 0; extra->next = doc->extra_buffers; doc->extra_buffers = extra; // name of the root has to be NULL before parsing - otherwise closing node mismatches will not be detected at the top level - struct name_sentry - { - xml_node_struct* node; - char_t* name; - - ~name_sentry() { node->name = name; } - }; - - name_sentry sentry = { _root, _root->name }; - - sentry.node->name = 0; + impl::name_null_sentry sentry(_root); return impl::load_buffer_impl(doc, _root, const_cast(contents), size, options, encoding, false, false, &extra->buffer); } @@ -5995,7 +6102,7 @@ namespace pugi PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const { if (!_root) return xml_node(); - + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) if (i->name && impl::strequal(name_, i->name)) { @@ -6010,7 +6117,7 @@ namespace pugi PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const { if (!_root) return xml_node(); - + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute) if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(""))) @@ -6040,7 +6147,7 @@ namespace pugi if (j != _root) result[--offset] = delimiter; - if (j->name && *j->name) + if (j->name) { size_t length = impl::strlength(j->name); @@ -6059,7 +6166,7 @@ namespace pugi { xml_node found = *this; // Current search context. - if (!_root || !path_ || !path_[0]) return found; + if (!_root || !path_[0]) return found; if (path_[0] == delimiter) { @@ -6105,48 +6212,47 @@ namespace pugi PUGI__FN bool xml_node::traverse(xml_tree_walker& walker) { walker._depth = -1; - - xml_node arg_begin = *this; + + xml_node arg_begin(_root); if (!walker.begin(arg_begin)) return false; - xml_node cur = first_child(); - + xml_node_struct* cur = _root ? _root->first_child + 0 : 0; + if (cur) { ++walker._depth; - do + do { - xml_node arg_for_each = cur; + xml_node arg_for_each(cur); if (!walker.for_each(arg_for_each)) return false; - - if (cur.first_child()) + + if (cur->first_child) { ++walker._depth; - cur = cur.first_child(); + cur = cur->first_child; } - else if (cur.next_sibling()) - cur = cur.next_sibling(); + else if (cur->next_sibling) + cur = cur->next_sibling; else { - // Borland C++ workaround - while (!cur.next_sibling() && cur != *this && !cur.parent().empty()) + while (!cur->next_sibling && cur != _root && cur->parent) { --walker._depth; - cur = cur.parent(); + cur = cur->parent; } - - if (cur != *this) - cur = cur.next_sibling(); + + if (cur != _root) + cur = cur->next_sibling; } } - while (cur && cur != *this); + while (cur && cur != _root); } assert(walker._depth == -1); - xml_node arg_end = *this; + xml_node arg_end(_root); return walker.end(arg_end); } @@ -6213,6 +6319,7 @@ namespace pugi return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1; default: + assert(false && "Invalid node type"); // unreachable return -1; } } @@ -6237,6 +6344,10 @@ namespace pugi { if (!_root || impl::is_text_node(_root)) return _root; + // element nodes can have value if parse_embed_pcdata was used + if (PUGI__NODETYPE(_root) == node_element && _root->value) + return _root; + for (xml_node_struct* node = _root->first_child; node; node = node->next_sibling) if (impl::is_text_node(node)) return node; @@ -6286,7 +6397,7 @@ namespace pugi { xml_node_struct* d = _data(); - return (d && d->value) ? d->value : def; + return (d && d->value) ? d->value + 0 : def; } PUGI__FN int xml_text::as_int(int def) const @@ -6344,21 +6455,35 @@ namespace pugi { xml_node_struct* dn = _data_new(); - return dn ? impl::strcpy_insitu(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + return dn ? impl::strcpy_insitu(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)) : false; } PUGI__FN bool xml_text::set(int rhs) { xml_node_struct* dn = _data_new(); - return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0) : false; } PUGI__FN bool xml_text::set(unsigned int rhs) { xml_node_struct* dn = _data_new(); - return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, false) : false; + } + + PUGI__FN bool xml_text::set(long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0) : false; + } + + PUGI__FN bool xml_text::set(unsigned long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, false) : false; } PUGI__FN bool xml_text::set(float rhs) @@ -6379,7 +6504,7 @@ namespace pugi { xml_node_struct* dn = _data_new(); - return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + return dn ? impl::set_value_bool(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; } #ifdef PUGIXML_HAS_LONG_LONG @@ -6387,14 +6512,14 @@ namespace pugi { xml_node_struct* dn = _data_new(); - return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, rhs < 0) : false; } PUGI__FN bool xml_text::set(unsigned long long rhs) { xml_node_struct* dn = _data_new(); - return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + return dn ? impl::set_value_integer(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, false) : false; } #endif @@ -6416,6 +6541,18 @@ namespace pugi return *this; } + PUGI__FN xml_text& xml_text::operator=(long rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(unsigned long rhs) + { + set(rhs); + return *this; + } + PUGI__FN xml_text& xml_text::operator=(double rhs) { set(rhs); @@ -6481,7 +6618,7 @@ namespace pugi { return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root; } - + PUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const { return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root; @@ -6496,7 +6633,7 @@ namespace pugi PUGI__FN xml_node* xml_node_iterator::operator->() const { assert(_wrap._root); - return const_cast(&_wrap); // BCC32 workaround + return const_cast(&_wrap); // BCC5 workaround } PUGI__FN const xml_node_iterator& xml_node_iterator::operator++() @@ -6542,7 +6679,7 @@ namespace pugi { return _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root; } - + PUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const { return _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root; @@ -6557,7 +6694,7 @@ namespace pugi PUGI__FN xml_attribute* xml_attribute_iterator::operator->() const { assert(_wrap._attr); - return const_cast(&_wrap); // BCC32 workaround + return const_cast(&_wrap); // BCC5 workaround } PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator++() @@ -6618,7 +6755,7 @@ namespace pugi PUGI__FN xml_node* xml_named_node_iterator::operator->() const { assert(_wrap._root); - return const_cast(&_wrap); // BCC32 workaround + return const_cast(&_wrap); // BCC5 workaround } PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator++() @@ -6699,18 +6836,37 @@ namespace pugi PUGI__FN xml_document::xml_document(): _buffer(0) { - create(); + _create(); } PUGI__FN xml_document::~xml_document() { - destroy(); + _destroy(); } +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xml_document::xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT: _buffer(0) + { + _create(); + _move(rhs); + } + + PUGI__FN xml_document& xml_document::operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT + { + if (this == &rhs) return *this; + + _destroy(); + _create(); + _move(rhs); + + return *this; + } +#endif + PUGI__FN void xml_document::reset() { - destroy(); - create(); + _destroy(); + _create(); } PUGI__FN void xml_document::reset(const xml_document& proto) @@ -6721,31 +6877,30 @@ namespace pugi append_copy(cur); } - PUGI__FN void xml_document::create() + PUGI__FN void xml_document::_create() { assert(!_root); #ifdef PUGIXML_COMPACT - const size_t page_offset = sizeof(uint32_t); + // space for page marker for the first page (uint32_t), rounded up to pointer size; assumes pointers are at least 32-bit + const size_t page_offset = sizeof(void*); #else const size_t page_offset = 0; #endif // initialize sentinel page - PUGI__STATIC_ASSERT(sizeof(impl::xml_memory_page) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment - sizeof(void*) + page_offset <= sizeof(_memory)); - - // align upwards to page boundary - void* page_memory = reinterpret_cast((reinterpret_cast(_memory) + (impl::xml_memory_page_alignment - 1)) & ~(impl::xml_memory_page_alignment - 1)); + PUGI__STATIC_ASSERT(sizeof(impl::xml_memory_page) + sizeof(impl::xml_document_struct) + page_offset <= sizeof(_memory)); // prepare page structure - impl::xml_memory_page* page = impl::xml_memory_page::construct(page_memory); + impl::xml_memory_page* page = impl::xml_memory_page::construct(_memory); assert(page); page->busy_size = impl::xml_memory_page_size; // setup first page marker #ifdef PUGIXML_COMPACT - page->compact_page_marker = reinterpret_cast(reinterpret_cast(page) + sizeof(impl::xml_memory_page)); + // round-trip through void* to avoid 'cast increases required alignment of target type' warning + page->compact_page_marker = reinterpret_cast(static_cast(reinterpret_cast(page) + sizeof(impl::xml_memory_page))); *page->compact_page_marker = sizeof(impl::xml_memory_page); #endif @@ -6756,11 +6911,16 @@ namespace pugi // setup sentinel page page->allocator = static_cast(_root); + // setup hash table pointer in allocator + #ifdef PUGIXML_COMPACT + page->allocator->_hash = &static_cast(_root)->hash; + #endif + // verify the document allocation assert(reinterpret_cast(_root) + sizeof(impl::xml_document_struct) <= _memory + sizeof(_memory)); } - PUGI__FN void xml_document::destroy() + PUGI__FN void xml_document::_destroy() { assert(_root); @@ -6799,19 +6959,126 @@ namespace pugi _root = 0; } +#ifdef PUGIXML_HAS_MOVE + PUGI__FN void xml_document::_move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT + { + impl::xml_document_struct* doc = static_cast(_root); + impl::xml_document_struct* other = static_cast(rhs._root); + + // save first child pointer for later; this needs hash access + xml_node_struct* other_first_child = other->first_child; + + #ifdef PUGIXML_COMPACT + // reserve space for the hash table up front; this is the only operation that can fail + // if it does, we have no choice but to throw (if we have exceptions) + if (other_first_child) + { + size_t other_children = 0; + for (xml_node_struct* node = other_first_child; node; node = node->next_sibling) + other_children++; + + // in compact mode, each pointer assignment could result in a hash table request + // during move, we have to relocate document first_child and parents of all children + // normally there's just one child and its parent has a pointerless encoding but + // we assume the worst here + if (!other->_hash->reserve(other_children + 1)) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return; + #else + throw std::bad_alloc(); + #endif + } + } + #endif + + // move allocation state + doc->_root = other->_root; + doc->_busy_size = other->_busy_size; + + // move buffer state + doc->buffer = other->buffer; + doc->extra_buffers = other->extra_buffers; + _buffer = rhs._buffer; + + #ifdef PUGIXML_COMPACT + // move compact hash; note that the hash table can have pointers to other but they will be "inactive", similarly to nodes removed with remove_child + doc->hash = other->hash; + doc->_hash = &doc->hash; + + // make sure we don't access other hash up until the end when we reinitialize other document + other->_hash = 0; + #endif + + // move page structure + impl::xml_memory_page* doc_page = PUGI__GETPAGE(doc); + assert(doc_page && !doc_page->prev && !doc_page->next); + + impl::xml_memory_page* other_page = PUGI__GETPAGE(other); + assert(other_page && !other_page->prev); + + // relink pages since root page is embedded into xml_document + if (impl::xml_memory_page* page = other_page->next) + { + assert(page->prev == other_page); + + page->prev = doc_page; + + doc_page->next = page; + other_page->next = 0; + } + + // make sure pages point to the correct document state + for (impl::xml_memory_page* page = doc_page->next; page; page = page->next) + { + assert(page->allocator == other); + + page->allocator = doc; + + #ifdef PUGIXML_COMPACT + // this automatically migrates most children between documents and prevents ->parent assignment from allocating + if (page->compact_shared_parent == other) + page->compact_shared_parent = doc; + #endif + } + + // move tree structure + assert(!doc->first_child); + + doc->first_child = other_first_child; + + for (xml_node_struct* node = other_first_child; node; node = node->next_sibling) + { + #ifdef PUGIXML_COMPACT + // most children will have migrated when we reassigned compact_shared_parent + assert(node->parent == other || node->parent == doc); + + node->parent = doc; + #else + assert(node->parent == other); + node->parent = doc; + #endif + } + + // reset other document + new (other) impl::xml_document_struct(PUGI__GETPAGE(other)); + rhs._buffer = 0; + } +#endif + #ifndef PUGIXML_NO_STL PUGI__FN xml_parse_result xml_document::load(std::basic_istream >& stream, unsigned int options, xml_encoding encoding) { reset(); - return impl::load_stream_impl(*this, stream, options, encoding); + return impl::load_stream_impl(static_cast(_root), stream, options, encoding, &_buffer); } PUGI__FN xml_parse_result xml_document::load(std::basic_istream >& stream, unsigned int options) { reset(); - return impl::load_stream_impl(*this, stream, options, encoding_wchar); + return impl::load_stream_impl(static_cast(_root), stream, options, encoding_wchar, &_buffer); } #endif @@ -6837,9 +7104,9 @@ namespace pugi reset(); using impl::auto_deleter; // MSVC7 workaround - auto_deleter file(fopen(path_, "rb"), fclose); + auto_deleter file(fopen(path_, "rb"), impl::close_file); - return impl::load_file_impl(*this, file.data, options, encoding); + return impl::load_file_impl(static_cast(_root), file.data, options, encoding, &_buffer); } PUGI__FN xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding) @@ -6847,9 +7114,9 @@ namespace pugi reset(); using impl::auto_deleter; // MSVC7 workaround - auto_deleter file(impl::open_file_wide(path_, L"rb"), fclose); + auto_deleter file(impl::open_file_wide(path_, L"rb"), impl::close_file); - return impl::load_file_impl(*this, file.data, options, encoding); + return impl::load_file_impl(static_cast(_root), file.data, options, encoding, &_buffer); } PUGI__FN xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding) @@ -6920,7 +7187,7 @@ namespace pugi PUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const { using impl::auto_deleter; // MSVC7 workaround - auto_deleter file(fopen(path_, (flags & format_save_file_text) ? "w" : "wb"), fclose); + auto_deleter file(fopen(path_, (flags & format_save_file_text) ? "w" : "wb"), impl::close_file); return impl::save_file_impl(*this, file.data, indent, flags, encoding); } @@ -6928,7 +7195,7 @@ namespace pugi PUGI__FN bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const { using impl::auto_deleter; // MSVC7 workaround - auto_deleter file(impl::open_file_wide(path_, (flags & format_save_file_text) ? L"w" : L"wb"), fclose); + auto_deleter file(impl::open_file_wide(path_, (flags & format_save_file_text) ? L"w" : L"wb"), impl::close_file); return impl::save_file_impl(*this, file.data, indent, flags, encoding); } @@ -6956,14 +7223,14 @@ namespace pugi { return impl::as_utf8_impl(str.c_str(), str.size()); } - + PUGI__FN std::basic_string PUGIXML_FUNCTION as_wide(const char* str) { assert(str); return impl::as_wide_impl(str, strlen(str)); } - + PUGI__FN std::basic_string PUGIXML_FUNCTION as_wide(const std::string& str) { return impl::as_wide_impl(str.c_str(), str.size()); @@ -7095,7 +7362,7 @@ PUGI__NS_BEGIN if (begin == end) return begin; // last written element - I write = begin++; + I write = begin++; // merge unique elements while (begin != end) @@ -7110,134 +7377,76 @@ PUGI__NS_BEGIN return write + 1; } - template void copy_backwards(I begin, I end, I target) + template void insertion_sort(T* begin, T* end, const Pred& pred) { - while (begin != end) *--target = *--end; - } + if (begin == end) + return; - template void insertion_sort(I begin, I end, const Pred& pred, T*) - { - assert(begin != end); - - for (I it = begin + 1; it != end; ++it) + for (T* it = begin + 1; it != end; ++it) { T val = *it; + T* hole = it; - if (pred(val, *begin)) + // move hole backwards + while (hole > begin && pred(val, *(hole - 1))) { - // move to front - copy_backwards(begin, it, it + 1); - *begin = val; + *hole = *(hole - 1); + hole--; } + + // fill hole with element + *hole = val; + } + } + + template I median3(I first, I middle, I last, const Pred& pred) + { + if (pred(*middle, *first)) swap(middle, first); + if (pred(*last, *middle)) swap(last, middle); + if (pred(*middle, *first)) swap(middle, first); + + return middle; + } + + template void partition3(T* begin, T* end, T pivot, const Pred& pred, T** out_eqbeg, T** out_eqend) + { + // invariant: array is split into 4 groups: = < ? > (each variable denotes the boundary between the groups) + T* eq = begin; + T* lt = begin; + T* gt = end; + + while (lt < gt) + { + if (pred(*lt, pivot)) + lt++; + else if (*lt == pivot) + swap(*eq++, *lt++); else - { - I hole = it; - - // move hole backwards - while (pred(val, *(hole - 1))) - { - *hole = *(hole - 1); - hole--; - } - - // fill hole with element - *hole = val; - } + swap(*lt, *--gt); } - } - // std variant for elements with == - template void partition(I begin, I middle, I end, const Pred& pred, I* out_eqbeg, I* out_eqend) - { - I eqbeg = middle, eqend = middle + 1; + // we now have just 4 groups: = < >; move equal elements to the middle + T* eqbeg = gt; - // expand equal range - while (eqbeg != begin && *(eqbeg - 1) == *eqbeg) --eqbeg; - while (eqend != end && *eqend == *eqbeg) ++eqend; + for (T* it = begin; it != eq; ++it) + swap(*it, *--eqbeg); - // process outer elements - I ltend = eqbeg, gtbeg = eqend; - - for (;;) - { - // find the element from the right side that belongs to the left one - for (; gtbeg != end; ++gtbeg) - if (!pred(*eqbeg, *gtbeg)) - { - if (*gtbeg == *eqbeg) swap(*gtbeg, *eqend++); - else break; - } - - // find the element from the left side that belongs to the right one - for (; ltend != begin; --ltend) - if (!pred(*(ltend - 1), *eqbeg)) - { - if (*eqbeg == *(ltend - 1)) swap(*(ltend - 1), *--eqbeg); - else break; - } - - // scanned all elements - if (gtbeg == end && ltend == begin) - { - *out_eqbeg = eqbeg; - *out_eqend = eqend; - return; - } - - // make room for elements by moving equal area - if (gtbeg == end) - { - if (--ltend != --eqbeg) swap(*ltend, *eqbeg); - swap(*eqbeg, *--eqend); - } - else if (ltend == begin) - { - if (eqend != gtbeg) swap(*eqbeg, *eqend); - ++eqend; - swap(*gtbeg++, *eqbeg++); - } - else swap(*gtbeg++, *--ltend); - } - } - - template void median3(I first, I middle, I last, const Pred& pred) - { - if (pred(*middle, *first)) swap(*middle, *first); - if (pred(*last, *middle)) swap(*last, *middle); - if (pred(*middle, *first)) swap(*middle, *first); - } - - template void median(I first, I middle, I last, const Pred& pred) - { - if (last - first <= 40) - { - // median of three for small chunks - median3(first, middle, last, pred); - } - else - { - // median of nine - size_t step = (last - first + 1) / 8; - - median3(first, first + step, first + 2 * step, pred); - median3(middle - step, middle, middle + step, pred); - median3(last - 2 * step, last - step, last, pred); - median3(first + step, middle, last - step, pred); - } + *out_eqbeg = eqbeg; + *out_eqend = gt; } template void sort(I begin, I end, const Pred& pred) { // sort large chunks - while (end - begin > 32) + while (end - begin > 16) { // find median element I middle = begin + (end - begin) / 2; - median(begin, middle, end - 1, pred); + I median = median3(begin, middle, end - 1, pred); // partition in three chunks (< = >) I eqbeg, eqend; - partition(begin, middle, end, pred, &eqbeg, &eqend); + partition3(begin, end, *median, pred, &eqbeg, &eqend); // loop on larger half if (eqbeg - begin > end - eqend) @@ -7253,7 +7462,7 @@ PUGI__NS_BEGIN } // insertion sort small chunk - if (begin != end) insertion_sort(begin, end, pred, &*begin); + insertion_sort(begin, end, pred); } PUGI__NS_END @@ -7270,7 +7479,7 @@ PUGI__NS_BEGIN static const uintptr_t xpath_memory_block_alignment = sizeof(double) > sizeof(void*) ? sizeof(double) : sizeof(void*); struct xpath_memory_block - { + { xpath_memory_block* next; size_t capacity; @@ -7280,25 +7489,18 @@ PUGI__NS_BEGIN double alignment; }; }; - - class xpath_allocator + + struct xpath_allocator { xpath_memory_block* _root; size_t _root_size; + bool* _error; - public: - #ifdef PUGIXML_NO_EXCEPTIONS - jmp_buf* error_handler; - #endif - - xpath_allocator(xpath_memory_block* root, size_t root_size = 0): _root(root), _root_size(root_size) + xpath_allocator(xpath_memory_block* root, bool* error = 0): _root(root), _root_size(0), _error(error) { - #ifdef PUGIXML_NO_EXCEPTIONS - error_handler = 0; - #endif } - - void* allocate_nothrow(size_t size) + + void* allocate(size_t size) { // round size up to block alignment boundary size = (size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1); @@ -7319,35 +7521,22 @@ PUGI__NS_BEGIN size_t block_size = block_capacity + offsetof(xpath_memory_block, data); xpath_memory_block* block = static_cast(xml_memory::allocate(block_size)); - if (!block) return 0; - + if (!block) + { + if (_error) *_error = true; + return 0; + } + block->next = _root; block->capacity = block_capacity; - + _root = block; _root_size = size; - + return block->data; } } - void* allocate(size_t size) - { - void* result = allocate_nothrow(size); - - if (!result) - { - #ifdef PUGIXML_NO_EXCEPTIONS - assert(error_handler); - longjmp(*error_handler, 1); - #else - throw std::bad_alloc(); - #endif - } - - return result; - } - void* reallocate(void* ptr, size_t old_size, size_t new_size) { // round size up to block alignment boundary @@ -7357,33 +7546,35 @@ PUGI__NS_BEGIN // we can only reallocate the last object assert(ptr == 0 || static_cast(ptr) + old_size == &_root->data[0] + _root_size); - // adjust root size so that we have not allocated the object at all - bool only_object = (_root_size == old_size); + // try to reallocate the object inplace + if (ptr && _root_size - old_size + new_size <= _root->capacity) + { + _root_size = _root_size - old_size + new_size; + return ptr; + } - if (ptr) _root_size -= old_size; - - // allocate a new version (this will obviously reuse the memory if possible) + // allocate a new block void* result = allocate(new_size); - assert(result); + if (!result) return 0; // we have a new block - if (result != ptr && ptr) + if (ptr) { - // copy old data + // copy old data (we only support growing) assert(new_size >= old_size); memcpy(result, ptr, old_size); // free the previous page if it had no other objects - if (only_object) - { - assert(_root->data == result); - assert(_root->next); + assert(_root->data == result); + assert(_root->next); + if (_root->next->data == ptr) + { + // deallocate the whole page, unless it was the first one xpath_memory_block* next = _root->next->next; if (next) { - // deallocate the whole page, unless it was the first one xml_memory::deallocate(_root->next); _root->next = next; } @@ -7455,22 +7646,15 @@ PUGI__NS_BEGIN xpath_allocator result; xpath_allocator temp; xpath_stack stack; + bool oom; - #ifdef PUGIXML_NO_EXCEPTIONS - jmp_buf error_handler; - #endif - - xpath_stack_data(): result(blocks + 0), temp(blocks + 1) + xpath_stack_data(): result(blocks + 0, &oom), temp(blocks + 1, &oom), oom(false) { blocks[0].next = blocks[1].next = 0; blocks[0].capacity = blocks[1].capacity = sizeof(blocks[0].data); stack.result = &result; stack.temp = &temp; - - #ifdef PUGIXML_NO_EXCEPTIONS - result.error_handler = temp.error_handler = &error_handler; - #endif } ~xpath_stack_data() @@ -7492,7 +7676,7 @@ PUGI__NS_BEGIN static char_t* duplicate_string(const char_t* string, size_t length, xpath_allocator* alloc) { char_t* result = static_cast(alloc->allocate((length + 1) * sizeof(char_t))); - assert(result); + if (!result) return 0; memcpy(result, string, length * sizeof(char_t)); result[length] = 0; @@ -7521,9 +7705,13 @@ PUGI__NS_BEGIN { assert(begin <= end); - size_t length = static_cast(end - begin); + if (begin == end) + return xpath_string(); - return length == 0 ? xpath_string() : xpath_string(duplicate_string(begin, length, alloc), true, length); + size_t length = static_cast(end - begin); + const char_t* data = duplicate_string(begin, length, alloc); + + return data ? xpath_string(data, true, length) : xpath_string(); } xpath_string(): _buffer(PUGIXML_TEXT("")), _uses_heap(false), _length_heap(0) @@ -7549,7 +7737,7 @@ PUGI__NS_BEGIN // allocate new buffer char_t* result = static_cast(alloc->reallocate(_uses_heap ? const_cast(_buffer) : 0, (target_length + 1) * sizeof(char_t), (result_length + 1) * sizeof(char_t))); - assert(result); + if (!result) return; // append first string to the new buffer in case there was no reallocation if (!_uses_heap) memcpy(result, _buffer, target_length * sizeof(char_t)); @@ -7574,15 +7762,18 @@ PUGI__NS_BEGIN { return _uses_heap ? _length_heap : strlength(_buffer); } - + char_t* data(xpath_allocator* alloc) { // make private heap copy if (!_uses_heap) { size_t length_ = strlength(_buffer); + const char_t* data_ = duplicate_string(_buffer, length_, alloc); - _buffer = duplicate_string(_buffer, length_, alloc); + if (!data_) return 0; + + _buffer = data_; _uses_heap = true; _length_heap = length_; } @@ -7664,14 +7855,18 @@ PUGI__NS_BEGIN case node_comment: case node_pi: return xpath_string::from_const(n.value()); - + case node_document: case node_element: { xpath_string result; + // element nodes can have value if parse_embed_pcdata was used + if (n.value()[0]) + result.append(xpath_string::from_const(n.value()), alloc); + xml_node cur = n.first_child(); - + while (cur && cur != n) { if (cur.type() == node_pcdata || cur.type() == node_cdata) @@ -7689,16 +7884,16 @@ PUGI__NS_BEGIN if (cur != n) cur = cur.next_sibling(); } } - + return result; } - + default: return xpath_string(); } } } - + PUGI__FN bool node_is_before_sibling(xml_node_struct* ln, xml_node_struct* rn) { assert(ln->parent == rn->parent); @@ -7722,7 +7917,7 @@ PUGI__NS_BEGIN // if rn sibling chain ended ln must be before rn return !rs; } - + PUGI__FN bool node_is_before(xml_node_struct* ln, xml_node_struct* rn) { // find common ancestor at the same depth, if any @@ -7803,7 +7998,7 @@ PUGI__NS_BEGIN return 0; } - + struct document_order_comparator { bool operator()(const xpath_node& lhs, const xpath_node& rhs) const @@ -7827,10 +8022,10 @@ PUGI__NS_BEGIN for (xml_attribute a = lhs.attribute(); a; a = a.next_attribute()) if (a == rhs.attribute()) return true; - + return false; } - + // compare attribute parents ln = lhs.parent(); rn = rhs.parent(); @@ -7839,21 +8034,21 @@ PUGI__NS_BEGIN { // attributes go after the parent element if (lhs.parent() == rhs.node()) return false; - + ln = lhs.parent(); } else if (rhs.attribute()) { // attributes go after the parent element if (rhs.parent() == lhs.node()) return true; - + rn = rhs.parent(); } if (ln == rn) return false; if (!ln || !rn) return ln < rn; - + return node_is_before(ln.internal_object(), rn.internal_object()); } }; @@ -7866,20 +8061,22 @@ PUGI__NS_BEGIN else return rhs.attribute() ? false : lhs.node() < rhs.node(); } }; - + PUGI__FN double gen_nan() { #if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24)) - union { float f; uint32_t i; } u[sizeof(float) == sizeof(uint32_t) ? 1 : -1]; - u[0].i = 0x7fc00000; - return u[0].f; + PUGI__STATIC_ASSERT(sizeof(float) == sizeof(uint32_t)); + typedef uint32_t UI; // BCC5 workaround + union { float f; UI i; } u; + u.i = 0x7fc00000; + return u.f; #else // fallback const volatile double zero = 0.0; return zero / zero; #endif } - + PUGI__FN bool is_nan(double value) { #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) @@ -7892,7 +8089,7 @@ PUGI__NS_BEGIN return v != v; #endif } - + PUGI__FN const char_t* convert_number_to_string_special(double value) { #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) @@ -7924,12 +8121,12 @@ PUGI__NS_BEGIN return 0; #endif } - + PUGI__FN bool convert_number_to_boolean(double value) { return (value != 0 && !is_nan(value)); } - + PUGI__FN void truncate_zeros(char* begin, char* end) { while (begin != end && end[-1] == '0') end--; @@ -7939,11 +8136,11 @@ PUGI__NS_BEGIN // gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent #if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) - PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) + PUGI__FN void convert_number_to_mantissa_exponent(double value, char (&buffer)[32], char** out_mantissa, int* out_exponent) { // get base values int sign, exponent; - _ecvt_s(buffer, buffer_size, value, DBL_DIG + 1, &exponent, &sign); + _ecvt_s(buffer, sizeof(buffer), value, DBL_DIG + 1, &exponent, &sign); // truncate redundant zeros truncate_zeros(buffer, buffer + strlen(buffer)); @@ -7953,12 +8150,10 @@ PUGI__NS_BEGIN *out_exponent = exponent; } #else - PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) + PUGI__FN void convert_number_to_mantissa_exponent(double value, char (&buffer)[32], char** out_mantissa, int* out_exponent) { // get a scientific notation value with IEEE DBL_DIG decimals - sprintf(buffer, "%.*e", DBL_DIG, value); - assert(strlen(buffer) < buffer_size); - (void)!buffer_size; + PUGI__SNPRINTF(buffer, "%.*e", DBL_DIG, value); // get the exponent (possibly negative) char* exponent_string = strchr(buffer, 'e'); @@ -7995,12 +8190,12 @@ PUGI__NS_BEGIN char* mantissa; int exponent; - convert_number_to_mantissa_exponent(value, mantissa_buffer, sizeof(mantissa_buffer), &mantissa, &exponent); + convert_number_to_mantissa_exponent(value, mantissa_buffer, &mantissa, &exponent); // allocate a buffer of suitable length for the number size_t result_size = strlen(mantissa_buffer) + (exponent > 0 ? exponent : -exponent) + 4; char_t* result = static_cast(alloc->allocate(sizeof(char_t) * result_size)); - assert(result); + if (!result) return xpath_string(); // make the number! char_t* s = result; @@ -8017,7 +8212,7 @@ PUGI__NS_BEGIN { while (exponent > 0) { - assert(*mantissa == 0 || static_cast(static_cast(*mantissa) - '0') <= 9); + assert(*mantissa == 0 || static_cast(*mantissa - '0') <= 9); *s++ = *mantissa ? *mantissa++ : '0'; exponent--; } @@ -8050,7 +8245,7 @@ PUGI__NS_BEGIN return xpath_string::from_heap_preallocated(result, s); } - + PUGI__FN bool check_string_to_number_format(const char_t* string) { // parse leading whitespace @@ -8117,7 +8312,7 @@ PUGI__NS_BEGIN return true; } - + PUGI__FN double round_nearest(double value) { return floor(value + 0.5); @@ -8129,17 +8324,17 @@ PUGI__NS_BEGIN // ceil is used to differentiate between +0 and -0 (we return -0 for [-0.5, -0] and +0 for +0) return (value >= -0.5 && value <= 0) ? ceil(value) : floor(value + 0.5); } - + PUGI__FN const char_t* qualified_name(const xpath_node& node) { return node.attribute() ? node.attribute().name() : node.node().name(); } - + PUGI__FN const char_t* local_name(const xpath_node& node) { const char_t* name = qualified_name(node); const char_t* p = find_char(name, ':'); - + return p ? p + 1 : name; } @@ -8169,39 +8364,39 @@ PUGI__NS_BEGIN PUGI__FN const char_t* namespace_uri(xml_node node) { namespace_uri_predicate pred = node.name(); - + xml_node p = node; - + while (p) { xml_attribute a = p.find_attribute(pred); - + if (a) return a.value(); - + p = p.parent(); } - + return PUGIXML_TEXT(""); } PUGI__FN const char_t* namespace_uri(xml_attribute attr, xml_node parent) { namespace_uri_predicate pred = attr.name(); - + // Default namespace does not apply to attributes if (!pred.prefix) return PUGIXML_TEXT(""); - + xml_node p = parent; - + while (p) { xml_attribute a = p.find_attribute(pred); - + if (a) return a.value(); - + p = p.parent(); } - + return PUGIXML_TEXT(""); } @@ -8284,12 +8479,10 @@ PUGI__NS_BEGIN if (!table[i]) table[i] = static_cast(i); - void* result = alloc->allocate_nothrow(sizeof(table)); + void* result = alloc->allocate(sizeof(table)); + if (!result) return 0; - if (result) - { - memcpy(result, table, sizeof(table)); - } + memcpy(result, table, sizeof(table)); return static_cast(result); } @@ -8376,7 +8569,7 @@ PUGI__NS_BEGIN static const xpath_node_set dummy_node_set; - PUGI__FN unsigned int hash_string(const char_t* str) + PUGI__FN PUGI__UNSIGNED_OVERFLOW unsigned int hash_string(const char_t* str) { // Jenkins one-at-a-time hash (http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time) unsigned int result = 0; @@ -8387,11 +8580,11 @@ PUGI__NS_BEGIN result += result << 10; result ^= result >> 6; } - + result += result << 3; result ^= result >> 11; result += result << 15; - + return result; } @@ -8459,7 +8652,7 @@ PUGI__NS_BEGIN break; default: - assert(!"Invalid variable type"); + assert(false && "Invalid variable type"); // unreachable } } @@ -8480,7 +8673,7 @@ PUGI__NS_BEGIN return lhs->set(static_cast(rhs)->value); default: - assert(!"Invalid variable type"); + assert(false && "Invalid variable type"); // unreachable return false; } } @@ -8545,9 +8738,9 @@ PUGI__NS_BEGIN else type = sorted; } - + if (type != order) reverse(begin, end); - + return order; } @@ -8567,7 +8760,7 @@ PUGI__NS_BEGIN return *min_element(begin, end, document_order_comparator()); default: - assert(!"Invalid node set type"); + assert(false && "Invalid node set type"); // unreachable return xpath_node(); } } @@ -8632,7 +8825,7 @@ PUGI__NS_BEGIN { // reallocate the old array or allocate a new one xpath_node* data = static_cast(alloc->reallocate(_begin, capacity * sizeof(xpath_node), (size_ + count) * sizeof(xpath_node))); - assert(data); + if (!data) return; // finalize _begin = data; @@ -8660,7 +8853,7 @@ PUGI__NS_BEGIN { if (_type == xpath_node_set::type_unsorted) sort(_begin, _end, duplicate_comparator()); - + _end = unique(_begin, _end); } @@ -8684,7 +8877,7 @@ PUGI__NS_BEGIN // reallocate the old array or allocate a new one xpath_node* data = static_cast(alloc->reallocate(_begin, capacity * sizeof(xpath_node), new_capacity * sizeof(xpath_node))); - assert(data); + if (!data) return; // finalize _begin = data; @@ -8768,12 +8961,12 @@ PUGI__NS_BEGIN { next(); } - + const char_t* state() const { return _cur; } - + void next() { const char_t* cur = _cur; @@ -8788,7 +8981,7 @@ PUGI__NS_BEGIN case 0: _cur_lexeme = lex_eof; break; - + case '>': if (*(cur+1) == '=') { @@ -8832,7 +9025,7 @@ PUGI__NS_BEGIN _cur_lexeme = lex_equal; break; - + case '+': cur += 1; _cur_lexeme = lex_plus; @@ -8856,7 +9049,7 @@ PUGI__NS_BEGIN _cur_lexeme = lex_union; break; - + case '$': cur += 1; @@ -8874,7 +9067,7 @@ PUGI__NS_BEGIN } _cur_lexeme_contents.end = cur; - + _cur_lexeme = lex_var_ref; } else @@ -8895,7 +9088,7 @@ PUGI__NS_BEGIN _cur_lexeme = lex_close_brace; break; - + case '[': cur += 1; _cur_lexeme = lex_open_square_brace; @@ -8926,7 +9119,7 @@ PUGI__NS_BEGIN _cur_lexeme = lex_slash; } break; - + case '.': if (*(cur+1) == '.') { @@ -8942,7 +9135,7 @@ PUGI__NS_BEGIN while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; _cur_lexeme_contents.end = cur; - + _cur_lexeme = lex_number; } else @@ -8968,7 +9161,7 @@ PUGI__NS_BEGIN _cur_lexeme_contents.begin = cur; while (*cur && *cur != terminator) cur++; _cur_lexeme_contents.end = cur; - + if (!*cur) _cur_lexeme = lex_none; else @@ -8998,7 +9191,7 @@ PUGI__NS_BEGIN _cur_lexeme_contents.begin = cur; while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; - + if (*cur == '.') { cur++; @@ -9031,7 +9224,7 @@ PUGI__NS_BEGIN } _cur_lexeme_contents.end = cur; - + _cur_lexeme = lex_string; } else @@ -9142,7 +9335,7 @@ PUGI__NS_BEGIN axis_preceding_sibling, axis_self }; - + enum nodetest_t { nodetest_none, @@ -9177,7 +9370,7 @@ PUGI__NS_BEGIN }; template const axis_t axis_to_type::axis = N; - + class xpath_ast_node { private: @@ -9297,7 +9490,7 @@ PUGI__NS_BEGIN } } - assert(!"Wrong types"); + assert(false && "Wrong types"); // unreachable return false; } @@ -9372,7 +9565,7 @@ PUGI__NS_BEGIN } else { - assert(!"Wrong types"); + assert(false && "Wrong types"); // unreachable return false; } } @@ -9496,7 +9689,7 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_type_node: case nodetest_all: if (is_xpath_attribute(name)) @@ -9505,7 +9698,7 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_all_in_namespace: if (starts_with(name, _data.nodetest) && is_xpath_attribute(name)) { @@ -9513,14 +9706,14 @@ PUGI__NS_BEGIN return true; } break; - + default: ; } return false; } - + bool step_push(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc) { assert(n); @@ -9536,11 +9729,11 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_type_node: ns.push_back(xml_node(n), alloc); return true; - + case nodetest_type_comment: if (type == node_comment) { @@ -9548,7 +9741,7 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_type_text: if (type == node_pcdata || type == node_cdata) { @@ -9556,7 +9749,7 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_type_pi: if (type == node_pi) { @@ -9564,7 +9757,7 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_pi: if (type == node_pi && n->name && strequal(n->name, _data.nodetest)) { @@ -9572,7 +9765,7 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_all: if (type == node_element) { @@ -9580,7 +9773,7 @@ PUGI__NS_BEGIN return true; } break; - + case nodetest_all_in_namespace: if (type == node_element && n->name && starts_with(n->name, _data.nodetest)) { @@ -9590,7 +9783,7 @@ PUGI__NS_BEGIN break; default: - assert(!"Unknown axis"); + assert(false && "Unknown axis"); // unreachable } return false; @@ -9607,33 +9800,33 @@ PUGI__NS_BEGIN for (xml_attribute_struct* a = n->first_attribute; a; a = a->next_attribute) if (step_push(ns, a, n, alloc) & once) return; - + break; } - + case axis_child: { for (xml_node_struct* c = n->first_child; c; c = c->next_sibling) if (step_push(ns, c, alloc) & once) return; - + break; } - + case axis_descendant: case axis_descendant_or_self: { if (axis == axis_descendant_or_self) if (step_push(ns, n, alloc) & once) return; - + xml_node_struct* cur = n->first_child; - + while (cur) { if (step_push(ns, cur, alloc) & once) return; - + if (cur->first_child) cur = cur->first_child; else @@ -9644,32 +9837,32 @@ PUGI__NS_BEGIN if (cur == n) return; } - + cur = cur->next_sibling; } } - + break; } - + case axis_following_sibling: { for (xml_node_struct* c = n->next_sibling; c; c = c->next_sibling) if (step_push(ns, c, alloc) & once) return; - + break; } - + case axis_preceding_sibling: { for (xml_node_struct* c = n->prev_sibling_c; c->next_sibling; c = c->prev_sibling_c) if (step_push(ns, c, alloc) & once) return; - + break; } - + case axis_following: { xml_node_struct* cur = n; @@ -9748,7 +9941,7 @@ PUGI__NS_BEGIN break; } - + case axis_ancestor: case axis_ancestor_or_self: { @@ -9757,15 +9950,15 @@ PUGI__NS_BEGIN return; xml_node_struct* cur = n->parent; - + while (cur) { if (step_push(ns, cur, alloc) & once) return; - + cur = cur->parent; } - + break; } @@ -9783,12 +9976,12 @@ PUGI__NS_BEGIN break; } - + default: - assert(!"Unimplemented axis"); + assert(false && "Unimplemented axis"); // unreachable } } - + template void step_fill(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* p, xpath_allocator* alloc, bool once, T v) { const axis_t axis = T::axis; @@ -9803,15 +9996,15 @@ PUGI__NS_BEGIN return; xml_node_struct* cur = p; - + while (cur) { if (step_push(ns, cur, alloc) & once) return; - + cur = cur->parent; } - + break; } @@ -9827,7 +10020,7 @@ PUGI__NS_BEGIN case axis_following: { xml_node_struct* cur = p; - + while (cur) { if (cur->first_child) @@ -9864,9 +10057,9 @@ PUGI__NS_BEGIN step_fill(ns, p, alloc, once, v); break; } - + default: - assert(!"Unimplemented axis"); + assert(false && "Unimplemented axis"); // unreachable } } @@ -9908,7 +10101,7 @@ PUGI__NS_BEGIN // in general, all axes generate elements in a particular order, but there is no order guarantee if axis is applied to two nodes if (axis != axis_self && size != 0) ns.set_type(xpath_node_set::type_unsorted); - + step_fill(ns, *it, stack.result, once, v); if (_right) apply_predicates(ns, size, stack, eval); } @@ -9926,7 +10119,7 @@ PUGI__NS_BEGIN return ns; } - + public: xpath_ast_node(ast_type_t type, xpath_value_type rettype_, const char_t* value): _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) @@ -9941,14 +10134,14 @@ PUGI__NS_BEGIN assert(type == ast_number_constant); _data.number = value; } - + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_variable* value): _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) { assert(type == ast_variable); _data.variable = value; } - + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_ast_node* left = 0, xpath_ast_node* right = 0): _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(left), _right(right), _next(0) { @@ -9983,25 +10176,25 @@ PUGI__NS_BEGIN { case ast_op_or: return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack); - + case ast_op_and: return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack); - + case ast_op_equal: return compare_eq(_left, _right, c, stack, equal_to()); case ast_op_not_equal: return compare_eq(_left, _right, c, stack, not_equal_to()); - + case ast_op_less: return compare_rel(_left, _right, c, stack, less()); - + case ast_op_greater: return compare_rel(_right, _left, c, stack, less()); case ast_op_less_or_equal: return compare_rel(_left, _right, c, stack, less_equal()); - + case ast_op_greater_or_equal: return compare_rel(_right, _left, c, stack, less_equal()); @@ -10027,43 +10220,43 @@ PUGI__NS_BEGIN case ast_func_boolean: return _left->eval_boolean(c, stack); - + case ast_func_not: return !_left->eval_boolean(c, stack); - + case ast_func_true: return true; - + case ast_func_false: return false; case ast_func_lang: { if (c.n.attribute()) return false; - + xpath_allocator_capture cr(stack.result); xpath_string lang = _left->eval_string(c, stack); - + for (xml_node n = c.n.node(); n; n = n.parent()) { xml_attribute a = n.attribute(PUGIXML_TEXT("xml:lang")); - + if (a) { const char_t* value = a.value(); - + // strnicmp / strncasecmp is not portable for (const char_t* lit = lang.c_str(); *lit; ++lit) { if (tolower_ascii(*lit) != tolower_ascii(*value)) return false; ++value; } - + return *value == 0 || *value == '-'; } } - + return false; } @@ -10082,25 +10275,24 @@ PUGI__NS_BEGIN if (_rettype == xpath_type_boolean) return _data.variable->get_boolean(); - - // fallthrough to type conversion } + // fallthrough default: { switch (_rettype) { case xpath_type_number: return convert_number_to_boolean(eval_number(c, stack)); - + case xpath_type_string: { xpath_allocator_capture cr(stack.result); return !eval_string(c, stack).empty(); } - - case xpath_type_node_set: + + case xpath_type_node_set: { xpath_allocator_capture cr(stack.result); @@ -10108,7 +10300,7 @@ PUGI__NS_BEGIN } default: - assert(!"Wrong expression for return type boolean"); + assert(false && "Wrong expression for return type boolean"); // unreachable return false; } } @@ -10121,7 +10313,7 @@ PUGI__NS_BEGIN { case ast_op_add: return _left->eval_number(c, stack) + _right->eval_number(c, stack); - + case ast_op_subtract: return _left->eval_number(c, stack) - _right->eval_number(c, stack); @@ -10142,7 +10334,7 @@ PUGI__NS_BEGIN case ast_func_last: return static_cast(c.size); - + case ast_func_position: return static_cast(c.position); @@ -10152,28 +10344,28 @@ PUGI__NS_BEGIN return static_cast(_left->eval_node_set(c, stack, nodeset_eval_all).size()); } - + case ast_func_string_length_0: { xpath_allocator_capture cr(stack.result); return static_cast(string_value(c.n, stack.result).length()); } - + case ast_func_string_length_1: { xpath_allocator_capture cr(stack.result); return static_cast(_left->eval_string(c, stack).length()); } - + case ast_func_number_0: { xpath_allocator_capture cr(stack.result); return convert_string_to_number(string_value(c.n, stack.result).c_str()); } - + case ast_func_number_1: return _left->eval_number(c, stack); @@ -10182,76 +10374,75 @@ PUGI__NS_BEGIN xpath_allocator_capture cr(stack.result); double r = 0; - + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_all); - + for (const xpath_node* it = ns.begin(); it != ns.end(); ++it) { xpath_allocator_capture cri(stack.result); r += convert_string_to_number(string_value(*it, stack.result).c_str()); } - + return r; } case ast_func_floor: { double r = _left->eval_number(c, stack); - + return r == r ? floor(r) : r; } case ast_func_ceiling: { double r = _left->eval_number(c, stack); - + return r == r ? ceil(r) : r; } case ast_func_round: return round_nearest_nzero(_left->eval_number(c, stack)); - + case ast_variable: { assert(_rettype == _data.variable->type()); if (_rettype == xpath_type_number) return _data.variable->get_number(); - - // fallthrough to type conversion } + // fallthrough default: { switch (_rettype) { case xpath_type_boolean: return eval_boolean(c, stack) ? 1 : 0; - + case xpath_type_string: { xpath_allocator_capture cr(stack.result); return convert_string_to_number(eval_string(c, stack).c_str()); } - + case xpath_type_node_set: { xpath_allocator_capture cr(stack.result); return convert_string_to_number(eval_string(c, stack).c_str()); } - + default: - assert(!"Wrong expression for return type number"); + assert(false && "Wrong expression for return type number"); // unreachable return 0; } - + } } } - + xpath_string eval_string_concat(const xpath_context& c, const xpath_stack& stack) { assert(_type == ast_func_concat); @@ -10262,16 +10453,9 @@ PUGI__NS_BEGIN size_t count = 1; for (xpath_ast_node* nc = _right; nc; nc = nc->_next) count++; - // gather all strings - xpath_string static_buffer[4]; - xpath_string* buffer = static_buffer; - - // allocate on-heap for large concats - if (count > sizeof(static_buffer) / sizeof(static_buffer[0])) - { - buffer = static_cast(stack.temp->allocate(count * sizeof(xpath_string))); - assert(buffer); - } + // allocate a buffer for temporary string objects + xpath_string* buffer = static_cast(stack.temp->allocate(count * sizeof(xpath_string))); + if (!buffer) return xpath_string(); // evaluate all strings to temporary stack xpath_stack swapped_stack = {stack.temp, stack.result}; @@ -10288,7 +10472,7 @@ PUGI__NS_BEGIN // create final string char_t* result = static_cast(stack.result->allocate((length + 1) * sizeof(char_t))); - assert(result); + if (!result) return xpath_string(); char_t* ri = result; @@ -10307,11 +10491,11 @@ PUGI__NS_BEGIN { case ast_string_constant: return xpath_string::from_const(_data.string); - + case ast_func_local_name_0: { xpath_node na = c.n; - + return xpath_string::from_const(local_name(na)); } @@ -10321,14 +10505,14 @@ PUGI__NS_BEGIN xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); xpath_node na = ns.first(); - + return xpath_string::from_const(local_name(na)); } case ast_func_name_0: { xpath_node na = c.n; - + return xpath_string::from_const(qualified_name(na)); } @@ -10338,14 +10522,14 @@ PUGI__NS_BEGIN xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); xpath_node na = ns.first(); - + return xpath_string::from_const(qualified_name(na)); } case ast_func_namespace_uri_0: { xpath_node na = c.n; - + return xpath_string::from_const(namespace_uri(na)); } @@ -10355,7 +10539,7 @@ PUGI__NS_BEGIN xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); xpath_node na = ns.first(); - + return xpath_string::from_const(namespace_uri(na)); } @@ -10378,10 +10562,10 @@ PUGI__NS_BEGIN xpath_string p = _right->eval_string(c, swapped_stack); const char_t* pos = find_substring(s.c_str(), p.c_str()); - + return pos ? xpath_string::from_heap(s.c_str(), pos, stack.result) : xpath_string(); } - + case ast_func_substring_after: { xpath_allocator_capture cr(stack.temp); @@ -10390,7 +10574,7 @@ PUGI__NS_BEGIN xpath_string s = _left->eval_string(c, swapped_stack); xpath_string p = _right->eval_string(c, swapped_stack); - + const char_t* pos = find_substring(s.c_str(), p.c_str()); if (!pos) return xpath_string(); @@ -10410,19 +10594,19 @@ PUGI__NS_BEGIN size_t s_length = s.length(); double first = round_nearest(_right->eval_number(c, stack)); - + if (is_nan(first)) return xpath_string(); // NaN else if (first >= s_length + 1) return xpath_string(); - + size_t pos = first < 1 ? 1 : static_cast(first); assert(1 <= pos && pos <= s_length + 1); const char_t* rbegin = s.c_str() + (pos - 1); const char_t* rend = s.c_str() + s.length(); - + return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin); } - + case ast_func_substring_3: { xpath_allocator_capture cr(stack.temp); @@ -10434,12 +10618,12 @@ PUGI__NS_BEGIN double first = round_nearest(_right->eval_number(c, stack)); double last = first + round_nearest(_right->_next->eval_number(c, stack)); - + if (is_nan(first) || is_nan(last)) return xpath_string(); else if (first >= s_length + 1) return xpath_string(); else if (first >= last) return xpath_string(); else if (last < 1) return xpath_string(); - + size_t pos = first < 1 ? 1 : static_cast(first); size_t end = last >= s_length + 1 ? s_length + 1 : static_cast(last); @@ -10455,6 +10639,8 @@ PUGI__NS_BEGIN xpath_string s = string_value(c.n, stack.result); char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + char_t* end = normalize_space(begin); return xpath_string::from_heap_preallocated(begin, end); @@ -10465,8 +10651,10 @@ PUGI__NS_BEGIN xpath_string s = _left->eval_string(c, stack); char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + char_t* end = normalize_space(begin); - + return xpath_string::from_heap_preallocated(begin, end); } @@ -10481,6 +10669,8 @@ PUGI__NS_BEGIN xpath_string to = _right->_next->eval_string(c, swapped_stack); char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + char_t* end = translate(begin, from.c_str(), to.c_str(), to.length()); return xpath_string::from_heap_preallocated(begin, end); @@ -10491,6 +10681,8 @@ PUGI__NS_BEGIN xpath_string s = _left->eval_string(c, stack); char_t* begin = s.data(stack.result); + if (!begin) return xpath_string(); + char_t* end = translate_table(begin, _data.table); return xpath_string::from_heap_preallocated(begin, end); @@ -10502,20 +10694,19 @@ PUGI__NS_BEGIN if (_rettype == xpath_type_string) return xpath_string::from_const(_data.variable->get_string()); - - // fallthrough to type conversion } + // fallthrough default: { switch (_rettype) { case xpath_type_boolean: return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false")); - + case xpath_type_number: return convert_number_to_string(eval_number(c, stack), stack.result); - + case xpath_type_node_set: { xpath_allocator_capture cr(stack.temp); @@ -10525,9 +10716,9 @@ PUGI__NS_BEGIN xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first); return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result); } - + default: - assert(!"Wrong expression for return type string"); + assert(false && "Wrong expression for return type string"); // unreachable return xpath_string(); } } @@ -10566,20 +10757,20 @@ PUGI__NS_BEGIN bool once = eval_once(set.type(), eval); apply_predicate(set, 0, stack, once); - + return set; } - + case ast_func_id: return xpath_node_set_raw(); - + case ast_step: { switch (_axis) { case axis_ancestor: return step_do(c, stack, eval, axis_to_type()); - + case axis_ancestor_or_self: return step_do(c, stack, eval, axis_to_type()); @@ -10588,7 +10779,7 @@ PUGI__NS_BEGIN case axis_child: return step_do(c, stack, eval, axis_to_type()); - + case axis_descendant: return step_do(c, stack, eval, axis_to_type()); @@ -10597,28 +10788,28 @@ PUGI__NS_BEGIN case axis_following: return step_do(c, stack, eval, axis_to_type()); - + case axis_following_sibling: return step_do(c, stack, eval, axis_to_type()); - + case axis_namespace: // namespaced axis is not supported return xpath_node_set_raw(); - + case axis_parent: return step_do(c, stack, eval, axis_to_type()); - + case axis_preceding: return step_do(c, stack, eval, axis_to_type()); case axis_preceding_sibling: return step_do(c, stack, eval, axis_to_type()); - + case axis_self: return step_do(c, stack, eval, axis_to_type()); default: - assert(!"Unknown axis"); + assert(false && "Unknown axis"); // unreachable return xpath_node_set_raw(); } } @@ -10652,21 +10843,25 @@ PUGI__NS_BEGIN return ns; } - - // fallthrough to type conversion } + // fallthrough default: - assert(!"Wrong expression for return type node set"); + assert(false && "Wrong expression for return type node set"); // unreachable return xpath_node_set_raw(); } } void optimize(xpath_allocator* alloc) { - if (_left) _left->optimize(alloc); - if (_right) _right->optimize(alloc); - if (_next) _next->optimize(alloc); + if (_left) + _left->optimize(alloc); + + if (_right) + _right->optimize(alloc); + + if (_next) + _next->optimize(alloc); optimize_self(alloc); } @@ -10730,7 +10925,7 @@ PUGI__NS_BEGIN _type = ast_opt_compare_attribute; } } - + bool is_posinv_expr() const { switch (_type) @@ -10754,10 +10949,10 @@ PUGI__NS_BEGIN default: if (_left && !_left->is_posinv_expr()) return false; - + for (xpath_ast_node* n = _right; n; n = n->_next) if (!n->is_posinv_expr()) return false; - + return true; } } @@ -10795,65 +10990,77 @@ PUGI__NS_BEGIN char_t _scratch[32]; - #ifdef PUGIXML_NO_EXCEPTIONS - jmp_buf _error_handler; - #endif - - void throw_error(const char* message) + xpath_ast_node* error(const char* message) { _result->error = message; _result->offset = _lexer.current_pos() - _query; - #ifdef PUGIXML_NO_EXCEPTIONS - longjmp(_error_handler, 1); - #else - throw xpath_exception(*_result); - #endif + return 0; } - void throw_error_oom() + xpath_ast_node* error_oom() { - #ifdef PUGIXML_NO_EXCEPTIONS - throw_error("Out of memory"); - #else - throw std::bad_alloc(); - #endif + assert(_alloc->_error); + *_alloc->_error = true; + + return 0; } void* alloc_node() { - void* result = _alloc->allocate_nothrow(sizeof(xpath_ast_node)); + return _alloc->allocate(sizeof(xpath_ast_node)); + } - if (!result) throw_error_oom(); + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, const char_t* value) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, value) : 0; + } - return result; + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, double value) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, value) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, xpath_variable* value) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, value) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_value_type rettype, xpath_ast_node* left = 0, xpath_ast_node* right = 0) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, rettype, left, right) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char_t* contents) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, left, axis, test, contents) : 0; + } + + xpath_ast_node* alloc_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, predicate_t test) + { + void* memory = alloc_node(); + return memory ? new (memory) xpath_ast_node(type, left, right, test) : 0; } const char_t* alloc_string(const xpath_lexer_string& value) { - if (value.begin) - { - size_t length = static_cast(value.end - value.begin); + if (!value.begin) + return PUGIXML_TEXT(""); - char_t* c = static_cast(_alloc->allocate_nothrow((length + 1) * sizeof(char_t))); - if (!c) throw_error_oom(); - assert(c); // workaround for clang static analysis + size_t length = static_cast(value.end - value.begin); - memcpy(c, value.begin, length * sizeof(char_t)); - c[length] = 0; + char_t* c = static_cast(_alloc->allocate((length + 1) * sizeof(char_t))); + if (!c) return 0; - return c; - } - else return 0; - } + memcpy(c, value.begin, length * sizeof(char_t)); + c[length] = 0; - xpath_ast_node* parse_function_helper(ast_type_t type0, ast_type_t type1, size_t argc, xpath_ast_node* args[2]) - { - assert(argc <= 1); - - if (argc == 1 && args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set"); - - return new (alloc_node()) xpath_ast_node(argc == 0 ? type0 : type1, xpath_type_string, args[0]); + return c; } xpath_ast_node* parse_function(const xpath_lexer_string& name, size_t argc, xpath_ast_node* args[2]) @@ -10862,111 +11069,118 @@ PUGI__NS_BEGIN { case 'b': if (name == PUGIXML_TEXT("boolean") && argc == 1) - return new (alloc_node()) xpath_ast_node(ast_func_boolean, xpath_type_boolean, args[0]); - + return alloc_node(ast_func_boolean, xpath_type_boolean, args[0]); + break; - + case 'c': if (name == PUGIXML_TEXT("count") && argc == 1) { - if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set"); - return new (alloc_node()) xpath_ast_node(ast_func_count, xpath_type_number, args[0]); + if (args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(ast_func_count, xpath_type_number, args[0]); } else if (name == PUGIXML_TEXT("contains") && argc == 2) - return new (alloc_node()) xpath_ast_node(ast_func_contains, xpath_type_boolean, args[0], args[1]); + return alloc_node(ast_func_contains, xpath_type_boolean, args[0], args[1]); else if (name == PUGIXML_TEXT("concat") && argc >= 2) - return new (alloc_node()) xpath_ast_node(ast_func_concat, xpath_type_string, args[0], args[1]); + return alloc_node(ast_func_concat, xpath_type_string, args[0], args[1]); else if (name == PUGIXML_TEXT("ceiling") && argc == 1) - return new (alloc_node()) xpath_ast_node(ast_func_ceiling, xpath_type_number, args[0]); - - break; - - case 'f': - if (name == PUGIXML_TEXT("false") && argc == 0) - return new (alloc_node()) xpath_ast_node(ast_func_false, xpath_type_boolean); - else if (name == PUGIXML_TEXT("floor") && argc == 1) - return new (alloc_node()) xpath_ast_node(ast_func_floor, xpath_type_number, args[0]); - - break; - - case 'i': - if (name == PUGIXML_TEXT("id") && argc == 1) - return new (alloc_node()) xpath_ast_node(ast_func_id, xpath_type_node_set, args[0]); - - break; - - case 'l': - if (name == PUGIXML_TEXT("last") && argc == 0) - return new (alloc_node()) xpath_ast_node(ast_func_last, xpath_type_number); - else if (name == PUGIXML_TEXT("lang") && argc == 1) - return new (alloc_node()) xpath_ast_node(ast_func_lang, xpath_type_boolean, args[0]); - else if (name == PUGIXML_TEXT("local-name") && argc <= 1) - return parse_function_helper(ast_func_local_name_0, ast_func_local_name_1, argc, args); - - break; - - case 'n': - if (name == PUGIXML_TEXT("name") && argc <= 1) - return parse_function_helper(ast_func_name_0, ast_func_name_1, argc, args); - else if (name == PUGIXML_TEXT("namespace-uri") && argc <= 1) - return parse_function_helper(ast_func_namespace_uri_0, ast_func_namespace_uri_1, argc, args); - else if (name == PUGIXML_TEXT("normalize-space") && argc <= 1) - return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1, xpath_type_string, args[0], args[1]); - else if (name == PUGIXML_TEXT("not") && argc == 1) - return new (alloc_node()) xpath_ast_node(ast_func_not, xpath_type_boolean, args[0]); - else if (name == PUGIXML_TEXT("number") && argc <= 1) - return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]); - - break; - - case 'p': - if (name == PUGIXML_TEXT("position") && argc == 0) - return new (alloc_node()) xpath_ast_node(ast_func_position, xpath_type_number); - - break; - - case 'r': - if (name == PUGIXML_TEXT("round") && argc == 1) - return new (alloc_node()) xpath_ast_node(ast_func_round, xpath_type_number, args[0]); + return alloc_node(ast_func_ceiling, xpath_type_number, args[0]); break; - - case 's': - if (name == PUGIXML_TEXT("string") && argc <= 1) - return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]); - else if (name == PUGIXML_TEXT("string-length") && argc <= 1) - return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1, xpath_type_number, args[0]); - else if (name == PUGIXML_TEXT("starts-with") && argc == 2) - return new (alloc_node()) xpath_ast_node(ast_func_starts_with, xpath_type_boolean, args[0], args[1]); - else if (name == PUGIXML_TEXT("substring-before") && argc == 2) - return new (alloc_node()) xpath_ast_node(ast_func_substring_before, xpath_type_string, args[0], args[1]); - else if (name == PUGIXML_TEXT("substring-after") && argc == 2) - return new (alloc_node()) xpath_ast_node(ast_func_substring_after, xpath_type_string, args[0], args[1]); - else if (name == PUGIXML_TEXT("substring") && (argc == 2 || argc == 3)) - return new (alloc_node()) xpath_ast_node(argc == 2 ? ast_func_substring_2 : ast_func_substring_3, xpath_type_string, args[0], args[1]); - else if (name == PUGIXML_TEXT("sum") && argc == 1) + + case 'f': + if (name == PUGIXML_TEXT("false") && argc == 0) + return alloc_node(ast_func_false, xpath_type_boolean); + else if (name == PUGIXML_TEXT("floor") && argc == 1) + return alloc_node(ast_func_floor, xpath_type_number, args[0]); + + break; + + case 'i': + if (name == PUGIXML_TEXT("id") && argc == 1) + return alloc_node(ast_func_id, xpath_type_node_set, args[0]); + + break; + + case 'l': + if (name == PUGIXML_TEXT("last") && argc == 0) + return alloc_node(ast_func_last, xpath_type_number); + else if (name == PUGIXML_TEXT("lang") && argc == 1) + return alloc_node(ast_func_lang, xpath_type_boolean, args[0]); + else if (name == PUGIXML_TEXT("local-name") && argc <= 1) { - if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set"); - return new (alloc_node()) xpath_ast_node(ast_func_sum, xpath_type_number, args[0]); + if (argc == 1 && args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(argc == 0 ? ast_func_local_name_0 : ast_func_local_name_1, xpath_type_string, args[0]); } break; - + + case 'n': + if (name == PUGIXML_TEXT("name") && argc <= 1) + { + if (argc == 1 && args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(argc == 0 ? ast_func_name_0 : ast_func_name_1, xpath_type_string, args[0]); + } + else if (name == PUGIXML_TEXT("namespace-uri") && argc <= 1) + { + if (argc == 1 && args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(argc == 0 ? ast_func_namespace_uri_0 : ast_func_namespace_uri_1, xpath_type_string, args[0]); + } + else if (name == PUGIXML_TEXT("normalize-space") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("not") && argc == 1) + return alloc_node(ast_func_not, xpath_type_boolean, args[0]); + else if (name == PUGIXML_TEXT("number") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]); + + break; + + case 'p': + if (name == PUGIXML_TEXT("position") && argc == 0) + return alloc_node(ast_func_position, xpath_type_number); + + break; + + case 'r': + if (name == PUGIXML_TEXT("round") && argc == 1) + return alloc_node(ast_func_round, xpath_type_number, args[0]); + + break; + + case 's': + if (name == PUGIXML_TEXT("string") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]); + else if (name == PUGIXML_TEXT("string-length") && argc <= 1) + return alloc_node(argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1, xpath_type_number, args[0]); + else if (name == PUGIXML_TEXT("starts-with") && argc == 2) + return alloc_node(ast_func_starts_with, xpath_type_boolean, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring-before") && argc == 2) + return alloc_node(ast_func_substring_before, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring-after") && argc == 2) + return alloc_node(ast_func_substring_after, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring") && (argc == 2 || argc == 3)) + return alloc_node(argc == 2 ? ast_func_substring_2 : ast_func_substring_3, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("sum") && argc == 1) + { + if (args[0]->rettype() != xpath_type_node_set) return error("Function has to be applied to node set"); + return alloc_node(ast_func_sum, xpath_type_number, args[0]); + } + + break; + case 't': if (name == PUGIXML_TEXT("translate") && argc == 3) - return new (alloc_node()) xpath_ast_node(ast_func_translate, xpath_type_string, args[0], args[1]); + return alloc_node(ast_func_translate, xpath_type_string, args[0], args[1]); else if (name == PUGIXML_TEXT("true") && argc == 0) - return new (alloc_node()) xpath_ast_node(ast_func_true, xpath_type_boolean); - + return alloc_node(ast_func_true, xpath_type_boolean); + break; default: break; } - throw_error("Unrecognized function or wrong parameter count"); - - return 0; + return error("Unrecognized function or wrong parameter count"); } axis_t parse_axis_name(const xpath_lexer_string& name, bool& specified) @@ -10982,37 +11196,37 @@ PUGI__NS_BEGIN return axis_ancestor_or_self; else if (name == PUGIXML_TEXT("attribute")) return axis_attribute; - + break; - + case 'c': if (name == PUGIXML_TEXT("child")) return axis_child; - + break; - + case 'd': if (name == PUGIXML_TEXT("descendant")) return axis_descendant; else if (name == PUGIXML_TEXT("descendant-or-self")) return axis_descendant_or_self; - + break; - + case 'f': if (name == PUGIXML_TEXT("following")) return axis_following; else if (name == PUGIXML_TEXT("following-sibling")) return axis_following_sibling; - + break; - + case 'n': if (name == PUGIXML_TEXT("namespace")) return axis_namespace; - + break; - + case 'p': if (name == PUGIXML_TEXT("parent")) return axis_parent; @@ -11020,13 +11234,13 @@ PUGI__NS_BEGIN return axis_preceding; else if (name == PUGIXML_TEXT("preceding-sibling")) return axis_preceding_sibling; - + break; - + case 's': if (name == PUGIXML_TEXT("self")) return axis_self; - + break; default: @@ -11064,7 +11278,7 @@ PUGI__NS_BEGIN return nodetest_type_text; break; - + default: break; } @@ -11082,18 +11296,18 @@ PUGI__NS_BEGIN xpath_lexer_string name = _lexer.contents(); if (!_variables) - throw_error("Unknown variable: variable set is not provided"); + return error("Unknown variable: variable set is not provided"); xpath_variable* var = 0; if (!get_variable_scratch(_scratch, _variables, name.begin, name.end, &var)) - throw_error_oom(); + return error_oom(); if (!var) - throw_error("Unknown variable: variable set does not contain the given name"); + return error("Unknown variable: variable set does not contain the given name"); _lexer.next(); - return new (alloc_node()) xpath_ast_node(ast_variable, var->type(), var); + return alloc_node(ast_variable, var->type(), var); } case lex_open_brace: @@ -11101,9 +11315,10 @@ PUGI__NS_BEGIN _lexer.next(); xpath_ast_node* n = parse_expression(); + if (!n) return 0; if (_lexer.current() != lex_close_brace) - throw_error("Unmatched braces"); + return error("Expected ')' to match an opening '('"); _lexer.next(); @@ -11113,11 +11328,11 @@ PUGI__NS_BEGIN case lex_quoted_string: { const char_t* value = alloc_string(_lexer.contents()); + if (!value) return 0; - xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_string_constant, xpath_type_string, value); _lexer.next(); - return n; + return alloc_node(ast_string_constant, xpath_type_string, value); } case lex_number: @@ -11125,84 +11340,86 @@ PUGI__NS_BEGIN double value = 0; if (!convert_string_to_number_scratch(_scratch, _lexer.contents().begin, _lexer.contents().end, &value)) - throw_error_oom(); + return error_oom(); - xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_number_constant, xpath_type_number, value); _lexer.next(); - return n; + return alloc_node(ast_number_constant, xpath_type_number, value); } case lex_string: { xpath_ast_node* args[2] = {0}; size_t argc = 0; - + xpath_lexer_string function = _lexer.contents(); _lexer.next(); - - xpath_ast_node* last_arg = 0; - - if (_lexer.current() != lex_open_brace) - throw_error("Unrecognized function call"); - _lexer.next(); - if (_lexer.current() != lex_close_brace) - args[argc++] = parse_expression(); + xpath_ast_node* last_arg = 0; + + if (_lexer.current() != lex_open_brace) + return error("Unrecognized function call"); + _lexer.next(); while (_lexer.current() != lex_close_brace) { - if (_lexer.current() != lex_comma) - throw_error("No comma between function arguments"); - _lexer.next(); - + if (argc > 0) + { + if (_lexer.current() != lex_comma) + return error("No comma between function arguments"); + _lexer.next(); + } + xpath_ast_node* n = parse_expression(); - + if (!n) return 0; + if (argc < 2) args[argc] = n; else last_arg->set_next(n); argc++; last_arg = n; } - + _lexer.next(); return parse_function(function, argc, args); } default: - throw_error("Unrecognizable primary expression"); - - return 0; + return error("Unrecognizable primary expression"); } } - + // FilterExpr ::= PrimaryExpr | FilterExpr Predicate // Predicate ::= '[' PredicateExpr ']' // PredicateExpr ::= Expr xpath_ast_node* parse_filter_expression() { xpath_ast_node* n = parse_primary_expression(); + if (!n) return 0; while (_lexer.current() == lex_open_square_brace) { _lexer.next(); + if (n->rettype() != xpath_type_node_set) + return error("Predicate has to be applied to node set"); + xpath_ast_node* expr = parse_expression(); + if (!expr) return 0; - if (n->rettype() != xpath_type_node_set) throw_error("Predicate has to be applied to node set"); - - n = new (alloc_node()) xpath_ast_node(ast_filter, n, expr, predicate_default); + n = alloc_node(ast_filter, n, expr, predicate_default); + if (!n) return 0; if (_lexer.current() != lex_close_square_brace) - throw_error("Unmatched square brace"); - + return error("Expected ']' to match an opening '['"); + _lexer.next(); } - + return n; } - + // Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep // AxisSpecifier ::= AxisName '::' | '@'? // NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')' @@ -11211,7 +11428,7 @@ PUGI__NS_BEGIN xpath_ast_node* parse_step(xpath_ast_node* set) { if (set && set->rettype() != xpath_type_node_set) - throw_error("Step has to be applied to node set"); + return error("Step has to be applied to node set"); bool axis_specified = false; axis_t axis = axis_child; // implied child axis @@ -11220,25 +11437,31 @@ PUGI__NS_BEGIN { axis = axis_attribute; axis_specified = true; - + _lexer.next(); } else if (_lexer.current() == lex_dot) { _lexer.next(); - - return new (alloc_node()) xpath_ast_node(ast_step, set, axis_self, nodetest_type_node, 0); + + if (_lexer.current() == lex_open_square_brace) + return error("Predicates are not allowed after an abbreviated step"); + + return alloc_node(ast_step, set, axis_self, nodetest_type_node, 0); } else if (_lexer.current() == lex_double_dot) { _lexer.next(); - - return new (alloc_node()) xpath_ast_node(ast_step, set, axis_parent, nodetest_type_node, 0); + + if (_lexer.current() == lex_open_square_brace) + return error("Predicates are not allowed after an abbreviated step"); + + return alloc_node(ast_step, set, axis_parent, nodetest_type_node, 0); } - + nodetest_t nt_type = nodetest_none; xpath_lexer_string nt_name; - + if (_lexer.current() == lex_string) { // node name test @@ -11249,11 +11472,13 @@ PUGI__NS_BEGIN if (_lexer.current() == lex_double_colon) { // parse axis name - if (axis_specified) throw_error("Two axis specifiers in one step"); + if (axis_specified) + return error("Two axis specifiers in one step"); axis = parse_axis_name(nt_name, axis_specified); - if (!axis_specified) throw_error("Unknown axis"); + if (!axis_specified) + return error("Unknown axis"); // read actual node test _lexer.next(); @@ -11269,42 +11494,47 @@ PUGI__NS_BEGIN nt_name = _lexer.contents(); _lexer.next(); } - else throw_error("Unrecognized node test"); + else + { + return error("Unrecognized node test"); + } } - + if (nt_type == nodetest_none) { // node type test or processing-instruction if (_lexer.current() == lex_open_brace) { _lexer.next(); - + if (_lexer.current() == lex_close_brace) { _lexer.next(); nt_type = parse_node_test_type(nt_name); - if (nt_type == nodetest_none) throw_error("Unrecognized node type"); - + if (nt_type == nodetest_none) + return error("Unrecognized node type"); + nt_name = xpath_lexer_string(); } else if (nt_name == PUGIXML_TEXT("processing-instruction")) { if (_lexer.current() != lex_quoted_string) - throw_error("Only literals are allowed as arguments to processing-instruction()"); - + return error("Only literals are allowed as arguments to processing-instruction()"); + nt_type = nodetest_pi; nt_name = _lexer.contents(); _lexer.next(); - + if (_lexer.current() != lex_close_brace) - throw_error("Unmatched brace near processing-instruction()"); + return error("Unmatched brace near processing-instruction()"); _lexer.next(); } else - throw_error("Unmatched brace near node type test"); - + { + return error("Unmatched brace near node type test"); + } } // QName or NCName:* else @@ -11312,10 +11542,13 @@ PUGI__NS_BEGIN if (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:* { nt_name.end--; // erase * - + nt_type = nodetest_all_in_namespace; } - else nt_type = nodetest_name; + else + { + nt_type = nodetest_name; + } } } } @@ -11324,52 +11557,66 @@ PUGI__NS_BEGIN nt_type = nodetest_all; _lexer.next(); } - else throw_error("Unrecognized node test"); - - xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step, set, axis, nt_type, alloc_string(nt_name)); - + else + { + return error("Unrecognized node test"); + } + + const char_t* nt_name_copy = alloc_string(nt_name); + if (!nt_name_copy) return 0; + + xpath_ast_node* n = alloc_node(ast_step, set, axis, nt_type, nt_name_copy); + if (!n) return 0; + xpath_ast_node* last = 0; - + while (_lexer.current() == lex_open_square_brace) { _lexer.next(); - - xpath_ast_node* expr = parse_expression(); - xpath_ast_node* pred = new (alloc_node()) xpath_ast_node(ast_predicate, 0, expr, predicate_default); - + xpath_ast_node* expr = parse_expression(); + if (!expr) return 0; + + xpath_ast_node* pred = alloc_node(ast_predicate, 0, expr, predicate_default); + if (!pred) return 0; + if (_lexer.current() != lex_close_square_brace) - throw_error("Unmatched square brace"); + return error("Expected ']' to match an opening '['"); _lexer.next(); - + if (last) last->set_next(pred); else n->set_right(pred); - + last = pred; } return n; } - + // RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step xpath_ast_node* parse_relative_location_path(xpath_ast_node* set) { xpath_ast_node* n = parse_step(set); - + if (!n) return 0; + while (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash) { lexeme_t l = _lexer.current(); _lexer.next(); if (l == lex_double_slash) - n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); - + { + n = alloc_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + if (!n) return 0; + } + n = parse_step(n); + if (!n) return 0; } - + return n; } - + // LocationPath ::= RelativeLocationPath | AbsoluteLocationPath // AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath xpath_ast_node* parse_location_path() @@ -11377,8 +11624,9 @@ PUGI__NS_BEGIN if (_lexer.current() == lex_slash) { _lexer.next(); - - xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set); + + xpath_ast_node* n = alloc_node(ast_step_root, xpath_type_node_set); + if (!n) return 0; // relative location path can start from axis_attribute, dot, double_dot, multiply and string lexemes; any other lexeme means standalone root path lexeme_t l = _lexer.current(); @@ -11391,17 +11639,20 @@ PUGI__NS_BEGIN else if (_lexer.current() == lex_double_slash) { _lexer.next(); - - xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set); - n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); - + + xpath_ast_node* n = alloc_node(ast_step_root, xpath_type_node_set); + if (!n) return 0; + + n = alloc_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + if (!n) return 0; + return parse_relative_location_path(n); } // else clause moved outside of if because of bogus warning 'control may reach end of non-void function being inlined' in gcc 4.0.1 return parse_relative_location_path(0); } - + // PathExpr ::= LocationPath // | FilterExpr // | FilterExpr '/' RelativeLocationPath @@ -11416,8 +11667,7 @@ PUGI__NS_BEGIN // PrimaryExpr begins with '$' in case of it being a variable reference, // '(' in case of it being an expression, string literal, number constant or // function call. - - if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace || + if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace || _lexer.current() == lex_quoted_string || _lexer.current() == lex_number || _lexer.current() == lex_string) { @@ -11425,29 +11675,34 @@ PUGI__NS_BEGIN { // This is either a function call, or not - if not, we shall proceed with location path const char_t* state = _lexer.state(); - + while (PUGI__IS_CHARTYPE(*state, ct_space)) ++state; - - if (*state != '(') return parse_location_path(); + + if (*state != '(') + return parse_location_path(); // This looks like a function call; however this still can be a node-test. Check it. - if (parse_node_test_type(_lexer.contents()) != nodetest_none) return parse_location_path(); + if (parse_node_test_type(_lexer.contents()) != nodetest_none) + return parse_location_path(); } - + xpath_ast_node* n = parse_filter_expression(); + if (!n) return 0; if (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash) { lexeme_t l = _lexer.current(); _lexer.next(); - + if (l == lex_double_slash) { - if (n->rettype() != xpath_type_node_set) throw_error("Step has to be applied to node set"); + if (n->rettype() != xpath_type_node_set) + return error("Step has to be applied to node set"); - n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + n = alloc_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + if (!n) return 0; } - + // select from location path return parse_relative_location_path(n); } @@ -11459,12 +11714,15 @@ PUGI__NS_BEGIN _lexer.next(); // precedence 7+ - only parses union expressions - xpath_ast_node* expr = parse_expression_rec(parse_path_or_unary_expression(), 7); + xpath_ast_node* n = parse_expression(7); + if (!n) return 0; - return new (alloc_node()) xpath_ast_node(ast_op_negate, xpath_type_number, expr); + return alloc_node(ast_op_negate, xpath_type_number, n); } else + { return parse_location_path(); + } } struct binary_op_t @@ -11542,20 +11800,23 @@ PUGI__NS_BEGIN _lexer.next(); xpath_ast_node* rhs = parse_path_or_unary_expression(); + if (!rhs) return 0; binary_op_t nextop = binary_op_t::parse(_lexer); while (nextop.asttype != ast_unknown && nextop.precedence > op.precedence) { rhs = parse_expression_rec(rhs, nextop.precedence); + if (!rhs) return 0; nextop = binary_op_t::parse(_lexer); } if (op.asttype == ast_op_union && (lhs->rettype() != xpath_type_node_set || rhs->rettype() != xpath_type_node_set)) - throw_error("Union operator has to be applied to node sets"); + return error("Union operator has to be applied to node sets"); - lhs = new (alloc_node()) xpath_ast_node(op.asttype, op.rettype, lhs, rhs); + lhs = alloc_node(op.asttype, op.rettype, lhs, rhs); + if (!lhs) return 0; op = binary_op_t::parse(_lexer); } @@ -11581,9 +11842,12 @@ PUGI__NS_BEGIN // | MultiplicativeExpr '*' UnaryExpr // | MultiplicativeExpr 'div' UnaryExpr // | MultiplicativeExpr 'mod' UnaryExpr - xpath_ast_node* parse_expression() + xpath_ast_node* parse_expression(int limit = 0) { - return parse_expression_rec(parse_path_or_unary_expression(), 0); + xpath_ast_node* n = parse_path_or_unary_expression(); + if (!n) return 0; + + return parse_expression_rec(n, limit); } xpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result) @@ -11592,28 +11856,21 @@ PUGI__NS_BEGIN xpath_ast_node* parse() { - xpath_ast_node* result = parse_expression(); - + xpath_ast_node* n = parse_expression(); + if (!n) return 0; + + // check if there are unparsed tokens left if (_lexer.current() != lex_eof) - { - // there are still unparsed tokens left, error - throw_error("Incorrect query"); - } - - return result; + return error("Incorrect query"); + + return n; } static xpath_ast_node* parse(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result) { xpath_parser parser(query, variables, alloc, result); - #ifdef PUGIXML_NO_EXCEPTIONS - int error = setjmp(parser._error_handler); - - return (error == 0) ? parser.parse() : 0; - #else return parser.parse(); - #endif } }; @@ -11636,7 +11893,7 @@ PUGI__NS_BEGIN xml_memory::deallocate(impl); } - xpath_query_impl(): root(0), alloc(&block) + xpath_query_impl(): root(0), alloc(&block, &oom), oom(false) { block.next = 0; block.capacity = sizeof(block.data); @@ -11645,21 +11902,9 @@ PUGI__NS_BEGIN xpath_ast_node* root; xpath_allocator alloc; xpath_memory_block block; + bool oom; }; - PUGI__FN xpath_string evaluate_string_impl(xpath_query_impl* impl, const xpath_node& n, xpath_stack_data& sd) - { - if (!impl) return xpath_string(); - - #ifdef PUGIXML_NO_EXCEPTIONS - if (setjmp(sd.error_handler)) return xpath_string(); - #endif - - xpath_context c(n, 1, 1); - - return impl->root->eval_string(c, sd.stack); - } - PUGI__FN impl::xpath_ast_node* evaluate_node_set_prepare(xpath_query_impl* impl) { if (!impl) return 0; @@ -11687,7 +11932,7 @@ namespace pugi { assert(_result.error); } - + PUGI__FN const char* xpath_exception::what() const throw() { return _result.error; @@ -11698,15 +11943,15 @@ namespace pugi return _result; } #endif - + PUGI__FN xpath_node::xpath_node() { } - + PUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_) { } - + PUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_) { } @@ -11715,12 +11960,12 @@ namespace pugi { return _attribute ? xml_node() : _node; } - + PUGI__FN xml_attribute xpath_node::attribute() const { return _attribute; } - + PUGI__FN xml_node xpath_node::parent() const { return _attribute ? _node : _node.parent(); @@ -11734,7 +11979,7 @@ namespace pugi { return (_node || _attribute) ? unspecified_bool_xpath_node : 0; } - + PUGI__FN bool xpath_node::operator!() const { return !(_node || _attribute); @@ -11744,7 +11989,7 @@ namespace pugi { return _node == n._node && _attribute == n._attribute; } - + PUGI__FN bool xpath_node::operator!=(const xpath_node& n) const { return _node != n._node || _attribute != n._attribute; @@ -11795,7 +12040,7 @@ namespace pugi } memcpy(storage, begin_, size_ * sizeof(xpath_node)); - + // deallocate old buffer if (_begin != &_storage) impl::xml_memory::deallocate(_begin); @@ -11806,8 +12051,8 @@ namespace pugi } } -#if __cplusplus >= 201103 - PUGI__FN void xpath_node_set::_move(xpath_node_set& rhs) +#ifdef PUGIXML_HAS_MOVE + PUGI__FN void xpath_node_set::_move(xpath_node_set& rhs) PUGIXML_NOEXCEPT { _type = rhs._type; _storage = rhs._storage; @@ -11834,12 +12079,12 @@ namespace pugi if (_begin != &_storage) impl::xml_memory::deallocate(_begin); } - + PUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(type_unsorted), _begin(&_storage), _end(&_storage) { _assign(ns._begin, ns._end, ns._type); } - + PUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns) { if (this == &ns) return *this; @@ -11849,13 +12094,13 @@ namespace pugi return *this; } -#if __cplusplus >= 201103 - PUGI__FN xpath_node_set::xpath_node_set(xpath_node_set&& rhs): _type(type_unsorted), _begin(&_storage), _end(&_storage) +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xpath_node_set::xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT: _type(type_unsorted), _begin(&_storage), _end(&_storage) { _move(rhs); } - PUGI__FN xpath_node_set& xpath_node_set::operator=(xpath_node_set&& rhs) + PUGI__FN xpath_node_set& xpath_node_set::operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT { if (this == &rhs) return *this; @@ -11872,17 +12117,17 @@ namespace pugi { return _type; } - + PUGI__FN size_t xpath_node_set::size() const { return _end - _begin; } - + PUGI__FN bool xpath_node_set::empty() const { return _begin == _end; } - + PUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const { assert(index < size()); @@ -11893,12 +12138,12 @@ namespace pugi { return _begin; } - + PUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const { return _end; } - + PUGI__FN void xpath_node_set::sort(bool reverse) { _type = impl::xpath_sort(_begin, _end, _type, reverse); @@ -11944,7 +12189,7 @@ namespace pugi return static_cast(this)->name; default: - assert(!"Invalid variable type"); + assert(false && "Invalid variable type"); // unreachable return 0; } } @@ -12049,8 +12294,8 @@ namespace pugi return *this; } -#if __cplusplus >= 201103 - PUGI__FN xpath_variable_set::xpath_variable_set(xpath_variable_set&& rhs) +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xpath_variable_set::xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT { for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) { @@ -12059,7 +12304,7 @@ namespace pugi } } - PUGI__FN xpath_variable_set& xpath_variable_set::operator=(xpath_variable_set&& rhs) + PUGI__FN xpath_variable_set& xpath_variable_set::operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT { for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) { @@ -12230,6 +12475,15 @@ namespace pugi _impl = impl.release(); _result.error = 0; } + else + { + #ifdef PUGIXML_NO_EXCEPTIONS + if (qimpl->oom) _result.error = "Out of memory"; + #else + if (qimpl->oom) throw std::bad_alloc(); + throw xpath_exception(_result); + #endif + } } } @@ -12243,14 +12497,16 @@ namespace pugi impl::xpath_query_impl::destroy(static_cast(_impl)); } -#if __cplusplus >= 201103 - PUGI__FN xpath_query::xpath_query(xpath_query&& rhs) +#ifdef PUGIXML_HAS_MOVE + PUGI__FN xpath_query::xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT { _impl = rhs._impl; + _result = rhs._result; rhs._impl = 0; + rhs._result = xpath_parse_result(); } - xpath_query& xpath_query::operator=(xpath_query&& rhs) + PUGI__FN xpath_query& xpath_query::operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT { if (this == &rhs) return *this; @@ -12258,7 +12514,9 @@ namespace pugi impl::xpath_query_impl::destroy(static_cast(_impl)); _impl = rhs._impl; + _result = rhs._result; rhs._impl = 0; + rhs._result = xpath_parse_result(); return *this; } @@ -12274,37 +12532,63 @@ namespace pugi PUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const { if (!_impl) return false; - + impl::xpath_context c(n, 1, 1); impl::xpath_stack_data sd; - #ifdef PUGIXML_NO_EXCEPTIONS - if (setjmp(sd.error_handler)) return false; - #endif - - return static_cast(_impl)->root->eval_boolean(c, sd.stack); + bool r = static_cast(_impl)->root->eval_boolean(c, sd.stack); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return false; + #else + throw std::bad_alloc(); + #endif + } + + return r; } - + PUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const { if (!_impl) return impl::gen_nan(); - + impl::xpath_context c(n, 1, 1); impl::xpath_stack_data sd; - #ifdef PUGIXML_NO_EXCEPTIONS - if (setjmp(sd.error_handler)) return impl::gen_nan(); - #endif + double r = static_cast(_impl)->root->eval_number(c, sd.stack); - return static_cast(_impl)->root->eval_number(c, sd.stack); + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return impl::gen_nan(); + #else + throw std::bad_alloc(); + #endif + } + + return r; } #ifndef PUGIXML_NO_STL PUGI__FN string_t xpath_query::evaluate_string(const xpath_node& n) const { + if (!_impl) return string_t(); + + impl::xpath_context c(n, 1, 1); impl::xpath_stack_data sd; - impl::xpath_string r = impl::evaluate_string_impl(static_cast(_impl), n, sd); + impl::xpath_string r = static_cast(_impl)->root->eval_string(c, sd.stack); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return string_t(); + #else + throw std::bad_alloc(); + #endif + } return string_t(r.c_str(), r.length()); } @@ -12312,12 +12596,22 @@ namespace pugi PUGI__FN size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const { + impl::xpath_context c(n, 1, 1); impl::xpath_stack_data sd; - impl::xpath_string r = impl::evaluate_string_impl(static_cast(_impl), n, sd); + impl::xpath_string r = _impl ? static_cast(_impl)->root->eval_string(c, sd.stack) : impl::xpath_string(); + + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + r = impl::xpath_string(); + #else + throw std::bad_alloc(); + #endif + } size_t full_size = r.length() + 1; - + if (capacity > 0) { size_t size = (full_size < capacity) ? full_size : capacity; @@ -12326,7 +12620,7 @@ namespace pugi memcpy(buffer, r.c_str(), (size - 1) * sizeof(char_t)); buffer[size - 1] = 0; } - + return full_size; } @@ -12338,12 +12632,17 @@ namespace pugi impl::xpath_context c(n, 1, 1); impl::xpath_stack_data sd; - #ifdef PUGIXML_NO_EXCEPTIONS - if (setjmp(sd.error_handler)) return xpath_node_set(); - #endif - impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_all); + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return xpath_node_set(); + #else + throw std::bad_alloc(); + #endif + } + return xpath_node_set(r.begin(), r.end(), r.type()); } @@ -12355,12 +12654,17 @@ namespace pugi impl::xpath_context c(n, 1, 1); impl::xpath_stack_data sd; - #ifdef PUGIXML_NO_EXCEPTIONS - if (setjmp(sd.error_handler)) return xpath_node(); - #endif - impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_first); + if (sd.oom) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return xpath_node(); + #else + throw std::bad_alloc(); + #endif + } + return r.first(); } @@ -12386,7 +12690,7 @@ namespace pugi PUGI__FN xpath_node xml_node::select_node(const char_t* query, xpath_variable_set* variables) const { xpath_query q(query, variables); - return select_node(q); + return q.evaluate_node(*this); } PUGI__FN xpath_node xml_node::select_node(const xpath_query& query) const @@ -12397,7 +12701,7 @@ namespace pugi PUGI__FN xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const { xpath_query q(query, variables); - return select_nodes(q); + return q.evaluate_node_set(*this); } PUGI__FN xpath_node_set xml_node::select_nodes(const xpath_query& query) const @@ -12408,7 +12712,7 @@ namespace pugi PUGI__FN xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const { xpath_query q(query, variables); - return select_single_node(q); + return q.evaluate_node(*this); } PUGI__FN xpath_node xml_node::select_single_node(const xpath_query& query) const @@ -12429,16 +12733,23 @@ namespace pugi # pragma warning(pop) #endif +#if defined(_MSC_VER) && defined(__c2__) +# pragma clang diagnostic pop +#endif + // Undefine all local macros (makes sure we're not leaking macros in header-only mode) #undef PUGI__NO_INLINE #undef PUGI__UNLIKELY #undef PUGI__STATIC_ASSERT #undef PUGI__DMC_VOLATILE +#undef PUGI__UNSIGNED_OVERFLOW #undef PUGI__MSVC_CRT_VERSION +#undef PUGI__SNPRINTF #undef PUGI__NS_BEGIN #undef PUGI__NS_END #undef PUGI__FN #undef PUGI__FN_NO_INLINE +#undef PUGI__GETHEADER_IMPL #undef PUGI__GETPAGE_IMPL #undef PUGI__GETPAGE #undef PUGI__NODETYPE @@ -12460,7 +12771,7 @@ namespace pugi #endif /** - * Copyright (c) 2006-2015 Arseny Kapoulkine + * Copyright (c) 2006-2018 Arseny Kapoulkine * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -12473,7 +12784,7 @@ namespace pugi * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/lib/pugixml/pugixml.h b/lib/pugixml/pugixml.h index cdd24b6d..86403be3 100644 --- a/lib/pugixml/pugixml.h +++ b/lib/pugixml/pugixml.h @@ -1,7 +1,7 @@ /** - * pugixml parser - version 1.6 + * pugixml parser - version 1.9 * -------------------------------------------------------- - * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Copyright (C) 2006-2018, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) * Report bugs and download new versions at http://pugixml.org/ * * This library is distributed under the MIT License. See notice at the end @@ -13,7 +13,7 @@ #ifndef PUGIXML_VERSION // Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons -# define PUGIXML_VERSION 160 +# define PUGIXML_VERSION 190 #endif // Include user configuration file (this can define various configuration macros) @@ -72,6 +72,44 @@ # endif #endif +// If the platform is known to have move semantics support, compile move ctor/operator implementation +#ifndef PUGIXML_HAS_MOVE +# if __cplusplus >= 201103 +# define PUGIXML_HAS_MOVE +# elif defined(_MSC_VER) && _MSC_VER >= 1600 +# define PUGIXML_HAS_MOVE +# endif +#endif + +// If C++ is 2011 or higher, add 'noexcept' specifiers +#ifndef PUGIXML_NOEXCEPT +# if __cplusplus >= 201103 +# define PUGIXML_NOEXCEPT noexcept +# elif defined(_MSC_VER) && _MSC_VER >= 1900 +# define PUGIXML_NOEXCEPT noexcept +# else +# define PUGIXML_NOEXCEPT +# endif +#endif + +// Some functions can not be noexcept in compact mode +#ifdef PUGIXML_COMPACT +# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT +#else +# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT PUGIXML_NOEXCEPT +#endif + +// If C++ is 2011 or higher, add 'override' qualifiers +#ifndef PUGIXML_OVERRIDE +# if __cplusplus >= 201103 +# define PUGIXML_OVERRIDE override +# elif defined(_MSC_VER) && _MSC_VER >= 1700 +# define PUGIXML_OVERRIDE override +# else +# define PUGIXML_OVERRIDE +# endif +#endif + // Character interface macros #ifdef PUGIXML_WCHAR_MODE # define PUGIXML_TEXT(t) L ## t @@ -133,13 +171,13 @@ namespace pugi // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default. const unsigned int parse_eol = 0x0020; - + // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default. const unsigned int parse_wconv_attribute = 0x0040; // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default. const unsigned int parse_wnorm_attribute = 0x0080; - + // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default. const unsigned int parse_declaration = 0x0100; @@ -158,6 +196,11 @@ namespace pugi // is a valid document. This flag is off by default. const unsigned int parse_fragment = 0x1000; + // This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of + // the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments. + // This flag is off by default. + const unsigned int parse_embed_pcdata = 0x2000; + // The default parsing mode. // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded, // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. @@ -184,16 +227,16 @@ namespace pugi }; // Formatting flags - + // Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default. const unsigned int format_indent = 0x01; - + // Write encoding-specific BOM to the output stream. This flag is off by default. const unsigned int format_write_bom = 0x02; // Use raw output mode (no indentation and no line breaks are written). This flag is off by default. const unsigned int format_raw = 0x04; - + // Omit default XML declaration even if there is no declaration in the document. This flag is off by default. const unsigned int format_no_declaration = 0x08; @@ -206,6 +249,9 @@ namespace pugi // Write every attribute on a new line with appropriate indentation. This flag is off by default. const unsigned int format_indent_attributes = 0x40; + // Don't output empty element tags, instead writing an explicit start and end tag even if there are no children. This flag is off by default. + const unsigned int format_no_empty_element_tags = 0x80; + // The default set of formatting flags. // Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none. const unsigned int format_default = format_indent; @@ -225,7 +271,7 @@ namespace pugi class xml_node; class xml_text; - + #ifndef PUGIXML_NO_XPATH class xpath_node; class xpath_node_set; @@ -268,7 +314,7 @@ namespace pugi // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio xml_writer_file(void* file); - virtual void write(const void* data, size_t size); + virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; private: void* file; @@ -283,7 +329,7 @@ namespace pugi xml_writer_stream(std::basic_ostream >& stream); xml_writer_stream(std::basic_ostream >& stream); - virtual void write(const void* data, size_t size); + virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; private: std::basic_ostream >* narrow_stream; @@ -299,13 +345,13 @@ namespace pugi private: xml_attribute_struct* _attr; - + typedef void (*unspecified_bool_type)(xml_attribute***); public: // Default constructor. Constructs an empty attribute. xml_attribute(); - + // Constructs attribute from internal pointer explicit xml_attribute(xml_attribute_struct* attr); @@ -354,6 +400,8 @@ namespace pugi // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") bool set_value(int rhs); bool set_value(unsigned int rhs); + bool set_value(long rhs); + bool set_value(unsigned long rhs); bool set_value(double rhs); bool set_value(float rhs); bool set_value(bool rhs); @@ -367,6 +415,8 @@ namespace pugi xml_attribute& operator=(const char_t* rhs); xml_attribute& operator=(int rhs); xml_attribute& operator=(unsigned int rhs); + xml_attribute& operator=(long rhs); + xml_attribute& operator=(unsigned long rhs); xml_attribute& operator=(double rhs); xml_attribute& operator=(float rhs); xml_attribute& operator=(bool rhs); @@ -417,7 +467,7 @@ namespace pugi // Borland C++ workaround bool operator!() const; - + // Comparison operators (compares wrapped node pointers) bool operator==(const xml_node& r) const; bool operator!=(const xml_node& r) const; @@ -438,7 +488,7 @@ namespace pugi // Get node value, or "" if node is empty or it has no value // Note: For text node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes. const char_t* value() const; - + // Get attribute list xml_attribute first_attribute() const; xml_attribute last_attribute() const; @@ -450,7 +500,7 @@ namespace pugi // Get next/previous sibling in the children list of the parent node xml_node next_sibling() const; xml_node previous_sibling() const; - + // Get parent node xml_node parent() const; @@ -478,7 +528,7 @@ namespace pugi // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value) bool set_name(const char_t* rhs); bool set_value(const char_t* rhs); - + // Add attribute with specified name. Returns added attribute, or empty attribute on errors. xml_attribute append_attribute(const char_t* name); xml_attribute prepend_attribute(const char_t* name); @@ -532,11 +582,11 @@ namespace pugi template xml_attribute find_attribute(Predicate pred) const { if (!_root) return xml_attribute(); - + for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute()) if (pred(attrib)) return attrib; - + return xml_attribute(); } @@ -544,11 +594,11 @@ namespace pugi template xml_node find_child(Predicate pred) const { if (!_root) return xml_node(); - + for (xml_node node = first_child(); node; node = node.next_sibling()) if (pred(node)) return node; - + return xml_node(); } @@ -558,7 +608,7 @@ namespace pugi if (!_root) return xml_node(); xml_node cur = first_child(); - + while (cur._root && cur._root != _root) { if (pred(cur)) return cur; @@ -590,7 +640,7 @@ namespace pugi // Recursively traverse subtree with xml_tree_walker bool traverse(xml_tree_walker& walker); - + #ifndef PUGIXML_NO_XPATH // Select single node by evaluating XPath query. Returns first node from the resulting node set. xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const; @@ -601,11 +651,11 @@ namespace pugi xpath_node_set select_nodes(const xpath_query& query) const; // (deprecated: use select_node instead) Select single node by evaluating XPath query. - xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const; - xpath_node select_single_node(const xpath_query& query) const; + PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const; + PUGIXML_DEPRECATED xpath_node select_single_node(const xpath_query& query) const; #endif - + // Print subtree using a writer object void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; @@ -701,6 +751,8 @@ namespace pugi // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") bool set(int rhs); bool set(unsigned int rhs); + bool set(long rhs); + bool set(unsigned long rhs); bool set(double rhs); bool set(float rhs); bool set(bool rhs); @@ -714,6 +766,8 @@ namespace pugi xml_text& operator=(const char_t* rhs); xml_text& operator=(int rhs); xml_text& operator=(unsigned int rhs); + xml_text& operator=(long rhs); + xml_text& operator=(unsigned long rhs); xml_text& operator=(double rhs); xml_text& operator=(float rhs); xml_text& operator=(bool rhs); @@ -867,11 +921,11 @@ namespace pugi private: int _depth; - + protected: // Get current traversal depth int depth() const; - + public: xml_tree_walker(); virtual ~xml_tree_walker(); @@ -942,13 +996,14 @@ namespace pugi char_t* _buffer; char _memory[192]; - + // Non-copyable semantics xml_document(const xml_document&); - const xml_document& operator=(const xml_document&); + xml_document& operator=(const xml_document&); - void create(); - void destroy(); + void _create(); + void _destroy(); + void _move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; public: // Default constructor, makes empty document @@ -957,6 +1012,12 @@ namespace pugi // Destructor, invalidates all node/attribute handles to this document ~xml_document(); + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + xml_document& operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + #endif + // Removes all nodes, leaving the empty document void reset(); @@ -970,7 +1031,7 @@ namespace pugi #endif // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied. - xml_parse_result load(const char_t* contents, unsigned int options = parse_default); + PUGIXML_DEPRECATED xml_parse_result load(const char_t* contents, unsigned int options = parse_default); // Load document from zero-terminated string. No encoding conversions are applied. xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default); @@ -1051,7 +1112,7 @@ namespace pugi // Non-copyable semantics xpath_variable(const xpath_variable&); xpath_variable& operator=(const xpath_variable&); - + public: // Get variable name const char_t* name() const; @@ -1095,10 +1156,10 @@ namespace pugi xpath_variable_set(const xpath_variable_set& rhs); xpath_variable_set& operator=(const xpath_variable_set& rhs); - #if __cplusplus >= 201103 + #ifdef PUGIXML_HAS_MOVE // Move semantics support - xpath_variable_set(xpath_variable_set&& rhs); - xpath_variable_set& operator=(xpath_variable_set&& rhs); + xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; + xpath_variable_set& operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; #endif // Add a new variable or get the existing one, if the types match @@ -1139,29 +1200,29 @@ namespace pugi // Destructor ~xpath_query(); - #if __cplusplus >= 201103 + #ifdef PUGIXML_HAS_MOVE // Move semantics support - xpath_query(xpath_query&& rhs); - xpath_query& operator=(xpath_query&& rhs); + xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT; + xpath_query& operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT; #endif // Get query expression return type xpath_value_type return_type() const; - + // Evaluate expression as boolean value in the specified context; performs type conversion if necessary. // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. bool evaluate_boolean(const xpath_node& n) const; - + // Evaluate expression as double value in the specified context; performs type conversion if necessary. // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. double evaluate_number(const xpath_node& n) const; - + #ifndef PUGIXML_NO_STL // Evaluate expression as string value in the specified context; performs type conversion if necessary. // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. string_t evaluate_string(const xpath_node& n) const; #endif - + // Evaluate expression as string value in the specified context; performs type conversion if necessary. // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero). // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. @@ -1188,7 +1249,7 @@ namespace pugi // Borland C++ workaround bool operator!() const; }; - + #ifndef PUGIXML_NO_EXCEPTIONS // XPath exception class class PUGIXML_CLASS xpath_exception: public std::exception @@ -1201,26 +1262,26 @@ namespace pugi explicit xpath_exception(const xpath_parse_result& result); // Get error message - virtual const char* what() const throw(); + virtual const char* what() const throw() PUGIXML_OVERRIDE; // Get parse result const xpath_parse_result& result() const; }; #endif - + // XPath node class (either xml_node or xml_attribute) class PUGIXML_CLASS xpath_node { private: xml_node _node; xml_attribute _attribute; - + typedef void (*unspecified_bool_type)(xpath_node***); public: // Default constructor; constructs empty XPath node xpath_node(); - + // Construct XPath node from XML node/attribute xpath_node(const xml_node& node); xpath_node(const xml_attribute& attribute, const xml_node& parent); @@ -1228,13 +1289,13 @@ namespace pugi // Get node/attribute, if any xml_node node() const; xml_attribute attribute() const; - + // Get parent of contained node/attribute xml_node parent() const; // Safe bool conversion operator operator unspecified_bool_type() const; - + // Borland C++ workaround bool operator!() const; @@ -1260,13 +1321,13 @@ namespace pugi type_sorted, // Sorted by document order (ascending) type_sorted_reverse // Sorted by document order (descending) }; - + // Constant iterator type typedef const xpath_node* const_iterator; // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work typedef const xpath_node* iterator; - + // Default constructor. Constructs empty set. xpath_node_set(); @@ -1275,49 +1336,49 @@ namespace pugi // Destructor ~xpath_node_set(); - + // Copy constructor/assignment operator xpath_node_set(const xpath_node_set& ns); xpath_node_set& operator=(const xpath_node_set& ns); - #if __cplusplus >= 201103 + #ifdef PUGIXML_HAS_MOVE // Move semantics support - xpath_node_set(xpath_node_set&& rhs); - xpath_node_set& operator=(xpath_node_set&& rhs); + xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; + xpath_node_set& operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; #endif // Get collection type type_t type() const; - + // Get collection size size_t size() const; // Indexing operator const xpath_node& operator[](size_t index) const; - + // Collection iterators const_iterator begin() const; const_iterator end() const; // Sort the collection in ascending/descending order by document order void sort(bool reverse = false); - + // Get first node in the collection by document order xpath_node first() const; - + // Check if collection is empty bool empty() const; - + private: type_t _type; - + xpath_node _storage; - + xpath_node* _begin; xpath_node* _end; void _assign(const_iterator begin, const_iterator end, type_t type); - void _move(xpath_node_set& rhs); + void _move(xpath_node_set& rhs) PUGIXML_NOEXCEPT; }; #endif @@ -1325,7 +1386,7 @@ namespace pugi // Convert wide string to UTF8 std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const wchar_t* str); std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const std::basic_string, std::allocator >& str); - + // Convert UTF8 to wide string std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const char* str); std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const std::basic_string, std::allocator >& str); @@ -1333,13 +1394,13 @@ namespace pugi // Memory allocation function interface; returns pointer to allocated memory or NULL on failure typedef void* (*allocation_function)(size_t size); - + // Memory deallocation function interface typedef void (*deallocation_function)(void* ptr); // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions. void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate); - + // Get current memory management functions allocation_function PUGIXML_FUNCTION get_memory_allocation_function(); deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function(); @@ -1375,7 +1436,7 @@ namespace std #endif /** - * Copyright (c) 2006-2015 Arseny Kapoulkine + * Copyright (c) 2006-2018 Arseny Kapoulkine * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -1388,7 +1449,7 @@ namespace std * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/lib/pugixml/readme.txt b/lib/pugixml/readme.txt index faa41d37..5beb08a9 100644 --- a/lib/pugixml/readme.txt +++ b/lib/pugixml/readme.txt @@ -1,6 +1,6 @@ -pugixml 1.6 - an XML processing library +pugixml 1.9 - an XML processing library -Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) +Copyright (C) 2006-2018, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) Report bugs and download new versions at http://pugixml.org/ This is the distribution of pugixml, which is a C++ XML processing library, @@ -28,7 +28,7 @@ The distribution contains the following folders: This library is distributed under the MIT License: -Copyright (c) 2006-2015 Arseny Kapoulkine +Copyright (c) 2006-2018 Arseny Kapoulkine Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/lib/serialisation/XmlIO.cc b/lib/serialisation/XmlIO.cc index 8ac7422c..291b8ad1 100644 --- a/lib/serialisation/XmlIO.cc +++ b/lib/serialisation/XmlIO.cc @@ -54,6 +54,11 @@ void XmlWriter::push(const string &s) node_ = node_.append_child(s.c_str()); } +void XmlWriter::pushXmlString(const std::string &s) +{ + +} + void XmlWriter::pop(void) { node_ = node_.parent(); @@ -65,40 +70,47 @@ std::string XmlWriter::XmlString(void) return oss.str(); } -XmlReader::XmlReader(const char *xmlstring,string toplev) : fileName_("") -{ - pugi::xml_parse_result result; - result = doc_.load_string(xmlstring); - if ( !result ) { - cerr << "XML error description (from char *): " << result.description() << "\nXML\n"<< xmlstring << "\n"; - cerr << "XML error offset (from char *) " << result.offset << "\nXML\n"<< xmlstring <<"\n"; - abort(); - } - if ( toplev == std::string("") ) { - node_ = doc_; - } else { - node_ = doc_.child(toplev.c_str()); - } -} - // Reader implementation /////////////////////////////////////////////////////// -XmlReader::XmlReader(const string &fileName,string toplev) : fileName_(fileName) +void XmlReader::initDoc(const std::string &toplev) { - pugi::xml_parse_result result; - result = doc_.load_file(fileName_.c_str()); - if ( !result ) { - cerr << "XML error description: " << result.description() <<" "<< fileName_ <<"\n"; - cerr << "XML error offset : " << result.offset <<" "<< fileName_ <<"\n"; - abort(); - } if ( toplev == std::string("") ) { - node_ = doc_; + node_ = doc_; } else { node_ = doc_.child(toplev.c_str()); } } -bool XmlReader::push(const string &s) +XmlReader::XmlReader(const char *xmlstring, const std::string toplev) +: fileName_("") +{ + auto result = doc_.load_string(xmlstring); + + if ( !result ) { + std::cerr << "XML error description (from char *): " + << result.description() << "\nXML\n"<< xmlstring << "\n"; + std::cerr << "XML error offset (from char *) " + << result.offset << "\nXML\n"<< xmlstring << std::endl; + abort(); + } + initDoc(toplev); +} + +XmlReader::XmlReader(const std::string &fileName, std::string toplev) +: fileName_(fileName) +{ + auto result = doc_.load_file(fileName_.c_str()); + + if ( !result ) { + std::cerr << "XML error description: " + << result.description() <<" "<< fileName_ <<"\n"; + std::cerr << "XML error offset : " + << result.offset <<" "<< fileName_ << std::endl; + abort(); + } + initDoc(toplev); +} + +bool XmlReader::push(const std::string &s) { if (node_.child(s.c_str())) { @@ -129,7 +141,6 @@ bool XmlReader::nextElement(const std::string &s) { return false; } - } template <> diff --git a/lib/serialisation/XmlIO.h b/lib/serialisation/XmlIO.h index e37eb8d9..799c5883 100644 --- a/lib/serialisation/XmlIO.h +++ b/lib/serialisation/XmlIO.h @@ -47,9 +47,10 @@ namespace Grid class XmlWriter: public Writer { public: - XmlWriter(const std::string &fileName,std::string toplev = std::string("grid") ); + XmlWriter(const std::string &fileName, std::string toplev = std::string("grid") ); virtual ~XmlWriter(void); void push(const std::string &s); + void pushXmlString(const std::string &s); void pop(void); template void writeDefault(const std::string &s, const U &x); @@ -65,8 +66,8 @@ namespace Grid class XmlReader: public Reader { public: - XmlReader(const char *xmlstring,std::string toplev = std::string("grid") ); - XmlReader(const std::string &fileName,std::string toplev = std::string("grid") ); + XmlReader(const char *xmlstring, std::string toplev = std::string("grid") ); + XmlReader(const std::string &fileName, std::string toplev = std::string("grid") ); virtual ~XmlReader(void) = default; bool push(const std::string &s); void pop(void); @@ -75,6 +76,8 @@ namespace Grid void readDefault(const std::string &s, U &output); template void readDefault(const std::string &s, std::vector &output); + private: + void initDoc(const std::string &toplev); private: pugi::xml_document doc_; pugi::xml_node node_; From 1569a374a986334775513c4882d406a610855ad8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 18:32:14 +0100 Subject: [PATCH 245/620] XML interface polish, XML fragments can be pushed into a writer --- lib/parallelIO/IldgIO.h | 19 +++++------ lib/serialisation/XmlIO.cc | 65 ++++++++++++++++++++------------------ lib/serialisation/XmlIO.h | 7 ++-- 3 files changed, 48 insertions(+), 43 deletions(-) diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index d1a684f3..90c05546 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -248,7 +248,6 @@ class GridLimeReader : public BinaryIO { template void readLimeObject(serialisable_object &object,std::string object_name,std::string record_name) { - std::string xmlstring; // should this be a do while; can we miss a first record?? while ( limeReaderNextRecord(LimeR) == LIME_SUCCESS ) { @@ -262,7 +261,8 @@ class GridLimeReader : public BinaryIO { limeReaderReadData((void *)&xmlc[0], &nbytes, LimeR); // std::cout << GridLogMessage<< " readLimeObject matches XML " << &xmlc[0] < using namespace Grid; using namespace std; +void Grid::xmlCheckParse(const pugi::xml_parse_result &result, const std::string name) +{ + if (!result) + { + std::cerr << "XML parsing error for " << name << std::endl; + std::cerr << "XML error description: " << result.description() << std::endl; + std::cerr << "XML error offset : " << result.offset << std::endl; + abort(); + } +} + // Writer implementation /////////////////////////////////////////////////////// XmlWriter::XmlWriter(const string &fileName, string toplev) : fileName_(fileName) { @@ -56,7 +67,14 @@ void XmlWriter::push(const string &s) void XmlWriter::pushXmlString(const std::string &s) { + pugi::xml_document doc; + auto result = doc.load_buffer(s.c_str(), s.size()); + xmlCheckParse(result, "fragment\n'" + s +"'"); + for (pugi::xml_node child = doc.first_child(); child; child = child.next_sibling()) + { + node_ = node_.append_copy(child); + } } void XmlWriter::pop(void) @@ -71,8 +89,23 @@ std::string XmlWriter::XmlString(void) } // Reader implementation /////////////////////////////////////////////////////// -void XmlReader::initDoc(const std::string &toplev) +XmlReader::XmlReader(const std::string &s, const bool isBuffer, + std::string toplev) { + pugi::xml_parse_result result; + + if (isBuffer) + { + fileName_ = ""; + result = doc_.load_string(s.c_str()); + xmlCheckParse(result, "string\n'" + s + "'"); + } + else + { + fileName_ = s; + result = doc_.load_file(s.c_str()); + xmlCheckParse(result, "file '" + fileName_ + "'"); + } if ( toplev == std::string("") ) { node_ = doc_; } else { @@ -80,36 +113,6 @@ void XmlReader::initDoc(const std::string &toplev) } } -XmlReader::XmlReader(const char *xmlstring, const std::string toplev) -: fileName_("") -{ - auto result = doc_.load_string(xmlstring); - - if ( !result ) { - std::cerr << "XML error description (from char *): " - << result.description() << "\nXML\n"<< xmlstring << "\n"; - std::cerr << "XML error offset (from char *) " - << result.offset << "\nXML\n"<< xmlstring << std::endl; - abort(); - } - initDoc(toplev); -} - -XmlReader::XmlReader(const std::string &fileName, std::string toplev) -: fileName_(fileName) -{ - auto result = doc_.load_file(fileName_.c_str()); - - if ( !result ) { - std::cerr << "XML error description: " - << result.description() <<" "<< fileName_ <<"\n"; - std::cerr << "XML error offset : " - << result.offset <<" "<< fileName_ << std::endl; - abort(); - } - initDoc(toplev); -} - bool XmlReader::push(const std::string &s) { if (node_.child(s.c_str())) diff --git a/lib/serialisation/XmlIO.h b/lib/serialisation/XmlIO.h index 799c5883..673b2f46 100644 --- a/lib/serialisation/XmlIO.h +++ b/lib/serialisation/XmlIO.h @@ -43,6 +43,7 @@ Author: paboyle namespace Grid { + void xmlCheckParse(const pugi::xml_parse_result &result, const std::string name); class XmlWriter: public Writer { @@ -66,8 +67,8 @@ namespace Grid class XmlReader: public Reader { public: - XmlReader(const char *xmlstring, std::string toplev = std::string("grid") ); - XmlReader(const std::string &fileName, std::string toplev = std::string("grid") ); + XmlReader(const std::string &fileName, const bool isBuffer = false, + std::string toplev = std::string("grid") ); virtual ~XmlReader(void) = default; bool push(const std::string &s); void pop(void); @@ -77,7 +78,7 @@ namespace Grid template void readDefault(const std::string &s, std::vector &output); private: - void initDoc(const std::string &toplev); + void checkParse(const pugi::xml_parse_result &result, const std::string name); private: pugi::xml_document doc_; pugi::xml_node node_; From f117552334824b992a33c7559f9d8868ec3d7860 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 18:38:46 +0100 Subject: [PATCH 246/620] post-merge fix --- lib/serialisation/XmlIO.cc | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/lib/serialisation/XmlIO.cc b/lib/serialisation/XmlIO.cc index f4a5dbdc..bb2b9007 100644 --- a/lib/serialisation/XmlIO.cc +++ b/lib/serialisation/XmlIO.cc @@ -95,22 +95,6 @@ std::string XmlWriter::string(void) return oss.str(); } -XmlReader::XmlReader(const char *xmlstring,std::string toplev) : fileName_("") -{ - pugi::xml_parse_result result; - result = doc_.load_string(xmlstring); - if ( !result ) { - std::cerr << "XML error description (from char *): " << result.description() << "\nXML\n"<< xmlstring << "\n"; - std::cerr << "XML error offset (from char *) " << result.offset << "\nXML\n"<< xmlstring <<"\n"; - abort(); - } - if ( toplev == std::string("") ) { - node_ = doc_; - } else { - node_ = doc_.child(toplev.c_str()); - } -} - // Reader implementation /////////////////////////////////////////////////////// XmlReader::XmlReader(const std::string &s, const bool isBuffer, std::string toplev) From 6b7228b3e649d26e63030fd9458f485804dede3c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 19:29:53 +0100 Subject: [PATCH 247/620] Hadrons: better metadata for eigenpack --- extras/Hadrons/EigenPack.hpp | 15 +++++++------- extras/Hadrons/Module.hpp | 6 +++--- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 4 ++-- lib/parallelIO/IldgIO.h | 20 +++++++++++-------- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index df180e9b..a0bdbf04 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -44,11 +44,9 @@ class EigenPack { public: typedef F Field; - struct PackRecord: Serializable + struct PackRecord { - GRID_SERIALIZABLE_CLASS_MEMBERS(PackRecord, - std::string, operatorPar, - std::string, solverPar); + std::string operatorXml, solverXml; }; struct VecRecord: Serializable { @@ -116,7 +114,7 @@ protected: ScidacReader binReader; binReader.open(filename); - binReader.readScidacFileRecord(evec[0]._grid, record); + binReader.skipPastObjectRecord(SCIDAC_FILE_XML); for(int k = 0; k < size; ++k) { VecRecord vecRecord; @@ -136,10 +134,13 @@ protected: void basicWrite(const std::string filename, std::vector &evec, const unsigned int size) { - ScidacWriter binWriter(evec[0]._grid->IsBoss()); + ScidacWriter binWriter(evec[0]._grid->IsBoss()); + XmlWriter xmlWriter("", ""); + xmlWriter.pushXmlString(record.operatorXml); + xmlWriter.pushXmlString(record.solverXml); + binWriter.writeLimeObject(1, 1, xmlWriter, "parameters", SCIDAC_FILE_XML); binWriter.open(filename); - binWriter.writeScidacFileRecord(evec[0]._grid, record); for(int k = 0; k < size; ++k) { VecRecord vecRecord; diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 08cf49a2..583f1111 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -256,11 +256,11 @@ void Module

::saveParameters(XmlWriter &writer, const std::string name) template std::string Module

::parString(void) const { - std::ostringstream s; + XmlWriter writer("", ""); - s << par(); + write(writer, par_.SerialisableClassName(), par_); - return s.str(); + return writer.string(); } template diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index f4333f80..2b7c1049 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -148,8 +148,8 @@ void TLocalCoherenceLanczos::execute(void) auto &coarsePar = par().coarseParams; auto &epack = envGetDerived(BasePack, CoarsePack, getName()); - epack.record.operatorPar = vm().getModule(par().action)->parString(); - epack.record.solverPar = parString(); + epack.record.operatorXml = vm().getModule(par().action)->parString(); + epack.record.solverXml = parString(); envGetTmp(LCL, solver); LOG(Message) << "Performing fine grid IRL -- Nstop= " << finePar.Nstop << ", Nk= " << finePar.Nk << ", Nm= " diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index 314c5c33..3eb55d7d 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -320,16 +320,11 @@ class GridLimeWriter : public BinaryIO //////////////////////////////////////////// // Write a generic serialisable object //////////////////////////////////////////// - template - void writeLimeObject(int MB,int ME,serialisable_object &object,std::string object_name,std::string record_name) + void writeLimeObject(int MB,int ME,XmlWriter &writer,std::string object_name,std::string record_name) { if ( boss_node ) { - std::string xmlstring; - { - XmlWriter WR("",""); - write(WR,object_name,object); - xmlstring = WR.docString(); - } + std::string xmlstring = writer.docString(); + // std::cout << "WriteLimeObject" << record_name < + void writeLimeObject(int MB,int ME,serialisable_object &object,std::string object_name,std::string record_name) + { + XmlWriter WR("",""); + + write(WR,object_name,object); + writeLimeObject(MB, ME, WR, object_name, record_name); + } //////////////////////////////////////////////////// // Write a generic lattice field and csum // This routine is Collectively called by all nodes From 7c9b0dd84246de48ca5ab4e329d5e9ff516828b1 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 19:32:22 +0100 Subject: [PATCH 248/620] Hadrons: top level name for eigenpack metadata --- extras/Hadrons/EigenPack.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index a0bdbf04..71e0c0f1 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -135,7 +135,7 @@ protected: const unsigned int size) { ScidacWriter binWriter(evec[0]._grid->IsBoss()); - XmlWriter xmlWriter("", ""); + XmlWriter xmlWriter("", "eigenPackPar"); xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); From a16bbecb8a9d53f6ccc55342e8b4db656ddd442b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 19:38:20 +0100 Subject: [PATCH 249/620] Hadrons: more feedback --- extras/Hadrons/EigenPack.hpp | 2 ++ extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 71e0c0f1..a76d02f7 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -119,6 +119,7 @@ protected: { VecRecord vecRecord; + LOG(Message) << "Reading eigenvector " << k << std::endl; binReader.readScidacFieldRecord(evec[k], vecRecord); if (vecRecord.index != k) { @@ -147,6 +148,7 @@ protected: vecRecord.index = k; vecRecord.eval = eval[k]; + LOG(Message) << "Writing eigenvector " << k << std::endl; binWriter.writeScidacFieldRecord(evec[k], vecRecord); } binWriter.close(); diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index a47bb67e..6e4fbba6 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -152,6 +152,9 @@ void TRBPrecCG::setup(void) { auto &epack = envGetDerived(EPack, CoarseEPack, par().eigenPack); + LOG(Message) << "using low-mode deflation with coarse eigenpack '" + << par().eigenPack << "' (" + << epack.evecCoarse.size() << " modes)" << std::endl; guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse, epack.evalCoarse)); } @@ -159,6 +162,9 @@ void TRBPrecCG::setup(void) { auto &epack = envGet(EPack, par().eigenPack); + LOG(Message) << "using low-mode deflation with eigenpack '" + << par().eigenPack << "' (" + << epack.evec.size() << " modes)" << std::endl; guesser.reset(new FineGuesser(epack.evec, epack.eval)); } } From 17f27b1ebd097159502af0684908e8cd656dd895 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 22:52:11 +0100 Subject: [PATCH 250/620] Hadrons: eigenpack writer fix --- extras/Hadrons/EigenPack.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index a76d02f7..5f403595 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -140,8 +140,8 @@ protected: xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); - binWriter.writeLimeObject(1, 1, xmlWriter, "parameters", SCIDAC_FILE_XML); binWriter.open(filename); + binWriter.writeLimeObject(1, 1, xmlWriter, "parameters", SCIDAC_FILE_XML); for(int k = 0; k < size; ++k) { VecRecord vecRecord; From c8d4d184ee832ecdebe656cd4c17db13509cf455 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 6 Apr 2018 22:53:01 +0100 Subject: [PATCH 251/620] XML push fragment fix --- lib/serialisation/XmlIO.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/serialisation/XmlIO.cc b/lib/serialisation/XmlIO.cc index 050ca6ff..62f2e58c 100644 --- a/lib/serialisation/XmlIO.cc +++ b/lib/serialisation/XmlIO.cc @@ -75,6 +75,7 @@ void XmlWriter::pushXmlString(const std::string &s) { node_ = node_.append_copy(child); } + pop(); } void XmlWriter::pop(void) From 4573b34cac473d0e1b2c72ad6b9145d525366a02 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 13 Apr 2018 18:21:00 +0200 Subject: [PATCH 252/620] Hadrons: scalar SU(N) 2-pt functions with momentum --- .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 70 +++++++++++++++---- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 5227e95a..5ec56714 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -45,6 +45,7 @@ class TwoPointPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointPar, std::vector, op, + std::vector, mom, std::string, output); }; @@ -52,14 +53,17 @@ template class TTwoPoint: public Module { public: - typedef typename SImpl::Field Field; - typedef typename SImpl::ComplexField ComplexField; + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + typedef std::vector SlicedOp; + class Result: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, std::string, sink, std::string, source, + std::vector, mom, std::vector, data); }; public: @@ -79,6 +83,8 @@ private: template std::vector makeTwoPoint(const std::vector &sink, const std::vector &source); +private: + std::vector> mom_; }; MODULE_REGISTER_NS(TwoPointSU2, TTwoPoint>, MScalarSUN); @@ -115,9 +121,19 @@ std::vector TTwoPoint::getOutput(void) template void TTwoPoint::setup(void) { - const unsigned int nt = env().getDim().back(); - envTmp(std::vector>, "slicedOp", 1, par().op.size(), - std::vector(nt)); + const unsigned int nd = env().getDim().size(); + + mom_.resize(par().mom.size()); + for (unsigned int i = 0; i < mom_.size(); ++i) + { + mom_[i] = strToVec(par().mom[i]); + if (mom_[i].size() != nd - 1) + { + HADRON_ERROR(Size, "momentum number of components different from " + + std::to_string(nd-1)); + } + } + envTmpLat(ComplexField, "ftBuf"); } // execution /////////////////////////////////////////////////////////////////// @@ -130,24 +146,48 @@ void TTwoPoint::execute(void) LOG(Message) << " '" << o << "'" << std::endl; } - const unsigned int nd = env().getDim().size(); - std::vector result; - - envGetTmp(std::vector>, slicedOp); - for (unsigned int i = 0; i < par().op.size(); ++i) + const unsigned int nd = env().getDim().size(); + const unsigned int nt = env().getDim().back(); + const unsigned int nop = par().op.size(); + const unsigned int nmom = mom_.size(); + std::vector dMask(nd, 1); + std::vector result; + std::vector> slicedOp(nop); + FFT fft(env().getGrid()); + + envGetTmp(ComplexField, ftBuf); + dMask[nd - 1] = 0; + for (unsigned int i = 0; i < nop; ++i) { auto &op = envGet(ComplexField, par().op[i]); - sliceSum(op, slicedOp[i], nd - 1); + slicedOp[i].resize(nmom); + LOG(Message) << "Operator '" << par().op[i] << "' FFT" << std::endl; + fft.FFT_dim_mask(ftBuf, op, dMask, FFT::forward); + for (unsigned int m = 0; m < nmom; ++m) + { + auto qt = mom_[m]; + + qt.resize(nd); + slicedOp[i][m].resize(nt); + for (unsigned int t = 0; t < nt; ++t) + { + qt[nd - 1] = t; + peekSite(slicedOp[i][m][t], ftBuf, qt); + } + } } - for (unsigned int i = 0; i < par().op.size(); ++i) - for (unsigned int j = 0; j < par().op.size(); ++j) + LOG(Message) << "Making contractions" << std::endl; + for (unsigned int m = 0; m < nmom; ++m) + for (unsigned int i = 0; i < nop; ++i) + for (unsigned int j = 0; j < nop; ++j) { Result r; r.sink = par().op[i]; r.source = par().op[j]; - r.data = makeTwoPoint(slicedOp[i], slicedOp[j]); + r.mom = mom_[m]; + r.data = makeTwoPoint(slicedOp[i][m], slicedOp[j][m]); result.push_back(r); } saveResult(par().output, "twopt", result); @@ -169,7 +209,7 @@ std::vector TTwoPoint::makeTwoPoint( { for (unsigned int t = 0; t < nt; ++t) { - res[dt] += TensorRemove(trace(sink[(t+dt)%nt]*source[t])); + res[dt] += TensorRemove(trace(sink[(t+dt)%nt]*adj(source[t]))); } res[dt] *= 1./static_cast(nt); } From 4669ecd4bab0ec393f745b7cb179ca850d355449 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 13 Apr 2018 18:21:18 +0200 Subject: [PATCH 253/620] Hadrons: build improvement --- extras/Hadrons/Application.cc | 1 + extras/Hadrons/Application.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 8b2aba4a..4c7e71f2 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -28,6 +28,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include +#include using namespace Grid; using namespace QCD; diff --git a/extras/Hadrons/Application.hpp b/extras/Hadrons/Application.hpp index 8cd15433..0254f2fc 100644 --- a/extras/Hadrons/Application.hpp +++ b/extras/Hadrons/Application.hpp @@ -31,7 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include -#include +#include BEGIN_HADRONS_NAMESPACE From 334da7f45262cb119aa9464261d0ecb47a6c5f90 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 13 Apr 2018 18:45:31 +0200 Subject: [PATCH 254/620] Hadrons: can trace which module is throwing an error --- extras/Hadrons/HadronsXmlRun.cc | 12 +++++++++++- extras/Hadrons/VirtualMachine.cc | 13 +++++++++++-- extras/Hadrons/VirtualMachine.hpp | 9 +++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/extras/Hadrons/HadronsXmlRun.cc b/extras/Hadrons/HadronsXmlRun.cc index 4fcfabf2..26e56f7d 100644 --- a/extras/Hadrons/HadronsXmlRun.cc +++ b/extras/Hadrons/HadronsXmlRun.cc @@ -69,7 +69,17 @@ int main(int argc, char *argv[]) } catch (const std::exception& e) { - LOG(Error) << "FATAL ERROR -- Exception " << typeName(&typeid(e)) << std::endl; + auto &vm = VirtualMachine::getInstance(); + int mod = vm.getCurrentModule(); + + LOG(Error) << "FATAL ERROR -- Exception " << typeName(&typeid(e)) + << std::endl; + if (mod >= 0) + { + LOG(Error) << "During execution of module '" + << vm.getModuleName(mod) << "' (address " << mod << ")" + << std::endl; + } LOG(Error) << e.what() << std::endl; LOG(Error) << "Aborting program" << std::endl; Grid_finalize(); diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index 2b7f9620..a96df622 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -250,6 +250,11 @@ std::string VirtualMachine::getModuleNamespace(const std::string name) const return getModuleNamespace(getModuleAddress(name)); } +int VirtualMachine::getCurrentModule(void) const +{ + return currentModule_; +} + bool VirtualMachine::hasModule(const unsigned int address) const { return (address < module_.size()); @@ -468,7 +473,9 @@ void VirtualMachine::memoryProfile(const unsigned int address) << "' (" << address << ")..." << std::endl; try { + currentModule_ = address; m->setup(); + currentModule_ = -1; updateProfile(address); } catch (Exceptions::Definition &) @@ -622,7 +629,7 @@ VirtualMachine::Program VirtualMachine::schedule(const GeneticPar &par) #define SEP "---------------" #define MEM_MSG(size) sizeString(size) -void VirtualMachine::executeProgram(const Program &p) const +void VirtualMachine::executeProgram(const Program &p) { Size memPeak = 0, sizeBefore, sizeAfter; GarbageSchedule freeProg; @@ -650,7 +657,9 @@ void VirtualMachine::executeProgram(const Program &p) const LOG(Message) << SEP << " Measurement step " << i + 1 << "/" << p.size() << " (module '" << module_[p[i]].name << "') " << SEP << std::endl; + currentModule_ = p[i]; (*module_[p[i]].data)(); + currentModule_ = -1; sizeBefore = env().getTotalSize(); // print used memory after execution LOG(Message) << "Allocated objects: " << MEM_MSG(sizeBefore) @@ -679,7 +688,7 @@ void VirtualMachine::executeProgram(const Program &p) const } } -void VirtualMachine::executeProgram(const std::vector &p) const +void VirtualMachine::executeProgram(const std::vector &p) { Program pAddress; diff --git a/extras/Hadrons/VirtualMachine.hpp b/extras/Hadrons/VirtualMachine.hpp index 68eeb0c0..153f8d70 100644 --- a/extras/Hadrons/VirtualMachine.hpp +++ b/extras/Hadrons/VirtualMachine.hpp @@ -114,6 +114,7 @@ public: std::string getModuleType(const std::string name) const; std::string getModuleNamespace(const unsigned int address) const; std::string getModuleNamespace(const std::string name) const; + int getCurrentModule(void) const; bool hasModule(const unsigned int address) const; bool hasModule(const std::string name) const; // print VM content @@ -133,8 +134,8 @@ public: // genetic scheduler Program schedule(const GeneticPar &par); // general execution - void executeProgram(const Program &p) const; - void executeProgram(const std::vector &p) const; + void executeProgram(const Program &p); + void executeProgram(const std::vector &p); private: // environment shortcut DEFINE_ENV_ALIAS; @@ -154,13 +155,13 @@ private: // module and related maps std::vector module_; std::map moduleAddress_; - std::string currentModule_{""}; + int currentModule_{-1}; // module graph bool graphOutdated_{true}; Graph graph_; // memory profile bool memoryProfileOutdated_{true}; - MemoryProfile profile_; + MemoryProfile profile_; }; /****************************************************************************** From ddcaa6ad299fecc457e0eefb784e75d2d994e3ee Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 17 Apr 2018 10:48:33 +0100 Subject: [PATCH 255/620] Master does header on Nersc --- lib/parallelIO/NerscIO.h | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/parallelIO/NerscIO.h b/lib/parallelIO/NerscIO.h index e2c2bc39..0eb52071 100644 --- a/lib/parallelIO/NerscIO.h +++ b/lib/parallelIO/NerscIO.h @@ -237,20 +237,24 @@ namespace Grid { MachineCharacteristics(header); uint64_t offset; - - truncate(file); // Sod it -- always write 3x3 double header.floating_point = std::string("IEEE64BIG"); header.data_type = std::string("4D_SU3_GAUGE_3x3"); GaugeSimpleUnmunger munge; - offset = writeHeader(header,file); + if ( grid->IsBoss() ) { + truncate(file); + offset = writeHeader(header,file); + } + grid->Broadcast(0,(void *)&offset,sizeof(offset)); uint32_t nersc_csum,scidac_csuma,scidac_csumb; BinaryIO::writeLatticeObject(Umu,file,munge,offset,header.floating_point, nersc_csum,scidac_csuma,scidac_csumb); header.checksum = nersc_csum; - writeHeader(header,file); + if ( grid->IsBoss() ) { + writeHeader(header,file); + } std::cout<IsBoss() ) { + truncate(file); + offset = writeHeader(header,file); + } + grid->Broadcast(0,(void *)&offset,sizeof(offset)); + uint32_t nersc_csum,scidac_csuma,scidac_csumb; BinaryIO::writeRNG(serial,parallel,file,offset,nersc_csum,scidac_csuma,scidac_csumb); header.checksum = nersc_csum; - offset = writeHeader(header,file); + if ( grid->IsBoss() ) { + offset = writeHeader(header,file); + } std::cout< Date: Wed, 18 Apr 2018 01:43:29 +0100 Subject: [PATCH 256/620] physical fermion interface, cshift benchmark in SU3. --- benchmarks/Benchmark_su3.cc | 44 ++++++++++++++++++++--- lib/qcd/action/fermion/CayleyFermion5D.cc | 29 +++++++++++++++ lib/qcd/action/fermion/CayleyFermion5D.h | 5 +++ lib/qcd/action/fermion/FermionOperator.h | 13 +++++++ 4 files changed, 86 insertions(+), 5 deletions(-) diff --git a/benchmarks/Benchmark_su3.cc b/benchmarks/Benchmark_su3.cc index 035af2d9..628ad5bd 100644 --- a/benchmarks/Benchmark_su3.cc +++ b/benchmarks/Benchmark_su3.cc @@ -35,7 +35,8 @@ using namespace Grid::QCD; int main (int argc, char ** argv) { Grid_init(&argc,&argv); -#define LMAX (64) +#define LMAX (40) +#define LINC (4) int64_t Nloop=20; @@ -51,7 +52,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -83,7 +84,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -114,7 +115,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -145,7 +146,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -170,5 +171,38 @@ int main (int argc, char ** argv) } + + std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); + int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(std::vector({45,12,81,9})); + + LatticeColourMatrix z(&Grid); random(pRNG,z); + LatticeColourMatrix x(&Grid); random(pRNG,x); + LatticeColourMatrix y(&Grid); random(pRNG,y); + + for(int mu=0;mu<=4;mu++){ + double start=usecond(); + for(int64_t i=0;i +void CayleyFermion5D::ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d) +{ + int Ls = this->Ls; + FermionField tmp(this->FermionGrid()); + tmp = solution5d; + conformable(solution5d._grid,this->FermionGrid()); + conformable(exported4d._grid,this->GaugeGrid()); + axpby_ssp_pminus(tmp, 0., solution5d, 1., solution5d, 0, 0); + axpby_ssp_pplus (tmp, 1., tmp , 1., solution5d, 0, Ls-1); + ExtractSlice(exported4d, tmp, 0, 0); +} +template +void CayleyFermion5D::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d) +{ + int Ls = this->Ls; + FermionField tmp(this->FermionGrid()); + conformable(imported5d._grid,this->FermionGrid()); + conformable(input4d._grid ,this->GaugeGrid()); + tmp = zero; + InsertSlice(input4d, tmp, 0 , 0); + InsertSlice(input4d, tmp, Ls-1, 0); + axpby_ssp_pplus (tmp, 0., tmp, 1., tmp, 0, 0); + axpby_ssp_pminus(tmp, 0., tmp, 1., tmp, Ls-1, Ls-1); + Dminus(tmp,imported5d); +} template void CayleyFermion5D::Dminus(const FermionField &psi, FermionField &chi) { diff --git a/lib/qcd/action/fermion/CayleyFermion5D.h b/lib/qcd/action/fermion/CayleyFermion5D.h index ef75235a..b370b09d 100644 --- a/lib/qcd/action/fermion/CayleyFermion5D.h +++ b/lib/qcd/action/fermion/CayleyFermion5D.h @@ -83,8 +83,13 @@ namespace Grid { virtual void M5D (const FermionField &psi, FermionField &chi); virtual void M5Ddag(const FermionField &psi, FermionField &chi); + /////////////////////////////////////////////////////////////// + // Physical surface field utilities + /////////////////////////////////////////////////////////////// virtual void Dminus(const FermionField &psi, FermionField &chi); virtual void DminusDag(const FermionField &psi, FermionField &chi); + virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d); + virtual void ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d); ///////////////////////////////////////////////////// // Instantiate different versions depending on Impl diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index 1d395d53..5be36f13 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -128,6 +128,19 @@ namespace Grid { std::vector mom, unsigned int tmin, unsigned int tmax)=0; + /////////////////////////////////////////////// + // Physical field import/export + /////////////////////////////////////////////// + virtual void Dminus(const FermionField &psi, FermionField &chi) { chi=psi; } + virtual void DminusDag(const FermionField &psi, FermionField &chi) { chi=psi; } + virtual void ImportPhysicalFermionSource(const FermionField &input,FermionField &imported) + { + imported = input; + }; + virtual void ExportPhysicalFermionSolution(const FermionField &solution,FermionField &exported) + { + exported=solution; + }; }; } From 870b1a85aebc8bf545a162053fb04823fd937fa2 Mon Sep 17 00:00:00 2001 From: paboyle Date: Wed, 18 Apr 2018 14:17:49 +0100 Subject: [PATCH 257/620] Think I have the physical prop interface to CF and PF overlap right, but need a strong check/regression. Only support Hw overlap, not Ht for now. Ht needs a new Dminus implemented. --- .../fermion/ContinuedFractionFermion5D.cc | 21 +++++++++++++++++++ .../fermion/ContinuedFractionFermion5D.h | 8 +++++++ .../fermion/PartialFractionFermion5D.cc | 21 +++++++++++++++++++ .../action/fermion/PartialFractionFermion5D.h | 6 ++++++ 4 files changed, 56 insertions(+) diff --git a/lib/qcd/action/fermion/ContinuedFractionFermion5D.cc b/lib/qcd/action/fermion/ContinuedFractionFermion5D.cc index 5d39ef9b..f6857115 100644 --- a/lib/qcd/action/fermion/ContinuedFractionFermion5D.cc +++ b/lib/qcd/action/fermion/ContinuedFractionFermion5D.cc @@ -295,6 +295,27 @@ namespace Grid { assert((Ls&0x1)==1); // Odd Ls required } + template + void ContinuedFractionFermion5D::ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d) + { + int Ls = this->Ls; + conformable(solution5d._grid,this->FermionGrid()); + conformable(exported4d._grid,this->GaugeGrid()); + ExtractSlice(exported4d, solution5d, Ls-1, Ls-1); + } + template + void ContinuedFractionFermion5D::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d) + { + int Ls = this->Ls; + conformable(imported5d._grid,this->FermionGrid()); + conformable(input4d._grid ,this->GaugeGrid()); + FermionField tmp(this->FermionGrid()); + tmp=zero; + InsertSlice(input4d, tmp, Ls-1, Ls-1); + tmp=Gamma(Gamma::Algebra::Gamma5)*tmp; + this->Dminus(tmp,imported5d); + } + FermOpTemplateInstantiate(ContinuedFractionFermion5D); } diff --git a/lib/qcd/action/fermion/ContinuedFractionFermion5D.h b/lib/qcd/action/fermion/ContinuedFractionFermion5D.h index e1e50aa5..b551fc28 100644 --- a/lib/qcd/action/fermion/ContinuedFractionFermion5D.h +++ b/lib/qcd/action/fermion/ContinuedFractionFermion5D.h @@ -65,6 +65,14 @@ namespace Grid { // Efficient support for multigrid coarsening virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp); + /////////////////////////////////////////////////////////////// + // Physical surface field utilities + /////////////////////////////////////////////////////////////// + // virtual void Dminus(const FermionField &psi, FermionField &chi); // Inherit trivial case + // virtual void DminusDag(const FermionField &psi, FermionField &chi); // Inherit trivial case + virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d); + virtual void ImportPhysicalFermionSource (const FermionField &input4d,FermionField &imported5d); + // Constructors ContinuedFractionFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, diff --git a/lib/qcd/action/fermion/PartialFractionFermion5D.cc b/lib/qcd/action/fermion/PartialFractionFermion5D.cc index 3a78e043..11840027 100644 --- a/lib/qcd/action/fermion/PartialFractionFermion5D.cc +++ b/lib/qcd/action/fermion/PartialFractionFermion5D.cc @@ -396,6 +396,27 @@ namespace Grid { amax=zolo_hi; } + template + void PartialFractionFermion5D::ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d) + { + int Ls = this->Ls; + conformable(solution5d._grid,this->FermionGrid()); + conformable(exported4d._grid,this->GaugeGrid()); + ExtractSlice(exported4d, solution5d, Ls-1, Ls-1); + } + template + void PartialFractionFermion5D::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d) + { + int Ls = this->Ls; + conformable(imported5d._grid,this->FermionGrid()); + conformable(input4d._grid ,this->GaugeGrid()); + FermionField tmp(this->FermionGrid()); + tmp=zero; + InsertSlice(input4d, tmp, Ls-1, Ls-1); + tmp=Gamma(Gamma::Algebra::Gamma5)*tmp; + this->Dminus(tmp,imported5d); + } + // Constructors template PartialFractionFermion5D::PartialFractionFermion5D(GaugeField &_Umu, diff --git a/lib/qcd/action/fermion/PartialFractionFermion5D.h b/lib/qcd/action/fermion/PartialFractionFermion5D.h index 0ec72de4..91f1bd3c 100644 --- a/lib/qcd/action/fermion/PartialFractionFermion5D.h +++ b/lib/qcd/action/fermion/PartialFractionFermion5D.h @@ -70,6 +70,12 @@ namespace Grid { // Efficient support for multigrid coarsening virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp); + /////////////////////////////////////////////////////////////// + // Physical surface field utilities + /////////////////////////////////////////////////////////////// + virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d); + virtual void ImportPhysicalFermionSource (const FermionField &input4d,FermionField &imported5d); + // Constructors PartialFractionFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, From c11a3ca0a74096ad2eea03487105fbc7924b625a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 20 Apr 2018 17:13:04 +0100 Subject: [PATCH 258/620] vectorise/unvectorise in reverse order --- lib/lattice/Lattice_transfer.h | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 44f0337d..f988f310 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -599,6 +599,51 @@ unvectorizeToLexOrdArray(std::vector &out, const Lattice &in) extract1(in_vobj, out_ptrs, 0); } } + +template +typename std::enable_if::value && !isSIMDvectorized::value, void>::type +unvectorizeToRevLexOrdArray(std::vector &out, const Lattice &in) +{ + + typedef typename vobj::vector_type vtype; + + GridBase* in_grid = in._grid; + out.resize(in_grid->lSites()); + + int ndim = in_grid->Nd(); + int in_nsimd = vtype::Nsimd(); + + std::vector > in_icoor(in_nsimd); + + for(int lane=0; lane < in_nsimd; lane++){ + in_icoor[lane].resize(ndim); + in_grid->iCoorFromIindex(in_icoor[lane], lane); + } + + parallel_for(int in_oidx = 0; in_oidx < in_grid->oSites(); in_oidx++){ //loop over outer index + //Assemble vector of pointers to output elements + std::vector out_ptrs(in_nsimd); + + std::vector in_ocoor(ndim); + in_grid->oCoorFromOindex(in_ocoor, in_oidx); + + std::vector lcoor(in_grid->Nd()); + + for(int lane=0; lane < in_nsimd; lane++){ + for(int mu=0;mu_rdimensions[mu]*in_icoor[lane][mu]; + + int lex; + Lexicographic::IndexFromCoorReversed(lcoor, lex, in_grid->_ldimensions); + out_ptrs[lane] = &out[lex]; + } + + //Unpack into those ptrs + const vobj & in_vobj = in._odata[in_oidx]; + extract1(in_vobj, out_ptrs, 0); + } +} + //Copy SIMD-vectorized lattice to array of scalar objects in lexicographic order template typename std::enable_if::value @@ -648,6 +693,54 @@ vectorizeFromLexOrdArray( std::vector &in, Lattice &out) } } +template +typename std::enable_if::value + && !isSIMDvectorized::value, void>::type +vectorizeFromRevLexOrdArray( std::vector &in, Lattice &out) +{ + + typedef typename vobj::vector_type vtype; + + GridBase* grid = out._grid; + assert(in.size()==grid->lSites()); + + int ndim = grid->Nd(); + int nsimd = vtype::Nsimd(); + + std::vector > icoor(nsimd); + + for(int lane=0; lane < nsimd; lane++){ + icoor[lane].resize(ndim); + grid->iCoorFromIindex(icoor[lane],lane); + } + + parallel_for(uint64_t oidx = 0; oidx < grid->oSites(); oidx++){ //loop over outer index + //Assemble vector of pointers to output elements + std::vector ptrs(nsimd); + + std::vector ocoor(ndim); + grid->oCoorFromOindex(ocoor, oidx); + + std::vector lcoor(grid->Nd()); + + for(int lane=0; lane < nsimd; lane++){ + + for(int mu=0;mu_rdimensions[mu]*icoor[lane][mu]; + } + + int lex; + Lexicographic::IndexFromCoorReversed(lcoor, lex, grid->_ldimensions); + ptrs[lane] = &in[lex]; + } + + //pack from those ptrs + vobj vecobj; + merge1(vecobj, ptrs, 0); + out._odata[oidx] = vecobj; + } +} + //Convert a Lattice from one precision to another template void precisionChange(Lattice &out, const Lattice &in){ From 94edf9cf8be8eb2fe8990db39c3c07c4a38bd71b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 20 Apr 2018 17:13:21 +0100 Subject: [PATCH 259/620] HDF5: direct access to group for custom operations --- lib/serialisation/Hdf5IO.cc | 10 ++++++++++ lib/serialisation/Hdf5IO.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/lib/serialisation/Hdf5IO.cc b/lib/serialisation/Hdf5IO.cc index 1fb7be0c..b915a988 100644 --- a/lib/serialisation/Hdf5IO.cc +++ b/lib/serialisation/Hdf5IO.cc @@ -55,6 +55,11 @@ void Hdf5Writer::writeDefault(const std::string &s, const char *x) writeDefault(s, sx); } +Group & Hdf5Writer::getGroup(void) +{ + return group_; +} + // Reader implementation /////////////////////////////////////////////////////// Hdf5Reader::Hdf5Reader(const std::string &fileName) : fileName_(fileName) @@ -103,3 +108,8 @@ void Hdf5Reader::readDefault(const std::string &s, std::string &x) x.resize(strType.getSize()); attribute.read(strType, &(x[0])); } + +Group & Hdf5Reader::getGroup(void) +{ + return group_; +} diff --git a/lib/serialisation/Hdf5IO.h b/lib/serialisation/Hdf5IO.h index 12625ab8..1ae2791e 100644 --- a/lib/serialisation/Hdf5IO.h +++ b/lib/serialisation/Hdf5IO.h @@ -38,6 +38,7 @@ namespace Grid template typename std::enable_if>::is_number, void>::type writeDefault(const std::string &s, const std::vector &x); + H5NS::Group & getGroup(void); private: template void writeSingleAttribute(const U &x, const std::string &name, @@ -65,6 +66,7 @@ namespace Grid template typename std::enable_if>::is_number, void>::type readDefault(const std::string &s, std::vector &x); + H5NS::Group & getGroup(void); private: template void readSingleAttribute(U &x, const std::string &name, From 141da3ae71b255d0c175016a2e2dc03ee241487a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 20 Apr 2018 17:13:34 +0100 Subject: [PATCH 260/620] function to get tensor dimensions --- lib/serialisation/VectorUtils.h | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lib/serialisation/VectorUtils.h b/lib/serialisation/VectorUtils.h index f5c76b84..53088998 100644 --- a/lib/serialisation/VectorUtils.h +++ b/lib/serialisation/VectorUtils.h @@ -30,6 +30,48 @@ namespace Grid { typedef typename std::vector::type>> type; }; + template + void tensorDim(std::vector &dim, const T &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + } + + template + void tensorDim(std::vector &dim, const iScalar &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + tensorDim(dim, t._internal, false); + } + + template + void tensorDim(std::vector &dim, const iVector &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + dim.push_back(N); + tensorDim(dim, t._internal[0], false); + } + + template + void tensorDim(std::vector &dim, const iMatrix &t, const bool wipe = true) + { + if (wipe) + { + dim.clear(); + } + dim.push_back(N); + dim.push_back(N); + tensorDim(dim, t._internal[0][0], false); + } + template typename TensorToVec::type tensorToVec(const T &t) { From b0b5b34bfff8d3ac85825e56b5af130420c28e6f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 12:48:00 +0100 Subject: [PATCH 261/620] Hadrons: custom abort with module trace --- extras/Hadrons/Exceptions.cc | 24 ++++++++++++++++++++++++ extras/Hadrons/Exceptions.hpp | 4 ++++ extras/Hadrons/HadronsXmlRun.cc | 17 +---------------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/extras/Hadrons/Exceptions.cc b/extras/Hadrons/Exceptions.cc index eedc03b1..e87181b2 100644 --- a/extras/Hadrons/Exceptions.cc +++ b/extras/Hadrons/Exceptions.cc @@ -27,6 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo /* END LEGAL */ #include +#include +#include #ifndef ERR_SUFF #define ERR_SUFF " (" + loc + ")" @@ -47,6 +49,7 @@ CONST_EXC(Definition, Logic("definition error: " + msg, loc)) CONST_EXC(Implementation, Logic("implementation error: " + msg, loc)) CONST_EXC(Range, Logic("range error: " + msg, loc)) CONST_EXC(Size, Logic("size error: " + msg, loc)) + // runtime errors CONST_EXC(Runtime, runtime_error(msg + ERR_SUFF)) CONST_EXC(Argument, Runtime("argument error: " + msg, loc)) @@ -55,3 +58,24 @@ CONST_EXC(Memory, Runtime("memory error: " + msg, loc)) CONST_EXC(Parsing, Runtime("parsing error: " + msg, loc)) CONST_EXC(Program, Runtime("program error: " + msg, loc)) CONST_EXC(System, Runtime("system error: " + msg, loc)) + +// abort functions +void Grid::Hadrons::Exceptions::abort(const std::exception& e) +{ + auto &vm = VirtualMachine::getInstance(); + int mod = vm.getCurrentModule(); + + LOG(Error) << "FATAL ERROR -- Exception " << typeName(&typeid(e)) + << std::endl; + if (mod >= 0) + { + LOG(Error) << "During execution of module '" + << vm.getModuleName(mod) << "' (address " << mod << ")" + << std::endl; + } + LOG(Error) << e.what() << std::endl; + LOG(Error) << "Aborting program" << std::endl; + Grid_finalize(); + + exit(EXIT_FAILURE); +} diff --git a/extras/Hadrons/Exceptions.hpp b/extras/Hadrons/Exceptions.hpp index ce11618a..adf2340f 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/extras/Hadrons/Exceptions.hpp @@ -56,6 +56,7 @@ namespace Exceptions DECL_EXC(Implementation, Logic); DECL_EXC(Range, Logic); DECL_EXC(Size, Logic); + // runtime errors DECL_EXC(Runtime, std::runtime_error); DECL_EXC(Argument, Runtime); @@ -64,6 +65,9 @@ namespace Exceptions DECL_EXC(Parsing, Runtime); DECL_EXC(Program, Runtime); DECL_EXC(System, Runtime); + + // abort functions + void abort(const std::exception& e); } END_HADRONS_NAMESPACE diff --git a/extras/Hadrons/HadronsXmlRun.cc b/extras/Hadrons/HadronsXmlRun.cc index 26e56f7d..6b613bb4 100644 --- a/extras/Hadrons/HadronsXmlRun.cc +++ b/extras/Hadrons/HadronsXmlRun.cc @@ -69,22 +69,7 @@ int main(int argc, char *argv[]) } catch (const std::exception& e) { - auto &vm = VirtualMachine::getInstance(); - int mod = vm.getCurrentModule(); - - LOG(Error) << "FATAL ERROR -- Exception " << typeName(&typeid(e)) - << std::endl; - if (mod >= 0) - { - LOG(Error) << "During execution of module '" - << vm.getModuleName(mod) << "' (address " << mod << ")" - << std::endl; - } - LOG(Error) << e.what() << std::endl; - LOG(Error) << "Aborting program" << std::endl; - Grid_finalize(); - - return EXIT_FAILURE; + Exceptions::abort(e); } // epilogue From c6125b01ceb6957d751fa01abc67ba6a4a1e6651 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 12:48:17 +0100 Subject: [PATCH 262/620] Hadrons: Error and Warning channels always on --- extras/Hadrons/Global.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 0164a1ab..32060460 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -57,8 +57,8 @@ void Hadrons::initLogger(void) GridLogIterative.setChanWidth(cw); GridLogDebug.setChanWidth(cw); GridLogIRL.setChanWidth(cw); - HadronsLogError.Active(GridLogError.isActive()); - HadronsLogWarning.Active(GridLogWarning.isActive()); + HadronsLogError.Active(true); + HadronsLogWarning.Active(true); HadronsLogMessage.Active(GridLogMessage.isActive()); HadronsLogIterative.Active(GridLogIterative.isActive()); HadronsLogDebug.Active(GridLogDebug.isActive()); From 169f405c9cf562de935245e8fc9a5e9a161aba6d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 12:48:34 +0100 Subject: [PATCH 263/620] Hadrons: tests repaired --- tests/hadrons/Test_QED.cc | 1 + tests/hadrons/Test_hadrons.hpp | 1 + tests/hadrons/Test_hadrons_2AS_spectrum.cc | 169 --------------------- tests/hadrons/Test_hadrons_meson_3pt.cc | 1 + tests/hadrons/Test_hadrons_quark.cc | 1 - tests/hadrons/Test_hadrons_spectrum.cc | 1 + tests/hadrons/Test_hadrons_wilsonFund.cc | 1 + 7 files changed, 5 insertions(+), 170 deletions(-) delete mode 100644 tests/hadrons/Test_hadrons_2AS_spectrum.cc diff --git a/tests/hadrons/Test_QED.cc b/tests/hadrons/Test_QED.cc index 3377bf3c..922d67c3 100644 --- a/tests/hadrons/Test_QED.cc +++ b/tests/hadrons/Test_QED.cc @@ -27,6 +27,7 @@ *******************************************************************************/ #include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons.hpp b/tests/hadrons/Test_hadrons.hpp index 67124d6c..fc061459 100644 --- a/tests/hadrons/Test_hadrons.hpp +++ b/tests/hadrons/Test_hadrons.hpp @@ -26,6 +26,7 @@ *******************************************************************************/ #include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons_2AS_spectrum.cc b/tests/hadrons/Test_hadrons_2AS_spectrum.cc deleted file mode 100644 index b3906730..00000000 --- a/tests/hadrons/Test_hadrons_2AS_spectrum.cc +++ /dev/null @@ -1,169 +0,0 @@ -/******************************************************************************* - Grid physics library, www.github.com/paboyle/Grid - - Source file: tests/hadrons/Test_hadrons_spectrum.cc - - Copyright (C) 2015 - - Author: Antonin Portelli - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - See the full license in the file "LICENSE" in the top level distribution - directory. - *******************************************************************************/ - -#include - -using namespace Grid; -using namespace Hadrons; - - - BEGIN_HADRONS_NAMESPACE - BEGIN_MODULE_NAMESPACE(MFermion) - MODULE_REGISTER_NS(GaugeProp2AS, TGaugeProp, MFermion); - END_MODULE_NAMESPACE - BEGIN_MODULE_NAMESPACE(MSource) - MODULE_REGISTER_NS(Point2AS, TPoint, MSource); - END_MODULE_NAMESPACE - BEGIN_MODULE_NAMESPACE(MContraction) - MODULE_REGISTER_NS(Meson2AS, ARG(TMeson), MContraction); -// MODULE_REGISTER_NS(BaryonMultirep, ARG(TBaryon), MContraction); - END_MODULE_NAMESPACE - BEGIN_MODULE_NAMESPACE(MSink) - MODULE_REGISTER_NS(ScalarPoint2AS, TPoint, MSink); - END_MODULE_NAMESPACE - BEGIN_MODULE_NAMESPACE(MSolver) - MODULE_REGISTER_NS(RBPrecCG2AS, TRBPrecCG, MSolver); - END_MODULE_NAMESPACE - BEGIN_MODULE_NAMESPACE(MAction) - MODULE_REGISTER_NS(WilsonClover2AS, TWilsonClover, MAction); - END_MODULE_NAMESPACE - END_HADRONS_NAMESPACE - - -int main(int argc, char *argv[]) -{ - // initialization ////////////////////////////////////////////////////////// - Grid_init(&argc, &argv); - HadronsLogError.Active(GridLogError.isActive()); - HadronsLogWarning.Active(GridLogWarning.isActive()); - HadronsLogMessage.Active(GridLogMessage.isActive()); - HadronsLogIterative.Active(GridLogIterative.isActive()); - HadronsLogDebug.Active(GridLogDebug.isActive()); - LOG(Message) << "Grid initialized" << std::endl; - // run setup /////////////////////////////////////////////////////////////// - Application application; - std::vector flavour = {"l", "s"}; - std::vector mass = {-0.01, -0.04}; - double csw = 1.0; - // global parameters - Application::GlobalPar globalPar; - globalPar.trajCounter.start = 1500; - globalPar.trajCounter.end = 1520; - globalPar.trajCounter.step = 20; - globalPar.seed = "1 2 3 4"; - application.setPar(globalPar); - // gauge field - application.createModule("gauge"); - MSource::Point2AS::Par ptPar; - ptPar.position = "0 0 0 0"; - application.createModule("pt", ptPar); - // sink - MSink::ScalarPoint2AS::Par sinkPar; - sinkPar.mom = "0 0 0"; - application.createModule("sink", sinkPar); - - // set fermion boundary conditions to be periodic space, antiperiodic time. - std::string boundary = "1 1 1 -1"; - - for (unsigned int i = 0; i < flavour.size(); ++i) - { - // actions - MAction::WilsonClover2AS::Par actionPar; - actionPar.gauge = "gauge"; - actionPar.mass = mass[i]; - actionPar.csw_r = csw; - actionPar.csw_t = csw; - actionPar.clover_anisotropy.isAnisotropic= false; - actionPar.clover_anisotropy.t_direction = Nd-1 ; - actionPar.clover_anisotropy.xi_0 = 1.0 ; - actionPar.clover_anisotropy.nu = 1.0 ; - actionPar.boundary = boundary; - application.createModule("WilsonClover2AS_" + flavour[i], actionPar); - - // solvers - MSolver::RBPrecCG2AS::Par solverPar; - solverPar.action = "WilsonClover2AS_" + flavour[i]; - solverPar.residual = 1.0e-8; - solverPar.maxIteration = 10000; - application.createModule("CG_" + flavour[i], - solverPar); - - // propagators - MFermion::GaugeProp2AS::Par quarkPar; - quarkPar.solver = "CG_" + flavour[i]; - quarkPar.source = "pt"; - application.createModule("Qpt_" + flavour[i], quarkPar); - quarkPar.source = "z2"; - application.createModule("QZ2_" + flavour[i], quarkPar); - } - for (unsigned int i = 0; i < flavour.size(); ++i) - for (unsigned int j = i; j < flavour.size(); ++j) - { - MContraction::Meson2AS::Par mesPar; - - mesPar.output = "mesons2AS/pt_" + flavour[i] + flavour[j]; - mesPar.q1 = "Qpt_" + flavour[i]; - mesPar.q2 = "Qpt_" + flavour[j]; - mesPar.gammas = "all"; - mesPar.sink = "sink"; - application.createModule("meson_pt_" - + flavour[i] + flavour[j], - mesPar); - - // mesPar.output = "mesons2AS/Z2_" + flavour[i] + flavour[j]; - // mesPar.q1 = "QZ2_" + flavour[i]; - // mesPar.q2 = "QZ2_" + flavour[j]; - // mesPar.gammas = "all"; - // mesPar.sink = "sink"; - // application.createModule("meson_Z2_" - // + flavour[i] + flavour[j], - // mesPar); - } - for (unsigned int i = 0; i < flavour.size(); ++i) - for (unsigned int j = i; j < flavour.size(); ++j) - for (unsigned int k = j; k < flavour.size(); ++k) - { - MContraction::Baryon::Par barPar; - - barPar.output = "baryons/pt_" + flavour[i] + flavour[j] + flavour[k]; - barPar.q1 = "Qpt_" + flavour[i]; - barPar.q2 = "Qpt_" + flavour[j]; - barPar.q3 = "Qpt_" + flavour[k]; - application.createModule( - "baryon_pt_" + flavour[i] + flavour[j] + flavour[k], barPar); - } - - // execution - application.saveParameterFile("spectrum.xml"); - application.run(); - - // epilogue - LOG(Message) << "Grid is finalizing now" << std::endl; - Grid_finalize(); - - return EXIT_SUCCESS; -} diff --git a/tests/hadrons/Test_hadrons_meson_3pt.cc b/tests/hadrons/Test_hadrons_meson_3pt.cc index b12ef472..243ffebb 100644 --- a/tests/hadrons/Test_hadrons_meson_3pt.cc +++ b/tests/hadrons/Test_hadrons_meson_3pt.cc @@ -26,6 +26,7 @@ *******************************************************************************/ #include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons_quark.cc b/tests/hadrons/Test_hadrons_quark.cc index cf3d2590..64cbfd30 100644 --- a/tests/hadrons/Test_hadrons_quark.cc +++ b/tests/hadrons/Test_hadrons_quark.cc @@ -26,7 +26,6 @@ *******************************************************************************/ #include "Test_hadrons.hpp" -#include using namespace Grid; using namespace QCD; diff --git a/tests/hadrons/Test_hadrons_spectrum.cc b/tests/hadrons/Test_hadrons_spectrum.cc index 682dcc9b..f41bd5b4 100644 --- a/tests/hadrons/Test_hadrons_spectrum.cc +++ b/tests/hadrons/Test_hadrons_spectrum.cc @@ -26,6 +26,7 @@ *******************************************************************************/ #include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons_wilsonFund.cc b/tests/hadrons/Test_hadrons_wilsonFund.cc index 36e751b6..bad0f2d3 100644 --- a/tests/hadrons/Test_hadrons_wilsonFund.cc +++ b/tests/hadrons/Test_hadrons_wilsonFund.cc @@ -26,6 +26,7 @@ *******************************************************************************/ #include +#include using namespace Grid; using namespace Hadrons; From 853a5528dc36a1c4d4050a817810c74ce4391d63 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 17:35:01 +0100 Subject: [PATCH 264/620] Hadrons: template modules compilation optimisation --- extras/Hadrons/Application.hpp | 2 +- extras/Hadrons/Module.hpp | 37 ++++++------------- extras/Hadrons/Modules.hpp | 30 --------------- extras/Hadrons/Modules/MAction/DWF.cc | 8 ++++ extras/Hadrons/Modules/MAction/DWF.hpp | 3 +- extras/Hadrons/Modules/MAction/Wilson.cc | 8 ++++ extras/Hadrons/Modules/MAction/Wilson.hpp | 2 +- .../Hadrons/Modules/MAction/WilsonClover.cc | 8 ++++ .../Hadrons/Modules/MAction/WilsonClover.hpp | 2 +- extras/Hadrons/Modules/MAction/ZMobiusDWF.cc | 8 ++++ extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp | 2 +- extras/Hadrons/Modules/MContraction/Baryon.cc | 8 ++++ .../Hadrons/Modules/MContraction/Baryon.hpp | 2 +- .../Hadrons/Modules/MContraction/DiscLoop.cc | 8 ++++ .../Hadrons/Modules/MContraction/DiscLoop.hpp | 2 +- .../Hadrons/Modules/MContraction/Gamma3pt.cc | 8 ++++ .../Hadrons/Modules/MContraction/Gamma3pt.hpp | 2 +- extras/Hadrons/Modules/MContraction/Meson.cc | 8 ++++ extras/Hadrons/Modules/MContraction/Meson.hpp | 2 +- .../Modules/MContraction/WardIdentity.cc | 8 ++++ .../Modules/MContraction/WardIdentity.hpp | 2 +- .../Modules/MContraction/WeakHamiltonian.hpp | 2 +- extras/Hadrons/Modules/MFermion/GaugeProp.cc | 8 ++++ extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 2 +- extras/Hadrons/Modules/MGauge/FundtoHirep.hpp | 6 +-- extras/Hadrons/Modules/MGauge/Random.hpp | 2 +- extras/Hadrons/Modules/MGauge/StochEm.hpp | 2 +- extras/Hadrons/Modules/MGauge/Unit.hpp | 2 +- extras/Hadrons/Modules/MIO/LoadBinary.cc | 13 +++++++ extras/Hadrons/Modules/MIO/LoadBinary.hpp | 12 +++--- .../Modules/MIO/LoadCoarseEigenPack.cc | 8 ++++ .../Modules/MIO/LoadCoarseEigenPack.hpp | 3 +- extras/Hadrons/Modules/MIO/LoadEigenPack.cc | 8 ++++ extras/Hadrons/Modules/MIO/LoadEigenPack.hpp | 2 +- extras/Hadrons/Modules/MIO/LoadNersc.hpp | 2 +- extras/Hadrons/Modules/MLoop/NoiseLoop.cc | 8 ++++ extras/Hadrons/Modules/MLoop/NoiseLoop.hpp | 2 +- .../Hadrons/Modules/MScalar/ChargedProp.hpp | 2 +- extras/Hadrons/Modules/MScalar/FreeProp.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/Div.cc | 12 ++++++ extras/Hadrons/Modules/MScalarSUN/Div.hpp | 10 ++--- extras/Hadrons/Modules/MScalarSUN/EMT.cc | 12 ++++++ extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 10 ++--- .../Hadrons/Modules/MScalarSUN/ShiftProbe.cc | 12 ++++++ .../Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 10 ++--- .../Hadrons/Modules/MScalarSUN/TrKinetic.cc | 12 ++++++ .../Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 10 ++--- extras/Hadrons/Modules/MScalarSUN/TrMag.cc | 12 ++++++ extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 10 ++--- extras/Hadrons/Modules/MScalarSUN/TrPhi.cc | 12 ++++++ extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 10 ++--- .../Hadrons/Modules/MScalarSUN/TransProj.cc | 12 ++++++ .../Hadrons/Modules/MScalarSUN/TransProj.hpp | 10 ++--- extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc | 12 ++++++ .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 10 ++--- extras/Hadrons/Modules/MSink/Point.cc | 9 +++++ extras/Hadrons/Modules/MSink/Point.hpp | 4 +- extras/Hadrons/Modules/MSink/Smear.cc | 8 ++++ extras/Hadrons/Modules/MSink/Smear.hpp | 2 +- .../Modules/MSolver/LocalCoherenceLanczos.cc | 9 +++++ .../Modules/MSolver/LocalCoherenceLanczos.hpp | 8 +--- extras/Hadrons/Modules/MSolver/RBPrecCG.cc | 9 +++++ extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 6 +-- extras/Hadrons/Modules/MSource/Point.cc | 9 +++++ extras/Hadrons/Modules/MSource/Point.hpp | 4 +- .../Hadrons/Modules/MSource/SeqConserved.cc | 8 ++++ .../Hadrons/Modules/MSource/SeqConserved.hpp | 2 +- extras/Hadrons/Modules/MSource/SeqGamma.cc | 8 ++++ extras/Hadrons/Modules/MSource/SeqGamma.hpp | 2 +- extras/Hadrons/Modules/MSource/Wall.cc | 8 ++++ extras/Hadrons/Modules/MSource/Wall.hpp | 2 +- extras/Hadrons/Modules/MSource/Z2.cc | 9 +++++ extras/Hadrons/Modules/MSource/Z2.hpp | 4 +- .../Modules/MUtilities/TestSeqConserved.cc | 8 ++++ .../Modules/MUtilities/TestSeqConserved.hpp | 2 +- .../Modules/MUtilities/TestSeqGamma.cc | 8 ++++ .../Modules/MUtilities/TestSeqGamma.hpp | 2 +- .../templates/Module_in_NS.hpp.template | 2 +- .../templates/Module_tmp_in_NS.hpp.template | 2 +- extras/Hadrons/make_module_inst.sh | 27 ++++++++++++++ extras/Hadrons/modules.inc | 35 +++++++++++++++++- 81 files changed, 467 insertions(+), 152 deletions(-) create mode 100644 extras/Hadrons/Modules/MAction/DWF.cc create mode 100644 extras/Hadrons/Modules/MAction/Wilson.cc create mode 100644 extras/Hadrons/Modules/MAction/WilsonClover.cc create mode 100644 extras/Hadrons/Modules/MAction/ZMobiusDWF.cc create mode 100644 extras/Hadrons/Modules/MContraction/Baryon.cc create mode 100644 extras/Hadrons/Modules/MContraction/DiscLoop.cc create mode 100644 extras/Hadrons/Modules/MContraction/Gamma3pt.cc create mode 100644 extras/Hadrons/Modules/MContraction/Meson.cc create mode 100644 extras/Hadrons/Modules/MContraction/WardIdentity.cc create mode 100644 extras/Hadrons/Modules/MFermion/GaugeProp.cc create mode 100644 extras/Hadrons/Modules/MIO/LoadBinary.cc create mode 100644 extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc create mode 100644 extras/Hadrons/Modules/MIO/LoadEigenPack.cc create mode 100644 extras/Hadrons/Modules/MLoop/NoiseLoop.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/Div.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/EMT.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/TrMag.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/TrPhi.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/TransProj.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc create mode 100644 extras/Hadrons/Modules/MSink/Point.cc create mode 100644 extras/Hadrons/Modules/MSink/Smear.cc create mode 100644 extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc create mode 100644 extras/Hadrons/Modules/MSolver/RBPrecCG.cc create mode 100644 extras/Hadrons/Modules/MSource/Point.cc create mode 100644 extras/Hadrons/Modules/MSource/SeqConserved.cc create mode 100644 extras/Hadrons/Modules/MSource/SeqGamma.cc create mode 100644 extras/Hadrons/Modules/MSource/Wall.cc create mode 100644 extras/Hadrons/Modules/MSource/Z2.cc create mode 100644 extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc create mode 100644 extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc create mode 100755 extras/Hadrons/make_module_inst.sh diff --git a/extras/Hadrons/Application.hpp b/extras/Hadrons/Application.hpp index 0254f2fc..8cd15433 100644 --- a/extras/Hadrons/Application.hpp +++ b/extras/Hadrons/Application.hpp @@ -31,7 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 583f1111..9229a01c 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -35,32 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE // module registration macros -#define MODULE_REGISTER(mod, base)\ -class mod: public base\ -{\ -public:\ - typedef base Base;\ - using Base::Base;\ - virtual std::string getRegisteredName(void)\ - {\ - return std::string(#mod);\ - }\ -};\ -class mod##ModuleRegistrar\ -{\ -public:\ - mod##ModuleRegistrar(void)\ - {\ - ModuleFactory &modFac = ModuleFactory::getInstance();\ - modFac.registerBuilder(#mod, [&](const std::string name)\ - {\ - return std::unique_ptr(new mod(name));\ - });\ - }\ -};\ -static mod##ModuleRegistrar mod##ModuleRegistrarInstance; - -#define MODULE_REGISTER_NS(mod, base, ns)\ +#define MODULE_REGISTER(mod, base, ns)\ class mod: public base\ {\ public:\ @@ -85,6 +60,10 @@ public:\ };\ static ns##mod##ModuleRegistrar ns##mod##ModuleRegistrarInstance; +#define MODULE_REGISTER_TMP(mod, base, ns)\ +extern template class base;\ +MODULE_REGISTER(mod, ARG(base), ns); + #define ARG(...) __VA_ARGS__ #define MACRO_REDIRECT(arg1, arg2, arg3, macro, ...) macro @@ -144,6 +123,12 @@ MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__) if (env().getGrid()->IsBoss())\ {\ ResultWriter _writer(RESULT_FILE_NAME(ioStem));\ + std::string _basename = basename(ioStem);\ + \ + if (!mkdir(_basename))\ + {\ + HADRON_ERROR(Io, "cannot create directory '" + _basename + "'");\ + }\ write(_writer, name, result);\ } diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 528faecd..cdd94c35 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,33 +1,3 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Guido Cossu -Author: Lanny91 -Author: pretidav - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ #include #include #include diff --git a/extras/Hadrons/Modules/MAction/DWF.cc b/extras/Hadrons/Modules/MAction/DWF.cc new file mode 100644 index 00000000..2037238a --- /dev/null +++ b/extras/Hadrons/Modules/MAction/DWF.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MAction; + +template class Grid::Hadrons::MAction::TDWF; + diff --git a/extras/Hadrons/Modules/MAction/DWF.hpp b/extras/Hadrons/Modules/MAction/DWF.hpp index 4dfd06cf..6be35a8a 100644 --- a/extras/Hadrons/Modules/MAction/DWF.hpp +++ b/extras/Hadrons/Modules/MAction/DWF.hpp @@ -72,7 +72,8 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(DWF, TDWF, MAction); +extern template class TDWF; +MODULE_REGISTER_TMP(DWF, TDWF, MAction); /****************************************************************************** * DWF template implementation * diff --git a/extras/Hadrons/Modules/MAction/Wilson.cc b/extras/Hadrons/Modules/MAction/Wilson.cc new file mode 100644 index 00000000..10526241 --- /dev/null +++ b/extras/Hadrons/Modules/MAction/Wilson.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MAction; + +template class Grid::Hadrons::MAction::TWilson; + diff --git a/extras/Hadrons/Modules/MAction/Wilson.hpp b/extras/Hadrons/Modules/MAction/Wilson.hpp index 6467b3ee..5508b6b8 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.hpp +++ b/extras/Hadrons/Modules/MAction/Wilson.hpp @@ -70,7 +70,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Wilson, TWilson, MAction); +MODULE_REGISTER_TMP(Wilson, TWilson, MAction); /****************************************************************************** * TWilson template implementation * diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.cc b/extras/Hadrons/Modules/MAction/WilsonClover.cc new file mode 100644 index 00000000..d0f90f26 --- /dev/null +++ b/extras/Hadrons/Modules/MAction/WilsonClover.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MAction; + +template class Grid::Hadrons::MAction::TWilsonClover; + diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/extras/Hadrons/Modules/MAction/WilsonClover.hpp index 2967931c..a93a0136 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/extras/Hadrons/Modules/MAction/WilsonClover.hpp @@ -74,7 +74,7 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(WilsonClover, TWilsonClover, MAction); +MODULE_REGISTER_TMP(WilsonClover, TWilsonClover, MAction); /****************************************************************************** * TWilsonClover template implementation * diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc b/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc new file mode 100644 index 00000000..b5be7d9b --- /dev/null +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MAction; + +template class Grid::Hadrons::MAction::TZMobiusDWF; + diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp index 518b88f2..58a6bb1a 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -72,7 +72,7 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(ZMobiusDWF, TZMobiusDWF, MAction); +MODULE_REGISTER_TMP(ZMobiusDWF, TZMobiusDWF, MAction); /****************************************************************************** * TZMobiusDWF implementation * diff --git a/extras/Hadrons/Modules/MContraction/Baryon.cc b/extras/Hadrons/Modules/MContraction/Baryon.cc new file mode 100644 index 00000000..7015e899 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/Baryon.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TBaryon; + diff --git a/extras/Hadrons/Modules/MContraction/Baryon.hpp b/extras/Hadrons/Modules/MContraction/Baryon.hpp index f3bf360d..87691e7b 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.hpp +++ b/extras/Hadrons/Modules/MContraction/Baryon.hpp @@ -79,7 +79,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Baryon, ARG(TBaryon), MContraction); +MODULE_REGISTER_TMP(Baryon, ARG(TBaryon), MContraction); /****************************************************************************** * TBaryon implementation * diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.cc b/extras/Hadrons/Modules/MContraction/DiscLoop.cc new file mode 100644 index 00000000..257d7765 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/DiscLoop.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TDiscLoop; + diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp index 4a30963f..1c872f0a 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp +++ b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp @@ -76,7 +76,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(DiscLoop, TDiscLoop, MContraction); +MODULE_REGISTER_TMP(DiscLoop, TDiscLoop, MContraction); /****************************************************************************** * TDiscLoop implementation * diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.cc b/extras/Hadrons/Modules/MContraction/Gamma3pt.cc new file mode 100644 index 00000000..c4886223 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/Gamma3pt.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TGamma3pt; + diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp index b615cd7b..2b4b88a7 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp +++ b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp @@ -107,7 +107,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Gamma3pt, ARG(TGamma3pt), MContraction); +MODULE_REGISTER_TMP(Gamma3pt, ARG(TGamma3pt), MContraction); /****************************************************************************** * TGamma3pt implementation * diff --git a/extras/Hadrons/Modules/MContraction/Meson.cc b/extras/Hadrons/Modules/MContraction/Meson.cc new file mode 100644 index 00000000..a1c6a742 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/Meson.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TMeson; + diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index 5d27c526..f75e55dc 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -102,7 +102,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Meson, ARG(TMeson), MContraction); +MODULE_REGISTER_TMP(Meson, ARG(TMeson), MContraction); /****************************************************************************** * TMeson implementation * diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.cc b/extras/Hadrons/Modules/MContraction/WardIdentity.cc new file mode 100644 index 00000000..cd188e46 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/WardIdentity.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TWardIdentity; + diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp index 2801d88c..3b9a1449 100644 --- a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp +++ b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp @@ -84,7 +84,7 @@ private: unsigned int Ls_; }; -MODULE_REGISTER_NS(WardIdentity, TWardIdentity, MContraction); +MODULE_REGISTER_TMP(WardIdentity, TWardIdentity, MContraction); /****************************************************************************** * TWardIdentity implementation * diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp index 9d8ada98..84edc366 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp @@ -109,7 +109,7 @@ protected:\ /* execution */ \ virtual void execute(void);\ };\ -MODULE_REGISTER_NS(modname, T##modname, MContraction); +MODULE_REGISTER(modname, T##modname, MContraction); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.cc b/extras/Hadrons/Modules/MFermion/GaugeProp.cc new file mode 100644 index 00000000..888b86f1 --- /dev/null +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MFermion; + +template class Grid::Hadrons::MFermion::TGaugeProp; + diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index 45b9de6c..e85acecb 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -95,7 +95,7 @@ private: SolverFn *solver_{nullptr}; }; -MODULE_REGISTER_NS(GaugeProp, TGaugeProp, MFermion); +MODULE_REGISTER_TMP(GaugeProp, TGaugeProp, MFermion); /****************************************************************************** * TGaugeProp implementation * ******************************************************************************/ diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp index 508145bc..07274544 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp @@ -65,9 +65,9 @@ public: void execute(void); }; -//MODULE_REGISTER_NS(FundtoAdjoint, TFundtoHirep, MGauge); -//MODULE_REGISTER_NS(FundtoTwoIndexSym, TFundtoHirep, MGauge); -//MODULE_REGISTER_NS(FundtoTwoIndexAsym, TFundtoHirep, MGauge); +//MODULE_REGISTER_TMP(FundtoAdjoint, TFundtoHirep, MGauge); +//MODULE_REGISTER_TMP(FundtoTwoIndexSym, TFundtoHirep, MGauge); +//MODULE_REGISTER_TMP(FundtoTwoIndexAsym, TFundtoHirep, MGauge); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/Random.hpp b/extras/Hadrons/Modules/MGauge/Random.hpp index 51a08dbb..ddc81fc1 100644 --- a/extras/Hadrons/Modules/MGauge/Random.hpp +++ b/extras/Hadrons/Modules/MGauge/Random.hpp @@ -57,7 +57,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Random, TRandom, MGauge); +MODULE_REGISTER(Random, TRandom, MGauge); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index 9e2ba1fb..aa7fa51f 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -70,7 +70,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(StochEm, TStochEm, MGauge); +MODULE_REGISTER(StochEm, TStochEm, MGauge); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/Unit.hpp b/extras/Hadrons/Modules/MGauge/Unit.hpp index d6ce5a6b..bd0faa25 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.hpp +++ b/extras/Hadrons/Modules/MGauge/Unit.hpp @@ -57,7 +57,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Unit, TUnit, MGauge); +MODULE_REGISTER(Unit, TUnit, MGauge); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.cc b/extras/Hadrons/Modules/MIO/LoadBinary.cc new file mode 100644 index 00000000..4eb76ee1 --- /dev/null +++ b/extras/Hadrons/Modules/MIO/LoadBinary.cc @@ -0,0 +1,13 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MIO; + +template class Grid::Hadrons::MIO::TLoadBinary; +template class Grid::Hadrons::MIO::TLoadBinary>; +template class Grid::Hadrons::MIO::TLoadBinary>; +template class Grid::Hadrons::MIO::TLoadBinary>; +template class Grid::Hadrons::MIO::TLoadBinary>; +template class Grid::Hadrons::MIO::TLoadBinary>; + diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.hpp b/extras/Hadrons/Modules/MIO/LoadBinary.hpp index d9a8b5f8..f14be5fb 100644 --- a/extras/Hadrons/Modules/MIO/LoadBinary.hpp +++ b/extras/Hadrons/Modules/MIO/LoadBinary.hpp @@ -71,12 +71,12 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(LoadBinary, TLoadBinary, MIO); -MODULE_REGISTER_NS(LoadBinaryScalarSU2, TLoadBinary>, MIO); -MODULE_REGISTER_NS(LoadBinaryScalarSU3, TLoadBinary>, MIO); -MODULE_REGISTER_NS(LoadBinaryScalarSU4, TLoadBinary>, MIO); -MODULE_REGISTER_NS(LoadBinaryScalarSU5, TLoadBinary>, MIO); -MODULE_REGISTER_NS(LoadBinaryScalarSU6, TLoadBinary>, MIO); +MODULE_REGISTER_TMP(LoadBinary, TLoadBinary, MIO); +MODULE_REGISTER_TMP(LoadBinaryScalarSU2, TLoadBinary>, MIO); +MODULE_REGISTER_TMP(LoadBinaryScalarSU3, TLoadBinary>, MIO); +MODULE_REGISTER_TMP(LoadBinaryScalarSU4, TLoadBinary>, MIO); +MODULE_REGISTER_TMP(LoadBinaryScalarSU5, TLoadBinary>, MIO); +MODULE_REGISTER_TMP(LoadBinaryScalarSU6, TLoadBinary>, MIO); /****************************************************************************** * TLoadBinary implementation * diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc new file mode 100644 index 00000000..60637566 --- /dev/null +++ b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MIO; + +template class Grid::Hadrons::MIO::TLoadCoarseEigenPack>; + diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp index b88844f4..609e5ed4 100644 --- a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp @@ -73,8 +73,7 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(LoadCoarseFermionEigenPack, - ARG(TLoadCoarseEigenPack>), MIO); +MODULE_REGISTER_TMP(LoadCoarseFermionEigenPack, ARG(TLoadCoarseEigenPack>), MIO); /****************************************************************************** * TLoadCoarseEigenPack implementation * diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.cc b/extras/Hadrons/Modules/MIO/LoadEigenPack.cc new file mode 100644 index 00000000..1ed0254d --- /dev/null +++ b/extras/Hadrons/Modules/MIO/LoadEigenPack.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MIO; + +template class Grid::Hadrons::MIO::TLoadEigenPack>; + diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp index 5d62b53d..8a3b40e7 100644 --- a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp @@ -68,7 +68,7 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(LoadFermionEigenPack, TLoadEigenPack>, MIO); +MODULE_REGISTER_TMP(LoadFermionEigenPack, TLoadEigenPack>, MIO); /****************************************************************************** * TLoadEigenPack implementation * diff --git a/extras/Hadrons/Modules/MIO/LoadNersc.hpp b/extras/Hadrons/Modules/MIO/LoadNersc.hpp index d6742e1e..309edad2 100644 --- a/extras/Hadrons/Modules/MIO/LoadNersc.hpp +++ b/extras/Hadrons/Modules/MIO/LoadNersc.hpp @@ -62,7 +62,7 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(LoadNersc, TLoadNersc, MIO); +MODULE_REGISTER(LoadNersc, TLoadNersc, MIO); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MLoop/NoiseLoop.cc b/extras/Hadrons/Modules/MLoop/NoiseLoop.cc new file mode 100644 index 00000000..96707f19 --- /dev/null +++ b/extras/Hadrons/Modules/MLoop/NoiseLoop.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MLoop; + +template class Grid::Hadrons::MLoop::TNoiseLoop; + diff --git a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp b/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp index e61bf163..588c63da 100644 --- a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp +++ b/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp @@ -82,7 +82,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(NoiseLoop, TNoiseLoop, MLoop); +MODULE_REGISTER_TMP(NoiseLoop, TNoiseLoop, MLoop); /****************************************************************************** * TNoiseLoop implementation * diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 4d43aec2..72a40cad 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -80,7 +80,7 @@ private: std::vector phase_; }; -MODULE_REGISTER_NS(ChargedProp, TChargedProp, MScalar); +MODULE_REGISTER(ChargedProp, TChargedProp, MScalar); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalar/FreeProp.hpp b/extras/Hadrons/Modules/MScalar/FreeProp.hpp index df17f44e..bf7823e6 100644 --- a/extras/Hadrons/Modules/MScalar/FreeProp.hpp +++ b/extras/Hadrons/Modules/MScalar/FreeProp.hpp @@ -70,7 +70,7 @@ private: bool freePropDone_; }; -MODULE_REGISTER_NS(FreeProp, TFreeProp, MScalar); +MODULE_REGISTER(FreeProp, TFreeProp, MScalar); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.cc b/extras/Hadrons/Modules/MScalarSUN/Div.cc new file mode 100644 index 00000000..1045b04a --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/Div.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TDiv>; +template class Grid::Hadrons::MScalarSUN::TDiv>; +template class Grid::Hadrons::MScalarSUN::TDiv>; +template class Grid::Hadrons::MScalarSUN::TDiv>; +template class Grid::Hadrons::MScalarSUN::TDiv>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index 0ecb1dbe..9b30866c 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -76,11 +76,11 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(DivSU2, TDiv>, MScalarSUN); -MODULE_REGISTER_NS(DivSU3, TDiv>, MScalarSUN); -MODULE_REGISTER_NS(DivSU4, TDiv>, MScalarSUN); -MODULE_REGISTER_NS(DivSU5, TDiv>, MScalarSUN); -MODULE_REGISTER_NS(DivSU6, TDiv>, MScalarSUN); +MODULE_REGISTER_TMP(DivSU2, TDiv>, MScalarSUN); +MODULE_REGISTER_TMP(DivSU3, TDiv>, MScalarSUN); +MODULE_REGISTER_TMP(DivSU4, TDiv>, MScalarSUN); +MODULE_REGISTER_TMP(DivSU5, TDiv>, MScalarSUN); +MODULE_REGISTER_TMP(DivSU6, TDiv>, MScalarSUN); /****************************************************************************** * TDiv implementation * diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.cc b/extras/Hadrons/Modules/MScalarSUN/EMT.cc new file mode 100644 index 00000000..0d5d652f --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TEMT>; +template class Grid::Hadrons::MScalarSUN::TEMT>; +template class Grid::Hadrons::MScalarSUN::TEMT>; +template class Grid::Hadrons::MScalarSUN::TEMT>; +template class Grid::Hadrons::MScalarSUN::TEMT>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp index 8c1239df..445f3445 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -74,11 +74,11 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(EMTSU2, TEMT>, MScalarSUN); -MODULE_REGISTER_NS(EMTSU3, TEMT>, MScalarSUN); -MODULE_REGISTER_NS(EMTSU4, TEMT>, MScalarSUN); -MODULE_REGISTER_NS(EMTSU5, TEMT>, MScalarSUN); -MODULE_REGISTER_NS(EMTSU6, TEMT>, MScalarSUN); +MODULE_REGISTER_TMP(EMTSU2, TEMT>, MScalarSUN); +MODULE_REGISTER_TMP(EMTSU3, TEMT>, MScalarSUN); +MODULE_REGISTER_TMP(EMTSU4, TEMT>, MScalarSUN); +MODULE_REGISTER_TMP(EMTSU5, TEMT>, MScalarSUN); +MODULE_REGISTER_TMP(EMTSU6, TEMT>, MScalarSUN); /****************************************************************************** * TEMT implementation * diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc new file mode 100644 index 00000000..339bd9a8 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TShiftProbe>; +template class Grid::Hadrons::MScalarSUN::TShiftProbe>; +template class Grid::Hadrons::MScalarSUN::TShiftProbe>; +template class Grid::Hadrons::MScalarSUN::TShiftProbe>; +template class Grid::Hadrons::MScalarSUN::TShiftProbe>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index 8d52327e..41b8c553 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -79,11 +79,11 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(ShiftProbeSU2, TShiftProbe>, MScalarSUN); -MODULE_REGISTER_NS(ShiftProbeSU3, TShiftProbe>, MScalarSUN); -MODULE_REGISTER_NS(ShiftProbeSU4, TShiftProbe>, MScalarSUN); -MODULE_REGISTER_NS(ShiftProbeSU5, TShiftProbe>, MScalarSUN); -MODULE_REGISTER_NS(ShiftProbeSU6, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_TMP(ShiftProbeSU2, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_TMP(ShiftProbeSU3, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_TMP(ShiftProbeSU4, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_TMP(ShiftProbeSU5, TShiftProbe>, MScalarSUN); +MODULE_REGISTER_TMP(ShiftProbeSU6, TShiftProbe>, MScalarSUN); /****************************************************************************** * TShiftProbe implementation * diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc new file mode 100644 index 00000000..8c959dca --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TTrKinetic>; +template class Grid::Hadrons::MScalarSUN::TTrKinetic>; +template class Grid::Hadrons::MScalarSUN::TTrKinetic>; +template class Grid::Hadrons::MScalarSUN::TTrKinetic>; +template class Grid::Hadrons::MScalarSUN::TTrKinetic>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index f1b520de..e448b61e 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -76,11 +76,11 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(TrKineticSU2, TTrKinetic>, MScalarSUN); -MODULE_REGISTER_NS(TrKineticSU3, TTrKinetic>, MScalarSUN); -MODULE_REGISTER_NS(TrKineticSU4, TTrKinetic>, MScalarSUN); -MODULE_REGISTER_NS(TrKineticSU5, TTrKinetic>, MScalarSUN); -MODULE_REGISTER_NS(TrKineticSU6, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_TMP(TrKineticSU2, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_TMP(TrKineticSU3, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_TMP(TrKineticSU4, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_TMP(TrKineticSU5, TTrKinetic>, MScalarSUN); +MODULE_REGISTER_TMP(TrKineticSU6, TTrKinetic>, MScalarSUN); /****************************************************************************** * TTrKinetic implementation * diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.cc b/extras/Hadrons/Modules/MScalarSUN/TrMag.cc new file mode 100644 index 00000000..3be84f92 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TTrMag>; +template class Grid::Hadrons::MScalarSUN::TTrMag>; +template class Grid::Hadrons::MScalarSUN::TTrMag>; +template class Grid::Hadrons::MScalarSUN::TTrMag>; +template class Grid::Hadrons::MScalarSUN::TTrMag>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp index 879951d5..efadc16f 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -76,11 +76,11 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(TrMagSU2, TTrMag>, MScalarSUN); -MODULE_REGISTER_NS(TrMagSU3, TTrMag>, MScalarSUN); -MODULE_REGISTER_NS(TrMagSU4, TTrMag>, MScalarSUN); -MODULE_REGISTER_NS(TrMagSU5, TTrMag>, MScalarSUN); -MODULE_REGISTER_NS(TrMagSU6, TTrMag>, MScalarSUN); +MODULE_REGISTER_TMP(TrMagSU2, TTrMag>, MScalarSUN); +MODULE_REGISTER_TMP(TrMagSU3, TTrMag>, MScalarSUN); +MODULE_REGISTER_TMP(TrMagSU4, TTrMag>, MScalarSUN); +MODULE_REGISTER_TMP(TrMagSU5, TTrMag>, MScalarSUN); +MODULE_REGISTER_TMP(TrMagSU6, TTrMag>, MScalarSUN); /****************************************************************************** * TTrMag implementation * diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc b/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc new file mode 100644 index 00000000..58c6df75 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TTrPhi>; +template class Grid::Hadrons::MScalarSUN::TTrPhi>; +template class Grid::Hadrons::MScalarSUN::TTrPhi>; +template class Grid::Hadrons::MScalarSUN::TTrPhi>; +template class Grid::Hadrons::MScalarSUN::TTrPhi>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index aa98bfb3..3f43a7b1 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -76,11 +76,11 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(TrPhiSU2, TTrPhi>, MScalarSUN); -MODULE_REGISTER_NS(TrPhiSU3, TTrPhi>, MScalarSUN); -MODULE_REGISTER_NS(TrPhiSU4, TTrPhi>, MScalarSUN); -MODULE_REGISTER_NS(TrPhiSU5, TTrPhi>, MScalarSUN); -MODULE_REGISTER_NS(TrPhiSU6, TTrPhi>, MScalarSUN); +MODULE_REGISTER_TMP(TrPhiSU2, TTrPhi>, MScalarSUN); +MODULE_REGISTER_TMP(TrPhiSU3, TTrPhi>, MScalarSUN); +MODULE_REGISTER_TMP(TrPhiSU4, TTrPhi>, MScalarSUN); +MODULE_REGISTER_TMP(TrPhiSU5, TTrPhi>, MScalarSUN); +MODULE_REGISTER_TMP(TrPhiSU6, TTrPhi>, MScalarSUN); /****************************************************************************** * TTrPhi implementation * diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.cc b/extras/Hadrons/Modules/MScalarSUN/TransProj.cc new file mode 100644 index 00000000..09a469ea --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TTransProj>; +template class Grid::Hadrons::MScalarSUN::TTransProj>; +template class Grid::Hadrons::MScalarSUN::TTransProj>; +template class Grid::Hadrons::MScalarSUN::TTransProj>; +template class Grid::Hadrons::MScalarSUN::TTransProj>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp index 4532b4ab..b525b053 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -77,11 +77,11 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(TransProjSU2, TTransProj>, MScalarSUN); -MODULE_REGISTER_NS(TransProjSU3, TTransProj>, MScalarSUN); -MODULE_REGISTER_NS(TransProjSU4, TTransProj>, MScalarSUN); -MODULE_REGISTER_NS(TransProjSU5, TTransProj>, MScalarSUN); -MODULE_REGISTER_NS(TransProjSU6, TTransProj>, MScalarSUN); +MODULE_REGISTER_TMP(TransProjSU2, TTransProj>, MScalarSUN); +MODULE_REGISTER_TMP(TransProjSU3, TTransProj>, MScalarSUN); +MODULE_REGISTER_TMP(TransProjSU4, TTransProj>, MScalarSUN); +MODULE_REGISTER_TMP(TransProjSU5, TTransProj>, MScalarSUN); +MODULE_REGISTER_TMP(TransProjSU6, TTransProj>, MScalarSUN); /****************************************************************************** * TTransProj implementation * diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc new file mode 100644 index 00000000..6e009bb6 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc @@ -0,0 +1,12 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TTwoPoint>; +template class Grid::Hadrons::MScalarSUN::TTwoPoint>; +template class Grid::Hadrons::MScalarSUN::TTwoPoint>; +template class Grid::Hadrons::MScalarSUN::TTwoPoint>; +template class Grid::Hadrons::MScalarSUN::TTwoPoint>; + diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 5ec56714..e50e23d7 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -87,11 +87,11 @@ private: std::vector> mom_; }; -MODULE_REGISTER_NS(TwoPointSU2, TTwoPoint>, MScalarSUN); -MODULE_REGISTER_NS(TwoPointSU3, TTwoPoint>, MScalarSUN); -MODULE_REGISTER_NS(TwoPointSU4, TTwoPoint>, MScalarSUN); -MODULE_REGISTER_NS(TwoPointSU5, TTwoPoint>, MScalarSUN); -MODULE_REGISTER_NS(TwoPointSU6, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointSU2, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointSU3, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointSU4, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointSU5, TTwoPoint>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointSU6, TTwoPoint>, MScalarSUN); /****************************************************************************** * TTwoPoint implementation * diff --git a/extras/Hadrons/Modules/MSink/Point.cc b/extras/Hadrons/Modules/MSink/Point.cc new file mode 100644 index 00000000..fbb3b2f2 --- /dev/null +++ b/extras/Hadrons/Modules/MSink/Point.cc @@ -0,0 +1,9 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSink; + +template class Grid::Hadrons::MSink::TPoint; +template class Grid::Hadrons::MSink::TPoint; + diff --git a/extras/Hadrons/Modules/MSink/Point.hpp b/extras/Hadrons/Modules/MSink/Point.hpp index ee824c03..1c14915a 100644 --- a/extras/Hadrons/Modules/MSink/Point.hpp +++ b/extras/Hadrons/Modules/MSink/Point.hpp @@ -72,8 +72,8 @@ private: std::string momphName_; }; -MODULE_REGISTER_NS(Point, TPoint, MSink); -MODULE_REGISTER_NS(ScalarPoint, TPoint, MSink); +MODULE_REGISTER_TMP(Point, TPoint, MSink); +MODULE_REGISTER_TMP(ScalarPoint, TPoint, MSink); /****************************************************************************** * TPoint implementation * diff --git a/extras/Hadrons/Modules/MSink/Smear.cc b/extras/Hadrons/Modules/MSink/Smear.cc new file mode 100644 index 00000000..8ce5f354 --- /dev/null +++ b/extras/Hadrons/Modules/MSink/Smear.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSink; + +template class Grid::Hadrons::MSink::TSmear; + diff --git a/extras/Hadrons/Modules/MSink/Smear.hpp b/extras/Hadrons/Modules/MSink/Smear.hpp index e72dece0..82a21a80 100644 --- a/extras/Hadrons/Modules/MSink/Smear.hpp +++ b/extras/Hadrons/Modules/MSink/Smear.hpp @@ -70,7 +70,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Smear, TSmear, MSink); +MODULE_REGISTER_TMP(Smear, TSmear, MSink); /****************************************************************************** * TSmear implementation * diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc new file mode 100644 index 00000000..64588a5b --- /dev/null +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc @@ -0,0 +1,9 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSolver; + +template class Grid::Hadrons::MSolver::TLocalCoherenceLanczos; +template class Grid::Hadrons::MSolver::TLocalCoherenceLanczos; + diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 2b7c1049..4695d8e2 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -79,12 +79,8 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(LocalCoherenceLanczos, - ARG(TLocalCoherenceLanczos), - MSolver); -MODULE_REGISTER_NS(ZLocalCoherenceLanczos, - ARG(TLocalCoherenceLanczos), - MSolver); +MODULE_REGISTER_TMP(LocalCoherenceLanczos, ARG(TLocalCoherenceLanczos), MSolver); +MODULE_REGISTER_TMP(ZLocalCoherenceLanczos, ARG(TLocalCoherenceLanczos), MSolver); /****************************************************************************** * TLocalCoherenceLanczos implementation * diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.cc b/extras/Hadrons/Modules/MSolver/RBPrecCG.cc new file mode 100644 index 00000000..4c0aa48e --- /dev/null +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.cc @@ -0,0 +1,9 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSolver; + +template class Grid::Hadrons::MSolver::TRBPrecCG; +template class Grid::Hadrons::MSolver::TRBPrecCG; + diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 6e4fbba6..e241161f 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -79,10 +79,8 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(RBPrecCG, - ARG(TRBPrecCG), MSolver); -MODULE_REGISTER_NS(ZRBPrecCG, - ARG(TRBPrecCG), MSolver); +MODULE_REGISTER_TMP(RBPrecCG, ARG(TRBPrecCG), MSolver); +MODULE_REGISTER_TMP(ZRBPrecCG, ARG(TRBPrecCG), MSolver); /****************************************************************************** * TRBPrecCG template implementation * diff --git a/extras/Hadrons/Modules/MSource/Point.cc b/extras/Hadrons/Modules/MSource/Point.cc new file mode 100644 index 00000000..f16c43d2 --- /dev/null +++ b/extras/Hadrons/Modules/MSource/Point.cc @@ -0,0 +1,9 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSource; + +template class Grid::Hadrons::MSource::TPoint; +template class Grid::Hadrons::MSource::TPoint; + diff --git a/extras/Hadrons/Modules/MSource/Point.hpp b/extras/Hadrons/Modules/MSource/Point.hpp index ac6df252..50297a8b 100644 --- a/extras/Hadrons/Modules/MSource/Point.hpp +++ b/extras/Hadrons/Modules/MSource/Point.hpp @@ -79,8 +79,8 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(Point, TPoint, MSource); -MODULE_REGISTER_NS(ScalarPoint, TPoint, MSource); +MODULE_REGISTER_TMP(Point, TPoint, MSource); +MODULE_REGISTER_TMP(ScalarPoint, TPoint, MSource); /****************************************************************************** * TPoint template implementation * diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.cc b/extras/Hadrons/Modules/MSource/SeqConserved.cc new file mode 100644 index 00000000..9db92c98 --- /dev/null +++ b/extras/Hadrons/Modules/MSource/SeqConserved.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSource; + +template class Grid::Hadrons::MSource::TSeqConserved; + diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.hpp b/extras/Hadrons/Modules/MSource/SeqConserved.hpp index d7780528..a5d21995 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/extras/Hadrons/Modules/MSource/SeqConserved.hpp @@ -103,7 +103,7 @@ private: std::string SeqmomphName_; }; -MODULE_REGISTER_NS(SeqConserved, TSeqConserved, MSource); +MODULE_REGISTER_TMP(SeqConserved, TSeqConserved, MSource); /****************************************************************************** diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.cc b/extras/Hadrons/Modules/MSource/SeqGamma.cc new file mode 100644 index 00000000..744ad837 --- /dev/null +++ b/extras/Hadrons/Modules/MSource/SeqGamma.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSource; + +template class Grid::Hadrons::MSource::TSeqGamma; + diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.hpp b/extras/Hadrons/Modules/MSource/SeqGamma.hpp index 40eda29f..9d99b5b3 100644 --- a/extras/Hadrons/Modules/MSource/SeqGamma.hpp +++ b/extras/Hadrons/Modules/MSource/SeqGamma.hpp @@ -90,7 +90,7 @@ private: std::string momphName_, tName_; }; -MODULE_REGISTER_NS(SeqGamma, TSeqGamma, MSource); +MODULE_REGISTER_TMP(SeqGamma, TSeqGamma, MSource); /****************************************************************************** * TSeqGamma implementation * diff --git a/extras/Hadrons/Modules/MSource/Wall.cc b/extras/Hadrons/Modules/MSource/Wall.cc new file mode 100644 index 00000000..42e19a8f --- /dev/null +++ b/extras/Hadrons/Modules/MSource/Wall.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSource; + +template class Grid::Hadrons::MSource::TWall; + diff --git a/extras/Hadrons/Modules/MSource/Wall.hpp b/extras/Hadrons/Modules/MSource/Wall.hpp index 5853b11a..9494e739 100644 --- a/extras/Hadrons/Modules/MSource/Wall.hpp +++ b/extras/Hadrons/Modules/MSource/Wall.hpp @@ -84,7 +84,7 @@ private: std::string momphName_, tName_; }; -MODULE_REGISTER_NS(Wall, TWall, MSource); +MODULE_REGISTER_TMP(Wall, TWall, MSource); /****************************************************************************** * TWall implementation * diff --git a/extras/Hadrons/Modules/MSource/Z2.cc b/extras/Hadrons/Modules/MSource/Z2.cc new file mode 100644 index 00000000..e655e253 --- /dev/null +++ b/extras/Hadrons/Modules/MSource/Z2.cc @@ -0,0 +1,9 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSource; + +template class Grid::Hadrons::MSource::TZ2; +template class Grid::Hadrons::MSource::TZ2; + diff --git a/extras/Hadrons/Modules/MSource/Z2.hpp b/extras/Hadrons/Modules/MSource/Z2.hpp index 4414e37f..065d5fdf 100644 --- a/extras/Hadrons/Modules/MSource/Z2.hpp +++ b/extras/Hadrons/Modules/MSource/Z2.hpp @@ -85,8 +85,8 @@ private: std::string tName_; }; -MODULE_REGISTER_NS(Z2, TZ2, MSource); -MODULE_REGISTER_NS(ScalarZ2, TZ2, MSource); +MODULE_REGISTER_TMP(Z2, TZ2, MSource); +MODULE_REGISTER_TMP(ScalarZ2, TZ2, MSource); /****************************************************************************** * TZ2 template implementation * diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc new file mode 100644 index 00000000..94d2c946 --- /dev/null +++ b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MUtilities; + +template class Grid::Hadrons::MUtilities::TTestSeqConserved; + diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp index 6ee1e3c2..bf2370eb 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp +++ b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp @@ -88,7 +88,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(TestSeqConserved, TTestSeqConserved, MUtilities); +MODULE_REGISTER_TMP(TestSeqConserved, TTestSeqConserved, MUtilities); /****************************************************************************** * TTestSeqConserved implementation * diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc new file mode 100644 index 00000000..59635c5d --- /dev/null +++ b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MUtilities; + +template class Grid::Hadrons::MUtilities::TTestSeqGamma; + diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp index df35d887..9284a638 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp +++ b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp @@ -72,7 +72,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(TestSeqGamma, TTestSeqGamma, MUtilities); +MODULE_REGISTER_TMP(TestSeqGamma, TTestSeqGamma, MUtilities); /****************************************************************************** * TTestSeqGamma implementation * diff --git a/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template b/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template index ea77b12a..f645d046 100644 --- a/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template +++ b/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template @@ -35,7 +35,7 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(___FILEBASENAME___, T___FILEBASENAME___, ___NAMESPACE___); +MODULE_REGISTER(___FILEBASENAME___, T___FILEBASENAME___, ___NAMESPACE___); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template b/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template index b79c0ad3..48df254b 100644 --- a/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template +++ b/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template @@ -36,7 +36,7 @@ public: virtual void execute(void); }; -MODULE_REGISTER_NS(___FILEBASENAME___, T___FILEBASENAME___, ___NAMESPACE___); +MODULE_REGISTER_TMP(___FILEBASENAME___, T___FILEBASENAME___, ___NAMESPACE___); /****************************************************************************** * T___FILEBASENAME___ implementation * diff --git a/extras/Hadrons/make_module_inst.sh b/extras/Hadrons/make_module_inst.sh new file mode 100755 index 00000000..32ead3f0 --- /dev/null +++ b/extras/Hadrons/make_module_inst.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +for m in `find Modules -name '*.hpp' -type f -print`; do + echo "====== ${m}" + CCFILE=`echo $m | sed -E s/\.hpp/.cc/g` + NS=`echo $m | awk -F '/' '{print $2}'` + NMOD=`grep -E 'MODULE_REGISTER_TMP.+<.+>.?' $m | wc -l` + if [ ! -e ${CCFILE} ] && (( NMOD != 0 )); then + echo "#include " >> ${CCFILE} + echo "" >> ${CCFILE} + echo "using namespace Grid;" >> ${CCFILE} + echo "using namespace Hadrons;" >> ${CCFILE} + echo "using namespace ${NS};" >> ${CCFILE} + echo "" >> ${CCFILE} + for i in `grep -E 'MODULE_REGISTER_TMP.+<.+>.?' $m | sed -E 's/ +//g'` + do + TMPARG=`echo ${i} | grep -oE 'ARG\(.+>\)' | sed -E 's/^ARG\(//g' | sed -E 's/\)$//g'` + SUB=`echo ${i} | sed -E 's/ARG\(.+>\)/@arg@/g' | sed -E 's/,/|/g'` + SUB=`echo ${SUB} | sed -E 's/.+\(//g' | sed -E 's/\);//g'` + SUB=`echo ${SUB} | sed -E "s/@arg@/${TMPARG}/g"` + NAME=`echo ${SUB} | awk -F '|' '{print $1}'` + TYPE=`echo ${SUB} | awk -F '|' '{print $2}'` + echo "template class Grid::Hadrons::${NS}::${TYPE};" >> ${CCFILE} + done + echo "" >> ${CCFILE} + fi +done \ No newline at end of file diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 5932cc89..ec954bbe 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,14 +1,47 @@ modules_cc =\ Modules/MContraction/WeakHamiltonianEye.cc \ + Modules/MContraction/Baryon.cc \ + Modules/MContraction/Meson.cc \ Modules/MContraction/WeakNeutral4ptDisc.cc \ Modules/MContraction/WeakHamiltonianNonEye.cc \ + Modules/MContraction/WardIdentity.cc \ + Modules/MContraction/DiscLoop.cc \ + Modules/MContraction/Gamma3pt.cc \ + Modules/MFermion/GaugeProp.cc \ + Modules/MSource/Point.cc \ + Modules/MSource/Wall.cc \ + Modules/MSource/SeqConserved.cc \ + Modules/MSource/SeqGamma.cc \ + Modules/MSource/Z2.cc \ + Modules/MSink/Point.cc \ + Modules/MSink/Smear.cc \ + Modules/MSolver/RBPrecCG.cc \ + Modules/MSolver/LocalCoherenceLanczos.cc \ Modules/MGauge/Unit.cc \ Modules/MGauge/StochEm.cc \ Modules/MGauge/Random.cc \ Modules/MGauge/FundtoHirep.cc \ + Modules/MUtilities/TestSeqGamma.cc \ + Modules/MUtilities/TestSeqConserved.cc \ + Modules/MLoop/NoiseLoop.cc \ Modules/MScalar/FreeProp.cc \ Modules/MScalar/ChargedProp.cc \ - Modules/MIO/LoadNersc.cc + Modules/MAction/Wilson.cc \ + Modules/MAction/ZMobiusDWF.cc \ + Modules/MAction/WilsonClover.cc \ + Modules/MAction/DWF.cc \ + Modules/MScalarSUN/TrPhi.cc \ + Modules/MScalarSUN/TrMag.cc \ + Modules/MScalarSUN/TrKinetic.cc \ + Modules/MScalarSUN/EMT.cc \ + Modules/MScalarSUN/ShiftProbe.cc \ + Modules/MScalarSUN/TransProj.cc \ + Modules/MScalarSUN/TwoPoint.cc \ + Modules/MScalarSUN/Div.cc \ + Modules/MIO/LoadEigenPack.cc \ + Modules/MIO/LoadBinary.cc \ + Modules/MIO/LoadNersc.cc \ + Modules/MIO/LoadCoarseEigenPack.cc modules_hpp =\ Modules/MContraction/Baryon.hpp \ From ce7720e221fcdff4ba5a8f6824fcd1b129a7b623 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 17:36:20 +0100 Subject: [PATCH 265/620] Hadrons: copyright update --- extras/Hadrons/Modules.hpp | 30 +++++++++++++++++++ extras/Hadrons/Modules/MAction/DWF.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MAction/Wilson.cc | 27 +++++++++++++++++ .../Hadrons/Modules/MAction/WilsonClover.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MAction/ZMobiusDWF.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MContraction/Baryon.cc | 27 +++++++++++++++++ .../Hadrons/Modules/MContraction/DiscLoop.cc | 27 +++++++++++++++++ .../Hadrons/Modules/MContraction/Gamma3pt.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MContraction/Meson.cc | 27 +++++++++++++++++ .../Modules/MContraction/WardIdentity.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MFermion/GaugeProp.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MGauge/FundtoHirep.cc | 6 ++-- extras/Hadrons/Modules/MGauge/StochEm.cc | 1 + extras/Hadrons/Modules/MIO/LoadBinary.cc | 27 +++++++++++++++++ .../Modules/MIO/LoadCoarseEigenPack.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MIO/LoadEigenPack.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MLoop/NoiseLoop.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/Div.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/EMT.cc | 27 +++++++++++++++++ .../Hadrons/Modules/MScalarSUN/ShiftProbe.cc | 27 +++++++++++++++++ .../Hadrons/Modules/MScalarSUN/TrKinetic.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/TrMag.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/TrPhi.cc | 27 +++++++++++++++++ .../Hadrons/Modules/MScalarSUN/TransProj.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MSink/Point.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MSink/Point.hpp | 1 + extras/Hadrons/Modules/MSink/Smear.cc | 27 +++++++++++++++++ .../Modules/MSolver/LocalCoherenceLanczos.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MSolver/RBPrecCG.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MSource/Point.cc | 27 +++++++++++++++++ .../Hadrons/Modules/MSource/SeqConserved.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MSource/SeqGamma.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MSource/Wall.cc | 27 +++++++++++++++++ extras/Hadrons/Modules/MSource/Z2.cc | 27 +++++++++++++++++ .../Modules/MUtilities/TestSeqConserved.cc | 27 +++++++++++++++++ .../Modules/MUtilities/TestSeqGamma.cc | 27 +++++++++++++++++ 37 files changed, 927 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index cdd94c35..528faecd 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,3 +1,33 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Guido Cossu +Author: Lanny91 +Author: pretidav + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include #include diff --git a/extras/Hadrons/Modules/MAction/DWF.cc b/extras/Hadrons/Modules/MAction/DWF.cc index 2037238a..ae518018 100644 --- a/extras/Hadrons/Modules/MAction/DWF.cc +++ b/extras/Hadrons/Modules/MAction/DWF.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/DWF.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MAction/Wilson.cc b/extras/Hadrons/Modules/MAction/Wilson.cc index 10526241..11924d5a 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.cc +++ b/extras/Hadrons/Modules/MAction/Wilson.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/Wilson.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.cc b/extras/Hadrons/Modules/MAction/WilsonClover.cc index d0f90f26..77099044 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.cc +++ b/extras/Hadrons/Modules/MAction/WilsonClover.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/WilsonClover.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc b/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc index b5be7d9b..7a49c120 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/ZMobiusDWF.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MContraction/Baryon.cc b/extras/Hadrons/Modules/MContraction/Baryon.cc index 7015e899..7daf5008 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.cc +++ b/extras/Hadrons/Modules/MContraction/Baryon.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/Baryon.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.cc b/extras/Hadrons/Modules/MContraction/DiscLoop.cc index 257d7765..8c7a72ee 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.cc +++ b/extras/Hadrons/Modules/MContraction/DiscLoop.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/DiscLoop.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.cc b/extras/Hadrons/Modules/MContraction/Gamma3pt.cc index c4886223..13e911bb 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.cc +++ b/extras/Hadrons/Modules/MContraction/Gamma3pt.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/Gamma3pt.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MContraction/Meson.cc b/extras/Hadrons/Modules/MContraction/Meson.cc index a1c6a742..3b880705 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.cc +++ b/extras/Hadrons/Modules/MContraction/Meson.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/Meson.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.cc b/extras/Hadrons/Modules/MContraction/WardIdentity.cc index cd188e46..8b5cc2e3 100644 --- a/extras/Hadrons/Modules/MContraction/WardIdentity.cc +++ b/extras/Hadrons/Modules/MContraction/WardIdentity.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/WardIdentity.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.cc b/extras/Hadrons/Modules/MFermion/GaugeProp.cc index 888b86f1..8db69495 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.cc +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MFermion/GaugeProp.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc index ba8e9330..824ee8c8 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.cc @@ -4,9 +4,11 @@ Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 +Author: Antonin Portelli +Author: Guido Cossu +Author: pretidav 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 diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index cfbd28ef..7b07557e 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -7,6 +7,7 @@ Source file: extras/Hadrons/Modules/MGauge/StochEm.cc Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Vera Guelpers 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 diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.cc b/extras/Hadrons/Modules/MIO/LoadBinary.cc index 4eb76ee1..f04df9df 100644 --- a/extras/Hadrons/Modules/MIO/LoadBinary.cc +++ b/extras/Hadrons/Modules/MIO/LoadBinary.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MIO/LoadBinary.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc index 60637566..0ed7643c 100644 --- a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc +++ b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.cc b/extras/Hadrons/Modules/MIO/LoadEigenPack.cc index 1ed0254d..5b7aebc3 100644 --- a/extras/Hadrons/Modules/MIO/LoadEigenPack.cc +++ b/extras/Hadrons/Modules/MIO/LoadEigenPack.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MIO/LoadEigenPack.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MLoop/NoiseLoop.cc b/extras/Hadrons/Modules/MLoop/NoiseLoop.cc index 96707f19..5c510afd 100644 --- a/extras/Hadrons/Modules/MLoop/NoiseLoop.cc +++ b/extras/Hadrons/Modules/MLoop/NoiseLoop.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MLoop/NoiseLoop.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.cc b/extras/Hadrons/Modules/MScalarSUN/Div.cc index 1045b04a..6a2e366d 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.cc +++ b/extras/Hadrons/Modules/MScalarSUN/Div.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/Div.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.cc b/extras/Hadrons/Modules/MScalarSUN/EMT.cc index 0d5d652f..7f8ca16d 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.cc +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/EMT.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc index 339bd9a8..30320667 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc index 8c959dca..8d377f21 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.cc b/extras/Hadrons/Modules/MScalarSUN/TrMag.cc index 3be84f92..29897abc 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.cc +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TrMag.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc b/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc index 58c6df75..e1fcb8e5 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TrPhi.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.cc b/extras/Hadrons/Modules/MScalarSUN/TransProj.cc index 09a469ea..0fb230bb 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.cc +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TransProj.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc index 6e009bb6..840cc02a 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSink/Point.cc b/extras/Hadrons/Modules/MSink/Point.cc index fbb3b2f2..127c4c74 100644 --- a/extras/Hadrons/Modules/MSink/Point.cc +++ b/extras/Hadrons/Modules/MSink/Point.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSink/Point.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSink/Point.hpp b/extras/Hadrons/Modules/MSink/Point.hpp index 1c14915a..a4a28b97 100644 --- a/extras/Hadrons/Modules/MSink/Point.hpp +++ b/extras/Hadrons/Modules/MSink/Point.hpp @@ -7,6 +7,7 @@ Source file: extras/Hadrons/Modules/MSink/Point.hpp Copyright (C) 2015-2018 Author: Antonin Portelli +Author: Guido Cossu Author: Lanny91 This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MSink/Smear.cc b/extras/Hadrons/Modules/MSink/Smear.cc index 8ce5f354..ff250140 100644 --- a/extras/Hadrons/Modules/MSink/Smear.cc +++ b/extras/Hadrons/Modules/MSink/Smear.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSink/Smear.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc index 64588a5b..5bddce95 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.cc b/extras/Hadrons/Modules/MSolver/RBPrecCG.cc index 4c0aa48e..867c6c5d 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.cc +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSource/Point.cc b/extras/Hadrons/Modules/MSource/Point.cc index f16c43d2..5e49af2a 100644 --- a/extras/Hadrons/Modules/MSource/Point.cc +++ b/extras/Hadrons/Modules/MSource/Point.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSource/Point.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.cc b/extras/Hadrons/Modules/MSource/SeqConserved.cc index 9db92c98..35b6ef37 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.cc +++ b/extras/Hadrons/Modules/MSource/SeqConserved.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSource/SeqConserved.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.cc b/extras/Hadrons/Modules/MSource/SeqGamma.cc index 744ad837..ce4f3dd0 100644 --- a/extras/Hadrons/Modules/MSource/SeqGamma.cc +++ b/extras/Hadrons/Modules/MSource/SeqGamma.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSource/SeqGamma.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSource/Wall.cc b/extras/Hadrons/Modules/MSource/Wall.cc index 42e19a8f..9b293232 100644 --- a/extras/Hadrons/Modules/MSource/Wall.cc +++ b/extras/Hadrons/Modules/MSource/Wall.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSource/Wall.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSource/Z2.cc b/extras/Hadrons/Modules/MSource/Z2.cc index e655e253..9644c6fd 100644 --- a/extras/Hadrons/Modules/MSource/Z2.cc +++ b/extras/Hadrons/Modules/MSource/Z2.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSource/Z2.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc index 94d2c946..99beac71 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc +++ b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc index 59635c5d..f53d9f85 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc +++ b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; From b61292f73570fc66df39b3122e4f201e315e9267 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 17:36:43 +0100 Subject: [PATCH 266/620] Hadrons: recursive mkdir function --- extras/Hadrons/Global.cc | 51 +++++++++++++++++++++++++++++++++++++++ extras/Hadrons/Global.hpp | 6 ++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 32060460..22193770 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -92,3 +92,54 @@ const std::string Hadrons::resultFileExt = "h5"; #else const std::string Hadrons::resultFileExt = "xml"; #endif + +// recursive mkdir ///////////////////////////////////////////////////////////// +int Hadrons::mkdir(const std::string dirName) +{ + if (access(dirName.c_str(), R_OK|W_OK|X_OK)) + { + mode_t mode755; + char tmp[MAX_PATH_LENGTH]; + char *p = NULL; + size_t len; + + mode755 = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH; + + snprintf(tmp, sizeof(tmp), "%s", dirName.c_str()); + len = strlen(tmp); + if(tmp[len - 1] == '/') + { + tmp[len - 1] = 0; + } + for(p = tmp + 1; *p; p++) + { + if(*p == '/') + { + *p = 0; + ::mkdir(tmp, mode755); + *p = '/'; + } + } + + return ::mkdir(tmp, mode755); + } + else + { + return 0; + } +} + +std::string Hadrons::basename(const std::string &s) +{ + constexpr char sep = '/'; + size_t i = s.rfind(sep, s.length()); + + if (i != std::string::npos) + { + return s.substr(i+1, s.length() - i); + } + else + { + return s; + } +} diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 12b9a029..cf3a4409 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -187,8 +187,12 @@ typedef XmlWriter ResultWriter; #define RESULT_FILE_NAME(name) \ name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt -// default Schur convention +// recursive mkdir +#define MAX_PATH_LENGTH 512u +int mkdir(const std::string dirName); +std::string basename(const std::string &s); +// default Schur convention #ifndef HADRONS_DEFAULT_SCHUR #define HADRONS_DEFAULT_SCHUR DiagTwo #endif From 2fa2b0e0b12450212f1d4aa2eb94207c4d76a40c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 17:57:17 +0100 Subject: [PATCH 267/620] Hadrons: Application header does not include all the modules --- extras/Hadrons/Application.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Application.hpp b/extras/Hadrons/Application.hpp index 8cd15433..0254f2fc 100644 --- a/extras/Hadrons/Application.hpp +++ b/extras/Hadrons/Application.hpp @@ -31,7 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include -#include +#include BEGIN_HADRONS_NAMESPACE From 6764362237233ce83ea571f35dbeca6834fc8c9b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 18:45:39 +0100 Subject: [PATCH 268/620] Hadrons: automatic directory creation fix --- extras/Hadrons/Global.cc | 17 ++++++++++++++++- extras/Hadrons/Global.hpp | 1 + extras/Hadrons/Module.hpp | 12 +++++++----- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 22193770..82bd8eba 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -96,7 +96,7 @@ const std::string Hadrons::resultFileExt = "xml"; // recursive mkdir ///////////////////////////////////////////////////////////// int Hadrons::mkdir(const std::string dirName) { - if (access(dirName.c_str(), R_OK|W_OK|X_OK)) + if (!dirName.empty() and access(dirName.c_str(), R_OK|W_OK|X_OK)) { mode_t mode755; char tmp[MAX_PATH_LENGTH]; @@ -143,3 +143,18 @@ std::string Hadrons::basename(const std::string &s) return s; } } + +std::string Hadrons::dirname(const std::string &s) +{ + constexpr char sep = '/'; + size_t i = s.rfind(sep, s.length()); + + if (i != std::string::npos) + { + return s.substr(0, i); + } + else + { + return ""; + } +} diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index cf3a4409..5e729579 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -191,6 +191,7 @@ name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt #define MAX_PATH_LENGTH 512u int mkdir(const std::string dirName); std::string basename(const std::string &s); +std::string dirname(const std::string &s); // default Schur convention #ifndef HADRONS_DEFAULT_SCHUR diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 9229a01c..656aacef 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -122,14 +122,16 @@ MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__) #define saveResult(ioStem, name, result)\ if (env().getGrid()->IsBoss())\ {\ - ResultWriter _writer(RESULT_FILE_NAME(ioStem));\ - std::string _basename = basename(ioStem);\ + std::string _dirname = dirname(ioStem);\ \ - if (!mkdir(_basename))\ + if (mkdir(_dirname))\ {\ - HADRON_ERROR(Io, "cannot create directory '" + _basename + "'");\ + HADRON_ERROR(Io, "cannot create directory '" + _dirname + "'");\ + }\ + {\ + ResultWriter _writer(RESULT_FILE_NAME(ioStem));\ + write(_writer, name, result);\ }\ - write(_writer, name, result);\ } /****************************************************************************** From 4f110c09a5f84803a49a5f879a69bea0648bc0be Mon Sep 17 00:00:00 2001 From: Dan H Date: Mon, 23 Apr 2018 15:38:23 -0400 Subject: [PATCH 269/620] Add printing of whether there are unstaged changes in the git hash print. --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index d507bf08..7d336c01 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,7 @@ bin_SCRIPTS=grid-config BUILT_SOURCES = version.h version.h: - echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d\\"%n" HEAD`" > $(srcdir)/lib/version.h + if [ `git status --porcelain | wc -l` -gt 0 ]; then a="unstaged stanges"; else a="no unstaged changes"; fi; echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > $(srcdir)/lib/version.h .PHONY: bench check tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) From 1a2613086a410b0ae93c8a93452085782dbf17bf Mon Sep 17 00:00:00 2001 From: Dan H Date: Mon, 23 Apr 2018 15:42:12 -0400 Subject: [PATCH 270/620] Fix print message. --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 7d336c01..b4f4f788 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,7 @@ bin_SCRIPTS=grid-config BUILT_SOURCES = version.h version.h: - if [ `git status --porcelain | wc -l` -gt 0 ]; then a="unstaged stanges"; else a="no unstaged changes"; fi; echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > $(srcdir)/lib/version.h + if [ `git status --porcelain | wc -l` -gt 0 ]; then a="uncommited changes"; else a="no uncommitted changes"; fi; echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > $(srcdir)/lib/version.h .PHONY: bench check tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) From af84fd65bb953c553ab69771a804e54227600799 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 22:46:17 +0100 Subject: [PATCH 271/620] Hadrons: missing dependency message improvement --- extras/Hadrons/VirtualMachine.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index a96df622..49096d92 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -306,9 +306,10 @@ void VirtualMachine::makeModuleGraph(void) if (min < 0) { - HADRON_ERROR(Definition, "object with address " - + std::to_string(in) - + " is not produced by any module"); + HADRON_ERROR(Definition, "dependency '" + + env().getObjectName(in) + "' (address " + + std::to_string(in) + + ") is not produced by any module"); } else { From 7c4533797f20c5ba1a5b3700d0c8adf5253d27a0 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 23 Apr 2018 22:46:39 +0100 Subject: [PATCH 272/620] Hadrons: scalar SU(N) EMT improvement term optional --- extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 24 ++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp index 445f3445..1059c934 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -99,7 +99,10 @@ std::vector TEMT::getInput(void) for (unsigned int nu = mu; nu < env().getNd(); ++nu) { in.push_back(varName(par().kinetic, mu, nu)); - in.push_back(varName(par().improvement, mu, nu)); + if (!par().improvement.empty()) + { + in.push_back(varName(par().improvement, mu, nu)); + } } in.push_back(varName(par().phiPow, 2)); in.push_back(varName(par().phiPow, 4)); @@ -140,11 +143,17 @@ void TEMT::execute(void) LOG(Message) << "Computing energy-momentum tensor" << std::endl; LOG(Message) << " kinetic terms: '" << par().kinetic << "'" << std::endl; LOG(Message) << " tr(phi^n): '" << par().phiPow << "'" << std::endl; - LOG(Message) << " improvement: '" << par().improvement << "'" << std::endl; + if (!par().improvement.empty()) + { + LOG(Message) << " improvement: '" << par().improvement << "'" << std::endl; + } LOG(Message) << " m^2= " << par().m2 << std::endl; LOG(Message) << " lambda= " << par().lambda << std::endl; LOG(Message) << " g= " << par().g << std::endl; - LOG(Message) << " xi= " << par().xi << std::endl; + if (!par().improvement.empty()) + { + LOG(Message) << " xi= " << par().xi << std::endl; + } const unsigned int N = SImpl::Group::Dimension; auto &trphi2 = envGet(ComplexField, varName(par().phiPow, 2)); @@ -163,9 +172,14 @@ void TEMT::execute(void) { auto &out = envGet(ComplexField, varName(getName(), mu, nu)); auto &trkin = envGet(ComplexField, varName(par().kinetic, mu, nu)); - auto &imp = envGet(ComplexField, varName(par().improvement, mu, nu)); + + out = 2.*trkin; + if (!par().improvement.empty()) + { + auto &imp = envGet(ComplexField, varName(par().improvement, mu, nu)); - out = 2.*trkin + par().xi*imp; + out += par().xi*imp; + } if (mu == nu) { out -= sumkin + par().m2*trphi2 + par().lambda*trphi4; From a1be53332956d4eb074632ef10a1449a0aac582e Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 24 Apr 2018 01:19:53 -0700 Subject: [PATCH 273/620] Corrected Flop count in Benchmark su3 and expanded the Wilson flow output --- benchmarks/Benchmark_su3.cc | 4 ++-- lib/qcd/smearing/WilsonFlow.h | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmarks/Benchmark_su3.cc b/benchmarks/Benchmark_su3.cc index 628ad5bd..5f088fdc 100644 --- a/benchmarks/Benchmark_su3.cc +++ b/benchmarks/Benchmark_su3.cc @@ -166,7 +166,7 @@ int main (int argc, char ** argv) double time = (stop-start)/Nloop*1000.0; double bytes=3*vol*Nc*Nc*sizeof(Complex); - double flops=Nc*Nc*(8+8+8)*vol; + double flops=Nc*Nc*(6+8+8)*vol; std::cout<::smear(GaugeField& out, const GaugeField& in) const { std::cout << "Time to evolve " << diff.count() << " s\n"; #endif std::cout << GridLogMessage << "[WilsonFlow] Energy density (plaq) : " - << step << " " - << energyDensityPlaquette(step,out) << std::endl; + << step << " " << tau(step) << " " + << energyDensityPlaquette(step,out) << std::endl; if( step % measure_interval == 0){ std::cout << GridLogMessage << "[WilsonFlow] Top. charge : " << step << " " @@ -193,8 +193,8 @@ void WilsonFlow::smear_adaptive(GaugeField& out, const GaugeField& in, Re //std::cout << GridLogMessage << "Evolution time :"<< taus << std::endl; evolve_step_adaptive(out, maxTau); std::cout << GridLogMessage << "[WilsonFlow] Energy density (plaq) : " - << step << " " - << energyDensityPlaquette(out) << std::endl; + << step << " " << taus << " " + << energyDensityPlaquette(out) << std::endl; if( step % measure_interval == 0){ std::cout << GridLogMessage << "[WilsonFlow] Top. charge : " << step << " " From c5b9147b5334be7f7996e8814df6762f0b9ae1e9 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 24 Apr 2018 08:03:57 -0700 Subject: [PATCH 274/620] Correction of a minor bug in the su3 benchmark --- benchmarks/Benchmark_su3.cc | 52 ++++++++++++++++++------------------- lib/cshift/Cshift_mpi.h | 13 +++++++--- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/benchmarks/Benchmark_su3.cc b/benchmarks/Benchmark_su3.cc index 5f088fdc..b31af942 100644 --- a/benchmarks/Benchmark_su3.cc +++ b/benchmarks/Benchmark_su3.cc @@ -52,7 +52,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -147,30 +147,30 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); - int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; - - GridCartesian Grid(latt_size,simd_layout,mpi_layout); - GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(std::vector({45,12,81,9})); - - LatticeColourMatrix z(&Grid); random(pRNG,z); - LatticeColourMatrix x(&Grid); random(pRNG,x); - LatticeColourMatrix y(&Grid); random(pRNG,y); - - double start=usecond(); - for(int64_t i=0;i latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); + int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(std::vector({45,12,81,9})); + + LatticeColourMatrix z(&Grid); random(pRNG,z); + LatticeColourMatrix x(&Grid); random(pRNG,x); + LatticeColourMatrix y(&Grid); random(pRNG,y); + + double start=usecond(); + for(int64_t i=0;i latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -190,7 +189,7 @@ int main (int argc, char ** argv) LatticeColourMatrix x(&Grid); random(pRNG,x); LatticeColourMatrix y(&Grid); random(pRNG,y); - for(int mu=0;mu<=4;mu++){ + for(int mu=0;mu<4;mu++){ double start=usecond(); for(int64_t i=0;i Lattice Cshift(const Lattice &rhs,int dimension if ( !comm_dim ) { - // std::cout << "Cshift_local" < void Cshift_comms_simd(Lattice& ret,const LatticeCheckerBoardShiftForCB(rhs.checkerboard,dimension,shift,Even); sshift[1] = rhs._grid->CheckerBoardShiftForCB(rhs.checkerboard,dimension,shift,Odd); + //std::cout << "Cshift_comms_simd dim "< void Cshift_comms_simd(Lattice &ret,const Lattice_simd_layout[dimension]; int comm_dim = grid->_processors[dimension] >1 ; + //std::cout << "Cshift_comms_simd dim "<< dimension << " fd "<=0); From b25a59e95e19e419ce487ac901c0bf1ae7717e84 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 17:20:25 +0100 Subject: [PATCH 275/620] Hadrons: mitigation of GCC/Intel compiler bug not generating defaulted destructors --- extras/Hadrons/Modules/MAction/DWF.hpp | 2 +- extras/Hadrons/Modules/MAction/Wilson.hpp | 2 +- extras/Hadrons/Modules/MAction/WilsonClover.hpp | 2 +- extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp | 2 +- extras/Hadrons/Modules/MContraction/Baryon.hpp | 2 +- extras/Hadrons/Modules/MContraction/DiscLoop.hpp | 2 +- extras/Hadrons/Modules/MContraction/Gamma3pt.hpp | 2 +- extras/Hadrons/Modules/MContraction/Meson.hpp | 2 +- extras/Hadrons/Modules/MContraction/WardIdentity.hpp | 2 +- extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp | 2 +- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 2 +- extras/Hadrons/Modules/MGauge/FundtoHirep.hpp | 2 +- extras/Hadrons/Modules/MGauge/Random.hpp | 2 +- extras/Hadrons/Modules/MGauge/StochEm.hpp | 2 +- extras/Hadrons/Modules/MGauge/Unit.hpp | 2 +- extras/Hadrons/Modules/MIO/LoadBinary.hpp | 2 +- extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp | 2 +- extras/Hadrons/Modules/MIO/LoadEigenPack.hpp | 2 +- extras/Hadrons/Modules/MIO/LoadNersc.hpp | 2 +- extras/Hadrons/Modules/MLoop/NoiseLoop.hpp | 2 +- extras/Hadrons/Modules/MScalar/ChargedProp.hpp | 2 +- extras/Hadrons/Modules/MScalar/FreeProp.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/Div.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 4 ++-- extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/TransProj.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 2 +- extras/Hadrons/Modules/MSink/Point.hpp | 2 +- extras/Hadrons/Modules/MSink/Smear.hpp | 2 +- extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp | 2 +- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 2 +- extras/Hadrons/Modules/MSource/Point.hpp | 2 +- extras/Hadrons/Modules/MSource/SeqConserved.hpp | 2 +- extras/Hadrons/Modules/MSource/SeqGamma.hpp | 2 +- extras/Hadrons/Modules/MSource/Wall.hpp | 2 +- extras/Hadrons/Modules/MSource/Z2.hpp | 2 +- extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp | 2 +- extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp | 2 +- 41 files changed, 42 insertions(+), 42 deletions(-) diff --git a/extras/Hadrons/Modules/MAction/DWF.hpp b/extras/Hadrons/Modules/MAction/DWF.hpp index 6be35a8a..f0dda4b0 100644 --- a/extras/Hadrons/Modules/MAction/DWF.hpp +++ b/extras/Hadrons/Modules/MAction/DWF.hpp @@ -61,7 +61,7 @@ public: // constructor TDWF(const std::string name); // destructor - virtual ~TDWF(void) = default; + virtual ~TDWF(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MAction/Wilson.hpp b/extras/Hadrons/Modules/MAction/Wilson.hpp index 5508b6b8..1a119571 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.hpp +++ b/extras/Hadrons/Modules/MAction/Wilson.hpp @@ -59,7 +59,7 @@ public: // constructor TWilson(const std::string name); // destructor - virtual ~TWilson(void) = default; + virtual ~TWilson(void) {}; // dependencies/products virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/extras/Hadrons/Modules/MAction/WilsonClover.hpp index a93a0136..ead3accc 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/extras/Hadrons/Modules/MAction/WilsonClover.hpp @@ -64,7 +64,7 @@ public: // constructor TWilsonClover(const std::string name); // destructor - virtual ~TWilsonClover(void) = default; + virtual ~TWilsonClover(void) {}; // dependencies/products virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp index 58a6bb1a..52e65322 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -62,7 +62,7 @@ public: // constructor TZMobiusDWF(const std::string name); // destructor - virtual ~TZMobiusDWF(void) = default; + virtual ~TZMobiusDWF(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MContraction/Baryon.hpp b/extras/Hadrons/Modules/MContraction/Baryon.hpp index 87691e7b..654706c6 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.hpp +++ b/extras/Hadrons/Modules/MContraction/Baryon.hpp @@ -68,7 +68,7 @@ public: // constructor TBaryon(const std::string name); // destructor - virtual ~TBaryon(void) = default; + virtual ~TBaryon(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp index 1c872f0a..ea3d3d2f 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp +++ b/extras/Hadrons/Modules/MContraction/DiscLoop.hpp @@ -65,7 +65,7 @@ public: // constructor TDiscLoop(const std::string name); // destructor - virtual ~TDiscLoop(void) = default; + virtual ~TDiscLoop(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp index 2b4b88a7..e30845bc 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp +++ b/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp @@ -96,7 +96,7 @@ public: // constructor TGamma3pt(const std::string name); // destructor - virtual ~TGamma3pt(void) = default; + virtual ~TGamma3pt(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index f75e55dc..036247e2 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -90,7 +90,7 @@ public: // constructor TMeson(const std::string name); // destructor - virtual ~TMeson(void) = default; + virtual ~TMeson(void) {}; // dependencies/products virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp index 3b9a1449..f1ca6c2b 100644 --- a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp +++ b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp @@ -71,7 +71,7 @@ public: // constructor TWardIdentity(const std::string name); // destructor - virtual ~TWardIdentity(void) = default; + virtual ~TWardIdentity(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp index 84edc366..507e8cdb 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp @@ -97,7 +97,7 @@ public:\ /* constructor */ \ T##modname(const std::string name);\ /* destructor */ \ - virtual ~T##modname(void) = default;\ + virtual ~T##modname(void) {};\ /* dependency relation */ \ virtual std::vector getInput(void);\ virtual std::vector getOutput(void);\ diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index e85acecb..9a359427 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -81,7 +81,7 @@ public: // constructor TGaugeProp(const std::string name); // destructor - virtual ~TGaugeProp(void) = default; + virtual ~TGaugeProp(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp index 07274544..3a3a83e5 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp +++ b/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp @@ -55,7 +55,7 @@ public: // constructor TFundtoHirep(const std::string name); // destructor - virtual ~TFundtoHirep(void) = default; + virtual ~TFundtoHirep(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MGauge/Random.hpp b/extras/Hadrons/Modules/MGauge/Random.hpp index ddc81fc1..13d0e478 100644 --- a/extras/Hadrons/Modules/MGauge/Random.hpp +++ b/extras/Hadrons/Modules/MGauge/Random.hpp @@ -46,7 +46,7 @@ public: // constructor TRandom(const std::string name); // destructor - virtual ~TRandom(void) = default; + virtual ~TRandom(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index aa7fa51f..a933afab 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -57,7 +57,7 @@ public: // constructor TStochEm(const std::string name); // destructor - virtual ~TStochEm(void) = default; + virtual ~TStochEm(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MGauge/Unit.hpp b/extras/Hadrons/Modules/MGauge/Unit.hpp index bd0faa25..8bdb7ef3 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.hpp +++ b/extras/Hadrons/Modules/MGauge/Unit.hpp @@ -46,7 +46,7 @@ public: // constructor TUnit(const std::string name); // destructor - virtual ~TUnit(void) = default; + virtual ~TUnit(void) {}; // dependencies/products virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.hpp b/extras/Hadrons/Modules/MIO/LoadBinary.hpp index f14be5fb..b2070bef 100644 --- a/extras/Hadrons/Modules/MIO/LoadBinary.hpp +++ b/extras/Hadrons/Modules/MIO/LoadBinary.hpp @@ -61,7 +61,7 @@ public: // constructor TLoadBinary(const std::string name); // destructor - virtual ~TLoadBinary(void) = default; + virtual ~TLoadBinary(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp index 609e5ed4..6661f3cc 100644 --- a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp @@ -63,7 +63,7 @@ public: // constructor TLoadCoarseEigenPack(const std::string name); // destructor - virtual ~TLoadCoarseEigenPack(void) = default; + virtual ~TLoadCoarseEigenPack(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp index 8a3b40e7..a95bc51e 100644 --- a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp @@ -58,7 +58,7 @@ public: // constructor TLoadEigenPack(const std::string name); // destructor - virtual ~TLoadEigenPack(void) = default; + virtual ~TLoadEigenPack(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MIO/LoadNersc.hpp b/extras/Hadrons/Modules/MIO/LoadNersc.hpp index 309edad2..11b86eec 100644 --- a/extras/Hadrons/Modules/MIO/LoadNersc.hpp +++ b/extras/Hadrons/Modules/MIO/LoadNersc.hpp @@ -52,7 +52,7 @@ public: // constructor TLoadNersc(const std::string name); // destructor - virtual ~TLoadNersc(void) = default; + virtual ~TLoadNersc(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp b/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp index 588c63da..3ce9353d 100644 --- a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp +++ b/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp @@ -71,7 +71,7 @@ public: // constructor TNoiseLoop(const std::string name); // destructor - virtual ~TNoiseLoop(void) = default; + virtual ~TNoiseLoop(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 72a40cad..549d6154 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -60,7 +60,7 @@ public: // constructor TChargedProp(const std::string name); // destructor - virtual ~TChargedProp(void) = default; + virtual ~TChargedProp(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalar/FreeProp.hpp b/extras/Hadrons/Modules/MScalar/FreeProp.hpp index bf7823e6..50f4ba52 100644 --- a/extras/Hadrons/Modules/MScalar/FreeProp.hpp +++ b/extras/Hadrons/Modules/MScalar/FreeProp.hpp @@ -56,7 +56,7 @@ public: // constructor TFreeProp(const std::string name); // destructor - virtual ~TFreeProp(void) = default; + virtual ~TFreeProp(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index 9b30866c..4382eb9f 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -66,7 +66,7 @@ public: // constructor TDiv(const std::string name); // destructor - virtual ~TDiv(void) = default; + virtual ~TDiv(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp index 1059c934..fbc9c62a 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -64,7 +64,7 @@ public: // constructor TEMT(const std::string name); // destructor - virtual ~TEMT(void) = default; + virtual ~TEMT(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index 41b8c553..979a340e 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -69,7 +69,7 @@ public: // constructor TShiftProbe(const std::string name); // destructor - virtual ~TShiftProbe(void) = default; + virtual ~TShiftProbe(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); @@ -159,7 +159,7 @@ void TShiftProbe::execute(void) acc *= Cshift(phi, shift[i].first, shift[i].second); } } - probe = sign*trace(acc); + probe = real(sign*trace(acc)); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index e448b61e..a8c7f521 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -66,7 +66,7 @@ public: // constructor TTrKinetic(const std::string name); // destructor - virtual ~TTrKinetic(void) = default; + virtual ~TTrKinetic(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp index efadc16f..ed1a629a 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -66,7 +66,7 @@ public: // constructor TTrMag(const std::string name); // destructor - virtual ~TTrMag(void) = default; + virtual ~TTrMag(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index 3f43a7b1..a61c00bc 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -66,7 +66,7 @@ public: // constructor TTrPhi(const std::string name); // destructor - virtual ~TTrPhi(void) = default; + virtual ~TTrPhi(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp index b525b053..6c6502fc 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -66,7 +66,7 @@ public: // constructor TTransProj(const std::string name); // destructor - virtual ~TTransProj(void) = default; + virtual ~TTransProj(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index e50e23d7..27edf370 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -70,7 +70,7 @@ public: // constructor TTwoPoint(const std::string name); // destructor - virtual ~TTwoPoint(void) = default; + virtual ~TTwoPoint(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSink/Point.hpp b/extras/Hadrons/Modules/MSink/Point.hpp index a4a28b97..7617ee78 100644 --- a/extras/Hadrons/Modules/MSink/Point.hpp +++ b/extras/Hadrons/Modules/MSink/Point.hpp @@ -59,7 +59,7 @@ public: // constructor TPoint(const std::string name); // destructor - virtual ~TPoint(void) = default; + virtual ~TPoint(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSink/Smear.hpp b/extras/Hadrons/Modules/MSink/Smear.hpp index 82a21a80..1a46c693 100644 --- a/extras/Hadrons/Modules/MSink/Smear.hpp +++ b/extras/Hadrons/Modules/MSink/Smear.hpp @@ -59,7 +59,7 @@ public: // constructor TSmear(const std::string name); // destructor - virtual ~TSmear(void) = default; + virtual ~TSmear(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 4695d8e2..b4bad7b5 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -69,7 +69,7 @@ public: // constructor TLocalCoherenceLanczos(const std::string name); // destructor - virtual ~TLocalCoherenceLanczos(void) = default; + virtual ~TLocalCoherenceLanczos(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index e241161f..f559c4eb 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -67,7 +67,7 @@ public: // constructor TRBPrecCG(const std::string name); // destructor - virtual ~TRBPrecCG(void) = default; + virtual ~TRBPrecCG(void) {}; // dependencies/products virtual std::vector getInput(void); virtual std::vector getReference(void); diff --git a/extras/Hadrons/Modules/MSource/Point.hpp b/extras/Hadrons/Modules/MSource/Point.hpp index 50297a8b..0898a1a8 100644 --- a/extras/Hadrons/Modules/MSource/Point.hpp +++ b/extras/Hadrons/Modules/MSource/Point.hpp @@ -68,7 +68,7 @@ public: // constructor TPoint(const std::string name); // destructor - virtual ~TPoint(void) = default; + virtual ~TPoint(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.hpp b/extras/Hadrons/Modules/MSource/SeqConserved.hpp index a5d21995..ce9cd4e6 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/extras/Hadrons/Modules/MSource/SeqConserved.hpp @@ -89,7 +89,7 @@ public: // constructor TSeqConserved(const std::string name); // destructor - virtual ~TSeqConserved(void) = default; + virtual ~TSeqConserved(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.hpp b/extras/Hadrons/Modules/MSource/SeqGamma.hpp index 9d99b5b3..4fe4dd76 100644 --- a/extras/Hadrons/Modules/MSource/SeqGamma.hpp +++ b/extras/Hadrons/Modules/MSource/SeqGamma.hpp @@ -76,7 +76,7 @@ public: // constructor TSeqGamma(const std::string name); // destructor - virtual ~TSeqGamma(void) = default; + virtual ~TSeqGamma(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSource/Wall.hpp b/extras/Hadrons/Modules/MSource/Wall.hpp index 9494e739..f8bec19e 100644 --- a/extras/Hadrons/Modules/MSource/Wall.hpp +++ b/extras/Hadrons/Modules/MSource/Wall.hpp @@ -70,7 +70,7 @@ public: // constructor TWall(const std::string name); // destructor - virtual ~TWall(void) = default; + virtual ~TWall(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MSource/Z2.hpp b/extras/Hadrons/Modules/MSource/Z2.hpp index 065d5fdf..cecff8b0 100644 --- a/extras/Hadrons/Modules/MSource/Z2.hpp +++ b/extras/Hadrons/Modules/MSource/Z2.hpp @@ -71,7 +71,7 @@ public: // constructor TZ2(const std::string name); // destructor - virtual ~TZ2(void) = default; + virtual ~TZ2(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp index bf2370eb..dcd1ba9a 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp +++ b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp @@ -77,7 +77,7 @@ public: // constructor TTestSeqConserved(const std::string name); // destructor - virtual ~TTestSeqConserved(void) = default; + virtual ~TTestSeqConserved(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp index 9284a638..6f2665e4 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp +++ b/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp @@ -61,7 +61,7 @@ public: // constructor TTestSeqGamma(const std::string name); // destructor - virtual ~TTestSeqGamma(void) = default; + virtual ~TTestSeqGamma(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); From 325c73d0513968b00fdc28c67f1e5e572c50d847 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 17:55:08 +0100 Subject: [PATCH 276/620] Hadrons: module template update --- .../Modules/templates/Module.cc.template | 39 --------- .../Modules/templates/Module.hpp.template | 40 --------- .../templates/Module_in_NS.hpp.template | 2 +- .../Modules/templates/Module_tmp.hpp.template | 81 ------------------- .../templates/Module_tmp_in_NS.cc.template | 7 ++ .../templates/Module_tmp_in_NS.hpp.template | 2 +- extras/Hadrons/add_module.sh | 35 +++----- extras/Hadrons/add_module_template.sh | 32 +++----- 8 files changed, 35 insertions(+), 203 deletions(-) delete mode 100644 extras/Hadrons/Modules/templates/Module.cc.template delete mode 100644 extras/Hadrons/Modules/templates/Module.hpp.template delete mode 100644 extras/Hadrons/Modules/templates/Module_tmp.hpp.template create mode 100644 extras/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template diff --git a/extras/Hadrons/Modules/templates/Module.cc.template b/extras/Hadrons/Modules/templates/Module.cc.template deleted file mode 100644 index 0c509d6d..00000000 --- a/extras/Hadrons/Modules/templates/Module.cc.template +++ /dev/null @@ -1,39 +0,0 @@ -#include - -using namespace Grid; -using namespace Hadrons; - -/****************************************************************************** -* T___FILEBASENAME___ implementation * -******************************************************************************/ -// constructor ///////////////////////////////////////////////////////////////// -T___FILEBASENAME___::T___FILEBASENAME___(const std::string name) -: Module<___FILEBASENAME___Par>(name) -{} - -// dependencies/products /////////////////////////////////////////////////////// -std::vector T___FILEBASENAME___::getInput(void) -{ - std::vector in; - - return in; -} - -std::vector T___FILEBASENAME___::getOutput(void) -{ - std::vector out = {getName()}; - - return out; -} - -// setup /////////////////////////////////////////////////////////////////////// -void T___FILEBASENAME___::setup(void) -{ - -} - -// execution /////////////////////////////////////////////////////////////////// -void T___FILEBASENAME___::execute(void) -{ - -} diff --git a/extras/Hadrons/Modules/templates/Module.hpp.template b/extras/Hadrons/Modules/templates/Module.hpp.template deleted file mode 100644 index fb43260f..00000000 --- a/extras/Hadrons/Modules/templates/Module.hpp.template +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef Hadrons____FILEBASENAME____hpp_ -#define Hadrons____FILEBASENAME____hpp_ - -#include -#include -#include - -BEGIN_HADRONS_NAMESPACE - -/****************************************************************************** - * ___FILEBASENAME___ * - ******************************************************************************/ -class ___FILEBASENAME___Par: Serializable -{ -public: - GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, - unsigned int, i); -}; - -class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> -{ -public: - // constructor - T___FILEBASENAME___(const std::string name); - // destructor - virtual ~T___FILEBASENAME___(void) = default; - // dependency relation - virtual std::vector getInput(void); - virtual std::vector getOutput(void); - // setup - virtual void setup(void); - // execution - virtual void execute(void); -}; - -MODULE_REGISTER(___FILEBASENAME___, T___FILEBASENAME___); - -END_HADRONS_NAMESPACE - -#endif // Hadrons____FILEBASENAME____hpp_ diff --git a/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template b/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template index f645d046..b34568c2 100644 --- a/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template +++ b/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template @@ -25,7 +25,7 @@ public: // constructor T___FILEBASENAME___(const std::string name); // destructor - virtual ~T___FILEBASENAME___(void) = default; + virtual ~T___FILEBASENAME___(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/Modules/templates/Module_tmp.hpp.template b/extras/Hadrons/Modules/templates/Module_tmp.hpp.template deleted file mode 100644 index 2ee053a9..00000000 --- a/extras/Hadrons/Modules/templates/Module_tmp.hpp.template +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef Hadrons____FILEBASENAME____hpp_ -#define Hadrons____FILEBASENAME____hpp_ - -#include -#include -#include - -BEGIN_HADRONS_NAMESPACE - -/****************************************************************************** - * ___FILEBASENAME___ * - ******************************************************************************/ -class ___FILEBASENAME___Par: Serializable -{ -public: - GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, - unsigned int, i); -}; - -template -class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> -{ -public: - // constructor - T___FILEBASENAME___(const std::string name); - // destructor - virtual ~T___FILEBASENAME___(void) = default; - // dependency relation - virtual std::vector getInput(void); - virtual std::vector getOutput(void); - // setup - virtual void setup(void); - // execution - virtual void execute(void); -}; - -MODULE_REGISTER(___FILEBASENAME___, T___FILEBASENAME___); - -/****************************************************************************** - * T___FILEBASENAME___ implementation * - ******************************************************************************/ -// constructor ///////////////////////////////////////////////////////////////// -template -T___FILEBASENAME___::T___FILEBASENAME___(const std::string name) -: Module<___FILEBASENAME___Par>(name) -{} - -// dependencies/products /////////////////////////////////////////////////////// -template -std::vector T___FILEBASENAME___::getInput(void) -{ - std::vector in; - - return in; -} - -template -std::vector T___FILEBASENAME___::getOutput(void) -{ - std::vector out = {getName()}; - - return out; -} - -// setup /////////////////////////////////////////////////////////////////////// -template -void T___FILEBASENAME___::setup(void) -{ - -} - -// execution /////////////////////////////////////////////////////////////////// -template -void T___FILEBASENAME___::execute(void) -{ - -} - -END_HADRONS_NAMESPACE - -#endif // Hadrons____FILEBASENAME____hpp_ diff --git a/extras/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template b/extras/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template new file mode 100644 index 00000000..8dfafcf8 --- /dev/null +++ b/extras/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace ___NAMESPACE___; + +template class Grid::Hadrons::___NAMESPACE___::T___FILEBASENAME___; diff --git a/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template b/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template index 48df254b..5a05a498 100644 --- a/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template +++ b/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template @@ -26,7 +26,7 @@ public: // constructor T___FILEBASENAME___(const std::string name); // destructor - virtual ~T___FILEBASENAME___(void) = default; + virtual ~T___FILEBASENAME___(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); diff --git a/extras/Hadrons/add_module.sh b/extras/Hadrons/add_module.sh index d5d23ea4..e37d19b1 100755 --- a/extras/Hadrons/add_module.sh +++ b/extras/Hadrons/add_module.sh @@ -1,31 +1,22 @@ #!/usr/bin/env bash -if (( $# != 1 && $# != 2)); then - echo "usage: `basename $0` []" 1>&2 +if (( $# != 2 )); then + echo "usage: `basename $0` " 1>&2 exit 1 fi NAME=$1 NS=$2 -if (( $# == 1 )); then - if [ -e "Modules/${NAME}.cc" ] || [ -e "Modules/${NAME}.hpp" ]; then - echo "error: files Modules/${NAME}.* already exists" 1>&2 - exit 1 - fi - sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module.cc.template > Modules/${NAME}.cc - sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module.hpp.template > Modules/${NAME}.hpp -elif (( $# == 2 )); then - mkdir -p Modules/${NS} - if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then - echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 - exit 1 - fi - TMPCC=".${NS}.${NAME}.tmp.cc" - TMPHPP=".${NS}.${NAME}.tmp.hpp" - sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.cc.template > ${TMPCC} - sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.hpp.template > ${TMPHPP} - sed "s/___NAMESPACE___/${NS}/g" ${TMPCC} > Modules/${NS}/${NAME}.cc - sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp - rm -f ${TMPCC} ${TMPHPP} +mkdir -p Modules/${NS} +if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then + echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 + exit 1 fi +TMPCC=".${NS}.${NAME}.tmp.cc" +TMPHPP=".${NS}.${NAME}.tmp.hpp" +sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.cc.template > ${TMPCC} +sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.hpp.template > ${TMPHPP} +sed "s/___NAMESPACE___/${NS}/g" ${TMPCC} > Modules/${NS}/${NAME}.cc +sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp +rm -f ${TMPCC} ${TMPHPP} ./make_module_list.sh diff --git a/extras/Hadrons/add_module_template.sh b/extras/Hadrons/add_module_template.sh index 0069fcea..8ba112dd 100755 --- a/extras/Hadrons/add_module_template.sh +++ b/extras/Hadrons/add_module_template.sh @@ -1,28 +1,22 @@ #!/usr/bin/env bash -if (( $# != 1 && $# != 2)); then - echo "usage: `basename $0` []" 1>&2 +if (( $# != 2)); then + echo "usage: `basename $0` " 1>&2 exit 1 fi NAME=$1 NS=$2 -if (( $# == 1 )); then - if [ -e "Modules/${NAME}.cc" ] || [ -e "Modules/${NAME}.hpp" ]; then - echo "error: files Modules/${NAME}.* already exists" 1>&2 - exit 1 - fi - sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp.hpp.template > Modules/${NAME}.hpp -elif (( $# == 2 )); then - mkdir -p Modules/${NS} - if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then - echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 - exit 1 - fi - TMPCC=".${NS}.${NAME}.tmp.cc" - TMPHPP=".${NS}.${NAME}.tmp.hpp" - sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp_in_NS.hpp.template > ${TMPHPP} - sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp - rm -f ${TMPCC} ${TMPHPP} +mkdir -p Modules/${NS} +if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then + echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 + exit 1 fi +TMPCC=".${NS}.${NAME}.tmp.cc" +TMPHPP=".${NS}.${NAME}.tmp.hpp" +sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp_in_NS.cc.template > ${TMPCC} +sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp_in_NS.hpp.template > ${TMPHPP} +sed "s/___NAMESPACE___/${NS}/g" ${TMPCC} > Modules/${NS}/${NAME}.cc +sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp +rm -f ${TMPCC} ${TMPHPP} ./make_module_list.sh From 75113e6523bf5a5687c27c826a8b8e892722a84a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 19:49:27 +0100 Subject: [PATCH 277/620] Hadrons: Scalar SU(N) variable name update --- extras/Hadrons/Modules/MScalarSUN/Utils.hpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp index 1a17282a..b9e49715 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp @@ -89,15 +89,20 @@ inline void dmuAcc(Field &out, const Field &in, const unsigned int mu, const Dif } } +inline std::string varName(const std::string name, const std::string suf) +{ + return name + "_" + suf; +} + inline std::string varName(const std::string name, const unsigned int mu) { - return name + "_" + std::to_string(mu); + return varName(name, std::to_string(mu)); } inline std::string varName(const std::string name, const unsigned int mu, const unsigned int nu) { - return name + "_" + std::to_string(mu) + "_" + std::to_string(nu); + return varName(name, std::to_string(mu) + "_" + std::to_string(nu)); } END_MODULE_NAMESPACE From a13106da0cb40469cfecb281ee619186bf7f95fc Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 19:49:51 +0100 Subject: [PATCH 278/620] Hadrons: scalar SU(N) gradient --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MScalarSUN/Grad.cc | 38 +++++ extras/Hadrons/Modules/MScalarSUN/Grad.hpp | 165 +++++++++++++++++++++ extras/Hadrons/modules.inc | 2 + 4 files changed, 206 insertions(+) create mode 100644 extras/Hadrons/Modules/MScalarSUN/Grad.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/Grad.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 528faecd..fc536393 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -69,6 +69,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/Grad.cc b/extras/Hadrons/Modules/MScalarSUN/Grad.cc new file mode 100644 index 00000000..be03b4a7 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/Grad.cc @@ -0,0 +1,38 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/Grad.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TGrad>; +template class Grid::Hadrons::MScalarSUN::TGrad>; +template class Grid::Hadrons::MScalarSUN::TGrad>; +template class Grid::Hadrons::MScalarSUN::TGrad>; +template class Grid::Hadrons::MScalarSUN::TGrad>; diff --git a/extras/Hadrons/Modules/MScalarSUN/Grad.hpp b/extras/Hadrons/Modules/MScalarSUN/Grad.hpp new file mode 100644 index 00000000..7718fbf2 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/Grad.hpp @@ -0,0 +1,165 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/Grad.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MScalarSUN_Grad_hpp_ +#define Hadrons_MScalarSUN_Grad_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Gradient of a complex field * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class GradPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(GradPar, + std::string, op, + DiffType, type, + std::string, output); +}; + +template +class TGrad: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + DiffType, type, + Complex, value); + }; +public: + // constructor + TGrad(const std::string name); + // destructor + virtual ~TGrad(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(GradSU2, TGrad>, MScalarSUN); +MODULE_REGISTER_TMP(GradSU3, TGrad>, MScalarSUN); +MODULE_REGISTER_TMP(GradSU4, TGrad>, MScalarSUN); +MODULE_REGISTER_TMP(GradSU5, TGrad>, MScalarSUN); +MODULE_REGISTER_TMP(GradSU6, TGrad>, MScalarSUN); + +/****************************************************************************** + * TGrad implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TGrad::TGrad(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TGrad::getInput(void) +{ + std::vector in = {par().op}; + + return in; +} + +template +std::vector TGrad::getOutput(void) +{ + std::vector out; + const auto nd = env().getNd(); + + for (unsigned int mu = 0; mu < nd; ++mu) + { + out.push_back(varName(getName(), mu)); + } + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TGrad::setup(void) +{ + const auto nd = env().getNd(); + + for (unsigned int mu = 0; mu < nd; ++mu) + { + envCreateLat(ComplexField, varName(getName(), mu)); + } +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TGrad::execute(void) +{ + const auto nd = env().getNd(); + + LOG(Message) << "Computing the " << par().type << " gradient of '" + << par().op << "'" << std::endl; + + std::vector result; + auto &op = envGet(ComplexField, par().op); + + for (unsigned int mu = 0; mu < nd; ++mu) + { + auto &der = envGet(ComplexField, varName(getName(), mu)); + + dmu(der, op, mu, par().type); + if (!par().output.empty()) + { + Result r; + + r.type = par().type; + r.value = TensorRemove(sum(der)); + result.push_back(r); + } + } + if (result.size() > 0) + { + saveResult(par().output, "grad", result); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_Grad_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index ec954bbe..ad3a8727 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -31,6 +31,7 @@ modules_cc =\ Modules/MAction/WilsonClover.cc \ Modules/MAction/DWF.cc \ Modules/MScalarSUN/TrPhi.cc \ + Modules/MScalarSUN/Grad.cc \ Modules/MScalarSUN/TrMag.cc \ Modules/MScalarSUN/TrKinetic.cc \ Modules/MScalarSUN/EMT.cc \ @@ -85,6 +86,7 @@ modules_hpp =\ Modules/MScalarSUN/TrPhi.hpp \ Modules/MScalarSUN/Utils.hpp \ Modules/MScalarSUN/TransProj.hpp \ + Modules/MScalarSUN/Grad.hpp \ Modules/MScalarSUN/TrKinetic.hpp \ Modules/MIO/LoadEigenPack.hpp \ Modules/MIO/LoadNersc.hpp \ From 047ee4ad0bbf75e9ab728947ad3b680bac416e0c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 19:50:58 +0100 Subject: [PATCH 279/620] Hadrons: scalar SU(N) cleanup --- extras/Hadrons/Modules/MScalarSUN/Div.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index 4382eb9f..d1f6df26 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -126,7 +126,7 @@ void TDiv::execute(void) LOG(Message) << "Computing the " << par().type << " divergence of ["; for (unsigned int mu = 0; mu < nd; ++mu) { - std::cout << par().op[mu] << ((mu == nd - 1) ? "]" : ", "); + std::cout << "'" << par().op[mu] << ((mu == nd - 1) ? "']" : "', "); } std::cout << std::endl; From c1d0359aaa05518b9668452f73c08a3312af80d8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 19:51:22 +0100 Subject: [PATCH 280/620] Hadrons: scalar SU(N) kinetic term saves trace --- extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 11 ++------- .../Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 24 +++++++++++++++++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp index fbc9c62a..025b7936 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -104,6 +104,7 @@ std::vector TEMT::getInput(void) in.push_back(varName(par().improvement, mu, nu)); } } + in.push_back(varName(par().kinetic, "sum")); in.push_back(varName(par().phiPow, 2)); in.push_back(varName(par().phiPow, 4)); @@ -133,7 +134,6 @@ void TEMT::setup(void) { envCreateLat(ComplexField, varName(getName(), mu, nu)); } - envTmpLat(ComplexField, "sumkin"); } // execution /////////////////////////////////////////////////////////////////// @@ -158,15 +158,8 @@ void TEMT::execute(void) const unsigned int N = SImpl::Group::Dimension; auto &trphi2 = envGet(ComplexField, varName(par().phiPow, 2)); auto &trphi4 = envGet(ComplexField, varName(par().phiPow, 4)); + auto &sumkin = envGet(ComplexField, varName(par().kinetic, "sum")); - envGetTmp(ComplexField, sumkin); - sumkin = zero; - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - { - auto &trkin = envGet(ComplexField, varName(par().kinetic, mu, mu)); - - sumkin += trkin; - } for (unsigned int mu = 0; mu < env().getNd(); ++mu) for (unsigned int nu = mu; nu < env().getNd(); ++nu) { diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index a8c7f521..59aa27b8 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -110,6 +110,7 @@ std::vector TTrKinetic::getOutput(void) { out.push_back(varName(getName(), mu, nu)); } + out.push_back(varName(getName(), "sum")); return out; } @@ -123,6 +124,7 @@ void TTrKinetic::setup(void) { envCreateLat(ComplexField, varName(getName(), mu, nu)); } + envCreateLat(ComplexField, varName(getName(), "sum")); envTmp(std::vector, "der", 1, env().getNd(), env().getGrid()); } @@ -134,9 +136,11 @@ void TTrKinetic::execute(void) << " derivative" << std::endl; std::vector result; - auto &phi = envGet(Field, par().field); + auto &phi = envGet(Field, par().field); + auto &sumkin = envGet(ComplexField, varName(getName(), "sum")); envGetTmp(std::vector, der); + sumkin = zero; for (unsigned int mu = 0; mu < env().getNd(); ++mu) { dmu(der[mu], phi, mu, par().type); @@ -147,8 +151,17 @@ void TTrKinetic::execute(void) auto &out = envGet(ComplexField, varName(getName(), mu, nu)); out = -trace(der[mu]*der[nu]); - if (!par().output.empty()) + if (mu == nu) { + sumkin += out; + } + } + if (!par().output.empty()) + { + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + auto &out = envGet(ComplexField, varName(getName(), mu, nu)); Result r; r.op = "tr(d_" + std::to_string(mu) + "phi*d_" @@ -156,6 +169,13 @@ void TTrKinetic::execute(void) r.value = TensorRemove(sum(out)); result.push_back(r); } + { + Result r; + + r.op = "sum_mu tr(d_mu phi*d_mu phi)"; + r.value = TensorRemove(sum(sumkin)); + result.push_back(r); + } } if (result.size() > 0) { From 6ea2a8b7caa33456c0c50b21c9e1e63ac9fd6920 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 19:51:47 +0100 Subject: [PATCH 281/620] Hadrons: scheduler shows starting value --- extras/Hadrons/GeneticScheduler.hpp | 4 ++-- extras/Hadrons/VirtualMachine.cc | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/GeneticScheduler.hpp b/extras/Hadrons/GeneticScheduler.hpp index e8fcd2c2..83666402 100644 --- a/extras/Hadrons/GeneticScheduler.hpp +++ b/extras/Hadrons/GeneticScheduler.hpp @@ -58,6 +58,8 @@ public: // access const Gene & getMinSchedule(void); V getMinValue(void); + // reset population + void initPopulation(void); // breed a new generation void nextGeneration(void); // heuristic benchmarks @@ -76,8 +78,6 @@ public: return out; } private: - // evolution steps - void initPopulation(void); void doCrossover(void); void doMutation(void); // genetic operators diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index 49096d92..dffabe29 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -596,6 +596,9 @@ VirtualMachine::Program VirtualMachine::schedule(const GeneticPar &par) }; Scheduler scheduler(graph, memPeak, gpar); gen = 0; + scheduler.initPopulation(); + LOG(Iterative) << "Start: " << sizeString(scheduler.getMinValue()) + << std::endl; do { //LOG(Debug) << "Generation " << gen << ":" << std::endl; From b234784c8edf156916d54d7eeebc7bea07373d1b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 24 Apr 2018 19:52:12 +0100 Subject: [PATCH 282/620] Hadrons: scalar SU(N) takes operator pairs now --- .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 69 ++++++++++++------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 27edf370..c31b1621 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -43,8 +43,9 @@ BEGIN_MODULE_NAMESPACE(MScalarSUN) class TwoPointPar: Serializable { public: + typedef std::pair OpPair; GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointPar, - std::vector, op, + std::vector, op, std::vector, mom, std::string, output); }; @@ -106,7 +107,20 @@ TTwoPoint::TTwoPoint(const std::string name) template std::vector TTwoPoint::getInput(void) { - return par().op; + std::vector in; + std::set ops; + + for (auto &p: par().op) + { + ops.insert(p.first); + ops.insert(p.second); + } + for (auto &o: ops) + { + in.push_back(o); + } + + return in; } template @@ -140,54 +154,59 @@ void TTwoPoint::setup(void) template void TTwoPoint::execute(void) { - LOG(Message) << "Computing 2-point functions for operators:" << std::endl; - for (auto &o: par().op) + LOG(Message) << "Computing 2-point functions" << std::endl; + for (auto &p: par().op) { - LOG(Message) << " '" << o << "'" << std::endl; + LOG(Message) << " <" << p.first << " " << p.second << ">" << std::endl; } - const unsigned int nd = env().getDim().size(); - const unsigned int nt = env().getDim().back(); - const unsigned int nop = par().op.size(); - const unsigned int nmom = mom_.size(); - std::vector dMask(nd, 1); - std::vector result; - std::vector> slicedOp(nop); - FFT fft(env().getGrid()); + const unsigned int nd = env().getDim().size(); + const unsigned int nt = env().getDim().back(); + const unsigned int nop = par().op.size(); + const unsigned int nmom = mom_.size(); + std::vector dMask(nd, 1); + std::set ops; + std::vector result; + std::map> slicedOp; + FFT fft(env().getGrid()); envGetTmp(ComplexField, ftBuf); dMask[nd - 1] = 0; - for (unsigned int i = 0; i < nop; ++i) + for (auto &p: par().op) { - auto &op = envGet(ComplexField, par().op[i]); + ops.insert(p.first); + ops.insert(p.second); + } + for (auto &o: ops) + { + auto &op = envGet(ComplexField, o); - slicedOp[i].resize(nmom); - LOG(Message) << "Operator '" << par().op[i] << "' FFT" << std::endl; - fft.FFT_dim_mask(ftBuf, op, dMask, FFT::forward); + slicedOp[o].resize(nmom); + LOG(Message) << "Operator '" << o << "' FFT" << std::endl; + fft.FFT_dim_mask(ftBuf, op, dMask, FFT::backward); for (unsigned int m = 0; m < nmom; ++m) { auto qt = mom_[m]; qt.resize(nd); - slicedOp[i][m].resize(nt); + slicedOp[o][m].resize(nt); for (unsigned int t = 0; t < nt; ++t) { qt[nd - 1] = t; - peekSite(slicedOp[i][m][t], ftBuf, qt); + peekSite(slicedOp[o][m][t], ftBuf, qt); } } } LOG(Message) << "Making contractions" << std::endl; for (unsigned int m = 0; m < nmom; ++m) - for (unsigned int i = 0; i < nop; ++i) - for (unsigned int j = 0; j < nop; ++j) + for (auto &p: par().op) { Result r; - r.sink = par().op[i]; - r.source = par().op[j]; + r.sink = p.first; + r.source = p.second; r.mom = mom_[m]; - r.data = makeTwoPoint(slicedOp[i][m], slicedOp[j][m]); + r.data = makeTwoPoint(slicedOp[p.first][m], slicedOp[p.second][m]); result.push_back(r); } saveResult(par().output, "twopt", result); From 276a2353dfca4677c687effc524b36b5ccfb054b Mon Sep 17 00:00:00 2001 From: paboyle Date: Wed, 25 Apr 2018 00:11:07 +0100 Subject: [PATCH 283/620] Move constructor --- lib/lattice/Lattice_base.h | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/lattice/Lattice_base.h b/lib/lattice/Lattice_base.h index 014e443d..dcd55702 100644 --- a/lib/lattice/Lattice_base.h +++ b/lib/lattice/Lattice_base.h @@ -257,7 +257,11 @@ public: } } - + Lattice(Lattice&& r){ // move constructor + _grid = r._grid; + checkerboard = r.checkerboard; + _odata=std::move(r._odata); + } virtual ~Lattice(void) = default; @@ -286,6 +290,24 @@ public: } return *this; } + + strong_inline Lattice & operator = (const Lattice & r){ + _grid = r._grid; + checkerboard = r.checkerboard; + _odata.resize(_grid->oSites());// essential + + parallel_for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss]=r._odata[ss]; + } + return *this; + } + strong_inline Lattice & operator = (Lattice && r) + { + _grid = r._grid; + checkerboard = r.checkerboard; + _odata =std::move(r._odata); + return *this; + } // *=,+=,-= operators inherit behvour from correspond */+/- operation template strong_inline Lattice &operator *=(const T &r) { From 362ba0443ad73dc726fd45bcf0f7b3447ec9fb11 Mon Sep 17 00:00:00 2001 From: paboyle Date: Wed, 25 Apr 2018 00:12:11 +0100 Subject: [PATCH 284/620] Cshift updates --- benchmarks/Benchmark_su3.cc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/benchmarks/Benchmark_su3.cc b/benchmarks/Benchmark_su3.cc index 628ad5bd..b458d48a 100644 --- a/benchmarks/Benchmark_su3.cc +++ b/benchmarks/Benchmark_su3.cc @@ -35,17 +35,18 @@ using namespace Grid::QCD; int main (int argc, char ** argv) { Grid_init(&argc,&argv); -#define LMAX (40) +#define LMAX (16) +#define LMIN (16) #define LINC (4) - int64_t Nloop=20; + int64_t Nloop=2000; std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); int64_t threads = GridThread::GetThreads(); std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -190,7 +191,7 @@ int main (int argc, char ** argv) LatticeColourMatrix x(&Grid); random(pRNG,x); LatticeColourMatrix y(&Grid); random(pRNG,y); - for(int mu=0;mu<=4;mu++){ + for(int mu=0;mu<4;mu++){ double start=usecond(); for(int64_t i=0;i Date: Wed, 25 Apr 2018 16:49:14 +0100 Subject: [PATCH 285/620] Hadrons: macro refactoring for library portability --- extras/Hadrons/Application.cc | 8 ++++---- extras/Hadrons/EigenPack.hpp | 2 +- extras/Hadrons/Environment.cc | 16 ++++++++-------- extras/Hadrons/Environment.hpp | 12 ++++++------ extras/Hadrons/Exceptions.hpp | 8 ++++---- extras/Hadrons/Factory.hpp | 2 +- extras/Hadrons/Global.hpp | 2 +- extras/Hadrons/Graph.hpp | 12 ++++++------ extras/Hadrons/Module.cc | 2 +- extras/Hadrons/Module.hpp | 2 +- .../Modules/MContraction/WardIdentity.hpp | 2 +- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/Div.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 4 ++-- extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 2 +- extras/Hadrons/Modules/MScalarSUN/Utils.hpp | 8 ++++---- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 2 +- .../Modules/MUtilities/TestSeqConserved.hpp | 2 +- extras/Hadrons/VirtualMachine.cc | 14 +++++++------- extras/Hadrons/VirtualMachine.hpp | 2 +- lib/qcd/modules/Factory.h | 2 +- 22 files changed, 55 insertions(+), 55 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 4c7e71f2..f409d8eb 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -114,12 +114,12 @@ void Application::parseParameterFile(const std::string parameterFileName) setPar(par); if (!push(reader, "modules")) { - HADRON_ERROR(Parsing, "Cannot open node 'modules' in parameter file '" + HADRONS_ERROR(Parsing, "Cannot open node 'modules' in parameter file '" + parameterFileName + "'"); } if (!push(reader, "module")) { - HADRON_ERROR(Parsing, "Cannot open node 'modules/module' in parameter file '" + HADRONS_ERROR(Parsing, "Cannot open node 'modules/module' in parameter file '" + parameterFileName + "'"); } do @@ -177,7 +177,7 @@ void Application::saveSchedule(const std::string filename) if (!scheduled_) { - HADRON_ERROR(Definition, "Computation not scheduled"); + HADRONS_ERROR(Definition, "Computation not scheduled"); } for (auto address: program_) @@ -208,7 +208,7 @@ void Application::printSchedule(void) { if (!scheduled_) { - HADRON_ERROR(Definition, "Computation not scheduled"); + HADRONS_ERROR(Definition, "Computation not scheduled"); } auto peak = vm().memoryNeeded(program_); LOG(Message) << "Schedule (memory needed: " << sizeString(peak) << "):" diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 5f403595..976fba7b 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -123,7 +123,7 @@ protected: binReader.readScidacFieldRecord(evec[k], vecRecord); if (vecRecord.index != k) { - HADRON_ERROR(Io, "Eigenvector " + std::to_string(k) + " has a" + HADRONS_ERROR(Io, "Eigenvector " + std::to_string(k) + " has a" + " wrong index (expected " + std::to_string(vecRecord.index) + ") in file '" + filename + "'"); } diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index 35bb4648..990a717e 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -35,7 +35,7 @@ using namespace QCD; using namespace Hadrons; #define ERROR_NO_ADDRESS(address)\ -HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); +HADRONS_ERROR(Definition, "no object with address " + std::to_string(address)); /****************************************************************************** * Environment implementation * @@ -85,7 +85,7 @@ void Environment::createCoarseGrid(const std::vector &blockSize, coarseDim[d] = fineDim[d]/blockSize[d]; if (coarseDim[d]*blockSize[d] != fineDim[d]) { - HADRON_ERROR(Size, "Fine dimension " + std::to_string(d) + HADRONS_ERROR(Size, "Fine dimension " + std::to_string(d) + " (" + std::to_string(fineDim[d]) + ") not divisible by coarse dimension (" + std::to_string(coarseDim[d]) + ")"); @@ -96,7 +96,7 @@ void Environment::createCoarseGrid(const std::vector &blockSize, cLs = Ls/blockSize[nd]; if (cLs*blockSize[nd] != Ls) { - HADRON_ERROR(Size, "Fine Ls (" + std::to_string(Ls) + HADRONS_ERROR(Size, "Fine Ls (" + std::to_string(Ls) + ") not divisible by coarse Ls (" + std::to_string(cLs) + ")"); } @@ -128,7 +128,7 @@ GridCartesian * Environment::getGrid(const unsigned int Ls) const } catch(std::out_of_range &) { - HADRON_ERROR(Definition, "no grid with Ls= " + std::to_string(Ls)); + HADRONS_ERROR(Definition, "no grid with Ls= " + std::to_string(Ls)); } } @@ -147,7 +147,7 @@ GridRedBlackCartesian * Environment::getRbGrid(const unsigned int Ls) const } catch(std::out_of_range &) { - HADRON_ERROR(Definition, "no red-black grid with Ls= " + std::to_string(Ls)); + HADRONS_ERROR(Definition, "no red-black grid with Ls= " + std::to_string(Ls)); } } @@ -171,7 +171,7 @@ GridCartesian * Environment::getCoarseGrid( } catch(std::out_of_range &) { - HADRON_ERROR(Definition, "no coarse grid with Ls= " + std::to_string(Ls)); + HADRONS_ERROR(Definition, "no coarse grid with Ls= " + std::to_string(Ls)); } } @@ -221,7 +221,7 @@ void Environment::addObject(const std::string name, const int moduleAddress) } else { - HADRON_ERROR(Definition, "object '" + name + "' already exists"); + HADRONS_ERROR(Definition, "object '" + name + "' already exists"); } } @@ -244,7 +244,7 @@ unsigned int Environment::getObjectAddress(const std::string name) const } else { - HADRON_ERROR(Definition, "no object with name '" + name + "'"); + HADRONS_ERROR(Definition, "no object with name '" + name + "'"); } } diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index f624f36e..a9c3c724 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -245,7 +245,7 @@ void Environment::createDerivedObject(const std::string name, (object_[address].type != &typeid(B)) or (object_[address].derivedType != &typeid(T))) { - HADRON_ERROR(Definition, "object '" + name + "' already allocated"); + HADRONS_ERROR(Definition, "object '" + name + "' already allocated"); } } @@ -279,7 +279,7 @@ T * Environment::getDerivedObject(const unsigned int address) const } else { - HADRON_ERROR(Definition, "object with address " + std::to_string(address) + + HADRONS_ERROR(Definition, "object with address " + std::to_string(address) + " cannot be casted to '" + typeName(&typeid(T)) + "' (has type '" + typeName(&typeid(h->get())) + "')"); } @@ -287,20 +287,20 @@ T * Environment::getDerivedObject(const unsigned int address) const } else { - HADRON_ERROR(Definition, "object with address " + std::to_string(address) + + HADRONS_ERROR(Definition, "object with address " + std::to_string(address) + " does not have type '" + typeName(&typeid(B)) + "' (has type '" + getObjectType(address) + "')"); } } else { - HADRON_ERROR(Definition, "object with address " + std::to_string(address) + + HADRONS_ERROR(Definition, "object with address " + std::to_string(address) + " is empty"); } } else { - HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); + HADRONS_ERROR(Definition, "no object with address " + std::to_string(address)); } } @@ -338,7 +338,7 @@ bool Environment::isObjectOfType(const unsigned int address) const } else { - HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); + HADRONS_ERROR(Definition, "no object with address " + std::to_string(address)); } } diff --git a/extras/Hadrons/Exceptions.hpp b/extras/Hadrons/Exceptions.hpp index adf2340f..3eb1c25f 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/extras/Hadrons/Exceptions.hpp @@ -34,10 +34,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #endif -#define SRC_LOC std::string(__FUNCTION__) + " at " + std::string(__FILE__) + ":"\ - + std::to_string(__LINE__) -#define HADRON_ERROR(exc, msg)\ -throw(Exceptions::exc(msg, SRC_LOC)); +#define HADRONS_SRC_LOC std::string(__FUNCTION__) + " at " \ + + std::string(__FILE__) + ":" + std::to_string(__LINE__) +#define HADRONS_ERROR(exc, msg)\ +throw(Exceptions::exc(msg, HADRONS_SRC_LOC)); #define DECL_EXC(name, base) \ class name: public base\ diff --git a/extras/Hadrons/Factory.hpp b/extras/Hadrons/Factory.hpp index 705a639e..07516640 100644 --- a/extras/Hadrons/Factory.hpp +++ b/extras/Hadrons/Factory.hpp @@ -94,7 +94,7 @@ std::unique_ptr Factory::create(const std::string type, } catch (std::out_of_range &) { - HADRON_ERROR(Argument, "object of type '" + type + "' unknown"); + HADRONS_ERROR(Argument, "object of type '" + type + "' unknown"); } return func(name); diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 5e729579..433dcd21 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -110,7 +110,7 @@ public: }; #define LOG(channel) std::cout << HadronsLog##channel -#define DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; +#define HADRONS_DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; extern HadronsLogger HadronsLogError; extern HadronsLogger HadronsLogWarning; diff --git a/extras/Hadrons/Graph.hpp b/extras/Hadrons/Graph.hpp index 67694aa8..ad84e7e0 100644 --- a/extras/Hadrons/Graph.hpp +++ b/extras/Hadrons/Graph.hpp @@ -184,7 +184,7 @@ void Graph::removeVertex(const T &value) } else { - HADRON_ERROR(Range, "vertex does not exists"); + HADRONS_ERROR(Range, "vertex does not exists"); } // remove all edges containing the vertex @@ -213,7 +213,7 @@ void Graph::removeEdge(const Edge &e) } else { - HADRON_ERROR(Range, "edge does not exists"); + HADRONS_ERROR(Range, "edge does not exists"); } } @@ -259,7 +259,7 @@ void Graph::mark(const T &value, const bool doMark) } else { - HADRON_ERROR(Range, "vertex does not exists"); + HADRONS_ERROR(Range, "vertex does not exists"); } } @@ -297,7 +297,7 @@ bool Graph::isMarked(const T &value) const } else { - HADRON_ERROR(Range, "vertex does not exists"); + HADRONS_ERROR(Range, "vertex does not exists"); return false; } @@ -543,7 +543,7 @@ std::vector Graph::topoSort(void) { if (tmpMarked.at(v)) { - HADRON_ERROR(Range, "cannot topologically sort a cyclic graph"); + HADRONS_ERROR(Range, "cannot topologically sort a cyclic graph"); } if (!isMarked(v)) { @@ -602,7 +602,7 @@ std::vector Graph::topoSort(Gen &gen) { if (tmpMarked.at(v)) { - HADRON_ERROR(Range, "cannot topologically sort a cyclic graph"); + HADRONS_ERROR(Range, "cannot topologically sort a cyclic graph"); } if (!isMarked(v)) { diff --git a/extras/Hadrons/Module.cc b/extras/Hadrons/Module.cc index 54978f93..faf01d5a 100644 --- a/extras/Hadrons/Module.cc +++ b/extras/Hadrons/Module.cc @@ -49,7 +49,7 @@ std::string ModuleBase::getName(void) const // get factory registration name if available std::string ModuleBase::getRegisteredName(void) { - HADRON_ERROR(Definition, "module '" + getName() + "' has no registered type" + HADRONS_ERROR(Definition, "module '" + getName() + "' has no registered type" + " in the factory"); } diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 656aacef..7f8b7796 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -126,7 +126,7 @@ if (env().getGrid()->IsBoss())\ \ if (mkdir(_dirname))\ {\ - HADRON_ERROR(Io, "cannot create directory '" + _dirname + "'");\ + HADRONS_ERROR(Io, "cannot create directory '" + _dirname + "'");\ }\ {\ ResultWriter _writer(RESULT_FILE_NAME(ioStem));\ diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp index f1ca6c2b..e529d7a2 100644 --- a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp +++ b/extras/Hadrons/Modules/MContraction/WardIdentity.hpp @@ -119,7 +119,7 @@ void TWardIdentity::setup(void) Ls_ = env().getObjectLs(par().q); if (Ls_ != env().getObjectLs(par().action)) { - HADRON_ERROR(Size, "Ls mismatch between quark action and propagator"); + HADRONS_ERROR(Size, "Ls mismatch between quark action and propagator"); } envTmpLat(PropagatorField, "tmp"); envTmpLat(PropagatorField, "vector_WI"); diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index 9a359427..ee21cba9 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -177,7 +177,7 @@ void TGaugeProp::execute(void) { if (Ls_ != env().getObjectLs(par().source)) { - HADRON_ERROR(Size, "Ls mismatch between quark action and source"); + HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); } else { diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index d1f6df26..1b59fbed 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -112,7 +112,7 @@ void TDiv::setup(void) { if (par().op.size() != env().getNd()) { - HADRON_ERROR(Size, "the number of components differs from number of dimensions"); + HADRONS_ERROR(Size, "the number of components differs from number of dimensions"); } envCreateLat(ComplexField, getName()); } diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index 979a340e..c7c0e9ee 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -134,14 +134,14 @@ void TShiftProbe::execute(void) shift = strToVec(par().shifts); if (shift.size() % 2 != 0) { - HADRON_ERROR(Size, "the number of shifts is odd"); + HADRONS_ERROR(Size, "the number of shifts is odd"); } sign = (shift.size() % 4 == 0) ? 1 : -1; for (auto &s: shift) { if (s.first >= env().getNd()) { - HADRON_ERROR(Size, "dimension to large for shift <" + HADRONS_ERROR(Size, "dimension to large for shift <" + std::to_string(s.first) + " " + std::to_string(s.second) + ">" ); } diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index a61c00bc..6c1d733b 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -119,7 +119,7 @@ void TTrPhi::setup(void) { if (par().maxPow < 2) { - HADRON_ERROR(Size, "'maxPow' should be at least equal to 2"); + HADRONS_ERROR(Size, "'maxPow' should be at least equal to 2"); } envTmpLat(Field, "phi2"); envTmpLat(Field, "buf"); diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index c31b1621..9e53553f 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -143,7 +143,7 @@ void TTwoPoint::setup(void) mom_[i] = strToVec(par().mom[i]); if (mom_[i].size() != nd - 1) { - HADRON_ERROR(Size, "momentum number of components different from " + HADRONS_ERROR(Size, "momentum number of components different from " + std::to_string(nd-1)); } } diff --git a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp index b9e49715..37a9e137 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp @@ -44,7 +44,7 @@ inline void dmu(Field &out, const Field &in, const unsigned int mu, const DiffTy if (mu >= env.getNd()) { - HADRON_ERROR(Range, "Derivative direction out of range"); + HADRONS_ERROR(Range, "Derivative direction out of range"); } switch(type) { @@ -58,7 +58,7 @@ inline void dmu(Field &out, const Field &in, const unsigned int mu, const DiffTy out = 0.5*(Cshift(in, mu, 1) - Cshift(in, mu, -1)); break; default: - HADRON_ERROR(Argument, "Derivative type invalid"); + HADRONS_ERROR(Argument, "Derivative type invalid"); break; } } @@ -70,7 +70,7 @@ inline void dmuAcc(Field &out, const Field &in, const unsigned int mu, const Dif if (mu >= env.getNd()) { - HADRON_ERROR(Range, "Derivative direction out of range"); + HADRONS_ERROR(Range, "Derivative direction out of range"); } switch(type) { @@ -84,7 +84,7 @@ inline void dmuAcc(Field &out, const Field &in, const unsigned int mu, const Dif out += 0.5*(Cshift(in, mu, 1) - Cshift(in, mu, -1)); break; default: - HADRON_ERROR(Argument, "Derivative type invalid"); + HADRONS_ERROR(Argument, "Derivative type invalid"); break; } } diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index f559c4eb..206d44d1 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -127,7 +127,7 @@ void TRBPrecCG::setup(void) { if (par().maxIteration == 0) { - HADRON_ERROR(Argument, "zero maximum iteration"); + HADRONS_ERROR(Argument, "zero maximum iteration"); } LOG(Message) << "setting up Schur red-black preconditioned CG for" diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp index dcd1ba9a..7b1bc1db 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp +++ b/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp @@ -123,7 +123,7 @@ void TTestSeqConserved::setup(void) auto Ls = env().getObjectLs(par().q); if (Ls != env().getObjectLs(par().action)) { - HADRON_ERROR(Size, "Ls mismatch between quark action and propagator"); + HADRONS_ERROR(Size, "Ls mismatch between quark action and propagator"); } envTmpLat(PropagatorField, "tmp"); envTmpLat(LatticeComplex, "c"); diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index dffabe29..cc197ef8 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -123,7 +123,7 @@ void VirtualMachine::pushModule(VirtualMachine::ModPt &pt) else { // output already fully registered, error - HADRON_ERROR(Definition, "object '" + out + HADRONS_ERROR(Definition, "object '" + out + "' is already produced by module '" + module_[env().getObjectModule(out)].name + "' (while pushing module '" + name + "')"); @@ -158,7 +158,7 @@ void VirtualMachine::pushModule(VirtualMachine::ModPt &pt) } else { - HADRON_ERROR(Definition, "module '" + name + "' already exists"); + HADRONS_ERROR(Definition, "module '" + name + "' already exists"); } } @@ -185,7 +185,7 @@ ModuleBase * VirtualMachine::getModule(const unsigned int address) const } else { - HADRON_ERROR(Definition, "no module with address " + std::to_string(address)); + HADRONS_ERROR(Definition, "no module with address " + std::to_string(address)); } } @@ -202,7 +202,7 @@ unsigned int VirtualMachine::getModuleAddress(const std::string name) const } else { - HADRON_ERROR(Definition, "no module with name '" + name + "'"); + HADRONS_ERROR(Definition, "no module with name '" + name + "'"); } } @@ -214,7 +214,7 @@ std::string VirtualMachine::getModuleName(const unsigned int address) const } else { - HADRON_ERROR(Definition, "no module with address " + std::to_string(address)); + HADRONS_ERROR(Definition, "no module with address " + std::to_string(address)); } } @@ -226,7 +226,7 @@ std::string VirtualMachine::getModuleType(const unsigned int address) const } else { - HADRON_ERROR(Definition, "no module with address " + std::to_string(address)); + HADRONS_ERROR(Definition, "no module with address " + std::to_string(address)); } } @@ -306,7 +306,7 @@ void VirtualMachine::makeModuleGraph(void) if (min < 0) { - HADRON_ERROR(Definition, "dependency '" + HADRONS_ERROR(Definition, "dependency '" + env().getObjectName(in) + "' (address " + std::to_string(in) + ") is not produced by any module"); diff --git a/extras/Hadrons/VirtualMachine.hpp b/extras/Hadrons/VirtualMachine.hpp index 153f8d70..ccc06d63 100644 --- a/extras/Hadrons/VirtualMachine.hpp +++ b/extras/Hadrons/VirtualMachine.hpp @@ -195,7 +195,7 @@ M * VirtualMachine::getModule(const unsigned int address) const } else { - HADRON_ERROR(Definition, "module '" + module_[address].name + HADRONS_ERROR(Definition, "module '" + module_[address].name + "' does not have type " + typeid(M).name() + "(has type: " + getModuleType(address) + ")"); } diff --git a/lib/qcd/modules/Factory.h b/lib/qcd/modules/Factory.h index 66bd627e..fafa2038 100644 --- a/lib/qcd/modules/Factory.h +++ b/lib/qcd/modules/Factory.h @@ -95,7 +95,7 @@ std::unique_ptr Factory::create(const std::string type, } catch (std::out_of_range &) { - //HADRON_ERROR("object of type '" + type + "' unknown"); + //HADRONS_ERROR("object of type '" + type + "' unknown"); std::cout << GridLogError << "Error" << std::endl; std::cout << GridLogError << obj_type() << " object of name [" << type << "] unknown" << std::endl; exit(1); From 43f5a0df50090b2f784653a3d3b2e569ae08b1a4 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 26 Apr 2018 12:01:56 +0900 Subject: [PATCH 286/620] More timers in the integrator --- benchmarks/Benchmark_su3.cc | 22 ++--- lib/qcd/hmc/integrators/Integrator.h | 12 ++- lib/qcd/smearing/GaugeConfiguration.h | 137 ++++++++++++++++---------- 3 files changed, 104 insertions(+), 67 deletions(-) diff --git a/benchmarks/Benchmark_su3.cc b/benchmarks/Benchmark_su3.cc index d9f1341c..5f2d83d2 100644 --- a/benchmarks/Benchmark_su3.cc +++ b/benchmarks/Benchmark_su3.cc @@ -35,8 +35,8 @@ using namespace Grid::QCD; int main (int argc, char ** argv) { Grid_init(&argc,&argv); -#define LMAX (16) -#define LMIN (16) +#define LMAX (32) +#define LMIN (4) #define LINC (4) int64_t Nloop=2000; @@ -193,17 +193,17 @@ int main (int argc, char ** argv) LatticeColourMatrix y(&Grid); random(pRNG,y); for(int mu=0;mu<4;mu++){ - double start=usecond(); - for(int64_t i=0;iis_smeared); + double start_force = usecond(); as[level].actions.at(a)->deriv(Us, force); // deriv should NOT include Ta std::cout << GridLogIntegrator << "Smearing (on/off): " << as[level].actions.at(a)->is_smeared << std::endl; if (as[level].actions.at(a)->is_smeared) Smearer.smeared_force(force); force = FieldImplementation::projectForce(force); // Ta for gauge fields + double end_force = usecond(); Real force_abs = std::sqrt(norm2(force)/U._grid->gSites()); - std::cout << GridLogIntegrator << "Force average: " << force_abs << std::endl; + std::cout << GridLogIntegrator << "["< -class NoSmearing { +//trivial class for no smearing +template +class NoSmearing +{ public: INHERIT_FIELD_TYPES(Impl); - Field* ThinField; + Field *ThinField; - NoSmearing(): ThinField(NULL) {} + NoSmearing() : ThinField(NULL) {} - void set_Field(Field& U) { ThinField = &U; } + void set_Field(Field &U) { ThinField = &U; } - void smeared_force(Field&) const {} + void smeared_force(Field &) const {} - Field& get_SmearedU() { return *ThinField; } + Field &get_SmearedU() { return *ThinField; } - Field& get_U(bool smeared = false) { + Field &get_U(bool smeared = false) + { return *ThinField; } - }; /*! @@ -44,32 +47,36 @@ public: It stores a list of smeared configurations. */ template -class SmearedConfiguration { - public: +class SmearedConfiguration +{ +public: INHERIT_GIMPL_TYPES(Gimpl); - private: +private: const unsigned int smearingLevels; Smear_Stout StoutSmearing; std::vector SmearedSet; // Member functions //==================================================================== - void fill_smearedSet(GaugeField& U) { - ThinLinks = &U; // attach the smearing routine to the field U + void fill_smearedSet(GaugeField &U) + { + ThinLinks = &U; // attach the smearing routine to the field U // check the pointer is not null if (ThinLinks == NULL) std::cout << GridLogError << "[SmearedConfiguration] Error in ThinLinks pointer\n"; - if (smearingLevels > 0) { + if (smearingLevels > 0) + { std::cout << GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n"; GaugeField previous_u(ThinLinks->_grid); previous_u = *ThinLinks; - for (int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl) { + for (int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl) + { StoutSmearing.smear(SmearedSet[smearLvl], previous_u); previous_u = SmearedSet[smearLvl]; @@ -81,9 +88,10 @@ class SmearedConfiguration { } } //==================================================================== - GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime, - const GaugeField& GaugeK) const { - GridBase* grid = GaugeK._grid; + GaugeField AnalyticSmearedForce(const GaugeField &SigmaKPrime, + const GaugeField &GaugeK) const + { + GridBase *grid = GaugeK._grid; GaugeField C(grid), SigmaK(grid), iLambda(grid); GaugeLinkField iLambda_mu(grid); GaugeLinkField iQ(grid), e_iQ(grid); @@ -94,7 +102,8 @@ class SmearedConfiguration { SigmaK = zero; iLambda = zero; - for (int mu = 0; mu < Nd; mu++) { + for (int mu = 0; mu < Nd; mu++) + { Cmu = peekLorentz(C, mu); GaugeKmu = peekLorentz(GaugeK, mu); SigmaKPrime_mu = peekLorentz(SigmaKPrime, mu); @@ -104,20 +113,22 @@ class SmearedConfiguration { pokeLorentz(iLambda, iLambda_mu, mu); } StoutSmearing.derivative(SigmaK, iLambda, - GaugeK); // derivative of SmearBase + GaugeK); // derivative of SmearBase return SigmaK; } /*! @brief Returns smeared configuration at level 'Level' */ - const GaugeField& get_smeared_conf(int Level) const { + const GaugeField &get_smeared_conf(int Level) const + { return SmearedSet[Level]; } //==================================================================== - void set_iLambda(GaugeLinkField& iLambda, GaugeLinkField& e_iQ, - const GaugeLinkField& iQ, const GaugeLinkField& Sigmap, - const GaugeLinkField& GaugeK) const { - GridBase* grid = iQ._grid; + void set_iLambda(GaugeLinkField &iLambda, GaugeLinkField &e_iQ, + const GaugeLinkField &iQ, const GaugeLinkField &Sigmap, + const GaugeLinkField &GaugeK) const + { + GridBase *grid = iQ._grid; GaugeLinkField iQ2(grid), iQ3(grid), B1(grid), B2(grid), USigmap(grid); GaugeLinkField unity(grid); unity = 1.0; @@ -206,15 +217,15 @@ class SmearedConfiguration { } //==================================================================== - public: - GaugeField* - ThinLinks; /*!< @brief Pointer to the thin - links configuration */ +public: + GaugeField * + ThinLinks; /* Pointer to the thin links configuration */ - /*! @brief Standard constructor */ - SmearedConfiguration(GridCartesian* UGrid, unsigned int Nsmear, - Smear_Stout& Stout) - : smearingLevels(Nsmear), StoutSmearing(Stout), ThinLinks(NULL) { + /* Standard constructor */ + SmearedConfiguration(GridCartesian *UGrid, unsigned int Nsmear, + Smear_Stout &Stout) + : smearingLevels(Nsmear), StoutSmearing(Stout), ThinLinks(NULL) + { for (unsigned int i = 0; i < smearingLevels; ++i) SmearedSet.push_back(*(new GaugeField(UGrid))); } @@ -223,21 +234,29 @@ class SmearedConfiguration { SmearedConfiguration() : smearingLevels(0), StoutSmearing(), SmearedSet(), ThinLinks(NULL) {} - - // attach the smeared routines to the thin links U and fill the smeared set - void set_Field(GaugeField& U) { fill_smearedSet(U); } + void set_Field(GaugeField &U) + { + double start = usecond(); + fill_smearedSet(U); + double end = usecond(); + double time = (stop - start)/ 1e3; + std::cout << GridLogMessage << "Smearing in " << time << " ms" << std::endl; + } //==================================================================== - void smeared_force(GaugeField& SigmaTilde) const { - if (smearingLevels > 0) { + void smeared_force(GaugeField &SigmaTilde) const + { + if (smearingLevels > 0) + { + double start = usecond(); GaugeField force = SigmaTilde; // actually = U*SigmaTilde GaugeLinkField tmp_mu(SigmaTilde._grid); - for (int mu = 0; mu < Nd; mu++) { + for (int mu = 0; mu < Nd; mu++) + { // to get just SigmaTilde - tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels - 1], mu)) * - peekLorentz(force, mu); + tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels - 1], mu)) * peekLorentz(force, mu); pokeLorentz(force, tmp_mu, mu); } @@ -246,33 +265,43 @@ class SmearedConfiguration { force = AnalyticSmearedForce(force, *ThinLinks); - for (int mu = 0; mu < Nd; mu++) { + for (int mu = 0; mu < Nd; mu++) + { tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); pokeLorentz(SigmaTilde, tmp_mu, mu); } - } // if smearingLevels = 0 do nothing + double end = usecond(); + double time = (stop - start)/ 1e3; + std::cout << GridLogMessage << "Smearing force in " << time << " ms" << std::endl; + } // if smearingLevels = 0 do nothing } //==================================================================== - GaugeField& get_SmearedU() { return SmearedSet[smearingLevels - 1]; } + GaugeField &get_SmearedU() { return SmearedSet[smearingLevels - 1]; } - GaugeField& get_U(bool smeared = false) { + GaugeField &get_U(bool smeared = false) + { // get the config, thin links by default - if (smeared) { - if (smearingLevels) { + if (smeared) + { + if (smearingLevels) + { RealD impl_plaq = WilsonLoops::avgPlaquette(SmearedSet[smearingLevels - 1]); std::cout << GridLogDebug << "getting Usmr Plaq: " << impl_plaq << std::endl; return get_SmearedU(); - - } else { + } + else + { RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); std::cout << GridLogDebug << "getting Thin Plaq: " << impl_plaq << std::endl; return *ThinLinks; } - } else { + } + else + { RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); std::cout << GridLogDebug << "getting Thin Plaq: " << impl_plaq << std::endl; From 6358f35b7e93d36f1f9a4378ddd53cc2a88242be Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 26 Apr 2018 14:18:11 +0900 Subject: [PATCH 287/620] Debug of previous commit --- lib/qcd/smearing/GaugeConfiguration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h index 55d5351f..6fea875b 100644 --- a/lib/qcd/smearing/GaugeConfiguration.h +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -240,7 +240,7 @@ public: double start = usecond(); fill_smearedSet(U); double end = usecond(); - double time = (stop - start)/ 1e3; + double time = (end - start)/ 1e3; std::cout << GridLogMessage << "Smearing in " << time << " ms" << std::endl; } @@ -271,7 +271,7 @@ public: pokeLorentz(SigmaTilde, tmp_mu, mu); } double end = usecond(); - double time = (stop - start)/ 1e3; + double time = (end - start)/ 1e3; std::cout << GridLogMessage << "Smearing force in " << time << " ms" << std::endl; } // if smearingLevels = 0 do nothing } From 213f8db6a2717f123f1c791614fe6689e171bdc2 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Thu, 26 Apr 2018 10:01:39 +0100 Subject: [PATCH 288/620] Microsecond resultion --- lib/perfmon/Timer.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/perfmon/Timer.h b/lib/perfmon/Timer.h index 392ccc1d..4d32ee52 100644 --- a/lib/perfmon/Timer.h +++ b/lib/perfmon/Timer.h @@ -49,7 +49,8 @@ inline double usecond(void) { typedef std::chrono::system_clock GridClock; typedef std::chrono::time_point GridTimePoint; -typedef std::chrono::milliseconds GridTime; +typedef std::chrono::milliseconds GridMillisecs; +typedef std::chrono::microseconds GridTime; typedef std::chrono::microseconds GridUsecs; inline std::ostream& operator<< (std::ostream & stream, const std::chrono::milliseconds & time) @@ -57,6 +58,11 @@ inline std::ostream& operator<< (std::ostream & stream, const std::chrono::milli stream << time.count()<<" ms"; return stream; } +inline std::ostream& operator<< (std::ostream & stream, const std::chrono::microseconds & time) +{ + stream << time.count()<<" usec"; + return stream; +} class GridStopWatch { private: From eac6ec4b5e1b3b8be4ff877eacbbe9b6d0af5d3d Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Thu, 26 Apr 2018 10:03:57 +0100 Subject: [PATCH 289/620] Faster reductions, important on single node staggered --- lib/lattice/Lattice_arith.h | 12 +----- lib/lattice/Lattice_reduction.h | 72 ++++++++++++++++++++++++++++----- 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/lib/lattice/Lattice_arith.h b/lib/lattice/Lattice_arith.h index c3093167..d1cbc84a 100644 --- a/lib/lattice/Lattice_arith.h +++ b/lib/lattice/Lattice_arith.h @@ -244,19 +244,11 @@ namespace Grid { template strong_inline RealD axpy_norm(Lattice &ret,sobj a,const Lattice &x,const Lattice &y){ - ret.checkerboard = x.checkerboard; - conformable(ret,x); - conformable(x,y); - axpy(ret,a,x,y); - return norm2(ret); + return axpy_norm_fast(ret,a,x,y); } template strong_inline RealD axpby_norm(Lattice &ret,sobj a,sobj b,const Lattice &x,const Lattice &y){ - ret.checkerboard = x.checkerboard; - conformable(ret,x); - conformable(x,y); - axpby(ret,a,b,x,y); - return norm2(ret); // FIXME implement parallel norm in ss loop + return axpby_norm_fast(ret,a,b,x,y); } } diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 8a3fbece..7e169baf 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -33,7 +33,7 @@ namespace Grid { // Deterministic Reduction operations //////////////////////////////////////////////////////////////////////////////////////////////////// template inline RealD norm2(const Lattice &arg){ - ComplexD nrm = innerProduct(arg,arg); + auto nrm = innerProduct(arg,arg); return std::real(nrm); } @@ -43,12 +43,12 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ { typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_typeD vector_type; - scalar_type nrm; - GridBase *grid = left._grid; - - std::vector > sumarray(grid->SumArraySize()); - + const int pad = 8; + + scalar_type nrm; + std::vector > sumarray(grid->SumArraySize()*pad); + parallel_for(int thr=0;thrSumArraySize();thr++){ int nwork, mywork, myoff; GridThread::GetWork(left._grid->oSites(),thr,mywork,myoff); @@ -57,17 +57,69 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ for(int ss=myoff;ssSumArraySize();i++){ - vvnrm = vvnrm+sumarray[i]; + nrm = nrm+sumarray[i*pad]; } - nrm = Reduce(vvnrm);// sum across simd right._grid->GlobalSum(nrm); return nrm; } + +///////////////////////// +// Fast axpby_norm +// z = a x + b y +// return norm z +///////////////////////// +template strong_inline RealD +axpy_norm_fast(Lattice &z,sobj a,const Lattice &x,const Lattice &y) +{ + sobj one(1.0); + return axpby_norm_fast(z,a,one,x,y); +} + +template strong_inline RealD +axpby_norm_fast(Lattice &z,sobj a,sobj b,const Lattice &x,const Lattice &y) +{ + const int pad = 8; + z.checkerboard = x.checkerboard; + conformable(z,x); + conformable(x,y); + + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_typeD vector_type; + RealD nrm; + + GridBase *grid = x._grid; + + Vector sumarray(grid->SumArraySize()*pad); + + parallel_for(int thr=0;thrSumArraySize();thr++){ + int nwork, mywork, myoff; + GridThread::GetWork(x._grid->oSites(),thr,mywork,myoff); + + // private to thread; sub summation + decltype(innerProductD(z._odata[0],z._odata[0])) vnrm=zero; + for(int ss=myoff;ssSumArraySize();i++){ + nrm = nrm+sumarray[i*pad]; + } + z._grid->GlobalSum(nrm); + return nrm; +} + template inline auto sum(const LatticeUnaryExpression & expr) From 3e125c5b6172c83687ac050d7ba5373b4aa5e9ef Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Thu, 26 Apr 2018 10:07:19 +0100 Subject: [PATCH 290/620] Faster linalg on CG optimised against staggered Sum overhead is bigger for staggered --- lib/algorithms/iterative/ConjugateGradient.h | 31 ++++++++++++-------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index e1c796cd..ff4ba8ac 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -70,7 +70,6 @@ class ConjugateGradient : public OperatorFunction { Linop.HermOpAndNorm(psi, mmp, d, b); - r = src - mmp; p = r; @@ -97,6 +96,9 @@ class ConjugateGradient : public OperatorFunction { << "ConjugateGradient: k=0 residual " << cp << " target " << rsq << std::endl; GridStopWatch LinalgTimer; + GridStopWatch InnerTimer; + GridStopWatch AxpyNormTimer; + GridStopWatch LinearCombTimer; GridStopWatch MatrixTimer; GridStopWatch SolverTimer; @@ -106,30 +108,32 @@ class ConjugateGradient : public OperatorFunction { c = cp; MatrixTimer.Start(); - Linop.HermOpAndNorm(p, mmp, d, qq); + Linop.HermOp(p, mmp); MatrixTimer.Stop(); LinalgTimer.Start(); - // AA - // RealD qqck = norm2(mmp); - // ComplexD dck = innerProduct(p,mmp); + InnerTimer.Start(); + ComplexD dc = innerProduct(p,mmp); + InnerTimer.Stop(); + d = dc.real(); a = c / d; - b_pred = a * (a * qq - d) / c; + AxpyNormTimer.Start(); cp = axpy_norm(r, -a, mmp, r); + AxpyNormTimer.Stop(); b = cp / c; - // Fuse these loops ; should be really easy - psi = a * p + psi; - p = p * b + r; - + LinearCombTimer.Start(); + parallel_for(int ss=0;ssoSites();ss++){ + vstream(psi[ss], a * p[ss] + psi[ss]); + vstream(p [ss], b * p[ss] + r[ss]); + } + LinearCombTimer.Stop(); LinalgTimer.Stop(); std::cout << GridLogIterative << "ConjugateGradient: Iteration " << k << " residual " << cp << " target " << rsq << std::endl; - std::cout << GridLogDebug << "a = "<< a << " b_pred = "<< b_pred << " b = "<< b << std::endl; - std::cout << GridLogDebug << "qq = "<< qq << " d = "<< d << " c = "<< c << std::endl; // Stopping condition if (cp <= rsq) { @@ -150,6 +154,9 @@ class ConjugateGradient : public OperatorFunction { std::cout << GridLogMessage << "\tElapsed " << SolverTimer.Elapsed() < Date: Thu, 26 Apr 2018 10:08:05 +0100 Subject: [PATCH 291/620] Improvements to staggered tests timings --- tests/solver/Test_staggered_block_cg_prec.cc | 58 +++++++++++++++++-- .../solver/Test_staggered_block_cg_unprec.cc | 47 ++++++++++++++- tests/solver/Test_staggered_cg_prec.cc | 12 ++++ 3 files changed, 111 insertions(+), 6 deletions(-) diff --git a/tests/solver/Test_staggered_block_cg_prec.cc b/tests/solver/Test_staggered_block_cg_prec.cc index 98a5074e..82052684 100644 --- a/tests/solver/Test_staggered_block_cg_prec.cc +++ b/tests/solver/Test_staggered_block_cg_prec.cc @@ -74,6 +74,11 @@ int main (int argc, char ** argv) LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(pRNG,Umu); + double volume=1; + for(int mu=0;mu HermOp4d(Ds4d); FermionField src4d(UGrid); random(pRNG,src4d); FermionField src4d_o(UrbGrid); pickCheckerboard(Odd,src4d_o,src4d); FermionField result4d_o(UrbGrid); + double deodoe_flops=(16*(3*(6+8+8)) + 15*3*2)*volume; // == 66*16 + == 1146 result4d_o=zero; - CG(HermOp4d,src4d_o,result4d_o); + { + double t1=usecond(); + CG(HermOp4d,src4d_o,result4d_o); + double t2=usecond(); + double ncall=CG.IterationsToComplete; + double flops = deodoe_flops * ncall; + std::cout< HermOp(Ds); @@ -93,7 +99,19 @@ int main (int argc, char ** argv) MdagMLinearOperator HermOp4d(Ds4d); FermionField src4d(UGrid); random(pRNG,src4d); FermionField result4d(UGrid); result4d=zero; - CG(HermOp4d,src4d,result4d); + + double deodoe_flops=(16*(3*(6+8+8)) + 15*3*2)*volume; // == 66*16 + == 1146 + { + double t1=usecond(); + CG(HermOp4d,src4d,result4d); + double t2=usecond(); + double ncall=CG.IterationsToComplete; + double flops = deodoe_flops * ncall; + std::cout< HermOpEO(Ds); ConjugateGradient CG(1.0e-8,10000); + double t1=usecond(); CG(HermOpEO,src_o,res_o); + double t2=usecond(); + + // Schur solver: uses DeoDoe => volume * 1146 + double ncall=CG.IterationsToComplete; + double flops=(16*(3*(6+8+8)) + 15*3*2)*volume*ncall; // == 66*16 + == 1146 + + std::cout<GlobalSum(DhopComputeTime); + DhopComputeTime/=NP; + + RealD mflops = 1154*volume*DhopCalls/DhopComputeTime/2; // 2 for red black counting + std::cout << GridLogMessage << "Average mflops/s per call : " << mflops << std::endl; + std::cout << GridLogMessage << "Average mflops/s per call per rank : " << mflops/NP << std::endl; + std::cout << GridLogMessage << "Average mflops/s per call per node : " << mflops/NN << std::endl; + + RealD Fullmflops = 1154*volume*DhopCalls/(DhopTotalTime)/2; // 2 for red black counting + std::cout << GridLogMessage << "Average mflops/s per call (full) : " << Fullmflops << std::endl; + std::cout << GridLogMessage << "Average mflops/s per call per rank (full): " << Fullmflops/NP << std::endl; + std::cout << GridLogMessage << "Average mflops/s per call per node (full): " << Fullmflops/NN << std::endl; + + std::cout << GridLogMessage << "ImprovedStaggeredFermion Stencil" < +void ImprovedStaggeredFermion::ZeroCounters(void) +{ + DhopCalls = 0; + DhopTotalTime = 0; + DhopCommTime = 0; + DhopComputeTime = 0; + DhopFaceTime = 0; + + Stencil.ZeroCounters(); + StencilEven.ZeroCounters(); + StencilOdd.ZeroCounters(); +} + + FermOpStaggeredTemplateInstantiate(ImprovedStaggeredFermion); //AdjointFermOpTemplateInstantiate(ImprovedStaggeredFermion); diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h index 69d0aef4..750d29c6 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion.h @@ -49,6 +49,18 @@ class ImprovedStaggeredFermion : public StaggeredKernels, public ImprovedS FermionField _tmp; FermionField &tmp(void) { return _tmp; } + //////////////////////////////////////// + // Performance monitoring + //////////////////////////////////////// + void Report(void); + void ZeroCounters(void); + double DhopTotalTime; + double DhopCalls; + double DhopCommTime; + double DhopComputeTime; + double DhopComputeTime2; + double DhopFaceTime; + /////////////////////////////////////////////////////////////// // Implement the abstract base /////////////////////////////////////////////////////////////// @@ -142,7 +154,8 @@ class ImprovedStaggeredFermion : public StaggeredKernels, public ImprovedS // protected: public: // any other parameters of action ??? - + virtual int isTrivialEE(void) { return 1; }; + virtual RealD Mass(void) { return mass; } RealD mass; RealD u0; RealD c1; diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc index e5146d7a..ab9c9c48 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc @@ -291,14 +291,12 @@ void ImprovedStaggeredFermion5D::DhopInternal(StencilImpl & st, LebesgueOr DoubledGaugeField & U,DoubledGaugeField & UUU, const FermionField &in, FermionField &out,int dag) { - DhopTotalTime-=usecond(); #ifdef GRID_OMP if ( StaggeredKernelsStatic::Comms == StaggeredKernelsStatic::CommsAndCompute ) DhopInternalOverlappedComms(st,lo,U,UUU,in,out,dag); else #endif DhopInternalSerialComms(st,lo,U,UUU,in,out,dag); - DhopTotalTime+=usecond(); } template @@ -412,6 +410,7 @@ void ImprovedStaggeredFermion5D::DhopInternalSerialComms(StencilImpl & st, + //double t1=usecond(); DhopTotalTime -= usecond(); DhopCommTime -= usecond(); st.HaloExchange(in,compressor); @@ -432,6 +431,12 @@ void ImprovedStaggeredFermion5D::DhopInternalSerialComms(StencilImpl & st, } DhopComputeTime += usecond(); DhopTotalTime += usecond(); + //double t2=usecond(); + //std::cout << __FILE__ << " " << __func__ << " Total Time " << DhopTotalTime << std::endl; + //std::cout << __FILE__ << " " << __func__ << " Total Time Org " << t2-t1 << std::endl; + //std::cout << __FILE__ << " " << __func__ << " Comml Time " << DhopCommTime << std::endl; + //std::cout << __FILE__ << " " << __func__ << " Compute Time " << DhopComputeTime << std::endl; + } /*CHANGE END*/ diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h index f2fce1c1..4024b472 100644 --- a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h +++ b/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h @@ -178,6 +178,9 @@ namespace QCD { // Data members require to support the functionality /////////////////////////////////////////////////////////////// public: + + virtual int isTrivialEE(void) { return 1; }; + virtual RealD Mass(void) { return mass; } GridBase *_FourDimGrid; GridBase *_FourDimRedBlackGrid; diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index 55433854..d0181d68 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -135,6 +135,8 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { // protected: public: + virtual RealD Mass(void) { return mass; } + virtual int isTrivialEE(void) { return 1; }; RealD mass; GridBase *_grid; From 1c64ee926edf9472c6a8bcbd961463cab8c0628c Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Thu, 26 Apr 2018 10:17:49 +0100 Subject: [PATCH 294/620] Faster staggered operator with m^2 term trivial used --- lib/algorithms/LinearOperator.h | 65 ++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index 26746e6e..c9410410 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -51,7 +51,7 @@ namespace Grid { virtual void Op (const Field &in, Field &out) = 0; // Abstract base virtual void AdjOp (const Field &in, Field &out) = 0; // Abstract base - virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2)=0; + virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2); virtual void HermOp(const Field &in, Field &out)=0; }; @@ -305,36 +305,59 @@ namespace Grid { class SchurStaggeredOperator : public SchurOperatorBase { protected: Matrix &_Mat; + Field tmp; + RealD mass; + double tMpc; + double tIP; + double tMeo; + double taxpby_norm; + uint64_t ncall; public: - SchurStaggeredOperator (Matrix &Mat): _Mat(Mat){}; + void Report(void) + { + std::cout << GridLogMessage << " HermOpAndNorm.Mpc "<< tMpc/ncall<<" usec "< Date: Thu, 26 Apr 2018 10:33:19 +0100 Subject: [PATCH 295/620] Merge staggered fix linear operator and reduction --- lib/algorithms/LinearOperator.h | 2 +- lib/lattice/Lattice_reduction.h | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index c9410410..96b1ed1a 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -51,7 +51,7 @@ namespace Grid { virtual void Op (const Field &in, Field &out) = 0; // Abstract base virtual void AdjOp (const Field &in, Field &out) = 0; // Abstract base - virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2); + virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2) = 0; virtual void HermOp(const Field &in, Field &out)=0; }; diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 7e169baf..3be4b6cb 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -46,28 +46,29 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ GridBase *grid = left._grid; const int pad = 8; - scalar_type nrm; - std::vector > sumarray(grid->SumArraySize()*pad); + ComplexD inner; + Vector sumarray(grid->SumArraySize()*pad); parallel_for(int thr=0;thrSumArraySize();thr++){ int nwork, mywork, myoff; GridThread::GetWork(left._grid->oSites(),thr,mywork,myoff); - decltype(innerProductD(left._odata[0],right._odata[0])) vnrm=zero; // private to thread; sub summation + decltype(innerProductD(left._odata[0],right._odata[0])) vinner=zero; // private to thread; sub summation for(int ss=myoff;ssSumArraySize();i++){ - nrm = nrm+sumarray[i*pad]; + inner = inner+sumarray[i*pad]; } - right._grid->GlobalSum(nrm); - return nrm; + right._grid->GlobalSum(inner); + return inner; } ///////////////////////// From 8f44c799a69d3041f00af7b7785a268a914ed6c5 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 26 Apr 2018 14:48:03 +0100 Subject: [PATCH 296/620] Saving the benchmarking tests for Cshift --- benchmarks/Benchmark_su3.cc | 64 +++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/benchmarks/Benchmark_su3.cc b/benchmarks/Benchmark_su3.cc index b31af942..656f816a 100644 --- a/benchmarks/Benchmark_su3.cc +++ b/benchmarks/Benchmark_su3.cc @@ -35,24 +35,25 @@ using namespace Grid::QCD; int main (int argc, char ** argv) { Grid_init(&argc,&argv); +#define LMIN (16) #define LMAX (40) -#define LINC (4) +#define LINC (8) - int64_t Nloop=20; + int64_t Nloop=200; std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); int64_t threads = GridThread::GetThreads(); std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -84,7 +85,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -115,7 +116,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -146,7 +147,7 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -170,7 +171,6 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -203,6 +203,52 @@ int main (int argc, char ** argv) std::cout< latt_size ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); + int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(std::vector({45,12,81,9})); + + LatticeColourMatrix z(&Grid); random(pRNG,z); + LatticeColourMatrix x(&Grid); random(pRNG,x); + LatticeColourMatrix y(&Grid); random(pRNG,y); + LatticeColourMatrix tmp(&Grid); + + for(int mu=0;mu<4;mu++){ + double tshift=0; + double tmult =0; + + double start=usecond(); + for(int64_t i=0;i Date: Thu, 26 Apr 2018 14:48:35 +0100 Subject: [PATCH 297/620] Improvement --- benchmarks/Benchmark_memory_bandwidth.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/Benchmark_memory_bandwidth.cc b/benchmarks/Benchmark_memory_bandwidth.cc index 848f271d..cc965050 100644 --- a/benchmarks/Benchmark_memory_bandwidth.cc +++ b/benchmarks/Benchmark_memory_bandwidth.cc @@ -55,7 +55,7 @@ int main (int argc, char ** argv) std::cout< Date: Thu, 26 Apr 2018 14:48:57 +0100 Subject: [PATCH 298/620] Guard bare openmp statemetn with ifdef --- lib/allocator/AlignedAllocator.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/allocator/AlignedAllocator.h b/lib/allocator/AlignedAllocator.h index 3b27aec9..b0f7e206 100644 --- a/lib/allocator/AlignedAllocator.h +++ b/lib/allocator/AlignedAllocator.h @@ -277,7 +277,9 @@ public: uint8_t *cp = (uint8_t *)ptr; if ( ptr ) { // One touch per 4k page, static OMP loop to catch same loop order +#ifdef GRID_OMP #pragma omp parallel for schedule(static) +#endif for(size_type n=0;n Date: Thu, 26 Apr 2018 14:49:42 +0100 Subject: [PATCH 299/620] Force static --- lib/threads/Threads.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/threads/Threads.h b/lib/threads/Threads.h index 36daf2af..dacaf5d8 100644 --- a/lib/threads/Threads.h +++ b/lib/threads/Threads.h @@ -40,7 +40,7 @@ Author: paboyle #define PARALLEL_FOR_LOOP _Pragma("omp parallel for schedule(static)") #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(static)") -#define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for collapse(2)") +#define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for schedule(static) collapse(2)") #define PARALLEL_REGION _Pragma("omp parallel") #define PARALLEL_CRITICAL _Pragma("omp critical") #else From 03e9832efa55892c00e028fd4601220c7378a13d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 26 Apr 2018 14:50:02 +0100 Subject: [PATCH 300/620] Use macros for bare openmp --- lib/parallelIO/BinaryIO.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/parallelIO/BinaryIO.h b/lib/parallelIO/BinaryIO.h index 45fd522e..ce84fc81 100644 --- a/lib/parallelIO/BinaryIO.h +++ b/lib/parallelIO/BinaryIO.h @@ -110,11 +110,11 @@ class BinaryIO { lsites = 1; } - #pragma omp parallel +PARALLEL_REGION { uint32_t nersc_csum_thr = 0; - #pragma omp for +PARALLEL_FOR_LOOP_INTERN for (uint64_t local_site = 0; local_site < lsites; local_site++) { uint32_t *site_buf = (uint32_t *)&fbuf[local_site]; @@ -124,7 +124,7 @@ class BinaryIO { } } - #pragma omp critical +PARALLEL_CRITICAL { nersc_csum += nersc_csum_thr; } @@ -146,14 +146,14 @@ class BinaryIO { std::vector local_start =grid->LocalStarts(); std::vector global_vol =grid->FullDimensions(); -#pragma omp parallel +PARALLEL_REGION { std::vector coor(nd); uint32_t scidac_csuma_thr=0; uint32_t scidac_csumb_thr=0; uint32_t site_crc=0; -#pragma omp for +PARALLEL_FOR_LOOP_INTERN for(uint64_t local_site=0;local_site>(32-gsite31); } -#pragma omp critical +PARALLEL_CRITICAL { scidac_csuma^= scidac_csuma_thr; scidac_csumb^= scidac_csumb_thr; From d47484717e91db165f8e1d35446689dd2400e067 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 26 Apr 2018 17:32:37 +0100 Subject: [PATCH 301/620] Hadrons: scalar SU(N) result handling improvement --- extras/Hadrons/Modules/MScalarSUN/Div.hpp | 17 +++--- extras/Hadrons/Modules/MScalarSUN/EMT.hpp | 35 ++++++++++- extras/Hadrons/Modules/MScalarSUN/Grad.hpp | 35 +++++------ .../Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 24 +++++--- .../Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 60 ++++++++----------- extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | 21 +++---- extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | 22 +++---- .../Hadrons/Modules/MScalarSUN/TransProj.hpp | 42 ++++++------- .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 24 ++++---- 9 files changed, 156 insertions(+), 124 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/extras/Hadrons/Modules/MScalarSUN/Div.hpp index 1b59fbed..ff26c60b 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Div.hpp @@ -49,19 +49,20 @@ public: std::string, output); }; +class DivResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(DivResult, + DiffType, type, + Complex, value); +}; + template class TDiv: public Module { public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - DiffType, type, - Complex, value); - }; public: // constructor TDiv(const std::string name); @@ -139,7 +140,7 @@ void TDiv::execute(void) } if (!par().output.empty()) { - Result r; + DivResult r; r.type = par().type; r.value = TensorRemove(sum(div)); diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp index 025b7936..dbbfb6b3 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -54,6 +54,17 @@ public: std::string, output); }; +class EMTResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(EMTResult, + std::vector>, value, + double, m2, + double, lambda, + double, g, + double, xi); +}; + template class TEMT: public Module { @@ -155,13 +166,22 @@ void TEMT::execute(void) LOG(Message) << " xi= " << par().xi << std::endl; } - const unsigned int N = SImpl::Group::Dimension; + const unsigned int N = SImpl::Group::Dimension, nd = env().getNd(); auto &trphi2 = envGet(ComplexField, varName(par().phiPow, 2)); auto &trphi4 = envGet(ComplexField, varName(par().phiPow, 4)); auto &sumkin = envGet(ComplexField, varName(par().kinetic, "sum")); + EMTResult result; - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - for (unsigned int nu = mu; nu < env().getNd(); ++nu) + if (!par().output.empty()) + { + result.m2 = par().m2; + result.g = par().g; + result.lambda = par().lambda; + result.xi = par().xi; + result.value.resize(nd, std::vector(nd)); + } + for (unsigned int mu = 0; mu < nd; ++mu) + for (unsigned int nu = mu; nu < nd; ++nu) { auto &out = envGet(ComplexField, varName(getName(), mu, nu)); auto &trkin = envGet(ComplexField, varName(par().kinetic, mu, nu)); @@ -178,6 +198,15 @@ void TEMT::execute(void) out -= sumkin + par().m2*trphi2 + par().lambda*trphi4; } out *= N/par().g; + if (!par().output.empty()) + { + result.value[mu][nu] = TensorRemove(sum(out)); + result.value[mu][nu] = result.value[nu][mu]; + } + } + if (!par().output.empty()) + { + saveResult(par().output, "emt", result); } } diff --git a/extras/Hadrons/Modules/MScalarSUN/Grad.hpp b/extras/Hadrons/Modules/MScalarSUN/Grad.hpp index 7718fbf2..ecf65e90 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Grad.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Grad.hpp @@ -49,19 +49,20 @@ public: std::string, output); }; +class GradResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(GradResult, + DiffType, type, + std::vector, value); +}; + template class TGrad: public Module { public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - DiffType, type, - Complex, value); - }; public: // constructor TGrad(const std::string name); @@ -130,14 +131,18 @@ void TGrad::setup(void) template void TGrad::execute(void) { - const auto nd = env().getNd(); - LOG(Message) << "Computing the " << par().type << " gradient of '" << par().op << "'" << std::endl; - std::vector result; - auto &op = envGet(ComplexField, par().op); + const unsigned int nd = env().getNd(); + GradResult result; + auto &op = envGet(ComplexField, par().op); + if (!par().output.empty()) + { + result.type = par().type; + result.value.resize(nd); + } for (unsigned int mu = 0; mu < nd; ++mu) { auto &der = envGet(ComplexField, varName(getName(), mu)); @@ -145,14 +150,10 @@ void TGrad::execute(void) dmu(der, op, mu, par().type); if (!par().output.empty()) { - Result r; - - r.type = par().type; - r.value = TensorRemove(sum(der)); - result.push_back(r); + result.value[mu] = TensorRemove(sum(der)); } } - if (result.size() > 0) + if (!par().output.empty()) { saveResult(par().output, "grad", result); } diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index c7c0e9ee..cd7c15eb 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -51,20 +51,20 @@ public: std::string, output); }; +class ShiftProbeResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(ShiftProbeResult, + std::string, shifts, + Complex, value); +}; + template class TShiftProbe: public Module { public: - typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - std::string, op, - Complex , value); - }; public: // constructor TShiftProbe(const std::string name); @@ -160,6 +160,14 @@ void TShiftProbe::execute(void) } } probe = real(sign*trace(acc)); + if (!par().output.empty()) + { + ShiftProbeResult r; + + r.shifts = par().shifts; + r.value = TensorRemove(sum(probe)); + saveResult(par().output, "probe", r); + } } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index 59aa27b8..a714daaa 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -49,19 +49,20 @@ public: std::string, output); }; +class TrKineticResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TrKineticResult, + std::vector>, value, + DiffType, type); +}; + template class TTrKinetic: public Module { public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - std::string, op, - Complex , value); - }; public: // constructor TTrKinetic(const std::string name); @@ -135,18 +136,24 @@ void TTrKinetic::execute(void) LOG(Message) << "Computing tr(d_mu phi*d_nu phi) using " << par().type << " derivative" << std::endl; - std::vector result; - auto &phi = envGet(Field, par().field); - auto &sumkin = envGet(ComplexField, varName(getName(), "sum")); + const unsigned int nd = env().getNd(); + TrKineticResult result; + auto &phi = envGet(Field, par().field); + auto &sumkin = envGet(ComplexField, varName(getName(), "sum")); envGetTmp(std::vector, der); sumkin = zero; - for (unsigned int mu = 0; mu < env().getNd(); ++mu) + if (!par().output.empty()) + { + result.type = par().type; + result.value.resize(nd, std::vector(nd)); + } + for (unsigned int mu = 0; mu < nd; ++mu) { dmu(der[mu], phi, mu, par().type); } - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - for (unsigned int nu = mu; nu < env().getNd(); ++nu) + for (unsigned int mu = 0; mu < nd; ++mu) + for (unsigned int nu = mu; nu < nd; ++nu) { auto &out = envGet(ComplexField, varName(getName(), mu, nu)); @@ -155,32 +162,13 @@ void TTrKinetic::execute(void) { sumkin += out; } - } - if (!par().output.empty()) - { - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - for (unsigned int nu = mu; nu < env().getNd(); ++nu) + if (!par().output.empty()) { - auto &out = envGet(ComplexField, varName(getName(), mu, nu)); - Result r; - - r.op = "tr(d_" + std::to_string(mu) + "phi*d_" - + std::to_string(nu) + "phi)"; - r.value = TensorRemove(sum(out)); - result.push_back(r); - } - { - Result r; - - r.op = "sum_mu tr(d_mu phi*d_mu phi)"; - r.value = TensorRemove(sum(sumkin)); - result.push_back(r); + result.value[mu][nu] = TensorRemove(sum(out)); + result.value[mu][nu] = result.value[nu][mu]; } } - if (result.size() > 0) - { - saveResult(par().output, "trkinetic", result); - } + saveResult(par().output, "trkinetic", result); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp index ed1a629a..cdbf7e30 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -49,19 +49,20 @@ public: std::string, output); }; +class TrMagResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TrMagResult, + std::string, op, + Real, value); +}; + template class TTrMag: public Module { public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - std::string, op, - Real, value); - }; public: // constructor TTrMag(const std::string name); @@ -120,8 +121,8 @@ void TTrMag::execute(void) LOG(Message) << "Computing tr(mag^n) for n even up to " << par().maxPow << std::endl; - std::vector result; - auto &phi = envGet(Field, par().field); + std::vector result; + auto &phi = envGet(Field, par().field); auto m2 = sum(phi), mn = m2; @@ -129,7 +130,7 @@ void TTrMag::execute(void) mn = 1.; for (unsigned int n = 2; n <= par().maxPow; n += 2) { - Result r; + TrMagResult r; mn = mn*m2; r.op = "tr(mag^" + std::to_string(n) + ")"; diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp index 6c1d733b..9be0a5d6 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -49,19 +49,21 @@ public: std::string, output); }; +class TrPhiResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TrPhiResult, + std::string, op, + Real, value); +}; + template class TTrPhi: public Module { public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - std::string, op, - Real, value); - }; + public: // constructor TTrPhi(const std::string name); @@ -136,8 +138,8 @@ void TTrPhi::execute(void) LOG(Message) << "Computing tr(phi^n) for n even up to " << par().maxPow << std::endl; - std::vector result; - auto &phi = envGet(Field, par().field); + std::vector result; + auto &phi = envGet(Field, par().field); envGetTmp(Field, phi2); envGetTmp(Field, buf); @@ -151,7 +153,7 @@ void TTrPhi::execute(void) phin = trace(buf); if (!par().output.empty()) { - Result r; + TrPhiResult r; r.op = "tr(phi^" + std::to_string(n) + ")"; r.value = TensorRemove(sum(phin)).real(); diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp index 6c6502fc..c9b42bf0 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -49,19 +49,20 @@ public: std::string, output); }; +class TransProjResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TransProjResult, + std::vector>, value, + DiffType, type); +}; + template class TTransProj: public Module { public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - std::string, op, - Complex , value); - }; public: // constructor TTransProj(const std::string name); @@ -137,21 +138,27 @@ void TTransProj::execute(void) << par().type << " derivatives and op= '" << par().op << "'" << std::endl; - std::vector result; - auto &op = envGet(ComplexField, par().op); + const unsigned int nd = env().getNd(); + TransProjResult result; + auto &op = envGet(ComplexField, par().op); envGetTmp(ComplexField, buf1); envGetTmp(ComplexField, buf2); envGetTmp(ComplexField, lap); lap = zero; - for (unsigned int mu = 0; mu < env().getNd(); ++mu) + if (!par().output.empty()) + { + result.type = par().type; + result.value.resize(nd, std::vector(nd)); + } + for (unsigned int mu = 0; mu < nd; ++mu) { dmu(buf1, op, mu, par().type); dmu(buf2, buf1, mu, par().type); lap += buf2; } - for (unsigned int mu = 0; mu < env().getNd(); ++mu) - for (unsigned int nu = mu; nu < env().getNd(); ++nu) + for (unsigned int mu = 0; mu < nd; ++mu) + for (unsigned int nu = mu; nu < nd; ++nu) { auto &out = envGet(ComplexField, varName(getName(), mu, nu)); dmu(buf1, op, mu, par().type); @@ -163,16 +170,11 @@ void TTransProj::execute(void) } if (!par().output.empty()) { - Result r; - - r.op = "(delta_" + std::to_string(mu) + "," + std::to_string(nu) - + " d^2 - d_" + std::to_string(mu) + "*d_" - + std::to_string(nu) + ")*op"; - r.value = TensorRemove(sum(out)); - result.push_back(r); + result.value[mu][nu] = TensorRemove(sum(out)); + result.value[mu][nu] = result.value[nu][mu]; } } - if (result.size() > 0) + if (!par().output.empty()) { saveResult(par().output, "transproj", result); } diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 9e53553f..abca6212 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -50,6 +50,16 @@ public: std::string, output); }; +class TwoPointResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointResult, + std::string, sink, + std::string, source, + std::vector, mom, + std::vector, data); +}; + template class TTwoPoint: public Module { @@ -57,16 +67,6 @@ public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; typedef std::vector SlicedOp; - - class Result: Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - std::string, sink, - std::string, source, - std::vector, mom, - std::vector, data); - }; public: // constructor TTwoPoint(const std::string name); @@ -166,7 +166,7 @@ void TTwoPoint::execute(void) const unsigned int nmom = mom_.size(); std::vector dMask(nd, 1); std::set ops; - std::vector result; + std::vector result; std::map> slicedOp; FFT fft(env().getGrid()); @@ -201,7 +201,7 @@ void TTwoPoint::execute(void) for (unsigned int m = 0; m < nmom; ++m) for (auto &p: par().op) { - Result r; + TwoPointResult r; r.sink = p.first; r.source = p.second; From fa0d8feff421001740acf3a1d039ec3e86980164 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 26 Apr 2018 17:56:27 +0100 Subject: [PATCH 302/620] Performance of CovariantCshift now non-embarrassing. --- benchmarks/Benchmark_su3.cc | 6 +-- lib/cshift/Cshift_common.h | 93 ++++++++++++++++++++++--------------- lib/lattice/Lattice_base.h | 3 +- 3 files changed, 60 insertions(+), 42 deletions(-) diff --git a/benchmarks/Benchmark_su3.cc b/benchmarks/Benchmark_su3.cc index 7e5436b1..7b1b2c1a 100644 --- a/benchmarks/Benchmark_su3.cc +++ b/benchmarks/Benchmark_su3.cc @@ -36,7 +36,7 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); #define LMAX (32) -#define LMIN (4) +#define LMIN (16) #define LINC (4) int64_t Nloop=2000; @@ -204,7 +204,7 @@ int main (int argc, char ** argv) std::cout< &rhs,commVector &buffer,int dimen int so=plane*rhs._grid->_ostride[dimension]; // base offset for start of plane int e1=rhs._grid->_slice_nblock[dimension]; int e2=rhs._grid->_slice_block[dimension]; + int ent = 0; + + static std::vector > table; table.resize(e1*e2); int stride=rhs._grid->_slice_stride[dimension]; if ( cbmask == 0x3 ) { - parallel_for_nest2(int n=0;n(off+bo+b,so+o+b); } } } else { int bo=0; - std::vector > table; for(int n=0;nCheckerBoardFromOindex(o+b); if ( ocb &cbmask ) { - table.push_back(std::pair (bo++,o+b)); + table[ent++]=std::pair (off+bo++,so+o+b); } } } - parallel_for(int i=0;i void Scatter_plane_simple (Lattice &rhs,commVector_slice_nblock[dimension]; int e2=rhs._grid->_slice_block[dimension]; int stride=rhs._grid->_slice_stride[dimension]; - + + static std::vector > table; table.resize(e1*e2); + int ent =0; + if ( cbmask ==0x3 ) { - parallel_for_nest2(int n=0;n_slice_stride[dimension]; int bo =n*rhs._grid->_slice_block[dimension]; - rhs._odata[so+o+b]=buffer[bo+b]; + table[ent++] = std::pair(so+o+b,bo); } } + } else { - std::vector > table; int bo=0; for(int n=0;n_slice_stride[dimension]; int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup if ( ocb & cbmask ) { - table.push_back(std::pair (so+o+b,bo++)); + table[ent++]=std::pair (so+o+b,bo++); } } } - parallel_for(int i=0;i void Copy_plane(Lattice& lhs,const Lattice &rhs int e1=rhs._grid->_slice_nblock[dimension]; // clearly loop invariant for icpc int e2=rhs._grid->_slice_block[dimension]; int stride = rhs._grid->_slice_stride[dimension]; + static std::vector > table; table.resize(e1*e2); + int ent=0; + if(cbmask == 0x3 ){ - parallel_for_nest2(int n=0;n(lo+o,ro+o); } } } else { - parallel_for_nest2(int n=0;nCheckerBoardFromOindex(o); if ( ocb&cbmask ) { - //lhs._odata[lo+o]=rhs._odata[ro+o]; - vstream(lhs._odata[lo+o],rhs._odata[ro+o]); + table[ent++] = std::pair(lo+o,ro+o); } } } } - + + parallel_for(int i=0;i void Copy_plane_permute(Lattice& lhs,const Lattice &rhs, int dimension,int lplane,int rplane,int cbmask,int permute_type) @@ -269,16 +278,28 @@ template void Copy_plane_permute(Lattice& lhs,const Lattice_slice_block [dimension]; int stride = rhs._grid->_slice_stride[dimension]; - parallel_for_nest2(int n=0;n > table; table.resize(e1*e2); + int ent=0; + double t_tab,t_perm; + if ( cbmask == 0x3 ) { + for(int n=0;n(lo+o+b,ro+o+b); + }} + } else { + for(int n=0;nCheckerBoardFromOindex(o+b); - if ( ocb&cbmask ) { - permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); - } + if ( ocb&cbmask ) table[ent++] = std::pair(lo+o+b,ro+o+b); + }} + } - }} + parallel_for(int i=0;i void Cshift_local(Lattice& ret,const Lattice &r sshift[0] = rhs._grid->CheckerBoardShiftForCB(rhs.checkerboard,dimension,shift,Even); sshift[1] = rhs._grid->CheckerBoardShiftForCB(rhs.checkerboard,dimension,shift,Odd); + double t_local; + if ( sshift[0] == sshift[1] ) { Cshift_local(ret,rhs,dimension,shift,0x3); } else { @@ -299,7 +322,7 @@ template void Cshift_local(Lattice& ret,const Lattice &r } } -template Lattice Cshift_local(Lattice &ret,const Lattice &rhs,int dimension,int shift,int cbmask) +template void Cshift_local(Lattice &ret,const Lattice &rhs,int dimension,int shift,int cbmask) { GridBase *grid = rhs._grid; int fd = grid->_fdimensions[dimension]; @@ -325,11 +348,7 @@ template Lattice Cshift_local(Lattice &ret,const Lattice int sshift = grid->CheckerBoardShiftForCB(rhs.checkerboard,dimension,shift,cb); int sx = (x+sshift)%rd; - - // FIXME : This must change where we have a - // Rotate slice. - // Document how this works ; why didn't I do this when I first wrote it... // wrap is whether sshift > rd. // num is sshift mod rd. // @@ -365,10 +384,8 @@ template Lattice Cshift_local(Lattice &ret,const Lattice if ( permute_slice ) Copy_plane_permute(ret,rhs,dimension,x,sx,cbmask,permute_type_dist); else Copy_plane(ret,rhs,dimension,x,sx,cbmask); - } - return ret; } } #endif diff --git a/lib/lattice/Lattice_base.h b/lib/lattice/Lattice_base.h index 98713c14..1169d18f 100644 --- a/lib/lattice/Lattice_base.h +++ b/lib/lattice/Lattice_base.h @@ -256,7 +256,7 @@ public: _odata[ss]=r._odata[ss]; } } - + Lattice(Lattice&& r){ // move constructor _grid = r._grid; checkerboard = r.checkerboard; @@ -270,6 +270,7 @@ public: _odata =std::move(r._odata); return *this; } + inline Lattice & operator = (const Lattice & r){ _grid = r._grid; checkerboard = r.checkerboard; From e9f1ac09ded186335c465b54bed60f3a44477ab9 Mon Sep 17 00:00:00 2001 From: paboyle Date: Thu, 26 Apr 2018 23:00:08 +0100 Subject: [PATCH 303/620] static --- lib/threads/Threads.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/threads/Threads.h b/lib/threads/Threads.h index 36daf2af..dacaf5d8 100644 --- a/lib/threads/Threads.h +++ b/lib/threads/Threads.h @@ -40,7 +40,7 @@ Author: paboyle #define PARALLEL_FOR_LOOP _Pragma("omp parallel for schedule(static)") #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(static)") -#define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for collapse(2)") +#define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for schedule(static) collapse(2)") #define PARALLEL_REGION _Pragma("omp parallel") #define PARALLEL_CRITICAL _Pragma("omp critical") #else From 7ecc47ac89ddb310583fe5b548fd0804dfb6e0ce Mon Sep 17 00:00:00 2001 From: paboyle Date: Thu, 26 Apr 2018 23:00:28 +0100 Subject: [PATCH 304/620] Quenched test compile --- lib/lattice/Lattice_comparison_utils.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/lattice/Lattice_comparison_utils.h b/lib/lattice/Lattice_comparison_utils.h index 9580d4d2..579449f1 100644 --- a/lib/lattice/Lattice_comparison_utils.h +++ b/lib/lattice/Lattice_comparison_utils.h @@ -198,7 +198,7 @@ namespace Grid { typedef typename vsimd::scalar_type scalar;\ return Comparison(functor(),lhs,rhs);\ }\ - template = 0>\ + template\ inline vInteger operator op(const iScalar &lhs,const iScalar &rhs)\ { \ return lhs._internal op rhs._internal; \ @@ -212,7 +212,7 @@ namespace Grid { inline vInteger operator op(const typename vsimd::scalar_type &lhs,const iScalar &rhs) \ { \ return lhs op rhs._internal; \ - } + } \ DECLARE_RELATIONAL(<,slt); From 1be80896048e42c825f81a6bc5a26d79c537f37d Mon Sep 17 00:00:00 2001 From: paboyle Date: Thu, 26 Apr 2018 23:42:45 +0100 Subject: [PATCH 305/620] Clean compile --- lib/lattice/Lattice_comparison_utils.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/lattice/Lattice_comparison_utils.h b/lib/lattice/Lattice_comparison_utils.h index 579449f1..cbac20ec 100644 --- a/lib/lattice/Lattice_comparison_utils.h +++ b/lib/lattice/Lattice_comparison_utils.h @@ -179,7 +179,7 @@ namespace Grid { return ret; } -#define DECLARE_RELATIONAL(op,functor) \ +#define DECLARE_RELATIONAL_EQ(op,functor) \ template = 0>\ inline vInteger operator op (const vsimd & lhs, const vsimd & rhs)\ {\ @@ -198,11 +198,6 @@ namespace Grid { typedef typename vsimd::scalar_type scalar;\ return Comparison(functor(),lhs,rhs);\ }\ - template\ - inline vInteger operator op(const iScalar &lhs,const iScalar &rhs)\ - { \ - return lhs._internal op rhs._internal; \ - } \ template\ inline vInteger operator op(const iScalar &lhs,const typename vsimd::scalar_type &rhs) \ { \ @@ -214,12 +209,19 @@ namespace Grid { return lhs op rhs._internal; \ } \ +#define DECLARE_RELATIONAL(op,functor) \ + DECLARE_RELATIONAL_EQ(op,functor) \ + template\ + inline vInteger operator op(const iScalar &lhs,const iScalar &rhs)\ + { \ + return lhs._internal op rhs._internal; \ + } DECLARE_RELATIONAL(<,slt); DECLARE_RELATIONAL(<=,sle); DECLARE_RELATIONAL(>,sgt); DECLARE_RELATIONAL(>=,sge); -DECLARE_RELATIONAL(==,seq); +DECLARE_RELATIONAL_EQ(==,seq); DECLARE_RELATIONAL(!=,sne); #undef DECLARE_RELATIONAL From 809b1cdd58d33ca43cab460a838589dfd0f2ce78 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 27 Apr 2018 05:19:10 +0100 Subject: [PATCH 306/620] Bug fix for MPI running ; introduced last night --- lib/cshift/Cshift_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cshift/Cshift_common.h b/lib/cshift/Cshift_common.h index b2f87315..24e0d2ab 100644 --- a/lib/cshift/Cshift_common.h +++ b/lib/cshift/Cshift_common.h @@ -152,7 +152,7 @@ template void Scatter_plane_simple (Lattice &rhs,commVector_slice_stride[dimension]; int bo =n*rhs._grid->_slice_block[dimension]; - table[ent++] = std::pair(so+o+b,bo); + table[ent++] = std::pair(so+o+b,bo+b); } } From 0734e9ddd4a24e4d7d1ee7224568105cfd39ac5b Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Fri, 27 Apr 2018 14:39:01 +0900 Subject: [PATCH 307/620] Debugging Scatter_plane_simple --- lib/cshift/Cshift_common.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cshift/Cshift_common.h b/lib/cshift/Cshift_common.h index b2f87315..c9faf365 100644 --- a/lib/cshift/Cshift_common.h +++ b/lib/cshift/Cshift_common.h @@ -150,9 +150,9 @@ template void Scatter_plane_simple (Lattice &rhs,commVector_slice_stride[dimension]; - int bo =n*rhs._grid->_slice_block[dimension]; - table[ent++] = std::pair(so+o+b,bo); + int o =n*rhs._grid->_slice_stride[dimension]; + int bo =n*rhs._grid->_slice_block[dimension]; + table[ent++] = std::pair(so+o+b,bo+b); } } From 75e4483407fe4f9f9715f06ba6e95be4c9eef2b8 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 27 Apr 2018 07:49:57 +0100 Subject: [PATCH 308/620] Stronger convergence test --- .../iterative/ImplicitlyRestartedLanczos.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h index 787cf15a..8011e796 100644 --- a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h +++ b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h @@ -479,15 +479,13 @@ until convergence Field B(grid); B.checkerboard = evec[0].checkerboard; // power of two search pattern; not every evalue in eval2 is assessed. + int allconv =1; for(int jj = 1; jj<=Nstop; jj*=2){ int j = Nstop-jj; RealD e = eval2_copy[j]; // Discard the evalue basisRotateJ(B,evec,Qt,j,0,Nk,Nm); - if( _Tester.TestConvergence(j,eresid,B,e,evalMaxApprox) ) { - if ( j > Nconv ) { - Nconv=j+1; - jj=Nstop; // Terminate the scan - } + if( !_Tester.TestConvergence(j,eresid,B,e,evalMaxApprox) ) { + allconv=0; } } // Do evec[0] for good measure @@ -495,8 +493,10 @@ until convergence int j=0; RealD e = eval2_copy[0]; basisRotateJ(B,evec,Qt,j,0,Nk,Nm); - _Tester.TestConvergence(j,eresid,B,e,evalMaxApprox); + if( !_Tester.TestConvergence(j,eresid,B,e,evalMaxApprox) ) allconv=0; } + if ( allconv ) Nconv = Nstop; + // test if we converged, if so, terminate std::cout<= "<=Nstop || beta_k < betastp){ From b27f0e5a539fc59214d026d04143e67d2d5a0264 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 27 Apr 2018 07:50:15 +0100 Subject: [PATCH 309/620] Control over IO --- lib/algorithms/iterative/LocalCoherenceLanczos.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/lib/algorithms/iterative/LocalCoherenceLanczos.h index b8348c0c..54e4c6c8 100644 --- a/lib/algorithms/iterative/LocalCoherenceLanczos.h +++ b/lib/algorithms/iterative/LocalCoherenceLanczos.h @@ -48,6 +48,7 @@ struct LanczosParams : Serializable { struct LocalCoherenceLanczosParams : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(LocalCoherenceLanczosParams, + bool, saveEvecs, bool, doFine, bool, doFineRead, bool, doCoarse, From 9b0240d1016c071750aefd28dbfbd97b781a8229 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 27 Apr 2018 07:50:51 +0100 Subject: [PATCH 310/620] Hot start test --- tests/Test_compressed_lanczos_hot_start.cc | 243 +++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 tests/Test_compressed_lanczos_hot_start.cc diff --git a/tests/Test_compressed_lanczos_hot_start.cc b/tests/Test_compressed_lanczos_hot_start.cc new file mode 100644 index 00000000..998f1b9f --- /dev/null +++ b/tests/Test_compressed_lanczos_hot_start.cc @@ -0,0 +1,243 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_dwf_compressed_lanczos_reorg.cc + + Copyright (C) 2017 + +Author: Leans heavily on Christoph Lehner's code +Author: Peter Boyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +/* + * Reimplement the badly named "multigrid" lanczos as compressed Lanczos using the features + * in Grid that were intended to be used to support blocked Aggregates, from + */ +#include +#include +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +class LocalCoherenceLanczosScidac : public LocalCoherenceLanczos +{ +public: + typedef iVector CoarseSiteVector; + typedef Lattice CoarseField; + typedef Lattice CoarseScalar; // used for inner products on fine field + typedef Lattice FineField; + + LocalCoherenceLanczosScidac(GridBase *FineGrid,GridBase *CoarseGrid, + LinearOperatorBase &FineOp, + int checkerboard) + // Base constructor + : LocalCoherenceLanczos(FineGrid,CoarseGrid,FineOp,checkerboard) + {}; + + void checkpointFine(std::string evecs_file,std::string evals_file) + { + assert(this->subspace.size()==nbasis); + emptyUserRecord record; + Grid::QCD::ScidacWriter WR(this->_FineGrid->IsBoss()); + WR.open(evecs_file); + for(int k=0;ksubspace[k],record); + } + WR.close(); + + XmlWriter WRx(evals_file); + write(WRx,"evals",this->evals_fine); + } + + void checkpointFineRestore(std::string evecs_file,std::string evals_file) + { + this->evals_fine.resize(nbasis); + this->subspace.resize(nbasis,this->_FineGrid); + + std::cout << GridLogIRL<< "checkpointFineRestore: Reading evals from "<evals_fine); + + assert(this->evals_fine.size()==nbasis); + + std::cout << GridLogIRL<< "checkpointFineRestore: Reading evecs from "<subspace[k].checkerboard=this->_checkerboard; + RD.readScidacFieldRecord(this->subspace[k],record); + + } + RD.close(); + } + + void checkpointCoarse(std::string evecs_file,std::string evals_file) + { + int n = this->evec_coarse.size(); + emptyUserRecord record; + Grid::QCD::ScidacWriter WR(this->_CoarseGrid->IsBoss()); + WR.open(evecs_file); + for(int k=0;kevec_coarse[k],record); + } + WR.close(); + + XmlWriter WRx(evals_file); + write(WRx,"evals",this->evals_coarse); + } + + void checkpointCoarseRestore(std::string evecs_file,std::string evals_file,int nvec) + { + std::cout << "resizing coarse vecs to " << nvec<< std::endl; + this->evals_coarse.resize(nvec); + this->evec_coarse.resize(nvec,this->_CoarseGrid); + std::cout << GridLogIRL<< "checkpointCoarseRestore: Reading evals from "<evals_coarse); + + assert(this->evals_coarse.size()==nvec); + emptyUserRecord record; + std::cout << GridLogIRL<< "checkpointCoarseRestore: Reading evecs from "<evec_coarse[k],record); + } + RD.close(); + } +}; + +int main (int argc, char ** argv) { + + Grid_init(&argc,&argv); + GridLogIRL.TimingMode(1); + + LocalCoherenceLanczosParams Params; + { + Params.omega.resize(10); + Params.blockSize.resize(5); + XmlWriter writer("Params_template.xml"); + write(writer,"Params",Params); + std::cout << GridLogMessage << " Written Params_template.xml" < blockSize = Params.blockSize; + std::vector latt({16,16,16,16}); + uint64_t vol = Ls*latt[0]*latt[1]*latt[2]*latt[3]; + double mat_flop= 2.0*1320.0*vol; + // Grids + GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(latt, + GridDefaultSimd(Nd,vComplex::Nsimd()), + GridDefaultMpi()); + GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); + GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); + GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); + + std::vector fineLatt = latt; + int dims=fineLatt.size(); + assert(blockSize.size()==dims+1); + std::vector coarseLatt(dims); + std::vector coarseLatt5d ; + + for (int d=0;d seeds4({1,2,3,4}); + GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4); + LatticeGaugeField Umu(UGrid); + SU3::HotConfiguration(RNG4,Umu); + // FieldMetaData header; + // NerscIO::readConfiguration(Umu,header,Params.config); + + std::cout << GridLogMessage << "Lattice dimensions: " << latt << " Ls: " << Ls << std::endl; + + // ZMobius EO Operator + ZMobiusFermionR Ddwf(Umu, *FGrid, *FrbGrid, *UGrid, *UrbGrid, mass, M5, Params.omega,1.,0.); + SchurDiagTwoOperator HermOp(Ddwf); + + // Eigenvector storage + LanczosParams fine =Params.FineParams; + LanczosParams coarse=Params.CoarseParams; + + const int Ns1 = fine.Nstop; const int Ns2 = coarse.Nstop; + const int Nk1 = fine.Nk; const int Nk2 = coarse.Nk; + const int Nm1 = fine.Nm; const int Nm2 = coarse.Nm; + + std::cout << GridLogMessage << "Keep " << fine.Nstop << " fine vectors" << std::endl; + std::cout << GridLogMessage << "Keep " << coarse.Nstop << " coarse vectors" << std::endl; + assert(Nm2 >= Nm1); + + const int nbasis= 60; + assert(nbasis==Ns1); + LocalCoherenceLanczosScidac _LocalCoherenceLanczos(FrbGrid,CoarseGrid5,HermOp,Odd); + std::cout << GridLogMessage << "Constructed LocalCoherenceLanczos" << std::endl; + + assert( (Params.doFine)||(Params.doFineRead)); + + if ( Params.doFine ) { + std::cout << GridLogMessage << "Performing fine grid IRL Nstop "<< Ns1 << " Nk "< Date: Fri, 27 Apr 2018 07:51:12 +0100 Subject: [PATCH 311/620] Roll over version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index bfad377d..a0211af1 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -Version : 0.7.0 +Version : 0.8.0 - Clang 3.5 and above, ICPC v16 and above, GCC 6.3 and above recommended - MPI and MPI3 comms optimisations for KNL and OPA finished From e369d7306d8bc53fb1e2456152d444b7e61fda07 Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 27 Apr 2018 07:51:44 +0100 Subject: [PATCH 312/620] Rename --- tests/lanczos/Test_compressed_lanczos.cc | 253 +++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 tests/lanczos/Test_compressed_lanczos.cc diff --git a/tests/lanczos/Test_compressed_lanczos.cc b/tests/lanczos/Test_compressed_lanczos.cc new file mode 100644 index 00000000..8bce82bb --- /dev/null +++ b/tests/lanczos/Test_compressed_lanczos.cc @@ -0,0 +1,253 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_dwf_compressed_lanczos_reorg.cc + + Copyright (C) 2017 + +Author: Leans heavily on Christoph Lehner's code +Author: Peter Boyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +/* + * Reimplement the badly named "multigrid" lanczos as compressed Lanczos using the features + * in Grid that were intended to be used to support blocked Aggregates, from + */ +#include +#include +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +class LocalCoherenceLanczosScidac : public LocalCoherenceLanczos +{ +public: + typedef iVector CoarseSiteVector; + typedef Lattice CoarseField; + typedef Lattice CoarseScalar; // used for inner products on fine field + typedef Lattice FineField; + + LocalCoherenceLanczosScidac(GridBase *FineGrid,GridBase *CoarseGrid, + LinearOperatorBase &FineOp, + int checkerboard) + // Base constructor + : LocalCoherenceLanczos(FineGrid,CoarseGrid,FineOp,checkerboard) + {}; + + void checkpointFine(std::string evecs_file,std::string evals_file) + { + assert(this->subspace.size()==nbasis); + emptyUserRecord record; + Grid::QCD::ScidacWriter WR(this->_FineGrid->IsBoss()); + WR.open(evecs_file); + for(int k=0;ksubspace[k],record); + } + WR.close(); + + XmlWriter WRx(evals_file); + write(WRx,"evals",this->evals_fine); + } + + void checkpointFineRestore(std::string evecs_file,std::string evals_file) + { + this->evals_fine.resize(nbasis); + this->subspace.resize(nbasis,this->_FineGrid); + + std::cout << GridLogIRL<< "checkpointFineRestore: Reading evals from "<evals_fine); + + assert(this->evals_fine.size()==nbasis); + + std::cout << GridLogIRL<< "checkpointFineRestore: Reading evecs from "<subspace[k].checkerboard=this->_checkerboard; + RD.readScidacFieldRecord(this->subspace[k],record); + + } + RD.close(); + } + + void checkpointCoarse(std::string evecs_file,std::string evals_file) + { + int n = this->evec_coarse.size(); + emptyUserRecord record; + Grid::QCD::ScidacWriter WR(this->_CoarseGrid->IsBoss()); + WR.open(evecs_file); + for(int k=0;kevec_coarse[k],record); + } + WR.close(); + + XmlWriter WRx(evals_file); + write(WRx,"evals",this->evals_coarse); + } + + void checkpointCoarseRestore(std::string evecs_file,std::string evals_file,int nvec) + { + std::cout << "resizing coarse vecs to " << nvec<< std::endl; + this->evals_coarse.resize(nvec); + this->evec_coarse.resize(nvec,this->_CoarseGrid); + std::cout << GridLogIRL<< "checkpointCoarseRestore: Reading evals from "<evals_coarse); + + assert(this->evals_coarse.size()==nvec); + emptyUserRecord record; + std::cout << GridLogIRL<< "checkpointCoarseRestore: Reading evecs from "<evec_coarse[k],record); + } + RD.close(); + } +}; + +int main (int argc, char ** argv) { + + Grid_init(&argc,&argv); + GridLogIRL.TimingMode(1); + + LocalCoherenceLanczosParams Params; + { + Params.omega.resize(10); + Params.blockSize.resize(5); + XmlWriter writer("Params_template.xml"); + write(writer,"Params",Params); + std::cout << GridLogMessage << " Written Params_template.xml" < blockSize = Params.blockSize; + + // Grids + 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); + + std::vector fineLatt = GridDefaultLatt(); + int dims=fineLatt.size(); + assert(blockSize.size()==dims+1); + std::vector coarseLatt(dims); + std::vector coarseLatt5d ; + + for (int d=0;d HermOp(Ddwf); + + // Eigenvector storage + LanczosParams fine =Params.FineParams; + LanczosParams coarse=Params.CoarseParams; + + const int Ns1 = fine.Nstop; const int Ns2 = coarse.Nstop; + const int Nk1 = fine.Nk; const int Nk2 = coarse.Nk; + const int Nm1 = fine.Nm; const int Nm2 = coarse.Nm; + + std::cout << GridLogMessage << "Keep " << fine.Nstop << " fine vectors" << std::endl; + std::cout << GridLogMessage << "Keep " << coarse.Nstop << " coarse vectors" << std::endl; + assert(Nm2 >= Nm1); + + const int nbasis= 60; + assert(nbasis==Ns1); + LocalCoherenceLanczosScidac _LocalCoherenceLanczos(FrbGrid,CoarseGrid5,HermOp,Odd); + std::cout << GridLogMessage << "Constructed LocalCoherenceLanczos" << std::endl; + + assert( (Params.doFine)||(Params.doFineRead)); + + if ( Params.doFine ) { + std::cout << GridLogMessage << "Performing fine grid IRL Nstop "<< Ns1 << " Nk "< Date: Fri, 27 Apr 2018 08:57:34 +0100 Subject: [PATCH 313/620] Update with LIME library guard --- tests/Test_compressed_lanczos_hot_start.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/Test_compressed_lanczos_hot_start.cc b/tests/Test_compressed_lanczos_hot_start.cc index 998f1b9f..3276d0f8 100644 --- a/tests/Test_compressed_lanczos_hot_start.cc +++ b/tests/Test_compressed_lanczos_hot_start.cc @@ -56,6 +56,7 @@ public: void checkpointFine(std::string evecs_file,std::string evals_file) { +#ifdef HAVE_LIME assert(this->subspace.size()==nbasis); emptyUserRecord record; Grid::QCD::ScidacWriter WR(this->_FineGrid->IsBoss()); @@ -67,10 +68,14 @@ public: XmlWriter WRx(evals_file); write(WRx,"evals",this->evals_fine); +#else + assert(0); +#endif } void checkpointFineRestore(std::string evecs_file,std::string evals_file) { +#ifdef HAVE_LIME this->evals_fine.resize(nbasis); this->subspace.resize(nbasis,this->_FineGrid); @@ -90,10 +95,14 @@ public: } RD.close(); +#else + assert(0); +#endif } void checkpointCoarse(std::string evecs_file,std::string evals_file) { +#ifdef HAVE_LIME int n = this->evec_coarse.size(); emptyUserRecord record; Grid::QCD::ScidacWriter WR(this->_CoarseGrid->IsBoss()); @@ -105,10 +114,14 @@ public: XmlWriter WRx(evals_file); write(WRx,"evals",this->evals_coarse); +#else + assert(0); +#endif } void checkpointCoarseRestore(std::string evecs_file,std::string evals_file,int nvec) { +#ifdef HAVE_LIME std::cout << "resizing coarse vecs to " << nvec<< std::endl; this->evals_coarse.resize(nvec); this->evec_coarse.resize(nvec,this->_CoarseGrid); @@ -125,6 +138,9 @@ public: RD.readScidacFieldRecord(this->evec_coarse[k],record); } RD.close(); +#else + assert(0); +#endif } }; From 1dddd17e3c73c37bf769ad31532e44cbb0cdc585 Mon Sep 17 00:00:00 2001 From: Dr Peter Boyle Date: Fri, 27 Apr 2018 11:44:46 +0100 Subject: [PATCH 314/620] Benchmark improvements from tesseract --- benchmarks/Benchmark_ITT.cc | 13 ++++++++++--- benchmarks/Benchmark_comms.cc | 13 +++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/benchmarks/Benchmark_ITT.cc b/benchmarks/Benchmark_ITT.cc index 666e4830..f811ac32 100644 --- a/benchmarks/Benchmark_ITT.cc +++ b/benchmarks/Benchmark_ITT.cc @@ -158,8 +158,10 @@ public: dbytes=0; ncomm=0; - - parallel_for(int dir=0;dir<8;dir++){ +#ifdef GRID_OMP +#pragma omp parallel for num_threads(Grid::CartesianCommunicator::nCommThreads) +#endif + for(int dir=0;dir<8;dir++){ double tbytes; int mu =dir % 4; @@ -175,9 +177,14 @@ public: int comm_proc = mpi_layout[mu]-1; Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); } +#ifdef GRID_OMP + int tid = omp_get_thread_num(); +#else + int tid = dir; +#endif tbytes= Grid.StencilSendToRecvFrom((void *)&xbuf[dir][0], xmit_to_rank, (void *)&rbuf[dir][0], recv_from_rank, - bytes,dir); + bytes,tid); #ifdef GRID_OMP #pragma omp atomic diff --git a/benchmarks/Benchmark_comms.cc b/benchmarks/Benchmark_comms.cc index 29ccf96c..304a09fc 100644 --- a/benchmarks/Benchmark_comms.cc +++ b/benchmarks/Benchmark_comms.cc @@ -169,7 +169,11 @@ int main (int argc, char ** argv) for(int lat=4;lat<=maxlat;lat+=4){ for(int Ls=8;Ls<=8;Ls*=2){ - std::vector latt_size ({lat,lat,lat,lat}); + std::vector latt_size ({lat*mpi_layout[0], + lat*mpi_layout[1], + lat*mpi_layout[2], + lat*mpi_layout[3]}); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); RealD Nrank = Grid._Nprocessors; @@ -485,7 +489,8 @@ int main (int argc, char ** argv) dbytes=0; ncomm=0; - parallel_for(int dir=0;dir<8;dir++){ +#pragma omp parallel for num_threads(Grid::CartesianCommunicator::nCommThreads) + for(int dir=0;dir<8;dir++){ double tbytes; int mu =dir % 4; @@ -502,9 +507,9 @@ int main (int argc, char ** argv) int comm_proc = mpi_layout[mu]-1; Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); } - + int tid = omp_get_thread_num(); tbytes= Grid.StencilSendToRecvFrom((void *)&xbuf[dir][0], xmit_to_rank, - (void *)&rbuf[dir][0], recv_from_rank, bytes,dir); + (void *)&rbuf[dir][0], recv_from_rank, bytes,tid); #pragma omp atomic dbytes+=tbytes; From c45f24a1b51e9b6bc8a664130a04791746c183ea Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 30 Apr 2018 21:50:00 +0100 Subject: [PATCH 315/620] Improvements for tesseract --- configure.ac | 6 +- lib/communicator/SharedMemoryMPI.cc | 229 +++++++++++++++++++++++++++- lib/stencil/Stencil.h | 2 + lib/threads/Threads.h | 2 +- 4 files changed, 230 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index aced6a9c..722b1678 100644 --- a/configure.ac +++ b/configure.ac @@ -340,7 +340,7 @@ case ${ac_PRECISION} in esac ###################### Shared memory allocation technique under MPI3 -AC_ARG_ENABLE([shm],[AC_HELP_STRING([--enable-shm=shmopen|hugetlbfs|shmnone], +AC_ARG_ENABLE([shm],[AC_HELP_STRING([--enable-shm=shmopen|shmget|hugetlbfs|shmnone], [Select SHM allocation technique])],[ac_SHM=${enable_shm}],[ac_SHM=shmopen]) case ${ac_SHM} in @@ -349,6 +349,10 @@ case ${ac_SHM} in AC_DEFINE([GRID_MPI3_SHMOPEN],[1],[GRID_MPI3_SHMOPEN] ) ;; + shmget) + AC_DEFINE([GRID_MPI3_SHMGET],[1],[GRID_MPI3_SHMGET] ) + ;; + shmnone) AC_DEFINE([GRID_MPI3_SHM_NONE],[1],[GRID_MPI3_SHM_NONE] ) ;; diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index d534a6d9..205d61a9 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -114,19 +114,169 @@ void GlobalSharedMemory::Init(Grid_MPI_Comm comm) assert(WorldNode!=-1); _ShmSetup=1; } - -void GlobalSharedMemory::OptimalCommunicator(const std::vector &processors,Grid_MPI_Comm & optimal_comm) +// Gray encode support +int BinaryToGray (int binary) { + int gray = (binary>>1)^binary; + return gray; +} +int Log2Size(int TwoToPower,int MAXLOG2) { - //////////////////////////////////////////////////////////////// - // Assert power of two shm_size. - //////////////////////////////////////////////////////////////// int log2size = -1; - for(int i=0;i<=MAXLOG2RANKSPERNODE;i++){ - if ( (0x1< &processors,Grid_MPI_Comm & optimal_comm) +{ +#undef HYPERCUBE +#ifdef HYPERCUBE + //////////////////////////////////////////////////////////////// + // Assert power of two shm_size. + //////////////////////////////////////////////////////////////// + int log2size = Log2Size(WorldShmSize,MAXLOG2RANKSPERNODE); + assert(log2size != -1); + + //////////////////////////////////////////////////////////////// + // Identify the hypercube coordinate of this node using hostname + //////////////////////////////////////////////////////////////// + // n runs 0...7 9...16 18...25 27...34 (8*4) 5 bits + // i runs 0..7 3 bits + // r runs 0..3 2 bits + // 2^10 = 1024 nodes + const int maxhdim = 10; + std::vector HyperCubeCoords(maxhdim,0); + std::vector RootHyperCubeCoords(maxhdim,0); + int R; + int I; + int N; + const int namelen = _POSIX_HOST_NAME_MAX; + char name[namelen]; + + // Parse ICE-XA hostname to get hypercube location + gethostname(name,namelen); + int nscan = sscanf(name,"r%di%dn%d",&R,&I,&N) ; + assert(nscan==3); + + int nlo = N%9; + int nhi = N/9; + uint32_t hypercoor = (R<<8)|(I<<5)|(nhi<<3)|nlo ; + uint32_t rootcoor = hypercoor; + + ////////////////////////////////////////////////////////////////// + // Print debug info + ////////////////////////////////////////////////////////////////// + for(int d=0;d>d)&0x1; + } + + std::cerr << " Hcoor (" ; + for(int d=0;d=0); + std::cerr << " WorldRank "<>d)&0x1; + } + + std::cerr << " rel Hcoor ("; + for(int d=0;d processor_coor(ndimension); + std::vector WorldDims = processors; std::vector ShmDims (ndimension,1); std::vector NodeDims (ndimension); + std::vector ShmCoor (ndimension); std::vector NodeCoor (ndimension); std::vector WorldCoor(ndimension); + std::vector HyperCoor(ndimension); + int dim = 0; + for(int l2=0;l2> bits; + } + //////////////////////////////////////////////////////////////// + // Check processor counts match + //////////////////////////////////////////////////////////////// + int Nprocessors=1; + for(int i=0;i &processors, ///////////////////////////////////////////////////////////////// int ierr= MPI_Comm_split(WorldComm,0,rank,&optimal_comm); assert(ierr==0); +#endif } +//////////////////////////////////////////////////////////////////////////////////////////// +// SHMGET +//////////////////////////////////////////////////////////////////////////////////////////// +#ifdef GRID_MPI3_SHMGET +void GlobalSharedMemory::SharedMemoryAllocate(uint64_t bytes, int flags) +{ + std::cout << "SharedMemoryAllocate "<< bytes<< " shmget implementation "< shmids(WorldShmSize); + + if ( WorldShmRank == 0 ) { + for(int r=0;r >& table,const La parallel_for(int i=0;i #define PARALLEL_FOR_LOOP _Pragma("omp parallel for schedule(static)") #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(static)") -#define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for schedule(static) collapse(2)") +#define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for collapse(2)") #define PARALLEL_REGION _Pragma("omp parallel") #define PARALLEL_CRITICAL _Pragma("omp critical") #else From edc28dcfbf0df697e78bb8718e3ad4980fe885ad Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 1 May 2018 14:02:31 +0100 Subject: [PATCH 316/620] Hadrons: scalar SU(N) 2-pt fix --- .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index abca6212..1496edf9 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -64,9 +64,9 @@ template class TTwoPoint: public Module { public: - typedef typename SImpl::Field Field; - typedef typename SImpl::ComplexField ComplexField; - typedef std::vector SlicedOp; + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + typedef std::vector SlicedOp; public: // constructor TTwoPoint(const std::string name); @@ -160,18 +160,24 @@ void TTwoPoint::execute(void) LOG(Message) << " <" << p.first << " " << p.second << ">" << std::endl; } - const unsigned int nd = env().getDim().size(); - const unsigned int nt = env().getDim().back(); - const unsigned int nop = par().op.size(); - const unsigned int nmom = mom_.size(); + const unsigned int nd = env().getNd(); + const unsigned int nt = env().getDim().back(); + const unsigned int nop = par().op.size(); + const unsigned int nmom = mom_.size(); + double partVol = 1.; std::vector dMask(nd, 1); std::set ops; std::vector result; std::map> slicedOp; FFT fft(env().getGrid()); + TComplex buf; envGetTmp(ComplexField, ftBuf); dMask[nd - 1] = 0; + for (unsigned int mu = 0; mu < nd - 1; ++mu) + { + partVol *= env().getDim()[mu]; + } for (auto &p: par().op) { ops.insert(p.first); @@ -183,7 +189,7 @@ void TTwoPoint::execute(void) slicedOp[o].resize(nmom); LOG(Message) << "Operator '" << o << "' FFT" << std::endl; - fft.FFT_dim_mask(ftBuf, op, dMask, FFT::backward); + fft.FFT_dim_mask(ftBuf, op, dMask, FFT::forward); for (unsigned int m = 0; m < nmom; ++m) { auto qt = mom_[m]; @@ -193,7 +199,8 @@ void TTwoPoint::execute(void) for (unsigned int t = 0; t < nt; ++t) { qt[nd - 1] = t; - peekSite(slicedOp[o][m][t], ftBuf, qt); + peekSite(buf, ftBuf, qt); + slicedOp[o][m][t] = TensorRemove(buf)/partVol; } } } @@ -228,7 +235,7 @@ std::vector TTwoPoint::makeTwoPoint( { for (unsigned int t = 0; t < nt; ++t) { - res[dt] += TensorRemove(trace(sink[(t+dt)%nt]*adj(source[t]))); + res[dt] += sink[(t+dt)%nt]*adj(source[t]); } res[dt] *= 1./static_cast(nt); } From a64497265d05583d1910b3c293e109c487aab2d6 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 2 May 2018 14:07:28 +0100 Subject: [PATCH 317/620] TIming --- lib/stencil/Stencil.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/stencil/Stencil.h b/lib/stencil/Stencil.h index dc64f616..a79064eb 100644 --- a/lib/stencil/Stencil.h +++ b/lib/stencil/Stencil.h @@ -507,25 +507,24 @@ class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal template void CommsMerge(decompressor decompress,std::vector &mm,std::vector &dd) { + mergetime-=usecond(); for(int i=0;i Date: Wed, 2 May 2018 14:07:41 +0100 Subject: [PATCH 318/620] shmget reintroduce --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 722b1678..819253a0 100644 --- a/configure.ac +++ b/configure.ac @@ -370,7 +370,7 @@ esac AC_ARG_ENABLE([shmpath],[AC_HELP_STRING([--enable-shmpath=path], [Select SHM mmap base path for hugetlbfs])], [ac_SHMPATH=${enable_shmpath}], - [ac_SHMPATH=/var/lib/hugetlbfs/pagesize-2MB/]) + [ac_SHMPATH=/var/lib/hugetlbfs/global/pagesize-2MB/]) AC_DEFINE_UNQUOTED([GRID_SHM_PATH],["$ac_SHMPATH"],[Path to a hugetlbfs filesystem for MMAPing]) ############### communication type selection From 12982a4455189cc568a18f1d6cffe819fc706c4e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 2 May 2018 14:10:21 +0100 Subject: [PATCH 319/620] Hypercube optimisation --- lib/communicator/SharedMemoryMPI.cc | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/lib/communicator/SharedMemoryMPI.cc b/lib/communicator/SharedMemoryMPI.cc index 205d61a9..d55ff5df 100644 --- a/lib/communicator/SharedMemoryMPI.cc +++ b/lib/communicator/SharedMemoryMPI.cc @@ -173,15 +173,9 @@ void GlobalSharedMemory::OptimalCommunicator(const std::vector &processors, HyperCubeCoords[d] = (hypercoor>>d)&0x1; } - std::cerr << " Hcoor (" ; - for(int d=0;d &processors, hypercoor=hypercoor-rootcoor; assert(hypercoor=0); - std::cerr << " WorldRank "< &processors, HyperCubeCoords[d] = (hypercoor>>d)&0x1; } - std::cerr << " rel Hcoor ("; - for(int d=0;d &processors, int rank; Lexicographic::CoorFromIndexReversed(NodeCoor,WorldNode ,NodeDims); - std::cerr << "NodeCoor "; - for(int d=0;d Date: Wed, 2 May 2018 14:10:55 +0100 Subject: [PATCH 320/620] Revert to fast versoin --- lib/qcd/action/fermion/WilsonKernelsHand.cc | 616 +++++--------------- 1 file changed, 148 insertions(+), 468 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonKernelsHand.cc b/lib/qcd/action/fermion/WilsonKernelsHand.cc index aa6b5f6b..50816495 100644 --- a/lib/qcd/action/fermion/WilsonKernelsHand.cc +++ b/lib/qcd/action/fermion/WilsonKernelsHand.cc @@ -30,181 +30,60 @@ Author: paboyle #define REGISTER -#define LOAD_CHIMU_BODY(F) \ - Chimu_00=ref(F)(0)(0); \ - Chimu_01=ref(F)(0)(1); \ - Chimu_02=ref(F)(0)(2); \ - Chimu_10=ref(F)(1)(0); \ - Chimu_11=ref(F)(1)(1); \ - Chimu_12=ref(F)(1)(2); \ - Chimu_20=ref(F)(2)(0); \ - Chimu_21=ref(F)(2)(1); \ - Chimu_22=ref(F)(2)(2); \ - Chimu_30=ref(F)(3)(0); \ - Chimu_31=ref(F)(3)(1); \ - Chimu_32=ref(F)(3)(2) +#define LOAD_CHIMU \ + {const SiteSpinor & ref (in._odata[offset]); \ + Chimu_00=ref()(0)(0);\ + Chimu_01=ref()(0)(1);\ + Chimu_02=ref()(0)(2);\ + Chimu_10=ref()(1)(0);\ + Chimu_11=ref()(1)(1);\ + Chimu_12=ref()(1)(2);\ + Chimu_20=ref()(2)(0);\ + Chimu_21=ref()(2)(1);\ + Chimu_22=ref()(2)(2);\ + Chimu_30=ref()(3)(0);\ + Chimu_31=ref()(3)(1);\ + Chimu_32=ref()(3)(2);} -#define LOAD_CHIMU(DIR,F,PERM) \ - { const SiteSpinor & ref (in._odata[offset]); LOAD_CHIMU_BODY(F); } - -#define LOAD_CHI_BODY(F) \ - Chi_00 = ref(F)(0)(0);\ - Chi_01 = ref(F)(0)(1);\ - Chi_02 = ref(F)(0)(2);\ - Chi_10 = ref(F)(1)(0);\ - Chi_11 = ref(F)(1)(1);\ - Chi_12 = ref(F)(1)(2) - -#define LOAD_CHI(DIR,F,PERM) \ - {const SiteHalfSpinor &ref(buf[offset]); LOAD_CHI_BODY(F); } - - -//G-parity implementations using in-place intrinsic ops - -//1l 1h -> 1h 1l -//0l 0h , 1h 1l -> 0l 1h 0h,1l -//0h,1l -> 1l,0h -//if( (distance == 1 && !perm_will_occur) || (distance == -1 && perm_will_occur) ) -//Pulled fermion through forwards face, GPBC on upper component -//Need 0= 0l 1h 1= 1l 0h -//else if( (distance == -1 && !perm) || (distance == 1 && perm) ) -//Pulled fermion through backwards face, GPBC on lower component -//Need 0= 1l 0h 1= 0l 1h - -//1l 1h -> 1h 1l -//0l 0h , 1h 1l -> 0l 1h 0h,1l -#define DO_TWIST_0L_1H(INTO,S,C,F, PERM, tmp1, tmp2, tmp3) \ - permute##PERM(tmp1, ref(1)(S)(C)); \ - exchange##PERM(tmp2,tmp3, ref(0)(S)(C), tmp1); \ - INTO = tmp2; - -//0l 0h -> 0h 0l -//1l 1h, 0h 0l -> 1l 0h, 1h 0l -#define DO_TWIST_1L_0H(INTO,S,C,F, PERM, tmp1, tmp2, tmp3) \ - permute##PERM(tmp1, ref(0)(S)(C)); \ - exchange##PERM(tmp2,tmp3, ref(1)(S)(C), tmp1); \ - INTO = tmp2; - - - - -#define LOAD_CHI_SETUP(DIR,F) \ - g = F; \ - direction = st._directions[DIR]; \ - distance = st._distances[DIR]; \ - sl = st._grid->_simd_layout[direction]; \ - inplace_twist = 0; \ - if(SE->_around_the_world && this->Params.twists[DIR % 4]){ \ - if(sl == 1){ \ - g = (F+1) % 2; \ - }else{ \ - inplace_twist = 1; \ - } \ - } - -#define LOAD_CHIMU_GPARITY_INPLACE_TWIST(DIR,F,PERM) \ - { const SiteSpinor &ref(in._odata[offset]); \ - LOAD_CHI_SETUP(DIR,F); \ - if(!inplace_twist){ \ - LOAD_CHIMU_BODY(g); \ - }else{ \ - if( ( F==0 && ((distance == 1 && !perm) || (distance == -1 && perm)) ) || \ - ( F==1 && ((distance == -1 && !perm) || (distance == 1 && perm)) ) ){ \ - DO_TWIST_0L_1H(Chimu_00,0,0,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chimu_01,0,1,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_0L_1H(Chimu_02,0,2,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chimu_10,1,0,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_0L_1H(Chimu_11,1,1,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chimu_12,1,2,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_0L_1H(Chimu_20,2,0,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chimu_21,2,1,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_0L_1H(Chimu_22,2,2,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chimu_30,3,0,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_0L_1H(Chimu_31,3,1,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chimu_32,3,2,F,PERM, U_11,U_20,U_21); \ - }else{ \ - DO_TWIST_1L_0H(Chimu_00,0,0,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chimu_01,0,1,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_1L_0H(Chimu_02,0,2,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chimu_10,1,0,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_1L_0H(Chimu_11,1,1,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chimu_12,1,2,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_1L_0H(Chimu_20,2,0,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chimu_21,2,1,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_1L_0H(Chimu_22,2,2,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chimu_30,3,0,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_1L_0H(Chimu_31,3,1,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chimu_32,3,2,F,PERM, U_11,U_20,U_21); \ - } \ - } \ - } - - -#define LOAD_CHI_GPARITY_INPLACE_TWIST(DIR,F,PERM) \ - { const SiteHalfSpinor &ref(buf[offset]); \ - LOAD_CHI_SETUP(DIR,F); \ - if(!inplace_twist){ \ - LOAD_CHI_BODY(g); \ - }else{ \ - if( ( F==0 && ((distance == 1 && !perm) || (distance == -1 && perm)) ) || \ - ( F==1 && ((distance == -1 && !perm) || (distance == 1 && perm)) ) ){ \ - DO_TWIST_0L_1H(Chi_00,0,0,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chi_01,0,1,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_0L_1H(Chi_02,0,2,F,PERM, UChi_00,UChi_01,UChi_02); \ - DO_TWIST_0L_1H(Chi_10,1,0,F,PERM, UChi_10,UChi_11,UChi_12); \ - DO_TWIST_0L_1H(Chi_11,1,1,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_0L_1H(Chi_12,1,2,F,PERM, U_11,U_20,U_21); \ - }else{ \ - DO_TWIST_1L_0H(Chi_00,0,0,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chi_01,0,1,F,PERM, U_11,U_20,U_21); \ - DO_TWIST_1L_0H(Chi_02,0,2,F,PERM, UChi_00,UChi_01,UChi_02); \ - DO_TWIST_1L_0H(Chi_10,1,0,F,PERM, UChi_10,UChi_11,UChi_12); \ - DO_TWIST_1L_0H(Chi_11,1,1,F,PERM, U_00,U_01,U_10); \ - DO_TWIST_1L_0H(Chi_12,1,2,F,PERM, U_11,U_20,U_21); \ - } \ - } \ - } - - -#define LOAD_CHI_GPARITY(DIR,F,PERM) LOAD_CHI_GPARITY_INPLACE_TWIST(DIR,F,PERM) -#define LOAD_CHIMU_GPARITY(DIR,F,PERM) LOAD_CHIMU_GPARITY_INPLACE_TWIST(DIR,F,PERM) +#define LOAD_CHI\ + {const SiteHalfSpinor &ref(buf[offset]); \ + Chi_00 = ref()(0)(0);\ + Chi_01 = ref()(0)(1);\ + Chi_02 = ref()(0)(2);\ + Chi_10 = ref()(1)(0);\ + Chi_11 = ref()(1)(1);\ + Chi_12 = ref()(1)(2);} // To splat or not to splat depends on the implementation -#define MULT_2SPIN_BODY \ - Impl::loadLinkElement(U_00,ref()(0,0)); \ - Impl::loadLinkElement(U_10,ref()(1,0)); \ - Impl::loadLinkElement(U_20,ref()(2,0)); \ - Impl::loadLinkElement(U_01,ref()(0,1)); \ - Impl::loadLinkElement(U_11,ref()(1,1)); \ - Impl::loadLinkElement(U_21,ref()(2,1)); \ - UChi_00 = U_00*Chi_00; \ - UChi_10 = U_00*Chi_10; \ - UChi_01 = U_10*Chi_00; \ - UChi_11 = U_10*Chi_10; \ - UChi_02 = U_20*Chi_00; \ - UChi_12 = U_20*Chi_10; \ - UChi_00+= U_01*Chi_01; \ - UChi_10+= U_01*Chi_11; \ - UChi_01+= U_11*Chi_01; \ - UChi_11+= U_11*Chi_11; \ - UChi_02+= U_21*Chi_01; \ - UChi_12+= U_21*Chi_11; \ - Impl::loadLinkElement(U_00,ref()(0,2)); \ - Impl::loadLinkElement(U_10,ref()(1,2)); \ - Impl::loadLinkElement(U_20,ref()(2,2)); \ - UChi_00+= U_00*Chi_02; \ - UChi_10+= U_00*Chi_12; \ - UChi_01+= U_10*Chi_02; \ - UChi_11+= U_10*Chi_12; \ - UChi_02+= U_20*Chi_02; \ - UChi_12+= U_20*Chi_12 - - -#define MULT_2SPIN(A,F) \ - {auto & ref(U._odata[sU](A)); MULT_2SPIN_BODY; } - -#define MULT_2SPIN_GPARITY(A,F) \ - {auto & ref(U._odata[sU](F)(A)); MULT_2SPIN_BODY; } +#define MULT_2SPIN(A)\ + {auto & ref(U._odata[sU](A)); \ + Impl::loadLinkElement(U_00,ref()(0,0)); \ + Impl::loadLinkElement(U_10,ref()(1,0)); \ + Impl::loadLinkElement(U_20,ref()(2,0)); \ + Impl::loadLinkElement(U_01,ref()(0,1)); \ + Impl::loadLinkElement(U_11,ref()(1,1)); \ + Impl::loadLinkElement(U_21,ref()(2,1)); \ + UChi_00 = U_00*Chi_00;\ + UChi_10 = U_00*Chi_10;\ + UChi_01 = U_10*Chi_00;\ + UChi_11 = U_10*Chi_10;\ + UChi_02 = U_20*Chi_00;\ + UChi_12 = U_20*Chi_10;\ + UChi_00+= U_01*Chi_01;\ + UChi_10+= U_01*Chi_11;\ + UChi_01+= U_11*Chi_01;\ + UChi_11+= U_11*Chi_11;\ + UChi_02+= U_21*Chi_01;\ + UChi_12+= U_21*Chi_11;\ + Impl::loadLinkElement(U_00,ref()(0,2)); \ + Impl::loadLinkElement(U_10,ref()(1,2)); \ + Impl::loadLinkElement(U_20,ref()(2,2)); \ + UChi_00+= U_00*Chi_02;\ + UChi_10+= U_00*Chi_12;\ + UChi_01+= U_10*Chi_02;\ + UChi_11+= U_10*Chi_12;\ + UChi_02+= U_20*Chi_02;\ + UChi_12+= U_20*Chi_12;} #define PERMUTE_DIR(dir) \ @@ -428,87 +307,84 @@ Author: paboyle result_31-= UChi_11; \ result_32-= UChi_12; -#define HAND_STENCIL_LEG(PROJ,PERM,DIR,RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ +#define HAND_STENCIL_LEG(PROJ,PERM,DIR,RECON) \ SE=st.GetEntry(ptype,DIR,ss); \ offset = SE->_offset; \ local = SE->_is_local; \ perm = SE->_permute; \ if ( local ) { \ - LOAD_CHIMU_IMPL(DIR,F,PERM); \ + LOAD_CHIMU; \ PROJ; \ if ( perm) { \ PERMUTE_DIR(PERM); \ } \ } else { \ - LOAD_CHI_IMPL(DIR,F,PERM); \ + LOAD_CHI; \ } \ - MULT_2SPIN_IMPL(DIR,F); \ + MULT_2SPIN(DIR); \ RECON; - -#define HAND_STENCIL_LEG_INT(PROJ,PERM,DIR,RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ +#define HAND_STENCIL_LEG_INT(PROJ,PERM,DIR,RECON) \ SE=st.GetEntry(ptype,DIR,ss); \ offset = SE->_offset; \ local = SE->_is_local; \ perm = SE->_permute; \ if ( local ) { \ - LOAD_CHIMU_IMPL(DIR,F,PERM); \ + LOAD_CHIMU; \ PROJ; \ if ( perm) { \ PERMUTE_DIR(PERM); \ } \ } else if ( st.same_node[DIR] ) { \ - LOAD_CHI_IMPL(DIR,F,PERM); \ + LOAD_CHI; \ } \ if (local || st.same_node[DIR] ) { \ - MULT_2SPIN_IMPL(DIR,F); \ + MULT_2SPIN(DIR); \ RECON; \ } -#define HAND_STENCIL_LEG_EXT(PROJ,PERM,DIR,RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ +#define HAND_STENCIL_LEG_EXT(PROJ,PERM,DIR,RECON) \ SE=st.GetEntry(ptype,DIR,ss); \ offset = SE->_offset; \ - local = SE->_is_local; \ - perm = SE->_permute; \ if((!SE->_is_local)&&(!st.same_node[DIR]) ) { \ - LOAD_CHI_IMPL(DIR,F,PERM); \ - MULT_2SPIN_IMPL(DIR,F); \ + LOAD_CHI; \ + MULT_2SPIN(DIR); \ RECON; \ nmu++; \ } -#define HAND_RESULT(ss,F) \ +#define HAND_RESULT(ss) \ { \ SiteSpinor & ref (out._odata[ss]); \ - vstream(ref(F)(0)(0),result_00); \ - vstream(ref(F)(0)(1),result_01); \ - vstream(ref(F)(0)(2),result_02); \ - vstream(ref(F)(1)(0),result_10); \ - vstream(ref(F)(1)(1),result_11); \ - vstream(ref(F)(1)(2),result_12); \ - vstream(ref(F)(2)(0),result_20); \ - vstream(ref(F)(2)(1),result_21); \ - vstream(ref(F)(2)(2),result_22); \ - vstream(ref(F)(3)(0),result_30); \ - vstream(ref(F)(3)(1),result_31); \ - vstream(ref(F)(3)(2),result_32); \ + vstream(ref()(0)(0),result_00); \ + vstream(ref()(0)(1),result_01); \ + vstream(ref()(0)(2),result_02); \ + vstream(ref()(1)(0),result_10); \ + vstream(ref()(1)(1),result_11); \ + vstream(ref()(1)(2),result_12); \ + vstream(ref()(2)(0),result_20); \ + vstream(ref()(2)(1),result_21); \ + vstream(ref()(2)(2),result_22); \ + vstream(ref()(3)(0),result_30); \ + vstream(ref()(3)(1),result_31); \ + vstream(ref()(3)(2),result_32); \ } -#define HAND_RESULT_EXT(ss,F) \ +#define HAND_RESULT_EXT(ss) \ if (nmu){ \ SiteSpinor & ref (out._odata[ss]); \ - ref(F)(0)(0)+=result_00; \ - ref(F)(0)(1)+=result_01; \ - ref(F)(0)(2)+=result_02; \ - ref(F)(1)(0)+=result_10; \ - ref(F)(1)(1)+=result_11; \ - ref(F)(1)(2)+=result_12; \ - ref(F)(2)(0)+=result_20; \ - ref(F)(2)(1)+=result_21; \ - ref(F)(2)(2)+=result_22; \ - ref(F)(3)(0)+=result_30; \ - ref(F)(3)(1)+=result_31; \ - ref(F)(3)(2)+=result_32; \ + ref()(0)(0)+=result_00; \ + ref()(0)(1)+=result_01; \ + ref()(0)(2)+=result_02; \ + ref()(1)(0)+=result_10; \ + ref()(1)(1)+=result_11; \ + ref()(1)(2)+=result_12; \ + ref()(2)(0)+=result_20; \ + ref()(2)(1)+=result_21; \ + ref()(2)(2)+=result_22; \ + ref()(3)(0)+=result_30; \ + ref()(3)(1)+=result_31; \ + ref()(3)(2)+=result_32; \ } @@ -587,18 +463,15 @@ WilsonKernels::HandDhopSite(StencilImpl &st,LebesgueOrder &lo,DoubledGauge int offset,local,perm, ptype; StencilEntry *SE; -#define HAND_DOP_SITE(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ - HAND_STENCIL_LEG(XM_PROJ,3,Xp,XM_RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(YM_PROJ,2,Yp,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(ZM_PROJ,1,Zp,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(TM_PROJ,0,Tp,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(XP_PROJ,3,Xm,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(YP_PROJ,2,Ym,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(ZP_PROJ,1,Zm,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(TP_PROJ,0,Tm,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_RESULT(ss,F) - - HAND_DOP_SITE(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); + HAND_STENCIL_LEG(XM_PROJ,3,Xp,XM_RECON); + HAND_STENCIL_LEG(YM_PROJ,2,Yp,YM_RECON_ACCUM); + HAND_STENCIL_LEG(ZM_PROJ,1,Zp,ZM_RECON_ACCUM); + HAND_STENCIL_LEG(TM_PROJ,0,Tp,TM_RECON_ACCUM); + HAND_STENCIL_LEG(XP_PROJ,3,Xm,XP_RECON_ACCUM); + HAND_STENCIL_LEG(YP_PROJ,2,Ym,YP_RECON_ACCUM); + HAND_STENCIL_LEG(ZP_PROJ,1,Zm,ZP_RECON_ACCUM); + HAND_STENCIL_LEG(TP_PROJ,0,Tm,TP_RECON_ACCUM); + HAND_RESULT(ss); } template @@ -612,19 +485,16 @@ void WilsonKernels::HandDhopSiteDag(StencilImpl &st,LebesgueOrder &lo,Doub StencilEntry *SE; int offset,local,perm, ptype; - -#define HAND_DOP_SITE_DAG(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ - HAND_STENCIL_LEG(XP_PROJ,3,Xp,XP_RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(YP_PROJ,2,Yp,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(ZP_PROJ,1,Zp,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(TP_PROJ,0,Tp,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(XM_PROJ,3,Xm,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(YM_PROJ,2,Ym,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(ZM_PROJ,1,Zm,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG(TM_PROJ,0,Tm,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_RESULT(ss,F) - - HAND_DOP_SITE_DAG(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); + + HAND_STENCIL_LEG(XP_PROJ,3,Xp,XP_RECON); + HAND_STENCIL_LEG(YP_PROJ,2,Yp,YP_RECON_ACCUM); + HAND_STENCIL_LEG(ZP_PROJ,1,Zp,ZP_RECON_ACCUM); + HAND_STENCIL_LEG(TP_PROJ,0,Tp,TP_RECON_ACCUM); + HAND_STENCIL_LEG(XM_PROJ,3,Xm,XM_RECON_ACCUM); + HAND_STENCIL_LEG(YM_PROJ,2,Ym,YM_RECON_ACCUM); + HAND_STENCIL_LEG(ZM_PROJ,1,Zm,ZM_RECON_ACCUM); + HAND_STENCIL_LEG(TM_PROJ,0,Tm,TM_RECON_ACCUM); + HAND_RESULT(ss); } template void @@ -639,20 +509,16 @@ WilsonKernels::HandDhopSiteInt(StencilImpl &st,LebesgueOrder &lo,DoubledGa int offset,local,perm, ptype; StencilEntry *SE; - -#define HAND_DOP_SITE_INT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ - ZERO_RESULT; \ - HAND_STENCIL_LEG_INT(XM_PROJ,3,Xp,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(YM_PROJ,2,Yp,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(ZM_PROJ,1,Zp,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(TM_PROJ,0,Tp,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(XP_PROJ,3,Xm,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(YP_PROJ,2,Ym,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(ZP_PROJ,1,Zm,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(TP_PROJ,0,Tm,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_RESULT(ss,F) - - HAND_DOP_SITE_INT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); + ZERO_RESULT; + HAND_STENCIL_LEG_INT(XM_PROJ,3,Xp,XM_RECON_ACCUM); + HAND_STENCIL_LEG_INT(YM_PROJ,2,Yp,YM_RECON_ACCUM); + HAND_STENCIL_LEG_INT(ZM_PROJ,1,Zp,ZM_RECON_ACCUM); + HAND_STENCIL_LEG_INT(TM_PROJ,0,Tp,TM_RECON_ACCUM); + HAND_STENCIL_LEG_INT(XP_PROJ,3,Xm,XP_RECON_ACCUM); + HAND_STENCIL_LEG_INT(YP_PROJ,2,Ym,YP_RECON_ACCUM); + HAND_STENCIL_LEG_INT(ZP_PROJ,1,Zm,ZP_RECON_ACCUM); + HAND_STENCIL_LEG_INT(TP_PROJ,0,Tm,TP_RECON_ACCUM); + HAND_RESULT(ss); } template @@ -666,20 +532,16 @@ void WilsonKernels::HandDhopSiteDagInt(StencilImpl &st,LebesgueOrder &lo,D StencilEntry *SE; int offset,local,perm, ptype; - -#define HAND_DOP_SITE_DAG_INT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ - ZERO_RESULT; \ - HAND_STENCIL_LEG_INT(XP_PROJ,3,Xp,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(YP_PROJ,2,Yp,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(ZP_PROJ,1,Zp,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(TP_PROJ,0,Tp,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(XM_PROJ,3,Xm,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(YM_PROJ,2,Ym,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(ZM_PROJ,1,Zm,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_INT(TM_PROJ,0,Tm,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_RESULT(ss,F) - - HAND_DOP_SITE_DAG_INT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); + ZERO_RESULT; + HAND_STENCIL_LEG_INT(XP_PROJ,3,Xp,XP_RECON_ACCUM); + HAND_STENCIL_LEG_INT(YP_PROJ,2,Yp,YP_RECON_ACCUM); + HAND_STENCIL_LEG_INT(ZP_PROJ,1,Zp,ZP_RECON_ACCUM); + HAND_STENCIL_LEG_INT(TP_PROJ,0,Tp,TP_RECON_ACCUM); + HAND_STENCIL_LEG_INT(XM_PROJ,3,Xm,XM_RECON_ACCUM); + HAND_STENCIL_LEG_INT(YM_PROJ,2,Ym,YM_RECON_ACCUM); + HAND_STENCIL_LEG_INT(ZM_PROJ,1,Zm,ZM_RECON_ACCUM); + HAND_STENCIL_LEG_INT(TM_PROJ,0,Tm,TM_RECON_ACCUM); + HAND_RESULT(ss); } template void @@ -695,20 +557,16 @@ WilsonKernels::HandDhopSiteExt(StencilImpl &st,LebesgueOrder &lo,DoubledGa int offset,local,perm, ptype; StencilEntry *SE; int nmu=0; - -#define HAND_DOP_SITE_EXT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ - ZERO_RESULT; \ - HAND_STENCIL_LEG_EXT(XM_PROJ,3,Xp,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(YM_PROJ,2,Yp,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(ZM_PROJ,1,Zp,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(TM_PROJ,0,Tp,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(XP_PROJ,3,Xm,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(YP_PROJ,2,Ym,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(ZP_PROJ,1,Zm,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(TP_PROJ,0,Tm,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_RESULT_EXT(ss,F) - - HAND_DOP_SITE_EXT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); + ZERO_RESULT; + HAND_STENCIL_LEG_EXT(XM_PROJ,3,Xp,XM_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(YM_PROJ,2,Yp,YM_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(ZM_PROJ,1,Zp,ZM_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(TM_PROJ,0,Tp,TM_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(XP_PROJ,3,Xm,XP_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(YP_PROJ,2,Ym,YP_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(ZP_PROJ,1,Zm,ZP_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(TP_PROJ,0,Tm,TP_RECON_ACCUM); + HAND_RESULT_EXT(ss); } template @@ -723,193 +581,18 @@ void WilsonKernels::HandDhopSiteDagExt(StencilImpl &st,LebesgueOrder &lo,D StencilEntry *SE; int offset,local,perm, ptype; int nmu=0; - -#define HAND_DOP_SITE_DAG_EXT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ - ZERO_RESULT; \ - HAND_STENCIL_LEG_EXT(XP_PROJ,3,Xp,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(YP_PROJ,2,Yp,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(ZP_PROJ,1,Zp,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(TP_PROJ,0,Tp,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(XM_PROJ,3,Xm,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(YM_PROJ,2,Ym,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(ZM_PROJ,1,Zm,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_STENCIL_LEG_EXT(TM_PROJ,0,Tm,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ - HAND_RESULT_EXT(ss,F) - - HAND_DOP_SITE_DAG_EXT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); + ZERO_RESULT; + HAND_STENCIL_LEG_EXT(XP_PROJ,3,Xp,XP_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(YP_PROJ,2,Yp,YP_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(ZP_PROJ,1,Zp,ZP_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(TP_PROJ,0,Tp,TP_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(XM_PROJ,3,Xm,XM_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(YM_PROJ,2,Ym,YM_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(ZM_PROJ,1,Zm,ZM_RECON_ACCUM); + HAND_STENCIL_LEG_EXT(TM_PROJ,0,Tm,TM_RECON_ACCUM); + HAND_RESULT_EXT(ss); } - //////////////////////////////////////////////// - // Specialise Gparity to simple implementation - //////////////////////////////////////////////// -#define HAND_SPECIALISE_EMPTY(IMPL) \ - template<> void \ - WilsonKernels::HandDhopSite(StencilImpl &st, \ - LebesgueOrder &lo, \ - DoubledGaugeField &U, \ - SiteHalfSpinor *buf, \ - int sF,int sU, \ - const FermionField &in, \ - FermionField &out){ assert(0); } \ - template<> void \ - WilsonKernels::HandDhopSiteDag(StencilImpl &st, \ - LebesgueOrder &lo, \ - DoubledGaugeField &U, \ - SiteHalfSpinor *buf, \ - int sF,int sU, \ - const FermionField &in, \ - FermionField &out){ assert(0); } \ - template<> void \ - WilsonKernels::HandDhopSiteInt(StencilImpl &st, \ - LebesgueOrder &lo, \ - DoubledGaugeField &U, \ - SiteHalfSpinor *buf, \ - int sF,int sU, \ - const FermionField &in, \ - FermionField &out){ assert(0); } \ - template<> void \ - WilsonKernels::HandDhopSiteExt(StencilImpl &st, \ - LebesgueOrder &lo, \ - DoubledGaugeField &U, \ - SiteHalfSpinor *buf, \ - int sF,int sU, \ - const FermionField &in, \ - FermionField &out){ assert(0); } \ - template<> void \ - WilsonKernels::HandDhopSiteDagInt(StencilImpl &st, \ - LebesgueOrder &lo, \ - DoubledGaugeField &U, \ - SiteHalfSpinor *buf, \ - int sF,int sU, \ - const FermionField &in, \ - FermionField &out){ assert(0); } \ - template<> void \ - WilsonKernels::HandDhopSiteDagExt(StencilImpl &st, \ - LebesgueOrder &lo, \ - DoubledGaugeField &U, \ - SiteHalfSpinor *buf, \ - int sF,int sU, \ - const FermionField &in, \ - FermionField &out){ assert(0); } \ - - - -#define HAND_SPECIALISE_GPARITY(IMPL) \ - template<> void \ - WilsonKernels::HandDhopSite(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ - int ss,int sU,const FermionField &in, FermionField &out) \ - { \ - typedef IMPL Impl; \ - typedef typename Simd::scalar_type S; \ - typedef typename Simd::vector_type V; \ - \ - HAND_DECLARATIONS(ignore); \ - \ - int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ - StencilEntry *SE; \ - HAND_DOP_SITE(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - HAND_DOP_SITE(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - } \ - \ - template<> \ - void WilsonKernels::HandDhopSiteDag(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ - int ss,int sU,const FermionField &in, FermionField &out) \ - { \ - typedef IMPL Impl; \ - typedef typename Simd::scalar_type S; \ - typedef typename Simd::vector_type V; \ - \ - HAND_DECLARATIONS(ignore); \ - \ - StencilEntry *SE; \ - int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ - HAND_DOP_SITE_DAG(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - HAND_DOP_SITE_DAG(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - } \ - \ - template<> void \ - WilsonKernels::HandDhopSiteInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ - int ss,int sU,const FermionField &in, FermionField &out) \ - { \ - typedef IMPL Impl; \ - typedef typename Simd::scalar_type S; \ - typedef typename Simd::vector_type V; \ - \ - HAND_DECLARATIONS(ignore); \ - \ - int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ - StencilEntry *SE; \ - HAND_DOP_SITE_INT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - HAND_DOP_SITE_INT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - } \ - \ - template<> \ - void WilsonKernels::HandDhopSiteDagInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ - int ss,int sU,const FermionField &in, FermionField &out) \ - { \ - typedef IMPL Impl; \ - typedef typename Simd::scalar_type S; \ - typedef typename Simd::vector_type V; \ - \ - HAND_DECLARATIONS(ignore); \ - \ - StencilEntry *SE; \ - int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ - HAND_DOP_SITE_DAG_INT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - HAND_DOP_SITE_DAG_INT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - } \ - \ - template<> void \ - WilsonKernels::HandDhopSiteExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ - int ss,int sU,const FermionField &in, FermionField &out) \ - { \ - typedef IMPL Impl; \ - typedef typename Simd::scalar_type S; \ - typedef typename Simd::vector_type V; \ - \ - HAND_DECLARATIONS(ignore); \ - \ - int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ - StencilEntry *SE; \ - int nmu=0; \ - HAND_DOP_SITE_EXT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - nmu = 0; \ - HAND_DOP_SITE_EXT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - } \ - template<> \ - void WilsonKernels::HandDhopSiteDagExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ - int ss,int sU,const FermionField &in, FermionField &out) \ - { \ - typedef IMPL Impl; \ - typedef typename Simd::scalar_type S; \ - typedef typename Simd::vector_type V; \ - \ - HAND_DECLARATIONS(ignore); \ - \ - StencilEntry *SE; \ - int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ - int nmu=0; \ - HAND_DOP_SITE_DAG_EXT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - nmu = 0; \ - HAND_DOP_SITE_DAG_EXT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ - } - - -HAND_SPECIALISE_GPARITY(GparityWilsonImplF); -HAND_SPECIALISE_GPARITY(GparityWilsonImplD); -HAND_SPECIALISE_GPARITY(GparityWilsonImplFH); -HAND_SPECIALISE_GPARITY(GparityWilsonImplDF); - - - - - - - - - - - ////////////// Wilson ; uses this implementation ///////////////////// #define INSTANTIATE_THEM(A) \ @@ -930,8 +613,6 @@ INSTANTIATE_THEM(WilsonImplF); INSTANTIATE_THEM(WilsonImplD); INSTANTIATE_THEM(ZWilsonImplF); INSTANTIATE_THEM(ZWilsonImplD); -INSTANTIATE_THEM(GparityWilsonImplF); -INSTANTIATE_THEM(GparityWilsonImplD); INSTANTIATE_THEM(DomainWallVec5dImplF); INSTANTIATE_THEM(DomainWallVec5dImplD); INSTANTIATE_THEM(ZDomainWallVec5dImplF); @@ -940,12 +621,11 @@ INSTANTIATE_THEM(WilsonImplFH); INSTANTIATE_THEM(WilsonImplDF); INSTANTIATE_THEM(ZWilsonImplFH); INSTANTIATE_THEM(ZWilsonImplDF); -INSTANTIATE_THEM(GparityWilsonImplFH); -INSTANTIATE_THEM(GparityWilsonImplDF); INSTANTIATE_THEM(DomainWallVec5dImplFH); INSTANTIATE_THEM(DomainWallVec5dImplDF); INSTANTIATE_THEM(ZDomainWallVec5dImplFH); INSTANTIATE_THEM(ZDomainWallVec5dImplDF); INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplF); INSTANTIATE_THEM(WilsonTwoIndexAntiSymmetricImplD); + }} From 6f6c5c549a407441007e76a3f41c86bd0f3bf139 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 2 May 2018 14:11:23 +0100 Subject: [PATCH 321/620] Split off gparity --- .../fermion/WilsonKernelsHandGparity.cc | 878 ++++++++++++++++++ 1 file changed, 878 insertions(+) create mode 100644 lib/qcd/action/fermion/WilsonKernelsHandGparity.cc diff --git a/lib/qcd/action/fermion/WilsonKernelsHandGparity.cc b/lib/qcd/action/fermion/WilsonKernelsHandGparity.cc new file mode 100644 index 00000000..3bf2f10a --- /dev/null +++ b/lib/qcd/action/fermion/WilsonKernelsHandGparity.cc @@ -0,0 +1,878 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./lib/qcd/action/fermion/WilsonKernelsHand.cc + + Copyright (C) 2015 + +Author: Peter Boyle +Author: paboyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include + +#define REGISTER + +#define LOAD_CHIMU_BODY(F) \ + Chimu_00=ref(F)(0)(0); \ + Chimu_01=ref(F)(0)(1); \ + Chimu_02=ref(F)(0)(2); \ + Chimu_10=ref(F)(1)(0); \ + Chimu_11=ref(F)(1)(1); \ + Chimu_12=ref(F)(1)(2); \ + Chimu_20=ref(F)(2)(0); \ + Chimu_21=ref(F)(2)(1); \ + Chimu_22=ref(F)(2)(2); \ + Chimu_30=ref(F)(3)(0); \ + Chimu_31=ref(F)(3)(1); \ + Chimu_32=ref(F)(3)(2) + +#define LOAD_CHIMU(DIR,F,PERM) \ + { const SiteSpinor & ref (in._odata[offset]); LOAD_CHIMU_BODY(F); } + +#define LOAD_CHI_BODY(F) \ + Chi_00 = ref(F)(0)(0);\ + Chi_01 = ref(F)(0)(1);\ + Chi_02 = ref(F)(0)(2);\ + Chi_10 = ref(F)(1)(0);\ + Chi_11 = ref(F)(1)(1);\ + Chi_12 = ref(F)(1)(2) + +#define LOAD_CHI(DIR,F,PERM) \ + {const SiteHalfSpinor &ref(buf[offset]); LOAD_CHI_BODY(F); } + + +//G-parity implementations using in-place intrinsic ops + +//1l 1h -> 1h 1l +//0l 0h , 1h 1l -> 0l 1h 0h,1l +//0h,1l -> 1l,0h +//if( (distance == 1 && !perm_will_occur) || (distance == -1 && perm_will_occur) ) +//Pulled fermion through forwards face, GPBC on upper component +//Need 0= 0l 1h 1= 1l 0h +//else if( (distance == -1 && !perm) || (distance == 1 && perm) ) +//Pulled fermion through backwards face, GPBC on lower component +//Need 0= 1l 0h 1= 0l 1h + +//1l 1h -> 1h 1l +//0l 0h , 1h 1l -> 0l 1h 0h,1l +#define DO_TWIST_0L_1H(INTO,S,C,F, PERM, tmp1, tmp2, tmp3) \ + permute##PERM(tmp1, ref(1)(S)(C)); \ + exchange##PERM(tmp2,tmp3, ref(0)(S)(C), tmp1); \ + INTO = tmp2; + +//0l 0h -> 0h 0l +//1l 1h, 0h 0l -> 1l 0h, 1h 0l +#define DO_TWIST_1L_0H(INTO,S,C,F, PERM, tmp1, tmp2, tmp3) \ + permute##PERM(tmp1, ref(0)(S)(C)); \ + exchange##PERM(tmp2,tmp3, ref(1)(S)(C), tmp1); \ + INTO = tmp2; + + + + +#define LOAD_CHI_SETUP(DIR,F) \ + g = F; \ + direction = st._directions[DIR]; \ + distance = st._distances[DIR]; \ + sl = st._grid->_simd_layout[direction]; \ + inplace_twist = 0; \ + if(SE->_around_the_world && this->Params.twists[DIR % 4]){ \ + if(sl == 1){ \ + g = (F+1) % 2; \ + }else{ \ + inplace_twist = 1; \ + } \ + } + +#define LOAD_CHIMU_GPARITY_INPLACE_TWIST(DIR,F,PERM) \ + { const SiteSpinor &ref(in._odata[offset]); \ + LOAD_CHI_SETUP(DIR,F); \ + if(!inplace_twist){ \ + LOAD_CHIMU_BODY(g); \ + }else{ \ + if( ( F==0 && ((distance == 1 && !perm) || (distance == -1 && perm)) ) || \ + ( F==1 && ((distance == -1 && !perm) || (distance == 1 && perm)) ) ){ \ + DO_TWIST_0L_1H(Chimu_00,0,0,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chimu_01,0,1,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_0L_1H(Chimu_02,0,2,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chimu_10,1,0,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_0L_1H(Chimu_11,1,1,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chimu_12,1,2,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_0L_1H(Chimu_20,2,0,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chimu_21,2,1,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_0L_1H(Chimu_22,2,2,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chimu_30,3,0,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_0L_1H(Chimu_31,3,1,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chimu_32,3,2,F,PERM, U_11,U_20,U_21); \ + }else{ \ + DO_TWIST_1L_0H(Chimu_00,0,0,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chimu_01,0,1,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_1L_0H(Chimu_02,0,2,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chimu_10,1,0,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_1L_0H(Chimu_11,1,1,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chimu_12,1,2,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_1L_0H(Chimu_20,2,0,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chimu_21,2,1,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_1L_0H(Chimu_22,2,2,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chimu_30,3,0,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_1L_0H(Chimu_31,3,1,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chimu_32,3,2,F,PERM, U_11,U_20,U_21); \ + } \ + } \ + } + + +#define LOAD_CHI_GPARITY_INPLACE_TWIST(DIR,F,PERM) \ + { const SiteHalfSpinor &ref(buf[offset]); \ + LOAD_CHI_SETUP(DIR,F); \ + if(!inplace_twist){ \ + LOAD_CHI_BODY(g); \ + }else{ \ + if( ( F==0 && ((distance == 1 && !perm) || (distance == -1 && perm)) ) || \ + ( F==1 && ((distance == -1 && !perm) || (distance == 1 && perm)) ) ){ \ + DO_TWIST_0L_1H(Chi_00,0,0,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chi_01,0,1,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_0L_1H(Chi_02,0,2,F,PERM, UChi_00,UChi_01,UChi_02); \ + DO_TWIST_0L_1H(Chi_10,1,0,F,PERM, UChi_10,UChi_11,UChi_12); \ + DO_TWIST_0L_1H(Chi_11,1,1,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_0L_1H(Chi_12,1,2,F,PERM, U_11,U_20,U_21); \ + }else{ \ + DO_TWIST_1L_0H(Chi_00,0,0,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chi_01,0,1,F,PERM, U_11,U_20,U_21); \ + DO_TWIST_1L_0H(Chi_02,0,2,F,PERM, UChi_00,UChi_01,UChi_02); \ + DO_TWIST_1L_0H(Chi_10,1,0,F,PERM, UChi_10,UChi_11,UChi_12); \ + DO_TWIST_1L_0H(Chi_11,1,1,F,PERM, U_00,U_01,U_10); \ + DO_TWIST_1L_0H(Chi_12,1,2,F,PERM, U_11,U_20,U_21); \ + } \ + } \ + } + + +#define LOAD_CHI_GPARITY(DIR,F,PERM) LOAD_CHI_GPARITY_INPLACE_TWIST(DIR,F,PERM) +#define LOAD_CHIMU_GPARITY(DIR,F,PERM) LOAD_CHIMU_GPARITY_INPLACE_TWIST(DIR,F,PERM) + +// To splat or not to splat depends on the implementation +#define MULT_2SPIN_BODY \ + Impl::loadLinkElement(U_00,ref()(0,0)); \ + Impl::loadLinkElement(U_10,ref()(1,0)); \ + Impl::loadLinkElement(U_20,ref()(2,0)); \ + Impl::loadLinkElement(U_01,ref()(0,1)); \ + Impl::loadLinkElement(U_11,ref()(1,1)); \ + Impl::loadLinkElement(U_21,ref()(2,1)); \ + UChi_00 = U_00*Chi_00; \ + UChi_10 = U_00*Chi_10; \ + UChi_01 = U_10*Chi_00; \ + UChi_11 = U_10*Chi_10; \ + UChi_02 = U_20*Chi_00; \ + UChi_12 = U_20*Chi_10; \ + UChi_00+= U_01*Chi_01; \ + UChi_10+= U_01*Chi_11; \ + UChi_01+= U_11*Chi_01; \ + UChi_11+= U_11*Chi_11; \ + UChi_02+= U_21*Chi_01; \ + UChi_12+= U_21*Chi_11; \ + Impl::loadLinkElement(U_00,ref()(0,2)); \ + Impl::loadLinkElement(U_10,ref()(1,2)); \ + Impl::loadLinkElement(U_20,ref()(2,2)); \ + UChi_00+= U_00*Chi_02; \ + UChi_10+= U_00*Chi_12; \ + UChi_01+= U_10*Chi_02; \ + UChi_11+= U_10*Chi_12; \ + UChi_02+= U_20*Chi_02; \ + UChi_12+= U_20*Chi_12 + + +#define MULT_2SPIN(A,F) \ + {auto & ref(U._odata[sU](A)); MULT_2SPIN_BODY; } + +#define MULT_2SPIN_GPARITY(A,F) \ + {auto & ref(U._odata[sU](F)(A)); MULT_2SPIN_BODY; } + + +#define PERMUTE_DIR(dir) \ + permute##dir(Chi_00,Chi_00);\ + permute##dir(Chi_01,Chi_01);\ + permute##dir(Chi_02,Chi_02);\ + permute##dir(Chi_10,Chi_10);\ + permute##dir(Chi_11,Chi_11);\ + permute##dir(Chi_12,Chi_12); + +// hspin(0)=fspin(0)+timesI(fspin(3)); +// hspin(1)=fspin(1)+timesI(fspin(2)); +#define XP_PROJ \ + Chi_00 = Chimu_00+timesI(Chimu_30);\ + Chi_01 = Chimu_01+timesI(Chimu_31);\ + Chi_02 = Chimu_02+timesI(Chimu_32);\ + Chi_10 = Chimu_10+timesI(Chimu_20);\ + Chi_11 = Chimu_11+timesI(Chimu_21);\ + Chi_12 = Chimu_12+timesI(Chimu_22); + +#define YP_PROJ \ + Chi_00 = Chimu_00-Chimu_30;\ + Chi_01 = Chimu_01-Chimu_31;\ + Chi_02 = Chimu_02-Chimu_32;\ + Chi_10 = Chimu_10+Chimu_20;\ + Chi_11 = Chimu_11+Chimu_21;\ + Chi_12 = Chimu_12+Chimu_22; + +#define ZP_PROJ \ + Chi_00 = Chimu_00+timesI(Chimu_20); \ + Chi_01 = Chimu_01+timesI(Chimu_21); \ + Chi_02 = Chimu_02+timesI(Chimu_22); \ + Chi_10 = Chimu_10-timesI(Chimu_30); \ + Chi_11 = Chimu_11-timesI(Chimu_31); \ + Chi_12 = Chimu_12-timesI(Chimu_32); + +#define TP_PROJ \ + Chi_00 = Chimu_00+Chimu_20; \ + Chi_01 = Chimu_01+Chimu_21; \ + Chi_02 = Chimu_02+Chimu_22; \ + Chi_10 = Chimu_10+Chimu_30; \ + Chi_11 = Chimu_11+Chimu_31; \ + Chi_12 = Chimu_12+Chimu_32; + + +// hspin(0)=fspin(0)-timesI(fspin(3)); +// hspin(1)=fspin(1)-timesI(fspin(2)); +#define XM_PROJ \ + Chi_00 = Chimu_00-timesI(Chimu_30);\ + Chi_01 = Chimu_01-timesI(Chimu_31);\ + Chi_02 = Chimu_02-timesI(Chimu_32);\ + Chi_10 = Chimu_10-timesI(Chimu_20);\ + Chi_11 = Chimu_11-timesI(Chimu_21);\ + Chi_12 = Chimu_12-timesI(Chimu_22); + +#define YM_PROJ \ + Chi_00 = Chimu_00+Chimu_30;\ + Chi_01 = Chimu_01+Chimu_31;\ + Chi_02 = Chimu_02+Chimu_32;\ + Chi_10 = Chimu_10-Chimu_20;\ + Chi_11 = Chimu_11-Chimu_21;\ + Chi_12 = Chimu_12-Chimu_22; + +#define ZM_PROJ \ + Chi_00 = Chimu_00-timesI(Chimu_20); \ + Chi_01 = Chimu_01-timesI(Chimu_21); \ + Chi_02 = Chimu_02-timesI(Chimu_22); \ + Chi_10 = Chimu_10+timesI(Chimu_30); \ + Chi_11 = Chimu_11+timesI(Chimu_31); \ + Chi_12 = Chimu_12+timesI(Chimu_32); + +#define TM_PROJ \ + Chi_00 = Chimu_00-Chimu_20; \ + Chi_01 = Chimu_01-Chimu_21; \ + Chi_02 = Chimu_02-Chimu_22; \ + Chi_10 = Chimu_10-Chimu_30; \ + Chi_11 = Chimu_11-Chimu_31; \ + Chi_12 = Chimu_12-Chimu_32; + +// fspin(0)=hspin(0); +// fspin(1)=hspin(1); +// fspin(2)=timesMinusI(hspin(1)); +// fspin(3)=timesMinusI(hspin(0)); +#define XP_RECON\ + result_00 = UChi_00;\ + result_01 = UChi_01;\ + result_02 = UChi_02;\ + result_10 = UChi_10;\ + result_11 = UChi_11;\ + result_12 = UChi_12;\ + result_20 = timesMinusI(UChi_10);\ + result_21 = timesMinusI(UChi_11);\ + result_22 = timesMinusI(UChi_12);\ + result_30 = timesMinusI(UChi_00);\ + result_31 = timesMinusI(UChi_01);\ + result_32 = timesMinusI(UChi_02); + +#define XP_RECON_ACCUM\ + result_00+=UChi_00;\ + result_01+=UChi_01;\ + result_02+=UChi_02;\ + result_10+=UChi_10;\ + result_11+=UChi_11;\ + result_12+=UChi_12;\ + result_20-=timesI(UChi_10);\ + result_21-=timesI(UChi_11);\ + result_22-=timesI(UChi_12);\ + result_30-=timesI(UChi_00);\ + result_31-=timesI(UChi_01);\ + result_32-=timesI(UChi_02); + +#define XM_RECON\ + result_00 = UChi_00;\ + result_01 = UChi_01;\ + result_02 = UChi_02;\ + result_10 = UChi_10;\ + result_11 = UChi_11;\ + result_12 = UChi_12;\ + result_20 = timesI(UChi_10);\ + result_21 = timesI(UChi_11);\ + result_22 = timesI(UChi_12);\ + result_30 = timesI(UChi_00);\ + result_31 = timesI(UChi_01);\ + result_32 = timesI(UChi_02); + +#define XM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= timesI(UChi_10);\ + result_21+= timesI(UChi_11);\ + result_22+= timesI(UChi_12);\ + result_30+= timesI(UChi_00);\ + result_31+= timesI(UChi_01);\ + result_32+= timesI(UChi_02); + +#define YP_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= UChi_10;\ + result_21+= UChi_11;\ + result_22+= UChi_12;\ + result_30-= UChi_00;\ + result_31-= UChi_01;\ + result_32-= UChi_02; + +#define YM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20-= UChi_10;\ + result_21-= UChi_11;\ + result_22-= UChi_12;\ + result_30+= UChi_00;\ + result_31+= UChi_01;\ + result_32+= UChi_02; + +#define ZP_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20-= timesI(UChi_00); \ + result_21-= timesI(UChi_01); \ + result_22-= timesI(UChi_02); \ + result_30+= timesI(UChi_10); \ + result_31+= timesI(UChi_11); \ + result_32+= timesI(UChi_12); + +#define ZM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= timesI(UChi_00); \ + result_21+= timesI(UChi_01); \ + result_22+= timesI(UChi_02); \ + result_30-= timesI(UChi_10); \ + result_31-= timesI(UChi_11); \ + result_32-= timesI(UChi_12); + +#define TP_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= UChi_00; \ + result_21+= UChi_01; \ + result_22+= UChi_02; \ + result_30+= UChi_10; \ + result_31+= UChi_11; \ + result_32+= UChi_12; + +#define TM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20-= UChi_00; \ + result_21-= UChi_01; \ + result_22-= UChi_02; \ + result_30-= UChi_10; \ + result_31-= UChi_11; \ + result_32-= UChi_12; + +#define HAND_STENCIL_LEG(PROJ,PERM,DIR,RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + SE=st.GetEntry(ptype,DIR,ss); \ + offset = SE->_offset; \ + local = SE->_is_local; \ + perm = SE->_permute; \ + if ( local ) { \ + LOAD_CHIMU_IMPL(DIR,F,PERM); \ + PROJ; \ + if ( perm) { \ + PERMUTE_DIR(PERM); \ + } \ + } else { \ + LOAD_CHI_IMPL(DIR,F,PERM); \ + } \ + MULT_2SPIN_IMPL(DIR,F); \ + RECON; + + +#define HAND_STENCIL_LEG_INT(PROJ,PERM,DIR,RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + SE=st.GetEntry(ptype,DIR,ss); \ + offset = SE->_offset; \ + local = SE->_is_local; \ + perm = SE->_permute; \ + if ( local ) { \ + LOAD_CHIMU_IMPL(DIR,F,PERM); \ + PROJ; \ + if ( perm) { \ + PERMUTE_DIR(PERM); \ + } \ + } else if ( st.same_node[DIR] ) { \ + LOAD_CHI_IMPL(DIR,F,PERM); \ + } \ + if (local || st.same_node[DIR] ) { \ + MULT_2SPIN_IMPL(DIR,F); \ + RECON; \ + } + +#define HAND_STENCIL_LEG_EXT(PROJ,PERM,DIR,RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + SE=st.GetEntry(ptype,DIR,ss); \ + offset = SE->_offset; \ + local = SE->_is_local; \ + perm = SE->_permute; \ + if((!SE->_is_local)&&(!st.same_node[DIR]) ) { \ + LOAD_CHI_IMPL(DIR,F,PERM); \ + MULT_2SPIN_IMPL(DIR,F); \ + RECON; \ + nmu++; \ + } + +#define HAND_RESULT(ss,F) \ + { \ + SiteSpinor & ref (out._odata[ss]); \ + vstream(ref(F)(0)(0),result_00); \ + vstream(ref(F)(0)(1),result_01); \ + vstream(ref(F)(0)(2),result_02); \ + vstream(ref(F)(1)(0),result_10); \ + vstream(ref(F)(1)(1),result_11); \ + vstream(ref(F)(1)(2),result_12); \ + vstream(ref(F)(2)(0),result_20); \ + vstream(ref(F)(2)(1),result_21); \ + vstream(ref(F)(2)(2),result_22); \ + vstream(ref(F)(3)(0),result_30); \ + vstream(ref(F)(3)(1),result_31); \ + vstream(ref(F)(3)(2),result_32); \ + } + +#define HAND_RESULT_EXT(ss,F) \ + if (nmu){ \ + SiteSpinor & ref (out._odata[ss]); \ + ref(F)(0)(0)+=result_00; \ + ref(F)(0)(1)+=result_01; \ + ref(F)(0)(2)+=result_02; \ + ref(F)(1)(0)+=result_10; \ + ref(F)(1)(1)+=result_11; \ + ref(F)(1)(2)+=result_12; \ + ref(F)(2)(0)+=result_20; \ + ref(F)(2)(1)+=result_21; \ + ref(F)(2)(2)+=result_22; \ + ref(F)(3)(0)+=result_30; \ + ref(F)(3)(1)+=result_31; \ + ref(F)(3)(2)+=result_32; \ + } + + +#define HAND_DECLARATIONS(a) \ + Simd result_00; \ + Simd result_01; \ + Simd result_02; \ + Simd result_10; \ + Simd result_11; \ + Simd result_12; \ + Simd result_20; \ + Simd result_21; \ + Simd result_22; \ + Simd result_30; \ + Simd result_31; \ + Simd result_32; \ + Simd Chi_00; \ + Simd Chi_01; \ + Simd Chi_02; \ + Simd Chi_10; \ + Simd Chi_11; \ + Simd Chi_12; \ + Simd UChi_00; \ + Simd UChi_01; \ + Simd UChi_02; \ + Simd UChi_10; \ + Simd UChi_11; \ + Simd UChi_12; \ + Simd U_00; \ + Simd U_10; \ + Simd U_20; \ + Simd U_01; \ + Simd U_11; \ + Simd U_21; + +#define ZERO_RESULT \ + result_00=zero; \ + result_01=zero; \ + result_02=zero; \ + result_10=zero; \ + result_11=zero; \ + result_12=zero; \ + result_20=zero; \ + result_21=zero; \ + result_22=zero; \ + result_30=zero; \ + result_31=zero; \ + result_32=zero; + +#define Chimu_00 Chi_00 +#define Chimu_01 Chi_01 +#define Chimu_02 Chi_02 +#define Chimu_10 Chi_10 +#define Chimu_11 Chi_11 +#define Chimu_12 Chi_12 +#define Chimu_20 UChi_00 +#define Chimu_21 UChi_01 +#define Chimu_22 UChi_02 +#define Chimu_30 UChi_10 +#define Chimu_31 UChi_11 +#define Chimu_32 UChi_12 + +namespace Grid { +namespace QCD { + +template void +WilsonKernels::HandDhopSite(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, + int ss,int sU,const FermionField &in, FermionField &out) +{ +// T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + HAND_DECLARATIONS(ignore); + + int offset,local,perm, ptype; + StencilEntry *SE; + +#define HAND_DOP_SITE(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + HAND_STENCIL_LEG(XM_PROJ,3,Xp,XM_RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(YM_PROJ,2,Yp,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(ZM_PROJ,1,Zp,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(TM_PROJ,0,Tp,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(XP_PROJ,3,Xm,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(YP_PROJ,2,Ym,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(ZP_PROJ,1,Zm,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(TP_PROJ,0,Tm,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_RESULT(ss,F) + + HAND_DOP_SITE(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); +} + +template +void WilsonKernels::HandDhopSiteDag(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, + int ss,int sU,const FermionField &in, FermionField &out) +{ + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + HAND_DECLARATIONS(ignore); + + StencilEntry *SE; + int offset,local,perm, ptype; + +#define HAND_DOP_SITE_DAG(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + HAND_STENCIL_LEG(XP_PROJ,3,Xp,XP_RECON,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(YP_PROJ,2,Yp,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(ZP_PROJ,1,Zp,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(TP_PROJ,0,Tp,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(XM_PROJ,3,Xm,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(YM_PROJ,2,Ym,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(ZM_PROJ,1,Zm,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG(TM_PROJ,0,Tm,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_RESULT(ss,F) + + HAND_DOP_SITE_DAG(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); +} + +template void +WilsonKernels::HandDhopSiteInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, + int ss,int sU,const FermionField &in, FermionField &out) +{ +// T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + HAND_DECLARATIONS(ignore); + + int offset,local,perm, ptype; + StencilEntry *SE; + +#define HAND_DOP_SITE_INT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + ZERO_RESULT; \ + HAND_STENCIL_LEG_INT(XM_PROJ,3,Xp,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(YM_PROJ,2,Yp,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(ZM_PROJ,1,Zp,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(TM_PROJ,0,Tp,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(XP_PROJ,3,Xm,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(YP_PROJ,2,Ym,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(ZP_PROJ,1,Zm,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(TP_PROJ,0,Tm,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_RESULT(ss,F) + + HAND_DOP_SITE_INT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); +} + +template +void WilsonKernels::HandDhopSiteDagInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, + int ss,int sU,const FermionField &in, FermionField &out) +{ + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + HAND_DECLARATIONS(ignore); + + StencilEntry *SE; + int offset,local,perm, ptype; + +#define HAND_DOP_SITE_DAG_INT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + ZERO_RESULT; \ + HAND_STENCIL_LEG_INT(XP_PROJ,3,Xp,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(YP_PROJ,2,Yp,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(ZP_PROJ,1,Zp,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(TP_PROJ,0,Tp,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(XM_PROJ,3,Xm,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(YM_PROJ,2,Ym,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(ZM_PROJ,1,Zm,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_INT(TM_PROJ,0,Tm,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_RESULT(ss,F) + + HAND_DOP_SITE_DAG_INT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); +} + +template void +WilsonKernels::HandDhopSiteExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, + int ss,int sU,const FermionField &in, FermionField &out) +{ +// T==0, Z==1, Y==2, Z==3 expect 1,2,2,2 simd layout etc... + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + HAND_DECLARATIONS(ignore); + + int offset,local,perm, ptype; + StencilEntry *SE; + int nmu=0; + +#define HAND_DOP_SITE_EXT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + ZERO_RESULT; \ + HAND_STENCIL_LEG_EXT(XM_PROJ,3,Xp,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(YM_PROJ,2,Yp,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(ZM_PROJ,1,Zp,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(TM_PROJ,0,Tp,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(XP_PROJ,3,Xm,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(YP_PROJ,2,Ym,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(ZP_PROJ,1,Zm,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(TP_PROJ,0,Tm,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_RESULT_EXT(ss,F) + + HAND_DOP_SITE_EXT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); +} + +template +void WilsonKernels::HandDhopSiteDagExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, + int ss,int sU,const FermionField &in, FermionField &out) +{ + typedef typename Simd::scalar_type S; + typedef typename Simd::vector_type V; + + HAND_DECLARATIONS(ignore); + + StencilEntry *SE; + int offset,local,perm, ptype; + int nmu=0; + +#define HAND_DOP_SITE_DAG_EXT(F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL) \ + ZERO_RESULT; \ + HAND_STENCIL_LEG_EXT(XP_PROJ,3,Xp,XP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(YP_PROJ,2,Yp,YP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(ZP_PROJ,1,Zp,ZP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(TP_PROJ,0,Tp,TP_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(XM_PROJ,3,Xm,XM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(YM_PROJ,2,Ym,YM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(ZM_PROJ,1,Zm,ZM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_STENCIL_LEG_EXT(TM_PROJ,0,Tm,TM_RECON_ACCUM,F,LOAD_CHI_IMPL,LOAD_CHIMU_IMPL,MULT_2SPIN_IMPL); \ + HAND_RESULT_EXT(ss,F) + + HAND_DOP_SITE_DAG_EXT(, LOAD_CHI,LOAD_CHIMU,MULT_2SPIN); +} + +#define HAND_SPECIALISE_GPARITY(IMPL) \ + template<> void \ + WilsonKernels::HandDhopSite(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out) \ + { \ + typedef IMPL Impl; \ + typedef typename Simd::scalar_type S; \ + typedef typename Simd::vector_type V; \ + \ + HAND_DECLARATIONS(ignore); \ + \ + int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ + StencilEntry *SE; \ + HAND_DOP_SITE(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + HAND_DOP_SITE(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + } \ + \ + template<> \ + void WilsonKernels::HandDhopSiteDag(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out) \ + { \ + typedef IMPL Impl; \ + typedef typename Simd::scalar_type S; \ + typedef typename Simd::vector_type V; \ + \ + HAND_DECLARATIONS(ignore); \ + \ + StencilEntry *SE; \ + int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ + HAND_DOP_SITE_DAG(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + HAND_DOP_SITE_DAG(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + } \ + \ + template<> void \ + WilsonKernels::HandDhopSiteInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out) \ + { \ + typedef IMPL Impl; \ + typedef typename Simd::scalar_type S; \ + typedef typename Simd::vector_type V; \ + \ + HAND_DECLARATIONS(ignore); \ + \ + int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ + StencilEntry *SE; \ + HAND_DOP_SITE_INT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + HAND_DOP_SITE_INT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + } \ + \ + template<> \ + void WilsonKernels::HandDhopSiteDagInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out) \ + { \ + typedef IMPL Impl; \ + typedef typename Simd::scalar_type S; \ + typedef typename Simd::vector_type V; \ + \ + HAND_DECLARATIONS(ignore); \ + \ + StencilEntry *SE; \ + int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ + HAND_DOP_SITE_DAG_INT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + HAND_DOP_SITE_DAG_INT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + } \ + \ + template<> void \ + WilsonKernels::HandDhopSiteExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out) \ + { \ + typedef IMPL Impl; \ + typedef typename Simd::scalar_type S; \ + typedef typename Simd::vector_type V; \ + \ + HAND_DECLARATIONS(ignore); \ + \ + int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ + StencilEntry *SE; \ + int nmu=0; \ + HAND_DOP_SITE_EXT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + nmu = 0; \ + HAND_DOP_SITE_EXT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + } \ + template<> \ + void WilsonKernels::HandDhopSiteDagExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out) \ + { \ + typedef IMPL Impl; \ + typedef typename Simd::scalar_type S; \ + typedef typename Simd::vector_type V; \ + \ + HAND_DECLARATIONS(ignore); \ + \ + StencilEntry *SE; \ + int offset,local,perm, ptype, g, direction, distance, sl, inplace_twist; \ + int nmu=0; \ + HAND_DOP_SITE_DAG_EXT(0, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + nmu = 0; \ + HAND_DOP_SITE_DAG_EXT(1, LOAD_CHI_GPARITY,LOAD_CHIMU_GPARITY,MULT_2SPIN_GPARITY); \ + } + + +HAND_SPECIALISE_GPARITY(GparityWilsonImplF); +HAND_SPECIALISE_GPARITY(GparityWilsonImplD); +HAND_SPECIALISE_GPARITY(GparityWilsonImplFH); +HAND_SPECIALISE_GPARITY(GparityWilsonImplDF); + + + + + + + + + + + +////////////// Wilson ; uses this implementation ///////////////////// + +#define INSTANTIATE_THEM(A) \ +template void WilsonKernels::HandDhopSite(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf,\ + int ss,int sU,const FermionField &in, FermionField &out); \ +template void WilsonKernels::HandDhopSiteDag(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out);\ +template void WilsonKernels::HandDhopSiteInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf,\ + int ss,int sU,const FermionField &in, FermionField &out); \ +template void WilsonKernels::HandDhopSiteDagInt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out); \ +template void WilsonKernels::HandDhopSiteExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf,\ + int ss,int sU,const FermionField &in, FermionField &out); \ +template void WilsonKernels::HandDhopSiteDagExt(StencilImpl &st,LebesgueOrder &lo,DoubledGaugeField &U,SiteHalfSpinor *buf, \ + int ss,int sU,const FermionField &in, FermionField &out); + +INSTANTIATE_THEM(GparityWilsonImplF); +INSTANTIATE_THEM(GparityWilsonImplD); +INSTANTIATE_THEM(GparityWilsonImplFH); +INSTANTIATE_THEM(GparityWilsonImplDF); +}} From 441ad7498dcec9d88ec8d38c405fa8c8de5260af Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Wed, 2 May 2018 14:21:30 +0100 Subject: [PATCH 322/620] add Iterative counter --- lib/algorithms/iterative/ConjugateGradientMultiShift.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/algorithms/iterative/ConjugateGradientMultiShift.h b/lib/algorithms/iterative/ConjugateGradientMultiShift.h index a9ccfd2c..1ad79856 100644 --- a/lib/algorithms/iterative/ConjugateGradientMultiShift.h +++ b/lib/algorithms/iterative/ConjugateGradientMultiShift.h @@ -43,6 +43,7 @@ namespace Grid { public: RealD Tolerance; Integer MaxIterations; + Integer IterationsToComplete; //Number of iterations the CG took to finish. Filled in upon completion int verbose; MultiShiftFunction shifts; @@ -269,6 +270,9 @@ void operator() (LinearOperatorBase &Linop, const Field &src, std::vector RealD cn = norm2(src); std::cout< Date: Wed, 2 May 2018 14:22:37 +0100 Subject: [PATCH 323/620] MultiShift for Staggered --- tests/solver/Test_staggered_multishift.cc | 121 ++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 tests/solver/Test_staggered_multishift.cc diff --git a/tests/solver/Test_staggered_multishift.cc b/tests/solver/Test_staggered_multishift.cc new file mode 100644 index 00000000..04386027 --- /dev/null +++ b/tests/solver/Test_staggered_multishift.cc @@ -0,0 +1,121 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_wilson_cg_unprec.cc + + Copyright (C) 2015 + +Author: Azusa Yamaguchi +Author: Peter Boyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +struct scal { + d internal; +}; + + Gamma::Algebra Gmu [] = { + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT + }; + +int main (int argc, char ** argv) +{ + typedef typename ImprovedStaggeredFermionR::FermionField FermionField; + typename ImprovedStaggeredFermionR::ImplParams params; + + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(&Grid); + + std::vector seeds({1,2,3,4}); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); + + + LatticeGaugeField Umu(&Grid); SU3::HotConfiguration(pRNG,Umu); + + double volume=1; + for(int mu=0;mu HermOpEO(Ds); + + FermionField src(&Grid); random(pRNG,src); + FermionField src_o(&RBGrid); + pickCheckerboard(Odd,src_o,src); + + + ///////////////////////////////// + //Multishift CG + ///////////////////////////////// + std::vector result(degree,&RBGrid); + ConjugateGradientMultiShift MSCG(10000,Sqrt); + + double deodoe_flops=(1205+15*degree)*volume; // == 66*16 + == 1146 + + double t1=usecond(); + MSCG(HermOpEO,src_o,result); + double t2=usecond(); + double ncall=MSCG.IterationsToComplete; + double flops = deodoe_flops * ncall; + std::cout<( \ + new NAME##CPModule(Params_, M_)); \ + have_CheckPointer = true; \ + } else { \ + std::cout << GridLogError << "Checkpointer already loaded " \ + << std::endl; \ + exit(1); \ + } \ + } + namespace Grid { namespace QCD { @@ -77,7 +93,7 @@ class HMCResourceManager { bool have_CheckPointer; // NOTE: operator << is not overloaded for std::vector - // so thsi function is necessary + // so this function is necessary void output_vector_string(const std::vector &vs){ for (auto &i: vs) std::cout << i << " "; @@ -254,6 +270,7 @@ class HMCResourceManager { RegisterLoadCheckPointerFunction(Nersc); #ifdef HAVE_LIME RegisterLoadCheckPointerFunction(ILDG); + RegisterLoadCheckPointerMetadataFunction(Scidac); #endif //////////////////////////////////////////////////////// diff --git a/lib/qcd/hmc/checkpointers/BaseCheckpointer.h b/lib/qcd/hmc/checkpointers/BaseCheckpointer.h index 9be9efca..f4ef252b 100644 --- a/lib/qcd/hmc/checkpointers/BaseCheckpointer.h +++ b/lib/qcd/hmc/checkpointers/BaseCheckpointer.h @@ -76,6 +76,14 @@ class BaseHmcCheckpointer : public HmcObservable { } } + void check_filename(const std::string &filename){ + std::ifstream f(filename.c_str()); + if(!f.good()){ + std::cout << GridLogError << "Filename " << filename << " not found. Aborting. " << std::endl; + abort(); + }; + } + virtual void initialize(const CheckpointerParameters &Params) = 0; virtual void CheckpointRestore(int traj, typename Impl::Field &U, diff --git a/lib/qcd/hmc/checkpointers/BinaryCheckpointer.h b/lib/qcd/hmc/checkpointers/BinaryCheckpointer.h index 59d655ad..025398eb 100644 --- a/lib/qcd/hmc/checkpointers/BinaryCheckpointer.h +++ b/lib/qcd/hmc/checkpointers/BinaryCheckpointer.h @@ -93,6 +93,9 @@ class BinaryHmcCheckpointer : public BaseHmcCheckpointer { void CheckpointRestore(int traj, Field &U, GridSerialRNG &sRNG, GridParallelRNG &pRNG) { std::string config, rng; this->build_filenames(traj, Params, config, rng); + this->check_filename(rng); + this->check_filename(config); + BinarySimpleMunger munge; diff --git a/lib/qcd/hmc/checkpointers/CheckPointerModules.h b/lib/qcd/hmc/checkpointers/CheckPointerModules.h index 5debedef..d49d6e72 100644 --- a/lib/qcd/hmc/checkpointers/CheckPointerModules.h +++ b/lib/qcd/hmc/checkpointers/CheckPointerModules.h @@ -136,6 +136,22 @@ class ILDGCPModule: public CheckPointerModule< ImplementationPolicy> { }; +template +class ScidacCPModule: public CheckPointerModule< ImplementationPolicy> { + typedef CheckPointerModule< ImplementationPolicy> CPBase; + Metadata M; + + //using CPBase::CPBase; // for constructors + + // acquire resource + virtual void initialize(){ + this->CheckPointPtr.reset(new ScidacHmcCheckpointer(this->Par_, M)); + } +public: + ScidacCPModule(typename CPBase::APar Par, Metadata M_):M(M_), CPBase(Par) {} + template + ScidacCPModule(Reader& Reader) : Parametrized(Reader){}; +}; #endif diff --git a/lib/qcd/hmc/checkpointers/CheckPointers.h b/lib/qcd/hmc/checkpointers/CheckPointers.h index 423ce45c..e7a5fa82 100644 --- a/lib/qcd/hmc/checkpointers/CheckPointers.h +++ b/lib/qcd/hmc/checkpointers/CheckPointers.h @@ -34,6 +34,7 @@ directory #include #include #include +#include //#include diff --git a/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h b/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h index 9bcc33df..f7e6b17e 100644 --- a/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h +++ b/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h @@ -95,6 +95,10 @@ class ILDGHmcCheckpointer : public BaseHmcCheckpointer { GridParallelRNG &pRNG) { std::string config, rng; this->build_filenames(traj, Params, config, rng); + this->check_filename(rng); + this->check_filename(config); + + uint32_t nersc_csum,scidac_csuma,scidac_csumb; BinaryIO::readRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb); diff --git a/lib/qcd/hmc/checkpointers/NerscCheckpointer.h b/lib/qcd/hmc/checkpointers/NerscCheckpointer.h index a4b1b480..d452b994 100644 --- a/lib/qcd/hmc/checkpointers/NerscCheckpointer.h +++ b/lib/qcd/hmc/checkpointers/NerscCheckpointer.h @@ -69,6 +69,9 @@ class NerscHmcCheckpointer : public BaseHmcCheckpointer { GridParallelRNG &pRNG) { std::string config, rng; this->build_filenames(traj, Params, config, rng); + this->check_filename(rng); + this->check_filename(config); + FieldMetaData header; NerscIO::readRNGState(sRNG, pRNG, header, rng); diff --git a/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h b/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h new file mode 100644 index 00000000..0867b882 --- /dev/null +++ b/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h @@ -0,0 +1,125 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./lib/qcd/hmc/ScidacCheckpointer.h + +Copyright (C) 2018 + +Author: Guido Cossu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef SCIDAC_CHECKPOINTER +#define SCIDAC_CHECKPOINTER + +#ifdef HAVE_LIME + +#include +#include +#include + +namespace Grid { +namespace QCD { + +// For generic fields +template +class ScidacHmcCheckpointer : public BaseHmcCheckpointer { + private: + CheckpointerParameters Params; + Metadata MData; + + typedef typename Implementation::Field Field; + + public: + //INHERIT_GIMPL_TYPES(Implementation); + + ScidacHmcCheckpointer(const CheckpointerParameters &Params_) { initialize(Params_); } + ScidacHmcCheckpointer(const CheckpointerParameters &Params_, const Metadata& M_):MData(M_) { initialize(Params_); } + + void initialize(const CheckpointerParameters &Params_) { + Params = Params_; + + // check here that the format is valid + int ieee32big = (Params.format == std::string("IEEE32BIG")); + int ieee32 = (Params.format == std::string("IEEE32")); + int ieee64big = (Params.format == std::string("IEEE64BIG")); + int ieee64 = (Params.format == std::string("IEEE64")); + + if (!(ieee64big || ieee32 || ieee32big || ieee64)) { + std::cout << GridLogError << "Unrecognized file format " << Params.format + << std::endl; + std::cout << GridLogError + << "Allowed: IEEE32BIG | IEEE32 | IEEE64BIG | IEEE64" + << std::endl; + + exit(1); + } + } + + void TrajectoryComplete(int traj, Field &U, GridSerialRNG &sRNG, + GridParallelRNG &pRNG) { + if ((traj % Params.saveInterval) == 0) { + std::string config, rng; + this->build_filenames(traj, Params, config, rng); + GridBase *grid = U._grid; + uint32_t nersc_csum,scidac_csuma,scidac_csumb; + BinaryIO::writeRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb); + ScidacWriter _ScidacWriter(grid->IsBoss()); + _ScidacWriter.open(config); + _ScidacWriter.writeScidacFieldRecord(U, MData); + _ScidacWriter.close(); + + std::cout << GridLogMessage << "Written Scidac Configuration on " << config + << " checksum " << std::hex << nersc_csum<<"/" + << scidac_csuma<<"/" << scidac_csumb + << std::dec << std::endl; + } + }; + + void CheckpointRestore(int traj, Field &U, GridSerialRNG &sRNG, + GridParallelRNG &pRNG) { + std::string config, rng; + this->build_filenames(traj, Params, config, rng); + this->check_filename(rng); + this->check_filename(config); + + + uint32_t nersc_csum,scidac_csuma,scidac_csumb; + BinaryIO::readRNG(sRNG, pRNG, rng, 0,nersc_csum,scidac_csuma,scidac_csumb); + + Metadata md_content; + ScidacReader _ScidacReader; + _ScidacReader.open(config); + _ScidacReader.readScidacFieldRecord(U,md_content); // format from the header + _ScidacReader.close(); + + std::cout << GridLogMessage << "Read Scidac Configuration from " << config + << " checksum " << std::hex + << nersc_csum<<"/" + << scidac_csuma<<"/" + << scidac_csumb + << std::dec << std::endl; + }; +}; +} +} + +#endif // HAVE_LIME +#endif // ILDG_CHECKPOINTER diff --git a/tests/hmc/Test_hmc_WG_Production.cc b/tests/hmc/Test_hmc_WG_Production.cc index b99446d5..7f8d8124 100644 --- a/tests/hmc/Test_hmc_WG_Production.cc +++ b/tests/hmc/Test_hmc_WG_Production.cc @@ -33,6 +33,7 @@ namespace Grid{ GRID_SERIALIZABLE_CLASS_MEMBERS(ActionParameters, double, beta) + ActionParameters() = default; template ActionParameters(Reader& Reader){ @@ -68,11 +69,15 @@ int main(int argc, char **argv) { } Serialiser Reader(TheHMC.ParameterFile); - + // Read parameters from input file + ActionParameters WilsonPar(Reader); // Checkpointer definition CheckpointerParameters CPparams(Reader); - TheHMC.Resources.LoadNerscCheckpointer(CPparams); + //TheHMC.Resources.LoadNerscCheckpointer(CPparams); + + // Store metadata in the Scidac checkpointer + TheHMC.Resources.LoadScidacCheckpointer(CPparams, WilsonPar); RNGModuleParameters RNGpar(Reader); TheHMC.Resources.SetRNGSeeds(RNGpar); @@ -91,8 +96,6 @@ int main(int argc, char **argv) { // need wrappers of the fermionic classes // that have a complex construction // standard - ActionParameters WilsonPar(Reader); - //RealD beta = 6.4 ; WilsonGaugeActionR Waction(WilsonPar.beta); ActionLevel Level1(1); From b4583267447e3f9a68c2f689b757994bfbb8f25d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 2 May 2018 14:29:22 +0100 Subject: [PATCH 325/620] Checkpointer module update --- lib/qcd/hmc/checkpointers/CheckPointerModules.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/qcd/hmc/checkpointers/CheckPointerModules.h b/lib/qcd/hmc/checkpointers/CheckPointerModules.h index d49d6e72..f17cd2c8 100644 --- a/lib/qcd/hmc/checkpointers/CheckPointerModules.h +++ b/lib/qcd/hmc/checkpointers/CheckPointerModules.h @@ -141,8 +141,6 @@ class ScidacCPModule: public CheckPointerModule< ImplementationPolicy> { typedef CheckPointerModule< ImplementationPolicy> CPBase; Metadata M; - //using CPBase::CPBase; // for constructors - // acquire resource virtual void initialize(){ this->CheckPointPtr.reset(new ScidacHmcCheckpointer(this->Par_, M)); @@ -150,7 +148,7 @@ class ScidacCPModule: public CheckPointerModule< ImplementationPolicy> { public: ScidacCPModule(typename CPBase::APar Par, Metadata M_):M(M_), CPBase(Par) {} template - ScidacCPModule(Reader& Reader) : Parametrized(Reader){}; + ScidacCPModule(Reader& Reader) : Parametrized(Reader), M(Reader){}; }; #endif From 4d4ac2517b3348c1cf517421ad3f3038fd623bea Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 2 May 2018 14:36:32 +0100 Subject: [PATCH 326/620] Adding Scalar field theory example for Scidac format --- tests/hmc/Test_hmc_ScalarActionNxN.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/hmc/Test_hmc_ScalarActionNxN.cc b/tests/hmc/Test_hmc_ScalarActionNxN.cc index 9e40beac..33e52d82 100644 --- a/tests/hmc/Test_hmc_ScalarActionNxN.cc +++ b/tests/hmc/Test_hmc_ScalarActionNxN.cc @@ -34,6 +34,8 @@ class ScalarActionParameters : Serializable { double, lambda, double, g); + ScalarActionParameters() = default; + template ScalarActionParameters(Reader& Reader){ read(Reader, "ScalarAction", *this); @@ -124,10 +126,13 @@ int main(int argc, char **argv) { ScalarGrid.set_rb(new GridRedBlackCartesian(ScalarGrid.get_full())); TheHMC.Resources.AddGrid("scalar", ScalarGrid); std::cout << "Lattice size : " << GridDefaultLatt() << std::endl; + + ScalarActionParameters SPar(Reader); // Checkpointer definition CheckpointerParameters CPparams(Reader); - TheHMC.Resources.LoadBinaryCheckpointer(CPparams); + //TheHMC.Resources.LoadBinaryCheckpointer(CPparams); + TheHMC.Resources.LoadScidacCheckpointer(CPparams, SPar); RNGModuleParameters RNGpar(Reader); TheHMC.Resources.SetRNGSeeds(RNGpar); @@ -140,7 +145,6 @@ int main(int argc, char **argv) { // Collect actions, here use more encapsulation // Scalar action in adjoint representation - ScalarActionParameters SPar(Reader); ScalarAction Saction(SPar.mass_squared, SPar.lambda, SPar.g); // Collect actions From ba37d51ee9a6f8ec3021b55db0543002e36441f3 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 2 May 2018 15:32:06 +0100 Subject: [PATCH 327/620] Debugging the RNG IO --- lib/parallelIO/BinaryIO.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/parallelIO/BinaryIO.h b/lib/parallelIO/BinaryIO.h index ce84fc81..08b7b9b4 100644 --- a/lib/parallelIO/BinaryIO.h +++ b/lib/parallelIO/BinaryIO.h @@ -263,7 +263,7 @@ PARALLEL_CRITICAL GridBase *grid, std::vector &iodata, std::string file, - uint64_t offset, + uint64_t& offset, const std::string &format, int control, uint32_t &nersc_csum, uint32_t &scidac_csuma, @@ -495,6 +495,7 @@ PARALLEL_CRITICAL exit(1); #endif } + offset = fout.tellp(); fout.close(); } timer.Stop(); @@ -699,7 +700,6 @@ PARALLEL_CRITICAL IOobject(w,grid,iodata,file,offset,format,BINARYIO_WRITE|BINARYIO_LEXICOGRAPHIC, nersc_csum,scidac_csuma,scidac_csumb); - iodata.resize(1); { std::vector tmp(RngStateCount); From 8c658de17997db1f3c7990687fc61932b1d82254 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 2 May 2018 17:52:16 +0100 Subject: [PATCH 328/620] Compressor speed up (a little); streaming stores --- lib/qcd/action/fermion/WilsonCompressor.h | 32 ++++++++++++++--------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/qcd/action/fermion/WilsonCompressor.h b/lib/qcd/action/fermion/WilsonCompressor.h index b47700ac..6ec2ede9 100644 --- a/lib/qcd/action/fermion/WilsonCompressor.h +++ b/lib/qcd/action/fermion/WilsonCompressor.h @@ -69,39 +69,47 @@ class WilsonCompressorTemplate< _HCspinor, _Hspinor, _Spinor, projector, /*****************************************************/ /* Compress includes precision change if mpi data is not same */ /*****************************************************/ - inline void Compress(SiteHalfSpinor *buf,Integer o,const SiteSpinor &in) { - projector::Proj(buf[o],in,mu,dag); + inline void Compress(SiteHalfSpinor * __restrict__ buf,Integer o,const SiteSpinor &in) { + SiteHalfSpinor tmp; + projector::Proj(tmp,in,mu,dag); + vstream(buf[o],tmp); } /*****************************************************/ /* Exchange includes precision change if mpi data is not same */ /*****************************************************/ - inline void Exchange(SiteHalfSpinor *mp, - SiteHalfSpinor *vp0, - SiteHalfSpinor *vp1, + inline void Exchange(SiteHalfSpinor * __restrict__ mp, + const SiteHalfSpinor * __restrict__ vp0, + const SiteHalfSpinor * __restrict__ vp1, Integer type,Integer o){ - exchange(mp[2*o],mp[2*o+1],vp0[o],vp1[o],type); + SiteHalfSpinor tmp1; + SiteHalfSpinor tmp2; + exchange(tmp1,tmp2,vp0[o],vp1[o],type); + vstream(mp[2*o ],tmp1); + vstream(mp[2*o+1],tmp2); } /*****************************************************/ /* Have a decompression step if mpi data is not same */ /*****************************************************/ - inline void Decompress(SiteHalfSpinor *out, - SiteHalfSpinor *in, Integer o) { + inline void Decompress(SiteHalfSpinor * __restrict__ out, + SiteHalfSpinor * __restrict__ in, Integer o) { assert(0); } /*****************************************************/ /* Compress Exchange */ /*****************************************************/ - inline void CompressExchange(SiteHalfSpinor *out0, - SiteHalfSpinor *out1, - const SiteSpinor *in, + inline void CompressExchange(SiteHalfSpinor * __restrict__ out0, + SiteHalfSpinor * __restrict__ out1, + const SiteSpinor * __restrict__ in, Integer j,Integer k, Integer m,Integer type){ SiteHalfSpinor temp1, temp2,temp3,temp4; projector::Proj(temp1,in[k],mu,dag); projector::Proj(temp2,in[m],mu,dag); - exchange(out0[j],out1[j],temp1,temp2,type); + exchange(temp3,temp4,temp1,temp2,type); + vstream(out0[j],temp3); + vstream(out1[j],temp4); } /*****************************************************/ From 587bfcc0f4881c6b1851dda4fb2c390bbddfa9d9 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Thu, 3 May 2018 12:10:31 +0100 Subject: [PATCH 329/620] Add Timing --- .../iterative/ConjugateGradientMultiShift.h | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/algorithms/iterative/ConjugateGradientMultiShift.h b/lib/algorithms/iterative/ConjugateGradientMultiShift.h index 1ad79856..28a80ce6 100644 --- a/lib/algorithms/iterative/ConjugateGradientMultiShift.h +++ b/lib/algorithms/iterative/ConjugateGradientMultiShift.h @@ -164,7 +164,16 @@ void operator() (LinearOperatorBase &Linop, const Field &src, std::vector for(int s=0;s &Linop, const Field &src, std::vector for (k=1;k<=MaxIterations;k++){ a = c /cp; + AXPYTimer.Start(); axpy(p,a,p,r); + AXPYTimer.Stop(); // Note to self - direction ps is iterated seperately // for each shift. Does not appear to have any scope @@ -181,6 +192,7 @@ void operator() (LinearOperatorBase &Linop, const Field &src, std::vector // However SAME r is used. Could load "r" and update // ALL ps[s]. 2/3 Bandwidth saving // New Kernel: Load r, vector of coeffs, vector of pointers ps + AXPYTimer.Start(); for(int s=0;s &Linop, const Field &src, std::vector } } } + AXPYTimer.Stop(); cp=c; - + MatrixTimer.Start(); Linop.HermOpAndNorm(p,mmp,d,qq); + MatrixTimer.Stop(); + + AXPYTimer.Start(); axpy(mmp,mass[0],p,mmp); + AXPYTimer.Stop(); RealD rn = norm2(p); d += rn*mass[0]; bp=b; b=-cp/d; + AXPYTimer.Start(); c=axpy_norm(r,b,mmp,r); + AXPYTimer.Stop(); // Toggle the recurrence history bs[0] = b; iz = 1-iz; + ShiftTimer.Start(); for(int s=1;s &Linop, const Field &src, std::vector bs[s] = b*z[s][iz]/z0; // NB sign rel to Mike } } + ShiftTimer.Stop(); for(int s=0;s &Linop, const Field &src, std::vector // Before: 3 x npole + 3 x npole // After : 2 x npole (ps[s]) => 3x speed up of multishift CG. + AXPYTimer.Start(); if( (!converged[s]) ) { axpy(psi[ss],-bs[s]*alpha[s],ps[s],psi[ss]); } + AXPYTimer.Stop(); } // Convergence checks @@ -258,6 +281,9 @@ void operator() (LinearOperatorBase &Linop, const Field &src, std::vector if ( all_converged ){ + SolverTimer.Stop(); + + std::cout< &Linop, const Field &src, std::vector std::cout< Date: Thu, 3 May 2018 12:31:36 +0100 Subject: [PATCH 330/620] 5D free propagator for DWF and boundary conditions for free propagators --- lib/qcd/action/fermion/DomainWallFermion.h | 55 ++++- lib/qcd/action/fermion/FermionOperator.h | 30 ++- .../fermion/OverlapWilsonCayleyTanhFermion.h | 4 +- lib/qcd/action/fermion/WilsonFermion.cc | 3 +- lib/qcd/action/fermion/WilsonFermion.h | 2 +- lib/qcd/action/fermion/WilsonFermion5D.cc | 227 +++++++++++++++++- lib/qcd/action/fermion/WilsonFermion5D.h | 5 +- tests/core/Test_fft.cc | 3 +- 8 files changed, 311 insertions(+), 18 deletions(-) diff --git a/lib/qcd/action/fermion/DomainWallFermion.h b/lib/qcd/action/fermion/DomainWallFermion.h index 72ce8f42..99f64865 100644 --- a/lib/qcd/action/fermion/DomainWallFermion.h +++ b/lib/qcd/action/fermion/DomainWallFermion.h @@ -8,6 +8,7 @@ Author: Peter Boyle Author: Peter Boyle +Author: Vera Guelpers 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 @@ -42,8 +43,58 @@ namespace Grid { INHERIT_IMPL_TYPES(Impl); public: - void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { - this->MomentumSpacePropagatorHt(out,in,_m); + void FreePropagator(const FermionField &in,FermionField &out,RealD mass, std::vector twist, bool fiveD) { + FermionField in_k(in._grid); + FermionField prop_k(in._grid); + + FFT theFFT((GridCartesian *) in._grid); + + //phase for boundary condition + ComplexField coor(in._grid); + ComplexField ph(in._grid); ph = zero; + FermionField in_buf(in._grid); in_buf = zero; + Complex ci(0.0,1.0); + assert(twist.size() == Nd);//check that twist is Nd + int shift = 0; + if(fiveD) shift = 1; + for(unsigned int nu = 0; nu < Nd; nu++) + { + // Shift coordinate lattice index by 1 to account for 5th dimension. + LatticeCoordinate(coor, nu + shift); + ph = ph + twist[nu]*coor*((1./(in._grid->_fdimensions[nu+shift]))); + } + in_buf = exp((RealD)(2.0*M_PI)*ci*ph*(-1.0))*in; + + if(fiveD){//FFT only on temporal and spatial dimensions + std::vector mask(Nd+1,1); mask[0] = 0; + theFFT.FFT_dim_mask(in_k,in_buf,mask,FFT::forward); + this->MomentumSpacePropagatorHt_5d(prop_k,in_k,mass,twist); + theFFT.FFT_dim_mask(out,prop_k,mask,FFT::backward); + } + else{ + theFFT.FFT_all_dim(in_k,in,FFT::forward); + this->MomentumSpacePropagatorHt(prop_k,in_k,mass,twist); + theFFT.FFT_all_dim(out,prop_k,FFT::backward); + } + + //phase for boundary condition + out = out * exp((RealD)(2.0*M_PI)*ci*ph); + }; + + virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass,std::vector twist) { + bool fiveD = true; //5d propagator by default + FreePropagator(in,out,mass,twist,fiveD); + }; + + virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass, bool fiveD) { + std::vector twist(Nd,0.0); //default: periodic boundarys in all directions + FreePropagator(in,out,mass,twist,fiveD); + }; + + virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) { + bool fiveD = true; //5d propagator by default + std::vector twist(Nd,0.0); //default: periodic boundarys in all directions + FreePropagator(in,out,mass,twist,fiveD); }; virtual void Instantiatable(void) {}; diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index f81c9e2c..1ef99b85 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -9,6 +9,7 @@ Author: Peter Boyle Author: Peter Boyle Author: Peter Boyle +Author: Vera Guelpers 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 @@ -95,17 +96,38 @@ namespace Grid { virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp)=0; // case by case Wilson, Clover, Cayley, ContFrac, PartFrac - virtual void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { assert(0);}; + virtual void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m,std::vector twist) { assert(0);}; - virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) { + virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass,std::vector twist) { FFT theFFT((GridCartesian *) in._grid); FermionField in_k(in._grid); FermionField prop_k(in._grid); - theFFT.FFT_all_dim(in_k,in,FFT::forward); - this->MomentumSpacePropagator(prop_k,in_k,mass); + //phase for boundary condition + ComplexField coor(in._grid); + ComplexField ph(in._grid); ph = zero; + FermionField in_buf(in._grid); in_buf = zero; + Complex ci(0.0,1.0); + assert(twist.size() == Nd);//check that twist is Nd + for(unsigned int nu = 0; nu < Nd; nu++) + { + LatticeCoordinate(coor, nu); + ph = ph + twist[nu]*coor*((1./(in._grid->_fdimensions[nu]))); + } + in_buf = exp((RealD)(2.0*M_PI)*ci*ph*(-1.0))*in; + + theFFT.FFT_all_dim(in_k,in_buf,FFT::forward); + this->MomentumSpacePropagator(prop_k,in_k,mass,twist); theFFT.FFT_all_dim(out,prop_k,FFT::backward); + + //phase for boundary condition + out = out * exp((RealD)(2.0*M_PI)*ci*ph); + + }; + virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) { + std::vector twist(Nd,0.0); //default: periodic boundarys in all directions + FreePropagator(in,out,mass,twist); }; /////////////////////////////////////////////// diff --git a/lib/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h b/lib/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h index f516c5d0..fd7d74df 100644 --- a/lib/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h +++ b/lib/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h @@ -42,8 +42,8 @@ namespace Grid { INHERIT_IMPL_TYPES(Impl); public: - void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m) { - this->MomentumSpacePropagatorHw(out,in,_m); + void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m,std::vector twist) { + this->MomentumSpacePropagatorHw(out,in,_m,twist); }; // Constructors diff --git a/lib/qcd/action/fermion/WilsonFermion.cc b/lib/qcd/action/fermion/WilsonFermion.cc index 2d9cf22d..53e81c39 100644 --- a/lib/qcd/action/fermion/WilsonFermion.cc +++ b/lib/qcd/action/fermion/WilsonFermion.cc @@ -162,7 +162,7 @@ void WilsonFermion::MooeeInvDag(const FermionField &in, FermionField &out) MooeeInv(in,out); } template -void WilsonFermion::MomentumSpacePropagator(FermionField &out, const FermionField &in,RealD _m) +void WilsonFermion::MomentumSpacePropagator(FermionField &out, const FermionField &in,RealD _m,std::vector twist) { typedef typename FermionField::vector_type vector_type; typedef typename FermionField::scalar_type ScalComplex; @@ -195,6 +195,7 @@ void WilsonFermion::MomentumSpacePropagator(FermionField &out, const Fermi RealD TwoPiL = M_PI * 2.0/ latt_size[mu]; kmu = TwoPiL * kmu; + kmu = kmu + TwoPiL * one * twist[mu];//momentum for twisted boundary conditions wilson = wilson + 2.0*sin(kmu*0.5)*sin(kmu*0.5); // Wilson term diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/lib/qcd/action/fermion/WilsonFermion.h index ea25ed7f..3985771c 100644 --- a/lib/qcd/action/fermion/WilsonFermion.h +++ b/lib/qcd/action/fermion/WilsonFermion.h @@ -96,7 +96,7 @@ class WilsonFermion : public WilsonKernels, public WilsonFermionStatic { virtual void MooeeInv(const FermionField &in, FermionField &out); virtual void MooeeInvDag(const FermionField &in, FermionField &out); - virtual void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _mass) ; + virtual void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _mass,std::vector twist) ; //////////////////////// // Derivative interface diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/lib/qcd/action/fermion/WilsonFermion5D.cc index 6f82aad2..6d4c6967 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.cc +++ b/lib/qcd/action/fermion/WilsonFermion5D.cc @@ -13,6 +13,7 @@ Author: Peter Boyle Author: paboyle Author: Guido Cossu Author: Andrew Lawson +Author: Vera Guelpers 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 @@ -563,7 +564,221 @@ void WilsonFermion5D::DW(const FermionField &in, FermionField &out,int dag } template -void WilsonFermion5D::MomentumSpacePropagatorHt(FermionField &out,const FermionField &in, RealD mass) +void WilsonFermion5D::MomentumSpacePropagatorHt_5d(FermionField &out,const FermionField &in, RealD mass,std::vector twist) +{ + // what type LatticeComplex + GridBase *_grid = _FourDimGrid; + GridBase *_5dgrid = _FiveDimGrid; + + conformable(_5dgrid,out._grid); + + FermionField PRsource(_5dgrid); + FermionField PLsource(_5dgrid); + FermionField buf1_4d(_grid); + FermionField buf2_4d(_grid); + FermionField GR(_5dgrid); + FermionField GL(_5dgrid); + FermionField bufL_4d(_grid); + FermionField bufR_4d(_grid); + + unsigned int Ls = in._grid->_rdimensions[0]; + + typedef typename FermionField::vector_type vector_type; + typedef typename FermionField::scalar_type ScalComplex; + typedef iSinglet Tcomplex; + typedef Lattice > LatComplex; + + Gamma::Algebra Gmu [] = { + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT + }; + + Gamma g5(Gamma::Algebra::Gamma5); + + std::vector latt_size = _grid->_fdimensions; + + LatComplex sk(_grid); sk = zero; + LatComplex sk2(_grid); sk2= zero; + LatComplex W(_grid); W= zero; + LatComplex a(_grid); a= zero; + LatComplex one (_grid); one = ScalComplex(1.0,0.0); + LatComplex cosha(_grid); + LatComplex kmu(_grid); + LatComplex Wea(_grid); + LatComplex Wema(_grid); + LatComplex sinha(_grid); + LatComplex sinhaLs(_grid); + LatComplex coshaLs(_grid); + LatComplex A(_grid); + LatComplex F(_grid); + LatComplex App(_grid); + LatComplex Amm(_grid); + LatComplex Bpp(_grid); + LatComplex Bmm(_grid); + LatComplex ABpm(_grid); //Apm=Amp=Bpm=Bmp + LatComplex signW(_grid); + + ScalComplex ci(0.0,1.0); + + for(int mu=0;mu alpha + //////////////////////////////////////////// + cosha = (one + W*W + sk) / (abs(W)*2.0); + + // FIXME Need a Lattice acosh + for(int idx=0;idx<_grid->lSites();idx++){ + std::vector lcoor(Nd); + Tcomplex cc; + RealD sgn; + _grid->LocalIndexToLocalCoor(idx,lcoor); + peekLocalSite(cc,cosha,lcoor); + assert((double)real(cc)>=1.0); + assert(fabs((double)imag(cc))<=1.0e-15); + cc = ScalComplex(::acosh(real(cc)),0.0); + pokeLocalSite(cc,a,lcoor); + } + + Wea = ( exp( a) * abs(W) ); + Wema= ( exp(-a) * abs(W) ); + sinha = 0.5*(exp( a) - exp(-a)); + sinhaLs = 0.5*(exp( a*Ls) - exp(-a*Ls)); + coshaLs = 0.5*(exp( a*Ls) + exp(-a*Ls)); + + A = one / (abs(W) * sinha * 2.0) * one / (sinhaLs * 2.0); + F = exp( a*Ls) * (one - Wea + (Wema - one) * mass*mass); + F = F + exp(-a*Ls) * (Wema - one + (one - Wea) * mass*mass); + F = F - abs(W) * sinha * 4.0 * mass; + + Bpp = (A/F) * (exp(-a*Ls*2.0) - one) * (one - Wema) * (one - mass*mass * one); + Bmm = (A/F) * (one - exp(a*Ls*2.0)) * (one - Wea) * (one - mass*mass * one); + App = (A/F) * (exp(-a*Ls*2.0) - one) * exp(-a) * (exp(-a) - abs(W)) * (one - mass*mass * one); + Amm = (A/F) * (one - exp(a*Ls*2.0)) * exp(a) * (exp(a) - abs(W)) * (one - mass*mass * one); + ABpm = (A/F) * abs(W) * sinha * 2.0 * (one + mass * coshaLs * 2.0 + mass*mass * one); + + //P+ source, P- source + PRsource = (in + g5 * in) * 0.5; + PLsource = (in - g5 * in) * 0.5; + + //calculate GR, GL + for(unsigned int ss=1;ss<=Ls;ss++) + { + bufR_4d = zero; + bufL_4d = zero; + for(unsigned int tt=1;tt<=Ls;tt++) + { + //possible sign if W<0 + if((ss+tt)%2==1) signW = abs(W)/W; + else signW = one; + + unsigned int f = (ss > tt) ? ss-tt : tt-ss; //f = abs(ss-tt) + //GR + buf1_4d = zero; + ExtractSlice(buf1_4d, PRsource, (tt-1), 0); + //G(s,t) + bufR_4d = bufR_4d + A * exp(a*Ls) * exp(-a*f) * signW * buf1_4d + A * exp(-a*Ls) * exp(a*f) * signW * buf1_4d; + //A++*exp(a(s+t)) + bufR_4d = bufR_4d + App * exp(a*ss) * exp(a*tt) * signW * buf1_4d ; + //A+-*exp(a(s-t)) + bufR_4d = bufR_4d + ABpm * exp(a*ss) * exp(-a*tt) * signW * buf1_4d ; + //A-+*exp(a(-s+t)) + bufR_4d = bufR_4d + ABpm * exp(-a*ss) * exp(a*tt) * signW * buf1_4d ; + //A--*exp(a(-s-t)) + bufR_4d = bufR_4d + Amm * exp(-a*ss) * exp(-a*tt) * signW * buf1_4d ; + + //GL + buf2_4d = zero; + ExtractSlice(buf2_4d, PLsource, (tt-1), 0); + //G(s,t) + bufL_4d = bufL_4d + A * exp(a*Ls) * exp(-a*f) * signW * buf2_4d + A * exp(-a*Ls) * exp(a*f) * signW * buf2_4d; + //B++*exp(a(s+t)) + bufL_4d = bufL_4d + Bpp * exp(a*ss) * exp(a*tt) * signW * buf2_4d ; + //B+-*exp(a(s-t)) + bufL_4d = bufL_4d + ABpm * exp(a*ss) * exp(-a*tt) * signW * buf2_4d ; + //B-+*exp(a(-s+t)) + bufL_4d = bufL_4d + ABpm * exp(-a*ss) * exp(a*tt) * signW * buf2_4d ; + //B--*exp(a(-s-t)) + bufL_4d = bufL_4d + Bmm * exp(-a*ss) * exp(-a*tt) * signW * buf2_4d ; + } + InsertSlice(bufR_4d, GR, (ss-1), 0); + InsertSlice(bufL_4d, GL, (ss-1), 0); + } + +//calculate propagator + for(unsigned int ss=1;ss<=Ls;ss++) + { + bufR_4d = zero; + bufL_4d = zero; + + //(i*gamma_mu*sin(p_mu) - W)*(GL*P- source) + buf1_4d = zero; + ExtractSlice(buf1_4d, GL, (ss-1), 0); + buf2_4d = zero; + for(int mu=0;mu +void WilsonFermion5D::MomentumSpacePropagatorHt(FermionField &out,const FermionField &in, RealD mass,std::vector twist) { // what type LatticeComplex GridBase *_grid = _FourDimGrid; @@ -606,6 +821,7 @@ void WilsonFermion5D::MomentumSpacePropagatorHt(FermionField &out,const Fe RealD TwoPiL = M_PI * 2.0/ latt_size[mu]; kmu = TwoPiL * kmu; + kmu = kmu + TwoPiL * one * twist[mu];//momentum for twisted boundary conditions sk2 = sk2 + 2.0*sin(kmu*0.5)*sin(kmu*0.5); sk = sk + sin(kmu) *sin(kmu); @@ -619,7 +835,7 @@ void WilsonFermion5D::MomentumSpacePropagatorHt(FermionField &out,const Fe //////////////////////////////////////////// // Cosh alpha -> alpha //////////////////////////////////////////// - cosha = (one + W*W + sk) / (W*2.0); + cosha = (one + W*W + sk) / (abs(W)*2.0); // FIXME Need a Lattice acosh for(int idx=0;idx<_grid->lSites();idx++){ @@ -634,8 +850,8 @@ void WilsonFermion5D::MomentumSpacePropagatorHt(FermionField &out,const Fe pokeLocalSite(cc,a,lcoor); } - Wea = ( exp( a) * W ); - Wema= ( exp(-a) * W ); + Wea = ( exp( a) * abs(W) ); + Wema= ( exp(-a) * abs(W) ); num = num + ( one - Wema ) * mass * in; denom= ( Wea - one ) + mass*mass * (one - Wema); @@ -643,7 +859,7 @@ void WilsonFermion5D::MomentumSpacePropagatorHt(FermionField &out,const Fe } template -void WilsonFermion5D::MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass) +void WilsonFermion5D::MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass,std::vector twist) { Gamma::Algebra Gmu [] = { Gamma::Algebra::GammaX, @@ -683,6 +899,7 @@ void WilsonFermion5D::MomentumSpacePropagatorHw(FermionField &out,const Fe RealD TwoPiL = M_PI * 2.0/ latt_size[mu]; kmu = TwoPiL * kmu; + kmu = kmu + TwoPiL * one * twist[mu];//momentum for twisted boundary conditions sk2 = sk2 + 2.0*sin(kmu*0.5)*sin(kmu*0.5); sk = sk + sin(kmu)*sin(kmu); diff --git a/lib/qcd/action/fermion/WilsonFermion5D.h b/lib/qcd/action/fermion/WilsonFermion5D.h index 21da4c31..d22b5d6f 100644 --- a/lib/qcd/action/fermion/WilsonFermion5D.h +++ b/lib/qcd/action/fermion/WilsonFermion5D.h @@ -118,8 +118,9 @@ namespace QCD { virtual void DhopDerivEO(GaugeField &mat,const FermionField &U,const FermionField &V,int dag); virtual void DhopDerivOE(GaugeField &mat,const FermionField &U,const FermionField &V,int dag); - void MomentumSpacePropagatorHt(FermionField &out,const FermionField &in,RealD mass) ; - void MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass) ; + void MomentumSpacePropagatorHt_5d(FermionField &out,const FermionField &in,RealD mass,std::vector twist) ; + void MomentumSpacePropagatorHt(FermionField &out,const FermionField &in,RealD mass,std::vector twist) ; + void MomentumSpacePropagatorHw(FermionField &out,const FermionField &in,RealD mass,std::vector twist) ; // Implement hopping term non-hermitian hopping term; half cb or both // Implement s-diagonal DW diff --git a/tests/core/Test_fft.cc b/tests/core/Test_fft.cc index b2336cfa..b7f9f000 100644 --- a/tests/core/Test_fft.cc +++ b/tests/core/Test_fft.cc @@ -309,7 +309,8 @@ int main (int argc, char ** argv) // Momentum space prop std::cout << " Solving by FFT and Feynman rules" < Date: Thu, 3 May 2018 12:33:20 +0100 Subject: [PATCH 331/620] FreeProp module for Hadrons --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MFermion/FreeProp.cc | 36 +++ extras/Hadrons/Modules/MFermion/FreeProp.hpp | 189 ++++++++++++++ extras/Hadrons/modules.inc | 2 + tests/hadrons/Test_free_prop.cc | 245 +++++++++++++++++++ 5 files changed, 473 insertions(+) create mode 100644 extras/Hadrons/Modules/MFermion/FreeProp.cc create mode 100644 extras/Hadrons/Modules/MFermion/FreeProp.hpp create mode 100644 tests/hadrons/Test_free_prop.cc diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index fc536393..2c356cfc 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -37,6 +37,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.cc b/extras/Hadrons/Modules/MFermion/FreeProp.cc new file mode 100644 index 00000000..b8eb0529 --- /dev/null +++ b/extras/Hadrons/Modules/MFermion/FreeProp.cc @@ -0,0 +1,36 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MFermion/FreeProp.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Vera Guelpers + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MFermion; + +template class Grid::Hadrons::MFermion::TFreeProp; + diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.hpp b/extras/Hadrons/Modules/MFermion/FreeProp.hpp new file mode 100644 index 00000000..b1038ddd --- /dev/null +++ b/extras/Hadrons/Modules/MFermion/FreeProp.hpp @@ -0,0 +1,189 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MFermion/FreeProp.hpp + +Copyright (C) 2015-2018 + +Author: Vera Guelpers + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ + + +#ifndef Hadrons_MFermion_FreeProp_hpp_ +#define Hadrons_MFermion_FreeProp_hpp_ + +#include +#include +#include + +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * FreeProp * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MFermion) + +class FreePropPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(FreePropPar, + std::string, source, + std::string, action, + double, mass, + std::string, twist); +}; + +template +class TFreeProp: public Module +{ +public: + FGS_TYPE_ALIASES(FImpl,); +public: + // constructor + TFreeProp(const std::string name); + // destructor + virtual ~TFreeProp(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); +protected: + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + unsigned int Ls_; +}; + +MODULE_REGISTER_TMP(FreeProp, TFreeProp, MFermion); + +/****************************************************************************** + * TFreeProp implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TFreeProp::TFreeProp(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TFreeProp::getInput(void) +{ + std::vector in = {par().source, par().action}; + + return in; +} + +template +std::vector TFreeProp::getOutput(void) +{ + std::vector out = {getName(), getName() + "_5d"}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TFreeProp::setup(void) +{ + Ls_ = env().getObjectLs(par().action); + envCreateLat(PropagatorField, getName()); + envTmpLat(FermionField, "source", Ls_); + envTmpLat(FermionField, "sol", Ls_); + envTmpLat(FermionField, "tmp"); + if (Ls_ > 1) + { + envCreateLat(PropagatorField, getName() + "_5d", Ls_); + } +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TFreeProp::execute(void) +{ + LOG(Message) << "Computing free fermion propagator '" << getName() << "'" + << std::endl; + + std::string propName = (Ls_ == 1) ? getName() : (getName() + "_5d"); + auto &prop = envGet(PropagatorField, propName); + auto &fullSrc = envGet(PropagatorField, par().source); + auto &mat = envGet(FMat, par().action); + RealD mass = par().mass; + + envGetTmp(FermionField, source); + envGetTmp(FermionField, sol); + envGetTmp(FermionField, tmp); + LOG(Message) << "Calculating a free Propagator with mass " << mass + << " using the action '" << par().action + << "' on source '" << par().source << "'" << std::endl; + for (unsigned int s = 0; s < Ns; ++s) + for (unsigned int c = 0; c < FImpl::Dimension; ++c) + { + LOG(Message) << "Calculation for spin= " << s << ", color= " << c + << std::endl; + // source conversion for 4D sources + if (!env().isObject5d(par().source)) + { + if (Ls_ == 1) + { + PropToFerm(source, fullSrc, s, c); + } + else + { + PropToFerm(tmp, fullSrc, s, c); + make_5D(tmp, source, Ls_); + } + } + // source conversion for 5D sources + else + { + if (Ls_ != env().getObjectLs(par().source)) + { + HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); + } + else + { + PropToFerm(source, fullSrc, s, c); + } + } + sol = zero; + std::vector twist = strToVec(par().twist); + if(twist.size() != Nd) HADRONS_ERROR(Size, "number of twist angles does not match number of dimensions"); + mat.FreePropagator(source,sol,mass,twist); + FermToProp(prop, sol, s, c); + // create 4D propagators from 5D one if necessary + if (Ls_ > 1) + { + PropagatorField &p4d = envGet(PropagatorField, getName()); + make_4D(sol, tmp, Ls_); + FermToProp(p4d, tmp, s, c); + } + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MFermion_FreeProp_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index ad3a8727..69463f9d 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -7,6 +7,7 @@ modules_cc =\ Modules/MContraction/WardIdentity.cc \ Modules/MContraction/DiscLoop.cc \ Modules/MContraction/Gamma3pt.cc \ + Modules/MFermion/FreeProp.cc \ Modules/MFermion/GaugeProp.cc \ Modules/MSource/Point.cc \ Modules/MSource/Wall.cc \ @@ -54,6 +55,7 @@ modules_hpp =\ Modules/MContraction/Gamma3pt.hpp \ Modules/MContraction/WardIdentity.hpp \ Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MFermion/FreeProp.hpp \ Modules/MFermion/GaugeProp.hpp \ Modules/MSource/SeqGamma.hpp \ Modules/MSource/Point.hpp \ diff --git a/tests/hadrons/Test_free_prop.cc b/tests/hadrons/Test_free_prop.cc new file mode 100644 index 00000000..a1a5aadd --- /dev/null +++ b/tests/hadrons/Test_free_prop.cc @@ -0,0 +1,245 @@ +/******************************************************************************* + Grid physics library, www.github.com/paboyle/Grid + + Source file: tests/hadrons/Test_free_prop.cc + + Copyright (C) 2015-2018 + + Author: Antonin Portelli + Author: Vera Guelpers + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution + directory. + *******************************************************************************/ + +#include +#include + +using namespace Grid; +using namespace Hadrons; + +int main(int argc, char *argv[]) +{ + // initialization ////////////////////////////////////////////////////////// + Grid_init(&argc, &argv); + HadronsLogError.Active(GridLogError.isActive()); + HadronsLogWarning.Active(GridLogWarning.isActive()); + HadronsLogMessage.Active(GridLogMessage.isActive()); + HadronsLogIterative.Active(GridLogIterative.isActive()); + HadronsLogDebug.Active(GridLogDebug.isActive()); + LOG(Message) << "Grid initialized" << std::endl; + + + // run setup /////////////////////////////////////////////////////////////// + Application application; + std::vector flavour = {"h"}; //{"l", "s", "c1", "c2", "c3"}; + std::vector mass = {.2}; //{.01, .04, .2 , .25 , .3 }; + std::vector lepton_flavour = {"mu"}; + std::vector lepton_mass = {.2}; + + unsigned int nt = GridDefaultLatt()[Tp]; + + // global parameters + Application::GlobalPar globalPar; + globalPar.trajCounter.start = 1500; + globalPar.trajCounter.end = 1520; + globalPar.trajCounter.step = 20; + globalPar.seed = "1 2 3 4"; + application.setPar(globalPar); + // gauge field + application.createModule("gauge"); + // unit gauge field for lepton + application.createModule("free_gauge"); + // pt source + MSource::Point::Par ptPar; + ptPar.position = "0 0 0 0"; + application.createModule("pt", ptPar); + // sink + MSink::Point::Par sinkPar; + sinkPar.mom = "0 0 0"; + application.createModule("sink", sinkPar); + + // set fermion boundary conditions to be periodic space, antiperiodic time. + std::string boundary = "1 1 1 -1"; + + + //Propagators from FFT and Feynman rules + for (unsigned int i = 0; i < lepton_mass.size(); ++i) + { + //DWF actions + MAction::DWF::Par actionPar_lep; + actionPar_lep.gauge = "free_gauge"; + actionPar_lep.Ls = 8; + actionPar_lep.M5 = 1.8; + actionPar_lep.mass = lepton_mass[i]; + actionPar_lep.boundary = boundary; + application.createModule("free_DWF_" + lepton_flavour[i], actionPar_lep); + + //DWF free propagators + MFermion::FreeProp::Par freePar; + freePar.source = "pt"; + freePar.action = "free_DWF_" + lepton_flavour[i]; + freePar.twist = "0 0 0 0.5"; + freePar.mass = lepton_mass[i]; + application.createModule("Lpt_" + lepton_flavour[i], + freePar); + + //Wilson actions + MAction::Wilson::Par actionPar_lep_W; + actionPar_lep_W.gauge = "free_gauge"; + actionPar_lep_W.mass = lepton_mass[i]; + actionPar_lep_W.boundary = boundary; + application.createModule("free_W_" + lepton_flavour[i], actionPar_lep_W); + + //Wilson free propagators + MFermion::FreeProp::Par freePar_W; + freePar_W.source = "pt"; + freePar_W.action = "free_W_" + lepton_flavour[i]; + freePar_W.twist = "0 0 0 0.5"; + freePar_W.mass = lepton_mass[i]; + application.createModule("W_Lpt_" + lepton_flavour[i], + freePar_W); + + + } + + + + //Propagators from inversion + for (unsigned int i = 0; i < flavour.size(); ++i) + { + //DWF actions + MAction::DWF::Par actionPar; + actionPar.gauge = "gauge"; + actionPar.Ls = 8; + actionPar.M5 = 1.8; + actionPar.mass = mass[i]; + actionPar.boundary = boundary; + application.createModule("DWF_" + flavour[i], actionPar); + + // solvers + MSolver::RBPrecCG::Par solverPar; + solverPar.action = "DWF_" + flavour[i]; + solverPar.residual = 1.0e-8; + solverPar.maxIteration = 10000; + application.createModule("CG_" + flavour[i], + solverPar); + + //DWF propagators + MFermion::GaugeProp::Par quarkPar; + quarkPar.solver = "CG_" + flavour[i]; + quarkPar.source = "pt"; + application.createModule("Qpt_" + flavour[i], + quarkPar); + + + + //Wilson actions + MAction::Wilson::Par actionPar_W; + actionPar_W.gauge = "gauge"; + actionPar_W.mass = mass[i]; + actionPar_W.boundary = boundary; + application.createModule("W_" + flavour[i], actionPar_W); + + + // solvers + MSolver::RBPrecCG::Par solverPar_W; + solverPar_W.action = "W_" + flavour[i]; + solverPar_W.residual = 1.0e-8; + solverPar_W.maxIteration = 10000; + application.createModule("W_CG_" + flavour[i], + solverPar_W); + + //Wilson propagators + MFermion::GaugeProp::Par quarkPar_W; + quarkPar_W.solver = "W_CG_" + flavour[i]; + quarkPar_W.source = "pt"; + application.createModule("W_Qpt_" + flavour[i], + quarkPar_W); + + } + + + //2pt contraction for Propagators from FFT and Feynman rules + for (unsigned int i = 0; i < lepton_flavour.size(); ++i) + for (unsigned int j = i; j < lepton_flavour.size(); ++j) + { + //2pt function contraction DWF + MContraction::Meson::Par freemesPar; + freemesPar.output = "2pt_free/DWF_L_pt_" + lepton_flavour[i] + lepton_flavour[j]; + freemesPar.q1 = "Lpt_" + lepton_flavour[i]; + freemesPar.q2 = "Lpt_" + lepton_flavour[j]; + freemesPar.gammas = "(Gamma5 Gamma5)"; + freemesPar.sink = "sink"; + application.createModule("meson_L_pt_" + + lepton_flavour[i] + lepton_flavour[j], + freemesPar); + + //2pt function contraction Wilson + MContraction::Meson::Par freemesPar_W; + freemesPar_W.output = "2pt_free/W_L_pt_" + lepton_flavour[i] + lepton_flavour[j]; + freemesPar_W.q1 = "W_Lpt_" + lepton_flavour[i]; + freemesPar_W.q2 = "W_Lpt_" + lepton_flavour[j]; + freemesPar_W.gammas = "(Gamma5 Gamma5)"; + freemesPar_W.sink = "sink"; + application.createModule("W_meson_L_pt_" + + lepton_flavour[i] + lepton_flavour[j], + freemesPar_W); + + } + + //2pt contraction for Propagators from inverion + for (unsigned int i = 0; i < flavour.size(); ++i) + for (unsigned int j = i; j < flavour.size(); ++j) + { + //2pt function contraction DWF + MContraction::Meson::Par mesPar; + mesPar.output = "2pt_free/DWF_pt_" + flavour[i] + flavour[j]; + mesPar.q1 = "Qpt_" + flavour[i]; + mesPar.q2 = "Qpt_" + flavour[j]; + mesPar.gammas = "(Gamma5 Gamma5)"; + mesPar.sink = "sink"; + application.createModule("meson_pt_" + + flavour[i] + flavour[j], + mesPar); + + + //2pt function contraction Wilson + MContraction::Meson::Par mesPar_W; + mesPar_W.output = "2pt_free/W_pt_" + flavour[i] + flavour[j]; + mesPar_W.q1 = "W_Qpt_" + flavour[i]; + mesPar_W.q2 = "W_Qpt_" + flavour[j]; + mesPar_W.gammas = "(Gamma5 Gamma5)"; + mesPar_W.sink = "sink"; + application.createModule("W_meson_pt_" + + flavour[i] + flavour[j], + mesPar_W); + + } + + + + // execution + application.saveParameterFile("free_prop.xml"); + application.run(); + + // epilogue + LOG(Message) << "Grid is finalizing now" << std::endl; + Grid_finalize(); + + return EXIT_SUCCESS; +} From dd6b796a01131123274517eaca8631b3b2b5c3af Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 3 May 2018 16:19:17 +0100 Subject: [PATCH 332/620] Hadrons: scalar SU(N) volume factor fix --- extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 1496edf9..8ee80242 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -83,7 +83,8 @@ private: // make 2-pt function template std::vector makeTwoPoint(const std::vector &sink, - const std::vector &source); + const std::vector &source, + const double factor = 1.); private: std::vector> mom_; }; @@ -200,7 +201,7 @@ void TTwoPoint::execute(void) { qt[nd - 1] = t; peekSite(buf, ftBuf, qt); - slicedOp[o][m][t] = TensorRemove(buf)/partVol; + slicedOp[o][m][t] = TensorRemove(buf); } } } @@ -213,7 +214,8 @@ void TTwoPoint::execute(void) r.sink = p.first; r.source = p.second; r.mom = mom_[m]; - r.data = makeTwoPoint(slicedOp[p.first][m], slicedOp[p.second][m]); + r.data = makeTwoPoint(slicedOp[p.first][m], slicedOp[p.second][m], + 1./partVol); result.push_back(r); } saveResult(par().output, "twopt", result); @@ -224,7 +226,8 @@ template template std::vector TTwoPoint::makeTwoPoint( const std::vector &sink, - const std::vector &source) + const std::vector &source, + const double factor) { assert(sink.size() == source.size()); @@ -237,7 +240,7 @@ std::vector TTwoPoint::makeTwoPoint( { res[dt] += sink[(t+dt)%nt]*adj(source[t]); } - res[dt] *= 1./static_cast(nt); + res[dt] *= factor/static_cast(nt); } return res; From bfbf2f1fa046f95c1813c65e627dc16d5263cd6b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 3 May 2018 16:20:01 +0100 Subject: [PATCH 333/620] no threaded stencil benchmark if OpenMP is not supported --- benchmarks/Benchmark_comms.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarks/Benchmark_comms.cc b/benchmarks/Benchmark_comms.cc index 304a09fc..6d95bbe2 100644 --- a/benchmarks/Benchmark_comms.cc +++ b/benchmarks/Benchmark_comms.cc @@ -450,7 +450,7 @@ int main (int argc, char ** argv) } - +#ifdef GRID_OMP std::cout< Date: Thu, 3 May 2018 16:40:16 +0100 Subject: [PATCH 334/620] Fix double vs float in boundary phases --- lib/qcd/action/fermion/DomainWallFermion.h | 4 ++-- lib/qcd/action/fermion/FermionOperator.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/qcd/action/fermion/DomainWallFermion.h b/lib/qcd/action/fermion/DomainWallFermion.h index 99f64865..56179f26 100644 --- a/lib/qcd/action/fermion/DomainWallFermion.h +++ b/lib/qcd/action/fermion/DomainWallFermion.h @@ -63,7 +63,7 @@ namespace Grid { LatticeCoordinate(coor, nu + shift); ph = ph + twist[nu]*coor*((1./(in._grid->_fdimensions[nu+shift]))); } - in_buf = exp((RealD)(2.0*M_PI)*ci*ph*(-1.0))*in; + in_buf = exp((Real)(2.0*M_PI)*ci*ph*(-1.0))*in; if(fiveD){//FFT only on temporal and spatial dimensions std::vector mask(Nd+1,1); mask[0] = 0; @@ -78,7 +78,7 @@ namespace Grid { } //phase for boundary condition - out = out * exp((RealD)(2.0*M_PI)*ci*ph); + out = out * exp((Real)(2.0*M_PI)*ci*ph); }; virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass,std::vector twist) { diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index 1ef99b85..f39e7511 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -115,14 +115,14 @@ namespace Grid { LatticeCoordinate(coor, nu); ph = ph + twist[nu]*coor*((1./(in._grid->_fdimensions[nu]))); } - in_buf = exp((RealD)(2.0*M_PI)*ci*ph*(-1.0))*in; + in_buf = exp((Real)(2.0*M_PI)*ci*ph*(-1.0))*in; theFFT.FFT_all_dim(in_k,in_buf,FFT::forward); this->MomentumSpacePropagator(prop_k,in_k,mass,twist); theFFT.FFT_all_dim(out,prop_k,FFT::backward); //phase for boundary condition - out = out * exp((RealD)(2.0*M_PI)*ci*ph); + out = out * exp((Real)(2.0*M_PI)*ci*ph); }; virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) { From 9ada378e38333f36039182cce8f795146c0e8302 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Fri, 4 May 2018 10:58:01 +0100 Subject: [PATCH 335/620] Add timing --- lib/algorithms/iterative/ConjugateGradientMultiShift.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/algorithms/iterative/ConjugateGradientMultiShift.h b/lib/algorithms/iterative/ConjugateGradientMultiShift.h index 28a80ce6..9d2719fc 100644 --- a/lib/algorithms/iterative/ConjugateGradientMultiShift.h +++ b/lib/algorithms/iterative/ConjugateGradientMultiShift.h @@ -207,7 +207,10 @@ void operator() (LinearOperatorBase &Linop, const Field &src, std::vector cp=c; MatrixTimer.Start(); - Linop.HermOpAndNorm(p,mmp,d,qq); + //Linop.HermOpAndNorm(p,mmp,d,qq); // d is used + Linop.HermOp(p,mmp); + d=real(innerProduct(p,mmp)); + MatrixTimer.Stop(); AXPYTimer.Start(); @@ -253,11 +256,9 @@ void operator() (LinearOperatorBase &Linop, const Field &src, std::vector // Before: 3 x npole + 3 x npole // After : 2 x npole (ps[s]) => 3x speed up of multishift CG. - AXPYTimer.Start(); if( (!converged[s]) ) { axpy(psi[ss],-bs[s]*alpha[s],ps[s],psi[ss]); } - AXPYTimer.Stop(); } // Convergence checks From 8634e19f1bf74948988f8985bf0e3cfef7d031ad Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 4 May 2018 14:13:35 +0100 Subject: [PATCH 336/620] Update --- tests/Test_compressed_lanczos_hot_start.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Test_compressed_lanczos_hot_start.cc b/tests/Test_compressed_lanczos_hot_start.cc index 3276d0f8..293506c2 100644 --- a/tests/Test_compressed_lanczos_hot_start.cc +++ b/tests/Test_compressed_lanczos_hot_start.cc @@ -167,7 +167,7 @@ int main (int argc, char ** argv) { RealD mass = Params.mass; RealD M5 = Params.M5; std::vector blockSize = Params.blockSize; - std::vector latt({16,16,16,16}); + std::vector latt({32,32,16,16}); uint64_t vol = Ls*latt[0]*latt[1]*latt[2]*latt[3]; double mat_flop= 2.0*1320.0*vol; // Grids From 4ad0df6fde7b888cfb25e68af0a8b68aada0831f Mon Sep 17 00:00:00 2001 From: paboyle Date: Fri, 4 May 2018 17:33:23 +0100 Subject: [PATCH 337/620] Bump volume for Gerardo --- tests/Test_compressed_lanczos_hot_start.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Test_compressed_lanczos_hot_start.cc b/tests/Test_compressed_lanczos_hot_start.cc index 293506c2..65f69c54 100644 --- a/tests/Test_compressed_lanczos_hot_start.cc +++ b/tests/Test_compressed_lanczos_hot_start.cc @@ -167,7 +167,7 @@ int main (int argc, char ** argv) { RealD mass = Params.mass; RealD M5 = Params.M5; std::vector blockSize = Params.blockSize; - std::vector latt({32,32,16,16}); + std::vector latt({32,32,32,32}); uint64_t vol = Ls*latt[0]*latt[1]*latt[2]*latt[3]; double mat_flop= 2.0*1320.0*vol; // Grids From 3252059dafed52add248b03b6277270f31bd7d8e Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 17:25:36 +0100 Subject: [PATCH 338/620] Hadrons: multi-file support for eigenpacks --- extras/Hadrons/EigenPack.hpp | 246 ++++++++++++------ .../Modules/MIO/LoadCoarseEigenPack.hpp | 3 +- extras/Hadrons/Modules/MIO/LoadEigenPack.hpp | 3 +- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 7 +- 4 files changed, 176 insertions(+), 83 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 976fba7b..6767e584 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -74,42 +74,47 @@ public: evec.resize(size, grid); } - virtual void read(const std::string fileStem, const int traj = -1) + virtual void read(const std::string fileStem, const bool multiFile, const int traj = -1) { - std::string evecFilename, evalFilename; - - makeFilenames(evecFilename, evalFilename, fileStem, traj); - XmlReader xmlReader(evalFilename); - LOG(Message) << "Reading " << eval.size() << " eigenvalues from '" - << evalFilename << "'" << std::endl; - Grid::read(xmlReader, "evals", eval); - basicRead(evec, evecFilename, evec.size()); + if (multiFile) + { + for(int k = 0; k < evec.size(); ++k) + { + basicReadSingle(evec[k], eval[k], evecFilename(fileStem, k, traj), k); + } + } + else + { + basicRead(evec, eval, evecFilename(fileStem, -1, traj), evec.size()); + } } - virtual void write(const std::string fileStem, const int traj = -1) + virtual void write(const std::string fileStem, const bool multiFile, const int traj = -1) { - std::string evecFilename, evalFilename; - - makeFilenames(evecFilename, evalFilename, fileStem, traj); - XmlWriter xmlWriter(evalFilename); - LOG(Message) << "Writing " << eval.size() << " eigenvalues to '" - << evalFilename << "'" << std::endl; - Grid::write(xmlWriter, "evals", eval); - basicWrite(evecFilename, evec, evec.size()); + if (multiFile) + { + for(int k = 0; k < evec.size(); ++k) + { + basicWriteSingle(evecFilename(fileStem, k, traj), evec[k], eval[k], k); + } + } + else + { + basicWrite(evecFilename(fileStem, -1, traj), evec, eval, evec.size()); + } } protected: - void makeFilenames(std::string &evecFilename, std::string &evalFilename, - const std::string stem, const int traj = -1) + std::string evecFilename(const std::string stem, const int vec, const int traj) { std::string t = (traj < 0) ? "" : ("." + std::to_string(traj)); + std::string v = (traj < 0) ? "" : (".v" + std::to_string(vec)); - evecFilename = stem + "_evec" + t + ".bin"; - evalFilename = stem + "_eval" + t + ".xml"; + return stem + "_evec" + t + v + ".bin"; } template - void basicRead(std::vector &evec, const std::string filename, - const unsigned int size) + void basicRead(std::vector &evec, std::vector &eval, + const std::string filename, const unsigned int size) { ScidacReader binReader; @@ -124,16 +129,38 @@ protected: if (vecRecord.index != k) { HADRONS_ERROR(Io, "Eigenvector " + std::to_string(k) + " has a" - + " wrong index (expected " + std::to_string(vecRecord.index) - + ") in file '" + filename + "'"); + + " wrong index (expected " + std::to_string(vecRecord.index) + + ") in file '" + filename + "'"); } + eval[k] = vecRecord.eval; } binReader.close(); } + template + void basicReadSingle(T &evec, double &eval, const std::string filename, + const unsigned int index) + { + ScidacReader binReader; + VecRecord vecRecord; + + binReader.open(filename); + binReader.skipPastObjectRecord(SCIDAC_FILE_XML); + LOG(Message) << "Reading eigenvector " << index << std::endl; + binReader.readScidacFieldRecord(evec, vecRecord); + if (vecRecord.index != index) + { + HADRONS_ERROR(Io, "Eigenvector " + std::to_string(index) + " has a" + + " wrong index (expected " + std::to_string(vecRecord.index) + + ") in file '" + filename + "'"); + } + eval = vecRecord.eval; + binReader.close(); + } + template void basicWrite(const std::string filename, std::vector &evec, - const unsigned int size) + const std::vector &eval, const unsigned int size) { ScidacWriter binWriter(evec[0]._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); @@ -153,6 +180,25 @@ protected: } binWriter.close(); } + + template + void basicWriteSingle(const std::string filename, T &evec, + const double eval, const unsigned int index) + { + ScidacWriter binWriter(evec._grid->IsBoss()); + XmlWriter xmlWriter("", "eigenPackPar"); + VecRecord vecRecord; + + xmlWriter.pushXmlString(record.operatorXml); + xmlWriter.pushXmlString(record.solverXml); + binWriter.open(filename); + binWriter.writeLimeObject(1, 1, xmlWriter, "parameters", SCIDAC_FILE_XML); + vecRecord.index = index; + vecRecord.eval = eval; + LOG(Message) << "Writing eigenvector " << index << std::endl; + binWriter.writeScidacFieldRecord(evec, vecRecord); + binWriter.close(); + } }; template @@ -181,77 +227,121 @@ public: evecCoarse.resize(sizeCoarse, gridCoarse); } - void readFine(const std::string fileStem, const int traj = -1) + void readFine(const std::string fileStem, const bool multiFile, const int traj = -1) { - std::string evecFineFilename, evalFineFilename; - std::string evecCoarseFilename, evalCoarseFilename; + // std::string evecFineFilename, evalFineFilename; + // std::string evecCoarseFilename, evalCoarseFilename; - this->makeFilenames(evecFineFilename, evalFineFilename, - fileStem + "_fine", traj); - XmlReader xmlFineReader(evalFineFilename); - LOG(Message) << "Reading " << this->eval.size() << " fine eigenvalues from '" - << evalFineFilename << "'" << std::endl; - Grid::read(xmlFineReader, "evals", this->eval); - LOG(Message) << "Reading " << this->evec.size() << " fine eigenvectors from '" - << evecFineFilename << "'" << std::endl; - this->basicRead(this->evec, evecFineFilename, this->evec.size()); + // this->makeFilenames(evecFineFilename, evalFineFilename, + // fileStem + "_fine", traj); + // XmlReader xmlFineReader(evalFineFilename); + // LOG(Message) << "Reading " << this->eval.size() << " fine eigenvalues from '" + // << evalFineFilename << "'" << std::endl; + // Grid::read(xmlFineReader, "evals", this->eval); + // LOG(Message) << "Reading " << this->evec.size() << " fine eigenvectors from '" + // << evecFineFilename << "'" << std::endl; + // this->basicRead(this->evec, evecFineFilename, this->evec.size()); + if (multiFile) + { + for(int k = 0; k < this->evec.size(); ++k) + { + this->basicReadSingle(this->evec[k], this->eval[k], this->evecFilename(fileStem + "_fine", k, traj), k); + } + } + else + { + this->basicRead(this->evec, this->eval, this->evecFilename(fileStem + "_fine", -1, traj), this->evec.size()); + } } - void readCoarse(const std::string fileStem, const int traj = -1) + void readCoarse(const std::string fileStem, const bool multiFile, const int traj = -1) { - std::string evecCoarseFilename, evalCoarseFilename; + // std::string evecCoarseFilename, evalCoarseFilename; - this->makeFilenames(evecCoarseFilename, evalCoarseFilename, - fileStem + "_coarse", traj); - XmlReader xmlCoarseReader(evalCoarseFilename); - LOG(Message) << "Reading " << evalCoarse.size() << " coarse eigenvalues from '" - << evalCoarseFilename << "'" << std::endl; - Grid::read(xmlCoarseReader, "evals", evalCoarse); - LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" - << evecCoarseFilename << "'" << std::endl; - this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); + // this->makeFilenames(evecCoarseFilename, evalCoarseFilename, + // fileStem + "_coarse", traj); + // XmlReader xmlCoarseReader(evalCoarseFilename); + // LOG(Message) << "Reading " << evalCoarse.size() << " coarse eigenvalues from '" + // << evalCoarseFilename << "'" << std::endl; + // Grid::read(xmlCoarseReader, "evals", evalCoarse); + // LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" + // << evecCoarseFilename << "'" << std::endl; + // this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); + if (multiFile) + { + for(int k = 0; k < evecCoarse.size(); ++k) + { + this->basicReadSingle(evecCoarse[k], evalCoarse[k], this->evecFilename(fileStem + "_coarse", k, traj), k); + } + } + else + { + this->basicRead(evecCoarse, evalCoarse, this->evecFilename(fileStem + "_coarse", -1, traj), evecCoarse.size()); + } } - virtual void read(const std::string fileStem, const int traj = -1) + virtual void read(const std::string fileStem, const bool multiFile, const int traj = -1) { - readFine(fileStem, traj); - readCoarse(fileStem, traj); + readFine(fileStem, multiFile, traj); + readCoarse(fileStem, multiFile, traj); } - void writeFine(const std::string fileStem, const int traj = -1) + void writeFine(const std::string fileStem, const bool multiFile, const int traj = -1) { - std::string evecFineFilename, evalFineFilename; + // std::string evecFineFilename, evalFineFilename; - this->makeFilenames(evecFineFilename, evalFineFilename, - fileStem + "_fine", traj); - XmlWriter xmlFineWriter(evalFineFilename); - LOG(Message) << "Writing " << this->eval.size() << " fine eigenvalues to '" - << evalFineFilename << "'" << std::endl; - Grid::write(xmlFineWriter, "evals", this->eval); - LOG(Message) << "Writing " << this->evec.size() << " fine eigenvectors to '" - << evecFineFilename << "'" << std::endl; - this->basicWrite(evecFineFilename, this->evec, this->evec.size()); + // this->makeFilenames(evecFineFilename, evalFineFilename, + // fileStem + "_fine", traj); + // XmlWriter xmlFineWriter(evalFineFilename); + // LOG(Message) << "Writing " << this->eval.size() << " fine eigenvalues to '" + // << evalFineFilename << "'" << std::endl; + // Grid::write(xmlFineWriter, "evals", this->eval); + // LOG(Message) << "Writing " << this->evec.size() << " fine eigenvectors to '" + // << evecFineFilename << "'" << std::endl; + // this->basicWrite(evecFineFilename, this->evec, this->evec.size()); + if (multiFile) + { + for(int k = 0; k < this->evec.size(); ++k) + { + this->basicWriteSingle(this->evecFilename(fileStem + "_fine", k, traj), this->evec[k], this->eval[k], k); + } + } + else + { + this->basicWrite(this->evecFilename(fileStem + "_fine", -1, traj), this->evec, this->eval, this->evec.size()); + } } - void writeCoarse(const std::string fileStem, const int traj = -1) + void writeCoarse(const std::string fileStem, const bool multiFile, const int traj = -1) { - std::string evecCoarseFilename, evalCoarseFilename; + // std::string evecCoarseFilename, evalCoarseFilename; - this->makeFilenames(evecCoarseFilename, evalCoarseFilename, - fileStem + "_coarse", traj); - XmlWriter xmlCoarseWriter(evalCoarseFilename); - LOG(Message) << "Writing " << evalCoarse.size() << " coarse eigenvalues to '" - << evalCoarseFilename << "'" << std::endl; - Grid::write(xmlCoarseWriter, "evals", evalCoarse); - LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" - << evecCoarseFilename << "'" << std::endl; - this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); + // this->makeFilenames(evecCoarseFilename, evalCoarseFilename, + // fileStem + "_coarse", traj); + // XmlWriter xmlCoarseWriter(evalCoarseFilename); + // LOG(Message) << "Writing " << evalCoarse.size() << " coarse eigenvalues to '" + // << evalCoarseFilename << "'" << std::endl; + // Grid::write(xmlCoarseWriter, "evals", evalCoarse); + // LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" + // << evecCoarseFilename << "'" << std::endl; + // this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); + if (multiFile) + { + for(int k = 0; k < evecCoarse.size(); ++k) + { + this->basicWriteSingle(this->evecFilename(fileStem + "_coarse", k, traj), evecCoarse[k], evalCoarse[k], k); + } + } + else + { + this->basicWrite(this->evecFilename(fileStem + "_coarse", -1, traj), evecCoarse, evalCoarse, evecCoarse.size()); + } } - virtual void write(const std::string fileStem, const int traj = -1) + virtual void write(const std::string fileStem, const bool multiFile, const int traj = -1) { - writeFine(fileStem, traj); - writeCoarse(fileStem, traj); + writeFine(fileStem, multiFile, traj); + writeCoarse(fileStem, multiFile, traj); } }; diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp index 6661f3cc..945b6751 100644 --- a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp @@ -45,6 +45,7 @@ class LoadCoarseEigenPackPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(LoadCoarseEigenPackPar, std::string, filestem, + bool, multiFile, unsigned int, sizeFine, unsigned int, sizeCoarse, unsigned int, Ls, @@ -120,7 +121,7 @@ void TLoadCoarseEigenPack::execute(void) auto &epack = envGetDerived(BasePack, Pack, getName()); Lattice dummy(cg); - epack.read(par().filestem, vm().getTrajectory()); + epack.read(par().filestem, par().multiFile, vm().getTrajectory()); LOG(Message) << "Block Gramm-Schmidt pass 1"<< std::endl; blockOrthogonalise(dummy, epack.evec); LOG(Message) << "Block Gramm-Schmidt pass 2"<< std::endl; diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp index a95bc51e..fcad4107 100644 --- a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp +++ b/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp @@ -45,6 +45,7 @@ class LoadEigenPackPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(LoadEigenPackPar, std::string, filestem, + bool, multiFile, unsigned int, size, unsigned int, Ls); }; @@ -111,7 +112,7 @@ void TLoadEigenPack::execute(void) { auto &epack = envGetDerived(BasePack, Pack, getName()); - epack.read(par().filestem, vm().getTrajectory()); + epack.read(par().filestem, par().multiFile, vm().getTrajectory()); epack.eval.resize(par().size); } diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index b4bad7b5..c9088cf4 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -51,7 +51,8 @@ public: ChebyParams, smoother, RealD, coarseRelaxTol, std::string, blockSize, - std::string, output); + std::string, output, + bool, multiFile); }; template @@ -156,7 +157,7 @@ void TLocalCoherenceLanczos::execute(void) solver.testFine(finePar.resid*100.0); if (!par().output.empty()) { - epack.writeFine(par().output, vm().getTrajectory()); + epack.writeFine(par().output, par().multiFile, vm().getTrajectory()); } if (par().doCoarse) { @@ -173,7 +174,7 @@ void TLocalCoherenceLanczos::execute(void) par().coarseRelaxTol); if (!par().output.empty()) { - epack.writeCoarse(par().output, vm().getTrajectory()); + epack.writeCoarse(par().output, par().multiFile, vm().getTrajectory()); } } } From 3c7a4106ed20d92f4352cdb6e3394c2a8762ba44 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 17:26:39 +0100 Subject: [PATCH 339/620] Trap for deadly empty comm thread option --- lib/util/Init.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/util/Init.cc b/lib/util/Init.cc index 45a37a02..7dc8230e 100644 --- a/lib/util/Init.cc +++ b/lib/util/Init.cc @@ -385,6 +385,7 @@ void Grid_init(int *argc,char ***argv) if( GridCmdOptionExists(*argv,*argv+*argc,"--comms-threads") ){ arg= GridCmdOptionPayload(*argv,*argv+*argc,"--comms-threads"); GridCmdOptionInt(arg,CartesianCommunicator::nCommThreads); + assert(CartesianCommunicator::nCommThreads > 0); } if( GridCmdOptionExists(*argv,*argv+*argc,"--cacheblocking") ){ arg= GridCmdOptionPayload(*argv,*argv+*argc,"--cacheblocking"); From 27a4d4c951e261de26a23449919ddc6e2ff6e50e Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 17:52:54 +0100 Subject: [PATCH 340/620] Hadrons: multi-file eigenpack in separate directory --- extras/Hadrons/EigenPack.hpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 6767e584..83dccf93 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -107,9 +107,15 @@ protected: std::string evecFilename(const std::string stem, const int vec, const int traj) { std::string t = (traj < 0) ? "" : ("." + std::to_string(traj)); - std::string v = (traj < 0) ? "" : (".v" + std::to_string(vec)); - return stem + "_evec" + t + v + ".bin"; + if (vec == -1) + { + return stem + t + ".bin"; + } + else + { + return stem + t + "/v" + std::to_string(vec) + ".bin"; + } } template @@ -163,8 +169,13 @@ protected: const std::vector &eval, const unsigned int size) { ScidacWriter binWriter(evec[0]._grid->IsBoss()); - XmlWriter xmlWriter("", "eigenPackPar"); + XmlWriter xmlWriter("", "eigenPackPar"); + std::string d = dirname(filename); + if (mkdir(d)) + { + HADRONS_ERROR(Io, "cannot create directory '" + d + "'");\ + } xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); binWriter.open(filename); @@ -188,7 +199,12 @@ protected: ScidacWriter binWriter(evec._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); VecRecord vecRecord; + std::string d = dirname(filename); + if (mkdir(d)) + { + HADRONS_ERROR(Io, "cannot create directory '" + d + "'");\ + } xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); binWriter.open(filename); From 2017e4e3b4f16dda1c3ed3735925e18f7d08d52f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 18:12:22 +0100 Subject: [PATCH 341/620] Hadrons: more verbose directory creation error --- extras/Hadrons/EigenPack.hpp | 16 ++++++++++------ extras/Hadrons/Module.hpp | 6 ++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 83dccf93..d1f6e829 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -170,11 +170,13 @@ protected: { ScidacWriter binWriter(evec[0]._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); - std::string d = dirname(filename); + std::string d = dirname(filename); + int status = mkdir(d); - if (mkdir(d)) + if (status) { - HADRONS_ERROR(Io, "cannot create directory '" + d + "'");\ + HADRONS_ERROR(Io, "cannot create directory '" + d + + "' (status " + std::to_string(status) + ")"); } xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); @@ -199,11 +201,13 @@ protected: ScidacWriter binWriter(evec._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); VecRecord vecRecord; - std::string d = dirname(filename); + std::string d = dirname(filename); + int status = mkdir(d); - if (mkdir(d)) + if (status) { - HADRONS_ERROR(Io, "cannot create directory '" + d + "'");\ + HADRONS_ERROR(Io, "cannot create directory '" + d + + "' (status " + std::to_string(status) + ")"); } xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 7f8b7796..0fe6858d 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -123,10 +123,12 @@ MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__) if (env().getGrid()->IsBoss())\ {\ std::string _dirname = dirname(ioStem);\ + int _status = mkdir(_dirname);\ \ - if (mkdir(_dirname))\ + if (_status)\ {\ - HADRONS_ERROR(Io, "cannot create directory '" + _dirname + "'");\ + HADRONS_ERROR(Io, "cannot create directory '" + _dirname \ + + "' (status " + std::to_string(_status) + ")");\ }\ {\ ResultWriter _writer(RESULT_FILE_NAME(ioStem));\ From c24d53bbd19d1e55370de9d6f15b7542cbe46ac8 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 7 May 2018 18:55:05 +0100 Subject: [PATCH 342/620] Further debug of RNG I/O --- lib/parallelIO/BinaryIO.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/parallelIO/BinaryIO.h b/lib/parallelIO/BinaryIO.h index 08b7b9b4..a60fe962 100644 --- a/lib/parallelIO/BinaryIO.h +++ b/lib/parallelIO/BinaryIO.h @@ -431,14 +431,20 @@ PARALLEL_CRITICAL MPI_Abort(MPI_COMM_WORLD, 1); //assert(ierr == 0); } - std::cout << GridLogDebug << "MPI read I/O set view " << file << std::endl; + std::cout << GridLogDebug << "MPI write I/O set view " << file << std::endl; ierr = MPI_File_set_view(fh, disp, mpiObject, fileArray, "native", MPI_INFO_NULL); assert(ierr == 0); - std::cout << GridLogDebug << "MPI read I/O write all " << file << std::endl; + std::cout << GridLogDebug << "MPI write I/O write all " << file << std::endl; ierr = MPI_File_write_all(fh, &iodata[0], 1, localArray, &status); assert(ierr == 0); + MPI_Offset os; + MPI_File_get_position(fh, &os); + MPI_File_get_byte_offset(fh, os, &disp); + offset = disp; + + MPI_File_close(&fh); MPI_Type_free(&fileArray); MPI_Type_free(&localArray); @@ -448,7 +454,7 @@ PARALLEL_CRITICAL } else { std::cout << GridLogMessage << "IOobject: C++ write I/O " << file << " : " - << iodata.size() * sizeof(fobj) << " bytes" << std::endl; + << iodata.size() * sizeof(fobj) << " bytes and offset " << offset << std::endl; std::ofstream fout; fout.exceptions ( std::fstream::failbit | std::fstream::badbit ); From f362c007393f1a920e004431deb3d4f35157d805 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 19:43:40 +0100 Subject: [PATCH 343/620] Hadrons: better handling of automatic directory creation --- extras/Hadrons/EigenPack.hpp | 16 ++-------------- extras/Hadrons/Global.cc | 15 +++++++++++++++ extras/Hadrons/Global.hpp | 1 + extras/Hadrons/Module.hpp | 9 +-------- 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index d1f6e829..fc68a5ed 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -170,14 +170,8 @@ protected: { ScidacWriter binWriter(evec[0]._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); - std::string d = dirname(filename); - int status = mkdir(d); - if (status) - { - HADRONS_ERROR(Io, "cannot create directory '" + d - + "' (status " + std::to_string(status) + ")"); - } + makeFileDir(filename, evec[0]._grid); xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); binWriter.open(filename); @@ -201,14 +195,8 @@ protected: ScidacWriter binWriter(evec._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); VecRecord vecRecord; - std::string d = dirname(filename); - int status = mkdir(d); - if (status) - { - HADRONS_ERROR(Io, "cannot create directory '" + d - + "' (status " + std::to_string(status) + ")"); - } + makeFileDir(filename, evec._grid); xmlWriter.pushXmlString(record.operatorXml); xmlWriter.pushXmlString(record.solverXml); binWriter.open(filename); diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 82bd8eba..26b74a6f 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -158,3 +158,18 @@ std::string Hadrons::dirname(const std::string &s) return ""; } } + +void Hadrons::makeFileDir(const std::string filename, GridBase *g) +{ + if (g->IsBoss()) + { + std::string dir = dirname(filename); + int status = mkdir(dir); + + if (status) + { + HADRONS_ERROR(Io, "cannot create directory '" + dir + + "' ( " + std::strerror(errno) + ")"); + } + } +} diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 433dcd21..bc0be474 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -192,6 +192,7 @@ name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt int mkdir(const std::string dirName); std::string basename(const std::string &s); std::string dirname(const std::string &s); +void makeFileDir(const std::string filename, GridBase *g); // default Schur convention #ifndef HADRONS_DEFAULT_SCHUR diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 0fe6858d..dd038a21 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -122,14 +122,7 @@ MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__) #define saveResult(ioStem, name, result)\ if (env().getGrid()->IsBoss())\ {\ - std::string _dirname = dirname(ioStem);\ - int _status = mkdir(_dirname);\ - \ - if (_status)\ - {\ - HADRONS_ERROR(Io, "cannot create directory '" + _dirname \ - + "' (status " + std::to_string(_status) + ")");\ - }\ + makeFileDir(ioStem, env().getGrid());\ {\ ResultWriter _writer(RESULT_FILE_NAME(ioStem));\ write(_writer, name, result);\ From 25828746f377b528198efd2ae03c61f25c6e7e20 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 21:04:31 +0100 Subject: [PATCH 344/620] XML precision scientific with 16 digits by default --- lib/serialisation/XmlIO.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/serialisation/XmlIO.h b/lib/serialisation/XmlIO.h index eaa8174b..792505d4 100644 --- a/lib/serialisation/XmlIO.h +++ b/lib/serialisation/XmlIO.h @@ -103,7 +103,8 @@ namespace Grid { std::ostringstream os; - os << std::boolalpha << x; + os.precision(16); + os << std::scientific << std::boolalpha << x; pugi::xml_node leaf = node_.append_child(s.c_str()); leaf.append_child(pugi::node_pcdata).set_value(os.str().c_str()); } From 54d789204fec8478eedd936f9a6d10e4ce5d13dd Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 21:17:46 +0100 Subject: [PATCH 345/620] more general implementation of the precision interface for serialisers --- lib/serialisation/BaseIO.h | 32 +++++++++++++++++++++++++++++++- lib/serialisation/XmlIO.h | 11 +++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/lib/serialisation/BaseIO.h b/lib/serialisation/BaseIO.h index bc178e0d..dd15e7da 100644 --- a/lib/serialisation/BaseIO.h +++ b/lib/serialisation/BaseIO.h @@ -60,8 +60,14 @@ namespace Grid { void write(const std::string &s, const iVector &output); template void write(const std::string &s, const iMatrix &output); + void scientificFormat(const bool set); + bool isScientific(void); + void setPrecision(const unsigned int prec); + unsigned int getPrecision(void); private: - T *upcast; + T *upcast; + bool scientific_{false}; + unsigned int prec_{0}; }; // Static abstract reader @@ -155,6 +161,30 @@ namespace Grid { { upcast->writeDefault(s, tensorToVec(output)); } + + template + void Writer::scientificFormat(const bool set) + { + scientific_ = set; + } + + template + bool Writer::isScientific(void) + { + return scientific_; + } + + template + void Writer::setPrecision(const unsigned int prec) + { + prec_ = prec; + } + + template + unsigned int Writer::getPrecision(void) + { + return prec_; + } // Reader template implementation template diff --git a/lib/serialisation/XmlIO.h b/lib/serialisation/XmlIO.h index 792505d4..17ccb32e 100644 --- a/lib/serialisation/XmlIO.h +++ b/lib/serialisation/XmlIO.h @@ -103,8 +103,15 @@ namespace Grid { std::ostringstream os; - os.precision(16); - os << std::scientific << std::boolalpha << x; + if (getPrecision()) + { + os.precision(getPrecision()); + } + if (isScientific()) + { + os << std::scientific; + } + os << std::boolalpha << x; pugi::xml_node leaf = node_.append_child(s.c_str()); leaf.append_child(pugi::node_pcdata).set_value(os.str().c_str()); } From 899f961d0d6d53b9e441d296f26c2e1603c023cb Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 21:37:03 +0100 Subject: [PATCH 346/620] Hadrons: eigenvalue metadata saved with 16 significant digits --- extras/Hadrons/EigenPack.hpp | 47 +----------------------------------- extras/Hadrons/Global.hpp | 4 +++ lib/parallelIO/IldgIO.h | 12 ++++++--- 3 files changed, 14 insertions(+), 49 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index fc68a5ed..92901138 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -204,7 +204,7 @@ protected: vecRecord.index = index; vecRecord.eval = eval; LOG(Message) << "Writing eigenvector " << index << std::endl; - binWriter.writeScidacFieldRecord(evec, vecRecord); + binWriter.writeScidacFieldRecord(evec, vecRecord, DEFAULT_ASCII_PREC); binWriter.close(); } }; @@ -237,18 +237,6 @@ public: void readFine(const std::string fileStem, const bool multiFile, const int traj = -1) { - // std::string evecFineFilename, evalFineFilename; - // std::string evecCoarseFilename, evalCoarseFilename; - - // this->makeFilenames(evecFineFilename, evalFineFilename, - // fileStem + "_fine", traj); - // XmlReader xmlFineReader(evalFineFilename); - // LOG(Message) << "Reading " << this->eval.size() << " fine eigenvalues from '" - // << evalFineFilename << "'" << std::endl; - // Grid::read(xmlFineReader, "evals", this->eval); - // LOG(Message) << "Reading " << this->evec.size() << " fine eigenvectors from '" - // << evecFineFilename << "'" << std::endl; - // this->basicRead(this->evec, evecFineFilename, this->evec.size()); if (multiFile) { for(int k = 0; k < this->evec.size(); ++k) @@ -264,17 +252,6 @@ public: void readCoarse(const std::string fileStem, const bool multiFile, const int traj = -1) { - // std::string evecCoarseFilename, evalCoarseFilename; - - // this->makeFilenames(evecCoarseFilename, evalCoarseFilename, - // fileStem + "_coarse", traj); - // XmlReader xmlCoarseReader(evalCoarseFilename); - // LOG(Message) << "Reading " << evalCoarse.size() << " coarse eigenvalues from '" - // << evalCoarseFilename << "'" << std::endl; - // Grid::read(xmlCoarseReader, "evals", evalCoarse); - // LOG(Message) << "Reading " << evecCoarse.size() << " coarse eigenvectors from '" - // << evecCoarseFilename << "'" << std::endl; - // this->basicRead(evecCoarse, evecCoarseFilename, evecCoarse.size()); if (multiFile) { for(int k = 0; k < evecCoarse.size(); ++k) @@ -296,17 +273,6 @@ public: void writeFine(const std::string fileStem, const bool multiFile, const int traj = -1) { - // std::string evecFineFilename, evalFineFilename; - - // this->makeFilenames(evecFineFilename, evalFineFilename, - // fileStem + "_fine", traj); - // XmlWriter xmlFineWriter(evalFineFilename); - // LOG(Message) << "Writing " << this->eval.size() << " fine eigenvalues to '" - // << evalFineFilename << "'" << std::endl; - // Grid::write(xmlFineWriter, "evals", this->eval); - // LOG(Message) << "Writing " << this->evec.size() << " fine eigenvectors to '" - // << evecFineFilename << "'" << std::endl; - // this->basicWrite(evecFineFilename, this->evec, this->evec.size()); if (multiFile) { for(int k = 0; k < this->evec.size(); ++k) @@ -322,17 +288,6 @@ public: void writeCoarse(const std::string fileStem, const bool multiFile, const int traj = -1) { - // std::string evecCoarseFilename, evalCoarseFilename; - - // this->makeFilenames(evecCoarseFilename, evalCoarseFilename, - // fileStem + "_coarse", traj); - // XmlWriter xmlCoarseWriter(evalCoarseFilename); - // LOG(Message) << "Writing " << evalCoarse.size() << " coarse eigenvalues to '" - // << evalCoarseFilename << "'" << std::endl; - // Grid::write(xmlCoarseWriter, "evals", evalCoarse); - // LOG(Message) << "Writing " << evecCoarse.size() << " coarse eigenvectors to '" - // << evecCoarseFilename << "'" << std::endl; - // this->basicWrite(evecCoarseFilename, evecCoarse, evecCoarse.size()); if (multiFile) { for(int k = 0; k < evecCoarse.size(); ++k) diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index bc0be474..72fbdf80 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -39,6 +39,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #define SITE_SIZE_TYPE size_t #endif +#ifndef DEFAULT_ASCII_PREC +#define DEFAULT_ASCII_PREC 16 +#endif + #define BEGIN_HADRONS_NAMESPACE \ namespace Grid {\ using namespace QCD;\ diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index 3eb55d7d..0bfa7b9e 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -340,10 +340,15 @@ class GridLimeWriter : public BinaryIO } template - void writeLimeObject(int MB,int ME,serialisable_object &object,std::string object_name,std::string record_name) + void writeLimeObject(int MB,int ME,serialisable_object &object,std::string object_name,std::string record_name, const unsigned int scientificPrec = 0) { XmlWriter WR("",""); + if (scientificPrec) + { + WR.scientificFormat(true); + WR.setPrecision(scientificPrec); + } write(WR,object_name,object); writeLimeObject(MB, ME, WR, object_name, record_name); } @@ -453,7 +458,8 @@ class ScidacWriter : public GridLimeWriter { // Write generic lattice field in scidac format //////////////////////////////////////////////// template - void writeScidacFieldRecord(Lattice &field,userRecord _userRecord) + void writeScidacFieldRecord(Lattice &field,userRecord _userRecord, + const unsigned int recordScientificPrec = 0) { GridBase * grid = field._grid; @@ -471,7 +477,7 @@ class ScidacWriter : public GridLimeWriter { ////////////////////////////////////////////// if ( this->boss_node ) { writeLimeObject(1,0,header ,std::string("FieldMetaData"),std::string(GRID_FORMAT)); // Open message - writeLimeObject(0,0,_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML)); + writeLimeObject(0,0,_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML), recordScientificPrec); writeLimeObject(0,0,_scidacRecord,_scidacRecord.SerialisableClassName(),std::string(SCIDAC_PRIVATE_RECORD_XML)); } // Collective call From 9ad580d82f2d479d0020bfde8c87f5209dea1b60 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 7 May 2018 21:38:15 +0100 Subject: [PATCH 347/620] Hadrons: format fix --- extras/Hadrons/EigenPack.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 92901138..4169cba1 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -183,7 +183,7 @@ protected: vecRecord.index = k; vecRecord.eval = eval[k]; LOG(Message) << "Writing eigenvector " << k << std::endl; - binWriter.writeScidacFieldRecord(evec[k], vecRecord); + binWriter.writeScidacFieldRecord(evec[k], vecRecord, DEFAULT_ASCII_PREC); } binWriter.close(); } From 93771f30998d8876f786ee8fd9a2db1d77307f63 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 10 May 2018 22:29:48 +0100 Subject: [PATCH 348/620] Hadrons: scalar SU(N) stochastic free field --- extras/Hadrons/Modules.hpp | 31 +--- .../Modules/MScalarSUN/StochFreeField.cc | 11 ++ .../Modules/MScalarSUN/StochFreeField.hpp | 136 ++++++++++++++++++ extras/Hadrons/modules.inc | 2 + 4 files changed, 150 insertions(+), 30 deletions(-) create mode 100644 extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index fc536393..1a18eb3a 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,33 +1,3 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Guido Cossu -Author: Lanny91 -Author: pretidav - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ #include #include #include @@ -61,6 +31,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc new file mode 100644 index 00000000..0be90022 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc @@ -0,0 +1,11 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TStochFreeField>; +template class Grid::Hadrons::MScalarSUN::TStochFreeField>; +template class Grid::Hadrons::MScalarSUN::TStochFreeField>; +template class Grid::Hadrons::MScalarSUN::TStochFreeField>; +template class Grid::Hadrons::MScalarSUN::TStochFreeField>; diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp new file mode 100644 index 00000000..0dcd0177 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -0,0 +1,136 @@ +#ifndef Hadrons_MScalarSUN_StochFreeField_hpp_ +#define Hadrons_MScalarSUN_StochFreeField_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * stochastic free SU(N) scalar field * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class StochFreeFieldPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(StochFreeFieldPar, + double, m2, + double, g); +}; + +template +class TStochFreeField: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + typedef typename SImpl::Group Group; + typedef typename Group::LatticeAlgebraVector AlgebraField; +public: + // constructor + TStochFreeField(const std::string name); + // destructor + virtual ~TStochFreeField(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + bool create_weight; +}; + +MODULE_REGISTER_TMP(StochFreeFieldSU2, TStochFreeField>, MScalarSUN); +MODULE_REGISTER_TMP(StochFreeFieldSU3, TStochFreeField>, MScalarSUN); +MODULE_REGISTER_TMP(StochFreeFieldSU4, TStochFreeField>, MScalarSUN); +MODULE_REGISTER_TMP(StochFreeFieldSU5, TStochFreeField>, MScalarSUN); +MODULE_REGISTER_TMP(StochFreeFieldSU6, TStochFreeField>, MScalarSUN); + +/****************************************************************************** + * TStochFreeField implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TStochFreeField::TStochFreeField(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TStochFreeField::getInput(void) +{ + std::vector in; + + return in; +} + +template +std::vector TStochFreeField::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TStochFreeField::setup(void) +{ + create_weight = false; + if (!env().hasCreatedObject("_" + getName() + "_weight")) + { + envCacheLat(ComplexField, "_" + getName() + "_weight"); + create_weight = true; + } + envTmpLat(Field, "phift"); + envCreateLat(Field, getName()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TStochFreeField::execute(void) +{ + LOG(Message) << "Generating stochastic scalar field" << std::endl; + + const unsigned int N = Group::Dimension; + const unsigned int Nadj = Group::AdjointDimension; + auto &phi = envGet(Field, getName()); + auto &w = envGet(ComplexField, "_" + getName() + "_weight"); + auto &rng = *env().get4dRng(); + double trphi2; + FFT fft(env().getGrid()); + Integer vol; + + vol = 1; + for(int d = 0; d < env().getNd(); d++) + { + vol = vol*env().getDim(d); + } + if (create_weight) + { + LOG(Message) << "Caching momentum-space scalar action" << std::endl; + + SImpl::MomentumSpacePropagator(w, sqrt(par().m2)); + w *= par().g/N; + w = sqrt(vol*real(w)); + } + LOG(Message) << "Generating random momentum-space field" << std::endl; + envGetTmp(Field, phift); + Group::GaussianFundamentalLieAlgebraMatrix(rng, phift); + phift *= w; + LOG(Message) << "Field Fourier transform" << std::endl; + fft.FFT_all_dim(phi, phift, FFT::backward); + phi = (1./sqrt(2.))*(phi - adj(phi)); + trphi2 = -TensorRemove(sum(trace(phi*phi))).real()/vol; + LOG(Message) << "tr(phi^2)= " << trphi2 << std::endl; +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_StochFreeField_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index ad3a8727..c2e84086 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -37,6 +37,7 @@ modules_cc =\ Modules/MScalarSUN/EMT.cc \ Modules/MScalarSUN/ShiftProbe.cc \ Modules/MScalarSUN/TransProj.cc \ + Modules/MScalarSUN/StochFreeField.cc \ Modules/MScalarSUN/TwoPoint.cc \ Modules/MScalarSUN/Div.cc \ Modules/MIO/LoadEigenPack.cc \ @@ -78,6 +79,7 @@ modules_hpp =\ Modules/MAction/Wilson.hpp \ Modules/MAction/WilsonClover.hpp \ Modules/MAction/ZMobiusDWF.hpp \ + Modules/MScalarSUN/StochFreeField.hpp \ Modules/MScalarSUN/ShiftProbe.hpp \ Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TrMag.hpp \ From f871fb0c6dbd46dcc7ebb296bfd6297a5178b440 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 11 May 2018 18:06:28 +0100 Subject: [PATCH 349/620] check file is opened correctly in the Lime reader --- lib/parallelIO/IldgIO.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/parallelIO/IldgIO.h b/lib/parallelIO/IldgIO.h index 90c05546..33af6c3d 100644 --- a/lib/parallelIO/IldgIO.h +++ b/lib/parallelIO/IldgIO.h @@ -182,6 +182,11 @@ class GridLimeReader : public BinaryIO { { filename= _filename; File = fopen(filename.c_str(), "r"); + if (File == nullptr) + { + std::cerr << "cannot open file '" << filename << "'" << std::endl; + abort(); + } LimeR = limeCreateReader(File); } ///////////////////////////////////////////// From 5e3be47117534384cffbc4e8461f4ef176c6a42e Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 14 May 2018 18:58:39 +0100 Subject: [PATCH 350/620] Hadrons: scalar SU(N) various fixes --- extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 10 +++++----- extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index cd7c15eb..edd38e42 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -40,7 +40,7 @@ BEGIN_HADRONS_NAMESPACE ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) -typedef std::pair ShiftPair; +typedef std::pair ShiftPair; class ShiftProbePar: Serializable { @@ -127,7 +127,7 @@ void TShiftProbe::execute(void) << std::endl; std::vector shift; - unsigned int sign; + double sign; auto &phi = envGet(Field, par().field); auto &probe = envGet(ComplexField, getName()); @@ -136,7 +136,7 @@ void TShiftProbe::execute(void) { HADRONS_ERROR(Size, "the number of shifts is odd"); } - sign = (shift.size() % 4 == 0) ? 1 : -1; + sign = (shift.size() % 4 == 0) ? 1. : -1.; for (auto &s: shift) { if (s.first >= env().getNd()) @@ -147,7 +147,7 @@ void TShiftProbe::execute(void) } } envGetTmp(Field, acc); - acc = 1.; + acc = 1.; for (unsigned int i = 0; i < shift.size(); ++i) { if (shift[i].second == 0) @@ -159,7 +159,7 @@ void TShiftProbe::execute(void) acc *= Cshift(phi, shift[i].first, shift[i].second); } } - probe = real(sign*trace(acc)); + probe = sign*trace(acc); if (!par().output.empty()) { ShiftProbeResult r; diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp index 0dcd0177..6800de53 100644 --- a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -116,7 +116,7 @@ void TStochFreeField::execute(void) SImpl::MomentumSpacePropagator(w, sqrt(par().m2)); w *= par().g/N; - w = sqrt(vol*real(w)); + w = sqrt(vol)*sqrt(w); } LOG(Message) << "Generating random momentum-space field" << std::endl; envGetTmp(Field, phift); From 9d835afa351e0a99601dc955be808b116765a8d0 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 14 May 2018 19:05:54 +0100 Subject: [PATCH 351/620] Attempt at solving the FP exception in the QED code --- lib/qcd/action/gauge/Photon.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/qcd/action/gauge/Photon.h b/lib/qcd/action/gauge/Photon.h index 7e21a1de..8a6eff79 100644 --- a/lib/qcd/action/gauge/Photon.h +++ b/lib/qcd/action/gauge/Photon.h @@ -185,7 +185,7 @@ namespace QCD{ vol = vol * latt_size[d]; } invKHatSquared(weight); - weight = sqrt(vol*real(weight)); + weight = sqrt(vol)*sqrt(weight); zmSub(weight); } From a61e0df54b8836337a7b388620e62d57c502c953 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 14 May 2018 19:56:12 +0100 Subject: [PATCH 352/620] Travis fix for Lime --- .travis.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad4e5b73..55f7c097 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,8 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc; fi install: + - export CWD=`pwd` + - echo $CWD - export CC=$CC$VERSION - export CXX=$CXX$VERSION - echo $PATH @@ -36,11 +38,22 @@ script: - ./bootstrap.sh - mkdir build - cd build - - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none + - mkdir lime + - cd lime + - mkdir build + - cd build + - wget http://usqcd-software.github.io/downloads/c-lime/lime-1.3.2.tar.gz + - tar xf lime-1.3.2.tar.gz + - cd lime-1.3.2 + - ./configure --prefix=$CWD/build/lime/install + - make -j4 + - make install + - cd $CWD/build + - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install - make -j4 - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals - echo make clean - - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none + - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install - make -j4 - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals - make check From 7836cc2d747f044ebdef0098a7bcba6ba9baba0d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 15 May 2018 10:10:08 +0100 Subject: [PATCH 353/620] No checksum output on log for scidac --- lib/qcd/hmc/checkpointers/ScidacCheckpointer.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h b/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h index 0867b882..063a475c 100644 --- a/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h +++ b/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h @@ -86,10 +86,7 @@ class ScidacHmcCheckpointer : public BaseHmcCheckpointer { _ScidacWriter.writeScidacFieldRecord(U, MData); _ScidacWriter.close(); - std::cout << GridLogMessage << "Written Scidac Configuration on " << config - << " checksum " << std::hex << nersc_csum<<"/" - << scidac_csuma<<"/" << scidac_csumb - << std::dec << std::endl; + std::cout << GridLogMessage << "Written Scidac Configuration on " << config << std::endl; } }; From fd3b2e945adedb99129f3aa0534ec62cce98d6e6 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 18 May 2018 20:48:24 +0100 Subject: [PATCH 354/620] Hadrons: don't right result with empty stem --- extras/Hadrons/Module.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index dd038a21..2726da96 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -120,7 +120,7 @@ envTmp(type, name, Ls, env().getGrid(Ls)) MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__) #define saveResult(ioStem, name, result)\ -if (env().getGrid()->IsBoss())\ +if (env().getGrid()->IsBoss() and !ioStem.empty())\ {\ makeFileDir(ioStem, env().getGrid());\ {\ From a0d399e5ce32d8bf0f51cceaa01cf920b907bde8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 18 May 2018 20:49:26 +0100 Subject: [PATCH 355/620] Hadrons: yet other attempts at EMT NPR --- extras/Hadrons/Modules.hpp | 2 + .../Modules/MScalarSUN/TimeMomProbe.cc | 11 + .../Modules/MScalarSUN/TimeMomProbe.hpp | 241 ++++++++++++++++++ .../Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 31 --- .../Hadrons/Modules/MScalarSUN/TwoPointNPR.cc | 11 + .../Modules/MScalarSUN/TwoPointNPR.hpp | 182 +++++++++++++ extras/Hadrons/Modules/MScalarSUN/Utils.hpp | 22 ++ extras/Hadrons/modules.inc | 4 + 8 files changed, 473 insertions(+), 31 deletions(-) create mode 100644 extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp create mode 100644 extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc create mode 100644 extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 1a18eb3a..3b33eb6e 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -32,8 +32,10 @@ #include #include #include +#include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc new file mode 100644 index 00000000..f22d08af --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc @@ -0,0 +1,11 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TTimeMomProbe>; +template class Grid::Hadrons::MScalarSUN::TTimeMomProbe>; +template class Grid::Hadrons::MScalarSUN::TTimeMomProbe>; +template class Grid::Hadrons::MScalarSUN::TTimeMomProbe>; +template class Grid::Hadrons::MScalarSUN::TTimeMomProbe>; diff --git a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp new file mode 100644 index 00000000..4807e865 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp @@ -0,0 +1,241 @@ +#ifndef Hadrons_MScalarSUN_TimeMomProbe_hpp_ +#define Hadrons_MScalarSUN_TimeMomProbe_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * n-point functions O(t,p)*tr(phi(t_1,p_1)*...*phi(t_n,p_n)) * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TimeMomProbePar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TimeMomProbePar, + std::string, field, + std::vector, op, + std::vector>, timeMom, + std::string, output); +}; + +class TimeMomProbeResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TimeMomProbeResult, + std::string, op, + std::vector>, timeMom, + std::vector, data); +}; + +template +class TTimeMomProbe: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::SiteField::scalar_object Site; + typedef typename SImpl::ComplexField ComplexField; + typedef std::vector SlicedOp; +public: + // constructor + TTimeMomProbe(const std::string name); + // destructor + virtual ~TTimeMomProbe(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + void vectorModulo(std::vector &v); +}; + +MODULE_REGISTER_TMP(TimeMomProbeSU2, TTimeMomProbe>, MScalarSUN); +MODULE_REGISTER_TMP(TimeMomProbeSU3, TTimeMomProbe>, MScalarSUN); +MODULE_REGISTER_TMP(TimeMomProbeSU4, TTimeMomProbe>, MScalarSUN); +MODULE_REGISTER_TMP(TimeMomProbeSU5, TTimeMomProbe>, MScalarSUN); +MODULE_REGISTER_TMP(TimeMomProbeSU6, TTimeMomProbe>, MScalarSUN); + +/****************************************************************************** + * TTimeMomProbe implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTimeMomProbe::TTimeMomProbe(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTimeMomProbe::getInput(void) +{ + std::vector in = par().op; + + in.push_back(par().field); + + return in; +} + +template +std::vector TTimeMomProbe::getOutput(void) +{ + std::vector out; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTimeMomProbe::setup(void) +{ + envTmpLat(ComplexField, "ftBuf"); + envTmpLat(Field, "ftMatBuf"); +} + +// execution /////////////////////////////////////////////////////////////////// +// NB: time is direction 0 +template +void TTimeMomProbe::vectorModulo(std::vector &v) +{ + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + auto d = env().getDim(mu); + v[mu] = ((v[mu] % d) + d) % d; + } +} + +template +void TTimeMomProbe::execute(void) +{ + const unsigned int nd = env().getNd(); + const unsigned int nt = env().getDim(0); + double partVol = 1.; + std::set> timeMomSet; + std::vector>> timeMom; + std::vector> transferMom; + FFT fft(env().getGrid()); + std::vector dMask(nd, 1); + std::vector result; + std::map> slicedOp; + std::vector slicedProbe; + auto &phi = envGet(Field, par().field); + + envGetTmp(ComplexField, ftBuf); + envGetTmp(Field, ftMatBuf); + dMask[0] = 0; + for (unsigned int mu = 1; mu < nd; ++mu) + { + partVol *= env().getDim(mu); + } + timeMom.resize(par().timeMom.size()); + for (unsigned int p = 0; p < timeMom.size(); ++p) + { + for (auto &tms: par().timeMom[p]) + { + std::vector tm = strToVec(tms); + + timeMom[p].push_back(tm); + timeMomSet.insert(tm); + } + transferMom.push_back(std::vector(nd - 1, 0)); + for (auto &tm: timeMom[p]) + { + for (unsigned int j = 1; j < nd; ++j) + { + transferMom[p][j - 1] -= tm[j]; + } + } + LOG(Message) << "Probe " << p << " (" << timeMom[p].size() << " points) : " << std::endl; + LOG(Message) << " phi(t_i, p_i) for (t_i, p_i) in " << timeMom[p] << std::endl; + LOG(Message) << " operator with momentum " << transferMom[p] << std::endl; + } + LOG(Message) << "FFT: field '" << par().field << "'" << std::endl; + fft.FFT_dim_mask(ftMatBuf, phi, dMask, FFT::forward); + slicedProbe.resize(timeMom.size()); + for (unsigned int p = 0; p < timeMom.size(); ++p) + { + std::vector qt; + + LOG(Message) << "Making probe " << p << std::endl; + slicedProbe[p].resize(nt); + for (unsigned int t = 0; t < nt; ++t) + { + Site acc; + + for (unsigned int i = 0; i < timeMom[p].size(); ++i) + { + Site buf; + + qt = timeMom[p][i]; + qt[0] += t; + vectorModulo(qt); + peekSite(buf, ftMatBuf, qt); + if (i == 0) + { + acc = buf; + } + else + { + acc *= buf; + } + } + slicedProbe[p][t] = TensorRemove(trace(acc)); + } + //std::cout << slicedProbe[p]<< std::endl; + } + for (auto &o: par().op) + { + auto &op = envGet(ComplexField, o); + + slicedOp[o].resize(transferMom.size()); + LOG(Message) << "FFT: operator '" << o << "'" << std::endl; + fft.FFT_dim_mask(ftBuf, op, dMask, FFT::forward); + //std::cout << ftBuf << std::endl; + for (unsigned int p = 0; p < transferMom.size(); ++p) + { + std::vector qt(nd, 0); + + for (unsigned int j = 1; j < nd; ++j) + { + qt[j] = transferMom[p][j - 1]; + } + slicedOp[o][p].resize(nt); + for (unsigned int t = 0; t < nt; ++t) + { + TComplex buf; + + qt[0] = t; + vectorModulo(qt); + peekSite(buf, ftBuf, qt); + slicedOp[o][p][t] = TensorRemove(buf); + } + //std::cout << ftBuf << std::endl; + //std::cout << slicedOp[o][p] << std::endl; + } + } + LOG(Message) << "Making correlators" << std::endl; + for (auto &o: par().op) + for (unsigned int p = 0; p < timeMom.size(); ++p) + { + TimeMomProbeResult r; + + LOG(Message) << " <" << o << " probe_" << p << ">" << std::endl; + r.op = o; + r.timeMom = timeMom[p]; + r.data = makeTwoPoint(slicedOp[o][p], slicedProbe[p], 1./partVol); + result.push_back(r); + } + saveResult(par().output, "timemomprobe", result); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TimeMomProbe_hpp_ diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 8ee80242..2407f26f 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -79,12 +79,6 @@ public: virtual void setup(void); // execution virtual void execute(void); -private: - // make 2-pt function - template - std::vector makeTwoPoint(const std::vector &sink, - const std::vector &source, - const double factor = 1.); private: std::vector> mom_; }; @@ -221,31 +215,6 @@ void TTwoPoint::execute(void) saveResult(par().output, "twopt", result); } -// make 2-pt function ////////////////////////////////////////////////////////// -template -template -std::vector TTwoPoint::makeTwoPoint( - const std::vector &sink, - const std::vector &source, - const double factor) -{ - assert(sink.size() == source.size()); - - unsigned int nt = sink.size(); - std::vector res(nt, 0.); - - for (unsigned int dt = 0; dt < nt; ++dt) - { - for (unsigned int t = 0; t < nt; ++t) - { - res[dt] += sink[(t+dt)%nt]*adj(source[t]); - } - res[dt] *= factor/static_cast(nt); - } - - return res; -} - END_MODULE_NAMESPACE END_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc new file mode 100644 index 00000000..70fb2445 --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc @@ -0,0 +1,11 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MScalarSUN; + +template class Grid::Hadrons::MScalarSUN::TTwoPointNPR>; +template class Grid::Hadrons::MScalarSUN::TTwoPointNPR>; +template class Grid::Hadrons::MScalarSUN::TTwoPointNPR>; +template class Grid::Hadrons::MScalarSUN::TTwoPointNPR>; +template class Grid::Hadrons::MScalarSUN::TTwoPointNPR>; diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp new file mode 100644 index 00000000..4c2cdb0d --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp @@ -0,0 +1,182 @@ +#ifndef Hadrons_MScalarSUN_TwoPointNPR_hpp_ +#define Hadrons_MScalarSUN_TwoPointNPR_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * TwoPointNPR * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TwoPointNPRPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointNPRPar, + std::vector, op, + std::string, field, + std::string, output); +}; + +class TwoPointNPRResult: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointNPRResult, + std::string, op, + std::vector, data); +}; + +template +class TTwoPointNPR: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::SiteField::scalar_object Site; + typedef typename SImpl::ComplexField ComplexField; +public: + // constructor + TTwoPointNPR(const std::string name); + // destructor + virtual ~TTwoPointNPR(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(TwoPointNPRSU2, TTwoPointNPR>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointNPRSU3, TTwoPointNPR>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointNPRSU4, TTwoPointNPR>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointNPRSU5, TTwoPointNPR>, MScalarSUN); +MODULE_REGISTER_TMP(TwoPointNPRSU6, TTwoPointNPR>, MScalarSUN); + +/****************************************************************************** + * TTwoPointNPR implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTwoPointNPR::TTwoPointNPR(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTwoPointNPR::getInput(void) +{ + std::vector in = par().op; + + in.push_back(par().field); + + return in; +} + +template +std::vector TTwoPointNPR::getOutput(void) +{ + std::vector out; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTwoPointNPR::setup(void) +{ + const unsigned int nl = env().getDim(0); + + for (unsigned int mu = 1; mu < env().getNd(); ++mu) + { + if (nl != env().getDim(mu)) + { + HADRONS_ERROR(Size, "non-cubic grid"); + } + } + envTmpLat(ComplexField, "ftBuf"); + envTmpLat(Field, "ftMatBuf"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTwoPointNPR::execute(void) +{ + const unsigned int nd = env().getNd(); + const unsigned int nl = env().getDim(0); + FFT fft(env().getGrid()); + std::vector result; + TwoPointNPRResult twoPtp1, twoPtp2; + auto &phi = envGet(Field, par().field); + bool doTwoPt = true; + + envGetTmp(ComplexField, ftBuf); + envGetTmp(Field, ftMatBuf); + LOG(Message) << "FFT: field '" << par().field << "'" << std::endl; + fft.FFT_all_dim(ftMatBuf, phi, FFT::forward); + for (auto &opName: par().op) + { + auto &op = envGet(ComplexField, opName); + std::vector p1, p2, p; + Site phip1, phip2; + TComplex opp; + TwoPointNPRResult r; + + LOG(Message) << "FFT: operator '" << opName << "'" << std::endl; + fft.FFT_all_dim(ftBuf, op, FFT::forward); + LOG(Message) << "Generating vertex function" << std::endl; + r.op = opName; + r.data.resize(nl); + if (doTwoPt) + { + twoPtp1.op = "phi_prop_p1"; + twoPtp1.data.resize(nl); + twoPtp2.op = "phi_prop_p2"; + twoPtp2.data.resize(nl); + } + for (unsigned int n = 0; n < nl; ++n) + { + p1.assign(nd, 0); + p2.assign(nd, 0); + p.assign(nd, 0); + // non-exceptional RI/SMOM kinematic + // p1 = mu*(1,1,0): in mom + // p2 = mu*(0,1,1): out mom + // p = p1 - p2 = mu*(1,0,-1) + // mu = 2*n*pi/L + p1[0] = n; + p1[1] = n; + p2[1] = n; + p2[2] = n; + p[0] = n; + p[2] = (nl - n) % nl; + peekSite(phip1, ftMatBuf, p1); + peekSite(phip2, ftMatBuf, p2); + peekSite(opp, ftBuf, p); + if (doTwoPt) + { + twoPtp1.data[n] = TensorRemove(trace(phip1*adj(phip1))); + twoPtp2.data[n] = TensorRemove(trace(phip2*adj(phip2))); + } + r.data[n] = TensorRemove(trace(phip2*adj(phip1))*opp); + } + if (doTwoPt) + { + result.push_back(twoPtp1); + result.push_back(twoPtp2); + } + result.push_back(r); + doTwoPt = false; + } + saveResult(par().output, "twoptnpr", result); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TwoPointNPR_hpp_ diff --git a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp index 37a9e137..68009f5e 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/Utils.hpp @@ -89,6 +89,28 @@ inline void dmuAcc(Field &out, const Field &in, const unsigned int mu, const Dif } } +template +std::vector makeTwoPoint(const std::vector &sink, + const std::vector &source, + const double factor = 1.) +{ + assert(sink.size() == source.size()); + + unsigned int nt = sink.size(); + std::vector res(nt, 0.); + + for (unsigned int dt = 0; dt < nt; ++dt) + { + for (unsigned int t = 0; t < nt; ++t) + { + res[dt] += trace(sink[(t+dt)%nt]*source[t]); + } + res[dt] *= factor/static_cast(nt); + } + + return res; +} + inline std::string varName(const std::string name, const std::string suf) { return name + "_" + suf; diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index c2e84086..a1f34b95 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -32,6 +32,7 @@ modules_cc =\ Modules/MAction/DWF.cc \ Modules/MScalarSUN/TrPhi.cc \ Modules/MScalarSUN/Grad.cc \ + Modules/MScalarSUN/TimeMomProbe.cc \ Modules/MScalarSUN/TrMag.cc \ Modules/MScalarSUN/TrKinetic.cc \ Modules/MScalarSUN/EMT.cc \ @@ -39,6 +40,7 @@ modules_cc =\ Modules/MScalarSUN/TransProj.cc \ Modules/MScalarSUN/StochFreeField.cc \ Modules/MScalarSUN/TwoPoint.cc \ + Modules/MScalarSUN/TwoPointNPR.cc \ Modules/MScalarSUN/Div.cc \ Modules/MIO/LoadEigenPack.cc \ Modules/MIO/LoadBinary.cc \ @@ -80,8 +82,10 @@ modules_hpp =\ Modules/MAction/WilsonClover.hpp \ Modules/MAction/ZMobiusDWF.hpp \ Modules/MScalarSUN/StochFreeField.hpp \ + Modules/MScalarSUN/TwoPointNPR.hpp \ Modules/MScalarSUN/ShiftProbe.hpp \ Modules/MScalarSUN/Div.hpp \ + Modules/MScalarSUN/TimeMomProbe.hpp \ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/EMT.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ From 255d4992e12ec585de06f4c0d3e20c6cee28b777 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 18 May 2018 20:49:55 +0100 Subject: [PATCH 356/620] Hadrons: stochastic scalar SU(N) free field fix --- .../Modules/MScalarSUN/StochFreeField.hpp | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp index 6800de53..75ef3fde 100644 --- a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -24,10 +24,10 @@ template class TStochFreeField: public Module { public: - typedef typename SImpl::Field Field; - typedef typename SImpl::ComplexField ComplexField; - typedef typename SImpl::Group Group; - typedef typename Group::LatticeAlgebraVector AlgebraField; + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + typedef typename SImpl::Group Group; + typedef typename SImpl::SiteField::scalar_object Site; public: // constructor TStochFreeField(const std::string name); @@ -87,6 +87,7 @@ void TStochFreeField::setup(void) create_weight = true; } envTmpLat(Field, "phift"); + envTmpLat(ComplexField, "ca"); envCreateLat(Field, getName()); } @@ -120,13 +121,27 @@ void TStochFreeField::execute(void) } LOG(Message) << "Generating random momentum-space field" << std::endl; envGetTmp(Field, phift); - Group::GaussianFundamentalLieAlgebraMatrix(rng, phift); + envGetTmp(ComplexField, ca); + phift = zero; + for (int a = 0; a < Nadj; ++a) + { + Site ta; + + gaussian(rng, ca); + Group::generator(a, ta); + phift += ca*ta; + } phift *= w; LOG(Message) << "Field Fourier transform" << std::endl; fft.FFT_all_dim(phi, phift, FFT::backward); - phi = (1./sqrt(2.))*(phi - adj(phi)); + phi = 0.5*(phi - adj(phi)); trphi2 = -TensorRemove(sum(trace(phi*phi))).real()/vol; LOG(Message) << "tr(phi^2)= " << trphi2 << std::endl; + + // ComplexField phi2(env().getGrid()); + + // phi2=trace(phi*phi); + // std::cout << phi2 << std::endl; } END_MODULE_NAMESPACE From 68c028b0a6039fe9504ab2c77ab4635e5241dc34 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Mon, 21 May 2018 12:54:25 +0100 Subject: [PATCH 357/620] Comment --- lib/algorithms/iterative/ConjugateGradientMultiShift.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/algorithms/iterative/ConjugateGradientMultiShift.h b/lib/algorithms/iterative/ConjugateGradientMultiShift.h index 9d2719fc..4c311bc1 100644 --- a/lib/algorithms/iterative/ConjugateGradientMultiShift.h +++ b/lib/algorithms/iterative/ConjugateGradientMultiShift.h @@ -208,6 +208,7 @@ void operator() (LinearOperatorBase &Linop, const Field &src, std::vector cp=c; MatrixTimer.Start(); //Linop.HermOpAndNorm(p,mmp,d,qq); // d is used + // The below is faster on KNL Linop.HermOp(p,mmp); d=real(innerProduct(p,mmp)); From 0e127b1fc788c0d343868d99714f8d286b451801 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Mon, 21 May 2018 12:57:13 +0100 Subject: [PATCH 358/620] New file single prec test --- tests/core/Test_staggered5DvecF.cc | 196 +++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 tests/core/Test_staggered5DvecF.cc diff --git a/tests/core/Test_staggered5DvecF.cc b/tests/core/Test_staggered5DvecF.cc new file mode 100644 index 00000000..5d421673 --- /dev/null +++ b/tests/core/Test_staggered5DvecF.cc @@ -0,0 +1,196 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./benchmarks/Benchmark_wilson.cc + + Copyright (C) 2015 + +Author: Peter Boyle +Author: paboyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + const int Ls=16; + GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi()); + GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); + GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); + GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); + + std::cout << GridLogMessage << "Making s innermost grids"< seeds({1,2,3,4}); + + GridParallelRNG pRNG4(UGrid); + GridParallelRNG pRNG5(FGrid); + pRNG4.SeedFixedIntegers(seeds); + pRNG5.SeedFixedIntegers(seeds); + + typedef typename ImprovedStaggeredFermion5DF::FermionField FermionField; + typedef typename ImprovedStaggeredFermion5DF::ComplexField ComplexField; + typename ImprovedStaggeredFermion5DF::ImplParams params; + + FermionField src (FGrid); + random(pRNG5,src); + /* + std::vector site({0,1,2,0,0}); + ColourVector cv = zero; + cv()()(0)=1.0; + src = zero; + pokeSite(cv,src,site); + */ + FermionField result(FGrid); result=zero; + FermionField tmp(FGrid); tmp=zero; + FermionField err(FGrid); tmp=zero; + FermionField phi (FGrid); random(pRNG5,phi); + FermionField chi (FGrid); random(pRNG5,chi); + + LatticeGaugeFieldF Umu(UGrid); + SU3::HotConfiguration(pRNG4,Umu); + + /* + for(int mu=1;mu<4;mu++){ + auto tmp = PeekIndex(Umu,mu); + tmp = zero; + PokeIndex(Umu,tmp,mu); + } + */ + double volume=Ls; + for(int mu=0;mu Date: Tue, 22 May 2018 16:16:21 +0100 Subject: [PATCH 359/620] Change MODULE_REGISTER_NS -> MODULE_REGISTER in UnitEM, ScalarVP and VPCounterTerms --- extras/Hadrons/Modules/MGauge/UnitEm.hpp | 4 ++-- extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 4 ++-- extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.hpp b/extras/Hadrons/Modules/MGauge/UnitEm.hpp index 94214274..07ee5bba 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.hpp +++ b/extras/Hadrons/Modules/MGauge/UnitEm.hpp @@ -49,7 +49,7 @@ public: // constructor TUnitEm(const std::string name); // destructor - virtual ~TUnitEm(void) = default; + virtual ~TUnitEm(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); @@ -60,7 +60,7 @@ protected: virtual void execute(void); }; -MODULE_REGISTER_NS(UnitEm, TUnitEm, MGauge); +MODULE_REGISTER(UnitEm, TUnitEm, MGauge); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 8e18f80e..741325d1 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -56,7 +56,7 @@ public: // constructor TScalarVP(const std::string name); // destructor - virtual ~TScalarVP(void) = default; + virtual ~TScalarVP(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); @@ -92,7 +92,7 @@ private: std::vector phase_, momPhase_; }; -MODULE_REGISTER_NS(ScalarVP, TScalarVP, MScalar); +MODULE_REGISTER(ScalarVP, TScalarVP, MScalar); END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp index a0c3688d..99e1b1ce 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -47,7 +47,7 @@ public: // constructor TVPCounterTerms(const std::string name); // destructor - virtual ~TVPCounterTerms(void) = default; + virtual ~TVPCounterTerms(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); @@ -66,7 +66,7 @@ private: std::vector phase_, momPhase_; }; -MODULE_REGISTER_NS(VPCounterTerms, TVPCounterTerms, MScalar); +MODULE_REGISTER(VPCounterTerms, TVPCounterTerms, MScalar); END_MODULE_NAMESPACE From e3164d4c7b86dd997bd178ead6604010deca5cc9 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 28 May 2018 11:39:17 +0200 Subject: [PATCH 360/620] Hadrons: env function to get volume in double --- extras/Hadrons/Environment.cc | 11 +++++------ extras/Hadrons/Environment.hpp | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index 990a717e..bb12a036 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -49,11 +49,10 @@ Environment::Environment(void) dim_, GridDefaultSimd(nd_, vComplex::Nsimd()), GridDefaultMpi())); gridRb4d_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(grid4d_.get())); - auto loc = getGrid()->LocalDimensions(); - locVol_ = 1; - for (unsigned int d = 0; d < loc.size(); ++d) + vol_ = 1.; + for (auto d: dim_) { - locVol_ *= loc[d]; + vol_ *= d; } rng4d_.reset(new GridParallelRNG(grid4d_.get())); } @@ -190,9 +189,9 @@ int Environment::getDim(const unsigned int mu) const return dim_[mu]; } -unsigned long int Environment::getLocalVolume(void) const +double Environment::getVolume(void) const { - return locVol_; + return vol_; } // random number generator ///////////////////////////////////////////////////// diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index a9c3c724..13a7dfe6 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -94,8 +94,8 @@ public: const unsigned int Ls = 1) const; std::vector getDim(void) const; int getDim(const unsigned int mu) const; - unsigned long int getLocalVolume(void) const; unsigned int getNd(void) const; + double getVolume(void) const; // random number generator void setSeed(const std::vector &seed); GridParallelRNG * get4dRng(void) const; @@ -155,7 +155,7 @@ public: void printContent(void) const; private: // general - unsigned long int locVol_; + double vol_; bool protect_{true}; // grids std::vector dim_; From f4c6d392385d3f7ab956243c4aec0a44c7839b88 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 31 May 2018 17:16:20 +0100 Subject: [PATCH 361/620] CHanges made to SchurRB solvers to allow for the subtraction of a guess after solve --- lib/algorithms/iterative/Deflation.h | 4 +- lib/algorithms/iterative/SchurRedBlack.h | 98 +++++++++++++++++++++--- 2 files changed, 92 insertions(+), 10 deletions(-) diff --git a/lib/algorithms/iterative/Deflation.h b/lib/algorithms/iterative/Deflation.h index 316afe90..7c3e8e57 100644 --- a/lib/algorithms/iterative/Deflation.h +++ b/lib/algorithms/iterative/Deflation.h @@ -63,7 +63,7 @@ public: DeflatedGuesser(const std::vector & _evec,const std::vector & _eval) : evec(_evec), eval(_eval) {}; - virtual void operator()(const Field &src,Field &guess) { + virtual void operator()(const Field &src,Field &guess) { guess = zero; assert(evec.size()==eval.size()); auto N = evec.size(); @@ -71,6 +71,7 @@ public: const Field& tmp = evec[i]; axpy(guess,TensorRemove(innerProduct(tmp,src)) / eval[i],tmp,guess); } + guess.checkerboard = src.checkerboard; } }; @@ -101,6 +102,7 @@ public: axpy(guess_coarse,TensorRemove(innerProduct(tmp,src_coarse)) / eval_coarse[i],tmp,guess_coarse); } blockPromote(guess_coarse,guess,subspace); + guess.checkerboard = src.checkerboard; }; }; diff --git a/lib/algorithms/iterative/SchurRedBlack.h b/lib/algorithms/iterative/SchurRedBlack.h index 091330b2..ae751074 100644 --- a/lib/algorithms/iterative/SchurRedBlack.h +++ b/lib/algorithms/iterative/SchurRedBlack.h @@ -95,16 +95,26 @@ namespace Grid { private: OperatorFunction & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackStaggeredSolve(OperatorFunction &HermitianRBSolver) : + SchurRedBlackStaggeredSolve(OperatorFunction &HermitianRBSolver, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { CBfactorise=0; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ @@ -151,7 +161,17 @@ namespace Grid { ////////////////////////////////////////////////////////////// std::cout< & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackDiagMooeeSolve(OperatorFunction &HermitianRBSolver,int cb=0) : _HermitianRBSolver(HermitianRBSolver) + SchurRedBlackDiagMooeeSolve(OperatorFunction &HermitianRBSolver,int cb=0, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { CBfactorise=cb; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ ZeroGuesser guess; @@ -236,7 +266,17 @@ namespace Grid { ////////////////////////////////////////////////////////////// std::cout< & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackDiagTwoSolve(OperatorFunction &HermitianRBSolver) : + SchurRedBlackDiagTwoSolve(OperatorFunction &HermitianRBSolver, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { - CBfactorise=0; + CBfactorise = 0; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ @@ -322,7 +372,17 @@ namespace Grid { std::cout< & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackDiagTwoMixed(LinearFunction &HermitianRBSolver) : + SchurRedBlackDiagTwoMixed(LinearFunction &HermitianRBSolver, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { CBfactorise=0; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ @@ -408,7 +478,17 @@ namespace Grid { // _HermitianRBSolver(_HermOpEO,src_o,sol_o); assert(sol_o.checkerboard==Odd); // _HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd); guess(src_o,tmp); - _HermitianRBSolver(src_o,tmp); assert(tmp.checkerboard==Odd); + if (subGuess) + { + std::cout << GridLogMessage << "Subtracting guess after solve" << std::endl; + Mtmp = tmp; + _HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd); + tmp = tmp - Mtmp; + } + else + { + _HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd); + } _Matrix.MooeeInv(tmp,sol_o); assert( sol_o.checkerboard ==Odd); /////////////////////////////////////////////////// From c18074869b97537aa5377b27dada707e37b66f2c Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 31 May 2018 17:17:16 +0100 Subject: [PATCH 362/620] Changes to Hadrons SchurRB solver to allow for a subtract_guess boolean to be passed --- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 23 +++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 206d44d1..8983e30b 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -116,7 +116,7 @@ std::vector TRBPrecCG::getReference(void) template std::vector TRBPrecCG::getOutput(void) { - std::vector out = {getName()}; + std::vector out = {getName(), getName() + "_subtract"}; return out; } @@ -166,16 +166,21 @@ void TRBPrecCG::setup(void) guesser.reset(new FineGuesser(epack.evec, epack.eval)); } } - auto solver = [&mat, guesser, this](FermionField &sol, - const FermionField &source) - { - ConjugateGradient cg(par().residual, - par().maxIteration); - HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); - - schurSolver(mat, source, sol, *guesser); + auto makeSolver = [&mat, guesser, this](bool subGuess) { + return [&mat, guesser, subGuess, this](FermionField &sol, + const FermionField &source) { + ConjugateGradient cg(par().residual, + par().maxIteration); + HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); + schurSolver.subtractGuess(subGuess); + schurSolver(mat, source, sol, *guesser); + }; }; + + auto solver = makeSolver(false); envCreate(SolverFn, getName(), Ls, solver); + auto solver_subtract = makeSolver(true); + envCreate(SolverFn, getName() + "_subtract", Ls, solver_subtract); } From a8d4156997c84988c929e056c3d0e90629c3d465 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 31 May 2018 17:18:58 +0100 Subject: [PATCH 363/620] Added a Hadrons module that computes the all-to-all v and w vectors --- extras/Hadrons/AllToAllVectors.hpp | 296 ++++++++++++++++++ extras/Hadrons/Makefile.am | 1 + extras/Hadrons/Modules.hpp | 69 ++-- extras/Hadrons/Modules/MSolver/A2AVectors.cc | 8 + extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 206 ++++++++++++ extras/Hadrons/modules.inc | 128 ++++---- 6 files changed, 611 insertions(+), 97 deletions(-) create mode 100644 extras/Hadrons/AllToAllVectors.hpp create mode 100644 extras/Hadrons/Modules/MSolver/A2AVectors.cc create mode 100644 extras/Hadrons/Modules/MSolver/A2AVectors.hpp diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp new file mode 100644 index 00000000..7ddc0e81 --- /dev/null +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -0,0 +1,296 @@ +#ifndef A2A_Vectors_hpp_ +#define A2A_Vectors_hpp_ + +#include +#include + +BEGIN_HADRONS_NAMESPACE + +//////////////////////////////// +// A2A Modes +//////////////////////////////// + +template +class A2AModesSchurDiagTwo +{ + public: + A2AModesSchurDiagTwo(void) = default; + virtual ~A2AModesSchurDiagTwo(void) = default; + + void low_mode_v(Matrix &_Matrix, const Field &evec, const RealD &eval, Field &vout) + { + + GridBase *grid = _Matrix.RedBlackGrid(); + + Field src_o(grid); + Field sol_e(grid); + Field sol_o(grid); + Field tmp(grid); + + pickCheckerboard(Odd, src_o, evec); + pickCheckerboard(Even, sol_e, vout); + pickCheckerboard(Odd, sol_o, vout); + + ///////////////////////////////////////////////////// + // v_ie = -(1/eval_i)* Mee Meo MooInv evec_i + ///////////////////////////////////////////////////// + _Matrix.MooeeInv(src_o, tmp); + assert(tmp.checkerboard == Odd); + _Matrix.Meooe(tmp, sol_e); + assert(sol_e.checkerboard == Even); + _Matrix.Mooee(sol_e, tmp); + assert(tmp.checkerboard == Even); + sol_e = -(1.0 / eval) * tmp; + assert(sol_e.checkerboard == Even); + + ///////////////////////////////////////////////////// + // v_io = -(1/eval_i)* MooInv evec_i + ///////////////////////////////////////////////////// + _Matrix.MooeeInv(src_o, tmp); + assert(tmp.checkerboard == Odd); + sol_o = -(1.0 / eval) * tmp; + assert(sol_o.checkerboard == Odd); + + setCheckerboard(vout, sol_e); + assert(sol_e.checkerboard == Even); + setCheckerboard(vout, sol_o); + assert(sol_o.checkerboard == Odd); + } + + void low_mode_w(Matrix &_Matrix, const Field &evec, const RealD &eval, Field &wout) + { + GridBase *grid = _Matrix.RedBlackGrid(); + SchurDiagTwoOperator _HermOpEO(_Matrix); + + Field src_o(grid); + Field sol_e(grid); + Field sol_o(grid); + Field tmp(grid); + + GridBase *fgrid = _Matrix.Grid(); + Field tmp_out(fgrid); + + pickCheckerboard(Odd, src_o, evec); + pickCheckerboard(Even, sol_e, wout); + pickCheckerboard(Odd, sol_o, wout); + + ///////////////////////////////////////////////////// + // w_ie = MeeInvDag MoeDag Doo evec_i + ///////////////////////////////////////////////////// + _HermOpEO.Mpc(src_o, sol_e); + assert(sol_e.checkerboard == Odd); + _Matrix.MeooeDag(sol_e, tmp); + assert(tmp.checkerboard == Even); + _Matrix.MooeeInvDag(tmp, sol_e); + assert(sol_e.checkerboard == Even); + + ///////////////////////////////////////////////////// + // w_io = Doo evec_i + ///////////////////////////////////////////////////// + _HermOpEO.Mpc(src_o, sol_o); + assert(sol_o.checkerboard == Odd); + + setCheckerboard(tmp_out, sol_e); + assert(sol_e.checkerboard == Even); + setCheckerboard(tmp_out, sol_o); + assert(sol_o.checkerboard == Odd); + + _Matrix.Dminus(tmp_out, wout); + } + + void high_mode_v(Matrix &_Matrix, std::function &Solver, const Field &source, Field &vout) + { + GridBase *fgrid = _Matrix.Grid(); + Field tmp(fgrid); + + _Matrix.Dminus(source, tmp); + Solver(vout, tmp); + } + + void high_mode_w(Matrix &_Matrix, const Field &source, Field &wout) + { + wout = source; + } +}; + +//////////////////////////////// +// Low Modes +//////////////////////////////// + +template +class A2ALMSchurDiagTwo : public A2AModesSchurDiagTwo +{ + private: + const std::vector &evec; + const std::vector &eval; + Matrix &action; + + public: + A2ALMSchurDiagTwo(const std::vector &_evec, const std::vector &_eval, Matrix &_action) : evec(_evec), eval(_eval), action(_action){}; + void operator()(int i, Field &vout, Field &wout) + { + this->low_mode_v(action, evec[i], eval[i], vout); + this->low_mode_w(action, evec[i], eval[i], wout); + } +}; + +template +class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo +{ + private: + const std::vector &subspace; + const std::vector &evec_coarse; + const std::vector &eval_coarse; + Matrix &action; + + public: + A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) + : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){}; + + void operator()(int i, FineField &vout, FineField &wout) + { + FineField prom_evec(subspace[0]._grid); + blockPromote(evec_coarse[i], prom_evec, subspace); + this->low_mode_v(action, prom_evec, eval_coarse[i], vout); + this->low_mode_w(action, prom_evec, eval_coarse[i], wout); + } +}; + +//////////////////////////////// +// High Modes +//////////////////////////////// + +template +class A2AHMSchurDiagTwo : virtual public A2AModesSchurDiagTwo +{ + public: + void operator()(Matrix &_Matrix, std::function &Solver, const Field &source, Field &vout, Field &wout) + { + this->high_mode_v(_Matrix, Solver, source, vout); + this->high_mode_w(_Matrix, source, wout); + } +}; + +template +class A2AVectorsReturnHigh : public A2AModesSchurDiagTwo +{ + private: + Matrix &action; + std::function &Solver; + const int Nh, Ls; + + public: + std::vector w_high, v_high; + A2AVectorsReturnHigh(Matrix &_action, + std::function &_Solver, + const int _Nh, const int _Ls) + : action(_action), + Solver(_Solver), + Nh(_Nh), Ls(_Ls) + { + GridBase *fgrid = action.Grid(); + resize(Nh, fgrid); + }; + + void resize(const size_t size, GridBase *grid) + { + w_high.resize(size, grid); + v_high.resize(size, grid); + } + + void high_modes(Field &source, int i) + { + this->high_mode_v(action, Solver, source, v_high[i]); + this->high_mode_w(action, source, w_high[i]); + } + + void operator()(int i, Field &vout, Field &wout) + { + if (Ls > 1) + { + vout = v_high[i]; + wout = w_high[i]; + } + else + { + action.ExportPhysicalFermionSolution(v_high[i], vout); + action.ExportPhysicalFermionSolution(w_high[i], wout); + } + } +}; + +//////////////////////////////// +// Both Modes +//////////////////////////////// + +template +class A2AVectorsReturn : public A2AModesSchurDiagTwo +{ + private: + const std::vector &evec; + const std::vector &eval; + Matrix &action; + std::function &Solver; + const int Nl, Nh, Ls; + + public: + std::vector w_high, v_high; + + A2AVectorsReturn(const std::vector &_evec, const std::vector &_eval, + Matrix &_action, + std::function &_Solver, + const int _Nl, const int _Nh, const int _Ls) + : evec(_evec), eval(_eval), + action(_action), + Solver(_Solver), + Nl(_Nl), Nh(_Nh), Ls(_Ls) + { + GridBase *fgrid = action.Grid(); + resize(Nh, fgrid); + }; + + void resize(const size_t size, GridBase *grid) + { + w_high.resize(size, grid); + v_high.resize(size, grid); + } + + void high_modes(Field &source, int i) + { + this->high_mode_v(action, Solver, source, v_high[i]); + this->high_mode_w(action, source, w_high[i]); + } + + void operator()(int i, Field &vout, Field &wout) + { + + GridBase *fgrid = action.Grid(); + Field vtmp(fgrid); + Field wtmp(fgrid); + if (i < Nl) + { + this->low_mode_v(action, evec[i], eval[i], vtmp); + this->low_mode_w(action, evec[i], eval[i], wtmp); + } + else + { + vtmp = v_high[i-Nl]; + wtmp = w_high[i-Nl]; + } + + if (Ls > 1) + { + vout = vtmp; + wout = wtmp; + } + else + { + action.ExportPhysicalFermionSolution(vtmp, vout); + action.ExportPhysicalFermionSolution(wtmp, wout); + } + } +}; + +END_HADRONS_NAMESPACE + +#endif // A2A_Vectors_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index 3b945124..959cf597 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -14,6 +14,7 @@ libHadrons_a_SOURCES = \ libHadrons_adir = $(pkgincludedir)/Hadrons nobase_libHadrons_a_HEADERS = \ $(modules_hpp) \ + AllToAllVectors.hpp \ Application.hpp \ Environment.hpp \ Exceptions.hpp \ diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 4b420517..e46bf01b 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,51 +1,52 @@ +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include +#include +#include +#include +#include +#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include #include +#include #include #include +#include +#include +#include +#include +#include #include #include #include -#include -#include -#include +#include +#include +#include #include -#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.cc b/extras/Hadrons/Modules/MSolver/A2AVectors.cc new file mode 100644 index 00000000..f72f405d --- /dev/null +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSolver; + +template class Grid::Hadrons::MSolver::TA2AVectors; +template class Grid::Hadrons::MSolver::TA2AVectors; diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp new file mode 100644 index 00000000..e4690b13 --- /dev/null +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -0,0 +1,206 @@ +#ifndef Hadrons_MSolver_A2AVectors_hpp_ +#define Hadrons_MSolver_A2AVectors_hpp_ + +#include +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * A2AVectors * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MSolver) + +class A2AVectorsPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AVectorsPar, + int, Ls, + int, Nl, + int, N, + std::vector, sources, + std::string, action, + std::string, eigenpack, + std::string, solver); +}; + +template +class TA2AVectors : public Module +{ + public: + FERM_TYPE_ALIASES(FImpl,); + SOLVER_TYPE_ALIASES(FImpl,); + + typedef FermionEigenPack EPack; + typedef CoarseFermionEigenPack CoarseEPack; + + typedef A2AModesSchurDiagTwo A2ABase; + typedef A2AVectorsReturn A2AReturn; + typedef A2AVectorsReturnHigh A2AReturnHigh; + + public: + // constructor + TA2AVectors(const std::string name); + // destructor + virtual ~TA2AVectors(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); + + private: + unsigned int Ls_; + std::string retName_; +}; + +MODULE_REGISTER_TMP(A2AVectors, ARG(TA2AVectors), MSolver); +MODULE_REGISTER_TMP(ZA2AVectors, ARG(TA2AVectors), MSolver); + +/****************************************************************************** + * TA2AVectors implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TA2AVectors::TA2AVectors(const std::string name) +: Module(name) +, retName_ (name + "_ret") +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TA2AVectors::getInput(void) +{ + std::vector in = {par().action, par().solver + "_subtract"}; + + int n = par().sources.size(); + + for (unsigned int t = 0; t < n; t += 1) + { + in.push_back(par().sources[t]); + } + + return in; +} + +template +std::vector TA2AVectors::getOutput(void) +{ + std::vector out = {getName(), retName_}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TA2AVectors::setup(void) +{ + int N = par().N; + int Nl = par().Nl; + int Nh = N - Nl; + int Ls = par().Ls; + Ls_ = env().getObjectLs(par().solver + "_subtract"); + + auto &action = envGet(FMat, par().action); + auto &solver = envGet(SolverFn, par().solver + "_subtract"); + + GridBase *fgrid = action.Grid(); + + envTmpLat(FermionField, "ferm_src", Ls_); + envTmpLat(FermionField, "tmp"); + + if (Nl > 0) + { + // Low modes + auto &epack = envGet(EPack, par().eigenpack); + + LOG(Message) << "using a2a with eigenpack '" + << par().eigenpack << "' (" + << epack.evec.size() << " modes)" << std::endl; + + envCreateDerived(A2ABase, A2AReturn, retName_, Ls, + epack.evec, epack.eval, + action, + solver, + Nl, Nh, Ls); + } + else + { + LOG(Message) << "using a2a with high modes only" << std::endl; + envCreateDerived(A2ABase, A2AReturnHigh, retName_, Ls, action, + solver, + Nh, Ls); + } +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AVectors::execute(void) +{ + auto &action = envGet(FMat, par().action); + + int Nt = env().getDim(Tp); + int Nl = par().Nl; // Number of low modes + int Nc = FImpl::Dimension; + + // High modes + auto sources = par().sources; + + envGetTmp(FermionField, ferm_src); + envGetTmp(FermionField, tmp); + int N_count = 0; + for (unsigned int s = 0; s < Ns; ++s) + for (unsigned int c = 0; c < Nc; ++c) + for (unsigned int T = 0; T < Nt; T++) + { + auto &fullSrc = envGet(PropagatorField, sources[T]); + // source conversion for 4D sources + if (!env().isObject5d(sources[T])) + { + if (Ls_ == 1) + { + PropToFerm(ferm_src, fullSrc, s, c); + } + else + { + PropToFerm(tmp, fullSrc, s, c); + action.ImportPhysicalFermionSource(tmp, ferm_src); + } + } + // source conversion for 5D sources + else + { + if (Ls_ != env().getObjectLs(sources[T])) + { + HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); + } + else + { + PropToFerm(ferm_src, fullSrc, s, c); + } + } + + if (Nl > 0) + { + auto a2areturn = envGetDerived(A2ABase, A2AReturn, retName_); + a2areturn.high_modes(ferm_src, N_count); + } + else + { + auto a2areturnhigh = envGetDerived(A2ABase, A2AReturnHigh, retName_); + a2areturnhigh.high_modes(ferm_src, N_count); + } + N_count++; + } + +} +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MSolver_A2AVectors_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 57dc8d20..aecfdd5a 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,103 +1,105 @@ modules_cc =\ Modules/MContraction/WeakHamiltonianEye.cc \ Modules/MContraction/Baryon.cc \ - Modules/MContraction/Meson.cc \ Modules/MContraction/WeakNeutral4ptDisc.cc \ - Modules/MContraction/WeakHamiltonianNonEye.cc \ - Modules/MContraction/WardIdentity.cc \ Modules/MContraction/DiscLoop.cc \ + Modules/MContraction/WeakHamiltonianNonEye.cc \ + Modules/MContraction/Meson.cc \ + Modules/MContraction/WardIdentity.cc \ Modules/MContraction/Gamma3pt.cc \ - Modules/MFermion/FreeProp.cc \ - Modules/MFermion/GaugeProp.cc \ - Modules/MSource/Point.cc \ - Modules/MSource/Wall.cc \ - Modules/MSource/SeqConserved.cc \ - Modules/MSource/SeqGamma.cc \ - Modules/MSource/Z2.cc \ - Modules/MSink/Point.cc \ - Modules/MSink/Smear.cc \ - Modules/MSolver/RBPrecCG.cc \ - Modules/MSolver/LocalCoherenceLanczos.cc \ Modules/MGauge/Unit.cc \ + Modules/MGauge/FundtoHirep.cc \ Modules/MGauge/StochEm.cc \ Modules/MGauge/Random.cc \ - Modules/MGauge/FundtoHirep.cc \ - Modules/MUtilities/TestSeqGamma.cc \ + Modules/MSource/Wall.cc \ + Modules/MSource/SeqConserved.cc \ + Modules/MSource/Z2.cc \ + Modules/MSource/SeqGamma.cc \ + Modules/MSource/Point.cc \ Modules/MUtilities/TestSeqConserved.cc \ + Modules/MUtilities/TestSeqGamma.cc \ Modules/MLoop/NoiseLoop.cc \ - Modules/MScalar/FreeProp.cc \ - Modules/MScalar/ChargedProp.cc \ - Modules/MAction/Wilson.cc \ - Modules/MAction/ZMobiusDWF.cc \ - Modules/MAction/WilsonClover.cc \ - Modules/MAction/DWF.cc \ Modules/MScalarSUN/TrPhi.cc \ - Modules/MScalarSUN/Grad.cc \ - Modules/MScalarSUN/TimeMomProbe.cc \ Modules/MScalarSUN/TrMag.cc \ - Modules/MScalarSUN/TrKinetic.cc \ - Modules/MScalarSUN/EMT.cc \ - Modules/MScalarSUN/ShiftProbe.cc \ + Modules/MScalarSUN/Grad.cc \ Modules/MScalarSUN/TransProj.cc \ Modules/MScalarSUN/StochFreeField.cc \ Modules/MScalarSUN/TwoPoint.cc \ Modules/MScalarSUN/TwoPointNPR.cc \ + Modules/MScalarSUN/EMT.cc \ + Modules/MScalarSUN/ShiftProbe.cc \ + Modules/MScalarSUN/TrKinetic.cc \ Modules/MScalarSUN/Div.cc \ + Modules/MScalarSUN/TimeMomProbe.cc \ + Modules/MScalar/FreeProp.cc \ + Modules/MScalar/ChargedProp.cc \ + Modules/MIO/LoadCoarseEigenPack.cc \ + Modules/MIO/LoadNersc.cc \ Modules/MIO/LoadEigenPack.cc \ Modules/MIO/LoadBinary.cc \ - Modules/MIO/LoadNersc.cc \ - Modules/MIO/LoadCoarseEigenPack.cc + Modules/MFermion/FreeProp.cc \ + Modules/MFermion/GaugeProp.cc \ + Modules/MSolver/LocalCoherenceLanczos.cc \ + Modules/MSolver/A2AVectors.cc \ + Modules/MSolver/RBPrecCG.cc \ + Modules/MAction/WilsonClover.cc \ + Modules/MAction/Wilson.cc \ + Modules/MAction/DWF.cc \ + Modules/MAction/ZMobiusDWF.cc \ + Modules/MSink/Point.cc \ + Modules/MSink/Smear.cc modules_hpp =\ + Modules/MContraction/WeakNeutral4ptDisc.hpp \ + Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MContraction/DiscLoop.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/WeakHamiltonian.hpp \ + Modules/MContraction/WardIdentity.hpp \ + Modules/MContraction/Gamma3pt.hpp \ Modules/MContraction/Baryon.hpp \ Modules/MContraction/Meson.hpp \ - Modules/MContraction/WeakHamiltonian.hpp \ - Modules/MContraction/WeakHamiltonianNonEye.hpp \ - Modules/MContraction/DiscLoop.hpp \ - Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MContraction/Gamma3pt.hpp \ - Modules/MContraction/WardIdentity.hpp \ - Modules/MContraction/WeakHamiltonianEye.hpp \ - Modules/MFermion/FreeProp.hpp \ - Modules/MFermion/GaugeProp.hpp \ - Modules/MSource/SeqGamma.hpp \ - Modules/MSource/Point.hpp \ - Modules/MSource/Wall.hpp \ - Modules/MSource/Z2.hpp \ - Modules/MSource/SeqConserved.hpp \ - Modules/MSink/Smear.hpp \ - Modules/MSink/Point.hpp \ - Modules/MSolver/LocalCoherenceLanczos.hpp \ - Modules/MSolver/RBPrecCG.hpp \ - Modules/MGauge/Unit.hpp \ Modules/MGauge/Random.hpp \ Modules/MGauge/FundtoHirep.hpp \ Modules/MGauge/StochEm.hpp \ + Modules/MGauge/Unit.hpp \ + Modules/MSource/Wall.hpp \ + Modules/MSource/Point.hpp \ + Modules/MSource/Z2.hpp \ + Modules/MSource/SeqConserved.hpp \ + Modules/MSource/SeqGamma.hpp \ Modules/MUtilities/TestSeqGamma.hpp \ Modules/MUtilities/TestSeqConserved.hpp \ Modules/MLoop/NoiseLoop.hpp \ - Modules/MScalar/FreeProp.hpp \ - Modules/MScalar/Scalar.hpp \ - Modules/MScalar/ChargedProp.hpp \ - Modules/MAction/DWF.hpp \ - Modules/MAction/Wilson.hpp \ - Modules/MAction/WilsonClover.hpp \ - Modules/MAction/ZMobiusDWF.hpp \ - Modules/MScalarSUN/StochFreeField.hpp \ Modules/MScalarSUN/TwoPointNPR.hpp \ - Modules/MScalarSUN/ShiftProbe.hpp \ - Modules/MScalarSUN/Div.hpp \ - Modules/MScalarSUN/TimeMomProbe.hpp \ Modules/MScalarSUN/TrMag.hpp \ + Modules/MScalarSUN/Grad.hpp \ Modules/MScalarSUN/EMT.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ + Modules/MScalarSUN/TimeMomProbe.hpp \ + Modules/MScalarSUN/TrKinetic.hpp \ + Modules/MScalarSUN/Div.hpp \ + Modules/MScalarSUN/ShiftProbe.hpp \ + Modules/MScalarSUN/StochFreeField.hpp \ Modules/MScalarSUN/TrPhi.hpp \ Modules/MScalarSUN/Utils.hpp \ Modules/MScalarSUN/TransProj.hpp \ - Modules/MScalarSUN/Grad.hpp \ - Modules/MScalarSUN/TrKinetic.hpp \ - Modules/MIO/LoadEigenPack.hpp \ + Modules/MScalar/ChargedProp.hpp \ + Modules/MScalar/Scalar.hpp \ + Modules/MScalar/FreeProp.hpp \ Modules/MIO/LoadNersc.hpp \ + Modules/MIO/LoadEigenPack.hpp \ + Modules/MIO/LoadBinary.hpp \ Modules/MIO/LoadCoarseEigenPack.hpp \ - Modules/MIO/LoadBinary.hpp + Modules/MFermion/GaugeProp.hpp \ + Modules/MFermion/FreeProp.hpp \ + Modules/MSolver/LocalCoherenceLanczos.hpp \ + Modules/MSolver/RBPrecCG.hpp \ + Modules/MSolver/A2AVectors.hpp \ + Modules/MAction/Wilson.hpp \ + Modules/MAction/ZMobiusDWF.hpp \ + Modules/MAction/WilsonClover.hpp \ + Modules/MAction/DWF.hpp \ + Modules/MSink/Point.hpp \ + Modules/MSink/Smear.hpp From 84685c9bc3d8cfb32e6536132062eb29603966b9 Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 4 Jun 2018 13:42:07 +0100 Subject: [PATCH 364/620] Overflow fix --- lib/lattice/Lattice_rng.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/lattice/Lattice_rng.h b/lib/lattice/Lattice_rng.h index edf9dd23..654c5dd5 100644 --- a/lib/lattice/Lattice_rng.h +++ b/lib/lattice/Lattice_rng.h @@ -158,10 +158,19 @@ namespace Grid { // tens of seconds per trajectory so this is clean in all reasonable cases, // and margin of safety is orders of magnitude. // We could hack Sitmo to skip in the higher order words of state if necessary + // + // Replace with 2^30 ; avoid problem on large volumes + // ///////////////////////////////////////////////////////////////////////////////////// // uint64_t skip = site+1; // Old init Skipped then drew. Checked compat with faster init + const int shift = 30; + uint64_t skip = site; - skip = skip<<40; + + skip = skip<> shift)==site); // check for overflow + eng.discard(skip); // std::cout << " Engine " < Date: Mon, 4 Jun 2018 18:34:15 +0100 Subject: [PATCH 365/620] Solve g++ problem on the lanczos test --- lib/algorithms/iterative/ImplicitlyRestartedLanczos.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h index 8011e796..cee566e6 100644 --- a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h +++ b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h @@ -57,8 +57,10 @@ void basisRotate(std::vector &basis,Eigen::MatrixXd& Qt,int j0, int j1, i parallel_region { - std::vector < vobj > B(Nm); // Thread private - + Vector < vobj > B; // Thread private + + PARALLEL_CRITICAL { B.resize(Nm); } + parallel_for_internal(int ss=0;ss < grid->oSites();ss++){ for(int j=j0; j Date: Mon, 4 Jun 2018 21:08:44 +0100 Subject: [PATCH 366/620] Better thread safety --- lib/algorithms/iterative/ImplicitlyRestartedLanczos.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h index cee566e6..64f1e9a7 100644 --- a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h +++ b/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h @@ -57,9 +57,8 @@ void basisRotate(std::vector &basis,Eigen::MatrixXd& Qt,int j0, int j1, i parallel_region { - Vector < vobj > B; // Thread private - PARALLEL_CRITICAL { B.resize(Nm); } + std::vector < vobj , commAllocator > B(Nm); // Thread private parallel_for_internal(int ss=0;ss < grid->oSites();ss++){ for(int j=j0; j Date: Wed, 20 Jun 2018 10:59:07 +0100 Subject: [PATCH 367/620] All to all module update that hit a promising milestone. Commiting for a reference for future changes. --- extras/Hadrons/AllToAllVectors.hpp | 277 +++++++++--------- extras/Hadrons/Modules.hpp | 91 +++--- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 98 ++++--- extras/Hadrons/modules.inc | 174 +++++------ 4 files changed, 326 insertions(+), 314 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index 7ddc0e81..de97051f 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -17,77 +17,53 @@ class A2AModesSchurDiagTwo A2AModesSchurDiagTwo(void) = default; virtual ~A2AModesSchurDiagTwo(void) = default; - void low_mode_v(Matrix &_Matrix, const Field &evec, const RealD &eval, Field &vout) + void Doo(Matrix &action, const Field &in, Field &out) { + Field tmp(in._grid); - GridBase *grid = _Matrix.RedBlackGrid(); + action.MooeeInv(in, out); + action.Meooe(out, tmp); + action.MooeeInv(tmp, out); + action.Meooe(out, tmp); - Field src_o(grid); - Field sol_e(grid); - Field sol_o(grid); - Field tmp(grid); - - pickCheckerboard(Odd, src_o, evec); - pickCheckerboard(Even, sol_e, vout); - pickCheckerboard(Odd, sol_o, vout); - - ///////////////////////////////////////////////////// - // v_ie = -(1/eval_i)* Mee Meo MooInv evec_i - ///////////////////////////////////////////////////// - _Matrix.MooeeInv(src_o, tmp); - assert(tmp.checkerboard == Odd); - _Matrix.Meooe(tmp, sol_e); - assert(sol_e.checkerboard == Even); - _Matrix.Mooee(sol_e, tmp); - assert(tmp.checkerboard == Even); - sol_e = -(1.0 / eval) * tmp; - assert(sol_e.checkerboard == Even); - - ///////////////////////////////////////////////////// - // v_io = -(1/eval_i)* MooInv evec_i - ///////////////////////////////////////////////////// - _Matrix.MooeeInv(src_o, tmp); - assert(tmp.checkerboard == Odd); - sol_o = -(1.0 / eval) * tmp; - assert(sol_o.checkerboard == Odd); - - setCheckerboard(vout, sol_e); - assert(sol_e.checkerboard == Even); - setCheckerboard(vout, sol_o); - assert(sol_o.checkerboard == Odd); + axpy(out, -1.0, tmp, in); } - void low_mode_w(Matrix &_Matrix, const Field &evec, const RealD &eval, Field &wout) + void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout, bool return_5d = true) { - GridBase *grid = _Matrix.RedBlackGrid(); - SchurDiagTwoOperator _HermOpEO(_Matrix); + GridBase *grid = action.RedBlackGrid(); Field src_o(grid); Field sol_e(grid); Field sol_o(grid); Field tmp(grid); - GridBase *fgrid = _Matrix.Grid(); + GridBase *fgrid = action.Grid(); Field tmp_out(fgrid); - pickCheckerboard(Odd, src_o, evec); - pickCheckerboard(Even, sol_e, wout); - pickCheckerboard(Odd, sol_o, wout); + src_o = evec; + src_o.checkerboard = Odd; + pickCheckerboard(Even, sol_e, tmp_out); + pickCheckerboard(Odd, sol_o, tmp_out); ///////////////////////////////////////////////////// - // w_ie = MeeInvDag MoeDag Doo evec_i + // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i ///////////////////////////////////////////////////// - _HermOpEO.Mpc(src_o, sol_e); - assert(sol_e.checkerboard == Odd); - _Matrix.MeooeDag(sol_e, tmp); + action.MooeeInv(src_o, tmp); + assert(tmp.checkerboard == Odd); + action.Meooe(tmp, sol_e); + assert(sol_e.checkerboard == Even); + action.MooeeInv(sol_e, tmp); assert(tmp.checkerboard == Even); - _Matrix.MooeeInvDag(tmp, sol_e); + sol_e = (-1.0 / eval) * tmp; assert(sol_e.checkerboard == Even); ///////////////////////////////////////////////////// - // w_io = Doo evec_i + // v_io = (1/eval_i) * MooInv evec_i ///////////////////////////////////////////////////// - _HermOpEO.Mpc(src_o, sol_o); + action.MooeeInv(src_o, tmp); + assert(tmp.checkerboard == Odd); + sol_o = (1.0 / eval) * tmp; assert(sol_o.checkerboard == Odd); setCheckerboard(tmp_out, sol_e); @@ -95,21 +71,85 @@ class A2AModesSchurDiagTwo setCheckerboard(tmp_out, sol_o); assert(sol_o.checkerboard == Odd); - _Matrix.Dminus(tmp_out, wout); + this->return_dim(action, tmp_out, vout, return_5d); } - void high_mode_v(Matrix &_Matrix, std::function &Solver, const Field &source, Field &vout) + void low_mode_w(Matrix &action, const Field &evec, const RealD &eval, Field &wout, bool return_5d = true) { - GridBase *fgrid = _Matrix.Grid(); + GridBase *grid = action.RedBlackGrid(); + SchurDiagTwoOperator _HermOpEO(action); + + Field src_o(grid); + Field sol_e(grid); + Field sol_o(grid); + Field tmp(grid); + + GridBase *fgrid = action.Grid(); + Field tmp_out(fgrid); + Field tmp_wout(fgrid); + + src_o = evec; + src_o.checkerboard = Odd; + pickCheckerboard(Even, sol_e, tmp_wout); + pickCheckerboard(Odd, sol_o, tmp_wout); + + ///////////////////////////////////////////////////// + // w_ie = - MeeInvDag MoeDag Doo evec_i + ///////////////////////////////////////////////////// + Doo(action, src_o, tmp); + assert(tmp.checkerboard == Odd); + action.MeooeDag(tmp, sol_e); + assert(sol_e.checkerboard == Even); + action.MooeeInvDag(sol_e, tmp); + assert(tmp.checkerboard == Even); + sol_e = (-1.0) * tmp; + + ///////////////////////////////////////////////////// + // w_io = Doo evec_i + ///////////////////////////////////////////////////// + Doo(action, src_o, sol_o); + assert(sol_o.checkerboard == Odd); + + setCheckerboard(tmp_wout, sol_e); + assert(sol_e.checkerboard == Even); + setCheckerboard(tmp_wout, sol_o); + assert(sol_o.checkerboard == Odd); + + action.DminusDag(tmp_wout, tmp_out); + this->return_dim(action, tmp_out, wout, return_5d); + } + + void high_mode_v(Matrix &action, std::function &Solver, const Field &source, Field &vout, bool return_5d = true) + { + GridBase *fgrid = action.Grid(); Field tmp(fgrid); + Field tmp_out(fgrid); - _Matrix.Dminus(source, tmp); - Solver(vout, tmp); + action.Dminus(source, tmp); + Solver(tmp_out, source); // Note: Solver is Solver(out, in) + this->return_dim(action, tmp_out, vout, return_5d); } - void high_mode_w(Matrix &_Matrix, const Field &source, Field &wout) + void high_mode_w(Matrix &action, const Field &source4d, Field &wout, bool return_5d = true) { - wout = source; + // GridBase *fgrid = action.Grid(); + // Field tmp_out(fgrid); + + // tmp_out = source; + // this->return_dim(action, tmp_out, wout, return_5d); + wout = source4d; + } + + void return_dim(Matrix &action, const Field &in, Field &out, bool return_5d) + { + if (return_5d) + { + out = in; + } + else + { + action.ExportPhysicalFermionSolution(in, out); + } } }; @@ -123,7 +163,7 @@ class A2ALMSchurDiagTwo : public A2AModesSchurDiagTwo private: const std::vector &evec; const std::vector &eval; - Matrix &action; + Matrix &action; public: A2ALMSchurDiagTwo(const std::vector &_evec, const std::vector &_eval, Matrix &_action) : evec(_evec), eval(_eval), action(_action){}; @@ -138,10 +178,10 @@ template class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo { private: - const std::vector &subspace; + const std::vector &subspace; const std::vector &evec_coarse; - const std::vector &eval_coarse; - Matrix &action; + const std::vector &eval_coarse; + Matrix &action; public: A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) @@ -164,58 +204,10 @@ template class A2AHMSchurDiagTwo : virtual public A2AModesSchurDiagTwo { public: - void operator()(Matrix &_Matrix, std::function &Solver, const Field &source, Field &vout, Field &wout) + void operator()(Matrix &action, std::function &Solver, const Field &source, Field &vout, Field &wout) { - this->high_mode_v(_Matrix, Solver, source, vout); - this->high_mode_w(_Matrix, source, wout); - } -}; - -template -class A2AVectorsReturnHigh : public A2AModesSchurDiagTwo -{ - private: - Matrix &action; - std::function &Solver; - const int Nh, Ls; - - public: - std::vector w_high, v_high; - A2AVectorsReturnHigh(Matrix &_action, - std::function &_Solver, - const int _Nh, const int _Ls) - : action(_action), - Solver(_Solver), - Nh(_Nh), Ls(_Ls) - { - GridBase *fgrid = action.Grid(); - resize(Nh, fgrid); - }; - - void resize(const size_t size, GridBase *grid) - { - w_high.resize(size, grid); - v_high.resize(size, grid); - } - - void high_modes(Field &source, int i) - { - this->high_mode_v(action, Solver, source, v_high[i]); - this->high_mode_w(action, source, w_high[i]); - } - - void operator()(int i, Field &vout, Field &wout) - { - if (Ls > 1) - { - vout = v_high[i]; - wout = w_high[i]; - } - else - { - action.ExportPhysicalFermionSolution(v_high[i], vout); - action.ExportPhysicalFermionSolution(w_high[i], wout); - } + this->high_mode_v(action, Solver, source, vout); + this->high_mode_w(action, source, wout); } }; @@ -227,26 +219,36 @@ template class A2AVectorsReturn : public A2AModesSchurDiagTwo { private: - const std::vector &evec; - const std::vector &eval; + const std::vector *evec; + const std::vector *eval; Matrix &action; std::function &Solver; - const int Nl, Nh, Ls; - - public: + const int Nl, Nh; + const bool return_5d; std::vector w_high, v_high; - A2AVectorsReturn(const std::vector &_evec, const std::vector &_eval, + public: + A2AVectorsReturn(const std::vector *_evec, const std::vector *_eval, Matrix &_action, std::function &_Solver, - const int _Nl, const int _Nh, const int _Ls) + const int _Nl, const int _Nh, + const bool _return_5d) : evec(_evec), eval(_eval), action(_action), Solver(_Solver), - Nl(_Nl), Nh(_Nh), Ls(_Ls) + Nl(_Nl), Nh(_Nh), + return_5d(_return_5d) { - GridBase *fgrid = action.Grid(); - resize(Nh, fgrid); + GridBase *grid; + if (return_5d) + { + grid = action.Grid(); + } + else + { + grid = action.GaugeGrid(); + } + resize(Nh, grid); }; void resize(const size_t size, GridBase *grid) @@ -255,38 +257,25 @@ class A2AVectorsReturn : public A2AModesSchurDiagTwo v_high.resize(size, grid); } - void high_modes(Field &source, int i) + void high_modes(Field &source5d, Field &source4d, int i) { - this->high_mode_v(action, Solver, source, v_high[i]); - this->high_mode_w(action, source, w_high[i]); + LOG(Message) << "A2A high modes for i = " << i << std::endl; + this->high_mode_v(action, Solver, source5d, v_high[i], return_5d); + this->high_mode_w(action, source4d, w_high[i], return_5d); } void operator()(int i, Field &vout, Field &wout) { - - GridBase *fgrid = action.Grid(); - Field vtmp(fgrid); - Field wtmp(fgrid); if (i < Nl) - { - this->low_mode_v(action, evec[i], eval[i], vtmp); - this->low_mode_w(action, evec[i], eval[i], wtmp); + { + LOG(Message) << "A2A low modes for i = " << i << std::endl; + this->low_mode_v(action, evec->at(i), eval->at(i), vout, return_5d); + this->low_mode_w(action, evec->at(i), eval->at(i), wout, return_5d); } else { - vtmp = v_high[i-Nl]; - wtmp = w_high[i-Nl]; - } - - if (Ls > 1) - { - vout = vtmp; - wout = wtmp; - } - else - { - action.ExportPhysicalFermionSolution(vtmp, vout); - action.ExportPhysicalFermionSolution(wtmp, wout); + vout = v_high[i - Nl]; + wout = w_high[i - Nl]; } } }; diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index e46bf01b..f81c01da 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,52 +1,53 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include +#include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index e4690b13..107d1edb 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -18,7 +18,7 @@ class A2AVectorsPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AVectorsPar, - int, Ls, + bool, return_5d, int, Nl, int, N, std::vector, sources, @@ -39,7 +39,6 @@ class TA2AVectors : public Module typedef A2AModesSchurDiagTwo A2ABase; typedef A2AVectorsReturn A2AReturn; - typedef A2AVectorsReturnHigh A2AReturnHigh; public: // constructor @@ -56,7 +55,7 @@ class TA2AVectors : public Module private: unsigned int Ls_; - std::string retName_; + std::string retName_, whighName_, vhighName_; }; MODULE_REGISTER_TMP(A2AVectors, ARG(TA2AVectors), MSolver); @@ -70,13 +69,15 @@ template TA2AVectors::TA2AVectors(const std::string name) : Module(name) , retName_ (name + "_ret") +, whighName_ (name + "_whigh") +, vhighName_ (name + "_vhigh") {} // dependencies/products /////////////////////////////////////////////////////// template std::vector TA2AVectors::getInput(void) { - std::vector in = {par().action, par().solver + "_subtract"}; + std::vector in = {par().action, par().solver, par().solver + "_subtract"}; int n = par().sources.size(); @@ -103,39 +104,57 @@ void TA2AVectors::setup(void) int N = par().N; int Nl = par().Nl; int Nh = N - Nl; - int Ls = par().Ls; + bool return_5d = par().return_5d; + int Ls, Ls_; + Ls_ = env().getObjectLs(par().solver + "_subtract"); + auto &solver = envGet(SolverFn, par().solver + "_subtract"); + if (!(Nl > 0)) + { + Ls_ = env().getObjectLs(par().solver); + auto &solver = envGet(SolverFn, par().solver); + } + + if (return_5d) + { + Ls = Ls_; + } + else + { + Ls = 1; + } auto &action = envGet(FMat, par().action); - auto &solver = envGet(SolverFn, par().solver + "_subtract"); - - GridBase *fgrid = action.Grid(); envTmpLat(FermionField, "ferm_src", Ls_); envTmpLat(FermionField, "tmp"); + std::vector *evec; + const std::vector *eval; + if (Nl > 0) { // Low modes auto &epack = envGet(EPack, par().eigenpack); - LOG(Message) << "using a2a with eigenpack '" - << par().eigenpack << "' (" - << epack.evec.size() << " modes)" << std::endl; - - envCreateDerived(A2ABase, A2AReturn, retName_, Ls, - epack.evec, epack.eval, - action, - solver, - Nl, Nh, Ls); + LOG(Message) << "Creating a2a vectors " << getName() << + " using eigenpack '" << par().eigenpack << "' (" + << epack.evec.size() << " modes)" << + " and " << Nh << " high modes." << std::endl; + evec = &epack.evec; + eval = &epack.eval; } else { - LOG(Message) << "using a2a with high modes only" << std::endl; - envCreateDerived(A2ABase, A2AReturnHigh, retName_, Ls, action, - solver, - Nh, Ls); + LOG(Message) << "Creating a2a vectors " << getName() << + " using " << Nh << " high modes only." << std::endl; } + envCreateDerived(A2ABase, A2AReturn, retName_, Ls, + evec, eval, + action, + solver, + Nl, Nh, + return_5d); } // execution /////////////////////////////////////////////////////////////////// @@ -145,30 +164,41 @@ void TA2AVectors::execute(void) auto &action = envGet(FMat, par().action); int Nt = env().getDim(Tp); - int Nl = par().Nl; // Number of low modes int Nc = FImpl::Dimension; + int Ls_; + int Nl = par().Nl; + Ls_ = env().getObjectLs(par().solver + "_subtract"); + if (!(Nl > 0)) + { + Ls_ = env().getObjectLs(par().solver); + } + + auto &a2areturn = envGetDerived(A2ABase, A2AReturn, retName_); // High modes auto sources = par().sources; + int Nsrc = par().sources.size(); envGetTmp(FermionField, ferm_src); envGetTmp(FermionField, tmp); + int N_count = 0; for (unsigned int s = 0; s < Ns; ++s) for (unsigned int c = 0; c < Nc; ++c) - for (unsigned int T = 0; T < Nt; T++) + for (unsigned int T = 0; T < Nsrc; T++) { - auto &fullSrc = envGet(PropagatorField, sources[T]); + auto &prop_src = envGet(PropagatorField, sources[T]); + LOG(Message) << "A2A src for s = " << s << " , c = " << c << ", T = " << T << std::endl; // source conversion for 4D sources if (!env().isObject5d(sources[T])) { if (Ls_ == 1) { - PropToFerm(ferm_src, fullSrc, s, c); + PropToFerm(ferm_src, prop_src, s, c); } else { - PropToFerm(tmp, fullSrc, s, c); + PropToFerm(tmp, prop_src, s, c); action.ImportPhysicalFermionSource(tmp, ferm_src); } } @@ -181,23 +211,13 @@ void TA2AVectors::execute(void) } else { - PropToFerm(ferm_src, fullSrc, s, c); + PropToFerm(ferm_src, prop_src, s, c); } } - - if (Nl > 0) - { - auto a2areturn = envGetDerived(A2ABase, A2AReturn, retName_); - a2areturn.high_modes(ferm_src, N_count); - } - else - { - auto a2areturnhigh = envGetDerived(A2ABase, A2AReturnHigh, retName_); - a2areturnhigh.high_modes(ferm_src, N_count); - } + LOG(Message) << "a2areturn.high_modes Ncount = " << N_count << std::endl; + a2areturn.high_modes(ferm_src, tmp, N_count); N_count++; } - } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index aecfdd5a..9bdb48cc 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,105 +1,107 @@ modules_cc =\ - Modules/MContraction/WeakHamiltonianEye.cc \ - Modules/MContraction/Baryon.cc \ - Modules/MContraction/WeakNeutral4ptDisc.cc \ - Modules/MContraction/DiscLoop.cc \ - Modules/MContraction/WeakHamiltonianNonEye.cc \ - Modules/MContraction/Meson.cc \ - Modules/MContraction/WardIdentity.cc \ - Modules/MContraction/Gamma3pt.cc \ - Modules/MGauge/Unit.cc \ - Modules/MGauge/FundtoHirep.cc \ - Modules/MGauge/StochEm.cc \ - Modules/MGauge/Random.cc \ - Modules/MSource/Wall.cc \ Modules/MSource/SeqConserved.cc \ - Modules/MSource/Z2.cc \ Modules/MSource/SeqGamma.cc \ Modules/MSource/Point.cc \ - Modules/MUtilities/TestSeqConserved.cc \ - Modules/MUtilities/TestSeqGamma.cc \ - Modules/MLoop/NoiseLoop.cc \ - Modules/MScalarSUN/TrPhi.cc \ - Modules/MScalarSUN/TrMag.cc \ - Modules/MScalarSUN/Grad.cc \ - Modules/MScalarSUN/TransProj.cc \ - Modules/MScalarSUN/StochFreeField.cc \ - Modules/MScalarSUN/TwoPoint.cc \ - Modules/MScalarSUN/TwoPointNPR.cc \ - Modules/MScalarSUN/EMT.cc \ - Modules/MScalarSUN/ShiftProbe.cc \ - Modules/MScalarSUN/TrKinetic.cc \ - Modules/MScalarSUN/Div.cc \ - Modules/MScalarSUN/TimeMomProbe.cc \ - Modules/MScalar/FreeProp.cc \ - Modules/MScalar/ChargedProp.cc \ - Modules/MIO/LoadCoarseEigenPack.cc \ + Modules/MSource/Z2.cc \ + Modules/MSource/Wall.cc \ + Modules/MSink/Point.cc \ + Modules/MSink/Smear.cc \ Modules/MIO/LoadNersc.cc \ Modules/MIO/LoadEigenPack.cc \ + Modules/MIO/LoadCoarseEigenPack.cc \ Modules/MIO/LoadBinary.cc \ - Modules/MFermion/FreeProp.cc \ - Modules/MFermion/GaugeProp.cc \ - Modules/MSolver/LocalCoherenceLanczos.cc \ - Modules/MSolver/A2AVectors.cc \ - Modules/MSolver/RBPrecCG.cc \ - Modules/MAction/WilsonClover.cc \ - Modules/MAction/Wilson.cc \ + Modules/MScalarSUN/TwoPointNPR.cc \ + Modules/MScalarSUN/TrPhi.cc \ + Modules/MScalarSUN/StochFreeField.cc \ + Modules/MScalarSUN/TrMag.cc \ + Modules/MScalarSUN/Div.cc \ + Modules/MScalarSUN/ShiftProbe.cc \ + Modules/MScalarSUN/Grad.cc \ + Modules/MScalarSUN/TwoPoint.cc \ + Modules/MScalarSUN/TimeMomProbe.cc \ + Modules/MScalarSUN/EMT.cc \ + Modules/MScalarSUN/TransProj.cc \ + Modules/MScalarSUN/TrKinetic.cc \ Modules/MAction/DWF.cc \ Modules/MAction/ZMobiusDWF.cc \ - Modules/MSink/Point.cc \ - Modules/MSink/Smear.cc + Modules/MAction/Wilson.cc \ + Modules/MAction/WilsonClover.cc \ + Modules/MContraction/WeakHamiltonianNonEye.cc \ + Modules/MContraction/WardIdentity.cc \ + Modules/MContraction/WeakHamiltonianEye.cc \ + Modules/MContraction/DiscLoop.cc \ + Modules/MContraction/A2AMeson.cc \ + Modules/MContraction/Baryon.cc \ + Modules/MContraction/Gamma3pt.cc \ + Modules/MContraction/WeakNeutral4ptDisc.cc \ + Modules/MContraction/Meson.cc \ + Modules/MScalar/ChargedProp.cc \ + Modules/MScalar/FreeProp.cc \ + Modules/MUtilities/TestSeqGamma.cc \ + Modules/MUtilities/TestSeqConserved.cc \ + Modules/MFermion/FreeProp.cc \ + Modules/MFermion/GaugeProp.cc \ + Modules/MSolver/RBPrecCG.cc \ + Modules/MSolver/LocalCoherenceLanczos.cc \ + Modules/MSolver/A2AVectors.cc \ + Modules/MLoop/NoiseLoop.cc \ + Modules/MGauge/Unit.cc \ + Modules/MGauge/Random.cc \ + Modules/MGauge/StochEm.cc \ + Modules/MGauge/FundtoHirep.cc modules_hpp =\ - Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MContraction/WeakHamiltonianEye.hpp \ - Modules/MContraction/DiscLoop.hpp \ - Modules/MContraction/WeakHamiltonianNonEye.hpp \ - Modules/MContraction/WeakHamiltonian.hpp \ - Modules/MContraction/WardIdentity.hpp \ - Modules/MContraction/Gamma3pt.hpp \ - Modules/MContraction/Baryon.hpp \ - Modules/MContraction/Meson.hpp \ - Modules/MGauge/Random.hpp \ - Modules/MGauge/FundtoHirep.hpp \ - Modules/MGauge/StochEm.hpp \ - Modules/MGauge/Unit.hpp \ - Modules/MSource/Wall.hpp \ - Modules/MSource/Point.hpp \ - Modules/MSource/Z2.hpp \ Modules/MSource/SeqConserved.hpp \ Modules/MSource/SeqGamma.hpp \ - Modules/MUtilities/TestSeqGamma.hpp \ - Modules/MUtilities/TestSeqConserved.hpp \ - Modules/MLoop/NoiseLoop.hpp \ - Modules/MScalarSUN/TwoPointNPR.hpp \ - Modules/MScalarSUN/TrMag.hpp \ - Modules/MScalarSUN/Grad.hpp \ - Modules/MScalarSUN/EMT.hpp \ - Modules/MScalarSUN/TwoPoint.hpp \ - Modules/MScalarSUN/TimeMomProbe.hpp \ - Modules/MScalarSUN/TrKinetic.hpp \ - Modules/MScalarSUN/Div.hpp \ - Modules/MScalarSUN/ShiftProbe.hpp \ - Modules/MScalarSUN/StochFreeField.hpp \ - Modules/MScalarSUN/TrPhi.hpp \ - Modules/MScalarSUN/Utils.hpp \ - Modules/MScalarSUN/TransProj.hpp \ - Modules/MScalar/ChargedProp.hpp \ - Modules/MScalar/Scalar.hpp \ - Modules/MScalar/FreeProp.hpp \ - Modules/MIO/LoadNersc.hpp \ - Modules/MIO/LoadEigenPack.hpp \ + Modules/MSource/Z2.hpp \ + Modules/MSource/Point.hpp \ + Modules/MSource/Wall.hpp \ + Modules/MSink/Smear.hpp \ + Modules/MSink/Point.hpp \ Modules/MIO/LoadBinary.hpp \ + Modules/MIO/LoadEigenPack.hpp \ Modules/MIO/LoadCoarseEigenPack.hpp \ - Modules/MFermion/GaugeProp.hpp \ - Modules/MFermion/FreeProp.hpp \ - Modules/MSolver/LocalCoherenceLanczos.hpp \ - Modules/MSolver/RBPrecCG.hpp \ - Modules/MSolver/A2AVectors.hpp \ - Modules/MAction/Wilson.hpp \ + Modules/MIO/LoadNersc.hpp \ + Modules/MScalarSUN/Utils.hpp \ + Modules/MScalarSUN/Grad.hpp \ + Modules/MScalarSUN/TrPhi.hpp \ + Modules/MScalarSUN/TwoPointNPR.hpp \ + Modules/MScalarSUN/TwoPoint.hpp \ + Modules/MScalarSUN/TransProj.hpp \ + Modules/MScalarSUN/TrKinetic.hpp \ + Modules/MScalarSUN/StochFreeField.hpp \ + Modules/MScalarSUN/ShiftProbe.hpp \ + Modules/MScalarSUN/TimeMomProbe.hpp \ + Modules/MScalarSUN/Div.hpp \ + Modules/MScalarSUN/TrMag.hpp \ + Modules/MScalarSUN/EMT.hpp \ Modules/MAction/ZMobiusDWF.hpp \ + Modules/MAction/Wilson.hpp \ Modules/MAction/WilsonClover.hpp \ Modules/MAction/DWF.hpp \ - Modules/MSink/Point.hpp \ - Modules/MSink/Smear.hpp + Modules/MContraction/WeakHamiltonian.hpp \ + Modules/MContraction/DiscLoop.hpp \ + Modules/MContraction/Meson.hpp \ + Modules/MContraction/WardIdentity.hpp \ + Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MContraction/Gamma3pt.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/Baryon.hpp \ + Modules/MContraction/WeakNeutral4ptDisc.hpp \ + Modules/MContraction/A2AMeson.hpp \ + Modules/MScalar/Scalar.hpp \ + Modules/MScalar/FreeProp.hpp \ + Modules/MScalar/ChargedProp.hpp \ + Modules/MUtilities/TestSeqConserved.hpp \ + Modules/MUtilities/TestSeqGamma.hpp \ + Modules/MFermion/FreeProp.hpp \ + Modules/MFermion/GaugeProp.hpp \ + Modules/MSolver/A2AVectors.hpp \ + Modules/MSolver/RBPrecCG.hpp \ + Modules/MSolver/LocalCoherenceLanczos.hpp \ + Modules/MLoop/NoiseLoop.hpp \ + Modules/MGauge/StochEm.hpp \ + Modules/MGauge/FundtoHirep.hpp \ + Modules/MGauge/Unit.hpp \ + Modules/MGauge/Random.hpp From ae37fda699037fa7fc483e9092dfaedbe338f598 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Wed, 20 Jun 2018 16:07:40 +0100 Subject: [PATCH 368/620] A more elegant way to subtract guesses from solve and a bool check before verifying residual --- lib/algorithms/iterative/SchurRedBlack.h | 112 ++++++++++------------- 1 file changed, 46 insertions(+), 66 deletions(-) diff --git a/lib/algorithms/iterative/SchurRedBlack.h b/lib/algorithms/iterative/SchurRedBlack.h index ae751074..465f331c 100644 --- a/lib/algorithms/iterative/SchurRedBlack.h +++ b/lib/algorithms/iterative/SchurRedBlack.h @@ -160,19 +160,12 @@ namespace Grid { // Call the red-black solver ////////////////////////////////////////////////////////////// std::cout< using SchurRedBlackStagSolve = SchurRedBlackStaggeredSolve; @@ -266,17 +261,10 @@ namespace Grid { ////////////////////////////////////////////////////////////// std::cout< Date: Thu, 21 Jun 2018 16:36:06 +0100 Subject: [PATCH 369/620] Restructured the class that computes and returns the A2A vectors. --- extras/Hadrons/AllToAllVectors.hpp | 196 +++++++++++++---------------- 1 file changed, 88 insertions(+), 108 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index de97051f..516a425f 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -13,9 +13,79 @@ BEGIN_HADRONS_NAMESPACE template class A2AModesSchurDiagTwo { + private: + const std::vector *evec; + const std::vector *eval; + Matrix &action; + std::function &Solver; + const int Nl, Nh; + const bool return_5d; + std::vector w_high_5d, v_high_5d, w_high_4d, v_high_4d; + public: - A2AModesSchurDiagTwo(void) = default; - virtual ~A2AModesSchurDiagTwo(void) = default; + A2AModesSchurDiagTwo(const std::vector *_evec, const std::vector *_eval, + Matrix &_action, + std::function &_Solver, + const int _Nl, const int _Nh, + const bool _return_5d) + : evec(_evec), eval(_eval), + action(_action), + Solver(_Solver), + Nl(_Nl), Nh(_Nh), + return_5d(_return_5d) + { + init_resize(1, Nh); + if (return_5d) init_resize(Nh, Nh); + }; + + void init_resize(const size_t size_5d, const size_t size_4d) + { + GridBase *grid_5d = action.Grid(); + GridBase *grid_4d = action.GaugeGrid(); + + w_high_5d.resize(size_5d, grid_5d); + v_high_5d.resize(size_5d, grid_5d); + + w_high_4d.resize(size_4d, grid_4d); + v_high_4d.resize(size_4d, grid_4d); + } + + void high_modes(Field &source_5d, Field &source_4d, int i) + { + int i5d; + LOG(Message) << "A2A high modes for i = " << i << std::endl; + i5d = 0; + if (return_5d) i5d = i; + this->high_mode_v(action, Solver, source_5d, v_high_5d[i5d], v_high_4d[i]); + this->high_mode_w(source_5d, source_4d, w_high_5d[i5d], w_high_4d[i]); + } + + void return_v(int i, Field &vout_5d, Field &vout_4d) + { + if (i < Nl) + { + this->low_mode_v(action, evec->at(i), eval->at(i), vout_5d, vout_4d); + } + else + { + vout_4d = v_high_4d[i - Nl]; + if (!(return_5d)) i = Nl; + vout_5d = v_high_5d[i - Nl]; + } + } + void return_w(int i, Field &wout_5d, Field &wout_4d) + { + if (i < Nl) + { + this->low_mode_w(action, evec->at(i), eval->at(i), wout_5d, wout_5d); + } + else + { + wout_4d = w_high_4d[i - Nl]; + if (!(return_5d)) i = Nl; + wout_5d = w_high_5d[i - Nl]; + } + } void Doo(Matrix &action, const Field &in, Field &out) { @@ -26,10 +96,10 @@ class A2AModesSchurDiagTwo action.MooeeInv(tmp, out); action.Meooe(out, tmp); - axpy(out, -1.0, tmp, in); + axpy(out,-1.0, tmp, in); } - void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout, bool return_5d = true) + void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout_5d, Field &vout_4d) { GridBase *grid = action.RedBlackGrid(); @@ -38,13 +108,10 @@ class A2AModesSchurDiagTwo Field sol_o(grid); Field tmp(grid); - GridBase *fgrid = action.Grid(); - Field tmp_out(fgrid); - src_o = evec; src_o.checkerboard = Odd; - pickCheckerboard(Even, sol_e, tmp_out); - pickCheckerboard(Odd, sol_o, tmp_out); + pickCheckerboard(Even, sol_e, vout_5d); + pickCheckerboard(Odd, sol_o, vout_5d); ///////////////////////////////////////////////////// // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i @@ -66,15 +133,15 @@ class A2AModesSchurDiagTwo sol_o = (1.0 / eval) * tmp; assert(sol_o.checkerboard == Odd); - setCheckerboard(tmp_out, sol_e); + setCheckerboard(vout_5d, sol_e); assert(sol_e.checkerboard == Even); - setCheckerboard(tmp_out, sol_o); + setCheckerboard(vout_5d, sol_o); assert(sol_o.checkerboard == Odd); - this->return_dim(action, tmp_out, vout, return_5d); + action.ExportPhysicalFermionSolution(vout_5d, vout_4d); } - void low_mode_w(Matrix &action, const Field &evec, const RealD &eval, Field &wout, bool return_5d = true) + void low_mode_w(Matrix &action, const Field &evec, const RealD &eval, Field &wout_5d, Field &wout_4d) { GridBase *grid = action.RedBlackGrid(); SchurDiagTwoOperator _HermOpEO(action); @@ -85,7 +152,6 @@ class A2AModesSchurDiagTwo Field tmp(grid); GridBase *fgrid = action.Grid(); - Field tmp_out(fgrid); Field tmp_wout(fgrid); src_o = evec; @@ -115,41 +181,24 @@ class A2AModesSchurDiagTwo setCheckerboard(tmp_wout, sol_o); assert(sol_o.checkerboard == Odd); - action.DminusDag(tmp_wout, tmp_out); - this->return_dim(action, tmp_out, wout, return_5d); + action.DminusDag(tmp_wout, wout_5d); + action.ExportPhysicalFermionSolution(wout_5d, wout_4d); } - void high_mode_v(Matrix &action, std::function &Solver, const Field &source, Field &vout, bool return_5d = true) + void high_mode_v(Matrix &action, std::function &Solver, const Field &source, Field &vout_5d, Field &vout_4d) { GridBase *fgrid = action.Grid(); Field tmp(fgrid); - Field tmp_out(fgrid); action.Dminus(source, tmp); - Solver(tmp_out, source); // Note: Solver is Solver(out, in) - this->return_dim(action, tmp_out, vout, return_5d); + Solver(vout_5d, source); // Note: Solver is Solver(out, in) + action.ExportPhysicalFermionSolution(vout_5d, vout_4d); } - void high_mode_w(Matrix &action, const Field &source4d, Field &wout, bool return_5d = true) + void high_mode_w(const Field &source_5d, const Field &source_4d, Field &wout_5d, Field &wout_4d) { - // GridBase *fgrid = action.Grid(); - // Field tmp_out(fgrid); - - // tmp_out = source; - // this->return_dim(action, tmp_out, wout, return_5d); - wout = source4d; - } - - void return_dim(Matrix &action, const Field &in, Field &out, bool return_5d) - { - if (return_5d) - { - out = in; - } - else - { - action.ExportPhysicalFermionSolution(in, out); - } + wout_5d = source_5d; + wout_4d = source_4d; } }; @@ -211,75 +260,6 @@ class A2AHMSchurDiagTwo : virtual public A2AModesSchurDiagTwo } }; -//////////////////////////////// -// Both Modes -//////////////////////////////// - -template -class A2AVectorsReturn : public A2AModesSchurDiagTwo -{ - private: - const std::vector *evec; - const std::vector *eval; - Matrix &action; - std::function &Solver; - const int Nl, Nh; - const bool return_5d; - std::vector w_high, v_high; - - public: - A2AVectorsReturn(const std::vector *_evec, const std::vector *_eval, - Matrix &_action, - std::function &_Solver, - const int _Nl, const int _Nh, - const bool _return_5d) - : evec(_evec), eval(_eval), - action(_action), - Solver(_Solver), - Nl(_Nl), Nh(_Nh), - return_5d(_return_5d) - { - GridBase *grid; - if (return_5d) - { - grid = action.Grid(); - } - else - { - grid = action.GaugeGrid(); - } - resize(Nh, grid); - }; - - void resize(const size_t size, GridBase *grid) - { - w_high.resize(size, grid); - v_high.resize(size, grid); - } - - void high_modes(Field &source5d, Field &source4d, int i) - { - LOG(Message) << "A2A high modes for i = " << i << std::endl; - this->high_mode_v(action, Solver, source5d, v_high[i], return_5d); - this->high_mode_w(action, source4d, w_high[i], return_5d); - } - - void operator()(int i, Field &vout, Field &wout) - { - if (i < Nl) - { - LOG(Message) << "A2A low modes for i = " << i << std::endl; - this->low_mode_v(action, evec->at(i), eval->at(i), vout, return_5d); - this->low_mode_w(action, evec->at(i), eval->at(i), wout, return_5d); - } - else - { - vout = v_high[i - Nl]; - wout = w_high[i - Nl]; - } - } -}; - END_HADRONS_NAMESPACE #endif // A2A_Vectors_hpp_ \ No newline at end of file From 8fccda301a7fadcf63e05884c3a9c4e2813aedc1 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 21 Jun 2018 16:36:59 +0100 Subject: [PATCH 370/620] Fixed a bug where the guess was always subtracted after the solve and included appropriate weights for the sources in the one case we're looking at now. More work needs to be done to make the 5d/4d source logic less brittle. --- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 44 +++++++------------ 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 107d1edb..5b244967 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -38,7 +38,6 @@ class TA2AVectors : public Module typedef CoarseFermionEigenPack CoarseEPack; typedef A2AModesSchurDiagTwo A2ABase; - typedef A2AVectorsReturn A2AReturn; public: // constructor @@ -55,7 +54,7 @@ class TA2AVectors : public Module private: unsigned int Ls_; - std::string retName_, whighName_, vhighName_; + std::string retName_; }; MODULE_REGISTER_TMP(A2AVectors, ARG(TA2AVectors), MSolver); @@ -69,8 +68,6 @@ template TA2AVectors::TA2AVectors(const std::string name) : Module(name) , retName_ (name + "_ret") -, whighName_ (name + "_whigh") -, vhighName_ (name + "_vhigh") {} // dependencies/products /////////////////////////////////////////////////////// @@ -107,27 +104,16 @@ void TA2AVectors::setup(void) bool return_5d = par().return_5d; int Ls, Ls_; - Ls_ = env().getObjectLs(par().solver + "_subtract"); - auto &solver = envGet(SolverFn, par().solver + "_subtract"); - if (!(Nl > 0)) - { - Ls_ = env().getObjectLs(par().solver); - auto &solver = envGet(SolverFn, par().solver); - } - - if (return_5d) - { - Ls = Ls_; - } - else - { - Ls = 1; - } + std::string sub_string = ""; + if (Nl > 0) sub_string = "_subtract"; + auto &solver = envGet(SolverFn, par().solver + sub_string); + Ls_ = env().getObjectLs(par().solver + sub_string); auto &action = envGet(FMat, par().action); envTmpLat(FermionField, "ferm_src", Ls_); envTmpLat(FermionField, "tmp"); + envTmpLat(FermionField, "tmp2"); std::vector *evec; const std::vector *eval; @@ -149,7 +135,7 @@ void TA2AVectors::setup(void) LOG(Message) << "Creating a2a vectors " << getName() << " using " << Nh << " high modes only." << std::endl; } - envCreateDerived(A2ABase, A2AReturn, retName_, Ls, + envCreate(A2ABase, retName_, Ls_, evec, eval, action, solver, @@ -167,13 +153,12 @@ void TA2AVectors::execute(void) int Nc = FImpl::Dimension; int Ls_; int Nl = par().Nl; - Ls_ = env().getObjectLs(par().solver + "_subtract"); - if (!(Nl > 0)) - { - Ls_ = env().getObjectLs(par().solver); - } - auto &a2areturn = envGetDerived(A2ABase, A2AReturn, retName_); + std::string sub_string = ""; + if (Nl > 0) sub_string = "_subtract"; + Ls_ = env().getObjectLs(par().solver + sub_string); + + auto &a2areturn = envGet(A2ABase, retName_); // High modes auto sources = par().sources; @@ -181,7 +166,9 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, ferm_src); envGetTmp(FermionField, tmp); + envGetTmp(FermionField, tmp2); + double weight = 1.0 / sqrt(Ns*Nc*Nsrc); int N_count = 0; for (unsigned int s = 0; s < Ns; ++s) for (unsigned int c = 0; c < Nc; ++c) @@ -198,7 +185,8 @@ void TA2AVectors::execute(void) } else { - PropToFerm(tmp, prop_src, s, c); + PropToFerm(tmp2, prop_src, s, c); + tmp = weight*tmp2; action.ImportPhysicalFermionSource(tmp, ferm_src); } } From 91405de3f71e4eafc0dd3c7c1b490ce9c4612c48 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 22 Jun 2018 12:14:37 +0200 Subject: [PATCH 371/620] Hadrons: new solver exposing fermion matrix and generic source/solve import/export --- extras/Hadrons/Global.hpp | 8 +-- extras/Hadrons/Makefile.am | 3 +- extras/Hadrons/Modules/MAction/DWF.hpp | 2 +- extras/Hadrons/Modules/MAction/Wilson.hpp | 2 +- .../Hadrons/Modules/MAction/WilsonClover.hpp | 2 +- extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp | 2 +- extras/Hadrons/Modules/MFermion/FreeProp.hpp | 2 +- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 21 +++++-- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 6 +- extras/Hadrons/Modules/MSource/SeqGamma.hpp | 2 +- extras/Hadrons/Solver.hpp | 62 +++++++++++++++++++ 11 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 extras/Hadrons/Solver.hpp diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 72fbdf80..bae34a8d 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -93,17 +93,15 @@ typedef typename SImpl::Field ScalarField##suffix;\ typedef typename SImpl::Field PropagatorField##suffix; #define SOLVER_TYPE_ALIASES(FImpl, suffix)\ -typedef std::function SolverFn##suffix; +typedef Solver Solver##suffix; #define SINK_TYPE_ALIASES(suffix)\ typedef std::function SinkFn##suffix; -#define FGS_TYPE_ALIASES(FImpl, suffix)\ +#define FG_TYPE_ALIASES(FImpl, suffix)\ FERM_TYPE_ALIASES(FImpl, suffix)\ -GAUGE_TYPE_ALIASES(FImpl, suffix)\ -SOLVER_TYPE_ALIASES(FImpl, suffix) +GAUGE_TYPE_ALIASES(FImpl, suffix) // logger class HadronsLogger: public Logger diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index 3b945124..eb0bc3ad 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -15,16 +15,17 @@ libHadrons_adir = $(pkgincludedir)/Hadrons nobase_libHadrons_a_HEADERS = \ $(modules_hpp) \ Application.hpp \ + EigenPack.hpp \ Environment.hpp \ Exceptions.hpp \ Factory.hpp \ GeneticScheduler.hpp \ Global.hpp \ Graph.hpp \ - EigenPack.hpp \ Module.hpp \ Modules.hpp \ ModuleFactory.hpp \ + Solver.hpp \ VirtualMachine.hpp HadronsXmlRun_SOURCES = HadronsXmlRun.cc diff --git a/extras/Hadrons/Modules/MAction/DWF.hpp b/extras/Hadrons/Modules/MAction/DWF.hpp index f0dda4b0..94a05cc8 100644 --- a/extras/Hadrons/Modules/MAction/DWF.hpp +++ b/extras/Hadrons/Modules/MAction/DWF.hpp @@ -56,7 +56,7 @@ template class TDWF: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); public: // constructor TDWF(const std::string name); diff --git a/extras/Hadrons/Modules/MAction/Wilson.hpp b/extras/Hadrons/Modules/MAction/Wilson.hpp index 1a119571..a0eabd82 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.hpp +++ b/extras/Hadrons/Modules/MAction/Wilson.hpp @@ -54,7 +54,7 @@ template class TWilson: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); public: // constructor TWilson(const std::string name); diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/extras/Hadrons/Modules/MAction/WilsonClover.hpp index ead3accc..bb2c5b59 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/extras/Hadrons/Modules/MAction/WilsonClover.hpp @@ -59,7 +59,7 @@ template class TWilsonClover: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); public: // constructor TWilsonClover(const std::string name); diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp index 52e65322..88e4e85c 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -57,7 +57,7 @@ template class TZMobiusDWF: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); public: // constructor TZMobiusDWF(const std::string name); diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.hpp b/extras/Hadrons/Modules/MFermion/FreeProp.hpp index b1038ddd..0786eb2b 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/FreeProp.hpp @@ -57,7 +57,7 @@ template class TFreeProp: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); public: // constructor TFreeProp(const std::string name); diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index ee21cba9..fdd23766 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -35,6 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -76,7 +77,8 @@ template class TGaugeProp: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); + SOLVER_TYPE_ALIASES(FImpl,); public: // constructor TGaugeProp(const std::string name); @@ -92,7 +94,7 @@ protected: virtual void execute(void); private: unsigned int Ls_; - SolverFn *solver_{nullptr}; + Solver *solver_{nullptr}; }; MODULE_REGISTER_TMP(GaugeProp, TGaugeProp, MFermion); @@ -147,7 +149,8 @@ void TGaugeProp::execute(void) std::string propName = (Ls_ == 1) ? getName() : (getName() + "_5d"); auto &prop = envGet(PropagatorField, propName); auto &fullSrc = envGet(PropagatorField, par().source); - auto &solver = envGet(SolverFn, par().solver); + auto &solver = envGet(Solver, par().solver); + auto &mat = solver.getFMat(); envGetTmp(FermionField, source); envGetTmp(FermionField, sol); @@ -155,11 +158,12 @@ void TGaugeProp::execute(void) LOG(Message) << "Inverting using solver '" << par().solver << "' on source '" << par().source << "'" << std::endl; for (unsigned int s = 0; s < Ns; ++s) - for (unsigned int c = 0; c < FImpl::Dimension; ++c) + for (unsigned int c = 0; c < FImpl::Dimension; ++c) { LOG(Message) << "Inversion for spin= " << s << ", color= " << c << std::endl; // source conversion for 4D sources + LOG(Message) << "Import source" << std::endl; if (!env().isObject5d(par().source)) { if (Ls_ == 1) @@ -169,7 +173,7 @@ void TGaugeProp::execute(void) else { PropToFerm(tmp, fullSrc, s, c); - make_5D(tmp, source, Ls_); + mat.ImportPhysicalFermionSource(tmp, source); } } // source conversion for 5D sources @@ -184,14 +188,19 @@ void TGaugeProp::execute(void) PropToFerm(source, fullSrc, s, c); } } + LOG(Message) << "Prepare source" << std::endl; + sol = source; + mat.Dminus(sol, source); sol = zero; + LOG(Message) << "Solve" << std::endl; solver(sol, source); + LOG(Message) << "Export solution" << std::endl; FermToProp(prop, sol, s, c); // create 4D propagators from 5D one if necessary if (Ls_ > 1) { PropagatorField &p4d = envGet(PropagatorField, getName()); - make_4D(sol, tmp, Ls_); + mat.ExportPhysicalFermionSolution(sol, tmp); FermToProp(p4d, tmp, s, c); } } diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 206d44d1..31be621f 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -32,6 +32,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include BEGIN_HADRONS_NAMESPACE @@ -55,7 +56,8 @@ template class TRBPrecCG: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); + SOLVER_TYPE_ALIASES(FImpl,); typedef FermionEigenPack EPack; typedef CoarseFermionEigenPack CoarseEPack; typedef std::shared_ptr> GuesserPt; @@ -175,7 +177,7 @@ void TRBPrecCG::setup(void) schurSolver(mat, source, sol, *guesser); }; - envCreate(SolverFn, getName(), Ls, solver); + envCreate(Solver, getName(), Ls, solver, mat); } diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.hpp b/extras/Hadrons/Modules/MSource/SeqGamma.hpp index 4fe4dd76..2d8e1c31 100644 --- a/extras/Hadrons/Modules/MSource/SeqGamma.hpp +++ b/extras/Hadrons/Modules/MSource/SeqGamma.hpp @@ -71,7 +71,7 @@ template class TSeqGamma: public Module { public: - FGS_TYPE_ALIASES(FImpl,); + FG_TYPE_ALIASES(FImpl,); public: // constructor TSeqGamma(const std::string name); diff --git a/extras/Hadrons/Solver.hpp b/extras/Hadrons/Solver.hpp new file mode 100644 index 00000000..08867634 --- /dev/null +++ b/extras/Hadrons/Solver.hpp @@ -0,0 +1,62 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/EigenPack.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_Solver_hpp_ +#define Hadrons_Solver_hpp_ + +#include + +BEGIN_HADRONS_NAMESPACE + +template +class Solver +{ +public: + typedef typename FImpl::FermionField FermionField; + typedef FermionOperator FMat; + typedef std::function SolverFn; +public: + Solver(SolverFn fn, FMat &mat): mat_(mat), fn_(fn) {} + + void operator()(FermionField &sol, const FermionField &src) + { + fn_(sol, src); + } + + FMat & getFMat(void) + { + return mat_; + } +private: + FMat &mat_; + SolverFn fn_; +}; + +END_HADRONS_NAMESPACE + +#endif // Hadrons_Solver_hpp_ From 0de090ee741d1e8e67f57b7d8823f5989260f966 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Fri, 22 Jun 2018 12:28:41 +0100 Subject: [PATCH 372/620] Temporarily added in the contraction code that produced the working 2-pt function. This is commited for reference only and will be removed in the next push. --- .../Hadrons/Modules/MContraction/A2AMeson.cc | 7 + .../Hadrons/Modules/MContraction/A2AMeson.hpp | 214 ++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 extras/Hadrons/Modules/MContraction/A2AMeson.cc create mode 100644 extras/Hadrons/Modules/MContraction/A2AMeson.hpp diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.cc b/extras/Hadrons/Modules/MContraction/A2AMeson.cc new file mode 100644 index 00000000..3ce5fe83 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TA2AMeson; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp new file mode 100644 index 00000000..bfea87e4 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp @@ -0,0 +1,214 @@ +#ifndef Hadrons_MContraction_A2AMeson_hpp_ +#define Hadrons_MContraction_A2AMeson_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * A2AMeson * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MContraction) + +typedef std::pair GammaPair; + +class A2AMesonPar : Serializable +{ + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonPar, + int, Nl, + int, N, + std::string, A2A1, + std::string, A2A2, + std::string, action, + std::string, epack1, + std::string, epack2, + std::string, gammas, + std::string, output); +}; + +template +class TA2AMeson : public Module +{ + public: + FERM_TYPE_ALIASES(FImpl, ); + + typedef A2AModesSchurDiagTwo A2ABase; + + class Result : Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + Gamma::Algebra, gamma_snk, + Gamma::Algebra, gamma_src, + std::vector, corr); + }; + + public: + // constructor + TA2AMeson(const std::string name); + // destructor + virtual ~TA2AMeson(void){}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + virtual void parseGammaString(std::vector &gammaList); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER(A2AMeson, ARG(TA2AMeson), MContraction); + +/****************************************************************************** +* TA2AMeson implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TA2AMeson::TA2AMeson(const std::string name) + : Module(name) +{ +} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TA2AMeson::getInput(void) +{ + std::vector in = {par().A2A1, par().A2A2, par().action}; + in.push_back(par().A2A1 + "_ret"); + in.push_back(par().A2A2 + "_ret"); + int Nl = par().Nl; + if (Nl > 0) + { + in.push_back(par().epack1); + in.push_back(par().epack2); + } + + return in; +} + +template +std::vector TA2AMeson::getOutput(void) +{ + std::vector out = {}; + + return out; +} + +template +void TA2AMeson::parseGammaString(std::vector &gammaList) +{ + gammaList.clear(); + // Parse individual contractions from input string. + gammaList = strToVec(par().gammas); +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TA2AMeson::setup(void) +{ + int nt = env().getDim(Tp); + int N = par().N; + + int Ls_ = env().getObjectLs(par().A2A1 + "_ret"); + + envTmp(std::vector, "w1", 1, N, FermionField(env().getGrid(1))); + envTmp(std::vector, "v1", 1, N, FermionField(env().getGrid(1))); + envTmpLat(FermionField, "tmpv_5d", Ls_); + envTmpLat(FermionField, "tmpw_5d", Ls_); + + envTmp(std::vector, "MF_x", 1, nt); + envTmp(std::vector, "MF_y", 1, nt); + envTmp(std::vector, "tmp", 1, nt); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AMeson::execute(void) +{ + LOG(Message) << "Computing A2A meson contractions" << std::endl; + + Result result; + Gamma g5(Gamma::Algebra::Gamma5); + std::vector gammaList; + int nt = env().getDim(Tp); + + parseGammaString(gammaList); + + result.gamma_snk = gammaList[0].first; + result.gamma_src = gammaList[0].second; + result.corr.resize(nt); + + int Nl = par().Nl; + int N = par().N; + LOG(Message) << "N for A2A cont: " << N << std::endl; + + envGetTmp(std::vector, MF_x); + envGetTmp(std::vector, MF_y); + envGetTmp(std::vector, tmp); + + for (unsigned int t = 0; t < nt; ++t) + { + tmp[t] = TensorRemove(MF_x[t] * MF_y[t] * 0.0); + } + + Gamma gSnk(gammaList[0].first); + Gamma gSrc(gammaList[0].second); + + auto &a2a1_fn = envGet(A2ABase, par().A2A1 + "_ret"); + + envGetTmp(std::vector, w1); + envGetTmp(std::vector, v1); + envGetTmp(FermionField, tmpv_5d); + envGetTmp(FermionField, tmpw_5d); + + LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; + for (int i = 0; i < N; i++) + { + a2a1_fn.return_v(i, tmpv_5d, v1[i]); + a2a1_fn.return_w(i, tmpw_5d, w1[i]); + } + LOG(Message) << "Found v and w vectors for N = " << N << std::endl; + for (unsigned int i = 0; i < N; i++) + { + v1[i] = gSnk * v1[i]; + } + int ty; + for (unsigned int i = 0; i < N; i++) + { + for (unsigned int j = 0; j < N; j++) + { + sliceInnerProductVector(MF_x, w1[i], v1[j], Tp); + sliceInnerProductVector(MF_y, w1[j], v1[i], Tp); + for (unsigned int t = 0; t < nt; ++t) + { + for (unsigned int tx = 0; tx < nt; tx++) + { + ty = (tx + t) % nt; + tmp[t] += TensorRemove((MF_x[tx]) * (MF_y[ty])); + } + } + } + if (i % 10 == 0) + { + LOG(Message) << "MF for i = " << i << " of " << N << std::endl; + } + } + double NTinv = 1.0 / static_cast(nt); + for (unsigned int t = 0; t < nt; ++t) + { + result.corr[t] = NTinv*tmp[t]; + } + + saveResult(par().output, "meson", result); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MContraction_A2AMeson_hpp_ From 1ac3526f3303b215378111b589dd7274c0d75d84 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Fri, 22 Jun 2018 12:29:42 +0100 Subject: [PATCH 373/620] Small changes to the A2A header and module --- extras/Hadrons/AllToAllVectors.hpp | 2 +- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index 516a425f..436f18b8 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -77,7 +77,7 @@ class A2AModesSchurDiagTwo { if (i < Nl) { - this->low_mode_w(action, evec->at(i), eval->at(i), wout_5d, wout_5d); + this->low_mode_w(action, evec->at(i), eval->at(i), wout_5d, wout_4d); } else { diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 5b244967..4db90eef 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -168,6 +168,8 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, tmp); envGetTmp(FermionField, tmp2); + // TODO: At the moment weighting only applies to the 4d->5d source path + // similar to how the 5d and 4d srcs are passed in, this needs more work to be less brittle double weight = 1.0 / sqrt(Ns*Nc*Nsrc); int N_count = 0; for (unsigned int s = 0; s < Ns; ++s) From c84eeedec3fe975186f95d122ea6ee66bc613f47 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 22 Jun 2018 15:53:22 +0200 Subject: [PATCH 374/620] Hadrons: GaugeProp module for z-Wilson actions --- extras/Hadrons/Modules/MFermion/GaugeProp.cc | 2 +- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.cc b/extras/Hadrons/Modules/MFermion/GaugeProp.cc index 8db69495..f03bf2be 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.cc +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.cc @@ -32,4 +32,4 @@ using namespace Hadrons; using namespace MFermion; template class Grid::Hadrons::MFermion::TGaugeProp; - +template class Grid::Hadrons::MFermion::TGaugeProp; diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index fdd23766..8aafb834 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -98,6 +98,8 @@ private: }; MODULE_REGISTER_TMP(GaugeProp, TGaugeProp, MFermion); +MODULE_REGISTER_TMP(ZGaugeProp, TGaugeProp, MFermion); + /****************************************************************************** * TGaugeProp implementation * ******************************************************************************/ From c760f0a4c3910e29cd4aeff1bff588d20d25fa19 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 22 Jun 2018 16:12:46 +0200 Subject: [PATCH 375/620] Hadrons: remove make_5D/4D functions and FreeProp fix --- extras/Hadrons/Modules/MFermion/FreeProp.hpp | 6 ++---- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 21 ------------------- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.hpp b/extras/Hadrons/Modules/MFermion/FreeProp.hpp index 0786eb2b..4e448188 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/FreeProp.hpp @@ -34,8 +34,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include -#include - BEGIN_HADRONS_NAMESPACE /****************************************************************************** @@ -152,7 +150,7 @@ void TFreeProp::execute(void) else { PropToFerm(tmp, fullSrc, s, c); - make_5D(tmp, source, Ls_); + mat.ImportPhysicalFermionSource(tmp, source); } } // source conversion for 5D sources @@ -176,7 +174,7 @@ void TFreeProp::execute(void) if (Ls_ > 1) { PropagatorField &p4d = envGet(PropagatorField, getName()); - make_4D(sol, tmp, Ls_); + mat.ExportPhysicalFermionSolution(sol, tmp); FermToProp(p4d, tmp, s, c); } } diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index 8aafb834..ebf8d56f 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -39,27 +39,6 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE -/****************************************************************************** - * 5D -> 4D and 4D -> 5D conversions. * - ******************************************************************************/ -template // Note that 5D object is modified. -inline void make_4D(Lattice &in_5d, Lattice &out_4d, int Ls) -{ - axpby_ssp_pminus(in_5d, 0., in_5d, 1., in_5d, 0, 0); - axpby_ssp_pplus(in_5d, 1., in_5d, 1., in_5d, 0, Ls-1); - ExtractSlice(out_4d, in_5d, 0, 0); -} - -template -inline void make_5D(Lattice &in_4d, Lattice &out_5d, int Ls) -{ - out_5d = zero; - InsertSlice(in_4d, out_5d, 0, 0); - InsertSlice(in_4d, out_5d, Ls-1, 0); - axpby_ssp_pplus(out_5d, 0., out_5d, 1., out_5d, 0, 0); - axpby_ssp_pminus(out_5d, 0., out_5d, 1., out_5d, Ls-1, Ls-1); -} - /****************************************************************************** * GaugeProp * ******************************************************************************/ From e0ed7e300f7096b4dbc92820fc0d0a911f444598 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 22 Jun 2018 16:33:43 +0200 Subject: [PATCH 376/620] Hadrons: spurious Dminus removed --- extras/Hadrons/Modules/MFermion/GaugeProp.hpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp index ebf8d56f..d2c9df05 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -169,11 +169,8 @@ void TGaugeProp::execute(void) PropToFerm(source, fullSrc, s, c); } } - LOG(Message) << "Prepare source" << std::endl; - sol = source; - mat.Dminus(sol, source); - sol = zero; LOG(Message) << "Solve" << std::endl; + sol = zero; solver(sol, source); LOG(Message) << "Export solution" << std::endl; FermToProp(prop, sol, s, c); From 2f121c41c900b82d9e875378f6acbb504d5cddf0 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Mon, 25 Jun 2018 12:20:46 +0100 Subject: [PATCH 377/620] Commiting reation of meson field code before a merge with the upstream branch feature/hadrons --- extras/Hadrons/Modules.hpp | 3 +- .../Hadrons/Modules/MContraction/A2AMeson.cc | 7 - .../Modules/MContraction/MesonFieldGmu.cc | 7 + .../{A2AMeson.hpp => MesonFieldGmu.hpp} | 123 ++++++------------ extras/Hadrons/modules.inc | 4 +- 5 files changed, 48 insertions(+), 96 deletions(-) delete mode 100644 extras/Hadrons/Modules/MContraction/A2AMeson.cc create mode 100644 extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc rename extras/Hadrons/Modules/MContraction/{A2AMeson.hpp => MesonFieldGmu.hpp} (50%) diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index f81c01da..0f6390a2 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -29,13 +29,14 @@ #include #include #include +#include #include #include #include #include +#include #include #include -#include #include #include #include diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.cc b/extras/Hadrons/Modules/MContraction/A2AMeson.cc deleted file mode 100644 index 3ce5fe83..00000000 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.cc +++ /dev/null @@ -1,7 +0,0 @@ -#include - -using namespace Grid; -using namespace Hadrons; -using namespace MContraction; - -template class Grid::Hadrons::MContraction::TA2AMeson; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc b/extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc new file mode 100644 index 00000000..dc8a3c40 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TMesonFieldGmu; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGmu.hpp similarity index 50% rename from extras/Hadrons/Modules/MContraction/A2AMeson.hpp rename to extras/Hadrons/Modules/MContraction/MesonFieldGmu.hpp index bfea87e4..2841ae04 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGmu.hpp @@ -13,12 +13,10 @@ BEGIN_HADRONS_NAMESPACE ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MContraction) -typedef std::pair GammaPair; - -class A2AMesonPar : Serializable +class MesonFieldPar : Serializable { public: - GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonPar, + GRID_SERIALIZABLE_CLASS_MEMBERS(MesonFieldPar, int, Nl, int, N, std::string, A2A1, @@ -26,12 +24,12 @@ class A2AMesonPar : Serializable std::string, action, std::string, epack1, std::string, epack2, - std::string, gammas, + std::string, gamma, std::string, output); }; template -class TA2AMeson : public Module +class TMesonFieldGmu : public Module { public: FERM_TYPE_ALIASES(FImpl, ); @@ -42,41 +40,39 @@ class TA2AMeson : public Module { public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - Gamma::Algebra, gamma_snk, - Gamma::Algebra, gamma_src, - std::vector, corr); + Gamma::Algebra, gamma_mu, + std::vector>>, MesonField); }; public: // constructor - TA2AMeson(const std::string name); + TMesonFieldGmu(const std::string name); // destructor - virtual ~TA2AMeson(void){}; + virtual ~TMesonFieldGmu(void){}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); - virtual void parseGammaString(std::vector &gammaList); // setup virtual void setup(void); // execution virtual void execute(void); }; -MODULE_REGISTER(A2AMeson, ARG(TA2AMeson), MContraction); +MODULE_REGISTER(A2AMeson, ARG(TMesonFieldGmu), MContraction); /****************************************************************************** -* TA2AMeson implementation * +* TMesonFieldGmu implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template -TA2AMeson::TA2AMeson(const std::string name) - : Module(name) +TMesonFieldGmu::TMesonFieldGmu(const std::string name) + : Module(name) { } // dependencies/products /////////////////////////////////////////////////////// template -std::vector TA2AMeson::getInput(void) +std::vector TMesonFieldGmu::getInput(void) { std::vector in = {par().A2A1, par().A2A2, par().action}; in.push_back(par().A2A1 + "_ret"); @@ -92,117 +88,72 @@ std::vector TA2AMeson::getInput(void) } template -std::vector TA2AMeson::getOutput(void) +std::vector TMesonFieldGmu::getOutput(void) { std::vector out = {}; return out; } -template -void TA2AMeson::parseGammaString(std::vector &gammaList) -{ - gammaList.clear(); - // Parse individual contractions from input string. - gammaList = strToVec(par().gammas); -} - // setup /////////////////////////////////////////////////////////////////////// template -void TA2AMeson::setup(void) +void TMesonFieldGmu::setup(void) { int nt = env().getDim(Tp); int N = par().N; int Ls_ = env().getObjectLs(par().A2A1 + "_ret"); - envTmp(std::vector, "w1", 1, N, FermionField(env().getGrid(1))); - envTmp(std::vector, "v1", 1, N, FermionField(env().getGrid(1))); + envTmpLat(FermionField, "w", Ls_); + envTmpLat(FermionField, "v", Ls_); envTmpLat(FermionField, "tmpv_5d", Ls_); envTmpLat(FermionField, "tmpw_5d", Ls_); - - envTmp(std::vector, "MF_x", 1, nt); - envTmp(std::vector, "MF_y", 1, nt); - envTmp(std::vector, "tmp", 1, nt); } // execution /////////////////////////////////////////////////////////////////// template -void TA2AMeson::execute(void) +void TMesonFieldGmu::execute(void) { - LOG(Message) << "Computing A2A meson contractions" << std::endl; + LOG(Message) << "Computing A2A meson field for gamma_mu = " << par().gamma << ", taking w from " << par().A2A1 << " and v from " << par().A2A2 << std::endl; Result result; - Gamma g5(Gamma::Algebra::Gamma5); - std::vector gammaList; - int nt = env().getDim(Tp); + std::istringstream sstr(par().gamma); + Gamma::Algebra g_mu; + sstr >> g_mu; + Gamma gamma_mu(g_mu); - parseGammaString(gammaList); - - result.gamma_snk = gammaList[0].first; - result.gamma_src = gammaList[0].second; - result.corr.resize(nt); - - int Nl = par().Nl; int N = par().N; LOG(Message) << "N for A2A cont: " << N << std::endl; + result.gamma_mu = g_mu; + result.MesonField.resize(N); - envGetTmp(std::vector, MF_x); - envGetTmp(std::vector, MF_y); - envGetTmp(std::vector, tmp); + int nt = env().getDim(Tp); + std::vector MesonField_ij; + MesonField_ij.resize(nt); - for (unsigned int t = 0; t < nt; ++t) - { - tmp[t] = TensorRemove(MF_x[t] * MF_y[t] * 0.0); - } + auto &a2a1 = envGet(A2ABase, par().A2A1 + "_ret"); + auto &a2a2 = envGet(A2ABase, par().A2A2 + "_ret"); - Gamma gSnk(gammaList[0].first); - Gamma gSrc(gammaList[0].second); - - auto &a2a1_fn = envGet(A2ABase, par().A2A1 + "_ret"); - - envGetTmp(std::vector, w1); - envGetTmp(std::vector, v1); + envGetTmp(FermionField, w); + envGetTmp(FermionField, v); envGetTmp(FermionField, tmpv_5d); envGetTmp(FermionField, tmpw_5d); - LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; - for (int i = 0; i < N; i++) - { - a2a1_fn.return_v(i, tmpv_5d, v1[i]); - a2a1_fn.return_w(i, tmpw_5d, w1[i]); - } - LOG(Message) << "Found v and w vectors for N = " << N << std::endl; - for (unsigned int i = 0; i < N; i++) - { - v1[i] = gSnk * v1[i]; - } - int ty; for (unsigned int i = 0; i < N; i++) { + a2a1.return_w(i, tmpw_5d, w); for (unsigned int j = 0; j < N; j++) { - sliceInnerProductVector(MF_x, w1[i], v1[j], Tp); - sliceInnerProductVector(MF_y, w1[j], v1[i], Tp); - for (unsigned int t = 0; t < nt; ++t) - { - for (unsigned int tx = 0; tx < nt; tx++) - { - ty = (tx + t) % nt; - tmp[t] += TensorRemove((MF_x[tx]) * (MF_y[ty])); - } - } + a2a2.return_v(j, tmpv_5d, v); + v = gamma_mu*v; + sliceInnerProductVector(MesonField_ij, w, v, Tp); + result.MesonField[j][i] = MesonField_ij; } if (i % 10 == 0) { LOG(Message) << "MF for i = " << i << " of " << N << std::endl; } } - double NTinv = 1.0 / static_cast(nt); - for (unsigned int t = 0; t < nt; ++t) - { - result.corr[t] = NTinv*tmp[t]; - } saveResult(par().output, "meson", result); } diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 9bdb48cc..cafcf310 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -30,8 +30,8 @@ modules_cc =\ Modules/MContraction/WardIdentity.cc \ Modules/MContraction/WeakHamiltonianEye.cc \ Modules/MContraction/DiscLoop.cc \ - Modules/MContraction/A2AMeson.cc \ Modules/MContraction/Baryon.cc \ + Modules/MContraction/MesonFieldGmu.cc \ Modules/MContraction/Gamma3pt.cc \ Modules/MContraction/WeakNeutral4ptDisc.cc \ Modules/MContraction/Meson.cc \ @@ -86,9 +86,9 @@ modules_hpp =\ Modules/MContraction/WeakHamiltonianEye.hpp \ Modules/MContraction/Gamma3pt.hpp \ Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/MesonFieldGmu.hpp \ Modules/MContraction/Baryon.hpp \ Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MContraction/A2AMeson.hpp \ Modules/MScalar/Scalar.hpp \ Modules/MScalar/FreeProp.hpp \ Modules/MScalar/ChargedProp.hpp \ From adcef36189a27c8554acd11ac1f39352db56884b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 25 Jun 2018 15:58:35 +0100 Subject: [PATCH 378/620] =?UTF-8?q?Hadrons:=20M=C3=B6bius=20DWF=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extras/Hadrons/Modules.hpp | 9 +- extras/Hadrons/Modules/MAction/MobiusDWF.cc | 7 ++ extras/Hadrons/Modules/MAction/MobiusDWF.hpp | 109 ++++++++++++++++++ extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp | 4 +- extras/Hadrons/modules.inc | 14 ++- 5 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 extras/Hadrons/Modules/MAction/MobiusDWF.cc create mode 100644 extras/Hadrons/Modules/MAction/MobiusDWF.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 502c14af..af4592ea 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -18,20 +18,21 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include #include -#include -#include -#include #include +#include +#include +#include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MAction/MobiusDWF.cc b/extras/Hadrons/Modules/MAction/MobiusDWF.cc new file mode 100644 index 00000000..8c138bca --- /dev/null +++ b/extras/Hadrons/Modules/MAction/MobiusDWF.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MAction; + +template class Grid::Hadrons::MAction::TMobiusDWF; diff --git a/extras/Hadrons/Modules/MAction/MobiusDWF.hpp b/extras/Hadrons/Modules/MAction/MobiusDWF.hpp new file mode 100644 index 00000000..a026a864 --- /dev/null +++ b/extras/Hadrons/Modules/MAction/MobiusDWF.hpp @@ -0,0 +1,109 @@ +#ifndef Hadrons_MAction_MobiusDWF_hpp_ +#define Hadrons_MAction_MobiusDWF_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Mobius domain-wall fermion action * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MAction) + +class MobiusDWFPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(MobiusDWFPar, + std::string , gauge, + unsigned int, Ls, + double , mass, + double , M5, + double , b, + double , c, + std::string , boundary); +}; + +template +class TMobiusDWF: public Module +{ +public: + FG_TYPE_ALIASES(FImpl,); +public: + // constructor + TMobiusDWF(const std::string name); + // destructor + virtual ~TMobiusDWF(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(MobiusDWF, TMobiusDWF, MAction); + +/****************************************************************************** + * TMobiusDWF implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TMobiusDWF::TMobiusDWF(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TMobiusDWF::getInput(void) +{ + std::vector in = {par().gauge}; + + return in; +} + +template +std::vector TMobiusDWF::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TMobiusDWF::setup(void) +{ + LOG(Message) << "Setting up Mobius domain wall fermion matrix with m= " + << par().mass << ", M5= " << par().M5 << ", Ls= " << par().Ls + << ", b= " << par().b << ", c= " << par().c + << " using gauge field '" << par().gauge << "'" + << std::endl; + LOG(Message) << "Fermion boundary conditions: " << par().boundary + << std::endl; + + env().createGrid(par().Ls); + auto &U = envGet(LatticeGaugeField, par().gauge); + auto &g4 = *env().getGrid(); + auto &grb4 = *env().getRbGrid(); + auto &g5 = *env().getGrid(par().Ls); + auto &grb5 = *env().getRbGrid(par().Ls); + std::vector boundary = strToVec(par().boundary); + typename MobiusFermion::ImplParams implParams(boundary); + envCreateDerived(FMat, MobiusFermion, getName(), par().Ls, U, g5, + grb5, g4, grb4, par().mass, par().M5, par().b, par().c, + implParams); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TMobiusDWF::execute(void) +{} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MAction_MobiusDWF_hpp_ diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp index 88e4e85c..4a275dd0 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -35,7 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * ZMobiusDWF * + * z-Mobius domain-wall fermion action * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MAction) @@ -75,7 +75,7 @@ public: MODULE_REGISTER_TMP(ZMobiusDWF, TZMobiusDWF, MAction); /****************************************************************************** - * TZMobiusDWF implementation * + * TZMobiusDWF implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 0e44176b..ebf5c9cb 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -27,10 +27,11 @@ modules_cc =\ Modules/MUtilities/TestSeqConserved.cc \ Modules/MLoop/NoiseLoop.cc \ Modules/MScalar/FreeProp.cc \ + Modules/MScalar/VPCounterTerms.cc \ Modules/MScalar/ChargedProp.cc \ Modules/MScalar/ScalarVP.cc \ - Modules/MScalar/VPCounterTerms.cc \ Modules/MAction/Wilson.cc \ + Modules/MAction/MobiusDWF.cc \ Modules/MAction/ZMobiusDWF.cc \ Modules/MAction/WilsonClover.cc \ Modules/MAction/DWF.cc \ @@ -72,20 +73,21 @@ modules_hpp =\ Modules/MSink/Point.hpp \ Modules/MSolver/LocalCoherenceLanczos.hpp \ Modules/MSolver/RBPrecCG.hpp \ + Modules/MGauge/UnitEm.hpp \ + Modules/MGauge/Unit.hpp \ Modules/MGauge/Random.hpp \ Modules/MGauge/FundtoHirep.hpp \ Modules/MGauge/StochEm.hpp \ - Modules/MGauge/Unit.hpp \ - Modules/MGauge/UnitEm.hpp \ Modules/MUtilities/TestSeqGamma.hpp \ Modules/MUtilities/TestSeqConserved.hpp \ Modules/MLoop/NoiseLoop.hpp \ - Modules/MScalar/ChargedProp.hpp \ Modules/MScalar/FreeProp.hpp \ - Modules/MScalar/Scalar.hpp \ - Modules/MScalar/ScalarVP.hpp \ Modules/MScalar/VPCounterTerms.hpp \ + Modules/MScalar/ScalarVP.hpp \ + Modules/MScalar/Scalar.hpp \ + Modules/MScalar/ChargedProp.hpp \ Modules/MAction/DWF.hpp \ + Modules/MAction/MobiusDWF.hpp \ Modules/MAction/Wilson.hpp \ Modules/MAction/WilsonClover.hpp \ Modules/MAction/ZMobiusDWF.hpp \ From 2e1c66897f1be8de6bdea92b90d0c0630c3f5b9a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 25 Jun 2018 19:08:22 +0100 Subject: [PATCH 379/620] Hadrons: introduction message --- extras/Hadrons/Application.cc | 24 +++++++++++++++++++++--- extras/Hadrons/Global.hpp | 12 ++++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index f409d8eb..c746fa7e 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -51,9 +51,27 @@ Application::Application(void) loc[d] /= mpi[d]; locVol_ *= loc[d]; } - LOG(Message) << "Global lattice: " << dim << std::endl; - LOG(Message) << "MPI partition : " << mpi << std::endl; - LOG(Message) << "Local lattice : " << loc << std::endl; + LOG(Message) << "====== HADRONS APPLICATION STARTING ======" << std::endl; + LOG(Message) << "** Dimensions" << std::endl; + LOG(Message) << "Global lattice : " << dim << std::endl; + LOG(Message) << "MPI partition : " << mpi << std::endl; + LOG(Message) << "Local lattice : " << loc << std::endl; + LOG(Message) << std::endl; + LOG(Message) << "** Default parameters (associated C macro)" << std::endl; + LOG(Message) << "ASCII output precision (DEFAULT_ASCII_PREC) : " + << DEFAULT_ASCII_PREC << std::endl; + LOG(Message) << "Fermion implementation (FIMPL) : " + << HADRONS_STR(FIMPL) << std::endl; + LOG(Message) << "Fermion complex implementation (ZFIMPL) : " + << HADRONS_STR(ZFIMPL) << std::endl; + LOG(Message) << "Scalar implementation (SIMPL) : " + << HADRONS_STR(SIMPL) << std::endl; + LOG(Message) << "Gauge implementation (GIMPL) : " + << HADRONS_STR(GIMPL) << std::endl; + LOG(Message) << "Eigenvector base size (HADRONS_DEFAULT_LANCZOS_NBASIS): " + << HADRONS_DEFAULT_LANCZOS_NBASIS << std::endl; + LOG(Message) << "Schur decomposition (HADRONS_DEFAULT_SCHUR) : " + << HADRONS_STR(HADRONS_DEFAULT_SCHUR) << std::endl; } Application::Application(const Application::GlobalPar &par) diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index bae34a8d..fdacb799 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -43,6 +43,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #define DEFAULT_ASCII_PREC 16 #endif +/* the 'using Grid::operator<<;' statement prevents a very nasty compilation + * error with GCC 5 (clang & GCC 6 compile fine without it). + */ + #define BEGIN_HADRONS_NAMESPACE \ namespace Grid {\ using namespace QCD;\ @@ -58,10 +62,6 @@ using Grid::operator>>; #define END_MODULE_NAMESPACE } -/* the 'using Grid::operator<<;' statement prevents a very nasty compilation - * error with GCC 5 (clang & GCC 6 compile fine without it). - */ - #ifndef FIMPL #define FIMPL WilsonImplR #endif @@ -207,6 +207,10 @@ void makeFileDir(const std::string filename, GridBase *g); #define HADRONS_SCHUR_SOLVE(conv) _HADRONS_SCHUR_SOLVE_(conv) #define HADRONS_DEFAULT_SCHUR_SOLVE HADRONS_SCHUR_SOLVE(HADRONS_DEFAULT_SCHUR) +// stringify macro +#define _HADRONS_STR(x) #x +#define HADRONS_STR(x) _HADRONS_STR(x) + END_HADRONS_NAMESPACE #include From 049cc518f470fb409b151b7b9f0e293e954311b3 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 25 Jun 2018 19:08:39 +0100 Subject: [PATCH 380/620] Hadrons: introduction message 2 --- extras/Hadrons/Application.cc | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index c746fa7e..0490c222 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -41,6 +41,9 @@ using namespace Hadrons; * Application implementation * ******************************************************************************/ // constructors //////////////////////////////////////////////////////////////// +#define MACOUT(macro) macro << " (" << #macro << ")" +#define MACOUTS(macro) HADRONS_STR(macro) << " (" << #macro << ")" + Application::Application(void) { initLogger(); @@ -57,21 +60,16 @@ Application::Application(void) LOG(Message) << "MPI partition : " << mpi << std::endl; LOG(Message) << "Local lattice : " << loc << std::endl; LOG(Message) << std::endl; - LOG(Message) << "** Default parameters (associated C macro)" << std::endl; - LOG(Message) << "ASCII output precision (DEFAULT_ASCII_PREC) : " - << DEFAULT_ASCII_PREC << std::endl; - LOG(Message) << "Fermion implementation (FIMPL) : " - << HADRONS_STR(FIMPL) << std::endl; - LOG(Message) << "Fermion complex implementation (ZFIMPL) : " - << HADRONS_STR(ZFIMPL) << std::endl; - LOG(Message) << "Scalar implementation (SIMPL) : " - << HADRONS_STR(SIMPL) << std::endl; - LOG(Message) << "Gauge implementation (GIMPL) : " - << HADRONS_STR(GIMPL) << std::endl; - LOG(Message) << "Eigenvector base size (HADRONS_DEFAULT_LANCZOS_NBASIS): " - << HADRONS_DEFAULT_LANCZOS_NBASIS << std::endl; - LOG(Message) << "Schur decomposition (HADRONS_DEFAULT_SCHUR) : " - << HADRONS_STR(HADRONS_DEFAULT_SCHUR) << std::endl; + LOG(Message) << "** Default parameters (and associated C macro)" << std::endl; + LOG(Message) << "ASCII output precision : " << MACOUT(DEFAULT_ASCII_PREC) << std::endl; + LOG(Message) << "Fermion implementation : " << MACOUTS(FIMPL) << std::endl; + LOG(Message) << "z-Fermion implementation: " << MACOUTS(ZFIMPL) << std::endl; + LOG(Message) << "Scalar implementation : " << MACOUTS(SIMPL) << std::endl; + LOG(Message) << "Gauge implementation : " << MACOUTS(GIMPL) << std::endl; + LOG(Message) << "Eigenvector base size : " + << MACOUT(HADRONS_DEFAULT_LANCZOS_NBASIS) << std::endl; + LOG(Message) << "Schur decomposition : " << MACOUTS(HADRONS_DEFAULT_SCHUR) << std::endl; + LOG(Message) << std::endl; } Application::Application(const Application::GlobalPar &par) From d2c42e6f4200f0f0efd524c448a9a6b2e515403c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 26 Jun 2018 14:59:33 +0100 Subject: [PATCH 381/620] Hadrons: scaled DWF action --- extras/Hadrons/Modules.hpp | 1 + extras/Hadrons/Modules/MAction/ScaledDWF.cc | 7 ++ extras/Hadrons/Modules/MAction/ScaledDWF.hpp | 108 +++++++++++++++++++ extras/Hadrons/modules.inc | 2 + 4 files changed, 118 insertions(+) create mode 100644 extras/Hadrons/Modules/MAction/ScaledDWF.cc create mode 100644 extras/Hadrons/Modules/MAction/ScaledDWF.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index af4592ea..f882d86c 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MAction/ScaledDWF.cc b/extras/Hadrons/Modules/MAction/ScaledDWF.cc new file mode 100644 index 00000000..19e7cf4c --- /dev/null +++ b/extras/Hadrons/Modules/MAction/ScaledDWF.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MAction; + +template class Grid::Hadrons::MAction::TScaledDWF; diff --git a/extras/Hadrons/Modules/MAction/ScaledDWF.hpp b/extras/Hadrons/Modules/MAction/ScaledDWF.hpp new file mode 100644 index 00000000..78127f6f --- /dev/null +++ b/extras/Hadrons/Modules/MAction/ScaledDWF.hpp @@ -0,0 +1,108 @@ +#ifndef Hadrons_MAction_ScaledDWF_hpp_ +#define Hadrons_MAction_ScaledDWF_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Scaled domain wall fermion * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MAction) + +class ScaledDWFPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(ScaledDWFPar, + std::string , gauge, + unsigned int, Ls, + double , mass, + double , M5, + double , scale, + std::string , boundary); +}; + +template +class TScaledDWF: public Module +{ +public: + FG_TYPE_ALIASES(FImpl,); +public: + // constructor + TScaledDWF(const std::string name); + // destructor + virtual ~TScaledDWF(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(ScaledDWF, TScaledDWF, MAction); + +/****************************************************************************** + * TScaledDWF implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TScaledDWF::TScaledDWF(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TScaledDWF::getInput(void) +{ + std::vector in = {par().gauge}; + + return in; +} + +template +std::vector TScaledDWF::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TScaledDWF::setup(void) +{ + LOG(Message) << "Setting up scaled domain wall fermion matrix with m= " + << par().mass << ", M5= " << par().M5 << ", Ls= " << par().Ls + << ", scale= " << par().scale + << " using gauge field '" << par().gauge << "'" + << std::endl; + LOG(Message) << "Fermion boundary conditions: " << par().boundary + << std::endl; + + env().createGrid(par().Ls); + auto &U = envGet(LatticeGaugeField, par().gauge); + auto &g4 = *env().getGrid(); + auto &grb4 = *env().getRbGrid(); + auto &g5 = *env().getGrid(par().Ls); + auto &grb5 = *env().getRbGrid(par().Ls); + std::vector boundary = strToVec(par().boundary); + typename MobiusFermion::ImplParams implParams(boundary); + envCreateDerived(FMat, ScaledShamirFermion, getName(), par().Ls, U, g5, + grb5, g4, grb4, par().mass, par().M5, par().scale, + implParams); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TScaledDWF::execute(void) +{} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MAction_ScaledDWF_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index ebf5c9cb..37477d79 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -35,6 +35,7 @@ modules_cc =\ Modules/MAction/ZMobiusDWF.cc \ Modules/MAction/WilsonClover.cc \ Modules/MAction/DWF.cc \ + Modules/MAction/ScaledDWF.cc \ Modules/MScalarSUN/TrPhi.cc \ Modules/MScalarSUN/Grad.cc \ Modules/MScalarSUN/TimeMomProbe.cc \ @@ -91,6 +92,7 @@ modules_hpp =\ Modules/MAction/Wilson.hpp \ Modules/MAction/WilsonClover.hpp \ Modules/MAction/ZMobiusDWF.hpp \ + Modules/MAction/ScaledDWF.hpp \ Modules/MScalarSUN/StochFreeField.hpp \ Modules/MScalarSUN/TwoPointNPR.hpp \ Modules/MScalarSUN/ShiftProbe.hpp \ From f7e86f81a00774a94fe0b3afd4bd0f3a27e3a2bb Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 28 Jun 2018 16:14:16 +0100 Subject: [PATCH 382/620] Changes A2A class to make use of the new Solver class --- extras/Hadrons/AllToAllVectors.hpp | 89 ++++++++++-------------------- 1 file changed, 28 insertions(+), 61 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index 436f18b8..d9f3c281 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -3,6 +3,7 @@ #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -10,14 +11,14 @@ BEGIN_HADRONS_NAMESPACE // A2A Modes //////////////////////////////// -template +template class A2AModesSchurDiagTwo { private: const std::vector *evec; const std::vector *eval; Matrix &action; - std::function &Solver; + Solver &solver; const int Nl, Nh; const bool return_5d; std::vector w_high_5d, v_high_5d, w_high_4d, v_high_4d; @@ -25,12 +26,12 @@ class A2AModesSchurDiagTwo public: A2AModesSchurDiagTwo(const std::vector *_evec, const std::vector *_eval, Matrix &_action, - std::function &_Solver, + Solver &_solver, const int _Nl, const int _Nh, const bool _return_5d) : evec(_evec), eval(_eval), action(_action), - Solver(_Solver), + solver(_solver), Nl(_Nl), Nh(_Nh), return_5d(_return_5d) { @@ -56,7 +57,7 @@ class A2AModesSchurDiagTwo LOG(Message) << "A2A high modes for i = " << i << std::endl; i5d = 0; if (return_5d) i5d = i; - this->high_mode_v(action, Solver, source_5d, v_high_5d[i5d], v_high_4d[i]); + this->high_mode_v(action, solver, source_5d, v_high_5d[i5d], v_high_4d[i]); this->high_mode_w(source_5d, source_4d, w_high_5d[i5d], w_high_4d[i]); } @@ -185,13 +186,13 @@ class A2AModesSchurDiagTwo action.ExportPhysicalFermionSolution(wout_5d, wout_4d); } - void high_mode_v(Matrix &action, std::function &Solver, const Field &source, Field &vout_5d, Field &vout_4d) + void high_mode_v(Matrix &action, Solver &solver, const Field &source, Field &vout_5d, Field &vout_4d) { GridBase *fgrid = action.Grid(); Field tmp(fgrid); action.Dminus(source, tmp); - Solver(vout_5d, source); // Note: Solver is Solver(out, in) + solver(vout_5d, source); // Note: solver is solver(out, in) action.ExportPhysicalFermionSolution(vout_5d, vout_4d); } @@ -202,63 +203,29 @@ class A2AModesSchurDiagTwo } }; -//////////////////////////////// -// Low Modes -//////////////////////////////// +// TODO: A2A for coarse eigenvectors -template -class A2ALMSchurDiagTwo : public A2AModesSchurDiagTwo -{ - private: - const std::vector &evec; - const std::vector &eval; - Matrix &action; +// template +// class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo +// { +// private: +// const std::vector &subspace; +// const std::vector &evec_coarse; +// const std::vector &eval_coarse; +// Matrix &action; - public: - A2ALMSchurDiagTwo(const std::vector &_evec, const std::vector &_eval, Matrix &_action) : evec(_evec), eval(_eval), action(_action){}; - void operator()(int i, Field &vout, Field &wout) - { - this->low_mode_v(action, evec[i], eval[i], vout); - this->low_mode_w(action, evec[i], eval[i], wout); - } -}; +// public: +// A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) +// : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){}; -template -class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo -{ - private: - const std::vector &subspace; - const std::vector &evec_coarse; - const std::vector &eval_coarse; - Matrix &action; - - public: - A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) - : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){}; - - void operator()(int i, FineField &vout, FineField &wout) - { - FineField prom_evec(subspace[0]._grid); - blockPromote(evec_coarse[i], prom_evec, subspace); - this->low_mode_v(action, prom_evec, eval_coarse[i], vout); - this->low_mode_w(action, prom_evec, eval_coarse[i], wout); - } -}; - -//////////////////////////////// -// High Modes -//////////////////////////////// - -template -class A2AHMSchurDiagTwo : virtual public A2AModesSchurDiagTwo -{ - public: - void operator()(Matrix &action, std::function &Solver, const Field &source, Field &vout, Field &wout) - { - this->high_mode_v(action, Solver, source, vout); - this->high_mode_w(action, source, wout); - } -}; +// void operator()(int i, FineField &vout, FineField &wout) +// { +// FineField prom_evec(subspace[0]._grid); +// blockPromote(evec_coarse[i], prom_evec, subspace); +// this->low_mode_v(action, prom_evec, eval_coarse[i], vout); +// this->low_mode_w(action, prom_evec, eval_coarse[i], wout); +// } +// }; END_HADRONS_NAMESPACE From 7fe3974c0ae856b45a21ba1fcf63270b91953992 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 28 Jun 2018 16:14:49 +0100 Subject: [PATCH 383/620] Included eigenPacks and action as references, not inputs, of A2A module. They now now longer need to be parameters in the meson field modules. --- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 4db90eef..c98243e6 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -23,7 +24,7 @@ public: int, N, std::vector, sources, std::string, action, - std::string, eigenpack, + std::string, eigenPack, std::string, solver); }; @@ -37,7 +38,7 @@ class TA2AVectors : public Module typedef FermionEigenPack EPack; typedef CoarseFermionEigenPack CoarseEPack; - typedef A2AModesSchurDiagTwo A2ABase; + typedef A2AModesSchurDiagTwo A2ABase; public: // constructor @@ -46,6 +47,7 @@ class TA2AVectors : public Module virtual ~TA2AVectors(void) {}; // dependency relation virtual std::vector getInput(void); + virtual std::vector getReference(void); virtual std::vector getOutput(void); // setup virtual void setup(void); @@ -54,7 +56,7 @@ class TA2AVectors : public Module private: unsigned int Ls_; - std::string retName_; + std::string className_; }; MODULE_REGISTER_TMP(A2AVectors, ARG(TA2AVectors), MSolver); @@ -67,14 +69,17 @@ MODULE_REGISTER_TMP(ZA2AVectors, ARG(TA2AVectors TA2AVectors::TA2AVectors(const std::string name) : Module(name) -, retName_ (name + "_ret") +, className_ (name + "_class") {} // dependencies/products /////////////////////////////////////////////////////// template std::vector TA2AVectors::getInput(void) { - std::vector in = {par().action, par().solver, par().solver + "_subtract"}; + int Nl = par().Nl; + std::string sub_string = ""; + if (Nl > 0) sub_string = "_subtract"; + std::vector in = {par().solver + sub_string}; int n = par().sources.size(); @@ -86,10 +91,23 @@ std::vector TA2AVectors::getInput(void) return in; } +template +std::vector TA2AVectors::getReference(void) +{ + std::vector ref = {par().action}; + + if (!par().eigenPack.empty()) + { + ref.push_back(par().eigenPack); + } + + return ref; +} + template std::vector TA2AVectors::getOutput(void) { - std::vector out = {getName(), retName_}; + std::vector out = {getName(), className_}; return out; } @@ -106,7 +124,7 @@ void TA2AVectors::setup(void) std::string sub_string = ""; if (Nl > 0) sub_string = "_subtract"; - auto &solver = envGet(SolverFn, par().solver + sub_string); + auto &solver = envGet(Solver, par().solver + sub_string); Ls_ = env().getObjectLs(par().solver + sub_string); auto &action = envGet(FMat, par().action); @@ -121,10 +139,10 @@ void TA2AVectors::setup(void) if (Nl > 0) { // Low modes - auto &epack = envGet(EPack, par().eigenpack); + auto &epack = envGet(EPack, par().eigenPack); LOG(Message) << "Creating a2a vectors " << getName() << - " using eigenpack '" << par().eigenpack << "' (" + " using eigenpack '" << par().eigenPack << "' (" << epack.evec.size() << " modes)" << " and " << Nh << " high modes." << std::endl; evec = &epack.evec; @@ -135,7 +153,7 @@ void TA2AVectors::setup(void) LOG(Message) << "Creating a2a vectors " << getName() << " using " << Nh << " high modes only." << std::endl; } - envCreate(A2ABase, retName_, Ls_, + envCreate(A2ABase, className_, Ls_, evec, eval, action, solver, @@ -158,7 +176,7 @@ void TA2AVectors::execute(void) if (Nl > 0) sub_string = "_subtract"; Ls_ = env().getObjectLs(par().solver + sub_string); - auto &a2areturn = envGet(A2ABase, retName_); + auto &a2areturn = envGet(A2ABase, className_); // High modes auto sources = par().sources; @@ -168,8 +186,6 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, tmp); envGetTmp(FermionField, tmp2); - // TODO: At the moment weighting only applies to the 4d->5d source path - // similar to how the 5d and 4d srcs are passed in, this needs more work to be less brittle double weight = 1.0 / sqrt(Ns*Nc*Nsrc); int N_count = 0; for (unsigned int s = 0; s < Ns; ++s) @@ -184,11 +200,13 @@ void TA2AVectors::execute(void) if (Ls_ == 1) { PropToFerm(ferm_src, prop_src, s, c); + ferm_src = weight*ferm_src; + tmp = ferm_src; } else { - PropToFerm(tmp2, prop_src, s, c); - tmp = weight*tmp2; + PropToFerm(tmp, prop_src, s, c); + tmp = weight*tmp; action.ImportPhysicalFermionSource(tmp, ferm_src); } } @@ -202,6 +220,8 @@ void TA2AVectors::execute(void) else { PropToFerm(ferm_src, prop_src, s, c); + ferm_src = weight*ferm_src; + action.ExportPhysicalFermionSolution(ferm_src, tmp); } } LOG(Message) << "a2areturn.high_modes Ncount = " << N_count << std::endl; From a2929f43843fb42907dadaeb27ef69ab5a50b395 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 28 Jun 2018 16:17:26 +0100 Subject: [PATCH 384/620] Removed A2A contraction module and replaced it with the beginnings of a meson field module --- .../Modules/MContraction/MesonFieldGamma.cc | 7 ++ ...{MesonFieldGmu.hpp => MesonFieldGamma.hpp} | 117 +++++++++++------- .../Modules/MContraction/MesonFieldGmu.cc | 7 -- 3 files changed, 77 insertions(+), 54 deletions(-) create mode 100644 extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc rename extras/Hadrons/Modules/MContraction/{MesonFieldGmu.hpp => MesonFieldGamma.hpp} (51%) delete mode 100644 extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc new file mode 100644 index 00000000..70c2657d --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TMesonFieldGamma; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGmu.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp similarity index 51% rename from extras/Hadrons/Modules/MContraction/MesonFieldGmu.hpp rename to extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp index 2841ae04..6a67f87b 100644 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGmu.hpp +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp @@ -1,5 +1,5 @@ -#ifndef Hadrons_MContraction_A2AMeson_hpp_ -#define Hadrons_MContraction_A2AMeson_hpp_ +#ifndef Hadrons_MContraction_MesonFieldGamma_hpp_ +#define Hadrons_MContraction_MesonFieldGamma_hpp_ #include #include @@ -9,7 +9,7 @@ BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * A2AMeson * + * MesonFieldGamma * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MContraction) @@ -21,88 +21,98 @@ class MesonFieldPar : Serializable int, N, std::string, A2A1, std::string, A2A2, - std::string, action, - std::string, epack1, - std::string, epack2, - std::string, gamma, + std::string, gammas, std::string, output); }; template -class TMesonFieldGmu : public Module +class TMesonFieldGamma : public Module { public: FERM_TYPE_ALIASES(FImpl, ); + SOLVER_TYPE_ALIASES(FImpl, ); - typedef A2AModesSchurDiagTwo A2ABase; + typedef A2AModesSchurDiagTwo A2ABase; class Result : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - Gamma::Algebra, gamma_mu, + Gamma::Algebra, gamma, std::vector>>, MesonField); }; public: // constructor - TMesonFieldGmu(const std::string name); + TMesonFieldGamma(const std::string name); // destructor - virtual ~TMesonFieldGmu(void){}; + virtual ~TMesonFieldGamma(void){}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); + virtual void parseGammaString(std::vector &gammaList); // setup virtual void setup(void); // execution virtual void execute(void); }; -MODULE_REGISTER(A2AMeson, ARG(TMesonFieldGmu), MContraction); +MODULE_REGISTER(MesonFieldGamma, ARG(TMesonFieldGamma), MContraction); /****************************************************************************** -* TMesonFieldGmu implementation * +* TMesonFieldGamma implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template -TMesonFieldGmu::TMesonFieldGmu(const std::string name) +TMesonFieldGamma::TMesonFieldGamma(const std::string name) : Module(name) { } // dependencies/products /////////////////////////////////////////////////////// template -std::vector TMesonFieldGmu::getInput(void) +std::vector TMesonFieldGamma::getInput(void) { - std::vector in = {par().A2A1, par().A2A2, par().action}; - in.push_back(par().A2A1 + "_ret"); - in.push_back(par().A2A2 + "_ret"); - int Nl = par().Nl; - if (Nl > 0) - { - in.push_back(par().epack1); - in.push_back(par().epack2); - } - + std::vector in = {par().A2A1 + "_class", par().A2A2 + "_class"}; return in; } template -std::vector TMesonFieldGmu::getOutput(void) +std::vector TMesonFieldGamma::getOutput(void) { std::vector out = {}; return out; } +template +void TMesonFieldGamma::parseGammaString(std::vector &gammaList) +{ + gammaList.clear(); + // Determine gamma matrices to insert at source/sink. + if (par().gammas.compare("all") == 0) + { + // Do all contractions. + for (unsigned int i = 1; i < Gamma::nGamma; i += 2) + { + gammaList.push_back(((Gamma::Algebra)i)); + } + } + else + { + // Parse individual contractions from input string. + gammaList = strToVec(par().gammas); + } +} + // setup /////////////////////////////////////////////////////////////////////// template -void TMesonFieldGmu::setup(void) +void TMesonFieldGamma::setup(void) { int nt = env().getDim(Tp); int N = par().N; - int Ls_ = env().getObjectLs(par().A2A1 + "_ret"); + int Ls_ = env().getObjectLs(par().A2A1 + "_class"); envTmpLat(FermionField, "w", Ls_); envTmpLat(FermionField, "v", Ls_); @@ -112,27 +122,37 @@ void TMesonFieldGmu::setup(void) // execution /////////////////////////////////////////////////////////////////// template -void TMesonFieldGmu::execute(void) +void TMesonFieldGamma::execute(void) { - LOG(Message) << "Computing A2A meson field for gamma_mu = " << par().gamma << ", taking w from " << par().A2A1 << " and v from " << par().A2A2 << std::endl; - - Result result; - std::istringstream sstr(par().gamma); - Gamma::Algebra g_mu; - sstr >> g_mu; - Gamma gamma_mu(g_mu); + LOG(Message) << "Computing A2A meson field for gamma = " << par().gammas << ", taking w from " << par().A2A1 << " and v from " << par().A2A2 << std::endl; int N = par().N; - LOG(Message) << "N for A2A cont: " << N << std::endl; - result.gamma_mu = g_mu; - result.MesonField.resize(N); - int nt = env().getDim(Tp); + + std::vector result; + std::vector gammaResultList; + std::vector gammaList; + + parseGammaString(gammaResultList); + result.resize(gammaResultList.size()); + + Gamma g5(Gamma::Algebra::Gamma5); + gammaList.resize(gammaResultList.size(), g5); + + for (unsigned int i = 0; i < result.size(); ++i) + { + result[i].gamma = gammaResultList[i]; + result[i].MesonField.resize(N, std::vector>(N, std::vector(nt))); + + Gamma gamma(gammaResultList[i]); + gammaList[i] = gamma; + } + std::vector MesonField_ij; MesonField_ij.resize(nt); - auto &a2a1 = envGet(A2ABase, par().A2A1 + "_ret"); - auto &a2a2 = envGet(A2ABase, par().A2A2 + "_ret"); + auto &a2a1 = envGet(A2ABase, par().A2A1 + "_class"); + auto &a2a2 = envGet(A2ABase, par().A2A2 + "_class"); envGetTmp(FermionField, w); envGetTmp(FermionField, v); @@ -145,9 +165,12 @@ void TMesonFieldGmu::execute(void) for (unsigned int j = 0; j < N; j++) { a2a2.return_v(j, tmpv_5d, v); - v = gamma_mu*v; - sliceInnerProductVector(MesonField_ij, w, v, Tp); - result.MesonField[j][i] = MesonField_ij; + for (unsigned int k = 0; k < result.size(); k++) + { + v = gammaList[k]*v; + sliceInnerProductVector(MesonField_ij, w, v, Tp); + result[k].MesonField[i][j] = MesonField_ij; + } } if (i % 10 == 0) { @@ -162,4 +185,4 @@ END_MODULE_NAMESPACE END_HADRONS_NAMESPACE -#endif // Hadrons_MContraction_A2AMeson_hpp_ +#endif // Hadrons_MContraction_MesonFieldGm_hpp_ diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc b/extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc deleted file mode 100644 index dc8a3c40..00000000 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGmu.cc +++ /dev/null @@ -1,7 +0,0 @@ -#include - -using namespace Grid; -using namespace Hadrons; -using namespace MContraction; - -template class Grid::Hadrons::MContraction::TMesonFieldGmu; \ No newline at end of file From daa0977d0176e60f30f3217ded7bd93db384932f Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 28 Jun 2018 16:34:56 +0100 Subject: [PATCH 385/620] Included a print statement that indicates that the guess is being subtracted from the solve. --- lib/algorithms/iterative/SchurRedBlack.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/algorithms/iterative/SchurRedBlack.h b/lib/algorithms/iterative/SchurRedBlack.h index 465f331c..5abc4d9f 100644 --- a/lib/algorithms/iterative/SchurRedBlack.h +++ b/lib/algorithms/iterative/SchurRedBlack.h @@ -186,6 +186,8 @@ namespace Grid { RealD ns = norm2(in); RealD nr = norm2(resid); std::cout< Date: Mon, 2 Jul 2018 17:52:04 +0100 Subject: [PATCH 386/620] Hadrons: stout smearing module --- extras/Hadrons/Global.hpp | 2 +- extras/Hadrons/Modules.hpp | 1 + .../Hadrons/Modules/MGauge/StoutSmearing.cc | 7 ++ .../Hadrons/Modules/MGauge/StoutSmearing.hpp | 103 ++++++++++++++++++ extras/Hadrons/modules.inc | 2 + 5 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 extras/Hadrons/Modules/MGauge/StoutSmearing.cc create mode 100644 extras/Hadrons/Modules/MGauge/StoutSmearing.hpp diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index fdacb799..cf96ad9b 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -72,7 +72,7 @@ using Grid::operator>>; #define SIMPL ScalarImplCR #endif #ifndef GIMPL -#define GIMPL GimplTypesR +#define GIMPL PeriodicGimplR #endif BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index f882d86c..6bf5d3ed 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MGauge/StoutSmearing.cc b/extras/Hadrons/Modules/MGauge/StoutSmearing.cc new file mode 100644 index 00000000..161e74aa --- /dev/null +++ b/extras/Hadrons/Modules/MGauge/StoutSmearing.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MGauge; + +template class Grid::Hadrons::MGauge::TStoutSmearing; diff --git a/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp b/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp new file mode 100644 index 00000000..d84b1c6f --- /dev/null +++ b/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp @@ -0,0 +1,103 @@ +#ifndef Hadrons_MGauge_StoutSmearing_hpp_ +#define Hadrons_MGauge_StoutSmearing_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Stout smearing * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MGauge) + +class StoutSmearingPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(StoutSmearingPar, + std::string, gauge, + unsigned int, steps, + double, rho); +}; + +template +class TStoutSmearing: public Module +{ +public: + typedef typename GImpl::Field GaugeField; +public: + // constructor + TStoutSmearing(const std::string name); + // destructor + virtual ~TStoutSmearing(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(StoutSmearing, TStoutSmearing, MGauge); + +/****************************************************************************** + * TStoutSmearing implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TStoutSmearing::TStoutSmearing(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TStoutSmearing::getInput(void) +{ + std::vector in = {par().gauge}; + + return in; +} + +template +std::vector TStoutSmearing::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TStoutSmearing::setup(void) +{ + envCreateLat(GaugeField, getName()); + envTmpLat(GaugeField, "buf"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TStoutSmearing::execute(void) +{ + LOG(Message) << "Smearing '" << par().gauge << "' with " << par().steps + << " of stout smearing and rho= " << par().rho << std::endl; + + Smear_Stout smearer(par().rho); + auto &U = envGet(GaugeField, par().gauge); + auto &Usmr = envGet(GaugeField, getName()); + + envGetTmp(GaugeField, buf); + buf = U; + for (unsigned int n = 0; n < par().steps; ++n) + { + smearer.smear(Usmr, buf); + buf = Usmr; + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MGauge_StoutSmearing_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 37477d79..58b082d0 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -18,6 +18,7 @@ modules_cc =\ Modules/MSink/Smear.cc \ Modules/MSolver/RBPrecCG.cc \ Modules/MSolver/LocalCoherenceLanczos.cc \ + Modules/MGauge/StoutSmearing.cc \ Modules/MGauge/Unit.cc \ Modules/MGauge/UnitEm.cc \ Modules/MGauge/StochEm.cc \ @@ -75,6 +76,7 @@ modules_hpp =\ Modules/MSolver/LocalCoherenceLanczos.hpp \ Modules/MSolver/RBPrecCG.hpp \ Modules/MGauge/UnitEm.hpp \ + Modules/MGauge/StoutSmearing.hpp \ Modules/MGauge/Unit.hpp \ Modules/MGauge/Random.hpp \ Modules/MGauge/FundtoHirep.hpp \ From a8a15dd9d00b08a09641a4b5067fc2d22c08c9d9 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 2 Jul 2018 17:52:39 +0100 Subject: [PATCH 387/620] Hadrons: code cleaning --- extras/Hadrons/Modules/MAction/Wilson.hpp | 2 +- .../Hadrons/Modules/MAction/WilsonClover.hpp | 23 +++---------------- .../Hadrons/Modules/MGauge/StoutSmearing.hpp | 1 + 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/extras/Hadrons/Modules/MAction/Wilson.hpp b/extras/Hadrons/Modules/MAction/Wilson.hpp index a0eabd82..70e0acf1 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.hpp +++ b/extras/Hadrons/Modules/MAction/Wilson.hpp @@ -102,7 +102,7 @@ std::vector TWilson::getOutput(void) template void TWilson::setup(void) { - LOG(Message) << "Setting up TWilson fermion matrix with m= " << par().mass + LOG(Message) << "Setting up Wilson fermion matrix with m= " << par().mass << " using gauge field '" << par().gauge << "'" << std::endl; LOG(Message) << "Fermion boundary conditions: " << par().boundary << std::endl; diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/extras/Hadrons/Modules/MAction/WilsonClover.hpp index bb2c5b59..0fb3b442 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/extras/Hadrons/Modules/MAction/WilsonClover.hpp @@ -38,7 +38,7 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * TWilson quark action * + * Wilson clover quark action * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MAction) @@ -106,13 +106,7 @@ std::vector TWilsonClover::getOutput(void) template void TWilsonClover::setup(void) { - //unsigned int size; - - // size = 2*env().template lattice4dSize(); - // env().registerObject(getName(), size); - - - LOG(Message) << "Setting up TWilsonClover fermion matrix with m= " << par().mass + LOG(Message) << "Setting up Wilson clover fermion matrix with m= " << par().mass << " using gauge field '" << par().gauge << "'" << std::endl; LOG(Message) << "Fermion boundary conditions: " << par().boundary << std::endl; @@ -129,23 +123,12 @@ void TWilsonClover::setup(void) par().csw_t, par().clover_anisotropy, implParams); - - - //FMat *fMatPt = new WilsonCloverFermion(U, grid, gridRb, par().mass, - // par().csw_r, - // par().csw_t, - // par().clover_anisotropy, - // implParams); - //env().setObject(getName(), fMatPt); - } // execution /////////////////////////////////////////////////////////////////// template void TWilsonClover::execute() -{ - -} +{} END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp b/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp index d84b1c6f..66406f5b 100644 --- a/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp +++ b/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp @@ -81,6 +81,7 @@ template void TStoutSmearing::execute(void) { LOG(Message) << "Smearing '" << par().gauge << "' with " << par().steps + << " step" << ((par().steps > 1) ? "s" : "") << " of stout smearing and rho= " << par().rho << std::endl; Smear_Stout smearer(par().rho); From f74617c124b7eef542c25da96f1bda7cb464e32b Mon Sep 17 00:00:00 2001 From: fionnoh Date: Tue, 3 Jul 2018 14:04:53 +0100 Subject: [PATCH 388/620] Added ZFIMPL to meson field module --- extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc | 3 ++- extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc index 70c2657d..9218d587 100644 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc @@ -4,4 +4,5 @@ using namespace Grid; using namespace Hadrons; using namespace MContraction; -template class Grid::Hadrons::MContraction::TMesonFieldGamma; \ No newline at end of file +template class Grid::Hadrons::MContraction::TMesonFieldGamma; +template class Grid::Hadrons::MContraction::TMesonFieldGamma; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp index 6a67f87b..59c90c08 100644 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp @@ -58,6 +58,7 @@ class TMesonFieldGamma : public Module }; MODULE_REGISTER(MesonFieldGamma, ARG(TMesonFieldGamma), MContraction); +MODULE_REGISTER(ZMesonFieldGamma, ARG(TMesonFieldGamma), MContraction); /****************************************************************************** * TMesonFieldGamma implementation * From ec9939c1ba8d61dbb2c583bfc2024c8f4baf608c Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 10 Jul 2018 12:38:51 +0100 Subject: [PATCH 389/620] Test for faster implementation of meson field inner loop This should be possible to cache block at outer levels, global sum across nodes not performed and deferred to caller to block them all into a big all reduce. Nc=3 and Fermion is hard coded in an ugly way. We might think about benchmarking whether a product without the conjugate should be made available by Grid. It is not clear whether the explicit unroll, or the performing of conjugate on left once was the real source of the speed up. Gives 70-80 GF/s on my laptop (single) half that double, and 70GB/s to cache. This is competitive with dslash and a reasonable stopping point for the optimisation. If necessary we can revisit. --- benchmarks/Benchmark_meson_field.cc | 241 ++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 benchmarks/Benchmark_meson_field.cc diff --git a/benchmarks/Benchmark_meson_field.cc b/benchmarks/Benchmark_meson_field.cc new file mode 100644 index 00000000..683dfd42 --- /dev/null +++ b/benchmarks/Benchmark_meson_field.cc @@ -0,0 +1,241 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./benchmarks/Benchmark_wilson.cc + + Copyright (C) 2018 + +Author: Peter Boyle +Author: paboyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + + +#include "Grid/util/Profiling.h" + +template +void sliceInnerProductMesonField(std::vector< std::vector > &mat, + const std::vector > &lhs, + const std::vector > &rhs, + int orthogdim) +{ + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + int Lblock = lhs.size(); + int Rblock = rhs.size(); + + GridBase *grid = lhs[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + int Nt = grid->GlobalDimensions()[orthogdim]; + + assert(mat.size()==Lblock*Rblock); + for(int t=0;t_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + std::vector > lvSum(rd*Lblock*Rblock); + std::vector lsSum(ld*Lblock*Rblock,scalar_type(0.0)); + + int e1= grid->_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + std::cout << GridLogMessage << " Entering first parallel loop "<_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;n icoor(Nd); + + for(int i=0;i temp; + std::vector > extracted(Nsimd); + + temp._internal = lvSum[i+Lblock*j+Lblock*Rblock*rt]; + + extract(temp,extracted); + + for(int idx=0;idxiCoorFromIindex(icoor,idx); + + int ldx =rt+icoor[orthogdim]*rd; + + int ij_dx = i+Lblock*j+Lblock*Rblock*ldx; + lsSum[ij_dx]=lsSum[ij_dx]+extracted[idx]._internal; + + } + }} + } + + std::cout << GridLogMessage << " Entering non parallel loop "<(std::vector< std::vector > &mat, + const std::vector > &lhs, + const std::vector > &rhs, + int orthogdim) ; +*/ + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + int nt = latt_size[Tp]; + uint64_t vol = 1; + for(int d=0;d seeds({1,2,3,4}); + GridParallelRNG pRNG(&Grid); + pRNG.SeedFixedIntegers(seeds); + + + const int Nm = 32; // number of all modes (high + low) + + std::vector v(Nm,&Grid); + std::vector w(Nm,&Grid); + + for(int i=0;i ip(nt); + std::vector > MesonFields (Nm*Nm); + std::vector > MesonFieldsRef(Nm*Nm); + + for(int i=0;i Date: Tue, 10 Jul 2018 13:30:45 +0100 Subject: [PATCH 390/620] Possible trash commit --- extras/Hadrons/AllToAllVectors.hpp | 1 - .../Modules/MContraction/MesonFieldGamma.hpp | 5 +- lib/lattice/Lattice_reduction.h | 121 +++++++++++++++++- lib/tensors/Tensor_inner.h | 26 ++++ 4 files changed, 148 insertions(+), 5 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index d9f3c281..a514beac 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -102,7 +102,6 @@ class A2AModesSchurDiagTwo void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout_5d, Field &vout_4d) { - GridBase *grid = action.RedBlackGrid(); Field src_o(grid); Field sol_e(grid); diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp index 59c90c08..0b81f607 100644 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp @@ -39,7 +39,8 @@ class TMesonFieldGamma : public Module public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, Gamma::Algebra, gamma, - std::vector>>, MesonField); + std::vector>>, MesonField, + ComplexD, last); }; public: @@ -178,7 +179,7 @@ void TMesonFieldGamma::execute(void) LOG(Message) << "MF for i = " << i << " of " << N << std::endl; } } - + result[0].last = MesonField_ij[7]; saveResult(par().output, "meson", result); } diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 3be4b6cb..12bfebed 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -39,8 +39,9 @@ template inline RealD norm2(const Lattice &arg){ // Double inner product template -inline ComplexD innerProduct(const Lattice &left,const Lattice &right) +inline ComplexD innerProduct(const Lattice &left,const Lattice &right) { + std::cout << GridLogMessage << "Start alloc innerProduct" << std::endl; typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_typeD vector_type; GridBase *grid = left._grid; @@ -49,6 +50,8 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ ComplexD inner; Vector sumarray(grid->SumArraySize()*pad); + std::cout << GridLogMessage << "End alloc innerProduct" << std::endl; + std::cout << GridLogMessage << "Start parallel for innerProduct" << std::endl; parallel_for(int thr=0;thrSumArraySize();thr++){ int nwork, mywork, myoff; GridThread::GetWork(left._grid->oSites(),thr,mywork,myoff); @@ -62,13 +65,18 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ ComplexD tmp = Reduce(TensorRemove(vinner)) ; vstream(sumarray[thr*pad],tmp); } - + std::cout << GridLogMessage << "End parallel for innerProduct" << std::endl; + + std::cout << GridLogMessage << "Start inner sum innerProduct" << std::endl; inner=0.0; for(int i=0;iSumArraySize();i++){ inner = inner+sumarray[i*pad]; } right._grid->GlobalSum(inner); return inner; + std::cout << GridLogMessage << "End inner sum innerProduct" << std::endl; + + std::cout << GridLogMessage << "End innerProduct" << std::endl; } ///////////////////////// @@ -274,6 +282,115 @@ template inline void sliceSum(const Lattice &Data,std::vector< } } +template +static void mySliceInnerProductVector( std::vector & result, const Lattice &lhs,const Lattice &rhs,int orthogdim) +{ + std::cout << GridLogMessage << "Start mySsliceInnerProductVector" << std::endl; + + typedef typename vobj::scalar_type scalar_type; + std::vector lsSum; + localSliceInnerProductVector(result, lhs, rhs, lsSum, orthogdim); + globalSliceInnerProductVector(result, lhs, lsSum, orthogdim); + std::cout << GridLogMessage << "End mySliceInnerProductVector" << std::endl; +} + +template +static void localSliceInnerProductVector(std::vector &result, const Lattice &lhs, const Lattice &rhs, std::vector &lsSum, int orthogdim) +{ + std::cout << GridLogMessage << "Start prep" << std::endl; + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + GridBase *grid = lhs._grid; + assert(grid!=NULL); + conformable(grid,rhs._grid); + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + + assert(orthogdim >= 0); + assert(orthogdim < Nd); + + int fd=grid->_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + std::cout << GridLogMessage << "Start alloc" << std::endl; + + std::vector > lvSum(rd); // will locally sum vectors first + lsSum.resize(ld,scalar_type(0.0)); // sum across these down to scalars + std::vector> extracted(Nsimd); // splitting the SIMD + std::cout << GridLogMessage << "End alloc" << std::endl; + + result.resize(fd); // And then global sum to return the same vector to every node for IO to file + for(int r=0;r_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + std::cout << GridLogMessage << "End prep" << std::endl; + std::cout << GridLogMessage << "Start parallel inner product, _rd = " << rd << std::endl; + vector_type vv; + parallel_for(int r=0;r_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;n icoor(Nd); + for(int rt=0;rt temp; + temp._internal = lvSum[rt]; + extract(temp,extracted); + + for(int idx=0;idxiCoorFromIindex(icoor,idx); + + int ldx =rt+icoor[orthogdim]*rd; + + lsSum[ldx]=lsSum[ldx]+extracted[idx]._internal; + + } + } + std::cout << GridLogMessage << "End sum over simd lanes" << std::endl; +} +template +static void globalSliceInnerProductVector(std::vector &result, const Lattice &lhs, std::vector &lsSum, int orthogdim) +{ + typedef typename vobj::scalar_type scalar_type; + GridBase *grid = lhs._grid; + int fd = result.size(); + int ld = lsSum.size(); + // sum over nodes. + std::vector gsum; + gsum.resize(fd, scalar_type(0.0)); + std::cout << GridLogMessage << "Start of gsum[t] creation:" << std::endl; + for(int t=0;t_processor_coor[orthogdim] ) { + gsum[t]=lsSum[lt]; + } + } + std::cout << GridLogMessage << "End of gsum[t] creation:" << std::endl; + std::cout << GridLogMessage << "Start of GlobalSumVector:" << std::endl; + grid->GlobalSumVector(&gsum[0], fd); + std::cout << GridLogMessage << "End of GlobalSumVector:" << std::endl; + + result = gsum; +} template static void sliceInnerProductVector( std::vector & result, const Lattice &lhs,const Lattice &rhs,int orthogdim) { diff --git a/lib/tensors/Tensor_inner.h b/lib/tensors/Tensor_inner.h index 46185652..b7a8417d 100644 --- a/lib/tensors/Tensor_inner.h +++ b/lib/tensors/Tensor_inner.h @@ -106,6 +106,7 @@ inline vRealD innerProductD(const vRealF &l,const vRealF &r){ typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; iScalar ret; ret=zero; + // std::cout << GridLogMessage << "innerProduct iVector" << std::endl; for(int c1=0;c1 ret; + // std::cout << GridLogMessage << "innerProduct iScalar" << std::endl; + ret._internal = innerProduct(lhs._internal,rhs._internal); return ret; } + template inline + auto myInnerProduct (const iVector& lhs,const iVector& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + iScalar ret; + ret=zero; + std::cout << GridLogMessage << "myInnerProduct iVector, N = " << N << std::endl; + for(int c1=0;c1 inline + auto myInnerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; + iScalar ret; + std::cout << GridLogMessage << "myInnerProduct iScalar" << std::endl; + + ret._internal = myInnerProduct(lhs._internal,rhs._internal); + return ret; + } } #endif From 9deae8c96274016ff86746536d559e48bb09b087 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Mon, 16 Jul 2018 14:18:45 +0100 Subject: [PATCH 391/620] A2A meson field contraction code --- extras/Hadrons/Modules.hpp | 99 ++++----- .../Hadrons/Modules/MContraction/A2AMeson.cc | 7 + .../Hadrons/Modules/MContraction/A2AMeson.hpp | 206 ++++++++++++++++++ extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 4 - extras/Hadrons/modules.inc | 196 ++++++++--------- 5 files changed, 362 insertions(+), 150 deletions(-) create mode 100644 extras/Hadrons/Modules/MContraction/A2AMeson.cc create mode 100644 extras/Hadrons/Modules/MContraction/A2AMeson.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 9d6ef49a..58e9fec3 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,59 +1,60 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include +#include #include #include -#include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include #include -#include #include +#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include \ No newline at end of file +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.cc b/extras/Hadrons/Modules/MContraction/A2AMeson.cc new file mode 100644 index 00000000..3ce5fe83 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TA2AMeson; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp new file mode 100644 index 00000000..fa1cb82e --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp @@ -0,0 +1,206 @@ +#ifndef Hadrons_MContraction_A2AMeson_hpp_ +#define Hadrons_MContraction_A2AMeson_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * A2AMeson * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MContraction) + +typedef std::pair GammaPair; + +class A2AMesonPar : Serializable +{ + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonPar, + int, Nl, + int, N, + std::string, A2A1, + std::string, A2A2, + std::string, gammas, + std::string, output); +}; + +template +class TA2AMeson : public Module +{ + public: + FERM_TYPE_ALIASES(FImpl, ); + SOLVER_TYPE_ALIASES(FImpl, ); + + typedef A2AModesSchurDiagTwo A2ABase; + + class Result : Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + Gamma::Algebra, gamma_snk, + Gamma::Algebra, gamma_src, + std::vector, corr); + }; + + public: + // constructor + TA2AMeson(const std::string name); + // destructor + virtual ~TA2AMeson(void){}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + virtual void parseGammaString(std::vector &gammaList); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER(A2AMeson, ARG(TA2AMeson), MContraction); + +/****************************************************************************** +* TA2AMeson implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TA2AMeson::TA2AMeson(const std::string name) + : Module(name) +{ +} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TA2AMeson::getInput(void) +{ + std::vector in = {par().A2A1, par().A2A2}; + in.push_back(par().A2A1 + "_class"); + in.push_back(par().A2A2 + "_class"); + + return in; +} + +template +std::vector TA2AMeson::getOutput(void) +{ + std::vector out = {}; + + return out; +} + +template +void TA2AMeson::parseGammaString(std::vector &gammaList) +{ + gammaList.clear(); + // Parse individual contractions from input string. + gammaList = strToVec(par().gammas); +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TA2AMeson::setup(void) +{ + int nt = env().getDim(Tp); + int N = par().N; + + int Ls_ = env().getObjectLs(par().A2A1 + "_class"); + + envTmp(std::vector, "w1", 1, N, FermionField(env().getGrid(1))); + envTmp(std::vector, "v1", 1, N, FermionField(env().getGrid(1))); + envTmpLat(FermionField, "tmpv_5d", Ls_); + envTmpLat(FermionField, "tmpw_5d", Ls_); + + envTmp(std::vector, "MF_x", 1, nt); + envTmp(std::vector, "MF_y", 1, nt); + envTmp(std::vector, "tmp", 1, nt); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AMeson::execute(void) +{ + LOG(Message) << "Computing A2A meson contractions" << std::endl; + + Result result; + Gamma g5(Gamma::Algebra::Gamma5); + std::vector gammaList; + int nt = env().getDim(Tp); + + parseGammaString(gammaList); + + result.gamma_snk = gammaList[0].first; + result.gamma_src = gammaList[0].second; + result.corr.resize(nt); + + int Nl = par().Nl; + int N = par().N; + LOG(Message) << "N for A2A cont: " << N << std::endl; + + envGetTmp(std::vector, MF_x); + envGetTmp(std::vector, MF_y); + envGetTmp(std::vector, tmp); + + for (unsigned int t = 0; t < nt; ++t) + { + tmp[t] = TensorRemove(MF_x[t] * MF_y[t] * 0.0); + } + + Gamma gSnk(gammaList[0].first); + Gamma gSrc(gammaList[0].second); + + auto &a2a1_fn = envGet(A2ABase, par().A2A1 + "_class"); + + envGetTmp(std::vector, w1); + envGetTmp(std::vector, v1); + envGetTmp(FermionField, tmpv_5d); + envGetTmp(FermionField, tmpw_5d); + + LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; + for (int i = 0; i < N; i++) + { + a2a1_fn.return_v(i, tmpv_5d, v1[i]); + a2a1_fn.return_w(i, tmpw_5d, w1[i]); + } + LOG(Message) << "Found v and w vectors for N = " << N << std::endl; + for (unsigned int i = 0; i < N; i++) + { + v1[i] = gSnk * v1[i]; + } + int ty; + for (unsigned int i = 0; i < N; i++) + { + for (unsigned int j = 0; j < N; j++) + { + sliceInnerProductVector(MF_x, w1[i], v1[j], Tp); + sliceInnerProductVector(MF_y, w1[j], v1[i], Tp); + for (unsigned int t = 0; t < nt; ++t) + { + for (unsigned int tx = 0; tx < nt; tx++) + { + ty = (tx + t) % nt; + tmp[t] += TensorRemove((MF_x[tx]) * (MF_y[ty])); + } + } + } + if (i % 10 == 0) + { + LOG(Message) << "MF for i = " << i << " of " << N << std::endl; + } + } + double NTinv = 1.0 / static_cast(nt); + for (unsigned int t = 0; t < nt; ++t) + { + result.corr[t] = NTinv * tmp[t]; + } + + saveResult(par().output, "meson", result); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MContraction_A2AMeson_hpp_ diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index c98243e6..5c6d9d01 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -186,7 +186,6 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, tmp); envGetTmp(FermionField, tmp2); - double weight = 1.0 / sqrt(Ns*Nc*Nsrc); int N_count = 0; for (unsigned int s = 0; s < Ns; ++s) for (unsigned int c = 0; c < Nc; ++c) @@ -200,13 +199,11 @@ void TA2AVectors::execute(void) if (Ls_ == 1) { PropToFerm(ferm_src, prop_src, s, c); - ferm_src = weight*ferm_src; tmp = ferm_src; } else { PropToFerm(tmp, prop_src, s, c); - tmp = weight*tmp; action.ImportPhysicalFermionSource(tmp, ferm_src); } } @@ -220,7 +217,6 @@ void TA2AVectors::execute(void) else { PropToFerm(ferm_src, prop_src, s, c); - ferm_src = weight*ferm_src; action.ExportPhysicalFermionSolution(ferm_src, tmp); } } diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 0a9f5351..b321f2b7 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,119 +1,121 @@ modules_cc =\ - Modules/MContraction/WeakHamiltonianEye.cc \ - Modules/MContraction/Baryon.cc \ - Modules/MContraction/MesonFieldGamma.cc \ - Modules/MContraction/Meson.cc \ - Modules/MContraction/WeakNeutral4ptDisc.cc \ - Modules/MContraction/WeakHamiltonianNonEye.cc \ - Modules/MContraction/WardIdentity.cc \ - Modules/MContraction/DiscLoop.cc \ - Modules/MContraction/Gamma3pt.cc \ - Modules/MFermion/FreeProp.cc \ - Modules/MFermion/GaugeProp.cc \ - Modules/MSource/Point.cc \ - Modules/MSource/Wall.cc \ Modules/MSource/SeqConserved.cc \ Modules/MSource/SeqGamma.cc \ + Modules/MSource/Point.cc \ Modules/MSource/Z2.cc \ + Modules/MSource/Wall.cc \ Modules/MSink/Point.cc \ Modules/MSink/Smear.cc \ - Modules/MSolver/A2AVectors.cc \ - Modules/MSolver/RBPrecCG.cc \ - Modules/MSolver/LocalCoherenceLanczos.cc \ - Modules/MGauge/StoutSmearing.cc \ - Modules/MGauge/Unit.cc \ - Modules/MGauge/UnitEm.cc \ - Modules/MGauge/StochEm.cc \ - Modules/MGauge/Random.cc \ - Modules/MGauge/FundtoHirep.cc \ - Modules/MUtilities/TestSeqGamma.cc \ - Modules/MUtilities/TestSeqConserved.cc \ - Modules/MLoop/NoiseLoop.cc \ - Modules/MScalar/FreeProp.cc \ - Modules/MScalar/VPCounterTerms.cc \ - Modules/MScalar/ChargedProp.cc \ - Modules/MScalar/ScalarVP.cc \ - Modules/MAction/Wilson.cc \ + Modules/MIO/LoadNersc.cc \ + Modules/MIO/LoadEigenPack.cc \ + Modules/MIO/LoadCoarseEigenPack.cc \ + Modules/MIO/LoadBinary.cc \ + Modules/MScalarSUN/TwoPointNPR.cc \ + Modules/MScalarSUN/TrPhi.cc \ + Modules/MScalarSUN/StochFreeField.cc \ + Modules/MScalarSUN/TrMag.cc \ + Modules/MScalarSUN/Div.cc \ + Modules/MScalarSUN/ShiftProbe.cc \ + Modules/MScalarSUN/Grad.cc \ + Modules/MScalarSUN/TwoPoint.cc \ + Modules/MScalarSUN/TimeMomProbe.cc \ + Modules/MScalarSUN/EMT.cc \ + Modules/MScalarSUN/TransProj.cc \ + Modules/MScalarSUN/TrKinetic.cc \ + Modules/MAction/DWF.cc \ Modules/MAction/MobiusDWF.cc \ Modules/MAction/ZMobiusDWF.cc \ - Modules/MAction/WilsonClover.cc \ - Modules/MAction/DWF.cc \ + Modules/MAction/Wilson.cc \ Modules/MAction/ScaledDWF.cc \ - Modules/MScalarSUN/TrPhi.cc \ - Modules/MScalarSUN/Grad.cc \ - Modules/MScalarSUN/TimeMomProbe.cc \ - Modules/MScalarSUN/TrMag.cc \ - Modules/MScalarSUN/TrKinetic.cc \ - Modules/MScalarSUN/EMT.cc \ - Modules/MScalarSUN/ShiftProbe.cc \ - Modules/MScalarSUN/TransProj.cc \ - Modules/MScalarSUN/StochFreeField.cc \ - Modules/MScalarSUN/TwoPoint.cc \ - Modules/MScalarSUN/TwoPointNPR.cc \ - Modules/MScalarSUN/Div.cc \ - Modules/MIO/LoadEigenPack.cc \ - Modules/MIO/LoadBinary.cc \ - Modules/MIO/LoadNersc.cc \ - Modules/MIO/LoadCoarseEigenPack.cc + Modules/MAction/WilsonClover.cc \ + Modules/MContraction/WeakHamiltonianNonEye.cc \ + Modules/MContraction/WardIdentity.cc \ + Modules/MContraction/WeakHamiltonianEye.cc \ + Modules/MContraction/DiscLoop.cc \ + Modules/MContraction/A2AMeson.cc \ + Modules/MContraction/Baryon.cc \ + Modules/MContraction/MesonFieldGamma.cc \ + Modules/MContraction/Gamma3pt.cc \ + Modules/MContraction/WeakNeutral4ptDisc.cc \ + Modules/MContraction/Meson.cc \ + Modules/MScalar/VPCounterTerms.cc \ + Modules/MScalar/ChargedProp.cc \ + Modules/MScalar/FreeProp.cc \ + Modules/MScalar/ScalarVP.cc \ + Modules/MUtilities/TestSeqGamma.cc \ + Modules/MUtilities/TestSeqConserved.cc \ + Modules/MFermion/FreeProp.cc \ + Modules/MFermion/GaugeProp.cc \ + Modules/MSolver/RBPrecCG.cc \ + Modules/MSolver/LocalCoherenceLanczos.cc \ + Modules/MSolver/A2AVectors.cc \ + Modules/MLoop/NoiseLoop.cc \ + Modules/MGauge/Unit.cc \ + Modules/MGauge/Random.cc \ + Modules/MGauge/UnitEm.cc \ + Modules/MGauge/StochEm.cc \ + Modules/MGauge/FundtoHirep.cc \ + Modules/MGauge/StoutSmearing.cc modules_hpp =\ - Modules/MContraction/Baryon.hpp \ - Modules/MContraction/MesonFieldGamma.hpp \ - Modules/MContraction/Meson.hpp \ - Modules/MContraction/WeakHamiltonian.hpp \ - Modules/MContraction/WeakHamiltonianNonEye.hpp \ - Modules/MContraction/DiscLoop.hpp \ - Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MContraction/Gamma3pt.hpp \ - Modules/MContraction/WardIdentity.hpp \ - Modules/MContraction/WeakHamiltonianEye.hpp \ - Modules/MFermion/FreeProp.hpp \ - Modules/MFermion/GaugeProp.hpp \ + Modules/MSource/SeqConserved.hpp \ Modules/MSource/SeqGamma.hpp \ + Modules/MSource/Z2.hpp \ Modules/MSource/Point.hpp \ Modules/MSource/Wall.hpp \ - Modules/MSource/Z2.hpp \ - Modules/MSource/SeqConserved.hpp \ Modules/MSink/Smear.hpp \ Modules/MSink/Point.hpp \ - Modules/MSolver/A2AVectors.hpp \ - Modules/MSolver/LocalCoherenceLanczos.hpp \ - Modules/MSolver/RBPrecCG.hpp \ - Modules/MGauge/UnitEm.hpp \ - Modules/MGauge/StoutSmearing.hpp \ - Modules/MGauge/Unit.hpp \ - Modules/MGauge/Random.hpp \ - Modules/MGauge/FundtoHirep.hpp \ - Modules/MGauge/StochEm.hpp \ - Modules/MUtilities/TestSeqGamma.hpp \ - Modules/MUtilities/TestSeqConserved.hpp \ - Modules/MLoop/NoiseLoop.hpp \ - Modules/MScalar/FreeProp.hpp \ - Modules/MScalar/VPCounterTerms.hpp \ - Modules/MScalar/ScalarVP.hpp \ - Modules/MScalar/Scalar.hpp \ - Modules/MScalar/ChargedProp.hpp \ - Modules/MAction/DWF.hpp \ - Modules/MAction/MobiusDWF.hpp \ - Modules/MAction/Wilson.hpp \ - Modules/MAction/WilsonClover.hpp \ - Modules/MAction/ZMobiusDWF.hpp \ - Modules/MAction/ScaledDWF.hpp \ - Modules/MScalarSUN/StochFreeField.hpp \ + Modules/MIO/LoadBinary.hpp \ + Modules/MIO/LoadEigenPack.hpp \ + Modules/MIO/LoadCoarseEigenPack.hpp \ + Modules/MIO/LoadNersc.hpp \ + Modules/MScalarSUN/Utils.hpp \ + Modules/MScalarSUN/Grad.hpp \ + Modules/MScalarSUN/TrPhi.hpp \ Modules/MScalarSUN/TwoPointNPR.hpp \ + Modules/MScalarSUN/TwoPoint.hpp \ + Modules/MScalarSUN/TransProj.hpp \ + Modules/MScalarSUN/TrKinetic.hpp \ + Modules/MScalarSUN/StochFreeField.hpp \ Modules/MScalarSUN/ShiftProbe.hpp \ - Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TimeMomProbe.hpp \ + Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/EMT.hpp \ - Modules/MScalarSUN/TwoPoint.hpp \ - Modules/MScalarSUN/TrPhi.hpp \ - Modules/MScalarSUN/Utils.hpp \ - Modules/MScalarSUN/TransProj.hpp \ - Modules/MScalarSUN/Grad.hpp \ - Modules/MScalarSUN/TrKinetic.hpp \ - Modules/MIO/LoadEigenPack.hpp \ - Modules/MIO/LoadNersc.hpp \ - Modules/MIO/LoadCoarseEigenPack.hpp \ - Modules/MIO/LoadBinary.hpp + Modules/MAction/ZMobiusDWF.hpp \ + Modules/MAction/ScaledDWF.hpp \ + Modules/MAction/Wilson.hpp \ + Modules/MAction/WilsonClover.hpp \ + Modules/MAction/MobiusDWF.hpp \ + Modules/MAction/DWF.hpp \ + Modules/MContraction/WeakHamiltonian.hpp \ + Modules/MContraction/DiscLoop.hpp \ + Modules/MContraction/Meson.hpp \ + Modules/MContraction/WardIdentity.hpp \ + Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MContraction/Gamma3pt.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/MesonFieldGamma.hpp \ + Modules/MContraction/Baryon.hpp \ + Modules/MContraction/WeakNeutral4ptDisc.hpp \ + Modules/MContraction/A2AMeson.hpp \ + Modules/MScalar/ScalarVP.hpp \ + Modules/MScalar/Scalar.hpp \ + Modules/MScalar/FreeProp.hpp \ + Modules/MScalar/ChargedProp.hpp \ + Modules/MScalar/VPCounterTerms.hpp \ + Modules/MUtilities/TestSeqConserved.hpp \ + Modules/MUtilities/TestSeqGamma.hpp \ + Modules/MFermion/FreeProp.hpp \ + Modules/MFermion/GaugeProp.hpp \ + Modules/MSolver/A2AVectors.hpp \ + Modules/MSolver/RBPrecCG.hpp \ + Modules/MSolver/LocalCoherenceLanczos.hpp \ + Modules/MLoop/NoiseLoop.hpp \ + Modules/MGauge/StoutSmearing.hpp \ + Modules/MGauge/StochEm.hpp \ + Modules/MGauge/FundtoHirep.hpp \ + Modules/MGauge/Unit.hpp \ + Modules/MGauge/Random.hpp \ + Modules/MGauge/UnitEm.hpp From d868a451200659853b30ba8e1af68af3ecc0ae9e Mon Sep 17 00:00:00 2001 From: fionnoh Date: Mon, 16 Jul 2018 16:19:59 +0100 Subject: [PATCH 392/620] Cleaned up some stuff that was erroneously included in a previous "trash" commit. Leaving in the mySliceInnerProdct function for now as it speeds up mesonfield creation quite a lot for 24^3 tests --- .../Modules/MContraction/MesonFieldGamma.hpp | 4 +-- lib/lattice/Lattice_reduction.h | 10 +------ lib/tensors/Tensor_inner.h | 26 ------------------- 3 files changed, 2 insertions(+), 38 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp index 0b81f607..3c73967e 100644 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp @@ -39,8 +39,7 @@ class TMesonFieldGamma : public Module public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, Gamma::Algebra, gamma, - std::vector>>, MesonField, - ComplexD, last); + std::vector>>, MesonField); }; public: @@ -179,7 +178,6 @@ void TMesonFieldGamma::execute(void) LOG(Message) << "MF for i = " << i << " of " << N << std::endl; } } - result[0].last = MesonField_ij[7]; saveResult(par().output, "meson", result); } diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 12bfebed..196d6748 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -41,7 +41,6 @@ template inline RealD norm2(const Lattice &arg){ template inline ComplexD innerProduct(const Lattice &left,const Lattice &right) { - std::cout << GridLogMessage << "Start alloc innerProduct" << std::endl; typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_typeD vector_type; GridBase *grid = left._grid; @@ -50,8 +49,6 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ ComplexD inner; Vector sumarray(grid->SumArraySize()*pad); - std::cout << GridLogMessage << "End alloc innerProduct" << std::endl; - std::cout << GridLogMessage << "Start parallel for innerProduct" << std::endl; parallel_for(int thr=0;thrSumArraySize();thr++){ int nwork, mywork, myoff; GridThread::GetWork(left._grid->oSites(),thr,mywork,myoff); @@ -65,18 +62,13 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ ComplexD tmp = Reduce(TensorRemove(vinner)) ; vstream(sumarray[thr*pad],tmp); } - std::cout << GridLogMessage << "End parallel for innerProduct" << std::endl; - std::cout << GridLogMessage << "Start inner sum innerProduct" << std::endl; inner=0.0; for(int i=0;iSumArraySize();i++){ inner = inner+sumarray[i*pad]; } right._grid->GlobalSum(inner); return inner; - std::cout << GridLogMessage << "End inner sum innerProduct" << std::endl; - - std::cout << GridLogMessage << "End innerProduct" << std::endl; } ///////////////////////// @@ -339,7 +331,7 @@ static void localSliceInnerProductVector(std::vector &result, const La for(int n=0;n ret; ret=zero; - // std::cout << GridLogMessage << "innerProduct iVector" << std::endl; for(int c1=0;c1 ret; - // std::cout << GridLogMessage << "innerProduct iScalar" << std::endl; - ret._internal = innerProduct(lhs._internal,rhs._internal); return ret; } - template inline - auto myInnerProduct (const iVector& lhs,const iVector& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iScalar ret; - ret=zero; - std::cout << GridLogMessage << "myInnerProduct iVector, N = " << N << std::endl; - for(int c1=0;c1 inline - auto myInnerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - std::cout << GridLogMessage << "myInnerProduct iScalar" << std::endl; - - ret._internal = myInnerProduct(lhs._internal,rhs._internal); - return ret; - } } #endif From 2c54a536f3fa6a98b86b4602080ee4d23e8affc3 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Thu, 19 Jul 2018 15:56:52 +0100 Subject: [PATCH 393/620] Moved the meson field inner product to its own header file --- extras/Hadrons/AllToAllReduction.hpp | 146 ++++++++++++++++++ extras/Hadrons/AllToAllVectors.hpp | 1 + extras/Hadrons/Makefile.am | 1 + .../Hadrons/Modules/MContraction/A2AMeson.hpp | 4 +- .../Modules/MContraction/MesonFieldGamma.hpp | 110 +++++++++++-- lib/lattice/Lattice_reduction.h | 33 ++-- lib/tensors/Tensor_inner.h | 26 ---- 7 files changed, 257 insertions(+), 64 deletions(-) create mode 100644 extras/Hadrons/AllToAllReduction.hpp diff --git a/extras/Hadrons/AllToAllReduction.hpp b/extras/Hadrons/AllToAllReduction.hpp new file mode 100644 index 00000000..7b2d2c1a --- /dev/null +++ b/extras/Hadrons/AllToAllReduction.hpp @@ -0,0 +1,146 @@ +#ifndef A2A_Reduction_hpp_ +#define A2A_Reduction_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +//////////////////////////////////////////// +// A2A Meson Field Inner Product +//////////////////////////////////////////// + +template +void sliceInnerProductMesonField(std::vector> &mat, + const std::vector> &lhs, + const std::vector> &rhs, + int orthogdim) +{ + typedef typename FermionField::scalar_type scalar_type; + typedef typename FermionField::vector_type vector_type; + + int Lblock = lhs.size(); + int Rblock = rhs.size(); + + GridBase *grid = lhs[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + int Nt = grid->GlobalDimensions()[orthogdim]; + + assert(mat.size() == Lblock * Rblock); + for (int t = 0; t < mat.size(); t++) + { + assert(mat[t].size() == Nt); + } + + int fd = grid->_fdimensions[orthogdim]; + int ld = grid->_ldimensions[orthogdim]; + int rd = grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + std::vector> lvSum(rd * Lblock * Rblock); + for(int r=0;r lsSum(ld * Lblock * Rblock, scalar_type(0.0)); + + int e1 = grid->_slice_nblock[orthogdim]; + int e2 = grid->_slice_block[orthogdim]; + int stride = grid->_slice_stride[orthogdim]; + + // std::cout << GridLogMessage << " Entering first parallel loop " << std::endl; + // Parallelise over t-direction doesn't expose as much parallelism as needed for KNL + parallel_for(int r = 0; r < rd; r++) + { + int so = r * grid->_ostride[orthogdim]; // base offset for start of plane + for (int n = 0; n < e1; n++) + { + for (int b = 0; b < e2; b++) + { + int ss = so + n * stride + b; + for (int i = 0; i < Lblock; i++) + { + auto left = conjugate(lhs[i]._odata[ss]); + for (int j = 0; j < Rblock; j++) + { + int idx = i + Lblock * j + Lblock * Rblock * r; + auto right = rhs[j]._odata[ss]; + vector_type vv = left()(0)(0) * right()(0)(0) + + left()(0)(1) * right()(0)(1) + + left()(0)(2) * right()(0)(2) + + left()(1)(0) * right()(1)(0) + + left()(1)(1) * right()(1)(1) + + left()(1)(2) * right()(1)(2) + + left()(2)(0) * right()(2)(0) + + left()(2)(1) * right()(2)(1) + + left()(2)(2) * right()(2)(2) + + left()(3)(0) * right()(3)(0) + + left()(3)(1) * right()(3)(1) + + left()(3)(2) * right()(3)(2); + + lvSum[idx] = lvSum[idx] + vv; + } + } + } + } + } + + // std::cout << GridLogMessage << " Entering second parallel loop " << std::endl; + // Sum across simd lanes in the plane, breaking out orthog dir. + parallel_for(int rt = 0; rt < rd; rt++) + { + std::vector icoor(Nd); + for (int i = 0; i < Lblock; i++) + { + for (int j = 0; j < Rblock; j++) + { + iScalar temp; + std::vector> extracted(Nsimd); + temp._internal = lvSum[i + Lblock * j + Lblock * Rblock * rt]; + extract(temp, extracted); + for (int idx = 0; idx < Nsimd; idx++) + { + grid->iCoorFromIindex(icoor, idx); + int ldx = rt + icoor[orthogdim] * rd; + int ij_dx = i + Lblock * j + Lblock * Rblock * ldx; + lsSum[ij_dx] = lsSum[ij_dx] + extracted[idx]._internal; + } + } + } + } + + // std::cout << GridLogMessage << " Entering non parallel loop " << std::endl; + for (int t = 0; t < fd; t++) + { + int pt = t/ld; // processor plane + int lt = t%ld; + for (int i = 0; i < Lblock; i++) + { + for (int j = 0; j < Rblock; j++) + { + if (pt == grid->_processor_coor[orthogdim]) + { + int ij_dx = i + Lblock * j + Lblock * Rblock * lt; + mat[i + j * Lblock][t] = lsSum[ij_dx]; + } + else + { + mat[i + j * Lblock][t] = scalar_type(0.0); + } + + } + } + } + // std::cout << GridLogMessage << " Done " << std::endl; + // defer sum over nodes. + return; +} + +END_HADRONS_NAMESPACE + +#endif // A2A_Reduction_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index a514beac..24f5397e 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -182,6 +182,7 @@ class A2AModesSchurDiagTwo assert(sol_o.checkerboard == Odd); action.DminusDag(tmp_wout, wout_5d); + action.ExportPhysicalFermionSolution(wout_5d, wout_4d); } diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index 7240be82..abfcf9a8 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -15,6 +15,7 @@ libHadrons_adir = $(pkgincludedir)/Hadrons nobase_libHadrons_a_HEADERS = \ $(modules_hpp) \ AllToAllVectors.hpp \ + AllToAllReduction.hpp \ Application.hpp \ EigenPack.hpp \ Environment.hpp \ diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp index fa1cb82e..45fb4db9 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp @@ -174,8 +174,8 @@ void TA2AMeson::execute(void) { for (unsigned int j = 0; j < N; j++) { - sliceInnerProductVector(MF_x, w1[i], v1[j], Tp); - sliceInnerProductVector(MF_y, w1[j], v1[i], Tp); + mySliceInnerProductVector(MF_x, w1[i], v1[j], Tp); + mySliceInnerProductVector(MF_y, w1[j], v1[i], Tp); for (unsigned int t = 0; t < nt; ++t) { for (unsigned int tx = 0; tx < nt; tx++) diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp index 0b81f607..eefd5e64 100644 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp @@ -5,6 +5,9 @@ #include #include #include +#include +#include +#include BEGIN_HADRONS_NAMESPACE @@ -19,6 +22,7 @@ class MesonFieldPar : Serializable GRID_SERIALIZABLE_CLASS_MEMBERS(MesonFieldPar, int, Nl, int, N, + int, Nblock, std::string, A2A1, std::string, A2A2, std::string, gammas, @@ -40,6 +44,7 @@ class TMesonFieldGamma : public Module GRID_SERIALIZABLE_CLASS_MEMBERS(Result, Gamma::Algebra, gamma, std::vector>>, MesonField, + std::vector>, MesonFiield, ComplexD, last); }; @@ -52,6 +57,9 @@ class TMesonFieldGamma : public Module virtual std::vector getInput(void); virtual std::vector getOutput(void); virtual void parseGammaString(std::vector &gammaList); + virtual void vectorOfWs(std::vector &w, int i, int Nblock, FermionField &tmpw_5d, std::vector &vec_w); + virtual void vectorOfVs(std::vector &v, int j, int Nblock, FermionField &tmpv_5d, std::vector &vec_v); + virtual void gammaMult(std::vector &v, Gamma gamma); // setup virtual void setup(void); // execution @@ -107,19 +115,54 @@ void TMesonFieldGamma::parseGammaString(std::vector &gamm } } +template +void TMesonFieldGamma::vectorOfWs(std::vector &w, int i, int Nblock, FermionField &tmpw_5d, std::vector &vec_w) +{ + for (unsigned int ni = 0; ni < Nblock; ni++) + { + vec_w[ni] = w[i + ni]; + } +} + +template +void TMesonFieldGamma::vectorOfVs(std::vector &v, int j, int Nblock, FermionField &tmpv_5d, std::vector &vec_v) +{ + for (unsigned int nj = 0; nj < Nblock; nj++) + { + vec_v[nj] = v[j+nj]; + } +} + +template +void TMesonFieldGamma::gammaMult(std::vector &v, Gamma gamma) +{ + int Nblock = v.size(); + for (unsigned int nj = 0; nj < Nblock; nj++) + { + v[nj] = gamma * v[nj]; + } +} + // setup /////////////////////////////////////////////////////////////////////// template void TMesonFieldGamma::setup(void) { int nt = env().getDim(Tp); int N = par().N; + int Nblock = par().Nblock; int Ls_ = env().getObjectLs(par().A2A1 + "_class"); - envTmpLat(FermionField, "w", Ls_); - envTmpLat(FermionField, "v", Ls_); envTmpLat(FermionField, "tmpv_5d", Ls_); envTmpLat(FermionField, "tmpw_5d", Ls_); + + envTmp(std::vector, "w", 1, N, FermionField(env().getGrid(1))); + envTmp(std::vector, "v", 1, N, FermionField(env().getGrid(1))); + + envTmp(Eigen::MatrixXcd, "MF", 1, Eigen::MatrixXcd::Zero(nt, N * N)); + + envTmp(std::vector, "w_block", 1, Nblock, FermionField(env().getGrid(1))); + envTmp(std::vector, "v_block", 1, Nblock, FermionField(env().getGrid(1))); } // execution /////////////////////////////////////////////////////////////////// @@ -130,6 +173,7 @@ void TMesonFieldGamma::execute(void) int N = par().N; int nt = env().getDim(Tp); + int Nblock = par().Nblock; std::vector result; std::vector gammaResultList; @@ -145,33 +189,54 @@ void TMesonFieldGamma::execute(void) { result[i].gamma = gammaResultList[i]; result[i].MesonField.resize(N, std::vector>(N, std::vector(nt))); + result[i].MesonFiield.resize(N, std::vector<(nt)); Gamma gamma(gammaResultList[i]); gammaList[i] = gamma; } - std::vector MesonField_ij; - MesonField_ij.resize(nt); - auto &a2a1 = envGet(A2ABase, par().A2A1 + "_class"); auto &a2a2 = envGet(A2ABase, par().A2A2 + "_class"); - envGetTmp(FermionField, w); - envGetTmp(FermionField, v); envGetTmp(FermionField, tmpv_5d); envGetTmp(FermionField, tmpw_5d); - for (unsigned int i = 0; i < N; i++) + envGetTmp(std::vector, v); + envGetTmp(std::vector, w); + LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; + for (int i = 0; i < N; i++) { - a2a1.return_w(i, tmpw_5d, w); - for (unsigned int j = 0; j < N; j++) + a2a2.return_v(i, tmpv_5d, v[i]); + a2a1.return_w(i, tmpw_5d, w[i]); + } + LOG(Message) << "Found v and w vectors for N = " << N << std::endl; + + std::vector> MesonField_ij; + LOG(Message) << "Before blocked MFs, Nblock = " << Nblock << std::endl; + envGetTmp(std::vector, v_block); + envGetTmp(std::vector, w_block); + MesonField_ij.resize(Nblock * Nblock, std::vector(nt)); + + envGetTmp(Eigen::MatrixXcd, MF); + + LOG(Message) << "Before blocked MFs, Nblock = " << Nblock << std::endl; + for (unsigned int i = 0; i < N; i += Nblock) + { + vectorOfWs(w, i, Nblock, tmpw_5d, w_block); + for (unsigned int j = 0; j < N; j += Nblock) { - a2a2.return_v(j, tmpv_5d, v); + vectorOfVs(v, j, Nblock, tmpv_5d, v_block); for (unsigned int k = 0; k < result.size(); k++) { - v = gammaList[k]*v; - sliceInnerProductVector(MesonField_ij, w, v, Tp); - result[k].MesonField[i][j] = MesonField_ij; + gammaMult(v_block, gammaList[k]); + sliceInnerProductMesonField(MesonField_ij, w_block, v_block, Tp); + for (unsigned int nj = 0; nj < Nblock; nj++) + { + for (unsigned int ni = 0; ni < Nblock; ni++) + { + MF.col((i + ni) + (j + nj) * N) = Eigen::VectorXcd::Map(&MesonField_ij[nj * Nblock + ni][0], MesonField_ij[nj * Nblock + ni].size()); + } + } } } if (i % 10 == 0) @@ -179,7 +244,22 @@ void TMesonFieldGamma::execute(void) LOG(Message) << "MF for i = " << i << " of " << N << std::endl; } } - result[0].last = MesonField_ij[7]; + LOG(Message) << "Before Global sum, Nblock = " << Nblock << std::endl; + v_block[0]._grid->GlobalSumVector(MF.data(), MF.size()); + LOG(Message) << "After Global sum, Nblock = " << Nblock << std::endl; + for (unsigned int i = 0; i < N; i++) + { + for (unsigned int j = 0; j < N; j++) + { + for (unsigned int k = 0; k < result.size(); k++) + { + for (unsigned int t = 0; t < nt; t++) + { + result[k].MesonField[i][j][t] = MF.col(i + N * j)[t]; + } + } + } + } saveResult(par().output, "meson", result); } diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 12bfebed..b8d13b47 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -41,7 +41,6 @@ template inline RealD norm2(const Lattice &arg){ template inline ComplexD innerProduct(const Lattice &left,const Lattice &right) { - std::cout << GridLogMessage << "Start alloc innerProduct" << std::endl; typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_typeD vector_type; GridBase *grid = left._grid; @@ -50,8 +49,6 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ ComplexD inner; Vector sumarray(grid->SumArraySize()*pad); - std::cout << GridLogMessage << "End alloc innerProduct" << std::endl; - std::cout << GridLogMessage << "Start parallel for innerProduct" << std::endl; parallel_for(int thr=0;thrSumArraySize();thr++){ int nwork, mywork, myoff; GridThread::GetWork(left._grid->oSites(),thr,mywork,myoff); @@ -65,18 +62,12 @@ inline ComplexD innerProduct(const Lattice &left,const Lattice &righ ComplexD tmp = Reduce(TensorRemove(vinner)) ; vstream(sumarray[thr*pad],tmp); } - std::cout << GridLogMessage << "End parallel for innerProduct" << std::endl; - - std::cout << GridLogMessage << "Start inner sum innerProduct" << std::endl; inner=0.0; for(int i=0;iSumArraySize();i++){ inner = inner+sumarray[i*pad]; } right._grid->GlobalSum(inner); return inner; - std::cout << GridLogMessage << "End inner sum innerProduct" << std::endl; - - std::cout << GridLogMessage << "End innerProduct" << std::endl; } ///////////////////////// @@ -285,7 +276,7 @@ template inline void sliceSum(const Lattice &Data,std::vector< template static void mySliceInnerProductVector( std::vector & result, const Lattice &lhs,const Lattice &rhs,int orthogdim) { - std::cout << GridLogMessage << "Start mySsliceInnerProductVector" << std::endl; + std::cout << GridLogMessage << "Start mySliceInnerProductVector" << std::endl; typedef typename vobj::scalar_type scalar_type; std::vector lsSum; @@ -313,12 +304,12 @@ static void localSliceInnerProductVector(std::vector &result, const La int fd=grid->_fdimensions[orthogdim]; int ld=grid->_ldimensions[orthogdim]; int rd=grid->_rdimensions[orthogdim]; - std::cout << GridLogMessage << "Start alloc" << std::endl; + // std::cout << GridLogMessage << "Start alloc" << std::endl; std::vector > lvSum(rd); // will locally sum vectors first lsSum.resize(ld,scalar_type(0.0)); // sum across these down to scalars std::vector> extracted(Nsimd); // splitting the SIMD - std::cout << GridLogMessage << "End alloc" << std::endl; + // std::cout << GridLogMessage << "End alloc" << std::endl; result.resize(fd); // And then global sum to return the same vector to every node for IO to file for(int r=0;r &result, const La int e1= grid->_slice_nblock[orthogdim]; int e2= grid->_slice_block [orthogdim]; int stride=grid->_slice_stride[orthogdim]; - std::cout << GridLogMessage << "End prep" << std::endl; - std::cout << GridLogMessage << "Start parallel inner product, _rd = " << rd << std::endl; + // std::cout << GridLogMessage << "End prep" << std::endl; + // std::cout << GridLogMessage << "Start parallel inner product, _rd = " << rd << std::endl; vector_type vv; parallel_for(int r=0;r &result, const La for(int n=0;n icoor(Nd); @@ -364,7 +355,7 @@ static void localSliceInnerProductVector(std::vector &result, const La } } - std::cout << GridLogMessage << "End sum over simd lanes" << std::endl; + // std::cout << GridLogMessage << "End sum over simd lanes" << std::endl; } template static void globalSliceInnerProductVector(std::vector &result, const Lattice &lhs, std::vector &lsSum, int orthogdim) @@ -376,7 +367,7 @@ static void globalSliceInnerProductVector(std::vector &result, const L // sum over nodes. std::vector gsum; gsum.resize(fd, scalar_type(0.0)); - std::cout << GridLogMessage << "Start of gsum[t] creation:" << std::endl; + // std::cout << GridLogMessage << "Start of gsum[t] creation:" << std::endl; for(int t=0;t &result, const L gsum[t]=lsSum[lt]; } } - std::cout << GridLogMessage << "End of gsum[t] creation:" << std::endl; - std::cout << GridLogMessage << "Start of GlobalSumVector:" << std::endl; + // std::cout << GridLogMessage << "End of gsum[t] creation:" << std::endl; + // std::cout << GridLogMessage << "Start of GlobalSumVector:" << std::endl; grid->GlobalSumVector(&gsum[0], fd); - std::cout << GridLogMessage << "End of GlobalSumVector:" << std::endl; + // std::cout << GridLogMessage << "End of GlobalSumVector:" << std::endl; result = gsum; } diff --git a/lib/tensors/Tensor_inner.h b/lib/tensors/Tensor_inner.h index b7a8417d..46185652 100644 --- a/lib/tensors/Tensor_inner.h +++ b/lib/tensors/Tensor_inner.h @@ -106,7 +106,6 @@ inline vRealD innerProductD(const vRealF &l,const vRealF &r){ typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; iScalar ret; ret=zero; - // std::cout << GridLogMessage << "innerProduct iVector" << std::endl; for(int c1=0;c1 ret; - // std::cout << GridLogMessage << "innerProduct iScalar" << std::endl; - ret._internal = innerProduct(lhs._internal,rhs._internal); return ret; } - template inline - auto myInnerProduct (const iVector& lhs,const iVector& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iScalar ret; - ret=zero; - std::cout << GridLogMessage << "myInnerProduct iVector, N = " << N << std::endl; - for(int c1=0;c1 inline - auto myInnerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - std::cout << GridLogMessage << "myInnerProduct iScalar" << std::endl; - - ret._internal = myInnerProduct(lhs._internal,rhs._internal); - return ret; - } } #endif From 7dfd3cdae8abcba909f6cd13f66d2edb6c970454 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Fri, 20 Jul 2018 15:45:43 +0100 Subject: [PATCH 394/620] Inclusion of ExportPhysicalFermionSource that fixes a bug in the low mode w vectors --- extras/Hadrons/AllToAllVectors.hpp | 2 +- lib/qcd/action/fermion/CayleyFermion5D.cc | 12 ++++++++++++ lib/qcd/action/fermion/CayleyFermion5D.h | 1 + lib/qcd/action/fermion/FermionOperator.h | 4 ++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index 24f5397e..34058911 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -183,7 +183,7 @@ class A2AModesSchurDiagTwo action.DminusDag(tmp_wout, wout_5d); - action.ExportPhysicalFermionSolution(wout_5d, wout_4d); + action.ExportPhysicalFermionSource(wout_5d, wout_4d); } void high_mode_v(Matrix &action, Solver &solver, const Field &source, Field &vout_5d, Field &vout_4d) diff --git a/lib/qcd/action/fermion/CayleyFermion5D.cc b/lib/qcd/action/fermion/CayleyFermion5D.cc index e3b77390..289e7aae 100644 --- a/lib/qcd/action/fermion/CayleyFermion5D.cc +++ b/lib/qcd/action/fermion/CayleyFermion5D.cc @@ -68,6 +68,18 @@ void CayleyFermion5D::ExportPhysicalFermionSolution(const FermionField &so ExtractSlice(exported4d, tmp, 0, 0); } template +void CayleyFermion5D::ExportPhysicalFermionSource(const FermionField &solution5d,FermionField &exported4d) +{ + int Ls = this->Ls; + FermionField tmp(this->FermionGrid()); + tmp = solution5d; + conformable(solution5d._grid,this->FermionGrid()); + conformable(exported4d._grid,this->GaugeGrid()); + axpby_ssp_pplus (tmp, 0., solution5d, 1., solution5d, 0, 0); + axpby_ssp_pminus(tmp, 1., tmp , 1., solution5d, 0, Ls-1); + ExtractSlice(exported4d, tmp, 0, 0); +} +template void CayleyFermion5D::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d) { int Ls = this->Ls; diff --git a/lib/qcd/action/fermion/CayleyFermion5D.h b/lib/qcd/action/fermion/CayleyFermion5D.h index b370b09d..897833c7 100644 --- a/lib/qcd/action/fermion/CayleyFermion5D.h +++ b/lib/qcd/action/fermion/CayleyFermion5D.h @@ -89,6 +89,7 @@ namespace Grid { virtual void Dminus(const FermionField &psi, FermionField &chi); virtual void DminusDag(const FermionField &psi, FermionField &chi); virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d); + virtual void ExportPhysicalFermionSource(const FermionField &solution5d, FermionField &exported4d); virtual void ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d); ///////////////////////////////////////////////////// diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index 77fdbec5..bca6f4dc 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -166,6 +166,10 @@ namespace Grid { { exported=solution; }; + virtual void ExportPhysicalFermionSource(const FermionField &solution, FermionField &exported) + { + exported = solution; + }; }; } From b78074b6a0abe5976c36db340fdacc6cde760acb Mon Sep 17 00:00:00 2001 From: fionnoh Date: Fri, 20 Jul 2018 16:55:24 +0100 Subject: [PATCH 395/620] Removed a Dminus from high mode v and removed duplication pf D_oo code --- extras/Hadrons/AllToAllVectors.hpp | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index 34058911..b7209e83 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -88,18 +88,6 @@ class A2AModesSchurDiagTwo } } - void Doo(Matrix &action, const Field &in, Field &out) - { - Field tmp(in._grid); - - action.MooeeInv(in, out); - action.Meooe(out, tmp); - action.MooeeInv(tmp, out); - action.Meooe(out, tmp); - - axpy(out,-1.0, tmp, in); - } - void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout_5d, Field &vout_4d) { GridBase *grid = action.RedBlackGrid(); @@ -162,7 +150,7 @@ class A2AModesSchurDiagTwo ///////////////////////////////////////////////////// // w_ie = - MeeInvDag MoeDag Doo evec_i ///////////////////////////////////////////////////// - Doo(action, src_o, tmp); + _HermOpEO.Mpc(src_o, tmp); assert(tmp.checkerboard == Odd); action.MeooeDag(tmp, sol_e); assert(sol_e.checkerboard == Even); @@ -173,7 +161,7 @@ class A2AModesSchurDiagTwo ///////////////////////////////////////////////////// // w_io = Doo evec_i ///////////////////////////////////////////////////// - Doo(action, src_o, sol_o); + _HermOpEO.Mpc(src_o, sol_o); assert(sol_o.checkerboard == Odd); setCheckerboard(tmp_wout, sol_e); @@ -189,9 +177,6 @@ class A2AModesSchurDiagTwo void high_mode_v(Matrix &action, Solver &solver, const Field &source, Field &vout_5d, Field &vout_4d) { GridBase *fgrid = action.Grid(); - Field tmp(fgrid); - - action.Dminus(source, tmp); solver(vout_5d, source); // Note: solver is solver(out, in) action.ExportPhysicalFermionSolution(vout_5d, vout_4d); } From 04d86fe9f313cd505936ce6aee35ac3d26291d03 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Fri, 20 Jul 2018 21:38:19 +0100 Subject: [PATCH 396/620] Removed overly verbose print statement --- lib/lattice/Lattice_reduction.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 40d1526d..41351c98 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -277,19 +277,19 @@ template inline void sliceSum(const Lattice &Data,std::vector< template static void mySliceInnerProductVector( std::vector & result, const Lattice &lhs,const Lattice &rhs,int orthogdim) { - std::cout << GridLogMessage << "Start mySliceInnerProductVector" << std::endl; + // std::cout << GridLogMessage << "Start mySliceInnerProductVector" << std::endl; typedef typename vobj::scalar_type scalar_type; std::vector lsSum; localSliceInnerProductVector(result, lhs, rhs, lsSum, orthogdim); globalSliceInnerProductVector(result, lhs, lsSum, orthogdim); - std::cout << GridLogMessage << "End mySliceInnerProductVector" << std::endl; + // std::cout << GridLogMessage << "End mySliceInnerProductVector" << std::endl; } template static void localSliceInnerProductVector(std::vector &result, const Lattice &lhs, const Lattice &rhs, std::vector &lsSum, int orthogdim) { - std::cout << GridLogMessage << "Start prep" << std::endl; + // std::cout << GridLogMessage << "Start prep" << std::endl; typedef typename vobj::vector_type vector_type; typedef typename vobj::scalar_type scalar_type; GridBase *grid = lhs._grid; From 94c71980010885522c526abb8958220096d062e4 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Fri, 20 Jul 2018 23:08:22 +0100 Subject: [PATCH 397/620] Added ZFIMPL to A2AMeson contraction --- extras/Hadrons/Modules/MContraction/A2AMeson.cc | 3 ++- extras/Hadrons/Modules/MContraction/A2AMeson.hpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.cc b/extras/Hadrons/Modules/MContraction/A2AMeson.cc index 3ce5fe83..5e5c122b 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.cc +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.cc @@ -4,4 +4,5 @@ using namespace Grid; using namespace Hadrons; using namespace MContraction; -template class Grid::Hadrons::MContraction::TA2AMeson; \ No newline at end of file +template class Grid::Hadrons::MContraction::TA2AMeson; +template class Grid::Hadrons::MContraction::TA2AMeson; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp index 45fb4db9..f8d7f74c 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp @@ -61,6 +61,7 @@ class TA2AMeson : public Module }; MODULE_REGISTER(A2AMeson, ARG(TA2AMeson), MContraction); +MODULE_REGISTER(ZA2AMeson, ARG(TA2AMeson), MContraction); /****************************************************************************** * TA2AMeson implementation * From c995788259e63ad3955f1c9e7b0336180149cf95 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Sat, 21 Jul 2018 00:08:11 +0100 Subject: [PATCH 398/620] Added ImportUnphysicalFermion and included appropriate logic for 5d w vectors in A2A code --- extras/Hadrons/AllToAllVectors.hpp | 8 ++++---- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 6 +++++- lib/qcd/action/fermion/CayleyFermion5D.cc | 15 +++++++++++++++ lib/qcd/action/fermion/CayleyFermion5D.h | 1 + lib/qcd/action/fermion/FermionOperator.h | 8 ++++++-- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index b7209e83..7d9aa62e 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -51,14 +51,14 @@ class A2AModesSchurDiagTwo v_high_4d.resize(size_4d, grid_4d); } - void high_modes(Field &source_5d, Field &source_4d, int i) + void high_modes(Field &source_5d, Field &w_source_5d, Field &source_4d, int i) { int i5d; LOG(Message) << "A2A high modes for i = " << i << std::endl; i5d = 0; if (return_5d) i5d = i; this->high_mode_v(action, solver, source_5d, v_high_5d[i5d], v_high_4d[i]); - this->high_mode_w(source_5d, source_4d, w_high_5d[i5d], w_high_4d[i]); + this->high_mode_w(w_source_5d, source_4d, w_high_5d[i5d], w_high_4d[i]); } void return_v(int i, Field &vout_5d, Field &vout_4d) @@ -181,9 +181,9 @@ class A2AModesSchurDiagTwo action.ExportPhysicalFermionSolution(vout_5d, vout_4d); } - void high_mode_w(const Field &source_5d, const Field &source_4d, Field &wout_5d, Field &wout_4d) + void high_mode_w(const Field &w_source_5d, const Field &source_4d, Field &wout_5d, Field &wout_4d) { - wout_5d = source_5d; + wout_5d = w_source_5d; wout_4d = source_4d; } }; diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 5c6d9d01..863ee04c 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -130,6 +130,7 @@ void TA2AVectors::setup(void) auto &action = envGet(FMat, par().action); envTmpLat(FermionField, "ferm_src", Ls_); + envTmpLat(FermionField, "unphys_ferm", Ls_); envTmpLat(FermionField, "tmp"); envTmpLat(FermionField, "tmp2"); @@ -183,6 +184,7 @@ void TA2AVectors::execute(void) int Nsrc = par().sources.size(); envGetTmp(FermionField, ferm_src); + envGetTmp(FermionField, unphys_ferm); envGetTmp(FermionField, tmp); envGetTmp(FermionField, tmp2); @@ -205,6 +207,7 @@ void TA2AVectors::execute(void) { PropToFerm(tmp, prop_src, s, c); action.ImportPhysicalFermionSource(tmp, ferm_src); + action.ImportUnphysicalFermion(tmp, unphys_ferm); } } // source conversion for 5D sources @@ -218,10 +221,11 @@ void TA2AVectors::execute(void) { PropToFerm(ferm_src, prop_src, s, c); action.ExportPhysicalFermionSolution(ferm_src, tmp); + unphys_ferm = ferm_src; } } LOG(Message) << "a2areturn.high_modes Ncount = " << N_count << std::endl; - a2areturn.high_modes(ferm_src, tmp, N_count); + a2areturn.high_modes(ferm_src, unphys_ferm, tmp, N_count); N_count++; } } diff --git a/lib/qcd/action/fermion/CayleyFermion5D.cc b/lib/qcd/action/fermion/CayleyFermion5D.cc index 289e7aae..d4ed5a7c 100644 --- a/lib/qcd/action/fermion/CayleyFermion5D.cc +++ b/lib/qcd/action/fermion/CayleyFermion5D.cc @@ -79,6 +79,21 @@ void CayleyFermion5D::ExportPhysicalFermionSource(const FermionField &solu axpby_ssp_pminus(tmp, 1., tmp , 1., solution5d, 0, Ls-1); ExtractSlice(exported4d, tmp, 0, 0); } +template +void CayleyFermion5D::ImportUnphysicalFermion(const FermionField &input4d,FermionField &imported5d) +{ + int Ls = this->Ls; + FermionField tmp(this->FermionGrid()); + conformable(imported5d._grid,this->FermionGrid()); + conformable(input4d._grid ,this->GaugeGrid()); + tmp = zero; + InsertSlice(input4d, tmp, 0 , 0); + InsertSlice(input4d, tmp, Ls-1, 0); + axpby_ssp_pplus (tmp, 0., tmp, 1., tmp, 0, 0); + axpby_ssp_pminus(tmp, 0., tmp, 1., tmp, Ls-1, Ls-1); + imported5d=tmp; +} + template void CayleyFermion5D::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d) { diff --git a/lib/qcd/action/fermion/CayleyFermion5D.h b/lib/qcd/action/fermion/CayleyFermion5D.h index 897833c7..3bf2a8b6 100644 --- a/lib/qcd/action/fermion/CayleyFermion5D.h +++ b/lib/qcd/action/fermion/CayleyFermion5D.h @@ -91,6 +91,7 @@ namespace Grid { virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d); virtual void ExportPhysicalFermionSource(const FermionField &solution5d, FermionField &exported4d); virtual void ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d); + virtual void ImportUnphysicalFermion(const FermionField &solution5d, FermionField &exported4d); ///////////////////////////////////////////////////// // Instantiate different versions depending on Impl diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index bca6f4dc..dc1ab924 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -162,13 +162,17 @@ namespace Grid { { imported = input; }; + virtual void ImportUnphysicalFermion(const FermionField &input,FermionField &imported) + { + imported=input; + }; virtual void ExportPhysicalFermionSolution(const FermionField &solution,FermionField &exported) { exported=solution; }; - virtual void ExportPhysicalFermionSource(const FermionField &solution, FermionField &exported) + virtual void ExportPhysicalFermionSource(const FermionField &solution,FermionField &exported) { - exported = solution; + exported=solution; }; }; From 34e9d3f0ca8afe88866f27ddc512991e2958f7d4 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Sun, 22 Jul 2018 14:40:31 +0100 Subject: [PATCH 399/620] Moved the creation and resizing of the v and w high modes from the A2A class to the A2A module and made them an output of the module. This means that they have to be inputs of the contration modules and they will freed from memory if they are no longer needed. --- extras/Hadrons/AllToAllVectors.hpp | 24 ++++----------- .../Hadrons/Modules/MContraction/A2AMeson.hpp | 6 ++-- .../Modules/MContraction/MesonFieldGamma.hpp | 2 ++ extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 29 +++++++++++++++---- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index 7d9aa62e..df60b964 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -19,37 +19,25 @@ class A2AModesSchurDiagTwo const std::vector *eval; Matrix &action; Solver &solver; + std::vector w_high_5d, v_high_5d, w_high_4d, v_high_4d; const int Nl, Nh; const bool return_5d; - std::vector w_high_5d, v_high_5d, w_high_4d, v_high_4d; public: A2AModesSchurDiagTwo(const std::vector *_evec, const std::vector *_eval, Matrix &_action, Solver &_solver, + std::vector _w_high_5d, std::vector _v_high_5d, + std::vector _w_high_4d, std::vector _v_high_4d, const int _Nl, const int _Nh, const bool _return_5d) : evec(_evec), eval(_eval), action(_action), solver(_solver), + w_high_5d(_w_high_5d), v_high_5d(_v_high_5d), + w_high_4d(_w_high_4d), v_high_4d(_v_high_4d), Nl(_Nl), Nh(_Nh), - return_5d(_return_5d) - { - init_resize(1, Nh); - if (return_5d) init_resize(Nh, Nh); - }; - - void init_resize(const size_t size_5d, const size_t size_4d) - { - GridBase *grid_5d = action.Grid(); - GridBase *grid_4d = action.GaugeGrid(); - - w_high_5d.resize(size_5d, grid_5d); - v_high_5d.resize(size_5d, grid_5d); - - w_high_4d.resize(size_4d, grid_4d); - v_high_4d.resize(size_4d, grid_4d); - } + return_5d(_return_5d){}; void high_modes(Field &source_5d, Field &w_source_5d, Field &source_4d, int i) { diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp index f8d7f74c..a13336ef 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp @@ -77,9 +77,9 @@ TA2AMeson::TA2AMeson(const std::string name) template std::vector TA2AMeson::getInput(void) { - std::vector in = {par().A2A1, par().A2A2}; - in.push_back(par().A2A1 + "_class"); - in.push_back(par().A2A2 + "_class"); + std::vector in = {par().A2A1 + "_class", par().A2A2 + "_class"}; + in.push_back(par().A2A1 + "_w_high_4d"); + in.push_back(par().A2A2 + "_v_high_4d"); return in; } diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp index c7676904..6128534c 100644 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp +++ b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp @@ -82,6 +82,8 @@ template std::vector TMesonFieldGamma::getInput(void) { std::vector in = {par().A2A1 + "_class", par().A2A2 + "_class"}; + in.push_back(par().A2A1 + "_w_high_4d"); + in.push_back(par().A2A2 + "_v_high_4d"); return in; } diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 863ee04c..9481f268 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -107,7 +107,9 @@ std::vector TA2AVectors::getReference(void) template std::vector TA2AVectors::getOutput(void) { - std::vector out = {getName(), className_}; + std::vector out = {getName(), className_, + getName() + "_w_high_5d", getName() + "_v_high_5d", + getName() + "_w_high_4d", getName() + "_v_high_4d"}; return out; } @@ -120,17 +122,17 @@ void TA2AVectors::setup(void) int Nl = par().Nl; int Nh = N - Nl; bool return_5d = par().return_5d; - int Ls, Ls_; + int Ls; std::string sub_string = ""; if (Nl > 0) sub_string = "_subtract"; auto &solver = envGet(Solver, par().solver + sub_string); - Ls_ = env().getObjectLs(par().solver + sub_string); + Ls = env().getObjectLs(par().solver + sub_string); auto &action = envGet(FMat, par().action); - envTmpLat(FermionField, "ferm_src", Ls_); - envTmpLat(FermionField, "unphys_ferm", Ls_); + envTmpLat(FermionField, "ferm_src", Ls); + envTmpLat(FermionField, "unphys_ferm", Ls); envTmpLat(FermionField, "tmp"); envTmpLat(FermionField, "tmp2"); @@ -154,10 +156,25 @@ void TA2AVectors::setup(void) LOG(Message) << "Creating a2a vectors " << getName() << " using " << Nh << " high modes only." << std::endl; } - envCreate(A2ABase, className_, Ls_, + + int size_5d = 1; + if (return_5d) size_5d = Nh; + envCreate(std::vector, getName() + "_w_high_5d", Ls, size_5d, FermionField(env().getGrid(Ls))); + envCreate(std::vector, getName() + "_v_high_5d", Ls, size_5d, FermionField(env().getGrid(Ls))); + envCreate(std::vector, getName() + "_w_high_4d", 1, Nh, FermionField(env().getGrid(1))); + envCreate(std::vector, getName() + "_v_high_4d", 1, Nh, FermionField(env().getGrid(1))); + + auto &w_high_5d = envGet(std::vector, getName() + "_w_high_5d"); + auto &v_high_5d = envGet(std::vector, getName() + "_v_high_5d"); + auto &w_high_4d = envGet(std::vector, getName() + "_w_high_4d"); + auto &v_high_4d = envGet(std::vector, getName() + "_v_high_4d"); + + envCreate(A2ABase, className_, Ls, evec, eval, action, solver, + w_high_5d, v_high_5d, + w_high_4d, v_high_4d, Nl, Nh, return_5d); } From 24128ff109938b26784c9257449a306b072eb6f3 Mon Sep 17 00:00:00 2001 From: fionnoh Date: Mon, 23 Jul 2018 15:51:37 +0100 Subject: [PATCH 400/620] Changes needed for MF benchmark to work with comms correctly --- benchmarks/Benchmark_meson_field.cc | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/benchmarks/Benchmark_meson_field.cc b/benchmarks/Benchmark_meson_field.cc index 683dfd42..442768d5 100644 --- a/benchmarks/Benchmark_meson_field.cc +++ b/benchmarks/Benchmark_meson_field.cc @@ -66,7 +66,10 @@ void sliceInnerProductMesonField(std::vector< std::vector > &mat, // will locally sum vectors first // sum across these down to scalars // splitting the SIMD - std::vector > lvSum(rd*Lblock*Rblock); + std::vector > lvSum(rd*Lblock*Rblock); + for (int r = 0; r < rd * Lblock * Rblock; r++){ + lvSum[r] = zero; + } std::vector lsSum(ld*Lblock*Rblock,scalar_type(0.0)); int e1= grid->_slice_nblock[orthogdim]; @@ -140,11 +143,19 @@ void sliceInnerProductMesonField(std::vector< std::vector > &mat, } std::cout << GridLogMessage << " Entering non parallel loop "<_processor_coor[orthogdim]){ + int ij_dx = i + Lblock * j + Lblock * Rblock * lt; + mat[i+j*Lblock][t] = lsSum[ij_dx]; + } + else{ + mat[i+j*Lblock][t] = scalar_type(0.0); + } }} } std::cout << GridLogMessage << " Done "< Date: Thu, 26 Jul 2018 09:09:29 +0100 Subject: [PATCH 401/620] Updated meson field benchmark for dirac structures --- benchmarks/Benchmark_meson_field.cc | 383 ++++++++++++++++++++++++++-- 1 file changed, 368 insertions(+), 15 deletions(-) diff --git a/benchmarks/Benchmark_meson_field.cc b/benchmarks/Benchmark_meson_field.cc index 442768d5..aa2dbd0a 100644 --- a/benchmarks/Benchmark_meson_field.cc +++ b/benchmarks/Benchmark_meson_field.cc @@ -67,9 +67,10 @@ void sliceInnerProductMesonField(std::vector< std::vector > &mat, // sum across these down to scalars // splitting the SIMD std::vector > lvSum(rd*Lblock*Rblock); - for (int r = 0; r < rd * Lblock * Rblock; r++){ + parallel_for (int r = 0; r < rd * Lblock * Rblock; r++){ lvSum[r] = zero; } + std::vector lsSum(ld*Lblock*Rblock,scalar_type(0.0)); int e1= grid->_slice_nblock[orthogdim]; @@ -90,7 +91,6 @@ void sliceInnerProductMesonField(std::vector< std::vector > &mat, for(int j=0;j > &mat, + left()(3)(0) * right()(3)(0) + left()(3)(1) * right()(3)(1) + left()(3)(2) * right()(3)(2); -#else - vector_type vv = TensorRemove(innerProduct(left,right)); -#endif lvSum[idx]=lvSum[idx]+vv; } } @@ -163,6 +160,297 @@ void sliceInnerProductMesonField(std::vector< std::vector > &mat, return; } +template +void sliceInnerProductMesonFieldGamma(std::vector< std::vector > &mat, + const std::vector > &lhs, + const std::vector > &rhs, + int orthogdim, + std::vector gammas) +{ + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + int Lblock = lhs.size(); + int Rblock = rhs.size(); + + GridBase *grid = lhs[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + int Nt = grid->GlobalDimensions()[orthogdim]; + int Ngamma = gammas.size(); + // int Nmom = mom.size(); + + assert(mat.size()==Lblock*Rblock*Ngamma); + for(int t=0;t_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + int MFrvol = rd*Lblock*Rblock*Ngamma; + int MFlvol = ld*Lblock*Rblock*Ngamma; + int MFfvol = fd*Lblock*Rblock*Ngamma; + + std::vector > lvSum(MFrvol); + parallel_for (int r = 0; r < MFrvol; r++){ + lvSum[r] = zero; + } + + std::vector lsSum(MFlvol); + parallel_for (int r = 0; r < MFlvol; r++){ + lsSum[r]=scalar_type(0.0); + } + + int e1= grid->_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + std::cout << GridLogMessage << " Entering first parallel loop "<_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;n temp; + std::vector icoor(Nd); + std::vector > extracted(Nsimd); + + for(int i=0;iiCoorFromIindex(icoor,idx); + + int ldx =rt+icoor[orthogdim]*rd; + + int ij_ldx = mu+i*Ngamma+Ngamma*Lblock*j+Ngamma*Lblock*Rblock*ldx; + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]._internal; + + } + }}} + } + + std::cout << GridLogMessage << " Entering non parallel loop "<_processor_coor[orthogdim]){ + int ij_dx = i + Lblock * j + Lblock * Rblock * lt; + mat[i+j*Lblock][t] = lsSum[ij_dx]; + } + else{ + mat[i+j*Lblock][t] = scalar_type(0.0); + } + }} + } + std::cout << GridLogMessage << " Done "< +void sliceInnerProductMesonFieldGamma1(std::vector< std::vector > &mat, + const std::vector > &lhs, + const std::vector > &rhs, + int orthogdim, + std::vector gammas) +{ + + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + typedef iSpinMatrix SpinMatrix_v; + typedef iSpinMatrix SpinMatrix_s; + + int Lblock = lhs.size(); + int Rblock = rhs.size(); + + GridBase *grid = lhs[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + int Nt = grid->GlobalDimensions()[orthogdim]; + int Ngamma = gammas.size(); + + // int Nmom = mom.size(); + + assert(mat.size()==Lblock*Rblock*Ngamma); + for(int t=0;t_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + int MFrvol = rd*Lblock*Rblock; + int MFlvol = ld*Lblock*Rblock; + + int MFfvol = fd*Lblock*Rblock*Ngamma; // Do to dirac matrices here + + Vector lvSum(MFrvol); + parallel_for (int r = 0; r < MFrvol; r++){ + lvSum[r] = zero; + } + + Vector lsSum(MFlvol); + parallel_for (int r = 0; r < MFlvol; r++){ + lsSum[r]=scalar_type(0.0); + } + + int e1= grid->_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + std::cout << GridLogMessage << " Entering first parallel loop "<_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;n icoor(Nd); + std::vector extracted(Nsimd); + + for(int i=0;iiCoorFromIindex(icoor,idx); + + int ldx = rt+icoor[orthogdim]*rd; + + int ij_ldx = i+Lblock*j+Lblock*Rblock*ldx; + + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; + + } + }} + } + + std::cout << GridLogMessage << " Entering third parallel loop "<_processor_coor[orthogdim]){ + int ij_dx = i + Lblock * j + Lblock * Rblock * lt; + for(int mu=0;mu(std::vector< std::vector > &mat, const std::vector > &lhs, @@ -170,6 +458,31 @@ template void sliceInnerProductMesonField(std::vector< std::ve int orthogdim) ; */ +std::vector Gmu4 ( { + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT }); + +std::vector Gmu16 ( { + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT +}); + int main (int argc, char ** argv) { Grid_init(&argc,&argv); @@ -190,7 +503,7 @@ int main (int argc, char ** argv) pRNG.SeedFixedIntegers(seeds); - const int Nm = 32; // number of all modes (high + low) + int Nm = atoi(argv[1]); // number of all modes (high + low) std::vector v(Nm,&Grid); std::vector w(Nm,&Grid); @@ -205,13 +518,14 @@ int main (int argc, char ** argv) std::vector ip(nt); std::vector > MesonFields (Nm*Nm); + std::vector > MesonFields4 (Nm*Nm*4); + std::vector > MesonFields16 (Nm*Nm*16); std::vector > MesonFieldsRef(Nm*Nm); - for(int i=0;i Date: Thu, 26 Jul 2018 16:47:25 +0100 Subject: [PATCH 402/620] Hadrons: new exceptions which can save a integer --- extras/Hadrons/Exceptions.cc | 34 +++++++++++++++++++++------------- extras/Hadrons/Exceptions.hpp | 27 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/extras/Hadrons/Exceptions.cc b/extras/Hadrons/Exceptions.cc index e87181b2..1ff26afe 100644 --- a/extras/Hadrons/Exceptions.cc +++ b/extras/Hadrons/Exceptions.cc @@ -34,30 +34,38 @@ See the full license in the file "LICENSE" in the top level distribution directo #define ERR_SUFF " (" + loc + ")" #endif -#define CONST_EXC(name, init) \ +#define CTOR_EXC(name, init) \ name::name(std::string msg, std::string loc)\ :init\ {} +#define CTOR_EXC_REF(name, init) \ +name::name(std::string msg, std::string loc, const unsigned int address)\ +:init\ +{} + using namespace Grid; using namespace Hadrons; using namespace Exceptions; // logic errors -CONST_EXC(Logic, logic_error(msg + ERR_SUFF)) -CONST_EXC(Definition, Logic("definition error: " + msg, loc)) -CONST_EXC(Implementation, Logic("implementation error: " + msg, loc)) -CONST_EXC(Range, Logic("range error: " + msg, loc)) -CONST_EXC(Size, Logic("size error: " + msg, loc)) +CTOR_EXC(Logic, logic_error(msg + ERR_SUFF)) +CTOR_EXC(Definition, Logic("definition error: " + msg, loc)) +CTOR_EXC(Implementation, Logic("implementation error: " + msg, loc)) +CTOR_EXC(Range, Logic("range error: " + msg, loc)) +CTOR_EXC(Size, Logic("size error: " + msg, loc)) // runtime errors -CONST_EXC(Runtime, runtime_error(msg + ERR_SUFF)) -CONST_EXC(Argument, Runtime("argument error: " + msg, loc)) -CONST_EXC(Io, Runtime("IO error: " + msg, loc)) -CONST_EXC(Memory, Runtime("memory error: " + msg, loc)) -CONST_EXC(Parsing, Runtime("parsing error: " + msg, loc)) -CONST_EXC(Program, Runtime("program error: " + msg, loc)) -CONST_EXC(System, Runtime("system error: " + msg, loc)) +CTOR_EXC(Runtime, runtime_error(msg + ERR_SUFF)) +CTOR_EXC(Argument, Runtime("argument error: " + msg, loc)) +CTOR_EXC(Io, Runtime("IO error: " + msg, loc)) +CTOR_EXC(Memory, Runtime("memory error: " + msg, loc)) +CTOR_EXC(Parsing, Runtime("parsing error: " + msg, loc)) +CTOR_EXC(Program, Runtime("program error: " + msg, loc)) +CTOR_EXC(System, Runtime("system error: " + msg, loc)) + +// virtual machine errors +CTOR_EXC_REF(ObjectDefinition, RuntimeRef("object definition error: " + msg, loc, address)); // abort functions void Grid::Hadrons::Exceptions::abort(const std::exception& e) diff --git a/extras/Hadrons/Exceptions.hpp b/extras/Hadrons/Exceptions.hpp index 3eb1c25f..38bee8c1 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/extras/Hadrons/Exceptions.hpp @@ -39,6 +39,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #define HADRONS_ERROR(exc, msg)\ throw(Exceptions::exc(msg, HADRONS_SRC_LOC)); +#define HADRONS_ERROR_REF(exc, msg, address)\ +throw(Exceptions::exc(msg, HADRONS_SRC_LOC, address)); + #define DECL_EXC(name, base) \ class name: public base\ {\ @@ -46,6 +49,13 @@ public:\ name(std::string msg, std::string loc);\ } +#define DECL_EXC_REF(name, base) \ +class name: public base\ +{\ +public:\ + name(std::string msg, std::string loc, const unsigned int address);\ +} + BEGIN_HADRONS_NAMESPACE namespace Exceptions @@ -66,6 +76,23 @@ namespace Exceptions DECL_EXC(Program, Runtime); DECL_EXC(System, Runtime); + // virtual machine errors + class RuntimeRef: public Runtime + { + public: + RuntimeRef(std::string msg, std::string loc, const unsigned int address) + : Runtime(msg, loc), address_(address) + {} + unsigned int getAddress(void) const + { + return address_; + } + private: + unsigned int address_; + }; + + DECL_EXC_REF(ObjectDefinition, RuntimeRef); + // abort functions void abort(const std::exception& e); } From ef5452cddf33f1e36a049ac519fd30b2f7a799d9 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 26 Jul 2018 16:47:45 +0100 Subject: [PATCH 403/620] Hadrons: smarter memory profiler --- extras/Hadrons/Environment.cc | 5 +-- extras/Hadrons/Environment.hpp | 22 +++++++------ extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 2 +- extras/Hadrons/VirtualMachine.cc | 35 +++++++++------------ 4 files changed, 31 insertions(+), 33 deletions(-) diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index bb12a036..1b9ddb00 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -35,7 +35,7 @@ using namespace QCD; using namespace Hadrons; #define ERROR_NO_ADDRESS(address)\ -HADRONS_ERROR(Definition, "no object with address " + std::to_string(address)); +HADRONS_ERROR_REF(ObjectDefinition, "no object with address " + std::to_string(address), address); /****************************************************************************** * Environment implementation * @@ -220,7 +220,8 @@ void Environment::addObject(const std::string name, const int moduleAddress) } else { - HADRONS_ERROR(Definition, "object '" + name + "' already exists"); + HADRONS_ERROR_REF(ObjectDefinition, "object '" + name + "' already exists", + getObjectAddress(name)); } } diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index 13a7dfe6..af864c3d 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -245,7 +245,7 @@ void Environment::createDerivedObject(const std::string name, (object_[address].type != &typeid(B)) or (object_[address].derivedType != &typeid(T))) { - HADRONS_ERROR(Definition, "object '" + name + "' already allocated"); + HADRONS_ERROR_REF(ObjectDefinition, "object '" + name + "' already allocated", address); } } @@ -279,28 +279,31 @@ T * Environment::getDerivedObject(const unsigned int address) const } else { - HADRONS_ERROR(Definition, "object with address " + std::to_string(address) + + HADRONS_ERROR_REF(ObjectDefinition, "object with address " + + std::to_string(address) + " cannot be casted to '" + typeName(&typeid(T)) + - "' (has type '" + typeName(&typeid(h->get())) + "')"); + "' (has type '" + typeName(&typeid(h->get())) + "')", address); } } } else { - HADRONS_ERROR(Definition, "object with address " + std::to_string(address) + + HADRONS_ERROR_REF(ObjectDefinition, "object with address " + + std::to_string(address) + " does not have type '" + typeName(&typeid(B)) + - "' (has type '" + getObjectType(address) + "')"); + "' (has type '" + getObjectType(address) + "')", address); } } else { - HADRONS_ERROR(Definition, "object with address " + std::to_string(address) + - " is empty"); + HADRONS_ERROR_REF(ObjectDefinition, "object with address " + + std::to_string(address) + " is empty", address); } } else { - HADRONS_ERROR(Definition, "no object with address " + std::to_string(address)); + HADRONS_ERROR_REF(ObjectDefinition, "no object with address " + + std::to_string(address), address); } } @@ -338,7 +341,8 @@ bool Environment::isObjectOfType(const unsigned int address) const } else { - HADRONS_ERROR(Definition, "no object with address " + std::to_string(address)); + HADRONS_ERROR_REF(ObjectDefinition, "no object with address " + + std::to_string(address), address); } } diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 31be621f..e9b3f00d 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -158,7 +158,7 @@ void TRBPrecCG::setup(void) guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse, epack.evalCoarse)); } - catch (Exceptions::Definition &e) + catch (Exceptions::ObjectDefinition &) { auto &epack = envGet(EPack, par().eigenPack); diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index cc197ef8..d849ba34 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -123,10 +123,11 @@ void VirtualMachine::pushModule(VirtualMachine::ModPt &pt) else { // output already fully registered, error - HADRONS_ERROR(Definition, "object '" + out + HADRONS_ERROR_REF(ObjectDefinition, "object '" + out + "' is already produced by module '" + module_[env().getObjectModule(out)].name - + "' (while pushing module '" + name + "')"); + + "' (while pushing module '" + name + "')", + env().getObjectAddress(out)); } if (getModule(address)->getReference().size() > 0) { @@ -306,10 +307,10 @@ void VirtualMachine::makeModuleGraph(void) if (min < 0) { - HADRONS_ERROR(Definition, "dependency '" + HADRONS_ERROR_REF(ObjectDefinition, "dependency '" + env().getObjectName(in) + "' (address " + std::to_string(in) - + ") is not produced by any module"); + + ") is not produced by any module", in); } else { @@ -394,7 +395,7 @@ void VirtualMachine::makeMemoryProfile(void) if (profile_.module[a].empty()) { LOG(Debug) << "Profiling memory for module '" << module_[a].name - << "' (" << a << ")..." << std::endl; + << "' (" << a << ")" << std::endl; memoryProfile(a); env().freeAll(); } @@ -471,7 +472,7 @@ void VirtualMachine::memoryProfile(const unsigned int address) auto m = getModule(address); LOG(Debug) << "Setting up module '" << m->getName() - << "' (" << address << ")..." << std::endl; + << "' (" << address << ")" << std::endl; try { currentModule_ = address; @@ -479,25 +480,17 @@ void VirtualMachine::memoryProfile(const unsigned int address) currentModule_ = -1; updateProfile(address); } - catch (Exceptions::Definition &) + catch (Exceptions::ObjectDefinition &exc) { cleanEnvironment(); - for (auto &in: m->getInput()) + if (!env().hasCreatedObject(exc.getAddress())) { - if (!env().hasCreatedObject(in)) - { - memoryProfile(env().getObjectModule(in)); - } + LOG(Debug) << "Object '" << env().getObjectName(exc.getAddress()) + << "' missing for setup of '" << m->getName() + << "' (" << address << ")" << std::endl; + memoryProfile(env().getObjectModule(exc.getAddress())); } - for (auto &ref: m->getReference()) - { - if (!env().hasCreatedObject(ref)) - { - memoryProfile(env().getObjectModule(ref)); - } - } - m->setup(); - updateProfile(address); + memoryProfile(address); } } From bf71162b974851aea4c337e04832f367dbbbd0f4 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 26 Jul 2018 19:20:12 +0100 Subject: [PATCH 404/620] Hadrons: backtrace on abort --- extras/Hadrons/Exceptions.cc | 12 ++++++++++++ extras/Hadrons/Exceptions.hpp | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/extras/Hadrons/Exceptions.cc b/extras/Hadrons/Exceptions.cc index 1ff26afe..6d5a3dc2 100644 --- a/extras/Hadrons/Exceptions.cc +++ b/extras/Hadrons/Exceptions.cc @@ -48,6 +48,9 @@ using namespace Grid; using namespace Hadrons; using namespace Exceptions; +// backtrace cache +std::vector Grid::Hadrons::Exceptions::backtraceStr; + // logic errors CTOR_EXC(Logic, logic_error(msg + ERR_SUFF)) CTOR_EXC(Definition, Logic("definition error: " + msg, loc)) @@ -82,6 +85,15 @@ void Grid::Hadrons::Exceptions::abort(const std::exception& e) << std::endl; } LOG(Error) << e.what() << std::endl; + if (!backtraceStr.empty()) + { + LOG(Error) << "-- BACKTRACE --------------" << std::endl; + for (auto &s: backtraceStr) + { + LOG(Error) << s << std::endl; + } + LOG(Error) << "---------------------------" << std::endl; + } LOG(Error) << "Aborting program" << std::endl; Grid_finalize(); diff --git a/extras/Hadrons/Exceptions.hpp b/extras/Hadrons/Exceptions.hpp index 38bee8c1..6893ef03 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/extras/Hadrons/Exceptions.hpp @@ -30,16 +30,39 @@ See the full license in the file "LICENSE" in the top level distribution directo #define Hadrons_Exceptions_hpp_ #include +#include #ifndef Hadrons_Global_hpp_ #include #endif #define HADRONS_SRC_LOC std::string(__FUNCTION__) + " at " \ + std::string(__FILE__) + ":" + std::to_string(__LINE__) +#define HADRONS_BACKTRACE_MAX 128 +#ifdef HAVE_EXECINFO_H +#define HADRONS_CACHE_BACKTRACE \ +{\ + void* _callstack[HADRONS_BACKTRACE_MAX];\ + int _i, _frames = backtrace(_callstack, HADRONS_BACKTRACE_MAX);\ + char** _strs = backtrace_symbols(_callstack, _frames);\ + Grid::Hadrons::Exceptions::backtraceStr.clear();\ + for (_i = 0; _i < _frames; ++_i)\ + {\ + Hadrons::Exceptions::backtraceStr.push_back(std::string(_strs[_i]));\ + }\ + free(_strs);\ +} +#else +#define HADRONS_CACHE_BACKTRACE \ +Grid::Hadrons::Exceptions::backtraceStr.clear();\ +Grid::Hadrons::Exceptions::backtraceStr.push_back(""); +#endif + #define HADRONS_ERROR(exc, msg)\ +HADRONS_CACHE_BACKTRACE \ throw(Exceptions::exc(msg, HADRONS_SRC_LOC)); #define HADRONS_ERROR_REF(exc, msg, address)\ +HADRONS_CACHE_BACKTRACE \ throw(Exceptions::exc(msg, HADRONS_SRC_LOC, address)); #define DECL_EXC(name, base) \ @@ -60,6 +83,9 @@ BEGIN_HADRONS_NAMESPACE namespace Exceptions { + // backtrace cache + extern std::vector backtraceStr; + // logic errors DECL_EXC(Logic, std::logic_error); DECL_EXC(Definition, Logic); From 2679df034fd7f0ebe60b0b359390830c300b105d Mon Sep 17 00:00:00 2001 From: fionnoh Date: Fri, 27 Jul 2018 18:31:10 +0100 Subject: [PATCH 405/620] Changes to meson field benchmark. Now includes the gammas in the final part of the naive method, both methods compute lhs^dag*Gamma*rhs (previously Gamma*lhs^dag*rhs), and checks results. --- benchmarks/Benchmark_meson_field.cc | 87 +++++++++++++++++++---------- 1 file changed, 57 insertions(+), 30 deletions(-) diff --git a/benchmarks/Benchmark_meson_field.cc b/benchmarks/Benchmark_meson_field.cc index aa2dbd0a..566c32dc 100644 --- a/benchmarks/Benchmark_meson_field.cc +++ b/benchmarks/Benchmark_meson_field.cc @@ -223,13 +223,11 @@ void sliceInnerProductMesonFieldGamma(std::vector< std::vector > &mat, for(int b=0;b > &mat, int lt = t % ld; for(int i=0;i_processor_coor[orthogdim]){ - int ij_dx = i + Lblock * j + Lblock * Rblock * lt; - mat[i+j*Lblock][t] = lsSum[ij_dx]; + int ij_dx = mu+i*Ngamma+Ngamma*Lblock*j+Ngamma*Lblock*Rblock* lt; + mat[mu+i*Ngamma+j*Lblock*Ngamma][t] = lsSum[ij_dx]; } else{ - mat[i+j*Lblock][t] = scalar_type(0.0); + mat[mu+i*Ngamma+j*Lblock*Ngamma][t] = scalar_type(0.0); } - }} + }}} } std::cout << GridLogMessage << " Done "< > &mat auto right = rhs[j]._odata[ss]; for(int s1=0;s1 > &mat lvSum[idx]=lvSum[idx]+vv; } + } } } } - } std::cout << GridLogMessage << " Entering second parallel loop "< > &mat for(int j=0;j_processor_coor[orthogdim]){ int ij_dx = i + Lblock * j + Lblock * Rblock * lt; - for(int mu=0;mu Gmu4 ( { Gamma::Algebra::GammaT }); std::vector Gmu16 ( { - Gamma::Algebra::GammaX, - Gamma::Algebra::GammaY, - Gamma::Algebra::GammaZ, + Gamma::Algebra::Gamma5, Gamma::Algebra::GammaT, + Gamma::Algebra::GammaTGamma5, Gamma::Algebra::GammaX, + Gamma::Algebra::GammaXGamma5, Gamma::Algebra::GammaY, + Gamma::Algebra::GammaYGamma5, Gamma::Algebra::GammaZ, - Gamma::Algebra::GammaT, - Gamma::Algebra::GammaX, - Gamma::Algebra::GammaY, - Gamma::Algebra::GammaZ, - Gamma::Algebra::GammaT, - Gamma::Algebra::GammaX, - Gamma::Algebra::GammaY, - Gamma::Algebra::GammaZ, - Gamma::Algebra::GammaT + Gamma::Algebra::GammaZGamma5, + Gamma::Algebra::Identity, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaZT }); int main (int argc, char ** argv) @@ -507,6 +506,7 @@ int main (int argc, char ** argv) std::vector v(Nm,&Grid); std::vector w(Nm,&Grid); + std::vector gammaV(Nm,&Grid); for(int i=0;i > MesonFields (Nm*Nm); std::vector > MesonFields4 (Nm*Nm*4); std::vector > MesonFields16 (Nm*Nm*16); + std::vector > MesonFields161(Nm*Nm*16); std::vector > MesonFieldsRef(Nm*Nm); - for(int i=0;i Date: Fri, 27 Jul 2018 23:00:16 +0100 Subject: [PATCH 406/620] Momentum loop --- benchmarks/Benchmark_meson_field.cc | 183 ++++++++++++++++++++++++++-- 1 file changed, 176 insertions(+), 7 deletions(-) diff --git a/benchmarks/Benchmark_meson_field.cc b/benchmarks/Benchmark_meson_field.cc index aa2dbd0a..10a69525 100644 --- a/benchmarks/Benchmark_meson_field.cc +++ b/benchmarks/Benchmark_meson_field.cc @@ -180,7 +180,6 @@ void sliceInnerProductMesonFieldGamma(std::vector< std::vector > &mat, const int Nsimd = grid->Nsimd(); int Nt = grid->GlobalDimensions()[orthogdim]; int Ngamma = gammas.size(); - // int Nmom = mom.size(); assert(mat.size()==Lblock*Rblock*Ngamma); for(int t=0;t > &mat, // splitting the SIMD int MFrvol = rd*Lblock*Rblock*Ngamma; int MFlvol = ld*Lblock*Rblock*Ngamma; - int MFfvol = fd*Lblock*Rblock*Ngamma; std::vector > lvSum(MFrvol); parallel_for (int r = 0; r < MFrvol; r++){ @@ -330,8 +328,6 @@ void sliceInnerProductMesonFieldGamma1(std::vector< std::vector > &mat int Nt = grid->GlobalDimensions()[orthogdim]; int Ngamma = gammas.size(); - // int Nmom = mom.size(); - assert(mat.size()==Lblock*Rblock*Ngamma); for(int t=0;t > &mat int MFrvol = rd*Lblock*Rblock; int MFlvol = ld*Lblock*Rblock; - int MFfvol = fd*Lblock*Rblock*Ngamma; // Do to dirac matrices here - Vector lvSum(MFrvol); parallel_for (int r = 0; r < MFrvol; r++){ lvSum[r] = zero; @@ -450,6 +444,161 @@ void sliceInnerProductMesonFieldGamma1(std::vector< std::vector > &mat return; } +template +void sliceInnerProductMesonFieldGammaMom(std::vector< std::vector > &mat, + const std::vector > &lhs, + const std::vector > &rhs, + int orthogdim, + std::vector gammas, + const std::vector &mom) +{ + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + typedef iSpinMatrix SpinMatrix_v; + typedef iSpinMatrix SpinMatrix_s; + + int Lblock = lhs.size(); + int Rblock = rhs.size(); + + GridBase *grid = lhs[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + int Nt = grid->GlobalDimensions()[orthogdim]; + int Ngamma = gammas.size(); + int Nmom = mom.size(); + + assert(mat.size()==Lblock*Rblock*Ngamma*Nmom); + for(int t=0;t_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + int MFrvol = rd*Lblock*Rblock*Nmom; + int MFlvol = ld*Lblock*Rblock*Nmom; + + Vector lvSum(MFrvol); + parallel_for (int r = 0; r < MFrvol; r++){ + lvSum[r] = zero; + } + + Vector lsSum(MFlvol); + parallel_for (int r = 0; r < MFlvol; r++){ + lsSum[r]=scalar_type(0.0); + } + + int e1= grid->_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + std::cout << GridLogMessage << " Entering first parallel loop "<_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;n > phase(Nmom); + for(int m=0;m icoor(Nd); + std::vector extracted(Nsimd); + + + for(int i=0;iiCoorFromIindex(icoor,idx); + + int ldx = rt+icoor[orthogdim]*rd; + + int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; + + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; + + } + }}} + } + + std::cout << GridLogMessage << " Entering third parallel loop "<_processor_coor[orthogdim]){ + for(int m=0;m(std::vector< std::vector > &mat, @@ -491,7 +640,8 @@ int main (int argc, char ** argv) std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); - + + int Nmom=9; int nt = latt_size[Tp]; uint64_t vol = 1; for(int d=0;d v(Nm,&Grid); std::vector w(Nm,&Grid); + std::vector phases(Nmom,&Grid); for(int i=0;i > MesonFields (Nm*Nm); std::vector > MesonFields4 (Nm*Nm*4); std::vector > MesonFields16 (Nm*Nm*16); + std::vector > MesonFields16mom (Nm*Nm*16*Nmom); std::vector > MesonFieldsRef(Nm*Nm); for(int i=0;i Date: Sat, 28 Jul 2018 16:17:47 +0100 Subject: [PATCH 407/620] 7 moms --- benchmarks/Benchmark_meson_field.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/Benchmark_meson_field.cc b/benchmarks/Benchmark_meson_field.cc index 0a181ac1..9d7beeec 100644 --- a/benchmarks/Benchmark_meson_field.cc +++ b/benchmarks/Benchmark_meson_field.cc @@ -640,7 +640,7 @@ int main (int argc, char ** argv) std::vector mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); - int Nmom=9; + int Nmom=7; int nt = latt_size[Tp]; uint64_t vol = 1; for(int d=0;d Date: Sat, 28 Jul 2018 23:46:22 +0100 Subject: [PATCH 408/620] Optimising --- benchmarks/Benchmark_meson_field.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/benchmarks/Benchmark_meson_field.cc b/benchmarks/Benchmark_meson_field.cc index 9d7beeec..d007fc7b 100644 --- a/benchmarks/Benchmark_meson_field.cc +++ b/benchmarks/Benchmark_meson_field.cc @@ -507,8 +507,7 @@ void sliceInnerProductMesonFieldGammaMom(std::vector< std::vector > &m for(int n=0;n > phase(Nmom); - for(int m=0;m > &m }} // After getting the sitewise product do the mom phase loop + int base = Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*r; + // Trigger unroll for ( int m=0;m mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); - int Nmom=7; + const int Nmom=7; int nt = latt_size[Tp]; uint64_t vol = 1; for(int d=0;d Date: Mon, 30 Jul 2018 18:40:50 +0100 Subject: [PATCH 409/620] The basics of what is needed in Grid and Hadrons for the A2A class and module, with none of the contraction or MF code. --- extras/Hadrons/AllToAllVectors.hpp | 217 ++++++++++++++++ extras/Hadrons/Modules.hpp | 95 +++---- extras/Hadrons/Modules/MSolver/A2AVectors.cc | 8 + extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 235 ++++++++++++++++++ extras/Hadrons/modules.inc | 188 +++++++------- lib/algorithms/iterative/Deflation.h | 4 +- lib/algorithms/iterative/SchurRedBlack.h | 124 ++++++--- lib/qcd/action/fermion/CayleyFermion5D.cc | 27 ++ lib/qcd/action/fermion/CayleyFermion5D.h | 2 + lib/qcd/action/fermion/FermionOperator.h | 8 + 10 files changed, 739 insertions(+), 169 deletions(-) create mode 100644 extras/Hadrons/AllToAllVectors.hpp create mode 100644 extras/Hadrons/Modules/MSolver/A2AVectors.cc create mode 100644 extras/Hadrons/Modules/MSolver/A2AVectors.hpp diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp new file mode 100644 index 00000000..7d9aa62e --- /dev/null +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -0,0 +1,217 @@ +#ifndef A2A_Vectors_hpp_ +#define A2A_Vectors_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +//////////////////////////////// +// A2A Modes +//////////////////////////////// + +template +class A2AModesSchurDiagTwo +{ + private: + const std::vector *evec; + const std::vector *eval; + Matrix &action; + Solver &solver; + const int Nl, Nh; + const bool return_5d; + std::vector w_high_5d, v_high_5d, w_high_4d, v_high_4d; + + public: + A2AModesSchurDiagTwo(const std::vector *_evec, const std::vector *_eval, + Matrix &_action, + Solver &_solver, + const int _Nl, const int _Nh, + const bool _return_5d) + : evec(_evec), eval(_eval), + action(_action), + solver(_solver), + Nl(_Nl), Nh(_Nh), + return_5d(_return_5d) + { + init_resize(1, Nh); + if (return_5d) init_resize(Nh, Nh); + }; + + void init_resize(const size_t size_5d, const size_t size_4d) + { + GridBase *grid_5d = action.Grid(); + GridBase *grid_4d = action.GaugeGrid(); + + w_high_5d.resize(size_5d, grid_5d); + v_high_5d.resize(size_5d, grid_5d); + + w_high_4d.resize(size_4d, grid_4d); + v_high_4d.resize(size_4d, grid_4d); + } + + void high_modes(Field &source_5d, Field &w_source_5d, Field &source_4d, int i) + { + int i5d; + LOG(Message) << "A2A high modes for i = " << i << std::endl; + i5d = 0; + if (return_5d) i5d = i; + this->high_mode_v(action, solver, source_5d, v_high_5d[i5d], v_high_4d[i]); + this->high_mode_w(w_source_5d, source_4d, w_high_5d[i5d], w_high_4d[i]); + } + + void return_v(int i, Field &vout_5d, Field &vout_4d) + { + if (i < Nl) + { + this->low_mode_v(action, evec->at(i), eval->at(i), vout_5d, vout_4d); + } + else + { + vout_4d = v_high_4d[i - Nl]; + if (!(return_5d)) i = Nl; + vout_5d = v_high_5d[i - Nl]; + } + } + void return_w(int i, Field &wout_5d, Field &wout_4d) + { + if (i < Nl) + { + this->low_mode_w(action, evec->at(i), eval->at(i), wout_5d, wout_4d); + } + else + { + wout_4d = w_high_4d[i - Nl]; + if (!(return_5d)) i = Nl; + wout_5d = w_high_5d[i - Nl]; + } + } + + void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout_5d, Field &vout_4d) + { + GridBase *grid = action.RedBlackGrid(); + Field src_o(grid); + Field sol_e(grid); + Field sol_o(grid); + Field tmp(grid); + + src_o = evec; + src_o.checkerboard = Odd; + pickCheckerboard(Even, sol_e, vout_5d); + pickCheckerboard(Odd, sol_o, vout_5d); + + ///////////////////////////////////////////////////// + // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i + ///////////////////////////////////////////////////// + action.MooeeInv(src_o, tmp); + assert(tmp.checkerboard == Odd); + action.Meooe(tmp, sol_e); + assert(sol_e.checkerboard == Even); + action.MooeeInv(sol_e, tmp); + assert(tmp.checkerboard == Even); + sol_e = (-1.0 / eval) * tmp; + assert(sol_e.checkerboard == Even); + + ///////////////////////////////////////////////////// + // v_io = (1/eval_i) * MooInv evec_i + ///////////////////////////////////////////////////// + action.MooeeInv(src_o, tmp); + assert(tmp.checkerboard == Odd); + sol_o = (1.0 / eval) * tmp; + assert(sol_o.checkerboard == Odd); + + setCheckerboard(vout_5d, sol_e); + assert(sol_e.checkerboard == Even); + setCheckerboard(vout_5d, sol_o); + assert(sol_o.checkerboard == Odd); + + action.ExportPhysicalFermionSolution(vout_5d, vout_4d); + } + + void low_mode_w(Matrix &action, const Field &evec, const RealD &eval, Field &wout_5d, Field &wout_4d) + { + GridBase *grid = action.RedBlackGrid(); + SchurDiagTwoOperator _HermOpEO(action); + + Field src_o(grid); + Field sol_e(grid); + Field sol_o(grid); + Field tmp(grid); + + GridBase *fgrid = action.Grid(); + Field tmp_wout(fgrid); + + src_o = evec; + src_o.checkerboard = Odd; + pickCheckerboard(Even, sol_e, tmp_wout); + pickCheckerboard(Odd, sol_o, tmp_wout); + + ///////////////////////////////////////////////////// + // w_ie = - MeeInvDag MoeDag Doo evec_i + ///////////////////////////////////////////////////// + _HermOpEO.Mpc(src_o, tmp); + assert(tmp.checkerboard == Odd); + action.MeooeDag(tmp, sol_e); + assert(sol_e.checkerboard == Even); + action.MooeeInvDag(sol_e, tmp); + assert(tmp.checkerboard == Even); + sol_e = (-1.0) * tmp; + + ///////////////////////////////////////////////////// + // w_io = Doo evec_i + ///////////////////////////////////////////////////// + _HermOpEO.Mpc(src_o, sol_o); + assert(sol_o.checkerboard == Odd); + + setCheckerboard(tmp_wout, sol_e); + assert(sol_e.checkerboard == Even); + setCheckerboard(tmp_wout, sol_o); + assert(sol_o.checkerboard == Odd); + + action.DminusDag(tmp_wout, wout_5d); + + action.ExportPhysicalFermionSource(wout_5d, wout_4d); + } + + void high_mode_v(Matrix &action, Solver &solver, const Field &source, Field &vout_5d, Field &vout_4d) + { + GridBase *fgrid = action.Grid(); + solver(vout_5d, source); // Note: solver is solver(out, in) + action.ExportPhysicalFermionSolution(vout_5d, vout_4d); + } + + void high_mode_w(const Field &w_source_5d, const Field &source_4d, Field &wout_5d, Field &wout_4d) + { + wout_5d = w_source_5d; + wout_4d = source_4d; + } +}; + +// TODO: A2A for coarse eigenvectors + +// template +// class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo +// { +// private: +// const std::vector &subspace; +// const std::vector &evec_coarse; +// const std::vector &eval_coarse; +// Matrix &action; + +// public: +// A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) +// : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){}; + +// void operator()(int i, FineField &vout, FineField &wout) +// { +// FineField prom_evec(subspace[0]._grid); +// blockPromote(evec_coarse[i], prom_evec, subspace); +// this->low_mode_v(action, prom_evec, eval_coarse[i], vout); +// this->low_mode_w(action, prom_evec, eval_coarse[i], wout); +// } +// }; + +END_HADRONS_NAMESPACE + +#endif // A2A_Vectors_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 6bf5d3ed..06cd804a 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,57 +1,58 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include +#include #include #include -#include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include #include -#include #include +#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.cc b/extras/Hadrons/Modules/MSolver/A2AVectors.cc new file mode 100644 index 00000000..f72f405d --- /dev/null +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSolver; + +template class Grid::Hadrons::MSolver::TA2AVectors; +template class Grid::Hadrons::MSolver::TA2AVectors; diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp new file mode 100644 index 00000000..d7e4cfe4 --- /dev/null +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -0,0 +1,235 @@ +#ifndef Hadrons_MSolver_A2AVectors_hpp_ +#define Hadrons_MSolver_A2AVectors_hpp_ + +#include +#include +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * A2AVectors * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MSolver) + +class A2AVectorsPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AVectorsPar, + bool, return_5d, + int, Nl, + int, N, + std::vector, sources, + std::string, action, + std::string, eigenPack, + std::string, solver); +}; + +template +class TA2AVectors : public Module +{ + public: + FERM_TYPE_ALIASES(FImpl,); + SOLVER_TYPE_ALIASES(FImpl,); + + typedef FermionEigenPack EPack; + typedef CoarseFermionEigenPack CoarseEPack; + + typedef A2AModesSchurDiagTwo A2ABase; + + public: + // constructor + TA2AVectors(const std::string name); + // destructor + virtual ~TA2AVectors(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getReference(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); + + private: + unsigned int Ls_; + std::string className_; +}; + +MODULE_REGISTER_TMP(A2AVectors, ARG(TA2AVectors), MSolver); +MODULE_REGISTER_TMP(ZA2AVectors, ARG(TA2AVectors), MSolver); + +/****************************************************************************** + * TA2AVectors implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TA2AVectors::TA2AVectors(const std::string name) +: Module(name) +, className_ (name + "_class") +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TA2AVectors::getInput(void) +{ + int Nl = par().Nl; + std::string sub_string = ""; + if (Nl > 0) sub_string = "_subtract"; + std::vector in = {par().solver + sub_string}; + + int n = par().sources.size(); + + for (unsigned int t = 0; t < n; t += 1) + { + in.push_back(par().sources[t]); + } + + return in; +} + +template +std::vector TA2AVectors::getReference(void) +{ + std::vector ref = {par().action}; + + if (!par().eigenPack.empty()) + { + ref.push_back(par().eigenPack); + } + + return ref; +} + +template +std::vector TA2AVectors::getOutput(void) +{ + std::vector out = {getName(), className_}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TA2AVectors::setup(void) +{ + int N = par().N; + int Nl = par().Nl; + int Nh = N - Nl; + bool return_5d = par().return_5d; + int Ls; + + std::string sub_string = ""; + if (Nl > 0) sub_string = "_subtract"; + auto &solver = envGet(Solver, par().solver + sub_string); + Ls = env().getObjectLs(par().solver + sub_string); + + auto &action = envGet(FMat, par().action); + + envTmpLat(FermionField, "ferm_src", Ls); + envTmpLat(FermionField, "unphys_ferm", Ls); + envTmpLat(FermionField, "tmp"); + + std::vector *evec; + const std::vector *eval; + + if (Nl > 0) + { + // Low modes + auto &epack = envGet(EPack, par().eigenPack); + + LOG(Message) << "Creating a2a vectors " << getName() << + " using eigenpack '" << par().eigenPack << "' (" + << epack.evec.size() << " modes)" << + " and " << Nh << " high modes." << std::endl; + evec = &epack.evec; + eval = &epack.eval; + } + else + { + LOG(Message) << "Creating a2a vectors " << getName() << + " using " << Nh << " high modes only." << std::endl; + } + + envCreate(A2ABase, className_, Ls, + evec, eval, + action, + solver, + Nl, Nh, + return_5d); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AVectors::execute(void) +{ + auto &action = envGet(FMat, par().action); + + int Nt = env().getDim(Tp); + int Nc = FImpl::Dimension; + int Ls_; + int Nl = par().Nl; + + std::string sub_string = ""; + if (Nl > 0) sub_string = "_subtract"; + Ls_ = env().getObjectLs(par().solver + sub_string); + + auto &a2areturn = envGet(A2ABase, className_); + + // High modes + auto sources = par().sources; + int Nsrc = par().sources.size(); + + envGetTmp(FermionField, ferm_src); + envGetTmp(FermionField, unphys_ferm); + envGetTmp(FermionField, tmp); + + int N_count = 0; + for (unsigned int s = 0; s < Ns; ++s) + for (unsigned int c = 0; c < Nc; ++c) + for (unsigned int T = 0; T < Nsrc; T++) + { + auto &prop_src = envGet(PropagatorField, sources[T]); + LOG(Message) << "A2A src for s = " << s << " , c = " << c << ", T = " << T << std::endl; + // source conversion for 4D sources + if (!env().isObject5d(sources[T])) + { + if (Ls_ == 1) + { + PropToFerm(ferm_src, prop_src, s, c); + tmp = ferm_src; + } + else + { + PropToFerm(tmp, prop_src, s, c); + action.ImportPhysicalFermionSource(tmp, ferm_src); + action.ImportUnphysicalFermion(tmp, unphys_ferm); + } + } + // source conversion for 5D sources + else + { + if (Ls_ != env().getObjectLs(sources[T])) + { + HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); + } + else + { + PropToFerm(ferm_src, prop_src, s, c); + action.ExportPhysicalFermionSolution(ferm_src, tmp); + unphys_ferm = ferm_src; + } + } + LOG(Message) << "a2areturn.high_modes Ncount = " << N_count << std::endl; + a2areturn.high_modes(ferm_src, unphys_ferm, tmp, N_count); + N_count++; + } +} +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MSolver_A2AVectors_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 58b082d0..ca454086 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,115 +1,117 @@ modules_cc =\ - Modules/MContraction/WeakHamiltonianEye.cc \ - Modules/MContraction/Baryon.cc \ - Modules/MContraction/Meson.cc \ - Modules/MContraction/WeakNeutral4ptDisc.cc \ - Modules/MContraction/WeakHamiltonianNonEye.cc \ - Modules/MContraction/WardIdentity.cc \ - Modules/MContraction/DiscLoop.cc \ - Modules/MContraction/Gamma3pt.cc \ - Modules/MFermion/FreeProp.cc \ - Modules/MFermion/GaugeProp.cc \ - Modules/MSource/Point.cc \ - Modules/MSource/Wall.cc \ Modules/MSource/SeqConserved.cc \ Modules/MSource/SeqGamma.cc \ + Modules/MSource/Point.cc \ Modules/MSource/Z2.cc \ + Modules/MSource/Wall.cc \ Modules/MSink/Point.cc \ Modules/MSink/Smear.cc \ - Modules/MSolver/RBPrecCG.cc \ - Modules/MSolver/LocalCoherenceLanczos.cc \ - Modules/MGauge/StoutSmearing.cc \ - Modules/MGauge/Unit.cc \ - Modules/MGauge/UnitEm.cc \ - Modules/MGauge/StochEm.cc \ - Modules/MGauge/Random.cc \ - Modules/MGauge/FundtoHirep.cc \ - Modules/MUtilities/TestSeqGamma.cc \ - Modules/MUtilities/TestSeqConserved.cc \ - Modules/MLoop/NoiseLoop.cc \ - Modules/MScalar/FreeProp.cc \ - Modules/MScalar/VPCounterTerms.cc \ - Modules/MScalar/ChargedProp.cc \ - Modules/MScalar/ScalarVP.cc \ - Modules/MAction/Wilson.cc \ + Modules/MIO/LoadNersc.cc \ + Modules/MIO/LoadEigenPack.cc \ + Modules/MIO/LoadCoarseEigenPack.cc \ + Modules/MIO/LoadBinary.cc \ + Modules/MScalarSUN/TwoPointNPR.cc \ + Modules/MScalarSUN/TrPhi.cc \ + Modules/MScalarSUN/StochFreeField.cc \ + Modules/MScalarSUN/TrMag.cc \ + Modules/MScalarSUN/Div.cc \ + Modules/MScalarSUN/ShiftProbe.cc \ + Modules/MScalarSUN/Grad.cc \ + Modules/MScalarSUN/TwoPoint.cc \ + Modules/MScalarSUN/TimeMomProbe.cc \ + Modules/MScalarSUN/EMT.cc \ + Modules/MScalarSUN/TransProj.cc \ + Modules/MScalarSUN/TrKinetic.cc \ + Modules/MAction/DWF.cc \ Modules/MAction/MobiusDWF.cc \ Modules/MAction/ZMobiusDWF.cc \ - Modules/MAction/WilsonClover.cc \ - Modules/MAction/DWF.cc \ + Modules/MAction/Wilson.cc \ Modules/MAction/ScaledDWF.cc \ - Modules/MScalarSUN/TrPhi.cc \ - Modules/MScalarSUN/Grad.cc \ - Modules/MScalarSUN/TimeMomProbe.cc \ - Modules/MScalarSUN/TrMag.cc \ - Modules/MScalarSUN/TrKinetic.cc \ - Modules/MScalarSUN/EMT.cc \ - Modules/MScalarSUN/ShiftProbe.cc \ - Modules/MScalarSUN/TransProj.cc \ - Modules/MScalarSUN/StochFreeField.cc \ - Modules/MScalarSUN/TwoPoint.cc \ - Modules/MScalarSUN/TwoPointNPR.cc \ - Modules/MScalarSUN/Div.cc \ - Modules/MIO/LoadEigenPack.cc \ - Modules/MIO/LoadBinary.cc \ - Modules/MIO/LoadNersc.cc \ - Modules/MIO/LoadCoarseEigenPack.cc + Modules/MAction/WilsonClover.cc \ + Modules/MContraction/WeakHamiltonianNonEye.cc \ + Modules/MContraction/WardIdentity.cc \ + Modules/MContraction/WeakHamiltonianEye.cc \ + Modules/MContraction/DiscLoop.cc \ + Modules/MContraction/Baryon.cc \ + Modules/MContraction/Gamma3pt.cc \ + Modules/MContraction/WeakNeutral4ptDisc.cc \ + Modules/MContraction/Meson.cc \ + Modules/MScalar/VPCounterTerms.cc \ + Modules/MScalar/ChargedProp.cc \ + Modules/MScalar/FreeProp.cc \ + Modules/MScalar/ScalarVP.cc \ + Modules/MUtilities/TestSeqGamma.cc \ + Modules/MUtilities/TestSeqConserved.cc \ + Modules/MFermion/FreeProp.cc \ + Modules/MFermion/GaugeProp.cc \ + Modules/MSolver/RBPrecCG.cc \ + Modules/MSolver/LocalCoherenceLanczos.cc \ + Modules/MSolver/A2AVectors.cc \ + Modules/MLoop/NoiseLoop.cc \ + Modules/MGauge/Unit.cc \ + Modules/MGauge/Random.cc \ + Modules/MGauge/UnitEm.cc \ + Modules/MGauge/StochEm.cc \ + Modules/MGauge/FundtoHirep.cc \ + Modules/MGauge/StoutSmearing.cc modules_hpp =\ - Modules/MContraction/Baryon.hpp \ - Modules/MContraction/Meson.hpp \ - Modules/MContraction/WeakHamiltonian.hpp \ - Modules/MContraction/WeakHamiltonianNonEye.hpp \ - Modules/MContraction/DiscLoop.hpp \ - Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MContraction/Gamma3pt.hpp \ - Modules/MContraction/WardIdentity.hpp \ - Modules/MContraction/WeakHamiltonianEye.hpp \ - Modules/MFermion/FreeProp.hpp \ - Modules/MFermion/GaugeProp.hpp \ + Modules/MSource/SeqConserved.hpp \ Modules/MSource/SeqGamma.hpp \ + Modules/MSource/Z2.hpp \ Modules/MSource/Point.hpp \ Modules/MSource/Wall.hpp \ - Modules/MSource/Z2.hpp \ - Modules/MSource/SeqConserved.hpp \ Modules/MSink/Smear.hpp \ Modules/MSink/Point.hpp \ - Modules/MSolver/LocalCoherenceLanczos.hpp \ - Modules/MSolver/RBPrecCG.hpp \ - Modules/MGauge/UnitEm.hpp \ - Modules/MGauge/StoutSmearing.hpp \ - Modules/MGauge/Unit.hpp \ - Modules/MGauge/Random.hpp \ - Modules/MGauge/FundtoHirep.hpp \ - Modules/MGauge/StochEm.hpp \ - Modules/MUtilities/TestSeqGamma.hpp \ - Modules/MUtilities/TestSeqConserved.hpp \ - Modules/MLoop/NoiseLoop.hpp \ - Modules/MScalar/FreeProp.hpp \ - Modules/MScalar/VPCounterTerms.hpp \ - Modules/MScalar/ScalarVP.hpp \ - Modules/MScalar/Scalar.hpp \ - Modules/MScalar/ChargedProp.hpp \ - Modules/MAction/DWF.hpp \ - Modules/MAction/MobiusDWF.hpp \ - Modules/MAction/Wilson.hpp \ - Modules/MAction/WilsonClover.hpp \ - Modules/MAction/ZMobiusDWF.hpp \ - Modules/MAction/ScaledDWF.hpp \ - Modules/MScalarSUN/StochFreeField.hpp \ + Modules/MIO/LoadBinary.hpp \ + Modules/MIO/LoadEigenPack.hpp \ + Modules/MIO/LoadCoarseEigenPack.hpp \ + Modules/MIO/LoadNersc.hpp \ + Modules/MScalarSUN/Utils.hpp \ + Modules/MScalarSUN/Grad.hpp \ + Modules/MScalarSUN/TrPhi.hpp \ Modules/MScalarSUN/TwoPointNPR.hpp \ + Modules/MScalarSUN/TwoPoint.hpp \ + Modules/MScalarSUN/TransProj.hpp \ + Modules/MScalarSUN/TrKinetic.hpp \ + Modules/MScalarSUN/StochFreeField.hpp \ Modules/MScalarSUN/ShiftProbe.hpp \ - Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TimeMomProbe.hpp \ + Modules/MScalarSUN/Div.hpp \ Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/EMT.hpp \ - Modules/MScalarSUN/TwoPoint.hpp \ - Modules/MScalarSUN/TrPhi.hpp \ - Modules/MScalarSUN/Utils.hpp \ - Modules/MScalarSUN/TransProj.hpp \ - Modules/MScalarSUN/Grad.hpp \ - Modules/MScalarSUN/TrKinetic.hpp \ - Modules/MIO/LoadEigenPack.hpp \ - Modules/MIO/LoadNersc.hpp \ - Modules/MIO/LoadCoarseEigenPack.hpp \ - Modules/MIO/LoadBinary.hpp + Modules/MAction/ZMobiusDWF.hpp \ + Modules/MAction/ScaledDWF.hpp \ + Modules/MAction/Wilson.hpp \ + Modules/MAction/WilsonClover.hpp \ + Modules/MAction/MobiusDWF.hpp \ + Modules/MAction/DWF.hpp \ + Modules/MContraction/WeakHamiltonian.hpp \ + Modules/MContraction/DiscLoop.hpp \ + Modules/MContraction/Meson.hpp \ + Modules/MContraction/WardIdentity.hpp \ + Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MContraction/Gamma3pt.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/Baryon.hpp \ + Modules/MContraction/WeakNeutral4ptDisc.hpp \ + Modules/MScalar/ScalarVP.hpp \ + Modules/MScalar/Scalar.hpp \ + Modules/MScalar/FreeProp.hpp \ + Modules/MScalar/ChargedProp.hpp \ + Modules/MScalar/VPCounterTerms.hpp \ + Modules/MUtilities/TestSeqConserved.hpp \ + Modules/MUtilities/TestSeqGamma.hpp \ + Modules/MFermion/FreeProp.hpp \ + Modules/MFermion/GaugeProp.hpp \ + Modules/MSolver/A2AVectors.hpp \ + Modules/MSolver/RBPrecCG.hpp \ + Modules/MSolver/LocalCoherenceLanczos.hpp \ + Modules/MLoop/NoiseLoop.hpp \ + Modules/MGauge/StoutSmearing.hpp \ + Modules/MGauge/StochEm.hpp \ + Modules/MGauge/FundtoHirep.hpp \ + Modules/MGauge/Unit.hpp \ + Modules/MGauge/Random.hpp \ + Modules/MGauge/UnitEm.hpp diff --git a/lib/algorithms/iterative/Deflation.h b/lib/algorithms/iterative/Deflation.h index 316afe90..7c3e8e57 100644 --- a/lib/algorithms/iterative/Deflation.h +++ b/lib/algorithms/iterative/Deflation.h @@ -63,7 +63,7 @@ public: DeflatedGuesser(const std::vector & _evec,const std::vector & _eval) : evec(_evec), eval(_eval) {}; - virtual void operator()(const Field &src,Field &guess) { + virtual void operator()(const Field &src,Field &guess) { guess = zero; assert(evec.size()==eval.size()); auto N = evec.size(); @@ -71,6 +71,7 @@ public: const Field& tmp = evec[i]; axpy(guess,TensorRemove(innerProduct(tmp,src)) / eval[i],tmp,guess); } + guess.checkerboard = src.checkerboard; } }; @@ -101,6 +102,7 @@ public: axpy(guess_coarse,TensorRemove(innerProduct(tmp,src_coarse)) / eval_coarse[i],tmp,guess_coarse); } blockPromote(guess_coarse,guess,subspace); + guess.checkerboard = src.checkerboard; }; }; diff --git a/lib/algorithms/iterative/SchurRedBlack.h b/lib/algorithms/iterative/SchurRedBlack.h index 091330b2..5abc4d9f 100644 --- a/lib/algorithms/iterative/SchurRedBlack.h +++ b/lib/algorithms/iterative/SchurRedBlack.h @@ -95,16 +95,26 @@ namespace Grid { private: OperatorFunction & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackStaggeredSolve(OperatorFunction &HermitianRBSolver) : + SchurRedBlackStaggeredSolve(OperatorFunction &HermitianRBSolver, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { CBfactorise=0; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ @@ -150,9 +160,12 @@ namespace Grid { // Call the red-black solver ////////////////////////////////////////////////////////////// std::cout< using SchurRedBlackStagSolve = SchurRedBlackStaggeredSolve; @@ -184,15 +201,25 @@ namespace Grid { private: OperatorFunction & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackDiagMooeeSolve(OperatorFunction &HermitianRBSolver,int cb=0) : _HermitianRBSolver(HermitianRBSolver) + SchurRedBlackDiagMooeeSolve(OperatorFunction &HermitianRBSolver,int cb=0, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { CBfactorise=cb; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ ZeroGuesser guess; @@ -236,7 +263,10 @@ namespace Grid { ////////////////////////////////////////////////////////////// std::cout< & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackDiagTwoSolve(OperatorFunction &HermitianRBSolver) : + SchurRedBlackDiagTwoSolve(OperatorFunction &HermitianRBSolver, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { - CBfactorise=0; + CBfactorise = 0; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ @@ -322,8 +366,11 @@ namespace Grid { std::cout< & _HermitianRBSolver; int CBfactorise; + bool subGuess; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackDiagTwoMixed(LinearFunction &HermitianRBSolver) : + SchurRedBlackDiagTwoMixed(LinearFunction &HermitianRBSolver, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver) { CBfactorise=0; + subtractGuess(initSubGuess); }; + void subtractGuess(const bool initSubGuess) + { + subGuess = initSubGuess; + } + bool isSubtractGuess(void) + { + return subGuess; + } template void operator() (Matrix & _Matrix,const Field &in, Field &out){ @@ -408,7 +469,10 @@ namespace Grid { // _HermitianRBSolver(_HermOpEO,src_o,sol_o); assert(sol_o.checkerboard==Odd); // _HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd); guess(src_o,tmp); - _HermitianRBSolver(src_o,tmp); assert(tmp.checkerboard==Odd); + Mtmp = tmp; + _HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd); + // Fionn A2A boolean behavioural control + if (subGuess) tmp = tmp-Mtmp; _Matrix.MooeeInv(tmp,sol_o); assert( sol_o.checkerboard ==Odd); /////////////////////////////////////////////////// @@ -422,12 +486,16 @@ namespace Grid { setCheckerboard(out,sol_o); assert( sol_o.checkerboard ==Odd ); // Verify the unprec residual - _Matrix.M(out,resid); - resid = resid-in; - RealD ns = norm2(in); - RealD nr = norm2(resid); + if ( ! subGuess ) { + _Matrix.M(out,resid); + resid = resid-in; + RealD ns = norm2(in); + RealD nr = norm2(resid); - std::cout<::ExportPhysicalFermionSolution(const FermionField &so axpby_ssp_pplus (tmp, 1., tmp , 1., solution5d, 0, Ls-1); ExtractSlice(exported4d, tmp, 0, 0); } +template +void CayleyFermion5D::ExportPhysicalFermionSource(const FermionField &solution5d,FermionField &exported4d) +{ + int Ls = this->Ls; + FermionField tmp(this->FermionGrid()); + tmp = solution5d; + conformable(solution5d._grid,this->FermionGrid()); + conformable(exported4d._grid,this->GaugeGrid()); + axpby_ssp_pplus (tmp, 0., solution5d, 1., solution5d, 0, 0); + axpby_ssp_pminus(tmp, 1., tmp , 1., solution5d, 0, Ls-1); + ExtractSlice(exported4d, tmp, 0, 0); +} +template +void CayleyFermion5D::ImportUnphysicalFermion(const FermionField &input4d,FermionField &imported5d) +{ + int Ls = this->Ls; + FermionField tmp(this->FermionGrid()); + conformable(imported5d._grid,this->FermionGrid()); + conformable(input4d._grid ,this->GaugeGrid()); + tmp = zero; + InsertSlice(input4d, tmp, 0 , 0); + InsertSlice(input4d, tmp, Ls-1, 0); + axpby_ssp_pplus (tmp, 0., tmp, 1., tmp, 0, 0); + axpby_ssp_pminus(tmp, 0., tmp, 1., tmp, Ls-1, Ls-1); + imported5d=tmp; +} + template void CayleyFermion5D::ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d) { diff --git a/lib/qcd/action/fermion/CayleyFermion5D.h b/lib/qcd/action/fermion/CayleyFermion5D.h index b370b09d..3bf2a8b6 100644 --- a/lib/qcd/action/fermion/CayleyFermion5D.h +++ b/lib/qcd/action/fermion/CayleyFermion5D.h @@ -89,7 +89,9 @@ namespace Grid { virtual void Dminus(const FermionField &psi, FermionField &chi); virtual void DminusDag(const FermionField &psi, FermionField &chi); virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d); + virtual void ExportPhysicalFermionSource(const FermionField &solution5d, FermionField &exported4d); virtual void ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d); + virtual void ImportUnphysicalFermion(const FermionField &solution5d, FermionField &exported4d); ///////////////////////////////////////////////////// // Instantiate different versions depending on Impl diff --git a/lib/qcd/action/fermion/FermionOperator.h b/lib/qcd/action/fermion/FermionOperator.h index 77fdbec5..dc1ab924 100644 --- a/lib/qcd/action/fermion/FermionOperator.h +++ b/lib/qcd/action/fermion/FermionOperator.h @@ -162,10 +162,18 @@ namespace Grid { { imported = input; }; + virtual void ImportUnphysicalFermion(const FermionField &input,FermionField &imported) + { + imported=input; + }; virtual void ExportPhysicalFermionSolution(const FermionField &solution,FermionField &exported) { exported=solution; }; + virtual void ExportPhysicalFermionSource(const FermionField &solution,FermionField &exported) + { + exported=solution; + }; }; } From e3a309a73f37cadad41b031a13faae02a6f6b915 Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 31 Jul 2018 00:35:17 +0100 Subject: [PATCH 410/620] Eigen happiness --- bootstrap.sh | 2 +- configure.ac | 4 +- .../Hadrons/Modules/MContraction/A2AMeson.hpp | 2 +- .../Modules/MContraction/A2AMesonField.cc | 8 + .../Modules/MContraction/A2AMesonField.hpp | 375 ++++++++++++++++++ extras/Hadrons/modules.inc | 1 + lib/Grid_Eigen_Dense.h | 2 +- lib/Makefile.am | 2 +- lib/qcd/action/fermion/WilsonCloverFermion.cc | 2 +- scripts/update_eigen.sh | 45 ++- 10 files changed, 428 insertions(+), 15 deletions(-) create mode 100644 extras/Hadrons/Modules/MContraction/A2AMesonField.cc create mode 100644 extras/Hadrons/Modules/MContraction/A2AMesonField.hpp diff --git a/bootstrap.sh b/bootstrap.sh index bdf748df..12d257f1 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.3.tar.bz2' +EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.5.tar.bz2' echo "-- deploying Eigen source..." wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh `basename ${EIGEN_URL}` && rm `basename ${EIGEN_URL}` diff --git a/configure.ac b/configure.ac index 819253a0..1802033f 100644 --- a/configure.ac +++ b/configure.ac @@ -480,8 +480,8 @@ GRID_LIBS=$LIBS GRID_SHORT_SHA=`git rev-parse --short HEAD` GRID_SHA=`git rev-parse HEAD` GRID_BRANCH=`git rev-parse --abbrev-ref HEAD` -AM_CXXFLAGS="-I${abs_srcdir}/include $AM_CXXFLAGS" -AM_CFLAGS="-I${abs_srcdir}/include $AM_CFLAGS" +AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/EigenDist/ -I${abs_srcdir}/EigenDist/unsupported $AM_CXXFLAGS" +AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/EigenDist/ -I${abs_srcdir}/EigenDist/unsupported $AM_CFLAGS" AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS" AC_SUBST([AM_CFLAGS]) AC_SUBST([AM_CXXFLAGS]) diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp index a13336ef..2cfd6dcb 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp @@ -137,7 +137,7 @@ void TA2AMeson::execute(void) result.corr.resize(nt); int Nl = par().Nl; - int N = par().N; + int N = par().N; LOG(Message) << "N for A2A cont: " << N << std::endl; envGetTmp(std::vector, MF_x); diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc new file mode 100644 index 00000000..5867b1dd --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc @@ -0,0 +1,8 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MContraction; + +template class Grid::Hadrons::MContraction::TA2AMesonField; +template class Grid::Hadrons::MContraction::TA2AMesonField; diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp new file mode 100644 index 00000000..8ea7d9d7 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -0,0 +1,375 @@ +#ifndef Hadrons_MContraction_A2AMesonField_hpp_ +#define Hadrons_MContraction_A2AMesonField_hpp_ + +#include +#include +#include +#include + +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * A2AMesonField * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MContraction) + +typedef std::pair GammaPair; + + +class A2AMesonFieldPar : Serializable +{ + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar, + int, cacheBlock, + int, schurBlock, + int, N, + int, Nl, + std::string, A2A, + std::string, output); +}; + +template +class TA2AMesonField : public Module +{ + public: + FERM_TYPE_ALIASES(FImpl, ); + SOLVER_TYPE_ALIASES(FImpl, ); + + typedef A2AModesSchurDiagTwo A2ABase; + + public: + // constructor + TA2AMesonField(const std::string name); + // destructor + virtual ~TA2AMesonField(void){}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); + + // Arithmetic help. Move to Grid?? + virtual void MesonField(Eigen::Tensor &mat, + const std::vector &lhs, + const std::vector &rhs, + std::vector gammas, + const std::vector &mom, + int orthogdim) ; + +}; + +MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); +MODULE_REGISTER(ZA2AMesonField, ARG(TA2AMesonField), MContraction); + +/****************************************************************************** +* TA2AMesonField implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TA2AMesonField::TA2AMesonField(const std::string name) + : Module(name) +{ +} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TA2AMesonField::getInput(void) +{ + std::vector in = {par().A2A + "_class"}; + in.push_back(par().A2A + "_w_high_4d"); + in.push_back(par().A2A + "_v_high_4d"); + + return in; +} + +template +std::vector TA2AMesonField::getOutput(void) +{ + std::vector out = {}; + + return out; +} + + +// setup /////////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::setup(void) +{ + auto &a2a = envGet(A2ABase, par().A2A + "_class"); + int nt = env().getDim(Tp); + int Nl = par().Nl; + int N = par().N; + int Ls_ = env().getObjectLs(par().A2A + "_class"); + + // Four D fields + envTmp(std::vector, "w", 1, par().schurBlock, FermionField(env().getGrid(1))); + envTmp(std::vector, "v", 1, par().schurBlock, FermionField(env().getGrid(1))); + + // 5D tmp + envTmpLat(FermionField, "tmp_5d", Ls_); +} + + +////////////////////////////////////////////////////////////////////////////////// +// Cache blocked arithmetic routine +// Could move to Grid ??? +////////////////////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::MesonField(Eigen::Tensor &mat, + const std::vector &lhs, + const std::vector &rhs, + std::vector gammas, + const std::vector &mom, + int orthogdim) +{ + typedef typename FImpl::SiteSpinor vobj; + + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + typedef iSpinMatrix SpinMatrix_v; + typedef iSpinMatrix SpinMatrix_s; + + int Lblock = lhs.size(); + int Rblock = rhs.size(); + + GridBase *grid = lhs[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + + int Nt = grid->GlobalDimensions()[orthogdim]; + int Ngamma = gammas.size(); + int Nmom = mom.size(); + + int fd=grid->_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + int MFrvol = rd*Lblock*Rblock*Nmom; + int MFlvol = ld*Lblock*Rblock*Nmom; + + Vector lvSum(MFrvol); + parallel_for (int r = 0; r < MFrvol; r++){ + lvSum[r] = zero; + } + + Vector lsSum(MFlvol); + parallel_for (int r = 0; r < MFlvol; r++){ + lsSum[r]=scalar_type(0.0); + } + + int e1= grid->_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + std::cout << GridLogMessage << " Entering first parallel loop "<_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;n > phase(Nmom); + + for(int m=0;m icoor(Nd); + std::vector extracted(Nsimd); + + + for(int i=0;iiCoorFromIindex(icoor,idx); + + int ldx = rt+icoor[orthogdim]*rd; + + int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; + + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; + + } + }}} + } + + assert(mat.dimension(0) == Nt); + assert(mat.dimension(1) == Nmom); + assert(mat.dimension(2) == Ngamma); + assert(mat.dimension(3) == Lblock); + assert(mat.dimension(4) == Rblock); + mat.setZero(); + parallel_for(int t=0;t_processor_coor[orthogdim]){ + for(int i=0;iGlobalSumVector(&mat(0,0,0,0,0),Nmom*Rblock*Lblock*Nt*Ngamma); + + return; +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::execute(void) +{ + LOG(Message) << "Computing A2A meson field" << std::endl; + + auto &a2a = envGet(A2ABase, par().A2A + "_class"); + + // 2+6+4+4 = 16 gammas + // Ordering defined here + std::vector gammas ( { + Gamma::Algebra::Identity, + Gamma::Algebra::Gamma5, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaXGamma5, + Gamma::Algebra::GammaYGamma5, + Gamma::Algebra::GammaZGamma5, + Gamma::Algebra::GammaTGamma5, + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::SigmaZT + }); + + /////////////////////////////////////////////// + // Square assumption for now Nl = Nr = N + /////////////////////////////////////////////// + int nt = env().getDim(Tp); + int N = par().N; + int Nl = par().Nl; + int ngamma = gammas.size(); + + /////////////////////////////////////////////// + // Momentum setup + /////////////////////////////////////////////// + std::vector phases(1,env().getGrid(1)); + int nmom = phases.size(); + phases[0] = Complex(1.0); + + Eigen::Tensor mesonField (nmom,ngamma,nt,N,N); + + LOG(Message) << "N = Nh+Nl for A2A MesonField is " << N << std::endl; + + envGetTmp(std::vector, w); + envGetTmp(std::vector, v); + envGetTmp(FermionField, tmp_5d); + + LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; + + int schurBlock = par().schurBlock; + int cacheBlock = par().cacheBlock; + for(int i_base=0;i_base mesonFieldBlocked(nmom,ngamma,nt,N_i,N_j); + + MesonField(mesonFieldBlocked, w, v, gammas, phases,Tp); + + /////////////////////////////////////////////////////////////// + // Copy out to full meson field tensor + /////////////////////////////////////////////////////////////// + for(int ii =0;ii< N_i;ii++) { + for(int jj =0;jj< N_j;jj++) { + for(int m =0;m< nmom;m++) { + for(int g =0;g< ngamma;g++) { + for(int t =0;t< nt;t++) { + mesonField(m,g,t,i_base+ii,j_base+jj) = mesonFieldBlocked(m,g,t,ii,jj); + }}}}} + + LOG(Message) << "Contracted MesonFields " < +#include #if defined __GNUC__ #pragma GCC diagnostic pop #endif diff --git a/lib/Makefile.am b/lib/Makefile.am index dc33e7cf..6c94e2d6 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -34,4 +34,4 @@ HFILES += $(extra_headers) libGrid_a_SOURCES = $(CCFILES) libGrid_adir = $(pkgincludedir) -nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) Config.h +nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) $(eigen_unsupp_files) Config.h diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/lib/qcd/action/fermion/WilsonCloverFermion.cc index 3c082446..ed06c673 100644 --- a/lib/qcd/action/fermion/WilsonCloverFermion.cc +++ b/lib/qcd/action/fermion/WilsonCloverFermion.cc @@ -27,7 +27,7 @@ *************************************************************************************/ /* END LEGAL */ #include -#include +//#include #include namespace Grid diff --git a/scripts/update_eigen.sh b/scripts/update_eigen.sh index d1338e4d..442a2477 100755 --- a/scripts/update_eigen.sh +++ b/scripts/update_eigen.sh @@ -7,13 +7,42 @@ fi ARC=$1 INITDIR=`pwd` -rm -rf lib/Eigen -ARCDIR=`tar -tf ${ARC} | head -n1 | sed -e 's@/.*@@'` + +################## +#untar +################## + tar -xf ${ARC} -cd ${ARCDIR} -(tar -cf - Eigen --exclude='*.txt' 2>/dev/null) | tar -xf - -C ../lib/ -cd ../lib -echo 'eigen_files =\' > Eigen.inc -find Eigen -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> Eigen.inc +ARCDIR=`tar -tf ${ARC} | head -n1 | sed -e 's@/.*@@'` +rm -f ${ARC} + +############################### +# Link to a deterministic name +############################### + +mv ${ARCDIR} Eigen + +# Eigen source headers +cd ${INITDIR}/Eigen + +echo 'eigen_files =\' > ${INITDIR}/lib/Eigen.inc +find Eigen -name "*.h" -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc + cd ${INITDIR} -rm -rf ${ARCDIR} +echo 'eigen_unsupp_files =\' >> ${INITDIR}/lib/Eigen.inc +find Eigen/unsupported/Eigen -name "*.h" -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc + + + +################################### +# back to home +################################### +cd ${INITDIR} + +######################################### +# Make grid includes happy +######################################### +mkdir ${INITDIR}/lib/Eigen/ + +ln -s ${INITDIR}/Eigen/Eigen/* ${INITDIR}/lib/Eigen/ +ln -s ${INITDIR}/Eigen/unsupported ${INITDIR}/lib/Eigen/ From e036800261803d3c3adc9ba988f4f9fd7ab68543 Mon Sep 17 00:00:00 2001 From: paboyle Date: Tue, 31 Jul 2018 01:08:42 +0100 Subject: [PATCH 411/620] Eigen fix --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 1802033f..f5622e46 100644 --- a/configure.ac +++ b/configure.ac @@ -480,8 +480,8 @@ GRID_LIBS=$LIBS GRID_SHORT_SHA=`git rev-parse --short HEAD` GRID_SHA=`git rev-parse HEAD` GRID_BRANCH=`git rev-parse --abbrev-ref HEAD` -AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/EigenDist/ -I${abs_srcdir}/EigenDist/unsupported $AM_CXXFLAGS" -AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/EigenDist/ -I${abs_srcdir}/EigenDist/unsupported $AM_CFLAGS" +AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/Eigen/ -I${abs_srcdir}/Eigen/unsupported $AM_CXXFLAGS" +AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/Eigen/ -I${abs_srcdir}/Eigen/unsupported $AM_CFLAGS" AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS" AC_SUBST([AM_CFLAGS]) AC_SUBST([AM_CXXFLAGS]) From 891ad66eab29735c4400c0842e0b916dc1f5208c Mon Sep 17 00:00:00 2001 From: fionnoh Date: Tue, 31 Jul 2018 11:26:07 +0100 Subject: [PATCH 412/620] Included changes to Hadrons RBPrecCG solver needed for subtraction of guess --- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 25 ++++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index e9b3f00d..347371a3 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -118,7 +118,7 @@ std::vector TRBPrecCG::getReference(void) template std::vector TRBPrecCG::getOutput(void) { - std::vector out = {getName()}; + std::vector out = {getName(), getName() + "_subtract"}; return out; } @@ -158,7 +158,7 @@ void TRBPrecCG::setup(void) guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse, epack.evalCoarse)); } - catch (Exceptions::ObjectDefinition &) + catch (Exceptions::Definition &e) { auto &epack = envGet(EPack, par().eigenPack); @@ -168,19 +168,22 @@ void TRBPrecCG::setup(void) guesser.reset(new FineGuesser(epack.evec, epack.eval)); } } - auto solver = [&mat, guesser, this](FermionField &sol, - const FermionField &source) - { - ConjugateGradient cg(par().residual, - par().maxIteration); - HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); - - schurSolver(mat, source, sol, *guesser); + auto makeSolver = [&mat, guesser, this](bool subGuess) { + return [&mat, guesser, subGuess, this](FermionField &sol, + const FermionField &source) { + ConjugateGradient cg(par().residual, + par().maxIteration); + HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); + schurSolver.subtractGuess(subGuess); + schurSolver(mat, source, sol, *guesser); + }; }; + auto solver = makeSolver(false); envCreate(Solver, getName(), Ls, solver, mat); + auto solver_subtract = makeSolver(true); + envCreate(Solver, getName() + "_subtract", Ls, solver_subtract, mat); } - // execution /////////////////////////////////////////////////////////////////// template void TRBPrecCG::execute(void) From 142f7b0c8620d50e19b0778824ef3b569a6fd22c Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 31 Jul 2018 15:58:02 +0100 Subject: [PATCH 413/620] Updated the A2A Meson Field module --- extras/Hadrons/Modules.hpp | 97 ++++----- .../Modules/MContraction/A2AMesonField.hpp | 178 +++++++++++------ extras/Hadrons/modules.inc | 189 +++++++++--------- 3 files changed, 262 insertions(+), 202 deletions(-) diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 58e9fec3..bcf6c7c4 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,60 +1,61 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include #include +#include +#include +#include +#include #include #include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include #include +#include +#include #include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include -#include +#include diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 8ea7d9d7..8da5e9f9 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -24,6 +24,7 @@ class A2AMesonFieldPar : Serializable GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar, int, cacheBlock, int, schurBlock, + int, Nmom, int, N, int, Nl, std::string, A2A, @@ -54,8 +55,8 @@ class TA2AMesonField : public Module // Arithmetic help. Move to Grid?? virtual void MesonField(Eigen::Tensor &mat, - const std::vector &lhs, - const std::vector &rhs, + const LatticeFermion *lhs, + const LatticeFermion *rhs, std::vector gammas, const std::vector &mom, int orthogdim) ; @@ -120,8 +121,8 @@ void TA2AMesonField::setup(void) ////////////////////////////////////////////////////////////////////////////////// template void TA2AMesonField::MesonField(Eigen::Tensor &mat, - const std::vector &lhs, - const std::vector &rhs, + const LatticeFermion *lhs_wi, + const LatticeFermion *rhs_vj, std::vector gammas, const std::vector &mom, int orthogdim) @@ -135,10 +136,10 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, typedef iSpinMatrix SpinMatrix_v; typedef iSpinMatrix SpinMatrix_s; - int Lblock = lhs.size(); - int Rblock = rhs.size(); + int Lblock = mat.dimension(3); + int Rblock = mat.dimension(4); - GridBase *grid = lhs[0]._grid; + GridBase *grid = lhs_wi[0]._grid; const int Nd = grid->_ndimension; const int Nsimd = grid->Nsimd(); @@ -170,16 +171,14 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, int e1= grid->_slice_nblock[orthogdim]; int e2= grid->_slice_block [orthogdim]; int stride=grid->_slice_stride[orthogdim]; - - std::cout << GridLogMessage << " Entering first parallel loop "<_ostride[orthogdim]; // base offset for start of plane - for(int n=0;n_ostride[orthogdim]; // base offset for start of plane + int ss= so+n*stride+b; Vector > phase(Nmom); @@ -188,11 +187,11 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, for(int i=0;i::MesonField(Eigen::Tensor &mat, }} // After getting the sitewise product do the mom phase loop + int base = Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*r; for ( int m=0;m::MesonField(Eigen::Tensor &mat, std::vector icoor(Nd); std::vector extracted(Nsimd); - for(int i=0;i::MesonField(Eigen::Tensor &mat, }}} } - assert(mat.dimension(0) == Nt); - assert(mat.dimension(1) == Nmom); - assert(mat.dimension(2) == Ngamma); - assert(mat.dimension(3) == Lblock); - assert(mat.dimension(4) == Rblock); - mat.setZero(); - parallel_for(int t=0;t::MesonField(Eigen::Tensor &mat, for(int m=0;mGlobalSumVector(&mat(0,0,0,0,0),Nmom*Rblock*Lblock*Nt*Ngamma); - + grid->GlobalSumVector(&mat(0,0,0,0,0),Nmom*Ngamma*Nt*Lblock*Rblock); return; } @@ -280,8 +277,8 @@ void TA2AMesonField::execute(void) // 2+6+4+4 = 16 gammas // Ordering defined here std::vector gammas ( { - Gamma::Algebra::Identity, Gamma::Algebra::Gamma5, + Gamma::Algebra::Identity, Gamma::Algebra::GammaX, Gamma::Algebra::GammaY, Gamma::Algebra::GammaZ, @@ -306,15 +303,20 @@ void TA2AMesonField::execute(void) int Nl = par().Nl; int ngamma = gammas.size(); + int schurBlock = par().schurBlock; + int cacheBlock = par().cacheBlock; + int nmom = par().Nmom; + /////////////////////////////////////////////// // Momentum setup /////////////////////////////////////////////// - std::vector phases(1,env().getGrid(1)); - int nmom = phases.size(); - phases[0] = Complex(1.0); + GridBase *grid = env().getGrid(1); + std::vector phases(nmom,grid); + for(int m=0;m mesonField (nmom,ngamma,nt,N,N); - LOG(Message) << "N = Nh+Nl for A2A MesonField is " << N << std::endl; envGetTmp(std::vector, w); @@ -323,48 +325,104 @@ void TA2AMesonField::execute(void) LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; - int schurBlock = par().schurBlock; - int cacheBlock = par().cacheBlock; - for(int i_base=0;i_base mesonFieldBlocked(nmom,ngamma,nt,N_i,N_j); + for(int ii=0;ii mesonFieldBlocked(nmom,ngamma,nt,N_iii,N_jjj); - LOG(Message) << "Contracted MesonFields " < + ///////////////////////////////////////////////////////////////////////// + std::vector corr(nt,ComplexD(0.0)); + + for(int i=0;i Date: Wed, 1 Aug 2018 08:27:27 +0100 Subject: [PATCH 414/620] Optimised the MesonField a bit more --- .../Modules/MContraction/A2AMesonField.hpp | 129 ++++++++++++------ 1 file changed, 88 insertions(+), 41 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 8da5e9f9..aa386481 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -59,8 +59,11 @@ class TA2AMesonField : public Module const LatticeFermion *rhs, std::vector gammas, const std::vector &mom, - int orthogdim) ; - + int orthogdim, + double &t0, + double &t1, + double &t2, + double &t3); }; MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); @@ -121,11 +124,15 @@ void TA2AMesonField::setup(void) ////////////////////////////////////////////////////////////////////////////////// template void TA2AMesonField::MesonField(Eigen::Tensor &mat, - const LatticeFermion *lhs_wi, - const LatticeFermion *rhs_vj, - std::vector gammas, - const std::vector &mom, - int orthogdim) + const LatticeFermion *lhs_wi, + const LatticeFermion *rhs_vj, + std::vector gammas, + const std::vector &mom, + int orthogdim, + double &t0, + double &t1, + double &t2, + double &t3) { typedef typename FImpl::SiteSpinor vobj; @@ -172,31 +179,31 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, int e2= grid->_slice_block [orthogdim]; int stride=grid->_slice_stride[orthogdim]; + t0-=usecond(); // Nested parallelism would be ok + // Wasting cores here. Test case r parallel_for(int r=0;r_ostride[orthogdim]; // base offset for start of plane + for(int n=0;n_ostride[orthogdim]; // base offset for start of plane - int ss= so+n*stride+b; - Vector > phase(Nmom); - - for(int m=0;m::MesonField(Eigen::Tensor &mat, } } } + t0+=usecond(); + // Sum across simd lanes in the plane, breaking out orthog dir. + t1-=usecond(); parallel_for(int rt=0;rt icoor(Nd); @@ -240,30 +250,54 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, } }}} } + t1+=usecond(); assert(mat.dimension(0) == Nmom); assert(mat.dimension(1) == Ngamma); assert(mat.dimension(2) == Nt); - mat.setZero();// unthreaded alert - for(int t=0;t_processors[orthogdim]; + int pc = grid->_processor_coor[orthogdim]; + parallel_for_nest2(int lt=0;lt_processor_coor[orthogdim]){ - for(int i=0;iGlobalSumVector(&mat(0,0,0,0,0),Nmom*Ngamma*Nt*Lblock*Rblock); - return; + t3+=usecond(); } // execution /////////////////////////////////////////////////////////////////// @@ -299,6 +333,9 @@ void TA2AMesonField::execute(void) // Square assumption for now Nl = Nr = N /////////////////////////////////////////////// int nt = env().getDim(Tp); + int nx = env().getDim(Xp); + int ny = env().getDim(Yp); + int nz = env().getDim(Zp); int N = par().N; int Nl = par().Nl; int ngamma = gammas.size(); @@ -331,9 +368,17 @@ void TA2AMesonField::execute(void) // iii,jjj are loops within cacheBlock // Total index is sum of these i+ii+iii etc... ////////////////////////////////////////////////////////////////////////// - + + double flops = 0.0; + double bytes = 0.0; + double vol = nx*ny*nz*nt; double t_schur=0; double t_contr=0; + double t_int_0=0; + double t_int_1=0; + double t_int_2=0; + double t_int_3=0; + double t0 = usecond(); int N_i = N; int N_j = N; @@ -367,13 +412,18 @@ void TA2AMesonField::execute(void) Eigen::Tensor mesonFieldBlocked(nmom,ngamma,nt,N_iii,N_jjj); t_contr-=usecond(); - MesonField(mesonFieldBlocked, &w[ii], &v[jj], gammas, phases,Tp); + MesonField(mesonFieldBlocked, &w[ii], &v[jj], gammas, phases,Tp, + t_int_0,t_int_1,t_int_2,t_int_3); t_contr+=usecond(); + flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; + + bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; /////////////////////////////////////////////////////////////// // Copy back to full meson field tensor /////////////////////////////////////////////////////////////// - for(int iii=0;iii< N_iii;iii++) { + parallel_for_nest2(int iii=0;iii< N_iii;iii++) { for(int jjj=0;jjj< N_jjj;jjj++) { for(int m =0;m< nmom;m++) { for(int g =0;g< ngamma;g++) { @@ -386,22 +436,19 @@ void TA2AMesonField::execute(void) }} - /* - for(int i=0;iNodeCount(); double t1 = usecond(); LOG(Message) << " Contraction of MesonFields took "<<(t1-t0)/1.0e6<< " seconds " << std::endl; LOG(Message) << " Schur "<<(t_schur)/1.0e6<< " seconds " << std::endl; LOG(Message) << " Contr "<<(t_contr)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern0 "<<(t_int_0)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern1 "<<(t_int_1)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern2 "<<(t_int_2)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern3 "<<(t_int_3)/1.0e6<< " seconds " << std::endl; + double t_kernel = t_int_0 + t_int_1; + LOG(Message) << " Arith "< Date: Fri, 3 Aug 2018 15:15:54 +0100 Subject: [PATCH 415/620] Included Peter's A2AMeson field and Eigen changes --- extras/Hadrons/Makefile.am | 1 - .../Hadrons/Modules/MContraction/A2AMeson.cc | 8 - .../Hadrons/Modules/MContraction/A2AMeson.hpp | 207 -------------- .../Modules/MContraction/MesonFieldGamma.cc | 8 - .../Modules/MContraction/MesonFieldGamma.hpp | 269 ------------------ 5 files changed, 493 deletions(-) delete mode 100644 extras/Hadrons/Modules/MContraction/A2AMeson.cc delete mode 100644 extras/Hadrons/Modules/MContraction/A2AMeson.hpp delete mode 100644 extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc delete mode 100644 extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index abfcf9a8..7240be82 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -15,7 +15,6 @@ libHadrons_adir = $(pkgincludedir)/Hadrons nobase_libHadrons_a_HEADERS = \ $(modules_hpp) \ AllToAllVectors.hpp \ - AllToAllReduction.hpp \ Application.hpp \ EigenPack.hpp \ Environment.hpp \ diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.cc b/extras/Hadrons/Modules/MContraction/A2AMeson.cc deleted file mode 100644 index 5e5c122b..00000000 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.cc +++ /dev/null @@ -1,8 +0,0 @@ -#include - -using namespace Grid; -using namespace Hadrons; -using namespace MContraction; - -template class Grid::Hadrons::MContraction::TA2AMeson; -template class Grid::Hadrons::MContraction::TA2AMeson; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp b/extras/Hadrons/Modules/MContraction/A2AMeson.hpp deleted file mode 100644 index 2cfd6dcb..00000000 --- a/extras/Hadrons/Modules/MContraction/A2AMeson.hpp +++ /dev/null @@ -1,207 +0,0 @@ -#ifndef Hadrons_MContraction_A2AMeson_hpp_ -#define Hadrons_MContraction_A2AMeson_hpp_ - -#include -#include -#include -#include - -BEGIN_HADRONS_NAMESPACE - -/****************************************************************************** - * A2AMeson * - ******************************************************************************/ -BEGIN_MODULE_NAMESPACE(MContraction) - -typedef std::pair GammaPair; - -class A2AMesonPar : Serializable -{ - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonPar, - int, Nl, - int, N, - std::string, A2A1, - std::string, A2A2, - std::string, gammas, - std::string, output); -}; - -template -class TA2AMeson : public Module -{ - public: - FERM_TYPE_ALIASES(FImpl, ); - SOLVER_TYPE_ALIASES(FImpl, ); - - typedef A2AModesSchurDiagTwo A2ABase; - - class Result : Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - Gamma::Algebra, gamma_snk, - Gamma::Algebra, gamma_src, - std::vector, corr); - }; - - public: - // constructor - TA2AMeson(const std::string name); - // destructor - virtual ~TA2AMeson(void){}; - // dependency relation - virtual std::vector getInput(void); - virtual std::vector getOutput(void); - virtual void parseGammaString(std::vector &gammaList); - // setup - virtual void setup(void); - // execution - virtual void execute(void); -}; - -MODULE_REGISTER(A2AMeson, ARG(TA2AMeson), MContraction); -MODULE_REGISTER(ZA2AMeson, ARG(TA2AMeson), MContraction); - -/****************************************************************************** -* TA2AMeson implementation * -******************************************************************************/ -// constructor ///////////////////////////////////////////////////////////////// -template -TA2AMeson::TA2AMeson(const std::string name) - : Module(name) -{ -} - -// dependencies/products /////////////////////////////////////////////////////// -template -std::vector TA2AMeson::getInput(void) -{ - std::vector in = {par().A2A1 + "_class", par().A2A2 + "_class"}; - in.push_back(par().A2A1 + "_w_high_4d"); - in.push_back(par().A2A2 + "_v_high_4d"); - - return in; -} - -template -std::vector TA2AMeson::getOutput(void) -{ - std::vector out = {}; - - return out; -} - -template -void TA2AMeson::parseGammaString(std::vector &gammaList) -{ - gammaList.clear(); - // Parse individual contractions from input string. - gammaList = strToVec(par().gammas); -} - -// setup /////////////////////////////////////////////////////////////////////// -template -void TA2AMeson::setup(void) -{ - int nt = env().getDim(Tp); - int N = par().N; - - int Ls_ = env().getObjectLs(par().A2A1 + "_class"); - - envTmp(std::vector, "w1", 1, N, FermionField(env().getGrid(1))); - envTmp(std::vector, "v1", 1, N, FermionField(env().getGrid(1))); - envTmpLat(FermionField, "tmpv_5d", Ls_); - envTmpLat(FermionField, "tmpw_5d", Ls_); - - envTmp(std::vector, "MF_x", 1, nt); - envTmp(std::vector, "MF_y", 1, nt); - envTmp(std::vector, "tmp", 1, nt); -} - -// execution /////////////////////////////////////////////////////////////////// -template -void TA2AMeson::execute(void) -{ - LOG(Message) << "Computing A2A meson contractions" << std::endl; - - Result result; - Gamma g5(Gamma::Algebra::Gamma5); - std::vector gammaList; - int nt = env().getDim(Tp); - - parseGammaString(gammaList); - - result.gamma_snk = gammaList[0].first; - result.gamma_src = gammaList[0].second; - result.corr.resize(nt); - - int Nl = par().Nl; - int N = par().N; - LOG(Message) << "N for A2A cont: " << N << std::endl; - - envGetTmp(std::vector, MF_x); - envGetTmp(std::vector, MF_y); - envGetTmp(std::vector, tmp); - - for (unsigned int t = 0; t < nt; ++t) - { - tmp[t] = TensorRemove(MF_x[t] * MF_y[t] * 0.0); - } - - Gamma gSnk(gammaList[0].first); - Gamma gSrc(gammaList[0].second); - - auto &a2a1_fn = envGet(A2ABase, par().A2A1 + "_class"); - - envGetTmp(std::vector, w1); - envGetTmp(std::vector, v1); - envGetTmp(FermionField, tmpv_5d); - envGetTmp(FermionField, tmpw_5d); - - LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; - for (int i = 0; i < N; i++) - { - a2a1_fn.return_v(i, tmpv_5d, v1[i]); - a2a1_fn.return_w(i, tmpw_5d, w1[i]); - } - LOG(Message) << "Found v and w vectors for N = " << N << std::endl; - for (unsigned int i = 0; i < N; i++) - { - v1[i] = gSnk * v1[i]; - } - int ty; - for (unsigned int i = 0; i < N; i++) - { - for (unsigned int j = 0; j < N; j++) - { - mySliceInnerProductVector(MF_x, w1[i], v1[j], Tp); - mySliceInnerProductVector(MF_y, w1[j], v1[i], Tp); - for (unsigned int t = 0; t < nt; ++t) - { - for (unsigned int tx = 0; tx < nt; tx++) - { - ty = (tx + t) % nt; - tmp[t] += TensorRemove((MF_x[tx]) * (MF_y[ty])); - } - } - } - if (i % 10 == 0) - { - LOG(Message) << "MF for i = " << i << " of " << N << std::endl; - } - } - double NTinv = 1.0 / static_cast(nt); - for (unsigned int t = 0; t < nt; ++t) - { - result.corr[t] = NTinv * tmp[t]; - } - - saveResult(par().output, "meson", result); -} - -END_MODULE_NAMESPACE - -END_HADRONS_NAMESPACE - -#endif // Hadrons_MContraction_A2AMeson_hpp_ diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc deleted file mode 100644 index 9218d587..00000000 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.cc +++ /dev/null @@ -1,8 +0,0 @@ -#include - -using namespace Grid; -using namespace Hadrons; -using namespace MContraction; - -template class Grid::Hadrons::MContraction::TMesonFieldGamma; -template class Grid::Hadrons::MContraction::TMesonFieldGamma; \ No newline at end of file diff --git a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp b/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp deleted file mode 100644 index 6128534c..00000000 --- a/extras/Hadrons/Modules/MContraction/MesonFieldGamma.hpp +++ /dev/null @@ -1,269 +0,0 @@ -#ifndef Hadrons_MContraction_MesonFieldGamma_hpp_ -#define Hadrons_MContraction_MesonFieldGamma_hpp_ - -#include -#include -#include -#include -#include -#include -#include - -BEGIN_HADRONS_NAMESPACE - -/****************************************************************************** - * MesonFieldGamma * - ******************************************************************************/ -BEGIN_MODULE_NAMESPACE(MContraction) - -class MesonFieldPar : Serializable -{ - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(MesonFieldPar, - int, Nl, - int, N, - int, Nblock, - std::string, A2A1, - std::string, A2A2, - std::string, gammas, - std::string, output); -}; - -template -class TMesonFieldGamma : public Module -{ - public: - FERM_TYPE_ALIASES(FImpl, ); - SOLVER_TYPE_ALIASES(FImpl, ); - - typedef A2AModesSchurDiagTwo A2ABase; - - class Result : Serializable - { - public: - GRID_SERIALIZABLE_CLASS_MEMBERS(Result, - Gamma::Algebra, gamma, - std::vector>>, MesonField); - }; - - public: - // constructor - TMesonFieldGamma(const std::string name); - // destructor - virtual ~TMesonFieldGamma(void){}; - // dependency relation - virtual std::vector getInput(void); - virtual std::vector getOutput(void); - virtual void parseGammaString(std::vector &gammaList); - virtual void vectorOfWs(std::vector &w, int i, int Nblock, FermionField &tmpw_5d, std::vector &vec_w); - virtual void vectorOfVs(std::vector &v, int j, int Nblock, FermionField &tmpv_5d, std::vector &vec_v); - virtual void gammaMult(std::vector &v, Gamma gamma); - // setup - virtual void setup(void); - // execution - virtual void execute(void); -}; - -MODULE_REGISTER(MesonFieldGamma, ARG(TMesonFieldGamma), MContraction); -MODULE_REGISTER(ZMesonFieldGamma, ARG(TMesonFieldGamma), MContraction); - -/****************************************************************************** -* TMesonFieldGamma implementation * -******************************************************************************/ -// constructor ///////////////////////////////////////////////////////////////// -template -TMesonFieldGamma::TMesonFieldGamma(const std::string name) - : Module(name) -{ -} - -// dependencies/products /////////////////////////////////////////////////////// -template -std::vector TMesonFieldGamma::getInput(void) -{ - std::vector in = {par().A2A1 + "_class", par().A2A2 + "_class"}; - in.push_back(par().A2A1 + "_w_high_4d"); - in.push_back(par().A2A2 + "_v_high_4d"); - return in; -} - -template -std::vector TMesonFieldGamma::getOutput(void) -{ - std::vector out = {}; - - return out; -} - -template -void TMesonFieldGamma::parseGammaString(std::vector &gammaList) -{ - gammaList.clear(); - // Determine gamma matrices to insert at source/sink. - if (par().gammas.compare("all") == 0) - { - // Do all contractions. - for (unsigned int i = 1; i < Gamma::nGamma; i += 2) - { - gammaList.push_back(((Gamma::Algebra)i)); - } - } - else - { - // Parse individual contractions from input string. - gammaList = strToVec(par().gammas); - } -} - -template -void TMesonFieldGamma::vectorOfWs(std::vector &w, int i, int Nblock, FermionField &tmpw_5d, std::vector &vec_w) -{ - for (unsigned int ni = 0; ni < Nblock; ni++) - { - vec_w[ni] = w[i + ni]; - } -} - -template -void TMesonFieldGamma::vectorOfVs(std::vector &v, int j, int Nblock, FermionField &tmpv_5d, std::vector &vec_v) -{ - for (unsigned int nj = 0; nj < Nblock; nj++) - { - vec_v[nj] = v[j+nj]; - } -} - -template -void TMesonFieldGamma::gammaMult(std::vector &v, Gamma gamma) -{ - int Nblock = v.size(); - for (unsigned int nj = 0; nj < Nblock; nj++) - { - v[nj] = gamma * v[nj]; - } -} - -// setup /////////////////////////////////////////////////////////////////////// -template -void TMesonFieldGamma::setup(void) -{ - int nt = env().getDim(Tp); - int N = par().N; - int Nblock = par().Nblock; - - int Ls_ = env().getObjectLs(par().A2A1 + "_class"); - - envTmpLat(FermionField, "tmpv_5d", Ls_); - envTmpLat(FermionField, "tmpw_5d", Ls_); - - envTmp(std::vector, "w", 1, N, FermionField(env().getGrid(1))); - envTmp(std::vector, "v", 1, N, FermionField(env().getGrid(1))); - - envTmp(Eigen::MatrixXcd, "MF", 1, Eigen::MatrixXcd::Zero(nt, N * N)); - - envTmp(std::vector, "w_block", 1, Nblock, FermionField(env().getGrid(1))); - envTmp(std::vector, "v_block", 1, Nblock, FermionField(env().getGrid(1))); -} - -// execution /////////////////////////////////////////////////////////////////// -template -void TMesonFieldGamma::execute(void) -{ - LOG(Message) << "Computing A2A meson field for gamma = " << par().gammas << ", taking w from " << par().A2A1 << " and v from " << par().A2A2 << std::endl; - - int N = par().N; - int nt = env().getDim(Tp); - int Nblock = par().Nblock; - - std::vector result; - std::vector gammaResultList; - std::vector gammaList; - - parseGammaString(gammaResultList); - result.resize(gammaResultList.size()); - - Gamma g5(Gamma::Algebra::Gamma5); - gammaList.resize(gammaResultList.size(), g5); - - for (unsigned int i = 0; i < result.size(); ++i) - { - result[i].gamma = gammaResultList[i]; - result[i].MesonField.resize(N, std::vector>(N, std::vector(nt))); - - Gamma gamma(gammaResultList[i]); - gammaList[i] = gamma; - } - - auto &a2a1 = envGet(A2ABase, par().A2A1 + "_class"); - auto &a2a2 = envGet(A2ABase, par().A2A2 + "_class"); - - envGetTmp(FermionField, tmpv_5d); - envGetTmp(FermionField, tmpw_5d); - - envGetTmp(std::vector, v); - envGetTmp(std::vector, w); - LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; - for (int i = 0; i < N; i++) - { - a2a2.return_v(i, tmpv_5d, v[i]); - a2a1.return_w(i, tmpw_5d, w[i]); - } - LOG(Message) << "Found v and w vectors for N = " << N << std::endl; - - std::vector> MesonField_ij; - LOG(Message) << "Before blocked MFs, Nblock = " << Nblock << std::endl; - envGetTmp(std::vector, v_block); - envGetTmp(std::vector, w_block); - MesonField_ij.resize(Nblock * Nblock, std::vector(nt)); - - envGetTmp(Eigen::MatrixXcd, MF); - - LOG(Message) << "Before blocked MFs, Nblock = " << Nblock << std::endl; - for (unsigned int i = 0; i < N; i += Nblock) - { - vectorOfWs(w, i, Nblock, tmpw_5d, w_block); - for (unsigned int j = 0; j < N; j += Nblock) - { - vectorOfVs(v, j, Nblock, tmpv_5d, v_block); - for (unsigned int k = 0; k < result.size(); k++) - { - gammaMult(v_block, gammaList[k]); - sliceInnerProductMesonField(MesonField_ij, w_block, v_block, Tp); - for (unsigned int nj = 0; nj < Nblock; nj++) - { - for (unsigned int ni = 0; ni < Nblock; ni++) - { - MF.col((i + ni) + (j + nj) * N) = Eigen::VectorXcd::Map(&MesonField_ij[nj * Nblock + ni][0], MesonField_ij[nj * Nblock + ni].size()); - } - } - } - } - if (i % 10 == 0) - { - LOG(Message) << "MF for i = " << i << " of " << N << std::endl; - } - } - LOG(Message) << "Before Global sum, Nblock = " << Nblock << std::endl; - v_block[0]._grid->GlobalSumVector(MF.data(), MF.size()); - LOG(Message) << "After Global sum, Nblock = " << Nblock << std::endl; - for (unsigned int i = 0; i < N; i++) - { - for (unsigned int j = 0; j < N; j++) - { - for (unsigned int k = 0; k < result.size(); k++) - { - for (unsigned int t = 0; t < nt; t++) - { - result[k].MesonField[i][j][t] = MF.col(i + N * j)[t]; - } - } - } - } - saveResult(par().output, "meson", result); -} - -END_MODULE_NAMESPACE - -END_HADRONS_NAMESPACE - -#endif // Hadrons_MContraction_MesonFieldGm_hpp_ From 81347b4d1602b32bfafe9258237d3444e740aa1f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 3 Aug 2018 19:58:52 +0100 Subject: [PATCH 416/620] gitignore update --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 49295fc6..a633c0e9 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,7 @@ lib/version.h .vscode/ .vscode/settings.json settings.json + +# Eigen # +######### +Eigen From 584c921ca085feec69719fdc4b9d291cb9a42b53 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 3 Aug 2018 21:07:58 +0100 Subject: [PATCH 417/620] Eigen support fix (use of Grid as a library was broken) --- configure.ac | 4 +-- .../Modules/MContraction/A2AMesonField.hpp | 3 +-- lib/Grid_Eigen_Dense.h | 2 +- scripts/update_eigen.sh | 27 +++++-------------- 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/configure.ac b/configure.ac index f5622e46..496e6071 100644 --- a/configure.ac +++ b/configure.ac @@ -480,8 +480,8 @@ GRID_LIBS=$LIBS GRID_SHORT_SHA=`git rev-parse --short HEAD` GRID_SHA=`git rev-parse HEAD` GRID_BRANCH=`git rev-parse --abbrev-ref HEAD` -AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/Eigen/ -I${abs_srcdir}/Eigen/unsupported $AM_CXXFLAGS" -AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/Eigen/ -I${abs_srcdir}/Eigen/unsupported $AM_CFLAGS" +AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/include/Grid $AM_CXXFLAGS" +AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/include/Grid $AM_CFLAGS" AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS" AC_SUBST([AM_CFLAGS]) AC_SUBST([AM_CXXFLAGS]) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index aa386481..df203e6f 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -5,8 +5,7 @@ #include #include #include - -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/lib/Grid_Eigen_Dense.h b/lib/Grid_Eigen_Dense.h index 3e5ca1d1..4fb5b831 100644 --- a/lib/Grid_Eigen_Dense.h +++ b/lib/Grid_Eigen_Dense.h @@ -3,7 +3,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif -#include +#include #if defined __GNUC__ #pragma GCC diagnostic pop #endif diff --git a/scripts/update_eigen.sh b/scripts/update_eigen.sh index 442a2477..5ed59655 100755 --- a/scripts/update_eigen.sh +++ b/scripts/update_eigen.sh @@ -7,42 +7,29 @@ fi ARC=$1 INITDIR=`pwd` +rm -f lib/Eigen +rm -rf Eigen ################## #untar ################## - tar -xf ${ARC} ARCDIR=`tar -tf ${ARC} | head -n1 | sed -e 's@/.*@@'` -rm -f ${ARC} ############################### # Link to a deterministic name ############################### -mv ${ARCDIR} Eigen +mv ${ARCDIR} Eigen +ln -s ${INITDIR}/Eigen/Eigen ${INITDIR}/lib/Eigen +ln -s ${INITDIR}/Eigen/unsupported/Eigen ${INITDIR}/lib/Eigen/unsupported # Eigen source headers -cd ${INITDIR}/Eigen - +cd ${INITDIR}/lib echo 'eigen_files =\' > ${INITDIR}/lib/Eigen.inc -find Eigen -name "*.h" -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc - -cd ${INITDIR} -echo 'eigen_unsupp_files =\' >> ${INITDIR}/lib/Eigen.inc -find Eigen/unsupported/Eigen -name "*.h" -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc - - +find -L Eigen -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc ################################### # back to home ################################### cd ${INITDIR} - -######################################### -# Make grid includes happy -######################################### -mkdir ${INITDIR}/lib/Eigen/ - -ln -s ${INITDIR}/Eigen/Eigen/* ${INITDIR}/lib/Eigen/ -ln -s ${INITDIR}/Eigen/unsupported ${INITDIR}/lib/Eigen/ From 830168ec377e246bf5bcfe54a70d3e9dde8df5a1 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 4 Aug 2018 12:32:58 +0100 Subject: [PATCH 418/620] Hadrons: first try at diluted noise class (tested) --- extras/Hadrons/DilutedNoise.hpp | 157 ++++++++++++++ extras/Hadrons/Modules.hpp | 101 ++++----- .../MNoise/TimeDilutedSpinColorDiagonal.cc | 7 + .../MNoise/TimeDilutedSpinColorDiagonal.hpp | 83 +++++++ extras/Hadrons/modules.inc | 203 +++++++++--------- 5 files changed, 400 insertions(+), 151 deletions(-) create mode 100644 extras/Hadrons/DilutedNoise.hpp create mode 100644 extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc create mode 100644 extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp diff --git a/extras/Hadrons/DilutedNoise.hpp b/extras/Hadrons/DilutedNoise.hpp new file mode 100644 index 00000000..04bb2beb --- /dev/null +++ b/extras/Hadrons/DilutedNoise.hpp @@ -0,0 +1,157 @@ +#ifndef Hadrons_DilutedNoise_hpp_ +#define Hadrons_DilutedNoise_hpp_ + +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Abstract container for diluted noise * + ******************************************************************************/ +template +class DilutedNoise +{ +public: + typedef typename FImpl::FermionField FermionField; +public: + // constructor/destructor + DilutedNoise(GridCartesian *g); + DilutedNoise(GridCartesian *g, const unsigned int nNoise); + virtual ~DilutedNoise(void) = default; + // access + const FermionField & operator[](const unsigned int i) const; + FermionField & operator[](const unsigned int i); + void resize(const unsigned int nNoise); + unsigned int size(void) const; + unsigned int getNNoise(void) const; + GridCartesian *getGrid(void) const; + // generate noise (pure virtual) + virtual void generateNoise(GridParallelRNG &rng) = 0; +private: + std::vector noise_; + GridCartesian *grid_; + unsigned int nNoise_; +}; + +template +class TimeDilutedSpinColorDiagonalNoise: public DilutedNoise +{ +public: + typedef typename FImpl::FermionField FermionField; +public: + // constructor/destructor + TimeDilutedSpinColorDiagonalNoise(GridCartesian *g); + virtual ~TimeDilutedSpinColorDiagonalNoise(void) = default; + // generate noise + virtual void generateNoise(GridParallelRNG &rng); +private: + unsigned int nt_; +}; + +/****************************************************************************** + * DilutedNoise template implementation * + ******************************************************************************/ +template +DilutedNoise::DilutedNoise(GridCartesian *g) +: grid_(g) +{} + +template +DilutedNoise::DilutedNoise(GridCartesian *g, + const unsigned int nNoise) +: DilutedNoise(g) +{ + resize(nNoise); +} + +template +void DilutedNoise::resize(const unsigned int nNoise) +{ + nNoise_ = nNoise; + noise_.resize(nNoise, grid_); +} + +template +unsigned int DilutedNoise::size(void) const +{ + return noise_.size(); +} + +template +unsigned int DilutedNoise::getNNoise(void) const +{ + return nNoise_; +} + +template +GridCartesian * DilutedNoise::getGrid(void) const +{ + return grid_; +} + +template +const typename DilutedNoise::FermionField & +DilutedNoise::operator[](const unsigned int i) const +{ + return noise_[i]; +} + +template +typename DilutedNoise::FermionField & +DilutedNoise::operator[](const unsigned int i) +{ + return noise_[i]; +} + +/****************************************************************************** + * TimeDilutedSpinColorDiagonalNoise template implementation * + ******************************************************************************/ +template +TimeDilutedSpinColorDiagonalNoise:: +TimeDilutedSpinColorDiagonalNoise(GridCartesian *g) +: DilutedNoise(g) +{ + nt_ = this->getGrid()->GlobalDimensions().back(); + this->resize(nt_*Ns*FImpl::Dimension); +} + +template +void TimeDilutedSpinColorDiagonalNoise::generateNoise(GridParallelRNG &rng) +{ + typedef decltype(peekColour((*this)[0], 0)) SpinField; + + auto &noise = *this; + auto g = this->getGrid(); + auto nd = g->GlobalDimensions().size(); + auto nc = FImpl::Dimension; + Complex shift(1., 1.); + Lattice> tLat(g); + LatticeComplex eta(g), etaCut(g); + SpinField etas(g); + unsigned int i = 0; + + LatticeCoordinate(tLat, nd - 1); + bernoulli(rng, eta); + eta = (2.*eta - shift)*(1./::sqrt(2.)); + std::cout << eta << std::endl; + for (unsigned int t = 0; t < nt_; ++t) + { + etaCut = where((tLat == t), eta, 0.*eta); + for (unsigned int s = 0; s < Ns; ++s) + { + etas = zero; + pokeSpin(etas, etaCut, s); + for (unsigned int c = 0; c < nc; ++c) + { + noise[i] = zero; + pokeColour(noise[i], etas, c); + std::cout << noise[i] << std::endl; + i++; + } + } + } +} + +END_HADRONS_NAMESPACE + +#endif // Hadrons_DilutedNoise_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 500a0e72..aa8a3aa1 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,59 +1,60 @@ -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include #include -#include +#include +#include +#include #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include +#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc new file mode 100644 index 00000000..e02c359a --- /dev/null +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MNoise; + +template class Grid::Hadrons::MNoise::TTimeDilutedSpinColorDiagonal; diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp new file mode 100644 index 00000000..aba45e08 --- /dev/null +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -0,0 +1,83 @@ +#ifndef Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_ +#define Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Generate time diluted spin-color diagonal noise * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MNoise) + +template +class TTimeDilutedSpinColorDiagonal: public Module +{ +public: + // constructor + TTimeDilutedSpinColorDiagonal(const std::string name); + // destructor + virtual ~TTimeDilutedSpinColorDiagonal(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(TimeDilutedSpinColorDiagonal, TTimeDilutedSpinColorDiagonal, MNoise); + +/****************************************************************************** + * TTimeDilutedSpinColorDiagonal implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTimeDilutedSpinColorDiagonal::TTimeDilutedSpinColorDiagonal(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTimeDilutedSpinColorDiagonal::getInput(void) +{ + std::vector in; + + return in; +} + +template +std::vector TTimeDilutedSpinColorDiagonal::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTimeDilutedSpinColorDiagonal::setup(void) +{ + envCreateDerived(DilutedNoise, + TimeDilutedSpinColorDiagonalNoise, + getName(), 1, env().getGrid()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTimeDilutedSpinColorDiagonal::execute(void) +{ + auto &noise = envGet(DilutedNoise, getName()); + + noise.generateNoise(*env().get4dRng()); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 72585866..7933cb97 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,120 +1,121 @@ modules_cc =\ - Modules/MScalarSUN/ShiftProbe.cc \ - Modules/MScalarSUN/Grad.cc \ - Modules/MScalarSUN/TwoPointNPR.cc \ - Modules/MScalarSUN/Div.cc \ - Modules/MScalarSUN/TrMag.cc \ - Modules/MScalarSUN/TransProj.cc \ - Modules/MScalarSUN/TwoPoint.cc \ - Modules/MScalarSUN/TrKinetic.cc \ - Modules/MScalarSUN/TrPhi.cc \ - Modules/MScalarSUN/EMT.cc \ - Modules/MScalarSUN/TimeMomProbe.cc \ - Modules/MScalarSUN/StochFreeField.cc \ + Modules/MContraction/WeakHamiltonianEye.cc \ + Modules/MContraction/Baryon.cc \ + Modules/MContraction/Meson.cc \ + Modules/MContraction/WeakNeutral4ptDisc.cc \ + Modules/MContraction/WeakHamiltonianNonEye.cc \ + Modules/MContraction/WardIdentity.cc \ + Modules/MContraction/A2AMesonField.cc \ + Modules/MContraction/DiscLoop.cc \ + Modules/MContraction/Gamma3pt.cc \ + Modules/MFermion/FreeProp.cc \ + Modules/MFermion/GaugeProp.cc \ + Modules/MSource/Point.cc \ + Modules/MSource/Wall.cc \ + Modules/MSource/SeqConserved.cc \ + Modules/MSource/SeqGamma.cc \ + Modules/MSource/Z2.cc \ + Modules/MSink/Point.cc \ + Modules/MSink/Smear.cc \ + Modules/MSolver/A2AVectors.cc \ + Modules/MSolver/RBPrecCG.cc \ + Modules/MSolver/LocalCoherenceLanczos.cc \ + Modules/MGauge/StoutSmearing.cc \ + Modules/MGauge/Unit.cc \ + Modules/MGauge/UnitEm.cc \ + Modules/MGauge/StochEm.cc \ + Modules/MGauge/Random.cc \ + Modules/MGauge/FundtoHirep.cc \ + Modules/MNoise/TimeDilutedSpinColorDiagonal.cc \ + Modules/MUtilities/TestSeqGamma.cc \ + Modules/MUtilities/TestSeqConserved.cc \ + Modules/MLoop/NoiseLoop.cc \ Modules/MScalar/FreeProp.cc \ Modules/MScalar/VPCounterTerms.cc \ Modules/MScalar/ChargedProp.cc \ Modules/MScalar/ScalarVP.cc \ - Modules/MLoop/NoiseLoop.cc \ - Modules/MIO/LoadBinary.cc \ - Modules/MIO/LoadCoarseEigenPack.cc \ - Modules/MIO/LoadNersc.cc \ - Modules/MIO/LoadEigenPack.cc \ - Modules/MSink/Smear.cc \ - Modules/MSink/Point.cc \ - Modules/MFermion/FreeProp.cc \ - Modules/MFermion/GaugeProp.cc \ - Modules/MGauge/Random.cc \ - Modules/MGauge/StochEm.cc \ - Modules/MGauge/StoutSmearing.cc \ - Modules/MGauge/Unit.cc \ - Modules/MGauge/Random.cc \ - Modules/MGauge/UnitEm.cc \ - Modules/MGauge/FundtoHirep.cc \ - Modules/MUtilities/TestSeqGamma.cc \ - Modules/MUtilities/TestSeqConserved.cc \ - Modules/MSource/Z2.cc \ - Modules/MSource/Point.cc \ - Modules/MSource/SeqGamma.cc \ - Modules/MSource/Wall.cc \ - Modules/MSource/SeqConserved.cc \ - Modules/MContraction/Meson.cc \ - Modules/MContraction/WardIdentity.cc \ - Modules/MContraction/WeakHamiltonianNonEye.cc \ - Modules/MContraction/Baryon.cc \ - Modules/MContraction/DiscLoop.cc \ - Modules/MContraction/WeakHamiltonianEye.cc \ - Modules/MContraction/A2AMesonField.cc \ - Modules/MContraction/WeakNeutral4ptDisc.cc \ - Modules/MContraction/Gamma3pt.cc \ - Modules/MAction/MobiusDWF.cc \ - Modules/MAction/WilsonClover.cc \ Modules/MAction/Wilson.cc \ + Modules/MAction/MobiusDWF.cc \ + Modules/MAction/ZMobiusDWF.cc \ + Modules/MAction/WilsonClover.cc \ Modules/MAction/DWF.cc \ Modules/MAction/ScaledDWF.cc \ - Modules/MAction/ZMobiusDWF.cc \ - Modules/MSolver/A2AVectors.cc \ - Modules/MSolver/RBPrecCG.cc \ - Modules/MSolver/LocalCoherenceLanczos.cc + Modules/MScalarSUN/TrPhi.cc \ + Modules/MScalarSUN/Grad.cc \ + Modules/MScalarSUN/TimeMomProbe.cc \ + Modules/MScalarSUN/TrMag.cc \ + Modules/MScalarSUN/TrKinetic.cc \ + Modules/MScalarSUN/EMT.cc \ + Modules/MScalarSUN/ShiftProbe.cc \ + Modules/MScalarSUN/TransProj.cc \ + Modules/MScalarSUN/StochFreeField.cc \ + Modules/MScalarSUN/TwoPoint.cc \ + Modules/MScalarSUN/TwoPointNPR.cc \ + Modules/MScalarSUN/Div.cc \ + Modules/MIO/LoadEigenPack.cc \ + Modules/MIO/LoadBinary.cc \ + Modules/MIO/LoadNersc.cc \ + Modules/MIO/LoadCoarseEigenPack.cc modules_hpp =\ - Modules/MScalarSUN/TrKinetic.hpp \ - Modules/MScalarSUN/TimeMomProbe.hpp \ + Modules/MContraction/Baryon.hpp \ + Modules/MContraction/A2AMesonField.hpp \ + Modules/MContraction/Meson.hpp \ + Modules/MContraction/WeakHamiltonian.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ + Modules/MContraction/DiscLoop.hpp \ + Modules/MContraction/WeakNeutral4ptDisc.hpp \ + Modules/MContraction/Gamma3pt.hpp \ + Modules/MContraction/WardIdentity.hpp \ + Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MFermion/FreeProp.hpp \ + Modules/MFermion/GaugeProp.hpp \ + Modules/MSource/SeqGamma.hpp \ + Modules/MSource/Point.hpp \ + Modules/MSource/Wall.hpp \ + Modules/MSource/Z2.hpp \ + Modules/MSource/SeqConserved.hpp \ + Modules/MSink/Smear.hpp \ + Modules/MSink/Point.hpp \ + Modules/MSolver/LocalCoherenceLanczos.hpp \ + Modules/MSolver/RBPrecCG.hpp \ + Modules/MSolver/A2AVectors.hpp \ + Modules/MGauge/UnitEm.hpp \ + Modules/MGauge/StoutSmearing.hpp \ + Modules/MGauge/Unit.hpp \ + Modules/MGauge/Random.hpp \ + Modules/MGauge/FundtoHirep.hpp \ + Modules/MGauge/StochEm.hpp \ + Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp \ + Modules/MUtilities/TestSeqGamma.hpp \ + Modules/MUtilities/TestSeqConserved.hpp \ + Modules/MLoop/NoiseLoop.hpp \ + Modules/MScalar/FreeProp.hpp \ + Modules/MScalar/VPCounterTerms.hpp \ + Modules/MScalar/ScalarVP.hpp \ + Modules/MScalar/Scalar.hpp \ + Modules/MScalar/ChargedProp.hpp \ + Modules/MAction/DWF.hpp \ + Modules/MAction/MobiusDWF.hpp \ + Modules/MAction/Wilson.hpp \ + Modules/MAction/WilsonClover.hpp \ + Modules/MAction/ZMobiusDWF.hpp \ + Modules/MAction/ScaledDWF.hpp \ Modules/MScalarSUN/StochFreeField.hpp \ Modules/MScalarSUN/TwoPointNPR.hpp \ - Modules/MScalarSUN/Grad.hpp \ - Modules/MScalarSUN/TransProj.hpp \ - Modules/MScalarSUN/Div.hpp \ - Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/ShiftProbe.hpp \ - Modules/MScalarSUN/Utils.hpp \ + Modules/MScalarSUN/Div.hpp \ + Modules/MScalarSUN/TimeMomProbe.hpp \ + Modules/MScalarSUN/TrMag.hpp \ Modules/MScalarSUN/EMT.hpp \ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ - Modules/MScalar/FreeProp.hpp \ - Modules/MScalar/Scalar.hpp \ - Modules/MScalar/ScalarVP.hpp \ - Modules/MScalar/ChargedProp.hpp \ - Modules/MScalar/VPCounterTerms.hpp \ - Modules/MLoop/NoiseLoop.hpp \ + Modules/MScalarSUN/Utils.hpp \ + Modules/MScalarSUN/TransProj.hpp \ + Modules/MScalarSUN/Grad.hpp \ + Modules/MScalarSUN/TrKinetic.hpp \ Modules/MIO/LoadEigenPack.hpp \ - Modules/MIO/LoadCoarseEigenPack.hpp \ - Modules/MIO/LoadBinary.hpp \ Modules/MIO/LoadNersc.hpp \ - Modules/MSink/Smear.hpp \ - Modules/MSink/Point.hpp \ - Modules/MFermion/FreeProp.hpp \ - Modules/MFermion/GaugeProp.hpp \ - Modules/MGauge/FundtoHirep.hpp \ - Modules/MGauge/Random.hpp \ - Modules/MGauge/StoutSmearing.hpp \ - Modules/MGauge/Unit.hpp \ - Modules/MGauge/StochEm.hpp \ - Modules/MGauge/UnitEm.hpp \ - Modules/MUtilities/TestSeqGamma.hpp \ - Modules/MUtilities/TestSeqConserved.hpp \ - Modules/MSource/SeqConserved.hpp \ - Modules/MSource/Z2.hpp \ - Modules/MSource/Wall.hpp \ - Modules/MSource/SeqGamma.hpp \ - Modules/MSource/Point.hpp \ - Modules/MContraction/WeakHamiltonianEye.hpp \ - Modules/MContraction/Baryon.hpp \ - Modules/MContraction/Meson.hpp \ - Modules/MContraction/WeakHamiltonian.hpp \ - Modules/MContraction/WeakNeutral4ptDisc.hpp \ - Modules/MContraction/Gamma3pt.hpp \ - Modules/MContraction/DiscLoop.hpp \ - Modules/MContraction/WeakHamiltonianNonEye.hpp \ - Modules/MContraction/WardIdentity.hpp \ - Modules/MContraction/A2AMesonField.hpp \ - Modules/MAction/WilsonClover.hpp \ - Modules/MAction/ScaledDWF.hpp \ - Modules/MAction/MobiusDWF.hpp \ - Modules/MAction/Wilson.hpp \ - Modules/MAction/DWF.hpp \ - Modules/MAction/ZMobiusDWF.hpp \ - Modules/MSolver/RBPrecCG.hpp \ - Modules/MSolver/LocalCoherenceLanczos.hpp \ - Modules/MSolver/A2AVectors.hpp + Modules/MIO/LoadCoarseEigenPack.hpp \ + Modules/MIO/LoadBinary.hpp From 2962123cbaae155c4104d98cdf4856a858c659fb Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sun, 5 Aug 2018 01:44:37 +0100 Subject: [PATCH 419/620] Hadrons: diluted noise polish --- extras/Hadrons/DilutedNoise.hpp | 57 +++++++++++-------- .../MNoise/TimeDilutedSpinColorDiagonal.hpp | 2 +- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/extras/Hadrons/DilutedNoise.hpp b/extras/Hadrons/DilutedNoise.hpp index 04bb2beb..304b210d 100644 --- a/extras/Hadrons/DilutedNoise.hpp +++ b/extras/Hadrons/DilutedNoise.hpp @@ -19,14 +19,15 @@ public: DilutedNoise(GridCartesian *g, const unsigned int nNoise); virtual ~DilutedNoise(void) = default; // access - const FermionField & operator[](const unsigned int i) const; - FermionField & operator[](const unsigned int i); - void resize(const unsigned int nNoise); - unsigned int size(void) const; - unsigned int getNNoise(void) const; - GridCartesian *getGrid(void) const; + std::vector & getNoise(void); + const std::vector & getNoise(void) const; + const FermionField & operator[](const unsigned int i) const; + FermionField & operator[](const unsigned int i); + void resize(const unsigned int nNoise); + unsigned int size(void) const; + GridCartesian *getGrid(void) const; // generate noise (pure virtual) - virtual void generateNoise(GridParallelRNG &rng) = 0; + virtual void generateNoise(GridParallelRNG &rng) = 0; private: std::vector noise_; GridCartesian *grid_; @@ -65,28 +66,17 @@ DilutedNoise::DilutedNoise(GridCartesian *g, } template -void DilutedNoise::resize(const unsigned int nNoise) +std::vector::FermionField> & DilutedNoise:: +getNoise(void) { - nNoise_ = nNoise; - noise_.resize(nNoise, grid_); + return noise_; } template -unsigned int DilutedNoise::size(void) const -{ - return noise_.size(); -} - -template -unsigned int DilutedNoise::getNNoise(void) const +const std::vector::FermionField> & DilutedNoise:: +getNoise(void) const { - return nNoise_; -} - -template -GridCartesian * DilutedNoise::getGrid(void) const -{ - return grid_; + return noise_; } template @@ -103,6 +93,25 @@ DilutedNoise::operator[](const unsigned int i) return noise_[i]; } +template +void DilutedNoise::resize(const unsigned int nNoise) +{ + nNoise_ = nNoise; + noise_.resize(nNoise, grid_); +} + +template +unsigned int DilutedNoise::size(void) const +{ + return noise_.size(); +} + +template +GridCartesian * DilutedNoise::getGrid(void) const +{ + return grid_; +} + /****************************************************************************** * TimeDilutedSpinColorDiagonalNoise template implementation * ******************************************************************************/ diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp index aba45e08..1f6e89f9 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -33,7 +33,7 @@ public: MODULE_REGISTER_TMP(TimeDilutedSpinColorDiagonal, TTimeDilutedSpinColorDiagonal, MNoise); /****************************************************************************** - * TTimeDilutedSpinColorDiagonal implementation * + * TTimeDilutedSpinColorDiagonal implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template From d2650e89bd53aeafaf3422c9b224f49d4e6123c0 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 6 Aug 2018 12:11:00 +0100 Subject: [PATCH 420/620] Hadrons: VM exception for object type (solves infinite loop in scheduler) --- extras/Hadrons/Environment.hpp | 2 +- extras/Hadrons/Exceptions.cc | 1 + extras/Hadrons/Exceptions.hpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index af864c3d..1e3cc17f 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -288,7 +288,7 @@ T * Environment::getDerivedObject(const unsigned int address) const } else { - HADRONS_ERROR_REF(ObjectDefinition, "object with address " + + HADRONS_ERROR_REF(ObjectType, "object with address " + std::to_string(address) + " does not have type '" + typeName(&typeid(B)) + "' (has type '" + getObjectType(address) + "')", address); diff --git a/extras/Hadrons/Exceptions.cc b/extras/Hadrons/Exceptions.cc index 6d5a3dc2..c44f4cd0 100644 --- a/extras/Hadrons/Exceptions.cc +++ b/extras/Hadrons/Exceptions.cc @@ -69,6 +69,7 @@ CTOR_EXC(System, Runtime("system error: " + msg, loc)) // virtual machine errors CTOR_EXC_REF(ObjectDefinition, RuntimeRef("object definition error: " + msg, loc, address)); +CTOR_EXC_REF(ObjectType, RuntimeRef("object type error: " + msg, loc, address)); // abort functions void Grid::Hadrons::Exceptions::abort(const std::exception& e) diff --git a/extras/Hadrons/Exceptions.hpp b/extras/Hadrons/Exceptions.hpp index 6893ef03..e6a7aea8 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/extras/Hadrons/Exceptions.hpp @@ -118,6 +118,7 @@ namespace Exceptions }; DECL_EXC_REF(ObjectDefinition, RuntimeRef); + DECL_EXC_REF(ObjectType, RuntimeRef); // abort functions void abort(const std::exception& e); From 3f0f92cda6cdc213e5bb39f981774d96e505cc8e Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 6 Aug 2018 12:11:52 +0100 Subject: [PATCH 421/620] Hadrons: first cleaning/integration of A2A/meson fields --- extras/Hadrons/AllToAllVectors.hpp | 10 ++ extras/Hadrons/DilutedNoise.hpp | 2 - .../Modules/MContraction/A2AMesonField.hpp | 29 ++-- .../MNoise/TimeDilutedSpinColorDiagonal.cc | 1 + .../MNoise/TimeDilutedSpinColorDiagonal.hpp | 1 + extras/Hadrons/Modules/MSolver/A2AVectors.cc | 4 +- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 155 +++++++----------- 7 files changed, 89 insertions(+), 113 deletions(-) diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp index 7d9aa62e..b21b6862 100644 --- a/extras/Hadrons/AllToAllVectors.hpp +++ b/extras/Hadrons/AllToAllVectors.hpp @@ -51,6 +51,16 @@ class A2AModesSchurDiagTwo v_high_4d.resize(size_4d, grid_4d); } + int get_Nh(void) const + { + return Nh; + } + + int get_Nl(void) const + { + return Nl; + } + void high_modes(Field &source_5d, Field &w_source_5d, Field &source_4d, int i) { int i5d; diff --git a/extras/Hadrons/DilutedNoise.hpp b/extras/Hadrons/DilutedNoise.hpp index 304b210d..a284d46b 100644 --- a/extras/Hadrons/DilutedNoise.hpp +++ b/extras/Hadrons/DilutedNoise.hpp @@ -142,7 +142,6 @@ void TimeDilutedSpinColorDiagonalNoise::generateNoise(GridParallelRNG &rn LatticeCoordinate(tLat, nd - 1); bernoulli(rng, eta); eta = (2.*eta - shift)*(1./::sqrt(2.)); - std::cout << eta << std::endl; for (unsigned int t = 0; t < nt_; ++t) { etaCut = where((tLat == t), eta, 0.*eta); @@ -154,7 +153,6 @@ void TimeDilutedSpinColorDiagonalNoise::generateNoise(GridParallelRNG &rn { noise[i] = zero; pokeColour(noise[i], etas, c); - std::cout << noise[i] << std::endl; i++; } } diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index df203e6f..9a09c0b6 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -24,8 +24,6 @@ class A2AMesonFieldPar : Serializable int, cacheBlock, int, schurBlock, int, Nmom, - int, N, - int, Nl, std::string, A2A, std::string, output); }; @@ -82,9 +80,7 @@ TA2AMesonField::TA2AMesonField(const std::string name) template std::vector TA2AMesonField::getInput(void) { - std::vector in = {par().A2A + "_class"}; - in.push_back(par().A2A + "_w_high_4d"); - in.push_back(par().A2A + "_v_high_4d"); + std::vector in = {par().A2A}; return in; } @@ -102,18 +98,17 @@ std::vector TA2AMesonField::getOutput(void) template void TA2AMesonField::setup(void) { - auto &a2a = envGet(A2ABase, par().A2A + "_class"); - int nt = env().getDim(Tp); - int Nl = par().Nl; - int N = par().N; - int Ls_ = env().getObjectLs(par().A2A + "_class"); + auto &a2a = envGet(A2ABase, par().A2A); + int Ls = env().getObjectLs(par().A2A); // Four D fields - envTmp(std::vector, "w", 1, par().schurBlock, FermionField(env().getGrid(1))); - envTmp(std::vector, "v", 1, par().schurBlock, FermionField(env().getGrid(1))); + envTmp(std::vector, "w", 1, par().schurBlock, + FermionField(env().getGrid())); + envTmp(std::vector, "v", 1, par().schurBlock, + FermionField(env().getGrid())); // 5D tmp - envTmpLat(FermionField, "tmp_5d", Ls_); + envTmpLat(FermionField, "tmp_5d", Ls); } @@ -305,7 +300,7 @@ void TA2AMesonField::execute(void) { LOG(Message) << "Computing A2A meson field" << std::endl; - auto &a2a = envGet(A2ABase, par().A2A + "_class"); + auto &a2a = envGet(A2ABase, par().A2A); // 2+6+4+4 = 16 gammas // Ordering defined here @@ -335,8 +330,9 @@ void TA2AMesonField::execute(void) int nx = env().getDim(Xp); int ny = env().getDim(Yp); int nz = env().getDim(Zp); - int N = par().N; - int Nl = par().Nl; + int Nl = a2a.get_Nl(); + int N = Nl + a2a.get_Nh(); + int ngamma = gammas.size(); int schurBlock = par().schurBlock; @@ -407,7 +403,6 @@ void TA2AMesonField::execute(void) int N_iii = MIN(N_ii-ii,cacheBlock); int N_jjj = MIN(N_jj-jj,cacheBlock); - Eigen::Tensor mesonFieldBlocked(nmom,ngamma,nt,N_iii,N_jjj); t_contr-=usecond(); diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc index e02c359a..472a0b4d 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc @@ -5,3 +5,4 @@ using namespace Hadrons; using namespace MNoise; template class Grid::Hadrons::MNoise::TTimeDilutedSpinColorDiagonal; +template class Grid::Hadrons::MNoise::TTimeDilutedSpinColorDiagonal; diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp index 1f6e89f9..7e2a471f 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -31,6 +31,7 @@ public: }; MODULE_REGISTER_TMP(TimeDilutedSpinColorDiagonal, TTimeDilutedSpinColorDiagonal, MNoise); +MODULE_REGISTER_TMP(ZTimeDilutedSpinColorDiagonal, TTimeDilutedSpinColorDiagonal, MNoise); /****************************************************************************** * TTimeDilutedSpinColorDiagonal implementation * diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.cc b/extras/Hadrons/Modules/MSolver/A2AVectors.cc index f72f405d..477d0b72 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.cc +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.cc @@ -4,5 +4,5 @@ using namespace Grid; using namespace Hadrons; using namespace MSolver; -template class Grid::Hadrons::MSolver::TA2AVectors; -template class Grid::Hadrons::MSolver::TA2AVectors; +template class Grid::Hadrons::MSolver::TA2AVectors>; +template class Grid::Hadrons::MSolver::TA2AVectors>; diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index d7e4cfe4..20fa7c2e 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -7,6 +7,7 @@ #include #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -21,26 +22,20 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AVectorsPar, bool, return_5d, int, Nl, - int, N, - std::vector, sources, + std::string, noise, std::string, action, std::string, eigenPack, std::string, solver); }; -template +template class TA2AVectors : public Module { - public: +public: FERM_TYPE_ALIASES(FImpl,); SOLVER_TYPE_ALIASES(FImpl,); - - typedef FermionEigenPack EPack; - typedef CoarseFermionEigenPack CoarseEPack; - - typedef A2AModesSchurDiagTwo A2ABase; - - public: + typedef A2AModesSchurDiagTwo A2ABase; +public: // constructor TA2AVectors(const std::string name); // destructor @@ -53,46 +48,37 @@ class TA2AVectors : public Module virtual void setup(void); // execution virtual void execute(void); - - private: - unsigned int Ls_; - std::string className_; }; -MODULE_REGISTER_TMP(A2AVectors, ARG(TA2AVectors), MSolver); -MODULE_REGISTER_TMP(ZA2AVectors, ARG(TA2AVectors), MSolver); +MODULE_REGISTER_TMP(A2AVectors, + ARG(TA2AVectors>), MSolver); +MODULE_REGISTER_TMP(ZA2AVectors, + ARG(TA2AVectors>), MSolver); /****************************************************************************** * TA2AVectors implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// -template -TA2AVectors::TA2AVectors(const std::string name) +template +TA2AVectors::TA2AVectors(const std::string name) : Module(name) -, className_ (name + "_class") {} // dependencies/products /////////////////////////////////////////////////////// -template -std::vector TA2AVectors::getInput(void) +template +std::vector TA2AVectors::getInput(void) { int Nl = par().Nl; std::string sub_string = ""; if (Nl > 0) sub_string = "_subtract"; - std::vector in = {par().solver + sub_string}; - int n = par().sources.size(); - - for (unsigned int t = 0; t < n; t += 1) - { - in.push_back(par().sources[t]); - } + std::vector in = {par().solver + sub_string, par().noise}; return in; } -template -std::vector TA2AVectors::getReference(void) +template +std::vector TA2AVectors::getReference(void) { std::vector ref = {par().action}; @@ -104,22 +90,21 @@ std::vector TA2AVectors::getReference(void) return ref; } -template -std::vector TA2AVectors::getOutput(void) +template +std::vector TA2AVectors::getOutput(void) { - std::vector out = {getName(), className_}; + std::vector out = {getName()}; return out; } // setup /////////////////////////////////////////////////////////////////////// -template -void TA2AVectors::setup(void) +template +void TA2AVectors::setup(void) { - int N = par().N; int Nl = par().Nl; - int Nh = N - Nl; - bool return_5d = par().return_5d; + bool return_5d = par().return_5d; + auto &noise = envGet(DilutedNoise, par().noise); int Ls; std::string sub_string = ""; @@ -139,94 +124,80 @@ void TA2AVectors::setup(void) if (Nl > 0) { // Low modes - auto &epack = envGet(EPack, par().eigenPack); + auto &epack = envGet(Pack, par().eigenPack); LOG(Message) << "Creating a2a vectors " << getName() << " using eigenpack '" << par().eigenPack << "' (" << epack.evec.size() << " modes)" << - " and " << Nh << " high modes." << std::endl; + " and " << noise.size() << " high modes." << std::endl; evec = &epack.evec; eval = &epack.eval; } else { LOG(Message) << "Creating a2a vectors " << getName() << - " using " << Nh << " high modes only." << std::endl; + " using " << noise.size() << " high modes only." << std::endl; } - envCreate(A2ABase, className_, Ls, - evec, eval, - action, - solver, - Nl, Nh, - return_5d); + envCreate(A2ABase, getName(), Ls, evec, eval, action, solver, Nl, noise.size(), + return_5d); } // execution /////////////////////////////////////////////////////////////////// -template -void TA2AVectors::execute(void) +template +void TA2AVectors::execute(void) { auto &action = envGet(FMat, par().action); + auto &noise = envGet(DilutedNoise, par().noise); - int Nt = env().getDim(Tp); - int Nc = FImpl::Dimension; - int Ls_; + int Ls; int Nl = par().Nl; std::string sub_string = ""; if (Nl > 0) sub_string = "_subtract"; - Ls_ = env().getObjectLs(par().solver + sub_string); + Ls = env().getObjectLs(par().solver + sub_string); - auto &a2areturn = envGet(A2ABase, className_); + auto &a2areturn = envGet(A2ABase, getName()); // High modes - auto sources = par().sources; - int Nsrc = par().sources.size(); - envGetTmp(FermionField, ferm_src); envGetTmp(FermionField, unphys_ferm); envGetTmp(FermionField, tmp); - - int N_count = 0; - for (unsigned int s = 0; s < Ns; ++s) - for (unsigned int c = 0; c < Nc; ++c) - for (unsigned int T = 0; T < Nsrc; T++) + for (unsigned int i = 0; i < noise.size(); i++) + { + LOG(Message) << "A2A src for noise vector " << i << std::endl; + // source conversion for 4D sources + if (!env().isObject5d(par().noise)) { - auto &prop_src = envGet(PropagatorField, sources[T]); - LOG(Message) << "A2A src for s = " << s << " , c = " << c << ", T = " << T << std::endl; - // source conversion for 4D sources - if (!env().isObject5d(sources[T])) + if (Ls == 1) { - if (Ls_ == 1) - { - PropToFerm(ferm_src, prop_src, s, c); - tmp = ferm_src; - } - else - { - PropToFerm(tmp, prop_src, s, c); - action.ImportPhysicalFermionSource(tmp, ferm_src); - action.ImportUnphysicalFermion(tmp, unphys_ferm); - } + ferm_src = noise[i]; + tmp = ferm_src; } - // source conversion for 5D sources else { - if (Ls_ != env().getObjectLs(sources[T])) - { - HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); - } - else - { - PropToFerm(ferm_src, prop_src, s, c); - action.ExportPhysicalFermionSolution(ferm_src, tmp); - unphys_ferm = ferm_src; - } + tmp = noise[i]; + action.ImportPhysicalFermionSource(noise[i], ferm_src); + action.ImportUnphysicalFermion(noise[i], unphys_ferm); } - LOG(Message) << "a2areturn.high_modes Ncount = " << N_count << std::endl; - a2areturn.high_modes(ferm_src, unphys_ferm, tmp, N_count); - N_count++; } + // source conversion for 5D sources + else + { + if (Ls != env().getObjectLs(par().noise)) + { + HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); + } + else + { + ferm_src = noise[i]; + action.ExportPhysicalFermionSolution(ferm_src, tmp); + unphys_ferm = ferm_src; + } + } + LOG(Message) << "solveHighMode i = " << i << std::endl; + a2areturn.high_modes(ferm_src, unphys_ferm, tmp, i); + } } END_MODULE_NAMESPACE From 4eac4e575e0ea75476f2510b646873191c34a4c7 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 6 Aug 2018 12:42:25 +0100 Subject: [PATCH 422/620] Hadrons: meson fields indentation fix --- .../Modules/MContraction/A2AMesonField.hpp | 462 +++++++++--------- 1 file changed, 233 insertions(+), 229 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 9a09c0b6..cee6858e 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -21,9 +21,9 @@ class A2AMesonFieldPar : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar, - int, cacheBlock, - int, schurBlock, - int, Nmom, + int, cacheBlock, + int, schurBlock, + int, Nmom, std::string, A2A, std::string, output); }; @@ -52,15 +52,15 @@ class TA2AMesonField : public Module // Arithmetic help. Move to Grid?? virtual void MesonField(Eigen::Tensor &mat, - const LatticeFermion *lhs, - const LatticeFermion *rhs, - std::vector gammas, - const std::vector &mom, - int orthogdim, - double &t0, - double &t1, - double &t2, - double &t3); + const LatticeFermion *lhs, + const LatticeFermion *rhs, + std::vector gammas, + const std::vector &mom, + int orthogdim, + double &t0, + double &t1, + double &t2, + double &t3); }; MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); @@ -160,7 +160,8 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, int MFlvol = ld*Lblock*Rblock*Nmom; Vector lvSum(MFrvol); - parallel_for (int r = 0; r < MFrvol; r++){ + parallel_for (int r = 0; r < MFrvol; r++) + { lvSum[r] = zero; } @@ -176,110 +177,113 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, t0-=usecond(); // Nested parallelism would be ok // Wasting cores here. Test case r - parallel_for(int r=0;r_ostride[orthogdim]; // base offset for start of plane - for(int n=0;n icoor(Nd); std::vector extracted(Nsimd); - for(int i=0;iiCoorFromIindex(icoor,idx); - for(int idx=0;idxiCoorFromIindex(icoor,idx); - - int ldx = rt+icoor[orthogdim]*rd; - - int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; - - lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; + int ldx = rt+icoor[orthogdim]*rd; + int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; } - }}} + } } t1+=usecond(); - assert(mat.dimension(0) == Nmom); assert(mat.dimension(1) == Ngamma); assert(mat.dimension(2) == Nt); t2-=usecond(); + // ld loop and local only?? int pd = grid->_processors[orthogdim]; int pc = grid->_processor_coor[orthogdim]; parallel_for_nest2(int lt=0;lt::MesonField(Eigen::Tensor &mat, template void TA2AMesonField::execute(void) { - LOG(Message) << "Computing A2A meson field" << std::endl; + LOG(Message) << "Computing A2A meson field" << std::endl; - auto &a2a = envGet(A2ABase, par().A2A); - - // 2+6+4+4 = 16 gammas - // Ordering defined here - std::vector gammas ( { - Gamma::Algebra::Gamma5, - Gamma::Algebra::Identity, - Gamma::Algebra::GammaX, - Gamma::Algebra::GammaY, - Gamma::Algebra::GammaZ, - Gamma::Algebra::GammaT, - Gamma::Algebra::GammaXGamma5, - Gamma::Algebra::GammaYGamma5, - Gamma::Algebra::GammaZGamma5, - Gamma::Algebra::GammaTGamma5, - Gamma::Algebra::SigmaXY, - Gamma::Algebra::SigmaXZ, - Gamma::Algebra::SigmaXT, - Gamma::Algebra::SigmaYZ, - Gamma::Algebra::SigmaYT, - Gamma::Algebra::SigmaZT - }); + auto &a2a = envGet(A2ABase, par().A2A); + + // 2+6+4+4 = 16 gammas + // Ordering defined here + std::vector gammas ( { + Gamma::Algebra::Gamma5, + Gamma::Algebra::Identity, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaXGamma5, + Gamma::Algebra::GammaYGamma5, + Gamma::Algebra::GammaZGamma5, + Gamma::Algebra::GammaTGamma5, + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::SigmaZT + }); - /////////////////////////////////////////////// - // Square assumption for now Nl = Nr = N - /////////////////////////////////////////////// - int nt = env().getDim(Tp); - int nx = env().getDim(Xp); - int ny = env().getDim(Yp); - int nz = env().getDim(Zp); - int Nl = a2a.get_Nl(); - int N = Nl + a2a.get_Nh(); - - int ngamma = gammas.size(); + /////////////////////////////////////////////// + // Square assumption for now Nl = Nr = N + /////////////////////////////////////////////// + int nt = env().getDim(Tp); + int nx = env().getDim(Xp); + int ny = env().getDim(Yp); + int nz = env().getDim(Zp); + int Nl = a2a.get_Nl(); + int N = Nl + a2a.get_Nh(); + + int ngamma = gammas.size(); - int schurBlock = par().schurBlock; - int cacheBlock = par().cacheBlock; - int nmom = par().Nmom; + int schurBlock = par().schurBlock; + int cacheBlock = par().cacheBlock; + int nmom = par().Nmom; - /////////////////////////////////////////////// - // Momentum setup - /////////////////////////////////////////////// - GridBase *grid = env().getGrid(1); - std::vector phases(nmom,grid); - for(int m=0;m phases(nmom,grid); + for(int m=0;m mesonField (nmom,ngamma,nt,N,N); - LOG(Message) << "N = Nh+Nl for A2A MesonField is " << N << std::endl; + Eigen::Tensor mesonField (nmom,ngamma,nt,N,N); + LOG(Message) << "N = Nh+Nl for A2A MesonField is " << N << std::endl; - envGetTmp(std::vector, w); - envGetTmp(std::vector, v); - envGetTmp(FermionField, tmp_5d); + envGetTmp(std::vector, w); + envGetTmp(std::vector, v); + envGetTmp(FermionField, tmp_5d); - LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; + LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; - ////////////////////////////////////////////////////////////////////////// - // i,j is first loop over SchurBlock factors reusing 5D matrices - // ii,jj is second loop over cacheBlock factors for high perf contractoin - // iii,jjj are loops within cacheBlock - // Total index is sum of these i+ii+iii etc... - ////////////////////////////////////////////////////////////////////////// - - double flops = 0.0; - double bytes = 0.0; - double vol = nx*ny*nz*nt; - double t_schur=0; - double t_contr=0; - double t_int_0=0; - double t_int_1=0; - double t_int_2=0; - double t_int_3=0; + ////////////////////////////////////////////////////////////////////////// + // i,j is first loop over SchurBlock factors reusing 5D matrices + // ii,jj is second loop over cacheBlock factors for high perf contractoin + // iii,jjj are loops within cacheBlock + // Total index is sum of these i+ii+iii etc... + ////////////////////////////////////////////////////////////////////////// + + double flops = 0.0; + double bytes = 0.0; + double vol = nx*ny*nz*nt; + double t_schur=0; + double t_contr=0; + double t_int_0=0; + double t_int_1=0; + double t_int_2=0; + double t_int_3=0; - double t0 = usecond(); - int N_i = N; - int N_j = N; - for(int i=0;i mesonFieldBlocked(nmom,ngamma,nt,N_iii,N_jjj); + + t_contr-=usecond(); + MesonField(mesonFieldBlocked, &w[ii], &v[jj], gammas, phases,Tp, + t_int_0,t_int_1,t_int_2,t_int_3); + t_contr+=usecond(); + flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; + + bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; /////////////////////////////////////////////////////////////// - // Get the W and V vectors for this schurBlock^2 set of terms - /////////////////////////////////////////////////////////////// - int N_ii = MIN(N_i-i,schurBlock); - int N_jj = MIN(N_j-j,schurBlock); - - t_schur-=usecond(); - for(int ii =0;ii < N_ii;ii++) a2a.return_w(i+ii, tmp_5d, w[ii]); - for(int jj =0;jj < N_jj;jj++) a2a.return_v(j+jj, tmp_5d, v[jj]); - t_schur+=usecond(); - - LOG(Message) << "Found w vectors " << i <<" .. " << i+N_ii-1 << std::endl; - LOG(Message) << "Found v vectors " << j <<" .. " << j+N_jj-1 << std::endl; - - /////////////////////////////////////////////////////////////// - // Series of cache blocked chunks of the contractions within this SchurBlock + // Copy back to full meson field tensor /////////////////////////////////////////////////////////////// - for(int ii=0;ii mesonFieldBlocked(nmom,ngamma,nt,N_iii,N_jjj); + double nodes=grid->NodeCount(); + double t1 = usecond(); + LOG(Message) << " Contraction of MesonFields took "<<(t1-t0)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Schur "<<(t_schur)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Contr "<<(t_contr)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern0 "<<(t_int_0)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern1 "<<(t_int_1)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern2 "<<(t_int_2)/1.0e6<< " seconds " << std::endl; + LOG(Message) << " Intern3 "<<(t_int_3)/1.0e6<< " seconds " << std::endl; - t_contr-=usecond(); - MesonField(mesonFieldBlocked, &w[ii], &v[jj], gammas, phases,Tp, - t_int_0,t_int_1,t_int_2,t_int_3); - t_contr+=usecond(); - flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; + double t_kernel = t_int_0 + t_int_1; + LOG(Message) << " Arith "< + ///////////////////////////////////////////////////////////////////////// + std::vector corr(nt,ComplexD(0.0)); - /////////////////////////////////////////////////////////////// - // Copy back to full meson field tensor - /////////////////////////////////////////////////////////////// - parallel_for_nest2(int iii=0;iii< N_iii;iii++) { - for(int jjj=0;jjj< N_jjj;jjj++) { - for(int m =0;m< nmom;m++) { - for(int g =0;g< ngamma;g++) { - for(int t =0;t< nt;t++) { - mesonField(m,g,t,i+ii+iii,j+jj+jjj) = mesonFieldBlocked(m,g,t,iii,jjj); - }}} + for(int i=0;iNodeCount(); - double t1 = usecond(); - LOG(Message) << " Contraction of MesonFields took "<<(t1-t0)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Schur "<<(t_schur)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Contr "<<(t_contr)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern0 "<<(t_int_0)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern1 "<<(t_int_1)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern2 "<<(t_int_2)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern3 "<<(t_int_3)/1.0e6<< " seconds " << std::endl; - - double t_kernel = t_int_0 + t_int_1; - LOG(Message) << " Arith "< - ///////////////////////////////////////////////////////////////////////// - std::vector corr(nt,ComplexD(0.0)); - - for(int i=0;i Date: Tue, 7 Aug 2018 18:26:49 +0100 Subject: [PATCH 423/620] Hadrons: schedule loading fix --- extras/Hadrons/Application.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 0490c222..18bd93e3 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -218,11 +218,12 @@ void Application::loadSchedule(const std::string filename) program_.push_back(vm().getModuleAddress(name)); } loadedSchedule_ = true; + scheduled_ = true; } void Application::printSchedule(void) { - if (!scheduled_) + if (!scheduled_ and !loadedSchedule_) { HADRONS_ERROR(Definition, "Computation not scheduled"); } From 231cc95be6a248293ef742da18aa6eff97d8ccee Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 7 Aug 2018 18:27:19 +0100 Subject: [PATCH 424/620] Hadrons: eigenvalues precision fix --- extras/Hadrons/EigenPack.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/Hadrons/EigenPack.hpp b/extras/Hadrons/EigenPack.hpp index 4169cba1..d19e7728 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/extras/Hadrons/EigenPack.hpp @@ -56,7 +56,7 @@ public: VecRecord(void): index(0), eval(0.) {} }; public: - std::vector eval; + std::vector eval; std::vector evec; PackRecord record; public: @@ -215,7 +215,7 @@ class CoarseEigenPack: public EigenPack public: typedef CoarseF CoarseField; public: - std::vector evalCoarse; + std::vector evalCoarse; std::vector evecCoarse; public: CoarseEigenPack(void) = default; From 0677adb4dde178fe938ea48dac65384c831f50a4 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 7 Aug 2018 18:27:59 +0100 Subject: [PATCH 425/620] Hadrons: overhaul of A2A for production --- extras/Hadrons/A2AVectors.hpp | 387 ++++++++++++++++++ extras/Hadrons/AllToAllReduction.hpp | 146 ------- extras/Hadrons/AllToAllVectors.hpp | 227 ---------- extras/Hadrons/Makefile.am | 2 +- .../Modules/MContraction/A2AMesonField.hpp | 97 ++--- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 230 ++++++----- 6 files changed, 558 insertions(+), 531 deletions(-) create mode 100644 extras/Hadrons/A2AVectors.hpp delete mode 100644 extras/Hadrons/AllToAllReduction.hpp delete mode 100644 extras/Hadrons/AllToAllVectors.hpp diff --git a/extras/Hadrons/A2AVectors.hpp b/extras/Hadrons/A2AVectors.hpp new file mode 100644 index 00000000..745ef94f --- /dev/null +++ b/extras/Hadrons/A2AVectors.hpp @@ -0,0 +1,387 @@ +#ifndef A2A_Vectors_hpp_ +#define A2A_Vectors_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +//////////////////////////////// +// A2A Modes +//////////////////////////////// + +template +class A2AVectorsSchurDiagTwo +{ +public: + FERM_TYPE_ALIASES(FImpl,); + SOLVER_TYPE_ALIASES(FImpl,); +public: + A2AVectorsSchurDiagTwo(FMat &action, Solver &solver); + virtual ~A2AVectorsSchurDiagTwo(void) = default; + void makeLowModeV(FermionField &vout, const FermionField &evec, const Real &eval); + void makeLowModeV5D(FermionField &vout_4d, FermionField &vout_5d, const FermionField &evec, const Real &eval); + void makeLowModeW(FermionField &wout, const FermionField &evec, const Real &eval); + void makeLowModeW5D(FermionField &wout_4d, FermionField &wout_5d, const FermionField &evec, const Real &eval); + void makeHighModeV(FermionField &vout, const FermionField &noise); + void makeHighModeV5D(FermionField &vout_4d, FermionField &vout_5d, const FermionField &noise_5d); + void makeHighModeW(FermionField &wout, const FermionField &noise); + void makeHighModeW5D(FermionField &vout_5d, FermionField &wout_5d, const FermionField &noise_5d); +private: + FMat &action_; + Solver &solver_; + GridBase *fGrid_, *frbGrid_, *gGrid_; + bool is5d_; + FermionField src_o_, sol_e_, sol_o_, tmp_, tmp5_; + SchurDiagTwoOperator op_; +}; + +template +A2AVectorsSchurDiagTwo::A2AVectorsSchurDiagTwo(FMat &action, Solver &solver) +: action_(action) +, solver_(solver) +, fGrid_(action_.FermionGrid()) +, frbGrid_(action_.FermionRedBlackGrid()) +, gGrid_(action_.GaugeGrid()) +, src_o_(frbGrid_) +, sol_e_(frbGrid_) +, sol_o_(frbGrid_) +, tmp_(frbGrid_) +, tmp5_(fGrid_) +, op_(action_) +{} + +template +void A2AVectorsSchurDiagTwo::makeLowModeV(FermionField &vout, const FermionField &evec, const Real &eval) +{ + src_o_ = evec; + src_o_.checkerboard = Odd; + pickCheckerboard(Even, sol_e_, vout); + pickCheckerboard(Odd, sol_o_, vout); + + ///////////////////////////////////////////////////// + // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i + ///////////////////////////////////////////////////// + action_.MooeeInv(src_o_, tmp_); + assert(tmp_.checkerboard == Odd); + action_.Meooe(tmp_, sol_e_); + assert(sol_e_.checkerboard == Even); + action_.MooeeInv(sol_e_, tmp_); + assert(tmp_.checkerboard == Even); + sol_e_ = (-1.0 / eval) * tmp_; + assert(sol_e_.checkerboard == Even); + + ///////////////////////////////////////////////////// + // v_io = (1/eval_i) * MooInv evec_i + ///////////////////////////////////////////////////// + action_.MooeeInv(src_o_, tmp_); + assert(tmp_.checkerboard == Odd); + sol_o_ = (1.0 / eval) * tmp_; + assert(sol_o_.checkerboard == Odd); + + setCheckerboard(vout, sol_e_); + assert(sol_e_.checkerboard == Even); + setCheckerboard(vout, sol_o_); + assert(sol_o_.checkerboard == Odd); +} + +template +void A2AVectorsSchurDiagTwo::makeLowModeV5D(FermionField &vout_4d, FermionField &vout_5d, const FermionField &evec, const Real &eval) +{ + makeLowModeV(vout_5d, evec, eval); + action_.ExportPhysicalFermionSolution(vout_5d, vout_4d); +} + +template +void A2AVectorsSchurDiagTwo::makeLowModeW(FermionField &wout, const FermionField &evec, const Real &eval) +{ + src_o_ = evec; + src_o_.checkerboard = Odd; + pickCheckerboard(Even, sol_e_, wout); + pickCheckerboard(Odd, sol_o_, wout); + + ///////////////////////////////////////////////////// + // w_ie = - MeeInvDag MoeDag Doo evec_i + ///////////////////////////////////////////////////// + op_.Mpc(src_o_, tmp_); + assert(tmp_.checkerboard == Odd); + action_.MeooeDag(tmp_, sol_e_); + assert(sol_e_.checkerboard == Even); + action_.MooeeInvDag(sol_e_, tmp_); + assert(tmp_.checkerboard == Even); + sol_e_ = (-1.0) * tmp_; + + ///////////////////////////////////////////////////// + // w_io = Doo evec_i + ///////////////////////////////////////////////////// + op_.Mpc(src_o_, sol_o_); + assert(sol_o_.checkerboard == Odd); + + setCheckerboard(wout, sol_e_); + assert(sol_e_.checkerboard == Even); + setCheckerboard(wout, sol_o_); + assert(sol_o_.checkerboard == Odd); +} + +template +void A2AVectorsSchurDiagTwo::makeLowModeW5D(FermionField &wout_4d, + FermionField &wout_5d, + const FermionField &evec, + const Real &eval) +{ + makeLowModeW(tmp5_, evec, eval); + action_.DminusDag(tmp5_, wout_5d); + action_.ExportPhysicalFermionSource(wout_5d, wout_4d); +} + +template +void A2AVectorsSchurDiagTwo::makeHighModeV(FermionField &vout, + const FermionField &noise) +{ + solver_(vout, noise); +} + +template +void A2AVectorsSchurDiagTwo::makeHighModeV5D(FermionField &vout_4d, + FermionField &vout_5d, + const FermionField &noise) +{ + if (noise._grid->Dimensions() == fGrid_->Dimensions() - 1) + { + action_.ImportPhysicalFermionSource(noise, tmp5_); + } + else + { + tmp5_ = noise; + } + makeHighModeV(vout_5d, tmp5_); + action_.ExportPhysicalFermionSolution(vout_5d, vout_4d); +} + +template +void A2AVectorsSchurDiagTwo::makeHighModeW(FermionField &wout, + const FermionField &noise) +{ + wout = noise; +} + +template +void A2AVectorsSchurDiagTwo::makeHighModeW5D(FermionField &wout_4d, + FermionField &wout_5d, + const FermionField &noise) +{ + if (noise._grid->Dimensions() == fGrid_->Dimensions() - 1) + { + action_.ImportUnphysicalFermion(noise, wout_5d); + wout_4d = noise; + } + else + { + wout_5d = noise; + action_.ExportPhysicalFermionSource(wout_5d, wout_4d); + } +} + + + // A2AVectorsSchurDiagTwo(const int Nl, const int Nh, + // std::vector &v, + // std::vector &w, + // const bool _return_5d) + // : Nl(_Nl), Nh(_Nh), + // return_5d(_return_5d) + // { + // if (!return_5d) + // { + // init_resize(1, Nl + Nh); + // } + // else + // { + // init_resize(Nl + Nh, Nl + Nh); + // } + // } + + // void init_resize(const size_t size_5d, const size_t size_4d, + // GridBase *grid_5d, GridBase *grid_4d) + // { + // w_5d.resize(size_5d, grid_5d); + // v_5d.resize(size_5d, grid_5d); + // w_4d.resize(size_4d, grid_4d); + // v_4d.resize(size_4d, grid_4d); + // } + + // int get_Nh(void) const + // { + // return Nh; + // } + + // int get_Nl(void) const + // { + // return Nl; + // } + + // void low_modes(int il, const Field &evec, const Real &eval, Matrix &action) + // { + // int i5d; + + // i5d = 0; + // if (return_5d) i5d = il; + // this->low_mode_v(v_5d[i5d], v_4d[il], evec, eval, action); + // this->low_mode_w(w_5d[i5d], w_4d[il], evec, eval, action); + // } + + // void high_modes(int ih, Field &source_5d, Field &w_source_5d, + // Field &source_4d, Solver &solver) + // { + // int i5d; + + // i5d = 0; + // if (return_5d) i5d = ih + Nl; + // this->high_mode_v(source_5d, v_5d[i5d], v_4d[ih + Nl], solver); + // this->high_mode_w(w_source_5d, source_4d, w_5d[i5d], w_4d[ih + Nl]); + // } + + // void return_v(int i, Field &vout_5d, Field &vout_4d) + // { + // vout_4d = v_4d[i]; + // if (!(return_5d)) i = 0; + // vout_5d = v_5d[i]; + // } + + // void return_w(int i, Field &wout_5d, Field &wout_4d) + // { + // wout_4d = w_4d[i]; + // if (!(return_5d)) i = 0; + // wout_5d = w_5d[i]; + // } + + // void low_mode_v(Field &vout_5d, Field &vout_4d, const Field &evec, + // const Real &eval, Matrix &action) + // { + // GridBase *grid = action.RedBlackGrid(); + // Field src_o(grid); + // Field sol_e(grid); + // Field sol_o(grid); + // Field tmp(grid); + + // src_o = evec; + // src_o.checkerboard = Odd; + // pickCheckerboard(Even, sol_e, vout_5d); + // pickCheckerboard(Odd, sol_o, vout_5d); + + // ///////////////////////////////////////////////////// + // // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i + // ///////////////////////////////////////////////////// + // action.MooeeInv(src_o, tmp); + // assert(tmp.checkerboard == Odd); + // action.Meooe(tmp, sol_e); + // assert(sol_e.checkerboard == Even); + // action.MooeeInv(sol_e, tmp); + // assert(tmp.checkerboard == Even); + // sol_e = (-1.0 / eval) * tmp; + // assert(sol_e.checkerboard == Even); + + // ///////////////////////////////////////////////////// + // // v_io = (1/eval_i) * MooInv evec_i + // ///////////////////////////////////////////////////// + // action.MooeeInv(src_o, tmp); + // assert(tmp.checkerboard == Odd); + // sol_o = (1.0 / eval) * tmp; + // assert(sol_o.checkerboard == Odd); + + // setCheckerboard(vout_5d, sol_e); + // assert(sol_e.checkerboard == Even); + // setCheckerboard(vout_5d, sol_o); + // assert(sol_o.checkerboard == Odd); + + // action.ExportPhysicalFermionSolution(vout_5d, vout_4d); + // } + + // void low_mode_w(Field &wout_5d, Field &wout_4d, const Field &evec, + // const Real &eval, Matrix &action) + // { + // GridBase *grid = action.RedBlackGrid(); + // SchurDiagTwoOperator _HermOpEO(action); + + // Field src_o(grid); + // Field sol_e(grid); + // Field sol_o(grid); + // Field tmp(grid); + + // GridBase *fgrid = action.Grid(); + // Field tmp_wout(fgrid); + + // src_o = evec; + // src_o.checkerboard = Odd; + // pickCheckerboard(Even, sol_e, tmp_wout); + // pickCheckerboard(Odd, sol_o, tmp_wout); + + // ///////////////////////////////////////////////////// + // // w_ie = - MeeInvDag MoeDag Doo evec_i + // ///////////////////////////////////////////////////// + // _HermOpEO.Mpc(src_o, tmp); + // assert(tmp.checkerboard == Odd); + // action.MeooeDag(tmp, sol_e); + // assert(sol_e.checkerboard == Even); + // action.MooeeInvDag(sol_e, tmp); + // assert(tmp.checkerboard == Even); + // sol_e = (-1.0) * tmp; + + // ///////////////////////////////////////////////////// + // // w_io = Doo evec_i + // ///////////////////////////////////////////////////// + // _HermOpEO.Mpc(src_o, sol_o); + // assert(sol_o.checkerboard == Odd); + + // setCheckerboard(tmp_wout, sol_e); + // assert(sol_e.checkerboard == Even); + // setCheckerboard(tmp_wout, sol_o); + // assert(sol_o.checkerboard == Odd); + + // action.DminusDag(tmp_wout, wout_5d); + + // action.ExportPhysicalFermionSource(wout_5d, wout_4d); + // } + + // void high_mode_v(const Field &source, Field &vout_5d, Field &vout_4d, + // Matrix &action, Solver &solver) + // { + // GridBase *fgrid = action.Grid(); + // solver(vout_5d, source); // Note: solver is solver(out, in) + // action.ExportPhysicalFermionSolution(vout_5d, vout_4d); + // } + + // void high_mode_w(const Field &w_source_5d, const Field &source_4d, + // Field &wout_5d, Field &wout_4d) + // { + // wout_5d = w_source_5d; + // wout_4d = source_4d; + // } + +// TODO: A2A for coarse eigenvectors + +// template +// class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo +// { +// private: +// const std::vector &subspace; +// const std::vector &evec_coarse; +// const std::vector &eval_coarse; +// Matrix &action; + +// public: +// A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) +// : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){}; + +// void operator()(int i, FineField &vout, FineField &wout) +// { +// FineField prom_evec(subspace[0]._grid); +// blockPromote(evec_coarse[i], prom_evec, subspace); +// this->low_mode_v(action, prom_evec, eval_coarse[i], vout); +// this->low_mode_w(action, prom_evec, eval_coarse[i], wout); +// } +// }; + +END_HADRONS_NAMESPACE + +#endif // A2A_Vectors_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/AllToAllReduction.hpp b/extras/Hadrons/AllToAllReduction.hpp deleted file mode 100644 index 7b2d2c1a..00000000 --- a/extras/Hadrons/AllToAllReduction.hpp +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef A2A_Reduction_hpp_ -#define A2A_Reduction_hpp_ - -#include -#include -#include - -BEGIN_HADRONS_NAMESPACE - -//////////////////////////////////////////// -// A2A Meson Field Inner Product -//////////////////////////////////////////// - -template -void sliceInnerProductMesonField(std::vector> &mat, - const std::vector> &lhs, - const std::vector> &rhs, - int orthogdim) -{ - typedef typename FermionField::scalar_type scalar_type; - typedef typename FermionField::vector_type vector_type; - - int Lblock = lhs.size(); - int Rblock = rhs.size(); - - GridBase *grid = lhs[0]._grid; - - const int Nd = grid->_ndimension; - const int Nsimd = grid->Nsimd(); - int Nt = grid->GlobalDimensions()[orthogdim]; - - assert(mat.size() == Lblock * Rblock); - for (int t = 0; t < mat.size(); t++) - { - assert(mat[t].size() == Nt); - } - - int fd = grid->_fdimensions[orthogdim]; - int ld = grid->_ldimensions[orthogdim]; - int rd = grid->_rdimensions[orthogdim]; - - // will locally sum vectors first - // sum across these down to scalars - // splitting the SIMD - std::vector> lvSum(rd * Lblock * Rblock); - for(int r=0;r lsSum(ld * Lblock * Rblock, scalar_type(0.0)); - - int e1 = grid->_slice_nblock[orthogdim]; - int e2 = grid->_slice_block[orthogdim]; - int stride = grid->_slice_stride[orthogdim]; - - // std::cout << GridLogMessage << " Entering first parallel loop " << std::endl; - // Parallelise over t-direction doesn't expose as much parallelism as needed for KNL - parallel_for(int r = 0; r < rd; r++) - { - int so = r * grid->_ostride[orthogdim]; // base offset for start of plane - for (int n = 0; n < e1; n++) - { - for (int b = 0; b < e2; b++) - { - int ss = so + n * stride + b; - for (int i = 0; i < Lblock; i++) - { - auto left = conjugate(lhs[i]._odata[ss]); - for (int j = 0; j < Rblock; j++) - { - int idx = i + Lblock * j + Lblock * Rblock * r; - auto right = rhs[j]._odata[ss]; - vector_type vv = left()(0)(0) * right()(0)(0) - + left()(0)(1) * right()(0)(1) - + left()(0)(2) * right()(0)(2) - + left()(1)(0) * right()(1)(0) - + left()(1)(1) * right()(1)(1) - + left()(1)(2) * right()(1)(2) - + left()(2)(0) * right()(2)(0) - + left()(2)(1) * right()(2)(1) - + left()(2)(2) * right()(2)(2) - + left()(3)(0) * right()(3)(0) - + left()(3)(1) * right()(3)(1) - + left()(3)(2) * right()(3)(2); - - lvSum[idx] = lvSum[idx] + vv; - } - } - } - } - } - - // std::cout << GridLogMessage << " Entering second parallel loop " << std::endl; - // Sum across simd lanes in the plane, breaking out orthog dir. - parallel_for(int rt = 0; rt < rd; rt++) - { - std::vector icoor(Nd); - for (int i = 0; i < Lblock; i++) - { - for (int j = 0; j < Rblock; j++) - { - iScalar temp; - std::vector> extracted(Nsimd); - temp._internal = lvSum[i + Lblock * j + Lblock * Rblock * rt]; - extract(temp, extracted); - for (int idx = 0; idx < Nsimd; idx++) - { - grid->iCoorFromIindex(icoor, idx); - int ldx = rt + icoor[orthogdim] * rd; - int ij_dx = i + Lblock * j + Lblock * Rblock * ldx; - lsSum[ij_dx] = lsSum[ij_dx] + extracted[idx]._internal; - } - } - } - } - - // std::cout << GridLogMessage << " Entering non parallel loop " << std::endl; - for (int t = 0; t < fd; t++) - { - int pt = t/ld; // processor plane - int lt = t%ld; - for (int i = 0; i < Lblock; i++) - { - for (int j = 0; j < Rblock; j++) - { - if (pt == grid->_processor_coor[orthogdim]) - { - int ij_dx = i + Lblock * j + Lblock * Rblock * lt; - mat[i + j * Lblock][t] = lsSum[ij_dx]; - } - else - { - mat[i + j * Lblock][t] = scalar_type(0.0); - } - - } - } - } - // std::cout << GridLogMessage << " Done " << std::endl; - // defer sum over nodes. - return; -} - -END_HADRONS_NAMESPACE - -#endif // A2A_Reduction_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/AllToAllVectors.hpp b/extras/Hadrons/AllToAllVectors.hpp deleted file mode 100644 index b21b6862..00000000 --- a/extras/Hadrons/AllToAllVectors.hpp +++ /dev/null @@ -1,227 +0,0 @@ -#ifndef A2A_Vectors_hpp_ -#define A2A_Vectors_hpp_ - -#include -#include -#include - -BEGIN_HADRONS_NAMESPACE - -//////////////////////////////// -// A2A Modes -//////////////////////////////// - -template -class A2AModesSchurDiagTwo -{ - private: - const std::vector *evec; - const std::vector *eval; - Matrix &action; - Solver &solver; - const int Nl, Nh; - const bool return_5d; - std::vector w_high_5d, v_high_5d, w_high_4d, v_high_4d; - - public: - A2AModesSchurDiagTwo(const std::vector *_evec, const std::vector *_eval, - Matrix &_action, - Solver &_solver, - const int _Nl, const int _Nh, - const bool _return_5d) - : evec(_evec), eval(_eval), - action(_action), - solver(_solver), - Nl(_Nl), Nh(_Nh), - return_5d(_return_5d) - { - init_resize(1, Nh); - if (return_5d) init_resize(Nh, Nh); - }; - - void init_resize(const size_t size_5d, const size_t size_4d) - { - GridBase *grid_5d = action.Grid(); - GridBase *grid_4d = action.GaugeGrid(); - - w_high_5d.resize(size_5d, grid_5d); - v_high_5d.resize(size_5d, grid_5d); - - w_high_4d.resize(size_4d, grid_4d); - v_high_4d.resize(size_4d, grid_4d); - } - - int get_Nh(void) const - { - return Nh; - } - - int get_Nl(void) const - { - return Nl; - } - - void high_modes(Field &source_5d, Field &w_source_5d, Field &source_4d, int i) - { - int i5d; - LOG(Message) << "A2A high modes for i = " << i << std::endl; - i5d = 0; - if (return_5d) i5d = i; - this->high_mode_v(action, solver, source_5d, v_high_5d[i5d], v_high_4d[i]); - this->high_mode_w(w_source_5d, source_4d, w_high_5d[i5d], w_high_4d[i]); - } - - void return_v(int i, Field &vout_5d, Field &vout_4d) - { - if (i < Nl) - { - this->low_mode_v(action, evec->at(i), eval->at(i), vout_5d, vout_4d); - } - else - { - vout_4d = v_high_4d[i - Nl]; - if (!(return_5d)) i = Nl; - vout_5d = v_high_5d[i - Nl]; - } - } - void return_w(int i, Field &wout_5d, Field &wout_4d) - { - if (i < Nl) - { - this->low_mode_w(action, evec->at(i), eval->at(i), wout_5d, wout_4d); - } - else - { - wout_4d = w_high_4d[i - Nl]; - if (!(return_5d)) i = Nl; - wout_5d = w_high_5d[i - Nl]; - } - } - - void low_mode_v(Matrix &action, const Field &evec, const RealD &eval, Field &vout_5d, Field &vout_4d) - { - GridBase *grid = action.RedBlackGrid(); - Field src_o(grid); - Field sol_e(grid); - Field sol_o(grid); - Field tmp(grid); - - src_o = evec; - src_o.checkerboard = Odd; - pickCheckerboard(Even, sol_e, vout_5d); - pickCheckerboard(Odd, sol_o, vout_5d); - - ///////////////////////////////////////////////////// - // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i - ///////////////////////////////////////////////////// - action.MooeeInv(src_o, tmp); - assert(tmp.checkerboard == Odd); - action.Meooe(tmp, sol_e); - assert(sol_e.checkerboard == Even); - action.MooeeInv(sol_e, tmp); - assert(tmp.checkerboard == Even); - sol_e = (-1.0 / eval) * tmp; - assert(sol_e.checkerboard == Even); - - ///////////////////////////////////////////////////// - // v_io = (1/eval_i) * MooInv evec_i - ///////////////////////////////////////////////////// - action.MooeeInv(src_o, tmp); - assert(tmp.checkerboard == Odd); - sol_o = (1.0 / eval) * tmp; - assert(sol_o.checkerboard == Odd); - - setCheckerboard(vout_5d, sol_e); - assert(sol_e.checkerboard == Even); - setCheckerboard(vout_5d, sol_o); - assert(sol_o.checkerboard == Odd); - - action.ExportPhysicalFermionSolution(vout_5d, vout_4d); - } - - void low_mode_w(Matrix &action, const Field &evec, const RealD &eval, Field &wout_5d, Field &wout_4d) - { - GridBase *grid = action.RedBlackGrid(); - SchurDiagTwoOperator _HermOpEO(action); - - Field src_o(grid); - Field sol_e(grid); - Field sol_o(grid); - Field tmp(grid); - - GridBase *fgrid = action.Grid(); - Field tmp_wout(fgrid); - - src_o = evec; - src_o.checkerboard = Odd; - pickCheckerboard(Even, sol_e, tmp_wout); - pickCheckerboard(Odd, sol_o, tmp_wout); - - ///////////////////////////////////////////////////// - // w_ie = - MeeInvDag MoeDag Doo evec_i - ///////////////////////////////////////////////////// - _HermOpEO.Mpc(src_o, tmp); - assert(tmp.checkerboard == Odd); - action.MeooeDag(tmp, sol_e); - assert(sol_e.checkerboard == Even); - action.MooeeInvDag(sol_e, tmp); - assert(tmp.checkerboard == Even); - sol_e = (-1.0) * tmp; - - ///////////////////////////////////////////////////// - // w_io = Doo evec_i - ///////////////////////////////////////////////////// - _HermOpEO.Mpc(src_o, sol_o); - assert(sol_o.checkerboard == Odd); - - setCheckerboard(tmp_wout, sol_e); - assert(sol_e.checkerboard == Even); - setCheckerboard(tmp_wout, sol_o); - assert(sol_o.checkerboard == Odd); - - action.DminusDag(tmp_wout, wout_5d); - - action.ExportPhysicalFermionSource(wout_5d, wout_4d); - } - - void high_mode_v(Matrix &action, Solver &solver, const Field &source, Field &vout_5d, Field &vout_4d) - { - GridBase *fgrid = action.Grid(); - solver(vout_5d, source); // Note: solver is solver(out, in) - action.ExportPhysicalFermionSolution(vout_5d, vout_4d); - } - - void high_mode_w(const Field &w_source_5d, const Field &source_4d, Field &wout_5d, Field &wout_4d) - { - wout_5d = w_source_5d; - wout_4d = source_4d; - } -}; - -// TODO: A2A for coarse eigenvectors - -// template -// class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo -// { -// private: -// const std::vector &subspace; -// const std::vector &evec_coarse; -// const std::vector &eval_coarse; -// Matrix &action; - -// public: -// A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) -// : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){}; - -// void operator()(int i, FineField &vout, FineField &wout) -// { -// FineField prom_evec(subspace[0]._grid); -// blockPromote(evec_coarse[i], prom_evec, subspace); -// this->low_mode_v(action, prom_evec, eval_coarse[i], vout); -// this->low_mode_w(action, prom_evec, eval_coarse[i], wout); -// } -// }; - -END_HADRONS_NAMESPACE - -#endif // A2A_Vectors_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/Makefile.am b/extras/Hadrons/Makefile.am index 7240be82..840c6fb5 100644 --- a/extras/Hadrons/Makefile.am +++ b/extras/Hadrons/Makefile.am @@ -14,7 +14,7 @@ libHadrons_a_SOURCES = \ libHadrons_adir = $(pkgincludedir)/Hadrons nobase_libHadrons_a_HEADERS = \ $(modules_hpp) \ - AllToAllVectors.hpp \ + A2AVectors.hpp \ Application.hpp \ EigenPack.hpp \ Environment.hpp \ diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index cee6858e..c2dd9007 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include BEGIN_HADRONS_NAMESPACE @@ -24,7 +24,8 @@ class A2AMesonFieldPar : Serializable int, cacheBlock, int, schurBlock, int, Nmom, - std::string, A2A, + std::string, v, + std::string, w, std::string, output); }; @@ -34,9 +35,6 @@ class TA2AMesonField : public Module public: FERM_TYPE_ALIASES(FImpl, ); SOLVER_TYPE_ALIASES(FImpl, ); - - typedef A2AModesSchurDiagTwo A2ABase; - public: // constructor TA2AMesonField(const std::string name); @@ -80,7 +78,7 @@ TA2AMesonField::TA2AMesonField(const std::string name) template std::vector TA2AMesonField::getInput(void) { - std::vector in = {par().A2A}; + std::vector in = {par().v, par().w}; return in; } @@ -97,20 +95,7 @@ std::vector TA2AMesonField::getOutput(void) // setup /////////////////////////////////////////////////////////////////////// template void TA2AMesonField::setup(void) -{ - auto &a2a = envGet(A2ABase, par().A2A); - int Ls = env().getObjectLs(par().A2A); - - // Four D fields - envTmp(std::vector, "w", 1, par().schurBlock, - FermionField(env().getGrid())); - envTmp(std::vector, "v", 1, par().schurBlock, - FermionField(env().getGrid())); - - // 5D tmp - envTmpLat(FermionField, "tmp_5d", Ls); -} - +{} ////////////////////////////////////////////////////////////////////////////////// // Cache blocked arithmetic routine @@ -304,7 +289,8 @@ void TA2AMesonField::execute(void) { LOG(Message) << "Computing A2A meson field" << std::endl; - auto &a2a = envGet(A2ABase, par().A2A); + auto &v = envGet(std::vector, par().v); + auto &w = envGet(std::vector, par().w); // 2+6+4+4 = 16 gammas // Ordering defined here @@ -330,15 +316,13 @@ void TA2AMesonField::execute(void) /////////////////////////////////////////////// // Square assumption for now Nl = Nr = N /////////////////////////////////////////////// - int nt = env().getDim(Tp); - int nx = env().getDim(Xp); - int ny = env().getDim(Yp); - int nz = env().getDim(Zp); - int Nl = a2a.get_Nl(); - int N = Nl + a2a.get_Nh(); - + int nt = env().getDim(Tp); + int nx = env().getDim(Xp); + int ny = env().getDim(Yp); + int nz = env().getDim(Zp); + int N_i = w.size(); + int N_j = v.size(); int ngamma = gammas.size(); - int schurBlock = par().schurBlock; int cacheBlock = par().cacheBlock; int nmom = par().Nmom; @@ -353,14 +337,8 @@ void TA2AMesonField::execute(void) phases[m] = Complex(1.0); // All zero momentum for now } - Eigen::Tensor mesonField (nmom,ngamma,nt,N,N); - LOG(Message) << "N = Nh+Nl for A2A MesonField is " << N << std::endl; - - envGetTmp(std::vector, w); - envGetTmp(std::vector, v); - envGetTmp(FermionField, tmp_5d); - - LOG(Message) << "Finding v and w vectors for N = " << N << std::endl; + Eigen::Tensor mesonField(nmom,ngamma,nt,N_i,N_j); + LOG(Message) << "MesonField size " << N_i << "x" << N_j << "x" << nt << std::endl; ////////////////////////////////////////////////////////////////////////// // i,j is first loop over SchurBlock factors reusing 5D matrices @@ -379,10 +357,10 @@ void TA2AMesonField::execute(void) double t_int_2=0; double t_int_3=0; - double t0 = usecond(); - int N_i = N; - int N_j = N; - + double t0 = usecond(); + int NBlock_i = N_i/schurBlock + (((N_i % schurBlock) != 0) ? 1 : 0); + int NBlock_j = N_j/schurBlock + (((N_j % schurBlock) != 0) ? 1 : 0); + for(int i=0;i::execute(void) int N_jj = MIN(N_j-j,schurBlock); t_schur-=usecond(); - for(int ii =0;ii < N_ii;ii++) a2a.return_w(i+ii, tmp_5d, w[ii]); - for(int jj =0;jj < N_jj;jj++) a2a.return_v(j+jj, tmp_5d, v[jj]); t_schur+=usecond(); - LOG(Message) << "Found w vectors " << i <<" .. " << i+N_ii-1 << std::endl; - LOG(Message) << "Found v vectors " << j <<" .. " << j+N_jj-1 << std::endl; + LOG(Message) << "Meson field block " + << j/schurBlock + NBlock_j*i/schurBlock + 1 + << "/" << NBlock_i*NBlock_j << " [" << i <<" .. " + << i+N_ii-1 << ", " << j <<" .. " << j+N_jj-1 << "]" + << std::endl; /////////////////////////////////////////////////////////////// // Series of cache blocked chunks of the contractions within this SchurBlock @@ -411,11 +390,11 @@ void TA2AMesonField::execute(void) Eigen::Tensor mesonFieldBlocked(nmom,ngamma,nt,N_iii,N_jjj); t_contr-=usecond(); - MesonField(mesonFieldBlocked, &w[ii], &v[jj], gammas, phases,Tp, - t_int_0,t_int_1,t_int_2,t_int_3); + MesonField(mesonFieldBlocked, &w[i+ii], &v[j+jj], gammas, phases,Tp, + t_int_0,t_int_1,t_int_2,t_int_3); t_contr+=usecond(); + // flops for general N_c & N_s flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; - bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; @@ -435,17 +414,17 @@ void TA2AMesonField::execute(void) double nodes=grid->NodeCount(); double t1 = usecond(); - LOG(Message) << " Contraction of MesonFields took "<<(t1-t0)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Schur "<<(t_schur)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Contr "<<(t_contr)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern0 "<<(t_int_0)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern1 "<<(t_int_1)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern2 "<<(t_int_2)/1.0e6<< " seconds " << std::endl; - LOG(Message) << " Intern3 "<<(t_int_3)/1.0e6<< " seconds " << std::endl; + LOG(Message) << "Contraction of MesonFields took "<<(t1-t0)/1.0e6<< " s" << std::endl; + LOG(Message) << " Schur " << (t_schur)/1.0e6 << " s" << std::endl; + LOG(Message) << " Contr " << (t_contr)/1.0e6 << " s" << std::endl; + LOG(Message) << " Intern0 " << (t_int_0)/1.0e6 << " s" << std::endl; + LOG(Message) << " Intern1 " << (t_int_1)/1.0e6 << " s" << std::endl; + LOG(Message) << " Intern2 " << (t_int_2)/1.0e6 << " s" << std::endl; + LOG(Message) << " Intern3 " << (t_int_3)/1.0e6 << " s" << std::endl; double t_kernel = t_int_0 + t_int_1; - LOG(Message) << " Arith "<::execute(void) ///////////////////////////////////////////////////////////////////////// std::vector corr(nt,ComplexD(0.0)); - for(int i=0;i #include #include -#include +#include #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * A2AVectors * + * Create all-to-all vector class * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MSolver) @@ -21,7 +21,6 @@ class A2AVectorsPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AVectorsPar, bool, return_5d, - int, Nl, std::string, noise, std::string, action, std::string, eigenPack, @@ -34,7 +33,7 @@ class TA2AVectors : public Module public: FERM_TYPE_ALIASES(FImpl,); SOLVER_TYPE_ALIASES(FImpl,); - typedef A2AModesSchurDiagTwo A2ABase; + typedef A2AVectorsSchurDiagTwo A2A; public: // constructor TA2AVectors(const std::string name); @@ -42,12 +41,14 @@ public: virtual ~TA2AVectors(void) {}; // dependency relation virtual std::vector getInput(void); - virtual std::vector getReference(void); virtual std::vector getOutput(void); // setup virtual void setup(void); // execution virtual void execute(void); +private: + std::string solverName_; + unsigned int Nl_{0}; }; MODULE_REGISTER_TMP(A2AVectors, @@ -68,32 +69,24 @@ TA2AVectors::TA2AVectors(const std::string name) template std::vector TA2AVectors::getInput(void) { - int Nl = par().Nl; - std::string sub_string = ""; - if (Nl > 0) sub_string = "_subtract"; + std::string sub_string; + std::vector in; - std::vector in = {par().solver + sub_string, par().noise}; + if (!par().eigenPack.empty()) + { + in.push_back(par().eigenPack); + sub_string = (!par().eigenPack.empty()) ? "_subtract" : ""; + } + in.push_back(par().solver + sub_string); + in.push_back(par().noise); return in; } -template -std::vector TA2AVectors::getReference(void) -{ - std::vector ref = {par().action}; - - if (!par().eigenPack.empty()) - { - ref.push_back(par().eigenPack); - } - - return ref; -} - template std::vector TA2AVectors::getOutput(void) { - std::vector out = {getName()}; + std::vector out = {getName() + "_v", getName() + "_w"}; return out; } @@ -102,102 +95,143 @@ std::vector TA2AVectors::getOutput(void) template void TA2AVectors::setup(void) { - int Nl = par().Nl; - bool return_5d = par().return_5d; - auto &noise = envGet(DilutedNoise, par().noise); - int Ls; + bool hasLowModes = (!par().eigenPack.empty()); + std::string sub_string = (hasLowModes) ? "_subtract" : ""; + bool return_5d = par().return_5d; + auto &noise = envGet(DilutedNoise, par().noise); + auto &action = envGet(FMat, par().action); + auto &solver = envGet(Solver, par().solver + sub_string); + int Ls = env().getObjectLs(par().action); - std::string sub_string = ""; - if (Nl > 0) sub_string = "_subtract"; - auto &solver = envGet(Solver, par().solver + sub_string); - Ls = env().getObjectLs(par().solver + sub_string); - - auto &action = envGet(FMat, par().action); - - envTmpLat(FermionField, "ferm_src", Ls); - envTmpLat(FermionField, "unphys_ferm", Ls); - envTmpLat(FermionField, "tmp"); - - std::vector *evec; - const std::vector *eval; - - if (Nl > 0) + LOG(Message) << "Creating all-to-all vectors "; + if (hasLowModes) { - // Low modes auto &epack = envGet(Pack, par().eigenPack); - - LOG(Message) << "Creating a2a vectors " << getName() << - " using eigenpack '" << par().eigenPack << "' (" - << epack.evec.size() << " modes)" << - " and " << noise.size() << " high modes." << std::endl; - evec = &epack.evec; - eval = &epack.eval; + + Nl_ = epack.evec.size(); + std::cout << " using eigenpack '" << par().eigenPack << "' (" + << Nl_ << " low modes) and noise '" + << par().noise << "' (" << noise.size() + << " noise vectors)" << std::endl; } else { - LOG(Message) << "Creating a2a vectors " << getName() << - " using " << noise.size() << " high modes only." << std::endl; + std::cout << " using noise '" << par().noise << "' (" << noise.size() + << " noise vectors)" << std::endl; } - - envCreate(A2ABase, getName(), Ls, evec, eval, action, solver, Nl, noise.size(), - return_5d); + envCreate(std::vector, getName() + "_v", 1, + Nl_ + noise.size(), FermionField(env().getGrid())); + envCreate(std::vector, getName() + "_w", 1, + Nl_ + noise.size(), FermionField(env().getGrid())); + if (Ls > 1) + { + envTmpLat(FermionField, "f5", Ls); + } + envTmp(A2A, "a2a", 1, action, solver); } // execution /////////////////////////////////////////////////////////////////// template void TA2AVectors::execute(void) { - auto &action = envGet(FMat, par().action); - auto &noise = envGet(DilutedNoise, par().noise); + std::string sub_string = (Nl_ > 0) ? "_subtract" : ""; + auto &action = envGet(FMat, par().action); + auto &solver = envGet(Solver, par().solver + sub_string); + auto &noise = envGet(DilutedNoise, par().noise); + auto &v = envGet(std::vector, getName() + "_v"); + auto &w = envGet(std::vector, getName() + "_w"); + int Ls = env().getObjectLs(par().action); - int Ls; - int Nl = par().Nl; - - std::string sub_string = ""; - if (Nl > 0) sub_string = "_subtract"; - Ls = env().getObjectLs(par().solver + sub_string); - - auto &a2areturn = envGet(A2ABase, getName()); - - // High modes - envGetTmp(FermionField, ferm_src); - envGetTmp(FermionField, unphys_ferm); - envGetTmp(FermionField, tmp); - for (unsigned int i = 0; i < noise.size(); i++) + envGetTmp(A2A, a2a); + // Low modes + for (unsigned int il = 0; il < Nl_; il++) { - LOG(Message) << "A2A src for noise vector " << i << std::endl; - // source conversion for 4D sources - if (!env().isObject5d(par().noise)) + auto &epack = envGet(Pack, par().eigenPack); + + LOG(Message) << "V vector i = " << il << " (low mode)" << std::endl; + if (Ls == 1) { - if (Ls == 1) - { - ferm_src = noise[i]; - tmp = ferm_src; - } - else - { - tmp = noise[i]; - action.ImportPhysicalFermionSource(noise[i], ferm_src); - action.ImportUnphysicalFermion(noise[i], unphys_ferm); - } + a2a.makeLowModeV(v[il], epack.evec[il], epack.eval[il]); } - // source conversion for 5D sources else { - if (Ls != env().getObjectLs(par().noise)) - { - HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); - } - else - { - ferm_src = noise[i]; - action.ExportPhysicalFermionSolution(ferm_src, tmp); - unphys_ferm = ferm_src; - } + envGetTmp(FermionField, f5); + a2a.makeLowModeV5D(v[il], f5, epack.evec[il], epack.eval[il]); } - LOG(Message) << "solveHighMode i = " << i << std::endl; - a2areturn.high_modes(ferm_src, unphys_ferm, tmp, i); + LOG(Message) << "W vector i = " << il << " (low mode)" << std::endl; + if (Ls == 1) + { + a2a.makeLowModeW(w[il], epack.evec[il], epack.eval[il]); + } + else + { + envGetTmp(FermionField, f5); + a2a.makeLowModeW5D(w[il], f5, epack.evec[il], epack.eval[il]); + } } + + // High modes + for (unsigned int ih = 0; ih < noise.size(); ih++) + { + LOG(Message) << "V vector i = " << Nl_ + ih + << " (" << ((Nl_ > 0) ? "high " : "") + << "stochastic mode)" << std::endl; + if (Ls == 1) + { + a2a.makeHighModeV(v[Nl_ + ih], noise[ih]); + } + else + { + envGetTmp(FermionField, f5); + a2a.makeHighModeV5D(v[Nl_ + ih], f5, noise[ih]); + std::cout << norm2(v[Nl_ + ih]) << std::endl; + } + LOG(Message) << "W vector i = " << Nl_ + ih + << " (" << ((Nl_ > 0) ? "high " : "") + << "stochastic mode)" << std::endl; + if (Ls == 1) + { + a2a.makeHighModeW(w[Nl_ + ih], noise[ih]); + } + else + { + envGetTmp(FermionField, f5); + a2a.makeHighModeW5D(w[Nl_ + ih], f5, noise[ih]); + std::cout << norm2(w[Nl_ + ih]) << std::endl; + } + } + + + // // source conversion for 4D sources + // if (!env().isObject5d(par().noise)) + // { + // if (Ls == 1) + // { + // ferm_src = noise[ih]; + // tmp = ferm_src; + // } + // else + // { + // tmp = noise[ih]; + // action.ImportPhysicalFermionSource(noise[ih], ferm_src); + // action.ImportUnphysicalFermion(noise[ih], unphys_ferm); + // } + // } + // // source conversion for 5D sources + // else + // { + // if (Ls != env().getObjectLs(par().noise)) + // { + // HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); + // } + // else + // { + // ferm_src = noise[ih]; + // action.ExportPhysicalFermionSolution(ferm_src, tmp); + // unphys_ferm = ferm_src; + // } + // } + // a2a.high_modes(ih, ferm_src, unphys_ferm, tmp, solver); } END_MODULE_NAMESPACE From b2de26589b491cf92981f25f75ab46a6c317abdc Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 7 Aug 2018 18:40:48 +0100 Subject: [PATCH 426/620] Hadrons: code cleaning and copyright update --- extras/Hadrons/A2AVectors.hpp | 226 +++--------------- extras/Hadrons/DilutedNoise.hpp | 27 +++ extras/Hadrons/Modules/MAction/MobiusDWF.cc | 27 +++ extras/Hadrons/Modules/MAction/MobiusDWF.hpp | 27 +++ extras/Hadrons/Modules/MAction/ScaledDWF.cc | 27 +++ extras/Hadrons/Modules/MAction/ScaledDWF.hpp | 27 +++ .../Modules/MContraction/A2AMesonField.cc | 27 +++ .../Modules/MContraction/A2AMesonField.hpp | 31 ++- extras/Hadrons/Modules/MContraction/Meson.hpp | 1 + extras/Hadrons/Modules/MFermion/FreeProp.cc | 3 +- extras/Hadrons/Modules/MFermion/FreeProp.hpp | 3 +- extras/Hadrons/Modules/MGauge/StochEm.cc | 2 +- extras/Hadrons/Modules/MGauge/StochEm.hpp | 2 +- .../Hadrons/Modules/MGauge/StoutSmearing.cc | 27 +++ .../Hadrons/Modules/MGauge/StoutSmearing.hpp | 27 +++ extras/Hadrons/Modules/MGauge/UnitEm.cc | 7 +- extras/Hadrons/Modules/MGauge/UnitEm.hpp | 7 +- .../MNoise/TimeDilutedSpinColorDiagonal.cc | 27 +++ .../MNoise/TimeDilutedSpinColorDiagonal.hpp | 27 +++ .../Hadrons/Modules/MScalar/ChargedProp.hpp | 2 +- extras/Hadrons/Modules/MScalar/ScalarVP.cc | 27 +++ extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 27 +++ .../Hadrons/Modules/MScalar/VPCounterTerms.cc | 27 +++ .../Modules/MScalar/VPCounterTerms.hpp | 27 +++ .../Modules/MScalarSUN/StochFreeField.cc | 27 +++ .../Modules/MScalarSUN/StochFreeField.hpp | 27 +++ .../Modules/MScalarSUN/TimeMomProbe.cc | 27 +++ .../Modules/MScalarSUN/TimeMomProbe.hpp | 27 +++ .../Hadrons/Modules/MScalarSUN/TwoPointNPR.cc | 27 +++ .../Modules/MScalarSUN/TwoPointNPR.hpp | 27 +++ extras/Hadrons/Modules/MSolver/A2AVectors.cc | 28 +++ extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 65 +++-- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 1 + extras/Hadrons/Solver.hpp | 2 +- 34 files changed, 671 insertions(+), 249 deletions(-) diff --git a/extras/Hadrons/A2AVectors.hpp b/extras/Hadrons/A2AVectors.hpp index 745ef94f..82ed502e 100644 --- a/extras/Hadrons/A2AVectors.hpp +++ b/extras/Hadrons/A2AVectors.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/A2AVectors.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef A2A_Vectors_hpp_ #define A2A_Vectors_hpp_ @@ -183,205 +210,6 @@ void A2AVectorsSchurDiagTwo::makeHighModeW5D(FermionField &wout_4d, } } - - // A2AVectorsSchurDiagTwo(const int Nl, const int Nh, - // std::vector &v, - // std::vector &w, - // const bool _return_5d) - // : Nl(_Nl), Nh(_Nh), - // return_5d(_return_5d) - // { - // if (!return_5d) - // { - // init_resize(1, Nl + Nh); - // } - // else - // { - // init_resize(Nl + Nh, Nl + Nh); - // } - // } - - // void init_resize(const size_t size_5d, const size_t size_4d, - // GridBase *grid_5d, GridBase *grid_4d) - // { - // w_5d.resize(size_5d, grid_5d); - // v_5d.resize(size_5d, grid_5d); - // w_4d.resize(size_4d, grid_4d); - // v_4d.resize(size_4d, grid_4d); - // } - - // int get_Nh(void) const - // { - // return Nh; - // } - - // int get_Nl(void) const - // { - // return Nl; - // } - - // void low_modes(int il, const Field &evec, const Real &eval, Matrix &action) - // { - // int i5d; - - // i5d = 0; - // if (return_5d) i5d = il; - // this->low_mode_v(v_5d[i5d], v_4d[il], evec, eval, action); - // this->low_mode_w(w_5d[i5d], w_4d[il], evec, eval, action); - // } - - // void high_modes(int ih, Field &source_5d, Field &w_source_5d, - // Field &source_4d, Solver &solver) - // { - // int i5d; - - // i5d = 0; - // if (return_5d) i5d = ih + Nl; - // this->high_mode_v(source_5d, v_5d[i5d], v_4d[ih + Nl], solver); - // this->high_mode_w(w_source_5d, source_4d, w_5d[i5d], w_4d[ih + Nl]); - // } - - // void return_v(int i, Field &vout_5d, Field &vout_4d) - // { - // vout_4d = v_4d[i]; - // if (!(return_5d)) i = 0; - // vout_5d = v_5d[i]; - // } - - // void return_w(int i, Field &wout_5d, Field &wout_4d) - // { - // wout_4d = w_4d[i]; - // if (!(return_5d)) i = 0; - // wout_5d = w_5d[i]; - // } - - // void low_mode_v(Field &vout_5d, Field &vout_4d, const Field &evec, - // const Real &eval, Matrix &action) - // { - // GridBase *grid = action.RedBlackGrid(); - // Field src_o(grid); - // Field sol_e(grid); - // Field sol_o(grid); - // Field tmp(grid); - - // src_o = evec; - // src_o.checkerboard = Odd; - // pickCheckerboard(Even, sol_e, vout_5d); - // pickCheckerboard(Odd, sol_o, vout_5d); - - // ///////////////////////////////////////////////////// - // // v_ie = -(1/eval_i) * MeeInv Meo MooInv evec_i - // ///////////////////////////////////////////////////// - // action.MooeeInv(src_o, tmp); - // assert(tmp.checkerboard == Odd); - // action.Meooe(tmp, sol_e); - // assert(sol_e.checkerboard == Even); - // action.MooeeInv(sol_e, tmp); - // assert(tmp.checkerboard == Even); - // sol_e = (-1.0 / eval) * tmp; - // assert(sol_e.checkerboard == Even); - - // ///////////////////////////////////////////////////// - // // v_io = (1/eval_i) * MooInv evec_i - // ///////////////////////////////////////////////////// - // action.MooeeInv(src_o, tmp); - // assert(tmp.checkerboard == Odd); - // sol_o = (1.0 / eval) * tmp; - // assert(sol_o.checkerboard == Odd); - - // setCheckerboard(vout_5d, sol_e); - // assert(sol_e.checkerboard == Even); - // setCheckerboard(vout_5d, sol_o); - // assert(sol_o.checkerboard == Odd); - - // action.ExportPhysicalFermionSolution(vout_5d, vout_4d); - // } - - // void low_mode_w(Field &wout_5d, Field &wout_4d, const Field &evec, - // const Real &eval, Matrix &action) - // { - // GridBase *grid = action.RedBlackGrid(); - // SchurDiagTwoOperator _HermOpEO(action); - - // Field src_o(grid); - // Field sol_e(grid); - // Field sol_o(grid); - // Field tmp(grid); - - // GridBase *fgrid = action.Grid(); - // Field tmp_wout(fgrid); - - // src_o = evec; - // src_o.checkerboard = Odd; - // pickCheckerboard(Even, sol_e, tmp_wout); - // pickCheckerboard(Odd, sol_o, tmp_wout); - - // ///////////////////////////////////////////////////// - // // w_ie = - MeeInvDag MoeDag Doo evec_i - // ///////////////////////////////////////////////////// - // _HermOpEO.Mpc(src_o, tmp); - // assert(tmp.checkerboard == Odd); - // action.MeooeDag(tmp, sol_e); - // assert(sol_e.checkerboard == Even); - // action.MooeeInvDag(sol_e, tmp); - // assert(tmp.checkerboard == Even); - // sol_e = (-1.0) * tmp; - - // ///////////////////////////////////////////////////// - // // w_io = Doo evec_i - // ///////////////////////////////////////////////////// - // _HermOpEO.Mpc(src_o, sol_o); - // assert(sol_o.checkerboard == Odd); - - // setCheckerboard(tmp_wout, sol_e); - // assert(sol_e.checkerboard == Even); - // setCheckerboard(tmp_wout, sol_o); - // assert(sol_o.checkerboard == Odd); - - // action.DminusDag(tmp_wout, wout_5d); - - // action.ExportPhysicalFermionSource(wout_5d, wout_4d); - // } - - // void high_mode_v(const Field &source, Field &vout_5d, Field &vout_4d, - // Matrix &action, Solver &solver) - // { - // GridBase *fgrid = action.Grid(); - // solver(vout_5d, source); // Note: solver is solver(out, in) - // action.ExportPhysicalFermionSolution(vout_5d, vout_4d); - // } - - // void high_mode_w(const Field &w_source_5d, const Field &source_4d, - // Field &wout_5d, Field &wout_4d) - // { - // wout_5d = w_source_5d; - // wout_4d = source_4d; - // } - -// TODO: A2A for coarse eigenvectors - -// template -// class A2ALMSchurDiagTwoCoarse : public A2AModesSchurDiagTwo -// { -// private: -// const std::vector &subspace; -// const std::vector &evec_coarse; -// const std::vector &eval_coarse; -// Matrix &action; - -// public: -// A2ALMSchurDiagTwoCoarse(const std::vector &_subspace, const std::vector &_evec_coarse, const std::vector &_eval_coarse, Matrix &_action) -// : subspace(_subspace), evec_coarse(_evec_coarse), eval_coarse(_eval_coarse), action(_action){}; - -// void operator()(int i, FineField &vout, FineField &wout) -// { -// FineField prom_evec(subspace[0]._grid); -// blockPromote(evec_coarse[i], prom_evec, subspace); -// this->low_mode_v(action, prom_evec, eval_coarse[i], vout); -// this->low_mode_w(action, prom_evec, eval_coarse[i], wout); -// } -// }; - END_HADRONS_NAMESPACE #endif // A2A_Vectors_hpp_ \ No newline at end of file diff --git a/extras/Hadrons/DilutedNoise.hpp b/extras/Hadrons/DilutedNoise.hpp index a284d46b..16561c99 100644 --- a/extras/Hadrons/DilutedNoise.hpp +++ b/extras/Hadrons/DilutedNoise.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/DilutedNoise.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_DilutedNoise_hpp_ #define Hadrons_DilutedNoise_hpp_ diff --git a/extras/Hadrons/Modules/MAction/MobiusDWF.cc b/extras/Hadrons/Modules/MAction/MobiusDWF.cc index 8c138bca..9cc4755a 100644 --- a/extras/Hadrons/Modules/MAction/MobiusDWF.cc +++ b/extras/Hadrons/Modules/MAction/MobiusDWF.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/MobiusDWF.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MAction/MobiusDWF.hpp b/extras/Hadrons/Modules/MAction/MobiusDWF.hpp index a026a864..9cead7bd 100644 --- a/extras/Hadrons/Modules/MAction/MobiusDWF.hpp +++ b/extras/Hadrons/Modules/MAction/MobiusDWF.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/MobiusDWF.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MAction_MobiusDWF_hpp_ #define Hadrons_MAction_MobiusDWF_hpp_ diff --git a/extras/Hadrons/Modules/MAction/ScaledDWF.cc b/extras/Hadrons/Modules/MAction/ScaledDWF.cc index 19e7cf4c..40eed326 100644 --- a/extras/Hadrons/Modules/MAction/ScaledDWF.cc +++ b/extras/Hadrons/Modules/MAction/ScaledDWF.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/ScaledDWF.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MAction/ScaledDWF.hpp b/extras/Hadrons/Modules/MAction/ScaledDWF.hpp index 78127f6f..b75ff31d 100644 --- a/extras/Hadrons/Modules/MAction/ScaledDWF.hpp +++ b/extras/Hadrons/Modules/MAction/ScaledDWF.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MAction/ScaledDWF.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MAction_ScaledDWF_hpp_ #define Hadrons_MAction_ScaledDWF_hpp_ diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc index 5867b1dd..ffc45e22 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/A2AMesonField.cc + +Copyright (C) 2015-2018 + +Author: paboyle + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index c2dd9007..0f419186 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -1,3 +1,32 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/A2AMesonField.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Peter Boyle +Author: paboyle + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MContraction_A2AMesonField_hpp_ #define Hadrons_MContraction_A2AMesonField_hpp_ @@ -10,7 +39,7 @@ BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * A2AMesonField * + * All-to-all meson field creation * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MContraction) diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/extras/Hadrons/Modules/MContraction/Meson.hpp index 96d65512..66a19214 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/extras/Hadrons/Modules/MContraction/Meson.hpp @@ -8,6 +8,7 @@ Copyright (C) 2015-2018 Author: Antonin Portelli Author: Lanny91 +Author: Vera Guelpers 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 diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.cc b/extras/Hadrons/Modules/MFermion/FreeProp.cc index b8eb0529..7b3a0ce5 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.cc +++ b/extras/Hadrons/Modules/MFermion/FreeProp.cc @@ -6,8 +6,7 @@ Source file: extras/Hadrons/Modules/MFermion/FreeProp.cc Copyright (C) 2015-2018 -Author: Antonin Portelli -Author: Vera Guelpers +Author: Vera Guelpers 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 diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.hpp b/extras/Hadrons/Modules/MFermion/FreeProp.hpp index 4e448188..6538e09d 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/FreeProp.hpp @@ -6,7 +6,8 @@ Source file: extras/Hadrons/Modules/MFermion/FreeProp.hpp Copyright (C) 2015-2018 -Author: Vera Guelpers +Author: Antonin Portelli +Author: Vera Guelpers 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 diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index 1727706c..36d0be7c 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -7,7 +7,7 @@ Source file: extras/Hadrons/Modules/MGauge/StochEm.cc Copyright (C) 2015-2018 Author: Antonin Portelli -Author: James Harrison +Author: James Harrison Author: Vera Guelpers This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/extras/Hadrons/Modules/MGauge/StochEm.hpp index 5eb9f1e9..fd07c294 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/extras/Hadrons/Modules/MGauge/StochEm.hpp @@ -7,7 +7,7 @@ Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp Copyright (C) 2015-2018 Author: Antonin Portelli -Author: James Harrison +Author: James Harrison Author: Vera Guelpers This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MGauge/StoutSmearing.cc b/extras/Hadrons/Modules/MGauge/StoutSmearing.cc index 161e74aa..3dae8428 100644 --- a/extras/Hadrons/Modules/MGauge/StoutSmearing.cc +++ b/extras/Hadrons/Modules/MGauge/StoutSmearing.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MGauge/StoutSmearing.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp b/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp index 66406f5b..ddfc1a73 100644 --- a/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp +++ b/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MGauge/StoutSmearing.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MGauge_StoutSmearing_hpp_ #define Hadrons_MGauge_StoutSmearing_hpp_ diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index 6260f10a..6b3be47e 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -2,12 +2,11 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/StochEm.cc +Source file: extras/Hadrons/Modules/MGauge/UnitEm.cc -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 -Author: James Harrison +Author: James Harrison 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 diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.hpp b/extras/Hadrons/Modules/MGauge/UnitEm.hpp index 07ee5bba..a9cb9dfa 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.hpp +++ b/extras/Hadrons/Modules/MGauge/UnitEm.hpp @@ -2,12 +2,11 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp +Source file: extras/Hadrons/Modules/MGauge/UnitEm.hpp -Copyright (C) 2015 -Copyright (C) 2016 +Copyright (C) 2015-2018 -Author: James Harrison +Author: James Harrison 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 diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc index 472a0b4d..50997962 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp index 7e2a471f..12340cbb 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_ #define Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_ diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp index 3ca7940f..5b2f0422 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/extras/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -7,7 +7,7 @@ Source file: extras/Hadrons/Modules/MScalar/ChargedProp.hpp Copyright (C) 2015-2018 Author: Antonin Portelli -Author: James Harrison +Author: James Harrison 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 diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index fdb9586e..d560ec5a 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/ScalarVP.cc + +Copyright (C) 2015-2018 + +Author: James Harrison + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include #include diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index 741325d1..e1b2dc3d 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/ScalarVP.hpp + +Copyright (C) 2015-2018 + +Author: James Harrison + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalar_ScalarVP_hpp_ #define Hadrons_MScalar_ScalarVP_hpp_ diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc index b3393679..86867788 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/VPCounterTerms.cc + +Copyright (C) 2015-2018 + +Author: James Harrison + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp index 99e1b1ce..a2ccbb56 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp + +Copyright (C) 2015-2018 + +Author: James Harrison + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalar_VPCounterTerms_hpp_ #define Hadrons_MScalar_VPCounterTerms_hpp_ diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc index 0be90022..db14d75d 100644 --- a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc +++ b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp index 75ef3fde..ea15f3ef 100644 --- a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_StochFreeField_hpp_ #define Hadrons_MScalarSUN_StochFreeField_hpp_ diff --git a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc index f22d08af..eaddd318 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc +++ b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp index 4807e865..80424936 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_TimeMomProbe_hpp_ #define Hadrons_MScalarSUN_TimeMomProbe_hpp_ diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc index 70fb2445..712f86d8 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp index 4c2cdb0d..48dddd4f 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MScalarSUN_TwoPointNPR_hpp_ #define Hadrons_MScalarSUN_TwoPointNPR_hpp_ diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.cc b/extras/Hadrons/Modules/MSolver/A2AVectors.cc index 477d0b72..a13920ff 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.cc +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.cc @@ -1,3 +1,31 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSolver/A2AVectors.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: fionnoh + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 9d2de4dd..27c0cca1 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -1,3 +1,31 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MSolver/A2AVectors.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: fionnoh + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MSolver_A2AVectors_hpp_ #define Hadrons_MSolver_A2AVectors_hpp_ @@ -12,7 +40,7 @@ BEGIN_HADRONS_NAMESPACE /****************************************************************************** - * Create all-to-all vector class * + * Create all-to-all V & W vectors * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MSolver) @@ -57,7 +85,7 @@ MODULE_REGISTER_TMP(ZA2AVectors, ARG(TA2AVectors>), MSolver); /****************************************************************************** - * TA2AVectors implementation * + * TA2AVectors implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template @@ -200,39 +228,8 @@ void TA2AVectors::execute(void) std::cout << norm2(w[Nl_ + ih]) << std::endl; } } - - - // // source conversion for 4D sources - // if (!env().isObject5d(par().noise)) - // { - // if (Ls == 1) - // { - // ferm_src = noise[ih]; - // tmp = ferm_src; - // } - // else - // { - // tmp = noise[ih]; - // action.ImportPhysicalFermionSource(noise[ih], ferm_src); - // action.ImportUnphysicalFermion(noise[ih], unphys_ferm); - // } - // } - // // source conversion for 5D sources - // else - // { - // if (Ls != env().getObjectLs(par().noise)) - // { - // HADRONS_ERROR(Size, "Ls mismatch between quark action and source"); - // } - // else - // { - // ferm_src = noise[ih]; - // action.ExportPhysicalFermionSolution(ferm_src, tmp); - // unphys_ferm = ferm_src; - // } - // } - // a2a.high_modes(ih, ferm_src, unphys_ferm, tmp, solver); } + END_MODULE_NAMESPACE END_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 347371a3..3b9a43c8 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -7,6 +7,7 @@ Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp Copyright (C) 2015-2018 Author: Antonin Portelli +Author: fionnoh 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 diff --git a/extras/Hadrons/Solver.hpp b/extras/Hadrons/Solver.hpp index 08867634..5d72e3d5 100644 --- a/extras/Hadrons/Solver.hpp +++ b/extras/Hadrons/Solver.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/EigenPack.hpp +Source file: extras/Hadrons/Solver.hpp Copyright (C) 2015-2018 From 0a4020eb4d8ea0625761ad8c0f1b3d321b117e38 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 7 Aug 2018 18:42:52 +0100 Subject: [PATCH 427/620] Hadrons: copyright fix --- extras/Hadrons/A2AVectors.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/Hadrons/A2AVectors.hpp b/extras/Hadrons/A2AVectors.hpp index 82ed502e..69440781 100644 --- a/extras/Hadrons/A2AVectors.hpp +++ b/extras/Hadrons/A2AVectors.hpp @@ -7,6 +7,7 @@ Source file: extras/Hadrons/A2AVectors.hpp Copyright (C) 2015-2018 Author: Antonin Portelli +Author: fionnoh 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 From ee5c0cc9b6a8cd123a98bb4f08d1f90b31d5caa4 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 8 Aug 2018 18:45:06 +0100 Subject: [PATCH 428/620] Hadrons: code cleaning --- extras/Hadrons/Environment.hpp | 2 +- .../Modules/MContraction/A2AMesonField.hpp | 56 +++++++++---------- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 30 ++++++---- extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | 2 +- 4 files changed, 48 insertions(+), 42 deletions(-) diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index 1e3cc17f..90f04e3b 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -279,7 +279,7 @@ T * Environment::getDerivedObject(const unsigned int address) const } else { - HADRONS_ERROR_REF(ObjectDefinition, "object with address " + + HADRONS_ERROR_REF(ObjectType, "object with address " + std::to_string(address) + " cannot be casted to '" + typeName(&typeid(T)) + "' (has type '" + typeName(&typeid(h->get())) + "')", address); diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 0f419186..cb5ba957 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -355,6 +355,7 @@ void TA2AMesonField::execute(void) int schurBlock = par().schurBlock; int cacheBlock = par().cacheBlock; int nmom = par().Nmom; + std::vector corr(nt,ComplexD(0.0)); /////////////////////////////////////////////// // Momentum setup @@ -427,17 +428,36 @@ void TA2AMesonField::execute(void) bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; + ///////////////////////////////////////////////////////////////////////// + // Test: Build the pion correlator (two end) + // < PI_ij(t0) PI_ji (t0+t) > + ///////////////////////////////////////////////////////////////////////// + parallel_for_nest2(int iii=0;iii< N_iii;iii++) + for(int jjj=0;jjj< N_jjj;jjj++) + { + int m=0; // first momentum + int g=0; // first gamma in above ordering is gamma5 for pion + + for(int t0=0;t0::execute(void) LOG(Message) << " Arith " << flops/(t_kernel)/1.0e3/nodes << " Gflop/s/ node " << std::endl; LOG(Message) << " Arith " << bytes/(t_kernel)/1.0e3/nodes << " GB/s/node " << std::endl; - ///////////////////////////////////////////////////////////////////////// - // Test: Build the pion correlator (two end) - // < PI_ij(t0) PI_ji (t0+t) > - ///////////////////////////////////////////////////////////////////////// - std::vector corr(nt,ComplexD(0.0)); - - for(int i=0;i::setup(void) auto &solver = envGet(Solver, par().solver + sub_string); int Ls = env().getObjectLs(par().action); - LOG(Message) << "Creating all-to-all vectors "; if (hasLowModes) { auto &epack = envGet(Pack, par().eigenPack); - Nl_ = epack.evec.size(); - std::cout << " using eigenpack '" << par().eigenPack << "' (" - << Nl_ << " low modes) and noise '" - << par().noise << "' (" << noise.size() - << " noise vectors)" << std::endl; - } - else - { - std::cout << " using noise '" << par().noise << "' (" << noise.size() - << " noise vectors)" << std::endl; } envCreate(std::vector, getName() + "_v", 1, Nl_ + noise.size(), FermionField(env().getGrid())); @@ -171,6 +159,24 @@ void TA2AVectors::execute(void) int Ls = env().getObjectLs(par().action); envGetTmp(A2A, a2a); + + if (hasLowModes) + { + auto &epack = envGet(Pack, par().eigenPack); + + Nl_ = epack.evec.size(); + LOG(Message) << "Computing all-to-all vectors " + << " using eigenpack '" << par().eigenPack << "' (" + << Nl_ << " low modes) and noise '" + << par().noise << "' (" << noise.size() + << " noise vectors)" << std::endl; + } + else + { + LOG(Message) << "Computing all-to-all vectors " + << " using noise '" << par().noise << "' (" << noise.size() + << " noise vectors)" << std::endl; + } // Low modes for (unsigned int il = 0; il < Nl_; il++) { diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index 3b9a43c8..8bcd3968 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -159,7 +159,7 @@ void TRBPrecCG::setup(void) guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse, epack.evalCoarse)); } - catch (Exceptions::Definition &e) + catch (Exceptions::ObjectType &e) { auto &epack = envGet(EPack, par().eigenPack); From 41d4e37baee3c01bd1f3f9ac37d5be580c73de47 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 8 Aug 2018 19:04:44 +0100 Subject: [PATCH 429/620] Hadrons: more cleaning --- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 828c888d..69d7f295 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -124,7 +124,6 @@ void TA2AVectors::setup(void) { bool hasLowModes = (!par().eigenPack.empty()); std::string sub_string = (hasLowModes) ? "_subtract" : ""; - bool return_5d = par().return_5d; auto &noise = envGet(DilutedNoise, par().noise); auto &action = envGet(FMat, par().action); auto &solver = envGet(Solver, par().solver + sub_string); @@ -160,11 +159,8 @@ void TA2AVectors::execute(void) envGetTmp(A2A, a2a); - if (hasLowModes) + if (Nl_ > 0) { - auto &epack = envGet(Pack, par().eigenPack); - - Nl_ = epack.evec.size(); LOG(Message) << "Computing all-to-all vectors " << " using eigenpack '" << par().eigenPack << "' (" << Nl_ << " low modes) and noise '" From 6d2df9de79ffdc06dabd2f70cdc9d68d7cb06382 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 8 Aug 2018 23:15:55 +0100 Subject: [PATCH 430/620] Hadrons: even more cleaning --- .../Modules/MContraction/A2AMesonField.hpp | 37 +++++++++---------- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 2 - 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index cb5ba957..6c537fb5 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -324,22 +324,22 @@ void TA2AMesonField::execute(void) // 2+6+4+4 = 16 gammas // Ordering defined here std::vector gammas ( { - Gamma::Algebra::Gamma5, - Gamma::Algebra::Identity, - Gamma::Algebra::GammaX, - Gamma::Algebra::GammaY, - Gamma::Algebra::GammaZ, - Gamma::Algebra::GammaT, - Gamma::Algebra::GammaXGamma5, - Gamma::Algebra::GammaYGamma5, - Gamma::Algebra::GammaZGamma5, - Gamma::Algebra::GammaTGamma5, - Gamma::Algebra::SigmaXY, - Gamma::Algebra::SigmaXZ, - Gamma::Algebra::SigmaXT, - Gamma::Algebra::SigmaYZ, - Gamma::Algebra::SigmaYT, - Gamma::Algebra::SigmaZT + Gamma::Algebra::Gamma5, + Gamma::Algebra::Identity, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaXGamma5, + Gamma::Algebra::GammaYGamma5, + Gamma::Algebra::GammaZGamma5, + Gamma::Algebra::GammaTGamma5, + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::SigmaZT }); /////////////////////////////////////////////// @@ -360,14 +360,13 @@ void TA2AMesonField::execute(void) /////////////////////////////////////////////// // Momentum setup /////////////////////////////////////////////// - GridBase *grid = env().getGrid(1); + GridBase *grid = env().getGrid(); std::vector phases(nmom,grid); + for(int m=0;m mesonField(nmom,ngamma,nt,N_i,N_j); LOG(Message) << "MesonField size " << N_i << "x" << N_j << "x" << nt << std::endl; ////////////////////////////////////////////////////////////////////////// diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 69d7f295..8a15b781 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -214,7 +214,6 @@ void TA2AVectors::execute(void) { envGetTmp(FermionField, f5); a2a.makeHighModeV5D(v[Nl_ + ih], f5, noise[ih]); - std::cout << norm2(v[Nl_ + ih]) << std::endl; } LOG(Message) << "W vector i = " << Nl_ + ih << " (" << ((Nl_ > 0) ? "high " : "") @@ -227,7 +226,6 @@ void TA2AVectors::execute(void) { envGetTmp(FermionField, f5); a2a.makeHighModeW5D(w[Nl_ + ih], f5, noise[ih]); - std::cout << norm2(w[Nl_ + ih]) << std::endl; } } } From dcdd891d7d2cda8b7b643beddcac034947ece0e3 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 9 Aug 2018 00:13:53 +0100 Subject: [PATCH 431/620] Hadrons: precision fix --- extras/Hadrons/Modules/MFermion/FreeProp.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.hpp b/extras/Hadrons/Modules/MFermion/FreeProp.hpp index 6538e09d..1b7ddb9a 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.hpp +++ b/extras/Hadrons/Modules/MFermion/FreeProp.hpp @@ -167,7 +167,7 @@ void TFreeProp::execute(void) } } sol = zero; - std::vector twist = strToVec(par().twist); + std::vector twist = strToVec(par().twist); if(twist.size() != Nd) HADRONS_ERROR(Size, "number of twist angles does not match number of dimensions"); mat.FreePropagator(source,sol,mass,twist); FermToProp(prop, sol, s, c); From d0244a059f77d337eae9c22cff60844c9c1163f6 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 9 Aug 2018 00:38:17 +0100 Subject: [PATCH 432/620] Hadrons: cleaning cleaning... --- extras/Hadrons/A2AVectors.hpp | 30 +++++++++++-------- extras/Hadrons/Global.hpp | 3 ++ extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/extras/Hadrons/A2AVectors.hpp b/extras/Hadrons/A2AVectors.hpp index 69440781..4cbc7f2a 100644 --- a/extras/Hadrons/A2AVectors.hpp +++ b/extras/Hadrons/A2AVectors.hpp @@ -35,10 +35,9 @@ See the full license in the file "LICENSE" in the top level distribution directo BEGIN_HADRONS_NAMESPACE -//////////////////////////////// -// A2A Modes -//////////////////////////////// - +/****************************************************************************** + * Classes to generate V & W all-to-all vectors * + ******************************************************************************/ template class A2AVectorsSchurDiagTwo { @@ -48,14 +47,20 @@ public: public: A2AVectorsSchurDiagTwo(FMat &action, Solver &solver); virtual ~A2AVectorsSchurDiagTwo(void) = default; - void makeLowModeV(FermionField &vout, const FermionField &evec, const Real &eval); - void makeLowModeV5D(FermionField &vout_4d, FermionField &vout_5d, const FermionField &evec, const Real &eval); - void makeLowModeW(FermionField &wout, const FermionField &evec, const Real &eval); - void makeLowModeW5D(FermionField &wout_4d, FermionField &wout_5d, const FermionField &evec, const Real &eval); + void makeLowModeV(FermionField &vout, + const FermionField &evec, const Real &eval); + void makeLowModeV5D(FermionField &vout_4d, FermionField &vout_5d, + const FermionField &evec, const Real &eval); + void makeLowModeW(FermionField &wout, + const FermionField &evec, const Real &eval); + void makeLowModeW5D(FermionField &wout_4d, FermionField &wout_5d, + const FermionField &evec, const Real &eval); void makeHighModeV(FermionField &vout, const FermionField &noise); - void makeHighModeV5D(FermionField &vout_4d, FermionField &vout_5d, const FermionField &noise_5d); + void makeHighModeV5D(FermionField &vout_4d, FermionField &vout_5d, + const FermionField &noise_5d); void makeHighModeW(FermionField &wout, const FermionField &noise); - void makeHighModeW5D(FermionField &vout_5d, FermionField &wout_5d, const FermionField &noise_5d); + void makeHighModeW5D(FermionField &vout_5d, FermionField &wout_5d, + const FermionField &noise_5d); private: FMat &action_; Solver &solver_; @@ -65,6 +70,9 @@ private: SchurDiagTwoOperator op_; }; +/****************************************************************************** + * A2AVectorsSchurDiagTwo template implementation * + ******************************************************************************/ template A2AVectorsSchurDiagTwo::A2AVectorsSchurDiagTwo(FMat &action, Solver &solver) : action_(action) @@ -107,7 +115,6 @@ void A2AVectorsSchurDiagTwo::makeLowModeV(FermionField &vout, const Fermi assert(tmp_.checkerboard == Odd); sol_o_ = (1.0 / eval) * tmp_; assert(sol_o_.checkerboard == Odd); - setCheckerboard(vout, sol_e_); assert(sol_e_.checkerboard == Even); setCheckerboard(vout, sol_o_); @@ -145,7 +152,6 @@ void A2AVectorsSchurDiagTwo::makeLowModeW(FermionField &wout, const Fermi ///////////////////////////////////////////////////// op_.Mpc(src_o_, sol_o_); assert(sol_o_.checkerboard == Odd); - setCheckerboard(wout, sol_e_); assert(sol_e_.checkerboard == Even); setCheckerboard(wout, sol_o_); diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index cf96ad9b..3ecf4308 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -206,6 +206,9 @@ void makeFileDir(const std::string filename, GridBase *g); #define _HADRONS_SCHUR_SOLVE_(conv) SchurRedBlack##conv##Solve #define HADRONS_SCHUR_SOLVE(conv) _HADRONS_SCHUR_SOLVE_(conv) #define HADRONS_DEFAULT_SCHUR_SOLVE HADRONS_SCHUR_SOLVE(HADRONS_DEFAULT_SCHUR) +#define _HADRONS_SCHUR_A2A_(conv) A2AVectorsSchur##conv +#define HADRONS_SCHUR_A2A(conv) _HADRONS_SCHUR_A2A_(conv) +#define HADRONS_DEFAULT_SCHUR_A2A HADRONS_SCHUR_A2A(HADRONS_DEFAULT_SCHUR) // stringify macro #define _HADRONS_STR(x) #x diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 8a15b781..6c92f99f 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -60,7 +60,7 @@ class TA2AVectors : public Module public: FERM_TYPE_ALIASES(FImpl,); SOLVER_TYPE_ALIASES(FImpl,); - typedef A2AVectorsSchurDiagTwo A2A; + typedef HADRONS_DEFAULT_SCHUR_A2A A2A; public: // constructor TA2AVectors(const std::string name); From 2b794b6aa7d9182373225bb2bcc2b88aed831de2 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 9 Aug 2018 17:16:42 +0100 Subject: [PATCH 433/620] Hadrons: module generating random lattices for testing purposes --- extras/Hadrons/Modules.hpp | 1 + .../Modules/MUtilities/RandomVectors.cc | 7 ++ .../Modules/MUtilities/RandomVectors.hpp | 94 +++++++++++++++++++ extras/Hadrons/modules.inc | 2 + 4 files changed, 104 insertions(+) create mode 100644 extras/Hadrons/Modules/MUtilities/RandomVectors.cc create mode 100644 extras/Hadrons/Modules/MUtilities/RandomVectors.hpp diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index aa8a3aa1..5cce335a 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MUtilities/RandomVectors.cc b/extras/Hadrons/Modules/MUtilities/RandomVectors.cc new file mode 100644 index 00000000..cc122c90 --- /dev/null +++ b/extras/Hadrons/Modules/MUtilities/RandomVectors.cc @@ -0,0 +1,7 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MUtilities; + +template class Grid::Hadrons::MUtilities::TRandomVectors; diff --git a/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp b/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp new file mode 100644 index 00000000..2a5fc9e7 --- /dev/null +++ b/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp @@ -0,0 +1,94 @@ +#ifndef Hadrons_MUtilities_RandomVectors_hpp_ +#define Hadrons_MUtilities_RandomVectors_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Module generating random lattices for testing purposes * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MUtilities) + +class RandomVectorsPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(RandomVectorsPar, + unsigned int, size, + unsigned int, Ls); +}; + +template +class TRandomVectors: public Module +{ +public: + // constructor + TRandomVectors(const std::string name); + // destructor + virtual ~TRandomVectors(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(RandomFermions, TRandomVectors, MUtilities); + +/****************************************************************************** + * TRandomVectors implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TRandomVectors::TRandomVectors(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TRandomVectors::getInput(void) +{ + std::vector in; + + return in; +} + +template +std::vector TRandomVectors::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TRandomVectors::setup(void) +{ + envCreate(std::vector, getName(), par().Ls, par().size, + env().getGrid(par().Ls)); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TRandomVectors::execute(void) +{ + LOG(Message) << "Generating " << par().size << " random vectors" << std::endl; + + auto &vec = envGet(std::vector, getName()); + + for (unsigned int i = 0; i < vec.size(); ++i) + { + random(*env().get4dRng(), vec[i]); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MUtilities_RandomVectors_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 7933cb97..6bc07618 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -27,6 +27,7 @@ modules_cc =\ Modules/MGauge/Random.cc \ Modules/MGauge/FundtoHirep.cc \ Modules/MNoise/TimeDilutedSpinColorDiagonal.cc \ + Modules/MUtilities/RandomVectors.cc \ Modules/MUtilities/TestSeqGamma.cc \ Modules/MUtilities/TestSeqConserved.cc \ Modules/MLoop/NoiseLoop.cc \ @@ -87,6 +88,7 @@ modules_hpp =\ Modules/MGauge/FundtoHirep.hpp \ Modules/MGauge/StochEm.hpp \ Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp \ + Modules/MUtilities/RandomVectors.hpp \ Modules/MUtilities/TestSeqGamma.hpp \ Modules/MUtilities/TestSeqConserved.hpp \ Modules/MLoop/NoiseLoop.hpp \ From f4cbfd63ff01e2b3d6a600422f1de9d7ac403d72 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Thu, 9 Aug 2018 18:39:58 +0100 Subject: [PATCH 434/620] Hadrons: more meson field cleaning, needs IO now --- .../Modules/MContraction/A2AMesonField.hpp | 41 +++++-------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 6c537fb5..06032c18 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -390,7 +390,7 @@ void TA2AMesonField::execute(void) int NBlock_i = N_i/schurBlock + (((N_i % schurBlock) != 0) ? 1 : 0); int NBlock_j = N_j/schurBlock + (((N_j % schurBlock) != 0) ? 1 : 0); - for(int i=0;i::execute(void) << i+N_ii-1 << ", " << j <<" .. " << j+N_jj-1 << "]" << std::endl; + Eigen::Tensor mesonFieldBlocked(nmom,ngamma,nt,N_ii,N_jj); + /////////////////////////////////////////////////////////////// // Series of cache blocked chunks of the contractions within this SchurBlock /////////////////////////////////////////////////////////////// @@ -416,47 +418,26 @@ void TA2AMesonField::execute(void) { int N_iii = MIN(N_ii-ii,cacheBlock); int N_jjj = MIN(N_jj-jj,cacheBlock); - Eigen::Tensor mesonFieldBlocked(nmom,ngamma,nt,N_iii,N_jjj); + Eigen::Tensor mesonFieldCache(nmom,ngamma,nt,N_iii,N_jjj); t_contr-=usecond(); - MesonField(mesonFieldBlocked, &w[i+ii], &v[j+jj], gammas, phases,Tp, + MesonField(mesonFieldCache, &w[i+ii], &v[j+jj], gammas, phases,Tp, t_int_0,t_int_1,t_int_2,t_int_3); t_contr+=usecond(); + // flops for general N_c & N_s flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; - ///////////////////////////////////////////////////////////////////////// - // Test: Build the pion correlator (two end) - // < PI_ij(t0) PI_ji (t0+t) > - ///////////////////////////////////////////////////////////////////////// - parallel_for_nest2(int iii=0;iii< N_iii;iii++) + for(int iii=0;iii< N_iii;iii++) for(int jjj=0;jjj< N_jjj;jjj++) + for(int m =0;m< nmom;m++) + for(int g =0;g< ngamma;g++) + for(int t =0;t< nt;t++) { - int m=0; // first momentum - int g=0; // first gamma in above ordering is gamma5 for pion - - for(int t0=0;t0 Date: Fri, 10 Aug 2018 15:11:01 +0100 Subject: [PATCH 435/620] Sha used to seed from a unique string --- benchmarks/Benchmark_dwf.cc | 4 +-- lib/GridCore.h | 1 + lib/lattice/Lattice_rng.h | 29 ++++++++++++--- lib/util/Sha.h | 70 +++++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 lib/util/Sha.h diff --git a/benchmarks/Benchmark_dwf.cc b/benchmarks/Benchmark_dwf.cc index 1d9de772..a7362e35 100644 --- a/benchmarks/Benchmark_dwf.cc +++ b/benchmarks/Benchmark_dwf.cc @@ -76,9 +76,9 @@ int main (int argc, char ** argv) std::vector seeds5({5,6,7,8}); std::cout << GridLogMessage << "Initialising 4d RNG" << std::endl; - GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4); + GridParallelRNG RNG4(UGrid); RNG4.SeedUniqueString(std::string("The 4D RNG")); std::cout << GridLogMessage << "Initialising 5d RNG" << std::endl; - GridParallelRNG RNG5(FGrid); RNG5.SeedFixedIntegers(seeds5); + GridParallelRNG RNG5(FGrid); RNG5.SeedUniqueString(std::string("The 5D RNG")); std::cout << GridLogMessage << "Initialised RNGs" << std::endl; LatticeFermion src (FGrid); random(RNG5,src); diff --git a/lib/GridCore.h b/lib/GridCore.h index 55396a37..3f31701a 100644 --- a/lib/GridCore.h +++ b/lib/GridCore.h @@ -48,6 +48,7 @@ Author: paboyle #include #include #include +#include #include #include #include diff --git a/lib/lattice/Lattice_rng.h b/lib/lattice/Lattice_rng.h index 654c5dd5..1c6dab01 100644 --- a/lib/lattice/Lattice_rng.h +++ b/lib/lattice/Lattice_rng.h @@ -251,7 +251,7 @@ namespace Grid { dist[0].reset(); for(int idx=0;idx seeds; + seeds = GridChecksum::sha256_seeds(s); + std::cout << GridLogMessage << "Intialising Serial RNG with unique string " < seeds; + seeds = GridChecksum::sha256_seeds(s); + std::cout << GridLogMessage << "Intialising Parallel RNG with unique string " < &seeds){ // Everyone generates the same seed_seq based on input seeds diff --git a/lib/util/Sha.h b/lib/util/Sha.h new file mode 100644 index 00000000..6cfbe0bd --- /dev/null +++ b/lib/util/Sha.h @@ -0,0 +1,70 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./lib/util/Sha.h + + Copyright (C) 2018 + + Author: Peter Boyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +extern "C" { +#include +} + +#pragma once + +class GridChecksum +{ +public: + static inline uint32_t crc32(void *data,size_t bytes) + { + return ::crc32(0L,(unsigned char *)data,bytes); + } + static inline std::vector sha256(void *data,size_t bytes) + { + std::vector hash(SHA256_DIGEST_LENGTH); + SHA256_CTX sha256; + SHA256_Init (&sha256); + SHA256_Update(&sha256, data,bytes); + SHA256_Final (&hash[0], &sha256); + return hash; + } + static inline std::vector sha256_seeds(const std::string &s) + { + std::vector seeds; + std::vector uchars = sha256((void *)s.c_str(),s.size()); + for(int i=0;i Date: Fri, 10 Aug 2018 16:07:30 +0100 Subject: [PATCH 436/620] Hadrons: module and VM instrumentation --- extras/Hadrons/Global.cc | 26 +++++++ extras/Hadrons/Global.hpp | 3 + extras/Hadrons/Module.cc | 69 +++++++++++++++++++ extras/Hadrons/Module.hpp | 13 +++- .../Modules/MContraction/A2AMesonField.hpp | 20 ++---- extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 4 ++ extras/Hadrons/VirtualMachine.cc | 29 +++++++- lib/perfmon/Timer.h | 3 + 8 files changed, 151 insertions(+), 16 deletions(-) diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 26b74a6f..8c0cf799 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -173,3 +173,29 @@ void Hadrons::makeFileDir(const std::string filename, GridBase *g) } } } + +void Hadrons::printTimeProfile(const std::map &timing, + GridTime total) +{ + typedef decltype(total.count()) Count; + + std::map> rtiming; + const double dtotal = static_cast(total.count()); + auto cf = std::cout.flags(); + unsigned int width = 0; + + for (auto &t: timing) + { + width = std::max(width, static_cast(t.first.length())); + rtiming[t.second.count()] = t.first; + } + for (auto &rt: rtiming) + { + LOG(Message) << std::right << std::setw(width) << rt.second << ": " + << rt.first << " us (" << std::fixed + << std::setprecision(1) + << static_cast(rt.first)/dtotal*100 << "%)" + << std::endl; + } + std::cout.flags(cf); +} diff --git a/extras/Hadrons/Global.hpp b/extras/Hadrons/Global.hpp index 3ecf4308..e1e29e43 100644 --- a/extras/Hadrons/Global.hpp +++ b/extras/Hadrons/Global.hpp @@ -214,6 +214,9 @@ void makeFileDir(const std::string filename, GridBase *g); #define _HADRONS_STR(x) #x #define HADRONS_STR(x) _HADRONS_STR(x) +// pretty print time profile +void printTimeProfile(const std::map &timing, GridTime total); + END_HADRONS_NAMESPACE #include diff --git a/extras/Hadrons/Module.cc b/extras/Hadrons/Module.cc index faf01d5a..2623d6b2 100644 --- a/extras/Hadrons/Module.cc +++ b/extras/Hadrons/Module.cc @@ -56,6 +56,75 @@ std::string ModuleBase::getRegisteredName(void) // execution /////////////////////////////////////////////////////////////////// void ModuleBase::operator()(void) { + resetTimers(); + startTimer("_total"); + startTimer("_setup"); setup(); + stopTimer("_setup"); + startTimer("_execute"); execute(); + stopAllTimers(); +} + +// timers ////////////////////////////////////////////////////////////////////// +void ModuleBase::startTimer(const std::string &name) +{ + if (!name.empty()) + { + timer_[name].Start(); + } +} + +void ModuleBase::startCurrentTimer(const std::string &name) +{ + if (!name.empty()) + { + stopCurrentTimer(); + startTimer(name); + currentTimer_ = name; + } +} + +void ModuleBase::stopTimer(const std::string &name) +{ + if (timer_.at(name).isRunning()) + { + timer_.at(name).Stop(); + } +} + +void ModuleBase::stopCurrentTimer(void) +{ + if (!currentTimer_.empty()) + { + stopTimer(currentTimer_); + currentTimer_ = ""; + } +} + +void ModuleBase::stopAllTimers(void) +{ + for (auto &t: timer_) + { + stopTimer(t.first); + } + currentTimer_ = ""; +} + +void ModuleBase::resetTimers(void) +{ + timer_.clear(); + currentTimer_ = ""; +} + +std::map ModuleBase::getTimings(void) +{ + std::map timing; + + for (auto &t: timer_) + { + timing[t.first] = t.second.Elapsed(); + } + + return timing; } diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 2726da96..75e621f3 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -129,6 +129,8 @@ if (env().getGrid()->IsBoss() and !ioStem.empty())\ }\ } +#define MODULE_TIMER(name) this->startCurrentTimer(name) + /****************************************************************************** * Module class * ******************************************************************************/ @@ -161,13 +163,22 @@ public: virtual void execute(void) = 0; // execution void operator()(void); + // timers + void startTimer(const std::string &name); + void startCurrentTimer(const std::string &name); + void stopTimer(const std::string &name); + void stopCurrentTimer(void); + void stopAllTimers(void); + void resetTimers(void); + std::map getTimings(void); protected: // environment shortcut DEFINE_ENV_ALIAS; // virtual machine shortcut DEFINE_VM_ALIAS; private: - std::string name_; + std::string name_, currentTimer_; + std::map timer_; }; // derived class, templating the parameter class diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 06032c18..9939e7cc 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -189,6 +189,7 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, int stride=grid->_slice_stride[orthogdim]; t0-=usecond(); + MODULE_TIMER("Colour trace * mom."); // Nested parallelism would be ok // Wasting cores here. Test case r parallel_for(int r=0;r::MesonField(Eigen::Tensor &mat, t0+=usecond(); // Sum across simd lanes in the plane, breaking out orthog dir. + MODULE_TIMER("Local space sum"); t1-=usecond(); parallel_for(int rt=0;rt::MesonField(Eigen::Tensor &mat, t2-=usecond(); // ld loop and local only?? + MODULE_TIMER("Spin trace"); int pd = grid->_processors[orthogdim]; int pc = grid->_processor_coor[orthogdim]; parallel_for_nest2(int lt=0;lt::MesonField(Eigen::Tensor &mat, // Healthy size that should suffice //////////////////////////////////////////////////////////////////// t3-=usecond(); + MODULE_TIMER("Global sum"); grid->GlobalSumVector(&mat(0,0,0,0,0),Nmom*Ngamma*Nt*Lblock*Rblock); t3+=usecond(); } @@ -430,6 +434,7 @@ void TA2AMesonField::execute(void) bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; + MODULE_TIMER("Cache copy"); for(int iii=0;iii< N_iii;iii++) for(int jjj=0;jjj< N_jjj;jjj++) for(int m =0;m< nmom;m++) @@ -442,21 +447,10 @@ void TA2AMesonField::execute(void) } double nodes=grid->NodeCount(); - double t1 = usecond(); - LOG(Message) << "Contraction of MesonFields took "<<(t1-t0)/1.0e6<< " s" << std::endl; - LOG(Message) << " Schur " << (t_schur)/1.0e6 << " s" << std::endl; - LOG(Message) << " Contr " << (t_contr)/1.0e6 << " s" << std::endl; - LOG(Message) << " Intern0 " << (t_int_0)/1.0e6 << " s" << std::endl; - LOG(Message) << " Intern1 " << (t_int_1)/1.0e6 << " s" << std::endl; - LOG(Message) << " Intern2 " << (t_int_2)/1.0e6 << " s" << std::endl; - LOG(Message) << " Intern3 " << (t_int_3)/1.0e6 << " s" << std::endl; - double t_kernel = t_int_0 + t_int_1; - LOG(Message) << " Arith " << flops/(t_kernel)/1.0e3/nodes << " Gflop/s/ node " << std::endl; - LOG(Message) << " Arith " << bytes/(t_kernel)/1.0e3/nodes << " GB/s/node " << std::endl; - for(int t=0;t::execute(void) { auto &epack = envGet(Pack, par().eigenPack); + MODULE_TIMER("V low mode"); LOG(Message) << "V vector i = " << il << " (low mode)" << std::endl; if (Ls == 1) { @@ -188,6 +189,7 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, f5); a2a.makeLowModeV5D(v[il], f5, epack.evec[il], epack.eval[il]); } + MODULE_TIMER("W low mode"); LOG(Message) << "W vector i = " << il << " (low mode)" << std::endl; if (Ls == 1) { @@ -203,6 +205,7 @@ void TA2AVectors::execute(void) // High modes for (unsigned int ih = 0; ih < noise.size(); ih++) { + MODULE_TIMER("V high mode"); LOG(Message) << "V vector i = " << Nl_ + ih << " (" << ((Nl_ > 0) ? "high " : "") << "stochastic mode)" << std::endl; @@ -215,6 +218,7 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, f5); a2a.makeHighModeV5D(v[Nl_ + ih], f5, noise[ih]); } + MODULE_TIMER("W high mode"); LOG(Message) << "W vector i = " << Nl_ + ih << " (" << ((Nl_ > 0) ? "high " : "") << "stochastic mode)" << std::endl; diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index d849ba34..39908e4c 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -622,9 +622,14 @@ VirtualMachine::Program VirtualMachine::schedule(const GeneticPar &par) } // general execution /////////////////////////////////////////////////////////// -#define BIG_SEP "===============" -#define SEP "---------------" +#define BIG_SEP "===============" +#define SEP "---------------" +#define SMALL_SEP "..............." #define MEM_MSG(size) sizeString(size) +#define PRINT_TIME(name, t, total) \ +std::right << std::setw(30) << name << ": " << t.count() << " us (" \ +<< std::fixed << std::setprecision(1) \ +<< static_cast((t).count())/total*100 << "%)" void VirtualMachine::executeProgram(const Program &p) { @@ -654,11 +659,31 @@ void VirtualMachine::executeProgram(const Program &p) LOG(Message) << SEP << " Measurement step " << i + 1 << "/" << p.size() << " (module '" << module_[p[i]].name << "') " << SEP << std::endl; + LOG(Message) << SMALL_SEP << " Module execution" << std::endl; currentModule_ = p[i]; (*module_[p[i]].data)(); currentModule_ = -1; sizeBefore = env().getTotalSize(); + // print time profile after execution + LOG(Message) << SMALL_SEP << " Timings" << std::endl; + + std::map ctiming, gtiming; + GridTime total; + + ctiming = module_[p[i]].data->getTimings(); + total = ctiming.at("_total"); + gtiming["total"] = ctiming["_total"]; ctiming.erase("_total"); + gtiming["setup"] = ctiming["_setup"]; ctiming.erase("_setup"); + gtiming["execution"] = ctiming["_execute"]; ctiming.erase("_execute"); + LOG(Message) << "* GLOBAL TIMERS" << std::endl; + printTimeProfile(gtiming, total); + if (!ctiming.empty()) + { + LOG(Message) << "* CUSTOM TIMERS" << std::endl; + printTimeProfile(ctiming, total); + } // print used memory after execution + LOG(Message) << SMALL_SEP << " Memory management" << std::endl; LOG(Message) << "Allocated objects: " << MEM_MSG(sizeBefore) << std::endl; if (sizeBefore > memPeak) diff --git a/lib/perfmon/Timer.h b/lib/perfmon/Timer.h index 4d32ee52..6fc421b8 100644 --- a/lib/perfmon/Timer.h +++ b/lib/perfmon/Timer.h @@ -102,6 +102,9 @@ public: assert(running == false); return (uint64_t) accumulator.count(); } + bool isRunning(void){ + return running; + } }; } From 093bb02633d249c3e1bbb67ac9e06d35fb533b2f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 10 Aug 2018 16:07:48 +0100 Subject: [PATCH 437/620] Hadrons: execute message for time diluted noise --- extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp index 12340cbb..c2301ccd 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -101,6 +101,7 @@ void TTimeDilutedSpinColorDiagonal::execute(void) { auto &noise = envGet(DilutedNoise, getName()); + LOG(Message) << "Generating time-diluted, spin-color diagonal noise" << std::endl; noise.generateNoise(*env().get4dRng()); } From 2a942448908d3628fd24befc5dd188a9c1080511 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 10 Aug 2018 16:36:11 +0100 Subject: [PATCH 438/620] configure: --with-openssl option and LIME is now mandatory --- configure.ac | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 819253a0..2f53cd89 100644 --- a/configure.ac +++ b/configure.ac @@ -88,6 +88,13 @@ AC_ARG_WITH([lime], [AM_CXXFLAGS="-I$with_lime/include $AM_CXXFLAGS"] [AM_LDFLAGS="-L$with_lime/lib $AM_LDFLAGS"]) +############### OpenSSL +AC_ARG_WITH([openssl], + [AS_HELP_STRING([--with-openssl=prefix], + [try this for a non-standard install prefix of the OpenSSL library])], + [AM_CXXFLAGS="-I$with_openssl/include $AM_CXXFLAGS"] + [AM_LDFLAGS="-L$with_openssl/lib $AM_LDFLAGS"]) + ############### lapack AC_ARG_ENABLE([lapack], [AC_HELP_STRING([--enable-lapack=yes|no|prefix], [enable LAPACK])], @@ -188,9 +195,13 @@ AC_SEARCH_LIBS([fftw_execute], [fftw3], AC_SEARCH_LIBS([limeCreateReader], [lime], [AC_DEFINE([HAVE_LIME], [1], [Define to 1 if you have the `LIME' library])] [have_lime=true], - [AC_MSG_WARN(C-LIME library was not found in your system. -In order to use ILGG file format please install or provide the correct path to your installation -Info at: http://usqcd.jlab.org/usqcd-docs/c-lime/)]) + [AC_MSG_ERROR(LIME library was not found in your system.)]) + +AC_SEARCH_LIBS([SHA256_Init], [crypto], + [AC_DEFINE([HAVE_CRYPTO], [1], [Define to 1 if you have the `OpenSSL' library])] + [have_crypto=true], + [AC_MSG_ERROR(OpenSSL library was not found in your system.)]) +AC_CHECK_HEADER([openssl/sha.h], [], [AC_MSG_ERROR(OpenSSL library found but without headers.)], [AC_INCLUDES_DEFAULT([])]) AC_SEARCH_LIBS([crc32], [z], [AC_DEFINE([HAVE_ZLIB], [1], [Define to 1 if you have the `LIBZ' library])] From ac69f042b1945c8d725ca09ab0349ed29cfeea0c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Fri, 10 Aug 2018 18:27:00 +0100 Subject: [PATCH 439/620] Hadrons: module RNG uniquely seeded with + + --- extras/Hadrons/Application.cc | 20 ++++++++----- extras/Hadrons/Application.hpp | 2 +- extras/Hadrons/Environment.cc | 5 ---- extras/Hadrons/Environment.hpp | 1 - extras/Hadrons/Module.cc | 28 +++++++++++++++++++ extras/Hadrons/Module.hpp | 6 +++- extras/Hadrons/Modules/MGauge/Random.cc | 2 +- extras/Hadrons/Modules/MGauge/StochEm.cc | 2 +- extras/Hadrons/Modules/MGauge/Unit.cc | 2 +- .../MNoise/TimeDilutedSpinColorDiagonal.hpp | 2 +- .../Modules/MScalarSUN/StochFreeField.hpp | 2 +- extras/Hadrons/Modules/MSource/Z2.hpp | 2 +- .../Modules/MUtilities/RandomVectors.hpp | 2 +- extras/Hadrons/VirtualMachine.cc | 17 +++++++++-- extras/Hadrons/VirtualMachine.hpp | 4 +++ lib/lattice/Lattice_rng.h | 20 +++++++------ 16 files changed, 84 insertions(+), 33 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 18bd93e3..cff1b619 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -34,8 +34,8 @@ using namespace Grid; using namespace QCD; using namespace Hadrons; -#define BIG_SEP "===============" -#define SEP "---------------" +#define BIG_SEP "================" +#define SEP "----------------" /****************************************************************************** * Application implementation * @@ -54,11 +54,11 @@ Application::Application(void) loc[d] /= mpi[d]; locVol_ *= loc[d]; } - LOG(Message) << "====== HADRONS APPLICATION STARTING ======" << std::endl; + LOG(Message) << "====== HADRONS APPLICATION INITIALISATION ======" << std::endl; LOG(Message) << "** Dimensions" << std::endl; - LOG(Message) << "Global lattice : " << dim << std::endl; - LOG(Message) << "MPI partition : " << mpi << std::endl; - LOG(Message) << "Local lattice : " << loc << std::endl; + LOG(Message) << "Global lattice: " << dim << std::endl; + LOG(Message) << "MPI partition : " << mpi << std::endl; + LOG(Message) << "Local lattice : " << loc << std::endl; LOG(Message) << std::endl; LOG(Message) << "** Default parameters (and associated C macro)" << std::endl; LOG(Message) << "ASCII output precision : " << MACOUT(DEFAULT_ASCII_PREC) << std::endl; @@ -88,7 +88,6 @@ Application::Application(const std::string parameterFileName) void Application::setPar(const Application::GlobalPar &par) { par_ = par; - env().setSeed(strToVec(par_.seed)); } const Application::GlobalPar & Application::getPar(void) @@ -99,10 +98,17 @@ const Application::GlobalPar & Application::getPar(void) // execute ///////////////////////////////////////////////////////////////////// void Application::run(void) { + LOG(Message) << "====== HADRONS APPLICATION START ======" << std::endl; if (!parameterFileName_.empty() and (vm().getNModule() == 0)) { parseParameterFile(parameterFileName_); } + if (getPar().runId.empty()) + { + HADRONS_ERROR(Definition, "run id is empty"); + } + LOG(Message) << "RUN ID '" << getPar().runId << "'" << std::endl; + vm().setRunId(getPar().runId); vm().printContent(); env().printContent(); schedule(); diff --git a/extras/Hadrons/Application.hpp b/extras/Hadrons/Application.hpp index 0254f2fc..ef463dd6 100644 --- a/extras/Hadrons/Application.hpp +++ b/extras/Hadrons/Application.hpp @@ -55,7 +55,7 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(GlobalPar, TrajRange, trajCounter, VirtualMachine::GeneticPar, genetic, - std::string, seed); + std::string, runId); }; public: // constructors diff --git a/extras/Hadrons/Environment.cc b/extras/Hadrons/Environment.cc index 1b9ddb00..ced61ce4 100644 --- a/extras/Hadrons/Environment.cc +++ b/extras/Hadrons/Environment.cc @@ -195,11 +195,6 @@ double Environment::getVolume(void) const } // random number generator ///////////////////////////////////////////////////// -void Environment::setSeed(const std::vector &seed) -{ - rng4d_->SeedFixedIntegers(seed); -} - GridParallelRNG * Environment::get4dRng(void) const { return rng4d_.get(); diff --git a/extras/Hadrons/Environment.hpp b/extras/Hadrons/Environment.hpp index 90f04e3b..c277b3db 100644 --- a/extras/Hadrons/Environment.hpp +++ b/extras/Hadrons/Environment.hpp @@ -97,7 +97,6 @@ public: unsigned int getNd(void) const; double getVolume(void) const; // random number generator - void setSeed(const std::vector &seed); GridParallelRNG * get4dRng(void) const; // general memory management void addObject(const std::string name, diff --git a/extras/Hadrons/Module.cc b/extras/Hadrons/Module.cc index 2623d6b2..8ac33ccf 100644 --- a/extras/Hadrons/Module.cc +++ b/extras/Hadrons/Module.cc @@ -128,3 +128,31 @@ std::map ModuleBase::getTimings(void) return timing; } + +std::string ModuleBase::makeSeedString(void) +{ + std::string seed; + + if (!vm().getRunId().empty()) + { + seed += vm().getRunId() + "-"; + } + seed += getName() + "-" + std::to_string(vm().getTrajectory()); + + return seed; +} + +GridParallelRNG & ModuleBase::rng4d(void) +{ + auto &r = *env().get4dRng(); + + if (makeSeedString() != seed_) + { + seed_ = makeSeedString(); + LOG(Message) << "Seeding 4D RNG " << &r << " with string '" + << seed_ << "'" << std::endl; + r.SeedUniqueString(seed_); + } + + return r; +} diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 75e621f3..f3d87c2d 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -176,8 +176,12 @@ protected: DEFINE_ENV_ALIAS; // virtual machine shortcut DEFINE_VM_ALIAS; + // RNG seeded from module string + GridParallelRNG &rng4d(void); private: - std::string name_, currentTimer_; + std::string makeSeedString(void); +private: + std::string name_, currentTimer_, seed_; std::map timer_; }; diff --git a/extras/Hadrons/Modules/MGauge/Random.cc b/extras/Hadrons/Modules/MGauge/Random.cc index 962fc243..59b43331 100644 --- a/extras/Hadrons/Modules/MGauge/Random.cc +++ b/extras/Hadrons/Modules/MGauge/Random.cc @@ -67,5 +67,5 @@ void TRandom::execute(void) LOG(Message) << "Generating random gauge configuration" << std::endl; auto &U = envGet(LatticeGaugeField, getName()); - SU3::HotConfiguration(*env().get4dRng(), U); + SU3::HotConfiguration(rng4d(), U); } diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/extras/Hadrons/Modules/MGauge/StochEm.cc index 36d0be7c..adb33d9c 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/extras/Hadrons/Modules/MGauge/StochEm.cc @@ -81,5 +81,5 @@ void TStochEm::execute(void) << par().zmScheme << ")..." << std::endl; photon.StochasticWeight(w); } - photon.StochasticField(a, *env().get4dRng(), w); + photon.StochasticField(a, rng4d(), w); } diff --git a/extras/Hadrons/Modules/MGauge/Unit.cc b/extras/Hadrons/Modules/MGauge/Unit.cc index 38b5f3aa..3df12fa7 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.cc +++ b/extras/Hadrons/Modules/MGauge/Unit.cc @@ -65,5 +65,5 @@ void TUnit::execute(void) LOG(Message) << "Creating unit gauge configuration" << std::endl; auto &U = envGet(LatticeGaugeField, getName()); - SU3::ColdConfiguration(*env().get4dRng(), U); + SU3::ColdConfiguration(rng4d(), U); } diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp index c2301ccd..3c324cd1 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +++ b/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -102,7 +102,7 @@ void TTimeDilutedSpinColorDiagonal::execute(void) auto &noise = envGet(DilutedNoise, getName()); LOG(Message) << "Generating time-diluted, spin-color diagonal noise" << std::endl; - noise.generateNoise(*env().get4dRng()); + noise.generateNoise(rng4d()); } END_MODULE_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp index ea15f3ef..d757c1ab 100644 --- a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +++ b/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -128,7 +128,7 @@ void TStochFreeField::execute(void) const unsigned int Nadj = Group::AdjointDimension; auto &phi = envGet(Field, getName()); auto &w = envGet(ComplexField, "_" + getName() + "_weight"); - auto &rng = *env().get4dRng(); + auto &rng = rng4d(); double trphi2; FFT fft(env().getGrid()); Integer vol; diff --git a/extras/Hadrons/Modules/MSource/Z2.hpp b/extras/Hadrons/Modules/MSource/Z2.hpp index cecff8b0..51bbbaa2 100644 --- a/extras/Hadrons/Modules/MSource/Z2.hpp +++ b/extras/Hadrons/Modules/MSource/Z2.hpp @@ -149,7 +149,7 @@ void TZ2::execute(void) hasT_ = true; } envGetTmp(LatticeComplex, eta); - bernoulli(*env().get4dRng(), eta); + bernoulli(rng4d(), eta); eta = (2.*eta - shift)*(1./::sqrt(2.)); eta = where((t >= par().tA) and (t <= par().tB), eta, 0.*eta); src = 1.; diff --git a/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp b/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp index 2a5fc9e7..590ef224 100644 --- a/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp +++ b/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp @@ -83,7 +83,7 @@ void TRandomVectors::execute(void) for (unsigned int i = 0; i < vec.size(); ++i) { - random(*env().get4dRng(), vec[i]); + random(rng4d(), vec[i]); } } diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index 39908e4c..74579588 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -48,6 +48,17 @@ unsigned int VirtualMachine::getTrajectory(void) const return traj_; } +// run tag ///////////////////////////////////////////////////////////////////// +void VirtualMachine::setRunId(const std::string id) +{ + runId_ = id; +} + +std::string VirtualMachine::getRunId(void) const +{ + return runId_; +} + // module management /////////////////////////////////////////////////////////// void VirtualMachine::pushModule(VirtualMachine::ModPt &pt) { @@ -622,9 +633,9 @@ VirtualMachine::Program VirtualMachine::schedule(const GeneticPar &par) } // general execution /////////////////////////////////////////////////////////// -#define BIG_SEP "===============" -#define SEP "---------------" -#define SMALL_SEP "..............." +#define BIG_SEP "================" +#define SEP "----------------" +#define SMALL_SEP "................" #define MEM_MSG(size) sizeString(size) #define PRINT_TIME(name, t, total) \ std::right << std::setw(30) << name << ": " << t.count() << " us (" \ diff --git a/extras/Hadrons/VirtualMachine.hpp b/extras/Hadrons/VirtualMachine.hpp index ccc06d63..1fa2daa9 100644 --- a/extras/Hadrons/VirtualMachine.hpp +++ b/extras/Hadrons/VirtualMachine.hpp @@ -91,6 +91,9 @@ public: // trajectory counter void setTrajectory(const unsigned int traj); unsigned int getTrajectory(void) const; + // run tag + void setRunId(const std::string id); + std::string getRunId(void) const; // module management void pushModule(ModPt &pt); template @@ -151,6 +154,7 @@ private: void memoryProfile(const unsigned int address); private: // general + std::string runId_; unsigned int traj_; // module and related maps std::vector module_; diff --git a/lib/lattice/Lattice_rng.h b/lib/lattice/Lattice_rng.h index 1c6dab01..c6b9e14e 100644 --- a/lib/lattice/Lattice_rng.h +++ b/lib/lattice/Lattice_rng.h @@ -320,12 +320,14 @@ namespace Grid { void SeedUniqueString(const std::string &s){ std::vector seeds; + std::stringstream sha; seeds = GridChecksum::sha256_seeds(s); - std::cout << GridLogMessage << "Intialising Serial RNG with unique string " < seeds; + std::stringstream sha; seeds = GridChecksum::sha256_seeds(s); - std::cout << GridLogMessage << "Intialising Parallel RNG with unique string " < &seeds){ From 5be6a51044c00e27034c82714402362fc05cf0f2 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 11 Aug 2018 15:13:43 +0100 Subject: [PATCH 440/620] Hadrons: meson fields code cleaning and momentum phases --- .../Modules/MContraction/A2AMesonField.hpp | 623 +++++++++--------- 1 file changed, 319 insertions(+), 304 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 9939e7cc..ba849b0c 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -51,20 +51,20 @@ class A2AMesonFieldPar : Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar, int, cacheBlock, - int, schurBlock, - int, Nmom, + int, block, std::string, v, std::string, w, - std::string, output); + std::string, output, + std::vector, mom); }; template class TA2AMesonField : public Module { - public: +public: FERM_TYPE_ALIASES(FImpl, ); SOLVER_TYPE_ALIASES(FImpl, ); - public: +public: // constructor TA2AMesonField(const std::string name); // destructor @@ -76,18 +76,21 @@ class TA2AMesonField : public Module virtual void setup(void); // execution virtual void execute(void); - +private: // Arithmetic help. Move to Grid?? - virtual void MesonField(Eigen::Tensor &mat, - const LatticeFermion *lhs, - const LatticeFermion *rhs, - std::vector gammas, - const std::vector &mom, - int orthogdim, - double &t0, - double &t1, - double &t2, - double &t3); + virtual void makeBlock(Eigen::Tensor &mat, + const LatticeFermion *lhs, + const LatticeFermion *rhs, + std::vector gammas, + const std::vector &mom, + int orthogdim, + double &t0, + double &t1, + double &t2, + double &t3); +private: + bool hasPhase_{false}; + std::string momphName_; }; MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); @@ -99,7 +102,8 @@ MODULE_REGISTER(ZA2AMesonField, ARG(TA2AMesonField), MContraction); // constructor ///////////////////////////////////////////////////////////////// template TA2AMesonField::TA2AMesonField(const std::string name) - : Module(name) +: Module(name) +, momphName_(name + "_momph") { } @@ -120,18 +124,166 @@ std::vector TA2AMesonField::getOutput(void) return out; } - // setup /////////////////////////////////////////////////////////////////////// template void TA2AMesonField::setup(void) -{} +{ + envCache(std::vector, momphName_, 1, + par().mom.size(), env().getGrid()); + envTmpLat(LatticeComplex, "coor"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::execute(void) +{ + LOG(Message) << "Computing all-to-all meson fields" << std::endl; + + auto &v = envGet(std::vector, par().v); + auto &w = envGet(std::vector, par().w); + + // 2+6+4+4 = 16 gammas + // Ordering defined here + std::vector gammas ( { + Gamma::Algebra::Gamma5, + Gamma::Algebra::Identity, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaXGamma5, + Gamma::Algebra::GammaYGamma5, + Gamma::Algebra::GammaZGamma5, + Gamma::Algebra::GammaTGamma5, + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::SigmaZT + }); + + int nt = env().getDim().back(); + int N_i = w.size(); + int N_j = v.size(); + int ngamma = gammas.size(); + int nmom = par().mom.size(); + int block = par().block; + int cacheBlock = par().cacheBlock; + + /////////////////////////////////////////////// + // Momentum setup + /////////////////////////////////////////////// + auto &ph = envGet(std::vector, momphName_); + + if (!hasPhase_) + { + MODULE_TIMER("Momentum phases"); + for (unsigned int j = 0; j < nmom; ++j) + { + Complex i(0.0,1.0); + std::vector p; + + envGetTmp(LatticeComplex, coor); + p = strToVec(par().mom[j]); + ph[j] = zero; + for(unsigned int mu = 0; mu < p.size(); mu++) + { + LatticeCoordinate(coor, mu); + ph[j] = ph[j] + (p[mu]/env().getDim(mu))*coor; + } + ph[j] = exp((Real)(2*M_PI)*i*ph[j]); + } + hasPhase_ = true; + } + LOG(Message) << "MesonField size " << N_i << "x" << N_j << "x" << nt << std::endl; + + ////////////////////////////////////////////////////////////////////////// + // i,j is first loop over SchurBlock factors reusing 5D matrices + // ii,jj is second loop over cacheBlock factors for high perf contractoin + // iii,jjj are loops within cacheBlock + // Total index is sum of these i+ii+iii etc... + ////////////////////////////////////////////////////////////////////////// + + double flops = 0.0; + double bytes = 0.0; + double vol = env().getVolume(); + double t_schur=0; + double t_contr=0; + double t_int_0=0; + double t_int_1=0; + double t_int_2=0; + double t_int_3=0; + + double t0 = usecond(); + int NBlock_i = N_i/block + (((N_i % block) != 0) ? 1 : 0); + int NBlock_j = N_j/block + (((N_j % block) != 0) ? 1 : 0); + + for(int i=0;i mfBlock(nmom,ngamma,nt,N_ii,N_jj); + + /////////////////////////////////////////////////////////////// + // Series of cache blocked chunks of the contractions within this block + /////////////////////////////////////////////////////////////// + for(int ii=0;ii mfCache(nmom,ngamma,nt,N_iii,N_jjj); + + t_contr-=usecond(); + makeBlock(mfCache, &w[i+ii], &v[j+jj], gammas, ph, + env().getNd() - 1, t_int_0, t_int_1, t_int_2, t_int_3); + t_contr+=usecond(); + + // flops for general N_c & N_s + flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; + bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; + + MODULE_TIMER("Cache copy"); + for(int iii=0;iii< N_iii;iii++) + for(int jjj=0;jjj< N_jjj;jjj++) + for(int m =0;m< nmom;m++) + for(int g =0;g< ngamma;g++) + for(int t =0;t< nt;t++) + { + mfBlock(m,g,t,ii+iii,jj+jjj) = mfCache(m,g,t,iii,jjj); + } + } + } + + double nodes = env().getGrid()->NodeCount(); + double t_kernel = t_int_0 + t_int_1; + + LOG(Message) << "Perf " << flops/(t_kernel)/1.0e3/nodes << " Gflop/s/node " << std::endl; + LOG(Message) << "Perf " << bytes/(t_kernel)/1.0e3/nodes << " GB/s/node " << std::endl; +} ////////////////////////////////////////////////////////////////////////////////// // Cache blocked arithmetic routine // Could move to Grid ??? ////////////////////////////////////////////////////////////////////////////////// template -void TA2AMesonField::MesonField(Eigen::Tensor &mat, +void TA2AMesonField::makeBlock(Eigen::Tensor &mat, const LatticeFermion *lhs_wi, const LatticeFermion *rhs_vj, std::vector gammas, @@ -142,315 +294,178 @@ void TA2AMesonField::MesonField(Eigen::Tensor &mat, double &t2, double &t3) { - typedef typename FImpl::SiteSpinor vobj; + typedef typename FImpl::SiteSpinor vobj; - typedef typename vobj::scalar_object sobj; - typedef typename vobj::scalar_type scalar_type; - typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; - typedef iSpinMatrix SpinMatrix_v; - typedef iSpinMatrix SpinMatrix_s; - - int Lblock = mat.dimension(3); - int Rblock = mat.dimension(4); + typedef iSpinMatrix SpinMatrix_v; + typedef iSpinMatrix SpinMatrix_s; + + int Lblock = mat.dimension(3); + int Rblock = mat.dimension(4); - GridBase *grid = lhs_wi[0]._grid; - - const int Nd = grid->_ndimension; - const int Nsimd = grid->Nsimd(); + GridBase *grid = lhs_wi[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); - int Nt = grid->GlobalDimensions()[orthogdim]; - int Ngamma = gammas.size(); - int Nmom = mom.size(); + int Nt = grid->GlobalDimensions()[orthogdim]; + int Ngamma = gammas.size(); + int Nmom = mom.size(); - int fd=grid->_fdimensions[orthogdim]; - int ld=grid->_ldimensions[orthogdim]; - int rd=grid->_rdimensions[orthogdim]; + int fd=grid->_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; - // will locally sum vectors first - // sum across these down to scalars - // splitting the SIMD - int MFrvol = rd*Lblock*Rblock*Nmom; - int MFlvol = ld*Lblock*Rblock*Nmom; + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + int MFrvol = rd*Lblock*Rblock*Nmom; + int MFlvol = ld*Lblock*Rblock*Nmom; - Vector lvSum(MFrvol); - parallel_for (int r = 0; r < MFrvol; r++) - { - lvSum[r] = zero; - } - - Vector lsSum(MFlvol); - parallel_for (int r = 0; r < MFlvol; r++){ - lsSum[r]=scalar_type(0.0); - } - - int e1= grid->_slice_nblock[orthogdim]; - int e2= grid->_slice_block [orthogdim]; - int stride=grid->_slice_stride[orthogdim]; - - t0-=usecond(); - MODULE_TIMER("Colour trace * mom."); - // Nested parallelism would be ok - // Wasting cores here. Test case r - parallel_for(int r=0;r_ostride[orthogdim]; // base offset for start of plane - - for(int n=0;n lvSum(MFrvol); + parallel_for (int r = 0; r < MFrvol; r++) { - int ss= so+n*stride+b; - - for(int i=0;i icoor(Nd); - std::vector extracted(Nsimd); - - for(int i=0;iiCoorFromIindex(icoor,idx); - - int ldx = rt+icoor[orthogdim]*rd; - int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; - - lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; - } + Vector lsSum(MFlvol); + parallel_for (int r = 0; r < MFlvol; r++){ + lsSum[r]=scalar_type(0.0); } - } - t1+=usecond(); - assert(mat.dimension(0) == Nmom); - assert(mat.dimension(1) == Ngamma); - assert(mat.dimension(2) == Nt); - t2-=usecond(); - // ld loop and local only?? - MODULE_TIMER("Spin trace"); - int pd = grid->_processors[orthogdim]; - int pc = grid->_processor_coor[orthogdim]; - parallel_for_nest2(int lt=0;lt_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + t0-=usecond(); + MODULE_TIMER("Colour trace * mom."); + // Nested parallelism would be ok + // Wasting cores here. Test case r + parallel_for(int r=0;r_ostride[orthogdim]; // base offset for start of plane - for(int mu=0;mu icoor(Nd); + std::vector extracted(Nsimd); for(int i=0;iiCoorFromIindex(icoor,idx); + + int ldx = rt+icoor[orthogdim]*rd; + int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; + + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; + } + } } - } - t2+=usecond(); - //////////////////////////////////////////////////////////////////// - // This global sum is taking as much as 50% of time on 16 nodes - // Vector size is 7 x 16 x 32 x 16 x 16 x sizeof(complex) = 2MB - 60MB depending on volume - // Healthy size that should suffice - //////////////////////////////////////////////////////////////////// - t3-=usecond(); - MODULE_TIMER("Global sum"); - grid->GlobalSumVector(&mat(0,0,0,0,0),Nmom*Ngamma*Nt*Lblock*Rblock); - t3+=usecond(); -} + t1+=usecond(); + assert(mat.dimension(0) == Nmom); + assert(mat.dimension(1) == Ngamma); + assert(mat.dimension(2) == Nt); + t2-=usecond(); -// execution /////////////////////////////////////////////////////////////////// -template -void TA2AMesonField::execute(void) -{ - LOG(Message) << "Computing A2A meson field" << std::endl; - - auto &v = envGet(std::vector, par().v); - auto &w = envGet(std::vector, par().w); - - // 2+6+4+4 = 16 gammas - // Ordering defined here - std::vector gammas ( { - Gamma::Algebra::Gamma5, - Gamma::Algebra::Identity, - Gamma::Algebra::GammaX, - Gamma::Algebra::GammaY, - Gamma::Algebra::GammaZ, - Gamma::Algebra::GammaT, - Gamma::Algebra::GammaXGamma5, - Gamma::Algebra::GammaYGamma5, - Gamma::Algebra::GammaZGamma5, - Gamma::Algebra::GammaTGamma5, - Gamma::Algebra::SigmaXY, - Gamma::Algebra::SigmaXZ, - Gamma::Algebra::SigmaXT, - Gamma::Algebra::SigmaYZ, - Gamma::Algebra::SigmaYT, - Gamma::Algebra::SigmaZT - }); - - /////////////////////////////////////////////// - // Square assumption for now Nl = Nr = N - /////////////////////////////////////////////// - int nt = env().getDim(Tp); - int nx = env().getDim(Xp); - int ny = env().getDim(Yp); - int nz = env().getDim(Zp); - int N_i = w.size(); - int N_j = v.size(); - int ngamma = gammas.size(); - int schurBlock = par().schurBlock; - int cacheBlock = par().cacheBlock; - int nmom = par().Nmom; - std::vector corr(nt,ComplexD(0.0)); - - /////////////////////////////////////////////// - // Momentum setup - /////////////////////////////////////////////// - GridBase *grid = env().getGrid(); - std::vector phases(nmom,grid); - - for(int m=0;m mesonFieldBlocked(nmom,ngamma,nt,N_ii,N_jj); - - /////////////////////////////////////////////////////////////// - // Series of cache blocked chunks of the contractions within this SchurBlock - /////////////////////////////////////////////////////////////// - for(int ii=0;ii_processors[orthogdim]; + int pc = grid->_processor_coor[orthogdim]; + parallel_for_nest2(int lt=0;lt mesonFieldCache(nmom,ngamma,nt,N_iii,N_jjj); + for(int pt=0;ptNodeCount(); - double t_kernel = t_int_0 + t_int_1; - - LOG(Message) << "Perf " << flops/(t_kernel)/1.0e3/nodes << " Gflop/s/node " << std::endl; - LOG(Message) << "Perf " << bytes/(t_kernel)/1.0e3/nodes << " GB/s/node " << std::endl; + t2+=usecond(); + //////////////////////////////////////////////////////////////////// + // This global sum is taking as much as 50% of time on 16 nodes + // Vector size is 7 x 16 x 32 x 16 x 16 x sizeof(complex) = 2MB - 60MB depending on volume + // Healthy size that should suffice + //////////////////////////////////////////////////////////////////// + t3-=usecond(); + MODULE_TIMER("Global sum"); + grid->GlobalSumVector(&mat(0,0,0,0,0),Nmom*Ngamma*Nt*Lblock*Rblock); + t3+=usecond(); } END_MODULE_NAMESPACE From 503259f9c975ed3873cc52b9e809276fb655af22 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sun, 12 Aug 2018 16:52:12 +0100 Subject: [PATCH 441/620] Hadrons: meson field HDF5 IO done and tested --- .../Modules/MContraction/A2AMesonField.hpp | 232 +++++++++++++----- lib/serialisation/Hdf5IO.cc | 2 +- 2 files changed, 173 insertions(+), 61 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index ba849b0c..5bb4b4c3 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -35,6 +35,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include BEGIN_HADRONS_NAMESPACE @@ -46,7 +47,7 @@ BEGIN_MODULE_NAMESPACE(MContraction) typedef std::pair GammaPair; -class A2AMesonFieldPar : Serializable +class A2AMesonFieldPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar, @@ -62,8 +63,9 @@ template class TA2AMesonField : public Module { public: - FERM_TYPE_ALIASES(FImpl, ); - SOLVER_TYPE_ALIASES(FImpl, ); + FERM_TYPE_ALIASES(FImpl,); + SOLVER_TYPE_ALIASES(FImpl,); + typedef Eigen::Tensor MesonField; public: // constructor TA2AMesonField(const std::string name); @@ -77,20 +79,29 @@ public: // execution virtual void execute(void); private: - // Arithmetic help. Move to Grid?? - virtual void makeBlock(Eigen::Tensor &mat, - const LatticeFermion *lhs, - const LatticeFermion *rhs, - std::vector gammas, - const std::vector &mom, - int orthogdim, - double &t0, - double &t1, - double &t2, - double &t3); + // Arithmetic kernel. Move to Grid?? + void makeBlock(MesonField &mat, + const FermionField *lhs, + const FermionField *rhs, + std::vector gamma, + const std::vector &mom, + int orthogdim, + double &t0, + double &t1, + double &t2, + double &t3); + // IO + std::string ioname(unsigned int m, unsigned int g) const; + std::string filename(unsigned int m, unsigned int g) const; + void initFile(unsigned int m, unsigned int g); + void saveBlock(const MesonField &mf, + unsigned int m, unsigned int g, + unsigned int i, unsigned int j); private: - bool hasPhase_{false}; - std::string momphName_; + bool hasPhase_{false}; + std::string momphName_; + std::vector gamma_; + std::vector> mom_; }; MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); @@ -128,23 +139,7 @@ std::vector TA2AMesonField::getOutput(void) template void TA2AMesonField::setup(void) { - envCache(std::vector, momphName_, 1, - par().mom.size(), env().getGrid()); - envTmpLat(LatticeComplex, "coor"); -} - -// execution /////////////////////////////////////////////////////////////////// -template -void TA2AMesonField::execute(void) -{ - LOG(Message) << "Computing all-to-all meson fields" << std::endl; - - auto &v = envGet(std::vector, par().v); - auto &w = envGet(std::vector, par().w); - - // 2+6+4+4 = 16 gammas - // Ordering defined here - std::vector gammas ( { + gamma_ = { Gamma::Algebra::Gamma5, Gamma::Algebra::Identity, Gamma::Algebra::GammaX, @@ -161,12 +156,26 @@ void TA2AMesonField::execute(void) Gamma::Algebra::SigmaYZ, Gamma::Algebra::SigmaYT, Gamma::Algebra::SigmaZT - }); + }; + + envCache(std::vector, momphName_, 1, + par().mom.size(), env().getGrid()); + envTmpLat(LatticeComplex, "coor"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AMesonField::execute(void) +{ + LOG(Message) << "Computing all-to-all meson fields" << std::endl; + + auto &v = envGet(std::vector, par().v); + auto &w = envGet(std::vector, par().w); int nt = env().getDim().back(); int N_i = w.size(); int N_j = v.size(); - int ngamma = gammas.size(); + int ngamma = gamma_.size(); int nmom = par().mom.size(); int block = par().block; int cacheBlock = par().cacheBlock; @@ -185,12 +194,12 @@ void TA2AMesonField::execute(void) std::vector p; envGetTmp(LatticeComplex, coor); - p = strToVec(par().mom[j]); + mom_.push_back(strToVec(par().mom[j])); ph[j] = zero; - for(unsigned int mu = 0; mu < p.size(); mu++) + for(unsigned int mu = 0; mu < mom_[j].size(); mu++) { LatticeCoordinate(coor, mu); - ph[j] = ph[j] + (p[mu]/env().getDim(mu))*coor; + ph[j] = ph[j] + (mom_[j][mu]/env().getDim(mu))*coor; } ph[j] = exp((Real)(2*M_PI)*i*ph[j]); } @@ -222,9 +231,7 @@ void TA2AMesonField::execute(void) for(int i=0;i::execute(void) << i+N_ii-1 << ", " << j <<" .. " << j+N_jj-1 << "]" << std::endl; - Eigen::Tensor mfBlock(nmom,ngamma,nt,N_ii,N_jj); + MesonField mfBlock(nmom,ngamma,nt,N_ii,N_jj); - /////////////////////////////////////////////////////////////// // Series of cache blocked chunks of the contractions within this block - /////////////////////////////////////////////////////////////// for(int ii=0;ii mfCache(nmom,ngamma,nt,N_iii,N_jjj); + MesonField mfCache(nmom,ngamma,nt,N_iii,N_jjj); t_contr-=usecond(); - makeBlock(mfCache, &w[i+ii], &v[j+jj], gammas, ph, + makeBlock(mfCache, &w[i+ii], &v[j+jj], gamma_, ph, env().getNd() - 1, t_int_0, t_int_1, t_int_2, t_int_3); t_contr+=usecond(); @@ -269,13 +274,25 @@ void TA2AMesonField::execute(void) mfBlock(m,g,t,ii+iii,jj+jjj) = mfCache(m,g,t,iii,jjj); } } + + // IO + MODULE_TIMER("IO"); + for(int m = 0; m < nmom; m++) + for(int g = 0; g < ngamma; g++) + { + if ((i == 0) and (j == 0)) + { + initFile(m, g); + } + saveBlock(mfBlock, m, g, i, j); + } } double nodes = env().getGrid()->NodeCount(); double t_kernel = t_int_0 + t_int_1; - LOG(Message) << "Perf " << flops/(t_kernel)/1.0e3/nodes << " Gflop/s/node " << std::endl; - LOG(Message) << "Perf " << bytes/(t_kernel)/1.0e3/nodes << " GB/s/node " << std::endl; + LOG(Message) << "Perf " << flops/t_kernel/1.0e3/nodes << " Gflop/s/node " << std::endl; + LOG(Message) << "Perf " << bytes/t_kernel/1.0e3/nodes << " GB/s/node " << std::endl; } ////////////////////////////////////////////////////////////////////////////////// @@ -283,16 +300,16 @@ void TA2AMesonField::execute(void) // Could move to Grid ??? ////////////////////////////////////////////////////////////////////////////////// template -void TA2AMesonField::makeBlock(Eigen::Tensor &mat, - const LatticeFermion *lhs_wi, - const LatticeFermion *rhs_vj, - std::vector gammas, - const std::vector &mom, - int orthogdim, - double &t0, - double &t1, - double &t2, - double &t3) +void TA2AMesonField::makeBlock(MesonField &mat, + const FermionField *lhs_wi, + const FermionField *rhs_vj, + std::vector gamma, + const std::vector &mom, + int orthogdim, + double &t0, + double &t1, + double &t2, + double &t3) { typedef typename FImpl::SiteSpinor vobj; @@ -312,7 +329,7 @@ void TA2AMesonField::makeBlock(Eigen::Tensor &mat, const int Nsimd = grid->Nsimd(); int Nt = grid->GlobalDimensions()[orthogdim]; - int Ngamma = gammas.size(); + int Ngamma = gamma.size(); int Nmom = mom.size(); int fd=grid->_fdimensions[orthogdim]; @@ -436,9 +453,9 @@ void TA2AMesonField::makeBlock(Eigen::Tensor &mat, int ij_dx = m+Nmom*i + Nmom*Lblock * j + Nmom*Lblock * Rblock * lt; for(int mu=0;mu::makeBlock(Eigen::Tensor &mat, t3+=usecond(); } +// IO +template +std::string TA2AMesonField::ioname(unsigned int m, unsigned int g) const +{ + std::stringstream ss; + + ss << gamma_[g] << "_"; + for (unsigned int mu = 0; mu < mom_[m].size(); ++mu) + { + ss << mom_[m][mu] << ((mu == mom_[m].size() - 1) ? "" : "_"); + } + + return ss.str(); +} + +template +std::string TA2AMesonField::filename(unsigned int m, unsigned int g) const +{ + return par().output + "." + std::to_string(vm().getTrajectory()) + + "/" + ioname(m, g) + ".h5"; +} + +template +void TA2AMesonField::initFile(unsigned int m, unsigned int g) +{ +#ifdef HAVE_HDF5 + std::string f = filename(m, g); + GridBase *grid = env().getGrid(); + auto &v = envGet(std::vector, par().v); + auto &w = envGet(std::vector, par().w); + int nt = env().getDim().back(); + int N_i = w.size(); + int N_j = v.size(); + + makeFileDir(f, grid); + if (grid->IsBoss()) + { + Hdf5Writer writer(f); + std::vector dim = {static_cast(nt), + static_cast(N_i), + static_cast(N_j)}; + H5NS::DataSpace dataspace(dim.size(), dim.data()); + H5NS::DataSet dataset; + + push(writer, ioname(m, g)); + write(writer, "momentum", mom_[m]); + write(writer, "gamma", gamma_[g]); + auto &group = writer.getGroup(); + dataset = group.createDataSet("mesonField", Hdf5Type::type(), + dataspace); + } +#else + HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); +#endif +} + +template +void TA2AMesonField::saveBlock(const MesonField &mf, + unsigned int m, unsigned int g, + unsigned int i, unsigned int j) +{ +#ifdef HAVE_HDF5 + std::string f = filename(m, g); + GridBase *grid = env().getGrid(); + + if (grid->IsBoss()) + { + Hdf5Reader reader(f); + hsize_t nt = mf.dimension(2), + Ni = mf.dimension(3), + Nj = mf.dimension(4); + std::vector count = {nt, Ni, Nj}, + offset = {0, static_cast(i), + static_cast(j)}, + stride = {1, 1, 1}, + block = {1, 1, 1}; + H5NS::DataSpace memspace(count.size(), count.data()), dataspace; + H5NS::DataSet dataset; + size_t shift; + + push(reader, ioname(m, g)); + auto &group = reader.getGroup(); + dataset = group.openDataSet("mesonField"); + dataspace = dataset.getSpace(); + dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(), + stride.data(), block.data()); + shift = (m*mf.dimension(1) + g)*nt*Ni*Nj; + dataset.write(mf.data() + shift, Hdf5Type::type(), memspace, + dataspace); + } +#else + HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); +#endif +} + END_MODULE_NAMESPACE END_HADRONS_NAMESPACE diff --git a/lib/serialisation/Hdf5IO.cc b/lib/serialisation/Hdf5IO.cc index b915a988..ca2457fa 100644 --- a/lib/serialisation/Hdf5IO.cc +++ b/lib/serialisation/Hdf5IO.cc @@ -63,7 +63,7 @@ Group & Hdf5Writer::getGroup(void) // Reader implementation /////////////////////////////////////////////////////// Hdf5Reader::Hdf5Reader(const std::string &fileName) : fileName_(fileName) -, file_(fileName.c_str(), H5F_ACC_RDONLY) +, file_(fileName.c_str(), H5F_ACC_RDWR) { group_ = file_.openGroup("/"); readSingleAttribute(dataSetThres_, HDF5_GRID_GUARD "dataset_threshold", From 07a0ef3f957f45757d0a9cf67de1ddb8439f1883 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 13 Aug 2018 16:44:57 +0100 Subject: [PATCH 442/620] Hadrons: global measurement time profile --- extras/Hadrons/VirtualMachine.cc | 8 ++++++++ extras/Hadrons/VirtualMachine.hpp | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index 74579588..c38b61ee 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -664,6 +664,7 @@ void VirtualMachine::executeProgram(const Program &p) // program execution LOG(Debug) << "Executing program..." << std::endl; + totalTime_ = GridTime::zero(); for (unsigned int i = 0; i < p.size(); ++i) { // execute module @@ -693,6 +694,8 @@ void VirtualMachine::executeProgram(const Program &p) LOG(Message) << "* CUSTOM TIMERS" << std::endl; printTimeProfile(ctiming, total); } + timeProfile_[module_[p[i]].name] = total; + totalTime_ += total; // print used memory after execution LOG(Message) << SMALL_SEP << " Memory management" << std::endl; LOG(Message) << "Allocated objects: " << MEM_MSG(sizeBefore) @@ -719,6 +722,11 @@ void VirtualMachine::executeProgram(const Program &p) LOG(Message) << "Nothing to free" << std::endl; } } + // print total time profile + LOG(Message) << SEP << " Measurement time profile" << SEP << std::endl; + LOG(Message) << "Total measurement time: " << totalTime_ << " us" << std::endl; + LOG(Message) << SMALL_SEP << " Module breakdown" << std::endl; + printTimeProfile(timeProfile_, totalTime_); } void VirtualMachine::executeProgram(const std::vector &p) diff --git a/extras/Hadrons/VirtualMachine.hpp b/extras/Hadrons/VirtualMachine.hpp index 1fa2daa9..7e6e36c2 100644 --- a/extras/Hadrons/VirtualMachine.hpp +++ b/extras/Hadrons/VirtualMachine.hpp @@ -165,7 +165,10 @@ private: Graph graph_; // memory profile bool memoryProfileOutdated_{true}; - MemoryProfile profile_; + MemoryProfile profile_; + // time profile + GridTime totalTime_; + std::map timeProfile_; }; /****************************************************************************** From 603d59f3890b4954d1e74a12c18895bfc28438ec Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 13 Aug 2018 20:17:24 +0100 Subject: [PATCH 443/620] Hadrons: code cleaning --- extras/Hadrons/Application.cc | 2 +- extras/Hadrons/Global.cc | 2 ++ extras/Hadrons/VirtualMachine.cc | 4 ---- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index cff1b619..b2a1987e 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -60,7 +60,7 @@ Application::Application(void) LOG(Message) << "MPI partition : " << mpi << std::endl; LOG(Message) << "Local lattice : " << loc << std::endl; LOG(Message) << std::endl; - LOG(Message) << "** Default parameters (and associated C macro)" << std::endl; + LOG(Message) << "** Default parameters (and associated C macros)" << std::endl; LOG(Message) << "ASCII output precision : " << MACOUT(DEFAULT_ASCII_PREC) << std::endl; LOG(Message) << "Fermion implementation : " << MACOUTS(FIMPL) << std::endl; LOG(Message) << "z-Fermion implementation: " << MACOUTS(ZFIMPL) << std::endl; diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index 8c0cf799..a173bd8b 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -182,6 +182,7 @@ void Hadrons::printTimeProfile(const std::map &timing, std::map> rtiming; const double dtotal = static_cast(total.count()); auto cf = std::cout.flags(); + auto p = std::cout.precision(); unsigned int width = 0; for (auto &t: timing) @@ -198,4 +199,5 @@ void Hadrons::printTimeProfile(const std::map &timing, << std::endl; } std::cout.flags(cf); + std::cout.precision(p); } diff --git a/extras/Hadrons/VirtualMachine.cc b/extras/Hadrons/VirtualMachine.cc index c38b61ee..17aaaf63 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/extras/Hadrons/VirtualMachine.cc @@ -637,10 +637,6 @@ VirtualMachine::Program VirtualMachine::schedule(const GeneticPar &par) #define SEP "----------------" #define SMALL_SEP "................" #define MEM_MSG(size) sizeString(size) -#define PRINT_TIME(name, t, total) \ -std::right << std::setw(30) << name << ": " << t.count() << " us (" \ -<< std::fixed << std::setprecision(1) \ -<< static_cast((t).count())/total*100 << "%)" void VirtualMachine::executeProgram(const Program &p) { From 3c27bb36d482879ffa1d11e9bdb1fb114beaff99 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 13 Aug 2018 20:17:45 +0100 Subject: [PATCH 444/620] Hadrons: direct timer access --- extras/Hadrons/Module.cc | 18 ++++++++++++++++++ extras/Hadrons/Module.hpp | 1 + 2 files changed, 19 insertions(+) diff --git a/extras/Hadrons/Module.cc b/extras/Hadrons/Module.cc index 8ac33ccf..f0f3def1 100644 --- a/extras/Hadrons/Module.cc +++ b/extras/Hadrons/Module.cc @@ -75,6 +75,24 @@ void ModuleBase::startTimer(const std::string &name) } } +GridTime ModuleBase::getTimer(const std::string &name) +{ + GridTime t; + + if (!name.empty()) + { + stopTimer(name); + t = timer_.at(name).Elapsed(); + startTimer(name); + } + else + { + t = GridTime::zero(); + } + + return t; +} + void ModuleBase::startCurrentTimer(const std::string &name) { if (!name.empty()) diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index f3d87c2d..8f260c19 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -165,6 +165,7 @@ public: void operator()(void); // timers void startTimer(const std::string &name); + GridTime getTimer(const std::string &name); void startCurrentTimer(const std::string &name); void stopTimer(const std::string &name); void stopCurrentTimer(void); From f2d3e41cf2bed1cb13614cdc0333b83e606032a9 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Mon, 13 Aug 2018 20:18:33 +0100 Subject: [PATCH 445/620] Hadrons: meson field: HDF5 perf, gamma input and Eigen tensors allocated by Grid --- .../Modules/MContraction/A2AMesonField.hpp | 75 +++++++++++++++---- 1 file changed, 62 insertions(+), 13 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 5bb4b4c3..e0818874 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -56,6 +56,7 @@ class A2AMesonFieldPar: Serializable std::string, v, std::string, w, std::string, output, + std::string, gammas, std::vector, mom); }; @@ -65,7 +66,7 @@ class TA2AMesonField : public Module public: FERM_TYPE_ALIASES(FImpl,); SOLVER_TYPE_ALIASES(FImpl,); - typedef Eigen::Tensor MesonField; + typedef Eigen::TensorMap> MesonField; public: // constructor TA2AMesonField(const std::string name); @@ -139,6 +140,10 @@ std::vector TA2AMesonField::getOutput(void) template void TA2AMesonField::setup(void) { + gamma_.clear(); + mom_.clear(); + if (par().gammas == "all") + { gamma_ = { Gamma::Algebra::Gamma5, Gamma::Algebra::Identity, @@ -157,18 +162,38 @@ void TA2AMesonField::setup(void) Gamma::Algebra::SigmaYT, Gamma::Algebra::SigmaZT }; + } + else + { + gamma_ = strToVec(par().gammas); + } + for (auto &pstr: par().mom) + { + auto p = strToVec(pstr); + if (p.size() != env().getNd() - 1) + { + HADRONS_ERROR(Size, "Momentum has " + std::to_string(p.size()) + + " components instead of " + + std::to_string(env().getNd() - 1)); + } + mom_.push_back(p); + } + envCache(std::vector, momphName_, 1, par().mom.size(), env().getGrid()); envTmpLat(LatticeComplex, "coor"); + // preallocate memory for meson field block + auto tgp = env().getDim().back()*gamma_.size()*mom_.size(); + + envTmp(Vector, "mfBuf", 1, tgp*par().block*par().block); + envTmp(Vector, "mfCache", 1, tgp*par().cacheBlock*par().cacheBlock); } // execution /////////////////////////////////////////////////////////////////// template void TA2AMesonField::execute(void) { - LOG(Message) << "Computing all-to-all meson fields" << std::endl; - auto &v = envGet(std::vector, par().v); auto &w = envGet(std::vector, par().w); @@ -176,10 +201,25 @@ void TA2AMesonField::execute(void) int N_i = w.size(); int N_j = v.size(); int ngamma = gamma_.size(); - int nmom = par().mom.size(); + int nmom = mom_.size(); int block = par().block; int cacheBlock = par().cacheBlock; + LOG(Message) << "Computing all-to-all meson fields" << std::endl; + LOG(Message) << "W: '" << par().w << "' V: '" << par().v << "'" << std::endl; + LOG(Message) << "Meson field size: " << nt << "*" << N_i << "*" << N_j + << " (" << sizeString(nt*N_i*N_j*sizeof(Complex)) << ")" << std::endl; + LOG(Message) << "Momenta:" << std::endl; + for (auto &p: mom_) + { + LOG(Message) << " " << p << std::endl; + } + LOG(Message) << "Spin structures:" << std::endl; + for (auto &g: gamma_) + { + LOG(Message) << " " << g << std::endl; + } + /////////////////////////////////////////////// // Momentum setup /////////////////////////////////////////////// @@ -194,7 +234,6 @@ void TA2AMesonField::execute(void) std::vector p; envGetTmp(LatticeComplex, coor); - mom_.push_back(strToVec(par().mom[j])); ph[j] = zero; for(unsigned int mu = 0; mu < mom_[j].size(); mu++) { @@ -205,7 +244,7 @@ void TA2AMesonField::execute(void) } hasPhase_ = true; } - LOG(Message) << "MesonField size " << N_i << "x" << N_j << "x" << nt << std::endl; + ////////////////////////////////////////////////////////////////////////// // i,j is first loop over SchurBlock factors reusing 5D matrices @@ -224,6 +263,9 @@ void TA2AMesonField::execute(void) double t_int_2=0; double t_int_3=0; + envGetTmp(Vector, mfBuf); + envGetTmp(Vector, mfCache); + double t0 = usecond(); int NBlock_i = N_i/block + (((N_i % block) != 0) ? 1 : 0); int NBlock_j = N_j/block + (((N_j % block) != 0) ? 1 : 0); @@ -244,7 +286,7 @@ void TA2AMesonField::execute(void) << i+N_ii-1 << ", " << j <<" .. " << j+N_jj-1 << "]" << std::endl; - MesonField mfBlock(nmom,ngamma,nt,N_ii,N_jj); + MesonField mfBlock(mfBuf.data(),nmom,ngamma,nt,N_ii,N_jj); // Series of cache blocked chunks of the contractions within this block for(int ii=0;ii::execute(void) { int N_iii = MIN(N_ii-ii,cacheBlock); int N_jjj = MIN(N_jj-jj,cacheBlock); - MesonField mfCache(nmom,ngamma,nt,N_iii,N_jjj); + MesonField mfCacheBlock(mfCache.data(),nmom,ngamma,nt,N_iii,N_jjj); t_contr-=usecond(); - makeBlock(mfCache, &w[i+ii], &v[j+jj], gamma_, ph, + makeBlock(mfCacheBlock, &w[i+ii], &v[j+jj], gamma_, ph, env().getNd() - 1, t_int_0, t_int_1, t_int_2, t_int_3); t_contr+=usecond(); @@ -271,11 +313,13 @@ void TA2AMesonField::execute(void) for(int g =0;g< ngamma;g++) for(int t =0;t< nt;t++) { - mfBlock(m,g,t,ii+iii,jj+jjj) = mfCache(m,g,t,iii,jjj); + mfBlock(m,g,t,ii+iii,jj+jjj) = mfCacheBlock(m,g,t,iii,jjj); } } // IO + double blockSize, ioTime; + MODULE_TIMER("IO"); for(int m = 0; m < nmom; m++) for(int g = 0; g < ngamma; g++) @@ -286,13 +330,17 @@ void TA2AMesonField::execute(void) } saveBlock(mfBlock, m, g, i, j); } + blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); + ioTime = static_cast(this->getTimer("IO").count()); + LOG(Message) << "HDF5 IO " << blockSize/ioTime*1.0e6/1024/1024 + << " MB/s" << std::endl; } double nodes = env().getGrid()->NodeCount(); double t_kernel = t_int_0 + t_int_1; - LOG(Message) << "Perf " << flops/t_kernel/1.0e3/nodes << " Gflop/s/node " << std::endl; - LOG(Message) << "Perf " << bytes/t_kernel/1.0e3/nodes << " GB/s/node " << std::endl; + LOG(Message) << "Perf " << flops/(t_kernel)/1.0e3/nodes << " Gflop/s/node " << std::endl; + LOG(Message) << "Perf " << bytes/(t_kernel)/1.0e3/nodes << " GB/s/node " << std::endl; } ////////////////////////////////////////////////////////////////////////////////// @@ -349,7 +397,8 @@ void TA2AMesonField::makeBlock(MesonField &mat, } Vector lsSum(MFlvol); - parallel_for (int r = 0; r < MFlvol; r++){ + parallel_for (int r = 0; r < MFlvol; r++) + { lsSum[r]=scalar_type(0.0); } From 89d2fac92e17921f701ff78b1fb8bd53b4054b13 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 12:15:24 +0100 Subject: [PATCH 446/620] Hadrons: copyright update --- extras/Hadrons/A2AVectors.hpp | 2 +- extras/Hadrons/DilutedNoise.hpp | 2 +- extras/Hadrons/Global.cc | 2 +- extras/Hadrons/Module.cc | 22 +- extras/Hadrons/Module.hpp | 3 +- extras/Hadrons/Modules.hpp | 35 +++ .../Modules/MContraction/A2AMesonField.cc | 1 + .../Modules/MContraction/A2AMesonField.hpp | 282 +++--------------- .../MContraction/A2AMesonFieldKernels.hpp | 226 ++++++++++++++ extras/Hadrons/Modules/MFermion/FreeProp.cc | 1 + extras/Hadrons/Modules/MGauge/UnitEm.cc | 1 + extras/Hadrons/Modules/MGauge/UnitEm.hpp | 1 + extras/Hadrons/Modules/MScalar/ScalarVP.cc | 1 + extras/Hadrons/Modules/MScalar/ScalarVP.hpp | 1 + .../Hadrons/Modules/MScalar/VPCounterTerms.cc | 1 + .../Modules/MScalar/VPCounterTerms.hpp | 1 + extras/Hadrons/Modules/MSolver/A2AVectors.hpp | 14 +- .../Modules/MUtilities/RandomVectors.cc | 27 ++ .../Modules/MUtilities/RandomVectors.hpp | 27 ++ extras/Hadrons/modules.inc | 1 + 20 files changed, 401 insertions(+), 250 deletions(-) create mode 100644 extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp diff --git a/extras/Hadrons/A2AVectors.hpp b/extras/Hadrons/A2AVectors.hpp index 4cbc7f2a..6e865203 100644 --- a/extras/Hadrons/A2AVectors.hpp +++ b/extras/Hadrons/A2AVectors.hpp @@ -219,4 +219,4 @@ void A2AVectorsSchurDiagTwo::makeHighModeW5D(FermionField &wout_4d, END_HADRONS_NAMESPACE -#endif // A2A_Vectors_hpp_ \ No newline at end of file +#endif // A2A_Vectors_hpp_ diff --git a/extras/Hadrons/DilutedNoise.hpp b/extras/Hadrons/DilutedNoise.hpp index 16561c99..250f8445 100644 --- a/extras/Hadrons/DilutedNoise.hpp +++ b/extras/Hadrons/DilutedNoise.hpp @@ -188,4 +188,4 @@ void TimeDilutedSpinColorDiagonalNoise::generateNoise(GridParallelRNG &rn END_HADRONS_NAMESPACE -#endif // Hadrons_DilutedNoise_hpp_ \ No newline at end of file +#endif // Hadrons_DilutedNoise_hpp_ diff --git a/extras/Hadrons/Global.cc b/extras/Hadrons/Global.cc index a173bd8b..1e747cda 100644 --- a/extras/Hadrons/Global.cc +++ b/extras/Hadrons/Global.cc @@ -192,7 +192,7 @@ void Hadrons::printTimeProfile(const std::map &timing, } for (auto &rt: rtiming) { - LOG(Message) << std::right << std::setw(width) << rt.second << ": " + LOG(Message) << std::setw(width) << rt.second << ": " << rt.first << " us (" << std::fixed << std::setprecision(1) << static_cast(rt.first)/dtotal*100 << "%)" diff --git a/extras/Hadrons/Module.cc b/extras/Hadrons/Module.cc index f0f3def1..8e915f6b 100644 --- a/extras/Hadrons/Module.cc +++ b/extras/Hadrons/Module.cc @@ -78,12 +78,21 @@ void ModuleBase::startTimer(const std::string &name) GridTime ModuleBase::getTimer(const std::string &name) { GridTime t; - + if (!name.empty()) { - stopTimer(name); - t = timer_.at(name).Elapsed(); - startTimer(name); + try + { + bool running = timer_.at(name).isRunning(); + + if (running) stopTimer(name); + t = timer_.at(name).Elapsed(); + if (running) startTimer(name); + } + catch (std::out_of_range &) + { + t = GridTime::zero(); + } } else { @@ -93,6 +102,11 @@ GridTime ModuleBase::getTimer(const std::string &name) return t; } +double ModuleBase::getDTimer(const std::string &name) +{ + return static_cast(getTimer(name).count()); +} + void ModuleBase::startCurrentTimer(const std::string &name) { if (!name.empty()) diff --git a/extras/Hadrons/Module.hpp b/extras/Hadrons/Module.hpp index 8f260c19..02a20e5f 100644 --- a/extras/Hadrons/Module.hpp +++ b/extras/Hadrons/Module.hpp @@ -129,8 +129,6 @@ if (env().getGrid()->IsBoss() and !ioStem.empty())\ }\ } -#define MODULE_TIMER(name) this->startCurrentTimer(name) - /****************************************************************************** * Module class * ******************************************************************************/ @@ -166,6 +164,7 @@ public: // timers void startTimer(const std::string &name); GridTime getTimer(const std::string &name); + double getDTimer(const std::string &name); void startCurrentTimer(const std::string &name); void stopTimer(const std::string &name); void stopCurrentTimer(void); diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 5cce335a..86d50755 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -1,5 +1,40 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Guido Cossu +Author: James Harrison +Author: Lanny91 +Author: Peter Boyle +Author: Vera Guelpers +Author: fionnoh +Author: pretidav + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc index ffc45e22..3d85acb5 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.cc @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MContraction/A2AMesonField.cc Copyright (C) 2015-2018 +Author: Antonin Portelli Author: paboyle This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index e0818874..568985bc 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -34,8 +34,8 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include -#include #include +#include BEGIN_HADRONS_NAMESPACE @@ -44,9 +44,6 @@ BEGIN_HADRONS_NAMESPACE ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MContraction) -typedef std::pair GammaPair; - - class A2AMesonFieldPar: Serializable { public: @@ -66,7 +63,6 @@ class TA2AMesonField : public Module public: FERM_TYPE_ALIASES(FImpl,); SOLVER_TYPE_ALIASES(FImpl,); - typedef Eigen::TensorMap> MesonField; public: // constructor TA2AMesonField(const std::string name); @@ -144,24 +140,24 @@ void TA2AMesonField::setup(void) mom_.clear(); if (par().gammas == "all") { - gamma_ = { - Gamma::Algebra::Gamma5, - Gamma::Algebra::Identity, - Gamma::Algebra::GammaX, - Gamma::Algebra::GammaY, - Gamma::Algebra::GammaZ, - Gamma::Algebra::GammaT, - Gamma::Algebra::GammaXGamma5, - Gamma::Algebra::GammaYGamma5, - Gamma::Algebra::GammaZGamma5, - Gamma::Algebra::GammaTGamma5, - Gamma::Algebra::SigmaXY, - Gamma::Algebra::SigmaXZ, - Gamma::Algebra::SigmaXT, - Gamma::Algebra::SigmaYZ, - Gamma::Algebra::SigmaYT, - Gamma::Algebra::SigmaZT - }; + gamma_ = { + Gamma::Algebra::Gamma5, + Gamma::Algebra::Identity, + Gamma::Algebra::GammaX, + Gamma::Algebra::GammaY, + Gamma::Algebra::GammaZ, + Gamma::Algebra::GammaT, + Gamma::Algebra::GammaXGamma5, + Gamma::Algebra::GammaYGamma5, + Gamma::Algebra::GammaZGamma5, + Gamma::Algebra::GammaTGamma5, + Gamma::Algebra::SigmaXY, + Gamma::Algebra::SigmaXZ, + Gamma::Algebra::SigmaXT, + Gamma::Algebra::SigmaYZ, + Gamma::Algebra::SigmaYT, + Gamma::Algebra::SigmaZT + }; } else { @@ -227,7 +223,7 @@ void TA2AMesonField::execute(void) if (!hasPhase_) { - MODULE_TIMER("Momentum phases"); + startTimer("Momentum phases"); for (unsigned int j = 0; j < nmom; ++j) { Complex i(0.0,1.0); @@ -243,9 +239,9 @@ void TA2AMesonField::execute(void) ph[j] = exp((Real)(2*M_PI)*i*ph[j]); } hasPhase_ = true; + stopTimer("Momentum phases"); } - ////////////////////////////////////////////////////////////////////////// // i,j is first loop over SchurBlock factors reusing 5D matrices // ii,jj is second loop over cacheBlock factors for high perf contractoin @@ -256,12 +252,8 @@ void TA2AMesonField::execute(void) double flops = 0.0; double bytes = 0.0; double vol = env().getVolume(); - double t_schur=0; double t_contr=0; - double t_int_0=0; - double t_int_1=0; - double t_int_2=0; - double t_int_3=0; + envGetTmp(Vector, mfBuf); envGetTmp(Vector, mfCache); @@ -277,9 +269,6 @@ void TA2AMesonField::execute(void) int N_ii = MIN(N_i-i,block); int N_jj = MIN(N_j-j,block); - t_schur-=usecond(); - t_schur+=usecond(); - LOG(Message) << "Meson field block " << j/block + NBlock_j*i/block + 1 << "/" << NBlock_i*NBlock_j << " [" << i <<" .. " @@ -296,17 +285,17 @@ void TA2AMesonField::execute(void) int N_jjj = MIN(N_jj-jj,cacheBlock); MesonField mfCacheBlock(mfCache.data(),nmom,ngamma,nt,N_iii,N_jjj); - t_contr-=usecond(); - makeBlock(mfCacheBlock, &w[i+ii], &v[j+jj], gamma_, ph, - env().getNd() - 1, t_int_0, t_int_1, t_int_2, t_int_3); - t_contr+=usecond(); + startTimer("contraction: total"); + makeMesonFieldBlock(mfCacheBlock, &w[i+ii], &v[j+jj], gamma_, ph, + env().getNd() - 1, this); + stopTimer("contraction: total"); // flops for general N_c & N_s flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; - MODULE_TIMER("Cache copy"); + startTimer("cache copy"); for(int iii=0;iii< N_iii;iii++) for(int jjj=0;jjj< N_jjj;jjj++) for(int m =0;m< nmom;m++) @@ -315,223 +304,44 @@ void TA2AMesonField::execute(void) { mfBlock(m,g,t,ii+iii,jj+jjj) = mfCacheBlock(m,g,t,iii,jjj); } + stopTimer("cache copy"); } // IO + if (!par().output.empty()) + { double blockSize, ioTime; - MODULE_TIMER("IO"); + LOG(Message) << "Writing block to disk" << std::endl; + ioTime = -getDTimer("IO: write block"); + startTimer("IO: total"); for(int m = 0; m < nmom; m++) for(int g = 0; g < ngamma; g++) { if ((i == 0) and (j == 0)) { + startTimer("IO: file creation"); initFile(m, g); + stopTimer("IO: file creation"); } + startTimer("IO: write block"); saveBlock(mfBlock, m, g, i, j); + stopTimer("IO: write block"); } - blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); - ioTime = static_cast(this->getTimer("IO").count()); - LOG(Message) << "HDF5 IO " << blockSize/ioTime*1.0e6/1024/1024 + stopTimer("IO: total"); + blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); + ioTime += getDTimer("IO: write block"); + LOG(Message) << "HDF5 IO done " << blockSize/ioTime*1.0e6/1024/1024 << " MB/s" << std::endl; } + } double nodes = env().getGrid()->NodeCount(); - double t_kernel = t_int_0 + t_int_1; + double t_kernel = getDTimer("contraction: colour trace & mom.") + + getDTimer("contraction: local space sum"); - LOG(Message) << "Perf " << flops/(t_kernel)/1.0e3/nodes << " Gflop/s/node " << std::endl; - LOG(Message) << "Perf " << bytes/(t_kernel)/1.0e3/nodes << " GB/s/node " << std::endl; -} - -////////////////////////////////////////////////////////////////////////////////// -// Cache blocked arithmetic routine -// Could move to Grid ??? -////////////////////////////////////////////////////////////////////////////////// -template -void TA2AMesonField::makeBlock(MesonField &mat, - const FermionField *lhs_wi, - const FermionField *rhs_vj, - std::vector gamma, - const std::vector &mom, - int orthogdim, - double &t0, - double &t1, - double &t2, - double &t3) -{ - typedef typename FImpl::SiteSpinor vobj; - - typedef typename vobj::scalar_object sobj; - typedef typename vobj::scalar_type scalar_type; - typedef typename vobj::vector_type vector_type; - - typedef iSpinMatrix SpinMatrix_v; - typedef iSpinMatrix SpinMatrix_s; - - int Lblock = mat.dimension(3); - int Rblock = mat.dimension(4); - - GridBase *grid = lhs_wi[0]._grid; - - const int Nd = grid->_ndimension; - const int Nsimd = grid->Nsimd(); - - int Nt = grid->GlobalDimensions()[orthogdim]; - int Ngamma = gamma.size(); - int Nmom = mom.size(); - - int fd=grid->_fdimensions[orthogdim]; - int ld=grid->_ldimensions[orthogdim]; - int rd=grid->_rdimensions[orthogdim]; - - // will locally sum vectors first - // sum across these down to scalars - // splitting the SIMD - int MFrvol = rd*Lblock*Rblock*Nmom; - int MFlvol = ld*Lblock*Rblock*Nmom; - - Vector lvSum(MFrvol); - parallel_for (int r = 0; r < MFrvol; r++) - { - lvSum[r] = zero; - } - - Vector lsSum(MFlvol); - parallel_for (int r = 0; r < MFlvol; r++) - { - lsSum[r]=scalar_type(0.0); - } - - int e1= grid->_slice_nblock[orthogdim]; - int e2= grid->_slice_block [orthogdim]; - int stride=grid->_slice_stride[orthogdim]; - - t0-=usecond(); - MODULE_TIMER("Colour trace * mom."); - // Nested parallelism would be ok - // Wasting cores here. Test case r - parallel_for(int r=0;r_ostride[orthogdim]; // base offset for start of plane - - for(int n=0;n icoor(Nd); - std::vector extracted(Nsimd); - - for(int i=0;iiCoorFromIindex(icoor,idx); - - int ldx = rt+icoor[orthogdim]*rd; - int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; - - lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; - } - } - } - t1+=usecond(); - assert(mat.dimension(0) == Nmom); - assert(mat.dimension(1) == Ngamma); - assert(mat.dimension(2) == Nt); - t2-=usecond(); - - // ld loop and local only?? - MODULE_TIMER("Spin trace"); - int pd = grid->_processors[orthogdim]; - int pc = grid->_processor_coor[orthogdim]; - parallel_for_nest2(int lt=0;ltGlobalSumVector(&mat(0,0,0,0,0),Nmom*Ngamma*Nt*Lblock*Rblock); - t3+=usecond(); + LOG(Message) << "Perf " << flops/t_kernel/1.0e3/nodes << " Gflop/s/node " << std::endl; + LOG(Message) << "Perf " << bytes/t_kernel/1.0e3/nodes << " GB/s/node " << std::endl; } // IO diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp new file mode 100644 index 00000000..4d06f796 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp @@ -0,0 +1,226 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Peter Boyle + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef Hadrons_MContraction_A2AMesonFieldKernels_hpp_ +#define Hadrons_MContraction_A2AMesonFieldKernels_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +BEGIN_MODULE_NAMESPACE(MContraction) + +typedef Eigen::TensorMap> MesonField; + +//////////////////////////////////////////////////////////////////////////////// +// Cache blocked arithmetic routine +// Could move to Grid ??? +//////////////////////////////////////////////////////////////////////////////// +template +void makeMesonFieldBlock(MesonField &mat, + const Field *lhs_wi, + const Field *rhs_vj, + std::vector gamma, + const std::vector &mom, + int orthogdim, + ModuleBase *caller = nullptr) +{ + typedef typename Field::vector_object vobj; + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + typedef iSpinMatrix SpinMatrix_v; + typedef iSpinMatrix SpinMatrix_s; + + int Lblock = mat.dimension(3); + int Rblock = mat.dimension(4); + + GridBase *grid = lhs_wi[0]._grid; + + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + + int Nt = grid->GlobalDimensions()[orthogdim]; + int Ngamma = gamma.size(); + int Nmom = mom.size(); + + int fd=grid->_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + // will locally sum vectors first + // sum across these down to scalars + // splitting the SIMD + int MFrvol = rd*Lblock*Rblock*Nmom; + int MFlvol = ld*Lblock*Rblock*Nmom; + + Vector lvSum(MFrvol); + parallel_for (int r = 0; r < MFrvol; r++) + { + lvSum[r] = zero; + } + + Vector lsSum(MFlvol); + parallel_for (int r = 0; r < MFlvol; r++) + { + lsSum[r]=scalar_type(0.0); + } + + int e1= grid->_slice_nblock[orthogdim]; + int e2= grid->_slice_block [orthogdim]; + int stride=grid->_slice_stride[orthogdim]; + + if (caller) caller->startTimer("contraction: colour trace & mom."); + // Nested parallelism would be ok + // Wasting cores here. Test case r + parallel_for(int r=0;r_ostride[orthogdim]; // base offset for start of plane + + for(int n=0;nstopTimer("contraction: colour trace & mom."); + + // Sum across simd lanes in the plane, breaking out orthog dir. + if (caller) caller->startTimer("contraction: local space sum"); + parallel_for(int rt=0;rt icoor(Nd); + std::vector extracted(Nsimd); + + for(int i=0;iiCoorFromIindex(icoor,idx); + + int ldx = rt+icoor[orthogdim]*rd; + int ij_ldx = m+Nmom*i+Nmom*Lblock*j+Nmom*Lblock*Rblock*ldx; + + lsSum[ij_ldx]=lsSum[ij_ldx]+extracted[idx]; + } + } + } + if (caller) caller->stopTimer("contraction: local space sum"); + + // ld loop and local only?? + if (caller) caller->startTimer("contraction: spin trace"); + int pd = grid->_processors[orthogdim]; + int pc = grid->_processor_coor[orthogdim]; + parallel_for_nest2(int lt=0;ltstopTimer("contraction: spin trace"); + //////////////////////////////////////////////////////////////////// + // This global sum is taking as much as 50% of time on 16 nodes + // Vector size is 7 x 16 x 32 x 16 x 16 x sizeof(complex) = 2MB - 60MB depending on volume + // Healthy size that should suffice + //////////////////////////////////////////////////////////////////// + if (caller) caller->startTimer("contraction: global sum"); + grid->GlobalSumVector(&mat(0,0,0,0,0),Nmom*Ngamma*Nt*Lblock*Rblock); + if (caller) caller->stopTimer("contraction: global sum"); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif //Hadrons_MContraction_A2AMesonField_hpp_ diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.cc b/extras/Hadrons/Modules/MFermion/FreeProp.cc index 7b3a0ce5..0ff07887 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.cc +++ b/extras/Hadrons/Modules/MFermion/FreeProp.cc @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MFermion/FreeProp.cc Copyright (C) 2015-2018 +Author: Antonin Portelli Author: Vera Guelpers This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/extras/Hadrons/Modules/MGauge/UnitEm.cc index 6b3be47e..5c076592 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/extras/Hadrons/Modules/MGauge/UnitEm.cc @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MGauge/UnitEm.cc Copyright (C) 2015-2018 +Author: Antonin Portelli Author: James Harrison This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.hpp b/extras/Hadrons/Modules/MGauge/UnitEm.hpp index a9cb9dfa..c6c89bb0 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.hpp +++ b/extras/Hadrons/Modules/MGauge/UnitEm.hpp @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MGauge/UnitEm.hpp Copyright (C) 2015-2018 +Author: Antonin Portelli Author: James Harrison This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/extras/Hadrons/Modules/MScalar/ScalarVP.cc index d560ec5a..b43b0c9f 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.cc @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MScalar/ScalarVP.cc Copyright (C) 2015-2018 +Author: Antonin Portelli Author: James Harrison This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp index e1b2dc3d..191348d3 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/extras/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MScalar/ScalarVP.hpp Copyright (C) 2015-2018 +Author: Antonin Portelli Author: James Harrison This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc index 86867788..4c3fab85 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MScalar/VPCounterTerms.cc Copyright (C) 2015-2018 +Author: Antonin Portelli Author: James Harrison This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp index a2ccbb56..92d37686 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp +++ b/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -6,6 +6,7 @@ Source file: extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp Copyright (C) 2015-2018 +Author: Antonin Portelli Author: James Harrison This program is free software; you can redistribute it and/or modify diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp index 6d150499..7022b90b 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/extras/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -178,7 +178,7 @@ void TA2AVectors::execute(void) { auto &epack = envGet(Pack, par().eigenPack); - MODULE_TIMER("V low mode"); + startTimer("V low mode"); LOG(Message) << "V vector i = " << il << " (low mode)" << std::endl; if (Ls == 1) { @@ -189,7 +189,8 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, f5); a2a.makeLowModeV5D(v[il], f5, epack.evec[il], epack.eval[il]); } - MODULE_TIMER("W low mode"); + stopTimer("V low mode"); + startTimer("W low mode"); LOG(Message) << "W vector i = " << il << " (low mode)" << std::endl; if (Ls == 1) { @@ -199,13 +200,14 @@ void TA2AVectors::execute(void) { envGetTmp(FermionField, f5); a2a.makeLowModeW5D(w[il], f5, epack.evec[il], epack.eval[il]); - } + } + stopTimer("W low mode"); } // High modes for (unsigned int ih = 0; ih < noise.size(); ih++) { - MODULE_TIMER("V high mode"); + startTimer("V high mode"); LOG(Message) << "V vector i = " << Nl_ + ih << " (" << ((Nl_ > 0) ? "high " : "") << "stochastic mode)" << std::endl; @@ -218,7 +220,8 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, f5); a2a.makeHighModeV5D(v[Nl_ + ih], f5, noise[ih]); } - MODULE_TIMER("W high mode"); + stopTimer("V high mode"); + startTimer("W high mode"); LOG(Message) << "W vector i = " << Nl_ + ih << " (" << ((Nl_ > 0) ? "high " : "") << "stochastic mode)" << std::endl; @@ -231,6 +234,7 @@ void TA2AVectors::execute(void) envGetTmp(FermionField, f5); a2a.makeHighModeW5D(w[Nl_ + ih], f5, noise[ih]); } + stopTimer("W high mode"); } } diff --git a/extras/Hadrons/Modules/MUtilities/RandomVectors.cc b/extras/Hadrons/Modules/MUtilities/RandomVectors.cc index cc122c90..7da32322 100644 --- a/extras/Hadrons/Modules/MUtilities/RandomVectors.cc +++ b/extras/Hadrons/Modules/MUtilities/RandomVectors.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MUtilities/RandomVectors.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp b/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp index 590ef224..4da84506 100644 --- a/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp +++ b/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MUtilities/RandomVectors.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MUtilities_RandomVectors_hpp_ #define Hadrons_MUtilities_RandomVectors_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index 6bc07618..eef12b0d 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -61,6 +61,7 @@ modules_cc =\ modules_hpp =\ Modules/MContraction/Baryon.hpp \ Modules/MContraction/A2AMesonField.hpp \ + Modules/MContraction/A2AMesonFieldKernels.hpp \ Modules/MContraction/Meson.hpp \ Modules/MContraction/WeakHamiltonian.hpp \ Modules/MContraction/WeakHamiltonianNonEye.hpp \ From f4878d3a13ff762a9f4aa5017a880ede1dd4346c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 14:02:37 +0100 Subject: [PATCH 447/620] Hadrons: meson field threaded cache copy --- .../Modules/MContraction/A2AMesonField.hpp | 25 ++++++++++--------- .../MContraction/A2AMesonFieldKernels.hpp | 2 +- lib/cshift/Cshift_common.h | 6 ++--- lib/lattice/Lattice_reduction.h | 2 +- lib/threads/Threads.h | 4 ++- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 568985bc..4465e567 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -296,7 +296,8 @@ void TA2AMesonField::execute(void) + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; startTimer("cache copy"); - for(int iii=0;iii< N_iii;iii++) + + parallel_for_nest(5)(int iii=0;iii< N_iii;iii++) for(int jjj=0;jjj< N_jjj;jjj++) for(int m =0;m< nmom;m++) for(int g =0;g< ngamma;g++) @@ -310,30 +311,30 @@ void TA2AMesonField::execute(void) // IO if (!par().output.empty()) { - double blockSize, ioTime; + double blockSize, ioTime; LOG(Message) << "Writing block to disk" << std::endl; ioTime = -getDTimer("IO: write block"); startTimer("IO: total"); - for(int m = 0; m < nmom; m++) - for(int g = 0; g < ngamma; g++) - { - if ((i == 0) and (j == 0)) + for(int m = 0; m < nmom; m++) + for(int g = 0; g < ngamma; g++) { + if ((i == 0) and (j == 0)) + { startTimer("IO: file creation"); - initFile(m, g); + initFile(m, g); stopTimer("IO: file creation"); - } + } startTimer("IO: write block"); - saveBlock(mfBlock, m, g, i, j); + saveBlock(mfBlock, m, g, i, j); stopTimer("IO: write block"); - } + } stopTimer("IO: total"); blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); ioTime += getDTimer("IO: write block"); LOG(Message) << "HDF5 IO done " << blockSize/ioTime*1.0e6/1024/1024 - << " MB/s" << std::endl; - } + << " MB/s" << std::endl; + } } double nodes = env().getGrid()->NodeCount(); diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp index 4d06f796..d1956f61 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp @@ -174,7 +174,7 @@ void makeMesonFieldBlock(MesonField &mat, if (caller) caller->startTimer("contraction: spin trace"); int pd = grid->_processors[orthogdim]; int pc = grid->_processor_coor[orthogdim]; - parallel_for_nest2(int lt=0;lt &rhs,std::vector_slice_stride[dimension]; if ( cbmask ==0x3){ - parallel_for_nest2(int n=0;n &rhs,std::vector void Scatter_plane_merge(Lattice &rhs,std::vector_slice_block[dimension]; if(cbmask ==0x3 ) { - parallel_for_nest2(int n=0;n_slice_stride[dimension]; int offset = b+n*rhs._grid->_slice_block[dimension]; diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 41351c98..343b580c 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -522,7 +522,7 @@ static void sliceMaddVector(Lattice &R,std::vector &a,const Lattice tensor_reduced at; at=av; - parallel_for_nest2(int n=0;n #define PARALLEL_FOR_LOOP _Pragma("omp parallel for schedule(static)") #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(static)") #define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for collapse(2)") +#define PARALLEL_NESTED_LOOP(n) _Pragma("omp parallel for collapse(n)") #define PARALLEL_REGION _Pragma("omp parallel") #define PARALLEL_CRITICAL _Pragma("omp critical") #else #define PARALLEL_FOR_LOOP #define PARALLEL_FOR_LOOP_INTERN #define PARALLEL_NESTED_LOOP2 +#define PARALLEL_NESTED_LOOP(n) #define PARALLEL_REGION #define PARALLEL_CRITICAL #endif @@ -54,7 +56,7 @@ Author: paboyle #define parallel_region PARALLEL_REGION #define parallel_for PARALLEL_FOR_LOOP for #define parallel_for_internal PARALLEL_FOR_LOOP_INTERN for -#define parallel_for_nest2 PARALLEL_NESTED_LOOP2 for +#define parallel_for_nest(n) PARALLEL_NESTED_LOOP(n) for namespace Grid { From 6e5a2b7922b480a275e05e426c087a2500765780 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 14:07:54 +0100 Subject: [PATCH 448/620] fix previous commit --- extras/Hadrons/Modules/MContraction/A2AMesonField.hpp | 2 +- .../Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp | 2 +- lib/cshift/Cshift_common.h | 6 +++--- lib/lattice/Lattice_reduction.h | 2 +- lib/threads/Threads.h | 7 ++++--- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 4465e567..2efe902d 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -297,7 +297,7 @@ void TA2AMesonField::execute(void) startTimer("cache copy"); - parallel_for_nest(5)(int iii=0;iii< N_iii;iii++) + parallel_for_nest5(int iii=0;iii< N_iii;iii++) for(int jjj=0;jjj< N_jjj;jjj++) for(int m =0;m< nmom;m++) for(int g =0;g< ngamma;g++) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp index d1956f61..4d06f796 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp @@ -174,7 +174,7 @@ void makeMesonFieldBlock(MesonField &mat, if (caller) caller->startTimer("contraction: spin trace"); int pd = grid->_processors[orthogdim]; int pc = grid->_processor_coor[orthogdim]; - parallel_for_nest(2)(int lt=0;lt &rhs,std::vector_slice_stride[dimension]; if ( cbmask ==0x3){ - parallel_for_nest(2)(int n=0;n &rhs,std::vector void Scatter_plane_merge(Lattice &rhs,std::vector_slice_block[dimension]; if(cbmask ==0x3 ) { - parallel_for_nest(2)(int n=0;n_slice_stride[dimension]; int offset = b+n*rhs._grid->_slice_block[dimension]; diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 343b580c..41351c98 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -522,7 +522,7 @@ static void sliceMaddVector(Lattice &R,std::vector &a,const Lattice tensor_reduced at; at=av; - parallel_for_nest(2)(int n=0;n #define PARALLEL_FOR_LOOP _Pragma("omp parallel for schedule(static)") #define PARALLEL_FOR_LOOP_INTERN _Pragma("omp for schedule(static)") #define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for collapse(2)") -#define PARALLEL_NESTED_LOOP(n) _Pragma("omp parallel for collapse(n)") +#define PARALLEL_NESTED_LOOP5 _Pragma("omp parallel for collapse(5)") #define PARALLEL_REGION _Pragma("omp parallel") #define PARALLEL_CRITICAL _Pragma("omp critical") #else #define PARALLEL_FOR_LOOP #define PARALLEL_FOR_LOOP_INTERN #define PARALLEL_NESTED_LOOP2 -#define PARALLEL_NESTED_LOOP(n) +#define PARALLEL_NESTED_LOOP5 #define PARALLEL_REGION #define PARALLEL_CRITICAL #endif @@ -56,7 +56,8 @@ Author: paboyle #define parallel_region PARALLEL_REGION #define parallel_for PARALLEL_FOR_LOOP for #define parallel_for_internal PARALLEL_FOR_LOOP_INTERN for -#define parallel_for_nest(n) PARALLEL_NESTED_LOOP(n) for +#define parallel_for_nest2 PARALLEL_NESTED_LOOP2 for +#define parallel_for_nest5 PARALLEL_NESTED_LOOP5 for namespace Grid { From cc2780bea32e57be733fe11f54cf1ea4244dd0b6 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 14:55:13 +0100 Subject: [PATCH 449/620] Hadrons: meson field parallel IO --- .../Modules/MContraction/A2AMesonField.hpp | 128 +++++++++++------- 1 file changed, 80 insertions(+), 48 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 2efe902d..8cb859b8 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -37,6 +37,8 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include +#define MF_PARALLEL_IO + BEGIN_HADRONS_NAMESPACE /****************************************************************************** @@ -99,6 +101,7 @@ private: std::string momphName_; std::vector gamma_; std::vector> mom_; + std::vector> nodeFile_; }; MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); @@ -311,14 +314,30 @@ void TA2AMesonField::execute(void) // IO if (!par().output.empty()) { - double blockSize, ioTime; + double blockSize, ioTime; + unsigned int myRank = env().getGrid()->ThisRank(), + nRank = env().getGrid()->RankCount(); LOG(Message) << "Writing block to disk" << std::endl; ioTime = -getDTimer("IO: write block"); startTimer("IO: total"); - for(int m = 0; m < nmom; m++) - for(int g = 0; g < ngamma; g++) + makeFileDir(filename(0, 0), env().getGrid()); +#ifdef MF_PARALLEL_IO + env().getGrid()->Barrier(); + nodeFile_.clear(); + for(int f = myRank; f < nmom*ngamma; f += nRank) { + std::pair file; + + file.first = f/ngamma; + file.second = f % ngamma; + nodeFile_.push_back(file); + } + // parallel IO + for (auto &f: nodeFile_) + { + auto m = f.first, g = f.second; + if ((i == 0) and (j == 0)) { startTimer("IO: file creation"); @@ -329,6 +348,29 @@ void TA2AMesonField::execute(void) saveBlock(mfBlock, m, g, i, j); stopTimer("IO: write block"); } + env().getGrid()->Barrier(); +#else + // serial IO + for(int m = 0; m < nmom; m++) + for(int g = 0; g < ngamma; g++) + { + if ((i == 0) and (j == 0)) + { + startTimer("IO: file creation"); + if (env().getGrid()->IsBoss()) + { + initFile(m, g); + } + stopTimer("IO: file creation"); + } + startTimer("IO: write block"); + if (env().getGrid()->IsBoss()) + { + saveBlock(mfBlock, m, g, i, j); + } + stopTimer("IO: write block"); + } +#endif stopTimer("IO: total"); blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); ioTime += getDTimer("IO: write block"); @@ -372,30 +414,25 @@ void TA2AMesonField::initFile(unsigned int m, unsigned int g) { #ifdef HAVE_HDF5 std::string f = filename(m, g); - GridBase *grid = env().getGrid(); auto &v = envGet(std::vector, par().v); auto &w = envGet(std::vector, par().w); int nt = env().getDim().back(); int N_i = w.size(); int N_j = v.size(); - makeFileDir(f, grid); - if (grid->IsBoss()) - { - Hdf5Writer writer(f); - std::vector dim = {static_cast(nt), - static_cast(N_i), - static_cast(N_j)}; - H5NS::DataSpace dataspace(dim.size(), dim.data()); - H5NS::DataSet dataset; - - push(writer, ioname(m, g)); - write(writer, "momentum", mom_[m]); - write(writer, "gamma", gamma_[g]); - auto &group = writer.getGroup(); - dataset = group.createDataSet("mesonField", Hdf5Type::type(), - dataspace); - } + Hdf5Writer writer(f); + std::vector dim = {static_cast(nt), + static_cast(N_i), + static_cast(N_j)}; + H5NS::DataSpace dataspace(dim.size(), dim.data()); + H5NS::DataSet dataset; + + push(writer, ioname(m, g)); + write(writer, "momentum", mom_[m]); + write(writer, "gamma", gamma_[g]); + auto &group = writer.getGroup(); + dataset = group.createDataSet("mesonField", Hdf5Type::type(), + dataspace); #else HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); #endif @@ -407,34 +444,29 @@ void TA2AMesonField::saveBlock(const MesonField &mf, unsigned int i, unsigned int j) { #ifdef HAVE_HDF5 - std::string f = filename(m, g); - GridBase *grid = env().getGrid(); + std::string f = filename(m, g); + Hdf5Reader reader(f); + hsize_t nt = mf.dimension(2), + Ni = mf.dimension(3), + Nj = mf.dimension(4); + std::vector count = {nt, Ni, Nj}, + offset = {0, static_cast(i), + static_cast(j)}, + stride = {1, 1, 1}, + block = {1, 1, 1}; + H5NS::DataSpace memspace(count.size(), count.data()), dataspace; + H5NS::DataSet dataset; + size_t shift; - if (grid->IsBoss()) - { - Hdf5Reader reader(f); - hsize_t nt = mf.dimension(2), - Ni = mf.dimension(3), - Nj = mf.dimension(4); - std::vector count = {nt, Ni, Nj}, - offset = {0, static_cast(i), - static_cast(j)}, - stride = {1, 1, 1}, - block = {1, 1, 1}; - H5NS::DataSpace memspace(count.size(), count.data()), dataspace; - H5NS::DataSet dataset; - size_t shift; - - push(reader, ioname(m, g)); - auto &group = reader.getGroup(); - dataset = group.openDataSet("mesonField"); - dataspace = dataset.getSpace(); - dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(), - stride.data(), block.data()); - shift = (m*mf.dimension(1) + g)*nt*Ni*Nj; - dataset.write(mf.data() + shift, Hdf5Type::type(), memspace, - dataspace); - } + push(reader, ioname(m, g)); + auto &group = reader.getGroup(); + dataset = group.openDataSet("mesonField"); + dataspace = dataset.getSpace(); + dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(), + stride.data(), block.data()); + shift = (m*mf.dimension(1) + g)*nt*Ni*Nj; + dataset.write(mf.data() + shift, Hdf5Type::type(), memspace, + dataspace); #else HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); #endif From dc6d8686ded60995a2005bc804187454f4a6dded Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 16:40:29 +0100 Subject: [PATCH 450/620] Hadrons: meson field chunked HDF5 IO --- .../Modules/MContraction/A2AMesonField.hpp | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 8cb859b8..b85fc6a3 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -374,8 +374,10 @@ void TA2AMesonField::execute(void) stopTimer("IO: total"); blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); ioTime += getDTimer("IO: write block"); - LOG(Message) << "HDF5 IO done " << blockSize/ioTime*1.0e6/1024/1024 - << " MB/s" << std::endl; + LOG(Message) << "HDF5 IO done " << sizeString(blockSize) << " in " + << getTimer("IO: write block") << " us (" + << blockSize/ioTime*1.0e6/1024/1024 + << " MB/s)" << std::endl; } } @@ -420,19 +422,24 @@ void TA2AMesonField::initFile(unsigned int m, unsigned int g) int N_i = w.size(); int N_j = v.size(); - Hdf5Writer writer(f); - std::vector dim = {static_cast(nt), - static_cast(N_i), - static_cast(N_j)}; - H5NS::DataSpace dataspace(dim.size(), dim.data()); - H5NS::DataSet dataset; + Hdf5Writer writer(f); + std::vector dim = {static_cast(nt), + static_cast(N_i), + static_cast(N_j)}, + chunk = {static_cast(nt), + static_cast(par().block), + static_cast(par().block)}; + H5NS::DataSpace dataspace(dim.size(), dim.data()); + H5NS::DataSet dataset; + H5NS::DSetCreatPropList plist; push(writer, ioname(m, g)); write(writer, "momentum", mom_[m]); write(writer, "gamma", gamma_[g]); auto &group = writer.getGroup(); + plist.setChunk(chunk.size(), chunk.data()); dataset = group.createDataSet("mesonField", Hdf5Type::type(), - dataspace); + dataspace, plist); #else HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); #endif From 2c67304716ae8f59331fad027355b5cc060c07a1 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 17:00:05 +0100 Subject: [PATCH 451/620] Hadrons: meson field code cleaning --- .../Hadrons/Modules/MContraction/A2AMesonField.hpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index b85fc6a3..6123491a 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -78,17 +78,6 @@ public: // execution virtual void execute(void); private: - // Arithmetic kernel. Move to Grid?? - void makeBlock(MesonField &mat, - const FermionField *lhs, - const FermionField *rhs, - std::vector gamma, - const std::vector &mom, - int orthogdim, - double &t0, - double &t1, - double &t2, - double &t3); // IO std::string ioname(unsigned int m, unsigned int g) const; std::string filename(unsigned int m, unsigned int g) const; @@ -375,7 +364,7 @@ void TA2AMesonField::execute(void) blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); ioTime += getDTimer("IO: write block"); LOG(Message) << "HDF5 IO done " << sizeString(blockSize) << " in " - << getTimer("IO: write block") << " us (" + << ioTime << " us (" << blockSize/ioTime*1.0e6/1024/1024 << " MB/s)" << std::endl; } From 09001aedca2e15547e38521e00bc9bc626479489 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 17:19:38 +0100 Subject: [PATCH 452/620] Hadrons: meson fields saved in single precision --- .../Modules/MContraction/A2AMesonField.hpp | 53 ++++++++++--------- .../MContraction/A2AMesonFieldKernels.hpp | 4 +- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index 6123491a..e30f966b 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -38,6 +38,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #define MF_PARALLEL_IO +#ifndef MF_IO_TYPE +#define MF_IO_TYPE ComplexF +#endif BEGIN_HADRONS_NAMESPACE @@ -65,6 +68,8 @@ class TA2AMesonField : public Module public: FERM_TYPE_ALIASES(FImpl,); SOLVER_TYPE_ALIASES(FImpl,); + typedef Eigen::TensorMap> MesonField; + typedef Eigen::TensorMap> MesonFieldIo; public: // constructor TA2AMesonField(const std::string name); @@ -82,14 +87,14 @@ private: std::string ioname(unsigned int m, unsigned int g) const; std::string filename(unsigned int m, unsigned int g) const; void initFile(unsigned int m, unsigned int g); - void saveBlock(const MesonField &mf, + void saveBlock(const MesonFieldIo &mf, unsigned int m, unsigned int g, unsigned int i, unsigned int j); private: - bool hasPhase_{false}; - std::string momphName_; - std::vector gamma_; - std::vector> mom_; + bool hasPhase_{false}; + std::string momphName_; + std::vector gamma_; + std::vector> mom_; std::vector> nodeFile_; }; @@ -174,7 +179,7 @@ void TA2AMesonField::setup(void) // preallocate memory for meson field block auto tgp = env().getDim().back()*gamma_.size()*mom_.size(); - envTmp(Vector, "mfBuf", 1, tgp*par().block*par().block); + envTmp(Vector, "mfBuf", 1, tgp*par().block*par().block); envTmp(Vector, "mfCache", 1, tgp*par().cacheBlock*par().cacheBlock); } @@ -195,18 +200,19 @@ void TA2AMesonField::execute(void) LOG(Message) << "Computing all-to-all meson fields" << std::endl; LOG(Message) << "W: '" << par().w << "' V: '" << par().v << "'" << std::endl; - LOG(Message) << "Meson field size: " << nt << "*" << N_i << "*" << N_j - << " (" << sizeString(nt*N_i*N_j*sizeof(Complex)) << ")" << std::endl; LOG(Message) << "Momenta:" << std::endl; for (auto &p: mom_) { LOG(Message) << " " << p << std::endl; } - LOG(Message) << "Spin structures:" << std::endl; + LOG(Message) << "Spin bilinears:" << std::endl; for (auto &g: gamma_) { LOG(Message) << " " << g << std::endl; } + LOG(Message) << "Meson field size: " << nt << "*" << N_i << "*" << N_j + << " (filesize " << sizeString(nt*N_i*N_j*sizeof(MF_IO_TYPE)) + << "/momentum/bilinear)" << std::endl; /////////////////////////////////////////////// // Momentum setup @@ -246,8 +252,7 @@ void TA2AMesonField::execute(void) double vol = env().getVolume(); double t_contr=0; - - envGetTmp(Vector, mfBuf); + envGetTmp(Vector, mfBuf); envGetTmp(Vector, mfCache); double t0 = usecond(); @@ -267,7 +272,7 @@ void TA2AMesonField::execute(void) << i+N_ii-1 << ", " << j <<" .. " << j+N_jj-1 << "]" << std::endl; - MesonField mfBlock(mfBuf.data(),nmom,ngamma,nt,N_ii,N_jj); + MesonFieldIo mfBlock(mfBuf.data(),nmom,ngamma,nt,N_ii,N_jj); // Series of cache blocked chunks of the contractions within this block for(int ii=0;ii::execute(void) } #endif stopTimer("IO: total"); - blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(Complex)); + blockSize = static_cast(nmom*ngamma*nt*N_ii*N_jj*sizeof(MF_IO_TYPE)); ioTime += getDTimer("IO: write block"); LOG(Message) << "HDF5 IO done " << sizeString(blockSize) << " in " << ioTime << " us (" @@ -427,7 +432,7 @@ void TA2AMesonField::initFile(unsigned int m, unsigned int g) write(writer, "gamma", gamma_[g]); auto &group = writer.getGroup(); plist.setChunk(chunk.size(), chunk.data()); - dataset = group.createDataSet("mesonField", Hdf5Type::type(), + dataset = group.createDataSet("mesonField", Hdf5Type::type(), dataspace, plist); #else HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); @@ -435,7 +440,7 @@ void TA2AMesonField::initFile(unsigned int m, unsigned int g) } template -void TA2AMesonField::saveBlock(const MesonField &mf, +void TA2AMesonField::saveBlock(const MesonFieldIo &mf, unsigned int m, unsigned int g, unsigned int i, unsigned int j) { @@ -443,13 +448,13 @@ void TA2AMesonField::saveBlock(const MesonField &mf, std::string f = filename(m, g); Hdf5Reader reader(f); hsize_t nt = mf.dimension(2), - Ni = mf.dimension(3), - Nj = mf.dimension(4); + Ni = mf.dimension(3), + Nj = mf.dimension(4); std::vector count = {nt, Ni, Nj}, - offset = {0, static_cast(i), - static_cast(j)}, - stride = {1, 1, 1}, - block = {1, 1, 1}; + offset = {0, static_cast(i), + static_cast(j)}, + stride = {1, 1, 1}, + block = {1, 1, 1}; H5NS::DataSpace memspace(count.size(), count.data()), dataspace; H5NS::DataSet dataset; size_t shift; @@ -459,10 +464,10 @@ void TA2AMesonField::saveBlock(const MesonField &mf, dataset = group.openDataSet("mesonField"); dataspace = dataset.getSpace(); dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(), - stride.data(), block.data()); + stride.data(), block.data()); shift = (m*mf.dimension(1) + g)*nt*Ni*Nj; - dataset.write(mf.data() + shift, Hdf5Type::type(), memspace, - dataspace); + dataset.write(mf.data() + shift, Hdf5Type::type(), memspace, + dataspace); #else HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); #endif diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp index 4d06f796..649f9fdf 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp @@ -37,13 +37,11 @@ BEGIN_HADRONS_NAMESPACE BEGIN_MODULE_NAMESPACE(MContraction) -typedef Eigen::TensorMap> MesonField; - //////////////////////////////////////////////////////////////////////////////// // Cache blocked arithmetic routine // Could move to Grid ??? //////////////////////////////////////////////////////////////////////////////// -template +template void makeMesonFieldBlock(MesonField &mat, const Field *lhs_wi, const Field *rhs_vj, From 08c47328ba9de5cdf9661b215e1c6f1b12e34466 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 17:35:42 +0100 Subject: [PATCH 453/620] Hadrons: meson field kernel performance for each block --- .../Modules/MContraction/A2AMesonField.hpp | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index e30f966b..c0463791 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -247,10 +247,12 @@ void TA2AMesonField::execute(void) // Total index is sum of these i+ii+iii etc... ////////////////////////////////////////////////////////////////////////// - double flops = 0.0; - double bytes = 0.0; - double vol = env().getVolume(); - double t_contr=0; + double flops; + double bytes; + double vol = env().getVolume(); + double t_kernel = 0.0; + double nodes = env().getGrid()->NodeCount(); + double tot_kernel; envGetTmp(Vector, mfBuf); envGetTmp(Vector, mfCache); @@ -275,6 +277,8 @@ void TA2AMesonField::execute(void) MesonFieldIo mfBlock(mfBuf.data(),nmom,ngamma,nt,N_ii,N_jj); // Series of cache blocked chunks of the contractions within this block + flops = 0.0; + bytes = 0.0; for(int ii=0;ii::execute(void) // flops for general N_c & N_s flops += vol * ( 2 * 8.0 + 6.0 + 8.0*nmom) * N_iii*N_jjj*ngamma; bytes += vol * (12.0 * sizeof(Complex) ) * N_iii*N_jjj - + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; + + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; startTimer("cache copy"); @@ -305,6 +309,16 @@ void TA2AMesonField::execute(void) stopTimer("cache copy"); } + // perf + tot_kernel = getDTimer("contraction: colour trace & mom.") + + getDTimer("contraction: local space sum"); + t_kernel = tot_kernel - t_kernel; + LOG(Message) << "Kernel perf " << flops/t_kernel/1.0e3/nodes + << " Gflop/s/node " << std::endl; + LOG(Message) << "Kernel perf " << bytes/t_kernel*1.0e6/1024/1024/1024/nodes + << " GB/s/node " << std::endl; + t_kernel = tot_kernel; + // IO if (!par().output.empty()) { @@ -374,13 +388,6 @@ void TA2AMesonField::execute(void) << " MB/s)" << std::endl; } } - - double nodes = env().getGrid()->NodeCount(); - double t_kernel = getDTimer("contraction: colour trace & mom.") - + getDTimer("contraction: local space sum"); - - LOG(Message) << "Perf " << flops/t_kernel/1.0e3/nodes << " Gflop/s/node " << std::endl; - LOG(Message) << "Perf " << bytes/t_kernel/1.0e3/nodes << " GB/s/node " << std::endl; } // IO From c4115544a55ff9a76d042bc17b85292d971ce956 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 20:03:53 +0100 Subject: [PATCH 454/620] Hadrons: application option to save graph --- extras/Hadrons/Application.cc | 5 +++++ extras/Hadrons/Application.hpp | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index b2a1987e..91d1f431 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -110,6 +110,11 @@ void Application::run(void) LOG(Message) << "RUN ID '" << getPar().runId << "'" << std::endl; vm().setRunId(getPar().runId); vm().printContent(); + if (!getPar().graphFile.empty()) + { + makeFileDir(getPar().graphFile, env().getGrid()); + vm().dumpModuleGraph(getPar().graphFile); + } env().printContent(); schedule(); printSchedule(); diff --git a/extras/Hadrons/Application.hpp b/extras/Hadrons/Application.hpp index ef463dd6..82307d62 100644 --- a/extras/Hadrons/Application.hpp +++ b/extras/Hadrons/Application.hpp @@ -55,7 +55,8 @@ public: GRID_SERIALIZABLE_CLASS_MEMBERS(GlobalPar, TrajRange, trajCounter, VirtualMachine::GeneticPar, genetic, - std::string, runId); + std::string, runId, + std::string, graphFile); }; public: // constructors From 7727e811133fb1ad751c08d5d8a7dfe043a1ce36 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 14 Aug 2018 20:18:47 +0100 Subject: [PATCH 455/620] Hadrons: slight improvement on previous commit --- extras/Hadrons/Application.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 91d1f431..17e833dd 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -110,14 +110,14 @@ void Application::run(void) LOG(Message) << "RUN ID '" << getPar().runId << "'" << std::endl; vm().setRunId(getPar().runId); vm().printContent(); + env().printContent(); + schedule(); + printSchedule(); if (!getPar().graphFile.empty()) { makeFileDir(getPar().graphFile, env().getGrid()); vm().dumpModuleGraph(getPar().graphFile); } - env().printContent(); - schedule(); - printSchedule(); configLoop(); } From 5f206df775c54dc2b863bacb5ade177ee58032a8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Wed, 15 Aug 2018 17:29:44 +0100 Subject: [PATCH 456/620] Hadrons: meson field cache friendly cache copy --- extras/Hadrons/Modules/MContraction/A2AMesonField.hpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp index c0463791..27c599f0 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -297,12 +297,11 @@ void TA2AMesonField::execute(void) + vol * ( 2.0 * sizeof(Complex) *nmom ) * N_iii*N_jjj* ngamma; startTimer("cache copy"); - - parallel_for_nest5(int iii=0;iii< N_iii;iii++) - for(int jjj=0;jjj< N_jjj;jjj++) - for(int m =0;m< nmom;m++) + parallel_for_nest5(int m =0;m< nmom;m++) for(int g =0;g< ngamma;g++) for(int t =0;t< nt;t++) + for(int iii=0;iii< N_iii;iii++) + for(int jjj=0;jjj< N_jjj;jjj++) { mfBlock(m,g,t,ii+iii,jj+jjj) = mfCacheBlock(m,g,t,iii,jjj); } From fb7d021b9d0cd162587280702d09e48299d5a929 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 15:00:40 +0100 Subject: [PATCH 457/620] Hadrons: moving Hadrons to root directory, build system improvements --- {lib => Grid}/DisableWarnings.h | 0 {lib => Grid}/Grid.h | 0 {lib => Grid}/GridCore.h | 0 {lib => Grid}/GridQCDcore.h | 0 {lib => Grid}/GridStd.h | 0 {lib => Grid}/Grid_Eigen_Dense.h | 0 {lib => Grid}/Makefile.am | 2 +- {lib => Grid}/algorithms/Algorithms.h | 0 {lib => Grid}/algorithms/CoarsenedMatrix.h | 0 {lib => Grid}/algorithms/FFT.h | 0 {lib => Grid}/algorithms/LinearOperator.h | 0 {lib => Grid}/algorithms/Preconditioner.h | 0 {lib => Grid}/algorithms/SparseMatrix.h | 0 {lib => Grid}/algorithms/approx/Chebyshev.h | 0 {lib => Grid}/algorithms/approx/Forecast.h | 0 {lib => Grid}/algorithms/approx/LICENSE | 0 .../algorithms/approx/MultiShiftFunction.cc | 0 .../algorithms/approx/MultiShiftFunction.h | 0 {lib => Grid}/algorithms/approx/README | 0 {lib => Grid}/algorithms/approx/Remez.cc | 0 {lib => Grid}/algorithms/approx/Remez.h | 0 {lib => Grid}/algorithms/approx/Zolotarev.cc | 0 {lib => Grid}/algorithms/approx/Zolotarev.h | 0 {lib => Grid}/algorithms/approx/bigfloat.h | 0 .../algorithms/approx/bigfloat_double.h | 0 .../algorithms/iterative/AdefGeneric.h | 0 .../iterative/BlockConjugateGradient.h | 0 .../algorithms/iterative/ConjugateGradient.h | 0 .../iterative/ConjugateGradientMixedPrec.h | 0 .../iterative/ConjugateGradientMultiShift.h | 0 .../ConjugateGradientReliableUpdate.h | 0 .../algorithms/iterative/ConjugateResidual.h | 0 .../algorithms/iterative/Deflation.h | 0 .../iterative/ImplicitlyRestartedLanczos.h | 0 .../iterative/LocalCoherenceLanczos.h | 0 .../algorithms/iterative/NormalEquations.h | 0 .../iterative/PrecConjugateResidual.h | 0 .../PrecGeneralisedConjugateResidual.h | 0 .../algorithms/iterative/SchurRedBlack.h | 0 {lib => Grid}/allocator/AlignedAllocator.cc | 0 {lib => Grid}/allocator/AlignedAllocator.h | 0 {lib => Grid}/cartesian/Cartesian.h | 0 {lib => Grid}/cartesian/Cartesian_base.h | 0 {lib => Grid}/cartesian/Cartesian_full.h | 0 {lib => Grid}/cartesian/Cartesian_red_black.h | 0 {lib => Grid}/communicator/Communicator.h | 0 .../communicator/Communicator_base.cc | 0 .../communicator/Communicator_base.h | 0 .../communicator/Communicator_mpi3.cc | 0 .../communicator/Communicator_none.cc | 0 {lib => Grid}/communicator/SharedMemory.cc | 0 {lib => Grid}/communicator/SharedMemory.h | 0 {lib => Grid}/communicator/SharedMemoryMPI.cc | 0 .../communicator/SharedMemoryNone.cc | 0 {lib => Grid}/cshift/Cshift.h | 0 {lib => Grid}/cshift/Cshift_common.h | 0 {lib => Grid}/cshift/Cshift_mpi.h | 0 {lib => Grid}/cshift/Cshift_none.h | 0 {lib => Grid}/json/json.hpp | 0 {lib => Grid}/lattice/Lattice.h | 0 {lib => Grid}/lattice/Lattice_ET.h | 0 {lib => Grid}/lattice/Lattice_arith.h | 0 {lib => Grid}/lattice/Lattice_base.h | 0 {lib => Grid}/lattice/Lattice_comparison.h | 0 .../lattice/Lattice_comparison_utils.h | 0 {lib => Grid}/lattice/Lattice_conformable.h | 0 {lib => Grid}/lattice/Lattice_coordinate.h | 0 {lib => Grid}/lattice/Lattice_local.h | 0 {lib => Grid}/lattice/Lattice_overload.h | 0 {lib => Grid}/lattice/Lattice_peekpoke.h | 0 {lib => Grid}/lattice/Lattice_reality.h | 0 {lib => Grid}/lattice/Lattice_reduction.h | 0 {lib => Grid}/lattice/Lattice_rng.h | 0 {lib => Grid}/lattice/Lattice_trace.h | 0 {lib => Grid}/lattice/Lattice_transfer.h | 0 {lib => Grid}/lattice/Lattice_transpose.h | 0 {lib => Grid}/lattice/Lattice_unary.h | 0 {lib => Grid}/lattice/Lattice_where.h | 0 {lib => Grid}/log/Log.cc | 0 {lib => Grid}/log/Log.h | 0 {lib => Grid}/parallelIO/BinaryIO.h | 0 {lib => Grid}/parallelIO/IldgIO.h | 0 {lib => Grid}/parallelIO/IldgIOtypes.h | 0 {lib => Grid}/parallelIO/MetaData.h | 0 {lib => Grid}/parallelIO/NerscIO.h | 0 {lib => Grid}/perfmon/PerfCount.cc | 0 {lib => Grid}/perfmon/PerfCount.h | 0 {lib => Grid}/perfmon/Stat.cc | 0 {lib => Grid}/perfmon/Stat.h | 0 {lib => Grid}/perfmon/Timer.h | 0 {lib => Grid}/pugixml/pugiconfig.hpp | 0 {lib => Grid}/pugixml/pugixml.cc | 0 {lib => Grid}/pugixml/pugixml.h | 0 {lib => Grid}/pugixml/readme.txt | 0 {lib => Grid}/qcd/LatticeTheories.h | 0 {lib => Grid}/qcd/QCD.h | 0 {lib => Grid}/qcd/action/Action.h | 0 {lib => Grid}/qcd/action/ActionBase.h | 0 {lib => Grid}/qcd/action/ActionCore.h | 0 {lib => Grid}/qcd/action/ActionParams.h | 0 {lib => Grid}/qcd/action/ActionSet.h | 0 .../qcd/action/fermion/AbstractEOFAFermion.h | 0 .../qcd/action/fermion/CayleyFermion5D.cc | 0 .../qcd/action/fermion/CayleyFermion5D.h | 0 .../action/fermion/CayleyFermion5Dcache.cc | 0 .../action/fermion/CayleyFermion5Ddense.cc | 0 .../qcd/action/fermion/CayleyFermion5Dssp.cc | 0 .../qcd/action/fermion/CayleyFermion5Dvec.cc | 0 .../fermion/ContinuedFractionFermion5D.cc | 0 .../fermion/ContinuedFractionFermion5D.h | 0 .../action/fermion/DomainWallEOFAFermion.cc | 0 .../action/fermion/DomainWallEOFAFermion.h | 0 .../fermion/DomainWallEOFAFermioncache.cc | 0 .../fermion/DomainWallEOFAFermiondense.cc | 0 .../fermion/DomainWallEOFAFermionssp.cc | 0 .../fermion/DomainWallEOFAFermionvec.cc | 0 .../qcd/action/fermion/DomainWallFermion.h | 0 {lib => Grid}/qcd/action/fermion/Fermion.h | 0 .../qcd/action/fermion/FermionCore.h | 0 .../qcd/action/fermion/FermionOperator.h | 0 .../qcd/action/fermion/FermionOperatorImpl.h | 0 .../fermion/ImprovedStaggeredFermion.cc | 0 .../action/fermion/ImprovedStaggeredFermion.h | 0 .../fermion/ImprovedStaggeredFermion5D.cc | 0 .../fermion/ImprovedStaggeredFermion5D.h | 0 .../qcd/action/fermion/MobiusEOFAFermion.cc | 0 .../qcd/action/fermion/MobiusEOFAFermion.h | 0 .../action/fermion/MobiusEOFAFermioncache.cc | 0 .../action/fermion/MobiusEOFAFermiondense.cc | 0 .../action/fermion/MobiusEOFAFermionssp.cc | 0 .../action/fermion/MobiusEOFAFermionvec.cc | 0 .../qcd/action/fermion/MobiusFermion.h | 0 .../action/fermion/MobiusZolotarevFermion.h | 0 .../fermion/OverlapWilsonCayleyTanhFermion.h | 0 .../OverlapWilsonCayleyZolotarevFermion.h | 0 .../OverlapWilsonContfracTanhFermion.h | 0 .../OverlapWilsonContfracZolotarevFermion.h | 0 .../OverlapWilsonPartialFractionTanhFermion.h | 0 ...lapWilsonPartialFractionZolotarevFermion.h | 0 .../fermion/PartialFractionFermion5D.cc | 0 .../action/fermion/PartialFractionFermion5D.h | 0 .../qcd/action/fermion/ScaledShamirFermion.h | 0 .../qcd/action/fermion/SchurDiagTwoKappa.h | 0 .../action/fermion/ShamirZolotarevFermion.h | 0 .../qcd/action/fermion/StaggeredKernels.cc | 0 .../qcd/action/fermion/StaggeredKernels.h | 0 .../qcd/action/fermion/StaggeredKernelsAsm.cc | 0 .../action/fermion/StaggeredKernelsHand.cc | 0 .../qcd/action/fermion/WilsonCloverFermion.cc | 0 .../qcd/action/fermion/WilsonCloverFermion.h | 0 .../qcd/action/fermion/WilsonCompressor.h | 0 .../qcd/action/fermion/WilsonFermion.cc | 0 .../qcd/action/fermion/WilsonFermion.h | 0 .../qcd/action/fermion/WilsonFermion5D.cc | 0 .../qcd/action/fermion/WilsonFermion5D.h | 0 .../qcd/action/fermion/WilsonKernels.cc | 0 .../qcd/action/fermion/WilsonKernels.h | 0 .../qcd/action/fermion/WilsonKernelsAsm.cc | 0 .../action/fermion/WilsonKernelsAsmAvx512.h | 0 .../qcd/action/fermion/WilsonKernelsAsmBody.h | 0 .../action/fermion/WilsonKernelsAsmBody.h.ab | 0 .../action/fermion/WilsonKernelsAsmBody.h.abc | 0 .../qcd/action/fermion/WilsonKernelsAsmQPX.h | 0 .../qcd/action/fermion/WilsonKernelsHand.cc | 0 .../fermion/WilsonKernelsHandGparity.cc | 0 .../qcd/action/fermion/WilsonTMFermion.cc | 0 .../qcd/action/fermion/WilsonTMFermion.h | 0 .../qcd/action/fermion/ZMobiusFermion.h | 0 .../qcd/action/fermion/g5HermitianLinop.h | 0 {lib => Grid}/qcd/action/gauge/Gauge.h | 0 .../qcd/action/gauge/GaugeImplTypes.h | 0 .../qcd/action/gauge/GaugeImplementations.h | 0 {lib => Grid}/qcd/action/gauge/Photon.h | 0 .../action/gauge/PlaqPlusRectangleAction.h | 0 .../qcd/action/gauge/WilsonGaugeAction.h | 0 .../EvenOddSchurDifferentiable.h | 0 .../pseudofermion/ExactOneFlavourRatio.h | 0 .../pseudofermion/OneFlavourEvenOddRational.h | 0 .../OneFlavourEvenOddRationalRatio.h | 0 .../action/pseudofermion/OneFlavourRational.h | 0 .../pseudofermion/OneFlavourRationalRatio.h | 0 .../qcd/action/pseudofermion/PseudoFermion.h | 0 .../qcd/action/pseudofermion/TwoFlavour.h | 0 .../action/pseudofermion/TwoFlavourEvenOdd.h | 0 .../pseudofermion/TwoFlavourEvenOddRatio.h | 0 .../action/pseudofermion/TwoFlavourRatio.h | 0 {lib => Grid}/qcd/action/scalar/Scalar.h | 0 .../qcd/action/scalar/ScalarAction.h | 0 {lib => Grid}/qcd/action/scalar/ScalarImpl.h | 0 .../action/scalar/ScalarInteractionAction.h | 0 {lib => Grid}/qcd/hmc/GenericHMCrunner.h | 0 {lib => Grid}/qcd/hmc/HMC.h | 0 {lib => Grid}/qcd/hmc/HMCModules.h | 0 {lib => Grid}/qcd/hmc/HMCResourceManager.h | 0 {lib => Grid}/qcd/hmc/HMCRunnerModule.h | 0 {lib => Grid}/qcd/hmc/HMC_GridModules.h | 0 {lib => Grid}/qcd/hmc/HMC_aggregate.h | 0 {lib => Grid}/qcd/hmc/UsingHMC.md | 0 .../qcd/hmc/checkpointers/BaseCheckpointer.h | 0 .../hmc/checkpointers/BinaryCheckpointer.h | 0 .../hmc/checkpointers/CheckPointerModules.h | 0 .../qcd/hmc/checkpointers/CheckPointers.h | 0 .../qcd/hmc/checkpointers/ILDGCheckpointer.h | 0 .../qcd/hmc/checkpointers/NerscCheckpointer.h | 0 .../hmc/checkpointers/ScidacCheckpointer.h | 0 .../qcd/hmc/integrators/Integrator.h | 0 .../hmc/integrators/Integrator_algorithm.h | 0 {lib => Grid}/qcd/modules/ActionModules.h | 0 {lib => Grid}/qcd/modules/Factory.h | 0 .../qcd/modules/FermionOperatorModules.h | 0 {lib => Grid}/qcd/modules/Modules.cc | 0 {lib => Grid}/qcd/modules/Modules.h | 0 {lib => Grid}/qcd/modules/ObservableModules.h | 0 {lib => Grid}/qcd/modules/Registration.h | 0 {lib => Grid}/qcd/modules/SolverModules.h | 0 {lib => Grid}/qcd/modules/mods.h | 0 .../qcd/observables/hmc_observable.h | 0 {lib => Grid}/qcd/observables/plaquette.h | 0 {lib => Grid}/qcd/observables/polyakov_loop.h | 0 .../qcd/observables/topological_charge.h | 0 .../qcd/representations/Representations.h | 0 {lib => Grid}/qcd/representations/adjoint.h | 0 .../qcd/representations/fundamental.h | 0 {lib => Grid}/qcd/representations/hmc_types.h | 0 {lib => Grid}/qcd/representations/two_index.h | 0 {lib => Grid}/qcd/smearing/APEsmearing.h | 0 {lib => Grid}/qcd/smearing/BaseSmearing.h | 0 .../qcd/smearing/GaugeConfiguration.h | 0 {lib => Grid}/qcd/smearing/Smearing.h | 0 {lib => Grid}/qcd/smearing/StoutSmearing.h | 0 {lib => Grid}/qcd/smearing/WilsonFlow.h | 0 {lib => Grid}/qcd/spin/Dirac.h | 0 {lib => Grid}/qcd/spin/Gamma.cc | 0 {lib => Grid}/qcd/spin/Gamma.h | 0 {lib => Grid}/qcd/spin/Spin.h | 0 {lib => Grid}/qcd/spin/TwoSpinor.h | 0 {lib => Grid}/qcd/spin/gamma-gen/gamma-gen.nb | 0 {lib => Grid}/qcd/utils/CovariantCshift.h | 0 {lib => Grid}/qcd/utils/CovariantLaplacian.h | 0 {lib => Grid}/qcd/utils/GaugeFix.h | 0 {lib => Grid}/qcd/utils/LinalgUtils.h | 0 {lib => Grid}/qcd/utils/Metric.h | 0 {lib => Grid}/qcd/utils/SUn.h | 0 {lib => Grid}/qcd/utils/SUnAdjoint.h | 0 {lib => Grid}/qcd/utils/SUnTwoIndex.h | 0 {lib => Grid}/qcd/utils/ScalarObjs.h | 0 {lib => Grid}/qcd/utils/SpaceTimeGrid.cc | 0 {lib => Grid}/qcd/utils/SpaceTimeGrid.h | 0 {lib => Grid}/qcd/utils/Utils.h | 0 {lib => Grid}/qcd/utils/WilsonLoops.h | 0 {lib => Grid}/serialisation/BaseIO.h | 0 {lib => Grid}/serialisation/BinaryIO.cc | 0 {lib => Grid}/serialisation/BinaryIO.h | 0 {lib => Grid}/serialisation/Hdf5IO.cc | 0 {lib => Grid}/serialisation/Hdf5IO.h | 0 {lib => Grid}/serialisation/Hdf5Type.h | 0 {lib => Grid}/serialisation/JSON_IO.cc | 0 {lib => Grid}/serialisation/JSON_IO.h | 0 {lib => Grid}/serialisation/MacroMagic.h | 0 {lib => Grid}/serialisation/Serialisation.h | 0 {lib => Grid}/serialisation/TextIO.cc | 0 {lib => Grid}/serialisation/TextIO.h | 0 {lib => Grid}/serialisation/VectorUtils.h | 0 {lib => Grid}/serialisation/XmlIO.cc | 0 {lib => Grid}/serialisation/XmlIO.h | 0 {lib => Grid}/simd/BGQQPX.h | 0 {lib => Grid}/simd/Grid_avx.h | 0 {lib => Grid}/simd/Grid_avx512.h | 0 {lib => Grid}/simd/Grid_generic.h | 0 {lib => Grid}/simd/Grid_generic_types.h | 0 {lib => Grid}/simd/Grid_imci.h | 0 {lib => Grid}/simd/Grid_neon.h | 0 {lib => Grid}/simd/Grid_qpx.h | 0 {lib => Grid}/simd/Grid_sse4.h | 0 {lib => Grid}/simd/Grid_vector_types.h | 0 {lib => Grid}/simd/Grid_vector_unops.h | 0 {lib => Grid}/simd/IBM_qpx.h | 0 {lib => Grid}/simd/IBM_qpx_double.h | 0 {lib => Grid}/simd/IBM_qpx_single.h | 0 {lib => Grid}/simd/Intel512avx.h | 0 {lib => Grid}/simd/Intel512common.h | 0 {lib => Grid}/simd/Intel512double.h | 0 {lib => Grid}/simd/Intel512imci.h | 0 {lib => Grid}/simd/Intel512single.h | 0 {lib => Grid}/simd/Intel512wilson.h | 0 {lib => Grid}/simd/Simd.h | 0 {lib => Grid}/simd/l1p.h | 0 {lib => Grid}/sitmo_rng/README | 0 {lib => Grid}/sitmo_rng/sitmo_prng_engine.hpp | 0 {lib => Grid}/stencil/Lebesgue.cc | 0 {lib => Grid}/stencil/Lebesgue.h | 0 {lib => Grid}/stencil/SimpleCompressor.h | 0 {lib => Grid}/stencil/Stencil.cc | 0 {lib => Grid}/stencil/Stencil.h | 0 {lib => Grid}/tensors/Tensor_Ta.h | 0 {lib => Grid}/tensors/Tensor_arith.h | 0 {lib => Grid}/tensors/Tensor_arith_add.h | 0 {lib => Grid}/tensors/Tensor_arith_mac.h | 0 {lib => Grid}/tensors/Tensor_arith_mul.h | 0 {lib => Grid}/tensors/Tensor_arith_scalar.h | 0 {lib => Grid}/tensors/Tensor_arith_sub.h | 0 {lib => Grid}/tensors/Tensor_class.h | 0 {lib => Grid}/tensors/Tensor_determinant.h | 0 {lib => Grid}/tensors/Tensor_exp.h | 0 {lib => Grid}/tensors/Tensor_extract_merge.h | 0 {lib => Grid}/tensors/Tensor_index.h | 0 {lib => Grid}/tensors/Tensor_inner.h | 0 {lib => Grid}/tensors/Tensor_logical.h | 0 {lib => Grid}/tensors/Tensor_outer.h | 0 {lib => Grid}/tensors/Tensor_reality.h | 0 {lib => Grid}/tensors/Tensor_trace.h | 0 {lib => Grid}/tensors/Tensor_traits.h | 0 {lib => Grid}/tensors/Tensor_transpose.h | 0 {lib => Grid}/tensors/Tensor_unary.h | 0 {lib => Grid}/tensors/Tensors.h | 0 {lib => Grid}/threads/Threads.h | 0 {lib => Grid}/util/CompilerCompatible.h | 0 {lib => Grid}/util/Init.cc | 0 {lib => Grid}/util/Init.h | 0 {lib => Grid}/util/Lexicographic.h | 0 {lib => Grid}/util/Profiling.h | 0 {lib => Grid}/util/Sha.h | 0 {lib => Grid}/util/Util.h | 0 {lib => Grid}/util/version.cc | 0 Grid/version.h | 1 + {extras/Hadrons => Hadrons}/A2AVectors.hpp | 6 +- {extras/Hadrons => Hadrons}/Application.cc | 6 +- {extras/Hadrons => Hadrons}/Application.hpp | 6 +- {extras/Hadrons => Hadrons}/DilutedNoise.hpp | 2 +- {extras/Hadrons => Hadrons}/EigenPack.hpp | 2 +- {extras/Hadrons => Hadrons}/Environment.cc | 6 +- {extras/Hadrons => Hadrons}/Environment.hpp | 2 +- {extras/Hadrons => Hadrons}/Exceptions.cc | 6 +- {extras/Hadrons => Hadrons}/Exceptions.hpp | 2 +- {extras/Hadrons => Hadrons}/Factory.hpp | 2 +- .../Hadrons => Hadrons}/GeneticScheduler.hpp | 4 +- {extras/Hadrons => Hadrons}/Global.cc | 2 +- {extras/Hadrons => Hadrons}/Global.hpp | 2 +- {extras/Hadrons => Hadrons}/Graph.hpp | 2 +- {extras/Hadrons => Hadrons}/HadronsXmlRun.cc | 2 +- {extras/Hadrons => Hadrons}/Makefile.am | 2 +- {extras/Hadrons => Hadrons}/Module.cc | 2 +- {extras/Hadrons => Hadrons}/Module.hpp | 4 +- {extras/Hadrons => Hadrons}/ModuleFactory.hpp | 6 +- Hadrons/Modules.hpp | 96 +++++++ .../Modules/MAction/DWF.cc | 2 +- .../Modules/MAction/DWF.hpp | 6 +- .../Modules/MAction/MobiusDWF.cc | 2 +- .../Modules/MAction/MobiusDWF.hpp | 6 +- .../Modules/MAction/ScaledDWF.cc | 2 +- .../Modules/MAction/ScaledDWF.hpp | 6 +- .../Modules/MAction/Wilson.cc | 2 +- .../Modules/MAction/Wilson.hpp | 6 +- .../Modules/MAction/WilsonClover.cc | 2 +- .../Modules/MAction/WilsonClover.hpp | 6 +- .../Modules/MAction/ZMobiusDWF.cc | 2 +- .../Modules/MAction/ZMobiusDWF.hpp | 6 +- .../Modules/MContraction/A2AMesonField.cc | 2 +- .../Modules/MContraction/A2AMesonField.hpp | 12 +- .../MContraction/A2AMesonFieldKernels.hpp | 4 +- .../Modules/MContraction/Baryon.cc | 2 +- .../Modules/MContraction/Baryon.hpp | 6 +- .../Modules/MContraction/DiscLoop.cc | 2 +- .../Modules/MContraction/DiscLoop.hpp | 6 +- .../Modules/MContraction/Gamma3pt.cc | 2 +- .../Modules/MContraction/Gamma3pt.hpp | 6 +- .../Modules/MContraction/Meson.cc | 2 +- .../Modules/MContraction/Meson.hpp | 6 +- .../Modules/MContraction/WardIdentity.cc | 2 +- .../Modules/MContraction/WardIdentity.hpp | 6 +- .../Modules/MContraction/WeakHamiltonian.hpp | 6 +- .../MContraction/WeakHamiltonianEye.cc | 2 +- .../MContraction/WeakHamiltonianEye.hpp | 2 +- .../MContraction/WeakHamiltonianNonEye.cc | 2 +- .../MContraction/WeakHamiltonianNonEye.hpp | 2 +- .../MContraction/WeakNeutral4ptDisc.cc | 2 +- .../MContraction/WeakNeutral4ptDisc.hpp | 2 +- .../Modules/MFermion/FreeProp.cc | 2 +- .../Modules/MFermion/FreeProp.hpp | 6 +- .../Modules/MFermion/GaugeProp.cc | 2 +- .../Modules/MFermion/GaugeProp.hpp | 8 +- .../Modules/MGauge/FundtoHirep.cc | 2 +- .../Modules/MGauge/FundtoHirep.hpp | 6 +- .../Modules/MGauge/Random.cc | 2 +- .../Modules/MGauge/Random.hpp | 6 +- .../Modules/MGauge/StochEm.cc | 2 +- .../Modules/MGauge/StochEm.hpp | 6 +- .../Modules/MGauge/StoutSmearing.cc | 2 +- .../Modules/MGauge/StoutSmearing.hpp | 6 +- .../Modules/MGauge/Unit.cc | 2 +- .../Modules/MGauge/Unit.hpp | 6 +- .../Modules/MGauge/UnitEm.cc | 2 +- .../Modules/MGauge/UnitEm.hpp | 6 +- .../Modules/MIO/LoadBinary.cc | 2 +- .../Modules/MIO/LoadBinary.hpp | 6 +- .../Modules/MIO/LoadCoarseEigenPack.cc | 2 +- .../Modules/MIO/LoadCoarseEigenPack.hpp | 8 +- .../Modules/MIO/LoadEigenPack.cc | 2 +- .../Modules/MIO/LoadEigenPack.hpp | 8 +- .../Modules/MIO/LoadNersc.cc | 2 +- .../Modules/MIO/LoadNersc.hpp | 6 +- .../Modules/MLoop/NoiseLoop.cc | 2 +- .../Modules/MLoop/NoiseLoop.hpp | 6 +- .../MNoise/TimeDilutedSpinColorDiagonal.cc | 2 +- .../MNoise/TimeDilutedSpinColorDiagonal.hpp | 8 +- .../Modules/MScalar/ChargedProp.cc | 4 +- .../Modules/MScalar/ChargedProp.hpp | 6 +- .../Modules/MScalar/FreeProp.cc | 4 +- .../Modules/MScalar/FreeProp.hpp | 6 +- .../Modules/MScalar/Scalar.hpp | 0 .../Modules/MScalar/ScalarVP.cc | 6 +- .../Modules/MScalar/ScalarVP.hpp | 6 +- .../Modules/MScalar/VPCounterTerms.cc | 4 +- .../Modules/MScalar/VPCounterTerms.hpp | 6 +- .../Modules/MScalarSUN/Div.cc | 2 +- .../Modules/MScalarSUN/Div.hpp | 8 +- .../Modules/MScalarSUN/EMT.cc | 2 +- .../Modules/MScalarSUN/EMT.hpp | 8 +- .../Modules/MScalarSUN/Grad.cc | 2 +- .../Modules/MScalarSUN/Grad.hpp | 8 +- .../Modules/MScalarSUN/ShiftProbe.cc | 2 +- .../Modules/MScalarSUN/ShiftProbe.hpp | 8 +- .../Modules/MScalarSUN/StochFreeField.cc | 2 +- .../Modules/MScalarSUN/StochFreeField.hpp | 6 +- .../Modules/MScalarSUN/TimeMomProbe.cc | 2 +- .../Modules/MScalarSUN/TimeMomProbe.hpp | 8 +- .../Modules/MScalarSUN/TrKinetic.cc | 2 +- .../Modules/MScalarSUN/TrKinetic.hpp | 8 +- .../Modules/MScalarSUN/TrMag.cc | 2 +- .../Modules/MScalarSUN/TrMag.hpp | 8 +- .../Modules/MScalarSUN/TrPhi.cc | 2 +- .../Modules/MScalarSUN/TrPhi.hpp | 8 +- .../Modules/MScalarSUN/TransProj.cc | 2 +- .../Modules/MScalarSUN/TransProj.hpp | 8 +- .../Modules/MScalarSUN/TwoPoint.cc | 2 +- .../Modules/MScalarSUN/TwoPoint.hpp | 8 +- .../Modules/MScalarSUN/TwoPointNPR.cc | 2 +- .../Modules/MScalarSUN/TwoPointNPR.hpp | 8 +- .../Modules/MScalarSUN/Utils.hpp | 4 +- .../Modules/MSink/Point.cc | 2 +- .../Modules/MSink/Point.hpp | 6 +- .../Modules/MSink/Smear.cc | 2 +- .../Modules/MSink/Smear.hpp | 6 +- .../Modules/MSolver/A2AVectors.cc | 2 +- .../Modules/MSolver/A2AVectors.hpp | 14 +- .../Modules/MSolver/LocalCoherenceLanczos.cc | 2 +- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 8 +- .../Modules/MSolver/RBPrecCG.cc | 2 +- .../Modules/MSolver/RBPrecCG.hpp | 10 +- .../Modules/MSource/Point.cc | 2 +- .../Modules/MSource/Point.hpp | 6 +- .../Modules/MSource/SeqConserved.cc | 2 +- .../Modules/MSource/SeqConserved.hpp | 6 +- .../Modules/MSource/SeqGamma.cc | 2 +- .../Modules/MSource/SeqGamma.hpp | 6 +- .../Modules/MSource/Wall.cc | 2 +- .../Modules/MSource/Wall.hpp | 6 +- .../Hadrons => Hadrons}/Modules/MSource/Z2.cc | 2 +- .../Modules/MSource/Z2.hpp | 6 +- .../Modules/MUtilities/RandomVectors.cc | 2 +- .../Modules/MUtilities/RandomVectors.hpp | 6 +- .../Modules/MUtilities/TestSeqConserved.cc | 2 +- .../Modules/MUtilities/TestSeqConserved.hpp | 6 +- .../Modules/MUtilities/TestSeqGamma.cc | 2 +- .../Modules/MUtilities/TestSeqGamma.hpp | 6 +- .../templates/Module_in_NS.cc.template | 0 .../templates/Module_in_NS.hpp.template | 0 .../templates/Module_tmp_in_NS.cc.template | 0 .../templates/Module_tmp_in_NS.hpp.template | 0 {extras/Hadrons => Hadrons}/Solver.hpp | 2 +- {extras/Hadrons => Hadrons}/VirtualMachine.cc | 6 +- .../Hadrons => Hadrons}/VirtualMachine.hpp | 6 +- {extras/Hadrons => Hadrons}/add_module.sh | 0 .../add_module_template.sh | 0 .../Hadrons => Hadrons}/make_module_inst.sh | 0 .../Hadrons => Hadrons}/make_module_list.sh | 0 {extras/Hadrons => Hadrons}/modules.inc | 0 Makefile.am | 4 +- configure.ac | 15 +- extras/Hadrons/Modules.hpp | 96 ------- extras/Makefile.am | 1 - extras/qed-fvol/Global.cc | 11 - extras/qed-fvol/Global.hpp | 42 --- extras/qed-fvol/Makefile.am | 9 - extras/qed-fvol/WilsonLoops.h | 265 ------------------ extras/qed-fvol/qed-fvol.cc | 88 ------ lib/.dirstamp | 0 lib/Hadrons | 1 - lib/qcd/hmc/.dirstamp | 0 lib/qcd/hmc/integrators/.dirstamp | 0 lib/simd/.dirstamp | 0 scripts/filelist | 2 +- scripts/update_eigen.sh | 12 +- tests/hadrons/Test_QED.cc | 4 +- tests/hadrons/Test_free_prop.cc | 4 +- tests/hadrons/Test_hadrons.hpp | 4 +- tests/hadrons/Test_hadrons_meson_3pt.cc | 4 +- tests/hadrons/Test_hadrons_spectrum.cc | 4 +- tests/hadrons/Test_hadrons_wilsonFund.cc | 4 +- 499 files changed, 429 insertions(+), 846 deletions(-) rename {lib => Grid}/DisableWarnings.h (100%) rename {lib => Grid}/Grid.h (100%) rename {lib => Grid}/GridCore.h (100%) rename {lib => Grid}/GridQCDcore.h (100%) rename {lib => Grid}/GridStd.h (100%) rename {lib => Grid}/Grid_Eigen_Dense.h (100%) rename {lib => Grid}/Makefile.am (94%) rename {lib => Grid}/algorithms/Algorithms.h (100%) rename {lib => Grid}/algorithms/CoarsenedMatrix.h (100%) rename {lib => Grid}/algorithms/FFT.h (100%) rename {lib => Grid}/algorithms/LinearOperator.h (100%) rename {lib => Grid}/algorithms/Preconditioner.h (100%) rename {lib => Grid}/algorithms/SparseMatrix.h (100%) rename {lib => Grid}/algorithms/approx/Chebyshev.h (100%) rename {lib => Grid}/algorithms/approx/Forecast.h (100%) rename {lib => Grid}/algorithms/approx/LICENSE (100%) rename {lib => Grid}/algorithms/approx/MultiShiftFunction.cc (100%) rename {lib => Grid}/algorithms/approx/MultiShiftFunction.h (100%) rename {lib => Grid}/algorithms/approx/README (100%) rename {lib => Grid}/algorithms/approx/Remez.cc (100%) rename {lib => Grid}/algorithms/approx/Remez.h (100%) rename {lib => Grid}/algorithms/approx/Zolotarev.cc (100%) rename {lib => Grid}/algorithms/approx/Zolotarev.h (100%) rename {lib => Grid}/algorithms/approx/bigfloat.h (100%) rename {lib => Grid}/algorithms/approx/bigfloat_double.h (100%) rename {lib => Grid}/algorithms/iterative/AdefGeneric.h (100%) rename {lib => Grid}/algorithms/iterative/BlockConjugateGradient.h (100%) rename {lib => Grid}/algorithms/iterative/ConjugateGradient.h (100%) rename {lib => Grid}/algorithms/iterative/ConjugateGradientMixedPrec.h (100%) rename {lib => Grid}/algorithms/iterative/ConjugateGradientMultiShift.h (100%) rename {lib => Grid}/algorithms/iterative/ConjugateGradientReliableUpdate.h (100%) rename {lib => Grid}/algorithms/iterative/ConjugateResidual.h (100%) rename {lib => Grid}/algorithms/iterative/Deflation.h (100%) rename {lib => Grid}/algorithms/iterative/ImplicitlyRestartedLanczos.h (100%) rename {lib => Grid}/algorithms/iterative/LocalCoherenceLanczos.h (100%) rename {lib => Grid}/algorithms/iterative/NormalEquations.h (100%) rename {lib => Grid}/algorithms/iterative/PrecConjugateResidual.h (100%) rename {lib => Grid}/algorithms/iterative/PrecGeneralisedConjugateResidual.h (100%) rename {lib => Grid}/algorithms/iterative/SchurRedBlack.h (100%) rename {lib => Grid}/allocator/AlignedAllocator.cc (100%) rename {lib => Grid}/allocator/AlignedAllocator.h (100%) rename {lib => Grid}/cartesian/Cartesian.h (100%) rename {lib => Grid}/cartesian/Cartesian_base.h (100%) rename {lib => Grid}/cartesian/Cartesian_full.h (100%) rename {lib => Grid}/cartesian/Cartesian_red_black.h (100%) rename {lib => Grid}/communicator/Communicator.h (100%) rename {lib => Grid}/communicator/Communicator_base.cc (100%) rename {lib => Grid}/communicator/Communicator_base.h (100%) rename {lib => Grid}/communicator/Communicator_mpi3.cc (100%) rename {lib => Grid}/communicator/Communicator_none.cc (100%) rename {lib => Grid}/communicator/SharedMemory.cc (100%) rename {lib => Grid}/communicator/SharedMemory.h (100%) rename {lib => Grid}/communicator/SharedMemoryMPI.cc (100%) rename {lib => Grid}/communicator/SharedMemoryNone.cc (100%) rename {lib => Grid}/cshift/Cshift.h (100%) rename {lib => Grid}/cshift/Cshift_common.h (100%) rename {lib => Grid}/cshift/Cshift_mpi.h (100%) rename {lib => Grid}/cshift/Cshift_none.h (100%) rename {lib => Grid}/json/json.hpp (100%) rename {lib => Grid}/lattice/Lattice.h (100%) rename {lib => Grid}/lattice/Lattice_ET.h (100%) rename {lib => Grid}/lattice/Lattice_arith.h (100%) rename {lib => Grid}/lattice/Lattice_base.h (100%) rename {lib => Grid}/lattice/Lattice_comparison.h (100%) rename {lib => Grid}/lattice/Lattice_comparison_utils.h (100%) rename {lib => Grid}/lattice/Lattice_conformable.h (100%) rename {lib => Grid}/lattice/Lattice_coordinate.h (100%) rename {lib => Grid}/lattice/Lattice_local.h (100%) rename {lib => Grid}/lattice/Lattice_overload.h (100%) rename {lib => Grid}/lattice/Lattice_peekpoke.h (100%) rename {lib => Grid}/lattice/Lattice_reality.h (100%) rename {lib => Grid}/lattice/Lattice_reduction.h (100%) rename {lib => Grid}/lattice/Lattice_rng.h (100%) rename {lib => Grid}/lattice/Lattice_trace.h (100%) rename {lib => Grid}/lattice/Lattice_transfer.h (100%) rename {lib => Grid}/lattice/Lattice_transpose.h (100%) rename {lib => Grid}/lattice/Lattice_unary.h (100%) rename {lib => Grid}/lattice/Lattice_where.h (100%) rename {lib => Grid}/log/Log.cc (100%) rename {lib => Grid}/log/Log.h (100%) rename {lib => Grid}/parallelIO/BinaryIO.h (100%) rename {lib => Grid}/parallelIO/IldgIO.h (100%) rename {lib => Grid}/parallelIO/IldgIOtypes.h (100%) rename {lib => Grid}/parallelIO/MetaData.h (100%) rename {lib => Grid}/parallelIO/NerscIO.h (100%) rename {lib => Grid}/perfmon/PerfCount.cc (100%) rename {lib => Grid}/perfmon/PerfCount.h (100%) rename {lib => Grid}/perfmon/Stat.cc (100%) rename {lib => Grid}/perfmon/Stat.h (100%) rename {lib => Grid}/perfmon/Timer.h (100%) rename {lib => Grid}/pugixml/pugiconfig.hpp (100%) rename {lib => Grid}/pugixml/pugixml.cc (100%) rename {lib => Grid}/pugixml/pugixml.h (100%) rename {lib => Grid}/pugixml/readme.txt (100%) rename {lib => Grid}/qcd/LatticeTheories.h (100%) rename {lib => Grid}/qcd/QCD.h (100%) rename {lib => Grid}/qcd/action/Action.h (100%) rename {lib => Grid}/qcd/action/ActionBase.h (100%) rename {lib => Grid}/qcd/action/ActionCore.h (100%) rename {lib => Grid}/qcd/action/ActionParams.h (100%) rename {lib => Grid}/qcd/action/ActionSet.h (100%) rename {lib => Grid}/qcd/action/fermion/AbstractEOFAFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/CayleyFermion5D.cc (100%) rename {lib => Grid}/qcd/action/fermion/CayleyFermion5D.h (100%) rename {lib => Grid}/qcd/action/fermion/CayleyFermion5Dcache.cc (100%) rename {lib => Grid}/qcd/action/fermion/CayleyFermion5Ddense.cc (100%) rename {lib => Grid}/qcd/action/fermion/CayleyFermion5Dssp.cc (100%) rename {lib => Grid}/qcd/action/fermion/CayleyFermion5Dvec.cc (100%) rename {lib => Grid}/qcd/action/fermion/ContinuedFractionFermion5D.cc (100%) rename {lib => Grid}/qcd/action/fermion/ContinuedFractionFermion5D.h (100%) rename {lib => Grid}/qcd/action/fermion/DomainWallEOFAFermion.cc (100%) rename {lib => Grid}/qcd/action/fermion/DomainWallEOFAFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/DomainWallEOFAFermioncache.cc (100%) rename {lib => Grid}/qcd/action/fermion/DomainWallEOFAFermiondense.cc (100%) rename {lib => Grid}/qcd/action/fermion/DomainWallEOFAFermionssp.cc (100%) rename {lib => Grid}/qcd/action/fermion/DomainWallEOFAFermionvec.cc (100%) rename {lib => Grid}/qcd/action/fermion/DomainWallFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/Fermion.h (100%) rename {lib => Grid}/qcd/action/fermion/FermionCore.h (100%) rename {lib => Grid}/qcd/action/fermion/FermionOperator.h (100%) rename {lib => Grid}/qcd/action/fermion/FermionOperatorImpl.h (100%) rename {lib => Grid}/qcd/action/fermion/ImprovedStaggeredFermion.cc (100%) rename {lib => Grid}/qcd/action/fermion/ImprovedStaggeredFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/ImprovedStaggeredFermion5D.cc (100%) rename {lib => Grid}/qcd/action/fermion/ImprovedStaggeredFermion5D.h (100%) rename {lib => Grid}/qcd/action/fermion/MobiusEOFAFermion.cc (100%) rename {lib => Grid}/qcd/action/fermion/MobiusEOFAFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/MobiusEOFAFermioncache.cc (100%) rename {lib => Grid}/qcd/action/fermion/MobiusEOFAFermiondense.cc (100%) rename {lib => Grid}/qcd/action/fermion/MobiusEOFAFermionssp.cc (100%) rename {lib => Grid}/qcd/action/fermion/MobiusEOFAFermionvec.cc (100%) rename {lib => Grid}/qcd/action/fermion/MobiusFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/MobiusZolotarevFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/OverlapWilsonContfracTanhFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/PartialFractionFermion5D.cc (100%) rename {lib => Grid}/qcd/action/fermion/PartialFractionFermion5D.h (100%) rename {lib => Grid}/qcd/action/fermion/ScaledShamirFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/SchurDiagTwoKappa.h (100%) rename {lib => Grid}/qcd/action/fermion/ShamirZolotarevFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/StaggeredKernels.cc (100%) rename {lib => Grid}/qcd/action/fermion/StaggeredKernels.h (100%) rename {lib => Grid}/qcd/action/fermion/StaggeredKernelsAsm.cc (100%) rename {lib => Grid}/qcd/action/fermion/StaggeredKernelsHand.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonCloverFermion.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonCloverFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonCompressor.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonFermion.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonFermion5D.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonFermion5D.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernels.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernels.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsAsm.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsAsmAvx512.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsAsmBody.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsAsmBody.h.ab (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsAsmBody.h.abc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsAsmQPX.h (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsHand.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonKernelsHandGparity.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonTMFermion.cc (100%) rename {lib => Grid}/qcd/action/fermion/WilsonTMFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/ZMobiusFermion.h (100%) rename {lib => Grid}/qcd/action/fermion/g5HermitianLinop.h (100%) rename {lib => Grid}/qcd/action/gauge/Gauge.h (100%) rename {lib => Grid}/qcd/action/gauge/GaugeImplTypes.h (100%) rename {lib => Grid}/qcd/action/gauge/GaugeImplementations.h (100%) rename {lib => Grid}/qcd/action/gauge/Photon.h (100%) rename {lib => Grid}/qcd/action/gauge/PlaqPlusRectangleAction.h (100%) rename {lib => Grid}/qcd/action/gauge/WilsonGaugeAction.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/EvenOddSchurDifferentiable.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/ExactOneFlavourRatio.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/OneFlavourEvenOddRational.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/OneFlavourRational.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/OneFlavourRationalRatio.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/PseudoFermion.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/TwoFlavour.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/TwoFlavourEvenOdd.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h (100%) rename {lib => Grid}/qcd/action/pseudofermion/TwoFlavourRatio.h (100%) rename {lib => Grid}/qcd/action/scalar/Scalar.h (100%) rename {lib => Grid}/qcd/action/scalar/ScalarAction.h (100%) rename {lib => Grid}/qcd/action/scalar/ScalarImpl.h (100%) rename {lib => Grid}/qcd/action/scalar/ScalarInteractionAction.h (100%) rename {lib => Grid}/qcd/hmc/GenericHMCrunner.h (100%) rename {lib => Grid}/qcd/hmc/HMC.h (100%) rename {lib => Grid}/qcd/hmc/HMCModules.h (100%) rename {lib => Grid}/qcd/hmc/HMCResourceManager.h (100%) rename {lib => Grid}/qcd/hmc/HMCRunnerModule.h (100%) rename {lib => Grid}/qcd/hmc/HMC_GridModules.h (100%) rename {lib => Grid}/qcd/hmc/HMC_aggregate.h (100%) rename {lib => Grid}/qcd/hmc/UsingHMC.md (100%) rename {lib => Grid}/qcd/hmc/checkpointers/BaseCheckpointer.h (100%) rename {lib => Grid}/qcd/hmc/checkpointers/BinaryCheckpointer.h (100%) rename {lib => Grid}/qcd/hmc/checkpointers/CheckPointerModules.h (100%) rename {lib => Grid}/qcd/hmc/checkpointers/CheckPointers.h (100%) rename {lib => Grid}/qcd/hmc/checkpointers/ILDGCheckpointer.h (100%) rename {lib => Grid}/qcd/hmc/checkpointers/NerscCheckpointer.h (100%) rename {lib => Grid}/qcd/hmc/checkpointers/ScidacCheckpointer.h (100%) rename {lib => Grid}/qcd/hmc/integrators/Integrator.h (100%) rename {lib => Grid}/qcd/hmc/integrators/Integrator_algorithm.h (100%) rename {lib => Grid}/qcd/modules/ActionModules.h (100%) rename {lib => Grid}/qcd/modules/Factory.h (100%) rename {lib => Grid}/qcd/modules/FermionOperatorModules.h (100%) rename {lib => Grid}/qcd/modules/Modules.cc (100%) rename {lib => Grid}/qcd/modules/Modules.h (100%) rename {lib => Grid}/qcd/modules/ObservableModules.h (100%) rename {lib => Grid}/qcd/modules/Registration.h (100%) rename {lib => Grid}/qcd/modules/SolverModules.h (100%) rename {lib => Grid}/qcd/modules/mods.h (100%) rename {lib => Grid}/qcd/observables/hmc_observable.h (100%) rename {lib => Grid}/qcd/observables/plaquette.h (100%) rename {lib => Grid}/qcd/observables/polyakov_loop.h (100%) rename {lib => Grid}/qcd/observables/topological_charge.h (100%) rename {lib => Grid}/qcd/representations/Representations.h (100%) rename {lib => Grid}/qcd/representations/adjoint.h (100%) rename {lib => Grid}/qcd/representations/fundamental.h (100%) rename {lib => Grid}/qcd/representations/hmc_types.h (100%) rename {lib => Grid}/qcd/representations/two_index.h (100%) rename {lib => Grid}/qcd/smearing/APEsmearing.h (100%) rename {lib => Grid}/qcd/smearing/BaseSmearing.h (100%) rename {lib => Grid}/qcd/smearing/GaugeConfiguration.h (100%) rename {lib => Grid}/qcd/smearing/Smearing.h (100%) rename {lib => Grid}/qcd/smearing/StoutSmearing.h (100%) rename {lib => Grid}/qcd/smearing/WilsonFlow.h (100%) rename {lib => Grid}/qcd/spin/Dirac.h (100%) rename {lib => Grid}/qcd/spin/Gamma.cc (100%) rename {lib => Grid}/qcd/spin/Gamma.h (100%) rename {lib => Grid}/qcd/spin/Spin.h (100%) rename {lib => Grid}/qcd/spin/TwoSpinor.h (100%) rename {lib => Grid}/qcd/spin/gamma-gen/gamma-gen.nb (100%) rename {lib => Grid}/qcd/utils/CovariantCshift.h (100%) rename {lib => Grid}/qcd/utils/CovariantLaplacian.h (100%) rename {lib => Grid}/qcd/utils/GaugeFix.h (100%) rename {lib => Grid}/qcd/utils/LinalgUtils.h (100%) rename {lib => Grid}/qcd/utils/Metric.h (100%) rename {lib => Grid}/qcd/utils/SUn.h (100%) rename {lib => Grid}/qcd/utils/SUnAdjoint.h (100%) rename {lib => Grid}/qcd/utils/SUnTwoIndex.h (100%) rename {lib => Grid}/qcd/utils/ScalarObjs.h (100%) rename {lib => Grid}/qcd/utils/SpaceTimeGrid.cc (100%) rename {lib => Grid}/qcd/utils/SpaceTimeGrid.h (100%) rename {lib => Grid}/qcd/utils/Utils.h (100%) rename {lib => Grid}/qcd/utils/WilsonLoops.h (100%) rename {lib => Grid}/serialisation/BaseIO.h (100%) rename {lib => Grid}/serialisation/BinaryIO.cc (100%) rename {lib => Grid}/serialisation/BinaryIO.h (100%) rename {lib => Grid}/serialisation/Hdf5IO.cc (100%) rename {lib => Grid}/serialisation/Hdf5IO.h (100%) rename {lib => Grid}/serialisation/Hdf5Type.h (100%) rename {lib => Grid}/serialisation/JSON_IO.cc (100%) rename {lib => Grid}/serialisation/JSON_IO.h (100%) rename {lib => Grid}/serialisation/MacroMagic.h (100%) rename {lib => Grid}/serialisation/Serialisation.h (100%) rename {lib => Grid}/serialisation/TextIO.cc (100%) rename {lib => Grid}/serialisation/TextIO.h (100%) rename {lib => Grid}/serialisation/VectorUtils.h (100%) rename {lib => Grid}/serialisation/XmlIO.cc (100%) rename {lib => Grid}/serialisation/XmlIO.h (100%) rename {lib => Grid}/simd/BGQQPX.h (100%) rename {lib => Grid}/simd/Grid_avx.h (100%) rename {lib => Grid}/simd/Grid_avx512.h (100%) rename {lib => Grid}/simd/Grid_generic.h (100%) rename {lib => Grid}/simd/Grid_generic_types.h (100%) rename {lib => Grid}/simd/Grid_imci.h (100%) rename {lib => Grid}/simd/Grid_neon.h (100%) rename {lib => Grid}/simd/Grid_qpx.h (100%) rename {lib => Grid}/simd/Grid_sse4.h (100%) rename {lib => Grid}/simd/Grid_vector_types.h (100%) rename {lib => Grid}/simd/Grid_vector_unops.h (100%) rename {lib => Grid}/simd/IBM_qpx.h (100%) rename {lib => Grid}/simd/IBM_qpx_double.h (100%) rename {lib => Grid}/simd/IBM_qpx_single.h (100%) rename {lib => Grid}/simd/Intel512avx.h (100%) rename {lib => Grid}/simd/Intel512common.h (100%) rename {lib => Grid}/simd/Intel512double.h (100%) rename {lib => Grid}/simd/Intel512imci.h (100%) rename {lib => Grid}/simd/Intel512single.h (100%) rename {lib => Grid}/simd/Intel512wilson.h (100%) rename {lib => Grid}/simd/Simd.h (100%) rename {lib => Grid}/simd/l1p.h (100%) rename {lib => Grid}/sitmo_rng/README (100%) rename {lib => Grid}/sitmo_rng/sitmo_prng_engine.hpp (100%) rename {lib => Grid}/stencil/Lebesgue.cc (100%) rename {lib => Grid}/stencil/Lebesgue.h (100%) rename {lib => Grid}/stencil/SimpleCompressor.h (100%) rename {lib => Grid}/stencil/Stencil.cc (100%) rename {lib => Grid}/stencil/Stencil.h (100%) rename {lib => Grid}/tensors/Tensor_Ta.h (100%) rename {lib => Grid}/tensors/Tensor_arith.h (100%) rename {lib => Grid}/tensors/Tensor_arith_add.h (100%) rename {lib => Grid}/tensors/Tensor_arith_mac.h (100%) rename {lib => Grid}/tensors/Tensor_arith_mul.h (100%) rename {lib => Grid}/tensors/Tensor_arith_scalar.h (100%) rename {lib => Grid}/tensors/Tensor_arith_sub.h (100%) rename {lib => Grid}/tensors/Tensor_class.h (100%) rename {lib => Grid}/tensors/Tensor_determinant.h (100%) rename {lib => Grid}/tensors/Tensor_exp.h (100%) rename {lib => Grid}/tensors/Tensor_extract_merge.h (100%) rename {lib => Grid}/tensors/Tensor_index.h (100%) rename {lib => Grid}/tensors/Tensor_inner.h (100%) rename {lib => Grid}/tensors/Tensor_logical.h (100%) rename {lib => Grid}/tensors/Tensor_outer.h (100%) rename {lib => Grid}/tensors/Tensor_reality.h (100%) rename {lib => Grid}/tensors/Tensor_trace.h (100%) rename {lib => Grid}/tensors/Tensor_traits.h (100%) rename {lib => Grid}/tensors/Tensor_transpose.h (100%) rename {lib => Grid}/tensors/Tensor_unary.h (100%) rename {lib => Grid}/tensors/Tensors.h (100%) rename {lib => Grid}/threads/Threads.h (100%) rename {lib => Grid}/util/CompilerCompatible.h (100%) rename {lib => Grid}/util/Init.cc (100%) rename {lib => Grid}/util/Init.h (100%) rename {lib => Grid}/util/Lexicographic.h (100%) rename {lib => Grid}/util/Profiling.h (100%) rename {lib => Grid}/util/Sha.h (100%) rename {lib => Grid}/util/Util.h (100%) rename {lib => Grid}/util/version.cc (100%) create mode 100644 Grid/version.h rename {extras/Hadrons => Hadrons}/A2AVectors.hpp (98%) rename {extras/Hadrons => Hadrons}/Application.cc (98%) rename {extras/Hadrons => Hadrons}/Application.hpp (97%) rename {extras/Hadrons => Hadrons}/DilutedNoise.hpp (99%) rename {extras/Hadrons => Hadrons}/EigenPack.hpp (99%) rename {extras/Hadrons => Hadrons}/Environment.cc (98%) rename {extras/Hadrons => Hadrons}/Environment.hpp (99%) rename {extras/Hadrons => Hadrons}/Exceptions.cc (96%) rename {extras/Hadrons => Hadrons}/Exceptions.hpp (99%) rename {extras/Hadrons => Hadrons}/Factory.hpp (98%) rename {extras/Hadrons => Hadrons}/GeneticScheduler.hpp (99%) rename {extras/Hadrons => Hadrons}/Global.cc (99%) rename {extras/Hadrons => Hadrons}/Global.hpp (99%) rename {extras/Hadrons => Hadrons}/Graph.hpp (99%) rename {extras/Hadrons => Hadrons}/HadronsXmlRun.cc (98%) rename {extras/Hadrons => Hadrons}/Makefile.am (94%) rename {extras/Hadrons => Hadrons}/Module.cc (99%) rename {extras/Hadrons => Hadrons}/Module.hpp (99%) rename {extras/Hadrons => Hadrons}/ModuleFactory.hpp (93%) create mode 100644 Hadrons/Modules.hpp rename {extras/Hadrons => Hadrons}/Modules/MAction/DWF.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MAction/DWF.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MAction/MobiusDWF.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MAction/MobiusDWF.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MAction/ScaledDWF.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MAction/ScaledDWF.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MAction/Wilson.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MAction/Wilson.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MAction/WilsonClover.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MAction/WilsonClover.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MAction/ZMobiusDWF.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MAction/ZMobiusDWF.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/A2AMesonField.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/A2AMesonField.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/A2AMesonFieldKernels.hpp (99%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/Baryon.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/Baryon.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/DiscLoop.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/DiscLoop.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/Gamma3pt.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/Gamma3pt.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/Meson.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/Meson.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WardIdentity.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WardIdentity.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WeakHamiltonian.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WeakHamiltonianEye.cc (98%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WeakHamiltonianEye.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WeakHamiltonianNonEye.cc (98%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WeakHamiltonianNonEye.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WeakNeutral4ptDisc.cc (98%) rename {extras/Hadrons => Hadrons}/Modules/MContraction/WeakNeutral4ptDisc.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MFermion/FreeProp.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MFermion/FreeProp.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MFermion/GaugeProp.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MFermion/GaugeProp.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/FundtoHirep.cc (97%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/FundtoHirep.hpp (95%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/Random.cc (97%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/Random.hpp (94%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/StochEm.cc (98%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/StochEm.hpp (95%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/StoutSmearing.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/StoutSmearing.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/Unit.cc (97%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/Unit.hpp (94%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/UnitEm.cc (97%) rename {extras/Hadrons => Hadrons}/Modules/MGauge/UnitEm.hpp (95%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadBinary.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadBinary.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadCoarseEigenPack.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadCoarseEigenPack.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadEigenPack.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadEigenPack.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadNersc.cc (98%) rename {extras/Hadrons => Hadrons}/Modules/MIO/LoadNersc.hpp (95%) rename {extras/Hadrons => Hadrons}/Modules/MLoop/NoiseLoop.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MLoop/NoiseLoop.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/ChargedProp.cc (99%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/ChargedProp.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/FreeProp.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/FreeProp.hpp (95%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/Scalar.hpp (100%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/ScalarVP.cc (99%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/ScalarVP.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/VPCounterTerms.cc (98%) rename {extras/Hadrons => Hadrons}/Modules/MScalar/VPCounterTerms.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/Div.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/Div.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/EMT.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/EMT.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/Grad.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/Grad.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/ShiftProbe.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/ShiftProbe.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/StochFreeField.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/StochFreeField.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TimeMomProbe.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TimeMomProbe.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TrKinetic.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TrKinetic.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TrMag.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TrMag.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TrPhi.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TrPhi.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TransProj.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TransProj.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TwoPoint.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TwoPoint.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TwoPointNPR.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/TwoPointNPR.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MScalarSUN/Utils.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MSink/Point.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSink/Point.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MSink/Smear.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSink/Smear.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MSolver/A2AVectors.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSolver/A2AVectors.hpp (96%) rename {extras/Hadrons => Hadrons}/Modules/MSolver/LocalCoherenceLanczos.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MSolver/LocalCoherenceLanczos.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MSolver/RBPrecCG.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSolver/RBPrecCG.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MSource/Point.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSource/Point.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MSource/SeqConserved.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MSource/SeqConserved.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MSource/SeqGamma.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSource/SeqGamma.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MSource/Wall.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSource/Wall.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MSource/Z2.cc (96%) rename {extras/Hadrons => Hadrons}/Modules/MSource/Z2.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MUtilities/RandomVectors.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MUtilities/RandomVectors.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/MUtilities/TestSeqConserved.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MUtilities/TestSeqConserved.hpp (98%) rename {extras/Hadrons => Hadrons}/Modules/MUtilities/TestSeqGamma.cc (95%) rename {extras/Hadrons => Hadrons}/Modules/MUtilities/TestSeqGamma.hpp (97%) rename {extras/Hadrons => Hadrons}/Modules/templates/Module_in_NS.cc.template (100%) rename {extras/Hadrons => Hadrons}/Modules/templates/Module_in_NS.hpp.template (100%) rename {extras/Hadrons => Hadrons}/Modules/templates/Module_tmp_in_NS.cc.template (100%) rename {extras/Hadrons => Hadrons}/Modules/templates/Module_tmp_in_NS.hpp.template (100%) rename {extras/Hadrons => Hadrons}/Solver.hpp (98%) rename {extras/Hadrons => Hadrons}/VirtualMachine.cc (99%) rename {extras/Hadrons => Hadrons}/VirtualMachine.hpp (98%) rename {extras/Hadrons => Hadrons}/add_module.sh (100%) rename {extras/Hadrons => Hadrons}/add_module_template.sh (100%) rename {extras/Hadrons => Hadrons}/make_module_inst.sh (100%) rename {extras/Hadrons => Hadrons}/make_module_list.sh (100%) rename {extras/Hadrons => Hadrons}/modules.inc (100%) delete mode 100644 extras/Hadrons/Modules.hpp delete mode 100644 extras/Makefile.am delete mode 100644 extras/qed-fvol/Global.cc delete mode 100644 extras/qed-fvol/Global.hpp delete mode 100644 extras/qed-fvol/Makefile.am delete mode 100644 extras/qed-fvol/WilsonLoops.h delete mode 100644 extras/qed-fvol/qed-fvol.cc delete mode 100644 lib/.dirstamp delete mode 120000 lib/Hadrons delete mode 100644 lib/qcd/hmc/.dirstamp delete mode 100644 lib/qcd/hmc/integrators/.dirstamp delete mode 100644 lib/simd/.dirstamp diff --git a/lib/DisableWarnings.h b/Grid/DisableWarnings.h similarity index 100% rename from lib/DisableWarnings.h rename to Grid/DisableWarnings.h diff --git a/lib/Grid.h b/Grid/Grid.h similarity index 100% rename from lib/Grid.h rename to Grid/Grid.h diff --git a/lib/GridCore.h b/Grid/GridCore.h similarity index 100% rename from lib/GridCore.h rename to Grid/GridCore.h diff --git a/lib/GridQCDcore.h b/Grid/GridQCDcore.h similarity index 100% rename from lib/GridQCDcore.h rename to Grid/GridQCDcore.h diff --git a/lib/GridStd.h b/Grid/GridStd.h similarity index 100% rename from lib/GridStd.h rename to Grid/GridStd.h diff --git a/lib/Grid_Eigen_Dense.h b/Grid/Grid_Eigen_Dense.h similarity index 100% rename from lib/Grid_Eigen_Dense.h rename to Grid/Grid_Eigen_Dense.h diff --git a/lib/Makefile.am b/Grid/Makefile.am similarity index 94% rename from lib/Makefile.am rename to Grid/Makefile.am index 6c94e2d6..5cd76b40 100644 --- a/lib/Makefile.am +++ b/Grid/Makefile.am @@ -33,5 +33,5 @@ CCFILES += $(extra_sources) HFILES += $(extra_headers) libGrid_a_SOURCES = $(CCFILES) -libGrid_adir = $(pkgincludedir) +libGrid_adir = $(includedir)/Grid nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) $(eigen_unsupp_files) Config.h diff --git a/lib/algorithms/Algorithms.h b/Grid/algorithms/Algorithms.h similarity index 100% rename from lib/algorithms/Algorithms.h rename to Grid/algorithms/Algorithms.h diff --git a/lib/algorithms/CoarsenedMatrix.h b/Grid/algorithms/CoarsenedMatrix.h similarity index 100% rename from lib/algorithms/CoarsenedMatrix.h rename to Grid/algorithms/CoarsenedMatrix.h diff --git a/lib/algorithms/FFT.h b/Grid/algorithms/FFT.h similarity index 100% rename from lib/algorithms/FFT.h rename to Grid/algorithms/FFT.h diff --git a/lib/algorithms/LinearOperator.h b/Grid/algorithms/LinearOperator.h similarity index 100% rename from lib/algorithms/LinearOperator.h rename to Grid/algorithms/LinearOperator.h diff --git a/lib/algorithms/Preconditioner.h b/Grid/algorithms/Preconditioner.h similarity index 100% rename from lib/algorithms/Preconditioner.h rename to Grid/algorithms/Preconditioner.h diff --git a/lib/algorithms/SparseMatrix.h b/Grid/algorithms/SparseMatrix.h similarity index 100% rename from lib/algorithms/SparseMatrix.h rename to Grid/algorithms/SparseMatrix.h diff --git a/lib/algorithms/approx/Chebyshev.h b/Grid/algorithms/approx/Chebyshev.h similarity index 100% rename from lib/algorithms/approx/Chebyshev.h rename to Grid/algorithms/approx/Chebyshev.h diff --git a/lib/algorithms/approx/Forecast.h b/Grid/algorithms/approx/Forecast.h similarity index 100% rename from lib/algorithms/approx/Forecast.h rename to Grid/algorithms/approx/Forecast.h diff --git a/lib/algorithms/approx/LICENSE b/Grid/algorithms/approx/LICENSE similarity index 100% rename from lib/algorithms/approx/LICENSE rename to Grid/algorithms/approx/LICENSE diff --git a/lib/algorithms/approx/MultiShiftFunction.cc b/Grid/algorithms/approx/MultiShiftFunction.cc similarity index 100% rename from lib/algorithms/approx/MultiShiftFunction.cc rename to Grid/algorithms/approx/MultiShiftFunction.cc diff --git a/lib/algorithms/approx/MultiShiftFunction.h b/Grid/algorithms/approx/MultiShiftFunction.h similarity index 100% rename from lib/algorithms/approx/MultiShiftFunction.h rename to Grid/algorithms/approx/MultiShiftFunction.h diff --git a/lib/algorithms/approx/README b/Grid/algorithms/approx/README similarity index 100% rename from lib/algorithms/approx/README rename to Grid/algorithms/approx/README diff --git a/lib/algorithms/approx/Remez.cc b/Grid/algorithms/approx/Remez.cc similarity index 100% rename from lib/algorithms/approx/Remez.cc rename to Grid/algorithms/approx/Remez.cc diff --git a/lib/algorithms/approx/Remez.h b/Grid/algorithms/approx/Remez.h similarity index 100% rename from lib/algorithms/approx/Remez.h rename to Grid/algorithms/approx/Remez.h diff --git a/lib/algorithms/approx/Zolotarev.cc b/Grid/algorithms/approx/Zolotarev.cc similarity index 100% rename from lib/algorithms/approx/Zolotarev.cc rename to Grid/algorithms/approx/Zolotarev.cc diff --git a/lib/algorithms/approx/Zolotarev.h b/Grid/algorithms/approx/Zolotarev.h similarity index 100% rename from lib/algorithms/approx/Zolotarev.h rename to Grid/algorithms/approx/Zolotarev.h diff --git a/lib/algorithms/approx/bigfloat.h b/Grid/algorithms/approx/bigfloat.h similarity index 100% rename from lib/algorithms/approx/bigfloat.h rename to Grid/algorithms/approx/bigfloat.h diff --git a/lib/algorithms/approx/bigfloat_double.h b/Grid/algorithms/approx/bigfloat_double.h similarity index 100% rename from lib/algorithms/approx/bigfloat_double.h rename to Grid/algorithms/approx/bigfloat_double.h diff --git a/lib/algorithms/iterative/AdefGeneric.h b/Grid/algorithms/iterative/AdefGeneric.h similarity index 100% rename from lib/algorithms/iterative/AdefGeneric.h rename to Grid/algorithms/iterative/AdefGeneric.h diff --git a/lib/algorithms/iterative/BlockConjugateGradient.h b/Grid/algorithms/iterative/BlockConjugateGradient.h similarity index 100% rename from lib/algorithms/iterative/BlockConjugateGradient.h rename to Grid/algorithms/iterative/BlockConjugateGradient.h diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/Grid/algorithms/iterative/ConjugateGradient.h similarity index 100% rename from lib/algorithms/iterative/ConjugateGradient.h rename to Grid/algorithms/iterative/ConjugateGradient.h diff --git a/lib/algorithms/iterative/ConjugateGradientMixedPrec.h b/Grid/algorithms/iterative/ConjugateGradientMixedPrec.h similarity index 100% rename from lib/algorithms/iterative/ConjugateGradientMixedPrec.h rename to Grid/algorithms/iterative/ConjugateGradientMixedPrec.h diff --git a/lib/algorithms/iterative/ConjugateGradientMultiShift.h b/Grid/algorithms/iterative/ConjugateGradientMultiShift.h similarity index 100% rename from lib/algorithms/iterative/ConjugateGradientMultiShift.h rename to Grid/algorithms/iterative/ConjugateGradientMultiShift.h diff --git a/lib/algorithms/iterative/ConjugateGradientReliableUpdate.h b/Grid/algorithms/iterative/ConjugateGradientReliableUpdate.h similarity index 100% rename from lib/algorithms/iterative/ConjugateGradientReliableUpdate.h rename to Grid/algorithms/iterative/ConjugateGradientReliableUpdate.h diff --git a/lib/algorithms/iterative/ConjugateResidual.h b/Grid/algorithms/iterative/ConjugateResidual.h similarity index 100% rename from lib/algorithms/iterative/ConjugateResidual.h rename to Grid/algorithms/iterative/ConjugateResidual.h diff --git a/lib/algorithms/iterative/Deflation.h b/Grid/algorithms/iterative/Deflation.h similarity index 100% rename from lib/algorithms/iterative/Deflation.h rename to Grid/algorithms/iterative/Deflation.h diff --git a/lib/algorithms/iterative/ImplicitlyRestartedLanczos.h b/Grid/algorithms/iterative/ImplicitlyRestartedLanczos.h similarity index 100% rename from lib/algorithms/iterative/ImplicitlyRestartedLanczos.h rename to Grid/algorithms/iterative/ImplicitlyRestartedLanczos.h diff --git a/lib/algorithms/iterative/LocalCoherenceLanczos.h b/Grid/algorithms/iterative/LocalCoherenceLanczos.h similarity index 100% rename from lib/algorithms/iterative/LocalCoherenceLanczos.h rename to Grid/algorithms/iterative/LocalCoherenceLanczos.h diff --git a/lib/algorithms/iterative/NormalEquations.h b/Grid/algorithms/iterative/NormalEquations.h similarity index 100% rename from lib/algorithms/iterative/NormalEquations.h rename to Grid/algorithms/iterative/NormalEquations.h diff --git a/lib/algorithms/iterative/PrecConjugateResidual.h b/Grid/algorithms/iterative/PrecConjugateResidual.h similarity index 100% rename from lib/algorithms/iterative/PrecConjugateResidual.h rename to Grid/algorithms/iterative/PrecConjugateResidual.h diff --git a/lib/algorithms/iterative/PrecGeneralisedConjugateResidual.h b/Grid/algorithms/iterative/PrecGeneralisedConjugateResidual.h similarity index 100% rename from lib/algorithms/iterative/PrecGeneralisedConjugateResidual.h rename to Grid/algorithms/iterative/PrecGeneralisedConjugateResidual.h diff --git a/lib/algorithms/iterative/SchurRedBlack.h b/Grid/algorithms/iterative/SchurRedBlack.h similarity index 100% rename from lib/algorithms/iterative/SchurRedBlack.h rename to Grid/algorithms/iterative/SchurRedBlack.h diff --git a/lib/allocator/AlignedAllocator.cc b/Grid/allocator/AlignedAllocator.cc similarity index 100% rename from lib/allocator/AlignedAllocator.cc rename to Grid/allocator/AlignedAllocator.cc diff --git a/lib/allocator/AlignedAllocator.h b/Grid/allocator/AlignedAllocator.h similarity index 100% rename from lib/allocator/AlignedAllocator.h rename to Grid/allocator/AlignedAllocator.h diff --git a/lib/cartesian/Cartesian.h b/Grid/cartesian/Cartesian.h similarity index 100% rename from lib/cartesian/Cartesian.h rename to Grid/cartesian/Cartesian.h diff --git a/lib/cartesian/Cartesian_base.h b/Grid/cartesian/Cartesian_base.h similarity index 100% rename from lib/cartesian/Cartesian_base.h rename to Grid/cartesian/Cartesian_base.h diff --git a/lib/cartesian/Cartesian_full.h b/Grid/cartesian/Cartesian_full.h similarity index 100% rename from lib/cartesian/Cartesian_full.h rename to Grid/cartesian/Cartesian_full.h diff --git a/lib/cartesian/Cartesian_red_black.h b/Grid/cartesian/Cartesian_red_black.h similarity index 100% rename from lib/cartesian/Cartesian_red_black.h rename to Grid/cartesian/Cartesian_red_black.h diff --git a/lib/communicator/Communicator.h b/Grid/communicator/Communicator.h similarity index 100% rename from lib/communicator/Communicator.h rename to Grid/communicator/Communicator.h diff --git a/lib/communicator/Communicator_base.cc b/Grid/communicator/Communicator_base.cc similarity index 100% rename from lib/communicator/Communicator_base.cc rename to Grid/communicator/Communicator_base.cc diff --git a/lib/communicator/Communicator_base.h b/Grid/communicator/Communicator_base.h similarity index 100% rename from lib/communicator/Communicator_base.h rename to Grid/communicator/Communicator_base.h diff --git a/lib/communicator/Communicator_mpi3.cc b/Grid/communicator/Communicator_mpi3.cc similarity index 100% rename from lib/communicator/Communicator_mpi3.cc rename to Grid/communicator/Communicator_mpi3.cc diff --git a/lib/communicator/Communicator_none.cc b/Grid/communicator/Communicator_none.cc similarity index 100% rename from lib/communicator/Communicator_none.cc rename to Grid/communicator/Communicator_none.cc diff --git a/lib/communicator/SharedMemory.cc b/Grid/communicator/SharedMemory.cc similarity index 100% rename from lib/communicator/SharedMemory.cc rename to Grid/communicator/SharedMemory.cc diff --git a/lib/communicator/SharedMemory.h b/Grid/communicator/SharedMemory.h similarity index 100% rename from lib/communicator/SharedMemory.h rename to Grid/communicator/SharedMemory.h diff --git a/lib/communicator/SharedMemoryMPI.cc b/Grid/communicator/SharedMemoryMPI.cc similarity index 100% rename from lib/communicator/SharedMemoryMPI.cc rename to Grid/communicator/SharedMemoryMPI.cc diff --git a/lib/communicator/SharedMemoryNone.cc b/Grid/communicator/SharedMemoryNone.cc similarity index 100% rename from lib/communicator/SharedMemoryNone.cc rename to Grid/communicator/SharedMemoryNone.cc diff --git a/lib/cshift/Cshift.h b/Grid/cshift/Cshift.h similarity index 100% rename from lib/cshift/Cshift.h rename to Grid/cshift/Cshift.h diff --git a/lib/cshift/Cshift_common.h b/Grid/cshift/Cshift_common.h similarity index 100% rename from lib/cshift/Cshift_common.h rename to Grid/cshift/Cshift_common.h diff --git a/lib/cshift/Cshift_mpi.h b/Grid/cshift/Cshift_mpi.h similarity index 100% rename from lib/cshift/Cshift_mpi.h rename to Grid/cshift/Cshift_mpi.h diff --git a/lib/cshift/Cshift_none.h b/Grid/cshift/Cshift_none.h similarity index 100% rename from lib/cshift/Cshift_none.h rename to Grid/cshift/Cshift_none.h diff --git a/lib/json/json.hpp b/Grid/json/json.hpp similarity index 100% rename from lib/json/json.hpp rename to Grid/json/json.hpp diff --git a/lib/lattice/Lattice.h b/Grid/lattice/Lattice.h similarity index 100% rename from lib/lattice/Lattice.h rename to Grid/lattice/Lattice.h diff --git a/lib/lattice/Lattice_ET.h b/Grid/lattice/Lattice_ET.h similarity index 100% rename from lib/lattice/Lattice_ET.h rename to Grid/lattice/Lattice_ET.h diff --git a/lib/lattice/Lattice_arith.h b/Grid/lattice/Lattice_arith.h similarity index 100% rename from lib/lattice/Lattice_arith.h rename to Grid/lattice/Lattice_arith.h diff --git a/lib/lattice/Lattice_base.h b/Grid/lattice/Lattice_base.h similarity index 100% rename from lib/lattice/Lattice_base.h rename to Grid/lattice/Lattice_base.h diff --git a/lib/lattice/Lattice_comparison.h b/Grid/lattice/Lattice_comparison.h similarity index 100% rename from lib/lattice/Lattice_comparison.h rename to Grid/lattice/Lattice_comparison.h diff --git a/lib/lattice/Lattice_comparison_utils.h b/Grid/lattice/Lattice_comparison_utils.h similarity index 100% rename from lib/lattice/Lattice_comparison_utils.h rename to Grid/lattice/Lattice_comparison_utils.h diff --git a/lib/lattice/Lattice_conformable.h b/Grid/lattice/Lattice_conformable.h similarity index 100% rename from lib/lattice/Lattice_conformable.h rename to Grid/lattice/Lattice_conformable.h diff --git a/lib/lattice/Lattice_coordinate.h b/Grid/lattice/Lattice_coordinate.h similarity index 100% rename from lib/lattice/Lattice_coordinate.h rename to Grid/lattice/Lattice_coordinate.h diff --git a/lib/lattice/Lattice_local.h b/Grid/lattice/Lattice_local.h similarity index 100% rename from lib/lattice/Lattice_local.h rename to Grid/lattice/Lattice_local.h diff --git a/lib/lattice/Lattice_overload.h b/Grid/lattice/Lattice_overload.h similarity index 100% rename from lib/lattice/Lattice_overload.h rename to Grid/lattice/Lattice_overload.h diff --git a/lib/lattice/Lattice_peekpoke.h b/Grid/lattice/Lattice_peekpoke.h similarity index 100% rename from lib/lattice/Lattice_peekpoke.h rename to Grid/lattice/Lattice_peekpoke.h diff --git a/lib/lattice/Lattice_reality.h b/Grid/lattice/Lattice_reality.h similarity index 100% rename from lib/lattice/Lattice_reality.h rename to Grid/lattice/Lattice_reality.h diff --git a/lib/lattice/Lattice_reduction.h b/Grid/lattice/Lattice_reduction.h similarity index 100% rename from lib/lattice/Lattice_reduction.h rename to Grid/lattice/Lattice_reduction.h diff --git a/lib/lattice/Lattice_rng.h b/Grid/lattice/Lattice_rng.h similarity index 100% rename from lib/lattice/Lattice_rng.h rename to Grid/lattice/Lattice_rng.h diff --git a/lib/lattice/Lattice_trace.h b/Grid/lattice/Lattice_trace.h similarity index 100% rename from lib/lattice/Lattice_trace.h rename to Grid/lattice/Lattice_trace.h diff --git a/lib/lattice/Lattice_transfer.h b/Grid/lattice/Lattice_transfer.h similarity index 100% rename from lib/lattice/Lattice_transfer.h rename to Grid/lattice/Lattice_transfer.h diff --git a/lib/lattice/Lattice_transpose.h b/Grid/lattice/Lattice_transpose.h similarity index 100% rename from lib/lattice/Lattice_transpose.h rename to Grid/lattice/Lattice_transpose.h diff --git a/lib/lattice/Lattice_unary.h b/Grid/lattice/Lattice_unary.h similarity index 100% rename from lib/lattice/Lattice_unary.h rename to Grid/lattice/Lattice_unary.h diff --git a/lib/lattice/Lattice_where.h b/Grid/lattice/Lattice_where.h similarity index 100% rename from lib/lattice/Lattice_where.h rename to Grid/lattice/Lattice_where.h diff --git a/lib/log/Log.cc b/Grid/log/Log.cc similarity index 100% rename from lib/log/Log.cc rename to Grid/log/Log.cc diff --git a/lib/log/Log.h b/Grid/log/Log.h similarity index 100% rename from lib/log/Log.h rename to Grid/log/Log.h diff --git a/lib/parallelIO/BinaryIO.h b/Grid/parallelIO/BinaryIO.h similarity index 100% rename from lib/parallelIO/BinaryIO.h rename to Grid/parallelIO/BinaryIO.h diff --git a/lib/parallelIO/IldgIO.h b/Grid/parallelIO/IldgIO.h similarity index 100% rename from lib/parallelIO/IldgIO.h rename to Grid/parallelIO/IldgIO.h diff --git a/lib/parallelIO/IldgIOtypes.h b/Grid/parallelIO/IldgIOtypes.h similarity index 100% rename from lib/parallelIO/IldgIOtypes.h rename to Grid/parallelIO/IldgIOtypes.h diff --git a/lib/parallelIO/MetaData.h b/Grid/parallelIO/MetaData.h similarity index 100% rename from lib/parallelIO/MetaData.h rename to Grid/parallelIO/MetaData.h diff --git a/lib/parallelIO/NerscIO.h b/Grid/parallelIO/NerscIO.h similarity index 100% rename from lib/parallelIO/NerscIO.h rename to Grid/parallelIO/NerscIO.h diff --git a/lib/perfmon/PerfCount.cc b/Grid/perfmon/PerfCount.cc similarity index 100% rename from lib/perfmon/PerfCount.cc rename to Grid/perfmon/PerfCount.cc diff --git a/lib/perfmon/PerfCount.h b/Grid/perfmon/PerfCount.h similarity index 100% rename from lib/perfmon/PerfCount.h rename to Grid/perfmon/PerfCount.h diff --git a/lib/perfmon/Stat.cc b/Grid/perfmon/Stat.cc similarity index 100% rename from lib/perfmon/Stat.cc rename to Grid/perfmon/Stat.cc diff --git a/lib/perfmon/Stat.h b/Grid/perfmon/Stat.h similarity index 100% rename from lib/perfmon/Stat.h rename to Grid/perfmon/Stat.h diff --git a/lib/perfmon/Timer.h b/Grid/perfmon/Timer.h similarity index 100% rename from lib/perfmon/Timer.h rename to Grid/perfmon/Timer.h diff --git a/lib/pugixml/pugiconfig.hpp b/Grid/pugixml/pugiconfig.hpp similarity index 100% rename from lib/pugixml/pugiconfig.hpp rename to Grid/pugixml/pugiconfig.hpp diff --git a/lib/pugixml/pugixml.cc b/Grid/pugixml/pugixml.cc similarity index 100% rename from lib/pugixml/pugixml.cc rename to Grid/pugixml/pugixml.cc diff --git a/lib/pugixml/pugixml.h b/Grid/pugixml/pugixml.h similarity index 100% rename from lib/pugixml/pugixml.h rename to Grid/pugixml/pugixml.h diff --git a/lib/pugixml/readme.txt b/Grid/pugixml/readme.txt similarity index 100% rename from lib/pugixml/readme.txt rename to Grid/pugixml/readme.txt diff --git a/lib/qcd/LatticeTheories.h b/Grid/qcd/LatticeTheories.h similarity index 100% rename from lib/qcd/LatticeTheories.h rename to Grid/qcd/LatticeTheories.h diff --git a/lib/qcd/QCD.h b/Grid/qcd/QCD.h similarity index 100% rename from lib/qcd/QCD.h rename to Grid/qcd/QCD.h diff --git a/lib/qcd/action/Action.h b/Grid/qcd/action/Action.h similarity index 100% rename from lib/qcd/action/Action.h rename to Grid/qcd/action/Action.h diff --git a/lib/qcd/action/ActionBase.h b/Grid/qcd/action/ActionBase.h similarity index 100% rename from lib/qcd/action/ActionBase.h rename to Grid/qcd/action/ActionBase.h diff --git a/lib/qcd/action/ActionCore.h b/Grid/qcd/action/ActionCore.h similarity index 100% rename from lib/qcd/action/ActionCore.h rename to Grid/qcd/action/ActionCore.h diff --git a/lib/qcd/action/ActionParams.h b/Grid/qcd/action/ActionParams.h similarity index 100% rename from lib/qcd/action/ActionParams.h rename to Grid/qcd/action/ActionParams.h diff --git a/lib/qcd/action/ActionSet.h b/Grid/qcd/action/ActionSet.h similarity index 100% rename from lib/qcd/action/ActionSet.h rename to Grid/qcd/action/ActionSet.h diff --git a/lib/qcd/action/fermion/AbstractEOFAFermion.h b/Grid/qcd/action/fermion/AbstractEOFAFermion.h similarity index 100% rename from lib/qcd/action/fermion/AbstractEOFAFermion.h rename to Grid/qcd/action/fermion/AbstractEOFAFermion.h diff --git a/lib/qcd/action/fermion/CayleyFermion5D.cc b/Grid/qcd/action/fermion/CayleyFermion5D.cc similarity index 100% rename from lib/qcd/action/fermion/CayleyFermion5D.cc rename to Grid/qcd/action/fermion/CayleyFermion5D.cc diff --git a/lib/qcd/action/fermion/CayleyFermion5D.h b/Grid/qcd/action/fermion/CayleyFermion5D.h similarity index 100% rename from lib/qcd/action/fermion/CayleyFermion5D.h rename to Grid/qcd/action/fermion/CayleyFermion5D.h diff --git a/lib/qcd/action/fermion/CayleyFermion5Dcache.cc b/Grid/qcd/action/fermion/CayleyFermion5Dcache.cc similarity index 100% rename from lib/qcd/action/fermion/CayleyFermion5Dcache.cc rename to Grid/qcd/action/fermion/CayleyFermion5Dcache.cc diff --git a/lib/qcd/action/fermion/CayleyFermion5Ddense.cc b/Grid/qcd/action/fermion/CayleyFermion5Ddense.cc similarity index 100% rename from lib/qcd/action/fermion/CayleyFermion5Ddense.cc rename to Grid/qcd/action/fermion/CayleyFermion5Ddense.cc diff --git a/lib/qcd/action/fermion/CayleyFermion5Dssp.cc b/Grid/qcd/action/fermion/CayleyFermion5Dssp.cc similarity index 100% rename from lib/qcd/action/fermion/CayleyFermion5Dssp.cc rename to Grid/qcd/action/fermion/CayleyFermion5Dssp.cc diff --git a/lib/qcd/action/fermion/CayleyFermion5Dvec.cc b/Grid/qcd/action/fermion/CayleyFermion5Dvec.cc similarity index 100% rename from lib/qcd/action/fermion/CayleyFermion5Dvec.cc rename to Grid/qcd/action/fermion/CayleyFermion5Dvec.cc diff --git a/lib/qcd/action/fermion/ContinuedFractionFermion5D.cc b/Grid/qcd/action/fermion/ContinuedFractionFermion5D.cc similarity index 100% rename from lib/qcd/action/fermion/ContinuedFractionFermion5D.cc rename to Grid/qcd/action/fermion/ContinuedFractionFermion5D.cc diff --git a/lib/qcd/action/fermion/ContinuedFractionFermion5D.h b/Grid/qcd/action/fermion/ContinuedFractionFermion5D.h similarity index 100% rename from lib/qcd/action/fermion/ContinuedFractionFermion5D.h rename to Grid/qcd/action/fermion/ContinuedFractionFermion5D.h diff --git a/lib/qcd/action/fermion/DomainWallEOFAFermion.cc b/Grid/qcd/action/fermion/DomainWallEOFAFermion.cc similarity index 100% rename from lib/qcd/action/fermion/DomainWallEOFAFermion.cc rename to Grid/qcd/action/fermion/DomainWallEOFAFermion.cc diff --git a/lib/qcd/action/fermion/DomainWallEOFAFermion.h b/Grid/qcd/action/fermion/DomainWallEOFAFermion.h similarity index 100% rename from lib/qcd/action/fermion/DomainWallEOFAFermion.h rename to Grid/qcd/action/fermion/DomainWallEOFAFermion.h diff --git a/lib/qcd/action/fermion/DomainWallEOFAFermioncache.cc b/Grid/qcd/action/fermion/DomainWallEOFAFermioncache.cc similarity index 100% rename from lib/qcd/action/fermion/DomainWallEOFAFermioncache.cc rename to Grid/qcd/action/fermion/DomainWallEOFAFermioncache.cc diff --git a/lib/qcd/action/fermion/DomainWallEOFAFermiondense.cc b/Grid/qcd/action/fermion/DomainWallEOFAFermiondense.cc similarity index 100% rename from lib/qcd/action/fermion/DomainWallEOFAFermiondense.cc rename to Grid/qcd/action/fermion/DomainWallEOFAFermiondense.cc diff --git a/lib/qcd/action/fermion/DomainWallEOFAFermionssp.cc b/Grid/qcd/action/fermion/DomainWallEOFAFermionssp.cc similarity index 100% rename from lib/qcd/action/fermion/DomainWallEOFAFermionssp.cc rename to Grid/qcd/action/fermion/DomainWallEOFAFermionssp.cc diff --git a/lib/qcd/action/fermion/DomainWallEOFAFermionvec.cc b/Grid/qcd/action/fermion/DomainWallEOFAFermionvec.cc similarity index 100% rename from lib/qcd/action/fermion/DomainWallEOFAFermionvec.cc rename to Grid/qcd/action/fermion/DomainWallEOFAFermionvec.cc diff --git a/lib/qcd/action/fermion/DomainWallFermion.h b/Grid/qcd/action/fermion/DomainWallFermion.h similarity index 100% rename from lib/qcd/action/fermion/DomainWallFermion.h rename to Grid/qcd/action/fermion/DomainWallFermion.h diff --git a/lib/qcd/action/fermion/Fermion.h b/Grid/qcd/action/fermion/Fermion.h similarity index 100% rename from lib/qcd/action/fermion/Fermion.h rename to Grid/qcd/action/fermion/Fermion.h diff --git a/lib/qcd/action/fermion/FermionCore.h b/Grid/qcd/action/fermion/FermionCore.h similarity index 100% rename from lib/qcd/action/fermion/FermionCore.h rename to Grid/qcd/action/fermion/FermionCore.h diff --git a/lib/qcd/action/fermion/FermionOperator.h b/Grid/qcd/action/fermion/FermionOperator.h similarity index 100% rename from lib/qcd/action/fermion/FermionOperator.h rename to Grid/qcd/action/fermion/FermionOperator.h diff --git a/lib/qcd/action/fermion/FermionOperatorImpl.h b/Grid/qcd/action/fermion/FermionOperatorImpl.h similarity index 100% rename from lib/qcd/action/fermion/FermionOperatorImpl.h rename to Grid/qcd/action/fermion/FermionOperatorImpl.h diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.cc b/Grid/qcd/action/fermion/ImprovedStaggeredFermion.cc similarity index 100% rename from lib/qcd/action/fermion/ImprovedStaggeredFermion.cc rename to Grid/qcd/action/fermion/ImprovedStaggeredFermion.cc diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion.h b/Grid/qcd/action/fermion/ImprovedStaggeredFermion.h similarity index 100% rename from lib/qcd/action/fermion/ImprovedStaggeredFermion.h rename to Grid/qcd/action/fermion/ImprovedStaggeredFermion.h diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc b/Grid/qcd/action/fermion/ImprovedStaggeredFermion5D.cc similarity index 100% rename from lib/qcd/action/fermion/ImprovedStaggeredFermion5D.cc rename to Grid/qcd/action/fermion/ImprovedStaggeredFermion5D.cc diff --git a/lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h b/Grid/qcd/action/fermion/ImprovedStaggeredFermion5D.h similarity index 100% rename from lib/qcd/action/fermion/ImprovedStaggeredFermion5D.h rename to Grid/qcd/action/fermion/ImprovedStaggeredFermion5D.h diff --git a/lib/qcd/action/fermion/MobiusEOFAFermion.cc b/Grid/qcd/action/fermion/MobiusEOFAFermion.cc similarity index 100% rename from lib/qcd/action/fermion/MobiusEOFAFermion.cc rename to Grid/qcd/action/fermion/MobiusEOFAFermion.cc diff --git a/lib/qcd/action/fermion/MobiusEOFAFermion.h b/Grid/qcd/action/fermion/MobiusEOFAFermion.h similarity index 100% rename from lib/qcd/action/fermion/MobiusEOFAFermion.h rename to Grid/qcd/action/fermion/MobiusEOFAFermion.h diff --git a/lib/qcd/action/fermion/MobiusEOFAFermioncache.cc b/Grid/qcd/action/fermion/MobiusEOFAFermioncache.cc similarity index 100% rename from lib/qcd/action/fermion/MobiusEOFAFermioncache.cc rename to Grid/qcd/action/fermion/MobiusEOFAFermioncache.cc diff --git a/lib/qcd/action/fermion/MobiusEOFAFermiondense.cc b/Grid/qcd/action/fermion/MobiusEOFAFermiondense.cc similarity index 100% rename from lib/qcd/action/fermion/MobiusEOFAFermiondense.cc rename to Grid/qcd/action/fermion/MobiusEOFAFermiondense.cc diff --git a/lib/qcd/action/fermion/MobiusEOFAFermionssp.cc b/Grid/qcd/action/fermion/MobiusEOFAFermionssp.cc similarity index 100% rename from lib/qcd/action/fermion/MobiusEOFAFermionssp.cc rename to Grid/qcd/action/fermion/MobiusEOFAFermionssp.cc diff --git a/lib/qcd/action/fermion/MobiusEOFAFermionvec.cc b/Grid/qcd/action/fermion/MobiusEOFAFermionvec.cc similarity index 100% rename from lib/qcd/action/fermion/MobiusEOFAFermionvec.cc rename to Grid/qcd/action/fermion/MobiusEOFAFermionvec.cc diff --git a/lib/qcd/action/fermion/MobiusFermion.h b/Grid/qcd/action/fermion/MobiusFermion.h similarity index 100% rename from lib/qcd/action/fermion/MobiusFermion.h rename to Grid/qcd/action/fermion/MobiusFermion.h diff --git a/lib/qcd/action/fermion/MobiusZolotarevFermion.h b/Grid/qcd/action/fermion/MobiusZolotarevFermion.h similarity index 100% rename from lib/qcd/action/fermion/MobiusZolotarevFermion.h rename to Grid/qcd/action/fermion/MobiusZolotarevFermion.h diff --git a/lib/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h b/Grid/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h similarity index 100% rename from lib/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h rename to Grid/qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h diff --git a/lib/qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h b/Grid/qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h similarity index 100% rename from lib/qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h rename to Grid/qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h diff --git a/lib/qcd/action/fermion/OverlapWilsonContfracTanhFermion.h b/Grid/qcd/action/fermion/OverlapWilsonContfracTanhFermion.h similarity index 100% rename from lib/qcd/action/fermion/OverlapWilsonContfracTanhFermion.h rename to Grid/qcd/action/fermion/OverlapWilsonContfracTanhFermion.h diff --git a/lib/qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h b/Grid/qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h similarity index 100% rename from lib/qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h rename to Grid/qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h diff --git a/lib/qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h b/Grid/qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h similarity index 100% rename from lib/qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h rename to Grid/qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h diff --git a/lib/qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h b/Grid/qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h similarity index 100% rename from lib/qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h rename to Grid/qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h diff --git a/lib/qcd/action/fermion/PartialFractionFermion5D.cc b/Grid/qcd/action/fermion/PartialFractionFermion5D.cc similarity index 100% rename from lib/qcd/action/fermion/PartialFractionFermion5D.cc rename to Grid/qcd/action/fermion/PartialFractionFermion5D.cc diff --git a/lib/qcd/action/fermion/PartialFractionFermion5D.h b/Grid/qcd/action/fermion/PartialFractionFermion5D.h similarity index 100% rename from lib/qcd/action/fermion/PartialFractionFermion5D.h rename to Grid/qcd/action/fermion/PartialFractionFermion5D.h diff --git a/lib/qcd/action/fermion/ScaledShamirFermion.h b/Grid/qcd/action/fermion/ScaledShamirFermion.h similarity index 100% rename from lib/qcd/action/fermion/ScaledShamirFermion.h rename to Grid/qcd/action/fermion/ScaledShamirFermion.h diff --git a/lib/qcd/action/fermion/SchurDiagTwoKappa.h b/Grid/qcd/action/fermion/SchurDiagTwoKappa.h similarity index 100% rename from lib/qcd/action/fermion/SchurDiagTwoKappa.h rename to Grid/qcd/action/fermion/SchurDiagTwoKappa.h diff --git a/lib/qcd/action/fermion/ShamirZolotarevFermion.h b/Grid/qcd/action/fermion/ShamirZolotarevFermion.h similarity index 100% rename from lib/qcd/action/fermion/ShamirZolotarevFermion.h rename to Grid/qcd/action/fermion/ShamirZolotarevFermion.h diff --git a/lib/qcd/action/fermion/StaggeredKernels.cc b/Grid/qcd/action/fermion/StaggeredKernels.cc similarity index 100% rename from lib/qcd/action/fermion/StaggeredKernels.cc rename to Grid/qcd/action/fermion/StaggeredKernels.cc diff --git a/lib/qcd/action/fermion/StaggeredKernels.h b/Grid/qcd/action/fermion/StaggeredKernels.h similarity index 100% rename from lib/qcd/action/fermion/StaggeredKernels.h rename to Grid/qcd/action/fermion/StaggeredKernels.h diff --git a/lib/qcd/action/fermion/StaggeredKernelsAsm.cc b/Grid/qcd/action/fermion/StaggeredKernelsAsm.cc similarity index 100% rename from lib/qcd/action/fermion/StaggeredKernelsAsm.cc rename to Grid/qcd/action/fermion/StaggeredKernelsAsm.cc diff --git a/lib/qcd/action/fermion/StaggeredKernelsHand.cc b/Grid/qcd/action/fermion/StaggeredKernelsHand.cc similarity index 100% rename from lib/qcd/action/fermion/StaggeredKernelsHand.cc rename to Grid/qcd/action/fermion/StaggeredKernelsHand.cc diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.cc b/Grid/qcd/action/fermion/WilsonCloverFermion.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonCloverFermion.cc rename to Grid/qcd/action/fermion/WilsonCloverFermion.cc diff --git a/lib/qcd/action/fermion/WilsonCloverFermion.h b/Grid/qcd/action/fermion/WilsonCloverFermion.h similarity index 100% rename from lib/qcd/action/fermion/WilsonCloverFermion.h rename to Grid/qcd/action/fermion/WilsonCloverFermion.h diff --git a/lib/qcd/action/fermion/WilsonCompressor.h b/Grid/qcd/action/fermion/WilsonCompressor.h similarity index 100% rename from lib/qcd/action/fermion/WilsonCompressor.h rename to Grid/qcd/action/fermion/WilsonCompressor.h diff --git a/lib/qcd/action/fermion/WilsonFermion.cc b/Grid/qcd/action/fermion/WilsonFermion.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonFermion.cc rename to Grid/qcd/action/fermion/WilsonFermion.cc diff --git a/lib/qcd/action/fermion/WilsonFermion.h b/Grid/qcd/action/fermion/WilsonFermion.h similarity index 100% rename from lib/qcd/action/fermion/WilsonFermion.h rename to Grid/qcd/action/fermion/WilsonFermion.h diff --git a/lib/qcd/action/fermion/WilsonFermion5D.cc b/Grid/qcd/action/fermion/WilsonFermion5D.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonFermion5D.cc rename to Grid/qcd/action/fermion/WilsonFermion5D.cc diff --git a/lib/qcd/action/fermion/WilsonFermion5D.h b/Grid/qcd/action/fermion/WilsonFermion5D.h similarity index 100% rename from lib/qcd/action/fermion/WilsonFermion5D.h rename to Grid/qcd/action/fermion/WilsonFermion5D.h diff --git a/lib/qcd/action/fermion/WilsonKernels.cc b/Grid/qcd/action/fermion/WilsonKernels.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonKernels.cc rename to Grid/qcd/action/fermion/WilsonKernels.cc diff --git a/lib/qcd/action/fermion/WilsonKernels.h b/Grid/qcd/action/fermion/WilsonKernels.h similarity index 100% rename from lib/qcd/action/fermion/WilsonKernels.h rename to Grid/qcd/action/fermion/WilsonKernels.h diff --git a/lib/qcd/action/fermion/WilsonKernelsAsm.cc b/Grid/qcd/action/fermion/WilsonKernelsAsm.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsAsm.cc rename to Grid/qcd/action/fermion/WilsonKernelsAsm.cc diff --git a/lib/qcd/action/fermion/WilsonKernelsAsmAvx512.h b/Grid/qcd/action/fermion/WilsonKernelsAsmAvx512.h similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsAsmAvx512.h rename to Grid/qcd/action/fermion/WilsonKernelsAsmAvx512.h diff --git a/lib/qcd/action/fermion/WilsonKernelsAsmBody.h b/Grid/qcd/action/fermion/WilsonKernelsAsmBody.h similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsAsmBody.h rename to Grid/qcd/action/fermion/WilsonKernelsAsmBody.h diff --git a/lib/qcd/action/fermion/WilsonKernelsAsmBody.h.ab b/Grid/qcd/action/fermion/WilsonKernelsAsmBody.h.ab similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsAsmBody.h.ab rename to Grid/qcd/action/fermion/WilsonKernelsAsmBody.h.ab diff --git a/lib/qcd/action/fermion/WilsonKernelsAsmBody.h.abc b/Grid/qcd/action/fermion/WilsonKernelsAsmBody.h.abc similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsAsmBody.h.abc rename to Grid/qcd/action/fermion/WilsonKernelsAsmBody.h.abc diff --git a/lib/qcd/action/fermion/WilsonKernelsAsmQPX.h b/Grid/qcd/action/fermion/WilsonKernelsAsmQPX.h similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsAsmQPX.h rename to Grid/qcd/action/fermion/WilsonKernelsAsmQPX.h diff --git a/lib/qcd/action/fermion/WilsonKernelsHand.cc b/Grid/qcd/action/fermion/WilsonKernelsHand.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsHand.cc rename to Grid/qcd/action/fermion/WilsonKernelsHand.cc diff --git a/lib/qcd/action/fermion/WilsonKernelsHandGparity.cc b/Grid/qcd/action/fermion/WilsonKernelsHandGparity.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonKernelsHandGparity.cc rename to Grid/qcd/action/fermion/WilsonKernelsHandGparity.cc diff --git a/lib/qcd/action/fermion/WilsonTMFermion.cc b/Grid/qcd/action/fermion/WilsonTMFermion.cc similarity index 100% rename from lib/qcd/action/fermion/WilsonTMFermion.cc rename to Grid/qcd/action/fermion/WilsonTMFermion.cc diff --git a/lib/qcd/action/fermion/WilsonTMFermion.h b/Grid/qcd/action/fermion/WilsonTMFermion.h similarity index 100% rename from lib/qcd/action/fermion/WilsonTMFermion.h rename to Grid/qcd/action/fermion/WilsonTMFermion.h diff --git a/lib/qcd/action/fermion/ZMobiusFermion.h b/Grid/qcd/action/fermion/ZMobiusFermion.h similarity index 100% rename from lib/qcd/action/fermion/ZMobiusFermion.h rename to Grid/qcd/action/fermion/ZMobiusFermion.h diff --git a/lib/qcd/action/fermion/g5HermitianLinop.h b/Grid/qcd/action/fermion/g5HermitianLinop.h similarity index 100% rename from lib/qcd/action/fermion/g5HermitianLinop.h rename to Grid/qcd/action/fermion/g5HermitianLinop.h diff --git a/lib/qcd/action/gauge/Gauge.h b/Grid/qcd/action/gauge/Gauge.h similarity index 100% rename from lib/qcd/action/gauge/Gauge.h rename to Grid/qcd/action/gauge/Gauge.h diff --git a/lib/qcd/action/gauge/GaugeImplTypes.h b/Grid/qcd/action/gauge/GaugeImplTypes.h similarity index 100% rename from lib/qcd/action/gauge/GaugeImplTypes.h rename to Grid/qcd/action/gauge/GaugeImplTypes.h diff --git a/lib/qcd/action/gauge/GaugeImplementations.h b/Grid/qcd/action/gauge/GaugeImplementations.h similarity index 100% rename from lib/qcd/action/gauge/GaugeImplementations.h rename to Grid/qcd/action/gauge/GaugeImplementations.h diff --git a/lib/qcd/action/gauge/Photon.h b/Grid/qcd/action/gauge/Photon.h similarity index 100% rename from lib/qcd/action/gauge/Photon.h rename to Grid/qcd/action/gauge/Photon.h diff --git a/lib/qcd/action/gauge/PlaqPlusRectangleAction.h b/Grid/qcd/action/gauge/PlaqPlusRectangleAction.h similarity index 100% rename from lib/qcd/action/gauge/PlaqPlusRectangleAction.h rename to Grid/qcd/action/gauge/PlaqPlusRectangleAction.h diff --git a/lib/qcd/action/gauge/WilsonGaugeAction.h b/Grid/qcd/action/gauge/WilsonGaugeAction.h similarity index 100% rename from lib/qcd/action/gauge/WilsonGaugeAction.h rename to Grid/qcd/action/gauge/WilsonGaugeAction.h diff --git a/lib/qcd/action/pseudofermion/EvenOddSchurDifferentiable.h b/Grid/qcd/action/pseudofermion/EvenOddSchurDifferentiable.h similarity index 100% rename from lib/qcd/action/pseudofermion/EvenOddSchurDifferentiable.h rename to Grid/qcd/action/pseudofermion/EvenOddSchurDifferentiable.h diff --git a/lib/qcd/action/pseudofermion/ExactOneFlavourRatio.h b/Grid/qcd/action/pseudofermion/ExactOneFlavourRatio.h similarity index 100% rename from lib/qcd/action/pseudofermion/ExactOneFlavourRatio.h rename to Grid/qcd/action/pseudofermion/ExactOneFlavourRatio.h diff --git a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h b/Grid/qcd/action/pseudofermion/OneFlavourEvenOddRational.h similarity index 100% rename from lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h rename to Grid/qcd/action/pseudofermion/OneFlavourEvenOddRational.h diff --git a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h b/Grid/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h similarity index 100% rename from lib/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h rename to Grid/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h diff --git a/lib/qcd/action/pseudofermion/OneFlavourRational.h b/Grid/qcd/action/pseudofermion/OneFlavourRational.h similarity index 100% rename from lib/qcd/action/pseudofermion/OneFlavourRational.h rename to Grid/qcd/action/pseudofermion/OneFlavourRational.h diff --git a/lib/qcd/action/pseudofermion/OneFlavourRationalRatio.h b/Grid/qcd/action/pseudofermion/OneFlavourRationalRatio.h similarity index 100% rename from lib/qcd/action/pseudofermion/OneFlavourRationalRatio.h rename to Grid/qcd/action/pseudofermion/OneFlavourRationalRatio.h diff --git a/lib/qcd/action/pseudofermion/PseudoFermion.h b/Grid/qcd/action/pseudofermion/PseudoFermion.h similarity index 100% rename from lib/qcd/action/pseudofermion/PseudoFermion.h rename to Grid/qcd/action/pseudofermion/PseudoFermion.h diff --git a/lib/qcd/action/pseudofermion/TwoFlavour.h b/Grid/qcd/action/pseudofermion/TwoFlavour.h similarity index 100% rename from lib/qcd/action/pseudofermion/TwoFlavour.h rename to Grid/qcd/action/pseudofermion/TwoFlavour.h diff --git a/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h b/Grid/qcd/action/pseudofermion/TwoFlavourEvenOdd.h similarity index 100% rename from lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h rename to Grid/qcd/action/pseudofermion/TwoFlavourEvenOdd.h diff --git a/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h b/Grid/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h similarity index 100% rename from lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h rename to Grid/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h diff --git a/lib/qcd/action/pseudofermion/TwoFlavourRatio.h b/Grid/qcd/action/pseudofermion/TwoFlavourRatio.h similarity index 100% rename from lib/qcd/action/pseudofermion/TwoFlavourRatio.h rename to Grid/qcd/action/pseudofermion/TwoFlavourRatio.h diff --git a/lib/qcd/action/scalar/Scalar.h b/Grid/qcd/action/scalar/Scalar.h similarity index 100% rename from lib/qcd/action/scalar/Scalar.h rename to Grid/qcd/action/scalar/Scalar.h diff --git a/lib/qcd/action/scalar/ScalarAction.h b/Grid/qcd/action/scalar/ScalarAction.h similarity index 100% rename from lib/qcd/action/scalar/ScalarAction.h rename to Grid/qcd/action/scalar/ScalarAction.h diff --git a/lib/qcd/action/scalar/ScalarImpl.h b/Grid/qcd/action/scalar/ScalarImpl.h similarity index 100% rename from lib/qcd/action/scalar/ScalarImpl.h rename to Grid/qcd/action/scalar/ScalarImpl.h diff --git a/lib/qcd/action/scalar/ScalarInteractionAction.h b/Grid/qcd/action/scalar/ScalarInteractionAction.h similarity index 100% rename from lib/qcd/action/scalar/ScalarInteractionAction.h rename to Grid/qcd/action/scalar/ScalarInteractionAction.h diff --git a/lib/qcd/hmc/GenericHMCrunner.h b/Grid/qcd/hmc/GenericHMCrunner.h similarity index 100% rename from lib/qcd/hmc/GenericHMCrunner.h rename to Grid/qcd/hmc/GenericHMCrunner.h diff --git a/lib/qcd/hmc/HMC.h b/Grid/qcd/hmc/HMC.h similarity index 100% rename from lib/qcd/hmc/HMC.h rename to Grid/qcd/hmc/HMC.h diff --git a/lib/qcd/hmc/HMCModules.h b/Grid/qcd/hmc/HMCModules.h similarity index 100% rename from lib/qcd/hmc/HMCModules.h rename to Grid/qcd/hmc/HMCModules.h diff --git a/lib/qcd/hmc/HMCResourceManager.h b/Grid/qcd/hmc/HMCResourceManager.h similarity index 100% rename from lib/qcd/hmc/HMCResourceManager.h rename to Grid/qcd/hmc/HMCResourceManager.h diff --git a/lib/qcd/hmc/HMCRunnerModule.h b/Grid/qcd/hmc/HMCRunnerModule.h similarity index 100% rename from lib/qcd/hmc/HMCRunnerModule.h rename to Grid/qcd/hmc/HMCRunnerModule.h diff --git a/lib/qcd/hmc/HMC_GridModules.h b/Grid/qcd/hmc/HMC_GridModules.h similarity index 100% rename from lib/qcd/hmc/HMC_GridModules.h rename to Grid/qcd/hmc/HMC_GridModules.h diff --git a/lib/qcd/hmc/HMC_aggregate.h b/Grid/qcd/hmc/HMC_aggregate.h similarity index 100% rename from lib/qcd/hmc/HMC_aggregate.h rename to Grid/qcd/hmc/HMC_aggregate.h diff --git a/lib/qcd/hmc/UsingHMC.md b/Grid/qcd/hmc/UsingHMC.md similarity index 100% rename from lib/qcd/hmc/UsingHMC.md rename to Grid/qcd/hmc/UsingHMC.md diff --git a/lib/qcd/hmc/checkpointers/BaseCheckpointer.h b/Grid/qcd/hmc/checkpointers/BaseCheckpointer.h similarity index 100% rename from lib/qcd/hmc/checkpointers/BaseCheckpointer.h rename to Grid/qcd/hmc/checkpointers/BaseCheckpointer.h diff --git a/lib/qcd/hmc/checkpointers/BinaryCheckpointer.h b/Grid/qcd/hmc/checkpointers/BinaryCheckpointer.h similarity index 100% rename from lib/qcd/hmc/checkpointers/BinaryCheckpointer.h rename to Grid/qcd/hmc/checkpointers/BinaryCheckpointer.h diff --git a/lib/qcd/hmc/checkpointers/CheckPointerModules.h b/Grid/qcd/hmc/checkpointers/CheckPointerModules.h similarity index 100% rename from lib/qcd/hmc/checkpointers/CheckPointerModules.h rename to Grid/qcd/hmc/checkpointers/CheckPointerModules.h diff --git a/lib/qcd/hmc/checkpointers/CheckPointers.h b/Grid/qcd/hmc/checkpointers/CheckPointers.h similarity index 100% rename from lib/qcd/hmc/checkpointers/CheckPointers.h rename to Grid/qcd/hmc/checkpointers/CheckPointers.h diff --git a/lib/qcd/hmc/checkpointers/ILDGCheckpointer.h b/Grid/qcd/hmc/checkpointers/ILDGCheckpointer.h similarity index 100% rename from lib/qcd/hmc/checkpointers/ILDGCheckpointer.h rename to Grid/qcd/hmc/checkpointers/ILDGCheckpointer.h diff --git a/lib/qcd/hmc/checkpointers/NerscCheckpointer.h b/Grid/qcd/hmc/checkpointers/NerscCheckpointer.h similarity index 100% rename from lib/qcd/hmc/checkpointers/NerscCheckpointer.h rename to Grid/qcd/hmc/checkpointers/NerscCheckpointer.h diff --git a/lib/qcd/hmc/checkpointers/ScidacCheckpointer.h b/Grid/qcd/hmc/checkpointers/ScidacCheckpointer.h similarity index 100% rename from lib/qcd/hmc/checkpointers/ScidacCheckpointer.h rename to Grid/qcd/hmc/checkpointers/ScidacCheckpointer.h diff --git a/lib/qcd/hmc/integrators/Integrator.h b/Grid/qcd/hmc/integrators/Integrator.h similarity index 100% rename from lib/qcd/hmc/integrators/Integrator.h rename to Grid/qcd/hmc/integrators/Integrator.h diff --git a/lib/qcd/hmc/integrators/Integrator_algorithm.h b/Grid/qcd/hmc/integrators/Integrator_algorithm.h similarity index 100% rename from lib/qcd/hmc/integrators/Integrator_algorithm.h rename to Grid/qcd/hmc/integrators/Integrator_algorithm.h diff --git a/lib/qcd/modules/ActionModules.h b/Grid/qcd/modules/ActionModules.h similarity index 100% rename from lib/qcd/modules/ActionModules.h rename to Grid/qcd/modules/ActionModules.h diff --git a/lib/qcd/modules/Factory.h b/Grid/qcd/modules/Factory.h similarity index 100% rename from lib/qcd/modules/Factory.h rename to Grid/qcd/modules/Factory.h diff --git a/lib/qcd/modules/FermionOperatorModules.h b/Grid/qcd/modules/FermionOperatorModules.h similarity index 100% rename from lib/qcd/modules/FermionOperatorModules.h rename to Grid/qcd/modules/FermionOperatorModules.h diff --git a/lib/qcd/modules/Modules.cc b/Grid/qcd/modules/Modules.cc similarity index 100% rename from lib/qcd/modules/Modules.cc rename to Grid/qcd/modules/Modules.cc diff --git a/lib/qcd/modules/Modules.h b/Grid/qcd/modules/Modules.h similarity index 100% rename from lib/qcd/modules/Modules.h rename to Grid/qcd/modules/Modules.h diff --git a/lib/qcd/modules/ObservableModules.h b/Grid/qcd/modules/ObservableModules.h similarity index 100% rename from lib/qcd/modules/ObservableModules.h rename to Grid/qcd/modules/ObservableModules.h diff --git a/lib/qcd/modules/Registration.h b/Grid/qcd/modules/Registration.h similarity index 100% rename from lib/qcd/modules/Registration.h rename to Grid/qcd/modules/Registration.h diff --git a/lib/qcd/modules/SolverModules.h b/Grid/qcd/modules/SolverModules.h similarity index 100% rename from lib/qcd/modules/SolverModules.h rename to Grid/qcd/modules/SolverModules.h diff --git a/lib/qcd/modules/mods.h b/Grid/qcd/modules/mods.h similarity index 100% rename from lib/qcd/modules/mods.h rename to Grid/qcd/modules/mods.h diff --git a/lib/qcd/observables/hmc_observable.h b/Grid/qcd/observables/hmc_observable.h similarity index 100% rename from lib/qcd/observables/hmc_observable.h rename to Grid/qcd/observables/hmc_observable.h diff --git a/lib/qcd/observables/plaquette.h b/Grid/qcd/observables/plaquette.h similarity index 100% rename from lib/qcd/observables/plaquette.h rename to Grid/qcd/observables/plaquette.h diff --git a/lib/qcd/observables/polyakov_loop.h b/Grid/qcd/observables/polyakov_loop.h similarity index 100% rename from lib/qcd/observables/polyakov_loop.h rename to Grid/qcd/observables/polyakov_loop.h diff --git a/lib/qcd/observables/topological_charge.h b/Grid/qcd/observables/topological_charge.h similarity index 100% rename from lib/qcd/observables/topological_charge.h rename to Grid/qcd/observables/topological_charge.h diff --git a/lib/qcd/representations/Representations.h b/Grid/qcd/representations/Representations.h similarity index 100% rename from lib/qcd/representations/Representations.h rename to Grid/qcd/representations/Representations.h diff --git a/lib/qcd/representations/adjoint.h b/Grid/qcd/representations/adjoint.h similarity index 100% rename from lib/qcd/representations/adjoint.h rename to Grid/qcd/representations/adjoint.h diff --git a/lib/qcd/representations/fundamental.h b/Grid/qcd/representations/fundamental.h similarity index 100% rename from lib/qcd/representations/fundamental.h rename to Grid/qcd/representations/fundamental.h diff --git a/lib/qcd/representations/hmc_types.h b/Grid/qcd/representations/hmc_types.h similarity index 100% rename from lib/qcd/representations/hmc_types.h rename to Grid/qcd/representations/hmc_types.h diff --git a/lib/qcd/representations/two_index.h b/Grid/qcd/representations/two_index.h similarity index 100% rename from lib/qcd/representations/two_index.h rename to Grid/qcd/representations/two_index.h diff --git a/lib/qcd/smearing/APEsmearing.h b/Grid/qcd/smearing/APEsmearing.h similarity index 100% rename from lib/qcd/smearing/APEsmearing.h rename to Grid/qcd/smearing/APEsmearing.h diff --git a/lib/qcd/smearing/BaseSmearing.h b/Grid/qcd/smearing/BaseSmearing.h similarity index 100% rename from lib/qcd/smearing/BaseSmearing.h rename to Grid/qcd/smearing/BaseSmearing.h diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/Grid/qcd/smearing/GaugeConfiguration.h similarity index 100% rename from lib/qcd/smearing/GaugeConfiguration.h rename to Grid/qcd/smearing/GaugeConfiguration.h diff --git a/lib/qcd/smearing/Smearing.h b/Grid/qcd/smearing/Smearing.h similarity index 100% rename from lib/qcd/smearing/Smearing.h rename to Grid/qcd/smearing/Smearing.h diff --git a/lib/qcd/smearing/StoutSmearing.h b/Grid/qcd/smearing/StoutSmearing.h similarity index 100% rename from lib/qcd/smearing/StoutSmearing.h rename to Grid/qcd/smearing/StoutSmearing.h diff --git a/lib/qcd/smearing/WilsonFlow.h b/Grid/qcd/smearing/WilsonFlow.h similarity index 100% rename from lib/qcd/smearing/WilsonFlow.h rename to Grid/qcd/smearing/WilsonFlow.h diff --git a/lib/qcd/spin/Dirac.h b/Grid/qcd/spin/Dirac.h similarity index 100% rename from lib/qcd/spin/Dirac.h rename to Grid/qcd/spin/Dirac.h diff --git a/lib/qcd/spin/Gamma.cc b/Grid/qcd/spin/Gamma.cc similarity index 100% rename from lib/qcd/spin/Gamma.cc rename to Grid/qcd/spin/Gamma.cc diff --git a/lib/qcd/spin/Gamma.h b/Grid/qcd/spin/Gamma.h similarity index 100% rename from lib/qcd/spin/Gamma.h rename to Grid/qcd/spin/Gamma.h diff --git a/lib/qcd/spin/Spin.h b/Grid/qcd/spin/Spin.h similarity index 100% rename from lib/qcd/spin/Spin.h rename to Grid/qcd/spin/Spin.h diff --git a/lib/qcd/spin/TwoSpinor.h b/Grid/qcd/spin/TwoSpinor.h similarity index 100% rename from lib/qcd/spin/TwoSpinor.h rename to Grid/qcd/spin/TwoSpinor.h diff --git a/lib/qcd/spin/gamma-gen/gamma-gen.nb b/Grid/qcd/spin/gamma-gen/gamma-gen.nb similarity index 100% rename from lib/qcd/spin/gamma-gen/gamma-gen.nb rename to Grid/qcd/spin/gamma-gen/gamma-gen.nb diff --git a/lib/qcd/utils/CovariantCshift.h b/Grid/qcd/utils/CovariantCshift.h similarity index 100% rename from lib/qcd/utils/CovariantCshift.h rename to Grid/qcd/utils/CovariantCshift.h diff --git a/lib/qcd/utils/CovariantLaplacian.h b/Grid/qcd/utils/CovariantLaplacian.h similarity index 100% rename from lib/qcd/utils/CovariantLaplacian.h rename to Grid/qcd/utils/CovariantLaplacian.h diff --git a/lib/qcd/utils/GaugeFix.h b/Grid/qcd/utils/GaugeFix.h similarity index 100% rename from lib/qcd/utils/GaugeFix.h rename to Grid/qcd/utils/GaugeFix.h diff --git a/lib/qcd/utils/LinalgUtils.h b/Grid/qcd/utils/LinalgUtils.h similarity index 100% rename from lib/qcd/utils/LinalgUtils.h rename to Grid/qcd/utils/LinalgUtils.h diff --git a/lib/qcd/utils/Metric.h b/Grid/qcd/utils/Metric.h similarity index 100% rename from lib/qcd/utils/Metric.h rename to Grid/qcd/utils/Metric.h diff --git a/lib/qcd/utils/SUn.h b/Grid/qcd/utils/SUn.h similarity index 100% rename from lib/qcd/utils/SUn.h rename to Grid/qcd/utils/SUn.h diff --git a/lib/qcd/utils/SUnAdjoint.h b/Grid/qcd/utils/SUnAdjoint.h similarity index 100% rename from lib/qcd/utils/SUnAdjoint.h rename to Grid/qcd/utils/SUnAdjoint.h diff --git a/lib/qcd/utils/SUnTwoIndex.h b/Grid/qcd/utils/SUnTwoIndex.h similarity index 100% rename from lib/qcd/utils/SUnTwoIndex.h rename to Grid/qcd/utils/SUnTwoIndex.h diff --git a/lib/qcd/utils/ScalarObjs.h b/Grid/qcd/utils/ScalarObjs.h similarity index 100% rename from lib/qcd/utils/ScalarObjs.h rename to Grid/qcd/utils/ScalarObjs.h diff --git a/lib/qcd/utils/SpaceTimeGrid.cc b/Grid/qcd/utils/SpaceTimeGrid.cc similarity index 100% rename from lib/qcd/utils/SpaceTimeGrid.cc rename to Grid/qcd/utils/SpaceTimeGrid.cc diff --git a/lib/qcd/utils/SpaceTimeGrid.h b/Grid/qcd/utils/SpaceTimeGrid.h similarity index 100% rename from lib/qcd/utils/SpaceTimeGrid.h rename to Grid/qcd/utils/SpaceTimeGrid.h diff --git a/lib/qcd/utils/Utils.h b/Grid/qcd/utils/Utils.h similarity index 100% rename from lib/qcd/utils/Utils.h rename to Grid/qcd/utils/Utils.h diff --git a/lib/qcd/utils/WilsonLoops.h b/Grid/qcd/utils/WilsonLoops.h similarity index 100% rename from lib/qcd/utils/WilsonLoops.h rename to Grid/qcd/utils/WilsonLoops.h diff --git a/lib/serialisation/BaseIO.h b/Grid/serialisation/BaseIO.h similarity index 100% rename from lib/serialisation/BaseIO.h rename to Grid/serialisation/BaseIO.h diff --git a/lib/serialisation/BinaryIO.cc b/Grid/serialisation/BinaryIO.cc similarity index 100% rename from lib/serialisation/BinaryIO.cc rename to Grid/serialisation/BinaryIO.cc diff --git a/lib/serialisation/BinaryIO.h b/Grid/serialisation/BinaryIO.h similarity index 100% rename from lib/serialisation/BinaryIO.h rename to Grid/serialisation/BinaryIO.h diff --git a/lib/serialisation/Hdf5IO.cc b/Grid/serialisation/Hdf5IO.cc similarity index 100% rename from lib/serialisation/Hdf5IO.cc rename to Grid/serialisation/Hdf5IO.cc diff --git a/lib/serialisation/Hdf5IO.h b/Grid/serialisation/Hdf5IO.h similarity index 100% rename from lib/serialisation/Hdf5IO.h rename to Grid/serialisation/Hdf5IO.h diff --git a/lib/serialisation/Hdf5Type.h b/Grid/serialisation/Hdf5Type.h similarity index 100% rename from lib/serialisation/Hdf5Type.h rename to Grid/serialisation/Hdf5Type.h diff --git a/lib/serialisation/JSON_IO.cc b/Grid/serialisation/JSON_IO.cc similarity index 100% rename from lib/serialisation/JSON_IO.cc rename to Grid/serialisation/JSON_IO.cc diff --git a/lib/serialisation/JSON_IO.h b/Grid/serialisation/JSON_IO.h similarity index 100% rename from lib/serialisation/JSON_IO.h rename to Grid/serialisation/JSON_IO.h diff --git a/lib/serialisation/MacroMagic.h b/Grid/serialisation/MacroMagic.h similarity index 100% rename from lib/serialisation/MacroMagic.h rename to Grid/serialisation/MacroMagic.h diff --git a/lib/serialisation/Serialisation.h b/Grid/serialisation/Serialisation.h similarity index 100% rename from lib/serialisation/Serialisation.h rename to Grid/serialisation/Serialisation.h diff --git a/lib/serialisation/TextIO.cc b/Grid/serialisation/TextIO.cc similarity index 100% rename from lib/serialisation/TextIO.cc rename to Grid/serialisation/TextIO.cc diff --git a/lib/serialisation/TextIO.h b/Grid/serialisation/TextIO.h similarity index 100% rename from lib/serialisation/TextIO.h rename to Grid/serialisation/TextIO.h diff --git a/lib/serialisation/VectorUtils.h b/Grid/serialisation/VectorUtils.h similarity index 100% rename from lib/serialisation/VectorUtils.h rename to Grid/serialisation/VectorUtils.h diff --git a/lib/serialisation/XmlIO.cc b/Grid/serialisation/XmlIO.cc similarity index 100% rename from lib/serialisation/XmlIO.cc rename to Grid/serialisation/XmlIO.cc diff --git a/lib/serialisation/XmlIO.h b/Grid/serialisation/XmlIO.h similarity index 100% rename from lib/serialisation/XmlIO.h rename to Grid/serialisation/XmlIO.h diff --git a/lib/simd/BGQQPX.h b/Grid/simd/BGQQPX.h similarity index 100% rename from lib/simd/BGQQPX.h rename to Grid/simd/BGQQPX.h diff --git a/lib/simd/Grid_avx.h b/Grid/simd/Grid_avx.h similarity index 100% rename from lib/simd/Grid_avx.h rename to Grid/simd/Grid_avx.h diff --git a/lib/simd/Grid_avx512.h b/Grid/simd/Grid_avx512.h similarity index 100% rename from lib/simd/Grid_avx512.h rename to Grid/simd/Grid_avx512.h diff --git a/lib/simd/Grid_generic.h b/Grid/simd/Grid_generic.h similarity index 100% rename from lib/simd/Grid_generic.h rename to Grid/simd/Grid_generic.h diff --git a/lib/simd/Grid_generic_types.h b/Grid/simd/Grid_generic_types.h similarity index 100% rename from lib/simd/Grid_generic_types.h rename to Grid/simd/Grid_generic_types.h diff --git a/lib/simd/Grid_imci.h b/Grid/simd/Grid_imci.h similarity index 100% rename from lib/simd/Grid_imci.h rename to Grid/simd/Grid_imci.h diff --git a/lib/simd/Grid_neon.h b/Grid/simd/Grid_neon.h similarity index 100% rename from lib/simd/Grid_neon.h rename to Grid/simd/Grid_neon.h diff --git a/lib/simd/Grid_qpx.h b/Grid/simd/Grid_qpx.h similarity index 100% rename from lib/simd/Grid_qpx.h rename to Grid/simd/Grid_qpx.h diff --git a/lib/simd/Grid_sse4.h b/Grid/simd/Grid_sse4.h similarity index 100% rename from lib/simd/Grid_sse4.h rename to Grid/simd/Grid_sse4.h diff --git a/lib/simd/Grid_vector_types.h b/Grid/simd/Grid_vector_types.h similarity index 100% rename from lib/simd/Grid_vector_types.h rename to Grid/simd/Grid_vector_types.h diff --git a/lib/simd/Grid_vector_unops.h b/Grid/simd/Grid_vector_unops.h similarity index 100% rename from lib/simd/Grid_vector_unops.h rename to Grid/simd/Grid_vector_unops.h diff --git a/lib/simd/IBM_qpx.h b/Grid/simd/IBM_qpx.h similarity index 100% rename from lib/simd/IBM_qpx.h rename to Grid/simd/IBM_qpx.h diff --git a/lib/simd/IBM_qpx_double.h b/Grid/simd/IBM_qpx_double.h similarity index 100% rename from lib/simd/IBM_qpx_double.h rename to Grid/simd/IBM_qpx_double.h diff --git a/lib/simd/IBM_qpx_single.h b/Grid/simd/IBM_qpx_single.h similarity index 100% rename from lib/simd/IBM_qpx_single.h rename to Grid/simd/IBM_qpx_single.h diff --git a/lib/simd/Intel512avx.h b/Grid/simd/Intel512avx.h similarity index 100% rename from lib/simd/Intel512avx.h rename to Grid/simd/Intel512avx.h diff --git a/lib/simd/Intel512common.h b/Grid/simd/Intel512common.h similarity index 100% rename from lib/simd/Intel512common.h rename to Grid/simd/Intel512common.h diff --git a/lib/simd/Intel512double.h b/Grid/simd/Intel512double.h similarity index 100% rename from lib/simd/Intel512double.h rename to Grid/simd/Intel512double.h diff --git a/lib/simd/Intel512imci.h b/Grid/simd/Intel512imci.h similarity index 100% rename from lib/simd/Intel512imci.h rename to Grid/simd/Intel512imci.h diff --git a/lib/simd/Intel512single.h b/Grid/simd/Intel512single.h similarity index 100% rename from lib/simd/Intel512single.h rename to Grid/simd/Intel512single.h diff --git a/lib/simd/Intel512wilson.h b/Grid/simd/Intel512wilson.h similarity index 100% rename from lib/simd/Intel512wilson.h rename to Grid/simd/Intel512wilson.h diff --git a/lib/simd/Simd.h b/Grid/simd/Simd.h similarity index 100% rename from lib/simd/Simd.h rename to Grid/simd/Simd.h diff --git a/lib/simd/l1p.h b/Grid/simd/l1p.h similarity index 100% rename from lib/simd/l1p.h rename to Grid/simd/l1p.h diff --git a/lib/sitmo_rng/README b/Grid/sitmo_rng/README similarity index 100% rename from lib/sitmo_rng/README rename to Grid/sitmo_rng/README diff --git a/lib/sitmo_rng/sitmo_prng_engine.hpp b/Grid/sitmo_rng/sitmo_prng_engine.hpp similarity index 100% rename from lib/sitmo_rng/sitmo_prng_engine.hpp rename to Grid/sitmo_rng/sitmo_prng_engine.hpp diff --git a/lib/stencil/Lebesgue.cc b/Grid/stencil/Lebesgue.cc similarity index 100% rename from lib/stencil/Lebesgue.cc rename to Grid/stencil/Lebesgue.cc diff --git a/lib/stencil/Lebesgue.h b/Grid/stencil/Lebesgue.h similarity index 100% rename from lib/stencil/Lebesgue.h rename to Grid/stencil/Lebesgue.h diff --git a/lib/stencil/SimpleCompressor.h b/Grid/stencil/SimpleCompressor.h similarity index 100% rename from lib/stencil/SimpleCompressor.h rename to Grid/stencil/SimpleCompressor.h diff --git a/lib/stencil/Stencil.cc b/Grid/stencil/Stencil.cc similarity index 100% rename from lib/stencil/Stencil.cc rename to Grid/stencil/Stencil.cc diff --git a/lib/stencil/Stencil.h b/Grid/stencil/Stencil.h similarity index 100% rename from lib/stencil/Stencil.h rename to Grid/stencil/Stencil.h diff --git a/lib/tensors/Tensor_Ta.h b/Grid/tensors/Tensor_Ta.h similarity index 100% rename from lib/tensors/Tensor_Ta.h rename to Grid/tensors/Tensor_Ta.h diff --git a/lib/tensors/Tensor_arith.h b/Grid/tensors/Tensor_arith.h similarity index 100% rename from lib/tensors/Tensor_arith.h rename to Grid/tensors/Tensor_arith.h diff --git a/lib/tensors/Tensor_arith_add.h b/Grid/tensors/Tensor_arith_add.h similarity index 100% rename from lib/tensors/Tensor_arith_add.h rename to Grid/tensors/Tensor_arith_add.h diff --git a/lib/tensors/Tensor_arith_mac.h b/Grid/tensors/Tensor_arith_mac.h similarity index 100% rename from lib/tensors/Tensor_arith_mac.h rename to Grid/tensors/Tensor_arith_mac.h diff --git a/lib/tensors/Tensor_arith_mul.h b/Grid/tensors/Tensor_arith_mul.h similarity index 100% rename from lib/tensors/Tensor_arith_mul.h rename to Grid/tensors/Tensor_arith_mul.h diff --git a/lib/tensors/Tensor_arith_scalar.h b/Grid/tensors/Tensor_arith_scalar.h similarity index 100% rename from lib/tensors/Tensor_arith_scalar.h rename to Grid/tensors/Tensor_arith_scalar.h diff --git a/lib/tensors/Tensor_arith_sub.h b/Grid/tensors/Tensor_arith_sub.h similarity index 100% rename from lib/tensors/Tensor_arith_sub.h rename to Grid/tensors/Tensor_arith_sub.h diff --git a/lib/tensors/Tensor_class.h b/Grid/tensors/Tensor_class.h similarity index 100% rename from lib/tensors/Tensor_class.h rename to Grid/tensors/Tensor_class.h diff --git a/lib/tensors/Tensor_determinant.h b/Grid/tensors/Tensor_determinant.h similarity index 100% rename from lib/tensors/Tensor_determinant.h rename to Grid/tensors/Tensor_determinant.h diff --git a/lib/tensors/Tensor_exp.h b/Grid/tensors/Tensor_exp.h similarity index 100% rename from lib/tensors/Tensor_exp.h rename to Grid/tensors/Tensor_exp.h diff --git a/lib/tensors/Tensor_extract_merge.h b/Grid/tensors/Tensor_extract_merge.h similarity index 100% rename from lib/tensors/Tensor_extract_merge.h rename to Grid/tensors/Tensor_extract_merge.h diff --git a/lib/tensors/Tensor_index.h b/Grid/tensors/Tensor_index.h similarity index 100% rename from lib/tensors/Tensor_index.h rename to Grid/tensors/Tensor_index.h diff --git a/lib/tensors/Tensor_inner.h b/Grid/tensors/Tensor_inner.h similarity index 100% rename from lib/tensors/Tensor_inner.h rename to Grid/tensors/Tensor_inner.h diff --git a/lib/tensors/Tensor_logical.h b/Grid/tensors/Tensor_logical.h similarity index 100% rename from lib/tensors/Tensor_logical.h rename to Grid/tensors/Tensor_logical.h diff --git a/lib/tensors/Tensor_outer.h b/Grid/tensors/Tensor_outer.h similarity index 100% rename from lib/tensors/Tensor_outer.h rename to Grid/tensors/Tensor_outer.h diff --git a/lib/tensors/Tensor_reality.h b/Grid/tensors/Tensor_reality.h similarity index 100% rename from lib/tensors/Tensor_reality.h rename to Grid/tensors/Tensor_reality.h diff --git a/lib/tensors/Tensor_trace.h b/Grid/tensors/Tensor_trace.h similarity index 100% rename from lib/tensors/Tensor_trace.h rename to Grid/tensors/Tensor_trace.h diff --git a/lib/tensors/Tensor_traits.h b/Grid/tensors/Tensor_traits.h similarity index 100% rename from lib/tensors/Tensor_traits.h rename to Grid/tensors/Tensor_traits.h diff --git a/lib/tensors/Tensor_transpose.h b/Grid/tensors/Tensor_transpose.h similarity index 100% rename from lib/tensors/Tensor_transpose.h rename to Grid/tensors/Tensor_transpose.h diff --git a/lib/tensors/Tensor_unary.h b/Grid/tensors/Tensor_unary.h similarity index 100% rename from lib/tensors/Tensor_unary.h rename to Grid/tensors/Tensor_unary.h diff --git a/lib/tensors/Tensors.h b/Grid/tensors/Tensors.h similarity index 100% rename from lib/tensors/Tensors.h rename to Grid/tensors/Tensors.h diff --git a/lib/threads/Threads.h b/Grid/threads/Threads.h similarity index 100% rename from lib/threads/Threads.h rename to Grid/threads/Threads.h diff --git a/lib/util/CompilerCompatible.h b/Grid/util/CompilerCompatible.h similarity index 100% rename from lib/util/CompilerCompatible.h rename to Grid/util/CompilerCompatible.h diff --git a/lib/util/Init.cc b/Grid/util/Init.cc similarity index 100% rename from lib/util/Init.cc rename to Grid/util/Init.cc diff --git a/lib/util/Init.h b/Grid/util/Init.h similarity index 100% rename from lib/util/Init.h rename to Grid/util/Init.h diff --git a/lib/util/Lexicographic.h b/Grid/util/Lexicographic.h similarity index 100% rename from lib/util/Lexicographic.h rename to Grid/util/Lexicographic.h diff --git a/lib/util/Profiling.h b/Grid/util/Profiling.h similarity index 100% rename from lib/util/Profiling.h rename to Grid/util/Profiling.h diff --git a/lib/util/Sha.h b/Grid/util/Sha.h similarity index 100% rename from lib/util/Sha.h rename to Grid/util/Sha.h diff --git a/lib/util/Util.h b/Grid/util/Util.h similarity index 100% rename from lib/util/Util.h rename to Grid/util/Util.h diff --git a/lib/util/version.cc b/Grid/util/version.cc similarity index 100% rename from lib/util/version.cc rename to Grid/util/version.cc diff --git a/Grid/version.h b/Grid/version.h new file mode 100644 index 00000000..ca8d9007 --- /dev/null +++ b/Grid/version.h @@ -0,0 +1 @@ +#define GITHASH "5f206df775c54dc2b863bacb5ade177ee58032a8: (HEAD -> feature/hadrons, gh/feature/hadrons, cliath/feature/hadrons) uncommited changes" diff --git a/extras/Hadrons/A2AVectors.hpp b/Hadrons/A2AVectors.hpp similarity index 98% rename from extras/Hadrons/A2AVectors.hpp rename to Hadrons/A2AVectors.hpp index 6e865203..002cd271 100644 --- a/extras/Hadrons/A2AVectors.hpp +++ b/Hadrons/A2AVectors.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef A2A_Vectors_hpp_ #define A2A_Vectors_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Application.cc b/Hadrons/Application.cc similarity index 98% rename from extras/Hadrons/Application.cc rename to Hadrons/Application.cc index 17e833dd..12fae13e 100644 --- a/extras/Hadrons/Application.cc +++ b/Hadrons/Application.cc @@ -26,9 +26,9 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include -#include -#include +#include +#include +#include using namespace Grid; using namespace QCD; diff --git a/extras/Hadrons/Application.hpp b/Hadrons/Application.hpp similarity index 97% rename from extras/Hadrons/Application.hpp rename to Hadrons/Application.hpp index 82307d62..e942c21c 100644 --- a/extras/Hadrons/Application.hpp +++ b/Hadrons/Application.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_Application_hpp_ #define Hadrons_Application_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/DilutedNoise.hpp b/Hadrons/DilutedNoise.hpp similarity index 99% rename from extras/Hadrons/DilutedNoise.hpp rename to Hadrons/DilutedNoise.hpp index 250f8445..c6ab71bc 100644 --- a/extras/Hadrons/DilutedNoise.hpp +++ b/Hadrons/DilutedNoise.hpp @@ -28,7 +28,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_DilutedNoise_hpp_ #define Hadrons_DilutedNoise_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/EigenPack.hpp b/Hadrons/EigenPack.hpp similarity index 99% rename from extras/Hadrons/EigenPack.hpp rename to Hadrons/EigenPack.hpp index d19e7728..a6d4bcf6 100644 --- a/extras/Hadrons/EigenPack.hpp +++ b/Hadrons/EigenPack.hpp @@ -28,7 +28,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_EigenPack_hpp_ #define Hadrons_EigenPack_hpp_ -#include +#include #include #include diff --git a/extras/Hadrons/Environment.cc b/Hadrons/Environment.cc similarity index 98% rename from extras/Hadrons/Environment.cc rename to Hadrons/Environment.cc index ced61ce4..b2d8cf1a 100644 --- a/extras/Hadrons/Environment.cc +++ b/Hadrons/Environment.cc @@ -26,9 +26,9 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include -#include -#include +#include +#include +#include using namespace Grid; using namespace QCD; diff --git a/extras/Hadrons/Environment.hpp b/Hadrons/Environment.hpp similarity index 99% rename from extras/Hadrons/Environment.hpp rename to Hadrons/Environment.hpp index c277b3db..32e6f05a 100644 --- a/extras/Hadrons/Environment.hpp +++ b/Hadrons/Environment.hpp @@ -29,7 +29,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_Environment_hpp_ #define Hadrons_Environment_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Exceptions.cc b/Hadrons/Exceptions.cc similarity index 96% rename from extras/Hadrons/Exceptions.cc rename to Hadrons/Exceptions.cc index c44f4cd0..1ba6e7d1 100644 --- a/extras/Hadrons/Exceptions.cc +++ b/Hadrons/Exceptions.cc @@ -26,9 +26,9 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include -#include -#include +#include +#include +#include #ifndef ERR_SUFF #define ERR_SUFF " (" + loc + ")" diff --git a/extras/Hadrons/Exceptions.hpp b/Hadrons/Exceptions.hpp similarity index 99% rename from extras/Hadrons/Exceptions.hpp rename to Hadrons/Exceptions.hpp index e6a7aea8..897997cb 100644 --- a/extras/Hadrons/Exceptions.hpp +++ b/Hadrons/Exceptions.hpp @@ -32,7 +32,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #ifndef Hadrons_Global_hpp_ -#include +#include #endif #define HADRONS_SRC_LOC std::string(__FUNCTION__) + " at " \ diff --git a/extras/Hadrons/Factory.hpp b/Hadrons/Factory.hpp similarity index 98% rename from extras/Hadrons/Factory.hpp rename to Hadrons/Factory.hpp index 07516640..08617402 100644 --- a/extras/Hadrons/Factory.hpp +++ b/Hadrons/Factory.hpp @@ -29,7 +29,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_Factory_hpp_ #define Hadrons_Factory_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/GeneticScheduler.hpp b/Hadrons/GeneticScheduler.hpp similarity index 99% rename from extras/Hadrons/GeneticScheduler.hpp rename to Hadrons/GeneticScheduler.hpp index 83666402..b58648f9 100644 --- a/extras/Hadrons/GeneticScheduler.hpp +++ b/Hadrons/GeneticScheduler.hpp @@ -29,8 +29,8 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_GeneticScheduler_hpp_ #define Hadrons_GeneticScheduler_hpp_ -#include -#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Global.cc b/Hadrons/Global.cc similarity index 99% rename from extras/Hadrons/Global.cc rename to Hadrons/Global.cc index 1e747cda..df3b1a31 100644 --- a/extras/Hadrons/Global.cc +++ b/Hadrons/Global.cc @@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace QCD; diff --git a/extras/Hadrons/Global.hpp b/Hadrons/Global.hpp similarity index 99% rename from extras/Hadrons/Global.hpp rename to Hadrons/Global.hpp index e1e29e43..7a5df1ba 100644 --- a/extras/Hadrons/Global.hpp +++ b/Hadrons/Global.hpp @@ -219,6 +219,6 @@ void printTimeProfile(const std::map &timing, GridTime to END_HADRONS_NAMESPACE -#include +#include #endif // Hadrons_Global_hpp_ diff --git a/extras/Hadrons/Graph.hpp b/Hadrons/Graph.hpp similarity index 99% rename from extras/Hadrons/Graph.hpp rename to Hadrons/Graph.hpp index ad84e7e0..6f4a9e4a 100644 --- a/extras/Hadrons/Graph.hpp +++ b/Hadrons/Graph.hpp @@ -29,7 +29,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_Graph_hpp_ #define Hadrons_Graph_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/HadronsXmlRun.cc b/Hadrons/HadronsXmlRun.cc similarity index 98% rename from extras/Hadrons/HadronsXmlRun.cc rename to Hadrons/HadronsXmlRun.cc index 6b613bb4..0b62bdd1 100644 --- a/extras/Hadrons/HadronsXmlRun.cc +++ b/Hadrons/HadronsXmlRun.cc @@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace QCD; diff --git a/extras/Hadrons/Makefile.am b/Hadrons/Makefile.am similarity index 94% rename from extras/Hadrons/Makefile.am rename to Hadrons/Makefile.am index 840c6fb5..93251dca 100644 --- a/extras/Hadrons/Makefile.am +++ b/Hadrons/Makefile.am @@ -11,7 +11,7 @@ libHadrons_a_SOURCES = \ Global.cc \ Module.cc \ VirtualMachine.cc -libHadrons_adir = $(pkgincludedir)/Hadrons +libHadrons_adir = $(includedir)/Hadrons nobase_libHadrons_a_HEADERS = \ $(modules_hpp) \ A2AVectors.hpp \ diff --git a/extras/Hadrons/Module.cc b/Hadrons/Module.cc similarity index 99% rename from extras/Hadrons/Module.cc rename to Hadrons/Module.cc index 8e915f6b..7bb0e862 100644 --- a/extras/Hadrons/Module.cc +++ b/Hadrons/Module.cc @@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace QCD; diff --git a/extras/Hadrons/Module.hpp b/Hadrons/Module.hpp similarity index 99% rename from extras/Hadrons/Module.hpp rename to Hadrons/Module.hpp index 02a20e5f..f374d231 100644 --- a/extras/Hadrons/Module.hpp +++ b/Hadrons/Module.hpp @@ -29,8 +29,8 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_Module_hpp_ #define Hadrons_Module_hpp_ -#include -#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/ModuleFactory.hpp b/Hadrons/ModuleFactory.hpp similarity index 93% rename from extras/Hadrons/ModuleFactory.hpp rename to Hadrons/ModuleFactory.hpp index d5c703fa..8fca06c3 100644 --- a/extras/Hadrons/ModuleFactory.hpp +++ b/Hadrons/ModuleFactory.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_ModuleFactory_hpp_ #define Hadrons_ModuleFactory_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/Hadrons/Modules.hpp b/Hadrons/Modules.hpp new file mode 100644 index 00000000..7725e8c2 --- /dev/null +++ b/Hadrons/Modules.hpp @@ -0,0 +1,96 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Guido Cossu +Author: James Harrison +Author: Lanny91 +Author: Peter Boyle +Author: Vera Guelpers +Author: fionnoh +Author: pretidav + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/extras/Hadrons/Modules/MAction/DWF.cc b/Hadrons/Modules/MAction/DWF.cc similarity index 96% rename from extras/Hadrons/Modules/MAction/DWF.cc rename to Hadrons/Modules/MAction/DWF.cc index ae518018..df720013 100644 --- a/extras/Hadrons/Modules/MAction/DWF.cc +++ b/Hadrons/Modules/MAction/DWF.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MAction/DWF.hpp b/Hadrons/Modules/MAction/DWF.hpp similarity index 97% rename from extras/Hadrons/Modules/MAction/DWF.hpp rename to Hadrons/Modules/MAction/DWF.hpp index 94a05cc8..093dd1a6 100644 --- a/extras/Hadrons/Modules/MAction/DWF.hpp +++ b/Hadrons/Modules/MAction/DWF.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MAction_DWF_hpp_ #define Hadrons_MAction_DWF_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MAction/MobiusDWF.cc b/Hadrons/Modules/MAction/MobiusDWF.cc similarity index 95% rename from extras/Hadrons/Modules/MAction/MobiusDWF.cc rename to Hadrons/Modules/MAction/MobiusDWF.cc index 9cc4755a..6efbfdb2 100644 --- a/extras/Hadrons/Modules/MAction/MobiusDWF.cc +++ b/Hadrons/Modules/MAction/MobiusDWF.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MAction/MobiusDWF.hpp b/Hadrons/Modules/MAction/MobiusDWF.hpp similarity index 97% rename from extras/Hadrons/Modules/MAction/MobiusDWF.hpp rename to Hadrons/Modules/MAction/MobiusDWF.hpp index 9cead7bd..7f96b9ca 100644 --- a/extras/Hadrons/Modules/MAction/MobiusDWF.hpp +++ b/Hadrons/Modules/MAction/MobiusDWF.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MAction_MobiusDWF_hpp_ #define Hadrons_MAction_MobiusDWF_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MAction/ScaledDWF.cc b/Hadrons/Modules/MAction/ScaledDWF.cc similarity index 95% rename from extras/Hadrons/Modules/MAction/ScaledDWF.cc rename to Hadrons/Modules/MAction/ScaledDWF.cc index 40eed326..437db78b 100644 --- a/extras/Hadrons/Modules/MAction/ScaledDWF.cc +++ b/Hadrons/Modules/MAction/ScaledDWF.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MAction/ScaledDWF.hpp b/Hadrons/Modules/MAction/ScaledDWF.hpp similarity index 97% rename from extras/Hadrons/Modules/MAction/ScaledDWF.hpp rename to Hadrons/Modules/MAction/ScaledDWF.hpp index b75ff31d..18993370 100644 --- a/extras/Hadrons/Modules/MAction/ScaledDWF.hpp +++ b/Hadrons/Modules/MAction/ScaledDWF.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MAction_ScaledDWF_hpp_ #define Hadrons_MAction_ScaledDWF_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MAction/Wilson.cc b/Hadrons/Modules/MAction/Wilson.cc similarity index 96% rename from extras/Hadrons/Modules/MAction/Wilson.cc rename to Hadrons/Modules/MAction/Wilson.cc index 11924d5a..db99f977 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.cc +++ b/Hadrons/Modules/MAction/Wilson.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MAction/Wilson.hpp b/Hadrons/Modules/MAction/Wilson.hpp similarity index 97% rename from extras/Hadrons/Modules/MAction/Wilson.hpp rename to Hadrons/Modules/MAction/Wilson.hpp index 70e0acf1..ab604932 100644 --- a/extras/Hadrons/Modules/MAction/Wilson.hpp +++ b/Hadrons/Modules/MAction/Wilson.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MAction_Wilson_hpp_ #define Hadrons_MAction_Wilson_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.cc b/Hadrons/Modules/MAction/WilsonClover.cc similarity index 95% rename from extras/Hadrons/Modules/MAction/WilsonClover.cc rename to Hadrons/Modules/MAction/WilsonClover.cc index 77099044..8fe83a72 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.cc +++ b/Hadrons/Modules/MAction/WilsonClover.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MAction/WilsonClover.hpp b/Hadrons/Modules/MAction/WilsonClover.hpp similarity index 97% rename from extras/Hadrons/Modules/MAction/WilsonClover.hpp rename to Hadrons/Modules/MAction/WilsonClover.hpp index 0fb3b442..31bb3d41 100644 --- a/extras/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/Hadrons/Modules/MAction/WilsonClover.hpp @@ -31,9 +31,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MAction_WilsonClover_hpp_ #define Hadrons_MAction_WilsonClover_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc b/Hadrons/Modules/MAction/ZMobiusDWF.cc similarity index 95% rename from extras/Hadrons/Modules/MAction/ZMobiusDWF.cc rename to Hadrons/Modules/MAction/ZMobiusDWF.cc index 7a49c120..5a1a0a6e 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.cc +++ b/Hadrons/Modules/MAction/ZMobiusDWF.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/Hadrons/Modules/MAction/ZMobiusDWF.hpp similarity index 97% rename from extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp rename to Hadrons/Modules/MAction/ZMobiusDWF.hpp index 4a275dd0..3a00ec51 100644 --- a/extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MAction_ZMobiusDWF_hpp_ #define Hadrons_MAction_ZMobiusDWF_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc b/Hadrons/Modules/MContraction/A2AMesonField.cc similarity index 95% rename from extras/Hadrons/Modules/MContraction/A2AMesonField.cc rename to Hadrons/Modules/MContraction/A2AMesonField.cc index 3d85acb5..d8fa8bf7 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.cc +++ b/Hadrons/Modules/MContraction/A2AMesonField.cc @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp b/Hadrons/Modules/MContraction/A2AMesonField.hpp similarity index 98% rename from extras/Hadrons/Modules/MContraction/A2AMesonField.hpp rename to Hadrons/Modules/MContraction/A2AMesonField.hpp index 27c599f0..797707b9 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -30,12 +30,12 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_A2AMesonField_hpp_ #define Hadrons_MContraction_A2AMesonField_hpp_ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define MF_PARALLEL_IO #ifndef MF_IO_TYPE diff --git a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp b/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp similarity index 99% rename from extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp rename to Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp index 649f9fdf..ed078130 100644 --- a/extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp @@ -29,8 +29,8 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_A2AMesonFieldKernels_hpp_ #define Hadrons_MContraction_A2AMesonFieldKernels_hpp_ -#include -#include +#include +#include #include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/Baryon.cc b/Hadrons/Modules/MContraction/Baryon.cc similarity index 95% rename from extras/Hadrons/Modules/MContraction/Baryon.cc rename to Hadrons/Modules/MContraction/Baryon.cc index 7daf5008..d397cd72 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.cc +++ b/Hadrons/Modules/MContraction/Baryon.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/Baryon.hpp b/Hadrons/Modules/MContraction/Baryon.hpp similarity index 97% rename from extras/Hadrons/Modules/MContraction/Baryon.hpp rename to Hadrons/Modules/MContraction/Baryon.hpp index 654706c6..927a299e 100644 --- a/extras/Hadrons/Modules/MContraction/Baryon.hpp +++ b/Hadrons/Modules/MContraction/Baryon.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_Baryon_hpp_ #define Hadrons_MContraction_Baryon_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.cc b/Hadrons/Modules/MContraction/DiscLoop.cc similarity index 95% rename from extras/Hadrons/Modules/MContraction/DiscLoop.cc rename to Hadrons/Modules/MContraction/DiscLoop.cc index 8c7a72ee..683e4e74 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.cc +++ b/Hadrons/Modules/MContraction/DiscLoop.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp b/Hadrons/Modules/MContraction/DiscLoop.hpp similarity index 97% rename from extras/Hadrons/Modules/MContraction/DiscLoop.hpp rename to Hadrons/Modules/MContraction/DiscLoop.hpp index ea3d3d2f..c88df7d9 100644 --- a/extras/Hadrons/Modules/MContraction/DiscLoop.hpp +++ b/Hadrons/Modules/MContraction/DiscLoop.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_DiscLoop_hpp_ #define Hadrons_MContraction_DiscLoop_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.cc b/Hadrons/Modules/MContraction/Gamma3pt.cc similarity index 95% rename from extras/Hadrons/Modules/MContraction/Gamma3pt.cc rename to Hadrons/Modules/MContraction/Gamma3pt.cc index 13e911bb..fb6fe896 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.cc +++ b/Hadrons/Modules/MContraction/Gamma3pt.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp b/Hadrons/Modules/MContraction/Gamma3pt.hpp similarity index 98% rename from extras/Hadrons/Modules/MContraction/Gamma3pt.hpp rename to Hadrons/Modules/MContraction/Gamma3pt.hpp index e30845bc..2abdaf5f 100644 --- a/extras/Hadrons/Modules/MContraction/Gamma3pt.hpp +++ b/Hadrons/Modules/MContraction/Gamma3pt.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_Gamma3pt_hpp_ #define Hadrons_MContraction_Gamma3pt_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/Meson.cc b/Hadrons/Modules/MContraction/Meson.cc similarity index 95% rename from extras/Hadrons/Modules/MContraction/Meson.cc rename to Hadrons/Modules/MContraction/Meson.cc index 3b880705..e4c83331 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.cc +++ b/Hadrons/Modules/MContraction/Meson.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/Meson.hpp b/Hadrons/Modules/MContraction/Meson.hpp similarity index 98% rename from extras/Hadrons/Modules/MContraction/Meson.hpp rename to Hadrons/Modules/MContraction/Meson.hpp index 66a19214..077110a4 100644 --- a/extras/Hadrons/Modules/MContraction/Meson.hpp +++ b/Hadrons/Modules/MContraction/Meson.hpp @@ -31,9 +31,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_Meson_hpp_ #define Hadrons_MContraction_Meson_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.cc b/Hadrons/Modules/MContraction/WardIdentity.cc similarity index 95% rename from extras/Hadrons/Modules/MContraction/WardIdentity.cc rename to Hadrons/Modules/MContraction/WardIdentity.cc index 8b5cc2e3..ad2a46f1 100644 --- a/extras/Hadrons/Modules/MContraction/WardIdentity.cc +++ b/Hadrons/Modules/MContraction/WardIdentity.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp b/Hadrons/Modules/MContraction/WardIdentity.hpp similarity index 98% rename from extras/Hadrons/Modules/MContraction/WardIdentity.hpp rename to Hadrons/Modules/MContraction/WardIdentity.hpp index e529d7a2..b755015b 100644 --- a/extras/Hadrons/Modules/MContraction/WardIdentity.hpp +++ b/Hadrons/Modules/MContraction/WardIdentity.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_WardIdentity_hpp_ #define Hadrons_MContraction_WardIdentity_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp b/Hadrons/Modules/MContraction/WeakHamiltonian.hpp similarity index 97% rename from extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp rename to Hadrons/Modules/MContraction/WeakHamiltonian.hpp index 507e8cdb..83c3b772 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp +++ b/Hadrons/Modules/MContraction/WeakHamiltonian.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_WeakHamiltonian_hpp_ #define Hadrons_MContraction_WeakHamiltonian_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc b/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc similarity index 98% rename from extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc rename to Hadrons/Modules/MContraction/WeakHamiltonianEye.cc index da1c877e..16cee0bc 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc +++ b/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc @@ -27,7 +27,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp b/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp similarity index 96% rename from extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp rename to Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp index 24f39f6c..826547b4 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp +++ b/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp @@ -30,7 +30,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_WeakHamiltonianEye_hpp_ #define Hadrons_MContraction_WeakHamiltonianEye_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc similarity index 98% rename from extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc rename to Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc index e7824d33..6ff22152 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc +++ b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc @@ -27,7 +27,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp similarity index 96% rename from extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp rename to Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp index c4cd66f1..93830421 100644 --- a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp +++ b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp @@ -30,7 +30,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_WeakHamiltonianNonEye_hpp_ #define Hadrons_MContraction_WeakHamiltonianNonEye_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc similarity index 98% rename from extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc rename to Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc index 0b7a2cde..89e8a79b 100644 --- a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc +++ b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc @@ -27,7 +27,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp similarity index 96% rename from extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp rename to Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp index 5de2a751..c0b3ee53 100644 --- a/extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp +++ b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp @@ -30,7 +30,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MContraction_WeakNeutral4ptDisc_hpp_ #define Hadrons_MContraction_WeakNeutral4ptDisc_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.cc b/Hadrons/Modules/MFermion/FreeProp.cc similarity index 96% rename from extras/Hadrons/Modules/MFermion/FreeProp.cc rename to Hadrons/Modules/MFermion/FreeProp.cc index 0ff07887..5184ed78 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.cc +++ b/Hadrons/Modules/MFermion/FreeProp.cc @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MFermion/FreeProp.hpp b/Hadrons/Modules/MFermion/FreeProp.hpp similarity index 98% rename from extras/Hadrons/Modules/MFermion/FreeProp.hpp rename to Hadrons/Modules/MFermion/FreeProp.hpp index 1b7ddb9a..c06240de 100644 --- a/extras/Hadrons/Modules/MFermion/FreeProp.hpp +++ b/Hadrons/Modules/MFermion/FreeProp.hpp @@ -31,9 +31,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MFermion_FreeProp_hpp_ #define Hadrons_MFermion_FreeProp_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.cc b/Hadrons/Modules/MFermion/GaugeProp.cc similarity index 96% rename from extras/Hadrons/Modules/MFermion/GaugeProp.cc rename to Hadrons/Modules/MFermion/GaugeProp.cc index f03bf2be..027e4cfc 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.cc +++ b/Hadrons/Modules/MFermion/GaugeProp.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp b/Hadrons/Modules/MFermion/GaugeProp.hpp similarity index 97% rename from extras/Hadrons/Modules/MFermion/GaugeProp.hpp rename to Hadrons/Modules/MFermion/GaugeProp.hpp index d2c9df05..24a6446a 100644 --- a/extras/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -32,10 +32,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MFermion_GaugeProp_hpp_ #define Hadrons_MFermion_GaugeProp_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc b/Hadrons/Modules/MGauge/FundtoHirep.cc similarity index 97% rename from extras/Hadrons/Modules/MGauge/FundtoHirep.cc rename to Hadrons/Modules/MGauge/FundtoHirep.cc index 824ee8c8..4a880134 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.cc +++ b/Hadrons/Modules/MGauge/FundtoHirep.cc @@ -28,7 +28,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp b/Hadrons/Modules/MGauge/FundtoHirep.hpp similarity index 95% rename from extras/Hadrons/Modules/MGauge/FundtoHirep.hpp rename to Hadrons/Modules/MGauge/FundtoHirep.hpp index 3a3a83e5..b2f90089 100644 --- a/extras/Hadrons/Modules/MGauge/FundtoHirep.hpp +++ b/Hadrons/Modules/MGauge/FundtoHirep.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MGauge_FundtoHirep_hpp_ #define Hadrons_MGauge_FundtoHirep_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/Random.cc b/Hadrons/Modules/MGauge/Random.cc similarity index 97% rename from extras/Hadrons/Modules/MGauge/Random.cc rename to Hadrons/Modules/MGauge/Random.cc index 59b43331..b33c9a56 100644 --- a/extras/Hadrons/Modules/MGauge/Random.cc +++ b/Hadrons/Modules/MGauge/Random.cc @@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MGauge/Random.hpp b/Hadrons/Modules/MGauge/Random.hpp similarity index 94% rename from extras/Hadrons/Modules/MGauge/Random.hpp rename to Hadrons/Modules/MGauge/Random.hpp index 13d0e478..a445aa5f 100644 --- a/extras/Hadrons/Modules/MGauge/Random.hpp +++ b/Hadrons/Modules/MGauge/Random.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MGauge_Random_hpp_ #define Hadrons_MGauge_Random_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/StochEm.cc b/Hadrons/Modules/MGauge/StochEm.cc similarity index 98% rename from extras/Hadrons/Modules/MGauge/StochEm.cc rename to Hadrons/Modules/MGauge/StochEm.cc index adb33d9c..e2b2c458 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.cc +++ b/Hadrons/Modules/MGauge/StochEm.cc @@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MGauge/StochEm.hpp b/Hadrons/Modules/MGauge/StochEm.hpp similarity index 95% rename from extras/Hadrons/Modules/MGauge/StochEm.hpp rename to Hadrons/Modules/MGauge/StochEm.hpp index fd07c294..151b61dc 100644 --- a/extras/Hadrons/Modules/MGauge/StochEm.hpp +++ b/Hadrons/Modules/MGauge/StochEm.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MGauge_StochEm_hpp_ #define Hadrons_MGauge_StochEm_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/StoutSmearing.cc b/Hadrons/Modules/MGauge/StoutSmearing.cc similarity index 95% rename from extras/Hadrons/Modules/MGauge/StoutSmearing.cc rename to Hadrons/Modules/MGauge/StoutSmearing.cc index 3dae8428..01378d1f 100644 --- a/extras/Hadrons/Modules/MGauge/StoutSmearing.cc +++ b/Hadrons/Modules/MGauge/StoutSmearing.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp b/Hadrons/Modules/MGauge/StoutSmearing.hpp similarity index 97% rename from extras/Hadrons/Modules/MGauge/StoutSmearing.hpp rename to Hadrons/Modules/MGauge/StoutSmearing.hpp index ddfc1a73..9ed1e98b 100644 --- a/extras/Hadrons/Modules/MGauge/StoutSmearing.hpp +++ b/Hadrons/Modules/MGauge/StoutSmearing.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MGauge_StoutSmearing_hpp_ #define Hadrons_MGauge_StoutSmearing_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/Unit.cc b/Hadrons/Modules/MGauge/Unit.cc similarity index 97% rename from extras/Hadrons/Modules/MGauge/Unit.cc rename to Hadrons/Modules/MGauge/Unit.cc index 3df12fa7..aa85f97e 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.cc +++ b/Hadrons/Modules/MGauge/Unit.cc @@ -26,7 +26,7 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MGauge/Unit.hpp b/Hadrons/Modules/MGauge/Unit.hpp similarity index 94% rename from extras/Hadrons/Modules/MGauge/Unit.hpp rename to Hadrons/Modules/MGauge/Unit.hpp index 8bdb7ef3..8600dafe 100644 --- a/extras/Hadrons/Modules/MGauge/Unit.hpp +++ b/Hadrons/Modules/MGauge/Unit.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MGauge_Unit_hpp_ #define Hadrons_MGauge_Unit_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.cc b/Hadrons/Modules/MGauge/UnitEm.cc similarity index 97% rename from extras/Hadrons/Modules/MGauge/UnitEm.cc rename to Hadrons/Modules/MGauge/UnitEm.cc index 5c076592..06d0117a 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.cc +++ b/Hadrons/Modules/MGauge/UnitEm.cc @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MGauge/UnitEm.hpp b/Hadrons/Modules/MGauge/UnitEm.hpp similarity index 95% rename from extras/Hadrons/Modules/MGauge/UnitEm.hpp rename to Hadrons/Modules/MGauge/UnitEm.hpp index c6c89bb0..f6d83cb9 100644 --- a/extras/Hadrons/Modules/MGauge/UnitEm.hpp +++ b/Hadrons/Modules/MGauge/UnitEm.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MGauge_UnitEm_hpp_ #define Hadrons_MGauge_UnitEm_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.cc b/Hadrons/Modules/MIO/LoadBinary.cc similarity index 96% rename from extras/Hadrons/Modules/MIO/LoadBinary.cc rename to Hadrons/Modules/MIO/LoadBinary.cc index f04df9df..4e510a91 100644 --- a/extras/Hadrons/Modules/MIO/LoadBinary.cc +++ b/Hadrons/Modules/MIO/LoadBinary.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MIO/LoadBinary.hpp b/Hadrons/Modules/MIO/LoadBinary.hpp similarity index 97% rename from extras/Hadrons/Modules/MIO/LoadBinary.hpp rename to Hadrons/Modules/MIO/LoadBinary.hpp index b2070bef..c307a7dd 100644 --- a/extras/Hadrons/Modules/MIO/LoadBinary.hpp +++ b/Hadrons/Modules/MIO/LoadBinary.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MIO_LoadBinary_hpp_ #define Hadrons_MIO_LoadBinary_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc b/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc similarity index 95% rename from extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc rename to Hadrons/Modules/MIO/LoadCoarseEigenPack.cc index 0ed7643c..68f96914 100644 --- a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc +++ b/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp b/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp similarity index 97% rename from extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp rename to Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp index 945b6751..78834d14 100644 --- a/extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp +++ b/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MIO_LoadCoarseEigenPack_hpp_ #define Hadrons_MIO_LoadCoarseEigenPack_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.cc b/Hadrons/Modules/MIO/LoadEigenPack.cc similarity index 95% rename from extras/Hadrons/Modules/MIO/LoadEigenPack.cc rename to Hadrons/Modules/MIO/LoadEigenPack.cc index 5b7aebc3..e492f0f1 100644 --- a/extras/Hadrons/Modules/MIO/LoadEigenPack.cc +++ b/Hadrons/Modules/MIO/LoadEigenPack.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp b/Hadrons/Modules/MIO/LoadEigenPack.hpp similarity index 96% rename from extras/Hadrons/Modules/MIO/LoadEigenPack.hpp rename to Hadrons/Modules/MIO/LoadEigenPack.hpp index fcad4107..8ad85eba 100644 --- a/extras/Hadrons/Modules/MIO/LoadEigenPack.hpp +++ b/Hadrons/Modules/MIO/LoadEigenPack.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MIO_LoadEigenPack_hpp_ #define Hadrons_MIO_LoadEigenPack_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MIO/LoadNersc.cc b/Hadrons/Modules/MIO/LoadNersc.cc similarity index 98% rename from extras/Hadrons/Modules/MIO/LoadNersc.cc rename to Hadrons/Modules/MIO/LoadNersc.cc index 36a56d54..35645f9b 100644 --- a/extras/Hadrons/Modules/MIO/LoadNersc.cc +++ b/Hadrons/Modules/MIO/LoadNersc.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MIO/LoadNersc.hpp b/Hadrons/Modules/MIO/LoadNersc.hpp similarity index 95% rename from extras/Hadrons/Modules/MIO/LoadNersc.hpp rename to Hadrons/Modules/MIO/LoadNersc.hpp index 11b86eec..80e5ee18 100644 --- a/extras/Hadrons/Modules/MIO/LoadNersc.hpp +++ b/Hadrons/Modules/MIO/LoadNersc.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MIO_LoadNersc_hpp_ #define Hadrons_MIO_LoadNersc_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MLoop/NoiseLoop.cc b/Hadrons/Modules/MLoop/NoiseLoop.cc similarity index 96% rename from extras/Hadrons/Modules/MLoop/NoiseLoop.cc rename to Hadrons/Modules/MLoop/NoiseLoop.cc index 5c510afd..57e4bda6 100644 --- a/extras/Hadrons/Modules/MLoop/NoiseLoop.cc +++ b/Hadrons/Modules/MLoop/NoiseLoop.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp b/Hadrons/Modules/MLoop/NoiseLoop.hpp similarity index 97% rename from extras/Hadrons/Modules/MLoop/NoiseLoop.hpp rename to Hadrons/Modules/MLoop/NoiseLoop.hpp index 3ce9353d..9c6f4cf5 100644 --- a/extras/Hadrons/Modules/MLoop/NoiseLoop.hpp +++ b/Hadrons/Modules/MLoop/NoiseLoop.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MLoop_NoiseLoop_hpp_ #define Hadrons_MLoop_NoiseLoop_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc similarity index 95% rename from extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc rename to Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc index 50997962..e4e73944 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc +++ b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp similarity index 96% rename from extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp rename to Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp index 3c324cd1..05f0252f 100644 --- a/extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +++ b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_ #define Hadrons_MNoise_TimeDilutedSpinColorDiagonal_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.cc b/Hadrons/Modules/MScalar/ChargedProp.cc similarity index 99% rename from extras/Hadrons/Modules/MScalar/ChargedProp.cc rename to Hadrons/Modules/MScalar/ChargedProp.cc index 88c3dffd..c1f8fc6c 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/Hadrons/Modules/MScalar/ChargedProp.cc @@ -26,8 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp b/Hadrons/Modules/MScalar/ChargedProp.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalar/ChargedProp.hpp rename to Hadrons/Modules/MScalar/ChargedProp.hpp index 5b2f0422..45872850 100644 --- a/extras/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalar_ChargedProp_hpp_ #define Hadrons_MScalar_ChargedProp_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalar/FreeProp.cc b/Hadrons/Modules/MScalar/FreeProp.cc similarity index 96% rename from extras/Hadrons/Modules/MScalar/FreeProp.cc rename to Hadrons/Modules/MScalar/FreeProp.cc index 8d256e3c..4ae87848 100644 --- a/extras/Hadrons/Modules/MScalar/FreeProp.cc +++ b/Hadrons/Modules/MScalar/FreeProp.cc @@ -25,8 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalar/FreeProp.hpp b/Hadrons/Modules/MScalar/FreeProp.hpp similarity index 95% rename from extras/Hadrons/Modules/MScalar/FreeProp.hpp rename to Hadrons/Modules/MScalar/FreeProp.hpp index 50f4ba52..c307d4f9 100644 --- a/extras/Hadrons/Modules/MScalar/FreeProp.hpp +++ b/Hadrons/Modules/MScalar/FreeProp.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalar_FreeProp_hpp_ #define Hadrons_MScalar_FreeProp_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalar/Scalar.hpp b/Hadrons/Modules/MScalar/Scalar.hpp similarity index 100% rename from extras/Hadrons/Modules/MScalar/Scalar.hpp rename to Hadrons/Modules/MScalar/Scalar.hpp diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.cc b/Hadrons/Modules/MScalar/ScalarVP.cc similarity index 99% rename from extras/Hadrons/Modules/MScalar/ScalarVP.cc rename to Hadrons/Modules/MScalar/ScalarVP.cc index b43b0c9f..cafbf952 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/Hadrons/Modules/MScalar/ScalarVP.cc @@ -26,9 +26,9 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include -#include -#include +#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp b/Hadrons/Modules/MScalar/ScalarVP.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalar/ScalarVP.hpp rename to Hadrons/Modules/MScalar/ScalarVP.hpp index 191348d3..3c772c05 100644 --- a/extras/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalar_ScalarVP_hpp_ #define Hadrons_MScalar_ScalarVP_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc b/Hadrons/Modules/MScalar/VPCounterTerms.cc similarity index 98% rename from extras/Hadrons/Modules/MScalar/VPCounterTerms.cc rename to Hadrons/Modules/MScalar/VPCounterTerms.cc index 4c3fab85..9953a7be 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.cc +++ b/Hadrons/Modules/MScalar/VPCounterTerms.cc @@ -26,8 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/Hadrons/Modules/MScalar/VPCounterTerms.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp rename to Hadrons/Modules/MScalar/VPCounterTerms.hpp index 92d37686..fcfa5064 100644 --- a/extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp +++ b/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalar_VPCounterTerms_hpp_ #define Hadrons_MScalar_VPCounterTerms_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.cc b/Hadrons/Modules/MScalarSUN/Div.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/Div.cc rename to Hadrons/Modules/MScalarSUN/Div.cc index 6a2e366d..1f55c593 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.cc +++ b/Hadrons/Modules/MScalarSUN/Div.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/Div.hpp b/Hadrons/Modules/MScalarSUN/Div.hpp similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/Div.hpp rename to Hadrons/Modules/MScalarSUN/Div.hpp index ff26c60b..916b823f 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/Hadrons/Modules/MScalarSUN/Div.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_Div_hpp_ #define Hadrons_MScalarSUN_Div_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.cc b/Hadrons/Modules/MScalarSUN/EMT.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/EMT.cc rename to Hadrons/Modules/MScalarSUN/EMT.cc index 7f8ca16d..2ae024fd 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.cc +++ b/Hadrons/Modules/MScalarSUN/EMT.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp b/Hadrons/Modules/MScalarSUN/EMT.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalarSUN/EMT.hpp rename to Hadrons/Modules/MScalarSUN/EMT.hpp index dbbfb6b3..4858490b 100644 --- a/extras/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_EMT_hpp_ #define Hadrons_MScalarSUN_EMT_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/Grad.cc b/Hadrons/Modules/MScalarSUN/Grad.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/Grad.cc rename to Hadrons/Modules/MScalarSUN/Grad.cc index be03b4a7..7e07dba4 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Grad.cc +++ b/Hadrons/Modules/MScalarSUN/Grad.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/Grad.hpp b/Hadrons/Modules/MScalarSUN/Grad.hpp similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/Grad.hpp rename to Hadrons/Modules/MScalarSUN/Grad.hpp index ecf65e90..c8b25a7d 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Grad.hpp +++ b/Hadrons/Modules/MScalarSUN/Grad.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_Grad_hpp_ #define Hadrons_MScalarSUN_Grad_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc b/Hadrons/Modules/MScalarSUN/ShiftProbe.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc rename to Hadrons/Modules/MScalarSUN/ShiftProbe.cc index 30320667..f08e9f20 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc +++ b/Hadrons/Modules/MScalarSUN/ShiftProbe.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp rename to Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index edd38e42..dfc56d64 100644 --- a/extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_ShiftProbe_hpp_ #define Hadrons_MScalarSUN_ShiftProbe_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc b/Hadrons/Modules/MScalarSUN/StochFreeField.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc rename to Hadrons/Modules/MScalarSUN/StochFreeField.cc index db14d75d..e51868f0 100644 --- a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc +++ b/Hadrons/Modules/MScalarSUN/StochFreeField.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/Hadrons/Modules/MScalarSUN/StochFreeField.hpp similarity index 98% rename from extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp rename to Hadrons/Modules/MScalarSUN/StochFreeField.hpp index d757c1ab..1e4d2265 100644 --- a/extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +++ b/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_StochFreeField_hpp_ #define Hadrons_MScalarSUN_StochFreeField_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc b/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc rename to Hadrons/Modules/MScalarSUN/TimeMomProbe.cc index eaddd318..5ae5336c 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc +++ b/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp b/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp similarity index 98% rename from extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp rename to Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp index 80424936..89cc2893 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp +++ b/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_TimeMomProbe_hpp_ #define Hadrons_MScalarSUN_TimeMomProbe_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc b/Hadrons/Modules/MScalarSUN/TrKinetic.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc rename to Hadrons/Modules/MScalarSUN/TrKinetic.cc index 8d377f21..5053c88a 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc +++ b/Hadrons/Modules/MScalarSUN/TrKinetic.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/Hadrons/Modules/MScalarSUN/TrKinetic.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp rename to Hadrons/Modules/MScalarSUN/TrKinetic.hpp index a714daaa..6fb615a2 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_TrKinetic_hpp_ #define Hadrons_MScalarSUN_TrKinetic_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.cc b/Hadrons/Modules/MScalarSUN/TrMag.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TrMag.cc rename to Hadrons/Modules/MScalarSUN/TrMag.cc index 29897abc..20cf281d 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.cc +++ b/Hadrons/Modules/MScalarSUN/TrMag.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp b/Hadrons/Modules/MScalarSUN/TrMag.hpp similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TrMag.hpp rename to Hadrons/Modules/MScalarSUN/TrMag.hpp index cdbf7e30..eabb15f6 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_TrMag_hpp_ #define Hadrons_MScalarSUN_TrMag_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc b/Hadrons/Modules/MScalarSUN/TrPhi.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TrPhi.cc rename to Hadrons/Modules/MScalarSUN/TrPhi.cc index e1fcb8e5..d5eca1e4 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.cc +++ b/Hadrons/Modules/MScalarSUN/TrPhi.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/Hadrons/Modules/MScalarSUN/TrPhi.hpp similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp rename to Hadrons/Modules/MScalarSUN/TrPhi.hpp index 9be0a5d6..28397f99 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_TrPhi_hpp_ #define Hadrons_MScalarSUN_TrPhi_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.cc b/Hadrons/Modules/MScalarSUN/TransProj.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TransProj.cc rename to Hadrons/Modules/MScalarSUN/TransProj.cc index 0fb230bb..21ee1296 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.cc +++ b/Hadrons/Modules/MScalarSUN/TransProj.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/Hadrons/Modules/MScalarSUN/TransProj.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalarSUN/TransProj.hpp rename to Hadrons/Modules/MScalarSUN/TransProj.hpp index c9b42bf0..d5bdbcfb 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp +++ b/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_TransProj_hpp_ #define Hadrons_MScalarSUN_TransProj_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc b/Hadrons/Modules/MScalarSUN/TwoPoint.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc rename to Hadrons/Modules/MScalarSUN/TwoPoint.cc index 840cc02a..966ebab1 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc +++ b/Hadrons/Modules/MScalarSUN/TwoPoint.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/Hadrons/Modules/MScalarSUN/TwoPoint.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp rename to Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 2407f26f..fac770e3 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_TwoPoint_hpp_ #define Hadrons_MScalarSUN_TwoPoint_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc b/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc similarity index 96% rename from extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc rename to Hadrons/Modules/MScalarSUN/TwoPointNPR.cc index 712f86d8..61bc9f90 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc +++ b/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp similarity index 97% rename from extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp rename to Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp index 48dddd4f..567e4662 100644 --- a/extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp +++ b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_TwoPointNPR_hpp_ #define Hadrons_MScalarSUN_TwoPointNPR_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp b/Hadrons/Modules/MScalarSUN/Utils.hpp similarity index 98% rename from extras/Hadrons/Modules/MScalarSUN/Utils.hpp rename to Hadrons/Modules/MScalarSUN/Utils.hpp index 68009f5e..b717f20c 100644 --- a/extras/Hadrons/Modules/MScalarSUN/Utils.hpp +++ b/Hadrons/Modules/MScalarSUN/Utils.hpp @@ -28,8 +28,8 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MScalarSUN_Utils_hpp_ #define Hadrons_MScalarSUN_Utils_hpp_ -#include -#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSink/Point.cc b/Hadrons/Modules/MSink/Point.cc similarity index 96% rename from extras/Hadrons/Modules/MSink/Point.cc rename to Hadrons/Modules/MSink/Point.cc index 127c4c74..59bb26bc 100644 --- a/extras/Hadrons/Modules/MSink/Point.cc +++ b/Hadrons/Modules/MSink/Point.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSink/Point.hpp b/Hadrons/Modules/MSink/Point.hpp similarity index 97% rename from extras/Hadrons/Modules/MSink/Point.hpp rename to Hadrons/Modules/MSink/Point.hpp index 7617ee78..722ff4dd 100644 --- a/extras/Hadrons/Modules/MSink/Point.hpp +++ b/Hadrons/Modules/MSink/Point.hpp @@ -31,9 +31,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSink_Point_hpp_ #define Hadrons_MSink_Point_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSink/Smear.cc b/Hadrons/Modules/MSink/Smear.cc similarity index 96% rename from extras/Hadrons/Modules/MSink/Smear.cc rename to Hadrons/Modules/MSink/Smear.cc index ff250140..dc2bea78 100644 --- a/extras/Hadrons/Modules/MSink/Smear.cc +++ b/Hadrons/Modules/MSink/Smear.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSink/Smear.hpp b/Hadrons/Modules/MSink/Smear.hpp similarity index 97% rename from extras/Hadrons/Modules/MSink/Smear.hpp rename to Hadrons/Modules/MSink/Smear.hpp index 1a46c693..21e7bdf0 100644 --- a/extras/Hadrons/Modules/MSink/Smear.hpp +++ b/Hadrons/Modules/MSink/Smear.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSink_Smear_hpp_ #define Hadrons_MSink_Smear_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.cc b/Hadrons/Modules/MSolver/A2AVectors.cc similarity index 96% rename from extras/Hadrons/Modules/MSolver/A2AVectors.cc rename to Hadrons/Modules/MSolver/A2AVectors.cc index a13920ff..df08ed4c 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.cc +++ b/Hadrons/Modules/MSolver/A2AVectors.cc @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp b/Hadrons/Modules/MSolver/A2AVectors.hpp similarity index 96% rename from extras/Hadrons/Modules/MSolver/A2AVectors.hpp rename to Hadrons/Modules/MSolver/A2AVectors.hpp index 7022b90b..4573487a 100644 --- a/extras/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -29,13 +29,13 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSolver_A2AVectors_hpp_ #define Hadrons_MSolver_A2AVectors_hpp_ -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc similarity index 95% rename from extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc rename to Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc index 5bddce95..3dc441ad 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc +++ b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp similarity index 98% rename from extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp rename to Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index c9088cf4..1179b6e4 100644 --- a/extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -28,10 +28,10 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSolver_LocalCoherenceLanczos_hpp_ #define Hadrons_MSolver_LocalCoherenceLanczos_hpp_ -#include -#include -#include -#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.cc b/Hadrons/Modules/MSolver/RBPrecCG.cc similarity index 96% rename from extras/Hadrons/Modules/MSolver/RBPrecCG.cc rename to Hadrons/Modules/MSolver/RBPrecCG.cc index 867c6c5d..e0f3487c 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.cc +++ b/Hadrons/Modules/MSolver/RBPrecCG.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/Hadrons/Modules/MSolver/RBPrecCG.hpp similarity index 97% rename from extras/Hadrons/Modules/MSolver/RBPrecCG.hpp rename to Hadrons/Modules/MSolver/RBPrecCG.hpp index 8bcd3968..e4c6529f 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -30,11 +30,11 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSolver_RBPrecCG_hpp_ #define Hadrons_MSolver_RBPrecCG_hpp_ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSource/Point.cc b/Hadrons/Modules/MSource/Point.cc similarity index 96% rename from extras/Hadrons/Modules/MSource/Point.cc rename to Hadrons/Modules/MSource/Point.cc index 5e49af2a..20e0a324 100644 --- a/extras/Hadrons/Modules/MSource/Point.cc +++ b/Hadrons/Modules/MSource/Point.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSource/Point.hpp b/Hadrons/Modules/MSource/Point.hpp similarity index 97% rename from extras/Hadrons/Modules/MSource/Point.hpp rename to Hadrons/Modules/MSource/Point.hpp index 0898a1a8..21c67969 100644 --- a/extras/Hadrons/Modules/MSource/Point.hpp +++ b/Hadrons/Modules/MSource/Point.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSource_Point_hpp_ #define Hadrons_MSource_Point_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.cc b/Hadrons/Modules/MSource/SeqConserved.cc similarity index 95% rename from extras/Hadrons/Modules/MSource/SeqConserved.cc rename to Hadrons/Modules/MSource/SeqConserved.cc index 35b6ef37..a2eb64f3 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.cc +++ b/Hadrons/Modules/MSource/SeqConserved.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSource/SeqConserved.hpp b/Hadrons/Modules/MSource/SeqConserved.hpp similarity index 98% rename from extras/Hadrons/Modules/MSource/SeqConserved.hpp rename to Hadrons/Modules/MSource/SeqConserved.hpp index ce9cd4e6..7779e370 100644 --- a/extras/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/Hadrons/Modules/MSource/SeqConserved.hpp @@ -31,9 +31,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSource_SeqConserved_hpp_ #define Hadrons_MSource_SeqConserved_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.cc b/Hadrons/Modules/MSource/SeqGamma.cc similarity index 96% rename from extras/Hadrons/Modules/MSource/SeqGamma.cc rename to Hadrons/Modules/MSource/SeqGamma.cc index ce4f3dd0..e566b762 100644 --- a/extras/Hadrons/Modules/MSource/SeqGamma.cc +++ b/Hadrons/Modules/MSource/SeqGamma.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSource/SeqGamma.hpp b/Hadrons/Modules/MSource/SeqGamma.hpp similarity index 98% rename from extras/Hadrons/Modules/MSource/SeqGamma.hpp rename to Hadrons/Modules/MSource/SeqGamma.hpp index 2d8e1c31..58fcfa8d 100644 --- a/extras/Hadrons/Modules/MSource/SeqGamma.hpp +++ b/Hadrons/Modules/MSource/SeqGamma.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSource_SeqGamma_hpp_ #define Hadrons_MSource_SeqGamma_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSource/Wall.cc b/Hadrons/Modules/MSource/Wall.cc similarity index 96% rename from extras/Hadrons/Modules/MSource/Wall.cc rename to Hadrons/Modules/MSource/Wall.cc index 9b293232..c3c0a3f0 100644 --- a/extras/Hadrons/Modules/MSource/Wall.cc +++ b/Hadrons/Modules/MSource/Wall.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSource/Wall.hpp b/Hadrons/Modules/MSource/Wall.hpp similarity index 97% rename from extras/Hadrons/Modules/MSource/Wall.hpp rename to Hadrons/Modules/MSource/Wall.hpp index f8bec19e..968fda87 100644 --- a/extras/Hadrons/Modules/MSource/Wall.hpp +++ b/Hadrons/Modules/MSource/Wall.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSource_WallSource_hpp_ #define Hadrons_MSource_WallSource_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MSource/Z2.cc b/Hadrons/Modules/MSource/Z2.cc similarity index 96% rename from extras/Hadrons/Modules/MSource/Z2.cc rename to Hadrons/Modules/MSource/Z2.cc index 9644c6fd..6ed27400 100644 --- a/extras/Hadrons/Modules/MSource/Z2.cc +++ b/Hadrons/Modules/MSource/Z2.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MSource/Z2.hpp b/Hadrons/Modules/MSource/Z2.hpp similarity index 97% rename from extras/Hadrons/Modules/MSource/Z2.hpp rename to Hadrons/Modules/MSource/Z2.hpp index 51bbbaa2..77714941 100644 --- a/extras/Hadrons/Modules/MSource/Z2.hpp +++ b/Hadrons/Modules/MSource/Z2.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MSource_Z2_hpp_ #define Hadrons_MSource_Z2_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MUtilities/RandomVectors.cc b/Hadrons/Modules/MUtilities/RandomVectors.cc similarity index 95% rename from extras/Hadrons/Modules/MUtilities/RandomVectors.cc rename to Hadrons/Modules/MUtilities/RandomVectors.cc index 7da32322..89aea0ee 100644 --- a/extras/Hadrons/Modules/MUtilities/RandomVectors.cc +++ b/Hadrons/Modules/MUtilities/RandomVectors.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp b/Hadrons/Modules/MUtilities/RandomVectors.hpp similarity index 97% rename from extras/Hadrons/Modules/MUtilities/RandomVectors.hpp rename to Hadrons/Modules/MUtilities/RandomVectors.hpp index 4da84506..5da18dc3 100644 --- a/extras/Hadrons/Modules/MUtilities/RandomVectors.hpp +++ b/Hadrons/Modules/MUtilities/RandomVectors.hpp @@ -28,9 +28,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MUtilities_RandomVectors_hpp_ #define Hadrons_MUtilities_RandomVectors_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc b/Hadrons/Modules/MUtilities/TestSeqConserved.cc similarity index 95% rename from extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc rename to Hadrons/Modules/MUtilities/TestSeqConserved.cc index 99beac71..0ccdeac9 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc +++ b/Hadrons/Modules/MUtilities/TestSeqConserved.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp b/Hadrons/Modules/MUtilities/TestSeqConserved.hpp similarity index 98% rename from extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp rename to Hadrons/Modules/MUtilities/TestSeqConserved.hpp index 7b1bc1db..db16a69c 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp +++ b/Hadrons/Modules/MUtilities/TestSeqConserved.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MUtilities_TestSeqConserved_hpp_ #define Hadrons_MUtilities_TestSeqConserved_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc b/Hadrons/Modules/MUtilities/TestSeqGamma.cc similarity index 95% rename from extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc rename to Hadrons/Modules/MUtilities/TestSeqGamma.cc index f53d9f85..70f39ddd 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc +++ b/Hadrons/Modules/MUtilities/TestSeqGamma.cc @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp b/Hadrons/Modules/MUtilities/TestSeqGamma.hpp similarity index 97% rename from extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp rename to Hadrons/Modules/MUtilities/TestSeqGamma.hpp index 6f2665e4..33761f03 100644 --- a/extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp +++ b/Hadrons/Modules/MUtilities/TestSeqGamma.hpp @@ -30,9 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_MUtilities_TestSeqGamma_hpp_ #define Hadrons_MUtilities_TestSeqGamma_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/Modules/templates/Module_in_NS.cc.template b/Hadrons/Modules/templates/Module_in_NS.cc.template similarity index 100% rename from extras/Hadrons/Modules/templates/Module_in_NS.cc.template rename to Hadrons/Modules/templates/Module_in_NS.cc.template diff --git a/extras/Hadrons/Modules/templates/Module_in_NS.hpp.template b/Hadrons/Modules/templates/Module_in_NS.hpp.template similarity index 100% rename from extras/Hadrons/Modules/templates/Module_in_NS.hpp.template rename to Hadrons/Modules/templates/Module_in_NS.hpp.template diff --git a/extras/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template b/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template similarity index 100% rename from extras/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template rename to Hadrons/Modules/templates/Module_tmp_in_NS.cc.template diff --git a/extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template b/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template similarity index 100% rename from extras/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template rename to Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template diff --git a/extras/Hadrons/Solver.hpp b/Hadrons/Solver.hpp similarity index 98% rename from extras/Hadrons/Solver.hpp rename to Hadrons/Solver.hpp index 5d72e3d5..479516de 100644 --- a/extras/Hadrons/Solver.hpp +++ b/Hadrons/Solver.hpp @@ -28,7 +28,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_Solver_hpp_ #define Hadrons_Solver_hpp_ -#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/VirtualMachine.cc b/Hadrons/VirtualMachine.cc similarity index 99% rename from extras/Hadrons/VirtualMachine.cc rename to Hadrons/VirtualMachine.cc index 17aaaf63..ed36cec2 100644 --- a/extras/Hadrons/VirtualMachine.cc +++ b/Hadrons/VirtualMachine.cc @@ -26,9 +26,9 @@ See the full license in the file "LICENSE" in the top level distribution directo *************************************************************************************/ /* END LEGAL */ -#include -#include -#include +#include +#include +#include using namespace Grid; using namespace QCD; diff --git a/extras/Hadrons/VirtualMachine.hpp b/Hadrons/VirtualMachine.hpp similarity index 98% rename from extras/Hadrons/VirtualMachine.hpp rename to Hadrons/VirtualMachine.hpp index 7e6e36c2..aac7e8c4 100644 --- a/extras/Hadrons/VirtualMachine.hpp +++ b/Hadrons/VirtualMachine.hpp @@ -29,9 +29,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #ifndef Hadrons_VirtualMachine_hpp_ #define Hadrons_VirtualMachine_hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/extras/Hadrons/add_module.sh b/Hadrons/add_module.sh similarity index 100% rename from extras/Hadrons/add_module.sh rename to Hadrons/add_module.sh diff --git a/extras/Hadrons/add_module_template.sh b/Hadrons/add_module_template.sh similarity index 100% rename from extras/Hadrons/add_module_template.sh rename to Hadrons/add_module_template.sh diff --git a/extras/Hadrons/make_module_inst.sh b/Hadrons/make_module_inst.sh similarity index 100% rename from extras/Hadrons/make_module_inst.sh rename to Hadrons/make_module_inst.sh diff --git a/extras/Hadrons/make_module_list.sh b/Hadrons/make_module_list.sh similarity index 100% rename from extras/Hadrons/make_module_list.sh rename to Hadrons/make_module_list.sh diff --git a/extras/Hadrons/modules.inc b/Hadrons/modules.inc similarity index 100% rename from extras/Hadrons/modules.inc rename to Hadrons/modules.inc diff --git a/Makefile.am b/Makefile.am index b4f4f788..1901305b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ # additional include paths necessary to compile the C++ library -SUBDIRS = lib benchmarks tests extras +SUBDIRS = Grid Hadrons benchmarks tests include $(top_srcdir)/doxygen.inc @@ -8,7 +8,7 @@ bin_SCRIPTS=grid-config BUILT_SOURCES = version.h version.h: - if [ `git status --porcelain | wc -l` -gt 0 ]; then a="uncommited changes"; else a="no uncommitted changes"; fi; echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > $(srcdir)/lib/version.h + if [ `git status --porcelain | wc -l` -gt 0 ]; then a="uncommited changes"; else a="no uncommitted changes"; fi; echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > $(srcdir)/Grid/version.h .PHONY: bench check tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) diff --git a/configure.ac b/configure.ac index 774824e7..ee8a0620 100644 --- a/configure.ac +++ b/configure.ac @@ -6,8 +6,8 @@ AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([subdir-objects 1.13]) AM_EXTRA_RECURSIVE_TARGETS([tests bench]) AC_CONFIG_MACRO_DIR([m4]) -AC_CONFIG_SRCDIR([lib/Grid.h]) -AC_CONFIG_HEADERS([lib/Config.h],[sed -i 's|PACKAGE_|GRID_|' lib/Config.h]) +AC_CONFIG_SRCDIR([Grid/Grid.h]) +AC_CONFIG_HEADERS([Grid/Config.h],[sed -i 's|PACKAGE_|GRID_|' Grid/Config.h]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) ################ Get git info @@ -491,9 +491,9 @@ GRID_LIBS=$LIBS GRID_SHORT_SHA=`git rev-parse --short HEAD` GRID_SHA=`git rev-parse HEAD` GRID_BRANCH=`git rev-parse --abbrev-ref HEAD` -AM_CXXFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/include/Grid $AM_CXXFLAGS" -AM_CFLAGS="-I${abs_srcdir}/include -I${abs_srcdir}/include/Grid $AM_CFLAGS" -AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS" +AM_CXXFLAGS="-I${abs_srcdir} $AM_CXXFLAGS" +AM_CFLAGS="-I${abs_srcdir} $AM_CFLAGS" +AM_LDFLAGS="-L${cwd}/Grid $AM_LDFLAGS" AC_SUBST([AM_CFLAGS]) AC_SUBST([AM_CXXFLAGS]) AC_SUBST([AM_LDFLAGS]) @@ -547,7 +547,7 @@ AC_SUBST([GRID_SUMMARY]) AC_CONFIG_FILES([grid-config], [chmod +x grid-config]) AC_CONFIG_FILES(Makefile) -AC_CONFIG_FILES(lib/Makefile) +AC_CONFIG_FILES(Grid/Makefile) AC_CONFIG_FILES(tests/Makefile) AC_CONFIG_FILES(tests/IO/Makefile) AC_CONFIG_FILES(tests/core/Makefile) @@ -561,8 +561,7 @@ AC_CONFIG_FILES(tests/smearing/Makefile) AC_CONFIG_FILES(tests/qdpxx/Makefile) AC_CONFIG_FILES(tests/testu01/Makefile) AC_CONFIG_FILES(benchmarks/Makefile) -AC_CONFIG_FILES(extras/Makefile) -AC_CONFIG_FILES(extras/Hadrons/Makefile) +AC_CONFIG_FILES(Hadrons/Makefile) AC_OUTPUT echo "" diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp deleted file mode 100644 index 86d50755..00000000 --- a/extras/Hadrons/Modules.hpp +++ /dev/null @@ -1,96 +0,0 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: extras/Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Guido Cossu -Author: James Harrison -Author: Lanny91 -Author: Peter Boyle -Author: Vera Guelpers -Author: fionnoh -Author: pretidav - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/extras/Makefile.am b/extras/Makefile.am deleted file mode 100644 index d8c2b675..00000000 --- a/extras/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = Hadrons \ No newline at end of file diff --git a/extras/qed-fvol/Global.cc b/extras/qed-fvol/Global.cc deleted file mode 100644 index 57ed97cc..00000000 --- a/extras/qed-fvol/Global.cc +++ /dev/null @@ -1,11 +0,0 @@ -#include - -using namespace Grid; -using namespace QCD; -using namespace QedFVol; - -QedFVolLogger QedFVol::QedFVolLogError(1,"Error"); -QedFVolLogger QedFVol::QedFVolLogWarning(1,"Warning"); -QedFVolLogger QedFVol::QedFVolLogMessage(1,"Message"); -QedFVolLogger QedFVol::QedFVolLogIterative(1,"Iterative"); -QedFVolLogger QedFVol::QedFVolLogDebug(1,"Debug"); diff --git a/extras/qed-fvol/Global.hpp b/extras/qed-fvol/Global.hpp deleted file mode 100644 index 7f07200d..00000000 --- a/extras/qed-fvol/Global.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef QedFVol_Global_hpp_ -#define QedFVol_Global_hpp_ - -#include - -#define BEGIN_QEDFVOL_NAMESPACE \ -namespace Grid {\ -using namespace QCD;\ -namespace QedFVol {\ -using Grid::operator<<; -#define END_QEDFVOL_NAMESPACE }} - -/* the 'using Grid::operator<<;' statement prevents a very nasty compilation - * error with GCC (clang compiles fine without it). - */ - -BEGIN_QEDFVOL_NAMESPACE - -class QedFVolLogger: public Logger -{ -public: - QedFVolLogger(int on, std::string nm): Logger("QedFVol", on, nm, - GridLogColours, "BLACK"){}; -}; - -#define LOG(channel) std::cout << QedFVolLog##channel -#define QEDFVOL_ERROR(msg)\ -LOG(Error) << msg << " (" << __FUNCTION__ << " at " << __FILE__ << ":"\ - << __LINE__ << ")" << std::endl;\ -abort(); - -#define DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; - -extern QedFVolLogger QedFVolLogError; -extern QedFVolLogger QedFVolLogWarning; -extern QedFVolLogger QedFVolLogMessage; -extern QedFVolLogger QedFVolLogIterative; -extern QedFVolLogger QedFVolLogDebug; - -END_QEDFVOL_NAMESPACE - -#endif // QedFVol_Global_hpp_ diff --git a/extras/qed-fvol/Makefile.am b/extras/qed-fvol/Makefile.am deleted file mode 100644 index 0a9030c7..00000000 --- a/extras/qed-fvol/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -AM_CXXFLAGS += -I$(top_srcdir)/extras - -bin_PROGRAMS = qed-fvol - -qed_fvol_SOURCES = \ - qed-fvol.cc \ - Global.cc - -qed_fvol_LDADD = -lGrid diff --git a/extras/qed-fvol/WilsonLoops.h b/extras/qed-fvol/WilsonLoops.h deleted file mode 100644 index 98db6b7a..00000000 --- a/extras/qed-fvol/WilsonLoops.h +++ /dev/null @@ -1,265 +0,0 @@ -#ifndef QEDFVOL_WILSONLOOPS_H -#define QEDFVOL_WILSONLOOPS_H - -#include - -BEGIN_QEDFVOL_NAMESPACE - -template class NewWilsonLoops : public Gimpl { -public: - INHERIT_GIMPL_TYPES(Gimpl); - - typedef typename Gimpl::GaugeLinkField GaugeMat; - typedef typename Gimpl::GaugeField GaugeLorentz; - - ////////////////////////////////////////////////// - // directed plaquette oriented in mu,nu plane - ////////////////////////////////////////////////// - static void dirPlaquette(GaugeMat &plaq, const std::vector &U, - const int mu, const int nu) { - // Annoyingly, must use either scope resolution to find dependent base - // class, - // or this-> ; there is no "this" in a static method. This forces explicit - // Gimpl scope - // resolution throughout the usage in this file, and rather defeats the - // purpose of deriving - // from Gimpl. - plaq = Gimpl::CovShiftBackward( - U[mu], mu, Gimpl::CovShiftBackward( - U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[nu]))); - } - ////////////////////////////////////////////////// - // trace of directed plaquette oriented in mu,nu plane - ////////////////////////////////////////////////// - static void traceDirPlaquette(LatticeComplex &plaq, - const std::vector &U, const int mu, - const int nu) { - GaugeMat sp(U[0]._grid); - dirPlaquette(sp, U, mu, nu); - plaq = trace(sp); - } - ////////////////////////////////////////////////// - // sum over all planes of plaquette - ////////////////////////////////////////////////// - static void sitePlaquette(LatticeComplex &Plaq, - const std::vector &U) { - LatticeComplex sitePlaq(U[0]._grid); - Plaq = zero; - for (int mu = 1; mu < U[0]._grid->_ndimension; mu++) { - for (int nu = 0; nu < mu; nu++) { - traceDirPlaquette(sitePlaq, U, mu, nu); - Plaq = Plaq + sitePlaq; - } - } - } - ////////////////////////////////////////////////// - // sum over all x,y,z,t and over all planes of plaquette - ////////////////////////////////////////////////// - static Real sumPlaquette(const GaugeLorentz &Umu) { - std::vector U(4, Umu._grid); - - for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { - U[mu] = PeekIndex(Umu, mu); - } - - LatticeComplex Plaq(Umu._grid); - - sitePlaquette(Plaq, U); - - TComplex Tp = sum(Plaq); - Complex p = TensorRemove(Tp); - return p.real(); - } - ////////////////////////////////////////////////// - // average over all x,y,z,t and over all planes of plaquette - ////////////////////////////////////////////////// - static Real avgPlaquette(const GaugeLorentz &Umu) { - int ndim = Umu._grid->_ndimension; - Real sumplaq = sumPlaquette(Umu); - Real vol = Umu._grid->gSites(); - Real faces = (1.0 * ndim * (ndim - 1)) / 2.0; - return sumplaq / vol / faces / Nc; // Nc dependent... FIXME - } - - ////////////////////////////////////////////////// - // Wilson loop of size (R1, R2), oriented in mu,nu plane - ////////////////////////////////////////////////// - static void wilsonLoop(GaugeMat &wl, const std::vector &U, - const int Rmu, const int Rnu, - const int mu, const int nu) { - wl = U[nu]; - - for(int i = 0; i < Rnu-1; i++){ - wl = Gimpl::CovShiftForward(U[nu], nu, wl); - } - - for(int i = 0; i < Rmu; i++){ - wl = Gimpl::CovShiftForward(U[mu], mu, wl); - } - - for(int i = 0; i < Rnu; i++){ - wl = Gimpl::CovShiftBackward(U[nu], nu, wl); - } - - for(int i = 0; i < Rmu; i++){ - wl = Gimpl::CovShiftBackward(U[mu], mu, wl); - } - } - ////////////////////////////////////////////////// - // trace of Wilson Loop oriented in mu,nu plane - ////////////////////////////////////////////////// - static void traceWilsonLoop(LatticeComplex &wl, - const std::vector &U, - const int Rmu, const int Rnu, - const int mu, const int nu) { - GaugeMat sp(U[0]._grid); - wilsonLoop(sp, U, Rmu, Rnu, mu, nu); - wl = trace(sp); - } - ////////////////////////////////////////////////// - // sum over all planes of Wilson loop - ////////////////////////////////////////////////// - static void siteWilsonLoop(LatticeComplex &Wl, - const std::vector &U, - const int R1, const int R2) { - LatticeComplex siteWl(U[0]._grid); - Wl = zero; - for (int mu = 1; mu < U[0]._grid->_ndimension; mu++) { - for (int nu = 0; nu < mu; nu++) { - traceWilsonLoop(siteWl, U, R1, R2, mu, nu); - Wl = Wl + siteWl; - traceWilsonLoop(siteWl, U, R2, R1, mu, nu); - Wl = Wl + siteWl; - } - } - } - ////////////////////////////////////////////////// - // sum over planes of Wilson loop with length R1 - // in the time direction - ////////////////////////////////////////////////// - static void siteTimelikeWilsonLoop(LatticeComplex &Wl, - const std::vector &U, - const int R1, const int R2) { - LatticeComplex siteWl(U[0]._grid); - - int ndim = U[0]._grid->_ndimension; - - Wl = zero; - for (int nu = 0; nu < ndim - 1; nu++) { - traceWilsonLoop(siteWl, U, R1, R2, ndim-1, nu); - Wl = Wl + siteWl; - } - } - ////////////////////////////////////////////////// - // sum Wilson loop over all planes orthogonal to the time direction - ////////////////////////////////////////////////// - static void siteSpatialWilsonLoop(LatticeComplex &Wl, - const std::vector &U, - const int R1, const int R2) { - LatticeComplex siteWl(U[0]._grid); - - Wl = zero; - for (int mu = 1; mu < U[0]._grid->_ndimension - 1; mu++) { - for (int nu = 0; nu < mu; nu++) { - traceWilsonLoop(siteWl, U, R1, R2, mu, nu); - Wl = Wl + siteWl; - traceWilsonLoop(siteWl, U, R2, R1, mu, nu); - Wl = Wl + siteWl; - } - } - } - ////////////////////////////////////////////////// - // sum over all x,y,z,t and over all planes of Wilson loop - ////////////////////////////////////////////////// - static Real sumWilsonLoop(const GaugeLorentz &Umu, - const int R1, const int R2) { - std::vector U(4, Umu._grid); - - for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { - U[mu] = PeekIndex(Umu, mu); - } - - LatticeComplex Wl(Umu._grid); - - siteWilsonLoop(Wl, U, R1, R2); - - TComplex Tp = sum(Wl); - Complex p = TensorRemove(Tp); - return p.real(); - } - ////////////////////////////////////////////////// - // sum over all x,y,z,t and over all planes of timelike Wilson loop - ////////////////////////////////////////////////// - static Real sumTimelikeWilsonLoop(const GaugeLorentz &Umu, - const int R1, const int R2) { - std::vector U(4, Umu._grid); - - for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { - U[mu] = PeekIndex(Umu, mu); - } - - LatticeComplex Wl(Umu._grid); - - siteTimelikeWilsonLoop(Wl, U, R1, R2); - - TComplex Tp = sum(Wl); - Complex p = TensorRemove(Tp); - return p.real(); - } - ////////////////////////////////////////////////// - // sum over all x,y,z,t and over all planes of spatial Wilson loop - ////////////////////////////////////////////////// - static Real sumSpatialWilsonLoop(const GaugeLorentz &Umu, - const int R1, const int R2) { - std::vector U(4, Umu._grid); - - for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { - U[mu] = PeekIndex(Umu, mu); - } - - LatticeComplex Wl(Umu._grid); - - siteSpatialWilsonLoop(Wl, U, R1, R2); - - TComplex Tp = sum(Wl); - Complex p = TensorRemove(Tp); - return p.real(); - } - ////////////////////////////////////////////////// - // average over all x,y,z,t and over all planes of Wilson loop - ////////////////////////////////////////////////// - static Real avgWilsonLoop(const GaugeLorentz &Umu, - const int R1, const int R2) { - int ndim = Umu._grid->_ndimension; - Real sumWl = sumWilsonLoop(Umu, R1, R2); - Real vol = Umu._grid->gSites(); - Real faces = 1.0 * ndim * (ndim - 1); - return sumWl / vol / faces / Nc; // Nc dependent... FIXME - } - ////////////////////////////////////////////////// - // average over all x,y,z,t and over all planes of timelike Wilson loop - ////////////////////////////////////////////////// - static Real avgTimelikeWilsonLoop(const GaugeLorentz &Umu, - const int R1, const int R2) { - int ndim = Umu._grid->_ndimension; - Real sumWl = sumTimelikeWilsonLoop(Umu, R1, R2); - Real vol = Umu._grid->gSites(); - Real faces = 1.0 * (ndim - 1); - return sumWl / vol / faces / Nc; // Nc dependent... FIXME - } - ////////////////////////////////////////////////// - // average over all x,y,z,t and over all planes of spatial Wilson loop - ////////////////////////////////////////////////// - static Real avgSpatialWilsonLoop(const GaugeLorentz &Umu, - const int R1, const int R2) { - int ndim = Umu._grid->_ndimension; - Real sumWl = sumSpatialWilsonLoop(Umu, R1, R2); - Real vol = Umu._grid->gSites(); - Real faces = 1.0 * (ndim - 1) * (ndim - 2); - return sumWl / vol / faces / Nc; // Nc dependent... FIXME - } -}; - -END_QEDFVOL_NAMESPACE - -#endif // QEDFVOL_WILSONLOOPS_H \ No newline at end of file diff --git a/extras/qed-fvol/qed-fvol.cc b/extras/qed-fvol/qed-fvol.cc deleted file mode 100644 index 3ecac2fc..00000000 --- a/extras/qed-fvol/qed-fvol.cc +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include - -using namespace Grid; -using namespace QCD; -using namespace QedFVol; - -typedef PeriodicGaugeImpl QedPeriodicGimplR; -typedef PhotonR::GaugeField EmField; -typedef PhotonR::GaugeLinkField EmComp; - -const int NCONFIGS = 10; -const int NWILSON = 10; - -int main(int argc, char *argv[]) -{ - // parse command line - std::string parameterFileName; - - if (argc < 2) - { - std::cerr << "usage: " << argv[0] << " [Grid options]"; - std::cerr << std::endl; - std::exit(EXIT_FAILURE); - } - parameterFileName = argv[1]; - - // initialization - Grid_init(&argc, &argv); - QedFVolLogError.Active(GridLogError.isActive()); - QedFVolLogWarning.Active(GridLogWarning.isActive()); - QedFVolLogMessage.Active(GridLogMessage.isActive()); - QedFVolLogIterative.Active(GridLogIterative.isActive()); - QedFVolLogDebug.Active(GridLogDebug.isActive()); - LOG(Message) << "Grid initialized" << std::endl; - - // QED stuff - std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(4, vComplex::Nsimd()); - std::vector mpi_layout = GridDefaultMpi(); - GridCartesian grid(latt_size,simd_layout,mpi_layout); - GridParallelRNG pRNG(&grid); - PhotonR photon(PhotonR::Gauge::feynman, - PhotonR::ZmScheme::qedL); - EmField a(&grid); - EmField expA(&grid); - - Complex imag_unit(0, 1); - - Real wlA; - std::vector logWlAvg(NWILSON, 0.0), logWlTime(NWILSON, 0.0), logWlSpace(NWILSON, 0.0); - - pRNG.SeedRandomDevice(); - - LOG(Message) << "Wilson loop calculation beginning" << std::endl; - for(int ic = 0; ic < NCONFIGS; ic++){ - LOG(Message) << "Configuration " << ic <::avgWilsonLoop(expA, iw, iw) * 3; - logWlAvg[iw-1] -= 2*log(wlA); - wlA = NewWilsonLoops::avgTimelikeWilsonLoop(expA, iw, iw) * 3; - logWlTime[iw-1] -= 2*log(wlA); - wlA = NewWilsonLoops::avgSpatialWilsonLoop(expA, iw, iw) * 3; - logWlSpace[iw-1] -= 2*log(wlA); - } - } - LOG(Message) << "Wilson loop calculation completed" << std::endl; - - // Calculate Wilson loops - for(int iw=1; iw<=10; iw++){ - LOG(Message) << iw << 'x' << iw << " Wilson loop" << std::endl; - LOG(Message) << "-2log(W) average: " << logWlAvg[iw-1]/NCONFIGS << std::endl; - LOG(Message) << "-2log(W) timelike: " << logWlTime[iw-1]/NCONFIGS << std::endl; - LOG(Message) << "-2log(W) spatial: " << logWlSpace[iw-1]/NCONFIGS << std::endl; - } - - // epilogue - LOG(Message) << "Grid is finalizing now" << std::endl; - Grid_finalize(); - - return EXIT_SUCCESS; -} diff --git a/lib/.dirstamp b/lib/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/Hadrons b/lib/Hadrons deleted file mode 120000 index 1f422592..00000000 --- a/lib/Hadrons +++ /dev/null @@ -1 +0,0 @@ -../extras/Hadrons \ No newline at end of file diff --git a/lib/qcd/hmc/.dirstamp b/lib/qcd/hmc/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/qcd/hmc/integrators/.dirstamp b/lib/qcd/hmc/integrators/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/simd/.dirstamp b/lib/simd/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/scripts/filelist b/scripts/filelist index 74f8e334..6db53687 100755 --- a/scripts/filelist +++ b/scripts/filelist @@ -3,7 +3,7 @@ home=`pwd` # library Make.inc -cd $home/lib +cd $home/Grid HFILES=`find . -type f -name '*.h' -not -name '*Hdf5*' -not -path '*/gamma-gen/*' -not -path '*/Old/*' -not -path '*/Eigen/*'` HFILES="$HFILES" CCFILES=`find . -type f -name '*.cc' -not -path '*/gamma-gen/*' -not -name '*Communicator*.cc' -not -name '*SharedMemory*.cc' -not -name '*Hdf5*'` diff --git a/scripts/update_eigen.sh b/scripts/update_eigen.sh index 5ed59655..b1834175 100755 --- a/scripts/update_eigen.sh +++ b/scripts/update_eigen.sh @@ -7,7 +7,7 @@ fi ARC=$1 INITDIR=`pwd` -rm -f lib/Eigen +rm -f Grid/Eigen rm -rf Eigen ################## @@ -21,13 +21,13 @@ ARCDIR=`tar -tf ${ARC} | head -n1 | sed -e 's@/.*@@'` ############################### mv ${ARCDIR} Eigen -ln -s ${INITDIR}/Eigen/Eigen ${INITDIR}/lib/Eigen -ln -s ${INITDIR}/Eigen/unsupported/Eigen ${INITDIR}/lib/Eigen/unsupported +ln -s ${INITDIR}/Eigen/Eigen ${INITDIR}/Grid/Eigen +ln -s ${INITDIR}/Eigen/unsupported/Eigen ${INITDIR}/Grid/Eigen/unsupported # Eigen source headers -cd ${INITDIR}/lib -echo 'eigen_files =\' > ${INITDIR}/lib/Eigen.inc -find -L Eigen -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/lib/Eigen.inc +cd ${INITDIR}/Grid +echo 'eigen_files =\' > ${INITDIR}/Grid/Eigen.inc +find -L Eigen -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> ${INITDIR}/Grid/Eigen.inc ################################### # back to home diff --git a/tests/hadrons/Test_QED.cc b/tests/hadrons/Test_QED.cc index eecc6d6a..6d89ad23 100644 --- a/tests/hadrons/Test_QED.cc +++ b/tests/hadrons/Test_QED.cc @@ -26,8 +26,8 @@ directory. *******************************************************************************/ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_free_prop.cc b/tests/hadrons/Test_free_prop.cc index a1a5aadd..bc7521bf 100644 --- a/tests/hadrons/Test_free_prop.cc +++ b/tests/hadrons/Test_free_prop.cc @@ -26,8 +26,8 @@ directory. *******************************************************************************/ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons.hpp b/tests/hadrons/Test_hadrons.hpp index fc061459..a56a18da 100644 --- a/tests/hadrons/Test_hadrons.hpp +++ b/tests/hadrons/Test_hadrons.hpp @@ -25,8 +25,8 @@ directory. *******************************************************************************/ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons_meson_3pt.cc b/tests/hadrons/Test_hadrons_meson_3pt.cc index 243ffebb..6f7f1773 100644 --- a/tests/hadrons/Test_hadrons_meson_3pt.cc +++ b/tests/hadrons/Test_hadrons_meson_3pt.cc @@ -25,8 +25,8 @@ directory. *******************************************************************************/ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons_spectrum.cc b/tests/hadrons/Test_hadrons_spectrum.cc index f41bd5b4..0038fcbd 100644 --- a/tests/hadrons/Test_hadrons_spectrum.cc +++ b/tests/hadrons/Test_hadrons_spectrum.cc @@ -25,8 +25,8 @@ directory. *******************************************************************************/ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; diff --git a/tests/hadrons/Test_hadrons_wilsonFund.cc b/tests/hadrons/Test_hadrons_wilsonFund.cc index bad0f2d3..f2d1227e 100644 --- a/tests/hadrons/Test_hadrons_wilsonFund.cc +++ b/tests/hadrons/Test_hadrons_wilsonFund.cc @@ -25,8 +25,8 @@ directory. *******************************************************************************/ -#include -#include +#include +#include using namespace Grid; using namespace Hadrons; From 3df6743396111e854391263166f1e321e565c3bc Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 16:54:57 +0100 Subject: [PATCH 458/620] more build system cleaning and patch for bad include in Eigen --- bootstrap.sh | 7 ++++++- prerequisites/fftw-3.3.4.tar.gz | Bin 3940427 -> 0 bytes scripts/eigen-3.3.5.Tensor.patch | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) delete mode 100644 prerequisites/fftw-3.3.4.tar.gz create mode 100644 scripts/eigen-3.3.5.Tensor.patch diff --git a/bootstrap.sh b/bootstrap.sh index 12d257f1..cffe1b8c 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -3,7 +3,12 @@ EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.5.tar.bz2' echo "-- deploying Eigen source..." -wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh `basename ${EIGEN_URL}` && rm `basename ${EIGEN_URL}` +ARC=`basename ${EIGEN_URL}` +wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh ${ARC} && rm ${ARC} +# patch for non-portable includes in Eigen 3.3.5 +# apparently already fixed in Eigen HEAD so it should not be +# a problem in the future (A.P.) +patch Grid/Eigen/unsupported/CXX11/Tensor scripts/eigen-3.3.5.Tensor.patch echo '-- generating Make.inc files...' ./scripts/filelist diff --git a/prerequisites/fftw-3.3.4.tar.gz b/prerequisites/fftw-3.3.4.tar.gz deleted file mode 100644 index df0f808db8a942711210284b6df1171a000c5e5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3940427 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 z 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

dQ`*6tuFwkC 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

b^? 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

%j(b}SBHXQoZPNQjuJg$x0KLHM8P0#%oMjD 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 z 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∓J-9nV9SM_o@L_3lacygJ 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≷r0DmNy}o|V`MAztwQY={pTgAP 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
lW6J}Kh-$b1Gb1afsDa0^v-)a~R^{W{^L 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%0A)b3>I;4fYq+=`v4SxRw@T|ITpNGV6NpUV*z)S)I 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
qa$jjbQ&e$M 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 z

-aGer&L-e$Y?!fl=+XTfzwj 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

    >S&csod}&87bQn6qh5too*AB-QD_ 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%0Do}5rB$t1h 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%0AjS} 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
    yjmrB3u#&fOicZSLArI9h_gYu9TF3h5e|ynDO* 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

    4=t#le16pO(#2`2{5IR==_Au3GT2ke5wDz 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%0DI2&w(j}eF$Jx{dxcYt($(0yfCvgc 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�JIk8vO+#O?wvcs!ntSc530)+ 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 cG~0XwWrzl-Joh)Rc)~=)59Zuyu>7v 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

    Xhi2KjBINMn@6cgS8Z5F-_ckTSu z&2!$=R;C=?4@sQYz3R3;GC~7HEt3N$xndjrFb2D^2pdzVJc1Pn>kW7pq4(0C@%bi< zlo#sAw8zbx=vLWP`GAg+^|?~hna+}@vEdB{ZA;%)V)$&TD%*h<*26{JuARL%nIm_?)ogKZ8bNzV+DAe zUGm)2x(JGCao$$Ga5II@Yoy;p)w<;b*vz+WSOLT~_FSy!*WsSEtoYa5MK0)@PRXvD zmJ5qs+M6(Jxa$|T^{!yo%?pXTN-%8Lm`{GdIWkw>?JC4@ZEAmNG_C-e%!@u7{!_hv z)Qd*-!W`1(Lv72s>9rqt-jn~}xqsmQoP4aRN4ZW{Ef1CEh*a)vRPlpHNNeMG!JsT@ z!ID)rVMwZ4(Z`oBYc)E}|6g!$>{pO04RD}5qWu)h{Z~Y!1ZWZ})UpZ?U1HyE=?sv2 zmbdeF?pnYlGD_jJ^*h40k)0dZQHCW0#GH6RB&s(qfk;^az!R5$EC7BiX#F^22}lu| zSGQ>rn*YHmZd(4YM#z@S!jE%{^)7XFQMOvHv8VwNe{A-&W3Lycx#c!~PDZoBte5^# zUXjrTAkjhT%Gp}-Z$NG-*;mG7UB+<#r+1LKnb)^|x_-xcBLuW3PcWT{| zzjxR=?=`G^h38CyP&8?E`}(Hv?dnQ!n5?Pgo%_70MI!3u?b)Wu99loGWyv#=`_0EH zZ$|N^)1@HpMj~lp{q{~t^}Dl4;JT9W$N%}BZu2U!lb5`ipB><@6W+fN5+jYfWq>PR z1oFX-#&@u&+s>wK%<^Z1>ajVgPHTW}_GrDuJAKpEncr8QP0Hrp%=fZ7^u*5k;y`-V zyY|Imu7A~MB>=-cMry-YAb-rl>H=74P)eKp){b%A^4A%gRn;SJd>W>W%H6KWVph{~ z(U$w0oHqS>RGFAIJ%z|l32QhOb960M_T95E~~epH!pu4HNF;lVyOAX(;3M zJc%YwcRYn%?J0)6b6KP;8=IkTbX)HZmg4KCH`K3hMTpi8xN5+J*ABSjM|!*lO8N121rQBnnfns|C4@irE&}g;FeiBKqV*Jx~>zfN>wd47*vAKqn1nRci0-%N2hUd zFS~wg^ZR$mgdb7M5OGFL3b;qy0e8;RH=P-q>gZ4qjxwW}nE30*^yl0E~R$&!%38hzCFRUWf?hH2{ns z48DKn-}(>SC9n9s34YuI{T*JrVHx0;-fR;OS?BqF(L7B!s2*Wq^*LT@ag$$f@#88| z%&C~wXPDBb=Fid8|Bjmc05WX@|6ri?Fjn*v8_MlH;TpqI^V>x;dgO)B7#_N2KhXuQql z=g(!AUej`%N3Ds~C(O;#_OFm<%bSAw$t!-wCa`d4u=mCzDcF*vsK(MU$`hzZ&g}0nJN=pI6tyc86^hIxL}J^AkQSAtyll ziFCcb_Iq>wQlimB|9extN|^0?lVd%OM)dw<8IuO@=dz+Bv~`6=&Ti4vdV@(Buc==Q ztTr#UO9{UH*zh4o{?*vtusz;okJc04?0V;MWG!HGv420lHmRi#)aSRZ4htq|g?pU@ zQ+D48c&0>`r?m4aa2)epcoRNKq}Mw6un^n->IOuWp+|Tvt%G;KeXq_l=!EWUHZE1d zJ&!zX|B17`!hbr&@LN52KcsSZ_cBhedhn-dT7E-9Rvconijj0m5u6{t>Qk$EG6KX5 zG6%!WKMkY$7_p^qn(*nTzq#SetK9eFLx71b7#t1HFV|NtOr(0=HWp&BPmbYtBUeIv z_v;G$W1b=z=-kq}gW|*nX_g@a>1tw`^oXj~kxQk&A{f|k$(&KAPjZ0MP$qM=t$^zL zKc{Wun%KGd4A5T>O)+TO-lVAAjum{l=E*e?2+7~s(7l~ApttOQkU0a9NH++7$dQV8 z>?Qmwx+fuD$@I5@-a``!b)6Wb;yeyisF?fj*}CTNlol9D%rjm$4Wi@Vb0ghC@TZ_!<{xG69v-eSN7Ij&Gg0=)8h?e_*->2_jW@gPtxt^C%wTNx zK*{;+e(i1kPLgsElevGd{+(?$c2f1PFpAGG3Xk`Zh7etY{BL;V&|@f8Pt3|C(-l?cPJaMD7X zl5G9j>-wqme?P z8ovVUv+7tJ+wyntlSc@JWmDDgVMB^6WBR2)Ymi>}1~A3#_xP?sBoYlHNiC6O?QCZR zw0NI7X+s^gEm5oy5WVbJ5%$q>^6MS4Ji2zvi#tYxig$3pDBod7P!TzV@HI+i@vkny z1lXXirHRXZo>XD*Sq55`3DiWE%;C~d)T=Ad4EvI$F~d-Va+gJHY=Iw#ez^+)30p4q z-oV#Aj$KC`>azrAPuwc@{-wsrM>*h`{-GP)b#tVyKn!#qib62xg?OXeml&w*4IqAh zc(0J=BVQtCCvUQT;+C0&VgOsgJcukVUU#n?7GlN~!%1;<(&3EIO?oAv`3wbDUru1r z_!qDqj|RXXWnN)M7ZIae2D6z(4j~R6D4Zvkh&-*2W{8jrZ$rjWRK$&k?g_4-)3r&22ilA0KfK!5LOs4@u z*~8NNW-OAm5`h-)%Oe>i>|*b#?l8a(qoP5P|M{48Y#5qsDC`W-K`-cokqNIHT+|PN zJ}6M`fM20fD0BL|<-Vd*t@~QKfE?unCu}qNd&+8y;Q zt?v}rsjvK>W?Wgu-cB4GyEitzzw6nOe*~Qvxa9{*c!qDB;q78W(G!<`i-LvGjD=da zw5>{qOZ;*v$_)r(cWo!6U(HAlOIx{hTbcz>oBxqUz%>Zzt%)@!Dq%#<8X=s{!j|H` z+EjgB%%Cj&N%pJ&^cRJD4TF^%)Kp}LFZr}iEt4YQ@s54r^smQPO@uS4{#NsPZH_c; zLT=!2EbZ8yz!aPz>QY&rK-tMghM?QiM?}sXn8u%QR!R5MU1AOq9h{_ISo|Z?uN;gY z7T29vaa>e6A#YPP6R0qACdnoGC}FzFVYMETk^ReMWi{nv|KheQ0$vehal^la;-CIN z1%YVN%yb!-;1Kd&T(Z91aqq@*%jfp1;&M&muU%z$qY3+ru`1=D$Ag-2y&S@uF_c(P zjF3G><)@miI3JGOgSR;7=}b?NT!9F4f@wY?)4M}=y9X>Iw1ojs=LUmZ;g=e~;~8^c z17eHT%pz-lCZezhS-`di&FFH~_M-BN5>N`c-nJh_PfXkkOy0KAxwj$yQCIP;90@Jg zr!uY2-m2Wo$;U)x;7PEnGDXLZIGBn{WVNy`m0vGZOPJ}x!x3LO&q_A3zrxq@DR7zX zjcv`JVdP3^yCb#jr?lPX;lYS@L1U>bLKJTOk#QC`YDO3$;R?Bfj(4UME#wFkHkNNE z3AhVOr}Y0_j%CxI{SfYcKp>Ti*@O_fTx{@&UK4X+$CTk6vSCv;+g_fk0C39yE5?_P z`P?}jT*)=v#;-PV19)u1p6+|A>12^2=|p|nkn9zw>=$JxCp0^p2eL>Ha6GUM(jGGo zICpsA8H9lk?gwNvK#eX)`smHKKxS13Jl`yULO3w6v*ymFys$1h8*eTXe}M9s*+ zs>B`#IAfcvj_K4tc9@s1h=$d@ri1I$%K+2&SAUzCtUBK$Lza)R0rXP`!_AG;^}8o| z(YOoij_jqPM7HQg!4p*{5KP(wHWV53%@C?l1R>haGjNPA{P*$AV5^jQor#dmQ|96XaSKCH?&Jo=SfOQ+{63N>^!>#~=r zS%^B3RETuq>npioOG(|4)mgH>RH|-JCf`(8&GI{^HAT!=~sB;NQ|GGk*ys+737 zh}S`q21?vt)h}s3x>ZOb@hedlm&m!Pr+LG_G;j(68`J52NY0uzkX#uX`M%mhg+Vu) z895Du3?W36TsM=Nmb_QSit0QM_S!VAV*3{4(H^-tEKA#tPDsqJaL&9GN6Ei3YIZv1 z0gCmHHn4C{x#XR5R))1JFw45N;%7e4e8W`ZJ?tz=C1a^MuRrwt)F3Pjl86ovh4C-o z&9~rjmS;G;d_B(*>7+D=e8MbPcyz2!exWd!a0nq&0P~{%E~!XQRy}OxaK@sf8}>*< z2{DyaBQKH`+JUX;#ncFzozj^G&$y)(Qe89;Zie`SwQC^x#RXY1a{=7qFldXx^23Yg z>8A(+TsHL!#C=HxN8GkENspJn3<%AbyH@~+nVJF9$6A;)(Eb9d6;?gCs9JttRzcNa zrAph7SG-z8XTTAUL|o7X_7dkPOpy)jUgVw4n-@q=SNPO=6aDCr=7r6{5$i5T)sW>N z1TXZrb_zEmh&3e}uzCWvUhs|3Hcl4_+^9JgidFDih+k2HVk9)v??mO8m0Kb3DvbRN z_TZR_Q>BFnGCg8y>xumgZ|HfaW4>VYEOYng73?WjiAH(r zqNWI^@oE_40?khlo4Cx)sSK--)mndM(ZiTVmVXVyVp^wOPpfa^bp~=*JgilB^(BQL z)coCdJkXspKzO8~sJAXLv2+NS^B>TRp}&RqB!sJnR<&+!XJ4`|$^@A&h?!Pyp{QT8 zFseH|)7!D;Ft&GnIVfFg6-L2_Iptyt#&P$OO=uqjO5{000k;W)U7~jhvl#GUI7Q0p zf*4$1kt5JklnQR-XUF6-?I7g{Tl}Gv2v9PM@%3FkJ;_=-;HZNHk@>6Ln?G!QZ(6xA ziX9xR$==~aT_U=HfFr>8+FNEUaaM`LpKAD*0zvN4%Z5irh-`Cf+ERe zJ7p?*YXM|-zrm)M284wUYPYs()exD`r zm5hL35S%b4j0RI_j6J`6R3hQXBDw_--&Nlt|I*{$v5KX9qewZB=3QW11in#i%5f&L zb##VR8|#onK)&>809Y?jr0nbqGp4ffDiUVXWu!&UQs_?7iLE)ag+I2QsGtZw-ioSb z$l@Bcl2d^y`NpkT5z7TTUrfJ0{&=_yAJT#|4F`nHol?dVY6Fb<21;1)n$%x(nkx@% z(kG6&1jszSO9d+9m-M27M7u)FOg>C!dsG;5MJa4UC`sINvXmNEiEwxe$Z>UIO?fszq&%6t9Ax{>3lK(m z44?gp5~I3h&`g~7KTbEBa*!PsO`H3Q+7x;J+X^gOBc`-W@w0_W)&qQSY8$ zo~VxW+Gv1sphP}2+h^SUQGi`2>=yLWCkI0F-@a}~H>m)hSlzfSNO-{d*^yE?aX#~SIFWU&8le3a>3gOBh zBtGX;c{nNO7YV8w2lo%*5W-Bg5S%EYwRUR^%cT|S&^vGF31k0v%1{$~H7Mnh069W; zKW7L9swW+-3jB}0Dc@@S>I{v48ukug0a9=YVh3z+Tt9InP{o}7b78@Bi00$t>W5<3 zrqUzvdySZ~NgCI13xn=WoUY4jIj(&&(>a`Wf4q3_RM~6?%^L6n4>l1LRh`PjO*?oF z&(9=2BuyFP{6{0D`H&k7DEY-%FX0lk5JjCqfQlJ=Se26nFaofqca)wt>> zR#im~U=5ffbWCRyA}V)D(VCu-a-}e0L_(`vV?6disi2bfD3p=eztc%d|Hsx_M%B>- zTc8OL2<{r(-QC^Y-QDeQaDuzLyF0-(1b2caxVyXa4*BlAZ@snNubIljGfzz{fW#e-Ff_>!1 z`8Mt~^euuT)RLmARD)NwV#0&2Ye4q!E5~j}**7Fj3}`UzFT~}Fqa|jV!;#=--;6h{ z7GR(@r`%S%*M7`Ti5x;PE&I?q3{N<5`8z^h5}HK83r8J?BjyHCE=x|_D1p1I4@+yi z+w5wiWQ{eY(E2mwL6N128w_F={jTsJJ*)x_49NJRL4%Dpsz=fYon+UueuZm3(DGOs z5|@YA`4oJ%qZ#ROZfCOm$E-5|ES|YL3YSS+vSFvY44aP^&6b7Y*H*;%iy_)G^CX61 zUpS+k1L&ENM<~QgqBHlk3Y6gtYTCRcw30v>ebyIcv>n|<<|uKP*4Zy4=(f2|~WNm&Rz;yP->sT_kn^qdjK#Nf#45tTcLUAkf;$neja>juqOL z#F%0OOu`DUe^YQJ03nvgaJlS7mb>)Ne)j69h2>LrqO|phShXdqDyvVKE~j&;39E0r zv(#a!1XC7A^}CJ|B=cS|Yj9O+@e32;C@eGYQ9yi2!cV`As;{RuflIq0yI=@O$wyMK z+j74Mf*dPP(2?hIOCc04zkq~?%7^U~U?%uYN)~`-^L4>M5|)dueF|J&13FS58XGIZ zWvI);B+HmH1wVr+J{gU)PpC*{+|}&MArd^?dt*7Ae%1=I&qK)01}fz(Z0ZQ|IQ-QQ z|5MiRU2pw|dPCX%yJ-TqI4&?e1{x%1>CX{PdGIb&5u^u?ZD?Z9jk|P)MH4S_4k#yN zaV5(_OQS5<^GHk)E(MXh& ze;EvbVVx`3Le$D#T3un)Ct0&@Dx$xFF%@`|}Chb^An zz6-n$`Em1XOI42THMCU{9#nv-30v$}A;r24;vwkJ&fEg;{rwVEPTjU0B%(uox8Zkg zzWM69#a5>FLBFdmXCri!rmk*QICXeJzbi)VFciMOK|QuzMvRy+P~wEqyaqVYnUvfe z&3h4g*PJgy@%u1ZKc7BWYslK#t+fM=L*TzHRB8S2e!L2X#k{+@2@=k~ySrOhSO9$& zW^hp4{cvVx<})~Cmfzc>;$dKVj~;A~=TND9&cc}2Mbo5y*JQijN}5tNpH0ko7W&KP z&1VC=m4>Fy&F0m8(}4ThlXdTxWF3BVe&CwRnwdk@oBL|rakJ^u>dlX#Wj|gE)ol~! zKAY{>)NU14o6(g>gqEpl-eo*oRo2(r-gBno&nK0M2Kdf7y35BDViv1j3j$r7zAev(;pciChFU$TvG;4v`woydJ%%PH zqkmhb)?UPqCM))H%d~AC5B9ni?b~aMkM<|V==mikdEIUUYG7-)8vPbyijNXx++LT% ze!4vGz0?3^s%9c8O zr(W*f_0@na77M6}dw_NKw_BFAbl;a=Y>g^S=2ZipjqYH9WuA?}9XSH{wfC7C(23^q zIzMWTI}1`*k|ZX=hEDk|4kn99z2zhpWPD7)-q5}axI z9Us5e^8el6RiMs(pJm!wkG1u<#LS(WXTWB*ROm|%RltAIFzYMoy%eBrb6jQHMa+GE zBQbz~H=KIDXO(p~^|syoyk0-^_tie zYwWVzFFOIJ=Q)1wwYmfQwSSla7k*;CUbgB3Y7#@I8NM2~oxRJ8jSF~gQPq1Jzkj4Wbb}lwHfSc zFmAKk4c7;s?@d+rUc%wzZti_64NfHBZgg?FoQamJZC2I2>8P>GEy~I6@o-*GrAINJ zYBON7SS z9P(NA<+2(Msi8>aqByD4zMlC)VUo|#VjtNlaQAa<^_#qH8D)3HbK)`3;ktvLpxx)N z8oeW_e7$Wa3znj4^~cu48pT=1{od$Ya{cEwx@+D@1ohfzeUHUc9#4Vnwni$aAv;9- zoX4?K4$p!dE{j@%S@mu=vF!@tVlH>fg=>+R9Jce}AC*1ccWb!}hwe6wns-&VeQU{q z?=!Ab`9FVCSTa34{Hp(FcQL&6Iz{*P(z~k=vwEA^({NAbsEoe2 zhE@1GTqa5e?!g$gj1W$BzPiGT!TLKRTof@O9HOFbMmoM__94E7ry)6ic0c+S%8Ee2 zRv+J!lx|oVmXDO^giH9|p^PpHo4u6oR?fq~L$|j5YWpgX>!!2w#rKgvK8QsHApd&2 zqVmqIrq|+mH87bm|D5HzqPfCr->(s&;x~7do6EY=F_u6k(0YGSvLBPi@;seM;J4qo ziHPrfkz&Am{p-vN_w{0HKn8(&<;C_`>ZG%2U*P$Aghj!=dpC9Q#ccZ>rn_h(P{_ z5sQ1@+sGC>E6&#)fyPzl0;h8g`K}Wn@XT*ARo;?oqwe;a<5u_40d%@!^`91(%b|B~ zwATrH0>rh(e7jJt9(VKHY;yKaM~%n)ruDUpu2ucF%arKXOoeYNYj zxlkqhR-6@zDGaJuS%G)A^iv}`>^R!eM^!Vlum0LKpGjCh=Z8FAsYioe1Gf4Jk&kO7 z$Q8OH-qyW*_H+eB!BH`-q^W%nC!ly4cuW|ugGkF!(RT}jpDJ*%LV5PwIgu>T+NOj* zwZA-%sBf?8CGo8M8)FKzopCoQKkJ-%PSBY%wBN7hVd|cb2sx<`40H7FyJlYum+aTc zwtf*|Emm8y+z#DTZK)K7vd@a%!r?W^5IPkd+ZZe$j0VE-49oCaHSNlNZDtbF9e zob7+|BC~N8QPcT2EyFD0Wo#p1h8v(ayq3&myRfdJkhxX2F+2vpMyKtBI5&~XEt&uF zWZJMhiikq^mqly zB7De#x{_X}562bw(CG{6O7MejdZQ=}ncWBGfjAzd+(m~KVhW^Oint`^a_Q=%FkBID z{T@*7guHVEm6wX_LP`kt`TO^8zahrE{QtMo#%vX?E~GD*l^yWT1$|C#^Z zTNpe6hHM=f0JtKMZeR^r`TXGh6@&}yqK&y+iaM!LYB{PLQzYgyKS2Pf!Oz|`a@3#- zAakNFREkY{f1e69 zDV^Rp5d%b9kM>h6lmBNlo&T?;YtjT|asUWv91s6Tb$ntVsAHh|{{f}{Po>NM z7NvoP9PYo4QvKXtDk9UiZ*H|?F#`1;YUBDn#VN@)YglOK(5!`mw5C`auw_v;2CZEl z=_b|Co?3H882jZ&lYwvR$UcOdX#?+4kPwC8y4X9|h#3O5`LOU z>IEz+qdY{Fq0Ukv9tisy$BSZ8k{sa@VAotL|A91f${vH)YU50|Qo>lgMB-I2((d=~ zwrP*^Q7C}z{{YAkY=`vasb*d;YrJvzGw8+xW|lbNFR&z#J#I@VlCg+BP+bOEC=%)4 z&1K&0OH^4QD}+K~uU9uzIn4ztcISRaTsxS;>`x1^Y|McBnV&3@dj6n`%6}IN(d^+; zu>T*>?qSEO6=j27!rBKONQ+hgt~JzoqMF$w`>Tw(YeLWsZgC@mbN2Wu>moE&3FuB) zLpQbP;|jdRu++ud;Vzz3l0GI}9Jvij5!GP=#2xc?rBaf5MGRL2>JD*npwzsQ{&Eqj zQQ5G9amU=@R$wSe?Cl_2q`F{*=N$&Xbf!Y$gGy^lRelEQmj3jz+7PNq+-ORI_$Xy4 z|0t#Cg;EA{w`4=MeZMem-kio!{{b&;^bMifsEHdPWuFOP312xc1vBgH2!C7&z*R8+ zhEQXKzMO~Fyt#p+UT)GgkE;Q-SSOub#7GCac5C;@P!U;jwT9f@)a2)4HR9^_jpo4@ zxlc1Y!dL#BMZ190?ep~f!H&%fzE}stD+i7UQU@A;d{FUbX^_-LFIyE@?99(V8%=0^ znSVb^`7fSwh3d9QN@lpV|-vaYBfrLDKOFTUnf+u0GZr=D;xRH}*bNoA6JE%Zf>J*j~jcqv!u}9pgv&+mup; z9oYM&9W0H>k~0i4cr>fHz=$xTni*WIN@4d}DF$6xP9rbuwj2&P-%!*nc-4smr`Qi> z4u=C*a2ds1$cYXQ_S-Z=>3n{~V`e~$;52e1$H-uh$=Ekia-2-4JXy4y?QFEieoxCf zy~GmaWu}Yhn-bV!cD?+LAR2Q$w)~~Y08g+IWaM+MAYrR&9rrsb)QU^xbRG%PV2xyL zs$M#41=80Gcvz6$_Kfl9gLLZu(YA!a&~*taE(-L zsu8+$8cI~Ucyr;zk3p~>(HHvi+c@r<6t~E~ze3=Mjt^{3GbQjMmdR9;N}JgCP7^AF z9Amzeo;8`xO8Xa~K*|Ho7-?q&kaI>UZn9VM5=;-2++q_Ml7y+HZc+}=NrQqX{&4DY z#L+8Fx7Mq_bS;sr?!Jb`BqXt@mM15y{K^+1z0Alr`CmwIIHDi!kF{Lp12GId@gW?K zE8NuvlD(+3b7UeQO}PXbg&`hWUNpfS z{CQBU;Rp-Jw~SW_ib19sq58#ZYJ5BZ0&A%R>i>c%5=s9;WZM@{6Gd7o4(s%=Nd%_D*@0@t_*Wi9%6GIt+UlU}BNZArZ(lQWk$SVL%$e z%-RqNh3vn@?@$T)3~_XUR4vF?6Dky$zX`_Av&i0Hzk3+rQ{?RGEgXEm%;i2IT1L$>YV(mOPv6i4;@5 z)k$!=78PX^fyVa$gK|vGJrFeb|0eNoI>nSqP-G&USTQFZZV&3@E@ws#pELvh(i9=Ko_KXV{Pi-H%X+Nve(@K4B#wpH_nhoJyTF z!8zpLoMBAbt)LQqUXgZ=U_?y+k1c6!N+k=A%<(MuXrt741 zg=My9`af}ItIY5;IOCxIsqF?i6HXc3A01s>r*Bsi#&qFp6<4i@7N6$*TM;zjsE{YP z*K6fJb6u^%15jk7nE;ra;l*?FQdOb=gslFVBh4T7y4jy8>KnO@sH#=+&W+KaC@zZ7 zR6yYc4PgFW6aaRkS82j`-#^bZ4Xl>els^7?(jfsh;v^XjIwEepHkr~~e2caOK@87q zjwRuIU`}s?G8q!&Lqzs}vVOQ0Zm5#pLe>j3&i(2@^_*+@ui80)ZiDRWg(H3E@$0JV z*Q2Z!bzpsNRgAyOns#`{FmbFTsRwCCI1tEw?Cn>Vb|pzj=1&0%9nOpWhyJ^S7Q`^& zM{!ckS9B=OSpl#C;YS}=4F|Bn`TVl~B7!cpUv=0{$`R!v4#}1v1CRm^s!^)XjwbqA zxo_0N)%PijKT7gq{vzou94J9yD|>_EssOWi`+^+-vPK*0|ODOgHRl_G&$WKyiUiVl{I zTJi@zW==V(Enb)f65LfDi_v7-5ec4SG$>A$74#`bHS@eMGvfN$nB;%H4xKv2KAp>0 z6DlFrno$rL7UUTj!vtYkNP5 z(HaisZ8G8%(w5G$vciccnhma~4zK`2%1@Ay?TjAPZA6W)w9(b9$x!zFvH%3fNYR;m zb}=jtrl{kDNpn!aq|{97(9$56WOLWZHTnS2AAeH(Z{Yy>v4z&ZvwM`=s7Mm>A*0x; z_Usa*B^ag+bJ9vJ!whGJ{E#&!Mcq>DQGz?GNEPGK1$BE`%mkmkc5k)WiH3RoXc#NU zkVJ&KiE0>**o481rc2qQ@Ev|S(eA`*#Zk^s zNyQBbU@c|XU=v2shggBp%3VdOJqE`Vrgpiq?o+(D@i3f%fp*tJY=v$3&<3juUj9`= z-x3QZhadM;n+Tc#%KrO*0LBQmWe>|u4urr6r{zun+6YW81nnVwgY2U@c71ad1LJ%L2zT6c zI^*=NpF6lU?aP#5mU8S!%Fz49^OqNo8*Q0b4vucIjw!uBR+LJkay|F_&{B%h8x252{@F}bdKM)@@IEsHDCgkTE+s~4@f`m=6BqS>&NOVN_}mP5+bBGWyl z>HbOUeb0qXfqEx97A1YGX#oX7l+nF=pTrP*Tg4_nrKppm-;0v|%M%R5seCW{V5-1R zH4Efq;9{ia2ppnCq&pCK#~&dk)6YLkMLVh`aj;V1KMtD|MF3QnN=$%KEVz zkdYBidA68;WCSn`9qg2yl|?^d99DQPsIUJbVMxbT=JGTuVy5wei4QJ`mUsD~9q;={ zlT;I;5t-Eo$&MtV_>}$u5#jVVX@cr6eHf#9Iu7xCy9^>M#CRSM>z5)e{+E`}-id+w zFR6gJ1!A%Zpte4!C@915k!XOte_`4%^hX8( z)Vu#xX^HcZ%6J_V*-1ZN2qL$U`ry%No=wBy|JRO-IX^|LKj&%rb zb_KWmBRv*Uh374VXit6V02JY!c?0vYb1D||NrrZ5d)ZN5a)jR?q5K_@3Xiy~I2nUT zX2mbE7+puj^kpj<7y#L6%&x}z)W?-Fs7d+PSJGN~x*2(J*(n;ML1Zm(*~yrZeH-62 zK%OgfaunpbPDKF+Rh=NJ+=c^MRY(6(WeLai_;};c0<3_^QIjEfdT(?Qrag}fc=&N7 z4&{?GzK}c~6*l(_$Q%(69hL*1`bU}lLnl?OKB%&5iFBZZ)dn<(K!g0*bapw6HzC<~ ziMV!%+G0-kjN6b9^@I&@D##pjU+}>8>1j5D&dtGPxBQL+z3ZlL(4)BR;cILL?eTfz zd0wERWKhv`CUyq7X(_5@K!Ag}C4eE_jPk)eV2d;EmHx3d zJ}u3x*_4D-l>=2iW(eYSb)M6B4>%uCi9Xo9zr}w{Sp>LYbDvW|J-8Oagg$b{#T*;+0i5s-O_bq z4b$DBNof@jr+(p26m)i!1=WBD!3=Gc4=nwl!yxL61LEnd?hNp}{Q#W*81t78$WGZ{ zwZ)_tNQ;LunUXN>kj~i<1d>h{8=2U>lh`003|Xzs_Q8XVrrXsjw+$^wN)W1bo4BQn zv>~hY(De?wDW<;!F4Sb$DZ(r>TAo(S*CXV$ayPooACU%IVFx_pcg828HKJ*EROHP^ zP6g!^Z!D?(3m#I0Z8ZL2T&VdlEMkowI%r1VYj;?G%mI*s52xyQTJdiVEUEc}(j)F5 z{XdTfEWq5MbUUOkK;K5~;S~PSO`u^1Fs4lumMT-OSTZfL;y?=i7NogqOUD7pWZa8k z)F0I==H1KCXe z$7kYV$(7Nb&&mji7_!!3Q`l$(ltmN9qfme5@{P7$(0R^jUy+?N)BRhf1ZXKxt711X zu1H@W+_zRE>;G)AD_K+e*+n!_yIAKpb*cm7pj!4xxAO@hU2E0dW}Gb|%j2u}Oy7)n zH1%49dT}VKs*;<57>5sC|0jzz@J&ygx|_O2rNSdSu}WQ^u~5b0ig93_D)J6tXsaq3 zI0*$$$pVZq)$Zu>1G#Kk9Rv|Br3bMQY!Yr|Q2G{g{bJE<1Tl#s1-@xcE9|-^s8Aow57pRta)s z17u#+xMO|`A>%zJBhLuTaA@*_K7*ZA^vm=;-8*@7p1auJiL+ww0h_M8RM1Apc?Au9 z$n0nt%BNiU$RUb-=V=dlxRyBg=gx$#bDeaG)2@uFtS>=`W?;a)AGSI-R^P#l9gJoU4tU-|FNlH~f3Lv1DYg#r8RjOLS6F#H% zm6`hYgEJq4NH7k1sdR8DpEdn`U9`MaUc7qwZ(6p;>KXBB9KsPr6Vd|pT^K~OCUFvL zH6NF*D8>cEQS?~dASZOmREzS9>PV8h3ss#}O1Ah$Rq+lYbMYA0VvUF~1AbvX9ki}1#(qz(2o+3jwi)Gbc zM({5I602E5;tWulg^-J`PZG0eSesiSUq|o8{Gp}WqbI!bm>`uyh9bApXOU15_0Ruh zQ(~FHhCh!sVPkF?fy63u{Qz-V6f^7?uy^_R_mYcM;QHa_x7nOE)B6df|M;NeYD zdQD1vO?b62OQ1axRXp0u65&mHJYhn)!`>D6r1E-APJB&#JvB@AdQHbi#Tpt6UG1KS z3-dB9HTvy<+nMUhRIGWX2rd#pl#Kpj+J0kBeIHeAC3|(H8y_4IQ2ywE%=x%t;t1;+ zcm8^ZtAe6C{d`evxw?|Q5+u=OT9orp5~DFRn~zWn`pqPXr>t@6X-<`XKCi^1S!|~V zr>v@wrMR=8mN~DsTn-W`>@BxpbmI3AtDDNf zjhY4RYV6f!SMc&XU6B@$^d4e2i~w_%`fi+B?uWb}Km*NXnzq7dnDq5GHaW9i|DU>* zI=>=;b{5K)dx9N><11qa`Ija{U+QMNV8HJgQGDZwaadfu8Yg@uNADqQe)fB7ehzi{0`*LF1LOCqIn2Rv(XsqufJpOVZy(?WW_f55_qtC4gT4hZI2?M4p zI0yY#(5K|{6F6;f=gRbvZ&%WL^VFA*_N6YL3^u>pfzcIV}=L{e6fr%piJzsKLr!(JsM2gqZ!krX&Gzk z7j8AB)*>^v>#V_&6p!fZQUx2kbQYdPRZXP>S|AV_k$v1Do4dA&sS5N^^SE;W9_sKj z4;6>_E05c+80+u!NSi>zS}chfI#isJDfyJ50v<-?^ zRK|e_o?*}M*D!c@8qpKG&SI_2(_v6PP~W1hJVUuSN>wdwsbMUJB?$3>DlRtXc?>Ao z8J-fuUt<>g;ans*()3thz`clr5kSWwGHg5Q3%$kF?ugkvYUkHv+jg|`JN2(v9i@tK zlByz)Nvag91x<~6TS(OHu2B}W$Uu}T;hcsLG?j(oPLaIh!J1BA?w(FGN6HPXHRlM6-8GfYXkiUE;qWQVm+B+2 zrn41(rRp`hnNV7po|)G>EC1RMFQj98jIM?o3!%2xg8Q3Pv!k_&bSRsc=vGJ~)$qzW zvuyN~MP;g$?<%VF?&hn!r8=T{obo!8+J3SIyW6fpoQkF5@J=NxxiimmyENM_eZH^a zn(hfhBgY*^kJdE&jdVsjyCfgQiRP>z)w-H(CH=kLS!pVVG$#EC6>Nh+8UdE+AB5uI z-5fXcFxbeh)7_fE$47K$`7|2ICSV*_TDra5SS{ra&FETyzLppb9P?fHAo_Z2>+JGv|TEOy?Of z_(})V_i#HUqoKuNfH+iHC&db(BVWg%fxUb`l69Ia63)u$*?3ICwqxc3@ahsu9Icf? zUpnOhwiOd1oHF#yTllTdb&Eg^D4PvYPNRK88MGp9hCJk z-{)1pSMR;oIW5Hv6bvBXF<>K+s-FNBL=2_s*gRdU*`;z_Zxt(Zg(>!|J0){{|;V zS4gxSz6P_WgR|Wy&qYz&jR2*_-RBDtA`hv9D*Px|$reY58Em;JXIMEY)y?ra=rM(w zWs6qh^P`}VE9Ns`sl_%=3taJ?zH)r7Q{0p8b;Pvg%EP5H9J5YBWe~nyUe6_;n2qULP))v`l#>8BQ%|dQc%QifTl84b_9S!0HBEquQ7wK}7%4mN! zj`cegj1UHwoI7I7WDdKNIZ!kciB~vmxte}0`&TfObjJDBT)scpsjZ7jlZ%%_S8EN-gfpL* zhU!QYxA)_|$UVZAm+<`T7i6m!Us4mw7ho8wpmYgy7&Z0J&=!tsXIpfxH3$4vUt?7E zDr(S`IY6eu$CqFo?=?>j7D(CqQrZG-TOjK@QFEE%y|KExhNCkBW2ZG+Y*| z-mz05+JjRqQu8X48edqW&h3b*EOuN?m^`%!Y{SVoq&7*65}GbTk#-u+D;#1C{%SU( z;fQzLr9QmBoMv>u4b?-=_*0nbmgpuVlQ5q0a*XD$3SM1T#zpNDjCt?=K1y_m)<#X{ zX4BR$+j6QTf5P*dtx)d7V36T0lX0m~*=YUC2$a@`scGX5=!KzURX|Lcj z$H=48hrLC1cD@ae*zJ^rPnL!3oZ-8W4D`wp;ZDzMP(zldY1+m)2Eg#p?crj>$7{uf zNhy*l&MVNV(>;9(*OUqVF~^FG(NHO^c4~u1{Jrzh|ICTa{!o+Gu2w z5XPF75hHhAiza<4H0Y#k(A`z45Er|0@jJb2Jkai2j%H1eRN9he+)c^ewWA@-(5QC} zH4ImKj)oirkPw+F*;oMDOhhJk=kH<0d$umahwrHa|1Z~8HNaq5A zndfSig$6%?$;bs~c%`+x^Ti{R3~s_+Vy&McJ0q;EqPd zL=NqOI~uSdSFMiTIW9K**At$YO|n%|Ijl5!cU*hMh6(mBKsdG1dKOhgoVLwddzD2= zWumG;K$q0G>wn(IZr5B&}D|?t(IzoM?oI;S*Ua9bLHAi)9VN^ z%6)x&-%yy?_xr-6H1f&egsKIoij*;}r+p{z@<`y^U*L>Iz9kUzRooT}g$8$2;Q8hJ z{L6z0J;Wf zd+}Zr%jCiN`T5BS@7u$+j*gDSWR}M;QD~TaEIyy-dDs1#RcUt63;~8fgZ#@6IkUBs z$G(!zyUG}&zGkn^Vk>K#cXS6je)IXTFJ9hHOa7R4`pu=jj$PDbY z?=8_b&FOBhuqx+|-uFq*7QBGteT?eYiK^|K*2Bs5_szr~^nNyfnhA2AL%)qWoZRe( zq%xd+d!A;BjOBKkCE0(ulHss@o@cOcH~VeULXX40>!QHhd6$y-e7}0#WxRZ(P-5$G z6FoT8?Rk3<7@FHQ^%KqCZW${bL|8 zZs+B+cfFtWzU1(AJFbrgKeTV^Q5^w3@kF+6}lteT~G>Z+S4l z=w$cpS;n9>e8ywHnvJeqX&sxVz+J27@jIWRc}f7$g9<>PV^0FFe7kONOx zH>-1F*3Kpk?j}1c?svN_dS1~TIJ}p$f>XO53YQuD92N%eNLI+eTRMGy3-RXWmcMas&Erz|YRO?E4l|7~0$i$J#1O8&WY>TTUyz zre0hZbqw$ybyj?aO=KkKU#ZqkhdbW9S8mQPq7{4_54uj*AAjAmNAnuSU(f7T`aaC6 zVV(i!*siA;_ITT#Iv(}#+jh<}5!zhWe1Orfr!yA!PXlk5bniue69G&Tvvxfm19u7x zzK6>k-CjsOn@|?(?y{R%$FG&3bE17L)W=lsidyfqx%!z3%)OV(fDnH=F#j z?|1w$`Cr=Z&D)~)b?<-go#w1r&97j#yu$u9ZwYqDahv;dnxRe4UG22uaQ?FGV&DfH zm^zrs;qz&1LG|+(ijT!4uugNi#0PeD4Jl;N$@SH)-%XGCxzDt(w-MxayaR>|o*!Y) zw0OL3hZLe#ZVnzT>{@pi81#Eu-`D;8ZeI<$F{eD)?r#j1Cvm){Q#f+?eJ4_fy!Zd; zP4&EOl)uk8-TlSv`rC7OsdSIGI`_Uh(dXy#`~>>892t*R8o{CjIsDsRjRa&@4K#G~4GG`kBw5{iS8r z_hvF#gYIqinPc@a6?6#0{s#O_gU%cCb<}gl)bkjkIRE-(^7CF)k9FuNzo+S6yA*ZL!P^}e%n7#q0N3|vt!L|Ne?rov%%+SFH#{(zC)N5S@-1jj~dKsCzTE9M7HF>$mDmo!R&T_uoQ&rI+uz9480cXWXyf*)m<;*{-5bCw|8^kyo$VY?b{o%H#kw(g+df7z z_?%uz_`W7?;vj%r;3Z8RDeVp!2vS*TbuL!lG-HC!JG^PG+&mQl%_$ zKQFUwH=rNl-QBieTzIq>9Yx*vslx>GjUDtHL zK)6(am+&dG^{*)~v1&&c6^uwoQkWhLCF)1VkH17eSdPbS*@^l`Yn9_=&=t|VF9LdW zgVcl7J5_})6yg_PBfyr1QI&!MR3Va`58r+E$Hyn_!Ga>8L{j>R8CV`WW_7;=C zHHQ@VUId*TVj}0P&Ff8fAFO_&13Z*{L-&;fW_5_Xoj$%5+gajT7}X3>m(San+oL!; zF=qMgF=p0bN!Y8;Wa-<-qJyL8 z9pqv%^z?!T<}Se`%l)PMmC=f$f`a@fJ#2TPuTLDf5JZN*B@9^=W-FK@a3J$9V7A(@ z;`@G5$cPlSp9YDzGnP;>qKwut;n&gW517-U8g|{5q;Q`oaumpd<^Gr@vLpqs`sL0k zFWR3bLD)c&uP(qqLrol#$+ORFy44F!po^_Pd>c-h|OS2*M}#b1=P=Rb&$Pi7{OsHA)a z&UcX|=MLa$l&u(FISOASyTff0f(8G#Z(DeJH|FcMSof`^oQkYo*(M2}X@PuYo|&SF)W zAnY3^MSximL+V6Nk3bg(eOFGnGliI?0SrT$ivtEBVtXo!4e2kw6E9*u#tFt zHcSekM`i&+)c%e-(chIn_jOeS#4%oAuxBx4dnPsE*V)E>PRC9ViiyxIgt-x1&yxoe z5p4Ylu4#n*c>(d82;&cAeWnh2Fcwn}rF>P*)#H3+?eL`e?`So!hV?sE8^v{CM}0KI z;nE07&CO|C7eR3~y+MS%F};6GQ!2R3EFh|N=M-C92N`J?BF{eg7zjov>cq1B!1@ws z0G!YbjwT6DUyvRDAhL!Y3c zRNbL06FjOW#R5$T0%=-BV(>BAYo-`R{I8ASa6hp|4n^e)B89|obaP=F!nmMcHQN?8 z-~@7ziL$uJmv=@=8@(MF+zsiRF=z3^P)U7`zF`oHW9S!;?Z%nd3b~$_Qgb`Ow^jvH zlqtmSa5iUAM@6yQ8^|G2al8?vj?}4ws>FuukYX@n`cFRtUc{S3Fp$uTYX(SMZ27pg z8+bzvtt+~_`&+3WP@p9btojPT#3FLVEVUEm#^^TE;)~}G%E(QiT)!(_g8{>?zZ?gU z!7PrW*o~m{f_A+YBGI=;M8rb6`@$lG-F`BAdMNN>KcPN?{o>x}Ae$_j=b+u-L@5L> zjDVW|QgmdAdYE1Pb0&c~)-}Lo!oIThyhqm)$zFC{qiz1C~m^+i?4P`!VnF7O& zaW$P)Vk}~ulw@;B2#S2efu}VS{@r-2higzlEFyI_oMKiQf4G%te>lR^Wsd>GbqHQ+s3Fk#{ZLra>k)^SJ$C zoytMo=soNU&i<##r~%Y$C*3zhmDTV`l?JaFkIj2g3)~?JK=kefTCl9c9hafRw(Vii zH5USJHTw}pK&RN3E++$X7GJ+ZwT!+$u8hY8j zn}PWOu3p!p%wrvHwVRBmj6@s872a~FAg|IxzQO6QJ9V?jmh36MB{Y49;}oy9<1!po zEIRPx>WRMm8sKy;7p8ynFi5_!(kEHW!d8rhVyZ@Ctp#Z1|F)g-CTVJDE1q4MR?#@s z4zYa8Hj*NX)k|?1M=kyvVv$K~J&Mqj#mjS(g(_kK>4CwOFV0=Idom*=m!6kWV-b+! zf>KtJobqGz{e<*(c4l{OD$&eGyFKSt%9gI8WT(>JImMfRp^rbJQl!6x>RS>Ka6{Ps z$QXe#-=^_%tv``FT&+#&T*`HC+jMP4f$K;e-J`80JR$9}X|K3Zv9$3QlGAZYDne>b zi6sZ{!KidsLs!YKG*RGsvENG}TU{2l1bq^jG+iZ#A*0Yx(jkqIddPk?!?`@#GFg?f z55lm>FYp@{D2Fk*7dj0x$Dnq$8iC$e^kVha>ZhhYqvbI#vHaHO_prI*k5G zH6F4%)k+uZqH=XAglX)dPi50oWwT`=Bz#4u6-OzsTJlTJd`g>!x_q;xN1V5nqgo$oC-9@^}3N_W>>y z=oe6N_qJCNawfy;iu(iq!__Jj6rqE0QFZ-;UmD98R>&UUn!S&U% z7t~pwbNCbh4b+SCuTdJm!v}}@^**a>V3&`?$Ql22kB6mL%M^aP(_s}~pWBJgUB~*w z>+#~*PrOis(OHMgdf&sQ%;ug4fi^!YkJi@(0E+|YK=Z^!TAT}_+}qo4M`h`+Pe7f= zv*ww>mSbR{Y{_WZt(T09@yUf>!)fLzqu{x^SqY}6Q)jU+hn%~R&1$U zo{{|Rp{h-_%a*pk>R_M!Xcs>}>xDH7g``!39=5ozx}yJNR>e$%~2tFGHMAgfp6_8nIgxeq`8YSE)D z#d6i646bs{=&#-jEO5Cj>I5Nk<>(btRt=H0sIdtuurH%vY{y=~W!C#E%|A4nfOCgsg_Up=vQ#SX4V;d{Yl zZza5V`?Z(dpZC^+x2I=R>>T*|tjSN;w6B`U*K$45hin}En|rTon=@(Xk&$CZ^xT)T zXW2{T&i3;ACVG3l=t=3Bx#Uk78J4=%rX(frHzj9QYC`pBZ9hbAol;Y91~d-A51k3Jv{xhA}A zopqeovUvCY>zOaE+uyk6Kc>_;w%wceN{QXIp!Zj$tzY+9;IJKeZC0u}^mvl^hh_H4*E1`ac>{^nRxZvSMHcwJ+{wXQ*K`V_?vg#RC!;*N_Lx2*?X(I z_1*qI3FH@?s0qCAR?fbE?HeBa^3Vt0?Py=HW&PIPpFg(!*5{UgG^2jSf{Ms;>!(t? zRjxje6zX})(uRFMORj#P_VrKqpQszV`dItaHESN&`Rlpu!D&a*KRWiq+)a(iWy;b` zDeq*=p3;`HxUO~n#GmYc<_CM$Ka<0&t5?2y_e+JNiiXZVSdT7_7|)@>pqz^ zYQoWe;|~rUyYSCj*<7jZwt>I9;gx%ALpJ<8Z*|}M`i@w?-o9`1k%23jkET1vC5&1% zY|-X%J+gPNeR}JPnYU)Yf6eUUmuBVkK9+yi<860{Q;%5}-B#~f9Q^8fXX=LZ15ef* zK3w|XP4aVx`#+OE^xZk1+-$x5&}wP>{KAa<8_vyJnAmuHkQk_I!J{`sEkP z+_mk$eQSSk>=u4g^SygNf4lL2XYY7?QL&|YrTF%N_ILi+{A!P$pS2F%czeIAzyJQw zQ?DJbdUXBo|9Y&gbyfXL&t-LY%>TICi@(UKa2#)L8MX4jk!7#lf5$DGBQqY(owegh ztK)(G0r$by%iXse-LTf>v=-$${;_gG?y+t+emwl$h0OK-9~E91kNQhuwRXU=wk|`>yU<#P>f{Ln= z!s^il6-;?`MR{4}2mNTgDQCP1c$ z_d^#&f+Wc{W|*X?SbaqLJja6`j}5DAlgE2~GH z^vqo?X`7?j(L9OX=msFAk%$LtR1S-vZdOE1B;z~pLW0B_u$DTSXRWpMk=I~Rs@j5* zM$2dyTA2ZjjTikm4ow~r92g5jmD1=4Bc@hMV<<`1Lmjq?KtTXb&Xpu8;BjN>3w;`R!g+XhOIjTTg=R zIH18vgEerXjsrwkN+iI012|79qG*scN`>k&SV(}CSuc7S-QG#mnJ0`8xd_E_X%H<0 z_xV`a#}v8U`Ya6u49HyJxFCs4dN=|FV`TzKK~$(h;Fl_WLxG*X-;hzl9xa|p$5V@= zv3h|Ps!+04D>_84R)S!uI`~eiX=Q|fm6X_APDe6UhEGOgij}n`=>##nMJ3d695K3B zt4g(~OV*h2bk;jg4Z)74dFZ3Z^O#Qb+#0PJH(wZ@#c(K8%iQiLR*CpHTpUOQ72${x zwuvHWSs#UAd3Y6-T_ZxQK|-9n!AO>fnGbRr!q7vlfy_Y#am7f|&>7kRff{L;GD@)K_ljlV`UtBS$6-RVGiOaMHePtBgCU9b%8i3(gOZ*ykSs>>sD#8UB zbj^4IgQ0I*bmbKd0*bM|sWLbVa)hFTpS13&OVO4JjfR3QuZi)4!rPO<>(&K2(M_B; zRZTu#Hw|4lm1-J%PjO~uA+z)@P?FKFM$>2!dAAOJPjhCv)6C6Gm0)?Y;#bBlsCEV_ zCKJ|JjDRkzbb0U}P5`Qry4m<&aWHhE>9*j{MMdoycxkp6&7wO9FJ>XB#g$4k zX(dcvOL8)SYPY*$^M-zOH2Ij`O??_oI49`b$ANt{Tu+t^6<$4Lqs0V&!J zOXBWZ;3``a8a&tv94n^cE5w9seH1Bo!7MS0%8nb56uUq_LJIsxu;nS*cv9?*z;d4l zZ-Oov14^O&nq+b@W&6kW|53ZYF!|pOM`l*s`L8p>b@BHwN7sSG0lmn$9lZi>5N*wukySGNtru4I#)#(c)xE%c`J5 z&@Rr08baZoBg;pd^UX^1G`SFYQz%Ofhxb#PLW5Gti#eeP8IIV|kW8zIM1`Y3Ky0B! z4(W7oB6e7+VHeF1A79I3M7NpjQ9+$WEAa)kgrP|xgm*X6)j1(K$I@bMrKqf|l3yUe z%zvazNx(ovRr4o<^9DD%hu9Ko{*S$XfsZWP?!w?}NPsz*1U?M5@q;rOc~sR?50zfs zBegWGR;y>^>6SDt^*ruquKK9zNIJKx>eQ`M)oR_j4TR5tF}AV8D_}c3jcv>;80_S8 z40a5`7~AYnM#y|@Q_yL8Sz`?2=gYp?g} z?sX@Y`1PdydN53u{i)+AdH$k2ACTN#n%swH{VV>&j(SM)1B4p-i~iJ9@l2xbnKP+g zXeOC{qd@@7em^s}sY^7z|Hx?uwTWq|eIoaPU!y)RO`)yZxIA($92R*lEIm1mEh+ar=~(mRuON;RBtW5cj-PSLLfdq|Y`2R8bP`SuoVF_%M{AD|5L~CT5I*X;3Q|Ze`UO^MUBdLFk zz)^Q#;S$w!nZpIr_Tj+$^$Jvsp|!z0$S)(Tgm5i;n*&fBV`H zq0E{em`P{Wa3R8y>o9|Lpox`Y&==1mH;o5o9@(3e*r4QCKWw(+Bos!dklT=4NbeV+ zW1ck_)3P_h8E9LAM`qQB20i>Qt2P=5{cmkyA)(b*w99sQIH)-2P>eRc3*k+=IAN zprn>w8p1Hr>)0l_rALLx&5-Mn;2yR}W_DPkUc0$GJ%Y5EmM>=c2imIV(~q;C%6AR| zoc(Qv@edA4>8nd~(=W~Em>imE_Uq9V%8cD^mGYmx>5seT7uoX1pNie#^Kk$za-zx@ zke@Rey{cdG^SvQ*j`{o%$!y{cKE?jty%BkkmpAsiDQ!<2$uoWHXNCS(%{iZ@{GZd8 z=VtQy-`UxjXZqhylm2&mYiIYF`uCao_nG?l=aKpsBz{Eu3rgT9f6>Od>-m$jRliJ1 ziZs9G+nnN;A3vVn*O|pQwXe(qTHnj(&BE<8)%m8=a#gECPIr#F z*K}9Z%vJXCLvU5!&d30YdTw_t5oSp6}q`${zK_=M^^C^)VX%4W3{;%V2o4d zGN~M^%N<#W*`kYTa`VXjsE7`;9@kkgN%?u;JM43pE~=AbyLz?GiT zcH{4xsr&)YDB;ZbdEISpUasoaev;GNj`<{aedhJ0{3cb~I&;4O+Y56lz)7pJ6#E#wt(4$yI zYlp~dXmj7>6||$@6`YUs<}B9EX2(bsokBVu1DnPXoQcBcnG-gmmd!mK#k``qo~@J3 zbvdp@cEM2*_7>=4Wy@W4Y)bT8ZEWV+XN9WyGV|T2D)x*IT}B*wSo0#IhP4ySd^xfz zSMlkR?K5}x@izDTy?xwCjOt#;?X{zNRe_-x!e@_^*SqSLWz?ssC{U<%O_w$9s|)K~ z3-o{1+4j>E|35uH+ZfURU4B;o@zYcPC(X!~*!me#S$g#iZ_l%To`i&Vgm2G1x91-Z z2EE04{p94N2K=eT{UeVXy+!DbfYiv%hlbL;iC_3tT^rU<5U&&aX&H8^0@%S|9|7R{=o*g;=)6dTTr%V68fk2FB`u}J8|7ZIDpFjG4 zkoXb(|HkIcEl2;)1%S$~ScnGx)vN29H9u_XtwyHyFG3` zmv25-)ZEoIF?3vAlMA(RRvSk<&h{4w_tQpu=EA!)mF!Q|M3-}oKvb(uzOesZWokF> zIkp*RtWn!cwm;~kGM}Z^7yfg^`od2$))#(KWPOpQ#;oFW=U87%cSX%y>kB{5T3^hk zS?h~w7!@{*at(9V7t=Clec{J>>x*fdx4!W60_%%uKWcq3Q%-FvvJ*M$i?fWvmX7ts z0&x_-oDUr9i-WZV)|V_!=d3T8?ax|YWEvN-zSvI6O9j1-vA!5ckGH<$mu05z99}`V zQFUte@r4aB^pCJ`7qrNv>pa^cqxZy7=%tF?*hNsn(6m(MaExi~DsAC%8;WRK$tF>k01GAI|)bb>TK)$h>yIB60tG6?HZnPn3T83 z>7HNmZ-?FCqA_HRup8$ed|t$|@ckLoBv3E=)8pooGqyeHoX#G-QG8Z#J<+k|k1GDf z1%#|sOtvX|=v@omd4#)YpC<~RPmDVe69rEv3eRPJ+GiW{a$SyVkzIRKMDPlXd2(I2 z#=MlexyHN<7s)m`^JV6{QDfd2A36=#m}g#OjCpo~nJ-6H<=D}l7A`yL1y7Z*ehe7)&v3TrYXU zV4?nBlRbTU^#3z6$ock6|NkFM|L>Mgf2RL`rvHDY|NoC%|Nmu4(2am>r^`N+qLr!k zV5;Iztg5IS9Fh?-*PTuH|5oABZa5C(g1~pQ@>5eW{=U-F%B5 z+pE>IJKO8>_x9cEw>H-Ny@_hQ{?_bTy?$f&hP;`r&D87bn|l*0R)vu1 z2Lq(9WE$NtY>6(R+HjvE%dTPln?zem@|bWxT)v0@^`~C?vX=j4*ZnVhXX;*gq~U28 z^wWmYQo(Kif49fWApX1K70)|Be#hqGn1803Oq3+#}SoZIY4ly-RsHw#W zqOmURwO%Uk)%YJrIbzn3RK%)Knru`iXUdNDgdt^z;%!2EXr<*{B7sib@+(tQixc|S zqzItm>yE zX|H>=Za%$w&@ZNc>kkK<9la&CUI(ix#q@Gjuz7EyV9i8iGupb*76p_%Z?yMDu9F2wsN(ey#Yiaibh4mxxhT@oD{YA&|cFKu1p>fCl0*3 zwx87(;;p_;6^G!|MYc7;b#+Cz`jVf+#$`r+{Sv*6`_g~$MKd0KlXPczXWyTkdSu4M zB*uRI3VqD8%zx}J>YL@MDTlP=&Wv;TUrcd5JvC?F{|pj)|3CL(UH<1V0NKkPulr+O z;(&|0!PUT?34ogCyf?wu1Ng&`Zo(DW1Uir_H9d6Qyd$_}Ki*?h*_$Xr6roiqAb2)NOV=|UKm-{;X*rnzpM!~`xg8LjN9H8UT3u4r#X7qw^FNIvE z)4BVgQ~#LNCKj+cXRU zWuK&eL}mh+#v!U7ozcFP@vJ$6b3v;`W{YXvSDSGwT;ad2*7-Lx6ggPfWS^J-|1~;U z+sI6`s9noCJ)JQ@L$)4gipJB3{(C>$Eq^iL=ck*xCS|!PX`X4V?py_ZM=LP@gV* z?Pb=s^to8#M{YjTUH8%Q)ZNV+>o+$x*KcHepw8l+Gm`-oSK|=f=EFX*p|0#U!t-YL z-^hD8qSMRkTJEgh+##7lR#Wyr^(nuEg_kB!g-I%{p{-qgA`4&iC!e1vSHxdL`#d>D zDW9vR*A*9-%#{-OiGJ#{M28%D851>=S%#_JjdspPRhwIN4*L9Y4z^v5nh& zo?I&J?bI&q?UXUZUU4`3%aaWfG9E0u4nR6F`j7snew6bX%I?)8L=M&_ALJ$x7Rb6K zLMK+9CxbX{nW|k5Z0S^AohawU+ebM`1khz^gnfDJmb<=wa(wKQ(G!$uY!1=5_N|P| zVangL|0&-}iy6R9rt=xVA?@DM=&M%L#|GA>>Qm#~6LP(XyI^rgQ&UB^y7Bh3(1^Q* zkdQ_W6h_*$tV5~yf}Fga-5cw7?)Ve@SWjl|(#uVK%#;g=^M#MSX`Wkjlv#9Cyyz&u z=%{$nQSqXqkwq6%wnNr(WdP#BA$zGk=E@7`p5w@x<4suVV755Jk@zeA^qH)eGIPVj z!)29Qp^6_wx#=QSh;!_)1xH%Bm}jWW6u|kt)qsqm+I0Lw9wqn^pEC zeDSwD}uOZM-drzwgH{Qolb z1fRbD-{rZ++u!m7=*EZvmYJBJfocf`~JOJ^S?Yk?$S`8oqj#-MwPVa;#%5I=1+X$&Vv=dnHKU^ zW-c}7dHSh)%qqLbykXsA*l%xD{A1+f)H?2uEaG;MBti3dNbLx?8(r#T05{M0(BBQ4 z$KALc9|5pIyUqT@zVSeEYI*Kq0Ky2~@Qj8_=6YxSjl1icySLt<7O$`0@aeCe-Holy z9d@nsS2uUwTEDa7`Dgs+`c56Q@09o4bIw=4%kr@CJ%47A9NE?A1GtvZs=QI+lX)g zZpCo7-BYHF$Ri{jdJyTqh7i5*q5PK}X~5pC{1;BJapMJr1+}E-)ZThd%`61Nqs5bB zdXWIozW)|`J0}dRS3Jr1M1Kb2{{5Js^YWncF9JHbPrA+auoWgAI&6mzDrLx zb=r$S&Q5u8?6n?ry_mhr*(04_R)Ysbih~2WFW9*oQp|wis}rEkfY&_#kmx2m592)3 z!&cm{4mkN#J3645A$gVWm*Ch9e|3|&3IO%!`~ooa^+DKe9>eCI)XF}cZl6eVL}U1D z?Cphp-r{aEtjKbRY$tvbUz8(hgG=9cj%7iw*%1j2uR|W zQg?5!1J`2#1vcP*Qmz%@5(y6mnO=)e;Do*5#|Hyk`YuvogATC7A$Wj+zbBTr_eYYE z?Gdlfp6mD`XeY7P2LfQ>(LgTyJ<+w(|Jo}V__Zh6=sIm2GrR@Um6C(S!EPukw2 zvc)?$k|7s+;hpQ^UvmDttk=V3Vv_O?tSv0l6ERF7Tv(=*2r8HDd0+W%H`$QD*~t+6FEDj!?x zdhc#~V>;;d7ipTZ=Z4(z5t3`7o1e=oxNpMI=R7q-^GG%g6PeiwRJX(|U><@XJe8=g zd2)!A0!;Aru#2b?rj{{Oabdu7r?wUWogJjLcqNjYo5vbJfEzFB^A{br2j%T?>V?H_ zx9KEe@}3i}gP0hElMJapINKzA!g}=SF**r2uAis^?Q<1t(RF)#beTW!tScuP3rZ14IAA005*oHcoSi}%W)Ayr(KccH4BvMYG$6JMDm}Du^T-+Qip3q-( zT{B4DqTjC&`NSE+0^x&}?C*sAqlm<~knU(E^G}m!;q;Jz3wCFeMoU0Qg2M{bH-EO` zPzg5OWVDqIw}NmZx-|hO;#W8PH6e`}`h*Z3KbA-u=}ahlK&aaUC0XMWO?-9V+{#RV z_Ta;g!M3`Z1GA#fO!KvVkQ~#lmeVVazZ?YjsgKr!fKJO1i%-q4&o|<6&~M?CSCd}Y zj0mfVk_IG5he^dta4>1No2Sh-pQP>phm@tujoUZ)RP}||ON7i0lr5Hkx1e2c;kncI z{Tn$Ln&h4Y%XerBK41C0Fh(er9^PKu2jQp5Ay(>e2ud!YN8C@^hcFEfh`Yg6VnCD_ zW(#|#JPf?r+_iDR$ z98@fCvw#_FT)#b)q`g0EQ}15(tBto2u{Q|YZo`PDVOfXy>SY1t&amsfMMrPvIPRsb z-Nybx4Y_8_DQ-vi6*Rpe-KZ9W6j)4e>2^vS>d&VfKZABU)q~+tBEUNci712*dvPLc z7;lH~uR@FfR*5Wm7~|qegzCAVovFP%Pq4+(cj7i7c2eKjUcIwsLJEOj&A8vkg}@jK z{#{rv>XsTE^@EOI0{sd4;P)00fhp4zoHgT-Sis!=41t^kb?PuC@r6;ywyAE>ThQjs zaBzL+M!gd>d%Y&{r3?*wM2J0zsZBoaSA+nQh67M?;*KJ}MQ--Ik8 z9LJ-J0&#~0*f=Z5a_6?C9<-}XJuj^x2g}O@_*~XRx~E+O5;&h6Mh_)4Hxt3jEMIn1 zg2|ia<(1krW5tzPgOR!zTMr2kz_liw%8mqm=2pT{o~LR2tkCPzw4=4P4$Kl4H^IaFIA zWHy;rUGp-dT&^`}1m|o-w3wOc>DlSI>6wor*fb2}i0Rl~I&>@S!B4eIVly2&@JU8R z;%py2g)d;?xXy61)0Z>D@vRI233u+@B+Pv7SKp+s5g2eBHt+kw150Pv6C7^H#H)-9 z=)OKZS8rUYc;nXB6`qL%&{VA8;Bb<52`q8fV2Vd#D14AAK1;TN91+o%=2wHAHodvj zqaP3-eLxGK$wBb4FAkzEvEl7RXbUiu#_dNB`QiYv^5O$x%pZtfCAMMM8>H%bt2{_I zBkI9BD$%iqY;Eh9!&oqY#Zl2>| zcAyJTx6G-k_=m$jbL9rVae$}=af=;dgJts<3y9QQ?Oi0Kc#ns|#aVFhc6QchQnD^Q z41qUCko^+2=K$cLl|;?-td=oj+}L)vq!a8ch@oGyJ$1k@GOFXO3Z;ao<`PD8){7Q1 zM{T#51K3}f^GiXewJ=u?I}3Aza>Xxd?>S_axSMvHF_1QkE?Bzgd*6OP}G;g|ALc~XUs`W`3 zpSXJ%9Sxzmv34$R2llI3x(FWf`N1vm@QjNN^de=@uHfzu7uqu- zHVbr-MZKO?YuyQ3uMtCVnQm)EIFGSgfQ)8#cc7r{`Uf$6)g;a!fk}^9gkg_Zh8E{} zDA;(~cfPoBwu^7!1-h#{ko%(}S}mP7PTepdsYxXQJ}-=!Udn~k^4(kkj|LTl5KUpP z^wtGrjffu&yv)6CvOQ$MwgifI5VliItKJ)O5W8M>bZ4TpdwPtV$r5W4B|~C0*Is&w zuMU^PIqSM7aMYOuF-=dmMR{0D8X#8{F->pkfb&aU(1zI0`7GL}70EgwObwwz^VkR@ zyi1M{!aZP*R0(^bX`7@V&TSaRt;0d15mx&%$IWWoYSpl7nnTh(sG?zmCWxuLaMOgO z=&zVN$AP#VG`DvAw|$qbU2PAdH^Zh(t7J)MmXR!v9vKm)3VQOOejHkbe-=62{T}IZ zj&Kkcy(jYoj1?;h)2qXu%D&kZ72>#Cv2%DWgO-xx1aY%Pepb zUzk~#pSe=jE9;E2Ic5nw@djT6LO3C*jsvPUDm&Jx9}-cj^ng!T5q=bCG!hYQcZSXT zsvBZWn`F{4C}#xVitvkYcLn#!3Uv31O9qToZ-p!*s?a&`abFCaZs_nrvgXa+8Fr@} zeG#Al5=CMvls!k`zz_RI2+hH+JM1HoIgCGg`7f%(fgR{ra$Zz^??wK~4t_^9^u8cMl-e#0n0k%kWb@2sV9KD~`jq@%0e` z4>mEGBJsEa*ym z%;E(1;VvufB1WQan2ntisPd}hzj76M;!TpBj1EE7RI*tdDSul@JGPN$;%v+?) zk*g^p9;QpOa#uiOxJONG*7Zq9Zo^rF0OX|rQ!Ud#<~e}i#||J603r74nhkKQTS#uv z4QJ7UBIDPcV$>B_Z4W!aIq1Zk1+`KOpV(~aZ^IO*Dc5-f-bYMc;lo}#j)XiMvSz(Q zB3;yjyGN^)K_<_7dAHRcNz9`t;bfp)Wp z#R*)hBRH(XST1zV@F*2`nO=U0Vr%b&{Ug>I9SH?vr%cH6-6JB9I$p)V$vf)~15xk5 zxe`4XMJ8Kdj)vgaSsCY9aI)Q-_4vETVJZlnHG;unEQ8LE5vGYHv;f>7DKHv#WX9X8 z)jJzIYSdHlAOU7t(4`(D9$lf$(6}10?v4R+aGK`-E1)wp6&6|Dv!^5JyTf)M_jA$8 z2zhV7+aqE<8iY-(P1WUWiUQR1hqA{))R)-_h&ZBOfz^bNCt@;ag2J4;(9KYmg8F-HyMFg=hswE&*CdSMl#xAp z8F+MYNM>i!W8{@sE~Vb7Q|*u;Cy;SOC}u~qt&DzB z^pdUEVJP@6hT<9)dw~u2*hl(MI3mD7N8LQaF0xn(dvZw36=!2IY|csO!2mt%u{S1b zF5uryB&B~^!1lL^TN*MEQaihOV7vhxtNK}{cADPpSUfU?4{3#tfsP~~FGobOSEsR( zsirE0bJ(Q|1o{;n(Niagt%Hxlli-0?eQePk1O)^QfBTk_0YyOs6=7$XwL?1GKE!B) zeYt*Io|73&*P|yRb?U@2OoBZb3??yRCl$3@bi$ykB7sSwOA^#+`Vng>6fW=|kz;Z~ zjEP(Xyq6F{Sa;*`x&kXFo z!^sk9ir4Mkp(9#~oG^E%efzdcYj-lB_YR|eGH^B@%BF6MRuI;X97W^N<;x=V#OWAJ zX#>wXq*YiQ)*;a&VnJW z1uhO2^;J&g1i2)^C3Zk|LaR$0gtBe_l!Ur1{1tV5MLu%oERb7`?NIC)w1tktN%?T?K z4x&NTK@aO5GG$C~53Ai_=RjO7h+KLllVjOI`Vp_YVwc=gB7gS0zIA*`<9DY9d8%%9 zp)O#%o_fNyVl>BM;fe-VKyz6L4`!X=kg6EU3GuuGBOe?@?TGVT)76lf8w-iTkRttD z>MWd5*~6=G$g?xND^ezdjL;OfNOJSwHI0<&&CXP5 zs;txPz!Sb}{BNyrrs8l#X`JEqQ@P(W3^5*U_2^cJ8P&9FRWY3j3dqRLmkV?5mv<8f z{SwW}F2J*Mt|>2N*RL`>aYMo=(7suj+T{$CWAaq+u8t@hOk5s(3>}A#TyM;W2v8$M zPhCEM2^T0{q%FH01WzxlryW*XthBMBcZe45)mpaR=Jgqr^G@WFx zWv07E;b9n*MP?U>V0YOk+GE6%)c-BH=KZ4xUdr&K27jxXf~ZNPPDmo(YhIIJkMy{G zIQ}+m-gu6OlxAF#K>|~fB~3<8y|OaIOXm#5KsSV7gg6#V!HM^PmNYSnoMEDu6O@e-6%4v5# z##qc;fO7qbwNY@E`v_Ae$eva_WnQubYZ}Obi4rU%v%Ql-kQt|9C;gIIy@ZTg{cEi~|El|4waO;@3RBdLK$hmU==JA4gx2jg}v z=&0La&eM3zNKA+)aRNgBbSyah`$$v5Zpean zQP=1{*|~oha2-d(MS^=cWLhKU@lgu>TQ74k6 zhmSZhIh2Q8;}*zDTb1Fo-UoIU9mujg1rU3gsW45DMaIplOeK66HaT)-A}hrK_gH;E zVDMPgi7n%A%rZ3@OooEc^>VtHAUH@63!#T8vV8THj z9F(s3gbKI@I2y@*70I@$hn#33BOwo%XBx@qVuS~bZ~_%cVx!Y8=wv9g3dQ2T%$_~8 zx-)6iO<-}w)ExnZ6cAdI0JE5|cpK737j{enaRzsYKz1v-jRr9pER5X)t!C)I#WadcB zAP5P#uUbF(*+RjE;1K5Be%K3{`(!IEosexk85Mss*i4{SGj4;}T*9l6-OSho!K%tu zFbGoH0|wykfz`v%5Q=`7fT@BJ9C91|sPKv4w`yIov%Z90mr6#a5Cw*W9a5+lZ{a-&L<*~1ndBYZp| zyQ$J5g8Sc%sFm`xt{)09qfi?Zdx&z-oa5%>;mbt4eEfsx$T+JwdPJofh@S4oQLFq4 zo2rvosd*b0yr(fr1V6P{h{K!K)H>-JXF#am?H;7gWCwHtgG8tsF&6Cz*U6FAEh-rk z8QZ4Yr`3dEDmP)-MCxH>p5vYd$xdg}2|EahP@iZ39@#+IN88TP=#p8);XNhdPH0D` z#JC-a2Uy%qmFhxpj8}_jebqV5s%tsT$gpRelZbbTI!qhehgH>OhOIQB#$bj?7ttr9=!U*H=3{^}%aXC%L#v$O(w%6jnqD8zi_y z$xM>Q5sT)qa|*!-4ME@}08Z{zxqH&)ZokIi@y5;Fl(iAY4PsQHbXi@Y*eYpahWQHj zOCy`)DEo-c5bw>QN+cBp{fZlplBIp47uU_LJ8!Mtxv}@Co_&6Ob?tR|;Y*+qFN7^t zNssOskD+@cdWdSH{!+ut3~^LlKtQ<^TC~x!GW%QFlRVzE;57%Lo6C|%|5tbk?7kRyOZe?)U=4j|K{1_RC| zVFgcRzJR542g5YjcG1q@ZHYsJHOl>hWYDCo_P;Jw8ngyfbrzen+F3Se0m4GFO^)*|Q8g zEX+a5qA+huMDf(K+r%UUYHQJ6yS4wajw^|CeC6wkCmZT#HZ+G$c0()|)fWLoX^mQq zsU7wictG?Kar&{!?yjg_%j^S~!j@`IO2Sf>M>oM?gJl<-`1_IVU}?q05W}q-_*ocu z*5f6EC`C@HhIduN5B@f?E>B)8k2QZ>@{Sp`gQ=96WTk0Y_}(M06T*!!N;*v2X%uwD z1Ee)Cvqnfqc{!Jay+unXR5=x@y`Fd?_I^xt0g@aa?7p-Y@Vp}7!f84pYJ0*OUHhS2 zOlf8jxB=vvl!%dffM_HP8kGIhC~UWs0{5dM5HOP+M+VofSP!8{sM2%^{2nVjt2Sv* zkWIi-_@(+ynj{$Jos;;d%=`fJdKF`~s0h2)gi^8#O^gy|jWy)^z%6L1N$7-I*R{yR z{Vkwp>=8+f32BWwkgs$15|7lt-eGT6S&Xwus$21z>8R8rNhEB9pWq=$qD92+1T)y3 zkbSq`!cs+3#r_^q;+z_098Tg?k*mV!34a8J)Nt)dK>Pu+UwAIDimcOTC+=GRWTU2W zri4vs)T|5{!R&;scj$q^X%6u+n8lhvt`Wtk0jE*DE+waw5-pMJSkeo(>F~ml>75hoWj^Xr8B|iOy<_bXT!}Dy$T0)hf9WXR6{Wi?cB#N$J*0&lR39 z$&q6ih@z^SY7qED^xB-ZhQo+XRn+o~2PEJS660;>kTqm*zw}k9+9-dl6!|atAE*DT z)oSI6ry^O!|9I-OWi^OVw-wnb7fTB$3md{2 zm4|~=1LNe+^ca!*Mmwn*7^AFv%j6l#Uc}Qc!zUO15)y28`_yvN)=J9W6kt(dXfLbj z*M=>Nh{8Ev}#E=OGl2SkI@B#}u6LW{)}h*9=Nq#$h6kuL&9|22rp45W2FQp` z3*RuVIW1X(7Ee0{0Q@r)B2;zzQGaHe`wpZDk zQwci4WI^t%;?71zSzB4^7on5&IBVlq5J{EHCTmho&0K~*0?YEo?g+x30B(NJL3$&QIL);PMm>S;NN4Tj z0BnU8oO0iJ%J{R|sVgX^En50{#cDt4mP0yVqae#~I{~LV?3Kzm=kQ_~aXBnv^cMhl z>W^8C-Ske^w0VeENH_1iLjOwh9b{33Q{))WJKjdnU8SS!U-t4g-V=%13%yOD#18Mam<+ZYL4T ziQCkye@wsOddM*n_Nw11ZTju_$bY@;dd8Wjn`KOvFh)du&p=IxRI4R1SM5)XJI5A-_ayM@@Ts0%fg+GlgRW;gJ)A3ByK>kMIc!Z7`>!@9=G zmCcID_bNGgS%}n`Vg{S_*K>Ans1Ll?jjE_ic-yfqB4)#l*Ohw0Ij5|L43?g3lbQ)L zZn72M&9SQI1?x`zaM?RD-3~r|yeE!^*3}yO+Dp0&%Odj39ungY_hXYH!rt-+;c2Xd zB59IvBWF{hHL{wo#>a#1BKOaZetN)-sgiD)OeW^2TSfMr(D<2E<3oKw6G4(8(-Z6K zU$GpNH7JWBci10hT`erPK%d{QPG+{LNG;Jab! zk$KFXaC3I`u@fjks_b*p#E8vNz;0FCUy8cvZxmngq`Zm*yAQkSLV{4X#9#I^oWhb{ zzog8Vyk{pER&K>cjqPP`xKw6+m+o#{jyEE@CNpAVf)9LqWU7yCmY?lgOqi8WN zq4;%-*NvjC8`|}lZyVZmqxc>7E3@MFs)@BA-^VG~@6Ys0^-Dn0_YV!#S;(@FTph-%KhZ?dQk!1Hk^J7Pc995^z zlCiQ9W$XD1^cKH7Bv^eQE_^UshoUzE#f~|a(=s1P+=gZx#JP`f1Wq$b-(`$*o0im8 zd&wes{6QEE_}XM9j<6Sc_g1-LjVHZ;*Z`la$1nP;U2hd5fyc6$(O2DhIpu05n2Whx zOY4<*J2j__M8yJlyB{}e{>Iws&dxTH`cz0%zS8hZjhA1(0uNb4x;kk9&(1|(7+=GI z@Df;KLjKsR?UgifNMOQxtnA?!?=%LUwXV3ZQSn1qFz_&JSTDop z(sBfW@0`P&y}R&8osv-NS!n?F0%#drRp@r7tL8`v|>(9s^plH><@eB zUn*uX=-bgjvpQd!tu-RL0{_ zQFwlM92db05E0#E706jf=80cfWKT@m9Rq}{PiJQ0ti`u3p_04ET)*s?kqdu34})eQ zRc&!_&qx`MR@CBR@qJm5O{-_*omMkiT~^ux;;=b9a?$FnRa>9 zHIF|V#PLBi3Z()d3BB$5EB@TV?A-K40O9nY)V$@ST+qAID_XcR&XPdsCg-q(QGvkJ zy<{!4-GDIIkz5^@zE)Zxgg7$g!cYx6KzL8Bao18x*=WD=G z#qAul5`h~3hF>=4USvQSa)b1qnA3c1T2slle484VkNXjy_nF#sZC;NMcjJ~!V0CfY z?sAS5f+Cl8&`>%}PdyE_gg#0)kM#p9e#1SZ>P&kWiCdalulobg730j1&IyWvgw<5PXx$E7yIVD5ccXGee1|ap^ejg~BQlzYv!F zX4G#EJ4mY9RK}$pc8>y>W0lQiA$KyHe)*YbQPvWHLy zHY10VnQy;0hot-=dsCHm*S6~$+vTOKsh)L29pXgc1c|c)G9W@yKKLkz^blv@GBc&x z&8j`sPUqsHZX=L4-aa2dvkIW`okm?ypj_Q2<9uXuWYA!4-rk-PAY{+WK+wd&M6D=J zPP@&%&G#be!^AhF3vQ;wsUoAHS3*qw$K!|trpxSF=p=;7LhrKDoBV+k;Eg+yBV2|Y z0jBAK>0BM|VgSvhYj7e9jZoup%xBuKUrLknBkAQd&OXn%%rse(lepB%q%b!o5smaJ zT85?}<9Mqh2D8?$o1MA5aE1Laa!&MRHr4XXOysQ#3v=ob-p485xY!Y~kL7|WI>|O! zfXuTOKxW3G z??{eEqLbqw@wmPgFWLlYKxR4!p<#;q)>H!|&p92<>OmJhY6=%8`K>+0q5J-?f)Np+E0EM2lvb}uRhv?E}>#(E26Z)+vbdq3Z5YJZm3 z|3=wwIDOT6?GLXs_T~BcG4;P^8kZNQbM?PxF3&ce)&Kr<{P)81oUIp$e0wOXU9EaA z_-nQ-UTLk2RIamC`k(o1b!=+Kv{zgqlWb|sC2NLuiV8AG&|FG%e@BO>)JHVP*P-;! ztwRY960W!krVaJGUpTXB=8|eYt&9H*J7kms^>~zM-7@vUWnSFG@4QS&mExARRPGxL zbXxll?sgJxO-yx#zJtt&!pK{9cm37Pcl@_j@7!74+{`Tsf-Ho-ow^r}?+jsA5Z|$tB zMiXuhFPsIzf|86c_>RMoy39Aj=mC3Tpi<)b8v_ug8alLFCw9V#hhSt`+uD9-WAjyU zOQ!o)^7e6Uh_g2m6~&shia-CdzZo+$y%}og3j~7rMq;2Xw(8tk( zK+5<^3L*g%x2Z_hMYZT}ZtY5nGh%69Fp(4}MC!x=ZD`m6d;^fbM-GlUsWow+#CZ+w zBQIop8zQM(Xgt%z<4b*cWjR;~SdeS#D6w3c3X*0NO;x7g%SZp9KKoR8$s=J1n^l@z zz4Pju?@qtxFaJ8fQ~%grwO;ncR6M!Aj7lMggVHs$DT@J>=2@b4Rrs;krufee>6hHE z^s`5zJWQJ-{klIf?A~Y9sz%h`o7|uBqoXdY<`ep%_sH|K#`&^uX1kO=no0((s5@nx z;6$b^>Fcs>i1j7)y&A5+$$FgtfR)e*@0PYI6Q+pzL;9z6Fi|!OyCx5o{i|CmG9ONE zQQCsd)m@S-ryKj(o(R6rmnW8Z4XRCE_N$F0mJTLi>3>L+N=I=4ukUnBqC^?!zu}km zPF^berP5yOrSe{l|Diu?m&%iwO__x0qx=43;}LZ^vy^>4(C72+^X?2Z?31&V$vM1h zIPW^aL%W8_+3X9$^1eGc`yRcWb9P0mNp|J|w6rLehA~d9^grsZKs5&W9ROXWon8*-KM!zjV*U)fF?x6!P8h zAsC0F=-5~sUaDuogqU#x(7p>G zY5LMjOSEeW{pIPj0VkaI@A?xvwypHD*PU>>`P6b_N!w2Bn1&OTDSzr=W4bc2*PmEI zBd6o>%hES&31nv%IIa^}nxX?{d(OE!OzfDsjcZ|ETy>Dee5N#h;A82^Q9=3MNvSc!N8s@dPI5Pa}=HkIQ5Fl^w_bmd_lS_Aec`py?xT{9m~) z+|M6n$tKeTt4-Kzy+8Bl-Jtr(_uijxnp(>!7Y~M zHN3{sC_7wo1~sfnLgL_{RNqTps#hlW%XzwrqQ{nfsZ2gBgEk-a!(NF#4nIL>yOJ6I z90G#M(zJrf`WSxQ?W$<`5DrNa%F~&{W1<^V>CntPIlPnkuMH0=!#UAh(A{J`OEQ)5 zqTx#Ker)gFdzZ?4_v(fBjnD%cJVUe0f1NtM-+K?A`=9!hvgHsfCYFlt$f<(o%}$Hn z+^ZFhFd5NJb`MSNE%8N)Crf8dGygh!88{91$8ICBmV10xOcpVi#oWS0IEArX!YGGO zz#Z(>&fyKRe1WnB$_vbn!tDG@J%5`QUE^n8;TO2Ri-eXl)+j4$q$`^l9W~G4Twv`8 zl#}&OB>S@VF;2oMaimr?0+IXo(}Pf001Q5EE*@v`{gHPL3*>@+kG< zVQZ1vSl%lO0pn9Xp7NL$E|!c4(&GtB{(49UEEJ9GXt+3+&P1*J#758-`k+brKfgXA z^X=Crd~mYO*9OuluaGXYafV@}9F$U>}D63bRC{Rp{s+iL2Nj~%C1#QLi)He>E zPyDRsCBp+BbJBUkjgL?*>JnW%CguS33YkQ9`F{tMN&I5(S)D$$B|d%_n>=n#5RZ6LM5PKk0}d`b8poxP*Mnt8@i@v}Ja0%OdMKC2-7i*YY-N~xlZ`xo z_h@vX6O;G$_TVi{-7iiy7I_%{-vJXIeN~&>pD13x`IZ5&NI12)*L{zET@a%b$l42b zi?55qq0;H>)z06ywDq{HlbhxJGrH1iG&|+Y^)^9GCbHL?*}3#?gR)gGJ?(Sq;nY%| z=VkduJp4hg#!Pze(M8WH#_7d9(`R{fhSY?(FifVLE{Nb})>J%!y~o>HIrl`OCJI+n z(QN=ds;*W)8dN_yU46N>cWtrGl&MlFptP4RO}d>G3`YgBk>xyc^yAr?MO}_~ldF+AH0NsMtv=uiS=YFJ zQU53@`y}LQ*QQZZ1YTVM3rqSaV>$40NQ9mtg3DaMS1I>(ZSsBn{?R@Ohl$vba+_%? zWpXGqn;&tpmz;^Z6B*s|@If-@Lo2s8=?sT2-`$&hA@}IL+VURF%k;fBF)@0$OWI{_ zqto-8a*j&cO)+;-I-~KNr4T0K4R8(T$rr&>2Mzg9ZJtIqch^ zbdS?*Ooz)Nf#EB(XT$pugXCZs4L!P(^iUg0285A4QzgPa8!J;Tok`yavQ+laoaoT# zYb?AnHB~let!Qg7L&Mk)dzszQ9eE^6p_5y<8hL)sf{Kxkm$@ga1qmKm8?9=hmc7YG z&=)=MKO;TJzWWmn46`U(1P@&%*EDMmE`YFk?v`=gw#VXp%rsi9R(_%t^oNqJrKsP6WjyjO;Qw_yxF5n#qZV~PJlCiN@%Jk5|C*hdou2tfgZ_7Z zZf16Fp8dZTX6K&ye|=i~zkFxAbLFErA=dp6@oIB&=55=cQ}bS+`_uTI?sGnbYhID_ z*j#mHx-ol>Q;&5gbEh-vRd$wl5cMFbg@@gC)L|c)9-^ZYQ+$|xnAHC)Rag=Y<$v(=`~g{(cDC};A6{c8|YrOgA?mj zMtz*+S9Y#f8GT>iSLS)wcGh?IZ?C?-e$9Jxdv*6U@Jva+*^2ttyr8qcA0_)o-Qhl? z%(4VnRJ;DvWC`Eg+_<&Ae`{lBx6C|I?(MDhH`i~Kr??w@zpr#{A4}R--ygaIh#YdB z8M++?@I@c!yDDeV+tW+rm9oFIWdFKU_QU3JOqbvpoiEx1VG_W$XzCJ7*naHYBqJM- zq^Z%lOc{sokUn2|ac0TwgY`BIonM#)P5E^kB=~;08_VBG&<%OE?6JK(Imtl0wfgFg zyeDpRvXq0mgqj#QjP~Gs&TN;oQ-Iq3T}WQq+k1D<-+S&o0%E#`gJgMc&s|h*sC#@_ z9{N*Xmh5$>NUTmf&w}$)J^~gdlKSN2L4yB#7yskqe`v^h{b=Hz-N+PFhmnHle$?BC z;yeW!9km|PpG0kfrC*Xszpp(UwvP&?Mo%Z)i8N}LCMWB48ks+Pq+=p4OPj;4CMUDY zU4kE>jKEk;@6E&rWlxD75x&2lo2@B-xMT*f`=F!P9az5fscQ97IsL)~eD%^sIlte}n8uM)wh7AE7U zHcJ1@wQENQrj7g@eUD0AP8 z%ATp5;N76xe1C20_U)}rUX<_xWmkSEdKz@R)wNq&Yc%KEbNt~T?(LgqL6b%AT4#=N zK>ytD%n_WI_H z_06@7^_{Yeks@2!>)h9KOCu(u=eXrbPwp|s6!}~@ldK(^hHJOhS2y>;-0t|x*@w&{ z+gGc%_ut&#wu^YMzrBAA&#nm-$KN9_Z>-;3y?bjn(`cGn9R|d`*(VJ?%iRB~>zhs| z^jB^SJSk`}Iu71oq-(-C`#ySR<`-&vrx6C1v4errb1=w_ObAgHsZHW`7^e0b zr%T>oMwL6PRu#3&{z|u+N@{CoZF-8-xMXi+w_6;RZl*E}Nl^n)MqFFe`Z zcyoPie@$3^e&ar&7Pog-@9+!!z~AY9t>3x6wFA+SUynYg*77O7litze-Q6vm5dK?# z%Ts&YuBCs;8wd{Oxrm;tZ@%r$+Wtjv-g=!Mz4iJvZ*2`f*VgchXu|ES8|(5w|Dfl# z5A*%nYwK&T?{DAQ-`d`l7w!XkzrD>*x3~Fs`n~?9r|-PVhyE>oZ2q9<`#K^U>QE3eI8*E|9*kAr{l*ETSi|HdzRa_iRa))w!${-kF+@7%t- zyCDztH$A<3d;9vvCO?#)*Sz($*S7WmpS^K+^~P;g zr#OG|JJVQNnqAhPc(%PI54N}Hug!gFPyfhXPcO@Gp}?F~70{Dc2COVFSE?9SayeMG;md7JB7o6doD{-k#d z?9JQwwSHq`SN_7UYaXozIE+X7lbo zd`ni$|18YeCku1eJQY{)%t|i$WB>YH;O^F)UFU83Fm1QFdfV-Q|4!cm!8TuY-^-J< z1rg_b7y2k|bN9|I_dWfYzEg?HeXozu#+9(7iTi|FY`wKlJIk-+=QYS4Ya6yt^M^d& z-?@A9=EmFRjs8jRc3-c@MByC}k&HekDcV~4|Cn&$Jc{}Tj4D=6v zi%L@-81?4PYpZwGZx}f2o8wXN7;V>uGVu@kduM&dnXL0Cz1t-S@2}q4c-2Mu(Whuh zghgJ`k87SR$*eH_>ze26pWV0MAhA3vUbuhDTVcA*JFCT|-!8vv-n-AzR@pw%C)A?3 z-yG}<4`6l9j z-aC(^%_oK^->7f-k88^9_03cIDbI#o=PCbj%{xFfBYr5qu8HvN2;Cx#qtZcQpUR)+ zU9&e#-_RfCdF*@;+twm=rf=kLeQV}o_cT@iT+^TOtRKe%=ehn#?_#s}@{684h|ClI zbe>DJq6kwZIAoyY%!geWMFEzx8RHHjYipbkWYA^ls2;>*Vz3H7}#i zx|aThH;1u(%s;O=N+5Y`{<`K_b=Nid#ZOWN*R}L7dJ}WeIelUN(C5_UAoI>VxaOfG zki3vz^yEJMv)|)K^7EP()50=~$~?H{^;(DeLVjKI(#WRVi-XxFq+{_YnWwNtJyb8gXhKq39y=dRBvu=hft@UEf*s3RQKB$`R84 zt>4*)jI_Ud=kEHoVilgRvV2xYQ}&*_#)%z6&KNrRirPk=Q(1hf@S`aa$DdPeJ3V7- z({rMKFZs<@UJV0HuNV%oe3C$|eW~mRooba<-w)}iI^FnUg+U1=Ha#A){~?>p)RS6l zVxrDx8xvb*o*S{+J(p_vpEFAS=U7iNl}=SbCKENnYuT?>kGexY?`Sc#B$_HwdY4DL z;6cyt$Ez{7wRLxA(VEdc^J8(WhPF_{g`+u4Xg_u1UP*W9Ql?3|S5Lf82CQjUd2r@> zWLB%}*Rqqv0*7L7n7pR=Nyx;SnEg(0dJvYUmd=~(6L&3(V9fBmGl9D3k5PPDO(rq< ztGjo1vf51VxhDp&nb63HXB_&%)BWT#$mn6u88)xs{b1u3^|6FRNu%UDLo+w@IaW&@Ysigkyd$o5zHaWSscj>+Q9{u-X{b-5})z1-d3j1)j z{X+d8cd{Q*0#wmr~aw@fx>4pVO8>`vrFkz{St6P^%G^^z{F`gArpKK!!u~=d-eMB zttFZR4XK-j(UMC2-H+AZqwA?snQ}jh`*fKM@A=O0$B!(4(gD*8(Y=WnVhHz5@+&xPooqi`AVCeVR0eq=w zR?yC`4o>M9wEXA&DqNQQ>gDNa8kTrszj@q=TmJB+{>elC{YU=Zk{#PFF1tK?gDJ?2 zClRgNf8Mb{<|o(e5uAH>MmumOjBV;qU>EeV|1_-4&dcuG1!knaJI`5<6GEY)$!Qb% z9K-a+3{ucMGn&p8r`cl*C~=dPtKyH|EGFrZ-)y`OzoFGnegFjruQ~^-=aY23@WuDUNGrLdGnHeMU}pA~*W}`sSO<+!7C# zQ?O5DR&^L z*s&j<(Y@P>m>Mmf8uqLC1*j>P{ZqBduv9-Bgx!{=qEA0hw6ws4{SdWCLKyEQ zM}}J25pxvDc_MRh|H|~>&Mh@wryn?T%{*{EAiQw?>a`Bjuj!A>$MUz^I&m5&*|tfh zsl7->QFhTELE@raEohWQ1b^IF$guv4BY2hlJNw>XX@TtEc?>H9BMTeAL}6iI;NDgA zXANZ4y%YV+l|l`+U)$Pzhi@{y&E&$h*RCM-nI{R1vU8YHp@ct&+>$vHqo;#;0Q=B% zt4stAjUF66DCV^A;V>rzJ?P4c7R%)jb0^0=D$eJ6QZhI9*lV2U<9wS=&2jI@od@4J z4eqzJtGUzQ;CmMJ-OqR*GmJx?i|}2yB>FOsyJL~rMMeJbV%Q2iRa_cF3v1EipJ-dkM$?tmwW9|-M&g2%|HnOh2`Ri#xkqcbiUBL2O8E8Sx=5?wVL;w zB@v33*3Qy&*yD&=xW> zpF~LJ>?fzmAnf=Ywd0q-iR_#vZ=#?Vs$~z#%w`-Q@}(JuEkxSXHn-N_h9Q0NS#tRg zJO8`2RD77BapU9v8nc&YNAkbV(xYebf1i%{zZd*lTpXRFN1x?>f0q0GS?>4$*mJ)l z&>tjz9|`0%BLe5lzD3yTq|HVflT`p|xk{5Q4xd~0@1aPjKlRd=wfrx;?tj@kQzmzl zw$Mzk)5!Gt$Qh8+fem}PbR6vi&cN`ZGzn-@#1@n!TiHQB3J*EYw~iqFW2XMqtLvLL zmb|@d#4T)yqr>~O;_jdY&ht_3MLXyo6~1V-M<2z_LwAyrsE;>*MnU^J?D_m| z`tYIOXXkwX__POgEV6^7TfBvm*+KtQwwPWLatTf|ULx~{*l(Bpsoqo;uQj=n;T*0k!!9jJimz&B1`W8u){2D>xc&hkV5@6Rhw>^B-4NrOjT?xKF z?fa)(IB>c)>mLq$3`aN7gOI4d8)E&C8=-k0>Be$z>G5=J2HzLHmXEvPQLY1CC{Khg zqP7Q&dbJ<)j_C$_->=sjwS_}^^xA5R>%h`4S@`=F4@@$TZtHm2pLn#_)$P0;^zZx0 zzHI4Uw+>W`EqtA=;udaVdVWwtR1H!v7jA)*diXK6V4_|p5Me#E3BEf|nWeKlCrb%0 zY-(x*_s$rf>3j|4GBU#x7`QvrwOLT{>B%L^NBXVY(4}kpoP#U#Nd`1yKS{sQgnHw^ zcvt|&_urqcT?Xv{#CG7X=fA(E-CU2`Ej+$S7mok_#K@A)7;YTY9_4zG>ex&jM<<(| z=uR8_XgZr5u!?&+V;=qpDk2Xn`W~H3l$#8QFWQE!8&T40lkCn|=H~!pI&_YSW@BG^ z97Nl@c59oFcx1-C0A=u?<+QWzwVTV;MjkquhB6b)bO_GtdHZSRJNXFNZ!=3M{?H`_ z!9l5H->giRFU?KAG+%btj9F&B9$A{qbsXffn{g*NG5c`~pD{#16s{Aa5e|?#LpEZ% zHXl9mk8qbZYK;dEAEmS*zvbD9DQ@HcN~U zD3l=y>CFaS=e0Ft+6$V>dohdh$p6%A^P!&wO%yRj1?NR$5h0wO8iNsUk6qYB7M0zm z4`Hg)wU_5FI#oB5b-_MA!g$k7-!N~Mn8-T7h!X!W`F?&Dj~+aHEJO}FsPb+IkX|24 zE(0-jb!y}q%zh=!R?zIl+(ne7zlVb!F(4y@J@S3G^K7eZUv5{?g}RE)?TX|sW^(f% zr_VFPCQ;kHlB6ye>K$c4G_GZ}nuQ6G?&PQ+Lp~i@Os2!phU38OXl7;^9OOiD@X(wU5yM@g zi(&Mb`k$J7AI%;SBc7vx<_;V^OU!6b>%qv73teDt9#OX_HD_$oa!O`rf2u}5YV@x@ zr3TC6@>Q4il5%Np=hC}-*Y@h4+S}Wk*!$Sti+k_yJ=%NWJ$hb7gKU0v$b+?!f)CuI zKRH`-Q(AN4YA2&=Qhygiz|C^<#ro0GNT*X1H2M7+{o~gAvO`AQbV;gJ@xcT+5By0} zPzTQnB*%U*1_jl*8QDsw(mG`sG~#zIFme~_wsTwCM7E>UZX;J)B*()|WY&HrPm#$e zKjv1RI|N(k@I8hP1y&|R$XP3pPdW)X?0x^j9RCOk=O)FNklt{}7L3IGBL`{ZfR`&1 zMLb2?eI9xcI(5~;WfPKq0Q*nYHu<#eKaIvrV>ZqII6pn}k?F=P{qfBH^Xd4{MSrg4 zee=%x8+X??cW=GpukO6Qe#57~c6K+mHh0*b;jeD)ytRI3XH2OP)zHlOw}ZYvL%Xbg z(mp*H48qvI*^iE5eYi7V8_26Q|I6d!ZW4DrUt3=V4qn6m)Z+fpidK1#64scrND&{x zQt*i(9q;z3znY-lxvBh;_`w0FBi2)4`vu84qH&22y+f3fSo7)n9xye4H3YeOh67dk z`$R2>-59X-fe-$!P2NN#A8ze&-xC8$)Cs$62CsSE@`wAM=Ye`X^gQ3FiyE++AVYR* zC=cMnXN)l$UD5R;5vKnJ$!}&e-eMb-)RupRU(J|Tuf-=Yglzcn0h~*mCbOo=h8CsI zSooyPTz&*jj47b+#@#A^(iY=TBA?9LZpHNV7H!xoG(Ie1Fgf1d*!53>#Ms!@X{%mw z05HP<&@?YcJTdBa#$9XFJXUvtgq9ZS?2%zD?!Ll}?dosjUi)v66cC>z(#%5O_Ni}D zIU)0#Pw*ce(6zv3E_`0&_H&t2#6ydLi9bd6J8?VcM@faBwIS`n^Mt_#Gt@x(nRlT& zB^cj|4iCeA*lmXXK{z-G>CjZGVHds>)!9~;b`h9hAKkw!OIWyAS8SW>1l$LH^WM?l z#=}E8yPSnFtSLk2v=y`1j5na(A_emm(|#@J(hhUNWW}VoLno_`KvHS?@|jK7UV2HI zHKy$hPHEWg)F3~y>9(GJ)5xQ`*%1B|PO3xx5(YAQ%0@S=T0b|);=nfDTiE-su@A2- zR2SwPJe?&xy_+~FI_sk7DSw;{d+Zp)Hc!lDMpBR-!lRP1^BEjT>bV8qaZ} zPKfFp!bsi^dm(2E#&#w0iN)Pjoxc)UAW5?yB*y^B2~01#%h5nSTyPGX?x9Vh%O4WN z`Maib^ySmbnQ2M_;C@K(7$g?i2ZBkRQy&@;YAByxDfl$~#B^eg2_Z_tpXJaMweh$I zI$^vcvS%4=Wt3rmg9tunB<7^~0F@~Z{DkAdbzJSlMc*b5$G%lOVeBt9Jf{Yz>@))~#F zJ7spr9thf+`+kWIz};^2uq;4s7(CkWO)$DZ0(yE_yx}Q<53#LueG^t3ic7L=9qlp6I zW};U{2u+rZVJmJ&P5OW?(Ug3)hW^J18VcN(vxJbj65JhhFasz=Py|f<3vSTHY54*r z64RNFhl$0?4674$t37s{08OA5)%Z{!&>r`rhghXU%I1XU;MB;8fd!2>mr^uYvAIh@ z6kp*68LDNjiG=VgcdO6S5U+FnkAvY6j@W$KH-7_W#!vym%Rcx*Oup;iin_yxHU7ko zhON83y^-!#V#z639~^UFV%#TEZ%=t0IH33-{mr`lag2uIU#2^n8L-t7wPV`X^lrf( z&^5sQ&5i4?pgY+q6i%I6n4O!J3C(9Z;1nmIzHuwmZwx&AJ7EhP*?eu9KU~NFbEY;8 zlu#I^qYIjgK2Yr zS91N)c2keMg&D9j3dr}!F!h>%<>isDXXxt=jTKcbl$>d`VlWQo>R#P=Te`92I@8U# zWsTqugAg@Hh=q{;8u|WaFEB0c99}$0FAQ759K8@J8ZI(C%>!)4~R^G{lc;K^l4&ceP6%u@WKupvzEIdiAOf)z4gXVD*GD$;)2V&HL^dv`B zWY>t+g9&;-zyVFJYAFqKScrQZfaWD(`>+b9(@ykBc{>Q3$K42}>b#QUK-mEq5J&+2 z_Y>l$o+>)d)W)4kSs=Ff08kpzaso$iF#x3R-%-b3;uR47M-vCcBH_Qi!$GfRbUHxD zI&Cp)8=vyZAdZb8Cf<&iDUS@Yh?6jVQ?W>z^+;9vAiD;0M8eLmt&na>sl{=Y7pq@_ zH|!b-PDe5DQ1w{Mjd`0yxiTM?EpEFG$mhFEds)w1TK;xFd=SOMBn{h8R*rU$$wAt^ z@lQSsLyy^zxQlqvu+PDrL)1+J%g*0{>9>%eQ+)3p;9HxT@^~>BGR)_ThXhC%L(+52 zj?_}o#1X-GeICsej1-dw<1zbm5oWG-(VNBFH42l=Qn5lqo`Y^=qGeCum#2K8U>C0_ z>U-jN3~7^v_K-FiKIKfT<51W`=df9P%NQmM!L*W{M zTC{6)D`tlfk&~IB|r;4StjbAyJ2-?^s=)q_YoBfct z-OG8Kzl9lKnuskUR>*jq^Bh|OnsjluXm#wg&jg+($&(ISUe}zLVIt&bXNX&d2@b6} z2~I2iv2m>C4ZtN&f`+KVnkLf08>mV}HDISAaUuIX%^$F(4iCa+fW@AK95_Z7X4q2j zN)UiTzN_&D0U>d7pj##oikJ5i+15;X(o;8XcgMv%6>ttnp;Vdk2eP0ihSh2!+!769xskm1ud0RXQAkB^z2hgwqGZ)I&Tj zctQj9#7JhK|3K6hT~_cbZaJR{_lNWD@Dd)xuY@>Zgj~RifMQL!O$3cJFim#Mhz({c z8ecB@0~!@;8$pOM6m&`uRP?X+GOAba!m8J)r@WaEKQ3??cxy`D{X-Jnn<0Tw3;tsSNx&9t$`QLeA>hixUyZ7{0#03iSmLR6Ga{W3Z9n zv;Zu+P38$&9D6SJZGC5Z_0F0J2}~TFpXgj;BZH+nO0NVO8T29UEdtJZXNcFr0jm^d zkc^Fbf#HF7zq&O8?q@R`T;I7-?*z?WuSqQ00w57u9qf?Rz0Ee zr~ca7@&rDscH=5F<1}?bx}}`yAZn)8RlXgmb(O}iO)o5%$+u6>+;*#iofl%rfzY~C zU8Hx#_I(-Fixf$b^?PP|dUkqldgh}D;0y!7bsaGs&})S~IQVv(5nHt z?~LXQGCO_wqnIv27mutWVF?8&@i0 zm(mqcfwn0X?>V+Q?j8{Y2sUPWPr`$Qgvbi4C;c!G6pq`iES#_e-apeDArA3sbe>GQ ziG!$1GHW}*AqD~wGYCT#=q!_h_&^G@N)6b4f7na4SDsY~rVtLqkO`NSF9;*vO*yOZ@ zl7Qs2a}YzV!?UBc)M?>$q%t9hY#dsT0;XYkHii|X%!;-Q{#X3NVV`AH%XSeCQVU`d zk#IvcbkPuox!Su(%842;bHlBb?to#k z#pF|Bo44jX5;{Z_(;+(P@iS9}24{0bvoJR(SJFlovOQE<2Vk@d057p_zq;s51^?`U?4AiD~c2)i>CJNosM>D zVo(|?DBi_5&OG2yG%^>uP@`l>{0)h*Ogr5R{HzO&R$J$z3;22|e3fysCk=8z(f$6W z4miK$1#R{ffc>R?T9K>;q9dX`Z5|tzmLZ?AveE;#0BntS!D-v168$i49S$0eu-czF zZdT(~tJd^1D8fA>qL_sSk?ElHK`6$#&{IAT*m^r?ZteJQXE?0Y_8@u_sa-LF(irZB zC{xOO7kv#a_t4s|#$y(DGe`K-NauqYE9i<(1iD(vae9g8U?q%z3^SwVcj2>$wCML~ z|HAf?I2s8VSf21Fyg@%Ys`Xe{AA78z?{c{4^iFavq4Z|L zcsLm^%q+~$Tq!Fd*RxW{3%iW`9D96#Y6?YyjFQ9RLtm8SS8fW}2x(XGq)YK!r z8UT6NRb-k4`T!unMLZK(3Sg;`yw(h;L90w(c%GAw2iE`_e7I)=Bu6|PoWv=JDn1Ic z5b^cugcJ3hyPIz%gv|AwHG&4@@!eVS)x#&0p#(RAl&2xUnhuc#O7Cp~IZQp-tFvOb5@wA#Zv)*7 z+&lNn>Lpr2PKv>Jnb6h_*jX0J z5ki~C8t-Wy{rTDlH86OtN?d*={_Ks-_~iMlz(V7_e%a(*ifOr}RpRzm2ghx3sqiA& z9!@Dp`vl5Mt&Ip2aVn<=QA;@2AW6c`0a0P=JEPti`r0$8i+jU9v_=kNB7(24VN%3I zyVH+wxK*(AbZkb&91zShO-4>#u9>Z6(^>2tKm$1J3KUe#(acg^p9Hct9D4wY6f~-a z7|4VMz*Ke?f{+5aQdZ}UfFZxUMkT*}?h5_v3ZEX5Ez~}^>4^>V&LcR{h}kiG*lWj; zP?1AcmaA6CcumkqzDfRA%}(&sbrR^OH7rl?10e;`$w$UI1-viG%IESR;*GoUd6)6-dUbf zYY_ZSZ@_@D3NlvV9}U4hi#o`{kX;vQ0$eMHj9i2U-7$4KUPh#(4lJNHNU(~AoeC>E zwpXinHg?q5q}+J|bhaRJT#M-DY=*{{jTJ_`@Pkt?RgYOD#tf)gwW_`H0~Bso?+jCM z-1Bb0eMR28{4+oamTikC$??dwr$%sI<{?gl8$Yiyzk!MIcL|dnpNu`%(~aS zuWO9))1!@$=B7n%`QVTGgLO>XZPivepSR<(p_kImktw|@fr#+t?%;f^2D z{lV2alOhub09ei`!|WOWWR0u!ICai^B>%WLyb@GH#pqdh_h%qmXZQXn=xEwK6SKN9 zg78eAtI9zoT*^OO(1<)wBi@}7E+wwHVWH|3ucG6+n)cTaC0wP8=ueYG{q-xt*>i{* z#AD};`}XLwWGym_b&h|W2@%&Z{I+*~a}|884oXo_iw zm*AA!{PGdX@qBG`dV9d|rF!anmx6dU3{V{cb>qO7q$8B5mRYp6$bI$Ru@NwYHJ1ox1c)_nTKat7B$lpw^a z#iXS*go}JZh?a61;+aK+elG^~Y!kgMCL?-Yb*A*^AZYb~W7;&!-64Dxay~!PQ1%QV zek519Yj7q&eJf$S#kld53sQe*xbY(y(a)&U)xhr8wdWZJwIIDe@)rC)XC-DL*R9sB zWN}LfeK3P3qL8>fQVZ!!jLh@AlCDnC6Pd5x4n`mc@@u)V*E}%>wfIJCPykjL$nhyN zAyHm-*)WNQ+E?I93T)QU6Myd5*UZRqRoe==S}!s1kpc~r)kM5xlnYXYaNw_}nxE$M zC6fa}XK~9&*^Xd1l9HI*SY+7yii=vw=x13EwS7cqJo|R65rhjrP~JjdZ(8aq{)DXI zkSDrDG*)(}wDfY2GTI?A-d8`^zEg>+nke<1T8Gcp#A29l^pa&UY+3zcZ* z%O^yi+0Q!l5H$8cPr~IJenroBddEY%@ygBHa9|F9(?)-5V0||+ewi73W63{qIr>WWXmS{I`5fkf76a<5F0efL=FwPzd4O~AI z#-~Ox3|pG6kV}M=dt_XW?$;SBbem(HFeV@ub&X}J%jc0II@*$V@*mmLiD;0j+D}mD zc7O_H7oQV8P3rBG&1T}*^hImA6F!U`VT3DpwwZ{+hUYeIn%!2Hsx3|sVD1;Bovvq1 zAn?gSJiG$#NBJkX7(7sq)G#C}aC~%?fhxH%Xhs#>mzr1WKxE3Cb+*>Lf$)T=^N$1w z>C6(TiLmNS3OX1S?6gt_G6j><)tRKq3^cTX0IMtDPYFdZ?Ey7v{Q8FbRk{u>5Occ+ zgf%8S9SmpK8&W2^JT&Av4PU`j0|o8Pg<8U1fXGLfVSHq;w||WNozGtdi4*9!a@BMs zI;0QgX5E%tl%~E5H~Wd=Gm7|5!%ENq0+{@mEVve9I@S0;QA~$`EPJPU&;hloLL|zSN;0ONE8WONX%N*-12uRE*RGu_E z{Y${?zf-RL`_VZr`tgcOP4%JmaZmYUTAw+9c*Gq5$_+&*{B&$m!~zRjex9jW#02C< zNUm#zg(F0ki0UONs3FE**@Fdbr|`uz3_P<^5Gr^`O#UTknrnmbN!^~G{?Zn1a6!0V zqsjJ}c)NI%RIWwZI%3ck1=}P`xh%P<XTB4E+WE0ynR2mIa*`<<+fo``Mo*whGI-b`-#;xFYVABS9rIyN#RzWlz)#d z^6d%F$?(`bMDbDA=uQB3B!D#%*5UrhowDJ@Q|Ko8~ulp&om5sJqgboRI z51obn(u*i&6?Sj%gq28%19rr?fvaYsYFdhyU0WDbEsJ{vGK?HHBBo_r)xxdnD}mKh zQP9H^ij^ohj#SYAGnZmjIRL_epFHfs!EAEGGO(sTN(P+vTNqK~S!e1)OqBVB(US>Q zh-9;bh8EOA#**8xP%V?JjtRF&leNj<3DcXQQNrG1WKfB)5l9M&Uq@cAmbVsWYBLo} ze;@vDuWXi6!eOoZQpV=fe?WPEng;UI{_1&&%5R#wB#-G%+-5nKZzb(O4KZ6UF`76Lewp=btp)Yy@<~u5b)b#iqtl?me(q z(F?Dp$sid%s=?38$K~WI$3-v3{e82l3-`xNWxZbhvSPOusE&n-mGCn!Sj)g(skW>2 zjSDFpOK(wSZNoF4OMK)`u9*&j8TcwN75J0YUna5bh9X;$*##8I6FMh_^ZJgRuq+8F$7sM%!>b9lTsl!QTf1k>VIpMQ zrA9{14f+B+X_w(kr!|A~KRFE^xND@IKT_(3{X|0EDDnNpvItfjkz%?8<)c>#8IyIGw&od@XJ~&t(;*=35`+K-}PXjnB)`>@(c%U|fV@u|dz!{c9 z%d>im5T;T1^BZR1!jvh*?|iT%7J%haUV6s_468tGjM{$lK@AF4YBB=?vlB2!^X-}! zg4PzRYKzXuB#~a5GZI26__Uls8zA_XY%0D{VNer{9)cM=6qS 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%0D+n?!D4JQtO=6^mgk}x}I-oo~ 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

    |JXY>gsYy|GRCF-w! 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

    j9A2%iUcu*(Ay$X}zS}n24 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

    I$(x{xU?R2Z64}fQrM= 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%0DteO|$_6U=Wz=g+=qTadtIF`YiSk#) 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
    thD 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

    98s3zBS+-&?)Qbi0`-)Ya_(abt)|CKC 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

    )%6a zma&12pK649i6?L72Ee&}RCJQef{^GW8DaL=W3MEcEzoGilJU%GaxxPNbfPc+%Q+!S z2)q%FM>7*`;)ELdwDdj#HTz0Jc(p-M{%DV>Q^OSS-5yit=9p@6_9s>>RlTXB$dRhv zwD`AYwJV?tIMZ0zfL8~~2i#86hhGew17+D+1zmMkXBBirl2|x}GB`CVV!#&aPf-_Y~`0YF0r7gCaxiIN%m|se7{L zc5JRFw@7AaRJ3vaWD984At^@d+lPfz+Q1cdKT4&USyBDlPnKs5KL6;0&sT}#y!yjO z^HtcU=M1-f-2wIBl1+sM@fQnIs&cz_Bv&krHEYAtfrTaCXVx0LA{KuZ54fwt~BHy zaa_^;p{7Y$!|Hdck*MpjcHXb3loe?eDirX*g7E1q>E2z@9k_y}({^CFtY91t<8-QP zO{%oI4nNsmXwUH~)okg&|J&n_mFP?Cr{_#?A;bIKa0RU3dR#Mldm4o_{<)ZgW z)b~V+&;iDGIXAuopoMk@=b}{N-vfss<;5sZ9az8%UW_+}FN=5IzMpUA*P#0G) z0IZC-W)ZFV9NrOHo zVQ?DcBxz4!aJjy$P-58y;9VlDSc^yi*)leeE@ZxMK?xk*=Gs zJy^^`r@WYq73|HbcP13NzzWLn%IE?s49W^O_sTq+R0k?_U_+T5ePw|slXo3pe2MDl z1UpSkdZwC=kTu=)tIy#@sv^xwO$WZ3ZV(lnJIICUxZ2`#7dvzX)WnKg5?9c{Q~+tL zIJ0w&ZLh)NmzUZ|KYQgD>NqwgddBgV5TYna#ml%k<#468gyfc z#=)q@kgO9f!eyw&;#4=hdN_7f08H;RWp$)P1HYAV1*&lcs=3)sjSE=~Xsdb_W|`LY zsBz4$$KhD2NopW3)sqNewQAiOU`h3`6H9hb4I`j>6mHerVcT__Ug8-rn5!;ZX1Ec z!}<2!#H;bRQ3EijHfAg}USey&Bh}{SRbnwJv5%BS$y{Bj(18=$-8nEa;4w+3?~27vl6(9`SD-E78CcRjY7os@m{n zrYgcc1W(ehoh1oXufXI{ahI|R*Ru*w&lPubs(wT|ms+^G?G)!OTpZaYVGG*MRHbQ9 z(oLu)-B67oMAxp$=o_jwJm;`Nl*Z*irZ{d|c5SMw*R9KN|1*mD2u9l9A zL4~PYVJcT=j-Zz7C}w`Oas|+!Rq+2bJ&dfDN-*F8Zmw)$#jMl4EMe8Y4kc1hy{eI( zPsOce!>MFL+yzsWk@7v4CR!;pcKr}c6t9$@>gK1#tCpC7!8GxP@KcF#iY~-UWA)wb zbeO+X0MXO?b-E7pb5LsJN!0T34b$SJcJr4m2Fi%j#R? z{Fv0yrVFHNUy!c8!a5L17b|5a)$j9WC~$d$dJ86%bml8bsa4Vuv!qAD5{fQd*R~=$ zvf_ew1uF~Bp>S+F3R!GhNP0+xOEnk_c}95S>b9aaIY9VxPEIztw#h?_M& zey9m!bFNP*jvRc)j!)$qCF*xY9<+R5Y^+217`t1P(XkOo*S;W~QgOz{RCJXIB$I&Q zn){)1kA|8l!|gkJ&s%aMxDQG|@{)hSvgGo}fZWJB#~9Ft`WZ{u`x%d0Y(_E$e0FzP zz!|uP<#heXMNlf%P@vabsaU)TE<6}v*_%#F9)(x5VC4FZL#fI~sbu5Gp(yK!YN!zl z+&c???<_tm(ZCUDtzao1Gg}DFqg4UTXo34r(VC;syU4=4h8bv&OzYt_xf>04ngVy4 z!q^}e(8Cl^(G4A@D@(zLdGQopO(ePZQD+`r1(%Ru+~PyHJMIB)(}^27Xon)R zlWDQ7nav9T;eK)5Y`232kXwp-K9Zz-fzJn`7VpBD!nW;*W%?zOsUNl2wNV{NDzy)O zU{Ng#3X6&E-C;59Mc#qSQX4Fx|yzmJ>&3g-y$vs5=fO;rG$`YLw5iI(vv>6+N*uz1Ce zQwqpA^f{jHxA0nu^DP}IYdTUEv^f`ape^_lTd^M=8}jVh+0Bc$!9f>}i-Smk16R>` zs)YK!z^hEb4_x(DWT?Ku$+|OCH^Oru5V!q#chtMspJJ!YXm^Ctb%E1WAuZ^jXdZM( zELFwM#6L+Vx)==#$GCzYZi_=D8gxbN3%-W2Q*XrDBvQ9fsxDT1phYl5_hYlDh_(n% z_uI==_a%-Rw9?k}M+vwv+RSPkRp{hWLIq1Ja!EUPNhg$&##ae-ejB*Ql`z=_oE|iu z#-_Bq4xi(JzgJkNv*K&;ZUEH2;>6d+$D2moVErVqKIkM6EfhJ%P%9Njw#Z+?N25-( zGL2}3q0+Q2TjjT43jm6+OzfE(kGBQfrAqTqUS=wE;D*+pBgcKI2e5g53?KJ-v@U)C zZ2%=O66wrZF8S=lBXkL0fbyDa(4luPLE~ixiV{7B6~9naO!)jSXAxy`F!J|s#!!CD zJ8_qhjDwM@NMvYKicaMFa4CXupTZ|E+3eptk>3Olbh2YQkZ|Qi@bD#jvV-kbw&62f z37z5WCC>sS9H!}2qlRGsbolTlG3KDO**RVRN`+G1nu579D=iqMk>F7XBEqsN?X69U(f432jdas+97{ z5i~<3=ywG5*YIG$2I&Iwh+c|}7cZ)h%~V2B3cV>kkd>=0R8J}2c41*&UUa4Pk&^a< zQdj|%Pym%xB4;vkZ#g_7Onjy;O z_tFee8cs8Geme`W4E=p93I8Xl4~F%#)CXBUbfYIp?sFeBd6fE~DgQB;50a)BHp47U z6+?jfHB1Q8KNTmnye8=Uvd*h&n5JnyY|^T1gt+Dm0e=vKLLvSWA0q!%k&pQ`Oqvp( zuky6chINuPc`Z&Eb(LpT-egtM{O2$+WTFx3ELY42=2uo0!@8-eq!O)DG)*lkI?S57 zF3XClm=|UGpTeNVlU97%Mnfj$uQ7{ z1e}ea2Q~mpMIf0Bqzjco_a{Qg<3iIdRu=w0R}oShA?RP#D5?e;aGG$q2{IYd5$!*f{hR?^-KZO)3{MY&A_)0up;z8m(Yd; zQ${e*(}V+>K>%R;DECx>`b*$_Q|`=^d#)l(ZG>RCX*jpWKzdzwn_)`O#Le)Bfa9v> zUd7c7W(1n|T)wTtd_V`m)K^0XX(nH34F#ipotbnvs_@2TOCfzl)~!KRn7}sC7z40R ztqdb`Vz?a){dDel%VauG0v#Y?mNP!z3~gWntK4zH(a9yglCm|_A5xG>xdV>WQ?}O? z8c5m?$IjL6>hPqQAb?c_Ll?k50{0#;LJ|*@wMp_|kOF}Ut2tPKmFNQt^|~04j^N&f z73vvKNAugF6XHww@OO#OXvXE+4#puO-8+$j9Scw-iT?xKq+R{VoiL73uZxc4N{G>heg-zb%9k4kWf#;pSD5C z4+as`lMtpBA*d%YS!G3jXedz;iOTrKRK&V9C+jBC4<}N%A{d9;z?S^Qcw+S=GNX@4 zq};aJkYJ0U4E3aQngto^NjxiA4SWlqeuolnn`)feYP>U%wwy@eYHVuwC%iQkC;F3{ z4#=e@JO(Bcm4*WMbs(0e1a1_G=0%rClnE@3OduX&Xa-m=2LtqbiomZr5Q>TdPFbc% z65hIiKbH&)uYuc|Zwh=#`A|2|w)*5?k0R|+v zgx+n^MHoc0Cq47qpk&S53U;r= z7I-os36J`d-@}-lJ&8-u1|<&+g|jDdA}k1}@^zLK!Pg|P0m}GfDq_)?CFTJlJvfoV z6|sOG03x{1pF9uaY4#*QK^v5uF*r3BEBzO$AF}0X2IPmf2{*yAezI+ zEN^rm{H;rz5KWOJCUA)}s0<9lGgKOw8vu{_jc%Yy)o9? z31_6tW_2K-45>x~r$!QMFO~k(x|IN!r%~o~kpLy7A?a>jxDsAzRIyDBx^$;8w7@wy z@m4_^(3gt)OV79SAla8>#A*ZKXD(Bg1Zyx%RFXOjeV4BTE7#S)WkuHN{H=z~T*4?x`vF8x>*AMhKSs zo1$-{X{EdQTbQP+2Xd`8B)DcIU6RGjQf>8)^`kF717{gPY3gv!K40qU6%$@=yG+FLP72&}~2$uU^ z@rFr5I(@)_`8C#=I~B5JFgi9>2rS;Plx^wj*|}lxxz{sPvIGGxEYsIG*ymDV`vz!D zSprl1fm03%^ikmKCj-NWx7uLU0l#IY+oM)rA2?qJfZQ>b99_B01t~MD*e3=2My0HE z%&}~Tfo%uCxKV8ePHhw%+Sq|Z>nZE=Y;3X6Ua(w&^t9C^T7bkm)ZmLJ21JoH$9qK= zMMv5X>f7&w+*gtsstts1yOdSE;}0%Vl_YV(INVk=bGX6nm~m(fOTaco5w>lFU>APX z{G_M97)lw*Q54`>Qp_}MNOH<3mK4d3rB_mnI*fHkM4|gmVv281G@vg7?~)TGSb=>- zJVm!{eRbInlQ2mpvNj~xW3)+{IV>{^fHr=?XXulXn#+{jvS55v5%z3^V7WgjexhT; zA|(m80vt$^RjLgMju}glrhiJzf~!r!@frH0WM4Anwx{~fD#Edi5G?nRW(iVe^(v<$ z2^rMaJZXy2=@_@AB-LTiLmeSZtD&TI?-4F#CQRPxT1?}W4g^|DhUGEShZeX8Q2c>Y z7>U(XfJ96NhL^814a2BVQgy4Gsjm;5uLBnG7&k&w9bk%5bSlxgUTscQ;J^t4zNv&% z((MCWQ>xCusSZFmDfYlAPyST}_I2P()Nh8`7>pz!QI(WL_nKrT`{AqKN<#q%4kNvI zgL^ALjik8M+MuLhL_LZ}$`bS_PPZg{JBl{XlIG%G#Fi;pUB;08*T#5)JeN}J(lKOCB0?WbG7 z@zfMavayQ5z77m8gAbY$9+bIg&+SY+WjLfg3GFW{@+i4+LN>tQuCE+HiZ-~%&B=|cIbuE+(b&9NMX%a4b)%F{E_N=69Do9fVw>i z^4kU_6~n{rN!)u2huf2&!m=Xx8a@tC?sQ}-vS%yOm`IfqiT5AQaVc(x5)arC>T2@Z zJ-`1Fjd&~_IP_65O&p|teScAq!?^w`$l;!ZE7lAGdK-m@48aTjE{T6iKo?mUwL~v-rCEQFAxvFm*7`x{}3r$6@hRRJ%0v>Favk0oSTy z*F*Mal$;WpWdiW(UL?ts^U-KwWsTvAtuPHV4{f&NPz@`(*lu=;wlXu{9EBtGO{AAR zosen-RCi!o0yCThD!?nnq2~Mq85P(>!GR}9)A-og(9C3#qfDz1x}0QoUTg)a40@W6 z%+8lhm&l+esm$bbd80|dL>!t4Tc)k8wn%cMA<`QsQh45P8#b?ZzZhn#o+Q@_umSWW z5mpPf;qRgw25(mN*-oA*9rUeEFircgko zJAU8o8xp%c%VegAtO8sEJ;@~21|@rpJ)oya!3z6gVJ`aeYxuaL?lRT3T9)*qiL~cL z3ilsQ8=o~1pCa+DkoAm2p4Xi9D%Fxr_giJ`4fB#r(YBcuZQa-}uS3N12qFeEh#N7YyW?C?~d zX%a+RRakuX+Fk&9<|A$AI?HU4@*?j$*<3kZUEm)@KxY71D|nMgEW>P!20ZsZt1iF zJK-5n4RuFt$nia}0=Cn0$; z#!P`Ki61?;xUazx4uINn$H2(yBcsG)O`wM`BRoJHuF1d4Z3lO?Cm|{|?CQ1-+*1=| z;7kxn0j!WujUCgWgCc5*^w~ijJ&4!nNYn9vzpT3Yd+&p_!Q`X0<)wzHn#0&;YfWaQilQL!T7zCO1*TM zjHDwoSVv=v6@r)O!@|xui9Az&i?1;46w{lBVeBuT6;X?1jl0>kSM&EkbF3WIT zhkjj+Rw?TCU-*fJ;m*D_zU6R-U$7RrRfX@{!Yj$0szKk@zyoMteSPcq^&RiBwa6&B z^HbjPlw&m}2i}-ms4+S4#^f^6atpuZ#{6sN;R-JNVvc{t(jzfMTZ1TV)c&6x5F~wf z1d;>|lfHop@zH51>A<+Ddx*CrwqEQSz`MkoMX8r11^f7gN0QtSNh10R#zy8rhSa(s#VRB3!7 zzANBfD*dgui|PIN!2$O5A&fP???b%yHyRd5!uo4lKZWda=^(o(AQPHd6!_@XPH*2g z4rYS~*-K)J+@O%wY0~wL!+B3Z%vTr=3MJh`)zuK!S6b)DCc?uLnWCsU~NQ-!fIa=dV^;dXt4R3W}yQamPBO)sqv$8e#yb!gZs)y zt8ib06vHD)i}>0`gW4wp^0?$6bttDYcn>+j;6m~=2%jayr_EGx(R{RAG&1)U1~ zT|Zz{lWF6mT+$rlgpwO?voeUCKp8v!;V6eWq2y~}=!CrR5@p6xDc=kpg~(~P+ru{| zO#}f@b}>(6x>)is=FkwC29exOij{3Mt{L1m?fG7{XWwm43k=J~ z!nQva-kTC1L?q+Ce3g?|ZFd#CH}~7(IHDTbw5(&wB++Xq7x-0xu=dw5+mKh9{KB&k;JOPO2{$yEXOU~-QXqOuvIB6X1GNBe2-^nq`;Fl~ z(CVQ}4T@a-u&0@jb}WYmF1Jr%5@J~+mfI(=;@W{Xx51za3LLQd{D4($IP@EDZ18)B ze$KblEC5)VY0Th4FImMfd}k&+iO#tuKQ-?@Ss0Bs@ixjLHECe_P+%q(MyLFw0{c#& zgl#UMuPpStMImD@97<`9cJ1yP1n1t_HwxpV?Jz5_G>?9oXB;vLdYvo)?g8UI&2;_YGNqThn$Q7#lhkiowAO_g~JiE-3k`ApDtgLt|srwV=@8Go$3c z$3~@R{#I5#cDgXAM;5=}wFR>kv+cDelYwkZ4k63=RJij^krwfn zxYR?iwKiYEonXFh%)Lqd2Wx^Q%1ZJ29^6J|dp^|aGPO{NlEF>*3Fu82b4v3~&BQ0S zzese}|5;T}LbNBBv+BHX%NqYki@VFM{?*s`>n3;V>ss(0H#l`n-`YcO4+v_(F1^0( zk~Fovrni)V6^k3%cDBH)GYnL+b&Qm^@p47h@yT$Q3c2`2F8b&)160A>XNCv{2*KXk zDqo7Iib>_J4ZA^4Q7CaY*db{`q)vZtdfZk(#-7m_4ttra%)C(7A$1Ppjr=*%|7{dn zPUxeu7NXu8R)agB_NBTHxg)db7R-H%|1JNWJ!jL0(8O>2J^e$rp?A}kJpXojd{ZTV z{av;}Ann8DhVW%j;Z^;B^DRpS>eHg`A$ICtIMWOHmnQ0)0;+_)oFE3;c)yc3Vb(o` zck}mmm?wE7xvthW-!@CE(e{mQIlTv^Y3jQG{t9TxjaB^h_3prXaq<<-25mZna-jcUrvtVd`+OEFD70zQd}s<2nfi|bc>bQS#zE@ru_BtaG|wo zK-UcC^0k|s^xD;wZ#aK_$Airxa=aY9zixk%AL?xEoZU!i1Ogj7cW3oQ_uBW9VkZd9 zn9A>Wo;xr&BRtn5=`OQHt|>#;$ARpZBJqv?&a=*Ul@-G_7VfV%4yG0DtUqd+7hYOi z-8I`44vAdRNlw9{hLyQq4#E!=A| z_e05dzEO9OkP)ev-d}FDc**BR(ci0`pAdc5K2#4XYV&pR5}zLM+{7)CWWpm^W;p)G zhhI4yE(xg_wy}~uDWbf2FZST3j@1B+nwZS-LFid_j}7QLpe7^i;=Mh zCRDQoC%moJGewK2lDMJ$Y{R{SeL@~WP)2zB-X?gE_JJSXH{03Yo_iRr@hAf2@2YB+ zGl?#`MIL(Qg)REzK(gv|GFkXqTy+m!HoQNLs1RPMSg1VJN7KK z$%$wx3!##J*LkBRR#-Ah4UZ{SRa`J78%dmZNshpE%R017a|Lrzp7B$Sf_!A{hAmYi z855xu(I=OsElWpCD6lvQ|L!8KNR>QUgAy!rlWRkGD?LX>InYartENh{B8FZkS=TTk z>VxahB6*t!fu0!_OQLvg>>DfubwwLt>R==8`>^bTs>c-m}dQFR{EG`0XiGKkCRY57gVCs4QH{ zxr1U&!Mjife)?}78u$5GtSZ=dtv6K8q+sk0Q(+(7q*82U4@tiWF)UF6OyFKOH5k*4 zLu!x+NR4ALl#4Cwq5Bn$@%(=x8fObq&#uQefe|>>ol8+AISW~MAxiSS!b4-qNeL%k zF{>hGCZV)*$T&Z3&uDF33#S7(N^&)m1bgUjq*4-O)6AZ&S{qgh2g6=b&K$)5UQAY} zM}Q-Sa$HrU6r97$_Fu5@ZYVMn99=4S(Vl~F_makS=W^hlSldT z42hSDAzA)9Ea=gUU#R*q8*O=D0yhWb^l_J>YqXC2X$O-ehnhQEaC zlK;>O=zf|Qc9bKuq}bo9FZz)YOV}6B$4rj2@~W4Q8vS?2LyDdX$;U-1Nqfq8Md4lL<#r zn~lYy=&q6y&_gTFx(@t8F_5^L3eQ`lmag<5vzSREe)o@(_5KS)nAj%K{8gLs$<8$S z&xdx{__e)TH z$O@yT@CLYC#=@wJg8dULT2LmW4|*m{$89=AaF zgGT?jKfQGhf^P%db0%^3Sp|lT2dKNt*8Bf* z(dcN(FRG2lhHFpYWJarvXOq?^9XKJ6_<>dQ;E4omZ{T(uU9M<>l{{fgeIp=Bkm`fB zvvA%$Nf2c}*wxPq$OO!xYM6a71El^)pI;DW1gzwOF~qZxoJ=M6z7+5(NCZ+(biom# zoa?X}=G_Z~J!ivyC8_D=H{LFXpu~2DqNUN(THUyGUs+Jmf*^aT0k$9XRBY=lBhe03Hb1yWWy1J`fPDiWhb47MT zx47nckp5MQC4(b={hsg(Q{@onwWQ0{KJXEfmeEEEsZn{8LxKC9?6r4_WXlZp{#2wM zt)P^df)CP=rO<{Rwvf{FQkO#(&~PebHA2kDFO4Pas&^1-NmqdeCGnL2>X4XQ?h%HZ z+2h&P>H*^Bah=7s%QCbIoa8QyTbAY+SYp6Z*JksJRdPq# zXYRXl!Ie^vihd>${uQ<4gy&A`retbOSEB%Wu$WMpUFJ%`0XjXgLD0Ufmjp>nopU#( zBGbqS5;vT2;7Bzh@bOPwtN>6F3_35i+ax+v?$ICZJ=idOq^25CUF9HSwTo|tMb+hC z;XL8^lz0{pYO4=?S0FN@L?lVOnhPN(?+#H5ynw7K^*B7zr}%0CtOno6uHlBNh_>o^ zpBr1Y%chjy5IyqG`BTk6{iB z7|0?w(vahbkPYnhY7D16?kU#xx-8IINJP z@%7Cv&geLv&Bfh|QjynMb#%%E+?arn!>xQOG#PHMUwVUxE$d*sJxpE6&~!Pr59J<1 z*4R>s4l5Cz*qf(YRipo0PfiO=oG4;nDFMKLdTfhe15MSuujrwPbja2m``G=ulF-?^ zE!q`Qmu6(}02${y)5A|>V@^cD4~AuEnhS-M7ur9$+4NfG*V*QMtOu8qakp`aW#SCo zBAG=)c!Nv%3+#Ev-haI82`$en0oS?1Y_seS=X7|O`o000204UHx>A~M7;riS5!zk6 z7?Qe~vm8$ES#58iuFfM|$hW_ezaEQf5C4Xqd6m%KiOD?-puNI%dm=ErCfqJ#Xfx3s zj*Gu*M@@yco)uRgBJSG3hISlYW1C3VOB-ZvN|LxWWSLCYZ1(MMif1hSbL!WiUY5VBZ5*E#1_7MG3wjNu1+!SYfv`csQ623pXugMJz6Zh3pBaDLCMgRo zNXWjsDqI?F-cum-NE_R|6ujq1~+c)8&$qCPx495 zNEs^Ux%762x6KW8Au;%`3C2WjvE5sPfD4zY^cn3H@i-(5BYjaS1Z9bFDACaw^i2!R zu5vS<8Xw3-g>Qq{^Fz334ewqma_&MK%82~GHcP9}uZJTOk=mopEcSn4a#H`bk^dCI z+!L3`==_^cL&U#Q7$0@M|mONa2vy?MyrJA$jMpg;PSyOh!K`L?#porJlrfFTzEv9xuppS$yJ z1Bl=YFg=&RCuDT|D-&>c{@2_1lCom(*p44q*f0yz5Cb6&1=sw@NQI%;{xE_&g-_!kUA$&Pv~Za6mWwokIiy=U4z z4=>HU2`JeTM&!hup7@o{jdR%0M6r0B8>Wmg65m#xB95_StMfXg_4JB?-2My zxv4RRAl*o3Oo_m+?U@*%a5-}i)-`UDR9x{B9=DU~BRSD4zT;RZD6K*(JG~HQFtXJ} z0FcQHc%RCEax$@sf5YtM>`Dw*kXKSk@8OceHzW9xgEKZOT~v4Bia%?J zU6r6X_;1Yhd`?}EJl05XBvp3639V_?J%xb~i^ab}qAP?1!lCKNk0x@Wx~&MP`6*AOO$c;1Iq6h% z5+%M#2-K0jPOGA7lM4)G?7F>TxJiQ;jYUZLUqtn|WkxhwyF`#Wf+VTQ(epqx zyF)e4pInIqH%z$BFx;U;1VX+*pdIZ+qnPlQvgpAn&q|^9@Mu;r?Y?z3br~tJ0P>pc z(DzT^slqLC#)xQjZG;|`dgox3=fAf3-*%RfSDxb)gkV?6&sVgdLeZ#}xT{)?U8VX9 zN@r8R^M32OV4ue&j*ML!@4Ox2d&_d-?1Q1!chvI`5C0P9u*$VkXnVVmqPsLrjzVm- zg{rJ$wq1<8SbQ-WksmOIu6U^Up~ns-^R?JTTQbUjW)imo(VjPgd`)z?&>j2#I#YBb zX)E$rc8YVaq@SgQU!+1eSHCtwb|qi!9xTNXaOJ{u@3QF4uCV4<_TS)?-Bn|T>zw#9 znpi(dEJWWp^C@rp5Flf_;zSoXx$5cZ7BHkIbr)G$Wu75Nl*a-!!trH+ps9)P>+evWa< zHKKysnjdbtkU@f9?YK4&ziiXjiLW?) zn-DqDzZHW!VADboYb>1)+F*QTEre=u5u2wE5eRh4GQv?ZkcrQ#0RKR4F&OvfIz7@j z*BR%6R}&{{EOhl4pL1D;#=BwdazJ$&Bv7C0d87@5S7Ag|3?P&{N`T{yrEb&3XBxON zRu3K28p?gQNEp=mVkQQl9I&V)6yqsFCx-QTOptWm3nJia9)wV$^D0J}XIc@$nP~xc zp=3Tui{!U7Nt@Mp6$D~L(Nr>rd=VQgsY_yp6jzF5bTS!G%2CvU(jaS8DxCl2FCOyJ zggebgh!C;iOrf9 zQxtRmfaorV8pU)KTH7u6!efXUkn?zrX~kOXZi4d*a9+H_j?gLvw2jvB4{$R z1wl2nS1FuQM~YQ_Fj@A}88*iaV!`!;fjeSsBiWi3uEN%@um>LngFi9Bl9`cUWba^G zX!2Jo(waZje{34f7>v=J9n^{KG00T7`@h7uIJaaEn$4p8ia{u50r688;-_yt1LkDf z=M(}K&JiCgK@<9)z@vD{M*I&4wkGar96bKg)TZekvnRwC z;KSfH}vL81Rx4G`BeT2~& zp~*Rs$ZCKp_8QfoNutz(;~LdjSxV|m@a%oTcx}>(0Fh>?RK_}O*0>sj1?<>H?!{9l zQfy~P&0z{hRU40IuzL-))>;Jd*mlZ4a@B$-T7GVjXh+~yCE2Gi?7?@7Jz1@MZpwI6 zAkX2yR!$r=veZ~M_#Sp&Q-6PP>N;Pn%@UrmgVD%|deu&SS^i6p4bcGCWyUkr>n{|c z5MqsiPiZxiW4grSpjt%w!+LGRNxm(z`Wo<1bShyzjEE>7e3p@MHiFWkZA_MRO4S5z zGSgeNbK3o{cC?Ds*wg3eUdn6@V1hW7PrYClzkt8tvOFit#@umDE77bvqD~-IVW~U076{M(&DpFdMdtgwJU{4g9!tzA z#Ke>!Wt7JjT_8dhlR%qp1e@JMCXq|<;s#CYZFs*7Og(r=vtaX+J`wCMue}>-yami& zmKUjyOC)8^A}B$WDF|qA7yrl@I~v&P{iRN-q&VjA)FYe3ri(2Mj88VB++eBSn`up7Am2KPdqPKSL;Z={ICo;^$f{kX#XeG=zR5js5imk z$I_y}E~?Ju-|7i*YTcbF>fVziuK-{kN+vpm1$zDVQ}yZHlwKhAqTaLXJ+R#cZE0w-p*InUQ4q zdMavqjS5qm>W>#Xm~bg(1AQB|6c+>+(t$J8-{ZTfOx!lahi3#ah(n{)E4Ip~fmrDb zZtY9vagnvPI#2yn&zv;Th~~%wr0V5mx|GZ{R_;=N=A~sAYP~tmO_XVh`dax-I`Jfw%iw*O;3dyv-2@X?ESmwSk)N=XP4ww1*-vEPlfR7R*gwz&nwjhowE$Bmyx+lw#LwfGam>4O6w4>qz4zkWKL_s~+*876p=;G?)2oPSJ5 zbsoaHuA`@x5MPBwl0_SYpL+#~2gkKPvrPe57%FVmaCe=nAm5_@a4;-9y%Z%qthtz& zsG9;zv7!jNv6Hle~*;|7C;ZtPhH4;S`;F=@^gijP!3Ghkx+eL56$OIkc) zv3{O3Q}MwBeSo6(0QyOzbmPW4g0b*_Y6toi0YfcMW%AkBEi0o4wFZm+$`Nqfa@QgLa?{BiH|soBiU6m^FjR6M7AYbWVBU z&K-A{7gE%d7&4rx=YP;ZC2z?T8ItQo`cGPJ)Y=K8ydz1P=a!9Fn1aB1oJ{u_b=cpe z=Et^W)ndj`C^;7~w~GcsDl~Li5H|OpClY}cI=9fN zE+uD~SjKVfIH>C$S--c`elF+minCjE{%{K$0!tiA7sb}uApZ#xPEU@?;#EmEwK3}( zj?v``Ca+q(aTr`P(9QRF6XC61d4KKj{a;2By453ymDvy4sS=NIaS>1hhlAl3y^R*( zcSk9V4cO{%H6UOP@fZ+Wy-t+Qyp^uDO&>}fa@3_Z*vOCDCXMa+hcC#CtpbqYN@hyoZueq7|Gl_X*P}%h zc5fAsiT{*=rrjSM>ow)g1|`stVJJ4k_%@?m*tWG8wCD_?>y?mqN!5B^1>m0XdsWI1 z1lJZ@R_dk|;GUy<2<5h4EN|6j<5=wwHI=R-$O;0U;RWEG!K?+`K|Na;;yd7L;P0ZR zdptZ)`TG<;4swt(XzrH3>l6@cYCjKlB@p`U*o*reEQnldk}&$ z>_3xa-iz33vL}X*gt8gMRS8sdNX@J}9RzjVxy#Gtq91Ov zv!$W-K}`m0EIVXf8^L&*#Mr=!F@o$0-1kWzs+;Vq>GyUrES>3Ckg~CN9ueR2R&H8H zk(lh_uv<&e_vC1RkTQ5+hf$#`tK8FqTr(@2~C26wI)h0dFh zB3Ho9J}#}L?V%k@uOS4`0*uKSy;O-Afv7O#viFw#(+S`^cY&ZR`$?ktBS?_0Z*n=R zkytCn&i^Q;jV&7*8A#gUZI)k%U=YZEl&Ma$Hjn032i;tC5Vg9Z#c%}A$59bfh1sdW zapzg}rx&TT7k<4(eCb%?bE@$u50=;ts|;GJKf{1-5qj;bCR9Wr>K%7LY0!SKS&`)Rp zM=$*KC%tDeY$!o=5SzB|h0>V|sojpHef!NDW_o#o8~L*1SDM*D!7N){7W?nXy9jCD z{GBp^*5leFP~9B9%@3NV!pbdfpJDo+_{Z4P;g6`t>pBRdju)_NKDDn^be(6Q`UHjC zvpt3;Foz>w#4v|Jtv{?IZNUI~C)e0MHN_n{wYHQ-kgkxY%OaHSn6tisyeVFWQmSqZ zdp9_UMZ3`2LnZr~aanOz?_}S)YP7s8 zSh9!H6hw$6RaJT-F;sK>Z8J~I8L48#NqlQ%H%Uo7p*BI7Qk4b3%^6wA4yA=t$!~UV zzn^3of-uW^2ImS%>j;-6b4+DDq7CW*vxD!6h(x=u&n2v$Ck8Jw|%@JwT~NJv9#lJhF|w6&mQ%I!`6 z&v@D{*((3&3z2D6Yu$T~#XtUwGh)$iWY z>P@A_vlOPxp^lW>aKLedyi$r|nRYnf_gUj|<5c1tXehZ=tuLKcH3rEwg=J~8r!~huSM+fhG z-5ynpdmJ#4;k9|?mDoS2#LZ6P?I02dZ(?n{TA`CLM5X+hGy*W4AbSGhte2TOKgTsa zxpw{$=Y6WuwB4UOI1K}4`fIC6Dvf=qsY}?RnH-EQs(j<-mYn}$!WAR>Ih0P|U1V{I z5!q$VRGI6$>~ULrp7l^TT`o1weR*eW@lm{MDh57sia|&o#8W)77Bv?y?J;CGiOW!Y zbhPwyPrR78bi_zJm!BlU`psK4kNP*JX|2^6m)63tRva-JSS@=Mg*^;JrC}}uQ7nr8Kg<=F*xR%Rq|N91nEq>z8*npS%oCab2pELG$eYQozYEh&E>*%CtDNzCWQ{d=}&mAo(@?EEKKjZPBM%urx>^c-b zZ0`c`VVk)e7Kw}FwF|c5&}jJK&f3tBZ5#Tsi2N7m({2y?P1%B>Y4)cCkJ~LY#@~UMm8&;d^#gsI zJMqQ`HK^;Ltpl3s&0x1b2KQlbsDnf>w_R(ms77Oo#zYFCTd z5Gj_U@W%{zObV?y?GE^OqWZ$5PM34)6jYZl>_e|3KIScIptw%J2cq#Zq zo}pdLnBdCtP^-lxgDDjBnOH5Hp4O4ZLKQb4EgQc*lsl$|5w(7sThP58+_Nrt(KPDi zi1dR->uU*QVDz7X;LhNK4j1~fbL~$k3cfRqO`WgI*pUNqAn-^itue0!#d9yxBkq8d zjXLeNou-C^rUtZX3tXLP5uIsDC()srd)mThNkpNI{kn^u=;vpbWe;nCWL{dDDL@2D#gqXkKpp)z9U z7JStTL3Xv%0jpZMhW0Ft8{xbSpKkKn#AXH#>&+`1BzYKQhE`L&PK&waDHq0}1v=|81oP8-* zHCaCCw`MF#=4fbw?yHpr9izjY%K`E1CygZaNP-|$64)$7)jU~Tt?Zs^pdn!0xwyvb^evD|pv(J;^bbh!HIkYs*d z*GKa6I(f0pjI!LaAVPeJYHdt?_v+8J(X%f$Exx|`cY-2hyZS0#pNM=@gs)dkXHx1d zDGeODP1z5R@EcIlS1e7XDNaQNfxi-S*D_XEE!EUz-Y|jO5S$G=b)xh`tAEsP<4FzFJ_2dQ%#hDDNi^fcG9rp! z&fPp3D(%gSU{axuDiwTZswyNVI|@wA1=|jx&X*8on5&OwIs$S51KLw%?L4OxEtJ)y z(ftkQbQIN4mR6X~8(FjY58+kk(j}Xc=AGY@9s_K*5lDcHPjv~@vh4$sBJy1Vq_J4K z+gJtgdOa0^YA>V<4h(g|>^abKe-Nl~SfS0+w$I8v}B!tTj6ykZ=(+|u8 zigda`RtZkK1Qvf&9W2g`$pj3I4*XX-qK^6liak0Fig>`%6xuD$W3Pd!*u_>**czFm zNI+D|f5i&8bKc=k* z_wN_0(_rhB)&Md$@ZiCn6^t!K3uHQh1&mwk&nHOptkL{JX|bpO5)q7ghu)p9_8P55eqSVb9G7%q$S8d;bV*G1C>m5{w`FShbkQquX7;&CwtWo!f zS}MYDW6WXfA$;6lNel=jqEFc_{PIxeL4ILs0+miIO74h3(28vwVH+nOK2+MqX_1i_&?cB!CE~sjOb&K+$ zD_J-{X$<-fSN(?F9)pVUNiUs@9>I31t@QG#m%4;3+G4T2oDs3NY)VOh-Ie6hDv(tm9TPl*QQGqJ2^mjSM{3uKn;^^~#&Tap2@s3= zt0Odf0#pM6g8a{>0MpSgIAOss7j^M;ms4ysTJ(oW@yK74#CP{kuucqBu`GF6K%O&z zMtXIW_w0h;7b#tHNj)~wzq->p5%uPCT{5_j0R@>hKQdMBCwG~xHVq3p_+m{H_*&KmivLS(s68l!ro`43S zp*H7xx$$myg2)|)76K-kH1Ms#<}>^K)Q{zD^KIN$=TZxn`y$8wt%}8ldE^(bJV7Ok zG%BFWnL@Kyf`IIwGnsauR=>qm3RZ8e|3h%0sl47qpYV7D4ErLf3}Xs(oNr?_i03-f z^U&~b84lbZ$eASGx}PJg$l(8mNPpEBa#pe@n%?@QpPe5E!DeP^qvjI-dqT*mSI*wU zGF=TvPd^W(+S{wa;{NDmUd~`<@MKD|*CPtpI5^b?JGOG9)tAumxEyuSil)^|?(EH* zKl%*NEhFbAn$$M-jOP+I;X-G-iZ3AbkwG(-v1&*8`3Fs_l+4*8b&Anf=+;E&@B%KY zgj{+N$wWweomq>Y+_`}>KbM0n={Pm{Hr$!Ym`YRBBRdxi-A*RoQYMPK=qA!`orjtO zn=puh{Ah!NjPxMYHrUuvKW*xED=6eBh>itK>&wt1v;v7GRQgmmnKMe}l=Ys-<_)E| zRTvyn`}N@!e#v0UQH=(~Ry37P;7OqNuc(+ntXdov8P(9PBPMTL1aaSRk)n+f?zX(^ z;!pFZ?x5ZHi(KDTN)Zu7l<>88?_>(UQi-}p6}UpQEVPdDQn{14UGc{zHU1x>FftwR z>TS6|g#;HV2UMGJ1szu>0`T?#v#H+=CHaSN9AJ-NgyvVk1%h!Q0y?Piy21L_Z%?9D z*kSyA^&)|xCyF~hI-Uo+tR>f}Tx60p7Q`zY;=~`y_4d<7*F)BE*-)`M`|7+E|B`QC zB68l$>|@0AL1Lrh`YS#B2>!wHcWkz--Nvdr#IMrE8Y$6!?n)hW^Ae{qzl#(>4QROn z1`c4)H1dNNO@rg_Tko39L4TPF3ECNL17}nR^#@1YV-$G$4gfw3F>sd*M|X!749x9r z`K1N&A~BL&0 z3&uM(&@@ad9&=&d__pC+iU;J@e$No$J@HgnstwIdcx*W-EYiqV4`oH#^^J!J&gXVz z@`yb{jeAW@FU?NP1$AVuZ*aONm#{>unWwqSa}%-Rau9L&@2wsOug^Osy= zI_#BhY5wGBGmIO~&4u9xK!8X-Whu`Qb__Xk1(&#uHUaAt0s~}>oaK^bcrOFlaQ@DM zrcPHiw-9P;jnu8V!k{6b@@{E!@sYbs1nv4V!Cig6gf@hodT{!WIDH8|>JMhb@k8Wa zRC9JIZvudgylhe1H%1*H79aj>N$J`y8#LMwd8YX0!r!5u4^Cd{&s7_n@Q=p z7r7mpr3=lB)Q@K;?kY3}fKFoGK)S5OMnDX3e&ua>GlY+}(->R58szE{^j=UXj@u}1 zRcA!#yB2JD`1I`Q-g$pL*Nbk+hpC2)mT4iV6Qzr7I ztu%%(zupGX5q`yD;z-CPWbUGU6+loa#xQ`}&TQok;ze{eiCCI%l&4cXF^ zUzuDsz2G~tvhuYH1qyf;=e#?c>Pvu%V>UmuvM9omNT&*_zHiPTpHxgE=POS~eyS0u<2)6#%m_2pLHkdp5OMF#yNF-NN5`ykrb><}H* z005D6u;v`Eec_L}Tii9MCn^N)0Q>ee!S68hUBEyot{4-=Qv7O9cgG0bLRu@{M|7UIUb%~(}1!52?>73 z15Yd&Ohcb)Zz&E(Zc`>itHifdycV`KTrUpuAaWJdb0pA92B@5npy_!VLEWK+VfIhs z+qI!#2|OXn@1mtf%Ilmw*Sl>G4%Ck?L*rg+_YNWr^v~Wv(x;&<2D{WL1%P8Qh>3eS zSJfFZje%Rm)G`7>4#j{qfNa_MuJ7~9+L1tmGL0uL%j``!GUuk$sf-msXH{0~=+K^5 zP11D$8>exW55@%-Kb5%+VlzF#1LpR$p2+H=H0aw&S}1+mf)&4fiKYXvWq+Y(wD^LX zzktXm{C%G=c5~Q+4eX`Jf#`QCf;@7Dsf?CPPPEiJ*wEwnJ zb%N#jY?{6KK7XotJNEDG0dln-xxDTKRRgK=eSi$C#5!}K^i87NpmLjvoaJol%*$z{ z*L$HB}4uAI#*gI1w^bqx_l zbi7e?*Tz#A$F^=lzx?R@x710D`Z`j}M9dDCnageRO473}BM#nCjOvLp6;SF|#PVd$ zB5vL=KQ2Me&|X(Pq0B`#arB$Dysvo$jyFgCs$ag6Z5!LXo~WWIb?Wx0;FgE$30p-a zXou?_Nz-QT{nvmXiDt6M(9iF>FSnDF^&v~b4tGwu&Uw5*TETpWnd|)2q&PBUv1pA| z`6Cza8AU|-zR8R27JZA=;s%&Lz8A~P^OX&;) zsc9TWDCNHeUJhBbeNgE$rG6*;(=rhTruoxu0aB){POs8$4jR=ocyA&`aS6RtY4xu|W?y%Ov8&9T~qgJj{{digF zGmWe%KSVkwF|TwKu^bf2Y;0Q&G(^szcX&3x7^L9dp$xS%+Pq%T#Ci=VdTEe*AJ?X8OR}k-rU{8 z0ccRk^~pOrs^C3dZwBk{@7>^1On6)w+Ioht`2Nhr%I?!LX}d7J7n6L^dEP0$03g#h zxQ_jD71VkFSQeSlZpQRsGBbOyot)_|ex@~Fv{fK+uD7nV(e=t!=z%U$NS&q$Il`M$`q`0$Y3F1a^hCD@PKxbV}8raB) zKO8Uqt!GYk*!BQdf<1zEVD}{KwwPYZ-l+vYq3iH%v8OTz`XDPRDJPR1ZWJ7`pdOFZT`v&={I}Gc9zNeKgVeTYR=? zlX2qn82b#bb>G+KxTD#xhNJX4>OKj;VcY&kYSa&!Fpe$nfRJG~?pM6~(=d@7(FLo! z?J+;>?EUR=epH`yXpDS?zp}1xM|Qv!MgFdrGaV6?vLn`z7{}z`e+~Yr0=?Ng({?BE z3-Z@890MF#wxM?=vLdq;W=0wh>HUc-zGe4NrF$%s0i{O!rv)DGrG`>%Rg{%N)JmmQ zIz;WqDH8M-hEGNv<}cgV+XK#eNJjFcvkw|*z)Q4gaR~nZ^3e}I>OOj;>jyacBn!bv zGLABN{?^^Ee_WIW)MRx-YUdY!r;K3PAdGQ;ketDw{f7HiMfs{%TtVGU)%yz}vpD28 zDu%If8=`<;s!3D{0{Z?<^MjmVlk4^eTJvsV;tz<~0Cipjpkpp9g%=B*)TuKe(S(9szBeb(}5|4T%8Xcti$;BO*%P_^Yi0^0+j z>?}b=PKdo_n|=5qlt4s{b;h2ZdWWU&#NW`QW&sL)W*7OJXM&(yxkaOjl7SH!wM@dp zp2tT0-(NLB21=3tXw8&?vpn5sV}BFP#3uF4olE(hHuud}w|~4s6zeZ6TgQ29i@IR` zOMRM)q)V?~y}CzfoV!tOq?agE3%XMK)_8e?3QCL?D?JvD<0=yqptC283Qz_bWQ=rq zwgIGJ`IqzzXKu&xd0i%dJ-h`(ikTAzM97bI!2}vNVd{D3C5!z3+h`&7U+ti=3hadW zvis>z2EA}>NLDBwb?^hvXNDXt^P+YNt^D3gnP-->D+9uIa*RrSU(8j3o9|CKc9&vq z=LPJoZ5^Gb>pmY3YOg-T@BZB%So`ByQN*0=kK^HqC&c>3_Qb)b8V=~wBWe#v<~U3RA9+t_$} z8Mm3<*ci8^$a^F!MA0um4TF9<&-oZSdvz5f-nH{P?$mzic)HA+_wsvM<^QOEd~+qM z!(SgS>b#!)ID7k7?U(SOJw|tU%l&-1DT+}vd%LVpFIq@w*4evvvg65uf;$X6D#DMN z9Qg6$5~*tSblJm;6E`zrjE-C$-Ia1h=#{fAb(rZN^!fhYt1p%ByGtqj)nxzAHXA#y z+n3Q{T`w2OaZh&C$_42V&GpsiC0toi{9s6XVqy5!7XEJQ>dDn%iT~s2D}dr?x~`Mp z5D4z>!QC~uTX1)G4esvl?(V^Laai2l-DUB7B=7V8Rb4ezyW6+#%-%ES+&k0V!Aj(R z+{rXr@fU3F8nNB&JwKu|a3&zSg zSW`M9mIvl1lx$hj#%*j(fB%ubewb+kNeWgSX65FPL0YdnON*2 z5kjj$Vk0pb{Ox(??#6)H+uNTyPzkrgp7;tSkI%d+QYyydRC(zU0>#JrHkn|BifN;B zU4aX|x!Xus5!9;t#m4fW_i6mzf$q zWEs5nonH;gK?0X}PiToH|*? zkJ4rq^=fRj`O0iPr3&}88cA5js#7N0x$X?fHz{6Z;boR^oeDWt1C4rj$+R(1D%cbI zZl?L@j^PXqBM}v2$+HTp7ay7>u~ss?jrWy9Ih?EN{) zd-^02lq)mPy)>GH7eh`yK1d37e!!e_BAt8^TN?Xb(LP;7+awM9K70|SHjjnxK~+7h z^1HG^Ttymn#*cEBedPj^hSKnk(RtrGci4MfRy0M>*qb8!_mUsb%0K25?`6xcY3GKO zEnv#*%j<(DJ?w;LpX<8!e!^Sk9cXs$%~?&~j8QeA&SR?9)0wS-U#9rnDs-RGV-s;s z+=|kUR-#*w88czjr(0OBjp4?=I2%Qa_c%FUcu7!Lmc*2YMyf%ow{(iQv z1bz=pI6kA-gt%y?(2Q|;e>hm)ty+HH&Fbzp%J=+Z ze1UH*w*4f{lh%8>f|u`TQT^fgbkvfXz1Fb!7YrDI;dd|jVebIJ?ob@La z@TpN#1EHv&zxRX>8bfF~`FgFHCILrKbG=Qp3DQa67(X!%$9GLTq1T8if>dLw$WXuV zRU+>0#Q#RM z`>ie`Yd1}=Df)fN)@dS`^t95rG6G?>xOd+G%(Fz^&RZUM;W`D^opaL{UhxrwG6AC2 zC7~_ds!P=^7i~-zI5g9~ zLh%XJuZLCz`i9;OQ7gqo$3+p2kV9Nr3ZJZ}qNaulCaf-&$ngUV#@BXu z7P{AW8dV$~p}nqB7dFB)GZB>ZT&$RIpTCZz6&WT}f8x5Clwr+zEKYAb(7uw{hcPuX zRbJgZe0DYT(WJ!m4CebKJJDu$?lQBy+&W@+z#Mq4!o0hyk^*&+O1B*h-jg_HW^xo= z$o;YREB!%2jyeIHPqmk^*H`F8cRD859WO?hi{XZYq(?-rJ2>Z^iqoP7w{$N?tZJ{| zy)#51!C)9bj8%rkMP0Jeu&PkYqy|1>^VC#FWB2d-%hC7dL86a;)gdF@d9!JCz%kQ0 z-Mjz45qRZFo}Lh#tPJA=4m)YO_#4wZMp1fZI@sH3`#&kn##T#0OErsq%i&VWNzXbM9z0WflYB?sS;VlJ41mZ)j)~$ z$kw!rWc_Wo%;+W&=xp;aytnerv50{+?5%{61o-qzZJ8NpoZPWY&rz{lz&DSVS`Rqn zVl)g}IKkX3Y33<`?A}^;NUm=HsDQlFd12<6bLJKH>8MP=iPhnj9U=PUz6}%_X4V|n~o&_j4$!5wI zk9)zh;){sU{kEi9HCKpr-W_m)J{8)lw`q7hZxy$cioqWbKe-?u`u7>l1F< zY%Al=LdhL1N$5OZqhRI$j`aAuFtTg)eQ%aFEM6HYcSs{QRI8%sA|_$XfA3Kt~>1ADAXwpdYnonGNSPT zksIPzyig4gFVC4dh0Zn9P_LBd2~E&>!@o{`l%VrCA3ukgF;&#aS>L}d#r;>chUE51c45ddznj_uL%83DSktfd{0teN8kdh zwL5MXk+1G0w@#B*`LGc2EY@e(A3SgR_j+Zaj4t))K>^%nPd)Rl{9S+tloZUY-t(?o z9&g*4V&2)iFl#QdmEaib{_l)YM51V*uFZ?~7fPI#$A=xMaSV6EL2rYhY~;<1xSXZ9 zZo}82?|(RskTM~@+Z&*CAEJ{yiAYT5eg&b{?JY+)ZBFLi6F%8OI(gu}T|ETwU}ncT zaVFXNTq`F7JYn2QcEbB-PnNtdKpeowH5;d-B#QqPwtToOJb|rquUF zh954AgRH#-C6kA&{gTVSW_uSjHE6vUSJFiS(kiwUB=6e1-@ie7dFxtrV#qHM%!|5W z$>vtWkl(&BKbF#7fgzXK7w%-7BHWwbh*mLg;P!O0&**5sS^?`u|1&u_dA9wnn* zzdwwv6DqmC9~tN9PtTrmdKmCOrFPqO2s3$%60m<3;orugs2tBe0;i}N&u)$0`dF_X zrSZD#RD7HJ24L)tYP56vv28CTPU~4(4nL3MTrT2<0n#J^UJ%)Jnb8mn^(MtH2!m&4 zcPf*{pa!h=Wu5D^3+9xXCnwMdJ!`_UA@6<0@5x_X_5r~kVeQsoQuBoO42)SD-}fAG zApZq{9r9I9YUiKW?p1sN2JO7zUX87jkzv4`7#v9-EUO zxShJ-?OYipkK(qXPSFM~%0#gW#`Y_QFhwmAw?cVuVX37BzzdLf6 zHzx=8E7fG%v-MJ|MPnCc*QzOmi7AOdwT?A5UI~uKdo;QknJ5_vImU?V##>!XC59O= z!qsT<=HWr65=7reuJ$l=^c(zrb=P(GRFTE?tHE%QYf^Lt^BeqyO`Y+w63EV!dakB0 z@zsnCp2oFeP&{}Q^LfK59w>{2X`?-ZdwPXyo&geGf-?3omYU2>*GNO_tb_u3pd%jW0;n@_rK_Gp<##t%s|lYt8m1y@kub241^0>HfT$gPFhB2@{OD#2LQNou7sUO z&+F+dw?}-w?q1G?R@Ot-K7(DRDu3x?>geoCf1Lw=cbZCk9XpYZyS3b{^2gZxr0bwv zl%Rz{jA%JjS-hI=;20qi`b^0#jpu0GcIgm7a+hXU@C1}AE98=FIlyu`WRS`nQ?{UD zE{tM1jPz5G^%m#h`zwj4mct-@uIEe*3#bDLgR7U<7Latx))gG1n=6)5y{a=sPp4HZ zCs=&ici;E@>|^sC`=hfUr4`j2 zFR`u`=|w?uKA)*h*ds~+JHJn@Myap3wpa9FjE*3hwa4d--a>z+seaw5G07<*l`{sq z9lp&9UT>q6%SC+W)lw(7lW6@hw-YdSBQx-o#(?Q1<2A|s`z(W@{WTNL1TCyi6$svT z@Xl`oLJ#*|T~RMz4@kOFUX0%Ks@%^Gg|b$5`3U|2U|y*49qF<})i*qZ?ht>>yp^dI z#RA;inx{D>zWLf8e-7BrH6R0&h;4W_a*(wG-l69&s*1S!<$@%fQ?;Z33^14rGX)w9 z=k;4B`}q`VXja!iwuxcuap+NBS+_`=t>~y5f9zR4W?A zgHv&51s8zgfv7}0o{LXr zi-cfR=F(QnTJ0qNMd)znPiOgHWzCC>%bC9rO&^1T-dhPatD*t3t7U>SH^7*|10$7K z^(7w(2mki5+<)cowX6_nc=}5)7H$%{`hT=AUCvpgyPQ&O#_#(Znjs zG|kK9uO}2}v^6?vShk}19cqEgPW?{q6WJo#&)7cBV&LdDRm^1JaQ$KT#_Ngy<7y42 z7iSXp@E;o%?-7rL!Hkxza@Kt;$XvMJp2<7x835uiMU-dBP~xIv^vOlRO-a3M|3_e8 zjrNnyM*G}1J;p0AOmz*cA&7(_yDk^f2rM@A@US94tpR574t?20BiUC48&ywW&=z>E z^>;03e8omYt(GB~>Y%MYUK89tVwKPVN0x zR`3yBJG$E1s~ zwuZEvN+8o}QEDd5v!3no>cATpS(!W5NEqZ&XQa!& zrPX!jZ2WQA_|#Vk_Fw1KXq>5hSkWyPomd;bE}TQrKWief0+ zA0%JE`tU)f-hauoGAH$eOqsn%XW`0@Xnc=m%D*@aXE+|wI#M6d_TXa3)1#_rsBIBt z2!$xCZ5GZ;C2+tXr(iFl7;G1zSy@^EzdRfVp%v1x_Q*zLHcM2L{iQ~u7!@answ1BA zus@|$=ffvePtP2W&#-c3U`L_|l{Q8}B|unmJZj6Cx_1lYAwlB4mRT>pIuIwBO~$I8 zfi0M1$7R26JNZP6C*aK8qgIU7K9Y6)4?OQB&dZlFqP}V(+S01Wqmk!X_1ZFoKof~Ef?%s<2fOe! zK`CsJq79;fZtc7}>B`(NDzsZ-=Ft?rxZH_NVM6L8pcQEMs4l(KhA?9wrM)4hUzjmC zCDLkvpK7or@)sk;9RRuakfq-z3KKNO#CYIKxS9@31RipSy;o_0ojsY2ICp;*wDiLBp^a)= zd~Rx*08fh_6Ph_EI_3d$uWM}AzNwIV4vE_Pts_2-p>wRm zqp0g#Q$!nTyg=Vhm$4i!FXgo7@i!+?#Cm*Kd=fn?LGzng8YP5<2{>k9f zghGZmCuRwct&y15tf|KX{A<@A0@IMyQA(ELRU77+8bbL0?jjthtTU}D^AueqA#_R@ ze`PRdbzngX&%-U0gsfMj;|*yxKlqp80-1R7LiePdb5hw)idEu@$fLKhov~{H4MRjy z7lX?s7P`R5+et+aCzDK{WMGXF`xk3}%aV>Q#fcQ}HJ~<-IhlE2QDSCHe5PF-8ERzm z>~!r51smlzmN!Y?7 z#bw-6^}ySvsIw`m2Lgm=hcg9E*P=^0HIAXGr0KzEu`&hQ(xPH~Lbm#(H*D{}fS z89z15``~PY_T60$e?*3aq`o<3{3$@(B1;LlDKw)l`PaiKtP!sbIa@L+kQPuodA6DY z+#|)!U^K*qcUwYUP{a06XZ?x%kaSp`mzk4-&D5PYE?$w(C2t0QxgSN4kF>+8C<$Nc zjp(XrW*-nB{9~K!eAf7WiB#5K7(kZCMIo5gGuM1HR-F+8e{=I!(29H-dNq5@5)f)z zam?GX&Z6!Be%pF<*6S=$@i;i$-8!YVT0wifOxo{WOd+?&B~^Jj*vVdsc!`G5l1l*q zbdVE6ZB!m(EoZb+0bw%ImT2PR%1EkOvy7UngQ_bu5c&qxmXAOEsH?XgRMZig-4l>E z_{Dk`qfK>-nL0&9Cf9??)X@Uf%4s-6ylk+U5U>?XSg=^A^-mSRL^fH?z4iVwug3;V?R6e=ExFBaNT+WTb^auqr5VdMX?68~Kpo>PU!Vp>tCGC! zhsl;yX858DCR4Y{wmx98+_a88CGJaa5W5M*0fgfbHJP&N_qdFgyAfMuIf*T^9Om2U znq*r~)|3Bs^ivTmq50b}mG!1+>?wS|@i%mK7xLFoCobbsOUqE{v&xDj6J!eg9l!5< zbpx|AY{ym{I{uYThC2Y3{%;uOnGhF)X$ z)?4`5kFvuSPO{@>?dYn<;lH{=nuZJ~BY+c6mJ@IB3F3w8_tvOK2JxYZ7Lxj^!@TG0 z-b!x8K|8stigp{88CqrAjnu~Ex2_xvxv)(^oCVN9AT)?;%}rXxeqAlTMIglc+ng#C^spjs)RH(M>T4SbZ-r%4c$8vgU)o!fm{`}1spkSuU2KLw#E@he;S2+Z%v+q*iv7y*BHLF z8I!K1lE_u1|KFtxzKsScJ$u_|0nz@t2EM?VENi3hi&zjTYI%03b1nK0&xhoPfCK3o ziuk*IXwjzq-FgKsIw_9Fy(SsJqGM>6Bb-Cr?(q0_TDE3EViFtiVc%hxZ|uGCb;H&xHz4?AQ1`m~tlk*h_KmF0|e z@X2blP?@S4$ zS84xs`>T1HT8Y{o#M9&(rF@hcUe>T(LVKN52sQ-tr8T<0UmeT~9PSJ-xwb_-k#pAF zx+wr7E=6Xks;!J#un+X?P@H?4vD*Z2N+(^d^I-n{iqH z+6X)I;4igmNpDU6kGEzuFt&zi38Sbhp}`c|%s$GJ3-gl9A7#nwsDCJ5plbYyqZc~k zH9a?y1RiU&L^PF8w^Y%#RdZ4~#Dw;$j2Cxb(KaNH_N=_VTLKFzU-*FdRXN>bMO)b` zWw#5bZe8Zcyl{IhX?9m`mb#~&uFvGAN2iQ}?2|`Lx9P@lini^n=Tw>JVq)4UMY>|^``mrJGx2mvt@p ztB75d?AB$@-~L4WBh|(dlw3tvN<`R*=dh~-79B%=(24g4Ckg_eJ4ZO{IA>48=CI(u zembtV6#h`p4!OR)cxP2U657!J%?vtsqNG1E0~(p@FxqS#xk3dhqz4uu z0X|D2s3^tHA%1-;9?6gLd2gk7zIl9jc|26-AFFIC;BQ%Ishv^*s)~0Kayf|W6uXD5 zfatpDf|**Yh5Let`0NDUm(wyWU*KSx;?bt6dQfonsPUJoTGG>MVghPva!oXPA1#dM zrB7}D0ex7Vq|PPm$OE3cZ^b~LW!CR-GUV}Tw^3!n{5k8Mi|%$C657i>i3QqD;OoK~ z*BTq<9%S}r6y6?W{0$^_-eA|)j9)kQB50s&}^1o#tJZIYf^Zvc~&|?TVBuCPx^9y#utdni}uu?lfLSve)a;&_mw)Wj0O>&TY5F zt8q?2fk=R__S6yPw`S5N6nzo>2i9TGmtMzdYVAM3o&(9{itc(b7d5Q%JnxB}!uhfR z(hF^WCa2tXDdQH1l1MXw%TO!wnQ3jZQvkSb&Ram?}z*e#zmx(=(C!jVMo1;?(VR9f0p4n z0tJutPjAUa(Oewd-3Jz5 z>1?wr6YYbpGtD}p06+miufrKPYG%5G?blg?^1T`CfrqtTC3l7^{DR5b0vU*}Zcw7F z8J+EvceYxhTpN`IBB<7HG3MC`7Siy@P)@Z|l=$N0KEYc`i)eWD4BGix%s##*r1gPS zyTj65pz?TQN$tQi>cs}0eYwdwLA%8FVi8fIhIWcK#?4O>I30Y>*XgoXM^Rx?*!9_? zvI$IJ!*_YDhubXSp4*msFv!?rPUL*Ww?Wef6CcO@TQyRD#L`sMsxW9`NxHA@SF8<) z)QmkQ(N8j$M2-Jw_WN02UJS2x6UjZ28RI@!Q5~I{Q|&RZd%}F%Gmf z`wjQy0@{U2yiApZcQ<+3R&Zbmjv{l_5$yU@Q(OM;?R4P^%bgdtP|-ks@uL=CUpuSl zjb8LgIdKRS@X_3_lI?W-ZOOxoU;^(i-7apn4aOKanMIUM-vAg`2V z<#xY819+VJCRU790hLC-pXP=|k~nu>U>S)~^Uu|dLkM$V)FnQBvTB0$wGQd!SpZ_~ z?NRksGs+C6Eb}v_q8xcZOBEtdSX-w{wwRuS%0~m{BPP33^RTEk4^?1{#Fd15kaRm7 zxSsO78RQ1v!SOl-F>Fw4q`f&k?Y{5p5(j4Oy&qPsJ%iqwd>shP_Fq^NgiO??h)L1w& zbfh2QYt3?Y&+<7BEbg{r^JqA0xdQV*!>ZDA=t8qUs&Ca{Vg^pS8_cit^ zTY=SvPcXGzOUvMJ#4fS9DoC+?f?c)>_K+*aw*=%CKmi6JGy{^xu|tkl$ns?@$A{ff z7%Lv$Lo$xrA{K&4VtCcP(8Fpi)HHG9;P;4epo!RISelA$A%?91(<`g^;b#-IC3opo zZVRE>k_ENuOE%stUO9nY{A}l$k1jW#sB(9^bO^+l`JM0TN-8diksvoLBedJl|< zTfP^h{br8PZ?wM1PquOj?0#~+;ev`4>l2C9(ZX@}untvS`{W-u7l`BjLXXsy2o5D> z5R!Z+&rSGlDnXVU^0}s=Bit4?GhM3D{a?$s7y!InU1MAT;5C{2nSA?Z4QOYkC>5wQ&$p4PQp@eQgcjmz5#c zCR!_3+$aZiXQADv8xS2w)(J$=8|=H2hiVV=?K*!yzGg*j!Zpr)9#muT_IaRhYhi*7&!TgU47ouf?7Z_fnnSGM03PsAmrfq zMsS2eY#>y>Ha(PG-4)RZ$!GL22ZpDY%}v1yUzDcQSeS6X{$Gr2F*GjYAm~a*4kJfG z@6>3{1@4Q@zDO*+7|u?G*;0n=K;T6VGZ_f)&Hc}mFat4EG(?b@BUokNgg3xMT@?J( z4JGW>N{Vd>H$&eyjx6jn`EF@5_GxhNW<@IWG#PP`wo2S0jN%2E+wqC)BuhUc1rdd& zTeM(z*icR-M}#=AQ;Pa*T|lu@aOc2#j&qh>9L6f5y%Y~;c$953_$69?pR{~!N}}0* zbk(-_GNJZzwKxl9Qx;(mhAXx_d`j{0MCu(CTtsOs+#4{&$uW zEz57R=uQ&cJ|Z_wWZzHONqJVMT5IzvJVkIB7pi`x+7govAGk+d6F3rtEwC>6E@qk%9k~qG-`RNdOCIa>{QT`~ZSMj1*Db zWPG9m4m7&l^71n!t(6*IB*zFD2u_DjhRJkn2q~w@vk$KC!ac0P;wiDtKjd%ZiJ7B& z;np6JQ(&&a`@*wjMhzf!`)QJVpdhsZ{*E?-WYE8Q26A}p&CLy;OMTo^PnuvTD7)o{ zMlm?E^=}on6>PlAHRX&4ofJ8ykwHV`iTyxlNTNqRBmY&I@o= z6HTfZyOSN;-XzVv9B_@$pUN?9I5)LLL1@nu7>He{B}ZiwH7O? z>oNlPuT-ELgel|K6REO2vuM>A? zEAkuyALhiC%&vh}3`(d4HJKj)*b|4|KjS5XRd5*yOa9LoG7*=y#-APdrB3)W2sTwD z5`$$1N>Zzg_EIt&N((mKV2^LcUoa7N$k~#2HO%)vcT}jT@U-+fw|og*JTV0LYrt@1 zKUegZf}(jIjPBJ*cigqqQGMY71UNhrY^Dl_GMhcatLUx@+-y_mHhc)6td|SKuGn;m^`#fn^+ruKn}&=&^=_f67y411BjI4%iyP9eo6QxfkBL ztBN@bd;4?UF!4pgrKBzLV!$Hf_sy!nAG%!=8%M_j*qTLHrh(D&DQY)=&vncg#0MxfpSLgQv31FDOdzfM#|n!8Mp*C*>@CeE4|tI0taK`lO8K ztZ)umryP(gE`LaHYORH^K;Kypss_y!8-7(Z$V!5g1_H`zMX zGiDW0IYcu!ofhYH=TmM-RZe?2snOn>A$L1VI#HMrSLj#xc5PoFDcfLP-5Y}QEf(M1 zEm-#%*=NMhoQ=EM`Alf_I>d%S&FrYzN?d0;R;N^g&(_kQ1UnP%j>ZB(k083_>GWhL4*xcNENh_p3ofxbTr)aLU89ciq+iqD_&Oc_CI*wlNKB=J*kvv)`&=K!#6>Ml z(Qkl%-Ewh?op$MGS_y9H3Fe97TKSw6K<{n#7i8~%M#r7ik-RyPLhi1K4iN4ik3WErb-wrThlm>E z>XCt*q&<$Q(-T;Ilejd`xa1a{D*Wt;btOxF{C8g+6xg1Aev$G-n3bBAMzd5@@$Jm^ zaf(*5ed9S)CeNt<^8SR&b7)0G?A{}i@A#7Kb)^29ci5jf zlZmS0xH9bMjysXSFyR>gWn99O0V*BFgBeH!n<^B|WQxx1c!YltdooUs1#uG3skZWj zR`8e3g#A3N5stSqIr}E<8z$`+fWJTBSIMc<)~V9X^w&-EZhi)w)oUxQ_GP!jZ;;#% zm~vFR2T;a3ZA>23krne^Ltd?*tmO~Lp~=0B;S^_C9UUNIOv9BqnsL@DSoQ`?;6;9Q zOW_Rsm=A*#U{!s{c~SHv3m}yGkB_$Tcz#pXjNJ@8kq6KYNJkHf~$i6OBPE{BC); zqL_}Dbm4zlO{~{=6~7e}_X+}b5M6yi6EhsAC&ubWWMjKDuGiw7XSO79nzM7a4RBG@ zWOp2B?|FK(3KyLqn%{yQE)A)aC&JNFUsAe1cjIigzfcpb@wFT!N$98%`q0_F# zXcs}N8Gqm(_$Wy+u|EH=@LW6b7_|;W-g<)A+Ysl;5S^tMPI5HEOZtN2_d85_u^8=0 z0X!7s4xb~ukQ=Pdh*NzSzTR+re2!Q}m)obUCXfVCxq4_vtF6ZTI?yD63l)}e7~G8y z^?DCU?G}L6QRiKUGY*1uz+5au2-$=*Y0o$eurw1qJonFDgmYJ;=_;%qhsb(|ThWE% zn#FK-d!ljZCyaUddXxV#PRk@A{b(c5K|#2F8RFYZ(_>~L;iWWy}bZz>C~hPsf?szYSdKtg&uCz{+{O|_Il1g+aIavMQOQZzk6G+RvO zhcdJdN}g5`B_&zeQE-Z7G)FUPYf`e@_S0}}iWmSw`i05}xc-*tm&nr}y1@+Vsj87* z_{zn69c_F{TdniFoU--yT$SqLQMxQ}r$?nZTEckJsDGF{x6 zXvJe|31M#h)!}LRu>W_W^54dZP}6-3QO#H|rkLpvu=czD=45sMJAZov%xn7`BwYcC zHec}8#S=UsERXQ4hX%i8jwsW9h%9v;X~_T#(60HWy)j*aqG@{kyDP54fPt%?*ExWo zP0+rU@ImjhE^=EBm+R%$vrZ4Sg+6Bq#NHJgIHpdf$k+PTE{v&UI==hksQ)6ihg3~X zx*Y*z81hmVfmOoKDzO=J+aWiqMGi)+OVr11mQ?phV9>#9d&s~L(h{CYr4jCwD zx>OUWZ2xq2&^OwM5o=YRU}BY)!`+#xmAh-+7P>ahEQaq<|4f6NN2bO>2e~o?KgG*t zo1YSw_Umdn1Cyh-(GX0X*DQ^ryDHLepv6{i`b7NZs>}-0apgz%{Exh; z`Vwak8_M0#8Emi!`^}#GEF7U|`_0&bfrzT0pJj_DaQ{P7fZwtjpke!pY=vGz-OdAF zu05d2l3gOraTTy>uMzOzpy#Fi0VX1JWg%&MDf*r0NO-Q79-E#fwjOJ98qm}Z{OXS1 zI=*nEzcQ&%&nz8@D3Rkov6QdKW2}jj(;UDk6av3CfIgi3Ik@fzh9;pVC$`hq^;!rA zDchH1fC1iD23oPXYUxV~{Y&nDWd<>I2t4{rHiyrsN&n?GQ+`e8nRx+D1z;%)|FZ-k z{MXVGQzO|wODnnPlVEmY4+AqhNy|IND;mi~^PsQU+17VFvBBoHc`z0Qhkj1~$-!^y z3zGI+9lcy@+S*2bR;K7trv`9FFK)io72bF9L7HTYF0NST?MbxSB?Zx=vH`53jI2);g5P~-Z*=e$r>og zd4DePc`<#qZEAbviSvo`8TnKGe7_hW;xU)~XZ|Z-Kv%B5TiHkbHDEKf{Ld&)Nq0ke z&*rT3AC*60=1E~bV{;v-t;AzHo2ZP`d)-m*=eo!I>uF^#FS>i(-S2l4&S|ze*U{1qIy!W6V(sDH?j9Qv5iWJDZE89?I*||abSVY1 zXny=wva&Ib$RFdsnobv5=4h^_v=Wd>YIRymYvb*qk)ym;3Hy9^t z4#ZCG+}3E5DKN(3b|!(8`vwg>m=g-$l9r0tI+(06&$G+J=kpxhZ^q1)zdt`6x&QLc z^NtC83og4loId7MzA<&aDNoLck)14E)1F_eDJXcD!FU@J0C~}W6J3Wn*~rW;!?*sK zR34MlUQjUY$*E}A-p2KuRxY0=W(zX)nADjR)s)+e*|6#KY`u4Sc*jV3a&Rm!9XlF6iVG2qkCuU;JWxx99!FTu^X6$DHd zcj}bG=+LxV&Nr)Motx^~=J1pk@^bO27i3U15De>zu3I=cl)C{Z53@ArQ%bHI747*O z_$!p#9^teds8l^1+zJQZ=Zi*bPL|G9%HP)uW|f?i*0?)c3eQfy63B=o%TT0cniNc* zs%o|w`n=8Nyjv7I&*Ra~%j-t2RE*6Uwl%L56x0;3wh5u|q)Cf{ay}LZ&WLikxSTAl zrF!X^o`=oQrk!`;B8a+CApc{l^SarAf8LQ^R#p6f<#qPQi6Ww)B4Gb$bHbcg0qRkg z?T>8Ye6Pd)MJE4s+oA5C%OiT9r;2x{)Z=eit;)OS@H_Q`%+Hb?Cgpt zR)v(~u(lU^bc+TpJX#716AIJyWyPqZ(KZfVK1+=7?G~HKb{Fr)4tW`uI~dycgaK7a zZmcqlWeJZC-03E!^d*GMS7XEAN$be@`4Ru(kZO-6_qoHdV>8fGDX%T7&(!BnGd1BmX&728WZDNg&^2hA_FHM-Jzw0<~Tj{L11&062bQwXSOL#Ze zJq8|BdHO})+wIRc$3MqbPE~(SswXaIPb1oWm|jQT#P0NJZbW~=k3wFP<%~JguL(U(!9%PBks>QdCZs2_p5fN;({9 z9Imf7LoGwC#8U`1>**q(OV-NLb zV2Cq+jur39(`trk%x{yI7}xg)iwB24@4%d(o$&UEc6NC=`iqVEsKy!W8K2lP$W8}w zGy!CbdQ=i5&;`AOk*f&N3t~K9>`q`H59umdE2lwx#h*BV)H9LceDLJJ6Ccoz7WI3a zE#$k(`r`&^sFSHW&Da~6p@XaMdgEsj`OY9%$j zpQ1FJbtV8E!h&F=TOCv+QPfQ61ZHR)hzNX`Narovkdc)|s4jGAVTe|2Qbrmh$=_T1O}gmCH1U@$I~RBh9J!4Fc4-XZ$p<7(<`kNii+dj-E;(ASfTYq8;o!V^2`f)!f@UG#DWn^ka#^)>8CrudgJINToNo$KzLKC@Ph*n%%>5q#u|Q70 z$&+64{q*=#d+#xI$whL$>5SoEhL6(~(g<<~*B9xGz^()@i4 z^L2L2p(KW>2;7aBOLE{{99*F|V_Wvo*Ir`muWX#vdo15+GT%wmiI?dQzlg>!kckIO z$Bc9aHwA(w;W7!@NL~0TtS=B_hb_G558v!lx`k)Kw$>S6rCUgwg#n?cO`!JSsnfa} z6^iG`u*VM4MKlV8{me~eX6Nbldkb-NB@=85J2Zbi=(ZmdU~T|nhM`2nC3!h z${xz3|MY*BM;FV4O#1H-5&TcR`(=6KyI+xm%$bNE{vscI_>1CS`{6HydQDFoGW}2w zQunJVN}1*PG*@p=^>{DJJa5!9KCg-gi>x<3|G0qVU+>}X zEr!uc_pIuYb;HODo@2g^+TM@8_wklKLZU)q7kVJL@=4*yuw*19v~ZkoAm7k%dMRN5 zDC^YQT7z@~y9)sfT-s-yHr8oTA8&f`j(QI?Se?MQ0vh|z$rXQOMPEOgCmdQ4821Gy z*i55L+QSE+f_GK(!}F374;@1|^YJ)?lNlQ}yQ>Fqcs1nm^KndagaT1d=OCAU0 z*|%h;K1H3nNOj8Fl+Cu1o%(XatbUF zd9zN>wj^eCW0tiWrru^fO%6cSo7I5j)3fSEWN5P*I7Jw0pT%Tp$>V@LyG(W}p4IbI zr-HruHQA}_-mHe5`W$sCwO386VY>Gg*#G>n|Izk8s)c{3{m?bMyDo{M|S8QI}?2*G;Y^QTA6R6|aGrr^qAXQjS!S|Ow|!ODq9TD^J|$xtm5^06H}z30Wj>X4RceW!{Z&j$Ri3_D zOIc+_CPb50Wv0?=sd|=`g14us^LkoUg_elAUsF|ZT2BkriL%P&R1Hn7`l`}pSt({k zD*ls84y&pz)v)P$+%GDsnp94wqRy(SsVbS(stu*;R5mT@a@rf8S~k;04Wk)n`%9G- zwc?7hO8pR(Xllg}kr1)W%UU%s7qw*dP)1QU1l6JHalc4_S>{b8)sPZKhMGn7f0^R5 z%S;W9l+(UxR;gxDFC-Udxx!RkV8q?A7=>Ji>g8o)n6p4vRkC~K|e%TtbazN-w z`k3=r=t-I$fu}T?g9tfj;gpdoI3v||MsAGRTO%SRQBFp3os5K{85Fcnj4~`+8<{{R z0$ZnTV|zlM&a9I8fl(#izrpw^dpT(R)EF`9dn4~5ArtxERw)AyX=IWlw|i?O3G|3B z(uPmxv29c7q-+Ty32@*3M?PQ-bsn2hEm&;{8>_efkxg0RTP^SX$(ao?3#p%a7E%SO zC|C{ewWRSUZsKAEkU#aTrsld48LQ%*6>vewOM}Xtc5Mt8Cj-uJFm>1%2|LM&vlC-& z@yVDfWStR>WFL)4g8u$s40%GlmK|-qa%3eIEtLQtv9G6bF<30 zRmmZnzFysHj2xf6436yZ*Z;uMr#gMoPsen_+l{&ZLNZ@jDZES8v46p5uv$)BdI+3? zX}II<9oj%8?V!h30*4|3eH-+*4yK zM)oCiZ^N4CiErmqwgBpI&A(t>V5BE{Ddpjk7Fy=37T}Ig-FAuheByImx(G`HLiY(} zeBo1{xx}YFagVjQ2%GhYwV08z%B{5L#^O3FgL!;uSK4zkV9x^L12nh}s(Xl(W@uLL zgDn5^mMBwij6yFXdimn1~3dhzW{Cl2I?zTV3Dr;l{LQ_V3sm48<=?X z`IWDsvo&PEt;}A9bu$P2MECUA-Axo>=BziC>As`PYfMk7%wW^PBGD%y==-O8w9eb8e+u z8E5*_enxIfTwEWUeT&h2!^v3$3}jPFB)M<*CF3;1)G z^J@UncvD6(9jFq|i&a?VRl3SBRP;KNT!kldF(qxaRxP<-QWRxL_W#p7C$>dZPzzBsg*psN zslFh~`VUdzWtA**($X1~nfXkuRo2 zp+;PFQq^7%CPMMMtKNPuRp39T3eWPeFYNWXutKygtJiz%n9|D0i5FJWa`g+V?z7Q~ zL9DDL4M$0>pp{tC3*-4sYP)-bYCGZ$3Zs3qINJk?H)ydEI=7y>4LUHd?3!5+Qs-;| z#LCo19nd8U|5SA{!O6cqv3P={rNmIWK zX8>&u7Rla#aK%5`ZZb^%W@WHDR;>Ea3R=M;wb4TRY{d4Yv-uJ@nI`lr&_yKF14dzG zrTNeUc{#GP3wLUvFEl4#?VNczA{3dF;o4_NuC#mBEB0sS@7~i1d31>TN$I-PK-Bi< zHWQ7{Y>;7m0zMhkr2DSTxoh*b_4fA}l5KuqMBMcLuwktpB-I#NINc@EcbNi1D;2y- z!XREyt9Omvz#cWq0dWMf={=KS*Johc0}$?re)`ZaO$dTBIJ;!ttLU*4hCcFH;RdB< zcAQ*u`rTeSVe#BHP^K6EqtHtlN|*kw%z)mXxzh`Z6Dx4G03y)aQQ{;_tP|BC-jfSA zkwKnu6_fv^B!=XjA_}RgJz*rzwacj+V zmq`B@YOJ-=)v2q!hmF(09#NB=TfY-w!ytm_A3Z(UzRYv{Bw132!5+mj!(F2l<5ofoF|X5NWqcHnfD z3zzo9xePw`)m^9i^u&RKj6#JC0!cjyk~!FM1~eqymX4ir4w0pPSOaKkG~iZlLOH=Uihv-7o8zGUA7lrmcl7t*08v->($Fl zg9jx&P=c2#oex%;Y;?a?&hOsDc=`mdZIp4q@X#C4$EbA&Ht}INbq#l zEp$!pwQw^ab4L?hqkB#4Qmp~7dgd-Eh|wu^Y{xJ>F{9W!K&sD{@!~M_3_9y<-_PP| zV1d%AczHM8YzB5cgX3}5#Tjy!VH{>)Vs-YVT`w&kC1kxcYvXV=Msemd#C*>l-nQ{S zT2oeS)cVxvEgn1F)-&JSk9y5d*qYY{NQeQHJ&4!*u`^q`@TyU(NQ@WoVZ4A{fUzvV zp9>^hcYgOly{!ocu3wT})Rt$?=;HSUw*RB#`{k6x&H8`;9rFEu1wi{B z|NXB1zv6G%^dEHqzRmwPugbvx7x@38$bR_${_y|(;s5)?|M!Rgukrsa{}=fGnvYD> zIUrRIHTSBhTJx50LF#-GzG!_u-9Eojp`WSY;TruWzfq%~vp@j^?$_7om%|$UIsq7% z_ci+Y^tWsDspr3^mvA;M$|5U`m$3OI)V~T@RBAbw6fIf(S2eO08L6*}vZ>3SO1~(Y zX;wDI+t~e*Ro>)PF7j+DL?hKTp4FnxnrTtjtrEKb2 ztK#i1)ttJ?)vHTP^P(m{V_6oZtl?%mmD5IL{Ov01e?VhBq_CzJXsoan^q3W-H5Q~= z5Q`hZ@oJ+|ER3V(JFAu6FE3nSu(SdJhL zXX41JZ^X)p?_OHNP`oGMw6a5qfaN+-2IR{>b8O5 z<2>wtpST=$=<0?Yx;D(Aw)VK`carY3p#i@$W5+6@qM@xVQyne(px8tH3AM8;U0d6h z=T4rVJE1=E>w63oCcOXJT;7s$? zw&Yj+m$o5@HOoY)lDg$+?q3;Yw$}geT35j>)|OZ7D@|{bUb8RtsoE-_v&lJQmh=9O_s-8QKcmO9mX zM%@ckp%L}O-I>Qx!LF}P3#pJoc?TAB0C^{9a^lONVbk<+O#l0orp&WR(=WGfIB{3RyRoX=nD9fJ~g825m)smk9VNbzUib%kaSpIqv>Nu7kLdwtu#`~F0AL2*Fb?s*jcnsVTY-Zk`25{+|= zqPt2E*Cyy_6tpzO=>S77=^!-m0ok)(pl2IL!9ECpy0cw2$q~ zns|S4-G@O_hRE2~)9;S+rFy#klRI-PGktCl*K`#-3m-@zeb{)H61K%PLMop|-YG+a> zVJfqe@bW9O2oHU?kAsL?!`Z|p-B;b<1DkKa#na2-%+f!O3pC8H@Ow(gp-*6oJ&Frd zgP-6fA|1NGO)n1IXnaf#nwdC1Xea48i1HmLmmcIaBAA2I^h(wz%+U>JTKx8X=Do!o zKEy|7&ho^%LJIgg7JVS2&??8IKkb|Iq`fqw$r7hHMsI*1h^Om@GR@Fua7KT;d#kJS zO=YyI$XeCiE3OwPCItr=&0GjPPc4zN-BxB)C9gc`5= zj_GtFQ|mtj>7_}Zu=EI@BHol(VsCHo!%l3=;WG8mXRw@~-Qa|r_)NcyTJZy?9sbA@ zARlVH=!D3FI;w%queVhAwR!q9i8HnX2S5YSZkThCK2db;-{!SEfFr_o$^xSMq&IOs zv?FgQQxAR!QtK*NNDO@_Ec16;HEr*_dk#CJEVOEJsWO@R4_H8v1o7XY4@=rWaydoY|~c^AM_Q&7F^0j{8~_pyl;w*%1Rle$x!w( zJY&)y${~9>)=U%*2j5-}8-T}6`Ef79b?Ea<8H!$pFHB_LSg+?GhqHIa`l1|%F2_wq z^B=7O`JL6dJvJi$H{Q(M>E1G{KGxE4yo3(}q-Y3=uZ)0u$LXs-TZP(Olitr$L z9-G=*Elg)Ih2T$U?Z>&|S!+-NTHo$#vfzi z)Ro2tAq&EXYi*2`gYOQy`R!S!otb^qJhJLh$mYA0(%*{Q=ne6zucA-*G^WIjJ>p)t zp?2+tdcZaKE4Cwc?T&a5h2kCrcz$&gLh~%#EidhE;nAP*8umNprQI>FZUAZAH*)Ex z79Jr4<&3p{hWIe4^fSaqwyBK~9YgW^kT=yIAO|K_6X$w*6CU~VoAAhA*fu;deS1c= zKj&@m5X#R?t|wtG6Pfz46LdZbd_UC}CJu5EszVLe`8sqxv66{(=vqSG^^b7pWM`a3 zm{a7Q^W?TZX0sOo(xuiZQr@uzufO9|P+In}X6~B?(b#=itD`n3emJ-dPpxnGwl(0n zw8#eE0*`UNu8xe$G<^2^hAcyP(NJ;?VII3sY}$p`-Y6$A)~de}j_j4db8X#(nt$&m z)co!6>fEwd=e@gWyi{DDTlV_Acf&UPWIW41_aWgwrQMoGF0g1fM7-?7W}o{ga4~Ky z{Hfu}9OwF+hDI2lPu*h1wZ~bvU2j28L2%r7v2d7ln4xO9>AMHC1ouLl2st)W|qYt>RYNdYb zJvx(H5cUdhouS6DgU9iT9KfbmA-Y8HzJNa(6w7azi}wz5@h;P1Ci?Ejo(n3NSMP#) zWDXLKm(KhHnRp8^7~LDL=X)2(l!Hf~DdehQg(7_h{N~~cO3oS*>+^)tgpJ{L8*ZnefV&CA4@B3uCEVKyw&G5W` za^`+#4#;!MIrV;VZuaM)cWgB8Ku&PL-v)U-)BTYNXIwV#d0?MvEDl1i)jJMT<~q=$ zTA10yG=7Pv@yb=dm0mAj;`MUnH@uc|Ys?6X$Yn4LK80?=u>-d@l-lZ(%ex^^!IrI3 zYxmCr?S8^f_uL^gFmlaYXTJ{5_+y6)`^f1RpIS^bt?-3@>`CZH9L@MWv|`(hD{jZ^ zo(EpI!@bqnjN|JMT-iOtR!%~;a$jF_li-?rI56S+@r3W)4IQ@=6TTl$_@3YE(+~yX zfvxIU;0FDuzvJ@Q;rLDhdE!}s@$P)#weS7oei^}h_n-91cE+DL&;67ZX(%IW`6a|f|RYnv0(WrYmV?e*T0XO;jM%d(%2QBTvCVSM{asbU%a5US3q1kc~ zYHQTW3nO`+8$oscb1zJ2dy^98;3g%^Uu} z>|TqOKQVo_mT~(uh*n`^?KCtx4kawC4}Tc~%>!K8`5^G*F_k_a#1;cQ=0ybL2qo3$ zL6pX?E;MEmr|*mNyI>HR5Y8X{GK7N$Df-dx4hNS1{SV_@!-3_=XE8}L^#9)u2A2PJ zFtGfeBiP5k1_P1F9}L8AWFRtg<(CE_!5VFCerB7HF#vSZ^V`Njks=#r_j61;)n`2o#l;TENW(V)}%NJcMEq(O5L|rYx}lpi@qIKOHG{j zt|D}z4UMqow{>D^ZnXpJ-am>#6lBoUb&4$rY|jE?v{m02ZDTuOE&lXfdzamBx)Upt z}KP zcD+ZJEc_5pzQb1S*l-XYK-`;NmE5ZE(B78mYyTsWj|Z6ss7{YLKLYK?Dd$@jl(reX z=+FDy18>BIWletE=<$vI1K#ro{%24AfAZfT|5yJX;D5>-^8Z}^kpKUX|NoHx|B(Ox zkpFA>e_sEw@_#jKpZ~jr|0nG2e)3)3Y5hQ*)8FuPpTQCK6zPoV$JT-6nYyDSuZGN9#Cm!{kf7H_(D^(qHO9rFdla zfJa^a1&^QS^iDme*TpHQ^s{q6)8Q8tpW0pAy@7ffJ^HOTl{9ky#yr&_$sN=h2%|Bm zZ_o}1_o(c8kNB#uH^7UyOXkg4E&cbkeg_FAQqXTe!QQ3%HCMA&yMFl9Oz7ah6h3tq ztaVxM5#064-1MR=jriQf2y-F}?dw%=e=_)v73`U=-(Lspfv#V;F0DJI2A%px7fg(s zm~5VG4b|u*8t13x1uNN8`rMT=FIdT5pq(uRuZMN~EmI1v3G290(^6PSFJp3M$zx6a zuGgb}cSVoA6aCo3+s?e`e)Uhj>5b34liQwo{E2tcd*c0rQd@RI{5bZ19Q%L&u`kWB z-A*)wN2j zg~+qA6eRl8)25i_bv@0>x~@bnrcK$@)2c2?Rby6H1*@l;R@qd2 zDMLN(S5}urUKJwGr_(ymWhvC`)Oj#Bn+&YDZmf7^tB>atm zC$fkD!o}Lrj>X3g9`tMgAe!1OPkv6BZ{LZ--ylhzFd(8kv0Yak#$74X(B9s%E6al< z1L0NtX9AyC9vS;?U;;_%T;-62H{2+z2m&q~a;vO>B#(L~-YTtc-fcrRy!{VR`#Mhs zu-sL%BKvN6Vnjb`v{z$C2$O+Lui(#NQEh|wBZu^Ce)~O zpPO1E?b86Lyhe6Vb0YpT1w;K&4^0!yAw11h0r{Wb5eLWnxszLhxNr{eKEyqswYF1$ z)khW&15oIQ4<$TW#-;1Q)j$*g4Sq~L{E5N5p9ZOJAcePG(|c;e5t1_(v`LfoUQFOI z8()8o-hP*1%j@E2ZUdj*Wmx8^XayQ($l2OksAg&|iP&88WnogsVXDwR@5pOF1{@-O zhP*-QwZU!wDF|$!rYuPPl3F4he<#brBLI%;-4OAcUR>cx12h-sMWBtt~OOK7MRMEIE7M>OfL-Z9AMNe z{>}%35lG;H?+0$sQ)8`pWEkx5gQQQPqnZmD zr!qCEBMAtS7Z#NAtA#+nc9?vs?JovneIb_4Wf+P@N8Lk`JCyS zoKdk$!k9b{!@Fq|b)7a#O#a(+lrtiINQXGHF~iiXmO;|1(8ceL4gRQ7s_)@`qyzZ^ z==y<0+5_&MjuBY=JQS{@G$^J3RtMZDqL>0KO0Ym=iD-#;G)BDYQW!PtolAP_vN@bE z9D^@HT=+WxN5q17WzSE4oq2G+_vSp+Ki@*|=2E23T$`-ipD%t2}5Qr2@ut3qX%9<2#qOlUN;l=~#iIC=wYXJhdNjGpEm_p=tb$JqeFs2{a~Yi0&Py>D56tD(&~|Ls=BlYRg$g@ximoDa_z$O zN?Li6E)z+2n}k>-DYQ7Y2zR>{<&JnCd1gWG_F2r@*UT%_r5|%&(mO1e+yfsmEx@oA ze}jXtJRFkWtPHF=aIGc6g3%;C4Wuj|0(`G!aG0zDIN2awhjrCaRt#94PJinm?ZR}8 z6u8S{gXw@_yS*r41_}DYBS9PSQ68Yq1?d7iN&sX}ybbbyH0k4BI=UnQd?&LYU6}Mq zFC8xa0Py>?$f_U8575L_(51Zq`S(GPAJ1Y5cPbe~;F0hklW@I~XF>YX`Dq7p z_sscr2Z<7vAQFg_vJBEIlRk0j@vDbFsZapJF3$%L)g%z@76gK% zvj7#r-o&05>TEEHW1q;+35nP#bWliQH6<~~5{9cG@Pc!{lK@(lpE!-TOTr1y9!sN9 zA`}qK1l6-i=5d3D3x#D;?Zv7DgCX9rQ{ug$jQbP`(q|@h5~fPXTqGbJrDJC#_MdtrQkTEE zRIqvy)>+cYIAv{8Ct<4CHQ1p%^4}W+GdgkbpHUcFNi3Fxc7a}TvSCpxCD=s?dnLKx zq|b&lj!8g!kht(94=XLf>q=N>xgqSW&oBa3pb|1oZSST_Wh@HTZRPmGc%U3c<$9o; z7;5E>rEX{?hX2bzxxq0>lsdn?jbK&Z4~^vTh$PDC*yePD(!r2%(gQ=91f*Y+>rfzM z-cy9MLWDnF5snxEFJ1AOlb#sTI40p16yQF@87F-*q;W)&+XfYP9LGzS9x%60dgVqs zP>0%X^+qg+V8=3}`%ikAAEBkNN)#<8%?)WBlXOf=m|uzwCp|QzaYT|}F$EX|vCB*0 zj1u66!~;&cH_#nDk-hGGOpjCNf|>a>k`C7`Al?MKjX$2G4>keGGu{EX4zN*h{^KSf zR#<%FP1{PZdfX%~yq(RQCwEpl@5_M!dWegum-%sefb{*<%e$S<`w7=!FYniZM(Ask zXO<7s=f*xR+g{$s1BXR2vtG>zvTd(l+d$y|3gG{WZC*<6aWI_XD=+oUkS2W+*T@9n z@VwQ7UJLT!z@f|Hqux^L{MJ(9TNwK=I&=rycuTor=yO=%TLZF(>T~tki8VlD(CB zKfMJKdAr+ZLq5TIHBfADHd4g~LIj6%_#E>wP^uZ6`b04`!5B_J$ctBe5@v=p>65zK zKZb=P?+=aR&@d)S^`j{y#sll~#n33q!2#jre!Vf|`R&m^hd*QtgpyG?2Uk>B<{yV5 z$;y8KcDvMIBw3k8Bbnwu!(^(Oeh(l?R{nNG5^BLe1IXC#Y^7M|HybHR9!azOO_4MU z@h@SdC~HyHGB-ww?w2f!Y28#+R*5<hW`VD6^8cINhziSK;O-0=3-%%4>K-brH50V> zZ`MZeX85-|_H{Xc{>C9lQ+Q%psw!swrq-iynZV@I$_n*Cy6|VWcp@&Wg%E5wucM)h zz~}Dtq32xS!XEIPPp?DM9}7BXHPbgj&e>QnLx^)}rBZ}7cc+gumwB|`b=tzm;>-yV zM!F0vd2U3Rvr)i?K<4;_C&1#2l#pYd*&t$&)B3s6uTx4Mo8+4&{M1^aT{_c7SUTQ| zrrw6rqdje6N)1KQ8w#QaJDmVa`IuoT-x6If2=0>#te2d68`JLWXKQZL4`=7hX!@b- z0>T+HuF;ru-j3$BFn8Kwa4^ChoBAsr>`hPSMPS$V%}@STU<4N=-{V2*M$QLz4Qv`{`910sY^He>KPt>Ev+?h6RlOlhvIpS*(kwzz&_ zQKaHwCbMbJuxek2htR=UMW_Oz!b^mS{Pgl2k z+ho}C8Q4p7;3tRk@Iv!P;DX8r3fuE*EfbofjPc5Xwlukx3q-~T6o~*BlF!@xJ+%3 zDcy~Y^Eg=tF`N7D8Pd0Q0EFK9TsWpL8q=i`7#1hnMn?OLT6+PKIpS%-@bnnOe^o7Or`Hn~22WTk*q7E88YkI{Xh)U>@I%qUyn#hcfK@49Q*b!TOB7|Jhj?YCF?}v7m_t-K8k+nU$akM(gbX zP1I;+RjIPja?kFDfkVxnn3_EAgDlAoJTr!$LD+DZrX(VU!*V$hEF4xf-gb6m%z~Yn zENpnu@~6hOOxyF`4Z|Snc0V^6p85>QR=+k@r}Tz>69n^)tzor2aF{k{O2&rY9d^svD$yfqenh7krBs1utnH>+Hi?aSwv){ zy|hWM0{ifn{ZO`(pgr2Q)5N!Z^_^!9oGW1{E#XE8+Tvo@>4G2H20`?o&it`6 zxfmIXHGvqwV#g*vNSzX}ixa!bR1i%kOBHW72AtAz-^SF+}RWVLiVQ)ZhpnKDP+_N@y@VtP*y2c%O=M1Qy zN89nEK?8v~kg(5_k30;`9qs?4quuSAlsy-^#YRSl*_#gb;*wsND{mZLd2a%H6vsTl zeM8`h;M!pf*0r(bi(wuycd!fER@3r`xqhRJo%`HK;~Q8 z_$&^kC!Tv>m9$5Jn#74U$m%U$=IcjimjR z$-1nvOv=1z=tWkl^h)GKS(WO!CbA|gYGxxTOW9OYA$2|Omnci2{w_0FWYe6CEUSth zc+*_gjY`O>I%oCN1({(MQrlX(Uk#aAN&=Gw$j zm0}WfzwEDRCd9O!7OGHL<#MXJRI9pGx-2WjdPq@l8`8WH`Bc49OAT~se-+bG^@qM% zOIc-wsT=ra zS1p@qqq=X#$No}fMXh+HtWrNjC7N2XNm;FWm6x^ZXfA5W>YTcI5rBIh7-P3jv9ib*by|e1+!(;Rr!WK6?8ndW>R!pxz2(z} z0dQ(7#x7C*BTM(?4aDWxx9Hdfj1VbL{LmCFT2zIo6tglFL&FmBdWS;cW0-uX zlgGW}z$-3T&KmoZp=T7%U^fqwzokNMSmIH-@M01c^RNFVssBQzTep4`%&t3x-iYn z<=q4t$AyJ*?0ycQ122+eK@wdLJ^LX&4m{J^1@BpL?BbORHAiV*lHdExkOZ@7`hzT2 z&#M+Tui6q2mWtdr-#~aR7_gTitqp11C%JG)g^O?JOU=`xPYo!zU#6|aNWOdZY|{1U zo~*b#=`%NW0ndqf?YXN5-s)jaGGV#6+v}nUu2hEZmEoZ4ft?Q&3;nfkE7g6+$F!B^ zK(WD(B}&02(0;*l`e5jGdCup)(jeomN9wxGd$oT|zA`{xuYV3;Wy6ET!(9ZA863M` z*#Yz@aJjxQFGR-+|0@>`FVX>z_# z9u4$zdCP0e0zI=AG#FD*p0)5=@*t%}pK=;z772N;7!LCz6Y}2rUrF36o3at5&|)_CtE!7;TFW{o&FZuf zRV77U$t*9MMk;!pNiL?9xtNlEL5uy|FDZ($tSc#}c}_fus-PC4XbQF4OR2sf%lZ!y z(`J<{bCRGMai;lImSrQSGOz0*tKisQse~-Ano@DBvMS1oiy_NgRO%#~HmJw_D(kY4 zjk=+v5bEpHw`rw*sfMV36h%|_#MtV~Y6x;OKJHhR)lF4TWkEu5HS)!@C<;Oxs8sDm ztp>gL-NmB6mzefnPrOA=PYD_9#(9VaOLWZ05x!*;Cf8~7f>AON310;>-<1{{_a zE#SKX4$EG^;YeiaLi`3o&y@Jky|RL7hN+^KjQTr!bBlcPCT8e)AQ*O*Rd|H(0La~7 zaNwj^*Rl73IMs<*`~A^^*nkIFYq0!r*rb=~P7>4o{O)%Iy}vMGJsTY3(g=F4SOn#C z)a8qzn8{9hWkt~>#WJwTLxR~MnQSEb)DolqV8PnIx*NIM^KYD{rMHmX^=pLbqVpKN z)KMzNrXS2Ls3$@ldC}+v_gp`|O{_Yy(n1X@5}6wp@TC#pZW(bYNhx+&u<&$f@%uvo!rc`!?@(izlLmdMoef>)W z)MCgk$YA7?YY;YZN!$L;VV~bLXGcbqv2WB1PmBbNq*kw8`;WM4&HF$;V?K}!=)wk3 zd>jB>7-5!Y5{VNDxKDcRT;B~Wr>&I4ak-?(4A^HX@ZfIXC_IDj&0gTe+MhBQ3xB>F zcoUn633y=LEZ0uftjFo+Jlf?N%G&iL(F%BFIxl6oOFnY&`^?z6Cs&&x%-eoE?}iLB z?wOmVhv|j4?^HM`3E2!jZ%<-!Zpq_-9Lh7pZ_qM&l~~%QlBZP3>zHhs@Y-VQ-?Vz2 z4S|+fNgGl{OC)M8vwEW!@g!Wt+VmZ`j?bc192h42>|)4p>78GfZ=-ej?r!KIZkLRI zh=RQio|Fjfb2oGipCNifW}VYAnL0e-tM>kGi0_eDo^PY&>6=%2(V>6dn%24Y^44j` zSMAqXhENt!^KcGl<=x?RZS3XWaL?(!1kJh~R6SW>;!v%)Ft9JdqH&~}>LH;R)y)01 zwbU>1sUdNqtw>`&v_ld*3t!RxPNK7NN>UvCzyD6z*&l3z|3CWQE%yJH;&1sMZ2zAL zkqdACul`N;|0>%L`~M&I|3B>if7t*3u>Xhsf06&O_WymjiKF+c}Ws`krcuU1NjT+UM6yX8_K8408rG4-Ywv$ zldfA_t;jz5ixJL!Hlpw&qfN+-is5{~R$3#l&}uBXHS8 z)@gv%k&{DeB&Wg*O?$U*6AUD%!i-+d$cr>cYtnphW8}8iMih0%tq2oQfvrlSOOuS4 z`zL1Md+ibzzp!}RdMH=i`cx-wxV0+!OG8P5*5)n`eyj(};ul}v<#D;)P*G>scey>Q zALo@1O&rD1g&HIQDd>&76R?86dSSiBZd`p+lqOBEZToB6wr$(CZB5&@?P=TQv~3&H zwr$Pr|J-%%!(FQ$@*!8%&WebNs>+DH`5}+Gv?x!$&P@djK;CN7g8bka-7FRW`|RXp zl3dWT7xP;SAZOcff)1_*GEGo3H+~cm%aKSKgBy##{-Bh7JB~pk(%bmXGNIg5CE{P8 z2$t!cH%ld;7eN1Ff^q@dxQ&I1$dTclE0c$4&_a~FF-4>fB6$>-l*IMr7;t?%7xd2H z_)d+*|LXMUxBsaxtnJqfu2l@^9xDtHY714G-gNv zCy13!7|Y<2=JCbcriVn>KTErMN6u(kkV@2G=0*;m^y22dD-|s;fBTpdUqlB5mAIsn zh@}b_syY%^Y6(p~OhJ9Uu%fQ|qD#aQ_;pBzOGut~YalTXJ|N;t5OB%G>mYDw&ZrEy z-*G6rBZhV{9P)l{{A5k-CU_ft1PTV;S$;mc&J5F_9^CFqGa{P=n@8b7J~lO70j97TljubsZ0^GTW@~5fJ z*o?xN2y2f#M%0|{G2=NIbb(YuZ$KxH2kO0N>i>3V&HtsR{k@RUWM(`>iaQN^49qQi<|1ie>EzeN-n2No>*n1J5EcWO`(AvY-XtH4D^WI6P zturDjs#D-kc%pTus5O1ZokkVDeihQJ9HG(!+8x0edrh_2JoVL=n=8bAr#>|!EfQB< zR8O%eDL?^5bV^f7lQfBUlK(MSWTsgH*F)1{N+q7XC!d6YPNW3uA7u@-{bM7nBoDPS zN(g8-kR!99Qaz@foS>~!tx*dTj6ZiTsyrtFu${}KT6a2_i$fdKE*QxV%o zS!u0w;J?shse_Sk%06_c%c*3krjm{kEbFQDzI$um`c)YJ&Ll$_UihB4=eCg+%4Np_ z@13fu$dtM7Q3{spr)bKxkx^OkTvlzx|EMY?qBkoM*Fz_+BO}67X+o8H>iE5)Hh7|! zKqIGj?&#LL+qk%7O{uC9r3)8J3Q4luCr%erm}opPDj`={ElM)|-q5==S6*msX}wG| z&$=WORl`M=p3_w;s&{)QL^~&qwsf)nZC$J_rqWW3R>rADb<|9KZdFi;+GsZhSAIgg z$oiz3f))ywf7j6Kq*PU+oB}2!b}gfFZYv+hqx@yNBpcz!_ts1;_G_i!OKn+x(P z%&@eOe23bJBD0d9Qch0qG1Z#Y_2;W@xxuPHT)nb{b~!`MdUU*c%<`AHT#@xn zyR}-XcBi$TEZlv{o0^4+Qv!H|nm$K6KG6nqrO9H@e&xNNoJ>Khlh%K$R&@i3p{6E^ z>Y~pqEQjKkcGUs$sZ>>ac+0FzOtotP zPnAd^7pWD$h*TM>sBf;^TZ}1dtJiOi(@_uWb1_nL`3s)Qxp|kQXskZPx)f*%dJ@|` z+j^IfmC6#hyP1~-TJo^Dsa0!S$mOfLA`{x7)!fBmSH2p1m-glo44S#o#Nhqe*#cEH zq|yVp`6dd_#OBFdn5d*t#8y9*gJHsZD-^4k>YT7$xc8QvlxtM7#OWUJoqnr&GqD_8 z`pv&CS?5z*YgRzGQB$ti*Tfyk{!(qZnB4YFJP;m#;&$m(Wq^E>y$bItW)a>JZBdjc z-uSeRmnR#3ySh@rUbD7diT@&7Hq@xpvIb{sULC{KhI5vquoH4Fr61ewLMdT>$^R%3 z7u4fQ-B7fSE`Mk)c&e#I?D$*mcn;cqN5wp#Gl?DSW8oKRRbq$9sgUOKF@`8^^8j@|k|w8*&ENlXKPu=6K?3qBujb2f6mxW~%TK=( ztQ{*DmcRVwwbo5r4c^nagHOqeiRzZ2Q>^{Vm6T&7l@>ht$Sjt=`O58lhgH_R75^1x z%vD+~p}P`PK4i||wk%t-?N?^T_-t}98WV zg>K2SM$@Qe=nS)%Jk!PWwuEKkWS^Y(p?s2-UTB z$xAKTV2dk?LKP+o-amV`a@1O=qN(Jx8%7kVgFkxz#?@Cnyq5b5jmP9w_CbbC!jZ3~ zBXL=~7RjZMbOc2)Gm6Tp(d+$hQQKn1_m=dCm*AwN4mVPFj*o`)y$#*?c>4gsVXJE5 zsFDWKn`lK5lAdB8W8HW@ z#@yd|4S4PCG%~b21%u~+TL>{!uMB;SrM_qOuWzzVKFDsN{COB~EFO#oU zD}EQE$Qv|39<#TYI8Obt9%Os}T6wI7C>ohz?a5^kXbOpyIk9wZVfQ{|`&FyrEtfn4 zKq!h;jAYqX!3bO(z@_O#pZr~rNIBRX|)?H`j)iL&dzChy={oGURsYyhIg!HQ!OmbJvy-} z53Ilg)>DtXM}H)frQO5+Q=HRcjaOYY%&>GElgeRHY|B;;HurWPTXkRaUxk)fzykK> zd&ky&&d%7jbE4TG)7ONB_de?93DIqFYodeHvfFzVX1VpXLYmlpl_tE}MH6^_F))m2 z*kAWT(dr`Pg5Q(w>`x0?uCG#_*|oO=gUJ3I;)LKhS&{MdPJdgVp4m_==q!8`cDx_C;LOACS3$giGAfIL`$XmMWHyoVA|GP6?u}+`y__Jqw{2` zc3wFy@{IvO1@G6ygZdq2Bwcii19AZd#ZHr8yYJ)RO2xt&LgytiTgO{4+JQhl=PvM> zKGVkhDieG;qa}}a@=}BJmT*!an~0C$LsPa5CR(?hP1gn-+>LJ<&AwUbo6wRw9u?kx zm<yrLYB%idH#8k5X&Y{Jg&(zr-gaM40wbOQejK6geGmFKf&D~C z|CF~aig966tqJf}UO3O>5G{YFGZ*ai{!~z0@_9%|z{7F|JM267@x0>a`j-KXor6c6ShDo(YP zfz6tKp-$^vWtv&mldaB^Wa3*RwN|suZ1Oc@;({751y&b z^_?Z{JI=jpr}($Ii`SP&fp_}dQX4mef*D1+$FKY-#I`5C{d(kg@%r1F2BQ1v{*i$# ze$acVgi95J@ZVp~@1ejds7(&h>ql_+GSLkuQQqxCI-QqmRHg*R*f<+T5t!%jIO^N6 zblr1h)iyV>9?lp|OSxE{h+nLi2K=k1%+z0M37`GIklh5l%+H)vD0I&j8&8)M!Dh#h zf9Z1`bmKW^7wc{UkFC6HPJ8e}x3Rs-AI$&#MpZd=M+(73D94KT07K6CgTY(S)pgke zl~0oUL=roPyUo!x=q8A&e|tOEh*q$>*Fg6A_>X$4Fo2li369PX=bU=nrGiW2E zji>m8yNM}c7ep#ogX$}m~2t;;35zbexX1H2B*U+;Gpjd8j3w+D?w)v zk3!cAD}CYEcK&1m?5M=`lUetzF37SQxSyl%&Y%XEV-Yy7toIf-N}i3V{KhWtS(Ic~ z%cV9!72V1WgkI`x>y%~~s3_<|Ui?kY(85;gj=r+yr;jyCdj)hSXy=*NPDfiFRGizs z=n~ru5h+tZRLv}tU1|;t9_wx?l>L|tP%N0icE@Tbb_{|*cI=W_3tQj1v)}QDJ%Fy? z;471+3fK+2NR7$7Ny=HsafX?o9QDI|f*S2i`XKxFic!kor$MPJ_VR5_*8B%8Pm|CB zS$&ISXQJL;!+k8`)49JA@_6_-LCwoXCSDT=J%dfTAR#JbE7}mT66#^Y_W^_=LG$4$ zmn0ZnP;mbuM66gm?B^10fnBwcgCS1>M{LQkG2w1bE@^4KkP+iV2H0-6>`@2mX?h}F z22b6n)5^I_u*gS7^TEjR^>C3#`R_WB(+A9&@&0rKw@mVK;h?I1vtSj0)=v)iegubP=Ko3zdjbCLS8^GA%bQ`bwI0xYEn zHeOLH2&h_AYjaG;$R&Sxl+iynjZN3KDV{bz-C(8fND+noS+}YT{RXg>!BXGHgyWoR zZqi4aHw*ymwv!2V9`RPf+9(YCM8Otztzk0YcuzF2ow0dRn@#P?Uy&Fh|YTDuo>{iB#A4ait*C{eF*|3u^O_)<_Y_&0;4D$+~bW2KzCbh109u?6$LAunO7SxSIQEIb3M``d2_b9$#8m)4u_T6Jeq=-ZMC4rCvdr z0*&q+&Phj0KxoR_Qx<_@EmKnbj1bz?<bo%Pg=?%4QAmb#uqyC0cBgw=rxhhm)};_q`4cB;r83-8P<#Jh4! zd1y=Mds^<49;~01^JQhXSOZ)ECC7&fqyh@-#N(zvlA4dtiQ<7fgTy|#wdLW!MgpV` zSWb04vN9pgJ=_FmiAGf{iwn!T+hZ11^e7-(Q&^>@v%yOiaZ2Z(@4zpO2-_np(h8d$ zo`rz#uHv^`t@h{%XzQG@vRH_s8KX5)Tl>cTV;+gc)?9ciT-~is z+}BQC?vm75i)2*sAU5UcnwgqD%=Jl0GRgdVXIy{4p!fydg!~MjWp<;-2SaEXM=PYU zf7CZUfZGe3a>on4CJ1#Va{rtKg%JiXQFtF+#^)BlW!BXTxjN_A!_~_$s(hWV#)zAN z&UAksN*_Qc^+_bo6gGNrDxT2G8ho|AEXer;bZtwE3hY>{y=`wIM`62C&uLESvKXO| zA%zQZSC#vC2ebrDxL);wt><){p30=s`0^2c2dxdeOAzn3S@#cR5)HDRr%K^{sFHut zKQGe4p<7V)%(z3W6;oQ=aq5w!c}0+9_+ynbPf!uSWi<5@dNNG4=doM<6}cuN9e_P% z!16e_#0d^X4P%a^)CPgm^|%YbqPfJH;4BoZNdOL0xMZ3j5&8W{rIyQ{mdxqO8D_?1 z=wF6Ffj+$?j6g)q##6Dx#8H3v>}z>mJTE4sQ(XwK7As5v38%3=brfAVt{d|z&u3H7 zMaYR8B0(!|DUVR9JT(Ak>IIiVgxNKmpKQ#3@eO6=riV7ZqWKhxuMz%4UXtEe z4bt}ozXtU(Rb!+C(|Bgp9Oyhtg{lL32qcVm*cUHfHAHsk4vmY7(=b5d3DAM?Py2x8K5`vT@DG)04k zGj5m%-qa}U(<0izh#xKnVf00yJuKQdgaF9)u2JF8t%L^>;6-hpooc7E;fvAmlskAe zGVi^~bh0^I`k)CehGsS$T?@^n5S=shj=`{Yo~9(fTT?Jb2&b!0PYOk?FDtawRo+C~ z7NR<5mlV{5cBAoaxE>7VSBZvbXeGkH=(}Tw&28y8xOa8>c)#>vb>rj6q6Fxq7VKp= zr;T62H!tG@HhBOi_NfZ-1+yMic1&*lY%gXx>%@jwCz-zCsYx2GDlFZ17PQ%5$*n{p zJ=tq$LCqgtr8%ok<2zUU;C9xf4(mCc$cMmwO@qDN<)%S&?_1r#Z+=?(gCRQ!+cDL|7JN)QY=Y0gY zXJ9aVcz3J6!eRX}x$v$o_lkuy=Gn^R`j=3R>2C5}zZy~GGCV#t%t4?w#Z#Dt>AdMzyDhLs;6{p}lTT~>cNOgqWnLBzR|PZz+^w_=zJ`a-++-_fq}JH2 z@k2iB`#Q0J$IQ$NeP00MEEa=0)qu%!sZTiQ8~;Avk-!Jp*Sdb|zVo~8@=dEr-VLc| zaVCd;AKeZ!_j|+1_5C)M)^58LsQ$c`-Yx<+GmSPgnr}66qED#4E_`DVc!Lr6Z*kOD z%B?`~Z=gyxpB47K>0U_jeo(*DaGU=1c6L)Z=Ko4|XPhd%#}4I^hpU=h=$I_fmmSIR|8!+2z;KI%C8tFB$pr`{7cm!^d7t z4>#Hx5AzpYFy%1LXP-4b0+C5jEa4MDH z%=3`T2H%7$g9G|Y?W^`1)8Dw)o`OC7gL(XbV=+l<`i=go6ibmqAu5n1cuLQ}1lurRpYl#ic&|q%6FlVnMWoQ;4S((pZx+1xOm~gjT%4e;7p8A?O$YOClzc7Y zT?&hyd4i$S4`~{pv6AN7((14og^e$_43qyw&GG{<5rK>F7vTM?*_I)-4R+fM81sk1 zVfzoCGg?zuMqe(2(Ry)sAq1le!%YAqP0pK&*S$UvN#*KpI%snG)Tb9=(@6Gt%RcW` zl<9WeSy#f_OR@cMc%XPOb9z>@?yPOS{xLh%>L5Sur2h8c<6i^&1^wt9*fA9SBGEeI zM13^D=FI1NKP*i&-iH8P1eO?{v_GfF-1^pjTqoW~p(moer8WFR6Y<>;;LK$@EEx95 zXa|P0xlinuo&VuK;-;G#prZBiG}F#d3wrySvk|M;0?9UXZm#oY^VWL0@;m`WJLpL0 zR_~J2$ez&QmnYCawmUcLk;K>kGccjhE$)GE0pzL0kY7mwS~p;F&^mR*tmVixYJGL2 zS4?wl*6P%KZ=}6l#c<=T|J9X)`gAViJ89vagf4_t+jr6_AC=F##6u_ngGLFzwem93plK8FN@$qT>uWgChOi;Uc()(XUqTTPSCa6 z=g3c4vvLQpEm`%MhMtx=DoVSWtV_QiE+IgZivam7opHQ}ux}$X1^9v~QxMaT7aNrZ zx3hCstk+mLXeb8QK$)O0>r>sm6Ro>Jt?$yhjPbz1I^r63`eCHXGOIvnp97KT3zSa8 zMM8kcBm<>w^X5Kl)x-<`Y`}8elsWIyJ;(Zf&-b06Xc2(jdxa0yh1YBtalMGJ^~GvU z=9rdvVQ17g`Xtn{ralp-$hOace(AYWz;k43Ms5wQ{7HQo^d*u&_?wR{;>t z&+%}2fRgDnc|Afj?6o8`_H-79trbt$(Ag%vka^kdr?jR)#zP6ZwsQ|bIx+rgnAGfltd)%yT6`+Kc}4d@zxfVR<3!( zr3YmM5z1P^zsRH( zQX+WjC4{HmgB!FY8w}J|5U735?cpZv5 zS+W811E--^6|}Sx4RySV9=fG_iLvTk4LLN2YWej^xUt-AC20TrOcC>0Lq$oqh`DG> z+Q@i98m^;KwnTxdG^M=1E9EHp$^_Px%D+tCMniDlx`jhO;R|HG zsYF6e)ls2B?7CR-j;qsFa=9G$XrhDQf|Yky2bgvFKgg<)w`Cb)!+gu#3^rPUP#6)t z&4%B($;U!Ph&_yzER6!tcP(tIYxoV55obYvsuBp7ZV~NkKy@9jVtOnb(prLCUkM@L zzRZh)c9j5NRvBO*efeX_j!M$eM*MAmI$^2~HZ(WaOrpX4K$c_R@CS+x4XU&)wzBK zU5uO(;=*vnFwi_AF1BW|IN9Pv5tZptm-vr$!Tt< zD>t|32ul$x?z})bxOyFSR;W=w>r5c~*8wunHy+Ny$O{b>o`ytOm-R)_QsnJQ@zE&T zzC_JAfV|Ha=qX(py=;)iv~sFR>zN1%>hV;BLZ##<)e*KiHN{EYSfq&nV^A)53v zu>>klQp;PkK9*`*REE9;OAE!2aE}yG508smg@Ew~`o}bgE?Hcce&rns6Ew|p9Q4Y* z(jF7eZzkMHoM^COCy=YKgR`5bTfKw_xXIrkQwD2@2Hbx}fghj@iVtix@0sy{29r)` zA;aYO42>AXg ztp%rf9)Pzc(GS^?89)ZAzh{R-s3XS}C3k{iqV!4nTs87B-r}|^2ozKZo6ab zbspS=g?;$zk)cNf#(aU$1jYG0VCKaaz{dgu;u9;&D*)vHSVi%mSU0p`_$6=1R`r?k zx_u0m2vL)@;AW>L&LZ zmOc;9#nI0r(9ZaaTUZxY+bm?wNRRkS1=HG?wG&cA_EZp+^OXO0y;}tGktXlnY#U7S zUh-^$uHBApM)3*zB?@=18REViV%c{4zx5EOKW+sU;{1O^abfxqd&x;)V|*a735@$l z{fr_$iu45|ZBV!mV1jgS4f%I8b)hF*@s6eS%oSv(z%viZjLZ}km>9+RWhFQyeWwbQ zVg?j(lH4b)o$h?Cqv3t~JC6=@_}JR+0Y zK!0b;tZ;aY4-k~gMIcmjy#k!ySm)7aiTMZlYA|E^9xGyItor4Un2vK|Z)GSD3nfM`_d;?u^^TGDy;a^3yf-FdLx84uX*eA$1g zr3s-7`l3Ow4d}cbN`DNMaDPml1PkB|?9;5ph$uBB>Go~qBFOmT!T+3eCtmVtavo0C z!_Gw^BtOJdn2nOf;yFbUg$ZIBS;h{O1|+M50i&)=F zd<+-Uy5{~n7nadplPq4BJ%n6^EiO3sRMQ(Ik&rgGFfLa3jcVR$>Gq)Llhq?lVUq3P z6U4Pc)V3QJnDpLaXI!nTsR0I25+qQSb?t5wf?H?~6)rwr0BFt^^H;(ux%SdjDE_&G z`2-&59Xpo7z=#<2)hve*ECik^)XDl(2>gJ_cg?{zZaTlW3G0wQaJOKEn2c)luo z>0SSHsN&{m<4CtLd))7sUOn`&!0U4L!KE+2MK&dZRtqQqDVjRz<^3$!LK1_#c#eqg z)wbsXd|yz0+=={Sojc!Ov^k@xuI=oW1kc(1;K|6cH5fM(it419YQ zp&JomY`s1^jmh)B7kvwbAX>qYoQZ+ft zoVp_c!U)V*KI5op@yrx(-)6w^`rR`6VxbEy+)}P$kDJ?uU7iEq*$|uDpLaX}@e9@7 zHeW*Y8Rgn4*X^M2q4yu_>?YZ}`7W|AfxxsLk?8b=K_Qk4!@5Me)vi@sIn;G(oyigu zoPZ6FaiP<`8NGR{J9hjdT$scf4=QI1SBO-5ceaZpQo+tGJ4Kz_06bf|w6bvYD$Itc0-;t9_pve< z#oniQ9FYos6cT)$iu|tPJ6Y1tNXJsl^$`mrTBV+cf=)?jqeLU91ix}gpE%R$`w)bC z3>rkHvis>DMhpQ+PWtuP<1#k|B6<>^ zza=g&5EcV57fwHrJoAP{>nq|lKS8t3jdox3HnSwK|K+|sG>22fXMg;cDIv)l&4Tfq zT+BtKrSk8>17^1v-(W;m5lnJDNPV-sW}hCSVI1$_YIgR&c<;YHkDdICxRSp_`=SB# zJ)`s=@ABNO;ba1mfS3Bi4_b8z%-CT-JLDk!sb3)$H!MK=U%(4X1Vh7x)3yay4gLwI zV5LA~*?<;e+1?Vl-ET%He4lNIKkN++*Xu(tD*vTO<_Orm^H1D>BAqHwQSn0VQK6iO zRzU*-fPq9GU_v2M!G!#{9m4mmD_0zgwlXM?V+cBXl9sk(=j?uo| z2px3rlMdfpLsGwF4Kw!O#s%OcSRIOEpxG1VjXU3pNCbO7IKj z_M7VGxYPmPYqN|_Oik9K06m2hn|e-<3%2Oz2>wlL+`5A?@FV>O@*E-*B7?`z)g+NP zhd_*%zhVboKp;9Q>7pmgPZHPv)M+8gbQ{xmn=2-pGWaDhSoV1Voe!gm6I-^(AVGPO z5)Z+la7d{e=a?a4@=MWv1f90*GJr^%eg zfkC|iYh!~*$dVPg6LrN4o}wQ&4TmK>*${q`6_I)QuYmoJTKi@YXU z$_#5QXV&V@E>dQeVtHvF0`2T|WG)qk%g1 zYIik)W&hjg*&Tyle*hDMqVSy?eY`0IzRMAs>ig>@O5+|vI(DH>dfEN-qsW0y^~!eI zzxFpqw3kkiA_#)HKFtUDL4koWSC4Yxek)&VLt6Az9If_(!MrBILBUc&4Cz4N2L=Q_ zQP@{RHfa&k$KARWfy^oa+ezrQn-0Ae9YV=Kup+HTE8EZd+@mES>6LXoj?YD;K;rD{ z?5knb*)noVeMoJ)-*vNiFLg@?wI`YR>}~_s49U3HdEOrPC4!;f1x7<(FPG3XJqI?H zG<~)c?5gu1V1?{M`PeJYx1z|)g02ai9I+%T7IDTCrM&G<>=G**6j}6`Xoesl9EKHr znmfr4WHS$=R40z^C>i)x+qYwzy2?(G!KCH~HUr-nszpR#961PP_af+`1_77hA73L* z^oB~(%v8YmK?ZuGL$^;t_n|)WVF%i`mU;uTCOj|)ONj0EhDBu`67InF7uA&EX5)Ym z@TPD%5`?d?1A23H(f~;1q}QSlN)IW4TA<7iO?XMdYhgK4aCtrK>e_f2_uz4{r*AuePX;GJ zV8IC6yzsZCo{yC-Ui)GWSEvEI_e+hAjD&)6g+DK-C$2wPz(KP8ASW$`*VSyS{cdVe?Irsy6CIX5?(KuQ(| z6xQ%`o*A!j4V--_9s>zyul9$SJpB@V)cS>qoWn-;UzuRPs8vw%wG}4+t+g20Rc3)L z11E$u#$7?atf@kL%V}V@($pCrD}gF3TuHF$4zp#zlG&0^0OoT_K^tiG zZZRYJY9cLqBu9P9NopDLI)SxH+xhh(9DRifc&B{=R}rtFGJ+AN`h!2jiJ$G^*F9=U zxJMPoRZ~u*`L}j&l<8E@8Wn!HVjLSij-wQ8?_9b@=)zB*hK&%lWMYUCChC~nzou&r zyg@ggRx>)EL-`RH+bMuUGWy?&o&?}=A~js00#&W{v!0ZaD@YUD-c5O?$V6$6y7{-{ zRU&U4kJ8J#N)9UY?GW-@c<5*LFfcIZ-H3LuU{4kdW?!~4y&3Cs+xDL>Vc=p|JdAM) z*TJBQgZ*&XkymZw9B1l^o^0KDA-H!U(M?TG*KXf}`MVv5N5}WuY4{t47cbr-LC-x; z31zFvG~P(Na|wno-WqhALDBg-5DjK~=Dz#9Ahy>*)8WXU$V9Vy5)mCMu`PwJpD?nq zDAbb16bhd#&+2!n^29IJb2}sOwE1Hubht0QCT?0Tgcx!AzS8S{*-{S43Z)2uiBj$8 zQ2tbd)zAK_W&$G95TxFO*)~zLDe_3Ee;<*$T@XvodBaF+y|oa6UrzCE58Y>DZkh5n0p!2-h@>8+{iH3J>5D^?6}eMV%{I4Pf}cWH)^ ztv3pqRTamP&eH{iDY;X0*H)(lW?#r28_b?+uYAKaRv}|S68kEnx z?Hvs<@-tl4Aw8@j4~|65LVS@SnF=>=_CQ=UWLD*@c71j2VU*W9Er^Z2YH7{kk+boJ zC+VqlD1^adr7gJPig~TfpW~j^2wbgi*p$r{=nxn&A}OGzCY+;DNBU^Wn}Fwa(%>X0Z!`e${D7DHM^yKgYfS(%t` z-xK}g_o_junEa;!@81){zCidfX8q9^!Ab=07wZI$psx`BH=z1>ga8PRnV%qCw!o#! z9LV7kf$qW$7&R812X~5;`l2w6>@K)i!&UsuS) zmWY+25|ImaJkkFGH2}0C^XH)=0;@^~*f#mMl#m<*l-;=beYXS3{X?`{gIu2c@A;tD zfBv6()#NP78^&AuXPq_D=aca~e#?nJTh;M?U0!4Fvj2ZV>G>)JQ_k-?Os%ipnP)qT z6&c5B{9kRdk^{aqQH7rzVp9|6JL3P8L9OHkUS4{~{IP3XKOQeHJlnQ)Tqj?BeShx6#jO`>J~@1R_;~8_ zrKYxzXgoWkuzGTJ7tv=t`~NGX7xH1{Fd%S)DCel~ZIK1Gd_O(q7#h=64xdEYxK$F=%aGAywa3tI7O!leCh_7Umj)~j2nDv zXrLy~>GO>$j}P-t_n$#Pze4|48J*DPuZ;EE+v#J>#FpCh7dP>%uErw+=+;X&FQzL+ zxwo@dsaLa-S|z{VbzGeI!;xg{)%iK(Tr2g%>D9OG&HBZ<<;B^@{NI{%hPK?9?SF;L z26pmjuAbdXYObRe5;>JxPZwQ$?VpvI3T(XVp6%UbQMOxu{ksIb>$sUVw(|J4JfEza zKQ50fZ619tj%@uuo(^i#i%#kc`2C-)PZ)~ktH{`Fq|i1QhiImfut$QA%>Lr(t;O|f zpm-N(ySp%MG_T6A^+%hz*KDj*M&DjuTqR5V@LQBo*tn>eJ%heYmg~gI%QN`n`|{r` zdA0M#mZe60{QlCaSr|6(!$Hl(?;t+9@qpz#%=DHVK zN<3MbEGyqMfBIBKx5X6OUF{g(SyY039ggrx?&Iz9=-TY|XDWHz)aBp$=~>gd z<;nMV3^dE8dCP#ghD=M&j6{*HBh5b!hHv}%7&ratC3TgL82;nL$p4W-=VXlfr_jc& zS-T1Tg~M3Dz|SRly6ni4na!XuyS$P~xqWbG%-XJ5e&yuaoL%1TdOFt&&iC%)>9T<@ z3;X$KS@_H-B)tlulxc^9K>2m%4O9Z7BoVOi6dSOh+|Wam??R3ou%N~TOSvU$B6wCE zPeB)TkIs9hfRxMXYA`63hs}GoC?sh0Fne(`lvZ1+#!gqIZ8FqhprwcIsTRSTCogra z5@nmY%2n?Ih1g-q+j{Y0l5hTo2vO-a&E-m2UdDJPaJ848Bx8yUNX=zB!EgtZM?H1N z2`c|^X|R)~+ex0TBoH`Swg7tnDs%}q|IF9AGegIz`wmpjR~vOS~@(||YP z;$H4eSlw6IAkn)zMTKb12)wZwiZ35Y2Izhk_0vqD-54OC`| zmz7+zKQ@t#n>!<_t}g^PlgZSCaWC<*DyDB(q0$T51Yg`Q1lV+at%Es$C)wUzrsuY_ zq{T{M5W1a#wB!F_%nV;qN1C9+(~HC}cK%_I5#x+m+5+c`K4Hyq&OGN@X1dwkd}tDi z4&Z6`*sq_E$K}Sc%{~@Ntw&xuR?NerN1CQeNCTP*pMzq9gHRP=lhc=rKgv9AEQLOw z-D6Y^$1Y@BDh#WJ*3KLXgQQb`R3lZjl^k7FyuiV}PRsl|cgoiMh>d+|&TyoYv3H&tvA4F#^AQ#_4uz7o}p=} zacV#NPe+d}fGNW85V|v$IOe%nWt11~`k6&DeiJ6C&GkH_Y`~nLhwXw8jT?Yj?*~g0 z=A_005ptL4a-LC!&2Yzj%gYfWBZBz?$$)z*xAyP>uR|dl%142tsz%?9t|dz@7~v9} zT+nj3<-S}Ms{+`VGf)y-D=HD>KA_W|<`cn|C>G9Y6xLcaP-B3zLQcL$XshZ)3J72I zwIImc>-wTgimNCWIo@uo1*>nHdsdH)zHR0~gqsVG8p?s&$mH8sr=E9zvb?v( zFm=OMqZ@n4Cm-(Xs48}$rVfT;xR#k7QS)z`!Ba`K)deXz+u+r?z0g{f`_6j!)?QcJ zmNMN{XWELd%%;ZV;P19>k)jSGfYoZ{%7&tqigqV8Je>CHP+_Q!Fc^tl9Rh7VvP|RV zRd^8T5A0V%+CYjG3rg56DY^Vg`2l;|7;ofM!)OouSGrKJ(@4u_sc>clC<9odO%lw( znvd;{HRNXyi@=1r>&Ma04>v`ggQ|QE4QuO<$346yeoQ+N|EFmtO*-y{>sxELA5zK0 zW5I5lJ@hpL7kk(r8$5^oUEUFT7U$O!Rr_rc=blIuTxUG*1~1_;|!b+l5Yap zLv%yo;Z2C$mjFfyZ2ULu5ojp1UlHH%jt?ks^xtjQJqEwiIvh`XNxHs_!f!79rAY_Z zeQxW(yua6>A-?~4jPq&C$sA2)TLKX+oY4Y>Axnz`_c+#eG^`~8v!5u~i<11bovyE1$n#Zs~z9GkV@^5{qZEmn2V z)4mhNh`FNwA3um`Sg$adeZwCk0B|ORCU4&r+v$b5THgrMUuXv!SfjuHIZ3^l73xU; zb*~B2Y9!+s%1n23V_-GoPM|}N_^iPzKUg?@CGI&K_ zQwFr3CRXmbJ-H(S5p>*K4u0)*?Y!hyMdXCEScz5jhUtAxjR4g}idCPS$y68G)E367 zbc=3U&A7e5$L@#GQS!h%f?M$a>|O@w2&2dpVPE3}+mKGyqsyLkB_(khV(CZEK!U%*z3#ueF25x7~jci7~?h4VHMD9Fx+@8 zk*rsUb*I4bP8)btx)0XVv9#Q;JpL~5s+>Lc$8`G|xw5%L>nsiDorDpjijk_qAUJLR z`RV^$&Mo}M<$_#!Hh0Pq9)6-l&lqkXkw_79TrpEc-FcCRbpppt@o8YBwYFeRGo%XS zMKV-F6Rl^U67b*kt-IW%(7_i@!Q|nJJ&I~0BSW?}iQvR_6 z*fsf2q?h-%tQcBcB-s2a{#i{3b^sLHrpbE3($C4xkTN^|TR?CoN)PlqO(oaWVz|5F zB79px?>jawI9%?q+_Y3IQ7nmaw3Y2{#9sp!i!jzmsfRr`u`gf7|KNKMdiI_Or3V>j zE&5qXv2jvFe&SX#c9a}10>dG6O(CW!dFw%4+$HzQb$!*!h5$N9XBSovHbd$y=_Kz; zpvM0XN7on}=@La_+qSi_&5do_wr$(Cx$(xf?POzTW4+l|HGih+>zeL+&ONuQ=j(HS zc1|Ss=f*7dg_T03)2)WTxR2yEfVel!N#ML`NxuzJc*tc6jZUu^P;xv(bTTeEMr{~9 zv#!}s>#4Zy0^Ve|g1s{Zjea`jq=|;#1X3vAik=WwUou!_kFK~3ER0iL!a!UDe4dDk z{8;`C-lN{!Gt9yo4-ey(RC;Ye-*5RmH-FB#s9w7y@si|F7`2%ZP+%(J|DJ2QEv)@l z9@`lC%{19+kf9q3CvX*=fNP|tvAB9TO`T&@dlPckbcHNv^-Lj`c6|@<1=?aVca9LIn|$Fxzt!mOHMM!+%g2awx$-oy2E` z8+kxC$E5VZTFJTF0q$>n&)fNf7(N6aQADM@mB(k&#Y<&$t~CnCv;4)RjKpNQ@z`E`6m%l1nna$$c|en zNy*hF!D4Q-^d~wJ2)mxuqoW{Yr;CM2K3*2YRK-lVE61wfCJ;LT(5c-4=$?We9%sn! zQ#)GBK`(~Z2HB_J{Y$YN{F#xKB8x=6SQ^wYZaKyMPC0Aq1J8znV^9(N@`}FR;-1)K z-yUYbwHhm(FVVeE0;Ri^v0d=7Y+`ga%;-LOz7hs_*QBDf)xoU(B^e)r8U7*Dl{;N#LUC#7g^!$9 z1x8vbAw+x}7xeTA8LR!7=^}sE+3B1D)n5zCaqfCwJf`XRFm#_t@J)V#nLJKznyH`Q z^V*M0MFcqKWMXVc)VH1VKS<6^fi{s9PdHPwi0H}QK86%VsjI@E==$B$^hs%4O38B` zCMP4_s01B6u^!#6Dh|Q4bH?+uW9k&F90<#@ z@Wmqk{sQ*j%HdyY{3oS-@2z`&FZ}t_^FYD>4vmz8>$xKEKFCAALKgXu zWVOXb!VyD)bnp_)c?dWF*C9iF1V3vlvF}wZ+iSGb`Z@8x$ByK16UvdOJWLl zbTq2^WYvz}EeDoRYPV3*jadC+00p=OVT!~?+~PY%009h-Wyrpjl^sVb%3mHTgnmy7 z2HYpxa&<}10X)Yy5Y6R1CN0FBxc`{Ww^vH^G0RH!9Fy*4^Ybu(wcxzh0r^`_*8~5> zD+k^h?T2m-kk`l9A6W^=fmL&Rn+h^)XkJsEnjTp?4KBie3_!w-3w?yEgxdcJXnI&x z94v&H_B+mP23I7vq=Mor3?TvS+0zgJvFhH~guxSOk;r&~E~p);H>x70P|0)qaWoN% z_g2-UVW_(mMO|1kB0m1TfydJeyF^H3V9v*BLiym;=`wU?dN-VrAeQFD2B5G9>448y z3nv47c>gWirk#xgAD?1`XUFnB2$v)TS*xxC4P08~0GSfAI|XpQDEQ@8>Tn@xko(|U zcUXmFiIQN4GP%@eQ~aqr_ygL3WJqmk7LpD(q6@fPPYh35cD4*=$LJ>Pk$uP?a7zc+ zXe&8e4lk0^aA--zAt&nf^V87Q)hJgTF}#^l4$nYsF^Xhf%7yPF{~y{}4L>M_7}FCv zF+*-5E70u{Vd^v5XCIgT-C+tzP$b!k=Z&vGBK~W5qMiBR z+vkwXk`d?oT%}{!+5Fe3)kk|D;bp2bbnPzbfaNNf6sljx7C3UjTb+gOB`GE z&%<^+wM9w{n`WGU(BtrtIyhG5OH_Y{7Rn{5Y^k6p^j1C3@897e@BhlnW9+Avf=1Bs%dW1QXE!z=;Zb51ea9yna~60?H~ho{2g;&r%Lg56_T zKz$&@pB{GL@p2X3Sr%m7@PRj_4*!?^IJE=egcj{H=F=VjvVZcQpTUKZ}f#VYd$D-%C}==$9JQlO~SVm_RN}3rxMG8EKIl3N&ajJGa-i8 z)M*_uW|h~O(`j!xS>yO=T*vJ|UW4=~we}%;XrDek4Y>sBWix@k` zO#oqU*tM&}1~==6&)71Hegse2hggNd{`Ux|rEPM#HS^jV{0_^s zVJAg$WoW5)S8CmOfpDvWM%#}CwoDmVtV@Oo;6p~yvem*_4)zUq*k!0n+Y=K|KFBhl zNP?3-?4Mq6z6XZ3$lx!$pAg6`;o!WHr;$V!&e7(a8CE-x$4oV9eXo-!P zMwJ6La;Ucs=t#j)b4a2A`p9dNBrPQnKVEVIJVD@ZZH|>hh$OsA3* zsdUGH;Ww6kG{&OeEWr;)ZkFAk^p%&p?)q|0^SeTnkvHoaz1120GRUvc8fz_Xe{HSUXgU+l!U>E0v_*pO5LA(jzt9Gk+Kf-O z7B;I!X4-2QEt5xrC;Ni>?SfbNi=erXpuYPI0S^uZo1O`+5CXf9wAfrENkzX=U$3CTBpC0kB{q~tu|GDiOrb-$Cgn$mCPYHz#Sxa7 zh;jR&$2Q~{(-g#r!|2`U^B~g)(ySdt(Yk7I(hem~?PbQDaDMVTS?Yr}_X&8xiN?%i z;OwX-3)Cq8o?42b*YToAv{s1!RcyeE*Ww$3Cm~<9N9K{p!@fPiz8)j?#daF>hJ=h! zJN0mS!0qdMyMzI8LJ@ngcq)Rwqss-3@dsWSv)a?jl{MYbNl)i?pWIB%&#jtu631pU zt<xKz1dVy3*;E-mVvSQ)T$&_z1n#oAD3$C=1jP|dP6oJc=DZGQw_)a#dcr)NF%-=GFHcPj#DDW&s-sb&QO8J@q;%( zns)tkZG}8i(c{X~=cvc_2P?C?619YGA5U;=p~)&ahg9>dpsP%|o^XI|d8 z%m#Bim1R$ z)}Px~gD85Y_BQ>)DYb1E8K!o<;&jdD1RF8Rzu>v1o}>k#Yzt1jBSCGxF2&D;`CD)p z2e2NmHZ^-4*nC`BhF_I_>ZqVvE{H@<;-v{xWfB`^z;;gODvu%+i76!`RYB-bZTrCI zM#GaG938BifP(N!7NNcZH*VUn_J?5z!ES#g#xg4{YN{u*{ti1P6bHRQE$SwE!(!3{ zzZL2&<@y!GuR_wpd$3Prx6_c?N`y@?&mqHTb^oX*t<4ohYkz7 z-A#{+eqwSnKJa$K^BShfkjAy3+Z`$f%_(3Q67Zb=>RCjC4|g0>_g|zR@W^_BD0l>k z_pVuD%S6BH2QWxle5anvoG{LE0^Z@}Wq;K}@DrNiKTSC}2hkU~%lN%xlYi!%{tj(? z?R!fcmT}7)osD5^)mVd#oti2^iuk}pl%+ZO?ILHutKXEf3Ys6^e2l}U7TyEvXzYxQ zG$0%H684*ks@2ZVf-&5egU<`w$TF>s>#F|?`-=c&y5Lb!a|rcV=JAl5F39Zy%ZKjuU!*zv)5&(@0pRdevCwV@i2 zce)KRX{*`CC+A6nYD2cTujM|%W{)pUux=Ub!Or_gCvWtw@Sk@LsHJZCXZ4G=UFN(h znJ11^K+~I$vToDaZM8Ci{4p!xg=r)-x)io-AUC2EV%RN=I|l2E8+7$hVN*Jh->kz| zH-&|kw1LMTp*u?Z6ds?}st6W>)jO-{pSDu1j z-m|sR$X+IfRqka8am)uQD-W}4MwtGz&S+j@jH?l;7=%Ie1-LPl5%UUyi&!n!@E7I{ z*Vga)-CQv1lx2AR#+$J_$qzEE!bE^!PV|7E9Kg}8_QOZ%Q?CLf*iC8`iH!$v!IuPs z8!3>{>8Z_`krh8&!!;CX&rJ|t5GLf$sZGPL+^5=*hyOeP50dIv{zQfPmp^sJ%!d_chjgwKK6blg# zW2i&^eO06)W))r1A#y{5cg9pR9S17d2tpGNs%ZB-q5%!(NkN%PgTZFsf3C_m4$17w%J*IAPK`lkM$vSz_?}I!Cnf zw|mTl-S$dp$LvgAnav=NHZ$9dHWe_%G~&>{~gw~qo?PpH&&9Kxyo4D2yy!!2N!WIAt7=snLdWs7aoDKpTJb~ zM`|jpu5xM0_p(503Y@HJK`E}<3!XdZ*xj46?C|t@=uggi=E#b~|=L_kR$PiJS&WH3s0a7Wb58X6e1Ik-Wr z`A}|3dn6bp^|-1a9obJLB47vQgXiX6-R0%&B`Cjb8F)SEjZba?twYIlpVB*UN2*SBMTMqP))^F6l!M4}R~2(@Wa9 zD&_2+8{b)~iqXO+;>rozl`8rgKySHJweGLwSams9!`B`nOJGU(db+i}?!Q!+PXI)* zFg)CXr2F`_xh)J)cwQ!t(HFL|-(|_b!n&`7&B6?RrUQpjA{J52cAc6cWgeRTxGr|v zNLYP^Qhr4Oj@{B!*V(@}VetmcOz*Wz3%irWTl=K`173Gd>3PX6no{nn=f$Xczq7uO zO(eGdeItZiW9*lHw9)*=dAE^b^&)2n=l*Q-v)9g<_cYncTQ#v15z@ygTT!6h{fRX{7(4qq04W5w& z9}CPXlOe)l?qm_a7a=heD9#dgt zPzmQqU`X-&D-YHy2CNJed?|zN>E`Ywzus{H_8=v8w(WfV;MPw2`N#ag*iK!^WCsmH z2}V5;Egut09DSGOH^_w1Y^_r)Q=OwB%;He7yXy%dx)<=_e5srbW_9o1hMyacKA6`R zXP%8kJzd&8m#YLAGI!JDS&s{B9^-lOBFa9Vkyg2X7N!QH{Qjyt2luWxd#heTN+F0g z?=_FJ9=qt@!|!gPc`gU?M(Yt5aeO!=eRC2Wb#PaOa zoAUo-m-EAWwfU$h&s;Wyhrcd<&XZ!GwuMpB=$i4@iKML0rZZVF*^NPmMGv~MB}syJ zLMB7{u{Np>{`_)j{r0Ia+V);ePAO?{e%-tf(H1`M|F9p38Rv zv$%N*7V%@Jm_McQ%f>2-L+^P`lf5>>Tlqrj%ySs#?+>}qD?fi+q>ru+{4}2=s3!BsG8r`b@@@N_%=2zxb>UFO;Cjf9 zCeV6liAPo6RBQAl;(q9}{>)p=`hKb@zMg7dXi{-9b1S8kLB`~s@iw2_dCr5%?Bi&5 zN|ZxC+crj*OngLOQWnfL3uedBQZ7x{F&hH6jVt=@eDxqv$tJ74OlxdP~YWF^y z^gA*<=GMwuN$kKgUVm=%!oQNekjQho0PyYvg4!v_u?jKzQ;_nNJ5Su zIj`CRHoO?h{-Zl-`41ixfxTY;AgM13=kHp_H`7B8i7gqL`k;;3dN^16PZ_vOgZik7 zJKMU6l_Tjc7CZ140Yy!sw7=0^x6)U`w2!Ik{r)y}H~7(>pW1Ny$RfAYi2dAE_bh(! zU$6zo;fD42IiGVltvsJIN3bf*Xde!n_6QKUinsS}l59_x;TLY|J{_z0yS~`23|@zl z=3tuo;0ix|kT*!h4^M^#+};imWRA1b`&aJA-!Pdh`X@P}qYs{^<0{&?&RT*WP6&fn z>vzY#8MuS(+(Ev5kaaEMZ}bpF;|aNiI@r29Y+EUWUJJR-*=FB!9TUL*Z0^{W@8Y^l z_$sazJi@gomJ8UlPAc?lW0H$02j3G_M1Hf`bFWPlY~i-NJ=@-GUPxOlkT}ek+T*$0 zK-Nmya|RgZu?}-WSgOFXBLtasZ3lySkd|UA*j>LT@7VUPT1jy)-3=DPd?r<79<1Wd-|EE& zbf3Aa!WvjzGWctJJ2mw-Z>{ZUemgC3Zs}=%6Qfldv+CWKM1emr>S-mxFCPcs6ob}r z6XA!QEJ}nvHdF^37HNli5EUC=RsrG8FKg=&f@~Ux*bViI!%{^C`xc|y5vJhaBwCk_ zf(ESw^=J!k*lDFoISVO}2Y(UQ(71qDBuB+YVUb!#;D+7e!c>y!_=-9Fm0{Lf6uuKJ zc0Rl!Qn?#PZq?SyabMCc(_78MS7`M!R;6h>AdSuJsCW2#;7V>IdZLA`y(d>~W#3Xx zF3w-0ooXb5#+ocmpgOb$RvW=+r!6t;l%_gS>%HiM0as)mBuD=hLbUqgu*lTNchvh4qabMy4rYE{5uWpxe3Up8=FV zHKVU+z)n&3RwZl4*tuQDUVT-_F-pt43>ULpgz}P9^cEEWT^QeIJLl8l_Ul$ovG2#1 z@FrA76EaE=y(UTooEw@F`cF+C*gqE$=MpLAlGL~p>Nr25;veTx+P${-480r&6Faoz-2u(6}7|#V$ zGYK`-+pnY3NeYEc=NNH9v9r~#K7+vVg>NgJR)@hIHsb?x#ytZPBSd@Oo<<-No%3Kh zfIv|sf~`pN zM0Sn&OR zKqDK7hf*Ibi05=XWQ4g?reqza?&}Oz0oYUj?0tZGS(L=NxyLP+m5Vs2& z@-6L0sSAv1AlAdVbQH|SB}0RohmVG&6&ipPlP=GqJIV|(Q_7i*hLCx@?M&56)jUCu zT2ap4y$$uXbOl~)a;t#ruwS%Q%{*NOBn=y2sGcC`-7t^c#*rXk*`-h*n1|cR!$?Cd&#mBQG69H%^}}<}r>OtZ4KM3@z9W$*oav*RqB! z-P3e>V_B|2J8~hM)f#@$mZa3Wg80+)>JoP=s!XlL@0fWgl}RM-hCoB85xu9dKL}mm zyikxTw_A1{`_*Z=1{%^dr44Jb3T?qHljT`ST;Gs#jTOztRf zKKEu8*jFQH0!h+dLuhX8!KTekxPRXk?(KdJ@|kf6N@ndE*BM zpDNv-Euzed%a7VP6&e2Z)l@GBJuu$0VGxL@+EzkOI4s3Wqj#3*En+g6u)S>`q0>6P z77DfdE36TRxW`7sCpYZaRyvSTAWJZ#35Az#2o2kip z7X^(p(*nMDz4C@`Wy8Bh_d>8qMHDAeL*w$&jxt{szA_BV3<5bg{U8sq_*V`467?LJ zQ6}oF`KWvlfD_qZ#R2AE*A<=G%ysJU96MT*{>uXMi9qvU1yx>7%sekBVn*4>9+4y^ zm1`R1Rld})k)@IAm$x#2E@0DdG*;DxBg_{V;CBNJeMuJjkES^-#;9k0}SydhS{Xe6mT1RT5^Q7lzhvTa^AV;*LO=8Q6i*RL2Qgwrihj*=j~mIl^%G1hQUnk5Jkyw#)bW8 z4;|9KKff)bB-$sI|DG`G$IfQPcb#Ks+DrrpzbQ%F}k1GYOO zN_+JltC3TokwHqUGGkU4$Qm++nnJ@k*{&5`Hp}?C3gk3Rk1dZxg$(<2330dPIKwE7 z411Z0J~TCuLk39=wJ3r@XZ|!#I-@hVvM6uPnYi#I9m26dp~y5w@qoH9m5ZKNulEj! z?mFG%VjWdL#9<*TV{%mekzkHRe~ zvHnCmKQ&UojB+o8-t64i$O;$6O7Z;(Gbh?FW=-83oGe5sWYEn?mY9$xb6$3K^`Djz zzjQ9EJy_%w=PSBW0j;-`M6LM>%IT(bBwv3^_eLNjPO@WnCG1n!VO1vE&Ijz7+rCl4P4iia=&P-2%EIp0s-s+=lZ^eM;!Fwv~a@j*|g=&d-!;lG0`JNBl1i z7FUJIa>56`JnP2z0CiIBo&1%O|$JlmLv^r-Ywa~7r-!|qPzLMnG_$DJ9HG*+h87bCk+is<{D6toPkN!dHHtnFNWIJn>GJQvnN-S zTy&0WjjLmnVY(6e9i)rb_vRiJj!zEjhf*;80_Yw=*N5bI(Iu*YnMWc;t-E1%uhRZ8 zsECytts1A?SLa4dW+$^487$fv87oo1qQ-XhAC^rnXH9#mm{tJ$t#M*x=_rd@$e0CS z7D#&29}&tV>GV!fx<7A$?XaYQSq^^DG9fw)m4HG}(fUYA?ohOd6X9ZOIElKZUv;il zCZVV@KmK;C6}j2F0|D3OT3K7@2q>!|zam_mpfqg5c) zL9It~%mjd=bGKW%uCD&sv8Jx5lvbo5<4${l(pVC4?fz50_>4Dejv0*WFdnwbY5T=F zb2%;`O@Wm4k2o^nKaxrK`>(6#e*lKw(U4owHQSkD{?ouu1ZvORJO@x&}^^(eZ$gKZwR`z@Dzr}UbwbuM5lVe(aqXM#W(P*2Ylo+F`f zsCC7D9A+JSi=*(Dh2jGqu-#jO%gjR4PQL-!dv{CUX^L*2-l>fi4QijhT=B9as5XifVZ3mOs-Lw<*d(vGu%cjK~9fPzvTkh#P(^ z;EEi(A(!j#cnXs0>%M8f>1;rMKqSzSCmknP6EAX9Q*r%_7nv{$-mt@n=?pLOa3SB4w{mmj=%Wa?INT-&`bo{dhJi`ftoPCA9@1>dfUKBWc%K&|tW~O;c zUpvcmFq}Z&A=}E0Nv=zgQg03`%@QusM|M!H%#hS6U1(iuf*iDI`qvt&kq$esc1VEW z^ac6o%L_?1#}C)DI%>Y!2NW^%5*Idy`l?KG65&5VOiWnF8Sv3SR*DA7Eb6NpYKCFf z-pb}{SG+o#ELTDTAG*&jJopi&`?|_67HZGrPg}VVr7T$>u{LTH{=y{EVz@YVVr^kt z^e*{Eq_fvO-~=liS3;MK7n<8A4Q9TvWt6bH(uR3uG)PV-vF4 z$~bjjZm?GMnT2EZnlSl2j#?AJIYmf-}KxEiM<{IBzifW8K@2boX^*+$Xn<^LeO69D*Zz z*|Wz&PUV!3#)rH5f%uYv`Q8VgbT%6o`r4Mb2SoT#4z=}ET)D}P)sS!Z_0~u0WIgnF zs|CoOO4dDmIu-(!RW@*CO0GzrJHksi#DdKaqtJ(@59b=oDE|7}wDTLaBUgXj(0yZq z9eyO<2=|r<#`}7CYNVuExjHx&7P7$X# zSEbu@Og_|^M=$$ft5pGWRmK}h)yZ|GV_Ffp@wSS(o3HvE8p2uxmbBqqZVDo84G$$wH$zU%25I`lt{)$!3mC(hBnrrE;!?Lh3 zj%<`5g~7v4nRsgwjx&6nGWXjcp|sW&cdgu;qvMx_%8`rFQ+`Y5m2q1kPIdT=UTQwo zobUkn1`TE;H*+&`a}h7}^fOhNBPPCz$-e~@_e8s|mu@{X&TyhOAgxfv{3eH*xorx> z_O54v)O^e3`+5>y9n1TAB~VcAZRc1&YRrC=G*DB?S7-5PKeqP0EQfPp=MUzo63Td+ z0HtZh%-#(XxG11&dK}l%2aB)-8`FdKj8E0l4~lS$K+a9!on@jG7iP+vA+*+Lo%*fh zHNUTbwaR)sfM_>&&U!-rBT}Y>9=fA)pH2acIEZRka!Z5Ef-nhTVnBlo z$N)Gff~_k*e@6Yo$JoYV#df>-s6;cjeQp}S7b_)i!?Oi>efhLs98W}JreZHD9o{p2 z<~_-Gr*~H04XWGw*mTtDJI)fm^?R^pQVzK8EttBSC;4jMN&)<^oTh@V`nXA1w{%UO z9NkqrY1ML(c0GGXs^?+(*DJTZ<8_uLywml0&CG*XaHzWM{$r*#L4Wy7rE0&x59a&x|&%-fj!TbIpZj?g=gdMh|{Jh2gavn?5ir)u`0D8 zsCN1+TFP)6l37YP`zArBX}1Da(q-6r2^PFdaD%yE_H-0~(9I;Z16EAfBC|XuqWfJMBw1YkpIVXgtm!V)Iha#XO-z@^SVxvH z{u%xLMNA2W1v(!Ekho3!RW(trINDEtd!J`}UQfMoT)MGryUaGDNPpEf`DM7fUGyD2 zD#zl-IN3l$TbnG`nd*#+H1abm2U8915kr#LHpg6)i!!Vqg;guHVAt3;NugKRt=lb7 zlB9F4d#GMpikf(!uBL8l_{KvXlUC^Cr`Sh*HbbNhM>$S8U{g#n#yaeb9qpPt-8U*r(vOmGU1Ie@g5kH zlE)~IvPw{?MZ`*ptAujg7?fn^mOWS8Vj-7T52ph^bZ<|gOc zI5=j+`fwTtTi1yF<9&beUOiV^6l`V@H;b~4sBBSma30lWNfp2$Nz=G`oK*E`z23A& zY5TB>;-A@URx&_P;MpO@9ILRx$rDS_QVU=79JN{zOuzbnDluMxf%Z2p35N_LyzCnim^Vvv zUgaYQ894WH@UkgZVUmmoObOELuPdt5S|uxCH48jZk&3O^F7ihxl(;*uH6nBdI)5Uw zQf51ptKGO(D^1T-e=HlQI$l)j$_V^wS9??%#x5*!kMg!6eP61QJ?8pVV&kd z(OEf${fg*A0G*e>k7u%5u%CiPseQkBf!DP`?9YaNilMHGQ1oX?Gfaz8zNASiB&TJp z$}~wICCU2TRH4yJCQGPM^M|3JE!|UG{Y&4GY`hXl=Kd$3xLxw`@H3wHQrOJ})76@$qQs|}Vv<_9T~Ci@x4(1;s=Vv@Jr5ew8;hpy|A-6e z0ZyQK3nNfk(JP+QeUhP%R^Vu2@Dw(bmX8`h^f=2AAIQ$O|@<({(>BGlQx)qOc&8F+Q(C46y#X zE*i1flG_y3sHjaS^tNtE{D0Zo9m)d+izEw(2B!9g?5*>=Y;d-Hypz+RmQq%8meO( z+EKpslaBUqLfWPc9C40e_mlFotwFgTbWx-X(Q4LjY$|OXVs&TPJ_tTWZ@ z<<5xylDXCd31Zq0PVy0fI(>UoA$o?4Pe=?Dg_);wu58eX(gZl{=&FTRgfJ%}&X|!j zfJ2(2+bLhW)GKFN(KI+k#<46kv47zaG7jBl3Aqq?!4|2frCTh=dk%qgc0}AgG5y7; zL5!0b`o7o^4%s_W^j=nB#5*sO?Oo(RaNQV}uOLs@(^53ya=l-!SK%p$5qs8|BbQ^ZCvG<&E6|hKYxs#4CapB>DDT9B`K(bNuFa?6aVHrDn2LZ_!|5EF@5)VK zJ^M2m?Sn)7at%74uYTk8A3)%;e-#0yqMNJj59AxU4@@|y%nOmK3Acrcd)T=)%-7fr z=5JQyca#UPhiNoSe#ryKE3eZ9q7>IB@PwmL%k!bE*Z+#91oHEjQARaZ3EW*U%H;DE zkFyWYY;I=sMxzlP%M#t_;hDRc^nic$ozbkLpmHxt^#_PiQ`}kKLp0M_Gmq#(s8^&W<|A7yPVkv&k>2E#lA8{p{Pv>s5d@XozhYI9l=#6t*Y;%0Mg;jub;=%fW+DvW1FhdN+8MKe-a@?1TLHrzDt`wyxYa z8cwbCotMF?YOD*#xf>(A-GE4xnIp$OTV?;RuVD;bBNN;nC;A*u<{(V)A_0y=Kn349 zYx$sw)5sqWh%8?&UCE zONpvf4%BbIt+-@@wvSB~upw|sd^ve;Jhp6fcj9@H$2r$9E{Zrh@?C-qIV@bX(t{2C zJ?`je=KJ;SB?hAv9{_zj8j9s8u@J!p*d=n?`X6rjE!ZIYD;BSX43?Y$zTSa?HTGe} zduCKG_*Ebqp9S=4Ge=FR5#UZNVYB@|vb{&qURnw9w(_5cop#QCaR)n6T13f%n)*Z% zI~Ed9H3Hjm7O{ijiYPLL#rxvAcmaH6d0oVfBUEuK?G-}ngZ80{=h-Re?iCrkL!G3H zI%a{vCYQzZy*ur_))BlwYu=qaXuVvhtI&LXE+60fJt>ilH-Fz4FKH!macgwTgJXk90bAJz{i<&t*&0!e`)RNK?a;y-SJ-MkC876lKW_Gb}wDUZ*hMp;xP5F zLueDsO)G`Sfd(anLn$n+?mL5UJ6hU@Y`QP zkp2XZ8f2$>h=U^WR8oHxB!aIq`{qPo;691I&ngAy2g7wtPPNihi&z75J5)St{i}sJ z0pCrQ>FUHCsqDHeRpOf)FesN9D@8R`R1*su^HLC+VOEO$vrpuS2V7=FGaw%7AsbbK zzhP)@XXSx2R16p`!5~mLL@u@EN3vCW;}{oMhv0FIXdq}7d$|WCL@JK*INDiD5Mbv^ z_ov^NBVB{$zDzv5q#eD4NWo^eC_-H!vMa6aYxF!I5NkDlzbgE85V+Qa(q;BY9j82O zM!z4oKN}lC)50_%_|--cd2ms+fP*hdk#`adBJGqD4@Wl+CCf9%RE74cmNd!bWaZ2G zOF-ur3Mx;d8F`o*$&;7R(`yh&tSOoqJlWLgUH~>DjYIvMvy9arVJK3jNik$`BW)3~ zWw^#V-7@UEg*TlE0e4e!a$ab3cY1t78I*L_t@wBZU4lhWfF$LL4T2vQPoHD`e7_70#hFsx60p1rZ*%X!uOpc0Pz& z-bf5h8hpxxCagy&wH)Zk2#(M7y4FU*Pn!n!PJ`Gs2VXdJR}bWQ$YL&z>3KkzM1F<>}oKCL=qSb^|NCN(bJzD;AuI+m!UuQR_+c|Z#g)xX&i16NubH=Dr8dS1otZ!ptTu**E@8K z?&5R5+7AK1nU9rBZ7ABX-3<_i>j4baa@(VGHOpUFkcP)j#;a z)mt(iDcI+t`v_v^-D0mD1|p8fc<*;B#Ev&<*-@RzM#r4aR@5O=)3t2i!!`PmJ^bs1 z`Cdm&fuB9#kA<#6h#pu?M}$tAnmbwyAkU{is`{Yo7*Q~kp0qk%+U+{1%v8d(yJ*QG zsX9jEv4MxM_x%Q1Om1!HG1E72CPH5#ptJ|hUpOmR)d3TWE6ts;!8j9pC{x{07qIR< z=J#J$SUkc(Vz)=5MovXZ(sZ6ZlZ5D`Id$LB!-Qqu(liC%sH-EpkN&+E-+rs# zpLO5wy5E$K{zakR3ZJ`2jjMLgfEW4DiHHV@Eg<4CNV7AiNVB1773DaUbL+rmtkNbL z)X-*2{9a|23n66g?=wr7Mfh2$$IKf}1QIO5LYTFLovZ#Zk|uR+$0h(9gaHV z{*78rL0Dj{CP7nW(10@$*}0Skt`#GM{{?RB!;B6%?9!lrBjmRToS^vS2uu?ojGRL7 z`VgMN##>P(;>QA3?~P}K5jRXLP1w+3@IvTFFY?KZtbe$+$JyH{R-a;mqi|u%|*IUzvl7gNTL}8p3_IiEI{P z>fpwPv|j>8Q5}%88l~ygH*N4YFwwL=ahkb&TW_HC9X-$BX%4Okru^mIc@a zK$S^7InU!Jc${;w%5&es^RsETiLi9*fpc0t@*@$_(G>muqBky`QGU5KVY;gL6H`1u zp&p00f)}x?apvT9gWFovvrP2Ye=>jm6ik6JN$Q(`uwO(`x_N6J8veOA3_NcU@v`}~(qM+53J z^ws;pDRrj5(nh|2Ru8L+ZeM8R^F4Yyi&ZPusU~0X3(=1gH!uoljqKg`L z80%C0Rz-bo%Y63(T1d~Fg-V@8rt&+RXPt6oq|fwKyrKnaG7QGJ_b2S_MQ}sayVXfR^&+B=G?{2JF)InD z{t457&L2Q`rm0c-o7ziXi#I$f`!+ps^d~jaVsMYqSyy1nt;QcxbASZOF8&ITk3>x) zoo3mebKGU}M{omIjeK@+@a~2QqymLoLKc-mq~(qPp*dlcg^*a5E{roTS#|0MJ<+4o z-??iwhALuslPS>gFz*-vSA?;pPR!?cd941HEyWCD+urIGxv^15OslfYi7^l@XsPtq z{2Uk9N&|!cJ2!O1y4aM<0v~rI;=u7}PWl zRUgaAZ=-11vOPwP16qJvYE(duc(I-*ZmF+m-xv;SZRbm&toKQj1_COe(BlI}vYaXGRi;T+J=E0Q%87!EWl9_sxnDPYf8 z`H^Wh=6Nc$#vd50ARb*WSbi?w|ts#E?eoz$<*Q|CpE_Km4B7({Rl-;bM1NNMKzVvfyq%5`RZGpt-YHDb&3 zSt@nwxfHfDij<#q40-`Y>(2-)gF*6VCfY|EM8`T!;s(W%MJD3bI3jElaz%IgvfCXs z|JtwG7OD8hIyH>t;g^ymK-6pMKKon3--aA;ec9RGd zK<*+%rWOpZYTEQL6>{szW>(m-rHzi8vGkHwoR@U0_Qi$Y>EGqXDmQ-)#fVEX#pvm1 zY5cTJAgubwZu443YK^FH-c*&}vb|n;_sa!2MIhd)jTv$JYAGb>S2K zc~3vQ>nGLXtD?&h=ltAU?{zDe&&Zy*?k7yWMaI7jBJ+uq?9F}Ae9`t65gw&e!eo+v zPRiefIoI=4$?Tm~g(R#$G!ya##@^PIYmG;18q?kt3L^$A&v?t<6-|4{e_?I%P3MXz zpDN*AKTdVNW3<-eA=NwI6AZ*H5lg=No87E z7X|mOXpJZVKc#!j=!$O?hcJ8Cmlw|DALK5+i+V7&H{eM#YEvs=AB|+Nmmc^oU}Jk` zan30r&{c0F4t>aS+C_}kxXDkI5%9Vtxy_69@UjtKm*<7Iz4^rz?lnbyRu=U{zx=I8 zgCqlGg2zkF7Cpi_t?Y>Jj&iMZu(;W+JJ^_*7vm0P>6nK>v}i)SSzx~MTqC?`WYh7E zn?LJ^e@;h)`nZ}_f}E4gq&TRqfn-K{=#aN?6y7jET0uW7wSBsB;k(QnuUI%!QqKym z@66AU@5~vt?mueJ9K+B=Y1vthx3sl9c9NtSugemw_Z9R)I%_huxGg zGngK8Qqiftw-`UCI$%8P|63}w*~kSOX;XA0Rucn{yJQu^&vk4mAL+QZP$UW0WWb5B zLu2M>Pp=yxK541!Xg-J;&&+$0tBT6iJ(zUk>Z`VKG25dQMVR9@7r0>(*1?!+?WIz* z`|6Sd?$WIm@OgqNol%F88T5zW^rN<6BbIba6RLoO7TJ0IUw^GI^$VI4;Ev6gX3gE) zMiWY8=SdM3U-$pvIe9KYc`FP%lq1~zNoVVqf_T}OF2Qa=+O2#1>QzJ79{w^-g_LC5 zRPmC4z-%^FpXa2yBp-OX4=kWG<SJmn;yUVc}VL%)&C%^PUb%Qk@Xyx z_D^>dkPzp@%q8#F8HzU$iK9UaQmdz;EcDS;u{KZfU!_YNx{d2#Ea$n@Dj}DLl%ZS$ zlH{y3*XOTISsET02PiQG1Krw1m4l^C^TVYNZbmR~J4v3hi#2r~s7c>sD9ZGgMI4o) zziSFHs9b${9xlktp_LA7+aV6eS>=ftO-OJ3$tz=bilr~f3xZ0<;ufio54hnw`BAu zRWjrrDM4@ib?4w$-N=AM-a6{6DWDWhPGn4doyXkA&QS7v(8)x$Q z&s|Y_{**2(>FG2zYWhWacXsaR!hJrmG|4MA0TQ%u3n1K5)~4qip_dGLcGFQGz~$tn zV6prr<@(#Hkg`B%)ah#2ei_(*&Lk&4&Mq+LYqp5APsHlM_I7*0-5~x{SO=3z>ftG* zX%>r$b`V4uBZv)2T#+$>&#odEBjxg=T;VuJljXHkj~f2kWfzS}@X!?kMU{pBhU?*J zQ89Vp_v)z{^XwC})JBRZYUCvosuI)zm%XuMn-#6lUt`v^3Dt?|JIwFv3dVj|!ZhuU zI{9UKPLLwqf0pm7j%@oZHoJV%cObPuoHePs8@|>?2An51h%z16UfTL5O5iTwbhv#2 zT%1Z(RM!MyHwaKo*+(J4RF^$bXZ-Co5wXRGB$W(@%w4vI&7B% z7d}jq^$yg*O7#mJ=IdI$ST>$JwZ!L}oe#v95*)(g^U7{6;8V7(sZ`U{P+|*mh%^T- zv?`_7KG~IyXg&1)9pPtRa8BbW+b+3$6IEqB*V=v&br-eKuNMlr9_itXo&m?oR(b+% zoojt=_7njxdloKl@Ha0wN&@-C*W?grJK2vdUa^zr`hYpTClN^e+wkA>ikylI=79Kl zu}3zG1_TT0u5RBKN2otBL&|B%SBd zT-JBye7_KS(3%Lmm<&<7};$m9O_01$K>#U(j^HjQEY;0!|P z*KtNr&cbds?VmZmi>RrxDtMFOc7Mi?D@Hm--uQKSH+IqGcO&CZ2z*rn<7B1`BU#?8 zdwF_+5zZ(AU|J0d%fpdU1Mrw+FQ38RD}OdF6R!bxAP3F&LQ}f8@1n@p7khOCfyN=| z{*Qb28eNNEK+s!ifHKz)TugZAb5VVy@mV0pBy`UH!Fc}sp!^K~=Jv17s+aca!F=l5 zoQY}s<5(gnQM41_orJ3EL-%f*ianN*%*PGnrn9 zW94M2yaP_syJ``1)|{aI>pQ;##`u@o-y1&14SJ+cDF>kl&0_owZ3wdCsup?BvzzIK zw4}Sfg0t7onUfsQGYnQ2NhJ`t@ZIvw7uD z)`iq>8GRtcw+0q6+VHU2Z;jJIZ$>AoQd;$sjor)6W-~k)b2y3kEt!yusR(=$`Dy3g z{+eHE+P&>y=L&dp@$xx9#>LeSG7{o5Y7PR6+UvnFx^<+nr4)$qXNKu^vDLKnU!niy z$J$_tUY!X`+IsK;I&5D;>)Jr=?VyN&-zWgk@J`UtI0Sm{$(QlFxvDGr)yH+KolJ`d z%I>N*fJ#t*ld+m@*rLH2cM(-iqIx>8H=q5g&4JJ^pJzRu+H%M9Tn)h5Wq7(9Q@)m- z6JoUj$xB83W!pw$Qou2k9BEEctUX@cU{*CXV5!~s)BiCu^`LIH4NA%OFMAqaNU7Lb zmvEr3P?$t{#D}7b^_&$y^a`JAGBZIt?-=41wYadkkH?9lF>sxY5)oj!1r0MnKJQJs zdX;wDW&4-0FZcQuez22g_9L$T<7-Xey5q>J6sX~DPEgN6{+I5<15Xog`~Z=Gp{O3% z&=736ZX#-s2xkA+)Zp!={QLv5-O|F=fN!nrZ}@|DTfj2bKcJMe>b!#OA|QC|TKzIf zxnHnZWyS8)v6_UH%()McztV%z_3|?z4bS}fOr>jh{#v>+mF=~-C9;~ix-!b%>_hm0 zZgy&JXox#TV3f&2#3exKjrJCx@b>K%fD6T?q71CSELC|6$Gwv*2~=wgFI!>f*pt-u zDq)P*hAIV!Xn4r{TDIq-x22oAMB?_BK+RF>d%ujbgM<-@C+)Jb*Lvnwjon=j!t?Hj)OF3OW{lx!(Jt1|A`$%KP2X)K%-> zFT=p>$MHT zb$*jRr-qK#r)+=Cc!P_6K$f6}F#5D4tP;g^%b5jR;C zPho`Wo<|!8K8T$j>zy1kYB6MZO1&8<8}&LAJ?guA-EDp#TWEm(tLD^xlMsz^3k_1q zf{lHB{W6Lw#H3PrUFdT)dt6qijs``|)M5ok(p+M%t9&=^egT!>cOYN4c-(y?Zf_g? z7UaP_L=vK=#L5{VSL3arWw0rqfXM&N!^1{-d}e#%ej@@P6#lxgN#p?5zZuUVP0HrZ zE(~HumoAuJQq$B%_gwhALnT+mT*ZMU->Qx^k1r#?+v_T@A}V53B>o!!)>$KG-OTl@m;rNp@gG@SllyZFw~=G4I}7#L=*{(5+n>-664|bHvW}XOjng z#*!L`vA<-gAs2biOedMEem&rj9+#=s*6bg4u6s_GUy(L^lO|9<-A(zD`;Wb+S<+fe zB`2IOLlum%K$;MkDKqgeigWd(pa11Lyj zB4%qM8vV*BIN0o%wSUjxvb*GZdeb1{zEoNHFuZn&vt%uG4W*4^9%?#^g%-7HKMO}0 zw3T3;cnVT!v5eqD2}tFr5)@;2vp*Yi)bbVk#0B^K5P7-nG)fZkIr1BEs*@Cb#T8jd znvtXLwfbd2UgXk=JTtz5oQSkDiVFgzRRB8cLNpD(HV zz(+Rn^B3)2`@HEN69Lj`(V)GguN(HSnR5KEKMH5jFYvBh{F>W7i$=*FoEWKk<^a`xnBZSgq%hUZ=6HZ-DLe2HYXuS2|q+T z4cAI~{dThZBLL^qh?W|t3FXAtO4WzY$b*9n=k};QQd)a5o6W7v=yEw!^B^=QX!(?L(VJ=Xo zq1DabgGwKfg-K_*P0*N@kDI#P3X1s4znoLX>{%t&b~H&$egjj3B(`g`+&~>I{=Q=y zX=}P9X|*Hwj6>5ORk%ph8L5QVTAWqn0H0xtz!bZH1j1zBvn{EjuZjQMyhO7OXCPyO zzKtk1rz&R zYf(mD;V_s%yHR?wblSA5fQ-h8i$sMWI}q1SlKbJBPTc2^;WPBs8S^&LwBNF1)vtG` z`ceCMIK~-;`&-+|KCePvTzO8E09Sehph+qWA!tz|iD#wWO;d zFC`$u$Z@k5(7^Or1se7aiGCl$X2@kw&zS>Zd~y6!$tCUG>^-ZsMiqpW>~J-iW=K6k z24+F)QHk{$rR*^5aPndhhf>q~exK`T;V$QlV3JNIC|4NLJ6NiD(z|N&f4xFm!AX$3 zps`0M6pc5BVJd^3ty3}_a)U0x(q${<1SflT%=q(w3zz%zL9eC((ZF_5pwjn<8BIe1 z#xoS;T~DvN%L8e|l({w_P}(@PWSs@acO4M8%KD0_rS!%RVZ*@Vg5?-FS6Gpq0`XvH^q*nRMA0R+u&V}!9XKnA<>uXehiHl{j8W=P(!?31g@e+roXY=d`6}o#zw+4< zRH~&JJMrvp4GO1{8iz46ry`YaBb9CYX}K)0zgpxbXm*~)N94oKX&xRjaY-SVARPTU zynEI2#0uNXZAN?Q+q!#oVuvA2Y}m_=@x`y^u0ba+Qwmw#x1Fg!RVbpU`u99_3Wh~j zpqh4m)7QG~3)?kbr-cOMIx4K(<oCOamm)JZdrq}GK=3>5y; zPI!|!2H%o(i=ftcqXz1&Zs>7_cdk?s3e2HY4cw!IE)XXJp2zX(4e;t+IY{nk(|AWo zNf2axMq&iBi5r5yxRdr*i$;!`6#-$w!D*Y=3ZBt>&KZ?s8y|}NwU9p2}M3}-N9AX1m8a^1X;7KSS5@O6o@5i>bNB2gdv!nv(w5;t5ABCM&Jz>mw5 zpSx{$!3-eu$#T7(K?nC5Dbf}ZnAs{&i#wR`^>kTls*KExTf5u72Yc*&JQ=MlQyeS* zpN%OEpQ{7hj^{`;I74Igr@~w>tR9R%}aE{ zeM^z;;aa{1#p-TIrq!$kskmpHglE?6YMz-T?e7I6ryEWy;?OKzgKnmsKy}6ThbiI* zGyjR4t-d$9-W35$%PAIqT*Ldf5$5WTwX(t|hwAx6u1o^>1urNY1jB!)B5pPY;ALPP z&_am#cw-`}@kPT&t8!_^KO4-H<>Jbfhoo{b+RA5!0EAx1%MI2|4Z-?!s8G@sYOdY4 zX%chTppEVv(Qri|Ic@EoLI;-JetkIJ5%4Rnir!k8i`|uN&_Q8sNB%CEjc827D`HQr zX$|Ad1T)K@FID9vz+3Te`%?ym2&MMPmf(CGKosaC!c=VYxyaSK1L{m1lfZ8AFBdga z>d_Y`*>ER!O)>O4NT(ET&$*m18F5|bQ*CiSc&l}I`hrHh)s-GvCS0?|cjaH;+J=tq zdWCtV2RR4qr{32$-DC=(iL>1M`X7~Ax&^3KpfDVyXqSu~O@<{MutBT=WLwl-&zV(w z2mbUoghlG4r_66f-0k6mNB1ikbH5JCYl2_DEp9n~n&$)<#)&*J5`xDKLqQZf?LI56 z1eMM$_5{+E=SD@kLPe7{X&VNyO&KI37h_oBOKogH;piilb3t}fQ$Y?4(b$s<3 z9k9La@5P-~@Vr7mUEVtkZEZo9M=pMDy3A?t(_+yUAWZn(?SR(KOB$m zbv9BFEvNGRS?3lHFY;j$%+g=oNo)NfGgVcIs8vYUqv*Ii=9#8$qzHPU` z%-WTzka1T)wj3YaQW^q(>HxWTv7bIFy0qLp2M+m}oBaJ`XJEcs01WJq#7>-GS@C$` zU3O>w#XtKnApuqd7QW0Fo40&geh{m^bJ(v)lEM`hIT@(ei^8tX&~DIuRHA+V{;r!>M}o2wE}wr*ip@4 zoUDdFwa%L`>O`PItUXw}WZ*ZUwVMRWnxZcR5P!og9Vj_V7a7o}80i)8)sL-``5Ri$ z-Am~fkM>>!zb@5seOD7P@|TV@6(evbRaYabVUhLB+#vM0%$n|(CEkINp(rb>%9mF% z*!Z+a&u7T@IX!0*vgIl=ATr3877t(8G^?(auQ|dL{Bg|AdeG+PoE>!5UPUy3)A*FV zpUb@WqV(@=XInzwnZq;`UnM6MzX$wA8sqGO{{5+gxkHoIJx*(+ET7xbPTVWAK9`EB zb+vgELFK~Sh3z%)<>Bq-@7v8jn?=s+^9cxqIv5mG5I6wt2LT5A*rxQ8*P*X|0m_s%IbJtT3?X7Y;a zGb&o{($sjYKiA;A-0R36(AWvLQx^MQedGIcn?s|T@I}BSk)%4U8uTnqG#i=qfo6N0 z*X~c~(((Fr)nSAYc4}4j$%H8grrnd>G!&l2nji6%VzKIN+qZD#z;F&LFv%bvprQDp zY%kv>&vL|DO7o1@=%3UR+lACF1-8=b8W9@$?}SwEpCtZBTag%$1l0mb(=-CqsxtM9DE=Jfy|!yo@7H^*ybmD~~DKF~44L~5 zGb?fr4d0J3-Xqm}hA^UdGZ1_%APzh@F75KiCGjiJh;Ny+UKrsdg6L|p`HIY?d(yW7ezQ}3ktA_pcltU532{1+5?L?2O}+rTtY`ZOKxKna=;}I)`e4Jj3?^bIaS+)$eSmduy~pi%Ue; zHu9_Yx&tuYsTv*}Kxh01zo!Q>^Z|-4AnYQT3Swc!I+NWq%1JX2Ao{S`rb;gkkKCC9 z^?hD~GHH@3+oiwf5l%hmAV~|6c`Zc31t4ZJXHu4chjqnym%SgaJBILWtr)hDS$qL} zxgR5~&+Qje$R_^RQPiMgL2$ssP_BRQXWoxbQd^t>zVff#m|~6}9r6>DfHEC^d58w3 zNA89}Zm+EwMVXHh&CN@RZYvr|jGZGeEm2`NB5$4LP6niJx82^JkCOZ#|P{up&&Ju0tc znIV?KVAdvTg-^HH6M}#7gGt!5=7~c#xQ}7gYl`Skgg0)Z_}iVSbSG=vjziROUo!IW zqVJGYBwTIE7BhTi#C1-AYWwzEWC3$C2R*C(YeFs-wbbzT$46`mgk#m9`B!zxM=uTK z&c|6(leeQc|A+OQx0h=+0F)W}GL#9tkYDEN@L1^iZC~Y!Bl~-SVV;f4_b*mr2YUYuD(?vj^ciVdNB!gjC0xGH`E}>w<423NPJU>j=qj#OV~r zFhkGeG**0362?|VJBuxgUX#9k{<+)Z5c2(uS4W>nUoU7bKtcB(xy*}Sxm(bDMxf3G zG7o{)2J}Nke(+aQwLe1O=wie-CVE($AhoIxn6KW%2$f@*=7KG3v7|X6pjVQY$4Y3^ zdDgmcxOIqRvDlzADD>@4vs-4!+2}+k=H|@2_Tz%t?_x~SX{)ho)x%8Zv_H-K2K^6Q z^-Orgvief4kbjj2RB@*Zi%aJ%k!Ho-8NcRnu>zwSQ_IZNbSvZmm}gPVpj}sy9x%T!X!_ zUD;ly+Y+L)i2^Rn(|DLK9Awdq;Nl$UWQG&>!zq2Q8zgwXh&*ZfIHqE1(|Re4_rE2^ z1|&Q`rQLNV<*?IX1akI4dyi9EF0Q?B4eIX=R`3R2oU1T1zUdF(Bv?3=6UereZF*cL z1^7VxHp_qKjjNRYIl#IY{Dw}Y;x4o2kNAlntuwp32UTdN`^t{}2xVpW(JHzCu<@#A zWT7oydy)$yCo5A#u3D10UmvZSryRZ|9=#{~r31So&>TIdQ&G=&%!zyn(ba3PYO^st zP=o8(#7sCGHr@&Q@`KHX5;fJk_~3MpCDvQFl}}uE9vX%e*ObNS;yr^j^e#B(D+^8@ zn49QQOr*Yb=8$SL88KoA$B#Fv>_CVsCI^C<;4zwAS}$3kk4AKdqm9L$uq6k>sDk9^TL25D4!)`_hs|k^)2dDH?EIt=-GQOp$|ppN9G^RPHG1~S7cLt(LK|bQS^b=D2C@v7 z7COW6$H8tj@~t$EEczyVi&}cs{=xfrOl&@aP56Ju(H0t`ac4Cr)i-XK23mdRq*~K( zO>rIv*qzq-@KA9gsx;H2MXld{!Q;3c?IpICvO+P19hD$#oYqEMUA6y?1GXaI?_~AQ zK#+o7nx`8eX}`FCz~ccv+r~;d*UCj&!Pz=@Z?9?H*Umj{Vtv&KYcGHwqR9v&nIBC4 zA>xM5Z}_TqWM*9qqt{#A?h`R)f`k;13;5;e&J;Q)@PsV&3ZssgT1P1|QYG=PWtzPE zLl*c|%(+uhbW_a^-QRdI(nurw&D888-qJ9TtfW#@i40PtI|Z-r9T&XM4K#eourNx3-WV#wZfjhcg3Wik zwsPN;@HKWuQDFxc1jPhEp9d|1#r&mwR*Np(aHdc_ZPk|t@0Y9iI(q03 z3}h6dN3MY_)wqoy;IVj1BYxBm)Pu$*$8UbqojZ|CEv?;2i|r8iat4FNGzwh5vx!TS zaOA8=RgEmZmTy#Q&OiK|nt2c9*AflmGZ){W91w7I#4Og(ESBLcRy>|?Y3L=8{>c)9 zp!fqw#hafo%_V1ctrvZ;JkigMReX*5`_Ja%X_1%@;%ayfyG0Punnqi=mkQ5*{LsZT zwp0u`UH+C)a3Q+rRbsn(($Oo$!8Kr-MmyzPn`*IKzDhR}S-rAL_cF#*4%Dj$>Uy`5>Av0+pa>Q=2O+v9m+5!VjBVS#a5OF7W*knfERc zdd1H!St9qFho1*0cjOOfyK@J7&|N_MzN9&}Rz);8G})47@2r&(MfcoR~O3bl2{K;H0!@UkDCqPA4qNqXAZ)2PzQ=bHve!BNjWJ+D5dLK0rSl@lNE zQXpJvgJ}e6gvaT41}{!iM?E20V*-(Lyd}N5JuYx5FXVVdC_k9{G%Zf8#UiHuBOkpf z!u|v@`X}^yP+yk1cISob=XDzgcMp^ogtnNe^(0fsl=8uKI(zk}bp1yND#Yxd?q4jK zJ-#I+7y5}ZCE|9Sn@EdbIrRGso97o`OP;Q2UbkoGQ`HlW;%bHt{hxS|H%2+hgmV6t zb6~A#M&wI=T&#)i9Ef5Axj?sP)I})xw0%sR{J!FUa)1DM_}~sJ%nCC2_{Wb9X=8h4 zPNEpP*B=t*rOnknHUA=`Ijnj0eW`)g| z+(VW-Y7$&Gb9l6R9UDBq&NqH|yov8QSp@6`VNH~M8lg5ZGvF2zddg+gy-u@^%V(D~<&CA0ZwUpJo-BP4JeDEXxl4+QaNQI7|}MP=yHuZcej#6VY%^U67%LrWI^lYLi3HdO#Z66oG;PKVjUZ zrlXsIvEpn58gV}S zova_Y)|WZ?nwQnX6dJv{!33mN$S)x3r$@%atqbAT_A=^V?I-isu@UIRcUXz$P!%_) z*9avo4wGx@=s4k+v{Wmmt4ZIfmOxyt{tUocB*;R6=(Slud)F}6DBmu&3BuI1+JX@T z7y!3Hn2HN2x|R>4K}_2h@4bv=2s3m82vP+oe<|O75Wey5{7Z5rTGeB z61d!gJz6lXMEz-s+e}h0-riRub>!H43;u6CWsPY1<-fE&%BUD@B@<%;pRGg(&p~iuBCSaeHZ+*H)Gk{}JmWn$qG{G?z|P2zTFnBjO$zfu(RnrC^?; zx_T(6P^waeNPWtYqi+0L>XhrLWhmi=?*f2SJYn>5;>Y4-FVSIjvqpi0|RDcasQ@6TVtD$n#^ z*71V8`oXAIUWzZTmkYZC7RYsKnuW&Epi;=HZ#fpxVzJ#RbN?&9A?I?&FDEY_nJPsa z)}@|)NT?|q=qh^Na+@hmUxcq7NCM@pOX0)F zSa`6|k_%{3=>Dxa{o5;RccYMv$Q!{I6iuI82-R1;V*M+3kTExxGU6Hq%}3&^+eCewj0Vu zs`}(0FdKg3phNnGP=+YOiE^zv%fS<8!LCw=!)c_=Ys)V_V;cjaY~`k_AyD+e>Q%QEtU+jSL#?&n^8mZ=D|KnZ;UamCzoyq83o1>W)| zxT)~Lkz4XN{WR_LAgbg`S=3}4cL04E1P&JEA@%Fk!+T8i+>>qgyya-u)22Ml4*Rw2 z@6CI)WOx(?TLiTVn2zBu+gOpfS4y)gxJQgbc)Xf;6`8W;1TKrJ-)%9Bw+K2NH^S|Y&!%yHl zcuYGqOnq=)hW4K}YFlz%P*a6YmtEoQ`&4^^V6=c2bM<66?5uOOI0S~lt2Fa7^<-5r zPYNBULtdsb+3)U}%a4lc%XB6Y#8^zptD9}I9zDF`-El>h3bpUarp(olG%Sh!Wi1LR zquMZx#(WHkDSwGbzE|T1%(t#HSP$)QG4M>l zU1UXgaiq_3a?xKQo*Hradim$J$;npC<4g(|K2IVe!{b6&u{}aqs6uqXd3WAxt;9T9 z2dRlHyY0L`&ew4Y$>~4PD+sXLacM3DFAsjDA^d%&|5;igOO!4yJb%r~k>Iery|2dQ zPc(CbWV3cltMjxA$x|V{;EkNR=RrbXce{ZWoj~*0F2!Tjnb@Ld+HaJhX%4-I2*$~9 z)v`MNcr9y(Vs+q8pZAu2kgQIuH_2;!#4yitP#HL|Lnu1V2)~}g zn`+A#+(VM%vsrvxyGs^E*6`)+OJ8i6>O1wZ&e1&AI$%{oIGJMTbP=m?DPDz_E!;%l zDEG^_msi{pv0p**(;?rA>16u&rWm{4sd{MaiZK4Vdz^JK?=M56>ONxk#kk0eKk{+W z-A}j3yGe=7s4x%Xp*%H)(uoE<{jRt(`pxxce}==<+MWKFy{~P>aQSV!4RIkG7U}LJ z=xv=3253$KpQ~M6tv;>jDz}fJx2~`vrBLCm*%k%Ds(cevv*E%HM+R*L2 z<#r0%?k9cK(4}~WfKR%sLFz&yL4~insoF_pwQmZPHE&pd-!AS=L90Qp&Tn_^uZ!;; zv$quJZ<#mmXEy9Fmt(fB7kg-cO~Y-sy8nu9t^h3?bC8xoi6a)U8%uzMQoQ1HyUU|Q3r%s>mEg+x2(N{y!UY$nXL7zosn|XZOfIz2Q zou+C|deD^hGS)#PifvS|p#vYDm){OxbR*}U^m)|JjdC5X>JX_TMl;!|SCR?_N%^D2 zG8{^OBKF@%a+qZ&PRginaLwCr$%>dSY|C`6E^vTs0%)4q>jCv`>}G^_=yLXenj~Dv z76ElXhma5UFGg8%?%2)01SXUmLQhl}I78%=z}jr`CKPdMJP+>_^64mXdy<}ZPK0## zk04s|PP9BVIMD$$&MubW6}623*$^8H-%t#JMwGRfC7#y4BX&3jr-kpC(Rgy!oR%CE ziK_J(PsXF_y-%h_#SF?=-J!o}+bCCoOo{!H)xM-R$yRa_ju@+Sm(i6g3v|WPM_8Kn z&6VE_QrY3hXoIG;Wp+2$m#5&9}CLY9`Kh2>cc=a~GOD$hOkGPRYxHw=RR zxf}}-g8TAgq<3eDn@8YSGk&@LcnAJIDy-2=e~0t$Jg$LXqU1)YXng-aRE&Th&4&Qw zMhVPvTcizg#+#Y3arJ&ZWjf5TN-3CrxjU+?=GvvSw6x`r%tt_;&F}KR2XWmaA>Ur6 z%_0AJY%`0;HfE_s`QjWgyYI=T_acLTQ7XM~Kv<=HMat5y_(!0QcKv+t10DNLq16w? zJt6|ewykkBq&*{vkn0?@scOPjws-E|XP}(_eNi$4ll|JvE@nTrlq{zgwye5EZhAAjYuOF zBs|-=B%{CYJkgi7itE=BW#;60lvh5^wG=o-{iz5;R0cI4TA`*m{7z<$Xbm4QV2iR0 zh~IH~(A4j;!@UX3CWV=djt{|DR?wTj#dYZAo-}+mLvav+N+DQaI=W%9uZPziL=`dk z5HFam&CjVyvA8m3n8v0|AjnTw7N+n!St0f5y5z7DY?%`|9+oSfSMrBD7=~FQKA%(x z_vW}Nic4E_)ykg#c_+pdLNx4SMpsDUusj=SM~Y>KQS+13(#Fwi6&P_7vADePEI(O3 zEvpFpE!3c}Q+41xt&%z5%+n$WMXfmbDC%ZMcSm2^pBVUO$YiWbaL|PcNnDe-2UoDy zbUN*0<$zczcHaO`*qA5WW3T2SH(Q9JE!<+`C$>75+BnL|WwPF%ykTEO!@f}W8*;8N zZQ7Y|@W#8WZd6eQvLJb#j*qHP&yGdT7Cu_{pR!5!RkCUMd{MUu=vDw;tq|lVSPv_) z^*zK)RIn99ugQ7)J7Yf5uDp6&7%8~v|3w-MN~mH6%Ria$i}=w za_oGFda1)N=a9Boa6&wMW4_gPGj4G>%ye-_-b<0Z^W%!75!>n$oqhrDeM~jx_0wVa znYRmSZI(4Ck1RJvb!r;MWf!!q1msM|?+sNVB#i)9-EIa0)BWOWM6V{DEqEj7L}|g6YcVT{t*M=2jyvF!C;UTK+a+ z{wC$Hh~&#(RTO%ZYb3v2k0_J6qXe!FS;G$-)g_9z8dabc$*9t>r<0fsYG3);0|5z2 z5})M!%`PYhFwhjq;%MexcFYqAVVljQSy_;uTSrVy}_6tdBZU_ zY$%L=NO-SE4I^GoA%W`VUF=w1Ga9d}D^mb}jfcnix423xP&HKyn~viv1r{ovDjPnX z^$zHorI^%n3d?}3ZmS_q<^1Jx+m%rw=_#<5Av-wPS58IMi{mMzeWYNWrWzR2S{R3l z&CdmFldk?h!dSv&)jk1^Fsh4P_K>&caX87sUCb^f?uFKt+v`&ZoHEZp&XS``8+Npx zw6&LKfONbOIJ=q=bXJV}7laN>RPLn?Hk9v`cC>Z;5fS3#ZF(sR&yL)QghuSRTc}_A7u6vBpGDZ8Uj1c1Wvz3NYS1qPJCT2kvW7T* z!J#)X>aw5rZ)#s~2i}p}pz}Mgz-xMnQ!mv^kkMSy#r0)Xqy(FdZ zhL>4peX`?dP9Zo$qiWayLW(Yg|Fh*_=5L4)mtQvOGs3hYkMPrvy9!I;3w_~9DYm^s z@BL_)pW-4GvT_lJG?}FNUsWQjh2E_x`JXlElOxr`3Etm+?9RfYn@)+Uk#2$Buen75 zTN-<3*x+Ae-eE~Ng6J5x-2%EBfzyk+E25QrnTS@~t*YNPu5ces!CAZ0qdjI+Ezd_R#C>;O1keoX&gkD2ab;5<%PLznmukWdHC#*xJhL%0|BqzU)rKvI#j`7^U4JCQVf^#Nq=TskK@+I3KQ;ItbKyVbH zaK?q1n6hDse+|`=eZhh5ilUa&8@*(ldN>LAGMTzCSwrL}{~yDPgNCTHo7C5>v6(&%|H3_g9$IITj-7m1!3h6HA?S$R zX*ElQgA-jPAapr(KkdhZL>JLMp@7f^LXY(M#|l0joIy zAyxu&nZRTvAjwKVe3F1bBmU@_Uc9)1E-Ha@KY{m6gimEyGYJYKpfNFSmrM$ftYM## zGviY>7H32++w=sbNePa1!qkw-D$z?eJ;JvdKGph$dLxNtix_q_c0kx+HNThSa*m8A zdnj)#TxnP%dda3IRqb-kY!B4Vb|=w+Lp;Cf0> z9GtLgbb`0W1ohtA($;=G5q}Bqo3=8`3^~^~yi>c*-XotRTqKu#@bq4?70;RJ zDw%PK;xLvm{>a=zd^x9{wh?0RptS*9sv^`LUOIHG31)=5d;-t+1TrRYzfV9;lqkKF zSgbhW=Q!dmO>GmkY*BHy5d00)HBDV7YKc+pm!TdWX2T;_cKmUvP=Z-S&sie#eFAro ztXKe)WS(!>MS2C!OYr8Ntmy71rYKc=L9R3I=B{IYR zNYt`L-ElG>O}+X2mYeko`7Yhd1No=I(N;n?HsMP{BZh*~mKuJRL06EmR7F1lblMxE&89R1ln`cJs(`IfWn z8GpGoaG(cr4HL&t$=WN#A?(>QQU26in(w9vZ}b#yiYdBG!8J!Kp!2=^kF~zB4zl+i83xp*J+Kb@@LYXy)Z{isq zh3QA?bf^gOEyuRArvK27%`&1b{gK!UgCq_3&>L@hI_ z{ls;1J>I^W#of=p`T0tC_i()1^&A_le-pQh^b~(4c%&y|-Rp^GUxoW!q74`X6S;3Q zk{?XAk$b@)%f#nPj>Q{Goi$E*#4ah(kmzNL&dy#mN<`g0+-RdC-KPgP8%QQMZ1B~? zRk?f--dH099E(;pr`CyDwy1a+jL;)7I@C2B5w*mqy#i}FW)ZLQ55*nTy9N6Sgx+l) z9|~WKCHyCeT|#Ul*t<3Cot}i~gs5dh<@0VE3}W6P*3e)qaO~MSapU6B+7utc34)X* zdu;Q?n{k4d`Gmbf(x#hFX>;T?x15Zh%G~_cId*a#?yu1?zr~-r`L2-D(!IOqLT>A) zt}?M_!lx7gOE1rN@C+F{3x&Q9<;#c@3o*JPn2nUZ+0umQB~71tJx@RynV@VEG_f(> zwb9%dMPn#)KwC*rl*Mq5N%2mLHpFn{h?xXALE&JG7BKN9o6jwxmveNKILF&aXOiXQ zkmx0g-Yf9A=q>b<$?ekA&F5)?r#@%0J@?zXi<43(4pAxlfQKeJ>B|`C6UBfa_ON`pfua*Ks z%BxegxYflzw)d7$E2a1iyqTRlN`&5z*hK{YV($Si;!VD9<7_mlgAjIs+Z3{5MZ3$k2|oF8{Rk8)h7t32nr`<VjGhj7LZ#X?U)H z=tXj{#It_(T$#}8q+w+}abLm;IeYnOEM8GQp%aUyS3d7mJY*@_&2I11hV z;$?kZd9O^b(JV7OR<47r&MW2pC*O<5%6$=S?xaypq&ytayaIKCZczSspZwGC*lsB| zNtEFYb7*!PtOXS&Jx(&F9R$w=ZAfOh9H#TS945BQVMFU|75-iVyI!hLvdn`5JqmFO zO$Mj-u}-dvFw;#2S6B2pl)idB2ffCf2&L1aag%FkbAuW=IX0n5=c>(-M#V<2Fvw6d z8JunIkP8^d&ASYA&*8Qx{TX|%gtqPNr@a4kyOmI1<0^Iy5Y_@ov}C)x3aQUV%KF)b zH`r7Du}PN!3`*xkvJ;RPI|$-+Nt7!c`=F=%T@N+Npdyjg(>^{b_7t%zD=VAI99k7} z?S$NLq3n3OfbN3meIuXV2Wm8Kw6mq^h4iS2P){BW6%hr+A~z6k728&cSmMN8Dqdp6 zrEWAvEpMz4?PK}oN6Ty7AZe8lBlLZ|I}Ia_?+xhIe4#D$SCvly8g5C?=MT!j5S@9V zNE`dED(fm~gsk?ht)d?@f@go$KF<}WkyoZ6-BV+&#cel=w!SL0=Ct-zsi|e}tEg4W z;#X1Y+D0VRSm9*lj0I}Vem7Ph`^^)q6os4ZiKXXX5v7N|5!uQP*$fSlCGc3uTZK-U~)Xs?N@R9qV_ zxC2RSX?t{ZZhG(JrFG?xFU^8CtiG?iT}D*$rrT*mC9hd-Ad0$SIf5wamLBCbZ9u<) zW4CFKGP8Ex&^gzvoK9|fulIciMNl}g4(zbH- z5;@U*%I@X+oCg%<+_rKmUfLsPE8r!C_=%Q`FjmGWRy#=`G^Wl;X0_YKtk%s-*Gl^$ zZP?eHymYDD5Trvw&+7Z7+jd+fU%9QvRq};p53Z;^%OYG+wZpe;2DYk)V|Qhb@|qdt zp3Zq;<#h7Wjke(LztVQ=>gzX7UkH^tbb3Rm)IRrbP{aZEa8Sfs-N(N6ENx0owIM{RGft8Z;0B`P#?9IOy{$%m?ol}WtLOg(UTr%-Oovn%7-mPr`goWNfR_f zSBCVK`MvZFa5zM&Z2ZIYzDUK9>?y%9_7T0^1aSEwsJZ- z=~+2!NW=TD1=IYZN1;kxcKQ^m)F636N#p|YlC&t!~cjuJ4 zQ?k1wU8YWud}^T7(I6wjr-Jl34vfiSlo^x7z+k0Bu`w?Uw7wE5DchBtQ6*)&610Jh zPO%aL)GPfTB5ZfGVaO6<29K%egCVEPkR&mm+@wm%RwdF~GQty#RU(~0$@OGs4lr6Y z$3{FM#0fwXXsIpjDW{1IWzLKig6N@tsLUIpOMZ!eEL`G;%HkI7Y|dR9T%Y25z_DtX zbN8L7DwH^IVwF(hH3usp+6~79A=*%__iF-vLg%Z2z1Evn%o50T&2zc-vO5*e?Ujx! zXMjl@a2r9uAlrSZw-!rfmgoA}1gmQdH8Syn zGR!BFuXD9cwTM{e#E~q_@tX^0;Hh@v!KdW2i$fYJvX%)2C_B+``c_cliPO1)5|6mc z1ksMU&jis_FfjZ!h9X4g3wtP^^iUpCt|Oky#UY=R{{zShEvJM}ZZ9D2;?VOZpIP2L zMEq>I_o#}(yuZh1JiaPR9uJAnl8x<@<=dI4=OsS>c^uKIVLdBEInW1g9QT<7+4&G0z<^FYCu)w zO1uv|+v7Rb^eH?hBmgP`T7C%fT! z=laAi+-v7x!+$*663 zg9=Sp9qqQH-I)Sy00(UZ^2l5WrBN_~1;r+?3fb^5-zQ04p-M_tC4|hdY)o1L4Fu9a zLl@SShK`=WyMo3QA(}sg23=qJ@kS^*kJ^STUnQ4F?wP*aF-vrVa8DMHC^F}j98)D_ zyArgAjwJfTvFT!k!8+X=a>#tvO!x!oCmo~vQyiL4J}>|%Qwh3wDu*~z3HjSSXg|DZ zH)KRjlSnu1S7ecnfSl-nERFpTE7XJ$L7*|FUBwtIA-?Jet|ic@G(d-`F#!?`pqy=& zf^E1m#nGEnS(39?*o645Z1WwDIc(I~*a4=PM$pR}_K`=gjU%fkSE}exg^$0`#3hkP zS}`(I+;)^p$e4@S#o0MBouR}tNE|i=Zq_N5qYyGN?i=yFrqeMBTu?KS_%#>Fv zx(6VZnZ%B*YoEkGd&uS4BSAj_a*zwOe;m+3&tx8hN#-$I!Zt)~>ORv`zid7AB~lr> z^Rc}x3Ek`g9muoCXV%81+j6N=WRK4*L`A{tDK)O9f$?BTP-&NB#ey{Z2@3s_rlV$J zpadT&iHX30ZYeN`P_SAoNc=(0uQf-_#2*Q|RVLxA?c+&75lPfvMC{$xR=FG6h?VVe zPp<6)(SO1-wtajeP$yVgOycnD**@^Same^%mCly3b+!=1911R(Tn2r49UH-Fai%xe zH?}>y&T5gZHu(NQp{V3(_Q}+@#q46A9E(>iZxo8e+r=C;ouR}t5cU#TpFS7MsSW9? zv5U@qI@39nMfFs^IMzm&CkhQ3K^qY;1(8M2Wi~caEkxAH^M$w}l(h+Tpe>+*4$WY) zr4x@8?2d7JWT-3R#!$9y3=+{KJV7#RRKv{|hef_PV&C}W;fuo}UmWp`L-Iw8*Ta~d zC(>RT8y6oJ7p^eDTJO8GIo@7xy$` zVqbxaqpLB35l09+V>*wRd3nANcbu|DNHY*>K!;n;t|9weoA(TeXJEXrqu6*`OY$}I zU1WE|zI%qD2e}!J>g*$jPIi)|EOuh096mL8k&cX@m|T$#ki73GNa5+CL*vd9xST|w zChg=DFjTmGg9;Zo98zFFN_^V#UM^4%)X<-G;XpU7v2t8ws0Z3_8=b=v6I%>j{0bKi zi5Wg(hxwSW#I<|8B>PKU7D zPJ)idc;SpQ$M!(87^7Q#+;ZfgX^io`9GmEr1hbeKn8m>1vH{~!;bb0`!>8903~&8wlYyu(f%aM|+Uuo@WEOG~WC&<260*%huywq8N}P zHG2r%xOal$QIYi7H-?^Vr+6;0Vnu%v6pvKDZ~_F(KE>3(@gvm*5a^MkLy{rRujZp6eVGnMVaMwmx#kTjMGfk zqkoI5aiyMCl3Gn%vTL<4(;Jg} z(;is{C1h}wk&BrzLX7g!#Jl;Z+q=wQjOn?n%%_c+BL^w~oOByAy1zY5Ga|MlO=D^p zJI0(g?~=Y#hL$mNXC$P#Fz6INJT5xgeI{osbP|*qy8OCo3~dPtxr zB!Xd(Vf;F|;h^FZE6G%B7#R$vtzfoLV2Sbt3Hp7b0=l90^vqOOA&V|F4gBOa4cs8B zh6Y)vol;z*doqhy)mGeHWsZ+F_h8XBerr|rK;gMmyqW^O3iSF$J4WnlFA!~!EJ12F z&|b}fBm%m>DtQTFEJ$=p`bxffEqBZ#X=~q6eo<&gJfXmEeJjF`9k`K4&yq}&S@dQ; zvLVsEkq0S#!wOvJ$Z)_bKtm2Yy*66*8AW#(L-#r%ht-_E=C#m9Q#J zrHUn%9xfDd6f`sb_w+2jH1C$qo@1Za6#!S90+MpDg=38UI4TeohT3D1)*YC%s(- znGk7gs&LC4^kzZY_L8TJK2D?O9L`|)#6wLir~njCJkZ2~bT5>rU8q5Z$;#`=Sa~6E z)Frb$HqCtRj=!@Yy%Alp7Z#+`j4Sd&ekER!4+FZEop?jaq7$QZh5o4G8ew!4^q`J5 zS*+8mDPd*Nt5P3V

    Sef?YSG^_~}$PLeyAu*(Z7Iq8kmi6&uZhA;f{UnoV&S{i#zL!NjvgH1C(EvmJA<^@tOMQ3MG{D3CLd&g5O13 zJmzeV5=yxQ>92%C!@~iiD)o+ss9hjSa#wglNBr6$Kj_dmCbvDETIU?PnVu}o4EtD& z$yC?Q**YA$43=``xZ$oVM}Fks#JviZ$y$9yp#yAEROT&(mV&lOxG$a+0spBTYKJWSM)V$xe)kP`n}kPjf7i3pB6hIG?BLM=>-y=<+k8Z ze{8J~Ti5}B!XpIt{K=s-^^-mopX}B?Qc|gqv?U{;zRX3xChs{+cwY#wtFJsb!@1r? z){O`E`EaQaVi~L0Ry>ib!nlrZ6X!(n()8<(M14?L3Xy%KM-T@`@RbFI=Fsyd<5`T5 z>~;ud>8Od(mvRYcv>Bo5T(1wBi7F+P3Q1w6A0#TYimLC@q*U!P^{JtdbJ2nd$u<56 zpwY`sh5d}eVU8|yOHQh;v3Yg7^p#0DpXZ8UV#D`9jC4yHrRkh%^yh z+fBT1V)W?bYbR8XPS%(_nE|oLjgyI!gn8;##CGQH5APcojtjf^ElbKZUB-E-@i;H4 z)R2Ht@=Jrk9>YSJ@Wa~PZ4t_t`m;! zFBhZV=`uHk@OM_Ec9?^5VIbl*Gn%uL&fKxJ7M#9_`DBHKDcvSvI&#Bf9BUiOWh?hi z{3M+PUn<$59U}WwdLqsh?Ya1ZH#4O}F>KqkJpfNKh$ z4c(|Eq8q};jU9KYXNB!1-CtV@2rhomPZ>NO(85x^;n8EUf&LRuIRM?q9Dwd7GxOE} z!^ZdXvvNcIWL{(~%jFY6?#?|S+aV$zWbEu;TZAE@&ad5&eCc+bob(TWd^i!R=9K*ie-@@8wp@Y+#DqdqrOyi~-CLu^U()s^^| z6^)*GqGFFr1WO8RfHgk2w;^dFkFawc9u%V}d_lB}xT^py;%ol=|HxcwKJ$bMC6sds z6r-?XOgdFUmsx{$c*2mOq;P49M5!VS7As+od>%AFpGs&jIKLf}VEU`ix?Ambgh2TH zw{{kXZ>yEMT?p96Q$Mgcjom_OpLx?==ThB4wwPj@T7I+SEocYZnxkmJ{mfN#n}-W< z6peh%omFs3b8%+g`-^&q$X#$WyRoRNZB7|m{{Xp*s?hcs4|&g0dzhtnziWB>K!fN5xzFM=WF{tL+aY*37;6)mz99xmS~yB*^~*Zlu*hg zARI1qzeI4ox_t>ZxOg;Xu?VcJ*xgT-u=SKYQQ&JgJYm3GRIG%1 z3Q?m`7gWLti(SJL;^VxRj4IK{JJ_g%Jx>SZR9PK(aE}VAG6qWyX{!5qh^Wj6(kz|q zK6#G|1ZS3k5cd_Rsr1;xlM0m}JG_Ov?gfMATvV|-bKzW-j+}@h zd9GSH_uV-$Lh5@f=LgT{pb1LD%6aD5SsYnUnTORLZy2JPMSI4pOO^P< zJp4cK5_=U5KzjaefrM^!g|L!^qRlQ%b z3r*j7EdUz6z z%`ClDeBfsELeAdoS&)9eXU;<2Stu6r1bN|QLLO?%E>rh@s8C4ZNHd%|m5}CLb@Ki3 ze+Jp(z&&!l{uIjO9l0E3(DEj7k6Y|*on5MU!uX_4vm?|@`KUC7bcSW|c8{0&)vi6O z>t_e(XcKbJ9!-s%)Vh-zroY}f2oyRm(2CdX98^ib*cgn9XFCT$Ex*(`2+I5`M0NQe zvH7mlrrUg{nHBh@R;jB zEN>|UGO`>#)W*TrT7}osh`n3N5(g(=xffBx8*$17vEM zo-f$;+Z1%eAQLxw7AA4SXnz&L89vlfPPx()72e`Tmr@iIEuqx)iYP-J=brGoQM=#3 za1)BMDod42smuc3mH|0ZV|pqrTpAaglD9)9+n64w#1_zZ-Zp+gntpKOS7}KrKdmSu z{pq*>{U$+wpeF{g7atW5+KfZnSu{}OZ``v{G>npAgQj&XX(di;$+Bf$_DO!D#J{m6 z+fwFj*_-KnaKPi)0DEKK_l;xop{1?gQvq#E4ud(~))wce8CAh-q`LWZefA6=t`NRiFI9{F5J}h=}(-q=nuLnJr>iUIUPM+0(DD7a#bApW!3u3leF02 zjd^Ck+E0qO#lX5Xajfgpg(tc`{RxzngorF*nzBJett*-%x=L584)>G-a#;n0l2CN# zWLl5n35-RBX1|{`a7)NRnV+;V@CPF`P!bR+Qo7Rdq=(uXv8FZFD91nKRUYX#S51eJ zYO7dMxmi-)A06cy0&Le-17vwMkS@B%2z7S^mqyziyQR^|M^VD?ByAn}$tX8lJc^Re z(ACDo9Sg>mFy&frtw<9<)A>4i{hE_&@0525;>I8N0I_e$%jJ1)KFLZ4|MWye9sbFED;O!HG_;A2F16D^U%5uOfuWfl7q0#7 zLW~(#+&s5^Ts~PFi|r{l#eHeUW z&=f~S?^5bL3|SQQ6;Z}3L3@Kp1vV@~Zsn&?YN2}Cg?CVZCs)w2%T`K{zE(D0;|9Tm z*WD`wo>K7McFGNPsBAh!DFYgmvKbU^8A~A&2Zi8IDx%`xZC*s1+e8u_m8TAL~!sLQEJ%w1~VYL}v5`b3ki)Z#0KcJ3z5!xw^fHjs?Xq{Pws+1KOEkp)}9%=A}RUL+UMcFKnPi~&~ z50#sh#EiD%ph>5;J?6U>F!viKBbK<)a*q#feu@pcvJ7pdQ%00h&ZnTuY`%7Kx_q>1 zCn)8yiDjTuif*qeWwqe->f9Ejb>FRu0~1ZG#&_IG?ixV*Y2iIWKjwm!-g-3M!(z!? z&_o^?;nwPrWR+WH*;9xBllxk`__dlN$O?9lX(p(dx++&Q3&B%#GoOm#SLDDuz;Pw^ zuk^fdV55?eIq`H60ar#?D->7AnNQ4c-G%APqB|@&AYI8=b|qiFs*9Ig#T6>&iZRA@ zujT_CJ^e--k5*LpG-<(l<=h5$l<^S8Mvm=!%#L)?Ei3OsMVAI+yUgT8rAV8X9cJ^Q zrZS|Iav=r9vlupa*P{0e)~hPzhHN@Z`4*G?YTv{J^sLll4L*xIS!{LUm=KSl6Addx z+SZ}5e)P%uaK*I&p{=emh*LQSuADMz@UfjUVu-ZXW=etkP>zsmN8+fRz;f*?7FxSI za+X-m!djz{2$77(T`6!orN=kSPPiD~LLyxkiz}OO8IAF#u-24WdB`j{9AOn=Gzg3b z`SO`AUUC&z$+_q^#kKZTxy74sE77Kkv?6WrZk=oGL80_WhaLNPc%YNBR5&@EXPb;Y z^JH(NUzuTZ zvL8*W?t^8yc(AP4Bzg@P7CkOu@FBb@TLo}hQ=m?phwy7{!M+A<|(3Pk3?`RCAchgmNLFN#}1VfBrfgI|A;T7UMI?ZZ3t_l`)5! zQy#rTg+3;o6RU+_*~%MuPzcEm!k|(il)IF#qm_2JV>RiLpgy4MLn|dK*l7or2Rn;# zt5a&sqsVGCd9X>JqN;n9C||FT$6_x!LtQX`CFTbf@>uW2xeDKC@kL=(s1q<{K6NhN zv7U*Ayx{P=N}1oC!%vL)y*c!~|F_%ar5PB6fdSY*%P#Mif_8tyKQr*Z@4_#?8UA}Z z{&yG(T4wOS(-`o-!z}w9|ND3R@89vif5-p+9se8fzq233$Nu5?-{ZS~Ed2MV(;qh5 z%J4fVi!}_!-^%tIP8(zTeK(KkcT_Eye%GVvrr(JL_nlRWrr%*a1@Akm7mdH8yzw`D zWV-eDUBUVrdM}N?hh+Ud^qPOuj}LQNg4eRF5~T@j)uqa7{aY2xt!r75RkOGn#i4lQ zr%^r5Lh+ughDjyLqN-)Vt>WKQupa%}Jb!+<1vkWKcbjkzQEN5SM%+WxQw?)w-0=Kz z+Hr@{j@y$eN<9>eyc5t_C7``ZIvDro6$Q$1M6en7QIUl0=5F5y5QlV$fn>10pH zDExt0C`#1kjshT%%Eu4NfD)~JWJt`0LI;v&Kzqt`LCSg~ZuE#ILJvwEES*RXwc+Ht z(wIwOa90~s?rWbn^bWsaRVFoM*C`!$J{63O`-V-2B?L{W(LNYDGWgdAn3?ugL1YZ}u; z^1Oj9ZbU>WqJdWJ6odUlD96JhVjP;SvlN3fC{4rhbsK3U6m4ayNgauZTV_orfZ!4% zrS?}eV3`|MZSR#qCGC^j1jt=9BFm**_>M;R?3C08dO9M{h&Fj@bS;>g5!F&D!UIbq zcpL97(}wyseNVe0^ep<7c5JZeD5Pl{BVLXnDUp=gMYMDjQq&7j;t5E6`WFd_Kt92NkhGf<`_nsL1fvbrkfq!&h5bZXv*}j2dyJ zPY1S8{9RI>Dd!gOqC#psw~!hY>Z7!PF75!DvU!F$f51g!f8P87hqgnWyy1)p6ViTfMZ1mNtGGR+p0yB5NB$`%3l*u) zw9&T7vhJ&i5^a)B3nofBsc6?^VT+FD9LKIdZ+;xfWJDTJi-40n)_}px+x$BXZ1bOW53;z)2Zx2z+pEu7k zXp1?Twd4FU;rSXGEjk9iGAs~XrPOuG?u?q&L(KCi2j?=K)?KQJ>sD< zZkUbyg{EFI`*=f@FwZRu4^3gHwJZ!Z>6mDJ(s^LUSN?45z;uFz+1B-aP3~PNffS{czl%4~UG>^P+3qu!2t5T7L&#COXF=UcyE)H*u$xzW z;m^jdj;M0?WSjAfM?~THv$BAaV8V|)s81f?Y@%(T`WgzcrwyuXWav0|G{jTZqeP31 zubBCtPU$ZV$;Sqm3sVEzG3{@Z7aVnDBddjyUNehs@HsW%On2))n zq{2|NpNdhVl)aRll=Sj#@sDFN@aHY`0R>`$p&)X5#ZC$-sa!}R%x`I$^<0eI21&*6 zQpuPi+m}_Gd6RU-g5Kwns&00Z0_-%$ZYM>=V3oAxVOzBO+_39OhW;VU-!_tKf8PA= zmh}C3f0e8v0YQBV^6~`5_@Dqt;F*}LIIa*0ybKfAp%d7!6WGKPShfkS0S&pG5W!ADr~tZVp6)Uri=^f2xN-VXI8Ai?KH zg3k{#1!?3deTUi_Q+nG!R_yAPEc>(Zaa-|cn<1-6QPTqokrY)xpgc<99+7UiuMjD` z_YzR6rJ!<2;MSkQ{}MaoO`2;{I%R#OsL)8zq%_&Km)?6yDi@Mcye=jPtE<+HDz!>U zTg&6_K@!6^XAe~W|yJ^OKQjNNmEKH7m^Z`awYiOP3*T-vPMbeLQ*DCmGDKD z+DYjeC6$Xw=Wc$Kn!j97jRY?!V#G^@*-UmkeEk8r!LBFW^$&6W)Jxa>dGn`Uy5Y|| z>-LbseK!TY7g!)RQaC6woDnvkw0&K95Z|kW~e~S?C=p;os!Chq!iywDc+k>`;bnzD5+dbLe*M| z_uIa$F^ht5aw?W>Cm6Iu)E#* z^Uf=)aN5vku!u9b7N>B5NJ00Jq33eTrA|-5!XbrgLgv~;$19o0ORA4OEE957yE$;Pe z>y@z+C~-`iEYqlvDM1-Pa_7#Z{7$;u2QB|O%9Nm1H1YAR3N`sr`HCR$!Wkio{)eLjs!w!xbe>XfS?Y=3;23WK>^6?TF;h^W@9}@*W*W zxUuH`n4RgIV^50T?>P8m;pp6^z@G4Cc_suh`=G+rj<^H%^Y>QMhlODB8rYEsN!K8f zM6^|!8tveYkU;I=+oM8ez)-lODY-31oOA`V^hLk?=pI+FcG_Jk20trKlPhQJ%!znP zONDT2j;|MU+M=#P(993M0W+ZUz7U+B85X4-TuT8`&IskWO3B>29=e$63Kr82^=ktZEexa^GU5WIqC9%NTrVI)|Iq`KFXBKCB=GF-{kUsD7dLi2IfV`1>L}l%LOy4JV1yCWILG4mBMx+2e8ho;QwryJiiWJ9a8FMNt`Ba%X~SOc z+fE)$QTn!=yZs-#xzwH6vmwhX_CYT5p}Q5Xyq{z+z(QQhLru4Xfu;?c$%uMt^I3jJ zi`dj1(LL#tZ#y$#qA>4SFY4UD_fiBIM992&SH(X8r^rT%rq(E!fER9Bby=*9 zHC!)(J>7fO2wc@tn5h&_@eDL18Qe!xJNkKs3bstbblVEH?3^XpMg-}DeRU-22m1n9 zskd)-p5sQ;fr*9!%h|C&)AuaN7A8u}zT%3OE&$g{#Ynrw z746Qu;?9eH2w!t~w>*t-WcC{cn)UNRiw2JTH)Z$w`Je;}X->F@K;H!pK#*(30iO6; z$2#^=L!&^VN;(&_b(ICbUU9{Tl}Wj9#fPrj9R?no`mV5~Jm#i%ukpiI=NUZq&4>$=X6M94qUU`}@V56mN5Y4D_BStgwV-UUz68g-EN}2jN06#iZ6u&#H#A z`{16Q&@(-&nw?jyZlj1g4RNP#^Moo($Y#b}%Gt}*bXf0w9VZI0^wEW?>9NlJq$89y zG`d%&VXStF@u7?JC4Iz>bH;I>+-%^?9H*Y;gkEJi=MRK3cdSxJUca5FIY(;xp3<4; zm}U=PSrl(K)m-Nru6r1wc`^30ut)F~8QUH}1Pq2r(I>mqj_Yn5@6Wm$TatXk;uRGX zA#%%##@wxH zzmO#g4tpNweSaiMHey1n&<=6k06yy;wkTBjOBN(K7vTJ5A;398FBfJNk*}xBYT}#K zrbZiT`Q%LnDekYJjmFg~EoQZ5Vzefs;A;QqLBccXURy{=#izP4|4KonzHUZ#0uH=+}Y3#nsuz<`D!j-ib^>#3@^bT zLYF>c)Kg6zrmOFn78?8=O}V@xGWp{w?p=^`?fXcRP3GgY#|sOz39 z&YlkEbEHGLUd{1hvU-A3kDRbS&x?t7XH)Y}ZhMOMT#q^gsm?#@EF3`VK83#dIa67T z2;#V?IrDC~^P+42S}yO7rxDJ~M--{}C5wt}0lLa0+o~bDay`Kjt#XPGCiWbGa@rA$ z;K;8Yavp&c017!K*D(p>h(htmRu;-|9hCGqhvEps>qMc#{?zfA^E{krTyY%loHwmU zyen}YKIU4VxMeoZyj3@EppGba-NW!DF5Ylt_WPWgnS0jf>*hQQj?dh)K9%#1X0hu& z5M}m#peUGtfUAuJu6YUC1;XtpiFG6}M0(^wm6Mix+eT~)D?EJ?d3J6`*19Ka4RJE8 ztX=o_i#Z8j9%23oMV=B;mXPFwnCBkWNiywWop?@m36_tXU7M}@VTU_I*-x!*qsgLZ zAe;tuo)EKy$l1uq^VX0Pj`QDiH!^ZRH)KKNnb;cft)l8I`rx?X|2)-U0FJT*Hjm^` z#l*wd^ojk_lF_CjjC2#(uX)6WRY^I+)C1Q$BsrS?4oQ7W`GdYM@6L0z=S%s6zFX%+ zwF#mZBp4eiu{C4KAxrw`UDV-$jw6VgY`m?XJDDT(-3o9P@J(>+W{%WzCpc2?h~$tn zM|eId#Ey>n1t|{FM;!-DmdvBRKb34S#u#jRbkCE)gw{8VL+&$8Hxr9^O$gs~!D5k*rk2Es?P$oS_HPVGzHz*> zgCL^WuSYEf&{9AMb7Pjm76s-8VLUsSIMgx&v$Q+D%b}J+p>G>ZoMFxVivh@GGh&C= zBc8pM6anM}%^N#B{r7{9`v$OY-wKBA-xEGACe*J9;lQ2g@K6I4m`=J~FDq~uylczj z5>-RzRfgiA+5;^mJ@1C%7ASsG!snQAf{Q? z@CtAY16H!&-wbBV3$IlKyrQtA4C+cn)GUDPNI0+=;8W6uvw`>!s&xoj)j(W`(?V?W zBJhwInrWy&dt!5AHw2w8K4+{X6;-mvj4n5=r#=G5-02Nmf~v^xT4B}qPR$z zu){krkTUZb4shDt4&&A)D(o#PUVvC)M0D&OIluHg+eIueo~|X{{O!E^>m2JLBSc4F z!A^0c;B>I?H3J{~W#B`sEP_22VIcz_5NF`S;S36xnL!>{)8e)q@T123V^=MV*CR0? zmvo*Sz@!ebo-Ze{CfT#eIoem`bpdv~+lA3az)l6?NqzF*b_PD!&LUJMxj-;bO)r+D z7e%s&(V(tTnE+MxCuF?`Cu{v|++S=ewMqDn;9E+ri zsDWM8)$`f#j)Z~Pn>l;!0tTdx-OM2%1BtWPn>mBs*$9LhK@>L>)2&q^mK4#R!AsX* zOMu4IV%V_gK7@qWw&!6$*8AtxIQP zB9i`M2122VF&iNoE9s9k5F2_N8e(lW#2x|P%>dUUNIIyo%)9kS#F8RfGl)2E`N58= z5)sbKAi?L!xO9((EaA7R1|`mD<_eWQm{_h;*PzzYA&7cZe4t5e%Z8F8hx!?GG#mGg zz#m7mW)RhUP$TeWLycuf#4;m>C$qu*NU%JbHG_n;iH|$oEs{Uu^DcC}?Yoe4rORU^_oz(g&B-Ytlz0?a9_igqM+ooxCT*$vZpNs^wVm0HqsfX z@@D{@u@I*$#F_%?wBnvh4fzaQIx-cQ0oJDR4)Mikx^-$oZbl!AYfvih_p!{Oky|)d zkqn)@&t~u}4;X3eM+>E8wC0mpGbm#d+-ghDyW$Lf))uTh{Hipg?9G}%w9f3!nn8l| z{LCYjs<4QkdHhicn%SE*gK<0?G>qb}>VT_?ct^yNB3d(uHnsV|RzXh9R1rEG1Bv7I zi!7+Afs`v$dMg8Q&YZz*ZGegK{yr98|C=h%gEX7|pt`y_8_$a1v}Pb#Y3RF6?Aewg z9uTq2iSK8FmXT@t3|ua<*M%BOyjvfMSXM-P22n~EW3)|ai7j9B&N)D2mUx>@EUx-k z2F3koN=L5JAF=eo%o#jUaXDnvj_cwKq7}Jug*j7QZOn%6B7c_N%o&u3Y8b&dK2}fh zDWxHe=7gonFm z{K=5}j!F}JQYP24W-vKWHtVQ@P91WNJ#FNOitR(y)xFu6SAjIsn}I+@_61NQw0U32 zOxi>&F(TSi&VW!NjsFbrB(h(C8q2I((itPcu-wUEQ8L$X4K|*d$&r~s^kjh^l=zq` zdrMq{$&n#<9hIi|M3GJiQ)h5hVU(c}YEqP;64;(LCsjg71Y8@_DAsb|L)b}%8tJf@M}gNMA}yN27u!sE2zPGNnMcK` zl}MbsZtdQq#;C`L8&5_8fN$0?Ga)RB*!)97eqffpCN6=p>YZYN%I#$ybf}LfwC8!& zd^wNZ{F5&IU`kKhS)@M`g6AP-qUj|%&Vf)JM%Ua#Bt&3>_ujN($klx35d(3K&T}W- zs`eVMqqjqIR_876;JPkdHKnI@o+G%d>4vY`k&KYGZik)G!MUv-uTAT)?j(E+aU-CO z>+TMkPOVYy6`gzPIl)5Cy;6o%a`VC?FUGfBY~FTchQ-jQB)OgMThg6xHo3i9TL-~I z-<9NI)@)j4b|!>g+mxPqQN7ma&v;wyn`^O*FK}!EdUMok8REQU$XEH!BjWcQo#&2c zR~kvbk4|4VvpR1%yY+SHD^q%^tm96{WVyvSE#_U0PsRwP+mVrOV@wTDVQcI(6OqO0 zd^DP`^W1{-R>gaX&`Tp4&+5EoIy%y&Z%yf`o7ja80Es|$zt4B0Vg1md*j%g;NY@4U ziJlr?*|ko>;9S@2w%j@4(BarW7KfhSHEt>IInUd8 z;zr~OGOAwuD4X*q8hr`XRQxEPg15e$lyIMl|WD01?vjxox&NPdEYYyUu;L zQK>0?wkSx!x#EM2aHA@h@YqPkG0Szy6nIzE2Dxi{)t!S;UC_tuX-l&MHa74=O3$CE4u7g zR(1~lkq`;YCtgEn8PlQAgVKza+GorL0{4j!<#nOiClEaV$R(S+?Wq;byf<03GScNX zR{P$N6)ZrBH`Zv-zba4-#6$>{CN%tNvro7&5BqR2%2$mnu_3_+rn8SFMA^_~zglG_ zoB?B>aBm*=;mz976N!G%3f*8H&q)bvfMs`B**VxphE}=P!QdWMprOR*{xGnQYoFLP zVQFMW87ie`0;ovxJ&{W``Ofp|Leu;qt5yc(!QfPh*}gD%3247cytPK^4M(~Rb2l-O zV<==2VhX zv6}Uu%T8F?IrsqjN*P zA#&L!Urmcpc*&~0W&svivxbDdpd&2W=L=YeL~R|Wa-cTu&-U{uYR~gLVw@l=#&JXG zqzc727s^3fl?^{zWo4{O_B@IP^E{9E^|r5P61Odd`!Sct_CS~Iv$FG?FBOfCP*X0n z2yK{D%{}tSbG{s+YZ^NUWL!Elc#A(9a+Anqn>ZXxpCp`zf7qgy6=O>g`7fzW=O1e$4|T}EJ*%uli(vdi{@*kBho3KX zJ(J{sJ)M87W}WM@byjws>upaXlVXhUdmXy|)?6f;o{K2DA2Npp3S2KkzF!*hn8;(0uEYA2RoXo>NyjdeXlX%An@2B&R)vSpwJ7Q($*?*2z@U}Ekz>bK5 zCDCK$Lf`dl6zKNJOsEKB0@d;oV}i$KLxW9D4n5+3tot()|D*A2f<{BES%|R;wUiYM zmwmt8Qjl_~L|#=3dn>p9oXo>NOy(*pMko=408?{GaNwF)QofpMPO=hI#~$0P^oY2b^IbvN_Nh{!sYS?M@!c@$2|? z@n(>=K_$92oZvEjm{ejh!B?$Tz^oMo{{qMiYABl~zI=p=z^)4E3TG&-%z!LUEPcovmtJdWGZ@M6@w2>_a7 z)aeA{q2R~nsPi^>9^MD7<{%h#+C6})IEQ+A6M)BfGaLmsL&4!t70~VnZLwA+mz_W? ziJLKe4u09(J0>iWesFMq-WSVvr`PHX#+{%kJ`I%dC8Cr-Jy2o;+Hgc|2sVbIVubW~ z8+3XieH1)&Mq_{viPSf!!dJm?ga9GU3AB6^3~!;_l4$O80Qe=k=xa~+O)uL)Z-8}Q z4sS(|E=851kB_~6KRE9MVr;wjeS{JbnS;~q#@7CEBUs-16r3&}9xm@SKD`y0CznH! z+Ii^6s(LrK{hp{<^lQ`{OrAyap@!Y{!__TOWO-$KXS?x9bRyW;ZtSfe9R(Zvhrx1i zuzc9qUOnDfJ`4_y4-fW_)?Wv~Q3smUfeNM!aTjMv3}d@9Y4-YK)$vbaV#lI&{dREK zeCUV?ZgqMOqHRsFx!yj{o;;|e*&hxru$v;Y8OXOmuNw@8;?D6n>Ir_C42#nW#m&sV z5?tDPEzX=!6ftfcmmB98Vy-*hqs)6o!>@7+1m|I6hjI z9h2BM5@n{>?}(uu2hID*@CMF}X21U&TxeXJa=9F=?FW1NjbMFky8(qQ+#JDSjr)#R zPNN`5f-wFuNq-b?o%N%JSZZRO!N&|14DHrsv4JBh%pZH*cBiX1{y8yu#IQYTM4s+V z6To(cBeAf`;yfFSgYvi~7R!CVQx-F;!FhfOc+VgRD+JVo=ZZn<8O(#!Q%iC{J#jV_ zr$-DJ%Umg<^oa64l%BL+MCnQLC_Um)I~}BFPyp${e*d6Rc}6`3(bMZ8ZqJC|dxjdO zr)Lm*hJ@JjAphwp1fStU4zj17hLto+0c56Bd98no#82XgtqKOtlDHm=Kh=6%i^3#M zM2>nbLyr;${gc)!VOFmv68cB|7FUycQca>HtVB^g76*4&i)vxLlGbWjB}@~M(W)m( zIfPJ@{#pp3EUZ=HxL&JaJ^DA%oLW7pCAFxMq_wOTCvlc$aV-q1)u<9z>LOzSLa1jT zgy4DkAa;-7zk&+<^HTt#a6}72Yi4md#j);52X*!92%&^PJ2%8sL=w`!I`M(viQn_0 z2SMtv03RgXh4JlNL#!GN&ePS8 zDO|v{=5U?7&Nsw8uHy^fWX@uaSm#Dk|3=7dVB@ucepDQ%NmZ)F-PJYavNI3XGG!VW^vuShk4I zRxQ^0Sh13<^|5Ltxz>j_+%`gkEGrv~CL0?CLBcnHxGqL*ztdcmPN)}|qDNn+U|BB%zmyp-$q1<}iz zUf2#t%Do8v3weNQr8_N=?o^SFY?Z1zE+8m0w<$d3Dd|(+6I$Vjuw>4Rj@3jaCJ`yS zlOf|#(5%1&OqKxFJRk7oGS8=7rwD|kW2f1ih@OQX`Bz4!Iqa&5H<{RK&L?-fk4=nX z%6RH*H{6qst$c^>FT;A!U9Q9(p&+hq# z%k$NelWAjLYd>itu0olrXHcdTse6jRl5V(*gua#)%1AIr2eV0Sm7Vq4!)#JTW#{d> zhg0Goo!fcq&MCqt%V#@h=$>^e>oj0#!)l3dh~#^$&M~ERq0BQC)5_F*WokMuccDz= zZCs&{L{oB&2|g~nR@T0IpbI&B`C%%y9^a~cXPL~~`YDBK-a-$a>wT_qZDv+e! z#nSfxBfUUj&Wl&U-@rhk0`erO-cgF5%2Z7cmY%BWv6VcSpKE!3BL=r6@B5z<;zh|+ zAzszO+7=hDf)r2Cd{Vq5{5O~4eJiQix02$ewQ9ANMxc;~dem=GJxZ!^7}dk9R;{G< zG|A$6r5aVUT3WAWX_Uk@tDbKlo&5Kc;(^@kif)E@ydBehQa*vsm1Kb~6H1-|2kf#1 zgS}-gZdwL-p~QbX1TlU%74sS&eL2MIBH(pS>J~WUU4cU|rcFM3R-FefNuJm6Q@)e* zi)I$u>orOJhJ^asCt1zFi~eflemGVhd zeWJRcAovOj(lMVb&nw6)NWKa(G7H%wC&qF~o&xjWH}bK-2wROz%OzoR3B_D;EHA2V zPCkY-TVyqjL$x4%Q^B@=RT7uAR~)@m&nrqf3CLiBM$j$H^oiDrvMz_9%O^(j$_EJy}A9I0`WppLEG7_0h-;@v)NQ$CO zp7AW1la}VN01a9cB#Mjbv{Ou8xFO1w8HjXV!qPzJs}IHGP?at@OIKCtvMfDq*E%J6 zLxbdhdrE|ylaKLi7>sgs%^mI+ZfKTG)SJoO%w z=j`QOVl}i7=&+1ej!6o;1&nRH--hTP$oquXtPuD4uvcVqHBl0T`?{DxO%$?4*e_;K z6LoF$A}+xb4-+$&QSeNePBjA2g8ci>73$1wyZbHv%&`Bx3%^9a)%;#pBr4 zCrppsX_*8&0(bi3c18|eLZuM5Gy64RJELzOwsZb4nbB{Hk{S6#;J-LVW}WOe)2V`M zF7Hezs-}{XcSyhvm+^~V5YCauEUa3g7z1VD*mLJTcZOOFlpSeaPTras>j<;eixIzg z#H{?6dNbqi1j?F}Nn~v#V_SG{aEy%%*a-Sf6fQTiu`S~*!Wx^HUD`(Sl#llX^Ln)X zwn@$p3J)FQ&vu#2ERRVkl}A_pD<*xH6f!W9(q8l}tTU;^DX;(8&b}AK zt=;K>d>Ju%bE@C08~86HWk~w1;#Wt%-a|5y9+HvMLsG2h1pk}u9U1)^@5tz1H+1#C z!`T;Be?R;Fp=X~u-4Z$j)hSmeJ#b6uE9qp@hC2LgQ$*+KrV{OANl`O?>M3H?b?&Le zn%3A=8MW>@4^?7w*6F7*qLL2T;>!a4l^(|@f0e-c%qnEC%_(*HmDUHPo6CQ2Ui0A^^ZQaNPfYfmjee z$qq~JkDxOIEiV}P?qvipSKZ z*TeF%9Z8PEQo$2n+5yeTh%oELoH7>PQ!ekB`}@w!S8mV=?ZO{kx?S=Y&;qmPnhpi` zQK(aj?h$zWO0(6qG%8iy5IgqBe->d^qqbvT!H@?7GS$3O^StNg$z9_@EHZs|GP#|{13M0TN#4p?^SUsCLhB=8<_Adm>PKK%ws$qFSUr#JV@!%`N@L-KC<>!IJd0>TS-Rg@ z&>|R|cG(7bajZ);X<*xQ0mY{Xg=Dp$?Z<|Sx-5t->yTv!&bNrFLDXg#RXtDN*WI{D z#xbwWK#jC@0WPVw4~M5Z&zZ5RFl!J_|H5%*XwaBV1KhRHSaok4xSaHUaO&JO>^y7k z@q;yYt}}JDokK^j{#G6mXrTxQv>-!pNly~p_6zMtrb%bcmO_u$bR)LhUA8lYo=A1% zb85EA3x>VYntEg$YG(vI+;yA7L(k@o_;fYXq^5iG&Si`6l8%wjwiIn!l1hvedQMIW zAkj8o?Yh63%NC(;RfGociv1Q;oD1~0GSu)Bi>__Xum(}f7WIN5)tez(X0Z0%=|_gs ztqxzgnVy~*!4o$^{jz%3Mok^Sazv!D4s)p}pS17FnR@bU7qPpA5 zV61FTzz{|$P*d#!l|TF_Dy#}pa?FuDC=>`@WmKS#fJeYZ&jBliZznSJ35Fdx*P%~n z2fcOznn*bWzg$N>H=KzSHgtH-b2r2WO$pC=uA(951N0r<)?QW`0%ljz%QoF&4irG49Ow~a zKeBd?JToa-mG|huJ(I+p6!57CS=WOU7*{=sz5ij`4lro_YM@5Fs z9J$JP!H)`MWFR&Na{x}l(~=hw&2~mbXW(NFb_P+hVV6Zmz3{WzyCNc%4Ka5oN0d~Q zTY|(fwDzTN&x58T_hB22=)?`DfUyW8Efus2Xm)9W9Hd*P>i2A_X8j5 zlk8a4S;mVwHl>gk^eMvs#jY~my((Ws%(KT?5~u#F|4>q0st`lrvoKt>I3m(M!eMA7 zBr>6#ORzvPF=pj^9U*j^wRyw6r%1l#o%6sBI&yj-9p(LUi|2G>I`Z(L`C0cK1F~oD zU4?uYcvFgaVaT>IXsEMk-j?OdNTdrFqeOZ1NaqQq_~Zn+A)1Xs$Ne8B3PMB%Q@S_) z4HM4OH1!O@Zfo4|L8mBGO#OFp~;*X($Uc#k+7 zxOBEqLg-*rkzXVd;w>9@jr^kB;Bg?{F{8ljd z5Hz2`M^^tgH~9D$!e;x|#IF18h8o|>aOB_5;G<~Dv8t}weM0^iy)qiVhKZx90<<#Y zk$t6Z!rQ9UKHVt=`DX>wiuN8&<@E5%h=#YV+E7UnU1+ z^7Ccq2nY)tgJoy=-pq z{OR^=o^G;{QbK?*VBzx&u$N0R2Y9dXRC>w=XZIB|)43&_MTrJ8P>S$FZqsyI;1*?S zgSI&|=$9TSL64P-&r%~O7*)(;?m&2BdA5*d7&=SO10(0L{0KaTA1VX}v&xXx8~M*m zV-EfKYtQ^M#A&DeTvwNs-n|%D?$GjzhhTW35 zZ@V_gmV`+?EP!e$?ffk8)H)d*XzVX(b+Gb^876cTR^_<~+VP6P3a+b|4NiE{udkH8 z+-GqxFKlU8z%6AcrL*<$WN?sYaA_Byvs9-bP`VH+J=O@Mj_2kA(ySo=d1+;!KVSE( zubK($;M~oWeFp~(^;kIg><)ZJ2Sp8kFo&v~tPJwqmBs@)OUrGD;Il&T+7(dL7N&!j zaHaXrOO3q#e8)4|XerYw?q)7{*qlLtaW!pP@V#iJAh=X~e`P9sXim``Fq4m}4Oyo& z_bi}{Bo|cHa%(tbuyzb-^oU?NfqZT%3G*6mgBqxePwIITQx?BPk{|L)ZjB$=z>C<5 z4ab;+E44Mz)3!3yo{p9FTk1HkjY=1Fk*N1H{cAeV@1$njhWTX5aanMt=38bf7@$dV z!N?%UE1Ee%AT&LP5EwBCKc>jG7hQXy7bC<3 zG#R9B9L5dGIS?61w+Q(lN6!m<8X^C!41m5fQ@&- zBq5krwJkH|%tj?KXBQOYHNh4`Oo|LKW*>NTGsL9G5T=w<#~x@6Hw+GtZ@n0fA{z|U zqZbJ^LTuvb!BmX*y$G*R(VZ6}Rb(qG?R?p^mDl8Uf!U480Jge!y9L`d6V?1dyfOV}Ad~bB3S{b=vrsBy3 zsEd1J_{ipVE$=^M35Vx{Z5CN-%fTF4 zDUP?;aLrWw0m*m?51+iS+95u4!w-&{>0Ag=1{A(GHE$ppcdBsRi{~w}m6bBxjU|km zInL=+=7^Q*SE^9QS}S>>)umEvYg!mPn1gHp*wE)~28_YLbmcP-8o(?~CAr|UkXQCv z%yCg%#9T`*Wz!hTAWZyt z-!fps*o&)AF&f6-Od}k^S)=~`b9KW1RG{hK|NKk-nSuW^5o{CvWAT6Dw30*&|GOgb zf8yWqe}2dR`5ph~cl@8<@qY;aJNn1tf4BRce>en?0zAc|#n^;R=CTP3YdM>+to92a zfFeiu&?NJkgw>LwNmx_}A6lDX5;iHAgkjHrAY(8x1M{Gs&VV}omqoIf4ZZ5cURBmk zHW3BYDIGyy1IJX9715^l!$z_3NNGwxtM`8tzRkq} z+9p&L)HtAZ6N-R4%4Fn`>_QI7VCsXiJ+O3nr(_HDNlBv4Jg_uT&xWP39T_fJY|JZV zkOdt+;l}93z+}X&H)P_q*0wnk39P$f5w9dMw1}tHH|lmZpRI4?5~aTW0=9)~PVZ^* zB`2TAuV+>rpCqwrSFBZkI5wyuYFiE_3f%zHVH|VO%g^L1_9ca>;z8#n`Sh*V=YK$k za}#AcF(iw#F`0xsy!HD?Z;*a|UD>>Wfau1Us;^q3ZMny9SYvHF%kU&W-%^Pw8J=5Gf;WdbXfULVBJwskdB#A>A<4HBDT7YvI6%sjjio z6YHzCJG=HD#<4_~k3-g}P1WOd8gUO>YUYtF*Z2*i;ch{ zx=?4N2PDOFxX??HRH`D4O3|T4kzj#?n-1@KgwPl%`PGv$%|x+QsNI$$dlnh;)18cL z_>!#ifOfA*6P-=#%8=0qHf+a84Y>-1%z!_%Unb&p;nKO&sZXll1FfWcQ!urei#0jq zAq2qLyGxcmAm|zCY-48cqp4Db^<;dh1?^b}e0 zP?AEeCmxTumy^nrDL#>TQsV$)@@$%lntB0k zUN&Ynx=d&Bb@cO;%wD5qC6Qh6 zO9RUmuo$zLkmX>$>ejr~%t~rmU1bS1$$N<=NW}1}{$1jnhw7jxa8-{$Y|ys0tqeP1 z%(tvoZ(B{P=2_}WLcqM#$R!H~nO@TCc7dLSM;>$7tpx*;j~tMy6_aBTZJCNzbae|B zDbSei7F2uFPT#SHHQ%W%IdoBuuP&M8e^^jO;%-Dn%5{##vNS0gz%eT&gq0nH5>$|MO*5jvjh9=<-Fly&)6a!Bs4V24S^AMG{E^;B2TL|0l(Z0jW;G7n-GS8uAeiOu(@`k8$!kR+G9ip_EUM5IQ!ZL|{BgT)jYn!KWqvb5Od8z>0~U zwbj~_GFX!)OVSPL6=73I536(bdFu(y;BorSJj%XG8hqVwIEEe>gDo>;BAsL;0WwQD zmxb)^BMgWVHLa9_6`&sL8xM|C-?$y?ydT_HPQ|P})e$o5zjh9UvS33S|ET5cZQZg+ zId|rXb)IrAkC;<;_oQ{;z~=5-XZM_0J@~N_+UCyAJ9by=$STd(iUT}04jww|#4~TM zyepo(%M2OU0$3?Fp_tXe)<~4O78>>L<6vYO zxCLc-2R6VZ#j!T;+c*?fXXC&f*2IR!o(%Iv?)lGUlgOXN zuWlI&B+Rz$=|nDHghzISM`rY_sR*tZp(T8zpUK*AtZZOW1a+C2lWD5NcM3lk14M?` zDJ_FEHCkovecL+kd!m*s>H)JI+}AbSGm}F_wca||M%*r=uZ47Fr;2_a5dlXojPm6} zv}2VPO;&oO)633uZEUq`0hL;>Yi6%$xK_#~PNn6draln0WKr=>FE$Zv25j&Q$%c1a zlwtG=Z4~vCl^Jj@OQJ1_OUja1LXGuufwaUlYm>uVj;hX4wsQ3HIml>u;>e-w6DP*- zIQJE0`j{B|#C%Ibou#a^c-|ugE3;m)8Z@JeR^B@DsKy|FlcM9dN5~3)Lx?O8ySzX( zmorEfpkTm0n`ATNWML&U0%hfGov_TejrhnFqyLlI&dT%%j}`z%?1*?GXg+OcQvJ8k zcK$2EIQ%PVJ45Z&P*aC{OA9$q)CK2In=}u#iok#|Y}j}Wo1`+7c&}|`DL>Kp3JrBV zTGl~6bhHS3w_Mm2E-N$zw>v7zkIywuwGVOO)Qh+flaM;n(JFk>W{FwQbI>ixtdx^# ziKUe4qL4y?JAf&##ylknGs-v;$`F|hPAOE41e$Pntrt9BN0z&3({`Va8BRfv`u^lH| zJ+w4<%`vp;#DZjyjXtIfM<#>4Fov#$A)keVocl*18+s6(<{be}^Ns+04|n6nzLa-| zU{N4)nyp-MRMV}`S{!4g)2d0}mI$&jK$p^8<|b%%LLqS1gvspvWAL$1b`)(l2r-%!FA`~)ht zp-Cgl30}7Ojxr2Q24|ZU&I}y2eFpI2Ft3nC5j|JJm1Qj5tsLMuJ^v;~J?dz=?V!!;NQ{hp&2~ zjN0XyGCZ0LP6pc|i?z*HO1~%7jSlslR0Z~237eMkPU>ils!k#VVY@dKz85s>y@f0! z+r3R0HcbX+yI09B3IyeARL!bWGt40-Z2F3&R+W}UM&l@rsIb*5WHht}jas)LlVq#c zD8q`$U@wa+*Rr_8Wx?6@*@uF(VKRZ(Ry0j;_6OS^%)!`jF<)l&FXw|$&5NuxZCN}h zU4`_ct!UdL6XWl&uvXg2;0V>CXAGA_DlJrN|W z2w3FP+rk%P%g6g;@sqLT=vyh)P`8}G9W~Uo_wrnxz!Rl~m(Ji#WyvdD#ZgsIF9w<% zY0Kf*Kz(ax%+x@+ECkBJtjX1=$|G{5y$+H1M8q;97QM|En7?#M`AaWo|LmBF*_BE& z%4}cmqOruiZ3?lanj{6}7Y1r;K_kEP4bawt2Dg%;ZjFanWAbf9EQ0kdXbY${W*kK> z&XB*%nnX%s>3_WC=WZ=LmtLihMOM+GYjmn*uqXxj`o#9 z&LzGm8-Fqijle0^Hg5M*Ilim3ToS~yt877~{mL%dOcXi3u7c{wfGaJIX{Fq2YaDt> zxhiXp?-D{0)4D5NO`YrLl`>hXiZ6!&% zI6VKtr#R!O?y@Xo>+DDNRFB!gW-|z5yQ?oFK!6NLAc@W0^?vp@BXWz}1g>&*cg@dz z@03wyWS-oY$cX2O^z&DP6p6zP(Kj*wh?mbv$EGv5`(B0nrtW3;!RpwAsB>S$x+a>Q z`#uuCF>yXTPah}R3@7rv!U(7UPZsiJL?bOd%4z%G;f(~K)YB&azkkjf$#-|~@BZJm z|2Mz}#J{uucM+$q|96sq_y7Lx|NY(n`@8@5cmHqh|D9F8um88f^6`5)f5(InB>q}L zkgRE$L$F?$Xb+J#skFx&0y6j-?{6k<8$@KkiV-CKXE1`asuu8bWHD#*kiV*`*-Dc# zP13SxwvuLAmSs`KRauoRB#&EZnOKY;UD4SW;Y(g^{`IKdqrCFBq_EEpmG-IvF5)>?B*0QWPS(Bx$s;p!^5SOgZ zWaG~2mIvovQ?+(btGDyk$) zSeI3-k>b3`I-Rw9D`pw7wn?fcYv$a@hkZ6@Wd+L)mXG>XRB@4(d9#(X#>!Yut%`LT zJHW9@<}CA!jRg}}0G7)t&ns@SBY(xLo0|#i{#KS1tgrJlPl_UMu})w)WJ#GN$-f6< zN|sGxOo7;e*A8b^X%6lc!SRu@n(4j@t6i?8@8y;7-ADanDYc0m=>|6x+y#gbfX2x^ z0!Of{)X%pPNnlC301p&##hLW+97@9-1!8wcGDB0MUGZ=*ugrnoD29tf8UGwiGTS*0 zn(b)kQRxYXe!N~EDq&UARUF`vcBu3)U)Ua}Chv)Ma`SMqL<->BL&4z~pi4KvYQ`XW z&%-3|Tyx5mu{zY|dzsR70jSI%j$5cm>Js{J>2~UpSYTA;#ox!MmKTB_qYk_z7gHLw z4~>7c7c&|oadc@yaLIMtsK%>wsPMn68%=iT$Dy|@Xq|zP3;P4Kf!j2O2I0TcE0Uld zx(?B>8lofOZ!Sa$r3YCraq@O*HpYfW5N*B;!6Stwe`u6x$N~5p()n71ZxI$gz3`(& z(1{CHAtcFGBdi6-rmsk$8i0yoiQ{3&`(jDG_T4DJ5(PQosrwP}mz97Xo~l519#IcM z%DqdwXG}^r<+!#{NkSe-U>@90FX`TylE5CGij=ysrxa(1+kCujuBhN`pil6HWke+x z{X=qS3x4$1Un1 z24YUVdp{2rkNo0iF5-~_%A;Xb5RDQzdrgRWUSe0kk})=sJ$iwS;7l+Aq0mKKHl`_!1aPTXd3flM2R4jA?qEOCFY*{F@IM+x;BA0{?13RS zC*f|;l;Eu}#^bom=OI5#I=uOj=hPS;Z@n{XFrz71B1JLeSxkl+XhaT=6ZPtSOT+Kf zEBbAS#hQ*}ZZ7fJalv&bPunT$ntxq^7BiM_G<0z*KWkI2b6WvlgMRk-XRZchPc$8u zl06T|p1GBu_f~$+ZU3FX(y;AzKE=5^)(}c}S_O%ujzMx5( zIS487Jk61N!xZezUgB8e_-fsTPyQbJXpKtBWnq*c)d$%rMUdoMezu(3Vh9Z}mt4}^U~ySN zs5HrE<^m&a)>?N30;b!ApKKjP?%gDD6&m`cez5PjmGrtVO=x&HNrYdPrz@KlG!#Yb zF^1?IopZJykpOr$$Rv6km_~6ZsnI(A?a9`6}cEi`LFpeSFNhB(4uO zC6=d=oiv8KlF@1{IVB^CujOmEBe_}%$>GE0Kq$D5H%++0G|^Wv-Nb_FCI+UPl$$Wd zar0}5ZsM;bx`{2Ko8N-|V3^?5lasZ8+2~R>3R*!;uoqNmv)< zDeL$cEFM@3vBFhWzvmeYk}Br5De702=XtBlStXlgk>;&DW83-U(1m~0B4-7WDNwd%E#kQM--$NN0N-eBD}H}IPXOt24#Jn!+5 zd^02u_llFC=gs`H_r*i0^V$f=t822YoEtwoh7#ApGy;tch%=;*EB(g%RKy=(+URd} zLl7z2=$3Uuuu*&z@qXh1_sO3>tq{wA(5Z{`Yb8*U(M?{phSz2x3YsiL9;*V)wXV$% zj8;7tPnl?ZLcHNUFPYX0r$%7uD{AKpg8#u0YcB{2i)%>{Gi>4`V17+5Hqz!cBG|)+)fjUkD zNkcPR(M=6ZT&8txlJbc4b52+fv}Y(?Jh3t$jfKss+F3WNqqgWf?SBP=cB_u{^quw2 z-fY4;cjC<6lC&$iU-BMMU1B1nxg5uck3AP86hY8F%v9n<=gLi8FbR0+Y9NS}1cSuW+(P*n^-kfIHc zo@vRB%w=RQLzjQ;;w^4&cXXzB*!>c0A%tz3?)r^Z)i$7kf zUnx7NXJrPjuSwEM*)APd>^$FU<`p{~v$Hc3G#_Pi%F&SIzm}t+h^r=e^7F@d^@|m! zYQal+(#-OzsM0Jg@*=I`xMW9(wAqTQZ_f4bt+*$?f-|D}4V)2G;QbbCa9qv^4)6!> zuE{%#)e`=*g}h^aZ*_R?P2oK<1^HAF)PWa!T1v~O1c@is6)z?{+NLd`n@&DZFY~c9 zL`~pzDeXuXFLa3dC>gmplLhiN&d(T>*GK>slN`CT3!1B^&aFOKRjx)C%2|J)U_Eb@ z&uic31_COR^fO^cK9FP@rSxd*C>N=o0)|%JJoK?z`KW)U57r)oR!PmAhzDRaM}%4v zhw3!U8(oBHqZ5ZUI=303E%INJqy2CafBU@6C+uY(mT$clfBS*Uhpw$NH8<~k&2&Ha z67wo&T7wDLM*}?BuJ}aSx*`w*j`yB;6HQhuPF9x~Li#|5xDuLVTlp`N*=uHTX-;1wl0ycwuRK%uyaf6|gpWu#rx8eu z0ttcyTB4-V&3>)0l1s-!9$Q*N4^z*5gmr)qK2t!dniW`vUp&gY_+0X?_Jt|Zr9`^D zlWr%2Ko_4%AHag5wvcgr>IM6slIA}>f0X8S6xP(ZHRm-86NIniQbXo6ed)H zJh+*MogAq?Oxp6E3O_XyybbUnBdGDJ$+DhuQ0!H#${RDEEP#Q3N8Ju3_4z#k`@J)w z&TT4>s*_o02P}xp05sfkskSVz1t*F_Gmr2M z!T~&ZW&j>s7~EV63qsR#@eGyA6}AIz4{KyHOM@YfjAS|Saggi_eBsog0~OeR_*Anb zsd86@$>tmBeY!3EidH?##+>kFMMt)wumD()Gk?zPIR$z#WwCG2814JlmJ4#M9qER$ z86?Vv8g%&Z&-yk|IdSHWB>kIz$>B`eSAs5HQkYH=5@Lz6y>1TuD}uFcM%^nzHgoGQDELJgIo^{{#gVcghQ~ZjlY9s)N_Yeq8lq$WlH^Lpn*mm0MBZ67 zGVS_#jy;k$2ARto5=$Ek;V-@w&zvF~^08YYw(SU0=VduiH@p-zEaIJ)qlQJS8zeO> zV9Q{sVF4>%4l5S%)=Odq6K{vxE`mvh4BJ#e8!~8_l3lUiZz$UpWYaeI={6LJ62>ZW zyDiZwn>CZc87Y30Bk-yUT6s00iT9-0=C*JQ2PMHr>HzGLkguaWe~mI z-l>Ah$A652bx(~MG}O`jWh~&ML15;tLA#Qi90rAA$rfwSuAoY3D7qT8pxhD`6*Fo_ zJ=AZTN$xq@jC!Q^u0eAGFeqaB)DnsIV6La3K9wLb0h^4AC$CMaY$m1Lru7gs^2~dhB0> zJd(;W7i)r4^>bgl2%!gMd?39<5r>ka455A@HhfE6dPRsi@DeOSOi3vgA)rG^79k+< zlZQc6?xzofdjscNLPHOZEUA1%WvBp>KyAOidBg_U7=&a7-5BH->nl}9@#Hr30(7V@ zR2|h?Egj7{q0ks5&Q)kiLX$_io?41XP^2bsfKFjONkK1(#w%%4dE7#ur?6tCs2@G> zsU%ZWL>(x|2)K@>mzp?JTy{_gk|M`S+A(4dL`=hu(MTWyO9OSTA5DBB#f!^DP(PU( zA}KPYd{IVL6xgbbL{{yP;uBReyAs7E1*KPtN@6(Dq$BCCpCaWhoSxFY?~0o!7Gpf^ z!oeg(g{nHRB5Ds*SaZlg=mKG!iVZJhNkMz4WI6XH`e?+33SA7WhYP64R%0wJ2<7`i zV9)4Elp3^SLL{YhVD21UVIHmtrBu|1z?Bx2nN90zjO0uy-u=_kj5-lfbtfuW_OF+` z(XD&rZeSVq2_s+@RIaW_a#V2!BC6p;C8z%4;Ar?@6(^M0jXjp?I#H?NjMupF_oeM0M?xp z#!-rj`Exa@xv~hqo4i+ZVo!uNNT_0tJ0{F_kOk=&^2o^Ny#^XcFK|?%-%om?LQh3# zorWeztCt|1U!o3+>8c2=8=*(q0$V?oiUlXtpQlu!VL3&Em!h*vdZyB!`)i5Kn<{;i z&6X$3dG%YcSR!*bL2LrnJSIsI`UbARM{a^v@DpYVwp9CD6-U&$7V8IE)s{=VGXaNc z@=1#|{j&>)Z?fkBx9K^}=QalJL`3^)6BhcKBb=rc`pgJ-IA4+?_!&D5Cq?s|Jvl-S z)hn$8&aT=r-y}?g9a6Ld5w6Jc9@O2Za70Q$b(O%?Acb3Hir1-a z!b2yPxj=>ZL$(REm)>|=$tTLG=VIjRP7I9ZWJkm_?3najV3FtNJhLb}{xyCR<*BGk zk+wpq??j=t{mV>(59TYO$1J4(OF-S5;^RMJA;S8bz$HJ0>rjfvFwk_Qa1BrKYyw+( zI_Ei%rJ(If;RwVb2SMAIs=Ghu$rC(s$7=S@i_nG<*%HgvJt<%sn_O3b! zA2Mp0NZS5Y$CgXc(>cZGgY=CGT^FGZ5^A&PdFD5EL)%?b!^?IkMI48|ftQQelOhX# z#7yGQ?4_s-O;=Ry*8=+(XiL%+-FC}?Ilu>omRt0Xe;hjVwMnX>6vrm41S#kq(mR#s zMqpRrqgQ`>+rLTKVyKZxkOnmQq6X2d2yGals9a8v*D+aFIoyfRItjIT6@8t93*Ls? zIl;Xult2yuHw7-N+nyA0uvBIewmjfKxy6B^J7HFYHgsrU=M`>WDf%R)a6X0h54$#f|&if|$PLM7+?1?u9$6Z{jap4j+2Qt)NxW#@w{-2s99LZ zhPufA5H{3#RhCtr$;m3AKy&(91*EHsAZ zR?Z`7iH1)@*W!T_Evi>$gdH=UU^qme=M&nnNE*)3QU{ z6DHto;jPlo@0ALRWkg~S9=m=^Wo~)g^Mo5V%G`ih87On(W_*5-=wRqwoGX3-1;L62 z)2Pzb0^WC-N>Vf_J}(MJW!O1$1LB@9qBKmJxfQjxXXf_JSng6%hiOy^$tusw-4X(& z2|Jkb`&C3Ct7+qly(6RirE}J&y^8%J4Q) z$7v`_T^ec<-AID)NXfP?VIFuZd8aPklVC`;l_H~(4{LjhWhhoK#mLxjq#i!rC_{Zj zhLx*n|rUH?);E3gKWht>C%tf{+SO!-)X)_BD z*w6xg8jxH)|Kb~+glda(uc5jiTI%^CGQ-MTJpXAE^GIM6TknAg3=x;A3a9#AvCwWD zM95o>wy^Km(Qlh*0^oUH=Ex~MU&M~_Ud&%1^=q-lK*7%-qz#noy_%TnK@TzTL10G< zc+34!IxG^t;sbqa=kQqSrCp+ZL$M_W)F*7trYg5~F8CxQJ`f3W zMM*f$N?jTVL`r!K^;aGO<{;}Rnwgejgq#wf#~urG!Tr+n#0V54ap;c1dYS2 zrRX&eutJBb%5U^AJ5WL`BIKVf$BK#vA6ymf&9T=|U-&old=Xu0qAwgnlzqPN&)}8l zN{^Blt(ui%0kw+c{wFBZB|>J`q2@C_;@mj8@3?oz8w`Hy_T7Ti?F&^eW%}WOcEZF# za+bvv=iQNk=NOn8G(7nB4eJ#w^G7mp$x+P;{S3%M;F8R9A@E?0m_(|5mVLY5B6n|5 zLMz1SWmyKciN}i!MBTHK9RhX6M{5209N4JPj$L(~Ptm~*8zBeKikx_fP7kCj94Dk& zGc@=IzVgM8+n)I{(G8Rl%^(g05_dL$^F zxpOS6;Gx4#9JI=zfgyV8b^GA%RLWsP`fud&r&=Yt!po97KB!@)t(#7SKvxTRm$+MD z(R(8ae+4?M$7GvQDOwRXhTS!{RM%$L8dy(RuHQki?p3+9qsyHTxX}XMa-RvjRv2S~ z`wv}dTr+-(*J_4;Hmvfwi-tDI=WYRp%Lcj=U8to*Ij1QSu+Lh+Tk1<;ArH5zE0N8m z-?f2)s#*~P!>NJ$C}@uc?(~4=9tba{D=5}bmHS$iTe>+7w1BaP;0o1OsH~dR3@Q)P z@7kFJa{{++mSES-c@2>{WLwV@K1=P3xsAIrFV;9u_zC#jJd}PxRZkI3pd~#*5^4c& zw=4^OBDfW-h-{X<2H6}`w&w|7GR(0#*s!+77PLrE>Lr1by<*_)X(B*0H3oqtEnsxY zTLmQbMt2H#(Yx1XJ?5^id=Sy0S$Jy+XO*6&?Bu9s+!F7t2w7Li&=S~-dv_*y5lrM^ zAXz2eV5JP?uU!27c~w?*#cFdGSoADSOU(8ygg+0V*E3e1y zGta4LJ*34@Iqj#^MuIGOPm0GWp25|A7ZnseG(d%BGHA2QGAOYsA`g zj))spNFb&js!f4H3Dl{8Fqma62kGYBbi#}ZX-1mM{`gn6kIJ^Z6U0jfB<^6)|%!XX$ zal1@#VNT?RncNBAm4@J4SghIGM~`0J3+_sQsWeLqfe8(#O$EC%$D7yk6Ji_=s8s7p_rQI|?eR$*xF8gZOBqmHCO z9a5U(^jD8LpB*PI3G9*JVN6XKG;s#`I<4kKz=Q`|Pn`?V5ZE4dDe6#!aWoxuu9X`4 zsis;T#ywI}yyK)7o&`sYsT2oKdgYN2<1)pOo9ed>?vKFg)sW68WR9byzO9I%|NbB7zqs}Fw+Y{PrnJ=DL$%25~Nxh~$*`yfZfLC%Z#gS*X% zQJ3IxA{lsg*i=c>sRZ{AgnHE_X}iyuO?uT`cyd+(bs_L5WbA(j+p`#qMF86z{_me- zd-jb`w;#rT{>|{u58yw?MVh7>|2ZuI|2Z!5@A%K(@t?orKYz!6{*M1F@So%V6Zp@> zbopy7mmN;zG@ERi+j9YzI1n$c{jVXyRaY^IUVJZX zT@M7{Who2@zRXBuSKH@Sm?Z-?oiM7JmD-DAIVuCOmS>Z*~<$E&#C= zSsCV6JnYs2B^JRpEU^gA4J$i>^+te%MX(=ASl}3!Mhae}#7hR-x+j$=PO zlL)HZScZq35Tgm7`OLX#KGQQT2L{BN#&}X+;1G7tC@ z;z2i6G{APmL*CC+`e7$cm~1zWbkIH1FCOyCgju}eNC#d0wfNWY$30q0_8XLBLPr)* zk+Jbo!IAqh3bJ3JANx0P&HR?vo1~g}yH%aS{aKHJtbAtT$aT5JE zz27W~UExmLb5^B+rnsRT3WMtb@usJD6&bcjZY%ELrx5$)g}8Veh(ph*+#J8s?=TMd z9mba5VbkD)O0# z@9Fqo=_#2793?Z$PqHxGB+Ey7Nsb@uB&mwr6(@LjF+V1k6yJ5~Bycl2GH*u5=5<4Y z4&o=!VxJSX(^C}|`B=ms>3HLMA~59}!c14)9NTDhbgRPfW`+Pr`pUA({Wu%ck8_Ua zSEu>S^Ze>GKfD&rLD>96ztBGaZk>J?jUVt0x&O+K-$72tWI<5p?FD&ZaaVwQab*|^ z{luj-r&qUf_n>v{JPhAigz@gf@U`-f$1K&91)Lxu^Ys=^Kl8t4npa!Z0+3 zx`OO3gRiM*u5=$XoJ1?A+2B*_P$9N^jiJ!WYW9J9=v#5;SrN*uB?)P+?w#HfuhkK6 zbW^PPJ7U%82$E*W(-CNPIJQ>>`Vs@I%x-LUa= zEG-Z?Yb9tOr0$)6jH5oB@!_}+|M$;0>whPp{yq7hi{JbGzf78i`~F{ifB*mf{{Q{` z|NHy@_xJz*Q}6$UR*)56s~{`v_y5VbWr^|rA2&S)0AcFqtaKG*iK8IPevN{x_;w1i zKP0m;pp5)ljTC5}{3@x$r;_?8RQ-s!@+k;*^+CV`m4y58jd)F(6RMbjcvMqdbp#3E zlIop2Z|@%_Vqz8Mv$>_4(h8j-py)|VMNe)hddwI5j?i|Th@0AhQ0^QH)m%@Y>SQz4 z%XP=E7Ks!nR4)|y{;S^DTZTG?hn@H_!g%DK^L+mPanI+Gegs85(vkg8FVssk__H6C zj7J_D&}7;oL92r_U8Tk>bMUp7g(hfKScR+zz2-%Ttk588U9n!y756B8JfAY|!`uRZ z&?!kyUu?ERF=7r#<=2K}rb z>n(UQ%L19TiD69SQ}=qxOw&w)Wl#!xbQk|fp7B2U z8xW3UA8Urj|Dm$*6P!0qsLC|SZ`YOBhlOzeh)CW5SE(-<<>Nj+~P+9xh;Mzj$4D` zxVCgytjuB#j`wISm(Ts1_$E)(jhh;K6{IUfW1X!+FNu?dke+g zS_zx?4m5|t4^WT%c;7`c5gq?4O+@m5iAZjlh*YMDNb8X%B6E*65$SPr3)V}grs)Ts z7FBO>rw264I5kZ_X632=A-nTyaW3DMpvcA}yNwBkmxU$$#BL$ZDO(56IT1co)`I2@ z=u2=NG;jD~JmWj?GictRU-`E^MMto?o-TS@nbB+0`dxp~5evE&v=_kZTp0eSt!{f> z3=?F_+ADRQFz)JR294n}CH$Caosw z#A?DZKrxLf@HS=_8C_0pP3w{Ns)>vkU=UwZyz|B#W=-AGy`~xn_^=f;)!2gay!+;+ z8o$@&11Q}dZ>sUzFCX7cHU3!kA6M~y_B-2uq-l}n+WsT^ZvXM!{^Ps-$9MaW@Ae;- z{YUlt+kcF%eqZyCVfTE{Icf+sV$@)B7*vCqPz}Ovqg8`fk5LU)m8BZYCaVSu!zLv0 zs0Nd;YOpL^)nL=1vU^B1c;%=Dq263II1swQK~Om;{=9iuPxyGfToF>s4e+KrP>Q($ z-f#z&YOV-q<|aNisuvH$p;ls+iUW3QHEh zx1bnh4qd4BRfVO8yc6rbr_Tdnr2)mM0uPhKN2xrtg3X@4ng zP1OsOdex2#lzKBPXXLjPmNN$Ce7LoY{N5-H+Nx#f!PRag6x(kTM7L~Pl1-)V(v}{> z$)$8xL!=gz@b?*A`IeP6$%1VQ!u6~Rp#_oCqbVxGN^&v8#HJvLMv?5-F1aGeHQ#5z666qZzyFlMNY@%Sl=Zx65hzGAFfAXvcWGlDYTXc+5VYcj6^ZFs7F~ z(9nq&bOdk7D=B&2yEdNpEIyrFygMLWn*qO- zIRPd`>OslVYPS8QB9lrb`B3~xya=vKJu8XyK3RsBpJS= z77He+sj1<_WXJ`YC`w#uhB*~p{`JRZ<$4q^YU|Bky&#bb0S ziNQI$`DfWmm)zu>P3@ix`pknGB&bWxS=jHATDwe5iO(tR0CF^63EPaLS0t8GWW!bq zOX0wbx)D)zH|oqRK%`LIIBVje5q`wqoSpFa$SiiGnYiH#&m{S(j54oi6x0IkQfgGT z=g4CJc7^a!&HSb$e4YGFe~%xjuDp`D{v!G%NeQm~o|*|C2p5D3O%iIsVvN=_G+NKp zr$5(J?w_b(%#?Yg{Kdb#NI#yoAThL|IhA0^e=z2@CZPy`uc2@oHNiC}xF}xO*@XsXM^^`d{;?O3LsNAR-_j_(+VB{9Q zRLG*Wg{#y@lGC~|gTjTPOW~f#=RL`1$uM-A)X4+kkaZ>85kOtIW*O_RL)G4zULR(U zt#P0SQ|x>~ccuO|SrWV6j^*US4Y4kK&5{P1WnF?U)=XC)0zqkSgV&1J>K0jS-F<}= z^<0{e={a^CoU6281}G&@I5b*nO7bvXTJcRv!=5;GAzrSw% zuCH6EI5QuJ%}YXOp9*Ecjerha5SyCBxO(%7<{~#?uJX#&(Odg#;RDmTI#SIl##z{4 zxVqxn$daG)H-cvH>J7;l{$xtY4rYQWr6nWlx6xx=45SnBi zDc{bHB~yD8ekO{-Z$G~G8{bop@(}L%b3gIEaz(^@w?WG}RM)GM2kJQ%X0&rN6vA!n zRmUsy+{xN_?Fle83~;$N7j0&*4WPN6|4Z`^YS1YJU4xc?$8b2DRDby{jPDbM4fJFs zx_ZW&tnCik$wN$v7pT$N((`>1kw?^T&ASNq8d za|L$5vZ)I%-bg9i+wYZYZ=@b0dj4qGD1kGW3^`eILYo0FR2qf|%ncYBq|#|QP@ z%ExiCHagOe14vq{*>JgQFtV|cz}ADR`$#F|dyn|?0Z|i^HT<0DcOP0V7Wd_C}7vSI1}z4ssM z*@Ikgc+8aq+Bfe^Zd$BK1Dlk9#< z${>sM5P{H1%blI?Z@8Aeglr}sTY@%=3YS2RO-^;2rK+^(Xa9<^^+GSK76q9 zXeG9)jK)@U;g`i5RzutcMKHPx#^^7|AG{)ES7wYJ zt2dr_^`XkY6DFEqM!9Xcka4@bd&7aRjm*1k!)44E%G-}yjL6K}l1wwGWq)WPq7!^u zq});|C-!nzS;F88&arLJfE?|yzGcTJVu;txA%5ia^6}$(*%;#5E{DHDbsy?wI>e8a zRV+_@@?hnA%I@b>y+888_Y|0rw$SBPF|gG)#8xkYPo3T8^W!?4mi|;3g5YW!Up&<5 zM#FtpsZVw4iFN1CyQsFtcUoQed!dYn9@f`S@t%!tzI1wzowe=Dfi`}(LkLy`l(Ir^|DDUD!y=py;Ey{#% zYv0@{_W#av#lOxi_96W5WIs)Qs{`mn|IauFzfbM|3Gs23WZ(I}zx#iF_y7Fv|M}hj zQ~G~q{|E5D#YY-!9Y~o3>wA`zjd>X{f(P?7kx+54`+O}{obzU$=FQ14;i*BS*YXjC z=V74mxQg9(^U{7dkCW=_5#ylx-;gZ4Y66>1#UbO=udJD}y*JBRaZ#bDo}?wqx2&qPEQ`2oHS;nr%CyRhW)&wU$#+r3 zWmTjlC;67YT5&6BRqVg5R$1m{Q57uHCM#_b=XsKqNs^o8i9wnbo9Cl`v7Cy$VkeJQ z90LnqlCU#K0sjIiU&W3cO*5ZXl2&CaPkFu6uRLabSFl>Je_~eKs+G11RzViXS__aW zlETO*W5<^`%?qB7`o-F@*~*)2d^Y2vs>&ownyrF&18cxCuFBlVhc#r}WM7IgAN4C{ z4U(0tC9-A{Q2L4_W|?NJzgkI^RcYSRWP|@wl0Y~{yTE)cFh^*8@oL8tVGtof(YwMh z0!uLRK?;ZmA|j=RDa5h!5}c@>D#2qUkA0_R|WQ{Yc1LZwTXfL1X99bE!N z%AvJV7??Tee-e01P7#hV_c=~*M{|60-%#!u2hy821y9QqG(jn}UyAy$ZRxwdEo_C7 zH?K@bm?Z&F2d$Gr1E$at379@4P}LN)iRrp@(umP4`o#8{G5j=Q>8`#m43^$VWB-AA zDZf>kX!o(@-_^erlz0*kO4Q|Ct1hhxBEFLlj%3J}hG$|Y> z1k6h1Lm?K2FWRE>tx{=tBK5@W1-uW2!ZZsN_&28A{ZP$Z!|I;fuB2`_z9(qf0#y4o zEnEJ1%3R=+Sf>Ioq&jB&fkTa83A`}`2swfj2$3hKG7czB0G6?DN}%U}>JWVTsH{9% zMz?rHZjFM1$k3D+(Smy7`Lj;y`fl8)Znu0omW)rLPTH<~PCx3E7#SQ3C}J0EgSHPy zESLg|M(el&Vw6ttF$$}B3jL7c$D|STlyb~}L#qnGX-@_BXmD2rcWEZ?RB)w(bs6Mj z!Nmnu;$%@ViD&_|b~8O`R8+F6;(AWpqKfOuc!cv z7G^QD1S0A}M|I7pggY7CdQv4r9c89cCF2_lLX*H!nc_me_DV;yNF1oCnLkAA=!hevjK+6yI+_J|V|>6Pk;aBZ4`;KP#}fUBN8rfF0czPY;<7Zq0`-EQvLEN5*RwmSkvtM$t*&(FO~$ zWlE?m{Z^J^jS7$jLmf*#O30+-SV0?68R-_YZLb6(c1Oo{o!I19_;7pEa>$aT$@mY^nFED|h9& zX2%vvPW0eZGw9fnQi#-vnj;-ssIPK56&YRFB5Kh(6}dQH+B572y2QP1in_*OCfg#D zceX^eOwsIVcmAS(|3de$U(C%`|NMm65jB2PC|KE(&+HYKfd|OoFFMeRxWkf%gJ&Xhh3Ru}EmOsDcM1*k)Jap;@Vd z??~{aZ6I}CqhHVm)V{bHRf|+$&IDG^j8ZR|=;~(Vm2%g(q@^sB#|90q5Z9?fT&HT8 zM6|G06+TECEiJIdpD6|*o_$LNFTHYyPGs=9E35u%^RS#%#tJ*e(P4@#%Pbb{wVIWhege`&Qt~f#xCW8U=XkCwCLE8-D&Y5xc_a zpXv&#MufL2#S3LdWM~?mp}Cv9lZ&WoK}6M^s5Ny7cx&dSFAW<;MB5yTO{>@+%+Y8^ zZ_=aE262#;pEb{8Z?R2H5n(0%nAd=u+St-y307RMkHF+^@8!{D1bqeT}u?oY*D%6p<^EIV7Joz zDVv*gtLA=s%hJ#)TX^86i}rLGY#kZw5835}+b6d_JD2{0SzkI9W@F=K^V!SSA!E`L5g^cqduzVm ziMYBOhweMlZ*JB4-UV^Bv*Ylj!Mdm6*1b9sadkJYz`AE>%A74(byya0bsG2h`{|>Q zhH`jFOJVcQ@f8s6oh2+5IjjXKzB0mzECW?;w(EQC!Wei~OW-P=wGpES{#uhTg4uT9 zDQZnQU7^mnX&z42OpZDGI4wYRL-EGpC4ucRIhEi68LIU0?7KrwWyz7b&m_hvH90jm z88cRRT)xFcWQ`v6R!PJr%@1!G$suAb9nlm!B*HjXDm^2?QC>IBm0BChMet&_N=1^M z(&U`TMoGFxCT*<|LJ_j3(A>)ch%X z59@05Q)Os`u}PBL$Yk48D`V4T?|l8_zYHR%R*Cy1&I)|VhyAO(GH;h#8n9R*kjbu1 zL{#00D*1^H`J%HmGsATe)o`QG8#lq5d}3a7lFuTl?nIURe1~jgnRPYZ6;TZ*DmfFl zXprG&GsA(1YPeDO4pyQ=sMSzaS47pFr~|MXQ>&0|il_#Onxvvh;S`^vWd+=y zQaE>{a5zfg0+ymJ2pm3A*yB_D3s-a4p7TBbTAad6PvN4J!itdJ8%0b{%(XbSW_WsL zuEkFLthutLR(yd+unb3-++}3zycbb*Cn`lqkrasr(-R{qzb8>=W-9zviryUQtQoan zF7b9T({ni|xp50`E>lI5D-J**bb`%Uo2Zsa;c}a!%?%p5z?{sjvJK2dHn+>RsLD34 zdVJ0*+ecFM1vB}`T%(=raW<#uu9}+Ylj)67veHVK>$eJCvRSOFRkB%<{m9IItSUCt z4P+)yZ`D&tYMQj9rqbIfoaUwExnoDn+Q5-1-Vsy8-c02^haH(jXoH5P_w;!JXJe|t z-SRzM(mNH1y5t>ohdywm7H+O%+~jx+FsDG&KKUJf`46k?(ncRQ1}D zz=fHR$mi!5d*6%KPDsAI<1+y9b?3 zhC3%LYI!_Kmy|$9qL?-5joNF`ZWZpa>q7sLVGnl%GnJ5)e4JRsD zphk$ea3=QtJunRMaD~nL4;(GvRG&hJr*L1)(QFm&=Q&!_;=X`3yL-WJgZ9317OPtkTld8lxRm9H`IBc(&bf$f_+m>u&m_2`C+kj`H$-gR7hB+7o}-2^ zA3EP1iP*X?w!$~55*1i(OO|&cw&9CSSCw&Ty5gO!=^OKyZ%oMaqqzne+YTEq<`QPc zrWCrslgr}gN9BcU(zLiLlb^dRyQeq(#yA0ct)@KDc;0VL|sldXo6+Ks1PSa zzGPg+V`|xgvm^avl<}Qm9fOl7-=Y%fw%J5hBkY=6UTMbenOmN9&iy5L>Vh>P0To_? z%K>@;fK_~s^#tu*elltHrl9Z3VR^}MfdHjV4w;rXqu)3~f78o4Kf%luY{GI}flx!a zVcD`OW1v*8XPcJxKVKpJx@~3fUcuz2yH>Id9kpkrLMvo8FyUmkVmsh<#+BG1IlkQI@2qs&BCg?y!&7>W`lkG? zrGm$@4L7dD^{2$R(i-U1 zK*ZJExa6HN``t-H}bVcTurtQ^jUIUa{W0hPnOrGk~b1-nuO$F=Gp;4oFfqeum7 zdI@*<67KsY>{k_3zJj&5+V;ExRfiJxr-DOi1!{u|J~S7+%768YlZ$*aBQwtgGX81qwweoBO=HChMg`yme@-r z>M1&;k5(1F;|etk>MH2Cm5FypJRYMvC}>b}$KxaUq$bM;>3NsDckf&k8Rj3Ivm0Nj z(9|hSoU~mMn>%T_YbGks6GzjKABfn7H&%N+@zUcqR5_(j3$;z7<0g7?rEVp)2^^Qh zeWdHiacZ_tl!1+$fjM>Oi9(}wR=yH1bvYWa zYwDyexlSD+AyY>!l;i76juvWeYvk7=w&9B{QKwm=2|(#sOjMsmY~34+W#&|%PGfNN zv{k}37kV=nnc<62g|>8+`Rr5OiKx08g$+|7>~Cf2#;Z#a)o`Lp9K$7cV`;u#RP!RL z?ndEiRN-~ES}~*WrK>_H?aI{dS9l$*(B`2s6&%$U5!G;`@HkRo+g7HEqr%fqg*sEU z-1-#|6>cA(OiuA3IWsfDR!EStC^dZ-(<2d8ccL;>38Z*b%~CVN3lY_DqxiM^jL^m^ z1w{V(Nc)71G z&8RC8)gV#weWK#DH8^gQb46iwAwugU)b1VhA%_cK1*f#?Cb)H0=+chR3cH%m{Rp#-8Msgt-w#d@h7c zBP3ICkqRO2t1mtga48Tn4O50S1xDbdqM|MU72f|UT(2ssj;Qbm%NDG<-Do2b(Xb=% zQd8ljrlJao3NLmQ&W(y(?0Rm=@itMd`DA1RtYJ3mJ`vfD6<%knSwn_*Lxm*+LI5D;?KD!5N=t*Uo zV*8W9TU#{>BulDbAZ~CDincZdWjbTQ1-Ua zWCX7eEpk>*{fkQpN5T@}EMS=_;b>dIxvt91tq@0ZxrSTern&58BC2jj^&ZnI{K69G zx^O3WlCc)Uk|6qZX|CvHPee7Gs0z1;5|1FIx#yH`MO4F$LMx>b*SGTAjN;F4_~=|- znBVHC+7R#_+2UqxszSGzA&hr33jm;n?>!ZAy;r6UO@+7b3RNVPX`WHys#c9Wa>?6UCBnjdp^`0LRixJ_KhP{tzg?mpt)vR>suk#69Nmer zfTsRI!^IzOOjg32Dd8&Lf_rWY@oL~USiUp6e#bvm`9jmP=G?V+etKnFsaFh09%kN5Q&TZdtPL0{xF`?%OcrMTNQ;vVtb4$aiUgA_QcOBpgzEI;DQMR2})c2L>URl0#a^4oP4Nt6T0<5Y> zV9t2a%bi*N zr3}u%1)`gQ8n^{l#@4Y%eO!S0IKyo4FIWOwpf_lNnym%L)B-fLIcz8eD2)pwz5^X` ze&auU7KqRW`s@~{d0U8W)($Sf8GaZp7#aFEQrqwXPcj*f$n1c=`W}jix*1`*J^7m+ z0Z%Ib4X6lqvXiR!h*U!H?;lXXwZ=)rng^?kt}Ge7!?*BpD#KfU_L;Wak$3MzSiNl7 z$a}@Vb0WN6W}JtzJ%6U}5owP~7TrLm=-qD2{uZ9ATWDS0q7P3k^yqJ)PPkRk%n!XQ z3m-#=MuA8E<;o-4;v)*V?~E~+eGm~1E24!u>jH1U1-$_mHzJ}zB3zwk!5>wTIV3lY z@pIIq=Xm+bcgz#iY2XCa!3k#_w+{SAGp{V(r3$=D6{fnaK!s3&nxeu)8_0M4#mUh; zVbT0VaqcaSUlxxw1^NgSraG~BC!!i|6gS;Pf3VzCUFN7_&QS@Jn|kD&+l^sQ=GSJ1 zZ$wmsMEMWm1*lpJM6iSxu>zjZTCilcE`p0+fo@u`85Gbb1)LQMGy{R>wHD?BYi$9i z`WF5L3sFJmNm2P1A6(3{kue`WdRH8eWO3&0DqQ`G*pLhy>0MFx=vyHCDsC(2{NR{I z6+Qom!Tl$9pRvvZqcI>~ocgmzyX%pg{cRxofP8VG2ic&;0%m~w{ zL6?j`XY&L6sX8b+Qq2{yk!O=+B}C#GVZiA{(O zfCW7u7ef)zFe7@8_zsSc){(y*0yT2e7)JK~R=`0x@XwVz*a~K<@DmO%}?{bDoFiLPi__%lWQieXq;YzH#+h^_=g zQDI|Px0jj!`yR>4fBeEmE)C<$^3Z#*!%iqmqojM@GZ*$*v29511P+(mDF689i~>)u zi24i*Tnk?ukkG-ziYs;lTl501Z`SNu^l#EW+1Aj%lV0H(X~~WQ8?;Zj^uLp!hOSt( z3j8)OL_EUgoWiR;ULMho^l0MC1L}(L_=M~TU?W<>?Xz@j70ZraM~#L0=p5F|B%qiM z$>;tdiTjUhu2>!f20IciWbR$#ePDF1;J|X_*ZkxDEv9jc!@d2w*SC$zCG z4j`0ql&v#pit@y-h-VXXeE_i#xC1rs4; z?LDHTMyg*;-a5bdVGHS0V@lqtLQ`*O%Nv@Mzn=dU*4!t^ujXZdO~AJS=#LVBV0eH7 z7PEPP1a@puz+xJc1NMB>^-#e6I_|!IZ$dsco+c9VrKLg07Z)BzzBr!1$d^}t3`V}V zl{Z_>G)V+=o%q#^fom>dN5-rIO1GlQ%CeaxN!Dy7Wzk~MmC0Q9jhOv%_CNL^@V8<4 zs9(*vRp95#EUD6F6{oGNV#k)M%+fMzrDfdueHa2$)(BOa2}VBkD=qS7)hf%lWUZ68 zS{18kGi_B>QIt@{j9sUH7iPczn~Z#kpwN@7d)17lS4Tywpc8<1fOEltwSpj+uV^-i zZp=ZM5h62I>|lL~E{Z@moEGR>p=rR)1)YM>;R_uFbf(vWI1G`ykkyQXncgVAi&F!V zn=`Lv5*ZH3F%V>eR2S~1CxT85^yy%KcOiHw1_CG>(GC%f5n&n;@GVAf%-pOr5^tnl zHbcdSb|)ze$C5qlR&uD#A#0Q%Mf)W93lJn+alOM=nhuR$CJ0mDS|fZC4d%lslM`^t zWIdcRIS;2C-oh!)Ajt9{A*Bi_M96{3Y&gZq7FlL+f)gPevJTICA_To-@RTR$=a46+ zjs8(Gq(w*@r#QbC|4>VWAQ=&>1pv4}N52WWQ{_`anxat#bqO)z6sLXQX}U7ap-Igs zc#8-HrMB zAPwuFgqrH(=dbkfaZ0n)q1(m0B9KJS|0Ts3K)`^x_h3_p3embDissufTB>onJ`G(A z!3{Gw<{3B4jF))18nj%o;_7LMH3@MB_`8J$f#$xDa@lH`B5D?C5G>?L6!~gq%S{UgH-cYXK(h)O3vsD#{luSH7mH4B|Pkn+9W3;bUMG*AA| z`G|YCk42_T&Kzk8@o~SALSuV4qM1>Qz?^YQ2jh!ZjOHxyk>;jN)Mq;~M|*&CZZG~> zIl|djtk3R=&(_V)eiWZ=7@tiP*(C0pnBzygwgmP3qZHZ;%&d+edxGb8K^Mz;a4WhP z+vHAy84#c5k44Bf52@>ro=KBC#o3W~J~C%~<3|TR`Sl$h(hwoWuuxe4C!$_wR^65U z5l;&sv296cgsC$jabiidDZC*F>;&2lIbu1+GlwgdYxr9=_tXZrrskg7nk1ldLjfua zWL*fXlR)I2NvF73NqPK60-;Mi^?x;#b~@aMWtp`7omuugBuEFSjO-Z{Tukt&>umW>#WLb^yWN+ZLI6V0fFKOxmaTc=T^2sn`>-_^o<`#RYu>c!d$7U;v|-wqOv#|6Ps&HQ1Z%<^o>4FKhTrlK>`Cve*MIcxhkW3 ze$3Q}fXVZ+A1fO9Q!G)>EW17&bFKuGJoZQ;hJ=e{Dq}CaV5StMSX~FPws>4lF3iH* z8+SsKYZ-FhW;~NHtY~mm+!|Q z2BxM_lQEo-1+lBMFGdW0r@&j3S!&LNQ{ZJs#`vn9At#CAHfD43kcSfpG@Mgu;ly%Xo@+@ATM+;RF(h111P0G#Qq!FynNZGJU&3Q%&M0J!g-gRt6lHnl0zQDwnt+^tq z-mt6ANo_KOm@tc!tr2%Jois~E^_NiN9PDAz!@@jVNq+OAZHbXG0!L0aTly|E-5_PdE-=UFEAad#W4w#B#))4;EM}u6S2Z}BStNuOXARP@8YJal z%D951#tOzE1yh7#38-4LWa;hRDacrF3hyop2X16vA|oXS!#~jTj0%A#&}n;T?sgki1vadK(^&=JO zF?NxWNk#+P%Hdm6VA?clfaEXfBk_{2-Od_ zyt?>u8-Fs3(=uOgx#XT9>21pQl8u%_BbY1JdyW1Y?;7ResM~mb5geZ~rX~17A*M1` zpGy(baAG)3WlHd3Wei7FL7(lcW5jTO2ZUBJOI;p|n7WSf-W`!X6_q{+^I$v#a0uHB zEm_PWWre7E!>)RUSM3ZvNit)C=W`;aVaH^ZXyS(5#MyzUdc&@|K-Z}V?2i1-yok}b zI}^0{a}sI=`K%CTC_~!yv1A^~E+h>~hDv=nhY1#XTQBxSQQN`Bm>BOc$rmrViHx1~ zvNS}5XiC5S^6zk+{j50yhUSAamyA7<$SCC@X^_!Ne%=BZy{rl}ud2IxHA&RV{JT z;`C@(_BFGX7rK^jmE@{NGTHF+YETB8UO0NousOgAbEAV~(=1Tmv?<_{>xQIkc04I1 zccTje2|hb~uuF``x8$ApT3vrl#GnyOf~qCK`VkRV zYe)$tH1DeOVszB?=%9YX83%#x8!>p!Ebsx+EHx*MFYqx@#(39EWJQK^at2k;j7&1l zY>W`Ba+MG<*8&F%iZnK2;1)?tufa(GGJ-6wjebS4B1aNAB(qC%1n{OoP@v3sfz1{~ z3F}S?7k#;7OJxgYIo|pu>qIjA?r=Od+nQnCK8z#5 z5t8ZR_1dUV+Vhgl$=J_c#@)8L< z(PPS!h9BZ3ADMO3>WFhGcj}Q#ul=NR5uqmTg`;n&!5r50jB^N^g=rf`aVU3U$jRo$ z^)1B-ncm9g<^<$Bgn-;`?kh$#}DE3&kL&()5;vNnu8+NHV`FnwHAu`6h&c2hteaJ7In-CCt;#zEN4zcxwo7!P$G_&h_jFiJlaA!CDUIHX@%bBdp>faHz_}4H+SMe+ zD`tYH_!v=z65|xlNhf2(!n0!L38K33IK#=+N@O`H4c)E)O`j)t>IQvX`G%0l_^lyu z-}#~_u8e2*1kGy`v_(j^jXA~DC&=27-WxHT>yvA!jNAk}G-m9@gGO_0ps5&1#)Abb&)Zkl z*ChLdfMIvOrs6r*-I|@gQpxMSR1b9xL3Ccjzg8v^5hHKFPwNmyClY6SF%uo>9Pv|wl$(gociGJ($5 zJOQ>)rex}t45zzvK8ZJh(m0{?oZL1D(0b%&I)SmGc_t|%vgeZx`;!hQ2@GUSD;)Xx zPC%$`332py=bJ-LaN)0}$_`He<&M9evS4`hlD!$+N)as;8B3~E0cl(-7K2h^)Raw0 zkHF!Nb`?NON25n!hVOkV3nKp&V}+AtD3A(n)`py5g*hWQBM7P+%RR%C7f&bU9#+zL zKM*h~NF!$ERtyN#pLum269hZ+x_#~GrUEBoF*Z&#NSNS}tlN?X^JK07xDXodlY$B7 zs61ejQ`hiIkwnD;;~EIxBH^WmejvWrm^<;Jh7)`#@kuqDj|(n@$y7#8G6Z9T7c2s( zsIcZF=HG~Xrs-=Qe8wt1k$jQi#F0bqLJ3{uz_PPJg&)Ngx-g9?(e}DP-CJR7C&jWK zmTK0icVTM&g5Xz6ZpztU$0rI}3;kH$k(NqCW$LOjQwqWgs!~@~;o%yl%;@*T?e~=S zdnYhnQa4>fJAO@!%Z52F1u!(;Tj;o?*lb2~y>pvujeh67w^}@zQM_W!9T&cxj${Ar zC`K6bE#ig%gkBplc!ns@qNLdN?*?LJE|6rt*zpP#N~Uhf2rixi-$@H&HRDWB6(Vs9 zS_nVk2INtZh9QkKYks=xI83In~GXYnZF?*s04XXwYkqKm?5v~H9 zB_LF{gaoTpfj82^P`)Cs6YL34xx~MDN@lp6@NWbtNF)tMKH=09D{xMv2{UYv1We)w z0+T3X@Ik2LKK7-*1>^=E6GSs-z$ux!CBw;>V0PCPNK<6+PvIylKlsOq$hS?%m7JE8 z1^h@@Z~TqalHjGBJk4y1mT07g(@2M+1`VqQ4p#(Z(olF)PD?hGP~8%eBvNQCRT>Kc zk_o}dqoD|YoEDH7qc^=#Er*x_@`Ic{J)}F{mejhO?+*?4k(U~dPC494@}Xpg$dT6L zMAAfagmuuT<)u1^A=h(?e0Js^E2;V6zoV4Vaa&8wrs zx#4L2GCRS5c}W;B6|L+Qq4l&?WC)Faq#(%+Czvb%a0pJ6)|Qf*wv*YBcT>qqXH$^` z6*6I06W?b?#&{Wsn7SQ}B~)lUP{Q1_QOk#3 z2soZlWo0Dv>L&4R0{v*aND*$d0(WOYC3ZZ|wKq^_CbvJhBM*| zG2$D}h%f!!oEL64e=y5=KyXVH7?((>vN95SNBptms^@f~hUO(hbCZp1qJS0NoCFQB ze{>=*3Od?@61g&+vs$8&8crj*yzI`gkRu&JCYm?K*~)VzRJVi#mp7-c&&*@tEMfV+ z^>5`O;|ejljcPeyjF6w^L-sclGO56hUGI+b&qkZgzA=%ATZBSothg8T|rVlB%Jn63&>$Y zd6}IlC+8)q7pw6D$3mnc%JKA!XT#6P)`WCulC20S-*R{Z%aI}g8Pj@-(CAPzz+r|T zByUS4K|*q$`ZGt3YcAEFoB>91G09in{1f4Bl7UFW>N#cB=_#{1BD8}NH>~d3oE7Nwi8ny^Xc@J64bstWlp zOs6({MbFW}B{%Gta#R-O_&k}LZguPa)5)rP#xM=d@;yIfF;8h8bj_4S(|h;_{1tn6 zn0OpT92i)0Zc1}}6kL~wmb7M@Rov$YFZo4tf<7iwEKvw0W9W@IPg~BGsjfO8dT9o8%|1KprAiQJeyI!GO$Wgh{9Cy^@t`rGQ7wnV3G#!S zCOFmHTPmmonQaPcK4kUGLg{WSp1Nwnzq=wT-T~ULERRf2| z2{LIY5=~pErDW=s3@eY|meWjeG6t{x6`oeB%G&^Pkl_8!sFXvW1ld7G$FC+K#s43N zZ%^UnF@}Rp9RJhs+xthoV-JA)fBbv@@A!Cp+en|M&$Ab-rY}Z^o%7D{g=m`5i+;SH z-ylF zttV@}!)|}njXLbp5HdPNRt3lhQY=9kc0?JXr2)$r2?t(9-5!e{MmOEz2-po0`3;fb zOf(oGe?eyqB_BqEOGsB^#l4S!Zb2n|9;m*qZSVX%I_O5M zZI7?dk>`L3M|-R7mCfCDG`sOJ+MC_pp517Fe8q&vrvnz-z3K9-dKZ`HJ(e@8*Razc z-?QRF4(p5C^D8XL?A+?wYWpLrM6|Tp-dNn(iIz6EquFR{cDubgzq>ZO9c}GyZ*A@@ zK98cEE)=T^8BA#6W9%i?j7QyZr*}S*75~UOcEn0|eiWT{Zn~_454*h^R<;gX?Jw^i z?mWn(b3W*wU^SVrZpc?r?>OoY#xv3Fu*b&Bc;I#`B-cGV!$#@hb9SbUnN+8LcFx*< zXUybT9!tGrmjBZE07xn32BR^EvsFE6CUM+s#A!2*qTQWYUNO$q!AUTB=Uvv+qo{K| z9$dgi);T}Fk4_YiN2Ae*7B-`e&33f7u-b;i2G0i@VeRWKn@+Y8QGWhX`x7TSXvpe9?&-!|q_nCRT%Oul-Tf z7#*_7a(&)yu%1<1B45Kb!lq3wh(vH-(L^Hs#}J96d14cZ6xBo`kt(CoO_xOkG6=GW zu$!^NB9gf@BF*LlG$MV6Mg(jBR1t>^DT_#tGm8udoM2?2NJV-h_2)qFi`?*kdN<Km^A-zivO`m|nH6cC6NP$|ffUQNL1F zsIsimxXGG_eLYLciWR5IlQ_$vZe`QVr^@4I3T?srOa4llWm>jaYgDWlMHZ(OYc=+X zB#l{-S(S6EzgjH3WX&K5PvkH79&2GHp0ft7@~j0JmaL)$D-~<4GAZqRSO>HAm-+Bt z8Eb|rZslc*HBp?Wti4&O;#M;+k~C#aou*cKvNX@jI2ZZIU#z*=aAU2LwpvA=vmDb_ z#mdxd=5g7|vXq4z`4n-MmPsq+L^tXeD|=p~RkNyCRoEB+(i@;*VYOvLx+;?jx#LMb zY=pA=LBWY`)URfour#b8SaLQ?SSzud;wC$qwu%tQxA z*h0-twXDG^)F2_T59@k1NGn!Qb3CURANqVe%U>{Na#jMElPRlf$%A(;Sx-TuS7v{)p^~zO74u#FVly&k znUz^t6;QA|PqVmUcdR&XvO|2yzGJp?1tSV(HXqOOSF21|`?4xEQydCxFtGk=Vu5lX z11huF8b53aV6mc|<*yuOD3BYmEOJP9G!{KY0B z8*OY3u+C?>u@+-fE|05SGB$2l%8E_>6c%h)h^%%lSV>zcn}B>g z%U?~_GAZyYvHnRDw%)U;n*&P`WWfeC>v?OPFIW{=FmE6Ai%rui1>&ff-PYL3#&X3q zl`U{FjBFSh*1TXVdr>Bpm>1$#mariZ=WOieuufD>m~>g*WaEhaWXlJeB4$3UIbzmJ zVjYveVpx3&73|g*al>@#dd%tJ_g;uMS`N&@-RH*$x6)dlfo`f~BbARI`HO89tex2qV)s|J8{+J$nmJpFl9cU}tTUQsy;yL%Z4W`ZEOT(FzAhZ*nWnqF)xq$#iliE$a%@KW4m&T?Zm89 z8C#wb7Qq^wWn~d$#jMHFq!0vI;ul+#*%Aw@9-Hi0nZaTWBa|&8tdSF-6tjuH*n+?& zUnPjY#4p(2VaqCEV=Z8}N`S_zV$+lDWo)7}3u_!^I8ZZQFZGL6i|u$No2OX;YdRa@ zRZ{VXgq+PjpzyNh7woj9m>237D>+*-O4gjLsaSuv;5@{pE{t`^lx^6tHNV(MPg_|b z=9l=zHgVP`@OIN=%UX-gP&TYtmau=MtnmugM%KE~iebrViFHH#O4#wFVrwc}FA`|% z1oqX0bpR|GY)@fr?Tlx(y0N(^$20#0bY`q*P!=|>***kkIkv@Ctd-fIjM>2^wdNO# zX6v{hj+4JwOR&R0iYs7J!LkT7DPg;3n{~;~LDu*I@-+C8?04~ttzub@HDE_N*v?vP zma`GSCI&l{u@xjv&GB5p!p+)F%rE(iO-DAWp&Tp=ELxJVB_x4?m?58CZq;C zA;z=(#n!D7=mOaUfMLj{0-Ssc*gxWut=sIVXb}dolV#2(x0vtp7i(0uw6kS{^-Tr@ zfowFhxxr=)+p5`UhSl00&upNvl}V0g{tH+Efh-WtPHd@wMF8h1>jAb-voW7r`wr_I z{y$N#=Hvfooe$X^2aYr1d?T>uqm?9UE$kn0S87{=Gd~q)>(c2Q3QQGP0$DL ztT(TsUi6o!3IF^Q0a&#`#)o$>&Blj6hX|VoMll17MHmD1)638oLlg8ywMo$fhrusJ zoa$Z42Eq+rGl{{5X2Bei?Gu8NdD-gFp&XIQT9S|t@sHB31VKVTJA|P?C@aLcdn>8! zkeY-eam#nTW9cr8PrQg8#0`oO6=xtRKM))qVMEY142?(8ZWP_IlNQO6Bldvv@tR`D z8A_T#gj&lH()LEewsVq}T!J!ilB@;FT5>2+H8`9R+FoUnVGyAx<9A*rlSD8kLgqz) zu|%V+_9$*qJ2k>J%qvp%=?INmh-`f%LS<#)A#^0RHbsd<;OrSr8OV{y<|NUgc3i(P zxmASaA}5xsD+<6!lk&9D4l@n;CQ1A?92-b?ct`w(I2T=Aw%nA$U27u(77f)Y6VN`XF=>4f0Fo*NQO~Jgh<5U`=FUR1V2(j?NcSAia=VH+^2|M1*6n3lkS*H zg#{+Ksj*N#jXc(IEqp|mn3~TeCItfCDK=d_Jt%A^@Z8YfFRW169cR`~aeC4 z^hQf}2J-5(5hdbGhN0aO8i}7PF$_b0^u7#33u-jg9;olc=19rNh)m4^L8CG=iWCn4 zDG&$ZQWfQphc##zC(4X9IV|SO2?)_DGLBWK!#ayOpzTeJdvu(B#i&8bDntrGa8<;Y z%~~qLM@6 zDc{}%ZK|_F_5ndcT*$zYqWc^wxwne&Q-@WY3!p(ehl6W#f`HN-9cBk}-m;-Ch7dcymb(jVk{q&Ex5P*P25E|k@+()Rf#TviQn0Of;*e{E*r^AB z!Xkgxam^4;PW%mk3}IbUmUEhM<6*6a;PWcGGi42Dx`%|*FMeT8eXbPXO=7_Ya*T;^wiahW)g;(|{P(38dJFu$P z_qUr*7V)Be!>ydrSl=q+8~K9D;Zx34jDlub^Bt@PHQuWG&~?z*S;9aEwNL zR|I5_4>dm!o@vJBS;#n1wafzqjhi=;rN%}6Ixyt;EsR`oIis*U-W>0m%312e47xS@diZ8W1JyD)>Q_8LES(LES{&!O-ZNYN0c(lfn7xwda^IO} zP!e-*#^}0Q8wzqL-3l&T&X9yeC|zR)APaiW({f_sp=%ua{a+gq==qF(WH)94^lQD> zH1RS5Jvq^-;@&L4fjRmTs|4|pc~EuYyJoyygIUEP|HUjQ76?@*w`K%ax1c?F+%dn! zwMTdqj1SBxewM{6mes_`yohR$s9z?WXC%EZz(K6YZeK9Ey&|^>&Rc>P%2?epkxNU` z*sDwBqB-7Doy)R0sz}U=8B+zv8|#XHyj=sV0DAVUngvDhLqs@SG9$Q( z3;l88&*rzzH3n&H9s`m3N3zwJP0T^bV{~+lFCN^&+}qWP!lfT7reI`oUG^-;bI2Mb z7^IOLEY{bYd;iS=cEPb)1aZEhpXsbhh*<0~-hE?rA&xl@1^Vs8>i&xZU|w@kL-Gy( zcVTax*K71JaIZPR4O}1RIfYq^P?$mLTmM-H-#GM!k+lNnCw?T*g;@?12Gt8aT^PKb z$9ScR)m(IbOYe$jKVjae+^gI5>*haj4-58$( zjqwhJwOr*tFyLF!P`BAQZ~`&q?2Fck;$DE23LzqpRaZd!t8?T@ps@U?W*t!1{0+c~ z6|4hl$A8qox1h>8pq7E-i%%HA!F`95TkI^W#CQG^icc1Kg+2YTi3^35Z$Ojm70%8A z)x$An-OBRZ-)=tH)PIA+0i0}EC2j|r%`3bbs2(nw%U1P{{q5$HO%?*f4KE6FR>p_^ z;l^(kR#S}qO~Ge?RfzRKQ}~26k+{_%CpfLF&ddCrXUa~#Xn7xfIFM8&sTYtymBam? zNor`$QH&4USCV)E`Ipnu%Mt=-FHRMAE$LRrfg2Y*PD?)2>;Rc`^mPXDyOA4iO$ToB zz=jc+`Jd~=yE?r}%?5^_BN^BNp};L7Mo_bie!(aI10tALf!=l`(_8<5L!*LOTA9Vb zXmcdvk^dF8oka0CC@ zoS{r}@e29UvPP(nmq_@k2yYnStX}M7I?(VpZbt~V#F{S+N5Av*$%I6~@4yt=@})?^ zpRv*aAD;hQgpIYJC3~_%W4tBA%OsCCetj%&YWlH_fP&YRT=x%1G<|tX1vdi&5|7IS z6qURzy_f9vf-*%h#iKbsmv7Cu@ZbAIR8WfNA@(9l=KPQ zi4!ye!<8C!`tQvxTBDZ`OG3eh*0Q$f4xJE07;k8aC9HL!#MF@+c_pXTIe{Rd7{X{5 zF|dSFJ*BiQCO7U%7Og@oky%BBkz37rEJ!E*c8DZ9Tqdo@lW%f5SO) z1>HlWvA9@%6D>xcOSEyiShbbnclcm+I49S!zUzJ<(_UN8yVV}}%gK4QwAfXkoP5X8 za-aR5b&B_itOv?RfbUqz2c2C>mx7SoV;@>DDblQQ?66yb_{34v@@0V!*3RKYCcg_D z;d6<9+0NmNli$opz|IAMu_{pQ<|X+X(wQO19S7zelH+vgKThL+D8_!C29DE?B&Shx z+l=3DK2ynaZzni{WHJ?Wvm;(2;?7ih6VWmI$TW#D&b3zyzn~?bd})lbO-wU%%I2vM zUi~h;iHcB#!fBE?SUS9Dp8FCNp+>NiaOhXhI6`(YdOps!1LMe+)aOeMDGfp#`SV zD*Chwo#?wGEq6-ymarJzDwSiO06f)ZP!xl4qTE8DvN+JrwA_WivbNZzzY-ifU5m{J z+Qg8fdTlb9>Ach~l42X6FVy+S-&D9kTu{NQKx4U*f1%K~9`w#RllzTM}b|q^)YFVY@UvWsuz6_BZq{%Gp=! z#zQK3M-D;(!HFuGY)>-2BF`(H3b6~3-4S8b1+ApHyk>Bg$v!EjU39=%Rjjc1gaT>; z4nl}j-n*KS7e?}uzvOtv`JxB>T%ajTIo%;8-Q~2ywKy`}dG5|e7d|RUOg}=r!^Poj z>`7sclW>yZW0K&RZ^@G+SguftGFW#!T+X>Ek|fl?W(xZ~>W!p>;4JNLB@+a)xo6Ou z*@~oe&*n@O{2TwCj6PSHZ5Y+{Zp^4a&#X&rMz&o77Qh|1GD~xiz17vGvgkl&8LDOE zos*y$2!863C9Iz=3|S<+zqDj$y}E$x%Z%m_P_iq2B?Bi&_+kl@t2M!K5WQs^QR+SI zVcAb4V+}MRy4-$(o6{LTC_7JfGX;dfvcOSf$xSZj)$~6`G3J zIo8~DGYxI8d^aJF=?nhN)vkBm^cMhkvX5FU3Dk#gd-}8Qy$1%TbW8qSjBlF@T5iL; zDVkz_tA!N#aiLq%Wx*uVPGPX5_-cpydMvp)kX0vz4L{vdRgV4N#sh*@y<{H(RWaqr zrc{OYG0rT%;YpGP_OW1!%1EH#e#FVfv+*V7$O zCrPNWtQ58;e^v3sgE~8f{W*o%nxcO$jJOnOso@Zmn#Nq|s&~iY)brLdonHI5LUemh zt*tP<^WSgzqxX#^{Kk99MgQy6+6&V){{&n4S!SMxL>mh(F`<&DeP>>nYn{0q&B`xr`padeHUoH z4P42!+@`unM}J;W%{v-eiiqhEY@G$ zBKxL7PCxiFwi|n!?qUjFP;87_TJAmB6hmSUSn^QlYccLV`E$jW zZ(OjYWR?cX>4@sKY8iJrjlsy_InwvuM1t8}jH^c`id&%#j>Ca$`%`6sjnqvvbP{>? z>kMH<{Ha=@bHRi}!KOfDlk}4}QLxdCL_y?p4)krHjDv^E6U6F#G86s1$~bH}z={K+ zxI`OoP6QXnoWpFGjSf*w2yI=}7 zi=<@10%KME%Gt3vP5}hBWW}hGB+CIKDrR9Z`%z_8n*1)9uQ7mdrbu0cSexP(J557k zmZoHd06f4dWG=WO_}VaW1lL4a#pu=caCNLe|n1OP)h z=9&D(P6e$Npa`6Xf$r_zy#=@HbLY%XEjE#lNCQ?KbdDyV%xhZyud?Frn9k+MbUzoOaUDZ%`(~&JPq}v+=dHnhtPdu#mJOfH9^_tgk#s5db+%lFEfb4m2F5! zC%o>U!x)+#q+KINZX16h?RC()mHQB7QhCLp?J_S2UMyhJN&%q7T{E_Y;r*rrf-`~M zOl&9*EZkSaz&W^UUk?oDV63_DWf6C$qL6FSsZV3OQC|ofLo9OKv-On4RwI)S&WZ`Y z^Acwm*LWXOseJ5I8%PVO))b_Lmv-B*#jaQyqBN-^% zZSk#iS=o_}NAHzc=$5YP2F2DhMhlGKZ2{sX_}MIQE#0Bpey}^~nu^dY!eJk=lzP75 zvg=2Z6OLsZ*+>>-hiBW+*>c~~1bH}-hcC?FTecm08p(~+nNpCv-$ zsdQ-lsGLGmea~0Di*bKeA!9bionfs^@E#xFry=>IxJpa)7pocRkh;OngdO>itRPqB)%f&5@a!?C4lmuwIkRWX{5&|rQ(iX&BiyV-% zAPid&gDr9p&>{z~EE333=m0N;(3Repfq)Aebs7)K1+Ich>It+6KMhdcMX%+9lxz9R)r^2fZk~e7b zd*8qj2&&G&vBAdIF5*Ce9Oq1y51(q<$cXt-N>v0{PaYJ} znnn_E%Z(qsVnDJ%B=La_BpXuFKfISDFf}5NrW}@77GcTXY71_wEvi=A4z${W+iEIN zJQr~K!@cy267#^u^4CGgp&@tNDdj{tPn;!%@f65IlgOh~%A0wKf~)d}L8uBe^G>+& zt|g#%+?Psw0l*@nHiQ9B45n>7X#vLB{4wcxkKnSXnLgM2i z*Fzq5@GTIk0?oYnYQn=AImnJB)F1)}oJr6zto$1VrH2jtQDVj;jOH8V;Z{&=_kqOP zyis0MF%8q#^F^tlBJsa&B?j1xgm#JoFkn##XUm1LibB9! zQ3!X-MYeJ=rv$8F8|kvun)JrAuj00<7B~d*WW{TU;`yh}x^gAomEhAHi&;)gbXM+p znkC-wV{ZxUbw~)qQI1grsqXpOCVuA!;flDEF{G?Z#QrJa6b-pIXzqw)8snOxi@q(A zH)!%b--!g5nD~A8C@W#LmL#;+jKpY)0_a*%2r$dVql!WZT2Tl<%Y~?N!J~u+FU7Zt zI7qWyedL>8RRd>W!f5&7(p$=7`BcF_9%&Tah@;r`Jk64H{2*EasSy&wRa{<3l0!eH zmcXs-`5FgNXCWnIbR+{0MD7imJECMIh+m|O-WACkH2G(r-T~o|1O%vYl(m4VFw8=m z!Y~Vci62fmR@Da_%^!6zp2ZWq110A=7}p_|29B~9}39^m5haCLrVGw`ISO1>r2D_pEo429t9JtC(bxWjxUWQ(E;ObRXq9kx8 z<6G*P62ntjf;S~qNQ8@m92#=t1xdV8C3x0KuB0TY!I(TWNlP{!p9oi&XJ1OXl??h7M8|3DI#)EK>CI} z)JzFXWRM3*dD22RN|1*JQFo?eA=#jkm5^*mNq^I&(!vE{w=>in%IjT{20@PPrb|@Q zC4r`k-KJBC;=uirpZq?k#={#Z+g9tOkQvuE;RK8Kq$Ga=!MkN5A3@M`9ps@&q-HAR zOEp5iCvqmE4IEUZF8GcfbD%}v?DZMxxH?iUZ|K=KR1V%`IrXjc9CJx4jV*L0p787; z)Fdu85SoVu)jV(?IatLTbQL#z21#${?kXev(s-)C`%UhyGbEV@)+kbbb5K1f+Giqd z0;_-=NL+g)awSox65K-lafw~ZwI2`VjU;nIfu3FMgi^{2M zP8adcGahn8wasryljBJ~M`D%yRtL}e2L&&~JxM=rBHQ!81rvuc(hi#LkeGLe!~)5G zDKI4F-65fqDPW`=6(#u>ogZpNSoInb9>Fq4ls$(h(tOz?A-fI_sQHr48qZES-iq>B zH=#_2?UFCL0&3JC@D=vuq(SjPfv8+da5s*`iNF%G3JC>~#q`MyX+yRYZHPvofhQ$c z;@a+643TYDBq|i5ZF9iMv0QY|yoes~NKdRw@NA{^F&eUo*sBYdtW=1Z7nsM6qqlHfyjB2~p4Et-|9PMQOu zK|r!WC2xFJI7G)y)LAn5NRV+?!dvaV0>E1_;nme8isH~}^B&P9s*}tvNxo1wc4ea^ z`b71T*(V&hHo=*esLMZ5XA4?F$1AY z4O%9=m$Ty5X*(^59^E8wwGU_KJ;c)5aT6a_w0=czl8v{^Y%Dv4QYV%L-Kr zVYF^#q5KOd%yjz%wV)bjIdFoSbx%+_(QV-54(p6QK;gSff;)#UBkBkeROuu_z2pFh zKvIZbwBrRR3FJ~&(8~^%2qdq2lgBD~Lnimm9(3|UG^gZ)1S(48agP9#8O{9BZRSr( z^BM=5`J>y+Dp3;Py5Xz#t`frqJHgwfE+p#KSPl)jwof@IGLRC~txY>xHgn2NYhpWI zc2kNEF9KuF1;c?_gOWCRS~h)98)Py+jLcLx7Y+3 zo@labXDSINQsu(8rGN<9@?gH|-2%X-%-RC76?G$7^E;k^ff+HM#YAsZB0P3yxJ6|0 z#VXsPp6SvG7>&z_eKBUVsWRH3erw7k8tu!7aWf`*rxKygA;TR%Q=6e< zWxy=@MD>!@CpfDzByY>)tfFr3hI=t~is~k-Q$7(tZe?CB`b71T*(d0C44;Fq%gZOa z+&ayVb2x9Rl*b}vouV&yus$FGt)SH zQA^<+A%s#UOHuhx{e^q#FI61_>L#AZJoD>BS>VQktBKMMAfPrhb)6Ox)lE4XkL1pB zSc&@MX)dpv)lkNx4k~XstEp^1)V}1olU~N-^)(M`rZ|LAPk~k;1d%jGBH&F%J9pi7 zK2~kf3$%0BZD*b6(BID7$$d$Qp^;9G?}fUMs3^}-L7g8srvup#Xxo&ZINQ5yXw-V= zJv+Wq$?M+asY>3E$se(6p{pnd$>=JKh+_pqaV8nqIC;4wUCoqZPIn60FJ-8*%9N`9Oq8ik%Y=7>3~jP> zGxbIC22DQpZF*>pC6ICayH+BOpm;3Kx*lbU*w*k#I=gevhXYAAm?_ftOd4Tkei}NM z?bd243DYDqpSzm!M8;}L5}gEAQv{IKrxjc{*{H75LgI59%K_Tz*jY_w1K@I(4V>k$ z6!G`~mtEQMrAl7+CQnrIhD`3CJ_xz8pkRp*yhPdqP}CmU&hC{qn^SGE5NK!jN=p(2 zSb6x;eXGP!8=9fIR~Hg3D>Kw3WMg~#mhFVBTG_m_yUTb4trvi2QP1rrd|%DJIO%0P zzPo3OkKMIWN&3K1YriOlh>^nhTu|^B^Lp1xxpuHYwSx$V3tkd%8+_;PSqSIZQuOIZ z8mwJzC53m_0LL9`*N||*l1pB|Zs@BHIPq9lowQPE@En)oJ5{P41CIim-=VwtsiiJG z2>=WnJNImTWl$Yo@Ffnx-5r7icjw`*`2}}(3$71$cZc8vcXtg03-0dj`rcdqyI;0y zw`y+9Ox^pXtM9Fu?mm4^_YaXZDqLKVAE9@q%{ZrRr4I5NN@xs&AfzQLpD_5TT&Q@r1_!KReMT0EhhY`)JeDSXr z_%7tu2H0eTy%tG$j&hly@ehtMk1q48A*Oo59f2G38 z*C1g;8Y^fzn_7@vC1tj{snuS@ygTy}#mc zF_^=B$(AVYZ0tc)*cTs9Zag>mS5}(FO_j-i&tyy*#Eaa8;mVs@%*hNl2xD3gKcaS_ z`K1+I4CHFLhOBBIVqAF>FC%rY7c@#H!X@&=&Q479zIkuv2>(rB z9|(VcQBUp|d8iKob2uPz>K0s}1b%tw@zl-z35ao$OVWqzLxioII?>}b#Q~6X)FQyy z8*q`A8(&-=(ZXQE`=1w)Q+gbK%#zT)izg;a!^^->W3l@2&4bSZS%U1`H$82i{c{&S zVp7@5t6dwQvnYRuRTjfZ=H%{<`ASD5l(gl_rA#q2NkX2Jsw>MWW6GC2Aw(q zeK1b~8$TH{z}`t%FAd!oTz?M6($gLN#M#!+5YW7kerRv4;2{Yd&n-O;2VrY>a>Gprk;225uiBoh70+M`u;HC3f9y94 z7_j9u*-We}+HzT-sHa)~e{i<m?I`1-r^Ugk=ZG=)tIGzxb+Qjfo-(m#6oVj4aO+PkZ4O zzKaB{D}*XXFU}CSKp`DBN0r02e7uQpt{+D7nAZLsMibcsKkge(0P61_CMF8XGN}_4 z6^JUfFxjbyN)rRgzsbdtiG}38tL>M=NGJr#GSXIxgc0!IzNir(?rqn;Xbnj-@+YI9 z$-+E~$id9~G&XvD*b7{wt?Y?rErM8P_4g?Sj}T&hB|wn)@{vqL3*C<8p+P2SOyjJ4 zjdXzG*B(KD22&(^%W1A1QAo|8EqXY}{zK)IvsMlN!;w^2@j6TAkPsI#6?3otB^RSz zmT6rVJu#>)QlgKng8dO`SyR;_@($X)w)r;q;pG5{@`lWTYPnb@g$%ozX{1MY70d9H zD4bKHx==`}J`0(wby6!q_*0tpc{P=|$>1Iz0%AI#8q@N10@`>w#O-f_IEy9u@Bz(M z#&A43@paYA7c{sj2wKU>_W9j5ZQ;MEI=D2I>@;^e z)|9A-J${x7w|No#j9ph3jdsNSzXF61LE+OQ0Icd8$xeR2f5KXW3K%cLcLY$-ZBT{+ zHkRHRKWx%ru71K-m&$WFv}W$KjaGt|_c}CjcJ-OqvY9+fK(tgpFxv)UjeKYe4GG}F z8BOzkR!^8k4Fq4=opd#S^tDvU!kk_u}6~%;I ziN|5O&nnF%oUU4V;^<1n(S+$47&1zEb{1tPK-VDq{Yys&6{{+#iKU_`gTezz%76fV z8?#)y3ImZc2yo?V;m-@Z+oPc_DtS&q;l*c4<8sp8<2kkwi^eiY`83Osx`mPkpw6=fS$Q)rN zKjazc({_~u<=z#<@Lb)xnJ{?D;4pDdVv-d~uHlVbys~&pv2mcCwunf%H(<%)vf^$e zOwO}+BgK%XPZ?gukL^uOQx~s@ISnw2m#u}(hFuZ#@pb0=(NPzg|W?hLR+16#+Y_QUWfB`M*!Izqzf(C=>;Q7O<_XcKOoy=O zCN$(f=*7RtYDoJ2C!kTre?Sw;Ykd-jVTv+>0{H9%OcT9fiR`!^(iYEdh~kAe;T6Tl z%`;QNhl|9-)}n3}m%Q%r(x(i#M2rotAYs!@%TOHG3DLwYIRqQ~jnV;1_v5kfQ^3Z_rMZ(DP)b{s8D*kZDj|{hrA#xtL3#?EbIXQ;buibhr zv2y7gpuVa7THi!fbcje99=^X4 zXMNA6Qiu7b{y#nuq5$(s*}rr6=_p0mZGUDzkoKo|?!I00$26e&^H}|wY+@%N%7-U= zb4lH`Yck9=jm)~=M?titmxw}%1&L(ILOth=2GwH-SBM9TzTf`a z6;c$1@`}}YqKN`HTIr{XJ=IIIdLJok?G;nP^>@G-i8bAE!5JsQ>-@l+k>#wY+8WcC zm4y$#*Fnf*{A-0bERGGgb=CO$EE>sSRt-ZKzPd9i#Ct%3Loc_>it{8Fkw*?wLPD&7 z#~ReWFB?40C74QM>4qoFA8NpW>5E6(PKb|W3maPd$%%<}*zdt;g{!`fGvLkbCkU{{UdRAY+81Ee4b$xOP%OXhey}Mu^0RfCKdA4GP9B-lnopuk9@3s zm-+NeMR1%Q!wNr=h)e$gc~N7tSg=a!_DqAgR)|+O_Q=eJm_X#L8q9MqS1JlkyvvM& zfb7sQ-a`-8Uq;M5R(KqIjshfw2CR_CU~&{+hFCYFsErrc-_(2vZ2HGe0ND2hV%d1Ro{uc zYmM1=USpp0-R!t#aMIt5;UF8C`dQgptmSJj8Y0{}jfNefPr;1N8WP1v&oy$uLxTD+ zz3->G4vbl9(Uy{OVPp%tw>Fl)O|-FW#JslKIrkiSa>gt6*I$jR^85^$R$}7iY;fTz zgS`4`YF)NS&Q4x%C@KlDnK)SU^`<8`VlOm%Ejp*cKe=hj=SSGT@+jzmT@I2iUVQUh z+tPkC-l5ZisS{u6+^suyA8oytgLZtl7}c!@cFkQI*p!`nT>d#9XcTl2bOuv|E|Z9g zeeYHr9~o-L^Q$oZWqQ%>yfKC|Fa$A@eUXzRG_D+@6uB{uPIccBl_2|D7oS$%l+eeID$VdsD4fO?c z$jlO_`lJ^htMD}~5=t2bYp3nyp3oy6BC$VGoo(N(oh2%gHC9QFqQ^E0bUq&e(mXvo zS-8K{R5L=nmSReO?Cz$yixV>L8HSY0HS3Y0a778&@DKc2@|+DFEQw<)86>G}fs>B$ zs?a)$rg@D`$bq5yHR!qXAB}7Yyp-7}>+Y{Z2Jqzf^7v~FQc#7Ry5A*nhyQnvIF!3T zv;k~JYWxQx0d-6^Nc$;;Ktj%H2f2NPapV8iOl=WtLF7AY0&8^f;^#8UJ8Ib#So2cr zZyeSyCu=m(1XVmC><0t|zpQFcVDQ`;w*xt?H&0gfJJNjzEvLqs<1vH`)7?xy#lqO7 zTu|^_uzv<-I*GnjZoiXJ?CbUOTM)oh6`s@h7ZRCp$J_?6c zv0o0J6)N&S`mH`5z=6C%EEDfybdU`tBknuQU>;BSY7b45uv*w=D_S+eVBSm!kBaJl zkQpCkjLR(%E5RF?G^5FWmxnJ?h&MZx~**%vF{0pLQ5V$L?mJly-)4g&;kwZ9Tu$T!_jseWI=3CAHqaTD8={Js@PyMh%>| z<;F;ayC#{f;CFa9sP`MQBCk$L$J^)~5cYd#pcHf%{$P70w2c!cK@Qm=p!(u9J1?Q(pCE zT=qYXipVt(QBF{a9{74#)CvLJpK~UtdC9<`slh;=3D-e-Fka0WMZvauxI(J zQ8_hDZIKI)24}$cK#L<+t%PoSyOhR|Dwc;VSKIZ=vi^SWn%-gd(2l$LgLZP+A8 zA*z*=Xicq5(C!~7Zk-eB-{7-oGH*8qy->-a%eumiLheOoYDBN6D)W#~a=_FB8da~` z8oOp!)ob`@rw}(1BNIm+=l_0OvNaiI6JT`o(C(HiSuZ`=ETQ{<*=P<%@3%ZIID`ud14$xZ3>akRibHC8f z_@%`XpHQTD=tn7hS*V2KBM8B-Q*0CfTnN}Q|C_i!9o$K&A}2)KAg?I@>lL5+YbxmH zv#6Gg+#2+&9J2`TD@L%`Mma4g$OdW}7DE|>k=*Nm0*f`t%SZ06 z4=ENYLm`)Tp3bzK?nbz+J@||6@IWJCN8czmn9(UStBPr@s= z(lN|Tv}Q~d8#RHrNxA|=?<$8^LWnJt92^`^(WzN@KYrZi%Zi%OCBlBeKun+o$k*qz z!0|mMOP%Uu(x>5^kaxncd{rZW!I2%yYMoAU#@f(5(XOBT-bLl`_lT7BM&he|P&=Wa z8FshN*8+EEfOC8MY&hp|oWZ;2O+U^$bTVSW8{$}l5WmVe0V{0C{t6i>eG8?!cW|}p zpRj2H0dDLCOL}r-Hy%MXK)Sv+?ZJsyi_6c-CK(a$;7}@gh(@FZ-@u{LbJmb*B5Eq* zUdh}*oX2#k`&|vVp|*E0+vNt=no9U7R0R za@&3{AqYCyV&&^8pZ$zJTB)g*unj8SHq@#c;<(I|6_N#NqOxb8{Y!1_&%nYm8nAJ; zfViUg%~)X=wqKtLOOt+nGTh9rynVK=IF|&hA9B`L@sI_ZHh~K(`TwYj{AjpJk<|o8 zARyPvR4^z@k-Q&b4$N&51oOhpBEA47ELm>>^V}+T5bIHIE~egnAeakW9@pc;jytg;6!tBec z1l`h<_rElJPOl`11YGcw0z63LDTL6+638O<$Kr=>i^ojv#$8f`8zISKyefAqqw?hI z{C~h^RUhNOQiNMuQe<177HOEH2V$B~{7RqH9f`6}I{Wq>`geJB{YSrb~Ua zV2tUr69LXpcjG@8IKB+@HFZ4oiU>U~2#POQ1}B}CjN5-V7iDbB#MM!WuBMZ2rIT)K z5M<=dClqQ(+KZ~eRkbhkG8G!ZA^Dc4{o8cUGbO4fDO8aspWAdaMdq*9zeplgVvc=z z8cSiD;aK{(%-a$yu6%yeQJk@1FVntw`ls{%`}SvDFXF zbieFw@gDL9Rj?%Vxhd0W%dKz}?Vjjz+WXJ&5sZXn3#>%$Ze~$XA^~H8FoRUIK zHUyktwgpy-^cSa2kNX6l^#M-!-j?nE-VRP;oS;dhmb!`(i%}Rh&H2MxjOgw|ncRDZ zx>DT!A(rhyS@ORi$#eZ1bv$V~J)oTM2yaI(7jlLm>M{Hu7rxJDJ4w~=GnXYV-<2Qr zGR8#OE?31V)6$-}4OtVG2PbbgxOAPL&9M}ic>`U6TDD0wIv!KTyB(qz@z%tN##Qh; zwgyk=GnBHK7G&d+i|C_5dSO2P`a0%6Up7QjqT+oGmJ&=8@6SZq&=Zo!JpF*H@YF`F z?D`b(rMHZ#L$+gYnz^+*r1HH~60aSId--Jg6l9N`G}K#K;(by=brRdb;eliRuRLVL zB0|Cd?AP6n``iyP`_HfLIK#NgLo5NAXvgEkaN3ag%Z~!NVyn%R0dVYa=6&I0W$`!F z<}k*UhO5dqgBVH--D)CDCAz`jRg-_;>QOT+GWy(kw1sXu25qMy#zwxsvm=3Zw*>fl zb|3KY<{^xcyu+67PS({GhS!X~riK_v=l^9*qDK9I?5jD}Uw+}|yF&@u*vWu%{jcwU zBUe}T-lOj_*S+8$zLnKM43fku>-=@R%!AY7QD@7g2e_XE?!M;qH(^J2qvAlV$o}q5 ze(L_M5w^|qYT*_7>c1kuS-^2J%V)WtVaVBW59D5~kYF#Me}H+6Q+i7PmiL(Px=Te% zMquRxzA`#)fNXY03gW>J52_i!-;4S6wfJqE9K5S%BjCCJeCY0$kS#f@rIhw6zoDe0 zYK?H{C9kabj{YR}&)R*S8u$v?Urnm5Y0qzjY9?Vex7|T3&t=GF zV$hf=euXa3_gEw!`Nhx&w*ifl*wn;`(CE<*n|e61KZtTN9N4h94*(7V5LQIqk}occ z$2^kG0umHnCAu+p4BL2#u*>z+Kw+mqD?re7<9uZdGn)3 zU|$dWfUdr#k?DRRJ$_SI%hT1}n(VD|Q1+K;>dkYi zE{q3sqhLZq`-Rn{JdeD4T)?-%T^EIE3H~~UkHr&G&7U53=XzOjK1M6@QDKk8dRc@D zf7c%KYgVg|SN@z6Pgh_Wbzt{8lRt-hwMO1p!%IYj#K3wSVR`TT(odDhT^+Y_pIbcr z9&3+AvPL2n0)Pc-i}Yw??l{)ZmGp!Zl9`FZT*_m~e)|}jCl^Xy%x?q=Ar=##L}QMm ze#mTm&)@0O;WrX`W)t+ZcM>?;TFf`y;^A01?CU(Alm7x{^6@ZpE$(UT;qR(%FBH_4 zmt-?S?;7)RBJ&WE{e;IIevh9v`YX*?hLh%GL|}DuZB|}swD^3!Jg;RNV@cF|SAceF z{d=aQQR|SFUAW`r&u%0L8uA*25sslc*N%HO+KDoQXF8Ohbc`^k8*~^{jqWG%#+4c| zrT4P}yGoSJ4^8lXZhl2b%sZ~5pECa|5ePR}R7aeg3YAMac{8nEMy9oyyOOpBJhq3Y! zZWjzXOD|nIECQ+G^0s5ml;cHH&c!^-k|aBnL z>`o9Wd2DR#$icv)0U7%$nhQkHlfOa)#6=LSH|q*E!q+M$(sP-44S@WYDw@#5@3b4* zcamE_FpaOsaX-QY-52xQW~R?~PC!ti>RuFp0nXCMP9t7``89aLOJ7B~-e|fIAHz=g z%YNGjod!FW$|PRk)qs5P@ST3KdxrW$5J6A26aZ-Xj|369gTWy8wl81TbCGC<$9=T@ z*YB_iZ6+_rcHP)vTPz0$r|BA&+98JQsFwrm-n>lm_|s!P{+0e(7nk=_bUQ^k7NKP6 zoOh6Fz8w#8R3iuUy=`2QKiN88u}01>QX3YNN{ke;I;8i)h*|Wqg)bVsh|TH=q%P^2 zfNHkhSdVtwOZ?XLcWcV#^iBo7y!-R36X1e1moDC2s#Q*(NzN#jI?a+@6+TT`sA!Ey zSn=@AOXWq&iL`n6jtQe1jpk+OvuPu@6B}#YRWm``vvh`m#7y)rTCOXQ1KoE?Su_&+ zm1_iYqh~N|z|@7Chj8axc@LzX{TW1WSGK(k?Cpd20U@to@V%@LgbIODKaB0kJzgDp z^0%jIfjDN&`kaOv-HhZKA>0ma8Qu+?B5S-T<>#+9;;C&tTmEj?i8Gz9cCL}OfzJlm zss?giSazA`S@8S@VSeu`(xJ`Lg)|9=Jpx|iAvdaxkT|&vS^7{B#xwl{L;_~c=vBOM zmYEO~mh}!VQIOG`9j|7BFa7e+RX`okTO?r05^9s;$WDF3)*`NisC=L$ZAMHkN|Bl+ zzKcmow?qe>-kyr6;c}v;Vl!(eH-&>8wFOxgJjN%|uMx%Q0fCl73f!R))_=4esfv{0MvqLsIj z?lXn{gO1NkBR~Y?W7W`uQ4Ofh*>;+u#)h2F-6YmX)RhYnyubI%f#o4S6k~r??U^hm zwTmf0FGK&yHN!EB+g&gly<80IMN*_+f`-~(%vFOgBU1OxaRgFr| z2dP6E$a5%A$Nsh&K}9FvlXhWKlGm@3`PB%V+g;@CcCFnuR^(^kp}z;r^N>jdmxBW# zK%E@>xIDiN0XNhJFofmYVh#r z`*zJg7!Lh9;8c3Ekzp2yvbV@*r`!r+&8>Z3h1qV zIbn0HD{EQ0nzrWj+Vfr7&lqIgN3G_+H;R<6@`8Pu+nsOQboo>IdTkJkA1jbO`Y`~6 z^Eqj<(;DLpf`lGIR{0suSOB0=6BUfi3o$wT+|pt)1#1&i7FDI%hi?^5T4ids>~N6xUdT4b3VRE9QsgyyiSb2$t|aGQo{Ts3c3zAr*@-F+r}AolehyW{eb+=2?5bvB2f|@{3x@klp9=)47%tEf4if zLt~*=@W;{H+Yy3hWC5)01I#XpMMP0Sd3k`BAi4h489vvt4tca zQ__44bfM!JHcnE)y<@QSD64!1jqC@t8ROLx8>=sK*tFhUI#<h(IL1lwn+LnO8Gp;~IPJ~%2MqX3P2J0$<9XJb_7VgmdOOV8!CGQ$26USgV7q=zv<+#ADJ&sI56y(O*Ir#!i561|tG zeRQGSszkzN-@ia_mk{&80G;hX%!I&qvdAE|o};!ZBw@Q3c*eKgM<(i$^QB*(giP!8 zX3Zw_3*ls2;dPIyAAz{~o0&%I2K`?awf(`_MoHljb*pT4TPiVmh=9(f#`adtm=8T1 z^FeSp3#y^zHO5Xb6YL8kDmnftka*0#x6Y~IHLhcNMl!wHT4>LxIFd*B>q(!E`*BP8sxA zTiw{qClE?CB$Kv|qkyMKTs6$ywm^J-j(NXay*!lGcUVPOSBroF1Bino!ubaPxpK4wPkZ1lGncfOyil<@-j@yV7)>jw4TY8p*IiKfzxjR{5 z0}9;92~l}4oucksNKpU1Cd_K$)+8}}&cnEC(k#ay81=_O(cnyTw)eVpYY_3+O}@IHC8z*nxtq$KF!8Fe4R zpn~yN(5`peeEHDWhe#OTPu@)Xju@3XfF)#^jJKM>9{SO)!05MZ5f~usF5@;8#jfzJ zm}>coObD&RdtdM*hfz3<2J)TYsa$sfVR2I!Ob~BZU289A{8ihjz%Aj)rD<^EMI4`i zL_l)2AThN-$pue$bM?0}M5}qKR!*HhI0|WEKj1k%F2vDnq37Zz14eE7K~?4>2r5q( z4%0l;38wHL!v2qiE@^|C=3O>Fg1JKAN}f8hXBZnyuSiwm55kNm8Ri%((7+4PVvFR+ zN_$V|71{RvGGg`G#n!s+0}c1%#@^kT%!8-1`I(`9{B=jeA2tb^6%tQ2vGqu1kz1y3 zc#4c3R#1QTPby<;8ny@B;PdGz6S6CGFnGKZZ^mrE71(hrEbw|#yj#}JB5)Z+Gl?Phf&$@!-MHvN=1kGx_*mAPs4y}qnesfU?tH`k z`%v8oC&3|dZGgl&*}gBLA>y0aD?dlD;&!5Z!xR2-j@eSfO4(Cn&}g9G#{&&T6nEzn zO+jh51OUY5S3R~^k{HS$JCID&0v;>$xD>&fu-yn*xz^IBp8|fHf|ijBW2;yw0!E%1 zdjwnp%L!aAAh_-(?m77cea?NDz6)2RdcR&mv4QuSiuz+anZ=95Jg+G#Nh28bv%A|d z6l?2E@098|iX+}u8(pXVr_uOkhfd&!zKk|mi4@^MIuZ%4cuVm1j4I>}V)${nI@3Z> z=#>8|kpHS4(_k`Ps&+KeL`3Ypg_Sf@(4*GDuS2SzP`VRi#V{;Y(tpW_O7)5`f@*#@X9^#M0xPln@_-kiI+_VSjd%T5zeT0`{Kjb&3z5Y~Kg7|nSE8zRYLcaV zHeqGzV=NoWRcwePhIZos3lXOOGEvgg;v9+go}&>c?S+G4N~e z5>Jn{@Q=5zoN6we99z8M(2Q^O^awj!!hq)wdrtUoE<}%NzJ$!c`WsMb>C+b2qp=6# z;cfrs+D3U*JD?PpmzZ#~y{Xy~PY@X68B!^A-NJ*9w< zKCGkU;&V3C!Qn2jM)}FktYESUXyi&(@n)#!@8YkC%JBgk&}R@jm4SHMN9AVbZj*HR z?=D9MDh4I!_|A~+$$TJ zeUy*?kW1>x$DgsqEHhjgrg(SlV)x){Tc_1TwC#vnb`o@hm6$q+yf6RGd!Eru(O^lhvq-*Fv^dX7e1NMgVHNI-3m46Hjt(v&l*gS^B zVgYnWJx}*0elNcfM5&Wmgj;_RSUI^~o?mYwDGL0kTb>t+;U`=H-0-#a>_Y!Tx3aSE z@O2Sy9qP>`&o@pqIAFp74+LB@)0Na8(8t&{;cpcf=oyqrZlS@;x7OdtJ&m2)7=G1} z1f4%}p8^)0@YEgfzFQ$4CHm~fn?w8D?*_eBTov1uX4W(t%K%_nfK)}GdeoSV>N6) zZgo$f!Z}kxue$mL@(f@v5&u98-WU8>V9!y)@PSJvfY@`|H!lhK5MZ&fd)N|h0x*9G zq$Omq0b~9)dvU^Ink;(zk;B-H54@}2HD;&V-J_2o8Sgy?HYDccqYivJF~re{Lch_+ zvjTS!@cLhS0L)l~i-tQ$aX2!1vQPR%3WCc(#WWuA z8zIC`ITp{W{^QX{H_M{?2x#(|(e$bTHV}F#rWO1ENb!5261i~hJU&Rv#*>2yPz1~% z7e=O-|8sf*HU3tlV%_+>-JNJl-SlZko{_Gy1;8S+?#7rf%5ctO9SQuC^rsyYTrQnO z&Zbh5sQLO6jc7B$7-mxK@%*v5en@>k3~br(vxZu72A$?RHPAJTON+0wF-ext4~c8L zWx8`H;Mq@?Ns9lM;J?w>W2;L%ws1reld3Q0UfpROC2j zD?er&HBCG`xNafF2(kSsz?wuLA1WAv0A7SITeiI!G3tzwqvmDA%^q~|zQ2_^aNdFCf#E1QQt#nQZASNSUr6V+c8)1nW zQOx1wuaVA+L9k2QH_51pqRolSvB0i5z^E%#z*ch0k)Zl>`K|^ZT$cS`JkfP3?|V-2 zTRh{Bq>qZ2Z`rW~KWxA3RNj;T$<&uoe#|LHc?kUO_;VYQa-SIxKejq$u(bG134F_G zU3=JK8`N^`GyJCRwgNfX^0tgT5q(<((d7JRWx-dRR_xURbi~L1<~7BF0rX-SEq(Qy zX<5QSd9P|ZO6$ks5D{rmHTYP%P8 zNRyamIZUCLDeQYuz{uRu+ zSD<}anuvkK#dBi!=KngA0b(}wnm~d{;#Bd4n}|NiYJC`ypgtwls{aNRhfu|czY_(O zsptEtei=dG`r`OSJ>>XLTwBY@Zk=;KatTz-k8QHNnHF^c_Ip zdoY?8avU)~UuU(fBk-EZ!)pHk^Yj5vI2DNA{3JnP(K?Ozko@#0@F!%}X$mPpy-y(J z)@eGJe7D!c@IvfK`De=Upi>qRsR+no6F2gJv#Qz_aUhrAi`5tT}3nRnQ~OUD1d(g>Rmw6sX<{B`65n6=(CpysKmt- zU|-YeJQw8`rp<*7{n)^oAU&hJ^M4m>@#@BoqC=m;B_Ok5#~yoW6JQ^h1A7Yt@Q8>t zleMO_d;bKX_wzkpFvRke$fbgU9-0P7r&y8SO9FR zeKSf|>qTFtwr+=jwmi3suKmzZ^1Q*BHs$uc5O_3@t;wfpCp8%AB++G9YVM0D6GAHYWDP+ zP{*GAhRvlx0V@{@8<;rPkJnb%AL22GrsfN8pJ&KHm=Mb9BCI5=%Re=!S|gOBV7N%s4HMV%kSM6 zH9I9WJF()ic$Q~jumi|Q{YU@xLar1C{xaN|yya4&G=BHX`FBE@f6KZrt7b*?d;bj= zsYpqc`BQ!4`*B|A+KO}_NHM3TdLT=jhmzIi_?lRsiksITPNzN>4Ws;B`qxkCL#Bru z$cyZP1uRDHw0A^~p!s(*9hPcWpz#mE2l?Wn7na(lbh9XifSr5QvT`i~Lm6@$qsn;n zETpCef0rd8)5)zfm?{)L__dwngd2eW-3o@=pC=w zrIy(r)snMtgt&Xwup5a9r#Skka$FP7jJteJ7SxEynL$l^8=!}c>_(M4H3`9typH>C z*}{6=DLWk%qmx>rVlo4e10O-w516hsU+VHPPs)h~^jZc+l-md1Vt_#)2J*kb;1GX#{5!||K{ zWfw-wzK3yUYlVf$qunO!_cbPhMFpSb-pNNlkOm%d3*n1^kcaI7;wwCk^(vY3TeWRYkzG{ z|LV&=npDonc(5Mro3eyADG<^-C_?pG9Llv-s>7ceK9M*={WfW|5g}tgcD(V~Q@!bu zS_R9)YG4l>n2t_wdj$wlEUyBw;-a0t4c?xX-fZoFl`aBDN#K&qQ$d}M6TnE>Gy))K z{k{*}M-lMydTa&sz2$n}E-=ddV91w8$k-AdU-9`N`XDx%`CPhJfnf{#F!O zJoc59mgPqFv&j1O(C;<@*i8(Wvx`pVsJh>y@F*AK{AmkU<*y?M0>AGO{be=L){BWW z3QYAMM2URaUEyX62)Nw?Bp5bu)~iNO2iL_}8d|gAWy=X`yvj5>Qi8;<6OULBs<1Hx zzB@z~e<1O?l8(y)D#dRVC?0>PBwn3_C25iit$yGv65I~6?a3DZgjB_s(r(k2a7g*w z!?MS`8Fo}aA1KdZ**`)d6Yxw}a!Dj;c>L-jB$Zx%+`Tk-cs433FsgK_n#fwDiPu^& z$Nn9+NV4HAcb*w0)NOw0*Kuhnh8&wu@g)A>S)21M+zy{9Y9p@vx1r!odMqKt2a@H16KR?*}P4m<#7MmF9qy5 zWB*m&otoU(8;#jWnl!gQEtCXxL6(kn5z@Q<&RW+2Si`kK_<3Q?b^V}KXdWc0-ZwUy zx_wc+pz4F`3|6{+?h(4#Te|N9-0;G)5_BH}%`i}2rz0?GS&8_WK4iq7cu*+#w1AY- z+%jzhHrR25vlK63ZySB0-Coo!gnDMtYWRkYO5;1bh$-$8N}%uT(qqn-{9Fx(z6di=ilzFc#XS!1I(IWG5C)EM1^Omo#yub&KK3xR)um>DE@4@2!Qwux;K>Y z-J+;?Ts9VNLh_0I0i(TAc#I)Qi|z)?In0-80@l$)4xFgc#LydOb`0~; zRL=PZ7x@4KarB+7O~obPB>x;ntu-8g)DN4s9V3$cK!_AQocG+jgZUSPH#(c^;%`CwnAV9gr9)vz z>W1{%+@U{yPtHt;Rgm8b6w)sw_m zb06a7W!X(Ls6U^A&9cdVl2c5nA^TOQMn!pARPrjAzQXB^`ZXTwLecqgUlG6cm(&M8 z%GhJZQ+BbW=MDG*y|@Vhc&53Awj4el^pLIi{LP=}PEX6mE4c$e-@R=U=76#2Fyx=# z|E9#uVd@87gV#RRmAIu8WHs^0ahnSBjlB>4d8&iT8N4l$#74znbdIGGbD@)6A&t4` z!gfnmZ5I@@I#*G%D@YavqqCtAqY|2-Wikxu)MoRc=|==$jAke%Y`^T%Phv%1%<(BcOKD`A75)uWVG5cJy#2ETc7A=?cM4HiHE8X)q9Ab!$ z9M%nt?;KecY^JF17mpe}EfjirIQuid+V~o+#9`!~$QlLar?-3`1go;Quzm|z>ewvx z4>k6kNQUh?yG2!{t^9c?b~RKIp)*ZDi5n_o%(CO$6F!Q|s_LKQTv zbS-#wuIYacn*H94+sqq*x9-lCP6u)0OA^GUamzld+B*_r1uGj4^SI|u?t$o+STe;+ zN{_Ub+m~(SZjJc|>PyucYtHq|n-Hh> zs2S52@QFkle%|Yt7p+}AXKQ&j#i=t@{!GrOSJKX>d!IMyX$5lWe=rCA5x|fLR(!NR zT&V*kEyd*sNkeL11bOHeLewCcfhinq?!RPJkJ+?Ry~dXUvqgh^7fSV2GN=v`{ti(K zc|nZ?{bNnbI$}Pr-(Se7yXs&T?@ndo+n=NuR9m0z#DJqG>XiQOF_g2I@}WLbCPuOm z33rlgav_Ygug966|As~mBhA4_4OCHv+F1`*!-T^qr12QwXC(eg-1^2l7=y1psR>64 zzaqEZiy+H7H0sCAvP+vlXj|H&(5XeRFZ#iSBTT#ERjC7<`emZb_NR+{KYb7I%5tQ& zEd5KLBud#UUO1}i6^~7q(8Y#E{AN^(H*?b$+05&0 z^G$EncN`Jj*W#0(R_ZW2&@1y~_u23NSL=6Np6dN9=Iqi>ted+FvcP`~xL_FZ23ON8 z;Pf5<$1e)~jAL{^HEc>ASNs z#sw2w8Fnf$`mcKWjN<&4@*nO`z>v#W>>z6GDvR%!Zz0k&EumwzDEbJthDol}^Kgcuel)HhSMUfHH)O9@a9%OLf95QrWWeCn zM-Sg+-JRRD?xK1@m*!6J(00BkU4g+R;&0%0z}w?q3V|dGBX#jcg`Yjb=*}=sc=_ZP z9efbb>n|clyi2XgK+l3_`5)IJtJ@lSTL0%|niRAp9j~2Y=>BHj2J_$y{8`WGWeqlc zhu_Pf8tMtP8=uw>)zI2FfTGyS={AL|*(~ZLzFH#4XXhud%!3q!I1l&g0UvGVN@95L z7fWFNeAWFFW4f<+)Z@T8#IxqFicvEXuG}+w3E zui4woH9Z|DUlJZpwdFdU+g7LOtDgZkcYBz&PY-{CZ{K8R4&lpt-G}f^xUNY4Z!pIxS;GqwFtu>jT+8t0Bxt*twAm5FY)k)qhOSI>s>oU_t@9ryZ^lwbcS->2q-oRE2xi`n`x2jk?@T6=-CkSJ{<@^{O@Z951GJ*s-1zeyS~;>PssmcC3Ayz8 zpLxpaQ*1K&Qorrb@vV)U19>k8mqBkKhq%Xsa)r_((p>!EY*fqF`ugHlM4bEp>j{s<)vdA|y|c*bY7|&lmoDJc7;i zTq9p2&=Oj`{m0>mIxF>lClbOhS<9i{*Iunv-JW|MD6*0E2KQyWO@DhNq*L=zU>l)P z?|c$|QQc+S0cUrzIGPjiVg}zaeIoUy=uv1Q1~tG8F|mVdXo(1<)^^rr+~c9rH5V+* z$r!ahzpm`?eP*JA?^3n__KmHjx3&Lyz%LLK7AGJ&W&ieiXQS4|D?n@qs||10c&(m;9R-^UZT$)5WlYO0EN1+)>vN=TyD7sua`M z%w_Bmx@i&a!|$*)(RW=V+PCH-4aX&HndPIx^haf;Gd>9MLzX;BJ&b~kd6Vcm8dI

    lx;^Jc4`y9t)ufC)ABO3;3_N$ z{vB09P5lXp!4aUtM|dz<5Ndo8QA0*-wpVzQO&!wTA7|_YBexJ`RFMoR!Z|<3PkWGq z0$>O23MxX2&4zvF94OK`X>0^RpT`k)FH`*iWlvgrIV;)YT{wUY2R0;-8AGa&B9>(J z$)unLzpXC34%eXzqf!$e;(Bz3cCfz{V}!sW3dak=6@3DJx49Hli(cXBq>rfOqkU$W z60yZBI;ct0RtHz+p)C4H zH0j~y2d$fTTeVR6H;0WK5asgx0J7I^IfA(y^=LR1F%e{hiZPmq{oK+0cd|?}EA%VR z=#qk*A<9#-pE#olD%2!HtdxckBS(EDMD$+^qaEURpi$c|&_knTQohUEWcv$v^X=yb?Ck^sxo&~KeJ3v`IN&*jBb`?y-+7AlMStQsi@l7A zu>Ua?n#F=#xeX)4PSq*&fjZy%&AFO7PK=X^O3 zy_`Fd)u;5Z-u1R-m3ZR@HAnPE7iye0?ux>HRAv&NM{bD!-b_fD zBPAyW*;!zH{vi-0_GYeRbI@yEq1~W#(ZeiYUQSRwE~Ml9qEoIZL;csv)41G=rAd^S%OlF9DdkH_7$T-3IDVEt~;^X^cq9@7pn*5baQw-W*b;7VKdLm z6iI5&2#LJMxPIsQ;=+b^Y|_@S1{@)l7@3p+{6@S9{}nL86)=W)aN;r;ZaM zJ_rxAeOu_`F-nayLrSGP%qwKN;H`BQdw$HU(qs8!wOZZv^6Sz{;zJSI#_aWzwO+PK ze?=8?uc-}%XY24#H6p(%^qjwUU=5B@86@f<%$@6YIdRG`GRQL_%#{Gh7E7s@m5!#X zmu%Hs@r@h4M65;%9P-XSrci{3k*@CEj#u@;t*k8Qe|pcmKXo~5i1l6b$V!q7=Z;g_Iz<&_7axIQ)-Nt zO~iRaBEqSOnJpO`$@CoWn=QLWq<-U`WVU?3S@p+v>8GV+aS)Qp6#6i%GRfNH!en1c zKA9xbDN&3E#`!nD0MQ(zR$ z{lfT>DlXhXJ_a86u){xUF6@B}0v+ZV352By{vJG~do*dUs=gyD*#ia*t9|hSJp4>0 z?a`W=RmiXf3<8$kaM(|K)hRxNmhJN7?`~}o{fT!{N3C!w(j>`pN9=*k^&=VSP`_j{ zHWqxY`Z&CXx!(;}VB;x=C1}!_zBJI}QJv93K@;v+kuL+eoiDTg#m5JoG#8)mqEEBttu4-?2CSZxtJSs|d}; zR#gVpEVXH-IEE#=o)TD&B&QZnLRq-Ubxufna*F9qTNA2l8ra1=&Rrx{CKv=i&=rRQ0AkzJu^iw zoEmi8PXB`H4(e-nG>&88qxW_7R-oMr*!f?5s`LVn1*Wk>2Yj;@3z-eN{~AF8Q@L*A zX(@Um+#b2$yB#xIs5cv}$7u?fGWxRoQK-c_j`#1?tUPrUq3q?B272z zB_r$Q9hKYV^F7YLH8b$jT^H854W}0dAjoUjvlo0B4it~=Hb{4=-itv^3{MgD@%P*~ zEnkzkF?J4Bn=XVj)1Wp7nS)Et7&CM-&;&8OgbueGs|x=@lWBt2CEwi}pAeS~!3i$% z_@wRY6M#!rDT>FcmE@-Si&lr(tDwh_+NhvuhR#LbolphUuKFv);)(AGnj>qa^<7M~ zuAxgfVRk~3dng4A!O+g=gCfP7>hgD`XWF@ES)-A`!ZyB6Pskw?^o%lp8Eh77ch}UA zlu-OaQ$}J0XtAVt4XyL|=qzQR6V#qP)v$jmNDTkL+E^B+5M2I&sLqFSyb5nsGs=4< zEAGi~5HT@{o7C*$6Zj!l*mka}Z{$u)Bxuhc2~neoE)s~HfWkakd2DVK(wz8U>RbF_ zmAf9pbtlZP&|jwm#sUPBk-s@{M%9NJvQ6_^wyu{}Y|2_o53{YFJzu6yqz>` zf1(}*!^rX=hv}#^V@)rE4B<*Hr3{>c6ka|90yC2f^&Dk7cUE}E2IJwR@eY>d-2%IN zFfg-$ISGVDE7Le6C8tk!vijaka=^=0)Lx6yyxVD8+COy}*z-2>v1^S?u;Z6L5A=05 z2l`L|JCcA~<9^>92fcGzO1ks2v?bLlxygzqG;~MvZeR>dy>e8x73~LIMRN1iO*6UJ z8gQNAPBrx`rMh(4e>+y;)ks{1C4bXT0q%H<*G-%E$}Es8(=K`On-*lTGfDYnx}yuS zWhU42Q}+1y<02WJuAmTif|x=E`}Ut5%AX2L(|zu7pd`j8MCY#2v3^a_a;3y0Pa7!P ziWWv^D>9Sngm~Fx$dH;q;x?qpUG;5m%P)0Btj&SVO&QmD_;$ZHxJ6Y5o~rzsrexCQ zgaQFR#H}2#*RANl1@W&dn-~(vB-CVFS!HUqK#YbiXOEZIPFoS=%=!ipIHtjJU9(z$ zVTWUi>U`$xM*A%FYt20B}Mc-5|K+ zKqR$%P*G(by$#cY96hgW{0!u*py-(y6bQ31fhC>>&jBHHD@~90qX8%dM=e8eh_9a^ z_5trC{=FW8?f(c(@joS=hB)=a3j-y`uu!<2Av|8gA|GJY2N3x={&BAHKBsYQsB;?Y zO%@|X)b(PPHbUE5tsK+70H({tx24t1NP!&I_aUwqM+bqnx&`9Yi5M-R{mre0#c%)4 z*`0z&xYHqU2{g=DP~8==i>y-AMu}3?A0>jSA9RqShsT+o?Ldv-y9bLC;VR1WBQ9C>6CWj@r_v>-f-A~7-1;yXH#VC z!cvicGko#tg}(ajK9jE`*z*9lM|?VWajQ1mwGd2)#9S=so7Cdy^*7)$E$(QfW8$0X z53YsYiQ+cNuCRw;q*Rl4J1LXFZfm=4d%t{r9y^+@VqDN6B{$-%lTnWnUdxG6=Z>e| zE7E1y^h(`^jR&!H@8ksjKDJX>;&!0Ezu?$=!JR1cIxJJwkm+Y*zReG;IA77($rMN&%ib-W}kT9o7Z&{RXPcS98iZ&L?V zfpS8OWjD)_C9Wc-V*E8ki7)>VswMiyu}-WxQ+a*5_6u}*xS+#*Eq{%Ov*@oMrv}L@TT((w+Sx`98EDx0GTfe?k{NjBdJ(%+BUOvP2a<2)9*@_ ztzhr*@sF~A{>1RQQVmR{JVpo*X}!~#frdZ?g@%a~y6ExOuU_KUu;U9BmJXMuDg#nM z4NmZr*!(iNNn2&KC@mdl)^id&P?SH2jhT&}PSOeKJsHLGZ*mbNYK@47e;ujZu8X!FWW}C3{(~|T5#jQCc;-i-Cr#<7Ja|X9a(86}nw35_ z#Djf|*6m>uN$k=nh|wO;k8~h*^rM@Ux_pgKx4o-$_Lb!nRKVw5I{ViNS$_oTo>(_| z6(m*~u3z5yF)S4BTQMtvhP7%)5;2G!JGdiJfPCpPfS^c6W{#=YL5(vu;6xA)Rz9>< z|KSZ&-V}hP0O5qAgDzsygV}}b562HIq(Fay!9n_Z!^y|B2BU>#%Qm$?A^$l6T~HdW z#DfzSbSH3iuA6q?{x?29L22qJicNtffBc zI_u~RFYQY#bt{Z&h2F&w+vi(Ld-OoSibkW zN`+Q+AjW1~j+rBFI~JaBn-*>{pRg{PCoV_K$Tl!DLol{v+0JL5d@%J3k6A21*80*O zLoWiD;*XMhi%nL_9nuh#jo38|K#!&idZ6+h?(c+V=HJGK(At zTa&)Xva98*b^;#LgxeaC5M~lMNpQRqG#$Pgnne;J&8(&}fHz~!2{q_8lH?GeG4X`* z2Vwb@@_ERiT{$oSjtH6MzL#KU9k_e$xAh+ZI5wQQ zgG8xP(i!vnz1IVXt3MR5E2G{!GT(mxwm)cjDuAEn{k_`@G%&`W1-iUR@OJS4fw-4` z;gwc~0_7h;c7s4ZcmEf{yIu)F%~gUzU~kLl>+M^w-F=zs*);*-E#XpbYru&Hj?AzF z>qBBYJV(^RMJEvf)R!!CHY9u<{P_}AT)15Ww-8^@o(S5<5)~Y@#P+ULF9ScdtpY1 z+IVeaXuuyp$0o1$0%zr|2lXGU5c@_CX#Dc!$`+jGm!;aH+_`O`3Z0c8>@23#Bbc)0 z6pdzkh3K6enI14f>ES7JOSa8Um0_>Y02uAHE}SK?0!F7Lz1`Q1>7*5UL^$<&Y2|&E zHwm`+kmuFu0&MH!#2t*;pxu>*C#>&CmT}DOm?-+CkO}hcz+-lz*QVgNGB(IwDmbLwPXF)?_P7+o*H|%bRw0+Y0 ztFk^Vcq^{2g)o;dtZWSjSoB^h$_0#F{G0FwcHX*%-=|stUd<4pWJN;)a1aKV-d;q#@5YJ5K#7aEsFp+e@ zk;Zhma-KX5<28rFxX;CB`y6~36&F(RH#RDbm&&kty8E1&d(=w6aavEOZaK<2QZ+4; zhoxEE5aw3&sBg}snIGyx31l+gII6Q5)IG&V-Dk0+t_$KTHQr$-HBtTVy)4*UV>}*= zX%KNoAz0*bTM+d#D($KT(>qc_AT6ine+XRklyFh@2l=u!Wq_0=E01dX>dt#lu0nln zca=1tgUF4FU8>Ei8t5RadGuF^lXEpD!ZK42juh*)fR4w|z0C&`$`$cUMTJY!%T4^~ zOb)^LYEJEz&jzjL3$Nm=^BalnhD{?`@6mu8uQP1ll6H5ZyE~k18Y?;x-$q zladeuBI8x?#0T#EAab#gHktLY3qF*iRZ0v;>wXjq8@s74ZPb?OKw*-@E6GUXWXW-K z$3Ep%Pf*86=1@IYiDtsYhbErjpn$q3>Et@uJb@sQtt{6qd;Zc(qVosVr}X#IcR|Qi zgy(t8NqtP$_)KxUV^7kc8)w_e0{S*-g8t|TuTpbY;2eWZUaSV&3k!}qX!zQU`f zNMF~hYN7e8Uf?`FKmC_RN(^Un$1qGBRx7j>ivPb1pA%xq3Dkr6z#4n!OjGVdv=Cej zzqN44h;?7vACOD(g{GC3I0@25VT2%BcE5U|E+1t}k&f-*w^7iJC3S zsWDzG z!{+$|eIqMfg8aJKVLy8m^Y7McUfLMVp;3DFPh}Nf#7nBF~LUcm(+oqY}h8oexJ=+yms!FEE z?~gC3ctABa1$66L=|T8f(VC~0>dJJ6b)*){agq!HnAP>(o`XvG@PxaI@>`YvFsDuI zmDUPorD2zzHN?W0QyJfr*p6TG*#qu5uy8?PD`CNI-#Pb= z%8oIc$%$8&j0FOo@5!ov!oAOSKrhPc{Z2&;eQa#qhxyMt#UR!3O+qFT^Y9G4h)Mh5 zz3n)V>UW);De!r3e^%IpUGEhz2T=S&sRQ7}n}Kf)ZGMi;QI`ls zNrn!d3od8q{**ZMal@U4&X7^QA%g^OgOB{xIt*B`gH1o|%ZNfKSqmt|p#{LiKaudQ z3XNGTLbs&FgW_{6!SFF#4#m;Kpt372TFS*$1~jZv-U=O>SH0(77$56hpPup^o|;W& z&%O>vSxJYdh5HNjFuMUkw*}iYkE1RRoMNEu=&V~ zqPr-$`~j(ao+tqNBwb){(uk9lqpj8 zK8Au%RU_lhc>|E((l;lm#5T2bh&>)B>R4Pn z*X)crk>-9swCkk&OWMH4$W8M!X5?IlobIpP*4>B)B>*=snvCyxWyu9mj*uuH?U&5a zOR~Cak&98}>B!64?dIOsEg-V|IB)c6cANMd?^i!L-i<Py-OC-t~KXQ_2MHYWjKqcdzl!kSsd_+NlHcN)m5F0fv8Ss;EBRm}O6C=>XZ{ ziW*(-DNolm@AFE+j~xq<&&)L@$yRkJIxRgW!lSy!=PUYBriZB z$|zY?p7*WT=zxMATBPDBq*o^(3*7bUwGgwNVHS^ksTo;r9cDIakCsub0OyVfZsy!gmVxL5CJPpedSct305!5Ey89XqC$%*{0 zd1Dw9+CAK;d}s6sql|r+Kfk#dIuwyNOaf@4WWV2SQl+z&8F~y{EI*QE3MJCqNJUI1 ziXk3q7U04_dB3g?5v_c&5rH*#aEjb8mC;w}-Sp9Os_&ovTe8wtvT6}Fu1QmMxJ^xT z$T84}Jb_iZ4Nrt>PzoU4+R~hQoTVGeXu}tS!vk=-~I>q zebJgA*@clcF1v{XeT=owC-4>o=t&(Lqc+ zS^YUF@ca*N2>l_J51Uy|O!$Z0_Q61Kk3Cb%I;8=y!=*vcs{uNd`7kly#mKB2* zh&XaKfFjtKS+5*={Mq0RsXE}Plxu&naVvTbaX`#+wx^SwO1P`BueqlfU_&fkGnlc_ z#XT}OT^(Y}aKlaJnH1^Jvp-SzIF#E~u4zy0!J3XX5=!2{pfi!#o#S7NVGZ>o}n@^Uw$Llt9K8_g*`}bd*G%35L*ixE8bw6ljC$^V)Ct)X!{4Kv8 ztosW)D_#Ln=$^~UtjnX6D$9pS4U4iY)4ACm?-H*J3T_M6%rFnt%K;&McK#6I zpeFI@S6EKO*Rf7Fu=-E6z|@&vjX?V&(Eat>=|6fD*aK2IiN}1YfZ8N+56;aYrsi|% z7|~sLc{~XuW6s-^0>94Y z51-zF_J{Jo!y7;^5Ab#dD6se*CmojPZY!;^4tR;SDoHC~_-C}c)0$C6<$pA)tG=x1 zI9Av*gd2mDRTCiGj~7W?#$6mGL2QO~lRWj8e5IlY>z{j5vn1kA;QjtFkf%oeXbp7w3O-UySDxOx>W`yx8(ZDuQFNRPRRz zV5yF|s4?q;wS(6k;%D8d(pECGZSJJqwXn71NgC_A(E8x-uE8rqZ7IA`0yO_QP+5&! z*vv=?{7S{^m1`_@yf=MsSSvASK~k4X7qpXahk5a2wlVNhPInDh;w1FcMlO{o%ZaML!W0Bc@94F1(i##{OhU6 zS9f58o@}sB_#pa2@a{Q3+7%}eukI53 zln@7g_KQRU!7Bb`RNCI06f`I4W+L`+P!(taN;xr96(4D^;zT0~F%5C~0<&SGJzy~v(6*mUQci_yJ&gTZW7!zS_D)<#GvWH=6 z!3~A+coc1o7>>XCJ5-YksFifb6suW&GsZUw+7?Hj@;78Ve>Y(h+7|_C&Jw{I85m6C z@dy1IHBzb=Xl&Wt1;h)5|CO$_TzqO|UWT!o-G6Z~e<=!tT{ED$Zal}jX?~UOjBX-I?{f3|xt%cebgkVq>t+N6wFb@MJ~xfgVdYgu#jhe2v2y@-T&w@|w+#-Rrp_SBc;a^oZ zVq_TRY&}#QZ6p&EM0OUj&GAz2TdC+*lq$Jg9KYW zn6!RtbIaZJYP_ZO_2y45FFy{qc@iU*&j`a7y6unQ4!AN326eMPj4)-_fXFBv2?6PK zI4|=~5fGIzuLG(zG*VO5H44ltUzA>8J0YY=Y*JIV&TS*~$h?TEL%rD;1=p>KB>iuD z%f#W6QE!M*i7W}*wp`-7&(PQO-W4nIa~moR!Fw7PC`-({w={PeJ%d0s)$#{sX*$%l z%(B**r!%J6A2a`yW?h?4KAE#`&RVzHap-s~SKT7+B$skLToC3|tV30m()TSSHgy~F zTGbheD5sHZ>M`Iz0c4Cqs)soZDStEcKzRn^)htfG*vr`7S&~($GRJhm2hMv0158SD z+?<+OJl$fmYv35j{nFIkVy!!SmvX^|^YDYFs8*2`)UdxZrboTn)x>=_j_vz?FLADK z4;Go>vR~W+Z3I-9@_eg(b*YU)S8E3i)h=0eO2oFzxAj1SI{Uu{WazuPwadt%s}`gS z7tm7zKth-3J+`d)|12Xp!EKgobk>YGP}C_NmTwC^s>im9|58OkDpVDGJc1}6^M4=< z+dEgagK3*q-Y;M0uEuw7q(5UKfDTXN zNv>CE4^M2!iQeT2F(Fx1(?f&vvd{GDoE{uJ`6(wo3~177&sH^v*2Bb5{s|fM6OI?I zWjpAEUiRb;wB<|`lLc#hm{FW@;Yhm10b|edWg3>8BIYr zK$iY$&;jkaOzkEvL!0b9Wpw;#E3QnVH8eHp6DU?D6}(Wp1@%N%bm5l4cxD}@_kow( zXYbTGUGz1wh`NU0^?dj-ulHrqrev4ajvQoD0%nCZ9~w%KbOm*b-u}zW@9>A^pk`3D zUU^_A^z%kSn690UO=rXq?SXnD*ZIut#OzY`UFCH;?hBiX0qhdf*YD=$J-Q%g^19|B8<#{}qwY++F z8m8tiTWYyZ8IhZwbvcM0LGM&|w5(?g3LYVG?VEm6}~*>8gr z%odHx;lZlmZ+PTjRMbI{ypHxpAM2&@&u?h&24RTgvah#8MGV!Z)|Fu%M0(VNPgw1`oL7>{VNE#w-!HpmxzaZ!Y0ErU8Or%E4 zhbMHXscT5{m#rnIl1#L8Aq?*iBwXn^Ib6=z32b_zXF3d-s2P`Jjk-;m_1{YPYGV3I z{2N&s3sP&5UeB)Pb@SAgu67OaNY+_!E>X!`xWR3zYf_`PPcPQc*B>)el)3DNVKWBB zi`hrGNq$RiJdI%?T4FS3fC|EG&FClEQ%Z{2D=z6$Ft-_&(0ksJgH4Vp zdC?QfbXayC3HzKc`6UBxGvw>wuxm#|yiIh$vtzIJj=# zN<$J7w9fy=VixO!_DY1zBn@R~Pr0V=TgEQ>|LmNsy+2dR`?@Q`dNmmsJ6XH(H{1 zCpc@Hx=_BnNA3nLt%Kvt>M(ydBiWXgsqgE|t5)sEIlEkJ%;eXsb3Z~D18?VhWNqHL z&h^=o0e>v^yiH~=j0qOfWUkE;;y2^>t~B4)cw1wK50?r&u1uMmBu!=fRS60~Vn!y5CW%hVz0|a7z z-DUh*W6E0!pkCwL;Nx5;-O#mEb$bh;xVh=mkUmn37iPI={;KvB+$2+|42|it>&Zm` zT&j5Isld{TiZ@ZbRXM7IRCC(mEmf#FAA})%`|5mOA~c8!%Rl0lc6xc+*r7j;cbp?a zVnTLyW_0qISE&$obpDQ9Q&!1;Xv+-YgA}uEY|8H+_%VHPds7+@j?%cUb>xo#O;Iq9 zATNwPfJJ6%l>+yuG^Nu&SCIbB!a?RvJ)TsbAfm>?xi;Aco%j%W)DP3BtQdI0q8O+Q zQRezs++s~%xR}ADWv|Cv7ukddsCpG%b#|6x#jfOW=j4sr(r^G-8^7192~vRiltZpP z76;)3Fh=v^vB}8l{OQO|bWtzwmllJwmN}pxB2KFslY-zZwqkAFPCl=i%zln;QJow=d^2D|yL@6b4f zcn3ZIi>T)Js^#;FdHdF9P2k2kDDMwAG?wP$FWoKe0U%cN^8aFbftOY%jK8_Qb<=aN ziAjBxIkbp#+$N(1XC-7jC?8zEu!dF;x_|}_*BK8Pe2nPFJKFmPM<%{e6u0>C@t(7C zDt(78B@G(y*-|F>-Jo4`&Snw_Mfr^Mm}bzI^gqbwT{D&{Ww^GhaLK-&M*gPN(ocH;*zYrgBshsfq|0 z-L}xGM4@{gHyoK=;Y8=$kY4W6avK4#mN684*G@RV;$|RE#WlY4H1TE9gQ_8Yg}T=F zQ1c-<1s=!#<=ElF-7QiSu8SZ3_MxF%A=X#lt^S3iBxi)5@r9CcFA|!>^EsK|H-o?D z(CW=tUcBqp-X95pGaWgh@8af_@dVjGeV&ja&&RQixfP0|pY?G__ZmKR^ZN{d78U<> zA|&HPfRrT){5xjx)d~`FZZ@mC=@jNsy-EMm6`5d9rbm*wERfeTUxk2gjcP2-Lv}Il z=^^a(2*ROl{X(;Yd_I|{5`P16u5DZlg2&V9)G3k*bcky^SeDsTUK`q#-#e4Hg4f`5 zl8n}v2G#y252Q4!KGChH7QhKQZ`}>|uiSJ0`2(v4*M&U;o(!F#IMJi&@mYwYiY#o1 z&C9ENff`RD_|d;NaLtJa{qEnb?iq!ZPO1B}s4~&^$LLSK6#LR;C4Jyscvejt;xu+BumMgoN~v_wUN!2v`i~mrnxt_l#rFr+dBXHsHuR%S4ot~1X*O9) zjbO1Uiqq!;#!BE*VZ%gQV*8X`l0~)k;%MyAi%|-kfZNe#T8cCwPlyWZc!B75%b+KD zsxRzi&fC|Vf-|*WW!H^`k>j37iG+HHWSSWtT+-k!vqp?qUB$ffMuGqrU2I`P3cUa^ zgR=E(FVQixD%F#9nLm!~4kgmez^gM8Q(m>4akGVFo4CTZ_c$Jx!?RAQc&UA{bf%O} zUOWfE)A8QXY))WNM~iU}<0nv$z3aAsKYd$P_MusYf_? zwtMnEm5%wt4eCLNkGNBLQeE+ADJ4RGy4EU6QK&bKNMv@V=0|m z#DQL?Ieva>10$=ZeuOV0Al__2c%Y3ee?&S7b7S}f)-czvIT>E_boV9vjCbTU|EvP|vW5yy;@PoZy zd7dq|k5v_HTWK(ezvJc&}L(I!P zpYEJ#dLg=`#<$9ivih24(dg2`{Rg21eo@3n!Xe^!4T^IYU6##F4zio`-t?(*!}L37 z+HE~g?=&S8{C~`AA{f@;EgkL|Ds+JbABHkygvqsE&>w+*8cAa!!s4yWgsC|gg;=F5 z9$D+RjG0re8q{mO#X`Q>eGf&q04m7dAy!9FKfk zw&+k^Eg}62AsU$VGOXP~E~^!PyqV~0ch9RHv=go?AnLb*qu6+F6O8D$eI;ifSH1iy zVbyOz#z6I1rZ2|2ta|zBH|a7Cv(zJRM`a4A+Zor`%C5Ej*0?>)A`($o0am>}vT^+L zslw}a3J!RBJS8};w}e}CV%Xu6olhtZ^%ys{m&wHwpD7FGB9@BxGhNnx%JAIH5&+x~ zfY@i%y$MUN7k9Tc zTU=&0JWU<@;t=kyR}G!YHbo^%r9$u1+ey3Il^dDr-vkB@OrMW7Jb&`;b~oL>7&<-A z;x6Jkz1h32r#Zs9pUDMGXBtY|n&aD3BF4?v(zZ5mFqs?)M4r5pyBkV{&OEq1s!aAL zn-M0-OiC$89!pyQFDJh;8`(~9uCM8H@|tUoj+SOJ!I}LsYhDGK=z8F0Fi!4|>#5MG zZo(B;riUpMi7UA&u$8yd*^W!n8_S)l7t0h$_zrX;%lIQODqv^CqRG5(%I68=aC~qs zFixCsnkrKM-h?aXD&!~-$uvG>2ah|Ou4vGWC!^C{{ztrgp3_eT_xph z@JF1Pf-+&=PxigU!hGL{@2#$Zgk=4G`jfcuh5u95iyn|HbL@UYbIduM5?A(kbXez* zfwy}>&Gr2hb>#kSee@Q~_{GGK&?dSvK*#56YewgLGd3@aS&=80b)axKaiCSE%zN5^ z=I1g(`|UhK`z>6p1&HX<@*d6pg0TOh1JBKn*8e%}Ii|h@A?Y zJWg+%dZb+``@zL>v3Viliz2j`lpPgKMY;X6PJrP4!vukTYo+(2bPUI0_h-#I{kcGZ zuW4pRQu48jojpmXv&!6Isx^SBncgiluV4Wng~o_X>Dgh77Z5%c*vQ0U9>3dTSFfQrl*x+|KUf`FY8hMe%Qu8ZhR6 z=(?vMTcWj1)MeYY?NzpI+gN4Wwr$(CZQERBySny1-G85RaUw=W%!_$3FEV0gj_-Y+ zLHn?L+s0t~ne(ILygo~=np?n@S>prk@T8}jJB|HDj*;La!n#3IbzQcCpK9r?ki4;_ zZ@9iF;S=jpog2vcuwa4Y7v*O7&ra;%OF=_w6g# z{_-%c`Z=7|^}5*J#n;hr1Kaq?U8}zwuU7f*m(NQn(ao^iK=(g|C@@cF_Yyw? zd{s;ix!bnmyZGqFKWK)HxO~F24Y}wb@-zwmF!Lg-h)aTq3Q9l$>yRb4egsl`ld-5-fk;hF(q)-F6q)L}2;Sar zaBsKi-NX5*a|bO7up=olxSP}jb+lYtw}pBz^^WAVUeL| z&$Iig0tRtob45H~=t_gupnIo6Nlg&Vk|HVY4GI(BU~=YY=Yl_3wKEcp!PvVM7;q5t zBn3J7j`eR~&a14lDByM8sFl^+)khw62Rgsg(9!7YMfdAhp<8$H$4a7OX{l=i$T~cq z9p03dS1T>eSzF-07=W2V)fPajzBXxlwun8o>`c5=-Bu1!;W7ejd5WYz>>3~yMt=$^ zvyV_*JsOEP(K^rtUUY`>&&qm}>L`^x{1ath)VWPB$E=vb@UH*K?2urzaN)>C>XflX zqC(5~4?%)Ul$&NXWXj|l;tk9#$!X&x`s=ya%;JBLq4zSViT!M%ki`&z@v!x>iZf&x z`q<4W=cel_TOpM_r}79FgaPn$(|-qw;eZAetwmwol|~B<$8p=R=C)XdZbqKhB`_5h z*$cW{k)l5+PmGjp)sUDnkB_A3S}K1F!MQLlcdGGu^vIAh8f^M`&!;bIoY|qD_A`VH zUY8hBOtpqfmn>%Og)oubTnlu&9Nk%5g8Z2pSA$g^ZkZJHLRiG|kyRkEvD~2p-AcrV z`}OV-)E1D}_8m(c5y^no#{J=&n1__yabP^{4)$vPEF&|<43R*hIg8}+{FY7n%t3Qc z521ZwSZhRZKG`4-`AG`%u;0D?|6(r30w2IsM8X&lh_jGwDP5#WCLW@=_j3df-Xc22 z;|D6PO-6Q~1#h94%EV)sr_2kl&P$iTC0VO68lk7RITHoa&pntxci86>51l0G$A{Zr&)H&6@bMPL-`12-jk>kGNoF?4)E9G0mKcM&@AE*+N=u$#ZO8 zpUSKFxH_Tcp3K*6!*-~V4hHI1=~o&=+$Y~J*)z$_dgjOwjiXZZ{WwFL83zZA$z_f8 zDF#-<>zML0XA5eL8;kOd;rVR}8CiSB7t-Ckv0kF;*70mNj6^NsksP<1t}g*CKSSENT&vW$m6~7vP{ygPjGky+(?c4zutq zom!&^_AEf=zmsAYVN9uWbMAe=wLSh=7JHE*;zX8gE1Ti)04(ej0q|ZIwCndi1{Qt4u_yE?&UrZjWMpxwUiMe?M#gwzPV5~r1&qn)G+G5BGpo>W0;?73*DO-TGVAGCNjv@W0D+D8LHItSsmR^;NR0KmPtIj(@4IUqXw5nkw>qAABgZ`Vtg;8xZ~8JmtV zhI~L^l^*YC5rf)ZP(cx~E8y4lHG~=26obCtiDN}r20TbHuA9$3jFg%=P2NpYc)CuE zHqj|iNptW{+)#m7fjoffcrqU+*FaFv=&`cRrW0ezaKET@mo%$46i!!ZDY$#W2>!Ie zw3XX2T!hXsO+mXnzhZ^N(&DUWb2%oXD3q3k%pEGF{kVl(UOY1!y zq0`loIj;pK-P5>a|ofLkR2{ihLsBApZay~jR(iOc>FmeS6|dC@9# z;1Ct>k_5hpr)O@b zl8s}ARd_NxO=L2{PXzHN>TwMC#&%%HK0p58f}W@W{5#H@n$RqM^!uvFw~Y3dWUX=> z58h39@*Z~pwKt+~ig4{ca*F*a__}=Ay;50dFlPL?T`7FyOGqN1v7ps&oETIchwa%C zNpcHC<}|tL3Cwgz|58YaJDzB^Gsxn2U;t=2Lg=pW+BMjJOlZdRj59tFHJvj(Dgnm_ zCyM+|z6!8SNB&{Xt=`>hExm^$hTPb>FIlw}-X`Mt} zR#y=Z6`=Boy7^W$&^GHx_N@W7J2P=UBOGxY1*&i1q(dxvQoQ{XYSeN8VHZgDZwmt* z4HQIfhGcw?Vw$-czfhWuJt%~OG$;~J43hA#&Alptb(A=SH^DdTaSO!KCNN>y&utjH z|5gbE8MmZHc(FpVV2t!$OD-R?Fx~0>qOoS_*mtG)9E7#nLu1@ zT-FLPG{^fDCBZj3m^w&Ru`WvHq~hDBqQsJO+ddRDXwc%#Le`mfKNp`pj=x^Imv1~H z>4;Q(8p=E^eCGP|LrC)=pm25k_N`*Fg=tD7p-hONpnvDoPz1Qwov+s&1o8eG0_~ zi3wno`Xs4({J)fl7|6;IpIsWvZgN$H3+Iw!L{H9zeArw_0MM2pD zgtIsO@Sj%LX=4P0uKt<1Gh5*alW;eDc zPD8)B=KOsSb#5?PbcVXV5x;dDLBL2L{M%Wu&rRg_J(+Hw^A!=r(aDDn*=vp|kMdJ^=}3?`C{Rwn$?P}HG{Q~2EqOOA+o zX2+uw#TIr%IN%nvsN7X@ZH$e$OO#LUtWs8%Uv>lg!ubyPcYbx{8ZlbeYt|(J!a$NE2!n~(bAg=vsrvrP znZCqPKT(XN2qLYiRL^1iox5qM{+&>;4OfNV$CJr{ zH#^u7wNnmxmb);mRq798{FS{|{jwyM`M;~fIbSocg_EedGP|hB*}kCj1U~Ylqn~VO^9K1(RVX~NcC=jyhL=3 zes>eb5FtvI$4kX3oG5(3K%#=>^}V^w17J?i4jn2`>$YHn!}A0HiACQ%)2Q0r5(*X5 zv9l|tUGH&+ygc}lXV!e`d~*Z=H_CIPv5$8T+;D3g*1@g*tjiG8Ejsq22@9p9}c7M*#(~`h30elsm0=uL29&?;;s>OJs9fN>NpG_

    }%1?qw!cLNScS*cl5=kv}}TO?C)0goKWGN0ff}dXY8F4)YMq9h#$(tpu;5 z>RD*f{i6N}Rr}#Wa)&DEl>G$?8o*Pnp)X0D*V)V9&#eH=7O*vXo`3&`0w2`qP}2}# z1t%D23nUJJ9;Qq9+YIPmNJe);vpaJpcH`FW*YREioEM>z_jem z?(#{>(VeRD3C9@IPgm}dAa1m5g}HHxR2j8u<+_#AJ_=`w8OAMqU+E`_L8$>pf;cSE z2N>}?j|hUB|BQ0!GphA2Xv+@|du|8WJLgW=<5s3bItA^IsUmjs_rfdR@7%+OSEL1< z3y?(10VS(OeOtD0_%G%E6|)b!L+{TnsLHZ2>=ixDh)f)$VH($VZ*tdoUg>RSzZ1%* zd}g=_UFhz0F+aKP-^gxnR=Qet&R%#HKdxbL4&&>u`4MZU<`X%q=-U!Q+>cbnYtLL5 zfjvu7Q2WP@W9k>c8Y?(Ak4*O&SZ-r;--sNZeTSST%cBaEDjJem)V=}Ppz?>&c{N>i zLhal5s&>bjAbH#m8li%|*4^!4;RAD#w_A6hI(xInA>$Ou-I?rNu%8H}(4EMK=D_+_ z<=<9%0MabrY4aPAS*{s4i7b~-$}95cd4I=&CJXrjWbGrk7k{%NiCoNI!=`(O@2{=) z@!`uN&GJ3%QM1Pqt3TTCMUVsAo{?|caff$PT#KyeNWul$fS&}Qift3@3n#f}8T=D{ zgR{B!1b0p)P0Pi9)gdB3@3}&ZoI0MprS#`{}sb=B-+0R1F`-3wDaKEIrVGWSwX&OEoXtSduC8G_rERCh5)oPaRiX|Q5 z)&;_|?>^qP`t;%5jlfx1_AmtX7egXW-~6tvsC;(?mRz!;pdg1i2Jwc4T`d_vPFbug z^84DreQXq+s9Ow+#xb?9qeK67@opVS=fZ z$G(Hx9WT3 zX){f-8R{qPcP-OGxsYeSMWdxaIm8O52affbxksrR+lVC$cIw->I^}V3h4;gg=5o_jNRwuwf+K?uPu)ryC4z`A0LR=Xd z{s7(ojZWA?0l}TdUsR#rVwfr_us(g>9sLG=e*SoK%)&*V=ts{gf__f#-7qK`LC_Wj zdxAFx4(J2G4V2VZeIy)fkhtDzQR*p#O0+hL-wgQVY6fpFXTy=_yY8zbyN1kXB&jW& zAS%oerZ+E`UV)Y-J~)!30ds01x7C9@bEoy@b!zm+CLfp+93|vW^?LfJ&m+_*H3+jG zaVD@vhAcT@n%u83z75pL5$Ef*aeJ{Sv1fKJGzG7b=+;D{91iOCpan`8Qv9J)6sY-5 z^t*Adh!FPlfRhaPCPgS(+=J2McF%kOL>k*L2iu09dcbW}asji)nrl2^Z-^zo5M~1k z0|j7*9|5|~XK&Hu3*Tas=Zt$dSQFCrJ@OGSGS*@@|K~se&zT*vB4!hF2pSC$d93jhi?o*2e-=4%YEG`7`ro z?$Q|e^zqSDE?)wT6X8%33Zp!}EpyGf$)V`zR=Y0DiSDb!ptbl|8b`F0@XXLTjl*4Z ziRlfMyOZzERYSP5f7WL`wDM@GVZ`0BS^BlqCb%&}O520iZAds5+?H zVdo9jbT&8dexjtax*Tt^x1 zp9#ag!%3>C*3IBfxiU~*H})GoAMGmDO4601nu?E-rH2sY%-qvFpu7M@7=0Kt&H{0b zr~;5(X8E*b{7~X00eEnK&+P=s=?-xLsPeqpv{8(L0t-ZyrNh33U_a0RgA{eEtQ^ps zKiHlht^1??hHAox0`h)z0Jo>2PE7H{3QiX$nEy3 zb-&)KHLp=?IqahTE7RH5A=&hgo3y)ciF?;wZQ&--VFzvI^l0W^@L}!w*~}e+`5RsO z35^}~A%Xny@4y}+G|@A)z_kPROrA58QW*6+>){Y}dQbIO%4?HTXY9S*WK!FDh1R@64InEtFi&Xi@@ zasRg&$c?^pnNi18T@ral^vYofjL=7V>n{LUxY{XRNu)@f{wq2zi3 zrQX+=uQwzY{PUewT@rI!HaRVoa(b3JX&pp<%kj#|ausPsh&mn|FNVG7J*kht{H58r zg!HT^l|*biR>hlz_9*bX)!6vPXV!4vg(~lWDdkBwXg0T$y!&9Sb`WN&IQ?-pFRFBh zFb}EhGl0EmtA9!`HaRA<`gjUG2`!ZA&+e6If|a%^Z?0K6GjGfB)y()b>B}VS%$AP! za7z$?5@uN+KOwMT$pqMuNUuYwfVmj6og^|7eiSWQdfBtn?CDFH!I*WX&cTYbDc1ZkqFH()c0T)mN#YjjhlI&^3fF<192c^%OV_Zh}vbXU6#R2X` zprQ;457sEpRM!Kt9yCy9>i|?3#tU{5I#m7M7Rk8k$r$3IkTU+0{z;&D=`+{2acnXY z+ee^&bEx+b~YB3ZhyhavH#`Pc3MGp|jPKqyy$d15rI!G;Q*I>8q6 znV7cS}lCz zh&TlTUXf%IrHqt>;zUE+Zl4C>13tyHE9g0}q=jhu{R`n&fX77Rri`T|zetokOUF%dhBwo-TEg6GbSEA~zYkdGNm!y9hv=NbaId6i9=ATfRivCS#cJdQpXXSnr)a3{Vq&`Nt|TDKt2xTdhd=p*L<>z3?^GLmn=PGUw`nXrgX+m+Do)B7~i^C7el`5R+vcc9dl_|AYT{tuQ=*!vPjK$zl~+ zJ0?+R1&>v6vKZcss|71gYs2RA?SC>T@4N1|Vm7$^kj@@Q&o{!kCAbC8LbH?8ag!#B z+9QFUt{>-m?mpGuRR`@wITfXb0^M(vE^%N z&J5}2#?X{zF3AF$Sdq?9FGxrAJR}6=G9gO#3WX-Le#F_PGgEfLv^SuCQxpTLwL$KX z9l53d$j~4DtAVhXGOHeh{G1^X(_E{jyf!E&7cHK-S+0h`g4+Qxw~#`Cp8`M50Jn`0 ze45C9CXo(16AY}H_ADtf%xlF3To%GBuWvSVzhkj3srfKPaMdyC#ARTa#4038N~dR1 zQ$&l2u+uJ;WQ5s&m=zIk)6%^<^{*MnH0L>gq0J5j)e+HzQ@0)Y$Vy7{WiG^kmd91f zG^aC30}=SqPgQdGsljfE-1gu{`f^utiwoPX_w~I5=o6k+@%=f*=qocp7#wd}5aAiJc{Pg#oT_s!0GK2phpQ{+_NCbS-4XUX zd@9fP>%2>n@7unO3<1(T^j$f}*OvGs{|pQQ(iL()#v1<78O{Co+8CLo@TVk~!sj}~ zHQ(<>5YTsAzOU)(ApkJ-x&ZJ8u>kNNLAUS7Ywx}ExB~ZL>GT++6&H2eO;TTvdwzf! z_`6P`zfUKX^7Rdr+_rY0il#8XAi~kZ*LSinY}H3tGOwR!wXm6DBak~aE?nztLMuib z?8H-?EtsOBV3p9T>|J<^3%bXvFV$n+29$5a-eBvzoyq0*U=ZF6Ar>h1 zBOT5&z(^Sf7umGNARe(+M}u`O(>Cf>QRmoDYm~IKR2+V$`dH#{jI8t@yzeHddF#<2 z^6QY3MY@p6k6k$Rt&Po_zgxjHJaUno~*Nbbs%DWY-Ql`Sf&us6j3t zKE5O!?oe|^@c6vgkH2odzhK9-cGuc|i@e`~qu52i*2DMLuas_kce>+RS-Nk>+D@^B zj06~$nAq#}RHuk0@dr-K$m^8oH2Ew6Vun~UiC$|HyUq^v^=CxW`RXpEja-(q6VyC4 zr=x(Kn>==70sD6H>1jns0Vn8id7S;S)?dEHClGmN1V~` ztsXino5VF(1#KV7A%{KHMQHck1 zWXv>3$LHZdtwNqR-@t`0D0z<;Ll-0@=(FnZfh?wlMo(vd*N==mSAKHk&;+yE@%=&} z3EwKe8RRQi5ZfS6&ukfD9h~lwS+FmLw5;s35}F^yjE&H602Al=(_vCqY#x;JF(N)< zDKfWvgQ?E6L1HqLQTJ;xEQ_gf7*Etr5}YhxZH%UVN|MgY$7h+Yb%2oNM5}QiwM$7k zw|^|0O4-r0CCV(@%z57C+Vywz>pX8xocPpLueOUE+05oepYqgMZrH7EB~=d)B^Kmvj!^2Om5{>FrZ@akI}nu9>`w<@P=Eh-8=f7ino6W7Pmtt`d){b#E(kH5l!CtN8${6v^&v5= ziAV7-oS2lOsJ6uoaWZxeIOGlIaaqhWrBXg3-_}b3Aiqe0dRhfs^`NjG#*EOMmX96U zP+7Mq?-?u){ln0BIbBmz)XYb!Msq%N5OL1q^8Nr|P1w{zoRd5x?@F0;n6>xeI0u3D<4eSSoRrWyJ4J$To9=P0irOyiy(OyHSBM$~mCpv8EXwyX|DyIFR zz!NVV___Mt=odmWG@akQVqE%heUk)^8gw@WjxGIHO-F?nO&@IZ0Iu9fPTpnxO#W~6+V&j4JB4+qZPbOqV zM&=Hzi>Z@H;&jOJIF7k!ya_V!wLID6@HjTNRcNDhuh&W4LJ^K6sPt5-Qx0-HADSWH z^cBvcCbwI}L5<*wE0@ycy%S1Qo2o(z$X(CVuQMmlx6|VQxFKve7g>Q@OIo`0C6T0K z`tPnVcrUL=k#R6X<>M+6HXqF^(Ek>nYSB}MI7?I{<0~^K3>6@07$fLYmMJU_HiIGs zkPbpfe^xNw{r`Z7dgONpoo~8<$5pQ3KDM}z->xR;a_dq~;A$(P384an>qSbz$fwN{ z4aP^HCA4+woRJ#6Qb+OVcb!H0qTHsv6y%RKS$<57V!{#IM!{@g)Lb#%!YX*dijarH zlcMRN%ifNbsB0qEW{kSYc9pAE9;g&Qh&E|;e!#L1J#XNCq5~oirx!FRWBUT;PpqNTQ_E8CEDmF9*Uaf#cEVx!yDUsqpT`4z#RXPZBw&vj4fwts=FmhPNj=H1 zE`>Q|gBua_;e?D~^5@UtNPI`kl_&xxFdw)EFkn7?S(RufNfw>+BoJt*QZAi0Pyq@p zX$|Ll75{tp;=mX6bEKFpyWHT2z)Iv{3(1F_-QyMzR16vfz8ZL2yZiv4SHvS~K?9CO z_`rq(vTQQ@Lq%RwM@nK=G0uMLiPm!%E`-A=TkAlV(~?0xs_iSGRJ(MNH<$>eSnLn5 zp@QC#u!Z5CTt~1R9;acE&Y7@wyxbq4OkPjkT4bTv0hio-rzDh0bfBpYbj(?U$L;<* zM`!wkp$QrigbFAobceOlat-f>@ro_w>zTHTLTkAnCUyf*7Z@vn2h6AJnLE-Ex1>w+ zftINST{J7371l5(()MFcJH$e?*Xbaq8UzS7?}m^}1P?BD?kD^UfGuSxCAmdqry(7m zZqE(ra>go;t9u1z=yO4fV}+wj~>$5NgM zsjIt5L4EHINksGyh+q{>M&Awn|K4OzV>4*?cd%BwdF*K`h_}iExAh2O5A_2ff=b>_)MqUd{=qIhnlpeMs`gf z>T4@%;rSpN;eQa1)`%`F6WnnxkPs{t7})bf)9K&lri(No+MKNW@y!ItL$Zeo z6TM4<{HOkB_r{RMvu9gyQN??xf;iG1GhHfTHkh36(wBx9(fN2j5ZtaNiW`fS|ENc} zAGOUw9TOWnB}lsG>g%!3=aQuA%{fYvyn1 zjopRcZ$nKNIU0)}8IiU2V(4vc4ZBP{oM7{>8tWAuOY_%G^kQ|^XF*tO=YU4=jTh|m zuHYZKc@T%BCub>fCrb_5Yla;I|1=7b7hl|@(dmoCQ&q%wgA~D1)~}|nS~v25;)qnG zWU;}KOSme|g+?+)8r2D6*7Z{&2PWj?_Op-w#GHZT!hjczj37<6h7~WE ziWgKm#lfmyFugcWg*AD>L{I<*a;BB_UPb{3@StkY$70L8Y&4!h+uN#`p?t#CjzKg# zxGv!B>NN_}&v3NCgp&GtEa1;ExEVD5tDqLygT#x-tu@NbJz|DM^f9v6I?BNV4{26DoY#uVr2mdZ)2O(e1K8M zCPg=URz5gNkb{9AqszJ$6-&3MoN$mzs^V&A3k@xjJe%imBzrIjo`pL%l$u4&Hhe$1 zI(#uv>0907uA`|_jQ_ejaWS#b;PxfZmBRVQCVF{!m6XOsC_Y`Li%!9Yl}k{YLgf`$ zP1OJM{-U?4zem^G8W!D$zFJbw4AQBa4!7$oRn9+yXQ>$!Z1efO#N+94o}p zy*=oK3zIlAsR~ShKFJWH3;!(6!)}Lobie^esP4S2(vWy)z5ho7DCWeEf?Q2{pJ^p} z=C=FA-o(4Q;ZCiLc-HRyw7P?;BC)MwC<;jrvy_R_?cAr?{%8L1&*z`58BBREm_d0 zDjCWM((C~3-?5%AsjcPlLzzQy?PMDaeVljIV-rri?r;FL5b$&-6oHcVJUA#Vb9IsP zWF#;<9pHwP>Z-gc+D~2Hp0HuUgr7Pg2Em=2tgZo|y;pyV6SJk1avh@n@$&n~S7_T* z+ixfzAlSMEo4(yZ0dv0@p5bM*^5p>KiQ{l@E7sH7I0z6B({c*C>^-b?@NrNHE%3ZT z@kro{;JUUt*}PPx9kW^d6BGv|o3z&zF7^ehdV-3?OSn6{SoO-h)?HmgGXeB&qAp4; zq&T-#n7faIhR*(Jd8gpJ`;3=9?H|lmcpIr##9se;NAdwNFh{4;AF)RhT82+prMSmi}ppl9Fhg}ojo97tW2Rl^t^ZF zu#d9NtV^k`c9@BfhxxclxewpnJC7XQ+olf@)mM&2Tk8TBd47}5l7r612j;i3PYkuW zWTo+WmjqsIwY7Eegv$K{kC*v`0NWKwa=?;5BcRAU7`(n~$8=Gh|Lf+iO6Buj_ft9Z zGQ63~n@D}O83n5ffsnE5mkILv(tgBHWm8B-f2x zk%&nz^(J+4(}^{n?~m>KOPCUdO9T@P2$?=TFzwF%K=!uY`&4WeaLpPvK&8EEerxFJ z^5`YO)hx0030RJXS!F=KD%FQ2gCKSAJsRE*;`zK3oymP%-ppYQa|CvW9Q?k4J(h5r16mjfW4|J6({H-F^^B z0xfd!ykm%jvJg)*agy>2H>14+F7+R0w=*wErsV7&btPp`KZQbWMGG2}o)3dr6Oj(5 zDsq;A`x#3-1y9i?SRIMIGBWnR*a}b&+FDixje4NSJ0U%v(G3cn(a=*J z0-og-Xac}}Ul0wHy6id4D1<)3IM#YSHX~62;*RgD`}12quScg0_mVT-LMS-Yr@ly2uu;!k3 zCZ+>PmgHN%PteN<=qX4?ukMPT5?IQP`8>GK#es-oyKh|Y-~j6yDL^!hqFoJfk)E3) z3vACR!HxuZrBVeQ86t`*ZdT01?htI!-u7BRyR9@K8WuV*3P71Z$o6`dO-qn(wg8yu zF^lXm$rG3?;&b6T{rd|M4HO#0k)*_P7bm2l_v4+8iISW(H=I%AzCC5Z*AKJ|9V6+V z@SSZ>yunfc;gQ^31}ww8|Mx} zpk`QeG{jEQZo+~4x_ahIH-kt>{4xv9UOZ4Aqo`8ODSHBp3PJX!6~5|$COI*Z#rO5R z_jm8ykZV9;RQ7Al$`c+R_!yKaycX7Fj==`;ilnfa zrYeO7vir}~nt!&e@qRWexxH83uu9^YKYwcZv{%3N@OgY5&*-iGS;em2eE#gd`F212 zc%1$`$sPS(vOmq|TI`=8kG|elgb7l|zl_`u4`6mddz zm70H3B7jKh(>#pw<(W7z9;Mb5ii7nTHMZ5im(m5*9sdnEKc1}1a)wB8A?QP^b)EWLg0$bqP-E%)Fu~aIknBzWOVV;&!U>0S{BST!EDvnc@o* zk?DXJqpt3T_Ac$p9^c|}-n+NO^Y3V3{Au<^<6ikSi&d^2gR4|d8pr)N`|1bjzmeG_ z*UtlPrF-z)^wM1q`@dbj^_78t$Hhb|f{XY!dGpsvDbXtaGdyK{wfIRX<(O4B5*j?C zhI@-B8(!7RlBqta6)st7Z()1hw6>Cbh1N0OnhGaqjaa)V6Vb?#FwHW<|A&Rcgl8U$ zGFdNUUx>D!v=K@-mdEPuSor_J;JC|ptQ~nJmm?_4QeWNqpHr;+D}LnzJuOc45^wAT z>RP>C4_aONJ?NtJL5qg3_hz1QWi{Jzo&9w6Z(esE?GUXhi!IPnA5+c$Hw35RW1GMV z^M4sQ9|nFQi!yNZgF5&+6cN0~n}*=VZ}*uw0_Swa}D}G zDXmpI`T(k^Ww#HKHmI%ZrY+Krrj65GrkUraAL~qC>C?{-8CRRrs=7}Xp1@1wxhrFp zzD^~k*i{)F08&yj&mnhZ-4U>qffdr86ruZiNYuu(BalMp9(SyB#7t$1!MzkNh!Tjm0Y90EpbaZ|05yD;}2mprrdIe zuUqBh{oHjguh@o(F}Y40xVFd`QP-E-vh|SY_Yc0!*{;(k)y{eD_xgAH@-R%@PPkH) z>czjwXMok4)Z+C;soHLy&9X9Zs>R83acxWpeeoNl^8igMTvL>PQ!Q^=utu}H1fvUG zN?q*scq&()FKDUq6YLO*f%I<}2)j|H5@`ZTm3Wd+QlP}9R}8ND5>@igO!wPVTzfOG zViF1dW#JTC6)V=|WIAy|DjY+ysqyi5ZRH1L4}faBTpEAwP?8|G*DMd>OE7X+jezmUCMc3NF>=gCn8>gmE{$VTPfTO@ zK}ERYAddVmc6?C6L80slkHyu16%K!na})Wt^A%&R77h==Wm3-e){iWXlGhD@b;px| zrYs&bbPCTtFTPx4$8($R^7Ex`*(_PWn^bOq;Q35FQ$-sUgtrlWm{~GM=%!C38y;C1 z;HIZDzYHlsnjUoO!H!`7C|#R?nBN2*ajF& zrP8N0Zdgb2mzbjvxVL#Q@4b5jae2`FYV&FO6;k<;X z=4Dj;2cJ_Pg8$LfY~a-Wy6rbqEJs6WUH805(ZDFltn`sJxa;-lzTcmwqH_MKgNhqxp~V&{aUG(u#iwf+ zI>QS4ix_ES3XnI>KVpNKIaijGEpGAegg1DRemZkixX1$yzXdIIxT374OIPQMt{?w) zm&z{VcvVE2wmRW>WG|<@a5hRdfZtE5jmp3Z=BP*7_Mw z^$y_i|f6TU;$M6?DJRE zR7sB;NY|-~%2oGIvG3w-*Pjz8_y<&;I}5AVeMu{8Lo0#mMl}77(?QES$K|K9Lk{w} zC2T@>VH2e@sHBtybx;)ScNvYe6+3pHksZkxRl~KgWS5W%6DWWR!v;f;NMZ=AA+-5d zb~I^dIbB`G?H?sw)T#ssE6+T)#5^A)-yyW@e-GrmWYr{{MyBs5??Y#fFX|c)IL*5& zQW1jZija7&YElG5iu=2>3n*&4YL$C=^GEmE&3l)FEbqUEm3VVwzo|9f9InrEVH;t6 z2133j_w^r+GR+^-SJq8ki*^IVv=7mqmK#?gOtu)Uv$G&{;tr+bT>{;SzR;*l3^sih zlyZp3IYy4GCoFm62wM(4N~u1J5tbN`=!vUSwP1&O;?eM9%N@IP_T=;Z>Rc1MUKIGh z%9nwR^0Pv>dl8?Xna_WZGRZa@qflZZnp!&k%ljtg-5MyiH!T7JuOD+F8N8AIvh@$! z!wV9B2d?CrfnES|{j&Sr=jtf$5N%LiD_Jt2q{S#PLZP)J_Wc)uhh~LmIAh5K2a&)- zsYCeRxE-O#*|;EyAXU2LeWxNJGqU0u0LBg8WwO(>j?U<325%XUMu_FVTBxjLE|>-* zXp&J%KU~lBDVnwzNX@@eC5kKOY@%0u)%Y6GeQFi((&LnISKy9yrMMDzAT81dQfZSZ zDq$(%@6Xmww~J?cTxWZ7Lg2ac2BThz;1vX1l%xyFzkHm!-~S@(oT58xq9`AyV{~lW zwr%}mc5K^8$F^AwOvG&;~!pC2SG3C2g1RAZ_+?0X+C&(`r%>%2_BH;?H@}=5PTf%@E=RT_+ zY65U^RgQr8c?lQ!g292*9diZgQPc{-s>m%VnnnFy9WSa3PA<2Jw3TE1*?GS>GXMyH z$sK)qP<)AT>Uc=vQ7J*F^l1SoDWuH*VqdB`yYHc*X;l7%jbD}vyh&ETnMN&_HDxcI zf(guu;5d=nsfnVGxK*|EB+zZ-#GN)EE4~1qC#p+!P0YNtV<23J%`)d`>5PdeSe>9G zj>%c7x}&@wCdxmW0wkQP;>EifKJE%gN}R|@;YjC!>TOkn*JI{679{%=m^;a$YQ8YA zoR}UOr+XVly;ndExH-2foE6Smw*O9eO=!!9;0Mo!6cjh-vb0R)!x68~t4qPHw5Osq zI;k+{D5;t=L|pGd^gt*wUFjv%mqw{wJ%fbx08h*vDoBXI$L~u~MF!q`{Iyvj1KT*m)YZI$jb>OJHMRW^+V=~gw!7ofnM z4CGHC<_Jc^iSW~Z`BUm*{n|wvt2e*3Om;)ak}mh-Nf&8y1K7A!kexyzrW9m<_WmRi zjMtCQ7*_))psFbR8I1Dd5#Fb$fSSotnSaZJz1O-DhZ+8%!6%KHT|v)eD4MXRnOvt9jKjXFzyOr`w2X8>urmynTxT_8ADy+$JnF9eUvyVp>FO3I|jtN&27}S+LKs z-3jnN70xIOh|n=?ddhpA43{Iv*(n?zWp*>S}(0NnqKHCNVlu(oov( z!aGGjI<>m#sUgJFt{qskWc~DEd@zV91JAVCr71evd);Fw>z<*h{zRk0rt|&a>bbne zpDCRL_)Wp`pRWZFrf~)NIwhikKs)rFhh~M6sCrtE!nh!v*Tut{C!2eWSB5Q-I|3ee z5GMo}N}Z2;{a+(_om1f?I1f}*FjrPir-|&Gz-nyqV<9CaeYKu-gylkF`^6e$AZ{#? z6@JnG-fkZK-c<+YAf~$Y~+UsAub>xB}Fx{3Yu0m?xlaY zk@|d7B)23tg$heC?=iPfCdtMp6yk#s-`YuO(0&uBtcv{04U4*=q-5q6HM}$e5AEiM zr{{Dc$RWO6ds?3b$ajyB|J`ED_fq;=J}2Vdp{!C(qM1e+NJUqXdPAXFPcxekOIu6= zY)Tb}&5x<08u{|CL{RB-MvxNACc;+HYrcn%lm(3@T8~MmBtIA>Hv4Nh#RnR|zdlyC zS7fWfN*jkGeXwN`RvL%+DQkOmjK5+>pG5TWceI1Wrv(=1<^%7-8}5rq9LPEbM&%x4 zGAI0u9OU>z(QVkvcE?SCvMV?V6j`Q0VnHU$SsRywob2ym72kVnS9P^dFSgDfZ)A5Y+;E**xH}b z?YUP_Us_sPbe0^>Yq!G!Ox=S6`BvILep6Vav-C0slz7`5oFj65*kpdOOgE659FIkH zTOM;(1rE5zrt^6$YC|3yT+MEC=6l!}-V@uI<@j?h|Im+f|0GG79`c}wYyMw|$UzA1 zj*b`08XpIN-;5~EoJn+!e=$|ryAGb zq!kDf&;O-&buNib4E$nGJSQ_q8`y`q85GBzQq|+8(8~9@(fbgp5&MYx!R+k-4Z$W3 z@)K5lp6^PQ^o8BA7iQz&@tfl)5`Aw_F1Y5f@&=%N$5V=Pi6)(%pkOF}npeopi^mwd4c-wwS}wjhAQ(0_~x8n7nG)U-;T%$8aq}io~^|3JEzb2uh#X* zR?m8_N|L5AX`UO8$ks{aB0P3BXGUg$gc-X0AB@OJ^6wp%FG=%nSEY6C#Ixch^24%z zZKbOEk1+EQSvd}y{^hul!`*FMpFgvo&Q38QtYLp1Kzn@4hzCX_Kd_Z!u-=^u3+m;` zf$wIwc_brT59B4dZEl(i@E@v*34E0_&krQX`f9R3y6{sc&Af&1fZtCLeHWjxaKHNX zxWQB5_87>_1O#R?b!>{k&N3$);1k+#du=csy#A zW4#!P%_r$z2Rt1DS|j>0WU3`u4x=qXTtFYJ9gzB>v)5iT|40GZ%drzC$fPAK`DY>I zkjXRMxOB_(Gc`kCq1P$rirj-s@li(jUgg>>*$B6k@p0%#y{SYaf1pOc_Jt00aUV^L z&%zuQry@hIUR-AhRk)Bqj`p}fUvd$GegyVtoM!w^1aW)Ur~+&&+ubZYjY`yAs4AydDEBx`&o6Mwlsu`tpSpD>c+N5Y=A%xPSM6gdPbrKoE3xS|iq33( zqg5tW=1?M?EUc0r#YT8@u)8~!>r;H*WYkL)rr{u;pT?DzOiox_mJ_T1y}qHBVubGH zK7w&j_>^@n<2T|u%jI;ZGAQx;(&PyAy|k;OvlWs2a4bRW8_bmCgyIfTyp}P!p_iDA zC|DxZvrmyeI24EyVNF-a2oro1+2xXkzJzM0HBh|6KcgACp7ak!*WhW~#4ws_^@Qfbf@~ zp9ih1AFMhQj4^g)XPH@xT>h-9$`AII_Q-9VbCa?Q_gV7fg>DP4b2DZWmu%F&!$Oy< z50nx9!o(7;Fp6}?sAJp!2s~}odbVG$7zS@A@o6$eJ%BviWrvQ1{`=b4rKsb5_d|%U z<|mr2u#eRTqlBH3&fTX-G?Q_I-huH14#K1x=NpH%!^!zcp<<1dUQu%aHvimwR5q+e zs~5T~BHEWS*KK?1KMz2%q(`mFmYO$O2PZBNvxGi85X|hCOv*ivrHZ}SJVFw)9m=AP zjQ0{e=ZT|n>BGbAR@`YJ?=d*0qoI+ZO$5W5p{3laQ**SU+sl3Fg^`iQ7;Z9auNP)t6cU6|WMvW3tSCCSC6=5*d<14Ot*fg9H=3Yq`4 zW&?vY=w<6VWd)OI^P)v}`rm&;ayD}Xt%8!5lGe5{b^PK94*rT;ipAQs$R#H#CeRy| zfVSKP%&0#_XJ*9?#?7O!kK>*7^AFUH<8q3%2k{!D(wtu6(@IlgrJGX)&Ya4J$X_(I za_ZSf#s-i@l6Mb8Wre`mD*m=)=s~uPFhBOV-i2{%lj`Btv zmKXImNbzLIgputayUcd#jq2q}1nbit;hd^z3V1-?Yr7TO1jMO~#`Vw)SWA^eMhW?< zE80EkIo6dQdNs;`+zJdrt81t(jKVcnbg48ylc4Q5S6QsKL9p|rotdpGv>g`9po6Gl zy0*6ddRl=yO!<|yt}MvGK*Mln{6H;RWaFl(EOn^dU>++z_jo&n!>qmhf&O1$7^w#_7 zF`zZToW)u8;UyZ2C2fa+V8_hhX_Zqsvvv98NyWDwNv>2_FzYm4i>_V7Ru$>D z9khQ~p&9(}Lz9K3Fhg;q#-#GknvHk(tNwzR7E8j3@yb9L`7mRQ$NK+D?Jvdx{eEMi zNJH|?eXMEO>?NlK*%*H-c*kv!6YU*So!zT-Em1_sOBAk0wi$KAspLPRTY}3+tqm0g= z!5=5Kc&c@-E+!N3dTDRvl%F@YY+JhXYZWpDHQkalvK0cFq++~qWZTh8ldNBPO#vj&UUf2)rSRe* zan9;3*tHpYmr`z(CXp@4|8Yybi0LmY9H|$(D;W4wyd&;f%5`88Y3M;e=EDC!ZYcxT z9OZx9(hiyzZJLa5oz8})Ae+;BH7R)+rPd2{|JD3zo9SBbo>}V<+~CNXyL{7U^Re zx+;T}og$Wr?y8?Z1iA8&Y&S>U&uxaLlwl&uoq%;!5T$gRsrIBZrMM;psVDbTWt)o} z)ealWxsgDfa(oSSYtv!V{BRHne|?#YZlqk9flav_QdywRF|(Rm9UvKz~tcz~cOa^mIn@+mjY zZuCde`EV4VTbDd*o)oq`MOQtHZqLG*Qmyysj01_ZibO&8`9(rt+gp#i50fR+gP6qN zq#IMfUlEMVa!pa4@~fc?vs!c(G=Q<+ZM7>Sr7X&cs!_;i&$!go>0va+a;5Z21|m2b zbl)=p?-h{_0;q@wD7PxY>;uW?eME=?1 zo?_nQ5r#|6N~7NdG;r3o^vX@=0#X!(L`^z==417;G9I%l(gFGupHH+m42f!qxM5{u z<#AnA)lB8_0><{{riw5suz-=1JxrK}r1<8TI$CL|iGJkNQsh$^+VuR=lZ!8^5HKd- z08&vFrLDcf5`pr>pi`MH6%`>U778NGjO^f7K+YFw~$lDrX~geC1w40 zDQd{U=fRH*UVHg=oiS2k%)weJ0Vemp&5C4JLsr`Kdj@%%eH# zWmo1Zw^vk7x0VCDAVAL0aYE2&e@_%umvp}lVanKlZB2t@oz)duTKd-kpv1uf+f1bk zN$|!Vn;57415+o>Y_U@lCfUZ^Ty%H(&sHH#wOn%lsswgd5h>gO%9y(5kH+!X5S3?L zB9OFy6u)^Ll)Vot-ye5CHi{%9-pk~@EE$y^6Ro|oNh$akycsU>RQn`(-7*`{h-R~_ z%h7}vUORRX|F-**Xou|LNLEuOu}di{W&P5KGaENc$hw0Tig+xI1Nh?X7grHlAg+U` z9aZm9*N+&NHP_G}{WZEekS&$zN_42AtC ztsYHW&^?wlP6&gxe%gShKcfa<5H30czoqi7Le${7hzcWam{KQ^^Kx2J8M>;AbG|0y zsY*|X^oN5M>Tz%$?R);~5%G)cdZ#f&875k$^8*w9vPRL!S3_qYl&uJrZhfGFH@g{6 zXS5+nH1g=C*M-Wiqva{Zv~9wW2sz4Oy_W4v`*LN2QeL5}F|Iq`xr=!JZUY{lb*z8oanjdo_Q1sY8BQHX`pk@fE^GEE_fiC)DdodaMcD{GKRs<-2F z>pl#=RPcbU_`7n(mL_V+KHV)bCLktUId|dQd_QbxQxw>ui~RB+bSz4mu^{6VIGrjk zXHphIJ)Amda`wX9EbL0we^Uk6dk3%g}VE3-n?8mZ3h9$b*Jv>e22`9U&E&y=On z1a7lEy22diz>ZWF^b85M%=SXuVP+nSExu}&7614&3E$9^eM|FtfT%QU4~3FD*XQH; zkWzI{q(J9B7)kHXH=47KxG&5T67fv_lj~zy0U?R5m&i%oV1`4yCrGU{Z z#d@bN5Hdf2ZXUVr3Q_2L#4UP_@{CiD^dg>E>iA_bMb?fQ7Sg6;E}tg^VZIuYWjKx@ zHqEq)?2QUc;|0qP4~{^OlZ^t(3b^B&^88bPDT32R;^18Q5QWNiqx_qE<`%;0b^BDj z=&mIu0Ba1p|J0Z52t)Y0nc!psbASLI5q5GPK8kqL+ZXRw=l68go6oEK1^n@J4^`4m zf!lXZ=W0(*i6_O2yd}_u?zL!@^8$xQJ0;rs98Q2-C(L&E=HFS@k5*4X#hm^@LINsP zd3uaKIHbcf0A?rarq6(g!QO2j+eu8py&ut6->#;ze=S?NWqnkJ|KI5}#$m)!|8f3f zAm}M4x!i*RVK^Xsl>S@r1Uc{|AG<5p8t2?{V}M)QA60ME*x5M^pbSTB!=~4#x{e?! zDFeZlzdt=u8uHSj(ta6rIvm|-+A?|SF%YjezjadF*xJ?E(8kjt{#sAAjWVjP+Woep zz_G^y@%KoatJsDO&ZYDPaF`-SO;{sQUzw;Y zT<7CnQ=xNF@a0Es<=hcJr+TdVRipO3CbEkc@iJav$GP0EYKA53B3=COJVp4HTvizk zSrAk41w^2&5x`#&(GKG5wYZO-t(|7$L02x*WKqVUM&%W_RjswJ8caXh33nqDYQjG0J;}wG!6FSAWPlzC!-|M%5g0BIN$p?osqrls_s(N zh43rPx)A6itg5iJEzL5I+E`lSPf<+eYsn`18f(jg^L2sX%|^VVfoyx&Ll}n|@o-I= zAOW;Lp?QRR`Ci?$5h^>MMED%pl*pq7Q3l%^Apv`z-2CVEmMC2Z8B)qI2R z^qUACdg|&-cy~A&yf_7fJ>;_OyUIHptRwoxe@Ow>W0^s!{}Lif-X&hMyn+~H7gT0jx-i%rz^w&QSNq#60@EwL= zC&_=}Jdo`M*QGVlWI+U*Q0wK6V452|6Rz94=~wU`WC@pZx@T!O|2fmuVAr96G|8DV z$?zaX0<52*SYhBNv-YU;TqR?IGon>t%fa$^f0fm5m7XNs@rDw;YNH2`PNEqZx=xiR zvMR1tlR)Gd8&Z0g@*n72C&p&u6A4U~I|1xaD+9pzz~@w%&=$z=1pV6Z&lKvgmm zE1iDyYI0JePQWIx!l}t2|04h7wU1-xrdT6#>LH@SxS%anOdLnLaPmWeqPhv0Ez1yw z)Pcg@LwbT%iDE{nC|QCYjxMYN#R3X8#4j+_#Ei0dr2+*Sz;n%30xnEAjnV%=fFlNE zfzNM=_sLbjHR7kg$oK}co?xA)jIpmH3>}U_#|S4y2~`Zt2?;)Vg08e)s89w?7iBplqqEfjcul)4x>{1NadJ8F; zpaAY-a}l$kLVgiI5DAs4S0N9qz+L(gnKjcHSma){)gEUOW6`a;^W;ort2pJGX^Ol- zpeVYv5QX;HF<3%9d#LEIAmPuAEd51Opc0A#?=qw-K=3c2aAa9hSvFBg<#-Jd@{m1! zXRyCuK>uQnMMn#pgOF}koggZhG2B0qCB;Lkm$WyJvxM+k7qJN*a8(HjqBHimu2(CsbTL8Ro9d&^e5{7ZY{!g;8 zS;W)BiO5U`B||I)B=puiH9d$Xb`8KfC8Ga-!Hh2`BvIlLto6vJ!QW(Iy;yQY*dAH@ zn%f0u27qK23rs#qxmLGGR@AQ4uGR1>m*lvn)2p8Jx?gfwU+z!(KtEhRZ-w7nt+RSg zr}v}&V;HZf`*uF<%zi#T_Ec64#60$d_I#v$jkcZmev|lGB;1OkB*c*fYatF{?EA&F z5fdO@60Nx@dPUn9!hha!gbw=PWQ*@z^KG4b>+F;WdE#jI%YK^!K8V{f$YvEjc=HN< zuU|gLa-lIa;XD#@pw;hSB^K!!wbQ<`I|F@XnD?l}^yV&jo9?b|&!n7Z^eAD>B~Hn~ zT|~qEt1-QoS9Dd%iBcb;s2+^WrFJZz>8^Un?GK*i>Xf|Q;15u=P><`j;R+<@dc@jT z)Ba@Z8fFRYkL8uh#xpi}L6Kb_V23CMoSC zZjt(9vMyx8FaJYAq$FAWWifktoP2S^cXOO={@YrSF!*pMef0b%rMaj9<*mpI(9~$# zxgbH`0bpxN%ritR47rc)L(bHwU&zV3`|v@6gGxIE!!=e-b>KTi1=Ovv5_(xEDvYKm z5%utVd^!b&!T@vo;n41baFi9OMY`1ye39cIkcj5!UAfKbh~fDHlZtAm&b54(M)DKE zye_4Tt^=jNx;TlOxv{ z;1-?R@qm~$*Iwz|(N;@ScoACqau68;LU1uif{5G&ommBUhQ&UmZ5NbB3YZh`Pm7X- z%IrWtmvI4~SL_Ghcw4@Wb-)kbUuy%9=P@_zbKgxP|4Ar6PT}77IHG6tIthF3WVNkr z3ET=e&Scx&))`Jh!E9I{Tp-q0hy%5@Zv2$a0*HeX`Y3nU6b1(%1yK37O8C~n3TCWVX9>+bvMK#RO)m@IZK z(Z8A+Mjh2h&WCr0E5Qzdt7}2nri$(5@MWW-l&%VHjb+rnYaP6qJwJ5U7#ThSD%H=@hShTZ5(2S|rV{7UPY{J7^eDGmAmbfq0dX8Uil)5rb?M^dh@Hfi zJwQ2?Iwm&LKB1A-3g)x%F!5-s{Jk&z7abmAk`Jsog3+4%`ktWf z--64bk&M;F6|Y)~tHb_0KSE%8duN8oJ&#Amp{(SIAw1%Uv#xdBv4J(4hyY)7JvhA1 zJSj@wB=uJByTVP%qsXN6HOodzdH6HDW0*C)xYk}6#LJt9dgbS)f+I!HtWZA7X6{H% zlj#PnphAMlLSHo`Q@%YzVjT5?6RJ@0&7}C&8+y=dtDS`33AC^#=lmYADL#x?ukNRT zc8Leewe!J9Bymzy@ZC!uXNxg*Q=+3Z5o)ndl|FVfh5@L0r-4ZI+lhL&kdqdOUm>5P zV=cW`;KR}S99gmo&gKlKF$0R_zOx%%P+<$8*;y(8G6f#`J&wCW&Hv?0Nb? z(bMd#Ej$~LMjUYZe%Gq%()Yx(uowknRt$6}5U26Q_G_q1$ah0}4Zl{NDgy)g#ls;_ z7SmB^a-CHZj0`KeLO=ohJMK6qc|A-g)A>T;cwbL8^V6MO<{HDE&gA8?HRmDzB~J7S z6Hw)HllqiFH|XS&*aAgr{WyUsc09eQ+%b?;9Q>4ak=gsjl9@UBx0n1#%+o=lNIiLS zfG}1rFhW_-`AlFpyZ}UkTTY)oZhSaEk6rG=?WJjra`kVWehJjC@f^MWoACY~M^i3m z77BYM+Jz~+2^ku9>KAz)&MxKl5ep!W z`U!0%V%MHSP{xK=^BWa2cPiH-P+6z-86mCyO1z>d>u|OH>XjgyNz%Ck$yB2O4#K)K zZl)-jDzSf{6NuvAnVqh|<4uKVv~-%b$1c4c<%M6#fMLQ(!zskl=bNitu|_Mm3u74q z6H}79nE6AMDTshbssyRRe`k6nMFqr5wme|w#+!>O7ehY3dMU6HjE8VWcd-EGcqC?K zobIN?zvc~b>7~TXb#d67ze83OB0Z=*rwba0ya*p&ACuXZG*_`2^Mkh3W#P=~Dpak@ zbZ&Au*4#+bXHWBpR~b$esKskGfTnO5+u5|($_=AE57}f4_{}Pz9N}5J%;U~vsNrDB zVI9Wb#n@2!nQ08ToNB1XfGWzz&S`428OvN80=YFZLO^?^`~D#VuJohpoLuKB*se)c zh>BoUkHpt37O0RODxAYQUOueM;*H|Zm7aU zlc|qlSB>mP87+Wp9>spQ24^;tOhzs?t*g^aelMXW%ykKsk9FDsF%#Ta<#9xpCL+p4 zHsw^l+n>>K%C%_~kx_VH4hr!Igs%#GSDkNXGX? zP;Z@lmWvA}$JXY*q8*|o2fO|S(%p+p<2X!r=>ZM)%iov-G``k%VyvFt#q@uzEaA@* zJHQ-LnM+bNpkY7REpZvPHUBQ<^&;BLs{%`#ruZp2?!=t31LJ#6gm_&k@F6`c%#inI ziE()ADh+r1Prh5OBIupNtHj%pJZUbZwW@hGEx~0_{x*0_>1sTSZx#>B?|*1 z7Z2-NBM)yoiYFNQ`QIc@VM?#Cq8{ip-)lu8+mUnnslcjZ{Z zOvCt~TxBq!@KlruZn2@WG`=)Cf4vnnNahqG(f99u!ofu4cE&y0@Okr0-}Rq>~r zTAjz}J5A1$2sz^PF-~c)#M5$E8etl-8QTaQ9Z62aPiIR=&9zDdZJSpEDkQhK^z18=8b)Fin_fE+WaUCEbj{nI zN|gs@2d-^HKPiSwpN!~Hb6z(ENcPWtVljXwl6lO=lxd6N2wG&|0b|tcj*`(&>GW$` zd?@^txV*f6nB~rl4Fu{H?xm`SER8n$CfRKa@U!wT3)Lis>J8(R7wy?G5-s$ z3e;(tSwYu}_u0-e!FPOdiGPa#UEX2{4kwv?vT9@A>}@r3zK-+0$}w)yr21y|tWV%yC3rVwyA=m&h2EqQd)}9MQo?0~}{Y{sKYvtf@Rj`)UHB3WspW&$IoJOw( z8>9v53|{05q*@(_G=N9?4Fq2PJr`KGN4=p%DY;&_UGR30f+SWtyM1~iP+Wboc45dbb+lv<-EYuzY4c(*nBi>ZH#zq`AAGV0X?cc zt89ey2$L^H*$Zx3hiUa=U{N?E zb|kVuSd@O+LmwD2QNiStCCQRc`^&Cxp>@0%csP)WF?Ko{gT#MhLP=qg2@736LMK{b8`zuW)!QG8By9}mmJ+7!D ztmL`*dF|1K43P~<=La$@txX)+m*hUOeLQo>r_x-1u5`fe{EbY)f~2LHx$?~CjTR%i za9K?NH|O7NJ9YnwhjHPpkx?Zj4hQ(0xMoF0-znz_~bF>;uRwzI&XYy+M^?|p6yV1-*mL2cg^^llB?T&}&8;XdP$}-{>kaUEzYMOw<4sV8s}|nN5{?^ zb%@uw#W=xDf}V~p`Nf0q;E@RU$nxx^vbgeA_T5nIXM7ozoaCuKqF}(WDlWmI<|4}=1M>81ado@QhIkGWQFLegve&HX1b+JhTGY7wfJl~jty!?`4p>(cXd z3*<_v(@53t&}!O${ek1iXb_!EZ`-;D3!;AS{X%CK+|V~-d5fnC!k7f2(EQpFay*Gz z1iyY%)+Q#l(wc_{c`J==^0+SowgWnT+hT>n8=om$XEhA$M zvqoA{rBx7!JXFU|CuJ6z`z>IN58Nlyot-|QUDpe36$lUR!f#^e4b8`}%PlZ>OCWCnoo>pW~( z1D!Sw%&>S*t^Bfo{*&P>aarB4-w54aZ~%YdKmHHgJ_2c z#Pwb7_cXqxi@LpMZe)FknOTx8vFA-Ox9}9wyXg*je7l;yTl--qOpn`C0e* z>fi)>-Nw>dg`1jivGBHk#H#;RA4Ast{nUSNckw(l#^6N{)&ryQX%lX9p|?-ap(xbm z;+k=ne5+Ji0A0f?GDG4r(eTvIGgm1039_Ag_@x&g5+uXRw{&`U{D%<0vWbT>x-^b9 zPFI9S)vNGq05@g6g1PmFFi;Gm0Js(?%5v1q4TPC~{xvry@G1!ZT}MC9;1y|sg`~5o znfs%`-f4z|s3BmgX2iL@(-Rkl^p>~(ALs-SpIB|PR2bdRb&ph+6%I>GwujWVB`&Lc`UW~nbsWqkAOi_frw-qnMlzKCV$f?wJexGw8vKJ zlv8i86{(X^I`smR&yp~*Q|{_Ph1I3bSFC$cxG{EF>z+IlZ|WKk z?&i;#SKV!&1D3f1F}#$^>&MHUwe6YF?aZI2$EJR9SIXwCRP@qHl{s22VZPHJ2bjv0 z2eJa~b;|JUmQ!0n1clU#nIvA8OFd0cvW2vc7un-~lvpJVUEgNzDmh1aUp{`DzSt)? zA{>@%6i8zg$6BM0`M=M-ro5Y*09CUg$V2hNCI?m6n8>@pGvb4YcfPlLXA(I|{~nS# zOm`l5*a#3My_pvu=0g3qdw&xsAffW+t3_2YfoC$|#J#*2lE;m52w?Am`g4P-d#jE) zwM&l39Kc{P&Mza5mz>7usX#`ho0Ce&PPw;01Zan`%RW8ty$%WC0IxyM{ZM5OGuXSG z8lqR);7eRs2E;oGss3j?FGNTB2LxM&*qHT)dm8u|YfUhmhKsBfp6LH)77Ty@?3!&hezALp|XVw zw&(Mo@1ZO)8|&NMT-Ig5)TvkL0Y}96PM*>vzTqT7{$m2hdT-}l1H3l9Is$1zP*c*CZe1tql z_*SK|f7}y$ynWNVPH9e@owKIxcFS59Zz6W}AHB=+U{F=5Fk+N$7<1eAD;H(FSuLsoT5yU=!7a&Kptybo^`Q_KoSrVL@!Xu-OhY1im<7y~ z>T7OKVD15C7_-R7{Uu+?KSa1$OG{m1`-_Tx)OZx;#dleL*vujzryw-7H5@+yHuOIA zLDkRjF2wFI;J{!Ijb{)+O_$^cbKSW7C;h^i8~#z6gr6u@(%8YJqE7NwBbA! zH$@kQXY}kCIqq=>O0$oI75^&5$+TkI%vH5EoAL0esZn?|iC(8lfAXG*>TTQH0q*d3 zGD7w81!HA300a%sSQO|*10{(m46kHd51Z-Z9vPiIt{0y__}jB$!uAppP9qFa#@mX+ z;$Zwm+T~>N`?~OU!ymM<*a7pcy!6H(=mr)%5@AO(qGdHG$n%6cnr)g>KQ;ivBT@PM zuQ(Z3p$b;`OE=Xn#G~XJG=LWXDAU@xX=;7;;_$D>VbbpY*q5vYIi)6zvj#2uTtbUb zLT8~enrK7&DoloaMNQ(@L7%1rH~Pyn&44)@??vIi4|!&)jNDH5?BP`fk$E4o9MHdO zUO8V+t#m|8i7-wUm_57hxSO;n;@y)-DaLW@6U=s|45J)ZRGa)be-yXHs~3NCFa4(9 z7ezKi&ZZB!oicACrc5EbPCa5w|HG3e(W#%-e!V#n!@>NVU?LC z{H*+;ec$TiR#2E5=`1^7bakP}As0_`)d8a6(MnfS%bgtaT8Yue? zA-Uj=yy5Pr?e7f89Bm;qk2NZE*C*J|Y9Ug7*eUlMqOa!0OBd!HCDKfYa;s{n(^>g6 zgv#Lx1O})$WAgqaEwK}|T7uVKiA|r_wK* zB{2fqYfNsX9;%H&MTM1tm$}5<;>__s+c*$Hw;Q%m0{u~CZ#CA_zJR2}X()61uFXyQ z5b3<_aQZ}-3KuScZxh3z2j$|L;$0s!(v~?8I&C#(Cw+C&`5$RoI8%GG`acn) zBmTmdBB`q@IcgJ%VJI%Y8#AhOyTaC-3IQ%zp_&MLf;KtRr$rp+_>AOrRs1DwS7>D& zxIZwM+VkEa7qZyiCg>;F{4nT~3ex6H%9{@tvhii)F*U0y6v`D@RqPu4H1nCg=k8xn8&gWj476E^}ALOL<4_D6S;aNXU38O?$E~`|8Zm)lpIP? zoX*k(@R|dA9eO8xcJeuLThVX*49)3%>NLFJ%%Kx7uMbYX< z@H(JZH)&y%>H+QWrPo$;)WUb2p#flJbALDq3njRR)Z8-9UO3HGdTW>}T(CTAoZ}18 zrAkaVP5?}cj3p`Mk=v5X*YCHDMu&pz83$RNrmN zk@Jp`B{FkzG3@Q84NUT;Mn_HQKWJANj$5abLFK;R(|_f8U<3pY{C>@o)Vcn?U0svJ zDEz&1!2=h(3FA5=(X8}>?99CV-t;XUad5bpff zE1~U(p0)1_9lho#y|li2lD|zcw$vP>IvEGP`P-yTzNeqB`3b(KV|$*^Z*Qi)@7Z;I z7nTZZYczetLxh}fcBqGa+j_oE?5Vy6gnLuDzqhx?zn|efFmOnFr{t8Aih3kR11dd= zyz4u(Y+JTd6F)WgcM1V1Yq{KGMhv}LNF$v}9}SJmf?bbvSW%}hROy(zYdXF-nTC~n z0}Q8Vqvy@Z$feD-OYWh4CM?7QlLc)MFg&HZk~jqc%yw?azrT6Z<7L`UBE3-oAv5SbHlE_Vo7R<8yp_G**ERMY_%=7fJFYo+_?>?4%P!|e@#y0a zu3pf$#79w+!kxLe$0byp6A1--EZ&|f5wX-Ongt=Q8xo(TS2N{HvJv~EN1ebJ6-(f4pT

    !(6sV1n5K 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 S@BhB~-~SKh%|b5#Nc{k34C@5| diff --git a/scripts/eigen-3.3.5.Tensor.patch b/scripts/eigen-3.3.5.Tensor.patch new file mode 100644 index 00000000..54984b94 --- /dev/null +++ b/scripts/eigen-3.3.5.Tensor.patch @@ -0,0 +1,19 @@ +--- ./Eigen/unsupported/Eigen/CXX11/Tensor 2018-07-23 10:33:42.000000000 +0100 ++++ Tensor 2018-08-28 16:15:56.000000000 +0100 +@@ -25,7 +25,7 @@ + #include + #endif + +-#include ++#include "../../../Eigen/src/Core/util/DisableStupidWarnings.h" + + #include "../SpecialFunctions" + #include "src/util/CXX11Meta.h" +@@ -147,6 +147,6 @@ + + #include "src/Tensor/TensorIO.h" + +-#include ++#include "../../../Eigen/src/Core/util/ReenableStupidWarnings.h" + + //#endif // EIGEN_CXX11_TENSOR_MODULE From 0250aa9347e3a6ba47eabae9d9df3702043a614c Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 16:55:48 +0100 Subject: [PATCH 459/620] file committed in error --- Grid/version.h | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Grid/version.h diff --git a/Grid/version.h b/Grid/version.h deleted file mode 100644 index ca8d9007..00000000 --- a/Grid/version.h +++ /dev/null @@ -1 +0,0 @@ -#define GITHASH "5f206df775c54dc2b863bacb5ade177ee58032a8: (HEAD -> feature/hadrons, gh/feature/hadrons, cliath/feature/hadrons) uncommited changes" From f3a0158213882a5b999abf3884a8c304083c9233 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 16:56:07 +0100 Subject: [PATCH 460/620] code cleaning --- Hadrons/Modules/MAction/DWF.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Hadrons/Modules/MAction/DWF.hpp b/Hadrons/Modules/MAction/DWF.hpp index 093dd1a6..0bc32b0d 100644 --- a/Hadrons/Modules/MAction/DWF.hpp +++ b/Hadrons/Modules/MAction/DWF.hpp @@ -72,7 +72,6 @@ protected: virtual void execute(void); }; -extern template class TDWF; MODULE_REGISTER_TMP(DWF, TDWF, MAction); /****************************************************************************** From fb3596f968ab23503b62b282e752e2c3d1b4f6b8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 16:58:23 +0100 Subject: [PATCH 461/620] Hadrons: precision fixes --- Hadrons/EigenPack.hpp | 12 ++++++------ Hadrons/Modules/MContraction/A2AMesonField.hpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Hadrons/EigenPack.hpp b/Hadrons/EigenPack.hpp index a6d4bcf6..f00d905d 100644 --- a/Hadrons/EigenPack.hpp +++ b/Hadrons/EigenPack.hpp @@ -56,7 +56,7 @@ public: VecRecord(void): index(0), eval(0.) {} }; public: - std::vector eval; + std::vector eval; std::vector evec; PackRecord record; public: @@ -119,7 +119,7 @@ protected: } template - void basicRead(std::vector &evec, std::vector &eval, + void basicRead(std::vector &evec, std::vector &eval, const std::string filename, const unsigned int size) { ScidacReader binReader; @@ -144,7 +144,7 @@ protected: } template - void basicReadSingle(T &evec, double &eval, const std::string filename, + void basicReadSingle(T &evec, RealD &eval, const std::string filename, const unsigned int index) { ScidacReader binReader; @@ -166,7 +166,7 @@ protected: template void basicWrite(const std::string filename, std::vector &evec, - const std::vector &eval, const unsigned int size) + const std::vector &eval, const unsigned int size) { ScidacWriter binWriter(evec[0]._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); @@ -190,7 +190,7 @@ protected: template void basicWriteSingle(const std::string filename, T &evec, - const double eval, const unsigned int index) + const RealD eval, const unsigned int index) { ScidacWriter binWriter(evec._grid->IsBoss()); XmlWriter xmlWriter("", "eigenPackPar"); @@ -215,7 +215,7 @@ class CoarseEigenPack: public EigenPack public: typedef CoarseF CoarseField; public: - std::vector evalCoarse; + std::vector evalCoarse; std::vector evecCoarse; public: CoarseEigenPack(void) = default; diff --git a/Hadrons/Modules/MContraction/A2AMesonField.hpp b/Hadrons/Modules/MContraction/A2AMesonField.hpp index 797707b9..4ca538e1 100644 --- a/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -94,7 +94,7 @@ private: bool hasPhase_{false}; std::string momphName_; std::vector gamma_; - std::vector> mom_; + std::vector> mom_; std::vector> nodeFile_; }; From 6b42577b6b1f739cb084ec929a3e465907ce1f19 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 16:58:37 +0100 Subject: [PATCH 462/620] gitignore update --- .gitignore | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index a633c0e9..e23a1208 100644 --- a/.gitignore +++ b/.gitignore @@ -83,6 +83,7 @@ ltmain.sh .Trashes ehthumbs.db Thumbs.db +.dirstamp # build directory # ################### @@ -97,11 +98,8 @@ build.sh # Eigen source # ################ -lib/Eigen/* - -# FFTW source # -################ -lib/fftw/* +Grid/Eigen +Eigen/* # libtool macros # ################## @@ -112,25 +110,8 @@ m4/libtool.m4 ################ gh-pages/ -# Buck files # -############## -.buck* -buck-out -BUCK -make-bin-BUCK.sh - # generated sources # ##################### -lib/qcd/spin/gamma-gen/*.h -lib/qcd/spin/gamma-gen/*.cc -lib/version.h - -# vs code editor files # -######################## -.vscode/ -.vscode/settings.json -settings.json - -# Eigen # -######### -Eigen +Grid/qcd/spin/gamma-gen/*.h +Grid/qcd/spin/gamma-gen/*.cc +Grid/version.h From c527dc3358c1e2790d408c3faa738f7267e72a9a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 17:10:08 +0100 Subject: [PATCH 463/620] CI fix --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 55f7c097..14a0b1bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export PATH="${GRIDDIR}/clang/bin:${PATH}"; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export LD_LIBRARY_PATH="${GRIDDIR}/clang/lib:${LD_LIBRARY_PATH}"; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc openssl; fi install: - export CWD=`pwd` @@ -33,6 +33,7 @@ install: - which $CXX - $CXX --version - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export LDFLAGS='-L/usr/local/lib'; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export EXTRACONF='--with-openssl=/usr/local/opt/openssl'; fi script: - ./bootstrap.sh @@ -49,11 +50,11 @@ script: - make -j4 - make install - cd $CWD/build - - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install + - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF} - make -j4 - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals - echo make clean - - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install + - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF} - make -j4 - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals - make check From 6aa047d842a429178f7bf9dedf560d68f35c06e1 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 17:17:00 +0100 Subject: [PATCH 464/620] Hadrons module template fix --- Hadrons/Modules/templates/Module_in_NS.cc.template | 2 +- Hadrons/Modules/templates/Module_in_NS.hpp.template | 6 +++--- Hadrons/Modules/templates/Module_tmp_in_NS.cc.template | 2 +- Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Hadrons/Modules/templates/Module_in_NS.cc.template b/Hadrons/Modules/templates/Module_in_NS.cc.template index 8b2a0ec0..477148e0 100644 --- a/Hadrons/Modules/templates/Module_in_NS.cc.template +++ b/Hadrons/Modules/templates/Module_in_NS.cc.template @@ -1,4 +1,4 @@ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/Hadrons/Modules/templates/Module_in_NS.hpp.template b/Hadrons/Modules/templates/Module_in_NS.hpp.template index b34568c2..982babda 100644 --- a/Hadrons/Modules/templates/Module_in_NS.hpp.template +++ b/Hadrons/Modules/templates/Module_in_NS.hpp.template @@ -1,9 +1,9 @@ #ifndef Hadrons____NAMESPACE_______FILEBASENAME____hpp_ #define Hadrons____NAMESPACE_______FILEBASENAME____hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE diff --git a/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template b/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template index 8dfafcf8..d8a19618 100644 --- a/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template +++ b/Hadrons/Modules/templates/Module_tmp_in_NS.cc.template @@ -1,4 +1,4 @@ -#include +#include using namespace Grid; using namespace Hadrons; diff --git a/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template b/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template index 5a05a498..da5bc370 100644 --- a/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template +++ b/Hadrons/Modules/templates/Module_tmp_in_NS.hpp.template @@ -1,9 +1,9 @@ #ifndef Hadrons____NAMESPACE_______FILEBASENAME____hpp_ #define Hadrons____NAMESPACE_______FILEBASENAME____hpp_ -#include -#include -#include +#include +#include +#include BEGIN_HADRONS_NAMESPACE From 2db1a4628c4d8b45e07fed3c14b2f5a9f4dfe08a Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 18:26:30 +0100 Subject: [PATCH 465/620] build system minor fix --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index ee8a0620..f57b00ad 100644 --- a/configure.ac +++ b/configure.ac @@ -41,7 +41,7 @@ AC_TYPE_UINT64_T ############### OpenMP AC_OPENMP ac_openmp=no -if test "${OPENMP_CXXFLAGS}X" != "X"; then +if test "${ac_cv_prog_cxx_openmp}X" != "noX"; then ac_openmp=yes AM_CXXFLAGS="$OPENMP_CXXFLAGS $AM_CXXFLAGS" AM_LDFLAGS="$OPENMP_CXXFLAGS $AM_LDFLAGS" From 1b7fb79ec030b5180f0c01ec236c8da810e1a19e Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 28 Aug 2018 18:26:37 +0100 Subject: [PATCH 466/620] CI fix --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 14a0b1bb..129fd582 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,11 @@ matrix: - os: osx osx_image: xcode8.3 compiler: clang + env: PREC=single + - os: osx + osx_image: xcode8.3 + compiler: clang + env: PREC=double before_install: - export GRIDDIR=`pwd` @@ -50,12 +55,7 @@ script: - make -j4 - make install - cd $CWD/build - - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF} + - ../configure --enable-precision=$PREC --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF} - make -j4 - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals - - echo make clean - - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install ${EXTRACONF} - - make -j4 - - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals - make check - From 2f0af79869d31006a8d7aca1ab9416e43018dbd4 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 17:36:35 +0100 Subject: [PATCH 467/620] Hadrons: scalar SU(N) NPR update --- Hadrons/Modules/MScalarSUN/StochFreeField.hpp | 9 +++-- Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp | 33 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/Hadrons/Modules/MScalarSUN/StochFreeField.hpp index 1e4d2265..af55b115 100644 --- a/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +++ b/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -44,7 +44,8 @@ class StochFreeFieldPar: Serializable public: GRID_SERIALIZABLE_CLASS_MEMBERS(StochFreeFieldPar, double, m2, - double, g); + double, g, + double, smearing); }; template @@ -111,6 +112,7 @@ void TStochFreeField::setup(void) if (!env().hasCreatedObject("_" + getName() + "_weight")) { envCacheLat(ComplexField, "_" + getName() + "_weight"); + envTmpLat(ComplexField, "smear"); create_weight = true; } envTmpLat(Field, "phift"); @@ -142,8 +144,11 @@ void TStochFreeField::execute(void) { LOG(Message) << "Caching momentum-space scalar action" << std::endl; + envGetTmp(ComplexField, smear); + SImpl::MomentaSquare(smear); + smear = exp(-par().smearing*smear); SImpl::MomentumSpacePropagator(w, sqrt(par().m2)); - w *= par().g/N; + w *= par().g/N*smear; w = sqrt(vol)*sqrt(w); } LOG(Message) << "Generating random momentum-space field" << std::endl; diff --git a/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp index 567e4662..83fa7f07 100644 --- a/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp +++ b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp @@ -133,13 +133,14 @@ void TTwoPointNPR::setup(void) template void TTwoPointNPR::execute(void) { - const unsigned int nd = env().getNd(); - const unsigned int nl = env().getDim(0); + const unsigned int nd = env().getNd(); + const unsigned int nl = env().getDim(0); + const double invV = 1./env().getVolume(); FFT fft(env().getGrid()); std::vector result; - TwoPointNPRResult twoPtp1, twoPtp2; + TwoPointNPRResult twoPtp1, twoPtp2, twoPtDisc; auto &phi = envGet(Field, par().field); - bool doTwoPt = true; + bool doAux = true; envGetTmp(ComplexField, ftBuf); envGetTmp(Field, ftMatBuf); @@ -151,19 +152,23 @@ void TTwoPointNPR::execute(void) std::vector p1, p2, p; Site phip1, phip2; TComplex opp; - TwoPointNPRResult r; + TwoPointNPRResult r, rDisc; LOG(Message) << "FFT: operator '" << opName << "'" << std::endl; fft.FFT_all_dim(ftBuf, op, FFT::forward); LOG(Message) << "Generating vertex function" << std::endl; r.op = opName; r.data.resize(nl); - if (doTwoPt) + rDisc.op = opName + "_disc"; + rDisc.data.resize(nl); + if (doAux) { twoPtp1.op = "phi_prop_p1"; twoPtp1.data.resize(nl); twoPtp2.op = "phi_prop_p2"; twoPtp2.data.resize(nl); + twoPtDisc.op = "phi_prop_disc"; + twoPtDisc.data.resize(nl); } for (unsigned int n = 0; n < nl; ++n) { @@ -184,20 +189,24 @@ void TTwoPointNPR::execute(void) peekSite(phip1, ftMatBuf, p1); peekSite(phip2, ftMatBuf, p2); peekSite(opp, ftBuf, p); - if (doTwoPt) + if (doAux) { - twoPtp1.data[n] = TensorRemove(trace(phip1*adj(phip1))); - twoPtp2.data[n] = TensorRemove(trace(phip2*adj(phip2))); + twoPtp1.data[n] = invV*TensorRemove(trace(phip1*adj(phip1))); + twoPtp2.data[n] = invV*TensorRemove(trace(phip2*adj(phip2))); + twoPtDisc.data[n] = invV*TensorRemove(trace(phip2*adj(phip1))); } - r.data[n] = TensorRemove(trace(phip2*adj(phip1))*opp); + r.data[n] = invV*TensorRemove(trace(phip2*adj(phip1))*opp); + rDisc.data[n] = invV*TensorRemove(trace(phip1*adj(phip1))*opp); } - if (doTwoPt) + if (doAux) { result.push_back(twoPtp1); result.push_back(twoPtp2); + result.push_back(twoPtDisc); } result.push_back(r); - doTwoPt = false; + result.push_back(rDisc); + doAux = false; } saveResult(par().output, "twoptnpr", result); } From ee630d2e8b940dccb61652c89ab384a46b5a2f62 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 17:38:32 +0100 Subject: [PATCH 468/620] Hadrons: smearing plaquette output --- Hadrons/Modules/MGauge/StoutSmearing.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Hadrons/Modules/MGauge/StoutSmearing.hpp b/Hadrons/Modules/MGauge/StoutSmearing.hpp index 9ed1e98b..f3ed64ce 100644 --- a/Hadrons/Modules/MGauge/StoutSmearing.hpp +++ b/Hadrons/Modules/MGauge/StoutSmearing.hpp @@ -117,10 +117,14 @@ void TStoutSmearing::execute(void) envGetTmp(GaugeField, buf); buf = U; + LOG(Message) << "plaquette= " << WilsonLoops::avgPlaquette(U) + << std::endl; for (unsigned int n = 0; n < par().steps; ++n) { smearer.smear(Usmr, buf); buf = Usmr; + LOG(Message) << "plaquette= " << WilsonLoops::avgPlaquette(Usmr) + << std::endl; } } From b52d8eb1e35ac1804d9056a32f0fc817e08873dd Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 19:49:13 +0100 Subject: [PATCH 469/620] better Version.h implementation --- .gitignore | 1 - Grid/Makefile.am | 26 ++++++++++++++++++++++++-- Grid/util/Init.cc | 1 - Grid/util/version.cc | 2 +- Makefile.am | 5 ----- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index e23a1208..45a3ea53 100644 --- a/.gitignore +++ b/.gitignore @@ -114,4 +114,3 @@ gh-pages/ ##################### Grid/qcd/spin/gamma-gen/*.h Grid/qcd/spin/gamma-gen/*.cc -Grid/version.h diff --git a/Grid/Makefile.am b/Grid/Makefile.am index 5cd76b40..fe0832c3 100644 --- a/Grid/Makefile.am +++ b/Grid/Makefile.am @@ -21,6 +21,28 @@ if BUILD_HDF5 extra_headers+=serialisation/Hdf5Type.h endif +all: version-cache + +version-cache: + if [ `git status --porcelain | wc -l` -gt 0 ]; then\ + a="uncommited changes";\ + else\ + a="no uncommitted changes";\ + fi;\ + echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > vertmp;\ + if [ -e version-cache ]; then\ + d=`diff vertmp version-cache`;\ + [ "${d}" != "" ] && mv vertmp version-cache;\ + else\ + mv vertmp version-cache;\ + fi;\ + rm -f vertmp + +Version.h: + echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > Version.h + +.PHONY: version-cache + # # Libraries # @@ -30,8 +52,8 @@ include Eigen.inc lib_LIBRARIES = libGrid.a CCFILES += $(extra_sources) -HFILES += $(extra_headers) +HFILES += $(extra_headers) Config.h Version.h libGrid_a_SOURCES = $(CCFILES) libGrid_adir = $(includedir)/Grid -nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) $(eigen_unsupp_files) Config.h +nobase_dist_pkginclude_HEADERS = $(HFILES) $(eigen_files) $(eigen_unsupp_files) diff --git a/Grid/util/Init.cc b/Grid/util/Init.cc index 5d93cb64..aed62ed3 100644 --- a/Grid/util/Init.cc +++ b/Grid/util/Init.cc @@ -49,7 +49,6 @@ Author: paboyle #include #include -#include #include diff --git a/Grid/util/version.cc b/Grid/util/version.cc index 19759274..c9507137 100644 --- a/Grid/util/version.cc +++ b/Grid/util/version.cc @@ -1,5 +1,5 @@ #include -#include +#include "Version.h" namespace Grid { void printHash(){ #ifdef GITHASH diff --git a/Makefile.am b/Makefile.am index 1901305b..09ec3029 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,11 +5,6 @@ include $(top_srcdir)/doxygen.inc bin_SCRIPTS=grid-config -BUILT_SOURCES = version.h - -version.h: - if [ `git status --porcelain | wc -l` -gt 0 ]; then a="uncommited changes"; else a="no uncommitted changes"; fi; echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > $(srcdir)/Grid/version.h - .PHONY: bench check tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) tests-local: all From d85ec3bac2c03f0df4ec793a28b872f0f46eeeca Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 19:54:21 +0100 Subject: [PATCH 470/620] build system minor fix --- Grid/Makefile.am | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Grid/Makefile.am b/Grid/Makefile.am index fe0832c3..4ad7b249 100644 --- a/Grid/Makefile.am +++ b/Grid/Makefile.am @@ -32,9 +32,13 @@ version-cache: echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > vertmp;\ if [ -e version-cache ]; then\ d=`diff vertmp version-cache`;\ - [ "${d}" != "" ] && mv vertmp version-cache;\ + if [ "$${d}" != "" ]; then\ + mv vertmp version-cache;\ + rm -f Version.h;\ + fi;\ else\ mv vertmp version-cache;\ + rm -f Version.h;\ fi;\ rm -f vertmp From 3ee682f676b47acc5e227a1f349111c46705a353 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 19:58:16 +0100 Subject: [PATCH 471/620] more Version.h fine tuning --- Grid/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Grid/Makefile.am b/Grid/Makefile.am index 4ad7b249..57dcb13e 100644 --- a/Grid/Makefile.am +++ b/Grid/Makefile.am @@ -24,7 +24,7 @@ endif all: version-cache version-cache: - if [ `git status --porcelain | wc -l` -gt 0 ]; then\ + if [ `git status --porcelain | grep -v '??' | wc -l` -gt 0 ]; then\ a="uncommited changes";\ else\ a="no uncommitted changes";\ @@ -43,7 +43,7 @@ version-cache: rm -f vertmp Version.h: - echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > Version.h + cp version-cache Version.h .PHONY: version-cache From c193e4e6758d66c0a3e36a61a793f5b6760b2368 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 19:59:58 +0100 Subject: [PATCH 472/620] Aslash expression in Mathematica notebook --- Grid/qcd/spin/gamma-gen/gamma-gen.nb | 626 +++++++++++++++++++++++---- 1 file changed, 551 insertions(+), 75 deletions(-) diff --git a/Grid/qcd/spin/gamma-gen/gamma-gen.nb b/Grid/qcd/spin/gamma-gen/gamma-gen.nb index b9753df7..4167b6e2 100644 --- a/Grid/qcd/spin/gamma-gen/gamma-gen.nb +++ b/Grid/qcd/spin/gamma-gen/gamma-gen.nb @@ -10,33 +10,34 @@ NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 158, 7] -NotebookDataLength[ 56640, 1480] -NotebookOptionsPosition[ 55061, 1426] -NotebookOutlinePosition[ 55421, 1442] -CellTagsIndexPosition[ 55378, 1439] +NotebookDataLength[ 75090, 1956] +NotebookOptionsPosition[ 69536, 1867] +NotebookOutlinePosition[ 69898, 1883] +CellTagsIndexPosition[ 69855, 1880] WindowFrame->Normal*) (* Beginning of Notebook Content *) Notebook[{ Cell[TextData[StyleBox["Grid physics library, www.github.com/paboyle/Grid \n\n\ -Source file: lib/qcd/spin/gamma-gen/gamma-gen.nb\n\nCopyright (C) 2015\n\ -Copyright (C) 2016\nCopyright (C) 2017\n\nAuthor: Antonin Portelli \ -\n\nThis program is free software; you can \ -redistribute it and/or modify\nit under the terms of the GNU General Public \ -License as published by\nthe Free Software Foundation; either version 2 of \ -the License, or\n(at your option) any later version.\n\nThis program is \ -distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; \ -without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A \ -PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\n\ -You should have received a copy of the GNU General Public License along\nwith \ -this program; if not, write to the Free Software Foundation, Inc.,\n51 \ -Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nSee the full \ -license in the file \[OpenCurlyDoubleQuote]LICENSE\[CloseCurlyDoubleQuote] in \ -the top level distribution directory", +Source file: lib/qcd/spin/gamma-gen/gamma-gen.nb\n\nCopyright (C) 2015-2018\n\ +\nAuthor: Antonin Portelli \n\nThis program is free \ +software; you can redistribute it and/or modify\nit under the terms of the \ +GNU General Public License as published by\nthe Free Software Foundation; \ +either version 2 of the License, or\n(at your option) any later version.\n\n\ +This program is distributed in the hope that it will be useful,\nbut WITHOUT \ +ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or \ +FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for \ +more details.\n\nYou should have received a copy of the GNU General Public \ +License along\nwith this program; if not, write to the Free Software \ +Foundation, Inc.,\n51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 \ +USA.\n\nSee the full license in the file \[OpenCurlyDoubleQuote]LICENSE\ +\[CloseCurlyDoubleQuote] in the top level distribution directory", Background->RGBColor[1, 1, 0.85]]], "Text", CellChangeTimes->{{3.694192702097444*^9, 3.694192776106186*^9}, { - 3.6942089129622507`*^9, 3.694208916624515*^9}}, - Background->RGBColor[1, 1, 0.85]], + 3.6942089129622507`*^9, 3.694208916624515*^9}, {3.743227925290299*^9, + 3.743227927744316*^9}}, + Background->RGBColor[ + 1, 1, 0.85],ExpressionUUID->"f0373ef0-8c33-4e9a-9f09-9bf718da72ef"], Cell[CellGroupData[{ @@ -50,7 +51,8 @@ Cell[BoxData[{ RowBox[{"NotebookDirectory", "[", "]"}], "]"}]}], "Input", CellChangeTimes->{{3.69418610909842*^9, 3.694186122331771*^9}, { 3.694189694542165*^9, 3.6941897146300087`*^9}, {3.694297413625847*^9, - 3.694297419003489*^9}}], + 3.694297419003489*^9}},ExpressionUUID->"5c937a3e-adfd-4d7e-8fde-\ +afb3337c72d9"], Cell[BoxData["\<\"/Users/antonin/Development/Grid/lib/qcd/spin/gamma-gen\"\>"]\ , "Output", @@ -67,13 +69,245 @@ Cell[BoxData["\<\"/Users/antonin/Development/Grid/lib/qcd/spin/gamma-gen\"\>"]\ 3.6942984168973837`*^9, 3.6948949168128557`*^9, 3.69489495942482*^9, 3.6949627104409447`*^9, {3.694962842273374*^9, 3.6949628507953672`*^9}, 3.694963445768766*^9, 3.6949643976358423`*^9, {3.694964715764683*^9, - 3.6949647261937733`*^9}, 3.6949650592533703`*^9, 3.694965165070952*^9}] + 3.6949647261937733`*^9}, 3.6949650592533703`*^9, 3.694965165070952*^9, + 3.74322794542139*^9},ExpressionUUID->"72817ba6-2f6a-4a4d-8212-\ +6f0970f49e7c"] +}, Open ]], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{"FactorInteger", "[", "3152", "]"}]], "Input", + CellChangeTimes->{{3.7432347536316767`*^9, 3.7432347764739027`*^9}, { + 3.743234833567358*^9, + 3.743234862146022*^9}},ExpressionUUID->"d1a0fd03-85e1-43af-ba80-\ +3ca4235675d8"], + +Cell[BoxData[ + RowBox[{"{", + RowBox[{ + RowBox[{"{", + RowBox[{"2", ",", "4"}], "}"}], ",", + RowBox[{"{", + RowBox[{"197", ",", "1"}], "}"}]}], "}"}]], "Output", + CellChangeTimes->{{3.743234836792224*^9, + 3.743234862493619*^9}},ExpressionUUID->"16d3f953-4b24-4ed2-ae62-\ +306dcab66ca7"] +}, Open ]], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{"sol", "=", + RowBox[{"Solve", "[", + RowBox[{ + RowBox[{ + RowBox[{ + SuperscriptBox["x", "2"], "+", + SuperscriptBox["y", "2"], "+", + SuperscriptBox["z", "2"]}], "\[Equal]", "2"}], ",", + RowBox[{"{", + RowBox[{"x", ",", "y", ",", "z"}], "}"}], ",", "Integers"}], + "]"}]}]], "Input", + CellChangeTimes->{{3.743235304127721*^9, + 3.7432353087929983`*^9}},ExpressionUUID->"f0fa2a5c-3d81-4d75-a447-\ +50c7ca3459ff"], + +Cell[BoxData[ + RowBox[{"{", + RowBox[{ + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"y", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"z", "\[Rule]", "0"}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"y", "\[Rule]", "0"}], ",", + RowBox[{"z", "\[Rule]", + RowBox[{"-", "1"}]}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"y", "\[Rule]", "0"}], ",", + RowBox[{"z", "\[Rule]", "1"}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"y", "\[Rule]", "1"}], ",", + RowBox[{"z", "\[Rule]", "0"}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "0"}], ",", + RowBox[{"y", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"z", "\[Rule]", + RowBox[{"-", "1"}]}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "0"}], ",", + RowBox[{"y", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"z", "\[Rule]", "1"}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "0"}], ",", + RowBox[{"y", "\[Rule]", "1"}], ",", + RowBox[{"z", "\[Rule]", + RowBox[{"-", "1"}]}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "0"}], ",", + RowBox[{"y", "\[Rule]", "1"}], ",", + RowBox[{"z", "\[Rule]", "1"}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "1"}], ",", + RowBox[{"y", "\[Rule]", + RowBox[{"-", "1"}]}], ",", + RowBox[{"z", "\[Rule]", "0"}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "1"}], ",", + RowBox[{"y", "\[Rule]", "0"}], ",", + RowBox[{"z", "\[Rule]", + RowBox[{"-", "1"}]}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "1"}], ",", + RowBox[{"y", "\[Rule]", "0"}], ",", + RowBox[{"z", "\[Rule]", "1"}]}], "}"}], ",", + RowBox[{"{", + RowBox[{ + RowBox[{"x", "\[Rule]", "1"}], ",", + RowBox[{"y", "\[Rule]", "1"}], ",", + RowBox[{"z", "\[Rule]", "0"}]}], "}"}]}], "}"}]], "Output", + CellChangeTimes->{{3.743235305220907*^9, + 3.743235309139554*^9}},ExpressionUUID->"d9825c95-24bb-442a-8734-\ +4c0f47e99dfc"] +}, Open ]], + +Cell[BoxData[ + RowBox[{ + RowBox[{"xmlElem", "[", "x_", "]"}], ":=", + RowBox[{"Print", "[", + RowBox[{"\"\<\>\"", "<>", + RowBox[{"ToString", "[", + RowBox[{"x", "[", + RowBox[{"[", "1", "]"}], "]"}], "]"}], "<>", "\"\< \>\"", "<>", + RowBox[{"ToString", "[", + RowBox[{"x", "[", + RowBox[{"[", "2", "]"}], "]"}], "]"}], "<>", "\"\< \>\"", "<>", + RowBox[{"ToString", "[", + RowBox[{"x", "[", + RowBox[{"[", "3", "]"}], "]"}], "]"}], "<>", "\"\<\>\""}], + "]"}]}]], "Input", + CellChangeTimes->{{3.74323534002862*^9, 3.743235351000985*^9}, { + 3.743235403233039*^9, 3.743235413488028*^9}, {3.743235473169856*^9, + 3.7432354747126904`*^9}},ExpressionUUID->"aea76313-c89e-45e8-b429-\ +3f454091666d"], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{ + RowBox[{ + RowBox[{"xmlElem", "[", + RowBox[{ + RowBox[{"{", + RowBox[{"x", ",", "y", ",", "z"}], "}"}], "/.", "#"}], "]"}], "&"}], "/@", + "sol"}]], "Input", + CellChangeTimes->{{3.743235415820318*^9, + 3.743235467025091*^9}},ExpressionUUID->"07da3998-8eab-40ba-8c0b-\ +ac6b130cb4fb"], + +Cell[CellGroupData[{ + +Cell[BoxData["\<\"-1 -1 0\"\>"], "Print", + CellChangeTimes->{ + 3.743235476581676*^9},ExpressionUUID->"c577ba06-b67a-405a-9ff5-\ +2bf7dc898d03"], + +Cell[BoxData["\<\"-1 0 -1\"\>"], "Print", + CellChangeTimes->{ + 3.743235476588011*^9},ExpressionUUID->"d041aa36-0cea-457c-9d4b-\ +1fe9be66e2ab"], + +Cell[BoxData["\<\"-1 0 1\"\>"], "Print", + CellChangeTimes->{ + 3.743235476596887*^9},ExpressionUUID->"bf141b55-86b2-4430-a994-\ +5c03d5a19441"], + +Cell[BoxData["\<\"-1 1 0\"\>"], "Print", + CellChangeTimes->{ + 3.743235476605785*^9},ExpressionUUID->"4968a660-4ecf-4b66-9071-\ +8bd798c18d21"], + +Cell[BoxData["\<\"0 -1 -1\"\>"], "Print", + CellChangeTimes->{ + 3.743235476613523*^9},ExpressionUUID->"4e22d943-2680-416b-a1d7-\ +a16ca20b781f"], + +Cell[BoxData["\<\"0 -1 1\"\>"], "Print", + CellChangeTimes->{ + 3.7432354766218576`*^9},ExpressionUUID->"6dd38385-08b3-4dd9-932f-\ +98a00c6db1b2"], + +Cell[BoxData["\<\"0 1 -1\"\>"], "Print", + CellChangeTimes->{ + 3.743235476629427*^9},ExpressionUUID->"ef3baad3-91d1-4735-9a22-\ +53495a624c15"], + +Cell[BoxData["\<\"0 1 1\"\>"], "Print", + CellChangeTimes->{ + 3.743235476638257*^9},ExpressionUUID->"413fbb68-5017-4272-a62a-\ +fa234e6daaea"], + +Cell[BoxData["\<\"1 -1 0\"\>"], "Print", + CellChangeTimes->{ + 3.743235476646203*^9},ExpressionUUID->"3a832a60-ae00-414b-a9ac-\ +f5e86e67e917"], + +Cell[BoxData["\<\"1 0 -1\"\>"], "Print", + CellChangeTimes->{ + 3.743235476653907*^9},ExpressionUUID->"bfc79ef6-f6c7-4f1e-88e8-\ +005ac314be9c"], + +Cell[BoxData["\<\"1 0 1\"\>"], "Print", + CellChangeTimes->{ + 3.743235476662575*^9},ExpressionUUID->"0f892891-f885-489c-9925-\ +ddef4d698410"], + +Cell[BoxData["\<\"1 1 0\"\>"], "Print", + CellChangeTimes->{ + 3.7432354766702337`*^9},ExpressionUUID->"2906f190-e673-4f33-9c34-\ +e8e56efe7a27"] +}, Open ]], + +Cell[BoxData[ + RowBox[{"{", + RowBox[{ + "Null", ",", "Null", ",", "Null", ",", "Null", ",", "Null", ",", "Null", + ",", "Null", ",", "Null", ",", "Null", ",", "Null", ",", "Null", ",", + "Null"}], "}"}]], "Output", + CellChangeTimes->{ + 3.7432354246225967`*^9, {3.7432354674878073`*^9, + 3.743235476678007*^9}},ExpressionUUID->"500ca3c1-88d8-46e5-a1a1-\ +86a7878e5638"] }, Open ]], Cell[CellGroupData[{ Cell["Clifford algebra generation", "Section", - CellChangeTimes->{{3.6942089434583883`*^9, 3.694208978559093*^9}}], + CellChangeTimes->{{3.6942089434583883`*^9, + 3.694208978559093*^9}},ExpressionUUID->"a5b064b3-3011-4922-8559-\ +ead857cad102"], Cell[BoxData[{ RowBox[{ @@ -89,11 +323,15 @@ Cell[BoxData[{ RowBox[{"a", ".", "b"}], "+", RowBox[{"b", ".", "a"}]}]}]}], "Input", CellChangeTimes->{{3.694184330267939*^9, 3.694184337479828*^9}, { - 3.694184821238667*^9, 3.6941848260602217`*^9}}], + 3.694184821238667*^9, + 3.6941848260602217`*^9}},ExpressionUUID->"aa28f02b-31e1-4df2-9b5d-\ +482177464b59"], Cell["Definition of the matrix representation of the algebra:", "Text", CellChangeTimes->{{3.6942090405172586`*^9, 3.694209073962101*^9}, { - 3.6942974330697393`*^9, 3.694297433821431*^9}}], + 3.6942974330697393`*^9, + 3.694297433821431*^9}},ExpressionUUID->"c8896b88-f1db-4ce4-b7a6-\ +0c9838bdb8f1"], Cell[BoxData[{ RowBox[{ @@ -263,10 +501,190 @@ Cell[BoxData[{ 3.694185044355978*^9, 3.694185099415689*^9}, {3.694185502749824*^9, 3.694185675128971*^9}, {3.694185728773429*^9, 3.694185729056695*^9}, 3.694185780274218*^9, 3.6941858224264593`*^9, {3.694185941282981*^9, - 3.694185950262871*^9}}], + 3.694185950262871*^9}},ExpressionUUID->"52a96ff6-047e-4043-86d0-\ +e303866e5f8e"], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{"Simplify", "[", + RowBox[{ + RowBox[{ + RowBox[{"Conjugate", "[", + RowBox[{"{", + RowBox[{"w0", ",", "w1", ",", "w2", ",", "w3"}], "}"}], "]"}], ".", + RowBox[{"(", + RowBox[{ + RowBox[{"(", + RowBox[{ + RowBox[{"a0", " ", + RowBox[{"mat", "[", "gx", "]"}]}], "+", + RowBox[{"a1", " ", + RowBox[{"mat", "[", "gy", "]"}]}], "+", + RowBox[{"a2", " ", + RowBox[{"mat", "[", "gz", "]"}]}], "+", + RowBox[{"a3", " ", + RowBox[{"mat", "[", "gt", "]"}]}]}], ")"}], "/.", + RowBox[{"{", + RowBox[{ + RowBox[{"a0", "\[Rule]", + RowBox[{ + FractionBox["1", + RowBox[{"2", "\[ImaginaryI]"}]], + RowBox[{"(", + RowBox[{"b0", "-", + RowBox[{"Conjugate", "[", "b0", "]"}]}], ")"}]}]}], ",", + RowBox[{"a1", "\[Rule]", + RowBox[{ + FractionBox["1", "2"], + RowBox[{"(", + RowBox[{"b0", "+", + RowBox[{"Conjugate", "[", "b0", "]"}]}], ")"}]}]}], ",", + RowBox[{"a2", "\[Rule]", + RowBox[{ + FractionBox["1", + RowBox[{"2", "\[ImaginaryI]"}]], + RowBox[{"(", + RowBox[{"b1", "-", + RowBox[{"Conjugate", "[", "b1", "]"}]}], ")"}]}]}], ",", + RowBox[{"a3", "\[Rule]", + RowBox[{ + FractionBox["1", "2"], + RowBox[{"(", + RowBox[{"b1", "+", + RowBox[{"Conjugate", "[", "b1", "]"}]}], ")"}]}]}]}], "}"}]}], + ")"}], ".", + RowBox[{"{", + RowBox[{"v0", ",", "v1", ",", "v2", ",", "v3"}], "}"}]}], "//", + "MatrixForm"}], "]"}]], "Input", + CellChangeTimes->{{3.7432279607971277`*^9, 3.743228006752531*^9}, { + 3.7432280803839817`*^9, 3.743228145366938*^9}, 3.743228258639215*^9, { + 3.743228553975891*^9, 3.743228599277994*^9}, {3.743228634543832*^9, + 3.743228743174139*^9}, {3.743228787080687*^9, 3.7432287981829977`*^9}, { + 3.743228839944178*^9, 3.743228849469906*^9}, {3.743340578292872*^9, + 3.743340582859209*^9}, {3.743342105414857*^9, + 3.7433421141838713`*^9}},ExpressionUUID->"8b0f4955-2c3f-418c-9226-\ +9be8f87621e8"], + +Cell[BoxData[ + TagBox[ + RowBox[{ + RowBox[{"b1", " ", "v2", " ", + RowBox[{"Conjugate", "[", "w0", "]"}]}], "-", + RowBox[{"v3", " ", + RowBox[{"Conjugate", "[", "b0", "]"}], " ", + RowBox[{"Conjugate", "[", "w0", "]"}]}], "+", + RowBox[{"b0", " ", "v2", " ", + RowBox[{"Conjugate", "[", "w1", "]"}]}], "+", + RowBox[{"v3", " ", + RowBox[{"Conjugate", "[", "b1", "]"}], " ", + RowBox[{"Conjugate", "[", "w1", "]"}]}], "+", + RowBox[{"v1", " ", + RowBox[{"Conjugate", "[", "b0", "]"}], " ", + RowBox[{"Conjugate", "[", "w2", "]"}]}], "+", + RowBox[{"v0", " ", + RowBox[{"Conjugate", "[", "b1", "]"}], " ", + RowBox[{"Conjugate", "[", "w2", "]"}]}], "-", + RowBox[{"b0", " ", "v0", " ", + RowBox[{"Conjugate", "[", "w3", "]"}]}], "+", + RowBox[{"b1", " ", "v1", " ", + RowBox[{"Conjugate", "[", "w3", "]"}]}]}], + Function[BoxForm`e$, + MatrixForm[BoxForm`e$]]]], "Output", + CellChangeTimes->{ + 3.743343313742465*^9},ExpressionUUID->"edd0619f-6f12-4070-a1d2-\ +6b547877fadc"] +}, Open ]], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{"Simplify", "[", + RowBox[{ + RowBox[{"(", + RowBox[{ + RowBox[{"(", + RowBox[{ + RowBox[{"a0", " ", + RowBox[{"mat", "[", "gx", "]"}]}], "+", + RowBox[{"a1", " ", + RowBox[{"mat", "[", "gy", "]"}]}], "+", + RowBox[{"a2", " ", + RowBox[{"mat", "[", "gz", "]"}]}], "+", + RowBox[{"a3", " ", + RowBox[{"mat", "[", "gt", "]"}]}]}], ")"}], "/.", + RowBox[{"{", + RowBox[{ + RowBox[{"a0", "\[Rule]", + RowBox[{ + FractionBox["1", + RowBox[{"2", "\[ImaginaryI]"}]], + RowBox[{"(", + RowBox[{"b0", "-", + RowBox[{"Conjugate", "[", "b0", "]"}]}], ")"}]}]}], ",", + RowBox[{"a1", "\[Rule]", + RowBox[{ + FractionBox["1", "2"], + RowBox[{"(", + RowBox[{"b0", "+", + RowBox[{"Conjugate", "[", "b0", "]"}]}], ")"}]}]}], ",", + RowBox[{"a2", "\[Rule]", + RowBox[{ + FractionBox["1", + RowBox[{"2", "\[ImaginaryI]"}]], + RowBox[{"(", + RowBox[{"b1", "-", + RowBox[{"Conjugate", "[", "b1", "]"}]}], ")"}]}]}], ",", + RowBox[{"a3", "\[Rule]", + RowBox[{ + FractionBox["1", "2"], + RowBox[{"(", + RowBox[{"b1", "+", + RowBox[{"Conjugate", "[", "b1", "]"}]}], ")"}]}]}]}], "}"}]}], + ")"}], "//", "MatrixForm"}], "]"}]], "Input", + CellChangeTimes->{{3.7433421933181667`*^9, + 3.743342200786813*^9}},ExpressionUUID->"fb45123c-c610-4075-99b0-\ +7cd71c728ae7"], + +Cell[BoxData[ + TagBox[ + RowBox[{"(", "\[NoBreak]", GridBox[{ + {"0", "0", "b1", + RowBox[{"-", + RowBox[{"Conjugate", "[", "b0", "]"}]}]}, + {"0", "0", "b0", + RowBox[{"Conjugate", "[", "b1", "]"}]}, + { + RowBox[{"Conjugate", "[", "b1", "]"}], + RowBox[{"Conjugate", "[", "b0", "]"}], "0", "0"}, + { + RowBox[{"-", "b0"}], "b1", "0", "0"} + }, + GridBoxAlignment->{ + "Columns" -> {{Center}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, + "RowsIndexed" -> {}}, + GridBoxSpacings->{"Columns" -> { + Offset[0.27999999999999997`], { + Offset[0.7]}, + Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { + Offset[0.2], { + Offset[0.4]}, + Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], + Function[BoxForm`e$, + MatrixForm[BoxForm`e$]]]], "Output", + CellChangeTimes->{{3.743228092720749*^9, 3.743228103044189*^9}, + 3.743228145808625*^9, 3.743228259025098*^9, 3.743228600081357*^9, { + 3.743228667370229*^9, 3.743228688052019*^9}, {3.743228718056776*^9, + 3.743228743610117*^9}, 3.743228799225634*^9, 3.7432288499987583`*^9, { + 3.743340583491489*^9, 3.7433405956062613`*^9}, 3.743342123072051*^9, + 3.743342201226069*^9},ExpressionUUID->"2ae14565-b412-4dc0-9dce-\ +bd6c1ba5ef27"] +}, Open ]], Cell["Generation of the abstract algebra:", "Text", - CellChangeTimes->{{3.6942090658330803`*^9, 3.694209076132119*^9}}], + CellChangeTimes->{{3.6942090658330803`*^9, + 3.694209076132119*^9}},ExpressionUUID->"af247231-a58d-417b-987a-\ +26908dafffdb"], Cell[BoxData[{ RowBox[{"Do", "[", @@ -331,10 +749,14 @@ Cell[BoxData[{ CellChangeTimes->{{3.6941860329437103`*^9, 3.6941860343133917`*^9}, { 3.694186163571176*^9, 3.6941862016761427`*^9}, {3.69418700219066*^9, 3.6941870425469627`*^9}, {3.694297326197534*^9, 3.6942974062629423`*^9}, { - 3.694297634175386*^9, 3.6942976496897383`*^9}}], + 3.694297634175386*^9, + 3.6942976496897383`*^9}},ExpressionUUID->"7c44cadd-e488-4f51-87d8-\ +c64eef11f40c"], Cell["Check that we can reconstruct the Euclidean metric:", "Text", - CellChangeTimes->{{3.694209080190936*^9, 3.694209096585559*^9}}], + CellChangeTimes->{{3.694209080190936*^9, + 3.694209096585559*^9}},ExpressionUUID->"856f1746-1107-4509-a5ce-\ +ac9c7f56cdb1"], Cell[CellGroupData[{ @@ -353,7 +775,8 @@ Cell[BoxData[ RowBox[{"i2", ",", RowBox[{"{", RowBox[{"gx", ",", "gy", ",", "gz", ",", "gt"}], "}"}]}], "}"}]}], - "]"}], "//", "MatrixForm"}]], "Input"], + "]"}], "//", "MatrixForm"}]], "Input",ExpressionUUID->"8674484a-8543-434f-\ +b177-3b27f9353212"], Cell[BoxData[ TagBox[ @@ -389,11 +812,14 @@ Cell[BoxData[ 3.694894917294997*^9, 3.6948949597758904`*^9, 3.6949627108824663`*^9, 3.694962851174364*^9, 3.6949634461305313`*^9, 3.694964397971891*^9, { 3.6949647161810303`*^9, 3.6949647264866943`*^9}, 3.6949650598407507`*^9, - 3.694965165456048*^9}] + 3.694965165456048*^9},ExpressionUUID->"c3b3f84d-91f6-41af-af6b-\ +a394ca020511"] }, Open ]], Cell["Full multiplication table:", "Text", - CellChangeTimes->{{3.694209113187169*^9, 3.6942091210767593`*^9}}], + CellChangeTimes->{{3.694209113187169*^9, + 3.6942091210767593`*^9}},ExpressionUUID->"518a3040-54b1-4d43-8947-\ +5c7d12efa94d"], Cell[CellGroupData[{ @@ -409,7 +835,9 @@ Cell[BoxData[ "MatrixForm"}]], "Input", CellChangeTimes->{{3.6941862426584797`*^9, 3.694186256858178*^9}, { 3.694186605271886*^9, 3.694186617894228*^9}, {3.694186972131384*^9, - 3.69418697419895*^9}, {3.694192885918524*^9, 3.694192888888296*^9}}], + 3.69418697419895*^9}, {3.694192885918524*^9, + 3.694192888888296*^9}},ExpressionUUID->"61a2e974-2b39-4a07-8043-\ +2dfd39a70569"], Cell[BoxData[ TagBox[ @@ -577,7 +1005,8 @@ Cell[BoxData[ 3.694894917375866*^9, 3.694894959839177*^9, 3.694962710968522*^9, 3.6949628512863817`*^9, 3.694963446206002*^9, 3.694964398046623*^9, { 3.6949647162797327`*^9, 3.694964726526013*^9}, 3.6949650599380713`*^9, - 3.694965165531089*^9}] + 3.694965165531089*^9},ExpressionUUID->"73480ac0-3043-4077-80cc-\ +b952a94c822a"] }, Open ]] }, Open ]], @@ -585,11 +1014,15 @@ Cell[CellGroupData[{ Cell["Header file Gamma.h generation", "Section", CellChangeTimes->{{3.694208986784461*^9, 3.6942090005062523`*^9}, { - 3.694965123390101*^9, 3.694965123950851*^9}}], + 3.694965123390101*^9, + 3.694965123950851*^9}},ExpressionUUID->"4e833cd6-9f0e-4aa3-a873-\ +3d579e874720"], Cell["File skeleton:", "Text", CellFrame->{{0, 0}, {0, 0.5}}, - CellChangeTimes->{{3.694209131604498*^9, 3.694209133792495*^9}}], + CellChangeTimes->{{3.694209131604498*^9, + 3.694209133792495*^9}},ExpressionUUID->"6d27fc04-3a60-4e03-8df7-\ +3dd3aeee35b4"], Cell[BoxData[ RowBox[{ @@ -643,12 +1076,14 @@ Algebra g;\n public:\n \ 3.694963343265525*^9}, {3.694964367519239*^9, 3.69496439461199*^9}, { 3.694964462130747*^9, 3.6949644669959793`*^9}, 3.694964509762739*^9, { 3.694964705045744*^9, 3.694964723148797*^9}, {3.694964992988984*^9, - 3.6949649968504257`*^9}}], + 3.6949649968504257`*^9}},ExpressionUUID->"c7103bd6-b539-4495-b98c-\ +d4d12ac6cad8"], Cell["Gamma enum generation:", "Text", CellFrame->{{0, 0}, {0, 0.5}}, CellChangeTimes->{{3.694209168488991*^9, 3.6942091715073423`*^9}, - 3.694209215969149*^9}], + 3.694209215969149*^9},ExpressionUUID->"0625593d-290f-4a39-9d80-\ +8e2c6fdbc94e"], Cell[BoxData[{ RowBox[{ @@ -798,7 +1233,9 @@ Cell[BoxData[{ CellChangeTimes->{{3.69418665896658*^9, 3.6941867305497723`*^9}, { 3.694186782865391*^9, 3.694186840513199*^9}, {3.694186889568404*^9, 3.694186968177154*^9}, {3.6941870767730503`*^9, 3.69418716300373*^9}, { - 3.694213209628356*^9, 3.6942132459364033`*^9}}], + 3.694213209628356*^9, + 3.6942132459364033`*^9}},ExpressionUUID->"1ad4904c-352f-4b1d-a7c7-\ +91e1b0549409"], Cell[BoxData[ RowBox[{ @@ -855,11 +1292,14 @@ Cell[BoxData[ 3.694206752732321*^9, 3.694206753090602*^9}, {3.6942071072527027`*^9, 3.694207214318696*^9}, {3.694211442308366*^9, 3.694211490100521*^9}, { 3.6942115668101377`*^9, 3.694211571070611*^9}, {3.6942133172135267`*^9, - 3.694213325783718*^9}}], + 3.694213325783718*^9}},ExpressionUUID->"0221674f-9b63-4662-91bc-\ +ccc8c6ae9589"], Cell["Multiplication functions generation:", "Text", CellFrame->{{0, 0}, {0, 0.5}}, - CellChangeTimes->{{3.69420919761381*^9, 3.694209206431526*^9}}], + CellChangeTimes->{{3.69420919761381*^9, + 3.694209206431526*^9}},ExpressionUUID->"d2d2257a-487b-416f-bc40-\ +abd4482225f7"], Cell[BoxData[{ RowBox[{ @@ -1257,7 +1697,8 @@ iMatrix>::type\n{\n iMatrix ret;\n\n switch (G.g) \n \ 3.694214921431739*^9, 3.694214951876449*^9}, {3.6942151046483088`*^9, 3.694215118335286*^9}, {3.6942151634191313`*^9, 3.694215188429871*^9}, { 3.6942940839999113`*^9, 3.694294090686364*^9}, {3.69489488486012*^9, - 3.6948948916252403`*^9}}], + 3.6948948916252403`*^9}},ExpressionUUID->"daea68a9-c9e8-46ab-9bc8-\ +5186e2cf477c"], Cell["Header file generation:", "Text", CellFrame->{{0, 0}, {0, 0.5}}, @@ -1425,9 +1866,9 @@ Cell[BoxData[""], "Input", }, Open ]] }, WindowSize->{1246, 1005}, -WindowMargins->{{64, Automatic}, {Automatic, 0}}, -FrontEndVersion->"11.0 for Mac OS X x86 (32-bit, 64-bit Kernel) (September \ -21, 2016)", +WindowMargins->{{282, Automatic}, {Automatic, 14}}, +FrontEndVersion->"11.2 for Mac OS X x86 (32-bit, 64-bit Kernel) (September \ +10, 2017)", StyleDefinitions->"Default.nb" ] (* End of Notebook Content *) @@ -1441,46 +1882,81 @@ CellTagsIndex->{} *) (*NotebookFileOutline Notebook[{ -Cell[558, 20, 1295, 18, 502, "Text"], +Cell[558, 20, 1365, 19, 557, "Text",ExpressionUUID->"f0373ef0-8c33-4e9a-9f09-9bf718da72ef"], Cell[CellGroupData[{ -Cell[1878, 42, 513, 10, 75, "Input"], -Cell[2394, 54, 1090, 15, 32, "Output"] +Cell[1948, 43, 570, 11, 73, "Input",ExpressionUUID->"5c937a3e-adfd-4d7e-8fde-afb3337c72d9"], +Cell[2521, 56, 1172, 17, 34, "Output",ExpressionUUID->"72817ba6-2f6a-4a4d-8212-6f0970f49e7c"] }, Open ]], Cell[CellGroupData[{ -Cell[3521, 74, 114, 1, 64, "Section"], -Cell[3638, 77, 475, 14, 54, "Input"], -Cell[4116, 93, 190, 2, 30, "Text"], -Cell[4309, 97, 5454, 168, 427, "Input"], -Cell[9766, 267, 119, 1, 30, "Text"], -Cell[9888, 270, 2115, 63, 96, "Input"], -Cell[12006, 335, 133, 1, 30, "Text"], -Cell[CellGroupData[{ -Cell[12164, 340, 479, 15, 32, "Input"], -Cell[12646, 357, 1648, 34, 96, "Output"] +Cell[3730, 78, 248, 5, 30, "Input",ExpressionUUID->"d1a0fd03-85e1-43af-ba80-3ca4235675d8"], +Cell[3981, 85, 299, 9, 34, "Output",ExpressionUUID->"16d3f953-4b24-4ed2-ae62-306dcab66ca7"] }, Open ]], -Cell[14309, 394, 110, 1, 30, "Text"], Cell[CellGroupData[{ -Cell[14444, 399, 476, 12, 32, "Input"], -Cell[14923, 413, 6697, 166, 312, "Output"] +Cell[4317, 99, 469, 14, 33, "Input",ExpressionUUID->"f0fa2a5c-3d81-4d75-a447-50c7ca3459ff"], +Cell[4789, 115, 2423, 77, 56, "Output",ExpressionUUID->"d9825c95-24bb-442a-8734-4c0f47e99dfc"] +}, Open ]], +Cell[7227, 195, 751, 18, 30, "Input",ExpressionUUID->"aea76313-c89e-45e8-b429-3f454091666d"], +Cell[CellGroupData[{ +Cell[8003, 217, 323, 10, 30, "Input",ExpressionUUID->"07da3998-8eab-40ba-8c0b-ac6b130cb4fb"], +Cell[CellGroupData[{ +Cell[8351, 231, 156, 3, 24, "Print",ExpressionUUID->"c577ba06-b67a-405a-9ff5-2bf7dc898d03"], +Cell[8510, 236, 156, 3, 24, "Print",ExpressionUUID->"d041aa36-0cea-457c-9d4b-1fe9be66e2ab"], +Cell[8669, 241, 155, 3, 24, "Print",ExpressionUUID->"bf141b55-86b2-4430-a994-5c03d5a19441"], +Cell[8827, 246, 155, 3, 24, "Print",ExpressionUUID->"4968a660-4ecf-4b66-9071-8bd798c18d21"], +Cell[8985, 251, 156, 3, 24, "Print",ExpressionUUID->"4e22d943-2680-416b-a1d7-a16ca20b781f"], +Cell[9144, 256, 157, 3, 24, "Print",ExpressionUUID->"6dd38385-08b3-4dd9-932f-98a00c6db1b2"], +Cell[9304, 261, 155, 3, 24, "Print",ExpressionUUID->"ef3baad3-91d1-4735-9a22-53495a624c15"], +Cell[9462, 266, 154, 3, 24, "Print",ExpressionUUID->"413fbb68-5017-4272-a62a-fa234e6daaea"], +Cell[9619, 271, 155, 3, 24, "Print",ExpressionUUID->"3a832a60-ae00-414b-a9ac-f5e86e67e917"], +Cell[9777, 276, 155, 3, 24, "Print",ExpressionUUID->"bfc79ef6-f6c7-4f1e-88e8-005ac314be9c"], +Cell[9935, 281, 154, 3, 24, "Print",ExpressionUUID->"0f892891-f885-489c-9925-ddef4d698410"], +Cell[10092, 286, 156, 3, 24, "Print",ExpressionUUID->"2906f190-e673-4f33-9c34-e8e56efe7a27"] +}, Open ]], +Cell[10263, 292, 376, 9, 34, "Output",ExpressionUUID->"500ca3c1-88d8-46e5-a1a1-86a7878e5638"] +}, Open ]], +Cell[CellGroupData[{ +Cell[10676, 306, 174, 3, 67, "Section",ExpressionUUID->"a5b064b3-3011-4922-8559-ead857cad102"], +Cell[10853, 311, 535, 16, 52, "Input",ExpressionUUID->"aa28f02b-31e1-4df2-9b5d-482177464b59"], +Cell[11391, 329, 250, 4, 35, "Text",ExpressionUUID->"c8896b88-f1db-4ce4-b7a6-0c9838bdb8f1"], +Cell[11644, 335, 5511, 169, 425, "Input",ExpressionUUID->"52a96ff6-047e-4043-86d0-e303866e5f8e"], +Cell[CellGroupData[{ +Cell[17180, 508, 2183, 58, 135, "Input",ExpressionUUID->"8b0f4955-2c3f-418c-9226-9be8f87621e8"], +Cell[19366, 568, 1027, 27, 67, "Output",ExpressionUUID->"edd0619f-6f12-4070-a1d2-6b547877fadc"] +}, Open ]], +Cell[CellGroupData[{ +Cell[20430, 600, 1543, 46, 114, "Input",ExpressionUUID->"fb45123c-c610-4075-99b0-7cd71c728ae7"], +Cell[21976, 648, 1311, 32, 98, "Output",ExpressionUUID->"2ae14565-b412-4dc0-9dce-bd6c1ba5ef27"] +}, Open ]], +Cell[23302, 683, 179, 3, 35, "Text",ExpressionUUID->"af247231-a58d-417b-987a-26908dafffdb"], +Cell[23484, 688, 2175, 65, 94, "Input",ExpressionUUID->"7c44cadd-e488-4f51-87d8-c64eef11f40c"], +Cell[25662, 755, 193, 3, 35, "Text",ExpressionUUID->"856f1746-1107-4509-a5ce-ac9c7f56cdb1"], +Cell[CellGroupData[{ +Cell[25880, 762, 536, 16, 30, "Input",ExpressionUUID->"8674484a-8543-434f-b177-3b27f9353212"], +Cell[26419, 780, 1705, 35, 87, "Output",ExpressionUUID->"c3b3f84d-91f6-41af-af6b-a394ca020511"] +}, Open ]], +Cell[28139, 818, 170, 3, 35, "Text",ExpressionUUID->"518a3040-54b1-4d43-8947-5c7d12efa94d"], +Cell[CellGroupData[{ +Cell[28334, 825, 536, 14, 30, "Input",ExpressionUUID->"61a2e974-2b39-4a07-8043-2dfd39a70569"], +Cell[28873, 841, 6754, 167, 303, "Output",ExpressionUUID->"73480ac0-3043-4077-80cc-b952a94c822a"] }, Open ]] }, Open ]], Cell[CellGroupData[{ -Cell[21669, 585, 166, 2, 64, "Section"], -Cell[21838, 589, 128, 2, 38, "Text"], -Cell[21969, 593, 2923, 52, 705, "Input"], -Cell[24895, 647, 164, 3, 38, "Text"], -Cell[25062, 652, 4876, 148, 684, "Input"], -Cell[29941, 802, 2588, 55, 201, "Input"], -Cell[32532, 859, 149, 2, 38, "Text"], -Cell[32684, 863, 15249, 396, 2133, "Input"], -Cell[47936, 1261, 137, 2, 38, "Text"], -Cell[48076, 1265, 521, 12, 32, "Input"] +Cell[35676, 1014, 226, 4, 67, "Section",ExpressionUUID->"4e833cd6-9f0e-4aa3-a873-3d579e874720"], +Cell[35905, 1020, 188, 4, 44, "Text",ExpressionUUID->"6d27fc04-3a60-4e03-8df7-3dd3aeee35b4"], +Cell[36096, 1026, 2980, 53, 703, "Input",ExpressionUUID->"c7103bd6-b539-4495-b98c-d4d12ac6cad8"], +Cell[39079, 1081, 221, 4, 44, "Text",ExpressionUUID->"0625593d-290f-4a39-9d80-8e2c6fdbc94e"], +Cell[39303, 1087, 4936, 150, 682, "Input",ExpressionUUID->"1ad4904c-352f-4b1d-a7c7-91e1b0549409"], +Cell[44242, 1239, 2645, 56, 199, "Input",ExpressionUUID->"0221674f-9b63-4662-91bc-ccc8c6ae9589"], +Cell[46890, 1297, 209, 4, 44, "Text",ExpressionUUID->"d2d2257a-487b-416f-bc40-abd4482225f7"], +Cell[47102, 1303, 15306, 397, 2131, "Input",ExpressionUUID->"daea68a9-c9e8-46ab-9bc8-5186e2cf477c"], +Cell[62411, 1702, 137, 2, 44, "Text",ExpressionUUID->"76ba9d5a-7ee3-4888-be7e-6377003275e8"], +Cell[62551, 1706, 521, 12, 30, "Input",ExpressionUUID->"4ec61f4c-3fd3-49ea-b5ef-6f7f04a16b34"] }, Open ]], Cell[CellGroupData[{ -Cell[48634, 1282, 167, 2, 64, "Section"], -Cell[48804, 1286, 5693, 122, 831, "Input"], -Cell[54500, 1410, 448, 10, 32, "Input"], -Cell[54951, 1422, 94, 1, 32, "Input"] +Cell[63109, 1723, 167, 2, 67, "Section",ExpressionUUID->"a4458b3a-09b5-4e36-a1fc-781d6702b2dc"], +Cell[63279, 1727, 5693, 122, 829, "Input",ExpressionUUID->"b1b309f8-a3a7-4081-a781-c3845e3cd372"], +Cell[68975, 1851, 448, 10, 30, "Input",ExpressionUUID->"cba42949-b0f2-42ce-aebd-ffadfd83ef88"], +Cell[69426, 1863, 94, 1, 30, "Input",ExpressionUUID->"6175b72c-af9f-43c2-b4ca-bd84c48a456d"] }, Open ]] } ] From fada2aa0f7552dc2b7c3c53946bf13fdc592e030 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 20:00:12 +0100 Subject: [PATCH 473/620] Hadrons: precision fix --- Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp index 83fa7f07..733882a5 100644 --- a/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp +++ b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp @@ -135,7 +135,7 @@ void TTwoPointNPR::execute(void) { const unsigned int nd = env().getNd(); const unsigned int nl = env().getDim(0); - const double invV = 1./env().getVolume(); + const Real invV = 1./env().getVolume(); FFT fft(env().getGrid()); std::vector result; TwoPointNPRResult twoPtp1, twoPtp2, twoPtDisc; From 0bb532f72b13f5c6d68032c8edae07d0ac092912 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 20:02:18 +0100 Subject: [PATCH 474/620] more explicit clean git tree message --- Grid/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Grid/Makefile.am b/Grid/Makefile.am index 57dcb13e..8d5b9413 100644 --- a/Grid/Makefile.am +++ b/Grid/Makefile.am @@ -27,7 +27,7 @@ version-cache: if [ `git status --porcelain | grep -v '??' | wc -l` -gt 0 ]; then\ a="uncommited changes";\ else\ - a="no uncommitted changes";\ + a="clean";\ fi;\ echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d $$a\\"%n" HEAD`" > vertmp;\ if [ -e version-cache ]; then\ From 2940c9bcfdbe7b996fc9c02806851b22d2af8f8f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 21:09:01 +0100 Subject: [PATCH 475/620] Hadrons: dedicated IO class for A2A matrices --- Hadrons/A2AMatrix.hpp | 97 ++++++++++++ Hadrons/Makefile.am | 2 + .../Modules/MContraction/A2AMesonField.hpp | 149 ++++++------------ 3 files changed, 149 insertions(+), 99 deletions(-) create mode 100644 Hadrons/A2AMatrix.hpp diff --git a/Hadrons/A2AMatrix.hpp b/Hadrons/A2AMatrix.hpp new file mode 100644 index 00000000..c54ad6a6 --- /dev/null +++ b/Hadrons/A2AMatrix.hpp @@ -0,0 +1,97 @@ +#ifndef A2A_Matrix_hpp_ +#define A2A_Matrix_hpp_ + +#include + +BEGIN_HADRONS_NAMESPACE + +template +class A2AMatrixIo +{ +public: + A2AMatrixIo(void) = default; + A2AMatrixIo(std::string filename, std::string dataname, + const unsigned int nt, const unsigned int ni, + const unsigned int nj, const unsigned int blockSize); + ~A2AMatrixIo(void) = default; + void initFile(const MetadataType &d); + void saveBlock(const T *data, const unsigned int i, const unsigned int j); +private: + std::string filename_, dataname_; + unsigned int nt_, ni_, nj_, blockSize_; +}; + +template +A2AMatrixIo::A2AMatrixIo(std::string filename, + std::string dataname, + const unsigned int nt, + const unsigned int ni, + const unsigned int nj, + const unsigned int blockSize) +: filename_(filename), dataname_(dataname) +, nt_(nt), ni_(ni), nj_(nj), blockSize_(blockSize) +{} + +template +void A2AMatrixIo::initFile(const MetadataType &d) +{ +#ifdef HAVE_HDF5 + std::vector dim = {static_cast(nt_), + static_cast(ni_), + static_cast(nj_)}, + chunk = {static_cast(nt_), + static_cast(blockSize_), + static_cast(blockSize_)}; + H5NS::DataSpace dataspace(dim.size(), dim.data()); + H5NS::DataSet dataset; + H5NS::DSetCreatPropList plist; + + // create empty file just with metadata + { + Hdf5Writer writer(filename_); + write(writer, dataname_, d); + } + + // create the dataset + Hdf5Writer writer(filename_); + + push(writer, dataname_); + auto &group = writer.getGroup(); + plist.setChunk(chunk.size(), chunk.data()); + dataset = group.createDataSet("data", Hdf5Type::type(), dataspace, plist); +#else + HADRONS_ERROR(Implementation, "all-to-all matrix I/O needs HDF5 library"); +#endif +} + +template +void A2AMatrixIo::saveBlock(const T *data, + const unsigned int i, + const unsigned int j) +{ +#ifdef HAVE_HDF5 + Hdf5Reader reader(filename_); + std::vector count = {nt_, blockSize_, blockSize_}, + offset = {0, static_cast(i), + static_cast(j)}, + stride = {1, 1, 1}, + block = {1, 1, 1}; + H5NS::DataSpace memspace(count.size(), count.data()), dataspace; + H5NS::DataSet dataset; + size_t shift; + + push(reader, dataname_); + auto &group = reader.getGroup(); + dataset = group.openDataSet("data"); + dataspace = dataset.getSpace(); + dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(), + stride.data(), block.data()); + dataset.write(data, Hdf5Type::type(), memspace, dataspace); +#else + HADRONS_ERROR(Implementation, "all-to-all matrix I/O needs HDF5 library"); +#endif +} + +END_HADRONS_NAMESPACE + +#endif // A2A_Matrix_hpp_ \ No newline at end of file diff --git a/Hadrons/Makefile.am b/Hadrons/Makefile.am index 93251dca..f10a9bca 100644 --- a/Hadrons/Makefile.am +++ b/Hadrons/Makefile.am @@ -15,7 +15,9 @@ libHadrons_adir = $(includedir)/Hadrons nobase_libHadrons_a_HEADERS = \ $(modules_hpp) \ A2AVectors.hpp \ + A2AMatrix.hpp \ Application.hpp \ + DilutedNoise.hpp \ EigenPack.hpp \ Environment.hpp \ Exceptions.hpp \ diff --git a/Hadrons/Modules/MContraction/A2AMesonField.hpp b/Hadrons/Modules/MContraction/A2AMesonField.hpp index 4ca538e1..2af842dc 100644 --- a/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -34,6 +34,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include @@ -62,6 +63,14 @@ class A2AMesonFieldPar: Serializable std::vector, mom); }; +class A2AMesonFieldMetadata: Serializable +{ + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldMetadata, + std::vector, momentum, + Gamma::Algebra, gamma); +}; + template class TA2AMesonField : public Module { @@ -70,6 +79,13 @@ public: SOLVER_TYPE_ALIASES(FImpl,); typedef Eigen::TensorMap> MesonField; typedef Eigen::TensorMap> MesonFieldIo; + typedef A2AMatrixIo MatrixIo; + struct IoHelper + { + MatrixIo io; + A2AMesonFieldMetadata metadata; + size_t offset; + }; public: // constructor TA2AMesonField(const std::string name); @@ -86,16 +102,13 @@ private: // IO std::string ioname(unsigned int m, unsigned int g) const; std::string filename(unsigned int m, unsigned int g) const; - void initFile(unsigned int m, unsigned int g); - void saveBlock(const MesonFieldIo &mf, - unsigned int m, unsigned int g, - unsigned int i, unsigned int j); + void saveBlock(MF_IO_TYPE *data, IoHelper &h, unsigned int i, unsigned int j); private: bool hasPhase_{false}; std::string momphName_; std::vector gamma_; std::vector> mom_; - std::vector> nodeFile_; + std::vector nodeIo_; }; MODULE_REGISTER(A2AMesonField, ARG(TA2AMesonField), MContraction); @@ -331,51 +344,42 @@ void TA2AMesonField::execute(void) makeFileDir(filename(0, 0), env().getGrid()); #ifdef MF_PARALLEL_IO env().getGrid()->Barrier(); - nodeFile_.clear(); + nodeIo_.clear(); for(int f = myRank; f < nmom*ngamma; f += nRank) { - std::pair file; + const unsigned int m = f/ngamma, g = f % ngamma; + IoHelper h; - file.first = f/ngamma; - file.second = f % ngamma; - nodeFile_.push_back(file); + h.io = MatrixIo(filename(m, g), ioname(m, g), nt, N_i, N_j, block); + for (auto pmu: mom_[m]) + { + h.metadata.momentum.push_back(pmu); + } + h.metadata.gamma = gamma_[g]; + h.offset = (m*ngamma + g)*nt*block*block; + nodeIo_.push_back(h); } // parallel IO - for (auto &f: nodeFile_) + for (auto &h: nodeIo_) { - auto m = f.first, g = f.second; - - if ((i == 0) and (j == 0)) - { - startTimer("IO: file creation"); - initFile(m, g); - stopTimer("IO: file creation"); - } - startTimer("IO: write block"); - saveBlock(mfBlock, m, g, i, j); - stopTimer("IO: write block"); + saveBlock(mfBlock.data(), h, i, j); } env().getGrid()->Barrier(); #else // serial IO for(int m = 0; m < nmom; m++) for(int g = 0; g < ngamma; g++) - { - if ((i == 0) and (j == 0)) + { + IoHelper h; + + h.io = MatrixIo(filename(m, g), ioname(m, g), nt, N_i, N_j, block); + for (auto pmu: mom_[m]) { - startTimer("IO: file creation"); - if (env().getGrid()->IsBoss()) - { - initFile(m, g); - } - stopTimer("IO: file creation"); + h.metadata.momentum.push_back(pmu); } - startTimer("IO: write block"); - if (env().getGrid()->IsBoss()) - { - saveBlock(mfBlock, m, g, i, j); - } - stopTimer("IO: write block"); + h.metadata.gamma = gamma_[g]; + h.offset = (m*ngamma + g)*nt*block*block; + saveBlock(mfBlock.data(), h, i, j); } #endif stopTimer("IO: total"); @@ -412,71 +416,18 @@ std::string TA2AMesonField::filename(unsigned int m, unsigned int g) cons } template -void TA2AMesonField::initFile(unsigned int m, unsigned int g) -{ -#ifdef HAVE_HDF5 - std::string f = filename(m, g); - auto &v = envGet(std::vector, par().v); - auto &w = envGet(std::vector, par().w); - int nt = env().getDim().back(); - int N_i = w.size(); - int N_j = v.size(); - - Hdf5Writer writer(f); - std::vector dim = {static_cast(nt), - static_cast(N_i), - static_cast(N_j)}, - chunk = {static_cast(nt), - static_cast(par().block), - static_cast(par().block)}; - H5NS::DataSpace dataspace(dim.size(), dim.data()); - H5NS::DataSet dataset; - H5NS::DSetCreatPropList plist; - - push(writer, ioname(m, g)); - write(writer, "momentum", mom_[m]); - write(writer, "gamma", gamma_[g]); - auto &group = writer.getGroup(); - plist.setChunk(chunk.size(), chunk.data()); - dataset = group.createDataSet("mesonField", Hdf5Type::type(), - dataspace, plist); -#else - HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); -#endif -} - -template -void TA2AMesonField::saveBlock(const MesonFieldIo &mf, - unsigned int m, unsigned int g, +void TA2AMesonField::saveBlock(MF_IO_TYPE *data, IoHelper &h, unsigned int i, unsigned int j) { -#ifdef HAVE_HDF5 - std::string f = filename(m, g); - Hdf5Reader reader(f); - hsize_t nt = mf.dimension(2), - Ni = mf.dimension(3), - Nj = mf.dimension(4); - std::vector count = {nt, Ni, Nj}, - offset = {0, static_cast(i), - static_cast(j)}, - stride = {1, 1, 1}, - block = {1, 1, 1}; - H5NS::DataSpace memspace(count.size(), count.data()), dataspace; - H5NS::DataSet dataset; - size_t shift; - - push(reader, ioname(m, g)); - auto &group = reader.getGroup(); - dataset = group.openDataSet("mesonField"); - dataspace = dataset.getSpace(); - dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(), - stride.data(), block.data()); - shift = (m*mf.dimension(1) + g)*nt*Ni*Nj; - dataset.write(mf.data() + shift, Hdf5Type::type(), memspace, - dataspace); -#else - HADRONS_ERROR(Implementation, "meson field I/O needs HDF5 library"); -#endif + if ((i == 0) and (j == 0)) + { + startTimer("IO: file creation"); + h.io.initFile(h.metadata); + stopTimer("IO: file creation"); + } + startTimer("IO: write block"); + h.io.saveBlock(data + h.offset, i, j); + stopTimer("IO: write block"); } END_MODULE_NAMESPACE From b3fa18c22966b567c5cfdeaa82cbfda8061e114f Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 1 Sep 2018 21:29:58 +0100 Subject: [PATCH 476/620] copyright script never removes authorship --- scripts/copyright | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/copyright b/scripts/copyright index a461b54c..2401f4aa 100755 --- a/scripts/copyright +++ b/scripts/copyright @@ -15,7 +15,12 @@ Copyright (C) 2015-2018 EOF -git log $1 | grep Author | sort -u >> message +git log $1 | grep Author > gitauth +grep 'Author: ' $1 > fileauth + +cat gitauth fileauth | sort -u >> message + +rm gitauth fileauth cat >> message < Date: Sat, 1 Sep 2018 21:30:30 +0100 Subject: [PATCH 477/620] Hadrons: copyright update --- Hadrons/A2AMatrix.hpp | 27 +++++++++++++++++++ Hadrons/A2AVectors.hpp | 2 +- Hadrons/Application.cc | 2 +- Hadrons/Application.hpp | 2 +- Hadrons/DilutedNoise.hpp | 2 +- Hadrons/EigenPack.hpp | 2 +- Hadrons/Environment.cc | 2 +- Hadrons/Environment.hpp | 2 +- Hadrons/Exceptions.cc | 2 +- Hadrons/Exceptions.hpp | 2 +- Hadrons/Factory.hpp | 2 +- Hadrons/GeneticScheduler.hpp | 2 +- Hadrons/Global.cc | 2 +- Hadrons/Global.hpp | 2 +- Hadrons/Graph.hpp | 2 +- Hadrons/HadronsXmlRun.cc | 2 +- Hadrons/Module.cc | 2 +- Hadrons/Module.hpp | 2 +- Hadrons/ModuleFactory.hpp | 2 +- Hadrons/Modules.hpp | 2 +- Hadrons/Modules/MAction/DWF.cc | 2 +- Hadrons/Modules/MAction/DWF.hpp | 2 +- Hadrons/Modules/MAction/MobiusDWF.cc | 2 +- Hadrons/Modules/MAction/MobiusDWF.hpp | 2 +- Hadrons/Modules/MAction/ScaledDWF.cc | 2 +- Hadrons/Modules/MAction/ScaledDWF.hpp | 2 +- Hadrons/Modules/MAction/Wilson.cc | 2 +- Hadrons/Modules/MAction/Wilson.hpp | 2 +- Hadrons/Modules/MAction/WilsonClover.cc | 2 +- Hadrons/Modules/MAction/WilsonClover.hpp | 2 +- Hadrons/Modules/MAction/ZMobiusDWF.cc | 2 +- Hadrons/Modules/MAction/ZMobiusDWF.hpp | 2 +- Hadrons/Modules/MContraction/A2AMesonField.cc | 2 +- .../Modules/MContraction/A2AMesonField.hpp | 2 +- .../MContraction/A2AMesonFieldKernels.hpp | 2 +- Hadrons/Modules/MContraction/Baryon.cc | 2 +- Hadrons/Modules/MContraction/Baryon.hpp | 2 +- Hadrons/Modules/MContraction/DiscLoop.cc | 2 +- Hadrons/Modules/MContraction/DiscLoop.hpp | 2 +- Hadrons/Modules/MContraction/Gamma3pt.cc | 2 +- Hadrons/Modules/MContraction/Gamma3pt.hpp | 2 +- Hadrons/Modules/MContraction/Meson.cc | 2 +- Hadrons/Modules/MContraction/Meson.hpp | 2 +- Hadrons/Modules/MContraction/WardIdentity.cc | 2 +- Hadrons/Modules/MContraction/WardIdentity.hpp | 2 +- .../Modules/MContraction/WeakHamiltonian.hpp | 2 +- .../MContraction/WeakHamiltonianEye.cc | 2 +- .../MContraction/WeakHamiltonianEye.hpp | 2 +- .../MContraction/WeakHamiltonianNonEye.cc | 2 +- .../MContraction/WeakHamiltonianNonEye.hpp | 2 +- .../MContraction/WeakNeutral4ptDisc.cc | 2 +- .../MContraction/WeakNeutral4ptDisc.hpp | 2 +- Hadrons/Modules/MFermion/FreeProp.cc | 2 +- Hadrons/Modules/MFermion/FreeProp.hpp | 2 +- Hadrons/Modules/MFermion/GaugeProp.cc | 2 +- Hadrons/Modules/MFermion/GaugeProp.hpp | 2 +- Hadrons/Modules/MGauge/FundtoHirep.cc | 2 +- Hadrons/Modules/MGauge/FundtoHirep.hpp | 2 +- Hadrons/Modules/MGauge/Random.cc | 2 +- Hadrons/Modules/MGauge/Random.hpp | 2 +- Hadrons/Modules/MGauge/StochEm.cc | 2 +- Hadrons/Modules/MGauge/StochEm.hpp | 2 +- Hadrons/Modules/MGauge/StoutSmearing.cc | 2 +- Hadrons/Modules/MGauge/StoutSmearing.hpp | 2 +- Hadrons/Modules/MGauge/Unit.cc | 2 +- Hadrons/Modules/MGauge/Unit.hpp | 2 +- Hadrons/Modules/MGauge/UnitEm.cc | 2 +- Hadrons/Modules/MGauge/UnitEm.hpp | 2 +- Hadrons/Modules/MIO/LoadBinary.cc | 2 +- Hadrons/Modules/MIO/LoadBinary.hpp | 2 +- Hadrons/Modules/MIO/LoadCoarseEigenPack.cc | 2 +- Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp | 2 +- Hadrons/Modules/MIO/LoadEigenPack.cc | 2 +- Hadrons/Modules/MIO/LoadEigenPack.hpp | 2 +- Hadrons/Modules/MIO/LoadNersc.cc | 2 +- Hadrons/Modules/MIO/LoadNersc.hpp | 2 +- Hadrons/Modules/MLoop/NoiseLoop.cc | 2 +- Hadrons/Modules/MLoop/NoiseLoop.hpp | 2 +- .../MNoise/TimeDilutedSpinColorDiagonal.cc | 2 +- .../MNoise/TimeDilutedSpinColorDiagonal.hpp | 2 +- Hadrons/Modules/MScalar/ChargedProp.cc | 2 +- Hadrons/Modules/MScalar/ChargedProp.hpp | 2 +- Hadrons/Modules/MScalar/FreeProp.cc | 2 +- Hadrons/Modules/MScalar/FreeProp.hpp | 2 +- Hadrons/Modules/MScalar/Scalar.hpp | 2 +- Hadrons/Modules/MScalar/ScalarVP.cc | 2 +- Hadrons/Modules/MScalar/ScalarVP.hpp | 2 +- Hadrons/Modules/MScalar/VPCounterTerms.cc | 2 +- Hadrons/Modules/MScalar/VPCounterTerms.hpp | 2 +- Hadrons/Modules/MScalarSUN/Div.cc | 2 +- Hadrons/Modules/MScalarSUN/Div.hpp | 2 +- Hadrons/Modules/MScalarSUN/EMT.cc | 2 +- Hadrons/Modules/MScalarSUN/EMT.hpp | 2 +- Hadrons/Modules/MScalarSUN/Grad.cc | 2 +- Hadrons/Modules/MScalarSUN/Grad.hpp | 2 +- Hadrons/Modules/MScalarSUN/ShiftProbe.cc | 2 +- Hadrons/Modules/MScalarSUN/ShiftProbe.hpp | 2 +- Hadrons/Modules/MScalarSUN/StochFreeField.cc | 2 +- Hadrons/Modules/MScalarSUN/StochFreeField.hpp | 2 +- Hadrons/Modules/MScalarSUN/TimeMomProbe.cc | 2 +- Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp | 2 +- Hadrons/Modules/MScalarSUN/TrKinetic.cc | 2 +- Hadrons/Modules/MScalarSUN/TrKinetic.hpp | 2 +- Hadrons/Modules/MScalarSUN/TrMag.cc | 2 +- Hadrons/Modules/MScalarSUN/TrMag.hpp | 2 +- Hadrons/Modules/MScalarSUN/TrPhi.cc | 2 +- Hadrons/Modules/MScalarSUN/TrPhi.hpp | 2 +- Hadrons/Modules/MScalarSUN/TransProj.cc | 2 +- Hadrons/Modules/MScalarSUN/TransProj.hpp | 2 +- Hadrons/Modules/MScalarSUN/TwoPoint.cc | 2 +- Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 2 +- Hadrons/Modules/MScalarSUN/TwoPointNPR.cc | 2 +- Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp | 2 +- Hadrons/Modules/MScalarSUN/Utils.hpp | 2 +- Hadrons/Modules/MSink/Point.cc | 2 +- Hadrons/Modules/MSink/Point.hpp | 2 +- Hadrons/Modules/MSink/Smear.cc | 2 +- Hadrons/Modules/MSink/Smear.hpp | 2 +- Hadrons/Modules/MSolver/A2AVectors.cc | 2 +- Hadrons/Modules/MSolver/A2AVectors.hpp | 2 +- .../Modules/MSolver/LocalCoherenceLanczos.cc | 2 +- .../Modules/MSolver/LocalCoherenceLanczos.hpp | 2 +- Hadrons/Modules/MSolver/RBPrecCG.cc | 2 +- Hadrons/Modules/MSolver/RBPrecCG.hpp | 2 +- Hadrons/Modules/MSource/Point.cc | 2 +- Hadrons/Modules/MSource/Point.hpp | 2 +- Hadrons/Modules/MSource/SeqConserved.cc | 2 +- Hadrons/Modules/MSource/SeqConserved.hpp | 2 +- Hadrons/Modules/MSource/SeqGamma.cc | 2 +- Hadrons/Modules/MSource/SeqGamma.hpp | 2 +- Hadrons/Modules/MSource/Wall.cc | 2 +- Hadrons/Modules/MSource/Wall.hpp | 2 +- Hadrons/Modules/MSource/Z2.cc | 2 +- Hadrons/Modules/MSource/Z2.hpp | 2 +- Hadrons/Modules/MUtilities/RandomVectors.cc | 2 +- Hadrons/Modules/MUtilities/RandomVectors.hpp | 2 +- .../Modules/MUtilities/TestSeqConserved.cc | 2 +- .../Modules/MUtilities/TestSeqConserved.hpp | 2 +- Hadrons/Modules/MUtilities/TestSeqGamma.cc | 2 +- Hadrons/Modules/MUtilities/TestSeqGamma.hpp | 2 +- Hadrons/Solver.hpp | 2 +- Hadrons/VirtualMachine.cc | 2 +- Hadrons/VirtualMachine.hpp | 2 +- 143 files changed, 169 insertions(+), 142 deletions(-) diff --git a/Hadrons/A2AMatrix.hpp b/Hadrons/A2AMatrix.hpp index c54ad6a6..b219df59 100644 --- a/Hadrons/A2AMatrix.hpp +++ b/Hadrons/A2AMatrix.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/A2AMatrix.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef A2A_Matrix_hpp_ #define A2A_Matrix_hpp_ diff --git a/Hadrons/A2AVectors.hpp b/Hadrons/A2AVectors.hpp index 002cd271..423a5f08 100644 --- a/Hadrons/A2AVectors.hpp +++ b/Hadrons/A2AVectors.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/A2AVectors.hpp +Source file: Hadrons/A2AVectors.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Application.cc b/Hadrons/Application.cc index 12fae13e..d3eee21c 100644 --- a/Hadrons/Application.cc +++ b/Hadrons/Application.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Application.cc +Source file: Hadrons/Application.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Application.hpp b/Hadrons/Application.hpp index e942c21c..432fe757 100644 --- a/Hadrons/Application.hpp +++ b/Hadrons/Application.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Application.hpp +Source file: Hadrons/Application.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/DilutedNoise.hpp b/Hadrons/DilutedNoise.hpp index c6ab71bc..1f8186ae 100644 --- a/Hadrons/DilutedNoise.hpp +++ b/Hadrons/DilutedNoise.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/DilutedNoise.hpp +Source file: Hadrons/DilutedNoise.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/EigenPack.hpp b/Hadrons/EigenPack.hpp index f00d905d..49fecc34 100644 --- a/Hadrons/EigenPack.hpp +++ b/Hadrons/EigenPack.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/EigenPack.hpp +Source file: Hadrons/EigenPack.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Environment.cc b/Hadrons/Environment.cc index b2d8cf1a..5ad189ad 100644 --- a/Hadrons/Environment.cc +++ b/Hadrons/Environment.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Environment.cc +Source file: Hadrons/Environment.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Environment.hpp b/Hadrons/Environment.hpp index 32e6f05a..8aaac012 100644 --- a/Hadrons/Environment.hpp +++ b/Hadrons/Environment.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Environment.hpp +Source file: Hadrons/Environment.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Exceptions.cc b/Hadrons/Exceptions.cc index 1ba6e7d1..c9800610 100644 --- a/Hadrons/Exceptions.cc +++ b/Hadrons/Exceptions.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Exceptions.cc +Source file: Hadrons/Exceptions.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Exceptions.hpp b/Hadrons/Exceptions.hpp index 897997cb..2a8b0f8c 100644 --- a/Hadrons/Exceptions.hpp +++ b/Hadrons/Exceptions.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Exceptions.hpp +Source file: Hadrons/Exceptions.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Factory.hpp b/Hadrons/Factory.hpp index 08617402..8a3c20ba 100644 --- a/Hadrons/Factory.hpp +++ b/Hadrons/Factory.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Factory.hpp +Source file: Hadrons/Factory.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/GeneticScheduler.hpp b/Hadrons/GeneticScheduler.hpp index b58648f9..3e6b7fa4 100644 --- a/Hadrons/GeneticScheduler.hpp +++ b/Hadrons/GeneticScheduler.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/GeneticScheduler.hpp +Source file: Hadrons/GeneticScheduler.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Global.cc b/Hadrons/Global.cc index df3b1a31..516e466f 100644 --- a/Hadrons/Global.cc +++ b/Hadrons/Global.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Global.cc +Source file: Hadrons/Global.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Global.hpp b/Hadrons/Global.hpp index 7a5df1ba..04c1f54a 100644 --- a/Hadrons/Global.hpp +++ b/Hadrons/Global.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Global.hpp +Source file: Hadrons/Global.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Graph.hpp b/Hadrons/Graph.hpp index 6f4a9e4a..10e3bc60 100644 --- a/Hadrons/Graph.hpp +++ b/Hadrons/Graph.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Graph.hpp +Source file: Hadrons/Graph.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/HadronsXmlRun.cc b/Hadrons/HadronsXmlRun.cc index 0b62bdd1..c6ea7dc5 100644 --- a/Hadrons/HadronsXmlRun.cc +++ b/Hadrons/HadronsXmlRun.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/HadronsXmlRun.cc +Source file: Hadrons/HadronsXmlRun.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Module.cc b/Hadrons/Module.cc index 7bb0e862..3a610ae6 100644 --- a/Hadrons/Module.cc +++ b/Hadrons/Module.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Module.cc +Source file: Hadrons/Module.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Module.hpp b/Hadrons/Module.hpp index f374d231..f16c38e8 100644 --- a/Hadrons/Module.hpp +++ b/Hadrons/Module.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Module.hpp +Source file: Hadrons/Module.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/ModuleFactory.hpp b/Hadrons/ModuleFactory.hpp index 8fca06c3..7dcbac75 100644 --- a/Hadrons/ModuleFactory.hpp +++ b/Hadrons/ModuleFactory.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/ModuleFactory.hpp +Source file: Hadrons/ModuleFactory.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules.hpp b/Hadrons/Modules.hpp index 7725e8c2..ec23f3c7 100644 --- a/Hadrons/Modules.hpp +++ b/Hadrons/Modules.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules.hpp +Source file: Hadrons/Modules.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/DWF.cc b/Hadrons/Modules/MAction/DWF.cc index df720013..35ff60ac 100644 --- a/Hadrons/Modules/MAction/DWF.cc +++ b/Hadrons/Modules/MAction/DWF.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/DWF.cc +Source file: Hadrons/Modules/MAction/DWF.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/DWF.hpp b/Hadrons/Modules/MAction/DWF.hpp index 0bc32b0d..88ceed75 100644 --- a/Hadrons/Modules/MAction/DWF.hpp +++ b/Hadrons/Modules/MAction/DWF.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/DWF.hpp +Source file: Hadrons/Modules/MAction/DWF.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/MobiusDWF.cc b/Hadrons/Modules/MAction/MobiusDWF.cc index 6efbfdb2..ba45462f 100644 --- a/Hadrons/Modules/MAction/MobiusDWF.cc +++ b/Hadrons/Modules/MAction/MobiusDWF.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/MobiusDWF.cc +Source file: Hadrons/Modules/MAction/MobiusDWF.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/MobiusDWF.hpp b/Hadrons/Modules/MAction/MobiusDWF.hpp index 7f96b9ca..47e72ab8 100644 --- a/Hadrons/Modules/MAction/MobiusDWF.hpp +++ b/Hadrons/Modules/MAction/MobiusDWF.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/MobiusDWF.hpp +Source file: Hadrons/Modules/MAction/MobiusDWF.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/ScaledDWF.cc b/Hadrons/Modules/MAction/ScaledDWF.cc index 437db78b..b3f7acdb 100644 --- a/Hadrons/Modules/MAction/ScaledDWF.cc +++ b/Hadrons/Modules/MAction/ScaledDWF.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/ScaledDWF.cc +Source file: Hadrons/Modules/MAction/ScaledDWF.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/ScaledDWF.hpp b/Hadrons/Modules/MAction/ScaledDWF.hpp index 18993370..f4f38810 100644 --- a/Hadrons/Modules/MAction/ScaledDWF.hpp +++ b/Hadrons/Modules/MAction/ScaledDWF.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/ScaledDWF.hpp +Source file: Hadrons/Modules/MAction/ScaledDWF.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/Wilson.cc b/Hadrons/Modules/MAction/Wilson.cc index db99f977..faceb76e 100644 --- a/Hadrons/Modules/MAction/Wilson.cc +++ b/Hadrons/Modules/MAction/Wilson.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/Wilson.cc +Source file: Hadrons/Modules/MAction/Wilson.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/Wilson.hpp b/Hadrons/Modules/MAction/Wilson.hpp index ab604932..6fbded7c 100644 --- a/Hadrons/Modules/MAction/Wilson.hpp +++ b/Hadrons/Modules/MAction/Wilson.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/Wilson.hpp +Source file: Hadrons/Modules/MAction/Wilson.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/WilsonClover.cc b/Hadrons/Modules/MAction/WilsonClover.cc index 8fe83a72..601388aa 100644 --- a/Hadrons/Modules/MAction/WilsonClover.cc +++ b/Hadrons/Modules/MAction/WilsonClover.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/WilsonClover.cc +Source file: Hadrons/Modules/MAction/WilsonClover.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/WilsonClover.hpp b/Hadrons/Modules/MAction/WilsonClover.hpp index 31bb3d41..241bc6f9 100644 --- a/Hadrons/Modules/MAction/WilsonClover.hpp +++ b/Hadrons/Modules/MAction/WilsonClover.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/WilsonClover.hpp +Source file: Hadrons/Modules/MAction/WilsonClover.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/ZMobiusDWF.cc b/Hadrons/Modules/MAction/ZMobiusDWF.cc index 5a1a0a6e..0eb06130 100644 --- a/Hadrons/Modules/MAction/ZMobiusDWF.cc +++ b/Hadrons/Modules/MAction/ZMobiusDWF.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/ZMobiusDWF.cc +Source file: Hadrons/Modules/MAction/ZMobiusDWF.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MAction/ZMobiusDWF.hpp b/Hadrons/Modules/MAction/ZMobiusDWF.hpp index 3a00ec51..13aaddd6 100644 --- a/Hadrons/Modules/MAction/ZMobiusDWF.hpp +++ b/Hadrons/Modules/MAction/ZMobiusDWF.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MAction/ZMobiusDWF.hpp +Source file: Hadrons/Modules/MAction/ZMobiusDWF.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/A2AMesonField.cc b/Hadrons/Modules/MContraction/A2AMesonField.cc index d8fa8bf7..2adadae2 100644 --- a/Hadrons/Modules/MContraction/A2AMesonField.cc +++ b/Hadrons/Modules/MContraction/A2AMesonField.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/A2AMesonField.cc +Source file: Hadrons/Modules/MContraction/A2AMesonField.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/A2AMesonField.hpp b/Hadrons/Modules/MContraction/A2AMesonField.hpp index 2af842dc..34703e78 100644 --- a/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/A2AMesonField.hpp +Source file: Hadrons/Modules/MContraction/A2AMesonField.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp b/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp index ed078130..76317ea0 100644 --- a/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp +Source file: Hadrons/Modules/MContraction/A2AMesonFieldKernels.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/Baryon.cc b/Hadrons/Modules/MContraction/Baryon.cc index d397cd72..f597a858 100644 --- a/Hadrons/Modules/MContraction/Baryon.cc +++ b/Hadrons/Modules/MContraction/Baryon.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/Baryon.cc +Source file: Hadrons/Modules/MContraction/Baryon.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/Baryon.hpp b/Hadrons/Modules/MContraction/Baryon.hpp index 927a299e..01db09e0 100644 --- a/Hadrons/Modules/MContraction/Baryon.hpp +++ b/Hadrons/Modules/MContraction/Baryon.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/Baryon.hpp +Source file: Hadrons/Modules/MContraction/Baryon.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/DiscLoop.cc b/Hadrons/Modules/MContraction/DiscLoop.cc index 683e4e74..fa4cd235 100644 --- a/Hadrons/Modules/MContraction/DiscLoop.cc +++ b/Hadrons/Modules/MContraction/DiscLoop.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/DiscLoop.cc +Source file: Hadrons/Modules/MContraction/DiscLoop.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/DiscLoop.hpp b/Hadrons/Modules/MContraction/DiscLoop.hpp index c88df7d9..f8b88eb2 100644 --- a/Hadrons/Modules/MContraction/DiscLoop.hpp +++ b/Hadrons/Modules/MContraction/DiscLoop.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/DiscLoop.hpp +Source file: Hadrons/Modules/MContraction/DiscLoop.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/Gamma3pt.cc b/Hadrons/Modules/MContraction/Gamma3pt.cc index fb6fe896..ca1ca441 100644 --- a/Hadrons/Modules/MContraction/Gamma3pt.cc +++ b/Hadrons/Modules/MContraction/Gamma3pt.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/Gamma3pt.cc +Source file: Hadrons/Modules/MContraction/Gamma3pt.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/Gamma3pt.hpp b/Hadrons/Modules/MContraction/Gamma3pt.hpp index 2abdaf5f..2a0da43a 100644 --- a/Hadrons/Modules/MContraction/Gamma3pt.hpp +++ b/Hadrons/Modules/MContraction/Gamma3pt.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/Gamma3pt.hpp +Source file: Hadrons/Modules/MContraction/Gamma3pt.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/Meson.cc b/Hadrons/Modules/MContraction/Meson.cc index e4c83331..7fac7e95 100644 --- a/Hadrons/Modules/MContraction/Meson.cc +++ b/Hadrons/Modules/MContraction/Meson.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/Meson.cc +Source file: Hadrons/Modules/MContraction/Meson.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/Meson.hpp b/Hadrons/Modules/MContraction/Meson.hpp index 077110a4..a5806d97 100644 --- a/Hadrons/Modules/MContraction/Meson.hpp +++ b/Hadrons/Modules/MContraction/Meson.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/Meson.hpp +Source file: Hadrons/Modules/MContraction/Meson.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WardIdentity.cc b/Hadrons/Modules/MContraction/WardIdentity.cc index ad2a46f1..98c06d12 100644 --- a/Hadrons/Modules/MContraction/WardIdentity.cc +++ b/Hadrons/Modules/MContraction/WardIdentity.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WardIdentity.cc +Source file: Hadrons/Modules/MContraction/WardIdentity.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WardIdentity.hpp b/Hadrons/Modules/MContraction/WardIdentity.hpp index b755015b..a0f82590 100644 --- a/Hadrons/Modules/MContraction/WardIdentity.hpp +++ b/Hadrons/Modules/MContraction/WardIdentity.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WardIdentity.hpp +Source file: Hadrons/Modules/MContraction/WardIdentity.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WeakHamiltonian.hpp b/Hadrons/Modules/MContraction/WeakHamiltonian.hpp index 83c3b772..a721e419 100644 --- a/Hadrons/Modules/MContraction/WeakHamiltonian.hpp +++ b/Hadrons/Modules/MContraction/WeakHamiltonian.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp +Source file: Hadrons/Modules/MContraction/WeakHamiltonian.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc b/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc index 16cee0bc..2183d992 100644 --- a/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc +++ b/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc +Source file: Hadrons/Modules/MContraction/WeakHamiltonianEye.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp b/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp index 826547b4..37d37022 100644 --- a/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp +++ b/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp +Source file: Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc index 6ff22152..5c1d8a1c 100644 --- a/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc +++ b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc +Source file: Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp index 93830421..19c0ebaa 100644 --- a/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp +++ b/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp +Source file: Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc index 89e8a79b..2273dd3d 100644 --- a/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc +++ b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc +Source file: Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp index c0b3ee53..3e20633f 100644 --- a/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp +++ b/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp +Source file: Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MFermion/FreeProp.cc b/Hadrons/Modules/MFermion/FreeProp.cc index 5184ed78..1256f19c 100644 --- a/Hadrons/Modules/MFermion/FreeProp.cc +++ b/Hadrons/Modules/MFermion/FreeProp.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MFermion/FreeProp.cc +Source file: Hadrons/Modules/MFermion/FreeProp.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MFermion/FreeProp.hpp b/Hadrons/Modules/MFermion/FreeProp.hpp index c06240de..000c2ea1 100644 --- a/Hadrons/Modules/MFermion/FreeProp.hpp +++ b/Hadrons/Modules/MFermion/FreeProp.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MFermion/FreeProp.hpp +Source file: Hadrons/Modules/MFermion/FreeProp.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MFermion/GaugeProp.cc b/Hadrons/Modules/MFermion/GaugeProp.cc index 027e4cfc..f3881e0f 100644 --- a/Hadrons/Modules/MFermion/GaugeProp.cc +++ b/Hadrons/Modules/MFermion/GaugeProp.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MFermion/GaugeProp.cc +Source file: Hadrons/Modules/MFermion/GaugeProp.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MFermion/GaugeProp.hpp b/Hadrons/Modules/MFermion/GaugeProp.hpp index 24a6446a..e6408a6d 100644 --- a/Hadrons/Modules/MFermion/GaugeProp.hpp +++ b/Hadrons/Modules/MFermion/GaugeProp.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MFermion/GaugeProp.hpp +Source file: Hadrons/Modules/MFermion/GaugeProp.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/FundtoHirep.cc b/Hadrons/Modules/MGauge/FundtoHirep.cc index 4a880134..11b4aed5 100644 --- a/Hadrons/Modules/MGauge/FundtoHirep.cc +++ b/Hadrons/Modules/MGauge/FundtoHirep.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.cc +Source file: Hadrons/Modules/MGauge/FundtoHirep.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/FundtoHirep.hpp b/Hadrons/Modules/MGauge/FundtoHirep.hpp index b2f90089..893383d2 100644 --- a/Hadrons/Modules/MGauge/FundtoHirep.hpp +++ b/Hadrons/Modules/MGauge/FundtoHirep.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.hpp +Source file: Hadrons/Modules/MGauge/FundtoHirep.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/Random.cc b/Hadrons/Modules/MGauge/Random.cc index b33c9a56..2c5ae761 100644 --- a/Hadrons/Modules/MGauge/Random.cc +++ b/Hadrons/Modules/MGauge/Random.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/Random.cc +Source file: Hadrons/Modules/MGauge/Random.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/Random.hpp b/Hadrons/Modules/MGauge/Random.hpp index a445aa5f..6a9c3592 100644 --- a/Hadrons/Modules/MGauge/Random.hpp +++ b/Hadrons/Modules/MGauge/Random.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/Random.hpp +Source file: Hadrons/Modules/MGauge/Random.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/StochEm.cc b/Hadrons/Modules/MGauge/StochEm.cc index e2b2c458..6f8bf55e 100644 --- a/Hadrons/Modules/MGauge/StochEm.cc +++ b/Hadrons/Modules/MGauge/StochEm.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/StochEm.cc +Source file: Hadrons/Modules/MGauge/StochEm.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/StochEm.hpp b/Hadrons/Modules/MGauge/StochEm.hpp index 151b61dc..a3f8cc96 100644 --- a/Hadrons/Modules/MGauge/StochEm.hpp +++ b/Hadrons/Modules/MGauge/StochEm.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp +Source file: Hadrons/Modules/MGauge/StochEm.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/StoutSmearing.cc b/Hadrons/Modules/MGauge/StoutSmearing.cc index 01378d1f..e7fb43d1 100644 --- a/Hadrons/Modules/MGauge/StoutSmearing.cc +++ b/Hadrons/Modules/MGauge/StoutSmearing.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/StoutSmearing.cc +Source file: Hadrons/Modules/MGauge/StoutSmearing.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/StoutSmearing.hpp b/Hadrons/Modules/MGauge/StoutSmearing.hpp index f3ed64ce..e859dde5 100644 --- a/Hadrons/Modules/MGauge/StoutSmearing.hpp +++ b/Hadrons/Modules/MGauge/StoutSmearing.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/StoutSmearing.hpp +Source file: Hadrons/Modules/MGauge/StoutSmearing.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/Unit.cc b/Hadrons/Modules/MGauge/Unit.cc index aa85f97e..f273a187 100644 --- a/Hadrons/Modules/MGauge/Unit.cc +++ b/Hadrons/Modules/MGauge/Unit.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/Unit.cc +Source file: Hadrons/Modules/MGauge/Unit.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/Unit.hpp b/Hadrons/Modules/MGauge/Unit.hpp index 8600dafe..f0af186f 100644 --- a/Hadrons/Modules/MGauge/Unit.hpp +++ b/Hadrons/Modules/MGauge/Unit.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/Unit.hpp +Source file: Hadrons/Modules/MGauge/Unit.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/UnitEm.cc b/Hadrons/Modules/MGauge/UnitEm.cc index 06d0117a..d2ecad5e 100644 --- a/Hadrons/Modules/MGauge/UnitEm.cc +++ b/Hadrons/Modules/MGauge/UnitEm.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/UnitEm.cc +Source file: Hadrons/Modules/MGauge/UnitEm.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MGauge/UnitEm.hpp b/Hadrons/Modules/MGauge/UnitEm.hpp index f6d83cb9..725147b1 100644 --- a/Hadrons/Modules/MGauge/UnitEm.hpp +++ b/Hadrons/Modules/MGauge/UnitEm.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MGauge/UnitEm.hpp +Source file: Hadrons/Modules/MGauge/UnitEm.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadBinary.cc b/Hadrons/Modules/MIO/LoadBinary.cc index 4e510a91..3f1f4fba 100644 --- a/Hadrons/Modules/MIO/LoadBinary.cc +++ b/Hadrons/Modules/MIO/LoadBinary.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadBinary.cc +Source file: Hadrons/Modules/MIO/LoadBinary.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadBinary.hpp b/Hadrons/Modules/MIO/LoadBinary.hpp index c307a7dd..ec5539b4 100644 --- a/Hadrons/Modules/MIO/LoadBinary.hpp +++ b/Hadrons/Modules/MIO/LoadBinary.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadBinary.hpp +Source file: Hadrons/Modules/MIO/LoadBinary.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc b/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc index 68f96914..ac8f2c4a 100644 --- a/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc +++ b/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.cc +Source file: Hadrons/Modules/MIO/LoadCoarseEigenPack.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp b/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp index 78834d14..94c1ff40 100644 --- a/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp +++ b/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp +Source file: Hadrons/Modules/MIO/LoadCoarseEigenPack.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadEigenPack.cc b/Hadrons/Modules/MIO/LoadEigenPack.cc index e492f0f1..7da4e14a 100644 --- a/Hadrons/Modules/MIO/LoadEigenPack.cc +++ b/Hadrons/Modules/MIO/LoadEigenPack.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadEigenPack.cc +Source file: Hadrons/Modules/MIO/LoadEigenPack.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadEigenPack.hpp b/Hadrons/Modules/MIO/LoadEigenPack.hpp index 8ad85eba..83ef1d0c 100644 --- a/Hadrons/Modules/MIO/LoadEigenPack.hpp +++ b/Hadrons/Modules/MIO/LoadEigenPack.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadEigenPack.hpp +Source file: Hadrons/Modules/MIO/LoadEigenPack.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadNersc.cc b/Hadrons/Modules/MIO/LoadNersc.cc index 35645f9b..6d26c2a8 100644 --- a/Hadrons/Modules/MIO/LoadNersc.cc +++ b/Hadrons/Modules/MIO/LoadNersc.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadNersc.cc +Source file: Hadrons/Modules/MIO/LoadNersc.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MIO/LoadNersc.hpp b/Hadrons/Modules/MIO/LoadNersc.hpp index 80e5ee18..231b2f47 100644 --- a/Hadrons/Modules/MIO/LoadNersc.hpp +++ b/Hadrons/Modules/MIO/LoadNersc.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MIO/LoadNersc.hpp +Source file: Hadrons/Modules/MIO/LoadNersc.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MLoop/NoiseLoop.cc b/Hadrons/Modules/MLoop/NoiseLoop.cc index 57e4bda6..a21372fb 100644 --- a/Hadrons/Modules/MLoop/NoiseLoop.cc +++ b/Hadrons/Modules/MLoop/NoiseLoop.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MLoop/NoiseLoop.cc +Source file: Hadrons/Modules/MLoop/NoiseLoop.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MLoop/NoiseLoop.hpp b/Hadrons/Modules/MLoop/NoiseLoop.hpp index 9c6f4cf5..8da172d4 100644 --- a/Hadrons/Modules/MLoop/NoiseLoop.hpp +++ b/Hadrons/Modules/MLoop/NoiseLoop.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MLoop/NoiseLoop.hpp +Source file: Hadrons/Modules/MLoop/NoiseLoop.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc index e4e73944..52d2b62d 100644 --- a/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc +++ b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc +Source file: Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp index 05f0252f..7decb142 100644 --- a/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +++ b/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp +Source file: Hadrons/Modules/MNoise/TimeDilutedSpinColorDiagonal.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/ChargedProp.cc b/Hadrons/Modules/MScalar/ChargedProp.cc index c1f8fc6c..ae5b849f 100644 --- a/Hadrons/Modules/MScalar/ChargedProp.cc +++ b/Hadrons/Modules/MScalar/ChargedProp.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/ChargedProp.cc +Source file: Hadrons/Modules/MScalar/ChargedProp.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/ChargedProp.hpp b/Hadrons/Modules/MScalar/ChargedProp.hpp index 45872850..bf098cd1 100644 --- a/Hadrons/Modules/MScalar/ChargedProp.hpp +++ b/Hadrons/Modules/MScalar/ChargedProp.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/ChargedProp.hpp +Source file: Hadrons/Modules/MScalar/ChargedProp.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/FreeProp.cc b/Hadrons/Modules/MScalar/FreeProp.cc index 4ae87848..4b25fbd0 100644 --- a/Hadrons/Modules/MScalar/FreeProp.cc +++ b/Hadrons/Modules/MScalar/FreeProp.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/FreeProp.cc +Source file: Hadrons/Modules/MScalar/FreeProp.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/FreeProp.hpp b/Hadrons/Modules/MScalar/FreeProp.hpp index c307d4f9..25f5f709 100644 --- a/Hadrons/Modules/MScalar/FreeProp.hpp +++ b/Hadrons/Modules/MScalar/FreeProp.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/FreeProp.hpp +Source file: Hadrons/Modules/MScalar/FreeProp.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/Scalar.hpp b/Hadrons/Modules/MScalar/Scalar.hpp index 7272f1b3..afdb1713 100644 --- a/Hadrons/Modules/MScalar/Scalar.hpp +++ b/Hadrons/Modules/MScalar/Scalar.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/Scalar.hpp +Source file: Hadrons/Modules/MScalar/Scalar.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/ScalarVP.cc b/Hadrons/Modules/MScalar/ScalarVP.cc index cafbf952..8204b7aa 100644 --- a/Hadrons/Modules/MScalar/ScalarVP.cc +++ b/Hadrons/Modules/MScalar/ScalarVP.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/ScalarVP.cc +Source file: Hadrons/Modules/MScalar/ScalarVP.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/ScalarVP.hpp b/Hadrons/Modules/MScalar/ScalarVP.hpp index 3c772c05..b7b2431f 100644 --- a/Hadrons/Modules/MScalar/ScalarVP.hpp +++ b/Hadrons/Modules/MScalar/ScalarVP.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/ScalarVP.hpp +Source file: Hadrons/Modules/MScalar/ScalarVP.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/VPCounterTerms.cc b/Hadrons/Modules/MScalar/VPCounterTerms.cc index 9953a7be..a5aff51f 100644 --- a/Hadrons/Modules/MScalar/VPCounterTerms.cc +++ b/Hadrons/Modules/MScalar/VPCounterTerms.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/VPCounterTerms.cc +Source file: Hadrons/Modules/MScalar/VPCounterTerms.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalar/VPCounterTerms.hpp b/Hadrons/Modules/MScalar/VPCounterTerms.hpp index fcfa5064..e7335694 100644 --- a/Hadrons/Modules/MScalar/VPCounterTerms.hpp +++ b/Hadrons/Modules/MScalar/VPCounterTerms.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalar/VPCounterTerms.hpp +Source file: Hadrons/Modules/MScalar/VPCounterTerms.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/Div.cc b/Hadrons/Modules/MScalarSUN/Div.cc index 1f55c593..c5d67579 100644 --- a/Hadrons/Modules/MScalarSUN/Div.cc +++ b/Hadrons/Modules/MScalarSUN/Div.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/Div.cc +Source file: Hadrons/Modules/MScalarSUN/Div.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/Div.hpp b/Hadrons/Modules/MScalarSUN/Div.hpp index 916b823f..e6f38921 100644 --- a/Hadrons/Modules/MScalarSUN/Div.hpp +++ b/Hadrons/Modules/MScalarSUN/Div.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/Div.hpp +Source file: Hadrons/Modules/MScalarSUN/Div.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/EMT.cc b/Hadrons/Modules/MScalarSUN/EMT.cc index 2ae024fd..08ba2a83 100644 --- a/Hadrons/Modules/MScalarSUN/EMT.cc +++ b/Hadrons/Modules/MScalarSUN/EMT.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/EMT.cc +Source file: Hadrons/Modules/MScalarSUN/EMT.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/EMT.hpp b/Hadrons/Modules/MScalarSUN/EMT.hpp index 4858490b..c5fd10a5 100644 --- a/Hadrons/Modules/MScalarSUN/EMT.hpp +++ b/Hadrons/Modules/MScalarSUN/EMT.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/EMT.hpp +Source file: Hadrons/Modules/MScalarSUN/EMT.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/Grad.cc b/Hadrons/Modules/MScalarSUN/Grad.cc index 7e07dba4..15904af1 100644 --- a/Hadrons/Modules/MScalarSUN/Grad.cc +++ b/Hadrons/Modules/MScalarSUN/Grad.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/Grad.cc +Source file: Hadrons/Modules/MScalarSUN/Grad.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/Grad.hpp b/Hadrons/Modules/MScalarSUN/Grad.hpp index c8b25a7d..93a8ddda 100644 --- a/Hadrons/Modules/MScalarSUN/Grad.hpp +++ b/Hadrons/Modules/MScalarSUN/Grad.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/Grad.hpp +Source file: Hadrons/Modules/MScalarSUN/Grad.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/ShiftProbe.cc b/Hadrons/Modules/MScalarSUN/ShiftProbe.cc index f08e9f20..83454941 100644 --- a/Hadrons/Modules/MScalarSUN/ShiftProbe.cc +++ b/Hadrons/Modules/MScalarSUN/ShiftProbe.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/ShiftProbe.cc +Source file: Hadrons/Modules/MScalarSUN/ShiftProbe.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp b/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp index dfc56d64..dcd56252 100644 --- a/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +++ b/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/ShiftProbe.hpp +Source file: Hadrons/Modules/MScalarSUN/ShiftProbe.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/StochFreeField.cc b/Hadrons/Modules/MScalarSUN/StochFreeField.cc index e51868f0..70e8356d 100644 --- a/Hadrons/Modules/MScalarSUN/StochFreeField.cc +++ b/Hadrons/Modules/MScalarSUN/StochFreeField.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/StochFreeField.cc +Source file: Hadrons/Modules/MScalarSUN/StochFreeField.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/StochFreeField.hpp b/Hadrons/Modules/MScalarSUN/StochFreeField.hpp index af55b115..65b6bf21 100644 --- a/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +++ b/Hadrons/Modules/MScalarSUN/StochFreeField.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/StochFreeField.hpp +Source file: Hadrons/Modules/MScalarSUN/StochFreeField.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc b/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc index 5ae5336c..5bfa203a 100644 --- a/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc +++ b/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.cc +Source file: Hadrons/Modules/MScalarSUN/TimeMomProbe.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp b/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp index 89cc2893..2b31fbe9 100644 --- a/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp +++ b/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp +Source file: Hadrons/Modules/MScalarSUN/TimeMomProbe.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TrKinetic.cc b/Hadrons/Modules/MScalarSUN/TrKinetic.cc index 5053c88a..f3823264 100644 --- a/Hadrons/Modules/MScalarSUN/TrKinetic.cc +++ b/Hadrons/Modules/MScalarSUN/TrKinetic.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TrKinetic.cc +Source file: Hadrons/Modules/MScalarSUN/TrKinetic.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TrKinetic.hpp b/Hadrons/Modules/MScalarSUN/TrKinetic.hpp index 6fb615a2..0fd931d6 100644 --- a/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +++ b/Hadrons/Modules/MScalarSUN/TrKinetic.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TrKinetic.hpp +Source file: Hadrons/Modules/MScalarSUN/TrKinetic.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TrMag.cc b/Hadrons/Modules/MScalarSUN/TrMag.cc index 20cf281d..88c8f547 100644 --- a/Hadrons/Modules/MScalarSUN/TrMag.cc +++ b/Hadrons/Modules/MScalarSUN/TrMag.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TrMag.cc +Source file: Hadrons/Modules/MScalarSUN/TrMag.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TrMag.hpp b/Hadrons/Modules/MScalarSUN/TrMag.hpp index eabb15f6..d7d40e88 100644 --- a/Hadrons/Modules/MScalarSUN/TrMag.hpp +++ b/Hadrons/Modules/MScalarSUN/TrMag.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TrMag.hpp +Source file: Hadrons/Modules/MScalarSUN/TrMag.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TrPhi.cc b/Hadrons/Modules/MScalarSUN/TrPhi.cc index d5eca1e4..bb16f1bf 100644 --- a/Hadrons/Modules/MScalarSUN/TrPhi.cc +++ b/Hadrons/Modules/MScalarSUN/TrPhi.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TrPhi.cc +Source file: Hadrons/Modules/MScalarSUN/TrPhi.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TrPhi.hpp b/Hadrons/Modules/MScalarSUN/TrPhi.hpp index 28397f99..ecc0b8d3 100644 --- a/Hadrons/Modules/MScalarSUN/TrPhi.hpp +++ b/Hadrons/Modules/MScalarSUN/TrPhi.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp +Source file: Hadrons/Modules/MScalarSUN/TrPhi.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TransProj.cc b/Hadrons/Modules/MScalarSUN/TransProj.cc index 21ee1296..46de6307 100644 --- a/Hadrons/Modules/MScalarSUN/TransProj.cc +++ b/Hadrons/Modules/MScalarSUN/TransProj.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TransProj.cc +Source file: Hadrons/Modules/MScalarSUN/TransProj.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TransProj.hpp b/Hadrons/Modules/MScalarSUN/TransProj.hpp index d5bdbcfb..516410c2 100644 --- a/Hadrons/Modules/MScalarSUN/TransProj.hpp +++ b/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TransProj.hpp +Source file: Hadrons/Modules/MScalarSUN/TransProj.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TwoPoint.cc b/Hadrons/Modules/MScalarSUN/TwoPoint.cc index 966ebab1..9cb8b7ad 100644 --- a/Hadrons/Modules/MScalarSUN/TwoPoint.cc +++ b/Hadrons/Modules/MScalarSUN/TwoPoint.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TwoPoint.cc +Source file: Hadrons/Modules/MScalarSUN/TwoPoint.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index fac770e3..48409c84 100644 --- a/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +Source file: Hadrons/Modules/MScalarSUN/TwoPoint.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc b/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc index 61bc9f90..a7b4cd4f 100644 --- a/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc +++ b/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.cc +Source file: Hadrons/Modules/MScalarSUN/TwoPointNPR.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp index 733882a5..e13ca8b4 100644 --- a/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp +++ b/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp +Source file: Hadrons/Modules/MScalarSUN/TwoPointNPR.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MScalarSUN/Utils.hpp b/Hadrons/Modules/MScalarSUN/Utils.hpp index b717f20c..fdc42c9a 100644 --- a/Hadrons/Modules/MScalarSUN/Utils.hpp +++ b/Hadrons/Modules/MScalarSUN/Utils.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MScalarSUN/Utils.hpp +Source file: Hadrons/Modules/MScalarSUN/Utils.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSink/Point.cc b/Hadrons/Modules/MSink/Point.cc index 59bb26bc..b1deaa64 100644 --- a/Hadrons/Modules/MSink/Point.cc +++ b/Hadrons/Modules/MSink/Point.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSink/Point.cc +Source file: Hadrons/Modules/MSink/Point.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSink/Point.hpp b/Hadrons/Modules/MSink/Point.hpp index 722ff4dd..ea164ced 100644 --- a/Hadrons/Modules/MSink/Point.hpp +++ b/Hadrons/Modules/MSink/Point.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSink/Point.hpp +Source file: Hadrons/Modules/MSink/Point.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSink/Smear.cc b/Hadrons/Modules/MSink/Smear.cc index dc2bea78..aacceedf 100644 --- a/Hadrons/Modules/MSink/Smear.cc +++ b/Hadrons/Modules/MSink/Smear.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSink/Smear.cc +Source file: Hadrons/Modules/MSink/Smear.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSink/Smear.hpp b/Hadrons/Modules/MSink/Smear.hpp index 21e7bdf0..59a8b9cd 100644 --- a/Hadrons/Modules/MSink/Smear.hpp +++ b/Hadrons/Modules/MSink/Smear.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSink/Smear.hpp +Source file: Hadrons/Modules/MSink/Smear.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSolver/A2AVectors.cc b/Hadrons/Modules/MSolver/A2AVectors.cc index df08ed4c..808a49e8 100644 --- a/Hadrons/Modules/MSolver/A2AVectors.cc +++ b/Hadrons/Modules/MSolver/A2AVectors.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSolver/A2AVectors.cc +Source file: Hadrons/Modules/MSolver/A2AVectors.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSolver/A2AVectors.hpp b/Hadrons/Modules/MSolver/A2AVectors.hpp index 4573487a..1de00142 100644 --- a/Hadrons/Modules/MSolver/A2AVectors.hpp +++ b/Hadrons/Modules/MSolver/A2AVectors.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSolver/A2AVectors.hpp +Source file: Hadrons/Modules/MSolver/A2AVectors.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc index 3dc441ad..fa73e5b6 100644 --- a/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc +++ b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc +Source file: Hadrons/Modules/MSolver/LocalCoherenceLanczos.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp index 1179b6e4..4d942e45 100644 --- a/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +++ b/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp +Source file: Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSolver/RBPrecCG.cc b/Hadrons/Modules/MSolver/RBPrecCG.cc index e0f3487c..6d26532b 100644 --- a/Hadrons/Modules/MSolver/RBPrecCG.cc +++ b/Hadrons/Modules/MSolver/RBPrecCG.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.cc +Source file: Hadrons/Modules/MSolver/RBPrecCG.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSolver/RBPrecCG.hpp b/Hadrons/Modules/MSolver/RBPrecCG.hpp index e4c6529f..10f976d0 100644 --- a/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +Source file: Hadrons/Modules/MSolver/RBPrecCG.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/Point.cc b/Hadrons/Modules/MSource/Point.cc index 20e0a324..43cea943 100644 --- a/Hadrons/Modules/MSource/Point.cc +++ b/Hadrons/Modules/MSource/Point.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/Point.cc +Source file: Hadrons/Modules/MSource/Point.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/Point.hpp b/Hadrons/Modules/MSource/Point.hpp index 21c67969..076a078d 100644 --- a/Hadrons/Modules/MSource/Point.hpp +++ b/Hadrons/Modules/MSource/Point.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/Point.hpp +Source file: Hadrons/Modules/MSource/Point.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/SeqConserved.cc b/Hadrons/Modules/MSource/SeqConserved.cc index a2eb64f3..1802993b 100644 --- a/Hadrons/Modules/MSource/SeqConserved.cc +++ b/Hadrons/Modules/MSource/SeqConserved.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/SeqConserved.cc +Source file: Hadrons/Modules/MSource/SeqConserved.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/SeqConserved.hpp b/Hadrons/Modules/MSource/SeqConserved.hpp index 7779e370..48a811d2 100644 --- a/Hadrons/Modules/MSource/SeqConserved.hpp +++ b/Hadrons/Modules/MSource/SeqConserved.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/SeqConserved.hpp +Source file: Hadrons/Modules/MSource/SeqConserved.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/SeqGamma.cc b/Hadrons/Modules/MSource/SeqGamma.cc index e566b762..64d31478 100644 --- a/Hadrons/Modules/MSource/SeqGamma.cc +++ b/Hadrons/Modules/MSource/SeqGamma.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/SeqGamma.cc +Source file: Hadrons/Modules/MSource/SeqGamma.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/SeqGamma.hpp b/Hadrons/Modules/MSource/SeqGamma.hpp index 58fcfa8d..59776e80 100644 --- a/Hadrons/Modules/MSource/SeqGamma.hpp +++ b/Hadrons/Modules/MSource/SeqGamma.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/SeqGamma.hpp +Source file: Hadrons/Modules/MSource/SeqGamma.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/Wall.cc b/Hadrons/Modules/MSource/Wall.cc index c3c0a3f0..dbc46293 100644 --- a/Hadrons/Modules/MSource/Wall.cc +++ b/Hadrons/Modules/MSource/Wall.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/Wall.cc +Source file: Hadrons/Modules/MSource/Wall.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/Wall.hpp b/Hadrons/Modules/MSource/Wall.hpp index 968fda87..c4b99448 100644 --- a/Hadrons/Modules/MSource/Wall.hpp +++ b/Hadrons/Modules/MSource/Wall.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/Wall.hpp +Source file: Hadrons/Modules/MSource/Wall.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/Z2.cc b/Hadrons/Modules/MSource/Z2.cc index 6ed27400..2fc95532 100644 --- a/Hadrons/Modules/MSource/Z2.cc +++ b/Hadrons/Modules/MSource/Z2.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/Z2.cc +Source file: Hadrons/Modules/MSource/Z2.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MSource/Z2.hpp b/Hadrons/Modules/MSource/Z2.hpp index 77714941..f2ca50be 100644 --- a/Hadrons/Modules/MSource/Z2.hpp +++ b/Hadrons/Modules/MSource/Z2.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MSource/Z2.hpp +Source file: Hadrons/Modules/MSource/Z2.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MUtilities/RandomVectors.cc b/Hadrons/Modules/MUtilities/RandomVectors.cc index 89aea0ee..eb3b9cad 100644 --- a/Hadrons/Modules/MUtilities/RandomVectors.cc +++ b/Hadrons/Modules/MUtilities/RandomVectors.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MUtilities/RandomVectors.cc +Source file: Hadrons/Modules/MUtilities/RandomVectors.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MUtilities/RandomVectors.hpp b/Hadrons/Modules/MUtilities/RandomVectors.hpp index 5da18dc3..570198d4 100644 --- a/Hadrons/Modules/MUtilities/RandomVectors.hpp +++ b/Hadrons/Modules/MUtilities/RandomVectors.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MUtilities/RandomVectors.hpp +Source file: Hadrons/Modules/MUtilities/RandomVectors.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MUtilities/TestSeqConserved.cc b/Hadrons/Modules/MUtilities/TestSeqConserved.cc index 0ccdeac9..e15eea2a 100644 --- a/Hadrons/Modules/MUtilities/TestSeqConserved.cc +++ b/Hadrons/Modules/MUtilities/TestSeqConserved.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MUtilities/TestSeqConserved.cc +Source file: Hadrons/Modules/MUtilities/TestSeqConserved.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MUtilities/TestSeqConserved.hpp b/Hadrons/Modules/MUtilities/TestSeqConserved.hpp index db16a69c..c1c84105 100644 --- a/Hadrons/Modules/MUtilities/TestSeqConserved.hpp +++ b/Hadrons/Modules/MUtilities/TestSeqConserved.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp +Source file: Hadrons/Modules/MUtilities/TestSeqConserved.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MUtilities/TestSeqGamma.cc b/Hadrons/Modules/MUtilities/TestSeqGamma.cc index 70f39ddd..db9c824d 100644 --- a/Hadrons/Modules/MUtilities/TestSeqGamma.cc +++ b/Hadrons/Modules/MUtilities/TestSeqGamma.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MUtilities/TestSeqGamma.cc +Source file: Hadrons/Modules/MUtilities/TestSeqGamma.cc Copyright (C) 2015-2018 diff --git a/Hadrons/Modules/MUtilities/TestSeqGamma.hpp b/Hadrons/Modules/MUtilities/TestSeqGamma.hpp index 33761f03..728dda05 100644 --- a/Hadrons/Modules/MUtilities/TestSeqGamma.hpp +++ b/Hadrons/Modules/MUtilities/TestSeqGamma.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp +Source file: Hadrons/Modules/MUtilities/TestSeqGamma.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/Solver.hpp b/Hadrons/Solver.hpp index 479516de..adba9665 100644 --- a/Hadrons/Solver.hpp +++ b/Hadrons/Solver.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/Solver.hpp +Source file: Hadrons/Solver.hpp Copyright (C) 2015-2018 diff --git a/Hadrons/VirtualMachine.cc b/Hadrons/VirtualMachine.cc index ed36cec2..48c2cbf6 100644 --- a/Hadrons/VirtualMachine.cc +++ b/Hadrons/VirtualMachine.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/VirtualMachine.cc +Source file: Hadrons/VirtualMachine.cc Copyright (C) 2015-2018 diff --git a/Hadrons/VirtualMachine.hpp b/Hadrons/VirtualMachine.hpp index aac7e8c4..9d0357f5 100644 --- a/Hadrons/VirtualMachine.hpp +++ b/Hadrons/VirtualMachine.hpp @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: extras/Hadrons/VirtualMachine.hpp +Source file: Hadrons/VirtualMachine.hpp Copyright (C) 2015-2018 From 6f09df0dafd25f3e7c5e0a853f24ca26fd3af72d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sun, 2 Sep 2018 01:46:22 +0100 Subject: [PATCH 478/620] Hadrons: A2A matrix IO fix --- Hadrons/A2AMatrix.hpp | 6 +++--- Hadrons/Modules/MContraction/A2AMesonField.hpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Hadrons/A2AMatrix.hpp b/Hadrons/A2AMatrix.hpp index b219df59..cf7dc0fa 100644 --- a/Hadrons/A2AMatrix.hpp +++ b/Hadrons/A2AMatrix.hpp @@ -80,10 +80,10 @@ void A2AMatrixIo::initFile(const MetadataType &d) } // create the dataset - Hdf5Writer writer(filename_); + Hdf5Reader reader(filename_); - push(writer, dataname_); - auto &group = writer.getGroup(); + push(reader, dataname_); + auto &group = reader.getGroup(); plist.setChunk(chunk.size(), chunk.data()); dataset = group.createDataSet("data", Hdf5Type::type(), dataspace, plist); #else diff --git a/Hadrons/Modules/MContraction/A2AMesonField.hpp b/Hadrons/Modules/MContraction/A2AMesonField.hpp index 34703e78..0b641383 100644 --- a/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -102,7 +102,7 @@ private: // IO std::string ioname(unsigned int m, unsigned int g) const; std::string filename(unsigned int m, unsigned int g) const; - void saveBlock(MF_IO_TYPE *data, IoHelper &h, unsigned int i, unsigned int j); + void saveBlock(const MF_IO_TYPE *data, IoHelper &h, unsigned int i, unsigned int j); private: bool hasPhase_{false}; std::string momphName_; @@ -416,7 +416,7 @@ std::string TA2AMesonField::filename(unsigned int m, unsigned int g) cons } template -void TA2AMesonField::saveBlock(MF_IO_TYPE *data, IoHelper &h, +void TA2AMesonField::saveBlock(const MF_IO_TYPE *data, IoHelper &h, unsigned int i, unsigned int j) { if ((i == 0) and (j == 0)) From f0e341d726f0aca850ef356dc5a035129a70b9c8 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 4 Sep 2018 18:22:04 +0100 Subject: [PATCH 479/620] Hadrons: module list generator fix --- Hadrons/make_module_list.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hadrons/make_module_list.sh b/Hadrons/make_module_list.sh index ddc56ff6..750f4046 100755 --- a/Hadrons/make_module_list.sh +++ b/Hadrons/make_module_list.sh @@ -8,5 +8,5 @@ find Modules -name '*.hpp' -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> modules echo '' >> modules.inc rm -f Modules.hpp for f in `find Modules -name '*.hpp'`; do - echo "#include " >> Modules.hpp + echo "#include " >> Modules.hpp done From a09f9bb528c7af14a85946a6a62610fec3a77bff Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 4 Sep 2018 18:22:21 +0100 Subject: [PATCH 480/620] Hadrons: code cleaning --- Hadrons/Modules/MContraction/A2AMesonField.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Hadrons/Modules/MContraction/A2AMesonField.hpp b/Hadrons/Modules/MContraction/A2AMesonField.hpp index 0b641383..0f93a5b9 100644 --- a/Hadrons/Modules/MContraction/A2AMesonField.hpp +++ b/Hadrons/Modules/MContraction/A2AMesonField.hpp @@ -52,7 +52,7 @@ BEGIN_MODULE_NAMESPACE(MContraction) class A2AMesonFieldPar: Serializable { - public: +public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldPar, int, cacheBlock, int, block, @@ -65,7 +65,7 @@ class A2AMesonFieldPar: Serializable class A2AMesonFieldMetadata: Serializable { - public: +public: GRID_SERIALIZABLE_CLASS_MEMBERS(A2AMesonFieldMetadata, std::vector, momentum, Gamma::Algebra, gamma); From 2e69e03f6fb49b3e586fce37b6fcb90a4c5e8e6d Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 4 Sep 2018 18:23:28 +0100 Subject: [PATCH 481/620] Hadrons: CosmHol configs IO module --- Hadrons/Modules.hpp | 35 +------- Hadrons/Modules/MIO/LoadCosmHol.cc | 11 +++ Hadrons/Modules/MIO/LoadCosmHol.hpp | 119 ++++++++++++++++++++++++++++ Hadrons/modules.inc | 4 +- 4 files changed, 134 insertions(+), 35 deletions(-) create mode 100644 Hadrons/Modules/MIO/LoadCosmHol.cc create mode 100644 Hadrons/Modules/MIO/LoadCosmHol.hpp diff --git a/Hadrons/Modules.hpp b/Hadrons/Modules.hpp index ec23f3c7..c6459b19 100644 --- a/Hadrons/Modules.hpp +++ b/Hadrons/Modules.hpp @@ -1,37 +1,3 @@ -/************************************************************************************* - -Grid physics library, www.github.com/paboyle/Grid - -Source file: Hadrons/Modules.hpp - -Copyright (C) 2015-2018 - -Author: Antonin Portelli -Author: Guido Cossu -Author: James Harrison -Author: Lanny91 -Author: Peter Boyle -Author: Vera Guelpers -Author: fionnoh -Author: pretidav - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -See the full license in the file "LICENSE" in the top level distribution directory -*************************************************************************************/ -/* END LEGAL */ #include #include #include @@ -92,5 +58,6 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include diff --git a/Hadrons/Modules/MIO/LoadCosmHol.cc b/Hadrons/Modules/MIO/LoadCosmHol.cc new file mode 100644 index 00000000..f2e7486a --- /dev/null +++ b/Hadrons/Modules/MIO/LoadCosmHol.cc @@ -0,0 +1,11 @@ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MIO; + +template class Grid::Hadrons::MIO::TLoadCosmHol>; +template class Grid::Hadrons::MIO::TLoadCosmHol>; +template class Grid::Hadrons::MIO::TLoadCosmHol>; +template class Grid::Hadrons::MIO::TLoadCosmHol>; +template class Grid::Hadrons::MIO::TLoadCosmHol>; diff --git a/Hadrons/Modules/MIO/LoadCosmHol.hpp b/Hadrons/Modules/MIO/LoadCosmHol.hpp new file mode 100644 index 00000000..8e89e278 --- /dev/null +++ b/Hadrons/Modules/MIO/LoadCosmHol.hpp @@ -0,0 +1,119 @@ +#ifndef Hadrons_MIO_LoadCosmHol_hpp_ +#define Hadrons_MIO_LoadCosmHol_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Load scalar SU(N) configurations * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MIO) + +class LoadCosmHolPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(LoadCosmHolPar, + std::string, file); +}; + +class ScalarActionParameters: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(ScalarActionParameters, + double, mass_squared, + double, lambda, + double, g); +}; + +template +class TLoadCosmHol: public Module +{ +public: + typedef typename SImpl::Field Field; +public: + // constructor + TLoadCosmHol(const std::string name); + // destructor + virtual ~TLoadCosmHol(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(LoadCosmHolSU2, TLoadCosmHol>, MIO); +MODULE_REGISTER_TMP(LoadCosmHolSU3, TLoadCosmHol>, MIO); +MODULE_REGISTER_TMP(LoadCosmHolSU4, TLoadCosmHol>, MIO); +MODULE_REGISTER_TMP(LoadCosmHolSU5, TLoadCosmHol>, MIO); +MODULE_REGISTER_TMP(LoadCosmHolSU6, TLoadCosmHol>, MIO); + +/****************************************************************************** + * TLoadCosmHol implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TLoadCosmHol::TLoadCosmHol(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TLoadCosmHol::getInput(void) +{ + std::vector in; + + return in; +} + +template +std::vector TLoadCosmHol::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TLoadCosmHol::setup(void) +{ + envCreateLat(Field, getName()); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TLoadCosmHol::execute(void) +{ + ScalarActionParameters md; + std::string filename = par().file + "." + + std::to_string(vm().getTrajectory()); + ScidacReader reader; + const unsigned int N = SImpl::Group::Dimension; + auto &phi = envGet(Field, getName()); + + LOG(Message) << "Loading CosmHol configuration from file '" << filename + << "'" << std::endl; + reader.open(filename); + reader.readScidacFieldRecord(phi, md); + reader.close(); + LOG(Message) << "tr(phi^2) = " + << -TensorRemove(sum(trace(phi*phi))).real()/env().getVolume() + << std::endl; + LOG(Message) << "Configuration parameters:" << std::endl; + LOG(Message) << " N = " << N << std::endl; + LOG(Message) << " m^2 = " << md.mass_squared << std::endl; + LOG(Message) << "lambda = " << md.lambda << std::endl; + LOG(Message) << " g = " << md.g << std::endl; +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MIO_LoadCosmHol_hpp_ diff --git a/Hadrons/modules.inc b/Hadrons/modules.inc index eef12b0d..2e7066e5 100644 --- a/Hadrons/modules.inc +++ b/Hadrons/modules.inc @@ -56,7 +56,8 @@ modules_cc =\ Modules/MIO/LoadEigenPack.cc \ Modules/MIO/LoadBinary.cc \ Modules/MIO/LoadNersc.cc \ - Modules/MIO/LoadCoarseEigenPack.cc + Modules/MIO/LoadCoarseEigenPack.cc \ + Modules/MIO/LoadCosmHol.cc modules_hpp =\ Modules/MContraction/Baryon.hpp \ @@ -119,6 +120,7 @@ modules_hpp =\ Modules/MScalarSUN/TrKinetic.hpp \ Modules/MIO/LoadEigenPack.hpp \ Modules/MIO/LoadNersc.hpp \ + Modules/MIO/LoadCosmHol.hpp \ Modules/MIO/LoadCoarseEigenPack.hpp \ Modules/MIO/LoadBinary.hpp From 3a40e4fc69f2858e368e47799e0e6e6e007b474b Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 4 Sep 2018 18:24:07 +0100 Subject: [PATCH 482/620] Hadrons: scalar SU(N) 2-pt guard against negative momenta components --- Hadrons/Modules/MScalarSUN/TwoPoint.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Hadrons/Modules/MScalarSUN/TwoPoint.hpp b/Hadrons/Modules/MScalarSUN/TwoPoint.hpp index 48409c84..5cb7e867 100644 --- a/Hadrons/Modules/MScalarSUN/TwoPoint.hpp +++ b/Hadrons/Modules/MScalarSUN/TwoPoint.hpp @@ -141,6 +141,10 @@ void TTwoPoint::setup(void) HADRONS_ERROR(Size, "momentum number of components different from " + std::to_string(nd-1)); } + for (unsigned int j = 0; j < nd - 1; ++j) + { + mom_[i][j] = (mom_[i][j] + env().getDim(j)) % env().getDim(j); + } } envTmpLat(ComplexField, "ftBuf"); } From 2bf3be5faeeb940c97b0e9d2521a0d2cacb03563 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 4 Sep 2018 18:25:10 +0100 Subject: [PATCH 483/620] Hadrons: copyright and code cleaning --- Hadrons/A2AMatrix.hpp | 2 +- Hadrons/Modules.hpp | 27 +++++++++++++++++++++++++++ Hadrons/Modules/MIO/LoadCosmHol.cc | 27 +++++++++++++++++++++++++++ Hadrons/Modules/MIO/LoadCosmHol.hpp | 27 +++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) diff --git a/Hadrons/A2AMatrix.hpp b/Hadrons/A2AMatrix.hpp index cf7dc0fa..bcae395a 100644 --- a/Hadrons/A2AMatrix.hpp +++ b/Hadrons/A2AMatrix.hpp @@ -121,4 +121,4 @@ void A2AMatrixIo::saveBlock(const T *data, END_HADRONS_NAMESPACE -#endif // A2A_Matrix_hpp_ \ No newline at end of file +#endif // A2A_Matrix_hpp_ diff --git a/Hadrons/Modules.hpp b/Hadrons/Modules.hpp index c6459b19..c76de4ae 100644 --- a/Hadrons/Modules.hpp +++ b/Hadrons/Modules.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include #include #include diff --git a/Hadrons/Modules/MIO/LoadCosmHol.cc b/Hadrons/Modules/MIO/LoadCosmHol.cc index f2e7486a..9214165f 100644 --- a/Hadrons/Modules/MIO/LoadCosmHol.cc +++ b/Hadrons/Modules/MIO/LoadCosmHol.cc @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MIO/LoadCosmHol.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace Grid; diff --git a/Hadrons/Modules/MIO/LoadCosmHol.hpp b/Hadrons/Modules/MIO/LoadCosmHol.hpp index 8e89e278..cd940309 100644 --- a/Hadrons/Modules/MIO/LoadCosmHol.hpp +++ b/Hadrons/Modules/MIO/LoadCosmHol.hpp @@ -1,3 +1,30 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MIO/LoadCosmHol.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #ifndef Hadrons_MIO_LoadCosmHol_hpp_ #define Hadrons_MIO_LoadCosmHol_hpp_ From c7c90723136c075cc530930497af17f5f34cc2c4 Mon Sep 17 00:00:00 2001 From: paboyle Date: Thu, 6 Sep 2018 16:01:42 +0100 Subject: [PATCH 484/620] Documentation --- documentation/Makefile | 20 + documentation/_build/latex/Grid.pdf | Bin 0 -> 492015 bytes documentation/conf.py | 169 ++ documentation/logo.png | Bin 0 -> 220878 bytes documentation/manual.rst | 2388 +++++++++++++++++++++++++++ 5 files changed, 2577 insertions(+) create mode 100644 documentation/Makefile create mode 100644 documentation/_build/latex/Grid.pdf create mode 100644 documentation/conf.py create mode 100755 documentation/logo.png create mode 100644 documentation/manual.rst diff --git a/documentation/Makefile b/documentation/Makefile new file mode 100644 index 00000000..1c9c886f --- /dev/null +++ b/documentation/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = Grid +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/documentation/_build/latex/Grid.pdf b/documentation/_build/latex/Grid.pdf new file mode 100644 index 0000000000000000000000000000000000000000..03c37bd9c4052bca5915ecb869077bbb22d393cd GIT binary patch literal 492015 zcmeFYWmH_*+BMoq2m}bhAvg&ZAh>&iJHerFcXtX2?h>S+aCg_>!CeaqcXxNY)#vo- z^S<3@-0%FjCQ?RH8+~&m zUS1>yX(MYBM^jQxRutGc4b&%NrF?NbeiPVpBftSdzV9L7`Tg(+cRt&DlMd9h&5m0kVjPTU4| zJ5S-{5J;QGoWCl!##pqtT$6n?GF`}dXyAkA;80%Hd{@RJz&+jQyuim-u$^fGJu0yt zRIc5-+UAkdb{f9Vbt2n;&gp15Y?4E|E0~YC=bKFof!C`RXuFTFkao*p7aiYX;7Gah zyv`VEfzBa-v^1^|#CcyUnq}u1tS`1&AnfL9k8?3*nqLpAt6VG-K9q=Sd#8*XRqQ!? zGNu>rhAs1^2BA*a<4UIoLQ(FIhRY*#${2drn}jTK{kjEft+$JB+=%ND^7B+5r*F2_ zca+2}Iv^kd!4(*!z0ZG%BA8obnN7Ker&Ke0Cq(-M|pOKy77<&kwmYNs}r+Cly zo{fdK=X3VXC&D1pCrbqIw2NR8yMGuSW8Rn^_%|_sTIn2g#=EDUgVX~2q76vJNmUiHY|U|HBAjRkXN-hk#}{~gI;iqhcn3yxZw~RZPcDZ-7VjD?teCXYo*@x zGfpvEQPOxBl`fgdECh}lPKeS7(SUVCp{J{V=6&#B7deJ7B^dARAX3kJN?N?m<`RAB z%l`M6>w5j>J?}}k+x0Jo-74Ncq#$Gm(ZX6g{p#L=4G(BPo>DIJyG$MtPu0C8FV($6 z)$O6_`XJav*H89PlJ=dHOEIO`OM;=~!FF9yS_Hq@QbOsspAm!zx!zw?tqBkt(mrLE zV?SpOhdy_qKQm=xKQkr3nvl@vldjO`#OcsyC7p*LFWM&|lMheXHXok+bb_B(aMuJb zu+{`NVGrRxhcG;03al6VSKLIYBb|~|!)|DY3qAy;zi!h6nV*FzedPYWZ0m{opd#mV zf;(_JSdV06ZTLr4!OniqNS6PRnM!W9Mx+dK`sRv`R!9u8q)d#AzvrgCgCi*?3)7#O z%f!aY_1|Xhu)2EGJUg1#b@__H%Nq4lN*~fMky~FJ*pk!w!VCrp$o8}AICh`zy&Q|i zBZd3VC^a_PtA-3Bj|tud)nEkJ3gUJkt8;qzPkt4rR{F(2R@22m8!jS-M)~POcEvbi zuD_ynPR&VTPRa?qj<&Eex!pL;PyjFTF8uO`H&!2Jz8EX4j1vba!FPO6auZ<2FRH(9Z;=NriNk^vIFvr1jdq*n~!F^R9gR?X7)y)vgFqHYT2K zXQHs!T4&ef>+ljuE%b~RW{4``$kycTVW%&CWzLhM`BX46$-i}$mL~j8f~l7d_qFcZ zZuiR#VS>g|xJc&qB2wuNlH$+geiX%QjbAWlUgobL9_ix*S5eNswJo_Ud>uoy5dXd3 zJzblW3oFqG(+=JsqX*tb6vJaSvGGgdqQ;vZOKI)z%&OvvFEZ)%$i5~?)rnVZy{-6> zF$~6HSs9)+L=AR;7X5&87@^SmHO?g+{~gx8I}Ts^|-_cA^Qtq;>U* z#5a<1MHFII(1jIKI)raTWT3Eb(!PwcxcM{q@CYO z$v1GpDHrAD{&~j=Ol*M9k>5T)PbV{PUzJ=Aaxs*hKHfe3z^Af%TE-}H_av<_x+{OF zb#NKoQ{*NVv&EXRSFGhK$36|!xtcARV;9KU<#8`&Ep6Cga>=yhQp|41esK?GN#dV% zxtJ}OXXoFKY1%MWc9u4qq_W-#Z3cYn#cinPF`)6AB}i(fEF@qq7hOFll1B|bs*ao~ zV%>WOQo)jzIvP(*dHNvN3p&?u;M`IvHx;EYkfwta4KZ}NgKIG$Drcl(!cr0vN%Vc) z=D)&&Y^PE*94vo4O268|nj|sh9aI}-`7v232?dW?s{P#Y>+_OBhc;8FnsbKI+l7wHZQw|oLfuF(DyD=IbjmNqmWx|;)`N}msn;{~6CH@)B&?gX+`ox{i`OD(Sv`F%bby~&* z=Rr`OyGGkf;q-g3rH3SBUUF~1B}U-4A!adJ(7?Xm7kYHIiX9_*LOaddAGT&)pM-#& z#kq7`N_F<_^$uiL4V7E>-Chpv-ShZD@6j*YZASKQ7TY^o24>6FZ^k~+?9;R|>q zVy8fK)U2IjFXe8;%5LYZe5b@|+9OtLyhmf1i?|^)L)s}PUdv|d*>R_+v=7@%?$+Ks zx{k<};{r@jGZM19D&wUrapfPVebTkms!j)t#ER$~cVaG$OJ#ea2+Gk3-s_vbT3o`QQ+pzBg-Q9A;pxZihmtz}8uKaD(z(-0^)yYT1`&|V%N9ZAErBg+ z3npH@;)NvOupAjK?-%1<8nTrpg`20=UA<9ZhzV&Mbft)ckniMsp^Ii6f(krA8 z7=~d`to~XqFHZh7WR5C4wOQ3vd}w^KZomWBnre?6D#l8$D=m{T78@V+JVb%Fi`QbP zJ6I|mwpuE$vsue7tSUY1Vg&T=SM6x0xM~@1TUZ09o<(SZGz0l?Ze6w}-cjs4Y%$*s zLXQqq(sFFYImu0L6RhU4XqNrm;}y6+QlA$zW(+_HmRUmV((l#c+#KYn-iaSk)17_X zKSKAc4yz6up4XV49c<)P(S9F#ny+Emv?V&#?7A)!JD>MSPJd_5?(_;UZ4$O1=pGi( zcQ{V8&f9X#pc0;rLyX*{VHJ?4X7^e>e!gzWq;58WYCk}MUif_u@+jz5z=CDTj?*h% zG9U_^96+}9OX?$tMa*=);_9n7NOL)R%wBpQ{@MGNKQ$k+Uz$?!PXY|6>Msa4}#QlF8kV(Ok{kWEA*5OwCSIWvq) zV>7nFrJZU|jEVFovM$WQX=Ax5D&D9b&{FULL&ak&;63FJ{Laj~>qGBqx8~a)cfT`v z5b!%7My#@+um%EavJh>p?LrM7<127`N-NcG-&{<>T_952pL{T>wl0{B+c z*$SV7g*AW`J25D$ChBWxF@DpI80ONm0qI=Mk`68>JL-R$n*TwvaBwjG_fu1O&^ntD zYw;XAO(b{ZV??DJxiVHidq#g2D%+H49W^IW4*bWM&v)1B1_+v})xRw|EHlu<^h!O; z_=Syo&+#X>@%$&|N%uTr=iZ&Iyq*2QuP)nSr38!N6A(T(;yd@^(G3-=P?_m8Z~RRe zRc}pvKJ!N%iM{K(bDCfwYn{vV*-qmtWTf)L+s-$X#7uB*GibCAr9q1GF4yF(*>QNH zvus5Iq}__FZGj)onNC^{lUDJ=nm^cMu}sul-i97D@h1ZGnjd*nFZCdY_olTU&vD6M zf<-QQaMbjPmDSy}$;JM@g2@)hMJ&K77|RMMm&m^E2`k*Ta~U(_-xN44?{8Y*yT3dy z2YqG{ML<#5GCH=2#<{5iOe+N)-t90RxR+D)ys*n8QmHR)(72 zV&frZNX`D5P(d~eQNzx`&IuGm=uvRs2WdYqqD<2_WJzrZ8APE6GDju+S}elzu4nk} zz#!&PSCJiG5Kl*Bb?KiQAF zcnv}++{mb>vx(Ev*2_+;yXbFHitH29_>7&CTM0&eJj#)Qo&ZjKFU4dMlRlnOLKGeF zB|-0sNg1wl)43UsluyIffI-&~vPsb5P^k?dV`q92r!=E4rNfJVJ9Ha(`!=tr8Oe zq*Hd)H(X_U7-Vi{pYX=TdYVjF%1WnscMb3i3F4w99ucH~q#RsUOutOPGVyMlzBGD2 zL|y+34+Pmo&&$fSMHzVe$9o=ln>>WP;8PwKAfXx5`%fvw{CBj6Nerg{R!dl^$k@zt zVm05Znxej#5Hj}?kJEe)FW&#s-c)h2UB5iC%Mhij>cf1{!~IlqWoOomUj+K)%~JCR zuE|9m0S?qwf#xoRdu5}xwOw1hrkiix%fu!wF2k8k2kW*^=msSB^Yf7UgKgIx_S2Nb z>8RoL3LbB;FGH1~!?07cgY};TOI7zFqZiE$gi*)nwJdBJrB(c`vSxW{ zUY6HP$@w_^I-0w&p7>r*oIOK*)s&S-W4#c&`EEO&=I&XALghNk`KizE9!ZYhnlv|S z3pwxw;CS6x&}gt;W@!(Da=~eva`4ku(Mt6a+zi(0jo$U^wP{Rq(hk@dG}w~5WIxd@ zUlX9FAX^(X|60hxIp9=%l`v%HL)#wq()H`XcfQIYlrC&rndaZD69s-N2P^6W^t(*Y zMhSH3W_rOZ_~~Ijd%5#y=8J|0=>VLk$wA=M=Gk*gYK7{`P9&b?7b-d z^ty86x+_KiP0B;&^DV)af1vTB##8ar*aDKb(GQ5ibKw-CqIZC+)Fbv?ZAaUi0;2|R z-;E!S2Boma59Oy7yk9?o?r6dLMs02-VYyF8`=;)=#;LjEQ!VHbCY48?+ z=zJf_$omDdw(Jq&+tiJEB(78nQMv@o!3E#1ROv%@i)eoy^hr5jxFp4w+A15XS@ zOwgBs=meDoEbj4!PKe-IK|~Q(_*@h&6+cm1dbSO!^>~ zhZky?)J_3;Ys5VK4R#2FwWuI(KY)!3V$A|6!NzK^mKF0bfC5tD#5_Dl4k@t$gmXV@ zk~eH`06I5Anx4)hkLcGqwU*Dml5#K|tt_GmwBbbtks0^P@v~c#Fu1y#n>@dG?L?aV zpOE8!x)gu#L?%Y&KZxRg;U9veY~~r?_8vcBEoFXj>C>00!bTN&(T|!D#8-jSSyou; z`~siHHb$uJQF?;8R6hvr0qhTyYH8;Z3tA8qUp@8|{|c z8h7X=j@Fy<8lp6pJx_8QvbaVW4woM}qf(*EY?p?zDHynEukDTbq}B$ilhpdUTt|Wv zPPtC2S}C=m%d770csghd`vmXH_l;U9w6_v|Nl^SM8!L0Du&4+#22Z2iyY12(W4Xq2 zROt$oq)J|q(Uu|G_c(nWX`t^*+V^caB>YF88>`24TVVfC0dDFyn@`E1!;Kp)ckQ>h&ukl zU^EJsxRmp2X9@NVYT7EP3X3X~8I)PH{G|1uhR`*R6JpxXw(qbr2K)-_X?Y_}v4GQL z^7Q*JX2u0R9lZVpEp57@ZJDPb*BZtb30;NPszW>FApzGMLo1_Y4@Y`|rtAVTa*+GLB{e zTmJ3i^+84B3j^9vxt*l)-av@Gq~SiJoN|?m@^J+-^9mo&yj(u>D(Um2 zc5Kj`g=0aBF|K(zwcsHe<)pS^z?{Y2H=s=CoCRiCp^VUB?Z-)NTG)YRQac%T@BACE z^j+=rk>FviNI?tKf6l_Hpr!6@?X*hf)g1Sv_WVhGt@O=2ATRR@^l@@YA#hHkXp;|Y zZGIl{_Q=wfd6`t!+(Ml z_P>)67Un;=2o_X1zbOb5?B>7xkM7p8&K2HU>2y;bfNu-6a8rCBdmPC zpWOBR8;?ul`T02{-^8DYbcpO>+by^t{SBO`?*}Yy2|W$5eH6j*edI5znn>x{#qjZS zUPr4GfXDtM>VNM}d%v;0PC9@A|*u0>gD)6$i(`=2K#%-WY zmB>Y+mXBdpfFeFdDw3FW2Dh+a)}*!LLdkl3EKRepgEG}9Tl>&;MX`mo2V$g648wt; zyKE`Evw=SgPRvq-_zTZ|OhY3L;#bd;4j~5?I%kQ|i?8jLlmk%r{RC1Qt38%$S__kG z)$9X?P^tUo?Ayxe^Nx?=f-d8E4Bb-C`Q4_if=;zjh+fNL$XakYAAA$fC8d<|9fO}p zI3wH8bsqtVJ0IL!w_T<_|Avej%<`Wi!umfV@=q&T4dz7~88{*_C_3po{==M>u+lRz zLSj%gGlVT6aWS(ZF^C(PnV34lylM_EBnCkyA)-c~1i9yK5(#BrV zR?h(DZ3`PYn;94>hzb5_W-~J~Gc$7jPC@_AF+WH}a3xTN267-8=}{vO%4z88`Q#$J zl=w8*(V+m!r8C;ir0~It`PuEfb|H%qy99K>=xvdz`h2|vJO){*gQk*GpCt`w4I;<~ z&Ff;1fm{9A;U-554G!BQJSHQ2+iN0kd`bWR*Z((0Af8o-=uDAqS-p*~a4MeK>MndKEYOs55mLKP;_Uxx;F!1|Ngvc~6;Oi0e zY7^!akuE;lv$5@y`Pn4o)#%d!AA`dE?cj)&nmqn4zF&k)GiG}E0jW67fPb9m{`33> z5~-dSAaH0)0QXcwzi)Grf9NN0_>Ik9;4nC9Ll*!<@)sy&amW3CdUga5PVxVvTde9N z`OdEfgB+C3ufY9mHX1vq*_SG5zMJP&TdYJ&Dk{!ft55)%%{<5}@ zL)QWLtt+}6Y6|ZK*MoE2mLR8Lv;B(N-W``d8E0uBsvRn+m;iqd8l>@i0^x|65J(pl z@{Y@Y?xe_+kA}0NwB%rj-WWiOYA67?($cd-Ejf02X9D==9Ju_lDG7_H{N#u=VxAKQ z1n~UU{-;&%7I0YJ1!N#`fMhZ!ukRBiP^#Ew{VN?>r{XJ6YSkTy=nXKAw=^|}B}516 z=}A6OSSteTeRk>fzoIf%*;g~E6LA9ncbp^|mX^{H@-nRj?6pn47uQ)&3VQQr#)#2D zxKBbazRD6*pn?qpNZD39Dhpx3z!iTk{p@WnqhZ$oE`9n$GIn1`(jDw+hps;`V8*OB zgHD9}$8_zRkFjC(X(2jw3>`KuGvmQE8xMP+cRwUcKk!;?+QRYB!CnV76_Ac}=MomW z!fe`N38Ki>aHS9I9KoB}^P04SBD0z+6-ahpP2NL4927>ufLo&^o4!&AASb0UnY1+L zOx;xB**^Y|->g-K|?`DYs9UC&pb=)g1kJjpTDxaG&sGI%E3Tf-B4Ca-62Y?jQzl(>dbjb=I_aI z7%et!4lESOK2$EMeXw>@uQpY6yrm*=lWPokTrGxNk0K@QVP3AnA8kK{$o&jh<~=+p zT}}h`kWH+MU)@dy?y*-YWy)K)qinwK7WwV(1vb?OLDb?+z#cEk4Tj3s{kq^Pye7z! zX1|xC_Kj4S0l(U)mIuwTsfUcMsDY_51awlxbkwsI0VBrtlPbw1^=G1E1mvlxAcYGO~2_cndU!_dH4$M&oG7QY@Q{ zrbDb^cb1%eZN=Yv{s#Kw+)cYp{7_)CqBhLGCzxw?8 zmwrRin2otxFSYjK*>_(CFDdsCTK6pAMjNQwSqpWq^!Y0xE&r6qHcPQ% ztXxWLT0Gz7V}>#~g5}ZtgJX(nE3+Y!fj;!nPIYc;Y+`2t)NyAm*c?Y&!bPQKTnQHs zG~By;X9f`2hD|ey{PSgXOo48my>YkIa(W}rS_(HQS9N=JASOzD#6W!}%HN1^0uuy( z_zh%F%On6pS*wY>CF@*R@NnT3xSY;_kC)@Xrp^D+)9#?e6R)?Swt-E{KDVcWVG)BT z=XSaxS1|VwgBCONmcTc(Z7GSjpEi_mjX?mxyT+%Uz2XyROJ$DyBuyNFCcZTH?4Lso zjhA6s6V$fH^*6`+v615m4IsCNkw*L~OC`3#uzi-Q{QkGRv@t~!G~Cy{%EJq>PgOdE zt3$sBy@h7!QT$3m+sfQcj7~=|LzQL4m~mmnGEk&+Jm9qjF7-f?lWZL>)gkZ_JibcK*Oz!@pExurDD+}!fus- zh_5`NmcEgj!)S>A9M?VbvO3Xom#?j0og$9tqdn<9V?K9lu+9_>PH;R;EvSD&7x3mE zU)XW|8>}qzeLrsBJOt{N0pEKLP-Uo1)9c~Zl)m}o;jPtCtvwD)C9-F)W~LwZsdUym zTP}k}chX2n?fvKng=v}iaPbs(;&lO+i!UVHsph9nuSec`8EW4sr6-cOnzi{`Sewj<(k>k~?FV0fR zY##mc*26=5c+Z+Wcl#-0u-uY8jdbRTaqv}5)}EEvsT9j&_c+ZD+OrogrB6a?AXPPQ z>>3z=5(~~f=^5!*OStvW?nUl?jT%Drc2It(`tEyju+<}52!MFwiz<%(`m0V%Ac5e2 zC5y)@QT{Yqju~jk{)nS;wHR5m-JG4S_5QNiX2|48!YlvGZ-Rgp;9dY$r%c5r5}Cur z^TB-^MA|25%UzmvPTJ(YlxZngjmejlW*hb}3OITYn!Q(7J{5TwctNERdldKAnmjk? zXSQoBZLSl)v`m_r*v4OQ6D!kvZ}NJXk7Z|6;I(JXkNPV?c}Ht0t)?8Q5~YF~f0~FZ zr=Inm9KPA;i?3O7eaWh{Z>22~T|Vs}dsU*2ptRVioWQ`6#5tEpu7IupR{_y2ByqLl zZ#_0hFpF3t_!cI9Z1%QlY(>gj@ad5HHC#}*7lY)aQ2YB&r`9AB3UC+vO^8oV_+ zN^VsILrw4MRMNA3CV4rt?PPSv>vPKxESR!;GJSY5i= zn5CEOoKoNa3btY(v-|gY{+p6ALE`e?${kV{-zzYCy37&Ka=~WFeUr`sEX0E^kw(a; zHm8sZHMO>0qKA`0@Rda~C)kk<3pZ1N2E_}J8_jL}tKHp|aN{t{J+>n^k&~t<&M0ke z2ug_rKrBX3-v5aw|LXEwBJ|D6!kfy#(IdeSnl{;=Jb7z=D2P!bsBO3N4&GqwhmNd7 zk^D1PiU%0O`e6ml(Sy8}wzySu^eb&Q)>xSF4A(e6Zw(jQ4q7~0Y)EcJOk5*k+x{Z@ z#h$25LsmD9#>dMX%F6#IPyYk%opTOqM7d0Ikz`t)SRP-f#E*tF%du1NAEI-0^V}`g zF1R67*NMdSZq~#4=l}M8XhRp@O4>q6;*6pFvg7Uuc{ieX6jyd0bT+Z}zM}?Kj&9v8 z&i2klOk(#PEE-`fpfQN9rS5N&di+<7D7&;DwL&h`IT#Dh6qk6=(@0{$Y8hea=5n?v zAHlPV>6EmXyI7J`(fpH(I`R)Ky7Ur7^$})P{5@%9jk3u%U6RgUla~vdrxU8JA81zY z7)Bm;=g*%Pf6WtROTE{7GpEa?=YN^->d&#JcWu>ym)?J=ZO;i4dA@woJR4|pCbfZ1 zQ-r@OZ)04R(s+cbbhDt1&eh0R>HS;)gf{Ne`M&?x-H3g^Q12P=Rh7Md|=O|7^tYF1v5!J-IBJzI2HyGDLe@Sc5 zi6=#-4}@mp8Kgw6tUkhHEM!taT%g%sL&h2UP95QQwOxurqC>dEXGx%X*!FjCXMBB% zEr{jT(8ccmMue17gJ$&|i?j8()tr)V81wJ$i3(9i5L>p+S*AVlPHM!+R~vuTz#|zk zy!)9rv1lDMC8y~S1W+U~E?^QYji=+g*QZ_9NjRx*&{KUpzBm+s~ z#vd@mw>)e(E@`mS6bR+s{kav&1`zNiyEQtotUA{-l=E?B&+hjeo*uxMx=6xsc$J_T zsm=2N3Fn_q%PZt9 zAGLnEEgK{{PoUES5rpC4bpHH$7|G2>t78ti8?5}Y!v?=ah?=Dr#0JNl1P0AgI?|U~ zBy?@nx)b)hP0*c{?SAF(@U+en+t_}R2)b-{J{gSr-;H$`Hnk*RWUY^lI%s1KQn2c-)I@hH4HAi$`!%Ws9WB4=l0w z1Oecb8=FpqfbssCtt4@BW%QCwtU4lHWgzjeCyWpvw=&5!iaeO0xE%QmEiz%l>I$V# zc&LH#Q7r9Wb06v>Ed|D;rc(1QgqsP)Zxmul_Tq}Z3^&dXyftTzCb=MTQB3( z5D%_bCnbxJn6;!6`@0gHV>G>H!f2*Z0=(2M+;pFwHE8?{Q1r|qNhT3}W98%J>#gZ! z;pTw4$zV<&21>0z|8&8}c!rdh&UyK9Y=UC2bhj}YdSYRF$}u0KqltB%;xZW)W>8>@ z220lNh($i;+6FUbm5I-P>oj??ym;Q!{V+yS>82EOFx)_uiN>nbU9 z0bakEZO0t2~u&p z(*__85qPhI(FUim>G)0q9{di>kJlS)%0pq?76#l~M5(b>(4)kGaLKR9-^wP$L@Frx zmrVDwRBv`7)U*>6gK7jq3k@vv zjE4EP74SVGw_9ps9PUwZkM6lPDsR!3kHr^>w02YIN-*sY9SIGv{M+r)3{XkD+YAGtW?NkJ~Xr#CgP|{^tpl2tYlZjf77O8Z&G9lJgRxGQAsm9v8Wr21! zkPz))J?7zo3E=KX)I!`rV#EBbDjLRl`c3CxD(x_GavMh!vxH*!zT2jsb`%>%-PoKZ zWs+KhfJuKTOsel73g0AuifvAe%+d zX>rTFBAfrb$cvn3bY#seST0^PPfXZ($AkT7cF1t zu(ty$+Oa|T>z6V^-p%F++vnyff0FxTy^N-Gc6c?JfYUAO80B%0P!Yv(0)@v(m9y$A z-TfFxp}3dF91(1gAOAEDZ(Y+?&v{Zfpc!Xg`YkK$B3X0JE>V&1_zP5nmJ4iq9s^5W?ogn4#F2%oK|X7-Bw8Z$=bGhen`*DX zI^ONf!%0FymuCaTZGA=6#lQ%N9{fYgCC9bDLuc37Am{?egjX3ng1AAH8OVS*VhV82 zTS;X*#pL_=yCdLh^VY4JG=fB@E59o0M?E5$DZ)Qpp*dQAGxR~^-@V=a(1=Z=vQsDF z9GyEdf{QD3g(7q8blD;e*U#6b@ds2m{>#q}eNtiS)$fdtBa3Bej!VpA-{jIXNERFM z+F2qeZA7bSUtG4-uw;$=_}(Z9DJJ?ZdiaZZ;oU)WAJ@<@ydCGJVeuGV|M`9s**Rbu zKB4)V_L%E<=iVDBt%`B)(FqY&;9+ugqovbStW%xG%+daoG(=51cr)Plw|}{!pljwQ z?(*l8#qsRV7UVk z)^0RrrGi=+EqjH-E~FRr&DB2}g5+3in0-8Q5Dxe@?X z_HW+6R1GSW>N8iWH*+O@bz^a>BBe@!m6YX+KULU2poT{!5&H7d%*>G{rdYA4(Ydm? zZ7%H&2IHOruOAN+DqNscH)(W8{Z_Q5duG_w-AJia`OpW1uR-fRmkEIqj&N^y$cs+a zBC*G(meXnO9!y&W>iJu%!cv0u7_5%b438}H*xY!=Dm8O=u?Hqmw9Yn)%GRkP93nT+ zN<23b#t=+iw^fF+-0QNtO&1(Rhr;LW;#p2o_CvQc2>wjzf6RGjB_=x0IxHU&-@@U= z(4oeob9FjeUrB*w&{c}u5ZO7Iwl=JW^B5Q?89B=H%zkN4e7$u5s%*{1R}N26N|4qf zi>6XSjxwrk3{YxrrP>}xp++r{aDV>RY9l-qasaJym)A;+zBHBt1E6wOLBu{V}>| z|0o?qLedsKai7SDYhxbD4&%D9>+j*QTIyoXcbZRtCh#z&duM5}XDutEpp1KKQ7>IO z3CuD_;3?$3U#h8cfk~G_whb4(unkAq`GsE-)K9ypC9-$xACE{pW~SY$Z7$dOe^TD+ zG*xdS#3O8-)6V6>7;!~HJDk;s^B!+rE$?Um_t)B`_$hG39c4u#_!y~-v>7?~tD zhy7lwfEMqpz#}EeNUipP-BHOYv7O-ufj;kJ&4J{#bSAQl4GwEhS39w?bcJo~CCSdd&|aM8f#l!xES)~y-g_ZY3N(*m!Ee@J)dx3S=%Kv9 zkk6AUb;4{FodV5qa%p0x7ydtJI&@BTBe z7UBLbAVmY$A$=kGZnLt34iSY*hVP{({j2PPH=Pk5R=zC1a%d+k2xyK+3$#I}MoMyb zb}-L7g!xH$PUq7mFt8KWmiBmwyah@d$Hjk6$ADer2+69NbQn0Vp)^61Kg_c@ee?)4m!xl<7u)(y*G*Y7gGl%BmLYj zq*I>Wsu0WSIqjg-5+OmUaki{|$O|}B&Tlt=6d{0K}bBSe37)6owFL>*e+`Fp%|Hhn6dj?YMJTf;b=P9VIkh2|2k58(;M0?9zC9 zji_>#u@w5*XH)bb9H$$HeUlVAH#3c`7Fx{mvo$nBqU|yrM}dp08LuRxUEHf&lsl_B z%a^~VKN~JL(VR}Ds5jica^IND=+j+NGEI~|BBS0AGW&PYzCIi#|X11lYU{Jr8bd$bv(}joec}gc2 z>LZ5pV2y*Sw}c}`vg1dlGCHRZZd0Mv4tt(5&^m` z{u;{LCdF>5DgYu2B;QDVU2mT}ulD=hT)VTX;Qh-&nikQYVOr-$@Jl*g?^<_@zXOfo z9vxnr?B1?T?$LWiDM%rsebsW`_v8IT5*==K)m-V!GIiC^uTTUz%tceobk?ZI(p8Ff zHk!Y)p{3=i4g*66Ua1FL>Z)zf&}AmTDv9E*%%GoS>q44j!4?b^p8?nco;uKSbnNy9 zD-k;VLIoia_MLqKXG7S(Nc+AEGn45_i!ZE+5EPNLy8aQ4vwTt%^=^}|n&~nM&a~xC zLQjMP!3MVl1>}ms(8Uw6?OK2NU@-N@Vy-vn99Kk%XxLPuXg4oLMr~cs;%H)Kq5QLp zY%IE8eA1H25Bimp(>PIB#L}%~JdN<~%|;8RRePQt8G#Ot6q|;$^5&DQ^{aYQz3?%F zKmJ^~eaDd+`pSx@ZqWidIbgJ4>bJOSZ#2g*R*>)^S!##ivWjtz=h#*#u-4`4f6)FF z+gSwa=mE@5+S#T+&C6tqpVyCsj+azaM|VsouiJha`B11kEn0n~fRtG{q!QVO45y+m zZb{416pH@*p?E!4cEFQxT6Rg!i9aoXKBQHDkzJyP7iz{p=bm@SkmHTAzZ4(xJd;*S zS;k)cbrNb|5T-th1>#`2Rn3m4T)%)K8k(>;Qr-n^2R=SkL)HbjPyIDE!XLr;3Iy}Q zjlB4{W=joo?W-MxQ}d~;IO=6o)pnxh|5&DX<_|xh9vd;P+3I2HXNN{djT_Tv;{$h) z;Whrbhr@Yt&J0|=LLn(5lmEH#r>BPI90 z?Z(|Ph}2EGn`eGkdDeKIw)6X3e~^r8cdYT_Vw7l><)tLM-JVdGqikKyZX)RL16{pr z6(k9$MnD+VWVAQIE@Ak=TdHKF|B5Y@*6FP}|CQVo;wRpig=p>hMRFxZ&k8ydq`-e| zMrq+qgsxihCV`#d5Rh&lb0-JyPp>&~?;#TrV0^wYcBD=D0FQc1H*cMR#>1v_?}x2} z$7-RrnKXCSLjE=h;hSihc3+nrTQJn;I`2nirOQeV&76@x)ixYR=4$k(5mSPoVn<3G z?Exou9zY*(=MIs!I1wEK&Q$d?kI2+(ZnlFD(w`u+6D(X-mv`ZfqQrfj!=+olh>fbe z@xed)osNGLW758+rH^ZF0ZDQ9MChb87|k_Yb5L4G6iOEDWodq^!4dj6BSf9O!SyktwX)>ezMk69$Nx21#|22;AAwqALNZ(~kT$=wlTS0?Ux zV^XAY)Lm>})8yL3DzxZrzXh!|dVN?tfR>kDv|@YAOr`JxRqjXuZfc*o7NPv*?hjuR zj{N0@aF&x??JlQr!;>l(;L2NTHyeO4A(3_!`ti}b&Rn_t9(8OBYw$<_6qE>F1>pVPm0L@%g#Ma3|WCJ8g#gP~heL%h@jH-!@y z14?r$KbXtan^UJxZpVGwN~IbAB(l)xwK{KlHG!%L+sSv{0B(qatEDbrpda*k+Rfpq z`Qxd#7_ygCfm{)~v$&E%E`1h*vYXJ`7XCQCSgu_TC<06yi0a!;sM|}See)ZEY;R?GIz2(wsvJ)e80V=bQon*W#cWj$85UAV zB(^tTu&i3x|8Wnl${(q{?&n@Qs!>}lh-a3{IMikc*mee^5kwN^E6PYkJce+M(#G9Y zwk7;jHxR%&spk$C5y zHAq51cf|<6u>qJRkieb+oS8t*JQRsClmZp=adF((l4vJ9z+ei`M2fvQOUKJl5ZnvdLM=`97{}drq&T(jb+B7|yx4gYlf4eXf2K81d0k zz@DAZT&`{iJjo9@e(~_Ho_3^PNuKAkZJQQBuV~m>7MYz|z7VVb(jfrICT^tR;rv zX~DeTxZkwlKNZg^pfR5a3#BeBf*tAqTt3t0lD5cP3@xCt;x1I3ib}w?i zW&ckTqlx2|^?R*%1sghdn=WMSHEj@w5_(8kll9vB?)vHbF3ghDjr6DG&euz;%CI~< zPwGy+Yi`_X<)1(Cr~#WrAaTs5x??3#W`3*{eIGsB%vy1S`MiOP)635+@G!NRV&h_B z8Ce!iZEdp?6U)ME4IZCP;Z3UtMR{E@(m5%>frRa4ETWieWgR~@UFJLFM%jorSy4xI zOrN@EtA`dn4w?yN0{lPews_3i&G;j!R~9?G|%ms(dDU< zwuqKjV6PG_b`cjZ#W~Vd_O2y69KT(4kwa~CF+PD2xjvwxskQ}|j^I+v+qBNPRr0NW zZH>ui@7@6m%ph=CA^o;StO*~>{5FWJZ=6n%O2ygAL|IW@l*(P0kD1}1Q%0iog-EXg zzG6|6Igb(F-B_VBd)T=wq(E}=pe`rrC{-e&`qiNJBKWfJE=~i-q5OR7?H2=Y_wpC4 zxggF(!SpM(opQ(JIiCnH!FwCyPayWFA=5!0lEwxzVn2`tPL<8+I)4rOEeQ{^H>cvk zXlWE3ZcT992AmdDBnZ2^qd;Zy{&ky}`UFh~z4>x?8Msnle>1nlr1@j|W#p5tV%9X+ z_xsRRhcVNxZe&uk14Z~!B3a;1gpuM9K8o*VL_j0->tBT_uq$=76Q;qyF9K*rXt6Z4 zL>S6;VTp>+2KJhR$B2;F=B(p1FCWIkCIXD69Mx-{vP3(SR-GylKHI?J#szisWSprjzJARwKK4gmoH>26p^=b}SE zTDrSix_i+j-3^Nl>F&<=;lIz>XYcF%!o?@nnmlukImU0?_jm#cwlWarG7{rj)O5ga zmeIT+p^~r(^N$7DFI)RsRh=phHDa%aAHTQe7nZMv-5c4Mg)=n!lKlELG-N5e0H{sJ zT~KaRGbble){R+`7G*bE>nR^2Z*&3CQ`$Zj>z(y5pCzG_ec@45^faBfaWHK61zrHq z6R*zr+R6LglJ|e0+H*F48bIm&La9bl=xiw$5wP5 z_zvj->90r?0(iD}*a$diIa3H}C5Mw6a%wmlXD5H}`yO|$ip84xIMb5c*_R#^@?U}{ z)t$THow=Eeq`)<^z>{RE3V9oJ$o^9jOIV)SeD(nisHBjHiV0j-kF?T0L+oxF@6KG? z3x_vOP{5tYnjbaH${MQ@VS?luv=K>YW{vAR)r-Jl>=o5Nb(j#)25msGN5CXm6~&*Hu3o&vQ{bIJ-4)na!3n>7Z)g>%+o+cA(#x7lrs4r5vosXkAu@H-A@2F3rv$|WYlj=A4Kmpkty8;_)CGDCiskX zkC1)OpsqHgK6*E<2ncFDEE=2eam^JPc=nfdp=DSc%x%1z0J` zcAhncDKyDUC4W5G*B0z=KJ|)guJyIpGhdYzMQhDQavd0qacBvNGzWbBogomC)C&k5 zi(6qoDsx&e-f2;2R(LTQ#ybG9Wn?D(0)S;5w@cS;x!;zngtw}|_zmlrIo-dIYYdUQ zKQa$ubUgon`{#)Pimt@&kF;d(fs;E)ipIEdC#vdR%dJ21{EMqVp;fk{RT)@}T zR8=T6M5$2gx5=cMpvK1*R@o>YMnhRA8X+wxiK^G)qJf0tiJGx}DTVUzzfg@-lu2u~AfU3scb zi5hcn6NF2^yCV_Su9$W+8^6L?U}0BF+FGz>Zd5hB5&^H&lvI!dBs}U{}5CV|#f&r^D8la_$>hNzBr-u-5)y)`(??PsJ};sk|C}p@?KD zc7MlhhHxb{j@)S!JHGy4xdieQD{yDCmEm~y&<^Wx+`hC$zvX_0?T7CM214bP(_Gdp z0rg8}`3WLNBoh=pw&NkhO>XsK@2Uhw9(jgE@51wtZ*~+r3zxNRFcCtOi<)!#W04T_$JBOG`IV<^) z3?<7T&*_&Ej7GC#As)r#+Y)^9R0o}fZ}4t>aC$0^;PF6o9b-Ifat$IjU&NpJJxn9wzS*`?-FW+& z0Bnh~8w=4CNTLc)g`kiQeTf!!#DF%g=0j`NYj_i@;|;BbU!%ZG98PMBtATQvn73e&Y?}uRQR~x0>b(93c$-=T-46@`Rzt1<5=5AJN za-o+=w~TQ<&iSSwrR^grjjK7n$<=C;GP{mukoInI6BE)r=(_P{+#23!D$rmtN&#_2 zPpEXqOT^%Nx4}}JCJNf7{6A7`%hbF{1{G!N>wmieiapD_!-e$R)W)m46?9ID(zhVV z(p^%;TT<}5K=hL`b95-UgNZ>0oa-r5uyY`9B5^aGz|wZv>8H&Q)7-+dl@==wZ*md+ zP{6qVP@rF;GuK8fw)}@SH%FBG{UB7zG{@?zEP_!O1c9of`dcAx0xZ=~Ntt%j8_n!) zsHWJgd8U?8IswY{P=qC1q-XZZ_U6MyCWqUqey&sWhxct4QUf7DU*r53xZ0+h7v`LL zY?l}RxH#yZ1DFB;<55?2yeHNBW zsjSliXcav@z2(gRk8yL>!!S+{cJ(xpfe$)69Eq`ob;gg+6X4G@-n!DoqiptcGF#9g zMC!!VbemMpEmK*|-dUtWo3)ETX!i~)+Gynub*(qX*Z2cYogwIB+WTKgyeEX@O4ycC z*|nA}u@=--oyyBD40y|FPddDBT5WeL@rBn7{ri8J*ZbFnK%|{R%pfQ)RZcNg=V^FS z)Sey=Lx8K_<7u`)BR4gD8)L(r^hvOW;UXb}>;n9S?0?o~?;ttnVc7Hkxl$r*=W6N! z8%u0#>g=r|6Y{IC!l&!X$Uwr^EQ9A-M+3<;o(y)cc+whp*f3eDsWVl9P|f}#`spEt z07hUbxj4iUp_(F9FyaV694ZYdxH&MVwWqMOlw9>G-&IvX|9d?{RLQr3597pB&cAIDCzAFW z;LXH)hOKtF(x)o9v-bfM^P~pY2UvG6VpAZEc#j<={q;y zRJi^~HZ!cJPDc5tLW0Y|!J?0O89~dwKORQ06{Mx!-Ljj7HSOxW8@>$hx|-fZR?3|x z@U1Jk*@TjOr+ioc%>HBL*MqN}Z%kSEZpywB&+5>X{f#DjUCStW-OTCF(udZmJynrt zg9&dZjyy=Q-avmEFjixr^53DM@(*S?zS4!vccMq`{;kj@Kv{zi|&DX&f} zIB3*NIK9Fs6iyT_D+r^`0*3~Z4xY~#S^G4&@!`&H+QZ@YS&m)KeDYOLQ!6XLmVl!H z!%vylE^orD&`rePztAjOec26IJu^v5QO|NEYGBNa>RX#2pr?8kR)NoEcB2Y|G&)I~ zEcQAEJZ6$_!gGoXT9`)|LLLQ=xLvrLX@K0ML=?id*W=}%U3CBzN?OeCeZ&5Wt1;8e zSYhq{_o>IxfSb9{?giiNM`Sn}%exNzgamuTB7V?>B&?FZ1W8*ZtMB{ZjR|Z7Lq9Qz z%&3~bgd(jKy7n3TiiLJ*njK}{zkEWR`Ly+7IeWya6T-o@##>A8QVK18Uu z=$anvofVEYt0JQZ9(a5M2H!JR*VGE+2QXk=3oFacMxA&_I>8&#c;!%fg%ZQt)-WI7 z;9dQa@BOrzli=_LB-s@jTz6F}al86+EaQB$xSPn=SMXKfdTbw%2%k6_6jfutE%hw)rVq_U?89n%Q(lKwj+~*12KOD>68HEdRjzlJJ z6cO&wc}tEMRNo#^ZJYbsWP`OWPs>&DN;8z#4)Q};&|cL(FXa4dY_6)A{gLfU zpoKk)?`paC+E%dUkm`&I6!O@5G_3tJyOZ~Y)O{w|iMpbtQd8oV2nV&ZCi>Ms^_wc< zL|9Uws=iU!%uH(9<|-G43emKuB2@}Ej%DvG^13ITd_LWLXB!s?IDM@^U%gEEB%Cqe z`VJGu$uptq8 z9D%PU@VAKi-JNLm4tMZ+PqSUtpZl8GY`AO}ax~ElETq=l<*losT0B?}_ zWx+|2#2Paiz_27V7h7&fG;CG#viH#53flg z=#QR~uFbv)o7?cTiq2*^3ct4|Iy|W6{(`tl6k?PsyZ|T4JcBa~l@VMWn7R5hODq7` z5_Ocid6{l>cBirgN5MU(KF!P?N+$v}tgLN&&?0ZWe+y$OH4XqcIM!IVJg@+_2kw*IIkz0M$Nc@3}<*G7D zas$q;Cz1+oZ@&?Gj&6zZ(#{XF67bQ+IIV&aX8>>rIYd-k0g#|>rK#i-f4|zYl-RN_ zC@yDdrtA;Z$UWSvI!EI%7^&TV^I{ne?~Vx7@%=vVRPXNLJS%}9#BZ^TvoC9AkW3K_ zc!lB$cX_gD3<)*b2U=$1ZUIHgd@FjBhe|I&QN1LbWIM|BJyDM7%3Yc6VU6z6mG#S| z0;wXx-i%L*kQ+Ti@#J+SnPg*=jbIJdCqOI^x-_Bl>ANZa1Q?a@*)<;GqI09E^9yp9 zMH=Bzb_R1IyT7u2lj^wEDxbfDj{ zXlwP~o`s+Q3Tn4GR@=vuCIFtRR|~d?k;D~E#iWCV;4L~r;Q(7X=pI4>Bu|&805h*< zuY4Uz1$nFeF@CuLP<8HE&^)POil)^ly6FS$K`_q35%>Hk1(j>>;JHEG+gW#wTVd9- z(LO*A04QzHjiGg~<69k>jtW8{j`Y&k4}zDFjVq?)6|_b4IY)x_6IzE$5%(45HtuVs ztyamMgd%Try`yG#a+h~|btBFqfad*Ve09bNf#s@Or4nVnU!&_)U{DawNO4Hje5>Q+H!_R0c|m!WeN7(rr_#Z7(+ul!T-Xf498Af51Aki(ddZB2uYOew!QU0(Fz_>hXsAb4OEzbWeu9` z2hy*Xq0l|qy3Cyg>k}ssvP|)8u4y{~hNvuIA=o8%q)ru_{>$YTqIsh za9{S59(pQry|qE#r->M)aZ&-C7Rn`h4g&K64pV^eJ?$dM8PJDDqqIL&`R%!r^H4WO z-YaLyO{BsN;cPcO8a?d6Z8XkgjRIYO*-+jLVM2F#<)^u5yQe~fpoiONud#$nM+QTn z$As3A4$HS}sCR*ra-p#-=ew9$Yt4N;Qu73agoV(mY-zzI!*%F)O$JKR0Zv3a0tMN6 ziDWIhg`Se+7JjoJt9>CmA>ss_)8V9_W%^usSbMgn4fx#Iqy<4<^CW9=pAOr$b-}>E z2W)T6zfybTF;!r{xUb zT&5ewh0kSQpGHc4%@XL|fPB`saf}{c)0~3uHa@le@HPlc@v`26?{BQt{xARvPA!ka zh__%?8+)81XhGMelNQ(abphQQacg}dL;uIPUE@K%^y`FPBpO3D*7 zlEv>nN*1TPFzv-s*Z>x5{+dts7dZQ~cdX%5lbch>E(WI2NA56m^f{6Oac8G&_W@nbg3*bE1Ia*r$}3_pH^&(HvDxozp*KChR&Dr*!zY% zfG|bmr4$cGVjOO_!>6U`U$X7+=rCS7%)a0dQL(OqeOS!gVFN?GTrNlF2GeY`CeRMo z?PR(Xku$-EuRMc<2Fq?fI106sm*uw(p(O7U^6Jap!U8Jm?qTDU^8WeDeX#Wpp8smV zetlNzyWB8a5QD_<9)yg6VZJ(G@2kKC5BfkCbAfBZ2{>)=$Fs$-7|k&p;HFS6S!JlO z9Il29ekVY1fY2qvI>q102ue&csN_rsBM!OSDF8VBQCYl}ep73sEA984jC46{u-5&W zD1;CY@(uSndqlbW`|LGw)q?)=Rx(_~rm8=aFNFc4!go}VGR1tP`ceJq{74qhDy%G= z1`E4JjGLTxTmu?%4M#Qr#T#1Zl`p7<|E}22QzH^1y_|Y^i_B543?$nvjbV-FQf>ch zwABkW`0hFVAihZwlB>J>rQ?F=Ncxq!v*FfDm8t!QM4)(F=A^qWvlB#G zW%wLp&s|a4B1B6VFl1&>4k!zr^?B+ZwOU3}!CZQASA-9Cov0)19f}$yI}{^4r&5FY z`>0~2+HNh!MJ0WJSRN4jwKUKl-lZ1oF<^^s)x1lJ?Hw{&|1s{e91$*fYejaX4ipm9 ziomtbg`;_=n2ZM>+geF>*Ago}4Vbj;-K#8%1$5soqz*!V7*%;fh6D@hJJbb!#RW{G zPG}Y4H0SHGlmcWCLWC z$-(#yH;cBnCqo4WIQ29`XirEi5X5OQa%jo07eRuh5uA+xc^|;pI&w z04xu|-C3E#GRNCyOTFjjp%cbc=|1jX_G{q^xe z`N%`G!?)PHI7jL!ZsMQ2Cp}H6sch|Jad`hMNKF@vpcTp23lW0h#M@sKpRK9+kFGE;n9 zkGFotnr@fyw4v>vH~k?@2RMDu^V{uSn9xz^@7md2I5P4tfbsyKH}hBotOVZ_a#Tt< zt&&3Wm@7vlvRqQy!3Ba7^bs4d9|u5J=7-|y1W{zItK;M2Y=)w1rkm_~1@heP9L0}T z!mJTaz%c)OCH}8~38>FIByuSf3t+$@d7T%%3mCla2l;P~+-*jFiZoaHTmT;K3jqp@ z*`XY1(nJM)mg8bTUizJmx!D-0A7DA_!dgjokkMc4#f$Z&I&+o;fYDdHCNqL1_8r1c(eaR39`)Ov& zp;g73r!!e+C-H@jR-fkTAXXRcO{>3#f1Rl`b`Pcmz23O&qW-I%_@710t;w22v{_DY zGWBGO=5EG9tx##)%#`m_S-mXpHx~fAUQ;cDu7!>bSlBpOjzQIQGD!>6VGkpzwb=cW`E`Mqu>u&_Ns5mhpS?#+h)i6DJ`HmVD7y~PnL@d#49srX^;0BZX+bk z0Zktkflgq~L84?vM_STqQQ8dgPOiqv%-$ruA79bx38Ds{!fcE2e^Nisssa{J&)1T4P=FS zfGPe}MRc=%n&$h5lkQI69y|2PA}q-{q*2Zg*oSgXK3VvgaM#cvkP;v!R&VqrA zO-b2ob%N!^g~DP2j!}(wy*C>7x7LCh{sd5R(}#yP0CONO74cLVr-2qfmf2N;ETex& zC`p7Oq0h^=Lq+Hsa|*#NJ~|~HYCFK_3#-y~sf$n&wY#0%P9SuI+nPm5007beo@s{z z_5W--B?Aet?AYApkb;AfzmlYO;D1d`Ih9?04fvh8PW9(%CV#Ep_N!E=mFB{g$40*W zzWgDi$ynG{y5wsMW6sW5mT!28Wa0`DXBrr=NOgwVg%cQ)Hqymj#Ksj)ea5C`#VaAR zT}$HWjG!^x5mt{Sh>wH876nZ;MONno*x8~9YCYf-k?f?i3)rIxrsV>7+?Z+kEk~`e z{F&zB-C=`kN#c(K`!AsUp^cOA=i>H@>YO*7{1qe@dsxDNv|I8+=tQ;hj*UV_-=$+4>B6HtmLS++#J|Tutll^p&J-jwq3VN2qn4>3}X=sGIIz zU4>^!A$N__U3VQn$PUj=_HDfaSxi0)?Q1G0`+*T$_h!(>#&aSp8nrbY!n@P@CLZ3H zEtV~)mxHz%*3Wj;ad4)h#bPJS3=zOH(3;SgrjRYhAd<4WL@v2r(OFs}P_WWyC(QGI zw>WNP8hn@9qtmp*+0R_xn@tD2z3D+vd##P7`F$*ti72Z-Q$<$Grr*V;so-*gJNG#j zC#~z~p?A360^%lk#QM|b&L}dQBVyKEQc+>O8Qbz-pksjpSnS^sDJ0L zN!^p>EN2#bT^z(r94RJD5kB5i7gKzl&l2np41%+z zXDQ(#wFlfbJU+2f1D*T>Qf6LM(##nf+)NrH)>?5z7KspqhpBsU=CbJsDYKfdM&7{x zLy7J!wxIFc$(s?NK+qg;%0?&+DiJT)+YFBN+egJ!2oGJU>gzp}fJHbisbt*4mpR-X zLILPm_CUJgXEn^r!tV{JHI&YPJE2I;7benu>yOjlUTV6AEwf6J%Uqu@2Zg+FIpk&a@|l!YXA z^!}~+*^qUp&~M$0C@)_eNAs0QX>@8gL*q;BY4YbRp+A~ci+JeIj1{a{bbC9U%&0#d zwm&v>J&|;5$j*g6P{XCSX$*d=AC@2GoZ16i#fY|_QOjKTcLl}-FY=qTJ#wR4 z`1?4V_F|&2^O{I=w1s@px6H|W1U^`JjZU@*XAHoe-*~S29R}=gg8mu;M%I=Jud@*2 zN&fp)zQu%X7t$j!S81czU)GEt6!!0r-!6NP%~FWK_QosNEArr({<+k66ds|Qqy%zU zDP6Ygtr|pWQ~P#bj;1Jzmpw3^Pa)t+ezcYBPfGyo@g#;W72Vpy{fc&RSUN{JD{lbN zjZ_Y3LlO>UZtHa{0NgJC4aFNw>T|}mLFs$qXsO^j1hNlTf5<2B$JyQ|sNn6*c-zO~ z-8rXUZ@CX#ZwTHLq|^ZS8u|2lOg59DCeMb!bXaysNNIMVg`ks!de1oP>oUfz`;Dy? zjaJ^LKgAJO(-iw5g<_y1b37VsT98}5=YQPI?ddR*M<^w6Fpzu!2I{X053A8P>33Ap z7h#E&Ot((UGtWb6kZIlyoAj4qMHxqTPm=ZB4(}^1!)-eCDbG1n&{hfjAkXUJ%-qfD zxQRX&Zz}~vkL&K4iN=f4?t8?*R6Fl!7d84(AE4#Xo_P4O=7tDW*`ml5ogQ0n`07sz ziYE@8H1Q9UWw=vMwyWFEAq)zb`XTlnu_csce&I z(gUM&o@3uX2l_YQ!Ve8%a7=5(>-*_v!jL_vOH_ z>L?gnML)B{o27q$XVVid0EiylW*LXq#AFN{?9`(JBt~_t=MesP1^-Y7i#u}TpJ8(I zSPB-ny_iAswIbUKf0w{riMv>5J{q0=1emz#{Zs)1bdWMjtmvT-QUbN7o4(i<1i#)l zw$;Fp7@@ZGc_!Z9>(!dG=%v#2U5tNe8D%^e$~`v}PXr@DmEOImU*gbMTEI$PZnzXYX;mpFP9=7~ z3i+MKO9~9cD5uG0%gYT8G9R5bR-RNR*bJWK((u{gm8{dq9S2nS8wcZ~nP`BM2+$`j zw6F=pFFU*-cys^$;ww+UztYjXy9t)vQSG`6yD)<5iA6e002zLNukt}rst%<)4^h$YEYcD=cY{E)Fq(DLE&9+-tQQIiK07l0q!bbqp* z^xd19?mnQ}{Pzx1&E+q7eWXrmN~)$_Mg6JXeJ9aNmXoR(`uWi6to^Zq+_L-dd?i`?-8GdRvX1h{SL9kqo}klh;GXrp+59tgEAak# zAmu;1?60g#{p|$4g%MLm{vYs2CH#CHKG(H^bICgiRm5bIBQCxX|XuUh)`? z$UEr^1m?x@M#?3Bhsh7bBT~>h^O5D! z7{RwnC!D2O9KxjG=ZDP_KFFPxX>x@ZOE*t3{sl7*!_$hz6G+z95oFpk<8s~#=5Xdb z#im`xym6;gXhg$qUs(KhsbLq(Y%cr6_)r%j#Pr}9Iz0UCW{_~`A=bh{zbe)k8WpI* zPTT*z;=Ez(ilv^n>MI@of`a^@zWR6lOg|wl9xPE}&T={V&EBHf688m!X>tHS1V@zc z*QO~mn7pH9gWESgHLEo1Rz@jHc>}bIvQV6)^Q*Jvv4PnZbPZlj()?RE4^WqN^0MtG z%N3`OeI!;BK$&T9%)Di!Q&sTp-(6c^^i-nuiyY*)PQQV^pWZ2W8X?y8M1w_O7I6Ez z_k+B?$id)o0ZMWVsPN}FrL*b>(V9#-SW7TQ3#*%LV{1wPp*kfJXm{pM>D|iLC2duz zf9;Cw{O1_4nsx!tuZIY!}Z{RY)8OO%B-PeP$^C8GvPr(iE%@Le;?Ej zj+qmnMy%f~JZTfZ_cy^)>crZt;wHo`m2cvwoa@#KxczM6*=z7k;fX(8T1>BHE4&pH zaFH*{7S7IoMK+V-1p5H&!N{ahIp#1a8{L$s7?W2jtGQ$ zFM**9`6IoQk+NGW(M9zo?}kpF-f_W!q&PxPAwj;`8um*JC2NNiz|d4 zp;X3AE*@yU?(@&smFG?3rK2UAcS&Oyr0i4&7?tsGzY_{MBJMpyF8Lha!)O^TCyybu zM2TjAPS8!4i-Pqbtkc$B$R7xYdq4CDKg96O{BhBd*~YSrWMmlkZGQwc(bpFXQOnC0 z^b|w?Z@}MWr7n20N~plYVe*s$f|Cl2j|75pb4AqIF{7?*y=Y5K2rp0zFR5uNFrDuI z9;_1L;}P+Jgwl!t=FOa)d>H^Qx2LzP3*Qdv|fByxz-rE`{xG24&^848t&L7b(; zuC)S?u8IEYSqm^94T;QZ;iybj4NL7~8t|^j`KkLSU^u-JK@Y6Q+s1MK^U%(ec*<_4 z`2IPdm5^*XKkRhSDm;MyhTz>cQwNNrN0=yTc=yTqNEw^Nlbk#w%(`V(6QT|Y{>J`! zU^Y6dxOQ+*=4L4MX@PE4>R6*L58n;4gpWCeZ!DC)_Izvh~vNl0wTuFznE z_GQ5Hgw&s0(C#Y*ousQ1FU5P27Y))ZB@$*VTpDWx%()bc=3cXia8bx22Tev781nP! zk+F=HBTm-U$K79-u!)C1&&0hBzb01_|K}5;A&~>-iX7Y4R|YbtdYW4!&Bn3Ez7|}; z!!cGHfmQg*3ZY{@%J2SuvexP7`~)}+&E>yNeQ;SX=MiwPH#c+L2XJs}+bZRld$(oQzre1?SbNbcg`-|JzU2z$c=g1zwC?~0(lppe$IsV|wwEOeiV zV;-T~5f{OHPv5c-gXR}_y#Q-)kgi>lGU57AIBXgr6+DszL-ef!LH1+{Vyp}}AFK=a z3qsWuU1zb(6@)m$TRI}SzZ-%j90>KL%)-60t!28Q>pSFdWA3aV`AEzN5c>oRlI?*H zgoeX4()@wU5WK+NF#@HY&Ez4@yR#$KO1|;%4^qjQ)TWQwtJM;SA{nVhOB7&G?Id$4-S$?zpr-qaBbgzQQRGlhWn+NX0PVm;}4JFpNw&h_5vIS`2KJN zXt6J>5Ix~tcqrwHFUT)N*1y=kIZHmif!}Fs@gipqt6jT^xGf*yyOf8w>dAW>Z6n*h z|E{^K;+>d8SsC=?L)#ldN+(}U&%9Y*BFgKegk|_L>pHw-vwN2lZ3MfL~*kcy_pLBIVDO)o5P=PY(9Gu zGeoF?ud>FI=CB*?ox3RHtG33PriI3dw1_;GiJ3?4sGgv#YwxN!%4E<=+X!6z`-VRK z$JQtN1HBH={Oy83t-&~TJdi{6^X*d4*)ozL?_M(M8{b-?*{6BXT(knHcpunGGsp1Q z1mYq{6G_g_Q+{c0>iMcF_I}D}e02rAuZ#@UvHYbU31^l}@oU7L8I{h8S)0ru$m zbH=V6YB1d2i?wW(OZYBj4P_zP*-tRe&^DsGrHjVYnWgO0grGmwy32=~qn~fi!eZ}% zSp|6gNKjcT#D}j6%0M^os)Q~E4V;^@g!T8<4$bl=GKT# zMs6uV3uzb_>iDr!sK4>f^#gig7uHPwc`h(>yUG@H2`xNXR~!w4cbm!~HyJ5;O_)bF zpxawtJS|kIhh?HMc?UOfMb+T%d1J}a3GZV{_dgNo=61EJ!oeMM3GP((7S=j!EfXg3 zO{8;<1s_=2oBh&0r&3SKyMRK|9QOAhf#@Lw^ELs!9KT#t)oz=lGbxM*(1Yh}yG-Gl z4AAjoytx-IN`IPEBVaS*zbL>T!Zoa|5SSZcfGnrUUF^0{H^D28J!ZI9L+U{OensHy{!0zooU$vUmjoeZ2_ldbW;>_=< z@qO;2wJbAL&Qi1&^gd_}g6z!H30Y=7IkFsVWL)ocJ-od}iWhw#p7rz9btAmc3XF6T zYek0lz+^Z4eUPsROlFF;lFf%FeAM@#TDYF@^^fanX&?oiy9WOLu0keX1f}%u^TPjH zzNucRib|P$J)g=4-%5nsMKJz;Vy}_I4rqg`pI$eFsMFOcy8Uj}iEw_$xA0{=Kf4^7 z76+TqI&cQFM52;c8Zs?@7(CG`rfJzvd|dD+V_8~?22>eD&;p~Jmje+G2bqM!=%TV= z>@!}8pA%~6*t%J4rXlVf%l>v-PE?Dxc9S5ER$0LydwHVPHCV|Dho(?2}w~>4bVNn#N#w4aIoA&Ic1C5ae-^yi7D^S<`5O< zMe)O)!W3G|=Yq_tZ{wipq)|eHtWe0wgCE$K!AhmefYV=-`bO8KThg;&v8}?o+DSF$A&*C1FBiENudW#v>$sL=z)YVt3X9)_n zpT&!rEhHO`OHXZT9vxrk#;!ZwMOUB{VX$>wT0htZ$zHBY{Me3NUSX4gGHt8H-o*=i~1wOxP@8tI5CTdYVpyHLzfun|Rn{m(xB7QJIEKBUmqgfp(CeUuAR0*dl z)KL^?zzfr?^^3~=zR_4}#=ZCw{mi)m`*_3O592tw6l?P&y5PbsbixS*vIfOmir!BY z6RX+>2|vG>=qie-IBy3Z&)OtH#{45FV)qHS48dMUzLHA1uyA8 zGY(S0@697MzA8G~xLleV35BUmm9m7m=XPC^;QqW*v&)Oqpj}K>IGZLBGvJAjyl(P9 zzW!_T84qKYL#(l_iO3~uj}ZSq?kk~KL6$T6O2Xno%Kj^TO?xtUnd(_;|*WW!Ii)_T=db>GdXzqzu)#CfEo12ltBO6L#8Z(&;WM(k@5N` z=m`kN#%_vBnqBJ7Opc;@%HYWC2I&&k%injch)7PT%phCdPv@5UvKIafIhA$@+V{o= z8;ve!N9cIN=UbPM*SvSAa?^FI>9G1Vhj)(<(bTlKUVhNdyrxXD;)5~&Ig}wc9W1-I z8v1Y|JI|j;XQ#9SDXWmaS}>Oi{(0r>>bB{Dj>`~SyfA1XQMz9ozo+DU_FfO{KMXJR zw-K7VDzf2=dXm&zDa^yVjBLmYr9TXPw;4Xqswx_nip7C5Nr#P3wk>$qX#VXvvHjQG zda&~JF{Otz5_^W?z${ZjTRoD)?ys--a!TXc^!AfR&oZ`#{A9k;-e7MR-25>Q@&nOI zJ$ z;OWv}r%I#J_{}NhUFD+rxIl8S%s(GG&0M0f?8%0Jn{Xw4vawJLzV1G}*B((d*Wnb# z83+QiADCwOW|#e`5!j{4o51La9k%|{%*|&3c!CPDk`?D#_)Gk3*q*Wwmr!07{IcTz z-tn+!eV7(ws$%1kRZK9;<#NNK{DnQ}FyK;F@-8n&p8=Kg`TaJ{UW8o{wHq0F;7($) z-NK^cdOC^8`&Qme|M;E}@Q;(+bcR>C4^ECo2Dxgh1B+jRE?f13@Rmy<*pVh@PgBooA9(JW{ccc;hX|~8& z;lD%q^N}e>p>#A!nzvcS|3!_Fa2wP>PYF*nMb{AA4$Wvm0}>ENDpijfPmh79{GH|0 zINQ~!E%syS0cz1JgwcI?t4$C| z(~U+|E3Z0c9N2?aHfn5iDt~lO7mFg%ElMxeN3U(JV9K&L5e9jB@m@J|5|4wL(I{wI zi&ndi?5yh#)Yy$gwx$}S;P86vo56|??w>v(^3XBTF(E1A^r0){VzORnvc zmc-?;i^2{ljNw7SlMc3E|O;F(rggM9xNJ#Xjir!@p<=`YxK7RR^LK_FG^|ng{5K<|upXUV-oXkfuAeqpYcgNOhBP0VnW=W=8b8&E?2h zG7b*W^|r$>;<*^qO(Y78DTl3DECH8vTc7;2bQzcs2IdTM&_R#qBLaTrAxoeuR%bfy?ej zLyW|Yv%}hI)du5HFYvBylO@VAD*xd3%u`gh6v7txOq<-w+w$31Pp00pnUex)$to1f zu}e*Cm6%Oem$CN+?&h7uubSLY$B6YfyfBV1I*yD;XE(k{M0GTY4(2q=)LBTUttT&v zT?PCd4{X8K=DR-lIa8tlpR*-5x6ac_eHq}S;B(dPChdjyw}tU!t2-WURxq`D3=jz2n%`Mw8)NbHQU$VVw!b;8om&Z31OFXuocze=NNm26DE)L?n=IGZdC0n)m zvYQfLs~&ED_TAkf$EDCL|FM)R+=e$mN#goofHv`K^_F@kf)?dtvv47Y*Dy!J*Gh&A z=aZI{E$?xnD=Alsgo}sL;_~gFd{=RyJed;FgHgD?Nt02cQFnB|piUEB&_CJPWaImH z4D1@t7%$9JcAch97mIJxFAezX*bdW{Gmq|gZ@sHs)2k>dd=FTD>ew>z$RYmqvo1S) zk$@WlpG!o|_v*cDFql13c>LG(oT|h6(g)gvKjm|)rRXceTA=Sg3x8;fpwz026|+%W z)L;m53Y7lHK-Y0Eq>&HNvr+KR?jRpV*J?UCx|;L1BKD>d>GCP)Tro}+?prHnC>d#kJTXyM#EO<` z6-WBEao$G!s5<%b$yTaVf$`Y0^KeP6w8V}j))#IFOTE?Xx(Ash4^<=0q;^@8J_4^y z{JUx2eyxaZeVCBn$&4a4bx*>1PA1=94B~hW<(cts$Te z)%D2sv=7dk`MB1y1uQ}A$GVSO_~qs<^WNajPM{!EltY*ct)S1+G+hEChSX3I?t0jJ z(;!#F*QZ$E%_o|IFSD299((+uAZCjGQa+AbOev*>_u{k~f(aZ7org#}*#y!3OPq8< zWArEl=*^#=MYrHB-D6*pE}PA^2@Em|27wGMe%*0WuF|nRgHj-2ulfHGiXXvuhJ7G> z5&4XfI3`t{krWt-da-842E0am!=NzIrwz9+N%~DeMmH?L?d6-k9jx~Lf(_peoxtyh&uiiKF z-%8#~skm*IcWklsSIGOuBzNEp(a6cvJayDZzAQ>@UooJrGmNR#|`0&hsh>(!d> zAXZSI?w~)tJB06x0z){`45xy>?Pak&PcEvd)g}`&EdH?(Y*i>g#mDh@=4OogeV4o7 z1Km(lq?XT7s4~oHpN^f)=xN|N@wz449sQ|eNr8{ajjItQOd*H~hN8!}>UL)pW6al3 zWZv@`$!mu!P(J*(mL(!TF@77JD{3`B zht5J#Je%kv&V>c3cZPe4qzn2SI#cBlOct?WWlv6Zmo0v?@F@cf2$HYHj!(yn-%Z6N zM2aSEWmW!zs@|t%JXKg2B2@gINLdS&M=Oq3M?vcC0tb8g*oPb>Kmj#F!MU_H*45I; z7?=f1FFLl?`fwV`M4BQZ!_)HDcjhdV$IvFjQq6n2HltGLQmno@^)`uCvM4suq67gPg;KgYQj_#eU6kVP-9v;ol%>ve+BgK87$%La00c}wuN6!2h>6nl8)C$}DB_ftbbBh!C zTiQYHyRVD%oi7>|9PlO6#bGyqZcLH3 z2B?a(3J7f=Dx4q4fR9w9ViLL?eR?R#>nh6WlPIF|V)X9Z7uB zGmBR0++SL^@qYb6#34_y)Z~0$g`;t2qUE7>4xrP>vBsXbmP;R%^qQeNI)H9zQ@@oe zm|+QryIB#*rukP~{^?T7bp7>iClX9H_d?M!1bVaQo{hU_c8s;?RziZuXl-K8Tyai~ zjnK>9eoj%?BUr6;#r)kXUcFA$%2SFMk}r2;aD^xKk0P`9)my@ zjVCiXbXQ8X za>}6Jn5w(ckUaM=ytQq{VYbn!2p9!7J5Ls_-GmtZ3Si*QT{t1!ODWzf-+Ll?9a6+q&*Vapza=R$)Zz@x zoHYMDYV`_W-W2^1FGh^mbDN4J3S{W^16YB5v7S&kt9b%nai;eCzQuC~a${9KI&wz5)m7=c zD`TbFU7h@lYhN`cEBhn2@@+m8YbFkmhI1$2sRh?FE)ZmM&L_p195G<2>?i6EjX&zR zr0q|-Tj}fRDF{#v{s z>r}F^5evL+*eJb(MNkz1;IXbOFvroGgweY1uU6nI3Iqy)|8-yi8M_;&8hq%Fon7Dh%fI2v@P2tOJY?Zf>+MDy+>hL-tCt5Q5 zOR;R6-!KBl9%Z~t{Fuk0Ee}OlvZWeAjKs!mGX@2{VlS7u3tHdHr9OH`)~T~76S*|s z-PSz8)wF(%S}j7vPd25+n?)S1H^a7{n_WbEbcE{x@47BP{0r~$-jFenXtgE|dX~*{ z@7{PFyVuuRjhLd4r&cm~p&afEl^}S2o8FII1HuLL0Z&`G(3-H3F zc^`Du=TI6~t2IcU&%JR(WCt1tAWeh8FN>U2oBZ|EI|829A_*sk(!A+Oa894Cn55vj zlxyta`7jKg;VHXa>lF1C%hxBZU)+5syxxCi_yDUjNxm|{u>!+ibjGYJPNvAWi+!2> zM?F2C<289W7>Nk(X-${OUdU69y0&^iq3AHkoVh2T=x&yxbGA2u(kn2?ruzL)Hct%zW(Yx%e91w1qrf5=*7>7IwCM?&wBQMbQ4D zL(WsH4K38+<7Cr%TAQt(UPhfjH>(#0qpGE1kH1y3FeLNCb=Ut^_TCkDNFa@NY0|Sk<_$n1z>6;FAXz( zV~A7x)Sg?Oj2><__|T9{h4~h`j>nX1tm`J@jn0IP1Kn7Ig(th)5%$6c%U;zZR5tEg z!!_bwUq{#VnV}J&RE}A|lGg%Yv&7$vGA%j%#zTLy19rR=_)^}l3rK8beCGxB;=6V> zP!C=lm|e9jtPR8K>t(^y)+~27JXz*Z5a5_`boc7{_B`2P{cOQ9RCE5b;yExzr5~5N zKyC}LL!(8xb=z>s)6%_(Aw09;aGSqN%(sog(bFO;SDev5nxQaT7yjtfPt66cq^My1 zV>B*doFrn)_%VNPa*kXIe=WxjU{7EZ0Ejb=xsXH1BhZ!fSXk*ttR=ZClMURyHdmD= zcz8r%rQ<|eo;}Sk`IUbT1Qpk-I-J!rqI#^RaXmhU_fyM#BJ_|sw7J#@szhyD>J|SF zgj`|bx6V<3w?{UV{u2dpz8ak$Tr>)ZRi-fNJ z<(`k0iF`_q1X6O&=O?9?nXUO?F7&BG1N_SE8iJU;l+f{D^?0Q%Wl#q98&Rt6Px>fn zTU*{To&N=iU;vh;q*}5j^|gT7UvXT|yPU60jNx9ZtXHGfc+XrYEwVba9e6o35nML^ z(PaNC2^we$lT#;L~V{qGXQ0=TdQ^?2wwxwNfKsxQpr3 zxqoF@m67H;f!F@5ir>BH0bB!IC8)V;t0)=(7`hBGCzxGo>=kW@aHC>M@NioM@6aMOJB-Q%c+?+u#iz?Ze%rL* zg!}YKA^eEL^rrq!Mwl9z+C;NG=BI+ZwD32^BajqZF|w)eO+BiVvzUA&^lWGS)+d>Y zqW;%`_WY{-MZOPF_om~Q2kS)1Z`*gP7jnrVlnXf%w(!3{gKy6Gj-3nZ2i2TIaS(Z6Y{;u>~Z-vl9vGJ})Mr#<8W&GNrg-FWI46Zu!j*+z*q_myC74loJ>*UwK2bkf` zj~GkeXBD)qMyG;P@iYrNWH8h6#XypbN!D^DueS>8ZDlR;?w|R0QeJKwqp)yB<%~Is z7HHFx;y!D&s|Ahz{K5Qx-E=5$nU|A6G){%*cRp?)L4EF#;%L!+nr%ZNKb8J;HExdItInUh19|rSbo_=Q} z0y&E2d(D|+bauT@f!_qi z&pCVO2+#ZX(|=EVn)TI&^|M4!^zSi1`UVA?-0_+IHH-hzat2?}(Ng&^o)i|dQA5q+ zbNME~2Rm3`mVxotSF>Dwo9#kK%o1>r>@6WwbgUq^NBwilQ=1J9T9vW*b6thbaK2G{ zumZ4_uUY)ztux?q_GxUOk|POnr9=}B2hqzMkcorFFY%L=t;b5$&JQ@eI>jEkXK;i>fo`+3I%jC}PPy{SsnEJMYn*i|pu$Q&+U?^x0#Pr+vg9OG? z_E1Azn~0002A#tkl0Z_ngW_otGZ1c@PY~y<8KN86Up~mzL|7Hz4{eGVEIW+Ur`Xp- zVF9B#WC)aKwI*$}9U5O6bXx9%K2+YCtZ)q87L23T423xXe@=N&+TBe-kOmKYcOa5j z7##%qptMJx>B%MCEyyDFAc(Ue94E}_S(vqrWSs$}^m{S}^RaLKG;|H0jpj!4SFqJq zu3pC{Of+dUmF1t`C3)KDOEH#_uxTN1xwCr$mS)yDq?2KfJ;a9Ucjvmt|7ao{mYF>` z0@I06XBzoREsAov0c2nWh1jzQUO90%Op7X;<_AXVZiz(R_O7SAipQofmZ(S&QWa=U05U8f!0YoJNuIPWPS;KprsH0=ewG;DDZYMfV zt8AubKaUFqZm=ytRwzW<8-_5D036{7=y{?WAktN<>Z*PA0nFY)AO^H6P@ifLOR(+z zh4VU`cwilyk@%{0D`RPsUp?{+-{!3@d5X#Y2obK6BR424%5rR|Pq z1B7T7Y{ax(r6A%mQ}?p39r>dV`xe;(G1nOhvZ?ehZJeZq0WKA`lz6u5Hbs;57~aNQW@I(wv@N=hnL~^mtnFSd1>p=(}pt-a}}Y=h1fm8 z3ED0$O+K9Y7&(|R)5JeZXA$_YGAEm;IGgt!TfMILdrXm~t7IQPtGTES*W=3^ek~6q z#Yw}qRi4gZkVWMGQY@lT(P__~BbaSfSBZ8^;mZpmAFqG6DQp;+uKRi>N;2Q@mMJlB z+TPTq4^p1v=;X?4uWRohu$MW=tsj(7Bt7LP#IHrqcG(M?^F#ilcml}FPdBF16?Bh@ zaUoIGENbbX=^N5cbcm&OY;rdMz`9ls-O2cPGM@I7!++AuPjQG`9b#ozZ-F_qEB(DD zRZu%V+|Wfd;>jA-(Jf%o>3eLJ5e#`C9s8j_?e=?(@WuDS5aY0-S1{^h5n!eQG?csJ zOZgMQ-M96WSzyYv40*Xp9-~~$2II$Z!K?n*YdBI7_cxKFcJJ^E+CK_2I^<&=;^)+Qg<>tAbnNbqG)R7uZ-|;l?bjTBn zqlYSweIA8+bDZL6$iK2fu#%uRFnrVE@RS|E)I(ML?!sZ64tnpGL4t2Gxog4HXD)iI zv;DB;>t2pK)>7L~OKCGCz=cLz$#o>`Yqa3^v5?mCVx7_aZCibqe@oc4s*}0R+q$nu zXeo@9p-~^8Ub3y?B~fx|);{(M?1c3q$dQ9m^@GK3rE$c6b?kp&9g>wnLm)f?%)?fAI#3DDPu?8*YwKbR zU>(HNy9$-e9JJj^`QjMHIOTd*SC*Lx{0psxt24I6JkPM)yYW_$JM+>X|Htoy@S z_-tS7RfFMq>(molJo*NrA&GQ#jlEJv^F+bF=x_C=dS4pPw~b8+p%j865jBo%?IHAv zLo)V6cvuyyz!#i2S&9Z2IX95!1b^AgXZM=b@@*;8oE2R_9PRoez%U?P*MRD`%rzb9 zEuVV1N7SPKR2Q;j*QpSpPCCwIL^Q7~&Hu;2j<1YUi<{6 zEKQc_J-(!M?bZDCcvbk;!ZzQ??7z2ZX~6nV5G?DVu!dqd=8d$zVa&1?VJ}4tap74H z3>lO_YjhmaJaEke)hWG6$_Y>q_yW&xSx5U1rGFdzhQp93C)vtp4rOqPcc$YU>IMAP zI(bJMgiK34I0x)y=xRCGTHK_lE>Bv}A7t-YqG=kwpA)EE51h9XK)ZkHP~Sm!XV6X< zijy5gf9C8%cdTP4{7oEVR$cg5Ym2bk(ZahS(8amBu#!L{rc*P%&HLpy9JQJg zV0r9nWW5KjJWAU}>j*RJ37d!5ZNn1+1;Vch@`7Xai;^e+#r$wzj`dQ+X%d(Z-2$y{ zd3@Axqxhk<5)+K!gYOh7{7c)Fw(c=hC%>pYvC!MwbY32ZSR23T)LcmThi6hffqi&j zmJRryJN-WrSl|M9n}8jc{+P$9JYwPuN3`G0WID<&?seO_4r6sm}{9&^5r668~7iN6SLQJPf&aysE)*|!x z<`Om%X3je9#JynzD3ZC70^gJ$Hu1MmgtRm8^W<+l3tqt(AT-H2SjuH+`PB|&v+W?C zha!{swrJ-y0fzXy?r>jCvt?)pfe!CCHN1HU#5kVWNN&2I``LkVrdTXsyC*NX#m)lF z$!2GO;We+b(O`xnS<@oRS%KlwaeWAYg*w_P?$4`l0Bh#er3*8s%yQT_#FpEnZUKgK zM+I}V;v|lsfKP4It3@8^`-3f1>X)nYr?zrG%VjEg6E}3H^5ZSXbIm$W#~d&0PCztp zEb#Iyv>h$l`BGn!ZKNw+ug%{)(N_UuX-9p)V?VZ}u_vWY=GtPgjEe%T%k&=Xf30Kx zRN@|iiGTnyy3y)i4&GkzPA1BaWpo;K*gEY7Tfy9bhqr_Olank!P_esrj~G}mL30Hb zqSVL)kYPn3=)0|@t-l<_=ePC3EIc{ZWJnBf!zhqOQ!~@v)Qc*rWX7Q1U7?DLGjBt; zhB2Ku^}`l}D~T3( zm1x@&8|fXp+K*&EEE{BsX47iU;>VC8=qlCXXyJ3^tPg1{z}oZ)ZytHu)3<2=r>xMA zM4Lqg68$A9f09bFvYrmAQY}17 zx&0+PGX5-ki7SCBI1vg|}{Ydgv+F`t1psoy;` z$oXho7SS7^CE#4Z?-MHRopiP?&33IMX5<*#*gXO#wA{LTT&1`5ZuYrzHgHE@avRj# zKBPK&0^HJkrmdV{Ui!p-Q%b$FYj@55hXVXcW$E?;1Y{{9=J|mnXDgtPdsV*lpK)`- z0Q9<@LVs?SXxcnDMwXvppbgd(1bx@|)SVvneoA*4Rk=WFIVKxx*{)%MkgXPld_%MP=LQ_ZxZ5*0J>Q@+kjRXY8rcmP@)3D^)ed2N6=ZQv(((V4am z&xs}0opSYcw4lv5+{c8<5|EP*p+4lZJq)H@faxacf%YExtUDO4XPZM-Sfj|*YTQxF z(FO^fbO-&^BP-ZMQ$lEGaT>f#9CmeXW27lM8=-Bd1L1lOH!WW@8e`fNo~~?7`$aG? zjm1={%ZlZ2*dmRiRdgV%Qn#Awpi`yy2Je{1IoDCdsu4AkS}hqwG={YJ z2C1$BIwQcd{S#7s&I?X^90D2?j^js?^IP%z5p8;4{StOMFR? z+Z>%)2v9w`Ye}vf7F)Oe+MK+L(pl)CqD5njmGakv&$DbR|zXKxOTvBWQUVf z;#kR)qR$Q$SWtMhod_*Tq=G!pD3&1#OH)p2)0KI_8Gr@usV{`yHAKb4?7%rWN^qb& zdwyE!i)l12){+08te$pP6&}Iysh=LE4f(=|OXBt7k^LslY{4oh(VXxKFj0*V84Gm; zU3|KKFI&e}RE6>P!`JC0083i7i_-}x9z4-}d|$uVya3 zf95+EIc_IQGcGED?Gp4YJfA}8SJhFc`2JeIpyj6f{YivP@*V{RqN)rd2;O6HHlQ*E zIg)ePkUEgcrgHZnX*#-lBpyxl|cIg2sGji61CbUY|QeSN9kpr zcA}$8Y~xCL_ES`!9_sG-4x8~joz_pdJ_97(|BZya5v0yLo8Yq;|CDC?@o3!>zei&I zaSTl|tAh<&Ce3%1VmVbAg?hTb!h&WZEHo!D78$H)hL{C_oen_cwn*~&RCE=pR8Vz3 zl4ZRTvcU-@97swynWg`8&^o9Fu4<52G-as<&*66u{M(Pa`)#G|U6-+2<6-^9(26FF z#Z~67=!MUY=bBXN)$Gr8zr+CN*N^^MMJY}e>V&hux#!MT^P0xPxKWM$*6E8gF%0d% zsgpji#$KxrKpG+8wvvH*X9{Ft!lc@tIj9zx%zcBg+cFxBJKkz$64RkVD1(IVGKx9v zZlCa=`T>PN9MBO@iP8*ZFTzR8Qoexzads=TDlu>3<=oCi|Br}nE0zNMkb&Wp$8c%o zRd!-4v2Qd^`?YuHb+Bja_H#MJG#(a8^F(<8;or)y*6Evf0)x~3XR>&PF7fs9*|x)D|Nj=2j^i|Jf-~6L zDk$nM!{E+b4QDo;_EYno6S^f%rd9+$7azfq86()ipzQ?JhUrt<^(a2@Hmga%o{Kdt zG%gGiwiNUyi;a~WUq@!!TBa3_j}Tq~sGN$7&SsjXELGH!u`eH(A4pF5LJS?^TZ!(*&6QratoJc_q}ns=Tf}2 z5Z>3kAAv?i|B0el4JcewF2s&Gp%$kht~j81f4ewbL_8Fo71;5v%qll$wRLDq7X2)L%^Nj-P1 z+|_om)Ct8lj#$<_c^VS_?}ZUVR_KgNAE!cGvW&nJ-G^}muxuBuCjP`m6Mr9CqJA?q znFfg_1ztnAI#*vK>b(UMT_nBY1<6EVf60BvD^lC!d8L$UR5SHVW~_8x41Y*9jt zWX1Q#>20&7FretAo=-xG)U{=q{Q%lnBA=u4||L^td1h*_VOL9n$zYXEo)vynre#bRUB1kTVLF^ zR<>3F#}@G`?^^*D2q2Ak(@|lcN=~LApZW(>sS}&0{wMw%3DVJig!R?r3K4cFaS}6L z!qH;Q4q3zZ+iA#O_DJUsnP5UcXw{&wXuKtn__oFPb8yzfeGB@(dO zqV36}ZK@a0=pK?InQ*@#)x*cgE>eG&fZ$3GEo{F_;X9-4{3QPK_IL*y-MdFM@S zi(OGz%})kJ1tEGBUCIzySai#r=ug@YVIGbMhEl8IJM@)a2hSu8JO6_d`q3YeJEyYI z%V43G0*t#*g0`S=&`$~N8zrJ{I8k-r+9je$sQ?qMsL_`t7u@o}AL1n3QAW%ch=Ibf z?&4}WLrJ9mvPnF3A3kMvbS1%DOf5peKMYwY`p4e`J*Vy2FyIFnDE~;zMs?+|I3=NL zm@SjibQ*s#;NTsLyVX>3pqAysI&x zA5a%%zD(eh^&#?aLl!QiJ>vk-^cC@z#m|e|81V%n4JypJQt*kpJn+m2Qq$8x1B-D$D)pTUs+!)QbOadr(fH~A%O@2P;9|=rT zP>`b(geJ?yP&Eo|-C|B9C)c9vBS_6AoCIm%Yut{+v;&62osPxDKGJUoN2y4E&>i!t z;;eflx_yO|Jid_cbipJ2Q9S-M%G*<9tAwZWMBJ-lbu1riJEUHQpIhFmiUMJ(FsQqd z2CwS@Mtn22ZEP#DR#}6-ulWM?5)TVW82A+@?3pAWYQ>pJk`T}J5*F_i&u4W-me~L2{RQzIcwx=ijw}u|wSY%xl7Hi{pdca5& z`HSkGsQ@qi+n<~h8FnrQ~ZPAj%XA{l8Zf3u+a=T=GB)z3>+w zmi;e&8n(6wZm@fK^ig2LK8p2sxN8_qXTcK?d@et!?#vlS4K2_7XJy~^udiEO+qOCw z><3j3@|*>sgUZaKyrpMEr)UEU8*zsq8n0({<}^hD4;K7Zh;hdM8liRa0s#2`sUvPN z9<-ycgI6zUc6I>Xgy#LYSoKJbvl#vSpj92)ONfdT;PMOW919g>$F-A+fsqw>i%%Jt z8p;KDie4;^fuL75Ih_+;ET3N- zc+6%}WeF0@1nV1UM^XcxHB;tY-fxlBkGHwT+$?w@J2*WmaL2u_l;STqlyt_cI8HCd z4^eUD)hl!S&*}0CzNh%GgyvWlEREz1y6%<;@4?nf04dF z(&~7{W#mhdrxTyn4Ar!%OL_~&-#EVv*vFyzb5Ccudz0P+_HWy6r6jQXnf@C>b@Esv zH;ZSVHXhZFDul3gWG7yCLltA2vW1fT$F~y4-^Dh1TZYxs^wg5)_*YOl~|7o+xYP_uCwB(~1{R3KX zLTrL^9B?dkgm7LIdCpC>tfdt zhOi;f+#ckFt^pTL)BUbMEr(H|fNL!$!Dzh=w1MXH>5f3nr$Vatd1Jlm4H;fiuEAfZ zpzkxA`E@J|H!GhU*3kUmWk___a9vtac*?SKyo z7=QwdX|V=cz@HQ?HqQ* zlM*<^sE{x2OkIG>#Tn~IHdSL4I{|_Ig<6PEJTy=FFlk(vjg_SvzQUf3#^8J-`RQ_T z@l_uckRD6`M(-2eb~|-(0fna+12h&9N>g_7l!2#r(YFFc;#7tEfyx(d^t1)|zl9Ig zgRJV+yWNd!pe88kdLz|P38db!2(rnD|~{i?Kqc;J>v4=|s`DlV#j$hFj1#Qq0X zL4Xq$Ydva`WthnrY{6FYWzWV+Pe57Vd~g&z;_6oCtt;urjbks9_ zB`PkY=;NQVX?)m&{;B%lE`HDFgkpdNINM?KyNhhjENC1@ttCTyBg6JgMBOg^sluR_ zrhWhR_L33Md@0Vn|M1PGhFj>lR07EUYjO$|0v$EbDicqGS>pnzn zG)=s-OGZ?6>KV&vQQ6>(WgcNtCjR9QBAw6e5h(hnCr15%4K>&LZ}!-?wBotXSZDX7 zDE3`wB=bbRxkSLAFLy)leG(kn*n|3{@2zu;HyD@|*&ZdZcIXhxz{DwFkkB|Pj@+Gr zyq^d+X^DelEob7LCo_x>TDdDa{}Od=FzQqowZ~ULmG*+N&9T)U`>RjhcJx}yeP~gj%{#I%*grGed(J1d!0HJIj@j#LzzzwcXb-nBv(7XidQR z@S|U`Z*ynUsH^LmG?XsdZm~rBtKnH9ouBK43@*l?uQjy`9gJ zWbHZ!v5!kd=NoI%RgylhR@@+b8*lLWSlQn3`F-JfkAOS+YXQq8NbuL6dkkpH-a|-g zA|Q(e&XcW3xcF|XORRD`vHsE~0w$Y;%a&o2@`ikqEF;(0aoB(Nf8te~^ZH&$^$Zgv zBfXXjH&$=Fjysf!-H{LkIzx?Ro7$K_-u%|ec%Ar1tazxgU=)J-8#YG93oyJUf6hOf zBgtQBt|bM$>0W!7D0>7LZ}`qKUWUaXca*1fZ7Axr=NI!-62q({py{XHK%n<}wKOKC zHmPE3^6*x7`cJM|o9r(@TtB%#9^A>zdYcTDsjCAR5iD#TCg^h}Z zleu<8hhWn~yr@t?`Qzw{iCl)`n>wGyjY@A#HYwGV-{CndNfg^6;$Y_1B&6N*>u|!a zCF|e{{8_t$Svuh^uS_T}i@1|SI^Oq~N)MOF!$K@RN?vm(HO_#=<~uTzt0j930-XCF zPsB0LiodVir3`oORDO&YD-8}bn3C9hQ+1Nb*!|P$O!b~fAqHf{@lfJQ5T|7@&fza? zKkrx1=5uOMT2Q2BGDenq`Dop-`8H-)3nThsT9$?d{z)*2o6f-nIIwtf4#v)!k8CQn zAu^Z*3sPamUh@5vXYvSd9~Od2z%uAdOD=HXlrcB;lGiQ#Ki@}UR&)C_4WM^_;hvSj zt7?UK>QgDdLjhy&R7j+8d~4YMbs3ef`(v_5O!Nqnw|u(Yv>;m*h~l%eHXNgBz}YYZ zysAQ?QssE5`G$~e)fUDMVV5|K6VLoj@NIjF+Hd~t_{%p<;@l-b|K3&9Xi$#C`Ko&! ztJPvai)d9ye`g~pWScgJASMc%b&xVB4fv$JMLyyn_oz|}q1YfN@A%JU8%(P6TAboN zw`J;1aWcneUU;(KvD6M4P9zp&K472vbH~c(84b|vENe~H*&Pk0Fvk-oQBv6;V>>Nk zvwe22gP8x;`R#h=PcR^Lz}ITJH+=7lC0vR@UXWnqwH@b5PwHY`!}7K5rX`(*6J-o3!7PWAze07bdk zr62KiJ;T{m{mD_Q&X-FCKV8w6wu-+@YHr3vkTU>f>??a32C+=>wbm?usD)Lb;b`n7fKA=i0=q$ec37s#F zay$lSQ!$KvWmyx&T+}tV07zQe4ln(6E+06=7^;pvT+#+Aqaie%2Y;t#uh8e{eum@7 z7HiAxQtY!)cT21TsS8SGC&txybf20V;X$-n=6 ziW-RtD^{E$zIbBy7~wR#cxSze|d!0s1{|NmrhUQIDImd;4%ujR+cEZS9a$po1ORirKEz7;fKzj)~^+*5VOq zFwukEb9iPLjEE$L-#F5WBZN}Hf-5^63O}~t?LGuD%i;>;YCvm!(&x8L z!L7BjnX21^n0r$#I*bHd;p)6f<0lX6sgT>Bb5J;v#{}U6*aHp3O2O*IS z`at)&m5=fV-ge~j>qOGnwQQ%&)}xeOmbzq3Fo z%f{{!QYpA7IhyKE5fWPW<=4B~KYw}d1y==HTh4dRn$k6gm@d~0)T?K$bK!!3AtL7p zvJz0rV%7M+B21_fY$)fwx;P?#*miTKl4bbDsCzf&@&lqF@1mUB4&pit*9~s%CCbVN zYZc2=R%<<%IQ~-(-m~%l#MQk$elIe0-T|FfoA?g~FgbQ3*(!F#%aH*Sm40I_Q(Zr6 z;Zs*ABFRP^H_*BEL`IJYeB`ajDoF$;>JQfs0eh5$bbQ7U_kmpxCqNv{y?>r?!~%=M z39^~psN2@u=p4CX)CtC3=(Xx(%D$B6-kyL@9;<_-$MYNWEhy(VnyO<8(a2h&;y7I* zFe9skGcPK&Nf$8pKJz#8+=UsS)QQ)L<$YCcDq%8?@LkFPY@&OG{qapNUPtj=+dc2P zV-}U>V12R1*XS1(86UJEJ{5BK?fKmAh0!!;>ewo`FO8W1x#<1I`r{cQna8}4=-;d7 z2lwh5p@1&|k0sT?i2S~kAdw&;g+frhBNaLHIuplZhP~~kf*D%L&wnwu! z`yHCnzgA$K9_wpnkl{ncepoLb?mRt$%yiEX+sLMejng2T15%=hJ1)L?Py|CC2qDZ@ zl*LsW42jyV0CRIwsIXY{NBSTUmjqK_$|o|I9DbyJ2=dJ}f(hPffrN-&bJ7Op6O}?k zy|^@*)HBg;DvMj>$GpWh_!zlVaPBIu-tFW5O`A_-cFSe&t$>b~8J3x|G3dKNhPKfx zo@cp_W|%hl4P5~8*}Wey2<8J=@p+cz{$@lu1gHUj%6TS#J(7rB?z?{$*hzf(mimKu zY%NhcOOvuB-h6khu%~%}Kvhro;o47EkR)~PH%~HnA4l)`D1IBzyqba$1O=83E-)=c zex{R+Yeav`%5dlt~ft`Cyp9Q zJ^VvF*bUcE!@@wLI{j~YGWJez?&LDGkNjQmECL|pYYtlM&eKB7lPki^?t_^Msp^Iy zRFf@8=?o93i~yHqt?YkyCO99hiOC%GV&XF<;dYYLWnM%5-{ixiVJqqA+u{YPAc}l+8o3DZblr(J zG*Lpw1K&YOJmY+OJTLLgoG2Q4j6Af~L*;vTu9oODjW&PN_LK{TB<73)9);anl8Xu& z^2HLt)N2C}IMoL(mmL8j$~58uM=8qw8s>xv4xqa>Lf#X-yI4S2N>bPuupL@d5d5j8 zy6K0SStX&L0lWU#Y#OTi>H2wB$o*G-R&an*fUP1lGfn>2r?vMLit+rdOc#Cl{5=YM zk$>Mi5zokntqA^{hZNja!-5&-Q)-A-lQG`2H)yZqv-#6~%%)K8a_CMh3rNJlgO5h; z{oq#A%U2F)gw!qsg^n>~|vx{{5~(A={12)FHX$K!tKI}-q2{dfe)FX{Jiiup{Tk4` zek<}ewNj%=L5WERSNmS$(*bMLt#%kQKzMv_4632bPcvXDi76zruE&cL2c9O-76DXa zcm;khA4EDM9rgtxx4l{;xz?EPWF)6b7?KP#8oBCd>ZDaBbKua2kUdZyWIi;va^Fs4 zOrb?){t7_x)b_mjsf&`-<>NpUJGS}Cgd3fB`W|EAu1wA z0dHsJm++}6<-b9=A}w4R=O|)QRp4Mhi#bys^TMbk4?!IvlLsOVt_1)SEeQpmusba zMr=cy@)|C2IIgiijzjS~$wzCpkC+WDNxyk=Uu0(uus@@RUPfO@H@=mbK*y<5r49Uf zpfbRRV2$e%5MXRTG0-BUdwU+a99S?kTk{Tgh*uXzc$^;Eg z(Mlz%o<_~zaVTq&$wu0=XDPuC_XW78Rji%>KUkJ<8?4_!4E*`Lq;71r51O(GBrwoL zflxr1t4cGSAO?Ohi)MWIL8!!5hIF@VbP9~ZeOoFzj{CMata<{?XDru>yeysjbmaE@~U$4=MA6dNxKHl{Pl24nE7e0VIEVfboiU7+m(E0yzML?N^^8wCz!sW9^;Sn15 z@;D2?o99oks#(?6mPCwv?R}#F&8gWMw;N7w|%f<9y5kYQ~k#^Ys z_i%`~)$!8|`TD2`U}c(OY^>zo&AIk{PyI5!>fX_>tn0&Hz05b7f1`xMLIy{fjSwpg zm;C}|!4gG*QD6J=DZrbnt9lqHksDbTntJ?xJigoC(I@~C zYA24&=-o!7Wcq@o#8+m|Iy^B~&9)}YG|pUopW-Y5&Z_;DbazaU3^B=vs{&JNy;{UZ z6HM+8`uu(4StWc;8M9tC3G%J)C}>*DGWK16m%_%UfozWuJ5adXm9uL^t8tV%Pgf*$ zBwEfa6|CkLLT_BQ1pe?})oWe-U|E>Q8vGLJ@uaD2#&OH3@vNOKE&JY3QO*9GnuPpwMIq?ZO6SbNR)wPc|y4MzfNp9CU zUy#DoI@l>h>JF(e2PJ5Gh#;Uf%Q>p`zJ)BgVkC~A;QL=f*d6__U*2uhHU+ixxz#np zh9WX`>+|p$r@ zOg+&(Gl>_y#!Ofyml{xkP2o+LOVBT{dmo5>KY=PpE`?y;hx=F)>p)sue9Teo!Gh@N zVYVoMIt^0{E5PRO%`C=WR`Y?V$eYtE@-gzRm{#NWvzZjr`_s5P8})RWxY4GnVO-t= zY@+33%*O8ZdYF{5JvKUq7S{qUuL~2Dtc7G&dS0>7wX@bnRIYz+izQqc3Eh+}`=MeW z><|1jDuN7@R~OyAR_a%wL&u>QCW({gwJI0Pl*P#1eYLhGpWBYV)?!T}7fg}lU~aXw zsohDh-+8w42r%qE794Ptj3tCzfQM2p$vo%>5>_S5mI%$kkFI8{pz;0SrAzeu0Q^}i zOxl?rhl3tGl9$pQO-t?EXDZ>h7ZE8DKh26aI1OnGV=b#MzkM}DUwOi7MCu_I^W%Y6 zRG*)6WGSJ3w7xsxvJiS#(d3@-)#1l-(>(qF-j^=8$+NZ8?QBM#dpTtWoGy>0m7Ku$+uTsCWupy3HOou zsB-(T9PT~9hrJFp0grWdSyPKz$dOzP<#2YC8`vr!3VSXk_EVtq-^hj&ogTreqZ{fa zA#P9d24zBc2wUViMf0m`%LwJWxo9|G$lbi1@71dRl<|!^95#P&x!~bs?bWwNt#%dS zS!qGqmB6Cnf>x(SxE<*o`XxD^I@al=YX9RSVQUK$FvN5(TybPJ#++xX_YM!e@ZKCi zrjb%ClYe-$KYOR%*6KfRkJL5>dglj)2|TQUR@BkxxVK=B42vq@&gl6xg(oF`K`Wp~ z=EmDu7vw`71Y(I2Hq~+J`6cxO;^ao=#^B%TRFn89Mrdn2E5o|!-t}}}xQAE60I4BOsJUrR=eHMX;Z#b89`xqdNC&h^AlC=I z#0qxI>2#wy(1b~iwvG9kPDUJy&cHXy5Q|ZF@5pNeLj?ORk)nrJ8m8GyB|DO!3vJi;(P%t*15WU7#WH^l!wHmOar|^M7$%5?w!30OHW2NiT}h9?M-*rtL+7AreRQ-~>W8inM~e;JcD+E{4M;+zM=q6kAAQkR^}spKrYeU}IV zdTVt*%!uzY5TYH8x*-pyL!t$|tdxG~N^MSm90*3E{hkutrr@ zCkCP+?5DLc$I4*4DEVQZ{`nf19?%9k)+80*_!A~p-wUZD!KK|9TiFsThp3BG>3*3F zPu3jSfHmxI%_Xx9gVQrh#I)3tx*xXcn*OENaqxl6W#f%L*x06goZ=gbtRO|qo!&Qd zE#gFB0T3BjR+dXSyAT!rO71%@D|SI4U4(bTA9WaWX-jA?kBS zlD=96Uw#qlTH?huPOoYx!eR?gS{q8H$)L=-v)B45_iY&m-ZELGJCo2sRu!(#e zyW7`BDas^e)Ga7hET8pf?KQul&N2U#M36Vsi`I3*aZ~s8OJ2miV{*g=#?Fgb(fR62 z+MlOkTudLI<6L|hhOzihZ`HYhj$`IhxEjrbXRctTv<+j$21|GlE z?*5EMRSeccfHqUOm>(x-;!i`CWXuAxLsH4!L#NCKND;F4t(D~zjb(Otou9b+W%adE zzv+~EwC2*#kY*Way??z{0b{jlKR~}sL2tZH7S#8Eth<_3-mbK)JTIz7QNu#;y;Ziv zX$d~>rD51|xO6TKHEGMvZrqDs#PNWidiUaaM8(pHk{?!n7#Tlb-ds1t^y`nqRYaNb z3d+slZT-?m)`q&;vWA+u&|>qABjhdudcT-c#8H8rP+krCuR=n)m(!uOsX4y@bL8-e z@#}{*%)c^8v5$6h3PHH6H2@M-1G}rf@k~`~{WSPPv*bxp*2O71XeR{(GFh63#BbJ> z^6H%Ld3+eS?mQXe$8|YNHyh$Xa=>pKrX*#`+QTCXe^HXP#r}xm%yV%oxVQxOS`cX0M_Zu?t5HQtWk z(ZhD6&14zml|C%}dF;pe%q77<6FA(5Ah)7Lwm|#(`SC|;OVJ6tyhRjKiI`dhWuMn$ z;}d5sBn=8%wWgF;AREL%K|I&KJ0`Ww`Mu_IBsO(NZ9sn35#RDL_;u+tADEm;(SEW7 z9hdkRbU4VHIis~;Z2!~5LhFP1qE#FO>De?m1!5${0lx3}%~)6Z&tAo5dGhfFS8aT} z=~C6UO1em4X+DxkJx`b4{_G+xHIjkfSzY{#k_$CcD&^}mzu zeXo}M#!e1XxUTta^`%y8?KV_Q!VvF|g~*h%Bi?f-lZta8gskjYzN_yOg@HZ!+3Ct(>-hX0d zP%8YJ5zY2iCiZPn{M{;aa7{Y4Xa|j$Up;W>Q0c;93fxNYobBv}y$qGvvQ#b74XOo9 zUBcy32XQ)1eec#|&nOK^HCtN++4psO&syt;FsO)nzL=^}T2LEM9+?_o*K{C2(>g&O zUM90-RmFSQ=ifSUm>ebJ$Xot^TGSYTcZNRQw{@XVIPBWysZ=v26kS-zMXxavWrX3=3%4WO&#j%N(20ho~6`fZ9u&< zTeSb;Sh_ibuI)Oi_)ba_1Kn8d2(Q|D_nSZuJXTJd0BuDxI&Ydua)W%>J6=TncVDqC z{UFNl(GMVFm0+0sEq8r*3vlyOK!2^;4V7s{$egLN!k$f4vF5CWmt(DIL@aVOA{A8@ zcUTF%zfNIBgGt)tS37ns4vuEBqAx}k^s5UoH*TW)SIVX`aNsz0r43+&z-4DF$@V95 z?RQ z;4FAz(m1!i?UjNb_iEG?xKUcQ)y^v}EPIp0kNw?}Vt=N!le*9^4OWUQe3O)QTc(uL zQzqcrQntIDD_`Kedx1EUtYxp}pJJf?qp|8@6rFQkgojPVuh~mOsqy=IWwypDq!DeF zCv$Jdalg`paZEyi){pMy;a|TeSv!T`^^JCM3u{ED2J4xSDu(@oAdxE`G`Ae-Cqjji z1_X#HWUb8vCC$}OhOL<_kN4{4d8jULQ3uYEsf1Z|wD?Z6^p||15(R5NZuME_v1`Xt zh6|r;!=t9)F+KH8#ru#kEfzyYtk_^yIhR7t79(wwFzhd#){-N3UexP1OoMemnbDW`rKRWBLO7_JhgYUPz420>L69wd4( z(Dzn(r;bVaDp|(r`%UHOj^>lJo<&-}_7(J(r#}5d&m{E(Y2Z{b@2J>X1+QAy&)+VE z|AVkXF=(N13ZSB|-03P+yOzg7v%mikQG0)0Uq1LYHO}>$NkG|&tqc~XtbFe4!M_rC zH{#@kHfbxC8;%1IfLEWAM;)0pylZJ+&Jac~rJKYSe6hL0k_iCImoeBw>xYDOf1tEo zT1nck==;AJkGrV9e64|CUYSw4;!GS@Hc!QJK>X}XY?EixX7P3@QO4@otMNAPD*1*< z`kmriqsi~6L3@MP=MMxl0X|QMN`F6myNYTOr^_4DFZpE!>;B#hF9}Kb_?q0xBb|K0 zTGx1H?V5nU>BCj?r=heW&t9~E{@1FXjTL0WSQ|ROQ=M@FO>gHv$K7+2c8ih~cSGnkvRn_oNi|^5+k?QOv@yjw_gTH=x^e&uT6iKvB;Y zR*SfuJAL1s49^d7+aLcq- z)_d&g^H1V6XnxhsxL#iK;;rA6xSXG4pgG$hH-|>AE^AJU4yt)O*WS*cC%cYmDyC9d zY$mbCX8niqI^|L4AX2PsHwBVICpz(u`+cPqQ3L_x-Wh1sh{!|X6Bj%O$zvk$79~e) z)aq8Q`J927pqJsuWdO9d>n5CUhEBgMrBXO&JGgq(6c@LYFQEa#JWh+0*_-%kzd`eg zLzd8CUapTbK0Y~kFrdcAgY8ed-yOk)2!N`-7}HmK$qPcOrWTzL`^dgcpP>!xdTK*t zHI25BZ2Kc)A@U1@RAmL;PyS$*UWXz^Py?v45*HdT#s98pQVWpAyUl6#i)v8d(y8iz z!GolZ8;T+H*s}s1%}4*pN754gNH=)A|D7712RhaZ8&;pXCLOtBu)w z|3S=TsHIpmc`RcW%CC9WdE82yU}gJL`4;J?q#u>mW--?=zxXEQwxHo(yJH{YjL>g5 zE-UuauJDuX10v!hnTF|{6RI`v*h2d%1*>&KO{a2_b!jJWa{i3n@)r|}=$b9uG2=Qj zaA#uoLy}$lt}Y%MrcIcQGhwd|{nO5JOqEL9(1_trr-!C7Z#GAH463+td2;nJuMAhz z;BL1j7S2wYNGLd4#!QEc<}w*9`F<^VR8_Xs)*-b9fHm$jVP-779fMAsuE7_n9+5kB zAS`vS?^)}bCD7xvihSJ8$HGDr@u-c%&_}P>7h+0K%rnaQm&+R5eS3d5-M1}))>JrD z1!{%QBX+tOPx$S0+3gIQ439S3*1sEsI^F&JGpL$RC^NDs{=K&JUlL_3_W#uyR3v;x!tUmNf{*8bWd_&LNEjXPq0q4l37q$Kc}b1SzK3o& zgGm+naFSeB!Tu0~aPFI#1bKC3l4Y|>Hd%V)g<_&oH*kjSxNd4-^MN6PeEDp7^qhAk z!_BPL)(;jIW*XxcN!FySFQk0@Q`j-(@KlKV(l#G7 zR0}B#iCZc90QTFmsT)p362V!xBt5jNn^Ihu(3U_kG}>SAr4v{NDsv?>0}f~!x2{>z zMy>zTGg+13x;uV~CvolvIVyjPCXn!_l?FcRk~tD@rCnNpTIFq`sUKx`cNE2`ZpQnZ zf^R9mk@C%SHt;)ZLof!v`M6mmiY9AF5A(eIH0ye_A^!wrdkT^!f}VS@D9Xzjz?p)p zer!WKdIBVjwE^G2Q1E_DPtuZ7XO%FYtLDYmLA^Q=k;;r_ny5HCh-uH zS<*(&>sbS-vXjw|VPfZP?_V9VC4ngr2@^HsYyB?>yJdvqgWnxyWHwBOmxWSUPtw>XiU6#%J)|$$e8N(qCq-!R++BLNM|N z?>v29F~oq;B4O9KS5>kxn24VpC#inT*=E+X#_G$D;|ZXosI0*sFH>lTlsj05OcT2U zlL9}pth)iH)zhp8n$!HYZC$KDV3kerYGkPPv<9$cR=sCoOeuBYX0N-jHFmhit(T|v za^nC~jvumEl;q|l=Twu7D6Y+?IG%{+e0(d9;P`g@O?CuaKXk)w5t~$T*oE7P&V^T+ z{LvN2vN2|KK5LqlbWPb=O-S-*9pac;!O=NW-DxRb*ll=$npsfF`o}c3$xaAte%nE& zjyKt{Zb9BZh?F#hpe(-miiWIrt=}&?d%JhAj^JZGfLY;y(z6ERO!jGT4!qRSJ84nHh*jl#uU48#W z#+JZDoRdP2bt`QInk|&1> zG=BeSVRs#C3iTo$)xNs7%^mfR{&n5Nnb|-S&P!>}>}$@z7yb&+WWSnId~*9{bH8#i z1CSPxI1L}zB11IN@h2z+E=?7z@GbXjg~Wy4m4`STTkN#Si8!l?2n7rByaca!k97w( z$%{3jP}#)oz2QmE@J*%bDRciWNp4%JV~wLIbY|H8EV4n8i;u~q;NhjZO&Aa9zRxWE zXEcYBCWMQY>(N>9nK|LN{LkpgF(b7sOSLSj*|9*V_@8Fi@)I^P?tKoVY*wZI1~F|Y+TTsR@PSyV24}@>&}wYHE5<@IBL|K9meC>mtUv^{Zl^r>E|y* zc=_n->CcU5VJuE*%c<`fjv~=x_z5!4qrC1qRHhD`>hx#?h%J_OKAm%n1iW9$>10{4 zq8vIWsJ~1butMe6zD}(p<`N%-_>&=G4%A*!{o55{%w6AgPTL&(tRkMdv-?ttu^t0a zwhnrvBo|sAy$n8znSUY<99nh>PWegY{R!qv25EV?jkfj6o`>U`p4#&A`R*V7TcI%* zy5%Hct(f7+I>ilQxC9ZHF}j3wo+ffG07y>uck!)DZ_|jI(f+N-4aHEp@iizh^_35E z#$6-;~`MqX5xqAvB^4;1$xXmDQ$YI)J+nv07s( zi?nB=o;-o6fZHxezPbl$k8F#fwZ)8w+w*Ci?IM~VGU;Y`pRn1-Mx3U_EKYPiLkqTi z^am)m-pWYy0$P3@k7)Qu^5(QGEUKUH4L+LQtbwk5+Z!H$Qcnf4Zg-K@13mBIdEfm; zsgu_BCUkD0dIPs`^;oNhjEs?(g1(Ji;b}zn!vN>GZtvvsY)(Q3Q|_pa78ypqoffIfgA;{OcH*WOwwN&@o)Y(mH zC=#Aym;@Aw`b+Y1pj(zHMM)$%njjgwC{>|4wxcIKcgHbJ@=?gB4Vx2*jl4{ph|^*k z&f8jvxwtB^l6dD#GWzfCV%y_{v<8HEM7STWT;m(_2-AFmUW0pGf9-F2xV(If{>C$- zsXfO{Ohy@RGk8ktYDslWM&uFsFPtqTrWkdCAU>(^sdMm_NhHy1L2omXCMndz^Y3X~ z2e>myXTeCmXwp{t>+Oa#D^Uz>%m+RD0TVV*!%pXGEtO&lzBRIt<$%zv_cki+g%fSD zmrOl7mYQ0CRrOUddloy%V0j|aKjq8pJK=xE&8`XSnKAVC=>I;miOj?Bkh-$Q0x+v> z^-0$jIt*(PR0nA93Y=p0$|yIatA>2Vx*pxnIqVI zp2W_WhV-A6t^UZifR(vCeg4|bnXNXk+yNADlHs0Z@gGnV5x(&6?#9M2nDZ?C7HW?7 zA3*TflVt-pJeWQGg$5SwCyQ#=nz~E~f6N~d9%^ATyc6#wt{)Da=#3KlyfarEGWdL( z|Bj5etbH(FMf&FehoCFC|LoaHOKRhIL^NPvVKI^Q?%$#Wk2m3@x{}`XnUN(;E?n=k z-^OI;R2AhEiV@p~0T-hwq?U8nJdPbMVh@m)5c=0E`7t9oi`p5d6b!REgbYScPo1&c z;m-|YstRut;lhFt#mG8;*gmB#T<|97-N9Wqjp>!8Kr3KyI5KJ=U=$)Ygm@={?{P_o9)T*^()D z#fnn7QG|UCP#lUMfB&fw-~voErrtWv1t_yx#GHbi%}CrC1ngz@B$KJuS1a2!fn*oB zB^{@(7NzgB&I;dKR9O$ye&2jOVjy!c0W=ad`%RDb@aLC#%}TD^Cc{t32~8A>wv{m6 z`X7tEzuENJT&SIT44QpHiG%!iFoFNl3}mH&ips&hkdb{%#x8Sn_u9Upm31xP$eZ5n z$U+I&e62)#tB?`__@(gxTfwm8F^*U719YQiQx9_Wf1(YN=?|1$={iCQ#ww+p1=A^v& zquYlEl1PD$Dx^8xLs(52DM!pvAB0f_(yFtCF$ui zfhL&thp=PVB-^B{`Tk~Kf|b=4iQUULn$#fxrIJEGmq~QIu6G31 zXUY+dhk>K~D=4Vu;e{7tc>Y>b`!H%(l+R7?E~05PA8xa-lqG~mtYt1dKK-0(XxQP; z$Z7&;P6=&D#LAFAJ16`2xBC z2?rr}&r(34ibrlh50~U%ru4+)4iP0nyb64vZ%DQA_48i_Aq2-B@MXfr>?&aA2@_ZM zSxj;CEdA=xh^L|Dd;5ixBzr!}ifKIsRnu-1QNzNXg3lMk7bK+RFaDWEnx8}T`ZRX4 z{bUyo^mpy4E4qy5d4E&SZtB%%Hs|KSV#nC=k$<;=8tG2+$=RmF~-Q=9% z@cmOd)tg}JB&z>KwXxcd#Jt0HuAEG6UUD0QXFZo<4L=u2K0skl zTgeslxe@A_hatQlkG{yQin@wsbcy-nDbAdAe=n{cN2^7>w zS_h?(Uoh6Z{|n|9b>9Xf&@60p4QT)w>A9AJ57-yC&~;smVImb3707`!e0mfa+i0Gu zXLk%QW-r-Bj@EBLO6S2S!cHy98T9taxe4o43ac>72cT+E%E^zsC=7x%ENUNjJ;{kd z6&7WX0dod2i>iwOy zmw)-7_vaOdRj~r6lp&EzG3V7eQl?i4kQL4*C3%M3SfsvMQFB;7^3;e8`%5f-tb7UO zo^`geg5hjW!O>bkF(%iIf4t9U>%-7Ho8~bfveU6kld{DU8dj-VNp6va<}f<0oAq&NSW?*Jg3`~u)96|%lzh>a+ z^i5MRrq{e?{?>aN{ro&39{c<}W{ru6tsBEjE4+$x7x3JTk*}YLs>&wC$7b8eM?fY8 zTmiS6!kug~qsji)p)MvBy$S{HIcUVMOp+Dv_4+v=y?9r*uQgS|n`gaoH1KNRDN|^W z)xPoZyr9sE<>!nacyda>{)qYY7WD&W{to4;k(s*^(m#U*q$}sBm!3zIgf+*zaH}Py z0%w^NLtVULby2}}7qFTYd@uQ8P_tc{kY6)AlYxa0b5G#K=Tu%4KFvTceBFR|QgT{R zzISEsS*xWenSV40@ash$IHbiMR_-AE?10rDk)3#S^y%D=4{D_m%Z-e_sk**`=Kpwi z7zBdzgUoeQ!7LuLEz{HZGE~qUc|g!x96Upi`GsRR{DI9W;eMqmdm}i3roD#UHKLfQ39JJ( zW8587tUQ>w*{N{uV&qc zP>fW*BA~f2>U?wC&Nc-9uoAs99rF{$f>sBSDy?T@y02IhOwEx(b35f1@ibPih~x}#c|PB=xWkKU45 zv)W>lhWgED)dpa26m0x>7i5WuAAu##T9#?AAwIh9MjrhB|2TzsO7x^{zipT zi08MpB5*{r8{#vUDjv+pESvsGvZ@Dsq!5xAfv1(TsU6J%1B$$?kKwz`XiCR82T)_L z#S-Pr1Ui1ycDG^vtqZHE?s1I}Sw26=CHRn_Z;{brawHpz2=5&CQ%n8A!ziaH5$wdR z#+QFDN24#jY@-0Pet73Swq;qW7ghIkQGgF0L%!Ty@NjUu~$cDv314GfX&5u#oX{+8Y(vxpz$6d zXf3Up097`{$k*gVt*eGMM8Fc0Nt~O8N0}$_Scs_ezjsUE1s*ClnrVN31~_Ur?H9!4 zLJDu~ycuClmIF5;LtUs;YZ1&=UPG91zO&illdI2REET7d{DDouzH86=q^jC!&ZyxR zfca9J{!>N$0JwwCC~-uu5%Lwfb(Kp!eVsAOzpucz!w`NmxA#>(iR7MnXgTMk<@!Cl zZ&-}%xP@Ei%kC6t_``&~00JEi8m^y7&j-}ozZOH8y5-5Nn#YQen@%fV!rDotU zEDuGqtPPQxcc`>2G_P?!8}RSE!kZ>xe9sDkhjE@NeM&P{|O53EWq_P=b6dL zyy%#@GpmIhR$rYwr&0kL#=Dm9WDmaxh@5@FvXK11cs_(?Bsjq!Jg#+OGOW`*SnXc_ zH+RJq_73}#Dzw|$M6ZC+DLFopD8Z4T`xjWx5MkW7n z^6=IdLNQ=HRtWW*96e6qJ*t7ciZfv*m_d<{qF!Q8p@&WKV9i2j8Rq$^6E!CyOpAu+ z9j(D`Io14eW$q!I$-goHpad*PGH12nyh&>Dw@Fxgo5*)@3{&3R+Seww48qzaRH)(g z$YYe_4Xtz8CSXdd`lsIzF@dF8-W9O=3h-sxrU29p4VB5yzXC>Y7B>Dr2^CBESxt?f z-xs2YmMG9d{}hay2RK0hNHuY^mp%Grp`%3&FIW*kc&~>GgBR*C&4pzvYg?j{6`?1o zqbxUmmlHWN#4B81VLR|zcym_^Vkeu3Qb&sT_`lXr$fjU(LTXROaI{2ujKr7k-_8$G zYufpgn-%mjwWhR}7XhIzJHevu95c~1onR)(Tapwm>n7aeDf=)1F=yZBkl793Gw^ggdgDd*J32lrp-X+nbXyu1j@)Q$5J)WQFmivTCpvLodO^vA)v1)#KH(e$#g z(DyIptkK7mPt{&dSgUnMFUSYW>pG3O-!(*KEf^F0kC8sTKdzbA!SmbKLqTN zUM``SRKKGBYsJFE&j-ZoC>c@zdtoAn<0i=_K;nH80AO zk1vrE+7G^zQL4U|QH)%2~5a{uVry_WO9fq%~iO2?j^F_9_X1=ChM z0ntVg6Td8ajwZor)-@GYjoa2lS%Z=v>jI#j1QKwPK{7uBp7othhOPy9B+0(yu$yuBlr zGbr)<{{vSM|V%hXE))#TA4rlOrmMojmtGR7NUe1nmg8BtuN%AG7PYiy0 zTj?mwC!doQMVyD04`G-zOqw4Z>=56&p~X46&sx?65NB3blc2c+65Z3v_F*F`elo`* zLD`*;{t)`>D~2U&AVcd9MyEEe2cTv*jB0B*C2(oP-|9C2?b>&IOrK%d$0%svttt3A z1q5}oYL*9JZxbQC!BW!I#MI_NZU~1C88F;LWw)FuW)_J%|NTU3^gU?caQD+&8Q zCUre}Y8nqGq;2JbR-l`wjYvXOK={djJ40*%v_{JCJhNZhLReTZ8WV*|nb1&K*nBD0yIQz=!Du;D^sgeRgUUK^pO{kg_}n<-o0wpV)ga zg}+h8+`yDP#>OIMU9DwQeTh_ko{&E~A(Z6$#o@P$;IzND-Tp@#P8 z7T=ScG(`73QZx#zCQ>{Zy*}YK=FbAH0QtK)&3cl?q=}kNN76QE{OZ@i zAi(6K8HM@lzI#!gDSuR53JoO_XFRis&7sH5%HeG8>VjHoE}l`l#tHV}b7A3qlA_&766sJ&J;sWJ0*X zr{d>>jK>|#yfy5SG#ttc)P#}MxKx$bcnuU2*%pg;^dH;=m0qh^O11M%hf$zIqdx!h zHYc&+C%7cHb9uwSo`vg{e1(9QqdF{yL>-QZjzRu5wxe>yeSmxWCu$T8x|Gnm0c2P- z5Ok_J{$IDLDpkmBvo=Z!;F7VEwUw@bicnMV#>X%CwOxJGB!;pbrDzle`K(9Q?Scs9 zcnN-%yi^O^5X!0AMk;^#8LjG1D-Z2!M$)=5v~8{tASfpSG z!@Lf!;kpZZ6!bW=1V=630E0`L>Xgt*(+#Aj6UF#vbDKWE*RcCOXP5jN{{Qe789{!; z`&r0L$DTP_B>I_(CMk=9Ivm+p@kdeFWiNM*_1`_4+c} zgzuMt9Z0RUg8vfShgd163wJ)a0!;_(M}{mQU4Tv*<<(y!DDeh*JA5L4SwlZ}O=wT> zbaG1+h_mvwV)l6htI;iffOL!D$f;UHe44Wa^uZSZo>XL1Oy`tRShKH{=6Jngf@~l$ zlH^4fKMp){-Pp(N*+ZV4pT<7>^fu}RMN5{ss@Vde3CJkvN3`k-><3q#Y$@K{%GZ4f zX;K>;T;r+{s4+^^!NNU&MR z6G;i$?3R+@=R09>FRkg)z}mXGH-;mI$BsHbsvOP24D-#T#@N4*aK9}ZOjxpAF)4K!5|acSLalF0=65dSRi1w^lQQKu0>#ClzIg+Ws1)}NiX+gJ^{`+DUg%< zodknmzU0|su)QNpyF~FBcanz6G`V+dNWm2<4W5FbD3V$v8Hw!S;xenjRnPf!`|)UI zq87>kK_5YmYu%)T%0gz55ViJnSHKEG8F6DKpIa$D6m*O6 z%h7-jcX<)|wKB>d10Hh+wDK2WYfQ^Av z%=AOr{Dj&V^F5TUWD6s-A4Wb^dGhYB?C6MM)OSIjlfTfM#b%EWJ&BKw4|(3RYg_-h z2G9qw^gTypz4!B+DUy}Pu(JZEeh?8tI5HHN8E0jOi8>eqz^(w} z#OdOM&gVhOUUo`QZTCJ2dCnzyjIg0!xAf7_brqN4b3;EJK!)}ydA~UzH(Y@?aKa=- z6b#8Wk`FO8Zrt2<4-HPlSz_{|mBTczi*LaFpch~~H{vACashP9bTZy**;?ruZ;|NK zoako(5af(%PG3^_3l2~1;hSKHve;1;3up%^$WeV_C$n4LvzO(lUni*wNo=^*G%`tu zMN&mR7AF%)%GV7~*-hdztGtI;{6=T540FXeGQV~`ZCeqb+|DW+2QTCfB&=yp9%=_yTiX$%mN=@w^#>lT7oXdDi;ZMs}=x6 zdIB1kNdj#)V)fK)^ZWP?F#CdOv+JAS#sB&DLaDYCE2N+9EzkOXzX1*hBF}!ZE&~$! zRqXc6XstE0{`#srv>EUW0vZI4DaT6#Ev9^4fyB^&%;&rCPcH$x7o<;_GqB4KoGk@a zBR$=iXScBN-@ax1*aEb}WG|fhlee37G#L~Q?wS2>loNWdGt0SxFGh}qdj1I4S2?c0 zVpw#2w!wJ^-=o@P*3eJ?0x*P3Rr^2(s&^dhF}W=pbn9Yk~9auv0o*fXF)k3d<9#r?=KmjaB5f zOGuiZTJ#za=oK*ufYMNIxTOPmX4Qma=}?rwJTScGGIMNNb7~Rw|MB$JVNHMk|1gMv zk|NTjAc%BGw-QQ9%Sh?b-6Lm>VduY@bA`LmSXi4 zO3f6({2+!)C0SM|iZ6+v(`Q+7a06kouzSN~!ZJo%UNpK96Vc&UM%Yn0kW}^?(Kcy` z;))8OKNE~t7^3Xa3(+zut*Y?*TsRBVs{7?px}~35TuZ*apA==6n=11^g}If*t9{<{ zEq&;1ZNjEi<7hUdOajW=k8d9(M@bpH&w_9C9LAS=IjJIaFE&b5C*G)<3w)e0tAUXY z?HK$kzmPR~MC1fH{nI`KtT?E@3huyh9p_r`Nqn1~h=5MyH_Z=VsS9;D$CmO&yQjdX zt`m|!>x$dUJ0Zx$Kp+ot?=rh_a(GF)Af622ty*)>!k9g8^|~OlMtxQzDBPEK;@iQy z9CT7W-9MC|T$$gr^iyrZh==g(gAUs|UZo*l4~&1jQf7oV^S-xe$Qm~-gK={ zz?9V+cGgU(ik@HtXQBW+u~`uEZ*J$*orq2w@Pst0cY#g(x7@Nh{$sNL!QhVhq3A0_2Ezo^ZOgMNOOn$3@A-DH#)9=0h9c+VJhuIl zi_mTX64!!5f~D}fyat=I#^ZVX9TBO6bYsP7<8c=TIqoAAKysy7|2KtCYC320VtpU855vxtqICyOQp)acrooJPx+IJ;FX)Oaq={_X3p zIZbi#aV33XQluf6u?xh-9)U&Zr+`)iCURR1B0YJ0_4fhYL-+XgQIA4AP?VRl%=SxQ zIf0b~*5GPGAvG>8CCMp=G#p8 zK?8n~TjDyJUu6{3OR*<0z7pbI_vSvY0bZnb*q-$aMYdxbGLI|g&Y9lWb!TKo_b+p+ zKs8>OWDXh&Fv}-ocd@ALULbwD=ciS|p(_A9+g!qAj81OAx?+)MPnE`UG*itOLmDHu z*&qO?0OobQ(>0J_AFE7bs25L0LH*T&yzG|YzXmel!3I?NGRF~d_>!Hu65~~R&@-kw zKt|@rLLbCX;!5^RHOvidBUzPSw23T)NI3*jQiX2NN{TeBk)s{hRPTq&qo#O_L}2gy z1E+DLIT9vuIrk^}VPS3G^bvrN?p;1ck9*xx@oG1irt_!*0o<*z6p|yV@xA>{e=wL^ zda)k+l+xu$>`z}m3mteH^H>KcC}kk--UF7&-uXMA{M7j(^LQp|Irup!*WX!!#Y6+Y zuH)D@rFQ<{1>~tfV0m9%st2qHA2gVO4;n}~`VdZH?967CaS63zzsy-p5BM~v%OM&U zhaD0?Ue>^@wjP6IwO=|rOgC;cpiY$<|xCz6J z)~3p?1$HENfs@IIf+v!UxDLi=x4H27 zS(Q^j!ugH?Bv*;O%HvG}Fr zYiTOen1~R@d9H6^_}emb$Ri(SA6a{SHaJr=pd6aJ@~r0#jvN^n-5war6`o<@CfJ$) zA@$okpT9f{e?ZBdiN(C~J=%*Q;o;v3cr;9WX=~gh)n=q30xG9Kh)93PA3;pnJ}pLflgkqr&|w#ut=vN#ivH~Ia*qY5wRYA%BS2+Q>Cals;v-5d7{=7 zm-~^V$zk_=bxmjkDDy7}1Y78C{})}crMFGrZN^ON-0M{5tA#%6NE7geCGI2+ zsx9wt3>nXRWjKP@10!c%ZsZ#{(nf-3bSbCC$GuI$LS?W{&h-#{bq2&I%O;FYxjg1( zj&l5%mQ24p!3qp}mt)idt)2l$NMGN9TrW0okKQ#hZ;rYQ{wG=j-No%U(@3+g4>lGM zm4U*3JVyFoQbq{$s&3RIN22TMuRxcW9wZ<$hw|W(ZRV6ONaHB6rh45cx8+s7n9eBR zaxxez-6x`5r8U2Gn9?#-qO_EYR2qTk3S6gk6mJf|k#?1%ZnFfifN&LOwEykt0DJL! zedjAa!6uT^kMR;${;&NN@pzw;+v|JL-mRD0wa>Qq%XduFb0mHjN2ohYaGYy-#OpR_ zyt7Y{mn|gBx|{K+7H31k_8;R5_>cSkODxa# z8`^erBwYd_tQCv4io6#N3{C=yhkreiS8X{7rueLJZcwyZdR%em$%X}|FZ$N4TI-(r zR)mFN_&CW%Ja#B64UZ!qvMM%-v5+iYcKO2$yxASFyxAcK948J?6jPV=HAPl@_k6@`5(@iPYSjW!+?hwtk|yxAU z`s<<@H7&Q5+;a62>F6B=`s-OB^#JY;Z?9TYz|2|ED3W#V(4+rI%)r=dwMwsCD$VRJ zC>djkp8RKJFsXeKP3Pa+y0ngH_|qd}88=06<` z&C=Q;`{aVVhShBExv1N}Q8C+*7~W{`dbF7g4aR3}g~)S62X^nR69~B++_ZMYnhrVP z8E7vrH2)Oc(D*=I-6Gj?ve8hx-2^Tdp?Jp)n}xbF5m#VKUavq@`hQQsCBNit=q5OF zR-MEn`-r)0PNvw>8wV)qxY_!TTDQHR1DrHOI!{|WSUylfa^OvgSBnt)R7>;<#dQEq z^Wm7Zv_HU~y%^o=}+rht=;#$x|g z#8q}|`R9qV3@3a1ja?F!dCVEr!4SHY85Z96r40L?z`xx`FdF`pNfP5F#IJ)uW#lx} z@6j5i0M+Mp|E8XRDx9^bKaa8qYy8eL!MuVe`yDi-pET4jXC7n>@<}wgm0jdw@i4YW zVYw9BM=*J)Eko3I49LxVS5bVh>PiKRP(HMklJ23iM%DS-JY!tC%bm)&b9wHv4QGUl z>e}J!IX_J^Qg=DxOCkKPAqA7W4aU%-SMD7VSoCG^olbxR`Vpm;uI)xv2g9^)MuI&- zcvo&?4I>W_{iU4J$%W#y7Kh?p^prC8*q2-R*R@Tf^S)`4cjg7RwJL}-Fo0;D_1e#n zlD5b;(w+&Io#({aUD_0n?4^hn^7Y=!K<>(Un+~nxxcOt zp`;MG_Ng-f5?QG06zEidJRNW-UN)bAl^w%d>J142)3H4-xri54=fTw+I(&hTpP@al zR@P^gf<<}#9g9`%``Zk?8vNIL|G5WVPbstptem#utO1+r5ip}2?hRlIC^yT&^NRM+ z6iDJ7sR|jgYntXQlW>1m;+N?*-F=id*P@Q}J{l;1X&S^jpk%xTStEYck@Lk>TGpaZCitxCcw8F+EKsqH=*3{a!e!0Bx{s*XR4qcHL;7$(vcAC^)}oO^@cMEGtnJsxixoD#3#iM_+>bm z!=cV(mT9;a@=zpuL!S@$9a)(_Z;8r9-tDJF_QIa@uWZtS_y7Ox0q0TBbhV!%>?_Zd zv{&E%0rTUZrS6@Y+y^6c#ckYJr)5iP=ios!N|fJ?wN=jcb{*X}n3P|B3r@azwn>cl zXK0KvB_VE^nQtLo=YRBBoIWDFhGP{9?uQUEb^Tcfym>WCBwQ)+bvteP`hIV<(Ejxv zavOWy8uT(4&1a7d705>~%ypB{z5d5n(Scg*sWK8%TZDgE-l}W_;uY#l(%lf`b>3y1 zP|^eJr-4GE7Q=OmjL6QCrXZ2#W+QWfh}6B65`X3!S`n7%<{N*e4Hp9U)`;ImYNsy) z8jsS)1Xfg7t$Y6MnD#PA%mZN%;O);T3uj5gaF5VH4NnKhcv{S(u@C%Yb95cO|Ei6~ z61^!HuFn#&*fdgzS^S;$L)1yc%F*d9k=33)1p?0Ha`eWpSRUYC;F2&6(LG;f(biW7 zpdR&-B7Ze@wjQ|xc1Sqt{u1=j#ygGu0aLT;0HU$(ITbFX!AYltaa9N##y^{kJq1mB zuex{Z*YsDWChtfyk!WYPZM!McGPJas1IL7j8NeNs|FQIdiwQh}Jt==11cfe(Eh&H& z;VgxESoJsaUfvd4J2_Pfs-|_v-}obSpKkyMBRH<-so4;Oy+hU8zhp}gNr-0)!YKtJ z-CtZOaU>^#{NnuF;vCFMUYbQaz>@|Xk132hrkr1vkC{0C3>i?!f-(~sZf6$M-cle> zWAhTol2dgOqzO%5x`m098_THhJr+g>4D-1Ql!zgF{rl^% z`6JOAbmMW0Is>*Mq?T7e@@$_fV%6LH7Q!d2vN1krWBA2paab%o_hB7PsvkOc?oxUH znYKF{tRDRYUFyO|U@$IHWOwr!mCv1}QtjRb@dPI$To{o|WnX^$Sxv@ES%IfeG-Mb$ zZ$CQ!GR^N6I%+6HJSYhV(!Yp4fXi4MICxwW)=TSs9m&bFE@UcZJ!U zI*Jc(RXWBUrGKIVS|RBGxg%3)2id@n7MROHNKph%%Z{kAj9pcA^K22%#f)|*iw7rq zO$v%Y7XTFCDQrL?i&kzeq~j)v4a{0W7D;O~^-~))=!&vMGvsjg=4ur3MHIO|Vi@xSiJVDi?w!4E8^lQ4$&WHb z&hy;s8d~Arsi#OincKv44buTPewEyi>)^##4=z|&ASP51szLPtl)eY@HWK^TG}h2p z_S0|SUDvRVJcZpDMqKJXU%98h=D8KlfKhu7#a}=viDUPy%%}bS*&|-zJaV{pyD6=- zEI_2>*K6)=GERYyFOBmOm0t^6RsT8r=#q_}dYEuAz=F;mlmqPWgEtB1dn25dvwu1F zhaYKg^eiF0wl{#SEYtS3EXJGxJP8!Tpd?oF>qKmp1TCq#_Y^KCIk{;!RUbQL!Wzv@ z%#=rZD;BN$nytl-w_fIpIJlKv6R(E>LjVDM>;qPlya4wXyIsKvka6Vg2wdnDcUoVi zyzue(&8uhjwWK>KXRtuC(GAJc|5)$2iaX-I3_329@K?kMz%hoUYZ5TTCd|A2y4!(Ns83sr0Z--hw_cF?wCAp0pBOt%ef{{5x4#d%D_w-wWX&JM1mI{j(@as>yV0^V}Ny4z~1E@o{(dm=&m5kL6hy_O)#CubU`bFIZ($NQx6*(4qM3GYS1j zaH3BjEJ?wm-Tan4H5|EE^K$!4ZpQabKR|%m+7IqmnFT?+1~G=5>tI5r15)dpZ6+F&plDhk>Cx`zNDprqK;$$M-cdTqs7$%bK~ z$hO$X|96vLSy%4YQ>1-2$J@p84Uu};RRt>~JX<+2mQEk9{}XtAHHKt_P1~^VKO%VL zhfhyRK!0q|9ggb8KTTzSghIWEw?&875h4Dvvsn`TQ_he6gOpOhXYt!eV@gZ_^1p93 zlu*qx&o?G2eVxUZ48#xFlVZO)M#S}--Itf@O>zu|j$&|J%RI)}!rk_3q(5e$*F`Vw zpV+ROLwA|TixAup0GRfwoKs!X9@)XQ>yUl@r~Z1am#eS$xEr*eY_g)+Mfn8dpoOF- zKWAxRl)wG8&o{csh!g-+PDl|W)Yk8V1_9PGsgFCiV7vQ9&8{3rHaM!F3P_PQeivS@ zZtS@ez4lGnAX>8F_5JR9V|&TS(((1e>6P)pOe9D0(^B6P-e+NpMy?P_g`w3xUdz-O zN|TJoFN*D6EKu*N0c;3ZmVp$?x-Gka%3c$0<_ILVY>H>EUQGW$p%L(3Ii7#P!c<>mne-FFf_C&pT{*n08WmYmD!7rPbSfdHB={> z0Q5F`&pqhvI|Eg>M^odya zr?9IdBShc*bePZNrF?fI{8Esa3SNrxld)scy+q8RLDJz?RwPWu}KS&hDI!0BLWW-Ujar@#0*$=hTtR3UOuN-15T;oYd^!8~BlQfb=#^ABC@+TcLw{oH**3^u(Jk%0Ts9=J$*Kq{0oTo$ zlunFIS=(nhW$fI#?rHB$XfMI~XG4J$22?2^6Y20LK|TntX>Dcy5lDrvEJnwchT~e^ z_}t7RJViZq(vrrG&206UHzO5I%l_*Ui`CNWA3%0#2TreI8gBAy*gx4_r5CX;;v7uT zfW{4o~g!o^e9upx$>wx~~d6-gTmR62>rW7h*|%0@Sw4;Cjq`8E~qrMDQ|;tRu! zH%-O~=f^v63_)gmuXxu}A8&x+rnPtiV?>pl1}>{y3Q6W`@q*;`n=h%8n4S=~ApW2j zu6Sa)CT2Auke>-K9mP#XV5OLfz!T3K(V(Ie7%&tq?nN6)RVkiNUU)Dclifh*qtyh z71;HGjZL+WAIRs4)3;t~ZWzb?b>tp;hrh%IgdW9cGGAqeJ6FO$McZ=7h=jz=_g@$8(7xTeCJ4RzEt##whp{F5=JrI& z{TSq2`WXA3WPRwo)~3P!e&JMY|HH(G)~b>WOH+yTAyx+1@ImZ>hjz@j-zl{*XJU(E z{r#}6R|W|A|H%cyM00Kv{Gi($`E1*I4uPj_v~R5sdqNvj982(F%9tiZ> z6XKqB{l%5`f|@zZa)s*Ne|f~Vw@mvMq#C^W{^^!Pc2`H8h?6f3xKvnx0!GcRIj291^Gu8j z+?|M_`k9I@u+$ z5r|C#w`)?^3>!57g6kO|#8BrpME%V)n*)_Cn0!=$dN96HaQAv7`IvRD)%5$Z)9TO0 z>Z@M`B8cdVxg8jgSHh{+GxM_{46uP=o}Bf5JcD`3wf!>&DXcT{8RoCyLst3EhDzBE zQM9^%dnK7q{i=s!FtvKa!#l%4%1l{4Gks7`LRFSn{K6j`h|DJc1S_YIokxve*;Cs! z=A^!Fkl||&LKX@9iSDhR1*ysv?n`|7jk5h&x*#`*UTVNS$7uZ=Q+E^*_{%%+g(t@jK^AgH`58 z3h(yo2Y|HUP|ljgYJVcp!b+d@QE%J{+8AcF&DUH%t!cbir!E=ug@w4A){HgVw!b@h zI|kxt37T?O<~bXW^4~GqVj$3^yFj8%e5Q-7oFphoQ4*Lz-rXQSW;{h}xx!NBgHF-u znG|~sswP>2Wfso`5J!=Jm!K&0srYE%P&e)S$KF6bLVg%Ue&CV8O zYw4Z6RQq)AO#oE|;&76i#Gm0YNt;VO_Ic{TZxJiOcKFhv9s}VgAJYPU_|ZEIl& z?yEkN%V+~%s##~y;fvdb_Cv_Pn*ATwmf&cnXQT??Ww}ux(BlG$S+Wt6DGa9lmhXJ< zFg8YSe%pUnl6q{2DW3v%*ZA?jw?|_l7Jb+2O6}e9Ph!~*^0Mz6+w&t!H9FSz_>HFxtvd6N&M{`#qLfOa)VR<+OZfx zkg}Gdc?Ch$sTQcw3k&YAO?yuY$4tZ-eRH$>$>Au-58v<-cQa5sU3QnLkW^e%jRIem zK6!yS`?2z6xYK5*j5%<=eqKqcw=P;@xqGKc*~>~#12@<7WPo4ZrwJux!=9>kT*6#9EU!sh)nPz~3yS;z`-n6q38zOYN= zb{Wm%%AMG8%HsA-`3G|J0PhR*e_`0RE+5ge|02>FdjFEJikRARFdwU+=tKD32s!q@ zRE#YOolLZ7BwcO$X3$0@Dx(4iqhxWf@!>_0#mg+#y0>IV&Wekcbblr*ARD>`cQ($H z<#>eIHvIoYH+AAu(XHtu6=tufFwEzkJ_FRz3pmFL4_Yu3bzE!f4;N91FntrmY?ZQh zca?cy+V53i=q#o1iX-l`Is=s;p>^M04(!$Uw8}I<+>-CzAdJ7`<+q$ad_ZkrZW60; zn$AQcxTPnk2;J2GG?-emsl_8DW}?tRzN{$5R9?!cap9w;?iXP21y3O~La2#)zn`WP zy)tlQhTCt#kk$~JSKSV+hKUI@4d$yj|9)`plb&i;h6bjV?!2Sup*DLbSi^6rU+W-S z_910RZhx&{MCc_ZZ~aySu+}a#yxiX3=L2=>anONea$WaW_dBy?u0Fm^9GgwdFmt^S zKTSQL@C7TYrh0RMv@ntKEfo>9ts=MR29tfLG!4*N=9#TV$%2pmkBbIZt!8c&OsD3J zzC^kE3v#uP%6)i*b;p4W4O1q(oCpiB|2)H3zdbB}ebSg|;>%vX!O!-wp!zvA5U6;~ z86PKHLYISD<7W2#Ul{LMusJ74f6#heBAha%_K>{CXWoGMn*O2gU=@JZ-_pMjXSUep z(;jJ7ft+loxBr^N7pvC0?lOcpKh0+hh29dYTBR#0Jc$McoKVxZyeEWCIUWFa0NGZG z=EgsU+-8HPleh*lXH5$qLYV5Sv)tGV|1c6ZkdOfCBN}O)*e8HLX>=UwetRSt$NM#py`*n~6* z6@PTf&YZ9uPd0tFur`_jG<(#@?c)lPYCXWNoou`FHquV=-J>c7J5=`K;J-{HOYFd0 zrS@%OpMnn@PBl627#JInN6x=oqj8L3Uap0 z&qB&~Lt%5>&y`I6(02#)#>?(Hud@|b)<4dsV@`O%;tA*nU_@!=Q>#!Cv$TfFRo{6H z<6|##Qn)oE8Dk_jRnJMbYqAhNM5kWP?Kt?r@!JhQWBwvU?~-NA`h^n#Wn~q^Uc=%Q z*uxkVYIXe6Xbds&MMD=FtAi}nBWXTFCFrPO#^Ya(d9k?uO%?3y&0N@amP4Rc{y-}x z3Go4_s&@m+>f{#!p)gT7iTc(_Fov7bVKiBm(ph^z@(g}>aH%wd=|MUFzwGXH4XXA# zPi{u*;;}-i<8;;c%^X|uWE0w`DH=;}{CTDWl(9!WpN&!0u*el&A&&_}!LLg@B*Oog zx2}cp#r{C!I8KNwZ_8I@ zw1q$&KnaQB;8wx-P)XmyY-m^)Wq|9|4$=8?v4nu+&MS1mQz)(-5!`mkY7*iZXhD*w zLH}HKa?`?))Qt0j?|$~UJ`Nh$Bc9Cx%jkp@)({_;0!ns88=$o zlLS_4;Zps$?>m30;+|Kl5wLlL`+Si!)5FenM;AnDHGKxGx`y(H??W7znOJKYwVugO z*2)l|BJAq}_h*9{yReXQG7_~$mhpnkAV3*P3JV>iei5p+hkDmxY<>X+jl^Y(7K+=&K~X93G|tSf6$S2J^P}wX7J0DoQahA zw8aF(=~UAd@Vlo_z9OSo8>z?22#mB~d-D({bK*(Z=4K4R+qH2ui-7hfNscgW5d*nr zbVn9zY5x-eWv}ME%-N5o#mfD6MMl2?+(-V9K^YJRo#_ub?IVsK`P5fW2qfrE$UQdt z@h_|#L+yxbsd&tS=7bpFC^nA>k^t`T{OrREc+?PEps0pT2whN!OseLmo>=l;E8pc0 zf+Xm|r;Ii9TAX;+dbi%^Lnw`wyK^_`Ya}MQGXl^kIyrdcXe9Uc$E2L5`Q3$T+xiw@ zB-d0Nhc#YQ8wmW|=UtGuFySqyc(V~DzTb4Q5R3?>etRZ>^zkneI{IS?CF)LfTuPC5 zfwoAG4zHG%?(cLT!_0;AZ|;0O-t<){LiU5k#=h$6IR>7w8vfgyqE%oDy@E!ny=#9d zRu;oI)Egj+$*126Ya4`xq&Vfo$89L=+NH)h+(#ef(s~qlLhQx*$disq$henxc34KX z4z-M~`wog0lj${XZRcmc4UL_D9T)0FH(4h!%z(CY&+r+(H6!C!pQ{?2zTB+oPnnOl z?`D9nn0|11y-`bFptQ#O6c#Nza8b1J?fa0gGkm?Y(wGXSQ3co}ecrNZ7^VPd-)`^aMGVPV|Bv-T|*%vJb zQTuS0H3m^<_*}3t-+DuO@KC@LCJW_Y*YfKtxxY$K6Llbm+f8)yPFaoL%r(%RgD-`enzB@o!r5Dz6fM48rHXUt*3G-RW*lf8QZ4_9nQ__2E3R>s0PHi) z9${a}Cv81Hg&dU+lC6&ci;xV*n&!(n4)+t<>E^lB#k9Ec9-Aryj9ezd;r z&@@V&i5Ys$FG02`LHaxHk=sPkB;G3JZ^hqVQ?@d(Wb{MxB3UWvr}a&HtVs8WVLglE za6L%F$e#1Ge&IHykmg9fu=-i&KGyj#ocNMq(?ivEN9+?DGs&`FQ5Z4!P|Lsxyc5r` z_+8J4V{-PY5V}PXK7Go8U(}WyL@2@B3iMnEi|O-S2bP>}o0H>VXSoR6(7}q<+xuHM{XIh@ymP!KM#c2Csgi6?4ExD?d&$#MsP^0S6 zlMQaE5Ul=o9@fTLVyaWZZenZMk8W=2=VQv*WEw&q@|-B(zJ#SBVy)QwX6oj46uOHb z4F9lIzWpO2b1&Pht)CP)m4P-)LUQ%g#LQcYxT%8f{Q3BKFQr1RIb@{H^j_Ql5vL{c zjHIEnzg2Kerr}0){L^}Y_YTY5M%0jp3s>^pDl-zZFL>lqWuB!)86f`2l)S5g}D-OiUd^+g~b>_Qm-lhR!i$_O~ea*LqAD z3o(W*4Wau@8g0|pB|XVq>oE5G$Mj`34pQ-st8cy!!Is>Sn$hhOp}CJ%tq(5Y(q_18 zboZvXg7JqXsuipU$^1Osm>1@&3Gw%5LVT>rOcI9f>9E}TB*jp~R)OOBp^b!QS$Qmv zKme0}@dvP04rR@*`?rsCoeby8``)pR(H7C7u^Y;C^%vp=a{5^Q{$P4582Z&V{Za*INy@K6NY zz~IosT@> zNDSWBC#90H_;W|74e;LrUn${LaHE%!?yJcZeRP$(?3 zNN4 z`pqTd<3=gtRY`JS zi7;(TcF%IN3IB+NBqb)|pd!N`!G|n!VwuDPan&=>J1WAyK8|*m8}t^@yc=Mg;o)$s zz$#+%X~^em5tGi!?qsp}dKX4mKV&9SC3uvtt-;!&T2C`-t6Xy)Ztpag(rl@C92bO7 zkm)A`&dQxti1?_&VPCy@@pb_(4P*ThV&jRJ9kLcP!Cc;G%AW0C7RlYa#|7K-3Df5h z(=p=R;^)GUyF69J>+Eh!*L`Fc*Z-dH5&XD@*=v|VACjV1mBP+Ukdz%CN2vNSF78X$ z1a}vOV&>|b7v38Z+ohpA!u5RnthxQ?xm8({7d#iCxFH&Rk^5O?u#p%diQyw(-SO=- zige*ElK{*VM1pI#8NOME$7utv=K5U(0UNV>2;_T3u)%4d@u-2nvQ4Zfd%j2M9JFfHlEh;M z#4F|J3bm^3mlHIO!TMMiB{Em%=5?c+g^CJ>1qNCsH{C^sw`tH0l!r5Q%M^Fbdf%5l zr$A3_wY9-NnUQ7UZte5(homt=4xEX(ONJZ%g{OIAcvt{HCUQb$6sCKb=Beko12%3@ z3Gqe3!&X$2U0>`Y)Fs+%V%B*c&b(=U2l~vjLzDg%@0a(HgWEi%AB|rVl8Vi$*b%r( zB>P8^v)kEpWRkN(a+egth-cUp7g6f%{)oCG$zsY1+{g+{dEmaDYkeZ~c)`o$Q_+zx zHuT;$PcO4%*#qiqdt=j`_Q5ciaVv)+Q5;2JPO~wiI=$wYe|)pxnW9KN?dnEsugnS- z7z)a3%DmrQ8&AT2{UJI0l6>4rkcAQyX2=rqq|(6vOoeqN75IR3?^f|oASs(EPNe7m(DMxX~MT{l#5_)m={%Gg9e)Xo@ zxw{O&nd?%MU=(91`a48{vm;717ZJptw%^qiY$Rkv(c$r&T#kyD^E=wZ$fL)r-N|oK zs^ej(IfZT&43y?p{oCFj%XKpL!bsQq9_Emz_NkL4#|f)?S}^oZxj&k6G4W^t#=b2)kUPZUXa37%YXPQy8S$Fz;3t0K{2$+ zBv5$sYpOoqz0lMyt|7ZRpeU4a>&CdAo8@729$t9syiW|@1Q0!rc1@q0ujaVoQ_FLr z&J_xEtk@^3I?k+upLeA@{xYywJo@DCTG@&mhe4fL3cQYqR(^?O1ajL-2bNeVgGsrcXK@#FHE!XrG(&lWUxIy`#OP( zODI_X_BM{7S4Ll(Zi0o$(17S(cSs0nempn>o1Wa$${Y=Ht9z)PGGNJSW^Ys}FDG}B zlat+OJB;vK4RPRZfG#y&xQ9wp8->%p@ zQHMO6ZmVg2&x`T$@P$*!zuJR_o0CJ0Uv5T4$fdhPUFyURPcz6R+N?C7*KKXz)_<7| z6FN~RO62|Yv2W+*+YeA4)pvT2?@x_}A#Q>h&m$FROf?hZg}?HbHxsiRdW2r=0 zPiV$6U^9rS2jPbwpV4Yaj}L~A(MbPW2^;vOz^=vzCJeOO2KS~}q1Uvyy@W)U=+@Bm zrgOhTssb@irE=R%h8k}9Nh%o;Ti)e5lrkhyC!f>AEqqi`^%fjgciYPuT&d%ppT|^Z zxb(l`OTG>WH$D^omWcV;{*@_YEBeD~n3YBQ!Z?pr(ZRf#sp!$#j3-~}LWJ9V#cLM7 z5UQ)StjaCp7WP-$a56CDZ#JFZNLN?3p$lakYx}kPtd2fmb~EOwEUEm-<@vA-ZY{2+ zF4nY&Qs3zseC9*JQLt)--5Efx0+G3h(zp*^jCWyAAZjVunJKMj*fqPf%)MT4Ub@cq zt-WzJyj%H*x1&{&h=xF8^2o!>4xlgnA|02scDF8Qk3eUZu>4?hEU?0=0vbPbE66q27Iz1Gez%v&xnCEz1$1?2 z(zKst-;bRSh%~AO5%!yIm2Mj|d<)gs?+cz~V7=_WPuE`K#-)_C_Pi<{D{YSQydagl z`|iU%r}|aPa0qPGRkrEeR%uu#Ltk?off{89#?iC+Cg)7AS;di4uwbP9m*Ept<@Wr) zj6-(ljPoU{K|6QgS7j6~5sI8mnc*F2%?bbc&tANYKf5TSeoc>c2U$_~94zGM6pHDY zeylyM{!G+GB)f5jQX5N}yYTP7%Lr)hMFV|Zm0~Shxa?XL7Fey}{JOXB4hh}4ws;lR zkTG3+lSWU+V|)S5Q5v&3e^MCIw}Dq`P*JkU^DXDsN#8$`3EgMBF&$622&x~kKk}wz zy&Bj!-HoFigxlCX5%aX9Vk?$?mLut&*!`=Y<~{!vt1@-j$^pQb*lp^Rr`32AC)4V-W*Opq41~_vP}GD-pbn|XAhU{IV6fF1TUw_1hqA)ej(W8d58|f z;Y{rKWewaY(LPq-IT@>ZJf2C0lu9Fs)1jA?A}m2q#!=lloV3t=@uT&G$LF(u=B^jT zavIMK#1)RTVlb5jUdlZKDJ2l$uD)*jy03)apin)gMU9BtuxSP{WH^5dDu7-9_!5e! zP0Lly%B9t{u2YKQx<(!S!DtXtQ^Fwx3K3S5K3tP3f+}p=gr2aMlC}~y!4+B0!+Aug zlFFQMAVCoHs&%0^m9rx)av{aO6Z%yr9lRVCSl}oIhjE82W2NogWXjU%3Cij^MMu>< zP4XTlk%z@3JP9%;_!*YZ&KO|E>q4*Z}VxH+vCFI^zK2HjRh<4?Fx=cE($+)w_n zOXQh=X1UX{V>76snuP5BuhWdW6Q}6zsmgNU1?XVt;C=TiIvo3Z&trHrefG*;9trWf z9?Cr0_x1L~ZS4mpu3&35f^7zjIv+>>+f%fhf7j=Kx=w%i9xOkdQt-hJr*DZ9KcS#u z-Ye~uQLmc%E_AE41PyMM=SNN$GPa#&%8Vf`HsLZ(K!_!Iyq;DFyt5VZWyG7CmsuK^rWDwCD#-&3ma2@ybD$ z?O(hxw6W=cDIvG%Hlw?QbaE=Zy($>9R9fHJo8C@OgdddRFnoH4^ znCjQc_3n$$FU`oxKu1K?Zx!D1<)pI1KXv|h*!#(Erd{)>thR;JtGR|D$#ih(eAW3& zU`zfPo%MbZr9$ZSMg5u3O98r!mXo*eKCSx&&ixl)Fj6KL5q>1aG?MwDyU$w9=T%c^ z%~y|OZK_fxy0Rx(Vjxo!g3M=}3utxKk#9@>c(esglaE4%I3frBAY?KE`~eD)>PjoH zqP5<=E(GwxRW*TR=m{5D)~7grQ)}a0xI0~aYSwVXIab}*k>lZljL3LcREr~=4>yk z?{RK>hQsgAoyWk@5=OiQ{h*{Ekm>k`UbfICN)M7>mi8T*dsW=fX}bLGn+~$pH}#(` zAFa6C&n$+p+yqb%8Kxb{g>t$x$!Ev;W1;oeV7~^A}FJvsGEHOvV|WNFdhGhDv+f;APj^aZjjNsm8>VSROz-^Sef2L zk|dOf`161o>BRwy;vG_n+hB^y^;Z(rm3cMD58JYs0$JH@Ow>iEvhoU#*zf!Onf9TU z7UiS0p(2}5;Q__7q+k`C`50a+fRyY6`lb+eLH(e=3F9X(WEnXmmwKF1x@^GtxT?wN zWtYdc<8hXhV7ZNrGU&Og^(iesU-TW~n=OPm*WVVAMmFC$sQS54iau#p(1oGK;3^xT zOT~CM7FIN?p49#&2YdB7^0XF`tqn@fnP(Vr2)vyaJm76{E^5vh5!?>*uWUcjL=#7s z%`5{P7l&}~qlL77-<13pi|BLcTZ{R`xgiW;-xQ|6MSL=zrM29u~2-;e{TbRRSQ{}3AmkXVVpjs4rzrdCpOUCAtxKz6HxZzDig$^eAz=hKWb0iIeeIi=Z6=z?$z>VCnGbVY)&7Z^6JiFPAlv zJfp~xiaEofjDzN^QzA7y7elIVPq@&eJT<$gnJ7_?=!@f_SB~Ha+FnM@;0#J*`h>$9 zm;tlPA^78(tddyvD97;t0j8g*f;rm5JVH@baF3dx)cV_!QZ3{AYYOX{QntH4cw<+h zSDtn%>eFHDrP@M&zjgs@LmB4?-*ND-Kg3qrk*9yoLqHZnV9RGuh8m$#SDQcj7pXn} zEfZ9see&obe(CU;H|X7#Kr{!CzLEy53*GMEmI{I0Fx8wwgV4tM0VBS`$zFesnr3u7 zj)O0t>HerWGSb*+Dirpfm9=v|;rFj!MTfrjQ%cR~nGdyy<<>UTa~SqQ$dc$1em$3} zHo4bdj?oP(3Sbs6CQFyt^!Ca+IAY#rO=Xx#om86Ro*NSpwkTib*Hj$Uyn6bug2AKB z!Qo?Bl>h|tv$^rf&a>RwZw$Nl$|WD&5ecOvL=fpNX;DI9009Yy zZibX@5KxqsZbV`bVF(#gS_J7BawzGRMw;&)(C2yI_5a_u&RVjV5twt%eP6M!z4uYZ zzmD&nsd1Yg;_Uq`D#^z+WA;-REX4T6cE*i2m3}Ysqtm5967xM@X@f)PfcUGzMn3%* z08tR7*KqVi1phXe5$wn zXw4l#X?0k3he}`M(~i0Ka9|sP^Ef=AvGrXo?m1e5+0 zL2gS97*+5=(Xyj9pRIOc=#?MGPsOcBKASQ%jy>vn^+-^)*Nad`s@rN33&x~nRAL*7 z|3=to>p(yFfjOGIRQ&cN)FgV>X6(zW+FmmDx9K%n7Ct1as(tYe`qSt=FZh_BYLdM&&VqzL`Iu}JyY@z%6xs*d z^FI2Cv~^c|NFsg0=%|UoZ3G+T$MF`IuavwsHyEEsZ+_H|C$rA=CK`!-8lKWaFE%0Y&;{WTBQ=!A zADG<|tOcjR;^Hzu_vBUn@`TT=Uok*eHX;2&l}jdQKUZ>pe?dmikun~Q1))lUu-)ZJ zpTE-Ioa&FR&;c&&=wF6tV@ghOL{5B44o?H7nWt&x;$9PU^U(A_X2Ov2t*jD+=-Fjj zo0n5j64e>U{qF7_&e%%&&&s5;#GmG0ffLBXF~99O6?wv-GUP~V&U;1mMWiZ(P3Yhq zOdK=d+OlRLe|im`{Z_FR>rV`f(Szs${4qdNnnQUjTKPC6TRh>hAn?U`^9PiT`0c*s7mUQnAEN6^l98w|e8dcT2UHkiG9ma_l@7E(KP_(QSkBvXP zzqh4s@k#J^{y_8Ju1FUid;O+uj}j~0ehADtW+OZEs=KwE+vc((I(0IiJhO#K%_4}dAM zhH<9kHL((pA-lSvF7(quv#gc~WA`zc5BjM(Z_Df(aK?S!u0Li=yV{O7Dm$7__s9@e z#ws=nTRJ%#IXI`BXXX>nHgh8atoFE(D}NVr2#?Jv>75$BKm)jHq;z#`s56PaeR1SQ zf7E+}W<9Q=8YjNZco`zMFYJ6)B<~9TYPA%zrjZhiRYAVQFrT zeH2c#Bu5L<4leNLCf0crxq{+_Q9-pA~#u0(sNswdsH<%BXCi*Q~6TlRR3 za7`e3Hjh(at~5Sb_vz9tu>snr>EGV$8QAA<79;+h-eb7;cULslHD4?+l(f*bL*nvE zCEQtq`QRN_Ar11RKfp7UbkWq)S~k(rYHmR>dm2Vty;O@8`Jm6)p(gcyC;{u^r~e7i5Oi!fKm#8 z%@z7`C2BbMB~p{7?EQY^{A+Z`ODcw;x%&-uv4II%rntFV-rb$0Zp2*6GyRp^gcYHQ z#?A|HPXlivagmwNC#)klaTt@;-F&=0i*Hz&f0?~L%Y&03*zeF}QsBGp*i=nu??aM< zDft({Ex42rXMlbJ>oogYu-q%mnM=^n2KNKg@Loa()DNN3su%v?rUljf@)ftyToo3S zV^<|F7!1r!1yl}2V(DyBKjqRvf!xxaHMech=uvy-AjKZb>B=;|q8i1n9Kmxv3QJ$T zEvb-E3PQc9O6XK?=aOBP;O>o=>>7Xn?5Bbpnxpq0IkBct%{MVjvUl2rvHTt2+0E3s&YPE%jzY_&3T$F}INmSspEuIB z>GA$;eUKH4`z^=_YkARxzJ76LgMTf+r`#MH!3ZB6*6+ys?Y)_w={TqEh12P6m6Su+ zZu~$NDdYbj;hC%~ke-1p_%+rLLzj!A#qmcb4`TjX2CX%W_0m4F8GD@{7Gihxgfqk_ z6#OAyhSJ2lIoNBLEeIcZ61AbRLSdf-Is2QzE8HBj@2^<_#_<0uQ4l7OIW*D9SvO<8 zUSXB%_ybYE5psvmEx2_fqc%~QSSq(53RuPmUH+@CO@%i}xe?picX`3D_Dd5?D8>CX zN4hL*xY+V8A6FPZH@7Iky*1ZG~jZYB# zun8L+#S%8+gP7jyYa9_5u19`qMQ#yeS#p9nu!97@*y*CiJVzbGP`tIc_25-(53r4U zP^^Z~(}|D80E6#{kCK^Ek*O`qtgwlB#Y&9Ts*5+Yg%spOlnz5EFTw|Cy1#lrU&42* z1vxovQI<3ET-*qB1@AHBhe~x+;p}TH`+j-L8C9&W5JnxN@OCq5@F_6hLH^$B&8;M2 zaSk_kzj*S$wK5&3<>NI!xVs;yDdX$uVd5MZLp-(Q^fFUJ`^CUH|7Kt4kx8`sjw(yP z4qjCf{zW)EH3J_W2bo58!i;ZxgV0WX(#~?3n&R%qixQB)8E&&mS)auSq+$`iQHiB%r-qu#mqC)~yiL|p7sJrg zDMi?S(?aLB$C<9pMDi7CDC5*9_50J6%-lwKs46T*MATTkm;RF#X&tsc5$qAgson|a zYH21$i+klo=_jnV!Tq@zI|>ox0I&dqLz_$7h(Q9EKD} zOqAL3r+U$AixLOO%Kin^iVs=2hl*lnB3-#(+c+G0tf9!A2KM1HdklCGQi7Nflov0$ zXgLm6Oe<{^KEsEZO!gDwr;8Zza@ilhkh2y+V?l)}Mh>~A4KFjIu~IX54bujRqfxXK z!Mz{QSju)T%7yM+41tZH&`ZxEPW?C29HV)R_j`a$C0f;II|NW1TxFhJe}iFT1`dJcRYNK`$= z-7-TD$V%NJk5Iy3@;h=yrUqp!@XQGG%k>;FL(Bq$r-AmD&CwlfVks#M>#_sMw64pF zp%4<-!*z*_-7M75R;^)cCpRat&KDT^xfwd}cjWeu)DH|~p~6O|hS2j<$6Vj%+-t`c z-vg*ndWyEzD^wU7BIZD>(;gIk-o`z;XeluN^1yY?Rb`eN2hiN5d~zL`LF^fdgSf8! zKL%OZ2G*9!f0Jd#-ib)pyyS|clqAadTIsapIC3KU+$H!UV=vVD$HsxmA+AtXZPL}h z^;!Fy&8mV(!t2DSdEsAeq=oOfpN2RTyuVMC`_ql{rpNVZJ`TM0Cgq5m($&=(M)2eT z7OK#mzR@RMY+{Jj=cra%UbP+K+PD)5WF`2+R?|~sVe?1NyO8|} z45gg3^{|hdf^EleB>P&2xmdeZ0clf`b?)w|Mm5!(hdu2f zu4hCZ?#`ms)%2j(eGU7=D1h7x3xis_t&& zpLhayxGm!E3S5OFjLddr;AyI(`hxEh;--~B7#PFs;$O<5#!Yyq$jbmcfKaJoUOMO8 zLTtt;4WWs^o?JoF_!LRoL7qr3?GyCo+P$ShW?L#oaVh$o*JE#AaVVd_U-;-5&@C8BT$3yii(B&Vho1{Npc9#wO90#I2QGAEX`q; z+GBpu+z(Tz)q4^CYdm9lIQD6;7D!???OF$&ef{kFPHUQCXO=}czUE3}zY<)1Wn6LC zC_G+ZxSV+Pjqi%brziQGn>zU>V4`#l{RBy5XZ|LwD)`r zD2%J{X#ic|2g46!b4|oSc(x>l&skk6gSz)cy+B5e)8ZOtCusjO`MBy zx{RBxVFM@~qM?O-6mhg{)1|mzmv?MaU4Jf^;7w>&1_-P++}vw9LJu*uDj;8;Gca{# zz`eLvj|6~aI_7`Wg9xj0Y0dAECpQ;*qdpK>6BNc#a}$%fF}seL&&FnGqq4D!{LjKY zJ);TRZ?g9RXGVbh-{r(gh5flNcY>w*#6706x^lGzujHX=o2G<4HE+*^4N?L>jiNPvTY437Cq_E6a9dcvS17gy^r^UNG0 zrA*Gk+#EWF1U^6&=(&h%b+uW=yuU0tZ7xBG z)1VH~RUyQ7NnGlCH~Pw8=!zDtYxBG&ljbKIog%4n{i$y~!AuRjjb*)pYgxJ-Hj|oaZs6Px+hH|(=wF!dM3&X7_Wm~# z;wbiKbi@t&jGNdNZV;R&8Kr&q;#aMZP4`L97|lpX$t-FjeqDOo!uC*M*8LWBcyMx0 z;jL_a4@_AQAMcwu_^$5hFFp=m@=K^LMmT|qSJLhtD9tG0Ux{E-t7+5#D=@*31xoFu zJh`#;^a`kX01{yQuN=gHS_BW^2y8B{9#r6$G#6Pb&V(LCrUsylZ*r;6YH}omm=p@!J z5}>L^DzjAVne0g;EkYhXQ3HE`IU70WTS6Qba9leIPnB!5S83qZ5#E6 zNO9RF$5TPlS-t~h<5?Vc6qLst%UN5h>-P^|1A@8#s|ilbC_kn#x{a=CpO(Ru6)!B{>f z&=ljK?pd?!QTQ9!CMgV(r{-i9!;8p_6hqY-SzGW%oY#t&X4uC0oft}9)*BL z`ndmFuFm{rRPdt8H5AFaB}!D3_w_j)u#Q)$7iOQp!ALii^J2c`Gf3NE(1{%gQ^Yg< z4)WO0DBE#htj7RnF@=O&J7jE&c=&#$NUeQP0%Wo@&mFpKUQOU&!|Td z5jSF^R9+CpZxFqECqWP2w91_`7G@;{iPSw2@@!W4~?yd0q@oWqAU6|%mQRsFhwhk4YhT-r!F~!LRXM1a;i`XiOKs;9`>gm9v=RVoU&i3 z!=T|{9|V@A4K^Sp00&Hk3sNRn0B`}znYOEjmdKm|@|mG*Y;8ttl&KgcVA}k6Tn>t- z4RBKtk_li^RGFYrAo%+R@0ye4%rwVN5wiRSQeo>0w80P1f*nfj$N4~(dA;5cO3VPV zP0YF9Z@^w9R`**&AJ$U$QT33=065XMZd^5u&^uV7dQ2>@hX zH8d7iA>03_iQXyPdws)p3ysx!-+u{4cz-5G4wpXioSN+daJXBaGF_hVuU#gq^3E3j zPpj^=<5#w^FvP7zi2KUN&`ud+GTS_YXn`Q=HV4;v$>t!WOGgOYVK!&PHLXi zWG{Y84{|~GdCx~>?;Hwdy$FAXKbx+WI#-dLFNMoXp05-3X#X`*p|Hs|+sunqg2}Zu zuesNrX?VVBID?Fmp5v?MMcKMu@>g9={ZRp4{=aQiFc4^8U7Xx1Yfu}pne-;bq|UOz zNCq7AMGXx#K-*MRC3PA8+h|`08=_zS1;REK^0sH9QEbpu6z$lz9lA7N@eY6~bUIB= zEFsn}<-B8}S-V6Qu+DwauQzk%N^!ZBs8S%J^FqF8z4KQe?Vd-)6Hrt~67>WRPq5-F!YHvYM<0YO zz{|%7z2xRTwbm3?#yq9K`-XLED`VvCHK9eoFL3`0GXencHcH;jrIi-}wrYaL13a}% z@sSzkoh?<~o~glh1<)_`5S$n7?G}W3BJVxj4^c!YH zIYz+l$+7o1G*M&VfXf|7LrYz)EW!j0mGEJwL=1*OCg0HBZp_667qq=zwM1q?kq?qB z1TI5J43~kilE<-CL-nckC?c^ReV# z?rO!~2@FGhz2&cMfPQU^<^WHiyf_lM_0S@2)Cq!gi5hbW6mXfEWv?(p!_ZBx9C-(- zL(#()OriE966VYGlX&|cY6~538hOnr#O5$-4~+2)?}#(N!wmYGhM#p;b6$oM+<=?H zpPr=VsR`;AAeJd;sV{CCfCM;TlwxtchsP3uu*CNW95?|UT;{|qAt~8uEaEG7+pEs6 zS!d#EfwWINa5&Ba(G{3G>tldc2|-l4?qo(4d?w7(6Vuul0n}_R<)p%?Epr+O$V+OE zUZlZ-9{!R85AKcIhuCUV*~ll5=|?t$GS6I=1!eT#rsp;687ZZBuJG#+7!0m=a8Xsi zTpUP>ZPtHE!;UtJSIgp+W4-LPo2MzTT+6?txMs^EoP(`PSEb#OpGs43@Y%P^8AQ)6 z?>93V@p=!1zuhDa>UN`=Mau?q8PyudSchA1ROjydw02%^glmXZb_Hp?g+CqFwSs8> ztC)G#8n%xdUUXOq+|Day<=u(=q{JzEiA$g8R)K@6~ zM@#2kuz?j5y5OJomIkjcP{y*iu>O>&qi)J_?Fp5tuXEO7>?|A*)4QZX#zR7IkzjH1 z9fVw!K*>*#TeROQYpqpbtD2eMSRG48cpki10_@VUVziTU3Qxz97MqKNQ#Vr8Q0f{= zXAUE}8oiG$R zt=id|ve(huDHuwU8Q`zvw(yxj$rap2*uYfYkCf>^8b9L{!J4_zBL`+-BNN-0QD#<3s_f|;ll~;L@PsbKb2KM8>y}$kX52%qATi!p z=(-0!<&tXm1khmsN&`k!HZZ(zt72};$B;^sT%`Th7~giCcv6p6VpDtru$@_gD7*;g z!`B-+06t*d_S>m&?yh97F)S58;O@$+Z#55wA~`smhTi7MCYJXv>To9J5qyhcf5 zl1flvc(=gOX=QM3dj+ubz~~9A4l`hi#Yt*Gc-(}fpAuQ~nIfM#aQWc;wbPpVp;}Mn z;Y^kOT@DWuHMH|)(6)d_*R_Uh*-MjHlLxf#ch1Wq0Mm3L9WV^hjp0A_eqRf&B%!UQ zZ@40qP8%AI_d^7LYC(1Rkf`To=!kR|&g{yKq~rRJ5G$N>kdRSEf>$BR<5R7QmF)NW zQ)FDcQk<8&=AgKh8qo-lwgYr@<0<^K^!g6cr~NN9339zSqHqVf$RC*JyiLEmEpTWx z9a@fnco=y$E8irw7T^b5(ej;$=z|ByDY~RI43O_~r`HZg4afh19K`)FfJE}D&z*Ag zw|7jeB62qdYH<6sPd9CU0REhJ)np zKrPr${nq`!{81>)R5{c39zIfet>bWeG+Xo*hD{wZ8VIP_fgFNq#<5x62S>bnhT+5K z)LyVx*SM(qYjG_CGRa1JDiFRMB1XlIqd6~^73Dk2jcXb4Y^^+HC)t+efj08TiF<^N z(l=+*z5)BdS6!%x)Yky3XAlZmyKP?55(wNTR#R*#}O~_R@@R?ScIDD5QrtGk$1{`>)^3fRHA>wC|hyjV9jf!kvv2yo~fawC~_!XZ+vxdxM zRKjI#pU-4$jaMKmHSy&8w8vClgl5k@f6Y11_5MgVDY@PqL0F3Gvj&OP@w>7nb<53N z5zqkB-p6+F%2yuTIRPD(-q^>xuAk;1Qs%PXAE`}hO@5A@)l!~xJI|wgb3%mtd!aXr zVmrM_p4XSXVTNgF9GsI`AKOVcgw97KoLPajOGSUKC4}IRhy(5}v03}F3Ef3~75-5jC z1N=;&Go)JAweoO~n_pLovF;VpDd5H^4&(wA%v;?Q_5vTG(5ulF__|MS&82={CwE5F z>bSCgLwt5m_w1P-U0l9}nWu5vZ18fRZrYly(&;1lJT z%v<4}BL(|<&1^Zt!+pkhRx2Hu&q`~+rU47`;Fc&aAYM7i-2ZOIDpCC6*JSowZERYF z!Q3gEHG?I>jfDNX(sbeb&g(a*Dj9=x--9Q`gZT||@XK31fhtjrQ;T`%MBoYho0oF9P)9*)O$W1&h>DbiuD;ZqKw%zRbwy z=?|mlmZj3!ezsN^PAXm{z_5H0oL^PDSIbk4x)=`ZlA>G)!>QW7%}9K%wo6?a9B7>! zjy~~SSEp{bjaloSBv$bC#`n-C|clBmIG038<#^Lds(1(afl}kqXPk(QE+dk z&#UTb!tK@#x6Jm?WkQF&DE@D)(ua^7d zVGK485R2cstM&14V0`3k+xACp^-ZS$?X~FrOZizhrM51|`BtYEDLO>t4UA_3O}$;8 z(D7_%qv%kU4vl#e@TeMSNuT#mPQrK1SHhTYU=C6YCjLsz(a)XlJvo-@3b_o`x``F@ zeVs4jYCVaQy#0a(lx5rnB`$`C+c7aK?5B1*5AK`&GQYb&JB z>ZA=bMP7zb)e9TdnnTA3WW|)eNyz*NYy!eW>15^ApT{$!rlQeFPU#>bAxwi$GV+x;f|A=Ly8&@X=p zQ(&uO8%xiDuxU~aiK8BeQ-H|^1^BAcpsrCl-te!%ughI znDt`Ft!uP`tAAiH13jN3q5J}nHmnnh-CFVF;*z^3$%I;NuQKXZpD5?V9$(*PNQ9-y z`l{z|#*xB-O6_FcVl$701873Wzu!7*UYj$W)EUb>hE9U^H06{u~Pbyb?uBcr@-s4aTbl5kpLb39}GPPl~TEi z$ft2Iu7Mb2MFJTHjt7|h~h$$297>mIEV5Am@{cAVA=b9PjO!LTe2}UthUmKn2?^J#I66#f4*&{E8hQ@@# zA2~r1$Ply3^!S`N!bYFVx$~Bv0L^(_72DD80Tv5=eEviC$c{HIVQHdZUL#+)WV1%| zBeOiBrdkW5X@AR(I@}@YKF3 zThKpq)=s?FD3s;*n;O7F9&hYYhp3EC11pSLSDR(PM$TvcG(!*xS}|! zaJA-T6tM*51FDxa;WU`$@k(@hc&5)c-cWn_9{Gyw>=-=P@>R4s)F&M9{3#{HMTi!* zjyKpHl_=6oCL|{+MdpHNUP}6wFdu$j24*0DUJq`Y%ZUA@#EGyWs!;7U@$a`VVjP8U z<#+DHrLlT@Da?npN0CVvV+pJhDLxz}0h&1pBezy$i2@+{Tz&ysgKQXKPtD!mS@Jmc znKuA~d5G!$CyR}e?=n=o1kXyn7hz6~f~}=3&9a(DSw}-;vk4p?{PPq26kj}t^a{?V zsIXlN6|W6F-1@;CiBL2D-&iFgKaDK9YkBxLmb1yBRXn55QE7Doz5oylSyssrcTO9Z z>^+lNpFAMGS3C6N?qN$lkVO_IB>4itKrvzod=k!J!7kLptIpN-j3|`QVCO+sMzX%3a8o5Oe3?L!GN!QiG!OzDVHe9YIp}r7ZV7^zroU7 z-xU8&Z02GP{+zPOo&j7lpg^nTbN1-;WJQ&{g)T|p)pxFHXTq~57vs~ez;(ZCSa5VtKyOlGTnaP1{Rc;`ePDpJX^ki^ETpSBDP-WSB9`~}zj#F#(w)G&kV#15 zkG#vz!Di<@d}vOk-(DQ)Gmw!&CG-&p{voFbrC}Y@fYmfPtXjM24_KFNR2A)3-!5|j z>kh!I_h**NSz1ky_P)-STX9W588iGLx|p+L`N0mN{KposRSrir9!NH5wCEKge9MbU z(qnV$jdqEO@7K{34^w%zK%6^DUUeKS0~ea(#V3##|6y<3_jsab0s&KtR8MUuY+MH{xaM-7Zw|%l_Oj#edo=TkCz$H*{A= zg;mut7JI-ii+%laftUsaz$!mKz8RO{OFRa$lIc=w-xEp%SV?5bnch)Jj0dMrcb<0) z&^?KqwQv~)3g&OVx^3#kIJ6ctHhAK2-6P_EAMHD`a@V`?EiEd;_=aO>xJVJ%)Ld#F z1O&*9UF7^K{Bi+RqdraBx2~wbWx<7KvQ(7iXivF(b9|9A@C=iXQQiv9sI`D$96aw3x{*k zIxUMlqt;~;<#e=0(dmH?%d<4-??jt+V(+$LIBO&W)Z{~K@%eF_1JGVb*wqUUC7^Qr zc}P1euv2Gi>0zr}7OW64ohd|{`;(60^J7k#2!A5Ed}h4R#;1%Mx>>9Kz}UsoZH zoKEj`Xlp*;VP5$uZS3)6N-F5^_B#>(#OKMGfNtdoC`TejHPjf6@lRev_sGK!iG!wU z=_xSXl)&*43Y5ri+tS}{6yH;=AQ%G=5P)PEGFw~tAZynX$Ub&^UUE=w(-~=KkDWKY zJK*K&I{}I->j$m;V}?P$@b0+b7Y{3N+hh$21l2{oQ%2C6?8X2t3V8I#sb~0ht2i$f zWF>lWp*Q?-9IVFO?LY{~d@|-vO`(^QSqz{+UtY zf30yMH7EKu6@fLgul?97U44q-%g-=e8-mMgy{l!}Ir5lhL_I%}qbSdm2^Xbz?>pd^ zOPD|t+rN9l39geQk3vLADSV}7J?kecjV1#eWB(wsEeLgZ(M?OD*M~UyzKniKRWt7#?9gmhkj+-T1! z7rL8d0HeD{9__v~T&KWzz{)5rBx84*-}*$V)UgAwEB_8P7pj0l3qtkO11c5}K$#rY z&lSv@{`&0KVZS~t%a|p`K<*bwbPgUq4N%wCku7Ht^_1;ImdJ6+Irj}JO(z$AW zLV4-s%u3~wvi9(e|LFXx_Y4XSP!0n4I;ExzyP%#bNAQc6@~sfs#o7!CRcrRgj*1QQ zSWudV_-{(+dWpqIW=B7E<=QFyAvn@6RFJpq{iFYQ0R>d4@t(k14YXDVMw=CL`RTY> zo%RdLD_r6jLZ-M){W8oOpi>^u+$8*dv=#~JH=Q}B%4^u!*eWFLi$Zhpy(Lz^NR`) z=84omZgqIno?(bhp9ISub3$P9RiT|;NwdE$ekmh+E#(Sz72?}frq2q7LX_aya1snG zb9nIL>g(8yNy`}^%^^QtR~{u@QHIay5>wAP2~=6d^Z1_?)H@)rET5BeWkP=;cwtL>1Ml4M?XqXbqESH4<|>Qg#?5H4yRAO2B|gV+p>`}Z8IQy zQt7;-T-DQatmk4IK6}N*)r9mUq4E!hZEmc1MKpglzdQV4ukjRvScB4s*oA&y8qe~3 zu)kurTinr1pg9V7ZNSS+KRP=TD%@IX?iisX5R*Re-z^t786&_Lb1E^8KGd zP*>DeR=1tP+01A*(8hCWCgfGgio9c=iD@8syYRf<9=Q{dBeY{DBzQWnwHXh*5KGZc ziqu!2sYQ&ll_YVlS%c5?re>Nd~y}zc2T$w4mtN@}7$Umh3QgXSH{#$1FA85$YLHBuE6kF;+M$Hpj;v@{AD8%VBQ%TT z+sD|k*-7~Wot;`yG_vxWMle0DJgVP-{V?{f~Zj1HL z>V0~nYq~6r(9^obR`Jr>v(o;!x-^!f->21J=X`UQ>GOh{h2=4h-T#4<){1_l@vMx= zljtpEh1sKvZ>qXa}9_wwVU!}Z(*cwXeh^GKZhxJ4#yin#o~C4e?|iC zeAP-kC9$4FIhXlTZXco<$6MX5CXuq{!;PV~b$dOLkOy5O^)H58L8lJvMoNwxenXS< zgZsBQi0h&pQMs)c6X0U=%m0+A;Ys)k*uq9q%X2dK@t(%eI)2%4#?RQzXM5a+`u6qA ztLoTI$tmy|<^ZKCs@(&j1O+M9v2m!scChc|Y|FUK=9la~KbwWq9U0A76Ewn}H; zM@<2vK<%YAR`XB$MkTnCn}}HZTd8mo;E_7PviidJ`7S^Sj)wStxB^$-;h|TJSq6#z zOMFobf^#`Z_yCDULsm|>sH7nwY+qw|IegcnsaJ5;vaa|;3sMSonT65l$yCckl~yEf55uVmrrwj-OBg^x$C;;(JJ>bWAg(mtm<~kInMC4{TYn3n)N0^DHCk#Y?a|!eV8r|QvbJGKfs8z z8tfggKsKJ*JiOJMIL4pffZXPeuEjmw*}5_r&|?O@`&ab_!Zd5j{R9nGb|4FkWNR$l z3?j6F9BqE`2i=p>EYe)?CjV}j^6-6~3NQmHsGhE!?rR~j^3YeXIRI|rlae3KhU0dC zQw5Y7Vg5Zbyfb=k%O%K-*)KoJT6vG|x;G*9K_f3jROrTK;D!R`iT*inOZFG8q1pm1 zgeS4+Ri6#l;l(*U7_EA~*Zk)G?JDBV(_P3&S5~vaocQiMk93LPH)-)5nAqy8$6ved zDd@HT0!=fO)9#sj^?q+BOz6S=K)Ed#UN~W2^%sk%P4V<^j|?z|I6(0Z)D0k60Qor3 z?KR<4BCoXM<+-Z_V)ud>b{OcIWRaCh+J$+`GPi@TFen=4&HfOQ7;X<6ai|?*7OPF2 z+yun|&@|gWc})K&STWmdBK@ruHKW~&|4Di^-*p^%^u{p&JTD-^wsn8EczOs0{hExU zeMC89Z_EBzRwR$x$gz8q*@7@^w5Pe8N$_;bV$*v?tuRPgha#-%2Kzn#FKh|ApowY* z^l&`TM0F!ky{IbwjMF|;UjkX4ar?eEaLZWNj^8?7aX<5_+cJ>ND~6XByILD`$le@a zHHY>FFUIWLP>yj8eX!*V?oghF*e^+J`cFM85P8`~%E%_X4iK_CV{M!`PNH zUrX)H`#)-UkmiOt@`?d|S;BX;b`C6cV=FJ?-yD0tvZME7lnEPE5v#(m znAefKvpeZ2zCIY+3JgZ_&nO&y8U;GCk{ErV#DMnuw_9J!-$w-&E^cbBs&Jn1R;Y=dg*&*QIK#; z@W(~*-5k<4FNID4PwwxD5I6&}#W4){Y8COkOxQ2t4(3?`H8wf~HzD5QNHwW6c3xzg z`GBMorGHDGn1=WI7T6(3dt}I&d-*ho3=^e;Z>j>^RXpN1*->)8ux|EERBHY_LdnmD z!wxT^X2iXMkaQ5&D+P7Bo09eXU#WB7W_Pi{Y^ULB>QOGB3ZOglFxELTYna;}o!Xnl=;ku$3 zLY9c;q8+WsNh^%1wi$-yl(KhQRLQgVYz8^L`q1Y3;|EoeYd7ZKw|2F3SX1V%aj-!m z>^hGJdZ$5foa|cpX+^nuC#lG=aAs{{fS|m@*}0Qp5U?!)tF9cd>Oj5$@XVh=WnF4x zlgz3Bq_C#;zz$F_9m6UsI!`(8oY>?++PgJP2X=RFKsU^9Vf?XxNftq?J$eF26U-Cr zp?BxrKU*}T5gf0u7ee=Xg-vx0u;`Dcp7gc$0d9!W0^d}*caKp^MuE`xlCh7mG-)zZ ze{}4JWOcF7L%`@}vaGM^t^PaPIKpZYY_tt$U(*|AgX3Ab&Du=JN zRr8exvm`QYCLY5Kfd3aiO z8Q)*qy(7AOpA2D9svHiUpppM`&%#B!5txqAa`;#)94fX)&lfv8>k2siqvM`*BVhyc zHdP|N+z8evuB@NV*Ta9hjDO8~Cj>v)Fp%0gSjJjH1TIf3|5oYBY1iy~`MZuLAP$st zw}jX1$t`_+vKH}2`Rt&Pq4bC+FrsID?0*LYHbuN^q!g&F!c%fts^5CaTjMA0qoH8{ zBj7lhG1h9h^9>{}VJGf6c5Ssm9x6x*WP0X^;j%q*IVisi9G1q(SMaYsg{kX-34y>P;CYJuKr;*8z51 z6pnac>$<8t$a_Xy^^NqAiGA#n$TfZPr~Yquj{}!{(TPkJErL-XhVuuhVj2-7{fuiL zgjNkLrc{Shhs)#l&aWYl$-U_uGze_01!fyNy8hS2 z9}Ztj9gArWE&PTyxw0TBA;rO8x;F%d&j4&_wF_Wc z>II5hzYm9FU6*(k_Gh1KT>_xBd-S-Pm;umio=1t%05H)Ro_rHJWO7$x@|8J*Y1QkL zZ}nJ^?-ao_b)<)$#l+W*(CTe&u3@KP@b16G9MEV7*_qQO43pBD)JI8~d;FhH=&`nS zeON$0yNcWTxXb(}A+DjN#|jH&aZb2kV#BYP)`iUAF82rhH!!d}=hfYTm;8HVtZ1#y z>50{fa}j6y*BWNoUIG@88=L&3zDwy(QCzf?|G*Ik1jB22!CE6TInV-L zGYRi3S^y-m0kwqYudFd(3uFlo!%7W2v$)fEM+%N$=# z*4p@6E&B-}p#xLMXFDYjxTqVQ=x$>^P*wmz%wpsnA%+y$S&FCq@er~MLJp0$;pVK} znB1_-rP^S#qlL-uj0pk-8@emWKNui5!6}Ih+UZLd z);RX7r z3X}=jnED;4wCaB*C=G>W_hv^JTm~ByDjYj@Mo|H%^PpD1OGxYT%^Qa|o}$6U#APy( zO>#29xy+3kzl}pqeHQC>fQ;u_rLaQr&J}qKh837^J=R#^G@HAzB}WIkkKTyJ(Uq+? zc7%@W?l=CutNt{o;F_AUH*0leA+dB)i&A$Q?rza@=ouaF`wx=g{{|S2K*~&{`i!0p z6~+D1*C{*}+uOO@twaxK$5Tq|Y$w%$jDx=bGN(P{tlR1CVsr|G_j z8QuQ=V0OW74fpC9XS%%--IFrV9(Qw$sP$H!f?Qp;O*RWSg!Ra`wKzShtxPIIBJ!-Q`oG8RU$2-^ti<)pC{6`0u75`ct={*?} z*a&*vp3*6p36XYowVr|*KiM?aDv(COi=eQS^;Q(eVi6N(hTjqweD8bX&M$m%aV*;3 zn}_+Gm1L7vU&HXMM_VwCHaDtAlD-^GyH8EjEqTzvHF9E1k>gGWwbBu3rSc|E2Ws|E z%PCi0jvYb)!DWoYdXHC_;Ttv^rH?*;w;L#_Ax*8d$Cy9&d1O#spQt%h%aFc#RmbM? z#-T;HljuuYK?=Q!Uj_D}M>RDW6bJUlKc=w>Is1r{o*%l_?568I=kbZCcnhuhFrkU3Ni84#@zTsTTw@=akD{y3&RI50D2Lsyw4mu1)shk@mfh#TaxMAseAzYooN}Z&rWt z*2xAQ-=go!UmC!yfBaohfKKbCRA|K|MX|pU3u7N-dC!BTs^Ql!$L}<2-4d8)d)YA+ z`K9ggXiBw|3v+!R!z^3ZR@d`e&5KmLPyyP9XwOKebJ|q7msY4WQ}-Lp1UPd#2_1Of zCgI%^I%-UCaUpY7pTi#c+*r2%8aoMZ34220^LCxk(X@#SO36if=NVL{bA>;SKpvi# z8uuQCOz|%HQXh2E@N{bDDeDTH&F=Lf-!z^b9LUNvrsl`T~kD3>=-3; zea?YTykc?-2l2#q%P?813d5@>yh6lpCWe`#DkLk_Z{n;%p0a^0_tGR^z}*23`J&IY zaT={P^Oq`P;3yg;dWbkMtj$p-r0dns%`u3AZE8ku|8CjGkBD2BvB?-}W>LFUZ4rEH zsoC zo*h{>KPfYr`c7})h77)ALCjBwyq`)Ev1HiD2D+U}wcK~awv(G@YaXukUWVXsA)u-4^yPITu+*xpkO z=>l6~Bfs|B9~IW9QR18R$EL8Wt#xL@@%qZ#pGdahDu1qc4k4DPM6A%ShZ`UKC>+1X z$qL?AyH(oFNke|#oN!Ob#;09MtW`8|qUyKuP=Whi>S%mRytuqAc6w&8c|CWn1)s#(JPJhk~3bY+1z#N0Fe|+M$vK3-}!6F zCKev!SHw9V10S=}WJpkit*j+#;$^h94rgCF>Rp<#;EmyV>PS&g_*LAwGf+TTFcx^% z-ytt@e)D{H zjLxFJXcR)-*p#lQ|M)Z)O_cVU!W+gxm`q%LbY(xzaR1qEXP@LM8~^1oGewenOZZsE z-8uitL@<=N_8XH;dv-nu6$y^D-AHMAd^%5%eA9gnzfGyFH};*UHNWtcKrB$A z`88R8g8XQ=t;_Wct6BtWaYirB$us$0zvauO&x*63GeXS#&{(Q4#i^yfyv3IgCd*o- z3Up)lbr2%^lR%7LIM|j z*xg&-ocw@;&tSh=Ki3}g!=aN#op-69`2sC*gGq{+v6Ez^C3j0J_IRKtS*>FgnV8B> zXOgoP`qHQ5uFck6zV=u<>KCoO`D?=QL+4-UB=L)6>s;#?>9xZ*J0-^3?44@Z7bWb( z;nEiPfA*#g7c-cr%vnbWDG14U>DmyW~+r0SV3C97$n~bSfk62F7@y%w%9_u zoHy3WN6DO}0&l&+ z7k)_1hVt)-<~AI1W*-o)q`mlF>x$D8x7BOeVZCgzQMz06<04eaa+OWc@0Sd4sn=x8UKnW*UpLC0DX+4?Dukmbu)&)ql^9dlccN2xJ3p)0FRy7AD`B{33kPJc z(zv1tPA+#k(&&D!bMy&&3mC@xvUlxs<{XPL3p-naurrKtn&uf*xoz0oJQpsX8P@-> zVy<|2VIvfOF+k{a))pS)d^i!EokE?L?{)P0u+U`+sd=#O=eB<{N>K{1SAu|^`>RklBH;(`dr}=weRfp(Y0~b!#TPreaedG~j^}OSQ3^RlGO5T1sZLe$ z&n7?;t^{G{cH&dnQQ;kTjmp~>@Bf@waqC3Z*m&g5=dL_uPxn_m5*rh3XMKhorXQxO`UQ&5p9(NSzTuNuV5#m zw6SnX!H@+40@tUS;w}^0AlpXA79>jIYAqb_7;_1726pudkIREjG^G z);pEXiTC&fY4zFN`-fOD8GcdlPv$ZI4idg6eeaxKtzx#yvXgw*aEyP*kEfM}%D6o# zOy1Xk6>p;e#}ZOHbye2+RvkM&L(M^x6r3K7bA8Y8LYG<#{oxo(u?Bg47#gbKA!pn5FaZ5<)anc4;6AJq zUn~ugqKRnbqbqE(b@mTv??1Iu(=u%m)t|5~l5}lS^|JG0@S%c`HvA`{&?u{0wH#wu zTqi^Q9a?kWML~^qT32JT+hJ5$BoOB5Y1*Nu>~=)!Y1y=Rf0<{Zbk!Y%FYV&BytStf zAWke_96981=8+uoLcp|jEZ4`-JBd69IY0ZPYif-BkDj)mP%`kWcyx^=2>u zT95XVkO|&R6JnF`f@EM}j&BG9gC_#8zPAYsNz-)LaM z?NMFu%&f11v)ZPPO!C~syLX=M>*lRI%qkp>&8-#tRRq`Bcq#4H;#Bf8Ema-vB{=mZ z^Fnh{H|L}z6=WW;R1m}m< zMxRS(VyF6?>8nj<{enjh7lo^Mt(|e z^V`iYZ#u7ZM%C^($MsSBMfNhRzn(m+BQX1tjvJY`xZa)Z_@Cw5hjt{B?B?qzZ*oe1 zc%=lBc+`D_I*neX`q13-yDSJd>18NK1K~e-7B-DZ8T8zLpDA@8`;(30sO4zP_;F8t z!&w}I4rTUTlgX-;&r2kHwo;O!3B$r9#O@EoKeznMx6mtd8U3a3xKv9c<7a5^N4I;{ zTl0cEU{@+iqul?RTM!m3U^sc_z}lgS88JjBPv_2#n=VrHBo&AL3d1Lu297I$t7SQ> zmy+}O18KH!;G^>_tOca`5ISpA>O|tfR%SEx+S=2Fl+f`?TU?3Yo5o+62;PfqV4b6R zj`u4!5NaB|&$p5&Wwy;8Ib4TYeN17yxG)==0ngB%zdH*nuDM9gc8KzXemNjy4dri8 zO%b(pGp{vrxss+*hN9@ArLj6ac}VN z5)zxhHp4&AcJkQPht72TDAT+`DR9NM7rZ6aiP?}c?TY2u*?C!tUPpf6z4`ts0AuQd zcQnCU{F`StaIwy@(H)&qV`$wlZB|R@Rh_J4a@}|KlHFtJp%LnwPqv72$8O0Z7Fw0P z5}ayI0^e_<)zSY%8YRMyP*5S`>54m{)sOT#LoTu&kx1@*Uhqrmcq|G0i4H0hUTX7@ zMk(;sS>Af^AgZ0;46mTIt!=z3P-Uj><<;O~=#R}#z3f5}tx?@+>!%YBoiO|RF#kgi zd2^v5!dR>^`ria$r)(VqJ+G?9y&kel*evMjCAwG@y4hz%Io`rakEsfBxaU&qPX^Pi zuv9bPdyd^~jSZ_|m-;-$@QhArD+G6`Df|vykvD3W>uvXz7C90+Qq@g&WjqmU5>w>2F6l@GmIahUzJfzj>xNSO?WT=t!Mp;zdkV zN_f30^yk5JeoS!#bvqdTA;tZx$ii^>KY|4v6a|&skOh(l#qrE4)BFl&DLi>w)R5_v z;dpfvYS4mHbDeht@1InYk{n@DNAP+BoslBOQgLA1i=#kb5qhE^(o?~!F3f;k8_%j; z7L>gCuT5uI0fAvNsnmwl@Dp;tPaeY}#8xc;wH}rQwRX&Th{BVrCC&D~g+$5)Z;~&r z)_*q-wgQ#QXDI%y5!bIiZT;+RrKD5-x?isY6?g-NF{)T1JAxu*JIK0D+GPkIMa^SF zai;&6+WbV$d&4X9u;iKECJ@`1HNoq?KVJC$WLI=}B(FnIseAyA25cNKa$furuX%=UJhhyb-8>@ z=aF9BLHxh-&q;n4xQ%Mn@%85Dj?b1+W>Bm(%#?{K7-&31h*{^$)e3rxsgn{+rheo7E30jygvzjl5 zYHvq7*FvovvEF!0HK;mo5+d=}K1QZb6i)4}dc1h2CXOPPrW?H&+by*>rz=AF*nd;q zVmi9P8u}A=G$X%`QA*f7{W8)q&ucW{Lz}wJ@M{!&?(XQfcANKZ=CxsW(BO1b3iNgF zdrh{>)Z82&QOh!z#Cc;{&2H*azMhLk^T_Z46AsSah9%bxO!zza(G4_TK0SgF6;$!9 zzR?@|bad>$FLaMdnb#1oNfk7{p(dct z-<>s}GDO6bi)HL}nkNIrlR{)`{RK}yP4_aM1Q6)pN(fs_KC`|#Tgl>FU(+9FSI}27H+`@nVr?oT{sJ3D4>lbopARKA-j!s`7cK2 z3-%nc=g;aliP)X3dmTB9oyj)E1uG`dgfD~Ku?4*BCR%DOvl^=~n0q86!JS1v{TltC z1j@;xEWjY^I{yr~we5p(9-;iNch%%^=nfY=&b2*w_1nT*b%SWYSjNns<7?IkKiM*Wl(*olIaFr0DxM@p5Pa$@?z+L#o1B0-RK0 zkObdQybKo`MI=tl!Z_aw2aq96p}~t{mlA>0Aj>6j$n5Ue&Nv8Ywa!`Q()Plup&+D! zh+*JwCH4sKUm9Gy{+eXMz56i#u8O$HNa}t|8!Efkvc1Lv-VptgVQKFp_u@-*`R5;- zFr~cWW1l^eHHHm5iiAtj{ZK_PgyvSniF!l99r$w_J}L-h?7}h9CMpnB*n?YLfoe0A znpY`9EP<9sCQlc5$R8GOsf^-kf!x^x)|Nx5ae|y1D^))ebIe(J=_L0%Z-Ck>*>x$( zcWvoSj#R-5orH5*q<2}stsDP+<8Mekh=EtiM}MM=K^dt=6v=rSdDTnjzmXzM&zyPl zP2l#wFg`i;6m|q`|{)?U9=eRxx z#98jP#fz1NRr4V{hwn2wpH9J|gxqng4D;N$P~Q>y>s%zXm~iimX}=+9#+d)(*m?N} zKd{l%TBYBuB~!?FKddu(gKX{JRa}QbfER9t5E*QEc7D>GOyIuqXs+u*3?`{Un!z^3BgQg>GLq?40BYAAJaTckx1PP5|GR_zQ%s`P^*Cr?qjNVQHiXlYQOnih z%2a0~?eMp7#p4GU!7^{}J4@Nyx!pog-a|m}xlqLll?RZ2yK!V2l3hiod60R?lQl|r zG@+C!yDqQ04vk zj7QcZ&$d!aFIGmmKe}^>B*fnJ51o&<&j{7cP<3XL4-|SGr8xZF`r$)Rtg?E+prr#T7TT2Q<&p+7+i?vNI#jo=*roNgcDLd@E2n` z33M%?GMnfQdpsw?fBucIfrarlw!&;(Ty$c+I+z|b_Sz^A&Lr{J?8#tjGIM`iS@~gn zWrS~2fb0Ki*k5$Ks?fD1hlQa=nuV`KYfRoyia}kq4&pWw7%0YfajuJToX9*zDM4a< zeyH4bFHuN_Zw1)a8f|`kiipP&CANz$AP%9lCD8s(Ld~gsM94lz&ZyaVGIx&|L8>6J z^9laNJ7V;upK_Won^bbdD8)o&CFb*eLLnvlUS&@#!yMZaU)#8)o29<}I0gLOY7;G% zEjn~L_e{??dVHo*+-+ymCFF%Qp9$I1!?yy6Nf{u%Ig$ zpZvpDh@rawRl0Q;l#^AL%(LdcqcLR4baBepmHwwRn_>V4bqPpOJ(@s@YCDpt-rGf# z9bXo2I_{W9JBUfy+=SKaYx{he*k9I?#4$u}lAsmO(Zw@f8iF_)vTynAwiH{Sw4=m{I3aDn3v%^^wGQ7n+S-Pq32_sN3<%?Xcldt zhgp~SNJnq#p-j(V@5JPYsVwU!9Ot6aXU1Hy1?zf^i`X*xt>yadUQS6K75w6=>mZG8 z_%W}vCC5$Np@*D$myemEKXOPzE2xAV(1fn!I!HKdmI8Me>0G#_q4a6@gt@Uy&Y)$d z@+!|?=((r)p~CJq{!TPVpyC-|cR=e7)ca4d1H_o zFno1rV&e@ctFRh7*%j*{B$gi`O`~hEUb%Y6$x9Ow;5mD)S8}Y7c*OwhnS{K;27eHk zg$a1Ib`x@6_T~r}&Ji~D3K%xZDPBHAi+74%rn;31zf*--^x2)`@GX8kX1nqC@&j1Z zW5FW?4?@+s{P4Bn2>gZTBOX)tX2RbrzyE+)0B{lp4M^*6<(|SQA+@pREp;lcMP%6H zt3oWf3!D)3BN}EXP8H^hboXC$D4$Ih0_2o=?Qp!KjYi-AMS#m!FP57J}w~>*+onk8@h^Fp?b50ZH#zLW=qrL)U+E zD=7D%6!i2|oDNNQCxy*0=8hbcxvi;!G_TlRIy4n~i)<)%6E%yQ6})eSFlw%hdXu8+B zyT&M;{b@3JYtkc?$ttmESBL zU~*1tuK3DFAqHhvxtj0?IS2Ab-UGm;kJ2+0r+z?qo99UX4_JKz6&~d={*xP`1h_w^ zL9QYf5lABvdVL^P{KBM?aU8mJd1N{zmENcQkV9(zO8UZh$sZV z|C7GqpCBiBv@4%w4)yoju);S+)ZSVRk6di%&t_Vn5UsgP>4*1cEyrNb?%ICC@RrS55LhM%u!_)Jw= z_y%Az8Q1RiHk|i7lu)$XH1KoZxmRw8bJZb$;Y@MpowZk$qNJG0f#GG45Sv&hJ-b}! zk`{mHvJ=gGAd&Ex9{Qa4n?u6GyedX1ht@|IMr+DfNFirHNXs=-s!=k28mdnknwwC$ zp2R0qmf$3|JCB-ZDv~4K6nr*fYABz7o@pW(Dk%qP*KfF@Af2%1$o&Sp-Im)d> zcO_l*zTd3|H_I%B+YSn3?AfMGBlwpw!1GuXC56ugsZ~VZ?TUW}D-KtmDq)^AOEZ>A zVV?k~gyNXan87;d*ciQ*S5wG!BH8*3wL7f2fqpxrwyZN*ZN{CW;6W|q^0IV&f^5aC zDgVXj`|534ec0^sEmz|knK~c5I$M;I)1YhblnpJ(bOXOy{JN08VT3PaC?`3Jp+%8g z2WB3Dj}yN={!a>L5|{ZNSneLrkr)rBa(mHx0=ER3%-EpF;Jp5PibeRQZvNE@(*uB+ zjK_>C4jL}=jy*&-L@#@nfpfiIF`K}q$#vHN^j#nb1;~wW8uP_pS~R&*EF^K1zN0$! zO+QpF>s(o9I#1;hsX2w7!}V$RUH@3D0Q2Fg>-#sWc^ut<^r@hagv;a*hqO%EV`r9# zv;CgShTTd}a=|trI8?RFFugmy5lN+TkOa?kg~}b}^!PQvmbPYtlNRCBI!U`Nmo*3D zi7F>W0(hQb!uLwM>xHfjGdB3mVAixsPbI&2-8&OYs)r2@c$HKbSr}f3MvzzIUxWQYySG`M8r-Fs}p=B`1vKovENs%+}~V4&lqCqC97SMap3_Q2oUXwQ(Q1kSWUctuA%7Xso~k=>R#LZF^aSTewctUS%SEVWcl664{qXnhsLVR)fE{~$dyidh zZ;$c*7zLbEFhyxzv6B@{CN8^)3$m+?<*uBVjD_Y!)SSi7W~5~*D!`-cIPL*jlYEZ(h)C-b+Uei3Pm4q49Et0x=L((>4j$ZAXJYYR!x4} z7GI!tUbyCL_st!1OJ6D3gjkY8_@ZS%@q!Qj*h>!>b%OdcL+@BJ7j|v5UccwP7@$7H zI6;<@ts2UcxUW?bgmmUGm}L6(_1!-{Gv{^L$K}H9xghk-hZ-`cpqH4AwVVE+ungRtZP!3N?1Ai>v0OnIUaGO-&{S zI}Z5PK_k2Sa0YjFG4R)S*c-?Y@NTT zS){Mu27*vA69w4sl{w+faqzyeB*qA+pek|7u9r$}Z_WXS)^mD}(-egeyfz601B56+ zy+M_*7s{Hbuy)D{ei`_<%meJ|My;KZPAZNsHhpd&H~*`HnB{s!`E+6Ox>~`7W}QlE zrojcC2L!{rx4*d1!VE{R4fQDDP&x7>lO!#mMd`B~O&dEOu5XYY&YmX!k|b5jtK5Pq zuSGn)Gv$wuq4_nbzMq!ho0=#l`k9T!E#E~0*8R1SJhAbWU zsg>l*(wi2qt@MOypmL{n94I&#d$1fgEMftB)oU*~WaFe==MJCy&FrMF{`|>XqxxI_ z;O2kDX#=v0AA+*T+;q2(-Yw3)BYMg|pYlSoK#d2iEC-4_daYQr3hqBsU!@6AyU}=- zcRNTzl~Se(zg!&kU)$GARkQ7k^W(kv3JuY30rBh$mwM&EYbiMo-Xo_oW?=|%C3#t-ABXp zKai|Kr*Fr42K~XNHqKt!zq&1JL9!3w_Z`tnLoP|Ec^qxFCCC8BWF}Dh~CsT47k`OQ{7e9xqOg>u6` zrzVHV5Tu5+F;yVsFz~pl28<+MP$-nc2~zZvVrG(3ENLJ$ zZSH&#{L<$a(8N`YF3^hLh|BUn&~6~tBaI>50cR!?W4!qlnSRq$YsUWGRDT}?^1it-Km8kGnM1i)#C;$x>q zyb#U!Pp~pn?idZRy)l{14u@2e6#dEbPz{HgG$Bhaq{2Mi9cMJ-)9y$6~AET{|RfD-<2SS--~4Gm_v+PRurW?hNzsDel$=|MaO(I3JJj$(o3QIIA@UfqdPur+|Zs8q>R`)Csl5U6NNJQi?lJ_QA_^Fk*Z(fCm^g+&wO+m z8Sq^xQAIaUiluw@7tj886e>=L-N1W*SQuz{wf7yrSk~=Kzdro;ZO7MUjyZV%T`v=` zES~)3EdkLV-|0e54!$iFY72Q?3O#S-*ROZM`0!ZZ|7J+#bS<8#HIcnHUDSZ(z{OMDDHd0sH*4QG73zU zhrl2BRs^T2zT5hirT5NF0BFS9&&#^1rU4oNluKAm&s+XHlL)a+L{Fk+_@b`d^U_&M zgEMl+?lh+*k&4HzQpx_Vp)V9W=bnAch{{1TfN^?`({O;55dQ3c&l3<1NBk&M^ZpSU3}K;@Taj~1f2ZClm^)(+Dhh*uA8#}Ji#eiMaVZSQXhf1rhgM&%Vp zphRj}F4Clf%NT|%SgT}VXF{h|p-~&&IhBE4}5W)0O9@+~Jl<*zYZed*hm!#M6~Vq8VHAWvoz?jdWW*rI)wZh~}lsiDuEeS7V_YQSdV z9`P~*iGh{xYD;AzkW)MZlyLV2h8FRfO1`_`Y0-x#hWr%=%aouvFzR)9U!A(3>Ese? zr(B^ub0#T;`VkR(ZtlV#cV{?&CChc5Xq`^d@=>#}t+4z2fI}02qK-KY48wMwJk)q!^XrMV z%(KxPhayMPT$MUrb%(3nEYYoY9s9gpO>2vLOzr9}AfuR1fRD{QK=5d;7kLg(w$$NB zs;;hIQ8K%{wHgQI+wYeQQ-R4X-Lz~dH?wjGu8D}teAV{~FfVV`aj2A!JrDkgxd+%G zRrbl|Y3^Vx_ETs8JF4jl-_+*Xt-rHHO^`L_2w`FmgjM#R8~HwVq|i@LFWyP>drcE` zd2-4rzB8F5FZo_(6@%_xpR~-6v-RB?hXpL9YdvPt2R`&RuL=Mt=|DRt{Eu)4os&N0 zSBWaC{rJj#*8iQQbnZJyeU|O8O-QP0@c3U8FYq|LKOE8-gU6&yb3)8r!`LBT>~muO z1Ese)HwfJ3PaBZFee~95EB)tj#`jjxUe_MA05F@+X7VRzk&82%F>IHcrdbokjpBN3 zHaOqfF{(>hROL{znUiMh;ZkF)rCeK+m06Mfqtm=}6!Rgvay{-f&I;KQkjB3be*MT7_yj(= z%{-Nl1Sw7N>Vp&`2O57ltXY7&3g5@5!YsYF>S;1gnB`8x72%%%tu5K&0zyO-ti&`YEXqpLQeDx@<~Tu6#{EsjuZ^?kOZT~G^C@LJ{N$)V%B;+| zTQ|4by4X}U+Mz63&PAPrB4z(Ke!*sa7lxo-0uUZa#Q{M1PdW!2;$7H7v3mV}a&CNd zV}Gd+>oG4Q)xR zC?tR=MH|%Qn;x)PVeIrYDK{l()?}+H*!euHN-mGmbae9y)nlCw<1LqWQ=&S3)@5hf zfbiir2jp!27j9eTgp~vCeKx0k-BKC7vk^~MAaa+$ZvoUIJ9Tky)dT8OD4~*aem$KM6~-9lu9{o zqpT#WOFGTz@YceL(;|D3FJ9xN{vd6R|SM9fBQ#C?v9+(F?AA`=iBrwB@4vg@T@}@O{*^%Dt z{j^!x4-_-U--6_~nwxY7JiNfTK2_KqDC>|k8;l%9ge0@=l40jXyr7p6cBx0wTH}i4 zJ(_%`w+8?fzQd&_wW_ZC)eM=%<=y%`Fv`)VxDh*wHSOAH)Frh0g!3#ENQy#?Zhs)m zv>4*?64gEiA~@#HVNxWmxb2T`lSM$~<`_b2f?D}$UQhdOCxg7xIt=XjoJy+EaDm7U zJ;Xxu!vSF;f5YH#*wNr5#5ZyXY25w_0sk*c`%rv&?d~ksnkXI+)Ka@$oPrRpd zW{9njk7=M|_k@6=7ehGY>ko%1y;a@LXi${gnsPwfg&QP0`G$k(*=OC9+SDa95vXAI z`Mc>6@lU2Jv_-Y+x8{m94X`u3SX&;(R@1dpjJQ*Ca@uI~QJ0ME0R4H!la1|n$?Ay_ z_YtOF>k@A1GMofPuCqyc2n3bA+E+Eq;lY1_5lpf4W>YJ6e@&rO^qKlMhICz}@z>L) zfFjde0Aoi?&)XS!S(rLhwqYv3uE>Z8jD}*`(&A5alKR>>%f; z?efL^DK!l(V{; z6n3~MZ29*FuCJ_t(fc5L5HzI2~XrDis-4*68`YazP((tfV#%(j+ zp^Fz+xVB@Ze>Lr0R1m?kwt>6D7Yw_|51(RJ?r-1KrcHCg+J*ad+`cO~b7QJ5dNnmW z?y*-TWUb84ZP7rCF9mJ<4q<3>(Jz6AD^S*b|JWvElLrhR$~rg1I$O&H-R@Ax=kvN2 z)4nu>8RP;zvt)NMY5j<>IWa1Sw1gfj zYRQLe&F;NYt`$3pX_Kr+0P*iS;pCf3Jim&Te3nP^DwceVr_kX58P$8#;Kx-)^o;DK z+tzFNVvaj_3FJX*?sBMxo|oSKsMUvjZXB-H$q*f z&?7sfMR{9qxZ$yYRz?@;aiD7_vapreM7Sk%N>cH*@kkR` zjH&xTjFXoA)R=GoAb#C6sZm}dt|AJoh}%4APGX9CcQwXKheZ0UzNtCJ*LA(Q1e*pv zZ`P|2rB}hKf;Pn}?&`DFpJ`m~3Uh6|JR)oalh*>nAk-!Li$E!OlLOL4n7RK4+LLBQ z4QO_HggTwB$_FV=aVVT^OSk_RvwMIx5bGr!GK)8Y2o$Y~R zE$D8cQ;4fYvMxn_&jVQmqqLI42|V0!{Jq~ttUvS#lEVt4>;FwJLV#Ro(VPvH;fLm* zr?m1_=Iu z1dBUgTYeS{Ti;Qj{F6k0MB+U3-qZ&Hp$aI4_7pnEYp?gT(|jPyi9gJ@&9;C>Fiv0r z9E^x_ASL8L!4i75R(IY^#u~ARj7A z+)9);02uua9{lPw|G2Yo5ma9-RB~x!)(&{1hDEJnM?bx$ z&^Nc)d^lBSZ{zUrCQXbwSAB+n&7GJ6wWXQ-b5d`$1y9gtC!_w@1eS4q0vAJ=Ocf?T z{g$Z!2g-sl@n`~?R3fra7>#@xEO^N$!s`I}KxQ-PHwKMi_^*29=d?1RDZiCzZK*#W zz*ACjO6MO?b5bK~TvBo7co^U2(L69<4xA>Ya;9I+4Vk`~Q73q%{lVvueXRsMDy>Be zAfsJ5v3gDYkaap$J53XebFl%OO|c6+9|y{6_tgETS~j#OBY%@~40L!LW${U+v7c>( zcg|>i@>sh$#l!g~obtZok1R>5LiswNdQ7AB+y5*pm~u07ynaW!!sNZpbOot#F9v*p zwoJrl|Eb9G$$X_)c$%&TTkoFSpu+Q0?t4;BlnpNI6+@)$4rqUCa7`$Vh+$@vbeA)N z@`Z@uvHL5RS3s}Jo17ti)sUN*OqA!LFFC;KZVwWBiw+?gPo!Z^@;p(HR^>@aE6LehdzS#VUB>~dqMA0JhQrZ7 z6BA$dk8gZ72{o%8O75?dB2zvHh%suVQJmd3g;^rdoS&0w%~+|&I9m4&^#~|#&qr`? z>7=^MKf~KAN>1%-&F#TXd(>|#bh;0pa>9SNiT2!Wyi^2|{@&1RO=+VU%)d= z!|@v|Crz0m5ZYfZISO)a1GePj9|6q|pp^f_kkd;jA}4BNSk7Z{-(8?W=)$N1xxQo? z%S_x@^i-e5gvlniieVZ0W!0Eev^1_7mOVl6dKIQl7wclHw)>=9?{Y+=8AKYKBs{CztTKC#bJ5I@ zOH|wWIB1akE`U#ED8yY|mL_i%%hXy$z9YY2_UCf5D4wt*{TClNtbS>dAZxtg&pR#t zKcc<@D6002S4BZVxL_lBxX;`{hx{)psX#wd*SQ-SDE@|mlxi z_rLd!Gds@cY@Bo6r+)GDaj~3MlqN@8e>zxwP-j~LaR;;vQ!i9))=5^}b(~0O_vVjU zraKoYT7vYI4K-O!R!M%{x7-p?{U#j@D8y_IC%58`=YovRCm=)In(y{`-7dWq2)lZ* z62?PUFGa!h0Qupynh@y;G7Zbjf46oBGYtzgAoB@vv6qJUmNMTgz(D>);yg(G<&BBn zHKs}By+*+!P5eyzT*2Vpv`D_e2dmAqFR+g=eHmFAtIT4WPKpB_C|JuhTS~Vc+fOr; zlxd#O`QzR1WJ8XmVcqtl;O)l~$N&D<-h(Cb9H>VLw7joZznl#qmOLWJya(_xEXm7F z+|wU%c7S-6c5~#gop=zS*&nPrHTefw>*~GIp6egHDTU(;YxInn1%2 zQy&OmiYYOHw4{*O_CbVmhl?*zKhZ<>d8C*hLa-d$C0GCXP)q~WllXc#a4Y!!uGbP& zqoilZH$mCO%1`lQ~|&W3wX`}?3jjA;#ILH zmH$~0?LWGAOT6Va>mP@;li6QwI}zPUv`=SIzEn5u!hz3rYOR-ac}EQ9L^|zRLsS?U zDE4q<8CiM}_zs)n?-)&4M$eKI3X{n4+b4XrDzSD+|FlYkpoG5cQM~$7_Q%;GA^M@s zU01e9T$f8}$; zS;4O+@}u0QY7}WmTs-I-^?HGdBiE89AxtpM3WzKoNsBW^r6o^ zP9I_H^DgM~wTXP36#ql$FiZ6w8a=V$$VaEd;pjI$F&m&_!TSl)(ja3e^D1X~QuI;M zk01EP2C^?wgtb3FJ%16;OASAyAF+Nkta6ESAWL`f_;8%x$93M&sg(AXX=t$a zKd+nrggZEQk)Q3{0uIbS=z^Gf6VeXoVSS={Wo#7;`33b=y|b28Gxv{0PZHE>$e2&S z_|x5buxvIC2pA_$S7^XOA3*^b>1O;4nV1S^@Vx)uKaTC6)&A!-W8 zc%mb}Gy+cbEVwq8V9s|dpvgXeAlH~EL$&m4ogT1=zuvo>IJ z>PLR1k=&xXp91TsH=@CePQR-}{f816UDp7})bzxDJhrJMV8#@D-9>G7d3d|2sz1@c zs)1hItQotdxNUcK8ovY4@Uq8{8ZcC3*GH#{gO3e>(b)|*mTE_3+2$ksfJYQg5>W|i z(C?toZ;j(;Oo+3!A_Z**o{JFL%iun@i4|OAv}(nRIjNEUXpc>z7w=wj{70v!{&yTn zZlPK55>TwbRPcVoWtR-a5HgjQ$lnu;xR|W8PqHnQciYnc6Y&lGox7Lm#m_ssgg@6V z$AEk)tqSd!S#ul6CflZ1Ze^3p@FP%}%Rp$Ah-D@o6#{c+Ct_>E3O((LFoAzU&&$9nj4)>MBWnt%I+W5Vx0Y;JW`4v3QV88wZnW5Gf9Vvpf!~d9|4= zf?CJ~-^l#_VILyv9HEp5RAuAGg8vQ0J`CVHx-I?V1cMh*0O`)faG2=FSPgTsNID;S zq7G-u)$$9*R#MTi0$*sWe!APuStUM*XyAH18;d=}CRvDf7lm$(>aG8WI=`MyrM*qGiW5A6MtbqX0r^5?kVm}yQ9)K$>?pwfyGDmT6Mc(I1lXS1T=s$tmC^LgB zpAc7nSCFFzhQ!OfEw@`#g8?P$b?k4ok?CDLexe_x6uOPM80x#5fBz(h_ZO`jC!Flco>Gbw=M@*`)_ZJ9P3}oOBzJdqc{4TK z2NVO|ju%J{GyfI@GnVrc=I)i$(81WbYN05HEPJmmFcI zU^mOhSDDRK-;QN)b6RT#@y3JxL~LKiL_+tF`bFVJ0e&dur*9gTmADA&Gc98jCS;QgIr%(0^OPxg!wCXlU{6g6Htfbs)Yg|4wbjQ0lVSg>tFN-OJjNYL=y(b+XIrruRZuaZ; z(_H`8GzZN?U+1of#0;S$59+vBu0+d*|1D23U&zdt%b4Y!btYJA5zNDkv0I z+g6dM^3WWBPI-AABgudceKS-5R9Y6Rb1wHJWaQz_g?5l7VvlIy#_+|D;@cgVr%wTo zy^o2JA^NKxZ*b|JF}!0;d@oV$QyE=@dYw+GdE;3xVkh&B(CaAwN9fbU?fOjDN&$}o zmhbp`97(V*Sc^d*QcS?6C-&{;SflKZ7=T3M>Cd*zcKkjv2708iRLt@#w7r(&7b{S( zqNsu~2)*aAGOf~*xL8?w+KSD-C2l-EZ1E-x+|eR6za>Xbc%AhUsm6y)*PR#BpBKu# zN#b3m`Uyn$KYm`3c*x~$7<+H|M8*Sbd@Ub zcrP~vu$|d5pXv`^p$f@j9p2?L&t?dc9r0bq6IVA6y+Kaf}JYF(U)ODNbt zz?TxHQzGW%-=7j-LwCacEPblaetJhx{#HK$_jsn8PGcZ%aNqQNk|^=uT%(^)?S*JP z&(>UI92h-hAML`+S zv>%^~Xgzhp_0RP98qhDiFz*FeSL;-dYj;}oZP!%<{z;A%E=-!6*n9%BHs9%5s(INe zM+R~j(9jKDoF$6*)?#GS;?f0+-5Q3RrzkLOU)Rt|tm`EkW&D`3dr?of_-;cvnUhK* z$_XjNlCw!DHW(1G_Y3F|@Py{jb`N3S-<&=J(=NkEb21N%)R>IKon0^qn3E;&DMKAZ z%f`PQ76F{?5{o!!GS`gb%I zXz4p-zeJsG@J?C0mIITUpbD+Ufw&vfu9b_pmz<7WZ_z~y9CE+pfz9>9GnFGb_T1|E*zRqsz5E4$ftdeQ)1IKV=x^aeuUN z+&OWO2*Cmbz2{Ar)I|#QpbO{W*zAt#d9;H))fR9UXcOAbE|()P%T0qxV~5nIZMn5y zCRj(XewWjnK8q?iKfZFyBfXvm^3hcb_&Wv+<=uaRS%4{q`p*U%vBFK*qcweyp8en{ zpBL6f05CAKys$iA6R-HBMQ{rZ$tgDp3|BZ5xs$vs~T} z_(=aJCc}`Gz-FsyfAfLAkyk!YSGE~|eu0A(qC-T!jr38>Y z*zSCMZTjT^=9XSp<2Nd~RR)mQ5a>A@NwuwXk;fL;p#)B|ZU&{NPPiR%4ahM8J2C%O zEz#DGm}MAAkr0VZQpsxcaa)Y!RisySph2 zNEK{W1X@pFe=7}XF*IBCh#t*FYkfrJfa`e-h~j{(0&v&oN^!HFgRfEC(;-^t&A-es z1;t<$qBV?N(*4;E3x3;G^_eJH0WlHr`1btiu8KUOQrVBq8qW zjjxfsLs{?!_48T`Z+6s|USRD<( ze3Pw-gDrD7h2buDa=`n&9O2klwR-I32DG=euc5?@6c9hVikjm%*i;Yc$oHUGGzCa# ztzPylT2yszREh`tVq#oEi-bN@KKmdZ*4B+m{YJ2G!nmxu@$p9GXR(m zT`k9ioi;H}Cuzh3I|nedox~85KfEPRgS4O7Eesaix5a+-g|fO67w_JB$x-!Lq`8({ z))s5JGLI+#D-WEB0Gv#NgThvA4#xkBP1;2>kn5*VIJy#D4zL6`vRO@iLf*ZOjal#4?H0>l z_eb;=s*at7dr_h@U36$R?3WXwdxY^Kmev@s0r}9&N@p`Q)M=ut;3cPRD&q6!3>j&Z ztR1zRg2?I_J~!qc;f^&cK!@IIXsvIvo^H?*|ENgEV~6{aAQmUT?by=9( z|Nf84eUUzyXeyN+MxG+c%Z&lV8(VH}@(EmWVwhXS>O(!)OsHr0Tv~ z{?6iKoXBcMw{y*r>{rQmR4zotc2QH3B5^~6$a8X~_qYYw$bC|P2m)XGFj!7((B%0; zw(P$dYq-deJX1HVvW8RosI_-TO`mX+W`IFP2K`xO$D?)Z{jtVc;AocKXIpH}capFz zzL9wEpFIGg;e~~pwDjN-Lp7JkJIX7yQA8!NPO?*_BMyz@F3A+Na*VsXb;`fWUd2hr5>*v@Eu80ZRbLl7*-4Cyh6O+{$cUB&1JLPni8AP)EAtz@?ICuuYhQ!NKG}J$wEp;H@U?k3ssEq zu*XCEr1mMIVZn@h1&I^8=8p^MHJ!{_pB}cAEk#Ww&y(2~9D(V*r>*rSpjnUJQEbm( zY+WEz{E(m~_E7KbHI1uMG#E>rxOuqE-l3i^gKYJ!KjSD~7BCco6VnG`7C_%e2WW-# z=0DPy;6f7Y4Cfg`PjN=uxWWve=wd!V*Xf~jwK8pEn^;ve^+UL9Csw$YuYcnCK;paa z@()k&iD^^^A));u#AeXen9p+^Xh=*hUa1GjIuvUvOn3zuouKy1VKV+94Kg~Zik*Ei zD{lhQYniE(paux&rciG;?K6}-+~mms3l;*`>)T}^D*iXfmON!5wRQEGU66Cn4Pw}R z+VrYqF8P08hv2i8z#0E|%O6wN4a_-Xw#Y=u%0{>m^`sv%=@1G)^~lZ(XYn zKfm2Ts}s%2>Ocq5%7Z5gbr^_|BIWGR#0??f(IG5(+y;O`5y{}~6+ZGOb^T#6l^?Qu zXM!19e&tHsxR5i$Oi*m43ZHMY7=AB8p)2jr3i9>k&uL#S7FW8M@DIQ(M|r3Us&nOo zf$4oN-8m6YH_xs>xHx<7b64X>2RMLcHXYTCz~ZB>S?i}1jS#$;kAQd?FrkI>Ufe0QJY*CTe&)74 zsV;FcM%>t$6+e|Euk7GFXsRh$vQBgZ;B&WMzS@U3FL9bjA+S%)#a z5H4snU-LIPBHuF*TyUM@17NVJMF^P3^@$XWsW92(i>ghA(;132aJjwnGmq}hS!#XA z5fLI=2&ed9JDYguT)NXIU$_VC_!{gRPdbU~-g5O$ki5J+M{eiD7a&%2K(l!tp@H^* zn*Pg!6d0-`=mYgWm z+d%|181Ehc@!91`E1FE6U70xk(6^7z0lGn__T^j9!%Zr30!P*j$d>f!Gdl>=W1B@t zZ^?c-tW2)65UWKfDB-2Ri?9t}^h6hnZ|AFLb+*MaXU8YofctDES2Xd>mFE~5rq=ak z)1o#JUA{}Wo7#S*(l0D5(|lA-^VQ~O$npG{6Y_I)iiDR!ezp2@>Z`MX&2Nc^ zCKbOe_nc(fTv9DvChzyUURWiATZD$R^6!^*NuoPF znF(=eeD~`xzDu1xqX0cpt_R-YQ+Y8Kf2ej3dJiyQX$BfH;ERe;o>W0`4muLkr5uGKk30-7J67qd23)qfu}EE9O|O$Vm-t$u;5--{diKLX1_ z;K~YGzCoMb1|NwL1ljTO`%ZUAH-rcKKUakRoM5nVkeo&gkC9m>(GX|3u=9bAbKoFz z=A%c#9HZ_Pi&XljeYcLdYo*)54&awDKk|}N>n#Na>zlV)JU6{5@#5>!kOkV&Kr7gBhoJ_1 zb-)3i7K58O;x-sU&35jBC*i-|eLz$H+gsA)*FePW3@8A=B22>}A87c8!7OY#HQ&o> zkQmR6iF)r%O_`lloV38ua&-~E+TJC>ao9v8!~?a^Z%cXAmXtmA@&Jiha1l;lKgTNU zOqg(sB=jJJy{^Xkg-O{aY(@00(^C_hwKC7Vj{>{0SQ{F6X-xG_)_O2?3@p8ZhRw?y zW2|a1_Vv<%8QDr)NcU;s7H97G(RROil1IrRNH~!ta;cRcA~ixypr&_$1TB{`{Tu-% z|t3cS2zo%2D`6^!Z-!A~Jb;%wJz}!N9#}ECVPEKeG zSw~ct@+3Mh1TImyqnWg~dVNXReS9W|E{XIlP*ukw*i?1jeuI|h;fwD_dbB~@@0H8- zWd3)Q_o+v2iOYP+<(CsKzh#OZib7D1 ze1#I@XbcN?rLl@;|0NbtfeCFgpABh;9JTub3?>Nm&i?qcFM zbGd~D798vvz1tm*W@NhX6^5zu_CRmjoyzRdBj#F_<6cz!u4dfNu&K{Vw&PaO#YAvQ zwlf6S!3?;{a)62753H#K2@Y>Pn3g!w<6_4RR-b*Z;p2fi179yLt@7sz@u^H!QmGN$ zn|7-<_@B&zQbF>Pe|i;KcO7S=?4mlc>PXkD3wK)(HG|(A@1^dhc?zvQKdi0FY+L6I z@8AHOk23`Ai*&Vw=$>o;G}Ml_rJ~nh$2L52Fy3>|t#gnxzlqvwKe$Gg%{x1EGPP1! zGfHiIeiBAB@q@A)V!QpMIx!hd9XQ$e=D{j(ye}{3II`?U6uZ4yW{O_DKY>-XS z=djre{Z-KK<+-}FWc_N|4=QZOuiD!NuvJz4G1EjC$)p_E8+Or)aA!NXe!#1mHl zW(2dREB;K@`b@A>Va53kL4C)a2=`#y)df$}%E_lX=$6iff1D)6+tZ57NEl6|H30Awcyt2O zP3_!#VXetD#8sxDMR>RsEt*Gm>xM#H33;jeEh zKCXyXe=es<@q8n)E_GBlM zn&)=pB{ZeUmH(H0={QjI*tb~GM*}Ea`Axhi57g^QyT7rQFn#tLtDve2V{oF$7Sw*$gjru$lUSF=A;c{ z{XZDmrIY9hE=2?QSo)t2f0#ea=&A>4!e(7{mDjdW zmOe(1@urikehKG*A6tMm(5T5|+RiIK0mE-Ff2M0Lue&i;dp~6uoq2&*zF*Pmr=Fcn zdF5)4to(Gx9JEPWOj-ZBgXt=7Yq8#Qt`48yap$wo$BY!g?P=I+m6`JosD*4=sfM-vL?*g=re3FenySE^$}0$$b3i++(S?Y&$e&!BqF5%dZZ1?G($eTN#6OIjentcNSFM)kb9ADa_hn@qUCmbWF=0(}Jy1*a@J?$J1q1DBS8|Tf9+W6~oKZ_>^DfCD5 zzu>I;Fs}EdSp*LtHCQ1pVRF}vM$|^~KwQe8MPDh(W|t?KzpY|&_n%1;Fp>{s^Xl_a ztl8q5Aq<`7O=IvjQa)%iSle;iUDmk~+P@&4KGR!$Hp`NSvf1P$hp6zjeldhvwV8Q? zKn@78D&AV#QwKof>1L*w?L2c4q-ZY%PMVwWqKCPQ~?s zH9T|N3cx8LFd;m`+&$DUF$Z5UuN>-0CU$HHBP z$mlukjnBydT3xV_*G0PDr&*#A4~Lj!N%v>>3H}C+ChOWb#AqwMfAAJVYlk<%6dAtJ zNca;SENoKkRo!XqX`Cr{XQTi9-m;g;dRQh-Ti@x#t{qx0SWzK(IOCe`ri=8?hGpD{ z7Mf&q!Esr}ecndu{YoEt_vw;AbI6jpy8H~Sa1L4|#nu^{K|*ML6wG~opRF@stEP!# z42Oe7-<$rL{7wA$X3EE*M@;fc+kUC~WrQA|`?16*@OkdKGg*ewyrNKa)bBN_6zIm? zoA|Dk?x#!{YCXJW@go!FWJlLrAu1Y%Oi^Y7i!WUrlbVEdJzfR)d| zX?u;?I=#eTVDpyC7nqxksnEozl1Z4ykmwzaER;+jv98@jMl+St{zo zY%P7mb{lq)y18^DTX-tv*K;ooQw>j^!lJ@*)qAg9*o~7F<76VZej)Z8vAI}C?nU9& zY-za@&-SFD)C;_4Q;%1loXaBG)f=OmW;^GIl-&eMg_|{J8I>5g(Y0Y$8v0Ns)Yq05 z@AKB9rD9L+(;u`v6fq**jl$kgzSJaCgoHAGh0!1*q~O>ld;*<_dJQ?fr%e73tVEYt zj^Yig$LuT)$Mehm_phijrUoO3>$^r%dUu&EVnP((Do1l;(hedfmGYg@%aqiA7xvlU zQLgd2rLbJv5w4YWaQMQ0YYjr3vldvF zQQ9+;EQ5KQbLlGe3vX}^#*H=${^E-Bd;eL9dO&%{vUq-pY`c#d^&H+&fFGu8dS2Qy zdTx^lZ%|HCvhEw+TM1r#Db7jnM#In?KKS<+=ew$Zzlad-<>7NJ@1k5K3<HxN(NYir9;m#x5zq#(I3}Jn+?&2-WEoB)ZC}mIKT|N{&zPva* zFnucs);~;v;7M1>XR^Xele2UZRsAc?j*%#MGLJqUP53~HU#^c)Os={?-G(4{hVTdF zT{z{FCKl9(J3#^WDz-j(AhoU=RL%zcF7uNsb~Izq&&3bFa{SQ8c!w)%_q_e(wjd{W zn5K;h8`7|L0F0-^!(scqzP%~!9i8NOkN%D`KxC_Y);L%MvSy5-xLLWmQ6|%who6ga zOyE4b_hlpbQHHq4MFgoDR(NAz@#fne1iv7SFrKF9n?L(q?&OD%P~=cHBy=L{}bYTl*dARGMU0%jI&ggK13Lm{(T#jwA^t`C0JlrWQAXd1p0{1My6l#ig<1 za~_YHR_4W}pWKJefmAC1{IU* zl!hdQifMK?37i^5QsWsE_iS(YS6a9+s@TVqjTjfjnl#jYXAPH0Rlk~fBc80=+|)Q| zgYrv+VIVN>KDBF6xc3P#`BtVn)js*oG7p5U#6~(^>DyphB`<3G#r20fYFlk(@K)PA z@yAfjqL}UUdw+h{U-p5|%RIt$j_fB7yzt8*C&shY)4HQvN*nQ`5qCd$mi>AB`c@?UCw$rJ5j;^p8I#Yh*TIXczF6$Cgqnkm*;LI4~ zG+t62RALI9bxqQ5gqq>~sss=!GIydhPWZZ;B^V!48JSGbcJ*>2SFtd^H1ADPDm4cs{Z z#2ylGOrgIJ-+K@NRk-kH#e!FA)Z<>3{7BaW5mB{mVl5Bkd&e6g3}VGknAai1Y0_~3Kh z7JaKADnMlW5M#cuv!!n^40od^ZL`FpMD3~MJ!sq%>cd*&G^C79nBih(1-tA<74inq zEPIUFT|8>%JBYP%t@w1tq@C2uA^-Jy@1~40h$r#sGv6K zZI(#oVma9#%9DzPxrHwp&6<{C<@j2y-RDfxA-?I3<34rlz|g?Xk8M;1t^?50;nNtc zH<6ggMUg$m%FpzfA#J2PvbH)@npfR_T1l(G4fif5b^Jjq(Mh!AkIVRO4~C{m{taF5 z`JJ|(k!5SHB1k1)@+|z{C%*56$_Z`cLok;ivJT8IIaxY3^mJfs1(k-JE-OQEW7-gG+2IY(B2O1$7db8M|qsZGao*VPvZVw z?`Y_cyi$3;DtLiKBB5eq#7n1!`DTJeaU+#1*_i~n7?G)e2ldT71WKnEn5wmC=`E6Q zG2lKPN)_xl&c2H3p2t%rR-IHFXB9^fzB_AvhI|X|gC!esQP}i^0=>fGp6-KD=rB!a z->!x;{IA>TCybjfbxXN>n%4}?PnW?k#G1Ik*h2UOKQ=@&WGf+VeQGK}q5s7w2JS_m z^@x!G%167%)7^30`Z^^zjUR@@1B)0@dHyK?h^5p`j(GMa^G|%nRE~6t?EmT#*^rGba zw9U=-0mogW{GrUbfi2F*`G%jCgVqGqp<~OM52d1D#c3H)#x0Ew){4p8Sv4LyGHnVz zv4it5r-R|-eC`!}px{;eyov*MiJS4Q;6eGr8_y?<(r1?&DZja~E zS?=NMLufXNpfdA@ac7cy69A54xF4$W6*>w?p2}Gs2qYimtmS%7tBdo-V|xRe_fA(X?x7|zzQS7{*}`m z5J^xP`qR}XE4F65rc?NVjiG+JRs*}%~6*<6|8^}ByxBiUB2f79-!P;)q&T%LM34j5N` ztCH@JNgWun{Rw$%|N6xncp&vJ#0#o>tGf%{R`>;+e_M^TmoEF+T(g_E6OSbCTm{H& z$C`zlaD+dfsiS)EMsKs^A#EQ*?ExCky;t)?xrU=Bl)tQWh;+#tlDH`LI{fJ4&x6o+7432yC zr8r_M(FLPozvBA~h%Dr@3p-0mGLrz3KpR$*3@$P-5Gt1px>|>zX-wvq$Zpd#0xb{#`i1=w-|0$e)~h_5ut?n;yS*nMx;wxtVU=bP^^Dx- zIA!N5l83k+j%ixNqJIi2l)WGO*f=+I)h^a7vbGZ&WK^K4QO1JzAhJpfjxFzGbX2P^ zKd5b~zYNK>8Q|8+pnXIh#cgcE9!b_m%j@pezPi&7EYkamwkqObOw-vjFT`1VfrJBEnk|2fT^SB$5 zR!OrFy9Tj8@e$DD@KBh)65FW$Tc(KY`sz*Ac{`*hT0}UWt_pS{Vo|=ZaQkV&d-^FP zoiM4_@}Yf~NxqmP@+YQq&2fTWFL!-%Wzh)F%nk)Bo^((WgugW!qSy;}(hgx=<`0TJ zcuo>^#{_9{f#aB@mdSs&o(P}>HupKmYL>4bc84|hUVo4x4o1+5Vzg zwdwE0uBI0LfG|H73A@`$#iftSIxrX}H~lX{N_~N0Fmg^R$Y*od9xn;iaV-4~!i<+1 z+m^MJDp_?mT>Q z^Gn0YrKx?qig?F^hyN>w1`stP&y49Z#vADOX0JH|lC$ndS`KF!bI3XRW8lE*6CEUazvoVTF! zM!oRONM^K-*Jaq5PSd!U`P1M!QK5SRai0@CuK!WQ6GgmG!e$Zs42NZvs_jqAsA!lq z!+5WLflAOjD(Nysk%RW9^Ic5o5}MeC$nco{vn`TB{4fr(bNj;2vj+~9CF0o!;U#I?ZE4Hh z_XaqM5o}}L#Fb4}>_7N=@rJRjJFU-S!fq{< zxm$vR#byEns%eJlY~l17u{po+;+i6})`olhowAm~k6(mRN>o`?j~uUzY*8(n^@*gX zcR8DfL!FbU&CccL8@Nn>1zc-ronz9A;^&px-@7QKI$M9hRLNq;hiH+;2Z0!x;X7*~ zqQ5)6XrCP?#@a80uIbSQ3516+idjeAdu$Eu^*#Li*4Mkw%t@9rMfeTe*`_yw7Vf;= zByQ_3M~!}702eX&Xd_s2Wpgm!^^i^OPzLJ6d_z{9-=H(j!ZYw-X!8P_tSCn* z4SyZ2EcV_58-fB>BA4Qb5;sSMYjF_qF6`+&%ERooIQU(|zN|b2Nl9m_3!xUnT%_xb z%~8z91D61#VT<(+v{Q_1h-G7~a^mbdqv8LI_0+9;jjl?mm`O7M=_)$RnB)}Mx9T)#Ja zz0GybWoH~g#Ys5`V}r%#JO6!)#NV39cfCfd)2wU~%jnD7nu*f5P<*&{Hnx9y>98>s zyT5CrAK0#DHi0GBZc#W?qSHZTDra9!H%%ijcC_S`5}Jg=KIuGwV12u2so}ApAy7ux zb$$_KLpOBg@9q1$@O>dlFm`y+v21$@ZvgW9+lFp8bzt_DTZ5fw1x=yuB%{*t>5?d^ zvf}HgZz**rzL%wHism2k>vZXY*o3;b_QIEZJZsiB7K*gI_*eN+Z~9#H-#?*&d$Iq5 zdc0{BAi0fDOX0AVwox@nqtD{Hx-;wH=~N7F6UG}r1~W>5?P|&934>jr{L=yW#?zUc zw5#ZyB10dCx_C_+8by6fRQmrERgES!71#v65n(q;m>u`c4x+yPDl=TCZClP-x~14o zdY76HMci?N$E8uI(a(c)%8i9YzWk#4e1)l8_H(a| zZG~kNkub|yRSj=dhEghloMga9tnVB3$|h{KOLNtqJwn;GB-wm1(e8!}n?MWPL5;ce z6;?e&X*R8ZBMxtLNf`f}=F*<%;txC64%aP8Zk#&3?*J?j_dCiKeeZj}&B@S$-}QVy z`duklC+rR~$*3YDh;KFin|aT4&YxOT;Q&c`&PxS0YPCF@a;~ z(ai35tYgFn1&|z=xmb8jEy*5F79c*e=EJk)o@mWhG6mjrMKzE&bt4<1=l2v+t6vK4 zIY_7&m^r4)WQ|N&8f}3|*HxLSlI@UafNmW^oJ4(|0yqGpJXelV8$2em=iV66*iS!N zP59R&4;W3~%*2pJPv4oI)`hd!#@I+(|0TN(>A9RNBOP)X*do6?*mp4@$xouOsZRK~ zo`6Dw6d|J}VKHQo6bLupNJ1-GJeoC73&8nXt&q9G6QYpKSIVz^srY^xG*bFM-F;|1 zIyRpFh}NN9IA#1gi+6QpY)f|A90WoH=MztC`5|PXz$-n;)s-NyhWnl!2*qo53 z@bG@!j{YP0{i`0aC3|2x1!*@e?^lXbKWA+zPux4mbB&eGoUiA|=U6PdSz1<`kQ5nw z+lWI7Ot(*Ewf5a7yA887%lY2Y@qvw%0q|a;Z z`vqTE5p4<>6f40Ew<3_N_Y*VhlhIycGi~_oRj|jbc6LZR%eg;$vST7?ml^%?Piu-x z;cU%miCnU4Ie)d7dHSvxXF5M0E9@B7Ui?|!K2+B{%;)cq9i6sBF!pnH>W|v4Izm?j z3Bf7MmmrAiPp`AEP}Tci4W_2C&p_9C(KzLJkDLujpm!{PP0#IU=_#ioCS?$sEtieX z(>n08@pGrmx`&-LC(Dtr-6BpIZp8wcd*ru}v~cwT(Yc;fFyYv1%}Z=zxWVq9jr-7> zx5={mCJg@w-CrP^HI+iv7RG^hhO@3 zyDAL8H11HGhub&M8bD>5z_v0d6FkR=W0^!g~wItQXl3**LZ_ zH;847j_|_|UnMc2pbJ}dk0MP@ffcjTWXb%|M%`CW8hao;FZqu2g#?_A@nt_%)yq;& zR^+12*U`kdzEj^YSpK)CrwVBCIWrmi%#(-3O+`WDj=4bxB7#t&gkO<`>%|+2>yNMA zt@D#4R8hy`JdPTu3Q>8$61_KjQW-@|jqaGHLw<9)`L|ZA?>EjGDrbU}noTpo#iJ#S3{|WXkKwk3Nz}fOPcJCe}XD+mJz+F^0gKH9oMukqnZUf zPna*K$V}56+Hi+5cCx+CVSK$3melk?{xH(4H`jU%6nAn5#x%C;eW5dC!&HCYpj!Tp zQjNYr-5sUEv&1b(Efr=Tz|X*5H^tvzoQj8 zF3;Ng*hlOi%X!1Zu{?7m7%brQx6;pPx^$h0tqZ$jC$CL9Pt6rnSrLa(>}+GiQLgFO zkUL9XdoUz$9ckMqyh^hIUJXna@bor+>P9N} zM@6cX+8rp1;W$6nDZ8?DgYP~RW)?pUG0T7NbZPId#tz0@L6QAy?Y? zO37Tl1sEt>uHLoL>7oAte>2{&>De=u`2=h1n5zc}GgHVLS6*1>T)ib=cGi5=h%s6Efr{mOWMzq5_m{ zfPe-HeCu4g;BT(${`E?yNmg&cM8fz1b5*pNZc7R(VXW4zIw4@IH97L;&(8w;HCg$T z9v+4h)IJf4rR-+|H7)`nT~!DBuWIxU`rIwW_AsT5^&ymA)%5HXwY>g|lZ+D<=l2>8 zzjVt#esC}Ue5|91{kl*k@Ny2z8sKlPfQcPS7v?Uc7COhZr`J& z4spq!kbPscehO$JDMRFS!q#JUQJBDw^T5};s4I7`ov2WXg+@nvrbWc}J0QP2dz+iT zAi#*3n&-JC!axgIriG&u9aw~5Lyfz!lS^*Cj$t7(Av+4{Sc|&E6OGcWaaU37-g|tw zfX^LOl@0@eXC{U1C&;vtK^5+4E2%_Fv+H`JM-`PP+p`F{%=f=WPewPoZNA%Sx0y2w&t~hLVmlIMY&~=w5+(!2rhU)M z)p`UfNKe9rZ|;zqfA96oi7Vy^)2hAsYQ7)NDI&l)4s`mK;UpY-SGG{=S;KCA&b^;436?r6IY_MC*c(^zY_T2`hApw%|k#Rx3A z5$XD|18kTHk&VU^;Ycu=seI02HLB)e$>lk-BM*v19GG8$W8)j9moPw6ZDjX3y@T(e zzr|(>F9AmL&Qjc(;BX$SGA+pD#~6KJm@#V7?{cZFQjXV}Zc0#W+cQ~i<8nyX!MXJm z-bvtN`$j%6Vp4-sC)MHOCo25`jr&PuKufx~G0{qioG|l_V=6>;=I9+uj{m@%xDn^P zXqP~u^-jS2jq&;P3eb9RvO>CUlN&J>0J#tpdK< z2l+UdCfMOGSfDM^Hkzx=Y{txtej|ERPQBVeT4pEX;#u1MeGv%uwNdU}R#aT;jc-vPjxq3&uk3n&>@TjfC{%CJl!_B^h83De} z)W$qd8?AHgtF|p@aEJ)CAsXL+%Ze(BeiXv~z(U-8&6U+A`BNYgtxx4K~n zW7O;8UVdHNz#OeH$txI!OXt+58ZT5EkEXMCO~)w}CHSqh1|K{;J?8d=J%vR*95vm< zf?nSVgB;VuP*QaTy8iQEX3S=a)k~EleVLVNhz)E+^}v9O-|lyn*-ai|y%(716yWW% z`duo!bxrrhS%n&2UC^*G!Ud4Oq1>CR*73JyyRqjSC!Av29gcXjaXW=DgI7j%!hBf+ z5<#*#k*7)VsEr0ej?IPyp{$~$pL?LW1uVmfaK|8xDMBxZ%gf

    N)?rR{;eBU8FYs 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 z z<8qfdFcWQEIDWf(dN|o}KpUOPhCBV85B=Mr2}|C}k2J;)v6h-qdZMlq?S=W`r0qW2 z_x^qEJ&_%dBeP6A+|{RHzuh=4PSO@~x@IG(X+IUZX3Mnoaxvm|pR?<(L%&IQj;`}< zBk1FLSVK4sb&)o@uK1pk6qWQ(zKmOaC;U$ii)-CiRc{~0D03Oh8(NBi3`t#f70Z>9 zz`ll(wBmuH0^5XyU9U}2Ek5hnbhrgmp%XAFhel7|N2&IevXNEj`j>D;a%pJ!&l1VP zJ*7yI=a8T;G+X3J6olCMEE&?@3tJr~qY`0g0Ekcfw#pK-FV5v>QzP&5>|GP;uew#StJv%*}Q|?dCn_zoP35<^9U}w)ERLL&N2bUUc$|R_%u7?E)l5la- zkwMIkUm=>H4Qk_f2IfPQRP=;T66@xsiEx&G%n*PBm2xP&?tc@;$}ngY7t=`fy zzCr26BpQ7eWrJ8U4Ol*{<`*r42pNFNUro#In zpiGu<<&asz<^O7={nFk9BuWUT2wNL0oG6pQRYT)Y6K?PibbU;%5qZoitUY8HyvLI^9i z3C*CUxJ{h6kTW6g7+}at9O5uHi2_-B{wYFLKT4YBSzvZ(y-i9&{$=8ur`d_#G!Li& zm6E5mN=_SLZJM>JW78aX5&7@KOYyqh1x8x#?h0A&@ub!?aXCwhSEFt2=4tgP9O$c< za0tCIFCs-L8@3*XP!decOEcbRX&F{iSt#)8*y^y$^m#$D&a`;&%)w{`N6O@Y4-JvE?8E{edqj<1CJwev&T_}S zHavf)okD9}(wqU83FYS}DX|6#Ot}z-z#_;lHu7RSR%~m@Px#Ni+MVJ|^OdOpH)FDK z@cYk(Lq?1vrZSh0FVV>(#fc8488}x|jd;Yeo=wP} ze<~8dh)kjPJMbUA7u|pTSC9FB`W4F94@orLDI-Ww3SJ{-LAK?{m=q{G&Wb?87{#>ouC$9vmQqIC2}!Ag?cg>9 zNOZd>&4*dWaUSL)Gl2^eTT9sKWYQXSxaElyS^z~ECn-HHR4bqIdb4~YzQZB+Q-htZ zCfm6!K`qc!3_bz#3EeJeJ5N}yHzYkB9e`uq;m98q3w zdL*u`#SmEzaSF?7L_Q!LC-VoTXuz8YJSCbJGmgp*f^{WtvPeR!{8_DeU2rIEhbX^- zC@!aDJ0Ye=H?kqJlu{Bz%wDE0u-Q&3YULm>;0Rr|z^d1JF zsYLpDerC%Oz_;t&!UAqGYF2t0{J;Uiv{ULZz|8?!WEXU3z01Eb{Qn$f^Pk`Sj)f6S zpi$vdS)St)RG*I$NP$6T_+opPG>3kzz$~d%-Q z5pMVzOCf@KM2A-e^PP;aHQWvC*9r=z!BjQjnImI0H`wN1cVWyi)Alo`*WS-A)(Y?m zPNuP;=nQQo?|3SNijr|=l84Zj9W!_6@3xZ zS3Rm2jA!tqNsytki+=P;RSqh2TtUp{kM`IpDy8_YgE!%7iT#GLD}{NQcl)$>XHQMp zNh(hms6*+jPYS4;BD(c8BZTP43-jgX>d$vp#rI=GF!paxh4ON~L2#;0y|t88ztV14 zVhfA9RfEH=YrcPfh`wDLy^Z~`YClSY^QpFxorUe01#=1(lL3w(zbs4CDfzI?F+eVM zZlL=Yj%-zLSUM~nNera;?&l)0bJcn_l`fvjE6?u-H=Y?UDOg^L ze)xZ!*?+H$8`wido{k?*hiy5b@!WFPfao{OxqE=6c$KW)nmN6doQ!R2885qVhTP^CY1%mEzV>%% znL*?~?AhRZ*6E?%h!De0d@>SVAekc6n!gv+A0A61Pub##RmpWHvdm7>g zQ4i1uRb^Spwm!lehBz;j!bJi_WrdG9np}+J)_os^ujlLA2(r{(Ja9_fkw4XEkhx%; z`JVSw=Kf5c;Xgx&%^#%WrDZ}=$?imj6CWN3so{+(togj9KrA-cV*lI}Ve(@-LzvdT z#fUL`$SymU>&Qum-B^{VC}y-!mEkh5_-8el`wY#7bE2vw;{>a1G<&jo2g`AU@Rh7h z3!Ba8ewCdMGnek}qlSbWedi{qS0R=H?)@AuYXO_FO{7)IFWv&JVkVPx+zNea{a-|A z97ijxHyv^K-}y($0Fi^K(;WwgxQo7_xYOoCmtod48n5hUu6`LwP@`xWp+OQnUxNz4 zeu+SBPbQ%ehRFRp|M{zTnJqSH)a*R={|V{IU5A(jUa{=y_Au)IJo9 z)K^%2?}O)xleO-XZ}Ye}DAnZ3FgKui#(#34DC@F7kJRf7SsDVn+QQL{WLwG{KXtNi!8TJ}`WA+@)Yz zz~>S%!oAvXB{%+-nY=@^Kl+^|{2Ij^ateWjR`GiDupvXZm-j~vQi|A(#kICg>`0d@ zF71m@W;9@uQcIoe4X2pZ2cKyXf^UqbqZ#4J6wsiz$og>oaDKye2q~KVJLC+3#X9I| z;h)JCdu?%(!WYYw#9m*)+(?&i-SCS&g(&~|DvBM*A!jV-8&;bbT8TKez5ub=*H$X@ zT>J@6k!BD_VEB!}8hrkO9c1ce8IH^`-Bb5Kcpmcr6ka zO0bUFa;oAf;WD)CJi=U?G=g*8N!fUTK54+hlqH3!`}3V-Pb~J5(V}1l$X?#?m-wd* z9&v8AfhP&`1DbU{Zyd09Z0}8vtZRB-?6j{-jFiM8ZTGmz2Z`{dEY19r1oax@DVZ6> z;8sb#7!q|2y|zS`^T4YCo+OevQirT?cISr znS{SSoN+2f)}18%a5p+1j1*@>({}?a8~x#I@ejAHyYa6EQ6*yh*8Vgy%%bGLDO!7;O(4r(Yr|f^5TD z8^hwLv8kfUJuZEJ1P)n6THD_5 zTmB~7?F(0h$=s<6j3G`_4vE`K2a=CO{d-u)$9|;8b*kr?BP7ySNM14gv;{#v^g&fS zd6z$~;57UudbF!4U68ea;|bnx_vxX)*~SWw#{$hch8u_~gyc1gR5~}td4NdUq?gvQ zi(MRbZz@<0uZ<2qkEs54Txc)#8|{d?m6}&kc3$obZo2CZy7mhvF&d%p#ujt2#KJe$ z?n9pH6mu@{rV-j$9J?2OCHNj}j$Ae4u98g`N+`HAPI|U0PPi&rwRQ8EP>c1XZ^}k< zQlDpS&YqsRNMb|QU%hssp&yp8oByngvr?LKJA08jCen}m6rBPY=fldxrSn_}gI#Sx zdVLg69shQObfXPlsP|ScS)|$x6Q(>klB&CzO92BeUjms4ePXf$Ip4t-)OO+i^S155 z^ViiF-k;m1-kHMBj6q0oMr*T%QwK1w+nUpsJpJGlSzmu*D<;#h;{$aQ`rq=wr&7jm zD)w){&0oU%S;OCuz__CPc|X$1u0a1s7S|1Fh&cd+r%fpgCB{X}jsG=hJ(e1D)6Mxs z>!ew(`#@~kZ!C;8W@*TR6)2X66`-?m{pU*u#Xuw#uO*y-`Dz%6>CdO zb*Ga##o?=Rt05eP_`B(EsdMUOD*pNy2H&F)1x2O{H0qO*RL-8Gmj#`NNe|ImYy-+L zOFMF|i0`Cl3w>WQF4kV=(0_FF5@e0@DJY@lrtHyK#kBG?D$KR<>OQQj(6^cmWCq=Y zp9If;{9|%;zELAKIFi|t1ub@Cde4?%J(9-;y&Mx7xab@41hqE5-2V2beKWMzh2!>m z-JVeJyT2kH+_;&Ho;>!CdMg#OaS7e;&exYKRp~UaQwy*KT$}!ZZc=`Q7by~5@zbtH z^a@jFUtx(mv8TT*aFsIL;_Pg0B$Vf~L`jTG%6{_@7t1Zn_d{Ii=fBgby`o6|aC7nF z7#@T?doqf%j0i8x_DG<2#LIA9g(V(%RDj*d*p2Z-O z+VDWu^(Z8CHq?ak2~d*Z&Dj6L7h*UzCNJ@EIlogJ#z<5tCB^vr6lTn8Ys@9r+t~;x zUTd+jSwVibp%Wr%UYz0uROFriNC^%@RSJ$~GOb{xUr79$%A8Vm;HaOkwQKAxwYO1P zg<4J}@iEm;U7B-wrc9-&GW2-`7s?~hqyD-WzKhRt%bw$^eLV=xMEpW~&R?Db-gF*U zzG9(sdrPX`J%8~8&mpUq!#6c~iN`6g*&p@9G3l{7gVI-C1KabhKZ=P~z z#{}_@Tly?wIeNKFrxrcV*TUn!1jW~aie9Wzg@2~xAv*Lk!4b+4bk`9=7C9PYC<4;l zY7J9?!6*Usrt%-(lF+qPF&w2E^GJWOhOHvp>S~d_(W!+)NoT;a{XpAN{w9ERSoGb5 z(!k+u*mSL!P{22P7uQj>Cg>LvOER`rX^6$=B2R?q#MQm)ID+F+84XF|2h2Y8#oW^v zR0~j^R$0i*cIN`QoA0LjZ*A>ZesSbPyUMb9Mnsc^l+FhRhSHttP3c{4=F#I zhLEtr)}Sy#wo@o-a(n)J7L{Hywh6Vm&0Xwi4BF~Zl^TuY@ZOwk4& z!yfltVpv_0@-FwyV)0Bqr;>56p`s|OlJ>iAzCTU#w4UkfV`l~Z4<#nc|4?GGaB%&v zx3e-$nYgLX7;QTmx5=uQMnfkQLomp-s#U{F-~0_Nu^8$Su8e~2ZWhaIxa;25($^+w z+SG!co}q7Ba`D}4Iop@5f3`Ed|Gx%dwp;UU=#Wd{D-4AA}-OqzdAo& z$+Rdud_=6{a){adR&!{qTavos#9Mf*muO)>axo{x?g;*KBz}yam9Dnmx`*(Y!S86k zq`Y7&x7@ORUjagh!q?@;7`yf78ewIputS=3m{GP4{WkaZG!!4V2(3iQc^p@D*pxQx z;{^pu&dez~H%h7%D1{tJP=T#aa`r?-F-!H?hU|NR9?G%LNdAlkRl1E;?#Hgt3~rZd zu%?P@*4#*=Pv_!BK?)!#+LFA#)}?=h(tz>Tma~ zsV&7Cff&TDNzo}(CV`eK?qkE0&RM5pgo-vP_Gb(0GB(QV|3le31!)p?U83cB%eIZK zF57y`?y_B7wr$%+mu=g&ZQJaco-=dKnTY?p_$MMGGUK_)i_F-2ZLGB-iM0rQqn9%f zZK7D%x5hoi(DCLtx5iVppVsFD$;2N(r$i-B7^|B|=Xr0qrlU~f3Vcs-RA`M`qQm8cNOxRuH^MkYe)}{aa_H;FTGfwMrQ+=>pLilZ?1G^ps z6gCfxM2%HeTNfpKBW2KjONCk;7ZRW@UsgFZvZ9GM;^)1iSUs`x_Yg6-0+KW{Xv%;c zpYD0A&Ao$ekzFX(MP%a+R|9u;GZW1Td<#FVuylNpEI>tsn_=(ljjUiwvTAHKr^(-{j(m4q*XcB z?YKa+NLU|@NS|{lRQKgp@mLS6W=3+AN)hs5Zx5c_r|ioXLt=-c=gZ&;DLZRAkejRK zhBW6%)YtS~L-xTnUSaHZl?6AAC#Azr5&uR?=>aZUP>{Kq7=h7PO|KgM1&^6IT%8sW z;i{};10)p(JDl)WrCjC4laad1SUnmO17h9>w=!kJxY!aVVq z37vJ_-GQcyckFreo+)rG4Y`D)oC>{9^ZV~!QKCjp-d&1cXq4HHM9IsifR*JrMZ!9B zML9(w*n#*b4v0h@8<+|%__h*%EF1uj|2nOSZ1$&U zN1+(M|qROS#flM-`Qo<3mkhmZ~i}`i~!I^4MZNq{TF1df9I?KOO0(c-Aj`{K1-8ChX`*+q7ZpFfo6KhLEnz2oFcC(9OBm>bxmZkLF-3y zZ*EFkj|c$-4NkR9x8f7bv1G&m&Z(xYGf%J@y@1d63xRM@N8k5@?~fiLK~cI-M)U<} z-sxuH&rK{&0G3ad98tYt)rElnn>*5fN;?0khGJy>Z})nuRR32Eb)mMa>M$Gt)4i5X zh(D5?c(xc*MGnogFi$ROD1!He0EI zgQ^h6mh?(sj1?1-iEy!h7$Tz>-9d{r)sP{itV#*8hqV-`#v;PBU5-4+4NNj-jr>Zh zXv5*@~qT+|l_11-|~RIk{QMUexR0 zJ>K!c-G{`jBvTwc(g3@S?UmTcTH(Ahi8>Yp%71}_m#7k9$g_-fUw5n{q-9`otX+mc z=Ye1$W#J&tJyP9f@{1%xdiXcynp1TUKhX`bT>MEXz7_Rg`!tUz_|5oO_}VQy)|9>q zd36YDK|*GSkE6!nt=O|Rg3|>{zQ*pKnHjd0W}>68-ocW+Ftd>bz8K`0ImXrm79f}E zQ`FU-7<)7;9bt1;WCqqtH1=ccFO2CfVRac1YN|p^;wG(~*ykpjl=u^_l3}Q{z(GOd zMxkzJ*aG1ce4wGABm=M{-d{24L9c54ZEZ{oT}ZX~iP))>5`$1!RPb+Dzi@NatQ#?R zQWMwV8m+)$LFrZ91irMyiOP_41=CXIo8CVMlnN-44jMfggafM{x%Rp)a3saU*{@eR zvm-T8dx{)-n4E>*q#)8`p~B(1cwmY8uyB>wb*xZ-$Ad|0T89I>$DYK>F8rmo&wF?%dVrz;bbR0=IkInqS_~r0ov0TkiMlkclADGW-ROo%pf1j&ee}B>*5TM zHrKP9!RyL^*1JbOThCwjVhU*q%)8j@9h~&m&f$Yu6R7x!yRbogRqQCIl)00s z+JKwuWB7edYg;1Me!#$Ia`ri0EI%-7?5 z%N37Tt+Va{%jaHB-q!9Ao{gWPw6Q_5IVJx`GTq3&ZQ4!e+?({T0*vh6|Jo!Ew;mqO zxyM63Zb&_)1#$284zEHO#%DizUJHmJY@&j0`$nw7AwmhiA+|ItX#Yc`VP^Rc-5Tcq z3wW!h<+#p`>~o@aiZTO{A4##{F5MQKLQcLXLzKXetDMB*zT<4wt8^wS+%hdBMJ2ZLrybNy;kjc0GR*u;iKJ% ztR9ejm^5dau|=%8p^^jXpF0(9N!*)i!f9*0&X~puP57t3rr5&T+MlEkYll2Z9?Fr5 zZo+6s-igPm5D8VtT1LV3TsY)sq^b7mGlcY0Na8{6Yg05m1JCl{cSf*A;eF!xhIikK zuq1^GXcy*#J;-jV3m-G3h2<4{U`3q>4dkvxAjIZ_UGLjQMa}S6#{%59(S~lL!Wh@< zG4zyq2Bv#_@P%^{ouKIFF==Gu!Jy^zuh8)08gjV-cN?eyV;k;F?IY9WUl}-xN$9lF z{i|M6DhWSWj4&`Y9yh{>!igm_8f|!V$Rt*1;UcMJ9k2^bh3b?|Ygw0^WYL>r&}A#T z!1R7De&{1a-NhxIY5qVsaI@@g>N|1fl%sJ&Xq>Ro^P-mdv!^nnuJ0FsNdC9?5k70S zEf=UW5-jpZkATdRJZQ+G1yh0b%d0`RM8jVI{nN+yeydawrPt~wSdt3n)Z|Em2=JE) zSFc%qV?)lLStl87V9RbwH9^RCK+WZwpQdEyMa2b zQJ520^*TWJu>%IV7Ms=dH;XO1t7ejGa3?B^^uxVG+Ggj#y~Pt3H`VN5HLt8-$pp=a ztaY|X*)&j(j>U57Ms+b4jMb{zg?)v%$EI=Cm?^y(!YJMyb)BTRK=iB%(y0AU;`_`e ze8b$_$0rJ-ps}_UDhZhx7oBHGDAm%@bN|NsXwGs%}YHx0_*Gdpl~$vND?w9g@vlj6Ch}% z<@vpbS?A>%kvd2g)-x-gxPnEwG>;HX_jSc&`b`-o{FP_!tl|yzCTEq9rqGY(EU+6!x2N9M)esjg9Hro~&ELAL0IX_2_csS^FQ65QM2h!P>gFd#^@$-;HT5AIfqx9SXKaKf`_gnm zcW^yHt|p@D*fmij52J~PMsdaffm!j)G-%*ad1>jTe$yM8s6Cr~CYFUtO*v9cZa?I( z8(t~L&2T`6A1jbvJG#tyj&Ji0NoTT9^uGpDW=7WkBakY)+nEqE$QxSxaQoybD(;k&!2buKl~j*v(Y3EbQ8F)=wjrqb(eo_W6ER!<^EbQ6MjdAm$G4i^A%L9|t{9 z`$)hO$G}ivbtW@xFvjtTr-lJ@uX;7jPNrU15V^ws9VBxChAniyY^BWfj|8%4Vjk21GXRO8v28wO^%}Tv}W*_;F_%ZR{I}Pc8?#2jX(6KT(ZIUyBh2 z*q&9@fg4}J3xeE?AZZ$2Do?bAXC!1B*yW5z28 z@r|j+B4tM@2-3}me@M48BB4g5M$$*%R-dq=3OGQy57wp6;~QmoW*45Pz~1gWXH6hp z!>5rfR1DMR63UmVWsyLVTogtcH~*?Dy2(0LiMz4GhV*`4x?`&#TT zgjD&?tXOQhkuk)Bt}o8Rd&*YdXc765{F{;Or;FHLT%ulXg&yp&D=~PpgN298I3Mhh zT!Op%n!c{L<0sw`h#Eb2U)EiZgTMG|oV6c}V^NQOQQ8f=pE)XU}jOoh2_Z*H0Mp>?i53rFZSqJQ&mk{RZPUW>o49Ml{+2yAC!R(2xaE-)--k)=^N z<@9~+H#1Bl+5#Td8m69?a*14RJ{~rFZ`e0ZJ{|_HKkZ;*)3_WOzD!)(zMbsbJMcd* z?JkHqT+M8IHoo`dz-)Sbdm}C~5hS#Cb)xVn*PQM-O1_?2eEa!!eeF(iw|jga+$Z5= zE&$KKps^7m@q@MJm0X{126Z0ZkGsHG#n>62?$zAxO@d9BUf=J2YrU(#oObA#_nXm$ zH+ni;x;m1+=FS_oGczy5&dj2CgQ5&ROBS|9w!dtvTH0EQTAEtav<;)|ms~uS&ooNR zvU8mO|A)4PiEQ2LM~9MBp03TaBRK|FkN@ZB>`|&jt@?D!;H@`z>iMW-2WjA@CpY`s zw&Bah_s+(Zsg}KS?XUI6!Sh=RBQwKk;+zYNr7(VRB)ORQ(Z?EX4cb+G6L- zciV^elD@q{3j)ZtQ_E0%jPNP+dcL>%(=^wi3v2K<*s>qV+=-vxk5ch0BiIjWd#Dh4 zB(kuXIDYdb@j>H%;xpoomthlor}gnt4^e@G`ZoEoWsrJSN~})q$f|rQI&4Uu;BB{T z=j0KsuPNlE;=!bFK6s?-#%rnClr7}d#Q8L0J82I%ix?J}O7|*GP$T!G8Oq*45n&jY zQ1)dt>?5%l&lIdXxQUU11M%pxX-49j_+mlDP_Q(tyVXFc?QL+x#w?R_Af`hYO#HV{ftVMmvX6HEkaZ-wxs@Op_D1f^kAlTb z%RDSGQD%LvlNa`NIW7!}3EHbGX+KlW>>pnP3cR;>0QwbOs@(YUQ>I!;mGLAYj;opd zP=*_#7(VF$KIUiv!(Zn97N|e!X5&vi8p?iUl)8d0q)vATHtA+6iEn=g&vFi%3D$*; zm=srOT;SgwWXQspvV(?wC&3mR842J;CL2hRyB__S**C6PhnLI-3M}N)uvJ@$8RlyS zYwp@2w9;fzW4WZe zQr=blKM$YURWBYjOIEnMmd~2xYMec)7A&)MI|@b~N-9)6I>fRoA=bIhSy(EeNcZ)_DKn+Nc(7|)EQgsi$yV16|Q)Vop_zZ@{;_1ylbB0#~cluOn#xHTq5HU zmyFfAA-VVA38wtB@Ik(#+iD1+;jJwKk24=&_;D#6&(*#~z5PHoZYoP}? zZ4l{#XTmZkj8K3YY$Vt!90je3y*}b7tT@TyN(E9Y6m+7#n3T1npeiSvBFNY+W7trL z{3@yZ_&k0b288JBeWZ{Zb`Y^7i{XGq$SQ28$k+o5Ft|`qD=7bgj^{pmF_!3bs@P}6 zd`l#KbB+p2Ug~1qUQ;dSwGJRK;wdBL>AA^AbA>j7-NMU9&(l37=Ce-o4zx--xK!W& zwMKnrZ`H|m4T`yiV z-J!iS^7Cc675eaC8e2r$@3*~+HeFaHO7~>65ip$yKK9@*63@6U=zoQ5EG*3b2W0zy zH!8W<{`dOOe`9+{^TPJurowklk1&xnvB6tPqYZd_6M|-=d55uxe=`w!dU(_6-q{>$ z@84Gfpi&BcN#sxGs}K@F^2Gf+H`gA|xWVnB(5{2P+-XEYUK4+;0tKbBY#p~O$kCC( z2X{ZW(awh87aJFC%E&jAr@*xXQXA&v6~%1yx6gsKhd?SbXkUEfybwNYpaC&7ST~j# z^bNnhE$Gz@Uz9qw+sc(%`iKe0zuJh;&C%~CRqNFc2EK>;38vXa-&sT5=H^PX6q0@j zLjPDVsmIIq><{>0pIt>F$oyNWBc0x?mb1z>Y<{gbiDO7&qOm5gM_4BD{J4Kg!~iiv zD^ZAhKLc?H5nugx#UJERoV5#I3lsRwAV{}&;16}#__))N1=Z)wn)w!M&(=oXzwE%H zM?oNio{t<-RcjLy6elx+cH!fRv4P;LaY63Q%nMw>@5Sr<4FN=RqO5-0L1E<2%yyw4_Hy6iQm!*qTz=OUB4FYHq zv>Ws%3rBa1WEe6Xra#m1W>12GM{oFR_L()7QhW?@Qfbvp4o#;DD!4#nSeKMlitqR^ z-O8js#()~e$3K~4AGn4ZC?&CuPe^H0w6Ts5;K_D07B--RMFJZH3n5UxF_HT^AOhqe zM8||2m9XPY)M^O>ha9_xLyx!qkp=KT7R&LYMX0HtNkN;+2}&E`2@t5a9N+&;ov9FJ zmvl^eXAZ(v5|?H1^iU-evA06IhN1YOky$|_XzKq{@PAnp_lf|h2e7>Y=bSE9g~;*P z`@G17YEq6l$o6Q*FhAh1a0$PjpY<$t?c+_BN|($kjC~O`9|Co4D(eVXf3F#4khC)1 zPAx|jK=In;9)`>*!l2Z!w7&%1eK>j!!iXnL{!mev>ZpDAJI4b zBHoo8Mc8zEF|@xu&Z|VVRWv=>J|kX z4~y29Cx=bnfZ&EX!_f_EE$jb>?7FjB3 z$)c|^Ey=i$!a>Di>6O`FK)wkJC&tk5NMd3l{K_H#)(c{@#>bit?k z-Yp$?gn?al=GW;qeRpZ3MRx@ASRrz1&?{}-ZO8hjQ*IxkAVjnEAJw+&^chmMxPqXC zn`tm9CI_9Vwt`HUII2B@xSfe5$C4I)Mk*O2gJ@u}zdkW@I@~$3_gd&t>2DsmD4orpQhptdCUw*){q>S8C-5s*y$&= z(QeYBVRaAc<%boydm;;(ZrOb!`hgsin{`QqlehQy2tx$aZ-F(rcr9Tdk`*+3WIj~~ z3y31Kzdu|W8_`D(=cw6CBV z3cZ(3+KE_OGNa4i{I@x};EuVBgqM|4!8Uvbl-#Tn&xf;4`Z$4v@=VQj4F5Hr?sHiC zUZC6B9&XS*zCw}un#Ro*JvQF}WwbBK9Xm?6&NR?(PbS2W9vN!JP_eRs70$Rc7Ifms z?xL&A>hI(I6H6w!zdNftsyKT`L*`AMV^_KjF03>K13!=0g$9!FuY*j8Q8PWF?cG79 zlD})2N*pEMMzNm;r*pm z?!-oW`wY>{Vf^pUb~DPOW{0hl0VpJ-!PiB-QQLvo+i8+7(MH>FKg=}up8*Z0JAN{v zL2vXe1M7x2%jxJRs2$T7Ka_B5sCw4@Wpx&T@q~z|uP_E8A|ayKK8mZe3OBRsyYCMh zEuqJ?c-uMMZcbhnzTIw{-@%vRFWt*qS}WVjd?6tXvH>K;;fl{yYrBaW98Zu1^V=Va zrXMUck)2x-R?(M#x^+;K!>i@W5s7A{DrxwU> zY>9262?!uRfSt;BOZkB-`!RVOPlzN#B&5d{vsfLB!hPSZl>(8~iv!kJ!cL)GJOz+< z96OwCQNoKJXP&t_G5LG5z2E?@Jx);rWX?OP0dyG9Bmb>gUl;qDPpgBBUuI1N#uh4V z4mU5w<&)6p+xl_BR^|EjO0U7?{7e zZOlam#r4yYrngxoDfRWnI;2Pjf}K* z=)v{I>ivs+Vl4~G;+2TVsDc!DYH(k!B=k*GVM>2zolo%kU%)BL)APFjfuk5orAqRjB&eL?` zdKgOFCEph zcs_U`d&jxOKmA@bi9eNFkO~RaMMbHpX;o|5+*VY@LkNoQD9;4Ys8J z)~+DrNczTE>K4X`I0KfPClTZjyQHJEHNBE~b-cWh z(NA=<<8zr0gZgqTl_t7Ly$F9hJBb?vJyRLU=!U~K|LNbWG}-_%+4t1EX5z(Wh>|!^fU?YAO;jZ0ZKEH*{nb05NDYUPcc4okPc1^?j&20M$JZJQb-)>E zGw+row(&ck?6D>ne^rlA?1R<3Q@v%Vu3++5X6&qHrpA;cn?Ki{*ZVHA>WAxwwXX6z z1>B6}V@_T778v4KLYT;i`qhTl)&K(dtEFdp7S(75nnYy~izvo^@_Z%{-{h z(5ksn;M)B1b6cr^gz7T~Pg{}L%3p=U4%)GORJRepa_2(RG@VeOs%o#wREK-0RsA&e zGT*^7*1T=$ddFwra?qST1cW4G(Ft+hu0*fqIa;j@`^1D=5!oA&Nh?HRCL+f*HuSqvobIkv3A-1Xo?e1Kx}f=n<4omY5+Fxqw8DzRvSfP zGqCVGRaL;9+Z1+;GT!~+ysJb$B7POg+TDcQ$L1t~(!}J)eX_UBL%mF;Nli)V89(%I z`2#{BOi{kqgS$#FSk1RPTPIfTt%j?OiAl+BFZm?%8o*49U5+WH?$yd z!Atx?Gvs-Iz2JM37|%5P+X;WFODbK(#)O&4{mGn(eMa84$y`cf)Gxtmv*SiOPdHUF zZ%4hMqK1as^06gz$Q%LsgkbNw3yD-K>e|xt)4KMZX6_q0Xro%3D+JdlL6N3;3gpI+ z9z}?Kl90|veEqrzF)4T%rw10X1nAfK{%EEhz3rU5ks8)65)2#(}LL5 zfP|;AKH`4Aj&-XT>`XM1$GbwZ!Wd9KK{#^zjb!e%_i9!Mvu!U^GO^*}%vM&dn`0Ba zH-6I-&vR&Z}*&@0bF9=T4AUAd{Bs?>Lz}z>KR*FlUK<8{WH5wJwCtX zTJ2*+8y5~aLU(L_@1Z8FwL4^;lWITn+sEzu_-q;Fl0h}vnKkhNM?4@%NuDi6gleM* zdc`PugXM@-G%Nck3bx&U)j>YiLp2Bq4yq;KW`cHm@!A2; zY=YBq`kq~5XF9TVa$(CS9u5JZB!le8fU|KH?zQ<} z9Y4h}hXOB;J``!7mEw^oV|2gYJS&{$fMPke46?yL=?`e;hF#Mq>4-xq+ghO>WE7o! zq@z;AA4r@9A53|B`QV1rJdPxb%chRRs&8hr9>ul%P>RIh$xF%pLHglT{8Sz7@Bs_? zPxH(@);dH5LPOHXnPX0k<-?;8-1@N?*-jM3eB+V~0=KfB-aoG`FHrlv?YgrTg!InC zQEbOO|D^4~p@;)U_OmG2N`WI)haE3aCxuRPMJJ&$B2uL>tb;?>!%vVkKQ_HElCs(o zs_K4mNM}mUz}t7YN2s+zr<+7hL_F3tl_bHiXJmodmoff+egxNhc&>JMd@p2l%dscl zBt5ON@wTG%H-7AOR~0Fms|7~70>t8DqS=#D@b6wq95e|JGeX%R-*L3=I7_ z);IC38UG_HcYt>=H9$q6>Qs_QaDbS1rdNuT)Yx@5)xOP78B$y1zIThf8kA_eisOBft%nTo74Q=bo{FMNQR2x7~C?~*fN%x^=&tMX5PdP(%pu-eh4-jx-nofG-F-@E(YCo{?zMkoh$?%wx%@17K(Sl`DYam&KeJs;)1s}ujZ;^1!|R6uSZzCK`IXc~+w3fH|;)+5b&?9no*GFwk>wD8EC(#_ zzBI&OO=l@$iKf>M`Biv~gszJoUvVC2P5Tn$kJaL#Z-HO@EROT?PWwaOTbYhWR{Eou z>4_qT1S(+B5yC;c+igz~GIUYklrqg_aCOWaaePl>W=3X0BoUdpR_snKgz!SmWuHGq zp`k#|0MYpYox=`sA| zTQR{N%PLXp)eM^r<+Gve$~9 zCi`!*^yL%}oLU(bbEvCj0oP>KglXGochom{+&&}9e?ZJ^O#cBfvoSOMcL$eOTGqB3 zoTz_u^hkEQS6eY;?|?}W8y%J%va{9;mYJK@{*6TF8g)&{6gA`=D<4lBUh&rB5rz}= z3Um=*$)e#|d%OebW)jdmEYLhyW;4|@lqalq!szdVuGKgAV&LSpCjd-hOr;Z#^UWyw zaVKtH9(% zBXuzR*c70Kc#B3sZg&)D9C>x5lEBCi>zUB8K7zGz9?#9qUry$L0F5`vI23+X_jNHf zH3oGgR`4Ph;RVzRgc;;H4k9LKaESLk_Nu+L3!y{(AuG|m4(MV|Sd<-+G&d@tL9@{j zfA*<`y3n^%0U{3t9O^c-$$XfywnKcTBJVE<_XwAAa((U&Q?|q*-fW zS$h0epeA{@atfOBMBqTaPZd4xWbHtw+5~oq1f54$Uwra&kswnlP#9B;Yr#dVX{hn* z!BJEnV&O{YfzXc+iz z2ri-BB!#yt*6tq8K*eL{E-&Wv!Z#fhk*4${qiJz!S}baM%tZHupL+zz*1Ox^z#g>; z-^C&3Xy2S(t*52NusPN-CQ7=DK}R}TnRsPz$|GFfeK>e=+2$Dct zsVGPGu-_J6Hx}TtxMI(pWLnDz8fuJkV}0fm%Oiqm=yH3$UWyAQ{{WTJN2oa-IEdsH zP|xMDfqYfv#_xrWMj^ifgg-f%h8suv08p7>zpTpb`jLw+<7F`bxBR1c)GbYA`$7hS z)_tBf<@)S`kQ?u_*$unY7Y(za67CVoeMJSus-92BPXi%D)Cn$Y-qOcY(tvZE)vZ5P zk0hWS6I%QpJo2(e2T#XC6};I~7vr5?1V;<3xdf@&1@|mcMYyyjbQ6Z{5f>KofSg)l z_yI|^dB*WpBP`6UxgwTu-cuRq%%yvZwanRDPQ3&*4=^>uxE8Ou%i+%Rhaw@;4(+jo zwbz6^W2YyLki{Ae2sK_Qrvq=znWOBM;;;z(akUJgMM>Sh^_qWHRTfC01p#o(=4G#` z^w1w>$w}N?Nzm_0{*=vIQhuBJ!<60J;^VxE%p4%6TE_i_Ktaf|d%fK0-(CC<6B zG(oZv1NIauP<(FH1U|O9d5LLWNC{J@SYhjCK?Z{`W)lE+bwuC zaT;F=qrpkq-t1GEXt8hWirgN-tG0s(`LrL@_5{gQUnO zUg-Tr6zYubqki`7)8$#*RfyU-UNujhH6;!8X<6U&zFQa7 zYdwDKRXKaaErZIu`J~x$?2%b$f$_VTTZLVbVK5n7LWmV4_L^yPLt3~?YnRt{Wi|3T4N0MJJ0aO7B zGFICqpH{LFt(at}a9lZrEq`b^G%O(+?{c!dGz3)`^aYI{pEogci^l#my7QQhMpN6% z89M7$GBmjgW6znjQIjwC91WZU_=C#01CE))$6^sEtYl)dTvB6B)%@h=Y`)a_lG4t0 zG>j^W)W66LZnMG`?)7^dY~auY%K!`QA%uOnIX~F9*BmNWh%=32E|Ba+yNwQPwPSDE1Q>6SNb+ zX_&L_5qBj60*T>&AOb{iWI#JX#GblV;BmA0wt(CPUwGqZ5e-prXSW&mFy2I9y0rTH z>s0F}H&A9BlqkwOb=r7x%@=(I8rnfiw>#CX<)>~iS3ROkXKsHlr zNsCk z+Geuqy8G0$1}H4Cn)Oj-sI*67-#P`K8M?cIKRydo>0Y23>ahsZf@fIYp-^yv3sMxx z(m$4u@D)>~@&^Cht(U*uZj;1B5pCEK4MK6e0s8t&`O{jEPBp*h*W)-kW}5;1$;nC& z4&pD&$WX~ilf~HswFGJklN@7&B1zkcQsolbOqQOi{@tSZzfI~*!)Uv8f=8L9bw_R1@6*V|g>Tp0NtqBu zl{r2Zt^a7Z1%k(AG+DE$wqv`8BzfYeNKh|1){CI<_nlK>m|(3i zZ|ppZ^dw35@wHjtyMF~d2xD0P15#vX{I5uniHn2f{|YIxBmYB+`L+%I8Am)t`FOLY zmZ@y!4Z|B?P9pi5PIRISIl3uFJ2%uyF_oMeMs2byP@n~9z?_(ogDpp198WXCXWdJ_ z%xgZMX)gvr|HApqX})Q%LdHAv7Zjv4j_A&oKUhHgXe#BmKScK$+2@t86`V7}zH+|X zANK7pD}P!9Teof_>g&+?bR*}n~;C~#gk1!u_~+V6I7MWqp+8ZB< z)OSamHF%){R*Nn2rMLKp=y)A<7H;QJZ?+a>E+oWv*vEUP;3HXPP;GVnOecvN)eVg% zGGI;o82uv)B+A61i?e@(fE{@%lL#Q|=67*X-*8u`X0KF-foCoWknMR);I%*`xbxHb zAKJhegGdXO>I8&m9)>=2vIB7G_bm)InvM18b`cMHHpI@UzEbH2IwZfmWBYgj@n!WEd{(9GP_Qrc3g>Ja98p!O#vEe9k{;fs_VHWoKmza<^ zgnaTBHW`u2fwi29|Bi~`k$TM?qanbK#C6xc!Z9U)Y`TbTDl!;q1r9gVr+gt+>Tm%h zjkPN$4fwh3d{J)%58BbJrCqIEOX1_~Y!C<8 zO$S3eJ2BT~?bf+0N0Y$Thh3wr=aT!WicfV*ka z3;y}1v0$<5Zf+hojmlJ79JbM+kyGr9IfFatH;lH5_2;ag&S9a&3ev%_a3akbTiqr@ zK8qf$tDmel(?7(Q=)>($wR1Kk+{W54X9bZaZH$}6(sV=gUhJ(|Zw~6MUh|209jPIG zPU68z=C0Hw_Q3?B#QFSk(q8UfBTfC@c7aPCgm>*jfVxyKQy2P z1ti&{aWfaxvYFL{gAXv-%{C$4ogPb`iMsb-LmFvpv56urSFL`v5i}Nt5KDjw6%Wwa zk0+=U#3`A39_NtzUfOd52!3p$8)oTpNsvWjZEFS%o9@xHP;SC&TCVBOsFR?SF7pqx zkJ~nwg3|?5Ri%SE!5o^kyPa_j!Y{E6cV}PSAZc#6HD^WR5qUUy)%tpHFDl^r6uWCB zZG~%akQrn3*$A(RxHSTBSO(K^gX*KPmCLOao|Df|EW8Aghu>HvFAX2@cC-n0kYlh@ z8>6Qg5&E~vU_=bJs&76~0WDxMM;ZiF*T|)dDqW3-o&IdWUG`zCaRR|dX<>80a@qrB z(=5_I6Kfp?=C={`CSZDxX)axXm!idy80^vsUNZjf;1aTE`hY|Xkciq7B}-x}NKofR zaMy~@0t|c!-_Yw3^cm|v{zEhKK!96y{a>=0Pd+&`LbIxOM~;GP%tiM5Y9?dv*X z_b~MDJJ1aQs^FU(_urf`mazkCWe2;kma)|&!b98Fy_c5){@wVNmbg3YF51_T3F(m; zLDlf#VJXGnT{^H`BPk&gpmM#LoY~q5P3RxmIo4B#A|6z@cT8{dyDqV;jU@)wNT;26 zB4?L$3px=vG<2VYE7C8Zo|uSGXf=nNW)=1Pp{i$_cYrALvP}Te-9PNhXSLoKosKJg z5lRyKFyE!nkmyl~N^f=wxBu&+AVQZ(`!rO(zgxKZ^3L=^s%)AJIoiwysdb*_3kn_J zL}%8%j1=MwR|4o7yJ~O@#W{Z<>SPVBO$Hg1i3u!DabPLMjC;A*)CN~yqCI$vn@hs+ z`!Ra{n8`?53UY$98{|9l;Rb6FAAv?YhDuH88B&}@K5KKASEss`eGbfO;>U~!nIr!= zUI)QBHSFnNl6{s&C$1(J&*b+suS@!%JQ-&3KLCFr7+-?v{nPB3KQNkK>=3^q*_h+S za6o4XN2zk{@U0h{(;W5#0rb(iaFy+zM2SSG#(P+poLH(&HskM(SvDrYowJkZ?hyY! z2Ze8qW1zF8wkk-gn*G}@0bSoe7bZ24UeQ3@ptJsUQk|9|L{gryac-%ewO_3itz#ST zdwaZ)cU%b$t1B^L@M25Tod|oNr2fBWUe}e+HKms9AxnGWh}7+_Qk@JQMA}hjoAZ9$ z{K@ll@JSCk@%YV@>N9V6J=R7ejMs-}*4|cXd35z1C3O2uci`$XWcTHYUJM48mQ$%J zOWcc=k0>8^4pg(4*7~*YTfF!2h`j|G&4Yn3>uB+uX$~E!%%vRcOAs^7*Ok zsw|%jXMOC%vYC@wiAUyJd{+&K{)S`W3exxFZRXuyG2Buq=w=e6NEhvSf}#Xt9S8C4 zJ6m%_(?ufL2VEx(U0-B-T>N)zE7Mkc5_>4A%p=K!@!fW&`41PToUsFUK^@ztKz2PU zMNKG^tfGS*Q-SNQtgEl?5kEXZ;V5#4>+AJfRe-ycF5iY|)Rf8;_XcLCCH9Q4PPz z4KH?0r`%-kMmyfx*py*@(_m#(J#$tBl4K0(c;cEjqvg3GKVhRyHp>R-&(E@U{W?8_-~KS}zTQ+awEf8eP{G+RaU)m_;J~b)SPp(< zL?8DOY$ADx;J_!w1qDmAZ@7jrUg-qGIK>1Nx?b}43MR>Wd#;>TT}wW16{MXmJd1j_ z?hLgW=~Q<$$_ zf6sRjngdt|hv()leOEOPH3F*YF_~m1ew!CT9$_^5;5xEJ+_P$GGS%!y@{ZaLYeq{r zwrlUhRopE~^~k95?TuN)Ybn_PbN=$CII#|-at@g(_9qdyG^kGK>oVMdt2p`U9DdB| zM?XKc&oR6FM%~mu=zlI&L>Jrhy)^KVL7(Rv!49L2Md|yn2e^ixRD_O@yu6XN4AYLk zgn=Ed=l^Jr*#p4aiyni(hhbc^oo#3tNZm44_1rL}N!-jy?0PF6*K{}g=6$(u{EZDx zoicOhU|x-Vq<6yUEr5bLM;lutwqw#{oOXetmvY?qWJhl8j$kD7x3{sxUl}}*MgFQ< zTe!KZW#=IY+a5f&p9@TEDOqq`4n9G7HT{dTqhPVb%g=RTFgUh0cR?sNNCVREfD;Vh zh{HrV3%|;9Osw*3s2PDrX8Oi1!DL~HWCrC&e88nn(D%V8QS6Gy8&pkOI!!b+K{B7x zY)M0MupCygPE&1N0j$4)7B%*%NVFRE+Us-6TS%RsnyV z-X||3hIzTv?FnCK^EbGP(X9keB(>zDt$!0o(-Nh4F4Rzmgqp$SyH1#38{!}5iy^4S&NP#PZj;; zIbJYRLC5foo~i?A#naBo8NkfSm6Z>LKvP-Fn?&xjQwj}8R5zRd<2^Ne>iPlG0qOdl z0m^G34%#hd;hNR}%9gg8-;&=*|FUGhSmjiH1SR2%)&>L8#?C|K)D_ETh=B#md6)nw zYm0{`;xDA-7hel#)#*k$M%rrzlkn`0Nqr`)3mboe&5UH?2*>Wm&+6k49zGgLmJCEtABoPIY1C zJX9gnDuKQUSb5~Fmx)NWw_2SZmWk$17f9BF94FP+qP}nwr`&u@7FtD#ND@|epbw^ z%81GwIp&yi+{A1f4<|6Xp`@KtK}m3Ruj@)_(n76(!x#8A5iHmeqjX{i^{Z->>@M?W zy!F%s+8bUKSbq4c3No*{ftyX36~rgMR$i4v*U$wrVAI^ul)CVzHY)1ohoh|9VDn=l zs#K{+gNf7StHgm9;hF$~w(ioAbLBQj#B%gr2wp3OM+6bWjt;n74Z?RAzlEyFB7mwcFwLVAapPkB1 zkB_DfY$^t38*x@~Wh$g}q(?#KNF}RoO19z9*t>e_gG8Mi08J;vgEOz~$!<1D3%OhF z2s~~!il<3Q#SfdN|Up&%0Yj^&d)bsw9Sj2GB`$T`K%HSht}rAefxUvqKqE0apS zcpiX01BQ#hMg9HZ3RyRlbdJiZ?@&Bu<`+$uRi<2|7stJkEb8pP3XQFj9q*YO9&~d+k-Et=&$SF z1o*X`nY22Xlm>>Hj?h*v{#4E?I56Q}pg`jB%F8VTthMHuxQgpXTDwevixV!J!!+rH z+h44wMmE)%u@9qJvCgw5d7X+d0W5730+e+l^A8276sS$sYN>1YtyKkPl8@bIRBuHA zE?aPq{EcGp(OIbrsq}L}WbN_prECAuLrf&m-udt&+WhW8P$A5wZ!Qb$XIRL*DUXA! z5v+*c(Hq1cD?~H?FO2jbDl`UW_WyM;;E;yb|0vIQas;n9dvy)dQSkqTxTwz$3$&9? zD5Be}paoEmH6v);lXz&noVlS;XeDPU`{s)HpE@6YUArIhkQ*6U>mPKwaGF28FS6ns zLMUMb#`l#*Q%l1{u7zS1CijIdruYA6LlVrR$S6+f9lTS?h7B*(ytY-R!%e*(u4 zu{tKF2M5vzgxU~JkSKN>GDQ-N)Wa?aHV;HI(~IUh;hI?toj2UZ=7zw2BTB!ERU>C>x)&2d1h;8J$>$TOvP(g9fGN<= zp@lShxe)(5yL81E<{c-^0`AQMt7A)RKijJE<6EB*f|XHsqPm=J_GO9JP}&l1>?%N6 zGe`q}jLi|DwSGqH=mcYkT_B0*o_Rh_V7C9V?wMU%vs5gmRxGa6-C-bLTg^pR3=YTH z$I$spsI^L|g(Ky!o0FPk0b&5SKlGYVMYCaQOOpg?yjHl_dAw0K`KHC03?V#d>tIh% zXXg#TvyuTaKz?`K@7`I}f?>!-^NygHA*tU5P^0W>K#Uz@Q`F6?yyc)_qY|JeXfKLb zchyDT3jJv7E9zBc|!W@`!%!)x}16Y#O47m;jNCV-b%-od$VgZ1Q zJW?T|!uUxtijpMvn2BgSTWECu%!5;q^CWsT4_{@QW*MFe;Krn27aj(jH0=nthzto9 ziLPDs9ZJTd?qF9c1ugC(12iU2*5}Uaaxe&=?bokdDoXt7mP~oR_H;CKH8r+$bN)0E zGrc-gfG`^-qPcVpCKHfS2vzr2#d3Z=2u(mA;hX@wxk(BE9c!PAXt^aF1#{uUvF4PUJDRoU))h^kU>0v`V{^~#JJaXkxIn4FBgJsh%n~c zX7iB6-Yr$8LfG%>VbD=Bi|XUd9|sSgkNx+nD~TRI2N#Cd+t0Ix{Zb3iA&atE)8Jy% zbQN>mJdxn$Y+FsWU73I7G8%^8F|5gT?@}*7SQ8T;v$1Mrz z8D*N)hT>iAO|KLkD3|b{;8KZUjlOl|z#(&3NtmDG zo|p(18jFjlM=h`_Qpe*5J3fPcFT$4Er7NHRCO#vW>L;O%ptm3+W?|&zRD@xBMjeUV zbnolBL1;_lVsXYlZcm?(BOYPtqravvlceQU#9E4?a0ZQUCV@4LzZh$-!|=TO?%Mb3 z$Dxa(t)bHgP%o?|P77%>9HY&T+A*wg`5eBchiYHwC>djW zI8szZwL`zLU7I5}_B#s~a-&WhSPHLZp$1Ad{P6u{vU}=E@-_uXn_0JFUAySWSFT)k zLd?@lHwd`(K9&;)`*bBd+W2A%m728Riw=1RoEeMILLwi0)c`DlMaKH70TLMpadr4V zzWTUOiPyY~DLX9Rb!37yFdg5B>?*gRKlMo#Vz^=-qp0nbKP{3=@Bi>g_o8aAWz_tmZQK34+0(Mxecx19R% zFiiL}a0DV7^b`S@ZVybYlTf6!y3cJ7AD_lD7|9Dt(SC$*pW6xV)f)P5Co~n=my_D8 zp>#XyUiAJgp;i{fb1Td=*lUx*@Hvl2T#6c~el`ZG%8Gok;Z5g4T7M$XyvIt{BeEa{ zI5nIK?a3OX%dC$kOr%7xcYNOpD)2nDp7nC_e!94V*7Og@bb>6a-ths=ziR%+#_*p_ z-q|_+*A#k|`j%5BJCfgvUf%{o6CT_hLvPm`&c>Z;ru)H|O8GyZIDu>h8Uk5*hqs;` z+a?fTyc?4n6Z7=sMf{%c*`V!d=&p>0S>7M7;ayD6$q6DlBZIhM>>BIo?k_w~)LXx& z{$FYPc0;^nr*XnS!!zErFW1M*^JUJ8!!@cvT{!FZ^OzJA+9AaQs|ZRh{Zn(&%T$lI zpF>aAd*{2)M+Ksp1OizG#8CqQER!AXkU$@Xgr48Kq3}#~v(pi)1)8zLy;~9&Ck(kTu{lxS0!pIWmxZ}_DLPrIBp*a@*T2oBHCbdohQk#x?hG*A(oxwH+Q z^3)Sw8hn-&bBpY}Zu1v-$ca;@A#hpc5tbS&g@nT+x*miM<*Qy3sz#qG0YA;mw;9J( zWNf1%E!_nzVyvT>%C|^Pm_hvKO~v_ZdjABk$2Lf&2=Wfl8`J8|IE{S^)S~Yf`Y1_? z^}G+@M;B`z%=B zY89=y{v=SDCWsS`>1R)V{a5g+9B%y>5MEDUPehBrsbq_1b@0AgJ;GEFr${S_48)>L zKpZKFsP)`<8lT|8-!8|R-0KdK`Pq9K3vHCaO71rHMBq8LQE(8R8A=wCTk{VA0NArE z-F`ufB~wUNqc!Rt0$r`Ebhq8HkeZXq;{IO3d^JOTSBBjgT=db&IHolV^8f)_^UZa zJu)_u9s4ez@Vqu!p82**xP@2%GYn-IBgcnKGW^f-qOtxe<4ma!(81pG!Bi+!eg)g~ zaEs)1x|1|q7(CJ3BVfTK0X7tTH=d^#W6;58qF2n9eK~XVpIpLWz~K;+q)jRngH;UD z^2StWIoVj6XUQn8>^c0&^q30W;?83$8sP z5mkoO1Q)0ifU|*0N|AnP4%4uicpD&)lO_$zKRglhZHp}~SRsd7M%oO+pAR|rlkJ*ve@-sm zK3VEBzFdEjRQJ#n+6gIIf>GRAQN786va8VgtYnV1PYkG4ovk%=?C2$v`IXD6>#$9DuRt#}R10)xLCR$`SA+I@I`tTK} zS<)3+;XmgaBZ#?97X!3&n~6<_?xPP93a^|ymA+2DL0}yOx!hJp~;H> zK&;@5$&uM-k_e>Q9b-zfxhN4OR^V4TYMAz)!5mdb!gYQQnC9pvr(~0gIAzpk^0=|w z3*+6F_eWTXa9wx$Y7d~Tn4xd{bok2>18)L)V%(Z=J%5z}@2`55X30%9t%UJoV;1mv z%m|$HyKK&VEN6F7zf8|Tv&H`WodvBu;tIuvE>lY~=ZNhzISb|zXrp(vWLBk>I$1EV zG^17S1o7u`no|P?eI2s+VC+%a4Klg@XSjzk*Pem)-eglEW&2Tl5<{c;eU?NjkJNDF z_gh~1bBOOqk=#Xo|BqaM63uitS?n89Z$_8;KX&ckgWLaQ&GJimv;VIX-x^zXo2>t5 z*UlT!A*hfnB$4dO_os81N0Eq&?b;SXLeUIw_L!5@lC&~&X#M#zWhePl)xx@dn8yzc zjK+ckdy;WzSFlSN_SeiT-sjsDZGZ`CpTCxWP$Bi6y0qEshEG%g_Aw`roH~NKl|_4l zV9e2-wXdUr&Fn`z$LA&SL;w*DbK>ulNgRqpYKcP}Ds@x=v-(Qk$IwB}v|bI}HZ5PZ zAM2$9(mjdMD83n?)Pw$zyZRtQ9iPwl1n7OXPUXqENf`vF+;^#K!jXG?FgK_K13a?k z)fi(q+Q|fwX64<^o8yphw|iF!(fMBjuuJVm*thT6yp%bx~d1tTa zYA5_FWh)u_C^b#agLWxTU7)h-W+xY-3c4P>9bYxL@v;v>Nn!$JN0!p6pcZ%25C`b6 ztoDHjJ-xsjjtTU3>l%5!>7Y4y3j{JO@*AAY>@}m;MpQ+q-HmcIqu|U8;5l%}Yf5kl z3XFVLWvMT0-bMJFn z1!+baw=}TD_t|7E6@ypDy4jE9V+S6?R)MW?)0-aQCI>@)p1Awg#lTCIHKZ>5$8N0W z_385G`US1of`)t*Id7E}xIZ2?q%D>F6Wj52$`%tc(&Ja7+h&?eWD);{3@D-WNlUE1 zi7Wbwg0nJ;f)N|`9roPkW|q~&SM2e@NTvVC7ZkC4mji>-YsdgE9WQ-n(TdI&JuPn(j9?DS+- zu4244yWJY9dlEacu3a_L(ivz5p8s7`&8>T0 zm#^g2!bIe5P>ZY6%rk(aS?7JpS&C~YY=rP^iyAj+!5+(IQa2C5RRG-+c!L{fXCGjw zjzD4F9j(M@17eZAR?OlIA+)3F$?yle0M^IwB)95B{zXqf z?PXMt6uE9s{=ow>loVxYq7X6OVb*yXi#$DYT}b6-+7BNBhYPQUwfI=y74vbY#6o9l z1r@hxxmJjhm{fr2&d1;r8k=3?pz+(Fx_a^Ul)qt+uwxvQ6p_pXk zz2qbI6lH(}KVujV)*;#VMgHCs-yBHCD@zOU-kdKRk0B|(rFgEBUoFg1AU9$fUBxDE zq+_9-=@*A6nU2-7#L?~$epZQ6x*=~lDPmjD@uxEKlYgbF`{u|}!be=~vg;O{w?{NB zn7xUu0pj&GeY|K5-@V{Fz3bt#nvF2IRov|Zr%lQo+G)gzK?%LmL-8#WTkfzBO~(|8 ze#JZj3?{UHp$Rv0_9O5xQS)9s&?`b>%Jst?Dc3Uxf743Z|4_s4Q8{R_{Df9Lkm5Y` zsTfWm8$Tev`fP;)pHG#Etx)<*LT?++B2CNNoDr@um24MS-8GSZWd*W zGtM%OIoFzcqq@-@Lo&bYO$Y4sn-)0XxE-i*?Fkf}?~;UwmHUCZ>Jpr6onVr@V?nFr zSroQ?aeQ;fV4R@W(&gMyJ1KC$DP(NOrliBu&Oe?4?2=G3&?1v9x+h3SY7mObO@z47 z1H7dx`!=0JnwC!((dw%m4VCOtuzka|X@zI+Y#3i(Dw(qr3nlN*CGNewFmE_Z7nn=$ zQ?v4FZSzV2mF3qt@|DF z-mK$eQs{Fe%p~(DjrVzW+*s9+9cW)R^$gk)%l>?_B>{To7MJiU(9ZEkwE}9jkqXv? zK_VGiQ@e05Z4p=wG9>r5#SuH=d&1t5#OU$V0U7JO9qs1nR!^!-bso@!5ylignn2KG zW9o9)&1=|;n;~x~oUxTYtK@|bQ)!l0207o@T6sZ`65QFQEA7MvlD8R9iU!6hJK>B? z79PZw%Twq<-S=&@?*aQ?!8rX5a1rdjU5guf0`@OW2B1Hpn<%6^$*ynF!CgG|<3tJI zg)x>?_rV6gCYPn&O3&q-sH2GZA36}P6y?&d$Qg#-cR&l;tSnO)KOcAmAf%mpjz{`y zw+2I|28YYRx=Llb9PIc@sRL;ve0RkXqxByx&t86hvWUvY)Z)8| zh#T9O4F`XI;5U_W7yb(({g*0$o%w$ak*c(H5;mGqeRlNv#LDXQy^*bzW(va(SdmMr zx(-rE680jr>C8wRq!gQ5dU(-E0OFC7iDaV8l2L@WodUez?C%WrPK|;J*w}tryFA{A zl@$IWNtif$;X4$|M@gVK1-tj>Z&1IxJQY*cKZOiiJ_)t)Tt5gUu!?x7|M-3^OkHeb z{A?lAh7h|)_DABt49>awJzU(dkLP}tKoBRFo;rOj^6o44xuAFTyxqXEW@lO>kRll9 zhv^Hil@bm^Mx@yfhlpZe#D@#2&oL0+vI~SG42y1%FrKkM0-^+{fK2@*@m^pZo3U6x z+4!u76vrW+R>v?NiX$=WH37Z)`H|9>#Ox=LPNI-OP#8ma`!d>t?5=a`5TEuk}ZL&syR$21||EgI*0PMUchn->> z6>m&L&ENQqytl%6zflCS`!5b#E51_aO%J>he?KyjRvAmJN=P7)lsq3H) zo;1H8Er4hOH-}`1)NXzb13Y9eJB1b{mHe=)U1;7dp3ibh_BV&r%F^m2kK}JOfSb?yGs!Z5)R4-}$ zJ#e0#Vs4nw0c3dnr*JhhU#6V_;j&$ zsU*8t6`jg5b)R{I+U9#9*erW5ztM|gcJE8xMLCy*n|NEY+sNn7{<)Ara)V+EJwJ(! zSy%XHs$K>n=75up6JG2=>YcyG_dU&sy*5_L_yyO;TiE83U+|Lc*mh$Cwv2#f|HJ_< z!YnhiQ=Ie#kSfB+#1YX{Je=X9y)DMC<8-wV!I;9FUJG_Y=MBcV8hWTa3Ui0;83=)e zO--3+{bM^C$7EEhOt#k<{4^&5k!oQ~HD;(ox5L^(KA$HyUBqTOgQmG%mzmSx&U{Y~ zIC!NK!n_U=HX1V&QQh~J6hqm1u z05d75c{A@*!(s2Q(y~|~h+;^7XJ@-SsYpmY{ z=iqb89Z@MQkBQMTGk+F!)_wZ-!;wx(Zi!?E6?|cTRL%_-I@`z*MniLVJZk=yEK# zc@SUG#+vAyJ_w&pqu|$HAKP!9sMIwbEjgsP{i=|-HCB$Ae>LqNb?nAN%UC@(+9(w^ z9;@c#jTQmZ5z?@Et{cx7N-5c?Rz^;#D?@Ioo^`TM`5 zH8n!WwAt<;-N={Db%wT6))5#G8cM$d*k=w4$gKP{a89i&NDlmsLBJVsa-IK>ctjDn zEDSV3QHeH;YQvAqXuHM?1UOLZF8iz-U~CW{NHMG*zEjE$8?iwS>;)v(g40m2LP;F3 z5hCe1N`LC?0=JXoDDZAa+{@jV_^6QndfW@ci%9a-eSGc=*fR*OH9{xzc@Pi;EV2tx zynbNxK7|APZa}2h4lpOu3qmUEwa;Yv>nnZn(^_kGZD6$f=CH?VR~x!g+=9chmY9L! z`J%~Godz7oDPYC2UYM-# zI`b4UKv?r^vV}2Q%xRlpWWw0FkQvY4NuN)j^%p^Ee#&ebdLs=>zP18`1zItR@Q;jl zUJ1XkxhE@#blmT4yMk0>%?me%LvlGaz-wpiSmJct-m%oTit0uu^A0DY*u&lRE%rg` zX};mW?uBEIS`LH@6ErJ}?CI`_IJ5ht_FezU7IoIw?CUY!c+uyX_a{iVy}*nr;^Uy2 z0*}z_>d)Shk#146$&gRmMv~{=uvm?((@kv9l-99cRTJNdrsiJoxB3 zZPuNzJY=2ZaMobHEp{V>PbuL8ur|}!!-;p-QeEF&i21&?x+9@ zcjd7h!xadr$!b2647yXpkH0H!7esTE8VctG3FH8kXq^21+OumXRDgxY(g@Ch3V`%T zh1Kulg!D8u)s0mLOV-lxHNB$Twg;RwVgB0ML3^kY2u*8~8;Jk^!z}Cl&$y~`6BTQz zc)9_w(D(J%o9)v(dTkk_iUSsBOTjVEGVmoShfxMvNqjTx(n#t z8N8WQ?w%&VRcHnfet6MD_Ec7zQ>Sq>) zT7Oz1-FcsYfuHPMO=CcvO=*kaOf3}(@t=nKHm%?9$pNI|PzJ9fe2lc&jqwKPeY)JB z=}E|O|9XlE2M0j_jX{Vpa0NcPYC|DP|2oNT+pfY9bbTd%??mVUo)My^>K}xjS0_li zH2}(bHdW@&y2MJ);gksKYbxsWITxl!pBYF1^x(?8`^L^02kgX<=>zMf9qSxHCW}L& zg^(5Uyxn@U+L|+B&m%tr*mg`CZ`zFf`(wLNN>{s=564=#8=0SNKbSxwKD)8Q97kN{ zi2jHWR&3S!*PMb8`;PGtFthoqpQQv=0FB+|4Ulvd#!>q_S;}i2L4o7#M4#3#PBcd< zFATv`lT*)*qzIjAXM<&^LPvAO^iLXeI8s>MSSJK_rKM297vyPO)c1b@?*Fh5VWj{6 zAj8$%`acpAzZpHkOM|$TbVQ2yf6dkWEv`c$wx?o$c^ZcZq@t=+@v}+Drb51MxbDd> z24t}|DBcZ0!pPs<-MI1m-1g_{j+2de_}YxT`Fk1vz{;3bxTSSdqv@LTjk7r>>`6D(J6FBG|s2 zFDmBdMB}*F-jRV5>Td)Slm>JCmQroDoIL=a>(}RPNh>u#K(jK zoK$1E;Fu`5L|_fcXk;BLC>7;E+#+xK5-!0%K(-XXfS<<5O-L@Y*jLms#lY;;%abZp zr76$ION=KO)Yi29tN&voQ>j}$ZyHc#N*HabV5^Q&;Y}Ldtsg=2V3iVc)?{w1V(#*! z^>4Udb-@AWL&CIO0SZ>@Ca7ACk8em6DIiprF6nORf+)S$j~U^)_wb-`IWo4Bl7h_` z*pB!k?_FlqB@LUhDf8T;N&Enm^f9YSErK>ku$S(kduvc1`hhhZ5T6JoA~@jQLZEMtyzGry@Ig(x5}@b) zwmQIZkm4Jh>q!Hy-h}U3S19mI+E%eL3Fe*zeXwoW=v`ZcJDiG-5>QxAP657{!qaK; zx7?tt9rClLC`Nxkkq*jv((>vbApIWnHPB1e;-Z}_+$VN}+LMw*d&K;R9oRG{Ai~xc zC%=e}a~|B&V^ZO4js`Y(B7J2f9;CL;jtT^+Py=)g>CxgI;iw-h< z4l0y~J<`Y=z4O|lPvya;xPH5B2a>b}{RB+Kf69Zg32myydSk+YnrE~? z$c)epp@355eGej*BSo`z0XP!|Ax2c{wY408oIa_z>kUQnH z8wh;A+*fjswLTtu4`Cx_-r;7xu~x1`N$#!kkO!@uY*7z97{C@waP2!Q$}oL2AjBW) z2&kv*{c~t)2cRD##=Y_d1Tc$7gafz>0U!qO`VZi?X+9=!+TSZwj4fxkSxka03kZL3 zFmun7_m3_C94EM{C&X%|R}OH)9!D*7=_JKRdl4NN?^u8I0gsFDRF{wJ3opE-d;1Bj z+>1H@AtimzR(Yq78Qqo7@MYk^hY#ps#Xy847m69HBokliY)1oBZ1YmnxA^m(8Q&_0 zt2GRx3TfhZ4eg0cQp1Bj2Eg>ramCAv;(%A%H^8<*u~Eeu-MA#$6dxCpXJ?hYXLb!< z^YhJkx)R7$0OmIrM7Y<-rzrwU$2Td#uh6wm9<4w50dBycD8#7)i)-lsgI$MQ+TvR# zz2trU@5TH3aPS3GWm;K`nw%c5yZ@94ieJ<*66AipybE`yiDF@W*pz>{Hj70b9Z(CzX~fbHuQ>vONpA>I3#4~yMY8BsQPK<4++Sn( zvida=bYEQuUP(_;(N9VPFIQ@G8Q*#lyW)*+)7Vb+Kd=SIf020%EUf?QeCIE=`2XcQ zO9Ii%8a@%8<{qJ#C5#$Jb>@sWQkcmbk!+~uMpWn5pK!1JdI&=oCD)rWo@hNi$YClA z5jmJ}raw(X7@w+n&ULbR^s;^KBnNc`|HXxF-;YBJOB0QEl7~seLD;2v-F!|okD{Y< zM|`EoG?yuFmH5mpM!rnk%yjEyf4L6(V?X_$G9N(tu+B%0W;#(wR7A=<%f7;$#@tW{pCWu;xeAxEX_i0FHz?f})t)K` zHY;pZMY_cqR$d?F@+RA7US~U~U$BZwot+_=EWCGfCEvv(DH`X6l@tB* z@7OABWj=vK%Q9)rB4#klZ7J?HDrIQe?=A0SRWu1Md5lXI8-ERGF^Izx%>$01M8(g| zWU9mP0MHJIBhU5_C4#n^?B;k~cUK#Ui1NhsJ2791*2FAXOS+zKkEi}vmwy98ZC@5i zyYfjxnAjucHq651jtP*6BMsrbs!#*hsBEKJf6$VhKyaxE2EalBy&CkBvln&NO(TQp z!cYZ4bIM`#TiMFEfyM+@2v^fH!Lnon#A!Ftv5HE~o%WrE>gGvz@j(}(G zE(EJ$Q!&yla1_2RuxuFvlee;n{Rw*jNBg2r%l5d1NGa?%EX<@wYQF^l+7>E6g z=k(9~d{}eHr3QJ8$iMqZL+F_6r7#GC1@lYJF7tI&u-?Qnwfw10dN*ef@|u!cI^L|( zvATzG0a#ODSJ~?c+32QE4c%iNB#6Mk4_+0*kkaWToV4W_{;rs67J41@X)MD2*P0w75s~qc4H5Y1^oZ?y=aWuN2)77G zrPEAXo2|@H_cX9~Sy{CRBqV8=>&BFDhOM?Z1x8K!#|v4*N_eq7f~U?JhF}x=hN3uk ziu2>0U&kBcz*o!rstw@6)tAu%I5e4>m>E-GjF6b71nFD5Em)7^fLC5Nng(+;t~o1d z{8CEKlv4s)6h1b|seu~w84>Zk#U=COM&|mDeNJ^Pz#9}q?;77XidnCBUGb>tNOP)K zDhcRnF9ZYJPN%SZv=~n|(>1Indip?1MF8#!3&mAcFzHL+;xo+{tsM+BwDdd6q|3y^ z<1iWJRzTT%-fe(UHEh!iLaV`dMKT^DDtDxhj+c4k&qfI#u-Ejc;~(q5z0J5}j7 zRJl;#cww^=s45N;mPn3_K2K9HzR6_hhFu09zU5x*p23D)sUSr3ngUH{F5vFK7^gcN z7mmo??49dFV9k>JSgSAh74MD{JuQH(AqQQwJBR?0oHN`ousx+MJdbV(&*HVEH_r1s zXoe_maXhoQb!{|-R*Ij_BL0gvWbTShyxq*+849{C^Lj7AWUc@4;Xw^)LG~fNO=1T8 zD;VQXwjn$u{PDvRZ&IT`V_pp34EEdTK!7#RF(EyBNGPl^+!=9HY(G#{aM-{?03dSE zL~r)0E?uq^^|_PVaQy>lf4_i6;XwRs5|{DE-H?=5XR_*sFJ*_qlI;ldS1v%}22oZ! z0JH?bKE>c?e_JM3gmZUfHk*$OeCm&Cj@V_^)Q>$Y>FxnDKb~wP=CbZ3)5s6BLqgcC zdkH!yEHb&N9B^wCRH^t;POz8jiEI?778ef;#nkn2U*pAJu~x}$mvbQ|G#I}>fln9rCd*jc zf^KzlF`dK-7^y*8nQ%GD(XgA|H<}-Le4>d~p`{#|q^Yz$Bz5xY&^3Gq%Cjln^LEas zkEi4FG<+9?2q0|dS@g&!0;Du|pWq}P$H-~bp52s+(N?@v%K$Y1b6e_t^BvGu6wP7Sfg`BE+G%h@L*(Yg~S z{6K_Zpr=k)+yZ61>z+ubVsK2i<-^+3QWgB^B7G~~23|BS$#zUicTTGk?^|b+_NUs2 z`efckyg?E*Epx?90;>Y)ObwKSOgMM61UH~uaJYN`$y}pt^5X4*VXuJeORUY~u#+da zgW{sZ#8xZ(J&0jSx&9_n`9(@48ynZ4;dW@UA$sB^m;MW%y!noxsA!EqFts-rNnXCR zsp3rfl^iJ#U7v(sFZkY;zhtA*lEzL45sWpA;Z?|+*dW94jG9SQdlP@4O$2bdciFDigcm~#qyTosj_WcTt&#YTShu=UvIC<1EQU=Wjq|+tIjuu1?(Yibx zdx6+W#TL)kob5J`YL!h4KfR~}r}|;ZYTwD zb7Z_Lpq^GRDYPG3b^BXv5*YA100toXI)Xv~r2;XAR)AF6SFBLG2LOh_14CyI?uaAc z%Yt6`$~oPlNM~4OJ5`NM|A%_{6PvF%fWEpy*ls?B@ea+yT#;3t9JK}pd>7m|tgeq( zrns?_O%582*~~RRi02sMG;-WY%EQe1Fz0&KjlC&QjY4jqI_u z3**Fv2qMaal?Tp0&OUyp5dH4{`M+*~5cw%-ik?vfBM|o^VsU=xZ)T`!`1LO$-I{RW zq=c`z;y48oKj!oH{9OfOzpXBiYU7A;{t3(pM-mFo@uknoGT#Nzoh++w`^N90L@%5U z;_CHUSlK9t!XfP5BOvEv6QqKEdVxb+e163|klp5AKi&pbmNTpVjGnxe*J2-bc)D5g zNj8oc#cyQEj1SBEO`_{4EoFGC7KS&k^i)f6!{*qBd6e9@F|j4YM=Q*1M3M&Hw}fU^ z2M_n!@@U-ntj&I0^Bh&`uXN+|7i=rp*BkHEeukh0M(DmpN2ib|S7d;3F24sr-{|Zg z6;Dg@58${qHreMm2!~6B+Y2LDaqV@LI8a38sJ4%a-=6YLnKu8D)0XKS!e^R?=w4c? zLzLC3BIw?YI1$ZqV8|Q}B}Rbsi$sjkLS?dDB%Dlw`E!EXTK_0?NRv}llbb1*rYvnY zRBUsqq_a>UdIC;gl9#2S6?BeVglvDi=90q}3aid5b6o*%0qahO6F`r6YOE4jr>y5Vu!4u)_pI+q?Spe)*3hI(YHIjQK=MKxx;n&TwB)8wz7ZdW83n4>Z3@l zP)v>g(TDLe+5y2zV~(_2e~UIU6T=d3CA>w{PoSK_x%z!0hbn17NU+iQjW%5A(VC{7LBE-VHvUo&<)Ozl{Q$D&Ut5 z=5!b4|MfKa(DuUma&%49@b%0gIwIr2=fzg@^9^**w1Czht{{wNF|`9}+&_S>e>g89 z-k8KZ`M`}uGp#L@7;C4s6rLKNuKN5Z(>{yJd(N04e(CND5;L| zg8qBp#ZS+2d+27x-lw zmOy|z=lHH~8RY6G$t#}S!}%xMRs5skhs8Aew$H9-lJr$8cr*0Fv6drSbi5vx>=*8s4I2S25SYgr*d(P?4i^8$%*!CsNN5k>ju1X*};R2$Wg%) zz5IOUx6~$+m^1`6Q~)9;o=^`9lAk0sRR_g?i76Lg{$T)CGvc9AvLQ+HM{`=2N$aNc z9A3rD(rJ1_Q2>3++3yj2It*;)dur#o2F|4oT^lMdLlXmotf=6OeO8YPb7QHf++F%k zJP_JsH<;#rp$Ykqz(hO$7Bz#^< z5Z>iig{I;X$t86*LaVf94RPBC)$!|zW`B7uQmHZ$H`@T87hDR-dgGDkZ)2BBu-e52 z5AN@4cW%7c)mGM82hMi`R?fFIXBhN0)~4vSB!e`#{Zx!i$GD^PVQX9MD7gfE-ZaJQ zD81otN5cHciNEaWojF~2U(DD(IEcF;u;wCpd7v<@dvv1cH+2l)?^eLX3ocQ9i#2E= zCS12L(GPQW#Fc;g&N~j*NA;#elq8f(GA-DxC+zu6ZUNW57S<-F8Dije!TB^dE3`c3)b7kkp}m46uT%o z10}a;BG)3_Cyx8YLFZ;Pi6of37ewX_h$bTcrj{*Qu!_#F6hcD|78=y(=sK9a7Y7># zZMNRLnKqeAocL0`zB|~{dcp^ZVt{&9Cgs=K1aN0o63Ssm7U(B;EmKAaS?MWwVlKH_ z9z!zJn3E>6kxDWlz|F5Vl3RF9cO2rjqH17Rxi+SiH-vb2PfY|o+cZkWvi>YY}@wqeBa4L%yaP0FW3h=;>wjPS7shluMRO2_~G?p z`j@+pyV)K;F!{|H9G3WPg`|D7swF=>aoo>yRTkx8|ptPRoVk8rc44#R714xX` z!S2bjR0LxWrTL}sLl(#Dxlmq~Ccrjnu&?&}yN%;F$Yg^C6jlZHn6gkI+>hKp#t6*7 zWr^RJkJg!h1uiKCb5w+xqYtx!LlfH=e#w((vY$Ja>EN*R)EbmT`eZ6V-NR2A&w1L7 zP>Mh=6CKn;KjztD&<(pICi9A&zKvr=OK<&-^{QfVR6O?V+*viCvmm7%PxC7c)Cg=% zHG5)0@uyAff!E9?F9`%z?+0|-1sDI;3TtOwQo1@QL}&6>-T2_)Q6{Xq)9B}Kyd=sxQV6qs&D;}yG69rL??c{{k=_SD1g(>_`d zbGe)+2oM4W+t2q0R5RCk=ui+;e_?OFlvkI@G+v3XZ1WLB**YHqA z^~7-7BSyR~opemMazhZJBIOdnW8T4*i9(mitG1o@&^efx*g~dKAa{Chs~B5Hd2m82 zP=)`fxtCYh&79VF<)>>QY45!8+#H7)8yYD&TDC-850EPHTS_#P~Y6akT#%0ZTBo(GjLMz7-Ji+?%^qxPnJn{uXVVy4LE#PdfT zAnQj%7(qcc8z6gqPbGtdPUVh65c3;2!QXWdi-}OSW3AX#&#=0k ztz}1ZKB1D5!uBAEX)}?UfHip$4**b Spd52n=rZSagW}aLsZ=2inDR^(Tp1Frp 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
    ?*F{2S&T^bx*-Mu4>^$&t;iqq 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 z z01ie@5(O~RvwO;0`r1H4KUmcaizM=W$bQ0fHQM!~mF{mj{?bqp2IZ)NOEB$!Ha$50 zuOIYGqqFiDqkij=ui6FrIF0z+FhT)b!JQ!2UzK+0pRtwZmOtBnz8(reoAU<3MRR(EZ0qkC3UUiuRkErmOeKyx#(~k>WJV4zI}$MjFPeEb>>}Ycy== zdrV;JJAT_EWdFr?4N13i==u6-C(rXR@7+JP>H`N(s5n)~P&b2h2mvykef>rML*wL1 z<9E&}VDn+8IxCBcE}B~b+4H+=x^tnnNkC0g;?yqR46lsM`ruNLDI71t`pUcem;70o zxhN%9K)-LmeRp6piEX7A+`-K--po~fwHW4t!!*kCnl2a8!_n6)3>>%T!hwYb3v^I3;E)D=m0IVs{Nv<-SGUP}iklavcSf~a?Xr12fbvI=z_UsT09BD1OIB!3!m&?P; zJ@2?JfN`0^j`3x+zFSRm2Hk{hdyle!92so-)XmDtlCJ3n6cR@ePxJXl{X-V*_YI3s z*Z5_rt_h<*zLfpu(6~3qv;;ezxEo%ptPB_`FLQP?@GH%FM^QmSDVSj7$bNAIk0`r^ zze6bm6<=?e3%ha@)#XDKia7kY5*J1z$(vP3_Y? z37b4q1!H!=1}qz;;S|n^Gc}u9QXO-~rL+}!l!pNFqxWQBH`mBl(XXbEHsJ>ov&nw} z4iLhM(N^UBloQ^##XYAx^XpB=;Aidx7OTwhS z{Y?NzeuF;Vzwr3zIyOzjbovJz2(^%+7lXd{0U_l2@Sg(J4@O{>E+>@hYtM6pGu|=@8o*5JXwCcfn#O0 z+2{WzXFIRlnB}~9|CJ_3H^=0Io-3kv?$Pq)w!8Oa*U5*f_&c54Qs|z{A&Ua&Y0o)h zjgNHAmooKhc?g7OVV1QXz0Iic9Dz4l96#Z8F48+E-+QP(TZ|Mo-rU~%*;*B!{*aeD zoOo;`UYqEs(9x_wwHay;nJSAnr2SR)0OxKdWI=~>V33i2~F|OdJz%IE;pZrETRtQRPbtV@CB%w}?ua z4B{7^J@W$8;78>*v?pX;IkRgjEIB@Jhh^I9KY&Bx!aEqhBgniu) zKM_Ws8|qk+pZS5^Jnm@B)969qe3un0PDp^1-|uJ^RUajt%9rg3hc=uU{9DHWUbg^4 z!lzL3fta=*HV`(j4BB*%(XaCxIKwYnefwZE2aLz>S5aHA&H89xhJ8*Gs2~1;go_Wh zs%x|ld4)Z_qmd^p35VHSiz<$IoDZh+{(>zy*=WYOE}j04Qqw#Bau&<1$|G;_NG7@W zs}O<0c&EAxei3(ih_dS_(IQ!VhisO>PO>0-e7@gzwz#p}Iv*ntqvsRmUgT20<>Qy= z-yoXSu@H&PhNF1_%B2(;z;-4^wu>{DOcTebpBy`&N0Vjyhe84}nFh3xs{x8a;dk|n@i&_y zbRA%s*=ERm_e>K`_&8sR?yCJPMwNrUfgLV|O!fO~YAcPE?KHN(^_UUZ{p!|a;f4z6y z{qn=_2nDZNlNbHl_bAlUR2202mR@Z#3qNVRQCXWxAU<$ID-bGJ4mG=_p0!J9U`bR+ z-*{PzXcv?Tou*ct{3`Okv3pf<=Hs|8>zTjE8DbsjpTDRFzGx7NxI(pzo)nIuQyeDH zyO@M&nIzC4FQxHa7Fu9v-vMb2%xlwo|8xlnJyfZipUbkTPs}}D0Nl3F>gDGe3uQPh zgD@*6o!yn=7E!tXdqud2?5}$fM1Fk=UhhwUATfD*OD_s405pEM?D>~y1J*3Xx ziU{bO4d_fd2ik%yS_~x=Zar)%Sk){SsjKh0beDuoe19#G8QEdO$LjOL&y@+1&KHP?vHxS{7jGaO_D;)+D938rPJI3)EE9vr2A$*a`rOO!uM2lWwI zh|Q{V#v3QHWk6j73QAW;*W>hIWVXBLx;?CUMo&{&%=(Jc(0{&A@w@XHtQ?XcLd4L; zrHrLhJYbGv3K4w0{l(W(C_}SL_T|B=I!8k0{BvWzAqrXPYZA`3cpogxK7V+Iy!9#z zQyS$kq3$rFq>@TimqsdRU3Q;&%BQL~%L$f!%#&C$o6^ON+}H>e)7NP!vPlNtoyz3) zr1wCqY`*IGc6u7btsLoglv@0wUslsDvrj!?+}28}lXeZtEt?5bYX0}A$+nbiRXpB@ z3+o<7u!TZN61no{Kv3BBu)(qhLfUW(zL#e@9I5Sf5()Ls0ET|^Z~H(Ttc}u3y-0>} z(v2EU^BM(|e^OC0u|W9Ie=TC2W9ky3>DcR*&(OFHOF`_Fdy~mi$nO5Llwk3|l(jBh z2OrI;{5}`nDLQ+yd{aLl+m9v18x=`{z6Q<3_v8xp}*RN&_Wc0F> z1fr=zb(|nFXugZ|Onl9rg!WtX5&qW;)U!W%9&#o*1tEb(h})3`ApdsAq=c5);g{MP zW>#qP2=rd+SRJ*A`*I?M*Y}D{2@^zs=nW8(fK>Df`yew1E>!2=VuJI*cpo5C56tfg z+30jE#DaN+Pg4NNsOHOl*4}xB>L$?WA;AVO3@wM2D$Ev@LvetH)Z`3G53m9<8_npa z8?QQ3pD>&Dgfuf=$?Gcu+N(de(}?JuP}&E)CTDOKIVn+a`u@7gE|5+|N;-cGEDR0L zAx4g_)TT!_JzX~lG_rPo8^K&jAFbK@KM$hQ4mA1^=18Zp#^70XZo~5EB?Lq$!Fo};%gYw1neP@t*nI6CFzj^7#kX0ZUJkY`sha%n=O&c9P;(}wPiG8j_2K&T{7<|7bG0>8eA6Z)q8p4|1B=y zmfy5T{|+9j9c9?TXXk;g-OQ^OjL0Nl7_&rOI7gJDJi+ZcDhZRHZs-({%i7XEoz5J#%z+01w`AfD3klwdR*?s!(gbf49SRlsP|U$N>!sQ8`sty} zf#PHQpPR&clfj$oh%L}2fhCy|iMHm}N&7Lpa;bFKY-mZEMFJ1ZW&00OL3O=h_%!Z6 zh-idlPkwn+3!F8`tO}7t?g)e{g+4edUHMEg4oQVCwqx(Q* z@wg6v!9VW_)PPrzCu6-|k``LAjNneAzMf+wQwSbbApBU)p@v0=8)ptWA~IACxs}rpQEn)A^N6;#gMmtzDZ8WhUnaH6{zCdGCE!yLdSyEhyo}|3lYXMpgYqTcCg_ z-CZKx-Q6KAEh*A1-Q8W%(o)jh-O}A9UD91|`@i?T_vxK+#u?+u@kOcsVBUf;pw4o!dx4~sfNy5jD;T1WME z)bq)zF~2r{j1gzFA&f@xXo4o~5eb^(U}O-`jE^h2xC!s)+xHIQEtBwv9c;G`|~EQoyxZTRo7AUwpOt&?MsdR z3X(s_lb=qBWd-KIt)WoeGradxL*b0e!1;X0KM#dbZ}Rw&*H)}nF2gpqe0mS^j^F5N znPUYL*;}3GUdQuJ`GOP7l&GrQ_M;41u7~APD~)n(Jc{kSAN42@!aPMvj?(N1UIG;3 zpR?nS2Ku}quDOVjAbj2MKf77eSSyzOicX z#_VJgiLVn%HYjeH<~Z_aWI2a66n+Q1js3WSV?ZMW?Xjat8#=l*AO!Tk;IkBUU4VQE zYZ^Qvjoo)`<5PL<0wT1K?w3X^_`-{p!tIHjX9y?= z7GYRcOmvU{9)LdPXW@I`>}_Z)z$*4ZbCatRS2&as?(zVu_CSXwli|HowYF(kM{AR7 z9YHv`J+!D`$Tydzi$@NiKn;%7XiAHt<^l;eztaCbnFUR_wVy4YVdQ&IA)vZGCsQL_ zwQ9WVMn5hp>|fj5vBuxu>PN2=N$$0Q%xjsbul#*E;HlT1ku|OyJGn|mZ0l%8s z#I`*wuc&*)0E3nbE@Ih;&Z+cw`(I^eMH^0Y4(j)hfLrRw-zq=HJnO?0=Q02H!1biXZ7@mlg{YT})cxwI{-RKBhGyoM zvqmi84781J$bf>DYC-G>rn=|F_e2$-Mt~aj!5>u-G0z%<8(`$hgTGY}oYzX28N<}M z;{*3;Q-MA7fhdj2M5lbO0s#s?zRq)GmlTw*#W5HKB9+&2n_^(IwAmbrv|k1S?rwgR zv^Y)a2uxEB^bioKqBKAthT@`d5@c~*h08h5HR9ZvRWvIB&&yw+oH;ZnT zZl<^C{Rc-@_;j!V%dnqsDHTsbMpXC^lMQ$R?2qu!(Lx`-jI$zOJ8f&;UIChLoxf{#oF5o-A0-UL>@XGheitw)8Z7=dMH zF*X3k4#228GlRUoob_=NF*uu~*QTw7?%pW~j^oV)_R@Gk$XODnZviPj{|(=Gy3EDW zqx&-%1k6rx5QK(lN_puR=9>v-MQeaQ5`b9={<^aDja_8(Lx@sHSV+-9QYA~qmuRWh z(**3}R;dEDq_5I5MkVlC3#KiK9SS8*u$fw=KIhaO@4rAqlP!WtOs3_WJ-(b8CEm>6 z9#&7QJV$wNm$ih?i%P|Eje~pZc!~%P85y9wCXRqRhi<)oKuB?p!_Ol;cK^23?c$RL z8}Ov0)-)3eom29?Rru@P80!_&`+>gnt;7ULFVw225I!CU%6I)C7HH zE*@EUTi9C!#BgB`QhMGUy+ZD4-}WfKMvS1d%5pjS66*Qu1Qt--&u6;vDPbU>ph*TuQ%O#s1PqOd zAMzjd4$3tgW!dGkFC1D0`89EJN6~EDB`ak=Ur;b;%ybuvGN<}@VS3aNyVVdc@`s1< z?>NBT?pmSjmd2ROye$+)ixsb2AzaDf$zaZ+Aw~@cmU6b+a_plhax6P!ix$JZov09H zhqH#8G)bhTP|u4$uCEP_M-8_76!xDDw$E7czJ{ZB{+@AL zRQfv(6Y>*><_G_ixRQ^5jKlx+o0^Gr_o57@@cHihID$oS&tGhqdsyDi;JS%5L-roN zR%3pp`Dy=C!vHh0dWc;X;}kj1H0P>If;59cT;<-ipmGD-i`Ep4I*0=9r&Lwv-PS7i zuJ#E{Jv}rKjdS+15B(klAorf>!R`cOl|Ut0;_;;LMtmg;+{U|47c7m&)YDN z5WXZp+@wX=4a=mDX2m%o2I|5;BLRr;Z-|>y4XdCX!P?2<;zV$#(dbb)0MnzBn(fQg ziRsY~5~6BG*q#^m!uOtC&O+JLgniSnwJ5DqJ%rselL{MMOY=$Gk!m?2Z}<}mZ+hO; znTS`th#2U`eM3U)Tap~Y7o1V|Xdd<>4X=wrovs0Rd|eDRci9f|qK1Hw)kS6(z;n{- zE|J69cM@F~qPHIR!t^=IZN{~-=oe2FOI)6+g)y-965m-9zUwC~=lJA^ zcbcG=Jnr7jI+gS}K0o$%0?O0W^5x9%^mfeSBtYiH%fHk836G=Y^sS?$%+-u?ZRiO7 zTA7A@6JBA$kE@Bp&8H(?RZZJACkgF0g07c(Z?FDL|AA@g{+|O4v=kb&6<^*%W8oD6 zPw5`i42%l(G9qR;cP33cfA~Ly?=f$1_Y=MT1bZYgBTp9nax(u#tBMl0%vU%lk*!hl zhqgxr8%a#IxgT*7m~5FO?-^C)Lf(|9lm(}~n|HQjB@2(zJHMpixakikaP`}_Mw8Ne zZTHuezYumDuRM^W?N}Ctr3gkf2c2kjzpv)qv@FN{WW`4$6(F< zD(#I0&PTeLs6d9zeODXlmooHESkY{_7GVc+gH7pF643I-9m?!;$Z;gmEsDEW2;aR* zNGvE85tc@sAW>F`%dD#ey5u?fS`HC5Vd^~Sj>vtEDvvIPKgA*;rHy2BRA0E`7dt@q z5-GThOfdxp_*xZ_xqHX4tz%3W^b(yuIu_Cq@9#45pp|hN4@TJx`u+co8-!fNo}}D= z1M^)q7F*U!&Rlp)?~r307&#oh<%yK%*y3P$#UF;?3N)_4NCt+yKH<~~fsq1NaSnDKhDblwSc=*O?*`I}=?Ih>j z0kCa4p%>V!PE-cd{p!*hkfW~+3aBEMdvYSGUvZ^Dx5sQgLKDi02Td5YDi6y2~0-pMU{M^PZ&*9FJM?-sTa&_5cr|S zz|T+xE%CwYN^lEh?p=c*pcoHM|C~4Am1cu+Sm4UMFS=-5B)Pi}TBa_&!Z8n{b-(XU^`JHH`5*%Rp&~o z*&)rLoM;|QOz{I_DM(~V<0#34f5IAVQYVjC!Aytz2g(g6T~MsdzyQmr7x>sh`;B`aL#e&knGZX!2;g{_a+p#&-SW@F6j_|HS%ya*IvVI zNrvKDJQthV4rA4s6#%z|_t4V>g<ZR-7Z+86on>Td@^471}s1VZy_42#KRq_mfuRcfh)QXY^LPGj=$2ai*iOhKP z9IN(>w)QyPs}+w}5g7y6^KDXO~;O{c5}#GifDJ*I!V$xOzetb&j|i_h2`pFX6W0)!7P8 zdJ5{FOm(7gmvgXqgO{QKHtxCd7u)yxhcUwnd?h-5xeZ*IS_(TqtJeUT7h8!ZM;`Dt z-uZ{4a$XW#X>l7?7r)IOD#e4yp2jP@$Op<`@4-=9Fa(iPD!{eNT+? zGN}bTdf9^&!vwVL7C-!>(b&Ze`9EG>%Po$Nhm*5w+*3uNlzwTmpuYXnZj#uhDrliW z4x2l{njCZ13Antbq2s*q{eX%0b*=xc>TZrcK-0W=L!Zs*s)^+G!tdkN`~EaaJ_~*B ztkq9n3hS=ru(ph1(=ZA(N4OmQu|teg2Bv*0DtGqZWXlw-@Ztrp)I~0jalZI#Z}Dv- zXi+Enco4phC!2NvTa$`-Ex2X1o5|d*tiK)_|Dzr#f>v2-TYlXMtN$ZP%^Mmf9CU%? z(w9E^I~2(O2b)z$mi_%9t`wU;;V+vl{S)>Ih>{2>{>|w3pFDnT6-4Q;0h9y;8}t5t zJ_;?9p-)*3WXid!vrnPEm?GR1Y2>I9fM{i{m*3!j&?61Z&xWyOf|N~pmtz=mQ>rXn zEQycT9E*;6tA$7v(Sf^sePx8R_s~$qKa+2f9qBj{-o=uYm8jgsZC?E;<@+fS>Kd2C zC0<#pjNS%?twkO4p^Ar-ZhsBE^Pz_4YFQJbB;cx8iw$%Zsp$TP6(fW1a7`kJvEfo>@Aao{C>G4TesEFMKMtgA{#!i9KSavbWs_D zad#}|dflP!u0XX3d!f$;X1rM$y|48I^4ocv?1RbS*`n!Ml)G$$o1bOwUW)J>Q+DVE0ARjtFA=+<&>bSqn*d64MPy2&@DLSmZqca z#Jk$4<0ScnR9+p)Z)^QZpOpTDOY)TxTb+?)XRl0F8t1>Asbf*U6MM zs!$^6Xbo+DtSejvZF%5LUwjl5U$36FpS`yqHTD?!I(QAAeY|$5lB^Ji92_$UAT^4z z$_bY0&pc;eb=ZjN5x%SB0u_ECMvL_miB}K0i%WxJ($oQ5v)O%g2nF7Z6Y;LkUO%~@ zA;Yp|bHOp$k*d~_rnZ7Ej{!0a110tSOnFS9jNp3jrY> ze5L)5aIeVMS2leI0uFZyFG9h~^TAO6N6$$rFi;>-xDgB5VjMQmh!8Vzyt=P=`gCZs zv7A7H8V;HVy^Q;9G?0h?`$>4MQO*{IZBrGHk^Qwc*jFM5Aa5V?`My{_yW;wWIK3jN zl$5XUdre-vvYCO*HZ0hPegTTCwp@3*Yq|?&3CWF5OpYQ^x96=`l z)mxiq`l^4VtfZMxZ>x=sl2vQy-=1ln9^1nbq{4oyZ0O&sj$=nt7l}G-{Y?e^cJZAdx;JP?e0+a4n}w2&rPfRy^-hSWQQNJ<2hrBk$R&Mn3+rfs$#qc-&QGpw_E*Zzj+ z^Y->&?P)X+(ub`WuYZ6-SGyQP`(<^G`uU*e7bJuxa4OzJJ%ACkn`UU`Qv_$6^3)kn ziGln#PJp|0l)KlRU_FRnK!m0Y{l|PeVG#@GRZ(`1sQ|0vx2Eea8?9AzXB%<^(~bO} z8WTzEIy2vx6NQjX|7}ZR#Tdo%_`RIkd75`W{xn#Y`?Q{1XloYs&ZOlTL~iVlhbw^M zeg7dF&Y+e96?@K@D}Yuv!Y zFcf+#l?!Gw!ff|m&&XP)jX;3`>8Ht&f53W^=&vhvS_ln3bZo!MW&*s zOQu$boVA`YBl^8Ru!R<$IZIp5ZnUHx>SVg6a$B`U-SDf$b&}OG8|mzHwe8^yw+I%8 zl3%eu2QwmlG>m-rG>O-P?6Ra~zeztGEvJ*hn8{*9exSDC)}H~hDYu1Tw*ytzd3Scq zZrC!9gnyDP|0eoYA19g;`u~#zF1A&eO_+jCE=XZL_@9m1M=evd37tv0OZ4;|z|BX zO-tWrIt}Nfsc9@ldyxxJI{{ zUeBMRUJ6xa|1(n+GIHP8Z9(#YR;iu?)$C7_Y~{D@c-@6onGSw=8@+rK(p2&CnJ?)P z>2cGQKqK&LgTgL?7dEuW8*`R92!99>ZbO4T>lLCH*JUz=&$u1kT5i9NRYQi^adl8WQ3pLBJvb$Fr0R@zX!daeVZtJa5e%|z8f6L@XDO@L(5Iz49d>$#5 zQf<#K{|)n3>z;x|geLks)qc8ZFgmt4v%x)m>Zo6hG~JYjbwgE1-`TV3%j4HEQdV+#(#Wd0eL2ogqb&bgkhDsC+awD^%x;5L zQm*VMhP zQzH|jwS`L5*UTtSk`U*P@I`of%YoqxB~)NRRCbol6v_}-h5lD2ea21{wld{%?k5C zc3n+q$x@2XCnG6!u^d^Fv#0%V#hkkzRTm1SIXOBz0qGPmcr32mbRw3maP*3~y6^wy zJc{*C8&D8u6rfmNPzgM&b>5S~ZLPUtcN5?}#|`9l6bI`Jf15wB`Uq{D^!>B_*qHos zBMo0gsAGFk#ygeM+nzYrn|;>AK}>jw(XwjiIBYY2$_)tGWfqPO;6x!R4OrPgW*m$G zb&Wk@1{Y4YT+Z0Q22BNtm#flmqTAerKE%32vXTap!@1!P(X*It0X9g2`OeYjS=v~5 zSttnhjMcXmJYS_;m7Rb8iYrArG7x;1{c}?kZlF47*wuTB{@g<7;`woStAre)(|j}e z>9=V_y>0S|V4@l~yvT&~{I{}~jSN;>f(giUnJp9~iAXVHlW${J>Gwao77cp0i;0+F z5(=?_IdOpVDUhv3o=5@&G%aO1#R~U0-CRHn2UGO=$H6yD=uFO{g_~EmN69g}CnzQi zC3-*zF-LNCBNl($n~kQXrT!paGLb=yv`|{$N)|G46*+%BqfqY$d1e-6_kk#Fg+VD9 zylc(H^#aOa5dL2A?7{bU20{~3EoJOU{*LXW1n#MyM@)DADOuW}?wiz7tOvnQ8DQ)T#R!PL#f|3Ymn zZ-oL4ltN+IH&t*Ov0f)()AJ_+DG%4fxbH-|24|_8|n5bT!Xl2>gYC@C9 zk_F|jpbO+z1JhkV{P_`uP{gauN#r>b^XV2(5V47Ve@9-^=0~s{TmW!gQrL;_0h>2m*%uDW$$rEG{<{5 z&F%Q!1yVW(|4Ps<3#odC>dy}O#CqAu1bXVXt?~K>gruNE53DSMdR)3gT9SM-iGmuK z{nO8={_YR+jTO^{Jy)w8W|S!~hFwdoS<9?n$xt^X@)!Fm9-IwZr13ZH%OnVUtYFAi z2&>aBqYue*@BpPOZhrksFqhij-ss~_hwRc<6`rZ?1mw6(moq|nY5qDp!exP|jG(C; z;L_eZsp`E*rMT=GA|8SG5v`J@*M`8Pip9_V4W=P|7&m+|A&;@auzbzM&+hm=kUo)S zF`5;776%7BPAz=p&#qQ43HCf%T}w)uf{w@Src?sHOU|$W?M~AMrXT2HGnloy%=vL> zc&tz9-rQ;7{Sf31z#QHYd-(m^X+@WwiW^bjia@INZ7~pdSuEzBywo-yV}ss^CUa<2 zdEMXl_6Z$pqv=nY;1ah%W&|c~bNrTA0H`>&5b5{)B@*d0@g(+rH4z(eG?1E8Kgj^2 zDhW9P&gUGZmn=Zd#L}>jA9Dh_`fMioat9qeC?lP&LU4JIHmEx>gYK0+rMp=nE^9PQ=Sjfz`8;jQe;a0v9R!oT^%GX#$6&6AmHI%;TcpD&} zV6p~S79^PkQKVzlj!yR%p=pdO`~^Mf^mgldpUw^PG%pwQR|B%E%YHTHw2wRR(~Rd` ztbUt+M+69C&i-^CHu+A$OHj zBZuu$2Og3msPVgsd9cj1wI{1pLI=D;6zRqGgZ2 zU;kbssgg_r%af+0ImIvu*nXo7z&qPT;49A(gGDxL3T!M4zCbh3c+;K$E-y7^Hz)s` zza1~hozdmAj7`R<)>EriQk6mHp~g9r@`In&36k7sAx(j2?f>M7##hwhA@6BB%+vxD zON1j357ZW^BI-3lCihx4^*IAG?}`0p4VeNo5@<)boVHB;0$}FF+ujYkp%0T%9m2(Z~5H93srX z7i7CP^QdRH)SWbHN&~d_uG>}SV_wsmiH`PrEb3&8BB&;hUDCS%AnEOx%8!t*8kb=w zyI$VZp;>!h_CwYLx{fJ-e>462hTR z`~A&4$c*Ltqc%>FDN;O_3jFPGK!!WH$t!Sl;k>ZUu4 zwn~7#0T7;wS55yc1w*Qi#yL%q`O|Q&0$+SGTj>%xC_)x$jw8vWK>9G~v<+$~60>By zEZqg5ZT@Z=I3T}v?SY|DV5U1qqOi;zL`D%zXfRMuVM$oZHmt7#xlUY3=IO^I@;WM`RYt)jmi)9GPOYs^IfZXm0DVJG-XJ<{Y{j3-BAGPzDihd+P&`y(awuq&X+BgMf1|2^8nM^$wl z6fO=n3MnB0_ba}zPQ||?&-dC6^Sh#GVs!DN=%Ct^$I)IFyE#lh`^Ev!>ML0%!W=ri1M0XUasL}=hi}epU|3sL>2F* zHjC8Dg7a)de>UTIxDn<4S>xNELgj~dy@vBxtmspGS817ben_AMPaWFR=iGetNEOoY z=>2-Te)_&30-4HIC;Ihl_c&y}P_Pvp9*X6SNN|)I-_L_*{%sBYc-#>1g0{ZqlZXGgivIn?q`)xnIjwSRES zjLr-r(=p45220M=BRnoUf82sGSRTAk=sojQhDN<}~;?pc-I(vI51 ziKC~0>wu=4Biwc5)vH29t;8f-!U}s}C76qb&WYvhMR{gcarUS3?y%8Orxv09!<%E< znQ}HY{J9006;0W+`NB6`rvCE3P4MqhGUf)mHuOJePI89-s9;%Cqih{liT-e7Ab|l$v^Okg#7xS_G z-5(t|3|@}4E|y0}s1%W3uh(umJge@voeqT@&J!ATee6yD#{3;455Uh;nwI=lj4oiU zr|nQPhe?15Z>J&;J+oZXbt1R@qVUqdr2P7HH?iAlgn${kpxBy9=j9t3_(jRs!QeV? zc2IxiN3$T2rYtU2`RVys^y}Rx2kjQyLnMGnFL!PEUw>h{%o19^yXyM8>z#>O&5YrG zyEN0`=5zj6*^$Kr7ykOMq|pU zFbtmmTKqXz-yJgH)!!xdX{br0^?rG}+ZEkDwE8A!(ff<)0d1LbjEE!k@;!-@7%cU9 zQ8_6|pg7{rlB2N7zWs`8WqL~_vk0P#+=vWz4 z5ST^2P#^kZ;iS<9gE02tXAPZ--)!Ugn(}r?NnC7s?5~g%x!{M=kfluS&#SI~{6}3_ z^VbD=@9x%a+HeN=27;uOI>5d>SZyL+Pibz!Rd~lC8j2eFbFzsJCL%B}kh~5Z9UUY5 zp@$UqJq#5oEhZGcmmv$`t9Myb6Oap6rNYGj z%WLj88zs<+;1Vd)DECq>oP8UJur00k9$SwP^SzZ(`?_?;!r0$Jc-f)OmgFt2q_14q zWb?Z{vT)O?si+)L)y*qk^z<7ExxqzaZG97Qwg`5ruFh%x`5;m;&h}-KOijq__M@q~ z$U8m~fDmn8Zc0t6dHy24J1y6Ltb@Ee&AS9^c)#505{iJH!zG+=wQV)4QWmIPT!DqB=UjrxG%2oh)TEtK!??1GJm zz^n6i!4O5$>wsOV3hvM6;!br&m#uw1uiIw{;J9(Cygj)TlO(~L^Rc(w9pEbT@w9yS zEhnu)oxhn?{fSMu9WRp`u?B{yU z>#Mf;gT0pf>j3^eQNwShJkAa*_D+JWyhNIzFu9P4%2OL(Z`@5E**^TwWt}up)v-Pa zi;8}o`h*}|lmUTYCNrpHYPid1c`l`$YO7c9vfP%zl=*(u$L{KE=X@)5V|OQTqgyXh zPU_0Hyr|S!={+Uo@0;yAObF`IEUG+ASV)q}`_>ur%bLSwG=FJ&sqa=Vo>aGA$exEi z_=wln>)t~7X%A0wG4;LN{aty~K%exrIF#AZjr|~kr~83~WHQ}JfG%?h&TWk3qhgi= zVhXyII9}hoR$GUgK}cKGaeK;U3Ce9ZttALXX5C6~+w+h2g?x*T71QI+4txU=G6pQ> zdg&+~P52#kxJ{hI$mz6s5EG*1*O)Co9{B^-o4wNhoIBMdxzK-iYyRTZ5qJNva}M6Z zbcPkB?VijSIAg(gw&`qVaYA|OM>H<&oBWp|ot`&}T3mtya~?m5On#g!+_sIWnDXUi zE{(nSb5>$p_?Gd#Aj8vyhx-#jWo(X6$2e4o&9u}NX_@3>(7tV*&TpGminsBImP3`! z#++CE7FKSwXCYvLc{tu#QMGuhx>ji{jBBRmMg`LMj+zP2suj@GTEJ)Py6>^H4k|TX z1B*Au4zt!4?%2mN2>Fw_EVA^1cjp3JC^a<{* zWGS?;;=-Y&xNhzx@Aiy_4*DD9a7c%Y+SX5xg44?iUSi}uDP-Ry-CH8CRF+|mPIbn} z2WFyq8$<43@d)`BYI6cbzFH8JUlU(1Y_>hsE=?T$HZ^_kAXheyWmv&dck;4CSWSaE zT+coD-9@=iwpL_$i* zi)A?eHE-*msrQU9joF0gB4>ZuB}Han?m-OaP^b)t$LG0>#zk1|W9JETU<$r=Dl$F!2#A{C za?OOFFYYJ7Wju&%&gywH=`w2at5ptj#)Q;X7Sm#4O13FPu$hudK6DC<^8P)I?#%5| zakCUsX}_htZjpjP;bLRDxq!@&m%8H8FcfOy@G|9bcVJPzDs!NnT|R3X zp|+EhTJg;&+}RO)l&c7eaWjf?)*MP%dU-F_KjU1Qk6m6-r7M^_0B#cFk$;p?n~_<& z_LglYs;9dqW5wmDm??{BZ#cU93k_Z)KZfV4#YKSSkdZXF%yX%X=$cRcm3|7eG|_OR z?~R6I8miaZWxQUF&-(PdkBV?v6Yo>*`z?+$>hA1WD^n1~-&pjjE{`}TESocZzkYx4 zEtaLOP$A1m?xYE?oVCE2u;3eY&|u1vUde-h?+hn#iAAI!xwtVq-duu#7Y&|fI-I^~td6;wFh$6Dxt|t^LI_UD#~}IaG5l&3Dv41*%0B9CsWaw)XH?3)FK@ z6{rm@q@=9*s`T(w_@sGQ3+f$^hEudi4J}~I$b@zq@9j?mxOFt6rLm3!I9i}`FFNwX&mUb$JS`_CZWHET3+Jg=7C|(7uJ5!c+xlL}FC?ag% zV-ee!c)#9lytun>RVr0W2pi7hbQ9~zf)E2%XMzF4`dlByMILQvwaex8y>lj_96Z{mcm+B0+l%4F)USo-@-|p8HIlyTR@|lvk}F9b{}~1E*epYyQPBvg$v(Z?&LH01BB9Yx|5{X z%zwEt0;H~Sa6f55^AAL5M+$VM1cT9;1(Euv!w(g#gP6z9a&8_~+&F9{Zi5@O`!nKY zQHn1gLr+3`tlWfD-0QM@sxzLS7AI>~ORWv*vl$g(PU)qD8q-?aQT0O8gZl?#b5B6o zK<-(kcTjv%0S$im@6is5t$p+liiwH~>sR$xdp_FC&Bc#iQkXtAHoB=kjrKgR3#|za ze!rj)#NnzK3G#Nf+yyICmMuqI`cjW?r4=IKp!ix)ZIn-z_TDvYC)9K3{%WYpbUeD< z)%orln@X*llE#{@Y->%Ds|Q0nCr0EuRa?D3<%yI6bs0j*nM*27$yYPcX@egXPnfBn z`lgBn>XxtDAkH%b-alME(x27-<*Q=gGgq9wjardb`T*?uR_l5*z~OiQjrAvoI1u&LD_p;navyLGYQVUS<<<_i=?u1X zb9)pdbFwH2(x<)-=qkBDEGCY0e7k!Iypr-HIHWg>JIznJpuk7xJA8FQON@D zjT*Rj8bbRA?F0|B`W3=zxUS_Wt3~Gk3RG@3Q3Mb-+tF(YJ8oI-P!B#LZewE1yx4 zS(Ja3OtUL2>ZCx;_6rJi*t?m^oTA8Jc{P;<&lONTu6|5(R?eSF=n-9XYfflk#nDoD zx4UJcq(NOfE6IH{>}~%i%Y zm~AzLx~cGow8oeUbWuSdcmJQ{eJ`u8-Vt5(jcz42eLCV%Rdzim#?wLB0aGUNzi7>c zg3|8g^t5`k6%=?MKsOXquK0XB7nzhD{JV7tHc+@`cOH+t&Pjor%h0;q$d(ZM_4?(n zkXKEco#w*F#DeYz<*BD>u03yeOLrEulxW;E(bX+S(QM+=(*O4g(8-M2;NJxK6__>u zCX6N#`xty3lAfCE0Rp&NW!xC%Nm<^Xy8C|_k>?7CVzhZ2lG1~zGZofrR!)tTgzf2! zZA;@q%R_>zLjbfWC&tW$yqmT)4iMUQm6*o3QpTIDPzAvy&@?bf8b+ z;v6B7bEvvIF@huFsVi~2W_5+>^wjI(ZsQ1N;8ri+$I0ilO!i#J&G06mWJptZ7W1&5 z4c0Hz=6)fXRRMq98kUK27FKJZUuWq4uhT9xgglfW=}#I{0u}gwB{*Cd^7rIMzxqJbAjrHTW^1GX9l3GwtE0=!y_O~on4li3 z`z@H3qmX-#3KdYoXzcZb#bUF}(x#SRaZH|3ww9gQlMggq^c!s6+x!Jb%%u9wrim8p zzjw`!(aK8DUPIVchnX6MFCs=_h~^y+4usgB|LXs4riPN>h33}MF}Gq?UK}>ly#D3n zKP?ASriv)9e@n_h)-C8=d3!M3Q(XBn;9~l^+tx>b5N9U*7J|e=)$Wg|Y&yo8`!!PF zhaV9cs^2N5;RUjYLw258rlH^*8X3-a)5Nn+J z`hN%nT$swP&(Gazia;g!W|_k7hx8H_F+PG%cDa1z~9SS@c2b16D}2h zT1}n8%?PNXX&(}Nw`xxYFP({h>G!|y+HXRWGH^!RXgwY3?Dvaq&nX)j)8bB~r1LJ6 zktj-hlm;JVIua5RyN9Q`Iw+pbFg}bpYRs=99Ph(db;GQQafoeug@CG`urdjNT%*op7J!LxY0NrS^pf(0ANXLg)GX{lEA>; z-sO`T^kE^Aah~twetYlVWI_s+k!@$3^7U@5je5DwF!7leUPxW>=Xs0~UApzzwRpR;2mK><5acQ5FS<8Bjch$A9#> zI*|K0bh2w{hP304H2=|jsb-kq38M}Y0q@^|_idlkOPp!SqEa+Y8ZYE%jJV7w?^8_?5&4^*gdeOdmJ4BMYZWTvWpE4LQ)SJ-do+AU-sP?17Dn5 zk+r0;5~*+tvm7U0XAFMzpH3-Ms`a64IxMb>!D{!zg-qi%mXTPMn|UoOr7T zh#6pkbd${3^+d05^YXH{oN=c25bhCgDQf99b*~5FjcjSb*C9 zX6B>y`t(9*sMb9Ef#+>|VS}@S!+OOcOfk{_C0pyq7O2Y0IWI(vgnrsmeWQ8Z(-|uu z@;zVA04P9M<&Vh8Z=Jh-(YuqnyTnB${vtdr3YpnFN>286HM*vLsUTs-vqhV~2MRaK z8V8R@2lFuZs%r{?wfROHe`T&7JnyFDz6qL8{*qdG(4p2n^yh;m%mr0G(9n!*y~OtSpRtLH4Bb{gtwOwJ3)n z9GmHT#%SK32ZNVMlif{|T@YG7s3-*2fm_`Dx;it#ZTfw~?d)+rS} zxZC*5rB4_<2mdAPDa;kZiBQe`OEa3nrYdO9AdFd4)_zAUf`2~jJHN3re{8IEQ(ciy zrVjx~+DLz7XmMKN&vyZ16gJEO!rM@n6ja*wnI}g7iiX>>4VRc3SQ7X=E}Xo7xk(4x zWjP$67${{KG?RUi44Y98pX^=8C-rDa=xz`g_pOiVp%14hDPMud{ny@+_m`p+qHa!_sAbIIsPl69iB@~#tM_c(r>Dq9!KaTW?Q=(a zg_aTok#at()rF=v)74^&CC6uJhDFTS|;6=;Q3@#&|VZw;f}vpcr)RD*XoZi^TJ63vOOhbDzJEUG7}wDQ3NIUl={f zj|hu>*_C+$00k&KL5;kag2swD-*lv>KqI|G4swZT61MQJKDWi84!~5+d9?IcY9VwV zMSPa%Z+*)6@e&2}bU4wx zfDJ8dnkJf#oY1u&JTlRvwPf89U6U2V^OU`_XAk&17?$fS3UAhm9J0=R_)^4z`qX>&(UFtK48JR@DLRCrME zXXh}(^9}Sx<^7pHIR>?zt$u!ty*ha|s6zo(0kE)B-H#)EBbCLjis?v%vs{4{*Uzw{ zIME$@F;~$i@Wf6H-*FX_aVs~q^w!$P0oY`*i6is;g_?Aa%pyIfImj7guNT%|HIQ)M@7|re-9-oB`GyD($XO{q;!LHgLEU^k^<7*HFS4( zcb9aBNQ1z8eZIf-oJtb5P7bI#uT6Z<-U<#To-|8u_Am(V<=Gsdba@n+*3h#4_F zC;zJ>jCL(zW*zsikjP<`kYI&5g8v6f{rVDNM~45pw{c!cdJ5Eo9quX01gt0xy*naj zfmSL&uG8jA-ONXVMi^eGDB+Jv6*R?#4!|z|O0&tcw(Vemy(nG!nOy%av3RY25lweKadK)bEc>v=B3MJt&sf3?xn|71SO$ED7NJ=7J%2$ zY5je=xz77>9kH%6ye-rraJ66XjWNIZV4%ym?{Nx`z=$2Vu`P5$U=snM`xr5I&FL;Fcd5jqN1r7M3j_91#7BF81 z6WQ`eXh!xb0PHGN%{wjpn)o7Xb5dyiSa3@e*)C@)dnT2X!B%+7C|?HPthxJrd^-S^ z_{3nSdbahse0jcin$7rWGtPPOd_$*f@_^7D?}*cSs3@ZNp}KqUA?^D`U1>RBEdcbW93qT7$5vyXK$F9+{mE7xvZJobbIT)t;o ze9v00Dup5Ty35|vnZ4VU0wzdRzeE0yiTrQ$Qbgc~&nYhx{X;ct|T)%8xtS zqQ~xJ>h?#TuN<3Un6LflJSGF+BTk&snfjs|`lI=+(9Ens(#J2=F!KbDG1q+J496;! za?&1e-HguoOg#ABa7*a|>=GB4iI9)vJ)d`Mte){+w)vjvpev?59pS+mS#y z|IujwH>okve;oh+Mi_f^M1cx_-(U=X!vC$0d6ZyA7)NtCuT`U!X{ye!+&@GF7!z=f z&6{5x3mySZkzit08i)<^393Rd$B552K-drl_KN|DatYbLpz)Ir_=~Bdd#LNF1Dlj> zuHdm7{+1i~?CTp9;DbhcsE@s%W{|27Pl6#eM)-df_`fPV-Ti-sIB+BZ<8%2x5a_?r z_Z2w6y8eGOm0Y-W9x*xOWWUD$I&kE=4@9X%#QyKfb5aTj8M;I>cim+$Prj{zY&+Je zAIWg69-1Qy1tJ0i(7cK(dOwcmq{jd%p^F**-{h$#-Zk#$64OY_roH6D%>p%vh-qf6%BP312$< z<`Ms@jaDPa*eE@D&A2p+m-x!!cBYi!DdS7u={?s)XBLv9{U(fEgja&3lC6wQVX^z* z>Rh=<-N>TNTr(I=`NgmQvCZXb@sZ9ebT$F)B%VjqSRb+tLC5@>MvEUirS<;7aJ`rf}s9 zgD_EW6{T@TRD;>1VUP;C=uC0wKz^0n8L~#x72m68hFi4UPcN_ZG?+#In)xaOQ~JCV zlAh?H*Z=B1t7xBSiW3s0%oV0u%BfjVcJgHU=DIS=Xsg%b4M#5(2<9-me9+p(UI&GfBi7J$J2Hy z$R>ZzjF+ygBw7v9UGzH7E=I!yf#E>}2-5ysHcHrJt8y6!DnRs<6nxSfV_q`EY++ui z8J96_RdjXiccjrD*&hYEK*g~XIPK|lkKm0gLwHr_$PQ#4V#k~9n>Hbu=#AETHR+J$ zEl6F4nZkYXV#e+R{AZ#OZM$tPuO%A$>}FxI{DyJb@xqq!=%f#_Di%_UvKb#2Nk)qc z=~5xRFalU?f!|9$jB&*K{J}{sQwE{!iyp^U*D?Rd<9SC zdK%n(UA-x8LA1>5(C#pd_(E!hPHRn1j7%P+oHV4IG{A-u3F(@GEwnr=$@u`vX0sY|y^J?g-VLg6t!`q>;TjFbZk z4OsQ!!_rELC?D&m6j?uLm{+7hW&XV^d*%^?8Cbb5_V3{cF2zg;}HR z0%5314G#{5_mI?9-d8`9@C$t|{gCft1cqQX&a~D4kb=kduc!?bE@1PY&W0ku zJ^pnzF{JVE=5=@f=-^~(Y0AY%go+^d!~K)Bu0qj`HCq#o*G+MVQoyBxF|v` zsOcpHF!KTWwzo(gMlnd+!#H~EWcW@81>KF3AC&ySHm6il*&DsIG2j>q3YOJx$>VsV zl1G1QZvvkb8V=&Nf{%uD*gmD9(NdZ*n!uyUsc0Uc*ba(&xvp$|n*;g5C>0w-VuDf1 ze}C(fi1u84AZU5rK!l#{ehgM8twArXMDJ`wuKL<4Y}xr}S=~GxJePamny#v|ON`92 zEFJ}ToE4z-#xS~He({9^&r&%0dn7cJFgm#!uoH8}O&f6JhsX(-SQb{eF6G_r>>nKq z9J^p`APs~ zgUD}0^IU|if00jPK+mdr2BV&{>Rd3~az>ZNi>4|LxXbU3*Sa!3Gc}N1qikxZ&t$G(w*nS)UNLXpZZ3}~>eif7vB&pLN#OXmVC7nTxc0I1axx|Vi2D})ZMoIK`w^Vgt6-3- zX*O#vn*k1z>ZuAtG=D*mGCdM`2_*h_V&+>Bnth8$Tp8|X1vPw+5Fx z0}3rSs*`^-Jn)%mj^;$@b=Cyelc+OgjY}R}??A;5ZAjd822 zG`YI#`p?P?)9k}^i5cc;lATZI^S*#OfrZSrFv>BJG87U9@&8ytAKw$UCOaP-=%RYt zGpn9ezkX)7G*hVY6;YLBODEK8*{8+l{(5g?5IyyKs_b_kd$+wx!Iqb;v%OJN2NjJ& zF)dO5ADvGIn1{x$)`u?bu01)ZV1b$y?$}CURF^7Pl1^pX>N<8 zc%G({7k$1}J82xA|3cN;67mMfcuh`weff-)ai6E z<4l2VLHj~YKJ86@@Ei|2Rbs&w8%rsD)YC0;d#5j$mJ&5KDe(%B)`3Fq7k_4)IShce zr&3Qm5Of#XhlYPC1jeVM&4LfYjdM);uzc$v+hzhZN)bZu88 zpIIi=D=l`ze<<4NX42hrC#fkxx+bg}&aYOs6#UWE<=`lCK=gSf%JzK=hUY?mPo6a@ zFiW5cD<7L!as>LxbZMnos=}bUFcP!@p6P%ky zJ@cb!<@27paJd!KMhg)Xy14qPM~5A@Wj1G{ z#Vp1H!pua(?6x-D&8X(t;e?Mrvwl6ti8j8RcAP-ipIQ8SG6iowfKl&FeYM@ za9WvV4M;wofk?71a$f164Hnx))=T7p$o>w z@0Y#I67>G_#FDwkRCLNiwx$&&IX1jO$s;-aDn&;gKL<~G%=eZfz4H3jMq$vluJ10IsY z0i~bvh|U2z?^pt$QW~6egMt;fqF;7-Y zbktUBQ~-OZPeUQ6H^R#N(|ot-_@fO(j)SCl#{=79oz>DDMc0y=dxl4(h)agQ9puRn z`Qda=@A1Ot*}K~0tlj&lJx!+e(m?d}n#_^CZA?M&Ri*Qj#rlSD45mL_48Od}p&<*c zZVbn5jca@RJC~c@n9q$##|q`OAC7dX)eyh#by*qpfPxl?HH7^XJ!()y{ogt^FeO&} zXph1qCl={Ct7|c0zaQsj`4fx{cE8&<61|pb?R_J<2n`;{TyPN3yW3m%!N!-d5*Grp zcn?0~``mt8B8($uuU#jzwgkoZuk=^Bb4ZKCpe3$J35Ucn-8RZhyIvv+4mmEWdd+vL zNP{p}+I;(YG#a-+bW21 z-)tn|7>btajBp9L;1rZuTuVCHSsXbv=N}(%kjPU7Lu5MLT^Jo5u{P0%)>^+5PrzErKvq_0%v5hF$y>M zd3Rh*v{Xer8U82Bq;~z$HzZ+2wRk@WWoikBeN#mQ`L)~CM4t<0k=`%ydX=4WHk7DC zuof(W2#_bUeQXsG%w4HDHwr=B4Gq9#rWe3UZ4y}EujW%HT)5!_WrM=EG28CE?3`$E zkyGF|^IAuzv$r@UdtUt| z9No1vlMBNSLp^rSi&5iGL72irLS7KQcEn4BGZjx$&Zq-NSu zLeR3kpX7GXPy&j1O|N@isUoc`AF|cpJq#nte#WdL(PLa~7`Ktcg!sXt>_VF4^^>L? z{VR-D_bIgL%&+#Wt92Op(eYCtUxn0ohH#>4`c(_Rr8Aj173ehR@VZaX8Ah@ySZj)R z)+|$lI9~~|A%sBq(W9XA%a z!N50?RL{*;Pl=gC>2uh=TXllAA-0*?kbjC}M)N;=0j9I5uL+pUL9MJ#P4+wour?DB z)J2*#e-Ie-tBB8C<;C=tWx+T|a1dzPC<+J(MI*n~lNH;qR7M~9^Hh95m+!-AidsWa zuK%i4?e_}dG-j%Kj5e#lOvw=8017M&W*W*y^`fLA$|#;?{o@d^$B!wxEW~|2cYGC3 z?}sYBAcCkg8CRQQz0(;I83%39Cw`(D@~`dZT3_nqqz@-Z1L#=|0{)PAa1NWj)3n-m zG-!WZeFRzWyLYQq68+*3X=Hx4oU#g9`Ead$4c(sx3k@0cjAM;H65G!vPM?J3gjXoJMPY!Sd z=in$4b_8RKg)V>lJ+Zee88(=eTr2rc3On4kC z?Ckf`q}wam>t2N931Z(I0s=Qfp}9=Et~6~~1~LL{S2G>I*-+^BA6aegN9{xr+!{rR z=DC-lglwF0hLK81osc~p5A9kHuE&H6J7v%vu`sQ?4%y;rms_x~oA#2!x8<#7$Ugu` zV8rIsyu-WWX?dr-{A})4KAaUC*)olArd}mC@haP$(5cI?9=cf$7h$dr=**$P z;`g`)nezA781wh+e@b8=DMWdK{ykT^U6wyyUYLG#wY&oxYd2s@sj6Q>3`d=QFD)%g zaX$9%HPZ7luDt%)yHZqqZJf@2pWmK3;%{sj0?-ueZ-*mLvnpV4xy?Ms4r7CGeVEvOv zlh1Fjox_`j>NB1I)LeSbQ60_+n{C?c1_OLQVO&s86w2O3=GouQ*VRVJlNr%kBmsDfJVM6cJgIkhw5@eBYI7icjqM_&>BHfRiRfxJUsX#edj=(i(lAtRXsI7 z4;__JxzN#XYKc$(f!GV9t7bv=Q0h_syQ1QHqObIdz@lk^@@R(XZo*2M-m?H_3Hr^+%el?>RUW_|%cJ^2X98RGL(px@yKFO!+nH z*n(%y9ehq$TdU)=e#xJam^Nb6t`0urL6-LeG(>f)qQ2BcZ#Ya!vZdBOBt>%_80C%K+cK$#*g^DOyTZ|*sg9d9otjLpWuy)C1GdxTEbzXW|CA!c4viepOr#WP|@VxnhL zlxat7ds@JCJJWi!?T|BufM2l&%TfL}^{`pHE<0XXxvu}#;atD-n-cTYeDhM8#sOT* zimi;?z}zk3ha(qK`*fz4ogxLn)=nkHRj{KxCIR`yhR)wS zw@R;Xo<}1P3WMU*60}$Xr%;ixcD&VdekMV(3o4~nqCA7+@SG2qRn4E?Jp+O}dhNBP z$-j?jNv}6?g9-~6T&@w>P+<|(bTpfWTR$-NAf7NXXI*91x%EZixn5?*=O8p)!+7KC?}y)^{JyA4+WA^$SSImOHPS1wI8?j%jar)QNMHTGk)}y=^cm+umCzQHS^w7R;yvt#tS z`gXEa`aGVe(_sCi`&~6cvJW!6!8<1SMMx(@0bcIMu<9_jxy^g(A3Mc0lLK_cLGM$s z(GRz>1(VS9b!B~=yk9nIGm6qApHd(lrmO`uCM?fu#zCzu8MU)M1k? z@B*lQ?DNeXo!y890PgF2dNj>Motg`m4=dGN?s>a;Gp$Sk&$q@gXR`E{Td4WQ4sgyo z@DZaQ!b!Zp7b;$Iy;=L%SKj$MutMBr3c>oWMh@!DXSLguRQLQY57>rj46{l5MiDAl zYD$7Hf0n0}@SJh!a3SCR)}K8KN1`AI`qm|chQv<$K}*lSBC{>~kZMHMV`njC;H^K} z^j^G_q9Q5bzQ;(L&USDozuY=2P$0AZyF(lOx^)-Lz6@(Y@6c!~h40G*9df`n;Lvs@ ztpuvSv@fYqtRdo_Ms_l*EcQ?$~)M)4~)cYnt*efQdmLPy>SfLp?7*# z^ans;Dk$(nU;2iyI3?cxc;5XnpVe7=J9wen+=jWRD&dWoBeOrPO6zih_{!Mqzw+ko z*^km%z@Ol68j&GOu2Q$|g5p{?0l|ca;M^YGh)m7-+%6oeG9t~ZbRFb=Z=IBVQP6%& z7kcD@92~@=XBf`qp&=RK5SX%GZc4f(!nH^vKb$pIW?mFHnWm|lK70Ak1e|^PB@aZo zjXj7;fn0KE&a_(*3A8u2*Mej_?EVGK?vA|IBIawv>}m9`_D>|J%+$SEYx=%z4&QXD zfS0he(#V!!>K}ti4@RT8Foc>rNuyKkbTVgE-D8AfS0dU9%g`5PbN*f~vUIq2?2IV% zge8?`MCqxW2!kCB-~2c#zDy$1eFDIychSi<=!bP9W1M;jF;48i>Q?w^n1~p#kiEW{ zLrwUfj<#ukwM(0aXMgB(sW2|B)`t|!LCAy!}I5M(LKG%_6TKtJn`kSwkWLF-Sp#8 z?8-heU?*9L_-LWqNK77b)Khe)FZ4^021OhqKcoFXa4X!mUY{cL+`UKEUY#2G21nw# z6^81&x$o!kqSdLs?}Zy*(jG>mD@Y2jSlniNxMe`n5vEV93BQ(PiX01|7JkY{Z}Yv3XfiI7exx+(KpC9e z;^E}--cQq%|7HFPu@ar#bWwlxIp1W@gw~jP(7nOo_xfzcnOiN4u8VuQ4hlMwd+2T% zEV4t>67R^%*3%CSPeN4!MUFFP5ghQ>WHyfy)C3a&WcH!Og_wzR!T1KaIoBC(Wy=inKR$ zV^jebYnn}f5iTMXCp0ajEb#Ym7=+P}@;9CCn$QHUv^o=uUmX$l!M7n$4A26>)BU#6 z*YPU)S7+=Lu97QVLABtlt%!C+7FP^*1m0C?WzQUPc(bd$ zv*)o(hm9KIVzD0AL=JHfY-r!U%;gl2r`*uml~;@n$m;T)(hi6!zAA_ts!Vr{CqS)a zhGTNDnf4Mn$`e zji7a=1qp|zIX|BjmBbcl@f8Y)97eRgCb`M!D~+vX7cU$n#WS)!a~LP8TosNRD>0y+!deq7W*Xs5^XH#McgE&x0{x z#V{S?na)WLY(lb%;t+Y-V#X7ZrzTrW4~ZgY9!$QuaG6=QkE7b^en~%&X*dggWUT0w z>-0)h`L44eQ+N8;P~~-*-->$Fy#w&bUAD69n<>%agg0DyJl*fzI?(7Za0Ww)K((%c zxfl;g-O;l@%;i5d=DQxIf9=9|Y)^D6#hT_fzS@E-3XH^#y zV>OauMO27(KesT*D|ks%zhqWLLmn$oP^f^Vo$NP)`GMpR>)u#z#-z@ko(JCL(Qy1+ z{z`lF#4Dg)Q;Gcv9lCFR2<`FoKzL0#cq~rIxvn7B+mJ(s!8UaAp*K1#VWGvE`(um@ z+vh5lW37!Y889AO5_nyjXd9Z-S|wpP-Zp1w0JS*Xfl6@OpRNMwnnfSS=8UaE zD^xYVlclSft1Y`OV6Z(w13>myOm%0>KwBB=!^8+^%;iRX@X4qOjA+5kojslo%$A>^ z5D9XKEG#$%X{!LoMwSKyJDyM$s4A#mW6C7$?81WuP91@58KJ{;R@tIx*bujI@Sd)T zW($T4Cu$dB<6AP*1Qkaz$%?;RBWnC=?Jxkr_{S?}*X@ueNn7fHz@Z_~p3<`&*$zg@ zNxzuG@oZq@xQrWxrr|%^SUqV(XWz#6X`#Ae3bId?p?wJcc{cikKqX5d;bf@U+jnao)Cd zY;x8#_++A^El-mNLrCGOo~`(PN=;PbL!RyJ&bis7KrvX6XHBk>fqXh)UKtz?AvA{1 z-p)D0+0t;kM!~X~Xg;;Z#>Z|Mu`QSHba7$E=AbJ8c-qkQ*i=+8{~*>>`uI#+64LxD z$G=j_o?Dyrb7p@E)&s2@6lv-r?4joHSOEm6gr!c^7E>`PeUmXnT~j!^8Wt?f9AJ2a zT+ab@NRNg>UU<*i&Z>7=oegtSOzsdiK33%Pve@Cuj4GoMedO(c+=qOWg}gf<_MrJf_YW(c~x+b zXH=5$dI~%Ql;aVP7NaQfA#aA7Wy=Y-j}BgL9PKE)Vo8Ac`>raZLw87YVO5IQ;cY^* z^|E_=(tc>XlJgz&%94RIB4Gi-=$Bs#7sPvvX`@43{_6WRC=4sYGm{r~}Jn4o{upf~o zB8yzRQkpZESN!^;!}suYBx>c!X$O9TRmlMLg$ZeZtV4I#m+`}$H|pG@1;P?t-nHn#{jYTh<-tc ztHGVr;$~L#`Fi~;|F7K6haQFUD5=)EMWa^ql!^D+g%um^pPnqA?yo#6c_}~!1xKkw zEA0dGBrrG@%eM|KF%wBfIee8WqPQ;JBv~x{|LHU4ejT=IZXq7@np0x}CA5AOJU%=! z!sg2o0mu;OhoH9fd)@81x;HU6a;W9z<6H=Kt9KD&GGV{m!&-rYXF%CGYbu<)_iyR+otL#wB8T*?Z81$8 zL@IP2_~HLjOTdD5dze>`WXThl#%bMK%jX)b+DQ42k5W5+ZphQ6rDEd&CR0@CikF9}kg z`qC&!rbR7tI`(j-v43`*swOu$!eKNHzmdBRo+qA!qZR!9x`&0!Z(y3K{wMg@BX6=b zLOOTH@U|FzcI!Tl1&xPJej&@)%R0r&5GSMRU7nFMGpSB83PWU$vD-{^rQ89$A2zIT zO#FyEpGJ+f{Mf>zJw1(S?)%&mM#|aUo-bagqx+_5#tJ@2Vz6DRg(Z<6Q(U$pMHb`J ztZJQRf1(tXD=)>d2iW(RcJH*$tKq#(scHVFwv~7*@s+1offn)|s+^X0A*agSm9JQX z!5$pDXAs?r#wK^ZOj!>I()%a_k{Ps`W2uouK>Ex0SjgBT#a}IRV!nK4J$t)+%5bkX zFc-yKxbVbFK_4kE4i{Fn?1@husr*{c9htoHGN3$PGn%|I8wm~WXgtkvQ{lCjJsT=Y zp6;8AGB%6<2nc*n*b5ul*TF3%R22Ru6tO$N<>1$z=eTO?T6eVDd9zvrJ_N@b9)hMcY%0f|Qj;1-#_;cJAK`0NYK+@-ty5|5Uh zUVNJxv>&4j>FK=dehyXw%2=q_Ay{K*PnX=C?24Tn9&ESFFWGFVC3v`VZr<}x$E`eb zatecWMa`gJrxQFQEgd_-9Dl52h$2iVW$BDZBP zO6sA4T1o%}>oQw}CpN0t(aNcXUjX0QC*}i=G}j{vLp%`N+5m3K5kS3dC6bKVPE=EF;X4K%Mam1o@6}NPz8SI7fP9lHuVKfaVp424`-CcQ-6*>JFR?M; z$QgTKjMVocuzneFd+M*CAWZTq6W+w};OmLo_S_gXpqtdkC^gM>7VLM3^8qQjlH;~E00_SHT8W{ca5UTO%GQf5)6_e zCRZa#=4e8=DJ`+^$gW8BhQ?wI%0F8GGtVG3yp#AzcWL{D{sq3ZJl*yCIrHKXXGQ`p zPIn{i?VeekTsl?LvS=#={DyIoiGsWaAt{A_(*8b#6sy%jzkMCzLewmQwWd4A#!aOB zDc!s5#4H$paB2%12_Q9-E18$p+3Y7L4+4>+Whc%PSEmKQc*Jf~Y^C$-NFBlb_wZ=q z<>p^0#;;AryVE1e15Xbyxb>|`_fXXD(41T>>dh;V0R#`eNbfIu;0yCa#d*!$QaJuXzTf&;2{) zolj@I0I5ciz?5Ju?-I-^9V9Ha?Q|I!1p26I`jzJIe*MD(lr_&;nLjhAkB65jhx7*S z-x=VAo{s9FShl=F$1UJJ{#%ap{L)qa@Y<9czI?W}URBqy#cRB6o5{tk!$UNCDVlB2C5jigH$6l>Xfv z^C#W7W~C&B-N+noscVt%ousucHI=O&R7Hi`Kp8;bWq}=1z^wCS$3sWpx zn82^+5W;a^+qmd+5A>_CR^;JG0uF;w@NoFfAK9-_cwG|J~K^EDEr*>?~ z&*g)=;?wD(i{)#B@-jqoZ_7!xHm2r)ADZhCkNUIe6(^K>bQpKEzeWYH9}Lsulv`J% zPv9vxE7NPN$n3eP08LP)B?3}m0aZIJIc!*3VJ&B?D@h%Evgb7dz}M#GOu5-IzW_bN zgq}B#6M}na1sXk;vOpCD8`!Js& zR`yb9x>c^d;54YNFZfVq%2LvS{>@4lyb=XiDRjUh(js8Ks45aer_6~2SCt3nj`ZQA zt6;|*#r?!y8Lk%WHVJ<)19l8YCPF3P5|ghiWius}C*t0nRUoCb5xz=5@`35#xNk!?i)w_zl+thmqR z`JNaDNDkiiIwP)5MW`!|mL{<`noYbLVU&Q95O8kse9lRsIC*%3N>x*TaDVd-5)l?bo_{z9j4d1x zr0^!Ge%(QGasWk)AQLR~wDW=Tv< zTlr^VeuE=uP}I^t-Cn0GW<_G(83Ojd?y^j4X8I}`T~#hKMO~jdBG}aKsjs%5H@1)0XI||j(WhNdd|k^vM&r=q zObYeRM+NKwmAZZRcij)2cgL(w9Tn`CZ z7<)3o8bG+~z*)#J6onvR%}X3;BCoihN^*PB1{wPwi5<2Rp#q{p&!?5Yd;NVt2EbAO zrk~>VE90AL5GX^;S;0H}s}LO$`s38I>c!#yxS`r29Y?3+I`VUa#%of;xpJ4l9od77v#Smuc^3Oy* z-rsR^o5tzYF(^D%*ETNVx>)b}OJUvPE)(L{5IFCRM9Tw}@`#Uq9wg|D$K)1On+C@Q&zZmX^kLD$}bTvrM7TrNe349`MGOEs6bjDL1 z{7S;`QJGnl>%Q4*M&~}9@qgmtki&$jZFcaLof(R3TtAZv^^4R)&rFL z){H!HNaF*dD$|>)jF@i;3o9&9jL|HJ7*>{P>P|I$*0|32sOmmikc=D90xm~|rP(Qq zinqm9NrKLnIYp00#ypKyQHeHuLu-pQ>XKs49!w1mB?!O27^s{zD+xaz&KWiOrA$=r zT$zT*hkTdMdL;73A5~#^uGxXEb~F;Kj7MR^HOfb9e*d^&@0PLhhIuhOszEjLP|c<% zYsGq1h_iW&D3EB%j(llUWl?*6uvE)#@T*u(tuN5~J0 zDWnvwE=3o$uSrD13i!vZX>apZ#?+*#`y(>k@@MHD#s#ZSwy)TIkeZ$N` zQ^7>7VV?INefaa+5E=o!aXhTzA;(ktdD~J+nqlJ>;6P<|SSK z8j%f#&#CFAIZ=w$3PbG-zr8~^ZFoBumo{j=Fe|b#)Je)L>)PsE!N9X6!9*ed%=s2_ z$8{Dj+TExr5>iwW?P4RRk*)pfq^!{|1GQ2mx_6;CwOyyO$A9d4jnm;KN1d! z{({hlzT2ClEbE8qfa8gw>YF{?yn2IEycyq#M~@pgaJ=$ehJ3D~hsP~B&6}$f|G@i0 zwhk$q#?~g6?E%R~eiq=|EFBqfail%RZ|bt{t{FMX+gWRjZV34Pp6wO8Thi-jbtQKhDe9-iI5;dZ9^y~6@E&jh-~>^$cZgLkL*TV|C^8fIqAZ!G^*g&TS1PVWo!@77 zeyfCJ$!>HgW{xeRhc!r*Hhd`75|+t-2%#Eb!E?D<;GMV~xyyB>OC}Fhd9lSiweow? z968T#E9e4SD4JPmWx>v(B-}ScHvZgSY@c5nQ3r%4MLFDmGx+8Pfv6)}`V}So1Jbla zLPtO_U}0SQ*;p_(l{j;mGkFq&kZ<$r@FELEq0ipT^@{YL=wHo$2UcX+0KB+>t?3v$ z%zrGN!NCw_YVNgKve|Z$85Ur`Vn)S3TRzKX1I_-uT=)&hUpO)85af)_rjR7%C{6xf zU2hrHRu{ed28U4GT?)mar4-j7#R&v=EneKU6sM)QyA#}k6)0ZZy+A4M6p9x(yYK(p zbI<*7*N1!vVBZYjx?5pqPdMk*G7Oi^J8GG+ue(ZAjg!l!j&LaiS5>tMm z;Fy_O8G%g&kJk+?tVy2gbMh~%kUKt3{WLi~f;+|wHv81gI{RGEWRj_eHrjcqX-N@f zS5a4z(w;gjdAiDuAX>RXpF^F2sd&P%rJ^Uol59kEs6Gr|b*LLoSewZ+%B4NKhKtDv zoaQ)L23>fPS>)$otr&+9Vg5c|5^mSSN9PWl{}hOaf#`e3TfQxgBV9^wNya{C83p9j!jKzWQ<=QEn&>Ym6o} zOZsQiBWGrba8UkA9?p-l+_aq3krImh!-?m1O`sT`0`x1omF>8 zj10(9`O)xDNLzkI;|jzja@Evfg_E~1EmVdK6le3@`}z*T=|KH18kqG2pK+re?qm91 zl@bK=IqW8s9M(q7B08gI`7Jw8=Ni~Neo@-*8id~cjIi5dGD~^~-ge48_P_N$JdB_c z8T5gY3#su+L{b(GMf%u^2YRp(U}t{j{QAX0tMsp2p+BvIa_q6Q+0qY!5I17hQ2LZ! zu9czWBg3iT9i?&y+iUuc)=ZzK+`x{^HSuAZ-RQ_7%J(ayMbNnDO>O5!v=qfFvl97} z8oF&oB$eB}@$&;iPSdh!R0VmyVC?vz)P{c78q#27@-{mgcu!H0PA4hPlCg zo0?y$vd9yK9+h~24;@rC2p}-;W{3Ux`0yuz$XVa?r4XpaXlFeB|Igx2UuBg&kms{s6eLbH#PLo?M>< zO*ognUi=~_2&0<*@GZ={HPJlj@oHH~#fqar-AL<2J1)>|12eodsgJR0Ur_x{p4J90 zuPks7$;0Dd!zLv?1m|o!&)v!Jq4cmQgv*t2Kwc@4GI2wKrvD}B^nE67T`=|Aw)>NLQ zr%jWuRf9>m*3a@%CncZeNtVeQuZj>cs>jaO5j#^`LP^WHs*X;#>i6X1Mq{f#5gi}% zX{V@H?duj9YS+9vu=>oG5DsgWWh-wOJ#=EhR^iqA85#iU(yl3&G3NO6QPrp}_gY!Mb7Z@2_^1rppZ!0b(toF9iViAzfF85xiT zZWyxhQ^W~4Nr<~8jHTa7Erp0DcjJc%R&`4SNEy}*X?dHo&4!!;aw5FToo#NLZ!VpLv zy`~xU_ljeSok+Tl){IDW?OpTP=jY4}F7X@AqQj&Y%pIeDHqK3ZZnd`;&txqOk!-!a~K31j+10Ahd-a<8aPkl17p;vBRM>wl8K3d#e< zjFt_Te*E>X?5EIP3kTZah?4IHFf+-m-e$HJ^z02A9$7mXwFTI|AfEgij^C30ihOKw z{Pe`h-}T9(({iMmn_;6s6Jc^%5?ddph%3K-QI%hBGx?HF7W}Wb_u(74N;t|;WO>W3 zecL;wDw|Q1x9aRmVfDvniCPxzIEqoPM@<(4xYP@S zT1*c$*Je6G-KalEOfsf@lPRT)8^PR%FhIj3W5*@~@#QRoK}4~3+h5a2$q#udTCI47 zW_fW>(qll2G*dzs$Y;I6gY!FGtWJ7Yl!o%;s8!p!f@<3|NRhux-+s=Xm11{VisfS` zB+FhVG#B|LXs|3Yx*emXaX3LFg&M9BAWi^2fH%$ql$A;>1)a1KcF@T=zPjlfG?NPA zn3LRKe3|!4+C#1_aRe#WQ$)e21hSc*1{Z%}U;_6+CqA81f(_c3a9gXQWukwJm78nRB9|nc6qBWy3R~x?*$% z0CejK)D6s$!AzERQ?>a%)8d~yTe}CKn>&J`$WTPTR9hTd%3!BiBaJ~dN zPeeC0PHPoL$d~oFOUK9|#|KyQ${oD%+?pZ-2x6@U{gVKNMB_k$%fV_36T%rGVhD_l zXj>%5(LAvVs&kR!p-c?0F92WLsYS$Q`O^V|2B;wr+J6iu_G)vZ0=>r~OGfa~Jop8=65s8c~aMDo-TeqqSWOx(mj_UAnN)?7{= z8&=0YR^}yv+}}0kFfjFm`}#15li^)km-$(}8MBXana&4B=i_eHE`RaE01a+9B)pof zI?J-ukslao6ekxB?;E=8(kJpP@gi?1R}IP|pyJ<&qYYbbEdvm=XoO&!jXZ9=2}Sqp zG!+#ra`ubndn`$K-CtHUYb8Tx;LuWZp=M0ya9Ruw16=ugFIV^&^qp*5u%~)Le5H( zb4uT+<1^y7;)mcTM5d*Z5!Tf*2mz&dN7~VgELrWtPI*ZkzzEhbMW06>;;!;RAIsc~ zPph^QC^LOov=G!npch?(Z56i~z@8Tx8m(oL{B@ z#?QK-fk3M`d|>Yut1IO}#e6H^85Y}$zXi|3(#J~{stA6mU%iX-;~Dng%;*ShGQx|Y z+I+SL+_g1bmEMH`<^P&>g@G?kNm|s0q-zElNcVQJI_l=y;FaV3))u%;QvFH2@q5N66GHM1oPoL@W2_&_WW%$Uk4sdv1jZOTxCbw;? z)d^5>HVXZDz)y$_!qM7lc=K@GmSc?glCke0h}REyKmL|INDM-C=c1k^2}9UPIlSZq zfpm$;uO5e-Ry@Qxr(0?B>PnlQv@M#MxVj{MEakUy{b0AJq+i_e`KvhR$sZozzC7Mc zK8f%muX>(Q=*NZVjVqt2KV!mjYtda-3i$1Ov2@tG=^phG1pbbOu+bH?H3Fj&2;rq2 zY!~-6&6RuixnIwGMXy~&QO5P4SY7pNI^edv>DCLY{wLwvPG{{mZZrouL;zm1!NZ94 zt{+Of0HlvR3Wh|Oz?Ee3o(AxfC|ViN-$j?p$}qv+vO@&!c3)p>kpQ=&TmH zt8rZ1nJfZdLD=B#=yBk*GoUGP*dQzBJ+JYa7PgBFZ&_E6+y2f$V?NvS1aJowYDto% zUdC>a{<&&&fE7v{nf$PGB_0zEL1vc3`qnVk8w3!bH93mT4DOv<~u`0*m%-X*eTQls*B z&$}W(%@#awbx94F(1ydFXYeu^wfsCnG`R%UJ&o|>23q zgh0tJ(Liwa!PaR3Jb|D$bh%35YhA5;BslKg;hha?ICVXKT=ToH@tCDXpuAa4e<4er z2*79c!|!sX#^hZqC=49JTKg(?3I>KMvSBiTe+|2DT^%S3=3N^}h|LWx@O&Hr+nH9LeeI%uqD|L8x7QQ8c^jb)D5DMd`C>x#+4oSN(+&lDpLNmAQ5nJoh!a1 zzl~-Q3X(#eG{)&$+|;MG@#6o~=b} z`hxWDZ>oynkC%mo)Mn2#qYK(^VkCj$n`<`{NEBWd<9&1akQr0L4O3Mkb$I)AS>fTl zVs~A1MTk8~J^%fIMi;g={X%M@SIuZzo9nVVM$^p8=~ZSIb{aK^xy?^xx3Ke>u|kue zi}UOCs;)I914H~X$Ms+k;T9tWFED6Zj_}fkl)Sj#tEC69QgWOQk9#Ms?AcF$4^wCJ zk_cmqeht~T>Y|3AMoA)p!p|QDx`9H*2o{2LJTUCOILmaAM%|u1p89w>visEh^k?bt z;Tf+Y=*N)@&90LSF)AB4-}Ydxcx$e>s3g`W%_|PgQB-Pu=bo?>z096qx zj%L=n?jd!^a&I<)UoD1aUH#XeaC8uZ45sp~;&smHUAW{UahlD%p8U)Uv^~1)OcygNp2FumlhuOt?*ez z3Jg8PJG$Q6*_{L&o@_7KOrAyiD}16uo~pkcFuogkYtZ$$(;t(al z#7($~YrUhZGc+<~3}}-)jnvTnRSUY_zET%YY{tiQk;O6Kpw(P%EC^tQ3W~-*10>@q z)`dt$RmrENR{+utYPZ9AFzd^ICsr6LUzd11 zCYzw`T5e`t49&{~myW-UQ90I)DzO3=qGr_-;nrR|aXoAuH}#jxkHySt)$0Jxat?sV zQ$K_hSyDTK9rbj{a}s##d~tCqAPJK+3&HLR1JwcXW;Z9dw1ljwM_x|cqbxmjwPt0C zHR=fIPj{!MUzKW_PfkTAC)HHx2_r5Hr-Vm|0WV11GJZm+y8W zca-f_0)0sLKC7y@2)ga1IyE+NZn7;7pk-t#7rV$KCM{tMy4`5f==^)D!&3&KfKj6w zV;MQU?omy{1r;i5(N@!mdbd5SI2m(~4?Z>rUCmFd8yjSPiBS1G>*r`7%*K4Do8LBa zqCZ}%+4*-a@%ZU(KT!=Z*+)1Tf51Q1+7 zJzLzL1d#AO3qSJc11Z5SHO5{}p^_0X%K2a2k~*&aPp|RjpUzef{k}AFMPPr(W1F4C zkH>U4Ev(|FVZ?`!C}M3Rs-S5~;p;80p4O`Rmt@Mcu{8KkdgArj_UDi`@*aEJIR?{v z7Ss@)Ghq*gSV*jetf&ap!C+eB(8y3XDa>Gai4tN_<>{hS?ds~a0MA%8cVDT+2l+|N zJ$N+$F(i(h4W+FOKw~7cS@~)s1em%74SxJk>iQwt_GI_8LI$M7=*^Ny*)k9HV7WND zW%L!de-HF>?<{gH79)VCwkJ%fdYwl zk;TQRqVKIR>khxJ>~e+G1a-?>4|?6jZFN6!*6_lq6+7nrxkIT}Jz>t&45+w9Bju;z zfg^_Tw=&(MOR&73= z^IVr&7hbs4(RJ0GU(MYfDh>6g%QIR6nhN!@QK8x9_-#O7lf$F$SN<0uGy&$(zgKIA z);!laU5m`02*X0)!R7g7;AYQHg&si|d6HPJO#CKkxLsa;`vV8=-)CP8q$nuxM9my~ zTT}6qF|X9MI;ZwU?*6KhTff5HMQrMU=?Nks^kl41=h)i>k0dtW3l2aAzY``SUJ^@U71L8&hK}~30H)%n#OoSE zlN@v6@RrZ>gZUxjy9xu}`sCb2fFHKNw7cTlo2SS1ho4Roon5WDT#Kqh1gOCp+Di+; z@9s}-QGZx*u*hQ;=dnr3k9#8Uc!O@<2UxH);p2_H2!Z{Eikizo-c8Pigacaid^T_) z=)}7e-lG}Tw$-nKHr2U_$aK;_{@Hj#)M!l6+*x}ekZ-YZ47~=;%>@;|GDQ0b#{*#oIi$HxkWE*5^4zPo)rvLldE>JT9UnZ@0e!g#)% z{Mr;7rk}dibn&ZEXJ+lP2Bli+z~pV-_w6dcMq#Mg(~P-ci1~q99n)QqC#llC+K_X_ zYGjD?SUEq7JqZvNwL!VDWRleE<%w(&TGBzIq^YqQf8nc zQ=!{}ruN(yvGmAnXk$r2I9jmeynJ*OE>d1Xf|)nIpO6cQ zzcsMoh>6N=XXKE&olFVo{K!8HtIqxyexEZ+%q3Qoe9A{{_aYRV7#XdA<4gmQ{n33x zP=`I`*nem|wekTV->LfU(su-moss7xX2Carnt>Ppit7zYg zL%GkhH{_E2YntLLCwI%t#w^s$`VMcl%Gn!W2Eoln9~Xo`m<*^D`kZUn250-jsSoOZ z+TJolOv|ANMSfQ)`0EgS2&U*z&He*VaVSzg)MZQ~?~_JYYY-U(zfyMj=6e`+5}+_A z4+d`yLymyEWYAUjT>iZc^Ei7sO?=TpaDPs8kxuWmy*LD9ZgT|CTb@dvR(T$KYdW7+ zOvG4|j_Z%1191@M&J^!4biOXUHtrBO2@+UR3mQjHNRL~LmMOAtp6@_cd|rcS%&Xo9 z7k@f{7nJi^+PrrqUZ8|2c2fmCyX=v|nXi7FQ?*-cE<_-xYua9}tQGjC%4w`XeU;Rc z+e+c8B#=C+-#ZxrD;rA%**tpuWGTms{1XPMaOikD9U;U$j1d_PH5wHQv|GR*|E3iw zqXfN~+h}JvOc9f4OKrX5?}9|)}y;n6i?9JW_}%{OOVX!LspDyYlq%P{=cz} z*KCa|o#*cl=K?Se#hNC&{F*kf>N@n!jx!vyi1CFOOJ_-LtL5l51qfH^%G^{eJgk1! zyEDifJJwzFYIZbevFV2xI*&*7p04ToAKvw>|J@sC7a-js+(4&u#3=5^?QM-&&hCm8 z{=cx7EC_a}NFD&UB-AD88 z7KbDbF%ZbhFdMIpa75YEma2F*QEL`I@|edrc>M!mU~{R^+9B5(#(YUTaQ*{X ze)TiuqaFt$RtqIxl2|bq87&W#@rzPop>R@MrijS!Vw9B$<<9*(027#h+ya6SBNYzY zQH4zI4W+63ODiO~t4_8u53%+M_s(BO2%OO6?>-%n?Wv@|nalh6ix5kO7Gfqx%60*L zbf#i6gZ$d$k$CG)DCJ`1IHn*lXmWY?=Wi_7#8OL-vmBB&gFJA3DaN`()n&=-y5&I$x-ffex-1HEB&!61s}o|s(k!q4PY4HJuRrw zJpmqYfh*p@r2?uyU=klzhx29r~%5W*&fnymHQ=FoC1eiqi5v&!MP zcu*_P#V3a6n?~nNqvMf9LQoM@^}K0~^4lHTN6jzSM0soG@D<}ew`kJkv%_I@ik9mV zVh|=-&#&-dNXa7^ozYXwm+ByAKQ@Y26oq5&L0C})`V4w#&oloXR`OjYS`?Iad5VjI zRy&uj12Vf%#21~_lrilFNW^v)+rd8}jTc^;I5q~nMwcVnk(E>);ec=@G{$*R{sklm z$c3O=H}V0t%&;MV=3HZ2xtDR}0#v&)hsA1+jW5Bke?wXGh=7Q=nyz*KKX!oCnVB1t z0kh95&e0>!B0HJ+JvB>J779w)I%~OX(>(Lkz910jtS9lyXkRpPM27F64!};qUpv_j3A=Nr3kQ*{N|SA02Sa z)js{cukh%6_DX~909;j{;OYDg)P3+}wp`3ATmRQ<6>i3#L#Ybwzj+n2^>dffs1jxn zC(#yDfW*!?SGlobMza9Vb8U@rE_QORhE?>|iT&I(OQ(_SIf2_d_P-lr#duC!9WGW^ z(-1~lUX*Y}Hg|rTLIgwxs4gtBbh4NED||625B?iUPt_9O+PMAxIS&ArjpX%Gwp*z7 zQ9Go`m(^5`Sy}jL*!Gxm!f1x<7bfaz)b6;ymS&L0&e=e<%9KOrW>1MDt1G4=`Dy0Y zTM%a_+1tRctf#$)K5WVI+9K|vuFv*0IS`C^g%BqmyYMOtbU(*o2oC8fv$bQ;ib8L+ z`L3H0Q^m~;C^!G^BrkuRSP@#%PGD5qwa6 ztn~gDOWapCC<+k&xis8GqldxHbitQk!A>x`4otRQPvWf6Z zj0Jzx9c_=!ZjRpI%aUO+5Ci+JPn5G0sI7dU@I%w>P1W4~O6t369+p(=!kIeL@3ZbI z>Z~-?4bnjFWE9a$FcQEuenZQ(h*w5MnMxiGQ9-qHH1}@To~(5K;(ZFs%9ZuV0#^t{!r+jS3I>%Zw9E3i zR#CdHK%bpesu(AL#PT^pIlz3N#)}a@=J@Y3;uQE*DU!xveK9$0YDzne!xcnqz2 zxQeDXYSh}cQDYH)nDkDeV9!UB1WD%Su_{||7O|BKhqO`h&gI!M{p!9=-&=oWz{Q z^&F~tWjoOPWRrs%2Q4&G%e5KWY$cLzw}tXxmJn>#+Jwhx5=ChyNph6eHmZXt0)R50 zMf83?c?oba$IMJQLl?Bdrm@cLd{OD3K#Vkhor8Oeq#QeOPlMm?=U8(PYOMp-2r1$t zP;eTZ5IY&2AFf^r{=hu zh`VU$(D4EVK|uU`a$rjR$zici&>)h@Hy6B|uqwPEYjY8D+26+BQX-?b&vnvCFopBR zrmW7!nVnQOCyGl&mbA178x|jC>CI01NfwA{+GmH6S2>{l(>;5dd*!#&;1{qfoAKq@ z*To5CVw&hFuXXUYcV-55xcPf$NvM+W-nt5#uZ$7GjrA)WgtH%4(Z;*# zAdIPYUGVte?EIOn+KP=uYtvHqcq=4}QdOTClmFNSVDam1%PF|+Ju*V$FRJHrGM$hx z>Cy5eagr&(Z;0QOaTeJ#z+%Gx=q_d{hVGOwR$SE0wcea71AciNmFz8JWx!c1$4ffA zHNsC8y__*S503(jy=JIlvtt2;W{jq4h?GG zG)p%bz);pD5GV=pbDoO{Tfy(M9z_5A?I{HH+n`-zcZ6O%5NzJ`h8HumQH_4yvlpCc zf}crOpB?u(Vo1B%?rXe3;AVr?XSX*@U`%>u&@(wR42(unHG&s7%wSmDI+Z>m`9aSz^grXFBHJ#40MUF5SMMp;>DKc=cx^yhKvU+j_^2c8yDL~fP@4$qC~hmJ91F(c ze@(EcZ7Ve-Ds|M57h>?4?4FvOr$=DB?QON%kPg%yvY+$(xGT&AFVd*p(X6bpk75{&K8#QYhkr0FBW5{U39urG$>S%1p060SQg zq+_^ON0>@>x%h~aekrPFmNiR422a1}j0B;{bt8QEO^jRlL|)Upad#{ts%qx?@uCs$kQ&QdY`&yT?#P>&9i}bMqsVI%W+Q)J6VL5KL@7)4SHg^Jc;&PIeQKrcZ-@7E z(DWYimx?5EByu0aDY5p3vcTYT{ zH@a2oXNZ&`;)#NfH7va=hbSXwAF(%b<@$DjEe1soB~Y((egD0m#fGk|E{IL z&a4B#QK;q&&nbCB!b{4*7TLd^y-6xkW3McBWoDAGYFz7{shwmb2E{Mp z3h-H(v5V5-$-h0`Z(@W$ODPR`T2-swj!wyE<1!5S>==>Ki=)!PN0u2y0kU+cga6KZ zT%fDmj@B-BfGM(tg`06-Z7Xa!iB0a=$=x|>iLhoAedgdtac$tt=J^;-A?_QeY zyds**u5Qz*4)xNi@@t~~9<_-EA|CjWVNJ|h+&2771t(qq`z*2Csv4lD0KQl|fmNlA zD@0Z)Jggh7^jHz$+vPMy>ooB|!hwU%2Mq?m$i~nj$q?GxdVE&Doy6G=ZFKF|c%cK3 z3sW`)vqW%#KFg-^D+5+5Y^!cG+x$c@>Oe=X;nIhLBRadw-T0OZGytuIg#lb)>PZhR zbzo~mm#_m#EI8>%(y!geX0?o96op_9bs^@}+q5fZnh(-G0pqP!B3W(>wN^9D^K^1R zL0$;9h%SICVo;<_!&Y)TTq7jBTC7%R{2^lrncO<2V7KQ;l+)C)-(mJEu~sX{1ew12 z1``a7ggvZQpV+`K@{c8<(}kJA_)`d)6&HPUHm^&wEBN=-W|78*6@;{?%zAS$EnUkO z{g54FG?t-{-*ED)Zs){!`NS@x)kW;@uVz(a(`@O&n-?%rims63m&1AdYV6Y0n#?0< z23@E}>PM_9G!cqcBf!ho(L?~jqnh@b*`#1AK*P=z!!R^D!3-`(1d!EkEUtBr&uJlC@kZqm=Ja3%qmtQ2ZMi^sC>aRr<* z`_8|efJNcBJWd~I&23ClGsIq&RY8qx;P96v_WCbP!Rl^1+M$8?vKMJ|lV=`#*MUdg zYFRZGOjC2i_tXU>IP-8F5c`H6OIa01hF;`?o(L8TA$sm}K#LjmW1Oncs%(q&NNglN z_rvR)wYgjD&HUPrvkFRX%kPiy#H36wTI}_{)2sa0_$)W;mf`2In`Mk+U|H%{saU}B z{gb(~i!tJ`z4;F^GRUH`*kezTdqVs2?z$Rhs{N;!;;$Ksm+9F)4w`+YYmnj#J;{LsO!f-NWdhI2lRcU+~8kx$rrZ2-=Rx!NcpjGclhiba&s|nmPtb zBwo=k%fUcSvCGjMhmh&avsJn!FN`?yc&%#%W0C8)PO%f|ebGS9tzZjh-l(i6l91W* zWS$iRhU_Ty-R;wK8(s;oBg)0)>b16cH8roUw2$_Y0txNW(&Y!^CWr0Xeg*W_bvpNr zwDkr#>e2$Hy_bAa@&LKHXIrXHYM#RScitlTys@;<$?HeT6aQ-@0mipm6DJlboOsa$ zK2V2X;UtWHRjdDE7HNqOYZieJRp9Bp|8^)wKhul%1paO5yhSE5|0S^f;{12gmRc|f zz%IX%;(iMcob2Y3S`O_UE))D`PsEDCLQ4MU5C7lmpV#&OS->gt|E&MK!~YzBz?{YT zn~;2~5BnE}33QLD;(U(ttP=}7^$M%M$Q+5Dd5(}Rzi}((Pu1(ji!5J*|BJdFcMPvCLqe<3y|)$6J}AASLKy~*|+=p+zIv&{J6 z_E>L$y|S0_s$#)9Cv*#2y1Zk?H~wOI9r&BV>ofoz;f(FH#Kj|jGI7zz2s{a+&_2)m z$5#1o^`%GrU)R@~7Klfj_!o?4WUm0HyEz@zc=&19xx*w1kecJt8h7FjFiKT(f!I4C z>gwIKa3B!xkzEE(r|cb+2t+^5mjG#|Epr@mc;kb8K)k7{RejtB#{c=}{d;xE&Z9FY zulGPiX9L3vy@#I;tMYKVPiEhN1U+Ny)YWr;VqIeTNc-Rd}jH}54+1W(TfX4-M4F4tUYS_w#J<1iUgm9B|qbkb5Y%CH@PSJwt zvvSyqiOG36Oynp1LA&3xj%Akg@k^cb|G#X&|9rB5>-T@we-YIG1tk7|A`<`KC_${K p*Rih?U+DZ#${_GqK=b&70y+wPVMTw_Gz0>cf~=}cHN-UJe*qSAblU&` literal 0 HcmV?d00001 diff --git a/documentation/manual.rst b/documentation/manual.rst new file mode 100644 index 00000000..5ab3dff9 --- /dev/null +++ b/documentation/manual.rst @@ -0,0 +1,2388 @@ +.. Grid documentation + +.. highlight:: cpp + +Welcome to Grid's documentation! +================================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +Preliminaries +==================================== + +Grid is primarily an *application* *development* *interface* (API) for structured Cartesian grid codes and written in C++11. +In particular it is aimed at Lattice Field Theory simulations in general gauge theories, but +with a particular emphasis on supporting SU(3) and U(1) gauge theories relevant to hadronic physics. + +Who will use this library +--------------------------- + +As an application development interface *Grid* is primarily a programmers tool providing the +building blocks and primitives for constructing lattice gauge theory programmes. + +Grid functionality includes: + +* Data parallel primitives, similar to QDP++ + +* gauge and fermion actions + +* solvers + +* gauge and fermion force terms + +* integrators and (R)HMC. + +* parallel field I/O + +* object serialisation (text, XML, JSON...) + +Grid is intended to enable the rapid and easy development of code with reasonably competitive performance. + +It is first and foremost a *library* to which people can programme, and develop new algorithms and measurements. +As such, it is very much hoped that peoples principle point of contact with Grid will be in +the wonderfully rich C++ language. Since import and export procedures are provided for the opaque lattice types +it should be possible to call Grid from other code bases. + +Grid is most tightly coupled to the Hadrons package +developed principally by Antonin Portelli. +This package is entirely composed against the Grid data parallel interface. + +Interfacing to other packages is also possible. + +Several regression tests that combine Grid with Chroma are included in the Grid distribution. +Further, Grid has been successfully interfaced to + +* The Columbia Physics System + +* The MILC code + + +Data parallel interface +---------------------------------------------------------------------------------- + +Most users will wish to interact with Grid above the data parallel *Lattice* interface. At this level +a programme is simply written as a series of statements, addressing entire lattice objects. + + +Implementation details may be provided to explain how the code works, but are not strictly part of the API. + +**Example** + + For example, as an implementation detail, in a single programme multiple data (SPMD) message passing supercomputer the main programme is trivially replicated on each computing node. The data parallel operations are called *collectively* by all nodes. Any scalar values returned by the various reduction routines are the same on each node, resulting in (for example) the same decision being made by all nodes to terminate an iterative solver on the same iteration. + + + +Internal development +------------------------------------------ +Internal developers may contribute to Grid at a level below the data parallel interface. + +Specifically, development of new lattice Dirac operators, for example, +or any codes directly interacting with the + +* Communicators + +* Simd + +* Tensor + +* Stencil + +will make use of facilities provided by to assist the creation of high performance code. The internal data layout complexities +will be exposed to some degree and the interfaces are subject to change without notice as HPC architectures change. + +Since some of the internal implementation details are needed to explain the design strategy of grid these will be +documented, but labelled as *implementation dependent* + +Reasonable endeavours will be made to preserve functionality where practical but no guarantees are made. + +Reporting Bugs +=================================== + +To help us tracking and solving more efficiently issues with Grid, please report problems using the issue system of GitHub rather than sending emails to Grid developers. + +When you file an issue, please go though the following checklist: + +* Check that the code is pointing to the HEAD of develop or any commit in master which is tagged with a version number. + +* Give a description of the target platform (CPU, network, compiler). Please give the full CPU part description, using for example cat /proc/cpuinfo | grep 'model name' | uniq (Linux) or sysctl machdep.cpu.brand_string (macOS) and the full output the --version option of your compiler. + +* Give the exact configure command used. + +* Attach config.log. + +* Attach grid.config.summary. + +* Attach the output of make V=1. + +* Describe the issue and any previous attempt to solve it. If relevant, show how to reproduce the issue using a minimal working example. + +Download, installation and build +========================================= + +Required libraries +---------------------------------------- + +* GMP, + +* MPFR + +* Eigen: bootstrapping grid downloads and uses for internal dense matrix (non-QCD operations) the Eigen library. + +Grid optionally uses: + +* HDF5 + +* LIME for ILDG and SciDAC file format support. + +* FFTW either generic version or via the Intel MKL library. + +* LAPACK either generic version or Intel MKL library. + + +Compilers +--------- + +* Intel ICPC v17 and later + +* Clang v3.5 and later (need 3.8 and later for OpenMP) + +* GCC v4.9.x + +* GCC v6.3 and later (recommended) + +**Important:** + +Some versions of GCC appear to have a bug under high optimisation (-O2, -O3). + +The safety of these compiler versions cannot be guaranteed at this time. Follow Issue 100 for details and updates. + +GCC v5.x + +GCC v6.1, v6.2 + +Quick start +------------ +First, start by cloning the repository:: + + git clone https://github.com/paboyle/Grid.git + +Then enter the cloned directory and set up the build system:: + + cd Grid + ./bootstrap.sh + +Now you can execute the `configure` script to generate makefiles (here from a build directory):: + + mkdir build; cd build + ../configure --enable-precision=double --enable-simd=AVX --enable-comms=mpi-auto \ + --prefix= + +where:: + + --enable-precision=single|double + +sets the **default precision**. Since this is largely a benchmarking convenience, it is anticipated that the default precision may be removed in future implementations, +and that explicit type selection be made at all points. Naturally, most code will be type templated in any case.:: + + --enable-simd=GEN|SSE4|AVX|AVXFMA|AVXFMA4|AVX2|AVX512|NEONv8|QPX + +sets the **SIMD architecture**, :: + + --enable-comms=mpi|none + +selects whether to use MPI communication (mpi) or no communication (none). :: + + --prefix= + +should be passed the prefix path where you want to install Grid. + +Other options are detailed in the next section, you can also use :: + + configure --help + +to display them. + +Like with any other program using GNU autotool, the :: + + CXX, CXXFLAGS, LDFLAGS, ... + +environment variables can be modified to customise the build. + +Finally, you can build, check, and install Grid:: + + make; + make check; + make install + + +If you want to build all the tests just use `make tests`. + +Detailed build configuration options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +======================================== ============================================================================================================================== + Option usage +======================================== ============================================================================================================================== + `--prefix=` installation prefix for Grid. + `--with-gmp=` look for GMP in the UNIX prefix `` + `--with-mpfr=` look for MPFR in the UNIX prefix `` + `--with-fftw=` look for FFTW in the UNIX prefix `` + `--with-lime=` look for c-lime in the UNIX prefix `` + `--enable-lapack[=]` enable LAPACK support in Lanczos eigensolver. A UNIX prefix containing the library can be specified (optional). + `--enable-mkl[=]` use Intel MKL for FFT (and LAPACK if enabled) routines. A UNIX prefix containing the library can be specified (optional). + `--enable-simd=` setup Grid for the SIMD target `` (default: `GEN`). A list of possible SIMD targets is detailed in a section below. + `--enable-gen-simd-width=` select the size (in bytes) of the generic SIMD vector type (default: 32 bytes). + `--enable-precision={single|double}` set the default precision (default: `double`). + `--enable-precision=` use `` for message passing (default: `none`). A list of possible SIMD targets is detailed in a section below. + `--enable-rng={sitmo|ranlux48|mt19937}` choose the RNG (default: `sitmo`). + `--disable-timers` disable system dependent high-resolution timers. + `--enable-chroma` enable Chroma regression tests. + `--enable-doxygen-doc` enable the Doxygen documentation generation (build with `make doxygen-doc`) +======================================== ============================================================================================================================== + + +Possible communication interfaces +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following options can be use with the `--enable-comms=` option to target different communication interfaces: + +=============== ========================================================================================== + Description +=============== ========================================================================================== + `none` no communications + `mpi` MPI communications with compiler CXX + `mpi-auto` MPI communications with compiler CXX but clone flags from MPICXX +=============== ========================================================================================== + +For the MPI interfaces the optional `-auto` suffix instructs the `configure` scripts to determine all the necessary compilation and linking flags. This is done by extracting the informations from the MPI wrapper specified in the environment variable `MPICXX` (if not specified `configure` will scan though a list of default names). The `-auto` suffix is not supported by the Cray environment wrapper scripts. Use the standard wrappers ( `CXX=CC` ) set up by Cray `PrgEnv` modules instead. + + +Possible SIMD types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following options can be use with the `--enable-simd=` option to target different SIMD instruction sets: + +============ ===================================================================================================================== + `` Description +============ ===================================================================================================================== + `GEN` generic portable vector code + `SSE4` SSE 4.2 (128 bit) + `AVX` AVX (256 bit) + `AVXFMA` AVX (256 bit) + FMA + `AVXFMA4` AVX (256 bit) + FMA4 + `AVX2` AVX 2 (256 bit) + `AVX512` AVX 512 bit + `NEONv8` [ARM NEON](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch07s03.html) (128 bit) + `QPX` IBM QPX (256 bit) +============ ===================================================================================================================== + +Alternatively, some CPU codenames can be directly used: + +============ ===================================================================================================================== + `` Description +============ ===================================================================================================================== + `KNL` [Intel Xeon Phi codename Knights Landing](http://ark.intel.com/products/codename/48999/Knights-Landing) + `SKL` [Intel Skylake with AVX512 extensions](https://ark.intel.com/products/codename/37572/Skylake#@server) + `BGQ` Blue Gene/Q +============ ===================================================================================================================== + +Notes +^^^^^^^ +* We currently support AVX512 for the Intel compiler and GCC (KNL and SKL target). Support for clang will appear in future + versions of Grid when the AVX512 support in the compiler is more advanced. +* For BG/Q only [bgclang](http://trac.alcf.anl.gov/projects/llvm-bgq) is supported. We do not presently plan to support more compilers for this platform. +* BG/Q performances are currently rather poor. This is being investigated for future versions. +* The vector size for the `GEN` target can be specified with the `configure` script option `--enable-gen-simd-width`. + +Build setup for Intel Knights Landing platform +--------------------------------------------------------------------------------------- + +The following configuration is recommended for the Intel Knights Landing platform:: + + ../configure --enable-precision=double\ + --enable-simd=KNL \ + --enable-comms=mpi-auto \ + --enable-mkl \ + CXX=icpc MPICXX=mpiicpc + +The MKL flag enables use of BLAS and FFTW from the Intel Math Kernels Library. + +If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use:: + + ../configure --enable-precision=double\ + --enable-simd=KNL \ + --enable-comms=mpi \ + --enable-mkl \ + CXX=CC CC=cc + +If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed:: + + --with-gmp= \ + --with-mpfr= + +where `` is the UNIX prefix where GMP and MPFR are installed. + +Knight's Landing with Intel Omnipath adapters with two adapters per node +presently performs better with use of more than one rank per node, using shared memory +for interior communication. This is the mpi3 communications implementation. +We recommend four ranks per node for best performance, but optimum is local volume dependent. :: + + ../configure --enable-precision=double\ + --enable-simd=KNL \ + --enable-comms=mpi3-auto \ + --enable-mkl \ + CC=icpc MPICXX=mpiicpc + +Build setup for Intel Haswell Xeon platform +--------------------------------------------------------------------------------------- + +The following configuration is recommended for the Intel Haswell platform:: + + ../configure --enable-precision=double\ + --enable-simd=AVX2 \ + --enable-comms=mpi3-auto \ + --enable-mkl \ + CXX=icpc MPICXX=mpiicpc + +The MKL flag enables use of BLAS and FFTW from the Intel Math Kernels Library. + +If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed:: + + --with-gmp= \ + --with-mpfr= + +where `` is the UNIX prefix where GMP and MPFR are installed. + +If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use:: + + ../configure --enable-precision=double\ + --enable-simd=AVX2 \ + --enable-comms=mpi3 \ + --enable-mkl \ + CXX=CC CC=cc + +Since Dual socket nodes are commonplace, we recommend MPI-3 as the default with the use of +one rank per socket. If using the Intel MPI library, threads should be pinned to NUMA domains using:: + + export I_MPI_PIN=1 + +This is the default. + +Build setup for Intel Skylake Xeon platform +---------------------------------------------------------------------------- + + +The following configuration is recommended for the Intel Skylake platform:: + + ../configure --enable-precision=double\ + --enable-simd=AVX512 \ + --enable-comms=mpi3 \ + --enable-mkl \ + CXX=mpiicpc + +The MKL flag enables use of BLAS and FFTW from the Intel Math Kernels Library. + +If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed:: + + --with-gmp= \ + --with-mpfr= \ + +where `` is the UNIX prefix where GMP and MPFR are installed. + +If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use:: + + ../configure --enable-precision=double\ + --enable-simd=AVX512 \ + --enable-comms=mpi3 \ + --enable-mkl \ + CXX=CC CC=cc + +Since Dual socket nodes are commonplace, we recommend MPI-3 as the default with the use of +one rank per socket. If using the Intel MPI library, threads should be pinned to NUMA domains using:: + + export I_MPI_PIN=1 + +This is the default. + +Build setup for AMD EPYC / RYZEN +---------------------------------------------------------------------------- + +The AMD EPYC is a multichip module comprising 32 cores spread over four distinct chips each with 8 cores. +So, even with a single socket node there is a quad-chip module. Dual socket nodes with 64 cores total +are common. Each chip within the module exposes a separate NUMA domain. +There are four NUMA domains per socket and we recommend one MPI rank per NUMA domain. +MPI-3 is recommended with the use of four ranks per socket, +and 8 threads per rank. + +The following configuration is recommended for the AMD EPYC platform:: + + + ../configure --enable-precision=double\ + --enable-simd=AVX2 \ + --enable-comms=mpi3 \ + CXX=mpicxx + +If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed:: + + --with-gmp= \ + --with-mpfr= + +where `` is the UNIX prefix where GMP and MPFR are installed. + +Using MPICH and g++ v4.9.2, best performance can be obtained using explicit GOMP_CPU_AFFINITY flags for each MPI rank. +This can be done by invoking MPI on a wrapper script omp_bind.sh to handle this. + +It is recommended to run 8 MPI ranks on a single dual socket AMD EPYC, with 8 threads per rank using MPI3 and +shared memory to communicate within this node:: + + mpirun -np 8 ./omp_bind.sh ./Benchmark_dwf --mpi 2.2.2.1 --dslash-unroll --threads 8 --grid 16.16.16.16 --cacheblocking 4.4.4.4 + +Where omp_bind.sh does the following:: + + #!/bin/bash + + numanode=` expr $PMI_RANK % 8 ` + basecore=`expr $numanode \* 16` + core0=`expr $basecore + 0 ` + core1=`expr $basecore + 2 ` + core2=`expr $basecore + 4 ` + core3=`expr $basecore + 6 ` + core4=`expr $basecore + 8 ` + core5=`expr $basecore + 10 ` + core6=`expr $basecore + 12 ` + core7=`expr $basecore + 14 ` + + export GOMP_CPU_AFFINITY="$core0 $core1 $core2 $core3 $core4 $core5 $core6 $core7" + echo GOMP_CUP_AFFINITY $GOMP_CPU_AFFINITY + + $@ + + +Build setup for laptops, other compilers, non-cluster builds +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Many versions of g++ and clang++ work with Grid, and involve merely replacing CXX (and MPICXX), +and omit the enable-mkl flag. + +Single node builds are enabled with:: + + --enable-comms=none + + +FFTW support that is not in the default search path may then enabled with:: + + --with-fftw= + +BLAS will not be compiled in by default, and Lanczos will default to Eigen diagonalisation. + + +Execution model +============================================ + +Grid is intended to support performance portability across a many of platforms ranging from single processors +to message passing CPU clusters and accelerated computing nodes. + +The library provides data parallel C++ container classes with internal memory layout that is transformed to map efficiently to SIMD architectures. CSHIFT facilities are provided, similar to HPF and cmfortran, and user control is given over the mapping of array indices to both MPI tasks and SIMD processing elements. + +Identically shaped arrays then be processed with perfect data parallelisation. +Such identically shaped arrays are called conformable arrays. +The transformation is based on the observation that Cartesian array processing involves identical processing to be performed on different regions of the Cartesian array. + +The library will both geometrically decompose into MPI tasks and across SIMD lanes. Local vector loops are parallelised with OpenMP pragmas. + +Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification for most programmers. + +The two broad optimisation targets are: + +* MPI, OpenMP, and SIMD parallelism + +Presently SSE4, ARM NEON (128 bits) AVX, AVX2, QPX (256 bits), and AVX512 (512 bits) targets are supported +with aggressive use of architecture vectorisation intrinsic functions. + +* MPI between nodes with and data parallel offload to GPU's. + +For the latter generic C++ code is used both on the host and on the GPU, with a common vectorisation +granularity. + +Accelerator memory model +---------------------------------------------- +For accelerator targets it is assumed that heap allocations can be shared between the CPU +and the accelerator. This corresponds to lattice fields having their memory allocated with +*cudaMallocManaged* with Nvidia GPU's. + +Grid does not assume that stack or data segments share a common address space with an accelerator. + +* This constraint presently rules out porting Grid to AMD GPU's which do not support managed memory. + +* At some point in the future a cacheing strategy may be implemented to enable running on AMD GPU's + +Data parallel API +===================================== + +Data parallel array indices are divided into two types. + +* Internal indices, such as complex, colour, spin degrees of freedom + +* spatial (space-time) indices. + +The ranges of all internal degrees are determined by template parameters, +and known at compile time. The ranges of spatial indices are dynamic, run time +values and the Cartesian structure information is contained and accessed via `Grid` objects. + +Grid objects are the controlling entity for the decomposition of a distributed `Lattice` +array across MPI tasks, nodes, SIMD lanes, accelerators. Threaded loops are used +as appropriate on host code. + +(binary) Data parallel operations can only be performed between Lattice objects constructed +from the same Grid pointer. These are called `conformable` operations. + +We will focus initially on the internal indices as these are the building blocks assembled +in Lattice container classes. Every Lattice container class constructor requires a Grid object +pointer. + +Tensor classes +---------------------------- + +The Tensor data structures are built up from fundamental +scalar matrix and vector classes:: + + template class iScalar { private: vobj _internal ; } + template class iVector { private: vobj _internal[N] ; } + template class iMatrix { private: vobj _internal[N] ; } + +These are template classes and can be passed a fundamental scalar or vector type, or +nested to form arbitrarily complicated tensor products of indices. All mathematical expressions +are defined to operate recursively, index by index. + +Presently the constants + +* Nc +* Nd + +are globally predefined. However, this is planned for changed in future and policy classes +for different theories (e.g. QCD, QED, SU2 etc...) will contain these constants and enable multiple +theories to coexist more naturally. + +Arbitrary tensor products of fundamental scalar, vector +and matrix objects may be formed in principle by the basic Grid code. + +For Lattice field theory, we define types according to the following tensor +product structure ordering. The suffix "D" indicates either double types, and +replacing with "F" gives the corresponding single precision type. + +======= ======= ====== ====== =========== ======================= +Lattice Lorentz Spin Colour scalar_type Field +======= ======= ====== ====== =========== ======================= +Scalar Scalar Scalar Scalar RealD RealD +Scalar Scalar Scalar Scalar ComplexD ComplexD +Scalar Scalar Scalar Matrix ComplexD ColourMatrixD +Scalar Vector Scalar Matrix ComplexD LorentzColourMatrixD +Scalar Scalar Vector Vector ComplexD SpinColourVectorD +Scalar Scalar Vector Vector ComplexD HalfSpinColourVectorD +Scalar Scalar Matrix Matrix ComplexD SpinColourMatrixD +======= ======= ====== ====== =========== ======================= + +The types are implemented via a recursive tensor nesting system. + +**Example** we declare:: + + template + using iLorentzColourMatrix = iVector >, Nd > ; + + typedef iLorentzColourMatrix LorentzColourMatrixD; + +Arbitrarily deep tensor nests may be formed. Grid uses a positional and numerical rule to associate indices for contraction +in the Einstein summation sense. + +============= ======= ======== +Symbolic name Number Position +============= ======= ======== +LorentzIndex 0 left +SpinIndex 1 middle +ColourIndex 2 right +============= ======= ======== + +The conventions are that the index ordering left to right are: Lorentz, Spin, Colour. A scalar type (either real +or complex, single or double precision) is be provided to the innermost structure. + + +Tensor arithmetic rules (lib/tensors/Tensor_arith.h) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Arithmetic rules are defined on these types + +The multiplication operator follows the natural multiplication +table for each index, index level by index level. + +`Operator *` + +== == == == +x S V M +== == == == +S S V M +V S S V +M M V M +== == == == + +The addition and subtraction rules disallow a scalar to be added to a vector, +and vector to be added to matrix. A scalar adds to a matrix on the diagonal. + +*Operator* + and *Operator* - + +=== == == == ++/- S V M +=== == == == +S S M +V V +M M M +=== == == == + +The rules for a nested objects are recursively inferred level by level from basic rules of multiplication +addition and subtraction for scalar/vector/matrix. Legal expressions can only be formed between objects +with the same number of nested internal indices. All the Grid QCD datatypes have precisely three internal +indices, some of which may be trivial scalar to enable expressions to be formed. + +Arithmetic operations are possible where the left or right operand is a scalar type. + +**Example**:: + + LatticeColourMatrixD U(grid); + LatticeColourMatrixD Udag(grid); + + Udag = adj(U); + + RealD unitary_err = norm2(U*adj(U) - 1.0); + +Will provide a measure of how discrepant from unitarity the matrix U is. + +Internal index manipulation (lib/tensors/Tensor_index.h) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +General code can access any specific index by number with a peek/poke semantic:: + + // peek index number "Level" of a vector index + template auto peekIndex (const vtype &arg,int i); + + // peek index number "Level" of a vector index + template auto peekIndex (const vtype &arg,int i,int j); + + // poke index number "Level" of a vector index + template + void pokeIndex (vtype &pokeme,arg,int i) + + // poke index number "Level" of a matrix index + template + void pokeIndex (vtype &pokeme,arg,int i,int j) + +**Example**:: + + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); + } + +Similar to the QDP++ package convenience routines are provided to access specific elements of +vector and matrix internal index types by physics name or meaning aliases for the above routines +with the appropriate index constant. + +* peekColour +* peekSpin +* peekLorentz + +and + +* pokeColour +* pokeSpin +* pokeLorentz + +For example, we often store Gauge Fields with a Lorentz index, but can split them into +polarisations in relevant pieces of code. + +**Example**:: + + for (int mu = 0; mu < Nd; mu++) { + U[mu] = peekLorentz(Umu, mu); + } + +For convenience, direct access as both an l-value and an r-value is provided by the parenthesis operator () on each of the Scalar, Vector and Matrix classes. +For example one may write + +**Example**:: + + ColourMatrix A, B; + + A()()(i,j) = B()()(j,i); + +bearing in mind that empty parentheses are need to address a scalar entry in the tensor index nest. + +The first (left) empty parentheses move past the (scalar) Lorentz level in the tensor nest, and the second +(middle) empty parantheses move past the (scalar) spin level. The (i,j) index the colour matrix. + +Other examples are easy to form for the many cases, and should be obvious to the reader. +This form of addressing is convenient and saves peek, modifying, poke +multiple temporary objects when both spin and colour indices are being accessed. +There are many cases where multiple lines of code are required with a peek/poke semantic which are +easier with direct l-value and r-value addressing. + +Matrix operations +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Transposition and tracing specific internal indices are possible using:: + + template + auto traceIndex (const vtype &arg) + + template + auto transposeIndex (const vtype &arg) + +These may be used as + +**Example**:: + + LatticeColourMatrixD Link(grid); + ComplexD link_trace = traceIndex (Link); + +Again, convenience aliases for QCD naming schemes are provided via + +* traceColour +* traceSpin + +* transposeColour +* transposeSpin + +**Example**:: + + ComplexD link_trace = traceColour (Link); + +The operations only makes sense for matrix and scalar internal indices. + +The trace and transpose over all indices is also defined for matrix and scalar types:: + + template + auto trace(const iMatrix &arg) -> iScalar + + template + auto transpose(const iMatrix &arg ) -> iMatrix + +Similar functions are: + +* conjugate +* adjoint + + +The traceless anti-Hermitian part is taken with:: + + template iMatrix + Ta(const iMatrix &arg) + +Reunitarisation (or reorthogonalisation) is enabled by:: + + template iMatrix + ProjectOnGroup(const iMatrix &arg) + +**Example**:: + + LatticeColourMatrixD Mom(grid); + LatticeColourMatrixD TaMom(grid); + + TaMom = Ta(Mom); + + +Querying internal index structure +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Templated code may find it useful to use query functions on the Grid datatypes they are provided. +For example general Serialisation and I/O code can inspect the nature of a type a routine has been +asked to read from disk, or even generate descriptive type strings:: + + //////////////////////////////////////////////////// + // Support type queries on template params: + //////////////////////////////////////////////////// + // int _ColourScalar = isScalar(); + // int _ColourVector = isVector(); + // int _ColourMatrix = isMatrix(); + template int isScalar(void) + template int isVector(void) + template int isMatrix(void) + +**Example** (lib/parallelIO/IldgIO.h):: + + template std::string ScidacRecordTypeString(int &colors, int &spins, int & typesize,int &datacount) { + + ///////////////////////////////////////// + // Encode a generic tensor as a string + ///////////////////////////////////////// + + typedef typename getPrecision::real_scalar_type stype; + + int _ColourN = indexRank(); + int _ColourScalar = isScalar(); + int _ColourVector = isVector(); + int _ColourMatrix = isMatrix(); + + int _SpinN = indexRank(); + int _SpinScalar = isScalar(); + int _SpinVector = isVector(); + int _SpinMatrix = isMatrix(); + + int _LorentzN = indexRank(); + int _LorentzScalar = isScalar(); + int _LorentzVector = isVector(); + int _LorentzMatrix = isMatrix(); + + std::stringstream stream; + + stream << "GRID_"; + stream << ScidacWordMnemonic(); + + if ( _LorentzVector ) stream << "_LorentzVector"<<_LorentzN; + if ( _LorentzMatrix ) stream << "_LorentzMatrix"<<_LorentzN; + + if ( _SpinVector ) stream << "_SpinVector"<<_SpinN; + if ( _SpinMatrix ) stream << "_SpinMatrix"<<_SpinN; + + if ( _ColourVector ) stream << "_ColourVector"<<_ColourN; + if ( _ColourMatrix ) stream << "_ColourMatrix"<<_ColourN; + + if ( _ColourScalar && _LorentzScalar && _SpinScalar ) stream << "_Complex"; + + typesize = sizeof(typename vobj::scalar_type); + + if ( _ColourMatrix ) typesize*= _ColourN*_ColourN; + else typesize*= _ColourN; + + if ( _SpinMatrix ) typesize*= _SpinN*_SpinN; + else typesize*= _SpinN; + + }; + +Inner and outer products +^^^^^^^^^^^^^^^^^^^^^^^^^ + +We recursively define (tensors/Tensor_inner.h), ultimately returning scalar in all indices:: + + ///////////////////////////////////////////////////////////////////////// + // innerProduct Scalar x Scalar -> Scalar + // innerProduct Vector x Vector -> Scalar + // innerProduct Matrix x Matrix -> Scalar + ///////////////////////////////////////////////////////////////////////// + template + auto innerProductD (const iScalar& lhs,const iScalar& rhs) + + template + auto innerProductD (const iVector& lhs,const iVector& rhs) + + template + auto innerProductD (const iMatrix& lhs,const iMatrix& rhs) + + template + auto innerProduct (const iScalar& lhs,const iScalar& rhs) + + template + auto innerProduct (const iVector& lhs,const iVector& rhs) + + template + auto innerProduct (const iMatrix& lhs,const iMatrix& rhs) + +The sum is always performed in double precision for the innerProductD variant. + +We recursively define (tensors/Tensor_outer.h):: + + ///////////////////////////////////////////////////////////////////////// + // outerProduct Scalar x Scalar -> Scalar + // Vector x Vector -> Matrix + ///////////////////////////////////////////////////////////////////////// + template + auto outerProduct (const iScalar& lhs,const iScalar& rhs) + + template + auto outerProduct (const iVector& lhs,const iVector& rhs) + + +Functions of Tensor +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following unary functions are defined, which operate element by element on a tensor +data structure:: + + sqrt(); + rsqrt(); + sin(); + cos(); + asin(); + acos(); + log(); + exp(); + abs(); + Not(); + toReal(); + toComplex(); + +Element wise functions are defined for:: + + div(tensor,Integer); + mod(tensor,Integer); + pow(tensor,RealD); + +Matrix exponentiation (as opposed to element wise exponentiation is implemented via power series in:: + + Exponentiate(const Tensor &r ,RealD alpha, Integer Nexp = DEFAULT_MAT_EXP) + +the exponentiation is distributive across vector indices (i.e. proceeds component by component for a LorentzColourMatrix). + +Determinant is similar:: + + iScalar Determinant(const Tensor &r ) + +Vectorisation +-------------- + +Internally, Grid defines a portable abstraction SIMD vectorisation, via the following types: + +* vRealF + +* vRealD + +* vComplexF + +* vComplexD + +These have the usual range of arithmetic operators and functions acting upon them. They do not form +part of the API, but are mentioned to (partially) explain the need for controlling the +layout transformation in lattice objects. + +They are documented further in the Internals chapter. + +Coordinates +------------ + +The Grid is define on a N-dimensional set of integer coordinates. + +The maximum dimension is eight, and indexes in this space make use of the Coordinate class. +The coordinate class shares a similar interface to `std::vector`, but contains all data within the +object, and has a fixed maximum length (template parameter). + +**Example**:: + + const int Nd=4; + Coordinate point(Nd); + + for(int i=0;i using iSpinMatrix = iScalar, Ns> >; + typedef iSpinMatrix SpinMatrixF; //scalar + typedef iSpinMatrix vSpinMatrixF;//vectorised + typedef Lattice LatticeSpinMatrixF; + +The full range of QCD relevant lattice objects is given below. + +======= ======= ====== ====== =========== ============================= ===================== +Lattice Lorentz Spin Colour scalar_type Field Synonym +======= ======= ====== ====== =========== ============================= ===================== +Vector Scalar Scalar Scalar RealD LatticeRealD N/A +Vector Scalar Scalar Scalar ComplexD LatticeComplexD N/A +Vector Scalar Scalar Matrix ComplexD LatticeColourMatrixD LatticeGaugeLink +Vector Vector Scalar Matrix ComplexD LatticeLorentzColourMatrixD LatticeGaugeFieldD +Vector Scalar Vector Vector ComplexD LatticeSpinColourVectorD LatticeFermionD +Vector Scalar Vector Vector ComplexD LatticeHalfSpinColourVectorD LatticeHalfFermionD +Vector Scalar Matrix Matrix ComplexD LatticeSpinColourMatrixD LatticePropagatorD +======= ======= ====== ====== =========== ============================= ===================== + +Additional single precison variants are defined with the suffix "F". +Other lattice objects can be defined using the sort of typedef's shown above if needed. + +Opaque containers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The layout within the container is complicated to enable maximum opportunity for vectorisation, and +is opaque from the point of view of the API definition. The key implementation observation is that +so long as data parallel operations are performed and adjacent SIMD lanes correspond to well separated +lattice sites, then identical operations are performed on all SIMD lanes and enable good vectorisation. + +Because the layout is opaque, import and export routines from naturally ordered x,y,z,t arrays +are provided (lib/lattice/Lattice_transfer.h):: + + unvectorizeToLexOrdArray(std::vector &out, const Lattice &in); + vectorizeFromLexOrdArray(std::vector &in , Lattice &out); + +The Lexicographic order of data in the external vector fields is defined by (lib/util/Lexicographic.h):: + + Lexicographic::IndexFromCoor(const Coordinate &lcoor, int &lex,Coordinate *local_dims); + +This ordering is :math:`x + L_x * y + L_x*L_y*z + L_x*L_y*L_z *t` + +Peek and poke routines are provided to perform single site operations. These operations are +extremely low performance and are not intended for algorithm development or performance critical code. + +The following are `collective` operations and involve communication between nodes. All nodes receive the same +result by broadcast from the owning node:: + + void peekSite(sobj &s,const Lattice &l,const Coordinate &site); + void pokeSite(const sobj &s,Lattice &l,const Coordinate &site); + +The following are executed independently by each node:: + + void peekLocalSite(sobj &s,const Lattice &l,Coordinate &site); + void pokeLocalSite(const sobj &s,Lattice &l,Coordinate &site); + +Lattices of one tensor type may be transformed into lattices of another tensor type by +peeking and poking specific indices in a data parallel manner:: + + template // Vector data parallel index peek + auto PeekIndex(const Lattice &lhs,int i); + + template // Matrix data parallel index peek + auto PeekIndex(const Lattice &lhs,int i,int j); + + template // Vector poke + void PokeIndex(Lattice &lhs,const Lattice<> & rhs,int i) + + template // Matrix poke + void PokeIndex(Lattice &lhs,const Lattice<> & rhs,int i,int j) + +The inconsistent capitalisation on the letter P is due to an obscure bug in g++ that has not to +our knowledge been fixed in any version. The bug was reported in 2016. + +Global Reduction operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Reduction operations for any lattice field are provided. The result is identical on each computing node +that is part of the relevant Grid communicator:: + + template + RealD norm2(const Lattice &arg); + + template + ComplexD innerProduct(const Lattice &left,const Lattice &right); + + template + vobj sum(const Lattice &arg) + +Site local reduction operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Internal indices may be reduced, site by site, using the following routines:: + + template + auto localNorm2 (const Lattice &rhs) + + template + auto localInnerProduct (const Lattice &lhs,const Lattice &rhs) + +Outer product +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A site local outer product is defined:: + + template + auto outerProduct (const Lattice &lhs,const Lattice &rhs) + + +Slice operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Slice operations are defined to operate on one lower dimension than the full lattice. The omitted dimension +is the parameter orthogdim:: + + template + void sliceSum(const Lattice &Data, + std::vector &result, + int orthogdim); + + template + void sliceInnerProductVector( std::vector & result, + const Lattice &lhs, + const Lattice &rhs, + int orthogdim); + + template + void sliceNorm (std::vector &sn, + const Lattice &rhs, + int orthogdim); + +Data parallel expression template engine +------------------------------------------ + +The standard arithmetic operators and some data parallel library functions are implemented site by site +on lattice types. + +Operations may only ever combine lattice objects that have been constructed from the **same** grid pointer. + +**Example**:: + + LatticeFermionD A(&grid); + LatticeFermionD B(&grid); + LatticeFermionD C(&grid); + + A = B - C; + +Such operations are said to be **conformable** and are the lattice are guaranteed to have the same dimensions +and both MPI and SIMD decomposition because they are based on the same grid object. The conformability check +is lightweight and simply requires the same grid pointers be passed to the lattice objects. The data members +of the grid objects are not compared. + +Conformable lattice fields may be combined with appropriate scalar types in expressions. The implemented +rules follow those already documented for the tensor types. + + + + +Unary operators and functions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following sitewise unary operations are defined: + +===================== ============================================ +Operation Description +===================== ============================================ +operator- negate +adj Hermitian conjugate +conjugate complex conjugate +trace sitewise trace +transpose sitewise transpose +Ta take traceles anti Hermitian part +ProjectOnGroup reunitarise or orthogonalise +real take the real part +imag take the imaginary part +toReal demote complex to real +toComplex promote real to complex +timesI elementwise +i mult (0 is not multiplied) +timesMinusI elementwise -i mult (0 is not multiplied) +abs elementwise absolute value +sqrt elementwise square root +rsqrt elementwise reciprocal square root +sin elementwise sine +cos elementwise cosine +asin elementwise inverse sine +acos elementwise inverse cosine +log elementwise logarithm +exp elementwise exponentiation +operator! Logical negation of integer field +Not Logical negation of integer field +===================== ============================================ + + + +The following sitewise applied functions with additional parameters are:: + + template Lattice pow(const Lattice &rhs_i,RealD y); + + template Lattice mod(const Lattice &rhs_i,Integer y); + + template Lattice div(const Lattice &rhs_i,Integer y); + + template Lattice + expMat(const Lattice &rhs_i, RealD alpha, Integer Nexp = DEFAULT_MAT_EXP); + +Binary operators +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following binary operators are defined:: + + operator+ + operator- + operator* + operator/ + +Logical are defined on LatticeInteger types:: + + operator& + operator| + operator&& + operator|| + + +Ternary operator, logical operatons and where +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Within the data parallel level of the API the only way to perform operations +that are differentiated between sites is use predicated execution. + +The predicate takes the form of a LatticeInteger which is confromable with both +the iftrue and iffalse argument:: + + template void where(const Lattice &pred, + Lattice &iftrue, + Lattice &iffalse); + +This plays the data parallel analogue of the C++ ternary operator:: + + a = b ? c : d; + +In order to create the predicate in a coordinate dependent fashion it is often useful +to use the lattice coordinates. + +The LatticeCoordinate function:: + + template LatticeCoordinate(Lattice &coor,int dir); + +fills an Integer field with the coordinate in the N-th dimension. +A usage example is given + +**Example**:: + + int dir =3; + int block=4; + LatticeInteger coor(FineGrid); + + LatticeCoordinate(coor,dir); + + result = where(mod(coor,block)==(block-1),x,z); + +(Other usage cases of LatticeCoordinate include the generation of plane wave momentum phases.) + +Site local fused operations +------------------------------------------ + +The biggest limitation of expression template engines is that the optimisation +visibility is a single assignment statement in the original source code. + +There is no scope for loop fusion between multiple statements. +Multi-loop fusion gives scope for greater cache locality. + +Two primitives for hardware aware parallel loops are provided. +These will operate directly on the site objects which are expanded by a factor +of the vector length (in our struct of array datatypes). + +Since the mapping of sites +to data lanes is opaque, these vectorised loops +are *only* appropriate for optimisation of site local operations. + + +View objects +^^^^^^^^^^^^^^ + +Due to an obscure aspect of the way that Nvidia handle device C++11 lambda functions, +it is necessary to disable the indexing of a Lattice object. + +Rather, a reference to a lattice object must be first obtained. + +The reference is copyable to a GPU, and is able to be indexed on either accelerator code, +or by host code. + +In order to prevent people developing code that dereferences Lattice objects in a way that +works on CPU compilation, but fails on GPU compilation, we have decided to remove the ability +to index a lattice object on CPU code. + +As a result of Nvidia's constraints, all accesses to lattice objects are required to be made +through a View object. + +In the following, the type is LatticeView, however it is wise to use the C++11 auto keyword +to avoid naming the type. See code examples below. + + +thread_loops +^^^^^^^^^^^^^^ + +The first parallel primitive is the thread_loop + +**Example**:: + + LatticeField r(grid); + LatticeField x(grid); + LatticeField p(grid); + LatticeField mmp(grid); + auto r_v = r.View(); + auto x_v = x.View(); + auto p_v = p.View(); + auto mmp_v = mmp.View(); + thread_loop(s , r_v, { + r_v[s] = r_v[s] - a * mmp_v[s]; + x_v[s] = x_v[s] + a*p_v[s]; + p_v[s] = p_v[s]*b + r_v[s]; + }); + +accelerator_loops +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The second parallel primitive is an accelerated_loop + +**Example**:: + + LatticeField r(grid); + LatticeField x(grid); + LatticeField p(grid); + LatticeField mmp(grid); + auto r_v = r.View(); + auto x_v = x.View(); + auto p_v = p.View(); + auto mmp_v = mmp.View(); + accelerator_loop(s , r_v, { + r_v[s] = r_v[s] - a * mmp_v[s]; + x_v[s] = x_v[s] + a*p_v[s]; + p_v[s] = p_v[s]*b + r_v[s]; + }); + + + +Cshift +^^^^^^^^^^ + +Site shifting operations are provided using the Cshift function:: + + template + Lattice Cshift(const Lattice &rhs,int dimension,int shift) + +This shifts the whole vector by any distance shift in the appropriate dimension. + +For the avoidance of doubt on direction conventions,a positive shift moves the +lattice site :math:`x_\mu = 1` in the rhs to :math:`x_\mu = 0` in the result. + +**Example** (benchmarks/Benchmark_wilson.cc):: + + { // Naive wilson implementation + ref = Zero(); + for(int mu=0;mu + Lattice CovShiftForward(const Lattice &Link, int mu, + const Lattice &field); + + template + Lattice CovShiftBackward(const Lattice &Link, int mu, + const Lattice &field); + + +Boundary conditions +^^^^^^^^^^^^^^^^^^^^ + +The covariant shift routines occur in namespaces PeriodicBC and ConjugateBC. The correct covariant shift +for the boundary condition is passed into the gauge actions and wilson loops via an +"Impl" template policy class. + +The relevant staples, plaquettes, and loops are formed by using the provided method:: + + Impl::CovShiftForward + Impl::CovShiftBackward + +etc... This makes physics code transform appropriately with externally supplied rules about +treating the boundary. + +**Example** (lib/qcd/util/WilsonLoops.h):: + + static void dirPlaquette(GaugeMat &plaq, const std::vector &U, + const int mu, const int nu) { + // ___ + //| | + //|<__| + plaq = Gimpl::CovShiftForward(U[mu],mu, + Gimpl::CovShiftForward(U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu, + Gimpl::CovShiftIdentityBackward(U[nu], nu)))); + } + +Inter-grid transfer operations +----------------------------------------------------- + +Transferring between different checkerboards of the same global lattice:: + + template + void pickCheckerboard(int cb,Lattice &half,const Lattice &full); + + template + void setCheckerboard(Lattice &full,const Lattice &half); + +These are used to set up Schur red-black decomposed solvers, for example. + +Multi-grid projection between a fine and coarse grid:: + + template + void blockProject(Lattice > &coarseData, + const Lattice &fineData, + const std::vector > &Basis); + +Multi-grid promotion to a finer grid:: + + template + void blockPromote(const Lattice > &coarseData, + Lattice &fineData, + const std::vector > &Basis) + + +Support for subblock Linear algebra:: + + template + void blockZAXPY(Lattice &fineZ, + const Lattice &coarseA, + const Lattice &fineX, + const Lattice &fineY) + + template + void blockInnerProduct(Lattice &CoarseInner, + const Lattice &fineX, + const Lattice &fineY) + + template + void blockNormalise(Lattice &ip,Lattice &fineX) + + template + void blockSum(Lattice &coarseData,const Lattice &fineData) + + template + void blockOrthogonalise(Lattice &ip,std::vector > &Basis) + +Conversion between different SIMD layouts:: + + template + void localConvert(const Lattice &in,Lattice &out) + +Slices between grid of dimension N and grid of dimentions N+1:: + + template + void InsertSlice(const Lattice &lowDim,Lattice & higherDim,int slice, int orthog) + + template + void ExtractSlice(Lattice &lowDim,const Lattice & higherDim,int slice, int orthog) + +Growing a lattice by a multiple factor, with periodic replication:: + + template + void Replicate(Lattice &coarse,Lattice & fine) + +That latter is useful to, for example, pre-thermalise a smaller volume and then grow the volume in HMC. +It was written while debugging G-parity boundary conditions. + +Input/Output facilities +--------------------------------------------- + + + + +Random number generators +========================================= + +Grid provides three configure time options for random the number generator engine. + +* sitmo +* ranlux48 +* mt19937 + +The selection is controlled by the --enable-rng=

    rcxMe+&_-IP^UiAmOq`gB*^8|lFO$| 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�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 d! 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%0DKo>N>sB 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

    ZBPI!cIR=}j)BrNjZ9T^O*u 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 jlqZ}LGFEZ76r-!3MkeN@d-PjM8s|NS@7myj zso98=HYsV6C0X_gfnS9962I*wB~4gTc}23QSYJIaNPLyCfL#I)8{#s4{1qil@+6BH zgonC>+s|Ty3A{FW`b-9?T;TAwA4kH^cRE1geUkIbSrq3&#a9t?9RoEgRXkr{2}C~b zykg5hY*M=!MCkN?TIc68o z73hzSLuSFDn;>&RUHu-{_;N@|;h|B!CLY;DNEo=YFN=PsHti}&>v7^K%$IF5t}^1_=IHT-L`1$8`eE=g3;D?d*5o~UT8 zGXR;H2v}wu%Pj}X*WgS#;{&3;hQOg2j}yip%$vpTqsxv!13^6lG{4zw9+e|IP0HhB zl!IEt0=pN2IN`=;l{a|XaPw)#G3ww&gGpZ{aQjBKm>}&#w%5t9g_fkcujh_m37vsG zk)Z!vA0)$=o**A4@0=Y$?coM@4e>f&2|hCH(&f0+^JJK^gX^=zMc5@QBB0y zGM$}dn5%IgSV&(2CyJA5J0)>76EEUYFDYrvlD^^6rx9Wc6{NybQz0EStZeGBBhYeO z)6oR38%M3xzy`S>hx_ zHy1Cx+C-6b%%u&w;@7ASslC>wu1PxK(q=os4K%V8L=v*$-Kwr|&-v)9M3t$TY7@We zgVyFDG1)?+o+Qk__<03sjR)8oH4k;|rKrxSktM433Y`Y8EDfI08c)yNV8~{JkpiLf z3D0+l;rT+#7D+k@QhpFO15ZrsaP6(w;wVTyPUJaGmaS(YL&>u8dVo9`jV4d|KJu>2 z#++qDBBTPhx#rB>*w%q(=Q;Imncm)h8vNN$1_Mz5Tx>*J#J7BLbBT=kg%#xGG-BafN<#1la*1?el#Ai;!4i^d<^77r+v zoPNg4ZybJayGLG3sqEwTB_pK-b|Qf=8JKH7?D8 zm!h?(K`l|}e8TJ9W^k_1vL%uR6yM}{f~Q`Ik!kV^Ti0^JiJ3sTL*T#XY`1vMm~GCO zyc;+opcBCw-$f3~r;aQm(pZ(Myto&rDrP+0PNB*yquwuXiuTjs&we$qDP}oq+%9Si zkFM95e1qg;FCSo&k9|2beyey$fm25f$A$)daKQbfhA**(6H0^r7$5`Zx0Sj`Qq;i0 z+`tOmV9uq1(@KL+fwiH*PaPis+La4OvD31nYx68&#z5&sLTxbmSo)b+p4A1DS_JUCOoMl%<^yYHi@n<5(YN6}h=9%wp3s_?Ouj_& zaU^H4rkWnkJpAzC=1EZ3`%;U$fiex=b=qq7_Zv5>2DBRu`h$VqtU-?{I5an)9c$1p z3yhx)dU?HJZ-ibl4H}S}O(x$W`8biI;<`cPs^)^pQRmj+xHN3uHh2kakmsOz&E$Ac zXz&EltS~tmks1uHZrI7Qxgz-_lCxo#z8Ae;CiG&iFtlIr+u71kNIMpj|H$jfRg|_f z-_4e5ss`Fqs0Y;;Z;I9ETfY^01uo6(U72Gtb}YGsO_ZV_OARvj+W5K)2pFd&dk^u~1&@?3+B8q7p0$j5+tWBbot;vj z2&+I`n}uxSmEl}|GNmrru(sXUYxq^nPiwd$zcz;@5-N1VmdhGpnxL z+>@*-b7U+}W4kgw$)~X@PUAfLA8bAPBeMOPr5BZPctX-|y&n4=Nyl7T517uZhUX#}bfjPt!@&p>@A+GydlU&BGHhN@~*BESMv zLoGGvE$h<03rqkj5PZ2}dlWAn=;H0w{Y_V<1++7{3EkBfNl>$FvRqyL8m~-Ylvaw> zrP&(P#n)Dq9F!G!y01~AUweIleqWp)cstYV$pbrPk}o}OfIX-I-E)IGNfnVZzw zct?y){mp8*CyRN-KzDw`J7$u(D)(t2FI&}=U)Frk7+WG)fEx8dH#<;MJ5UieD5?i% zWj$1n5`43Bp>?cHER2sP_v-9WWklMRSB0&LYQn+ohbodSYn2Z{WUXT1jx1}Jm+P(N`$W7C#5|g`ejE?n>%s!p79eoESteA2~t$maDT7ibX~*Yq(+Mw9G~i|z+Gjp z2}rM9Fj68fVa+cTN(>l2^Q`rwfprWwv4>IC$K_S5kaKRJQrHyr`zY&vxza*TH0Rgo z>{DOx1XLK*sF0{Hc{f->EL5e*CoDl)rSucj)IQ}U`p|HGptUrvZPdpBdpgQ#vroOW z)u6(u;UrSS6|cU|j-w9-`VS|@{rvd4SnkB3>|Y0}zrrI-p8vXB{XlkA9#Z><$g`^f z`r~qbw(t+F)%mh-d;HOqJ4Aikb>Dul52js5dcIBGwD{wvzc}^Yb?Y6#&Z)=K+E%l+ z-E^$5vvY1*+xpucE$r&{b=qsT0|$cqY++Z)>uHtU_Ha?7^W}biB}Ag-!uO4Y3w55o z8CW@LEHwQ}NM_6dRSkyl%7=*$>w4LKQ_O4mpSKw^v`<3oqC&%j+K!VfH#Ayl;$6&a zfQ;8T4pXu;=i-zRjCwD!hmgB9jW zp~LVUYh()nJ)4G4QG>IM9#G+GxDjiNFn|lK#?2UxG&-3g7XwxzB*i|9XQAFI+n$Pf zEz3FHF4g<^nRvxic*Rs7h7VVPm>q-8Kl82oWMFa}+&3?O<2+xd=BX|zC_D*sEH{*qiSdrc|F*BhvjNw#ixV)VQRO4FhpZ< zI?y0ed6sG-WgxE#)ifsqRYe+4kB-Fl@c_g`H1m5yjj9G~qSFPh3N=QbhpOU+CJ!PN z8pZIcNCCAw^m<`ai>e`72wo4)`88gRSp|w~nBK;ZJIc9JUdEEF`3|PpBF^=$XrR~o z$v1u$s7QETj08=>M)dhW#TZHYImx_Nt{B0)cayDgKqrZ~8tP3_@t5)nR?KT-`O)b^ z$AL*2&HftwMD%%_gf?1@#w;C2JL@A#n&e67lc&(8rji(+c}kkFB)8{krf_5EYqUZ5 zI2g0hgqbrf+i^J??le0g+x5Ux(|o4`vk);%zJz@9<#`=tD+d5dP-G)rG}1vM!Lj`6 znWoY8^xc3n9|k2acn<69!JSCLHA#X7UZN*iGwo`qp+*g=WQ`$-SLr!ZFO)m^0dD@; zu~a`C=!vUZ>@`x?9|?AZHL zs!CLxgs#Z1Apyye2J6x6l=>nqC$G(3M0jO*np>DsSET6lSd`q;AmCn_k->A})V767 zQe2x=(ecXge0epku5c0bxSjmQ8!$rY#Ckbx5C-b9_g!8Uej~^EZd{Nwy5WGl6t^o37F(=|E$w+Z0n}Nq$+@&b11@=IL zntZ_%mWa)M;@Rve!IIe{4u!np3D=Y`W(kF>?A!9XVAsl(WDl;2Yfdq*{94Y7G5iZj z-q!<-C}w_Mo-t%KOftVKPM0KaImlPzF&39!R4Tq6zQTYtS>rs%>%sE0jYA^mJ;qsq z5mzo}pTx(3-oWkeUH%DuDEIVG_E!Vd;}-io&%a!*zMP#cg4N(6m@Qklsml-3)<8Y5 z1m+8>?c2B0*5}BhZ2HQD!)5MJ)0R{@SY5uT+M~L_8%5(<~dzN|>Ws)9C-U zbQG;kP)%0}AXlhWTUA}HJFVc$t=rnj8~ux@8GarSMpxHDRHCym z|Nd9kRJB=ufT}_OrGro{gg~?vr1Zk9*>(Smh%l<&9II;uCk6{WZ+|tWZ%xg?P3UqA|ARz)*&x>f;8 zKno`h1rGuilD8$0^`my)f7^`kM}s(`n`EY@bs8*{i) zK#gJgsrp5P5kHTf!(=p*);!&=0Pa@9_V5k+b|v5({De)0J-QO!B{g(7`O+8orIDG3DA0wyL_-<~!-( zTS-Vv%zy}B^{~CuI&*w<1Ryqk;FY8NK=KdH_Tjyl>i%rfsvY3&Kcsh=!XdNPU>zIgR zn1Unc!YI&Y5LRno=pgU*5;q4~xtvG5Yma4-kk5iQd>LhR2LfCVb>X-az-Q= z6HkIMN*E}{o`GT%VO*mF8qrob+gD2VF&ZSz7!9&Wj0UME$b?a%xhN7`5ZwejI3QYz zW1pCHL-)3vX~Hrk#7?lKAiI+#c6uB&+)<8`f?Nf}K>gRBpuL8^$+APdNdvq403 z9wQbZkiMuykWcxTW5-ysi9*gX%Xv#n670js+JR&p$kDOySUZrc1DQOI9b*UL>Fd`7 zo^Qz&B5JOcY?~}maSW1h3{zs{loSQ_iebi#DO?#v<_gd1fWvNu#g(Z5R2F-(P# z(@PYXD5fxFOyS5V(olFR53Jq_i!bPzG!VLejtUQOXbjU@2CKp#EuYi;o$b>;01+F=k z2m?W>h{(g!R-iwee&K{UyMrfqLS)ItA8m4yiXsCm{MS9#-oA>yIn z#1@|I!qUaKCUN41$a!KeYm=jKaI^!tcgEMe%-nE)B3BGD#1LJ9o3tq>Op#%w$Q9u! zN;tQKCk)~AD4sI~7YcFcgx3Szkq?n$O^ApxqB56xnJeBM(~bzZ$v^TK@0tiKES<#@ z2ihK3EI?g>bQBmmj=7fD5kb7qjtC{Hib0-=VUmiR8=}A=ks@FV$G3sJ8PR!6l<6); z42Qo&IpNarelG>XEqBL8O(~N!Wr(PPl82}&C^;pPa1E&v)(L-5A0oGyLO(Go5k8Cv z5I^FENIDv+DLh%lvSX|ungVL-0A&TG4$)RPH}8~l!pR3HEnM;t2gPWR7=lt#LW|KL zUBqaRpTVVk$VeTESVx}x0+fY;6CVrM%Bb9EOo)9nS<(@zn0RpYlqKGFpjI#_BN2xgSQvm%^wgM#M%@TUD6T zg%Lx8rI>K7ups|6UZU$^trn7IG`oRz!!>7zSRVpy#i&F)F)DFBj7sznqY~@H$dW^3 zw{zl(aJv!`FhKb+YogL5oH$|msPobBDj<`Ha$SjxKiPvZa9DisClAQ5TAsKhQpd>e(19rKPwjsz$_;SJm+;n)dpak{|JxzED)|CDP@E^T?{f)OyQ0gmDn0a zgl8WSJ0u;Ayb_*iV%O145X%5Hb%1YzQinJv+>v<{S#vQdl% z$sR_7^a?KJIOAj}o-RCd1rjBALW_vgWr)XOG@Zs`G{848n$A-(x`B0KG{_M#D)U&3 z2KgpjRXO{DOF7CI7>3UljwAwEbZWPSrlb&~j1yv%Q8J8j;)W4XoiN^r5m8Ch2=+q! z3L{6aVEG|jD+r+5idab zu_qKEDhS9w@l+GUKT&wO34b|av9Kf+?ionM0OcpF$@+kVV<#-WF_NJm4~lw*fd6hv zqzopb65~gi#KAFpaK?vGi5i5+G723#<{gXd1W8%0V3&m_V45BT?$;`~!! z3wJ-mu3)Zhpo44Pl=|F`lMAqk>v)^j@vc-y#p_`1bkvHNg`nIHicqC!AzsDXQWfuR zoC*o6#RCt5|IlN^KMr3|##=Ee(^ibitQDg&DMmc?5>5?g`6G@B&bQ!67;qD4oZ=Qq z4bt_@6o-P>ZaqU%ge()@3tcmorU#rt+45;&Ie1n!T$I z5BUwQla1TKkk|l51S++h?-^{n`w*CCC_aRFo#N~v4(A+0-kBSMk1Caq;ow6Jmg4}1 z9-8&g2~l^^;C;M#ls$`owb7%VlpggoYpkl`Z#H_}C;96>oiYUXJ;c7HI&g1rpN3$< zhX9pT4eETG%j~tPXbhOYFg_)P`Uir5Y!sXL#hCZ9ufx|H)nR!zU>wGL98g)(pbn{d zoIb6I+8aG?ir)i5`_}V`V zyv9;qC^X4o-;Y^`c$oZ&gUK%+x>p>2H^HX6I`QmLi^Y4SjM^O0~gf`S*c?e)O!iVb>%BYKI@QmLy*|Tci*bvfzy^w;p z0+@XEvLabkLwJd+!_~@aD6gu*gSuNZefI`}hG4>n02Qb;Dv0ZM*=q^*S}b-3pOHcg zuQW1WquThjSR4=4;cJa*uyhA724g-3c)4uQP|&pLv)X9Bu-GH)hbXcMpVj59RdH)s zB$Tg%qXWA-Zi8YFh&IkW$Htxq9lvrQ*Out-EIU;E|2Yi#6&LX&b}_Yw?zc}3m#;La9d+Z9JGfwrr( z^K(Oha~L?N^D6tC;}w-HG4PONiK(yi6*c~v*)m7v<7Lj*U;+1GHbS%Joeei()^9|pWn)@a_U7t*Ii`&zVoLsulr zcl{`DZM3iPEyR{jwh*e}77MDytKIi#!-3A?IA%SHMiQAStecP}ws3kl8;w$<%F7Ea z>jL(SeBgw5NLA?SqFm&P+9%BXt75FfestRT)`Pz}Kb)p_#A=VBevs4AB3o+m1t6y zP9;`AX&+gTbI3p8Z-feZg?1A)9DPB+#R2Tu6}Mnecpy<;$7`*?NItE|abKyol|foUBh-`+sOnI+qNdQZQHhO+xEmZCbn(cy8k@i zfAUuCgFfi4-Cea0x_4jKT0jg4MtlgT{&n*0rLhZTq?Q3d2mwCGf^xf!J%?8^OCZ3N z11tTEiQ0IroI^zS-)e|azjj{;hU&i>;zm=&Hd_QfrzZm}5U%?LG z-^lUX^5pvjIgSS!na*!&dAE`5p}Lv}*InZ`Ju<$!qTOuhe(QM^TYD4w@LfIxl7NN% zFp@mnwVG}~!0t}E2)~t11dbF6g1X|_n?1m;fu^UBI?1)o$*C>nk{^s;D7Jtjy^IBG z2?4>qDEJPn+cb}9d-$BsNNpJ5tLURP0tc-%IkH#*IeQMb`BB!`kv1s6{tyHMeKz%C zbPufTT&zqKxKsq7>Y+F^*{sr%=2dYMeT^xi-M^7F597yk$A=4E^y!Po;(%tdyRA!E zZpDR^!|GC&_BJI)&AGnC-nbr;0VZ)I@=Out7gZy=B2_%&S zg;@LZ(~m8}p@HLx?hlRw)>UKepgxB@YcwnY4$2tt4Hu}s)j)h$Ci^+n^XOu?zOXh{ ztGX2<#b>zaUyoCIFGi;;enZHE`V}7JD@{XJBQ((kPPW77WwciQUqU2{F+?GD)I%6( za_w+VQd#@65c;!xHd9DeA@h-qTsxEj#Gu(hwlp71hD^M<6N8Ba+o_0zB3@B6h>OM} zq#%}U553STCfyr@7JW&817=@g)a?AMKq&+qEy(YHVv%`*_oJ_X6^=>R5VE~_OMLcY zJVRl>yIk6n(2s|zu$bo4?%K8(y#^!atKic>!Z}cNy0YR&m9@LFYU2;fE2jdyzZEtxUjHj;!f3VpJ zsvUzE<0WWGJIj90qMD|yJu3>+`EO2rQVlr+cB2xi5S_3u5?4&LtpvxOkV20Z|M<yESovj@5_LhSW<&E~Yb3UQmeJIa;YuVA???aK=fZG`Q z-^`c}*%9=R^(X?TUyn|bbRZ(3pQz8G>y@;#wuRg9Zex+7v@P--*Me;sRGaK6jl;h` z8F&!5G)$z_t7UdqE>bQ%Yg~GEMawErBYPFw_CIiFCYgTLY--rK0D6>Y9(s2sZxq2` z`@WDJ8XBf2GhkNfh*l|gm5b;IdP$ydZ5jV*g^0S7z1#wd%o~cP5Z2PeIi-b4b^AW5 zxfT}FYU}VOg~IL)d}j$+=hg=gLk2h0U^1*<6uju5P**B1mBKD#U+4vVI7D}5BWshP z4PdoEU5u^XYyjgq3e|b&F~j2e7f_2Z#o=v`o{HpR+$@ea|Gt z)HDKkbo93Lc;DpG5drOu&lPVrU!!@zd{r^ax2@(@pPeYr?2*Zp-|&50Rx#x*099a+ zn(x-Rol4?=>??pT_P3cr{}}>2y}V1?o9vixBcEklmH?%d&o$X#d|o|X?hPIs+Vsbw ztcTp(+S;4!JlouyoLG!0kXA2O-xf};b(|XO+8bQ_D*_w6EJ>dG*Smjn&;QQ*p#;X{ z*x1Fy~WbFIJmI{3HAZu@Xp&AF% zu54nag4`S-qy2GW^xH_U@89NU-Zncl9W$;g?1*ygVpYd;zd5%A)m_UWC20hH=_>sa zg%v9`9HImGG__mJ%ZXxUk(U7_(`_-A4|o+7p#}@-@dl;lMaRY#Y*t%bKSBN8@R{3z z(BQ@_4j$IJ%o)r!H#8BoMth zPE9+}t@eK1GUnUhWU9!*%xbCJ3Oe}GQEK$4OIjLiv|8{k-+LQ8dK)br+x!|fi=rl& zl#0f{P}Ak{{_FD%3*ZmB_UR7G?_==gEJ|8Z{-hGI-HfI0WDNj5;XJvfRW5nt9;5E~m4E)mK`P%xDSy(D7T6$>OYgC`@q zGIiqE)625kce45WVEkMq?n;YVH!s?4O$6J3><#Q*e{?|6!n7`9qAkGM-iLt!hr08CkssZ%2>Q&M zNTS$lf*kCafye@1u|VAIJdEWz7?%dQfnml{P&mNvWb4?v?{m4LFoWI=O_dubwxOr| zNXH{2$rOfuQK}cC_lg^k*0{5K{;&=BR2iHZJ&$atbKUORqhZ*^yef;1c@#m zh@6*iselb3nxEo0od;2=4Spj5XWL{MbZP{5%-~8BfjCbo=wa(|ehk=)+DtP2UY?a> z3N+9$JFT~QxWyhDjfAbd;xzlbY-6GJ*hVy0;PnWU*ZM798&>FoHFD9u2Ka4m&JO@pSrU(5e&)R9=&2_*r zhq3!P*_yy1{K*gUpF;a@nnlR!U6TfM3%bYGtuW$I>TF(curfL;I@5?BH zkn4@9uY%jEK|;fs=kQU7lDWd`?Ii>DgZdeadnR%$Z>-5gBLtf9)6>G7{^r}FIz2J> zV$4-cna3ENqUx`k0POeNd=Blo||TMOM8d!f*X9a&i(Vfh8x1X3GUz6 z;oI5P2S0`L7Ur(7qXb2=VIHU!j}^FTg3f^CyyZWeY5B^Nc{@LiYq8A8j|pC1`~=~h zXTSNWZ}@1tJWLT{Oowg0+c1mi@q6?HEleywc`H!p)hY^K@He6PSOLB>ykloB0sj!h zFR9v61VTtf=+W?$@77O-C3PwKmOA-GH8J%t0XS{~9-v}6(h6k{-1!OcTfinCt!<#+ z!JQj39a7&RH~#hBdJ7Imq+5sAsN_S!TuJ;z!~+NWTeAs5yCJl{C2y_5z>_F-cxc+( zyajKwC_6=m3T&E$AAx(B_=HT=6cClwdz6ucWW5{HJ>3DCd|imzqSl6YqK<R|W6kz^d1?h<$9bAtJBm*%+Se*3^hz(pHTT zi#xLWE5srX9!~2hnu<0K&<%2 zdbaaX!5bd_>ICgxTQFSeCk5#r&V->8GvLD8h@PNb4d5w)Z{N<+Ir{Xjjk@fKdKb@> zCyX-@Y8&<@g};=ucoX%&>B?tj@(Uj>6E0mHL^n3%kP&7pUX``Iz4dc-P8CPn_0S@ z*>*i^b%%BKAp!Ejv-VF!tmc5I=ei@%kBeO|m!O@>D68?xHj_3cT7o1hTV!9_4!wzZ zyElI{r>I-2yWa{6tiqZdrNt$krCy_?7DvZpvF|BpWDmnxZDe_{A}h--icua{5(%5= z*R@uY9{O(_uK4PFV=-4%ukVCAI6aQJavSeVZ_l*Z5C}YKdpJdpO)M!^lbn4`b^D8+ zQ6VQ+>(43x-V`2}Am#8fIaMa!;`epW4`5A;_`RU!|E;~CKX{H-%cS>{MbwUAi7}ceYbO&{;M+%?WU`Vxl&LRO z({IcgD==YPhoDLM(`A~MwuSwvITV&$`IYjEUf)fhr*|a-sR^n>VK;9%Z!%fME)LaF zacYEf>CXr!?6ZvpxZ=bJ2OTv*?`;}b-QGAR7#y&DwHXU~MHmy#Nq+~EU6utwEJFbN z1laeYw$?6YxVI6&H524Djo&3Zr~auu_$BLhRzbsk zatKMpgPbaB%l&z%S}e{Nj-5zMZ0ZODb5c(0*LCkzbR@nS1+4+8aizraa%#mw~ezCMH7(SuI=y$Nol? z36FD&cVn}E( z#5U6}Jo3?&_si@+EajDIz=1JI3|sMM(hRkmXeuD%uJ>N)3l+rQE*fA%8U?5! z{BFg#%K18({&q6^`9J||uK7`Xw*pRv0GSI@BcTfY4$LZkzB5b z>|S&1A7K}NI18#O#-SaIqU$RmmQYP0OwOTm-on&&4hU>@zfL&AUz*F$OGC8)ZSPZn z#AChYN-gH*Up1a4-&S5r5(Oy`#jmx3)=en($mI@Mm8YnfV zB)gSMIxEWlsSBgA$A6CzF8+S&hCPWorzrB~KcxTkBNwu3S8}e6OD+(wVKX}va*%AO zsa2lH4qmvbFK%AcR)ojXD~qGgastzm83W<;=@>k6YZo`1OSXxM)~a?qXz|*sZsOm; zK@#FJ_}UTG&XJi-XKfsZlvka1oC|~OpXjmPF{NmcvX2e1YNhTy>Da5OT`dGeiUYDF<)mFN2_zx4<^7$VftzZYMB|LZ-r;=bY;>3G?)Joys+H2>YCk#`7RCHamo{l#C8t0 z%XU+pb1ZKaR9tdo{mG+5IS$s=&*{B7+3)L5{L4C_{Q?UL8MSb2jbiLO2Is;fpXSj-4xgW4mk zpsk5;H64NA;t3=|%swrM$v7#rvJ!oPupnN4iRwh1OWG8mRbse94>5aV`Bjk>hlaS6 z15I-GCXddfi_WYILESL%+V*+LW5&pLK;6C2$zjEKeZY6*!z@o5CFwq3qzk)ruO60` z{4y-iOmnZF+x3bGS$T8^7e^Ea=+Znk-&x52kqb_2y&zKD^h|t&Wu^ITGR?nsrt~}@ z?$8%_s@a#+rBxE#SJcgwZD+qlS?UWq^aJ(q94gz5`xdEnQ{Jsaz|>3L%>#Y`)BMYF3zOp3^XQ}k*A@o_j_eqLZ;HILc%3&4F?-3?)_%9x(k$G z%NDn!6>|ci%bK5!^=61^KsQplR|?~wku=*ZvhYi~{TgiChO>Rp(o(<)Pf4el*vn}y zLQs_RXz0h&*N&7d@QU-yyXHt<W!no$a}-b0_HVK_mQ_f>>gqP> zqlKs9c>b#CZ}(qB2b>FBsaQ$td_BFg;c|8lw8U-N^!mj zPw!(s2RmoXoIyaehM4iV16IA(!Gifh*It+gFTIZY*RGjEfTLu|hUa1CLHTnq$hySf z2XoH;H8JerjkjYS(QHSgp33M6ET=6PcIhPFD~`P(wvYFri#jhH1o;i998Y^3aewje z#>okN)kBUs0}%69kS77cfdH|p;T*u|{|v}Czt8hmJ@soq^{!rlxRaQd^z2s7Cev-P zOatKjY}K#uAOp4*ukmF$?Llzxwu zm(8^)Bb&a~O3GS&jpGbpUWLBtA6+m6I35x)Ydl30%CV@K>kCz_m^VtPF}X9m?5}-x zK-CJKyspJsWvPwG(#7_tLWUoEcQCD3Bv(bnyoyRI2-c;v%(t4=cT%@cH@#*HIW<=FeNvbu=Ny(VRp^D46bsW07as!dmUN8tiTe8PE59Y1s$?LpO3iVWg=Ty<4p|BnQl@aV_p9L=AbsjuG3gRZ9`>NWXL;Us4yy-uaag3m=PGn<})i> zEM1lsTgYCjQfkgfEY|0i;T9it%)SfWr&+2a zFU|x=X{}T?GOm18d{$a^g-CFi2}|TlokSLZDf2AK-kjeLyZ;CS40yj+XuqRQ;y;xc zdF0--p0?a`O&ghZN;7KztJ8NtZ%@N1K>Dt%dt;U&m&VD|J^f|s#*ga`u7e_rVnu4x zGd*0Nt_EtxW>~l=WCNwVsH~kd2J`VWf}qV^I`*pMW?pwy?bM_7Cd?mV@70=HF(oah zez*&y(}htlwnUHXVz3fE5!?Q%oJ3WIZX7Y+{@GB*tX?ZQ;F6^RF=Ulpqwhw0f^$ z-1!3vo68iGFH(p4sj?ds5`{AL=iQ{V_$;QUPP0)m(?sE{r^Zq#BDh(5sT;eu9H05@ zmx-!T=kbT$F`ua=+U&6D6Pwc7BcJ#Eu}HH;{@ZouVmHEkX6DGm7t@Y~)$$*PVwQDj zu-EfF>Xj61@Q0ZG^SnvnwM>-C5)biSP14B=fs|%!DrOz!DocxF3iYUS(LvRx#ybl? zu9bhb3~&J@hXc4`Vt}3Uz~1i{C~KbjMo=67HzT->#^UecWoYNlrG_?G)<-2R?z*ztL#OXk_)y?{ zu~P5|Gh?-ospTrQtzs?|_t|=A0f>g~qR}@wGE@8y8riVPap-jDvu`A+@JqaPwi zh#*<(Uu#(L+s^N+@TFo8GyN|HL-ZPRqb4K(mJL`vY^`t_cqB6;{mpY8g2$VOwLriE z2sZQ{^I6WX1)+vLL{ML_H*xe#JhSutZ8y}F;ztKbRK;BT6YgGTBVvM&$Q>r~o_O;6 zi#=~LYx)M;4nCz_lUym^p5N7RlWf{cPikuo$erQaUq1 zFzL|*tvA*dN5-jMb{+|YkKs7(i)h=)5VeEixxf+^YU=2`@5aFC7~lpRJt9}BC44P@YMcyeeNOB$#FN!gD4y=r(`(&M--X%((L z8qZX=899v&@);DjnGL?eN*^qtns|=%ga1Ydlf@mS*+|=U`(+#LN;CdR!VImD*jqc& zr1KGNnYk5%3U@&?7PlJCQ96i@7pL~IS@IdoZz3t``>c4l5Mg{qAp99(_#rIMzyMfL zkoIOKO*-|VD}AUZACA8;a^JP5V`gT8H7`tR7?nr%OhI-X_1;o~eS>5TLi9ZAu0CU2 z(tmPTu1D^RP+g48n|Pa!YBnDWIv&UG2)Vy-n-cSu1IIWj{_auz`n>IxO~N&tk0StV^=s3=`k;AXsJBiHcMK zzX{t&Ms275qYC%YM8_{H?XlV9c()<)Aj0&wzDfOlZBtn`nSZVvtNM`oNYQY7!M(xm zX-!o1WAzINqt}ld{G&JMrs=F7hUIJ5ZWk9>(ic+MboODFWNopawWRX&aw}vq#}Birq+Vx zY=Ndq24Ja5ld6#`z(-_BzP;UQ@h{s+F%C<8itKp;{Gwf^{?5c#qEJ?2nZ~fy1K^f! zTp1chZmT)JiXHO)j|+LGrt0ydOr_rYQu=bbTm0Vz6+P%R7Z;;%TbYA(80GpHX*l9$ ze^hTPmEP|(Y}Ta$!+DmOYK7yW4K-0smlSL&C5x&oJ;TXYjgg={6OMO{WW)Kca@#Cb zd28UWN^bdCp$E&$^mT6VJp_%DU*5vY z{Bm>OV>vxrynE1dB`^@W-TmT2FQ*`WXd=%9m^Z#<2q`gWkq>Ypy8%iwCT+g; z#da^oFMXA}#z}{bGx0(-XwPekV87|2bKj?x!;tj9T)RM8SC+5!2Cu7;$X@DBI=J+W z@hKS-b~RFyup4hm^d%5r7rax>PYRc`TABrw<}tx#bm+EiU6YChlU3ocyYmUp+v_cA75%zS%T5^kDHI2kSHmLkB zlQ9+soWF3baN`);-gazT6!*R8>3`jr0`X`RtZRbHYDd{L-YIier7?9y^m1QoJP3tODzG{{e@lo!E|j4Ip8Y- zl@)X&SLJG{heEUg8qNsS1;V%g+L*=o+VdoAa&8Yi1y)JkZv=f#hqhpnEo_icE;Be+ zgfmDBW+_~yeL2;DWq68X0pu66Gl83dy6@#X zJ<0F=SNa<267|otmOH&CozIp39sCU6QWCaV!FoHES!gbn*_V&X2gU8bFIk(MKj!LCoQ#%0hnwoE$as!^TBO?!P%Sd+5u&sGYFBgIjYu_ z<2aSIh|0c5rK`==ctGl?AQ=LUsBWG0Fnz6@$u4zE9*jvlZFIPq>I15na%L+v(|d82 z(q%8!bu)UHgch0*Xol{xEDB2GU5uubztaMNa@JW2nZrsEy!DL18)Q^qpQlUFbu8IF zhOAKdeAU#SfE`6gMDNWVS`*Cq$j^{*j))vIH&#At zT1mY`;Kf3t5WiRf%-fUn;o!}m*5R<>^c9LcggvpNisMZI`^l<1`ki#UG;?FumB7Ld z6hZx;BAS4W$6!(_Eke2~081XRm#n+mI{W4jSfgtPj$`U3@o2-7kLl%k>n|ZC!lZ{N z1PAcMHY%puJ&ho{(;Ow-+GO}pCzyHUfF;K~nsMhN&Z3!Y%b`jUy-y2!u7ushKgA&? z;zTUy-`fT6cQy3UIHJt;`7YikC2Gsn45oF@EDbDJb0@_`mdi?h!Rcj7e-n1dYDpuy z5Eic+As>0*dp~|k>6b-ds;;17OfV)%lvZY4Sq|0w&xEL#6|{cmlAD|5B6j;tY?-ru z$>e*Kl&Sqhq$N%&yq#hQ&qA1`+l(5*d>o@*SWyRm3E73)L~D3CJjLt%x?}81Yf^b{ z>EDBc$>%0Wab#5kw<3-7f4y;}L_roi=W&#HiLd|A=U1yPzKp0~&(E+MbOsVq;*{El z>d_-I-PeXB+LRQ8SR?fZI|9VID$lV$*XO;HUW;Vds;bBW20jF@hOH7?MS zHmYRCymR4M8^HthKxSx+9_-%ja|;)1lF3wn}rIhqY7V zd>OW~>xW_D36}8UNYag57KzvfQhbG6Q-NquSktmiU{Tkw13{6yl(VlybJrdx^1V{M5tnAgwz2gB%UsD(K|N*hjpIDtd540NM}hbWFd!f!XQ zS#F!;H5;~NAK$}UlC1mD8i|Kmk`zbph%xD4D3xRF2(!i9j+uE4BWZ{Hhv?8cnZCxr zi9Z5X3o2B9a*c?myH}{x7+>eRdzyK?fjx%VCv^4?Q&?`=5g*}b2sV53#3L;BRb!dv zPvt8R?q`%DC81f^C#z%$L=N}w8`(49E&IkqCR3_|%l?04a_OJRhp6;<9lTL9(_tue z?c8X2pOI5VKG(qgXoT*=-{b2|eTJH)M@GnDJR6GPhRuk4w@-K0a@aF}D6z_BfjlB7 z1RSKRILePxhchWl>=QVt`J@rq8EH*KL-_+LhGqxt1CF#!U1TT7(+5$Mme*A7@n%-R z=`$+cT*u#9gol2c@Zh*RW-?z^qOdYzc|o<}H(ao1rxe%?QTe6%tafc;y#h5xFW2qC z(-qu&1@Xl@50s$9#iIaso1B!inM*mJCmGnmO`A#oJOBAd?B1UZQRK}{GlYnL?_qu~ z!2T~L-oeV=afGumoJB44EVTl_e`50Ib6AF63Ep%I{#&=}*;X>DkmwlAKS$5tnLZw{RI{qy5ctC#~vQ?#+ipwQBY&y3XC%7?c0_CCel+iR)dy8dXVY69esV z>^Tz2Z}|;atIk_?7zf73;d~~I?2x#pe|=)2*F1T=`C;Bt!l)?R9};7)*7jT@oP$E~m(7z% zVnyzX>Y4jF&#oqwdrW$_7t<4Clr~Wl=_N%x4DMgh?hJ;$`q@R^LFV*xArMBVb0ui8 zARtZsC}?4hDK&_7<6daBUi7a*_m28$LjIK}-gsKSKGXSjQ({-%9ZsDj8$)I7$}Ztv z3#CdF|D8K;C>pk*d1~=frzk3Erl&FqD{d38=z4mLECqZ4+l^$toF5d-Aip%h=008Q zLS`IK4ID*P(aY91?@QK&s=ZT|gu)j5NE<5T`AY)27HP|;#a*7w^$D9yrD9o$Feap^ z*V!=Dr{S~<+M;O+C7RS}&SteRf6;|NtkexFekHTr8}95I!8Tw4WPNdWjbHYJ%lV+nx&0X~bq`46kWcrU$PIr<4FpDGRS{67xXY$QeJcgrXR`DNq*3KU-qE3& zlPD4GX2q2CR5b@SAl<8}643&gub~um`T>EIv4Kx?U}dhEXUO=;Qb2XQym5s@z)*Sf8iXu!ZYzdjVj=5t zibcA2(%xaJ42_Bvp$kW&x77O=M(z$<(!&(Z#{*C4GEMQUY;R#CLLU7a)<@Q{7yAZ6 z$=+T_Idw`qukdws zWOR4gz@4E`J%39s+v~0wu@PQF!30=?JlRE4%#MSgMNAg6{z`jWo-|R3xi*1dP8iaK zA?fWdIR5O35R$-ohVf|fqK$*gDj1?xj^2|4jI5sF@WbfK6JLn5)?s-&q~H=ZsNXj0 zaB%?ikv)tje73O!3p#htJaH?J*cRaf0N3%2_PSQRMBg^`huOUBHKveyn(gDT#`RZs z^MHUBDdQu~B*9IQdH3vW|0wEnNiL)7`;<~mQn{+KlAvARAP7Pb1^W}Uv6u4#Rm06S zGeOS7al(Vt-@6&PziSsj{O;lhCk3}}-N5t&Fg+p&OT6s(QMouSaUl#CgnWE(?%%6z z8x+wAo5_E7hhJ+D#u~wO%*RTzegvoAlwl_91ou>&P`aeVj;mZy2oz{{TDM?@Ks$*9 zNSsXJk!#svsz#Cqy{cF;`$jjOPH4x+bQl^#Lg!a}_5PqG!dwjj@a6 zDz+t*=`}pJ!9U{AZ@^bVh4 z(M3)IQCD_mc$AKz2Qex4JG=1h=No+W+4Of<5m+ZgS;!O|BDvsj-S0>dT$BRKI0$ZM zC=Ggw-WfxCJvevEj2P7-ce(1i1`DikEo)_fPwcU#rY5jDO%AhnrFl^Y*swf)wYxxi z9fjOqLW>-c$qe z4bv`-JryU(>`Rcn2oEaVXl{sGY%lP;P^mumbt2pxrGc$#nyxd|JpS7E-@TSZqNWzT z+uh82utux+=QVP)N5puoY}g}or$ESgo4obF+~27p+DSB)H>7@q6iY z3*gdS!o=i86WJ#eA^)|P>GM&>tykd2ALoc=GDX0hbuYiDj~{#@s# zlGJz}wOf6zuW}h$MkGKP#(b5+4^@Ry;jruZ$R@f;4s{`aYEuwBiyg04+0feaQb-p~ z6u=MlsVrP(T8}dmL~aOuu;MY)%nn!Rg4K23qqDL`p^4b9bklXP+dbBRNY6X3<8XKu zk8FhMIqrt{nDp4SdAb3CE*rR0Xn_Vjs%`$&Zx1msBOAU^K4g@$={7JyxRBf>5Y1f1 zI8^E$&f&qU4-u3mC#7=;nxnb6yOpnz#)-wL@q^YI?K)w0M~@&6Rz$CP)vZNzJwS>6YZh;5JXa!;WHYT@WANx?*Roc9Fk z@ff|+95?NHvJUi^wYlilVnM4tDp@Y`?y*&-gfb|)^?(3MXS_Lp+YZ@Bhf!%l4xU_= z(X+p@Dav8@9M!A8cU4`K?ZD!>K&PdvEG`rf{Kw7agWNpIA8^hP)Z zOF7QAP&4ilKKer34f&ky!^QmHqvGA*5&ZQ)6EP0G+rITxJB>T6?Kq`?qJ9ppTipo4 zIIQvhxBcj2oiis7P28Gun;wixw^>B$HIQZ<{U^a)G6hoB9W7uTG70s)MJy;HX6+&7 zZ9wqRqrF?PeUK7V_M`ESHjjrgmR&2wfdtRb-0Gyr1$D|IS623XcS>qkqjbk0pspqe zhr@y4a|aJaT2DRmFTAEZ?5($A1g}D8pm{IU6o!^C$|F%?wL9R@1ES(h*XYcQa>t?g9;@Ec^+`LnK4#b)ZZ zcioRULh&E>XWjn{`Y1rj5I+<^iaAek(@+$3;WgsT?2^wMto5gT_yt);9KhaZEh0efYuoll2-g{uD?_ylFgy1Aw$g1}eAM4+RKY$?N12i45K?g0w_YAyFo ztVUCaQIQej(^B!}u?>CrWy){kGvnuz$FkWxIcDL!)bo}bV$yS08e;M-S-b95b-h*j z!EdyrVtw>gpwimLQ%|?;8}c37{OWpf@s|0EzlLwf)Sumt871HhxpZ3+>ndn9 zWVG#LqQc5UGNQx9s_;b~r=%T`&>%6D96iy>MscWKY)LS;k=$AN=kCpp? zFO%=TVzdtjI?l`iL7)FWyBr1^&VNY|JjnOTDTHi)56<54Ul!S(0IBg|} zM&-8kpV|B#4v;L+ggzd>zu7>Y$cq*BJ#A1CMrr@g@dR&ShVL)&>4z0GuM-OC6R5Qd zYH;8w%%B|>5eQ1rLQSReZChKtGH%d9s7CvWqXQ0Y%Qyd=MC^=xqKVefy6lsMmLBPz zoIpv;fjR`m+a25&OnQP+pB_B!7M-;RSDO!z3*+PWZR9;`DY$AeG_ZQH-;-L=?)N!< z`fxmpO8F%2H@?T_{oUOVGCaISXRe3C&_M;L? zCql~v4p`QP{V0}AlHKq+Ye;7;lpBpZ5@b6~e3`~J8~amZxDC%2y~5Rgantj3aGS(DFhWWby$2PjeX4KwVpg(a7a#@Fl(XjH#3 z*EHe4%z`0@4=*Yu`RgF!+-T1Ie{r>_xGaaCxSB$rwu!*?&9{^o{du=UgO)*0-c)J) z?kX~Q@~1wVh?n1so{REPUudNK_&g3BUhT(NoOGtaJ`>zI)HEG`hRnw#?kfG=4InVlHc8Xt z#bR%&(da2}Tk z6PQAvEVNr>L<>eO>KX1;H2UE9y|6LdE{BMrDo=f9RJr?D{mg#?ME2eZx|-(>q|{W! z;+(wxo8_BY6H?A%^dF*umhI%@jqv;5-=hZ)$hFG{ug%xh0eh&bBQei3&iuI`*4rF2_fDkh5vMLo-Yc@B4#8YLcKF)md%Z_FQ=-FMgd%2l6gr#yzjRXFC#8vwa0kLd- zFHkK(eCttyt@>rY#{ypdC-j#6RrY1J<_C1vQ|t%y#!mg)IE||adP`;$$%Z(LWeJ_( z&v3n5W<0p0evU_p3V(T6{1UzVpL|day{JlC%eJSusvn<$#kWdT2P<>eT&3D^Z;M(E znx;ik(G3oIP}s7IUPS2)ZC@#%M04vxRf?91(yK&-nrkhhr?RuQ;!lmt$ZA0i!nO61 z-Ssa@%-vbKkb299Vx^ zub@I<%fGU;O0qH&=SK^(S!dbCw`}iMy+@}uNc%T*LId7&|NU=yodR{N4FYIfv%SL@ zQoMOT1*7$AO3+8b3~rAxJQqHE+M8z*^4K}&j9&2G8UY?`Fhmm{xHB3I68%!A7ur(v z{V0MnD$TEEV|1#xk21kdWzfvbP^r!lRRJ#+5LH5)-2?427BNvlxJo?|EyIH|3Ie3V zq)=UXy?^^53av1E@-(a@JsbFh?H0586&|AyP()8d1@zAK0U`tAR zzY4|9b;8h^L|P<=)I6_V>5+lW%8U^l&ncp6`T74`3sSM44voTb@y>Tlam0<;=fsYo z5{P&!{(1UyE2oq>1<@LYtgHBV)DL_qAn{;xIFfKBq-9_PI^Bg zyt5_8>*4ZTGz>m`2v}lENjR$OU#mOulvW|s0YZp7O#E@Nv5mznmD6`;h%E={&h-I3 z%#&clXi>7cmA`q<3c>9JQgt&$p@~UQKFB0|7EfH}L(LTG%4ogupS(0(X+1mnB$`i& zb?RR`z!HBp=tMw;gX`Nc_1s&Q)qC(OY<*a*=BQ1kG~<$+a*dg=7lakP2G(ErjPBs< zwuYCKXqj_wy#|rPw91jQOdII1xhhgh8A??n-OX=RQQ1JvK$cE4|2%OXga_wA5E)P} z)r`7(j1Qexsg*xq*m@3gr=fK8QHRnAH1m`NOC$=|GsD#nvzpO|7!(8-6>0>$zr-cW zJ3E+@ATc^Ql;bN0hn2CMk*u{w8re0wLXS2GaiY1~71WZQS-Cul2lLXXjpn=VtC$Hsf_N zY0!}}z_QCMA4hot72@|eDw5lD0O&p4EO#=41PWcD22q(eEL2(t2MZbovx`GH84G2I zgR~MY#UAGYVGgt{wkV(MQL06{xVDIPn&F?qJL8U6T{f?vq*L%lwp>yA)oEG1?bb0a zD6daP%D0YmbX_*W~&G+Uf>vu&#AAg#jzr6)suwg%fk867FP* zjRc>2*~jCpJ}N)rsoyl+=inZ{D?Sb>^YJ|m3ELdZ+wd*g#>~Z+>Q${c-Yi#tKd$T? z{DQ}ILoaRuZN+ZGIhzg$wB!hdYKq^of|9$5>x>a-}O# zerD!O_=+BEH+e0}#bXX606&Wqxq7-C5-sMAJG?Nloc0pB=3MJ}34A01TX^bg>$!zZ zlx17pckw*2BtxH33LY@QG)Auo*hHNLz-bMcVniIy6%s2aPVM_ z(fEBFqY)?JsFriz401@N@aG5a9P2>oRU2aUBl6G0l@1ll9J^f6D`r2pq|9V#Sc>4p ztGa(5^_TZ#)3&t340P$r!L%8B0$#BkVaC;qFKeWK8LGDGrTa0t_&_}JniB`{#dAuk zPJ%18xb4m2v12xOUiF0}2kh+19I_RUt9MwI9?uYRRcA$6_cUw7r&l+U62dBJ=J*~EyeVc+o$ zp$zRKaw5dDWx8hf@IRM(#BfQ+sLy%^9qrJx&c-SZYK60t#E5zMj2xbj5RBgA@bkr} zQTYtq>%s9Lqc4zWTP*1EVPa7j|Gog@6pp7^P#od%2tmbfK5#z{ic{|gQ_1&It0MJb zC)%S*Z-r6*=^0|VT&A}pp{o!c!(_vduA?Fy;b3S-U{c8sO^DrPCI0!E7fs`KG7gw(sjgE)qM_lTdi+ga}kEG-> zLnLI8Qm7@n;yy!7*CMQ~1d548MCu3ux7>f-@1m^I{nB^&_UVMeuF4ZTe2&Bm&28)T%2aQuC9b`#uCon+#P*WjT7hTI>%5DqON{UA(2H`} zlYg6Sy8cdoN=U|UdS5g!O(BR$x`$ufS6fv17X)tYAerd5_DsjMGakXG6_XZq0Z`q{ zh{xK%{{yl>O}}w-<~8dotK(ZC0{R+p9gCGJHv`Rk`$^4*1I;LAe&{P^Hfh2^-c0f` zZuuKCtGZY*en3hkdH2f|7ctKfuZ#da1oWKZ>PlxBNb6-2D)aEY(0CrTL_7jPQ+7 zJ1A*_z)r|E2=I1kUgKZvn=)%NevLAbVwajaLF#Wv3U5Pyo_tn$#jJJsUZMY-##jhyK_OzT04a^1`WU$w^HD|X zzUadP&l=Ho2uQ9h&zdK&5*cx;;Of_M^;%fUb7+QzK?%Mn{**841LkoF<#OD}w4 zKM)-zR%<7t3_bO{Jlo+QFGB-WH!$0ieDeQi@6DUzNRB25CN8^e>AXp?FosC&>aX1FJ~~3y5-dMCN0DsO zB_*J8>u!=&T`Ge1Kj&|9pJmo+i!WU9h!uMZ4x9+c?B%Dfm!KZJg8ba|7Sw}Dbc=Iv z5!a8r#oMuy*Tg#3?rV2Lv~P)UuYE`>5jC8VTs8yAy^E|i^an&Whdv72?>6e8V+9@r zNcXiH(0vDU6u`XDPenizWxHMbpIru>d%?HPJx0T5CLtg{itfZ@j(ZV7LvOp@UN|n| zO#pQ0dVA3^86J#h=Yj(TQE9g00bPVZ;DR&H^y46E>8i_h8d5Idd5B!F&!zd1!&owW1@F6Em8_iVhZY zG`AeUgmx7*sL;ThKqo`rDd=4=23WsgNW_ii^!n#8%cFapZ~Bl1b*Eruhm(#t9SG3D z&A1?1myr9(BlhgS>k-}1<(EfXKq~Y*!dXkX>~0yX_8>-BaI`XWFY}}mOYmluZk8jS z9D>uFQUn@vMU;DrHB1L8A=z{g7a;`H26E{j4x%<7E0UcI>EI%U7_elCFap-VP zi3-nm9Zua(lftkjl@B}Z!+w&o4#DJyp5|b$`mSs4dAhj(On%|snQcLS+QV}=r@(aGr0Ypj?$?sg&%XxFpJxuoK{4^>Z@(hE6uS8ZL7cV8<2zS&-Zv~ny1a_ zqUMk#6Z%o~1S{YO!YKKr>wTHN1Telab_8&oJ$-sq^$+hhT5gU^`g94(wh}uOS@dEA6Ohb36S%go+CJnbf%}{lH+I z21q?%u=m_LYc4kHj%04U!Px=4N{e*5IIZV2hq!LpX?Mazqx& z9p{k4_9zDjn@?QnR|b3YExtD2ur?MwBnt9PDI$<^;u>;#9dklA3WhAia;T3C6{?P` zIP8csjx1gHAWh66I`MrD@R57eYxLNK{sFC~i9h~PZgI7t=m7AX13b|OffFmLYgT=9 zl->hA78g`V1AywgNO8%E(6S;_r-&iT>1XZ)4(e6c(=$uLs!pkyclB6Ycyr{Pa3g=_ zruW2pcjS-nM0~7q=U4C#POD(HoGF+l=P#oE zZ9S|^@>fy+wjQnwZut%_;`))dyzkvMJ#wqd2$R?PF_b-gbdGyRT8SLQHwZkUqH~gH z$}?%o}hcLHk|k zG4McOmhwQ#o*#EWGsn4X0-&Xv&8%Z=diZFQGcbqUqI#d^Sq)ITZ?w}>LNdQ27w7Hs)(dQ27wtcQOx4lZJ#QG9%y1SCIkoAM=CZxep5 z{60RqH(*-cMH|r`Z*Yp^VbPBA&u%!MI*++z;53siGKZ!=zfFZsvmh`t$ahk~(<}(A zSGo7y!9@%*av=YBERt;ej|3wj6aGJQSJY%U5>Xa+;i)LZ_}d{#vhm*+lZ3|dUpJE4 zKiic#+n!k?3&N>oiFj&RuP1X=|9d+!|51*^f0#pbRhCtr<(YPfw!gAEQ>7GHEsClf z=XI_MS&z%CEULUNi#${0M*PP*R{xtiGMCn#9KN+$BlytC3hz62-D7L>4V!b=nZlF; zX5p&*8*dX95HNt%)c4paa!;%^53Ccks^`oa6zy80B5iuL@Y|Hus7O2BLWcC(i6b9c zp_O)QD$`!qCi%8;u2#k$S!C9DKFfP!=fS;7sPBrNS8s`)2k%!ud>*`Lc>FwggzP7p z(^k+zGBfCbwcC`P!SvQJdT_ip_C|e9!+pNJsepQLM)D)-!GCo>(JE~D60X12lKVch zg|e>5LhID_q6mAbsCCBv9$pB-d9xc2F#&sY@xT>pL#cKG&QeMjKQz!I4;m6}W{#>0 z?;A6)5kEb~xz|{S<===u*ElQG_r@(>G|n9E(z=}PSOo+mek7WOBfD1D-Y~~~I53?! z!Q}_zXAjp6Z5nlD-7T)IW&@Js*VdC>9`iT=Fu8jlU5tr!uim$s=(+Ln7r6efQpSYV zxw>y$l@Yle(vA!u5Qx&GCAW z@`~nRwx>~;?FWG$@?fhA^&sg%ZA)Wsb0r^a z^PXkF%VXEiLE7h7Qv1%eEuPJK^E_w*LfwNw^mewmF;*wmE|O z0lJ+Jr73?UpI7yvo>pj~AycleAo;8(e zm(M}k<#N#DqB&q;EBZQmmh=f7q=QM=j<8E`GI`p6qSvWlFWX#A2iyEWdE$X}l#k#^ z;LbSM>NGmo>N9FedTgj?f4o2+v8 z$$>V(vMyXl_T$&gf9t6CL|@pzFGtox?8-QLi*tm6Nu6jL?t>_s!!XH39PNYUok&E$ zPKSyZ^n{ieq#T)pjtK#Tjf1kulg7zk;XfV8I&( zohLVs^f1^O>|(Gr)`hK&<30>{L=G=hggwz=Jcof%fgg2_-PT9ei^(w1{;01yf7E15 zhk-VU=5Zv9$)s_hvq#W|vjBe8g&w;SyQOLdV#nA_kF0g{fI06%pe#>1)+F*`?OYLP z0M3dd=VbDsYXXd|0voFspQXKlF%H>5 z!@~LqPKYnM?oND2UT-zi$del{kPBhCPIzE0qGPK|^7J-c((M1AOt z(T$BPE%wkZ_D{xLhTy62)D~VK$)^(#>1>@F4B_++4-3y6tOt<;ckJ?KJVe5#wfo+{n2cfIhI zZS1_$K6vFK(Xi(0#{RmOE@*?D=r%1C6SUm7K^I{I370U>7~%Cn6v)P7ia^}CUu8-Fl@JhMxr zMSMrhmU*BJ?rEm!?xY8D+)0K{Wkh>kKG z@oc|;@jhGcPq>Z2yFgTS2%po7cO0+7ja$6Ep2fR~KRR}+QuQpJb|H3PH4B?%2bt-h zj};5EHPEhN1W%AQ`v`mr34Z8&1&!+?L5?`2^)(z>$n>>cSid`jg4NCp_TkBT?8r#_ z6JEi&TfMZ6EGdSr;&AJPlpaDol8DU?yRl{uFB4X)Hnh=2hxFd z^D~$vci{#kFo|;LX6{f@-Z=sTrsyUc_&Sx$_I?n%Qq4iTG;a3M*F*MoR1LmF&ik(n zJmhbjAJXS!=!Dw2OT%Z+7dzITN4PCrc@E*W^rG`dS~<7-8uw@E5l7jLbE8?g@GBbd z+z0&Vxux3DE6*d$mO2kXJrB5%U7=Awb7R&y<7uxxKz{Tfe+#zLIx2yuH4diA`7w;u_s`Q8={c`D4G)XMsx}Aa^~; za67G!7sAeDPr~iA)sWfRWscp*Kv%f0qiRTYv#0&r`NjnifyYvo+|K9DXAka-@4cx% z_x$#4>4E1!&;57JG95UN$>&(6SKflcnO?8_fpam|fUo_Pf9p9%4_I`H&i~CeI(Ch| zbxg{8H2T5sJ?qB#-a)?gAj9o6j!qfaYvbvk@TCGNW0yH{q{_g>yRRcZD})x6;&0!_ z#la0u`{>QAJv*Wo!dzC{SRdMW@Y-?ii*sbktrMQ&DsvqpAC}LBi9ExvRvNCsxN zgW2on&a@)|90uW(VkxCud$vEvNMGARu$Br~R5{4X^I{ulmxa#i-54Efd(X=GE`Yhr z9dns?%%wI5)(#E~C{2NUv2G&p4dajdVIV-M-->^ZMPxdVu!Em_?yp;R5|bQ zip0Q{4ov4}ME*f}Vf)i^M&PP$tT_Vt_3IamqPSm+69Pz?K^ZC$zo)#3= z)+1GWAi+4Rv2D~nPBc}t5Xw>FD$S8nI*0I^%6+pn*4D&mKVczGt*|23=5bJ87_X&)jkfubg@GGrmk}G7aku~E!CCZ`bBB6j zKY!@Coei|7W#{a{oQutuSo4TmpZyB*)yo)qnP`7d24M+1pixtgK>YRNML_{674pLyAC&DVvO^VSqPmnS_3 zP;v#%>dNoCb2&orO+ddz%@~LH~p9W zx{DPH7uIC@p%WJq0^uS*ds9F09HedOh36z~OS?41x;YTNC)yR(Ur?8@SOcDSfLA`? zC(kL^mVWlU<7}z(Q_}Oe!DP_r7r)WY$;fymW9}YgxSiH%3mRi}8*ZnqhU(5PbL#rb%9*ZH&AsULVw`nL4QbJVw`9TTdXgWsO< zclH)EcTA`TJnR5{CRDxkJeh6jd(U}nz`Y95=v&8PfeBSU6PkBSsP<+BdJ!D@;4r5?K^FAi@-@`vFL%!-v|Ns9R_pl#1tN*_I&-BNy zLj5DDpT8sjbC!(@;qpI=g7QDhQkFmRKmW-8{3HMKkNnR+@;~eR&zbrs=YOW>{$G{+ zxt)V{mNq!1^OL^(PB-Zy3%sP&b|-03ao}<6BHe!9=OUd~v5RyWx=3f$H(aDIQy$W0 z{&0>SYp-a5zjiP6Uu(}H+Wd2Nb;P^)ENWSnq#JKra=)svs$`YrS=(GT zhKsXMRr|*{lTx%*GV{Hqi#ls>lPZNy*KB_kay+i{s;G;stf+;uB^1U*-40RIWmb&y zy7tpY|LVND+m^DwjK_bkAGpkmin=Z_BKNDR+X>Z5$*NYeCLv!t(sq=2CEK4OD@9d$ z?eG;E{{t(O=c*lmkj9_f{u);;jU+_7B3UMCRh5E>EYY?u#zmP`Rl9$YANacS11HhN zP5WLB{-42^{`$WMWOYVokJzRI%FT98C+Prw#lrsFCBfq^8E)d7?b3(4Yx^_lj*JtuS37bBRJ1phdy1}E#qV8X`+28K87wa zHd>v#fjC0XJn6ws5{{19r#qovSPVx;@#&q=UDAcW>j3Gj`f|z#X+S#AzOd{j*)v^$ zOJ5G+uXVzynbihfG*iDe@E|Jv+Q7wm5jyaDS*k}t@yfaMPD8I`?T0%Jow!-g?yCH@ z%>(y~FC7BaUZdoa%xYf<=8-Bio4d1NiWNw@qun9^+;>`S)`0AsmO zJVFniyUm@yr9&&eNM4BN(X;iouk||2?ox}tmhHT}_+uA;Aw_S0wM5qpS?C(%**K{#ZX?C4dx zwU^!H(P1wV?L1(Z6HyqFCt#l)7WlLzdfV-u1nvHsZ0VJ2sn5`>+r0j5cwtjXb>ED8 zS3d+k+UpzKeS6TOp=7;7A)5Fg`OTJN9(^?ac1J{b?}?*e$^r?T26gj!BOLX63fs4k0YJg!t*m9<@{mg-lXG(bxyin1(9RaRO$ zVSi;Z7oy127*X$vqR5N7XdBPRbtdY%5(-8q{~Vc8-hNVKb)j2wziLV1o}!(hD5`dq zb179NMBdI+6{;xecKUz3Ea<!h^HMYoCNT|Bmp4PxVBKe2c>TO<%$L>FcCE%DirP`&IVVg_jbnr`x)Ac{7yT*wx=B*>CuQid`e9=uE~(t)UkRlK&6AA!y2)CVYZ1b*R)k&<_h1S_+ zgJ(1oA@gWQztCjDg}Ch&;$F`}6kE^xEZXLpFNF5rg}dEuyZ~nR@A)w(Zh9v5F)^v* z)TGY3Nqy>>RI~N$E~7~;5@*-k(k=#KO8nG?PW&!|z396u1Hvapj{a?%E#`b?o{ILJ~VgL8T{_ltV-w*pgYyX%3lkNXjvuri{R~Z0G zFJnrJXjrC{?-FQ>C`-zA`#(>ftzvPu825{_%UGP9h2m@yk#EnCl1Puz&YL9JGcCKG zt^c7!C{YM2&C&|pR+ZGo$C@mbhwjNbu}UoR(0+3Z*&+b`2PAbIUUL(vOF_< z9K<#g!}>ONJ0rJsXNq-{`>~_y$RMQ&4N|ZwPOht1st#+i#3Wm^xWX!GXI@+?tQfTe zmsRUyzeu;!Sh*O%95Z2vyBOTcLkmBx2D%Ss<9VVUouxlna#iyx*|P@%TbUWXZZ?jE zPHxFd5R7&MewP^pb`G%K0dYRUcK7bMeTc0AumL43 z#H@r<3;ge&hFO2eum1q~ulg6re>0J(SpHl5kpKRW|NfBw{*eFvkpKR7l>e%L^Hjf= z^USi}$$1ukH|Lp>|BfThv-rC>PxXgzp1+sVEB<~?ujotVoZ|E|d& zGTw4|pNw>t3{fv5+2uzgzqOX3$JR2mFUM(PZCUR+f7i}$u_LZ!oar=T$ZTbk;_$dj zWA|m4Q;hSiJQ-Rdf$BV+Ks8G-k+$;0=dO5qM4jAf5qj80JTrF*b!_ubz7_8*r^7XKG_C zjLG5a#uNUIld|X~bCT}l)&B9bW_mEO=4*AG2r+o&;}PEKoL*%1 z75e|`VxCqi$swPcYv%>gOEcc*#@G1lPO{O?`V}im_xaZIBlE6@Yt_2n-f&@hyWm}Z z&ZCJZ1&7pxGukOhw&mJ?@kAF^kKvalS?!XG)whbrCkC?qqvYG_AL7E5=E7B)3opLO zg{$Aog{%Kc^6h^oDnrO0RL0*&Wk^F=6z1`onHP6q1b1oeZf5C+Z^@I_eez_61G`72 zLxBC*HAb!6H^uWqIrWg|HgV;|NYIIrYCMT{MBj9jPg2^PlGvUl#Gd{7>n271blwwl zUsSsB^t=5sX@|H&ne@!kI`OJhhOR6P<;mpfKAE7&qnRU*oJ8Ie;@00K#I?;F%;$XK;=cA#I zE;yC1N#VeM=gK8DKJ^^2ED`10Tr5rGPluBjm$p;i;~`19To~9(2m8m0*#Ete`wtQO zfB*Qee}D#HyZnD#3Q;im|Cr?eMInC3|9{B;f5`uT$p3%H|Nk4tfA!*-{5|1J!r-r4 zx$^8=pQMNsUWUEVAmBz9ZSU`2*249fk4I43R0oQdO!L- z4zSMu74EN@j`s9jzOTRA_4U70sHZ>rWz4?cD<%=-soyC^jDI|h|6QL(Ymf_NY;Q=O zGKzq#`Xk2VuvTU3jqEypc$Rb|n=18X`TbFsvu{Xki_|mwTkjjE#fEwRBdd*YtN2CL z^2%R_8^{>-^$T^YarXG&};(ld_ z_L`UNu`ZOXW&2-Q%PJE}surTI3K{04smG$IYh`lMm|wC~wJKGn#5l`p3gRQGtP=G& zuc~4!a@7L**?&Yema?vN6k7MIZKkSKrK)VK@~Wt$l0{y~N{F(|#&TS@fPTc+oI6Wq z`Mv&dAh6 z+;e$<@vj}5P+ic!GE$yP>Lx=s^fM#-fb1h{Qjpc3xHTc$GX&wI(dsM^cVg`D>y$)?@w_4sxn8voF7)EosFg2sFCif;3WMmN^^@P%+6PMn^6wj#= zrTIR$xuG8zGwkdGm5^;#M&?R_j+!L97UY_KY=TwRZMjGFf5la5fs?M;M|D9RE?slnV#%8 z7sJsgADRE&ZO3ClT&v}f{+A2qzC60fX0Wfc#cz2uygHqK&_mu4SuUf_*DsNIQ1BBA!(+U>{NeqoONV}`gzf7G zoTf29O+uHCf^rGtQVDZRx#0))+Ek2!ipMVc@mE&5$6@s3j!&Y-daya`r!w!iXc#?tqtONwV3I`fvI+IFZfjPsr( zdR#2|$++;1noaSsZyRiZad-uM-rP0BsaTqdQBWb_J0?LM$dCNseKZxLpyHtmOn=Nu zPh32DUMg`I~pW;LYEK2a*5mfk}CW&bD+ydVfm$ZmcmPS=*=vwJ@RH&^gQxWCOggm z$d$>@Du}4bz$_AJqrk9GWp-+^q)}#2Mf~l4mq|~8VaxE^%8ZpiGUX$$yu&qeX$;R1 znf$dGcw6jzAT8~!E#p7Bj0gaO>Bu3K9oe$ix@g3TB#xHEt0e8wYUhAbtZK~F$Y8X{zpsEh2=CxPxMwgGm za*1mzK_tn5aGsc|VN@mHk19aDiIrcqHdUjjD%0T>@z`Vwzv|3X4WlXn_slowD)Vck zt{Fu&3g<`RbyOR_>ey5bSyfEdw1*dPKs{>N9ZmJnl#l%K3|J=v*2!2l&Fs{a5B+kC z@Bx)R>XunM^=7m%13^=0Q^1`KkiDO=)xf{ z>@FbPYI)D3UywWY%%3{f>JwX(T{*vMS0;fLB=CYfcBS`B>4=x!)84rz8-#B1T9=Jj znbg-3iG*Z#(|1hih?izyVKR9CWM{7QqbVKnQUQWofFc(+uJqQFj(F*=^C`OL8m(Q9 zXjdjRXTO6%b)~zebjV8;E{4LID7Pl+#FP$sDP>S@&s7Wg#1=i(MMGDVdewV#{YvCf zC9+(RxKVsD37Hk`evT+xt5d?)U9O|x3u8qqgA>5EQo~N9e z!XYbESSy9KQul1(t|=ULg<#gPfym&Lou{Ol8DWczBw-l@oRE!@Tr`83U+GElSbAb6 zKR3eIYcDxyrfm^%O2ucd29(YoRXhzdb0->qYO_Cf4G8UnR`~)@rAupHW_p@#71CkV z_{prn=P2A&b>h`vAJkXW?0W6r?`a=$Xg^4hjovFmH$+bVBKh<3O zvwJi31jEj8O>ZZ**vpga39YQ>nmzykF8qZ7rJ2LuF!yq0=QXRTw#alLZ6^t+gerlS zNWSS2p-Q?k3L%u~E=jseiUgr*!sww{df{<5v$rfavBI`ykQ2x$E7z9`n<{r%%RO5P z)q?!mwd_d)Tr}N@dkAI>^djZ-sbQyhAozfd52@L7U8c7@tN%}m^h0V}l6omfx{2_V z^eRb`D$55wv=-@sBvGmg3l1F$QC;%TCwh*YZ7);4X%&q$Q6C)aHOs5ZfwfY{2Ua*% z3WrBc{i>Q(Rel%yJzZ#3R4|_R>9Ip&^~i(u#8!4U)x;genGbytKx0ESI1oS`45VRk zH9J+P!6&l-_|T2|o3JW#uuN5JHuo@SmnA6wHt?q&U})u<0QgyY6iL{3>DfVjcRzrA z(6ekla9Z3TNzS0?J)@kzM+&@!?3XM+V?){`N&K25?kuB~Q6ATQ#N)6S-rb9=V#*$; zR|Hq}!5t3yvS*=VP?h(9zQ<+vTK$mjKLH7DqMg?-wCTL!39ER_hoKR$Eck?##=o*; zg`VWd-4edgY#^RQ!CpWOiwEtAw-Q21<0Agia?iC(7#p}c-{SJAHBGN)Z zLrkPa4(f|knHlY4Mwcjilt7vaR~wQUf>A)9P(2?yp5iEtYGACOKHYI}H%Tm`O&l&Q z*nW!U0yzZgNR1s}l9bbsAfeuLJ@2P`)&>_H*!!M|JOpqDcbf#l>@lo zInHqf=t$)_-*jGbgi`^h(f=?j!h4Dy0!5F8BA!c;)>;vHqsU4iM}Y7r{OrwnATCq( zu4mkPVA;H*`yjm%3CJF#s?XOU2hG#CIsvKD_*5U)a}V-!PxlGXG)mAX-$My`51vVY zsvhj6FO`qI(kL+n3F{Pvpxf#*uejx*)68HEHu7F)^@O#+aaV58l=RWmm_5O_-AVHn z1t=#6X306q$tA1EyoYt%VS!tBh@af~F0`cRRaJzR6rm+W&za(ANg1?MBp>sN@g%rq z8LnFLF|RmNqU;ULJq)A_zAL?D23k_UK8m9y^_*33w4@AL@(3tp&{Ce9iDJ0)g?&R* z8Z9Y~OJCS$MtNu{2U=3VK8m9y^@de^8!h?xBm=z&nLoWq86^Gm$YykuGC~>Ig_D6j zNk7Oie#@@iOPhU4zVEP%%dTR~Qm~~0qx~8vF~%$fU#GVYgLarDyGV1v+7$1kgL}|3 z6Ify_JGfPPCNRI6cVJbzTjIUT4(f6GAi0LgU|gRuoq2l5w0UAmVWC&rU%K# zPTyoS^3sD3B#8k1$^rPRcf+(6`hI_p3|Z@C z0T=e{&hNygf^2LBt)_sr6m7jATPAVf6i$api~=KaanIoZv71IvutFC*7VaQPLTL68 zQ|P!PvFT}X4a4^i?svr*_gF8r~h5#%;W`c+hK}bjtMiVeXhJ7UQ zPJ*T<9`qh;0b^v^M*6=XIziAi7j)KNaFY`+&zvcHmK-nb21271Y{4s!|8tEK^~{u3;|;lCSbq~2MuCVvvK&U ziw`}6z-2p#aFRGm52X+MyCj{9Zpi(gG zw)^Xw{hePA?msyCW5R_0V^PBYna-%$_Q+(SQeMFDL>r@=PwF3P0}sEHBdX57S80_;0+%uDN=0dGCH zNSqquy%xT9w(x)u}b>wRFwGZ0J@)&Bafa{vv@)vRZ2 z=cqE+=2pvc!^Ga8gS0QE=eEs!HwP&PjG&`eNoUbP+AYF%v>UilB<=KU@~hCpxyJ)_ zkn#-m(@=%ksUXNoq^CMex{(e%w+z37&^^I+@FwtNut}vt?@D8}W;JsD29a{~M05$VIb-=A}Z09OI*yb3^GTFsG zorAPT<$(LuGY`x`$^|-T>s`|2bC7mSwjDhT9GR2ndTl(1SsaPMHb>IIHV03hfRFh` z+5tTXJShh$7wMp*z(YFdDRvgNeZ3F8i|v^X9VM-?o9FRvYB26UE_D7Q$kjFb2Y;z|aZ1eTx*%6tWqaD+ez$0>y zjARjJ;H;9ap|&;-4Pnn_LBkzlh3~eEmRmWlcJX;cKVHg{I+6w}7vGr#xK< z=0)6KRd2iEBkq646@13|uHPR`YrymXpn`erlBp$K(lq?*4*u=8^22F6%N=JY{Ixr* zI3w~1JM+3L)~>-d&hVrw{=yvZbjerdbvNjB>O$Z=GXNM8-nuC!9me!90spmw-!?_< z81lsVJawl>?i-H{7Xn2WKVkm)U4lG>6mWiKy67=?GwXMB(%u_-2r%N`PfU_&KJ`EW z|G0zSHc4$Av~eavm(Exa^3Sms5KtSVC5*G=-2s!+!)m3t(|xt+wJZz2TC=bEY~iH=84++&#+(hazI4$D zW-R2uK%1aa3!N9gQT2ztYL{-?7&kWPvE*br{2`x`4rHTwh4;P0wl=Okwze#pqj|Ky zCva6(+Cp$T?F4BS8#}~z+=OwUJ=2{*W}lr~-F1u2GNzV2MsBq=12)iIGR$~Fx1D`y zXGUhs8fjH%?3cC>&sK)FIs0S_zj&sC#-6ORD(tg~``UG^EzhDUaWlNH&NNm-?`)aU zX=gHg*ToQUAs|44b$g^^5Nt3dCv`aS%llMPji$tHWldyAzhJL`f zLfg1f3ZhWs1Z{kS!(LmOm6(c(03BD@@`sSnIu>}dDyR|Q#N=i z{3Vr>FoKViUA?~rlT4E6=6K1l8-je)>FZHeJUUWqEWV|yEu;$j^?w%W#f$3)e!S_W<+?FF8Jp6AAqoI8oPQ9!d{4Ww;AskTKb z-LZvQw}kLH!qQ#e5s(G}hQc0oydet#5d_3lZZ_c3o>O1XdJn#~v);9)*C+N{+*&;M z!jZ8MrFFga|fi{NkY>oSDWe>WJG00cZjJSF3K^GVw(1%;5wC7Cf z?{_xz)?^tXq;7wpjA+jti>R)x**mM;&P+EZ0zJFd2VK7y<6bnQ$Yge}gMPSWMo*ll z05R+0sU4R!^&Rm|!l@PztO<9nA9*Ieoy~7ds(Y5NPrHsW$S2X1BAeVN9rTOueQDwO zgYcn<(uTPIh_)_wY}_FExntK~^|0$NV|Kk0e&`sasR$kCF|ElSO_}!4lko#B&)HXB z((;S_c!)3Krxp?Pbrc_{rd-gm;~wI11FJkoJf5ToQ5~sn?SR1NwJlPqeZx!yx)T=a z&V=<%^$IS(BUvY@UUhI(M|7L8X|*3q4J4eLbg>)L0p4adR5RS4q_Y*78GpGhij)nx zYXW~;(gfa?E<%in?B=4w^u*bfI2)LYc@1UB?*YUNj~4RO!J1`T>JZPwC19g@JvfWx-9r zLmhDPl`Z^a_GrlV2(f&-h%P2@RTs^rFVM+#*D(fp6-|l9P`Px_*9=J3g%Ff&fV|)AuR0%>wJ4MrS2a1j6(Xy1S!DIN%ByTF z>pb(l-^8zFAuH7~s+7`E{Kfq$>Y{9SB(K|FxsYX6%4}SgMa%ZJykFJwwn}&{$+48G zC@P5&xnIS&lq!?$pvt_eWUY!?wS%gwGHZJhRjCl@ijSxkvZ}^y_ZX4;rCO4N@=3Oz zigu!9DeGdK%et2BT*)I(34cW6wx||rtViU2$-Hb=D9dF#9Z{EgM$UpVE0rY2Ln3c- z5ss)H%XZwk)FZOLq$1D2c1WrnK|7prk%_9#+m58j$F-_UaK&9q?G_YeRo2>v(*3I1 z;rOZY9S0Rf+(m>mlE84<#A1W!^L*n~Uw)P*G(5h}uIV%Bmp0KuR%cf7POHcfS3z zuGN~+nKpv?V)LxN|j3F)KJ-eF7v8gZ6Vvq z3tBrrd8(j(Gg;^nxnJ#=io9wm<(hV?EV8U!n1cQ$Ptz)IyNS+GJJ@oZ7h`>n?63BC zx1*}+c6%~f-F7lXyAkc=+WXSZzEp+3*5$apo9!wJjL7{GJY8dSCS9|g*q9{G#5N|j zZA|P;tS7c@+qSKVZQHhO+`Qk9`>)UHwN7^*^sZA?d)Gx?$s<2C3!du5iUm@ST4Ql% z$CLWPrMk}8^<#OGgY_1Ie(&n{6YDIH3^u*AcIukR+j(>@0NBlUy<>k8|7A}&xq_`S z7Wzbp1a+f+QaL*HD#p63D#Aa}q15VVP%kmzJM&+EmFr3?Yi6P-YNNx!R?>2Jx#{>~ zXR3R=*T~y`U{NTuV9`uzNvAc^^=m|QB#uT7(d=6O`ja(|Tg z){)e{H1%oI@ze9>%wwuF3%Ofy&zZ9}$@eJ|n>Z9zvDUlNyV&tj)T3||-!?gq3BHuM z7Dn+TW%IRGg-m`>N&DxKG%mf69ea#tlpVl4xQfm;1|2BO7aiZIzIL2*DwM$SeGrtn z94ySlR2}~{rd*jysU33yy|}{0?Mq;v-L`WA$(5|`H7}APfEaXk&h5|!dgthM+-AK~ zIhuA+=V8XjL8oj^Bvr;Bwf>+m-);S%lU!H$I}IZLDo(KXD+D1ba$BDMJR{SpV{pl~uH#db#7 zmvNn|XJ)tbI#sW+_S@(>Of=m8(7GV<9+uSXn?YsLb!TO3NTw^`TtKLoY}EE7*Mw?5P2{#BM?E&nZ7^cuof6uB@nf^> zW2^Wb0kt$Lqnh+o@c>1(Tb)7gO zl&)ajp)XpX4u?GVZywn(PaN7$HR5`D%jV}0gGHNIAi9W>y|gFJHs31U zx6Goc30-&jjus@iWTzqx4_s3Kj0f~D@eeOX8;hZEi|M~*uz}n*lmn9$C+&!t{^Bf4 zwDV)D>b(oJF*`$slXca!f_KE&3qor%iId9vqyNIzTT0rV++%zYuQ{AmPU%qSdV3-D z_|vD{#QWYRpPE^1rI0Cy3&mK`=2b6x7plBa51baOw7obY0!`;ku@|1mES5qa+u<`> ziDdgYbP?TbVn30|yB0U6yaJ;}ba6_a-phi=EiZllJ`5ZEXpf5P07mzped@L`omJ!@ zr0*uQEWQP*p4TMAqv9bUC(O5HtuJ2XtuL~7r%ta+Yx%}=`>o16$qbj}PNzaI=xYGqsg zYb1e_w;y5FnyyAVF#IitER{h_jo(2;>nf7Ps%S46xKiP9|EAsUE z+rb1R?H3h0iMLlRuC9Wqic(Eyj}+nQ_ReIFDjJ4$HiE8#^nRw#P%y7cGsb{()?$bB zJ(BDOj#f4@!^TS)XN5>;OC+XO4l6OFK_E1>lRNoFoXwtXo!%m1ypZNmwjonpF#y*! zjqO(5BzZf$#NML^i_<^?*)gT)oI2XC;UeP4jPnYunjp|Nc9X1km?m|1W^TVJ_z!en zj!zMMhTcTa*;{`aB0h zC0quRzil>}(5==oM+?@RJ_Xkjz($Bmmh~RjLbKgEn&sRO?^;a0le>^Hy!ck6A2;d+ zDTdzO>Cbd$K|S(yx$~wG3y0RJ-mrVYFM_XE|E-xjzqHYo*!q>eTkNqAy%y*qvE}_C zX?hHR@^h{wQwSyvde5-BB|bJsbXl1*gmxwHKx4ga^st~#MVy&FGuezq1_70642X3{ z(3_c@Lr{JnXl$MOuA*qn(%xq_J-OWRwz=fSyLl7>qElb3F6%d${^RE&Zz0jMd$pK1 z_*bQF@OaB-X|jw@NcSY2pJevE0|LaL*V5sc!xG`L%#_)TmIl-lrRTd~&662DpHF)z zQ}*#f@Y$qL&y@edWIe7?(vL%(%@(kpv>QCWF5HL}Af)Ce$I5sL%icJ8t8q$UfGYuS zVcLlfZx=#5mM_~a%N{PrSmR#o)lF&LgvP z@h)rL+HM}}_=({xmE9xdA*~znF1+4xaWnRPSGPuD{+lwBa{SwVY_N240$Vr1?kM`< zuJlosm5w;!FhlHTnKW#%PlL4eQg^jbaJU~cGp=sjTN5$-=j|=_N7h~B3qB)8D0FxB z$s#=ho#!j9&<$Lku2bQFF1OXvOW8VrwOr@ReUI<;LZ*YF#ka;Bpy5VvD#R@)+{6Z%V+ z3}OoOzN z$E=_m(?U~dq@YqwSk0NN=YB%?1x!qIgv*nm*r+B#cZAbU7Bu{wo^p_fve$IOIQ3mF zCj4ceZ*2TNn%Q$atZabQHFxOS9CdO$wbe#1^RyhMYA{8wB4cWQ1Xv7}2*-p8He`w? zDjOIOn0f(R!}-D0H{y1vlgc*w%1AYZQ;ja93#mROf{Kh{#~u@D?myf97UG2eYAkt_ zpc_u8Glk-yJ$vMC6wAx>=GuJEHpF`!!sKh3L%)yBN`GTXVouVEW6^#4a>BU~9xB6) zC|NaFxh#WMZ4&|hZd}eo{WjZ(>?K}nRFrklE?lX~TP=>X%F2{307{IELmz$8GGB05 zhE4UBR{@Mc9ha(a&<$;ilX*O|RMl(s>`CmWBJ#h!edolFQw+$TU=e@6G_gXGX#b6Z z8LXG)tDUz+82zp2F*%G7$ZgiP@s~5UJx%rKYz)P3h&@tF)_v(e)o|8=-YHe)7E4By0IJ!D# zdUqU7h#kesfCl6{x3XRZ7!RzPaIOM3QYG8+E@s;ssCgcu<+syp2@7Q~@34;iIwU(8 z?Hs!}zW8e~$9c?TcG27>y-yh`O$O!3n(D6;KQ3U%V-~MVKrw1{m75_N)b7u_Hz`of zVN8TBVTj3bT)&KSk7a>KL@a?lbsLLLvzj^D?W2I-HLMYrzI9rxcMe5k^qBN%z}$TJ zcwf~j{`;<*W_}fh2~{dS){l@CmqX&n+f-}6V2yb?1}reC)PHzb5t}RM!gNh+XiASwi@H@;?YJ? zdPOelmkej;cx@zjp^CJ-ij$ze;byO&XH)HC`i*gIJ!+=J;RTE})8Cfvkf zCN)P0?sRyMp3b@1g~e`spM!za5z>P3tnm`=qUa5nw7TjandokMGRE1f`$jc+MwqCe z`AZ3eCA@gPC!|u{1C^wnZS%2>QVRpIdb|AP2A!5c?AQ0KTSmd`&mTd){#({QEiC)E zOsoF58aOJv%t=k|xY%M?{sS>oW4c4>nd>_}6({a#3jic(*+60)jJ4lb`2!_L27N9j zK(&iCdLmA5TS0q{eEmH;CYogOL^x0rF;*XywIR}QHES|rLy!e1$}_$t$asj>SQ~(m z8wqJTLcCO({Ii<~Q&c7Sp_fUY^U@*wt=zaO(9W9X+O@>hYCfyMR#x+uMmeWd&@jz# z@T4EN9#$cyugG=9*Y__8)@%GN(-M-qI{WjhBHdJaHBdF zo&$-72J3o9^UPb*rv3)R%-n35c@kv9_V8r)$@L_;JOcu?2wS;u{XCpE6+Ac#$vvdbqlLBxB z-O%!W0r5^KX_Jsf-B)p%?c#Y?=uNO9`2hvS4T{z04D&vBq!h&Yh+eh?@o4`pC~0iq z;Px78io696tXLM0T5?Ju7i^~IJ}_B(bkLk^rdW!2A<%UZ$p`K(Vt)a&Gj2D=#4Pta z*(`uSm|HYAUcVz0ep3sDntpmCCWcAj_*}pGP0nAA+J)_n!m)m<=#jAiz==S;7{B4v zaKpPG%1`a0`hBNSk$9)U@2R(4s)PQjOM;q)vyGn)S5b^w+$6#IywE#T+b%*=((e}A zEdjqJP`Z`GgfuQSJ(1Oi~R}C-dd)|_rg}fPhbKEN; zjhs~JkMu_lxnX~HOmOT%IRg#Jvz|$Lb>y1G_*bwdSo)C4BJJu6DjM&T|B{deW!60( zVUO?j@V0yeyiNhFw+#Vz!9Am>WHpMV%TP}rWVFIE0Smkr4tK;oV_>XKVDJupV^lu> zc0!oguP=?W7Vo1!9bdQ4UEhqQz}F$cFE6go>hUlly0+)8y7%bXn12a;yI-FnUvI>p zSJBU1-;LAfF7+3=sIRs(qw5eX0 zksZiA>Oa$ikMj6Vt;rPSz3-;^xyQn-)k5ar!S-w_Kvn{$8c3flJeQ`GE~1;Wl-X0U zvScT=B44=ZKdY$ZO)kJ2)yv;VM;sXN<0~CinrO(?*P71MB$ST~k5T~Yy00HlB9K*@ zM1UE)#(za0%A+*cs>->;>&>)l-U|!t)TgbL)pf9gTVDw+-Hsbp4OAme0fPqK0Ha05 zxeIzmMlRY_j!@gm(N^t__CjsR1;p!Y6hKQ{9Oi_ z9wRFYE3Pee{Oc%NPGX<>@(;X&#%j;Wws&JR^2df?6Y|9mV-m=$*xBm_&q`xM9v0#m zgpWD|m{wQKi&QZ8eM~c6lY*Cw4U*qps?CG@%_KZxvXAU=D00k7Ueb^T*i_UynlLJ^ zR{pY;H&B=*II1)i=RqmAe%zY&bxMDI7fA%4q1sLh1doI$wz)b z&u?)?M)!#{tvJ%Pj0Opy*@P}@f%jUBuBD85D_|v%b$&1-;2K+D*K$~)D0gS7wC?~0 zXy+Rf%$y4`Vh0y+L@Mw7Ia~ymK6|8iT0|CVC89_*(wRe|?j0p8!&NatiC`>=yEN}2 zlT$9X`1P7%&USym0E56*kgO9QU?MW7t?*as)q=r5hP6ONW7dz>4D6TT*79^wLPL^G zH?^sy-D+UmXGzJDU&Myp>NMpCa4X4UOlNLtff@*Omj+;~P0SFm zDz%Y$E`@<_OARy!tJnxgv6B0cdUleOKt!6#64RMI#x(qbOV4O58c0!CBK@G@t099k ztRW4Qii9ZCPMIAkH{&WMv90Xte_1~kS8hlIAi!940T6_blJY)BZK*O=BZ_$P53=Kh zO&@dVq_L#?t1T%^UWtn*v=v?LEhE3|u^0a3Vpg1NA2zdgYb*qct}wAe-PJPO{#6XO zUtKicl1$>$Sc7@F^ zV)+psTf$tDI04X>x%8Za&_m4c@4-@DCFm7c*Y5gxuuHb)1`xGi1;|euD`x%u+6?Ir zWD`(^ARgv(C8jY{^WO8MtIzRzJarBtvZ_K6pqx;vWY~>SUK#E|U=HVq5N^$!_9QmZ4v-_bj`#p!f&IOW!ds&Qv)pf-@V`*OA}vqQe= z$0Zzj^PGaa`9KVnhRGstYNCoB?Bb+c-{;^XJXgX3fkOst1e4ht_;6}`QB~xUUKp&+ zZ!43Nhd;4unTDFmLCV4nY6N1;P3j`>afLuSq$7@)k}=5*8O=9Re-R~lRC^iNBGP>r zsM@nz{vN{X?JeJUCU-mcc0(C-5w%6z$1Jq}xw4q5qA$g*ZF^2kwe#e8YCv$Zl=V_A za^3p1=={6Ftcew;ZAydtF1y%TD?EBI)*!3ahS@@sFUU8)t(C%qxs4$;w4Ytyxea)q zF<=&9PECQc)`+JLXnCq^vJL2Qbi#e$iqhw8Yh{15cfR(0JnVkFqcK-XTa_c-rnDv9iX{bCK@X7#?gaEMwtQyu5c&u;gjE9%qS{|OK#N+{@nGJ6Yn#80V>BZ96r)2pMpdNQ6 zvc*f^n6Gqk?ull$vM|t-)HbENGLNSuXl&dN(MYQrv$mEU@-weHt~JyM@gY9DS)3wzJ@i2AgOdRELkuO&ABqc_-A z#8R(Ivw2XnwG3mcZCX5I=V`0gb0BF{AT2W~GQd*ZI&gbi`aF(=^LfT2DpzXb&~i@) zpNRgf_Zs4YeR9Xz0O5xEt@9+T(g&%m^EGrbZO&lmYPF6n+Vg21?y~pPO})51z339V z1lU5GMgm@2oz?O2I{PS6*};`a=&HuYG`Jnw7h?=!;iUkxiM8aUzqcmmAm;jZc_dpx zeq<$M-%{Q_N_rWQ{x6t4wHUhamuTe*|xKgcS1#5%&REBkhy8$REf zv*I3`EOKXVgf~VW2N|;G8f7^R_!!g$RD72()afet+6TH1-oL5;F+{-qH~F1rpJU&! zxf>Bmwh!aCRAV#fL(w4Xjkz*LXr6kCSNIt!pLM^Mm$ zl(6|09TYqcJd%ifE0W)`t``2apKUYT@z{RA_s88Z-+HXaU88rqh}zd6-*)c%edLoX z38B}|!wW`${3)#>?@}*Iix&9Y_-5KS^WPwBdES)%a9wk0(CL6)gByLlvrpc|7X;5z5cI` zIpsd#1+Akem(T-m0E?Thd2p!)Oi{r_N@t|TlFdr}9=@C5E}712b=nVK2p6LRxcW}jL8*igoOB8% z`(5$Eh8w3Czul9jvFrK%vsmG)5pk=R`Jn)h?oDwm`ep-EDxmCpu0uotA~->GenN5) znXHEy)gdyIB=o_?nr^ygdaGU@q8|v1HIeJD`ONQ@78_q^oIzUJkY13qX00Fa0jIa< z#dR8oWbc9_&)wlCJeWQJ=0>7H0b7wR;w~90t6@DiXr0Wh} z9o5Y6G6xDD+*uY^*ItP^Vw9qw9bPs+rOXBWH?N*te$d}fjMH7*5Olv(4#Mz+jnY>F zFWp7uF0Q!vtRRpR1DC{HL6k|c$SI-hy95=Ti;9@)lcXvFsfc7dag-eLivpz6)zwhm>k| z=Y?XlK(z4aw;c*Q(IC!ouZ2NJ0gmlv`KRdIOXDZT_hpC_a}dZi*_e_SpBbpV^1lDO zCs62Q;c&m%P?N{!sUZiN1?Q-%6xA>Oo1@wuoyu;k3U>6GR+DeK+5pzm70i_EbNrah zbHEXq@EgG?o6Y+ZdM*P%NaZJClas%VhL76O5U(rT!a5G!>wAASC>MKhnEB_-)W!4Q zH%Y3DC1w)VmsaJey$o>d3%Ez5=Iha~k4HmH-P;M5JXAH?nSMw4``itu)%8zh>20@_ zL!WaZmo;1NoeF$E!=UE~uB%5#k;PEitc*KfNVD4tVQ4v0GuyqvyNkbdmM~mm&*ndHYZm zQGx1DeA3WK>Js!3qYaci3>fu@{oWMGwOj#JihrGDpi88Blm!1o)ph>kD9X3XO<{_u zQPB=0E89^T3}Xz*!B{IfNEX#Ndg2n5nq~fK&=1ww47FJmh^}aa^5T?WlMDZgJ2>$~ zA@I5#ei?H^LbE)xs|~JG*KUmW&gFsD^IgOH7%WNk01QzYoEC`ptH?k3PlIO&x=C8l zkc!M1h8G(L&iRc4itkeJ$;vLfQuW?|cf8j4DNARl$s2$7|!9{MztPKo5QO5)F7RJ>s+ z?ERwLQf89izdhSTd;0HbA>|p6IU)UN-Ze90s=~f($3GX>kSqvpAXReigNb_D-7d+Y zNXm^)H9G2clG2Ebx}?qhf|ku5Hpw)A$32rGa#ZGO9K;%AGDfmXMAjCaIwFi7j%#lf zr#|WP+EFlbvxLUJ`=i=Bcjle%|Im1X!55F&HuIlZJl~0i`}4*7%1tGTmmNc6811Y4Q@A+4Lnf!!jRl`I4BA` z2e0~NZx`bJPdf1?WF(lUH@>_p;L&+ z2Vjns>SHL4_e@a7c%3G(JuE1}`@`b)$WmlEt7-O+tDo!WFhGIPiy78&G(%}z{D)Jy z1W>9uN*|=YF`B;0D%o9{YXQraA&iOWtla5D9*NO!Tb==OWXw_9^c-wbf)qSt^iN2) zfppf7(XLetV8d;@GSGhJ zqOZnHT{81=H?4qHWIkNxwHNx=%r=;|3Gd%3wBk1#vat&`t9r0g;kUezWN-@(j*x$7R#xQ1Y^Xx14iwo^*yEj^L z^=n4nTO<)1!$;4;*soJK{OsprVF6Au^It+U9xVT1c3#g|bxeG3dX}5T_s6t*CM3Q* z$-gXaxcbn0Ae5kNg`&hzh{q}kb=1OC11J;b$1L}=CEA5-`c=w8$bWUxQhya~it{w6 zGh;oQU%pTwJ;V&4X1+OcRtLfGW6iU4>%f94IOABRyBAquEFIAQQ6> zr3slTe1YP$vFijz2F~uKhKUxX5+}`2k~mp9lnuF9V^>xt2OVwx_$F7$TKai@ZB}7;kQ-3(PALhS_ zp{0HnS^{i^Ivm`AztF~)=kJ)aR*^ZHh;n;^C~6n(yfPXZ1f1D~LoHiMZ1ejLdL2}0 zo_FbF2IwoMYaMc(k=I#)_IgyJ0t2vDl2XNSoPOm2tVjP*kSp+N(bU-5@1|&sepRzC zYG9O&(|VVQ;)7w8`UM|6r&eE})F9OS-ZStavLa#lNg2$mef zMIFBnEX9BTNO}6{NpI1-l&E~ajLPDFT#9uJ`^P)q*x3LOO zmGlZ{3dEBA!l%3nf%_uP;Nal-f7K$q? zTn~$WTVO&MKh0q!7_~%;H11$!GfZMrD?ztU`A487#)JnhHK2;^qz&{y z2A6mEfy7ny6zgw5_Z{;!{An?A%Mpi9R#{dccDx*J zWGVJd>oL|RErf1G5AlE>CyRPz)S)nR#dogr{+v9Km464$F z*);)FUUV@alA!47+{$NRz|6x z2!&Bst^EO81O+ieu9A^U$2+XLr;&@@fr@oUX7Qa-fA(aBEI89it=+I(>=MDNPNe4v z56jU18_i<+{>mP;#hy2fwQswZ9P|Pjl>tMz^M({t8JeEwLcJQ5VxaFKt!RlFhWp>S zI;h1dr&i6}{VAF60%zF5R^`YN1wi~MlP*sFfK5bTIB7%)%vEsGehR&aWIVL+3Yq{F zw2)(2Es!`T@0jqk|38Zqg%t=YQIi*5sOYNjZ3k21Kd*wVkoV8HQUAFPlhTktyYB+x7DS4+Inr-uD3e+~kTp-)ZQXjC`SX{%t=A|wNq$fhHG zGV<_>$oeJWgB>h)pMmW>(eiAz*iJihtn?;cRAyU4l*YeuoyD|$Q${Y*xP)Tz`Va6I7-QU#s(pd$$VH%|q-K*5u zpVSC7b?eQTk|dO=hlZ2HBTizyHNm4K@~CmpKNBDH&0$7&3uSPq@YWk&-BSxzVR?5!|bPAG0*AL~6mf`ga7P(@BDWtn}8 zD%^&cjxOIsj__-p@&Xbh=}=iM7zV>FspL9eD2y{XW#NZ zSxb9|E`PU*fD~to`LBN1DqSIXmtGqD%6xxwcu-u+~HbHuv1~M&!)GR zCgg-tq}l?jGwyy}`rH`JPT|{hVE96r01m)*dwK{=k#o0D0lN4~kBb-U|NIVztCKL%J?}q<_^Q7_sw5@{kEA_-v>5Lc`#-OQN_DG+_DTwps>2FI zM;IXDP4yb6fqU!vpG-!@567-v*-CbnW3;(~RS36IL>Z@~@wZ&qyhy#xJw>+Q-c1H0yEXj~fA^uQB zfJWrD2t`y9x(A`W;GntU&+#4U#u|r*rY?riFITFXwi1C&$#WlWXf0=?|6x@b9z=M5 z4-A0DdJZ;;4(cFGfx!ry#lqmt@}~1fRtE~7248BLlMFl6@FmvnMm}G z8;aYC!OS;Sc|hlG6{0i3w2O1CZwrtA4TM|Svx*N=nf{>0fGFu!Y;SVRZ;{n55}E5( zkPPZ5X(*E14M%pF$p`lr_)Fobs(MnCOK8@Mdm$gZn^ZbibJD;hjny*G&3J#jv!NuV z$hPmeRa)wY3ghZJ|GZ~EZ8?{(>zglHLR2zn1|fygqDJBi_zvg>0vjcxi4n9Zyp6e#Cu4?*wWk$X zNWNP$kyclrKtLe7a$8K)rrecEZis=$YN!BVErvo@$m8?SHTrHX=+9`{pGBg|L~h1RRMj+_phX6Y+2eytUwwDYB*?DW5(`A8wvBWE)s9YQw*!fFZ{%vY5GDlMtXlV}8HSf4mWi`SV$JKtAylleLMs#8;hw!x@yBb$@&GMpuuC*~_I((qTZ$K8AYl=Y)=bT~~_Sr5Z+B?exlhc~Oo5 zZTz^Qx|4kQr*e+v_OwuyS$)8$X;8&R@KW*v<74UV$wXXm~xvhxJ4lv{e z#@$!QxjXqQSpxUhh|+@rnPGs7>99ZDSd{(8ELx~o8gHjbEZ~?xc9P1E6f9s25NN8u z$jJWLGjBVn!{u<#+cL6Rg0X|8iuArsjwG`{UvbOQ+7yq#gU;`P?MU8%`wM3+cZbFJ z9;(r=!8y>x;h`7*>RZcZj|vw8${1L#>gCT)MXgnwh>!FgNL|FTBHn@YsZj6paNfXA zaFkIROw-C)?0zMASC3y9ax+OE)|WA+1-dmY5%7uIG>A^p5)m(nUx<7Molyge`1;HM z`Zy9ZOR7bZ{mRV}uX6ZZcf(&!8$u6HJ=FxA8Uh~eZupIlBlA&ljnf=Wb9w1Fq&I5b zJsC?C?9&Bz%{y6D)9!d&-QKHx<3l!Hi!dJZT;<$pRQAXD|yg5 z?7z~LL^9G;IICM4p4Dv5glh$bpO;^(`|nO(yxwJA!NoO^y}CvA2e2>pH&*8RfSkqO zC+!wy48qM4|2_>|Lh@99l8Znq$FYWxr2fyY>@1Mt7b=Ca!qo9w^`D3Qi(D;AKT zCt6c)Z%m7SEk{_iFnt!0zoQzr{2RjF;uhCwz?hXvS-Lo{#l9N^vS!YJjEJ!<;q4bU zlz^>Bu;KGe8@W|1bJNN69oCqDpyZgG#QOC;9o?6h6tFXHCRye`LUhlAQnz+KCbX(L3N6j8^jlc0uNau- z0*7%Shb_?fqXv4WHP4BBDn(^c<=r=pdqko~LJ1hh2<4F;-+GTVGmmd@7qUv!>XwVq zPs`y2$%t~7E^wQBNPeH-0(4vJCl>{}F5=dzK`hd<$X;oTOYxtyLptta$40NvAf7Im z`mEnBF(c6XUtB7Qn*t+_dbJNZ7UFMRgua`QUd4a&WITP188LB#5YVzMw;DFG^EE=0 z)&vTG*{3S?Ey}}ht2*9#rc46V^q{8kZCv*SUj!7gKTgJi4=4^sy{cEjblAni_z)HH3*7}cT>dk3<^d&CB%)QLv`3iKP`68qRhCWLp|8ZY9|;* zz@qpHA$|-AJK&&Rc}q8pGbkjXhPp`49vSEtMTM$ylVNQ?>mjX;lS*k^M?669a^TU$ zV<2#JMW_FGnj0=h3+4s3qHZi=N*X5U~WqMi=cS#1~C{Z8ltwS+&IDNpIBjI;62-RCbbSn=no*(VJY@ey z7-kBGygJMFs?*M3`%{M8Th-pPbr5$`vT6-_VTVWxdAxc?a)vbC$A9+SFl`j5LdMnL zg5~~|eZk!_0j#4uW9%L_d6sQQ9S+H<55%LX5@JSIp+g`odc|cWYhC8#-jr-~#ha(; zL3F&jK>WRrGuEj)s7g1vT!Cja#r2lJhvIHC0kMewlEzx5pEAHa_cj}?{|)scv=}BI zH@<%_<*1nBvm$V?v3YHp71v*i_c3C;`)8AeoXE>-k8jow2++=m0e~pPS5O_j4!4dbyw2k(2iZ- z%L@;0;IjZlnLWXQ*PYDv_1IF1c!%ZVacp+a-e`4~=e7@;E{}*Y2(3xtn4x{?2fO$a z2*m-?0`4L(zGdivpzzn z;d~j$ay6DK zRpK9!k#%s#b@s?)r-RX~#g!AfU@_Tmx&7+9-3n0yYA2>aA4GE3vobxDx?}~?`r~b z)C!7Y+=JvLUl&FcN_>kbb{yDqRu$(m0=j1e)-d=3KMoCAvI$jmM1% z>S5XG8Lls{#3!lpg0XB`6r`8f$o?6ofd~1%oJ4@4^sE0brSr~#x&dBpg}?W^P(IyKR{71EMk(hT0@`WmMj zDxOIQ+>e29myGJTv1zDIP#v}IC=**WM??i<5U6O81WOy&B$B-QoArL;Gs4ohZS<@7 z3A)Xl@u7*Ug7oN}RMkxs;dKKQ(S` zR>P054qP3^>`LJdRD56K)Fw%HqDVuTlVd~s6zXST2F4WbPGLI6P~hFU%Kk2&Z7k5L zStfkh!O(ibM7d&yJ|(kNJSujzWHQ{k?f7U_HHEBkuvPQ@>(9GC(+1yLe=r7d-S85+ zB4R%(?E*`>W1l*>yH}rEp7r;bw_ilb(O^%8yGk(?(Ba+mk``~RA<;LJ@YuceYG9ax zPsB-Ar0I!h&Ya7-5N(WE{@wLB&&xV7*n}!IZD`qbzZ35Tz=_}d-POv~&?N#fB;xW~ zw-f(%g9@{wH%=JG_*YlG*HVf@VbpUt4J@90GAs4 zMD1oBcC3&2bZNg~$tjwX00Ne4o)kVfIRl{WMgQ&D(05Ek%h=ASSkze?GV76my(inC zh;Zg<|JQnK#tgzK#oGGrgL)wlH5Un)vle?3mh}kO83lx%s0iy`Po*yQ z%A;gstmXb`+JeplpZB`#P^~;cfec<38kUh~XTS znh-6KU$NB7JhXow=Vcoagx4v?Y1Vj8>ea6hC5p~9Ivt)&X1(D_RPA>1PUQ5B-3uq? zi?=X9^I;#bdU-5g#EhNOX9hB7=uH}qn1qc*Y@AS{m4pQr0>H6}L=NwB#((}xFTjOE zesh3EU-G`ws0_g_6)%$ayts)o9BHYPjRUy^-35?ns@Ix*k!BJ0pdl6Zcg^JbB(~Qa`pDVuLC(J$yf)FS z0fsRU+9!SyB(VCeu%@P=XjDaBa)ZfqHvH6&j<%g5*nY*Jk_P&=uy~|J(}IDu#Sbop zD-6}}8ZDr_UJy&YfM_)cBqp`)gDRgNIqcg2I`x6@g5N=gr(vE?N<30)`r=hN%g$3P z`2}PF5}OaFd!*d&h$7JFeP?nv4xR9meI55JJ>}T!slV8GOvqt8s?5e1m%SpZ&-BM0 z#pt4!4u|y&h&6;vzuuSu_g32c!)5J*$X zOK8Oc8)o_wj>}6; z?3g@LnA1|Meq0LhN(y-i2Y?~nD#|@A`8@IClgt!t!cVywz0yWTD&{Cp$r7ZR?pz2b zZf=5;Fw-lNbfwv;rci=6C<;qt{&$5#TU67WYUiGQ(picT2pG%aptWJ`;J_o-WnTCY38%0q_qVulR$^Oy6D(rvjn?!<=sy8U6SHOP z_MafqM((S-LYwz{XoUMi(=@H*f$=tVkE#cp5n!0Zqqa#lS2MP%>YSa zhV3`ct;Icphj4V<#Vvy8tQ#|fyU1oQ<<`b?j;+Ek_+NTYqXFbmB<7QD>bI;U>2C&% zk6d)f>Nj@F(4G?{1O)hNvhS-1?)zVcYDrhM{o7>tuWLB&7#U&7C#b?D=2&XDa`;af zIV3es#}r_&hGiFKqrcIH6QJuTXQUPLnv1zbx0KrKo}JhfZLkzwY^7Zr&M0x%i(IvG zJ=r|+vnbbDi)_|Xc%>B5B0y6QFJZYQ6w@+5XO_UH|F%ORdST5Ke|R#23e&;6ysCC3 z|42n1qX%K&Ujl-z`m$OJ3J(PQa(av01ycTkiHD|Gqt2Tc+^9=!q_0)3Six$>i>3)$#!q;0%?bG<16Ku zci;I5h-WjK(1X3_?)V9~i3T|L@s;V2IJ1GM_hFTZW-PphJUM;Gmh~Vi1j#~rcy<_C zz8x9gKGo+Gok+M0Y3s0RH0>a6K&1Cq8ZpMA$k%DHg3-IU06Wng2VUDL@3Jy{6 zMxE{Ysagz;V6k&ycCV!WT^uXbgxSW48L3IojT0Kj_DlL1kRl*}+awh6rTh@K1~FxN z;JJrN_Bpl|payU1k3afeBPr%~-^!`;_I`2Q8Y=ShJ%rN?+F|Bngaphyxnkae0TTh5 z3(^e|LYJ1T7@066=%{#XE}%EP`!rS4zu>bJ@4<`UP*Z57XL-dUFfua!!AiFbTiK7rSH*Euy1xSfFbKdQblNRy^%cWm3XZQHhOYsa>2bH}!A z+t%)A$Fn>5?s?wx=R|Z=$BpW)s?NMpU75xo;PjWlW6eZ17Q&%}!ANH&S>*y4WPc44 zJ1m9CW`fx;VNs0eB1?6U+#9tXZ%%{FfMGKOQR@4NMn{56Enw@c4IekCIab7vjd#y% zdFoBzxFaas5QtxLDFyV2=-%*L{=U(4dimbwcbdPw`W0mXSeuj4K%pl z2HVBGT zfpP(hF+xCp@u7><*c51zZZ!aIjeyzrXj)XZ?R5~*w6Qv>`>urXD8dMpMIWiI!*^_X zm~^PcpYHx=B-Q)<4kYy!#N-;h!WZ*J3;aigj*#KBuM*fGN*e*9AKHbH)2JA=ozIsa=RO=*A(5Lv$&V=B~)_5sRcOXkBL! z<+X^e<*{V%D58ld-${7qIoR_Ge7>e(0fIlvlCUX|Uh!MJL=}U~-No<$=tDH?JfbNO zr{X%Ous-=OrUiTF#4h@4=32i~h_s(P(6tv810V%-#)lt_1yQjk#4}PszkHw_ysR?u zB@J>Pc_TYIac%NMO!AzW7o#zPaxz+JsUNlUlG2hgT@qA~ldE(@AD==B6S*=Yd9AQ? zL_?{qL9$p~X}1B%?MwNKQ0mCv47TfJjfT)Cu(+-hJCQ7pMEXmo^!%mjDj$=e@j`Mv z)Tx9}DVZB2b%U(vB*Vd1IERXoYt07Ne3&w`s1esn7h*7|zbOBdy$kd5`XRMJc0zhC zty7^Umv{qCd3G;g4hT-%RV)H$sTlbtDy*}FL0UX>cA7!@;t7mZ`s8o5L0W>jHM0h< zf@At*rG{Znz-cqgH&}P81+AXOQAMJ zh7c!$(IkdFl-Uw8jzY5JUb4Q9lg@k@c}O2X@vcvP`+$BXvS=84Di1VGD@1ffbgkfP z>ut(|JhIxUTJHEA@DBOqDm}sD_qW!5MT(ZiX%H6E+ZP!n8j&LOMI!Vl zMw(&@8l9c!pCi#Hw5ufY{%T~%KO;Bmp}N%zC8Wl*k;fnz^%jYLM)v&lEpI@Pb_avn zzYhs8sPfVwR`wsj1iqu&WqJe&if>Z644=j1XKv^Ol1p*ddLtV02cMpR*|en*oD>Rs zuSXBQ)tsu&E?>lfnyf|1HES-A7Ufu}Ss60AHR(0x0suNniy1FA^q zokxXfLXgf^d8nu4hxf{joxwt4(O1Xwg~@^xm*6?M-hi))D~t)b;uL91cepIn*`#kM7?L*T!2&Lw2hlZ z>No=J4KCj@Pn=lk2E<6RGX1N&DVtC5_Xpj`$$v-zTT7z8A0Q}R`WxvR!!IUoRZ)yt zL&B!-EK#$?3__IPStZn=2_>)m2MP^cL{-hwc@%RwUNTEvM-gFGBCRE1CiA9}$5oTa zJ|)X}H>Hmv@LBB?ovdmVpk%^Is9d%NQI6aQQlVxFrHMs4iFlR~7uOLd_ey(7uDD&= zTESdGDO@lYECgi}(W20yJTJd?l)G0IHIvNn5o?RZ`Cq=Sk8G_kOfIsj3CftZ2ct%8 z!Gcxau}^Tgrdx#Dz7~SzLqBbk@#>K-A6o{*;DI-<64yn9Y%+dMKR>7#eKxTLWADfKPrBid6#~@)#_N&=s=D3baivE<#FH?Z* z{5{y{jo1%KcAdvK+~_R?mdQW46b(vU3=)?4C^~N;4{BvAfoWn^-*PWk(M15JQ;w|3 zLZVcAcppNwPx@tg0u86KjSyh$2@Ii#WU2O25*@|y;|cj5Ory#kv1M7>RBe>H^xrd# z+|t<3=w-1EioZjA&#_=coVk$z>p^tF+dNPvW`FvagKZDuFQd+CxEKNKfr&^2d|W-Z z;_*uO-Da+nONgM<96KdT4Y9MVXmMnCgS_ZQEB9~cuNmj6axkW(Kzw_J6y+=&o^JUA zu=T4lQ5JSqUt}ObDGol$vca7UtX5ZfPQHLR#^CVViqY{qCVPoPkq)0AeGkF3u81V4@-@WJ=TSA1z%9h*_|Y^hfkWhpVC~8$=1fOZ9rtZ z&Y0v8$bv9gcA4gk?l9PIy>S#kDnzl_ExDe6uK=(MFanQopCOo>h$|gH8O=q;;86nm z9(|UEc3Bd!Ik&Frc1TzpE>^8Cq8y}X+7B###Ibijq^6Din)5NmRdR+u>4E3$vW?dQ z=j_rQxTp)V-wn21#t2p?i@PCxF>^{|E;^bCX>Ptv9E((427tQaXF%QujPUzPOOT zS0A*g|IpDtAFC~Jkp|59xBL3W!fn#BqdJt|@-ck=XC-!=jRcfSn}X>I_MdXrVpq#h zF3S=9xk#H_rk{4v zh#(s=Y<3}!qrg{9mPoLGXInrHFNw5ej8XWcoglA@g9Q_Y9eg_begXk_AruhDl?QO7 zFl8`<$C9by5J*hBtf(KrJ%v3ZyH#6~^tThkLNVE4_AeYbH;P5Kb^96H-2;IU-jL80 zlTRuj{_w1-I82N856CmmVI$(&xwJ%%HM}xf|;MOj(vfgBDA_q#O8h=hH-kmMguqe*_M{-@pjq z%5lz#RHp7LZhL7XdV!yy>{oKKOuy)DHn3TmQp6l2hSsnZtC*I9a9H>4Q7rgb$<#Cd z>_D?hVOf~#6_E;C^eIxTbbfzJj*3S`k&u~o15=tpL&cD=0I=Hf`S0KydYgX(xbmfJ zWXgB&{#~Gv`NP^DUe61yOv-aEqd?!138_MHCZqr3Qc-g~<@b{v6R%)*7lB^Dr~B@w z-{vQ1z?Y-VsUZ7f0737^)8Oxl>*d9zbwO{-VyUasu8 z2MKM1z>{L1J=vc+KLz(&{dV!+4G~}R`yD1XzGj-4$wg@R=P*_^do*rbx@Ou2b^%q#{HQ<H zc2ZrG_G8@;BEe(t>SN1c?jWQ8^HTBpHbQ>;;-o7JvAq4u^)93TUH!{(GnXD?{c*ki z;)v1mTFo(g(8|N#o7ws$z>T$2PqCbGc2x*o0`qswnVH{Otio3L+*ZhDx_)hjB`7mi zUh6ay*6e!Bb3w|o1fnC8PQk2#!0hF@p@s!hfCyaW)2h**OFNHV0l|{8-u#wn4kS}; zc!C~0xw8lMRU(zmOc@2iJiU5Gg|+4=h6)LP0mqC^98Ekv+HvG7qLkyd=4y}U@?X#O z*OWgNB7epRcMo5)yQ`L=R==gvZE8^9^#EI&+d51Mh<*41TK3oiP8M&un7 zSceCARDf^Cu)n?;-NEWJ|F!j7$18c3oQ`fgH{11>vGo0VTRd>H`E;1s*ZlEmHaGA= znH`T4(?ni+gAjfUsOQX5{a~UOE3QwgeC|bDT}7kz58+ImIFv3r*^EJ-_bSP5+qplQ z#TK*VgH5$6Sv*gcxlUbsJ!@iGFRhBkrXK&Sb*Jsvf0BfDdp^c_)nAYy+FAchefqcB z@v|X)=!8uGUzl1`I(C+P%XNogabnn%x_;|NJ1TwXOw)5k>S+hnLov;``%PTPhNnRe=~k5M(Wlq&wuHMgC9vWf0q1>KbT-HTb-ay$MX`L_DxgY%jKNy+E-Ve7s| znwq;nUFuY{-0SZhYi8@b>-wg=@l21O4qy5i*Zo^%lhIuczpFj=+&LI}05{mdz%8j9|D;w@R2B24>yn?_&aM9_KAtAGzqaB_ z1q5$2eG*~a46ACAuc?!-yH2j7sJ7{CF>BFU_Yq9XtoyGRxg9jA9M{Y64ZEjWc8l%W z`*yokG`RETXKW?gVis=7R{$&5WYylzAgkO~y-ZM6m3N`FcHP%1yRV>p8n%y+QnUDX z!?4pTBTK>IUxt;W_Ntpewa4r>X?E*)@5H;Gjv%5Dy`$? z_^9>;Gq#t{zXhR%kLZD`^l}Xm{3(KH`Prd}7VmKdzkFrFi;fU_!`VXr|4r*cW~~8m z+nSXh;%q+u#-aM{L-kM^&)*-3_L)&A2$ApNalQW$tp0@6N%zS;It6NIG55h{D5j zV{=uXea)#Ahn0=;vLQ9lP_vyiJrbIR_BY|^Nd~{REIgEPbHpY5+PIaFG|d(AM30!q zL6RaJ+<&v{ETY-ibdnt4s32wkdM`_hn6YLDx9@`OwURGXS31bO-DlEO72K4~+3 zv3==>8XHw>g{d|H^o{|pOnaF0mn8jf2->9fG5qsAnr~gzDdWkBlE5VQH4f+lg zfT(S&v0mA*-7eKNtdl#pSxm0vujkBk;fST#_2V_pF79aPa$UiEu!pnFRUNYG*gJKk za1;Jo!BuDgVs#YDy0pCs7yh3Fsqw6nc>jq$^$v%vVYqypBlyZq$tfmK*0XFtZI^5oh}h2YYmOcDAF$E@v$3 z%Rc6XZr*x_^*Piw=^?qP%wwC-4=b4iI$e=YYnc{tyx@*)60XOk9MNM&dt!Q&l8DHc zk}L$?D9}YDr-0%2oem_iJeY_!CT{Ayp5Te3*!*TY8v)5*Xk7)Ql#tAu>_dxkPF@so z`0y?v3omFu{>G9IGidQz#^sM&ab2y`4aC?O6ge9rJBx6N#khqEIcbOdGv&Pxs-e{@ zrncyujegboy|N_^8EA4;TR)-=e){P~W-7r9Lav&sY8ge-^9kSR*crb#jyyXqHJga` znT&-({yT@@+GhQ;z<}{{-y>zbnub}P#rCbU;B33I{mT~jY8|Xq&{wfk|15`D z?lb{&SSSX|VFp`{@4%A#HNybsW(Rn`OMx{I-;*iVM#@kXaSm%KK$dwb%vWeqWz(5LF^>& z9j8DY{txzsWvl+u@VyNYt{jVrkkjy}JD!!(M0eOYAg8>d+}}n=EztY zp8*!h5O}I;D#ZDuL%D4e1Q(Mi&NkLeDVB;fpdgSV!LK@ye;u(CVtFmK!$8t6G!w4- z>vpB94=B%fx>0cl(xeRYwE|9-G!kU9jTOc!v_o5k?ZF=I01-UsYHcWsS_duZbiajR z5=7a+)HeRpZ}@S%&FFC^Lb+F3Dja9)Gu;wUF1mJ0rW{Bk+d)GvgAfd4(xOB?(JE z9mBXXW2Uwm)hsJPkM&cM$7}#hG#hVYND=y-3w)P(b~ocd8zXY^%pwv@K#i*18?Ln>1@Y0Mc~+s6!u+|OO#i#9fDzF zB*kJc#$v1ZFQZtz*iW|${Jpg5nW2P@iEo(^%C;;#W|0lEeDNKsB;{(>CrrT9hp%DS zVyq;d9xyxLViBu#85WD={*R2giAAxh5$@OE9IPNS^s?4DHcXxYg;>KeCNwA{+WuxbAGUU9rdzsF^EdmWc<7Jx@~DQguhaF6zQ_q51>(fZy=H`WOhoPd7=w zdcaGq+HRNSgL>$f&o7ZN26G0@=2zglaYQ+Te1XIrq99S7ku2Shv~cL|z#i-P#jjDz z1qs{e_VG-H-(Bjl2lH3L?!lAh(9bk$;_qmHe@L34$Cp|6!1Nv%+knL`qnzM+T2K+q)(&wM0wldQ)2{d? z(xt2;RJH|UIZ%AAp-V35xFxG0M+E%c(hzr%pC-ZX*;qqS;5dK4MYL4@`j1#}wF40M zVp%>%ZCJ=S#WGfiha&`MOZd_RZ@MiGS@MVnmB>#trzz@^f-0Dx%W2;usv7bvF+nd8 zK6rWE*sKl|-B<=)D{E@5IsCC^sIrb=1KrC6VLK9^L(E%V&g-K5JtZbMx_u4asm~E0 zaPD|7DDFk3Bd3CRl2cutD_5{-EUA`~)}BixN=3zo|gKKygMn;MS-#?Td2iJ>drd+@ECmK63nYcB`U7HNB4 z6b|%Zk(Vaws1yvDOsfRI6LqeXuBcDaqKgIW-pH7wPmtK@1|>QuTX;^;%ij$^Qk-vc z&^}g$DC)90RD}ReN)`sn73R576po;sCz5MthoH7lB2OY8T8tV6!C^H{X^QjvLCo)n zTU_nr0NZ+WjG}osWsq&F%5@axSwzW1wm#1ECc@e-%hgt=3Yjie>z2#fMYTy@aFL}5 z|L?c!jiZ^6rg7B4iSG^lZsUKnC>c;K^7nM9pNIIPIDy<#CII5jxBMHJc^cS$bnRl- zN}R!8m&~t${Wx6`Y#2ly?pWv)tV;WD;0*^wE^~(WBptk20_j?M0WeN<6@ad$h;&kr zxuQNDEV&(U=2`SBjpmdcZ_jv_OrtFoqUSAFd|3(3M*2lhCIp-FDUj&|d$yS8p4I{a zt3PZub}Mc9FN`^@E)Ino^>k0teitiiwq(A9p67|T44eFtDm9;%jCm!k;Ac7HJ`_AW zYxH)2k!)kC{QxAC0gDFpc8%^+Pi9#Od7&D1xSMwWnM_@b2qM5|^cQa)DH|(O@klUmTb8BFZTWUc+ST zzq7H>0>VaYP9!<`Lc`og)SIn;7VD$c&B0$d0$zlO7l;NCH)9X374JxK@$YyeWrcTQ3r~?> zYGbgLMyNzmV8RVwYQFGP#-WP4$)zvBpk>LTz(!CR(nIQ}Aqcz}hB4r#4j>foU};oK z#njVeDfn88p24U!F!jW{0%vhIjj1~*h&wTcKKLW!8l+69r2djiO_0)2(#PtoY#K-D z7Lffq2?W7Q1!^XtgCzIx-Px#w3}gKIWmmfuCN64p*&Sq50ER_l{Nmrnlt>B@g{RCG zpM)>@SDr|&_<~zW?7BMPxxC;nR(h65-rGc4mSRwk+5p+q{lu@KiUwZx#(U`SxyNdL z9xJHG)i^0gY&D|Om9o6QOK#j|`Xo7+egZ88lofTZ9r#;n=F6Pa#fk??$n#W1cz)xP z;D_5W;5Ct+2d*^0^b`ZSFkR*b97Yd1Z1|mN1TRDl0I|zumF|%Y z(@08)4FuyhNu($uBQS%{;u}5+d(u`fbC<_}oQRh+uX-ql`;j~WBn*Q9PO3D|p$Ik= zYgC>8@0@4H>f=smfGXdI!=bejJB)p*T@!8-1AT)QLM~ycEuV?ykrE`q=zAWMuJ9*f zTn2*>n%=11mx6nPwJ7!Pn0yC5p?x!qjd=AvgXrZJXlqpaGn^-esgLcHTpKVtUf}kn zf+^b8HsShl{2QLYU~Y0l)~U|O7ECg^+CFWgy2s$$E|t{KggNt)SFYfdnZYVb+NLyS z#$}y|-6fkxj?0UY?xm!gG*k^w=a;m1V-}%mvN`#xJ?+%w=ypxxle9ox!TJ8;OPHro z3}Sa}U^%}8>5GtLjCR2YkPi9jrRrqZOBy7=Suzi>s0|@dVX9KcLJ|jGQ5Um#(ao4_ z8c$)6yirSMRK(<{=La-jc`}uD$oAeCMVt)4@8W?xkOlVMjBF%~sh5 zu>{RGbx)kizGqqLR2DB$Q*s~l=4&PRa&it5n-dsZL0Xc)GNUZSN+sZCgLeTAKJt6B zgLbV{a3jj4ofg7NC7AD$${d%1P^aqNSWHNkq=L-KiAP43m)FbcVhy=OmponBWVBS5 z8P34uZfVO9EsGkjacH!gz-xG0YwrL~H2pX~L12WCJ13ExqvqOiqP(SxIgC^{6GH`w z!~n&`U}?HVt!* zqLP?IHGO)&(v+#}r{E4}9p2?!B5Pj}EZyUhOqOw-!LhlOPW0h@L5_?1kQ)1B+Vp?5GTWeVS1mH`a!jd z?k<}0HiwMs%p8oeG($wih&Bs}wh6_Qq>}T1)w5F8=ma`yAI!S2>g|53ta1#AbI`Ia ze&Uj)E+*OMXSD>I?SCm#G}H6{CHdV{BJnwaZx>8$*8KiClqq+LR!|Rzf~`#^5(Y`p z59SWYSc|?^Je1x|yvqBnXfNybxh(1<-HqS>qVS&s;XOn;arX9;^!2m!B(mthW~FV- z?FURngNyf?TSMKqri;`i-Pcyy7tOz9hZ8Aqh6u=+HJ32!TazYO#Bp{AZh#2O=gJ;( z4!mH2o<64JNSi}rh;>T=v$0MCS8h)JM1p0|A@v(X>#Uc~1<(Qg4%@sQ2d9nv5`{F% zp1h--jSrat%7o!a+(lxUyh?ZSh&dp3El>RX4=-lT>Ip2;wd-TZ1%c#2dRpQ0G{=iI zh6fmrOeh6fmL_V)u_A>cYRGbd$A=f#Un-FQ3IZ&YI{SUH-&WAzf6d~H6fho!UBnl72r!r_Qhggb*@eR zBAM)i0GUX8CTsv-kt+NZ6&aLc0Le0AIY3^J&9fJw3y<`T5LWDk#($*XPGKqlpgNUN z=$5`vACq$L05Ddnnk4^}q>!1)FOUdGUETtr<6rY;e<#091fPaKNrBq&4LIs#VrBLv z$2RsrNkEy|#VOY8!}lA$0wx8rRx)HQIZHM&|f&S1HDLqiKd{_bGhx|PZk~LYRU5c2@B(9@K-)THl*p22V zI-vbqI7}j==M}=s{tfp2_xsOC%e$}MeMrlPWl3BmpK|4v-^;Q=8@NqubU~Wi80Fts zRF|{GTGRZZAk4nqyqcVS_JI6PFBmw9Yh$SkU2cB%ob>taamkI%1po3e9tBg$KTh0E z2n8g52A|uH%*h#yAs%3*jW2`*Lg#c`Ml)Zdbk0rxu6vD<=H@;@Yn}y-NTcr`A>ly! zYny@aH%ULDvPf4l)*%gN9%Njab|+DY5Cuy^$4+ad+-U>`(}#bl>0e`u-8yq$g13M- zR=~=p=5UuguyaYy(yu;hfYayXp@qo73mDWb?|7r_jgOw8n=od&Yp`D`;DPD09G5q9 z4&3uP?6g%AQT{LyokW#gdBqKc{wsdwAgKe~(rQZ@)y=_1>#Ga8&O`oi0;3!o>Gdl4 zPr}HtsXW+8eo>1=>{7BKJR*|`U!d46N;j$fZJ5VFD4(_tcF+nP7*kyf3J>&ZFPKR3 zTD9&CMLE5*Reu7W@#XiT*`c2p&X?AAdO;ejkR~~-UIRe12q|*Diz`m+8LqT;Q~fEH=`6}UzgpZ z$7+S9wKi1a^&oITes_?seDsEt0FvHCCF}^(XfxlahWvFiUqt&H+8M2?CG*=V-9jS$ zf(d1-kda6Q;%?bO)=rVS6RRFS)3*S?XiPe)7g^$2Qd67j`)c*7mVB-)AL2X%_$kiw zVTzz?3)|~!_WIT)hYH22YCv6|=7^G##7WekfNh|A)VHuO(LLIORR-ZJ|FiX&dQaVE zE6515hv-+B?>f#@xmx6E`?nvJ|3mBw&(sRffQo13{C@Ut#P-{9t#LRqUByqLoNP}Y zkvinexWT>Vhq8*=a&w3FvUK$ zmx-Aude${4XbUAkx-d0jLR;b`6Q_QdQ_>x`kgvMa454)OEkzqAawZ%^*wIn+;#(2s zwJ^!Apl;?vX9z6dz(>!AhhyvDgwLpiE#f28-Xy}bvf!4gQrO*c0tgUxo#KrNes8Py z0xz0e>UF8gDzPI8a3v`Uerm9RRf=5Xqmm+3{I3~s(7-{0zL5~aQHC#`vXjo~b}MSK zJZhDT1M9U@>?n!K+N5ba>n6*-k9~0qa9av|b7K&7$itB?GxzE`OR_gs?Vlhyycr`u zWdkb*=l>-Y%u&B?o;gzu**1qhx zR}o7=;R};`YW=NUVH!(89?gVFI?&H@ck7wxwkAY&?E@&Cp#jJc=2*QiDcMo}R9(58 zP1UpI9lGXi`sbJC^J;xRnZXB6WACpifkyW9mNEFc>j%|-jxbS!SGJE|s*$4y;PtoN zX9WN+Dhv&_fAeu4@UBM4%9X|I7#f1T@%_n)S+L$MF}it1S?rV#L_aFxNj2_-K{Cn` z>N6EFhcOZvd#XokSxQoITz1KzZZKZd*92h*Of3O^=i(55b)Z(2WE~)TXfboI;WBvMxl{O0RCJKud zilN4Gzk2Ae)za6hdDEp(gBln`9%x^iX)JZ0GkwCwAH6bBNHlkMtEm4Z)Qpa3l^)W} zkA9n~a-D=Nw}4ed(^pp^-T?Nm8Y_()+~J-(7=&=v4dQlVul?uqTt)+)gXIX7tFgi5 zY5Mgit=`1&?N=G@1XomQ)do(CJQkZXIB4b8(g=I$Jo}NQ`r5CO@Y2$7tGc#ya`(Kk zQBp+A;hzoRPw6?veh%NE2*1|AESwy)&Nf7&ILL-zY!7?tM;*!|ajD6zu~ab}CmE)7 zeypX`5k`r_UaY3yxb5Wr;IN-2KzzRka_AW$lG@pi98jkaqF8Qr_m5p=WO>6x2Q2%5TXyvL|a?=_sv+%E^}u|2(2#J1LLGc31QNS>CiRugYm zw*c+6dM$R+&f-<8h1h+j#XQ%nL48*~^He7CB-U)*UlNZ=VZ@FEEvd% zT`Fa^rIP$uMp6=v!ctD-y)CPAlWg#n9QnQ^;Yhcx6U+2#1d4nw1toiI>2H6ARyB&8 zi}iYy%C|U_U6>$$6e)X>pbgTMEsR)-o}EfvG=%2XxQzX*;sXbJxW1SF5~e~vO#6A8 z>||`cKYCw{y&IW;Am#+!-@dd|Y#t58KzvO5vU~B1Z6OjgZN5d%Vg*oggOoH6i}_Nl z@-(o+%V7ZBE<}d!&0KI=c}O6}7fGgzp=`98{O2PIp66w(Lkk{Ks={S4?yqUxu84Nu zD%hhRnty(@`))nSQFi*G5c)pf*xXU#zy71gDkUq*em=shlEdhq)*X z-l}oQ^r})-?Aq3wbr<%{VfD|c_F89Ex}) zNxW7|%gV#K&tu8b=GBfm!x4MG@h(PLbdME|FX48UhAte(f5hM@BC+{NQq@FKqob{E zq@L-A^T#jyzqU!L4>c{doUFXkRZ&C5!_PEVd}hvBJId{V9P}&xNBcmQxCn#^k&I0V zQCmsrEMwwLN$lQkaDHKM{&}#$+0Z>Ycz!OPM`I`ZJ^ewF)_`6~!&U|eX9rM$eh02z z<`6M0-JL%gQV9k|9;Ro!tLM##43=nH-ccg$;{Lr2@IwNIx6WP%UU1O5dME7+DYU(o^?lmV<`@oAMJL4B;W%p*g^R;^;BP_8Y z(qZRIdjkjEfbpFUxgXLNrZJfk8TjhQL0Aewrt*(^U*x~N5b};@U%^-pDA2}Id@3ET z;K)M2YMNTc!ch^mKvN94KC`5P?9A*(l*~7>H@bN4ex^YP$FTGH7J;TcI6Zid#5fn= zj8RK;mmiF^do^G-)Xp?An8o;RF3`yxEyB;!of&L7TX%pc!bvOxCZO=A8R`QAT-Y4` zW3X^VMd%B`3JL#3nd`&Ui~{_d0(G;hXq#%;T@$A&u7SoyU(ImY)i($G$6D&H9cV+= zwaG=pt;muf$SCzQw2GNOTaUb0TYR_FFDm7LK248(ct_^DPqE4xjbIVP%KUtR>u~S9 z4RK_T$-|?ma}EgmHpSMiCtt)k0vXPFVjHnTmC(Y>S7R25GnNg}vo%xVL+=!z@HDj# z2`iO?E%wR!>wK(Xq#8f()M$3x%}4!U9Fs+IrXT{U|pGLScdVDy5Ig`rK}7R>Du1j8eO6@a|=yy+X}4qzOu!>r{Ua`Y_x!zv$tU zF9!Ay20TXxKuBkb$hox|pEfM1K!uhFG~aKNsgzhlYKi(C?)E6m%LJUm&--JV;+EMX zBTEW-wMBYaf13v&*F^_or}l^E@B2Y>L~wSPEj#lyyrxVss;W|V_t zGC>ljZm;u<ZRCPP$oFbk0r?qTzgAU%}KvAvD%eHK;BVS0j2q5A=TiU3iKu3m}A@!oq}ciq!}? z*ZmocXFUyddJ-z)Iz4eRb+rN8y!1@X}z**ZgjFVVv`A>ma8n!OffW@Ex{uedKDGIn?MV^0|>`AnBGk|5GZ_iZcYvPX&^Bxa# z@H`~A(^+2L@$V%8zQff4B&u<~o@?8A1{)*SWWxZ^{S!0N6jbUo)UrI?NecvWDFoKd z9hr33L=EoP7ndI^?6^u?XB6va^x`wyQghoUnELZt`45>rW<7Bbg0};Lj$WfuzDcNx z`6+B9?I1&VM`3spxSi@Zrw3!MBY0D_LTmvw?Crax<=~+#{==a!;r!R%3|!nv3hp_V8Kl+^3DW0}|$4F3dy z_uCc*6bDDD1WW+?R800nqdosNOCRTt{uXC9+fjEZbzr=M`L%cH(F9j zTxM<^gyVHQmWLf19+w3oZoNrYS{ZtQ96&)AJzVas$mvCeSUZOib5|u=bfv%!VswC` zX#*X?g>C2;`0jS_Mb%M_V!Xsfu1gFddgyWtbqWzQ;Huy*Z009cB|`CIM|gMbJxYtZ z22c!@Jc`AEA|nOVpW6TXk%Qf(MVUwvkbY4|Ssbe*^WI_3+d_SGIOln4(Fj>-V6p3t zZE&gr^B)Z8HpWzWvqY8-x4t;w~ycN>RnC)7Pkl1Wy}ysB6|rfPmEo zCfc01E;}j6cxPRV$rPYhT?PpoO%|Wxz-1FPj!v8yN~+((|Ioo{YRUyf?yQ6Ucc8k){uEHEaV0M6%-;rA8m0I z{BjL;sR?rps<4B_hyBFoY4ShSs3;D|<%JD%3yLVAz+$rC?5OLzZyXSrPd59jI%FTY zfTOTgrI5cZ8A3Z$O9wkI`w?%e?Kj`b;2y2U!_u=s)S5D=IWx4pZUJCpjp4Qyeq6A2tR8uVKmM)A3$}4d>5_QaQhZ>?cnp{csxs;==3vtI1|VbbZ{pNBISNA zP$@H!k@<_q0zSzzC<-lWsgYOM{FkizdDvEtFrbN-@tUB0Mlkv(E7KEf=H6XAj5h4) zQjgqW`3%+L+GWuwH0zhWyat{<U~Bv$S9-5`{L=G^0hjR0e%5@6mRpcm@xH9TLHT?vVI+HyrWUbtqp$i}5s_ht zEeoD<)aL(OB|@1hu${hhwO+esU*%d&avO|RW?1*KZ41D)`x#`}6NYaK)OVXJmnFI@ zli1(kfoZ8n@t|tUrhJOb`oQw+cjVm(&>bVveho)$J{xyjKUDtj6yM_}pCfLxThd&) zzv(>xPVtAS;C4(D#-7Vbu4-0T0RQl)|Jav|3HR-g5f0NiC1^Peuk2fg!9Pbf=Z11WO z-n9kQStxZZ6-p;_6YqD7WtG%jCv?s{%3Tv_T#0f!$<@y?BoKdxqPzZPN=)pK;i!F+ zU*~LlQk{XEcF^$-1nM_FxU@#D=B323P#BrtNmhEmXRReJSgXrgOH`Cy)|f)pb)CJg z4xKQ(livOPjhp=8VdJHJJa;~De11U42-zJE*hmRwSQd;kz_ZK^o$;*g&<)1?y{mJ-3y*d)5$Mq3RHS;C!cuEb#O zJsKOFGc|C=9!4EZ?dr{(T^>5h{qDb2$aOs>B2E%tTwGHiWdA> z&;?{9m1a7Ne3#Uz>SRaCO_)8zZ5rmBpE<<6AFgn>=seCp*8xtWtRb)!pj`aM28>_~ z0?FGD@B&zfPkg@3V1gO+MQYi<>&fxA$r_g8EtAOx`Q*mwCb$0^e2(R4EwkfMPYJ~s1*3?$*GXCT?Vp8aTzCyEiH5V)27V^q-_S%losX@zUGSF z7=LIC#M+6bm&p{{xT5-<7fI8V2U*1U?O^u>PJu*@MJU0R3VulCVN|~Y&va; zB;j1%W`q#v&3N?S_?KjPyk(2KGYC~j-hw^bzz>_r^ODVHp%=mBL^1C!^gOAlF$OAO zH=5`SyxDiM!;*SqG?6#EJ+G2_r(?)^plf`A+(RqK`9_02U*k4EEQf!|Q3+fr-M+}oozv%^ z!TwS%<7`8B!9#iE$?$m>oEaex+gn3IW$g?GD>r~&JpLFrcG-KTe=1k>RZoM zgylAlQqn@6?QHsK)5^Atb8lTc+Y;`plMRv{zoBC-iIb(I?qp)y`s*787`X-`=>fJ# zJ(lNRAe65jvZ%-8j+?U6f{cRy0m0^fKp=aZf6-=Bxp@xuK=P_U@7R^^Tx@cq-H^9* zP{4CX4*@58l%GLHY!IB?yz_vv^PsX%Q{As6qR`2zTabPMu{eiv=6GsWDLeqRrhZMnoZc(IL9=AM`~VTH193YSv2P0ySd_ zcC!>6Y*N=Bl`W|>#`&}LYJ2W6#A9nNS5M0eRUr&*S16ZI8Kvwx$pR+U=J(SPXLs;# zhufSHjuVIl8b)XFt_C)Uk$lEBL)_=5C3TipDtL7yrn$`o1OtT3cee+VXOR|CJ(i-r z-lFfCq8&xV2vx)i?M1X33-KHy@$8Re>?7!GY!l$l3A3_eDeSi-`F0Ahn@GIOlwB3X z9wrKq0S=}$GmWLL7XoJ*t~-HwRs%DfYc(#PT=te6`w2A=XA1hP0qHGlnSucR%o05> z96E~xIvd*z%*#Bco3Djk!&BSDqu_S6E$sk0-V2nrqT^l6#hD-uvCGGvND7n79}Dj| z3FkTwXEGJFa~8e-8dIs2H(#?IS*z}3r{z7N)qSBmTJ{vy(~Gc3Zh={Z1*pGnu={~0 z4n%)%#@<%Z5WI*lN+HO^O&8Tb>v{&|ZLj2Q1pqgQ*kMj2h0VffUhr8%N?Ta)&GAw( z7Kz=?CFtdzq{2yP%L@S$&-BJ>!bk3K$3|v1YNm9~=`C9zYrU*!lfEm@`JBB7 z;FSMcLOO@{1v#6TUD<%Lg5RizIJ)5s8qlC0m+ zN<3l^*LI{Jl514iGv$Y$DL9J6J6xEp(`t}o(Ic*R8ir^8T`nLc3&fAU!92$rET^I{ zRwF~q^aUHZ#tW)i3D|@fu*y;E+B4C0RtaogJt+x0V^5rSP*6qLX(HR=koLgRd2$IA z3xF5Ca!Af*f}(X{rR3NE!=l3EENs>)>Bp`}3%Vn!ss7^vP#){WBLnjGS|U*^ad~~C z$dZLU!hRxQpQ-C>_|+YIc7OWe7V6}6 zPBL37DZCx6MmNwX8&KBKu_DQ+C78JuY|4oaP$hi#RM(HS(xJY$?yofqGrv>Ic= zTL!S&VZZf%U>V4r(u9g?Cw&dppr{xAW($y@g zeBLhr&v`H>5JO|)2^W5(Cx|6By>><+npS(Fsuz!8BpUpB7GH|tf94!Ax>Px>2dB}G zs?oowUi&x1l6=ouP2Zb!@SG%4<)A{ciFB4rUV31o}T5aH|Cmr zsd*u(H+vqqxh^pGbh)R+diQ&SC+|a3jVyL=%3wg%81ywZ5Urqo0Mu_d-RXb4uH=wFrJ1G_0pRC6`B0Y6lwTx8S zsOJIG(Jgmp{3aYb3&qdFW@e9()5m)8tu}L23jna4&*vEC3=Z%-dA%p$9ZB*`82ha+ z?-VZAiRoywzP`m%;@k?gY1bf?^j>L48vpN>)Q&qGNS#DeXBJqa{euYcp?asRyJkdm4jOv5JXZgh6Avh>GDZXXEWTm1Q_<9w_TGMb6hL-@@F*xjD#&sR2;JX^_5 zudYe0F16iTWeqkTnk^GhEgLv4r+jHyC5!Ba?KPv}pogzCWKrnx|16`H;T-w|q@n){ zRm>+A{CJPx0U)XkpDjNJe-=IY+X&ti@hcAd*CE%h3J;_}u0wg0Zf17`f zNltZ?&0JGP@E>qi+X_bg6REeG?DZyN@YZUayS9(Jb{D;^rRoSvX^*vN(2AN=&q}*~ zE`G=gg_?Y~bK-Q*W$VY+LtIpWQNDg1&c)AI^6@z;4#GW=zUJR;!Tp zlz2&vtS2XJpZ#FO&h&p9!5R;&ttx?(P3`|>o2|V+vSjPUw+RAmFn_zZe6z~`@?L&&al7&3-SGPA_yh6Xh^1Zx zgfkz>Sn@xLsE60r)+Y~lE<5?;W9`ew)Xs5a;@GOD6X(m}UJUM8XKt)ZZR(_>kISYG z^2#P~w|Qs2VUzUzdhVCF6PrH$==D==4=mm#VD-IOceIb*?{nVoWA^)p51K1}M}J3u zR-1Z1^r&BJnwU6ts88Rx`cQkRU^d@!vwTM1=vNf$@UEZ#`;+z`j$drZ*XCDhxl-6S z;$`3w6}H)ai%yx&=r_j4NYA{VCzJ8>bI+Kc-{+zHW%34ZPg|D`y|&o*@oKgp8=f@u z3qPH>5L}LIO>O3VUr@`}$9kQ*dgAKYysDFr59^AZ-SperybCjjeq5A`i>t3=H^2t_ z73IeMy;n~shn}9iH0UWea=ZjnC%g67!EyD&#@_48f*~^tjxN)~OPOw2*|L<>ncVEY zCr2M%Zh9R?NLF#Rw9&(Bx<-96uS=;^eF68={pI6v$8cV+Z|o;YUg@c%*L`k{+2pD! zb6S(G^4Ma<4`i#Tz|GN9 zB<7o=Ge1fXd5r$BneE!v8k9KZ@_efAS+YIp$Y-7oV(I1LJ3D2*$hJCld;fM|!e9e& zxkksAy-`f2wbQr$Stw4ghY#nP(}NG#XR08LmNQlW!%s z>qS1P^tL@+9t)!f2Orkq7A?J-LSHs@dazSd+FwuihaJ51%g47ZbH|%gTQ>5i7xX5x zOG2_!G4gB8`~chCbvC>zbenesxv6Pw9Q*5!vy9$#H+P1qV2oIi@ks=TS_HR;!LPSc z{?A40b0eR*CTSnmH17^Re$pgnPR@2*8b;i;omq31wr``GkD*zE>#r{)pAFylnZ;J} zixcH}z0&bM0l46g+}9UBD%KTl9?M!Suj#VJ?|Qz>Z0`*AAb#vY<^sqM`bvJ~MWZbm zoV}OC?U#oqKlrb^)Sk2NW@Af5pwCBY-sgpWP3|36eX+>-F$3q-Ed7>Ls|BO}#+1>{ zjArzsc}ZqVH#g_{Zu7NAOF^^aQuIX4@r*4Qy5+=ENvB2l^~Kl|kgQ4D@(ar@9_+Bb z6Ke%Hu}f6jZ&pql2;2(Hs0)C?Q);rNrkfdB?v!bhQ}EDw&|*x*KL`Xpc(VJ~jDPV< zLD2u>M6Vn3XPy{s$glk~nh01wge8R3Tyk|$btJ&>nii$ z2D1Xv^ofrsZ!aKpsEoz)xz^eP|Le+saI~yY|NSZTQkbG6O8&{$=YH>WYW8csOCKQ? z{^|PqQzo33uJ&qUme{2|U2>}!g(cBMIu4+3Rx38lkGxB4h^ItBo&c3VaxqBON!AVu zl?7f77WR!Qf(U~w0#h(1S<_K>IwQ$=lYR<5I3htWumLQIF(whoMFfl^nIkbH3+-%~ zJuGjN=vc=;>02%(c#(JqWJc)0MBA4Z9+j#I5PvH;erU*^4| zf|YGLXv<(aVMeMIw+LJu6@xxIId%wYF+{i)QOxM3-ms8w>8H%_JWT8E_WaPMOuYIy ze0@CpMcb7$sE1N1Y<3E;D!(f^e?-uv3Pd`fnTVmo@eENg7vPux+1ySef|Ob}SLJ^c+-4eVG!DY-t~Q&fPp!d*E8+-PZ@-6<-3O_0(*62bmTgCm05MybWg zpmM+R5Cp=~<$;X=p9&N?!J@xtr^9<2`hbtOO){x03hz2?!G>0#fT8c`hwQLFKoweb zU;U#YxEuZ7$8vo`PC#|^hx}ItSw|3^9jJMT|F41=D!4c%M$dOPmrn~fZK2e0KV@2g z`mg}gj}V9$L~ud;tMb>JER4{vz$NLKcr*m1G=Cagi7QfxIxw%pr|%psu)n$r@_hS4 z3?2S>i}#*ybCjc85qn`brRYXVJ!a z()hB)z3?ECp+j@YSMG#Y>&Tb)q6fF#v>h&@`WtTg0F74_kZ9xeE&8V6mWLUr*X|5v zV_4&LE^KZHRp$s>-DH1@`j=WZThJWp!dGpWYpDNB<4VG!^_*gjj^fl9X4I51} zLBah;aCUyuB`^LFpaUU`+C!rD>;3oK4I`OwCXDz9^=u*7LMQZqy9Qm51cuZa7zGK2q!_3&78s_NuQ33Ja9R;r zVcWei0le5U9oBQxoani&2Uh68vG-H%#@zz^P6lX}lOL^a(R`C|C>@>V zD<(DnrdYJdkt3HA0FzR~>}DYhcSoRRLtz?sz-O3%C#PbZgr1KvE)o%J&G5Dzlru~V zczGoKIVcjt$hxvPI-rwi9p;FiHq#e3!Mp$iS|;Vxg(tQJe%l0vghPk zj!j&iwMkb$pT?g1^G`@|v2SO`MUn-1zg&Xbo(yM(bvoQCo>K!vW`>YS_+q9%QIt z$94sZW%Bq)a8s>}p+n33(HeO@^vH#%le|Pgv2r5D7%>$6v$bt}(Mqj6ANqKokwbcl z|0Vg_hP3o`)94OgvxWGhPHL14RIV&V4Tf`AS0du6P!z1lE~q-jXcUAT7w}wN5a{hd zFe#|`4NicHi*bSBVS9+9Q6fv|pvy460Qtv0cU&m}>{jj^Jr@?65ktm|i{5y99-j^YnK{F`aFAmP7YOEzY8k)mf@8FTY5)yYaRf zHxv{O+{S?qk|dRMPS_ zG9v+b_vP8Go`z{*c+!dh*}ov_cRLtu`M0_m`O|PQgo*`76)2taxM7T*ML*!lF)aza z`NITPd5>ny; z@3~!y^?Tid@v|T~Vu7dr_K@Fy*%?l64+pRV*>U?nU@{0nzr0ylOcPK-0*|d+N{~PZ zHn{(|fLaFhF$afeZ%0{>uXkA$BYqWASCQ#P23ECG4eCFb!oFrQG8*AgH5L7h^DQA% z^i2QTR4}en+HelLTyAgWvv>99G`IlER635@2BOX(BD2`W#!xSc(2tRgLdS4-sm1;% zbRS8Y9w&B5>C9m=YZKT$aHXw2*A+#FD-RP?Di@XdhX+O+vp--2?0?(Q6-mlOP^bZe z1ayMnaM#Me2Jwfyie^IQ4;s{8&l{I0z8YuwAV`|iy6tgP}Ay@GmynrB%3a)WvjEe09m<2<%S zxlF|jol+|BnYDY>9@l8m4{rE0`k-C)6{?eOBv0of9V+Nq`i}eEGd09P?^vJ~`d`c% z&G%ZJqd#7*Fn2O`-_%x`e}p6#g%(r^lau!fvw3Q@opqL>|BIQT(oCgVGRQG*SuR3Z zQHA`-QCnd|M!Eb9lm9LnP-eOYpzlcj${g+$ml;r@9~FCs zIz8)^VUeNTBvzJAJPm4_w1zUKGk)_qkonFFEZI7OUqwzcNs;e|`-{Jq>@;dwsW)j>PCj_P>q$Mqv27aVxnn zxtYC4I6SmdNt0>D{E?KxdQTav_;rL) zDA?@%7Gx$zz93k0c=fu3H&XLJl3Bd&t~m*EHpx9;l}|n$e-IyEa%~hruKPUq<(wC} zu;5N?NF-@LHr@Dj(W73t1J+!`y+d|M9NW+`*o%}<*oM(x^Xi=(0NsTGtHN+cwHT_5 zl!pjW6G3>czY8Kg`e*$Y{tt!wj_?c7J!3}rNi@8f`nK?b<*Dk=>zu|!M3`a7ZsDer zzk_NQJy%rSAqc}MSt_%WI-k{5GW}(Aar>%=U6%2YO`ll-a&aZtP0pG-zwp-Ro9DKh})ff-Fge%s*<3Qv(_NAyzRthonzZUNue9_TlN0`awSByKRQaX^PN+Bpi<3Gvwii< zfwEN&Nu6Tq3JPzO-9Wa5=VeWRQw^mq=QjVH)LxqvZpXcXJZ}s?DmJ&=@+RwAHqK)pI^bJIBmllkCidc4K>B+#k4JM$PoIk z7UG$??F=m8@n~+nzPLWIV3uJs-gTumat>+jYb#}|jWM z07v&qQ~k-+ZD5OQJ6;>co}l=+%uItUyLpU&FBHeVXCMsEL(1lIhmtTb*=UG;vwUD# z#(f&bERno13$s%4jI&py0*HA$=@@{~BI(m~PP3}}Q4bwU#3N%#M@J2(cVyNJ zVkl-A+`t-Pj5cxK8;%@_VUu*@Ch3Z4rAW9Ftdq+W7?Z6AZDrAzf3-R-^6HLFhxcWw zq46UNOADU~tJCHuqAM2}aF1N%q$+imE<*8|EsA=VCmw2gzE&BmGWrU?w>!VSzHJUF zD5otLE;MQ92DTjTncy-9$IdnenF;XO7l3bonJ!%flaJEA$c17MRz#CV3Fmsk(M>l_ z@JzV(Vp5z76zme)0y_N!p6FK5Y6vM zwMCfoor*_(j$4VXcCYEiqG4#8;w&=W@aXd>ckde&DX7FY9?_p=d*x- z(E-^@mn1mALp-kVH$Ht=ApuwMBpm88QXz|VJ>d`3fcwy``We;3hN6Q`5DOiyD+*>D z;6ZQA4fXocI*>Y}{G~O6a$l>YMGRApj3KTvnL>HnuEp$gow*9V?b74yMF7H@=cGP_ zu<6X^RK9S$7B6r_Z>{|W8b>zEcDR*b1**mioZrRTnkc+DVA8kkO`gly52e(#~!M5hL5B;g&(bM#w?p9)s9}?xNm5%&{GI`7N*4SSeV_J1>PxWp@1Y+AW1X$3 zzo99&AkB*U+EmzxCDcIGFX<4~YM+XK>~}_mo?LIB!|c9?>ijj!LDzc6D{$CRi55>+ zR;UKp7@sjWLa7=a{9O-P4qa7GM3^=7W`ULyQbxfVi7&3w2&4M~Z zcdn+#`+x7{R@AG8e+RodGl-oYR}U=t#uqc<_TTg-x7*k34lK=&EUhvttHo-_7IZGz z9oOt`yj;(aFI?+h^Y{O@aXCbH6(+S#ZH2;#L&#q86wlCf`}fNv*mP`+2ae>!rNz=+ z_mUsj_QdNCrn(tmJGT0b@k8r{vH`6p;H)QPv7vIZ5&S1M0(U=CBV55+`Yu)vYWmi5 zz#g!F*0`>CjZ5Ns%Ed6RkSCm zZ#!$s4f)!c;j>dt*cM-A`PB7%kNRNh)*D8VcOw}Nz5G#A1fb0}vEzapH&6fuy>0^w zElAD6H!G}vO~sFvkf=+G*OW}^RFk|$W+v#+y0@<-9at(ST)*F2cdyLy$fWMl5$lJw z)={^wCI!PN$H+>;lO=o8hlR*nx6C40v5~53P_dD6vXOc`=lJ8cKORTYe}u?F@jLHV zE^|H&Ko~10^t?-fE4753xCOVqRsYvWcDq)rQ#0jQkgOyhb<;*+CUQ5=X?`$QaAv}X zBE`@>hP9NVwbY$~TRe8^fW3Hzv3df(>%n|yLet4sihYR3Cc+CrzmH_h|75F+9trxn z!%fkkjd84=ajf<&vn_J48`w<&yy6CVrfkR;e z)er1|<7`94tQHtmcK!l9AgJl19R%{MUT0@V9eIMG=xrO}gU2UblWY>KSw=JD<({ny z##b-(8{_7_hkfP64kFaflJr8|v_tnvooyn5OTN)ii}f)NCq*$|W zBN*F|A9OE7envAwv+F@4_Bz%SK~+AizPngn)mv z&tww9gxW4Mb)%nz`&Q7qZ@Rx;=|1ge+g>_3D%lf31muM#Da!&T-Pq6|kZi!eDlHD((aYkYH)?MjAq@+6Hd1B8pyP6Anu2%9L8N8@?d87u@V^rmrdgm+qP3q0 zf{4AH-DPyH6BU1;{RwhAu>ew~wB2FAP~7YU*okjgp`5&ZKMCA*N!}A9+jQ*H#~Dq1 zCf(AGnAH2{>Q!bCffUyOU6XnA@W<&UM|q~mu+~m#I?YNGmFF_>7*p)e6u8x}3n0jO zEBSNj_Z)i2j?!{NNT-l}eeGRY_8vDnj~Q1BJr`RhJ1#Xv_XBO~ze4Er*h^|*o!Ulk zOq?r!0BC>L2?U{@{I3rYiGIjEJ}I6is#djH>JV!#8EGx<%P3@FAT~j|poE9rEFyK> zBg+z!P_wji-8c&$DrZ_c8qy0~VojMy_&OB(UC@k1sR>OJ%D$}Rz$(_s67M7GzLd~Q zV=c$B2X-J2R>;C{kxMzoAr4ITtE`xC)r5BPz2Ot8dJDx$e;3CJwv%c*iGOqwgeZTO zt4X@nkh9bs00(HiQx45t5ujwPuw*Y!l@Ge~_o#SMwmsAXA)+RlQMGkX28uC zMs!hyTz>GOyLg5bZn$AIOxwI*%=hJ`~!k3c)yCj8_UpYEs5qfW=X@BB z2aEaM)w-3UZ@9^qi>QqR+=+Jffcx%ipfK-o@iDU=OcKvE=-1Bx{j-ea-_xXZ*4HAOW@GaiAu zBUH;_nY;30YaS)|G$2W%V>d&!J1oIlbjXU;tAcZqloeE^v7MWU1ybXvLh7F~7 z#SWWCGA_bBl2+zp9bf|s)Gb%df%zWKQ~SIV;y+2|pSu|bO_q>B=RzhO^0Fjf+&)OfuxtY>L|RXV6mU!)s5>w{$R%^&A8s>?sfaRX&dKX_oq zskO~n-NZqtf{K}}2hiI6Wp*}oIe6rt1Y>B-LLl zQ1L2Ul;7H=d>;9N=)paF;PCTm=l!sqeE6;$n5H`;Q#Cd_9I+@FqLOKLd+t zE5$)~J4cwzs&k{A%6;kX4)$#VlLf+qf+M)b?V32Fo91W+v<2HULq7-sR+OZBwKGvZ zRl(c8n@CJH)%^C$_7lrkAj|&rUsx)8EIz)94SR*nxPigLYA0*8vRHFwAZYW{gyP zA}ib=a3+#2xgJb97px68QF|5cW1uFg+oE8?0YQpZ$ovl-{{h&T8N(SaLWR_;F^rtu zB4P#Y-c~;ikr+*VNDk>#x#I@6i_+WVj<24EmrKCxd!A^Z9PCx?us0(-X*vY~qwvAYQ0&~U@?x|D z;5xmV@D#6%(s-IzUt5a$l20s^N2a%PK7S!nTt?0^N>(82rwF-j@^&SrtQ+MJ7?g zjz_`e!nWeT`Cgot6>F@JF%PTCNcekplH`%xMeqDj(A{OA18MA8;nS7X4V|JM&T&sG z8;%ePl?rNUYABVe&PJrwXsSF@W8hf~dS{6mbd9SM&T_dJ5NQ_sIu?zF({hPRg+iC>wZN}=v=CxVs>aKbAvD~Y_;`WmoGHX@fL9;FD8 z=@PSUYTV~+o22|B!#;2?QVsiEWa&Q5#%Zy${eaLqNd0~jFLN`&cAX{c`;6c?+4W8_ zL)3d3eZcx(;=hOl3JxrocbVoc*#IN$WYNE=*?`pnhBy` zgf!o+1fIY6RNab7DZ#uZp&HH1oFlKv%Ez$~749?rPJkLkP7-q2rfgIZKuoUqK~*B{ zE^gG~3On|KK;;`AOUmCpy^kyRG>t}X_2UXmFpW?Pj`}N*Y8e6Sw~W&ksxb&`agxFI zF}4dBK@>=>7`UtEOI!%Moo`G}O&lhqfLT< z$8T)GJW<&M0WX#zTG(w>$hQ&*`L<{5S55UEF|md{rUcc6qZ+!7#a-g@ZYpBUPa@2* zGg8bk{Zl_$8gM_ek?$&x+ZX-cO3X9`AZpHd-;KNccemg8E6*?22QPN3zO|EA<6Mip z>5U&DtLeCzlV`=8lM^u0yT$CfHQBMl^>=;Hs+=T1{AsSaQpU&<;hVAb_k|q)Scd75 zmmrUFF!8iH<(%U0llX3K3RRXVC;9V4;l&W{Zb%eRmUX-H;18pDvvVPOkHu4mxuJd5 zZ~Jkv9M&AZsBy_nSrx8IyY~*f44z(4jE@OZCvCCiT7k(;)g>={v(gO;d_zO0`h#hy z8i6b#70gis6wN{7nw+jmA*_qwPV3-aOEPqjN&odyXQWrT+&rDr zk?NE%vLVIYih;M=8{Z=FuEcx$JLPRd0AOeP>*6&kZ%%$4({S*Us0-k-`7$Zn;;js!F0C>51*6jgNX3&oju-52Oq?s^&>82 zoaH|3iiAuVvyGCg+XXiFc~54*LbbkmVm0My5Z*f5k%mi0D?@|Lodch#2?X}?1kIl; zH7Yvd6M;f(67u|443$?7MHqPk=Tma0Jh6{s^tzMsdvZ@%NThSfwgYF^3qgn%w!1Q% zo5l!Ez#QcO7lUCfzx@X$hsHra;}{MmlN5_V_#W52>GT)4_7hQ3daKvloJWDkG`N1& zz4FI{V*L1mH1Xb2Rzb3$({I>N6k{Ys8}7rY4==f$$(4zkEUIX?iRBT;zc`)6Tdbxy z2Bvn_)7>bg$Jp54AW|=@ItUw#&--R~Yo10qw`-R!Iqgx5)0Gyx9?gPO=5>w*-m0<3 zlt+MQQyFY&f&%nFO9=5t?cEZrtiir6Mri%2a0r1XHXQV%^%Y=WZH%RB9|{_1myen6 z_jP>eo`J^h{T_@jtLKrUWx}5BpI{z2(2&93Qk56E5EgnShi)Is|Bs{&`~5k*j{P>O z%IIN!tGs<-&&-wX(NyI-seDUT+s=i0lk%yw%lRa_nmlSP+^T|f;VL^L3(-vREtXY9 zb4f=XGRUK8N)FUvAF_`_Xe=?mb3CD-@@vs-c{xmqvy8=N?V>VKHTU#k5N`rC7WML` zWqY|`X#F!`Y7eMAO*z|GF_Dh~zFyd=vTygWf^9d8!oB9<_=Pr1lA>L;TveYD$VNw{ zW)9mvPXe%_pX10S7RMLGIK(L-5>hB3Hrq4NhguCHcD98tX$J0ypBUk>5EDhJszonV zb)3!8#ND_L9OoFrPjo~GpGZsalITDORo1v~X8N~%!<4~+q;J3eX|3SaHpk=YRzAHp zv(%CtE}~}QL)`_l)*|?cDCKgnTiG%y@^S%UxCk~dLqn~?&BHm0DAdeU%^cH1gb{go zxnj6`Oa`DI;7>q()G)$ns(;idXeIg`01R@@C5L~uBZ9Og04Zn$aN)XH=;3ikYA&|h z-!-R)=%v*>vGtx&2(C~P&l!59!i8oM%2|U##@3FaV01hhOm!AE?UY7t2M|w=udi4) zNEOkK43~6Tqa=63@mC?`W~=Z=gUAzRErz3MEyAym z{U{aM@y(G~qRaA+YN1+=8AX0$hENK&CHxe$A?!8*LM>GBkt~v=GM61-_L6Dh`@0e) z{n=M_73IV=L7Cc!>)(Pet)hE%#h@oM207lrs2YT26a)u6fks&-sm!L2kuN%vb$9dl z(zuM{gC7(O9u1YS`&r!kRbu@MyGvFlxab%!&{@@n98+(iPR)L15u#Yz?DWdJO)bgD za$aY_`{;3SsMxeh;#%{C7N*DHP|Tv{g1ws&HRK*lI|j64iy*<8Ox|PZwx9Tyir;L`esEuCNYhEWMfHUl$+nA#BBde}27xSy1122U zhVj%ue=_iO>fA7JFx0VzBjG_q#w^Xj1U$%mwXTy6(|a(Y-E{$AT8cb{mkz)1!f{I& z+-JR0%EV%wr^py=Blo`cmzmMBj2G?w5D`rpBH0O>g&U}kM`$2X=eXs0dcfL#cqV{sf z>CAE=G5Zsm-U(|^AWw&y zA{g<{kb6FEJ1*5s4YC0o+Bq}ji@#c9F ztd3;9W>@OfxCApSJAKAkS!(tPCevz!f6eK@3uLh4axt{xt|4&rZ?_Qx1QRxApuR*| zp@B?_v4#k0gyLaPp=}cwj%ZBVXAry7&PG*3-zHhJH)}CAqB(IRkd86&ksagbbnbJ& zCdDPYeC5R`iIkR7hPnIU<55H7_qdN6ViR0^*a(9RYibdZc=WVd}<92%5~UuZ1)1adYYs8)U(29HJI8pK42>RoI1{4Mpi%DPCx z{Wn|DliUw&Ys@JQp?Rm-as;A;SmzpGoBYr1DZe7Zj(F0L{0uzt3Afm%oO2#R{LP#m zJ?r`q1v8D?p*;2@SUmNYbB8pSJPq?x{Y`u%OIUU=9_>Q%T=xROrLwa`%p=NO`F3j6 zjdd+3SnXe6c#Q1#7*2kaA$OvfMP5t*J|&9Aii?_wfrLy}G9UPF2Dtcz@=pJL#!QKF ztMCqHl688NoO8z+R#sxB>m8ouSksSnZe_gJX5$CGH#9Z{8v!HdrBM3%fU_r}MsIw3hm%&mwCkAH`!dgeMxDR)I?3c5KIny=uq&6xe|N3%fO!$5 z{i;r<_T4axv&`;z`+T|a9hq-Ua925wLT5qH0dwmWu^lNAktt9r-+l@T4iyS)wb!;#)$5v3JPWD9`CgNLX-~ImmrOHjx zf?bjF(mC72$1chRSV&;zDdYo!gnFs^;Cj>&9@rdgH_urRT0iwk;EB|dC4*Vr=3b3h z90tv=0kMoW!Fh!gI2${`7f90mpFtX85>SA9yENC%S+Fw2yPtzuah%j*icq$P^dD84 zxP2C$IDKqTM2(O9aTO2ca-S?EHLz!h3q6p%tBV`Z+@yU|eTp(do#T4{(~oA|$}yr&-<9J6lRgxKxP$ zMhPK5k41Z|#>b1YVK@`axcE*Y01gH>Hvmd(DqDb5RaGt*u-inUWYWn4F1FQ7vnR$w znm~jd@%uW>y|&Z3L_Byl4#2e8NQ&2WsYOSWx3HHHaxJtp2Ic2WPI#B+mPC|_N`0Um zO}fe$AuEV`ud;xIKh{3sMR<-OnQ;9N%fHH6yE}Kf05kq~F*O)UsP9Zn70fJ(3;F7A z1g&8ihN0P^OR!!~V@|fYNNuGqF4H-E2wR`=2KorISk0)HUlHWB4v}eLB9oEas~oD2 zdunV~z0?rbo;2^b3TP;jMuR<1M6?{HjN=8a%}2-3;_Y5rz>hE8-do|7Pr$M~BMob* zHQui~y6A*&O*}40k@~=AXlL~y9mdoPZ%SpP^(v!T$o)hWu@SVOwiWp=c|v)D!G=G{ z?-JNmbZmLylUOYZfl?zILQ>O+jxSW%9>$bZh4Pp3grb*)CbPlOE?QL#N_>wsG8aQ! zyQM(rGPt*5*v%|pX+#tuTTr?Je!;43iYD$GYeR^kn&sX?wCQ%gDGMZuu{ zF{c|~a>L~8{PP+nawVhzf5?A9{jN+)3<=7N+4E8P1(BT~o?KuCGuwy|Xe(+m-V95U zbvxe)B>%HL1fermj<((6Zs%pgMRl;=}UKfBWkg z_1ZcU?Kv<)!T00kuEEv|FA-)K$^khfLw%C2pZRXi8hob-`aOE=?r?VK8{@xz&rR(C zJIg5ab_@d%VifgVtC!C6@R+SZPx9*((3&dx3JEjU8t1a4dNu;+!d$OsQL&?#D&C`G znpu?04ZB?-oiUM5?OSnxa&)h5G8VlRw|T1%i3w42>)svde(uuHQP~;q&nc^2#LJ@L zh-EF~fw!hlp4)s5NFk{e> zW}KPAk1qUo!W)zPvYEmm-dmQvfjzyim7aj3`e(&C)*RmG1c%#^P$F$WUn5xyek5x{ z)12xsFL&U%*>u;v$*ATAXnhxiVp}=x&^Ez423}#+71x!da|VUrHeoCm(S7S*`j%sN zLl-(}lJ#ezJMh?aZOC_)t&$`rsSYy!nA|<;$@W|2kZX-@Yx?7RQc%aHU#}}8qF2Q5 zlqILlYXADYyBe~HG3lQ_y?3W3JysD(Y<=e;lvyiD%yxTg`ct|MW zdK1kSwIrd;HkqEStL4ao-YGy1ou~4_ov8GC-7j$Jb>#4(>n@3iK@YpZKS*`sL?!+C zuQ|E|zq@dJ7b(4ef=Nqn*4vV?vIw>mSs6bw;EAZla~Ih)C)=5pP1+4p{b@x3swEL^4s?%rZSh)jURU3>lc!G$v+6AATtr z{dP~@p}^#YmYjIcsyr7?ob!8ZG)0=UupD$?C}X(r@BY%I0Qjr%9T3$CLz7Ybmmqvu zk?BZ^I^O?e1;U_kLRMrua+G0uC_gv%I=SjBCbr@%o9nTTir<{wbU zWRAz+sK^5#jPx|e0RKjg3v+NOCmO_!AAF~LNSqUkFTG3;qqvKy&i(f|ljV@eV^G;c zHCVp#V1-Dh+ZC6g#;b`&{k@IiFeVaWZp4lC&pp{^7*1FEfCrx+dEt+?FCwe3N#gt+ zVT($GxY zp9BD~Oa;Bqsr#T4{9|N3Y>Hh36#|JrtQJDae4n}`4BI-fI ze4nsrS|4tYDDQpcrNy%|m5BvFHDQEf;FL$u4tk><`khkXv!iCy{05Ke{nw&ZhGHJT zUNe!)StDzY3EJljZcMT8)S>W{w?}1Ksrs}65(LJMhe7FTYiqoZI@mitnXHmoBY@&$ z9erQ=vPBBYCYTK)^{9Us^r2z6IcmG`sY2FDfyu_UDoRoTa6-2~td8!gf-V}cNb6cHxxK_2s&Gj)v(m9I}Ke*ZmrWvbxUg`n(MAXo?;2aW#hSZ%Sb zJ2L(jCC&ZZV2?G*h<87Yo8tb+`1{|mqCqWm4n1e&5&q^r294zQ@F8*Sp7c}wM*|_i>r!OLwvF9~NKk4*#ST2T?+!&ci`0AxKQZYh`z(%<&! zlw>SqhEw#tH;S+pZ<^#)65V2w@`XONweCG_iaEobyb`6SOlY?UHDt&k+Cr*uOyd|_D2(ax|6%3dgs1EbTN&>179CV;32qiZ|+> zy>Y4kjQaSbl-JgZP#UwzJsTI>Bd|v2^p39~6|1n+L^7#KoO#Hgk)}AQ4O6s)owgY3 z=!wk3r~Az@+2Gn1SfpQP*^VIEk!Pg5@^%&aNU$#2#MtrYpP&PYNJuu?yvGmmQvgZ+ z+wf6{yp;qtkA1Fb>xz*SEV)M)_E%=e2CgfBWye$?Jmcd91rnMpAdSNpI4`qmKT-HYz;%X`@)l`F(Wm8RyKQSwP4W#Flp9fD|Oi`r)f zBb#uHjs0NalO9r9x=jc3S`)oxwQ-hF5S*KV)~%RyEbqQY&XDiR7W2TVy#b^5p_15Q zY;-NbcP$!`mK=DveQhRgx2Xk3NL|sWC~p~b6kY+p?AF}-st@+E=6u>?fJ%*GfK42vz-7SCxaGMf(^^i0u^(0BsBr~+w2FcUT6$%)LH6Ars1lU=ZBS- zNnQE0BJCMPl;{JMKQeHpMU>dOpHXAUqu(wBW?!Jd0fwb{U*rRbX{7=5@h3EUhBa1^ zc8?@EZHD2sCz;*h=+<8v!aDBcb`yN}mG*&%AL4t0DQ1|~6E^vYe1PQ%f( z=_uYfASKhcUcptgaVbDpUaw`3@k&5%@7`-&*3r61Vrfyw9XQ+?;8?&d-uXet(E(?} znosh1$B86NnRT2;uz+XFBI%cCp<&8!;mCndLl5A#U@N#c+lyBiK)5WJ*z=;JD>~9= z3-PLBZ}J!>-|Fa;czS=~$YD;xCKQ%{eL2bJm}~P22erbBD-oAQ<3K=>j}f=$#Q_MF z??&R}%8_GMfQyA%@UypkuFqkZ%s#_*w8djG7_YOMVXQE7*0rNq;XujTQ z&!sPT1M#A{UCYe^>+zz6&1{!azx}m~NqW&Sg~C0j@utN=d zkS={6FA#os=>ki*5iQV9M;;BCI-g}Jk&CWcFRr6_#c=VsM|FevZW8vN1bB%#nxzb|^axVuY&$ zC~4FpnQA&)hH}StKV65L$tnxSeOI~?gln?Dn}DqL%6Y3?Mg;6RvCn5aJhNshqGitw zGVt}(X|t(FvCQhKok215&tk=L<1~Cmb=pa+SZ;QKD+~NeHe~NjXOih33)FVKg)y{u;eO^{xJq{KcbOH>p~K zOOV|RUQ`@ZCH!o`L6s@g8(jPCROo*N1?_)72|-o7NJ5Yegk;e$3rPs-ZposwJ)8aG zauECmzWTo@2SM4?byH@_1gpxizp`Og)Onf>)2gWl<*+QOd^o7vcioi3x+=565$pa| z+zS7Y90YU5^?%+tPGc&*rG=@aNq>zTQjcku4HNSx$w07S9nG~j%cA5XOI4x^X!TVu5Tix?RNX0E=OY8pF|Qoi;BxtsMm$ zv;|JdkY2|*2Rw&;k8{9dBnbHgv>L}-9yFqmciqecfW|FY4P7L%iWPlQtT3Bg71-l} zrOw=EnKvX2f!;HLai9uzk)GAm9JXtB-xEyGyv9_6OD(pMYTe~eFiQ#HNkxu{K=Hvmu164GXuGE zcIJZ5O>j>JubP_lcui=~!M_)-y&AM&wZOF-=zGzt+SRjt@w|H?o`8wIc~*fv7N}u# z?`7_ftVnte0F60Ni>^YSOkm#ydS?WjM{rQs0hx%{)x+YQmHg@A^icCEFaijbQ*~Vv zp+_hqd3IT8YXKF3%GvkprZKD;l*#3DaHps8^!z*?yNC%~5)>mQ(ArtG2A-Po^q^k~ zUHqMmLVMirMG_WkZXbPXQ@)QRbjLi$<1rU2aFy#r=sEc|md^2U=%YBQSjO729MYD| z$I>x&ggq*87<+b2y;D-cI##5;g>`H8cXuwgqosxjyrULW`vtLTL z9;cQI3lK!?JFkp}1q`?O{%i6B#8>`c2n{q|<=ptvz;LV0>jd(=C8W`%;Z1;7XTC#) z!NVrIk9|)&mhuGL2&v&F$VvYyKj|=>S=E9q(kOiO0^z_5&ihdZc;~6lJ?6<7EB=7( zxU0NX(rdH!MP0#wv;pks_SXq4tgyjn=dF}}_jl)j8!rZau%r0XjXEZdD7?bBwN>Fg3V(5cKN{g3EpK)z^}{0m^hvin zeG>C?C%!P@6Hk(pqj)j!MIFVTZoEBDxVNXH7f4T-k7zjXeaCS-ybqXz+MS5GGPk&W zy2WL(tlT|45srVy%<<2TZ+ju!^NZ3x>&9_TJYKs18JFF&?xBBVsdY4CO=(B~aKEof zbIv=4{(+I)Fp7p!jxOTc|AL=<)YsfGPH^XRN9+(U2K)-6_|rA(f1A56E37Z-Q_N8& z{KcUU@&gjrWNM8a-tI}avwITrLMK#&@K`5}%2E6YU?>>HA3^exeOY1c{NIN6y5%JU z$8bBq_n2$#xrjljIW~s5*cmQ)?&o&sH;i1N4u}s`Q9ZvX?UQbte$OLrQ3dncj1GMq zcCLtXsWGBTKq6>*sq2oRe{O`wv`)#c>(36~{TKY;qt4{cshNA9JA$A16Tr7Kia$b2 zUZq%Wd4==Fg!d@?#i4&?bg5EsQjMi(bi|)M>2_yNV&3M71w0AQbkb%S#ft&+%_#nK zLoKuKOU7#N{x;kZ(u70b_v*F-e9YVduSJaJDgYT$E^In0p5r(t2C<|)2V#J0Xc2a_ zxsW;6KIO(wQ9M4oX9Ph9;*12YD@#1n*aM8FFgj)A36?A)zhO)y21jD4HO}o(M-ya% z!zz2Qr!1V{3i$072R0Diw*^+i!isZ|=bOrIRl_vl+=}xXHBK9V%bHldPtNMemF{!EZYC9!o9mQ$XLTj4b3}t%G-bPyZMEB!|}fw}6GV zXy`F<=faxO554s6B|ce_l5ERi@+|QnP0hjxu#YgCE08cX24zEFpd`;ruJsomog{(ak!fvoaX*GU+UyEp&j}=NVqz zrq!TRkeV3KDJO4MWjQhr?)mQ5L^C1Cvah}hZ?`G2`ec}9y;fr;$*>L^_w49K6WpR2 zy$^?EVb;(LMH%i+Ghy;IOcHMyT}0wJW{Z!qrl;U?Bokx-aad|?nNLlY53=Q8Fvy@Y znTbm+11^R!EZdA$jl*yas1_Iac+Tf|)fmoK-}!&0EEbX*@8Bi!Cc}06wrItY>EM3Q z!Pt{!ph+;`X}=W$@w-e09lUNjxaW5;VYK^%(e|sxA=DZO z0VMb;p0ggW8pCMoEbA`I_SDz7v2QF{E;w{G6~wgV>D6ot@9kQ06Zc`e2&S9jnii$G zc%GRs&n)Fx?(l${4KvM9rcpoC(rbTR~Eg!ajY6S+JXKSZXW0`|M&US2PDkW6U5 zcaQa5JNv@~RY)5Y26%z{isC`U9K~vaqmcD`w<%9LY641)iA)QFKmm(@*K*)R3Ru{R zqZclzZixj9YzyllZGM3>Ng=bJ9EKOUTa_86;W4go(t^! zi&GKv)^uh+?97I z_u@mmYHW4USTJN+6j?eaKMkILuyAxOOo5GIZiF_|Z2^XloLWE22iE+~aISY5|@z@s(;3*>w_;m69&NJFRzrq3M-%7|6yD zTM|WF5j~^9``d^QjQKpi{S)B!Tl)|V%DIZ~0Ju&oa$HdkZ}X?wq(NUL^)w*lq559! zO|odkYM%i}`xNYBqcM)xtoCStbYJN#hcC>3+OOavNm&(vVvwf9^mCEf_`@32aOTRO|fQ0PYWZ$Ic?nEo?dM`U@lYQnQ4B`Ghse5W0oYvwqj z-GM$+maO>N^rwC3mMtp~$g-eKpe0Q}==0f{VY+-<$H5e1{Z|dAZ!FVNm}!wVa(Ud- zbTQ1cL=TF4zA7Y?pJyDM|1@*cd*T8Ud$D}f!9)eL)x1mp{r5KT$29v@3h*!Mzvp#bmcIUbHTbUo z{$2n5yZ-xk{rB(s?^gf4_#5cIs}lYu67cO`S>Rf&*P378T%EStMCn{zy)5uP6#DL2 z#I?HJ-*>rIH)-fuo%x>CMf1x&t93v8UcS{$RSmMTQ1f{Yju$aOcGSX=3EWR|f14Ojzmsfya+$^sk??*6X= zRHVc|GK)6*+(l_2zfcoDk_OUk{`S=}{oY zIVo+$J5PNl)s%Ei3Y;OHBfb!hqI;Go4Q7qoSZcL?v`<}FV|=+p5WE?0yi5cTuGG(i zXGEk;YPNZB8Rz1~t5@Lo`9DSLDbv6u1c3D&D*THM>$9-g`191PH0^4&6n&sfWc>Ny z(}wY zdUGf+;9|#&tmb^R_AD5djsxS~H-61r9tNJnS_dF|GZZTAk|@PgenHnXpQKNlz8U)@ zed0Rwt;eAU-Is3A_(IeT6;W?Pk2#>o0ZbixjwlpSBCwaP;0 zO;5ixOPqP z9bKY6F^f^>mzU@K6)VAgYWQZBms8u2rrFxO`4(bK54k+BNL`RWXzIHwtNacI2v8}c zw^59TIyIb=hts7M3BE8+=xf&HRe+7OgC%@Cg#Y3>xiO1i&AMZh4kaeyhzT7YhQd|= zd@KjvHMk!Y!El$-e$J_Iq0wF@aCP<~@PKs8BxG&O#KiRcm(HR9A%5*0r~- zzFb?g6a-HG3O;AJMq9I^<)e$#9h0W6Fzs)6ih5WDON+^~uDMnk$D;bIe5;j~CEts4 z=C#%aUs7;iG#zd@>4kWvCcA3umi=cae4{Zr=EnAdK7ez+7Ch1Y>?tL9jmWAKE`Ih~j2FDx`!Pv3oC(~?5dqg^RXu%-@sl&$>*oJ}C({S(|l4Knc zo!JK>&fF#{wi56hi-1er7EKMq&#|#NvP4aqoaBKhb@4)`U7z34jP>jW(*yN5QQD-p zE_!4H4BsQ?YPo55%t zQ7F!&sm7^oQITUKH9<6J2tD$7%@CUUBxnfL28$2g(>6Gfn@YB?8(p~&js4qT9KR~# zCl{J-$3E?KH_Sc|)!=*f@FUJ)snfp2Nj zGJJ2m7H85)0|`!ffq}S%#TThYO1-kai83Z4jH--%`ynDS#3r}=)DQ;iBQ-^tm_Pg z;)BgrywGz_bEg7sIK`a`SdU08I|1gN2wgCqntki3iO?hN_IK9XLc z_gqVcT==&CeaNSikFFN(%U|Z1K2xcSl;9Iju&H|_<;8w*#m>@{A*SHBRIKwlocU(T zZswzA9gSyxx+WTxfRu`9~Pf30;{B2=#aZ!WUvR?yUQ|6XG zvis2}d~I00#%-R$O}>C$(gEMsIULU0Etdb7_5RF1?55!dpFe%Sp8GyXu79Ftd>8oiH(tjbbs* zwr8%%ujz`s>oUCSCOo{o))(V!+-Vnn++zONodo_(t?w;kmTF0uV*;P(4w zs*@Mgdp z!p4Q(mM!R!uJg7S@5;-V27{1TQ@Pf;t7IGGobEj1^{(agQYNY$VU^t_XvM7v2h`!2 zk?@#s+;^uiX{UPuy|#+!`7u5M!vygx;C! z-4lBwhMTa0=AGzuZbBE7qi9t0t}}5|b+ITK>-KUP7tZG8#;w)Q`X%X0TU*i>d1D*>lI@lG2Y2P(aWUIgDCfhaU?huS@pQ97m z*dqJXUPXBC8z9BNG5Feu14gA-MwsTtoEy%>tg|~W5#yr^US@>!FJ^@gF1wul*17E5 z-ZHMz6$`i-ujwA_mZlr;j*(v@?z?M5F<|Em|216s8>YL$5jc^n#qbW#+#2%RKFuM$ z;W(s;3p@PA*)nX&dsbXuGEE%Z_2PNk ze>5pBL<;W)afc|-%r&IoM)qzYcZdLu?kwpBIo`w@x`)4TQi2Ixnv%E=E+gGdqPbeu z9qTS9uh0_W(!uqkc}-W8=t3k4@1D-Ns!w>e1%qyS=QGZ^+)Vx_yg0*F)P1pE`St;0 z)R!0^NN;kJu*|sStV7)LlfAsuloOVYD1BmF3Xe8$h7t8!?nR?N@Wk~8tgrqPmmY|7 z9mcpSERzF>yr@bB{qWY&JH&^{Dv4rYzxI)fY1-S$6|S$O_KxmSg4AK0DALD>2$LR8 zON1lRpN^C6+;YR|BPCj5iQ*uXoGywpM$KUF?lcl+S?EQj*y>Z|abM-`{md1YyY}MO zZ~7T{q}Bwb#XPG$9ZV$3SfY5}FWNgaecL?8DN33ARyrs3w;YgItGDQj#(VS@F;}Hz zdrnEj#H9HUe4zF^Y0+syy$U?v?LF+a|AE?QO@p!Mf1oaR-{y|L&6Mu%v1ESXj56+u z+Q@ae8)~j1YrGrqHGdLp75c7TcgPp|_BCDHAm|W#zm>B4yCl3mtGR|#czdQLo>IR< zTy9ck`i2=xgD&ofAaRD^7Z0S7`W)JF-1V>K_O!jRL(DRE|Da(D9Q)+NrI=8ZrPURR zQ${8%#jOI(fQESV9ma*7tu(|c!&=~~Gh+gKHZVR!#)LxwBIU$pAA4YDd!24b*X?e| zP|IMCnpsv@O=X{9d+Gv@8Qx<-aH|^SmT4g!Qu{P^wBq_+$VjQDynRCZ3b z6Gcv(`Y(#SoC*{*OfAox_OD3!(;s5m=2jN(D$XoxDKKyRkJaU71f1c;oMw@}?tYbz z)~!n4Db7b<iK(`Ky*S$y#g-+ zce!jsr^N*;=VR4{J`u&|Gz#@-Q0HAerzz!=NcmHgkXSX5v9E?#kNjdia_tC1DCG{K z@nL6kZ+>GAj=$w4WU5jrZ@+x--*XH3?KB!+<$w4w|8?XKU*msB^E}IQpZ{S{f9HSr z&j0Y8|KU6T!*~7%!~c*se*^x9zZLmI9>P?9%zp_+rN|2pqmq3Eq>|-=`=N?(KcvH^ z6Qz>o5tvHt!&K7jSKw6Ip7^~$D#K==Xbu|#C{RLI-WDtF$b$qRz5X)@PXIO+74gT_5^YwmZ6}YMNhWW5+E7k_K zy;Y=Dl~tmgA}z8sFDqRR{c8JhFf0c}(+tw8Y3i)q@eC{d8rp`}X;YV?oVEkfLHnc> z<%hOs<2v}rph5P#G4W;m8se>cf*x3FgB`5 z&9tTTfFhq(fmM|+ORJ+?E7Vb~Y};kU>!|DimC9KuBVDO%w54isbzrCo8g&k=RX;YW z*!rVYdIrKuQ*kz|M5w$1^;_nakzT#KjcOR!uqstzH6hl?^i7wCx+&jcC;o!ex6TBdEQrWCCj<%vqGpd)ta?i`FucI!@|60VYFtW%{@oQN97`CML^rrDv@ zSOgJn--lL8*|>_DbY1GjCN>c7eZ{dxT))>uR41WQ-79gc&&BF&l+;O1Q?C}dbRKn9 z64%e87qW-)bT&%6HVCab8x;sN+tO-Zqxlv0(@h)Zk4wFBY@+%s>ZeYJ=+JRV!9Hts zvsEt=It8K~P_n-zC#4UOab8ah8xb&N%D7!0+p$znJmqi|<_VFjp|3F`HM=FYezPjH z&qIB6WmV#mCzGtg&?OaohbpR11v_^IJ9l+Lp{QjAR7Q0~B`liIJ`XKF5d98)(g%c` zq@V`lv<57Rb%zb@^H5FfYpndGpbW4`2p4+9Aa#dS!X1O)9Y!WItrucslIEBb$vb9- zWW*W`aELYJJ8DLB6I!mbrmyMCZ+eN|GW*6RA!fL^PL zT#7$hY`5BORkd9G0R~XT)?M1%iw5JkV!$31b{~c06Y= zS-f-b*MRq8*3sWV$|bq539^)xZUODpPJv<11AEyr1iUA*xq^aEsd`XhK7|NF=kK6?#bjzUt4awQYmb=(jgRXYY!i*7N(}eb1 zXy=y4l4TKtmIum61=tXB+l~d;%z_LQhu!*H^@MPz_CJ zpNDEqGlPWqKyP4?p}9VIR0tm>6@u2TP2o-HLTfl?)Nqil$rZW*7^8+rZ+%OlKx5PZ zsnz81UO$=8J`43`kzzs+D;(s{#E335am{B2cA-6dW}^B*6m*Uw+a645i&OHO`P8xV zi6w4ks9=$Ys@tOsm3QAHI|8g`uWUN zCCqRzBtd3)Hwx6av{*D?r|LQ5F9>h>TG`RcZR1%2BvSdw!gEGMFL5U~l-W_o{HTn0 zPsRZd?6#8Sw1a5xQLeOtU+`IE8}g_M=&N>;Qqxn$!nOYp4pP-n@}O#mEmkcJ;lh-` zLZ?NIs^|`}RJ-bOivUfB@d-zxp{|J}NZIISdYe%6j@(K3dxaU#AB*xeI-(y$ zND|+nS6-ypOENrj*Ea@q=N85;P|7M7oQA*7%3}>8@wwBo$W8XRTcyC}NaG@1U zU?qh9$}beUZ9;oIv;jX)+wE!#I88Ofd{TpXte&Azd^k0}sG9g|nrjo<ZL2o_*M#+jblny9CqxYyma+?d>5xb z9+&KG$Ifs8iKl)Zr!i(Yk|OJFldUE!D9lYfw9~ za>epHoDetQOl0~vv|i0{#-OR-FwS7#zJn_M4)m_ly@UOZci^R~a6Bsk$*;&VRHY`g z&qJkKG+SM?@5m@t-BeQM^Gwn`n5~4yQ5JT5GUHFk4bxfn;l!BUOKw5KjCn5@3E^`b zQ7bSEjiY!qW;*HqBQ~;gqui|-SFma3^+l&2Z36-VI=z#*o{YDfb2X!V)df*qpNfbxa`TqqC5%cXOsD0l zEbG!l^@AuanP~jlyzZG}4iYlzLXNS}?ghWnQ7naa6^%$byaMsb+GV(b)^3j4(elEE zU6MN`1(l187}ilcpPA4e54{%SXULv)DQeDZaV07~^vCUsn<~?>_;bVK0cX$}dmn6yFxQ@TjQ?XJw^1%J7T{ORl~-tom*)J&1f+#I}n&Nv(rM1aW{NfYzqUtlvQbL3;V3&sOky|{UHtyadX zr1e}m^J(!AZ6h{0MZpt3#uMtVohNKMo?Rn3OPOm*SzHce%j_hzV#50}yu|WSz^ub2 zj*a5Ug!d`@n@nm-#C4-o`=>&gYieaTt1)pwZ3&Z)GW^uIorQMtff4N9$oFIRw^F5S z)HKzoJ!qr$a*dkF8kMI}ebuO^G-|`v0FS4(dX3ssHHRI$!V0&v>Ta?E-cDVPRcn!X z^WKu&RLW9SsaxQR*oSM_w81J*XODXw)MG&vEJ7vh_2n|HH=1_`S575eAeK1t7r>wt zgjXnVlThG(p>TZ41L8`dV_n^ls)Gx|ELG`^BUQfIGNC;Yij#GP!(v58(;B0s0(V5^ z?vhruGcw(*603pU=eeEhN20o*Kq57$a6whMyOb{`v@b%}^|KtodxidM>+omwCSTeF zHfp(SfPGYNyisqwQC8Zada;cfj?L!|bQT7m8Xb*V0vomF)&qHQuoT_<1N+#Vc$W-k z@dH3SF*bz__KS_&6gJBysux7n7!+-Hv2J zuxMhYgTnC7x_6r;FYz|j;%jLICc%0o>M#8Z-kVo4xM-RibmFCq!ZxA7{-F^Y1v5Tg z>CvIip^dskXw*|0Yo&apiqM?KIT4E^P!l5Lr3l=ToazYs5^ps|BE2W1-00}cNK))N z8qgv)D?9=w$Odxh%{Ge|4p_t&o@0|0wc#SxqFVI&v(x<~D)dCJ0w{96V#yI%IHKkVqmXyS2vpq6+=UfQZ-s74dx7OI9N zyMC690r02B(XxKq{dKAxN2BiS8W20~^O2Y9Z>|y_U84hQ5vU#L%SHqq#aoSmITS;D zx1-IGq#ClCu2Rpe)akW?2Z5SSEA>TH>gu#witNWKWnZk+EmWnfcNN*FD}9rM zolm(&+o^RE+GC*tvreB{L%T_5s;zJC;Jc1Fyx<$MdDnYh-88*Ymj7oI^5AWHRqGnu zcB!klMitno&#Ji#M{L3NOY`(~j;4Z?6-&58-||X0v@71CCHIB9%a^zDDHJEWGneeH zWB!!s{B43VTs6uV)~FHK;0{pU`8Jw~t{ljL)ja6n)C*ql6e>*c`*#CyO%BYbisNoO6oKHop=Q=h*Ha#Y}V@f_h^&+02 zQit*idd@%s;zCXhp;C>}Y8niu@08+TgB6z!=)rCy2l}uRuam-SG(6pQ;BxLf%ceDQ0YkQ?<{w zFcNuUU%eh|NPIIDD>~yPKhS8skCvRVDe;!lN^IOu-vUwd4PUkTSZZa^s^Ja zWG!~+>P%F_?xr>}HM|`FTH9gv&{UK3RSXJNW4~Af@>MfA@wzbKeJ@=5>Hz&vGf-}= z+0Oyut(k;&UFm0X1*uw}l2Y}CYYqh7l`>=q+hJ)LB&{AxfigLz@zz z+DEE_nXGNS&%*ay;b(r~>b2{#(f2#wpl_uQQ}F9m_NN->wJh=swkqopfB|th6=^Hq zKH~UjDPcya0tl`fBhc#u`tkoo31G7Wsz4}PMG$-~}e~vD9Fyq$lE}$O8S2{mk zlg5kF_F-4tR!4DuIxR0(IDNSqP@}dT>MfGuTm8uwo@@rbdSngEO#MORlu&=y-yf(K zopNjqD`pK+!J4d?4GhNZ<9MiasiZf4M5S&|y=2{l5>j4UB2sjXmO+E#bwgBJ5O;eL zdRk%UYxO0!P0QdVf>*Ox!@i2){$;8|rcgKblTFxUo{Vo$LoGZ!aW%~1HT2VE zOag$hH)s$0jH&O|^jMw@PWS1jDWS9;DNd8WUAS}~DHh=xMt!qI^q3ovx_OlRcdnHBB zY_>06>?poX(_?jmX{_-lZL&Vz=q!-0>UfRjt@`DSVmmaQVH+=>W%w!FtC>a)J6=_T zNmp*e^Mm*>h@>4wH>OOZ&NC_JdIObt){$I)p;^(r!_U?JFIRiVT$vp6l7C2g`&5ce ze2%?V`@lb|k;)^mVawAnLhsm0aX!egv&ymM&)JrL6tgAdDa}_q?6r)d<^(;ZA#us) ziyV8le7F0F+|Hr<1$WPfzkaV?sHL}1`=>(fsR}TieCQ$#QFC3Pmgqvgk^;yb@C2wu zp-_XMP}Y(HI#4t0QvNx*B7!lcxaW9*wfLGCNx9RJ5>zr7Pq`F-xSwzoH*4t|e)RV~ zFZC$CjDmuu5Gkjl3n}<$ibI}oCZ6yFggHFnMaQ$xk({T*RcwK)Sn)!ZO?Xd)GaNcx z3;``y2lqm)JtZ8DIxd_GWdkqN&aF^8tO6)lHE|ben^&lHy-v8 zm^L`R2J1oR-M>X;;mr$>{#d(>R>&F7Uj9$}L$Alh4a_{EWso7NmT+356}RfGxCm8*eecpvODZtA zl;gmvX5(C)oO3nX=4y7#afrbLh_cjTm6Nn`{uo_JS$ZjpLZN%a~xU0dxr@{Epje(o5Sh>3O*cY)$E#!)1x+)7ve%c*Lvf{Py}weckE~^^$5*Bh^;4s zt9~u1{_=r6&#!pIM-$QaBe2QHVO7tUc*KTKEHQzf;+00X2=q<9)=}w5(wmN?=^w(i}=JNwuP{Ze@I}*MK-q9V~2#u zkW|KoT-|WxYDb@|r7OSX4}TZ$AIyD^qQx^EogPVgr2kn9+V0?uw(?-Q3+HHo9=YO+j^cChlDc$v@!I;yCealFgrcQ0 zuaef2et8yEnTfYAl5#Je5*=QMlouV350Z|eFgpDTf=seHRY;0uBe%r!T!p~6|X-e?=!Y7_XCd=!1M`ETs5)D4>=*UP?ZGkMx z_)^SHr6rh%@uiL8y9j==)~WGHE{NxuD-D6lF5xUz!cg;H(S+YTz zjf>sDT+h$dnpYc%FLmNyudb8-Ds`Ql)OCK$pQCp`i;Aac#{Fp~n zb=I7$&gsoKqN?)?)D`~TBohYBi;@X>G2qG5vAG610M7}ztAy5WJ<78_YW!L@bjGf{XwSs4U?*0RkvyiA<7@2mtb z0OW8T1zH;*E07#(NXsW{sejZRC_lNxX_70CR=NsW^?6WC*c+Pk*|IYD`2 z$08^mN;tBXw>G7x50C_u|4G2OpBR-8#>?+J!s zf5KHtEmQX=#?)L`p`HVj<=+ij}LiUQ�s$H>Q0(&+vIx8JpLNunalXOvmB^|U~ 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