source: sasmodels/sasmodels/models/be_polyelectrolyte.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@…>, 5 years ago

lint

  • Property mode set to 100644
File size: 7.7 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:** Paul Butler and Richard Heenan **Date:**
70  October 07, 2016
71"""
72
73import numpy as np
74from numpy import inf, pi, sqrt
75
76name = "be_polyelectrolyte"
77title = "Polyelectrolyte with the RPA expression derived by Borue and Erukhimovich"
78description = """
79            Evaluate
80            F(x) = K 1/(4 pi Lb (alpha)^(2)) (q^(2)+k2)/(1+(r02)^(2))
81                 (q^(2)+k2) (q^(2)-(12 h C/b^(2)))
82
83            has 3 internal parameters :
84                   The inverse Debye Length: K2 = 4 pi Lb (2 Cs+alpha C)
85                   r02 =1/alpha/Ca^(0.5) (B/(48 pi Lb)^(0.5))
86                   Ca = 6.022136e-4 C
87            """
88category = "shape-independent"
89
90# pylint: disable=bad-whitespace, line-too-long
91#   ["name", "units", default, [lower, upper], "type", "description"],
92parameters = [
93    ["contrast_factor",       "barns",   10.0,  [-inf, inf], "", "Contrast factor of the polymer"],
94    ["bjerrum_length",        "Ang",      7.1,  [0, inf],    "", "Bjerrum length"],
95    ["virial_param",          "Ang^3/mol", 12.0,  [-inf, inf], "", "Virial parameter"],
96    ["monomer_length",        "Ang",     10.0,  [0, inf],    "", "Monomer length"],
97    ["salt_concentration",    "mol/L",    0.0,  [-inf, inf], "", "Concentration of monovalent salt"],
98    ["ionization_degree",     "",         0.05, [0, inf],    "", "Degree of ionization"],
99    ["polymer_concentration", "mol/L",    0.7,  [0, inf],    "", "Polymer molar concentration"],
100    ]
101# pylint: enable=bad-whitespace, line-too-long
102
103
104def Iq(q,
105       contrast_factor=10.0,
106       bjerrum_length=7.1,
107       virial_param=12.0,
108       monomer_length=10.0,
109       salt_concentration=0.0,
110       ionization_degree=0.05,
111       polymer_concentration=0.7):
112    """
113    :param q:                     Input q-value
114    :param contrast_factor:       Contrast factor of the polymer
115    :param bjerrum_length:        Bjerrum length
116    :param virial_param:          Virial parameter
117    :param monomer_length:        Monomer length
118    :param salt_concentration:    Concentration of monovalent salt
119    :param ionization_degree:     Degree of ionization
120    :param polymer_concentration: Polymer molar concentration
121    :return:                      1-D intensity
122    """
123
124    concentration = polymer_concentration * 6.022136e-4
125
126    k_square = 4.0 * pi * bjerrum_length * (2*salt_concentration +
127                                            ionization_degree * concentration)
128
129    r0_square = 1.0/ionization_degree/sqrt(concentration) * \
130                (monomer_length/sqrt((48.0*pi*bjerrum_length)))
131
132    term1 = contrast_factor/(4.0 * pi * bjerrum_length *
133                             ionization_degree**2) * (q**2 + k_square)
134
135    term2 = 1.0 + r0_square**2 * (q**2 + k_square) * \
136        (q**2 - (12.0 * virial_param * concentration/(monomer_length**2)))
137
138    return term1/term2
139
140Iq.vectorized = True  # Iq accepts an array of q values
141
142def random():
143    # TODO: review random be_polyelectrolyte model generation
144    pars = dict(
145        scale=10000, #background=0,
146        #polymer_concentration=0.7,
147        polymer_concentration=np.random.beta(5, 3), # around 70%
148        #salt_concentration=0.0,
149        # keep salt concentration extremely low
150        # and use explicit molar to match polymer concentration
151        salt_concentration=np.random.beta(1, 100)*6.022136e-4,
152        #contrast_factor=10.0,
153        contrast_fact=np.random.uniform(1, 100),
154        #bjerrum_length=7.1,
155        bjerrum_length=np.random.uniform(1, 10),
156        #virial_param=12.0,
157        virial_param=np.random.uniform(-1000, 30),
158        #monomer_length=10.0,
159        monomer_length=10.0**(4*np.random.beta(1.5, 3)),
160        #ionization_degree=0.05,
161        ionization_degree=np.random.beta(1.5, 4),
162    )
163    return pars
164
165demo = dict(scale=1, background=0.1,
166            contrast_factor=10.0,
167            bjerrum_length=7.1,
168            virial_param=12.0,
169            monomer_length=10.0,
170            salt_concentration=0.0,
171            ionization_degree=0.05,
172            polymer_concentration=0.7)
173
174tests = [
175
176    # Accuracy tests based on content in test/utest_other_models.py
177    [{'contrast_factor':       10.0,
178      'bjerrum_length':         7.1,
179      'virial_param':          12.0,
180      'monomer_length':        10.0,
181      'salt_concentration':     0.0,
182      'ionization_degree':      0.05,
183      'polymer_concentration':  0.7,
184      'background':             0.001,
185     }, 0.001, 0.0948379],
186
187    # Additional tests with larger range of parameters
188    [{'contrast_factor':       10.0,
189      'bjerrum_length':       100.0,
190      'virial_param':           3.0,
191      'monomer_length':         1.0,
192      'salt_concentration':    10.0,
193      'ionization_degree':      2.0,
194      'polymer_concentration': 10.0,
195      'background':             0.0,
196     }, 0.1, -3.75693800588],
197
198    [{'contrast_factor':       10.0,
199      'bjerrum_length':       100.0,
200      'virial_param':           3.0,
201      'monomer_length':         1.0,
202      'salt_concentration':    10.0,
203      'ionization_degree':      2.0,
204      'polymer_concentration': 10.0,
205      'background':           100.0
206     }, 5.0, 100.029142149],
207
208    [{'contrast_factor':     100.0,
209      'bjerrum_length':       10.0,
210      'virial_param':        180.0,
211      'monomer_length':        1.0,
212      'salt_concentration':    0.1,
213      'ionization_degree':     0.5,
214      'polymer_concentration': 0.1,
215      'background':             0.0,
216     }, 200., 1.80664667511e-06],
217    ]
Note: See TracBrowser for help on using the repository browser.