@@ -60,22 +60,28 @@ void ESolver_KS:: Run(int istep, UnitCell_pseudo& cell)
6060 // double drho = this->estate.caldr2();
6161 // EState should be used after it is constructed.
6262 drho = GlobalC::CHR.get_drho ();
63-
63+ double hsolver_error = 0.0 ;
6464 if (firstscf)
6565 {
6666 firstscf = false ;
67- double hsover_error = this ->diag_ethr * std::max (1.0 , GlobalC::CHR.nelec );
67+ hsolver_error = this ->diag_ethr * std::max (1.0 , GlobalC::CHR.nelec );
6868 // The error of HSolver is larger than drho, so a more precise HSolver should be excuted.
69- if (hsover_error > drho)
69+ if (hsolver_error > drho)
7070 {
71- reset_diagethr (GlobalV::ofs_running, hsover_error );
71+ reset_diagethr (GlobalV::ofs_running, hsolver_error );
7272 this ->hamilt2density (istep, iter, this ->diag_ethr );
7373 drho = GlobalC::CHR.get_drho ();
74+ hsolver_error = this ->diag_ethr * std::max (1.0 , GlobalC::CHR.nelec );
7475 }
7576 }
7677
77- if (drho < this ->scf_thr )
78- conv_elec = true ;
78+ conv_elec = (drho < this ->scf_thr );
79+
80+ // If drho < hsolver_error in the first iter or drho < scf_thr, we do not change rho.
81+ if ( drho < hsolver_error || conv_elec)
82+ {
83+ if (drho < hsolver_error) GlobalV::ofs_warning << " drho < hsolver_error, keep charge density unchanged." << std::endl;
84+ }
7985 else
8086 {
8187 // charge mixing
@@ -129,6 +135,12 @@ void ESolver_KS:: set_ethr(int istep, int iter)
129135 }
130136 }
131137 if (GlobalV::FINAL_SCF) this ->diag_ethr = 1.0e-2 ;
138+
139+ if (GlobalV::CALCULATION==" md" ||GlobalV::CALCULATION==" relax" ||GlobalV::CALCULATION==" cell-relax" )
140+ {
141+ this ->diag_ethr = std::max (this ->diag_ethr , INPUT.pw_diag_thr );
142+ }
143+
132144 }
133145 else
134146 {
0 commit comments