Example #1
0
    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;
    }