votca 2026-dev
Loading...
Searching...
No Matches
rpa.h
Go to the documentation of this file.
1/*
2 * Copyright 2009-2021 The VOTCA Development Team
3 * (http://www.votca.org)
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License")
6 *
7 * You may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20#pragma once
21#ifndef VOTCA_XTP_RPA_H
22#define VOTCA_XTP_RPA_H
23
24// Standard includes
25#include <vector>
26
27// Local VOTCA includes
28#include "eigen.h"
29#include "logger.h"
30
31namespace votca {
32namespace xtp {
33class TCMatrix_gwbse;
34
35class RPA {
36 public:
37 RPA(Logger& log, const TCMatrix_gwbse& Mmn) : log_(log), Mmn_(Mmn) {};
38
39 void configure(Index homo, Index rpamin, Index rpamax) {
40 homo_ = homo;
41 rpamin_ = rpamin;
42 rpamax_ = rpamax;
43 }
44
45 double getEta() const { return eta_; }
46
47 Eigen::MatrixXd calculate_epsilon_i(double frequency) const {
48 return calculate_epsilon<true>(frequency);
49 }
50
51 Eigen::MatrixXd calculate_epsilon_r(double frequency) const {
52 return calculate_epsilon<false>(frequency);
53 }
54
55 Eigen::MatrixXd calculate_epsilon_r(std::complex<double> frequency) const;
56
57 const Eigen::VectorXd& getRPAInputEnergies() const { return energies_; }
58
59 // QSGW: provide the rotation matrix so that calculate_epsilon and
60 // Calculate_H2p_ApB can apply the m-rotation to QP-window hole slices.
61 // Call with nullptr to disable (default behaviour for G0W0/evGW).
62 void setQSGWRotation(const Eigen::MatrixXd* U, Index qpmin, Index homo) {
63 qsgw_U_ = U;
64 qsgw_qpmin_ = qpmin;
65 qsgw_homo_ = homo;
66 }
67
68 void setRPAInputEnergies(const Eigen::VectorXd& rpaenergies) {
69 energies_ = rpaenergies;
70 }
71
72 // calculates full RPA vector of energies from gwa and dftenergies and qpmin
73 // RPA energies have three parts, lower than qpmin: dftenergies,between qpmin
74 // and qpmax:gwa_energies,above:dftenergies+homo-lumo shift
75 void UpdateRPAInputEnergies(const Eigen::VectorXd& dftenergies,
76 const Eigen::VectorXd& gwaenergies, Index qpmin);
77
79 Eigen::VectorXd omega; // Eigenvalues
80 Eigen::MatrixXd XpY; // Eigenvector components (X + Y)
81 double ERPA_correlation; // total correlation energy
82 };
83
85
86 private:
87 Index homo_; // HOMO index with respect to dft energies
90 const double eta_ = 0.0001;
91
92 // QSGW m-rotation (nullptr = disabled, i.e. G0W0/evGW)
93 const Eigen::MatrixXd* qsgw_U_ = nullptr;
96
97 Eigen::VectorXd energies_;
98
101
102 template <bool imag>
103 Eigen::MatrixXd calculate_epsilon(double frequency) const;
104
105 Eigen::VectorXd Calculate_H2p_AmB() const;
106 Eigen::MatrixXd Calculate_H2p_ApB() const;
107 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> Diagonalize_H2p_C(
108 const Eigen::MatrixXd& C) const;
109
110 void ShiftUncorrectedEnergies(const Eigen::VectorXd& dftenergies, Index qpmin,
111 Index gwsize);
112
113 double getMaxCorrection(const Eigen::VectorXd& dftenergies, Index min,
114 Index max) const;
115};
116
117} // namespace xtp
118} // namespace votca
119
120#endif // VOTCA_XTP_RPA_H
Logger is used for thread-safe output of messages.
Definition logger.h:164
RPA(Logger &log, const TCMatrix_gwbse &Mmn)
Definition rpa.h:37
Eigen::MatrixXd Calculate_H2p_ApB() const
Definition rpa.cc:281
Eigen::MatrixXd calculate_epsilon_i(double frequency) const
Definition rpa.h:47
void ShiftUncorrectedEnergies(const Eigen::VectorXd &dftenergies, Index qpmin, Index gwsize)
Definition rpa.cc:50
Index rpamax_
Definition rpa.h:89
void setRPAInputEnergies(const Eigen::VectorXd &rpaenergies)
Definition rpa.h:68
const Eigen::MatrixXd * qsgw_U_
Definition rpa.h:93
Eigen::VectorXd energies_
Definition rpa.h:97
Eigen::MatrixXd calculate_epsilon(double frequency) const
Definition rpa.cc:76
Eigen::MatrixXd calculate_epsilon_r(double frequency) const
Definition rpa.h:51
Index qsgw_qpmin_
Definition rpa.h:94
const TCMatrix_gwbse & Mmn_
Definition rpa.h:100
const double eta_
Definition rpa.h:90
Index rpamin_
Definition rpa.h:88
Eigen::VectorXd Calculate_H2p_AmB() const
Definition rpa.cc:266
void configure(Index homo, Index rpamin, Index rpamax)
Definition rpa.h:39
double getEta() const
Definition rpa.h:45
const Eigen::VectorXd & getRPAInputEnergies() const
Definition rpa.h:57
Eigen::SelfAdjointEigenSolver< Eigen::MatrixXd > Diagonalize_H2p_C(const Eigen::MatrixXd &C) const
Definition rpa.cc:328
Logger & log_
Definition rpa.h:99
rpa_eigensolution Diagonalize_H2p() const
Definition rpa.cc:204
void UpdateRPAInputEnergies(const Eigen::VectorXd &dftenergies, const Eigen::VectorXd &gwaenergies, Index qpmin)
Definition rpa.cc:32
double getMaxCorrection(const Eigen::VectorXd &dftenergies, Index min, Index max) const
Definition rpa.cc:65
Index qsgw_homo_
Definition rpa.h:95
Index homo_
Definition rpa.h:87
void setQSGWRotation(const Eigen::MatrixXd *U, Index qpmin, Index homo)
Definition rpa.h:62
Provides a means for comparing floating point numbers.
Definition basebead.h:33
Eigen::Index Index
Definition types.h:26