Update Colvars to version 2018-12-14
[namd.git] / colvars / src / colvarbias.h
1 // -*- c++ -*-
2
3 // This file is part of the Collective Variables module (Colvars).
4 // The original version of Colvars and its updates are located at:
5 // https://github.com/colvars/colvars
6 // Please update all Colvars source files before making any changes.
7 // If you wish to distribute your changes, please submit them to the
8 // Colvars repository at GitHub.
9
10 #ifndef COLVARBIAS_H
11 #define COLVARBIAS_H
12
13 #include "colvar.h"
14 #include "colvarparse.h"
15 #include "colvardeps.h"
16
17
18 /// \brief Collective variable bias, base class
19 class colvarbias
20   : public virtual colvarparse, public virtual colvardeps {
21 public:
22
23   /// Name of this bias
24   std::string name;
25
26   /// Type of this bias
27   std::string bias_type;
28
29   /// If there is more than one bias of this type, record its rank
30   int rank;
31
32   /// Add a new collective variable to this bias
33   int add_colvar(std::string const &cv_name);
34
35   /// How many variables are defined for this bias
36   inline size_t num_variables() const
37   {
38     return colvars.size();
39   }
40
41   /// Access the variables vector
42   inline std::vector<colvar *> *variables()
43   {
44     return &colvars;
45   }
46
47   /// Access the i-th variable
48   inline colvar * variables(int i) const
49   {
50     return colvars[i];
51   }
52
53   /// Retrieve colvar values and calculate their biasing forces
54   /// Return bias energy
55   virtual int update();
56
57   /// \brief Compute the energy of the bias with alternative values of the
58   /// collective variables (suitable for bias exchange)
59   virtual int calc_energy(std::vector<colvarvalue> const &values =
60                           std::vector<colvarvalue>(0))
61   {
62     cvm::error("Error: calc_energy() not implemented.\n", COLVARS_NOT_IMPLEMENTED);
63     return COLVARS_NOT_IMPLEMENTED;
64   }
65
66   /// Send forces to the collective variables
67   virtual void communicate_forces();
68
69   /// Carry out operations needed before next step is run
70   virtual int end_of_step();
71
72   /// Load new configuration - force constant and/or centers only
73   virtual int change_configuration(std::string const &conf);
74
75   /// Calculate change in energy from using alternate configuration
76   virtual cvm::real energy_difference(std::string const &conf);
77
78   /// Give the total number of bins for a given bias.
79   // FIXME this is currently 1D only
80   virtual int bin_num();
81   /// Calculate the bin index for a given bias.
82   // FIXME this is currently 1D only
83   virtual int current_bin();
84   //// Give the count at a given bin index.
85   // FIXME this is currently 1D only
86   virtual int bin_count(int bin_index);
87   //// Share information between replicas, whatever it may be.
88   virtual int replica_share();
89
90   /// Perform analysis tasks
91   virtual void analyze() {}
92
93   /// \brief Constructor
94   colvarbias(char const *key);
95
96   /// \brief Parse config string and (re)initialize
97   virtual int init(std::string const &conf);
98
99   /// \brief Set to zero all mutable data
100   virtual int reset();
101
102 private:
103
104   /// Default constructor
105   colvarbias();
106
107   /// Copy constructor
108   colvarbias(colvarbias &);
109
110 public:
111
112   /// \brief Delete everything
113   virtual int clear();
114
115   /// \brief Delete only the allocatable data (save memory)
116   virtual int clear_state_data();
117
118   /// Destructor
119   virtual ~colvarbias();
120
121   /// Write the values of specific mutable properties to a string
122   virtual std::string const get_state_params() const;
123
124   /// Read the values of specific mutable properties from a string
125   virtual int set_state_params(std::string const &state_conf);
126
127   /// Write all mutable data not already written by get_state_params()
128   virtual std::ostream & write_state_data(std::ostream &os)
129   {
130     return os;
131   }
132
133   /// Read all mutable data not already set by set_state_params()
134   virtual std::istream & read_state_data(std::istream &is)
135   {
136     return is;
137   }
138
139   /// Read a keyword from the state data (typically a header)
140   std::istream & read_state_data_key(std::istream &is, char const *key);
141
142   /// Write the bias configuration to a restart file or other stream
143   virtual std::ostream & write_state(std::ostream &os);
144
145   /// Read the bias configuration from a restart file or other stream
146   virtual std::istream & read_state(std::istream &is);
147
148   /// Write a label to the trajectory file (comment line)
149   virtual std::ostream & write_traj_label(std::ostream &os);
150
151   /// Output quantities such as the bias energy to the trajectory file
152   virtual std::ostream & write_traj(std::ostream &os);
153
154   /// (Re)initialize the output files (does not write them yet)
155   virtual int setup_output()
156   {
157     return COLVARS_OK;
158   }
159
160   /// Write any output files that this bias may have (e.g. PMF files)
161   virtual int write_output_files()
162   {
163     return COLVARS_OK;
164   }
165
166   /// Use this prefix for all output files
167   std::string output_prefix;
168
169   /// If this bias is communicating with other replicas through files, send it to them
170   virtual int write_state_to_replicas()
171   {
172     return COLVARS_OK;
173   }
174
175   inline cvm::real get_energy()
176   {
177     return bias_energy;
178   }
179
180   /// \brief Implementation of the feature list for colvarbias
181   static std::vector<feature *> cvb_features;
182
183   /// \brief Implementation of the feature list accessor for colvarbias
184   virtual const std::vector<feature *> &features()
185   {
186     return cvb_features;
187   }
188   virtual std::vector<feature *> &modify_features()
189   {
190     return cvb_features;
191   }
192   static void delete_features() {
193     for (size_t i=0; i < cvb_features.size(); i++) {
194       delete cvb_features[i];
195     }
196     cvb_features.clear();
197   }
198
199 protected:
200
201   /// \brief Pointers to collective variables to which the bias is
202   /// applied; current values and metric functions will be obtained
203   /// through each colvar object
204   std::vector<colvar *>    colvars;
205
206   /// \brief Current forces from this bias to the variables
207   std::vector<colvarvalue> colvar_forces;
208
209   /// \brief Forces last applied by this bias to the variables
210   std::vector<colvarvalue> previous_colvar_forces;
211
212   /// \brief Current energy of this bias (colvar_forces should be obtained by deriving this)
213   cvm::real                bias_energy;
214
215   /// Whether to write the current bias energy from this bias to the trajectory file
216   bool                     b_output_energy;
217
218   /// \brief Whether this bias has already accumulated information
219   /// (for history-dependent biases)
220   bool                     has_data;
221
222   /// \brief Step number read from the last state file
223   size_t                   state_file_step;
224
225 };
226
227
228 class colvar_grid_gradient;
229 class colvar_grid_count;
230
231 /// \brief Base class for unconstrained thermodynamic-integration FE estimator
232 class colvarbias_ti : public virtual colvarbias {
233 public:
234
235   colvarbias_ti(char const *key);
236   virtual ~colvarbias_ti();
237
238   virtual int clear_state_data();
239
240   virtual int init(std::string const &conf);
241   virtual int init_grids();
242   virtual int update();
243
244   /// Subtract applied forces (either last forces or argument) from the total
245   /// forces
246   virtual int update_system_forces(std::vector<colvarvalue> const
247                                    *subtract_forces);
248
249   virtual std::string const get_state_params() const;
250   virtual int set_state_params(std::string const &state_conf);
251   virtual std::ostream & write_state_data(std::ostream &os);
252   virtual std::istream & read_state_data(std::istream &is);
253   virtual int write_output_files();
254
255 protected:
256
257   /// \brief Forces exerted from the system to the associated variables
258   std::vector<colvarvalue> ti_system_forces;
259
260   /// Averaged system forces
261   colvar_grid_gradient *ti_avg_forces;
262
263   /// Histogram of sampled data
264   colvar_grid_count *ti_count;
265
266   /// Because total forces may be from the last simulation step,
267   /// store the index of the variables then
268   std::vector<int> ti_bin;
269 };
270
271 #endif