SSAGES  0.1
A MetaDynamics Package
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Groups Pages
ResourceHandler.cpp
1 
20 #include <mxx/comm.hpp>
21 #include "CVs/CVManager.h"
22 #include "Drivers/DriverException.h"
23 #include "Loggers/Logger.h"
24 #include "Validator/ObjectRequirement.h"
25 #include "Methods/Method.h"
26 #include "ResourceHandler.h"
27 #include "Snapshot.h"
28 #include "Hook.h"
29 #include "schema.h"
30 
31 using namespace Json;
32 
33 namespace SSAGES
34 {
35  ResourceHandler::ResourceHandler(
36  mxx::comm&& world, mxx::comm&& comm, uint walkerid,
37  const std::vector<Method*>& methods, CVManager* cvmanager) :
38  world_(std::move(world)), comm_(std::move(comm)), walkerid_(walkerid), nwalkers_(1),
39  methods_(methods), cvmanager_(cvmanager), hook_(nullptr), inputs_(0)
40  {
41  snapshot_ = new Snapshot(comm_, walkerid);
42  }
43 
44  void ResourceHandler::ConfigureHook(class Hook* hook)
45  {
46  hook->SetSnapshot(snapshot_);
47  hook->SetCVManager(cvmanager_);
48  for(auto& m : methods_)
49  hook->AddListener(m);
50  if(logger_ != nullptr) hook->AddListener(logger_);
51  hook_ = hook;
52  }
53 
54  ResourceHandler* ResourceHandler::Build(const Value& json, const MPI_Comm& world)
55  {
56  ObjectRequirement validator;
57  Value schema;
58  Reader reader;
59 
60  // Parse and validate top level schema. This just
61  // makes sure the proper fields exist and the correct
62  // types are specified in the input files.
63  reader.parse(JsonSchema::Simulation, schema);
64  validator.Parse(schema, "#");
65  validator.Validate(json, "#");
66  if(validator.HasErrors())
67  throw BuildException(validator.GetErrors());
68 
69  // Get number of desired walkers and create array of input files.
70  auto nwalkers = json.get("walkers", 1).asInt();
71  if(json["input"].isArray() && json["input"].size() != nwalkers)
72  throw BuildException({"#/input: Number of inputs do not match requested walkers."});
73 
74  std::vector<std::string> inputs;
75  for(int i = 0; i < nwalkers; ++i)
76  {
77  if(json["input"].isArray())
78  inputs.push_back(json["input"][i].asString());
79  else
80  inputs.push_back(json["input"].asString());
81  }
82 
83  // Get basic MPI info and verify that the total number of
84  // cores are divisble by number of walkers.
85  auto wcomm = mxx::comm(world);
86  if(wcomm.size() % nwalkers != 0)
87  throw BuildException({"#/walkers: Allocated processors not divisible by number of walkers."});
88 
89  // Split communicators.
90  int ppw = wcomm.size()/nwalkers;
91  int walkerid = wcomm.rank()/ppw;
92  auto comm = wcomm.split(walkerid);
93 
94  // Build collective variables.
95  auto* cvmanager = new CVManager();
96  int icv = 0;
97  for(auto& cv : json["CVs"])
98  {
99  // Register name with CV manager if it exists.
100  if(cv.isMember("name"))
101  CVManager::AddCVtoMap(cv["name"].asString(), icv);
102 
103  // Build CV and add to manager.
104  cvmanager->AddCV(CollectiveVariable::BuildCV(cv, "#/CVs"));
105  ++icv;
106  }
107 
108  // Build methods.
109  std::vector<Method*> methods;
110  for(auto& m : json["methods"])
111  methods.push_back(Method::BuildMethod(m, world, comm, "#/methods"));
112 
113  // Build logger.
114  Logger* l = nullptr;
115  if(json.isMember("logger"))
116  l = Logger::Build(json["logger"], world, comm, "#/logger");
117 
118  auto* rh = new ResourceHandler(std::move(world), std::move(comm), walkerid, methods, cvmanager);
119  rh->inputs_ = inputs;
120  rh->nwalkers_ = nwalkers;
121  rh->logger_ = l;
122  return rh;
123  }
124 
126  {
127  delete snapshot_;
128  delete cvmanager_;
129  for(auto& m : methods_)
130  delete m;
131  }
132 }
bool HasErrors()
Check if errors have occured.
Definition: Requirement.h:86
Collective variable manager.
Definition: CVManager.h:40
Class containing a snapshot of the current simulation in time.
Definition: Snapshot.h:43
void SetSnapshot(class Snapshot *snapshot)
Sets the active snapshot.
Definition: Hook.cpp:86
virtual void Parse(Value json, const std::string &path) override
Parse JSON value to generate Requirement(s).
Exception to be thrown when building the Driver fails.
class CVManager * cvmanager_
Collective variable manager.
std::vector< std::string > GetErrors()
Get list of error messages.
Definition: Requirement.h:92
Base class for hooks into the simultion engines.
Definition: Hook.h:35
Requirements on an object.
mxx::comm comm_
MPI communicator containing processors for specific walker.
static ResourceHandler * Build(const Json::Value &json, const MPI_Comm &world)
Build a new ResourceHandler from JSON.
class Logger * logger_
CV logger.
static Method * BuildMethod(const Json::Value &json, const MPI_Comm &world, const MPI_Comm &comm, const std::string &path)
Build a derived method from JSON node.
Definition: Method.cpp:38
void AddListener(EventListener *listener)
Add a listener to the hook.
Definition: Hook.cpp:103
void SetCVManager(class CVManager *cvmanager)
Sets the current CV manager.
Definition: Hook.cpp:92
class Snapshot * snapshot_
Snapshot of system state (pointer).
Base class for logging SSAGES data.
Definition: Logger.h:41
class Hook * hook_
Hook pointer.
Class that handles SSAGES resources for a simulation.
static Logger * Build(const Json::Value &json, const MPI_Comm &world, const MPI_Comm &comm, const std::string &path)
Build a Logger from JSON node.
Definition: Logger.cpp:75
static void AddCVtoMap(const std::string &name, uint id)
Register CV name with map.
Definition: CVManager.h:100
std::vector< class Method * > methods_
Vector of advanced sampling methods.
ResourceHandler(mxx::comm &&world, mxx::comm &&comm, uint walkerid, const std::vector< class Method * > &methods, class CVManager *cvmanager)
Constructor.
static CollectiveVariable * BuildCV(const Json::Value &json, const std::string &path)
Set up collective variable.
virtual void Validate(const Value &json, const std::string &path) override
Validate JSON value.