def Coulomb_integral_ijkq(self, i, j, k, q, spin, integrals, yukawa=False): name = self.Coulomb_integral_name(i, j, k, q, spin) if name in integrals: return integrals[name] # create the Kohn-Sham singles kss_ij = PairDensity(self.paw) kss_ij.initialize(self.paw.wfs.kpt_u[spin], i, j) kss_kq = PairDensity(self.paw) kss_kq.initialize(self.paw.wfs.kpt_u[spin], k, q) rhot_p = kss_ij.with_compensation_charges(self.finegrid != 0) phit_p = np.zeros(rhot_p.shape, rhot_p.dtype) if yukawa: self.screened_poissonsolver.solve(phit_p, rhot_p, charge=None) else: self.poisson.solve(phit_p, rhot_p, charge=None) if self.finegrid == 1: phit = self.gd.zeros() self.restrict(phit_p, phit) else: phit = phit_p rhot = kss_kq.with_compensation_charges(self.finegrid == 2) integrals[name] = self.Coulomb_integral_kss(kss_ij, kss_kq, phit, rhot, yukawa=yukawa) return integrals[name]
def dipole_op(c, state1, state2, k=0, s=0): # Taken from KSSingle, maybe make this accessible in # KSSingle? wfs = c.wfs gd = wfs.gd kpt = None for i in wfs.kpt_u: if i.k == k and i.s == s: kpt = i pd = PairDensity(c) pd.initialize(kpt, state1, state2) # coarse grid contribution # <i|r|j> is the negative of the dipole moment (because of negative # e- charge) me = -gd.calculate_dipole_moment(pd.get()) # augmentation contributions ma = np.zeros(me.shape) pos_av = c.get_atoms().get_positions() / Bohr for a, P_ni in kpt.P_ani.items(): Ra = pos_av[a] Pi_i = P_ni[state1] Pj_i = P_ni[state2] Delta_pL = wfs.setups[a].Delta_pL ni = len(Pi_i) ma0 = 0 ma1 = np.zeros(me.shape) for i in range(ni): for j in range(ni): pij = Pi_i[i] * Pj_i[j] ij = packed_index(i, j, ni) # L=0 term ma0 += Delta_pL[ij, 0] * pij # L=1 terms if wfs.setups[a].lmax >= 1: # see spherical_harmonics.py for # L=1:y L=2:z; L=3:x ma1 += np.array([ Delta_pL[ij, 3], Delta_pL[ij, 1], Delta_pL[ij, 2] ]) * pij ma += sqrt(4 * pi / 3) * ma1 + Ra * sqrt(4 * pi) * ma0 gd.comm.sum(ma) me += ma return me * Bohr
def __init__(self, paw): paw.initialize_positions() self.nspins = paw.wfs.nspins self.nbands = paw.wfs.bd.nbands self.restrict = paw.hamiltonian.restrict self.pair_density = PairDensity(paw.density, paw.atoms, finegrid=True) self.dv = paw.wfs.gd.dv self.dtype = paw.wfs.dtype self.setups = paw.wfs.setups # Allocate space for matrices self.nt_G = paw.wfs.gd.empty() self.rhot_g = paw.density.finegd.empty() self.vt_G = paw.wfs.gd.empty() self.vt_g = paw.density.finegd.empty() self.poisson_solve = paw.hamiltonian.poisson.solve