source: sasmodels/sasmodels/models/lib/j1_cephes.c @ 094e320

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 094e320 was e2af2a9, checked in by wojciech, 8 years ago

Documentation clean up in Bessel function

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*                                                      j1.c
2 *
3 *      Bessel function of order one
4 *
5 *
6 *
7 * SYNOPSIS:
8 *
9 * double x, y, j1();
10 *
11 * y = j1( x );
12 *
13 *
14 *
15 * DESCRIPTION:
16 *
17 * Returns Bessel function of order one of the argument.
18 *
19 * The domain is divided into the intervals [0, 8] and
20 * (8, infinity). In the first interval a 24 term Chebyshev
21 * expansion is used. In the second, the asymptotic
22 * trigonometric representation is employed using two
23 * rational functions of degree 5/5.
24 *
25 *
26 *
27 * ACCURACY:
28 *
29 *                      Absolute error:
30 * arithmetic   domain      # trials      peak         rms
31 *    DEC       0, 30       10000       4.0e-17     1.1e-17
32 *    IEEE      0, 30       30000       2.6e-16     1.1e-16
33 *
34 *
35 */
36
37/*
38Cephes Math Library Release 2.8:  June, 2000
39Copyright 1984, 1987, 1989, 2000 by Stephen L. Moshier
40*/
41double j1(double );
42
43double j1(double x) {
44
45//Cephes double pression function
46#if FLOAT_SIZE>4
47
48    double w, z, p, q, xn;
49
50    const double DR1 = 5.78318596294678452118E0;
51    const double DR2 = 3.04712623436620863991E1;
52    const double Z1 = 1.46819706421238932572E1;
53    const double Z2 = 4.92184563216946036703E1;
54    const double THPIO4 =  2.35619449019234492885;
55    const double SQ2OPI = 0.79788456080286535588;
56
57    double RP[8] = {
58    -8.99971225705559398224E8,
59    4.52228297998194034323E11,
60    -7.27494245221818276015E13,
61    3.68295732863852883286E15,
62    0.0,
63    0.0,
64    0.0,
65    0.0
66    };
67
68    double RQ[8] = {
69    /* 1.00000000000000000000E0,*/
70    6.20836478118054335476E2,
71    2.56987256757748830383E5,
72    8.35146791431949253037E7,
73    2.21511595479792499675E10,
74    4.74914122079991414898E12,
75    7.84369607876235854894E14,
76    8.95222336184627338078E16,
77    5.32278620332680085395E18,
78    };
79
80    double PP[8] = {
81    7.62125616208173112003E-4,
82    7.31397056940917570436E-2,
83    1.12719608129684925192E0,
84    5.11207951146807644818E0,
85    8.42404590141772420927E0,
86    5.21451598682361504063E0,
87    1.00000000000000000254E0,
88    0.0,
89    };
90    double PQ[8] = {
91    5.71323128072548699714E-4,
92    6.88455908754495404082E-2,
93    1.10514232634061696926E0,
94    5.07386386128601488557E0,
95    8.39985554327604159757E0,
96    5.20982848682361821619E0,
97    9.99999999999999997461E-1,
98    0.0,
99    };
100
101    double QP[8] = {
102    5.10862594750176621635E-2,
103    4.98213872951233449420E0,
104    7.58238284132545283818E1,
105    3.66779609360150777800E2,
106    7.10856304998926107277E2,
107    5.97489612400613639965E2,
108    2.11688757100572135698E2,
109    2.52070205858023719784E1,
110    };
111
112    double QQ[8] = {
113    /* 1.00000000000000000000E0,*/
114    7.42373277035675149943E1,
115    1.05644886038262816351E3,
116    4.98641058337653607651E3,
117    9.56231892404756170795E3,
118    7.99704160447350683650E3,
119    2.82619278517639096600E3,
120    3.36093607810698293419E2,
121    0.0,
122    };
123
124    w = x;
125    if( x < 0 )
126            w = -x;
127
128    if( w <= 5.0 )
129        {
130            z = x * x;
131            w = polevl( z, RP, 3 ) / p1evl( z, RQ, 8 );
132            w = w * x * (z - Z1) * (z - Z2);
133            return( w );
134        }
135
136    w = 5.0/x;
137    z = w * w;
138    p = polevl( z, PP, 6)/polevl( z, PQ, 6 );
139    q = polevl( z, QP, 7)/p1evl( z, QQ, 7 );
140    xn = x - THPIO4;
141
142    double sn, cn;
143    SINCOS(xn, sn, cn);
144    p = p * cn - w * q * sn;
145
146    return( p * SQ2OPI / sqrt(x) );
147
148
149//Single precission version of cephes
150#else
151    double xx, w, z, p, q, xn;
152
153    const double Z1 = 1.46819706421238932572E1;
154    const double THPIO4F =  2.35619449019234492885;    /* 3*pi/4 */
155
156
157    double JP[8] = {
158        -4.878788132172128E-009,
159        6.009061827883699E-007,
160        -4.541343896997497E-005,
161        1.937383947804541E-003,
162        -3.405537384615824E-002,
163        0.0,
164        0.0,
165        0.0
166    };
167
168    double MO1[8] = {
169        6.913942741265801E-002,
170        -2.284801500053359E-001,
171        3.138238455499697E-001,
172        -2.102302420403875E-001,
173        5.435364690523026E-003,
174        1.493389585089498E-001,
175        4.976029650847191E-006,
176        7.978845453073848E-001
177    };
178
179    double PH1[8] = {
180        -4.497014141919556E+001,
181        5.073465654089319E+001,
182        -2.485774108720340E+001,
183        7.222973196770240E+000,
184        -1.544842782180211E+000,
185        3.503787691653334E-001,
186        -1.637986776941202E-001,
187        3.749989509080821E-001
188    };
189
190    xx = x;
191    if( xx < 0 )
192            xx = -x;
193
194    if( xx <= 2.0 )
195        {
196            z = xx * xx;
197            p = (z-Z1) * xx * polevl( z, JP, 4 );
198            return( p );
199        }
200
201    q = 1.0/x;
202    w = sqrt(q);
203
204    p = w * polevl( q, MO1, 7);
205    w = q*q;
206    xn = q * polevl( w, PH1, 7) - THPIO4F;
207    p = p * cos(xn + xx);
208
209    return(p);
210#endif
211}
212
Note: See TracBrowser for help on using the repository browser.