From 92f92379e6232d6a67a253ccb53b8c86958d3f7b Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 8 May 2017 18:42:19 +0100 Subject: [PATCH] Adding olivers test version --- .../hmc/Test_hmc_EOMobiusRatioManyFlavour.cc | 302 ++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 tests/hmc/Test_hmc_EOMobiusRatioManyFlavour.cc diff --git a/tests/hmc/Test_hmc_EOMobiusRatioManyFlavour.cc b/tests/hmc/Test_hmc_EOMobiusRatioManyFlavour.cc new file mode 100644 index 00000000..d4eac654 --- /dev/null +++ b/tests/hmc/Test_hmc_EOMobiusRatioManyFlavour.cc @@ -0,0 +1,302 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: ./tests/Test_hmc_EODWFRatio.cc + +Copyright (C) 2015-2016 + +Author: Peter Boyle +Author: Guido Cossu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ +#include + +namespace Grid{ + struct FermionParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(FermionParameters, + int, Ls, + double, mass, + double, M5, + double, b, + double, c, + double, StoppingCondition, + int, MaxCGIterations, + bool, ApplySmearing); + + //template + //FermionParameters(Reader& Reader){ + // read(Reader, "Mobius", *this); + //} + + }; + + + struct MobiusHMCParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(MobiusHMCParameters, + double, gauge_beta, + FermionParameters, Mobius) + + template + MobiusHMCParameters(Reader& Reader){ + read(Reader, "Action", *this); + } + +}; + + struct SmearingParameters: Serializable { + GRID_SERIALIZABLE_CLASS_MEMBERS(SmearingParameters, + double, rho, + Integer, Nsmear) + + template + SmearingParameters(Reader& Reader){ + read(Reader, "StoutSmearing", *this); + } + + }; + + +} + + +int main(int argc, char **argv) { + using namespace Grid; + using namespace Grid::QCD; + + Grid_init(&argc, &argv); + int threads = GridThread::GetThreads(); + // here make a routine to print all the relevant information on the run + std::cout << GridLogMessage << "Grid is setup to use " << threads << " threads" << std::endl; + + // Typedefs to simplify notation + typedef GenericHMCRunner HMCWrapper; // Uses the default minimum norm + typedef WilsonImplR FermionImplPolicy; + typedef MobiusFermionR FermionAction; + typedef typename FermionAction::FermionField FermionField; + // Serialiser + //typedef Grid::XmlReader Serialiser; + typedef Grid::JSONReader Serialiser; + + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + HMCWrapper TheHMC; + TheHMC.ReadCommandLine(argc, argv); // these can be parameters from file + + // Reader, file should come from command line + if (TheHMC.ParameterFile.empty()){ + std::cout << "Input file not specified." + << "Use --ParameterFile option in the command line.\nAborting" + << std::endl; + exit(1); + } + Serialiser Reader(TheHMC.ParameterFile); + + MobiusHMCParameters MyParams(Reader); + // Apply smearing to the fermionic action + bool ApplySmearing = MyParams.Mobius.ApplySmearing; + + + + // Grid from the command line + TheHMC.Resources.AddFourDimGrid("gauge"); + // Possibile to create the module by hand + // hardcoding parameters or using a Reader + + + // Checkpointer definition (Name: Checkpointer) + CheckpointerParameters CPparams(Reader); + // Commenting out since we are using the reader + /* + CPparams.config_prefix = "ckpoint_EODWF_lat"; + CPparams.rng_prefix = "ckpoint_EODWF_rng"; + CPparams.saveInterval = 5; + CPparams.format = "IEEE64BIG"; + */ + + TheHMC.Resources.LoadNerscCheckpointer(CPparams); + // TheHMC.Resources.LoadBinaryCheckpointer(CPparams); + + // RNG definition (Name: RandomNumberGenerator) + RNGModuleParameters RNGpar(Reader); + // Commenting out since we are using the reader + /* + RNGpar.serial_seeds = "1 2 3 4 5"; + RNGpar.parallel_seeds = "6 7 8 9 10"; + */ + TheHMC.Resources.SetRNGSeeds(RNGpar); + + // Construct observables + // here there is too much indirection + typedef PlaquetteMod PlaqObs; + TheHMC.Resources.AddObservable(); + ////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////// + // Collect actions, here use more encapsulation + // need wrappers of the fermionic classes + // that have a complex construction + // standard + + //RealD beta = 5.6 ; + //WilsonGaugeActionR Waction(MyParams.gauge_beta); + SymanzikGaugeActionR Syzaction(MyParams.gauge_beta); + + + //const int Ls = 8; + const int Ls = MyParams.Mobius.Ls; + auto GridPtr = TheHMC.Resources.GetCartesian(); + auto GridRBPtr = TheHMC.Resources.GetRBCartesian(); + auto FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,GridPtr); + auto FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,GridPtr); + + + // temporarily need a gauge field + LatticeGaugeField U(GridPtr); + + Real mass = MyParams.Mobius.mass; //0.04; + Real pv = 1.0; + RealD M5 = MyParams.Mobius.M5; //1.5; + // Note: IroIro and Grid notation for b and c differ + RealD b = MyParams.Mobius.b; // 3./2.; + RealD c = MyParams.Mobius.c; // 1./2.; + + // These lines are unecessary if BC are all periodic + std::vector boundary = {1,1,1,-1}; + FermionAction::ImplParams Params(boundary); + + FermionAction DenOp(U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,mass,M5,b,c, Params); + FermionAction NumOp(U,*FGrid,*FrbGrid,*GridPtr,*GridRBPtr,pv, M5,b,c, Params); + + //double StoppingCondition = 1e-8; + //double MaxCGIterations = 10000; + ConjugateGradient CG(MyParams.Mobius.StoppingCondition,MyParams.Mobius.MaxCGIterations); + TwoFlavourEvenOddRatioPseudoFermionAction Nf2a(NumOp, DenOp,CG,CG); + TwoFlavourEvenOddRatioPseudoFermionAction Nf2b(NumOp, DenOp,CG,CG); + TwoFlavourEvenOddRatioPseudoFermionAction Nf2c(NumOp, DenOp,CG,CG); + TwoFlavourEvenOddRatioPseudoFermionAction Nf2d(NumOp, DenOp,CG,CG); + TwoFlavourEvenOddRatioPseudoFermionAction Nf2e(NumOp, DenOp,CG,CG); + // TwoFlavourEvenOddRatioPseudoFermionAction Nf2f(NumOp, DenOp,CG,CG); + + // Set smearing (true/false), default: false + Nf2a.is_smeared = ApplySmearing; + Nf2b.is_smeared = ApplySmearing; + Nf2c.is_smeared = ApplySmearing; + Nf2d.is_smeared = ApplySmearing; + Nf2e.is_smeared = ApplySmearing; + //Nf2f.is_smeared = ApplySmearing; + + // Collect actions + ActionLevel Level1(1); + Level1.push_back(&Nf2a); + Level1.push_back(&Nf2b); + Level1.push_back(&Nf2c); + Level1.push_back(&Nf2d); + Level1.push_back(&Nf2e); + //Level1.push_back(&Nf2f); + + ActionLevel Level2(4); + Level2.push_back(&Syzaction); + + TheHMC.TheAction.push_back(Level1); + TheHMC.TheAction.push_back(Level2); + + ///////////////////////////////////////////////////////////// + // HMC parameters are serialisable + TheHMC.Parameters.initialize(Reader); + /* + TheHMC.Parameters.MD.MDsteps = 20; + TheHMC.Parameters.MD.trajL = 1.0; + */ + + // Reset performance counters + NumOp.ZeroCounters(); + DenOp.ZeroCounters(); + + if (ApplySmearing){ + SmearingParameters SmPar(Reader); + //double rho = 0.1; // smearing parameter + //int Nsmear = 3; // number of smearing levels + Smear_Stout Stout(SmPar.rho); + SmearedConfiguration SmearingPolicy(GridPtr, SmPar.Nsmear, Stout); + TheHMC.Run(SmearingPolicy); // for smearing + } else { + TheHMC.Run(); // no smearing + } + + std::cout << GridLogMessage << "Numerator report, Pauli-Villars term : " << std::endl; + NumOp.Report(); + std::cout << GridLogMessage << "Denominator report, Dw(m) term (includes CG) : " << std::endl; + DenOp.Report(); + + Grid_finalize(); +} // main + + + +/* Examples for input files + +JSON + +{ + "Checkpointer": { + "config_prefix": "ckpoint_json_lat", + "rng_prefix": "ckpoint_json_rng", + "saveInterval": 1, + "format": "IEEE64BIG" + }, + "RandomNumberGenerator": { + "serial_seeds": "1 2 3 4 6", + "parallel_seeds": "6 7 8 9 11" + }, + "Action":{ + "gauge_beta": 5.6, + "Mobius": { + "Ls" : 10, + "mass": 0.01, + "M5" : 1.0, + "b" : 1.5, + "c" : 0.5, + "StoppingCondition": 1e-8, + "MaxCGIterations": 10000, + "ApplySmearing": true + } + }, + "HMC":{ + "StartTrajectory": 0, + "Trajectories": 100, + "MetropolisTest": true, + "NoMetropolisUntil": 10, + "StartingType": "HotStart", + "MD":{ + "name": "MinimumNorm2", + "MDsteps": 15, + "trajL": 2.0 + } + }, + "StoutSmearing":{ + "rho": 0.1, + "Nsmear": 3 + } +} + + +XML example not provided yet + +*/