def ecp_ano_det_ovlp(atm_ecp, atm_ano, ecpcore): ecp_ao_loc = atm_ecp.ao_loc_nr() ano_ao_loc = atm_ano.ao_loc_nr() ecp_ao_dim = ecp_ao_loc[1:] - ecp_ao_loc[:-1] ano_ao_dim = ano_ao_loc[1:] - ano_ao_loc[:-1] ecp_bas_l = [[atm_ecp.bas_angular(i)] * d for i, d in enumerate(ecp_ao_dim)] ano_bas_l = [[atm_ano.bas_angular(i)] * d for i, d in enumerate(ano_ao_dim)] ecp_bas_l = numpy.hstack(ecp_bas_l) ano_bas_l = numpy.hstack(ano_bas_l) ecp_idx = [] ano_idx = [] for l in range(4): nocc, nfrac = atom_hf.frac_occ(stdsymb, l) if nfrac > 1e-15: nocc += 1 if nocc == 0: break i0 = ecpcore[l] * (2 * l + 1) i1 = nocc * (2 * l + 1) ecp_idx.append(numpy.where(ecp_bas_l == l)[0][:i1 - i0]) ano_idx.append(numpy.where(ano_bas_l == l)[0][i0:i1]) ecp_idx = numpy.hstack(ecp_idx) ano_idx = numpy.hstack(ano_idx) s12 = gto.intor_cross('int1e_ovlp', atm_ecp, atm_ano)[ecp_idx][:, ano_idx] return numpy.linalg.det(s12)
def minao_basis(symb): basis_add = pyscf.gto.basis.load('ano', symb) occ = [] basis_new = [] for l in range(4): ndocc, nfrac = atom_hf.frac_occ(symb, l) if ndocc > 0: occ.extend([2]*ndocc*(2*l+1)) if nfrac > 1e-15: occ.extend([nfrac]*(2*l+1)) ndocc += 1 if ndocc > 0: basis_new.append([l] + [b[:ndocc+1] for b in basis_add[l][1:]]) return occ, basis_new
def ecp_ano_det_ovlp(atm_ecp, atm_ano, ecpcore): ecp_ao_loc = atm_ecp.ao_loc_nr() ano_ao_loc = atm_ano.ao_loc_nr() ecp_ao_dim = ecp_ao_loc[1:] - ecp_ao_loc[:-1] ano_ao_dim = ano_ao_loc[1:] - ano_ao_loc[:-1] ecp_bas_l = [[atm_ecp.bas_angular(i)] * d for i, d in enumerate(ecp_ao_dim)] ano_bas_l = [[atm_ano.bas_angular(i)] * d for i, d in enumerate(ano_ao_dim)] ecp_bas_l = numpy.hstack(ecp_bas_l) ano_bas_l = numpy.hstack(ano_bas_l) nelec_core = 0 ecp_occ_tmp = [] ecp_idx = [] ano_idx = [] for l in range(4): nocc, frac = atom_hf.frac_occ(stdsymb, l) l_occ = [2] * ((nocc - ecpcore[l]) * (2 * l + 1)) if frac > 1e-15: l_occ.extend([frac] * (2 * l + 1)) nocc += 1 if nocc == 0: break nelec_core += 2 * ecpcore[l] * (2 * l + 1) i0 = ecpcore[l] * (2 * l + 1) i1 = nocc * (2 * l + 1) ecp_idx.append(numpy.where(ecp_bas_l == l)[0][:i1 - i0]) ano_idx.append(numpy.where(ano_bas_l == l)[0][i0:i1]) ecp_occ_tmp.append(l_occ[:i1 - i0]) ecp_idx = numpy.hstack(ecp_idx) ano_idx = numpy.hstack(ano_idx) ecp_occ = numpy.zeros(atm_ecp.nao_nr()) ecp_occ[ecp_idx] = numpy.hstack(ecp_occ_tmp) nelec_valence_left = int( gto.charge(stdsymb) - nelec_core - sum(ecp_occ[ecp_idx])) if nelec_valence_left > 0: logger.warn( mol, 'Characters of %d valence electrons are not identified.\n' 'It can affect the "meta-lowdin" localization method ' 'and the population analysis of SCF method.\n' 'Adjustment to the core/valence partition may be needed ' '(see function lo.nao.set_atom_conf)\nto get reasonable ' 'local orbitals or Mulliken population.\n', nelec_valence_left) # Return 0 to force the projection to ANO basis return 0 else: s12 = gto.intor_cross('int1e_ovlp', atm_ecp, atm_ano)[ecp_idx][:, ano_idx] return numpy.linalg.det(s12)
def ecp_ano_det_ovlp(atm_ecp, atm_ano, ecpcore): ecp_ao_loc = atm_ecp.ao_loc_nr() ano_ao_loc = atm_ano.ao_loc_nr() ecp_ao_dim = ecp_ao_loc[1:] - ecp_ao_loc[:-1] ano_ao_dim = ano_ao_loc[1:] - ano_ao_loc[:-1] ecp_bas_l = [[atm_ecp.bas_angular(i)]*d for i,d in enumerate(ecp_ao_dim)] ano_bas_l = [[atm_ano.bas_angular(i)]*d for i,d in enumerate(ano_ao_dim)] ecp_bas_l = numpy.hstack(ecp_bas_l) ano_bas_l = numpy.hstack(ano_bas_l) nelec_core = 0 ecp_occ_tmp = [] ecp_idx = [] ano_idx = [] for l in range(4): nocc, frac = atom_hf.frac_occ(stdsymb, l) l_occ = [2] * ((nocc-ecpcore[l])*(2*l+1)) if frac > 1e-15: l_occ.extend([frac] * (2*l+1)) nocc += 1 if nocc == 0: break nelec_core += 2 * ecpcore[l] * (2*l+1) i0 = ecpcore[l] * (2*l+1) i1 = nocc * (2*l+1) ecp_idx.append(numpy.where(ecp_bas_l==l)[0][:i1-i0]) ano_idx.append(numpy.where(ano_bas_l==l)[0][i0:i1]) ecp_occ_tmp.append(l_occ[:i1-i0]) ecp_idx = numpy.hstack(ecp_idx) ano_idx = numpy.hstack(ano_idx) ecp_occ = numpy.zeros(atm_ecp.nao_nr()) ecp_occ[ecp_idx] = numpy.hstack(ecp_occ_tmp) nelec_valence_left = int(gto.mole.charge(stdsymb) - nelec_core - sum(ecp_occ[ecp_idx])) if nelec_valence_left > 0: logger.warn(mol, 'Characters of %d valence electrons are not identified.\n' 'It can affect the "meta-lowdin" localization method ' 'and the population analysis of SCF method.\n' 'Adjustment to the core/valence partition may be needed ' '(see function lo.nao.set_atom_conf)\nto get reasonable ' 'local orbitals or Mulliken population.\n', nelec_valence_left) # Return 0 to force the projection to ANO basis return 0 else: s12 = gto.intor_cross('int1e_ovlp', atm_ecp, atm_ano)[ecp_idx][:,ano_idx] return numpy.linalg.det(s12)
def minao_basis(symb, nelec_ecp): basis_add = pyscf.gto.basis.load('ano', symb) occ = [] basis_new = [] coreshl = pyscf.gto.ecp.core_configuration(nelec_ecp) #coreshl = (0,0,0,0) for l in range(4): ndocc, nfrac = atom_hf.frac_occ(symb, l) if coreshl[l] > 0: occ.extend([0]*coreshl[l]*(2*l+1)) if ndocc > coreshl[l]: occ.extend([2]*(ndocc-coreshl[l])*(2*l+1)) if nfrac > 1e-15: occ.extend([nfrac]*(2*l+1)) ndocc += 1 if ndocc > 0: basis_new.append([l] + [b[:ndocc+1] for b in basis_add[l][1:]]) return occ, basis_new
def minao_basis(symb, nelec_ecp): basis_add = pyscf.gto.basis.load('ano', symb) occ = [] basis_new = [] # coreshl defines the core shells to be removed in the initial guess coreshl = pyscf.gto.ecp.core_configuration(nelec_ecp) #coreshl = (0,0,0,0) # it keeps all core electrons in the initial guess for l in range(4): ndocc, nfrac = atom_hf.frac_occ(symb, l) if coreshl[l] > 0: occ.extend([0]*coreshl[l]*(2*l+1)) if ndocc > coreshl[l]: occ.extend([2]*(ndocc-coreshl[l])*(2*l+1)) if nfrac > 1e-15: occ.extend([nfrac]*(2*l+1)) ndocc += 1 if ndocc > 0: basis_new.append([l] + [b[:ndocc+1] for b in basis_add[l][1:]]) return occ, basis_new
def minao_basis(symb, nelec_ecp): basis_add = gto.basis.load('ano', symb) occ = [] basis_new = [] # coreshl defines the core shells to be removed in the initial guess coreshl = gto.ecp.core_configuration(nelec_ecp) #coreshl = (0,0,0,0) # it keeps all core electrons in the initial guess for l in range(4): ndocc, nfrac = atom_hf.frac_occ(symb, l) if coreshl[l] > 0: occ.extend([0]*coreshl[l]*(2*l+1)) if ndocc > coreshl[l]: occ.extend([2]*(ndocc-coreshl[l])*(2*l+1)) if nfrac > 1e-15: occ.extend([nfrac]*(2*l+1)) ndocc += 1 if ndocc > 0: basis_new.append([l] + [b[:ndocc+1] for b in basis_add[l][1:]]) return occ, basis_new