45 <<
TimeStamp() <<
" Smallest value of AOOverlap matrix is "
46 <<
S_->SmallestEigenValue() << std::flush;
48 <<
TimeStamp() <<
" Removed " <<
S_->Removedfunctions()
49 <<
" basisfunction from inverse overlap matrix" << std::flush;
53 const Eigen::MatrixXd&
H)
const {
55 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(H_ortho);
57 if (es.info() != Eigen::ComputationInfo::Success) {
58 throw std::runtime_error(
"Matrix Diagonalisation failed. DiagInfo" +
59 std::to_string(es.info()));
69 const Eigen::MatrixXd& MOs,
Index nocclevels)
const {
70 if (nocclevels == 0) {
71 return Eigen::MatrixXd::Zero(MOs.rows(), MOs.rows());
73 Eigen::MatrixXd occstates = MOs.leftCols(nocclevels);
74 return occstates * occstates.transpose();
89 const Eigen::MatrixXd& MOs_old,
94 Eigen::VectorXd virt = Eigen::VectorXd::Zero(
H.rows());
95 for (
Index i = nocclevels; i <
H.rows(); ++i) {
103 Eigen::MatrixXd vir =
S_->Matrix() * MOs_old * virt.asDiagonal() *
104 MOs_old.transpose() *
S_->Matrix();
109 const Eigen::MatrixXd& dmat,
const Eigen::MatrixXd&
H)
const {
110 const Eigen::MatrixXd&
S =
S_->Matrix();
115 const Eigen::MatrixXd& err_beta)
const {
116 return std::max(err_alpha.cwiseAbs().maxCoeff(),
117 err_beta.cwiseAbs().maxCoeff());
132 totE_.push_back(totE);
178 bool diis_error =
false;
184 Eigen::MatrixXd H_guess_alpha =
H.alpha;
185 Eigen::MatrixXd H_guess_beta =
H.beta;
191 Eigen::VectorXd coeffs;
197 diis_error = !
adiis_.Info() || coeffs.size() == 0;
199 <<
TimeStamp() <<
" Using ADIIS for next UKS guess" << std::flush;
201 coeffs =
diis_.CalcCoeff();
202 diis_error = !
diis_.Info() || coeffs.size() == 0;
204 <<
TimeStamp() <<
" Using DIIS for next UKS guess" << std::flush;
209 <<
TimeStamp() <<
" (A)DIIS failed using mixing instead"
211 H_guess_alpha =
H.alpha;
212 H_guess_beta =
H.beta;
214 H_guess_alpha.setZero();
215 H_guess_beta.setZero();
216 for (
Index i = 0; i < coeffs.size(); ++i) {
217 if (std::abs(coeffs(i)) < 1
e-8) {
240 <<
" Using coupled UKS mixing with alpha=" <<
opt_alpha_.mixingparameter
250 if (
totE_.size() < 2) {
Logger is used for thread-safe output of messages.
Timestamp returns the current time as a string Example: cout << TimeStamp()
double CombinedError(const Eigen::MatrixXd &err_alpha, const Eigen::MatrixXd &err_beta) const
tools::EigenSystem SolveFockmatrix(const Eigen::MatrixXd &H) const
SpinDensity DensityMatrix(const tools::EigenSystem &MOs_alpha, const tools::EigenSystem &MOs_beta) const
void Levelshift(Eigen::MatrixXd &H, const Eigen::MatrixXd &MOs_old, const options &opt, Index nocclevels) const
std::vector< Eigen::MatrixXd > mathist_beta_
void setOverlap(AOOverlap &S, double etol)
void setLogger(Logger *log)
void Configure(const options &opt_alpha, const options &opt_beta)
Eigen::MatrixXd BuildErrorMatrix(const Eigen::MatrixXd &dmat, const Eigen::MatrixXd &H) const
ConvergenceAcc::options options
SpinDensity Iterate(const SpinDensity &dmat, SpinFock &H, tools::EigenSystem &MOs_alpha, tools::EigenSystem &MOs_beta, double totE)
std::vector< Eigen::MatrixXd > dmatHist_alpha_
std::vector< Eigen::MatrixXd > dmatHist_beta_
std::vector< double > totE_
Eigen::MatrixXd DensityMatrixGroundState_unres(const Eigen::MatrixXd &MOs, Index nocclevels) const
std::vector< Eigen::MatrixXd > mathist_alpha_
Eigen::MatrixXd Sminusahalf
#define XTP_LOG(level, log)
Charge transport classes.
Provides a means for comparing floating point numbers.