class VelocityVerlet_QMMM(MolecularDynamics): """ VelocityVerlet_QMMM(self, mol_qm, mol_mm, pot_qm, pot_mm, pot_qmmm, dt, nstep, \ restart, check_mdstop_dispersion, tlim) ** This is performing QM/MM MD-Simulation. The necessary arguments are alomost same with the above. However, when you put the molecule and potential instance, you must separate QM and MM parts. And, you must add the pot_qmmm instnace, which handles the QM/MM interface. """ def __init__(self, mol, mol_mm, pot, pot_mm, pot_qmmm, dt, nstep, \ restart=False, check_mdstop_dispersion = False, limit_dispersion = 20.0,tlim = float('inf')): MolecularDynamics.__init__(self, mol, pot, dt, nstep, restart, check_mdstop_dispersion, limit_dispersion, tlim) self.mol_mm = mol_mm self.pot_mm = pot_mm self.pot_qmmm = pot_qmmm #print "position-3" #print self.mol_mm.get_positions() #print self.pot_mm.get_check_pbc if self.pot_mm.get_check_pbc(): self.mol_mm.set_positions(self.pot_mm.get_pbc_adjusted(self.mol_mm.get_positions())) self.count = 0 self.nrange = self.pot.get_nrange() self.setup_output() #print "position-2" #print self.mol_mm.get_positions() def run(self): self.pot.calc(); self.pot_mm.calc(); self.pot_qmmm.calc() #print "position-1" #print self.mol_mm.get_positions() #this is for logging at initial point self.woutp.logging(self) # loop for MD while self.count < self.step: self.count += 1 self.step() self.woutp.logging(self) self.mdstop_time_trans() if self.mdstop_time_trans(): break if self.check_mdstop_dispersion and self.mdstop_atom_dispersion(): break self.pot.remove_outputs() self.woutp.finalize(self) def setup_output(self): self.woutp = WriteOutputMD_QMMM() self.woutp.start(self) if self.restart: self.woutp.restart(self) def step(self): #print "position0" #print self.mol_mm.get_positions() dt = self.dt get_accelerations_save = self.mol.get_accelerations() self.mol.set_positions(self.mol.get_positions() + \ self.mol.get_velocities() * dt + 0.5 * \ get_accelerations_save * dt * dt) get_accelerations_save_mm = self.mol_mm.get_accelerations() #print "position1" #print self.mol_mm.get_positions() positions_mm = self.mol_mm.get_positions() + \ self.mol_mm.get_velocities() * dt + 0.5 * \ get_accelerations_save_mm * dt * dt #print "position2" #print self.mol_mm.get_positions() if self.pot_mm.get_check_pbc(): self.mol_mm.set_positions(self.pot_mm.get_pbc_adjusted(positions_mm)) else: self.mol_mm.set_positions(positions_mm) self.pot.calc(); self.pot_mm.calc(); self.pot_qmmm.calc() self.mol.set_velocities(self.mol.get_velocities() + \ 0.5 * (self.mol.get_accelerations() + \ get_accelerations_save) * dt) self.mol_mm.set_velocities(self.mol_mm.get_velocities() + \ 0.5 * (self.mol_mm.get_accelerations() + \ get_accelerations_save_mm) * dt) self.elaptime += dt
class VelocityVerlet_QMMM(MolecularDynamics): """ VelocityVerlet_QMMM(self, mol_qm, mol_mm, pot_qm, pot_mm, pot_qmmm, dt, nstep, \ restart, check_mdstop_dispersion, tlim) ** This is performing QM/MM MD-Simulation. The necessary arguments are alomost same with the above. However, when you put the molecule and potential instance, you must separate QM and MM parts. And, you must add the pot_qmmm instnace, which handles the QM/MM interface. """ def __init__(self, mol, mol_mm, pot, pot_mm, pot_qmmm, dt, nstep, \ restart=False, check_mdstop_dispersion = False, limit_dispersion = 20.0,tlim = float('inf')): MolecularDynamics.__init__(self, mol, pot, dt, nstep, restart, check_mdstop_dispersion, limit_dispersion, tlim) self.mol_mm = mol_mm self.pot_mm = pot_mm self.pot_qmmm = pot_qmmm #print "position-3" #print self.mol_mm.get_positions() #print self.pot_mm.get_check_pbc if self.pot_mm.get_check_pbc(): self.mol_mm.set_positions( self.pot_mm.get_pbc_adjusted(self.mol_mm.get_positions())) self.count = 0 self.nrange = self.pot.get_nrange() self.setup_output() #print "position-2" #print self.mol_mm.get_positions() def run(self): self.pot.calc() self.pot_mm.calc() self.pot_qmmm.calc() #print "position-1" #print self.mol_mm.get_positions() #this is for logging at initial point self.woutp.logging(self) # loop for MD while self.count < self.step: self.count += 1 self.step() self.woutp.logging(self) self.mdstop_time_trans() if self.mdstop_time_trans(): break if self.check_mdstop_dispersion and self.mdstop_atom_dispersion(): break self.pot.remove_outputs() self.woutp.finalize(self) def setup_output(self): self.woutp = WriteOutputMD_QMMM() self.woutp.start(self) if self.restart: self.woutp.restart(self) def step(self): #print "position0" #print self.mol_mm.get_positions() dt = self.dt get_accelerations_save = self.mol.get_accelerations() self.mol.set_positions(self.mol.get_positions() + \ self.mol.get_velocities() * dt + 0.5 * \ get_accelerations_save * dt * dt) get_accelerations_save_mm = self.mol_mm.get_accelerations() #print "position1" #print self.mol_mm.get_positions() positions_mm = self.mol_mm.get_positions() + \ self.mol_mm.get_velocities() * dt + 0.5 * \ get_accelerations_save_mm * dt * dt #print "position2" #print self.mol_mm.get_positions() if self.pot_mm.get_check_pbc(): self.mol_mm.set_positions( self.pot_mm.get_pbc_adjusted(positions_mm)) else: self.mol_mm.set_positions(positions_mm) self.pot.calc() self.pot_mm.calc() self.pot_qmmm.calc() self.mol.set_velocities(self.mol.get_velocities() + \ 0.5 * (self.mol.get_accelerations() + \ get_accelerations_save) * dt) self.mol_mm.set_velocities(self.mol_mm.get_velocities() + \ 0.5 * (self.mol_mm.get_accelerations() + \ get_accelerations_save_mm) * dt) self.elaptime += dt
def setup_output(self): self.woutp = WriteOutputMD_QMMM() self.woutp.start(self) if self.restart: self.woutp.restart(self)
def setup_output(self): self.woutp = WriteOutputMD_QMMM() self.woutp.start(self) if self.restart: self.woutp.restart(self)