source: sasmodels/sasmodels/models/core_shell_cylinder.py @ 528bd8c

Last change on this file since 528bd8c was 2f0c07d, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

make figure names regular (geometry, angle_definition, angle_projection)

  • Property mode set to 100644
File size: 5.7 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
70Averaging over a distribution of orientation is done by evaluating the
71equation above. Since we have no other software to compare the
72implementation of the intensity for fully oriented cylinders, we
73compared the result of averaging our 2D output using a uniform
74distribution $p(\theta,\phi) = 1.0$.
75
762013/11/26 - Description reviewed by Heenan, R.
77"""
78
79from numpy import pi, inf
80
81name = "core_shell_cylinder"
82title = "Right circular cylinder with a core-shell scattering length density profile."
83description = """
84P(q,alpha)= scale/Vs*f(q)^(2) + background,
85      where: f(q)= 2(core_sld - solvant_sld)
86        * Vc*sin[qLcos(alpha/2)]
87        /[qLcos(alpha/2)]*J1(qRsin(alpha))
88        /[qRsin(alpha)]+2(shell_sld-solvent_sld)
89        *Vs*sin[q(L+T)cos(alpha/2)][[q(L+T)
90        *cos(alpha/2)]*J1(q(R+T)sin(alpha))
91        /q(R+T)sin(alpha)]
92
93    alpha:is the angle between the axis of
94        the cylinder and the q-vector
95    Vs: the volume of the outer shell
96    Vc: the volume of the core
97    L: the length of the core
98        shell_sld: the scattering length density of the shell
99    solvent_sld: the scattering length density of the solvent
100    background: the background
101    T: the thickness
102        R+T: is the outer radius
103     L+2T: The total length of the outershell
104    J1: the first order Bessel function
105     theta: axis_theta of the cylinder
106     phi: the axis_phi of the cylinder
107"""
108category = "shape:cylinder"
109
110#             ["name", "units", default, [lower, upper], "type", "description"],
111parameters = [["core_sld", "1e-6/Ang^2", 4, [-inf, inf], "",
112               "Cylinder core scattering length density"],
113              ["shell_sld", "1e-6/Ang^2", 4, [-inf, inf], "",
114               "Cylinder shell scattering length density"],
115              ["solvent_sld", "1e-6/Ang^2", 1, [-inf, inf], "",
116               "Solvent scattering length density"],
117              ["radius", "Ang", 20, [0, inf], "volume",
118               "Cylinder core radius"],
119              ["thickness", "Ang", 20, [0, inf], "volume",
120               "Cylinder shell thickness"],
121              ["length", "Ang", 400, [0, inf], "volume",
122               "Cylinder length"],
123              ["theta", "degrees", 60, [-inf, inf], "orientation",
124               "In plane angle"],
125              ["phi", "degrees", 60, [-inf, inf], "orientation",
126               "Out of plane angle"],
127             ]
128
129source = ["lib/J1.c", "lib/gauss76.c", "core_shell_cylinder.c"]
130
131def ER(radius, thickness, length):
132    """
133        Returns the effective radius used in the S*P calculation
134    """
135    radius = radius + thickness
136    length = length + 2 * thickness
137    ddd = 0.75 * radius * (2 * radius * length + (length + radius) * (length + pi * radius))
138    return 0.5 * (ddd) ** (1. / 3.)
139
140def VR(radius, thickness, length):
141    """
142        Returns volume ratio
143    """
144    whole = pi * (radius + thickness) ** 2 * (length + 2 * thickness)
145    core = pi * radius ** 2 * length
146    return whole, whole - core
147
148demo = dict(scale=1, background=0,
149            core_sld=6, shell_sld=8, solvent_sld=1,
150            radius=45, thickness=25, length=340,
151            theta=30, phi=15,
152            radius_pd=.2, radius_pd_n=1,
153            length_pd=.2, length_pd_n=10,
154            thickness_pd=.2, thickness_pd_n=10,
155            theta_pd=15, theta_pd_n=45,
156            phi_pd=15, phi_pd_n=1)
157oldname = 'CoreShellCylinderModel'
158oldpars = dict(theta='axis_theta', phi='axis_phi')
Note: See TracBrowser for help on using the repository browser.