source: sasmodels/sasmodels/models/linear_pearls.c @ cf85329

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

add sinc() function to kernel template

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