def convert_to_khf(mf, out=None): '''Convert gamma point SCF object to k-point SCF object ''' from pyscf.pbc import scf, dft if not isinstance(mf, scf.khf.KSCF): known_cls = { dft.uks.UKS: dft.kuks.KUKS, scf.uhf.UHF: scf.kuhf.KUHF, dft.rks.RKS: dft.krks.KRKS, scf.hf.RHF: scf.khf.KRHF, dft.roks.ROKS: dft.kroks.KROKS, scf.rohf.ROHF: scf.krohf.KROHF, #TODO: dft.gks.GKS : dft.kgks.KGKS, scf.ghf.GHF: scf.kghf.KGHF } # Keep the attribute with_df with_df = mf.with_df mf = mol_addons._object_without_soscf(mf, known_cls, remove_df=False) mf.with_df = with_df if out is None: return mf else: out.__dict__.update(mf.__dict__) return out
def convert_to_uhf(mf, out=None): '''Convert the given mean-field object to the corresponding unrestricted HF/KS object ''' from pyscf.scf import addons as mol_addons from pyscf.pbc import scf from pyscf.pbc import dft if out is None: if isinstance(mf, (scf.uhf.UHF, scf.kuhf.KUHF)): return copy.copy(mf) else: unknown_cls = [scf.kghf.KGHF] for i, cls in enumerate(mf.__class__.__mro__): if cls in unknown_cls: raise NotImplementedError( "No conversion from %s to uhf object" % cls) known_cls = {dft.krks.KRKS : dft.kuks.KUKS, dft.kroks.KROKS: dft.kuks.KUKS, scf.khf.KRHF : scf.kuhf.KUHF, scf.krohf.KROHF: scf.kuhf.KUHF, dft.rks.RKS : dft.uks.UKS , dft.roks.ROKS : dft.uks.UKS , scf.hf.RHF : scf.uhf.UHF , scf.rohf.ROHF : scf.uhf.UHF ,} out = mol_addons._object_without_soscf(mf, known_cls, False) else: assert(isinstance(out, (scf.uhf.UHF, scf.kuhf.KUHF))) if isinstance(mf, scf.khf.KSCF): assert(isinstance(out, scf.khf.KSCF)) else: assert(not isinstance(out, scf.khf.KSCF)) return mol_addons.convert_to_uhf(mf, out, False)
def convert_to_rhf(mf, out=None): '''Convert the given mean-field object to the corresponding restricted HF/KS object ''' from pyscf.pbc import scf from pyscf.pbc import dft if getattr(mf, 'nelec', None) is None: nelec = mf.cell.nelec else: nelec = mf.nelec if out is not None: assert(isinstance(out, (scf.hf.RHF, scf.khf.KRHF))) if isinstance(mf, scf.khf.KSCF): assert(isinstance(out, scf.khf.KSCF)) else: assert(not isinstance(out, scf.khf.KSCF)) elif nelec[0] != nelec[1] and isinstance(mf, scf.rohf.ROHF): if getattr(mf, '_scf', None): return mol_addons._update_mf_without_soscf(mf, copy.copy(mf._scf), False) else: return copy.copy(mf) else: if isinstance(mf, (scf.hf.RHF, scf.khf.KRHF)): return copy.copy(mf) else: unknown_cls = [scf.kghf.KGHF] for i, cls in enumerate(mf.__class__.__mro__): if cls in unknown_cls: raise NotImplementedError( "No conversion from %s to rhf object" % cls) if nelec[0] == nelec[1]: known_cls = {dft.kuks.KUKS : dft.krks.KRKS, scf.kuhf.KUHF : scf.khf.KRHF , dft.uks.UKS : dft.rks.RKS , scf.uhf.UHF : scf.hf.RHF , dft.kroks.KROKS : dft.krks.KRKS, scf.krohf.KROHF : scf.khf.KRHF , dft.roks.ROKS : dft.rks.RKS , scf.rohf.ROHF : scf.hf.RHF } else: known_cls = {dft.kuks.KUKS : dft.krks.KROKS, scf.kuhf.KUHF : scf.khf.KROHF , dft.uks.UKS : dft.rks.ROKS , scf.uhf.UHF : scf.hf.ROHF } # .with_df should never be removed or changed during the conversion. # It is needed to compute JK matrix in all pbc SCF objects out = mol_addons._object_without_soscf(mf, known_cls, remove_df=False) out = mol_addons.convert_to_rhf(mf, out, False) # Manually update .with_df because this attribute may not be passed to the # output object correctly in molecular convert function out.with_df = mf.with_df return out
def convert_to_rhf(mf, out=None): '''Convert the given mean-field object to the corresponding restricted HF/KS object ''' from pyscf.scf import addons as mol_addons from pyscf.pbc import scf from pyscf.pbc import dft if getattr(mf, 'nelec', None) is None: nelec = mf.cell.nelec else: nelec = mf.nelec if out is not None: assert (isinstance(out, (scf.hf.RHF, scf.khf.KRHF))) if isinstance(mf, scf.khf.KSCF): assert (isinstance(out, scf.khf.KSCF)) else: assert (not isinstance(out, scf.khf.KSCF)) elif nelec[0] != nelec[1] and isinstance(mf, scf.rohf.ROHF): if hasattr(mf, '_scf'): return mol_addons._update_mf_without_soscf(mf, copy.copy(mf._scf), False) else: return copy.copy(mf) else: if isinstance(mf, (scf.hf.RHF, scf.khf.KRHF)): return copy.copy(mf) else: unknown_cls = [scf.kghf.KGHF] for i, cls in enumerate(mf.__class__.__mro__): if cls in unknown_cls: raise NotImplementedError( "No conversion from %s to rhf object" % cls) if nelec[0] == nelec[1]: known_cls = { dft.kuks.KUKS: dft.krks.KRKS, scf.kuhf.KUHF: scf.khf.KRHF, dft.uks.UKS: dft.rks.RKS, scf.uhf.UHF: scf.hf.RHF, dft.kroks.KROKS: dft.krks.KRKS, scf.krohf.KROHF: scf.khf.KRHF, dft.roks.ROKS: dft.rks.RKS, scf.rohf.ROHF: scf.hf.RHF } else: known_cls = { dft.kuks.KUKS: dft.krks.KROKS, scf.kuhf.KUHF: scf.khf.KROHF, dft.uks.UKS: dft.rks.ROKS, scf.uhf.UHF: scf.hf.ROHF } out = mol_addons._object_without_soscf(mf, known_cls, False) return mol_addons.convert_to_rhf(mf, out, False)
def convert_to_rhf(mf, out=None): '''Convert the given mean-field object to the corresponding restricted HF/KS object ''' from pyscf.scf import addons as mol_addons from pyscf.pbc import scf from pyscf.pbc import dft if getattr(mf, 'nelec', None) is None: nelec = mf.cell.nelec else: nelec = mf.nelec if out is not None: assert(isinstance(out, (scf.hf.RHF, scf.khf.KRHF))) if isinstance(mf, scf.khf.KSCF): assert(isinstance(out, scf.khf.KSCF)) else: assert(not isinstance(out, scf.khf.KSCF)) elif nelec[0] != nelec[1] and isinstance(mf, scf.rohf.ROHF): if getattr(mf, '_scf', None): return mol_addons._update_mf_without_soscf(mf, copy.copy(mf._scf), False) else: return copy.copy(mf) else: if isinstance(mf, (scf.hf.RHF, scf.khf.KRHF)): return copy.copy(mf) else: unknown_cls = [scf.kghf.KGHF] for i, cls in enumerate(mf.__class__.__mro__): if cls in unknown_cls: raise NotImplementedError( "No conversion from %s to rhf object" % cls) if nelec[0] == nelec[1]: known_cls = {dft.kuks.KUKS : dft.krks.KRKS, scf.kuhf.KUHF : scf.khf.KRHF , dft.uks.UKS : dft.rks.RKS , scf.uhf.UHF : scf.hf.RHF , dft.kroks.KROKS : dft.krks.KRKS, scf.krohf.KROHF : scf.khf.KRHF , dft.roks.ROKS : dft.rks.RKS , scf.rohf.ROHF : scf.hf.RHF } else: known_cls = {dft.kuks.KUKS : dft.krks.KROKS, scf.kuhf.KUHF : scf.khf.KROHF , dft.uks.UKS : dft.rks.ROKS , scf.uhf.UHF : scf.hf.ROHF } out = mol_addons._object_without_soscf(mf, known_cls, False) return mol_addons.convert_to_rhf(mf, out, False)
def convert_to_uhf(mf, out=None): '''Convert the given mean-field object to the corresponding unrestricted HF/KS object ''' from pyscf.scf import addons as mol_addons from pyscf.pbc import scf from pyscf.pbc import dft if out is None: if isinstance(mf, (scf.uhf.UHF, scf.kuhf.KUHF)): return copy.copy(mf) else: unknown_cls = [scf.kghf.KGHF] for i, cls in enumerate(mf.__class__.__mro__): if cls in unknown_cls: raise NotImplementedError( "No conversion from %s to uhf object" % cls) known_cls = { dft.krks.KRKS: dft.kuks.KUKS, dft.kroks.KROKS: dft.kuks.KUKS, scf.khf.KRHF: scf.kuhf.KUHF, scf.krohf.KROHF: scf.kuhf.KUHF, dft.rks.RKS: dft.uks.UKS, dft.roks.ROKS: dft.uks.UKS, scf.hf.RHF: scf.uhf.UHF, scf.rohf.ROHF: scf.uhf.UHF, } out = mol_addons._object_without_soscf(mf, known_cls, False) else: assert (isinstance(out, (scf.uhf.UHF, scf.kuhf.KUHF))) if isinstance(mf, scf.khf.KSCF): assert (isinstance(out, scf.khf.KSCF)) else: assert (not isinstance(out, scf.khf.KSCF)) return mol_addons.convert_to_uhf(mf, out, False)