예제 #1
0
    def compute_energy(self):

        Hcore, G, Da, Db, X = self.Hcore, self.G, self.Da, self.Db, self.X

        for i in range(get_maxiter()):

            va = np.einsum("mnrs,ns->mr", G, Da) - np.einsum(
                "mnsr,ns->mr", G, Da) + np.einsum("mnrs,ns->mr", G, Db)
            vb = np.einsum("mnrs,ns->mr", G, Db) - np.einsum(
                "mnsr,ns->mr", G, Db) + np.einsum("mnrs,ns->mr", G, Da)

            Fa = Hcore + va
            Fb = Hcore + vb

            tFa = X.dot(Fa.dot(X))
            tFb = X.dot(Fb.dot(X))

            ea, tCa = la.eigh(tFa)
            eb, tCb = la.eigh(tFb)

            Ca = X.dot(tCa)
            Cb = X.dot(tCb)

            oCa = Ca[:, :self.Na]
            oCb = Cb[:, :self.Nb]

            Da = oCa.dot(oCa.T)
            Db = oCb.dot(oCb.T)

            E0 = self.E
            E = np.trace((Hcore + 0.5 * va).dot(Da)) + np.trace(
                (Hcore + 0.5 * vb).dot(Db)) + self.Vnu
            dE = np.fabs(E - E0)

            if dE < self.conv: break

            print("UHF  {:>4} {: >21.13}  {: >21.13}".format(i, E, dE))

            ## save
            self.Da, self.Db, self.E = Da, Db, E

        return self.E