304 CharReaderBuilder rbuilder;
305 CharReader* reader = rbuilder.newCharReader();
307 reader->parse(JsonSchema::ABFMethod.c_str(),
308 JsonSchema::ABFMethod.c_str() + JsonSchema::ABFMethod.size(),
310 validator.
Parse(schema, path);
315 throw BuildException(validator.
GetErrors());
320 std::vector<double> minsCV;
321 for(
auto& mins : json[
"CV_lower_bounds"])
324 throw BuildException({
"Separate inputs for multi-walker not fully implemented. Please use global entries for CV ranges"});
330 minsCV.push_back(mins.asDouble());
333 std::vector<double> maxsCV;
334 for(
auto& maxs : json[
"CV_upper_bounds"])
341 maxsCV.push_back(maxs.asDouble());
344 std::vector<int> binsCV;
345 for(
auto& bins : json[
"CV_bins"])
346 binsCV.push_back(bins.asInt());
349 std::vector<double> minsrestCV;
350 for(
auto& mins : json[
"CV_restraint_minimums"])
357 minsrestCV.push_back(mins.asDouble());
360 std::vector<double> maxsrestCV;
361 for(
auto& maxs : json[
"CV_restraint_maximums"])
368 maxsrestCV.push_back(maxs.asDouble());
371 std::vector<double> springkrestCV;
372 for(
auto& springkrest : json[
"CV_restraint_spring_constants"])
374 if(springkrest.asDouble() < 0)
376 throw BuildException({
"Restraint spring constants must be non-negative."});
378 springkrestCV.push_back(springkrest.asDouble());
382 std::vector<bool> isperiodic;
383 for(
auto& isperCV : json[
"CV_isperiodic"])
384 isperiodic.push_back(isperCV.asBool());
387 std::vector<double> minperboundaryCV;
388 for(
auto& minsperCV : json[
"CV_periodic_boundary_lower_bounds"])
389 minperboundaryCV.push_back(minsperCV.asDouble());
392 std::vector<double> maxperboundaryCV;
393 for(
auto& maxsperCV : json[
"CV_periodic_boundary_upper_bounds"])
394 maxperboundaryCV.push_back(maxsperCV.asDouble());
397 if(!(( minsCV.size() == maxsCV.size() &&
398 maxsCV.size() == minsrestCV.size() &&
399 minsrestCV.size() == maxsrestCV.size()) &&
400 (binsCV.size() == springkrestCV.size() &&
401 springkrestCV.size() == isperiodic.size())))
402 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."});
405 bool anyperiodic=
false;
406 for(
size_t i = 0; i<isperiodic.size(); ++i)
410 if(!(isperiodic.size() == minperboundaryCV.size() &&
411 minperboundaryCV.size() == maxperboundaryCV.size()))
412 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."});
415 size_t dim = binsCV.size();
418 auto FBackupInterv = json.get(
"output_frequency", 1000).asInt();
419 auto unitconv = json.get(
"unit_conversion", 0).asDouble();
420 auto timestep = json.get(
"timestep", 2).asDouble();
421 auto min = json.get(
"minimum_count", 200).asDouble();
422 auto massweigh = json.get(
"mass_weighing",
false).asBool();
424 std::vector<std::vector<double>> histdetails;
425 std::vector<std::vector<double>> restraint;
426 std::vector<std::vector<double>> periodicboundaries;
427 std::vector<double> temp1(3);
428 std::vector<double> temp2(3);
429 std::vector<double> temp3(2);
431 auto freq = json.get(
"frequency", 1).asInt();
432 auto filename = json.get(
"output_file",
"F_out").asString();
433 auto Nworld_filename = json.get(
"Nworld_output_file",
"Nworld").asString();
434 auto Fworld_filename = json.get(
"Fworld_output_file",
"Fworld_cv").asString();
439 std::vector<Grid<double>*> F(dim);
440 std::vector<Grid<double>*> Fworld(dim);
485 N =
new Grid<int>(binsCV, minsCV, maxsCV, isperiodic);
486 Nworld =
new Grid<int>(binsCV, minsCV, maxsCV, isperiodic);
490 grid =
new Grid<double>(binsCV, minsCV, maxsCV, isperiodic);
492 for(
auto& grid : Fworld)
494 grid =
new Grid<double>(binsCV, minsCV, maxsCV, isperiodic);
497 for(
size_t i = 0; i < dim; ++i)
499 temp1 = {minsCV[i], maxsCV[i], double(binsCV[i])};
500 temp2 = {minsrestCV[i], maxsrestCV[i], springkrestCV[i]};
501 histdetails.push_back(temp1);
502 restraint.push_back(temp2);
505 temp3 = {minperboundaryCV[i], maxperboundaryCV[i]};
506 periodicboundaries.push_back(temp3);
512 bool restart = json.get(
"restart",
false).asBool();
519 std::cout <<
"Attempting to load data from a previous run of ABF..." << std::endl;
520 N->LoadFromFile(Nworld_filename);
521 for(
size_t i = 0; i < dim; ++i)
523 F[i]->LoadFromFile(Fworld_filename+std::to_string(i));
528 std::ifstream Nworldbackupsource(Nworld_filename, std::ios::binary);
529 if(Nworldbackupsource)
531 std::cout <<
"Backing up previous copy of Nworld." << std::endl;
532 std::ofstream Nworldbackuptarget(Nworld_filename+
"_backup", std::ios::binary);
533 Nworldbackuptarget << Nworldbackupsource.rdbuf();
535 for(
size_t i = 0; i < dim; ++i)
537 std::ifstream Fworldbackupsource(Fworld_filename+std::to_string(i), std::ios::binary);
538 if(Fworldbackupsource)
540 std::cout <<
"Backing up previous copy of Fworld_cv"+std::to_string(i)+
"." << std::endl;
541 std::ofstream Fworldbackuptarget(Fworld_filename+std::to_string(i)+
"_backup", std::ios::binary);
542 Fworldbackuptarget << Fworldbackupsource.rdbuf();
548 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);
550 if(json.isMember(
"iteration"))
551 m->SetIteration(json.get(
"iteration",0).asInt());
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.
bool HasErrors()
Check if errors have occured.
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.
static bool IsMasterRank(const MPI_Comm &comm)
Check if current processor is master.