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
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.
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
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}}$].
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.
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.
Inherited Members
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}}$].
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.BandResolvedEnergySpectrumfor details.
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.
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.CellResolvedEnergySpectrumfor details.
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.
231 @property 232 def vbmax(self) -> float: 233 r"""Valence band maximum [$\mathrm{eV}$].""" 234 return self._vbmax
Valence band maximum [$\mathrm{eV}$].
236 @property 237 def ibmin(self) -> float: 238 r"""Intermediate band minimum [$\mathrm{eV}$].""" 239 return self._ibmin
Intermediate band minimum [$\mathrm{eV}$].
241 @property 242 def ibmax(self) -> float: 243 r"""Intermediate band maximum [$\mathrm{eV}$].""" 244 return self._ibmax
Intermediate band maximum [$\mathrm{eV}$].