30template <
typename RPAType>
31Index ConstructPPMParametersImpl(
const RPAType& rpa, Eigen::MatrixXd& ppm_phi,
32 Eigen::VectorXd& ppm_weight,
33 Eigen::VectorXd& ppm_freq,
double screening_r,
37 ppm_phi = std::move(es.vectors);
39 ppm_weight = 1 - es.values.array().inverse();
42 const Eigen::MatrixXd eps_i = rpa.calculate_epsilon_i(screening_i);
43 const Eigen::MatrixXd half = eps_i * ppm_phi;
44 const Eigen::MatrixXd epsilon_1_inv =
InverseSPD(ppm_phi.transpose() * half);
46 ppm_freq.resize(es.values.size());
48#pragma omp parallel for reduction(+ : invalid)
49 for (
Index i = 0; i < es.values.size(); i++) {
50 if (ppm_weight(i) < 1.e-5) {
55 double nom = epsilon_1_inv(i, i) - 1.0;
57 -1.0 * nom / (nom + ppm_weight(i)) * screening_i * screening_i;
63 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.
SymmetricEigenSystem SymmetricEigen(const Eigen::MatrixXd &A, bool vectors=true)
With vectors = false only the eigenvalues are computed.
Eigen::MatrixXd InverseSPD(const Eigen::MatrixXd &A)
Provides a means for comparing floating point numbers.