Recovery of observables on a real-frequency mesh

Recovery of the real-frequency version of a dynamical observable, such as the retarded Green’s function \(G^\mathrm{ret}(\epsilon)\), from a spectral function \(A(\epsilon)\) is performed by function som.fill_refreq(). It applies a variant of the Hilbert transform to the spectrum and projects the result onto a regular grid of real energy points

\[\epsilon_i = \epsilon_\mathrm{min} + i\Delta\epsilon,\ i=\overline{0, I-1},\ \Delta\epsilon = \frac{\epsilon_\mathrm{max} - \epsilon_\mathrm{min}}{I - 1}.\]

A final solution produced by SOM has a general sum-of-rectangles form

\[ \begin{align}\begin{aligned}A(\epsilon) = \sum_{k=1}^K R_{\{c_k, w_k, h_k\}}(\epsilon),\\R_{\{c, w, h\}}(\epsilon) \equiv h \theta(w/2-|\epsilon-c|).\end{aligned}\end{align} \]

Before SOM 2.0, the retarded Green’s function would be recovered and projected onto the frequency mesh as

\[G^\mathrm{ret}(\epsilon_i) = -\int\limits_{-\infty}^\infty d\epsilon' \frac{A(\epsilon')}{\epsilon' - \epsilon_i - i0} = -\sum_{k=1}^K h_k \int\limits_{c_k-w_k/2}^{c_k+w_k/2} \frac{d\epsilon'}{\epsilon' - \epsilon_i - i0}.\]

By default, SOM 2.x uses binning while projecting onto the frequency mesh. It splits the energy window \([\epsilon_\mathrm{min};\epsilon_\mathrm{max}]\) into \(I\) bins,

\[\begin{split}\mathfrak{B}_i = \left\{ \begin{array}{ll} [\epsilon_\mathrm{min}; \epsilon_\mathrm{min}+\Delta\epsilon/2], &i=0,\\ [\epsilon_i-\Delta\epsilon/2; \epsilon_i+\Delta\epsilon/2], &i=\overline{1,I-2},\\ [\epsilon_\mathrm{max}-\Delta\epsilon/2; \epsilon_\mathrm{max}+\Delta\epsilon/2], &i=I-1. \end{array} \right.\end{split}\]

and averages the integration results over the bins,

\[\begin{split}G^\mathrm{ret}(\epsilon_i) \approx - \frac{1}{|\mathfrak{B}_i|} \int_{\mathfrak{B}_i} d\epsilon \int\limits_{-\infty}^\infty d\epsilon' \frac{A(\epsilon')}{\epsilon' - \epsilon - i0} =\\= -\sum_{k=1}^K h_k \frac{1}{|\mathfrak{B}_i|} \int_{\mathfrak{B}_i} d\epsilon \int\limits_{c_k-w_k/2}^{c_k+w_k/2} \frac{d\epsilon'}{\epsilon' - \epsilon - i0}.\end{split}\]

Owing to the extra integral, projection with binning makes for smoother resulting curves for the same number of energy points \(\epsilon_i\). The old behavior can be enabled by passing with_binning=False to som.fill_refreq().

som.compute_tail() is another useful function that extracts information about the high frequency expansion coefficients of \(G^\mathrm{ret}(\epsilon)\) from \(A(\epsilon)\).