source: sasmodels/sasmodels/models/fractal.c @ 6d96b66

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 6d96b66 was 6d96b66, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

fractal models: handle limits of q=0 and dim=1

  • Property mode set to 100644
File size: 1.4 KB
Line 
1#define INVALID(p) (p.fractal_dim <= 0.0)
2
3static double
4Iq(double q,
5   double volfraction,
6   double radius,
7   double fractal_dim,
8   double cor_length,
9   double sld_block,
10   double sld_solvent)
11{
12    //calculate P(q) for the spherical subunits
13    const double pq = M_4PI_3*cube(radius) * square((sld_block-sld_solvent)*sph_j1c(q*radius));
14   
15    //calculate S(q),  using Teixeira, Eq(15)
16    double sq;
17    if (q > 0. && fractal_dim > 1.) {
18        // q>0, D>0
19        const double D = fractal_dim;
20        const double Dm1 = fractal_dim - 1.0;
21        // Note: for large Dm1, sin(Dm1*atan(q*cor_length) can go negative
22        const double t1 = D*sas_gamma(Dm1)*sin(Dm1*atan(q*cor_length));
23        const double t2 = pow(q*radius, -D);
24        const double t3 = pow(1.0 + 1.0/square(q*cor_length), -0.5*Dm1);
25        sq = 1.0 + t1 * t2 * t3;
26    } else if (q > 0.) {
27        // q>0, D=1
28        sq = 1.0 + atan(q*cor_length) / (q*radius);
29    } else if (fractal_dim > 1.) {
30        // q=0, D>1
31        const double D = fractal_dim;
32        sq = 1.0 + pow(cor_length/radius, D)*sas_gamma(D+1.0);
33    } else {
34        // q=0, D=1
35        sq = 1.0 + cor_length/radius;
36    }
37
38    // scale to units cm-1 sr-1 (assuming data on absolute scale)
39    //    convert I(1/A) to (1/cm)  => 1e8 * I(q)
40    //    convert rho^2 in 10^-6 1/A to 1/A  => 1e-12 * I(q)
41    //    combined: 1e-4 * I(q)
42
43    return 1.e-4 * volfraction * pq * sq;
44}
45
Note: See TracBrowser for help on using the repository browser.