source: sasmodels/sasmodels/models/fractal_core_shell.py @ 1511c37c

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

tuned random model generation for more models

  • Property mode set to 100644
File size: 5.9 KB
Line 
1r"""
2Definition
3----------
4Calculates the scattering from a fractal structure with a primary building
5block of core-shell spheres, as opposed to just homogeneous spheres in
6the fractal model. It is an extension of the well known Teixeira\ [#teixeira]_
7fractal model replacing the $P(q)$ of a solid sphere with that of a core-shell
8sphere. This model could find use for aggregates of coated particles, or
9aggregates of vesicles for example.
10
11.. math::
12
13    I(q) = P(q)S(q) + \text{background}
14
15Where $P(q)$ is the core-shell form factor and $S(q)$ is the
16Teixeira\ [#teixeira]_ fractal structure factor both of which are given again
17below:
18
19.. math::
20
21    P(q) &= \frac{\phi}{V_s}\left[3V_c(\rho_c-\rho_s)
22    \frac{\sin(qr_c)-qr_c\cos(qr_c)}{(qr_c)^3}+
23    3V_s(\rho_s-\rho_{solv})
24    \frac{\sin(qr_s)-qr_s\cos(qr_s)}{(qr_s)^3}\right]^2
25
26    S(q) &= 1 + \frac{D_f\ \Gamma\!(D_f-1)}{[1+1/(q\xi)^2]^{(D_f-1)/2}}
27    \frac{\sin[(D_f-1)\tan^{-1}(q\xi)]}{(qr_s)^{D_f}}
28
29where $\phi$ is the volume fraction of particles, $V_s$ is the volume of the
30whole particle, $V_c$ is the volume of the core, $\rho_c$, $\rho_s$, and
31$\rho_{solv}$ are the scattering length densities of the core, shell, and
32solvent respectively, $r_c$ and $r_s$ are the radius of the core and the radius
33of the whole particle respectively, $D_f$ is the fractal dimension, and |xi| the
34correlation length.
35
36Polydispersity of radius and thickness are also provided for.
37
38This model does not allow for anisotropy and thus the 2D scattering intensity
39is calculated in the same way as 1D, where the $q$ vector is defined as
40
41.. math::
42
43    q = \sqrt{q_x^2 + q_y^2}
44
45Our model is derived from the form factor calculations implemented in IGOR
46macros by the NIST Center for Neutron Research\ [#Kline]_
47
48References
49----------
50
51.. [#teixeira] J Teixeira, *J. Appl. Cryst.*, 21 (1988) 781-785
52.. [#Kline]  S R Kline, *J Appl. Cryst.*, 39 (2006) 895
53
54Authorship and Verification
55----------------------------
56
57* **Author:** NIST IGOR/DANSE **Date:** pre 2010
58* **Last Modified by:** Paul Butler and Paul Kienzle **on:** November 27, 2016
59* **Last Reviewed by:** Paul Butler and Paul Kienzle **on:** November 27, 2016
60
61"""
62
63from numpy import pi, inf
64
65name = "fractal_core_shell"
66title = "Scattering from a fractal structure formed from core shell spheres"
67description = """\
68    Model for fractal aggregates of core-shell primary particles. It is based on
69    the Teixeira model for the S(q) of a fractal * P(q) for a core-shell sphere
70
71    radius =  the radius of the core
72    thickness = thickness of the shell
73    thick_layer = thickness of a layer
74    sld_core = the SLD of the core
75    sld_shell = the SLD of the shell
76    sld_solvent = the SLD of the solvent
77    volfraction = volume fraction of core-shell particles
78    fractal_dim = fractal dimension
79    cor_length = correlation length of the fractal like aggretates
80    """
81category = "shape-independent"
82
83# pylint: disable=bad-whitespace, line-too-long
84#   ["name", "units", default, [lower, upper], "type","description"],
85parameters = [
86    ["radius",      "Ang",        60.0, [0.0, inf],  "volume", "Sphere core radius"],
87    ["thickness",   "Ang",        10.0, [0.0, inf],  "volume", "Sphere shell thickness"],
88    ["sld_core",    "1e-6/Ang^2", 1.0,  [-inf, inf], "sld",    "Sphere core scattering length density"],
89    ["sld_shell",   "1e-6/Ang^2", 2.0,  [-inf, inf], "sld",    "Sphere shell scattering length density"],
90    ["sld_solvent", "1e-6/Ang^2", 3.0,  [-inf, inf], "sld",    "Solvent scattering length density"],
91    ["volfraction", "",           1.0,  [0.0, inf],  "",       "Volume fraction of building block spheres"],
92    ["fractal_dim",    "",        2.0,  [0.0, 6.0],  "",       "Fractal dimension"],
93    ["cor_length",  "Ang",      100.0,  [0.0, inf],  "",       "Correlation length of fractal-like aggregates"],
94]
95# pylint: enable=bad-whitespace, line-too-long
96
97source = ["lib/sas_3j1x_x.c", "lib/sas_gamma.c", "lib/core_shell.c",
98          "lib/fractal_sq.c", "fractal_core_shell.c"]
99
100def random():
101    import numpy as np
102    total_radius = 10**np.random.uniform(0.7, 4)
103    core_portion = np.random.uniform(0, 1)
104    radius = total_radius * core_portion
105    thickness = total_radius - radius
106    #radius = 5
107    cor_length = 10**np.random.uniform(0.7, 2)*radius
108    #cor_length = 20*radius
109    volfraction = 10**np.random.uniform(-3, -1)
110    #volfraction = 0.05
111    fractal_dim = 2*np.random.beta(3, 4) + 1
112    #fractal_dim = 2
113    pars = dict(
114        #background=0, sld_block=1, sld_solvent=0,
115        volfraction=volfraction,
116        radius=radius,
117        cor_length=cor_length,
118        fractal_dim=fractal_dim,
119    )
120    return pars
121
122
123demo = dict(scale=0.05,
124            background=0,
125            radius=20,
126            thickness=5,
127            sld_core=3.5,
128            sld_shell=1.0,
129            sld_solvent=6.35,
130            volfraction=0.05,
131            fractal_dim=2.0,
132            cor_length=100.0)
133
134def ER(radius, thickness):
135    """
136        Equivalent radius
137        @param radius: core radius
138        @param thickness: shell thickness
139    """
140    return radius + thickness
141
142def VR(radius, thickness):
143    """
144        Volume ratio
145        @param radius: core radius
146        @param thickness: shell thickness
147    """
148    whole = 4.0/3.0 * pi * (radius + thickness)**3
149    core = 4.0/3.0 * pi * radius**3
150    return whole, whole-core
151
152tests = [[{'radius': 20.0, 'thickness': 10.0}, 'ER', 30.0],
153         [{'radius': 20.0, 'thickness': 10.0}, 'VR', 0.703703704]]
154
155#         # The SasView test result was 0.00169, with a background of 0.001
156#         # They are however wrong as we now know.  IGOR might be a more
157#         # appropriate source. Otherwise will just have to assume this is now
158#         # correct and self generate a correct answer for the future. Until we
159#         # figure it out leave the tests commented out
160#         [{'radius': 60.0,
161#           'thickness': 10.0,
162#           'sld_core': 1.0,
163#           'sld_shell': 2.0,
164#           'sld_solvent': 3.0,
165#           'background': 0.0
166#          }, 0.015211, 692.84]]
Note: See TracBrowser for help on using the repository browser.