realtime.py 文件源码

python
阅读 29 收藏 0 点赞 0 评论 0

项目:McMurchie-Davidson 作者: jjgoings 项目源码 文件源码
def Magnus2(self,direction='x'):
        """Propagate in time using the second order explicit Magnus.
           See: Blanes, Sergio, and Fernando Casas. A concise introduction 
           to geometric numerical integration. Vol. 23. CRC Press, 2016.

           Magnus2 is Eq (4.61), page 128.
        """
        self.reset()
        self.mol.orthoDen()
        self.mol.orthoFock()
        h = -1j*self.stepsize
        for idx,time in enumerate((self.time)):
            if direction.lower() == 'x':
                self.mol.computeDipole()
                self.dipole.append(np.real(self.mol.mu[0]))
            elif direction.lower() == 'y':
                self.mol.computeDipole()
                self.dipole.append(np.real(self.mol.mu[1]))
            elif direction.lower() == 'z':
                self.mol.computeDipole()
                self.dipole.append(np.real(self.mol.mu[2]))

            # record pulse envelope for later plotting, etc.
            self.shape.append(self.pulse(time))
            curDen  = np.copy(self.mol.PO)

            self.addField(time + 0.0*self.stepsize,direction=direction)
            k1 = h*self.mol.FO 
            U = expm(k1)
            self.mol.PO = np.dot(U,np.dot(curDen,self.mol.adj(U))) 
            self.mol.updateFock()

            self.addField(time + 1.0*self.stepsize,direction=direction)
            L  = 0.5*(k1 + h*self.mol.FO)
            U  = expm(L)
            self.mol.PO = np.dot(U,np.dot(curDen,self.mol.adj(U))) 
            self.mol.updateFock()

            # density and Fock are done updating, wrap things up
            self.mol.unOrthoFock()    
            self.mol.unOrthoDen()    
            self.mol.computeEnergy()
            self.Energy.append(np.real(self.mol.energy))
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号