40 double frequency)
const {
42 const double eta2 =
opt_.eta *
opt_.eta;
48 for (
Index i_aux = 0; i_aux <
Mmn_.auxsize(); i_aux++) {
49 if (
ppm_->getPpm_weight()(i_aux) < 1.e-9) {
53 const double ppm_freq =
ppm_->getPpm_freq()(i_aux);
54 const double fac = 0.5 *
ppm_->getPpm_weight()(i_aux) * ppm_freq;
56 const Eigen::ArrayXd Mmn2 =
57 Mmn_[gw_level + qpmin_offset].col(i_aux).cwiseAbs2();
59 Eigen::ArrayXd temp = frequency - energies.array();
60 temp.segment(0, lumo) += ppm_freq;
61 temp.segment(lumo, levelsum - lumo) -= ppm_freq;
63 Eigen::ArrayXd denom = temp.abs2() + eta2;
64 sigma += fac * (Mmn2 * temp / denom).sum();
70 Index gw_level,
double frequency)
const {
72 const double eta2 =
opt_.eta *
opt_.eta;
77 double dsigma_domega = 0.0;
78 for (
Index i_aux = 0; i_aux <
Mmn_.auxsize(); i_aux++) {
79 if (
ppm_->getPpm_weight()(i_aux) < 1.e-9) {
83 const double ppm_freq =
ppm_->getPpm_freq()(i_aux);
84 const double fac = 0.5 *
ppm_->getPpm_weight()(i_aux) * ppm_freq;
86 const Eigen::ArrayXd Mmn2 =
87 Mmn_[gw_level + qpmin_offset].col(i_aux).cwiseAbs2();
89 Eigen::ArrayXd temp = frequency - energies.array();
90 temp.segment(0, lumo) += ppm_freq;
91 temp.segment(lumo, levelsum - lumo) -= ppm_freq;
93 Eigen::ArrayXd denom = temp.abs2() + eta2;
94 dsigma_domega += fac * ((eta2 - temp.abs2()) * Mmn2 / denom.abs2()).sum();
102 double frequency2)
const {
104 const double eta2 =
opt_.eta *
opt_.eta;
107 const Eigen::VectorXd ppm_weight =
ppm_->getPpm_weight();
108 const Eigen::VectorXd ppm_freqs =
ppm_->getPpm_freq();
112 double sigma_c = 0.0;
113 for (
Index i_aux = 0; i_aux < auxsize; i_aux++) {
114 if (ppm_weight(i_aux) < 1.e-9) {
118 const double ppm_freq = ppm_freqs(i_aux);
119 const double fac = 0.25 * ppm_weight(i_aux) * ppm_freq;
121 const Eigen::MatrixXd& Mmn1 =
Mmn_[gw_level1 + qpmin_offset];
122 const Eigen::MatrixXd& Mmn2 =
Mmn_[gw_level2 + qpmin_offset];
124 const Eigen::ArrayXd Mmn1xMmn2 =
125 Mmn1.col(i_aux).cwiseProduct(Mmn2.col(i_aux));
127 Eigen::ArrayXd temp1 = energies.array();
128 temp1.segment(0, lumo) -= ppm_freq;
129 temp1.segment(lumo, levelsum - lumo) += ppm_freq;
131 Eigen::ArrayXd temp2 = (frequency2 - temp1);
132 temp1 = (frequency1 - temp1);
135 fac * ((temp1 / (temp1.abs2() + eta2) + temp2 / (temp2.abs2() + eta2)) *