diff --git a/src/py4vasp/_raw/data.py b/src/py4vasp/_raw/data.py index 60f80833..d0a70e45 100644 --- a/src/py4vasp/_raw/data.py +++ b/src/py4vasp/_raw/data.py @@ -533,7 +533,7 @@ class ElectronPhononSelfEnergy(schema.Sequence): eigenvalues: VaspData debye_waller: VaspData fan: VaspData - + bks_idx: VaspData @dataclasses.dataclass class ElectronPhononTransport(schema.Sequence): diff --git a/src/py4vasp/_raw/definition.py b/src/py4vasp/_raw/definition.py index 717e393d..7e494fbf 100644 --- a/src/py4vasp/_raw/definition.py +++ b/src/py4vasp/_raw/definition.py @@ -528,15 +528,16 @@ def selections(quantity): schema.add( raw.ElectronPhononSelfEnergy, required=raw.Version(6, 5), - size=f"{group}/self_energy_meta/id_size", + size=f"{group}/self_energy_meta/ncalculators", eigenvalues=f"{group}/eigenvalues/eigenvalues", debye_waller=f"{group}/self_energy_{{}}/selfen_dw", + bks_idx=f"{group}/self_energy_{{}}/bks_idx", fan=f"{group}/self_energy_{{}}/selfen_fan", ) schema.add( raw.ElectronPhononTransport, required=raw.Version(6, 5), - size=f"{group}/transport_meta/id_size", + size=f"{group}/transport_meta/ncalculators", mobility=f"{group}/transport_{{}}/mobility", transport_function=f"{group}/transport_{{}}/transport_function", ) diff --git a/src/py4vasp/calculation/__init__.py b/src/py4vasp/calculation/__init__.py index 29500579..07808220 100644 --- a/src/py4vasp/calculation/__init__.py +++ b/src/py4vasp/calculation/__init__.py @@ -80,7 +80,7 @@ class provides a more flexible interface with which you can determine the source "workfunction", ) _nested = { - "electron_phonon": ("self_energy",), + "electron_phonon": ("self_energy","transport",), } _private = ("dispersion",) __all__ = _quantities + tuple(_nested) + _input_files diff --git a/src/py4vasp/calculation/_electron_phonon_self_energy.py b/src/py4vasp/calculation/_electron_phonon_self_energy.py index be1b02f6..60dc7641 100644 --- a/src/py4vasp/calculation/_electron_phonon_self_energy.py +++ b/src/py4vasp/calculation/_electron_phonon_self_energy.py @@ -18,6 +18,33 @@ def to_dict(self): "fan": self._read_slice_of_data("fan"), } + def __len__(self): + return self._raw_data.size + def _read_slice_of_data(self, name): slice_of_data = getattr(self._raw_data, name)[self._steps] return [data[:] for data in slice_of_data] + + def select(self, selection): + tree = select.Tree.from_string(selection) + for selection in tree.selections(): + print(selection) + + def get_fan(self,arg): + iband,ikpt,isp,*more = arg + st = SparseTensor(self._raw_data.bks_idx, + self._raw_data.fan) + return st(iband,ikpt,isp) + +class SparseTensor(): + def __init__(self,bks_idx,tensor): + self.bks_idx = bks_idx + self.tensor = tensor + + def _get_ibks(self,iband,ikpt,isp): + return self.bks_idx[iband,ikpt,isp] + + def __getitem__(self,arg): + iband,ikpt,isp,*more = arg + ibks = self._get_ibks(iband,ikpt,isp) + return self.tensor[ibks,more] diff --git a/src/py4vasp/calculation/_electron_phonon_transport.py b/src/py4vasp/calculation/_electron_phonon_transport.py new file mode 100644 index 00000000..4fe0077f --- /dev/null +++ b/src/py4vasp/calculation/_electron_phonon_transport.py @@ -0,0 +1,25 @@ +# Copyright © VASP Software GmbH, +# Licensed under the Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) +from py4vasp.calculation import _base, _slice + + +class ElectronPhononTransport(_slice.Mixin, _base.Refinery): + "Placeholder for electron phonon transport" + + @_base.data_access + def __str__(self): + return "electron phonon transport" + + @_base.data_access + def to_dict(self): + return { + "transport_function": self._read_slice_of_data("transport_function"), + "mobility": self._read_slice_of_data("mobility"), + } + + def __len__(self): + return self._raw_data.size + + def _read_slice_of_data(self, name): + slice_of_data = getattr(self._raw_data, name)[self._steps] + return [data[:] for data in slice_of_data]