Changeset 7e0b281 in sasmodels for sasmodels/models/bcc_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/bcc_paracrystal.c

    r2a0b2b1 r7e0b281  
    11static double 
    2 _sq_bcc(double qa, double qb, double qc, double dnn, double d_factor) 
     2bcc_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. 
    6     const double a1 = +qa - qc + qb; 
    7     const double a2 = +qa + qc - qb; 
    8     const double a3 = -qa + qc + qb; 
    9  
    10     const double half_dnn = 0.5*dnn; 
    11     const double arg = 0.5*square(half_dnn*d_factor)*(a1*a1 + a2*a2 + a3*a3); 
     4#if 0  // Equations as written in Matsuoka 
     5    const double a1 = (+qa + qb + qc)/2.0; 
     6    const double a2 = (-qa - qb + qc)/2.0; 
     7    const double a3 = (-qa + qb - qc)/2.0; 
     8#else 
     9    const double a1 = (+qa + qb - qc)/2.0; 
     10    const double a2 = (+qa - qb + qc)/2.0; 
     11    const double a3 = (-qa + qb + qc)/2.0; 
     12#endif 
    1213 
    1314#if 1 
     
    1516    //         => (-(exp(2a) - 1))^3 
    1617    //         => -expm1(2a)^3 
    17     // Denominator: prod(1 - 2 cos(xk) exp(a) + exp(a)^2) 
    18     //         => exp(a)^2 - 2 cos(xk) exp(a) + 1 
    19     //         => (exp(a) - 2 cos(xk)) * exp(a) + 1 
    20     const double exp_arg = exp(-arg); 
    21     const double Sq = -cube(expm1(-2.0*arg)) 
    22         / ( ((exp_arg - 2.0*cos(half_dnn*a1))*exp_arg + 1.0) 
    23           * ((exp_arg - 2.0*cos(half_dnn*a2))*exp_arg + 1.0) 
    24           * ((exp_arg - 2.0*cos(half_dnn*a3))*exp_arg + 1.0)); 
     18    // Denominator: prod(1 - 2 cos(d ak) exp(a) + exp(2a)) 
     19    //         => prod(exp(a)^2 - 2 cos(d ak) exp(a) + 1) 
     20    //         => prod((exp(a) - 2 cos(d ak)) * exp(a) + 1) 
     21    const double arg = -0.5*square(dnn*d_factor)*(a1*a1 + a2*a2 + a3*a3); 
     22    const double exp_arg = exp(arg); 
     23    const double Zq = -cube(expm1(2.0*arg)) 
     24        / ( ((exp_arg - 2.0*cos(dnn*a1))*exp_arg + 1.0) 
     25          * ((exp_arg - 2.0*cos(dnn*a2))*exp_arg + 1.0) 
     26          * ((exp_arg - 2.0*cos(dnn*a3))*exp_arg + 1.0)); 
    2527#else 
    2628    // Alternate form, which perhaps is more approachable 
     29    const double arg = -0.5*square(dnn*d_factor)*(a1*a1 + a2*a2 + a3*a3); 
    2730    const double sinh_qd = sinh(arg); 
    2831    const double cosh_qd = cosh(arg); 
    29     const double Sq = sinh_qd/(cosh_qd - cos(half_dnn*a1)) 
    30                     * sinh_qd/(cosh_qd - cos(half_dnn*a2)) 
    31                     * sinh_qd/(cosh_qd - cos(half_dnn*a3)); 
     32    const double Zq = sinh_qd/(cosh_qd - cos(dnn*a1)) 
     33                    * sinh_qd/(cosh_qd - cos(dnn*a2)) 
     34                    * sinh_qd/(cosh_qd - cos(dnn*a3)); 
    3235#endif 
    3336 
    34     return Sq; 
     37    return Zq; 
    3538} 
    3639 
     
    3841// occupied volume fraction calculated from lattice symmetry and sphere radius 
    3942static double 
    40 _bcc_volume_fraction(double radius, double dnn) 
     43bcc_volume_fraction(double radius, double dnn) 
    4144{ 
    4245    return 2.0*sphere_volume(sqrt(0.75)*radius/dnn); 
     
    7578            const double qa = qab*cos_phi; 
    7679            const double qb = qab*sin_phi; 
    77             const double fq = _sq_bcc(qa, qb, qc, dnn, d_factor); 
    78             inner_sum += Gauss150Wt[j] * fq; 
     80            const double form = bcc_Zq(qa, qb, qc, dnn, d_factor); 
     81            inner_sum += Gauss150Wt[j] * form; 
    7982        } 
    8083        inner_sum *= phi_m;  // sum(f(x)dx) = sum(f(x)) dx 
     
    8285    } 
    8386    outer_sum *= theta_m; 
    84     const double Sq = outer_sum/(4.0*M_PI); 
     87    const double Zq = outer_sum/(4.0*M_PI); 
    8588    const double Pq = sphere_form(q, radius, sld, solvent_sld); 
    86  
    87     return _bcc_volume_fraction(radius, dnn) * Pq * Sq; 
     89    return bcc_volume_fraction(radius, dnn) * Pq * Zq; 
    8890} 
    8991 
     
    101103 
    102104    q = sqrt(qa*qa + qb*qb + qc*qc); 
     105    const double Zq = bcc_Zq(qa, qb, qc, dnn, d_factor); 
    103106    const double Pq = sphere_form(q, radius, sld, solvent_sld); 
    104     const double Sq = _sq_bcc(qa, qb, qc, dnn, d_factor); 
    105     return _bcc_volume_fraction(radius, dnn) * Pq * Sq; 
     107    return bcc_volume_fraction(radius, dnn) * Pq * Zq; 
    106108} 
Note: See TracChangeset for help on using the changeset viewer.