Source code for osaft.core.helper

from collections.abc import Sequence
from enum import Enum
from numbers import Number
from typing import Optional, Union

import numpy as np

from osaft.core.functions import pi


[docs]class StringFormatter: """ Consistent Formatting for __str__ and __repr__ methods """
[docs] @staticmethod def get_str_text( description: str, variable: str, value: Union[float, int, str, Enum], unit: Optional[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: np.ndarray, low: Optional[float] = None, high: Optional[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: Union[Number, Sequence], theta: Union[Number, Sequence], t: Union[Number, Sequence], R_0: Union[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