SSAGES  0.1
A MetaDynamics Package
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Groups Pages
Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
SSAGES::ABF Class Reference

Adaptive Biasing Force Algorithm. More...

#include <ABF.h>

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

Public Member Functions

 ABF (const MPI_Comm &world, const MPI_Comm &comm, Grid< int > *N, Grid< int > *Nworld, std::vector< Grid< double > * > F, std::vector< Grid< double > * > Fworld, std::vector< std::vector< double >> restraint, std::vector< bool > isperiodic, std::vector< std::vector< double >> periodicboundaries, double min, bool massweigh, std::string filename, std::string Nworld_filename, std::string Fworld_filename, const std::vector< std::vector< double >> &histdetails, int FBackupInterv, double unitconv, double timestep, unsigned int frequency)
 Constructor. More...
 
void PreSimulation (Snapshot *snapshot, const class CVManager &cvmanager) override
 Pre-simulation hook. More...
 
void PostIntegration (Snapshot *snapshot, const class CVManager &cvmanager) override
 Post-integration hook. More...
 
void PostSimulation (Snapshot *snapshot, const class CVManager &cvmanager) override
 Post-simulation hook. More...
 
void SetIteration (const int iter)
 Set iteration of the method. More...
 
 ~ABF ()
 Destructor.
 
- Public Member Functions inherited from SSAGES::Method
 Method (uint frequency, const MPI_Comm &world, const MPI_Comm &comm)
 Constructor. More...
 
void SetCVMask (const std::vector< uint > &mask)
 Sets the collective variable mask.
 
virtual ~Method ()
 Destructor.
 
- Public Member Functions inherited from SSAGES::EventListener
 EventListener (uint frequency)
 Constructor. More...
 
uint GetFrequency () const
 Get frequency of event listener. More...
 
virtual ~EventListener ()
 Destructor.
 

Static Public Member Functions

static ABFBuild (const Json::Value &json, const MPI_Comm &world, const MPI_Comm &comm, const std::string &path)
 
- 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...
 

Private Member Functions

void CalcBiasForce (const Snapshot *snapshot, const CVList &cvs, const std::vector< double > &cvVals)
 Computes the bias force. More...
 
void WriteData ()
 Writes out data to file.
 
bool boundsCheck (const std::vector< double > &CVs)
 Checks whether the local walker is within CV bounds. More...
 

Private Attributes

std::vector< Grid< double > * > F_
 To store running total of the local walker. More...
 
std::vector< Grid< double > * > Fworld_
 Will hold the global total, synced across walkers at every time step. More...
 
Grid< int > * N_
 To store number of local hits at a given CV bin. More...
 
Grid< int > * Nworld_
 To store number of global hits at a given CV bin. More...
 
std::vector< std::vector
< double > > 
restraint_
 Information for a harmonic restraint to keep CV in the region of interest. More...
 
std::vector< bool > isperiodic_
 For each CV, holds whether that CV has periodic boundaries or not.
 
std::vector< std::vector
< double > > 
periodicboundaries_
 Holds periodic boundaries of CVs. More...
 
int min_
 
Eigen::VectorXd wdotp1_
 To hold last iteration wdotp value for numerical derivative.
 
Eigen::VectorXd wdotp2_
 To hold second to last iteration wdotp value for numerical derivative.
 
Eigen::VectorXd Fold_
 To hold last iterations F_ value for removing bias.
 
bool massweigh_
 Mass weighing of bias enabled/disabled.
 
std::vector< Vector3biases_
 Biases applied to atoms each timestep.
 
unsigned int dim_
 Number of CVs in system.
 
std::ofstream worldout_
 Output stream for F/N world data.
 
std::string filename_
 
std::string Nworld_filename_
 Nworld print out filename, for restarts.
 
std::string Fworld_filename_
 Fworld print out filename, for restarts.
 
std::vector< std::vector
< double > > 
histdetails_
 Histogram details. More...
 
int FBackupInterv_
 Integer to hold F estimate backup information. More...
 
double unitconv_
 Unit Conversion Constant from W dot P to Force. More...
 
double timestep_
 Timestep of integration.
 
uint iteration_
 Iteration counter.
 
Eigen::VectorXd mass_
 Mass vector. Empty unless required.
 

Additional Inherited Members

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

Detailed Description

Adaptive Biasing Force Algorithm.

Implementation of the Adaptive Biasing Force algorithm based on [2]

Definition at line 42 of file ABF.h.

Constructor & Destructor Documentation

SSAGES::ABF::ABF ( const MPI_Comm &  world,
const MPI_Comm &  comm,
Grid< int > *  N,
Grid< int > *  Nworld,
std::vector< Grid< double > * >  F,
std::vector< Grid< double > * >  Fworld,
std::vector< std::vector< double >>  restraint,
std::vector< bool >  isperiodic,
std::vector< std::vector< double >>  periodicboundaries,
double  min,
bool  massweigh,
std::string  filename,
std::string  Nworld_filename,
std::string  Fworld_filename,
const std::vector< std::vector< double >> &  histdetails,
int  FBackupInterv,
double  unitconv,
double  timestep,
unsigned int  frequency 
)
inline

Constructor.

Parameters
worldMPI global communicator.
commMPI local communicator.
NLocal CV histogram.
NworldGlobal CV histogram.
FVector of grids holding local raw generalized force totals per bin per CV.
FworldVector of grids holding global raw generalized force totals per bin per CV.
restraintMinimum, maximum and spring constant for CV restraints.
isperiodicVector of bools that holds whether each CV is periodic or not.
periodicboundariesPeriodic boundaries of each CV.
minMinimum number of hist in a histogram bin before biasing is applied.
massweighTurn mass weighing on/off.
filenameName for output file.
Nworld_filenameName to read/write CV histogram.
Fworld_filenameName to read/write raw generalized force histograms.
histdetailsMinimum, maximum and number of bins for each CV.
FBackupIntervSet how often the adaptive force histograms are backed up.
unitconvUnit conversion from d(momentum)/d(time) to force.
timestepSimulation time step.
frequencyFrequency with which this method is invoked.

Constructs an instance of Adaptive Biasing Force method.

Note
The restraints should be outside of the range defined in histdetails_ by at least one bin size on each side.

Definition at line 216 of file ABF.h.

234  :
235  Method(frequency, world, comm), N_(N), Nworld_(Nworld), F_(F), Fworld_(Fworld), restraint_(restraint), isperiodic_(isperiodic), periodicboundaries_(periodicboundaries),
236  min_(min), wdotp1_(), wdotp2_(), Fold_(), massweigh_(massweigh),
237  biases_(), dim_(0), filename_(filename), Nworld_filename_(Nworld_filename), Fworld_filename_(Fworld_filename),
238  histdetails_(histdetails),
239  FBackupInterv_(FBackupInterv), unitconv_(unitconv), timestep_(timestep),
240  iteration_(0)
241  {
242  }
std::string filename_
Definition: ABF.h:126
Grid< int > * N_
To store number of local hits at a given CV bin.
Definition: ABF.h:66
std::string Fworld_filename_
Fworld print out filename, for restarts.
Definition: ABF.h:132
double unitconv_
Unit Conversion Constant from W dot P to Force.
Definition: ABF.h:158
std::vector< std::vector< double > > histdetails_
Histogram details.
Definition: ABF.h:143
Method(uint frequency, const MPI_Comm &world, const MPI_Comm &comm)
Constructor.
Definition: Method.h:61
std::vector< Grid< double > * > F_
To store running total of the local walker.
Definition: ABF.h:51
bool massweigh_
Mass weighing of bias enabled/disabled.
Definition: ABF.h:113
Eigen::VectorXd Fold_
To hold last iterations F_ value for removing bias.
Definition: ABF.h:110
std::vector< bool > isperiodic_
For each CV, holds whether that CV has periodic boundaries or not.
Definition: ABF.h:87
std::vector< Vector3 > biases_
Biases applied to atoms each timestep.
Definition: ABF.h:116
std::vector< std::vector< double > > restraint_
Information for a harmonic restraint to keep CV in the region of interest.
Definition: ABF.h:84
std::string Nworld_filename_
Nworld print out filename, for restarts.
Definition: ABF.h:129
unsigned int dim_
Number of CVs in system.
Definition: ABF.h:119
std::vector< Grid< double > * > Fworld_
Will hold the global total, synced across walkers at every time step.
Definition: ABF.h:59
int min_
Definition: ABF.h:101
int FBackupInterv_
Integer to hold F estimate backup information.
Definition: ABF.h:149
Grid< int > * Nworld_
To store number of global hits at a given CV bin.
Definition: ABF.h:73
Eigen::VectorXd wdotp2_
To hold second to last iteration wdotp value for numerical derivative.
Definition: ABF.h:107
double timestep_
Timestep of integration.
Definition: ABF.h:172
uint iteration_
Iteration counter.
Definition: ABF.h:175
std::vector< std::vector< double > > periodicboundaries_
Holds periodic boundaries of CVs.
Definition: ABF.h:97
Eigen::VectorXd wdotp1_
To hold last iteration wdotp value for numerical derivative.
Definition: ABF.h:104

Member Function Documentation

bool SSAGES::ABF::boundsCheck ( const std::vector< double > &  CVs)
private

Checks whether the local walker is within CV bounds.

Parameters
CVsCurrent values of CVs.
Returns
Whether the walker is in bounds or not.

Definition at line 298 of file ABF.cpp.

299  {
300  for(size_t i = 0; i < dim_ ; ++i)
301  {
302  if((CVs[i] < N_->GetLower(i)) || (CVs[i] > N_->GetUpper(i)))
303  {
304  return false;
305  }
306  }
307  return true;
308  }
Grid< int > * N_
To store number of local hits at a given CV bin.
Definition: ABF.h:66
const std::vector< double > & GetLower() const
Return the lower edges of the Grid.
Definition: GridBase.h:165
const std::vector< double > & GetUpper() const
Return the upper edges of the Grid.
Definition: GridBase.h:191
unsigned int dim_
Number of CVs in system.
Definition: ABF.h:119
ABF * SSAGES::ABF::Build ( const Json::Value &  json,
const MPI_Comm &  world,
const MPI_Comm &  comm,
const std::string &  path 
)
static

Definition at line 311 of file ABF.cpp.

References Json::Requirement::GetErrors(), Json::Requirement::HasErrors(), SSAGES::Grid< T >::LoadFromFile(), Json::ObjectRequirement::Parse(), and Json::ObjectRequirement::Validate().

315  {
316  ObjectRequirement validator;
317  Value schema;
318  Reader reader;
319 
320  reader.parse(JsonSchema::ABFMethod, schema);
321  validator.Parse(schema, path);
322 
323  // Validate inputs.
324  validator.Validate(json, path);
325  if(validator.HasErrors())
326  throw BuildException(validator.GetErrors());
327 
328  uint wid = mxx::comm(world).rank()/mxx::comm(comm).size();
329 
330  //bool multiwalkerinput = false;
331 
332  // Obtain lower bound for each CV.
333  std::vector<double> minsCV;
334  for(auto& mins : json["CV_lower_bounds"])
335  if(mins.isArray())
336  {
337  throw BuildException({"Separate inputs for multi-walker not fully implemented. Please use global entries for CV ranges"});
338  //multiwalkerinput = true;
339  //for(auto& bound : mins)
340  // minsCV.push_back(bound.asDouble());
341  }
342  else
343  minsCV.push_back(mins.asDouble());
344 
345  // Obtain upper bound for each CV.
346  std::vector<double> maxsCV;
347  for(auto& maxs : json["CV_upper_bounds"])
348  /*if(maxs.isArray())
349  {
350  for(auto& bound : maxs)
351  maxsCV.push_back(bound.asDouble());
352  }*/
353  //else
354  maxsCV.push_back(maxs.asDouble());
355 
356  // Obtain number of bins for each CV dimension.
357  std::vector<int> binsCV;
358  for(auto& bins : json["CV_bins"])
359  binsCV.push_back(bins.asInt());
360 
361  // Obtain lower bounds for restraints for each CV.
362  std::vector<double> minsrestCV;
363  for(auto& mins : json["CV_restraint_minimums"])
364  /*if(mins.isArray())
365  {
366  for(auto& bound : mins)
367  minsrestCV.push_back(bound.asDouble());
368  }*/
369  //else
370  minsrestCV.push_back(mins.asDouble());
371 
372  // Obtain upper bounds for restraints for each CV.
373  std::vector<double> maxsrestCV;
374  for(auto& maxs : json["CV_restraint_maximums"])
375  /*if(maxs.isArray())
376  {
377  for(auto& bound : maxs)
378  maxsrestCV.push_back(bound.asDouble());
379  }*/
380  //else
381  maxsrestCV.push_back(maxs.asDouble());
382 
383  // Obtain harmonic spring constant for restraints for each CV.
384  std::vector<double> springkrestCV;
385  for(auto& bins : json["CV_restraint_spring_constants"])
386  springkrestCV.push_back(bins.asDouble());
387 
388  // Obtain periodicity information for restraints for each CV for the purpose of correctly applying restraints through periodic boundaries.
389  std::vector<bool> isperiodic;
390  for(auto& isperCV : json["CV_isperiodic"])
391  isperiodic.push_back(isperCV.asBool());
392 
393  // Obtain lower periodic boundary for each CV.
394  std::vector<double> minperboundaryCV;
395  for(auto& minsperCV : json["CV_periodic_boundary_lower_bounds"])
396  minperboundaryCV.push_back(minsperCV.asDouble());
397 
398  // Obtain upper periodic boundary for each CV.
399  std::vector<double> maxperboundaryCV;
400  for(auto& maxsperCV : json["CV_periodic_boundary_upper_bounds"])
401  maxperboundaryCV.push_back(maxsperCV.asDouble());
402 
403  // Verify inputs are all correct lengths.
404  if(!(( minsCV.size() == maxsCV.size() &&
405  maxsCV.size() == minsrestCV.size() &&
406  minsrestCV.size() == maxsrestCV.size()) &&
407  (binsCV.size() == springkrestCV.size() &&
408  springkrestCV.size() == isperiodic.size())))
409  throw BuildException({"CV lower bounds, upper bounds, restrain minimums, restrains maximums must match in size. Bins, spring constants and periodicity info must match in size."});
410 
411  // Verify that all periodicity information is provided if CVs are periodic.
412  bool anyperiodic=false;
413  for(size_t i = 0; i<isperiodic.size(); ++i)
414  if(isperiodic[i])
415  {
416  anyperiodic = true;
417  if(!(isperiodic.size() == minperboundaryCV.size() &&
418  minperboundaryCV.size() == maxperboundaryCV.size()))
419  throw BuildException({"If any CV is defined as periodic, please define the full upper and lower bound vectors. They should both have the same number of entries as CV lower bounds, upper bounds... Entries corresponding to non-periodic CVs will not be used."});
420  }
421 
422  int dim = binsCV.size();
423 
424  // Read in JSON info.
425  auto FBackupInterv = json.get("output_frequency", 1000).asInt();
426  auto unitconv = json.get("unit_conversion", 0).asDouble();
427  auto timestep = json.get("timestep", 2).asDouble();
428  auto min = json.get("minimum_count", 200).asDouble();
429  auto massweigh = json.get("mass_weighing",false).asBool();
430 
431  std::vector<std::vector<double>> histdetails;
432  std::vector<std::vector<double>> restraint;
433  std::vector<std::vector<double>> periodicboundaries;
434  std::vector<double> temp1(3);
435  std::vector<double> temp2(3);
436  std::vector<double> temp3(2);
437 
438  auto freq = json.get("frequency", 1).asInt();
439  auto filename = json.get("output_file", "F_out").asString();
440  auto Nworld_filename = json.get("Nworld_output_file", "Nworld").asString();
441  auto Fworld_filename = json.get("Fworld_output_file", "Fworld_cv").asString();
442 
443  // Generate the grids based on JSON.
444  Grid<int> *N;
445  Grid<int> *Nworld;
446  std::vector<Grid<double>*> F(dim);
447  std::vector<Grid<double>*> Fworld(dim);
448 
449  // This feature is disabled for now.
450  /*if(multiwalkerinput)
451  {
452  for(size_t i=0; i<dim; ++i)
453  {
454  temp1 = {minsCV[i+wid*dim], maxsCV[i+wid*dim], binsCV[i]};
455  temp2 = {minsrestCV[i+wid*dim], maxsrestCV[i+wid*dim], springkrestCV[i]};
456  histdetails.push_back(temp1);
457  restraint.push_back(temp2);
458  if(anyperiodic)
459  {
460  temp3 = {minperboundaryCV[i], maxperboundaryCV[i]};
461  periodicboundaries.push_back(temp3);
462  }
463  }
464  for(size_t i=0; i<dim; ++i)
465  {
466  minsCVperwalker[i] = histdetails[i][0];
467  maxsCVperwalker[i] = histdetails[i][1];
468  }
469 
470  N= new Grid<int>(binsCV, minsCVperwalker, maxsCVperwalker, isperiodic);
471  Nworld= new Grid<int>(binsCV, minsCVperwalker, maxsCVperwalker, isperiodic);
472 
473  for(auto& grid : F)
474  {
475  grid= new Grid<double>(binsCV, minsCVperwalker, maxsCVperwalker, isperiodic);
476  }
477  for(auto& grid : Fworld)
478  {
479  grid= new Grid<double>(binsCV, minsCVperwalker, maxsCVperwalker, isperiodic);
480  }
481 
482  }
483  */
484  //else
485  //{
486 
487  // Appropriately size the grids.
488 
489  N= new Grid<int>(binsCV, minsCV, maxsCV, isperiodic);
490  Nworld= new Grid<int>(binsCV, minsCV, maxsCV, isperiodic);
491 
492  for(auto& grid : F)
493  {
494  grid= new Grid<double>(binsCV, minsCV, maxsCV, isperiodic);
495  }
496  for(auto& grid : Fworld)
497  {
498  grid= new Grid<double>(binsCV, minsCV, maxsCV, isperiodic);
499  }
500 
501  for(size_t i=0; i<dim; ++i)
502  {
503  temp1 = {minsCV[i], maxsCV[i], binsCV[i]};
504  temp2 = {minsrestCV[i], maxsrestCV[i], springkrestCV[i]};
505  histdetails.push_back(temp1);
506  restraint.push_back(temp2);
507  if(anyperiodic)
508  {
509  temp3 = {minperboundaryCV[i], maxperboundaryCV[i]};
510  periodicboundaries.push_back(temp3);
511  }
512  }
513  //}
514 
515  // Check if previously saved grids exist. If so, check that data match and load grids.
516  if(std::ifstream(Nworld_filename) && std::ifstream(Fworld_filename+std::to_string(0)) && wid == 0)
517  {
518  std::cout << "Attempting to load data from a previous run of ABF." << std::endl;
519  N->LoadFromFile(Nworld_filename);
520  for(size_t i=0; i<dim; ++i)
521  if(std::ifstream(Fworld_filename+std::to_string(i)))
522  F[i]->LoadFromFile(Fworld_filename+std::to_string(i));
523  else
524  throw BuildException({"Some, but not all Fworld outputs were found. Please check that these are appropriate inputs, or clean the working directory of other Fworld and Nworld inputs."});
525  }
526 
527 
528  auto* m = new ABF(world, comm, N, Nworld, F, Fworld, restraint, isperiodic, periodicboundaries, min, massweigh, filename, Nworld_filename, Fworld_filename, histdetails, FBackupInterv, unitconv, timestep, freq);
529 
530 
531  if(json.isMember("iteration"))
532  m->SetIteration(json.get("iteration",0).asInt());
533 
534  return m;
535 
536  }
ABF(const MPI_Comm &world, const MPI_Comm &comm, Grid< int > *N, Grid< int > *Nworld, std::vector< Grid< double > * > F, std::vector< Grid< double > * > Fworld, std::vector< std::vector< double >> restraint, std::vector< bool > isperiodic, std::vector< std::vector< double >> periodicboundaries, double min, bool massweigh, std::string filename, std::string Nworld_filename, std::string Fworld_filename, const std::vector< std::vector< double >> &histdetails, int FBackupInterv, double unitconv, double timestep, unsigned int frequency)
Constructor.
Definition: ABF.h:216
bool HasErrors()
Check if errors have occured.
Definition: Requirement.h:86
virtual void Parse(Value json, const std::string &path) override
Parse JSON value to generate Requirement(s).
std::vector< std::string > GetErrors()
Get list of error messages.
Definition: Requirement.h:92
Requirements on an object.
virtual void Validate(const Value &json, const std::string &path) override
Validate JSON value.

Here is the call graph for this function:

void SSAGES::ABF::CalcBiasForce ( const Snapshot snapshot,
const CVList cvs,
const std::vector< double > &  cvVals 
)
private

Computes the bias force.

Parameters
snapshotCurrent simulation snapshot.
cvsDetails of CVs.
cvValsCurrent values of CVs.

Definition at line 179 of file ABF.cpp.

References SSAGES::Snapshot::GetNumAtoms().

180  {
181  // Reset the bias.
182  biases_.resize(snapshot->GetNumAtoms(), Vector3{0,0,0});
183  for(auto& b : biases_)
184  b.setZero();
185 
186  // Compute bias if within bounds.
187  if(boundsCheck(cvVals))
188  {
189  for(int i = 0; i < dim_; ++i)
190  {
191  auto& grad = cvs[i]->GetGradient();
192  for(size_t j = 0; j < biases_.size(); ++j)
193  biases_[j] -= (Fworld_[i]->at(cvVals))*grad[j]/std::max(min_,Nworld_->at(cvVals));
194  }
195  }
196  // Otherwise, apply harmonic restraint if enabled.
197  else
198  {
199  for(int i = 0; i < dim_; ++i)
200  {
201  double cvVal = cvs[i]->GetValue();
202  auto k = 0.;
203  auto x0 = 0.;
204 
205  if(isperiodic_[i])
206  {
207  double periodsize = periodicboundaries_[i][1]-periodicboundaries_[i][0];
208  double cvRestrMidpoint = (restraint_[i][1]+restraint_[i][0])/2;
209  while((cvVal-cvRestrMidpoint) > periodsize/2)
210  cvVal -= periodsize;
211  while((cvVal-cvRestrMidpoint) < -periodsize/2)
212  cvVal += periodsize;
213  }
214 
215  if(cvVal < restraint_[i][0] && restraint_[i][2] > 0)
216  {
217  k = restraint_[i][2];
218  x0 = restraint_[i][0];
219  }
220  else if (cvVal > restraint_[i][1] && restraint_[i][2] > 0)
221  {
222  k = restraint_[i][2];
223  x0 = restraint_[i][1];
224  }
225 
226  auto& grad = cvs[i]->GetGradient();
227  for(size_t j = 0; j < biases_.size(); ++j)
228  biases_[j] -= (cvVal - x0)*k*grad[j];
229  }
230  }
231  }
std::vector< bool > isperiodic_
For each CV, holds whether that CV has periodic boundaries or not.
Definition: ABF.h:87
std::vector< Vector3 > biases_
Biases applied to atoms each timestep.
Definition: ABF.h:116
std::vector< std::vector< double > > restraint_
Information for a harmonic restraint to keep CV in the region of interest.
Definition: ABF.h:84
unsigned int dim_
Number of CVs in system.
Definition: ABF.h:119
std::vector< Grid< double > * > Fworld_
Will hold the global total, synced across walkers at every time step.
Definition: ABF.h:59
bool boundsCheck(const std::vector< double > &CVs)
Checks whether the local walker is within CV bounds.
Definition: ABF.cpp:298
Eigen::Vector3d Vector3
Three-dimensional vector.
Definition: types.h:33
const T & at(const std::vector< int > &indices) const
Access Grid element read-only.
Definition: GridBase.h:452
int min_
Definition: ABF.h:101
Grid< int > * Nworld_
To store number of global hits at a given CV bin.
Definition: ABF.h:73
std::vector< std::vector< double > > periodicboundaries_
Holds periodic boundaries of CVs.
Definition: ABF.h:97

Here is the call graph for this function:

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

Post-integration hook.

Parameters
snapshotCurrent simulation snapshot.
cvmanagerCollective variable manager.

Post-integration hook is where processes carried out every timestep happen. First, information from current snapshot is retrieved and stored in variables as necessary. Then, coordinates in CV space are determined. Then, for each CV, the time derivative of w.p is calculated. Then, information is printed out if its enabled. Finally, bias is applied from current estimate of generalized force.

Coord holds where we are in CV space in current timestep.

Eigen::MatrixXd to hold the CV gradient.

std::vector<double> to hold CV values to address grid.

Implements SSAGES::Method.

Definition at line 76 of file ABF.cpp.

References SSAGES::CVManager::GetCVs(), SSAGES::Snapshot::GetForces(), SSAGES::Snapshot::GetMasses(), SSAGES::Snapshot::GetNumAtoms(), and SSAGES::Snapshot::GetVelocities().

77  {
78 
79  ++iteration_;
80 
81  // Gather information.
82  auto cvs = cvmanager.GetCVs(cvmask_);
83  auto& vels = snapshot->GetVelocities();
84  auto& mass = snapshot->GetMasses();
85  auto& forces = snapshot->GetForces();
86  auto n = snapshot->GetNumAtoms();
87 
88 
90  //int coord = histCoords(cvs);
91 
93  Eigen::MatrixXd J(dim_, 3*n);
94 
96  std::vector<double> cvVals(dim_);
97 
98  // Fill J and CV. Each column represents grad(CV) with flattened Cartesian elements.
99  for(int i = 0; i < dim_; ++i)
100  {
101  auto& grad = cvs[i]->GetGradient();
102  for(size_t j = 0; j < n; ++j)
103  J.block<1, 3>(i,3*j) = grad[j];
104  cvVals[i] = cvs[i]->GetValue();
105  }
106 
107  //* Calculate W using Darve's approach (http://mc.stanford.edu/cgi-bin/images/0/06/Darve_2008.pdf).
108  Eigen::MatrixXd Jmass = J.transpose();
109  if(massweigh_)
110  {
111  for(size_t i = 0; i < forces.size(); ++i)
112  Jmass.block(3*i, 0, 3, dim_) = Jmass.block(3*i, 0, 3, dim_)/mass[i];
113  }
114 
115  Eigen::MatrixXd Minv = J*Jmass;
116  MPI_Allreduce(MPI_IN_PLACE, Minv.data(), Minv.size(), MPI_DOUBLE, MPI_SUM, comm_);
117  Eigen::MatrixXd Wt = Minv.inverse()*Jmass.transpose();
118  // Fill momenta.
119  Eigen::VectorXd momenta(3*vels.size());
120  for(size_t i = 0; i < vels.size(); ++i)
121  momenta.segment<3>(3*i) = mass[i]*vels[i];
122 
123  // Compute dot(w,p)
124  Eigen::VectorXd wdotp = Wt*momenta;
125 
126 
127  // Reduce dot product across processors.
128  MPI_Allreduce(MPI_IN_PLACE, wdotp.data(), wdotp.size(), MPI_DOUBLE, MPI_SUM, comm_);
129 
130 
131  // Compute d(wdotp)/dt second order backwards finite difference.
132  // Adding old force removes bias.
133  Eigen::VectorXd dwdotpdt = unitconv_*(1.5*wdotp - 2.0*wdotp1_ + 0.5*wdotp2_)/timestep_ + Fold_;
134 
135  // If we are in bounds, sum force into running total.
136  if(boundsCheck(cvVals))
137  {
138  for(size_t i=0; i<dim_; ++i)
139  F_[i]->at(cvVals) += dwdotpdt[i];
140  N_->at(cvVals)++;
141  }
142 
143  // Reduce data across processors.
144  for(size_t i=0; i<dim_; ++i)
145  MPI_Allreduce(F_[i]->data(), Fworld_[i]->data(), (F_[i]->size()), MPI_DOUBLE, MPI_SUM, world_);
146  MPI_Allreduce(N_->data(), Nworld_->data(), N_->size(), MPI_INT, MPI_SUM, world_);
147 
148  // If we are in bounds, store the old summed force.
149  if(boundsCheck(cvVals))
150  {
151  for(size_t i=0; i < dim_; ++i)
152  Fold_[i] = Fworld_[i]->at(cvVals)/std::max(min_, Nworld_->at(cvVals));
153  }
154 
155  // Update finite difference time derivatives.
156  wdotp2_ = wdotp1_;
157  wdotp1_ = wdotp;
158 
159  // Write out data to file.
160  if(iteration_ % FBackupInterv_ == 0)
161  WriteData();
162 
163  // Calculate the bias from averaged F at current CV coordinates.
164  // Or apply harmonic restraints to return CVs back in bounds.
165  CalcBiasForce(snapshot, cvs, cvVals);
166 
167  // Update the forces in snapshot by adding in the force bias from each
168  // CV to each atom based on the gradient of the CV.
169  for (size_t j = 0; j < forces.size(); ++j)
170  forces[j] += biases_[j];
171  }
Grid< int > * N_
To store number of local hits at a given CV bin.
Definition: ABF.h:66
mxx::comm comm_
Local MPI communicator.
Definition: Method.h:47
mxx::comm world_
Global MPI communicator.
Definition: Method.h:46
void WriteData()
Writes out data to file.
Definition: ABF.cpp:235
double unitconv_
Unit Conversion Constant from W dot P to Force.
Definition: ABF.h:158
size_t size() const
Get the size of the internal storage vector.
Definition: GridBase.h:250
std::vector< Grid< double > * > F_
To store running total of the local walker.
Definition: ABF.h:51
bool massweigh_
Mass weighing of bias enabled/disabled.
Definition: ABF.h:113
Eigen::VectorXd Fold_
To hold last iterations F_ value for removing bias.
Definition: ABF.h:110
std::vector< Vector3 > biases_
Biases applied to atoms each timestep.
Definition: ABF.h:116
void CalcBiasForce(const Snapshot *snapshot, const CVList &cvs, const std::vector< double > &cvVals)
Computes the bias force.
Definition: ABF.cpp:179
unsigned int dim_
Number of CVs in system.
Definition: ABF.h:119
std::vector< Grid< double > * > Fworld_
Will hold the global total, synced across walkers at every time step.
Definition: ABF.h:59
bool boundsCheck(const std::vector< double > &CVs)
Checks whether the local walker is within CV bounds.
Definition: ABF.cpp:298
std::vector< uint > cvmask_
Mask which identifies which CVs to act on.
Definition: Method.h:50
const T & at(const std::vector< int > &indices) const
Access Grid element read-only.
Definition: GridBase.h:452
T * data()
Get pointer to the internal data storage vector.
Definition: GridBase.h:262
int min_
Definition: ABF.h:101
int FBackupInterv_
Integer to hold F estimate backup information.
Definition: ABF.h:149
Grid< int > * Nworld_
To store number of global hits at a given CV bin.
Definition: ABF.h:73
Eigen::VectorXd wdotp2_
To hold second to last iteration wdotp value for numerical derivative.
Definition: ABF.h:107
double timestep_
Timestep of integration.
Definition: ABF.h:172
uint iteration_
Iteration counter.
Definition: ABF.h:175
Eigen::VectorXd wdotp1_
To hold last iteration wdotp value for numerical derivative.
Definition: ABF.h:104

Here is the call graph for this function:

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

Post-simulation hook.

Parameters
snapshotCurrent simulation snapshot.
cvmanagerCollective variable manager.

Implements SSAGES::Method.

Definition at line 174 of file ABF.cpp.

175  {
176  WriteData();
177  }
void WriteData()
Writes out data to file.
Definition: ABF.cpp:235
void SSAGES::ABF::PreSimulation ( Snapshot snapshot,
const class CVManager cvmanager 
)
overridevirtual

Pre-simulation hook.

Parameters
snapshotCurrent simulation snapshot.
cvmanagerCollective variable manager.

Implements SSAGES::Method.

Definition at line 39 of file ABF.cpp.

References SSAGES::CVManager::GetCVs(), and SSAGES::Snapshot::GetPositions().

40  {
41 
42  // Open/close outfile to create it fresh.
43  if(world_.rank() == 0)
44  {
45  worldout_.open(filename_);
46  worldout_.close();
47  }
48 
49  // Convenience. Number of CVs.
50  auto cvs = cvmanager.GetCVs(cvmask_);
51  dim_ = cvs.size();
52 
53  // Size and initialize Fold_
54  Fold_.setZero(dim_);
55 
56  // Size and initialize Fworld_ and Nworld_
57  auto nel = 1;
58 
59  // Initialize biases.
60  biases_.resize(snapshot->GetPositions().size(), Vector3{0, 0, 0});
61 
62  // Initialize w \dot p's for finite difference.
63  wdotp1_.setZero(dim_);
64  wdotp2_.setZero(dim_);
65  }
std::string filename_
Definition: ABF.h:126
std::ofstream worldout_
Output stream for F/N world data.
Definition: ABF.h:122
mxx::comm world_
Global MPI communicator.
Definition: Method.h:46
Eigen::VectorXd Fold_
To hold last iterations F_ value for removing bias.
Definition: ABF.h:110
std::vector< Vector3 > biases_
Biases applied to atoms each timestep.
Definition: ABF.h:116
unsigned int dim_
Number of CVs in system.
Definition: ABF.h:119
std::vector< uint > cvmask_
Mask which identifies which CVs to act on.
Definition: Method.h:50
Eigen::Vector3d Vector3
Three-dimensional vector.
Definition: types.h:33
Eigen::VectorXd wdotp2_
To hold second to last iteration wdotp value for numerical derivative.
Definition: ABF.h:107
Eigen::VectorXd wdotp1_
To hold last iteration wdotp value for numerical derivative.
Definition: ABF.h:104

Here is the call graph for this function:

void SSAGES::ABF::SetIteration ( const int  iter)
inline

Set iteration of the method.

Parameters
iterNew value for the iteration counter.

Definition at line 269 of file ABF.h.

References iteration_.

270  {
271  iteration_ = iter;
272  }
uint iteration_
Iteration counter.
Definition: ABF.h:175

Member Data Documentation

std::vector<Grid<double>*> SSAGES::ABF::F_
private

To store running total of the local walker.

This is a grid that holds dF/dCVx where x is one of the CVs. For N CVs, there will be N grids, and thus this vector will be N long.

Definition at line 51 of file ABF.h.

int SSAGES::ABF::FBackupInterv_
private

Integer to hold F estimate backup information.

Print every how many timesteps? ; -1: Do not backup during simulation

Definition at line 149 of file ABF.h.

std::string SSAGES::ABF::filename_
private

File name for world data. Principal output of the method.

Definition at line 126 of file ABF.h.

std::vector<Grid<double>*> SSAGES::ABF::Fworld_
private

Will hold the global total, synced across walkers at every time step.

This is a grid that holds dF/dCVx where x is one of the CVs. For N CVs, there will be N grids, and thus this vector will be N long. Global version.

Definition at line 59 of file ABF.h.

std::vector<std::vector<double> > SSAGES::ABF::histdetails_
private

Histogram details.

This is a 2 Dimensional object set up as the following: Histdetails is a vector of (nr of CV) vectors, ordered in CV order. Each of those vectors are 3 long. First entry of each vector holds the lower bound for that CV. Second entry of each vector holds the upper bound for that CV. Third entry of each vector holds the nr of bins for that CV dimension.

Definition at line 143 of file ABF.h.

int SSAGES::ABF::min_
private

The minimum number of hits required before full biasing, bias is F_[i]/max(N_[i],min_).

Definition at line 101 of file ABF.h.

Grid<int>* SSAGES::ABF::N_
private

To store number of local hits at a given CV bin.

Stores the number of times each bin was visited in CV space.

Definition at line 66 of file ABF.h.

Grid<int>* SSAGES::ABF::Nworld_
private

To store number of global hits at a given CV bin.

Stores the number of times each bin was visited in CV space. Global version.

Definition at line 73 of file ABF.h.

std::vector<std::vector<double> > SSAGES::ABF::periodicboundaries_
private

Holds periodic boundaries of CVs.

This is a 2 Dimensional object set up as the following: periodicboundaries_ is a vector of (nr of CV) vectors, ordered in CV order. Each of those vectors are 2 long. First entry of each vector holds the lower bound for that CV periodic boundary. Second entry of each vector holds the upper bound for that CV periodic boundary.

Definition at line 97 of file ABF.h.

std::vector<std::vector<double> > SSAGES::ABF::restraint_
private

Information for a harmonic restraint to keep CV in the region of interest.

This is a 2 Dimensional object set up as the following: restraint_ is a vector of (nr of CV) vectors, ordered in CV order. Each of those vectors are 3 long. First entry of each vector holds the lower bound for that CV restraint. Second entry of each vector holds the upper bound for that CV restraint. Third entry of each vector holds the spring constant for that CV restraint.

Definition at line 84 of file ABF.h.

double SSAGES::ABF::unitconv_
private

Unit Conversion Constant from W dot P to Force.

It is crucial that unit conversion is entered correctly. Unit conversion from d(momentum)/d(time) to force for the simulation. For LAMMPS using units real, this is 2390.06 (gram.angstrom/mole.femtosecond^2 -> kcal/mole.angstrom)

Definition at line 158 of file ABF.h.


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