Example #1
0
def simx(A,B,trans='N'):
    """\
    C = simx(A,B,trans)
    Perform the similarity transformation C = B'*A*B (trans='N') or
    C = B*A*B' (trans='T').
    """
    if trans.lower().startswith('t'):
        return matrixmultiply(B,matrixmultiply(A,B.T))
    return matrixmultiply(B.T,matrixmultiply(A,B))
Example #2
0
def simx(A, B, trans='N'):
    """\
    C = simx(A,B,trans)
    Perform the similarity transformation C = B'*A*B (trans='N') or
    C = B*A*B' (trans='T').
    """
    if trans.lower().startswith('t'):
        return matrixmultiply(B, matrixmultiply(A, B.T))
    return matrixmultiply(B.T, matrixmultiply(A, B))
Example #3
0
 def setdens(self,D):
     self._dens = 2*dot(self.bfs,matrixmultiply(D,self.bfs))
     # This *if* statement is potentially slow. If it becomes
     #  a factor, pull it up to AtomicGrids and have two
     #  explicit cases here.
     if self.do_grad_dens:
         self._grad = 2*dot(self.bfs.T,matrixmultiply(D,self.bfgrads)) +\
                      2*dot(self.bfgrads.T,matrixmultiply(D,self.bfs))
         self._gamma = dot(self._grad,self._grad)
     return
Example #4
0
 def setdens(self, D):
     self._dens = 2 * dot(self.bfs, matrixmultiply(D, self.bfs))
     # This *if* statement is potentially slow. If it becomes
     #  a factor, pull it up to AtomicGrids and have two
     #  explicit cases here.
     if self.do_grad_dens:
         self._grad = 2*dot(self.bfs.T,matrixmultiply(D,self.bfgrads)) +\
                      2*dot(self.bfgrads.T,matrixmultiply(D,self.bfs))
         self._gamma = dot(self._grad, self._grad)
     return
Example #5
0
def geigh(H,A,**kwargs):
    """\
    Generalized eigenproblem using a symmetric matrix H.

    Options:
    have_xfrm  False   Need to form canonical transformation from S (default)
               True    A is the canonical transformation matrix
    orthog     'Sym'   Use Symmetric Orthogonalization (default)
               'Can'   Use Canonical Orthogonalization
               'Chol'  Use a Cholesky decomposition
               'Cut'   Use a symmetric orthogonalization with a cutoff
                
    """
    have_xfrm = kwargs.get('have_xfrm')
    orthog = kwargs.get('orthog',settings.OrthogMethod)
    if not have_xfrm:
        if orthog == 'Can':
            X = CanOrth(A)
        elif orthog == 'Chol':
            X = CholOrth(A)
        elif orthog == 'Cut':
            X = SymOrthCutoff(A)
        else:
            X = SymOrth(A)
        kwargs['have_xfrm'] = True
        return geigh(H,X,**kwargs)
    val,vec = eigh(simx(H,A))
    vec = matrixmultiply(A,vec)
    return val,vec
Example #6
0
def geigh(H, A, **kwargs):
    """\
    Generalized eigenproblem using a symmetric matrix H.

    Options:
    have_xfrm  False   Need to form canonical transformation from S (default)
               True    A is the canonical transformation matrix
    orthog     'Sym'   Use Symmetric Orthogonalization (default)
               'Can'   Use Canonical Orthogonalization
               'Chol'  Use a Cholesky decomposition
               'Cut'   Use a symmetric orthogonalization with a cutoff
                
    """
    have_xfrm = kwargs.get('have_xfrm')
    orthog = kwargs.get('orthog', settings.OrthogMethod)
    if not have_xfrm:
        if orthog == 'Can':
            X = CanOrth(A)
        elif orthog == 'Chol':
            X = CholOrth(A)
        elif orthog == 'Cut':
            X = SymOrthCutoff(A)
        else:
            X = SymOrth(A)
        kwargs['have_xfrm'] = True
        return geigh(H, X, **kwargs)
    val, vec = eigh(simx(H, A))
    vec = matrixmultiply(A, vec)
    return val, vec
Example #7
0
 def setdens(self,D):
     self._dens = 2*dot(self.bfs,matrixmultiply(D,self.bfs))
     # This *if* statement is potentially slow. If it becomes
     #  a factor, pull it up to AtomicGrids and have two
     #  explicit cases here.
     if self.do_grad_dens:
         #gx = 2*dot(self.bfs,matrixmultiply(D,self.bfgrads[:,0])) + \
         #           2*dot(self.bfgrads[:,0],matrixmultiply(D,self.bfs))
         #gy = 2*dot(self.bfs,matrixmultiply(D,self.bfgrads[:,1])) + \
         #           2*dot(self.bfgrads[:,1],matrixmultiply(D,self.bfs))
         #gz = 2*dot(self.bfs,matrixmultiply(D,self.bfgrads[:,2])) + \
         #           2*dot(self.bfgrads[:,2],matrixmultiply(D,self.bfs))
         #self._grad = array((gx,gy,gz))
         self._grad = 2*dot(self.bfs.T,matrixmultiply(D,self.bfgrads)) +\
                      2*dot(self.bfgrads.T,matrixmultiply(D,self.bfs))
         self._gamma = dot(self._grad,self._grad)
     return
Example #8
0
    def mkQmatrix(self):
        #computes Q matrix which is basically density matrix weighted by the orbital eigenvalues
        if self.restricted:
            occ_orbe = self.orbe[0:self.nclosed]
            occ_orbs = self.orbs[:, 0:self.nclosed]
            Qmat = matrixmultiply(
                occ_orbs,
                matrixmultiply(diagonal_mat(occ_orbe), transpose(occ_orbs)))
            return Qmat

        if self.unrestricted:
            occ_orbs_A = self.orbs_a[:, 0:self.nalpha]
            occ_orbs_B = self.orbs_b[:, 0:self.nbeta]
            occ_orbe_A = self.orbe_a[0:self.nalpha]
            occ_orbe_B = self.orbe_b[0:self.nbeta]

            Qa = matrixmultiply(
                occ_orbs_A,
                matrixmultiply(diagonal_mat(occ_orbe_A),
                               transpose(occ_orbs_A)))
            Qb = matrixmultiply(
                occ_orbs_B,
                matrixmultiply(diagonal_mat(occ_orbe_B),
                               transpose(occ_orbs_B)))
            return Qa, Qb
Example #9
0
def mkdens_occs(c,occs,**kwargs):
    "Density matrix from a set of occupations (e.g. from FD expression)."
    tol = kwargs.get('tol',settings.FDOccTolerance)
    verbose = kwargs.get('verbose')
    # Determine how many orbs have occupations greater than 0
    norb = 0
    for fi in occs:
        if fi < tol: break
        norb += 1
    if verbose:
        print "mkdens_occs: %d occupied orbitals found" % norb
    # Determine how many doubly occupied orbitals we have
    nclosed = 0
    for i in xrange(norb):
        if abs(1.-occs[i]) > tol: break
        nclosed += 1
    if verbose:
        print "mkdens_occs: %d closed-shell orbitals found" % nclosed
    D = mkdens(c,0,nclosed)
    for i in xrange(nclosed,norb):
        D = D + occs[i]*matrixmultiply(c[:,i:i+1],transpose(c[:,i:i+1]))
    return D
Example #10
0
 def mkQmatrix(self):
     #computes Q matrix which is basically density matrix weighted by the orbital eigenvalues
     if self.restricted:
         occ_orbe = self.orbe[0:self.nclosed]
         occ_orbs = self.orbs[:,0:self.nclosed]
         Qmat = matrixmultiply( occ_orbs, matrixmultiply( diagonal_mat(occ_orbe), transpose(occ_orbs) ) )
         return Qmat
         
     if self.unrestricted:
         occ_orbs_A = self.orbs_a[:,0:self.nalpha]
         occ_orbs_B = self.orbs_b[:,0:self.nbeta]
         occ_orbe_A = self.orbe_a[0:self.nalpha]
         occ_orbe_B = self.orbe_b[0:self.nbeta]
         
         Qa = matrixmultiply( occ_orbs_A, matrixmultiply( diagonal_mat(occ_orbe_A), transpose(occ_orbs_A) ) )
         Qb = matrixmultiply( occ_orbs_B, matrixmultiply( diagonal_mat(occ_orbe_B), transpose(occ_orbs_B) ) )
         return Qa,Qb
Example #11
0
 def mk_B_Dmat(self, nstart, nstop):
     "Form a density matrix C*Ct given eigenvectors C[nstart:nstop,:]"
     d = self.orbs_b[:, nstart:nstop]
     Dmat = matrixmultiply(d, transpose(d))
     return Dmat
Example #12
0
def outprod(A):
    "D = outprod(A) : Return the outer product A*A'"
    return matrixmultiply(A,A.T)
Example #13
0
def mkdens(c,nstart,nstop):
    "Form a density matrix C*Ct given eigenvectors C[nstart:nstop,:]"
    d = c[:,nstart:nstop]
    Dmat = matrixmultiply(d,d.T)
    return Dmat
Example #14
0
 def mk_B_Dmat(self,nstart,nstop):
     "Form a density matrix C*Ct given eigenvectors C[nstart:nstop,:]"
     d = self.orbs_b[:,nstart:nstop]
     Dmat = matrixmultiply(d,transpose(d))
     return Dmat
Example #15
0
def outprod(A):
    "D = outprod(A) : Return the outer product A*A'"
    return matrixmultiply(A, A.T)
Example #16
0
def mkdens(c, nstart, nstop):
    "Form a density matrix C*Ct given eigenvectors C[nstart:nstop,:]"
    d = c[:, nstart:nstop]
    Dmat = matrixmultiply(d, d.T)
    return Dmat