source: sasmodels/sasmodels/models/fractal_core_shell.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.0 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        scale=1e3/total_radius**(fractal_dim/2),
116        volfraction=volfraction,
117        radius=radius,
118        cor_length=cor_length,
119        fractal_dim=fractal_dim,
120    )
121    return pars
122
123
124demo = dict(scale=0.05,
125            background=0,
126            radius=20,
127            thickness=5,
128            sld_core=3.5,
129            sld_shell=1.0,
130            sld_solvent=6.35,
131            volfraction=0.05,
132            fractal_dim=2.0,
133            cor_length=100.0)
134
135def ER(radius, thickness):
136    """
137        Equivalent radius
138        @param radius: core radius
139        @param thickness: shell thickness
140    """
141    return radius + thickness
142
143def VR(radius, thickness):
144    """
145        Volume ratio
146        @param radius: core radius
147        @param thickness: shell thickness
148    """
149    whole = 4.0/3.0 * pi * (radius + thickness)**3
150    core = 4.0/3.0 * pi * radius**3
151    return whole, whole-core
152
153tests = [[{'radius': 20.0, 'thickness': 10.0}, 'ER', 30.0],
154         [{'radius': 20.0, 'thickness': 10.0}, 'VR', 0.703703704]]
155
156#         # The SasView test result was 0.00169, with a background of 0.001
157#         # They are however wrong as we now know.  IGOR might be a more
158#         # appropriate source. Otherwise will just have to assume this is now
159#         # correct and self generate a correct answer for the future. Until we
160#         # figure it out leave the tests commented out
161#         [{'radius': 60.0,
162#           'thickness': 10.0,
163#           'sld_core': 1.0,
164#           'sld_shell': 2.0,
165#           'sld_solvent': 3.0,
166#           'background': 0.0
167#          }, 0.015211, 692.84]]
Note: See TracBrowser for help on using the repository browser.