source: sasmodels/sasmodels/models/hollow_rectangular_prism_thin_walls.py @ 6e7d7b6

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 6e7d7b6 was 6e7d7b6, checked in by butler, 8 months ago

Fix Vesicle and Hollow Rectangular Prism Thin Walls

fix errors and document normalizatin for the two aforementioned models

  • Property mode set to 100644
File size: 5.1 KB
Line 
1# rectangular_prism model
2# Note: model title and parameter table are inserted automatically
3r"""
4Definition
5----------
6
7
8This model provides the form factor, $P(q)$, for a hollow rectangular
9prism with infinitely thin walls. It computes only the 1D scattering, not the 2D.
10The 1D scattering intensity for this model is calculated according to the
11equations given by Nayuk and Huber\ [#Nayuk2012]_.
12
13Assuming a hollow parallelepiped with infinitely thin walls, edge lengths
14$A \le B \le C$ and presenting an orientation with respect to the
15scattering vector given by $\theta$ and $\phi$, where $\theta$ is the angle
16between the $z$ axis and the longest axis of the parallelepiped $C$, and
17$\phi$ is the angle between the scattering vector (lying in the $xy$ plane)
18and the $y$ axis, the form factor is given by
19
20.. math::
21
22    P(q) = \frac{1}{V^2} \frac{2}{\pi} \int_0^{\frac{\pi}{2}}
23           \int_0^{\frac{\pi}{2}} [A_L(q)+A_T(q)]^2 \sin\theta\,d\theta\,d\phi
24
25where
26
27.. math::
28
29    V &= 2AB + 2AC + 2BC \\
30    A_L(q) &=  8 \times \frac{
31            \sin \left( \tfrac{1}{2} q A \sin\phi \sin\theta \right)
32            \sin \left( \tfrac{1}{2} q B \cos\phi \sin\theta \right)
33            \cos \left( \tfrac{1}{2} q C \cos\theta \right)
34        }{q^2 \, \sin^2\theta \, \sin\phi \cos\phi} \\
35    A_T(q) &=  A_F(q) \times
36      \frac{2\,\sin \left( \tfrac{1}{2} q C \cos\theta \right)}{q\,\cos\theta}
37
38and
39
40.. math::
41
42  A_F(q) =  4 \frac{ \cos \left( \tfrac{1}{2} q A \sin\phi \sin\theta \right)
43                       \sin \left( \tfrac{1}{2} q B \cos\phi \sin\theta \right) }
44                     {q \, \cos\phi \, \sin\theta} +
45              4 \frac{ \sin \left( \tfrac{1}{2} q A \sin\phi \sin\theta \right)
46                       \cos \left( \tfrac{1}{2} q B \cos\phi \sin\theta \right) }
47                     {q \, \sin\phi \, \sin\theta}
48
49The 1D scattering intensity is then calculated as
50
51.. math::
52
53  I(q) = \text{scale} \times V \times (\rho_\text{p} - \rho_\text{solvent})^2 \times P(q)
54
55where $V$ is the surface area of the rectangular prism, $\rho_\text{p}$
56is the scattering length density of the parallelepiped, $\rho_\text{solvent}$
57is the scattering length density of the solvent, and (if the data are in
58absolute units) *scale* is related to the total surface area.
59
60**The 2D scattering intensity is not computed by this model.**
61
62
63Validation
64----------
65
66Validation of the code was conducted  by qualitatively comparing the output
67of the 1D model to the curves shown in (Nayuk, 2012\ [#Nayuk2012]_).
68
69
70References
71----------
72
73.. [#Nayuk2012] R Nayuk and K Huber, *Z. Phys. Chem.*, 226 (2012) 837-854
74
75
76Authorship and Verification
77----------------------------
78
79* **Author:** Miguel Gonzales **Date:** February 26, 2016
80* **Last Modified by:** Paul Kienzle **Date:** October 15, 2016
81* **Last Reviewed by:** Paul Butler **Date:** September 07, 2018
82"""
83
84import numpy as np
85from numpy import pi, inf, sqrt
86
87name = "hollow_rectangular_prism_thin_walls"
88title = "Hollow rectangular parallelepiped with thin walls."
89description = """
90    I(q)= scale*V*(sld - sld_solvent)^2*P(q)+background
91        with P(q) being the form factor corresponding to a hollow rectangular
92        parallelepiped with infinitely thin walls.
93"""
94category = "shape:parallelepiped"
95
96#             ["name", "units", default, [lower, upper], "type","description"],
97parameters = [["sld", "1e-6/Ang^2", 6.3, [-inf, inf], "sld",
98               "Parallelepiped scattering length density"],
99              ["sld_solvent", "1e-6/Ang^2", 1, [-inf, inf], "sld",
100               "Solvent scattering length density"],
101              ["length_a", "Ang", 35, [0, inf], "volume",
102               "Shorter side of the parallelepiped"],
103              ["b2a_ratio", "Ang", 1, [0, inf], "volume",
104               "Ratio sides b/a"],
105              ["c2a_ratio", "Ang", 1, [0, inf], "volume",
106               "Ratio sides c/a"],
107             ]
108
109source = ["lib/gauss76.c", "hollow_rectangular_prism_thin_walls.c"]
110
111def ER(length_a, b2a_ratio, c2a_ratio):
112    """
113        Return equivalent radius (ER)
114    """
115    b_side = length_a * b2a_ratio
116    c_side = length_a * c2a_ratio
117
118    # surface average radius (rough approximation)
119    surf_rad = sqrt(length_a * b_side / pi)
120
121    ddd = 0.75 * surf_rad * (2 * surf_rad * c_side + (c_side + surf_rad) * (c_side + pi * surf_rad))
122    return 0.5 * (ddd) ** (1. / 3.)
123
124def VR(length_a, b2a_ratio, c2a_ratio):
125    """
126        Return shell volume and total volume
127    """
128    b_side = length_a * b2a_ratio
129    c_side = length_a * c2a_ratio
130    vol_total = length_a * b_side * c_side
131    vol_shell = 2.0 * (length_a*b_side + length_a*c_side + b_side*c_side)
132    return vol_shell, vol_total
133
134
135def random():
136    a, b, c = 10**np.random.uniform(1, 4.7, size=3)
137    pars = dict(
138        length_a=a,
139        b2a_ratio=b/a,
140        c2a_ratio=c/a,
141    )
142    return pars
143
144
145# parameters for demo
146demo = dict(scale=1, background=0,
147            sld=6.3, sld_solvent=1.0,
148            length_a=35, b2a_ratio=1, c2a_ratio=1,
149            length_a_pd=0.1, length_a_pd_n=10,
150            b2a_ratio_pd=0.1, b2a_ratio_pd_n=1,
151            c2a_ratio_pd=0.1, c2a_ratio_pd_n=1)
152
153tests = [[{}, 0.2, 0.837719188592],
154         [{}, [0.2], [0.837719188592]],
155        ]
Note: See TracBrowser for help on using the repository browser.