source: sasmodels/sasmodels/models/fractal_core_shell.py @ 2d81cfe

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 2d81cfe was 2d81cfe, checked in by Paul Kienzle <pkienzle@…>, 6 years ago

lint

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