00001 #ifndef COLVARBIAS_META_H
00002 #define COLVARBIAS_META_H
00003
00004 #include <vector>
00005 #include <list>
00006 #include <sstream>
00007 #include <fstream>
00008
00009 #include "colvarbias.h"
00010 #include "colvargrid.h"
00011
00013 class colvarbias_meta : public colvarbias {
00014
00015 public:
00016
00018 enum Communication {
00020 single_replica,
00022 multiple_replicas
00023 };
00024
00026 Communication comm;
00027
00029 colvarbias_meta (std::string const &conf, char const *key);
00030
00032 colvarbias_meta();
00033
00035 virtual ~colvarbias_meta();
00036
00037 virtual cvm::real update();
00038
00039 virtual std::istream & read_restart (std::istream &is);
00040
00041 virtual std::ostream & write_restart (std::ostream &os);
00042
00043 virtual void write_pmf();
00044
00045 class hill;
00046 typedef std::list<hill>::iterator hill_iter;
00047
00048 protected:
00049
00054 cvm::real hill_width;
00055
00057 size_t new_hill_freq;
00058
00060 bool b_hills_traj;
00062 std::ofstream hills_traj_os;
00063
00066 std::list<hill> hills;
00067
00070 hill_iter new_hills_begin;
00071
00074 std::list<hill> hills_off_grid;
00075
00077 hill_iter new_hills_off_grid_begin;
00078
00080 void recount_hills_off_grid (hill_iter h_first, hill_iter h_last,
00081 colvar_grid_scalar *ge);
00082
00084 std::istream & read_hill (std::istream &is);
00085
00091 size_t state_file_step;
00092
00096 virtual std::list<hill>::const_iterator create_hill (hill const &h);
00097
00100 virtual std::list<hill>::const_iterator delete_hill (hill_iter &h);
00101
00104 virtual void calc_hills (hill_iter h_first,
00105 hill_iter h_last,
00106 cvm::real &energy,
00107 std::vector<colvarvalue> const &values = std::vector<colvarvalue> (0));
00108
00112 virtual void calc_hills_force (size_t const &i,
00113 hill_iter h_first,
00114 hill_iter h_last,
00115 std::vector<colvarvalue> &forces,
00116 std::vector<colvarvalue> const &values = std::vector<colvarvalue> (0));
00117
00118
00120 cvm::real hill_weight;
00121
00124 bool use_grids;
00125
00127 bool rebin_grids;
00128
00130 bool expand_grids;
00131
00133 size_t grids_freq;
00134
00137 bool keep_hills;
00138
00140 bool dump_fes;
00141
00144 bool dump_replica_fes;
00145
00148 bool dump_fes_save;
00149
00151 bool well_tempered;
00152
00154 cvm::real bias_temperature;
00155
00159 bool safely_read_restart;
00160
00162 colvar_grid_scalar *hills_energy;
00163
00165 colvar_grid_gradient *hills_energy_gradients;
00166
00168 void project_hills (hill_iter h_first, hill_iter h_last,
00169 colvar_grid_scalar *ge, colvar_grid_gradient *gf);
00170
00171
00172
00173
00175 std::string replica_id;
00176
00178 std::string replica_file_name;
00179
00181 virtual void update_replicas_registry();
00182
00184 virtual void read_replica_files();
00185
00187 virtual void write_replica_state_file();
00188
00194 std::vector<colvarbias_meta *> replicas;
00195
00197 size_t replica_update_freq;
00198
00201 std::string replicas_registry_file;
00203 std::string replicas_registry;
00205 std::string replica_list_file;
00206
00209 std::string replica_state_file;
00211 bool replica_state_file_in_sync;
00212
00215 size_t update_status;
00216
00220 std::string replica_hills_file;
00221
00223 std::ofstream replica_hills_os;
00224
00226 size_t replica_hills_file_pos;
00227
00228 };
00229
00230
00231
00232
00234 class colvarbias_meta::hill {
00235
00236 protected:
00237
00239 cvm::real hill_value;
00240
00242 cvm::real sW;
00243
00245 cvm::real W;
00246
00248 std::vector<colvarvalue> centers;
00249
00251 std::vector<cvm::real> widths;
00252
00253 public:
00254
00255 friend class colvarbias_meta;
00256
00258 size_t it;
00259
00261 std::string replica;
00262
00268 inline hill (cvm::real const &W_in,
00269 std::vector<colvar *> &cv,
00270 cvm::real const &hill_width,
00271 std::string const &replica_in = "")
00272 : sW (1.0),
00273 W (W_in),
00274 centers (cv.size()),
00275 widths (cv.size()),
00276 it (cvm::it),
00277 replica (replica_in)
00278 {
00279 for (size_t i = 0; i < cv.size(); i++) {
00280 centers[i].type (cv[i]->type());
00281 centers[i] = cv[i]->value();
00282 widths[i] = cv[i]->width * hill_width;
00283 }
00284 if (cvm::debug())
00285 cvm::log ("New hill, applied to "+cvm::to_str (cv.size())+
00286 " collective variables, with centers "+
00287 cvm::to_str (centers)+", widths "+
00288 cvm::to_str (widths)+" and weight "+
00289 cvm::to_str (W)+".\n");
00290 }
00291
00298 inline hill (size_t const &it_in,
00299 cvm::real const &W_in,
00300 std::vector<colvarvalue> const ¢ers_in,
00301 std::vector<cvm::real> const &widths_in,
00302 std::string const &replica_in = "")
00303 : sW (1.0),
00304 W (W_in),
00305 centers (centers_in),
00306 widths (widths_in),
00307 it (it_in),
00308 replica (replica_in)
00309 {}
00310
00312 inline hill (colvarbias_meta::hill const &h)
00313 : sW (1.0),
00314 W (h.W),
00315 centers (h.centers),
00316 widths (h.widths),
00317 it (h.it),
00318 replica (h.replica)
00319 {}
00320
00322 inline ~hill()
00323 {}
00324
00326 inline cvm::real energy()
00327 {
00328 return W * sW * hill_value;
00329 }
00330
00332 inline cvm::real energy (cvm::real const &new_weight)
00333 {
00334 return new_weight * sW * hill_value;
00335 }
00336
00338 inline cvm::real const &value()
00339 {
00340 return hill_value;
00341 }
00342
00344 inline void value (cvm::real const &new_value)
00345 {
00346 hill_value = new_value;
00347 }
00348
00350 inline cvm::real weight()
00351 {
00352 return W * sW;
00353 }
00354
00356 inline void scale (cvm::real const &new_scale_fac)
00357 {
00358 sW = new_scale_fac;
00359 }
00360
00362 inline std::vector<colvarvalue> & center()
00363 {
00364 return centers;
00365 }
00366
00368 inline colvarvalue & center (size_t const &i)
00369 {
00370 return centers[i];
00371 }
00372
00374 inline friend bool operator < (hill const &h1, hill const &h2)
00375 {
00376 if (h1.it < h2.it) return true;
00377 else return false;
00378 }
00379
00381 inline friend bool operator <= (hill const &h1, hill const &h2)
00382 {
00383 if (h1.it <= h2.it) return true;
00384 else return false;
00385 }
00386
00388 inline friend bool operator > (hill const &h1, hill const &h2)
00389 {
00390 if (h1.it > h2.it) return true;
00391 else return false;
00392 }
00393
00395 inline friend bool operator >= (hill const &h1, hill const &h2)
00396 {
00397 if (h1.it >= h2.it) return true;
00398 else return false;
00399 }
00400
00402 inline friend bool operator == (hill const &h1, hill const &h2)
00403 {
00404 if ( (h1.it >= h2.it) && (h1.replica == h2.replica) ) return true;
00405 else return false;
00406 }
00407
00409 std::string output_traj();
00410
00412 inline friend std::ostream & operator << (std::ostream &os,
00413 hill const &h);
00414
00415 };
00416
00417
00418 #endif
00419
00420
00421
00422
00423
00424