def eig(self, h, s): mol = self.mol if not mol.symmetry: return self._eigh(h, s) nirrep = mol.symm_orb.__len__() s = symm.symmetrize_matrix(s, mol.symm_orb) ha = symm.symmetrize_matrix(h[0], mol.symm_orb) cs = [] es = [] orbsym = [] for ir in range(nirrep): e, c = self._eigh(ha[ir], s[ir]) cs.append(c) es.append(e) orbsym.append([mol.irrep_id[ir]] * e.size) ea = numpy.hstack(es) ca = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs) ca = hf_symm.attach_orbsym(ca, numpy.hstack(orbsym)) hb = symm.symmetrize_matrix(h[1], mol.symm_orb) cs = [] es = [] orbsym = [] for ir in range(nirrep): e, c = self._eigh(hb[ir], s[ir]) cs.append(c) es.append(e) orbsym.append([mol.irrep_id[ir]] * e.size) eb = numpy.hstack(es) cb = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs) cb = hf_symm.attach_orbsym(cb, numpy.hstack(orbsym)) return numpy.array((ea, eb)), (ca, cb)
def eig(self, h, s): '''Solve generalized eigenvalue problem, for each irrep. The eigenvalues and eigenvectors are not sorted to ascending order. Instead, they are grouped based on irreps. ''' mol = self.mol if not mol.symmetry: return self._eigh(h, s) nirrep = mol.symm_orb.__len__() h = symm.symmetrize_matrix(h, mol.symm_orb) s = symm.symmetrize_matrix(s, mol.symm_orb) partner_ir = [self.partner_irrep(ir, mol.groupname) for ir in mol.irrep_id] for ir in range(nirrep): if ir > 0 and mol.irrep_id[ir-1] == partner_ir[ir]: h_av = (h[ir] + h[ir-1])/2 h[ir] = h[ir-1] = h_av cs = [] es = [] orbsym = [] for ir in range(nirrep): e, c = self._eigh(h[ir], s[ir]) cs.append(c) es.append(e) orbsym.append([mol.irrep_id[ir]] * e.size) e = numpy.hstack(es) c = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs) c = lib.tag_array(c, orbsym=numpy.hstack(orbsym)) return e, c
def eig(self, h, s): if not self.mol.symmetry: return uhf.UHF.eig(self, h, s) nirrep = self.mol.symm_orb.__len__() s = symm.symmetrize_matrix(s, self.mol.symm_orb) ha = symm.symmetrize_matrix(h[0], self.mol.symm_orb) cs = [] es = [] for ir in range(nirrep): e, c = hf.SCF.eig(self, ha[ir], s[ir]) cs.append(c) es.append(e) ea = numpy.hstack(es) ca = hf_symm.so2ao_mo_coeff(self.mol.symm_orb, cs) hb = symm.symmetrize_matrix(h[1], self.mol.symm_orb) cs = [] es = [] for ir in range(nirrep): e, c = scipy.linalg.eigh(hb[ir], s[ir]) cs.append(c) es.append(e) eb = numpy.hstack(es) cb = hf_symm.so2ao_mo_coeff(self.mol.symm_orb, cs) return numpy.array((ea,eb)), (ca,cb)
def eig(self, h, s): mol = self.mol if not mol.symmetry: return self._eigh(h, s) nirrep = mol.symm_orb.__len__() s = symm.symmetrize_matrix(s, mol.symm_orb) ha = symm.symmetrize_matrix(h[0], mol.symm_orb) cs = [] es = [] orbsym = [] for ir in range(nirrep): e, c = self._eigh(ha[ir], s[ir]) cs.append(c) es.append(e) orbsym.append([mol.irrep_id[ir]] * e.size) ea = numpy.hstack(es) ca = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs) ca = lib.tag_array(ca, orbsym=numpy.hstack(orbsym)) hb = symm.symmetrize_matrix(h[1], mol.symm_orb) cs = [] es = [] orbsym = [] for ir in range(nirrep): e, c = self._eigh(hb[ir], s[ir]) cs.append(c) es.append(e) orbsym.append([mol.irrep_id[ir]] * e.size) eb = numpy.hstack(es) cb = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs) cb = lib.tag_array(cb, orbsym=numpy.hstack(orbsym)) return (ea,eb), (ca,cb)
def eig(self, h, s): nirrep = self.mol.symm_orb.__len__() h = symm.symmetrize_matrix(h, self.mol.symm_orb) s = symm.symmetrize_matrix(s, self.mol.symm_orb) cs = [] es = [] for ir in range(nirrep): e, c = hf.SCF.eig(self, h[ir], s[ir]) cs.append(c) es.append(e) e = numpy.hstack(es) c = so2ao_mo_coeff(self.mol.symm_orb, cs) return e, c
def eig_symm(h, s): nirrep = mol.symm_orb.__len__() h = symm.symmetrize_matrix(h, mol.symm_orb) s = symm.symmetrize_matrix(s, mol.symm_orb) cs = [] es = [] for ir in range(nirrep): d, t = numpy.linalg.eigh(s[ir]) x = t[:, d > 1e-8] / numpy.sqrt(d[d > 1e-8]) xhx = reduce(numpy.dot, (x.T, h[ir], x)) e, c = numpy.linalg.eigh(xhx) cs.append(reduce(numpy.dot, (mol.symm_orb[ir], x, c))) es.append(e) e = numpy.hstack(es) c = numpy.hstack(cs) return e, c
def eig_symm(h, s): nirrep = mol.symm_orb.__len__() h = symm.symmetrize_matrix(h, mol.symm_orb) s = symm.symmetrize_matrix(s, mol.symm_orb) cs = [] es = [] for ir in range(nirrep): d, t = numpy.linalg.eigh(s[ir]) x = t[:,d>1e-8] / numpy.sqrt(d[d>1e-8]) xhx = reduce(numpy.dot, (x.T, h[ir], x)) e, c = numpy.linalg.eigh(xhx) cs.append(reduce(numpy.dot, (mol.symm_orb[ir], x, c))) es.append(e) e = numpy.hstack(es) c = numpy.hstack(cs) return e, c
def eig(self, h, s): '''Solve generalized eigenvalue problem, for each irrep. The eigenvalues and eigenvectors are not sorted to ascending order. Instead, they are grouped based on irreps. ''' nirrep = self.mol.symm_orb.__len__() h = symm.symmetrize_matrix(h, self.mol.symm_orb) s = symm.symmetrize_matrix(s, self.mol.symm_orb) cs = [] es = [] for ir in range(nirrep): e, c = hf.SCF.eig(self, h[ir], s[ir]) cs.append(c) es.append(e) e = numpy.hstack(es) c = so2ao_mo_coeff(self.mol.symm_orb, cs) return e, c
def eig(h, s): from pyscf import symm nirrep = len(mol.symm_orb) h = symm.symmetrize_matrix(h, mol.symm_orb) s = symm.symmetrize_matrix(s, mol.symm_orb) cs = [] es = [] # # Linear dependency are removed by looping over different symmetry irreps. # for ir in range(nirrep): d, t = numpy.linalg.eigh(s[ir]) x = t[:,d>1e-8] / numpy.sqrt(d[d>1e-8]) xhx = reduce(numpy.dot, (x.T, h[ir], x)) e, c = numpy.linalg.eigh(xhx) cs.append(reduce(numpy.dot, (mol.symm_orb[ir], x, c))) es.append(e) e = numpy.hstack(es) c = numpy.hstack(cs) return e, c
def eig(h, s): from pyscf import symm nirrep = len(mol.symm_orb) h = symm.symmetrize_matrix(h, mol.symm_orb) s = symm.symmetrize_matrix(s, mol.symm_orb) cs = [] es = [] # # Linear dependency are removed by looping over different symmetry irreps. # for ir in range(nirrep): d, t = numpy.linalg.eigh(s[ir]) x = t[:, d > 1e-8] / numpy.sqrt(d[d > 1e-8]) xhx = reduce(numpy.dot, (x.T, h[ir], x)) e, c = numpy.linalg.eigh(xhx) cs.append(reduce(numpy.dot, (mol.symm_orb[ir], x, c))) es.append(e) e = numpy.hstack(es) c = numpy.hstack(cs) return e, c
def scf(self, *args): logger.info(self, '\n') logger.info(self, '******** 1 electron system ********') self.converged = True h1e = self.get_hcore(self.mol) s1e = self.get_ovlp(self.mol) nirrep = self.mol.symm_orb.__len__() h1e = symm.symmetrize_matrix(h1e, self.mol.symm_orb) s1e = symm.symmetrize_matrix(s1e, self.mol.symm_orb) cs = [] es = [] for ir in range(nirrep): e, c = hf.SCF.eig(self, h1e[ir], s1e[ir]) cs.append(c) es.append(e) e = numpy.hstack(es).round(9) idx = numpy.argsort(e) self.mo_energy = e[idx] self.mo_coeff = so2ao_mo_coeff(self.mol.symm_orb, cs)[:,idx] self.mo_occ = numpy.zeros_like(self.mo_energy) self.mo_occ[0] = 1 self.e_tot = self.mo_energy[0] + self.mol.energy_nuc() return self.e_tot
def scf(self, *args): logger.info(self, '\n') logger.info(self, '******** 1 electron system ********') self.converged = True h1e = self.get_hcore(self.mol) s1e = self.get_ovlp(self.mol) nirrep = self.mol.symm_orb.__len__() h1e = symm.symmetrize_matrix(h1e, self.mol.symm_orb) s1e = symm.symmetrize_matrix(s1e, self.mol.symm_orb) cs = [] es = [] for ir in range(nirrep): e, c = hf.SCF.eig(self, h1e[ir], s1e[ir]) cs.append(c) es.append(e) e = numpy.hstack(es).round(9) idx = numpy.argsort(e) self.mo_energy = e[idx] self.mo_coeff = so2ao_mo_coeff(self.mol.symm_orb, cs)[:, idx] self.mo_occ = numpy.zeros_like(self.mo_energy) self.mo_occ[0] = 1 self.e_tot = self.mo_energy[0] + self.mol.energy_nuc() return self.e_tot
def eig(mf, h, s): '''Solve generalized eigenvalue problem, for each irrep. The eigenvalues and eigenvectors are not sorted to ascending order. Instead, they are grouped based on irreps. ''' mol = mf.mol if not mol.symmetry: return mf._eigh(h, s) nirrep = mol.symm_orb.__len__() h = symm.symmetrize_matrix(h, mol.symm_orb) s = symm.symmetrize_matrix(s, mol.symm_orb) cs = [] es = [] orbsym = [] for ir in range(nirrep): e, c = mf._eigh(h[ir], s[ir]) cs.append(c) es.append(e) orbsym.append([mol.irrep_id[ir]] * e.size) e = numpy.hstack(es) c = so2ao_mo_coeff(mol.symm_orb, cs) c = lib.tag_array(c, orbsym=numpy.hstack(orbsym)) return e, c