From 211979741467b2f5bc3ea685e12e9f5c097af451 Mon Sep 17 00:00:00 2001 From: Timothy Berkelbach Date: Fri, 24 Nov 2023 15:36:19 -0500 Subject: [PATCH] Update periodic GW init and add example (#1967) * Update periodic GW init and add example * Update 22-k_points_gw.py * Removing mf.to_rhf() and mf.to_uhf() The `to_rhf()` seems to raise the same DF error as in the unrestricted case, so I've removed it. But with/without `to_uhf()` I still get the same DF error. --- examples/pbc/22-k_points_gw.py | 43 ++++++++++++++++++++++++++++++++ pyscf/pbc/gw/__init__.py | 45 +++++++++++++++++++++++++++++++++- pyscf/pbc/gw/krgw_ac.py | 4 +-- pyscf/pbc/gw/krgw_cd.py | 4 +-- pyscf/pbc/gw/kugw_ac.py | 4 +-- 5 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 examples/pbc/22-k_points_gw.py diff --git a/examples/pbc/22-k_points_gw.py b/examples/pbc/22-k_points_gw.py new file mode 100644 index 0000000000..2c1604bc28 --- /dev/null +++ b/examples/pbc/22-k_points_gw.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +''' +G0W0 with k-points sampling +''' + +from functools import reduce +import numpy +from pyscf.pbc import gto, scf, gw + +cell = gto.Cell() +cell.atom=''' +C 0.000000000000 0.000000000000 0.000000000000 +C 1.685068664391 1.685068664391 1.685068664391 +''' +cell.basis = 'gth-szv' +cell.pseudo = 'gth-pade' +cell.a = ''' +0.000000000, 3.370137329, 3.370137329 +3.370137329, 0.000000000, 3.370137329 +3.370137329, 3.370137329, 0.000000000''' +cell.unit = 'B' +cell.verbose = 5 +cell.build() + +# +# KDFT and KGW with 2x2x2 k-points +# +kpts = cell.make_kpts([2,2,2]) +kmf = scf.KRKS(cell).density_fit() +kmf.kpts = kpts +emf = kmf.kernel() + +# Default is AC frequency integration +mygw = gw.KRGW(kmf) +mygw.kernel() +print("KRGW energies =", mygw.mo_energy) + +# With CD frequency integration +#mygw = gw.KRGW(kmf, freq_int='cd') +#mygw.kernel() +#print("KRGW-CD energies =", mygw.mo_energy) + diff --git a/pyscf/pbc/gw/__init__.py b/pyscf/pbc/gw/__init__.py index c4c56a23fd..4aa084cfe3 100644 --- a/pyscf/pbc/gw/__init__.py +++ b/pyscf/pbc/gw/__init__.py @@ -1 +1,44 @@ -from .kgw_slow import GW as KRGW +# Copyright 2014-2018 The PySCF Developers. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +''' +Periodic G0W0 approximation +''' + +from pyscf.pbc.gw import krgw_ac +from pyscf.pbc.gw import kugw_ac +from pyscf.pbc.gw import krgw_cd +from pyscf.pbc import scf + +def KRGW(mf, freq_int='ac', frozen=None): + # mf = mf.to_rhf() + if freq_int.lower() == 'ac': + return krgw_ac.KRGWAC(mf, frozen) + elif freq_int.lower() == 'cd': + return krgw_cd.KRGWCD(mf, frozen) + else: + raise RuntimeError("GW frequency integration method %s not recognized. " + "With PBC, options are 'ac' and 'cd'."%(freq_int)) + +def KUGW(mf, freq_int='ac', frozen=None): + # mf = mf.to_uhf() + if freq_int.lower() == 'ac': + return kugw_ac.KUGWAC(mf, frozen) + elif freq_int.lower() == 'cd': + raise RuntimeError('GWCD does not support UHF or UKS methods.') + else: + raise RuntimeError("GW frequency integration method %s not recognized. " + "With PBC, options are 'ac' and 'cd'."%(freq_int)) + +KGW = KRGW diff --git a/pyscf/pbc/gw/krgw_ac.py b/pyscf/pbc/gw/krgw_ac.py index 56f9eb0c72..bf96ac7b1a 100644 --- a/pyscf/pbc/gw/krgw_ac.py +++ b/pyscf/pbc/gw/krgw_ac.py @@ -546,7 +546,7 @@ class KRGWAC(lib.StreamObject): 'kpts', 'nkpts', 'mo_energy', 'mo_coeff', 'mo_occ', 'sigma', } - def __init__(self, mf, frozen=0): + def __init__(self, mf, frozen=None): self.mol = mf.mol self._scf = mf self.verbose = self.mol.verbose @@ -554,7 +554,7 @@ def __init__(self, mf, frozen=0): self.max_memory = mf.max_memory #TODO: implement frozen orbs - if frozen > 0: + if frozen is not None and frozen > 0: raise NotImplementedError self.frozen = frozen diff --git a/pyscf/pbc/gw/krgw_cd.py b/pyscf/pbc/gw/krgw_cd.py index 45e991d29b..8947768b85 100644 --- a/pyscf/pbc/gw/krgw_cd.py +++ b/pyscf/pbc/gw/krgw_cd.py @@ -607,7 +607,7 @@ class KRGWCD(lib.StreamObject): 'kpts', 'nkpts', 'mo_energy', 'mo_coeff', 'mo_occ', 'sigma', } - def __init__(self, mf, frozen=0): + def __init__(self, mf, frozen=None): self.mol = mf.mol self._scf = mf self.verbose = self.mol.verbose @@ -615,7 +615,7 @@ def __init__(self, mf, frozen=0): self.max_memory = mf.max_memory #TODO: implement frozen orbs - if frozen > 0: + if frozen is not None and frozen > 0: raise NotImplementedError self.frozen = frozen diff --git a/pyscf/pbc/gw/kugw_ac.py b/pyscf/pbc/gw/kugw_ac.py index e61197496d..87555db769 100644 --- a/pyscf/pbc/gw/kugw_ac.py +++ b/pyscf/pbc/gw/kugw_ac.py @@ -612,7 +612,7 @@ class KUGWAC(lib.StreamObject): 'kpts', 'nkpts', 'mo_energy', 'mo_coeff', 'mo_occ', 'sigma', } - def __init__(self, mf, frozen=0): + def __init__(self, mf, frozen=None): self.mol = mf.mol self._scf = mf self.verbose = self.mol.verbose @@ -620,7 +620,7 @@ def __init__(self, mf, frozen=0): self.max_memory = mf.max_memory #TODO: implement frozen orbs - if frozen > 0: + if frozen is not None and frozen > 0: raise NotImplementedError self.frozen = frozen