Blame specfunc/bessel_amp_phase.c

Packit 67cb25
/* specfunc/bessel_amp_phase.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
/* Author:  G. Jungman */
Packit 67cb25
Packit 67cb25
#include <config.h>
Packit 67cb25
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_errno.h>
Packit 67cb25
#include <gsl/gsl_sf_bessel.h>
Packit 67cb25
#include "bessel_amp_phase.h"
Packit 67cb25
Packit 67cb25
/* chebyshev expansions for amplitude and phase
Packit 67cb25
   functions used in bessel evaluations
Packit 67cb25
Packit 67cb25
   These are the same for J0,Y0 and for J1,Y1, so
Packit 67cb25
   they sit outside those functions.
Packit 67cb25
*/
Packit 67cb25
        
Packit 67cb25
static double bm0_data[21] = {
Packit 67cb25
   0.09284961637381644,
Packit 67cb25
  -0.00142987707403484,
Packit 67cb25
   0.00002830579271257,
Packit 67cb25
  -0.00000143300611424,
Packit 67cb25
   0.00000012028628046,
Packit 67cb25
  -0.00000001397113013,
Packit 67cb25
   0.00000000204076188,
Packit 67cb25
  -0.00000000035399669,
Packit 67cb25
   0.00000000007024759,
Packit 67cb25
  -0.00000000001554107,
Packit 67cb25
   0.00000000000376226,
Packit 67cb25
  -0.00000000000098282,
Packit 67cb25
   0.00000000000027408,
Packit 67cb25
  -0.00000000000008091,
Packit 67cb25
   0.00000000000002511,
Packit 67cb25
  -0.00000000000000814,
Packit 67cb25
   0.00000000000000275,
Packit 67cb25
  -0.00000000000000096,
Packit 67cb25
   0.00000000000000034,
Packit 67cb25
  -0.00000000000000012,
Packit 67cb25
   0.00000000000000004
Packit 67cb25
}; 
Packit 67cb25
const cheb_series _gsl_sf_bessel_amp_phase_bm0_cs = {
Packit 67cb25
  bm0_data,
Packit 67cb25
  20,
Packit 67cb25
  -1, 1,
Packit 67cb25
  10
Packit 67cb25
};
Packit 67cb25
      
Packit 67cb25
static double bth0_data[24] = {
Packit 67cb25
  -0.24639163774300119,
Packit 67cb25
   0.001737098307508963,
Packit 67cb25
  -0.000062183633402968,
Packit 67cb25
   0.000004368050165742,
Packit 67cb25
  -0.000000456093019869,
Packit 67cb25
   0.000000062197400101,
Packit 67cb25
  -0.000000010300442889,
Packit 67cb25
   0.000000001979526776,
Packit 67cb25
  -0.000000000428198396,
Packit 67cb25
   0.000000000102035840,
Packit 67cb25
  -0.000000000026363898,
Packit 67cb25
   0.000000000007297935,
Packit 67cb25
  -0.000000000002144188,
Packit 67cb25
   0.000000000000663693,
Packit 67cb25
  -0.000000000000215126,
Packit 67cb25
   0.000000000000072659,
Packit 67cb25
  -0.000000000000025465,
Packit 67cb25
   0.000000000000009229,
Packit 67cb25
  -0.000000000000003448,
Packit 67cb25
   0.000000000000001325,
Packit 67cb25
  -0.000000000000000522,
Packit 67cb25
   0.000000000000000210,
Packit 67cb25
  -0.000000000000000087,
Packit 67cb25
   0.000000000000000036
Packit 67cb25
};
Packit 67cb25
const cheb_series _gsl_sf_bessel_amp_phase_bth0_cs = {
Packit 67cb25
  bth0_data,
Packit 67cb25
  23,
Packit 67cb25
  -1, 1,
Packit 67cb25
  12
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
static double bm1_data[21] = {
Packit 67cb25
   0.1047362510931285, 
Packit 67cb25
   0.00442443893702345,
Packit 67cb25
  -0.00005661639504035,
Packit 67cb25
   0.00000231349417339,
Packit 67cb25
  -0.00000017377182007,
Packit 67cb25
   0.00000001893209930,
Packit 67cb25
  -0.00000000265416023,
Packit 67cb25
   0.00000000044740209,
Packit 67cb25
  -0.00000000008691795,
Packit 67cb25
   0.00000000001891492,
Packit 67cb25
  -0.00000000000451884,
Packit 67cb25
   0.00000000000116765,
Packit 67cb25
  -0.00000000000032265,
Packit 67cb25
   0.00000000000009450,
Packit 67cb25
  -0.00000000000002913,
Packit 67cb25
   0.00000000000000939,
Packit 67cb25
  -0.00000000000000315,
Packit 67cb25
   0.00000000000000109,
Packit 67cb25
  -0.00000000000000039,
Packit 67cb25
   0.00000000000000014,
Packit 67cb25
  -0.00000000000000005,
Packit 67cb25
}; 
Packit 67cb25
const cheb_series _gsl_sf_bessel_amp_phase_bm1_cs = {
Packit 67cb25
  bm1_data,
Packit 67cb25
  20,
Packit 67cb25
  -1, 1,
Packit 67cb25
  10
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
static double bth1_data[24] = {
Packit 67cb25
   0.74060141026313850, 
Packit 67cb25
  -0.004571755659637690,
Packit 67cb25
   0.000119818510964326,
Packit 67cb25
  -0.000006964561891648,
Packit 67cb25
   0.000000655495621447,
Packit 67cb25
  -0.000000084066228945,
Packit 67cb25
   0.000000013376886564,
Packit 67cb25
  -0.000000002499565654,
Packit 67cb25
   0.000000000529495100,
Packit 67cb25
  -0.000000000124135944,
Packit 67cb25
   0.000000000031656485,
Packit 67cb25
  -0.000000000008668640,
Packit 67cb25
   0.000000000002523758,
Packit 67cb25
  -0.000000000000775085,
Packit 67cb25
   0.000000000000249527,
Packit 67cb25
  -0.000000000000083773,
Packit 67cb25
   0.000000000000029205,
Packit 67cb25
  -0.000000000000010534,
Packit 67cb25
   0.000000000000003919,
Packit 67cb25
  -0.000000000000001500,
Packit 67cb25
   0.000000000000000589,
Packit 67cb25
  -0.000000000000000237,
Packit 67cb25
   0.000000000000000097,
Packit 67cb25
  -0.000000000000000040,
Packit 67cb25
};
Packit 67cb25
const cheb_series _gsl_sf_bessel_amp_phase_bth1_cs = {
Packit 67cb25
  bth1_data,
Packit 67cb25
  23,
Packit 67cb25
  -1, 1,
Packit 67cb25
  12
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_bessel_asymp_Mnu_e(const double nu, const double x, double * result)
Packit 67cb25
{
Packit 67cb25
  const double r  = 2.0*nu/x;
Packit 67cb25
  const double r2 = r*r;
Packit 67cb25
  const double x2 = x*x;
Packit 67cb25
  const double term1 = (r2-1.0/x2)/8.0;
Packit 67cb25
  const double term2 = (r2-1.0/x2)*(r2-9.0/x2)*3.0/128.0;
Packit 67cb25
  const double Mnu2_c = 2.0/(M_PI) * (1.0 + term1 + term2);
Packit 67cb25
  *result = sqrt(Mnu2_c)/sqrt(x); /* will never underflow this way */
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sf_bessel_asymp_thetanu_corr_e(const double nu, const double x, double * result)
Packit 67cb25
{
Packit 67cb25
  const double r  = 2.0*nu/x;
Packit 67cb25
  const double r2 = r*r;
Packit 67cb25
  const double x2 = x*x;
Packit 67cb25
  const double term1 = x*(r2 - 1.0/x2)/8.0;
Packit 67cb25
  const double term2 = x*(r2 - 1.0/x2)*(r2 - 25.0/x2)/384.0;
Packit 67cb25
  *result = (-0.25*M_PI + term1 + term2);
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}