def grab_3d_hs(mf): mol = mf.mol mo_coeff = mf.mo_coeff mc = mcscf.CASCI(mf, 5, 6) ncore = (mol.nelectron // 2) - 2 nocc = ncore + 4 symms = symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, mo_coeff) irrep_cmo = {} for irrep in np.unique(symms[:ncore]): irrep_cmo[irrep] = np.count_nonzero(symms[:ncore] == irrep) cas_irreps = {'Ag': 2, 'B1g': 1, 'B2g': 1, 'B3g': 1} for iorb in range(ncore, nocc): cas_irreps[symms[iorb]] -= 1 print("Found {} singly-occupied orbital".format(symms[iorb])) for key in cas_irreps: if cas_irreps[key] == 1: missing_3d = key irrep_cmo[missing_3d] -= 1 cas_irreps = {'Ag': 2, 'B1g': 1, 'B2g': 1, 'B3g': 1} print("Missing D orbital from SOMOs is apparently {}".format(missing_3d)) print("SOMOs: {}".format(symms[ncore:nocc])) idx_3d = symms == missing_3d idx_3d[ncore:] = False mo_coeff[:, idx_3d] = grab_ao(mol, mo_coeff[:, idx_3d], 'Fe 3d', sorting=1) mo_coeff = sort_mo_by_irrep(mc, mo_coeff, cas_irreps, cas_irrep_ncore=irrep_cmo) symms = symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, mo_coeff) return mo_coeff
def grab_3d_ls(mf): mol = mf.mol mo_coeff = mf.mo_coeff mc = mcscf.CASCI(mf, 5, 6) ncore = mol.nelectron // 2 symms = symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, mo_coeff) idx_virt_ag = symms == 'Ag' idx_virt_ag[:ncore] = False mo_coeff[:, idx_virt_ag] = grab_ao(mol, mo_coeff[:, idx_virt_ag], 'Fe 3d', sorting=-1) for ir in ('B1g', 'B2g', 'B3g'): idx_occ_ir = symms == ir idx_occ_ir[ncore:] = False mo_coeff[:, idx_occ_ir] = grab_ao(mol, mo_coeff[:, idx_occ_ir], 'Fe 3d', sorting=1) irrep_cmo = {} for irrep in np.unique(symms[:ncore]): irrep_cmo[irrep] = np.count_nonzero(symms[:ncore] == irrep) irrep_cmo['B1g'] -= 1 irrep_cmo['B2g'] -= 1 irrep_cmo['B3g'] -= 1 mo_coeff = sort_mo_by_irrep(mc, mo_coeff, { 'Ag': 2, 'B1g': 1, 'B2g': 1, 'B3g': 1 }, cas_irrep_ncore=irrep_cmo) symms = symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, mo_coeff) return mo_coeff
def sort_mo_by_irrep(self, cas_irrep_nocc, cas_irrep_ncore=None, mo_coeff=None, s=None): '''Select active space based on symmetry information. See also :func:`pyscf.mcscf.addons.sort_mo_by_irrep` ''' if mo_coeff is None: mo_coeff = self.mo_coeff return addons.sort_mo_by_irrep(self, mo_coeff, cas_irrep_nocc, cas_irrep_ncore, s)
def sort_mo_by_irrep(self, cas_irrep_nocc, cas_irrep_ncore=None, mo_coeff=None, s=None): from pyscf.mcscf import addons if mo_coeff is None: mo_coeff = self.mo_coeff return addons.sort_mo_by_irrep(self, mo_coeff, cas_irrep_nocc, cas_irrep_ncore, s)