Rpa - rpa.py
r"""
Definition
----------
Calculates the macroscopic scattering intensity for a multi-component
homogeneous mixture of polymers using the Random Phase Approximation.
This general formalism contains 10 specific cases
Case 0: C/D binary mixture of homopolymers
Case 1: C-D diblock copolymer
Case 2: B/C/D ternary mixture of homopolymers
Case 3: C/C-D mixture of a homopolymer B and a diblock copolymer C-D
Case 4: B-C-D triblock copolymer
Case 5: A/B/C/D quaternary mixture of homopolymers
Case 6: A/B/C-D mixture of two homopolymers A/B and a diblock C-D
Case 7: A/B-C-D mixture of a homopolymer A and a triblock B-C-D
Case 8: A-B/C-D mixture of two diblock copolymers A-B and C-D
Case 9: A-B-C-D tetra-block copolymer
.. note::
These case numbers are different from those in the NIST SANS package!
The models are based on the papers by Akcasu *et al.* [1] and by
Hammouda [2] assuming the polymer follows Gaussian statistics such
that $R_g^2 = n b^2/6$ where $b$ is the statistical segment length and $n$ is
the number of statistical segment lengths. A nice tutorial on how these are
constructed and implemented can be found in chapters 28, 31 and 34, and Part H,
of Hammouda's 'SANS Toolbox' [3].
In brief, the macroscopic cross sections are derived from the general forms
for homopolymer scattering and the multiblock cross-terms while the inter,
polymer cross terms are described in the usual way by the $\chi$ parameter.
USAGE NOTES:
* Only one case can be used at any one time.
* The RPA (mean field) formalism only applies only when the multicomponent
polymer mixture is in the homogeneous mixed-phase region.
* **Component D is assumed to be the "background" component (ie, all contrasts
are calculated with respect to component D).** So the scattering contrast
for a C/D blend $\rho_{C/D} = [\rho_C - \rho_D]$\ :sup:`2`.
* Depending on which case is being used, the number of fitting parameters can
vary.
.. Note::
* In general the degrees of polymerization, the volume
fractions, the molar volumes, and the neutron scattering lengths for each
component are obtained from other methods and held fixed while The *scale*
parameter should be held equal to unity.
* The variables are normally the segment lengths ($b_a$, $b_b$,
etc.) and $\chi$ parameters ($K_{ab}$, $K_{ac}$, etc).
References
----------
.. [#] A Z Akcasu, R Klein and B Hammouda, *Macromolecules*, 26 (1993) 4136
.. [#] B. Hammouda, *Advances in Polymer Science* 106 (1993) 87
.. [#] B. Hammouda, *SANS Toolbox* https://www.ncnr.nist.gov/staff/hammouda/the_sans_toolbox.pdf.
Authorship and Verification
----------------------------
* **Author:** Boualem Hammouda - NIST IGOR/DANSE **Date:** pre 2010
* **Converted to sasmodels by:** Paul Kienzle **Date:** July 18, 2016
* **Last Modified by:** Paul Butler **Date:** March 12, 2017
* **Last Reviewed by:** Steve King **Date:** March 27, 2019
"""
from numpy import inf
name = "rpa"
title = "Random Phase Approximation"
description = """
This formalism applies to multicomponent polymer mixtures in the
homogeneous (mixed) phase region only.
Case 0: C/D binary mixture of homopolymers
Case 1: C-D diblock copolymer
Case 2: B/C/D ternary mixture of homopolymers
Case 3: B/C-D mixture of homopolymer b and diblock copolymer C-D
Case 4: B-C-D triblock copolymer
Case 5: A/B/C/D quaternary mixture of homopolymers
Case 6: A/B/C-D mixture of two homopolymers A/B and a diblock C-D
Case 7: A/B-C-D mixture of a homopolymer A and a triblock B-C-D
Case 8: A-B/C-D mixture of two diblock copolymers A-B and C-D
Case 9: A-B-C-D four-block copolymer
See details in the model function help
"""
category = "shape-independent"
CASES = [
"C+D binary mixture",
"C:D diblock copolymer",
"B+C+D ternary mixture",
"B+C:D binary mixture",
"B:C:D triblock copolymer",
"A+B+C+D quaternary mixture",
"A+B+C:D ternary mixture",
"A+B:C:D binary mixture",
"A:B+C:D binary mixture",
"A:B:C:D quadblock copolymer",
]
# ["name", "units", default, [lower, upper], "type","description"],
parameters = [
["case_num", "", 1, [CASES], "", "Component organization"],
["N[4]", "", 1000.0, [1, inf], "", "Degree of polymerization"],
["Phi[4]", "", 0.25, [0, 1], "", "volume fraction"],
["v[4]", "mL/mol", 100.0, [0, inf], "", "molar volume"],
["L[4]", "fm", 10.0, [-inf, inf], "", "scattering length"],
["b[4]", "Ang", 5.0, [0, inf], "", "segment length"],
["K12", "", -0.0004, [-inf, inf], "", "A:B interaction parameter"],
["K13", "", -0.0004, [-inf, inf], "", "A:C interaction parameter"],
["K14", "", -0.0004, [-inf, inf], "", "A:D interaction parameter"],
["K23", "", -0.0004, [-inf, inf], "", "B:C interaction parameter"],
["K24", "", -0.0004, [-inf, inf], "", "B:D interaction parameter"],
["K34", "", -0.0004, [-inf, inf], "", "C:D interaction parameter"],
]
source = ["rpa.c"]
single = False
control = "case_num"
HIDE_ALL = set("Phi4".split())
HIDE_A = set("N1 Phi1 v1 L1 b1 K12 K13 K14".split()).union(HIDE_ALL)
HIDE_AB = set("N2 Phi2 v2 L2 b2 K23 K24".split()).union(HIDE_A)
def hidden(case_num):
"""
Return a list of parameters to hide depending on the multiplicity parameter.
"""
case_num = int(case_num+0.5)
if case_num < 2:
return HIDE_AB
elif case_num < 5:
return HIDE_A
else:
return HIDE_ALL
# TODO: no random parameters generated for RPA
Back to Model
Download