source: sasmodels/sasmodels/models/core_shell_cylinder.py @ 99658f6

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 99658f6 was 99658f6, checked in by grethevj, 10 months ago

updated ER functions including cylinder excluded volume, to match 4.x

  • Property mode set to 100644
File size: 6.3 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
72L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).
73
74Authorship and Verification
75----------------------------
76
77* **Author:** NIST IGOR/DANSE **Date:** pre 2010
78* **Last Modified by:** Paul Kienzle **Date:** Aug 8, 2016
79* **Last Reviewed by:** Richard Heenan **Date:** March 18, 2016
80"""
81
82import numpy as np
83from numpy import pi, inf, sin, cos
84
85name = "core_shell_cylinder"
86title = "Right circular cylinder with a core-shell scattering length density profile."
87description = """
88P(q,alpha)= scale/Vs*f(q)^(2) + background,
89      where: f(q)= 2(sld_core - solvant_sld)
90        * Vc*sin[qLcos(alpha/2)]
91        /[qLcos(alpha/2)]*J1(qRsin(alpha))
92        /[qRsin(alpha)]+2(sld_shell-sld_solvent)
93        *Vs*sin[q(L+T)cos(alpha/2)][[q(L+T)
94        *cos(alpha/2)]*J1(q(R+T)sin(alpha))
95        /q(R+T)sin(alpha)]
96
97    alpha:is the angle between the axis of
98        the cylinder and the q-vector
99    Vs: the volume of the outer shell
100    Vc: the volume of the core
101    L: the length of the core
102        sld_shell: the scattering length density of the shell
103    sld_solvent: the scattering length density of the solvent
104    background: the background
105    T: the thickness
106        R+T: is the outer radius
107     L+2T: The total length of the outershell
108    J1: the first order Bessel function
109     theta: axis_theta of the cylinder
110     phi: the axis_phi of the cylinder
111"""
112category = "shape:cylinder"
113
114#             ["name", "units", default, [lower, upper], "type", "description"],
115parameters = [["sld_core", "1e-6/Ang^2", 4, [-inf, inf], "sld",
116               "Cylinder core scattering length density"],
117              ["sld_shell", "1e-6/Ang^2", 4, [-inf, inf], "sld",
118               "Cylinder shell scattering length density"],
119              ["sld_solvent", "1e-6/Ang^2", 1, [-inf, inf], "sld",
120               "Solvent scattering length density"],
121              ["radius", "Ang", 20, [0, inf], "volume",
122               "Cylinder core radius"],
123              ["thickness", "Ang", 20, [0, inf], "volume",
124               "Cylinder shell thickness"],
125              ["length", "Ang", 400, [0, inf], "volume",
126               "Cylinder length"],
127              ["theta", "degrees", 60, [-360, 360], "orientation",
128               "cylinder axis to beam angle"],
129              ["phi", "degrees", 60, [-360, 360], "orientation",
130               "rotation about beam"],
131             ]
132
133source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "core_shell_cylinder.c"]
134have_Fq = True
135effective_radius_type = [
136    "excluded volume", "equivalent volume sphere", "outer radius", "half outer length",
137    "half min outer dimension", "half max outer dimension", "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.