source: sasmodels/sasmodels/models/multi_shell.c @ c9f885e

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

Converted MultiShellModel?

  • Property mode set to 100644
File size: 2.4 KB
Line 
1double form_volume(void);
2
3double Iq(double q,
4          double core_radius,
5          double s_thickness,
6          double w_thickness,
7          double core_sld,
8          double shell_sld,
9          double n_pairs);
10
11double Iqxy(double qx, double qy,
12          double core_radius,
13          double s_thickness,
14          double w_thickness,
15          double core_sld,
16          double shell_sld,
17          double n_pairs);
18
19static
20double F_func(double qr) {
21        double sc;
22
23    if (qr > 0.1){
24        double sn, cn;
25        SINCOS(qr, sn, cn);
26        sc = (3.0*(sn - qr*cn)/(qr*qr*qr));
27    } else{
28        // herbie.uwplse.org/demo low-q solution for the above.
29        sc = 1.0 + 0.0035714285714285718*(qr*qr*qr*qr) - 0.1*qr*qr;
30    }
31
32        return sc;
33}
34static
35double multi_shell_kernel(double q,
36          double core_radius,
37          double s_thickness,
38          double w_thickness,
39          double core_sld,
40          double shell_sld,
41          double n_pairs)
42{
43        //calculate with a loop, two shells at a time
44        int ii=0;
45        double fval=0.0;
46        double voli = 0.0;
47    const double sldi = core_sld-shell_sld;
48
49        do {
50                double ri = core_radius + (double)ii*(s_thickness + w_thickness);
51
52        // layer 1
53                voli = 4.0*M_PI/3.0*ri*ri*ri;
54                fval += voli*sldi*F_func(ri*q);
55
56                ri += s_thickness;
57
58        // layer 2
59                voli = 4.0*M_PI/3.0*ri*ri*ri;
60                fval -= voli*sldi*F_func(ri*q);
61
62        //do 2 layers at a time
63                ii+=1;
64
65        } while(ii<=n_pairs-1);  //change to make 0 < n_pairs < 2 correspond to
66                                 //unilamellar vesicles (C. Glinka, 11/24/03)
67
68    fval *= 1.0e-4*fval/voli;
69
70        return(fval);
71}
72
73double form_volume(void){
74    return NAN;
75}
76
77double Iq(double q,
78          double core_radius,
79          double s_thickness,
80          double w_thickness,
81          double core_sld,
82          double shell_sld,
83          double n_pairs)
84{
85    return multi_shell_kernel(q,
86           core_radius,
87           s_thickness,
88           w_thickness,
89           core_sld,
90           shell_sld,
91           n_pairs);
92}
93
94double Iqxy(double qx, double qy,
95          double core_radius,
96          double s_thickness,
97          double w_thickness,
98          double core_sld,
99          double shell_sld,
100          double n_pairs)
101{
102    double q = sqrt(qx*qx + qy*qy);
103
104    return multi_shell_kernel(q,
105           core_radius,
106           s_thickness,
107           w_thickness,
108           core_sld,
109           shell_sld,
110           n_pairs);
111}
112
Note: See TracBrowser for help on using the repository browser.