26template <Index cqp, Index cx, Index cd, Index cd2>
38template <Index cqp, Index cx, Index cd, Index cd2>
47template <Index cqp, Index cx, Index cd, Index cd2>
49 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& blk,
50 const Eigen::MatrixXd& Hqp)
const {
55 static_cast<double>(cqp));
58template <Index cqp, Index cx, Index cd, Index cd2>
60 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& out_blk,
63 if (cx == 0 || prefactor == 0.0) {
73template <Index cqp, Index cx, Index cd, Index cd2>
75 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& out_blk,
78 if (cd == 0 || prefactor == 0.0) {
82 const Eigen::DiagonalMatrix<double, Eigen::Dynamic> eps =
89 const Eigen::MatrixXd left =
93 const Eigen::MatrixXd right =
97 const Eigen::MatrixXd block = left * eps * right.transpose();
100 const Eigen::VectorXd row =
101 Eigen::Map<const Eigen::VectorXd>(block.data(), block.size());
104 y.row(out_idx) += row.transpose() * x;
109template <Index cqp, Index cx, Index cd, Index cd2>
111 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& out_blk,
114 if (cd2 == 0 || prefactor == 0.0) {
118 const Eigen::DiagonalMatrix<double, Eigen::Dynamic> eps =
122 const Eigen::MatrixXd left =
127 const Eigen::MatrixXd right =
130 const Eigen::MatrixXd block = left * eps * right.transpose();
136 row(idx) = block(v2, c2);
141 y.row(out_idx) += row.transpose() * x;
146template <Index cqp, Index cx, Index cd, Index cd2>
148 const Eigen::MatrixXd& input)
const {
150 static_assert(!(cd != 0 && cd2 != 0),
151 "Hamiltonian cannot contain Hd and Hd2 at the same time");
153 Eigen::MatrixXd y = Eigen::MatrixXd::Zero(
size_total_, input.cols());
155 const Eigen::MatrixXd x_alpha = input.topRows(
alpha_.size);
156 const Eigen::MatrixXd x_beta = input.bottomRows(
beta_.size);
158 Eigen::MatrixXd y_alpha = Eigen::MatrixXd::Zero(
alpha_.size, input.cols());
159 Eigen::MatrixXd y_beta = Eigen::MatrixXd::Zero(
beta_.size, input.cols());
164 static_cast<double>(cx));
166 -
static_cast<double>(cd));
168 -
static_cast<double>(cd2));
173 static_cast<double>(cx));
175 -
static_cast<double>(cd));
177 -
static_cast<double>(cd2));
188 static_cast<double>(cx));
190 static_cast<double>(cx));
192 y.topRows(
alpha_.size) = y_alpha;
193 y.bottomRows(
beta_.size) = y_beta;
197template <Index cqp, Index cx, Index cd, Index cd2>
199 Eigen::MatrixXd dense = Eigen::MatrixXd::Zero(
rows(),
cols());
201 Eigen::MatrixXd
e = Eigen::MatrixXd::Zero(
rows(), 1);
208template <Index cqp, Index cx, Index cd, Index cd2>
210 static_assert(!(cd != 0 && cd2 != 0),
211 "Hamiltonian cannot contain Hd and Hd2 at the same time");
213 Eigen::VectorXd result = Eigen::VectorXd::Zero(
size_total_);
215 const Eigen::DiagonalMatrix<double, Eigen::Dynamic> eps =
261 Mmn_.beta[v +
beta_.vmin_rpa].row(
beta_.cmin_rpa + c).squaredNorm();
270 Mmn_.beta[v +
beta_.vmin_rpa].row(
beta_.vmin_rpa + v).transpose())
276 Mmn_.beta[v +
beta_.vmin_rpa].row(
beta_.cmin_rpa + c).transpose())
280 result(
beta_.offset + v *
beta_.ctotal + c) = entry;
void add_exchange_block(Eigen::MatrixXd &y, const Eigen::MatrixXd &x, const SpinBlockInfo &out_blk, const SpinBlockInfo &in_blk, const TCMatrix_gwbse &Mout, const TCMatrix_gwbse &Min, double prefactor) const
const Eigen::MatrixXd & Hqp_beta_
Eigen::VectorXd diagonal() const override
const TCMatrix_gwbse_spin & Mmn_
const Eigen::MatrixXd & Hqp_alpha_
void configure(BSEOperatorUKS_Options opt)
void add_direct_block(Eigen::MatrixXd &y, const Eigen::MatrixXd &x, const SpinBlockInfo &out_blk, const SpinBlockInfo &in_blk, const TCMatrix_gwbse &Mout, const TCMatrix_gwbse &Min, double prefactor) const
BSEOperatorUKS_Options opt_
void add_direct2_block(Eigen::MatrixXd &y, const Eigen::MatrixXd &x, const SpinBlockInfo &out_blk, const SpinBlockInfo &in_blk, const TCMatrix_gwbse &Mout, const TCMatrix_gwbse &Min, double prefactor) const
void setup_block(SpinBlockInfo &blk, Index homo, Index offset)
Eigen::MatrixXd matmul(const Eigen::MatrixXd &input) const override
Eigen::MatrixXd dense_matrix() const
void add_qp_block(Eigen::MatrixXd &y, const Eigen::MatrixXd &x, const SpinBlockInfo &blk, const Eigen::MatrixXd &Hqp) const
const Eigen::VectorXd & epsilon_0_inv_
void set_size(Index size)
Charge transport classes.
Eigen::MatrixXd ApplyBSEExchange(const TCMatrix_gwbse &Mout, const BSEWindow &out, const TCMatrix_gwbse &Min, const BSEWindow &in, const Eigen::MatrixXd &x, double prefactor)
Eigen::MatrixXd ApplyBSEQuasiparticle(const Eigen::MatrixXd &Hqp, Index vtotal, Index ctotal, const Eigen::MatrixXd &x, double prefactor)
Provides a means for comparing floating point numbers.