source: sasmodels/sasmodels/models/mass_surface_fractal.py @ d86f0fc

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

lint

  • Property mode set to 100644
File size: 4.8 KB
Line 
1r"""
2
3A number of natural and commercial processes form high-surface area materials
4as a result of the vapour-phase aggregation of primary particles.
5Examples of such materials include soots, aerosols, and fume or pyrogenic
6silicas. These are all characterised by cluster mass distributions (sometimes
7also cluster size distributions) and internal surfaces that are fractal in
8nature. The scattering from such materials displays two distinct breaks in
9log-log representation, corresponding to the radius-of-gyration of the primary
10particles, $rg$, and the radius-of-gyration of the clusters (aggregates),
11$Rg$. Between these boundaries the scattering follows a power law related to
12the mass fractal dimension, $Dm$, whilst above the high-Q boundary the
13scattering follows a power law related to the surface fractal dimension of
14the primary particles, $Ds$.
15
16Definition
17----------
18
19The scattered intensity I(q) is calculated using a modified
20Ornstein-Zernicke equation
21
22.. math::
23
24    I(q) = scale \times P(q) + background \\
25    P(q) = \left\{ \left[ 1+(q^2a)\right]^{D_m/2} \times
26                   \left[ 1+(q^2b)\right]^{(6-D_s-D_m)/2}
27           \right\}^{-1} \\
28    a = R_{g}^2/(3D_m/2) \\
29    b = r_{g}^2/[-3(D_s+D_m-6)/2] \\
30    scale = scale\_factor \times NV^2 (\rho_{particle} - \rho_{solvent})^2
31
32where $R_g$ is the size of the cluster, $r_g$ is the size of the primary
33particle, $D_s$ is the surface fractal dimension, $D_m$ is the mass fractal
34dimension, $\rho_{solvent}$ is the scattering length density of the solvent,
35and $\rho_{particle}$ is the scattering length density of particles.
36
37.. note::
38
39    The surface ( $D_s$ ) and mass ( $D_m$ ) fractal dimensions are only
40    valid if $0 < surface\_dim < 6$ , $0 < mass\_dim < 6$ , and
41    $(surface\_dim + mass\_dim ) < 6$ .
42
43
44References
45----------
46
47P Schmidt, *J Appl. Cryst.*, 24 (1991) 414-435 Equation(19)
48
49A J Hurd, D W Schaefer, J E Martin, *Phys. Rev. A*,
5035 (1987) 2361-2364 Equation(2)
51"""
52
53import numpy as np
54from numpy import inf
55
56name = "mass_surface_fractal"
57title = "Mass Surface Fractal model"
58description = """
59        The scattering intensity  I(x) = scale*P(x)*S(x) + background, where
60        p(x)= {[1+(x^2*a)]^(Dm/2) * [1+(x^2*b)]^(6-Ds-Dm)/2}^(-1)
61        a = Rg^2/(3*Dm/2)
62        b = rg^2/(3*(6-Ds-Dm)/2)
63        scale        =  scale factor * N*Volume^2*contrast^2
64        fractal_dim_mass       =  Dm (mass fractal dimension)
65        fractal_dim_surf  =  Ds
66        rg_cluster  =  Rg
67        rg_primary    =  rg
68        background   =  background
69        Ref: Schmidt, J Appl Cryst, eq(19), (1991), 24, 414-435
70        Hurd, Schaefer, Martin, Phys Rev A, eq(2),(1987),35, 2361-2364
71        Note that 0 < Ds< 6 and 0 < Dm < 6.
72        """
73category = "shape-independent"
74
75# pylint: disable=bad-whitespace, line-too-long
76#   ["name", "units", default, [lower, upper], "type","description"],
77parameters = [
78    ["fractal_dim_mass", "",      1.8, [0.0, 6.0], "", "Mass fractal dimension"],
79    ["fractal_dim_surf", "",      2.3, [0.0, 6.0], "", "Surface fractal dimension"],
80    ["rg_cluster",       "Ang",  86.7, [0.0, inf], "", "Cluster radius of gyration"],
81    ["rg_primary",       "Ang", 4000., [0.0, inf], "", "Primary particle radius of gyration"],
82]
83# pylint: enable=bad-whitespace, line-too-long
84
85source = ["mass_surface_fractal.c"]
86
87def random():
88    fractal_dim = np.random.uniform(0, 6)
89    surface_portion = np.random.uniform(0, 1)
90    fractal_dim_surf = fractal_dim*surface_portion
91    fractal_dim_mass = fractal_dim - fractal_dim_surf
92    rg_cluster = 10**np.random.uniform(1, 5)
93    rg_primary = rg_cluster*10**np.random.uniform(-4, -1)
94    scale = 10**np.random.uniform(2, 5)
95    pars = dict(
96        #background=0,
97        scale=scale,
98        fractal_dim_mass=fractal_dim_mass,
99        fractal_dim_surf=fractal_dim_surf,
100        rg_cluster=rg_cluster,
101        rg_primary=rg_primary,
102    )
103    return pars
104
105
106demo = dict(scale=1, background=0,
107            fractal_dim_mass=1.8,
108            fractal_dim_surf=2.3,
109            rg_cluster=86.7,
110            rg_primary=4000.0)
111
112tests = [
113
114    # Accuracy tests based on content in test/utest_other_models.py
115    [{'fractal_dim_mass':      1.8,
116      'fractal_dim_surf':   2.3,
117      'rg_cluster':   86.7,
118      'rg_primary': 4000.0,
119      'background':    0.0,
120     }, 0.05, 1.77537e-05],
121
122    # Additional tests with larger range of parameters
123    [{'fractal_dim_mass':      3.3,
124      'fractal_dim_surf':   1.0,
125      'rg_cluster':   90.0,
126      'rg_primary': 4000.0,
127     }, 0.001, 0.18562699016],
128
129    [{'fractal_dim_mass':      1.3,
130      'fractal_dim_surf':   1.0,
131      'rg_cluster':   90.0,
132      'rg_primary': 2000.0,
133      'background':    0.8,
134     }, 0.001, 1.16539753641],
135
136    [{'fractal_dim_mass':      2.3,
137      'fractal_dim_surf':   1.0,
138      'rg_cluster':   90.0,
139      'rg_primary': 1000.0,
140      'scale':        10.0,
141      'background':    0.0,
142     }, 0.051, 0.000169548800377],
143    ]
Note: See TracBrowser for help on using the repository browser.