source: sasmodels/sasmodels/models/rectangular_prism.py @ 6dd90c1

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 6dd90c1 was 6dd90c1, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

update model tests for default background of 0.001

  • Property mode set to 100644
File size: 5.3 KB
Line 
1# rectangular_prism model
2# Note: model title and parameter table are inserted automatically
3r"""
4
5This model provides the form factor, *P(q)*, for a rectangular prism.
6
7Note that this model is almost totally equivalent to the existing
8:ref:`parallelepiped` model.
9The only difference is that the way the relevant
10parameters are defined here (*a*, *b/a*, *c/a* instead of *a*, *b*, *c*)
11allows to use polydispersity with this model while keeping the shape of
12the prism (e.g. setting *b/a* = 1 and *c/a* = 1 and applying polydispersity
13to *a* will generate a distribution of cubes of different sizes).
14Note also that, contrary to :ref:`parallelepiped`, it does not compute
15the 2D scattering.
16
17
18Definition
19----------
20
21The 1D scattering intensity for this model was calculated by Mittelbach and
22Porod (Mittelbach, 1961), but the implementation here is closer to the
23equations given by Nayuk and Huber (Nayuk, 2012).
24Note also that the angle definitions used in the code and the present
25documentation correspond to those used in (Nayuk, 2012) (see Fig. 1 of
26that reference), with |theta| corresponding to |alpha| in that paper,
27and not to the usual convention used for example in the
28:ref:`parallelepiped` model. As the present model does not compute
29the 2D scattering, this has no further consequences.
30
31In this model the scattering from a massive parallelepiped with an
32orientation with respect to the scattering vector given by |theta|
33and |phi|
34
35.. math::
36  A_P\,(q) =  \frac{\sin \bigl( q \frac{C}{2} \cos\theta \bigr)}{\left( q \frac{C}{2}
37  \cos\theta \right)} \, \times \, \frac{\sin \bigl( q \frac{A}{2} \sin\theta \sin\phi
38  \bigr)}{\left( q \frac{A}{2} \sin\theta \sin\phi \right)} \, \times \, \frac{\sin \bigl(
39  q \frac{B}{2} \sin\theta \cos\phi \bigr)}{\left( q \frac{B}{2} \sin\theta \cos\phi \right)}
40
41where *A*, *B* and *C* are the sides of the parallelepiped and must fulfill
42:math:`A \le B \le C`, |theta| is the angle between the *z* axis and the
43longest axis of the parallelepiped *C*, and |phi| is the angle between the
44scattering vector (lying in the *xy* plane) and the *y* axis.
45
46The normalized form factor in 1D is obtained averaging over all possible
47orientations
48
49.. math::
50  P(q) =  \frac{2}{\pi} \times \, \int_0^{\frac{\pi}{2}} \,
51  \int_0^{\frac{\pi}{2}} A_P^2(q) \, \sin\theta \, d\theta \, d\phi
52
53And the 1D scattering intensity is calculated as
54
55.. math::
56  I(q) = \mbox{scale} \times V \times (\rho_{\mbox{p}} -
57  \rho_{\mbox{solvent}})^2 \times P(q)
58
59where *V* is the volume of the rectangular prism, :math:`\rho_{\mbox{p}}`
60is the scattering length of the parallelepiped, :math:`\rho_{\mbox{solvent}}`
61is the scattering length of the solvent, and (if the data are in absolute
62units) *scale* represents the volume fraction (which is unitless).
63
64**The 2D scattering intensity is not computed by this model.**
65
66
67Validation
68----------
69
70Validation of the code was conducted by comparing the output of the 1D model
71to the output of the existing :ref:`parallelepiped` model.
72
73REFERENCES
74
75P Mittelbach and G Porod, *Acta Physica Austriaca*, 14 (1961) 185-211
76
77R Nayuk and K Huber, *Z. Phys. Chem.*, 226 (2012) 837-854
78
79"""
80
81from numpy import pi, inf, sqrt
82
83name = "rectangular_prism"
84title = "Rectangular parallelepiped with uniform scattering length density."
85description = """
86    I(q)= scale*V*(sld - solvent_sld)^2*P(q,theta,phi)+background
87        P(q,theta,phi) = (2/pi) * double integral from 0 to pi/2 of ...
88           AP^2(q)*sin(theta)*dtheta*dphi
89        AP = S(q*C*cos(theta)/2) * S(q*A*sin(theta)*sin(phi)/2) * S(q*B*sin(theta)*cos(phi)/2)
90        S(x) = sin(x)/x
91"""
92category = "shape:parallelepiped"
93
94#             ["name", "units", default, [lower, upper], "type","description"],
95parameters = [["sld", "1e-6/Ang^2", 6.3, [-inf, inf], "",
96               "Parallelepiped scattering length density"],
97              ["solvent_sld", "1e-6/Ang^2", 1, [-inf, inf], "",
98               "Solvent scattering length density"],
99              ["a_side", "Ang", 35, [0, inf], "volume",
100               "Shorter side of the parallelepiped"],
101              ["b2a_ratio", "Ang", 1, [0, inf], "volume",
102               "Ratio sides b/a"],
103              ["c2a_ratio", "Ang", 1, [0, inf], "volume",
104               "Ratio sides c/a"],
105             ]
106
107source = ["lib/J1.c", "lib/gauss76.c", "rectangular_prism.c"]
108
109def ER(a_side, b2a_ratio, c2a_ratio):
110    """
111        Return equivalent radius (ER)
112    """
113    b_side = a_side * b2a_ratio
114    c_side = a_side * c2a_ratio
115
116    # surface average radius (rough approximation)
117    surf_rad = sqrt(a_side * b_side / pi)
118
119    ddd = 0.75 * surf_rad * (2 * surf_rad * c_side + (c_side + surf_rad) * (c_side + pi * surf_rad))
120    return 0.5 * (ddd) ** (1. / 3.)
121
122
123# parameters for demo
124demo = dict(scale=1, background=0,
125            sld=6.3e-6, solvent_sld=1.0e-6,
126            a_side=35, b2a_ratio=1, c2a_ratio=1,
127            a_side_pd=0.1, a_side_pd_n=10,
128            b2a_ratio_pd=0.1, b2a_ratio_pd_n=1,
129            c2a_ratio_pd=0.1, c2a_ratio_pd_n=1)
130
131# For testing against the old sasview models, include the converted parameter
132# names and the target sasview model name.
133oldname = 'RectangularPrismModel'
134oldpars = dict(a_side='short_side', b2a_ratio='b2a_ratio', c_side='c2a_ratio',
135               sld='sldPipe', solvent_sld='sldSolv')
136
137tests = [[{}, 0.2, 0.375248406825],
138         [{}, [0.2], [0.375248406825]],
139        ]
Note: See TracBrowser for help on using the repository browser.