Update Colvars to version 2018-12-14
[namd.git] / colvars / src / colvarbias_abf.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_ABF_H
11 #define COLVARBIAS_ABF_H
12
13 #include <vector>
14 #include <list>
15 #include <sstream>
16 #include <iomanip>
17
18 #include "colvarbias.h"
19 #include "colvargrid.h"
20 #include "colvar_UIestimator.h"
21
22 typedef cvm::real* gradient_t;
23
24
25 /// ABF bias
26 class colvarbias_abf : public colvarbias {
27
28 public:
29
30   colvarbias_abf(char const *key);
31   virtual int init(std::string const &conf);
32   virtual ~colvarbias_abf();
33   virtual int update();
34
35 private:
36
37   /// Filename prefix for human-readable gradient/sample count output
38   std::string  output_prefix;
39
40   /// Base filename(s) for reading previous gradient data (replaces data from restart file)
41   std::vector<std::string> input_prefix;
42
43   bool    update_bias;
44   bool    hide_Jacobian;
45   bool    b_integrate;
46
47   size_t  full_samples;
48   size_t  min_samples;
49   /// frequency for updating output files
50   int     output_freq;
51   /// Write combined files with a history of all output data?
52   bool    b_history_files;
53   /// Write CZAR output file for stratified eABF (.zgrad)
54   bool    b_czar_window_file;
55   size_t  history_freq;
56   /// Umbrella Integration estimator of free energy from eABF
57   UIestimator::UIestimator eabf_UI;
58   /// Run UI estimator?
59   bool  b_UI_estimator;
60   /// Run CZAR estimator?
61   bool  b_CZAR_estimator;
62
63   /// Frequency for updating pABF PMF (if zero, pABF is not used)
64   int   pabf_freq;
65   /// Max number of CG iterations for integrating PMF at startup and for file output
66   int       integrate_initial_steps;
67   /// Tolerance for integrating PMF at startup and for file output
68   cvm::real integrate_initial_tol;
69   /// Max number of CG iterations for integrating PMF at on-the-fly pABF updates
70   int       integrate_steps;
71   /// Tolerance for integrating PMF at on-the-fly pABF updates
72   cvm::real integrate_tol;
73
74   /// Cap the biasing force to be applied?
75   bool                    cap_force;
76   std::vector<cvm::real>  max_force;
77
78   // Frequency for updating 2D gradients
79   int integrate_freq;
80
81   // Internal data and methods
82
83   std::vector<int>  bin, force_bin, z_bin;
84   gradient_t    system_force, applied_force;
85
86   /// n-dim grid of free energy gradients
87   colvar_grid_gradient  *gradients;
88   /// n-dim grid of number of samples
89   colvar_grid_count     *samples;
90   /// n-dim grid of pmf (dimension 1 to 3)
91   integrate_potential   *pmf;
92   /// n-dim grid: average force on "real" coordinate for eABF z-based estimator
93   colvar_grid_gradient  *z_gradients;
94   /// n-dim grid of number of samples on "real" coordinate for eABF z-based estimator
95   colvar_grid_count     *z_samples;
96   /// n-dim grid contining CZAR estimator of "real" free energy gradients
97   colvar_grid_gradient  *czar_gradients;
98   /// n-dim grid of CZAR pmf (dimension 1 to 3)
99   integrate_potential   *czar_pmf;
100
101   inline int update_system_force(size_t i)
102   {
103     if (colvars[i]->is_enabled(f_cv_subtract_applied_force)) {
104       // this colvar is already subtracting the ABF force
105       system_force[i] = colvars[i]->total_force().real_value;
106     } else {
107       system_force[i] = colvars[i]->total_force().real_value
108         - colvar_forces[i].real_value;
109     }
110     if (cvm::debug())
111       cvm::log("ABF System force calc: cv " + cvm::to_str(i) +
112                " fs " + cvm::to_str(system_force[i]) +
113                " = ft " + cvm::to_str(colvars[i]->total_force().real_value) +
114                " - fa " + cvm::to_str(colvar_forces[i].real_value));
115     return COLVARS_OK;
116   }
117
118   // shared ABF
119   bool    shared_on;
120   size_t  shared_freq;
121   int     shared_last_step;
122   // Share between replicas -- may be called independently of update
123   virtual int replica_share();
124
125   // Store the last set for shared ABF
126   colvar_grid_gradient  *last_gradients;
127   colvar_grid_count     *last_samples;
128
129   // For Tcl implementation of selection rules.
130   /// Give the total number of bins for a given bias.
131   virtual int bin_num();
132   /// Calculate the bin index for a given bias.
133   virtual int current_bin();
134   //// Give the count at a given bin index.
135   virtual int bin_count(int bin_index);
136
137   /// Write human-readable FE gradients and sample count, and DX file in dim > 2
138   void write_gradients_samples(const std::string &prefix, bool append = false);
139
140   /// Read human-readable FE gradients and sample count (if not using restart)
141   void read_gradients_samples();
142
143   virtual std::istream& read_state_data(std::istream&);
144   virtual std::ostream& write_state_data(std::ostream&);
145   virtual int write_output_files();
146 };
147
148 #endif
149