Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

colvarbias_meta.h

Go to the documentation of this file.
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   // Multiple Replicas variables and functions
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 &centers_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 // Emacs
00422 // Local Variables:
00423 // mode: C++
00424 // End:

Generated on Fri May 25 04:07:13 2012 for NAMD by  doxygen 1.3.9.1