From 2a20dc2ef962ad0389f2e3f10bff94a98366cc88 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 18 Apr 2015 19:43:44 -0400 Subject: [PATCH] update colvars to version 2015-04-03 --- doc/PDF/colvars-refman-lammps.pdf | Bin 632049 -> 528941 bytes lib/colvars/Makefile.fermi | 21 +- lib/colvars/Makefile.g++ | 35 +- lib/colvars/Makefile.mingw32-cross | 20 +- lib/colvars/Makefile.mingw64-cross | 20 +- lib/colvars/colvar.cpp | 5 +- lib/colvars/colvar.h | 2 +- lib/colvars/colvaratoms.cpp | 2 - lib/colvars/colvaratoms.h | 4 - lib/colvars/colvarbias.h | 14 +- lib/colvars/colvarbias_abf.cpp | 203 --------- lib/colvars/colvarbias_abf.h | 36 +- lib/colvars/colvarbias_histogram.cpp | 226 ++++++++++ lib/colvars/colvarbias_histogram.h | 47 +++ lib/colvars/colvarbias_meta.cpp | 573 +++++++++++++------------- lib/colvars/colvarbias_meta.h | 2 + lib/colvars/colvarbias_restraint.h | 2 +- lib/colvars/colvarcomp_distances.cpp | 25 +- lib/colvars/colvarmodule.cpp | 45 +- lib/colvars/colvarmodule.h | 14 +- lib/colvars/colvarparse.cpp | 2 + lib/colvars/colvarparse.h | 2 + lib/colvars/colvarscript.cpp | 13 +- src/USER-COLVARS/colvarproxy_lammps.h | 2 +- 24 files changed, 701 insertions(+), 614 deletions(-) create mode 100644 lib/colvars/colvarbias_histogram.cpp create mode 100644 lib/colvars/colvarbias_histogram.h diff --git a/doc/PDF/colvars-refman-lammps.pdf b/doc/PDF/colvars-refman-lammps.pdf index c828ddbefbbdada4e6c80c650ca68ae64d7023bb..706617bcd58ca4c23b848e1b33808414ab3c7e46 100644 GIT binary patch delta 35609 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 HMNdWw=aoba delta 139700 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 != NULL) { - cvm::error("Error: this colvar cannot have the same name, \""+this->name+ + cvm::error("Error: this colvar cannot have the same name, \""+this->name+ "\", as another colvar.\n", INPUT_ERROR); + return; } // all tasks disabled by default @@ -1616,7 +1617,7 @@ int colvar::write_output_files() // ******************** ANALYSIS FUNCTIONS ******************** -void colvar::analyse() +void colvar::analyze() { if (tasks[task_runave]) { calc_runave(); diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 2a9abb9d47..beadc52f51 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -361,7 +361,7 @@ public: /// Read the analysis tasks int parse_analysis(std::string const &conf); /// Perform analysis tasks - void analyse(); + void analyze(); /// Read the value from a collective variable trajectory file diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index 99f63c5af6..dd59f60eff 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -331,8 +331,6 @@ int cvm::atom_group::parse(std::string const &conf, } else { get_keyval(group_conf, "disableForces", noforce, false, colvarparse::parse_silent); } - - get_keyval(group_conf, "weights", weights, weights, colvarparse::parse_silent); } // FITTING OPTIONS diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index d950ffb7ac..ef3bbcb39a 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -139,10 +139,6 @@ public: /// Allocates and populates the sorted list of atom ids int create_sorted_ids(void); - /// List of user-defined weights to be used by certain CVCs - std::vector weights; - - /// \brief When updating atomic coordinates, translate them to align with the /// center of mass of the reference coordinates bool b_center; diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h index 03674cc1fd..e4cc89f463 100644 --- a/lib/colvars/colvarbias.h +++ b/lib/colvars/colvarbias.h @@ -39,15 +39,12 @@ public: virtual int replica_share(); /// Perform analysis tasks - virtual inline void analyse() {} + virtual void analyze() {} /// Send forces to the collective variables void communicate_forces(); /// \brief Constructor - /// - /// The constructor of the colvarbias base class is protected, so - /// that it can only be called from inherited classes colvarbias(std::string const &conf, char const *key); /// Default constructor @@ -65,9 +62,18 @@ public: /// Write a label to the trajectory file (comment line) virtual std::ostream & write_traj_label(std::ostream &os); + /// (Re)initialize the output files (does not write them yet) + virtual int setup_output() { return COLVARS_OK; } + /// Output quantities such as the bias energy to the trajectory file virtual std::ostream & write_traj(std::ostream &os); + /// Write output files (if defined, e.g. in analysis mode) + virtual int write_output_files() + { + return COLVARS_OK; + } + inline cvm::real get_energy() { return bias_energy; } diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index 10490152d7..5f71f312e3 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -1,9 +1,5 @@ /// -*- c++ -*- -/******************************************************************************** - * Implementation of the ABF and histogram biases * - ********************************************************************************/ - #include "colvarmodule.h" #include "colvar.h" #include "colvarbias_abf.h" @@ -552,202 +548,3 @@ std::istream & colvarbias_abf::read_restart(std::istream& is) } return is; } - - - - -/// Histogram "bias" constructor - -colvarbias_histogram::colvarbias_histogram(std::string const &conf, char const *key) - : colvarbias(conf, key), - grid(NULL), out_name("") -{ - get_keyval(conf, "outputFreq", output_freq, cvm::restart_out_freq); - /// with VMD, this may not be an error - // if ( output_freq == 0 ) { - // cvm::error("User required histogram with zero output frequency"); - // } - - { - colvar_array_size = 1; - bool colvar_array = false; - if (get_keyval(conf, "sumVectorColvars", colvar_array, colvar_array)) { - size_t i; - for (i = 0; i < colvars.size(); i++) { - if (colvars[i]->value().type() == colvarvalue::type_vector) { - if (colvar_array_size == 1) { - colvar_array_size = colvars[i]->value().size(); - } else { - if (colvar_array_size != colvars[i]->value().size()) { - cvm::error("Error: trying to combine vector colvars of different lengths.\n", INPUT_ERROR); - } - } - } - } - } - } - - grid = new colvar_grid_count(); - { - std::string grid_conf; - if (key_lookup(conf, "grid", grid_conf)) { - grid->parse_params(grid_conf); - } else { - grid->init_from_colvars(colvars); - } - } - - bin.assign(colvars.size(), 0); - - cvm::log("Finished histogram setup.\n"); -} - -/// Destructor -colvarbias_histogram::~colvarbias_histogram() -{ - if (grid_os.is_open()) - grid_os.close(); - - if (grid) { - delete grid; - grid = NULL; - } - - if (cvm::n_histo_biases > 0) - cvm::n_histo_biases -= 1; -} - -/// Update the grid -cvm::real colvarbias_histogram::update() -{ - - if (cvm::debug()) { - cvm::log("Updating histogram bias " + this->name); - } - - // At the first timestep, we need to assign out_name since - // output_prefix is unset during the constructor - - if (cvm::step_relative() == 0) { - out_name = cvm::output_prefix + "." + this->name + ".dat"; - cvm::log("Histogram " + this->name + " will be written to file \"" + out_name + "\""); - } - - - bin.assign(colvars.size(), 0); - - { - // update indices for all scalar values - size_t i; - for (i = 0; i < colvars.size(); i++) { - if (colvars[i]->value().type() == colvarvalue::type_scalar) { - bin[i] = grid->value_to_bin_scalar(colvars[i]->value(), i); - } - } - } - - if (colvar_array_size > 1) { - // update indices for all vector/array values - size_t iv, i; - for (iv = 0; iv < colvar_array_size; iv++) { - for (i = 0; i < colvars.size(); i++) { - if (colvars[i]->value().type() == colvarvalue::type_vector) { - bin[i] = grid->value_to_bin_scalar(colvars[i]->value().vector1d_value[iv], i); - } - } - if (grid->index_ok(bin)) { - // Only within bounds of the grid... - grid->incr_count(bin); - } - } - } else { - if (grid->index_ok(bin)) { - // Only within bounds of the grid... - grid->incr_count(bin); - } - } - - if (output_freq && (cvm::step_absolute() % output_freq) == 0) { - if (cvm::debug()) cvm::log("Histogram bias trying to write grid to disk"); - - grid_os.open(out_name.c_str()); - if (!grid_os.is_open()) cvm::error("Error opening histogram file " + out_name + " for writing"); - grid->write_multicol(grid_os); - grid_os.close(); - } - - return 0.0; // no bias energy for histogram -} - - -std::istream & colvarbias_histogram::read_restart(std::istream& is) -{ - size_t const start_pos = is.tellg(); - - cvm::log("Restarting collective variable histogram \""+ - this->name+"\".\n"); - std::string key, brace, conf; - - if ( !(is >> key) || !(key == "histogram") || - !(is >> brace) || !(brace == "{") || - !(is >> colvarparse::read_block("configuration", conf)) ) { - cvm::log("Error: in reading restart configuration for histogram \""+ - this->name+"\" at position "+ - cvm::to_str(is.tellg())+" in stream.\n"); - is.clear(); - is.seekg(start_pos, std::ios::beg); - is.setstate(std::ios::failbit); - return is; - } - - int id = -1; - std::string name = ""; - if ( (colvarparse::get_keyval(conf, "name", name, std::string(""), colvarparse::parse_silent)) && - (name != this->name) ) - cvm::error("Error: in the restart file, the " - "\"histogram\" block has a wrong name: different system?\n"); - if ( (id == -1) && (name == "") ) { - cvm::error("Error: \"histogram\" block in the restart file " - "has no name.\n"); - } - - if ( !(is >> key) || !(key == "grid")) { - cvm::error("Error: in reading restart configuration for histogram \""+ - this->name+"\" at position "+ - cvm::to_str(is.tellg())+" in stream.\n"); - is.clear(); - is.seekg(start_pos, std::ios::beg); - is.setstate(std::ios::failbit); - return is; - } - if (! grid->read_raw(is)) { - is.clear(); - is.seekg(start_pos, std::ios::beg); - is.setstate(std::ios::failbit); - return is; - } - - is >> brace; - if (brace != "}") { - cvm::error("Error: corrupt restart information for ABF bias \""+ - this->name+"\": no matching brace at position "+ - cvm::to_str(is.tellg())+" in the restart file.\n"); - is.setstate(std::ios::failbit); - } - return is; -} - -std::ostream & colvarbias_histogram::write_restart(std::ostream& os) -{ - os << "histogram {\n" - << " configuration {\n" - << " name " << this->name << "\n"; - os << " }\n"; - - os << "grid\n"; - grid->write_raw(os, 8); - - os << "}\n\n"; - - return os; -} diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index c1e3a1fb31..eb02d1f55e 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -1,7 +1,4 @@ // -*- c++ -*- -/************************************************************************ - * Headers for the ABF and histogram biases * - ************************************************************************/ #ifndef COLVARBIAS_ABF_H #define COLVARBIAS_ABF_H @@ -40,7 +37,7 @@ private: bool hide_Jacobian; size_t full_samples; size_t min_samples; - /// frequency for updating output files (default: same as restartFreq?) + /// frequency for updating output files int output_freq; /// Write combined files with a history of all output data? bool b_history_files; @@ -90,34 +87,5 @@ private: std::ostream& write_restart(std::ostream&); }; - -/// Histogram "bias" (does as the name says) -class colvarbias_histogram : public colvarbias { - -public: - - colvarbias_histogram(std::string const &conf, char const *key); - ~colvarbias_histogram(); - - cvm::real update(); - -protected: - - /// n-dim histogram - colvar_grid_count *grid; - std::vector bin; - std::string out_name; - - int output_freq; - - /// If one or more of the variables are \link type_vector \endlink, treat them as arrays of this length - size_t colvar_array_size; - - void write_grid(); - cvm::ofstream grid_os; /// Stream for writing grid to disk - - std::istream& read_restart(std::istream&); - std::ostream& write_restart(std::ostream&); -}; - #endif + diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp new file mode 100644 index 0000000000..29f3c9bd9f --- /dev/null +++ b/lib/colvars/colvarbias_histogram.cpp @@ -0,0 +1,226 @@ +/// -*- c++ -*- + +#include "colvarmodule.h" +#include "colvar.h" +#include "colvarbias_histogram.h" + +/// Histogram "bias" constructor + +colvarbias_histogram::colvarbias_histogram(std::string const &conf, char const *key) + : colvarbias(conf, key), + grid(NULL), out_name("") +{ + get_keyval(conf, "outputFile", out_name, std::string("")); + get_keyval(conf, "outputFreq", output_freq, cvm::restart_out_freq); + /// with VMD, this may not be an error + // if ( output_freq == 0 ) { + // cvm::error("User required histogram with zero output frequency"); + // } + + colvar_array_size = 0; + { + size_t i; + bool colvar_array = false; + get_keyval(conf, "gatherVectorColvars", colvar_array, colvar_array); + + if (colvar_array) { + for (i = 0; i < colvars.size(); i++) { // should be all vector + if (colvars[i]->value().type() != colvarvalue::type_vector) { + cvm::error("Error: used gatherVectorColvars with non-vector colvar.\n", INPUT_ERROR); + return; + } + if (i == 0) { + colvar_array_size = colvars[i]->value().size(); + if (colvar_array_size < 1) { + cvm::error("Error: vector variable has dimension less than one.\n", INPUT_ERROR); + return; + } + } else { + if (colvar_array_size != colvars[i]->value().size()) { + cvm::error("Error: trying to combine vector colvars of different lengths.\n", INPUT_ERROR); + return; + } + } + } + } else { + for (i = 0; i < colvars.size(); i++) { // should be all scalar + if (colvars[i]->value().type() != colvarvalue::type_scalar) { + cvm::error("Error: only scalar colvars are supported when gatherVectorColvars is off.\n", INPUT_ERROR); + return; + } + } + } + } + + if (colvar_array_size > 0) { + weights.assign(colvar_array_size, 1.0); + get_keyval(conf, "weights", weights, weights, colvarparse::parse_silent); + } + + grid = new colvar_grid_scalar(); + + { + std::string grid_conf; + if (key_lookup(conf, "grid", grid_conf)) { + grid->parse_params(grid_conf); + } else { + grid->init_from_colvars(colvars); + } + } + + cvm::log("Finished histogram setup.\n"); +} + +/// Destructor +colvarbias_histogram::~colvarbias_histogram() +{ + if (grid_os.is_open()) + grid_os.close(); + + if (grid) { + delete grid; + grid = NULL; + } + + if (cvm::n_histo_biases > 0) + cvm::n_histo_biases -= 1; +} + +/// Update the grid +cvm::real colvarbias_histogram::update() +{ + if (cvm::debug()) { + cvm::log("Updating histogram bias " + this->name); + } + + // assign a valid bin size + bin.assign(colvars.size(), 0); + + if (out_name.size() == 0) { + // At the first timestep, we need to assign out_name since + // output_prefix is unset during the constructor + if (cvm::step_relative() == 0) { + out_name = cvm::output_prefix + "." + this->name + ".dat"; + cvm::log("Histogram " + this->name + " will be written to file \"" + out_name + "\""); + } + } + + if (colvar_array_size == 0) { + // update indices for scalar values + size_t i; + for (i = 0; i < colvars.size(); i++) { + bin[i] = grid->value_to_bin_scalar(colvars[i]->value(), i); + } + + if (grid->index_ok(bin)) { + grid->acc_value(bin, 1.0); + } + } else { + // update indices for vector/array values + size_t iv, i; + for (iv = 0; iv < colvar_array_size; iv++) { + for (i = 0; i < colvars.size(); i++) { + bin[i] = grid->value_to_bin_scalar(colvars[i]->value().vector1d_value[iv], i); + } + + if (grid->index_ok(bin)) { + grid->acc_value(bin, weights[iv]); + } + } + } + + if (output_freq && (cvm::step_absolute() % output_freq) == 0) { + write_output_files(); + } + return 0.0; // no bias energy for histogram +} + + +int colvarbias_histogram::write_output_files() +{ + if (out_name.size()) { + cvm::log("Writing the histogram file \""+out_name+"\".\n"); + + grid_os.open(out_name.c_str()); + if (!grid_os.is_open()) { + cvm::error("Error opening histogram file " + out_name + " for writing"); + } + // TODO add return code here + grid->write_multicol(grid_os); + grid_os.close(); + } + return COLVARS_OK; +} + + +std::istream & colvarbias_histogram::read_restart(std::istream& is) +{ + size_t const start_pos = is.tellg(); + + cvm::log("Restarting collective variable histogram \""+ + this->name+"\".\n"); + std::string key, brace, conf; + + if ( !(is >> key) || !(key == "histogram") || + !(is >> brace) || !(brace == "{") || + !(is >> colvarparse::read_block("configuration", conf)) ) { + cvm::log("Error: in reading restart configuration for histogram \""+ + this->name+"\" at position "+ + cvm::to_str(is.tellg())+" in stream.\n"); + is.clear(); + is.seekg(start_pos, std::ios::beg); + is.setstate(std::ios::failbit); + return is; + } + + int id = -1; + std::string name = ""; + if ( (colvarparse::get_keyval(conf, "name", name, std::string(""), colvarparse::parse_silent)) && + (name != this->name) ) + cvm::error("Error: in the restart file, the " + "\"histogram\" block has a wrong name: different system?\n"); + if ( (id == -1) && (name == "") ) { + cvm::error("Error: \"histogram\" block in the restart file " + "has no name.\n"); + } + + if ( !(is >> key) || !(key == "grid")) { + cvm::error("Error: in reading restart configuration for histogram \""+ + this->name+"\" at position "+ + cvm::to_str(is.tellg())+" in stream.\n"); + is.clear(); + is.seekg(start_pos, std::ios::beg); + is.setstate(std::ios::failbit); + return is; + } + if (! grid->read_raw(is)) { + is.clear(); + is.seekg(start_pos, std::ios::beg); + is.setstate(std::ios::failbit); + return is; + } + + is >> brace; + if (brace != "}") { + cvm::error("Error: corrupt restart information for ABF bias \""+ + this->name+"\": no matching brace at position "+ + cvm::to_str(is.tellg())+" in the restart file.\n"); + is.setstate(std::ios::failbit); + } + return is; +} + +std::ostream & colvarbias_histogram::write_restart(std::ostream& os) +{ + os << "histogram {\n" + << " configuration {\n" + << " name " << this->name << "\n"; + os << " }\n"; + + os << "grid\n"; + grid->write_raw(os, 8); + + os << "}\n\n"; + + return os; +} diff --git a/lib/colvars/colvarbias_histogram.h b/lib/colvars/colvarbias_histogram.h new file mode 100644 index 0000000000..b9d07151d3 --- /dev/null +++ b/lib/colvars/colvarbias_histogram.h @@ -0,0 +1,47 @@ +// -*- c++ -*- + +#ifndef COLVARBIAS_HISTOGRAM_H +#define COLVARBIAS_HISTOGRAM_H + +#include +#include +#include +#include + +#include "colvarbias.h" +#include "colvargrid.h" + +/// Histogram "bias" (does as the name says) +class colvarbias_histogram : public colvarbias { + +public: + + colvarbias_histogram(std::string const &conf, char const *key); + ~colvarbias_histogram(); + + cvm::real update(); + + int write_output_files(); + +protected: + + /// n-dim histogram + colvar_grid_scalar *grid; + std::vector bin; + std::string out_name; + + size_t output_freq; + + /// If one or more of the variables are \link type_vector \endlink, treat them as arrays of this length + size_t colvar_array_size; + /// If colvar_array_size is larger than 1, weigh each one by this number before accumulating the histogram + std::vector weights; + + void write_grid(); + cvm::ofstream grid_os; /// Stream for writing grid to disk + + std::istream& read_restart(std::istream&); + std::ostream& write_restart(std::ostream&); +}; + +#endif diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index 0276359f0d..1fa804d303 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -44,7 +44,7 @@ colvarbias_meta::colvarbias_meta(std::string const &conf, char const *key) get_keyval(conf, "hillWeight", hill_weight, 0.01); if (hill_weight == 0.0) cvm::log("Warning: hillWeight has been set to zero, " - "this bias will have no effect.\n"); + "this bias will have no effect.\n"); get_keyval(conf, "newHillFrequency", new_hill_freq, 1000); @@ -71,9 +71,9 @@ colvarbias_meta::colvarbias_meta(std::string const &conf, char const *key) if (colvars[i]->expand_boundaries) { expand_grids = true; cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": Will expand grids when the colvar \""+ - colvars[i]->name+"\" approaches its boundaries.\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": Will expand grids when the colvar \""+ + colvars[i]->name+"\" approaches its boundaries.\n"); } } @@ -103,9 +103,9 @@ colvarbias_meta::colvarbias_meta(std::string const &conf, char const *key) if (expand_grids) cvm::fatal_error("Error: expandBoundaries is not supported when " - "using more than one replicas; please allocate " - "wide enough boundaries for each colvar" - "ahead of time.\n"); + "using more than one replicas; please allocate " + "wide enough boundaries for each colvar" + "ahead of time.\n"); if (get_keyval(conf, "dumpPartialFreeEnergyFile", dump_replica_fes, false)) { if (dump_replica_fes && (! dump_fes)) { @@ -115,118 +115,26 @@ colvarbias_meta::colvarbias_meta(std::string const &conf, char const *key) get_keyval(conf, "replicaID", replica_id, std::string("")); if (!replica_id.size()) - cvm::fatal_error("Error: replicaID must be defined " - "when using more than one replica.\n"); + cvm::error("Error: replicaID must be defined " + "when using more than one replica.\n", INPUT_ERROR); get_keyval(conf, "replicasRegistry", - replicas_registry_file, - (this->name+".replicas.registry.txt")); + replicas_registry_file, + (this->name+".replicas.registry.txt")); get_keyval(conf, "replicaUpdateFrequency", - replica_update_freq, new_hill_freq); + replica_update_freq, new_hill_freq); if (keep_hills) cvm::log("Warning: in metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": keepHills with more than one replica can lead to a very " - "large amount input/output and slow down your calculations. " - "Please consider disabling it.\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": keepHills with more than one replica can lead to a very " + "large amount of input/output and slow down your calculations. " + "Please consider disabling it.\n"); - - { - // TODO: one may want to specify the path manually for intricated filesystems? - char *pwd = new char[3001]; - if (GETCWD(pwd, 3000) == NULL) - cvm::fatal_error("Error: cannot get the path of the current working directory.\n"); - replica_list_file = - (std::string(pwd)+std::string(PATHSEP)+ - this->name+"."+replica_id+".files.txt"); - // replica_hills_file and replica_state_file are those written - // by the current replica; within the mirror biases, they are - // those by another replica - replica_hills_file = - (std::string(pwd)+std::string(PATHSEP)+ - cvm::output_prefix+".colvars."+this->name+"."+replica_id+".hills"); - replica_state_file = - (std::string(pwd)+std::string(PATHSEP)+ - cvm::output_prefix+".colvars."+this->name+"."+replica_id+".state"); - delete[] pwd; - } - - // now register this replica - - // first check that it isn't already there - bool registered_replica = false; - std::ifstream reg_is(replicas_registry_file.c_str()); - if (reg_is.good()) { // the file may not be there yet - std::string existing_replica(""); - std::string existing_replica_file(""); - while ((reg_is >> existing_replica) && existing_replica.size() && - (reg_is >> existing_replica_file) && existing_replica_file.size()) { - if (existing_replica == replica_id) { - // this replica was already registered - replica_list_file = existing_replica_file; - reg_is.close(); - registered_replica = true; - break; - } - } - reg_is.close(); - } - - // if this replica was not included yet, we should generate a - // new record for it: but first, we write this replica's files, - // for the others to read - - // open the "hills" buffer file - replica_hills_os.open(replica_hills_file.c_str()); - if (!replica_hills_os.good()) - cvm::fatal_error("Error: in opening file \""+ - replica_hills_file+"\" for writing.\n"); - replica_hills_os.setf(std::ios::scientific, std::ios::floatfield); - - // write the state file (so that there is always one available) - write_replica_state_file(); - // schedule to read the state files of the other replicas - for (size_t ir = 0; ir < replicas.size(); ir++) { - (replicas[ir])->replica_state_file_in_sync = false; - } - - // if we're running without grids, use a growing list of "hills" files - // otherwise, just one state file and one "hills" file as buffer - std::ofstream list_os(replica_list_file.c_str(), - (use_grids ? std::ios::trunc : std::ios::app)); - if (! list_os.good()) - cvm::fatal_error("Error: in opening file \""+ - replica_list_file+"\" for writing.\n"); - list_os << "stateFile " << replica_state_file << "\n"; - list_os << "hillsFile " << replica_hills_file << "\n"; - list_os.close(); - - // finally, if add a new record for this replica to the registry - if (! registered_replica) { - std::ofstream reg_os(replicas_registry_file.c_str(), std::ios::app); - if (! reg_os.good()) - cvm::fatal_error("Error: in opening file \""+ - replicas_registry_file+"\" for writing.\n"); - reg_os << replica_id << " " << replica_list_file << "\n"; - reg_os.close(); - } } get_keyval(conf, "writeHillsTrajectory", b_hills_traj, false); - if (b_hills_traj) { - std::string const traj_file_name(cvm::output_prefix+ - ".colvars."+this->name+ - ( (comm != single_replica) ? - ("."+replica_id) : - ("") )+ - ".hills.traj"); - hills_traj_os.open(traj_file_name.c_str()); - if (!hills_traj_os.good()) - cvm::fatal_error("Error: in opening hills output file \"" + - traj_file_name + "\".\n"); - } // for well-tempered metadynamics get_keyval(conf, "wellTempered", well_tempered, false); @@ -241,7 +149,7 @@ colvarbias_meta::colvarbias_meta(std::string const &conf, char const *key) if (cvm::debug()) cvm::log("Done initializing the metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); save_delimiters = false; } @@ -259,10 +167,10 @@ colvarbias_meta::~colvarbias_meta() hills_energy_gradients = NULL; } - if (replica_hills_os.good()) + if (replica_hills_os.is_open()) replica_hills_os.close(); - if (hills_traj_os.good()) + if (hills_traj_os.is_open()) hills_traj_os.close(); if (cvm::n_meta_biases > 0) @@ -298,7 +206,7 @@ colvarbias_meta::create_hill(colvarbias_meta::hill const &h) } // output to trajectory (if specified) - if (hills_traj_os.good()) { + if (hills_traj_os.is_open()) { hills_traj_os << (hills.back()).output_traj(); if (cvm::debug()) { hills_traj_os.flush(); @@ -315,11 +223,11 @@ colvarbias_meta::delete_hill(hill_iter &h) { if (cvm::debug()) { cvm::log("Deleting hill from the metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ", with step number "+ - cvm::to_str(h->it)+(h->replica.size() ? - ", replica id \""+h->replica : - "")+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ", with step number "+ + cvm::to_str(h->it)+(h->replica.size() ? + ", replica id \""+h->replica : + "")+".\n"); } if (use_grids && !hills_off_grid.empty()) { @@ -332,7 +240,7 @@ colvarbias_meta::delete_hill(hill_iter &h) } } - if (hills_traj_os.good()) { + if (hills_traj_os.is_open()) { // output to the trajectory hills_traj_os << "# DELETED this hill: " << (hills.back()).output_traj() @@ -349,7 +257,7 @@ cvm::real colvarbias_meta::update() { if (cvm::debug()) cvm::log("Updating the metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); if (use_grids) { @@ -360,9 +268,9 @@ cvm::real colvarbias_meta::update() // first of all, expand the grids, if specified if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": current coordinates on the grid: "+ - cvm::to_str(curr_bin)+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": current coordinates on the grid: "+ + cvm::to_str(curr_bin)+".\n"); bool changed_grids = false; int const min_buffer = @@ -393,10 +301,10 @@ cvm::real colvarbias_meta::update() changed_lb = true; cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": new lower boundary for colvar \""+ - colvars[i]->name+"\", at "+ - cvm::to_str(new_lower_boundaries[i])+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": new lower boundary for colvar \""+ + colvars[i]->name+"\", at "+ + cvm::to_str(new_lower_boundaries[i])+".\n"); } if (!colvars[i]->hard_upper_boundary) @@ -407,10 +315,10 @@ cvm::real colvarbias_meta::update() changed_ub = true; cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": new upper boundary for colvar \""+ - colvars[i]->name+"\", at "+ - cvm::to_str(new_upper_boundaries[i])+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": new upper boundary for colvar \""+ + colvars[i]->name+"\", at "+ + cvm::to_str(new_upper_boundaries[i])+".\n"); } if (changed_lb || changed_ub) @@ -447,7 +355,7 @@ cvm::real colvarbias_meta::update() curr_bin = hills_energy->get_colvars_index(); if (cvm::debug()) cvm::log("Coordinates on the new grid: "+ - cvm::to_str(curr_bin)+".\n"); + cvm::to_str(curr_bin)+".\n"); } } } @@ -457,8 +365,8 @@ cvm::real colvarbias_meta::update() if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": adding a new hill at step "+cvm::to_str(cvm::step_absolute())+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": adding a new hill at step "+cvm::to_str(cvm::step_absolute())+".\n"); switch (comm) { @@ -492,12 +400,12 @@ cvm::real colvarbias_meta::update() } else { create_hill(hill(hill_weight, colvars, hill_width, replica_id)); } - if (replica_hills_os.good()) { + if (replica_hills_os.is_open()) { replica_hills_os << hills.back(); } else { cvm::fatal_error("Error: in metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - " while writing hills for the other replicas.\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + " while writing hills for the other replicas.\n"); } break; } @@ -510,7 +418,8 @@ cvm::real colvarbias_meta::update() if ((cvm::step_absolute() % replica_update_freq) == 0) { update_replicas_registry(); // empty the output buffer - replica_hills_os.flush(); + if (replica_hills_os.is_open()) + replica_hills_os.flush(); read_replica_files(); } @@ -536,7 +445,7 @@ cvm::real colvarbias_meta::update() if ((cvm::step_absolute() % grids_freq) == 0) { // map the most recent gaussians to the grids project_hills(new_hills_begin, hills.end(), - hills_energy, hills_energy_gradients); + hills_energy, hills_energy_gradients); new_hills_begin = hills.end(); // TODO: we may want to condense all into one replicas array, @@ -544,9 +453,9 @@ cvm::real colvarbias_meta::update() if (comm == multiple_replicas) { for (size_t ir = 0; ir < replicas.size(); ir++) { replicas[ir]->project_hills(replicas[ir]->new_hills_begin, - replicas[ir]->hills.end(), - replicas[ir]->hills_energy, - replicas[ir]->hills_energy_gradients); + replicas[ir]->hills.end(), + replicas[ir]->hills_energy, + replicas[ir]->hills_energy_gradients); replicas[ir]->new_hills_begin = replicas[ir]->hills.end(); } } @@ -555,9 +464,9 @@ cvm::real colvarbias_meta::update() std::vector curr_bin = hills_energy->get_colvars_index(); if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": current coordinates on the grid: "+ - cvm::to_str(curr_bin)+".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": current coordinates on the grid: "+ + cvm::to_str(curr_bin)+".\n"); if (hills_energy->index_ok(curr_bin)) { @@ -590,13 +499,13 @@ cvm::real colvarbias_meta::update() if (comm == multiple_replicas) for (size_t ir = 0; ir < replicas.size(); ir++) { calc_hills(replicas[ir]->hills_off_grid.begin(), - replicas[ir]->hills_off_grid.end(), - bias_energy); + replicas[ir]->hills_off_grid.end(), + bias_energy); for (size_t ic = 0; ic < colvars.size(); ic++) { calc_hills_force(ic, - replicas[ir]->hills_off_grid.begin(), - replicas[ir]->hills_off_grid.end(), - colvar_forces); + replicas[ir]->hills_off_grid.begin(), + replicas[ir]->hills_off_grid.end(), + colvar_forces); } } } @@ -612,27 +521,27 @@ cvm::real colvarbias_meta::update() if (cvm::debug()) cvm::log("Hills energy = "+cvm::to_str(bias_energy)+ - ", hills forces = "+cvm::to_str(colvar_forces)+".\n"); + ", hills forces = "+cvm::to_str(colvar_forces)+".\n"); if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": adding the forces from the other replicas.\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": adding the forces from the other replicas.\n"); if (comm == multiple_replicas) for (size_t ir = 0; ir < replicas.size(); ir++) { calc_hills(replicas[ir]->new_hills_begin, - replicas[ir]->hills.end(), - bias_energy); + replicas[ir]->hills.end(), + bias_energy); for (size_t ic = 0; ic < colvars.size(); ic++) { calc_hills_force(ic, - replicas[ir]->new_hills_begin, - replicas[ir]->hills.end(), - colvar_forces); + replicas[ir]->new_hills_begin, + replicas[ir]->hills.end(), + colvar_forces); } if (cvm::debug()) cvm::log("Hills energy = "+cvm::to_str(bias_energy)+ - ", hills forces = "+cvm::to_str(colvar_forces)+".\n"); + ", hills forces = "+cvm::to_str(colvar_forces)+".\n"); } return bias_energy; @@ -640,9 +549,9 @@ cvm::real colvarbias_meta::update() void colvarbias_meta::calc_hills(colvarbias_meta::hill_iter h_first, - colvarbias_meta::hill_iter h_last, - cvm::real &energy, - std::vector const &colvar_values) + colvarbias_meta::hill_iter h_last, + cvm::real &energy, + std::vector const &colvar_values) { std::vector curr_values(colvars.size()); for (size_t i = 0; i < colvars.size(); i++) { @@ -683,10 +592,10 @@ void colvarbias_meta::calc_hills(colvarbias_meta::hill_iter h_first, void colvarbias_meta::calc_hills_force(size_t const &i, - colvarbias_meta::hill_iter h_first, - colvarbias_meta::hill_iter h_last, - std::vector &forces, - std::vector const &values) + colvarbias_meta::hill_iter h_first, + colvarbias_meta::hill_iter h_last, + std::vector &forces, + std::vector const &values) { // Retrieve the value of the colvar colvarvalue const x(values.size() ? values[i] : colvars[i]->value()); @@ -758,15 +667,15 @@ void colvarbias_meta::calc_hills_force(size_t const &i, // ********************************************************************** void colvarbias_meta::project_hills(colvarbias_meta::hill_iter h_first, - colvarbias_meta::hill_iter h_last, - colvar_grid_scalar *he, - colvar_grid_gradient *hg, - bool print_progress) + colvarbias_meta::hill_iter h_last, + colvar_grid_scalar *he, + colvar_grid_gradient *hg, + bool print_progress) { if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": projecting hills.\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": projecting hills.\n"); // TODO: improve it by looping over a small subgrid instead of the whole grid @@ -862,8 +771,8 @@ void colvarbias_meta::project_hills(colvarbias_meta::hill_iter h_first, void colvarbias_meta::recount_hills_off_grid(colvarbias_meta::hill_iter h_first, - colvarbias_meta::hill_iter h_last, - colvar_grid_scalar *he) + colvarbias_meta::hill_iter h_last, + colvar_grid_scalar *he) { hills_off_grid.clear(); @@ -886,20 +795,20 @@ void colvarbias_meta::update_replicas_registry() { if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ": updating the list of replicas, currently containing "+ - cvm::to_str(replicas.size())+" elements.\n"); + ": updating the list of replicas, currently containing "+ + cvm::to_str(replicas.size())+" elements.\n"); { // copy the whole file into a string for convenience std::string line(""); std::ifstream reg_file(replicas_registry_file.c_str()); - if (reg_file.good()) { + if (reg_file.is_open()) { replicas_registry.clear(); while (colvarparse::getline_nocomments(reg_file, line)) replicas_registry.append(line+"\n"); } else { - cvm::fatal_error("Error: failed to open file \""+replicas_registry_file+ - "\" for reading.\n"); + cvm::error("Error: failed to open file \""+replicas_registry_file+ + "\" for reading.\n", FILE_ERROR); } } @@ -916,9 +825,9 @@ void colvarbias_meta::update_replicas_registry() // this is the record for this same replica, skip it if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": skipping this replica's own record: \""+ - new_replica+"\", \""+new_replica_file+"\"\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": skipping this replica's own record: \""+ + new_replica+"\", \""+new_replica_file+"\"\n"); new_replica_file.clear(); new_replica.clear(); continue; @@ -930,9 +839,9 @@ void colvarbias_meta::update_replicas_registry() // this replica was already added if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": skipping a replica already loaded, \""+ - (replicas[ir])->replica_id+"\".\n"); + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": skipping a replica already loaded, \""+ + (replicas[ir])->replica_id+"\".\n"); already_loaded = true; break; } @@ -941,7 +850,7 @@ void colvarbias_meta::update_replicas_registry() if (!already_loaded) { // add this replica to the registry cvm::log("Metadynamics bias \""+this->name+"\""+ - ": accessing replica \""+new_replica+"\".\n"); + ": accessing replica \""+new_replica+"\".\n"); replicas.push_back(new colvarbias_meta()); (replicas.back())->replica_id = new_replica; (replicas.back())->replica_list_file = new_replica_file; @@ -968,15 +877,15 @@ void colvarbias_meta::update_replicas_registry() } } else { cvm::fatal_error("Error: cannot read the replicas registry file \""+ - replicas_registry+"\".\n"); + replicas_registry+"\".\n"); } // now (re)read the list file of each replica for (size_t ir = 0; ir < replicas.size(); ir++) { if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ": reading the list file for replica \""+ - (replicas[ir])->replica_id+"\".\n"); + ": reading the list file for replica \""+ + (replicas[ir])->replica_id+"\".\n"); std::ifstream list_is((replicas[ir])->replica_list_file.c_str()); std::string key; @@ -988,17 +897,17 @@ void colvarbias_meta::update_replicas_registry() !(key == std::string("hillsFile")) || !(list_is >> new_hills_file)) { cvm::log("Metadynamics bias \""+this->name+"\""+ - ": failed to read the file \""+ - (replicas[ir])->replica_list_file+"\": will try again after "+ - cvm::to_str(replica_update_freq)+" steps.\n"); + ": failed to read the file \""+ + (replicas[ir])->replica_list_file+"\": will try again after "+ + cvm::to_str(replica_update_freq)+" steps.\n"); (replicas[ir])->update_status++; } else { (replicas[ir])->update_status = 0; if (new_state_file != (replicas[ir])->replica_state_file) { cvm::log("Metadynamics bias \""+this->name+"\""+ - ": replica \""+(replicas[ir])->replica_id+ - "\" has supplied a new state file, \""+new_state_file+ - "\".\n"); + ": replica \""+(replicas[ir])->replica_id+ + "\" has supplied a new state file, \""+new_state_file+ + "\".\n"); (replicas[ir])->replica_state_file_in_sync = false; (replicas[ir])->replica_state_file = new_state_file; (replicas[ir])->replica_hills_file = new_hills_file; @@ -1009,7 +918,7 @@ void colvarbias_meta::update_replicas_registry() if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\": the list of replicas contains "+ - cvm::to_str(replicas.size())+" elements.\n"); + cvm::to_str(replicas.size())+" elements.\n"); } @@ -1027,15 +936,15 @@ void colvarbias_meta::read_replica_files() (! (replicas[ir])->replica_state_file_in_sync) ) { cvm::log("Metadynamics bias \""+this->name+"\""+ - ": reading the state of replica \""+ - (replicas[ir])->replica_id+"\" from file \""+ - (replicas[ir])->replica_state_file+"\".\n"); + ": reading the state of replica \""+ + (replicas[ir])->replica_id+"\" from file \""+ + (replicas[ir])->replica_state_file+"\".\n"); std::ifstream is((replicas[ir])->replica_state_file.c_str()); if (! (replicas[ir])->read_restart(is)) { cvm::log("Reading from file \""+(replicas[ir])->replica_state_file+ - "\" failed or incomplete: will try again in "+ - cvm::to_str(replica_update_freq)+" steps.\n"); + "\" failed or incomplete: will try again in "+ + cvm::to_str(replica_update_freq)+" steps.\n"); } else { // state file has been read successfully (replicas[ir])->replica_state_file_in_sync = true; @@ -1049,19 +958,19 @@ void colvarbias_meta::read_replica_files() if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ": checking for new hills from replica \""+ - (replicas[ir])->replica_id+"\" in the file \""+ - (replicas[ir])->replica_hills_file+"\".\n"); + ": checking for new hills from replica \""+ + (replicas[ir])->replica_id+"\" in the file \""+ + (replicas[ir])->replica_hills_file+"\".\n"); // read hills from the other replicas' files; for each file, resume // the position recorded previously std::ifstream is((replicas[ir])->replica_hills_file.c_str()); - if (is.good()) { + if (is.is_open()) { // try to resume the previous position is.seekg((replicas[ir])->replica_hills_file_pos, std::ios::beg); - if (!is.good()){ + if (!is.is_open()){ // if fail (the file may have been overwritten), reset this // position is.clear(); @@ -1073,26 +982,26 @@ void colvarbias_meta::read_replica_files() // and record the failure (replicas[ir])->update_status++; cvm::log("Failed to read the file \""+(replicas[ir])->replica_hills_file+ - "\" at the previous position: will try again in "+ - cvm::to_str(replica_update_freq)+" steps.\n"); + "\" at the previous position: will try again in "+ + cvm::to_str(replica_update_freq)+" steps.\n"); } else { while ((replicas[ir])->read_hill(is)) { // if (cvm::debug()) - cvm::log("Metadynamics bias \""+this->name+"\""+ - ": received a hill from replica \""+ - (replicas[ir])->replica_id+ - "\" at step "+ - cvm::to_str(((replicas[ir])->hills.back()).it)+".\n"); + cvm::log("Metadynamics bias \""+this->name+"\""+ + ": received a hill from replica \""+ + (replicas[ir])->replica_id+ + "\" at step "+ + cvm::to_str(((replicas[ir])->hills.back()).it)+".\n"); } is.clear(); // store the position for the next read (replicas[ir])->replica_hills_file_pos = is.tellg(); if (cvm::debug()) cvm::log("Metadynamics bias \""+this->name+"\""+ - ": stopped reading file \""+(replicas[ir])->replica_hills_file+ - "\" at position "+ - cvm::to_str((replicas[ir])->replica_hills_file_pos)+".\n"); + ": stopped reading file \""+(replicas[ir])->replica_hills_file+ + "\" at position "+ + cvm::to_str((replicas[ir])->replica_hills_file_pos)+".\n"); // test whether this is the end of the file is.seekg(0, std::ios::end); @@ -1105,8 +1014,8 @@ void colvarbias_meta::read_replica_files() } else { cvm::log("Failed to read the file \""+(replicas[ir])->replica_hills_file+ - "\": will try again in "+ - cvm::to_str(replica_update_freq)+" steps.\n"); + "\": will try again in "+ + cvm::to_str(replica_update_freq)+" steps.\n"); (replicas[ir])->update_status++; // cvm::fatal_error ("Error: cannot read from file \""+ // (replicas[ir])->replica_hills_file+"\".\n"); @@ -1118,11 +1027,11 @@ void colvarbias_meta::read_replica_files() if ((replicas[ir])->update_status > 3*n_flush) { // TODO: suspend the calculation? cvm::log("WARNING: in metadynamics bias \""+this->name+"\""+ - " failed to read completely the output of replica \""+ - (replicas[ir])->replica_id+ - "\" after more than "+ - cvm::to_str((replicas[ir])->update_status * replica_update_freq)+ - " steps. Ensure that it is still running.\n"); + " failed to read completely the output of replica \""+ + (replicas[ir])->replica_id+ + "\" after more than "+ + cvm::to_str((replicas[ir])->update_status * replica_update_freq)+ + " steps. Ensure that it is still running.\n"); } } } @@ -1141,7 +1050,7 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) // if using a multiple replicas scheme, output messages // are printed before and after calling this function cvm::log("Restarting metadynamics bias \""+this->name+"\""+ - ".\n"); + ".\n"); } std::string key, brace, conf; if ( !(is >> key) || !(key == "metadynamics") || @@ -1150,11 +1059,11 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) if (comm == single_replica) cvm::log("Error: in reading restart configuration for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - (replica_state_file_in_sync ? ("at position "+ - cvm::to_str(start_pos)+ - " in the state file") : "")+".\n"); + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + (replica_state_file_in_sync ? ("at position "+ + cvm::to_str(start_pos)+ + " in the state file") : "")+".\n"); is.clear(); is.seekg(start_pos, std::ios::beg); is.setstate(std::ios::failbit); @@ -1163,26 +1072,26 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) std::string name = ""; if ( colvarparse::get_keyval(conf, "name", name, - std::string(""), colvarparse::parse_silent) && + std::string(""), colvarparse::parse_silent) && (name != this->name) ) cvm::fatal_error("Error: in the restart file, the " - "\"metadynamics\" block has a different name: different system?\n"); + "\"metadynamics\" block has a different name: different system?\n"); if (name.size() == 0) { cvm::fatal_error("Error: \"metadynamics\" block within the restart file " - "has no identifiers.\n"); + "has no identifiers.\n"); } if (comm != single_replica) { std::string replica = ""; if (colvarparse::get_keyval(conf, "replicaID", replica, - std::string(""), colvarparse::parse_silent) && + std::string(""), colvarparse::parse_silent) && (replica != this->replica_id)) cvm::fatal_error("Error: in the restart file, the " - "\"metadynamics\" block has a different replicaID: different system?\n"); + "\"metadynamics\" block has a different replicaID: different system?\n"); colvarparse::get_keyval(conf, "step", state_file_step, - cvm::step_absolute(), colvarparse::parse_silent); + cvm::step_absolute(), colvarparse::parse_silent); } bool grids_from_restart_file = use_grids; @@ -1206,8 +1115,8 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) if (has_data) { if (cvm::debug()) cvm::log("Backupping grids for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); hills_energy_backup = hills_energy; hills_energy_gradients_backup = hills_energy_gradients; hills_energy = new colvar_grid_scalar(colvars); @@ -1234,14 +1143,14 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) if (!rebin_grids) { if (hills_energy_backup == NULL) cvm::fatal_error("Error: couldn't read the free energy grid for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - "; if useGrids was off when the state file was written, " - "enable rebinGrids now to regenerate the grids.\n"); + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + "; if useGrids was off when the state file was written, " + "enable rebinGrids now to regenerate the grids.\n"); else { if (comm == single_replica) cvm::log("Error: couldn't read the free energy grid for metadynamics bias \""+ - this->name+"\".\n"); + this->name+"\".\n"); delete hills_energy; delete hills_energy_gradients; hills_energy = hills_energy_backup; @@ -1272,14 +1181,14 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) if (!rebin_grids) { if (hills_energy_backup == NULL) cvm::fatal_error("Error: couldn't read the free energy gradients grid for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - "; if useGrids was off when the state file was written, " - "enable rebinGrids now to regenerate the grids.\n"); + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + "; if useGrids was off when the state file was written, " + "enable rebinGrids now to regenerate the grids.\n"); else { if (comm == single_replica) cvm::log("Error: couldn't read the free energy gradients grid for metadynamics bias \""+ - this->name+"\".\n"); + this->name+"\".\n"); delete hills_energy; delete hills_energy_gradients; hills_energy = hills_energy_backup; @@ -1292,8 +1201,8 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) if (cvm::debug()) cvm::log("Successfully read new grids for bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+"\n"); + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+"\n"); if (hills_energy_backup != NULL) { // now that we have successfully updated the grids, delete the @@ -1315,16 +1224,16 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) while (read_hill(is)) { if (cvm::debug()) cvm::log("Read a previously saved hill under the " - "metadynamics bias \""+ - this->name+"\", created at step "+ - cvm::to_str((hills.back()).it)+".\n"); + "metadynamics bias \""+ + this->name+"\", created at step "+ + cvm::to_str((hills.back()).it)+".\n"); } is.clear(); new_hills_begin = hills.end(); if (grids_from_restart_file) { if (hills.size() > old_hills_size) cvm::log("Read "+cvm::to_str(hills.size())+ - " hills in addition to the grids.\n"); + " hills in addition to the grids.\n"); } else { if (!hills.empty()) cvm::log("Read "+cvm::to_str(hills.size())+" hills.\n"); @@ -1344,15 +1253,15 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) if (!grids_from_restart_file || (keep_hills && !hills.empty())) { // if there are hills, recompute the new grids from them cvm::log("Rebinning the energy and forces grids from "+ - cvm::to_str(hills.size())+" hills (this may take a while)...\n"); + cvm::to_str(hills.size())+" hills (this may take a while)...\n"); project_hills(hills.begin(), hills.end(), - new_hills_energy, new_hills_energy_gradients, true); + new_hills_energy, new_hills_energy_gradients, true); cvm::log("rebinning done.\n"); } else { // otherwise, use the grids in the restart file cvm::log("Rebinning the energy and forces grids " - "from the grids in the restart file.\n"); + "from the grids in the restart file.\n"); new_hills_energy->map_grid(*hills_energy); new_hills_energy_gradients->map_grid(*hills_energy_gradients); } @@ -1371,18 +1280,18 @@ std::istream & colvarbias_meta::read_restart(std::istream& is) if (use_grids) { if (!hills_off_grid.empty()) { cvm::log(cvm::to_str(hills_off_grid.size())+" hills are near the " - "grid boundaries: they will be computed analytically " - "and saved to the state files.\n"); + "grid boundaries: they will be computed analytically " + "and saved to the state files.\n"); } } is >> brace; if (brace != "}") { cvm::log("Incomplete restart information for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ - ": no closing brace at position "+ - cvm::to_str(is.tellg())+" in the file.\n"); + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+ + ": no closing brace at position "+ + cvm::to_str(is.tellg())+" in the file.\n"); is.setstate(std::ios::failbit); return is; } @@ -1424,8 +1333,8 @@ std::istream & colvarbias_meta::read_hill(std::istream &is) if (h_it <= state_file_step) { if (cvm::debug()) cvm::log("Skipping a hill older than the state file for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+"\n"); + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+"\n"); return is; } @@ -1449,16 +1358,16 @@ std::istream & colvarbias_meta::read_hill(std::istream &is) std::vector h_widths(colvars.size()); get_keyval(data, "widths", h_widths, - std::vector (colvars.size(), (std::sqrt(2.0 * PI) / 2.0)), - parse_silent); + std::vector (colvars.size(), (std::sqrt(2.0 * PI) / 2.0)), + parse_silent); std::string h_replica = ""; if (comm != single_replica) { get_keyval(data, "replicaID", h_replica, replica_id, parse_silent); if (h_replica != replica_id) cvm::fatal_error("Error: trying to read a hill created by replica \""+h_replica+ - "\" for replica \""+replica_id+ - "\"; did you swap output files?\n"); + "\" for replica \""+replica_id+ + "\"; did you swap output files?\n"); } hill_iter const hills_end = hills.end(); @@ -1490,6 +1399,111 @@ std::istream & colvarbias_meta::read_hill(std::istream &is) // output functions // ********************************************************************** + +int colvarbias_meta::setup_output() +{ + + if (comm == multiple_replicas) { + + // TODO: one may want to specify the path manually for intricated filesystems? + char *pwd = new char[3001]; + if (GETCWD(pwd, 3000) == NULL) + cvm::fatal_error("Error: cannot get the path of the current working directory.\n"); + replica_list_file = + (std::string(pwd)+std::string(PATHSEP)+ + this->name+"."+replica_id+".files.txt"); + // replica_hills_file and replica_state_file are those written + // by the current replica; within the mirror biases, they are + // those by another replica + replica_hills_file = + (std::string(pwd)+std::string(PATHSEP)+ + cvm::output_prefix+".colvars."+this->name+"."+replica_id+".hills"); + replica_state_file = + (std::string(pwd)+std::string(PATHSEP)+ + cvm::output_prefix+".colvars."+this->name+"."+replica_id+".state"); + delete[] pwd; + + // now register this replica + + // first check that it isn't already there + bool registered_replica = false; + std::ifstream reg_is(replicas_registry_file.c_str()); + if (reg_is.is_open()) { // the file may not be there yet + std::string existing_replica(""); + std::string existing_replica_file(""); + while ((reg_is >> existing_replica) && existing_replica.size() && + (reg_is >> existing_replica_file) && existing_replica_file.size()) { + if (existing_replica == replica_id) { + // this replica was already registered + replica_list_file = existing_replica_file; + reg_is.close(); + registered_replica = true; + break; + } + } + reg_is.close(); + } + + // if this replica was not included yet, we should generate a + // new record for it: but first, we write this replica's files, + // for the others to read + + // open the "hills" buffer file + if (!replica_hills_os.is_open()) { + cvm::backup_file(replica_hills_file.c_str()); + replica_hills_os.open(replica_hills_file.c_str()); + if (!replica_hills_os.is_open()) + cvm::error("Error: in opening file \""+ + replica_hills_file+"\" for writing.\n", FILE_ERROR); + replica_hills_os.setf(std::ios::scientific, std::ios::floatfield); + } + + // write the state file (so that there is always one available) + write_replica_state_file(); + // schedule to read the state files of the other replicas + for (size_t ir = 0; ir < replicas.size(); ir++) { + (replicas[ir])->replica_state_file_in_sync = false; + } + + // if we're running without grids, use a growing list of "hills" files + // otherwise, just one state file and one "hills" file as buffer + std::ofstream list_os(replica_list_file.c_str(), + (use_grids ? std::ios::trunc : std::ios::app)); + if (! list_os.is_open()) + cvm::fatal_error("Error: in opening file \""+ + replica_list_file+"\" for writing.\n"); + list_os << "stateFile " << replica_state_file << "\n"; + list_os << "hillsFile " << replica_hills_file << "\n"; + list_os.close(); + + // finally, if add a new record for this replica to the registry + if (! registered_replica) { + std::ofstream reg_os(replicas_registry_file.c_str(), std::ios::app); + if (! reg_os.is_open()) + cvm::error("Error: in opening file \""+ + replicas_registry_file+"\" for writing.\n", FILE_ERROR); + reg_os << replica_id << " " << replica_list_file << "\n"; + reg_os.close(); + } + } + + if (b_hills_traj) { + std::string const traj_file_name(cvm::output_prefix+ + ".colvars."+this->name+ + ( (comm != single_replica) ? + ("."+replica_id) : + ("") )+ + ".hills.traj"); + hills_traj_os.open(traj_file_name.c_str()); + if (!hills_traj_os.is_open()) + cvm::error("Error: in opening hills output file \"" + + traj_file_name+"\".\n", FILE_ERROR); + } + + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); +} + + std::ostream & colvarbias_meta::write_restart(std::ostream& os) { os << "metadynamics {\n" @@ -1505,7 +1519,7 @@ std::ostream & colvarbias_meta::write_restart(std::ostream& os) // this is a very good time to project hills, if you haven't done // it already! project_hills(new_hills_begin, hills.end(), - hills_energy, hills_energy_gradients); + hills_energy, hills_energy_gradients); new_hills_begin = hills.end(); // write down the grids to the restart file @@ -1579,10 +1593,10 @@ void colvarbias_meta::write_pmf() } { std::string const fes_file_name(fes_file_name_prefix + - ((comm != single_replica) ? ".partial" : "") + - (dump_fes_save ? - "."+cvm::to_str(cvm::step_absolute()) : "") + - ".pmf"); + ((comm != single_replica) ? ".partial" : "") + + (dump_fes_save ? + "."+cvm::to_str(cvm::step_absolute()) : "") + + ".pmf"); cvm::backup_file(fes_file_name.c_str()); cvm::ofstream fes_os(fes_file_name.c_str()); pmf->write_multicol(fes_os); @@ -1604,9 +1618,9 @@ void colvarbias_meta::write_pmf() pmf->multiply_constant(well_temper_scale); } std::string const fes_file_name(fes_file_name_prefix + - (dump_fes_save ? - "."+cvm::to_str(cvm::step_absolute()) : "") + - ".pmf"); + (dump_fes_save ? + "."+cvm::to_str(cvm::step_absolute()) : "") + + ".pmf"); cvm::backup_file(fes_file_name.c_str()); cvm::ofstream fes_os(fes_file_name.c_str()); pmf->write_multicol(fes_os); @@ -1624,9 +1638,9 @@ void colvarbias_meta::write_replica_state_file() // is duplicated code, that could be cleaned up later cvm::backup_file(replica_state_file.c_str()); cvm::ofstream rep_state_os(replica_state_file.c_str()); - if (!rep_state_os.good()) + if (!rep_state_os.is_open()) cvm::fatal_error("Error: in opening file \""+ - replica_state_file+"\" for writing.\n"); + replica_state_file+"\" for writing.\n"); rep_state_os.setf(std::ios::scientific, std::ios::floatfield); rep_state_os << "\n" @@ -1668,10 +1682,11 @@ void colvarbias_meta::write_replica_state_file() // reopen the hills file replica_hills_os.close(); + cvm::backup_file(replica_hills_file.c_str()); replica_hills_os.open(replica_hills_file.c_str()); - if (!replica_hills_os.good()) + if (!replica_hills_os.is_open()) cvm::fatal_error("Error: in opening file \""+ - replica_hills_file+"\" for writing.\n"); + replica_hills_file+"\" for writing.\n"); replica_hills_os.setf(std::ios::scientific, std::ios::floatfield); } diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h index e2f175ad92..d4c521ae62 100644 --- a/lib/colvars/colvarbias_meta.h +++ b/lib/colvars/colvarbias_meta.h @@ -42,6 +42,8 @@ public: virtual std::ostream & write_restart(std::ostream &os); + virtual int setup_output(); + virtual void write_pmf(); class hill; diff --git a/lib/colvars/colvarbias_restraint.h b/lib/colvars/colvarbias_restraint.h index 91f37181d6..3148fe0138 100644 --- a/lib/colvars/colvarbias_restraint.h +++ b/lib/colvars/colvarbias_restraint.h @@ -110,7 +110,7 @@ protected: /// \brief Number of steps required to reach the target force constant /// or restraint centers - size_t target_nsteps; + long target_nsteps; }; /// \brief Harmonic bias restraint diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index f253aeffc6..a1426f71ee 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -1324,14 +1324,6 @@ void colvar::cartesian::calc_value() x.vector1d_value[dim*ia + j] = atoms[ia].pos[axes[j]]; } } - - if (atoms.weights.size()) { - for (ia = 0; ia < atoms.size(); ia++) { - for (j = 0; j < dim; j++) { - x.vector1d_value[dim*ia + j] *= atoms.weights[ia]; - } - } - } } @@ -1349,20 +1341,11 @@ void colvar::cartesian::apply_force(colvarvalue const &force) size_t ia, j; if (!atoms.noforce) { cvm::rvector f; - if (atoms.weights.size()) { - for (ia = 0; ia < atoms.size(); ia++) { - for (j = 0; j < dim; j++) { - f[axes[j]] = force.vector1d_value[dim*ia + j] / atoms.weights[ia]; - } - atoms[ia].apply_force(f); - } - } else { - for (ia = 0; ia < atoms.size(); ia++) { - for (j = 0; j < dim; j++) { - f[axes[j]] = force.vector1d_value[dim*ia + j]; - } - atoms[ia].apply_force(f); + for (ia = 0; ia < atoms.size(); ia++) { + for (j = 0; j < dim; j++) { + f[axes[j]] = force.vector1d_value[dim*ia + j]; } + atoms[ia].apply_force(f); } } } diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index e91ed1e6cc..99a32ca8ff 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -8,9 +8,10 @@ #include "colvarproxy.h" #include "colvar.h" #include "colvarbias.h" -#include "colvarbias_alb.h" -#include "colvarbias_meta.h" #include "colvarbias_abf.h" +#include "colvarbias_alb.h" +#include "colvarbias_histogram.h" +#include "colvarbias_meta.h" #include "colvarbias_restraint.h" #include "colvarscript.h" @@ -523,13 +524,13 @@ int colvarmodule::calc() { cvm::log("Perform runtime analyses.\n"); cvm::increase_depth(); for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { - (*cvi)->analyse(); + (*cvi)->analyze(); if (cvm::get_error()) { return COLVARS_ERROR; } } for (bi = biases.begin(); bi != biases.end(); bi++) { - (*bi)->analyse(); + (*bi)->analyze(); if (cvm::get_error()) { return COLVARS_ERROR; } @@ -627,7 +628,7 @@ int colvarmodule::analyze() cvi != colvars.end(); cvi++) { cvm::increase_depth(); - (*cvi)->analyse(); + (*cvi)->analyze(); cvm::decrease_depth(); } @@ -636,7 +637,7 @@ int colvarmodule::analyze() bi != biases.end(); bi++) { cvm::increase_depth(); - (*bi)->analyse(); + (*bi)->analyze(); cvm::decrease_depth(); } @@ -717,13 +718,15 @@ int colvarmodule::setup_input() cvm::log(cvm::line_marker); } } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } int colvarmodule::setup_output() { + int error_code = 0; + // output state file (restart) restart_out_name = proxy->restart_output_prefix().size() ? std::string(proxy->restart_output_prefix()+".colvars.state") : @@ -748,7 +751,17 @@ int colvarmodule::setup_output() std::string("")); if (cv_traj_freq && cv_traj_name.size()) { - open_traj_file(cv_traj_name); + error_code |= open_traj_file(cv_traj_name); + } + + for (std::vector::iterator bi = biases.begin(); + bi != biases.end(); + bi++) { + error_code |= (*bi)->setup_output(); + } + + if (error_code != COLVARS_OK || cvm::get_error()) { + set_error_bits(FILE_ERROR); } return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); @@ -828,6 +841,14 @@ int colvarmodule::write_output_files() } cvm::decrease_depth(); + cvm::increase_depth(); + for (std::vector::iterator bi = biases.begin(); + bi != biases.end(); + bi++) { + (*bi)->write_output_files(); + } + cvm::decrease_depth(); + if (cv_traj_os.is_open()) { // do not close to avoid problems with multiple NAMD runs cv_traj_os.flush(); @@ -839,8 +860,8 @@ int colvarmodule::write_output_files() int colvarmodule::read_traj(char const *traj_filename, - size_t traj_read_begin, - size_t traj_read_end) + long traj_read_begin, + long traj_read_end) { cvm::log("Opening trajectory file \""+ std::string(traj_filename)+"\".\n"); @@ -1204,8 +1225,8 @@ colvarproxy *colvarmodule::proxy = NULL; // static runtime data cvm::real colvarmodule::debug_gradients_step_size = 1.0e-03; int colvarmodule::errorCode = 0; -size_t colvarmodule::it = 0; -size_t colvarmodule::it_restart = 0; +long colvarmodule::it = 0; +long colvarmodule::it_restart = 0; size_t colvarmodule::restart_out_freq = 0; size_t colvarmodule::cv_traj_freq = 0; size_t colvarmodule::depth = 0; diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 07134c2db5..b6f060b495 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -4,7 +4,7 @@ #define COLVARMODULE_H #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2015-03-15" +#define COLVARS_VERSION "2015-04-03" #endif #ifndef COLVARS_DEBUG @@ -122,19 +122,19 @@ public: } /// Current step number - static size_t it; + static long it; /// Starting step number for this run - static size_t it_restart; + static long it_restart; /// Return the current step number from the beginning of this run - static inline size_t step_relative() + static inline long step_relative() { return it - it_restart; } /// Return the current step number from the beginning of the whole /// calculation - static inline size_t step_absolute() + static inline long step_absolute() { return it; } @@ -302,8 +302,8 @@ public: /// \brief Read a collective variable trajectory (post-processing /// only, not called at runtime) int read_traj(char const *traj_filename, - size_t traj_read_begin, - size_t traj_read_end); + long traj_read_begin, + long traj_read_end); /// Quick conversion of an object to a string template static std::string to_str(T const &x, diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 84777149c0..b564ec331b 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -227,6 +227,7 @@ size_t colvarparse::dummy_pos = 0; _get_keyval_scalar_(int); _get_keyval_scalar_(size_t); +_get_keyval_scalar_(long); _get_keyval_scalar_string_(std::string); _get_keyval_scalar_(cvm::real); _get_keyval_scalar_(cvm::rvector); @@ -238,6 +239,7 @@ _get_keyval_scalar_(colvarvalue); _get_keyval_vector_(int); _get_keyval_vector_(size_t); +_get_keyval_vector_(long); _get_keyval_vector_(std::string); _get_keyval_vector_(cvm::real); _get_keyval_vector_(cvm::rvector); diff --git a/lib/colvars/colvarparse.h b/lib/colvars/colvarparse.h index 5f7ba26ba3..5a753780a8 100644 --- a/lib/colvars/colvarparse.h +++ b/lib/colvars/colvarparse.h @@ -113,6 +113,7 @@ public: _get_keyval_scalar_proto_(int, (int)0); _get_keyval_scalar_proto_(size_t, (size_t)0); + _get_keyval_scalar_proto_(long, 0); _get_keyval_scalar_proto_(std::string, std::string("")); _get_keyval_scalar_proto_(cvm::real, (cvm::real)0.0); _get_keyval_scalar_proto_(cvm::rvector, cvm::rvector()); @@ -130,6 +131,7 @@ public: _get_keyval_vector_proto_(int, 0); _get_keyval_vector_proto_(size_t, 0); + _get_keyval_vector_proto_(long, 0); _get_keyval_vector_proto_(std::string, std::string("")); _get_keyval_vector_proto_(cvm::real, 0.0); _get_keyval_vector_proto_(cvm::rvector, cvm::rvector()); diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index b985ea5d2d..380f9d6fda 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -128,7 +128,18 @@ int colvarscript::run(int argc, char const *argv[]) { } } - /// TODO Write an output state file? (Useful for testing) + /// Save to an output state file + if (cmd == "save") { + if (argc < 3) { + result = "Missing arguments"; + return COLVARSCRIPT_ERROR; + } + proxy->output_prefix_str = argv[2]; + int error = 0; + error |= colvars->setup_output(); + error |= colvars->write_output_files(); + return error ? COLVARSCRIPT_ERROR : COLVARSCRIPT_OK; + } /// Print the values that would go on colvars.traj if (cmd == "printframelabels") { diff --git a/src/USER-COLVARS/colvarproxy_lammps.h b/src/USER-COLVARS/colvarproxy_lammps.h index 94c3bacdd4..74f7193784 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.h +++ b/src/USER-COLVARS/colvarproxy_lammps.h @@ -15,7 +15,7 @@ #include #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2015-04-01" +#define COLVARPROXY_VERSION "2015-04-02" #endif /* struct for packed data communication of coordinates and forces. */