import numpy as np from spatz.simulations.advanceable import Advanceable from numpy.typing import NDArray from abc import abstractmethod from typing import Literal from ambiance import Atmosphere class DataSource(Advanceable): def __init__(self, initial_time=0) -> None: super().__init__(initial_time=initial_time) def get_speed_of_sound(self) -> float: return Atmosphere(self.get_altitude()).speed_of_sound def get_mach_number(self) -> float: speed = np.linalg.norm(self.get_velocity('global')) return speed / self.get_speed_of_sound() def get_temperature(self) -> float: return Atmosphere(self.get_altitude()).temperature[0] def get_start_time(self) -> float: return 0 @abstractmethod def get_length(self) -> float: raise NotImplementedError() @abstractmethod def get_position(self) -> NDArray: raise NotImplementedError() @abstractmethod def get_velocity(self, frame: Literal['global', 'local']) -> NDArray: raise NotImplementedError() @abstractmethod def get_acceleration(self, frame: Literal['global', 'local']) -> NDArray: raise NotImplementedError() @abstractmethod def get_attitude(self) -> NDArray: raise NotImplementedError() @abstractmethod def local_to_global(self) -> NDArray: raise NotImplementedError() @abstractmethod def global_to_local(self) -> NDArray: raise NotImplementedError() @abstractmethod def get_angular_velocity(self) -> NDArray: raise NotImplementedError() @abstractmethod def get_static_pressure(self) -> float: raise NotImplementedError() @abstractmethod def get_longitude(self) -> float: raise NotImplementedError() @abstractmethod def get_latitude(self) -> float: raise NotImplementedError() @abstractmethod def get_altitude(self) -> float: raise NotImplementedError()