def init_guess_by_chkfile(cell, chkfile_name, project=None, kpt=None): '''Read the HF results from checkpoint file and make the density matrix for UHF initial guess. Returns: Density matrix, (nao,nao) ndarray ''' from pyscf import gto chk_cell, scf_rec = chkfile.load_scf(chkfile_name) if project is None: project = not gto.same_basis_set(chk_cell, cell) mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] if kpt is None: kpt = np.zeros(3) if 'kpt' in scf_rec: chk_kpt = scf_rec['kpt'] elif 'kpts' in scf_rec: kpts = scf_rec['kpts'] # the closest kpt from KRHF results where = np.argmin(lib.norm(kpts - kpt, axis=1)) chk_kpt = kpts[where] if getattr(mo[0], 'ndim', None) == 2: # KRHF mo = mo[where] mo_occ = mo_occ[where] else: # KUHF mo = [mo[0][where], mo[1][where]] mo_occ = [mo_occ[0][where], mo_occ[1][where]] else: # from molecular code chk_kpt = np.zeros(3) if project: s = cell.pbc_intor('int1e_ovlp', kpt=kpt) def fproj(mo): if project: mo = addons.project_mo_nr2nr(chk_cell, mo, cell, chk_kpt - kpt) norm = np.einsum('pi,pi->i', mo.conj(), s.dot(mo)) mo /= np.sqrt(norm) return mo if getattr(mo, 'ndim', None) == 2: mo = fproj(mo) mo_occa = (mo_occ > 1e-8).astype(np.double) mo_occb = mo_occ - mo_occa dm = mol_uhf.make_rdm1([mo, mo], [mo_occa, mo_occb]) else: # UHF dm = mol_uhf.make_rdm1([fproj(mo[0]), fproj(mo[1])], mo_occ) # Real DM for gamma point if kpt is None or np.allclose(kpt, 0): dm = dm.real return dm
def init_guess_by_chkfile(cell, chkfile_name, project=None, kpt=None): '''Read the HF results from checkpoint file and make the density matrix for UHF initial guess. Returns: Density matrix, (nao,nao) ndarray ''' from pyscf import gto chk_cell, scf_rec = chkfile.load_scf(chkfile_name) if project is None: project = not gto.same_basis_set(chk_cell, cell) mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] if kpt is None: kpt = np.zeros(3) if 'kpt' in scf_rec: chk_kpt = scf_rec['kpt'] elif 'kpts' in scf_rec: kpts = scf_rec['kpts'] # the closest kpt from KRHF results where = np.argmin(lib.norm(kpts-kpt, axis=1)) chk_kpt = kpts[where] if getattr(mo[0], 'ndim', None) == 2: # KRHF mo = mo[where] mo_occ = mo_occ[where] else: # KUHF mo = [mo[0][where], mo[1][where]] mo_occ = [mo_occ[0][where], mo_occ[1][where]] else: # from molecular code chk_kpt = np.zeros(3) if project: s = cell.pbc_intor('int1e_ovlp', kpt=kpt) def fproj(mo): if project: mo = addons.project_mo_nr2nr(chk_cell, mo, cell, chk_kpt-kpt) norm = np.einsum('pi,pi->i', mo.conj(), s.dot(mo)) mo /= np.sqrt(norm) return mo if getattr(mo, 'ndim', None) == 2: mo = fproj(mo) mo_occa = (mo_occ>1e-8).astype(np.double) mo_occb = mo_occ - mo_occa dm = mol_uhf.make_rdm1([mo,mo], [mo_occa,mo_occb]) else: # UHF dm = mol_uhf.make_rdm1([fproj(mo[0]),fproj(mo[1])], mo_occ) # Real DM for gamma point if kpt is None or np.allclose(kpt, 0): dm = dm.real return dm
def init_guess_by_chkfile(mol, chkfile, project=True): from pyscf.scf import addons if isinstance(chkfile, pyscf.gto.Mole): raise TypeError(''' You see this error message because of the API updates. The first argument is chkfile file name.''') chk_mol, scf_rec = pyscf.scf.chkfile.load_scf(chkfile) def fproj(mo): if project: return addons.project_mo_nr2nr(chk_mol, mo, mol) else: return mo if scf_rec['mo_coeff'].ndim == 2: mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] if numpy.iscomplexobj(mo): raise NotImplementedError( 'TODO: project DHF orbital to ROHF orbital') dm = make_rdm1(fproj(mo), mo_occ) else: # UHF mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] dm = uhf.make_rdm1((fproj(mo[0]), fproj(mo[1])), mo_occ) return dm
def init_guess_by_chkfile(cell, chkfile_name, project=True, kpt=None): '''Read the HF results from checkpoint file, then project it to the basis defined by ``cell`` Returns: Density matrix, (nao,nao) ndarray ''' chk_cell, scf_rec = chkfile.load_scf(chkfile_name) mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] if kpt is None: kpt = np.zeros(3) if 'kpt' in scf_rec: chk_kpt = scf_rec['kpt'] elif 'kpts' in scf_rec: kpts = scf_rec['kpts'] # the closest kpt from KRHF results where = np.argmin(lib.norm(kpts - kpt, axis=1)) chk_kpt = kpts[where] if mo[0].ndim == 2: # KRHF mo = mo[where] mo_occ = mo_occ[where] else: mo = mo[:, where] mo_occ = mo_occ[:, where] else: # from molecular code chk_kpt = np.zeros(3) def fproj(mo): if project: return addons.project_mo_nr2nr(chk_cell, mo, cell, chk_kpt - kpt) else: return mo if mo.ndim == 2: mo = fproj(mo) mo_occa = (mo_occ > 1e-8).astype(np.double) mo_occb = mo_occ - mo_occa dm = mol_uhf.make_rdm1([mo, mo], [mo_occa, mo_occb]) else: # UHF dm = mol_uhf.make_rdm1([fproj(mo[0]), fproj(mo[1])], mo_occ) # Real DM for gamma point if kpt is None or np.allclose(kpt, 0): dm = dm.real return dm
def init_guess_by_chkfile(mol, chkfile, project=True): from pyscf.scf import addons if isinstance(chkfile, pyscf.gto.Mole): raise TypeError(''' You see this error message because of the API updates. The first argument is chkfile file name.''') chk_mol, scf_rec = pyscf.scf.chkfile.load_scf(chkfile) def fproj(mo): if project: return addons.project_mo_nr2nr(chk_mol, mo, mol) else: return mo if scf_rec['mo_coeff'].ndim == 2: mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] if numpy.iscomplexobj(mo): raise NotImplementedError('TODO: project DHF orbital to ROHF orbital') dm = make_rdm1(fproj(mo), mo_occ) else: # UHF mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] dm = uhf.make_rdm1((fproj(mo[0]),fproj(mo[1])), mo_occ) return dm
def init_guess_by_chkfile(mol, chkfile_name, project=None): '''Read SCF chkfile and make the density matrix for GHF initial guess. Kwargs: project : None or bool Whether to project chkfile's orbitals to the new basis. Note when the geometry of the chkfile and the given molecule are very different, this projection can produce very poor initial guess. In PES scanning, it is recommended to swith off project. If project is set to None, the projection is only applied when the basis sets of the chkfile's molecule are different to the basis sets of the given molecule (regardless whether the geometry of the two molecules are different). Note the basis sets are considered to be different if the two molecules are derived from the same molecule with different ordering of atoms. ''' from pyscf.scf import addons chk_mol, scf_rec = chkfile.load_scf(chkfile_name) if project is None: project = not gto.same_basis_set(chk_mol, mol) # Check whether the two molecules are similar if abs(mol.inertia_moment() - chk_mol.inertia_moment()).sum() > 0.5: logger.warn( mol, "Large deviations found between the input " "molecule and the molecule from chkfile\n" "Initial guess density matrix may have large error.") if project: s = hf.get_ovlp(mol) def fproj(mo): if project: mo = addons.project_mo_nr2nr(chk_mol, mo, mol) norm = numpy.einsum('pi,pi->i', mo.conj(), s.dot(mo)) mo /= numpy.sqrt(norm) return mo nao = chk_mol.nao_nr() mo = scf_rec['mo_coeff'] mo_occ = scf_rec['mo_occ'] if getattr(mo[0], 'ndim', None) == 1: # RHF/GHF/DHF if nao * 2 == mo.shape[0]: # GHF or DHF if project: raise NotImplementedError('Project initial guess from ' 'different geometry') else: dm = hf.make_rdm1(mo, mo_occ) else: # RHF mo_coeff = fproj(mo) mo_occa = (mo_occ > 1e-8).astype(numpy.double) mo_occb = mo_occ - mo_occa dma, dmb = uhf.make_rdm1([mo_coeff] * 2, (mo_occa, mo_occb)) dm = scipy.linalg.block_diag(dma, dmb) else: #UHF if getattr(mo[0][0], 'ndim', None) == 2: # KUHF logger.warn( mol, 'k-point UHF results are found. Density matrix ' 'at Gamma point is used for the molecular SCF initial guess') mo = mo[0] dma, dmb = uhf.make_rdm1([fproj(mo[0]), fproj(mo[1])], mo_occ) dm = scipy.linalg.block_diag(dma, dmb) return dm