diff --git a/Grid/qcd/action/gauge/PlaqPlusRectangleAction.h b/Grid/qcd/action/gauge/PlaqPlusRectangleAction.h index 7690092d..039d39e0 100644 --- a/Grid/qcd/action/gauge/PlaqPlusRectangleAction.h +++ b/Grid/qcd/action/gauge/PlaqPlusRectangleAction.h @@ -79,27 +79,19 @@ public: GridBase *grid = Umu.Grid(); std::vector U (Nd,grid); - std::vector U2(Nd,grid); - for(int mu=0;mu(Umu,mu); - WilsonLoops::RectStapleDouble(U2[mu],U[mu],mu); } + std::vector RectStaple(Nd,grid), Staple(Nd,grid); + WilsonLoops::StapleAll(Staple, U); + WilsonLoops::RectStapleAll(RectStaple, U); GaugeLinkField dSdU_mu(grid); GaugeLinkField staple(grid); for (int mu=0; mu < Nd; mu++){ - - // Staple in direction mu - - WilsonLoops::Staple(staple,Umu,mu); - - dSdU_mu = Ta(U[mu]*staple)*factor_p; - - WilsonLoops::RectStaple(Umu,staple,U2,U,mu); - - dSdU_mu = dSdU_mu + Ta(U[mu]*staple)*factor_r; + dSdU_mu = Ta(U[mu]*Staple[mu])*factor_p; + dSdU_mu = dSdU_mu + Ta(U[mu]*RectStaple[mu])*factor_r; PokeIndex(dSdU, dSdU_mu, mu); } diff --git a/Grid/qcd/utils/WilsonLoops.h b/Grid/qcd/utils/WilsonLoops.h index 516158d0..04359ebf 100644 --- a/Grid/qcd/utils/WilsonLoops.h +++ b/Grid/qcd/utils/WilsonLoops.h @@ -290,7 +290,7 @@ public: } */ ////////////////////////////////////////////////// - // the sum over all staples on each site + // the sum over all nu-oriented staples for nu != mu on each site ////////////////////////////////////////////////// static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { @@ -300,6 +300,10 @@ public: for (int d = 0; d < Nd; d++) { U[d] = PeekIndex(Umu, d); } + Staple(staple, U, mu); + } + + static void Staple(GaugeMat &staple, const std::vector &U, int mu) { staple = Zero(); for (int nu = 0; nu < Nd; nu++) { @@ -335,6 +339,16 @@ public: } } + ///////////// + //Staples for each direction mu, summed over nu != mu + //staple: output staples for each mu (Nd) + //U: link array (Nd) + ///////////// + static void StapleAll(std::vector &staple, const std::vector &U) { + assert(staple.size() == Nd); assert(U.size() == Nd); + for(int mu=0;mu &U2, - std::vector &U, int mu) { + static void RectStapleOptimised(GaugeMat &Stap, const std::vector &U2, + const std::vector &U, int mu) { Stap = Zero(); @@ -780,15 +794,6 @@ public: } } - 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) { - RectStapleOptimised(Stap, U2, U, mu); - } - static void RectStapleUnoptimised(GaugeMat &Stap, const GaugeLorentz &Umu, int mu) { GridBase *grid = Umu.Grid(); @@ -887,6 +892,26 @@ public: } } + 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) { + RectStapleOptimised(Stap, U2, U, mu); + } + ////////////////////////////////////////////////////// + //Compute the rectangular staples for all orientations + //Stap : Array of staples (Nd) + //U: Gauge links in each direction (Nd) + ///////////////////////////////////////////////////// + static void RectStapleAll(std::vector &Stap, const std::vector &U){ + assert(Stap.size() == Nd); assert(U.size() == Nd); + std::vector U2(Nd,U[0].Grid()); + for(int mu=0;mu +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; + +//////////////////////////////////////////////////////////////////////// +// PlaqPlusRectangleActoin +//////////////////////////////////////////////////////////////////////// +template +class PlaqPlusRectangleActionOrig : public Action { +public: + + INHERIT_GIMPL_TYPES(Gimpl); + +private: + RealD c_plaq; + RealD c_rect; + +public: + PlaqPlusRectangleActionOrig(RealD b,RealD c): c_plaq(b),c_rect(c){}; + + virtual std::string action_name(){return "PlaqPlusRectangleActionOrig";} + + virtual void refresh(const GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG& pRNG) {}; // noop as no pseudoferms + + virtual std::string LogParameters(){ + std::stringstream sstream; + sstream << GridLogMessage << "["<gSites(); + + RealD plaq = WilsonLoops::avgPlaquette(U); + RealD rect = WilsonLoops::avgRectangle(U); + + RealD action=c_plaq*(1.0 -plaq)*(Nd*(Nd-1.0))*vol*0.5 + +c_rect*(1.0 -rect)*(Nd*(Nd-1.0))*vol; + + return action; + }; + + virtual void deriv(const GaugeField &Umu,GaugeField & dSdU) { + //extend Ta to include Lorentz indexes + RealD factor_p = c_plaq/RealD(Nc)*0.5; + RealD factor_r = c_rect/RealD(Nc)*0.5; + + GridBase *grid = Umu.Grid(); + + std::vector U (Nd,grid); + std::vector U2(Nd,grid); + + for(int mu=0;mu(Umu,mu); + WilsonLoops::RectStapleDouble(U2[mu],U[mu],mu); + } + + GaugeLinkField dSdU_mu(grid); + GaugeLinkField staple(grid); + + for (int mu=0; mu < Nd; mu++){ + + // Staple in direction mu + + WilsonLoops::Staple(staple,Umu,mu); + + dSdU_mu = Ta(U[mu]*staple)*factor_p; + + WilsonLoops::RectStaple(Umu,staple,U2,U,mu); + + dSdU_mu = dSdU_mu + Ta(U[mu]*staple)*factor_r; + + PokeIndex(dSdU, dSdU_mu, mu); + } + + }; + +}; + +// Convenience for common physically defined cases. +// +// RBC c1 parameterisation is not really RBC but don't have good +// reference and we are happy to change name if prior use of this plaq coeff +// parameterisation is made known to us. +template +class RBCGaugeActionOrig : public PlaqPlusRectangleActionOrig { +public: + INHERIT_GIMPL_TYPES(Gimpl); + RBCGaugeActionOrig(RealD beta,RealD c1) : PlaqPlusRectangleActionOrig(beta*(1.0-8.0*c1), beta*c1) {}; + virtual std::string action_name(){return "RBCGaugeActionOrig";} +}; + +template +class IwasakiGaugeActionOrig : public RBCGaugeActionOrig { +public: + INHERIT_GIMPL_TYPES(Gimpl); + IwasakiGaugeActionOrig(RealD beta) : RBCGaugeActionOrig(beta,-0.331) {}; + virtual std::string action_name(){return "IwasakiGaugeActionOrig";} +}; + + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + Coordinate latt_size = GridDefaultLatt(); + Coordinate simd_layout= GridDefaultSimd(Nd,vComplexD::Nsimd()); + Coordinate mpi_layout = GridDefaultMpi(); + std::cout << " mpi "<({45,12,81,9})); + LatticeGaugeField U(&GRID); + + SU::HotConfiguration(pRNG,U); + + //#define PRD +#ifdef PRD + typedef PeriodicGimplD Gimpl; +#else + typedef ConjugateGimplD Gimpl; + std::vector conj_dirs(Nd,0); conj_dirs[0]=1; conj_dirs[3]=1; + Gimpl::setDirections(conj_dirs); +#endif + + typedef typename WilsonLoops::GaugeMat GaugeMat; + typedef typename WilsonLoops::GaugeLorentz GaugeLorentz; + + GaugeLorentz derivOrig(&GRID), derivNew(&GRID); + double beta = 2.13; + IwasakiGaugeActionOrig action_orig(beta); + IwasakiGaugeAction action_new(beta); + + double t0 = usecond(); + action_orig.deriv(U, derivOrig); + double t1 = usecond(); + action_new.deriv(U, derivNew); + double t2 = usecond(); + + GaugeLorentz diff = derivOrig - derivNew; + double n = norm2(diff); + std::cout << GridLogMessage << "Difference " << n << " (expect 0)" << std::endl; + assert(n<1e-10); + + std::cout << GridLogMessage << "Timings orig: " << (t1-t0)/1000 << "ms, new: " << (t2-t1)/1000 << "ms" << std::endl; + + Grid_finalize(); +} diff --git a/tests/debug/Test_optimized_staple_gaugebc.cc b/tests/debug/Test_optimized_staple_gaugebc.cc index 63822378..51628ab0 100644 --- a/tests/debug/Test_optimized_staple_gaugebc.cc +++ b/tests/debug/Test_optimized_staple_gaugebc.cc @@ -2,7 +2,7 @@ Grid physics library, www.github.com/paboyle/Grid - Source file: ./tests/Test_padded_cell_staple.cc + Source file: ./tests/Test_optimized_staple_gaugebc.cc Copyright (C) 2015