@@ -97,25 +97,34 @@ def _check_gga_and_metagga(self) -> None:
9797
9898 def _check_electronic_convergence (self ) -> None :
9999 # check if structure electronically converged
100- final_esteps = (
101- self .ionic_steps [- 1 ]["electronic_steps" ]
102- if self .incar .get ("ALGO" , self .defaults ["ALGO" ]["value" ]).lower () != "chi"
103- else 0
104- )
105- # In a response function run there is no ionic steps, there is no scf step
106- if self .parameters .get ("LEPSILON" , self .defaults ["LEPSILON" ]["value" ]):
107- i = 1
108- to_check = {"e_wo_entrp" , "e_fr_energy" , "e_0_energy" }
109- while set (final_esteps [i ]) == to_check :
110- i += 1
111- is_converged = i + 1 != self .parameters .get ("NELM" , self .defaults ["NELM" ]["value" ])
112- else :
113- is_converged = len (final_esteps ) < self .parameters .get ("NELM" , self .defaults ["NELM" ]["value" ])
114100
115- if not is_converged :
116- self .reasons .append (
117- "CONVERGENCE --> Did not achieve electronic convergence in the final ionic step. NELM should be increased."
118- )
101+ if self .incar .get ("ALGO" , self .defaults ["ALGO" ]["value" ]).lower () != "chi" :
102+ # Response function calculations are non-self-consistent: only one ionic step, no electronic SCF
103+ if self .parameters .get ("LEPSILON" , self .defaults ["LEPSILON" ]["value" ]):
104+
105+ final_esteps = self .ionic_steps [- 1 ]["electronic_steps" ]
106+ to_check = {"e_wo_entrp" , "e_fr_energy" , "e_0_energy" }
107+
108+ for i in range (len (final_esteps )):
109+ if set (final_esteps [i ]) != to_check :
110+ break
111+ i += 1
112+
113+ is_converged = i + 1 < self .parameters .get ("NELM" , self .defaults ["NELM" ]["value" ])
114+ n_non_conv = 1
115+
116+ else :
117+ conv_steps = [
118+ len (self .ionic_steps [i ]["electronic_steps" ]) < self .parameters .get ("NELM" , self .defaults ["NELM" ]["value" ])
119+ for i in range (len (self .ionic_steps ))
120+ ]
121+ is_converged = all (conv_steps )
122+ n_non_conv = len ([step for step in conv_steps if not step ])
123+
124+ if not is_converged :
125+ self .reasons .append (
126+ f"CONVERGENCE --> Did not achieve electronic convergence in { n_non_conv } ionic step(s). NELM should be increased."
127+ )
119128
120129 def _check_drift_forces (self ) -> None :
121130 # Check if drift force is too large
0 commit comments