ArrayXd operator()(Array1D En, Array2D psi) { using scalar_t = typename Array1D::Scalar; auto const scale = 1 / (broadening * sqrt(2 * constant::pi)); auto const constant = -0.5f / pow(broadening, 2); // DOS(r) = 1 / (b * sqrt(2pi)) * sum(|psi(r)|^2 * exp(-0.5 * (En-E)^2 / b^2)) ArrayXd ldos(psi.rows()); for (auto i = 0; i < ldos.size(); ++i) { ArrayX<scalar_t> psi2 = psi.row(i).abs2(); auto gaussian = exp((En - target_energy).square() * constant); ldos[i] = scale * sum(psi2 * gaussian); } return ldos; }