madman.analysis.edos

Electron density of states.

  1r"""Electron density of states."""
  2
  3from __future__ import annotations
  4from collections.abc import Mapping, Sequence
  5from itertools import combinations
  6from numbers import Integral, Real
  7
  8import numpy as np
  9from matplotlib import pyplot as plt
 10
 11from madman.analysis.spectrum import (
 12    EnergySpectrumMeta,
 13    EnergySpectrum,
 14    ResolvedEnergySpectrum,
 15)
 16
 17
 18class ElectronDensityOfStatesMeta(EnergySpectrumMeta):
 19    r"""Metaclass of ElectronDensityOfStates."""
 20
 21    @property
 22    def std_axes(cls) -> plt.Axes:
 23        r"""Standard axes to plot electron density of states.
 24
 25        Returns:
 26            Plot axes.
 27        """
 28        _, ax = plt.subplots(tight_layout=True)
 29        ax.set_xlabel(r"Electron energy / $\mathrm{eV}$")
 30        ax.set_ylabel(r"Electron DOS / $\mathrm{eV^{-1}}$")
 31        return ax
 32
 33
 34class ElectronDensityOfStates(
 35    EnergySpectrum, metaclass=ElectronDensityOfStatesMeta
 36):
 37    r"""Electron density of states.
 38
 39    Note:
 40        `energies`: Electron energies [$\mathrm{eV}$].
 41        `values`: Electron density of states values [$\mathrm{eV^{-1}}$].
 42    """
 43
 44    def __init__(
 45        self,
 46        energies: Sequence[Real, ...],
 47        values: Sequence[Real, ...],
 48        *,
 49        d_energy: Real | None = None,
 50    ) -> None:
 51        r"""Initialize ElectronDensityOfStates object.
 52
 53        Args:
 54            energies: Electron energies [$\mathrm{eV}$].
 55            values: Electron density of states values [$\mathrm{eV^{-1}}$].
 56            d_energy: Target electron energy increment [$\mathrm{eV}$].
 57
 58        Raises:
 59            ValueError: If there are negative density values.
 60        """
 61        if np.less(values, 0.0).any():
 62            raise ValueError("Negative density values!")
 63        super().__init__(energies, values, d_energy=d_energy)
 64
 65    def ret_band_rsv(
 66        self, *, threshold: Real = 0.0
 67    ) -> BandResolvedElectronDensityOfStates:
 68        r"""Return band resolved electron density of states.
 69
 70        Args:
 71            threshold: Threshold below which electron density of states values
 72                are rounded to zero [$\mathrm{eV^{-1}}$].
 73
 74        Returns:
 75            Band resolved electron density of states.
 76        """
 77        values = self.values.copy()
 78        values[values < threshold] = 0.0
 79
 80        nonzero_i = np.where(values > 0.0)[0]
 81        d_nonzero_i = np.diff(nonzero_i)
 82        edge_i = np.where(d_nonzero_i > 1)[0] + 1
 83        band_i_seq = np.split(nonzero_i, edge_i)
 84
 85        rsv_values = {}
 86        for i, band_i in enumerate(band_i_seq):
 87            mask = np.zeros(values.shape, dtype=bool)
 88            mask[band_i] = True
 89            rsv_values[i] = np.where(mask, values, 0.0)
 90        return type(self).band_rsv(self.energies, rsv_values)
 91
 92
 93class ResolvedElectronDensityOfStates(ResolvedEnergySpectrum):
 94    r"""Resolved electron density of states.
 95
 96    Note:
 97        `energies`: Electron energies [$\mathrm{eV}$].
 98        `rsv_values`: Resolved electron density of states values
 99            [$\mathrm{eV^{-1}}$].
100    """
101
102
103class BandResolvedElectronDensityOfStates(ResolvedElectronDensityOfStates):
104    r"""Band resolved electron density of states.
105
106    Note:
107        `energies`: Electron energies [$\mathrm{eV}$].
108        `rsv_values`: Band resolved electron density of states values
109            [$\mathrm{eV^{-1}}$].
110
111    Note:
112        See `madman.analysis.spectrum.BandResolvedEnergySpectrum` for details.
113    """
114
115    def __init__(
116        self,
117        energies: Sequence[Real, ...],
118        rsv_values: Mapping[Integral, Sequence[Real, ...]],
119        *,
120        d_energy: Real | None = None,
121    ) -> None:
122        r"""Initialize BandResolvedElectronDensityOfStates object.
123
124        Args:
125            energies: Electron energies [$\mathrm{eV}$].
126            rsv_values: Mapping of band index into electron density of states
127                values [$\mathrm{eV^{-1}}$].
128            d_energy: Target electron energy increment [$\mathrm{eV}$].
129
130        Raises:
131            ValueError: If there are unresolved bands.
132            ValueError: If there are overlapping bands.
133        """
134        super().__init__(energies, rsv_values, d_energy=d_energy)
135
136        for values in self.rsv_values.values():
137            nonzero_i = np.where(values)[0]
138            d_nonzero_i = np.diff(nonzero_i)
139            if not set(d_nonzero_i).issubset({1}):
140                raise ValueError("Unresolved bands!")
141
142        for values_1, values_2 in combinations(self.rsv_values.values(), 2):
143            nonzero_i_1 = np.where(values_1)[0][:, np.newaxis]
144            nonzero_i_2 = np.where(values_2)[0]
145            if nonzero_i_1.size > 0 and nonzero_i_2.size > 0:
146                nonzero_i_d = np.abs(nonzero_i_1 - nonzero_i_2)
147                if np.amin(nonzero_i_d) <= 1:
148                    raise ValueError("Overlapping bands!")
149
150
151class CellResolvedElectronDensityOfStates(ResolvedElectronDensityOfStates):
152    r"""Cell resolved electron density of states.
153
154    Note:
155        `energies`: Electron energies [$\mathrm{eV}$].
156        `rsv_values`: Cell resolved electron density of states values
157            [$\mathrm{eV^{-1}}$].
158
159    Note:
160        See `madman.analysis.spectrum.CellResolvedEnergySpectrum` for details.
161    """
162
163    def __init__(
164        self,
165        energies: Sequence[Real, ...],
166        rsv_values: Mapping[str, Sequence[Real, ...]],
167        *,
168        d_energy: Real | None = None,
169    ) -> None:
170        r"""Initialize CellResolvedElectronDensityOfStates object.
171
172        Args:
173            energies: Electron energies [$\mathrm{eV}$].
174            rsv_values: Mapping of cell role into electron density of states
175                values [$\mathrm{eV^{-1}}$].
176            d_energy: Target electron energy increment [$\mathrm{eV}$].
177
178        Raises:
179            ValueError: If valence band is not below conduction band.
180            ValueError: If valence band is not below intermediate band.
181            ValueError: If intermediate band is not below conduction band.
182        """
183        super().__init__(energies, rsv_values, d_energy=d_energy)
184
185        if "v" in self.rsv_values and "c" in self.rsv_values:
186            vb_i = np.where(self.rsv_values["v"] > 0.0)[0]
187            cb_i = np.where(self.rsv_values["c"] > 0.0)[0]
188            if np.amin(cb_i) - np.amax(vb_i) < 2:
189                raise ValueError("Valence band not below conduction band!")
190
191        if "v" in self.rsv_values and "i" in self.rsv_values:
192            vb_i = np.where(self.rsv_values["v"] > 0.0)[0]
193            ib_i = np.where(self.rsv_values["i"] > 0.0)[0]
194            if np.amin(ib_i) - np.amax(vb_i) < 2:
195                raise ValueError("Valence band not below intermediate band!")
196
197        if "i" in self.rsv_values and "c" in self.rsv_values:
198            ib_i = np.where(self.rsv_values["i"] > 0.0)[0]
199            cb_i = np.where(self.rsv_values["c"] > 0.0)[0]
200            if np.amin(cb_i) - np.amax(ib_i) < 2:
201                raise ValueError("Intermediate band not below conduction band!")
202
203        vb_values = self.rsv_values.get("v", None)
204        if vb_values is None:
205            self._vbmax = np.nan
206        else:
207            vb_i = np.where(vb_values)[0]
208            vbmax_i = vb_i.max() + 1
209            self._vbmax = self.energies[vbmax_i]
210
211        ib_values = self.rsv_values.get("i", None)
212        if ib_values is None:
213            self._ibmin = np.nan
214            self._ibmax = np.nan
215        else:
216            ib_i = np.where(ib_values)[0]
217            ibmin_i = ib_i.min() - 1
218            ibmax_i = ib_i.max() + 1
219            self._ibmin = self.energies[ibmin_i]
220            self._ibmax = self.energies[ibmax_i]
221
222        cb_values = self.rsv_values.get("c", None)
223        if cb_values is None:
224            self._cbmin = np.nan
225        else:
226            cb_i = np.where(cb_values)[0]
227            cbmin_i = cb_i.min() - 1
228            self._cbmin = self.energies[cbmin_i]
229
230    @property
231    def vbmax(self) -> float:
232        r"""Valence band maximum [$\mathrm{eV}$]."""
233        return self._vbmax
234
235    @property
236    def ibmin(self) -> float:
237        r"""Intermediate band minimum [$\mathrm{eV}$]."""
238        return self._ibmin
239
240    @property
241    def ibmax(self) -> float:
242        r"""Intermediate band maximum [$\mathrm{eV}$]."""
243        return self._ibmax
244
245    @property
246    def cbmin(self) -> float:
247        r"""Conduction band minimum [$\mathrm{eV}$]."""
248        return self._cbmin
class ElectronDensityOfStatesMeta(madman.analysis.spectrum.EnergySpectrumMeta):
19class ElectronDensityOfStatesMeta(EnergySpectrumMeta):
20    r"""Metaclass of ElectronDensityOfStates."""
21
22    @property
23    def std_axes(cls) -> plt.Axes:
24        r"""Standard axes to plot electron density of states.
25
26        Returns:
27            Plot axes.
28        """
29        _, ax = plt.subplots(tight_layout=True)
30        ax.set_xlabel(r"Electron energy / $\mathrm{eV}$")
31        ax.set_ylabel(r"Electron DOS / $\mathrm{eV^{-1}}$")
32        return ax

Metaclass of ElectronDensityOfStates.

std_axes: matplotlib.axes._axes.Axes
22    @property
23    def std_axes(cls) -> plt.Axes:
24        r"""Standard axes to plot electron density of states.
25
26        Returns:
27            Plot axes.
28        """
29        _, ax = plt.subplots(tight_layout=True)
30        ax.set_xlabel(r"Electron energy / $\mathrm{eV}$")
31        ax.set_ylabel(r"Electron DOS / $\mathrm{eV^{-1}}$")
32        return ax

Standard axes to plot electron density of states.

Returns:

Plot axes.

Inherited Members
builtins.type
type
mro
madman.analysis.spectrum.EnergySpectrumMeta
rsv
band_rsv
cell_rsv
class ElectronDensityOfStates(madman.analysis.spectrum.EnergySpectrum):
35class ElectronDensityOfStates(
36    EnergySpectrum, metaclass=ElectronDensityOfStatesMeta
37):
38    r"""Electron density of states.
39
40    Note:
41        `energies`: Electron energies [$\mathrm{eV}$].
42        `values`: Electron density of states values [$\mathrm{eV^{-1}}$].
43    """
44
45    def __init__(
46        self,
47        energies: Sequence[Real, ...],
48        values: Sequence[Real, ...],
49        *,
50        d_energy: Real | None = None,
51    ) -> None:
52        r"""Initialize ElectronDensityOfStates object.
53
54        Args:
55            energies: Electron energies [$\mathrm{eV}$].
56            values: Electron density of states values [$\mathrm{eV^{-1}}$].
57            d_energy: Target electron energy increment [$\mathrm{eV}$].
58
59        Raises:
60            ValueError: If there are negative density values.
61        """
62        if np.less(values, 0.0).any():
63            raise ValueError("Negative density values!")
64        super().__init__(energies, values, d_energy=d_energy)
65
66    def ret_band_rsv(
67        self, *, threshold: Real = 0.0
68    ) -> BandResolvedElectronDensityOfStates:
69        r"""Return band resolved electron density of states.
70
71        Args:
72            threshold: Threshold below which electron density of states values
73                are rounded to zero [$\mathrm{eV^{-1}}$].
74
75        Returns:
76            Band resolved electron density of states.
77        """
78        values = self.values.copy()
79        values[values < threshold] = 0.0
80
81        nonzero_i = np.where(values > 0.0)[0]
82        d_nonzero_i = np.diff(nonzero_i)
83        edge_i = np.where(d_nonzero_i > 1)[0] + 1
84        band_i_seq = np.split(nonzero_i, edge_i)
85
86        rsv_values = {}
87        for i, band_i in enumerate(band_i_seq):
88            mask = np.zeros(values.shape, dtype=bool)
89            mask[band_i] = True
90            rsv_values[i] = np.where(mask, values, 0.0)
91        return type(self).band_rsv(self.energies, rsv_values)

Electron density of states.

Note:

energies: Electron energies [$\mathrm{eV}$]. values: Electron density of states values [$\mathrm{eV^{-1}}$].

ElectronDensityOfStates( energies: collections.abc.Sequence[numbers.Real, ...], values: collections.abc.Sequence[numbers.Real, ...], *, d_energy: numbers.Real | None = None)
45    def __init__(
46        self,
47        energies: Sequence[Real, ...],
48        values: Sequence[Real, ...],
49        *,
50        d_energy: Real | None = None,
51    ) -> None:
52        r"""Initialize ElectronDensityOfStates object.
53
54        Args:
55            energies: Electron energies [$\mathrm{eV}$].
56            values: Electron density of states values [$\mathrm{eV^{-1}}$].
57            d_energy: Target electron energy increment [$\mathrm{eV}$].
58
59        Raises:
60            ValueError: If there are negative density values.
61        """
62        if np.less(values, 0.0).any():
63            raise ValueError("Negative density values!")
64        super().__init__(energies, values, d_energy=d_energy)

Initialize ElectronDensityOfStates object.

Arguments:
  • energies: Electron energies [$\mathrm{eV}$].
  • values: Electron density of states values [$\mathrm{eV^{-1}}$].
  • d_energy: Target electron energy increment [$\mathrm{eV}$].
Raises:
  • ValueError: If there are negative density values.
def ret_band_rsv( self, *, threshold: numbers.Real = 0.0) -> BandResolvedElectronDensityOfStates:
66    def ret_band_rsv(
67        self, *, threshold: Real = 0.0
68    ) -> BandResolvedElectronDensityOfStates:
69        r"""Return band resolved electron density of states.
70
71        Args:
72            threshold: Threshold below which electron density of states values
73                are rounded to zero [$\mathrm{eV^{-1}}$].
74
75        Returns:
76            Band resolved electron density of states.
77        """
78        values = self.values.copy()
79        values[values < threshold] = 0.0
80
81        nonzero_i = np.where(values > 0.0)[0]
82        d_nonzero_i = np.diff(nonzero_i)
83        edge_i = np.where(d_nonzero_i > 1)[0] + 1
84        band_i_seq = np.split(nonzero_i, edge_i)
85
86        rsv_values = {}
87        for i, band_i in enumerate(band_i_seq):
88            mask = np.zeros(values.shape, dtype=bool)
89            mask[band_i] = True
90            rsv_values[i] = np.where(mask, values, 0.0)
91        return type(self).band_rsv(self.energies, rsv_values)

Return band resolved electron density of states.

Arguments:
  • threshold: Threshold below which electron density of states values are rounded to zero [$\mathrm{eV^{-1}}$].
Returns:

Band resolved electron density of states.

class ResolvedElectronDensityOfStates(madman.analysis.spectrum.ResolvedEnergySpectrum):
 94class ResolvedElectronDensityOfStates(ResolvedEnergySpectrum):
 95    r"""Resolved electron density of states.
 96
 97    Note:
 98        `energies`: Electron energies [$\mathrm{eV}$].
 99        `rsv_values`: Resolved electron density of states values
100            [$\mathrm{eV^{-1}}$].
101    """

Resolved electron density of states.

Note:

energies: Electron energies [$\mathrm{eV}$]. rsv_values: Resolved electron density of states values [$\mathrm{eV^{-1}}$].

class BandResolvedElectronDensityOfStates(ResolvedElectronDensityOfStates):
104class BandResolvedElectronDensityOfStates(ResolvedElectronDensityOfStates):
105    r"""Band resolved electron density of states.
106
107    Note:
108        `energies`: Electron energies [$\mathrm{eV}$].
109        `rsv_values`: Band resolved electron density of states values
110            [$\mathrm{eV^{-1}}$].
111
112    Note:
113        See `madman.analysis.spectrum.BandResolvedEnergySpectrum` for details.
114    """
115
116    def __init__(
117        self,
118        energies: Sequence[Real, ...],
119        rsv_values: Mapping[Integral, Sequence[Real, ...]],
120        *,
121        d_energy: Real | None = None,
122    ) -> None:
123        r"""Initialize BandResolvedElectronDensityOfStates object.
124
125        Args:
126            energies: Electron energies [$\mathrm{eV}$].
127            rsv_values: Mapping of band index into electron density of states
128                values [$\mathrm{eV^{-1}}$].
129            d_energy: Target electron energy increment [$\mathrm{eV}$].
130
131        Raises:
132            ValueError: If there are unresolved bands.
133            ValueError: If there are overlapping bands.
134        """
135        super().__init__(energies, rsv_values, d_energy=d_energy)
136
137        for values in self.rsv_values.values():
138            nonzero_i = np.where(values)[0]
139            d_nonzero_i = np.diff(nonzero_i)
140            if not set(d_nonzero_i).issubset({1}):
141                raise ValueError("Unresolved bands!")
142
143        for values_1, values_2 in combinations(self.rsv_values.values(), 2):
144            nonzero_i_1 = np.where(values_1)[0][:, np.newaxis]
145            nonzero_i_2 = np.where(values_2)[0]
146            if nonzero_i_1.size > 0 and nonzero_i_2.size > 0:
147                nonzero_i_d = np.abs(nonzero_i_1 - nonzero_i_2)
148                if np.amin(nonzero_i_d) <= 1:
149                    raise ValueError("Overlapping bands!")

Band resolved electron density of states.

Note:

energies: Electron energies [$\mathrm{eV}$]. rsv_values: Band resolved electron density of states values [$\mathrm{eV^{-1}}$].

Note:

See madman.analysis.spectrum.BandResolvedEnergySpectrum for details.

BandResolvedElectronDensityOfStates( energies: collections.abc.Sequence[numbers.Real, ...], rsv_values: collections.abc.Mapping[numbers.Integral, collections.abc.Sequence[numbers.Real, ...]], *, d_energy: numbers.Real | None = None)
116    def __init__(
117        self,
118        energies: Sequence[Real, ...],
119        rsv_values: Mapping[Integral, Sequence[Real, ...]],
120        *,
121        d_energy: Real | None = None,
122    ) -> None:
123        r"""Initialize BandResolvedElectronDensityOfStates object.
124
125        Args:
126            energies: Electron energies [$\mathrm{eV}$].
127            rsv_values: Mapping of band index into electron density of states
128                values [$\mathrm{eV^{-1}}$].
129            d_energy: Target electron energy increment [$\mathrm{eV}$].
130
131        Raises:
132            ValueError: If there are unresolved bands.
133            ValueError: If there are overlapping bands.
134        """
135        super().__init__(energies, rsv_values, d_energy=d_energy)
136
137        for values in self.rsv_values.values():
138            nonzero_i = np.where(values)[0]
139            d_nonzero_i = np.diff(nonzero_i)
140            if not set(d_nonzero_i).issubset({1}):
141                raise ValueError("Unresolved bands!")
142
143        for values_1, values_2 in combinations(self.rsv_values.values(), 2):
144            nonzero_i_1 = np.where(values_1)[0][:, np.newaxis]
145            nonzero_i_2 = np.where(values_2)[0]
146            if nonzero_i_1.size > 0 and nonzero_i_2.size > 0:
147                nonzero_i_d = np.abs(nonzero_i_1 - nonzero_i_2)
148                if np.amin(nonzero_i_d) <= 1:
149                    raise ValueError("Overlapping bands!")

Initialize BandResolvedElectronDensityOfStates object.

Arguments:
  • energies: Electron energies [$\mathrm{eV}$].
  • rsv_values: Mapping of band index into electron density of states values [$\mathrm{eV^{-1}}$].
  • d_energy: Target electron energy increment [$\mathrm{eV}$].
Raises:
  • ValueError: If there are unresolved bands.
  • ValueError: If there are overlapping bands.
class CellResolvedElectronDensityOfStates(ResolvedElectronDensityOfStates):
152class CellResolvedElectronDensityOfStates(ResolvedElectronDensityOfStates):
153    r"""Cell resolved electron density of states.
154
155    Note:
156        `energies`: Electron energies [$\mathrm{eV}$].
157        `rsv_values`: Cell resolved electron density of states values
158            [$\mathrm{eV^{-1}}$].
159
160    Note:
161        See `madman.analysis.spectrum.CellResolvedEnergySpectrum` for details.
162    """
163
164    def __init__(
165        self,
166        energies: Sequence[Real, ...],
167        rsv_values: Mapping[str, Sequence[Real, ...]],
168        *,
169        d_energy: Real | None = None,
170    ) -> None:
171        r"""Initialize CellResolvedElectronDensityOfStates object.
172
173        Args:
174            energies: Electron energies [$\mathrm{eV}$].
175            rsv_values: Mapping of cell role into electron density of states
176                values [$\mathrm{eV^{-1}}$].
177            d_energy: Target electron energy increment [$\mathrm{eV}$].
178
179        Raises:
180            ValueError: If valence band is not below conduction band.
181            ValueError: If valence band is not below intermediate band.
182            ValueError: If intermediate band is not below conduction band.
183        """
184        super().__init__(energies, rsv_values, d_energy=d_energy)
185
186        if "v" in self.rsv_values and "c" in self.rsv_values:
187            vb_i = np.where(self.rsv_values["v"] > 0.0)[0]
188            cb_i = np.where(self.rsv_values["c"] > 0.0)[0]
189            if np.amin(cb_i) - np.amax(vb_i) < 2:
190                raise ValueError("Valence band not below conduction band!")
191
192        if "v" in self.rsv_values and "i" in self.rsv_values:
193            vb_i = np.where(self.rsv_values["v"] > 0.0)[0]
194            ib_i = np.where(self.rsv_values["i"] > 0.0)[0]
195            if np.amin(ib_i) - np.amax(vb_i) < 2:
196                raise ValueError("Valence band not below intermediate band!")
197
198        if "i" in self.rsv_values and "c" in self.rsv_values:
199            ib_i = np.where(self.rsv_values["i"] > 0.0)[0]
200            cb_i = np.where(self.rsv_values["c"] > 0.0)[0]
201            if np.amin(cb_i) - np.amax(ib_i) < 2:
202                raise ValueError("Intermediate band not below conduction band!")
203
204        vb_values = self.rsv_values.get("v", None)
205        if vb_values is None:
206            self._vbmax = np.nan
207        else:
208            vb_i = np.where(vb_values)[0]
209            vbmax_i = vb_i.max() + 1
210            self._vbmax = self.energies[vbmax_i]
211
212        ib_values = self.rsv_values.get("i", None)
213        if ib_values is None:
214            self._ibmin = np.nan
215            self._ibmax = np.nan
216        else:
217            ib_i = np.where(ib_values)[0]
218            ibmin_i = ib_i.min() - 1
219            ibmax_i = ib_i.max() + 1
220            self._ibmin = self.energies[ibmin_i]
221            self._ibmax = self.energies[ibmax_i]
222
223        cb_values = self.rsv_values.get("c", None)
224        if cb_values is None:
225            self._cbmin = np.nan
226        else:
227            cb_i = np.where(cb_values)[0]
228            cbmin_i = cb_i.min() - 1
229            self._cbmin = self.energies[cbmin_i]
230
231    @property
232    def vbmax(self) -> float:
233        r"""Valence band maximum [$\mathrm{eV}$]."""
234        return self._vbmax
235
236    @property
237    def ibmin(self) -> float:
238        r"""Intermediate band minimum [$\mathrm{eV}$]."""
239        return self._ibmin
240
241    @property
242    def ibmax(self) -> float:
243        r"""Intermediate band maximum [$\mathrm{eV}$]."""
244        return self._ibmax
245
246    @property
247    def cbmin(self) -> float:
248        r"""Conduction band minimum [$\mathrm{eV}$]."""
249        return self._cbmin

Cell resolved electron density of states.

Note:

energies: Electron energies [$\mathrm{eV}$]. rsv_values: Cell resolved electron density of states values [$\mathrm{eV^{-1}}$].

Note:

See madman.analysis.spectrum.CellResolvedEnergySpectrum for details.

CellResolvedElectronDensityOfStates( energies: collections.abc.Sequence[numbers.Real, ...], rsv_values: collections.abc.Mapping[str, collections.abc.Sequence[numbers.Real, ...]], *, d_energy: numbers.Real | None = None)
164    def __init__(
165        self,
166        energies: Sequence[Real, ...],
167        rsv_values: Mapping[str, Sequence[Real, ...]],
168        *,
169        d_energy: Real | None = None,
170    ) -> None:
171        r"""Initialize CellResolvedElectronDensityOfStates object.
172
173        Args:
174            energies: Electron energies [$\mathrm{eV}$].
175            rsv_values: Mapping of cell role into electron density of states
176                values [$\mathrm{eV^{-1}}$].
177            d_energy: Target electron energy increment [$\mathrm{eV}$].
178
179        Raises:
180            ValueError: If valence band is not below conduction band.
181            ValueError: If valence band is not below intermediate band.
182            ValueError: If intermediate band is not below conduction band.
183        """
184        super().__init__(energies, rsv_values, d_energy=d_energy)
185
186        if "v" in self.rsv_values and "c" in self.rsv_values:
187            vb_i = np.where(self.rsv_values["v"] > 0.0)[0]
188            cb_i = np.where(self.rsv_values["c"] > 0.0)[0]
189            if np.amin(cb_i) - np.amax(vb_i) < 2:
190                raise ValueError("Valence band not below conduction band!")
191
192        if "v" in self.rsv_values and "i" in self.rsv_values:
193            vb_i = np.where(self.rsv_values["v"] > 0.0)[0]
194            ib_i = np.where(self.rsv_values["i"] > 0.0)[0]
195            if np.amin(ib_i) - np.amax(vb_i) < 2:
196                raise ValueError("Valence band not below intermediate band!")
197
198        if "i" in self.rsv_values and "c" in self.rsv_values:
199            ib_i = np.where(self.rsv_values["i"] > 0.0)[0]
200            cb_i = np.where(self.rsv_values["c"] > 0.0)[0]
201            if np.amin(cb_i) - np.amax(ib_i) < 2:
202                raise ValueError("Intermediate band not below conduction band!")
203
204        vb_values = self.rsv_values.get("v", None)
205        if vb_values is None:
206            self._vbmax = np.nan
207        else:
208            vb_i = np.where(vb_values)[0]
209            vbmax_i = vb_i.max() + 1
210            self._vbmax = self.energies[vbmax_i]
211
212        ib_values = self.rsv_values.get("i", None)
213        if ib_values is None:
214            self._ibmin = np.nan
215            self._ibmax = np.nan
216        else:
217            ib_i = np.where(ib_values)[0]
218            ibmin_i = ib_i.min() - 1
219            ibmax_i = ib_i.max() + 1
220            self._ibmin = self.energies[ibmin_i]
221            self._ibmax = self.energies[ibmax_i]
222
223        cb_values = self.rsv_values.get("c", None)
224        if cb_values is None:
225            self._cbmin = np.nan
226        else:
227            cb_i = np.where(cb_values)[0]
228            cbmin_i = cb_i.min() - 1
229            self._cbmin = self.energies[cbmin_i]

Initialize CellResolvedElectronDensityOfStates object.

Arguments:
  • energies: Electron energies [$\mathrm{eV}$].
  • rsv_values: Mapping of cell role into electron density of states values [$\mathrm{eV^{-1}}$].
  • d_energy: Target electron energy increment [$\mathrm{eV}$].
Raises:
  • ValueError: If valence band is not below conduction band.
  • ValueError: If valence band is not below intermediate band.
  • ValueError: If intermediate band is not below conduction band.
vbmax: float
231    @property
232    def vbmax(self) -> float:
233        r"""Valence band maximum [$\mathrm{eV}$]."""
234        return self._vbmax

Valence band maximum [$\mathrm{eV}$].

ibmin: float
236    @property
237    def ibmin(self) -> float:
238        r"""Intermediate band minimum [$\mathrm{eV}$]."""
239        return self._ibmin

Intermediate band minimum [$\mathrm{eV}$].

ibmax: float
241    @property
242    def ibmax(self) -> float:
243        r"""Intermediate band maximum [$\mathrm{eV}$]."""
244        return self._ibmax

Intermediate band maximum [$\mathrm{eV}$].

cbmin: float
246    @property
247    def cbmin(self) -> float:
248        r"""Conduction band minimum [$\mathrm{eV}$]."""
249        return self._cbmin

Conduction band minimum [$\mathrm{eV}$].