30 <<
TimeStamp() <<
" Smallest value of AOOverlap matrix is "
34 <<
" basisfunction from inverse overlap matrix" << std::flush;
41 Eigen::MatrixXd H_guess = Eigen::MatrixXd::Zero(
H.rows(),
H.cols());
49 totE_.push_back(totE);
59 Eigen::MatrixXd errormatrix =
61 diiserror_ = errormatrix.cwiseAbs().maxCoeff();
74 bool diis_error =
false;
83 Eigen::VectorXd coeffs;
91 <<
TimeStamp() <<
" Using ADIIS for next guess" << std::flush;
97 <<
TimeStamp() <<
" Using DIIS for next guess" << std::flush;
101 <<
TimeStamp() <<
" (A)DIIS failed using mixing instead"
105 for (
Index i = 0; i < coeffs.size(); i++) {
106 if (std::abs(coeffs(i)) < 1
e-8) {
136 <<
TimeStamp() <<
" Convergence Options:" << std::flush;
148 std::string del =
"oldest";
153 <<
"\t\t Deleting " << del <<
" element from DIIS hist" << std::flush;
164 const Eigen::MatrixXd&
H)
const {
167 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(H_ortho);
169 if (es.info() != Eigen::ComputationInfo::Success) {
170 throw std::runtime_error(
"Matrix Diagonalisation failed. DiagInfo" +
171 std::to_string(es.info()));
182 const Eigen::MatrixXd& MOs_old)
const {
186 Eigen::VectorXd virt = Eigen::VectorXd::Zero(
H.rows());
194 Eigen::MatrixXd vir =
S_->
Matrix() * MOs_old * virt.asDiagonal() *
202 Eigen::MatrixXd result;
214 const Eigen::MatrixXd& MOs)
const {
215 const Eigen::MatrixXd occstates = MOs.leftCols(
nocclevels_);
216 Eigen::MatrixXd dmatGS = 2.0 * occstates * occstates.transpose();
221 const Eigen::MatrixXd& MOs)
const {
223 return Eigen::MatrixXd::Zero(MOs.rows(), MOs.rows());
225 Eigen::MatrixXd occstates = MOs.leftCols(
nocclevels_);
226 Eigen::MatrixXd dmatGS = occstates * occstates.transpose();
237 Eigen::VectorXd occupation = Eigen::VectorXd::Zero(MOs.
eigenvalues().size());
238 std::vector<std::vector<Index> > degeneracies;
239 double buffer = 1
e-4;
240 degeneracies.push_back(std::vector<Index>{0});
241 for (
Index i = 1; i < occupation.size(); i++) {
243 MOs.
eigenvalues()(degeneracies[degeneracies.size() - 1][0]) + buffer) {
244 degeneracies[degeneracies.size() - 1].push_back(i);
246 degeneracies.push_back(std::vector<Index>{i});
250 for (
const std::vector<Index>& deglevel : degeneracies) {
251 Index numofpossibleelectrons = 2 *
Index(deglevel.size());
252 if (numofpossibleelectrons <= numofelec) {
253 for (
Index i : deglevel) {
256 numofelec -= numofpossibleelectrons;
258 double occ = double(numofelec) / double(deglevel.size());
259 for (
Index i : deglevel) {
265 Eigen::MatrixXd dmatGS = MOs.
eigenvectors() * occupation.asDiagonal() *
Eigen::VectorXd CalcCoeff(const std::vector< Eigen::MatrixXd > &dmathist, const std::vector< Eigen::MatrixXd > &mathist)
Eigen::MatrixXd Pseudo_InvSqrt(double etol)
const Eigen::MatrixXd & Matrix() const
double SmallestEigenValue() const
Index Removedfunctions() const
Eigen::MatrixXd DensityMatrix(const tools::EigenSystem &MOs) const
Eigen::MatrixXd DensityMatrixGroundState_unres(const Eigen::MatrixXd &MOs) const
std::vector< Eigen::MatrixXd > mathist_
Eigen::MatrixXd Iterate(const Eigen::MatrixXd &dmat, Eigen::MatrixXd &H, tools::EigenSystem &MOs, double totE)
double getDIIsError() const
tools::EigenSystem SolveFockmatrix(const Eigen::MatrixXd &H) const
Eigen::MatrixXd Sminusahalf
void PrintConfigOptions() const
void Levelshift(Eigen::MatrixXd &H, const Eigen::MatrixXd &MOs_old) const
Eigen::MatrixXd DensityMatrixGroundState_frac(const tools::EigenSystem &MOs) const
std::vector< double > totE_
void setOverlap(AOOverlap &S, double etol)
Eigen::MatrixXd DensityMatrixGroundState(const Eigen::MatrixXd &MOs) const
std::vector< Eigen::MatrixXd > dmatHist_
void Update(Index maxerrorindex, const Eigen::MatrixXd &errormatrix)
Eigen::VectorXd CalcCoeff()
Timestamp returns the current time as a string Example: cout << TimeStamp()
#define XTP_LOG(level, log)
base class for all analysis tools