36 <<
"Using overlap filter with no threshold " << std::flush;
39 <<
"Using overlap filter with threshold " <<
threshold_ << std::flush;
54 Eigen::VectorXd overlap = Eigen::VectorXd::Zero(coeffs.cols());
55#pragma omp parallel for schedule(dynamic)
56 for (
Index i = 0; i < coeffs.cols(); i++) {
58 Eigen::VectorXd state = coeffs.col(i).head(basis * basis);
59 Eigen::Map<const Eigen::MatrixXd> mat(state.data(), basis, basis);
61 Eigen::Map<const Eigen::MatrixXd> lastmat(laststate.data(), basis,
64 overlap(i) = (mat * S_ao.
Matrix() * lastmat.transpose())
65 .cwiseProduct(S_ao.
Matrix())
69 Eigen::VectorXd state = coeffs.col(i).tail(basis * basis);
70 Eigen::Map<const Eigen::MatrixXd> mat(state.data(), basis, basis);
72 Eigen::Map<const Eigen::MatrixXd> lastmat(laststate.data(), basis,
75 overlap(i) -= (mat * S_ao.
Matrix() * lastmat.transpose())
76 .cwiseProduct(S_ao.
Matrix())
80 return overlap.cwiseAbs();
86 Eigen::MatrixXd coeffs;
92 Index bse_vtotal = bse_vmax - bse_vmin + 1;
93 Index bse_ctotal = bse_cmax - bse_cmin + 1;
95 Index bse_size_ao = basis * basis;
96 auto occlevels = orb.
MOs().
eigenvectors().middleCols(bse_vmin, bse_vtotal);
97 auto virtlevels = orb.
MOs().
eigenvectors().middleCols(bse_cmin, bse_ctotal);
100 coeffs.resize(bse_size_ao, nostates);
102 coeffs.resize(2 * bse_size_ao, nostates);
104#pragma omp parallel for schedule(dynamic)
105 for (
Index i = 0; i < nostates; i++) {
107 Eigen::VectorXd exciton;
113 Eigen::Map<const Eigen::MatrixXd> mat(exciton.data(), bse_ctotal,
115 const Eigen::MatrixXd aomatrix =
116 occlevels * mat.transpose() * virtlevels.transpose();
117 coeffs.col(i).head(bse_size_ao) =
118 Eigen::Map<const Eigen::VectorXd>(aomatrix.data(), bse_size_ao);
121 Eigen::VectorXd exciton;
127 Eigen::Map<const Eigen::MatrixXd> mat(exciton.data(), bse_ctotal,
129 const Eigen::MatrixXd aomatrix =
130 occlevels * mat.transpose() * virtlevels.transpose();
131 coeffs.col(i).tail(bse_size_ao) =
132 Eigen::Map<const Eigen::VectorXd>(aomatrix.data(), bse_size_ao);
140 Eigen::MatrixXd coeffs;
void Fill(const AOBasis &aobasis) final
const Eigen::MatrixXd & Matrix() const
Logger is used for thread-safe output of messages.
Container for molecular orbitals and derived one-particle data.
Index getBSEvmax() const
Return the highest valence orbital included in BSE.
const tools::EigenSystem & BSETriplets() const
Return read-only access to triplet BSE eigenpairs.
Index getBSEcmin() const
Return the lowest conduction orbital included in BSE.
Eigen::MatrixXd CalculateQParticleAORepresentation() const
Transform quasiparticle amplitudes into the AO representation.
const tools::EigenSystem & BSESinglets() const
Return read-only access to singlet BSE eigenpairs.
Index getBSEcmax() const
Return the highest conduction orbital included in BSE.
bool getTDAApprox() const
Return whether the Tamm-Dancoff approximation is enabled.
Index getBSEvmin() const
Return the lowest valence orbital included in BSE.
Index getBasisSetSize() const
Return the number of AO basis functions in the DFT basis.
Index getGWAmin() const
Return the lower GW orbital index.
const tools::EigenSystem & MOs() const
Return read-only access to alpha/restricted molecular orbitals.
Index NumberofStates(QMStateType type) const
Return the number of states available for the requested state family.
const AOBasis & getDftBasis() const
Return the DFT AO basis, throwing if it has not been initialized.
void WriteToCpt(CheckpointWriter &w) final
void UpdateHist(const Orbitals &orb, QMState state) final
void ReadFromCpt(CheckpointReader &r) final
Eigen::MatrixXd CalcExcitonAORepresentation(const Orbitals &orb, QMStateType type) const
void Initialize(const tools::Property &options) final
void Info(Logger &log) const final
Eigen::VectorXd CalculateOverlap(const Orbitals &orb, QMStateType type) const
Eigen::VectorXd laststatecoeff_
std::vector< Index > CalcIndeces(const Orbitals &orb, QMStateType type) const final
Eigen::MatrixXd CalcAOCoeffs(const Orbitals &orb, QMStateType type) const
bool isSingleParticleState() const
Identifier for QMstates. Strings like S1 are converted into enum +zero indexed int.
const QMStateType & Type() const
std::vector< Index > ReduceAndSortIndecesUp(const Eigen::VectorXd &overlap, Index offset, double threshold) const
#define XTP_LOG(level, log)
Charge transport classes.
Provides a means for comparing floating point numbers.