22#include <nda/linalg.hpp>
25#include "lindhard_chi00.hpp"
26#include "lattice_utility.hpp"
34 template<
typename chi_t,
typename mesh_t>
35 chi_t lindhard_chi00_template(e_k_cvt e_k, mesh_t mesh,
double beta,
double mu,
double delta=0.) {
38 auto kmesh = e_k.mesh();
39 int nb = e_k.target().shape()[0];
40 std::complex<double> idelta(0.0, delta);
42 chi_t chi_wk{{wmesh, kmesh}, {nb, nb, nb, nb}};
43 for (
auto [w, k] : chi_wk.mesh()) chi_wk[w, k] = 0.;
45 auto arr = mpi_view(kmesh);
47#pragma omp parallel for
48 for (
unsigned int qidx = 0; qidx < kmesh.size(); qidx++) {
49 auto q = *std::next(kmesh.begin(), qidx);
54 matrix<std::complex<double>> e_k_mat(e_k[k] - mu);
55 auto [ek, Uk] = linalg::eigh(e_k_mat);
57 matrix<std::complex<double>> e_kq_mat(e_k(k + q) - mu);
58 auto [ekq, Ukq] = linalg::eigh(e_kq_mat);
60 for (
int i : range(nb)) {
61 for (
int j : range(nb)) {
63 double de = ekq(j) - ek(i);
64 double dn = fermi(ek(i) * beta) - fermi(ekq(j) * beta);
66 for (
auto w : wmesh) {
68 std::complex<double> total_factor;
71 if (abs(std::complex<double>(w) + idelta) < tol && abs(de) < tol) {
77 double cosh_be = cosh(0.5 * beta * ek(i));
78 total_factor = beta / (4. * cosh_be * cosh_be);
80 total_factor = dn / (w + idelta + de);
83 chi_wk[w, q](a, b, c, d) << chi_wk[w, q](a, b, c, d) + Uk(a, i) * dagger(Uk)(i, d) * Ukq(c, j) * dagger(Ukq)(j, b) * total_factor;
90 chi_wk = mpi::all_reduce(chi_wk);
91 chi_wk /= kmesh.size();
96 chi_wk_t lindhard_chi00(e_k_cvt e_k, mesh::imfreq mesh,
double mu) {
97 if (mesh.statistic() != Boson) TRIQS_RUNTIME_ERROR <<
"lindhard_chi00: statistic is incorrect.\n";
98 return lindhard_chi00_template<chi_wk_t, mesh::imfreq>(e_k, mesh, mesh.beta(), mu);
101 chi_Dwk_t lindhard_chi00(e_k_cvt e_k, mesh::dlr_imfreq mesh,
double mu) {
102 if (mesh.statistic() != Boson) TRIQS_RUNTIME_ERROR <<
"lindhard_chi00: statistic is incorrect.\n";
103 return lindhard_chi00_template<chi_Dwk_t, mesh::dlr_imfreq>(e_k, mesh, mesh.beta(), mu);
106 chi_fk_t lindhard_chi00(e_k_cvt e_k, mesh::refreq mesh,
double beta,
double mu,
double delta) {
107 return lindhard_chi00_template<chi_fk_t, mesh::refreq>(e_k, mesh, beta, mu, delta);