Changeset 6e7ba14 in sasmodels for sasmodels/models


Ignore:
Timestamp:
Aug 20, 2018 8:52:21 AM (6 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
aa44a6a
Parents:
bad3093
Message:

allow for different forms of effective_radius

Location:
sasmodels/models
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/models/ellipsoid.c

    r71b751d r6e7ba14  
    44    return M_4PI_3*radius_polar*radius_equatorial*radius_equatorial; 
    55} 
     6 
     7 
     8static double 
     9radius_from_volume(double radius_polar, double radius_equatorial) 
     10{ 
     11    return cbrt(radius_polar*radius_equatorial*radius_equatorial); 
     12} 
     13 
     14static double 
     15radius_from_curvature(double radius_polar, double radius_equatorial) 
     16{ 
     17    // Trivial cases 
     18    if (radius_polar == radius_equatorial) return radius_polar; 
     19    if (radius_polar * radius_equatorial == 0.)  return 0.; 
     20 
     21    // see equation (26) in A.Isihara, J.Chem.Phys. 18(1950)1446-1449 
     22    const double ratio = (radius_polar < radius_equatorial  
     23                          ? radius_polar / radius_equatorial 
     24                          : radius_equatorial / radius_polar); 
     25    const double e1 = sqrt(1.0 - ratio*ratio); 
     26    const double b1 = 1.0 + asin(e1) / (e1 * ratio); 
     27    const double bL = (1.0 + e1) / (1.0 - e1); 
     28    const double b2 = 1.0 + 0.5 * ratio * ratio / e1 * log(bL); 
     29    const double delta = 0.75 * b1 * b2; 
     30    const double ddd = 2.0 * (delta + 1.0) * radius_polar * radius_equatorial * radius_equatorial; 
     31    return 0.5 * cbrt(ddd); 
     32} 
     33 
     34static double 
     35effective_radius(int mode, double radius_polar, double radius_equatorial) 
     36{ 
     37    if (mode == 1) { 
     38        return radius_from_curvature(radius_polar, radius_equatorial); 
     39    } else if (mode == 2) { 
     40        return radius_from_volume(radius_polar, radius_equatorial); 
     41    } else if (mode == 3) { 
     42        return (radius_polar < radius_equatorial ? radius_polar : radius_equatorial); 
     43    } else { 
     44        return (radius_polar > radius_equatorial ? radius_polar : radius_equatorial); 
     45    } 
     46} 
     47 
    648 
    749static void 
  • sasmodels/models/ellipsoid.py

    r71b751d r6e7ba14  
    164164source = ["lib/sas_3j1x_x.c", "lib/gauss76.c", "ellipsoid.c"] 
    165165have_Fq = True 
    166  
    167 def ER(radius_polar, radius_equatorial): 
    168     # see equation (26) in A.Isihara, J.Chem.Phys. 18(1950)1446-1449 
    169     ee = np.empty_like(radius_polar) 
    170     idx = radius_polar > radius_equatorial 
    171     ee[idx] = (radius_polar[idx] ** 2 - radius_equatorial[idx] ** 2) / radius_polar[idx] ** 2 
    172     idx = radius_polar < radius_equatorial 
    173     ee[idx] = (radius_equatorial[idx] ** 2 - radius_polar[idx] ** 2) / radius_equatorial[idx] ** 2 
    174     idx = radius_polar == radius_equatorial 
    175     ee[idx] = 2 * radius_polar[idx] 
    176     valid = (radius_polar * radius_equatorial != 0) 
    177     bd = 1.0 - ee[valid] 
    178     e1 = np.sqrt(ee[valid]) 
    179     b1 = 1.0 + np.arcsin(e1) / (e1 * np.sqrt(bd)) 
    180     bL = (1.0 + e1) / (1.0 - e1) 
    181     b2 = 1.0 + bd / 2 / e1 * np.log(bL) 
    182     delta = 0.75 * b1 * b2 
    183  
    184     ddd = np.zeros_like(radius_polar) 
    185     ddd[valid] = 2.0 * (delta + 1.0) * radius_polar * radius_equatorial ** 2 
    186     return 0.5 * ddd ** (1.0 / 3.0) 
     166effective_radius_type = ["average curvature", "equivalent sphere", "min radius", "max radius"] 
    187167 
    188168def random(): 
Note: See TracChangeset for help on using the changeset viewer.