source: sasmodels/sasmodels/models/fractal_core_shell.py @ d49ca5c

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since d49ca5c 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
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
[404ebbd]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
33of the whole particle respectively, $D_f$ is the fractal dimension, and |xi| the
34correlation length.
[404ebbd]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
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
[7d4b2ae]124demo = dict(scale=0.05,
125            background=0,
126            radius=20,
127            thickness=5,
[aad336c]128            sld_core=3.5,
129            sld_shell=1.0,
130            sld_solvent=6.35,
[7d4b2ae]131            volfraction=0.05,
[a807206]132            fractal_dim=2.0,
[7d4b2ae]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    """
[4962519]149    whole = 4.0/3.0 * pi * (radius + thickness)**3
150    core = 4.0/3.0 * pi * radius**3
[7d4b2ae]151    return whole, whole-core
152
153tests = [[{'radius': 20.0, 'thickness': 10.0}, 'ER', 30.0],
[d6f60c3]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.