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_RESTRAINT_H 00011 #define COLVARBIAS_RESTRAINT_H 00012 00013 #include "colvarbias.h" 00014 00015 #ifdef _MSC_VER 00016 #pragma warning(push) 00017 #pragma warning(disable : 4250) // Silence diamond inheritance warning 00018 #endif 00019 00023 class colvarbias_restraint 00024 : public virtual colvarbias, 00025 public virtual colvarbias_ti 00026 { 00027 00028 public: 00029 00031 virtual int update(); 00032 00034 virtual int change_configuration(std::string const & /* conf */) { return COLVARS_NOT_IMPLEMENTED; } 00035 00037 virtual cvm::real energy_difference(std::string const & /* conf */) { return 0.0; } 00038 00039 virtual std::string const get_state_params() const; 00040 virtual int set_state_params(std::string const &conf); 00041 // virtual std::ostream & write_state_data(std::ostream &os); 00042 // virtual std::istream & read_state_data(std::istream &os); 00043 00044 virtual std::ostream & write_traj_label(std::ostream &os); 00045 virtual std::ostream & write_traj(std::ostream &os); 00046 00048 colvarbias_restraint(char const *key); 00049 00050 virtual int init(std::string const &conf); 00051 virtual ~colvarbias_restraint(); 00052 00053 00054 protected: 00055 00057 virtual cvm::real restraint_potential(size_t i) const = 0; 00058 00060 virtual colvarvalue const restraint_force(size_t i) const = 0; 00061 00063 virtual cvm::real d_restraint_potential_dk(size_t i) const = 0; 00064 }; 00065 00066 00068 class colvarbias_restraint_centers 00069 : public virtual colvarbias_restraint 00070 { 00071 public: 00072 00073 colvarbias_restraint_centers(char const *key); 00074 virtual int init(std::string const &conf); 00075 virtual int change_configuration(std::string const &conf); 00076 00077 protected: 00078 00080 std::vector<colvarvalue> colvar_centers; 00081 }; 00082 00083 00085 class colvarbias_restraint_k 00086 : public virtual colvarbias_restraint 00087 { 00088 public: 00089 00090 colvarbias_restraint_k(char const *key); 00091 virtual int init(std::string const &conf); 00092 virtual int change_configuration(std::string const &conf); 00093 00094 protected: 00095 00097 cvm::real force_k; 00098 00100 bool check_positive_k; 00101 }; 00102 00103 00105 class colvarbias_restraint_moving 00106 : public virtual colvarparse, public virtual colvardeps { 00107 public: 00108 00109 colvarbias_restraint_moving(char const *key); 00110 // Note: despite the diamond inheritance, most of this function gets only executed once 00111 virtual int init(std::string const &conf); 00112 virtual int update() { return COLVARS_OK; } 00113 virtual int change_configuration(std::string const & /* conf */) { return COLVARS_NOT_IMPLEMENTED; } 00114 00115 virtual std::string const get_state_params() const; 00116 virtual int set_state_params(std::string const &conf); 00117 00118 protected: 00119 00121 bool b_chg_centers; 00122 00124 bool b_chg_force_k; 00125 00127 bool b_decoupling; 00128 00131 int target_nstages; 00132 00134 int stage; 00135 00137 std::vector<cvm::real> lambda_schedule; 00138 00141 cvm::step_number target_nsteps; 00142 00144 cvm::step_number first_step; 00145 00147 cvm::real acc_work; 00148 }; 00149 00150 00152 class colvarbias_restraint_centers_moving 00153 : public virtual colvarbias_restraint_centers, 00154 public virtual colvarbias_restraint_moving 00155 { 00156 public: 00157 00158 colvarbias_restraint_centers_moving(char const *key); 00159 virtual int init(std::string const &conf); 00160 virtual int update(); 00161 virtual int change_configuration(std::string const & /* conf */) { return COLVARS_NOT_IMPLEMENTED; } 00162 00163 virtual std::string const get_state_params() const; 00164 virtual int set_state_params(std::string const &conf); 00165 virtual std::ostream & write_traj_label(std::ostream &os); 00166 virtual std::ostream & write_traj(std::ostream &os); 00167 00168 protected: 00169 00171 std::vector<colvarvalue> target_centers; 00172 00174 std::vector<colvarvalue> initial_centers; 00175 00177 std::vector<colvarvalue> centers_incr; 00178 00180 virtual int update_centers(cvm::real lambda); 00181 00183 bool b_output_centers; 00184 00186 int update_acc_work(); 00187 }; 00188 00189 00191 class colvarbias_restraint_k_moving 00192 : public virtual colvarbias_restraint_k, 00193 public virtual colvarbias_restraint_moving 00194 { 00195 public: 00196 00197 colvarbias_restraint_k_moving(char const *key); 00198 virtual int init(std::string const &conf); 00199 virtual int update(); 00200 virtual int change_configuration(std::string const & /* conf */) { return COLVARS_NOT_IMPLEMENTED; } 00201 00202 virtual std::string const get_state_params() const; 00203 virtual int set_state_params(std::string const &conf); 00204 virtual std::ostream & write_traj_label(std::ostream &os); 00205 virtual std::ostream & write_traj(std::ostream &os); 00206 00207 protected: 00208 00210 cvm::real target_force_k; 00211 00213 cvm::real starting_force_k; 00214 00216 cvm::real lambda_exp; 00217 00220 cvm::real restraint_FE; 00221 00223 cvm::real target_equil_steps; 00224 00226 cvm::real force_k_incr; 00227 00229 int update_acc_work(); 00230 }; 00231 00232 00235 class colvarbias_restraint_harmonic 00236 : public colvarbias_restraint_centers_moving, 00237 public colvarbias_restraint_k_moving 00238 { 00239 public: 00240 colvarbias_restraint_harmonic(char const *key); 00241 virtual int init(std::string const &conf); 00242 virtual int update(); 00243 virtual std::string const get_state_params() const; 00244 virtual int set_state_params(std::string const &conf); 00245 virtual std::ostream & write_state_data(std::ostream &os); 00246 virtual std::istream & read_state_data(std::istream &os); 00247 virtual std::ostream & write_traj_label(std::ostream &os); 00248 virtual std::ostream & write_traj(std::ostream &os); 00249 virtual int change_configuration(std::string const &conf); 00250 virtual cvm::real energy_difference(std::string const &conf); 00251 00252 protected: 00253 00254 virtual cvm::real restraint_potential(size_t i) const; 00255 virtual colvarvalue const restraint_force(size_t i) const; 00256 virtual cvm::real d_restraint_potential_dk(size_t i) const; 00257 }; 00258 00259 00262 class colvarbias_restraint_harmonic_walls 00263 : public colvarbias_restraint_k_moving 00264 { 00265 public: 00266 00267 colvarbias_restraint_harmonic_walls(char const *key); 00268 virtual int init(std::string const &conf); 00269 virtual int update(); 00270 virtual std::string const get_state_params() const; 00271 virtual int set_state_params(std::string const &conf); 00272 virtual std::ostream & write_state_data(std::ostream &os); 00273 virtual std::istream & read_state_data(std::istream &os); 00274 virtual std::ostream & write_traj_label(std::ostream &os); 00275 virtual std::ostream & write_traj(std::ostream &os); 00276 00277 protected: 00278 00280 std::vector<colvarvalue> lower_walls; 00281 00283 std::vector<colvarvalue> upper_walls; 00284 00286 cvm::real lower_wall_k; 00287 00289 cvm::real upper_wall_k; 00290 00291 virtual cvm::real colvar_distance(size_t i) const; 00292 virtual cvm::real restraint_potential(size_t i) const; 00293 virtual colvarvalue const restraint_force(size_t i) const; 00294 virtual cvm::real d_restraint_potential_dk(size_t i) const; 00295 }; 00296 00297 00300 class colvarbias_restraint_linear 00301 : public colvarbias_restraint_centers_moving, 00302 public colvarbias_restraint_k_moving 00303 { 00304 00305 public: 00306 colvarbias_restraint_linear(char const *key); 00307 virtual int init(std::string const &conf); 00308 virtual int update(); 00309 virtual int change_configuration(std::string const &conf); 00310 virtual cvm::real energy_difference(std::string const &conf); 00311 00312 virtual std::string const get_state_params() const; 00313 virtual int set_state_params(std::string const &conf); 00314 virtual std::ostream & write_state_data(std::ostream &os); 00315 virtual std::istream & read_state_data(std::istream &os); 00316 virtual std::ostream & write_traj_label(std::ostream &os); 00317 virtual std::ostream & write_traj(std::ostream &os); 00318 00319 protected: 00320 00321 virtual cvm::real restraint_potential(size_t i) const; 00322 virtual colvarvalue const restraint_force(size_t i) const; 00323 virtual cvm::real d_restraint_potential_dk(size_t i) const; 00324 }; 00325 00326 00328 // TODO this could be reimplemented more cleanly as a derived class of both restraint and histogram 00329 class colvarbias_restraint_histogram : public colvarbias { 00330 00331 public: 00332 00333 colvarbias_restraint_histogram(char const *key); 00334 int init(std::string const &conf); 00335 ~colvarbias_restraint_histogram(); 00336 00337 virtual int update(); 00338 00339 virtual int write_output_files(); 00340 virtual std::ostream & write_traj_label(std::ostream &os); 00341 virtual std::ostream & write_traj(std::ostream &os); 00342 00343 protected: 00344 00346 cvm::vector1d<cvm::real> p; 00347 00349 cvm::vector1d<cvm::real> ref_p; 00350 00352 cvm::vector1d<cvm::real> p_diff; 00353 00355 cvm::real lower_boundary; 00356 00358 cvm::real upper_boundary; 00359 00361 cvm::real width; 00362 00364 cvm::real gaussian_width; 00365 00367 cvm::real force_k; 00368 00370 bool b_write_histogram; 00371 }; 00372 00373 #ifdef _MSC_VER 00374 #pragma warning(pop) 00375 #endif 00376 00377 #endif