43 InverseSPD(
rpa_.calculate_epsilon_r(std::complex<double>(0.0, 0.0)));
49#pragma omp parallel for schedule(dynamic)
63 const Eigen::MatrixXd::ConstRowXpr& Imx_row,
double delta,
65 std::complex<double> delta_eta(delta, eta);
67 Eigen::MatrixXd DielMxInv =
rpa_.calculate_epsilon_r(delta_eta);
69 DielMxInv.partialPivLu().solve(Imx_row.transpose()) - Imx_row.transpose();
70 return x.dot(Imx_row.transpose());
75 double frequency)
const {
77 double tolerance = 1
e-10;
78 if (e_f < e_m && e_m < frequency) {
80 }
else if (e_f > e_m && e_m > frequency) {
82 }
else if (std::abs(e_m - frequency) < tolerance && e_f > e_m) {
84 }
else if (std::abs(e_m - frequency) < tolerance && e_f < e_m) {
93 Index gw_level)
const {
95 const Eigen::VectorXd& rpa_energies =
rpa_.getRPAInputEnergies();
96 Index rpatotal = rpa_energies.size();
100 double sigma_c_tail = 0.0;
102 Index lumo = homo + 1;
103 double fermi_rpa = (rpa_energies(lumo) + rpa_energies(homo)) / 2.0;
104 const Eigen::MatrixXd& Imx =
Mmn_[gw_level_offset];
106 for (
Index i = 0; i < rpatotal; ++i) {
107 double delta = rpa_energies(i) - frequency;
108 double abs_delta = std::abs(delta);
115 if (std::abs(factor) > 1
e-10) {
120 if (abs_delta > 1
e-10) {
125 return sigma_c + sigma_c_tail;
132 double frequency)
const {
135 double sigma_c_integral =
gq_.SigmaGQDiag(frequency, gw_level,
rpa_.getEta());
136 return sigma_c_residue + sigma_c_integral;
142 double alpha)
const {
144 double erfc_factor = 0.5 * std::copysign(1.0, delta) *
145 std::exp(std::pow(alpha * delta, 2)) *
146 std::erfc(std::abs(alpha * delta));
148 return row_term * erfc_factor;
static Eigen::VectorXd RowQuadraticForms(const Eigen::MatrixXd &M, const Eigen::MatrixXd &K)
q(i) = M.row(i) K M.row(i)^T for all rows of M.
double CalcDiagContribution(const Eigen::MatrixXd::ConstRowXpr &Imx_row, double delta, double eta) const
double CalcCorrelationDiagElement(Index gw_level, double frequency) const final
ImaginaryAxisIntegration gq_
double CalcResidueContribution(double frequency, Index gw_level) const
std::vector< Eigen::VectorXd > tail_terms_
double CalcDiagContributionValue_tail(double row_term, double delta, double alpha) const
double CalcResiduePrefactor(double e_f, double e_m, double frequency) const
void PrepareScreening() final
Eigen::MatrixXd kDielMxInv_zero_
void CountDiagEval() const
Charge transport classes.
Eigen::MatrixXd InverseSPD(const Eigen::MatrixXd &A)
Provides a means for comparing floating point numbers.
std::string quadrature_scheme