38 double frequency)
const {
41 const double eta2 =
opt_.eta *
opt_.eta;
45 for (
Index i_aux = 0; i_aux <
Mmn_.auxsize(); i_aux++) {
48 if (
ppm_.getPpm_weight()(i_aux) < 1.e-9) {
51 const double ppm_freq =
ppm_.getPpm_freq()(i_aux);
52 const double fac = 0.5 *
ppm_.getPpm_weight()(i_aux) * ppm_freq;
53 const Eigen::ArrayXd Mmn2 =
54 Mmn_[gw_level + qpmin_offset].col(i_aux).cwiseAbs2();
55 Eigen::ArrayXd temp = frequency -
rpa_.getRPAInputEnergies().array();
56 temp.segment(0, lumo) += ppm_freq;
57 temp.segment(lumo, levelsum - lumo) -= ppm_freq;
58 Eigen::ArrayXd denom = temp.abs2() + eta2;
59 sigma += fac * (Mmn2 * temp / denom).sum();
65 double frequency)
const {
67 const double eta2 =
opt_.eta *
opt_.eta;
70 double dsigma_domega = 0.0;
71 for (
Index i_aux = 0; i_aux <
Mmn_.auxsize(); i_aux++) {
74 if (
ppm_.getPpm_weight()(i_aux) < 1.e-9) {
77 const double ppm_freq =
ppm_.getPpm_freq()(i_aux);
78 const double fac = 0.5 *
ppm_.getPpm_weight()(i_aux) * ppm_freq;
79 const Eigen::ArrayXd Mmn2 =
80 Mmn_[gw_level + qpmin_offset].col(i_aux).cwiseAbs2();
81 Eigen::ArrayXd temp = frequency -
rpa_.getRPAInputEnergies().array();
82 temp.segment(0, lumo) += ppm_freq;
83 temp.segment(lumo, levelsum - lumo) -= ppm_freq;
84 Eigen::ArrayXd denom = temp.abs2() + eta2;
85 dsigma_domega += fac * ((eta2 - temp.abs2()) * Mmn2 / denom.abs2()).sum();
93 double frequency2)
const {
95 const double eta2 =
opt_.eta *
opt_.eta;
98 const Eigen::VectorXd ppm_weight =
ppm_.getPpm_weight();
99 const Eigen::VectorXd ppm_freqs =
ppm_.getPpm_freq();
101 const Eigen::VectorXd RPAEnergies =
rpa_.getRPAInputEnergies();
103 for (
Index i_aux = 0; i_aux < auxsize; i_aux++) {
106 if (ppm_weight(i_aux) < 1.e-9) {
109 const double ppm_freq = ppm_freqs(i_aux);
110 const double fac = 0.25 * ppm_weight(i_aux) * ppm_freq;
111 const Eigen::MatrixXd& Mmn1 =
Mmn_[gw_level1 + qpmin_offset];
112 const Eigen::MatrixXd& Mmn2 =
Mmn_[gw_level2 + qpmin_offset];
113 const Eigen::ArrayXd Mmn1xMmn2 =
114 Mmn1.col(i_aux).cwiseProduct(Mmn2.col(i_aux));
115 Eigen::ArrayXd temp1 = RPAEnergies;
116 temp1.segment(0, lumo) -= ppm_freq;
117 temp1.segment(lumo, levelsum - lumo) += ppm_freq;
118 Eigen::ArrayXd temp2 = (frequency2 - temp1);
119 temp1 = (frequency1 - temp1);
121 fac * ((temp1 / (temp1.abs2() + eta2) + temp2 / (temp2.abs2() + eta2)) *