38 double frequency)
const {
40 const double eta2 =
opt_.eta *
opt_.eta;
44 for (
Index i_aux = 0; i_aux <
Mmn_.auxsize(); i_aux++) {
47 if (
ppm_.getPpm_weight()(i_aux) < 1.e-9) {
50 const double ppm_freq =
ppm_.getPpm_freq()(i_aux);
51 const double fac = 0.5 *
ppm_.getPpm_weight()(i_aux) * ppm_freq;
52 const Eigen::ArrayXd Mmn2 =
53 Mmn_[gw_level + qpmin_offset].col(i_aux).cwiseAbs2();
54 Eigen::ArrayXd temp = frequency -
rpa_.getRPAInputEnergies().array();
55 temp.segment(0, lumo) += ppm_freq;
56 temp.segment(lumo, levelsum - lumo) -= ppm_freq;
57 Eigen::ArrayXd denom = temp.abs2() + eta2;
58 sigma += fac * (Mmn2 * temp / denom).sum();
64 double frequency)
const {
66 const double eta2 =
opt_.eta *
opt_.eta;
69 double dsigma_domega = 0.0;
70 for (
Index i_aux = 0; i_aux <
Mmn_.auxsize(); i_aux++) {
73 if (
ppm_.getPpm_weight()(i_aux) < 1.e-9) {
76 const double ppm_freq =
ppm_.getPpm_freq()(i_aux);
77 const double fac = 0.5 *
ppm_.getPpm_weight()(i_aux) * ppm_freq;
78 const Eigen::ArrayXd Mmn2 =
79 Mmn_[gw_level + qpmin_offset].col(i_aux).cwiseAbs2();
80 Eigen::ArrayXd temp = frequency -
rpa_.getRPAInputEnergies().array();
81 temp.segment(0, lumo) += ppm_freq;
82 temp.segment(lumo, levelsum - lumo) -= ppm_freq;
83 Eigen::ArrayXd denom = temp.abs2() + eta2;
84 dsigma_domega += fac * ((eta2 - temp.abs2()) * Mmn2 / denom.abs2()).sum();
92 double frequency2)
const {
94 const double eta2 =
opt_.eta *
opt_.eta;
97 const Eigen::VectorXd ppm_weight =
ppm_.getPpm_weight();
98 const Eigen::VectorXd ppm_freqs =
ppm_.getPpm_freq();
100 const Eigen::VectorXd RPAEnergies =
rpa_.getRPAInputEnergies();
102 for (
Index i_aux = 0; i_aux < auxsize; i_aux++) {
105 if (ppm_weight(i_aux) < 1.e-9) {
108 const double ppm_freq = ppm_freqs(i_aux);
109 const double fac = 0.25 * ppm_weight(i_aux) * ppm_freq;
110 const Eigen::MatrixXd& Mmn1 =
Mmn_[gw_level1 + qpmin_offset];
111 const Eigen::MatrixXd& Mmn2 =
Mmn_[gw_level2 + qpmin_offset];
112 const Eigen::ArrayXd Mmn1xMmn2 =
113 Mmn1.col(i_aux).cwiseProduct(Mmn2.col(i_aux));
114 Eigen::ArrayXd temp1 = RPAEnergies;
115 temp1.segment(0, lumo) -= ppm_freq;
116 temp1.segment(lumo, levelsum - lumo) += ppm_freq;
117 Eigen::ArrayXd temp2 = (frequency2 - temp1);
118 temp1 = (frequency1 - temp1);
120 fac * ((temp1 / (temp1.abs2() + eta2) + temp2 / (temp2.abs2() + eta2)) *