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