Changeset 7e0b281 in sasmodels for sasmodels/models/sc_paracrystal.c


Ignore:
Timestamp:
Apr 17, 2017 6:34:52 PM (7 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:
64ca163
Parents:
cb038a2
Message:

adjust paracrystal equations to better match terminology in Matsuoka paper

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/models/sc_paracrystal.c

    r2a0b2b1 r7e0b281  
    11static double 
    2 _sq_sc(double qa, double qb, double qc, double dnn, double d_factor) 
     2sc_Zq(double qa, double qb, double qc, double dnn, double d_factor) 
    33{ 
    4     // Rewriting equations for efficiency, accuracy and readability, and so 
    5     // code is reusable between 1D and 2D models. 
    64    const double a1 = qa; 
    75    const double a2 = qb; 
    86    const double a3 = qc; 
    97 
    10     const double arg = 0.5*square(dnn*d_factor)*(a1*a1 + a2*a2 + a3*a3); 
    11  
    128    // Numerator: (1 - exp(a)^2)^3 
    139    //         => (-(exp(2a) - 1))^3 
    1410    //         => -expm1(2a)^3 
    15     // Denominator: prod(1 - 2 cos(xk) exp(a) + exp(a)^2) 
    16     //         => exp(a)^2 - 2 cos(xk) exp(a) + 1 
    17     //         => (exp(a) - 2 cos(xk)) * exp(a) + 1 
    18     const double exp_arg = exp(-arg); 
    19     const double Sq = -cube(expm1(-2.0*arg)) 
     11    // Denominator: prod(1 - 2 cos(d ak) exp(a) + exp(2a)) 
     12    //         => prod(exp(a)^2 - 2 cos(d ak) exp(a) + 1) 
     13    //         => prod((exp(a) - 2 cos(d ak)) * exp(a) + 1) 
     14    const double arg = -0.5*square(dnn*d_factor)*(a1*a1 + a2*a2 + a3*a3); 
     15    const double exp_arg = exp(arg); 
     16    const double Zq = -cube(expm1(2.0*arg)) 
    2017        / ( ((exp_arg - 2.0*cos(dnn*a1))*exp_arg + 1.0) 
    2118          * ((exp_arg - 2.0*cos(dnn*a2))*exp_arg + 1.0) 
    2219          * ((exp_arg - 2.0*cos(dnn*a3))*exp_arg + 1.0)); 
    2320 
    24     return Sq; 
     21    return Zq; 
    2522} 
    2623 
    2724// occupied volume fraction calculated from lattice symmetry and sphere radius 
    2825static double 
    29 _sc_volume_fraction(double radius, double dnn) 
     26sc_volume_fraction(double radius, double dnn) 
    3027{ 
    3128    return sphere_volume(radius/dnn); 
     
    6562            const double qa = qab*cos_phi; 
    6663            const double qb = qab*sin_phi; 
    67             const double fq = _sq_sc(qa, qb, qc, dnn, d_factor); 
    68             inner_sum += Gauss150Wt[j] * fq; 
     64            const double form = sc_Zq(qa, qb, qc, dnn, d_factor); 
     65            inner_sum += Gauss150Wt[j] * form; 
    6966        } 
    7067        inner_sum *= phi_m;  // sum(f(x)dx) = sum(f(x)) dx 
     
    7269    } 
    7370    outer_sum *= theta_m; 
    74     const double Sq = outer_sum/M_PI_2; 
     71    const double Zq = outer_sum/M_PI_2; 
    7572    const double Pq = sphere_form(q, radius, sld, solvent_sld); 
    7673 
    77     return _sc_volume_fraction(radius, dnn) * Pq * Sq; 
     74    return sc_volume_fraction(radius, dnn) * Pq * Zq; 
    7875} 
    7976 
     
    9289    q = sqrt(qa*qa + qb*qb + qc*qc); 
    9390    const double Pq = sphere_form(q, radius, sld, solvent_sld); 
    94     const double Sq = _sq_sc(qa, qb, qc, dnn, d_factor); 
    95     return _sc_volume_fraction(radius, dnn) * Pq * Sq; 
     91    const double Zq = sc_Zq(qa, qb, qc, dnn, d_factor); 
     92    return sc_volume_fraction(radius, dnn) * Pq * Zq; 
    9693} 
Note: See TracChangeset for help on using the changeset viewer.