source: sasmodels/sasmodels/models/core_shell_cylinder.py @ ee60aa7

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since ee60aa7 was ee60aa7, checked in by Paul Kienzle <pkienzle@…>, 10 months ago

clean up effective radius functions; improve mono_gauss_coil accuracy; start moving VR into C

  • Property mode set to 100644
File size: 6.2 KB
Line 
1r"""
2Definition
3----------
4
5The output of the 2D scattering intensity function for oriented core-shell
6cylinders is given by (Kline, 2006 [#kline]_). The form factor is normalized
7by the particle volume. Note that in this model the shell envelops the entire
8core so that besides a "sleeve" around the core, the shell also provides two
9flat end caps of thickness = shell thickness. In other words the length of the
10total cyclinder is the length of the core cylinder plus twice the thickness of
11the shell. If no end caps are desired one should use the
12:ref:`core-shell-bicelle` and set the thickness of the end caps (in this case
13the "thick_face") to zero.
14
15.. math::
16
17    I(q,\alpha) = \frac{\text{scale}}{V_s} F^2(q,\alpha).sin(\alpha) + \text{background}
18
19where
20
21.. math::
22
23    F(q,\alpha) = &\ (\rho_c - \rho_s) V_c
24           \frac{\sin \left( q \tfrac12 L\cos\alpha \right)}
25                {q \tfrac12 L\cos\alpha}
26           \frac{2 J_1 \left( qR\sin\alpha \right)}
27                {qR\sin\alpha} \\
28         &\ + (\rho_s - \rho_\text{solv}) V_s
29           \frac{\sin \left( q \left(\tfrac12 L+T\right) \cos\alpha \right)}
30                {q \left(\tfrac12 L +T \right) \cos\alpha}
31           \frac{ 2 J_1 \left( q(R+T)\sin\alpha \right)}
32                {q(R+T)\sin\alpha}
33
34and
35
36.. math::
37
38    V_s = \pi (R + T)^2 (L + 2T)
39
40and $\alpha$ is the angle between the axis of the cylinder and $\vec q$,
41$V_s$ is the total volume (i.e. including both the core and the outer shell),
42$V_c$ is the volume of the core, $L$ is the length of the core,
43$R$ is the radius of the core, $T$ is the thickness of the shell, $\rho_c$
44is the scattering length density of the core, $\rho_s$ is the scattering
45length density of the shell, $\rho_\text{solv}$ is the scattering length
46density of the solvent, and *background* is the background level.  The outer
47radius of the shell is given by $R+T$ and the total length of the outer
48shell is given by $L+2T$. $J1$ is the first order Bessel function.
49
50.. _core-shell-cylinder-geometry:
51
52.. figure:: img/core_shell_cylinder_geometry.jpg
53
54    Core shell cylinder schematic.
55
56To provide easy access to the orientation of the core-shell cylinder, we
57define the axis of the cylinder using two angles $\theta$ and $\phi$.
58(see :ref:`cylinder model <cylinder-angle-definition>`)
59
60NB: The 2nd virial coefficient of the cylinder is calculated based on
61the radius and 2 length values, and used as the effective radius for
62$S(q)$ when $P(q) \cdot S(q)$ is applied.
63
64The $\theta$ and $\phi$ parameters are not used for the 1D output.
65
66Reference
67---------
68
69.. [#] see, for example, Ian Livsey  J. Chem. Soc., Faraday Trans. 2, 1987,83,
70   1445-1452
71.. [#kline] S R Kline, *J Appl. Cryst.*, 39 (2006) 895
72
73Authorship and Verification
74----------------------------
75
76* **Author:** NIST IGOR/DANSE **Date:** pre 2010
77* **Last Modified by:** Paul Kienzle **Date:** Aug 8, 2016
78* **Last Reviewed by:** Richard Heenan **Date:** March 18, 2016
79"""
80
81import numpy as np
82from numpy import pi, inf, sin, cos
83
84name = "core_shell_cylinder"
85title = "Right circular cylinder with a core-shell scattering length density profile."
86description = """
87P(q,alpha)= scale/Vs*f(q)^(2) + background,
88      where: f(q)= 2(sld_core - solvant_sld)
89        * Vc*sin[qLcos(alpha/2)]
90        /[qLcos(alpha/2)]*J1(qRsin(alpha))
91        /[qRsin(alpha)]+2(sld_shell-sld_solvent)
92        *Vs*sin[q(L+T)cos(alpha/2)][[q(L+T)
93        *cos(alpha/2)]*J1(q(R+T)sin(alpha))
94        /q(R+T)sin(alpha)]
95
96    alpha:is the angle between the axis of
97        the cylinder and the q-vector
98    Vs: the volume of the outer shell
99    Vc: the volume of the core
100    L: the length of the core
101        sld_shell: the scattering length density of the shell
102    sld_solvent: the scattering length density of the solvent
103    background: the background
104    T: the thickness
105        R+T: is the outer radius
106     L+2T: The total length of the outershell
107    J1: the first order Bessel function
108     theta: axis_theta of the cylinder
109     phi: the axis_phi of the cylinder
110"""
111category = "shape:cylinder"
112
113#             ["name", "units", default, [lower, upper], "type", "description"],
114parameters = [["sld_core", "1e-6/Ang^2", 4, [-inf, inf], "sld",
115               "Cylinder core scattering length density"],
116              ["sld_shell", "1e-6/Ang^2", 4, [-inf, inf], "sld",
117               "Cylinder shell scattering length density"],
118              ["sld_solvent", "1e-6/Ang^2", 1, [-inf, inf], "sld",
119               "Solvent scattering length density"],
120              ["radius", "Ang", 20, [0, inf], "volume",
121               "Cylinder core radius"],
122              ["thickness", "Ang", 20, [0, inf], "volume",
123               "Cylinder shell thickness"],
124              ["length", "Ang", 400, [0, inf], "volume",
125               "Cylinder length"],
126              ["theta", "degrees", 60, [-360, 360], "orientation",
127               "cylinder axis to beam angle"],
128              ["phi", "degrees", 60, [-360, 360], "orientation",
129               "rotation about beam"],
130             ]
131
132source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "core_shell_cylinder.c"]
133have_Fq = True
134effective_radius_type = [
135    "equivalent sphere", "outer radius", "half outer length",
136    "half min outer dimension", "half max outer dimension",
137    "half outer diagonal",
138    ]
139
140def random():
141    outer_radius = 10**np.random.uniform(1, 4.7)
142    # Use a distribution with a preference for thin shell or thin core
143    # Avoid core,shell radii < 1
144    radius = np.random.beta(0.5, 0.5)*(outer_radius-2) + 1
145    thickness = outer_radius - radius
146    length = np.random.uniform(1, 4.7)
147    pars = dict(
148        radius=radius,
149        thickness=thickness,
150        length=length,
151    )
152    return pars
153
154demo = dict(scale=1, background=0,
155            sld_core=6, sld_shell=8, sld_solvent=1,
156            radius=45, thickness=25, length=340,
157            theta=30, phi=15,
158            radius_pd=.2, radius_pd_n=1,
159            length_pd=.2, length_pd_n=10,
160            thickness_pd=.2, thickness_pd_n=10,
161            theta_pd=15, theta_pd_n=45,
162            phi_pd=15, phi_pd_n=1)
163q = 0.1
164# april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct!
165qx = q*cos(pi/6.0)
166qy = q*sin(pi/6.0)
167tests = [
168    [{}, 0.075, 10.8552692237],
169    [{}, (qx, qy), 0.444618752741],
170]
171del qx, qy  # not necessary to delete, but cleaner
Note: See TracBrowser for help on using the repository browser.