NAMD
colvarproxy_namd.h
Go to the documentation of this file.
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 COLVARPROXY_NAMD_H
11 #define COLVARPROXY_NAMD_H
12 
13 #ifndef NAMD_VERSION_NUMBER
14 // Assume 2.14b1 for now until the NAMD macro is merged
15 #define NAMD_VERSION_NUMBER 34471681
16 #endif
17 
19 
20 #include "Vector.h"
21 #include "ResizeArray.h"
22 #include "NamdTypes.h"
23 #include "SimParameters.h"
24 #include "Lattice.h"
25 #include "GlobalMaster.h"
26 #include "Random.h"
27 #include "ConfigList.h"
28 
29 #include "colvarmodule.h"
30 #include "colvarproxy.h"
31 #include "colvarvalue.h"
32 
33 #define GLOBAL_MASTER_CKLOOP_CALC_ITEM 2000
34 #define GLOBAL_MASTER_CKLOOP_CALC_BIASES 2001
35 #define GLOBAL_MASTER_CKLOOP_CALC_SCRIPTED_BIASES 2002
36 
39 class colvarproxy_namd : public colvarproxy, public GlobalMaster {
40 
41 protected:
42 
45  std::vector<int> atoms_map;
46 
49 
52 
55 
57  cvm::step_number previous_NAMD_step;
58 
60 #if !defined (NAMD_UNIFIED_REDUCTION)
61  SubmitReduction *reduction;
62 #endif
63 #if defined(NODEGROUP_FORCE_REGISTER) && !defined(NAMD_UNIFIED_REDUCTION)
64  NodeReduction *nodeReduction;
65 #endif
66 
68  bool accelMDOn;
69  cvm::real amd_weight_factor;
70  void update_accelMD_info();
71 
72 public:
73 
74  void init_tcl_pointers() override;
75 
76  friend class cvm::atom;
77 
80 
81  int setup() override;
82  int reset() override;
83 
86 
88  void init_atoms_map();
89 
90  // synchronize the local arrays with requested or forced atoms
93 
94  void calculate();
95 
96  void log(std::string const &message) override;
97  void error(std::string const &message) override;
98  int set_unit_system(std::string const &units_in, bool check_only) override;
99  void add_energy(cvm::real energy) override;
100  void request_total_force(bool yesno) override;
101 
102  bool total_forces_enabled() const override
103  {
104  return total_force_requested;
105  }
106 
107  int run_force_callback() override;
108  int run_colvar_callback(std::string const &name,
109  std::vector<const colvarvalue *> const &cvcs,
110  colvarvalue &value) override;
111  int run_colvar_gradient_callback(std::string const &name,
112  std::vector<const colvarvalue *> const &cvcs,
113  std::vector<cvm::matrix2d<cvm::real> > &gradient) override;
114 
115  cvm::real rand_gaussian() override
116  {
117  return random.gaussian();
118  }
119 
120  cvm::real get_accelMD_factor() const override {
121  return amd_weight_factor;
122  }
123 
124  bool accelMD_enabled() const override {
125  return accelMDOn;
126  }
127 
128 #if CMK_SMP && USE_CKLOOP
129  colvarproxy::smp_mode_t get_smp_mode() const override;
130 
131  int set_smp_mode(smp_mode_t mode) override;
132 
133  int smp_loop(int n_items, std::function<int (int)> const &worker) override;
134 
135  int smp_biases_loop() override;
136 
137  int smp_biases_script_loop() override;
138 
139  friend void calc_colvars_items_smp(int first, int last, void *result, int paramNum, void *param);
140  friend void calc_cv_biases_smp(int first, int last, void *result, int paramNum, void *param);
141  friend void calc_cv_scripted_forces(int paramNum, void *param);
142 
143  int smp_thread_id()
144  {
145  return CkMyRank();
146  }
147 
148  int smp_num_threads()
149  {
150  return CkMyNodeSize();
151  }
152 
153 protected:
154 
155  CmiNodeLock charm_lock_state;
156 
157 public:
158 
159  int smp_lock()
160  {
161  CmiLock(charm_lock_state);
162  return COLVARS_OK;
163  }
164 
165  int smp_trylock()
166  {
167  const int ret = CmiTryLock(charm_lock_state);
168  if (ret == 0) return COLVARS_OK;
169  else return COLVARS_ERROR;
170  }
171 
172  int smp_unlock()
173  {
174  CmiUnlock(charm_lock_state);
175  return COLVARS_OK;
176  }
177 
178 #endif // #if CMK_SMP && USE_CKLOOP
179 
180  int check_replicas_enabled() override;
181  int replica_index() override;
182  int num_replicas() override;
183  void replica_comm_barrier() override;
184  int replica_comm_recv(char* msg_data, int buf_len, int src_rep) override;
185  int replica_comm_send(char* msg_data, int msg_len, int dest_rep) override;
186 
188  int init_atom(int atom_number) override;
189  int check_atom_id(int atom_number) override;
190  int init_atom(cvm::residue_id const &residue,
191  std::string const &atom_name,
192  std::string const &segment_id) override;
193  int check_atom_id(cvm::residue_id const &residue,
194  std::string const &atom_name,
195  std::string const &segment_id) override;
196  void clear_atom(int index) override;
197 
198  void update_atom_properties(int index);
199 
200  cvm::rvector position_distance(cvm::atom_pos const &pos1,
201  cvm::atom_pos const &pos2) const;
202 
203  int load_atoms_pdb(char const *filename,
204  cvm::atom_group &atoms,
205  std::string const &pdb_field,
206  double const pdb_field_value) override;
207 
208  int load_coords_pdb(char const *filename,
209  std::vector<cvm::atom_pos> &pos,
210  const std::vector<int> &indices,
211  std::string const &pdb_field,
212  double const pdb_field_value) override;
213 
214 
215  int scalable_group_coms() override
216  {
217  return COLVARS_OK;
218  }
219  int init_atom_group(std::vector<int> const &atoms_ids) override;
220  void clear_atom_group(int index) override;
221 
222  int update_group_properties(int index);
223 
224 #if NAMD_VERSION_NUMBER >= 34471681
225 
226  int check_volmaps_available() override;
227 
228  int init_volmap_by_id(int volmap_id) override;
229 
230  int init_volmap_by_name(const char *volmap_name) override;
231 
232  int check_volmap_by_id(int volmap_id) override;
233 
234  int check_volmap_by_name(char const *volmap_name) override;
235 
236  int get_volmap_id_from_name(char const *volmap_name) override;
237 
238  void clear_volmap(int index) override;
239 
240  int compute_volmap(int flags,
241  int volmap_id,
242  cvm::atom_iter atom_begin,
243  cvm::atom_iter atom_end,
244  cvm::real *value,
245  cvm::real *atom_field) override;
246 
248  template<class T>
249  void getGridForceGridValue(int flags,
250  T const *grid,
251  cvm::atom_iter atom_begin,
252  cvm::atom_iter atom_end,
253  cvm::real *value,
254  cvm::real *atom_field);
255 
257  template<class T, int flags>
258  void GridForceGridLoop(T const *g,
259  cvm::atom_iter atom_begin,
260  cvm::atom_iter atom_end,
261  cvm::real *value,
262  cvm::real *atom_field);
263 
264 #endif
265 
266  std::ostream &output_stream(std::string const &output_name,
267  std::string const description) override;
268 
269  int flush_output_stream(std::string const &output_name) override;
270 
271  int flush_output_streams() override;
272 
273  int close_output_stream(std::string const &output_name) override;
274 
275  int close_output_streams() override;
276 
277  int backup_file(char const *filename) override;
278 
280  int get_alch_lambda(cvm::real* lambda);
281 
283  int send_alch_lambda(void);
284 
286  int request_alch_energy_freq(int const freq);
287 
289  int get_dE_dlambda(cvm::real* dE_dlambda);
290 
291 };
292 
293 
294 #endif
int check_volmaps_available() override
std::ostream & output_stream(std::string const &output_name, std::string const description) override
void clear_atom_group(int index) override
int get_volmap_id_from_name(char const *volmap_name) override
void clear_volmap(int index) override
void getGridForceGridValue(int flags, T const *grid, cvm::atom_iter atom_begin, cvm::atom_iter atom_end, cvm::real *value, cvm::real *atom_field)
Abstraction of the two types of NAMD volumetric maps.
SimParameters * simparams
Pointer to the NAMD simulation input object.
Random random
NAMD-style PRNG object.
int init_atom_group(std::vector< int > const &atoms_ids) override
int compute_volmap(int flags, int volmap_id, cvm::atom_iter atom_begin, cvm::atom_iter atom_end, cvm::real *value, cvm::real *atom_field) override
int set_unit_system(std::string const &units_in, bool check_only) override
BigReal gaussian(void)
Definition: Random.h:116
void error(std::string const &message) override
int replica_comm_send(char *msg_data, int msg_len, int dest_rep) override
int init_atom(int atom_number) override
bool accelMD_enabled() const override
Communication between colvars and NAMD (implementation of colvarproxy)
Controller const * controller
Pointer to Controller object.
int init_volmap_by_id(int volmap_id) override
int check_volmap_by_name(char const *volmap_name) override
void clear_atom(int index) override
cvm::real amd_weight_factor
int get_alch_lambda(cvm::real *lambda)
Get value of alchemical lambda parameter from back-end.
void GridForceGridLoop(T const *g, cvm::atom_iter atom_begin, cvm::atom_iter atom_end, cvm::real *value, cvm::real *atom_field)
Implementation of inner loop; allows for atom list computation and use.
cvm::step_number previous_NAMD_step
cvm::real get_accelMD_factor() const override
int update_target_temperature()
Get the target temperature from the NAMD thermostats supported so far.
void request_total_force(bool yesno) override
int setup() override
int init_volmap_by_name(const char *volmap_name) override
int check_atom_id(int atom_number) override
int run_colvar_gradient_callback(std::string const &name, std::vector< const colvarvalue *> const &cvcs, std::vector< cvm::matrix2d< cvm::real > > &gradient) override
std::vector< int > atoms_map
Array of atom indices (relative to the colvarproxy arrays), usedfor faster copy of atomic data...
int check_atom_name_selections_available() override
Definition: Random.h:37
void log(std::string const &message) override
int request_alch_energy_freq(int const freq)
Request energy computation every freq steps.
bool accelMDOn
Used to submit restraint energy as MISC.
const AtomID * const_iterator
Definition: ResizeArray.h:38
int backup_file(char const *filename) override
int load_atoms_pdb(char const *filename, cvm::atom_group &atoms, std::string const &pdb_field, double const pdb_field_value) override
void init_atoms_map()
Allocate an atoms map with the same size as the NAMD topology.
int flush_output_streams() override
friend class cvm::atom
int reset() override
void replica_comm_barrier() override
int send_alch_lambda(void)
Set value of alchemical lambda parameter in back-end.
int check_replicas_enabled() override
int close_output_stream(std::string const &output_name) override
int replica_index() override
bool total_forces_enabled() const override
int update_group_properties(int index)
int flush_output_stream(std::string const &output_name) override
void init_tcl_pointers() override
void update_atom_properties(int index)
cvm::rvector position_distance(cvm::atom_pos const &pos1, cvm::atom_pos const &pos2) const
int check_volmap_by_id(int volmap_id) override
void add_energy(cvm::real energy) override
int get_dE_dlambda(cvm::real *dE_dlambda)
Get energy derivative with respect to lambda.
int close_output_streams() override
int scalable_group_coms() override
int run_colvar_callback(std::string const &name, std::vector< const colvarvalue *> const &cvcs, colvarvalue &value) override
int num_replicas() override
int run_force_callback() override
int replica_comm_recv(char *msg_data, int buf_len, int src_rep) override
int update_atoms_map(AtomIDList::const_iterator begin, AtomIDList::const_iterator end)
int load_coords_pdb(char const *filename, std::vector< cvm::atom_pos > &pos, const std::vector< int > &indices, std::string const &pdb_field, double const pdb_field_value) override
cvm::real rand_gaussian() override