votca 2026-dev
Loading...
Searching...
No Matches
gw_uks.h
Go to the documentation of this file.
1/*
2 * Copyright 2009-2026 The VOTCA Development Team
3 * (http://www.votca.org)
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License")
6 */
7#pragma once
8#ifndef VOTCA_XTP_GW_UKS_H
9#define VOTCA_XTP_GW_UKS_H
10
11#include <memory>
12
13#include "logger.h"
14#include "orbitals.h"
15#include "rpa_uks.h"
16#include "sigma_base_uks.h"
17#include "threecenter.h"
18#include "votca/xtp/ppm.h"
19
20namespace votca {
21namespace xtp {
22
23class GW_UKS {
24 public:
51
53 const Eigen::MatrixXd& vxc_alpha, const Eigen::MatrixXd& vxc_beta,
54 const Eigen::VectorXd& dft_energies_alpha,
55 const Eigen::VectorXd& dft_energies_beta);
56
57 void configure(const options& opt);
59 void CalculateHQP();
60
61 Eigen::VectorXd getGWAResultsAlpha() const;
62 Eigen::VectorXd getGWAResultsBeta() const;
63 const Eigen::VectorXd& RPAInputEnergiesAlpha() const;
64 const Eigen::VectorXd& RPAInputEnergiesBeta() const;
65 Eigen::MatrixXd getHQPAlpha() const;
66 Eigen::MatrixXd getHQPBeta() const;
67 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> DiagonalizeQPHamiltonianAlpha()
68 const;
69 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> DiagonalizeQPHamiltonianBeta()
70 const;
71
72 private:
73 enum class Spin { Alpha, Beta };
74
75 class QPFunc {
76 public:
77 QPFunc(Index gw_level, const Sigma_base_UKS& sigma, double offset)
78 : gw_level_(gw_level), offset_(offset), sigma_c_func_(sigma) {}
79
80 std::pair<double, double> operator()(double frequency) const {
81 std::pair<double, double> result;
82 result.first = value(frequency);
83 result.second = deriv(frequency);
84 return result;
85 }
86
87 double value(double frequency) const {
88 return sigma_c_func_.CalcCorrelationDiagElement(gw_level_, frequency) +
89 offset_ - frequency;
90 }
91
92 double deriv(double frequency) const {
93 return sigma_c_func_.CalcCorrelationDiagElementDerivative(gw_level_,
94 frequency) -
95 1.0;
96 }
97
98 private:
100 double offset_;
102 };
103
105 const Eigen::VectorXd& DftEnergies(Spin spin) const;
106 const Eigen::MatrixXd& Vxc(Spin spin) const;
107 Eigen::MatrixXd& SigmaX(Spin spin);
108 Eigen::MatrixXd& SigmaC(Spin spin);
109 const Eigen::MatrixXd& SigmaX(Spin spin) const;
110 const Eigen::MatrixXd& SigmaC(Spin spin) const;
112 const Sigma_base_UKS& SigmaEvaluator(Spin spin) const;
113 Index Homo(Spin spin) const;
114 const char* SpinName(Spin spin) const;
115
116 Eigen::VectorXd ScissorShift_DFTlevel(const Eigen::VectorXd& dft_energies,
117 Index homo) const;
118 double CalcSpinHomoLumoShift(const Eigen::VectorXd& frequencies,
119 Spin spin) const;
120 void PrintGWA_Energies(Spin spin) const;
121 void PrintQP_Energies(Spin spin,
122 const Eigen::VectorXd& qp_diag_energies) const;
123 Eigen::VectorXd SolveQP(Spin spin, const Eigen::VectorXd& frequencies) const;
124 boost::optional<double> SolveQP_Grid(Spin spin, double intercept0,
125 double frequency0, Index gw_level) const;
126 boost::optional<double> SolveQP_FixedPoint(Spin spin, double intercept0,
127 double frequency0,
128 Index gw_level) const;
129 boost::optional<double> SolveQP_Linearisation(Spin spin, double intercept0,
130 double frequency0,
131 Index gw_level) const;
132 double SolveQP_Bisection(double lowerbound, double f_lowerbound,
133 double upperbound, double f_upperbound,
134 const QPFunc& f) const;
135 bool Converged(const Eigen::VectorXd& e1, const Eigen::VectorXd& e2,
136 double epsilon) const;
137
138 std::string LevelLabel(Spin spin, Index level) const;
139 const char* OccupationTag(Spin spin, Index level) const;
140
145 const Eigen::MatrixXd& vxc_alpha_;
146 const Eigen::MatrixXd& vxc_beta_;
147 const Eigen::VectorXd& dft_energies_alpha_;
148 const Eigen::VectorXd& dft_energies_beta_;
150 std::unique_ptr<Sigma_base_UKS> sigma_alpha_;
151 std::unique_ptr<Sigma_base_UKS> sigma_beta_;
152 Eigen::MatrixXd Sigma_x_alpha_;
153 Eigen::MatrixXd Sigma_x_beta_;
154 Eigen::MatrixXd Sigma_c_alpha_;
155 Eigen::MatrixXd Sigma_c_beta_;
156};
157
158} // namespace xtp
159} // namespace votca
160
161#endif
std::pair< double, double > operator()(double frequency) const
Definition gw_uks.h:80
double deriv(double frequency) const
Definition gw_uks.h:92
QPFunc(Index gw_level, const Sigma_base_UKS &sigma, double offset)
Definition gw_uks.h:77
const Sigma_base_UKS & sigma_c_func_
Definition gw_uks.h:101
double value(double frequency) const
Definition gw_uks.h:87
boost::optional< double > SolveQP_FixedPoint(Spin spin, double intercept0, double frequency0, Index gw_level) const
Definition gw_uks.cc:398
TCMatrix_gwbse_spin & Mmn_
Definition gw_uks.h:144
Eigen::SelfAdjointEigenSolver< Eigen::MatrixXd > DiagonalizeQPHamiltonianAlpha() const
Definition gw_uks.cc:468
bool Converged(const Eigen::VectorXd &e1, const Eigen::VectorXd &e2, double epsilon) const
Definition gw_uks.cc:438
void PrintQP_Energies(Spin spin, const Eigen::VectorXd &qp_diag_energies) const
Definition gw_uks.cc:521
Eigen::MatrixXd & SigmaC(Spin spin)
Definition gw_uks.cc:130
const Eigen::VectorXd & DftEnergies(Spin spin) const
Definition gw_uks.cc:121
std::unique_ptr< Sigma_base_UKS > sigma_alpha_
Definition gw_uks.h:150
std::string LevelLabel(Spin spin, Index level) const
Definition gw_uks.cc:152
Eigen::MatrixXd Sigma_x_alpha_
Definition gw_uks.h:152
std::unique_ptr< Sigma_base_UKS > sigma_beta_
Definition gw_uks.h:151
Eigen::MatrixXd Sigma_c_beta_
Definition gw_uks.h:155
Eigen::MatrixXd & SigmaX(Spin spin)
Definition gw_uks.cc:127
Eigen::VectorXd getGWAResultsAlpha() const
Definition gw_uks.cc:292
const Eigen::MatrixXd & vxc_alpha_
Definition gw_uks.h:145
Eigen::VectorXd ScissorShift_DFTlevel(const Eigen::VectorXd &dft_energies, Index homo) const
Definition gw_uks.cc:166
void CalculateHQP()
Definition gw_uks.cc:447
const Eigen::VectorXd & RPAInputEnergiesAlpha() const
Definition gw_uks.cc:302
const char * OccupationTag(Spin spin, Index level) const
Definition gw_uks.cc:162
Sigma_base_UKS & SigmaEvaluator(Spin spin)
Definition gw_uks.cc:139
Eigen::VectorXd SolveQP(Spin spin, const Eigen::VectorXd &frequencies) const
Definition gw_uks.cc:309
boost::optional< double > SolveQP_Linearisation(Spin spin, double intercept0, double frequency0, Index gw_level) const
Definition gw_uks.cc:349
const Eigen::VectorXd & RPAInputEnergiesBeta() const
Definition gw_uks.cc:305
Eigen::MatrixXd getHQPBeta() const
Definition gw_uks.cc:461
boost::optional< double > SolveQP_Grid(Spin spin, double intercept0, double frequency0, Index gw_level) const
Definition gw_uks.cc:365
void PrintGWA_Energies(Spin spin) const
Definition gw_uks.cc:481
Eigen::VectorXd getGWAResultsBeta() const
Definition gw_uks.cc:297
Eigen::MatrixXd getHQPAlpha() const
Definition gw_uks.cc:456
Eigen::MatrixXd Sigma_x_beta_
Definition gw_uks.h:153
const char * SpinName(Spin spin) const
Definition gw_uks.cc:148
GW_UKS(Logger &log, TCMatrix_gwbse_spin &Mmn, const Eigen::MatrixXd &vxc_alpha, const Eigen::MatrixXd &vxc_beta, const Eigen::VectorXd &dft_energies_alpha, const Eigen::VectorXd &dft_energies_beta)
Definition gw_uks.cc:25
const Eigen::VectorXd & dft_energies_alpha_
Definition gw_uks.h:147
double CalcSpinHomoLumoShift(const Eigen::VectorXd &frequencies, Spin spin) const
Definition gw_uks.cc:174
const Eigen::MatrixXd & vxc_beta_
Definition gw_uks.h:146
const Eigen::VectorXd & dft_energies_beta_
Definition gw_uks.h:148
Logger & log_
Definition gw_uks.h:143
Eigen::SelfAdjointEigenSolver< Eigen::MatrixXd > DiagonalizeQPHamiltonianBeta() const
Definition gw_uks.cc:475
Eigen::MatrixXd Sigma_c_alpha_
Definition gw_uks.h:154
const Eigen::MatrixXd & Vxc(Spin spin) const
Definition gw_uks.cc:124
void configure(const options &opt)
Definition gw_uks.cc:38
void CalculateGWPerturbation()
Definition gw_uks.cc:184
Index Homo(Spin spin) const
Definition gw_uks.cc:145
double SolveQP_Bisection(double lowerbound, double f_lowerbound, double upperbound, double f_upperbound, const QPFunc &f) const
Definition gw_uks.cc:412
Logger is used for thread-safe output of messages.
Definition logger.h:164
Unrestricted RPA helper for spin-resolved GW screening.
Definition rpa_uks.h:68
Provides a means for comparing floating point numbers.
Definition basebead.h:33
Eigen::Index Index
Definition types.h:26
std::string quadrature_scheme
Definition gw_uks.h:47
std::string sigma_integration
Definition gw_uks.h:39