source: sasmodels/sasmodels/models/parallelepiped.py @ eb69cce

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

make model docs more consistent; build pdf docs

  • Property mode set to 100644
File size: 5.6 KB
Line 
1# parallelepiped model
2# Note: model title and parameter table are inserted automatically
3r"""
4The form factor is normalized by the particle volume.
5
6Definition
7----------
8
9This model provides the form factor, $P(q)$, for a rectangular parallelepiped
10(below) where the form factor is normalized by the volume of the
11parallelepiped. If you need to apply polydispersity, see also
12rectangular_prism_.
13
14The calculated form factor is:
15
16.. math::
17
18    P(q) = \frac{\text{scale}}{V} F^2(q) + \text{background}
19
20where the volume $V = A B C$ and the averaging $\left<\ldots\right>$ is
21applied over all orientations for 1D.
22
23.. figure:: img/parallelepiped.jpg
24
25   Parallelepiped with the corresponding definition of sides.
26
27The edge of the solid must satisfy the condition that $A < B < C$.
28Then, assuming $a = A/B < 1$, $b = B /B = 1$, and $c = C/B > 1$, the
29form factor is
30
31.. math::
32
33    P(q) = \frac{\text{scale}}{V}\int_0^1
34        \phi\left(\mu \sqrt{1-\sigma^2},a\right)
35        \left[S(\mu c \sigma/2)\right]^2 d\sigma
36
37with
38
39.. math::
40
41    \phi(\mu,a) = \int_0^1
42        \left\{S\left[\frac{\mu}{2}\cos(\frac{\pi}{2}u)\right]
43               S\left[\frac{\mu a}{2}\sin(\frac{\pi}{2}u)\right]
44               \right\}^2 du
45
46    S(x) = \frac{\sin x}{x}
47
48    \mu = qB
49
50and the contrast is defined as
51
52.. math::
53
54    \Delta\rho = \rho_{\textstyle p} - \rho_{\textstyle solvent}
55
56The scattering intensity per unit volume is returned in units of |cm^-1|;
57i.e., $I(q) = \phi P(q)$.
58
59NB: The 2nd virial coefficient of the parallelpiped is calculated based on
60the averaged effective radius $(=\sqrt{A B / \pi})$ and
61length $(= C)$ values, and used as the effective radius for
62$S(q)$ when $P(q) \cdot S(q)$ is applied.
63
64To provide easy access to the orientation of the parallelepiped, we define
65three angles $\theta$, $\phi$ and $\Psi$. The definition of $\theta$ and
66$\phi$ is the same as for the cylinder model (see also figures below).
67The angle $\Psi$ is the rotational angle around the $C$ axis against
68the $q$ plane. For example, $\Psi = 0$ when the $B$ axis is parallel
69to the $x$-axis of the detector.
70
71
72.. _parallelepiped-orientation:
73
74.. figure:: img/orientation.jpg
75
76    Definition of the angles for oriented parallelepipeds.
77
78.. figure:: img/orientation2.jpg
79
80    Examples of the angles for oriented parallelepipeds against the detector plane.
81
82
83Validation
84----------
85
86Validation of the code was done by comparing the output of the 1D calculation
87to the angular average of the output of a 2D calculation over all possible
88angles. The Figure below shows the comparison where the solid dot refers to
89averaged 2D while the line represents the result of the 1D calculation (for
90the averaging, 76, 180, 76 points are taken for the angles of $\theta$,
91$\phi$, and $\Psi$ respectively).
92
93.. _parallelepiped-compare:
94
95.. figure:: img/parallelepiped_compare.png
96
97   Comparison between 1D and averaged 2D.
98
99This model reimplements the form factor calculations implemented in a c-library
100provided by the NIST Center for Neutron Research (Kline, 2006).
101
102"""
103
104from numpy import pi, inf, sqrt
105
106name = "parallelepiped"
107title = "Rectangular parallelepiped with uniform scattering length density."
108description = """
109     P(q)= scale/V*integral from 0 to 1 of ...
110           phi(mu*sqrt(1-sigma^2),a) * S(mu*c*sigma/2)^2 * dsigma
111
112            phi(mu,a) = integral from 0 to 1 of ..
113        (S((mu/2)*cos(pi*u/2))*S((mu*a/2)*sin(pi*u/2)))^2 * du
114            S(x) = sin(x)/x
115        mu = q*B
116"""
117category = "shape:parallelpiped"
118
119#             ["name", "units", default, [lower, upper], "type","description"],
120parameters = [["sld", "1e-6/Ang^2", 4, [-inf, inf], "",
121               "Parallelepiped scattering length density"],
122              ["solvent_sld", "1e-6/Ang^2", 1, [-inf, inf], "",
123               "Solvent scattering length density"],
124              ["a_side", "Ang", 35, [0, inf], "volume",
125               "Shorter side of the parallelepiped"],
126              ["b_side", "Ang", 75, [0, inf], "volume",
127               "Second side of the parallelepiped"],
128              ["c_side", "Ang", 400, [0, inf], "volume",
129               "Larger side of the parallelepiped"],
130              ["theta", "degrees", 60, [-inf, inf], "orientation",
131               "In plane angle"],
132              ["phi", "degrees", 60, [-inf, inf], "orientation",
133               "Out of plane angle"],
134              ["psi", "degrees", 60, [-inf, inf], "orientation",
135               "Rotation angle around its own c axis against q plane"],
136             ]
137
138source = ["lib/J1.c", "lib/gauss76.c", "parallelepiped.c"]
139
140def ER(a_side, b_side, c_side):
141
142    # surface average radius (rough approximation)
143    surf_rad = sqrt(a_side * b_side / pi)
144
145    # DiamCyl recoded here (to check and possibly put in a library?)
146    a = surf_rad
147    b = 0.5 * c_side
148    t1 = a * a * b
149    t2 = 1.0 + (b / a) * (1.0 + a / b / 2.0) * (1.0 + pi * a / b / 2.0)
150    ddd = 3.0 * t1 * t2
151
152    return 0.5 * (ddd) ** (1. / 3.)
153
154# parameters for demo
155demo = dict(scale=1, background=0,
156            sld=6.3e-6, solvent_sld=1.0e-6,
157            a_side=35, b_side=75, c_side=400,
158            theta=45, phi=30, psi=15,
159            a_side_pd=0.1, a_side_pd_n=10,
160            b_side_pd=0.1, b_side_pd_n=1,
161            c_side_pd=0.1, c_side_pd_n=1,
162            theta_pd=10, theta_pd_n=1,
163            phi_pd=10, phi_pd_n=1,
164            psi_pd=10, psi_pd_n=10)
165
166# For testing against the old sasview models, include the converted parameter
167# names and the target sasview model name.
168oldname = 'ParallelepipedModel'
169oldpars = dict(theta='parallel_theta', phi='parallel_phi', psi='parallel_psi',
170               a_side='short_a', b_side='short_b', c_side='long_c',
171               sld='sldPipe', solvent_sld='sldSolv')
172
Note: See TracBrowser for help on using the repository browser.