[115d0f0] | 1 | r""" |
---|
[e481a39] | 2 | Definition |
---|
| 3 | ---------- |
---|
[b0c4271] | 4 | |
---|
[115d0f0] | 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 |
---|
[e481a39] | 9 | factors as follows: |
---|
[115d0f0] | 10 | |
---|
| 11 | .. math:: |
---|
| 12 | |
---|
[e481a39] | 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) |
---|
[115d0f0] | 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:: |
---|
[63c6a08] | 23 | :nowrap: |
---|
[115d0f0] | 24 | |
---|
[30b60d2] | 25 | \begin{align*} |
---|
[63c6a08] | 26 | x &= \frac{(\phi_2 / \phi)\alpha^3}{(1-(\phi_2/\phi) + (\phi_2/\phi) |
---|
[e481a39] | 27 | \alpha^3)} \\ |
---|
[63c6a08] | 28 | \phi &= \phi_1 + \phi_2 = \text{total volume fraction} \\ |
---|
| 29 | \alpha &= R_1/R_2 = \text{size ratio} |
---|
[30b60d2] | 30 | \end{align*} |
---|
[115d0f0] | 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 | |
---|
[b0c4271] | 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 |
---|
[115d0f0] | 66 | |
---|
[b0c4271] | 67 | Authorship and Verification |
---|
| 68 | ---------------------------- |
---|
[115d0f0] | 69 | |
---|
[b0c4271] | 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 |
---|
[115d0f0] | 73 | """ |
---|
| 74 | |
---|
[2d81cfe] | 75 | import numpy as np |
---|
[e481a39] | 76 | from numpy import inf |
---|
| 77 | |
---|
| 78 | category = "shape:sphere" |
---|
| 79 | single = False # double precision only! |
---|
[115d0f0] | 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"], |
---|
[42356c8] | 103 | ["sld_lg", "1e-6/Ang^2", 3.5, [-inf, inf], "sld", |
---|
[115d0f0] | 104 | "scattering length density of large particle"], |
---|
[42356c8] | 105 | ["sld_sm", "1e-6/Ang^2", 0.5, [-inf, inf], "sld", |
---|
[115d0f0] | 106 | "scattering length density of small particle"], |
---|
[42356c8] | 107 | ["sld_solvent", "1e-6/Ang^2", 6.36, [-inf, inf], "sld", |
---|
[115d0f0] | 108 | "Solvent scattering length density"], |
---|
| 109 | ] |
---|
| 110 | |
---|
[925ad6e] | 111 | source = ["lib/sas_3j1x_x.c", "binary_hard_sphere.c"] |
---|
[115d0f0] | 112 | |
---|
[8f04da4] | 113 | def random(): |
---|
| 114 | # TODO: binary_hard_sphere fails at low qr |
---|
| 115 | radius_lg = 10**np.random.uniform(2, 4.7) |
---|
| 116 | radius_sm = 10**np.random.uniform(2, 4.7) |
---|
| 117 | volfraction_lg = 10**np.random.uniform(-3, -0.3) |
---|
| 118 | volfraction_sm = 10**np.random.uniform(-3, -0.3) |
---|
| 119 | # TODO: Get slightly different results if large and small are swapped |
---|
| 120 | # modify the model so it doesn't care which is which |
---|
| 121 | if radius_lg < radius_sm: |
---|
| 122 | radius_lg, radius_sm = radius_sm, radius_lg |
---|
| 123 | volfraction_lg, volfraction_sm = volfraction_sm, volfraction_lg |
---|
| 124 | pars = dict( |
---|
| 125 | radius_lg=radius_lg, |
---|
| 126 | radius_sm=radius_sm, |
---|
| 127 | volfraction_lg=volfraction_lg, |
---|
| 128 | volfraction_sm=volfraction_sm, |
---|
| 129 | ) |
---|
| 130 | return pars |
---|
| 131 | |
---|
[115d0f0] | 132 | # parameters for demo and documentation |
---|
[e481a39] | 133 | demo = dict(sld_lg=3.5, sld_sm=0.5, sld_solvent=6.36, |
---|
[115d0f0] | 134 | radius_lg=100, radius_sm=20, |
---|
| 135 | volfraction_lg=0.1, volfraction_sm=0.2) |
---|
| 136 | |
---|
| 137 | # NOTE: test results taken from values returned by SasView 3.1.2 |
---|
[e481a39] | 138 | tests = [[{}, 0.001, 25.8927262013]] |
---|