diff --git a/parser/parser-octopus/parser_octopus.py b/parser/parser-octopus/parser_octopus.py index 33b2e2446e38d2ebdb3b7656a175fd08bb2646fb..f195e254327a1039baa9c6a5d6c7a8e5966e7d07 100644 --- a/parser/parser-octopus/parser_octopus.py +++ b/parser/parser-octopus/parser_octopus.py @@ -44,8 +44,8 @@ def normalize_names(names): return [name.lower() for name in names] -OCT_ENERGY_UNIT_NAME = 'usrOctEnergyUnit' -OCT_LENGTH_UNIT_NAME = 'usrOctLengthUnit' +ENERGY_UNIT = 'usrOctEnergyUnit' +LENGTH_UNIT = 'usrOctLengthUnit' metaInfoPath = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../../../../nomad-meta-info/meta_info/nomad_meta_info/octopus.nomadmetainfo.json")) metaInfoEnv, warnings = loadJsonFile(filePath=metaInfoPath, @@ -179,8 +179,8 @@ def register_units(kwargs, fd): print('Set units: energy=%s, length=%s' % (energy_unit, length_unit), file=fd) - register_userdefined_quantity(OCT_ENERGY_UNIT_NAME, energy_unit) - register_userdefined_quantity(OCT_LENGTH_UNIT_NAME, length_unit) + register_userdefined_quantity(ENERGY_UNIT, energy_unit) + register_userdefined_quantity(LENGTH_UNIT, length_unit) metadata_dtypes = {'b': bool, @@ -293,6 +293,24 @@ def parse(fname, fd): parse_infofile(metaInfoEnv, pew, fname) with open_section('section_method'): + smearing_width = float(kwargs.get('smearing', 0.0)) + pew.addValue('smearing_width', + convert_unit(smearing_width, ENERGY_UNIT)) + smearing_func = kwargs.get('smearingfunction', + 'semiconducting') + smearing_kinds = {'semiconducting': 'empty', + 'spline_smearing': 'gaussian', + # Note: spline and Gaussian are only + # nearly identical. See: + # oct-help --print SmearingFunction + 'fermi_dirac': 'fermi', + 'cold_smearing': 'marzari-vanderbilt', + 'methfessel_paxton': 'methfessel-paxton'} + #'': 'tetrahedra', + + pew.addValue('smearing_kind', + smearing_kinds[smearing_func]) + pew.addValue('number_of_spin_channels', nspins) pew.addValue('total_charge', float(parser_log_kwargs['excesscharge'])) @@ -321,6 +339,10 @@ def parse(fname, fd): with open_section('section_XC_functionals'): pew.addValue('XC_functional_name', functional) + forces = calc.results.get('forces') + if forces is not None: + pew.addArrayValues('atom_forces_free_raw', + convert_unit(forces, 'eV')) # Convergence parameters? with open_section('section_eigenvalues'):