Changeset 3f8584a2 in sasmodels for sasmodels/models/lib/sas_J0.c


Ignore:
Timestamp:
Jul 27, 2016 3:53:07 AM (8 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
c047acf
Parents:
56547a8
Message:

clean separation between float/double bessel functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/models/lib/sas_J0.c

    r0278e3f r3f8584a2  
    5353 * except YP, YQ which are designed for absolute error. */ 
    5454 
     55#if FLOAT_SIZE>4 
     56//Cephes double precission 
    5557 
    5658 constant double PPJ0[8] = { 
     
    144146  }; 
    145147 
    146  constant double MOJ0[8] = { 
     148double j0(double x); 
     149double j0(double x) 
     150{ 
     151    double w, z, p, q, xn; 
     152 
     153    //const double TWOOPI = 6.36619772367581343075535E-1; 
     154    const double SQ2OPI = 7.9788456080286535587989E-1; 
     155    const double PIO4 = 7.85398163397448309616E-1; 
     156 
     157    const double DR1 = 5.78318596294678452118E0; 
     158    const double DR2 = 3.04712623436620863991E1; 
     159 
     160 
     161    if( x < 0 ) 
     162        x = -x; 
     163 
     164    if( x <= 5.0 ) { 
     165        z = x * x; 
     166        if( x < 1.0e-5 ) 
     167            return( 1.0 - z/4.0 ); 
     168 
     169        p = (z - DR1) * (z - DR2); 
     170        p = p * polevl( z, RPJ0, 3)/p1evl( z, RQJ0, 8 ); 
     171        return( p ); 
     172    } 
     173 
     174    w = 5.0/x; 
     175    q = 25.0/(x*x); 
     176    p = polevl( q, PPJ0, 6)/polevl( q, PQJ0, 6 ); 
     177    q = polevl( q, QPJ0, 7)/p1evl( q, QQJ0, 7 ); 
     178    xn = x - PIO4; 
     179 
     180    double sn, cn; 
     181    SINCOS(xn, sn, cn); 
     182    p = p * cn - w * q * sn; 
     183 
     184    return( p * SQ2OPI / sqrt(x) ); 
     185} 
     186#else 
     187 
     188 constant float MOJ0[8] = { 
    147189        -6.838999669318810E-002, 
    148190        1.864949361379502E-001, 
     
    155197  }; 
    156198 
    157  constant double PHJ0[8] = { 
     199 constant float PHJ0[8] = { 
    158200        3.242077816988247E+001, 
    159201        -3.630592630518434E+001, 
     
    166208  }; 
    167209 
    168  constant double JPJ0[8] = { 
     210 constant float JPJ0[8] = { 
    169211        -6.068350350393235E-008, 
    170212        6.388945720783375E-006, 
     
    177219 }; 
    178220 
    179 double sas_J0(double x); 
    180 double sas_J0(double x) 
     221//Cephes single precission 
     222float j0f(float x); 
     223float j0f(float x) 
    181224{ 
    182  
    183 //Cephes single precission 
    184 #if FLOAT_SIZE>4 
    185     double w, z, p, q, xn; 
    186  
    187     //const double TWOOPI = 6.36619772367581343075535E-1; 
    188     const double SQ2OPI = 7.9788456080286535587989E-1; 
    189     const double PIO4 = 7.85398163397448309616E-1; 
    190  
    191     const double DR1 = 5.78318596294678452118E0; 
    192     const double DR2 = 3.04712623436620863991E1; 
    193  
    194  
    195     if( x < 0 ) 
    196             x = -x; 
    197  
    198     if( x <= 5.0 ) { 
    199             z = x * x; 
    200             if( x < 1.0e-5 ) 
    201                     return( 1.0 - z/4.0 ); 
    202  
    203             p = (z - DR1) * (z - DR2); 
    204             p = p * polevl( z, RPJ0, 3)/p1evl( z, RQJ0, 8 ); 
    205             return( p ); 
    206         } 
    207  
    208     w = 5.0/x; 
    209     q = 25.0/(x*x); 
    210     p = polevl( q, PPJ0, 6)/polevl( q, PQJ0, 6 ); 
    211     q = polevl( q, QPJ0, 7)/p1evl( q, QQJ0, 7 ); 
    212     xn = x - PIO4; 
    213  
    214     double sn, cn; 
    215     SINCOS(xn, sn, cn); 
    216     p = p * cn - w * q * sn; 
    217  
    218     return( p * SQ2OPI / sqrt(x) ); 
    219 //Cephes single precission 
    220 #else 
    221     double xx, w, z, p, q, xn; 
     225    float xx, w, z, p, q, xn; 
    222226 
    223227    //const double YZ1 =  0.43221455686510834878; 
    224228    //const double YZ2 = 22.401876406482861405; 
    225229    //const double YZ3 = 64.130620282338755553; 
    226     const double DR1 =  5.78318596294678452118; 
    227     const double PIO4F = 0.7853981633974483096; 
     230    const float DR1 =  5.78318596294678452118; 
     231    const float PIO4F = 0.7853981633974483096; 
    228232 
    229233    if( x < 0 ) 
    230             xx = -x; 
     234        xx = -x; 
    231235    else 
    232             xx = x; 
     236        xx = x; 
    233237 
    234238    if( x <= 2.0 ) { 
    235             z = xx * xx; 
    236             if( x < 1.0e-3 ) 
    237                     return( 1.0 - 0.25*z ); 
    238  
    239             p = (z-DR1) * polevl( z, JPJ0, 4); 
    240             return( p ); 
    241         } 
     239        z = xx * xx; 
     240        if( x < 1.0e-3 ) 
     241            return( 1.0 - 0.25*z ); 
     242 
     243        p = (z-DR1) * polevl( z, JPJ0, 4); 
     244        return( p ); 
     245    } 
    242246 
    243247    q = 1.0/x; 
     
    249253    p = p * cos(xn + xx); 
    250254    return(p); 
     255} 
    251256#endif 
    252257 
    253 } 
    254  
    255  
     258#if FLOAT_SIZE>4 
     259#define sas_J0 j0 
     260#else 
     261#define sas_J0 j0f 
     262#endif 
Note: See TracChangeset for help on using the changeset viewer.