12 auto Fermi = [](
double x) {
return (x > 0 ? exp(-x) / (1 + exp(-x)) : 1 / (1 + exp(x))); };
16 mpi::communicator comm = {};
17 for (
auto k_idx : mpi::chunk(nda::range(obe.
H.
n_k()), comm)) {
19 double KS_term_acc = 0;
20 auto eps = nda::linalg::eigenvalues(nda::matrix<dcomplex>{obe.
H.
H(sigma, k_idx)});
21 for (
auto nu : range(obe.
H.
N_nu(sigma, k_idx))) { KS_term_acc += Fermi(beta * (eps(nu) - mu)); }
22 KS_term += obe.
H.
k_weights(k_idx) * KS_term_acc;
25 KS_term = mpi::all_reduce(KS_term);
33 auto Fermi = [](
double x) {
return (x > 0 ? exp(-x) / (1 + exp(-x)) : 1 / (1 + exp(x))); };
36 mpi::communicator comm = {};
37#pragma omp parallel for collapse(2) reduction(+ : KS_term) default(none) shared(obe, beta, Fermi, comm, mu)
38 for (
auto k_idx : mpi::chunk(nda::range(obe.
H.
n_k()), comm)) {
40 double KS_term_acc = 0;
41 auto eps = obe.
H.
H(sigma, k_idx);
42 for (
auto nu : range(obe.
H.
N_nu(sigma, k_idx))) { KS_term_acc += Fermi(beta * real(eps(nu, nu) - mu)); }
43 KS_term += obe.
H.
k_weights(k_idx) * KS_term_acc;
46 KS_term = mpi::all_reduce(KS_term);
A one-body elements struct where all of the underlying data exists on a fixed momentum grid.