Skip to content

Commit 010d8a4

Browse files
fabsugargiacomofiorin
authored andcommitted
Modified implementation of interval in calc_energy and calc_forces
by using get_colvar_index_bound to treat vaules out of the boundary (which are projected inside the closest boundary). Additionally curr_values are now defined as a general variable to avoid define a new variable every time functions are called
1 parent 59c0047 commit 010d8a4

3 files changed

Lines changed: 33 additions & 63 deletions

File tree

src/colvarbias_meta.cpp

Lines changed: 19 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,11 @@ int colvarbias_meta::init_interval_params(std::string const &conf)
569569
std::vector<int> interval_ulimit_cv;
570570
size_t i;
571571
size_t j;
572+
// allocate accessory variable of colvar values to be used in energy and forces calculation
573+
curr_values.resize(num_variables());
574+
for (i = 0; i < num_variables(); i++) {
575+
curr_values[i].type(variables(i)->value());
576+
}
572577

573578
if (get_keyval(conf, "useHillsInterval", use_interval, use_interval)) {
574579
if (use_interval) {
@@ -1220,11 +1225,7 @@ int colvarbias_meta::calc_energy(std::vector<colvarvalue> const *values)
12201225

12211226
size_t i;
12221227
int ii;
1223-
cvm::real up_bound_bin_value;
1224-
std::vector<colvarvalue> curr_values(num_variables());
1225-
for (i = 0; i < num_variables(); i++) {
1226-
curr_values[i].type(variables(i)->value());
1227-
}
1228+
std::vector<int> curr_bin;
12281229

12291230
curr_values = values ? *values : colvar_values;
12301231

@@ -1235,25 +1236,19 @@ int colvarbias_meta::calc_energy(std::vector<colvarvalue> const *values)
12351236
curr_values[i]=interval_llimit[ii];
12361237
}
12371238
ii=which_int_ulimit_cv[i];
1238-
if (ii>-1 && curr_values[i]>=interval_ulimit[ii] ) {
1239-
// check if upper border is out of the grid otherwise put it back on the grid
1240-
up_bound_bin_value=hills_energy->lower_boundaries[i].real_value+variables(i)->width*(0.5+cvm::floor((interval_ulimit[ii]-hills_energy->lower_boundaries[i].real_value)/variables(i)->width));
1241-
//if (interval_ulimit[ii]==hills_energy->upper_boundaries[i].real_value){
1242-
if (up_bound_bin_value>hills_energy->upper_boundaries[i].real_value) {
1243-
curr_values[i]=interval_ulimit[ii]-0.5*(variables(i)->width); // upper border is out of grid; in this way is in
1244-
} else {
1245-
curr_values[i]=interval_ulimit[ii];
1246-
}
1239+
if (ii>-1 && curr_values[i]>interval_ulimit[ii] ) {
1240+
curr_values[i]=interval_ulimit[ii];
12471241
}
12481242
}
1243+
curr_bin = hills_energy->get_colvars_index_bound(curr_values);
1244+
} else {
1245+
curr_bin = hills_energy->get_colvars_index(curr_values);
12491246
}
12501247

12511248
for (ir = 0; ir < replicas.size(); ir++) {
12521249
replicas[ir]->bias_energy = 0.0;
12531250
}
12541251

1255-
std::vector<int> const curr_bin = hills_energy->get_colvars_index(curr_values);
1256-
12571252
if (hills_energy->index_ok(curr_bin)) {
12581253
// index is within the grid: get the energy from there
12591254
for (ir = 0; ir < replicas.size(); ir++) {
@@ -1282,20 +1277,6 @@ int colvarbias_meta::calc_energy(std::vector<colvarvalue> const *values)
12821277
// now include the hills that have not been binned yet (starting
12831278
// from new_hills_begin)
12841279

1285-
if (use_interval) {
1286-
curr_values = values ? *values : colvar_values;
1287-
for (i = 0; i < num_variables(); i++) {
1288-
ii=which_int_llimit_cv[i];
1289-
if (ii>-1 && curr_values[i]<interval_llimit[ii] ) {
1290-
curr_values[i]=interval_llimit[ii];
1291-
}
1292-
ii=which_int_ulimit_cv[i];
1293-
if (ii>-1 && curr_values[i]>interval_ulimit[ii] ) {
1294-
curr_values[i]=interval_ulimit[ii];
1295-
}
1296-
}
1297-
}
1298-
12991280
for (ir = 0; ir < replicas.size(); ir++) {
13001281
calc_hills(replicas[ir]->new_hills_begin,
13011282
replicas[ir]->hills.end(),
@@ -1314,11 +1295,7 @@ int colvarbias_meta::calc_forces(std::vector<colvarvalue> const *values)
13141295
{
13151296
size_t ir = 0, ic = 0;
13161297
int ii;
1317-
cvm::real up_bound_bin_value;
1318-
std::vector<colvarvalue> curr_values(num_variables());
1319-
for (ic = 0; ic < num_variables(); ic++) {
1320-
curr_values[ic].type(variables(ic)->value());
1321-
}
1298+
std::vector<int> curr_bin;
13221299
curr_values = values ? *values : colvar_values;
13231300
std::vector<bool> add_force(num_variables());
13241301
for (ir = 0; ir < replicas.size(); ir++) {
@@ -1338,20 +1315,18 @@ int colvarbias_meta::calc_forces(std::vector<colvarvalue> const *values)
13381315
}
13391316
ii=which_int_ulimit_cv[ic];
13401317
if (ii>-1) {
1341-
if ( curr_values[ic]>=interval_ulimit[ii] ) {
1318+
if ( curr_values[ic]>interval_ulimit[ii] ) {
13421319
add_force[ic]=false;
1343-
up_bound_bin_value=hills_energy->lower_boundaries[ic].real_value+variables(ic)->width*(0.5+cvm::floor((interval_ulimit[ii]-hills_energy->lower_boundaries[ic].real_value)/variables(ic)->width));
1344-
//if (interval_ulimit[ii]==hills_energy->upper_boundaries[ic].real_value){
1345-
if (up_bound_bin_value>hills_energy->upper_boundaries[ic].real_value) {
1346-
curr_values[ic]=interval_ulimit[ii]-0.5*(variables(ic)->width); // upper border is out of grid; in this way is in
1347-
} else {
1348-
curr_values[ic]=interval_ulimit[ii];
1349-
}
1320+
curr_values[ic]=interval_ulimit[ii];
13501321
}
13511322
}
13521323
}
13531324

1354-
std::vector<int> const curr_bin = hills_energy->get_colvars_index(curr_values);
1325+
if (use_interval) {
1326+
curr_bin = hills_energy->get_colvars_index_bound(curr_values);
1327+
} else {
1328+
curr_bin = hills_energy->get_colvars_index(curr_values);
1329+
}
13551330

13561331
if (hills_energy->index_ok(curr_bin)) {
13571332
for (ir = 0; ir < replicas.size(); ir++) {
@@ -1381,25 +1356,6 @@ int colvarbias_meta::calc_forces(std::vector<colvarvalue> const *values)
13811356
// now include the hills that have not been binned yet (starting
13821357
// from new_hills_begin)
13831358

1384-
if (use_interval) {
1385-
curr_values = values ? *values : colvar_values;
1386-
for (ic = 0; ic < num_variables(); ic++) {
1387-
ii=which_int_llimit_cv[ic];
1388-
if (ii>-1) {
1389-
if ( curr_values[ic]<interval_llimit[ii] ) {
1390-
curr_values[ic]=interval_llimit[ii];
1391-
}
1392-
}
1393-
ii=which_int_ulimit_cv[ic];
1394-
if (ii>-1) {
1395-
if ( curr_values[ic]>interval_ulimit[ii] ) {
1396-
curr_values[ic]=interval_ulimit[ii];
1397-
}
1398-
}
1399-
}
1400-
}
1401-
1402-
14031359
if (cvm::debug()) {
14041360
cvm::log("Metadynamics bias \""+this->name+"\""+
14051361
((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+

src/colvarbias_meta.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ class colvarbias_meta
221221
std::vector<cvm::real> interval_llimit;
222222
std::vector<cvm::real> interval_ulimit;
223223

224+
/// \brief Current value of colvars to be modifed for calculation of energy and forces with interval
225+
std::vector<colvarvalue> curr_values;
226+
224227
/// Ensemble-biased metadynamics (EBmeta) flag
225228
bool ebmeta;
226229

src/colvargrid.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,17 @@ template <class T> class colvar_grid : public colvarparse {
625625

626626
/// \brief Get the bin indices corresponding to the provided values of
627627
/// the colvars and assign first or last bin if out of boundaries
628+
inline std::vector<int> const get_colvars_index_bound(std::vector<colvarvalue> const &values) const
629+
{
630+
std::vector<int> index = new_index();
631+
for (size_t i = 0; i < nd; i++) {
632+
index[i] = value_to_bin_scalar_bound(values[i], i);
633+
}
634+
return index;
635+
}
636+
637+
/// \brief Get the bin indices corresponding to the current values of
638+
/// the colvars and assign first or last bin if out of boundaries
628639
inline std::vector<int> const get_colvars_index_bound() const
629640
{
630641
std::vector<int> index = new_index();

0 commit comments

Comments
 (0)