source: sasmodels/sasmodels/models/fractal_core_shell.py @ 64eecf7

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

Merge branch 'master' into ticket-510

  • Property mode set to 100644
File size: 5.9 KB
RevLine 
[7d4b2ae]1r"""
2Definition
3----------
[07300ea]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.
[7d4b2ae]10
11.. math::
12
[07300ea]13    I(q) = P(q)S(q) + \text{background}
[7d4b2ae]14
[07300ea]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:
[7d4b2ae]18
19.. math::
20
[07300ea]21    P(q) &= \frac{\phi}{V_s}\left[3V_c(\rho_c-\rho_s)
[7d4b2ae]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
[efb7615]26    S(q) &= 1 + \frac{D_f\ \Gamma\!(D_f-1)}{[1+1/(q\xi)^2]^{(D_f-1)/2}}
[07300ea]27    \frac{\sin[(D_f-1)\tan^{-1}(q\xi)]}{(qr_s)^{D_f}}
[7d4b2ae]28
[07300ea]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
[efb7615]33of the whole particle respectively, $D_f$ is the fractal dimension, and $\xi$ the
[07300ea]34correlation length.
[efb7615]35
[07300ea]36Polydispersity of radius and thickness are also provided for.
[7d4b2ae]37
[07300ea]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
[7d4b2ae]40
41.. math::
42
43    q = \sqrt{q_x^2 + q_y^2}
44
[07300ea]45Our model is derived from the form factor calculations implemented in IGOR
46macros by the NIST Center for Neutron Research\ [#Kline]_
47
[aad336c]48References
49----------
[7d4b2ae]50
[07300ea]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
[7d4b2ae]60
61"""
62
63from numpy import pi, inf
64
65name = "fractal_core_shell"
[07300ea]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    """
[7d4b2ae]81category = "shape-independent"
82
83# pylint: disable=bad-whitespace, line-too-long
84#   ["name", "units", default, [lower, upper], "type","description"],
85parameters = [
[6d96b66]86    ["radius",      "Ang",        60.0, [0.0, inf],  "volume", "Sphere core radius"],
87    ["thickness",   "Ang",        10.0, [0.0, inf],  "volume", "Sphere shell thickness"],
[42356c8]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"],
[6d96b66]91    ["volfraction", "",           1.0,  [0.0, inf],  "",       "Volume fraction of building block spheres"],
[217590b]92    ["fractal_dim",    "",        2.0,  [0.0, 6.0],  "",       "Fractal dimension"],
[6d96b66]93    ["cor_length",  "Ang",      100.0,  [0.0, inf],  "",       "Correlation length of fractal-like aggregates"],
94]
[7d4b2ae]95# pylint: enable=bad-whitespace, line-too-long
96
[925ad6e]97source = ["lib/sas_3j1x_x.c", "lib/sas_gamma.c", "lib/core_shell.c",
[217590b]98          "lib/fractal_sq.c", "fractal_core_shell.c"]
[7d4b2ae]99
[404ebbd]100def random():
101    import numpy as np
[8f04da4]102    outer_radius = 10**np.random.uniform(0.7, 4)
103    # Use a distribution with a preference for thin shell or thin core
104    # Avoid core,shell radii < 1
105    thickness = np.random.beta(0.5, 0.5)*(outer_radius-2) + 1
106    radius = outer_radius - thickness
107    cor_length = 10**np.random.uniform(0.7, 2)*outer_radius
[404ebbd]108    volfraction = 10**np.random.uniform(-3, -1)
109    fractal_dim = 2*np.random.beta(3, 4) + 1
110    pars = dict(
111        #background=0, sld_block=1, sld_solvent=0,
112        volfraction=volfraction,
113        radius=radius,
114        cor_length=cor_length,
115        fractal_dim=fractal_dim,
116    )
117    return pars
118
[7d4b2ae]119demo = dict(scale=0.05,
120            background=0,
121            radius=20,
122            thickness=5,
[aad336c]123            sld_core=3.5,
124            sld_shell=1.0,
125            sld_solvent=6.35,
[7d4b2ae]126            volfraction=0.05,
[a807206]127            fractal_dim=2.0,
[7d4b2ae]128            cor_length=100.0)
129
130def ER(radius, thickness):
131    """
132        Equivalent radius
133        @param radius: core radius
134        @param thickness: shell thickness
135    """
136    return radius + thickness
137
138def VR(radius, thickness):
139    """
140        Volume ratio
141        @param radius: core radius
142        @param thickness: shell thickness
143    """
[4962519]144    whole = 4.0/3.0 * pi * (radius + thickness)**3
145    core = 4.0/3.0 * pi * radius**3
[7d4b2ae]146    return whole, whole-core
147
148tests = [[{'radius': 20.0, 'thickness': 10.0}, 'ER', 30.0],
[d6f60c3]149         [{'radius': 20.0, 'thickness': 10.0}, 'VR', 0.703703704]]
150
151#         # The SasView test result was 0.00169, with a background of 0.001
152#         # They are however wrong as we now know.  IGOR might be a more
153#         # appropriate source. Otherwise will just have to assume this is now
154#         # correct and self generate a correct answer for the future. Until we
155#         # figure it out leave the tests commented out
156#         [{'radius': 60.0,
157#           'thickness': 10.0,
158#           'sld_core': 1.0,
159#           'sld_shell': 2.0,
160#           'sld_solvent': 3.0,
161#           'background': 0.0
162#          }, 0.015211, 692.84]]
Note: See TracBrowser for help on using the repository browser.