source: sasmodels/sasmodels/models/linear_pearls.c @ 58c3367

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 58c3367 was 2c74c11, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

implicit Iqxy; fix divide by 0 for q=0

  • Property mode set to 100644
File size: 2.2 KB
Line 
1double form_volume(double radius, double num_pearls);
2
3double Iq(double q,
4            double radius,
5            double edge_sep,
6            double num_pearls,
7            double pearl_sld,
8            double solvent_sld);
9
10double linear_pearls_kernel(double q,
11            double radius,
12            double edge_sep,
13            double num_pearls,
14            double pearl_sld,
15            double solvent_sld);
16
17
18double form_volume(double radius, double num_pearls)
19{
20    // Pearl volume
21    double pearl_vol = 4.0 /3.0 * M_PI * pow(radius, 3.0);
22    // Return total volume
23    return num_pearls * pearl_vol;;
24}
25
26double linear_pearls_kernel(double q,
27            double radius,
28            double edge_sep,
29            double num_pearls,
30            double pearl_sld,
31            double solvent_sld)
32{
33    double n_contrib;
34    //relative sld
35    double contrast_pearl = pearl_sld - solvent_sld;
36    //each volume
37    double pearl_vol = 4.0 /3.0 * M_PI * pow(radius, 3.0);
38    //total volume
39    double tot_vol = num_pearls * pearl_vol;
40    //mass
41    double m_s = contrast_pearl * pearl_vol;
42    //center to center distance between the neighboring pearls
43    double separation = edge_sep + 2.0 * radius;
44
45    double x=q*radius;
46
47    // Try Taylor on x*xos(x)
48        // double out_cos = x - pow(x,3)/2 + pow(x,5)/24 - pow(x,7)/720 + pow(x,9)/40320;
49    // psi -= x*out_cos;
50
51    //sine functions of a pearl
52    double psi = sin(q * radius);
53    psi -= x * cos(x);
54    psi /= pow((q * radius), 3.0);
55
56    // N pearls contribution
57    int n_max = num_pearls - 1;
58    n_contrib = num_pearls;
59    for(int num=1; num<=n_max; num++) {
60        n_contrib += (2.0*(num_pearls-num)*sinc(q*separation*num));
61    }
62    // form factor for num_pearls
63    double form_factor = n_contrib;
64    form_factor *= pow((m_s*psi*3.0), 2.0);
65    form_factor /= (tot_vol * 1.0e4);
66
67    return form_factor;
68}
69
70double Iq(double q,
71            double radius,
72            double edge_sep,
73            double num_pearls,
74            double pearl_sld,
75            double solvent_sld)
76{
77
78        double result = linear_pearls_kernel(q,
79                    radius,
80                    edge_sep,
81                    num_pearls,
82                    pearl_sld,
83                    solvent_sld);
84
85        return result;
86}
Note: See TracBrowser for help on using the repository browser.