@@ -69,7 +69,7 @@ DFT_ground_state::energy_kin_sum_pw() const
6969 for (auto it : kset_.spl_num_kpoints ()) {
7070 auto kp = kset_.get <double >(it.i );
7171
72- #pragma omp parallel for schedule(static) reduction(+: ekin)
72+ #pragma omp parallel for schedule(static) reduction(+ : ekin)
7373 for (int igloc = 0 ; igloc < kp->num_gkvec_loc (); igloc++) {
7474 auto Gk = kp->gkvec ().gkvec_cart (gvec_index_t::local (igloc));
7575
@@ -201,6 +201,8 @@ DFT_ground_state::find(double density_tol__, double energy_tol__, double iter_so
201201 << " num_dft_iter : " << num_dft_iter__;
202202 ctx_.message (1 , __func__, s);
203203
204+ double ne_diff = 0 ;
205+
204206 for (int iter = 0 ; iter < num_dft_iter__; iter++) {
205207 PROFILE (" sirius::DFT_ground_state::scf_loop|iteration" );
206208 std::stringstream s;
@@ -225,7 +227,7 @@ DFT_ground_state::find(double density_tol__, double energy_tol__, double iter_so
225227 ctx_.cfg ().iterative_solver ().num_steps ());
226228 }
227229 /* find band occupancies */
228- kset_.find_band_occupancies <float >();
230+ ne_diff = kset_.find_band_occupancies <float >();
229231 /* generate new density from the occupied wave-functions */
230232 density_.generate <float >(kset_, ctx_.use_symmetry (), true , true );
231233#else
@@ -237,7 +239,7 @@ DFT_ground_state::find(double density_tol__, double energy_tol__, double iter_so
237239 result = sirius::diagonalize<double , double >(H0 , kset_, iter_solver_tol__,
238240 ctx_.cfg ().iterative_solver ().num_steps ());
239241 /* find band occupancies */
240- kset_.find_band_occupancies <double >();
242+ ne_diff = kset_.find_band_occupancies <double >();
241243 /* generate new density from the occupied wave-functions */
242244 density_.generate <double >(kset_, ctx_.use_symmetry (), true , true );
243245 }
@@ -356,6 +358,12 @@ DFT_ground_state::find(double density_tol__, double energy_tol__, double iter_so
356358 converged = converged && (rms < density_tol__);
357359 }
358360 if (converged) {
361+ if (std::abs (ne_diff) > 0 ) {
362+ std::stringstream ss;
363+ ss << " Newton minimization didn't respect correct number of electrons, ne_diff=" << ne_diff;
364+ ss << " \n Reduce smearing width!" ;
365+ RTE_THROW (ss.str ());
366+ }
359367 std::stringstream out;
360368 out << std::endl;
361369 out << " converged after " << iter + 1 << " SCF iterations!" << std::endl;
0 commit comments