source: sasmodels/sasmodels/models/bcc_paracrystal.py @ bd91e8f

ticket_1156
Last change on this file since bd91e8f was bd91e8f, checked in by Paul Kienzle <pkienzle@…>, 5 years ago

Merge branch 'master' into ticket_1156

  • Property mode set to 100644
File size: 7.1 KB
RevLine 
[6272968]1r"""
[b297ba9]2.. warning:: This model and this model description are under review following
3             concerns raised by SasView users. If you need to use this model,
4             please email help@sasview.org for the latest situation. *The
[da7b26b]5             SasView Developers. September 2018.*
6
[b0c4271]7Definition
8----------
9
[a5d0d00]10Calculates the scattering from a **body-centered cubic lattice** with
11paracrystalline distortion. Thermal vibrations are considered to be negligible,
12and the size of the paracrystal is infinitely large. Paracrystalline distortion
13is assumed to be isotropic and characterized by a Gaussian distribution.
[754c454]14
[a5d0d00]15The scattering intensity $I(q)$ is calculated as
[754c454]16
[eb69cce]17.. math::
[754c454]18
[eb69cce]19    I(q) = \frac{\text{scale}}{V_p} V_\text{lattice} P(q) Z(q)
[754c454]20
[eb69cce]21where *scale* is the volume fraction of spheres, $V_p$ is the volume of the
22primary particle, $V_\text{lattice}$ is a volume correction for the crystal
[a5d0d00]23structure, $P(q)$ is the form factor of the sphere (normalized), and $Z(q)$
24is the paracrystalline structure factor for a body-centered cubic structure.
[754c454]25
[b0c4271]26Equation (1) of the 1990 reference\ [#CIT1990]_ is used to calculate $Z(q)$,
27using equations (29)-(31) from the 1987 paper\ [#CIT1987]_ for $Z1$, $Z2$, and
28$Z3$.
[754c454]29
[a5d0d00]30The lattice correction (the occupied volume of the lattice) for a
31body-centered cubic structure of particles of radius $R$ and nearest neighbor
32separation $D$ is
[754c454]33
[eb69cce]34.. math::
[754c454]35
[e7e9231]36    V_\text{lattice} = \frac{8\pi}{3} \frac{R^3}{\left(2D/\sqrt{3}\right)^3}
[a5d0d00]37
38
39The distortion factor (one standard deviation) of the paracrystal is included
40in the calculation of $Z(q)$
41
[eb69cce]42.. math::
[a5d0d00]43
44    \Delta a = g D
45
46where $g$ is a fractional distortion based on the nearest neighbor distance.
[754c454]47
48
[2f0c07d]49.. figure:: img/bcc_geometry.jpg
[d138d43]50
51    Body-centered cubic lattice.
[754c454]52
53For a crystal, diffraction peaks appear at reduced q-values given by
54
[eb69cce]55.. math::
[a5d0d00]56
57    \frac{qD}{2\pi} = \sqrt{h^2 + k^2 + l^2}
58
59where for a body-centered cubic lattice, only reflections where
60$(h + k + l) = \text{even}$ are allowed and reflections where
61$(h + k + l) = \text{odd}$ are forbidden. Thus the peak positions
62correspond to (just the first 5)
[754c454]63
[eb69cce]64.. math::
[754c454]65
[eb69cce]66    \begin{array}{lccccc}
67    q/q_o          &   1   & \sqrt{2} & \sqrt{3} & \sqrt{4} & \sqrt{5} \\
68    \text{Indices} & (110) &    (200) & (211)    & (220)    & (310)    \\
69    \end{array}
[754c454]70
[eda8b30]71.. note::
72
73  The calculation of $Z(q)$ is a double numerical integral that
74  must be carried out with a high density of points to properly capture
[1f159bd]75  the sharp peaks of the paracrystalline scattering.
76  So be warned that the calculation is slow. Fitting of any experimental data
[eda8b30]77  must be resolution smeared for any meaningful fit. This makes a triple integral
78  which may be very slow.
[1f159bd]79
[a5d0d00]80This example dataset is produced using 200 data points,
81*qmin* = 0.001 |Ang^-1|, *qmax* = 0.1 |Ang^-1| and the above default values.
[754c454]82
[a5d0d00]83The 2D (Anisotropic model) is based on the reference below where $I(q)$ is
84approximated for 1d scattering. Thus the scattering pattern for 2D may not
[1f159bd]85be accurate, particularly at low $q$. For general details of the calculation and angular
[eda8b30]86dispersions for oriented particles see :ref:`orientation` .
87Note that we are not responsible for any incorrectness of the 2D model computation.
[754c454]88
[1f65db5]89.. figure:: img/parallelepiped_angle_definition.png
[d138d43]90
[0bdddc2]91    Orientation of the crystal with respect to the scattering plane, when
[1f65db5]92    $\theta = \phi = 0$ the $c$ axis is along the beam direction (the $z$ axis).
[754c454]93
[eb69cce]94References
95----------
[754c454]96
[b0c4271]97.. [#CIT1987] Hideki Matsuoka et. al. *Physical Review B*, 36 (1987) 1754-1765
98   (Original Paper)
99.. [#CIT1990] Hideki Matsuoka et. al. *Physical Review B*, 41 (1990) 3854 -3856
100   (Corrections to FCC and BCC lattice structure calculation)
[754c454]101
[0507e09]102Source
103------
104
105`bcc_paracrystal.py <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/bcc_paracrystal.py>`_
106
107`bcc_paracrystal.c <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/bcc_paracrystal.c>`_
108
[b0c4271]109Authorship and Verification
[da7b26b]110---------------------------
[b0c4271]111
112* **Author:** NIST IGOR/DANSE **Date:** pre 2010
[e7e9231]113* **Last Modified by:** Paul Butler **Date:** September 16, 2018
114* **Last Reviewed by:** Paul Butler **Date:** September 16, 2018
[754c454]115"""
116
[2d81cfe]117import numpy as np
[0b56f38]118from numpy import inf, pi
[754c454]119
[e166cb9]120name = "bcc_paracrystal"
[754c454]121title = "Body-centred cubic lattic with paracrystalline distortion"
122description = """
[dcdf29d]123    Calculates the scattering from a **body-centered cubic lattice** with
124    paracrystalline distortion. Thermal vibrations are considered to be
125    negligible, and the size of the paracrystal is infinitely large.
126    Paracrystalline distortion is assumed to be isotropic and characterized
127    by a Gaussian distribution.
[754c454]128    """
[485aee2]129category = "shape:paracrystal"
[13ed84c]130
[b0c4271]131#note - calculation requires double precision
[13ed84c]132single = False
133
[dcdf29d]134# pylint: disable=bad-whitespace, line-too-long
[485aee2]135#             ["name", "units", default, [lower, upper], "type","description" ],
[6530963]136parameters = [["lattice_spacing",         "Ang",       220,    [-inf, inf], "",            "Lattice spacing"],
137              ["lattice_distortion",    "",            0.06, [-inf, inf], "",            "Paracrystal distortion factor"],
[dcdf29d]138              ["radius",      "Ang",        40,    [0, inf],    "volume",      "Particle radius"],
[42356c8]139              ["sld",         "1e-6/Ang^2",  4,    [-inf, inf], "sld",         "Particle scattering length density"],
140              ["sld_solvent", "1e-6/Ang^2",  1,    [-inf, inf], "sld",         "Solvent scattering length density"],
[9b79f29]141              ["theta",       "degrees",    60,    [-360, 360], "orientation", "c axis to beam angle"],
142              ["phi",         "degrees",    60,    [-360, 360], "orientation", "rotation about beam"],
143              ["psi",         "degrees",    60,    [-360, 360], "orientation", "rotation about c axis"]
[485aee2]144             ]
[dcdf29d]145# pylint: enable=bad-whitespace, line-too-long
[485aee2]146
[925ad6e]147source = ["lib/sas_3j1x_x.c", "lib/gauss150.c", "lib/sphere_form.c", "bcc_paracrystal.c"]
[754c454]148
[0bdddc2]149def random():
[b297ba9]150    """Return a random parameter set for the model."""
[0bdddc2]151    # Define lattice spacing as a multiple of the particle radius
152    # using the formulat a = 4 r/sqrt(3).  Systems which are ordered
153    # are probably mostly filled, so use a distribution which goes from
154    # zero to one, but leaving 90% of them within 80% of the
155    # maximum bcc packing.  Lattice distortion values are empirically
156    # useful between 0.01 and 0.7.  Use an exponential distribution
157    # in this range 'cuz its easy.
[1511c37c]158    radius = 10**np.random.uniform(1.3, 4)
[6530963]159    lattice_distortion = 10**np.random.uniform(-2, -0.7)  # sigma_d in 0.01-0.7
160    lattice_spacing_fraction = np.random.beta(a=10, b=1)
161    lattice_spacing = radius*4/np.sqrt(3)/lattice_spacing_fraction
[0bdddc2]162    pars = dict(
163        #sld=1, sld_solvent=0, scale=1, background=1e-32,
[6530963]164        lattice_spacing=lattice_spacing,
165        lattice_distortion=lattice_distortion,
[1511c37c]166        radius=radius,
[0bdddc2]167    )
168    return pars
169
[0b56f38]170# april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct!
[e2d6e3b]171# add 2d test later
[1f159bd]172# TODO: fix the 2d tests
[8f04da4]173q = 4.*pi/220.
[0b56f38]174tests = [
[8f04da4]175    [{}, [0.001, q, 0.215268], [1.46601394721, 2.85851284174, 0.00866710287078]],
[1f159bd]176    #[{'theta': 20.0, 'phi': 30, 'psi': 40.0}, (-0.017, 0.035), 2082.20264399],
177    #[{'theta': 20.0, 'phi': 30, 'psi': 40.0}, (-0.081, 0.011), 0.436323144781],
[69e1afc]178    ]
Note: See TracBrowser for help on using the repository browser.