diff --git a/octopusparser/aseoct.py b/octopusparser/aseoct.py index cebb6035d535a77da935ccf97aa6cd6cee801e52..e3aa10fc7c4ddf08b453569b014221a1e551ac83 100644 --- a/octopusparser/aseoct.py +++ b/octopusparser/aseoct.py @@ -310,8 +310,14 @@ def read_static_info_kpoints(fd): return dict(ibz_k_points=ibz_k_points, k_point_weights=k_point_weights) -def read_static_info_eigenvalues(fd, energy_unit): - #import os # tmk +#def read_static_info_eigenvalues(fd, energy_unit): +def read_static_info_eigenvalues_efermi(fd, energy_unit): + ''' + Parse eigenvalues and Fermi Energy from `static/info` + fd: file descriptor + energy_unit: string + Returns: dictionary + ''' values_sknx = {} nbands = 0 @@ -321,14 +327,11 @@ def read_static_info_eigenvalues(fd, energy_unit): if line.startswith('#'): continue if line.startswith('Fermi'): # tmk - pass # print(line) + # print(line, '##') # OK! + tokens = line.split() + unit = {'eV': eV, 'H': Hartree}[tokens[-1]] + eFermi = float(tokens[-2]) * unit if not line[:1].isdigit(): - # print('hithere', line) - # I SHOULD JUMP BACK ONE LINE RIGTH HERE - # fd.seek(-len(line)) - # I TRIED THIS: - # fd.seek(fd.tell() - len(line)) - # -> "OSError: telling position disabled by next() call" break tokens = line.split() @@ -351,11 +354,13 @@ def read_static_info_eigenvalues(fd, energy_unit): eps_skn = eps_skn.transpose(1, 0, 2).copy() occ_skn = occ_skn.transpose(1, 0, 2).copy() assert eps_skn.flags.contiguous + #print('save to dictionary: ', nspins, nkpts, nbands, eps_skn, occ_skn, eFermi) return dict(nspins=nspins, nkpts=nkpts, nbands=nbands, eigenvalues=eps_skn, - occupations=occ_skn) + occupations=occ_skn, + efermi=eFermi) def read_static_info_energy(fd, energy_unit): @@ -367,34 +372,22 @@ def read_static_info_energy(fd, energy_unit): def read_static_info(fd): + # fd: file descriptor results = {} - # print('?????????????????????', type(fd)) # tmk - # print('read_static_info()@aseoct.py') # tmk def get_energy_unit(line): # Convert "title [unit]": ---> unit return {'[eV]': eV, '[H]': Hartree}[line.split()[1].rstrip(':')] for line in fd: - # print('line::', line.strip()) - if line.startswith('Fermi'): - #print('EUREKA:', line) if line.strip('*').strip().startswith('Brillouin zone'): - #print('X1', line) results.update(read_static_info_kpoints(fd)) elif line.startswith('Eigenvalues ['): - #print('X2', line) unit = get_energy_unit(line) - results.update(read_static_info_eigenvalues(fd, unit)) - fd.seek(0, 0) # TMK: - elif line.startswith('Fermi'): - #print('X2b1') # TMK: - fd.seek(-1, 1) # TMK: - #print('X2b2', line) + results.update(read_static_info_eigenvalues_efermi(fd, unit)) + ## print('I found:', results['efermi']) elif line.startswith('Energy ['): - #print('\nX3', line) unit = get_energy_unit(line) results.update(read_static_info_energy(fd, unit)) elif line.startswith('Total Magnetic Moment'): - #print('X4', line) if 0: line = next(fd) values = line.split() @@ -415,12 +408,10 @@ def read_static_info(fd): results['magmoms'] = np.array(mag_moment) elif line.startswith('Dipole'): - #print('X5', line) assert line.split()[-1] == '[Debye]' dipole = [float(next(fd).split()[-1]) for i in range(3)] results['dipole'] = np.array(dipole) * Debye elif line.startswith('Forces'): - #print('X6', line) forceunitspec = line.split()[-1] forceunit = {'[eV/A]': eV / Angstrom, '[H/b]': Hartree / Bohr}[forceunitspec] @@ -434,22 +425,16 @@ def read_static_info(fd): forces.append([float(f) for f in tokens]) results['forces'] = np.array(forces) * forceunit elif line.startswith('Fermi'): - #print('X7', line) - tokens = line.split() - unit = {'eV': eV, 'H': Hartree}[tokens[-1]] - eFermi = float(tokens[-2]) * unit - results['efermi'] = eFermi - #print('####1', line) - - # TMK: MARKUS:the last `elif` should be simply `if` - # otherwise when the head `if` is True - # then all other `elif`s wont be evaluated - if line.startswith('Fermi'): + # this check is 'one line too late' + # hence we capture Fermi energy from + # `read_static_info_eigenvalues()` + # print('Point 1', line) tokens = line.split() unit = {'eV': eV, 'H': Hartree}[tokens[-1]] eFermi = float(tokens[-2]) * unit results['efermi'] = eFermi - print('####2', line) + # print("helloo, eFermi:", eFermi, unit) + # print('####1', line) if 'ibz_k_points' not in results: @@ -467,8 +452,9 @@ def read_static_info(fd): break eFermi = all_energies[arg] results['efermi'] = eFermi - print('eFermi NOW', eFermi) # this produces bad estimate - + # print('eFermi estimate', eFermi) # this produces bad estimate + # ---- + #print('finish', results['efermi']) return results diff --git a/octopusparser/parser_octopus.py b/octopusparser/parser_octopus.py index 0283e89788da37379725ee5a87665d370f48b6f7..a05cdf26fbd0e033bf7bfec2b3f241584cf0cd50 100644 --- a/octopusparser/parser_octopus.py +++ b/octopusparser/parser_octopus.py @@ -110,13 +110,13 @@ def parse_infofile(meta_info_env, pew, fname): pew.addValue(names[tokens[0]], convert_unit(float(tokens[2]), nomadunit)) if tokens[0] == 'Fermi energy': + pass # print(tokens) # print('#', line) - - def parse_logfile(meta_info_env, pew, fname): + '''Parse the mainfile''' maxlines = 100 with open(fname) as fd: for i, line in enumerate(fd): @@ -131,6 +131,9 @@ def parse_logfile(meta_info_env, pew, fname): def parse_gridinfo(metaInfoEnv, pew, fname): + ''' + fname: main filename + ''' results = {} with open(fname) as fd: @@ -541,7 +544,7 @@ def parse_without_class(fname, backend, parser_info): pew.addValue('single_configuration_calculation_to_system_ref', system_gid) # print('Parse info file %s' % fname) #, file=fd) - logging.debug('Parse info file %s' % fname) + logging.debug('Parse info file %s' % fname) # mainfile parse_infofile(metaInfoEnv, pew, fname) with open_section('section_method') as method_gid: