25template <Index cqp, Index cx, Index cd, Index cd2>
37template <Index cqp, Index cx, Index cd, Index cd2>
46template <Index cqp, Index cx, Index cd, Index cd2>
50 Eigen::MatrixXd result = Eigen::MatrixXd::Zero(blk.
ctotal, blk.
vtotal);
52 result.col(v1) += Hqp.col(c1 + cmin_qp).segment(cmin_qp, blk.
ctotal);
53 result.row(c1) -= Hqp.col(v1).head(blk.
vtotal).transpose();
54 return Eigen::Map<Eigen::VectorXd>(result.data(), result.size());
57template <Index cqp, Index cx, Index cd, Index cd2>
59 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& blk,
60 const Eigen::MatrixXd& Hqp)
const {
68 Eigen::VectorXd row =
Hqp_row(Hqp, blk, v1, c1);
69 y.row(out_idx) += row.transpose() * x;
74template <Index cqp, Index cx, Index cd, Index cd2>
76 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& out_blk,
79 if (cx == 0 || prefactor == 0.0) {
84 const Eigen::MatrixXd left =
89 const Eigen::MatrixXd right =
92 const Eigen::MatrixXd block = left * right.transpose();
95 y.middleRows(out_row0, out_blk.
ctotal) +=
96 block * x.middleRows(in_row0, in_blk.
ctotal);
101template <Index cqp, Index cx, Index cd, Index cd2>
103 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& out_blk,
106 if (cd == 0 || prefactor == 0.0) {
110 const Eigen::DiagonalMatrix<double, Eigen::Dynamic> eps =
117 const Eigen::MatrixXd left =
121 const Eigen::MatrixXd right =
125 const Eigen::MatrixXd block = left * eps * right.transpose();
128 const Eigen::VectorXd row =
129 Eigen::Map<const Eigen::VectorXd>(block.data(), block.size());
132 y.row(out_idx) += row.transpose() * x;
137template <Index cqp, Index cx, Index cd, Index cd2>
139 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& out_blk,
142 if (cd2 == 0 || prefactor == 0.0) {
146 const Eigen::DiagonalMatrix<double, Eigen::Dynamic> eps =
150 const Eigen::MatrixXd left =
155 const Eigen::MatrixXd right =
158 const Eigen::MatrixXd block = left * eps * right.transpose();
164 row(idx) = block(v2, c2);
169 y.row(out_idx) += row.transpose() * x;
174template <Index cqp, Index cx, Index cd, Index cd2>
176 Eigen::MatrixXd& y,
const Eigen::MatrixXd& x,
const SpinBlockInfo& out_blk,
179 if (cd == 0 || prefactor == 0.0) {
183 const Eigen::DiagonalMatrix<double, Eigen::Dynamic> eps =
190 const Eigen::RowVectorXd tout =
198 const Eigen::MatrixXd Tin = Min[v2 + in_blk.
vmin_rpa].middleRows(
203 const Eigen::VectorXd row_block = Tin * eps * tout.transpose();
207 row_block.transpose() * x.middleRows(in_row0, in_blk.
ctotal);
213template <Index cqp, Index cx, Index cd, Index cd2>
215 const Eigen::MatrixXd& input)
const {
217 static_assert(!(cd != 0 && cd2 != 0),
218 "Hamiltonian cannot contain Hd and Hd2 at the same time");
220 Eigen::MatrixXd y = Eigen::MatrixXd::Zero(
size_total_, input.cols());
222 const Eigen::MatrixXd x_alpha = input.topRows(
alpha_.size);
223 const Eigen::MatrixXd x_beta = input.bottomRows(
beta_.size);
225 Eigen::MatrixXd y_alpha = Eigen::MatrixXd::Zero(
alpha_.size, input.cols());
226 Eigen::MatrixXd y_beta = Eigen::MatrixXd::Zero(
beta_.size, input.cols());
231 static_cast<double>(cx));
233 -
static_cast<double>(cd));
235 -
static_cast<double>(cd2));
240 static_cast<double>(cx));
242 -
static_cast<double>(cd));
244 -
static_cast<double>(cd2));
248 Mmn_.beta, -
static_cast<double>(cd));
250 Mmn_.alpha, -
static_cast<double>(cd));
255 -
static_cast<double>(cd2));
258 -
static_cast<double>(cd2));
260 y.topRows(
alpha_.size) = y_alpha;
261 y.bottomRows(
beta_.size) = y_beta;
265template <Index cqp, Index cx, Index cd, Index cd2>
267 Eigen::MatrixXd dense = Eigen::MatrixXd::Zero(
rows(),
cols());
269 Eigen::MatrixXd
e = Eigen::MatrixXd::Zero(
rows(), 1);
276template <Index cqp, Index cx, Index cd, Index cd2>
278 static_assert(!(cd != 0 && cd2 != 0),
279 "Hamiltonian cannot contain Hd and Hd2 at the same time");
281 Eigen::VectorXd result = Eigen::VectorXd::Zero(
size_total_);
283 const Eigen::DiagonalMatrix<double, Eigen::Dynamic> eps =
329 Mmn_.beta[v +
beta_.vmin_rpa].row(
beta_.cmin_rpa + c).squaredNorm();
338 Mmn_.beta[v +
beta_.vmin_rpa].row(
beta_.vmin_rpa + v).transpose())
344 Mmn_.beta[v +
beta_.vmin_rpa].row(
beta_.cmin_rpa + c).transpose())
348 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
void add_direct_cross_tda_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
Eigen::VectorXd Hqp_row(const Eigen::MatrixXd &Hqp, const SpinBlockInfo &blk, Index v1, Index c1) 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.
Provides a means for comparing floating point numbers.