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


Ignore:
Timestamp:
Apr 17, 2017 4: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/fcc_paracrystal.c

    r2a0b2b1 r7e0b281  
    11static double 
    2 _sq_fcc(double qa, double qb, double qc, double dnn, double d_factor) 
     2fcc_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 = qb + qa; 
    7     const double a2 = qa + qc; 
    8     const double a3 = qb + qc; 
    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)/2.0; 
     6    const double a2 = (-qa + qc)/2.0; 
     7    const double a3 = (-qa + qb)/2.0; 
     8#else 
     9    const double a1 = ( qa + qb)/2.0; 
     10    const double a2 = ( qa + qc)/2.0; 
     11    const double a3 = ( qb + qc)/2.0; 
     12#endif 
    1213 
    1314    // Numerator: (1 - exp(a)^2)^3 
    1415    //         => (-(exp(2a) - 1))^3 
    1516    //         => -expm1(2a)^3 
    16     // Denominator: prod(1 - 2 cos(xk) exp(a) + exp(a)^2) 
    17     //         => exp(a)^2 - 2 cos(xk) exp(a) + 1 
    18     //         => (exp(a) - 2 cos(xk)) * exp(a) + 1 
    19     const double exp_arg = exp(-arg); 
    20     const double Sq = -cube(expm1(-2.0*arg)) 
    21         / ( ((exp_arg - 2.0*cos(half_dnn*a1))*exp_arg + 1.0) 
    22           * ((exp_arg - 2.0*cos(half_dnn*a2))*exp_arg + 1.0) 
    23           * ((exp_arg - 2.0*cos(half_dnn*a3))*exp_arg + 1.0)); 
     17    // Denominator: prod(1 - 2 cos(d ak) exp(a) + exp(2a)) 
     18    //         => prod(exp(a)^2 - 2 cos(d ak) exp(a) + 1) 
     19    //         => prod((exp(a) - 2 cos(d ak)) * exp(a) + 1) 
     20    const double arg = -0.5*square(dnn*d_factor)*(a1*a1 + a2*a2 + a3*a3); 
     21    const double exp_arg = exp(arg); 
     22    const double Zq = -cube(expm1(2.0*arg)) 
     23        / ( ((exp_arg - 2.0*cos(dnn*a1))*exp_arg + 1.0) 
     24          * ((exp_arg - 2.0*cos(dnn*a2))*exp_arg + 1.0) 
     25          * ((exp_arg - 2.0*cos(dnn*a3))*exp_arg + 1.0)); 
    2426 
    25     return Sq; 
     27    return Zq; 
    2628} 
    2729 
     
    2931// occupied volume fraction calculated from lattice symmetry and sphere radius 
    3032static double 
    31 _fcc_volume_fraction(double radius, double dnn) 
     33fcc_volume_fraction(double radius, double dnn) 
    3234{ 
    3335    return 4.0*sphere_volume(M_SQRT1_2*radius/dnn); 
     
    6668            const double qa = qab*cos_phi; 
    6769            const double qb = qab*sin_phi; 
    68             const double fq = _sq_fcc(qa, qb, qc, dnn, d_factor); 
    69             inner_sum += Gauss150Wt[j] * fq; 
     70            const double form = fcc_Zq(qa, qb, qc, dnn, d_factor); 
     71            inner_sum += Gauss150Wt[j] * form; 
    7072        } 
    7173        inner_sum *= phi_m;  // sum(f(x)dx) = sum(f(x)) dx 
     
    7375    } 
    7476    outer_sum *= theta_m; 
    75     const double Sq = outer_sum/(4.0*M_PI); 
     77    const double Zq = outer_sum/(4.0*M_PI); 
    7678    const double Pq = sphere_form(q, radius, sld, solvent_sld); 
    7779 
    78     return _fcc_volume_fraction(radius, dnn) * Pq * Sq; 
     80    return fcc_volume_fraction(radius, dnn) * Pq * Zq; 
    7981} 
    8082 
     
    9395    q = sqrt(qa*qa + qb*qb + qc*qc); 
    9496    const double Pq = sphere_form(q, radius, sld, solvent_sld); 
    95     const double Sq = _sq_fcc(qa, qb, qc, dnn, d_factor); 
    96     return _fcc_volume_fraction(radius, dnn) * Pq * Sq; 
     97    const double Zq = fcc_Zq(qa, qb, qc, dnn, d_factor); 
     98    return fcc_volume_fraction(radius, dnn) * Pq * Zq; 
    9799} 
Note: See TracChangeset for help on using the changeset viewer.