28template <Index cqp, Index cx, Index cd, Index cd2>
39template <Index cqp, Index cx, Index cd, Index cd2>
41 const Eigen::MatrixXd& input)
const {
43 static_assert(!(cd2 != 0 && cd != 0),
44 "Hamiltonian cannot contain Hd and Hd2 at the same time");
64#pragma omp for schedule(dynamic)
73 }
else if (cd2 != 0) {
91 Eigen::VectorXd vec =
Hqp_row(v1, c1);
92 transform.
Addvec(vec, threadid);
104#pragma omp for schedule(dynamic)
105 for (
Index v1 = 0; v1 < bse_vtotal_; v1++) {
106 Index va = v1 + vmin;
107 Eigen::MatrixXd Mmn1 = cx * Mmn_[va].middleRows(cmin, bse_ctotal_);
109 for (
Index v2 = v1; v2 < bse_vtotal_; v2++) {
110 Index vb = v2 + vmin;
111 transform.
MultiplyBlocks(Mmn_[vb].middleRows(cmin, bse_ctotal_), v1,
121template <Index cqp, Index cx, Index cd, Index cd2>
127 Result.col(v1) += cqp *
Hqp_.col(c1 + cmin).segment(cmin,
bse_ctotal_);
130 return Eigen::Map<Eigen::VectorXd>(Result.data(), Result.size());
133template <Index cqp, Index cx, Index cd, Index cd2>
136 static_assert(!(cd2 != 0 && cd != 0),
137 "Hamiltonian cannot contain Hd and Hd2 at the same time");
143 Eigen::VectorXd result = Eigen::VectorXd::Zero(
bse_size_);
145#pragma omp parallel for schedule(dynamic) reduction(+ : result)
151 entry += cx *
Mmn_[v + vmin].row(cmin + c).squaredNorm();
156 entry += cqp * (
Hqp_(c + cmin_qp, c + cmin_qp) -
Hqp_(v, v));
161 Mmn_[v + vmin].row(v + vmin).transpose())
167 Mmn_[v + vmin].row(c + cmin).transpose())
171 result(vc.
I(v, c)) = entry;
const Eigen::VectorXd & epsilon_0_inv_
const Eigen::MatrixXd & Hqp_
Eigen::VectorXd Hqp_row(Index v1, Index c1) const
void configure(BSEOperator_Options opt)
const TCMatrix_gwbse & Mmn_
Eigen::MatrixXd matmul(const Eigen::MatrixXd &input) const
Eigen::VectorXd diagonal() const
void set_size(Index size)
void Addvec(const Eigen::VectorXd &row, Index OpenmpThread)
void PushMatrix1(const Eigen::MatrixXd &mat, Index OpenmpThread)
Eigen::MatrixXd getReductionVar()
void SetTempZero(Index OpenmpThread)
void createTemporaries(Index rows, Index cols)
void MultiplyBlocks(const Eigen::Block< const Eigen::MatrixXd > &mat, Index i1, Index i2, Index OpenmpThread)
void MultiplyRow(Index row, Index OpenmpThread)
void createAdditionalTemporaries(Index rows, Index cols)
void PrepareMatrix2(const Eigen::Block< const Eigen::MatrixXd > &mat, bool Hd2, Index OpenmpThread)
void PrepareMatrix1(Eigen::MatrixXd &mat, Index OpenmpThread)
This class transforms a pair of indices v,c into a compound index I, via I=ctotal*v+c the fast dimens...
Index I(Index v, Index c) const
Charge transport classes.
base class for all analysis tools