Source code for irfpy.util.kappa

''' Kappa distribution.

.. codeauthor:: Yoshifumi Futaana
'''
from irfpy.util import constant as k

import numpy as np
from scipy.special import gamma

[docs]class kappa_distribution: r''' Kappa distribution expressed by .. math:: f_i^\kappa(r,v) = \frac{n_i}{2\pi(\kappa w_{\kappa i}^2)^{3/2}} \frac{\Gamma(\kappa+1)}{\Gamma(\kappa-1/2)\Gamma(3/2)} (1+\frac{v^2}{\kappa w_{\kappa i}^2})^{-(\kappa+1)} Here :math:`w_{\kappa i}^2=(2\kappa-3)kT_i/\kappa mi` In this class, use of MKSA unit system is implicitly assumed. >>> fk2 = kappa_distribution(2) # Returned is the function. f(v, k=2) >>> fk2_at0 = fk2(0) # f(0, k=2) is returned. .. warning:: Not yet fully tested. .. todo:: Validate the formulation. ''' def __init__(self, kappa, ni=1, Ti=11604., mi=k.m_proton): if kappa <= 1.5: raise ValueError('Given kappa={} not acceptable (>1.5)'.format(kappa)) self.kappa = kappa self.wki2 = (2.0 - 3.0 / kappa) * k.kB * Ti / mi # print(self.wki2) t1 = ni / (2 * np.pi * np.power(kappa * self.wki2, 1.5)) t2 = gamma(kappa + 1) / gamma(kappa - 0.5) / gamma(1.5) self.coeff = t1 * t2 def __call__(self, xarr): kappa = self.kappa t3 = np.power((1 + xarr ** 2 / (kappa * self.wki2)), -kappa - 1) return self.coeff * t3
import unittest import doctest
[docs]def doctests(): return unittest.TestSuite(( doctest.DocTestSuite(), ))
if __name__ == '__main__': unittest.main(defaultTest='doctests')