source: sasmodels/sasmodels/models/core_shell_ellipsoid.c @ 4f79d94

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 4f79d94 was 5bddd89, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

use ORIENT macro for remaining symmetric models

  • Property mode set to 100644
File size: 4.6 KB
Line 
1double form_volume(double radius_equat_core,
2                   double polar_core,
3                   double equat_shell,
4                   double polar_shell);
5double Iq(double q,
6          double radius_equat_core,
7          double x_core,
8          double thick_shell,
9          double x_polar_shell,
10          double core_sld,
11          double shell_sld,
12          double solvent_sld);
13
14
15double Iqxy(double qx, double qy,
16          double radius_equat_core,
17          double x_core,
18          double thick_shell,
19          double x_polar_shell,
20          double core_sld,
21          double shell_sld,
22          double solvent_sld,
23          double theta,
24          double phi);
25
26
27double form_volume(double radius_equat_core,
28                   double x_core,
29                   double thick_shell,
30                   double x_polar_shell)
31{
32    const double equat_shell = radius_equat_core + thick_shell;
33    const double polar_shell = radius_equat_core*x_core + thick_shell*x_polar_shell;
34    double vol = M_4PI_3*equat_shell*equat_shell*polar_shell;
35    return vol;
36}
37
38static double
39core_shell_ellipsoid_xt_kernel(double q,
40          double radius_equat_core,
41          double x_core,
42          double thick_shell,
43          double x_polar_shell,
44          double core_sld,
45          double shell_sld,
46          double solvent_sld)
47{
48    const double lolim = 0.0;
49    const double uplim = 1.0;
50
51    double summ = 0.0;   //initialize intergral
52
53    const double delpc = core_sld - shell_sld; //core - shell
54    const double delps = shell_sld - solvent_sld; //shell - solvent
55
56
57    const double polar_core = radius_equat_core*x_core;
58    const double equat_shell = radius_equat_core + thick_shell;
59    const double polar_shell = radius_equat_core*x_core + thick_shell*x_polar_shell;
60
61    for(int i=0;i<N_POINTS_76;i++) {
62        double zi = 0.5*( Gauss76Z[i]*(uplim-lolim) + uplim + lolim );
63        double yyy = Gauss76Wt[i] * gfn4(zi,
64                                  radius_equat_core,
65                                  polar_core,
66                                  equat_shell,
67                                  polar_shell,
68                                  delpc,
69                                  delps,
70                                  q);
71        summ += yyy;
72    }
73
74    double answer = 0.5*(uplim-lolim)*summ;
75    //convert to [cm-1]
76    answer *= 1.0e-4;
77
78    return answer;
79}
80
81static double
82core_shell_ellipsoid_xt_kernel_2d(double qx, double qy,
83          double radius_equat_core,
84          double x_core,
85          double thick_shell,
86          double x_polar_shell,
87          double core_sld,
88          double shell_sld,
89          double solvent_sld,
90          double theta,
91          double phi)
92{
93    double q, sin_alpha, cos_alpha;
94    ORIENT_SYMMETRIC(qx, qy, theta, phi, q, sin_alpha, cos_alpha);
95
96    const double sldcs = core_sld - shell_sld;
97    const double sldss = shell_sld- solvent_sld;
98
99    const double polar_core = radius_equat_core*x_core;
100    const double equat_shell = radius_equat_core + thick_shell;
101    const double polar_shell = radius_equat_core*x_core + thick_shell*x_polar_shell;
102
103    // Call the IGOR library function to get the kernel:
104    // MUST use gfn4 not gf2 because of the def of params.
105    double answer = gfn4(cos_alpha,
106                  radius_equat_core,
107                  polar_core,
108                  equat_shell,
109                  polar_shell,
110                  sldcs,
111                  sldss,
112                  q);
113
114    //convert to [cm-1]
115    answer *= 1.0e-4;
116
117    return answer;
118}
119
120double Iq(double q,
121          double radius_equat_core,
122          double x_core,
123          double thick_shell,
124          double x_polar_shell,
125          double core_sld,
126          double shell_sld,
127          double solvent_sld)
128{
129    double intensity = core_shell_ellipsoid_xt_kernel(q,
130           radius_equat_core,
131           x_core,
132           thick_shell,
133           x_polar_shell,
134           core_sld,
135           shell_sld,
136           solvent_sld);
137
138    return intensity;
139}
140
141
142double Iqxy(double qx, double qy,
143          double radius_equat_core,
144          double x_core,
145          double thick_shell,
146          double x_polar_shell,
147          double core_sld,
148          double shell_sld,
149          double solvent_sld,
150          double theta,
151          double phi)
152{
153    double intensity = core_shell_ellipsoid_xt_kernel_2d(qx, qy,
154                       radius_equat_core,
155                       x_core,
156                       thick_shell,
157                       x_polar_shell,
158                       core_sld,
159                       shell_sld,
160                       solvent_sld,
161                       theta,
162                       phi);
163
164    return intensity;
165}
Note: See TracBrowser for help on using the repository browser.