source: sasmodels/sasmodels/models/be_polyelectrolyte.py @ 5df888c

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 5df888c was 5df888c, checked in by butler, 8 years ago

added defintions, fixed units and gnerally cleaned up
be_polyelectrolyte.py model documentation. closes #553

  • Property mode set to 100644
File size: 7.0 KB
Line 
1r"""
2Definition
3----------
4This model calculates the structure factor of a polyelectrolyte solution with
5the RPA expression derived by Borue and Erukhimovich\ [#Borue]_.  Note however
6that the fitting procedure here does not follow the notation in that reference
7as 's' and 't' are **not** decoupled. Instead the scattering intensity $I(q)$
8is calculated as
9
10.. math::
11
12    I(q) = K\frac{q^2+k^2}{4\pi L_b\alpha ^2}
13    \frac{1}{1+r_{0}^2(q^2+k^2)(q^2-12hC_a/b^2)} + background
14
15    k^2 = 4\pi L_b(2C_s + \alpha C_a)
16
17    r_{0}^2 = \frac{1}{\alpha \sqrt{C_a} \left( b/\sqrt{48\pi L_b}\right)}
18
19where
20
21$K$ is the contrast factor for the polymer which is defined differently than in
22other models and is given in barns where $1 barn = 10^{-24} cm^2$.  $K$ is
23defined as:
24
25.. math::
26
27    K = a^2
28
29    a = b_p - (v_p/v_s) b_s
30   
31where $b_p$ and $b_s$ are sum of the scattering lengths of the atoms
32constituting the monomer of the polymer and the sum of the scattering lengths
33of the atoms constituting the solvent molecules respectively, and $v_p$ and
34$v_s$ are the partial molar volume of the polymer and the solvent respectively
35
36$L_b$ is the Bjerrum length(|Ang|) - **Note:** This parameter needs to be
37kept constant for a given solvent and temperature!
38
39$h$ is the virial parameter (|Ang^3|/mol) - **Note:** See [#Borue]_ for the
40correct interpretation of this parameter.  It incorporates second and third
41virial coefficients and can be Negative.
42
43$b$ is the monomer length(|Ang|), $C_s$ is the concentration of monovalent
44salt(mol/L), $\alpha$ is the ionization degree (ionization degree : ratio of
45charged monomers  to total number of monomers), $C_a$ is the polymer molar
46concentration(mol/L), and $background$ is the incoherent background.
47
48For 2D data the scattering intensity is calculated in the same way as 1D,
49where the $\vec q$ vector is defined as
50
51.. math::
52
53    q = \sqrt{q_x^2 + q_y^2}
54
55References
56----------
57
58.. [#Borue] V Y Borue, I Y Erukhimovich, *Macromolecules*, 21 (1988) 3240
59.. [#] J F Joanny, L Leibler, *Journal de Physique*, 51 (1990) 545
60.. [#] A Moussaid, F Schosseler, J P Munch, S Candau, *J. Journal de Physique
61   II France*, 3 (1993) 573
62.. [#] E Raphael, J F Joanny, *Europhysics Letters*, 11 (1990) 179
63
64Authorship and Verification
65----------------------------
66
67* **Author:** NIST IGOR/DANSE **Date:** pre 2010
68* **Last Modified by:** Paul Kienzle **Date:** July 24, 2016
69* **Last Reviewed by:** Piotr rozyczko **Date:** January 27, 2016
70"""
71
72from numpy import inf, pi, sqrt
73
74name = "be_polyelectrolyte"
75title = "Polyelectrolyte with the RPA expression derived by Borue and Erukhimovich"
76description = """
77            Evaluate
78            F(x) = K 1/(4 pi Lb (alpha)^(2)) (q^(2)+k2)/(1+(r02)^(2))
79                 (q^(2)+k2) (q^(2)-(12 h C/b^(2)))
80
81            has 3 internal parameters :
82                   The inverse Debye Length: K2 = 4 pi Lb (2 Cs+alpha C)
83                   r02 =1/alpha/Ca^(0.5) (B/(48 pi Lb)^(0.5))
84                   Ca = 6.022136e-4 C
85            """
86category = "shape-independent"
87
88# pylint: disable=bad-whitespace, line-too-long
89#   ["name", "units", default, [lower, upper], "type", "description"],
90parameters = [
91    ["contrast_factor",       "barns",   10.0,  [-inf, inf], "", "Contrast factor of the polymer"],
92    ["bjerrum_length",        "Ang",      7.1,  [0, inf],    "", "Bjerrum length"],
93    ["virial_param",          "Ang^3/mol", 12.0,  [-inf, inf], "", "Virial parameter"],
94    ["monomer_length",        "Ang",     10.0,  [0, inf],    "", "Monomer length"],
95    ["salt_concentration",    "mol/L",    0.0,  [-inf, inf], "", "Concentration of monovalent salt"],
96    ["ionization_degree",     "",         0.05, [0, inf],    "", "Degree of ionization"],
97    ["polymer_concentration", "mol/L",    0.7,  [0, inf],    "", "Polymer molar concentration"],
98    ]
99# pylint: enable=bad-whitespace, line-too-long
100
101
102def Iq(q,
103       contrast_factor=10.0,
104       bjerrum_length=7.1,
105       virial_param=12.0,
106       monomer_length=10.0,
107       salt_concentration=0.0,
108       ionization_degree=0.05,
109       polymer_concentration=0.7):
110    """
111    :param q:                     Input q-value
112    :param contrast_factor:       Contrast factor of the polymer
113    :param bjerrum_length:        Bjerrum length
114    :param virial_param:          Virial parameter
115    :param monomer_length:        Monomer length
116    :param salt_concentration:    Concentration of monovalent salt
117    :param ionization_degree:     Degree of ionization
118    :param polymer_concentration: Polymer molar concentration
119    :return:                      1-D intensity
120    """
121
122    concentration = polymer_concentration * 6.022136e-4
123
124    k_square = 4.0 * pi * bjerrum_length * (2*salt_concentration +
125                                            ionization_degree * concentration)
126
127    r0_square = 1.0/ionization_degree/sqrt(concentration) * \
128                (monomer_length/sqrt((48.0*pi*bjerrum_length)))
129
130    term1 = contrast_factor/(4.0 * pi * bjerrum_length *
131                             ionization_degree**2) * (q**2 + k_square)
132
133    term2 = 1.0 + r0_square**2 * (q**2 + k_square) * \
134        (q**2 - (12.0 * virial_param * concentration/(monomer_length**2)))
135
136    return term1/term2
137
138Iq.vectorized = True  # Iq accepts an array of q values
139
140
141demo = dict(scale=1, background=0.1,
142            contrast_factor=10.0,
143            bjerrum_length=7.1,
144            virial_param=12.0,
145            monomer_length=10.0,
146            salt_concentration=0.0,
147            ionization_degree=0.05,
148            polymer_concentration=0.7)
149
150tests = [
151
152    # Accuracy tests based on content in test/utest_other_models.py
153    [{'contrast_factor':       10.0,
154      'bjerrum_length':         7.1,
155      'virial_param':          12.0,
156      'monomer_length':        10.0,
157      'salt_concentration':     0.0,
158      'ionization_degree':      0.05,
159      'polymer_concentration':  0.7,
160      'background':             0.001,
161     }, 0.001, 0.0948379],
162
163    # Additional tests with larger range of parameters
164    [{'contrast_factor':       10.0,
165      'bjerrum_length':       100.0,
166      'virial_param':           3.0,
167      'monomer_length':         1.0,
168      'salt_concentration':    10.0,
169      'ionization_degree':      2.0,
170      'polymer_concentration': 10.0,
171      'background':             0.0,
172     }, 0.1, -3.75693800588],
173
174    [{'contrast_factor':       10.0,
175      'bjerrum_length':       100.0,
176      'virial_param':           3.0,
177      'monomer_length':         1.0,
178      'salt_concentration':    10.0,
179      'ionization_degree':      2.0,
180      'polymer_concentration': 10.0,
181      'background':           100.0
182     }, 5.0, 100.029142149],
183
184    [{'contrast_factor':     100.0,
185      'bjerrum_length':       10.0,
186      'virial_param':        180.0,
187      'monomer_length':        1.0,
188      'salt_concentration':    0.1,
189      'ionization_degree':     0.5,
190      'polymer_concentration': 0.1,
191      'background':             0.0,
192     }, 200., 1.80664667511e-06],
193    ]
Note: See TracBrowser for help on using the repository browser.