64 double frequency)
const {
65 const double eta2 =
opt_.eta *
opt_.eta;
74 const Eigen::ArrayXd res_12 =
residues_[gw_level].col(s).cwiseAbs2();
76 Eigen::ArrayXd temp = -energies.array() + frequency;
77 temp.segment(0, n_occ) += eigenvalue;
78 temp.segment(n_occ, n_unocc) -= eigenvalue;
80 const Eigen::ArrayXd denom = temp.abs2() + eta2;
81 sigma += (res_12 * temp / denom).sum();
87 Index gw_level,
double frequency)
const {
88 const double eta2 =
opt_.eta *
opt_.eta;
94 double dsigma_domega = 0.0;
97 const Eigen::ArrayXd res_12 =
residues_[gw_level].col(s).cwiseAbs2();
99 Eigen::ArrayXd temp = -energies.array() + frequency;
100 temp.segment(0, n_occ) += eigenvalue;
101 temp.segment(n_occ, n_unocc) -= eigenvalue;
103 const Eigen::ArrayXd denom = temp.abs2() + eta2;
104 dsigma_domega += ((eta2 - temp.abs2()) * res_12 / denom.abs2()).sum();
106 return dsigma_domega;
112 double frequency2)
const {
113 const double eta2 =
opt_.eta *
opt_.eta;
119 double sigma_c = 0.0;
122 const Eigen::VectorXd& res1 =
residues_[gw_level1].col(s);
123 const Eigen::VectorXd& res2 =
residues_[gw_level2].col(s);
124 const Eigen::VectorXd res_12 = res1.cwiseProduct(res2);
126 Eigen::ArrayXd temp1 = -energies.array();
127 temp1.segment(0, n_occ) += eigenvalue;
128 temp1.segment(n_occ, n_unocc) -= eigenvalue;
130 const Eigen::ArrayXd temp2 = temp1 + frequency2;
133 const Eigen::ArrayXd numer1 = res_12.array() * temp1;
134 const Eigen::ArrayXd numer2 = res_12.array() * temp2;
135 const Eigen::ArrayXd denom1 = temp1.abs2() + eta2;
136 const Eigen::ArrayXd denom2 = temp2.abs2() + eta2;
138 sigma_c += 0.5 * ((numer1 / denom1) + (numer2 / denom2)).sum();