38bool CdaDebugEnabled() {
39 const char* env = std::getenv(
"VOTCA_XTP_CDA_DEBUG");
40 return env !=
nullptr && std::string(env) ==
"1";
43bool CdaDebugLevelMatch(
Index level) {
44 const char* env = std::getenv(
"VOTCA_XTP_CDA_DEBUG_LEVELS");
49 std::set<int> allowed;
50 std::stringstream ss(env);
52 while (std::getline(ss, token,
',')) {
54 allowed.insert(std::stoi(token));
57 return allowed.count(
static_cast<int>(level)) > 0;
60bool CdaDebugMatch(
Index level) {
61 return CdaDebugEnabled() && CdaDebugLevelMatch(level);
71 options opt,
const RPA& rpa,
const Eigen::MatrixXd& kDielMxInv_zero) {
80 options opt,
const RPA_UKS& rpa,
const Eigen::MatrixXd& kDielMxInv_zero) {
91 const RPA& rpa,
const Eigen::MatrixXd& kDielMxInv_zero) {
94 for (
Index j = 0; j <
gq_->Order(); j++) {
95 double newpoint =
gq_->ScaledPoint(j);
97 eps_inv_j.diagonal().array() -= 1.0;
100 kDielMxInv_zero * std::exp(-std::pow(
opt_.alpha * newpoint, 2));
105 const RPA_UKS& rpa,
const Eigen::MatrixXd& kDielMxInv_zero) {
108 for (
Index j = 0; j <
gq_->Order(); j++) {
109 double newpoint =
gq_->ScaledPoint(j);
111 eps_inv_j.diagonal().array() -= 1.0;
114 kDielMxInv_zero * std::exp(-std::pow(
opt_.alpha * newpoint, 2));
121 const std::vector<Eigen::MatrixXd>& dielinv_matrices_r)
125 Eigen::VectorXcd denominator;
126 const std::complex<double> cpoint(0.0, point);
129 (
DeltaE_ + cpoint).cwiseInverse() + (
DeltaE_ - cpoint).cwiseInverse();
131 denominator = (
DeltaE_ + cpoint).cwiseInverse();
135 .cwiseProduct(denominator.asDiagonal() *
Imx_))
152 const Eigen::MatrixXd& Imx =
Mmn_[gw_level_offset];
153 Eigen::ArrayXcd DeltaE = frequency -
energies_.array();
154 DeltaE.imag().head(occ) = eta;
155 DeltaE.imag().tail(unocc) = -eta;
157 if (CdaDebugMatch(gw_level)) {
158 double min_abs = std::numeric_limits<double>::max();
159 for (
Index i = 0; i < DeltaE.size(); ++i) {
160 min_abs = std::min(min_abs, std::abs(DeltaE(i)));
163 std::cout <<
"\n [CDA-DEBUG] ImagAxis level=" << gw_level
164 <<
" freq=" << frequency <<
" eta=" << eta
165 <<
" min|DeltaE|=" << min_abs <<
" ||Imx||=" << Imx.norm();
167 for (
Index i = 0; i < DeltaE.size(); ++i) {
168 std::cout <<
"\n [CDA-DEBUG] ImagAxis i=" << i
169 <<
" occ=" << (i < occ ? 1 : 0) <<
" DeltaE=" << DeltaE(i);
171 std::cout << std::flush;
175 return gq_->Integrate(f);
const std::vector< Eigen::MatrixXd > & dielinv_matrices_r_
double operator()(Index j, double point, bool symmetry) const
FunctionEvaluation(const Eigen::MatrixXd &Imx, const Eigen::ArrayXcd &DeltaE, const std::vector< Eigen::MatrixXd > &dielinv_matrices_r)
const Eigen::MatrixXd & Imx_
const Eigen::ArrayXcd & DeltaE_
double SigmaGQDiag(double frequency, Index gw_level, double eta) const
const Eigen::VectorXd & energies_
void CalcDielInvVector(const RPA &rpa, const Eigen::MatrixXd &kDielMxInv_zero)
std::vector< Eigen::MatrixXd > dielinv_matrices_r_
ImaginaryAxisIntegration(const Eigen::VectorXd &energies, const TCMatrix_gwbse &Mmn)
void configure(options opt, const RPA &rpa, const Eigen::MatrixXd &kDielMxInv_zero)
const TCMatrix_gwbse & Mmn_
std::unique_ptr< GaussianQuadratureBase > gq_
Unrestricted RPA helper for spin-resolved GW screening.
Eigen::MatrixXd calculate_epsilon_i(double frequency) const
Dielectric matrix on the imaginary frequency axis.
Eigen::MatrixXd calculate_epsilon_i(double frequency) const
Charge transport classes.
Provides a means for comparing floating point numbers.