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
0 commit comments