Source code for osaft.core.helper
from __future__ import annotations
from collections.abc import Sequence
from enum import Enum
from numbers import Number
import numpy as np
from osaft.core.functions import pi
NDArray = np.ndarray
[docs]class StringFormatter:
"""Consistent Formatting for __str__ and __repr__ methods"""
[docs] @staticmethod
def get_str_text(
description: str,
variable: str,
value: float | int | str | Enum,
unit: None | str = None,
linebreak: bool = True,
) -> str:
"""
Returns a constant formatting for the `__str__` method of the ARF
classes
:param description: Physical name for the variable
:param variable: symbol/name of the variable
:param value: value of the variable
:param unit: unit of the variable
:param linebreak: Appends a linebreak to the end of the text
"""
out = f"{description:<20s}:\t"
out += f"{variable:>8s} = "
if isinstance(value, bool) or value is None:
out += str(value)
elif isinstance(value, Enum):
out += f"{value.name:8s}"
else:
out += f"{value:5.2e}"
if unit is not None and unit != "":
out += f" [{unit:s}]"
if linebreak:
out += "\n"
return out
[docs]class InputHandler:
"""Handles inputs for velocity field methods
Tests if inputs r, theta, t passed to methods that compute the velocity
field are valid inputs and converts the inputs to numpy.ndarray.
"""
@staticmethod
def _test_array(
array: NDArray,
low: None | float = None,
high: None | float = None,
):
if low is not None and np.any(array < low):
msg = f"at least one value is smaller than {low}"
raise ValueError(msg)
if high is not None and np.any(array > high):
msg = f"at least one value is greater than {high}"
raise ValueError(msg)
[docs] @classmethod
def handle_input(
cls,
r: Number | Sequence,
theta: Number | Sequence,
t: Number | Sequence,
R_0: Number | Sequence,
inside_sphere: bool,
):
"""Tests if inputs r, theta, t passed to methods that compute the
velocity field are valid inputs and converts the
inputs to numpy.ndarray.
:param r: radial coordinate
:param theta: tangential coordinate
:param t: time
:param R_0: radius of the sphere
:param inside_sphere: if `True`/`False` tests if `r` is inside/outside
"""
# Convert to numpy array if necessary
arr_r = np.asarray(r)
arr_theta = np.asarray(theta)
arr_t = np.asarray(t)
# Test radius
if inside_sphere:
cls._test_array(arr_r, low=0, high=R_0)
else:
cls._test_array(arr_r, low=R_0)
# Test theta
cls._test_array(arr_theta, 0, pi)
return arr_r, arr_theta, arr_t
if __name__ == "__main__":
pass