/******************************************************************************* 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; private: struct ObjInfo { unsigned int size, Ls; }; 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 void createGrid(const unsigned int Ls); 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; void freeFermionMatrix(const std::string name); bool hasFermionMatrix(const std::string name) const; // solvers void addSolver(const std::string name, Solver s); bool hasSolver(const std::string name) const; void setSolverAction(const std::string name, const std::string actionName); std::string getSolverAction(const std::string name) const; 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 T * create(const std::string name); template T * get(const std::string name) const; bool hasLattice(const std::string name) const; void freeLattice(const std::string name); template unsigned int lattice4dSize(void) const; // general memory management bool hasObject(const std::string name) const; void registerObject(const std::string name, const unsigned int size, const unsigned int Ls = 1); template void registerLattice(const std::string name, const unsigned int Ls = 1); unsigned int getObjectSize(const std::string name) const; long unsigned int getTotalSize(void) const; unsigned int getObjectLs(const std::string name) const; bool isObject5d(const std::string name) const; void addOwnership(const std::string owner, const std::string property); bool hasOwners(const std::string name) const; bool freeObject(const std::string name); void freeAll(void); private: private: bool dryRun_{false}; unsigned int traj_; GridPt grid4d_; std::map grid5d_; GridRbPt gridRb4d_; std::map gridRb5d_; RngPt rng4d_; std::map object_; std::map lattice_; std::map fMat_; std::map solver_; std::map solverAction_; std::map> owners_; std::map> properties_; }; /****************************************************************************** * template implementation * ******************************************************************************/ template unsigned int Environment::lattice4dSize(void) const { return sizeof(typename T::vector_object)/getGrid()->Nsimd(); } template T * Environment::create(const std::string name) { GridCartesian *g = getGrid(getObjectLs(name)); lattice_[name].reset(new T(g)); return dynamic_cast(lattice_[name].get()); } template T * Environment::get(const std::string name) const { if (hasLattice(name)) { if (auto pt = dynamic_cast(lattice_.at(name).get())) { return pt; } else { HADRON_ERROR("object '" + name + "' does not have type " + typeid(T *).name() + "(object type: " + typeid(lattice_.at(name).get()).name() + ")"); } } else { HADRON_ERROR("no lattice name '" + name + "'"); return nullptr; } } template void Environment::registerLattice(const std::string name, const unsigned int Ls) { createGrid(Ls); registerObject(name, Ls*lattice4dSize()); } END_HADRONS_NAMESPACE #endif // Hadrons_Environment_hpp_