Skip to content

Commit e7cd875

Browse files
check all electronic steps for convergence
1 parent 04371b7 commit e7cd875

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

pymatgen/io/validation/check_common_errors.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)