SSAGES  0.9.3
Software Suite for Advanced General Ensemble Simulations
Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
SSAGES::Umbrella Class Reference

Umbrella sampling method. More...

#include <Umbrella.h>

Inheritance diagram for SSAGES::Umbrella:
Inheritance graph
[legend]

Public Member Functions

 Umbrella (const MPI_Comm &world, const MPI_Comm &comm, const std::vector< double > &kspring, const std::vector< double > &centers, std::string name, unsigned int frequency)
 Constructor. More...
 
 Umbrella (const MPI_Comm &world, const MPI_Comm &comm, const std::vector< double > &kspring, const std::vector< double > &centers0, const std::vector< double > &centers1, size_t timesteps, std::string name, unsigned int frequency)
 Constructor. More...
 
void PreSimulation (Snapshot *snapshot, const class CVManager &cvmanager) override
 Method call prior to simulation initiation. More...
 
void PostIntegration (Snapshot *snapshot, const class CVManager &cvmanager) override
 Method call post integration. More...
 
void PostSimulation (Snapshot *snapshot, const class CVManager &cvmanager) override
 Method call post simulation. More...
 
void SetOutputFrequency (int outfreq)
 Set output frequency. More...
 
void SetAppend (bool append)
 Set append mode. More...
 
- Public Member Functions inherited from SSAGES::Method
 Method (unsigned int frequency, const MPI_Comm &world, const MPI_Comm &comm)
 Constructor. More...
 
void SetCVMask (const std::vector< unsigned int > &mask)
 Sets the collective variable mask. More...
 
virtual ~Method ()
 Destructor.
 
- Public Member Functions inherited from SSAGES::EventListener
 EventListener (unsigned int frequency)
 Constructor. More...
 
unsigned int GetFrequency () const
 Get frequency of event listener. More...
 
virtual ~EventListener ()
 Destructor.
 

Static Public Member Functions

static UmbrellaBuild (const Json::Value &json, const MPI_Comm &world, const MPI_Comm &comm, const std::string &path)
 Build a derived method from JSON node. More...
 
- Static Public Member Functions inherited from SSAGES::Method
static MethodBuildMethod (const Json::Value &json, const MPI_Comm &world, const MPI_Comm &comm, const std::string &path)
 Build a derived method from JSON node. More...
 
- Static Public Member Functions inherited from SSAGES::EventListener
static unsigned int GetWalkerID (const MPI_Comm &world, const MPI_Comm &comm)
 Get walker ID number of specified communicator. More...
 
static unsigned int GetNumWalkers (const MPI_Comm &world, const MPI_Comm &comm)
 Get total number of walkers in the simulation. More...
 
static bool IsMasterRank (const MPI_Comm &comm)
 Check if current processor is master. More...
 

Private Member Functions

double GetCurrentCenter (size_t iteration, size_t i)
 Get the current center of the umbrella at a given iteration. More...
 
void PrintUmbrella (const CVList &cvs, size_t iteration)
 Print umbrella values. More...
 

Private Attributes

std::vector< double > kspring_
 Vector of spring constants.
 
size_t time_
 Amount of time over which to scale centers.
 
std::string filename_
 Output filename.
 
int outfreq_
 Frequency of outputting data.
 
std::ofstream umbrella_
 Output stream for umbrella data.
 
bool append_
 Append to output files?
 
std::vector< double > centers0_
 
std::vector< double > centers1_
 

Additional Inherited Members

- Protected Attributes inherited from SSAGES::Method
mxx::comm world_
 Global MPI communicator.
 
mxx::comm comm_
 Local MPI communicator.
 
std::vector< unsigned int > cvmask_
 Mask which identifies which CVs to act on.
 

Detailed Description

Umbrella sampling method.

Umbrella sampling method to constrain an arbitrary number of CVs at specified equilibrium distances.

Definition at line 35 of file Umbrella.h.

Constructor & Destructor Documentation

◆ Umbrella() [1/2]

SSAGES::Umbrella::Umbrella ( const MPI_Comm &  world,
const MPI_Comm &  comm,
const std::vector< double > &  kspring,
const std::vector< double > &  centers,
std::string  name,
unsigned int  frequency 
)
inline

Constructor.

Parameters
worldMPI global communicator.
commMPI local communicator.
kspringList of spring constants.
centersList of spring equilibrium positions.
nameFilename.
frequencyFrequency with which this method is applied.

Create instance of umbrella with spring constants "kspring", and centers "centers". Note the sizes of the vectors should be commensurate with the number of CVs.

Definition at line 98 of file Umbrella.h.

103  :
104  Method(frequency, world, comm), kspring_(kspring), centers0_(centers),
105  centers1_(centers), time_(0), filename_(name), outfreq_(1), append_(false)
106  {
107  }
Method(unsigned int frequency, const MPI_Comm &world, const MPI_Comm &comm)
Constructor.
Definition: Method.h:61
int outfreq_
Frequency of outputting data.
Definition: Umbrella.h:53
std::vector< double > centers0_
Definition: Umbrella.h:43
bool append_
Append to output files?
Definition: Umbrella.h:59
size_t time_
Amount of time over which to scale centers.
Definition: Umbrella.h:47
std::string filename_
Output filename.
Definition: Umbrella.h:50
std::vector< double > kspring_
Vector of spring constants.
Definition: Umbrella.h:39

◆ Umbrella() [2/2]

SSAGES::Umbrella::Umbrella ( const MPI_Comm &  world,
const MPI_Comm &  comm,
const std::vector< double > &  kspring,
const std::vector< double > &  centers0,
const std::vector< double > &  centers1,
size_t  timesteps,
std::string  name,
unsigned int  frequency 
)
inline

Constructor.

Parameters
worldMPI global communicator.
commMPI local communicator.
kspringList of spring constants.
centers0List of starting spring equilibrium positions.
centers1List of ending spring equilibrium positions.
timestepsNumber of timesteps over which to scale centers.
nameFilename.
frequencyFrequency with which this method is applied.

Create instance of umbrella with spring constants "kspring", and centers "centers". Note the sizes of the vectors should be commensurate with the number of CVs.

Definition at line 124 of file Umbrella.h.

131  :
132  Method(frequency, world, comm), kspring_(kspring), centers0_(centers0),
133  centers1_(centers1), time_(timesteps), filename_(name), outfreq_(1)
134  {
135  }

Member Function Documentation

◆ Build()

Umbrella * SSAGES::Umbrella::Build ( const Json::Value &  json,
const MPI_Comm &  world,
const MPI_Comm &  comm,
const std::string &  path 
)
static

Build a derived method from JSON node.

Parameters
jsonJSON Value containing all input information.
worldMPI global communicator.
commMPI local communicator.
pathPath for JSON path specification.
Returns
Pointer to the Method built. nullptr if an unknown error occurred.

This function builds a registered method from a JSON node. The difference between this function and "Build" is that this automatically determines the appropriate derived type based on the JSON node information.

Note
Object lifetime is the caller's responsibility.

Definition at line 112 of file Umbrella.cpp.

116  {
117  ObjectRequirement validator;
118  Value schema;
119  CharReaderBuilder rbuilder;
120  CharReader* reader = rbuilder.newCharReader();
121 
122  reader->parse(JsonSchema::UmbrellaMethod.c_str(),
123  JsonSchema::UmbrellaMethod.c_str() + JsonSchema::UmbrellaMethod.size(),
124  &schema, nullptr);
125  validator.Parse(schema, path);
126 
127  // Validate inputs.
128  validator.Validate(json, path);
129  if(validator.HasErrors())
130  throw BuildException(validator.GetErrors());
131 
132  unsigned int wid = GetWalkerID(world, comm);
133  unsigned int wcount = GetNumWalkers(world, comm);
134  bool ismulti = wcount > 1;
135 
136  std::vector<std::vector<double>> ksprings;
137  for(auto& s : json["ksprings"])
138  {
139  std::vector<double> kspring;
140  if(s.isArray())
141  for(auto& k : s)
142  kspring.push_back(k.asDouble());
143  else
144  kspring.push_back(s.asDouble());
145 
146  ksprings.push_back(kspring);
147  }
148 
149  std::vector<std::vector<double>> centers0, centers1;
150  if(json.isMember("centers"))
151  {
152  for(auto& s : json["centers"])
153  {
154  std::vector<double> center;
155  if(s.isArray())
156  for(auto& k : s)
157  center.push_back(k.asDouble());
158  else
159  center.push_back(s.asDouble());
160 
161  centers0.push_back(center);
162  }
163  }
164  else if(json.isMember("centers0") && json.isMember("centers1") && json.isMember("timesteps"))
165  {
166  for(auto& s : json["centers0"])
167  {
168  std::vector<double> center;
169  if(s.isArray())
170  for(auto& k : s)
171  center.push_back(k.asDouble());
172  else
173  center.push_back(s.asDouble());
174 
175  centers0.push_back(center);
176  }
177 
178  for(auto& s : json["centers1"])
179  {
180  std::vector<double> center;
181  if(s.isArray())
182  for(auto& k : s)
183  center.push_back(k.asDouble());
184  else
185  center.push_back(s.asDouble());
186 
187  centers1.push_back(center);
188  }
189  }
190  else
191  throw BuildException({"Either \"centers\" or \"timesteps\", \"centers0\" and \"centers1\" must be defined for umbrella."});
192 
193  if(ksprings[0].size() != centers0[0].size())
194  throw BuildException({"Need to define a spring for every center or a center for every spring!"});
195 
196  // If only one set of center/ksprings are specified. Fill it up for multi.
197  if(ismulti)
198  {
199  if(ksprings.size() == 1)
200  for(size_t i = 1; i < wcount; ++i)
201  ksprings.push_back(ksprings[0]);
202  else if(ksprings.size() != wcount)
203  throw std::invalid_argument(path + ": Multi-walker simulations requires that the number of \"ksprings\" match the number of walkers.");
204  if(centers0.size() == 1)
205  for(size_t i = 1; i < wcount; ++i)
206  centers0.push_back(centers0[0]);
207  else if(centers0.size() != wcount)
208  throw std::invalid_argument(path + ": Multi-walker simulations requires that the number of \"centers\"/\"centers0\" match the number of walkers.");
209  if(centers1.size() == 1)
210  for(size_t i = 1; i < wcount; ++i)
211  centers1.push_back(centers1[0]);
212  else if(centers1.size()) // centers1 is optional.
213  throw std::invalid_argument(path + ": Multi-walker simulations requires that the number of \"centers1\" match the number of walkers.");
214  }
215 
216  auto freq = json.get("frequency", 1).asInt();
217 
218  size_t timesteps = 0;
219  if(json.isMember("timesteps"))
220  {
221  if(json["timesteps"].isArray())
222  timesteps = json["timesteps"][wid].asUInt();
223  else
224  timesteps = json["timesteps"].asUInt();
225  }
226 
227  std::string name = "umbrella.dat";
228  if(json["output_file"].isArray())
229  name = json["output_file"][wid].asString();
230  else if(ismulti)
231  throw std::invalid_argument(path + ": Multi-walker simulations require a separate output file for each.");
232  else
233  name = json["output_file"].asString();
234 
235  Umbrella* m = nullptr;
236  if(timesteps == 0)
237  m = new Umbrella(world, comm, ksprings[wid], centers0[wid], name, freq);
238  else
239  m = new Umbrella(world, comm, ksprings[wid], centers0[wid], centers1[wid], timesteps, name, freq);
240 
241  m->SetOutputFrequency(json.get("output_frequency",0).asInt());
242  m->SetAppend(json.get("append", false).asBool());
243 
244  return m;
245  }
Requirements on an object.
virtual void Parse(Value json, const std::string &path) override
Parse JSON value to generate Requirement(s).
virtual void Validate(const Value &json, const std::string &path) override
Validate JSON value.
std::vector< std::string > GetErrors()
Get list of error messages.
Definition: Requirement.h:92
bool HasErrors()
Check if errors have occured.
Definition: Requirement.h:86
static unsigned int GetNumWalkers(const MPI_Comm &world, const MPI_Comm &comm)
Get total number of walkers in the simulation.
static unsigned int GetWalkerID(const MPI_Comm &world, const MPI_Comm &comm)
Get walker ID number of specified communicator.
Definition: EventListener.h:89
Umbrella(const MPI_Comm &world, const MPI_Comm &comm, const std::vector< double > &kspring, const std::vector< double > &centers, std::string name, unsigned int frequency)
Constructor.
Definition: Umbrella.h:98

References Json::Requirement::GetErrors(), Json::Requirement::HasErrors(), Json::ObjectRequirement::Parse(), SetAppend(), SetOutputFrequency(), and Json::ObjectRequirement::Validate().

Here is the call graph for this function:

◆ GetCurrentCenter()

double SSAGES::Umbrella::GetCurrentCenter ( size_t  iteration,
size_t  i 
)
inlineprivate

Get the current center of the umbrella at a given iteration.

Parameters
iterationCurrent iteration of the Snapshot.
iindex (iterator) for CV.
Returns
Center of umbrella at current iteration

Definition at line 68 of file Umbrella.h.

69  {
70  // We are at the end.
71  if(iteration >= time_) return centers1_[i];
72 
73  // Scale linearly.
74  return (centers1_[i] - centers0_[i])/time_*iteration + centers0_[i];
75  }

References centers0_, and time_.

◆ PostIntegration()

void SSAGES::Umbrella::PostIntegration ( Snapshot snapshot,
const class CVManager cvmanager 
)
overridevirtual

Method call post integration.

Parameters
snapshotPointer to the simulation snapshot.
cvmanagerCollective variable manager.

This function will be called after each integration step.

Implements SSAGES::Method.

Definition at line 57 of file Umbrella.cpp.

58  {
59  // Get necessary info.
60  auto cvs = cvmanager.GetCVs(cvmask_);
61  auto& forces = snapshot->GetForces();
62  auto& virial = snapshot->GetVirial();
63 
64  for(size_t i = 0; i < cvs.size(); ++i)
65  {
66  // Get current CV and gradient.
67  auto& cv = cvs[i];
68  auto& grad = cv->GetGradient();
69  auto& boxgrad = cv->GetBoxGradient();
70  // Compute dV/dCV.
71  auto center = GetCurrentCenter(snapshot->GetIteration(), i);
72  auto D = kspring_[i]*cv->GetDifference(center);
73 
74  // Update forces.
75  for(size_t j = 0; j < forces.size(); ++j)
76  forces[j] -= D*grad[j];
77 
78  // Update virial.
79  virial += D*boxgrad;
80  }
81 
82  if(snapshot->GetIteration() % outfreq_ == 0)
83  PrintUmbrella(cvs, snapshot->GetIteration());
84  }
std::vector< unsigned int > cvmask_
Mask which identifies which CVs to act on.
Definition: Method.h:50
void PrintUmbrella(const CVList &cvs, size_t iteration)
Print umbrella values.
Definition: Umbrella.cpp:92
double GetCurrentCenter(size_t iteration, size_t i)
Get the current center of the umbrella at a given iteration.
Definition: Umbrella.h:68

References SSAGES::CVManager::GetCVs(), SSAGES::Snapshot::GetForces(), SSAGES::Snapshot::GetIteration(), and SSAGES::Snapshot::GetVirial().

Here is the call graph for this function:

◆ PostSimulation()

void SSAGES::Umbrella::PostSimulation ( Snapshot snapshot,
const class CVManager cvmanager 
)
overridevirtual

Method call post simulation.

Parameters
snapshotPointer to the simulation snapshot.
cvmanagerCollective variable manager.

This function will be called after the end of the simulation run.

Implements SSAGES::Method.

Definition at line 86 of file Umbrella.cpp.

87  {
88  if(IsMasterRank(comm_))
89  umbrella_.close();
90  }
static bool IsMasterRank(const MPI_Comm &comm)
Check if current processor is master.
mxx::comm comm_
Local MPI communicator.
Definition: Method.h:47
std::ofstream umbrella_
Output stream for umbrella data.
Definition: Umbrella.h:56

◆ PreSimulation()

void SSAGES::Umbrella::PreSimulation ( Snapshot snapshot,
const class CVManager cvmanager 
)
overridevirtual

Method call prior to simulation initiation.

Parameters
snapshotPointer to the simulation snapshot.
cvmanagerCollective variable manager.

This function will be called before the simulation is started.

Implements SSAGES::Method.

Definition at line 33 of file Umbrella.cpp.

34  {
35  if(IsMasterRank(comm_))
36  {
37  if(append_)
38  umbrella_.open(filename_.c_str(), std::ofstream::out | std::ofstream::app);
39  else
40  {
41  // Write out header.
42  umbrella_.open(filename_.c_str(), std::ofstream::out);
43  umbrella_ << "#";
44  umbrella_ << "Iteration ";
45 
46  auto cvs = cvmanager.GetCVs(cvmask_);
47  for(size_t i = 0; i < cvs.size(); ++i)
48  umbrella_ << "cv_" + std::to_string(i) << " ";
49 
50  for(size_t i = 0; i < cvs.size() - 1; ++i)
51  umbrella_ << "center_" + std::to_string(i) << " ";
52  umbrella_ << "center_" + std::to_string(cvs.size() - 1) << std::endl;
53  }
54  }
55  }

References SSAGES::CVManager::GetCVs().

Here is the call graph for this function:

◆ PrintUmbrella()

void SSAGES::Umbrella::PrintUmbrella ( const CVList cvs,
size_t  iteration 
)
private

Print umbrella values.

Parameters
cvsList of CVs.
iterationCurrent iteration.

Definition at line 92 of file Umbrella.cpp.

93  {
94  if(IsMasterRank(comm_))
95  {
96  umbrella_.precision(8);
97  umbrella_ << iteration << " ";
98 
99  // Print out CV values first.
100  for(auto& cv : cvs)
101  umbrella_ << cv->GetValue() << " ";
102 
103  // Print out target (center) of each CV.
104  for(size_t i = 0; i < cvs.size() - 1; ++i)
105  umbrella_ << GetCurrentCenter(iteration, i) << " ";
106  umbrella_ << GetCurrentCenter(iteration, cvs.size() - 1);
107 
108  umbrella_ << std::endl;
109  }
110  }

◆ SetAppend()

void SSAGES::Umbrella::SetAppend ( bool  append)
inline

Set append mode.

Parameters
appendWhether to enable or disable append mode.

Definition at line 159 of file Umbrella.h.

160  {
161  append_ = append;
162  }

References append_.

Referenced by Build().

Here is the caller graph for this function:

◆ SetOutputFrequency()

void SSAGES::Umbrella::SetOutputFrequency ( int  outfreq)
inline

Set output frequency.

Parameters
outfreqNew value for output frequency.

Definition at line 150 of file Umbrella.h.

151  {
152  outfreq_ = outfreq;
153  }

References outfreq_.

Referenced by Build().

Here is the caller graph for this function:

Member Data Documentation

◆ centers0_

std::vector<double> SSAGES::Umbrella::centers0_
private

Vector of equilibrium distances.

Definition at line 43 of file Umbrella.h.

Referenced by GetCurrentCenter().


The documentation for this class was generated from the following files: