25
25
from pymatgen .core .trajectory import Trajectory
26
26
from pymatgen .core .units import Ha_to_eV , ang_to_bohr , bohr_to_ang
27
27
from pymatgen .io .jdftx ._output_utils import (
28
+ _init_dict_from_colon_dump_lines ,
28
29
find_all_key ,
29
30
find_first_range_key ,
30
31
find_key ,
@@ -220,6 +221,7 @@ class JDFTXOutfileSlice:
220
221
_electronic_output : ClassVar [list [str ]] = [
221
222
"efermi" ,
222
223
"egap" ,
224
+ "optical_egap" ,
223
225
"emin" ,
224
226
"emax" ,
225
227
"homo" ,
@@ -230,6 +232,7 @@ class JDFTXOutfileSlice:
230
232
]
231
233
efermi : float | None = None
232
234
egap : float | None = None
235
+ optical_egap : float | None = None
233
236
emin : float | None = None
234
237
emax : float | None = None
235
238
homo : float | None = None
@@ -666,22 +669,19 @@ def _get_eigstats_varsdict(self, text: list[str], prefix: str | None) -> dict[st
666
669
lines2 = find_all_key ("eigStats' ..." , text )
667
670
lines3 = [lines1 [i ] for i in range (len (lines1 )) if lines1 [i ] in lines2 ]
668
671
if not lines3 :
669
- varsdict ["emin" ] = None
670
- varsdict ["homo" ] = None
671
- varsdict ["efermi" ] = None
672
- varsdict ["lumo" ] = None
673
- varsdict ["emax" ] = None
674
- varsdict ["egap" ] = None
672
+ for key in list (eigstats_keymap .keys ()):
673
+ varsdict [eigstats_keymap [key ]] = None
675
674
self .has_eigstats = False
676
675
else :
677
- line = lines3 [- 1 ]
678
- varsdict ["emin" ] = float (text [line + 1 ].split ()[1 ]) * Ha_to_eV
679
- varsdict ["homo" ] = float (text [line + 2 ].split ()[1 ]) * Ha_to_eV
680
- varsdict ["efermi" ] = float (text [line + 3 ].split ()[2 ]) * Ha_to_eV
681
- varsdict ["lumo" ] = float (text [line + 4 ].split ()[1 ]) * Ha_to_eV
682
- varsdict ["emax" ] = float (text [line + 5 ].split ()[1 ]) * Ha_to_eV
683
- varsdict ["egap" ] = float (text [line + 6 ].split ()[2 ]) * Ha_to_eV
684
- self .has_eigstats = True
676
+ line_start = lines3 [- 1 ]
677
+ line_start_rel_idx = lines1 .index (line_start )
678
+ line_end = lines1 [line_start_rel_idx + 1 ] if len (lines1 ) >= line_start_rel_idx + 2 else len (lines1 ) - 1
679
+ _varsdict = _init_dict_from_colon_dump_lines ([text [idx ] for idx in range (line_start , line_end )])
680
+ for key in _varsdict :
681
+ varsdict [eigstats_keymap [key ]] = float (_varsdict [key ]) * Ha_to_eV
682
+ self .has_eigstats = all (eigstats_keymap [key ] in varsdict for key in eigstats_keymap ) and all (
683
+ eigstats_keymap [key ] is not None for key in eigstats_keymap
684
+ )
685
685
return varsdict
686
686
687
687
def _set_eigvars (self , text : list [str ]) -> None :
@@ -691,12 +691,8 @@ def _set_eigvars(self, text: list[str]) -> None:
691
691
text (list[str]): Output of read_file for out file.
692
692
"""
693
693
eigstats = self ._get_eigstats_varsdict (text , self .prefix )
694
- self .emin = eigstats ["emin" ]
695
- self .homo = eigstats ["homo" ]
696
- self .efermi = eigstats ["efermi" ]
697
- self .lumo = eigstats ["lumo" ]
698
- self .emax = eigstats ["emax" ]
699
- self .egap = eigstats ["egap" ]
694
+ for key , val in eigstats .items ():
695
+ setattr (self , key , val )
700
696
if self .efermi is None :
701
697
if self .mu is None :
702
698
self .mu = self ._get_mu ()
@@ -1063,12 +1059,9 @@ def _set_atom_vars(self, text: list[str]) -> None:
1063
1059
self .atom_elements = atom_elements
1064
1060
self .atom_elements_int = [Element (x ).Z for x in self .atom_elements ]
1065
1061
self .atom_types = atom_types
1066
- line = find_key ("# Ionic positions in" , text )
1067
- if line is not None :
1068
- line += 1
1069
- coords = np .array ([text [i ].split ()[2 :5 ] for i in range (line , line + self .nat )], dtype = float )
1070
- self .atom_coords_final = coords
1071
- self .atom_coords = coords .copy ()
1062
+ if isinstance (self .structure , Structure ):
1063
+ self .atom_coords = self .structure .cart_coords
1064
+ self .atom_coords_final = self .structure .cart_coords
1072
1065
1073
1066
def _set_lattice_vars (self , text : list [str ]) -> None :
1074
1067
"""Set the lattice variables.
@@ -1246,6 +1239,17 @@ def __str__(self) -> str:
1246
1239
return pprint .pformat (self )
1247
1240
1248
1241
1242
+ eigstats_keymap = {
1243
+ "eMin" : "emin" ,
1244
+ "HOMO" : "homo" ,
1245
+ "mu" : "efermi" ,
1246
+ "LUMO" : "lumo" ,
1247
+ "eMax" : "emax" ,
1248
+ "HOMO-LUMO gap" : "egap" ,
1249
+ "Optical gap" : "optical_egap" ,
1250
+ }
1251
+
1252
+
1249
1253
def get_pseudo_read_section_bounds (text : list [str ]) -> list [list [int ]]:
1250
1254
"""Get the boundary line numbers for the pseudopotential read section.
1251
1255
0 commit comments