예제 #1
0
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 
예제 #2
0
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
예제 #3
0
 def setup_output(self):
     self.woutp = WriteOutputMD_QMMM()
     self.woutp.start(self)
     if self.restart: self.woutp.restart(self)
예제 #4
0
 def setup_output(self):
     self.woutp = WriteOutputMD_QMMM()
     self.woutp.start(self)
     if self.restart: self.woutp.restart(self)