Source code for osaft.solutions.basedoinikov1994.scattering
from __future__ import annotations
from abc import ABC, abstractmethod
from osaft.core.functions import BesselFunctions as Bf
from osaft.solutions.base_scattering import BaseScattering
[docs]class BaseScatteringDoinikov1994(BaseScattering, ABC):
"""Base scattering class for Doinikov solutions from 1994
:param N_max: Highest order mode included in the computation [-]
"""
def __init__(self, N_max: int) -> None:
""" "init method"""
super().__init__(N_max)
[docs] def potential_coefficient(self, n: int) -> complex:
return self.alpha_n(n) * self.field.A_in(n)
# -------------------------------------------------------------------------
# Velocity amplitudes
# -------------------------------------------------------------------------
[docs] def V_r_sc(self, n: int, r: float) -> complex:
"""Radial scattering field velocity term of mode `n`
without Legendre coefficients
Returns radial scattering field velocity in [m/s]
:param n: mode
:param r: radial coordinate [m]
"""
out = self.k_f * self.alpha_n(n) * Bf.d1_hankelh1(n, r * self.k_f)
out -= n * (n + 1) / r * self.beta_n(n) * Bf.hankelh1(n, r * self.k_v)
out *= self.A_in(n)
return out
[docs] def V_theta_sc(self, n: int, r: float) -> complex:
"""Tangential scattering field velocity term of mode n
without Legendre coefficients
Returns tangential scattering field velocity in [m/s]
:param n: mode
:param r: radial coordinate [m]
"""
arg = self.k_v * r
out = Bf.hankelh1(n, arg)
out += arg * Bf.d1_hankelh1(n, arg)
out *= -self.beta_n(n)
out += self.alpha_n(n) * Bf.hankelh1(n, self.k_f * r)
out *= self.A_in(n)
return out / r
# -------------------------------------------------------------------------
# Abstract methods
# -------------------------------------------------------------------------
@property
@abstractmethod
def k_f(self) -> complex:
"""Returns the wave number in the fluid :math:`k_f` [1/m]"""
pass
@property
@abstractmethod
def k_v(self) -> complex:
"""Returns the viscous wave number in the fluid :math:`k_v` [1/m]"""
pass
[docs] @abstractmethod
def alpha_n(self, n: int) -> complex:
""":math:`\\alpha_n` coefficient
:param n: mode
"""
pass
[docs] @abstractmethod
def beta_n(self, n: int) -> complex:
""":math:`\\beta_n` coefficient
:param n: mode
"""
pass
if __name__ == "__main__":
pass