def _find_iqpt_qpoint(self, qpoint): if duck.is_intlike(qpoint): iq = qpoint qpoint = self.qpoints[iq] else: qpoint = Kpoint.as_kpoint(qpoint, self.structure.reciprocal_lattice) iq = self.qpoints.index(qpoint) return iq, qpoint
def __init__(self, qpoint, freq, displ_cart, structure): """ Args: qpoint: qpoint in reduced coordinates. freq: Phonon frequency in eV. displ: Displacement (Cartesian coordinates, Angstrom) structure: :class:`Structure` object. """ self.qpoint = Kpoint.as_kpoint(qpoint, structure.reciprocal_lattice) self.freq = freq self.displ_cart = displ_cart self.structure = structure
def plot_gkq2_qpath(self, band_kq, band_k, kpoint=0, with_glr=False, qdamp=None, nu_list=None, # spherical_average=False, ax=None, fontsize=8, eph_wtol=EPH_WTOL, **kwargs): r""" Plot the magnitude of the electron-phonon matrix elements <k+q, band_kq| Delta_{q\nu} V |k, band_k> for a given set of (band_kq, band, k) as a function of the q-point. Args: band_ks: Band index of the k+q states (starts at 0) band_k: Band index of the k state (starts at 0) kpoint: |Kpoint| object or index. with_glr: True to plot the long-range component estimated from Verdi's model. qdamp: nu_list: List of phonons modes to be selected (starts at 0). None to select all modes. ax: |matplotlib-Axes| or None if a new figure should be created. fontsize: Label and title fontsize. Return: |matplotlib-Figure| """ if duck.is_intlike(kpoint): ik = kpoint kpoint = self.kpoints[ik] else: kpoint = Kpoint.as_kpoint(kpoint, self.abifiles[0].structure.reciprocal_lattice) ik = self.kpoints.index(kpoint) # Assume abifiles are already ordered according to q-path. xs = list(range(len(self.abifiles))) natom3 = len(self.abifiles[0].structure) * 3 nsppol = self.abifiles[0].nsppol nqpt = len(self.abifiles) gkq_snuq = np.empty((nsppol, natom3, nqpt), dtype=np.complex) if with_glr: gkq_lr = np.empty((nsppol, natom3, nqpt), dtype=np.complex) # TODO: Should take into account possible degeneracies in k and kq... xticks, xlabels = [], [] for iq, abifile in enumerate(self.abifiles): qpoint = abifile.qpoint #d3q_fact = one if not spherical_average else np.sqrt(4 * np.pi) * qpoint.norm name = qpoint.name if qpoint.name is not None else abifile.structure.findname_in_hsym_stars(qpoint) if qpoint.name is not None: xticks.append(iq) xlabels.append(name) phfreqs_ha, phdispl_red = abifile.phfreqs_ha, abifile.phdispl_red ncvar = abifile.reader.read_variable("gkq") for spin in range(nsppol): gkq_atm = ncvar[spin, ik, :, band_k, band_kq] gkq_atm = gkq_atm[:, 0] + 1j * gkq_atm[:, 1] # Transform the gkk matrix elements from (atom, red_direction) basis to phonon-mode basis. gkq_snuq[spin, :, iq] = 0.0 for nu in range(natom3): if phfreqs_ha[nu] < eph_wtol: continue gkq_snuq[spin, nu, iq] = np.dot(phdispl_red[nu], gkq_atm) / np.sqrt(2.0 * phfreqs_ha[nu]) if with_glr: # Compute long range part with (simplified) generalized Frohlich model. gkq_lr[spin, :, iq] = glr_frohlich(qpoint, abifile.becs_cart, abifile.epsinf_cart, abifile.phdispl_cart_bohr, phfreqs_ha, abifile.structure, qdamp=qdamp) ax, fig, plt = get_ax_fig_plt(ax=ax) nu_list = list(range(natom3)) if nu_list is None else list(nu_list) for spin in range(nsppol): for nu in nu_list: ys = np.abs(gkq_snuq[spin, nu]) * abu.Ha_meV pre_label = kwargs.pop("pre_label",r"$g_{\bf q}$") if nsppol == 1: label = r"%s $\nu$: %s" % (pre_label, nu) if nsppol == 2: label = r"%s $\nu$: %s, spin: %s" % (pre_label, nu, spin) ax.plot(xs, ys, linestyle="--", label=label) if with_glr: # Plot model with G = 0 and delta_nn' ys = np.abs(gkq_lr[spin, nu]) * abu.Ha_meV label = r"$g_{\bf q}^{\mathrm{lr0}}$ $\nu$: %s" % nu ax.plot(xs, ys, linestyle="", marker="o", label=label) ax.grid(True) ax.set_xlabel("Wave Vector") ax.set_ylabel(r"$|g_{\bf q}|$ (meV)") if xticks: ax.set_xticks(xticks, minor=False) ax.set_xticklabels(xlabels, fontdict=None, minor=False, size=kwargs.pop("klabel_size", "large")) ax.legend(loc="best", fontsize=fontsize, shadow=True) title = r"$band_{{\bf k} + {\bf q}: %s, band_{\bf{k}}: %s, kpoint: %s" % (band_kq, band_k, repr(kpoint)) ax.set_title(title, fontsize=fontsize) return fig