From aacf4cbad219cf0d396809ff9996e93bda2de5b2 Mon Sep 17 00:00:00 2001 From: Chris Maffeo <cmaffeo2@illinois.edu> Date: Fri, 21 Feb 2020 14:03:05 -0600 Subject: [PATCH] Added easy commands for ignoring long bonds during coarse-simulation --- bin/mrdna | 4 +++- mrdna/simulate.py | 27 +++++++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/bin/mrdna b/bin/mrdna index 06fd281..bf47058 100755 --- a/bin/mrdna +++ b/bin/mrdna @@ -53,7 +53,8 @@ parser.add_argument('--oxdna-steps', type=float, default=None, help='Perform an oxDNA simulation instead of creating atomic model') parser.add_argument('--oxdna-output-period', type=float, default=1e4, help='Simulation steps between oxDNA configuration and energy output') - +parser.add_argument('--coarse-bond-cutoff', type=float, default = 0, + help='Ignore bonds beyond this cutoff during first step of simulation; a value of 0 implies bonds are not ignored') parser.add_argument('--backbone-scale', type=float, default=1.0, help='Factor to scale DNA backbone in atomic model; try 0.25 to avoid clashes for atomistic simulations') @@ -155,6 +156,7 @@ def main(): minimization_output_period = int(args.output_period), coarse_local_twist = args.coarse_local_twist, fix_linking_number = args.fix_linking_number, + bond_cutoff = args.coarse_bond_cutoff, coarse_output_period = int(args.output_period), fine_output_period = int(args.output_period), minimization_steps = 0, # int(args.minimization_steps), diff --git a/mrdna/simulate.py b/mrdna/simulate.py index c388a4a..b685098 100644 --- a/mrdna/simulate.py +++ b/mrdna/simulate.py @@ -4,8 +4,22 @@ from .arbdmodel.coords import readArbdCoords, readAvgArbdCoords import shutil from . import get_resource_path +import numpy as np + ## TODO: implement replicas, initial conditions specified through some restart, and a custom simulation schedule +def _remove_bonds_beyond(model, cutoff): + bonds = model.get_bonds() + new_bonds = [] + for bond in bonds: + n1,n2,b,ex = bond + r2 = np.sum( (n1.position - n2.position)**2 ) + if r2 > cutoff**2: + for l in [model] + model.children: + try: + l.bonds.remove(bond) + except: + ... def minimize_and_simulate_oxdna( model, output_name, @@ -61,7 +75,7 @@ def multiresolution_simulation( model, output_name, fine_output_period = 1e5, coarse_local_twist = False, fix_linking_number = False, - remove_long_bonds=False, + bond_cutoff = 0, backbone_scale=1.0, oxdna_steps = None, oxdna_output_period = None, @@ -123,10 +137,11 @@ def multiresolution_simulation( model, output_name, # TODO: add the output directory in to the readArbdCoords functions or make it an attribute of the model object """ Prepare coarse model for minimization and coarse simulation """ - if remove_long_bonds: - raise NotImplementedError("TODO: remove long bonds") model.clear_beads() model.generate_bead_model( **coarse_model_args ) + + if bond_cutoff > 0: + _remove_bonds_beyond(model, bond_cutoff) """ Minimization """ if minimization_steps > 0: @@ -137,11 +152,11 @@ def multiresolution_simulation( model, output_name, """ Coarse simulation """ simargs = dict(timestep=150e-6 if coarse_local_twist else 200e-6, output_period=coarse_output_period, gpu=gpu) - if remove_long_bonds: - run_step(num_steps=0.05*coarse_steps, simargs=simargs) + if bond_cutoff > 0 and minimization_steps <= 0: + run_step(num_steps=0.25*coarse_steps, simargs=simargs) model.clear_beads() model.generate_bead_model( **coarse_model_args ) - run_step(num_steps=0.95*coarse_steps, simargs=simargs) + run_step(num_steps=0.75*coarse_steps, simargs=simargs) else: run_step(num_steps=coarse_steps, simargs=simargs) -- GitLab