@@ -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+" \" " : " " )+
0 commit comments