Skip to content

Commit 6f1ab53

Browse files
giacomofiorinjhenin
authored andcommitted
Use smart pointers to manage metadynamics grid data
1 parent aa5af96 commit 6f1ab53

File tree

2 files changed

+46
-47
lines changed

2 files changed

+46
-47
lines changed

src/colvarbias_meta.cpp

+40-42
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "colvarmodule.h"
1515
#include "colvarproxy.h"
1616
#include "colvar.h"
17+
#include "colvargrid.h"
1718
#include "colvarbias_meta.h"
1819
#include "colvars_memstream.h"
1920

@@ -31,8 +32,6 @@ colvarbias_meta::colvarbias_meta(char const *key)
3132
use_grids = true;
3233
grids_freq = 0;
3334
rebin_grids = false;
34-
hills_energy = NULL;
35-
hills_energy_gradients = NULL;
3635

3736
dump_fes = true;
3837
keep_hills = false;
@@ -143,9 +142,9 @@ int colvarbias_meta::init(std::string const &conf)
143142
get_keyval(conf, "keepHills", keep_hills, keep_hills);
144143
get_keyval(conf, "keepFreeEnergyFiles", dump_fes_save, dump_fes_save);
145144

146-
if (hills_energy == NULL) {
147-
hills_energy = new colvar_grid_scalar(colvars);
148-
hills_energy_gradients = new colvar_grid_gradient(colvars);
145+
if (!hills_energy) {
146+
hills_energy.reset(new colvar_grid_scalar(colvars));
147+
hills_energy_gradients.reset(new colvar_grid_gradient(colvars));
149148
}
150149

151150
} else {
@@ -254,7 +253,6 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf)
254253
{
255254
int error_code = COLVARS_OK;
256255
// for ebmeta
257-
target_dist = NULL;
258256
get_keyval(conf, "ebMeta", ebmeta, false);
259257
if(ebmeta){
260258
cvm::main()->cite_feature("Ensemble-biased metadynamics (ebMetaD)");
@@ -265,7 +263,7 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf)
265263
"targetDistFile accordingly.\n",
266264
COLVARS_INPUT_ERROR);
267265
}
268-
target_dist = new colvar_grid_scalar();
266+
target_dist.reset(new colvar_grid_scalar());
269267
error_code |= target_dist->init_from_colvars(colvars);
270268
std::string target_dist_file;
271269
get_keyval(conf, "targetDistFile", target_dist_file);
@@ -523,10 +521,8 @@ int colvarbias_meta::update_grid_params()
523521
new_hills_energy->map_grid(*hills_energy);
524522
new_hills_energy_gradients->map_grid(*hills_energy_gradients);
525523

526-
delete hills_energy;
527-
delete hills_energy_gradients;
528-
hills_energy = new_hills_energy;
529-
hills_energy_gradients = new_hills_energy_gradients;
524+
hills_energy.reset(new_hills_energy);
525+
hills_energy_gradients.reset(new_hills_energy_gradients);
530526

531527
curr_bin = hills_energy->get_colvars_index();
532528
if (cvm::debug())
@@ -1061,8 +1057,8 @@ int colvarbias_meta::update_replicas_registry()
10611057
(replicas.back())->comm = multiple_replicas;
10621058

10631059
if (use_grids) {
1064-
(replicas.back())->hills_energy = new colvar_grid_scalar(colvars);
1065-
(replicas.back())->hills_energy_gradients = new colvar_grid_gradient(colvars);
1060+
(replicas.back())->hills_energy.reset(new colvar_grid_scalar(colvars));
1061+
(replicas.back())->hills_energy_gradients.reset(new colvar_grid_gradient(colvars));
10661062
}
10671063
if (is_enabled(f_cvb_calc_ti_samples)) {
10681064
(replicas.back())->enable(f_cvb_calc_ti_samples);
@@ -1319,34 +1315,40 @@ template <typename IST> IST &colvarbias_meta::read_state_data_template_(IST &is)
13191315
{
13201316
if (use_grids) {
13211317

1322-
colvar_grid_scalar *hills_energy_backup = NULL;
1323-
colvar_grid_gradient *hills_energy_gradients_backup = NULL;
1318+
std::unique_ptr<colvar_grid_scalar> hills_energy_backup;
1319+
std::unique_ptr<colvar_grid_gradient> hills_energy_gradients_backup;
13241320

1325-
if (has_data) {
1321+
bool const need_backup = has_data;
1322+
1323+
if (need_backup) {
13261324
if (cvm::debug())
1327-
cvm::log("Backupping grids for metadynamics bias \""+
1328-
this->name+"\""+
1329-
((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n");
1330-
hills_energy_backup = hills_energy;
1331-
hills_energy_gradients_backup = hills_energy_gradients;
1332-
hills_energy = new colvar_grid_scalar(colvars);
1333-
hills_energy_gradients = new colvar_grid_gradient(colvars);
1325+
cvm::log("Backing up grids for metadynamics bias \"" + this->name + "\"" +
1326+
((comm != single_replica) ? ", replica \"" + replica_id + "\"" : "") + ".\n");
1327+
1328+
hills_energy_backup = std::move(hills_energy);
1329+
hills_energy_gradients_backup = std::move(hills_energy_gradients);
1330+
hills_energy.reset(new colvar_grid_scalar(colvars));
1331+
hills_energy_gradients.reset(new colvar_grid_gradient(colvars));
13341332
}
13351333

1336-
read_grid_data_template_<IST, colvar_grid_scalar>(is, "hills_energy", hills_energy,
1337-
hills_energy_backup);
1334+
read_grid_data_template_<IST, colvar_grid_scalar>(is, "hills_energy", hills_energy.get(),
1335+
hills_energy_backup.get());
13381336

1339-
read_grid_data_template_<IST, colvar_grid_gradient>(
1340-
is, "hills_energy_gradients", hills_energy_gradients, hills_energy_gradients_backup);
1337+
read_grid_data_template_<IST, colvar_grid_gradient>(is, "hills_energy_gradients",
1338+
hills_energy_gradients.get(),
1339+
hills_energy_gradients_backup.get());
13411340

13421341
if (is) {
13431342
cvm::log(" successfully read the biasing potential and its gradients from grids.\n");
1344-
if (hills_energy_backup != nullptr) {
1345-
// Now that we have successfully updated the grids, delete the backup copies
1346-
delete hills_energy_backup;
1347-
delete hills_energy_gradients_backup;
1348-
}
13491343
} else {
1344+
if (need_backup) {
1345+
if (cvm::debug())
1346+
cvm::log("Restoring grids from backup for metadynamics bias \"" + this->name + "\"" +
1347+
((comm != single_replica) ? ", replica \"" + replica_id + "\"" : "") + ".\n");
1348+
// Restoring content from original grid
1349+
hills_energy->copy_grid(*hills_energy_backup);
1350+
hills_energy_gradients->copy_grid(*hills_energy_gradients_backup);
1351+
}
13501352
return is;
13511353
}
13521354
}
@@ -1434,10 +1436,8 @@ void colvarbias_meta::rebin_grids_after_restart()
14341436
// read from the configuration file), and project onto them the
14351437
// grids just read from the restart file
14361438

1437-
colvar_grid_scalar *new_hills_energy =
1438-
new colvar_grid_scalar(colvars);
1439-
colvar_grid_gradient *new_hills_energy_gradients =
1440-
new colvar_grid_gradient(colvars);
1439+
std::unique_ptr<colvar_grid_scalar> new_hills_energy(new colvar_grid_scalar(colvars));
1440+
std::unique_ptr<colvar_grid_gradient> new_hills_energy_gradients(new colvar_grid_gradient(colvars));
14411441

14421442
if (cvm::debug()) {
14431443
std::ostringstream tmp_os;
@@ -1464,15 +1464,13 @@ void colvarbias_meta::rebin_grids_after_restart()
14641464
new_hills_energy_gradients->map_grid(*hills_energy_gradients);
14651465
}
14661466

1467-
delete hills_energy;
1468-
delete hills_energy_gradients;
1469-
hills_energy = new_hills_energy;
1470-
hills_energy_gradients = new_hills_energy_gradients;
1467+
hills_energy = std::move(new_hills_energy);
1468+
hills_energy_gradients = std::move(new_hills_energy_gradients);
14711469

14721470
// assuming that some boundaries have expanded, eliminate those
14731471
// off-grid hills that aren't necessary any more
14741472
if (!hills.empty())
1475-
recount_hills_off_grid(hills.begin(), hills.end(), hills_energy);
1473+
recount_hills_off_grid(hills.begin(), hills.end());
14761474
}
14771475
}
14781476

@@ -1813,7 +1811,7 @@ template <typename OST> OST &colvarbias_meta::write_state_data_template_(OST &os
18131811

18141812
// this is a very good time to project hills, if you haven't done
18151813
// it already!
1816-
project_hills(new_hills_begin, hills.end(), hills_energy, hills_energy_gradients);
1814+
project_hills(new_hills_begin, hills.end(), hills_energy.get(), hills_energy_gradients.get());
18171815
new_hills_begin = hills.end();
18181816

18191817
// write down the grids to the restart file

src/colvarbias_meta.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
#ifndef COLVARBIAS_META_H
1111
#define COLVARBIAS_META_H
1212

13-
#include <vector>
14-
#include <list>
1513
#include <iosfwd>
14+
#include <list>
15+
#include <memory>
16+
#include <vector>
1617

1718
#include "colvarbias.h"
1819

@@ -213,7 +214,7 @@ class colvarbias_meta
213214
bool ebmeta;
214215

215216
/// Target distribution for EBmeta
216-
std::shared_ptr<colvar_grid_scalar> target_dist;
217+
std::unique_ptr<colvar_grid_scalar> target_dist;
217218

218219
/// Number of equilibration steps for EBmeta
219220
cvm::step_number ebmeta_equil_steps;
@@ -225,10 +226,10 @@ class colvarbias_meta
225226
bool safely_read_restart;
226227

227228
/// Hill energy, cached on a grid
228-
std::shared_ptr<colvar_grid_scalar> hills_energy;
229+
std::unique_ptr<colvar_grid_scalar> hills_energy;
229230

230231
/// Hill forces, cached on a grid
231-
std::shared_ptr<colvar_grid_gradient> hills_energy_gradients;
232+
std::unique_ptr<colvar_grid_gradient> hills_energy_gradients;
232233

233234
/// Project the selected hills onto grids
234235
void project_hills(hill_iter h_first, hill_iter h_last, colvar_grid_scalar *ge,

0 commit comments

Comments
 (0)