30template <
typename RPAType>
31void ConstructPPMParametersImpl(
const RPAType& rpa, Eigen::MatrixXd& ppm_phi,
32 Eigen::VectorXd& ppm_weight,
33 Eigen::VectorXd& ppm_freq,
double screening_r,
35 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(
36 rpa.calculate_epsilon_r(screening_r));
37 ppm_phi = es.eigenvectors();
39 ppm_weight = 1 - es.eigenvalues().array().inverse();
41 Eigen::MatrixXd ortho =
42 ppm_phi.transpose() * rpa.calculate_epsilon_i(screening_i) * ppm_phi;
43 Eigen::MatrixXd epsilon_1_inv = ortho.inverse();
45 ppm_freq.resize(es.eigenvalues().size());
46#pragma omp parallel for
47 for (
Index i = 0; i < es.eigenvalues().size(); i++) {
48 if (ppm_weight(i) < 1.e-5) {
53 double nom = epsilon_1_inv(i, i) - 1.0;
55 -1.0 * nom / (nom + ppm_weight(i)) * screening_i * screening_i;
56 ppm_freq(i) = std::sqrt(std::abs(frac));
Eigen::VectorXd ppm_freq_
Eigen::VectorXd ppm_weight_
void PPM_construct_parameters(const RPA &rpa)
Unrestricted RPA helper for spin-resolved GW screening.
Charge transport classes.
Provides a means for comparing floating point numbers.