From 771235017d5519724b8194848b9c040f747af876 Mon Sep 17 00:00:00 2001 From: neo Date: Fri, 19 Feb 2016 15:30:41 +0900 Subject: [PATCH 01/34] Adding smearing routines (development) --- lib/qcd/action/fermion/FermionOperatorImpl.h | 4 +- lib/qcd/action/gauge/GaugeImpl.h | 1 - lib/qcd/hmc/HMC.h | 2 +- lib/qcd/hmc/HmcRunner.h | 6 +- lib/qcd/smearing/GaugeConfiguration.h | 96 ++++++++++++++++++++ 5 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 lib/qcd/smearing/GaugeConfiguration.h diff --git a/lib/qcd/action/fermion/FermionOperatorImpl.h b/lib/qcd/action/fermion/FermionOperatorImpl.h index 05994a39..312a8e41 100644 --- a/lib/qcd/action/fermion/FermionOperatorImpl.h +++ b/lib/qcd/action/fermion/FermionOperatorImpl.h @@ -75,7 +75,7 @@ namespace Grid { // // // template - // class MyOp : pubic { + // class MyOp : public { // public: // // INHERIT_ALL_IMPL_TYPES(Impl); @@ -110,7 +110,7 @@ namespace Grid { // Single flavour four spinors with colour index /////// template - class WilsonImpl : public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepresentation> > { + class WilsonImpl : public PeriodicGaugeImpl< GaugeImplTypes< S, Nrepresentation> > { public: typedef PeriodicGaugeImpl< GaugeImplTypes< S,Nrepresentation> > Gimpl; diff --git a/lib/qcd/action/gauge/GaugeImpl.h b/lib/qcd/action/gauge/GaugeImpl.h index 51a4675e..02a8017b 100644 --- a/lib/qcd/action/gauge/GaugeImpl.h +++ b/lib/qcd/action/gauge/GaugeImpl.h @@ -44,7 +44,6 @@ template class WilsonLoops; typedef typename GImpl::GaugeLinkField GaugeLinkField;\ typedef typename GImpl::GaugeField GaugeField; - // template class GaugeImplTypes { diff --git a/lib/qcd/hmc/HMC.h b/lib/qcd/hmc/HMC.h index 9e762832..0b87b03e 100644 --- a/lib/qcd/hmc/HMC.h +++ b/lib/qcd/hmc/HMC.h @@ -44,7 +44,7 @@ Author: paboyle namespace Grid{ namespace QCD{ - + struct HMCparameters{ diff --git a/lib/qcd/hmc/HmcRunner.h b/lib/qcd/hmc/HmcRunner.h index 4d8bb2dd..ce92b1d2 100644 --- a/lib/qcd/hmc/HmcRunner.h +++ b/lib/qcd/hmc/HmcRunner.h @@ -47,7 +47,7 @@ public: GridRedBlackCartesian * UrbGrid ; GridRedBlackCartesian * FrbGrid ; - virtual void BuildTheAction (int argc, char **argv) = 0; + virtual void BuildTheAction (int argc, char **argv) = 0; // necessary? void Run (int argc, char **argv){ @@ -96,7 +96,7 @@ public: GridSerialRNG sRNG; GridParallelRNG pRNG(UGrid); - LatticeGaugeField U(UGrid); + LatticeGaugeField U(UGrid); // change this to an extended field (smearing class) std::vector SerSeed({1,2,3,4,5}); std::vector ParSeed({6,7,8,9,10}); @@ -129,7 +129,7 @@ public: Checkpoint.CheckpointRestore(StartTraj, U, sRNG, pRNG); } - HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); + HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); // pass the extended field HMC.AddObservable(&Checkpoint); HMC.AddObservable(&PlaqLog); diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h new file mode 100644 index 00000000..d040b739 --- /dev/null +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -0,0 +1,96 @@ +/*! + @file GaugeConfiguration.h + + @brief Declares the GaugeConfiguration class +*/ +#ifndef GAUGE_CONFIG_ +#define GAUGE_CONFIG_ + +namespace Grid { + + namespace QCD { + + /*! + @brief Smeared configuration container + + It will behave like a configuration from the point of view of + the HMC update and integrators. + An "advanced configuration" object that can provide not only the + data to store the gauge configuration but also operations to manipulate + it like smearing. + + It stores a list of smeared configurations. + */ + template + class GaugeConfiguration { + public: + INHERIT_GIMPL_TYPES(Gimpl) + private: + const unsigned int smearingLevels; + Smear_Stout StoutSmearing; + std::vector SmearedSet; + + // Member functions + void fill_smearedSet(); + GaugeField AnalyticSmearedForce(const GaugeField&, + const GaugeField&) const; + const GaugeField& get_smeared_conf(int) const; + + void set_iLambda(GaugeField& iLambda, + GaugeField& e_iQ, + const GaugeField& iQ, + const GaugeField& Sigmap, + const GaugeField& U)const; + + /* Check these types (do I need to pass iQ1,2 ? ) + void set_uw(RealD& u, RealD& w, + const SUNmat& iQ1, const SUNmat& iQ2)const ; + void set_fj(ComplexD& f0, ComplexD& f1, + CompledD& f2, const RealD& u, + const RealD& w)const; + */ + + RealD func_xi0(RealD w)const; + RealD func_xi1(RealD w)const; + + public: + GaugeField* ThinLinks; /*!< @brief Pointer to the thin + links configuration */ + + /*! @brief Standard constructor */ + GaugeConfiguration(GridCartesian * UGrid, + unsigned int Nsmear, + Smear_Stout& Stout): + smearingLevels(Nsmear), + StoutSmearing(Stout), + ThinLinks(new GaugeField){ + for (unsigned int i=0; i< smearingLevels; ++i) + SmearedSet.push_back(*(new GaugeField(UGrid))); + } + + /*! For just thin links */ + GaugeConfiguration(GridCartesian * UGrid): + smearingLevels(0), + StoutSmearing(), + SmearedSet(0), + ThinLinks(new GaugeField(UGrid)){} + + void set_GaugeField(){ fill_smearedSet(); } + void smeared_force(GaugeField&) const; + GaugeField& get_current_conf() const; + GaugeField& select_conf(bool smeared) const { + if (smeared){ + if (smearingLevels) return get_current_conf(); + else return ThinLinks; + } + else return ThinLinks; + } + + }; + + + } + +} + +#endif From c1b1b89d17e8fb06bb81e61691356071bf2afe77 Mon Sep 17 00:00:00 2001 From: neo Date: Fri, 19 Feb 2016 17:15:27 +0900 Subject: [PATCH 02/34] More on smearing routines, writing APEsmear (dev) --- lib/qcd/smearing/APEsmearing.h | 150 ++++++++++++++++++++++++++ lib/qcd/smearing/BaseSmearing.h | 17 +++ lib/qcd/smearing/GaugeConfiguration.h | 16 ++- lib/qcd/smearing/StoutSmearing.h | 32 ++++++ lib/qcd/utils/WilsonLoops.h | 83 ++++++++++++++ 5 files changed, 294 insertions(+), 4 deletions(-) create mode 100644 lib/qcd/smearing/APEsmearing.h create mode 100644 lib/qcd/smearing/BaseSmearing.h create mode 100644 lib/qcd/smearing/StoutSmearing.h diff --git a/lib/qcd/smearing/APEsmearing.h b/lib/qcd/smearing/APEsmearing.h new file mode 100644 index 00000000..e2a52b56 --- /dev/null +++ b/lib/qcd/smearing/APEsmearing.h @@ -0,0 +1,150 @@ +/*! + @brief Declaration of Smear_APE class for APE smearing +*/ + +#ifndef APE_SMEAR_ +#define APE_SMEAR_ + +/*! @brief APE type smearing of link variables. */ + +template +class Smear_APE: public Smear{ +private: + const std::vector rho;/*!< Array of weights */ + + //This member must be private - we do not want to control from outside + std::vector set_rho(const double)const { + std::vector res; + + for(int mn=0; mn& rho_):rho(rho_){} + Smear_APE(double rho_val):rho(set_rho(rho_val)){} + Smear_APE():rho(set_rho(1.0)){} + ~Smear_APE(){} + + void smear(GaugeField& u_smr, const GaugeField& U)const{ + double d_rho; + GaugeLinkField Cup, tmp_stpl; + WilsonLoops WL; + u_smr = zero; + + for(int mu=0; mu WL; + GaugeLinkField staple, u_tmp, iLambda_mu, iLambda_nu; + GaugeLinkField U_mu, U_nu; + GaugeLinkField sh_field ; + GaugeLinkField temp_Sigma; + + SU::Matrix temp_mat, temp_mat2; + Real rho_munu, rho_numu; + + // to be completed + int Nvol = CommonPrms::instance()->Nvol(); + + for(int mu = 0; mu < Nd; ++mu){ + U_mu = PeekIndex( U, mu); + iLambda_mu = PeekIndex(iLambda, mu); + + + for(int nu = 0; nu < Nd; ++nu){ + if(nu==mu) continue; + U_nu = PeekIndex( U, nu); + iLambda_nu = PeekIndex(iLambda, nu); + + rho_munu = rho[mu + Nd * nu]; + rho_numu = rho[nu + Nd * mu]; + + WL.StapleUpper(staple, U, mu, nu); + + temp_Sigma = adj(staple)*iLambda_nu; + temp_Sigma *= - rho_numu; + //-r_numu*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x)*Lambda_nu(x) + SigmaTerm ................. + + for (int site = 0; site < Nvol; ++site){ + temp_mat = mat_dag(staple,site) * mat(iLambda_nu,site); + temp_mat *= - rho_numu; + AddMat(SigmaTerm, temp_mat, site, mu); + } + sh_field = shiftField(iLambda_nu, mu, Forward()); + + for (int site = 0; site < Nvol; ++site){ + temp_mat = mat(sh_field,site) * mat_dag(staple,site); + temp_mat *= rho_numu; + AddMat(SigmaTerm, temp_mat, site, mu); + }//r_numu*Lambda_nu(mu)*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x) + + sh_field = shiftField(iLambda_mu, nu, Forward()); + + for (int site = 0; site < Nvol; ++site){ + temp_mat = mat(U_nu,site) * mat(sh_field,site) * mat_dag(U_nu,site); + temp_mat = mat_dag(staple,site) * temp_mat; + temp_mat *= - rho_munu; + AddMat(SigmaTerm, temp_mat, site, mu); + }//-r_munu*U_nu(x+mu)*Udag_mu(x+nu)*Lambda_mu(x+nu)*Udag_nu(x) + + staple = 0.0; + sh_field = shiftField(U_nu, mu, Forward()); + + for (int site = 0; site < Nvol; ++site){ + temp_mat2 = mat_dag(sh_field,site) * mat_dag(U_mu,site); + temp_mat = temp_mat2 * mat(iLambda_mu,site) * mat(U_nu,site); + temp_mat *= - rho_munu; + AddMat(staple, temp_mat, site); + temp_mat = temp_mat2 * mat(iLambda_nu,site) * mat(U_nu,site); + temp_mat *= rho_numu; + AddMat(staple, temp_mat, site); + } + + for (int site = 0; site < Nvol; ++site){ + temp_mat = mat_dag(U_nu,site) * mat(iLambda_nu,site); + SetMat(u_tmp, temp_mat, site); + } + + sh_field = shiftField(u_tmp, mu, Forward()); + + for (int site = 0; site < Nvol; ++site){ + temp_mat = mat(sh_field,site) * mat_dag(U_mu,site) * mat(U_nu,site); + temp_mat *= - rho_numu; + AddMat(staple, temp_mat, site); + } + + sh_field = shiftField(staple, nu, Backward()); + + AddSlice(SigmaTerm, sh_field, mu); + } + } + + */ + } + + + + +}; + +#endif diff --git a/lib/qcd/smearing/BaseSmearing.h b/lib/qcd/smearing/BaseSmearing.h new file mode 100644 index 00000000..377bcbc9 --- /dev/null +++ b/lib/qcd/smearing/BaseSmearing.h @@ -0,0 +1,17 @@ +/* + @brief Declares base smearing class Smear + */ +#ifndef BASE_SMEAR_ +#define BASE_SMEAR_ + +template +class Smear{ +public: + INHERIT_GIMPL_TYPES(Gimpl) + + virtual ~Smear(){} + virtual void smear (GaugeField&,const GaugeField&)const = 0; + virtual void derivative(GaugeField&, + const GaugeField&,const GaugeField&) const = 0; +}; +#endif diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h index d040b739..5da5d8fa 100644 --- a/lib/qcd/smearing/GaugeConfiguration.h +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -77,11 +77,15 @@ namespace Grid { void set_GaugeField(){ fill_smearedSet(); } void smeared_force(GaugeField&) const; - GaugeField& get_current_conf() const; - GaugeField& select_conf(bool smeared) const { + GaugeField* get_SmearedU() const{ + return const_cast(&(SmearedSet[smearingLevels-1])); + } + + GaugeField* get_U(bool smeared=false) const { + // get the config, thin links by default if (smeared){ - if (smearingLevels) return get_current_conf(); - else return ThinLinks; + if (smearingLevels) return get_SmearedU(); + else return ThinLinks; } else return ThinLinks; } @@ -93,4 +97,8 @@ namespace Grid { } + + + + #endif diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h new file mode 100644 index 00000000..4b372d64 --- /dev/null +++ b/lib/qcd/smearing/StoutSmearing.h @@ -0,0 +1,32 @@ +/* + @file stoutSmear.hpp + @brief Declares Stout smearing class +*/ +#ifndef STOUT_SMEAR_ +#define STOUT_SMEAR_ + +/*! @brief Stout smearing of link variable. */ +template +class Smear_Stout: public Smear { +private: + const std::valarray d_rho; + const Smear* SmearBase; + + double func_xi0(double w) const; +public: + INHERIT_GIMPL_TYPES(Gimpl) + Smear_Stout(Smear* base):SmearBase(base){} + + /*! Default constructor */ + Smear_Stout():SmearBase(new Smear_APE()){} + + ~Smear_Stout(){} + + void smear(GaugeField&,const GaugeField&) const; + void BaseSmear(GaugeField&, const GaugeField&) const; + void derivative(GaugeField&, const GaugeField&, const GaugeField&) const; + void exponentiate_iQ(GaugeField&, const GaugeField&) const; + +}; + +#endif diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index bab6dec9..8272f1dc 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -171,6 +171,89 @@ public: } } + ////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu + ////////////////////////////////////////////////// + static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu, in nu){ + + GridBase *grid = Umu._grid; + + std::vector U(4,grid); + for(int d=0;d(Umu,d); + } + staple = zero; + GaugeMat tmp(grid); + + + if(nu != mu) { + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // + + staple+=Gimpl::ShiftStaple( + Gimpl::CovShiftForward (U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu, + Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); + + // __ + // | + // |__ + // + // + staple+=Gimpl::ShiftStaple( + Gimpl::CovShiftBackward(U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); + + } + } + + + ////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu, upper part + ////////////////////////////////////////////////// + static void StapleUpper(GaugeMat &staple,const GaugeLorentz &Umu,int mu, in nu){ + + GridBase *grid = Umu._grid; + + std::vector U(4,grid); + for(int d=0;d(Umu,d); + } + staple = zero; + GaugeMat tmp(grid); + + + if(nu != mu) { + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // + + staple+=Gimpl::ShiftStaple( + Gimpl::CovShiftForward (U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu, + Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); + + } + } + + + + + + ////////////////////////////////////////////////////// // Similar to above for rectangle is required ////////////////////////////////////////////////////// From a7251f28c71b7e64d5b85aa0aa465cdeddd5cd3d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 24 Feb 2016 03:16:50 +0900 Subject: [PATCH 03/34] Stout smearing compiles (untested) --- configure | 13 +- lib/Make.inc | 4 +- lib/lattice/Lattice_ET.h | 56 +- lib/qcd/QCD.h | 1 + lib/qcd/action/gauge/GaugeImpl.h | 9 + lib/qcd/smearing/APEsmearing.h | 228 ++++---- lib/qcd/smearing/GaugeConfiguration.h | 6 +- lib/qcd/smearing/Smearing.h | 9 + lib/qcd/smearing/StoutSmearing.h | 140 ++++- lib/qcd/utils/WilsonLoops.h | 790 +++++++++++++------------- lib/simd/Grid_vector_types.h | 3 + lib/simd/Grid_vector_unops.h | 20 + scripts/Make.inc | 4 + tests/Make.inc | 22 +- tests/Test_main.cc | 5 + 15 files changed, 721 insertions(+), 589 deletions(-) create mode 100644 lib/qcd/smearing/Smearing.h create mode 100644 scripts/Make.inc diff --git a/configure b/configure index 1ab3998e..ed5915d6 100755 --- a/configure +++ b/configure @@ -2569,7 +2569,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -am__api_version='1.14' +am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2741,8 +2741,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2761,7 +2761,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -3089,8 +3089,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3149,6 +3149,7 @@ END fi + ac_config_headers="$ac_config_headers lib/Config.h" # Check whether --enable-silent-rules was given. diff --git a/lib/Make.inc b/lib/Make.inc index 73d13eb5..638006fa 100644 --- a/lib/Make.inc +++ b/lib/Make.inc @@ -1,4 +1,4 @@ -HFILES=./algorithms/approx/bigfloat.h ./algorithms/approx/bigfloat_double.h ./algorithms/approx/Chebyshev.h ./algorithms/approx/MultiShiftFunction.h ./algorithms/approx/Remez.h ./algorithms/approx/Zolotarev.h ./algorithms/CoarsenedMatrix.h ./algorithms/iterative/AdefGeneric.h ./algorithms/iterative/ConjugateGradient.h ./algorithms/iterative/ConjugateGradientMultiShift.h ./algorithms/iterative/ConjugateResidual.h ./algorithms/iterative/DenseMatrix.h ./algorithms/iterative/EigenSort.h ./algorithms/iterative/Francis.h ./algorithms/iterative/Householder.h ./algorithms/iterative/ImplicitlyRestartedLanczos.h ./algorithms/iterative/Matrix.h ./algorithms/iterative/MatrixUtils.h ./algorithms/iterative/NormalEquations.h ./algorithms/iterative/PrecConjugateResidual.h ./algorithms/iterative/PrecGeneralisedConjugateResidual.h ./algorithms/iterative/SchurRedBlack.h ./algorithms/LinearOperator.h ./algorithms/Preconditioner.h ./algorithms/SparseMatrix.h ./Algorithms.h ./AlignedAllocator.h ./cartesian/Cartesian_base.h ./cartesian/Cartesian_full.h ./cartesian/Cartesian_red_black.h ./Cartesian.h ./communicator/Communicator_base.h ./Communicator.h ./cshift/Cshift_common.h ./cshift/Cshift_mpi.h ./cshift/Cshift_none.h ./Cshift.h ./Grid.h ./Init.h ./lattice/Lattice_arith.h ./lattice/Lattice_base.h ./lattice/Lattice_comparison.h ./lattice/Lattice_comparison_utils.h ./lattice/Lattice_conformable.h ./lattice/Lattice_coordinate.h ./lattice/Lattice_ET.h ./lattice/Lattice_local.h ./lattice/Lattice_overload.h ./lattice/Lattice_peekpoke.h ./lattice/Lattice_reality.h ./lattice/Lattice_reduction.h ./lattice/Lattice_rng.h ./lattice/Lattice_trace.h ./lattice/Lattice_transfer.h ./lattice/Lattice_transpose.h ./lattice/Lattice_unary.h ./lattice/Lattice_where.h ./Lattice.h ./Log.h ./Old/Tensor_peek.h ./Old/Tensor_poke.h ./parallelIO/BinaryIO.h ./parallelIO/NerscIO.h ./PerfCount.h ./pugixml/pugixml.h ./qcd/action/ActionBase.h ./qcd/action/ActionParams.h ./qcd/action/Actions.h ./qcd/action/fermion/CayleyFermion5D.h ./qcd/action/fermion/ContinuedFractionFermion5D.h ./qcd/action/fermion/DomainWallFermion.h ./qcd/action/fermion/FermionOperator.h ./qcd/action/fermion/FermionOperatorImpl.h ./qcd/action/fermion/g5HermitianLinop.h ./qcd/action/fermion/MobiusFermion.h ./qcd/action/fermion/MobiusZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h ./qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonContfracTanhFermion.h ./qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h ./qcd/action/fermion/PartialFractionFermion5D.h ./qcd/action/fermion/ScaledShamirFermion.h ./qcd/action/fermion/ShamirZolotarevFermion.h ./qcd/action/fermion/WilsonCompressor.h ./qcd/action/fermion/WilsonFermion.h ./qcd/action/fermion/WilsonFermion5D.h ./qcd/action/fermion/WilsonKernels.h ./qcd/action/fermion/WilsonTMFermion.h ./qcd/action/gauge/GaugeImpl.h ./qcd/action/gauge/PlaqPlusRectangleAction.h ./qcd/action/gauge/WilsonGaugeAction.h ./qcd/action/pseudofermion/EvenOddSchurDifferentiable.h ./qcd/action/pseudofermion/OneFlavourEvenOddRational.h ./qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h ./qcd/action/pseudofermion/OneFlavourRational.h ./qcd/action/pseudofermion/OneFlavourRationalRatio.h ./qcd/action/pseudofermion/TwoFlavour.h ./qcd/action/pseudofermion/TwoFlavourEvenOdd.h ./qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h ./qcd/action/pseudofermion/TwoFlavourRatio.h ./qcd/hmc/HMC.h ./qcd/hmc/HmcRunner.h ./qcd/hmc/integrators/Integrator.h ./qcd/hmc/integrators/Integrator_algorithm.h ./qcd/hmc/NerscCheckpointer.h ./qcd/QCD.h ./qcd/spin/Dirac.h ./qcd/spin/TwoSpinor.h ./qcd/utils/CovariantCshift.h ./qcd/utils/LinalgUtils.h ./qcd/utils/SpaceTimeGrid.h ./qcd/utils/SUn.h ./qcd/utils/WilsonLoops.h ./serialisation/BaseIO.h ./serialisation/BinaryIO.h ./serialisation/MacroMagic.h ./serialisation/Serialisation.h ./serialisation/TextIO.h ./serialisation/XmlIO.h ./simd/Avx512Asm.h ./simd/Grid_avx.h ./simd/Grid_avx512.h ./simd/Grid_empty.h ./simd/Grid_imci.h ./simd/Grid_neon.h ./simd/Grid_qpx.h ./simd/Grid_sse4.h ./simd/Grid_vector_types.h ./simd/Grid_vector_unops.h ./Simd.h ./stencil/Lebesgue.h ./Stencil.h ./tensors/Tensor_arith.h ./tensors/Tensor_arith_add.h ./tensors/Tensor_arith_mac.h ./tensors/Tensor_arith_mul.h ./tensors/Tensor_arith_scalar.h ./tensors/Tensor_arith_sub.h ./tensors/Tensor_class.h ./tensors/Tensor_determinant.h ./tensors/Tensor_exp.h ./tensors/Tensor_extract_merge.h ./tensors/Tensor_index.h ./tensors/Tensor_inner.h ./tensors/Tensor_logical.h ./tensors/Tensor_outer.h ./tensors/Tensor_reality.h ./tensors/Tensor_Ta.h ./tensors/Tensor_trace.h ./tensors/Tensor_traits.h ./tensors/Tensor_transpose.h ./tensors/Tensor_unary.h ./Tensors.h ./Threads.h ./Timer.h +HFILES=./serialisation/MacroMagic.h ./serialisation/XmlIO.h ./serialisation/BaseIO.h ./serialisation/Serialisation.h ./serialisation/TextIO.h ./serialisation/BinaryIO.h ./Log.h ./cartesian/Cartesian_red_black.h ./cartesian/Cartesian_base.h ./cartesian/Cartesian_full.h ./Stencil.h ./Lattice.h ./Tensors.h ./Communicator.h ./Cartesian.h ./Grid.h ./Simd.h ./pugixml/pugixml.h ./PerfCount.h ./Old/Tensor_poke.h ./Old/Tensor_peek.h ./parallelIO/BinaryIO.h ./parallelIO/NerscIO.h ./lattice/Lattice_comparison_utils.h ./lattice/Lattice_coordinate.h ./lattice/Lattice_reality.h ./lattice/Lattice_rng.h ./lattice/Lattice_overload.h ./lattice/Lattice_comparison.h ./lattice/Lattice_reduction.h ./lattice/Lattice_conformable.h ./lattice/Lattice_arith.h ./lattice/Lattice_unary.h ./lattice/Lattice_ET.h ./lattice/Lattice_peekpoke.h ./lattice/Lattice_local.h ./lattice/Lattice_trace.h ./lattice/Lattice_base.h ./lattice/Lattice_transfer.h ./lattice/Lattice_transpose.h ./lattice/Lattice_where.h ./Threads.h ./tensors/Tensor_transpose.h ./tensors/Tensor_arith_scalar.h ./tensors/Tensor_arith_sub.h ./tensors/Tensor_Ta.h ./tensors/Tensor_reality.h ./tensors/Tensor_outer.h ./tensors/Tensor_unary.h ./tensors/Tensor_determinant.h ./tensors/Tensor_arith.h ./tensors/Tensor_index.h ./tensors/Tensor_trace.h ./tensors/Tensor_logical.h ./tensors/Tensor_traits.h ./tensors/Tensor_class.h ./tensors/Tensor_exp.h ./tensors/Tensor_arith_mul.h ./tensors/Tensor_inner.h ./tensors/Tensor_arith_add.h ./tensors/Tensor_extract_merge.h ./tensors/Tensor_arith_mac.h ./AlignedAllocator.h ./simd/Grid_qpx.h ./simd/Grid_vector_unops.h ./simd/Grid_empty.h ./simd/Grid_neon.h ./simd/Avx512Asm.h ./simd/Grid_sse4.h ./simd/Grid_imci.h ./simd/Grid_avx512.h ./simd/Grid_avx.h ./simd/Grid_vector_types.h ./Config.h ./communicator/Communicator_base.h ./Timer.h ./Init.h ./stencil/Lebesgue.h ./qcd/QCD.h ./qcd/smearing/GaugeConfiguration.h ./qcd/smearing/BaseSmearing.h ./qcd/smearing/StoutSmearing.h ./qcd/smearing/APEsmearing.h ./qcd/utils/CovariantCshift.h ./qcd/utils/LinalgUtils.h ./qcd/utils/SUn.h ./qcd/utils/WilsonLoops.h ./qcd/utils/SpaceTimeGrid.h ./qcd/spin/Dirac.h ./qcd/spin/TwoSpinor.h ./qcd/hmc/NerscCheckpointer.h ./qcd/hmc/integrators/Integrator_algorithm.h ./qcd/hmc/integrators/Integrator.h ./qcd/hmc/HmcRunner.h ./qcd/hmc/HMC.h ./qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h ./qcd/action/fermion/WilsonKernels.h ./qcd/action/fermion/ShamirZolotarevFermion.h ./qcd/action/fermion/DomainWallFermion.h ./qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h ./qcd/action/fermion/CayleyFermion5D.h ./qcd/action/fermion/WilsonCompressor.h ./qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h ./qcd/action/fermion/ScaledShamirFermion.h ./qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h ./qcd/action/fermion/MobiusZolotarevFermion.h ./qcd/action/fermion/MobiusFermion.h ./qcd/action/fermion/PartialFractionFermion5D.h ./qcd/action/fermion/FermionOperator.h ./qcd/action/fermion/ContinuedFractionFermion5D.h ./qcd/action/fermion/OverlapWilsonContfracTanhFermion.h ./qcd/action/fermion/WilsonFermion.h ./qcd/action/fermion/FermionOperatorImpl.h ./qcd/action/fermion/WilsonTMFermion.h ./qcd/action/fermion/g5HermitianLinop.h ./qcd/action/fermion/WilsonFermion5D.h ./qcd/action/gauge/WilsonGaugeAction.h ./qcd/action/gauge/PlaqPlusRectangleAction.h ./qcd/action/gauge/GaugeImpl.h ./qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h ./qcd/action/pseudofermion/TwoFlavourEvenOdd.h ./qcd/action/pseudofermion/OneFlavourRationalRatio.h ./qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h ./qcd/action/pseudofermion/OneFlavourEvenOddRational.h ./qcd/action/pseudofermion/TwoFlavourRatio.h ./qcd/action/pseudofermion/OneFlavourRational.h ./qcd/action/pseudofermion/TwoFlavour.h ./qcd/action/pseudofermion/EvenOddSchurDifferentiable.h ./qcd/action/ActionBase.h ./qcd/action/ActionParams.h ./qcd/action/Actions.h ./Cshift.h ./algorithms/CoarsenedMatrix.h ./algorithms/iterative/PrecGeneralisedConjugateResidual.h ./algorithms/iterative/Francis.h ./algorithms/iterative/NormalEquations.h ./algorithms/iterative/EigenSort.h ./algorithms/iterative/PrecConjugateResidual.h ./algorithms/iterative/Householder.h ./algorithms/iterative/ConjugateGradientMultiShift.h ./algorithms/iterative/SchurRedBlack.h ./algorithms/iterative/Matrix.h ./algorithms/iterative/AdefGeneric.h ./algorithms/iterative/DenseMatrix.h ./algorithms/iterative/ConjugateResidual.h ./algorithms/iterative/ConjugateGradient.h ./algorithms/iterative/MatrixUtils.h ./algorithms/iterative/ImplicitlyRestartedLanczos.h ./algorithms/SparseMatrix.h ./algorithms/Preconditioner.h ./algorithms/approx/Remez.h ./algorithms/approx/MultiShiftFunction.h ./algorithms/approx/Zolotarev.h ./algorithms/approx/bigfloat.h ./algorithms/approx/Chebyshev.h ./algorithms/approx/bigfloat_double.h ./algorithms/LinearOperator.h ./Algorithms.h ./cshift/Cshift_mpi.h ./cshift/Cshift_common.h ./cshift/Cshift_none.h -CCFILES=./algorithms/approx/MultiShiftFunction.cc ./algorithms/approx/Remez.cc ./algorithms/approx/Zolotarev.cc ./Init.cc ./Log.cc ./PerfCount.cc ./pugixml/pugixml.cc ./qcd/action/fermion/CayleyFermion5D.cc ./qcd/action/fermion/ContinuedFractionFermion5D.cc ./qcd/action/fermion/PartialFractionFermion5D.cc ./qcd/action/fermion/WilsonFermion.cc ./qcd/action/fermion/WilsonFermion5D.cc ./qcd/action/fermion/WilsonKernels.cc ./qcd/action/fermion/WilsonKernelsAsm.cc ./qcd/action/fermion/WilsonKernelsHand.cc ./qcd/action/fermion/WilsonTMFermion.cc ./qcd/hmc/HMC.cc ./qcd/spin/Dirac.cc ./qcd/utils/SpaceTimeGrid.cc ./serialisation/BinaryIO.cc ./serialisation/TextIO.cc ./serialisation/XmlIO.cc ./stencil/Lebesgue.cc ./stencil/Stencil_common.cc +CCFILES=./serialisation/XmlIO.cc ./serialisation/BinaryIO.cc ./serialisation/TextIO.cc ./pugixml/pugixml.cc ./Init.cc ./Log.cc ./stencil/Lebesgue.cc ./stencil/Stencil_common.cc ./qcd/utils/SpaceTimeGrid.cc ./qcd/spin/Dirac.cc ./qcd/hmc/HMC.cc ./qcd/action/fermion/WilsonFermion5D.cc ./qcd/action/fermion/WilsonFermion.cc ./qcd/action/fermion/WilsonTMFermion.cc ./qcd/action/fermion/ContinuedFractionFermion5D.cc ./qcd/action/fermion/WilsonKernels.cc ./qcd/action/fermion/CayleyFermion5D.cc ./qcd/action/fermion/WilsonKernelsHand.cc ./qcd/action/fermion/PartialFractionFermion5D.cc ./qcd/action/fermion/WilsonKernelsAsm.cc ./algorithms/approx/MultiShiftFunction.cc ./algorithms/approx/Zolotarev.cc ./algorithms/approx/Remez.cc ./PerfCount.cc diff --git a/lib/lattice/Lattice_ET.h b/lib/lattice/Lattice_ET.h index 7644f9da..742c4537 100644 --- a/lib/lattice/Lattice_ET.h +++ b/lib/lattice/Lattice_ET.h @@ -195,31 +195,34 @@ inline void CBFromExpression( int &cb,const LatticeTrinaryExpression struct name\ -{\ - static auto inline func(const arg a)-> decltype(ret) { return ret; } \ -}; - -GridUnopClass(UnarySub,-a); -GridUnopClass(UnaryNot,Not(a)); -GridUnopClass(UnaryAdj,adj(a)); -GridUnopClass(UnaryConj,conjugate(a)); -GridUnopClass(UnaryTrace,trace(a)); -GridUnopClass(UnaryTranspose,transpose(a)); -GridUnopClass(UnaryTa,Ta(a)); -GridUnopClass(UnaryProjectOnGroup,ProjectOnGroup(a)); -GridUnopClass(UnaryReal,real(a)); -GridUnopClass(UnaryImag,imag(a)); -GridUnopClass(UnaryToReal,toReal(a)); -GridUnopClass(UnaryToComplex,toComplex(a)); -GridUnopClass(UnaryAbs,abs(a)); -GridUnopClass(UnarySqrt,sqrt(a)); -GridUnopClass(UnaryRsqrt,rsqrt(a)); -GridUnopClass(UnarySin,sin(a)); -GridUnopClass(UnaryCos,cos(a)); -GridUnopClass(UnaryLog,log(a)); -GridUnopClass(UnaryExp,exp(a)); - + template struct name \ + { \ + static auto inline func(const arg a)-> decltype(ret) { return ret; } \ + }; + + GridUnopClass(UnarySub,-a); + GridUnopClass(UnaryNot,Not(a)); + GridUnopClass(UnaryAdj,adj(a)); + GridUnopClass(UnaryConj,conjugate(a)); + GridUnopClass(UnaryTrace,trace(a)); + GridUnopClass(UnaryTranspose,transpose(a)); + GridUnopClass(UnaryTa,Ta(a)); + GridUnopClass(UnaryProjectOnGroup,ProjectOnGroup(a)); + GridUnopClass(UnaryReal,real(a)); + GridUnopClass(UnaryImag,imag(a)); + GridUnopClass(UnaryToReal,toReal(a)); + GridUnopClass(UnaryToComplex,toComplex(a)); + GridUnopClass(UnaryTimesI,timesI(a)); + GridUnopClass(UnaryAbs,abs(a)); + GridUnopClass(UnarySqrt,sqrt(a)); + GridUnopClass(UnaryRsqrt,rsqrt(a)); + GridUnopClass(UnarySin,sin(a)); + GridUnopClass(UnaryCos,cos(a)); + GridUnopClass(UnaryAsin,sin(a)); + GridUnopClass(UnaryAcos,cos(a)); + GridUnopClass(UnaryLog,log(a)); + GridUnopClass(UnaryExp,exp(a)); + //////////////////////////////////////////// // Binary operators //////////////////////////////////////////// @@ -325,11 +328,14 @@ GRID_DEF_UNOP(real,UnaryReal); GRID_DEF_UNOP(imag,UnaryImag); GRID_DEF_UNOP(toReal,UnaryToReal); GRID_DEF_UNOP(toComplex,UnaryToComplex); +GRID_DEF_UNOP(timesI,UnaryTimesI); GRID_DEF_UNOP(abs ,UnaryAbs); //abs overloaded in cmath C++98; DON'T do the abs-fabs-dabs-labs thing GRID_DEF_UNOP(sqrt ,UnarySqrt); GRID_DEF_UNOP(rsqrt,UnaryRsqrt); GRID_DEF_UNOP(sin ,UnarySin); GRID_DEF_UNOP(cos ,UnaryCos); +GRID_DEF_UNOP(asin ,UnaryAsin); +GRID_DEF_UNOP(acos ,UnaryAcos); GRID_DEF_UNOP(log ,UnaryLog); GRID_DEF_UNOP(exp ,UnaryExp); diff --git a/lib/qcd/QCD.h b/lib/qcd/QCD.h index b819f69c..ffb6268a 100644 --- a/lib/qcd/QCD.h +++ b/lib/qcd/QCD.h @@ -462,5 +462,6 @@ namespace QCD { #include #include +#include #endif diff --git a/lib/qcd/action/gauge/GaugeImpl.h b/lib/qcd/action/gauge/GaugeImpl.h index 02a8017b..2181ec6a 100644 --- a/lib/qcd/action/gauge/GaugeImpl.h +++ b/lib/qcd/action/gauge/GaugeImpl.h @@ -60,6 +60,15 @@ template class WilsonLoops; typedef Lattice GaugeLinkField; // bit ugly naming; polarised gauge field, lorentz... all ugly typedef Lattice GaugeField; + // Move this elsewhere? + void AddGaugeLink(GaugeField& U, GaugeLinkField& W, int mu){ // U[mu] += W +PARALLEL_FOR_LOOP + for(auto ss=0;ssoSites();ss++){ + U._odata[ss]._internal[mu] = U._odata[ss]._internal[mu] + W._odata[ss]._internal; + } + } + + }; // Composition with smeared link, bc's etc.. probably need multiple inheritance diff --git a/lib/qcd/smearing/APEsmearing.h b/lib/qcd/smearing/APEsmearing.h index e2a52b56..24ac4b96 100644 --- a/lib/qcd/smearing/APEsmearing.h +++ b/lib/qcd/smearing/APEsmearing.h @@ -5,146 +5,120 @@ #ifndef APE_SMEAR_ #define APE_SMEAR_ -/*! @brief APE type smearing of link variables. */ +namespace Grid { + namespace QCD { -template -class Smear_APE: public Smear{ -private: - const std::vector rho;/*!< Array of weights */ - //This member must be private - we do not want to control from outside - std::vector set_rho(const double)const { - std::vector res; + /*! @brief APE type smearing of link variables. */ + template + class Smear_APE: public Smear{ + private: + const std::vector rho;/*!< Array of weights */ + + //This member must be private - we do not want to control from outside + std::vector set_rho(const double common_rho)const { + std::vector res; - for(int mn=0; mn& rho_):rho(rho_){} - Smear_APE(double rho_val):rho(set_rho(rho_val)){} - Smear_APE():rho(set_rho(1.0)){} - ~Smear_APE(){} - - void smear(GaugeField& u_smr, const GaugeField& U)const{ - double d_rho; - GaugeLinkField Cup, tmp_stpl; - WilsonLoops WL; - u_smr = zero; - - for(int mu=0; mu& rho_):rho(rho_){} + Smear_APE(double rho_val):rho(set_rho(rho_val)){} + Smear_APE():rho(set_rho(1.0)){} + ~Smear_APE(){} - WilsonLoops WL; - GaugeLinkField staple, u_tmp, iLambda_mu, iLambda_nu; - GaugeLinkField U_mu, U_nu; - GaugeLinkField sh_field ; - GaugeLinkField temp_Sigma; + void smear(GaugeField& u_smr, const GaugeField& U)const{ + GridBase *grid = U._grid; + double d_rho; + GaugeLinkField Cup(grid), tmp_stpl(grid); + WilsonLoops WL; + u_smr = zero; // probably unecessary - SU::Matrix temp_mat, temp_mat2; - Real rho_munu, rho_numu; - - // to be completed - int Nvol = CommonPrms::instance()->Nvol(); - - for(int mu = 0; mu < Nd; ++mu){ - U_mu = PeekIndex( U, mu); - iLambda_mu = PeekIndex(iLambda, mu); - - - for(int nu = 0; nu < Nd; ++nu){ - if(nu==mu) continue; - U_nu = PeekIndex( U, nu); - iLambda_nu = PeekIndex(iLambda, nu); - - rho_munu = rho[mu + Nd * nu]; - rho_numu = rho[nu + Nd * mu]; - - WL.StapleUpper(staple, U, mu, nu); - - temp_Sigma = adj(staple)*iLambda_nu; - temp_Sigma *= - rho_numu; - //-r_numu*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x)*Lambda_nu(x) - SigmaTerm ................. - - for (int site = 0; site < Nvol; ++site){ - temp_mat = mat_dag(staple,site) * mat(iLambda_nu,site); - temp_mat *= - rho_numu; - AddMat(SigmaTerm, temp_mat, site, mu); + for(int mu=0; mugSites(); + + WilsonLoops WL; + GaugeLinkField staple(grid), u_tmp(grid), iLambda_mu(grid), iLambda_nu(grid); + GaugeLinkField U_mu(grid), U_nu(grid), sh_field(grid), temp_Sigma(grid); + Real rho_munu, rho_numu; + + for(int mu = 0; mu < Nd; ++mu){ + U_mu = PeekIndex( U, mu); + iLambda_mu = PeekIndex(iLambda, mu); + + for(int nu = 0; nu < Nd; ++nu){ + if(nu==mu) continue; + U_nu = PeekIndex( U, nu); + iLambda_nu = PeekIndex(iLambda, nu); + + rho_munu = rho[mu + Nd * nu]; + rho_numu = rho[nu + Nd * mu]; + + WL.StapleUpper(staple, U, mu, nu); + + temp_Sigma = -rho_numu*staple*iLambda_nu; + //-r_numu*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x)*Lambda_nu(x) + AddGaugeLink(SigmaTerm, temp_Sigma, mu); + + sh_field = Cshift(iLambda_nu, mu, 1);// general also for Gparity? + + temp_Sigma = rho_numu*sh_field*staple; + //r_numu*Lambda_nu(mu)*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x) + AddGaugeLink(SigmaTerm, temp_Sigma, mu); + + sh_field = Cshift(iLambda_mu, nu, 1); + + temp_Sigma = -rho_munu*staple*U_nu*sh_field*adj(U_nu); + //-r_munu*U_nu(x+mu)*Udag_mu(x+nu)*Lambda_mu(x+nu)*Udag_nu(x) + AddGaugeLink(SigmaTerm, temp_Sigma, mu); + + staple = zero; + sh_field = Cshift(U_nu, mu, 1); + + temp_Sigma = -rho_munu*adj(sh_field)*adj(U_mu)*iLambda_mu*U_nu; + temp_Sigma += rho_numu*adj(sh_field)*adj(U_mu)*iLambda_nu*U_nu; + + u_tmp = adj(U_nu)*iLambda_nu; + sh_field = Cshift(u_tmp, mu, 1); + temp_Sigma += -rho_numu*sh_field*adj(U_mu)*U_nu; + sh_field = Cshift(temp_Sigma, nu, -1); + AddGaugeLink(SigmaTerm, sh_field, mu); + + } + } + } + }; - -}; - + }// namespace QCD +}//namespace Grid #endif diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h index 5da5d8fa..f38af279 100644 --- a/lib/qcd/smearing/GaugeConfiguration.h +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -22,7 +22,7 @@ namespace Grid { It stores a list of smeared configurations. */ template - class GaugeConfiguration { + class SmearedConfiguration { public: INHERIT_GIMPL_TYPES(Gimpl) private: @@ -58,7 +58,7 @@ namespace Grid { links configuration */ /*! @brief Standard constructor */ - GaugeConfiguration(GridCartesian * UGrid, + SmearedConfiguration(GridCartesian * UGrid, unsigned int Nsmear, Smear_Stout& Stout): smearingLevels(Nsmear), @@ -69,7 +69,7 @@ namespace Grid { } /*! For just thin links */ - GaugeConfiguration(GridCartesian * UGrid): + SmearedConfiguration(GridCartesian * UGrid): smearingLevels(0), StoutSmearing(), SmearedSet(0), diff --git a/lib/qcd/smearing/Smearing.h b/lib/qcd/smearing/Smearing.h new file mode 100644 index 00000000..76d7d935 --- /dev/null +++ b/lib/qcd/smearing/Smearing.h @@ -0,0 +1,9 @@ +#ifndef GRID_QCD_SMEARING_H +#define GRID_QCD_SMEARING_H + +#include +#include +#include + + +#endif diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index 4b372d64..a9faed23 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -5,28 +5,132 @@ #ifndef STOUT_SMEAR_ #define STOUT_SMEAR_ -/*! @brief Stout smearing of link variable. */ -template -class Smear_Stout: public Smear { -private: - const std::valarray d_rho; - const Smear* SmearBase; +namespace Grid { + namespace QCD { - double func_xi0(double w) const; -public: - INHERIT_GIMPL_TYPES(Gimpl) - Smear_Stout(Smear* base):SmearBase(base){} + /*! @brief Stout smearing of link variable. */ + template + class Smear_Stout: public Smear { + private: + const std::vector d_rho; + const Smear < Gimpl > * SmearBase; + + LatticeReal func_xi0(LatticeReal w) const{ + // Define a function to do the check + //if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: "<< w <<"\n"; + return sin(w)/w; + } + + public: + INHERIT_GIMPL_TYPES(Gimpl) + + Smear_Stout(Smear < Gimpl >* base):SmearBase(base){} + + /*! Default constructor */ + Smear_Stout():SmearBase(new Smear_APE < Gimpl > ()){} + + ~Smear_Stout(){} + + void smear(GaugeField& u_smr,const GaugeField& U) const{ + long double timing; + + GaugeField u_tmp1, q_mu; + + std::cout<< GridLogDebug << "Stout smearing started\n"; + + //Smear the configurations + SmearBase->smear(u_tmp1, U); + + q_mu = Ta(u_tmp1*adj(u_tmp1)); // q_mu = Ta(Omega_mu) + + exponentiate_iQ(u_tmp1, q_mu); - /*! Default constructor */ - Smear_Stout():SmearBase(new Smear_APE()){} + u_smr = u_tmp1*U; + + std::cout<< GridLogDebug << "Stout smearing completed\n"; + } + void derivative(GaugeField& SigmaTerm, + const GaugeField& iLambda, + const GaugeField& Gauge) const{ + SmearBase->derivative(SigmaTerm, iLambda, Gauge); + } + + + void BaseSmear(GaugeField& C, + const GaugeField& U) const{ + SmearBase->smear(C, U); + } + + void exponentiate_iQ(GaugeField& e_iQ, + const GaugeField& iQ) const{ + // Put this outside + // only valid for SU(3) matrices - ~Smear_Stout(){} + GridBase *grid = iQ._grid; + Real one_over_three = 1.0/3.0; + Real one_over_two = 1.0/2.0; - void smear(GaugeField&,const GaugeField&) const; - void BaseSmear(GaugeField&, const GaugeField&) const; - void derivative(GaugeField&, const GaugeField&, const GaugeField&) const; - void exponentiate_iQ(GaugeField&, const GaugeField&) const; + GaugeField unity; + GaugeLinkField Umu(iQ._grid); + Umu=1.0; + for(int mu=0;mu 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 */ +*************************************************************************************/ +/* END LEGAL */ #ifndef QCD_UTILS_WILSON_LOOPS_H #define QCD_UTILS_WILSON_LOOPS_H namespace Grid { -namespace QCD { - -// Common wilson loop observables -template -class WilsonLoops : 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 + class WilsonLoops : 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]))); } - } - } - ////////////////////////////////////////////////// - // sum over all x,y,z,t and over all planes of plaquette - ////////////////////////////////////////////////// - static RealD sumPlaquette(const GaugeLorentz &Umu){ - std::vector U(4,Umu._grid); - - for(int mu=0;mu(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 RealD avgPlaquette(const GaugeLorentz &Umu){ - - RealD sumplaq = sumPlaquette(Umu); - - double vol = Umu._grid->gSites(); - - double faces = (1.0*Nd*(Nd-1))/2.0; - - return sumplaq/vol/faces/Nc; // Nd , Nc dependent... FIXME - } - static RealD linkTrace(const GaugeLorentz &Umu){ - std::vector U(4,Umu._grid); - - LatticeComplex Tr(Umu._grid); Tr=zero; - for(int mu=0;mu(Umu,mu); - Tr = Tr+trace(U[mu]); - } - - TComplex Tp = sum(Tr); - Complex p = TensorRemove(Tp); - - double vol = Umu._grid->gSites(); - - return p.real()/vol/4.0/3.0; - }; - ////////////////////////////////////////////////// - // the sum over all staples on each site - ////////////////////////////////////////////////// - static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu){ - - GridBase *grid = Umu._grid; - - std::vector U(4,grid); - for(int d=0;d(Umu,d); - } - staple = zero; - GaugeMat tmp(grid); - - - for(int nu=0;nu nu - - // __ - // | - // __| - // - - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftForward (U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); - - // __ - // | - // |__ - // - // - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftBackward(U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); + ////////////////////////////////////////////////// + // 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(4,Umu._grid); + + for(int mu=0;mu(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 RealD avgPlaquette(const GaugeLorentz &Umu){ + + RealD sumplaq = sumPlaquette(Umu); + + double vol = Umu._grid->gSites(); + + double faces = (1.0*Nd*(Nd-1))/2.0; + + return sumplaq/vol/faces/Nc; // Nd , Nc dependent... FIXME + } + static RealD linkTrace(const GaugeLorentz &Umu){ + std::vector U(4,Umu._grid); + + LatticeComplex Tr(Umu._grid); Tr=zero; + for(int mu=0;mu(Umu,mu); + Tr = Tr+trace(U[mu]); + } + + TComplex Tp = sum(Tr); + Complex p = TensorRemove(Tp); + + double vol = Umu._grid->gSites(); + + return p.real()/vol/4.0/3.0; + }; + ////////////////////////////////////////////////// + // the sum over all staples on each site + ////////////////////////////////////////////////// + static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu){ + + GridBase *grid = Umu._grid; + + std::vector U(4,grid); + for(int d=0;d(Umu,d); + } + staple = zero; + + + for(int nu=0;nu nu + + // __ + // | + // __| + // + + staple+=Gimpl::ShiftStaple(Gimpl::CovShiftForward (U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu, + Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); + + // __ + // | + // |__ + // + // + staple+=Gimpl::ShiftStaple(Gimpl::CovShiftBackward(U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); + } + } + } + + ////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu + ////////////////////////////////////////////////// + static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu, int nu){ - ////////////////////////////////////////////////// - // the sum over all staples on each site in direction mu,nu - ////////////////////////////////////////////////// - static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu, in nu){ + GridBase *grid = Umu._grid; + + std::vector U(4,grid); + for(int d=0;d(Umu,d); + } + staple = zero; + + + if(nu != mu) { + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // - GridBase *grid = Umu._grid; + staple+=Gimpl::ShiftStaple( + Gimpl::CovShiftForward (U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu, + Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); + + // __ + // | + // |__ + // + // + staple+=Gimpl::ShiftStaple( + Gimpl::CovShiftBackward(U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); + + } + } + + + ////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu, upper part + ////////////////////////////////////////////////// + static void StapleUpper(GaugeMat &staple,const GaugeLorentz &Umu,int mu, int nu){ + + GridBase *grid = Umu._grid; + + std::vector U(4,grid); + for(int d=0;d(Umu,d); + } + staple = zero; - std::vector U(4,grid); - for(int d=0;d(Umu,d); - } - staple = zero; - GaugeMat tmp(grid); - if(nu != mu) { + if(nu != mu) { - // mu - // ^ - // |__> nu + // mu + // ^ + // |__> nu - // __ - // | - // __| - // + // __ + // | + // __| + // - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftForward (U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); + staple+=Gimpl::ShiftStaple( + Gimpl::CovShiftForward (U[nu],nu, + Gimpl::CovShiftBackward(U[mu],mu, + Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); - // __ - // | - // |__ - // - // - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftBackward(U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); - - } - } - - - ////////////////////////////////////////////////// - // the sum over all staples on each site in direction mu,nu, upper part - ////////////////////////////////////////////////// - static void StapleUpper(GaugeMat &staple,const GaugeLorentz &Umu,int mu, in nu){ - - GridBase *grid = Umu._grid; - - std::vector U(4,grid); - for(int d=0;d(Umu,d); - } - staple = zero; - GaugeMat tmp(grid); - - - if(nu != mu) { - - // mu - // ^ - // |__> nu - - // __ - // | - // __| - // - - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftForward (U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); - - } - } + } + } - ////////////////////////////////////////////////////// - // Similar to above for rectangle is required - ////////////////////////////////////////////////////// - static void dirRectangle(GaugeMat &rect,const std::vector &U, const int mu, const int nu) - { - rect = Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[mu],mu,U[nu]))* // ->->| - adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[mu],mu,U[mu]))) ; - rect = rect + + ////////////////////////////////////////////////////// + // Similar to above for rectangle is required + ////////////////////////////////////////////////////// + static void dirRectangle(GaugeMat &rect,const std::vector &U, const int mu, const int nu) + { + rect = Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[mu],mu,U[nu]))* // ->->| + adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[mu],mu,U[mu]))) ; + rect = rect + Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[nu],nu,U[nu]))* // ->|| - adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[nu],nu,U[mu]))) ; - } - static void traceDirRectangle(LatticeComplex &rect, const std::vector &U, const int mu, const int nu) - { - GaugeMat sp(U[0]._grid); - dirRectangle(sp,U,mu,nu); - rect=trace(sp); - } - static void siteRectangle(LatticeComplex &Rect,const std::vector &U) - { - LatticeComplex siteRect(U[0]._grid); - Rect=zero; - for(int mu=1;mu U(4,Umu._grid); + static void traceDirRectangle(LatticeComplex &rect, const std::vector &U, const int mu, const int nu) + { + GaugeMat sp(U[0]._grid); + dirRectangle(sp,U,mu,nu); + rect=trace(sp); + } + static void siteRectangle(LatticeComplex &Rect,const std::vector &U) + { + LatticeComplex siteRect(U[0]._grid); + Rect=zero; + for(int mu=1;mu U(4,Umu._grid); - for(int mu=0;mu(Umu,mu); - } + for(int mu=0;mu(Umu,mu); + } - LatticeComplex Rect(Umu._grid); + LatticeComplex Rect(Umu._grid); - siteRectangle(Rect,U); + siteRectangle(Rect,U); - TComplex Tp = sum(Rect); - Complex p = TensorRemove(Tp); - return p.real(); - } - ////////////////////////////////////////////////// - // average over all x,y,z,t and over all planes of plaquette - ////////////////////////////////////////////////// - static RealD avgRectangle(const GaugeLorentz &Umu){ + TComplex Tp = sum(Rect); + Complex p = TensorRemove(Tp); + return p.real(); + } + ////////////////////////////////////////////////// + // average over all x,y,z,t and over all planes of plaquette + ////////////////////////////////////////////////// + static RealD avgRectangle(const GaugeLorentz &Umu){ - RealD sumrect = sumRectangle(Umu); + RealD sumrect = sumRectangle(Umu); - double vol = Umu._grid->gSites(); + double vol = Umu._grid->gSites(); - double faces = (1.0*Nd*(Nd-1)); // 2 distinct orientations summed + double faces = (1.0*Nd*(Nd-1)); // 2 distinct orientations summed - return sumrect/vol/faces/Nc; // Nd , Nc dependent... FIXME - } + return sumrect/vol/faces/Nc; // Nd , Nc dependent... FIXME + } - ////////////////////////////////////////////////// - // the sum over all staples on each site - ////////////////////////////////////////////////// - static void RectStapleDouble(GaugeMat &U2,const GaugeMat & U,int mu){ - U2 = U * Cshift(U,mu,1); - } + ////////////////////////////////////////////////// + // the sum over all staples on each site + ////////////////////////////////////////////////// + static void RectStapleDouble(GaugeMat &U2,const GaugeMat & U,int mu){ + U2 = U * Cshift(U,mu,1); + } - //////////////////////////////////////////////////////////////////////////// - // Hop by two optimisation strategy does not work nicely with Gparity. (could do, - // but need to track two deep where cross boundary and apply a conjugation). - // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do so . - //////////////////////////////////////////////////////////////////////////// - static void RectStapleOptimised(GaugeMat &Stap,std::vector &U2,std::vector &U,int mu){ + //////////////////////////////////////////////////////////////////////////// + // Hop by two optimisation strategy does not work nicely with Gparity. (could do, + // but need to track two deep where cross boundary and apply a conjugation). + // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do so . + //////////////////////////////////////////////////////////////////////////// + static void RectStapleOptimised(GaugeMat &Stap,std::vector &U2,std::vector &U,int mu){ - Stap = zero; + Stap = zero; - GridBase *grid = U[0]._grid; + GridBase *grid = U[0]._grid; - GaugeMat Staple2x1 (grid); - GaugeMat tmp (grid); + GaugeMat Staple2x1 (grid); + GaugeMat tmp (grid); - for(int nu=0;nu &U2, - std::vector &U, int mu) - { - if ( Gimpl::isPeriodicGaugeField() ){ - RectStapleOptimised(Stap,U2,U,mu); - } else { - RectStapleUnoptimised(Stap,Umu,mu); - } - } + static void RectStaple(GaugeMat &Stap,const GaugeLorentz & Umu,int mu) + { + RectStapleUnoptimised(Stap,Umu,mu); + } + static void RectStaple(const GaugeLorentz & Umu,GaugeMat &Stap, + std::vector &U2, + std::vector &U, int mu) + { + if ( Gimpl::isPeriodicGaugeField() ){ + RectStapleOptimised(Stap,U2,U,mu); + } else { + RectStapleUnoptimised(Stap,Umu,mu); + } + } - static void RectStapleUnoptimised(GaugeMat &Stap,const GaugeLorentz &Umu,int mu){ - GridBase *grid = Umu._grid; + static void RectStapleUnoptimised(GaugeMat &Stap,const GaugeLorentz &Umu,int mu){ + GridBase *grid = Umu._grid; - std::vector U(4,grid); - for(int d=0;d(Umu,d); - } + std::vector U(4,grid); + for(int d=0;d(Umu,d); + } - Stap=zero; + Stap=zero; - for(int nu=0;nu ColourWilsonLoops; - typedef WilsonLoops U1WilsonLoops; - typedef WilsonLoops SU2WilsonLoops; - typedef WilsonLoops SU3WilsonLoops; + typedef WilsonLoops ColourWilsonLoops; + typedef WilsonLoops U1WilsonLoops; + typedef WilsonLoops SU2WilsonLoops; + typedef WilsonLoops SU3WilsonLoops; -}} + }} #endif diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index c247f15d..52836336 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -517,6 +517,9 @@ namespace Grid { return ret; } + + + /////////////////////////////// // Define available types /////////////////////////////// diff --git a/lib/simd/Grid_vector_unops.h b/lib/simd/Grid_vector_unops.h index dd523817..bb3c44b0 100644 --- a/lib/simd/Grid_vector_unops.h +++ b/lib/simd/Grid_vector_unops.h @@ -59,6 +59,18 @@ namespace Grid { } }; + template struct AcosRealFunctor { + scalar operator()(const scalar &a) const { + return acos(real(a)); + } + }; + + template struct AsinRealFunctor { + scalar operator()(const scalar &a) const { + return asin(real(a)); + } + }; + template struct LogRealFunctor { scalar operator()(const scalar &a) const { return log(real(a)); @@ -146,6 +158,14 @@ namespace Grid { return SimdApply(SinRealFunctor(),r); } template < class S, class V > + inline Grid_simd acos(const Grid_simd &r) { + return SimdApply(AcosRealFunctor(),r); + } + template < class S, class V > + inline Grid_simd asin(const Grid_simd &r) { + return SimdApply(AsinRealFunctor(),r); + } + template < class S, class V > inline Grid_simd log(const Grid_simd &r) { return SimdApply(LogRealFunctor(),r); } diff --git a/scripts/Make.inc b/scripts/Make.inc new file mode 100644 index 00000000..e1b03d56 --- /dev/null +++ b/scripts/Make.inc @@ -0,0 +1,4 @@ + +HFILES= + +CCFILES= diff --git a/tests/Make.inc b/tests/Make.inc index f7c83671..ef9681cd 100644 --- a/tests/Make.inc +++ b/tests/Make.inc @@ -1,13 +1,5 @@ -bin_PROGRAMS = Test_GaugeAction Test_RectPlaq Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_gamma Test_gp_rect_force Test_gparity Test_gpdwf_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd - - -Test_GaugeAction_SOURCES=Test_GaugeAction.cc -Test_GaugeAction_LDADD=-lGrid - - -Test_RectPlaq_SOURCES=Test_RectPlaq.cc -Test_RectPlaq_LDADD=-lGrid +bin_PROGRAMS = Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_gamma Test_GaugeAction Test_gparity Test_gpdwf_force Test_gp_rect_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_RectPlaq Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd Test_cayley_cg_SOURCES=Test_cayley_cg.cc @@ -102,8 +94,8 @@ Test_gamma_SOURCES=Test_gamma.cc Test_gamma_LDADD=-lGrid -Test_gp_rect_force_SOURCES=Test_gp_rect_force.cc -Test_gp_rect_force_LDADD=-lGrid +Test_GaugeAction_SOURCES=Test_GaugeAction.cc +Test_GaugeAction_LDADD=-lGrid Test_gparity_SOURCES=Test_gparity.cc @@ -114,6 +106,10 @@ Test_gpdwf_force_SOURCES=Test_gpdwf_force.cc Test_gpdwf_force_LDADD=-lGrid +Test_gp_rect_force_SOURCES=Test_gp_rect_force.cc +Test_gp_rect_force_LDADD=-lGrid + + Test_gpwilson_even_odd_SOURCES=Test_gpwilson_even_odd.cc Test_gpwilson_even_odd_LDADD=-lGrid @@ -190,6 +186,10 @@ Test_rect_force_SOURCES=Test_rect_force.cc Test_rect_force_LDADD=-lGrid +Test_RectPlaq_SOURCES=Test_RectPlaq.cc +Test_RectPlaq_LDADD=-lGrid + + Test_remez_SOURCES=Test_remez.cc Test_remez_LDADD=-lGrid diff --git a/tests/Test_main.cc b/tests/Test_main.cc index b178d1a3..7904ff21 100644 --- a/tests/Test_main.cc +++ b/tests/Test_main.cc @@ -607,6 +607,11 @@ int main (int argc, char ** argv) } // loop for omp + + // Testing Smearing routine compilation + Smear_APE< PeriodicGimplR > APEsmearing; // periodic gauge implemetation + + std::cout< Date: Thu, 25 Feb 2016 02:43:59 +0900 Subject: [PATCH 04/34] Smearing routines compile (still untested) --- lib/lattice/Lattice_ET.h | 2 + lib/qcd/action/gauge/GaugeImpl.h | 2 +- lib/qcd/smearing/APEsmearing.h | 8 +- lib/qcd/smearing/GaugeConfiguration.h | 188 ++++++++++++++++++++++---- lib/qcd/smearing/Smearing.h | 2 +- lib/qcd/smearing/StoutSmearing.h | 127 +++++++++-------- lib/simd/Grid_vector_unops.h | 8 +- tests/Test_main.cc | 4 +- 8 files changed, 249 insertions(+), 92 deletions(-) diff --git a/lib/lattice/Lattice_ET.h b/lib/lattice/Lattice_ET.h index 742c4537..77e0ce5d 100644 --- a/lib/lattice/Lattice_ET.h +++ b/lib/lattice/Lattice_ET.h @@ -213,6 +213,7 @@ inline void CBFromExpression( int &cb,const LatticeTrinaryExpression class WilsonLoops; typedef Lattice GaugeField; // Move this elsewhere? - void AddGaugeLink(GaugeField& U, GaugeLinkField& W, int mu){ // U[mu] += W + static inline void AddGaugeLink(GaugeField& U, GaugeLinkField& W, int mu){ // U[mu] += W PARALLEL_FOR_LOOP for(auto ss=0;ssoSites();ss++){ U._odata[ss]._internal[mu] = U._odata[ss]._internal[mu] + W._odata[ss]._internal; diff --git a/lib/qcd/smearing/APEsmearing.h b/lib/qcd/smearing/APEsmearing.h index 24ac4b96..2580d296 100644 --- a/lib/qcd/smearing/APEsmearing.h +++ b/lib/qcd/smearing/APEsmearing.h @@ -86,19 +86,19 @@ namespace Grid { temp_Sigma = -rho_numu*staple*iLambda_nu; //-r_numu*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x)*Lambda_nu(x) - AddGaugeLink(SigmaTerm, temp_Sigma, mu); + Gimpl::AddGaugeLink(SigmaTerm, temp_Sigma, mu); sh_field = Cshift(iLambda_nu, mu, 1);// general also for Gparity? temp_Sigma = rho_numu*sh_field*staple; //r_numu*Lambda_nu(mu)*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x) - AddGaugeLink(SigmaTerm, temp_Sigma, mu); + Gimpl::AddGaugeLink(SigmaTerm, temp_Sigma, mu); sh_field = Cshift(iLambda_mu, nu, 1); temp_Sigma = -rho_munu*staple*U_nu*sh_field*adj(U_nu); //-r_munu*U_nu(x+mu)*Udag_mu(x+nu)*Lambda_mu(x+nu)*Udag_nu(x) - AddGaugeLink(SigmaTerm, temp_Sigma, mu); + Gimpl::AddGaugeLink(SigmaTerm, temp_Sigma, mu); staple = zero; sh_field = Cshift(U_nu, mu, 1); @@ -110,7 +110,7 @@ namespace Grid { sh_field = Cshift(u_tmp, mu, 1); temp_Sigma += -rho_numu*sh_field*adj(U_mu)*U_nu; sh_field = Cshift(temp_Sigma, nu, -1); - AddGaugeLink(SigmaTerm, sh_field, mu); + Gimpl::AddGaugeLink(SigmaTerm, sh_field, mu); } } diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h index f38af279..42baced8 100644 --- a/lib/qcd/smearing/GaugeConfiguration.h +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -24,34 +24,149 @@ namespace Grid { template class SmearedConfiguration { public: - INHERIT_GIMPL_TYPES(Gimpl) - private: + INHERIT_GIMPL_TYPES(Gimpl) ; + + private: const unsigned int smearingLevels; - Smear_Stout StoutSmearing; + Smear_Stout StoutSmearing; std::vector SmearedSet; // Member functions - void fill_smearedSet(); - GaugeField AnalyticSmearedForce(const GaugeField&, - const GaugeField&) const; - const GaugeField& get_smeared_conf(int) const; + //==================================================================== + void fill_smearedSet(){ + GaugeField previous_u; + + std::cout<< GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n"; + + previous_u = *ThinLinks; + for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){ + StoutSmearing.smear(SmearedSet[smearLvl],previous_u); + previous_u = SmearedSet[smearLvl]; + } + + } + //==================================================================== + 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); + GaugeLinkField SigmaKPrime_mu(grid); + GaugeLinkField GaugeKmu(grid), Cmu(grid); + + StoutSmearing.BaseSmear(C, GaugeK); + + for (int mu = 0; mu < Nd; mu++){ + Cmu = peekLorentz( C,mu); + GaugeKmu = peekLorentz(GaugeK,mu); + SigmaKPrime_mu = peekLorentz(SigmaKPrime,mu); + iQ = Ta(Cmu*adj(GaugeKmu)); + set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu); + pokeLorentz(SigmaK, SigmaKPrime_mu*e_iQ + adj(Cmu)*iLambda_mu, mu); + pokeLorentz(iLambda, iLambda_mu, mu); + } + StoutSmearing.derivative(SigmaK, iLambda, GaugeK); + return SigmaK; + } + /*! @brief Returns smeared configuration at level 'Level' */ + const GaugeField& get_smeared_conf(int Level) const{ + return SmearedSet[Level]; + } - void set_iLambda(GaugeField& iLambda, - GaugeField& e_iQ, - const GaugeField& iQ, - const GaugeField& Sigmap, - const GaugeField& U)const; - - /* Check these types (do I need to pass iQ1,2 ? ) - void set_uw(RealD& u, RealD& w, - const SUNmat& iQ1, const SUNmat& iQ2)const ; - void set_fj(ComplexD& f0, ComplexD& f1, - CompledD& f2, const RealD& u, - const RealD& w)const; - */ - - RealD func_xi0(RealD w)const; - RealD func_xi1(RealD w)const; + 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; + + LatticeReal u(grid), w(grid); + LatticeComplex f0(grid), f1(grid), f2(grid); + LatticeReal xi0(grid), xi1(grid), fden(grid), tmp(grid); + LatticeReal u2(grid), w2(grid), cosw(grid); + LatticeComplex emiu(grid), e2iu(grid), qt(grid); + LatticeComplex r01(grid), r11(grid), r21(grid), r02(grid), r12(grid); + LatticeComplex r22(grid), tr1(grid), tr2(grid); + LatticeComplex b10(grid), b11(grid), b12(grid), b20(grid), b21(grid), b22(grid); + LatticeReal unitReal(grid); + + unitReal = 1.0; + + // Exponential + iQ2 = iQ * iQ; + iQ3 = iQ * iQ2; + StoutSmearing.set_uw(u,w,iQ2,iQ3); + StoutSmearing.set_fj(f0,f1,f2,u,w); + e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; + + // Getting B1, B2, Gamma and Lambda + xi0 = StoutSmearing.func_xi0(w); + xi1 = StoutSmearing.func_xi1(w); + u2 = u * u; + w2 = w * w; + cosw = cos(w); + + emiu = toComplex(cos(u)) - timesI(toComplex(u)); + e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(2.0*u)); + + r01 = (toComplex(2.0*u) + timesI(toComplex(2.0*(u2-w2)))) * e2iu + + emiu * (toComplex(16.0*u*cosw + 2.0*u*(3.0*u2+w2)*xi0) + + timesI(toComplex(-8.0*u2*cosw + 2.0*(9.0*u2+w2)*xi0))); + + r11 = (toComplex(2.0*unitReal) + timesI(toComplex(4.0*u)))* e2iu + + emiu * (toComplex(-2.0*cosw + (3.0*u2-w2)*xi0) + + timesI(toComplex(2.0*u*cosw + 6.0*u*xi0))); + + r21 = timesI(toComplex(2.0*unitReal)) * e2iu + + emiu * (toComplex(-3.0*u*xi0) + timesI(toComplex(cosw - 3.0*xi0))); + + + r02 = -2.0 * e2iu + emiu * (toComplex(-8.0*u2*xi0) + + timesI(toComplex(2.0*u*(cosw + xi0 + 3.0*u2*xi1)))); + + r12 = emiu * (toComplex(2.0*u*xi0) + timesI(toComplex(-cosw - xi0 + 3.0*u2*xi1))); + + r22 = emiu * (toComplex(xi0) - timesI(toComplex(3.0*u*xi1))); + + tmp = (2.0*(9.0*u2-w2)*(9.0*u2-w2)); + fden = toComplex(pow(tmp, -1.0)); // 1/tmp + + b10 = toComplex(2.0*u) * r01 + toComplex(3.0*u2 - w2)*r02 - toComplex(30.0*u2 + 2.0*w2)*f0; + b11 = toComplex(2.0*u) * r11 + toComplex(3.0*u2 - w2)*r12 - toComplex(30.0*u2 + 2.0*w2)*f1; + b12 = toComplex(2.0*u) * r21 + toComplex(3.0*u2 - w2)*r22 - toComplex(30.0*u2 + 2.0*w2)*f2; + + b20 = r01 - toComplex(3.0*u)*r02 - toComplex(24.0*u)*f0; + b21 = r11 - toComplex(3.0*u)*r12 - toComplex(24.0*u)*f1; + b22 = r21 - toComplex(3.0*u)*r22 - toComplex(24.0*u)*f2; + + b10 *= fden; + b11 *= fden; + b12 *= fden; + b20 *= fden; + b21 *= fden; + b22 *= fden; + + B1 = b10*unity + timesMinusI(b11) * iQ - b12 * iQ2; + B2 = b20*unity + timesMinusI(b21) * iQ - b22 * iQ2; + USigmap = GaugeK * Sigmap; + + tr1 = trace(USigmap*B1); + tr2 = trace(USigmap*B2); + + GaugeLinkField QUS = timesMinusI(iQ) * USigmap; + GaugeLinkField USQ = USigmap * timesMinusI(iQ); + + GaugeLinkField iGamma = tr1 * timesMinusI(iQ) - tr2 * iQ2 + + f1 * USigmap + f2 * QUS + f2 * USQ; + + iLambda = Ta(iGamma); + + + } public: GaugeField* ThinLinks; /*!< @brief Pointer to the thin @@ -59,11 +174,11 @@ namespace Grid { /*! @brief Standard constructor */ SmearedConfiguration(GridCartesian * UGrid, - unsigned int Nsmear, - Smear_Stout& Stout): + unsigned int Nsmear, + Smear_Stout& Stout): smearingLevels(Nsmear), StoutSmearing(Stout), - ThinLinks(new GaugeField){ + ThinLinks(new GaugeField(UGrid)){ for (unsigned int i=0; i< smearingLevels; ++i) SmearedSet.push_back(*(new GaugeField(UGrid))); } @@ -76,7 +191,26 @@ namespace Grid { ThinLinks(new GaugeField(UGrid)){} void set_GaugeField(){ fill_smearedSet(); } - void smeared_force(GaugeField&) const; + void smeared_force(GaugeField& SigmaTilde) const{ + GaugeField force = SigmaTilde;//actually = U*SigmaTilde, check this for Grid + GaugeLinkField tmp_mu(SigmaTilde._grid); + + for (int mu = 0; mu < Nd; mu++){ + tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); + pokeLorentz(force, tmp_mu, mu); + } + for(int ismr = smearingLevels - 1; ismr > 0; --ismr) + force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); + + force = AnalyticSmearedForce(force,*ThinLinks); + + for (int mu = 0; mu < Nd; mu++){ + tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); + pokeLorentz(SigmaTilde, tmp_mu, mu); + } + } + + GaugeField* get_SmearedU() const{ return const_cast(&(SmearedSet[smearingLevels-1])); } diff --git a/lib/qcd/smearing/Smearing.h b/lib/qcd/smearing/Smearing.h index 76d7d935..89842c80 100644 --- a/lib/qcd/smearing/Smearing.h +++ b/lib/qcd/smearing/Smearing.h @@ -4,6 +4,6 @@ #include #include #include - +#include #endif diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index a9faed23..3538417a 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -15,11 +15,7 @@ namespace Grid { const std::vector d_rho; const Smear < Gimpl > * SmearBase; - LatticeReal func_xi0(LatticeReal w) const{ - // Define a function to do the check - //if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: "<< w <<"\n"; - return sin(w)/w; - } + public: INHERIT_GIMPL_TYPES(Gimpl) @@ -32,20 +28,20 @@ namespace Grid { ~Smear_Stout(){} void smear(GaugeField& u_smr,const GaugeField& U) const{ - long double timing; - - GaugeField u_tmp1, q_mu; + GaugeField C(U._grid); + GaugeLinkField tmp(U._grid), q_mu(U._grid), Umu(U._grid); std::cout<< GridLogDebug << "Stout smearing started\n"; //Smear the configurations - SmearBase->smear(u_tmp1, U); - - q_mu = Ta(u_tmp1*adj(u_tmp1)); // q_mu = Ta(Omega_mu) - - exponentiate_iQ(u_tmp1, q_mu); - - u_smr = u_tmp1*U; + SmearBase->smear(C, U); + for (int mu = 0; musmear(C, U); } - void exponentiate_iQ(GaugeField& e_iQ, - const GaugeField& iQ) const{ + void exponentiate_iQ(GaugeLinkField& e_iQ, + const GaugeLinkField& iQ) const{ // Put this outside // only valid for SU(3) matrices + // only one Lorentz direction at a time + GridBase *grid = iQ._grid; - Real one_over_three = 1.0/3.0; - Real one_over_two = 1.0/2.0; + GaugeLinkField unity(grid); + unity=1.0; - GaugeField unity; - GaugeLinkField Umu(iQ._grid); - Umu=1.0; - for(int mu=0;mu struct RealFunctor { - scalar operator()(const scalar &a) const { + scalar operator()(const std::complex &a) const { return real(a); } }; template struct ImagFunctor { - scalar operator()(const scalar &a) const { + scalar operator()(const std::complex &a) const { return imag(a); } }; template < class S, class V > - inline Grid_simd real(const Grid_simd &r) { + inline Grid_simd real(const Grid_simd &r) { return SimdApply(RealFunctor(),r); } template < class S, class V > - inline Grid_simd imag(const Grid_simd &r) { + inline Grid_simd imag(const Grid_simd &r) { return SimdApply(ImagFunctor(),r); } diff --git a/tests/Test_main.cc b/tests/Test_main.cc index 7904ff21..467c8a5e 100644 --- a/tests/Test_main.cc +++ b/tests/Test_main.cc @@ -609,8 +609,10 @@ int main (int argc, char ** argv) // Testing Smearing routine compilation + GridCartesian Fine(latt_size,simd_layout,mpi_layout); Smear_APE< PeriodicGimplR > APEsmearing; // periodic gauge implemetation - + Smear_Stout< PeriodicGimplR > StoutSmearing(&APEsmearing); + SmearedConfiguration< PeriodicGimplR > SmartConf(&Fine, 3, StoutSmearing); std::cout< Date: Tue, 5 Apr 2016 16:19:30 +0900 Subject: [PATCH 05/34] Debugging the Smearing routines --- lib/qcd/action/ActionBase.h | 1 + lib/qcd/hmc/HMC.h | 2 +- lib/qcd/hmc/HmcRunner.h | 31 +++++--- lib/qcd/hmc/integrators/Integrator.h | 27 +++++-- .../hmc/integrators/Integrator_algorithm.h | 23 ++++-- lib/qcd/smearing/APEsmearing.h | 11 ++- lib/qcd/smearing/BaseSmearing.h | 2 +- lib/qcd/smearing/GaugeConfiguration.h | 78 +++++++++++-------- lib/qcd/smearing/StoutSmearing.h | 8 +- tests/Test_main.cc | 2 +- 10 files changed, 118 insertions(+), 67 deletions(-) diff --git a/lib/qcd/action/ActionBase.h b/lib/qcd/action/ActionBase.h index 8b91fb79..7c9f6f1c 100644 --- a/lib/qcd/action/ActionBase.h +++ b/lib/qcd/action/ActionBase.h @@ -35,6 +35,7 @@ template class Action { public: + bool is_smeared = false; // Boundary conditions? // Heatbath? virtual void refresh(const GaugeField &U, GridParallelRNG& pRNG) = 0;// refresh pseudofermions virtual RealD S (const GaugeField &U) = 0; // evaluate the action diff --git a/lib/qcd/hmc/HMC.h b/lib/qcd/hmc/HMC.h index 0b87b03e..b471eb3a 100644 --- a/lib/qcd/hmc/HMC.h +++ b/lib/qcd/hmc/HMC.h @@ -160,7 +160,7 @@ namespace Grid{ ///////////////////////////////////////// // Constructor ///////////////////////////////////////// - HybridMonteCarlo(HMCparameters Pms, IntegratorType &_Int, GridSerialRNG &_sRNG, GridParallelRNG &_pRNG, GaugeField &_U ) : + HybridMonteCarlo(HMCparameters Pms, IntegratorType &_Int, GridSerialRNG &_sRNG, GridParallelRNG &_pRNG, GaugeField &_U) : Params(Pms), TheIntegrator(_Int), sRNG(_sRNG), diff --git a/lib/qcd/hmc/HmcRunner.h b/lib/qcd/hmc/HmcRunner.h index ce92b1d2..6dac0d53 100644 --- a/lib/qcd/hmc/HmcRunner.h +++ b/lib/qcd/hmc/HmcRunner.h @@ -81,11 +81,22 @@ public: NumTraj = ivec[0]; } - // Create integrator - typedef MinimumNorm2 IntegratorType;// change here to change the algorithm - IntegratorParameters MDpar(20); - IntegratorType MDynamics(UGrid,MDpar, TheAction); + GridSerialRNG sRNG; + GridParallelRNG pRNG(UGrid); + LatticeGaugeField U(UGrid); // change this to an extended field (smearing class) + + std::vector SerSeed({1,2,3,4,5}); + std::vector ParSeed({6,7,8,9,10}); + + + // Create integrator, including the smearing policy + SmearedConfiguration SmearingPolicy; // simplest empty smearer, construct here more complex smearers + typedef MinimumNorm2 > IntegratorType;// change here to change the algorithm + IntegratorParameters MDpar(20); + IntegratorType MDynamics(UGrid, MDpar, TheAction, SmearingPolicy); + + // Checkpoint strategy NerscHmcCheckpointer Checkpoint(std::string("ckpoint_lat"),std::string("ckpoint_rng"),1); PlaquetteLogger PlaqLog(std::string("plaq")); @@ -94,12 +105,6 @@ public: HMCpar.StartTrajectory = StartTraj; HMCpar.Trajectories = NumTraj; - GridSerialRNG sRNG; - GridParallelRNG pRNG(UGrid); - LatticeGaugeField U(UGrid); // change this to an extended field (smearing class) - - std::vector SerSeed({1,2,3,4,5}); - std::vector ParSeed({6,7,8,9,10}); if ( StartType == HotStart ) { // Hot start @@ -129,7 +134,11 @@ public: Checkpoint.CheckpointRestore(StartTraj, U, sRNG, pRNG); } - HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); // pass the extended field + // Attach the gauge field to the smearing Policy and create the fill the smeared set + // notice that the unit configuration is singular in this procedure + SmearingPolicy.set_GaugeField(U); + + HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); HMC.AddObservable(&Checkpoint); HMC.AddObservable(&PlaqLog); diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index e6f6c1cd..5a70a1ec 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -68,7 +68,7 @@ namespace Grid{ }; /*! @brief Class for Molecular Dynamics management */ - template + template class Integrator { protected: @@ -85,6 +85,8 @@ namespace Grid{ GaugeField P; + SmearingPolicy &Smearer; + // Should match any legal (SU(n)) gauge field // Need to use this template to match Ncol to pass to SU class template void generate_momenta(Lattice< iVector< iScalar< iMatrix >, Nd> > & P,GridParallelRNG& pRNG){ @@ -113,7 +115,9 @@ namespace Grid{ void update_P(GaugeField &Mom,GaugeField&U, int level,double ep){ for(int a=0; aderiv(U,force); + as[level].actions.at(a)->deriv(U,force); // deriv should not include Ta + if (as[level].actions.at(a)->is_smeared) Smearer.smeared_force(force); + force = Ta(force); Mom = Mom - force*ep; } } @@ -137,6 +141,8 @@ namespace Grid{ ProjectOnGroup(Umu); PokeIndex(U, Umu, mu); } + // Update the smeared fields, can be implemented as observer + Smearer.set_GaugeField(U); } virtual void step (GaugeField& U,int level, int first,int last)=0; @@ -145,14 +151,17 @@ namespace Grid{ Integrator(GridBase* grid, IntegratorParameters Par, - ActionSet & Aset): + ActionSet & Aset, + SmearingPolicy &Sm): Params(Par), as(Aset), P(grid), - levels(Aset.size()) + levels(Aset.size()), + Smearer(Sm) { t_P.resize(levels,0.0); t_U=0.0; + // initialization of smearer delegated outside of Integrator }; virtual ~Integrator(){} @@ -163,7 +172,10 @@ namespace Grid{ generate_momenta(P,pRNG); for(int level=0; level< as.size(); ++level){ for(int actionID=0; actionIDrefresh(U, pRNG); + // get gauge field from the SmearingPolicy and + // based on the boolean is_smeared in actionID + GaugeField& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared); + as[level].actions.at(actionID)->refresh(Us, pRNG); } } } @@ -186,7 +198,10 @@ namespace Grid{ // Actions for(int level=0; levelS(U); + // get gauge field from the SmearingPolicy and + // based on the boolean is_smeared in actionID + GaugeField& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared); + Hterm = as[level].actions.at(actionID)->S(Us); std::cout< 0){ + GaugeField previous_u(U._grid); + std::cout<< GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n"; + + previous_u = *ThinLinks; + for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){ + StoutSmearing.smear(SmearedSet[smearLvl],previous_u); + previous_u = SmearedSet[smearLvl]; + } + } - } //==================================================================== GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime, @@ -86,9 +92,9 @@ namespace Grid { LatticeReal u(grid), w(grid); LatticeComplex f0(grid), f1(grid), f2(grid); - LatticeReal xi0(grid), xi1(grid), fden(grid), tmp(grid); + LatticeReal xi0(grid), xi1(grid), tmp(grid); LatticeReal u2(grid), w2(grid), cosw(grid); - LatticeComplex emiu(grid), e2iu(grid), qt(grid); + LatticeComplex emiu(grid), e2iu(grid), qt(grid), fden(grid); LatticeComplex r01(grid), r11(grid), r21(grid), r02(grid), r12(grid); LatticeComplex r22(grid), tr1(grid), tr2(grid); LatticeComplex b10(grid), b11(grid), b12(grid), b20(grid), b21(grid), b22(grid); @@ -173,66 +179,70 @@ namespace Grid { links configuration */ /*! @brief Standard constructor */ - SmearedConfiguration(GridCartesian * UGrid, - unsigned int Nsmear, - Smear_Stout& Stout): - smearingLevels(Nsmear), + SmearedConfiguration(GridCartesian * UGrid, + unsigned int Nsmear, + Smear_Stout& Stout): + smearingLevels(Nsmear), StoutSmearing(Stout), - ThinLinks(new GaugeField(UGrid)){ + ThinLinks(NULL){ for (unsigned int i=0; i< smearingLevels; ++i) SmearedSet.push_back(*(new GaugeField(UGrid))); } /*! For just thin links */ - SmearedConfiguration(GridCartesian * UGrid): - smearingLevels(0), + SmearedConfiguration(): + smearingLevels(0), StoutSmearing(), - SmearedSet(0), - ThinLinks(new GaugeField(UGrid)){} + SmearedSet(), + ThinLinks(NULL){} + + + // attach the smeared routines to the thin links U and fill the smeared set + void set_GaugeField(GaugeField& U){ fill_smearedSet(U);} - void set_GaugeField(){ fill_smearedSet(); } void smeared_force(GaugeField& SigmaTilde) const{ GaugeField force = SigmaTilde;//actually = U*SigmaTilde, check this for Grid GaugeLinkField tmp_mu(SigmaTilde._grid); for (int mu = 0; mu < Nd; mu++){ tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); - pokeLorentz(force, tmp_mu, mu); + pokeLorentz(force, tmp_mu, mu); } for(int ismr = smearingLevels - 1; ismr > 0; --ismr) force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); - + force = AnalyticSmearedForce(force,*ThinLinks); - + for (int mu = 0; mu < Nd; mu++){ tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); pokeLorentz(SigmaTilde, tmp_mu, mu); } } - - - GaugeField* get_SmearedU() const{ - return const_cast(&(SmearedSet[smearingLevels-1])); + + + GaugeField& get_SmearedU(){ + return SmearedSet[smearingLevels-1]; } - - GaugeField* get_U(bool smeared=false) const { + + GaugeField& get_U(bool smeared=false) { // get the config, thin links by default if (smeared){ if (smearingLevels) return get_SmearedU(); - else return ThinLinks; + else return *ThinLinks; } - else return ThinLinks; + else return *ThinLinks; } }; } - + } + #endif diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index 3538417a..dc4b29be 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -20,10 +20,14 @@ namespace Grid { public: INHERIT_GIMPL_TYPES(Gimpl) - Smear_Stout(Smear < Gimpl >* base):SmearBase(base){} + Smear_Stout(Smear < Gimpl >* base):SmearBase(base){ + static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); + } /*! Default constructor */ - Smear_Stout():SmearBase(new Smear_APE < Gimpl > ()){} + Smear_Stout():SmearBase(new Smear_APE < Gimpl > ()){ + static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); + } ~Smear_Stout(){} diff --git a/tests/Test_main.cc b/tests/Test_main.cc index 467c8a5e..9236fae1 100644 --- a/tests/Test_main.cc +++ b/tests/Test_main.cc @@ -608,7 +608,7 @@ int main (int argc, char ** argv) - // Testing Smearing routine compilation + // Testing Smearing routine compilation, separate in a different file GridCartesian Fine(latt_size,simd_layout,mpi_layout); Smear_APE< PeriodicGimplR > APEsmearing; // periodic gauge implemetation Smear_Stout< PeriodicGimplR > StoutSmearing(&APEsmearing); From 7c7ea35ffb7439d1028ab7937844849e1322d66d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 5 Apr 2016 16:28:09 +0900 Subject: [PATCH 06/34] Putting the Traceless Antihermitian part outside the deriv in pseudofermion actions --- lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h | 2 +- .../action/pseudofermion/OneFlavourEvenOddRationalRatio.h | 2 +- lib/qcd/action/pseudofermion/OneFlavourRational.h | 2 +- lib/qcd/action/pseudofermion/OneFlavourRationalRatio.h | 2 +- lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h | 2 +- lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h | 5 +++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h index d7d08516..1b836b4c 100644 --- a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h +++ b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h @@ -201,7 +201,7 @@ namespace Grid{ } - dSdU = Ta(dSdU); + //dSdU = Ta(dSdU); }; }; diff --git a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h index 8c8bd7a7..735cb284 100644 --- a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h +++ b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h @@ -256,7 +256,7 @@ namespace Grid{ } - dSdU = Ta(dSdU); + //dSdU = Ta(dSdU); }; }; diff --git a/lib/qcd/action/pseudofermion/OneFlavourRational.h b/lib/qcd/action/pseudofermion/OneFlavourRational.h index cb3a96d7..65a99afa 100644 --- a/lib/qcd/action/pseudofermion/OneFlavourRational.h +++ b/lib/qcd/action/pseudofermion/OneFlavourRational.h @@ -186,7 +186,7 @@ namespace Grid{ } - dSdU = Ta(dSdU); + //dSdU = Ta(dSdU); }; }; diff --git a/lib/qcd/action/pseudofermion/OneFlavourRationalRatio.h b/lib/qcd/action/pseudofermion/OneFlavourRationalRatio.h index e6533d15..2207e119 100644 --- a/lib/qcd/action/pseudofermion/OneFlavourRationalRatio.h +++ b/lib/qcd/action/pseudofermion/OneFlavourRationalRatio.h @@ -242,7 +242,7 @@ namespace Grid{ } - dSdU = Ta(dSdU); + //dSdU = Ta(dSdU); }; }; diff --git a/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h b/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h index e3ac2b2e..601bf9ec 100644 --- a/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h +++ b/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h @@ -173,7 +173,7 @@ namespace Grid{ FermOp.MeeDeriv(tmp , X, Y,DaggerYes); dSdU=dSdU+tmp; */ - dSdU = Ta(dSdU); + //dSdU = Ta(dSdU); }; diff --git a/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h b/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h index b1d73a7c..b2ae4d21 100644 --- a/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h +++ b/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h @@ -188,8 +188,9 @@ namespace Grid{ assert(NumOp.ConstEE() == 1); assert(DenOp.ConstEE() == 1); - dSdU = -Ta(dSdU); - + //dSdU = -Ta(dSdU); + dSDu = -dSdU; + }; }; } From 97d0d56bcbdfe8f93354046d029eca202035c091 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 6 Apr 2016 17:58:43 +0900 Subject: [PATCH 07/34] Debugging Smearing routines (set_fj) --- .../pseudofermion/TwoFlavourEvenOddRatio.h | 2 +- lib/qcd/hmc/HmcRunner.h | 11 ++++- lib/qcd/hmc/integrators/Integrator.h | 7 +++- lib/qcd/smearing/GaugeConfiguration.h | 40 +++++++++++-------- lib/qcd/smearing/StoutSmearing.h | 11 +++-- tests/Test_hmc_EOWilsonFermionGauge.cc | 4 +- 6 files changed, 51 insertions(+), 24 deletions(-) diff --git a/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h b/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h index b2ae4d21..edb6beaa 100644 --- a/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h +++ b/lib/qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h @@ -189,7 +189,7 @@ namespace Grid{ assert(DenOp.ConstEE() == 1); //dSdU = -Ta(dSdU); - dSDu = -dSdU; + dSdU = -dSdU; }; }; diff --git a/lib/qcd/hmc/HmcRunner.h b/lib/qcd/hmc/HmcRunner.h index 6dac0d53..cb3428b4 100644 --- a/lib/qcd/hmc/HmcRunner.h +++ b/lib/qcd/hmc/HmcRunner.h @@ -91,7 +91,15 @@ public: // Create integrator, including the smearing policy - SmearedConfiguration SmearingPolicy; // simplest empty smearer, construct here more complex smearers + // Smearing policy + std::cout << GridLogMessage << " Creating the Stout class\n"; + double rho = 0.1; // smearing parameter + int Nsmear = 3; // number of smearing levels + Smear_Stout Stout(rho); + std::cout << GridLogMessage << " Creating the SmearedConfiguration class\n"; + SmearedConfiguration SmearingPolicy(UGrid, Nsmear, Stout); + std::cout << GridLogMessage << " done\n"; + ////////////// typedef MinimumNorm2 > IntegratorType;// change here to change the algorithm IntegratorParameters MDpar(20); IntegratorType MDynamics(UGrid, MDpar, TheAction, SmearingPolicy); @@ -136,6 +144,7 @@ public: // Attach the gauge field to the smearing Policy and create the fill the smeared set // notice that the unit configuration is singular in this procedure + std::cout << GridLogMessage << " Filling the smeared set\n"; SmearingPolicy.set_GaugeField(U); HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index 5a70a1ec..0a6fb9c7 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -116,6 +116,8 @@ namespace Grid{ for(int a=0; aderiv(U,force); // deriv should not include Ta + std::cout<is_smeared <is_smeared) Smearer.smeared_force(force); force = Ta(force); Mom = Mom - force*ep; @@ -174,6 +176,9 @@ namespace Grid{ for(int actionID=0; actionIDis_smeared <is_smeared); as[level].actions.at(actionID)->refresh(Us, pRNG); } @@ -201,8 +206,8 @@ namespace Grid{ // get gauge field from the SmearingPolicy and // based on the boolean is_smeared in actionID GaugeField& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared); + std::cout< 0){ - GaugeField previous_u(U._grid); std::cout<< GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n"; + GaugeField previous_u(ThinLinks->_grid); + std::cout<< GridLogDebug << "[SmearedConfiguration] Loop\n"; previous_u = *ThinLinks; for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){ + std::cout<< GridLogDebug << "[SmearedConfiguration] Loop: "<< smearLvl << "\n"; StoutSmearing.smear(SmearedSet[smearLvl],previous_u); + std::cout<< GridLogDebug << "[SmearedConfiguration] Loop assign: "<< smearLvl << "\n"; previous_u = SmearedSet[smearLvl]; } @@ -201,22 +205,24 @@ namespace Grid { void set_GaugeField(GaugeField& U){ fill_smearedSet(U);} void smeared_force(GaugeField& SigmaTilde) const{ - GaugeField force = SigmaTilde;//actually = U*SigmaTilde, check this for Grid - GaugeLinkField tmp_mu(SigmaTilde._grid); - - for (int mu = 0; mu < Nd; mu++){ - tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); + if (smearingLevels > 0){ + GaugeField force = SigmaTilde;//actually = U*SigmaTilde, check this for Grid + GaugeLinkField tmp_mu(SigmaTilde._grid); + + for (int mu = 0; mu < Nd; mu++){ + tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); pokeLorentz(force, tmp_mu, mu); - } - for(int ismr = smearingLevels - 1; ismr > 0; --ismr) - force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); - - force = AnalyticSmearedForce(force,*ThinLinks); - - for (int mu = 0; mu < Nd; mu++){ - tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); - pokeLorentz(SigmaTilde, tmp_mu, mu); - } + } + for(int ismr = smearingLevels - 1; ismr > 0; --ismr) + force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); + + force = AnalyticSmearedForce(force,*ThinLinks); + + 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 } diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index dc4b29be..940dee1b 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -25,7 +25,7 @@ namespace Grid { } /*! Default constructor */ - Smear_Stout():SmearBase(new Smear_APE < Gimpl > ()){ + Smear_Stout(double rho = 1.0):SmearBase(new Smear_APE < Gimpl > (rho)){ static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); } @@ -68,6 +68,7 @@ namespace Grid { // only one Lorentz direction at a time + std::cout<< GridLogDebug << "Stout smearing exponentiate iQ\n"; GridBase *grid = iQ._grid; GaugeLinkField unity(grid); unity=1.0; @@ -92,7 +93,8 @@ namespace Grid { GridBase *grid = u._grid; LatticeReal c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); - + + std::cout<< GridLogDebug << "Stout smearing set uw\n"; c0 = - toReal(imag(trace(iQ3))) * one_over_three; c1 = - toReal(real(trace(iQ2))) * one_over_two; @@ -107,6 +109,7 @@ namespace Grid { void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, const LatticeReal& u, const LatticeReal& w) const{ + std::cout<< GridLogDebug << "Stout smearing set fj\n"; GridBase *grid = u._grid; LatticeReal xi0(grid), u2(grid), w2(grid), cosw(grid), tmp(grid); LatticeComplex fden(grid); @@ -117,8 +120,10 @@ namespace Grid { u2 = u * u; w2 = w * w; cosw = cos(w); - + + std::cout<< GridLogDebug << "Stout smearing first toComplex\n"; ixi0 = timesI(toComplex(xi0)); + std::cout<< GridLogDebug << "Stout smearing others toComplex\n"; emiu = toComplex(cos(u)) - timesI(toComplex(u)); e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(2.0*u)); diff --git a/tests/Test_hmc_EOWilsonFermionGauge.cc b/tests/Test_hmc_EOWilsonFermionGauge.cc index c7f2d534..d9634666 100644 --- a/tests/Test_hmc_EOWilsonFermionGauge.cc +++ b/tests/Test_hmc_EOWilsonFermionGauge.cc @@ -65,7 +65,9 @@ public: ConjugateGradient CG(1.0e-8,10000); TwoFlavourEvenOddPseudoFermionAction Nf2(FermOp,CG,CG); - + + Nf2.is_smeared=true; + //Collect actions ActionLevel Level1(1); Level1.push_back(&Nf2); From a87b744621b434e53028f8d54b315dfba61621ea Mon Sep 17 00:00:00 2001 From: neo Date: Thu, 7 Apr 2016 16:45:11 +0900 Subject: [PATCH 08/34] HMC runs but does not accept with smearing on --- configure | 13 ++++++------- lib/qcd/hmc/integrators/Integrator.h | 8 ++------ lib/qcd/smearing/GaugeConfiguration.h | 3 --- lib/qcd/smearing/StoutSmearing.h | 11 +++-------- tests/Test_hmc_EOWilsonFermionGauge.cc | 2 +- 5 files changed, 12 insertions(+), 25 deletions(-) diff --git a/configure b/configure index ed5915d6..1ab3998e 100755 --- a/configure +++ b/configure @@ -2569,7 +2569,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -am__api_version='1.15' +am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2741,8 +2741,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2761,7 +2761,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -3089,8 +3089,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3149,7 +3149,6 @@ END fi - ac_config_headers="$ac_config_headers lib/Config.h" # Check whether --enable-silent-rules was given. diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index 0a6fb9c7..eb1eeb3a 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -116,8 +116,7 @@ namespace Grid{ for(int a=0; aderiv(U,force); // deriv should not include Ta - std::cout<is_smeared <is_smeared <is_smeared) Smearer.smeared_force(force); force = Ta(force); Mom = Mom - force*ep; @@ -176,9 +175,6 @@ namespace Grid{ for(int actionID=0; actionIDis_smeared <is_smeared); as[level].actions.at(actionID)->refresh(Us, pRNG); } @@ -206,8 +202,8 @@ namespace Grid{ // get gauge field from the SmearingPolicy and // based on the boolean is_smeared in actionID GaugeField& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared); - std::cout<_grid); - std::cout<< GridLogDebug << "[SmearedConfiguration] Loop\n"; previous_u = *ThinLinks; for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){ - std::cout<< GridLogDebug << "[SmearedConfiguration] Loop: "<< smearLvl << "\n"; StoutSmearing.smear(SmearedSet[smearLvl],previous_u); - std::cout<< GridLogDebug << "[SmearedConfiguration] Loop assign: "<< smearLvl << "\n"; previous_u = SmearedSet[smearLvl]; } diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index 940dee1b..ede204c3 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -68,7 +68,7 @@ namespace Grid { // only one Lorentz direction at a time - std::cout<< GridLogDebug << "Stout smearing exponentiate iQ\n"; + GridBase *grid = iQ._grid; GaugeLinkField unity(grid); unity=1.0; @@ -94,8 +94,6 @@ namespace Grid { GridBase *grid = u._grid; LatticeReal c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); - std::cout<< GridLogDebug << "Stout smearing set uw\n"; - c0 = - toReal(imag(trace(iQ3))) * one_over_three; c1 = - toReal(real(trace(iQ2))) * one_over_two; tmp = c1 * one_over_three; @@ -109,7 +107,6 @@ namespace Grid { void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, const LatticeReal& u, const LatticeReal& w) const{ - std::cout<< GridLogDebug << "Stout smearing set fj\n"; GridBase *grid = u._grid; LatticeReal xi0(grid), u2(grid), w2(grid), cosw(grid), tmp(grid); LatticeComplex fden(grid); @@ -121,9 +118,7 @@ namespace Grid { w2 = w * w; cosw = cos(w); - std::cout<< GridLogDebug << "Stout smearing first toComplex\n"; ixi0 = timesI(toComplex(xi0)); - std::cout<< GridLogDebug << "Stout smearing others toComplex\n"; emiu = toComplex(cos(u)) - timesI(toComplex(u)); e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(2.0*u)); @@ -144,13 +139,13 @@ namespace Grid { } - LatticeReal func_xi0(LatticeReal w) const{ + LatticeReal func_xi0(const LatticeReal& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning<< "[Smear_stout] w too small: "<< w <<"\n"; return sin(w)/w; } - LatticeReal func_xi1(LatticeReal w) const{ + LatticeReal func_xi1(const LatticeReal& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: "<< w <<"\n"; return cos(w)/(w*w) - sin(w)/(w*w*w); diff --git a/tests/Test_hmc_EOWilsonFermionGauge.cc b/tests/Test_hmc_EOWilsonFermionGauge.cc index d9634666..13828c51 100644 --- a/tests/Test_hmc_EOWilsonFermionGauge.cc +++ b/tests/Test_hmc_EOWilsonFermionGauge.cc @@ -66,7 +66,7 @@ public: TwoFlavourEvenOddPseudoFermionAction Nf2(FermOp,CG,CG); - Nf2.is_smeared=true; + Nf2.is_smeared=false; //Collect actions ActionLevel Level1(1); From 339be37dbad38de7423ff2488719f01764fd0196 Mon Sep 17 00:00:00 2001 From: neo Date: Wed, 13 Apr 2016 17:00:14 +0900 Subject: [PATCH 09/34] Debugging smeared HMC --- .../action/pseudofermion/TwoFlavourEvenOdd.h | 2 +- lib/qcd/hmc/HmcRunner.h | 4 +- lib/qcd/hmc/integrators/Integrator.h | 4 +- lib/qcd/smearing/APEsmearing.h | 12 ++++-- lib/qcd/smearing/GaugeConfiguration.h | 39 ++++++++++++++----- lib/qcd/smearing/StoutSmearing.h | 13 +++++-- lib/qcd/utils/WilsonLoops.h | 22 +++++------ tests/Test_hmc_EOWilsonFermionGauge.cc | 2 +- 8 files changed, 63 insertions(+), 35 deletions(-) diff --git a/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h b/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h index 601bf9ec..16b2d814 100644 --- a/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h +++ b/lib/qcd/action/pseudofermion/TwoFlavourEvenOdd.h @@ -100,7 +100,7 @@ namespace Grid{ PhiOdd =PhiOdd*scale; PhiEven=PhiEven*scale; - + }; ////////////////////////////////////////////////////// diff --git a/lib/qcd/hmc/HmcRunner.h b/lib/qcd/hmc/HmcRunner.h index cb3428b4..b30da24b 100644 --- a/lib/qcd/hmc/HmcRunner.h +++ b/lib/qcd/hmc/HmcRunner.h @@ -94,7 +94,7 @@ public: // Smearing policy std::cout << GridLogMessage << " Creating the Stout class\n"; double rho = 0.1; // smearing parameter - int Nsmear = 3; // number of smearing levels + int Nsmear = 1; // number of smearing levels Smear_Stout Stout(rho); std::cout << GridLogMessage << " Creating the SmearedConfiguration class\n"; SmearedConfiguration SmearingPolicy(UGrid, Nsmear, Stout); @@ -144,7 +144,7 @@ public: // Attach the gauge field to the smearing Policy and create the fill the smeared set // notice that the unit configuration is singular in this procedure - std::cout << GridLogMessage << " Filling the smeared set\n"; + std::cout << GridLogMessage << "Filling the smeared set\n"; SmearingPolicy.set_GaugeField(U); HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index eb1eeb3a..e8950f22 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -115,10 +115,12 @@ namespace Grid{ void update_P(GaugeField &Mom,GaugeField&U, int level,double ep){ for(int a=0; aderiv(U,force); // deriv should not include Ta + GaugeField& Us = Smearer.get_U(as[level].actions.at(a)->is_smeared); + as[level].actions.at(a)->deriv(Us,force); // deriv should not include Ta std::cout<is_smeared <is_smeared) Smearer.smeared_force(force); force = Ta(force); + std::cout<gSites()) <::avgPlaquette(previous_u); + std::cout<< GridLogDebug << "[SmearedConfiguration] Plaq: " << impl_plaq<< std::endl; + } } @@ -73,14 +77,14 @@ namespace Grid { pokeLorentz(SigmaK, SigmaKPrime_mu*e_iQ + adj(Cmu)*iLambda_mu, mu); pokeLorentz(iLambda, iLambda_mu, mu); } - StoutSmearing.derivative(SigmaK, iLambda, GaugeK); + StoutSmearing.derivative(SigmaK, iLambda, GaugeK);// derivative of SmearBase return SigmaK; } /*! @brief Returns smeared configuration at level 'Level' */ const GaugeField& get_smeared_conf(int Level) const{ return SmearedSet[Level]; } - + //==================================================================== void set_iLambda(GaugeLinkField& iLambda, GaugeLinkField& e_iQ, const GaugeLinkField& iQ, @@ -117,8 +121,8 @@ namespace Grid { w2 = w * w; cosw = cos(w); - emiu = toComplex(cos(u)) - timesI(toComplex(u)); - e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(2.0*u)); + emiu = toComplex(cos(u)) - timesI(toComplex(sin(u))); + e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(sin(2.0*u))); r01 = (toComplex(2.0*u) + timesI(toComplex(2.0*(u2-w2)))) * e2iu + emiu * (toComplex(16.0*u*cosw + 2.0*u*(3.0*u2+w2)*xi0) + @@ -174,7 +178,7 @@ namespace Grid { } - + //==================================================================== public: GaugeField* ThinLinks; /*!< @brief Pointer to the thin links configuration */ @@ -201,12 +205,14 @@ namespace Grid { // attach the smeared routines to the thin links U and fill the smeared set void set_GaugeField(GaugeField& U){ fill_smearedSet(U);} + //==================================================================== void smeared_force(GaugeField& SigmaTilde) const{ if (smearingLevels > 0){ - GaugeField force = SigmaTilde;//actually = U*SigmaTilde, check this for Grid + GaugeField force = SigmaTilde;//actually = U*SigmaTilde GaugeLinkField tmp_mu(SigmaTilde._grid); for (int mu = 0; mu < Nd; mu++){ + // to get SigmaTilde tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); pokeLorentz(force, tmp_mu, mu); } @@ -221,7 +227,8 @@ namespace Grid { } }// if smearingLevels = 0 do nothing } - + //==================================================================== + GaugeField& get_SmearedU(){ return SmearedSet[smearingLevels-1]; @@ -230,10 +237,22 @@ namespace Grid { GaugeField& get_U(bool smeared=false) { // get the config, thin links by default if (smeared){ - if (smearingLevels) return get_SmearedU(); - else return *ThinLinks; + if (smearingLevels){ + RealD impl_plaq = WilsonLoops::avgPlaquette(SmearedSet[smearingLevels-1]); + std::cout<< GridLogDebug << "getting U Plaq: " << impl_plaq<< std::endl; + return get_SmearedU(); + + } + else { + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; + return *ThinLinks; + } } - else return *ThinLinks; + else{ + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; + return *ThinLinks;} } }; diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index ede204c3..5b5e4ba3 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -33,7 +33,7 @@ namespace Grid { void smear(GaugeField& u_smr,const GaugeField& U) const{ GaugeField C(U._grid); - GaugeLinkField tmp(U._grid), q_mu(U._grid), Umu(U._grid); + GaugeLinkField tmp(U._grid), iq_mu(U._grid), Umu(U._grid); std::cout<< GridLogDebug << "Stout smearing started\n"; @@ -42,8 +42,8 @@ namespace Grid { for (int mu = 0; mu U(4,grid); - for(int d=0;d(Umu,d); - } staple = zero; - - if(nu != mu) { - + GridBase *grid = Umu._grid; + + std::vector U(4,grid); + for(int d=0;d(Umu,d); + } + // mu // ^ // |__> nu - + // __ // | // __| // - + staple+=Gimpl::ShiftStaple( Gimpl::CovShiftForward (U[nu],nu, Gimpl::CovShiftBackward(U[mu],mu, diff --git a/tests/Test_hmc_EOWilsonFermionGauge.cc b/tests/Test_hmc_EOWilsonFermionGauge.cc index 13828c51..d9634666 100644 --- a/tests/Test_hmc_EOWilsonFermionGauge.cc +++ b/tests/Test_hmc_EOWilsonFermionGauge.cc @@ -66,7 +66,7 @@ public: TwoFlavourEvenOddPseudoFermionAction Nf2(FermOp,CG,CG); - Nf2.is_smeared=false; + Nf2.is_smeared=true; //Collect actions ActionLevel Level1(1); From 565e9329bab1db137f8502a84e5e25007aef0073 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 30 Jun 2016 16:51:03 +0100 Subject: [PATCH 10/34] Changed the colouring classes --- benchmarks/Benchmark_dwf_ntpf | Bin 0 -> 1129544 bytes benchmarks/Benchmark_zmm | Bin 0 -> 1112672 bytes configure | 27 +++-- lib/.dirstamp | 0 lib/Init.cc | 41 ++++--- lib/Log.cc | 35 +++--- lib/Log.h | 120 +++++++++++++------ lib/algorithms/approx/.dirstamp | 0 lib/communicator/.dirstamp | 0 lib/pugixml/.dirstamp | 0 lib/qcd/action/fermion/.dirstamp | 0 lib/qcd/action/fermion/FermionOperatorImpl.h | 2 +- lib/qcd/hmc/.dirstamp | 0 lib/qcd/spin/.dirstamp | 0 lib/qcd/utils/.dirstamp | 0 lib/serialisation/.dirstamp | 0 lib/stamp-h1 | 1 - lib/stencil/.dirstamp | 0 tests/Test_main.cc | 4 +- 19 files changed, 149 insertions(+), 81 deletions(-) create mode 100755 benchmarks/Benchmark_dwf_ntpf create mode 100755 benchmarks/Benchmark_zmm delete mode 100644 lib/.dirstamp delete mode 100644 lib/algorithms/approx/.dirstamp delete mode 100644 lib/communicator/.dirstamp delete mode 100644 lib/pugixml/.dirstamp delete mode 100644 lib/qcd/action/fermion/.dirstamp delete mode 100644 lib/qcd/hmc/.dirstamp delete mode 100644 lib/qcd/spin/.dirstamp delete mode 100644 lib/qcd/utils/.dirstamp delete mode 100644 lib/serialisation/.dirstamp delete mode 100644 lib/stamp-h1 delete mode 100644 lib/stencil/.dirstamp diff --git a/benchmarks/Benchmark_dwf_ntpf b/benchmarks/Benchmark_dwf_ntpf new file mode 100755 index 0000000000000000000000000000000000000000..ab9999c95d78f292549bb20fb7a0f7b6d3eca177 GIT binary patch literal 1129544 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 mz4Lf+$fm;kx|T-pUNU%K#{kDys!I>!uj$l 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%0DC@4nsV2UvRj4LO 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 literal 0 HcmV?d00001 diff --git a/benchmarks/Benchmark_zmm b/benchmarks/Benchmark_zmm new file mode 100755 index 0000000000000000000000000000000000000000..c7eebe18622ea923315eac68287860abbbe95ecd GIT binary patch literal 1112672 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

8@U`&<_)gv^N}?)501sDu)fKff+~{ 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 S^#0>tA^dIK!@mIf`~M%hmFf`y literal 0 HcmV?d00001 diff --git a/configure b/configure index 1ab3998e..7b484b67 100755 --- a/configure +++ b/configure @@ -721,6 +721,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -802,6 +803,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1054,6 +1056,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1191,7 +1202,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1344,6 +1355,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -2569,7 +2581,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -am__api_version='1.14' +am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2741,8 +2753,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2761,7 +2773,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -3089,8 +3101,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3149,6 +3161,7 @@ END fi + ac_config_headers="$ac_config_headers lib/Config.h" # Check whether --enable-silent-rules was given. diff --git a/lib/.dirstamp b/lib/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/Init.cc b/lib/Init.cc index 1d3fe642..1757e519 100644 --- a/lib/Init.cc +++ b/lib/Init.cc @@ -237,24 +237,33 @@ void Grid_init(int *argc,char ***argv) std::cout< #include namespace Grid { - -GridStopWatch Logger::StopWatch; -std::ostream Logger::devnull(0); -std::string Logger::BLACK("\033[30m"); -std::string Logger::RED("\033[31m"); -std::string Logger::GREEN("\033[32m"); -std::string Logger::YELLOW("\033[33m"); -std::string Logger::BLUE("\033[34m"); -std::string Logger::PURPLE("\033[35m"); -std::string Logger::CYAN("\033[36m"); -std::string Logger::WHITE("\033[37m"); -std::string Logger::NORMAL("\033[0;39m"); - - GridLogger GridLogError (1,"Error",Logger::RED); - GridLogger GridLogWarning (1,"Warning",Logger::YELLOW); - GridLogger GridLogMessage (1,"Message",Logger::BLACK); - GridLogger GridLogDebug (1,"Debug",Logger::PURPLE); - GridLogger GridLogPerformance(1,"Performance",Logger::GREEN); - GridLogger GridLogIterative (1,"Iterative",Logger::BLUE); - GridLogger GridLogIntegrator (1,"Integrator",Logger::BLUE); + + GridStopWatch Logger::StopWatch; + std::ostream Logger::devnull(0); + + Colours GridLogColours (0); + GridLogger GridLogError (1,"Error",GridLogColours, "RED"); + GridLogger GridLogWarning (1,"Warning",GridLogColours, "YELLOW"); + GridLogger GridLogMessage (1,"Message",GridLogColours, "NORMAL"); + GridLogger GridLogDebug (1,"Debug",GridLogColours, "PURPLE"); + GridLogger GridLogPerformance(1,"Performance",GridLogColours, "GREEN"); + GridLogger GridLogIterative (1,"Iterative",GridLogColours, "BLUE"); + GridLogger GridLogIntegrator (1,"Integrator",GridLogColours, "BLUE"); void GridLogConfigure(std::vector &logstreams) { @@ -61,6 +53,7 @@ void GridLogConfigure(std::vector &logstreams) GridLogDebug.Active(0); GridLogPerformance.Active(0); GridLogIntegrator.Active(0); + GridLogColours.Active(0); for(int i=0;i &logstreams) if ( logstreams[i]== std::string("Debug") ) GridLogDebug.Active(1); if ( logstreams[i]== std::string("Performance") ) GridLogPerformance.Active(1); if ( logstreams[i]== std::string("Integrator" ) ) GridLogIntegrator.Active(1); + if ( logstreams[i]== std::string("Colours" ) ) GridLogColours.Active(1); + } } diff --git a/lib/Log.h b/lib/Log.h index 9119cc4f..9f721d33 100644 --- a/lib/Log.h +++ b/lib/Log.h @@ -27,45 +27,94 @@ Author: Peter Boyle See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ + +#include + #ifndef GRID_LOG_H #define GRID_LOG_H namespace Grid { - -// Dress the output; use std::chrono for time stamping via the StopWatch class + + // Dress the output; use std::chrono for time stamping via the StopWatch class -class Logger { -protected: + class Colours{ + protected: + bool is_active; + public: + std::map colour; + + + Colours(bool activate=false){ + Active(activate); + }; + + + void Active(bool activate){ + is_active=activate; + + if (is_active){ + colour["BLACK"] ="\033[30m"; + colour["RED"] ="\033[31m"; + colour["GREEN"] ="\033[32m"; + colour["YELLOW"] ="\033[33m"; + colour["BLUE"] ="\033[34m"; + colour["PURPLE"] ="\033[35m"; + colour["CYAN"] ="\033[36m"; + colour["WHITE"] ="\033[37m"; + colour["NORMAL"] ="\033[0;39m"; + } else { + std::cout << "Switching off colours\n"; + colour["BLACK"] =""; + colour["RED"] =""; + colour["GREEN"] =""; + colour["YELLOW"]=""; + colour["BLUE"] =""; + colour["PURPLE"]=""; + colour["CYAN"] =""; + colour["WHITE"] =""; + colour["NORMAL"]=""; + } + + + }; + + }; + + + class Logger { + protected: + Colours &Painter; int active; - std::string name, topName, COLOUR; -public: + std::string name, topName; + std::string COLOUR; + + public: static GridStopWatch StopWatch; static std::ostream devnull; - - static std::string BLACK; - static std::string RED ; - static std::string GREEN; - static std::string YELLOW; - static std::string BLUE ; - static std::string PURPLE; - static std::string CYAN ; - static std::string WHITE ; - static std::string NORMAL; - Logger(std::string topNm, int on, std::string nm,std::string col) - : active(on), name(nm), topName(topNm), COLOUR(col) {}; + std::string background() {return Painter.colour["NORMAL"];} + std::string evidence() {return Painter.colour["YELLOW"];} + std::string colour() {return Painter.colour[COLOUR];} - void Active(int on) {active = on;}; - int isActive(void) {return active;}; - - friend std::ostream& operator<< (std::ostream& stream, const Logger& log){ - if ( log.active ) { + Logger(std::string topNm, int on, std::string nm, Colours& col_class, std::string col) + : active(on), + name(nm), + topName(topNm), + Painter(col_class), + COLOUR(col){} ; + + void Active(int on) {active = on;}; + int isActive(void) {return active;}; + + friend std::ostream& operator<< (std::ostream& stream, Logger& log){ + + if ( log.active ) { StopWatch.Stop(); GridTime now = StopWatch.Elapsed(); StopWatch.Start(); - stream << BLACK<< log.topName << BLACK<< " : "; - stream << log.COLOUR < &logstreams); -extern GridLogger GridLogError; -extern GridLogger GridLogWarning; -extern GridLogger GridLogMessage; -extern GridLogger GridLogDebug ; -extern GridLogger GridLogPerformance; -extern GridLogger GridLogIterative ; -extern GridLogger GridLogIntegrator ; + extern GridLogger GridLogError; + extern GridLogger GridLogWarning; + extern GridLogger GridLogMessage; + extern GridLogger GridLogDebug ; + extern GridLogger GridLogPerformance; + extern GridLogger GridLogIterative ; + extern GridLogger GridLogIntegrator ; + extern Colours GridLogColours; + } #endif diff --git a/lib/algorithms/approx/.dirstamp b/lib/algorithms/approx/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/communicator/.dirstamp b/lib/communicator/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/pugixml/.dirstamp b/lib/pugixml/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/qcd/action/fermion/.dirstamp b/lib/qcd/action/fermion/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/qcd/action/fermion/FermionOperatorImpl.h b/lib/qcd/action/fermion/FermionOperatorImpl.h index 312a8e41..d4a6557b 100644 --- a/lib/qcd/action/fermion/FermionOperatorImpl.h +++ b/lib/qcd/action/fermion/FermionOperatorImpl.h @@ -99,7 +99,7 @@ namespace Grid { typedef typename Impl::SiteSpinor SiteSpinor; \ typedef typename Impl::SiteHalfSpinor SiteHalfSpinor; \ typedef typename Impl::Compressor Compressor; \ - typedef typename Impl::StencilImpl StencilImpl; \ + typedef typename Impl::StencilImpl StencilImpl; \ typedef typename Impl::ImplParams ImplParams; #define INHERIT_IMPL_TYPES(Base) \ diff --git a/lib/qcd/hmc/.dirstamp b/lib/qcd/hmc/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/qcd/spin/.dirstamp b/lib/qcd/spin/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/qcd/utils/.dirstamp b/lib/qcd/utils/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/serialisation/.dirstamp b/lib/serialisation/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/stamp-h1 b/lib/stamp-h1 deleted file mode 100644 index 1b3b5f4c..00000000 --- a/lib/stamp-h1 +++ /dev/null @@ -1 +0,0 @@ -timestamp for lib/Config.h diff --git a/lib/stencil/.dirstamp b/lib/stencil/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/Test_main.cc b/tests/Test_main.cc index 9236fae1..3cbe5229 100644 --- a/tests/Test_main.cc +++ b/tests/Test_main.cc @@ -607,7 +607,7 @@ int main (int argc, char ** argv) } // loop for omp - + /* // Testing Smearing routine compilation, separate in a different file GridCartesian Fine(latt_size,simd_layout,mpi_layout); Smear_APE< PeriodicGimplR > APEsmearing; // periodic gauge implemetation @@ -615,6 +615,6 @@ int main (int argc, char ** argv) SmearedConfiguration< PeriodicGimplR > SmartConf(&Fine, 3, StoutSmearing); std::cout< Date: Fri, 1 Jul 2016 16:06:20 +0100 Subject: [PATCH 11/34] Debugged set_fj, to be fixed: BUG in imag() --- lib/Log.h | 1 - lib/qcd/hmc/integrators/Integrator.h | 6 +- lib/qcd/smearing/APEsmearing.h | 116 +++++++-------- lib/qcd/smearing/GaugeConfiguration.h | 203 +++++++++++++------------- lib/qcd/smearing/StoutSmearing.h | 135 ++++++++--------- 5 files changed, 233 insertions(+), 228 deletions(-) diff --git a/lib/Log.h b/lib/Log.h index 9f721d33..c7fde889 100644 --- a/lib/Log.h +++ b/lib/Log.h @@ -63,7 +63,6 @@ namespace Grid { colour["WHITE"] ="\033[37m"; colour["NORMAL"] ="\033[0;39m"; } else { - std::cout << "Switching off colours\n"; colour["BLACK"] =""; colour["RED"] =""; colour["GREEN"] =""; diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index e8950f22..58e1f585 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -117,10 +117,10 @@ namespace Grid{ GaugeField force(U._grid); GaugeField& Us = Smearer.get_U(as[level].actions.at(a)->is_smeared); as[level].actions.at(a)->deriv(Us,force); // deriv should not include Ta - std::cout<is_smeared <is_smeared <is_smeared) Smearer.smeared_force(force); force = Ta(force); - std::cout<gSites()) <gSites()) < - class Smear_APE: public Smear{ - private: + class Smear_APE: public Smear{ + private: const std::vector rho;/*!< Array of weights */ //This member must be private - we do not want to control from outside - std::vector set_rho(const double common_rho)const { - std::vector res; - - for(int mn=0; mn set_rho(const double common_rho)const { + std::vector res; - public: + for(int mn=0; mn& rho_):rho(rho_){} - Smear_APE(double rho_val):rho(set_rho(rho_val)){} - Smear_APE():rho(set_rho(1.0)){} - ~Smear_APE(){} + Smear_APE(const std::vector& rho_):rho(rho_){} + Smear_APE(double rho_val):rho(set_rho(rho_val)){} + Smear_APE():rho(set_rho(1.0)){} + ~Smear_APE(){} /////////////////////////////////////////////////////////////////////////////// - void smear(GaugeField& u_smr, const GaugeField& U)const{ - GridBase *grid = U._grid; - double d_rho; - GaugeLinkField Cup(grid), tmp_stpl(grid); - WilsonLoops WL; - u_smr = zero; + void smear(GaugeField& u_smr, const GaugeField& U)const{ + GridBase *grid = U._grid; + double d_rho; + GaugeLinkField Cup(grid), tmp_stpl(grid); + WilsonLoops WL; + u_smr = zero; - for(int mu=0; mugSites(); WilsonLoops WL; @@ -76,27 +78,27 @@ namespace Grid { GaugeLinkField U_mu(grid), U_nu(grid); GaugeLinkField sh_field(grid), temp_Sigma(grid); Real rho_munu, rho_numu; - - for(int mu = 0; mu < Nd; ++mu){ - U_mu = PeekIndex( U, mu); - iLambda_mu = PeekIndex(iLambda, mu); - - for(int nu = 0; nu < Nd; ++nu){ - if(nu==mu) continue; - U_nu = PeekIndex( U, nu); - iLambda_nu = PeekIndex(iLambda, nu); - - rho_munu = rho[mu + Nd * nu]; - rho_numu = rho[nu + Nd * mu]; - - WL.StapleUpper(staple, U, mu, nu); - temp_Sigma = -rho_numu*staple*iLambda_nu; + for(int mu = 0; mu < Nd; ++mu){ + U_mu = PeekIndex( U, mu); + iLambda_mu = PeekIndex(iLambda, mu); + + for(int nu = 0; nu < Nd; ++nu){ + if(nu==mu) continue; + U_nu = PeekIndex( U, nu); + iLambda_nu = PeekIndex(iLambda, nu); + + rho_munu = rho[mu + Nd * nu]; + rho_numu = rho[nu + Nd * mu]; + + WL.StapleUpper(staple, U, mu, nu); + + temp_Sigma = -rho_numu*staple*iLambda_nu; //-r_numu*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x)*Lambda_nu(x) - Gimpl::AddGaugeLink(SigmaTerm, temp_Sigma, mu); + Gimpl::AddGaugeLink(SigmaTerm, temp_Sigma, mu); sh_field = Cshift(iLambda_nu, mu, 1);// general also for Gparity? - + temp_Sigma = rho_numu*sh_field*staple; //r_numu*Lambda_nu(mu)*U_nu(x+mu)*Udag_mu(x+nu)*Udag_nu(x) Gimpl::AddGaugeLink(SigmaTerm, temp_Sigma, mu); @@ -119,10 +121,10 @@ namespace Grid { sh_field = Cshift(temp_Sigma, nu, -1); Gimpl::AddGaugeLink(SigmaTerm, sh_field, mu); - } } - } - }; +} +} +}; diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h index a87a7ef4..2202d545 100644 --- a/lib/qcd/smearing/GaugeConfiguration.h +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -6,10 +6,10 @@ #ifndef GAUGE_CONFIG_ #define GAUGE_CONFIG_ -namespace Grid { - - namespace QCD { - + namespace Grid { + + namespace QCD { + /*! @brief Smeared configuration container @@ -23,42 +23,43 @@ namespace Grid { */ template class SmearedConfiguration { - public: - INHERIT_GIMPL_TYPES(Gimpl) ; - - private: - const unsigned int smearingLevels; - Smear_Stout StoutSmearing; - std::vector SmearedSet; - + public: + INHERIT_GIMPL_TYPES(Gimpl) ; + + private: + const unsigned int smearingLevels; + Smear_Stout StoutSmearing; + std::vector SmearedSet; + // Member functions //==================================================================== - void fill_smearedSet(GaugeField& 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"; + std::cout << GridLogError << "[SmearedConfiguration] Error in ThinLinks pointer\n"; 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){ - StoutSmearing.smear(SmearedSet[smearLvl],previous_u); - previous_u = SmearedSet[smearLvl]; + std::cout<< GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n"; + GaugeField previous_u(ThinLinks->_grid); - RealD impl_plaq = WilsonLoops::avgPlaquette(previous_u); - std::cout<< GridLogDebug << "[SmearedConfiguration] Plaq: " << impl_plaq<< std::endl; + previous_u = *ThinLinks; + for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){ + StoutSmearing.smear(SmearedSet[smearLvl],previous_u); + previous_u = SmearedSet[smearLvl]; - } + // For debug purposes + RealD impl_plaq = WilsonLoops::avgPlaquette(previous_u); + std::cout<< GridLogDebug << "[SmearedConfiguration] Plaq: " << impl_plaq<< std::endl; + + } } - } +} //==================================================================== - GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime, - const GaugeField& GaugeK) const{ +GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime, + const GaugeField& GaugeK) const{ GridBase *grid = GaugeK._grid; GaugeField C(grid), SigmaK(grid), iLambda(grid); GaugeLinkField iLambda_mu(grid); @@ -69,27 +70,27 @@ namespace Grid { StoutSmearing.BaseSmear(C, GaugeK); for (int mu = 0; mu < Nd; mu++){ - Cmu = peekLorentz( C,mu); - GaugeKmu = peekLorentz(GaugeK,mu); - SigmaKPrime_mu = peekLorentz(SigmaKPrime,mu); - iQ = Ta(Cmu*adj(GaugeKmu)); - set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu); - pokeLorentz(SigmaK, SigmaKPrime_mu*e_iQ + adj(Cmu)*iLambda_mu, mu); - pokeLorentz(iLambda, iLambda_mu, mu); + Cmu = peekLorentz( C,mu); + GaugeKmu = peekLorentz(GaugeK,mu); + SigmaKPrime_mu = peekLorentz(SigmaKPrime,mu); + iQ = Ta(Cmu*adj(GaugeKmu)); + set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu); + pokeLorentz(SigmaK, SigmaKPrime_mu*e_iQ + adj(Cmu)*iLambda_mu, mu); + pokeLorentz(iLambda, iLambda_mu, mu); } StoutSmearing.derivative(SigmaK, iLambda, 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{ +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); @@ -103,9 +104,9 @@ namespace Grid { LatticeComplex r01(grid), r11(grid), r21(grid), r02(grid), r12(grid); LatticeComplex r22(grid), tr1(grid), tr2(grid); LatticeComplex b10(grid), b11(grid), b12(grid), b20(grid), b21(grid), b22(grid); - LatticeReal unitReal(grid); + LatticeReal LatticeUnitReal(grid); - unitReal = 1.0; + LatticeUnitReal = 1.0; // Exponential iQ2 = iQ * iQ; @@ -125,19 +126,19 @@ namespace Grid { e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(sin(2.0*u))); r01 = (toComplex(2.0*u) + timesI(toComplex(2.0*(u2-w2)))) * e2iu - + emiu * (toComplex(16.0*u*cosw + 2.0*u*(3.0*u2+w2)*xi0) + - timesI(toComplex(-8.0*u2*cosw + 2.0*(9.0*u2+w2)*xi0))); + + emiu * (toComplex(16.0*u*cosw + 2.0*u*(3.0*u2+w2)*xi0) + + timesI(toComplex(-8.0*u2*cosw + 2.0*(9.0*u2+w2)*xi0))); - r11 = (toComplex(2.0*unitReal) + timesI(toComplex(4.0*u)))* e2iu - + emiu * (toComplex(-2.0*cosw + (3.0*u2-w2)*xi0) + - timesI(toComplex(2.0*u*cosw + 6.0*u*xi0))); + r11 = (toComplex(2.0*LatticeUnitReal) + timesI(toComplex(4.0*u)))* e2iu + + emiu * (toComplex(-2.0*cosw + (3.0*u2-w2)*xi0) + + timesI(toComplex(2.0*u*cosw + 6.0*u*xi0))); - r21 = timesI(toComplex(2.0*unitReal)) * e2iu - + emiu * (toComplex(-3.0*u*xi0) + timesI(toComplex(cosw - 3.0*xi0))); + r21 = 2.0*timesI(e2iu) + + emiu * (toComplex(-3.0*u*xi0) + timesI(toComplex(cosw - 3.0*xi0))); r02 = -2.0 * e2iu + emiu * (toComplex(-8.0*u2*xi0) + - timesI(toComplex(2.0*u*(cosw + xi0 + 3.0*u2*xi1)))); + timesI(toComplex(2.0*u*(cosw + xi0 + 3.0*u2*xi1)))); r12 = emiu * (toComplex(2.0*u*xi0) + timesI(toComplex(-cosw - xi0 + 3.0*u2*xi1))); @@ -172,34 +173,34 @@ namespace Grid { GaugeLinkField USQ = USigmap * timesMinusI(iQ); GaugeLinkField iGamma = tr1 * timesMinusI(iQ) - tr2 * iQ2 + - f1 * USigmap + f2 * QUS + f2 * USQ; + f1 * USigmap + f2 * QUS + f2 * USQ; iLambda = Ta(iGamma); - - } + +} //==================================================================== - public: +public: GaugeField* ThinLinks; /*!< @brief Pointer to the thin links configuration */ /*! @brief Standard constructor */ - SmearedConfiguration(GridCartesian * UGrid, - unsigned int Nsmear, - Smear_Stout& Stout): + 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))); + StoutSmearing(Stout), + ThinLinks(NULL){ + for (unsigned int i=0; i< smearingLevels; ++i) + SmearedSet.push_back(*(new GaugeField(UGrid))); } /*! For just thin links */ - SmearedConfiguration(): + SmearedConfiguration(): smearingLevels(0), - StoutSmearing(), - SmearedSet(), - ThinLinks(NULL){} + StoutSmearing(), + SmearedSet(), + ThinLinks(NULL){} // attach the smeared routines to the thin links U and fill the smeared set @@ -207,59 +208,59 @@ namespace Grid { //==================================================================== void smeared_force(GaugeField& SigmaTilde) const{ - if (smearingLevels > 0){ + if (smearingLevels > 0){ 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 SigmaTilde - tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); - pokeLorentz(force, tmp_mu, mu); + tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); + pokeLorentz(force, tmp_mu, mu); } for(int ismr = smearingLevels - 1; ismr > 0; --ismr) - force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); + force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); force = AnalyticSmearedForce(force,*ThinLinks); for (int mu = 0; mu < Nd; mu++){ - tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); - pokeLorentz(SigmaTilde, tmp_mu, mu); + tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); + pokeLorentz(SigmaTilde, tmp_mu, mu); } }// if smearingLevels = 0 do nothing - } +} //==================================================================== - - GaugeField& get_SmearedU(){ + +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){ - RealD impl_plaq = WilsonLoops::avgPlaquette(SmearedSet[smearingLevels-1]); - std::cout<< GridLogDebug << "getting U Plaq: " << impl_plaq<< std::endl; - return get_SmearedU(); - - } - else { - RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); - std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; - return *ThinLinks; - } + if (smearingLevels){ + RealD impl_plaq = WilsonLoops::avgPlaquette(SmearedSet[smearingLevels-1]); + std::cout<< GridLogDebug << "getting U Plaq: " << impl_plaq<< std::endl; + return get_SmearedU(); + + } + else { + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; + return *ThinLinks; + } } else{ - RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); - std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; - return *ThinLinks;} - } - - }; - - - } - + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; + return *ThinLinks;} + } + +}; + + +} + } diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index 5b5e4ba3..ff7a1cb8 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -5,64 +5,64 @@ #ifndef STOUT_SMEAR_ #define STOUT_SMEAR_ -namespace Grid { - namespace QCD { + namespace Grid { + namespace QCD { /*! @brief Stout smearing of link variable. */ template - class Smear_Stout: public Smear { - private: - const std::vector d_rho; - const Smear < Gimpl > * SmearBase; - + class Smear_Stout: public Smear { + private: + const std::vector d_rho; + const Smear < Gimpl > * SmearBase; + + + + public: + INHERIT_GIMPL_TYPES(Gimpl) + + Smear_Stout(Smear < Gimpl >* base):SmearBase(base){ + static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); + } - - public: - INHERIT_GIMPL_TYPES(Gimpl) - - Smear_Stout(Smear < Gimpl >* base):SmearBase(base){ - static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); - } - /*! Default constructor */ - Smear_Stout(double rho = 1.0):SmearBase(new Smear_APE < Gimpl > (rho)){ - static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); - } - - ~Smear_Stout(){} - - void smear(GaugeField& u_smr,const GaugeField& U) const{ - GaugeField C(U._grid); - GaugeLinkField tmp(U._grid), iq_mu(U._grid), Umu(U._grid); - - std::cout<< GridLogDebug << "Stout smearing started\n"; - + Smear_Stout(double rho = 1.0):SmearBase(new Smear_APE < Gimpl > (rho)){ + static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); + } + + ~Smear_Stout(){} + + void smear(GaugeField& u_smr,const GaugeField& U) const{ + GaugeField C(U._grid); + GaugeLinkField tmp(U._grid), iq_mu(U._grid), Umu(U._grid); + + std::cout<< GridLogDebug << "Stout smearing started\n"; + //Smear the configurations - SmearBase->smear(C, U); - for (int mu = 0; musmear(C, U); + for (int mu = 0; muderivative(SigmaTerm, iLambda, Gauge); - } - - - void BaseSmear(GaugeField& C, - const GaugeField& U) const{ +} + + +void BaseSmear(GaugeField& C, + const GaugeField& U) const{ SmearBase->smear(C, U); - } - - void exponentiate_iQ(GaugeLinkField& e_iQ, - const GaugeLinkField& iQ) const{ +} + +void exponentiate_iQ(GaugeLinkField& e_iQ, + const GaugeLinkField& iQ) const{ // Put this outside // only valid for SU(3) matrices @@ -87,11 +87,11 @@ namespace Grid { set_uw(u, w, iQ2, iQ3); set_fj(f0, f1, f2, u, w); e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; - }; +}; - void set_uw(LatticeReal& u, LatticeReal& w, - GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ +void set_uw(LatticeReal& u, LatticeReal& w, + GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ Real one_over_three = 1.0/3.0; Real one_over_two = 1.0/2.0; @@ -99,18 +99,20 @@ namespace Grid { LatticeReal c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); // sign in c0 from the conventions on the Ta - c0 = - toReal(imag(trace(iQ3))) * one_over_three; +// c0 = - toReal(imag(trace(iQ3))) * one_over_three; + c0 = - toReal(real(timesMinusI(trace(iQ3)))) * one_over_three; //temporary, FIX the bug in imag c1 = - toReal(real(trace(iQ2))) * one_over_two; tmp = c1 * one_over_three; - c0max = 2.0 * pow(tmp, 1.5); + c0max = 2.0 * pow(tmp, 1.5); theta = acos(c0/c0max); u = sqrt(tmp) * cos( theta * one_over_three); w = sqrt(c1) * sin( theta * one_over_three); - } - void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, - const LatticeReal& u, const LatticeReal& w) const{ +} + +void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, + const LatticeReal& u, const LatticeReal& w) const{ GridBase *grid = u._grid; LatticeReal xi0(grid), u2(grid), w2(grid), cosw(grid), tmp(grid); @@ -124,41 +126,42 @@ namespace Grid { cosw = cos(w); ixi0 = timesI(toComplex(xi0)); - emiu = toComplex(cos(u)) - timesI(toComplex(u)); - e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(2.0*u)); + emiu = toComplex(cos(u)) - timesI(toComplex(sin(u))); + e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(sin(2.0*u))); h0 = e2iu * toComplex(u2 - w2) + emiu *( toComplex(8.0*u2*cosw) + - toComplex(2.0*u*(3.0*u2 + w2))*ixi0); - + toComplex(2.0*u*(3.0*u2 + w2))*ixi0); + h1 = toComplex(2.0*u) * e2iu - emiu*( toComplex(2.0*u*cosw) - - toComplex(3.0*u2-w2)*ixi0); + toComplex(3.0*u2-w2)*ixi0); h2 = e2iu - emiu * (toComplex(cosw) + toComplex(3.0*u)*ixi0); - tmp = 9.0*u2 - w2; fden = toComplex(pow(tmp, -1.0)); f0 = h0 * fden; f1 = h1 * fden; f2 = h2 * fden; - } + + +} - LatticeReal func_xi0(const LatticeReal& w) const{ +LatticeReal func_xi0(const LatticeReal& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning<< "[Smear_stout] w too small: "<< w <<"\n"; return sin(w)/w; - } +} - LatticeReal func_xi1(const LatticeReal& w) const{ +LatticeReal func_xi1(const LatticeReal& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: "<< w <<"\n"; return cos(w)/(w*w) - sin(w)/(w*w*w); - } - - }; +} - } +}; + +} } #endif From 1a6d65c6a42e0f142b5ba7dad7ee5816a633663c Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Sun, 3 Jul 2016 10:27:43 +0100 Subject: [PATCH 12/34] Converted set_uw and set_fj to all complex functions --- lib/qcd/smearing/GaugeConfiguration.h | 14 +- lib/qcd/smearing/StoutSmearing.h | 284 ++++++++++++++++---------- lib/simd/Grid_vector_types.h | 2 +- 3 files changed, 185 insertions(+), 115 deletions(-) diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h index 2202d545..717763c2 100644 --- a/lib/qcd/smearing/GaugeConfiguration.h +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -81,11 +81,16 @@ GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime, StoutSmearing.derivative(SigmaK, iLambda, GaugeK);// derivative of SmearBase return SigmaK; } - /*! @brief Returns smeared configuration at level 'Level' */ + + + +/*! @brief Returns smeared configuration at level 'Level' */ const GaugeField& get_smeared_conf(int Level) const{ return SmearedSet[Level]; } - //==================================================================== + + +//==================================================================== void set_iLambda(GaugeLinkField& iLambda, GaugeLinkField& e_iQ, const GaugeLinkField& iQ, @@ -179,10 +184,11 @@ void set_iLambda(GaugeLinkField& iLambda, } - //==================================================================== + +//==================================================================== public: GaugeField* ThinLinks; /*!< @brief Pointer to the thin - links configuration */ + links configuration */ /*! @brief Standard constructor */ SmearedConfiguration(GridCartesian * UGrid, diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index ff7a1cb8..6a061bac 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -15,8 +15,6 @@ const std::vector d_rho; const Smear < Gimpl > * SmearBase; - - public: INHERIT_GIMPL_TYPES(Gimpl) @@ -39,129 +37,195 @@ //Smear the configurations SmearBase->smear(C, U); - for (int mu = 0; muderivative(SigmaTerm, iLambda, Gauge); -} + iq_mu = Ta(tmp * adj(Umu)); // iq_mu = Ta(Omega_mu) to match the signs with the paper + exponentiate_iQ(tmp, iq_mu); + GaugeLinkField check = adj(tmp) * tmp - 1.0; + pokeLorentz(u_smr, tmp*Umu, mu);// u_smr = exp(iQ_mu)*U_mu + } + + std::cout<< GridLogDebug << "Stout smearing completed\n"; -void BaseSmear(GaugeField& C, - const GaugeField& U) const{ - SmearBase->smear(C, U); -} - -void exponentiate_iQ(GaugeLinkField& e_iQ, - const GaugeLinkField& iQ) const{ - // Put this outside - // only valid for SU(3) matrices - - // only one Lorentz direction at a time - - // notice that it actually computes - // exp ( input matrix ) - // the i sign is coming from outside - // input matrix is anti-hermitian NOT hermitian - - GridBase *grid = iQ._grid; - GaugeLinkField unity(grid); - unity=1.0; - - GaugeLinkField iQ2(grid), iQ3(grid); - LatticeReal u(grid), w(grid); - LatticeComplex f0(grid), f1(grid), f2(grid); - - iQ2 = iQ * iQ; - iQ3 = iQ * iQ2; - - set_uw(u, w, iQ2, iQ3); - set_fj(f0, f1, f2, u, w); - e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; -}; + }; -void set_uw(LatticeReal& u, LatticeReal& w, - GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ - Real one_over_three = 1.0/3.0; - Real one_over_two = 1.0/2.0; - - GridBase *grid = u._grid; - LatticeReal c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); - - // sign in c0 from the conventions on the Ta -// c0 = - toReal(imag(trace(iQ3))) * one_over_three; - c0 = - toReal(real(timesMinusI(trace(iQ3)))) * one_over_three; //temporary, FIX the bug in imag - c1 = - toReal(real(trace(iQ2))) * one_over_two; - tmp = c1 * one_over_three; - c0max = 2.0 * pow(tmp, 1.5); - - theta = acos(c0/c0max); - u = sqrt(tmp) * cos( theta * one_over_three); - w = sqrt(c1) * sin( theta * one_over_three); - -} - -void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, - const LatticeReal& u, const LatticeReal& w) const{ - - GridBase *grid = u._grid; - LatticeReal xi0(grid), u2(grid), w2(grid), cosw(grid), tmp(grid); - LatticeComplex fden(grid); - LatticeComplex h0(grid), h1(grid), h2(grid); - LatticeComplex e2iu(grid), emiu(grid), ixi0(grid), qt(grid); - - xi0 = func_xi0(w); - u2 = u * u; - w2 = w * w; - cosw = cos(w); - - ixi0 = timesI(toComplex(xi0)); - emiu = toComplex(cos(u)) - timesI(toComplex(sin(u))); - e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(sin(2.0*u))); - - h0 = e2iu * toComplex(u2 - w2) + emiu *( toComplex(8.0*u2*cosw) + - toComplex(2.0*u*(3.0*u2 + w2))*ixi0); - - h1 = toComplex(2.0*u) * e2iu - emiu*( toComplex(2.0*u*cosw) - - toComplex(3.0*u2-w2)*ixi0); - - h2 = e2iu - emiu * (toComplex(cosw) + toComplex(3.0*u)*ixi0); - - tmp = 9.0*u2 - w2; - fden = toComplex(pow(tmp, -1.0)); - f0 = h0 * fden; - f1 = h1 * fden; - f2 = h2 * fden; - - -} + void derivative(GaugeField& SigmaTerm, + const GaugeField& iLambda, + const GaugeField& Gauge) const{ + SmearBase->derivative(SigmaTerm, iLambda, Gauge); + }; -LatticeReal func_xi0(const LatticeReal& w) const{ + void BaseSmear(GaugeField& C, + const GaugeField& U) const{ + SmearBase->smear(C, U); + }; + + void exponentiate_iQ(GaugeLinkField& e_iQ, + const GaugeLinkField& iQ) const{ + // Put this outside + // only valid for SU(3) matrices + + // only one Lorentz direction at a time + + // notice that it actually computes + // exp ( input matrix ) + // the i sign is coming from outside + // input matrix is anti-hermitian NOT hermitian + + GridBase *grid = iQ._grid; + GaugeLinkField unity(grid); + unity=1.0; + + GaugeLinkField iQ2(grid), iQ3(grid); + LatticeComplex u(grid), w(grid); + LatticeComplex f0(grid), f1(grid), f2(grid); + + iQ2 = iQ * iQ; + iQ3 = iQ * iQ2; + + set_uw_complex(u, w, iQ2, iQ3); + set_fj_complex(f0, f1, f2, u, w); + + + e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; + }; + + + void set_uw(LatticeReal& u, LatticeReal& w, + GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ + Real one_over_three = 1.0/3.0; + Real one_over_two = 1.0/2.0; + + GridBase *grid = u._grid; + LatticeReal c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); + + // sign in c0 from the conventions on the Ta + // c0 = - toReal(imag(trace(iQ3))) * one_over_three; + c0 = - toReal(real(timesMinusI(trace(iQ3)))) * one_over_three; //slow and temporary, FIX the bug in imag + c1 = - toReal(real(trace(iQ2))) * one_over_two; + tmp = c1 * one_over_three; + c0max = 2.0 * pow(tmp, 1.5); + + theta = acos(c0/c0max); + u = sqrt(tmp) * cos( theta * one_over_three); + w = sqrt(c1) * sin( theta * one_over_three); + + } + + void set_uw_complex(LatticeComplex& u, LatticeComplex& w, + GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ + Complex one_over_three = 1.0/3.0; + Complex one_over_two = 1.0/2.0; + + GridBase *grid = u._grid; + LatticeComplex c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); + + // sign in c0 from the conventions on the Ta + c0 = - real(timesMinusI(trace(iQ3))) * one_over_three; //temporary hack + c1 = - real(trace(iQ2)) * one_over_two; + tmp = c1 * one_over_three; + c0max = 2.0 * pow(tmp, 1.5); + + theta = acos(c0/c0max); + u = sqrt(tmp) * cos( theta * one_over_three); + w = sqrt(c1) * sin( theta * one_over_three); + + } + + + void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, + const LatticeReal& u, const LatticeReal& w) const{ + + GridBase *grid = u._grid; + LatticeReal xi0(grid), u2(grid), w2(grid), cosw(grid), tmp(grid); + LatticeComplex fden(grid); + LatticeComplex h0(grid), h1(grid), h2(grid); + LatticeComplex e2iu(grid), emiu(grid), ixi0(grid), qt(grid); + + xi0 = func_xi0(w); + u2 = u * u; + w2 = w * w; + cosw = cos(w); + + ixi0 = timesI(toComplex(xi0)); + emiu = toComplex(cos(u)) - timesI(toComplex(sin(u))); + e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(sin(2.0*u))); + + h0 = e2iu * toComplex(u2 - w2) + emiu *( toComplex(8.0*u2*cosw) + + toComplex(2.0*u*(3.0*u2 + w2))*ixi0); + + h1 = toComplex(2.0*u) * e2iu - emiu*( toComplex(2.0*u*cosw) - + toComplex(3.0*u2-w2)*ixi0); + + h2 = e2iu - emiu * (toComplex(cosw) + toComplex(3.0*u)*ixi0); + + tmp = 9.0*u2 - w2; + fden = toComplex(pow(tmp, -1.0)); + f0 = h0 * fden; + f1 = h1 * fden; + f2 = h2 * fden; + + + } + + void set_fj_complex(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, + const LatticeComplex& u, const LatticeComplex& w) const{ + + GridBase *grid = u._grid; + LatticeComplex xi0(grid), u2(grid), w2(grid), cosw(grid), tmp(grid); + LatticeComplex fden(grid); + LatticeComplex h0(grid), h1(grid), h2(grid); + LatticeComplex e2iu(grid), emiu(grid), ixi0(grid), qt(grid); + + xi0 = sin(w)/w;//func_xi0(w); + u2 = u * u; + w2 = w * w; + cosw = cos(w); + + ixi0 = timesI(xi0); + emiu = cos(u) - timesI(sin(u)); + e2iu = cos(2.0*u) + timesI(sin(2.0*u)); + + h0 = e2iu * (u2 - w2) + emiu *( (8.0*u2*cosw) + + (2.0*u*(3.0*u2 + w2)*ixi0)); + + h1 = (2.0*u) * e2iu - emiu*( (2.0*u*cosw) - + (3.0*u2-w2)*ixi0); + + h2 = e2iu - emiu * (cosw + (3.0*u)*ixi0); + + tmp = 9.0*u2 - w2; + fden = pow(tmp, -1.0); + f0 = h0 * fden; + f1 = h1 * fden; + f2 = h2 * fden; + + + } + + + + + LatticeReal func_xi0(const LatticeReal& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning<< "[Smear_stout] w too small: "<< w <<"\n"; - return sin(w)/w; -} + return sin(w)/w; + } -LatticeReal func_xi1(const LatticeReal& w) const{ + LatticeReal func_xi1(const LatticeReal& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: "<< w <<"\n"; - return cos(w)/(w*w) - sin(w)/(w*w*w); -} + return cos(w)/(w*w) - sin(w)/(w*w*w); + } -}; + }; -} + } } #endif diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 52836336..dde64729 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -490,7 +490,7 @@ namespace Grid { typedef Grid_simd simd; simd ret; typename simd::conv_t conv; - conv.v = in.v; + conv.v = in.v; // copy the vector content (bytewise) for(int i=0;i Date: Sun, 3 Jul 2016 12:28:25 +0100 Subject: [PATCH 13/34] Corrected a bug in the Expression Templates (acso and asin were wrong) --- lib/lattice/Lattice_ET.h | 4 +-- lib/qcd/smearing/StoutSmearing.h | 61 +++++++++++++++++++++++++------- lib/tensors/Tensor_unary.h | 2 ++ 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/lib/lattice/Lattice_ET.h b/lib/lattice/Lattice_ET.h index 77e0ce5d..98c38e96 100644 --- a/lib/lattice/Lattice_ET.h +++ b/lib/lattice/Lattice_ET.h @@ -219,8 +219,8 @@ inline void CBFromExpression( int &cb,const LatticeTrinaryExpression Date: Mon, 4 Jul 2016 15:35:37 +0100 Subject: [PATCH 14/34] Debugged smearing for EOWilson, accepts --- lib/qcd/hmc/integrators/Integrator.h | 238 +++++++++++++------------- lib/qcd/smearing/APEsmearing.h | 121 +++++++------ lib/qcd/smearing/GaugeConfiguration.h | 163 +++++++++--------- lib/qcd/smearing/StoutSmearing.h | 183 +++++--------------- 4 files changed, 305 insertions(+), 400 deletions(-) diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index 58e1f585..db61b114 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -44,40 +44,40 @@ Author: paboyle #include -namespace Grid{ - namespace QCD{ + namespace Grid{ + namespace QCD{ - struct IntegratorParameters{ + struct IntegratorParameters{ - int Nexp; + int Nexp; int MDsteps; // number of outer steps RealD trajL; // trajectory length RealD stepsize; IntegratorParameters(int MDsteps_, - RealD trajL_=1.0, - int Nexp_=12): - Nexp(Nexp_), - MDsteps(MDsteps_), - trajL(trajL_), - stepsize(trajL/MDsteps) - { + RealD trajL_=1.0, + int Nexp_=12): + Nexp(Nexp_), + MDsteps(MDsteps_), + trajL(trajL_), + stepsize(trajL/MDsteps) + { // empty body constructor - }; + }; - }; + }; /*! @brief Class for Molecular Dynamics management */ template - class Integrator { + class Integrator { - protected: + protected: - typedef IntegratorParameters ParameterType; + typedef IntegratorParameters ParameterType; - IntegratorParameters Params; + IntegratorParameters Params; - const ActionSet as; + const ActionSet as; int levels; // double t_U; // Track time passing on each level and for U and for P @@ -90,14 +90,14 @@ namespace Grid{ // Should match any legal (SU(n)) gauge field // Need to use this template to match Ncol to pass to SU class template void generate_momenta(Lattice< iVector< iScalar< iMatrix >, Nd> > & P,GridParallelRNG& pRNG){ - typedef Lattice< iScalar< iScalar< iMatrix > > > GaugeLinkField; - GaugeLinkField Pmu(P._grid); - Pmu = zero; - for(int mu=0;mu::GaussianLieAlgebraMatrix(pRNG, Pmu); - PokeIndex(P, Pmu, mu); - } + typedef Lattice< iScalar< iScalar< iMatrix > > > GaugeLinkField; + GaugeLinkField Pmu(P._grid); + Pmu = zero; + for(int mu=0;mu::GaussianLieAlgebraMatrix(pRNG, Pmu); + PokeIndex(P, Pmu, mu); } + } //ObserverList observers; // not yet @@ -105,126 +105,128 @@ namespace Grid{ // void register_observers(); // void notify_observers(); - void update_P(GaugeField&U, int level,double ep){ - t_P[level]+=ep; - update_P(P,U,level,ep); + void update_P(GaugeField&U, int level, double ep){ + t_P[level]+=ep; + update_P(P,U,level,ep); - std::cout<is_smeared); - as[level].actions.at(a)->deriv(Us,force); // deriv should not include Ta - std::cout<< GridLogIntegrator << "Smearing (on/off): "<is_smeared <is_smeared) Smearer.smeared_force(force); - force = Ta(force); - std::cout<< GridLogIntegrator << "Force average: "<< norm2(force)/(U._grid->gSites()) <is_smeared); + as[level].actions.at(a)->deriv(Us,force); // deriv should NOT include Ta + + std::cout<< GridLogIntegrator << "Smearing (on/off): "<is_smeared <is_smeared) Smearer.smeared_force(force); + force = Ta(force); + std::cout<< GridLogIntegrator << "Force average: "<< norm2(force)/(U._grid->gSites()) <(U, mu); - auto Pmu=PeekIndex(Mom, mu); - Umu = expMat(Pmu, ep, Params.Nexp)*Umu; - ProjectOnGroup(Umu); - PokeIndex(U, Umu, mu); - } + for (int mu = 0; mu < Nd; mu++){ + auto Umu=PeekIndex(U, mu); + auto Pmu=PeekIndex(Mom, mu); + Umu = expMat(Pmu, ep, Params.Nexp)*Umu; + ProjectOnGroup(Umu); + PokeIndex(U, Umu, mu); + } // Update the smeared fields, can be implemented as observer - Smearer.set_GaugeField(U); - } - - virtual void step (GaugeField& U,int level, int first,int last)=0; + Smearer.set_GaugeField(U); + } - public: + virtual void step (GaugeField& U,int level, int first,int last)=0; - Integrator(GridBase* grid, - IntegratorParameters Par, - ActionSet & Aset, - SmearingPolicy &Sm): - Params(Par), - as(Aset), - P(grid), - levels(Aset.size()), - Smearer(Sm) - { - t_P.resize(levels,0.0); - t_U=0.0; +public: + + Integrator(GridBase* grid, + IntegratorParameters Par, + ActionSet & Aset, + SmearingPolicy &Sm): + Params(Par), + as(Aset), + P(grid), + levels(Aset.size()), + Smearer(Sm) + { + t_P.resize(levels,0.0); + t_U=0.0; // initialization of smearer delegated outside of Integrator - }; - - virtual ~Integrator(){} + }; + + virtual ~Integrator(){} //Initialization of momenta and actions - void refresh(GaugeField& U,GridParallelRNG &pRNG){ - std::cout<is_smeared); - as[level].actions.at(actionID)->refresh(Us, pRNG); - } + GaugeField& Us = Smearer.get_U(as[level].actions.at(actionID)->is_smeared); + as[level].actions.at(actionID)->refresh(Us, pRNG); + } + } } - } // Calculate action - RealD S(GaugeField& U){ + RealD S(GaugeField& U){// here also U not used - LatticeComplex Hloc(U._grid); Hloc = zero; + LatticeComplex Hloc(U._grid); Hloc = zero; // Momenta - for (int mu=0; mu (P, mu); - Hloc -= trace(Pmu*Pmu); - } - Complex Hsum = sum(Hloc); - - RealD H = Hsum.real(); - RealD Hterm; - std::cout<(P, mu); + Hloc -= trace(Pmu*Pmu); + } + Complex Hsum = sum(Hloc); + + RealD H = Hsum.real(); + RealD Hterm; + std::cout<is_smeared); - Hterm = as[level].actions.at(actionID)->S(Us); - std::cout<& Stout): - smearingLevels(Nsmear), - StoutSmearing(Stout), - ThinLinks(NULL){ - for (unsigned int i=0; i< smearingLevels; ++i) - SmearedSet.push_back(*(new GaugeField(UGrid))); - } - + 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))); + } + /*! For just thin links */ - SmearedConfiguration(): - smearingLevels(0), - StoutSmearing(), - SmearedSet(), - ThinLinks(NULL){} - - + SmearedConfiguration(): + smearingLevels(0), + StoutSmearing(), + SmearedSet(), + ThinLinks(NULL){} + + // attach the smeared routines to the thin links U and fill the smeared set - void set_GaugeField(GaugeField& U){ fill_smearedSet(U);} - - //==================================================================== - void smeared_force(GaugeField& SigmaTilde) const{ - if (smearingLevels > 0){ - GaugeField force = SigmaTilde;//actually = U*SigmaTilde - GaugeLinkField tmp_mu(SigmaTilde._grid); - - for (int mu = 0; mu < Nd; mu++){ - // to get SigmaTilde - tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); - pokeLorentz(force, tmp_mu, mu); - } - for(int ismr = smearingLevels - 1; ismr > 0; --ismr) - force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); - - force = AnalyticSmearedForce(force,*ThinLinks); - - for (int mu = 0; mu < Nd; mu++){ - tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); - pokeLorentz(SigmaTilde, tmp_mu, mu); - } + void set_GaugeField(GaugeField& U){ fill_smearedSet(U);} + +//==================================================================== + void smeared_force(GaugeField& SigmaTilde) const{ + + if (smearingLevels > 0){ + GaugeField force(SigmaTilde._grid); + GaugeLinkField tmp_mu(SigmaTilde._grid); + force = SigmaTilde;//actually = U*SigmaTilde + + for (int mu = 0; mu < Nd; mu++){ + // to get just SigmaTilde + tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); + pokeLorentz(force, tmp_mu, mu); + } + + for(int ismr = smearingLevels - 1; ismr > 0; --ismr) + force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); + + force = AnalyticSmearedForce(force,*ThinLinks); + + 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 } //==================================================================== @@ -246,7 +251,7 @@ GaugeField& get_U(bool smeared=false) { if (smeared){ if (smearingLevels){ RealD impl_plaq = WilsonLoops::avgPlaquette(SmearedSet[smearingLevels-1]); - std::cout<< GridLogDebug << "getting U Plaq: " << impl_plaq<< std::endl; + std::cout<< GridLogDebug << "getting Usmr Plaq: " << impl_plaq<< std::endl; return get_SmearedU(); } diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index 3c323c47..511a5c29 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -12,7 +12,6 @@ template class Smear_Stout: public Smear { private: - const std::vector d_rho; const Smear < Gimpl > * SmearBase; public: @@ -22,58 +21,48 @@ static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); } - /*! Default constructor */ + /*! Default constructor */ Smear_Stout(double rho = 1.0):SmearBase(new Smear_APE < Gimpl > (rho)){ static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); } - ~Smear_Stout(){} + ~Smear_Stout(){} //delete SmearBase... void smear(GaugeField& u_smr,const GaugeField& U) const{ - - GaugeField C(U._grid); GaugeLinkField tmp(U._grid), iq_mu(U._grid), Umu(U._grid); std::cout<< GridLogDebug << "Stout smearing started\n"; - //Smear the configurations + //Smear the configurations SmearBase->smear(C, U); + for (int mu = 0; muderivative(SigmaTerm, iLambda, Gauge); + }; - void derivative(GaugeField& SigmaTerm, - const GaugeField& iLambda, - const GaugeField& Gauge) const{ - SmearBase->derivative(SigmaTerm, iLambda, Gauge); - }; + void BaseSmear(GaugeField& C, + const GaugeField& U) const{ + SmearBase->smear(C, U); + }; - - void BaseSmear(GaugeField& C, - const GaugeField& U) const{ - SmearBase->smear(C, U); - }; - - void exponentiate_iQ(GaugeLinkField& e_iQ, - const GaugeLinkField& iQ) const{ + void exponentiate_iQ(GaugeLinkField& e_iQ, + const GaugeLinkField& iQ) const{ // Put this outside // only valid for SU(3) matrices @@ -84,124 +73,48 @@ // the i sign is coming from outside // input matrix is anti-hermitian NOT hermitian - GridBase *grid = iQ._grid; - GaugeLinkField unity(grid); - unity=1.0; + GridBase *grid = iQ._grid; + GaugeLinkField unity(grid); + unity=1.0; - GaugeLinkField iQ2(grid), iQ3(grid); - LatticeComplex u(grid), w(grid); - LatticeComplex f0(grid), f1(grid), f2(grid); + GaugeLinkField iQ2(grid), iQ3(grid); + LatticeComplex u(grid), w(grid); + LatticeComplex f0(grid), f1(grid), f2(grid); - iQ2 = iQ * iQ; - iQ3 = iQ * iQ2; + iQ2 = iQ * iQ; + iQ3 = iQ * iQ2; - set_uw_complex(u, w, iQ2, iQ3); - set_fj_complex(f0, f1, f2, u, w); + set_uw(u, w, iQ2, iQ3); + set_fj(f0, f1, f2, u, w); - std::cout << "f0 " << f0 << std::endl; - std::cout << "f1 " << f1 << std::endl; - std::cout << "f2 " << f2 << std::endl; - std::cout << "iQ " << iQ << std::endl; - std::cout << "iQ2 " << iQ2 << std::endl; - - e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; + e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; - }; + }; - void set_uw(LatticeReal& u, LatticeReal& w, - GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ - Real one_over_three = 1.0/3.0; - Real one_over_two = 1.0/2.0; + void set_uw(LatticeComplex& u, LatticeComplex& w, + GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ + Complex one_over_three = 1.0/3.0; + Complex one_over_two = 1.0/2.0; - GridBase *grid = u._grid; - LatticeReal c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); - - // sign in c0 from the conventions on the Ta - // c0 = - toReal(imag(trace(iQ3))) * one_over_three; - c0 = - toReal(real(timesMinusI(trace(iQ3)))) * one_over_three; //slow and temporary, FIX the bug in imag - c1 = - toReal(real(trace(iQ2))) * one_over_two; - tmp = c1 * one_over_three; - c0max = 2.0 * pow(tmp, 1.5); - - theta = acos(c0/c0max); - u = sqrt(tmp) * cos( theta * one_over_three); - w = sqrt(c1) * sin( theta * one_over_three); - - } - - void set_uw_complex(LatticeComplex& u, LatticeComplex& w, - GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ - Complex one_over_three = 1.0/3.0; - Complex one_over_two = 1.0/2.0; - - GridBase *grid = u._grid; - LatticeComplex c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); + GridBase *grid = u._grid; + LatticeComplex c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); // sign in c0 from the conventions on the Ta c0 = - real(timesMinusI(trace(iQ3))) * one_over_three; //temporary hack c1 = - real(trace(iQ2)) * one_over_two; //Cayley Hamilton checks to machine precision, tested - - std::cout << "c0 " << c0 << std::endl; - std::cout << "c1 " << c1 << std::endl; - tmp = c1 * one_over_three; c0max = 2.0 * pow(tmp, 1.5); - std::cout << "c0max " << c0max << std::endl; - LatticeComplex tempratio = c0/c0max; - std::cout << "ratio c0/c0max " << tempratio << std::endl; - theta = acos(c0/c0max); // divide by three here, now leave as it is - std::cout << "theta " << theta << std::endl; - - u = sqrt(tmp) * cos( theta * one_over_three); - w = sqrt(c1) * sin( theta * one_over_three); - - std::cout << "u " << u << std::endl; - std::cout << "w " << w << std::endl; - + theta = acos(c0/c0max)*one_over_three; // divide by three here, now leave as it is + u = sqrt(tmp) * cos( theta ); + w = sqrt(c1) * sin( theta ); } - void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, - const LatticeReal& u, const LatticeReal& w) const{ - - GridBase *grid = u._grid; - LatticeReal xi0(grid), u2(grid), w2(grid), cosw(grid), tmp(grid); - LatticeComplex fden(grid); - LatticeComplex h0(grid), h1(grid), h2(grid); - LatticeComplex e2iu(grid), emiu(grid), ixi0(grid), qt(grid); - - xi0 = func_xi0(w); - u2 = u * u; - w2 = w * w; - cosw = cos(w); - - ixi0 = timesI(toComplex(xi0)); - emiu = toComplex(cos(u)) - timesI(toComplex(sin(u))); - e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(sin(2.0*u))); - - h0 = e2iu * toComplex(u2 - w2) + emiu *( toComplex(8.0*u2*cosw) + - toComplex(2.0*u*(3.0*u2 + w2))*ixi0); - - h1 = toComplex(2.0*u) * e2iu - emiu*( toComplex(2.0*u*cosw) - - toComplex(3.0*u2-w2)*ixi0); - - h2 = e2iu - emiu * (toComplex(cosw) + toComplex(3.0*u)*ixi0); - - tmp = 9.0*u2 - w2; - fden = toComplex(pow(tmp, -1.0)); - f0 = h0 * fden; - f1 = h1 * fden; - f2 = h2 * fden; - - - } - - void set_fj_complex(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, const LatticeComplex& u, const LatticeComplex& w) const{ GridBase *grid = u._grid; @@ -212,47 +125,35 @@ LatticeComplex unity(grid); unity = 1.0; - xi0 = sin(w)/w;//func_xi0(w); - std::cout << "xi0 " << xi0 << std::endl; + xi0 = func_xi0(w); u2 = u * u; - std::cout << "u2 " << u2 << std::endl; w2 = w * w; - std::cout << "w2 " << w2 << std::endl; cosw = cos(w); - std::cout << "cosw " << cosw << std::endl; ixi0 = timesI(xi0); emiu = cos(u) - timesI(sin(u)); e2iu = cos(2.0*u) + timesI(sin(2.0*u)); - std::cout << "emiu " << emiu << std::endl; - std::cout << "e2iu " << e2iu << std::endl; h0 = e2iu * (u2 - w2) + emiu * ( (8.0*u2*cosw) + (2.0*u*(3.0*u2 + w2)*ixi0)); h1 = e2iu * (2.0 * u) - emiu * ( (2.0*u*cosw) - (3.0*u2-w2)*ixi0); h2 = e2iu - emiu * ( cosw + (3.0*u)*ixi0); - std::cout << "h0 " << h0 << std::endl; - std::cout << "h1 " << h1 << std::endl; - std::cout << "h2 " << h2 << std::endl; - fden = unity/(9.0*u2 - w2);// reals - std::cout << "fden " << fden << std::endl; f0 = h0 * fden; f1 = h1 * fden; f2 = h2 * fden; - } - LatticeReal func_xi0(const LatticeReal& w) const{ + LatticeComplex func_xi0(const LatticeComplex& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning<< "[Smear_stout] w too small: "<< w <<"\n"; return sin(w)/w; } - LatticeReal func_xi1(const LatticeReal& w) const{ + LatticeComplex func_xi1(const LatticeComplex& w) const{ // Define a function to do the check //if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: "<< w <<"\n"; return cos(w)/(w*w) - sin(w)/(w*w*w); From cd8ee270807ef603020543dd869bbf3fc8a4aeae Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 4 Jul 2016 16:02:57 +0100 Subject: [PATCH 15/34] Simple change in iGamma for smearing --- lib/qcd/smearing/GaugeConfiguration.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/qcd/smearing/GaugeConfiguration.h b/lib/qcd/smearing/GaugeConfiguration.h index 369eed72..d9b3402f 100644 --- a/lib/qcd/smearing/GaugeConfiguration.h +++ b/lib/qcd/smearing/GaugeConfiguration.h @@ -177,13 +177,13 @@ void set_iLambda(GaugeLinkField& iLambda, tr1 = trace(USigmap*B1); tr2 = trace(USigmap*B2); - GaugeLinkField QUS = timesMinusI(iQ) * USigmap; - GaugeLinkField USQ = USigmap * timesMinusI(iQ); + GaugeLinkField QUS = iQ * USigmap; + GaugeLinkField USQ = USigmap * iQ; - GaugeLinkField iGamma = tr1 * timesMinusI(iQ) - tr2 * iQ2 + - f1 * USigmap + f2 * QUS + f2 * USQ; + GaugeLinkField iGamma = tr1 * iQ - timesI(tr2) * iQ2 + + timesI(f1) * USigmap + f2 * QUS + f2 * USQ; - iLambda = Ta(timesI(iGamma)); + iLambda = Ta(iGamma); } From 149f8266014394746dcac0cbf57799ce724eb968 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 4 Jul 2016 16:09:19 +0100 Subject: [PATCH 16/34] Tested smearing for Nf2 WilsonFermionAction, non EO: accepts --- lib/qcd/action/pseudofermion/TwoFlavour.h | 2 +- tests/Test_hmc_EOWilsonFermionGauge.cc | 1 + tests/Test_hmc_WilsonFermionGauge.cc | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/qcd/action/pseudofermion/TwoFlavour.h b/lib/qcd/action/pseudofermion/TwoFlavour.h index 433cf294..21d23853 100644 --- a/lib/qcd/action/pseudofermion/TwoFlavour.h +++ b/lib/qcd/action/pseudofermion/TwoFlavour.h @@ -137,7 +137,7 @@ namespace Grid{ FermOp.MDeriv(tmp , Y, X,DaggerNo ); dSdU=tmp; FermOp.MDeriv(tmp , X, Y,DaggerYes); dSdU=dSdU+tmp; - dSdU = Ta(dSdU); + //dSdU = Ta(dSdU); }; diff --git a/tests/Test_hmc_EOWilsonFermionGauge.cc b/tests/Test_hmc_EOWilsonFermionGauge.cc index d9634666..6065884a 100644 --- a/tests/Test_hmc_EOWilsonFermionGauge.cc +++ b/tests/Test_hmc_EOWilsonFermionGauge.cc @@ -66,6 +66,7 @@ public: TwoFlavourEvenOddPseudoFermionAction Nf2(FermOp,CG,CG); + //Set smearing (true/false), default: false Nf2.is_smeared=true; //Collect actions diff --git a/tests/Test_hmc_WilsonFermionGauge.cc b/tests/Test_hmc_WilsonFermionGauge.cc index 21200a6a..a6fc7ae2 100644 --- a/tests/Test_hmc_WilsonFermionGauge.cc +++ b/tests/Test_hmc_WilsonFermionGauge.cc @@ -67,6 +67,10 @@ public: TwoFlavourPseudoFermionAction Nf2(FermOp,CG,CG); + //Set smearing (true/false), default: false + Nf2.is_smeared = true; + + //Collect actions ActionLevel Level1(1); Level1.push_back(&Nf2); From 2daffdf95d5695dda8b6b5af5f052042ffa03076 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 4 Jul 2016 16:17:28 +0100 Subject: [PATCH 17/34] Tested smeared WilsonRatio action, accepts --- lib/qcd/action/pseudofermion/TwoFlavourRatio.h | 3 ++- tests/Test_hmc_WilsonRatio.cc | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/qcd/action/pseudofermion/TwoFlavourRatio.h b/lib/qcd/action/pseudofermion/TwoFlavourRatio.h index 8a28f3b0..26d21094 100644 --- a/lib/qcd/action/pseudofermion/TwoFlavourRatio.h +++ b/lib/qcd/action/pseudofermion/TwoFlavourRatio.h @@ -155,7 +155,8 @@ namespace Grid{ DenOp.MDeriv(force,Y,X,DaggerNo); dSdU=dSdU-force; DenOp.MDeriv(force,X,Y,DaggerYes); dSdU=dSdU-force; - dSdU = - Ta(dSdU); + dSdU *= -1.0; + //dSdU = - Ta(dSdU); }; }; diff --git a/tests/Test_hmc_WilsonRatio.cc b/tests/Test_hmc_WilsonRatio.cc index 000a8913..098d5a06 100644 --- a/tests/Test_hmc_WilsonRatio.cc +++ b/tests/Test_hmc_WilsonRatio.cc @@ -65,6 +65,9 @@ public: ConjugateGradient CG(1.0e-8,10000); TwoFlavourRatioPseudoFermionAction Nf2(NumOp, DenOp,CG,CG); + + //Set smearing (true/false), default: false + Nf2.is_smeared=true; //Collect actions ActionLevel Level1; From 17ca5240f7f5102790ce4a548198f84554bce88f Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 4 Jul 2016 16:25:15 +0100 Subject: [PATCH 18/34] Testet smeared EOWilsonRatio, accepts --- tests/Test_hmc_EOWilsonRatio.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Test_hmc_EOWilsonRatio.cc b/tests/Test_hmc_EOWilsonRatio.cc index e8723d06..d4c44e29 100644 --- a/tests/Test_hmc_EOWilsonRatio.cc +++ b/tests/Test_hmc_EOWilsonRatio.cc @@ -66,6 +66,9 @@ public: ConjugateGradient CG(1.0e-8,10000); TwoFlavourEvenOddRatioPseudoFermionAction Nf2(NumOp, DenOp,CG,CG); + //Set smearing (true/false), default: false + Nf2.is_smeared=true; + //Collect actions ActionLevel Level1; Level1.push_back(&Nf2); From 6ce174cd6099995b28350d6f62f80c32970129f7 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 4 Jul 2016 16:36:49 +0100 Subject: [PATCH 19/34] Testing smearing for RHMC routines --- tests/Test_rhmc_Wilson1p1.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Test_rhmc_Wilson1p1.cc b/tests/Test_rhmc_Wilson1p1.cc index 60306412..8f8bddb4 100644 --- a/tests/Test_rhmc_Wilson1p1.cc +++ b/tests/Test_rhmc_Wilson1p1.cc @@ -66,6 +66,10 @@ public: OneFlavourRationalPseudoFermionAction WilsonNf1a(FermOp,Params); OneFlavourRationalPseudoFermionAction WilsonNf1b(FermOp,Params); + //Set smearing (true/false), default: false + WilsonNf1a.is_smeared=false; + WilsonNf1b.is_smeared=false; + //Collect actions ActionLevel Level1; Level1.push_back(&WilsonNf1a); From 3e80947c2bb61bf71002a84430d3384819d9cda3 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 5 Jul 2016 12:03:54 +0100 Subject: [PATCH 20/34] Cleaned up HMC output. Tested smeared HMCs for single precision (OK) --- lib/Log.cc | 101 ++-- lib/Log.h | 7 +- lib/qcd/action/gauge/GaugeImpl.h | 331 +++++++------ lib/qcd/hmc/HMC.h | 348 +++++++------ lib/qcd/hmc/HmcRunner.h | 17 +- lib/qcd/utils/WilsonLoops.h | 821 ++++++++++++++++--------------- 6 files changed, 838 insertions(+), 787 deletions(-) diff --git a/lib/Log.cc b/lib/Log.cc index 438d2c97..02d2942d 100644 --- a/lib/Log.cc +++ b/lib/Log.cc @@ -1,51 +1,51 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/Log.cc +Source file: ./lib/Log.cc - Copyright (C) 2015 +Copyright (C) 2015 Author: Antonin Portelli Author: Azusa Yamaguchi 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #include namespace Grid { - - GridStopWatch Logger::StopWatch; - std::ostream Logger::devnull(0); - - Colours GridLogColours (0); - GridLogger GridLogError (1,"Error",GridLogColours, "RED"); - GridLogger GridLogWarning (1,"Warning",GridLogColours, "YELLOW"); - GridLogger GridLogMessage (1,"Message",GridLogColours, "NORMAL"); - GridLogger GridLogDebug (1,"Debug",GridLogColours, "PURPLE"); - GridLogger GridLogPerformance(1,"Performance",GridLogColours, "GREEN"); - GridLogger GridLogIterative (1,"Iterative",GridLogColours, "BLUE"); - GridLogger GridLogIntegrator (1,"Integrator",GridLogColours, "BLUE"); -void GridLogConfigure(std::vector &logstreams) -{ +GridStopWatch Logger::StopWatch; +std::ostream Logger::devnull(0); + +Colours GridLogColours(0); +GridLogger GridLogError(1, "Error", GridLogColours, "RED"); +GridLogger GridLogWarning(1, "Warning", GridLogColours, "YELLOW"); +GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL"); +GridLogger GridLogDebug(1, "Debug", GridLogColours, "PURPLE"); +GridLogger GridLogPerformance(1, "Performance", GridLogColours, "GREEN"); +GridLogger GridLogIterative(1, "Iterative", GridLogColours, "BLUE"); +GridLogger GridLogIntegrator(1, "Integrator", GridLogColours, "BLUE"); + +void GridLogConfigure(std::vector &logstreams) { GridLogError.Active(0); GridLogWarning.Active(0); GridLogMessage.Active(0); @@ -55,43 +55,38 @@ void GridLogConfigure(std::vector &logstreams) GridLogIntegrator.Active(0); GridLogColours.Active(0); - for(int i=0;i -Author: Azusa Yamaguchi -Author: Peter Boyle + Author: Antonin Portelli + 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 @@ -49,7 +49,6 @@ protected: public: std::map colour; - Colours(bool activate=false){ Active(activate); }; diff --git a/lib/qcd/action/gauge/GaugeImpl.h b/lib/qcd/action/gauge/GaugeImpl.h index 19e2f6da..691d25f1 100644 --- a/lib/qcd/action/gauge/GaugeImpl.h +++ b/lib/qcd/action/gauge/GaugeImpl.h @@ -1,189 +1,188 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/qcd/action/gauge/GaugeImpl.h +Source file: ./lib/qcd/action/gauge/GaugeImpl.h - Copyright (C) 2015 +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 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. +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. +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_GAUGE_IMPL_H -#define GRID_QCD_GAUGE_IMPL_H +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#ifndef GRID_QCD_GAUGE_IMPL_H +#define GRID_QCD_GAUGE_IMPL_H namespace Grid { - namespace QCD { +namespace QCD { - - //////////////////////////////////////////////////////////////////////// - // Implementation dependent gauge types - //////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +// Implementation dependent gauge types +//////////////////////////////////////////////////////////////////////// -template class WilsonLoops; +template class WilsonLoops; -#define INHERIT_GIMPL_TYPES(GImpl) \ - typedef typename GImpl::Simd Simd;\ - typedef typename GImpl::GaugeLinkField GaugeLinkField;\ - typedef typename GImpl::GaugeField GaugeField;\ - typedef typename GImpl::SiteGaugeField SiteGaugeField;\ - typedef typename GImpl::SiteGaugeLink SiteGaugeLink; +#define INHERIT_GIMPL_TYPES(GImpl) \ + typedef typename GImpl::Simd Simd; \ + typedef typename GImpl::GaugeLinkField GaugeLinkField; \ + typedef typename GImpl::GaugeField GaugeField; \ + typedef typename GImpl::SiteGaugeField SiteGaugeField; \ + typedef typename GImpl::SiteGaugeLink SiteGaugeLink; - // - template - class GaugeImplTypes { - public: - - typedef S Simd; - - template using iImplGaugeLink = iScalar > >; - template using iImplGaugeField = iVector >, Nd >; - - typedef iImplGaugeLink SiteGaugeLink; - typedef iImplGaugeField SiteGaugeField; - - typedef Lattice GaugeLinkField; // bit ugly naming; polarised gauge field, lorentz... all ugly - typedef Lattice GaugeField; +// +template class GaugeImplTypes { +public: + typedef S Simd; - // Move this elsewhere? - static inline void AddGaugeLink(GaugeField& U, GaugeLinkField& W, int mu){ // U[mu] += W + template + using iImplGaugeLink = iScalar>>; + template + using iImplGaugeField = iVector>, Nd>; + + typedef iImplGaugeLink SiteGaugeLink; + typedef iImplGaugeField SiteGaugeField; + + typedef Lattice GaugeLinkField; // bit ugly naming; polarised + // gauge field, lorentz... all + // ugly + typedef Lattice GaugeField; + + // Move this elsewhere? + static inline void AddGaugeLink(GaugeField &U, GaugeLinkField &W, + int mu) { // U[mu] += W PARALLEL_FOR_LOOP - for(auto ss=0;ssoSites();ss++){ - U._odata[ss]._internal[mu] = U._odata[ss]._internal[mu] + W._odata[ss]._internal; - } + for (auto ss = 0; ss < U._grid->oSites(); ss++) { + U._odata[ss]._internal[mu] = + U._odata[ss]._internal[mu] + W._odata[ss]._internal; } - - - }; - - // Composition with smeared link, bc's etc.. probably need multiple inheritance - // Variable precision "S" and variable Nc - template - class PeriodicGaugeImpl : public GimplTypes { - public: - - INHERIT_GIMPL_TYPES(GimplTypes); - - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Support needed for the assembly of loops including all boundary condition effects such as conjugate bcs - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - - template static inline - Lattice CovShiftForward (const GaugeLinkField &Link, int mu, const Lattice &field) { - return PeriodicBC::CovShiftForward(Link,mu,field); - } - - template static inline - Lattice CovShiftBackward(const GaugeLinkField &Link, int mu,const Lattice &field) { - return PeriodicBC::CovShiftBackward(Link,mu,field); - } - static inline - GaugeLinkField CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { - return Cshift(adj(Link),mu,-1); - } - static inline - GaugeLinkField CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { - return Link; - } - static inline - GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { - return Cshift(Link,mu,1); - } - - static inline bool isPeriodicGaugeField(void) { - return true; - } - - }; - - - // Composition with smeared link, bc's etc.. probably need multiple inheritance - // Variable precision "S" and variable Nc - template - class ConjugateGaugeImpl : public GimplTypes { - public: - - INHERIT_GIMPL_TYPES(GimplTypes); - - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Support needed for the assembly of loops including all boundary condition effects such as Gparity. - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - template static - Lattice CovShiftForward (const GaugeLinkField &Link, int mu, const Lattice &field) { - return ConjugateBC::CovShiftForward(Link,mu,field); - } - - template static - Lattice CovShiftBackward(const GaugeLinkField &Link, int mu,const Lattice &field) { - return ConjugateBC::CovShiftBackward(Link,mu,field); - } - - static inline - GaugeLinkField CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { - GridBase *grid = Link._grid; - int Lmu = grid->GlobalDimensions()[mu]-1; - - Lattice > coor(grid); LatticeCoordinate(coor,mu); - - GaugeLinkField tmp (grid); - tmp=adj(Link); - tmp = where(coor==Lmu,conjugate(tmp),tmp); - return Cshift(tmp,mu,-1);// moves towards positive mu - } - static inline - GaugeLinkField CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { - return Link; - } - - static inline - GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { - GridBase *grid = Link._grid; - int Lmu = grid->GlobalDimensions()[mu]-1; - - Lattice > coor(grid); LatticeCoordinate(coor,mu); - - GaugeLinkField tmp (grid); - tmp=Cshift(Link,mu,1); - tmp=where(coor==Lmu,conjugate(tmp),tmp); - return tmp; - } - - static inline bool isPeriodicGaugeField(void) { - return false; - } - - }; - - typedef GaugeImplTypes GimplTypesR; - typedef GaugeImplTypes GimplTypesF; - typedef GaugeImplTypes GimplTypesD; - - typedef PeriodicGaugeImpl PeriodicGimplR; // Real.. whichever prec - typedef PeriodicGaugeImpl PeriodicGimplF; // Float - typedef PeriodicGaugeImpl PeriodicGimplD; // Double - - typedef ConjugateGaugeImpl ConjugateGimplR; // Real.. whichever prec - typedef ConjugateGaugeImpl ConjugateGimplF; // Float - typedef ConjugateGaugeImpl ConjugateGimplD; // Double - } +}; + +// Composition with smeared link, bc's etc.. probably need multiple inheritance +// Variable precision "S" and variable Nc +template class PeriodicGaugeImpl : public GimplTypes { +public: + INHERIT_GIMPL_TYPES(GimplTypes); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Support needed for the assembly of loops including all boundary condition + // effects such as conjugate bcs + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + + template + static inline Lattice + CovShiftForward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return PeriodicBC::CovShiftForward(Link, mu, field); + } + + template + static inline Lattice + CovShiftBackward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return PeriodicBC::CovShiftBackward(Link, mu, field); + } + static inline GaugeLinkField + CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { + return Cshift(adj(Link), mu, -1); + } + static inline GaugeLinkField + CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { + return Link; + } + static inline GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { + return Cshift(Link, mu, 1); + } + + static inline bool isPeriodicGaugeField(void) { return true; } +}; + +// Composition with smeared link, bc's etc.. probably need multiple inheritance +// Variable precision "S" and variable Nc +template class ConjugateGaugeImpl : public GimplTypes { +public: + INHERIT_GIMPL_TYPES(GimplTypes); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Support needed for the assembly of loops including all boundary condition + // effects such as Gparity. + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + template + static Lattice CovShiftForward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return ConjugateBC::CovShiftForward(Link, mu, field); + } + + template + static Lattice CovShiftBackward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return ConjugateBC::CovShiftBackward(Link, mu, field); + } + + static inline GaugeLinkField + CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { + GridBase *grid = Link._grid; + int Lmu = grid->GlobalDimensions()[mu] - 1; + + Lattice> coor(grid); + LatticeCoordinate(coor, mu); + + GaugeLinkField tmp(grid); + tmp = adj(Link); + tmp = where(coor == Lmu, conjugate(tmp), tmp); + return Cshift(tmp, mu, -1); // moves towards positive mu + } + static inline GaugeLinkField + CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { + return Link; + } + + static inline GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { + GridBase *grid = Link._grid; + int Lmu = grid->GlobalDimensions()[mu] - 1; + + Lattice> coor(grid); + LatticeCoordinate(coor, mu); + + GaugeLinkField tmp(grid); + tmp = Cshift(Link, mu, 1); + tmp = where(coor == Lmu, conjugate(tmp), tmp); + return tmp; + } + + static inline bool isPeriodicGaugeField(void) { return false; } +}; + +typedef GaugeImplTypes GimplTypesR; +typedef GaugeImplTypes GimplTypesF; +typedef GaugeImplTypes GimplTypesD; + +typedef PeriodicGaugeImpl PeriodicGimplR; // Real.. whichever prec +typedef PeriodicGaugeImpl PeriodicGimplF; // Float +typedef PeriodicGaugeImpl PeriodicGimplD; // Double + +typedef ConjugateGaugeImpl + ConjugateGimplR; // Real.. whichever prec +typedef ConjugateGaugeImpl ConjugateGimplF; // Float +typedef ConjugateGaugeImpl ConjugateGimplD; // Double +} } #endif diff --git a/lib/qcd/hmc/HMC.h b/lib/qcd/hmc/HMC.h index b471eb3a..05838349 100644 --- a/lib/qcd/hmc/HMC.h +++ b/lib/qcd/hmc/HMC.h @@ -1,33 +1,34 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/qcd/hmc/HMC.h +Source file: ./lib/qcd/hmc/HMC.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ //-------------------------------------------------------------------- /*! @file HMC.h * @brief Classes for Hybrid Monte Carlo update @@ -41,172 +42,195 @@ Author: paboyle #include +namespace Grid { +namespace QCD { -namespace Grid{ - namespace QCD{ - +struct HMCparameters { + Integer StartTrajectory; + Integer Trajectories; /* @brief Number of sweeps in this run */ + bool MetropolisTest; + Integer NoMetropolisUntil; - struct HMCparameters{ + HMCparameters() { + ////////////////////////////// Default values + MetropolisTest = true; + NoMetropolisUntil = 10; + StartTrajectory = 0; + Trajectories = 200; + ///////////////////////////////// + } - Integer StartTrajectory; - Integer Trajectories; /* @brief Number of sweeps in this run */ - bool MetropolisTest; - Integer NoMetropolisUntil; + void print() const { + std::cout << GridLogMessage << "[HMC parameter] Trajectories : " << Trajectories << "\n"; + std::cout << GridLogMessage << "[HMC parameter] Start trajectory : " << StartTrajectory << "\n"; + std::cout << GridLogMessage << "[HMC parameter] Metropolis test (on/off): " << MetropolisTest << "\n"; + std::cout << GridLogMessage << "[HMC parameter] Thermalization trajs : " << NoMetropolisUntil << "\n"; + } + +}; - HMCparameters(){ - ////////////////////////////// Default values - MetropolisTest = true; - NoMetropolisUntil = 10; - StartTrajectory = 0; - Trajectories = 200; - ///////////////////////////////// - } - }; +template +class HmcObservable { + public: + virtual void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG, + GridParallelRNG &pRNG) = 0; +}; - template - class HmcObservable { - public: - virtual void TrajectoryComplete (int traj, GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG & pRNG )=0; - }; +template +class PlaquetteLogger : public HmcObservable { + private: + std::string Stem; - template - class PlaquetteLogger : public HmcObservable { - private: - std::string Stem; - public: - INHERIT_GIMPL_TYPES(Gimpl); - PlaquetteLogger(std::string cf) { - Stem = cf; - }; + public: + INHERIT_GIMPL_TYPES(Gimpl); + PlaquetteLogger(std::string cf) { Stem = cf; }; - void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG & pRNG ) - { - std::string file; { std::ostringstream os; os << Stem <<"."<< traj; file = os.str(); } - std::ofstream of(file); + void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG, + GridParallelRNG &pRNG) { + std::string file; + { + std::ostringstream os; + os << Stem << "." << traj; + file = os.str(); + } + std::ofstream of(file); - RealD peri_plaq = WilsonLoops::avgPlaquette(U); - RealD peri_rect = WilsonLoops::avgRectangle(U); + RealD peri_plaq = WilsonLoops::avgPlaquette(U); + RealD peri_rect = WilsonLoops::avgRectangle(U); - RealD impl_plaq = WilsonLoops::avgPlaquette(U); - RealD impl_rect = WilsonLoops::avgRectangle(U); + RealD impl_plaq = WilsonLoops::avgPlaquette(U); + RealD impl_rect = WilsonLoops::avgRectangle(U); - of << traj<<" "<< impl_plaq << " " << impl_rect << " "<< peri_plaq<<" "< - template - class HybridMonteCarlo { - private: +// template +template +class HybridMonteCarlo { + private: + const HMCparameters Params; - const HMCparameters Params; - - GridSerialRNG &sRNG; // Fixme: need a RNG management strategy. - GridParallelRNG &pRNG; // Fixme: need a RNG management strategy. - GaugeField & Ucur; + GridSerialRNG &sRNG; // Fixme: need a RNG management strategy. + GridParallelRNG &pRNG; // Fixme: need a RNG management strategy. + GaugeField &Ucur; - IntegratorType &TheIntegrator; - std::vector *> Observables; + IntegratorType &TheIntegrator; + std::vector *> Observables; - ///////////////////////////////////////////////////////// - // Metropolis step - ///////////////////////////////////////////////////////// - bool metropolis_test(const RealD DeltaH){ + ///////////////////////////////////////////////////////// + // Metropolis step + ///////////////////////////////////////////////////////// + bool metropolis_test(const RealD DeltaH) { + RealD rn_test; - RealD rn_test; + RealD prob = std::exp(-DeltaH); - RealD prob = std::exp(-DeltaH); + random(sRNG, rn_test); - random(sRNG,rn_test); - - std::cout<1.0) || (rn_test <= prob)){ // accepted - std::cout< 1.0) || (rn_test <= prob)) { // accepted + std::cout << GridLogMessage << "Metropolis_test -- ACCEPTED\n"; + std::cout << GridLogMessage + << "--------------------------------------------------\n"; + return true; + } else { // rejected + std::cout << GridLogMessage << "Metropolis_test -- REJECTED\n"; + std::cout << GridLogMessage + << "--------------------------------------------------\n"; + return false; + } + } + + ///////////////////////////////////////////////////////// + // Evolution + ///////////////////////////////////////////////////////// + RealD evolve_step(GaugeField &U) { + TheIntegrator.refresh(U, pRNG); // set U and initialize P and phi's + + RealD H0 = TheIntegrator.S(U); // initial state action + + std::streamsize current_precision = std::cout.precision(); + std::cout.precision(17); + std::cout << GridLogMessage << "Total H before trajectory = " << H0 << "\n"; + std::cout.precision(current_precision); + + TheIntegrator.integrate(U); + + RealD H1 = TheIntegrator.S(U); // updated state action + + std::cout.precision(17); + std::cout << GridLogMessage << "Total H after trajectory = " << H1 + << " dH = " << H1 - H0 << "\n"; + std::cout.precision(current_precision); + + return (H1 - H0); + } + + public: + ///////////////////////////////////////// + // Constructor + ///////////////////////////////////////// + HybridMonteCarlo(HMCparameters Pams, IntegratorType &_Int, + GridSerialRNG &_sRNG, GridParallelRNG &_pRNG, GaugeField &_U) + : Params(Pams), TheIntegrator(_Int), sRNG(_sRNG), pRNG(_pRNG), Ucur(_U) {} + ~HybridMonteCarlo(){}; + + void AddObservable(HmcObservable *obs) { + Observables.push_back(obs); + } + + void evolve(void) { + Real DeltaH; + + GaugeField Ucopy(Ucur._grid); + + Params.print(); + + // Actual updates (evolve a copy Ucopy then copy back eventually) + for (int traj = Params.StartTrajectory; + traj < Params.Trajectories + Params.StartTrajectory; ++traj) { + std::cout << GridLogMessage << "-- # Trajectory = " << traj << "\n"; + Ucopy = Ucur; + + DeltaH = evolve_step(Ucopy); + + bool accept = true; + if (traj >= Params.NoMetropolisUntil) { + accept = metropolis_test(DeltaH); } - ///////////////////////////////////////////////////////// - // Evolution - ///////////////////////////////////////////////////////// - RealD evolve_step(GaugeField& U){ - - TheIntegrator.refresh(U,pRNG); // set U and initialize P and phi's - - RealD H0 = TheIntegrator.S(U); // initial state action - - std::cout< *obs) { - Observables.push_back(obs); + if (accept) { + Ucur = Ucopy; } - void evolve(void){ - - Real DeltaH; - - GaugeField Ucopy(Ucur._grid); - - // Actual updates (evolve a copy Ucopy then copy back eventually) - for(int traj=Params.StartTrajectory; traj < Params.Trajectories+Params.StartTrajectory; ++traj){ - - std::cout< Params.NoMetropolisUntil) { - accept = metropolis_test(DeltaH); - } - - if ( accept ) { - Ucur = Ucopy; - } - - for(int obs = 0;obsTrajectoryComplete (traj+1,Ucur,sRNG,pRNG); - } - - } + for (int obs = 0; obs < Observables.size(); obs++) { + Observables[obs]->TrajectoryComplete(traj + 1, Ucur, sRNG, pRNG); } - }; - - }// QCD -}// Grid + } + } +}; +} // QCD +} // Grid -#endif +#endif diff --git a/lib/qcd/hmc/HmcRunner.h b/lib/qcd/hmc/HmcRunner.h index 17e3b443..5616582f 100644 --- a/lib/qcd/hmc/HmcRunner.h +++ b/lib/qcd/hmc/HmcRunner.h @@ -81,6 +81,14 @@ public: NumTraj = ivec[0]; } + int NumThermalizations = 10; + if( GridCmdOptionExists(argv,argv+argc,"--Thermalizations") ){ + arg= GridCmdOptionPayload(argv,argv+argc,"--Thermalizations"); + std::vector ivec(0); + GridCmdOptionIntVector(arg,ivec); + NumThermalizations = ivec[0]; + } + GridSerialRNG sRNG; GridParallelRNG pRNG(UGrid); @@ -110,33 +118,30 @@ public: PlaquetteLogger PlaqLog(std::string("plaq")); HMCparameters HMCpar; - HMCpar.StartTrajectory = StartTraj; - HMCpar.Trajectories = NumTraj; + HMCpar.StartTrajectory = StartTraj; + HMCpar.Trajectories = NumTraj; + HMCpar.NoMetropolisUntil = NumThermalizations; if ( StartType == HotStart ) { // Hot start - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; sRNG.SeedFixedIntegers(SerSeed); pRNG.SeedFixedIntegers(ParSeed); SU3::HotConfiguration(pRNG, U); } else if ( StartType == ColdStart ) { // Cold start - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; sRNG.SeedFixedIntegers(SerSeed); pRNG.SeedFixedIntegers(ParSeed); SU3::ColdConfiguration(pRNG, U); } else if ( StartType == TepidStart ) { // Tepid start - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; sRNG.SeedFixedIntegers(SerSeed); pRNG.SeedFixedIntegers(ParSeed); SU3::TepidConfiguration(pRNG, U); } else if ( StartType == CheckpointStart ) { - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; // CheckpointRestart Checkpoint.CheckpointRestore(StartTraj, U, sRNG, pRNG); diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index 55fd5b7e..10022f50 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -1,6 +1,6 @@ /************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid + Grid physics library, www.github.com/paboyle/Grid Source file: ./lib/qcd/utils/WilsonLoops.h @@ -25,472 +25,501 @@ Author: paboyle 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 + See the full license in the file "LICENSE" in the top level distribution +directory *************************************************************************************/ /* END LEGAL */ #ifndef QCD_UTILS_WILSON_LOOPS_H #define QCD_UTILS_WILSON_LOOPS_H namespace Grid { - namespace QCD { - - // Common wilson loop observables - template - class WilsonLoops : 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(4,Umu._grid); - - for(int mu=0;mu(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 RealD avgPlaquette(const GaugeLorentz &Umu){ - RealD sumplaq = sumPlaquette(Umu); - double vol = Umu._grid->gSites(); - double faces = (1.0*Nd*(Nd-1))/2.0; - return sumplaq/vol/faces/Nc; // Nd , Nc dependent... FIXME - } +namespace QCD { - ////////////////////////////////////////////////// - // average over traced single links - ////////////////////////////////////////////////// - static RealD linkTrace(const GaugeLorentz &Umu){ - std::vector U(4,Umu._grid); - - LatticeComplex Tr(Umu._grid); Tr=zero; - for(int mu=0;mu(Umu,mu); - Tr = Tr+trace(U[mu]); - } - - TComplex Tp = sum(Tr); - Complex p = TensorRemove(Tp); - - double vol = Umu._grid->gSites(); - - return p.real()/vol/4.0/3.0; - }; - - ////////////////////////////////////////////////// - // the sum over all staples on each site in direction mu,nu - ////////////////////////////////////////////////// - static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu, int nu){ +// Common wilson loop observables +template class WilsonLoops : public Gimpl { +public: + INHERIT_GIMPL_TYPES(Gimpl); - GridBase *grid = Umu._grid; - - std::vector U(4,grid); - for(int d=0;d(Umu,d); - } - staple = zero; - - - if(nu != mu) { - - // mu - // ^ - // |__> nu - - // __ - // | - // __| - // + typedef typename Gimpl::GaugeLinkField GaugeMat; + typedef typename Gimpl::GaugeField GaugeLorentz; - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftForward (U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); - - // __ - // | - // |__ - // - // - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftBackward(U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); - - } - } - -////////////////////////////////////////////////// -// the sum over all staples on each site -////////////////////////////////////////////////// - static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu){ - - GridBase *grid = Umu._grid; - - std::vector U(Nd,grid); - for(int d=0;d(Umu,d); - } - staple = zero; - GaugeMat tmp(grid); - - - for(int nu=0;nu nu - - // __ - // | - // __| - // - - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftForward (U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); - - // __ - // | - // |__ - // - // - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftBackward(U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); - } - } + ////////////////////////////////////////////////// + // 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]))); } - - - ////////////////////////////////////////////////// - // the sum over all staples on each site in direction mu,nu, upper part - ////////////////////////////////////////////////// - static void StapleUpper(GaugeMat &staple,const GaugeLorentz &Umu,int mu, int nu){ - - staple = zero; - - if(nu != mu) { - GridBase *grid = Umu._grid; - - std::vector U(4,grid); - for(int d=0;d(Umu,d); - } - - // mu - // ^ - // |__> nu - - // __ - // | - // __| - // - - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftForward (U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); - - } - } - - - - - - ////////////////////////////////////////////////////// - // Similar to above for rectangle is required - ////////////////////////////////////////////////////// - static void dirRectangle(GaugeMat &rect,const std::vector &U, const int mu, const int nu) - { - rect = Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[mu],mu,U[nu]))* // ->->| - adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[mu],mu,U[mu]))) ; - rect = rect + - Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[nu],nu,U[nu]))* // ->|| - adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[nu],nu,U[mu]))) ; - } - static void traceDirRectangle(LatticeComplex &rect, const std::vector &U, const int mu, const int 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); - dirRectangle(sp,U,mu,nu); - rect=trace(sp); + dirPlaquette(sp, U, mu, nu); + plaq = trace(sp); } - static void siteRectangle(LatticeComplex &Rect,const std::vector &U) - { - LatticeComplex siteRect(U[0]._grid); - Rect=zero; - for(int mu=1;mu &U) { + LatticeComplex sitePlaq(U[0]._grid); + Plaq = zero; + for (int mu = 1; mu < Nd; 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 RealD sumRectangle(const GaugeLorentz &Umu){ - std::vector U(Nd,Umu._grid); + static RealD sumPlaquette(const GaugeLorentz &Umu) { + std::vector U(4, Umu._grid); - for(int mu=0;mu(Umu,mu); + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); } - LatticeComplex Rect(Umu._grid); - - siteRectangle(Rect,U); - - TComplex Tp = sum(Rect); - Complex p = TensorRemove(Tp); + 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 RealD avgRectangle(const GaugeLorentz &Umu){ - - RealD sumrect = sumRectangle(Umu); - + static RealD avgPlaquette(const GaugeLorentz &Umu) { + RealD sumplaq = sumPlaquette(Umu); double vol = Umu._grid->gSites(); - - double faces = (1.0*Nd*(Nd-1)); // 2 distinct orientations summed - - return sumrect/vol/faces/Nc; // Nd , Nc dependent... FIXME + double faces = (1.0 * Nd * (Nd - 1)) / 2.0; + return sumplaq / vol / faces / Nc; // Nd , Nc dependent... FIXME + } + + ////////////////////////////////////////////////// + // average over traced single links + ////////////////////////////////////////////////// + static RealD linkTrace(const GaugeLorentz &Umu) { + std::vector U(4, Umu._grid); + + LatticeComplex Tr(Umu._grid); + Tr = zero; + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); + Tr = Tr + trace(U[mu]); + } + + TComplex Tp = sum(Tr); + Complex p = TensorRemove(Tp); + + double vol = Umu._grid->gSites(); + + return p.real() / vol / 4.0 / 3.0; + }; + + ////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu + ////////////////////////////////////////////////// + static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu, + int nu) { + + GridBase *grid = Umu._grid; + + std::vector U(4, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); + } + staple = zero; + + if (nu != mu) { + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // + + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftForward( + U[nu], nu, + Gimpl::CovShiftBackward( + U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))), + mu); + + // __ + // | + // |__ + // + // + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftBackward(U[nu], nu, + Gimpl::CovShiftBackward(U[mu], mu, U[nu])), + mu); + } } ////////////////////////////////////////////////// // the sum over all staples on each site ////////////////////////////////////////////////// - static void RectStapleDouble(GaugeMat &U2,const GaugeMat & U,int mu){ - U2 = U * Cshift(U,mu,1); + static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { + + GridBase *grid = Umu._grid; + + std::vector U(Nd, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); + } + staple = zero; + GaugeMat tmp(grid); + + for (int nu = 0; nu < Nd; nu++) { + + if (nu != mu) { + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // + + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftForward( + U[nu], nu, + Gimpl::CovShiftBackward( + U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))), + mu); + + // __ + // | + // |__ + // + // + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftBackward(U[nu], nu, + Gimpl::CovShiftBackward(U[mu], mu, U[nu])), + mu); + } + } + } + + ////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu, upper part + ////////////////////////////////////////////////// + static void StapleUpper(GaugeMat &staple, const GaugeLorentz &Umu, int mu, + int nu) { + + staple = zero; + + if (nu != mu) { + GridBase *grid = Umu._grid; + + std::vector U(4, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); + } + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // + + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftForward( + U[nu], nu, + Gimpl::CovShiftBackward( + U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))), + mu); + } + } + + ////////////////////////////////////////////////////// + // Similar to above for rectangle is required + ////////////////////////////////////////////////////// + static void dirRectangle(GaugeMat &rect, const std::vector &U, + const int mu, const int nu) { + rect = Gimpl::CovShiftForward( + U[mu], mu, Gimpl::CovShiftForward(U[mu], mu, U[nu])) * // ->->| + adj(Gimpl::CovShiftForward( + U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[mu]))); + rect = rect + + Gimpl::CovShiftForward( + U[mu], mu, Gimpl::CovShiftForward(U[nu], nu, U[nu])) * // ->|| + adj(Gimpl::CovShiftForward( + U[nu], nu, Gimpl::CovShiftForward(U[nu], nu, U[mu]))); + } + static void traceDirRectangle(LatticeComplex &rect, + const std::vector &U, const int mu, + const int nu) { + GaugeMat sp(U[0]._grid); + dirRectangle(sp, U, mu, nu); + rect = trace(sp); + } + static void siteRectangle(LatticeComplex &Rect, + const std::vector &U) { + LatticeComplex siteRect(U[0]._grid); + Rect = zero; + for (int mu = 1; mu < Nd; mu++) { + for (int nu = 0; nu < mu; nu++) { + traceDirRectangle(siteRect, U, mu, nu); + Rect = Rect + siteRect; + } + } + } + + ////////////////////////////////////////////////// + // sum over all x,y,z,t and over all planes of plaquette + ////////////////////////////////////////////////// + static RealD sumRectangle(const GaugeLorentz &Umu) { + std::vector U(Nd, Umu._grid); + + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); + } + + LatticeComplex Rect(Umu._grid); + + siteRectangle(Rect, U); + + TComplex Tp = sum(Rect); + Complex p = TensorRemove(Tp); + return p.real(); + } + ////////////////////////////////////////////////// + // average over all x,y,z,t and over all planes of plaquette + ////////////////////////////////////////////////// + static RealD avgRectangle(const GaugeLorentz &Umu) { + + RealD sumrect = sumRectangle(Umu); + + double vol = Umu._grid->gSites(); + + double faces = (1.0 * Nd * (Nd - 1)); // 2 distinct orientations summed + + return sumrect / vol / faces / Nc; // Nd , Nc dependent... FIXME + } + + ////////////////////////////////////////////////// + // the sum over all staples on each site + ////////////////////////////////////////////////// + static void RectStapleDouble(GaugeMat &U2, const GaugeMat &U, int mu) { + U2 = U * Cshift(U, mu, 1); } //////////////////////////////////////////////////////////////////////////// - // Hop by two optimisation strategy does not work nicely with Gparity. (could do, + // Hop by two optimisation strategy does not work nicely with Gparity. (could + // do, // but need to track two deep where cross boundary and apply a conjugation). - // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do so . + // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do + // so . //////////////////////////////////////////////////////////////////////////// - static void RectStapleOptimised(GaugeMat &Stap,std::vector &U2,std::vector &U,int mu){ + static void RectStapleOptimised(GaugeMat &Stap, std::vector &U2, + std::vector &U, int mu) { Stap = zero; GridBase *grid = U[0]._grid; - GaugeMat Staple2x1 (grid); - GaugeMat tmp (grid); + GaugeMat Staple2x1(grid); + GaugeMat tmp(grid); - for(int nu=0;nu &U2, - std::vector &U, int mu) - { - if ( Gimpl::isPeriodicGaugeField() ){ - RectStapleOptimised(Stap,U2,U,mu); - } else { - RectStapleUnoptimised(Stap,Umu,mu); + tmp = Gimpl::CovShiftBackward(U[mu], mu, U2[nu]); + tmp = adj(U2[nu]) * tmp; + tmp = Cshift(tmp, nu, -2); + Stap += Cshift(tmp, mu, 1); + } } } - static void RectStapleUnoptimised(GaugeMat &Stap,const GaugeLorentz &Umu,int mu){ + static void RectStaple(GaugeMat &Stap, const GaugeLorentz &Umu, int mu) { + RectStapleUnoptimised(Stap, Umu, mu); + } + static void RectStaple(const GaugeLorentz &Umu, GaugeMat &Stap, + std::vector &U2, std::vector &U, + int mu) { + if (Gimpl::isPeriodicGaugeField()) { + RectStapleOptimised(Stap, U2, U, mu); + } else { + RectStapleUnoptimised(Stap, Umu, mu); + } + } + + static void RectStapleUnoptimised(GaugeMat &Stap, const GaugeLorentz &Umu, + int mu) { GridBase *grid = Umu._grid; - std::vector U(Nd,grid); - for(int d=0;d(Umu,d); + std::vector U(Nd, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); } - Stap=zero; + Stap = zero; - for(int nu=0;nu ColourWilsonLoops; - typedef WilsonLoops U1WilsonLoops; - typedef WilsonLoops SU2WilsonLoops; - typedef WilsonLoops SU3WilsonLoops; - -}} +typedef WilsonLoops ColourWilsonLoops; +typedef WilsonLoops U1WilsonLoops; +typedef WilsonLoops SU2WilsonLoops; +typedef WilsonLoops SU3WilsonLoops; +} +} #endif \ No newline at end of file From 3e3b367aa9208b2cc36fe0564b77846cd590d4f3 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Tue, 5 Jul 2016 15:05:28 +0100 Subject: [PATCH 21/34] Small changes in the Log files --- lib/Log.cc | 4 ++-- lib/Log.h | 2 +- tests/Test_hmc_EOWilsonFermionGauge.cc | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Log.cc b/lib/Log.cc index 02d2942d..2082570d 100644 --- a/lib/Log.cc +++ b/lib/Log.cc @@ -48,7 +48,7 @@ GridLogger GridLogIntegrator(1, "Integrator", GridLogColours, "BLUE"); void GridLogConfigure(std::vector &logstreams) { GridLogError.Active(0); GridLogWarning.Active(0); - GridLogMessage.Active(0); + GridLogMessage.Active(1); // at least the messages should be always on GridLogIterative.Active(0); GridLogDebug.Active(0); GridLogPerformance.Active(0); @@ -58,7 +58,7 @@ void GridLogConfigure(std::vector &logstreams) { for (int i = 0; i < logstreams.size(); i++) { if (logstreams[i] == std::string("Error")) GridLogError.Active(1); if (logstreams[i] == std::string("Warning")) GridLogWarning.Active(1); - if (logstreams[i] == std::string("Message")) GridLogMessage.Active(1); + if (logstreams[i] == std::string("NoMessage")) GridLogMessage.Active(0); if (logstreams[i] == std::string("Iterative")) GridLogIterative.Active(1); if (logstreams[i] == std::string("Debug")) GridLogDebug.Active(1); if (logstreams[i] == std::string("Performance")) diff --git a/lib/Log.h b/lib/Log.h index 887c9750..156f52ee 100644 --- a/lib/Log.h +++ b/lib/Log.h @@ -116,7 +116,7 @@ public: GridTime now = StopWatch.Elapsed(); StopWatch.Start(); stream << log.background()<< log.topName << log.background()<< " : "; - stream << log.colour() < Nf2(FermOp,CG,CG); //Set smearing (true/false), default: false - Nf2.is_smeared=true; + Nf2.is_smeared=false; //Collect actions ActionLevel Level1(1); From e3d53194704ea052968379660c1e7589440e5a05 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 6 Jul 2016 14:16:03 +0100 Subject: [PATCH 22/34] Debugged the real() and imag() functions and added tests to Test_Simd --- lib/Simd.h | 45 +- lib/lattice/Lattice_reduction.h | 2 +- lib/qcd/smearing/StoutSmearing.h | 247 ++++--- lib/simd/Grid_vector_types.h | 1080 +++++++++++++++++------------- lib/simd/Grid_vector_unops.h | 415 ++++++------ tests/Test_simd.cc | 77 ++- 6 files changed, 999 insertions(+), 867 deletions(-) diff --git a/lib/Simd.h b/lib/Simd.h index de49cca7..6a812e5e 100644 --- a/lib/Simd.h +++ b/lib/Simd.h @@ -1,32 +1,33 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/Simd.h +Source file: ./lib/Simd.h - Copyright (C) 2015 +Copyright (C) 2015 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_SIMD_H #define GRID_SIMD_H @@ -118,6 +119,14 @@ namespace Grid { inline ComplexD timesI(const ComplexD &r) { return(r*ComplexD(0.0,1.0));} inline ComplexF timesMinusI(const ComplexF &r){ return(r*ComplexF(0.0,-1.0));} inline ComplexD timesMinusI(const ComplexD &r){ return(r*ComplexD(0.0,-1.0));} + + // define projections to real and imaginay parts + inline ComplexF projReal(const ComplexF &r){return( ComplexF(std::real(r), 0.0));} + inline ComplexD projReal(const ComplexD &r){return( ComplexD(std::real(r), 0.0));} + inline ComplexF projImag(const ComplexF &r){return (ComplexF(std::imag(r), 0.0 ));} + inline ComplexD projImag(const ComplexD &r){return (ComplexD(std::imag(r), 0.0));} + + // define auxiliary functions for complex computations inline void timesI(ComplexF &ret,const ComplexF &r) { ret = timesI(r);} inline void timesI(ComplexD &ret,const ComplexD &r) { ret = timesI(r);} inline void timesMinusI(ComplexF &ret,const ComplexF &r){ ret = timesMinusI(r);} diff --git a/lib/lattice/Lattice_reduction.h b/lib/lattice/Lattice_reduction.h index 4599f2f9..2615af48 100644 --- a/lib/lattice/Lattice_reduction.h +++ b/lib/lattice/Lattice_reduction.h @@ -40,7 +40,7 @@ namespace Grid { //////////////////////////////////////////////////////////////////////////////////////////////////// template inline RealD norm2(const Lattice &arg){ ComplexD nrm = innerProduct(arg,arg); - return real(nrm); + return std::real(nrm); } template diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h index 511a5c29..50a09972 100644 --- a/lib/qcd/smearing/StoutSmearing.h +++ b/lib/qcd/smearing/StoutSmearing.h @@ -5,163 +5,156 @@ #ifndef STOUT_SMEAR_ #define STOUT_SMEAR_ - namespace Grid { - namespace QCD { +namespace Grid { +namespace QCD { - /*! @brief Stout smearing of link variable. */ - template - class Smear_Stout: public Smear { - private: - const Smear < Gimpl > * SmearBase; +/*! @brief Stout smearing of link variable. */ +template +class Smear_Stout : public Smear { + private: + const Smear* SmearBase; - public: - INHERIT_GIMPL_TYPES(Gimpl) + public: + INHERIT_GIMPL_TYPES(Gimpl) - Smear_Stout(Smear < Gimpl >* base):SmearBase(base){ - static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); - } + Smear_Stout(Smear* base) : SmearBase(base) { + static_assert(Nc == 3, + "Stout smearing currently implemented only for Nc==3"); + } - /*! Default constructor */ - Smear_Stout(double rho = 1.0):SmearBase(new Smear_APE < Gimpl > (rho)){ - static_assert(Nc==3, "Stout smearing currently implemented only for Nc==3"); - } + /*! Default constructor */ + Smear_Stout(double rho = 1.0) : SmearBase(new Smear_APE(rho)) { + static_assert(Nc == 3, + "Stout smearing currently implemented only for Nc==3"); + } - ~Smear_Stout(){} //delete SmearBase... + ~Smear_Stout() {} // delete SmearBase... - void smear(GaugeField& u_smr,const GaugeField& U) const{ - GaugeField C(U._grid); - GaugeLinkField tmp(U._grid), iq_mu(U._grid), Umu(U._grid); + void smear(GaugeField& u_smr, const GaugeField& U) const { + GaugeField C(U._grid); + GaugeLinkField tmp(U._grid), iq_mu(U._grid), Umu(U._grid); - std::cout<< GridLogDebug << "Stout smearing started\n"; + std::cout << GridLogDebug << "Stout smearing started\n"; - //Smear the configurations - SmearBase->smear(C, U); + // Smear the configurations + SmearBase->smear(C, U); - for (int mu = 0; muderivative(SigmaTerm, iLambda, Gauge); + }; - void derivative(GaugeField& SigmaTerm, - const GaugeField& iLambda, - const GaugeField& Gauge) const{ - SmearBase->derivative(SigmaTerm, iLambda, Gauge); - }; + void BaseSmear(GaugeField& C, const GaugeField& U) const { + SmearBase->smear(C, U); + }; + void exponentiate_iQ(GaugeLinkField& e_iQ, const GaugeLinkField& iQ) const { + // Put this outside + // only valid for SU(3) matrices - void BaseSmear(GaugeField& C, - const GaugeField& U) const{ - SmearBase->smear(C, U); - }; + // only one Lorentz direction at a time - void exponentiate_iQ(GaugeLinkField& e_iQ, - const GaugeLinkField& iQ) const{ - // Put this outside - // only valid for SU(3) matrices + // notice that it actually computes + // exp ( input matrix ) + // the i sign is coming from outside + // input matrix is anti-hermitian NOT hermitian - // only one Lorentz direction at a time + GridBase* grid = iQ._grid; + GaugeLinkField unity(grid); + unity = 1.0; - // notice that it actually computes - // exp ( input matrix ) - // the i sign is coming from outside - // input matrix is anti-hermitian NOT hermitian + GaugeLinkField iQ2(grid), iQ3(grid); + LatticeComplex u(grid), w(grid); + LatticeComplex f0(grid), f1(grid), f2(grid); - GridBase *grid = iQ._grid; - GaugeLinkField unity(grid); - unity=1.0; + iQ2 = iQ * iQ; + iQ3 = iQ * iQ2; - GaugeLinkField iQ2(grid), iQ3(grid); - LatticeComplex u(grid), w(grid); - LatticeComplex f0(grid), f1(grid), f2(grid); + set_uw(u, w, iQ2, iQ3); + set_fj(f0, f1, f2, u, w); - iQ2 = iQ * iQ; - iQ3 = iQ * iQ2; + e_iQ = f0 * unity + timesMinusI(f1) * iQ - f2 * iQ2; + }; - set_uw(u, w, iQ2, iQ3); - set_fj(f0, f1, f2, u, w); + void set_uw(LatticeComplex& u, LatticeComplex& w, GaugeLinkField& iQ2, + GaugeLinkField& iQ3) const { + Complex one_over_three = 1.0 / 3.0; + Complex one_over_two = 1.0 / 2.0; - e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; + GridBase* grid = u._grid; + LatticeComplex c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); + // sign in c0 from the conventions on the Ta + c0 = -imag(trace(iQ3)) * one_over_three; + c1 = -real(trace(iQ2)) * one_over_two; - }; + // Cayley Hamilton checks to machine precision, tested + tmp = c1 * one_over_three; + c0max = 2.0 * pow(tmp, 1.5); + theta = acos(c0 / c0max) * + one_over_three; // divide by three here, now leave as it is + u = sqrt(tmp) * cos(theta); + w = sqrt(c1) * sin(theta); + } - void set_uw(LatticeComplex& u, LatticeComplex& w, - GaugeLinkField& iQ2, GaugeLinkField& iQ3) const{ - Complex one_over_three = 1.0/3.0; - Complex one_over_two = 1.0/2.0; + void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, + const LatticeComplex& u, const LatticeComplex& w) const { + GridBase* grid = u._grid; + LatticeComplex xi0(grid), u2(grid), w2(grid), cosw(grid); + LatticeComplex fden(grid); + LatticeComplex h0(grid), h1(grid), h2(grid); + LatticeComplex e2iu(grid), emiu(grid), ixi0(grid), qt(grid); + LatticeComplex unity(grid); + unity = 1.0; - GridBase *grid = u._grid; - LatticeComplex c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); + xi0 = func_xi0(w); + u2 = u * u; + w2 = w * w; + cosw = cos(w); - // sign in c0 from the conventions on the Ta - c0 = - real(timesMinusI(trace(iQ3))) * one_over_three; //temporary hack - c1 = - real(trace(iQ2)) * one_over_two; + ixi0 = timesI(xi0); + emiu = cos(u) - timesI(sin(u)); + e2iu = cos(2.0 * u) + timesI(sin(2.0 * u)); - //Cayley Hamilton checks to machine precision, tested - tmp = c1 * one_over_three; - c0max = 2.0 * pow(tmp, 1.5); + h0 = e2iu * (u2 - w2) + + emiu * ((8.0 * u2 * cosw) + (2.0 * u * (3.0 * u2 + w2) * ixi0)); + h1 = e2iu * (2.0 * u) - emiu * ((2.0 * u * cosw) - (3.0 * u2 - w2) * ixi0); + h2 = e2iu - emiu * (cosw + (3.0 * u) * ixi0); - theta = acos(c0/c0max)*one_over_three; // divide by three here, now leave as it is - u = sqrt(tmp) * cos( theta ); - w = sqrt(c1) * sin( theta ); - } + fden = unity / (9.0 * u2 - w2); // reals + f0 = h0 * fden; + f1 = h1 * fden; + f2 = h2 * fden; + } - void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, - const LatticeComplex& u, const LatticeComplex& w) const{ + LatticeComplex func_xi0(const LatticeComplex& w) const { + // Define a function to do the check + // if( w < 1e-4 ) std::cout << GridLogWarning<< "[Smear_stout] w too small: + // "<< w <<"\n"; + return sin(w) / w; + } - GridBase *grid = u._grid; - LatticeComplex xi0(grid), u2(grid), w2(grid), cosw(grid); - LatticeComplex fden(grid); - LatticeComplex h0(grid), h1(grid), h2(grid); - LatticeComplex e2iu(grid), emiu(grid), ixi0(grid), qt(grid); - LatticeComplex unity(grid); - unity = 1.0; - - xi0 = func_xi0(w); - u2 = u * u; - w2 = w * w; - cosw = cos(w); - - ixi0 = timesI(xi0); - emiu = cos(u) - timesI(sin(u)); - e2iu = cos(2.0*u) + timesI(sin(2.0*u)); - - h0 = e2iu * (u2 - w2) + emiu * ( (8.0*u2*cosw) + (2.0*u*(3.0*u2 + w2)*ixi0)); - h1 = e2iu * (2.0 * u) - emiu * ( (2.0*u*cosw) - (3.0*u2-w2)*ixi0); - h2 = e2iu - emiu * ( cosw + (3.0*u)*ixi0); - - fden = unity/(9.0*u2 - w2);// reals - f0 = h0 * fden; - f1 = h1 * fden; - f2 = h2 * fden; - } - - - - - LatticeComplex func_xi0(const LatticeComplex& w) const{ - // Define a function to do the check - //if( w < 1e-4 ) std::cout << GridLogWarning<< "[Smear_stout] w too small: "<< w <<"\n"; - return sin(w)/w; - } - - LatticeComplex func_xi1(const LatticeComplex& w) const{ - // Define a function to do the check - //if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: "<< w <<"\n"; - return cos(w)/(w*w) - sin(w)/(w*w*w); - } - - }; - - } + LatticeComplex func_xi1(const LatticeComplex& w) const { + // Define a function to do the check + // if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: + // "<< w <<"\n"; + return cos(w) / (w * w) - sin(w) / (w * w * w); + } +}; +} } -#endif +#endif diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index b9f7169e..0b2b6728 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -1,33 +1,34 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/simd/Grid_vector_types.h +Source file: ./lib/simd/Grid_vector_types.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi Author: Guido Cossu 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ //--------------------------------------------------------------------------- /*! @file Grid_vector_types.h @brief Defines templated class Grid_simd to deal with inner vector types @@ -43,7 +44,7 @@ Author: neo #ifdef SSE4 #include "Grid_sse4.h" #endif -#if defined (AVX1)|| defined (AVX2) || defined (AVXFMA4) +#if defined(AVX1) || defined(AVX2) || defined(AVXFMA4) #include "Grid_avx.h" #endif #if defined AVX512 @@ -61,518 +62,635 @@ Author: neo namespace Grid { - ////////////////////////////////////// - // To take the floating point type of real/complex type - ////////////////////////////////////// - template struct RealPart { - typedef T type; - }; - template struct RealPart< std::complex >{ - typedef T type; - }; - - ////////////////////////////////////// - // demote a vector to real type - ////////////////////////////////////// +////////////////////////////////////// +// To take the floating point type of real/complex type +////////////////////////////////////// +template +struct RealPart { + typedef T type; +}; +template +struct RealPart > { + typedef T type; +}; - // type alias used to simplify the syntax of std::enable_if - template using Invoke = typename T::type; - template using EnableIf = Invoke >; - template using NotEnableIf= Invoke >; +////////////////////////////////////// +// demote a vector to real type +////////////////////////////////////// +// type alias used to simplify the syntax of std::enable_if +template +using Invoke = typename T::type; +template +using EnableIf = Invoke >; +template +using NotEnableIf = Invoke >; - //////////////////////////////////////////////////////// - // Check for complexity with type traits - template struct is_complex : public std::false_type {}; - template <> struct is_complex >: public std::true_type {}; - template <> struct is_complex > : public std::true_type {}; +//////////////////////////////////////////////////////// +// Check for complexity with type traits +template +struct is_complex : public std::false_type {}; +template <> +struct is_complex > : public std::true_type {}; +template <> +struct is_complex > : public std::true_type {}; - template using IfReal = Invoke::value,int> > ; - template using IfComplex = Invoke::value,int> > ; - template using IfInteger = Invoke::value,int> > ; +template +using IfReal = Invoke::value, int> >; +template +using IfComplex = Invoke::value, int> >; +template +using IfInteger = Invoke::value, int> >; - template using IfNotReal = Invoke::value,int> > ; - template using IfNotComplex = Invoke::value,int> > ; - template using IfNotInteger = Invoke::value,int> > ; +template +using IfNotReal = + Invoke::value, int> >; +template +using IfNotComplex = Invoke::value, int> >; +template +using IfNotInteger = Invoke::value, int> >; - //////////////////////////////////////////////////////// - // Define the operation templates functors - // general forms to allow for vsplat syntax - // need explicit declaration of types when used since - // clang cannot automatically determine the output type sometimes - template < class Out, class Input1, class Input2, class Operation > - Out binary(Input1 src_1, Input2 src_2, Operation op){ - return op(src_1, src_2); - } +//////////////////////////////////////////////////////// +// Define the operation templates functors +// general forms to allow for vsplat syntax +// need explicit declaration of types when used since +// clang cannot automatically determine the output type sometimes +template +Out binary(Input1 src_1, Input2 src_2, Operation op) { + return op(src_1, src_2); +} - template < class Out, class Input, class Operation > - Out unary(Input src, Operation op){ - return op(src); - } - /////////////////////////////////////////////// +template +Out unary(Input src, Operation op) { + return op(src); +} +/////////////////////////////////////////////// +/* + @brief Grid_simd class for the SIMD vector type operations + */ +template +class Grid_simd { + public: + typedef typename RealPart::type Real; + typedef Vector_type vector_type; + typedef Scalar_type scalar_type; - - /* - @brief Grid_simd class for the SIMD vector type operations - */ - template < class Scalar_type, class Vector_type > - class Grid_simd { - - public: - typedef typename RealPart < Scalar_type >::type Real; - typedef Vector_type vector_type; - typedef Scalar_type scalar_type; - - - typedef union conv_t_union { - Vector_type v; - Scalar_type s[sizeof(Vector_type)/sizeof(Scalar_type)]; - conv_t_union(){}; - } conv_t; - - + typedef union conv_t_union { Vector_type v; - - static inline int Nsimd(void) { return sizeof(Vector_type)/sizeof(Scalar_type);} - - Grid_simd& operator=(const Grid_simd&& rhs){v=rhs.v;return *this;}; - Grid_simd& operator=(const Grid_simd& rhs){v=rhs.v;return *this;}; //faster than not declaring it and leaving to the compiler - Grid_simd()=default; - Grid_simd(const Grid_simd& rhs) :v(rhs.v){}; //compiles in movaps - Grid_simd(const Grid_simd&& rhs):v(rhs.v){}; + Scalar_type s[sizeof(Vector_type) / sizeof(Scalar_type)]; + conv_t_union(){}; + } conv_t; - ///////////////////////////// - // Constructors - ///////////////////////////// - Grid_simd & operator = ( Zero & z){ - vzero(*this); - return (*this); - } - - //Enable if complex type - template < typename S = Scalar_type > - Grid_simd(const typename std::enable_if< is_complex < S >::value, S>::type a){ - vsplat(*this,a); - }; + Vector_type v; - Grid_simd(const Real a){ - vsplat(*this,Scalar_type(a)); - }; - - /////////////////////////////////////////////// - // mac, mult, sub, add, adj - /////////////////////////////////////////////// - - // FIXME -- alias this to an inline MAC struct. - friend inline void mac (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ a,const Grid_simd *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - - - friend inline void mult(Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } - - friend inline void mac (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ a,const Grid_simd *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - friend inline void mult(Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } - - friend inline void mac (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ a,const Scalar_type *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - friend inline void mult(Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) + (*r); } - - //////////////////////////////////////////////////////////////////////// - // FIXME: gonna remove these load/store, get, set, prefetch - //////////////////////////////////////////////////////////////////////// - friend inline void vset(Grid_simd &ret, Scalar_type *a){ - ret.v = unary(a, VsetSIMD()); - } - - /////////////////////// - // Vstore - /////////////////////// - friend inline void vstore(const Grid_simd &ret, Scalar_type *a){ - binary(ret.v, (Real*)a, VstoreSIMD()); - } - - /////////////////////// - // Vprefetch - /////////////////////// - friend inline void vprefetch(const Grid_simd &v) - { - prefetch_HINT_T0((const char*)&v.v); - } - - /////////////////////// - // Reduce - /////////////////////// - friend inline Scalar_type Reduce(const Grid_simd & in) - { - return unary(in.v, ReduceSIMD()); - } - - //////////////////////////// - // opreator scalar * simd - //////////////////////////// - friend inline Grid_simd operator * (const Scalar_type &a, Grid_simd b){ - Grid_simd va; - vsplat(va,a); - return va*b; - } - friend inline Grid_simd operator * (Grid_simd b,const Scalar_type &a){ - return a*b; - } - - /////////////////////// - // Unary negation - /////////////////////// - friend inline Grid_simd operator -(const Grid_simd &r) { - Grid_simd ret; - vzero(ret); - ret = ret - r; - return ret; - } - // *=,+=,-= operators - inline Grid_simd &operator *=(const Grid_simd &r) { - *this = (*this)*r; - return *this; - // return (*this)*r; ? - } - inline Grid_simd &operator +=(const Grid_simd &r) { - *this = *this+r; - return *this; - } - inline Grid_simd &operator -=(const Grid_simd &r) { - *this = *this-r; - return *this; - } - - /////////////////////////////////////// - // Not all functions are supported - // through SIMD and must breakout to - // scalar type and back again. This - // provides support - /////////////////////////////////////// - - template friend inline Grid_simd SimdApply (const functor &func,const Grid_simd &v) { - Grid_simd ret; - Grid_simd::conv_t conv; - - conv.v = v.v; - for(int i=0;i friend inline Grid_simd SimdApplyBinop (const functor &func,const Grid_simd &x,const Grid_simd &y) { - Grid_simd ret; - Grid_simd::conv_t cx; - Grid_simd::conv_t cy; - - cx.v = x.v; - cy.v = y.v; - for(int i=0;i =0> - inline Grid_simd rotate(Grid_simd b,int nrot) - { - nrot = nrot % Grid_simd::Nsimd(); - Grid_simd ret; - // std::cout << "Rotate Real by "< =0> - inline Grid_simd rotate(Grid_simd b,int nrot) - { - nrot = nrot % Grid_simd::Nsimd(); - Grid_simd ret; - // std::cout << "Rotate Complex by "< =0, class ABtype> - inline void vsplat(Grid_simd &ret,ABtype a, ABtype b){ - ret.v = binary(a, b, VsplatSIMD()); - } + Grid_simd &operator=(const Grid_simd &&rhs) { + v = rhs.v; + return *this; + }; + Grid_simd &operator=(const Grid_simd &rhs) { + v = rhs.v; + return *this; + }; // faster than not declaring it and leaving to the compiler + Grid_simd() = default; + Grid_simd(const Grid_simd &rhs) : v(rhs.v){}; // compiles in movaps + Grid_simd(const Grid_simd &&rhs) : v(rhs.v){}; - // overload if complex - template inline void vsplat(Grid_simd &ret, EnableIf, S> c) { - vsplat(ret,real(c),imag(c)); + ///////////////////////////// + // Constructors + ///////////////////////////// + Grid_simd &operator=(Zero &z) { + vzero(*this); + return (*this); } - //if real fill with a, if complex fill with a in the real part (first function above) - template - inline void vsplat(Grid_simd &ret,NotEnableIf,S> a){ - ret.v = unary(a, VsplatSIMD()); - } - ////////////////////////// + // Enable if complex type + template + Grid_simd(const typename std::enable_if::value, S>::type a) { + vsplat(*this, a); + }; + + Grid_simd(const Real a) { vsplat(*this, Scalar_type(a)); }; /////////////////////////////////////////////// - // Initialise to 1,0,i for the correct types + // mac, mult, sub, add, adj /////////////////////////////////////////////// - // For complex types - template = 0 > inline void vone(Grid_simd &ret) { vsplat(ret,S(1.0,0.0)); } - template = 0 > inline void vzero(Grid_simd &ret) { vsplat(ret,S(0.0,0.0)); }// use xor? - template = 0 > inline void vcomplex_i(Grid_simd &ret){ vsplat(ret,S(0.0,1.0));} - template = 0 > inline void visign(Grid_simd &ret){ vsplat(ret,S(1.0,-1.0));} - template = 0 > inline void vrsign(Grid_simd &ret){ vsplat(ret,S(-1.0,1.0));} - - // if not complex overload here - template = 0 > inline void vone (Grid_simd &ret){ vsplat(ret,S(1.0)); } - template = 0 > inline void vzero(Grid_simd &ret){ vsplat(ret,S(0.0)); } - - // For integral types - template = 0 > inline void vone(Grid_simd &ret) {vsplat(ret,1); } - template = 0 > inline void vzero(Grid_simd &ret) {vsplat(ret,0); } - template = 0 > inline void vtrue (Grid_simd &ret){vsplat(ret,0xFFFFFFFF);} - template = 0 > inline void vfalse(Grid_simd &ret){vsplat(ret,0);} - - template inline void zeroit(Grid_simd &z){ vzero(z);} - - /////////////////////// - // Vstream - /////////////////////// - template = 0 > - inline void vstream(Grid_simd &out,const Grid_simd &in){ - binary((S *)&out.v, in.v, VstreamSIMD()); - } - template = 0 > - inline void vstream(Grid_simd &out,const Grid_simd &in){ - typedef typename S::value_type T; - binary((T *)&out.v, in.v, VstreamSIMD()); - } - - template = 0 > - inline void vstream(Grid_simd &out,const Grid_simd &in){ - out=in; - } - - //////////////////////////////////// - // Arithmetic operator overloads +,-,* - //////////////////////////////////// - template inline Grid_simd operator + (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v, b.v, SumSIMD()); - return ret; - }; - - template inline Grid_simd operator - (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v, b.v, SubSIMD()); - return ret; - }; - - // Distinguish between complex types and others - template = 0 > inline Grid_simd operator * (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v,b.v, MultComplexSIMD()); - return ret; + // FIXME -- alias this to an inline MAC struct. + friend inline void mac(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ a, + const Grid_simd *__restrict__ x) { + *y = (*a) * (*x) + (*y); }; - // Real/Integer types - template = 0 > inline Grid_simd operator * (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v,b.v, MultSIMD()); - return ret; + friend inline void mult(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) * (*r); + } + friend inline void sub(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) - (*r); + } + friend inline void add(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) + (*r); + } + + friend inline void mac(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ a, + const Grid_simd *__restrict__ x) { + *y = (*a) * (*x) + (*y); }; - - - /////////////////////// - // Conjugate - /////////////////////// - template = 0 > - inline Grid_simd conjugate(const Grid_simd &in){ - Grid_simd ret ; - ret.v = unary(in.v, ConjSIMD()); - return ret; + friend inline void mult(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) * (*r); } - template = 0 > inline Grid_simd conjugate(const Grid_simd &in){ - return in; // for real objects + friend inline void sub(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) - (*r); + } + friend inline void add(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) + (*r); + } + + friend inline void mac(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ a, + const Scalar_type *__restrict__ x) { + *y = (*a) * (*x) + (*y); + }; + friend inline void mult(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Scalar_type *__restrict__ r) { + *y = (*l) * (*r); + } + friend inline void sub(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Scalar_type *__restrict__ r) { + *y = (*l) - (*r); + } + friend inline void add(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Scalar_type *__restrict__ r) { + *y = (*l) + (*r); + } + + //////////////////////////////////////////////////////////////////////// + // FIXME: gonna remove these load/store, get, set, prefetch + //////////////////////////////////////////////////////////////////////// + friend inline void vset(Grid_simd &ret, Scalar_type *a) { + ret.v = unary(a, VsetSIMD()); } - //Suppress adj for integer types... // odd; why conjugate above but not adj?? - template < class S, class V, IfNotInteger = 0 > - inline Grid_simd adj(const Grid_simd &in){ return conjugate(in); } - /////////////////////// - // timesMinusI + // Vstore /////////////////////// - template = 0 > - inline void timesMinusI( Grid_simd &ret,const Grid_simd &in){ - ret.v = binary(in.v, ret.v, TimesMinusISIMD()); + friend inline void vstore(const Grid_simd &ret, Scalar_type *a) { + binary(ret.v, (Real *)a, VstoreSIMD()); } - template = 0 > - inline Grid_simd timesMinusI(const Grid_simd &in){ - Grid_simd ret; - timesMinusI(ret,in); + /////////////////////// + // Vprefetch + /////////////////////// + friend inline void vprefetch(const Grid_simd &v) { + prefetch_HINT_T0((const char *)&v.v); + } + + /////////////////////// + // Reduce + /////////////////////// + friend inline Scalar_type Reduce(const Grid_simd &in) { + return unary(in.v, ReduceSIMD()); + } + + //////////////////////////// + // opreator scalar * simd + //////////////////////////// + friend inline Grid_simd operator*(const Scalar_type &a, Grid_simd b) { + Grid_simd va; + vsplat(va, a); + return va * b; + } + friend inline Grid_simd operator*(Grid_simd b, const Scalar_type &a) { + return a * b; + } + + /////////////////////// + // Unary negation + /////////////////////// + friend inline Grid_simd operator-(const Grid_simd &r) { + Grid_simd ret; + vzero(ret); + ret = ret - r; return ret; } - - template = 0 > - inline Grid_simd timesMinusI(const Grid_simd &in){ - return in; + // *=,+=,-= operators + inline Grid_simd &operator*=(const Grid_simd &r) { + *this = (*this) * r; + return *this; + // return (*this)*r; ? + } + inline Grid_simd &operator+=(const Grid_simd &r) { + *this = *this + r; + return *this; + } + inline Grid_simd &operator-=(const Grid_simd &r) { + *this = *this - r; + return *this; } - /////////////////////// - // timesI - /////////////////////// - template = 0 > - inline void timesI(Grid_simd &ret,const Grid_simd &in){ - ret.v = binary(in.v, ret.v, TimesISIMD()); - } - - template = 0 > - inline Grid_simd timesI(const Grid_simd &in){ - Grid_simd ret; - timesI(ret,in); - return ret; - } + /////////////////////////////////////// + // Not all functions are supported + // through SIMD and must breakout to + // scalar type and back again. This + // provides support + /////////////////////////////////////// - template = 0 > - inline Grid_simd timesI(const Grid_simd &in){ - return in; - } + template + friend inline Grid_simd SimdApply(const functor &func, const Grid_simd &v) { + Grid_simd ret; + Grid_simd::conv_t conv; - ///////////////////// - // Inner, outer - ///////////////////// - - template - inline Grid_simd< S, V> innerProduct(const Grid_simd< S, V> & l, const Grid_simd< S, V> & r) - { - return conjugate(l)*r; - } - - template - inline Grid_simd< S, V> outerProduct(const Grid_simd< S, V> &l, const Grid_simd< S, V> & r) - { - return l*conjugate(r); - } - - template - inline Grid_simd< S, V> trace(const Grid_simd< S, V> &arg){ - return arg; - } - - - //////////////////////////////////////////////////////////// - // copy/splat complex real parts into real; - // insert real into complex and zero imag; - //////////////////////////////////////////////////////////// - - //real = toReal( complex ) - template = 0> - inline Grid_simd toReal(const Grid_simd,V> &in) - { - typedef Grid_simd simd; - simd ret; - typename simd::conv_t conv; - conv.v = in.v; // copy the vector content (bytewise) - for(int i=0;i = 0 > // must be a real arg - inline Grid_simd,V> toComplex (const Grid_simd &in) - { - typedef Grid_simd Rsimd; - typedef Grid_simd,V> Csimd; - typename Rsimd::conv_t conv;// address as real - - conv.v = in.v; - for(int i=0;i + friend inline Grid_simd SimdApplyBinop(const functor &func, + const Grid_simd &x, + const Grid_simd &y) { + Grid_simd ret; + Grid_simd::conv_t cx; + Grid_simd::conv_t cy; + + cx.v = x.v; + cy.v = y.v; + for (int i = 0; i < Nsimd(); i++) { + cx.s[i] = func(cx.s[i], cy.s[i]); } - Csimd ret; - ret.v = conv.v; + ret.v = cx.v; return ret; } + //////////////////////////////////////////////////////////////////// + // General permute; assumes vector length is same across + // all subtypes; may not be a good assumption, but could + // add the vector width as a template param for BG/Q for example + //////////////////////////////////////////////////////////////////// + friend inline void permute0(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute0(b.v); + } + friend inline void permute1(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute1(b.v); + } + friend inline void permute2(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute2(b.v); + } + friend inline void permute3(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute3(b.v); + } + friend inline void permute(Grid_simd &y, Grid_simd b, int perm) { + if (perm & RotateBit) { + int dist = perm & 0xF; + y = rotate(b, dist); + return; + } + switch (perm) { + case 3: + permute3(y, b); + break; + case 2: + permute2(y, b); + break; + case 1: + permute1(y, b); + break; + case 0: + permute0(y, b); + break; + default: + assert(0); + } + } +}; // end of Grid_simd class definition - - /////////////////////////////// - // Define available types - /////////////////////////////// - typedef Grid_simd< float , SIMD_Ftype > vRealF; - typedef Grid_simd< double , SIMD_Dtype > vRealD; - typedef Grid_simd< std::complex< float > , SIMD_Ftype > vComplexF; - typedef Grid_simd< std::complex< double >, SIMD_Dtype > vComplexD; - typedef Grid_simd< Integer , SIMD_Itype > vInteger; +//////////////////////////////////////////////////////////////////// +// General rotate +//////////////////////////////////////////////////////////////////// +template = 0> +inline Grid_simd rotate(Grid_simd b, int nrot) { + nrot = nrot % Grid_simd::Nsimd(); + Grid_simd ret; + // std::cout << "Rotate Real by "< = 0> +inline Grid_simd rotate(Grid_simd b, int nrot) { + nrot = nrot % Grid_simd::Nsimd(); + Grid_simd ret; + // std::cout << "Rotate Complex by "< struct is_simd : public std::false_type{}; - template <> struct is_simd : public std::true_type {}; - template <> struct is_simd : public std::true_type {}; - template <> struct is_simd: public std::true_type {}; - template <> struct is_simd: public std::true_type {}; - template <> struct is_simd : public std::true_type {}; +/////////////////////// +// Splat +/////////////////////// - template using IfSimd = Invoke::value,int> > ; - template using IfNotSimd = Invoke::value,unsigned> > ; +// this is only for the complex version +template = 0, class ABtype> +inline void vsplat(Grid_simd &ret, ABtype a, ABtype b) { + ret.v = binary(a, b, VsplatSIMD()); +} +// overload if complex +template +inline void vsplat(Grid_simd &ret, EnableIf, S> c) { + vsplat(ret, real(c), imag(c)); +} + +// if real fill with a, if complex fill with a in the real part (first function +// above) +template +inline void vsplat(Grid_simd &ret, NotEnableIf, S> a) { + ret.v = unary(a, VsplatSIMD()); +} +////////////////////////// + +/////////////////////////////////////////////// +// Initialise to 1,0,i for the correct types +/////////////////////////////////////////////// +// For complex types +template = 0> +inline void vone(Grid_simd &ret) { + vsplat(ret, S(1.0, 0.0)); +} +template = 0> +inline void vzero(Grid_simd &ret) { + vsplat(ret, S(0.0, 0.0)); +} // use xor? +template = 0> +inline void vcomplex_i(Grid_simd &ret) { + vsplat(ret, S(0.0, 1.0)); +} + +template = 0> +inline void visign(Grid_simd &ret) { + vsplat(ret, S(1.0, -1.0)); +} +template = 0> +inline void vrsign(Grid_simd &ret) { + vsplat(ret, S(-1.0, 1.0)); +} + +// if not complex overload here +template = 0> +inline void vone(Grid_simd &ret) { + vsplat(ret, S(1.0)); +} +template = 0> +inline void vzero(Grid_simd &ret) { + vsplat(ret, S(0.0)); +} + +// For integral types +template = 0> +inline void vone(Grid_simd &ret) { + vsplat(ret, 1); +} +template = 0> +inline void vzero(Grid_simd &ret) { + vsplat(ret, 0); +} +template = 0> +inline void vtrue(Grid_simd &ret) { + vsplat(ret, 0xFFFFFFFF); +} +template = 0> +inline void vfalse(Grid_simd &ret) { + vsplat(ret, 0); +} + +template +inline void zeroit(Grid_simd &z) { + vzero(z); +} + +/////////////////////// +// Vstream +/////////////////////// +template = 0> +inline void vstream(Grid_simd &out, const Grid_simd &in) { + binary((S *)&out.v, in.v, VstreamSIMD()); +} +template = 0> +inline void vstream(Grid_simd &out, const Grid_simd &in) { + typedef typename S::value_type T; + binary((T *)&out.v, in.v, VstreamSIMD()); +} + +template = 0> +inline void vstream(Grid_simd &out, const Grid_simd &in) { + out = in; +} + +//////////////////////////////////// +// Arithmetic operator overloads +,-,* +//////////////////////////////////// +template +inline Grid_simd operator+(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, SumSIMD()); + return ret; +}; + +template +inline Grid_simd operator-(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, SubSIMD()); + return ret; +}; + +// Distinguish between complex types and others +template = 0> +inline Grid_simd operator*(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, MultComplexSIMD()); + return ret; +}; + +// Real/Integer types +template = 0> +inline Grid_simd operator*(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, MultSIMD()); + return ret; +}; + +/////////////////////// +// Conjugate +/////////////////////// +template = 0> +inline Grid_simd conjugate(const Grid_simd &in) { + Grid_simd ret; + ret.v = unary(in.v, ConjSIMD()); + return ret; +} +template = 0> +inline Grid_simd conjugate(const Grid_simd &in) { + return in; // for real objects +} + +// Suppress adj for integer types... // odd; why conjugate above but not adj?? +template = 0> +inline Grid_simd adj(const Grid_simd &in) { + return conjugate(in); +} + +/////////////////////// +// timesMinusI +/////////////////////// +template = 0> +inline void timesMinusI(Grid_simd &ret, const Grid_simd &in) { + ret.v = binary(in.v, ret.v, TimesMinusISIMD()); +} + +template = 0> +inline Grid_simd timesMinusI(const Grid_simd &in) { + Grid_simd ret; + timesMinusI(ret, in); + return ret; +} + +template = 0> +inline Grid_simd timesMinusI(const Grid_simd &in) { + return in; +} + +/////////////////////// +// timesI +/////////////////////// +template = 0> +inline void timesI(Grid_simd &ret, const Grid_simd &in) { + ret.v = binary(in.v, ret.v, TimesISIMD()); +} + +template = 0> +inline Grid_simd timesI(const Grid_simd &in) { + Grid_simd ret; + timesI(ret, in); + return ret; +} + +template = 0> +inline Grid_simd timesI(const Grid_simd &in) { + return in; +} + +///////////////////// +// Inner, outer +///////////////////// + +template +inline Grid_simd innerProduct(const Grid_simd &l, + const Grid_simd &r) { + return conjugate(l) * r; +} + +template +inline Grid_simd outerProduct(const Grid_simd &l, + const Grid_simd &r) { + return l * conjugate(r); +} + +template +inline Grid_simd trace(const Grid_simd &arg) { + return arg; +} + +//////////////////////////////////////////////////////////// +// copy/splat complex real parts into real; +// insert real into complex and zero imag; +//////////////////////////////////////////////////////////// + +// real = toReal( complex ) +template = 0> +inline Grid_simd toReal(const Grid_simd, V> &in) { + typedef Grid_simd simd; + simd ret; + typename simd::conv_t conv; + conv.v = in.v; // copy the vector content (bytewise) + for (int i = 0; i < simd::Nsimd(); i += 2) { + conv.s[i + 1] = conv.s[i]; // duplicate (r,r);(r,r);(r,r); etc... + } + ret.v = conv.v; + return ret; +} + +// complex = toComplex( real ) +template = 0> // must be a real arg +inline Grid_simd, V> toComplex(const Grid_simd &in) { + typedef Grid_simd Rsimd; + typedef Grid_simd, V> Csimd; + typename Rsimd::conv_t conv; // address as real + + conv.v = in.v; + for (int i = 0; i < Rsimd::Nsimd(); i += 2) { + assert(conv.s[i + 1] == + conv.s[i]); // trap any cases where real was not duplicated + // indicating the SIMD grids of real and imag assignment did not correctly + // match + conv.s[i + 1] = 0.0; // zero imaginary parts + } + Csimd ret; + ret.v = conv.v; + return ret; +} + +/////////////////////////////// +// Define available types +/////////////////////////////// +typedef Grid_simd vRealF; +typedef Grid_simd vRealD; +typedef Grid_simd, SIMD_Ftype> vComplexF; +typedef Grid_simd, SIMD_Dtype> vComplexD; +typedef Grid_simd vInteger; + +///////////////////////////////////////// +// Some traits to recognise the types +///////////////////////////////////////// +template +struct is_simd : public std::false_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; + +template +using IfSimd = Invoke::value, int> >; +template +using IfNotSimd = Invoke::value, unsigned> >; } #endif diff --git a/lib/simd/Grid_vector_unops.h b/lib/simd/Grid_vector_unops.h index 2ce8590d..a67f4e7d 100644 --- a/lib/simd/Grid_vector_unops.h +++ b/lib/simd/Grid_vector_unops.h @@ -1,247 +1,234 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/simd/Grid_vector_unops.h +Source file: ./lib/simd/Grid_vector_unops.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_VECTOR_UNOPS #define GRID_VECTOR_UNOPS #include -namespace Grid { +namespace Grid { - template struct SqrtRealFunctor { - scalar operator()(const scalar &a) const { - return sqrt(real(a)); - } - }; +template +struct SqrtRealFunctor { + scalar operator()(const scalar &a) const { return sqrt(real(a)); } +}; - template struct RSqrtRealFunctor { - scalar operator()(const scalar &a) const { - return scalar(1.0/sqrt(real(a))); - } - }; +template +struct RSqrtRealFunctor { + scalar operator()(const scalar &a) const { + return scalar(1.0 / sqrt(real(a))); + } +}; - template struct CosRealFunctor { - scalar operator()(const scalar &a) const { - return cos(real(a)); - } - }; +template +struct CosRealFunctor { + scalar operator()(const scalar &a) const { return cos(real(a)); } +}; - template struct SinRealFunctor { - scalar operator()(const scalar &a) const { - return sin(real(a)); - } - }; +template +struct SinRealFunctor { + scalar operator()(const scalar &a) const { return sin(real(a)); } +}; - template struct AcosRealFunctor { - scalar operator()(const scalar &a) const { - return acos(real(a)); - } - }; +template +struct AcosRealFunctor { + scalar operator()(const scalar &a) const { return acos(real(a)); } +}; - template struct AsinRealFunctor { - scalar operator()(const scalar &a) const { - return asin(real(a)); - } - }; +template +struct AsinRealFunctor { + scalar operator()(const scalar &a) const { return asin(real(a)); } +}; - template struct LogRealFunctor { - scalar operator()(const scalar &a) const { - return log(real(a)); - } - }; +template +struct LogRealFunctor { + scalar operator()(const scalar &a) const { return log(real(a)); } +}; - template struct ExpRealFunctor { - scalar operator()(const scalar &a) const { - return exp(real(a)); - } - }; - template struct NotFunctor { - scalar operator()(const scalar &a) const { - return (!a); - } - }; - template struct AbsRealFunctor { - scalar operator()(const scalar &a) const { - return std::abs(real(a)); - } - }; +template +struct ExpRealFunctor { + scalar operator()(const scalar &a) const { return exp(real(a)); } +}; +template +struct NotFunctor { + scalar operator()(const scalar &a) const { return (!a); } +}; +template +struct AbsRealFunctor { + scalar operator()(const scalar &a) const { return std::abs(real(a)); } +}; - template struct PowRealFunctor { - double y; - PowRealFunctor(double _y) : y(_y) {}; - scalar operator()(const scalar &a) const { - return pow(real(a),y); - } - }; +template +struct PowRealFunctor { + double y; + PowRealFunctor(double _y) : y(_y){}; + scalar operator()(const scalar &a) const { return pow(real(a), y); } +}; - template struct ModIntFunctor { - Integer y; - ModIntFunctor(Integer _y) : y(_y) {}; - scalar operator()(const scalar &a) const { - return Integer(a)%y; - } - }; +template +struct ModIntFunctor { + Integer y; + ModIntFunctor(Integer _y) : y(_y){}; + scalar operator()(const scalar &a) const { return Integer(a) % y; } +}; - template struct DivIntFunctor { - Integer y; - DivIntFunctor(Integer _y) : y(_y) {}; - scalar operator()(const scalar &a) const { - return Integer(a)/y; - } - }; +template +struct DivIntFunctor { + Integer y; + DivIntFunctor(Integer _y) : y(_y){}; + scalar operator()(const scalar &a) const { return Integer(a) / y; } +}; - template struct RealFunctor { - scalar operator()(const std::complex &a) const { - return real(a); - } - }; - template struct ImagFunctor { - scalar operator()(const std::complex &a) const { - return imag(a); - } - }; - template < class S, class V > - inline Grid_simd real(const Grid_simd &r) { - return SimdApply(RealFunctor(),r); - } - template < class S, class V > - inline Grid_simd imag(const Grid_simd &r) { - return SimdApply(ImagFunctor(),r); - } +template +struct RealFunctor { + scalar operator()(const scalar &a) const { return std::real(a); } +}; +template +struct ImagFunctor { + scalar operator()(const scalar &a) const { return std::imag(a); } +}; +template +inline Grid_simd real(const Grid_simd &r) { + return SimdApply(RealFunctor(), r); +} +template +inline Grid_simd imag(const Grid_simd &r) { + return SimdApply(ImagFunctor(), r); +} +template +inline Grid_simd sqrt(const Grid_simd &r) { + return SimdApply(SqrtRealFunctor(), r); +} +template +inline Grid_simd rsqrt(const Grid_simd &r) { + return SimdApply(RSqrtRealFunctor(), r); +} +template +inline Scalar rsqrt(const Scalar &r) { + return (RSqrtRealFunctor(), r); +} - template < class S, class V > - inline Grid_simd sqrt(const Grid_simd &r) { - return SimdApply(SqrtRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd rsqrt(const Grid_simd &r) { - return SimdApply(RSqrtRealFunctor(),r); - } - template < class Scalar > - inline Scalar rsqrt(const Scalar &r) { - return (RSqrtRealFunctor(),r); - } - - template < class S, class V > - inline Grid_simd cos(const Grid_simd &r) { - return SimdApply(CosRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd sin(const Grid_simd &r) { - return SimdApply(SinRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd acos(const Grid_simd &r) { - return SimdApply(AcosRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd asin(const Grid_simd &r) { - return SimdApply(AsinRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd log(const Grid_simd &r) { - return SimdApply(LogRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd abs(const Grid_simd &r) { - return SimdApply(AbsRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd exp(const Grid_simd &r) { - return SimdApply(ExpRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd Not(const Grid_simd &r) { - return SimdApply(NotFunctor(),r); - } - template < class S, class V > - inline Grid_simd pow(const Grid_simd &r,double y) { - return SimdApply(PowRealFunctor(y),r); - } - template < class S, class V > - inline Grid_simd mod(const Grid_simd &r,Integer y) { - return SimdApply(ModIntFunctor(y),r); - } - template < class S, class V > - inline Grid_simd div(const Grid_simd &r,Integer y) { - return SimdApply(DivIntFunctor(y),r); - } - //////////////////////////////////////////////////////////////////////////// - // Allows us to assign into **conformable** real vectors from complex - //////////////////////////////////////////////////////////////////////////// - // template < class S, class V > - // inline auto ComplexRemove(const Grid_simd &c) -> Grid_simd::Real,V> { - // Grid_simd::Real,V> ret; - // ret.v = c.v; - // return ret; - // } - template struct AndFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x & y; - } - }; - template struct OrFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x | y; - } - }; - template struct AndAndFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x && y; - } - }; - template struct OrOrFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x || y; - } - }; - - //////////////////////////////// - // Calls to simd binop functors - //////////////////////////////// - template < class S, class V > - inline Grid_simd operator &(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(AndFunctor(),x,y); - } - template < class S, class V > - inline Grid_simd operator &&(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(AndAndFunctor(),x,y); - } - template < class S, class V > - inline Grid_simd operator |(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(OrFunctor(),x,y); - } - template < class S, class V > - inline Grid_simd operator ||(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(OrOrFunctor(),x,y); - } +template +inline Grid_simd cos(const Grid_simd &r) { + return SimdApply(CosRealFunctor(), r); +} +template +inline Grid_simd sin(const Grid_simd &r) { + return SimdApply(SinRealFunctor(), r); +} +template +inline Grid_simd acos(const Grid_simd &r) { + return SimdApply(AcosRealFunctor(), r); +} +template +inline Grid_simd asin(const Grid_simd &r) { + return SimdApply(AsinRealFunctor(), r); +} +template +inline Grid_simd log(const Grid_simd &r) { + return SimdApply(LogRealFunctor(), r); +} +template +inline Grid_simd abs(const Grid_simd &r) { + return SimdApply(AbsRealFunctor(), r); +} +template +inline Grid_simd exp(const Grid_simd &r) { + return SimdApply(ExpRealFunctor(), r); +} +template +inline Grid_simd Not(const Grid_simd &r) { + return SimdApply(NotFunctor(), r); +} +template +inline Grid_simd pow(const Grid_simd &r, double y) { + return SimdApply(PowRealFunctor(y), r); +} +template +inline Grid_simd mod(const Grid_simd &r, Integer y) { + return SimdApply(ModIntFunctor(y), r); +} +template +inline Grid_simd div(const Grid_simd &r, Integer y) { + return SimdApply(DivIntFunctor(y), r); +} +//////////////////////////////////////////////////////////////////////////// +// Allows us to assign into **conformable** real vectors from complex +//////////////////////////////////////////////////////////////////////////// +// template < class S, class V > +// inline auto ComplexRemove(const Grid_simd &c) -> +// Grid_simd::Real,V> { +// Grid_simd::Real,V> ret; +// ret.v = c.v; +// return ret; +// } +template +struct AndFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x & y; } +}; +template +struct OrFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x | y; } +}; +template +struct AndAndFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x && y; } +}; +template +struct OrOrFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x || y; } +}; +//////////////////////////////// +// Calls to simd binop functors +//////////////////////////////// +template +inline Grid_simd operator&(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(AndFunctor(), x, y); +} +template +inline Grid_simd operator&&(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(AndAndFunctor(), x, y); +} +template +inline Grid_simd operator|(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(OrFunctor(), x, y); +} +template +inline Grid_simd operator||(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(OrOrFunctor(), x, y); +} } #endif diff --git a/tests/Test_simd.cc b/tests/Test_simd.cc index 2255c598..e5957db7 100644 --- a/tests/Test_simd.cc +++ b/tests/Test_simd.cc @@ -1,31 +1,32 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./tests/Test_simd.cc +Source file: ./tests/Test_simd.cc - Copyright (C) 2015 +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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace std; @@ -62,6 +63,18 @@ public: template void operator()(vec &rr,vec &i1,vec &i2) const { rr = adj(i1);} std::string name(void) const { return std::string("Adj"); } }; +class funcImag { +public: + funcImag() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = imag(i1);} + std::string name(void) const { return std::string("imag"); } +}; +class funcReal { +public: + funcReal() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = real(i1);} + std::string name(void) const { return std::string("real"); } +}; class funcTimesI { public: @@ -141,7 +154,13 @@ void Tester(const functor &func) } extract(v_result,result); - std::cout<(funcTimes()); Tester(funcConj()); Tester(funcAdj()); + Tester(funcReal()); + Tester(funcImag()); Tester(funcInnerProduct()); ReductionTester(funcReduce()); @@ -421,17 +442,21 @@ int main (int argc, char ** argv) Tester(funcTimes()); Tester(funcConj()); Tester(funcAdj()); - Tester(funcInnerProduct()); - ReductionTester(funcReduce()); + Tester(funcReal()); + Tester(funcImag()); + Tester(funcInnerProduct()); + ReductionTester(funcReduce()); - std::cout<(funcPermute(i)); + for (int i = 0; (1 << i) < vComplexD::Nsimd(); i++) { + PermTester(funcPermute(i)); } From e87182cf98fd1f4a8785baf5d3b95e00c6a5068d Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Wed, 6 Jul 2016 15:31:00 +0100 Subject: [PATCH 23/34] Debugged the copy constructor of the Lattice class --- lib/lattice/Lattice_base.h | 51 +- lib/qcd/smearing/GaugeConfiguration.h | 470 +++++----- scripts/copyright | 36 +- tests/Test_main.cc | 1180 +++++++++++++------------ 4 files changed, 888 insertions(+), 849 deletions(-) diff --git a/lib/lattice/Lattice_base.h b/lib/lattice/Lattice_base.h index d97b1204..c91b7989 100644 --- a/lib/lattice/Lattice_base.h +++ b/lib/lattice/Lattice_base.h @@ -1,32 +1,33 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/lattice/Lattice_base.h +Source file: ./lib/lattice/Lattice_base.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_LATTICE_BASE_H #define GRID_LATTICE_BASE_H @@ -255,6 +256,18 @@ PARALLEL_FOR_LOOP checkerboard=0; } + Lattice(const Lattice& r){ // copy constructor + _grid = r._grid; + checkerboard = r.checkerboard; + _odata.resize(_grid->oSites());// essential + PARALLEL_FOR_LOOP + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss]=r._odata[ss]; + } + } + + + virtual ~Lattice(void) = default; template strong_inline Lattice & operator = (const sobj & r){ @@ -267,7 +280,7 @@ PARALLEL_FOR_LOOP template strong_inline Lattice & operator = (const Lattice & r){ this->checkerboard = r.checkerboard; conformable(*this,r); - std::cout< - class SmearedConfiguration { - public: - INHERIT_GIMPL_TYPES(Gimpl) ; +/*! + @brief Smeared configuration container - private: - const unsigned int smearingLevels; - Smear_Stout StoutSmearing; - std::vector SmearedSet; + It will behave like a configuration from the point of view of + the HMC update and integrators. + An "advanced configuration" object that can provide not only the + data to store the gauge configuration but also operations to manipulate + it, like smearing. - // Member functions - //==================================================================== - void fill_smearedSet(GaugeField& U){ - ThinLinks = &U; //attach the smearing routine to the field U + It stores a list of smeared configurations. +*/ +template +class SmearedConfiguration { + public: + INHERIT_GIMPL_TYPES(Gimpl); - //check the pointer is not null - if (ThinLinks==NULL) - std::cout << GridLogError << "[SmearedConfiguration] Error in ThinLinks pointer\n"; - - if (smearingLevels > 0){ - std::cout<< GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n"; - GaugeField previous_u(ThinLinks->_grid); + private: + const unsigned int smearingLevels; + Smear_Stout StoutSmearing; + std::vector SmearedSet; - previous_u = *ThinLinks; - for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){ - StoutSmearing.smear(SmearedSet[smearLvl],previous_u); - previous_u = SmearedSet[smearLvl]; + // Member functions + //==================================================================== + void fill_smearedSet(GaugeField& U) { + ThinLinks = &U; // attach the smearing routine to the field U - // For debug purposes - RealD impl_plaq = WilsonLoops::avgPlaquette(previous_u); - std::cout<< GridLogDebug << "[SmearedConfiguration] Plaq: " << impl_plaq<< std::endl; + // check the pointer is not null + if (ThinLinks == NULL) + std::cout << GridLogError + << "[SmearedConfiguration] Error in ThinLinks pointer\n"; - } + if (smearingLevels > 0) { + std::cout << GridLogDebug + << "[SmearedConfiguration] Filling SmearedSet\n"; + GaugeField previous_u(ThinLinks->_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); - GaugeLinkField SigmaKPrime_mu(grid); - GaugeLinkField GaugeKmu(grid), Cmu(grid); + previous_u = *ThinLinks; + for (int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl) { + StoutSmearing.smear(SmearedSet[smearLvl], previous_u); + previous_u = SmearedSet[smearLvl]; - StoutSmearing.BaseSmear(C, GaugeK); - SigmaK = zero; - iLambda = zero; - - for (int mu = 0; mu < Nd; mu++){ - Cmu = peekLorentz( C,mu); - GaugeKmu = peekLorentz(GaugeK,mu); - SigmaKPrime_mu = peekLorentz(SigmaKPrime,mu); - iQ = Ta(Cmu*adj(GaugeKmu)); - set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu); - pokeLorentz(SigmaK, SigmaKPrime_mu*e_iQ + adj(Cmu)*iLambda_mu, mu); - pokeLorentz(iLambda, iLambda_mu, mu); - } - StoutSmearing.derivative(SigmaK, iLambda, GaugeK);// derivative of SmearBase - return SigmaK; -} - - - -/*! @brief Returns smeared configuration at level 'Level' */ -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; - GaugeLinkField iQ2(grid), iQ3(grid), B1(grid), B2(grid), USigmap(grid); - GaugeLinkField unity(grid); - unity=1.0; - - LatticeComplex u(grid), w(grid); - LatticeComplex f0(grid), f1(grid), f2(grid); - LatticeComplex xi0(grid), xi1(grid), tmp(grid); - LatticeComplex u2(grid), w2(grid), cosw(grid); - LatticeComplex emiu(grid), e2iu(grid), qt(grid), fden(grid); - LatticeComplex r01(grid), r11(grid), r21(grid), r02(grid), r12(grid); - LatticeComplex r22(grid), tr1(grid), tr2(grid); - LatticeComplex b10(grid), b11(grid), b12(grid), b20(grid), b21(grid), b22(grid); - LatticeComplex LatticeUnitComplex(grid); - - LatticeUnitComplex = 1.0; - - // Exponential - iQ2 = iQ * iQ; - iQ3 = iQ * iQ2; - StoutSmearing.set_uw(u,w,iQ2,iQ3); - StoutSmearing.set_fj(f0,f1,f2,u,w); - e_iQ = f0*unity + timesMinusI(f1) * iQ - f2 * iQ2; - - // Getting B1, B2, Gamma and Lambda - // simplify this part, reduntant calculations in set_fj - xi0 = StoutSmearing.func_xi0(w); - xi1 = StoutSmearing.func_xi1(w); - u2 = u * u; - w2 = w * w; - cosw = cos(w); - - emiu = cos(u) - timesI(sin(u)); - e2iu = cos(2.0*u) + timesI(sin(2.0*u)); - - r01 = (2.0*u + timesI(2.0*(u2-w2))) * e2iu - + emiu * ((16.0*u*cosw + 2.0*u*(3.0*u2+w2)*xi0) + - timesI(-8.0*u2*cosw + 2.0*(9.0*u2+w2)*xi0)); - - r11 = (2.0*LatticeUnitComplex + timesI(4.0*u))* e2iu - + emiu * ((-2.0*cosw + (3.0*u2-w2)*xi0) + - timesI((2.0*u*cosw + 6.0*u*xi0))); - - r21 = 2.0*timesI(e2iu) - + emiu * (-3.0*u*xi0 + timesI(cosw - 3.0*xi0)); - - - r02 = -2.0 * e2iu + emiu * (-8.0*u2*xi0 + - timesI(2.0*u*(cosw + xi0 + 3.0*u2*xi1))); - - r12 = emiu * (2.0*u*xi0 + timesI(-cosw - xi0 + 3.0*u2*xi1)); - - r22 = emiu * (xi0 - timesI(3.0*u*xi1)); - - fden = LatticeUnitComplex/(2.0*(9.0*u2-w2)*(9.0*u2-w2)); - - b10 = 2.0 * u * r01 + (3.0* u2 - w2)*r02 - (30.0 * u2 + 2.0 * w2)*f0; - b11 = 2.0 * u * r11 + (3.0* u2 - w2)*r12 - (30.0 * u2 + 2.0 * w2)*f1; - b12 = 2.0 * u * r21 + (3.0* u2 - w2)*r22 - (30.0 * u2 + 2.0 * w2)*f2; - - b20 = r01 - (3.0*u)*r02 - (24.0*u)*f0; - b21 = r11 - (3.0*u)*r12 - (24.0*u)*f1; - b22 = r21 - (3.0*u)*r22 - (24.0*u)*f2; - - b10 *= fden; - b11 *= fden; - b12 *= fden; - b20 *= fden; - b21 *= fden; - b22 *= fden; - - - B1 = b10*unity + timesMinusI(b11) * iQ - b12 * iQ2; - B2 = b20*unity + timesMinusI(b21) * iQ - b22 * iQ2; - USigmap = GaugeK * Sigmap; - - tr1 = trace(USigmap*B1); - tr2 = trace(USigmap*B2); - - GaugeLinkField QUS = iQ * USigmap; - GaugeLinkField USQ = USigmap * iQ; - - GaugeLinkField iGamma = tr1 * iQ - timesI(tr2) * iQ2 + - timesI(f1) * USigmap + f2 * QUS + f2 * USQ; - - iLambda = Ta(iGamma); - -} - -//==================================================================== -public: - GaugeField* ThinLinks; /*!< @brief Pointer to the thin - links configuration */ - - /*! @brief 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))); + // For debug purposes + RealD impl_plaq = WilsonLoops::avgPlaquette(previous_u); + std::cout << GridLogDebug + << "[SmearedConfiguration] Plaq: " << impl_plaq << std::endl; + } } + } + //==================================================================== + 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); + GaugeLinkField SigmaKPrime_mu(grid); + GaugeLinkField GaugeKmu(grid), Cmu(grid); - /*! For just thin links */ - SmearedConfiguration(): - smearingLevels(0), - StoutSmearing(), - SmearedSet(), - ThinLinks(NULL){} + StoutSmearing.BaseSmear(C, GaugeK); + SigmaK = zero; + iLambda = zero; + for (int mu = 0; mu < Nd; mu++) { + Cmu = peekLorentz(C, mu); + GaugeKmu = peekLorentz(GaugeK, mu); + SigmaKPrime_mu = peekLorentz(SigmaKPrime, mu); + iQ = Ta(Cmu * adj(GaugeKmu)); + set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu); + pokeLorentz(SigmaK, SigmaKPrime_mu * e_iQ + adj(Cmu) * iLambda_mu, mu); + pokeLorentz(iLambda, iLambda_mu, mu); + } + StoutSmearing.derivative(SigmaK, iLambda, + GaugeK); // derivative of SmearBase + return SigmaK; + } - // attach the smeared routines to the thin links U and fill the smeared set - void set_GaugeField(GaugeField& U){ fill_smearedSet(U);} + /*! @brief Returns smeared configuration at level 'Level' */ + const GaugeField& get_smeared_conf(int Level) const { + return SmearedSet[Level]; + } -//==================================================================== - void smeared_force(GaugeField& SigmaTilde) const{ + //==================================================================== + 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; - if (smearingLevels > 0){ - GaugeField force(SigmaTilde._grid); - GaugeLinkField tmp_mu(SigmaTilde._grid); - force = SigmaTilde;//actually = U*SigmaTilde + LatticeComplex u(grid), w(grid); + LatticeComplex f0(grid), f1(grid), f2(grid); + LatticeComplex xi0(grid), xi1(grid), tmp(grid); + LatticeComplex u2(grid), w2(grid), cosw(grid); + LatticeComplex emiu(grid), e2iu(grid), qt(grid), fden(grid); + LatticeComplex r01(grid), r11(grid), r21(grid), r02(grid), r12(grid); + LatticeComplex r22(grid), tr1(grid), tr2(grid); + LatticeComplex b10(grid), b11(grid), b12(grid), b20(grid), b21(grid), + b22(grid); + LatticeComplex LatticeUnitComplex(grid); - for (int mu = 0; mu < Nd; mu++){ - // to get just SigmaTilde - tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu); - pokeLorentz(force, tmp_mu, mu); - } + LatticeUnitComplex = 1.0; - for(int ismr = smearingLevels - 1; ismr > 0; --ismr) - force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1)); + // Exponential + iQ2 = iQ * iQ; + iQ3 = iQ * iQ2; + StoutSmearing.set_uw(u, w, iQ2, iQ3); + StoutSmearing.set_fj(f0, f1, f2, u, w); + e_iQ = f0 * unity + timesMinusI(f1) * iQ - f2 * iQ2; - force = AnalyticSmearedForce(force,*ThinLinks); - - 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 -} - //==================================================================== + // Getting B1, B2, Gamma and Lambda + // simplify this part, reduntant calculations in set_fj + xi0 = StoutSmearing.func_xi0(w); + xi1 = StoutSmearing.func_xi1(w); + u2 = u * u; + w2 = w * w; + cosw = cos(w); + emiu = cos(u) - timesI(sin(u)); + e2iu = cos(2.0 * u) + timesI(sin(2.0 * u)); -GaugeField& get_SmearedU(){ - return SmearedSet[smearingLevels-1]; -} + r01 = (2.0 * u + timesI(2.0 * (u2 - w2))) * e2iu + + emiu * ((16.0 * u * cosw + 2.0 * u * (3.0 * u2 + w2) * xi0) + + timesI(-8.0 * u2 * cosw + 2.0 * (9.0 * u2 + w2) * xi0)); -GaugeField& get_U(bool smeared=false) { - // get the config, thin links by default - 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(); + r11 = (2.0 * LatticeUnitComplex + timesI(4.0 * u)) * e2iu + + emiu * ((-2.0 * cosw + (3.0 * u2 - w2) * xi0) + + timesI((2.0 * u * cosw + 6.0 * u * xi0))); - } - else { - RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); - std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; - return *ThinLinks; - } - } - else{ - RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); - std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl; - return *ThinLinks;} - } + r21 = + 2.0 * timesI(e2iu) + emiu * (-3.0 * u * xi0 + timesI(cosw - 3.0 * xi0)); + r02 = -2.0 * e2iu + + emiu * (-8.0 * u2 * xi0 + + timesI(2.0 * u * (cosw + xi0 + 3.0 * u2 * xi1))); + + r12 = emiu * (2.0 * u * xi0 + timesI(-cosw - xi0 + 3.0 * u2 * xi1)); + + r22 = emiu * (xi0 - timesI(3.0 * u * xi1)); + + fden = LatticeUnitComplex / (2.0 * (9.0 * u2 - w2) * (9.0 * u2 - w2)); + + b10 = 2.0 * u * r01 + (3.0 * u2 - w2) * r02 - (30.0 * u2 + 2.0 * w2) * f0; + b11 = 2.0 * u * r11 + (3.0 * u2 - w2) * r12 - (30.0 * u2 + 2.0 * w2) * f1; + b12 = 2.0 * u * r21 + (3.0 * u2 - w2) * r22 - (30.0 * u2 + 2.0 * w2) * f2; + + b20 = r01 - (3.0 * u) * r02 - (24.0 * u) * f0; + b21 = r11 - (3.0 * u) * r12 - (24.0 * u) * f1; + b22 = r21 - (3.0 * u) * r22 - (24.0 * u) * f2; + + b10 *= fden; + b11 *= fden; + b12 *= fden; + b20 *= fden; + b21 *= fden; + b22 *= fden; + + B1 = b10 * unity + timesMinusI(b11) * iQ - b12 * iQ2; + B2 = b20 * unity + timesMinusI(b21) * iQ - b22 * iQ2; + USigmap = GaugeK * Sigmap; + + tr1 = trace(USigmap * B1); + tr2 = trace(USigmap * B2); + + GaugeLinkField QUS = iQ * USigmap; + GaugeLinkField USQ = USigmap * iQ; + + GaugeLinkField iGamma = tr1 * iQ - timesI(tr2) * iQ2 + + timesI(f1) * USigmap + f2 * QUS + f2 * USQ; + + iLambda = Ta(iGamma); + } + + //==================================================================== + public: + GaugeField* + ThinLinks; /*!< @brief Pointer to the thin + links configuration */ + + /*! @brief 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))); + } + + /*! For just thin links */ + SmearedConfiguration() + : smearingLevels(0), StoutSmearing(), SmearedSet(), ThinLinks(NULL) {} + + // attach the smeared routines to the thin links U and fill the smeared set + void set_GaugeField(GaugeField& U) { fill_smearedSet(U); } + + //==================================================================== + void smeared_force(GaugeField& SigmaTilde) const { + if (smearingLevels > 0) { + GaugeField force = SigmaTilde; // actually = U*SigmaTilde + GaugeLinkField tmp_mu(SigmaTilde._grid); + + for (int mu = 0; mu < Nd; mu++) { + // to get just SigmaTilde + tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels - 1], mu)) * + peekLorentz(force, mu); + pokeLorentz(force, tmp_mu, mu); + } + + for (int ismr = smearingLevels - 1; ismr > 0; --ismr) + force = AnalyticSmearedForce(force, get_smeared_conf(ismr - 1)); + + force = AnalyticSmearedForce(force, *ThinLinks); + + 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 + } + //==================================================================== + + GaugeField& get_SmearedU() { return SmearedSet[smearingLevels - 1]; } + + GaugeField& get_U(bool smeared = false) { + // get the config, thin links by default + 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 { + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout << GridLogDebug << "getting Thin Plaq: " << impl_plaq + << std::endl; + return *ThinLinks; + } + } else { + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout << GridLogDebug << "getting Thin Plaq: " << impl_plaq + << std::endl; + return *ThinLinks; + } + } }; - - } - } - - - - - #endif diff --git a/scripts/copyright b/scripts/copyright index 76ed6603..92772f16 100755 --- a/scripts/copyright +++ b/scripts/copyright @@ -5,13 +5,13 @@ while (( "$#" )); do echo $1 cat > message <> message cat >> message < tmp.fil diff --git a/tests/Test_main.cc b/tests/Test_main.cc index 3cbe5229..7eb0107b 100644 --- a/tests/Test_main.cc +++ b/tests/Test_main.cc @@ -1,620 +1,666 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./tests/Test_main.cc +Source file: ./tests/Test_main.cc - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #include "Grid.h" - using namespace std; using namespace Grid; using namespace Grid::QCD; /* - Grid_main.cc(232): error: no suitable user-defined conversion from "Grid::iScalar, 4>>" to "const Grid::iScalar>>" exists + Grid_main.cc(232): error: no suitable user-defined conversion from +"Grid::iScalar, 4>>" to "const +Grid::iScalar>>" exists c_m = peekIdiot(scm,1,2); */ -template auto peekIdiot(const vobj &rhs,int i,int j) -> decltype(peekIndex<2>(rhs,0,0)) -{ - return peekIndex<2>(rhs,i,j); +template +auto peekIdiot(const vobj &rhs, int i, int j) + -> decltype(peekIndex<2>(rhs, 0, 0)) { + return peekIndex<2>(rhs, i, j); } -template auto peekDumKopf(const vobj &rhs,int i,int j) -> decltype(peekIndex<3>(rhs,0,0)) -{ - return peekIndex<3>(rhs,i,j); +template +auto peekDumKopf(const vobj &rhs, int i, int j) + -> decltype(peekIndex<3>(rhs, 0, 0)) { + return peekIndex<3>(rhs, i, j); } -template auto peekDumKopf(const vobj &rhs,int i) -> decltype(peekIndex<3>(rhs,0)) -{ - return peekIndex<3>(rhs,i); +template +auto peekDumKopf(const vobj &rhs, int i) -> decltype(peekIndex<3>(rhs, 0)) { + return peekIndex<3>(rhs, i); } -int main (int argc, char ** argv) -{ - Grid_init(&argc,&argv); +int main(int argc, char **argv) { + Grid_init(&argc, &argv); - std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(4,vComplex::Nsimd()); - std::vector mpi_layout = GridDefaultMpi(); + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(4, vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); latt_size.resize(4); #ifdef AVX512 - for(int omp=128;omp<236;omp+=16){ + for (int omp = 128; omp < 236; omp += 16) { #else - for(int omp=1;omp<2;omp*=20){ + for (int omp = 1; omp < 2; omp *= 20) { #endif #ifdef OMP - omp_set_num_threads(omp); -#endif - - for(int lat=8;lat<=16;lat+=40){ - - std::cout << "Lat "< saved; - SerialRNG.GetState(saved,0); - SerialRNG1.SetState(saved,0); - - RealD dd1,dd2; - - std::cout << "Testing RNG state save restore"< iGammaFive; - ColourMatrix cmat; - - random(FineRNG,Foo); - gaussian(FineRNG,Bar); - random(FineRNG,scFoo); - random(FineRNG,scBar); - - random(FineRNG,cMat); - random(FineRNG,sMat); - random(FineRNG,scMat); - random(FineRNG,lcMat); - random(FineRNG,cVec); - random(FineRNG,sVec); - random(FineRNG,scVec); - - - fflush(stdout); - - TComplex tr = trace(cmat); - - - cVec = cMat * cVec; // LatticeColourVector = LatticeColourMatrix * LatticeColourVector - sVec = sMat * sVec; // LatticeSpinVector = LatticeSpinMatrix * LatticeSpinVector - scVec= scMat * scVec;// LatticeSpinColourVector = LatticeSpinColourMatrix * LatticeSpinColourVector - scVec= cMat * scVec; // LatticeSpinColourVector = LatticeColourMatrix * LatticeSpinColourVector - scVec= sMat * scVec; // LatticeSpinColourVector = LatticeSpinMatrix * LatticeSpinColourVector - - cMat = outerProduct(cVec,cVec); - scalar = localInnerProduct(cVec,cVec); - - cMat = Ta(cMat); //traceless antihermitian - - - scalar += scalar; - scalar -= scalar; - scalar *= scalar; - add(scalar,scalar,scalar); - sub(scalar,scalar,scalar); - mult(scalar,scalar,scalar); - - mac(scalar,scalar,scalar); - scalar = scalar+scalar; - scalar = scalar-scalar; - scalar = scalar*scalar; - - scalar=outerProduct(scalar,scalar); - - scalar=adj(scalar); - - // rscalar=real(scalar); - // iscalar=imag(scalar); - // scalar =cmplx(rscalar,iscalar); - PokeIndex(cVec,scalar,1); - - - scalar=transpose(scalar); - scalar=TransposeIndex(scalar); - scalar=TraceIndex(scalar); - scalar=PeekIndex(cVec,0); - - scalar=trace(scalar); - scalar=localInnerProduct(cVec,cVec); - scalar=localNorm2(cVec); - -// -=,+=,*=,() -// add,+,sub,-,mult,mac,* -// adj,conjugate -// real,imag -// transpose,transposeIndex -// trace,traceIndex -// peekIndex -// innerProduct,outerProduct, -// localNorm2 -// localInnerProduct - - - scMat = sMat*scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix * LatticeSpinColourMatrix - - - /////////////////////// - // Non-lattice (const objects) * Lattice - ColourMatrix cm; - SpinColourMatrix scm; - vSpinColourMatrix vscm; - Complex cplx(1.0); - Integer myint=1; - double mydouble=1.0; - - // vSpinColourMatrix vscm; - scMat = cMat*scMat; - scm = cm * scm; // SpinColourMatrix = ColourMatrix * SpinColourMatrix - scm = scm *cm; // SpinColourMatrix = SpinColourMartix * ColourMatrix - scm = GammaFive * scm ; // SpinColourMatrix = SpinMatrix * SpinColourMatrix - scm = scm* GammaFive ; // SpinColourMatrix = SpinColourMatrix * SpinMatrix - - scm = scm*cplx; - vscm = vscm*cplx; - scMat = scMat*cplx; - - scm = cplx*scm; - vscm = cplx*vscm; - scMat = cplx*scMat; - scm = myint*scm; - vscm = myint*vscm; - scMat = scMat*myint; - - scm = scm*mydouble; - vscm = vscm*mydouble; - scMat = scMat*mydouble; - scMat = mydouble*scMat; - cMat = mydouble*cMat; - - sMat = adj(sMat); // LatticeSpinMatrix adjoint - sMat = iGammaFive*sMat; // SpinMatrix * LatticeSpinMatrix - sMat = GammaFive*sMat; // SpinMatrix * LatticeSpinMatrix - scMat= adj(scMat); - cMat= adj(cMat); - cm=adj(cm); - scm=adj(scm); - scm=transpose(scm); - scm=transposeIndex<1>(scm); - - - random(SerialRNG, cm); - std::cout< mysite {0,0,0,0}; - random(FineRNG,cMat); - cMat = Ta(cMat); - peekSite(cm, cMat, mysite); - std::cout<::traceIndex(sc_m); // Map to traceColour - c_m = TensorIndexRecursion::traceIndex(sc_m); // map to traceSpin - - c = TensorIndexRecursion::traceIndex(s_m); - c = TensorIndexRecursion::traceIndex(c_m); - - s_m = TensorIndexRecursion::peekIndex(scm,0,0); - c_m = TensorIndexRecursion::peekIndex(scm,1,2); - // c_m = peekSpin(scm,1,2); - // c_m = peekIdiot(scm,1,2); - - printf("c. Level %d\n",c_m.TensorLevel); - printf("c. Level %d\n",c_m().TensorLevel); - printf("c. Level %d\n",c_m()().TensorLevel); - - c_m()() = scm()(0,0); //ColourComponents of CM <= ColourComponents of SpinColourMatrix - scm()(1,1) = cm()(); //ColourComponents of CM <= ColourComponents of SpinColourMatrix - c = scm()(1,1)(1,2); - scm()(1,1)(2,1) = c; - - // pokeIndex (c_m,c,0,0); - } - - FooBar = Bar; - /* - { - std::vector coor(4); - for(int d=0;d<4;d++) coor[d] = 0; - peekSite(cmat,Foo,coor); - Foo = zero; - pokeSite(cmat,Foo,coor); - } - random(Foo); - */ - lex_sites(Foo); - - - Integer mm[4]; - mm[0]=1; - mm[1]=Fine._rdimensions[0]; - mm[2]=Fine._ldimensions[0]*Fine._ldimensions[1]; - mm[3]=Fine._ldimensions[0]*Fine._ldimensions[1]*Fine._ldimensions[2]; - - LatticeInteger lex(&Fine); - lex=zero; - for(int d=0;d<4;d++){ - LatticeInteger coor(&Fine); - LatticeCoordinate(coor,d); - lex = lex + coor*mm[d]; - - } - - - - // Bar = zero; - // Bar = where(lex coor(4); - for(coor[3]=0;coor[3] saved; + SerialRNG.GetState(saved, 0); + SerialRNG1.SetState(saved, 0); + + RealD dd1, dd2; + + std::cout << "Testing RNG state save restore" << std::endl; + for (int i = 0; i < 10; i++) { + random(SerialRNG, dd1); + random(SerialRNG1, dd2); + std::cout << "i " << i << " " << dd1 << " " << dd2 << std::endl; + } + LatticeColourMatrix Foo(&Fine); + LatticeColourMatrix Bar(&Fine); + + LatticeSpinColourMatrix scFoo(&Fine); + LatticeSpinColourMatrix scBar(&Fine); + + LatticeColourMatrix Shifted(&Fine); + LatticeColourMatrix ShiftedCheck(&Fine); + LatticeColourMatrix rShifted(&rbFine); + LatticeColourMatrix bShifted(&rbFine); + + LatticeColourMatrix rFoo(&rbFine); + LatticeColourMatrix bFoo(&rbFine); + + LatticeColourMatrix FooBar(&Fine); + LatticeSpinColourMatrix scFooBar(&Fine); + + LatticeColourVector cVec(&Fine); + LatticeSpinVector sVec(&Fine); + LatticeSpinColourVector scVec(&Fine); + + LatticeColourMatrix cMat(&Fine); + LatticeSpinMatrix sMat(&Fine); + LatticeSpinColourMatrix scMat(&Fine); + + LatticeLorentzColourMatrix lcMat(&Fine); + + LatticeComplex scalar(&Fine); + LatticeReal rscalar(&Fine); + LatticeReal iscalar(&Fine); + + SpinMatrix GammaFive; + iSpinMatrix iGammaFive; + ColourMatrix cmat; + + random(FineRNG, Foo); + gaussian(FineRNG, Bar); + random(FineRNG, scFoo); + random(FineRNG, scBar); + + random(FineRNG, cMat); + random(FineRNG, sMat); + random(FineRNG, scMat); + random(FineRNG, lcMat); + random(FineRNG, cVec); + random(FineRNG, sVec); + random(FineRNG, scVec); + + fflush(stdout); + + LatticeColourMatrix newFoo = Foo; + // confirm correctness of copy constructor + Bar = Foo - newFoo; + std::cout << "Copy constructor diff check: "; + double test_cc = norm2(Bar); + if (test_cc < 1e-5){ + std::cout << "OK\n"; + } + else{ + std::cout << "fail\n"; + abort(); + } + + TComplex tr = trace(cmat); + + cVec = cMat * cVec; // LatticeColourVector = LatticeColourMatrix + // * LatticeColourVector + sVec = sMat * sVec; // LatticeSpinVector = LatticeSpinMatrix + // * LatticeSpinVector + scVec = scMat * scVec; // LatticeSpinColourVector = + // LatticeSpinColourMatrix * + // LatticeSpinColourVector + scVec = cMat * scVec; // LatticeSpinColourVector = LatticeColourMatrix + // * LatticeSpinColourVector + scVec = sMat * scVec; // LatticeSpinColourVector = LatticeSpinMatrix + // * LatticeSpinColourVector + + cMat = outerProduct(cVec, cVec); + scalar = localInnerProduct(cVec, cVec); + + cMat = Ta(cMat); // traceless antihermitian + + scalar += scalar; + scalar -= scalar; + scalar *= scalar; + add(scalar, scalar, scalar); + sub(scalar, scalar, scalar); + mult(scalar, scalar, scalar); + + mac(scalar, scalar, scalar); + scalar = scalar + scalar; + scalar = scalar - scalar; + scalar = scalar * scalar; + + scalar = outerProduct(scalar, scalar); + + scalar = adj(scalar); + + // rscalar=real(scalar); + // iscalar=imag(scalar); + // scalar =cmplx(rscalar,iscalar); + PokeIndex(cVec, scalar, 1); + + scalar = transpose(scalar); + scalar = TransposeIndex(scalar); + scalar = TraceIndex(scalar); + scalar = PeekIndex(cVec, 0); + + scalar = trace(scalar); + scalar = localInnerProduct(cVec, cVec); + scalar = localNorm2(cVec); + + // -=,+=,*=,() + // add,+,sub,-,mult,mac,* + // adj,conjugate + // real,imag + // transpose,transposeIndex + // trace,traceIndex + // peekIndex + // innerProduct,outerProduct, + // localNorm2 + // localInnerProduct + + scMat = sMat * scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix + // * LatticeSpinColourMatrix + + /////////////////////// + // Non-lattice (const objects) * Lattice + ColourMatrix cm; + SpinColourMatrix scm; + vSpinColourMatrix vscm; + Complex cplx(1.0); + Integer myint = 1; + double mydouble = 1.0; + + // vSpinColourMatrix vscm; + scMat = cMat * scMat; + scm = + cm * scm; // SpinColourMatrix = ColourMatrix * SpinColourMatrix + scm = scm * cm; // SpinColourMatrix = SpinColourMartix * ColourMatrix + scm = GammaFive * + scm; // SpinColourMatrix = SpinMatrix * SpinColourMatrix + scm = + scm * GammaFive; // SpinColourMatrix = SpinColourMatrix * SpinMatrix + + scm = scm * cplx; + vscm = vscm * cplx; + scMat = scMat * cplx; + + scm = cplx * scm; + vscm = cplx * vscm; + scMat = cplx * scMat; + scm = myint * scm; + vscm = myint * vscm; + scMat = scMat * myint; + + scm = scm * mydouble; + vscm = vscm * mydouble; + scMat = scMat * mydouble; + scMat = mydouble * scMat; + cMat = mydouble * cMat; + + sMat = adj(sMat); // LatticeSpinMatrix adjoint + sMat = iGammaFive * sMat; // SpinMatrix * LatticeSpinMatrix + sMat = GammaFive * sMat; // SpinMatrix * LatticeSpinMatrix + scMat = adj(scMat); + cMat = adj(cMat); + cm = adj(cm); + scm = adj(scm); + scm = transpose(scm); + scm = transposeIndex<1>(scm); + + random(SerialRNG, cm); + std::cout << GridLogMessage << cm << std::endl; + + cm = Ta(cm); + TComplex tracecm = trace(cm); + std::cout << GridLogMessage << cm << std::endl; + + cm = Exponentiate(cm, 2.0, 12); + std::cout << GridLogMessage << cm << " " << std::endl; + Complex det = Determinant(cm); + std::cout << GridLogMessage << "determinant: " << det << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + cm = ProjectOnGroup(cm); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + cm = ProjectOnGroup(cm); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + // det = Determinant(cm); + // std::cout< mysite{0, 0, 0, 0}; + random(FineRNG, cMat); + cMat = Ta(cMat); + peekSite(cm, cMat, mysite); + std::cout << GridLogMessage << cm << " " << std::endl; + cm = Exponentiate(cm, 1.0, 12); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + std::cout << GridLogMessage << "norm cMmat : " << norm2(cMat) + << std::endl; + cMat = expMat(cMat, ComplexD(1.0, 0.0)); + std::cout << GridLogMessage << "norm expMat: " << norm2(cMat) + << std::endl; + peekSite(cm, cMat, mysite); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "determinant: " << Determinant(cm) + << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + // LatticeComplex trlcMat(&Fine); + // trlcMat = trace(lcMat); // Trace involving iVector - now generates + // error + + { // Peek-ology and Poke-ology, with a little app-ology + Complex c; + ColourMatrix c_m; + SpinMatrix s_m; + SpinColourMatrix sc_m; + + s_m = TensorIndexRecursion::traceIndex( + sc_m); // Map to traceColour + c_m = TensorIndexRecursion::traceIndex( + sc_m); // map to traceSpin + + c = TensorIndexRecursion::traceIndex(s_m); + c = TensorIndexRecursion::traceIndex(c_m); + + s_m = TensorIndexRecursion::peekIndex(scm, 0, 0); + c_m = TensorIndexRecursion::peekIndex(scm, 1, 2); + // c_m = peekSpin(scm,1,2); + // c_m = peekIdiot(scm,1,2); + + printf("c. Level %d\n", c_m.TensorLevel); + printf("c. Level %d\n", c_m().TensorLevel); + printf("c. Level %d\n", c_m()().TensorLevel); + + c_m()() = scm()(0, 0); // ColourComponents of CM <= ColourComponents of + // SpinColourMatrix + scm()(1, 1) = cm()(); // ColourComponents of CM <= ColourComponents of + // SpinColourMatrix + c = scm()(1, 1)(1, 2); + scm()(1, 1)(2, 1) = c; + + // pokeIndex (c_m,c,0,0); + } + + FooBar = Bar; + /* + { + std::vector coor(4); + for(int d=0;d<4;d++) coor[d] = 0; + peekSite(cmat,Foo,coor); + Foo = zero; + pokeSite(cmat,Foo,coor); + } + random(Foo); + */ + lex_sites(Foo); + + Integer mm[4]; + mm[0] = 1; + mm[1] = Fine._rdimensions[0]; + mm[2] = Fine._ldimensions[0] * Fine._ldimensions[1]; + mm[3] = + Fine._ldimensions[0] * Fine._ldimensions[1] * Fine._ldimensions[2]; + + LatticeInteger lex(&Fine); + lex = zero; + for (int d = 0; d < 4; d++) { + LatticeInteger coor(&Fine); + LatticeCoordinate(coor, d); + lex = lex + coor * mm[d]; + } + + // Bar = zero; + // Bar = where(lex coor(4); + for (coor[3] = 0; coor[3] < latt_size[3] / mpi_layout[3]; coor[3]++) { + for (coor[2] = 0; coor[2] < latt_size[2] / mpi_layout[2]; coor[2]++) { + for (coor[1] = 0; coor[1] < latt_size[1] / mpi_layout[1]; + coor[1]++) { + for (coor[0] = 0; coor[0] < latt_size[0] / mpi_layout[0]; + coor[0]++) { + ColourMatrix bar; + peekSite(bar, Bar, coor); + for (int r = 0; r < 3; r++) { + for (int c = 0; c < 3; c++) { + // cout<<"bar "<black - rShifted = Cshift(bFoo,dir,shift); // Shift black->red - - ShiftedCheck=zero; - setCheckerboard(ShiftedCheck,bShifted); // Put them all together - setCheckerboard(ShiftedCheck,rShifted); // and check the results (later) - - // Check results - std::vector coor(4); - for(coor[3]=0;coor[3] diff; - - std::vector shiftcoor = coor; - shiftcoor[dir]=(shiftcoor[dir]+shift+latt_size[dir])%(latt_size[dir]/mpi_layout[dir]); + if (Fine.IsBoss()) { + printf("Cshift Mult: NumThread %d , Lattice size %d , %f us per call\n", + omp, lat, (t1 - t0) / ncall); + printf("Cshift Mult: NumThread %d , Lattice size %d , %f Mflop/s\n", + omp, lat, flops / (t1 - t0)); + printf("Cshift Mult: NumThread %d , Lattice size %d , %f MB/s\n", omp, + lat, bytes / (t1 - t0)); + } + // pickCheckerboard(0,rFoo,FooBar); + // pickCheckerboard(1,bFoo,FooBar); + // setCheckerboard(FooBar,rFoo); + // setCheckerboard(FooBar,bFoo); - std::vector rl(4); - for(int dd=0;dd<4;dd++){ - rl[dd] = latt_size[dd]/simd_layout[dd]/mpi_layout[dd]; - } - int lex = coor[0]%rl[0] - + (coor[1]%rl[1])*rl[0] - + (coor[2]%rl[2])*rl[0]*rl[1] - + (coor[3]%rl[3])*rl[0]*rl[1]*rl[2]; - lex += - +1000*(coor[0]/rl[0]) - +1000*(coor[1]/rl[1])*simd_layout[0] - +1000*(coor[2]/rl[2])*simd_layout[0]*simd_layout[1] - +1000*(coor[3]/rl[3])*simd_layout[0]*simd_layout[1]*simd_layout[2]; + double nrm = 0; - int lex_coor = shiftcoor[0]%rl[0] - + (shiftcoor[1]%rl[1])*rl[0] - + (shiftcoor[2]%rl[2])*rl[0]*rl[1] - + (shiftcoor[3]%rl[3])*rl[0]*rl[1]*rl[2]; - lex_coor += - +1000*(shiftcoor[0]/rl[0]) - +1000*(shiftcoor[1]/rl[1])*simd_layout[0] - +1000*(shiftcoor[2]/rl[2])*simd_layout[0]*simd_layout[1] - +1000*(shiftcoor[3]/rl[3])*simd_layout[0]*simd_layout[1]*simd_layout[2]; + LatticeColourMatrix deriv(&Fine); + double half = 0.5; + deriv = 0.5 * Cshift(Foo, 0, 1) - 0.5 * Cshift(Foo, 0, -1); - ColourMatrix foo; - ColourMatrix bar; - ColourMatrix shifted1; - ColourMatrix shifted2; - ColourMatrix shifted3; - ColourMatrix foobar1; - ColourMatrix foobar2; - ColourMatrix mdiff,amdiff; - - peekSite(shifted1,Shifted,coor); - peekSite(shifted2,Foo,shiftcoor); - peekSite(shifted3,ShiftedCheck,coor); - peekSite(foo,Foo,coor); - - mdiff = shifted1-shifted2; - amdiff=adj(mdiff); - ColourMatrix prod = amdiff*mdiff; - Complex trprod = trace(prod); - Real Ttr=real(trprod); - double nn=Ttr; - if ( nn > 0 ) - cout<<"Shift real trace fail "< 0 ) - cout<<"Shift fail (shifted1/shifted2-ref) "< 0 ) - cout<<"Shift rb fail (shifted3/shifted2-ref) "<black + rShifted = Cshift(bFoo, dir, shift); // Shift black->red + ShiftedCheck = zero; + setCheckerboard(ShiftedCheck, bShifted); // Put them all together + setCheckerboard(ShiftedCheck, + rShifted); // and check the results (later) - /* - // Testing Smearing routine compilation, separate in a different file - GridCartesian Fine(latt_size,simd_layout,mpi_layout); - Smear_APE< PeriodicGimplR > APEsmearing; // periodic gauge implemetation - Smear_Stout< PeriodicGimplR > StoutSmearing(&APEsmearing); - SmearedConfiguration< PeriodicGimplR > SmartConf(&Fine, 3, StoutSmearing); - - std::cout< coor(4); + for (coor[3] = 0; coor[3] < latt_size[3] / mpi_layout[3]; coor[3]++) { + for (coor[2] = 0; coor[2] < latt_size[2] / mpi_layout[2]; + coor[2]++) { + for (coor[1] = 0; coor[1] < latt_size[1] / mpi_layout[1]; + coor[1]++) { + for (coor[0] = 0; coor[0] < latt_size[0] / mpi_layout[0]; + coor[0]++) { + std::complex diff; + + std::vector shiftcoor = coor; + shiftcoor[dir] = (shiftcoor[dir] + shift + latt_size[dir]) % + (latt_size[dir] / mpi_layout[dir]); + + std::vector rl(4); + for (int dd = 0; dd < 4; dd++) { + rl[dd] = latt_size[dd] / simd_layout[dd] / mpi_layout[dd]; + } + int lex = coor[0] % rl[0] + (coor[1] % rl[1]) * rl[0] + + (coor[2] % rl[2]) * rl[0] * rl[1] + + (coor[3] % rl[3]) * rl[0] * rl[1] * rl[2]; + lex += +1000 * (coor[0] / rl[0]) + + 1000 * (coor[1] / rl[1]) * simd_layout[0] + + 1000 * (coor[2] / rl[2]) * simd_layout[0] * + simd_layout[1] + + 1000 * (coor[3] / rl[3]) * simd_layout[0] * + simd_layout[1] * simd_layout[2]; + + int lex_coor = shiftcoor[0] % rl[0] + + (shiftcoor[1] % rl[1]) * rl[0] + + (shiftcoor[2] % rl[2]) * rl[0] * rl[1] + + (shiftcoor[3] % rl[3]) * rl[0] * rl[1] * rl[2]; + lex_coor += +1000 * (shiftcoor[0] / rl[0]) + + 1000 * (shiftcoor[1] / rl[1]) * simd_layout[0] + + 1000 * (shiftcoor[2] / rl[2]) * simd_layout[0] * + simd_layout[1] + + 1000 * (shiftcoor[3] / rl[3]) * simd_layout[0] * + simd_layout[1] * simd_layout[2]; + + ColourMatrix foo; + ColourMatrix bar; + ColourMatrix shifted1; + ColourMatrix shifted2; + ColourMatrix shifted3; + ColourMatrix foobar1; + ColourMatrix foobar2; + ColourMatrix mdiff, amdiff; + + peekSite(shifted1, Shifted, coor); + peekSite(shifted2, Foo, shiftcoor); + peekSite(shifted3, ShiftedCheck, coor); + peekSite(foo, Foo, coor); + + mdiff = shifted1 - shifted2; + amdiff = adj(mdiff); + ColourMatrix prod = amdiff * mdiff; + Complex trprod = trace(prod); + Real Ttr = real(trprod); + double nn = Ttr; + if (nn > 0) + cout << "Shift real trace fail " << coor[0] << coor[1] + << coor[2] << coor[3] << endl; + + for (int r = 0; r < 3; r++) { + for (int c = 0; c < 3; c++) { + diff = shifted1()()(r, c) - shifted2()()(r, c); + nn = real(conjugate(diff) * diff); + if (nn > 0) + cout << "Shift fail (shifted1/shifted2-ref) " << coor[0] + << coor[1] << coor[2] << coor[3] << " " + << shifted1()()(r, c) << " " << shifted2()()(r, c) + << " " << foo()()(r, c) << " lex expect " + << lex_coor << " lex " << lex << endl; + else if (0) + cout << "Shift pass 1vs2 " << coor[0] << coor[1] + << coor[2] << coor[3] << " " << shifted1()()(r, c) + << " " << shifted2()()(r, c) << " " + << foo()()(r, c) << " lex expect " << lex_coor + << " lex " << lex << endl; + } + } + + for (int r = 0; r < 3; r++) { + for (int c = 0; c < 3; c++) { + diff = shifted3()()(r, c) - shifted2()()(r, c); + nn = real(conjugate(diff) * diff); + if (nn > 0) + cout << "Shift rb fail (shifted3/shifted2-ref) " + << coor[0] << coor[1] << coor[2] << coor[3] << " " + << shifted3()()(r, c) << " " << shifted2()()(r, c) + << " " << foo()()(r, c) << " lex expect " + << lex_coor << " lex " << lex << endl; + else if (0) + cout << "Shift rb pass 3vs2 " << coor[0] << coor[1] + << coor[2] << coor[3] << " " << shifted3()()(r, c) + << " " << shifted2()()(r, c) << " " + << foo()()(r, c) << " lex expect " << lex_coor + << " lex " << lex << endl; + } + } + peekSite(bar, Bar, coor); + + peekSite(foobar1, FooBar, coor); + foobar2 = foo * bar; + for (int r = 0; r < Nc; r++) { + for (int c = 0; c < Nc; c++) { + diff = foobar2()()(r, c) - foobar1()()(r, c); + nrm = nrm + real(conjugate(diff) * diff); + } + } + } + } + } + } + if (Fine.IsBoss()) { + std::cout << GridLogMessage + << "LatticeColorMatrix * LatticeColorMatrix nrm diff = " + << nrm << std::endl; + } + } + } + + } // loop for lat + } // loop for omp + + /* + // Testing Smearing routine compilation, separate in a different file + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + Smear_APE< PeriodicGimplR > APEsmearing; // periodic gauge implemetation + Smear_Stout< PeriodicGimplR > StoutSmearing(&APEsmearing); + SmearedConfiguration< PeriodicGimplR > SmartConf(&Fine, 3, StoutSmearing); + + std::cout< Date: Wed, 6 Jul 2016 14:50:01 -0400 Subject: [PATCH 24/34] Added option to prevent CG from exiting when it fails to converge --- lib/algorithms/iterative/ConjugateGradient.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index e0431a53..f5102019 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -40,9 +40,10 @@ namespace Grid { template class ConjugateGradient : public OperatorFunction { public: + bool ErrorOnNoConverge; //throw an assert when the CG fails to converge. Defaults true. RealD Tolerance; Integer MaxIterations; - ConjugateGradient(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) { + ConjugateGradient(RealD tol,Integer maxit, bool err_on_no_conv = true) : Tolerance(tol), MaxIterations(maxit), ErrorOnNoConverge(err_on_no_conv){ }; @@ -137,13 +138,15 @@ public: std::cout< Date: Wed, 6 Jul 2016 15:57:04 -0400 Subject: [PATCH 25/34] Implemented mixed precision CG. Fixed filelist to exclude lib/Old directory and include Config.h. --- lib/Algorithms.h | 1 + lib/Make.inc | 4 +- .../iterative/ConjugateGradientMixedPrec.h | 141 ++++++++++++++++++ lib/lattice/Lattice_ET.h | 6 + lib/lattice/Lattice_transfer.h | 90 +++++++++++ lib/tensors/Tensor_extract_merge.h | 28 ++++ lib/tensors/Tensor_traits.h | 30 ++++ scripts/filelist | 3 +- tests/Make.inc | 22 +-- 9 files changed, 311 insertions(+), 14 deletions(-) create mode 100644 lib/algorithms/iterative/ConjugateGradientMixedPrec.h diff --git a/lib/Algorithms.h b/lib/Algorithms.h index 0a3d34ce..a0c37b36 100644 --- a/lib/Algorithms.h +++ b/lib/Algorithms.h @@ -44,6 +44,7 @@ Author: Peter Boyle #include #include +#include // Lanczos support #include diff --git a/lib/Make.inc b/lib/Make.inc index 8763692a..90fe6b7f 100644 --- a/lib/Make.inc +++ b/lib/Make.inc @@ -1,4 +1,4 @@ -HFILES=./Algorithms.h ./AlignedAllocator.h ./Cartesian.h ./Communicator.h ./Cshift.h ./Grid.h ./Init.h ./Lattice.h ./Lexicographic.h ./Log.h ./Old/Tensor_peek.h ./Old/Tensor_poke.h ./PerfCount.h ./Simd.h ./Stencil.h ./Tensors.h ./Threads.h ./Timer.h ./algorithms/CoarsenedMatrix.h ./algorithms/LinearOperator.h ./algorithms/Preconditioner.h ./algorithms/SparseMatrix.h ./algorithms/approx/Chebyshev.h ./algorithms/approx/MultiShiftFunction.h ./algorithms/approx/Remez.h ./algorithms/approx/Zolotarev.h ./algorithms/approx/bigfloat.h ./algorithms/approx/bigfloat_double.h ./algorithms/iterative/AdefGeneric.h ./algorithms/iterative/ConjugateGradient.h ./algorithms/iterative/ConjugateGradientMultiShift.h ./algorithms/iterative/ConjugateResidual.h ./algorithms/iterative/DenseMatrix.h ./algorithms/iterative/EigenSort.h ./algorithms/iterative/Francis.h ./algorithms/iterative/Householder.h ./algorithms/iterative/ImplicitlyRestartedLanczos.h ./algorithms/iterative/Matrix.h ./algorithms/iterative/MatrixUtils.h ./algorithms/iterative/NormalEquations.h ./algorithms/iterative/PrecConjugateResidual.h ./algorithms/iterative/PrecGeneralisedConjugateResidual.h ./algorithms/iterative/SchurRedBlack.h ./cartesian/Cartesian_base.h ./cartesian/Cartesian_full.h ./cartesian/Cartesian_red_black.h ./communicator/Communicator_base.h ./cshift/Cshift_common.h ./cshift/Cshift_mpi.h ./cshift/Cshift_none.h ./lattice/Lattice_ET.h ./lattice/Lattice_arith.h ./lattice/Lattice_base.h ./lattice/Lattice_comparison.h ./lattice/Lattice_comparison_utils.h ./lattice/Lattice_conformable.h ./lattice/Lattice_coordinate.h ./lattice/Lattice_local.h ./lattice/Lattice_overload.h ./lattice/Lattice_peekpoke.h ./lattice/Lattice_reality.h ./lattice/Lattice_reduction.h ./lattice/Lattice_rng.h ./lattice/Lattice_trace.h ./lattice/Lattice_transfer.h ./lattice/Lattice_transpose.h ./lattice/Lattice_unary.h ./lattice/Lattice_where.h ./parallelIO/BinaryIO.h ./parallelIO/NerscIO.h ./pugixml/pugixml.h ./qcd/QCD.h ./qcd/action/ActionBase.h ./qcd/action/ActionParams.h ./qcd/action/Actions.h ./qcd/action/fermion/CayleyFermion5D.h ./qcd/action/fermion/ContinuedFractionFermion5D.h ./qcd/action/fermion/DomainWallFermion.h ./qcd/action/fermion/FermionOperator.h ./qcd/action/fermion/FermionOperatorImpl.h ./qcd/action/fermion/MobiusFermion.h ./qcd/action/fermion/MobiusZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h ./qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonContfracTanhFermion.h ./qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h ./qcd/action/fermion/PartialFractionFermion5D.h ./qcd/action/fermion/ScaledShamirFermion.h ./qcd/action/fermion/ShamirZolotarevFermion.h ./qcd/action/fermion/WilsonCompressor.h ./qcd/action/fermion/WilsonFermion.h ./qcd/action/fermion/WilsonFermion5D.h ./qcd/action/fermion/WilsonKernels.h ./qcd/action/fermion/WilsonTMFermion.h ./qcd/action/fermion/g5HermitianLinop.h ./qcd/action/fermion/WilsonKernelsAsmBody.h ./qcd/action/gauge/GaugeImpl.h ./qcd/action/gauge/PlaqPlusRectangleAction.h ./qcd/action/gauge/WilsonGaugeAction.h ./qcd/action/pseudofermion/EvenOddSchurDifferentiable.h ./qcd/action/pseudofermion/OneFlavourEvenOddRational.h ./qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h ./qcd/action/pseudofermion/OneFlavourRational.h ./qcd/action/pseudofermion/OneFlavourRationalRatio.h ./qcd/action/pseudofermion/TwoFlavour.h ./qcd/action/pseudofermion/TwoFlavourEvenOdd.h ./qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h ./qcd/action/pseudofermion/TwoFlavourRatio.h ./qcd/hmc/HMC.h ./qcd/hmc/HmcRunner.h ./qcd/hmc/NerscCheckpointer.h ./qcd/hmc/integrators/Integrator.h ./qcd/hmc/integrators/Integrator_algorithm.h ./qcd/spin/Dirac.h ./qcd/spin/TwoSpinor.h ./qcd/utils/CovariantCshift.h ./qcd/utils/LinalgUtils.h ./qcd/utils/SUn.h ./qcd/utils/SpaceTimeGrid.h ./qcd/utils/WilsonLoops.h ./serialisation/BaseIO.h ./serialisation/BinaryIO.h ./serialisation/MacroMagic.h ./serialisation/Serialisation.h ./serialisation/TextIO.h ./serialisation/XmlIO.h ./simd/Grid_avx.h ./simd/Grid_avx512.h ./simd/Grid_empty.h ./simd/Grid_imci.h ./simd/Grid_neon.h ./simd/Grid_qpx.h ./simd/Grid_sse4.h ./simd/Grid_vector_types.h ./simd/Grid_vector_unops.h ./simd/Intel512avx.h ./simd/Intel512wilson.h ./simd/Intel512common.h ./simd/Intel512double.h ./simd/Intel512imci.h ./simd/Intel512single.h ./stencil/Lebesgue.h ./tensors/Tensor_Ta.h ./tensors/Tensor_arith.h ./tensors/Tensor_arith_add.h ./tensors/Tensor_arith_mac.h ./tensors/Tensor_arith_mul.h ./tensors/Tensor_arith_scalar.h ./tensors/Tensor_arith_sub.h ./tensors/Tensor_class.h ./tensors/Tensor_determinant.h ./tensors/Tensor_exp.h ./tensors/Tensor_extract_merge.h ./tensors/Tensor_index.h ./tensors/Tensor_inner.h ./tensors/Tensor_logical.h ./tensors/Tensor_outer.h ./tensors/Tensor_reality.h ./tensors/Tensor_trace.h ./tensors/Tensor_traits.h ./tensors/Tensor_transpose.h ./tensors/Tensor_unary.h +HFILES=./cshift/Cshift_none.h ./cshift/Cshift_common.h ./cshift/Cshift_mpi.h ./Tensors.h ./qcd/utils/SUn.h ./qcd/utils/SpaceTimeGrid.h ./qcd/utils/CovariantCshift.h ./qcd/utils/WilsonLoops.h ./qcd/utils/LinalgUtils.h ./qcd/QCD.h ./qcd/action/fermion/DomainWallFermion.h ./qcd/action/fermion/MobiusFermion.h ./qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h ./qcd/action/fermion/g5HermitianLinop.h ./qcd/action/fermion/WilsonFermion5D.h ./qcd/action/fermion/WilsonKernels.h ./qcd/action/fermion/FermionOperator.h ./qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h ./qcd/action/fermion/ScaledShamirFermion.h ./qcd/action/fermion/CayleyFermion5D.h ./qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h ./qcd/action/fermion/WilsonCompressor.h ./qcd/action/fermion/FermionOperatorImpl.h ./qcd/action/fermion/WilsonFermion.h ./qcd/action/fermion/WilsonTMFermion.h ./qcd/action/fermion/MobiusZolotarevFermion.h ./qcd/action/fermion/ShamirZolotarevFermion.h ./qcd/action/fermion/WilsonKernelsAsmBody.h ./qcd/action/fermion/PartialFractionFermion5D.h ./qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h ./qcd/action/fermion/ContinuedFractionFermion5D.h ./qcd/action/fermion/OverlapWilsonContfracTanhFermion.h ./qcd/action/gauge/GaugeImpl.h ./qcd/action/gauge/PlaqPlusRectangleAction.h ./qcd/action/gauge/WilsonGaugeAction.h ./qcd/action/pseudofermion/TwoFlavour.h ./qcd/action/pseudofermion/OneFlavourRationalRatio.h ./qcd/action/pseudofermion/OneFlavourEvenOddRational.h ./qcd/action/pseudofermion/OneFlavourRational.h ./qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h ./qcd/action/pseudofermion/TwoFlavourEvenOdd.h ./qcd/action/pseudofermion/EvenOddSchurDifferentiable.h ./qcd/action/pseudofermion/TwoFlavourRatio.h ./qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h ./qcd/action/ActionBase.h ./qcd/action/ActionParams.h ./qcd/action/Actions.h ./qcd/hmc/HmcRunner.h ./qcd/hmc/integrators/Integrator.h ./qcd/hmc/integrators/Integrator_algorithm.h ./qcd/hmc/HMC.h ./qcd/hmc/NerscCheckpointer.h ./qcd/spin/Dirac.h ./qcd/spin/TwoSpinor.h ./simd/Intel512wilson.h ./simd/Intel512common.h ./simd/Grid_sse4.h ./simd/Grid_qpx.h ./simd/Grid_vector_types.h ./simd/Grid_vector_unops.h ./simd/Intel512imci.h ./simd/Intel512avx.h ./simd/Grid_neon.h ./simd/Grid_imci.h ./simd/Intel512single.h ./simd/Grid_empty.h ./simd/Intel512double.h ./simd/Grid_avx512.h ./simd/Grid_avx.h ./tensors/Tensor_arith_mac.h ./tensors/Tensor_arith_sub.h ./tensors/Tensor_unary.h ./tensors/Tensor_trace.h ./tensors/Tensor_determinant.h ./tensors/Tensor_reality.h ./tensors/Tensor_arith_scalar.h ./tensors/Tensor_class.h ./tensors/Tensor_arith.h ./tensors/Tensor_index.h ./tensors/Tensor_extract_merge.h ./tensors/Tensor_logical.h ./tensors/Tensor_Ta.h ./tensors/Tensor_exp.h ./tensors/Tensor_arith_add.h ./tensors/Tensor_outer.h ./tensors/Tensor_traits.h ./tensors/Tensor_arith_mul.h ./tensors/Tensor_inner.h ./tensors/Tensor_transpose.h ./Log.h ./Communicator.h ./cartesian/Cartesian_full.h ./cartesian/Cartesian_red_black.h ./cartesian/Cartesian_base.h ./Timer.h ./Init.h ./Algorithms.h ./Lexicographic.h ./algorithms/approx/Remez.h ./algorithms/approx/Zolotarev.h ./algorithms/approx/bigfloat_double.h ./algorithms/approx/MultiShiftFunction.h ./algorithms/approx/Chebyshev.h ./algorithms/approx/bigfloat.h ./algorithms/Preconditioner.h ./algorithms/iterative/ConjugateGradient.h ./algorithms/iterative/ConjugateGradientMultiShift.h ./algorithms/iterative/Francis.h ./algorithms/iterative/PrecConjugateResidual.h ./algorithms/iterative/Householder.h ./algorithms/iterative/ImplicitlyRestartedLanczos.h ./algorithms/iterative/Matrix.h ./algorithms/iterative/EigenSort.h ./algorithms/iterative/ConjugateGradientMixedPrec.h ./algorithms/iterative/NormalEquations.h ./algorithms/iterative/PrecGeneralisedConjugateResidual.h ./algorithms/iterative/DenseMatrix.h ./algorithms/iterative/AdefGeneric.h ./algorithms/iterative/ConjugateResidual.h ./algorithms/iterative/SchurRedBlack.h ./algorithms/iterative/MatrixUtils.h ./algorithms/CoarsenedMatrix.h ./algorithms/LinearOperator.h ./algorithms/SparseMatrix.h ./serialisation/XmlIO.h ./serialisation/TextIO.h ./serialisation/BinaryIO.h ./serialisation/MacroMagic.h ./serialisation/BaseIO.h ./serialisation/Serialisation.h ./Stencil.h ./lattice/Lattice_base.h ./lattice/Lattice_arith.h ./lattice/Lattice_rng.h ./lattice/Lattice_unary.h ./lattice/Lattice_comparison_utils.h ./lattice/Lattice_coordinate.h ./lattice/Lattice_local.h ./lattice/Lattice_reality.h ./lattice/Lattice_comparison.h ./lattice/Lattice_trace.h ./lattice/Lattice_reduction.h ./lattice/Lattice_transpose.h ./lattice/Lattice_peekpoke.h ./lattice/Lattice_transfer.h ./lattice/Lattice_where.h ./lattice/Lattice_ET.h ./lattice/Lattice_conformable.h ./lattice/Lattice_overload.h ./Lattice.h ./communicator/Communicator_base.h ./Cshift.h ./AlignedAllocator.h ./PerfCount.h ./Simd.h ./stencil/Lebesgue.h ./Threads.h ./parallelIO/NerscIO.h ./parallelIO/BinaryIO.h ./pugixml/pugixml.h ./Grid.h ./Cartesian.h Config.h -CCFILES=./Init.cc ./Log.cc ./PerfCount.cc ./algorithms/approx/MultiShiftFunction.cc ./algorithms/approx/Remez.cc ./algorithms/approx/Zolotarev.cc ./pugixml/pugixml.cc ./qcd/action/fermion/CayleyFermion5D.cc ./qcd/action/fermion/ContinuedFractionFermion5D.cc ./qcd/action/fermion/PartialFractionFermion5D.cc ./qcd/action/fermion/WilsonFermion.cc ./qcd/action/fermion/WilsonFermion5D.cc ./qcd/action/fermion/WilsonKernels.cc ./qcd/action/fermion/WilsonKernelsAsm.cc ./qcd/action/fermion/WilsonKernelsHand.cc ./qcd/action/fermion/WilsonTMFermion.cc ./qcd/hmc/HMC.cc ./qcd/spin/Dirac.cc ./qcd/utils/SpaceTimeGrid.cc ./serialisation/BinaryIO.cc ./serialisation/TextIO.cc ./serialisation/XmlIO.cc ./stencil/Lebesgue.cc ./stencil/Stencil_common.cc +CCFILES=./Log.cc ./qcd/utils/SpaceTimeGrid.cc ./qcd/action/fermion/WilsonKernelsAsm.cc ./qcd/action/fermion/WilsonTMFermion.cc ./qcd/action/fermion/WilsonKernels.cc ./qcd/action/fermion/WilsonFermion5D.cc ./qcd/action/fermion/PartialFractionFermion5D.cc ./qcd/action/fermion/CayleyFermion5D.cc ./qcd/action/fermion/WilsonFermion.cc ./qcd/action/fermion/WilsonKernelsHand.cc ./qcd/action/fermion/ContinuedFractionFermion5D.cc ./qcd/hmc/HMC.cc ./qcd/spin/Dirac.cc ./algorithms/approx/Zolotarev.cc ./algorithms/approx/MultiShiftFunction.cc ./algorithms/approx/Remez.cc ./serialisation/XmlIO.cc ./serialisation/TextIO.cc ./serialisation/BinaryIO.cc ./Init.cc ./stencil/Stencil_common.cc ./stencil/Lebesgue.cc ./PerfCount.cc ./pugixml/pugixml.cc diff --git a/lib/algorithms/iterative/ConjugateGradientMixedPrec.h b/lib/algorithms/iterative/ConjugateGradientMixedPrec.h new file mode 100644 index 00000000..7931bbed --- /dev/null +++ b/lib/algorithms/iterative/ConjugateGradientMixedPrec.h @@ -0,0 +1,141 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./lib/algorithms/iterative/ConjugateGradientMixedPrec.h + + Copyright (C) 2015 + +Author: Christopher Kelly + + 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_CONJUGATE_GRADIENT_MIXED_PREC_H +#define GRID_CONJUGATE_GRADIENT_MIXED_PREC_H + +namespace Grid { + + template::value == 2, int>::type = 0,typename std::enable_if< getPrecision::value == 1, int>::type = 0> + class MixedPrecisionConjugateGradient : public LinearFunction { + public: + RealD Tolerance; + Integer MaxInnerIterations; + Integer MaxOuterIterations; + GridBase* SinglePrecGrid; //Grid for single-precision fields + RealD OuterLoopNormMult; //Stop the outer loop and move to a final double prec solve when the residual is OuterLoopNormMult * Tolerance + LinearOperatorBase &Linop_f; + LinearOperatorBase &Linop_d; + + //Option to speed up *inner single precision* solves using a LinearFunction that produces a guess + LinearFunction *guesser; + + MixedPrecisionConjugateGradient(RealD tol, Integer maxinnerit, Integer maxouterit, GridBase* _sp_grid, LinearOperatorBase &_Linop_f, LinearOperatorBase &_Linop_d) : + Linop_f(_Linop_f), Linop_d(_Linop_d), + Tolerance(tol), MaxInnerIterations(maxinnerit), MaxOuterIterations(maxouterit), SinglePrecGrid(_sp_grid), + OuterLoopNormMult(100.), guesser(NULL){ }; + + void useGuesser(LinearFunction &g){ + guesser = g; + } + + void operator() (const FieldD &src_d_in, FieldD &sol_d){ + GridStopWatch TotalTimer; + TotalTimer.Start(); + + int cb = src_d_in.checkerboard; + sol_d.checkerboard = cb; + + RealD src_norm = norm2(src_d_in); + RealD stop = src_norm * Tolerance*Tolerance; + + GridBase* DoublePrecGrid = src_d_in._grid; + FieldD tmp_d(DoublePrecGrid); + tmp_d.checkerboard = cb; + + FieldD tmp2_d(DoublePrecGrid); + tmp2_d.checkerboard = cb; + + FieldD src_d(DoublePrecGrid); + src_d = src_d_in; //source for next inner iteration, computed from residual during operation + + RealD inner_tol = Tolerance; + + FieldF src_f(SinglePrecGrid); + src_f.checkerboard = cb; + + FieldF sol_f(SinglePrecGrid); + sol_f.checkerboard = cb; + + ConjugateGradient CG_f(inner_tol, MaxInnerIterations); + CG_f.ErrorOnNoConverge = false; + + GridStopWatch InnerCGtimer; + + GridStopWatch PrecChangeTimer; + + for(Integer outer_iter = 0; outer_iter < MaxOuterIterations; outer_iter++){ + //Compute double precision rsd and also new RHS vector. + Linop_d.HermOp(sol_d, tmp_d); + RealD norm = axpy_norm(src_d, -1., tmp_d, src_d_in); //src_d is residual vector + + std::cout< CG_d(Tolerance, MaxInnerIterations); + CG_d(Linop_d, src_d_in, sol_d); + + TotalTimer.Stop(); + std::cout< using is_lattice = std::is_base_of; template using is_lattice_expr = std::is_base_of; +//Specialization of getVectorType for lattices +template +struct getVectorType >{ + typedef typename Lattice::vector_object type; +}; + template inline sobj eval(const unsigned int ss, const sobj &arg) { diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 638563a9..4a6e6112 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -482,6 +482,96 @@ void Replicate(Lattice &coarse,Lattice & fine) } +//Copy SIMD-vectorized lattice to array of scalar objects in lexicographic order +template +typename std::enable_if::value && !isSIMDvectorized::value, void>::type unvectorizeToLexOrdArray(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_LOOP + 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::IndexFromCoor(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); + } +} + +//Convert a Lattice from one precision to another +template +void precisionChange(Lattice &out, const Lattice &in){ + assert(out._grid->Nd() == in._grid->Nd()); + out.checkerboard = in.checkerboard; + GridBase *in_grid=in._grid; + GridBase *out_grid = out._grid; + + typedef typename VobjOut::scalar_object SobjOut; + typedef typename VobjIn::scalar_object SobjIn; + + int ndim = out._grid->Nd(); + int out_nsimd = out_grid->Nsimd(); + + std::vector out_icoor[out_nsimd]; + + for(int lane=0; lane < out_nsimd; lane++){ + out_icoor[lane].resize(ndim); + out_grid->iCoorFromIindex(out_icoor[lane], lane); + } + + std::vector in_slex_conv(in_grid->lSites()); + unvectorizeToLexOrdArray(in_slex_conv, in); + + PARALLEL_FOR_LOOP + for(int out_oidx=0;out_oidxoSites();out_oidx++){ + std::vector out_ocoor(ndim); + out_grid->oCoorFromOindex(out_ocoor, out_oidx); + + std::vector ptrs(out_nsimd); + + std::vector lcoor(out_grid->Nd()); + + for(int lane=0; lane < out_nsimd; lane++){ + for(int mu=0;mu_rdimensions[mu]*out_icoor[lane][mu]; + + int llex; Lexicographic::IndexFromCoor(lcoor, llex, out_grid->_ldimensions); + ptrs[lane] = &in_slex_conv[llex]; + } + merge(out._odata[out_oidx], ptrs, 0); + } +} + + + + + } #endif diff --git a/lib/tensors/Tensor_extract_merge.h b/lib/tensors/Tensor_extract_merge.h index ad98213d..41a431ad 100644 --- a/lib/tensors/Tensor_extract_merge.h +++ b/lib/tensors/Tensor_extract_merge.h @@ -10,6 +10,7 @@ Author: Azusa Yamaguchi Author: Peter Boyle Author: neo Author: paboyle +Author: Christopher Kelly 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 @@ -167,6 +168,33 @@ void extract(const vobj &vec,std::vector &extrac } } +//////////////////////////////////////////////////////////////////////// +// Extract to a bunch of scalar object pointers of different scalar type, with offset. Useful for precision change +//////////////////////////////////////////////////////////////////////// +template inline +void extract1(const vobj &vec,std::vector &extracted, int offset) +{ + typedef typename vobj::scalar_type vobj_scalar_type ; + typedef typename vobj::vector_type vobj_vector_type ; + + typedef typename sobj::scalar_type sobj_scalar_type ; + + static const int words=sizeof(vobj)/sizeof(vobj_vector_type); + static const int Nsimd=vobj_vector_type::Nsimd(); + + int Nextr=extracted.size(); + int s = Nsimd/Nextr; + vobj_scalar_type * vp = (vobj_scalar_type *)&vec; + + for(int w=0;w Author: Peter Boyle +Author: Christopher Kelly 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 @@ -230,6 +231,35 @@ namespace Grid { static const bool value = true; }; + //Get the SIMD vector type from a Grid tensor or Lattice + template + struct getVectorType{ + typedef T type; + }; + + //Query if a tensor or Lattice is SIMD vector or scalar + template + class isSIMDvectorized{ + template + static typename std::enable_if< !std::is_same< typename GridTypeMapper::type>::scalar_type, typename GridTypeMapper::type>::vector_type>::value, char>::type test(void *); + + template + static double test(...); + + public: + enum {value = sizeof(test(0)) == sizeof(char) }; + }; + + //Get the precision of a Lattice, tensor or scalar type in units of sizeof(float) + template + class getPrecision{ + typedef typename getVectorType::type vector_obj; //get the vector_obj (i.e. a grid Tensor) if its a Lattice, do nothing otherwise (i.e. if fundamental or grid Tensor) + + typedef typename GridTypeMapper::scalar_type scalar_type; //get the associated scalar type. Works on fundamental and tensor types + typedef typename GridTypeMapper::Realified real_scalar_type; //remove any std::complex wrapper, should get us to the fundamental type + public: + enum { value = sizeof(real_scalar_type)/sizeof(float) }; + }; } #endif diff --git a/scripts/filelist b/scripts/filelist index dcc5bfef..b5843cae 100755 --- a/scripts/filelist +++ b/scripts/filelist @@ -2,7 +2,8 @@ cd lib -HFILES=`find . -type f -name '*.h'` +HFILES=`find . -type f -name '*.h' -not -path '*/Old/*'` +HFILES="$HFILES Config.h" CCFILES=`find . -type f -name '*.cc' -not -name '*ommunicator*.cc'` echo> Make.inc echo HFILES=$HFILES >> Make.inc diff --git a/tests/Make.inc b/tests/Make.inc index f1e2cd9d..fad82247 100644 --- a/tests/Make.inc +++ b/tests/Make.inc @@ -1,13 +1,5 @@ -bin_PROGRAMS += Test_GaugeAction Test_RectPlaq Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_cshift_red_black_rotate Test_cshift_rotate Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_dwf_rb5d Test_gamma Test_gp_rect_force Test_gparity Test_gpdwf_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd - - -Test_GaugeAction_SOURCES=Test_GaugeAction.cc -Test_GaugeAction_LDADD=-lGrid - - -Test_RectPlaq_SOURCES=Test_RectPlaq.cc -Test_RectPlaq_LDADD=-lGrid +bin_PROGRAMS += Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_cshift_red_black_rotate Test_cshift_rotate Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_dwf_rb5d Test_gamma Test_GaugeAction Test_gparity Test_gpdwf_force Test_gp_rect_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_RectPlaq Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd Test_cayley_cg_SOURCES=Test_cayley_cg.cc @@ -114,8 +106,8 @@ Test_gamma_SOURCES=Test_gamma.cc Test_gamma_LDADD=-lGrid -Test_gp_rect_force_SOURCES=Test_gp_rect_force.cc -Test_gp_rect_force_LDADD=-lGrid +Test_GaugeAction_SOURCES=Test_GaugeAction.cc +Test_GaugeAction_LDADD=-lGrid Test_gparity_SOURCES=Test_gparity.cc @@ -126,6 +118,10 @@ Test_gpdwf_force_SOURCES=Test_gpdwf_force.cc Test_gpdwf_force_LDADD=-lGrid +Test_gp_rect_force_SOURCES=Test_gp_rect_force.cc +Test_gp_rect_force_LDADD=-lGrid + + Test_gpwilson_even_odd_SOURCES=Test_gpwilson_even_odd.cc Test_gpwilson_even_odd_LDADD=-lGrid @@ -202,6 +198,10 @@ Test_rect_force_SOURCES=Test_rect_force.cc Test_rect_force_LDADD=-lGrid +Test_RectPlaq_SOURCES=Test_RectPlaq.cc +Test_RectPlaq_LDADD=-lGrid + + Test_remez_SOURCES=Test_remez.cc Test_remez_LDADD=-lGrid From 713520d3d23cd8be716c624953ce5b3d8f81d6fa Mon Sep 17 00:00:00 2001 From: Christopher Kelly Date: Wed, 6 Jul 2016 16:18:19 -0400 Subject: [PATCH 26/34] Added tester for mixed CG --- tests/Make.inc | 6 +- tests/Test_dwf_mixedcg_prec.cc | 108 +++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 tests/Test_dwf_mixedcg_prec.cc diff --git a/tests/Make.inc b/tests/Make.inc index fad82247..73a176e9 100644 --- a/tests/Make.inc +++ b/tests/Make.inc @@ -1,5 +1,5 @@ -bin_PROGRAMS += Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_cshift_red_black_rotate Test_cshift_rotate Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_dwf_rb5d Test_gamma Test_GaugeAction Test_gparity Test_gpdwf_force Test_gp_rect_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_RectPlaq Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd +bin_PROGRAMS += Test_cayley_cg Test_cayley_coarsen_support Test_cayley_even_odd Test_cayley_ldop_cr Test_cf_coarsen_support Test_cf_cr_unprec Test_cheby Test_contfrac_cg Test_contfrac_even_odd Test_contfrac_force Test_cshift Test_cshift_red_black Test_cshift_red_black_rotate Test_cshift_rotate Test_dwf_cg_prec Test_dwf_cg_schur Test_dwf_cg_unprec Test_dwf_cr_unprec Test_dwf_even_odd Test_dwf_force Test_dwf_fpgcr Test_dwf_gpforce Test_dwf_hdcr Test_dwf_lanczos Test_dwf_mixedcg_prec Test_dwf_rb5d Test_gamma Test_GaugeAction Test_gparity Test_gpdwf_force Test_gp_rect_force Test_gpwilson_even_odd Test_hmc_EODWFRatio Test_hmc_EODWFRatio_Gparity Test_hmc_EOWilsonFermionGauge Test_hmc_EOWilsonRatio Test_hmc_GparityIwasakiGauge Test_hmc_GparityWilsonGauge Test_hmc_IwasakiGauge Test_hmc_RectGauge Test_hmc_WilsonFermionGauge Test_hmc_WilsonGauge Test_hmc_WilsonRatio Test_lie_generators Test_main Test_multishift_sqrt Test_nersc_io Test_partfrac_force Test_quenched_update Test_rect_force Test_RectPlaq Test_remez Test_rhmc_EOWilson1p1 Test_rhmc_EOWilsonRatio Test_rhmc_Wilson1p1 Test_rhmc_WilsonRatio Test_rng Test_rng_fixed Test_serialisation Test_simd Test_stencil Test_synthetic_lanczos Test_wilson_cg_prec Test_wilson_cg_schur Test_wilson_cg_unprec Test_wilson_cr_unprec Test_wilson_even_odd Test_wilson_force Test_wilson_force_phiMdagMphi Test_wilson_force_phiMphi Test_wilson_tm_even_odd Test_cayley_cg_SOURCES=Test_cayley_cg.cc @@ -98,6 +98,10 @@ Test_dwf_lanczos_SOURCES=Test_dwf_lanczos.cc Test_dwf_lanczos_LDADD=-lGrid +Test_dwf_mixedcg_prec_SOURCES=Test_dwf_mixedcg_prec.cc +Test_dwf_mixedcg_prec_LDADD=-lGrid + + Test_dwf_rb5d_SOURCES=Test_dwf_rb5d.cc Test_dwf_rb5d_LDADD=-lGrid diff --git a/tests/Test_dwf_mixedcg_prec.cc b/tests/Test_dwf_mixedcg_prec.cc new file mode 100644 index 00000000..637b8141 --- /dev/null +++ b/tests/Test_dwf_mixedcg_prec.cc @@ -0,0 +1,108 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_dwf_cg_prec.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; + +template +struct scal { + d internal; +}; + + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + const int Ls=8; + + GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexD::Nsimd()),GridDefaultMpi()); + GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); + GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); + GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); + + GridCartesian * UGrid_f = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi()); + GridRedBlackCartesian * UrbGrid_f = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid_f); + GridCartesian * FGrid_f = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid_f); + GridRedBlackCartesian * FrbGrid_f = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid_f); + + 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); + + LatticeFermionD src(FGrid); random(RNG5,src); + LatticeFermionD result(FGrid); result=zero; + LatticeGaugeFieldD Umu(UGrid); + LatticeGaugeFieldF Umu_f(UGrid_f); + + SU3::HotConfiguration(RNG4,Umu); + + precisionChange(Umu_f,Umu); + + RealD mass=0.1; + RealD M5=1.8; + DomainWallFermionD Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); + DomainWallFermionF Ddwf_f(Umu_f,*FGrid_f,*FrbGrid_f,*UGrid_f,*UrbGrid_f,mass,M5); + + LatticeFermionD src_o(FrbGrid); + LatticeFermionD result_o(FrbGrid); + LatticeFermionD result_o_2(FrbGrid); + pickCheckerboard(Odd,src_o,src); + result_o.checkerboard = Odd; + result_o = zero; + result_o_2.checkerboard = Odd; + result_o_2 = zero; + + SchurDiagMooeeOperator HermOpEO(Ddwf); + SchurDiagMooeeOperator HermOpEO_f(Ddwf_f); + + std::cout << "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; + 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; + + + Grid_finalize(); +} From 25fafa9a8927507eec0fc2b8160c98c29c28dbce Mon Sep 17 00:00:00 2001 From: Christopher Kelly Date: Wed, 6 Jul 2016 16:19:41 -0400 Subject: [PATCH 27/34] Comment --- lib/algorithms/iterative/ConjugateGradientMixedPrec.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/algorithms/iterative/ConjugateGradientMixedPrec.h b/lib/algorithms/iterative/ConjugateGradientMixedPrec.h index 7931bbed..bac2d18a 100644 --- a/lib/algorithms/iterative/ConjugateGradientMixedPrec.h +++ b/lib/algorithms/iterative/ConjugateGradientMixedPrec.h @@ -30,6 +30,7 @@ Author: Christopher Kelly namespace Grid { + //Mixed precision restarted defect correction CG template::value == 2, int>::type = 0,typename std::enable_if< getPrecision::value == 1, int>::type = 0> class MixedPrecisionConjugateGradient : public LinearFunction { public: From 4774a3bcd27e2a8eb0ede7fd6274fec06ace34cc Mon Sep 17 00:00:00 2001 From: Christopher Kelly Date: Wed, 6 Jul 2016 18:01:08 -0400 Subject: [PATCH 28/34] Generalized HotConfiguration and functions it calls to accept gauge fields with precision other than the default. --- lib/qcd/utils/SUn.h | 47 ++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/lib/qcd/utils/SUn.h b/lib/qcd/utils/SUn.h index 124e5f41..e9403836 100644 --- a/lib/qcd/utils/SUn.h +++ b/lib/qcd/utils/SUn.h @@ -43,7 +43,7 @@ public: template using iSUnMatrix = iScalar > > ; template using iSU2Matrix = iScalar > > ; - + ////////////////////////////////////////////////////////////////////////////////////////////////// // Types can be accessed as SU<2>::Matrix , SU<2>::vSUnMatrix, SU<2>::LatticeMatrix etc... ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -552,15 +552,24 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g } // reunitarise?? - static void LieRandomize(GridParallelRNG &pRNG,LatticeMatrix &out,double scale=1.0){ + template + static void LieRandomize(GridParallelRNG &pRNG,LatticeMatrixType &out,double scale=1.0){ GridBase *grid = out._grid; - - LatticeComplex ca (grid); - LatticeMatrix lie(grid); - LatticeMatrix la (grid); - Complex ci(0.0,scale); - Complex cone(1.0,0.0); - Matrix ta; + + typedef typename LatticeMatrixType::vector_type vector_type; + typedef typename LatticeMatrixType::scalar_type scalar_type; + + typedef iSinglet vTComplexType; + + typedef Lattice LatticeComplexType; + typedef typename GridTypeMapper::scalar_object MatrixType; + + LatticeComplexType ca (grid); + LatticeMatrixType lie(grid); + LatticeMatrixType la (grid); + ComplexD ci(0.0,scale); + ComplexD cone(1.0,0.0); + MatrixType ta; lie=zero; for(int a=0;a + static void HotConfiguration(GridParallelRNG &pRNG,GaugeField &out){ + typedef typename GaugeField::vector_type vector_type; + typedef iSUnMatrix vMatrixType; + typedef Lattice LatticeMatrixType; + + LatticeMatrixType Umu(out._grid); for(int mu=0;mu(out,Umu,mu); @@ -622,13 +635,15 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g static void taProj( const LatticeMatrix &in, LatticeMatrix &out){ out = Ta(in); } - static void taExp( const LatticeMatrix &x, LatticeMatrix &ex){ - - LatticeMatrix xn(x._grid); + template + static void taExp( const LatticeMatrixType &x, LatticeMatrixType &ex){ + typedef typename LatticeMatrixType::scalar_type ComplexType; + + LatticeMatrixType xn(x._grid); RealD nfac = 1.0; xn = x; - ex =xn+Complex(1.0); // 1+x + ex =xn+ComplexType(1.0); // 1+x // Do a 12th order exponentiation for(int i=2; i <= 12; ++i) From 184642adb0d8daa2dcf4115be16a75152b7076f2 Mon Sep 17 00:00:00 2001 From: Christopher Kelly Date: Wed, 6 Jul 2016 18:15:15 -0400 Subject: [PATCH 29/34] Fix for pedantic compilers --- lib/lattice/Lattice_transfer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 4a6e6112..4c9bbc31 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -493,7 +493,7 @@ typename std::enable_if::value && !isSIMDvectorized int ndim = in_grid->Nd(); int in_nsimd = vtype::Nsimd(); - std::vector in_icoor[in_nsimd]; + std::vector > in_icoor(in_nsimd); for(int lane=0; lane < in_nsimd; lane++){ in_icoor[lane].resize(ndim); From dd8cfff1118862de70b5eeccca5fd6c62bc15295 Mon Sep 17 00:00:00 2001 From: Christopher Kelly Date: Wed, 6 Jul 2016 18:22:15 -0400 Subject: [PATCH 30/34] Another fix for pedantic compilers --- lib/lattice/Lattice_transfer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index 4c9bbc31..bd53cde9 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -539,7 +539,7 @@ void precisionChange(Lattice &out, const Lattice &in){ int ndim = out._grid->Nd(); int out_nsimd = out_grid->Nsimd(); - std::vector out_icoor[out_nsimd]; + std::vector > out_icoor(out_nsimd); for(int lane=0; lane < out_nsimd; lane++){ out_icoor[lane].resize(ndim); From ffb8b3116c4e511f70f3d00fc0d0f9ed9527cd50 Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Thu, 7 Jul 2016 11:49:36 +0100 Subject: [PATCH 31/34] Tested smeared RHMC Wilson1p1, accepting --- lib/lattice/Lattice_ET.h | 565 +++++++++--------- .../pseudofermion/OneFlavourEvenOddRational.h | 334 ++++++----- lib/tensors/Tensor_class.h | 444 +++++++------- tests/Test_rhmc_EOWilson1p1.cc | 105 ++-- 4 files changed, 754 insertions(+), 694 deletions(-) diff --git a/lib/lattice/Lattice_ET.h b/lib/lattice/Lattice_ET.h index 98c38e96..20d2e430 100644 --- a/lib/lattice/Lattice_ET.h +++ b/lib/lattice/Lattice_ET.h @@ -1,73 +1,74 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/lattice/Lattice_ET.h +Source file: ./lib/lattice/Lattice_ET.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_LATTICE_ET_H #define GRID_LATTICE_ET_H #include -#include #include #include +#include namespace Grid { - //////////////////////////////////////////////////// - // Predicated where support - //////////////////////////////////////////////////// - template - inline vobj predicatedWhere(const iobj &predicate,const vobj &iftrue,const robj &iffalse) { +//////////////////////////////////////////////////// +// Predicated where support +//////////////////////////////////////////////////// +template +inline vobj predicatedWhere(const iobj &predicate, const vobj &iftrue, + const robj &iffalse) { + typename std::remove_const::type ret; - typename std::remove_const::type ret; + typedef typename vobj::scalar_object scalar_object; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_object scalar_object; - typedef typename vobj::scalar_type scalar_type; - typedef typename vobj::vector_type vector_type; + const int Nsimd = vobj::vector_type::Nsimd(); + const int words = sizeof(vobj) / sizeof(vector_type); - const int Nsimd = vobj::vector_type::Nsimd(); - const int words = sizeof(vobj)/sizeof(vector_type); + std::vector mask(Nsimd); + std::vector truevals(Nsimd); + std::vector falsevals(Nsimd); - std::vector mask(Nsimd); - std::vector truevals (Nsimd); - std::vector falsevals(Nsimd); + extract(iftrue, truevals); + extract(iffalse, falsevals); + extract(TensorRemove(predicate), mask); - extract(iftrue ,truevals); - extract(iffalse ,falsevals); - extract(TensorRemove(predicate),mask); - - for(int s=0;s +using is_lattice = std::is_base_of; -template using is_lattice = std::is_base_of; +template +using is_lattice_expr = std::is_base_of; -template using is_lattice_expr = std::is_base_of; - -template -inline sobj eval(const unsigned int ss, const sobj &arg) -{ +template +inline sobj eval(const unsigned int ss, const sobj &arg) { return arg; } -template -inline const lobj &eval(const unsigned int ss, const Lattice &arg) -{ - return arg._odata[ss]; +template +inline const lobj &eval(const unsigned int ss, const Lattice &arg) { + return arg._odata[ss]; } // handle nodes in syntax tree template -auto inline eval(const unsigned int ss, const LatticeUnaryExpression &expr) // eval one operand - -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)))) -{ - return expr.first.func(eval(ss,std::get<0>(expr.second))); +auto inline eval( + const unsigned int ss, + const LatticeUnaryExpression &expr) // eval one operand + -> decltype(expr.first.func(eval(ss, std::get<0>(expr.second)))) { + return expr.first.func(eval(ss, std::get<0>(expr.second))); } template -auto inline eval(const unsigned int ss, const LatticeBinaryExpression &expr) // eval two operands - -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)))) -{ - return expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second))); +auto inline eval( + const unsigned int ss, + const LatticeBinaryExpression &expr) // eval two operands + -> decltype(expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second)))) { + return expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second))); } template -auto inline eval(const unsigned int ss, const LatticeTrinaryExpression &expr) // eval three operands - -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)),eval(ss,std::get<2>(expr.second)))) -{ - return expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)),eval(ss,std::get<2>(expr.second)) ); +auto inline eval(const unsigned int ss, + const LatticeTrinaryExpression + &expr) // eval three operands + -> decltype(expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second)), + eval(ss, std::get<2>(expr.second)))) { + return expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second)), + eval(ss, std::get<2>(expr.second))); } ////////////////////////////////////////////////////////////////////////// -// Obtain the grid from an expression, ensuring conformable. This must follow a tree recursion +// Obtain the grid from an expression, ensuring conformable. This must follow a +// tree recursion ////////////////////////////////////////////////////////////////////////// -template::value, T1>::type * =nullptr > -inline void GridFromExpression(GridBase * &grid,const T1& lat) // Lattice leaf -{ - if ( grid ) { - conformable(grid,lat._grid); - } - grid=lat._grid; -} -template::value, T1>::type * = nullptr > -inline void GridFromExpression(GridBase * &grid,const T1& notlat) // non-lattice leaf +template ::value, T1>::type * = nullptr> +inline void GridFromExpression(GridBase *&grid, const T1 &lat) // Lattice leaf { + if (grid) { + conformable(grid, lat._grid); + } + grid = lat._grid; } +template ::value, T1>::type * = nullptr> +inline void GridFromExpression(GridBase *&grid, + const T1 ¬lat) // non-lattice leaf +{} template -inline void GridFromExpression(GridBase * &grid,const LatticeUnaryExpression &expr) -{ - GridFromExpression(grid,std::get<0>(expr.second));// recurse +inline void GridFromExpression(GridBase *&grid, + const LatticeUnaryExpression &expr) { + GridFromExpression(grid, std::get<0>(expr.second)); // recurse } template -inline void GridFromExpression(GridBase * &grid,const LatticeBinaryExpression &expr) -{ - GridFromExpression(grid,std::get<0>(expr.second));// recurse - GridFromExpression(grid,std::get<1>(expr.second)); +inline void GridFromExpression( + GridBase *&grid, const LatticeBinaryExpression &expr) { + GridFromExpression(grid, std::get<0>(expr.second)); // recurse + GridFromExpression(grid, std::get<1>(expr.second)); } template -inline void GridFromExpression( GridBase * &grid,const LatticeTrinaryExpression &expr) -{ - GridFromExpression(grid,std::get<0>(expr.second));// recurse - GridFromExpression(grid,std::get<1>(expr.second)); - GridFromExpression(grid,std::get<2>(expr.second)); +inline void GridFromExpression( + GridBase *&grid, const LatticeTrinaryExpression &expr) { + GridFromExpression(grid, std::get<0>(expr.second)); // recurse + GridFromExpression(grid, std::get<1>(expr.second)); + GridFromExpression(grid, std::get<2>(expr.second)); } - ////////////////////////////////////////////////////////////////////////// -// Obtain the CB from an expression, ensuring conformable. This must follow a tree recursion +// Obtain the CB from an expression, ensuring conformable. This must follow a +// tree recursion ////////////////////////////////////////////////////////////////////////// -template::value, T1>::type * =nullptr > -inline void CBFromExpression(int &cb,const T1& lat) // Lattice leaf +template ::value, T1>::type * = nullptr> +inline void CBFromExpression(int &cb, const T1 &lat) // Lattice leaf { - if ( (cb==Odd) || (cb==Even) ) { - assert(cb==lat.checkerboard); - } - cb=lat.checkerboard; + if ((cb == Odd) || (cb == Even)) { + assert(cb == lat.checkerboard); + } + cb = lat.checkerboard; // std::cout<::value, T1>::type * = nullptr > -inline void CBFromExpression(int &cb,const T1& notlat) // non-lattice leaf +template ::value, T1>::type * = nullptr> +inline void CBFromExpression(int &cb, const T1 ¬lat) // non-lattice leaf { // std::cout< -inline void CBFromExpression(int &cb,const LatticeUnaryExpression &expr) -{ - CBFromExpression(cb,std::get<0>(expr.second));// recurse +inline void CBFromExpression(int &cb, + const LatticeUnaryExpression &expr) { + CBFromExpression(cb, std::get<0>(expr.second)); // recurse // std::cout< -inline void CBFromExpression(int &cb,const LatticeBinaryExpression &expr) -{ - CBFromExpression(cb,std::get<0>(expr.second));// recurse - CBFromExpression(cb,std::get<1>(expr.second)); +inline void CBFromExpression(int &cb, + const LatticeBinaryExpression &expr) { + CBFromExpression(cb, std::get<0>(expr.second)); // recurse + CBFromExpression(cb, std::get<1>(expr.second)); // std::cout< -inline void CBFromExpression( int &cb,const LatticeTrinaryExpression &expr) -{ - CBFromExpression(cb,std::get<0>(expr.second));// recurse - CBFromExpression(cb,std::get<1>(expr.second)); - CBFromExpression(cb,std::get<2>(expr.second)); +inline void CBFromExpression( + int &cb, const LatticeTrinaryExpression &expr) { + CBFromExpression(cb, std::get<0>(expr.second)); // recurse + CBFromExpression(cb, std::get<1>(expr.second)); + CBFromExpression(cb, std::get<2>(expr.second)); // std::cout< struct name \ - { \ - static auto inline func(const arg a)-> decltype(ret) { return ret; } \ - }; - - GridUnopClass(UnarySub,-a); - GridUnopClass(UnaryNot,Not(a)); - GridUnopClass(UnaryAdj,adj(a)); - GridUnopClass(UnaryConj,conjugate(a)); - GridUnopClass(UnaryTrace,trace(a)); - GridUnopClass(UnaryTranspose,transpose(a)); - GridUnopClass(UnaryTa,Ta(a)); - GridUnopClass(UnaryProjectOnGroup,ProjectOnGroup(a)); - GridUnopClass(UnaryReal,real(a)); - GridUnopClass(UnaryImag,imag(a)); - GridUnopClass(UnaryToReal,toReal(a)); - GridUnopClass(UnaryToComplex,toComplex(a)); - GridUnopClass(UnaryTimesI,timesI(a)); - GridUnopClass(UnaryTimesMinusI,timesMinusI(a)); - GridUnopClass(UnaryAbs,abs(a)); - GridUnopClass(UnarySqrt,sqrt(a)); - GridUnopClass(UnaryRsqrt,rsqrt(a)); - GridUnopClass(UnarySin,sin(a)); - GridUnopClass(UnaryCos,cos(a)); - GridUnopClass(UnaryAsin,asin(a)); - GridUnopClass(UnaryAcos,acos(a)); - GridUnopClass(UnaryLog,log(a)); - GridUnopClass(UnaryExp,exp(a)); - +#define GridUnopClass(name, ret) \ + template \ + struct name { \ + static auto inline func(const arg a) -> decltype(ret) { return ret; } \ + }; + +GridUnopClass(UnarySub, -a); +GridUnopClass(UnaryNot, Not(a)); +GridUnopClass(UnaryAdj, adj(a)); +GridUnopClass(UnaryConj, conjugate(a)); +GridUnopClass(UnaryTrace, trace(a)); +GridUnopClass(UnaryTranspose, transpose(a)); +GridUnopClass(UnaryTa, Ta(a)); +GridUnopClass(UnaryProjectOnGroup, ProjectOnGroup(a)); +GridUnopClass(UnaryReal, real(a)); +GridUnopClass(UnaryImag, imag(a)); +GridUnopClass(UnaryToReal, toReal(a)); +GridUnopClass(UnaryToComplex, toComplex(a)); +GridUnopClass(UnaryTimesI, timesI(a)); +GridUnopClass(UnaryTimesMinusI, timesMinusI(a)); +GridUnopClass(UnaryAbs, abs(a)); +GridUnopClass(UnarySqrt, sqrt(a)); +GridUnopClass(UnaryRsqrt, rsqrt(a)); +GridUnopClass(UnarySin, sin(a)); +GridUnopClass(UnaryCos, cos(a)); +GridUnopClass(UnaryAsin, asin(a)); +GridUnopClass(UnaryAcos, acos(a)); +GridUnopClass(UnaryLog, log(a)); +GridUnopClass(UnaryExp, exp(a)); + //////////////////////////////////////////// // Binary operators //////////////////////////////////////////// -#define GridBinOpClass(name,combination)\ -template \ -struct name\ -{\ - static auto inline func(const left &lhs,const right &rhs)-> decltype(combination) const \ - {\ - return combination;\ - }\ -} -GridBinOpClass(BinaryAdd,lhs+rhs); -GridBinOpClass(BinarySub,lhs-rhs); -GridBinOpClass(BinaryMul,lhs*rhs); +#define GridBinOpClass(name, combination) \ + template \ + struct name { \ + static auto inline func(const left &lhs, const right &rhs) \ + -> decltype(combination) const { \ + return combination; \ + } \ + } +GridBinOpClass(BinaryAdd, lhs + rhs); +GridBinOpClass(BinarySub, lhs - rhs); +GridBinOpClass(BinaryMul, lhs *rhs); -GridBinOpClass(BinaryAnd ,lhs&rhs); -GridBinOpClass(BinaryOr ,lhs|rhs); -GridBinOpClass(BinaryAndAnd,lhs&&rhs); -GridBinOpClass(BinaryOrOr ,lhs||rhs); +GridBinOpClass(BinaryAnd, lhs &rhs); +GridBinOpClass(BinaryOr, lhs | rhs); +GridBinOpClass(BinaryAndAnd, lhs &&rhs); +GridBinOpClass(BinaryOrOr, lhs || rhs); //////////////////////////////////////////////////// // Trinary conditional op //////////////////////////////////////////////////// -#define GridTrinOpClass(name,combination)\ -template \ -struct name\ -{\ - static auto inline func(const predicate &pred,const left &lhs,const right &rhs)-> decltype(combination) const \ - {\ - return combination;\ - }\ -} +#define GridTrinOpClass(name, combination) \ + template \ + struct name { \ + static auto inline func(const predicate &pred, const left &lhs, \ + const right &rhs) -> decltype(combination) const { \ + return combination; \ + } \ + } -GridTrinOpClass(TrinaryWhere,(predicatedWhere::type, \ - typename std::remove_reference::type> (pred,lhs,rhs))); +GridTrinOpClass( + TrinaryWhere, + (predicatedWhere::type, + typename std::remove_reference::type>(pred, lhs, + rhs))); //////////////////////////////////////////// // Operator syntactical glue //////////////////////////////////////////// - -#define GRID_UNOP(name) name -#define GRID_BINOP(name) name -#define GRID_TRINOP(name) name -#define GRID_DEF_UNOP(op, name)\ -template ::value||is_lattice_expr::value, T1>::type* = nullptr> inline auto op(const T1 &arg) \ - -> decltype(LatticeUnaryExpression(std::make_pair(GRID_UNOP(name)(),std::forward_as_tuple(arg)))) \ -{ return LatticeUnaryExpression(std::make_pair(GRID_UNOP(name)(),std::forward_as_tuple(arg))); } +#define GRID_UNOP(name) name +#define GRID_BINOP(name) name +#define GRID_TRINOP(name) \ + name -#define GRID_BINOP_LEFT(op, name)\ -template ::value||is_lattice_expr::value, T1>::type* = nullptr>\ -inline auto op(const T1 &lhs,const T2&rhs) \ - -> decltype(LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs)))) \ -{\ - return LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs))); \ -} +#define GRID_DEF_UNOP(op, name) \ + template ::value || \ + is_lattice_expr::value, \ + T1>::type * = nullptr> \ + inline auto op(const T1 &arg) \ + ->decltype(LatticeUnaryExpression( \ + std::make_pair(GRID_UNOP(name)(), std::forward_as_tuple(arg)))) { \ + return LatticeUnaryExpression( \ + std::make_pair(GRID_UNOP(name)(), std::forward_as_tuple(arg))); \ + } -#define GRID_BINOP_RIGHT(op, name)\ - template ::value && !is_lattice_expr::value, T1>::type* = nullptr,\ - typename std::enable_if< is_lattice::value || is_lattice_expr::value, T2>::type* = nullptr> \ -inline auto op(const T1 &lhs,const T2&rhs) \ - -> decltype(LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs)))) \ -{\ - return LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs))); \ -} +#define GRID_BINOP_LEFT(op, name) \ + template ::value || \ + is_lattice_expr::value, \ + T1>::type * = nullptr> \ + inline auto op(const T1 &lhs, const T2 &rhs) \ + ->decltype( \ + LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), \ + std::forward_as_tuple(lhs, rhs)))) { \ + return LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), std::forward_as_tuple(lhs, rhs))); \ + } -#define GRID_DEF_BINOP(op, name)\ - GRID_BINOP_LEFT(op,name);\ - GRID_BINOP_RIGHT(op,name); +#define GRID_BINOP_RIGHT(op, name) \ + template ::value && \ + !is_lattice_expr::value, \ + T1>::type * = nullptr, \ + typename std::enable_if::value || \ + is_lattice_expr::value, \ + T2>::type * = nullptr> \ + inline auto op(const T1 &lhs, const T2 &rhs) \ + ->decltype( \ + LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), \ + std::forward_as_tuple(lhs, rhs)))) { \ + return LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), std::forward_as_tuple(lhs, rhs))); \ + } +#define GRID_DEF_BINOP(op, name) \ + GRID_BINOP_LEFT(op, name); \ + GRID_BINOP_RIGHT(op, name); -#define GRID_DEF_TRINOP(op, name)\ -template inline auto op(const T1 &pred,const T2&lhs,const T3 &rhs) \ - -> decltype(LatticeTrinaryExpression(std::make_pair(GRID_TRINOP(name)(),\ - std::forward_as_tuple(pred,lhs,rhs)))) \ -{\ - return LatticeTrinaryExpression(std::make_pair(GRID_TRINOP(name)(), \ - std::forward_as_tuple(pred,lhs, rhs))); \ -} +#define GRID_DEF_TRINOP(op, name) \ + template \ + inline auto op(const T1 &pred, const T2 &lhs, const T3 &rhs) \ + ->decltype( \ + LatticeTrinaryExpression(std::make_pair( \ + GRID_TRINOP(name)(), std::forward_as_tuple(pred, lhs, rhs)))) { \ + return LatticeTrinaryExpression(std::make_pair( \ + GRID_TRINOP(name)(), std::forward_as_tuple(pred, lhs, rhs))); \ + } //////////////////////// -//Operator definitions +// Operator definitions //////////////////////// -GRID_DEF_UNOP(operator -,UnarySub); -GRID_DEF_UNOP(Not,UnaryNot); -GRID_DEF_UNOP(operator !,UnaryNot); -GRID_DEF_UNOP(adj,UnaryAdj); -GRID_DEF_UNOP(conjugate,UnaryConj); -GRID_DEF_UNOP(trace,UnaryTrace); -GRID_DEF_UNOP(transpose,UnaryTranspose); -GRID_DEF_UNOP(Ta,UnaryTa); -GRID_DEF_UNOP(ProjectOnGroup,UnaryProjectOnGroup); -GRID_DEF_UNOP(real,UnaryReal); -GRID_DEF_UNOP(imag,UnaryImag); -GRID_DEF_UNOP(toReal,UnaryToReal); -GRID_DEF_UNOP(toComplex,UnaryToComplex); -GRID_DEF_UNOP(timesI,UnaryTimesI); -GRID_DEF_UNOP(timesMinusI,UnaryTimesMinusI); -GRID_DEF_UNOP(abs ,UnaryAbs); //abs overloaded in cmath C++98; DON'T do the abs-fabs-dabs-labs thing -GRID_DEF_UNOP(sqrt ,UnarySqrt); -GRID_DEF_UNOP(rsqrt,UnaryRsqrt); -GRID_DEF_UNOP(sin ,UnarySin); -GRID_DEF_UNOP(cos ,UnaryCos); -GRID_DEF_UNOP(asin ,UnaryAsin); -GRID_DEF_UNOP(acos ,UnaryAcos); -GRID_DEF_UNOP(log ,UnaryLog); -GRID_DEF_UNOP(exp ,UnaryExp); +GRID_DEF_UNOP(operator-, UnarySub); +GRID_DEF_UNOP(Not, UnaryNot); +GRID_DEF_UNOP(operator!, UnaryNot); +GRID_DEF_UNOP(adj, UnaryAdj); +GRID_DEF_UNOP(conjugate, UnaryConj); +GRID_DEF_UNOP(trace, UnaryTrace); +GRID_DEF_UNOP(transpose, UnaryTranspose); +GRID_DEF_UNOP(Ta, UnaryTa); +GRID_DEF_UNOP(ProjectOnGroup, UnaryProjectOnGroup); +GRID_DEF_UNOP(real, UnaryReal); +GRID_DEF_UNOP(imag, UnaryImag); +GRID_DEF_UNOP(toReal, UnaryToReal); +GRID_DEF_UNOP(toComplex, UnaryToComplex); +GRID_DEF_UNOP(timesI, UnaryTimesI); +GRID_DEF_UNOP(timesMinusI, UnaryTimesMinusI); +GRID_DEF_UNOP(abs, UnaryAbs); // abs overloaded in cmath C++98; DON'T do the + // abs-fabs-dabs-labs thing +GRID_DEF_UNOP(sqrt, UnarySqrt); +GRID_DEF_UNOP(rsqrt, UnaryRsqrt); +GRID_DEF_UNOP(sin, UnarySin); +GRID_DEF_UNOP(cos, UnaryCos); +GRID_DEF_UNOP(asin, UnaryAsin); +GRID_DEF_UNOP(acos, UnaryAcos); +GRID_DEF_UNOP(log, UnaryLog); +GRID_DEF_UNOP(exp, UnaryExp); -GRID_DEF_BINOP(operator+,BinaryAdd); -GRID_DEF_BINOP(operator-,BinarySub); -GRID_DEF_BINOP(operator*,BinaryMul); +GRID_DEF_BINOP(operator+, BinaryAdd); +GRID_DEF_BINOP(operator-, BinarySub); +GRID_DEF_BINOP(operator*, BinaryMul); -GRID_DEF_BINOP(operator&,BinaryAnd); -GRID_DEF_BINOP(operator|,BinaryOr); -GRID_DEF_BINOP(operator&&,BinaryAndAnd); -GRID_DEF_BINOP(operator||,BinaryOrOr); +GRID_DEF_BINOP(operator&, BinaryAnd); +GRID_DEF_BINOP(operator|, BinaryOr); +GRID_DEF_BINOP(operator&&, BinaryAndAnd); +GRID_DEF_BINOP(operator||, BinaryOrOr); -GRID_DEF_TRINOP(where,TrinaryWhere); +GRID_DEF_TRINOP(where, TrinaryWhere); ///////////////////////////////////////////////////////////// // Closure convenience to force expression to evaluate ///////////////////////////////////////////////////////////// -template - auto closure(const LatticeUnaryExpression & expr) - -> Lattice(expr.second))))> -{ - Lattice(expr.second))))> ret(expr); +template +auto closure(const LatticeUnaryExpression &expr) + -> Lattice(expr.second))))> { + Lattice(expr.second))))> ret( + expr); return ret; } -template - auto closure(const LatticeBinaryExpression & expr) - -> Lattice(expr.second)), - eval(0,std::get<1>(expr.second))))> -{ - Lattice(expr.second)), - eval(0,std::get<1>(expr.second))))> ret(expr); +template +auto closure(const LatticeBinaryExpression &expr) + -> Lattice(expr.second)), + eval(0, std::get<1>(expr.second))))> { + Lattice(expr.second)), + eval(0, std::get<1>(expr.second))))> + ret(expr); return ret; } -template - auto closure(const LatticeTrinaryExpression & expr) - -> Lattice(expr.second)), - eval(0,std::get<1>(expr.second)), - eval(0,std::get<2>(expr.second))))> -{ - Lattice(expr.second)), - eval(0,std::get<1>(expr.second)), - eval(0,std::get<2>(expr.second))))> ret(expr); +template +auto closure(const LatticeTrinaryExpression &expr) + -> Lattice(expr.second)), + eval(0, std::get<1>(expr.second)), + eval(0, std::get<2>(expr.second))))> { + Lattice(expr.second)), + eval(0, std::get<1>(expr.second)), + eval(0, std::get<2>(expr.second))))> + ret(expr); return ret; } @@ -390,12 +422,11 @@ template #undef GRID_DEF_UNOP #undef GRID_DEF_BINOP #undef GRID_DEF_TRINOP - } #if 0 using namespace Grid; - + int main(int argc,char **argv){ Lattice v1(16); @@ -405,7 +436,7 @@ using namespace Grid; BinaryAdd tmp; LatticeBinaryExpression,Lattice &,Lattice &> expr(std::make_pair(tmp, - std::forward_as_tuple(v1,v2))); + std::forward_as_tuple(v1,v2))); tmp.func(eval(0,v1),eval(0,v2)); auto var = v1+v2; diff --git a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h index 1b836b4c..080b1be2 100644 --- a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h +++ b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h @@ -1,212 +1,214 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h +Source file: ./lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h - Copyright (C) 2015 +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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef QCD_PSEUDOFERMION_ONE_FLAVOUR_EVEN_ODD_RATIONAL_H #define QCD_PSEUDOFERMION_ONE_FLAVOUR_EVEN_ODD_RATIONAL_H -namespace Grid{ - namespace QCD{ +namespace Grid { +namespace QCD { - /////////////////////////////////////// - // One flavour rational - /////////////////////////////////////// +/////////////////////////////////////// +// One flavour rational +/////////////////////////////////////// - // S_f = chi^dag * N(Mpc^dag*Mpc)/D(Mpc^dag*Mpc) * chi +// S_f = chi^dag * N(Mpc^dag*Mpc)/D(Mpc^dag*Mpc) * chi +// +// Here, M is some operator +// N and D makeup the rat. poly +// + +template +class OneFlavourEvenOddRationalPseudoFermionAction + : public Action { + public: + INHERIT_IMPL_TYPES(Impl); + + typedef OneFlavourRationalParams Params; + Params param; + + MultiShiftFunction PowerHalf; + MultiShiftFunction PowerNegHalf; + MultiShiftFunction PowerQuarter; + MultiShiftFunction PowerNegQuarter; + + private: + FermionOperator &FermOp; // the basic operator + + // NOT using "Nroots"; IroIro is -- perhaps later, but this wasn't good for us + // historically + // and hasenbusch works better + + FermionField PhiEven; // the pseudo fermion field for this trajectory + FermionField PhiOdd; // the pseudo fermion field for this trajectory + + public: + OneFlavourEvenOddRationalPseudoFermionAction(FermionOperator &Op, + Params &p) + : FermOp(Op), + PhiEven(Op.FermionRedBlackGrid()), + PhiOdd(Op.FermionRedBlackGrid()), + param(p) { + AlgRemez remez(param.lo, param.hi, param.precision); + + // MdagM^(+- 1/2) + std::cout << GridLogMessage << "Generating degree " << param.degree + << " for x^(1/2)" << std::endl; + remez.generateApprox(param.degree, 1, 2); + PowerHalf.Init(remez, param.tolerance, false); + PowerNegHalf.Init(remez, param.tolerance, true); + + // MdagM^(+- 1/4) + std::cout << GridLogMessage << "Generating degree " << param.degree + << " for x^(1/4)" << std::endl; + remez.generateApprox(param.degree, 1, 4); + PowerQuarter.Init(remez, param.tolerance, false); + PowerNegQuarter.Init(remez, param.tolerance, true); + }; + + virtual void refresh(const GaugeField &U, GridParallelRNG &pRNG) { + // P(phi) = e^{- phi^dag (MpcdagMpc)^-1/2 phi} + // = e^{- phi^dag (MpcdagMpc)^-1/4 (MpcdagMpc)^-1/4 phi} + // Phi = MpcdagMpc^{1/4} eta // - // Here, M is some operator - // N and D makeup the rat. poly + // P(eta) = e^{- eta^dag eta} // - - template - class OneFlavourEvenOddRationalPseudoFermionAction : public Action { - public: - INHERIT_IMPL_TYPES(Impl); + // e^{x^2/2 sig^2} => sig^2 = 0.5. + // + // So eta should be of width sig = 1/sqrt(2). - typedef OneFlavourRationalParams Params; - Params param; + RealD scale = std::sqrt(0.5); - MultiShiftFunction PowerHalf ; - MultiShiftFunction PowerNegHalf; - MultiShiftFunction PowerQuarter; - MultiShiftFunction PowerNegQuarter; + FermionField eta(FermOp.FermionGrid()); + FermionField etaOdd(FermOp.FermionRedBlackGrid()); + FermionField etaEven(FermOp.FermionRedBlackGrid()); - private: - - FermionOperator & FermOp;// the basic operator + gaussian(pRNG, eta); + eta = eta * scale; - // NOT using "Nroots"; IroIro is -- perhaps later, but this wasn't good for us historically - // and hasenbusch works better + pickCheckerboard(Even, etaEven, eta); + pickCheckerboard(Odd, etaOdd, eta); - FermionField PhiEven; // the pseudo fermion field for this trajectory - FermionField PhiOdd; // the pseudo fermion field for this trajectory - + FermOp.ImportGauge(U); - public: + // mutishift CG + SchurDifferentiableOperator Mpc(FermOp); + ConjugateGradientMultiShift msCG(param.MaxIter, PowerQuarter); + msCG(Mpc, etaOdd, PhiOdd); - OneFlavourEvenOddRationalPseudoFermionAction(FermionOperator &Op, - Params & p ) : FermOp(Op), - PhiEven(Op.FermionRedBlackGrid()), - PhiOdd (Op.FermionRedBlackGrid()), - param(p) - { - AlgRemez remez(param.lo,param.hi,param.precision); + ////////////////////////////////////////////////////// + // FIXME : Clover term not yet.. + ////////////////////////////////////////////////////// - // MdagM^(+- 1/2) - std::cout< sig^2 = 0.5. - // - // So eta should be of width sig = 1/sqrt(2). + FermionField Y(FermOp.FermionRedBlackGrid()); - RealD scale = std::sqrt(0.5); + SchurDifferentiableOperator Mpc(FermOp); - FermionField eta (FermOp.FermionGrid()); - FermionField etaOdd (FermOp.FermionRedBlackGrid()); - FermionField etaEven(FermOp.FermionRedBlackGrid()); + ConjugateGradientMultiShift msCG(param.MaxIter, + PowerNegQuarter); - gaussian(pRNG,eta); eta=eta*scale; + msCG(Mpc, PhiOdd, Y); - pickCheckerboard(Even,etaEven,eta); - pickCheckerboard(Odd,etaOdd,eta); + RealD action = norm2(Y); + std::cout << GridLogMessage << "Pseudofermion action FIXME -- is -1/4 " + "solve or -1/2 solve faster??? " + << action << std::endl; - FermOp.ImportGauge(U); + return action; + }; - // mutishift CG - SchurDifferentiableOperator Mpc(FermOp); - ConjugateGradientMultiShift msCG(param.MaxIter,PowerQuarter); - msCG(Mpc,etaOdd,PhiOdd); + ////////////////////////////////////////////////////// + // Need + // dS_f/dU = chi^dag d[N/D] chi + // + // N/D is expressed as partial fraction expansion: + // + // a0 + \sum_k ak/(M^dagM + bk) + // + // d[N/D] is then + // + // \sum_k -ak [M^dagM+bk]^{-1} [ dM^dag M + M^dag dM ] [M^dag M + + // bk]^{-1} + // + // Need + // Mf Phi_k = [MdagM+bk]^{-1} Phi + // Mf Phi = \sum_k ak [MdagM+bk]^{-1} Phi + // + // With these building blocks + // + // dS/dU = \sum_k -ak Mf Phi_k^dag [ dM^dag M + M^dag dM ] Mf + // Phi_k + // S = innerprodReal(Phi,Mf Phi); + ////////////////////////////////////////////////////// + virtual void deriv(const GaugeField &U, GaugeField &dSdU) { + const int Npole = PowerNegHalf.poles.size(); - ////////////////////////////////////////////////////// - // FIXME : Clover term not yet.. - ////////////////////////////////////////////////////// + std::vector MPhi_k(Npole, FermOp.FermionRedBlackGrid()); - assert(FermOp.ConstEE() == 1); - PhiEven = zero; - - }; + FermionField X(FermOp.FermionRedBlackGrid()); + FermionField Y(FermOp.FermionRedBlackGrid()); - ////////////////////////////////////////////////////// - // S = phi^dag (Mdag M)^-1/2 phi - ////////////////////////////////////////////////////// - virtual RealD S(const GaugeField &U) { + GaugeField tmp(FermOp.GaugeGrid()); - FermOp.ImportGauge(U); + FermOp.ImportGauge(U); - FermionField Y(FermOp.FermionRedBlackGrid()); - - SchurDifferentiableOperator Mpc(FermOp); + SchurDifferentiableOperator Mpc(FermOp); - ConjugateGradientMultiShift msCG(param.MaxIter,PowerNegQuarter); + ConjugateGradientMultiShift msCG(param.MaxIter, PowerNegHalf); - msCG(Mpc,PhiOdd,Y); + msCG(Mpc, PhiOdd, MPhi_k); - RealD action = norm2(Y); - std::cout << GridLogMessage << "Pseudofermion action FIXME -- is -1/4 solve or -1/2 solve faster??? "< MPhi_k (Npole,FermOp.FermionRedBlackGrid()); - - FermionField X(FermOp.FermionRedBlackGrid()); - FermionField Y(FermOp.FermionRedBlackGrid()); - - GaugeField tmp(FermOp.GaugeGrid()); - - FermOp.ImportGauge(U); - - SchurDifferentiableOperator Mpc(FermOp); - - ConjugateGradientMultiShift msCG(param.MaxIter,PowerNegHalf); - - msCG(Mpc,PhiOdd,MPhi_k); - - dSdU = zero; - for(int k=0;k 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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_MATH_TENSORS_H #define GRID_MATH_TENSORS_H @@ -38,17 +39,18 @@ namespace Grid { // It is useful to NOT have any constructors // so that these classes assert "is_pod == true" -// because then the standard C++ valarray container eliminates fill overhead on new allocation and +// because then the standard C++ valarray container eliminates fill overhead on +// new allocation and // non-move copying. // -// However note that doing this eliminates some syntactical sugar such as +// However note that doing this eliminates some syntactical sugar such as // calling the constructor explicitly or implicitly // class GridTensorBase {}; -template class iScalar -{ -public: +template +class iScalar { + public: vtype _internal; typedef vtype element; @@ -60,13 +62,14 @@ public: typedef iScalar scalar_object; // substitutes a real or complex version with same tensor structure - typedef iScalar::Complexified > Complexified; - typedef iScalar::Realified > Realified; + typedef iScalar::Complexified> Complexified; + typedef iScalar::Realified> Realified; - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1 }; // Scalar no action - // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; + // template using tensor_reduce_level = typename + // iScalar::tensor_reduce_level >; iScalar() = default; /* iScalar(const iScalar ©me)=default; @@ -74,83 +77,106 @@ public: iScalar & operator= (const iScalar ©me) = default; iScalar & operator= (iScalar &©me) = default; */ - iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type - iScalar(const Zero &z){ *this = zero; }; + iScalar(scalar_type s) + : _internal(s){}; // recurse down and hit the constructor for vector_type + iScalar(const Zero &z) { *this = zero; }; - iScalar & operator= (const Zero &hero){ + iScalar &operator=(const Zero &hero) { zeroit(*this); return *this; } - friend strong_inline void vstream(iScalar &out,const iScalar &in){ - vstream(out._internal,in._internal); + friend strong_inline void vstream(iScalar &out, + const iScalar &in) { + vstream(out._internal, in._internal); } - friend strong_inline void zeroit(iScalar &that){ + friend strong_inline void zeroit(iScalar &that) { zeroit(that._internal); } - friend strong_inline void prefetch(iScalar &that){ + friend strong_inline void prefetch(iScalar &that) { prefetch(that._internal); } - friend strong_inline void permute(iScalar &out,const iScalar &in,int permutetype){ - permute(out._internal,in._internal,permutetype); + friend strong_inline void permute(iScalar &out, + const iScalar &in, int permutetype) { + permute(out._internal, in._internal, permutetype); } // Unary negation - friend strong_inline iScalar operator -(const iScalar &r) { + friend strong_inline iScalar operator-(const iScalar &r) { iScalar ret; - ret._internal= -r._internal; + ret._internal = -r._internal; return ret; } // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - strong_inline iScalar &operator *=(const iScalar &r) { - *this = (*this)*r; + strong_inline iScalar &operator*=(const iScalar &r) { + *this = (*this) * r; return *this; } - strong_inline iScalar &operator -=(const iScalar &r) { - *this = (*this)-r; + strong_inline iScalar &operator-=(const iScalar &r) { + *this = (*this) - r; return *this; } - strong_inline iScalar &operator +=(const iScalar &r) { - *this = (*this)+r; + strong_inline iScalar &operator+=(const iScalar &r) { + *this = (*this) + r; return *this; } - strong_inline vtype & operator ()(void) { - return _internal; - } - strong_inline const vtype & operator ()(void) const { - return _internal; - } + strong_inline vtype &operator()(void) { return _internal; } + strong_inline const vtype &operator()(void) const { return _internal; } // Type casts meta programmed, must be pure scalar to match TensorRemove - template = 0,IfNotSimd = 0> operator ComplexF () const { return(TensorRemove(_internal)); }; - template = 0,IfNotSimd = 0> operator ComplexD () const { return(TensorRemove(_internal)); }; - // template = 0,IfNotSimd = 0> operator RealD () const { return(real(TensorRemove(_internal))); } - template = 0,IfNotSimd = 0> operator RealD () const { return TensorRemove(_internal); } - template = 0,IfNotSimd = 0> operator Integer () const { return Integer(TensorRemove(_internal)); } - - // convert from a something to a scalar via constructor of something arg - template::value, T>::type* = nullptr > strong_inline iScalar operator = (T arg) - { - _internal = arg; - return *this; - } + template = 0, + IfNotSimd = 0> + operator ComplexF() const { + return (TensorRemove(_internal)); + }; + template = 0, + IfNotSimd = 0> + operator ComplexD() const { + return (TensorRemove(_internal)); + }; + // template = 0,IfNotSimd = + // 0> operator RealD () const { return(real(TensorRemove(_internal))); } + template = 0, + IfNotSimd = 0> + operator RealD() const { + return TensorRemove(_internal); + } + template = 0, + IfNotSimd = 0> + operator Integer() const { + return Integer(TensorRemove(_internal)); + } - friend std::ostream& operator<< (std::ostream& stream, const iScalar &o){ - stream<< "S {"<::value, T>::type + * = nullptr> + strong_inline iScalar operator=(T arg) { + _internal = arg; + return *this; + } + + friend std::ostream &operator<<(std::ostream &stream, + const iScalar &o) { + stream << "S {" << o._internal << "}"; + return stream; + }; }; /////////////////////////////////////////////////////////// // Allows to turn scalar>>> back to double. /////////////////////////////////////////////////////////// -template strong_inline typename std::enable_if::value, T>::type TensorRemove(T arg) { return arg;} -template strong_inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) -{ +template +strong_inline typename std::enable_if::value, T>::type +TensorRemove(T arg) { + return arg; +} +template +strong_inline auto TensorRemove(iScalar arg) + -> decltype(TensorRemove(arg._internal)) { return TensorRemove(arg._internal); } - -template class iVector -{ -public: + +template +class iVector { + public: vtype _internal[N]; typedef vtype element; @@ -159,23 +185,23 @@ public: typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; typedef typename GridTypeMapper::scalar_object recurse_scalar_object; typedef iScalar tensor_reduced; - typedef iVector scalar_object; + typedef iVector scalar_object; // substitutes a real or complex version with same tensor structure - typedef iVector::Complexified,N > Complexified; - typedef iVector::Realified,N > Realified; + typedef iVector::Complexified, N> Complexified; + typedef iVector::Realified, N> Realified; - template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iVector - { - zeroit(*this); - for(int i=0;i::value, T>::type + * = nullptr> + strong_inline auto operator=(T arg) -> iVector { + zeroit(*this); + for (int i = 0; i < N; i++) _internal[i] = arg; + return *this; + } - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - iVector(const Zero &z){ *this = zero; }; - iVector() =default; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1 }; + iVector(const Zero &z) { *this = zero; }; + iVector() = default; /* iVector(const iVector ©me)=default; iVector(iVector &©me)=default; @@ -183,71 +209,71 @@ public: iVector & operator= (iVector &©me) = default; */ - iVector & operator= (const Zero &hero){ + iVector &operator=(const Zero &hero) { zeroit(*this); return *this; } - friend strong_inline void zeroit(iVector &that){ - for(int i=0;i &that) { + for (int i = 0; i < N; i++) { zeroit(that._internal[i]); } } - friend strong_inline void prefetch(iVector &that){ - for(int i=0;i &that) { + for (int i = 0; i < N; i++) prefetch(that._internal[i]); } - friend strong_inline void vstream(iVector &out,const iVector &in){ - for(int i=0;i &out, + const iVector &in) { + for (int i = 0; i < N; i++) { + vstream(out._internal[i], in._internal[i]); } } - friend strong_inline void permute(iVector &out,const iVector &in,int permutetype){ - for(int i=0;i &out, + const iVector &in, + int permutetype) { + for (int i = 0; i < N; i++) { + permute(out._internal[i], in._internal[i], permutetype); } } // Unary negation - friend strong_inline iVector operator -(const iVector &r) { - iVector ret; - for(int i=0;i operator-(const iVector &r) { + iVector ret; + for (int i = 0; i < N; i++) ret._internal[i] = -r._internal[i]; return ret; } // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - strong_inline iVector &operator *=(const iScalar &r) { - *this = (*this)*r; + strong_inline iVector &operator*=(const iScalar &r) { + *this = (*this) * r; return *this; } - strong_inline iVector &operator -=(const iVector &r) { - *this = (*this)-r; + strong_inline iVector &operator-=(const iVector &r) { + *this = (*this) - r; return *this; } - strong_inline iVector &operator +=(const iVector &r) { - *this = (*this)+r; + strong_inline iVector &operator+=(const iVector &r) { + *this = (*this) + r; return *this; } - strong_inline vtype & operator ()(int i) { - return _internal[i]; - } - strong_inline const vtype & operator ()(int i) const { - return _internal[i]; - } - friend std::ostream& operator<< (std::ostream& stream, const iVector &o){ - stream<< "V<"<{"; - for(int i=0;i &o) { + stream << "V<" << N << ">{"; + for (int i = 0; i < N; i++) { + stream << o._internal[i]; + if (i < N - 1) stream << ","; } - stream<<"}"; + stream << "}"; return stream; }; // strong_inline vtype && operator ()(int i) { // return _internal[i]; // } }; - -template class iMatrix -{ -public: + +template +class iMatrix { + public: vtype _internal[N][N]; typedef vtype element; @@ -257,29 +283,27 @@ public: typedef typename GridTypeMapper::scalar_object recurse_scalar_object; // substitutes a real or complex version with same tensor structure - typedef iMatrix::Complexified,N > Complexified; - typedef iMatrix::Realified,N > Realified; + typedef iMatrix::Complexified, N> Complexified; + typedef iMatrix::Realified, N> Realified; // Tensure removal typedef iScalar tensor_reduced; - typedef iMatrix scalar_object; + typedef iMatrix scalar_object; - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1 }; + iMatrix(const Zero &z) { *this = zero; }; + iMatrix() = default; - iMatrix(const Zero &z){ *this = zero; }; - iMatrix() =default; - - iMatrix& operator=(const iMatrix& rhs){ - for(int i=0;i ©me)=default; @@ -288,118 +312,118 @@ public: iMatrix & operator= (iMatrix &©me) = default; */ - - - iMatrix & operator= (const Zero &hero){ + iMatrix &operator=(const Zero &hero) { zeroit(*this); return *this; } - template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iMatrix - { - zeroit(*this); - for(int i=0;i::value, T>::type + * = nullptr> + strong_inline auto operator=(T arg) -> iMatrix { + zeroit(*this); + for (int i = 0; i < N; i++) _internal[i][i] = arg; + return *this; + } + + friend strong_inline void zeroit(iMatrix &that) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + zeroit(that._internal[i][j]); + } } - - friend strong_inline void zeroit(iMatrix &that){ - for(int i=0;i &that){ - for(int i=0;i &that) { + for (int i = 0; i < N; i++) + for (int j = 0; j < N; j++) prefetch(that._internal[i][j]); } - friend strong_inline void vstream(iMatrix &out,const iMatrix &in){ - for(int i=0;i &out, + const iMatrix &in) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + vstream(out._internal[i][j], in._internal[i][j]); + } } - - friend strong_inline void permute(iMatrix &out,const iMatrix &in,int permutetype){ - for(int i=0;i &out, + const iMatrix &in, + int permutetype) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + permute(out._internal[i][j], in._internal[i][j], permutetype); + } + } + } // Unary negation - friend strong_inline iMatrix operator -(const iMatrix &r) { - iMatrix ret; - for(int i=0;i operator-(const iMatrix &r) { + iMatrix ret; + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + ret._internal[i][j] = -r._internal[i][j]; + } + } return ret; } // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - template - strong_inline iMatrix &operator *=(const T &r) { - *this = (*this)*r; + template + strong_inline iMatrix &operator*=(const T &r) { + *this = (*this) * r; return *this; } - template - strong_inline iMatrix &operator -=(const T &r) { - *this = (*this)-r; + template + strong_inline iMatrix &operator-=(const T &r) { + *this = (*this) - r; return *this; } - template - strong_inline iMatrix &operator +=(const T &r) { - *this = (*this)+r; + template + strong_inline iMatrix &operator+=(const T &r) { + *this = (*this) + r; return *this; } // returns an lvalue reference - strong_inline vtype & operator ()(int i,int j) { + strong_inline vtype &operator()(int i, int j) { return _internal[i][j]; } + strong_inline const vtype &operator()(int i, int j) const { return _internal[i][j]; } - strong_inline const vtype & operator ()(int i,int j) const { - return _internal[i][j]; - } - friend std::ostream& operator<< (std::ostream& stream, const iMatrix &o){ - stream<< "M<"<{"; - for(int i=0;i &o) { + stream << "M<" << N << ">{"; + for (int i = 0; i < N; i++) { + stream << "{"; + for (int j = 0; j < N; j++) { + stream << o._internal[i][j]; + if (i < N - 1) stream << ","; } - stream<<"}"; - if(i!=N-1) stream<<"\n\t\t"; + stream << "}"; + if (i != N - 1) stream << "\n\t\t"; } - stream<<"}"; + stream << "}"; return stream; }; // strong_inline vtype && operator ()(int i,int j) { // return _internal[i][j]; // } - }; -template void vprefetch(const iScalar &vv) -{ +template +void vprefetch(const iScalar &vv) { vprefetch(vv._internal); } -template void vprefetch(const iVector &vv) -{ - for(int i=0;i +void vprefetch(const iVector &vv) { + for (int i = 0; i < N; i++) { vprefetch(vv._internal[i]); } } -template void vprefetch(const iMatrix &vv) -{ - for(int i=0;i +void vprefetch(const iMatrix &vv) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + vprefetch(vv._internal[i][j]); + } + } } - - } #endif diff --git a/tests/Test_rhmc_EOWilson1p1.cc b/tests/Test_rhmc_EOWilson1p1.cc index 90282ea1..43de6c22 100644 --- a/tests/Test_rhmc_EOWilson1p1.cc +++ b/tests/Test_rhmc_EOWilson1p1.cc @@ -1,97 +1,100 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./tests/Test_rhmc_EOWilson1p1.cc +Source file: ./tests/Test_rhmc_EOWilson1p1.cc - Copyright (C) 2015 +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 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. +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. +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 */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #include "Grid.h" using namespace std; using namespace Grid; using namespace Grid::QCD; -namespace Grid { - namespace QCD { - +namespace Grid { +namespace QCD { class HmcRunner : public NerscHmcRunner { -public: - - void BuildTheAction (int argc, char **argv) + public: + void BuildTheAction(int argc, char **argv) { typedef WilsonImplR ImplPolicy; typedef WilsonFermionR FermionAction; typedef typename FermionAction::FermionField FermionField; - UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); + UGrid = SpaceTimeGrid::makeFourDimGrid( + GridDefaultLatt(), GridDefaultSimd(Nd, vComplex::Nsimd()), + GridDefaultMpi()); UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); - - FGrid = UGrid; + + FGrid = UGrid; FrbGrid = UrbGrid; // temporarily need a gauge field - LatticeGaugeField U(UGrid); + LatticeGaugeField U(UGrid); // Gauge action WilsonGaugeActionR Waction(5.6); - Real mass=-0.77; - FermionAction FermOp(U,*FGrid,*FrbGrid,mass); + Real mass = -0.77; + FermionAction FermOp(U, *FGrid, *FrbGrid, mass); // 1+1 flavour - OneFlavourRationalParams Params(1.0e-4,64.0,1000,1.0e-6); - OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1a(FermOp,Params); - OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1b(FermOp,Params); + OneFlavourRationalParams Params(1.0e-4, 64.0, 2000, 1.0e-6); + OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1a( + FermOp, Params); + OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1b( + FermOp, Params); - //Collect actions + //Smearing on/off + WilsonNf1a.is_smeared = true; + WilsonNf1b.is_smeared = true; + + // Collect actions ActionLevel Level1; Level1.push_back(&WilsonNf1a); Level1.push_back(&WilsonNf1b); Level1.push_back(&Waction); - + TheAction.push_back(Level1); - Run(argc,argv); + Run(argc, argv); }; - }; - -}} - -int main (int argc, char ** argv) -{ - Grid_init(&argc,&argv); - - int threads = GridThread::GetThreads(); - std::cout< Date: Thu, 7 Jul 2016 16:06:30 -0400 Subject: [PATCH 32/34] Bugfix --- lib/algorithms/iterative/ConjugateGradientMixedPrec.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithms/iterative/ConjugateGradientMixedPrec.h b/lib/algorithms/iterative/ConjugateGradientMixedPrec.h index bac2d18a..446465a1 100644 --- a/lib/algorithms/iterative/ConjugateGradientMixedPrec.h +++ b/lib/algorithms/iterative/ConjugateGradientMixedPrec.h @@ -51,7 +51,7 @@ namespace Grid { OuterLoopNormMult(100.), guesser(NULL){ }; void useGuesser(LinearFunction &g){ - guesser = g; + guesser = &g; } void operator() (const FieldD &src_d_in, FieldD &sol_d){ From a3c0fb79b6fab365aca3cce8c7d736b804dbca55 Mon Sep 17 00:00:00 2001 From: Christopher Kelly Date: Mon, 11 Jul 2016 17:15:22 -0400 Subject: [PATCH 33/34] Fix to iVector and iMatrix pokeIndex and checkerboard local site indexing. --- lib/cartesian/Cartesian_base.h | 2 +- lib/cartesian/Cartesian_red_black.h | 15 +++++++++++++-- lib/tensors/Tensor_index.h | 8 ++++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/cartesian/Cartesian_base.h b/lib/cartesian/Cartesian_base.h index 8272ac71..6fac30e9 100644 --- a/lib/cartesian/Cartesian_base.h +++ b/lib/cartesian/Cartesian_base.h @@ -123,7 +123,7 @@ public: ////////////////////////////////////////////////////////// // SIMD lane addressing ////////////////////////////////////////////////////////// - inline int iIndex(std::vector &lcoor) + virtual int iIndex(std::vector &lcoor) { int idx=0; for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(lcoor[d]/_rdimensions[d]); diff --git a/lib/cartesian/Cartesian_red_black.h b/lib/cartesian/Cartesian_red_black.h index 2424d8dc..d6b6afe6 100644 --- a/lib/cartesian/Cartesian_red_black.h +++ b/lib/cartesian/Cartesian_red_black.h @@ -224,9 +224,20 @@ protected: idx+=_ostride[d]*(coor[d]%_rdimensions[d]); } } - return idx; + return idx; }; - + virtual int iIndex(std::vector &lcoor) + { + int idx=0; + for(int d=0;d<_ndimension;d++) { + if( d==_checker_dim ) { + idx+=_istride[d]*(lcoor[d]/(2*_rdimensions[d])); + } else { + idx+=_istride[d]*(lcoor[d]/_rdimensions[d]); + } + } + return idx; + } }; } diff --git a/lib/tensors/Tensor_index.h b/lib/tensors/Tensor_index.h index bad9b1f1..7f34f3ac 100644 --- a/lib/tensors/Tensor_index.h +++ b/lib/tensors/Tensor_index.h @@ -146,14 +146,14 @@ class TensorIndexRecursion { } template inline static - void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal,0)),N> &arg, int i) + void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal[0],0)),N> &arg, int i) { for(int ii=0;ii::pokeIndex(ret._internal[ii],arg._internal[ii],i); } } template inline static - void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal,0)),N> &arg, int i,int j) + void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal[0],0)),N> &arg, int i,int j) { for(int ii=0;ii::pokeIndex(ret._internal[ii],arg._internal[ii],i,j); @@ -161,7 +161,7 @@ class TensorIndexRecursion { } template inline static - void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal,0)),N> &arg, int i) + void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal[0][0],0)),N> &arg, int i) { for(int ii=0;ii inline static - void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal,0)),N> &arg, int i,int j) + void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal[0][0],0)),N> &arg, int i,int j) { for(int ii=0;ii Date: Wed, 13 Jul 2016 10:49:18 -0400 Subject: [PATCH 34/34] Disabled parallel for loops in ExtractSlice and InsertSlice due to race conditions. Likely will need to do so for localConvert too. --- lib/lattice/Lattice_transfer.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/lattice/Lattice_transfer.h b/lib/lattice/Lattice_transfer.h index bd53cde9..2fa72014 100644 --- a/lib/lattice/Lattice_transfer.h +++ b/lib/lattice/Lattice_transfer.h @@ -386,7 +386,7 @@ void InsertSlice(Lattice &lowDim,Lattice & higherDim,int slice, int } // the above should guarantee that the operations are local -PARALLEL_FOR_LOOP + //PARALLEL_FOR_LOOP for(int idx=0;idxlSites();idx++){ std::vector lcoor(nl); std::vector hcoor(nh); @@ -420,15 +420,15 @@ void ExtractSlice(Lattice &lowDim, Lattice & higherDim,int slice, in assert(hg->_processors[orthog]==1); int dl; dl = 0; - for(int d=0;d_processors[dl] == hg->_processors[d]); - assert(lg->_ldimensions[dl] == hg->_ldimensions[d]); - dl++; + for(int d=0;d_processors[dl] == hg->_processors[d]); + assert(lg->_ldimensions[dl] == hg->_ldimensions[d]); + dl++; } } // the above should guarantee that the operations are local -PARALLEL_FOR_LOOP + //PARALLEL_FOR_LOOP for(int idx=0;idxlSites();idx++){ std::vector lcoor(nl); std::vector hcoor(nh);

X%eA+?%VJ{0b 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