#ifndef Hadrons_MScalarSUN_StochFreeField_hpp_ #define Hadrons_MScalarSUN_StochFreeField_hpp_ #include #include #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * stochastic free SU(N) scalar field * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MScalarSUN) class StochFreeFieldPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(StochFreeFieldPar, double, m2, double, g); }; template class TStochFreeField: public Module { public: typedef typename SImpl::Field Field; typedef typename SImpl::ComplexField ComplexField; typedef typename SImpl::Group Group; typedef typename Group::LatticeAlgebraVector AlgebraField; public: // constructor TStochFreeField(const std::string name); // destructor virtual ~TStochFreeField(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); // setup virtual void setup(void); // execution virtual void execute(void); private: bool create_weight; }; MODULE_REGISTER_TMP(StochFreeFieldSU2, TStochFreeField>, MScalarSUN); MODULE_REGISTER_TMP(StochFreeFieldSU3, TStochFreeField>, MScalarSUN); MODULE_REGISTER_TMP(StochFreeFieldSU4, TStochFreeField>, MScalarSUN); MODULE_REGISTER_TMP(StochFreeFieldSU5, TStochFreeField>, MScalarSUN); MODULE_REGISTER_TMP(StochFreeFieldSU6, TStochFreeField>, MScalarSUN); /****************************************************************************** * TStochFreeField implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template TStochFreeField::TStochFreeField(const std::string name) : Module(name) {} // dependencies/products /////////////////////////////////////////////////////// template std::vector TStochFreeField::getInput(void) { std::vector in; return in; } template std::vector TStochFreeField::getOutput(void) { std::vector out = {getName()}; return out; } // setup /////////////////////////////////////////////////////////////////////// template void TStochFreeField::setup(void) { create_weight = false; if (!env().hasCreatedObject("_" + getName() + "_weight")) { envCacheLat(ComplexField, "_" + getName() + "_weight"); create_weight = true; } envTmpLat(Field, "phift"); envCreateLat(Field, getName()); } // execution /////////////////////////////////////////////////////////////////// template void TStochFreeField::execute(void) { LOG(Message) << "Generating stochastic scalar field" << std::endl; const unsigned int N = Group::Dimension; const unsigned int Nadj = Group::AdjointDimension; auto &phi = envGet(Field, getName()); auto &w = envGet(ComplexField, "_" + getName() + "_weight"); auto &rng = *env().get4dRng(); double trphi2; FFT fft(env().getGrid()); Integer vol; vol = 1; for(int d = 0; d < env().getNd(); d++) { vol = vol*env().getDim(d); } if (create_weight) { LOG(Message) << "Caching momentum-space scalar action" << std::endl; SImpl::MomentumSpacePropagator(w, sqrt(par().m2)); w *= par().g/N; w = sqrt(vol*real(w)); } LOG(Message) << "Generating random momentum-space field" << std::endl; envGetTmp(Field, phift); Group::GaussianFundamentalLieAlgebraMatrix(rng, phift); phift *= w; LOG(Message) << "Field Fourier transform" << std::endl; fft.FFT_all_dim(phi, phift, FFT::backward); phi = (1./sqrt(2.))*(phi - adj(phi)); trphi2 = -TensorRemove(sum(trace(phi*phi))).real()/vol; LOG(Message) << "tr(phi^2)= " << trphi2 << std::endl; } END_MODULE_NAMESPACE END_HADRONS_NAMESPACE #endif // Hadrons_MScalarSUN_StochFreeField_hpp_