source: sasmodels/sasmodels/models/rectangular_prism.py @ ec45c4f

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

remove oldname/oldpars from new models

  • Property mode set to 100644
File size: 5.0 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*)
11which allows use of 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
73
74References
75----------
76
77P Mittelbach and G Porod, *Acta Physica Austriaca*, 14 (1961) 185-211
78
79R Nayuk and K Huber, *Z. Phys. Chem.*, 226 (2012) 837-854
80
81"""
82
83from numpy import pi, inf, sqrt
84
85name = "rectangular_prism"
86title = "Rectangular parallelepiped with uniform scattering length density."
87description = """
88    I(q)= scale*V*(sld - sld_solvent)^2*P(q,theta,phi)+background
89        P(q,theta,phi) = (2/pi) * double integral from 0 to pi/2 of ...
90           AP^2(q)*sin(theta)*dtheta*dphi
91        AP = S(q*C*cos(theta)/2) * S(q*A*sin(theta)*sin(phi)/2) * S(q*B*sin(theta)*cos(phi)/2)
92        S(x) = sin(x)/x
93"""
94category = "shape:parallelepiped"
95
96#             ["name", "units", default, [lower, upper], "type","description"],
97parameters = [["sld", "1e-6/Ang^2", 6.3, [-inf, inf], "",
98               "Parallelepiped scattering length density"],
99              ["sld_solvent", "1e-6/Ang^2", 1, [-inf, inf], "",
100               "Solvent scattering length density"],
101              ["a_side", "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", "rectangular_prism.c"]
110
111def ER(a_side, b2a_ratio, c2a_ratio):
112    """
113        Return equivalent radius (ER)
114    """
115    b_side = a_side * b2a_ratio
116    c_side = a_side * c2a_ratio
117
118    # surface average radius (rough approximation)
119    surf_rad = sqrt(a_side * 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
124
125# parameters for demo
126demo = dict(scale=1, background=0,
127            sld=6.3e-6, sld_solvent=1.0e-6,
128            a_side=35, b2a_ratio=1, c2a_ratio=1,
129            a_side_pd=0.1, a_side_pd_n=10,
130            b2a_ratio_pd=0.1, b2a_ratio_pd_n=1,
131            c2a_ratio_pd=0.1, c2a_ratio_pd_n=1)
132
133tests = [[{}, 0.2, 0.375248406825],
134         [{}, [0.2], [0.375248406825]],
135        ]
Note: See TracBrowser for help on using the repository browser.