def build_se(self): if self.rpa is None: self.solve_casida() e_rpa, v_rpa, xpy = self.rpa naux_gf = self.gf.naux chempot = self.chempot c = self.gf.v[:self.nphys] co = c[:, self.gf.e < chempot] cv = c[:, self.gf.e >= chempot] xyia = util.mo2qo(self.eri, c, co, cv).reshape(self.nphys, naux_gf, -1) omega = util.einsum('xyk,ks->xys', xyia, xpy) e_gf = self.gf.e e_rpa_s = np.outer(np.sign(e_gf - chempot), e_rpa) e = util.dirsum('i,ij->ij', e_gf, e_rpa_s).flatten() v = omega.reshape((self.nphys, -1)) self.se = aux.Aux(e, v, chempot=self.chempot) log.write('naux (se,build) = %d\n' % self.se.naux, self.verbose) return self.se
def run(self): maxiter = self.options['maxiter'] etol = self.options['etol'] for self.iteration in range(1, maxiter + 1): log.iteration(self.iteration, self.verbose) self.fock_loop() self.build() self.energy() if self.iteration > 1: e_dif = abs(self._energies['tot'][-2] - self._energies['tot'][-1]) if e_dif < etol and self.converged: break self.converged = e_dif < etol if self.converged: log.write( '\nAuxiliary GF2 converged after %d iterations.\n' % self.iteration, self.verbose) else: log.write('\nAuxiliary GF2 failed to converge.\n', self.verbose) self._timings['total'] = self._timings.get('total', 0.0) + self._timer.total() log.title('Timings', self.verbose) log.timings(self._timings, self.verbose) return self
def setup(self): self.h1e = self.hf.h1e_mo self.eri = self.hf.eri_mo if self.options['dm0'] is None: self.rdm1 = self.hf.rdm1_mo else: self.rdm1 = np.array(self.options['dm0'], dtype=types.float64) self.converged = False self.iteration = 0 chempot = self.hf.chempot self.gf = aux.Aux(self.hf.e, np.eye(self.hf.nao), chempot=chempot) self.se = aux.Aux([], [ [], ] * self.hf.nao, chempot=chempot) self._se_prev = None self.rpa = None self.e_qp = self.hf.e.copy() self._timings = {} self._energies = {} log.title('Options', self.verbose) log.options(self.options, self.verbose) log.title('Input', self.verbose) log.molecule(self.hf.mol, self.verbose) log.write('Basis = %s\n' % self.hf.mol.basis, self.verbose) log.write('E(nuc) = %.12f\n' % self.hf.e_nuc, self.verbose) log.write('E(hf) = %.12f\n' % self.hf.e_tot, self.verbose) log.write('nao = %d\n' % self.hf.nao, self.verbose) log.write('nmom = (%s, %s)\n' % self.nmom, self.verbose)
def merge(self): etol = self.options['etol'] wtol = self.options['wtol'] use_merge = self.options['use_merge'] method = self.options['bath_type'] beta = self.options['bath_beta'] qr = self.options['qr'] nmom_gf, nmom_se = self.nmom if nmom_gf is None and nmom_se is None: return fock = self.get_fock_act() self.se = self.se.compress(fock, self.nmom, method=method, beta=beta, qr=qr) if self.options['use_merge']: self.se = self.se.merge(etol=etol, wtol=wtol) log.write('naux (merge) = %d\n' % self.naux, self.verbose)
def build(self): se = [] for a, b in [(0, 1), (1, 0)]: if a == 0: occa, occb, vira, virb = self._get_slices() else: occb, occa, virb, vira = self._get_slices() eri_aa_ooov = self.eri[a, a][occa, occa, occa, vira] eri_ab_ooov = self.eri[a, b][occa, occa, occb, virb] eo_a = self.hf.e[a][occa] eo_b = self.hf.e[b][occb] ev_a = self.hf.e[a][vira] ev_b = self.hf.e[b][virb] eo = (eo_a, eo_b) ev = (ev_a, ev_b) xija = (eri_aa_ooov, eri_ab_ooov) e, v = aux.build_ump2_part(eo, ev, xija, **self.options['_build']) se.append(aux.Aux(e, v)) self.se = tuple(se) log.write('naux (build,alpha) = %d\n' % (self.naux[0]), self.verbose) log.write('naux (build,beta) = %d\n' % (self.naux[1]), self.verbose)
def merge(self): etol = self.options['etol'] wtol = self.options['wtol'] use_merge = self.options['use_merge'] method=self.options['bath_type'] beta=self.options['bath_beta'] qr=self.options['qr'] nmom_gf, nmom_se = self.nmom if nmom_gf is None and nmom_se is None: return fock = self.get_fock_act() sea = self.se[0].compress(fock[0], self.nmom, method=method, beta=beta, qr=qr) seb = self.se[1].compress(fock[1], self.nmom, method=method, beta=beta, qr=qr) if use_merge: sea = sea.merge(etol=etol, wtol=wtol) seb = seb.merge(etol=etol, wtol=wtol) self.se = (sea, seb) log.write('naux (merge,alpha) = %d\n' % self.naux[0], self.verbose) log.write('naux (merge,beta) = %d\n' % self.naux[1], self.verbose)
def energy_1body(self): e1b = self.hf.energy_1body(self.h1e, self.rdm1, self.get_fock()) e1b += self.hf.mol.e_nuc log.write('E(1b) = %.12f\n' % e1b, self.verbose) return e1b
def energy_2body(self): self.solve_dyson() e2b = aux.energy.energy_2body_aux(self.gf, self.se) log.write('E(2b) = %.12f\n' % e2b, self.verbose) return e2b
def build(self): eri = self.eri chempot = self.chempot self.se = aux.build_rmp2(self.hf.e, self.eri, chempot=chempot, **self.options['_build']) log.write('naux (build) = %d\n' % self.naux, self.verbose)
def merge(self): nmom_gf, nmom_se = self.nmom if nmom_gf is None and nmom_se is None: return self.se = self.se.compress(self.get_fock(), self.nmom) log.write('naux (se,merge) = %d\n' % self.se.naux, self.verbose)
def merge(self): nmom_gf, nmom_se = self.nmom if nmom_gf is None and nmom_se is None: return self.se = self.se.compress(self.get_fock(), self.nmom, **self.options['_merge']) log.write('naux (merge) = %d\n' % self.naux, self.verbose)
def energy_mp2(self): emp2_a = aux.energy.energy_mp2_aux(self.hf.e[0], self.se[0]) emp2_b = aux.energy.energy_mp2_aux(self.hf.e[1], self.se[1]) emp2 = emp2_a + emp2_b emp2 /= 2 log.write('E(mp2) = %.12f\n' % emp2, self.verbose) return emp2
def energy_mp2(self): c, v = self.options['frozen'] arg = slice(c, -v if v else None) e_mo = self.hf.e[arg] emp2 = aux.energy.energy_mp2_aux(e_mo, self.se) log.write('E(mp2) = %.12f\n' % emp2, self.verbose) return emp2
def merge(self): occ, vir = self._get_slices() nmom_gf, nmom_se = self.nmom if nmom_gf is None and nmom_se is None: return fock = self.get_fock()[occ, occ] self.se = self.se.compress(fock, self.nmom, **self.options['_merge']) log.write('naux (merge) = %d\n' % self.naux, self.verbose)
def build(self): occ, vir = self._get_slices() eri_ooov = self.eri[occ, occ, occ, vir] eo = self.hf.e[occ] ev = self.hf.e[vir] e, v = aux.build_rmp2_part(eo, ev, eri_ooov, **self.options['_build']) self.se = aux.Aux(e, v) #, chempot=self.hf.chempot) log.write('naux (build) = %d\n' % self.naux, self.verbose)
def energy_mp2(self): c, v = self.options['frozen'] arg = slice(c, -v if v else None) e_mo_a = self.hf.e[0][arg] e_mo_b = self.hf.e[1][arg] emp2a = aux.energy.energy_mp2_aux(e_mo_a, self.se[0]) emp2b = aux.energy.energy_mp2_aux(e_mo_b, self.se[1]) emp2 = emp2a + emp2b emp2 /= 2 log.write('E(mp2) = %.12f\n' % emp2, self.verbose) return emp2
def merge(self): nmom_gf, nmom_se = self.nmom if nmom_gf is None and nmom_se is None: return fock = self.get_fock() sea = self.se[0].compress(fock[0], self.nmom, **self.options['_merge']) seb = self.se[1].compress(fock[1], self.nmom, **self.options['_merge']) self.se = (sea, seb) log.write('naux (merge,alpha) = %d\n' % self.naux[0], self.verbose) log.write('naux (merge,beta) = %d\n' % self.naux[1], self.verbose)
def run(self): self.get_1p_or_1h() self.build() self.merge() self.diagonalise() log.write('E(mp2) = %.12f\n' % self.e_mp2, self.verbose) e_excite = self.ip[0] if self.method == 'ip' else self.ea[0] log.write('E(%s) = %.12f\n' % (self.method, e_excite), self.verbose) self._timings['total'] = self._timings.get('total', 0.0) + self._timer.total() log.title('Timings', self.verbose) log.timings(self._timings, self.verbose) return self
def build(self): eri = self.eri cpt_a, cpt_b = self.chempot s = slice(None, None, -1) sea = aux.build_ump2(self.hf.e, self.eri[0], chempot=cpt_a, **self.options['_build']) seb = aux.build_ump2(self.hf.e[s], self.eri[1][s], chempot=cpt_b, **self.options['_build']) self.se = (sea, seb) log.write('naux (build,alpha) = %d\n' % self.naux[0], self.verbose) log.write('naux (build,beta) = %d\n' % self.naux[1], self.verbose)
def build_gf(self): e, c = self.se.eig(self.get_fock()) self.gf = aux.Aux(e, c, chempot=self.chempot) c_occ = c[:self.nphys, e < self.chempot] self.rdm1 = np.dot(c_occ, c_occ.T) * 2 log.write( 'HOQMO = %.6f\n' % util.amax(self.gf.e[self.gf.e < self.chempot]), self.verbose) log.write( 'LUQMO = %.6f\n' % util.amin(self.gf.e[self.gf.e >= self.chempot]), self.verbose) log.array(self.rdm1, 'Density matrix (physical)', self.verbose) return self.gf
def merge(self): nmom_gf, nmom_se = self.nmom se = list(self.se) for a, b in [(0, 1), (1, 0)]: if a == 0: occa, occb, vira, virb = self._get_slices() else: occb, occa, virb, vira = self._get_slices() fock = self.get_fock()[a][occa, occa] se[a] = self.se[a].compress(fock, self.nmom, **self.options['_merge']) self.se = tuple(se) log.write('naux (merge,alpha) = %d\n' % self.naux[0], self.verbose) log.write('naux (merge,beta) = %d\n' % self.naux[1], self.verbose)
def setup(self): super().setup() log.title('Options', self.verbose) log.options(self.options, self.verbose) log.title('Input', self.verbose) log.molecule(self.hf.mol, self.verbose) log.write('Basis = %s\n' % self.hf.mol.basis, self.verbose) log.write('E(nuc) = %.12f\n' % self.hf.e_nuc, self.verbose) log.write('E(hf) = %.12f\n' % self.hf.e_tot, self.verbose) log.write('nao = %d\n' % self.hf.nao, self.verbose)
def build(self): build_opts = self.options['_build'] etol = self.options['etol'] wtol = self.options['wtol'] use_merge = self.options['use_merge'] self._se_prev = self.se.copy() eri = self.get_eri_act() fock = self.get_fock_act() if self.hf.with_df: self.se = aux.build_dfmp2_iter(self.se, fock, eri, **build_opts) else: self.se = aux.build_mp2_iter(self.se, fock, eri, **build_opts) if use_merge: self.se = self.se.merge(etol=etol, wtol=wtol) log.write('naux (build) = %d\n' % self.naux, self.verbose)
def setup(self): super().setup() self.gf = self.se.new(self.hf.e, np.eye(self.hf.nao)) if self.eri.ndim == 3: self.eri = lib.pack_tril(self.eri) log.title('Options', self.verbose) log.options(self.options, self.verbose) log.title('Input', self.verbose) log.molecule(self.hf.mol, self.verbose) log.write('Basis = %s\n' % self.hf.mol.basis, self.verbose) log.write('E(nuc) = %.12f\n' % self.hf.e_nuc, self.verbose) log.write('E(hf) = %.12f\n' % self.hf.e_tot, self.verbose) log.write('nao = %d\n' % self.hf.nao, self.verbose) log.write('nmom = (%s, %s)\n' % self.nmom, self.verbose) self.run_mp2()
def setup(self): super().setup() self.gf = (self.se[0].new(self.hf.e[0], np.eye(self.hf.nao)), self.se[1].new(self.hf.e[1], np.eye(self.hf.nao))) if self.eri.ndim == 4: self.eri = np.stack([lib.pack_tril(x) for x in self.eri], axis=0) log.title('Options', self.verbose) log.options(self.options, self.verbose) log.title('Input', self.verbose) log.molecule(self.hf.mol, self.verbose) log.write('Basis = %s\n' % self.hf.mol.basis, self.verbose) log.write('E(nuc) = %.12f\n' % self.hf.e_nuc, self.verbose) log.write('E(hf) = %.12f\n' % self.hf.e_tot, self.verbose) log.write('nao = %d\n' % self.hf.nao, self.verbose) log.write('nmom = (%s, %s)\n' % self.nmom, self.verbose) self.run_mp2()
def run(self): maxiter = self.options['maxiter'] etol = self.options['etol'] checkpoint = self.options['checkpoint'] for self.iteration in range(1, maxiter + 1): log.iteration(self.iteration, self.verbose) self.fock_loop() self.build() self.energy() if self.iteration > 1: e_dif = abs(self._energies['tot'][-2] - self._energies['tot'][-1]) if e_dif < etol and self.converged: break self.converged = e_dif < etol if checkpoint and mpi.rank == 0: np.savetxt('rdm1_alph_chk.dat', self.rdm1[0]) np.savetxt('rdm1_beta_chk.dat', self.rdm1[1]) self.se[0].save('se_alph_chk.pickle') self.se[1].save('se_beta_chk.pickle') if self.converged: log.write( '\nAuxiliary GF2 converged after %d iterations.\n' % self.iteration, self.verbose) else: log.write('\nAuxiliary GF2 failed to converge.\n', self.verbose) self._timings['total'] = self._timings.get('total', 0.0) + self._timer.total() log.title('Timings', self.verbose) log.timings(self._timings, self.verbose) return self
def run(self): for self.iteration in range(1, self.options['maxiter'] + 1): log.iteration(self.iteration, self.verbose) self.build_gf() if self.iteration == 1 or self.options['update_w']: self.solve_casida() self.build_se() self.merge() self.energy() if self.options['update_eig']: self.iterate_qp() if self.iteration > 1: e_dif = abs(self._energies['tot'][-2] - \ self._energies['tot'][-1]) if e_dif < self.options['etol'] and self.converged: break self.converged = e_dif < self.options['etol'] if self.converged: log.write( '\nAuxiliary GW converged after %d iterations.\n' % self.iteration, self.verbose) else: log.write('\nAuxiliary GW failed to converge.\n', self.verbose) self._timings['total'] = self._timings.get('total', 0.0) \ + self._timer.total() log.title('Timings', self.verbose) log.timings(self._timings, self.verbose) return self
def build(self): build_opts = self.options['_build'] etol = self.options['etol'] wtol = self.options['wtol'] use_merge = self.options['use_merge'] self._se_prev = (self.se[0].copy(), self.se[1].copy()) eri = self.get_eri_act() fock = self.get_fock_act() if self.hf.with_df: sea, seb = aux.build_dfmp2_iter(self.se, fock, eri, **build_opts) else: sea, seb = aux.build_mp2_iter(self.se, fock, eri, **build_opts) if use_merge: sea = sea.merge(etol=etol, wtol=wtol) seb = seb.merge(etol=etol, wtol=wtol) self.se = (sea, seb) log.write('naux (build,alpha) = %d\n' % (self.naux[0]), self.verbose) log.write('naux (build,beta) = %d\n' % (self.naux[1]), self.verbose)
def fock_loop(self): fock_opts = self.options['_fock_loop'] fock_opts['fock_func'] = self.get_fock se, rdm1, converged = fock_loop_rhf(self.se, self.hf, self.rdm1, **fock_opts) self.solve_dyson() if converged: log.write('Fock loop converged.\n', self.verbose) log.write('Chemical potential = %.6f\n' % self.chempot, self.verbose) else: log.write('Fock loop did not converge.\n', self.verbose) log.write('Chemical potential = %.6f\n' % self.chempot, self.verbose)
def fock_loop(self): se, rdm1, converged = fock_loop_rhf(self.se, self.h1e, self.rdm1, self.eri, self.nelec, **self.options['_fock_loop']) if converged: log.write('Fock loop converged.\n', self.verbose) log.write('Chemical potential = %.6f\n' % self.chempot, self.verbose) else: log.write('Fock loop did not converge.\n', self.verbose) log.write('Chemical potential = %.6f\n' % self.chempot, self.verbose) self.se = se self.gf.chempot = se.chempot self.build_gf() return converged