24#include <unordered_set>
46 const Eigen::VectorXd& dft_energies)
166 const Eigen::VectorXd& seed_energies,
167 const Eigen::VectorXd& qsgw_energies)
const;
180 Eigen::MatrixXd
getHQP()
const;
187 std::string states)
const;
190 return rpa_.getRPAInputEnergies();
209 std::unique_ptr<Sigma_base>
sigma_ =
nullptr;
226 std::pair<double, double>
operator()(
double frequency)
const {
227 std::pair<double, double> result;
228 result.first =
value(frequency, EvalStage::Other);
229 result.second =
deriv(frequency);
237 if (!insert_result.second) {
238 ++
stats_.sigma_repeat_calls;
240 ++
stats_.sigma_unique_frequencies;
251 double deriv(
double frequency)
const {
262 std::uint64_t key = 0;
263 static_assert(
sizeof(double) ==
sizeof(std::uint64_t),
264 "Unexpected double size");
265 std::memcpy(&key, &x,
sizeof(
double));
271 case EvalStage::Scan:
272 ++
stats_.sigma_scan_calls;
274 case EvalStage::Refine:
275 ++
stats_.sigma_refine_calls;
277 case EvalStage::Derivative:
278 ++
stats_.sigma_derivative_calls;
280 case EvalStage::Other:
282 ++
stats_.sigma_other_calls;
297 const Eigen::VectorXd& dft_energies)
const;
301 Eigen::VectorXd
SolveQP(
const Eigen::VectorXd& frequencies)
const;
302 boost::optional<double>
SolveQP_Grid(
double intercept0,
double frequency0,
304 QPStats* stats =
nullptr)
const;
307 double intercept0,
double frequency0,
Index gw_level,
double left_limit,
308 double right_limit,
bool allow_rejected_return =
true,
309 QPStats* stats =
nullptr)
const;
312 double intercept0,
double frequency0,
Index gw_level,
double left_limit,
313 double right_limit,
bool allow_rejected_return =
true,
314 QPStats* stats =
nullptr)
const;
317 double intercept0,
double frequency0,
Index gw_level,
double left_limit,
318 double right_limit,
bool allow_rejected_return =
true,
319 QPStats* stats =
nullptr)
const;
322 double frequency0,
Index gw_level,
323 QPStats* stats =
nullptr)
const;
327 QPStats* stats =
nullptr)
const;
328 bool Converged(
const Eigen::VectorXd& e1,
const Eigen::VectorXd& e2,
329 double epsilon)
const;
332 double lowerbound,
double f_lowerbound,
double upperbound,
333 double f_upperbound,
const QPFunc& f,
double reference)
const;
void CountSigmaStage(EvalStage stage) const
double value(double frequency, EvalStage stage=EvalStage::Other) const
double sigma(double frequency, EvalStage stage=EvalStage::Other) const
const Sigma_base & sigma_c_func_
const QPStats & GetStats() const
std::unordered_set< std::uint64_t > seen_frequencies_
static std::uint64_t FrequencyKey(double x)
QPFunc(Index gw_level, const Sigma_base &sigma, double offset)
double deriv(double frequency) const
std::pair< double, double > operator()(double frequency) const
boost::optional< double > SolveQP_Grid_Windowed(double intercept0, double frequency0, Index gw_level, double left_limit, double right_limit, bool allow_rejected_return=true, QPStats *stats=nullptr) const
void PlotSigma(std::string filename, Index steps, double spacing, std::string states) const
const Eigen::VectorXd & getQSGWSeedEnergies() const
Return the seed (G0W0/evGW) energies that QSGW started from.
Eigen::SelfAdjointEigenSolver< Eigen::MatrixXd > DiagonalizeQPHamiltonian() const
void PrintGWA_Energies() const
boost::optional< QPRootCandidate > RefineQPInterval(double lowerbound, double f_lowerbound, double upperbound, double f_upperbound, const QPFunc &f, double reference) const
void PrintQSGW_Energies(const std::string &seed_label, const Eigen::VectorXd &seed_energies, const Eigen::VectorXd &qsgw_energies) const
Print a two-column comparison of seed (G0W0 or evGW) vs converged QSGW quasiparticle energies.
void CalculateQSGW()
Run quasiparticle self-consistent GW (QSGW).
bool Converged(const Eigen::VectorXd &e1, const Eigen::VectorXd &e2, double epsilon) const
void configure(const options &opt)
boost::optional< double > SolveQP_Grid_Windowed_Adaptive(double intercept0, double frequency0, Index gw_level, double left_limit, double right_limit, bool allow_rejected_return=true, QPStats *stats=nullptr) const
Eigen::MatrixXd getHQP() const
Eigen::VectorXd SolveQP(const Eigen::VectorXd &frequencies) const
qp_solver::EvalStage EvalStage
boost::optional< double > SolveQP_Grid_Windowed_Dense(double intercept0, double frequency0, Index gw_level, double left_limit, double right_limit, bool allow_rejected_return=true, QPStats *stats=nullptr) const
qp_solver::RootCandidate QPRootCandidate
void PrintQSGW_Composition(double threshold=0.01) const
Print the dominant DFT-KS orbital contributions to each converged QSGW quasiparticle state.
Eigen::VectorXd qsgw_seed_energies_
const Eigen::VectorXd & dft_energies_
std::unique_ptr< Sigma_base > sigma_
Eigen::VectorXd qsgw_final_energies_
Eigen::VectorXd getGWAResults() const
Eigen::VectorXd RPAInputEnergies() const
qp_solver::WindowDiagnostics QPWindowDiagnostics
double CalcHomoLumoShift(Eigen::VectorXd frequencies) const
boost::optional< double > SolveQP_Grid(double intercept0, double frequency0, Index gw_level, QPStats *stats=nullptr) const
const Eigen::MatrixXd & vxc_
void PrintQP_Energies(const Eigen::VectorXd &qp_diag_energies) const
const Eigen::MatrixXd & getQSGWRotation() const
boost::optional< double > SolveQP_FixedPoint(double intercept0, double frequency0, Index gw_level, QPStats *stats=nullptr) const
Eigen::VectorXd ScissorShift_DFTlevel(const Eigen::VectorXd &dft_energies) const
GW(Logger &log, TCMatrix_gwbse &Mmn, const Eigen::MatrixXd &vxc, const Eigen::VectorXd &dft_energies)
boost::optional< double > SolveQP_Linearisation(double intercept0, double frequency0, Index gw_level, QPStats *stats=nullptr) const
void CalculateGWPerturbation()
Eigen::MatrixXd qsgw_rotation_
Logger is used for thread-safe output of messages.
Provides a means for comparing floating point numbers.
double qp_full_window_half_width
double qsgw_max_virt_correction
Index qp_adaptive_shell_count
double qp_adaptive_shell_width
std::string qp_grid_search_mode
double qp_virtual_min_energy
Index gw_sc_max_iterations
std::string quadrature_scheme
Index g_sc_max_iterations
std::string qp_root_finder
std::string sigma_integration
Index qsgw_max_iterations