source: sasmodels/sasmodels/models/hayter_msa.py @ 8f04da4

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

tuned random model generation for more models

  • Property mode set to 100644
File size: 5.6 KB
Line 
1# Note: model title and parameter table are inserted automatically
2r"""
3This calculates the structure factor (the Fourier transform of the pair
4correlation function $g(r)$) for a system of charged, spheroidal objects
5in a dielectric medium. When combined with an appropriate form factor
6(such as sphere, core+shell, ellipsoid, etc), this allows for inclusion
7of the interparticle interference effects due to screened coulomb repulsion
8between charged particles.
9
10**This routine only works for charged particles**. If the charge is set to
11zero the routine may self-destruct! For non-charged particles use a hard
12sphere potential.
13
14The salt concentration is used to compute the ionic strength of the solution
15which in turn is used to compute the Debye screening length. At present
16there is no provision for entering the ionic strength directly nor for use
17of any multivalent salts, though it should be possible to simulate the effect
18of this by increasing the salt concentration. The counterions are also
19assumed to be monovalent.
20
21In sasview the effective radius may be calculated from the parameters
22used in the form factor $P(q)$ that this $S(q)$ is combined with.
23
24The computation uses a Taylor series expansion at very small rescaled $qR$, to
25avoid some serious rounding error issues, this may result in a minor artefact
26in the transition region under some circumstances.
27
28For 2D data, the scattering intensity is calculated in the same way as 1D,
29where the $q$ vector is defined as
30
31.. math::
32
33    q = \sqrt{q_x^2 + q_y^2}
34
35
36References
37----------
38
39J B Hayter and J Penfold, *Molecular Physics*, 42 (1981) 109-118
40
41J P Hansen and J B Hayter, *Molecular Physics*, 46 (1982) 651-656
42"""
43from numpy import inf
44
45category = "structure-factor"
46structure_factor = True
47single = False  # double precision only!
48
49#  dp[0] = 2.0*radius_effective();
50#  dp[1] = fabs(charge());
51#  dp[2] = volfraction();
52#  dp[3] = temperature();
53#  dp[4] = concentration_salt();
54#  dp[5] = dielectconst();
55
56
57
58
59name = "hayter_msa"
60title = "Hayter-Penfold rescaled MSA, charged sphere, interparticle S(Q) structure factor"
61description = """\
62    [Hayter-Penfold RMSA charged sphere interparticle S(Q) structure factor]
63        Interparticle structure factor S(Q)for a charged hard spheres.
64        Routine takes absolute value of charge, use HardSphere if charge
65        goes to zero.
66        In sasview the effective radius and volume fraction may be calculated
67        from the parameters used in P(Q).
68"""
69
70
71# pylint: disable=bad-whitespace, line-too-long
72#             [ "name", "units", default, [lower, upper], "type", "description" ],
73parameters = [
74    ["radius_effective", "Ang", 20.75,   [0, inf],    "volume", "effective radius of charged sphere"],
75    ["volfraction",   "None",     0.0192, [0, 0.74],   "", "volume fraction of spheres"],
76    ["charge",        "e",   19.0,    [0, 200],    "", "charge on sphere (in electrons)"],
77    ["temperature",   "K",  318.16,   [0, 450],    "", "temperature, in Kelvin, for Debye length calculation"],
78    ["concentration_salt",      "M",    0.0,    [0, inf], "", "conc of salt, moles/litre, 1:1 electolyte, for Debye length"],
79    ["dielectconst",  "None",    71.08,   [-inf, inf], "", "dielectric constant (relative permittivity) of solvent, default water, for Debye length"]
80    ]
81# pylint: enable=bad-whitespace, line-too-long
82
83source = ["hayter_msa.c"]
84# No volume normalization despite having a volume parameter
85# This should perhaps be volume normalized?
86form_volume = """
87    return 1.0;
88    """
89# ER defaults to 0.0
90# VR defaults to 1.0
91
92def random():
93    import numpy as np
94    # TODO: too many failures for random hayter_msa parameters
95    pars = dict(
96        scale=1, background=0,
97        radius_effective=10**np.random.uniform(1, 4.7),
98        volfraction=10**np.random.uniform(-2, 0),  # high volume fraction
99        charge=min(int(10**np.random.uniform(0, 1.3)+0.5), 200),
100        temperature=10**np.random.uniform(0, np.log10(450)), # max T = 450
101        #concentration_salt=10**np.random.uniform(-3, 1),
102        dialectconst=10**np.random.uniform(0, 6),
103        #charge=10,
104        #temperature=318.16,
105        concentration_salt=0.0,
106        #dielectconst=71.08,
107    )
108    return pars
109
110# default parameter set,  use  compare.sh -midQ -linear
111# note the calculation varies in different limiting cases so a wide range of
112# parameters will be required for a thorough test!
113# odd that the default st has concentration_salt zero
114demo = dict(radius_effective=20.75,
115            charge=19.0,
116            volfraction=0.0192,
117            temperature=318.16,
118            concentration_salt=0.05,
119            dielectconst=71.08,
120            radius_effective_pd=0.1,
121            radius_effective_pd_n=40)
122#
123# attempt to use same values as old sasview unit test at Q=.001 was 0.0712928,
124# then add lots new ones assuming values from new model are OK, need some
125# low Q values to test the small Q Taylor expansion
126tests = [
127    [{'scale': 1.0,
128      'background': 0.0,
129      'radius_effective': 20.75,
130      'charge': 19.0,
131      'volfraction': 0.0192,
132      'temperature': 298.0,
133      'concentration_salt': 0,
134      'dielectconst': 78.0,
135      'radius_effective_pd': 0},
136     [0.00001, 0.0010, 0.01, 0.075], [0.0711646, 0.0712928, 0.0847006, 1.07150]],
137    [{'scale': 1.0,
138      'background': 0.0,
139      'radius_effective': 20.75,
140      'charge': 19.0,
141      'volfraction': 0.0192,
142      'temperature': 298.0,
143      'concentration_salt': 0.05,
144      'dielectconst': 78.0,
145      'radius_effective_pd': 0.1,
146      'radius_effective_pd_n': 40},
147     [0.00001, 0.0010, 0.01, 0.075], [0.450272, 0.450420, 0.465116, 1.039625]]
148    ]
149# ADDED by:  RKH  ON: 16Mar2016 converted from sasview, new Taylor expansion at smallest rescaled Q
Note: See TracBrowser for help on using the repository browser.