source: sasmodels/sasmodels/models/core_shell_cylinder.py @ 3936ad3

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

Bessel functions from double-precison cephes has been added

  • Property mode set to 100644
File size: 6.8 KB
Line 
1# core shell cylinder model
2# Note: model title and parameter table are inserted automatically
3r"""
4The form factor is normalized by the particle volume.
5
6Definition
7----------
8
9The output of the 2D scattering intensity function for oriented core-shell
10cylinders is given by (Kline, 2006)
11
12.. math::
13
14    P(q,\alpha) = \frac{\text{scale}}{V_s} F^2(q) + \text{background}
15
16where
17
18.. math::
19
20    F(q) = &\ (\rho_c - \rho_s) V_c
21           \frac{\sin \left( q \tfrac12 L\cos\alpha \right)}
22                {q \tfrac12 L\cos\alpha}
23           \frac{2 J_1 \left( qR\sin\alpha \right)}
24                {qR\sin\alpha} \\
25         &\ + (\rho_s - \rho_\text{solv}) V_s
26           \frac{\sin \left( q \left(\tfrac12 L+T\right) \cos\alpha \right)}
27                {q \left(\tfrac12 L +T \right) \cos\alpha}
28           \frac{ 2 J_1 \left( q(R+T)\sin\alpha \right)}
29                {q(R+T)\sin\alpha}
30
31and
32
33.. math::
34
35    V_s = \pi (R + T)^2 (L + 2T)
36
37and $\alpha$ is the angle between the axis of the cylinder and $\vec q$,
38$V_s$ is the volume of the outer shell (i.e. the total volume, including
39the shell), $V_c$ is the volume of the core, $L$ is the length of the core,
40$R$ is the radius of the core, $T$ is the thickness of the shell, $\rho_c$
41is the scattering length density of the core, $\rho_s$ is the scattering
42length density of the shell, $\rho_\text{solv}$ is the scattering length
43density of the solvent, and *background* is the background level.  The outer
44radius of the shell is given by $R+T$ and the total length of the outer
45shell is given by $L+2T$. $J1$ is the first order Bessel function.
46
47.. _core-shell-cylinder-geometry:
48
49.. figure:: img/core_shell_cylinder_geometry.jpg
50
51    Core shell cylinder schematic.
52
53To provide easy access to the orientation of the core-shell cylinder, we
54define the axis of the cylinder using two angles $\theta$ and $\phi$. As
55for the case of the cylinder, those angles are defined in
56:num:`figure #cylinder-orientation`.
57
58NB: The 2nd virial coefficient of the cylinder is calculated based on
59the radius and 2 length values, and used as the effective radius for
60$S(q)$ when $P(q) \cdot S(q)$ is applied.
61
62The $\theta$ and $\phi$ parameters are not used for the 1D output.
63
64Validation
65----------
66
67Validation of our code was done by comparing the output of the 1D model to
68the output of the software provided by the NIST (Kline, 2006).
69:num:`Figure #core-shell-cylinder-1d` shows a comparison
70of the 1D output of our model and the output of the NIST software.
71
72.. _core-shell-cylinder-1d:
73
74.. figure:: img/core_shell_cylinder_1d.jpg
75
76    Comparison of the SasView scattering intensity for a core-shell cylinder
77    with the output of the NIST SANS analysis software. The parameters were
78    set to: *scale* = 1.0 |Ang|, *radius* = 20 |Ang|, *thickness* = 10 |Ang|,
79    *length* =400 |Ang|, *core_sld* =1e-6 |Ang^-2|, *shell_sld* = 4e-6 |Ang^-2|,
80    *solvent_sld* = 1e-6 |Ang^-2|, and *background* = 0.01 |cm^-1|.
81
82Averaging over a distribution of orientation is done by evaluating the
83equation above. Since we have no other software to compare the
84implementation of the intensity for fully oriented cylinders, we can
85compare the result of averaging our 2D output using a uniform
86distribution $p(\theta,\phi) = 1.0$.
87:num:`Figure #core-shell-cylinder-2d` shows the result
88of such a cross-check.
89
90.. _core-shell-cylinder-2d:
91
92.. figure:: img/core_shell_cylinder_2d.jpg
93
94    Comparison of the intensity for uniformly distributed core-shell
95    cylinders calculated from our 2D model and the intensity from the
96    NIST SANS analysis software. The parameters used were: *scale* = 1.0,
97    *radius* = 20 |Ang|, *thickness* = 10 |Ang|, *length* = 400 |Ang|,
98    *core_sld* = 1e-6 |Ang^-2|, *shell_sld* = 4e-6 |Ang^-2|,
99    *solvent_sld* = 1e-6 |Ang^-2|, and *background* = 0.0 |cm^-1|.
100
1012013/11/26 - Description reviewed by Heenan, R.
102"""
103
104from numpy import pi, inf
105
106name = "core_shell_cylinder"
107title = "Right circular cylinder with a core-shell scattering length density profile."
108description = """
109P(q,alpha)= scale/Vs*f(q)^(2) + background,
110      where: f(q)= 2(core_sld - solvant_sld)
111        * Vc*sin[qLcos(alpha/2)]
112        /[qLcos(alpha/2)]*J1(qRsin(alpha))
113        /[qRsin(alpha)]+2(shell_sld-solvent_sld)
114        *Vs*sin[q(L+T)cos(alpha/2)][[q(L+T)
115        *cos(alpha/2)]*J1(q(R+T)sin(alpha))
116        /q(R+T)sin(alpha)]
117
118    alpha:is the angle between the axis of
119        the cylinder and the q-vector
120    Vs: the volume of the outer shell
121    Vc: the volume of the core
122    L: the length of the core
123        shell_sld: the scattering length density of the shell
124    solvent_sld: the scattering length density of the solvent
125    background: the background
126    T: the thickness
127        R+T: is the outer radius
128     L+2T: The total length of the outershell
129    J1: the first order Bessel function
130     theta: axis_theta of the cylinder
131     phi: the axis_phi of the cylinder
132"""
133category = "shape:cylinder"
134
135#             ["name", "units", default, [lower, upper], "type", "description"],
136parameters = [["core_sld", "1e-6/Ang^2", 4, [-inf, inf], "",
137               "Cylinder core scattering length density"],
138              ["shell_sld", "1e-6/Ang^2", 4, [-inf, inf], "",
139               "Cylinder shell scattering length density"],
140              ["solvent_sld", "1e-6/Ang^2", 1, [-inf, inf], "",
141               "Solvent scattering length density"],
142              ["radius", "Ang", 20, [0, inf], "volume",
143               "Cylinder core radius"],
144              ["thickness", "Ang", 20, [0, inf], "volume",
145               "Cylinder shell thickness"],
146              ["length", "Ang", 400, [0, inf], "volume",
147               "Cylinder length"],
148              ["theta", "degrees", 60, [-inf, inf], "orientation",
149               "In plane angle"],
150              ["phi", "degrees", 60, [-inf, inf], "orientation",
151               "Out of plane angle"],
152             ]
153
154source = ["lib/polevl.c", "lib/j1d.c", "lib/gauss76.c", "core_shell_cylinder.c"]
155
156def ER(radius, thickness, length):
157    """
158        Returns the effective radius used in the S*P calculation
159    """
160    radius = radius + thickness
161    length = length + 2 * thickness
162    ddd = 0.75 * radius * (2 * radius * length + (length + radius) * (length + pi * radius))
163    return 0.5 * (ddd) ** (1. / 3.)
164
165def VR(radius, thickness, length):
166    """
167        Returns volume ratio
168    """
169    whole = pi * (radius + thickness) ** 2 * (length + 2 * thickness)
170    core = pi * radius ** 2 * length
171    return whole, whole - core
172
173demo = dict(scale=1, background=0,
174            core_sld=6, shell_sld=8, solvent_sld=1,
175            radius=45, thickness=25, length=340,
176            theta=30, phi=15,
177            radius_pd=.2, radius_pd_n=1,
178            length_pd=.2, length_pd_n=10,
179            thickness_pd=.2, thickness_pd_n=10,
180            theta_pd=15, theta_pd_n=45,
181            phi_pd=15, phi_pd_n=1)
182oldname = 'CoreShellCylinderModel'
183oldpars = dict(theta='axis_theta', phi='axis_phi')
Note: See TracBrowser for help on using the repository browser.