Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
    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)
Ejemplo n.º 15
0
    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)
Ejemplo n.º 16
0
    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
Ejemplo n.º 17
0
    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)
Ejemplo n.º 18
0
    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
Ejemplo n.º 19
0
    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)
Ejemplo n.º 20
0
    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
Ejemplo n.º 21
0
    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)
Ejemplo n.º 22
0
    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)
Ejemplo n.º 23
0
    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)
Ejemplo n.º 24
0
    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()
Ejemplo n.º 25
0
    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()
Ejemplo n.º 26
0
    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
Ejemplo n.º 27
0
    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
Ejemplo n.º 28
0
    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)
Ejemplo n.º 29
0
    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)
Ejemplo n.º 30
0
    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