File: rpa.py

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,113,256 kB
  • sloc: ansic: 40,697; python: 25,137; yacc: 8,438; sh: 5,405; javascript: 4,596; lex: 1,632; cpp: 742; perl: 296; lisp: 273; makefile: 226; fortran: 132
file content (160 lines) | stat: -rw-r--r-- 5,964 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
r"""
.. warning:: This model is not functioning correctly in SasView and it
             appears it has not done so for some time. Whilst the
             problem is investigated, a workaround for Case 0 below
             (the most common use case) is to use the binary_blend
             model available on the `Model Maketplace 
             <https://marketplace.sasview.org/models/124/>`_ . For further
             information, please email help@sasview.org . *The
             SasView Developers. February 2022.*

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