def calculate_dP_aqvMi(self, wfs): """Overlap between LCAO basis functions and gradient of projectors. Only the gradient wrt the atomic positions in the reference cell is computed. """ nao = wfs.setups.nao nq = len(wfs.ibzk_qc) atoms = [self.atoms[i] for i in self.indices] # Derivatives in reference cell dP_aqvMi = {} for atom, setup in zip(atoms, wfs.setups): a = atom.index dP_aqvMi[a] = np.zeros((nq, 3, nao, setup.ni), wfs.dtype) # Calculate overlap between basis function and gradient of projectors # NOTE: the derivative is calculated wrt the atomic position and not # the real-space coordinate calc = TwoCenterIntegralCalculator(wfs.ibzk_qc, derivative=True) expansions = ManySiteDictionaryWrapper(wfs.tci.P_expansions, dP_aqvMi) calc.calculate(wfs.tci.atompairs, [expansions], [dP_aqvMi]) # Extract derivatives in the reference unit cell # dP_aqvMi = {} # for atom in self.atoms: # dP_aqvMi[atom.index] = dPall_aqvMi[atom.index] return dP_aqvMi
def calculate_dP_aqvMi(self, wfs): """Overlap between LCAO basis functions and gradient of projectors. Only the gradient wrt the atomic positions in the reference cell is computed. """ nao = wfs.setups.nao nq = len(wfs.ibzk_qc) atoms = [self.atoms[i] for i in self.indices] # Derivatives in reference cell dP_aqvMi = {} for atom, setup in zip(atoms, wfs.setups): a = atom.index dP_aqvMi[a] = np.zeros((nq, 3, nao, setup.ni), wfs.dtype) # Calculate overlap between basis function and gradient of projectors # NOTE: the derivative is calculated wrt the atomic position and not # the real-space coordinate calc = TwoCenterIntegralCalculator(wfs.ibzk_qc, derivative=True) expansions = ManySiteDictionaryWrapper(wfs.tci.P_expansions, dP_aqvMi) calc.calculate(wfs.tci.atompairs, [expansions], [dP_aqvMi]) # Extract derivatives in the reference unit cell # dP_aqvMi = {} # for atom in self.atoms: # dP_aqvMi[atom.index] = dPall_aqvMi[atom.index] return dP_aqvMi
def get_tci_dP_aMix(spos_ac, wfs, q, *args, **kwargs): # container for spline expansions of basis function-projector pairs # (note to self: remember to conjugate/negate because of that) from gpaw.lcao.overlap import ManySiteDictionaryWrapper,\ TwoCenterIntegralCalculator, NewTwoCenterIntegrals if not isinstance(wfs.tci, NewTwoCenterIntegrals): raise RuntimeError('Please remember --gpaw=usenewtci=True') dP_aqxMi = {} nao = wfs.setups.nao nq = len(wfs.ibzk_qc) for a, setup in enumerate(wfs.setups): dP_aqxMi[a] = np.zeros((nq, 3, nao, setup.ni), wfs.dtype) calc = TwoCenterIntegralCalculator(wfs.ibzk_qc, derivative=True) expansions = ManySiteDictionaryWrapper(wfs.tci.P_expansions, dP_aqxMi) calc.calculate(wfs.tci.atompairs, [expansions], [dP_aqxMi]) dP_aMix = {} for a in dP_aqxMi: dP_aMix[a] = dP_aqxMi[a].transpose(0, 2, 3, 1).copy()[q] # XXX q return dP_aMix
def get_tci_dP_aMix(spos_ac, wfs, q, *args, **kwargs): # container for spline expansions of basis function-projector pairs # (note to self: remember to conjugate/negate because of that) from gpaw.lcao.overlap import ManySiteDictionaryWrapper,\ TwoCenterIntegralCalculator, NewTwoCenterIntegrals if not isinstance(wfs.tci, NewTwoCenterIntegrals): raise RuntimeError('Please remember --gpaw=usenewtci=True') dP_aqxMi = {} nao = wfs.setups.nao nq = len(wfs.ibzk_qc) for a, setup in enumerate(wfs.setups): dP_aqxMi[a] = np.zeros((nq, 3, nao, setup.ni), wfs.dtype) calc = TwoCenterIntegralCalculator(wfs.ibzk_qc, derivative=True) expansions = ManySiteDictionaryWrapper(wfs.tci.P_expansions, dP_aqxMi) calc.calculate(wfs.tci.atompairs, [expansions], [dP_aqxMi]) dP_aMix = {} for a in dP_aqxMi: dP_aMix[a] = dP_aqxMi[a].transpose(0, 2, 3, 1).copy()[q] # XXX q return dP_aMix