56 const Eigen::MatrixXd& M =
Mmn_[gw_level + qpmin_offset];
58 const Eigen::VectorXd& weight =
ppm_->getPpm_weight();
59 const Eigen::VectorXd& omega =
ppm_->getPpm_freq();
61 for (
Index i_aux = 0; i_aux <
Mmn_.auxsize(); i_aux++) {
62 if (weight(i_aux) < 1.e-9) {
65 const double ppm_freq = omega(i_aux);
66 const double fac = 0.5 * weight(i_aux) * ppm_freq;
67 const auto m2 = M.col(i_aux).array().square();
68 const auto t_occ = (frequency + ppm_freq) -
e.head(lumo);
69 const auto t_virt = (frequency - ppm_freq) -
e.tail(levelsum - lumo);
70 result += fac * ((m2.head(lumo) * term(t_occ)).sum() +
71 (m2.tail(levelsum - lumo) * term(t_virt)).sum());
104 double frequency2)
const {
108 const double eta2 =
opt_.eta *
opt_.eta;
111 const Eigen::VectorXd ppm_weight =
ppm_->getPpm_weight();
112 const Eigen::VectorXd ppm_freqs =
ppm_->getPpm_freq();
116 double sigma_c = 0.0;
117 for (
Index i_aux = 0; i_aux < auxsize; i_aux++) {
118 if (ppm_weight(i_aux) < 1.e-9) {
122 const double ppm_freq = ppm_freqs(i_aux);
123 const double fac = 0.25 * ppm_weight(i_aux) * ppm_freq;
125 const Eigen::MatrixXd& Mmn1 =
Mmn_[gw_level1 + qpmin_offset];
126 const Eigen::MatrixXd& Mmn2 =
Mmn_[gw_level2 + qpmin_offset];
128 const Eigen::ArrayXd Mmn1xMmn2 =
129 Mmn1.col(i_aux).cwiseProduct(Mmn2.col(i_aux));
131 Eigen::ArrayXd temp1 = energies.array();
132 temp1.segment(0, lumo) -= ppm_freq;
133 temp1.segment(lumo, levelsum - lumo) += ppm_freq;
135 Eigen::ArrayXd temp2 = (frequency2 - temp1);
136 temp1 = (frequency1 - temp1);
139 fac * ((temp1 / (temp1.abs2() + eta2) + temp2 / (temp2.abs2() + eta2)) *