36 rpa_solution =
rpa_.Diagonalize_H2p();
47#pragma omp parallel for schedule(dynamic)
49 Eigen::Map<Eigen::MatrixXd>(
residues_.col(gw_level).data(), B,
S)
50 .noalias() =
Mmn_[gw_level + qpoffset] * modes;
64 const Eigen::VectorXd& nu)
const {
66 throw std::runtime_error(
67 "Sigma_Exact::ScreeningDump: screening modes were not kept "
68 "(setKeepScreeningData before PrepareScreening)");
77 const Eigen::VectorXd inv_omega =
rpa_omegas_.cwiseInverse();
81 Eigen::MatrixXd A = Eigen::MatrixXd::Zero(naux, naux);
82 A.selfadjointView<Eigen::Lower>().rankUpdate(
83 modes_ * (4.0 * inv_omega).cwiseSqrt().asDiagonal());
86 const Eigen::MatrixXd a =
87 4.0 * (es.
vectors.transpose() *
modes_).array().square().matrix();
88 data.
strength = (a.colwise().sum().transpose()).cwiseProduct(inv_omega);
99 double frequency)
const {
106 Index gw_level,
const Eigen::VectorXd& frequencies)
const {
107 for (
Index i = 0; i < frequencies.size(); ++i) {
115 Index gw_level,
double frequency)
const {
123 double frequency2)
const {
125 const Eigen::Vector2d w(frequency1, frequency2);
127 const Eigen::VectorXd r12 =
129 const Eigen::VectorXd sums =
131 return sums(0) + sums(1);
135 const Eigen::VectorXd& frequencies)
const {
143 const Index rpasize = n_occ * n_unocc;
146 Eigen::MatrixXd M(rpasize,
Mmn_.auxsize());
147#pragma omp parallel for schedule(dynamic)
148 for (
Index v = 0; v < n_occ; v++) {
149 M.middleRows(vc.
I(v, 0), n_unocc) =
Mmn_[v].middleRows(n_occ, n_unocc);
151 return M.transpose() * XpY;
Eigen::VectorXd CalcCorrelationDiagElements(Index gw_level, const Eigen::VectorXd &frequencies) const final
ScreeningData ScreeningDump(const Eigen::VectorXd &nu) const final
Eigen::MatrixXd residues_
Eigen::MatrixXd CalcCorrelationOffDiag(const Eigen::VectorXd &frequencies) const final
All off-diagonal elements as blocked matrix products.
Eigen::MatrixXd ScreeningModes(const Eigen::MatrixXd &XpY) const
Eigen::VectorXd screening_energies_
const double * Residues(Index gw_level) const
double CalcCorrelationDiagElementDerivative(Index gw_level, double frequency) const final
void PrepareScreening() final
DiagPoleForm PoleForm(Index gw_level) const final
double CalcCorrelationDiagElement(Index gw_level, double frequency) const final
Eigen::VectorXd rpa_omegas_
double CalcCorrelationOffDiagElement(Index gw_level1, Index gw_level2, double frequency1, double frequency2) const final
bool keep_screening_data_
static void FrameSums(const Eigen::MatrixXd &a, const Eigen::VectorXd &omegas, const Eigen::VectorXd &nu, ScreeningData &data)
void CountDiagEval() const
This class transforms a pair of indices v,c into a compound index I, via I=ctotal*v+c the fast dimens...
Index I(Index v, Index c) const
double Value(const ExactPoles &poles, const double *residues, double w)
S_n(w) at one frequency.
double Derivative(const ExactPoles &poles, const double *residues, double w)
dS_n/dw at one frequency
Eigen::MatrixXd OffDiagonal(const ExactPoles &poles, const Eigen::MatrixXd &residues_all, const Eigen::VectorXd &w)
Eigen::VectorXd Values(const ExactPoles &poles, const double *residues, const Eigen::VectorXd &w)
Eigen::VectorXd ValuesDirectWeighted(const ExactPoles &poles, const double *weights, const Eigen::VectorXd &w)
sum_p a_p f(w - z_p) with given weights a_p (e.g. r_n1 r_n2)
Charge transport classes.
SymmetricEigenSystem SymmetricEigen(const Eigen::MatrixXd &A, bool vectors=true)
With vectors = false only the eigenvalues are computed.
Provides a means for comparing floating point numbers.
Pole sums of the exact (RPA spectral) correlation self-energy.
Eigen::VectorXd frame_weights