/******************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: programs/Hadrons/Environment.hpp Copyright (C) 2015 Author: Antonin Portelli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory. *******************************************************************************/ #ifndef Hadrons_Environment_hpp_ #define Hadrons_Environment_hpp_ #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * Global environment * ******************************************************************************/ class Environment { SINGLETON(Environment); public: typedef FermionOperator FMat; typedef std::function Solver; typedef std::unique_ptr GridPt; typedef std::unique_ptr GridRbPt; typedef std::unique_ptr RngPt; typedef std::unique_ptr FMatPt; typedef std::unique_ptr LatticePt; public: // dry run void dryRun(const bool isDry); bool isDryRun(void) const; // trajectory number void setTrajectory(const unsigned int traj); unsigned int getTrajectory(void) const; // grids GridCartesian * getGrid(const unsigned int Ls = 1) const; GridRedBlackCartesian * getRbGrid(const unsigned int Ls = 1) const; // fermion actions void addFermionMatrix(const std::string name, FMat *mat); FMat * getFermionMatrix(const std::string name) const; // solvers void addSolver(const std::string name, Solver s, const std::string actionName); void callSolver(const std::string name, LatticeFermion &sol, const LatticeFermion &src) const; // random number generator void setSeed(const std::vector &seed); GridParallelRNG * get4dRng(void) const; // lattice store template void create(const std::string name, const unsigned int Ls = 1); template T * get(const std::string name) const; void freeLattice(const std::string name); bool hasLattice(const std::string name) const; bool isLattice5d(const std::string name) const; unsigned int getLatticeLs(const std::string name) const; // general memory management void free(const std::string name); void freeAll(void); void addSize(const std::string name, const unsigned int size); unsigned int getSize(const std::string name) const; long unsigned int getTotalSize(void) const; private: bool dryRun_{false}; unsigned int traj_; GridPt grid4d_; std::map grid5d_; GridRbPt gridRb4d_; std::map gridRb5d_; RngPt rng4d_; std::map fMat_; std::map solver_; std::map solverAction_; std::map lattice_; std::map objectSize_; }; /****************************************************************************** * template implementation * ******************************************************************************/ template void Environment::create(const std::string name, const unsigned int Ls) { GridCartesian *g4 = getGrid(); GridCartesian *g; if (hasLattice(name)) { HADRON_ERROR("object '" + name + "' already exists"); } if (Ls > 1) { try { g = grid5d_.at(Ls).get(); } catch(std::out_of_range &) { grid5d_[Ls].reset(SpaceTimeGrid::makeFiveDimGrid(Ls, g4)); gridRb5d_[Ls].reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, g4)); g = grid5d_[Ls].get(); } } else { g = g4; } if (!isDryRun()) { lattice_[name].reset(new T(g)); } else { lattice_[name].reset(nullptr); } objectSize_[name] = sizeof(typename T::vector_object)/g->Nsimd()*Ls; } template T * Environment::get(const std::string name) const { if (hasLattice(name)) { try { return dynamic_cast(lattice_.at(name).get()); } catch (std::bad_cast &) { HADRON_ERROR("object '" + name + "' does not have type " + typeid(T *).name() + "(object type: " + typeid(lattice_.at(name).get()).name() + ")"); } } else { HADRON_ERROR("object '" + name + "' undefined"); return nullptr; } } END_HADRONS_NAMESPACE #endif // Hadrons_Environment_hpp_