Molecular dynamics in parallel
Dear staff,
I would like to run MD simulations in parallel using ASE. I have the initial configuration in xyz and the model.json (built from rascal of COSMO lab) for the potentials, but due to the system size, the MD simulations are very slow. I was wondering if it is possible to run MD in parallel (also in few processors) and how to do it. If I do mpirun -np N python script.py, I got N replicas of the same simulation and not a parallelization.
I have the following script to perform MD:
from matplotlib import pylab as plt
import time
import rascal
import json
import ase
from ase.io import read, write
from ase.build import make_supercell
from ase.visualize import view
import numpy as np
from rascal.representations import SphericalInvariants
from rascal.models import Kernel, train_gap_model, compute_KNM
from rascal.models.asemd import ASEMLCalculator
from rascal.utils import from_dict, to_dict, CURFilter, dump_obj, load_obj, get_score, print_score
from ase.parallel import world
import skmatter
model = load_obj('mymodel.json')
from ase.md import MDLogger
from ase.md.nvtberendsen import NVTBerendsen
from ase import units
from ase.io.trajectory import Trajectory
from ase.md.velocitydistribution import MaxwellBoltzmannDistribution
from ase.io import read,write
from rascal.models.asemd import ASEMLCalculator
from ase import Atoms
from ase.optimize import BFGS
from ase.calculators.emt import EMT
from ase.build import make_supercell
from ase.geometry.analysis import Analysis
url = 'file:///path_to_conf/conf.xyz'
structures_fn, headers = urllib.request.urlretrieve(url)
structures_fn
soap = model.get_representation_calculator()
calc = ASEMLCalculator(model, soap)
deltat = 0.5
replicas = 100
dump=10
atoms = read(structures_fn, 0)
struct = Atoms(atoms,calculator=calc)
T = 300
steps = 10000
sim_time = round(steps * deltat * units.fs / 1000,3)
MaxwellBoltzmannDistribution(atoms,temperature_K = T)
print(T*units.kB,T)
atoms.set_calculator(calc)
traj = Trajectory(filename, mode='w', atoms=atoms, master=None)
dyn = NVTBerendsen(atoms, deltat * units.fs, temperature_K=T,taut=0.5*1000*units.fs)
dyn.attach(MDLogger(dyn, atoms, log_fn, header=True, stress=False,
peratom=False, mode="w"), interval=50)
dyn.attach(traj.write, interval=10)
dyn.run(steps)
Edited by Adam Jackson