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.* and by Hammouda 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 and 39 of Boualem Hammouda's 'SANS Toolbox'. 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 = [SLD(component C) - SLD(component 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. Source ------ `rpa.py `_ `rpa.c `_ 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:** Paul Butler **Date:** March 12, 2017 * **Source added by :** Steve King **Date:** March 25, 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