1 | r""" |
---|
2 | Definition |
---|
3 | ---------- |
---|
4 | |
---|
5 | The binary hard sphere model provides the scattering intensity, for binary |
---|
6 | mixture of hard spheres including hard sphere interaction between those |
---|
7 | particles, using rhw Percus-Yevick closure. The calculation is an exact |
---|
8 | multi-component solution that properly accounts for the 3 partial structure |
---|
9 | factors as follows: |
---|
10 | |
---|
11 | .. math:: |
---|
12 | |
---|
13 | I(q) = (1-x)f_1^2(q) S_{11}(q) + 2[x(1-x)]^{1/2} f_1(q)f_2(q)S_{12}(q) + |
---|
14 | x\,f_2^2(q)S_{22}(q) |
---|
15 | |
---|
16 | where $S_{ij}$ are the partial structure factors and $f_i$ are the scattering |
---|
17 | amplitudes of the particles. The subscript 1 is for the smaller particle and 2 |
---|
18 | is for the larger. The number fraction of the larger particle, |
---|
19 | ($x = n2/(n1+n2)$, where $n$ = the number density) is internally calculated |
---|
20 | based on the diameter ratio and the volume fractions. |
---|
21 | |
---|
22 | .. math:: |
---|
23 | :nowrap: |
---|
24 | |
---|
25 | \begin{align*} |
---|
26 | x &= \frac{(\phi_2 / \phi)\alpha^3}{(1-(\phi_2/\phi) + (\phi_2/\phi) |
---|
27 | \alpha^3)} \\ |
---|
28 | \phi &= \phi_1 + \phi_2 = \text{total volume fraction} \\ |
---|
29 | \alpha &= R_1/R_2 = \text{size ratio} |
---|
30 | \end{align*} |
---|
31 | |
---|
32 | The 2D scattering intensity is the same as 1D, regardless of the orientation of |
---|
33 | the *q* vector which is defined as |
---|
34 | |
---|
35 | .. math:: |
---|
36 | |
---|
37 | q = \sqrt{q_x^2 + q_y^2} |
---|
38 | |
---|
39 | |
---|
40 | **NOTE 1:** The volume fractions and the scattering contrasts are loosely |
---|
41 | correlated, so holding as many parameters fixed to known values during fitting |
---|
42 | will improve the robustness of the fit. |
---|
43 | |
---|
44 | **NOTE 2:** Since the calculation uses the Percus-Yevick closure, all of the |
---|
45 | limitations of that closure relation apply here. Specifically, one should be |
---|
46 | wary of results for (total) volume fractions greater than approximately 40%. |
---|
47 | Depending on the size ratios or number fractions, the limit on total volume |
---|
48 | fraction may be lower. |
---|
49 | |
---|
50 | **NOTE 3:** The heavy arithmatic operations also mean that at present the |
---|
51 | function is poorly behaved at very low qr. In some cases very large qr may |
---|
52 | also be poorly behaved. These should however be outside any useful region of |
---|
53 | qr. |
---|
54 | |
---|
55 | The code for this model is based originally on a c-library implementation by the |
---|
56 | NIST Center for Neutron Research (Kline, 2006). |
---|
57 | |
---|
58 | See the references for details. |
---|
59 | |
---|
60 | References |
---|
61 | ---------- |
---|
62 | |
---|
63 | .. [#] N W Ashcroft and D C Langreth, *Physical Review*, 156 (1967) 685-692 |
---|
64 | [Errata found in *Phys. Rev.* 166 (1968) 934] |
---|
65 | .. [#] S R Kline, *J Appl. Cryst.*, 39 (2006) 895 |
---|
66 | |
---|
67 | Authorship and Verification |
---|
68 | ---------------------------- |
---|
69 | |
---|
70 | * **Author:** NIST IGOR/DANSE **Date:** pre 2010 |
---|
71 | * **Last Modified by:** Paul Butler **Date:** March 20, 2016 |
---|
72 | * **Last Reviewed by:** Paul Butler **Date:** March 20, 2016 |
---|
73 | """ |
---|
74 | |
---|
75 | import numpy as np |
---|
76 | from numpy import inf |
---|
77 | |
---|
78 | category = "shape:sphere" |
---|
79 | single = False # double precision only! |
---|
80 | |
---|
81 | name = "binary_hard_sphere" |
---|
82 | title = "binary mixture of hard spheres with hard sphere interactions." |
---|
83 | description = """Describes the scattering from a mixture of two distinct |
---|
84 | monodisperse, hard sphere particles. |
---|
85 | [Parameters]; |
---|
86 | radius_lg: large radius of binary hard sphere, |
---|
87 | radius_sm: small radius of binary hard sphere, |
---|
88 | volfraction_lg: volume fraction of large spheres, |
---|
89 | volfraction_sm: volume fraction of small spheres, |
---|
90 | sld_lg: large sphere scattering length density, |
---|
91 | sld_sm: small sphere scattering length density, |
---|
92 | sld_solvent: solvent scattering length density. |
---|
93 | """ |
---|
94 | # ["name", "units", default, [lower, upper], "type", "description"], |
---|
95 | parameters = [["radius_lg", "Ang", 100, [0, inf], "", |
---|
96 | "radius of large particle"], |
---|
97 | ["radius_sm", "Ang", 25, [0, inf], "", |
---|
98 | "radius of small particle"], |
---|
99 | ["volfraction_lg", "", 0.1, [0, 1], "", |
---|
100 | "volume fraction of large particle"], |
---|
101 | ["volfraction_sm", "", 0.2, [0, 1], "", |
---|
102 | "volume fraction of small particle"], |
---|
103 | ["sld_lg", "1e-6/Ang^2", 3.5, [-inf, inf], "sld", |
---|
104 | "scattering length density of large particle"], |
---|
105 | ["sld_sm", "1e-6/Ang^2", 0.5, [-inf, inf], "sld", |
---|
106 | "scattering length density of small particle"], |
---|
107 | ["sld_solvent", "1e-6/Ang^2", 6.36, [-inf, inf], "sld", |
---|
108 | "Solvent scattering length density"], |
---|
109 | ] |
---|
110 | |
---|
111 | source = ["lib/sas_3j1x_x.c", "binary_hard_sphere.c"] |
---|
112 | |
---|
113 | def random(): |
---|
114 | """Return a random parameter set for the model.""" |
---|
115 | # TODO: binary_hard_sphere fails at low qr |
---|
116 | radius_lg = 10**np.random.uniform(2, 4.7) |
---|
117 | radius_sm = 10**np.random.uniform(2, 4.7) |
---|
118 | volfraction_lg = 10**np.random.uniform(-3, -0.3) |
---|
119 | volfraction_sm = 10**np.random.uniform(-3, -0.3) |
---|
120 | # TODO: Get slightly different results if large and small are swapped |
---|
121 | # modify the model so it doesn't care which is which |
---|
122 | if radius_lg < radius_sm: |
---|
123 | radius_lg, radius_sm = radius_sm, radius_lg |
---|
124 | volfraction_lg, volfraction_sm = volfraction_sm, volfraction_lg |
---|
125 | pars = dict( |
---|
126 | radius_lg=radius_lg, |
---|
127 | radius_sm=radius_sm, |
---|
128 | volfraction_lg=volfraction_lg, |
---|
129 | volfraction_sm=volfraction_sm, |
---|
130 | ) |
---|
131 | return pars |
---|
132 | |
---|
133 | # parameters for demo and documentation |
---|
134 | demo = dict(sld_lg=3.5, sld_sm=0.5, sld_solvent=6.36, |
---|
135 | radius_lg=100, radius_sm=20, |
---|
136 | volfraction_lg=0.1, volfraction_sm=0.2) |
---|
137 | |
---|
138 | # NOTE: test results taken from values returned by SasView 3.1.2 |
---|
139 | tests = [[{}, 0.001, 25.8927262013]] |
---|