source: sasmodels/sasmodels/models/pearl_necklace.c @ 9762341

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

use predefined constants for fractions of pi

  • Property mode set to 100644
File size: 3.6 KB
Line 
1double _pearl_necklace_kernel(double q, double radius, double edge_sep,
2        double thick_string, double num_pearls, double sld_pearl,
3        double sld_string, double sld_solv);
4double form_volume(double radius, double edge_sep,
5        double thick_string, double num_pearls);
6
7double Iq(double q, double radius, double edge_sep,
8        double thick_string, double num_pearls, double sld, 
9        double string_sld, double solvent_sld);
10
11#define INVALID(v) (v.thick_string >= v.radius || v.num_pearls <= 0)
12
13// From Igor library
14double _pearl_necklace_kernel(double q, double radius, double edge_sep, double thick_string,
15        double num_pearls, double sld_pearl, double sld_string, double sld_solv)
16{
17        //relative slds
18        double contrast_pearl = sld_pearl - sld_solv;
19        double contrast_string = sld_string - sld_solv;
20       
21        // number of string segments
22        num_pearls = floor(num_pearls + 0.5); //Force integer number of pearls
23        double num_strings = num_pearls - 1.0;
24       
25        // center to center distance between the neighboring pearls
26        double A_s = edge_sep + 2.0 * radius;
27       
28        // Repeated Calculations
29        double sincasq = sinc(q*A_s);
30        double oneminussinc = 1 - sincasq;
31        double q_r = q * radius;
32        double q_edge = q * edge_sep;
33       
34        // each volume
35        double string_vol = edge_sep * M_PI * thick_string * thick_string / 4.0;
36        double pearl_vol = M_4PI_3 * radius * radius * radius;
37
38        //total volume
39        double tot_vol;
40        //each masses
41        double m_r= contrast_string * string_vol;
42        double m_s= contrast_pearl * pearl_vol;
43        double psi, gamma, beta;
44        //form factors
45        double sss, srr, srs; //cross
46        double srr_1, srr_2, srr_3;
47        double form_factor;
48        tot_vol = num_strings * string_vol;
49        tot_vol += num_pearls * pearl_vol;
50
51        //sine functions of a pearl
52        psi = sin(q_r);
53        psi -= q_r * cos(q_r);
54        psi *= 3.0;
55        psi /= q_r * q_r * q_r;
56
57        // Note take only 20 terms in Si series: 10 terms may be enough though.
58        gamma = Si(q_edge);
59        gamma /= (q_edge);
60        beta = Si(q * (A_s - radius));
61        beta -= Si(q_r);
62        beta /= q_edge;
63
64        // form factor for num_pearls
65        sss = 1.0 - pow(sincasq, num_pearls);
66        sss /= oneminussinc * oneminussinc;
67        sss *= -sincasq;
68        sss -= num_pearls / 2.0;
69        sss += num_pearls / oneminussinc;
70        sss *= 2.0 * m_s * psi * m_s * psi;
71
72        // form factor for num_strings (like thin rods)
73        srr_1 = -sinc(q_edge/2.0) * sinc(q_edge/2.0);
74
75        srr_1 += 2.0 * gamma;
76        srr_1 *= num_strings;
77        srr_2 = 2.0/oneminussinc;
78        srr_2 *= num_strings;
79        srr_2 *= beta * beta;
80        srr_3 = 1.0 - pow(sincasq, num_strings);
81        srr_3 /= oneminussinc * oneminussinc;
82        srr_3 *= beta * beta;
83        srr_3 *= -2.0;
84
85        // total srr
86        srr = srr_1 + srr_2 + srr_3;
87        srr *= m_r * m_r;
88
89        // form factor for correlations
90        srs = 1.0;
91        srs -= pow(sincasq, num_strings);
92        srs /= oneminussinc * oneminussinc;
93        srs *= -sincasq;
94        srs += num_strings/oneminussinc;
95        srs *= 4.0;
96        srs *= (m_r * m_s * beta * psi);
97
98        form_factor = sss + srr + srs;
99        form_factor /= (tot_vol * 1.0e4); // norm by volume and A^-1 to cm^-1
100
101        return (form_factor);
102}
103
104double form_volume(double radius, double edge_sep,
105        double thick_string, double num_pearls)
106{
107        double total_vol;
108
109        double number_of_strings = num_pearls - 1.0;
110       
111        double string_vol = edge_sep * M_PI * thick_string * thick_string / 4.0;
112        double pearl_vol = M_4PI_3 * radius * radius * radius;
113
114        total_vol = number_of_strings * string_vol;
115        total_vol += num_pearls * pearl_vol;
116
117        return(total_vol);
118}
119
120double Iq(double q, double radius, double edge_sep,
121        double thick_string, double num_pearls, double sld, 
122        double string_sld, double solvent_sld)
123{
124        double value, tot_vol;
125       
126        value = _pearl_necklace_kernel(q, radius, edge_sep, thick_string,
127                num_pearls, sld, string_sld, solvent_sld);
128        tot_vol = form_volume(radius, edge_sep, thick_string, num_pearls);
129
130        return value*tot_vol;
131}
Note: See TracBrowser for help on using the repository browser.