source: sasmodels/sasmodels/models/fcc_paracrystal.py @ 404ebbd

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 404ebbd was 404ebbd, checked in by Paul Kienzle <pkienzle@…>, 7 years ago

tuned random model generation for more models

  • Property mode set to 100644
File size: 6.1 KB
Line 
1#fcc paracrystal model
2#note model title and parameter table are automatically inserted
3#note - calculation requires double precision
4r"""
5Calculates the scattering from a **face-centered cubic lattice** with
6paracrystalline distortion. Thermal vibrations are considered to be
7negligible, and the size of the paracrystal is infinitely large.
8Paracrystalline distortion is assumed to be isotropic and characterized by
9a Gaussian distribution.
10
11Definition
12----------
13
14The scattering intensity $I(q)$ is calculated as
15
16.. math::
17
18    I(q) = \frac{\text{scale}}{V_p} V_\text{lattice} P(q) Z(q)
19
20where *scale* is the volume fraction of spheres, $V_p$ is the volume of
21the primary particle, $V_\text{lattice}$ is a volume correction for the crystal
22structure, $P(q)$ is the form factor of the sphere (normalized), and $Z(q)$
23is the paracrystalline structure factor for a face-centered cubic structure.
24
25Equation (1) of the 1990 reference is used to calculate $Z(q)$, using
26equations (23)-(25) from the 1987 paper for $Z1$, $Z2$, and $Z3$.
27
28The lattice correction (the occupied volume of the lattice) for a
29face-centered cubic structure of particles of radius $R$ and nearest
30neighbor separation $D$ is
31
32.. math::
33
34   V_\text{lattice} = \frac{16\pi}{3}\frac{R^3}{\left(D\sqrt{2}\right)^3}
35
36The distortion factor (one standard deviation) of the paracrystal is
37included in the calculation of $Z(q)$
38
39.. math::
40
41    \Delta a = gD
42
43where $g$ is a fractional distortion based on the nearest neighbor distance.
44
45.. figure:: img/fcc_geometry.jpg
46
47    Face-centered cubic lattice.
48
49For a crystal, diffraction peaks appear at reduced q-values given by
50
51.. math::
52
53    \frac{qD}{2\pi} = \sqrt{h^2 + k^2 + l^2}
54
55where for a face-centered cubic lattice $h, k , l$ all odd or all
56even are allowed and reflections where $h, k, l$ are mixed odd/even
57are forbidden. Thus the peak positions correspond to (just the first 5)
58
59.. math::
60
61    \begin{array}{cccccc}
62    q/q_0 & 1 & \sqrt{4/3} & \sqrt{8/3} & \sqrt{11/3} & \sqrt{4} \\
63    \text{Indices} & (111)  & (200) & (220) & (311) & (222)
64    \end{array}
65
66**NB**: The calculation of $Z(q)$ is a double numerical integral that
67must be carried out with a high density of points to properly capture
68the sharp peaks of the paracrystalline scattering. So be warned that the
69calculation is SLOW. Go get some coffee. Fitting of any experimental data
70must be resolution smeared for any meaningful fit. This makes a triple
71integral. Very, very slow. Go get lunch!
72
73The 2D (Anisotropic model) is based on the reference below where $I(q)$ is
74approximated for 1d scattering. Thus the scattering pattern for 2D may not
75be accurate. Note that we are not responsible for any incorrectness of the
762D model computation.
77
78.. figure:: img/parallelepiped_angle_definition.png
79
80    Orientation of the crystal with respect to the scattering plane, when
81    $\theta = \phi = 0$ the $c$ axis is along the beam direction (the $z$ axis).
82
83References
84----------
85
86Hideki Matsuoka et. al. *Physical Review B*, 36 (1987) 1754-1765
87(Original Paper)
88
89Hideki Matsuoka et. al. *Physical Review B*, 41 (1990) 3854 -3856
90(Corrections to FCC and BCC lattice structure calculation)
91"""
92
93from numpy import inf, pi
94
95name = "fcc_paracrystal"
96title = "Face-centred cubic lattic with paracrystalline distortion"
97description = """
98    Calculates the scattering from a **face-centered cubic lattice** with paracrystalline distortion. Thermal vibrations
99    are considered to be negligible, and the size of the paracrystal is infinitely large. Paracrystalline distortion is
100    assumed to be isotropic and characterized by a Gaussian distribution.
101    """
102category = "shape:paracrystal"
103
104single = False
105
106# pylint: disable=bad-whitespace, line-too-long
107#             ["name", "units", default, [lower, upper], "type","description"],
108parameters = [["dnn", "Ang", 220, [-inf, inf], "", "Nearest neighbour distance"],
109              ["d_factor", "", 0.06, [-inf, inf], "", "Paracrystal distortion factor"],
110              ["radius", "Ang", 40, [0, inf], "volume", "Particle radius"],
111              ["sld", "1e-6/Ang^2", 4, [-inf, inf], "sld", "Particle scattering length density"],
112              ["sld_solvent", "1e-6/Ang^2", 1, [-inf, inf], "sld", "Solvent scattering length density"],
113              ["theta",       "degrees",    60,    [-360, 360], "orientation", "c axis to beam angle"],
114              ["phi",         "degrees",    60,    [-360, 360], "orientation", "rotation about beam"],
115              ["psi",         "degrees",    60,    [-360, 360], "orientation", "rotation about c axis"]
116             ]
117# pylint: enable=bad-whitespace, line-too-long
118
119source = ["lib/sas_3j1x_x.c", "lib/gauss150.c", "lib/sphere_form.c", "fcc_paracrystal.c"]
120
121def random():
122    import numpy as np
123    # Define lattice spacing as a multiple of the particle radius
124    # using the formulat a = 4 r/sqrt(3).  Systems which are ordered
125    # are probably mostly filled, so use a distribution which goes from
126    # zero to one, but leaving 90% of them within 80% of the
127    # maximum bcc packing.  Lattice distortion values are empirically
128    # useful between 0.01 and 0.7.  Use an exponential distribution
129    # in this range 'cuz its easy.
130    dnn_fraction = np.random.beta(a=10, b=1)
131    pars = dict(
132        #sld=1, sld_solvent=0, scale=1, background=1e-32,
133        radius=10**np.random.uniform(1.3, 4),
134        d_factor=10**np.random.uniform(-2, -0.7),  # sigma_d in 0.01-0.7
135    )
136    pars['dnn'] = pars['radius']*4/np.sqrt(3)/dnn_fraction
137    #pars['scale'] = 1/(0.68*dnn_fraction**3)  # bcc packing fraction is 0.68
138    pars['scale'] = 1
139    return pars
140
141# parameters for demo
142demo = dict(scale=1, background=0,
143            dnn=220, d_factor=0.06, sld=4, sld_solvent=1,
144            radius=40,
145            theta=60, phi=60, psi=60,
146            radius_pd=.2, radius_pd_n=0.2,
147            theta_pd=15, theta_pd_n=0,
148            phi_pd=15, phi_pd_n=0,
149            psi_pd=15, psi_pd_n=0,
150           )
151# april 10 2017, rkh add unit tests, NOT compared with any other calc method, assume correct!
152q =4.*pi/220.
153tests = [
154    [{ },
155     [0.001, q, 0.215268], [0.275164706668, 5.7776842567, 0.00958167119232]],
156     [{}, (-0.047,-0.007), 238.103096286],
157     [{}, (0.053,0.063), 0.863609587796 ],
158]
Note: See TracBrowser for help on using the repository browser.