Source code for dynasor.modes.band

from __future__ import annotations
from typing import TYPE_CHECKING
from ..units import radians_per_fs_to_THz
from .tools import make_table
from .complex_coordinate import Q, P, F

if TYPE_CHECKING:
    from .qpoint import QPoint


[docs]class Band: """Represents properties of a single band belonging to a q-point To modify the coordinates `Q`, `P` and `F` use `band.Q` and see doc for :class:`dynasor.modes.complex_coordinate.ComplexCoordinate` """ def __init__(self, q_index, band_index, mp): self._q = q_index self._s = band_index self._mp = mp def __repr__(self): return str(self) def __str__(self): string = f"""### Band ### Band index: {self.index} q-point: [{self.qpoint.index}] {self.qpoint.q_reduced} Frequency: {self.omega * radians_per_fs_to_THz:.2f} THz Polarization: """ string += make_table(self.polarization) string += f""" {'Q':<20}{'P':<20}{'F':<20} Value: {self.Q.complex:<20.2f}{self.P.complex:<20.2f}{self.F.complex:<20.2f} Amplitude: {self.Q.amplitude:<20.2f}{self.P.amplitude:<20.2f}{self.F.amplitude:<20.2f} Phase: {self.Q.phase:<20.2f}{self.P.phase:<20.2f}{self.F.phase:<20.2f} Energy: {self.potential_energy:<20.2f}{self.kinetic_energy:<20.2f}{self.virial_energy:<20.2f} """ return string @property def index(self): """The index of the band at the q-point""" return self._s @property def qpoint(self) -> 'QPoint': """The q-point to which the band belongs""" return self._mp[self._q] @property def omega(self): """Slice, see doc for ModeProjector""" return self.qpoint.omegas[self.index] @property def polarization(self): """Slice, see doc for ModeProjector""" return self.qpoint.polarizations[self.index] @property def eigenmode(self): """Slice, see doc for ModeProjector""" return self.qpoint.eigenmodes[self.index] @property def potential_energy(self): """Slice, see doc for ModeProjector""" return self.qpoint.potential_energies[self.index] @property def kinetic_energy(self): """Slice, see doc for ModeProjector""" return self.qpoint.kinetic_energies[self.index] @property def virial_energy(self): """Slice, see doc for ModeProjector""" return self.qpoint.virial_energies[self.index] @property def Q(self) -> Q: """The mode coordinate""" return Q(self.qpoint.index, self.index, self._mp) @property def P(self) -> P: """The mode momentum""" return P(self.qpoint.index, self.index, self._mp) @property def F(self) -> F: """The mode force""" return F(self.qpoint.index, self.index, self._mp)