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

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since d507c3a was 577912b, checked in by piotr, 8 years ago

converted LinearPearlsModel?

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