30 <<
TimeStamp() <<
" Smallest value of AOOverlap matrix is "
31 <<
S_->SmallestEigenValue() << std::flush;
33 <<
TimeStamp() <<
" Removed " <<
S_->Removedfunctions()
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);
58 const Eigen::MatrixXd&
S =
S_->Matrix();
59 Eigen::MatrixXd errormatrix =
61 diiserror_ = errormatrix.cwiseAbs().maxCoeff();
74 bool diis_error =
false;
83 Eigen::VectorXd coeffs;
89 diis_error = !
adiis_.Info();
91 <<
TimeStamp() <<
" Using ADIIS for next guess" << std::flush;
94 coeffs =
diis_.CalcCoeff();
95 diis_error = !
diis_.Info();
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) {
124 opt_.mixingparameter * dmat + (1.0 -
opt_.mixingparameter) * dmatout;
126 <<
TimeStamp() <<
" Using Mixing with alpha=" <<
opt_.mixingparameter
136 <<
TimeStamp() <<
" Convergence Options:" << std::flush;
138 <<
"\t\t Delta E [Ha]: " <<
opt_.Econverged << std::flush;
140 <<
"\t\t DIIS max error: " <<
opt_.error_converged << std::flush;
143 <<
"\t\t DIIS histlength: " <<
opt_.histlength << std::flush;
145 <<
"\t\t ADIIS start: " <<
opt_.adiis_start << std::flush;
147 <<
"\t\t DIIS start: " <<
opt_.diis_start << std::flush;
148 std::string del =
"oldest";
153 <<
"\t\t Deleting " << del <<
" element from DIIS hist" << std::flush;
156 <<
"\t\t Levelshift[Ha]: " <<
opt_.levelshift << std::flush;
158 <<
"\t\t Levelshift end: " <<
opt_.levelshiftend << std::flush;
160 <<
"\t\t Mixing Parameter alpha: " <<
opt_.mixingparameter << 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 {
183 if (
opt_.levelshift < 1
e-9) {
186 Eigen::VectorXd virt = Eigen::VectorXd::Zero(
H.rows());
188 virt(i) =
opt_.levelshift;
192 <<
TimeStamp() <<
" Using levelshift:" <<
opt_.levelshift <<
" Hartree"
194 Eigen::MatrixXd vir =
S_->Matrix() * MOs_old * virt.asDiagonal() *
195 MOs_old.transpose() *
S_->Matrix();
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();
232 if (
opt_.numberofelectrons == 0) {
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});
249 Index numofelec =
opt_.numberofelectrons;
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::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_
Timestamp returns the current time as a string Example: cout << TimeStamp()
#define XTP_LOG(level, log)
Charge transport classes.
base class for all analysis tools