00001 // -*- c++ -*- 00002 00003 // This file is part of the Collective Variables module (Colvars). 00004 // The original version of Colvars and its updates are located at: 00005 // https://github.com/Colvars/colvars 00006 // Please update all Colvars source files before making any changes. 00007 // If you wish to distribute your changes, please submit them to the 00008 // Colvars repository at GitHub. 00009 00010 #ifndef COLVARBIAS_META_H 00011 #define COLVARBIAS_META_H 00012 00013 #include <vector> 00014 #include <list> 00015 #include <iosfwd> 00016 00017 #include "colvarbias.h" 00018 #include "colvargrid.h" 00019 00021 class colvarbias_meta 00022 : public virtual colvarbias, 00023 public virtual colvarbias_ti 00024 { 00025 00026 public: 00027 00029 enum Communication { 00031 single_replica, 00033 multiple_replicas 00034 }; 00035 00037 Communication comm; 00038 00039 colvarbias_meta(char const *key); 00040 virtual ~colvarbias_meta(); 00041 00042 virtual int init(std::string const &conf); 00043 virtual int init_replicas_params(std::string const &conf); 00044 virtual int init_well_tempered_params(std::string const &conf); 00045 virtual int init_ebmeta_params(std::string const &conf); 00046 00047 virtual int clear_state_data(); 00048 00049 virtual int update(); 00050 virtual int update_grid_params(); 00051 virtual int update_bias(); 00052 virtual int update_grid_data(); 00053 virtual int replica_share(); 00054 00055 virtual int calc_energy(std::vector<colvarvalue> const *values); 00056 virtual int calc_forces(std::vector<colvarvalue> const *values); 00057 00058 virtual std::string const get_state_params() const; 00059 virtual int set_state_params(std::string const &state_conf); 00060 virtual std::ostream & write_state_data(std::ostream &os); 00061 virtual std::istream & read_state_data(std::istream &os); 00062 00063 virtual int setup_output(); 00064 virtual int write_output_files(); 00065 virtual void write_pmf(); 00066 virtual int write_state_to_replicas(); 00067 00068 class hill; 00069 typedef std::list<hill>::iterator hill_iter; 00070 00071 protected: 00072 00077 cvm::real hill_width; 00078 00080 std::vector<cvm::real> colvar_sigmas; 00081 00083 size_t new_hill_freq; 00084 00086 bool b_hills_traj; 00087 00089 std::string const hills_traj_file_name() const; 00090 00093 std::list<hill> hills; 00094 00097 hill_iter new_hills_begin; 00098 00101 std::list<hill> hills_off_grid; 00102 00104 hill_iter new_hills_off_grid_begin; 00105 00107 void recount_hills_off_grid(hill_iter h_first, hill_iter h_last, 00108 colvar_grid_scalar *ge); 00109 00111 std::istream & read_hill(std::istream &is); 00112 00116 std::list<hill>::const_iterator add_hill(hill const &h); 00117 00120 std::list<hill>::const_iterator delete_hill(hill_iter &h); 00121 00124 virtual void calc_hills(hill_iter h_first, 00125 hill_iter h_last, 00126 cvm::real &energy, 00127 std::vector<colvarvalue> const *values); 00128 00132 virtual void calc_hills_force(size_t const &i, 00133 hill_iter h_first, 00134 hill_iter h_last, 00135 std::vector<colvarvalue> &forces, 00136 std::vector<colvarvalue> const *values); 00137 00138 00140 cvm::real hill_weight; 00141 00144 bool use_grids; 00145 00147 bool rebin_grids; 00148 00150 bool expand_grids; 00151 00153 size_t grids_freq; 00154 00156 bool keep_hills; 00157 00159 bool restart_keep_hills; 00160 00162 bool dump_fes; 00163 00166 bool dump_replica_fes; 00167 00170 bool dump_fes_save; 00171 00173 bool well_tempered; 00174 00176 cvm::real bias_temperature; 00177 00179 bool ebmeta; 00180 00182 colvar_grid_scalar* target_dist; 00183 00185 cvm::step_number ebmeta_equil_steps; 00186 00187 00191 bool safely_read_restart; 00192 00194 colvar_grid_scalar *hills_energy; 00195 00197 colvar_grid_gradient *hills_energy_gradients; 00198 00200 void project_hills(hill_iter h_first, hill_iter h_last, 00201 colvar_grid_scalar *ge, colvar_grid_gradient *gf, 00202 bool print_progress = false); 00203 00204 00205 // Multiple Replicas variables and functions 00206 00208 std::string replica_id; 00209 00211 std::string replica_file_name; 00212 00214 virtual int update_replicas_registry(); 00215 00217 virtual int read_replica_files(); 00218 00220 virtual int write_replica_state_file(); 00221 00223 virtual int reopen_replica_buffer_file(); 00224 00230 std::vector<colvarbias_meta *> replicas; 00231 00233 size_t replica_update_freq; 00234 00237 std::string replicas_registry_file; 00239 std::string replicas_registry; 00241 std::string replica_list_file; 00242 00245 std::string replica_state_file; 00247 bool replica_state_file_in_sync; 00248 00251 size_t update_status; 00252 00256 std::string replica_hills_file; 00257 00259 std::streampos replica_hills_file_pos; 00260 00261 }; 00262 00263 00264 00265 00267 class colvarbias_meta::hill { 00268 00269 protected: 00270 00272 cvm::step_number it; 00273 00275 cvm::real hill_value; 00276 00278 cvm::real sW; 00279 00281 cvm::real W; 00282 00284 std::vector<colvarvalue> centers; 00285 00287 std::vector<cvm::real> sigmas; 00288 00290 std::string replica; 00291 00292 public: 00293 00294 friend class colvarbias_meta; 00295 00302 hill(cvm::step_number it, cvm::real W, 00303 std::vector<colvarvalue> const &cv_values, 00304 std::vector<cvm::real> const &cv_sigmas, 00305 std::string const &replica = ""); 00306 00308 hill(colvarbias_meta::hill const &h); 00309 00311 ~hill(); 00312 00314 hill & operator = (colvarbias_meta::hill const &h); 00315 00317 inline cvm::real energy() 00318 { 00319 return W * sW * hill_value; 00320 } 00321 00323 inline cvm::real energy(cvm::real const &new_weight) 00324 { 00325 return new_weight * sW * hill_value; 00326 } 00327 00329 inline cvm::real const &value() 00330 { 00331 return hill_value; 00332 } 00333 00335 inline void value(cvm::real const &new_value) 00336 { 00337 hill_value = new_value; 00338 } 00339 00341 inline cvm::real weight() 00342 { 00343 return W * sW; 00344 } 00345 00347 inline void scale(cvm::real const &new_scale_fac) 00348 { 00349 sW = new_scale_fac; 00350 } 00351 00353 inline std::vector<colvarvalue> & center() 00354 { 00355 return centers; 00356 } 00357 00359 inline colvarvalue & center(size_t const &i) 00360 { 00361 return centers[i]; 00362 } 00363 00365 inline friend bool operator < (hill const &h1, hill const &h2) 00366 { 00367 if (h1.it < h2.it) return true; 00368 else return false; 00369 } 00370 00372 inline friend bool operator <= (hill const &h1, hill const &h2) 00373 { 00374 if (h1.it <= h2.it) return true; 00375 else return false; 00376 } 00377 00379 inline friend bool operator > (hill const &h1, hill const &h2) 00380 { 00381 if (h1.it > h2.it) return true; 00382 else return false; 00383 } 00384 00386 inline friend bool operator >= (hill const &h1, hill const &h2) 00387 { 00388 if (h1.it >= h2.it) return true; 00389 else return false; 00390 } 00391 00393 inline friend bool operator == (hill const &h1, hill const &h2) 00394 { 00395 if ( (h1.it >= h2.it) && (h1.replica == h2.replica) ) return true; 00396 else return false; 00397 } 00398 00400 std::string output_traj(); 00401 00403 friend std::ostream & operator << (std::ostream &os, hill const &h); 00404 00405 }; 00406 00407 00408 #endif