source: sasmodels/sasmodels/models/stickyhardsphere.py @ 9cb1415

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 9cb1415 was 9cb1415, checked in by richardh, 9 years ago

adding sticky hard sphere S(Q)

  • Property mode set to 100644
File size: 5.7 KB
Line 
1# Note: model title and parameter table are inserted automatically
2r"""This calculates the interparticle structure factor for a hard sphere fluid with a narrow attractive well. A perturbative
3solution of the Percus-Yevick closure is used. The strength of the attractive well is described in terms of "stickiness"
4as defined below. The returned value is a dimensionless structure factor, *S(q)*.
5
6The perturb (perturbation parameter), |epsilon|, should be held between 0.01 and 0.1. It is best to hold the
7perturbation parameter fixed and let the "stickiness" vary to adjust the interaction strength. The stickiness, |tau|,
8is defined in the equation below and is a function of both the perturbation parameter and the interaction strength.
9|tau| and |epsilon| are defined in terms of the hard sphere diameter (|sigma| = 2\*\ *R*\ ), the width of the square
10well, |bigdelta| (same units as *R*), and the depth of the well, *Uo*, in units of kT. From the definition, it is clear
11that smaller |tau| means stronger attraction.
12
13.. image:: img/stickyhardsphere_228.PNG
14
15where the interaction potential is
16
17.. image:: img/stickyhardsphere_229.PNG
18
19The Percus-Yevick (PY) closure was used for this calculation, and is an adequate closure for an attractive interparticle
20potential. This solution has been compared to Monte Carlo simulations for a square well fluid, with good agreement.
21
22The true particle volume fraction, |phi|, is not equal to *h*, which appears in most of the reference. The two are
23related in equation (24) of the reference. The reference also describes the relationship between this perturbation
24solution and the original sticky hard sphere (or adhesive sphere) model by Baxter.
25
26NB: The calculation can go haywire for certain combinations of the input parameters, producing unphysical solutions - in
27this case errors are reported to the command window and the *S(q)* is set to -1 (so it will disappear on a log-log
28plot). Use tight bounds to keep the parameters to values that you know are physical (test them) and keep nudging them
29until the optimization does not hit the constraints.
30
31In sasview the effective radius will be calculated from the parameters used in the form factor P(Q) that this
32S(Q) is combined with.
33
34For 2D data: The 2D scattering intensity is calculated in the same way as 1D, where the *q* vector is defined as
35
36.. math::
37
38    Q = \sqrt{Q_x^2 + Q_y^2}
39
40==============  ========  =============
41Parameter name  Units     Default value
42==============  ========  =============
43effect_radius   |Ang|     50
44perturb         None      0.05
45volfraction     None      0.1
46stickiness      K         0.2
47==============  ========  =============
48
49.. image:: img/stickyhardsphere_230.jpg
50
51*Figure. 1D plot using the default values (in linear scale).*
52
53REFERENCE
54
55S V G Menon, C Manohar, and K S Rao, *J. Chem. Phys.*, 95(12) (1991) 9186-9190
56"""
57
58# TODO: refactor so that we pull in the old sansmodels.c_extensions
59 
60from numpy import pi, inf
61
62name = "stickyhardsphere"
63title = "Sticky hard sphere structure factor, with Percus-Yevick closure"
64description = """\
65        [Sticky hard sphere structure factor, with Percus-Yevick closure]
66        Interparticle structure factor S(Q)for a hard sphere fluid with
67                a narrow attractive well. Fits are prone to deliver non-physical
68                parameters, use with care and read the references in the full manual.
69                In sasview the effective radius will be calculated from the
70                parameters used in P(Q).
71"""
72
73parameters = [
74#   [ "name", "units", default, [lower, upper], "type",
75#     "description" ],
76    [ "effect_radius", "Ang",  50.0, [0, inf], "volume",
77      "effective radius of hard sphere" ],
78    [ "volfraction", "",  0.2, [0, 0.74], "",
79      "volume fraction of hard spheres" ],
80    [ "perturb", "",  0.05, [0.01, 0.1], "",
81      "perturbation parameter, epsilon" ],
82    [ "stickiness", "",  0.20, [-inf,inf], "",
83      "stickiness, tau" ],
84    ]
85       
86# No volume normalization despite having a volume parameter
87# This should perhaps be volume normalized?
88form_volume = """
89    return 1.0;
90    """
91
92Iq = """
93        double onemineps,eta;
94        double sig,aa,etam1,etam1sq,qa,qb,qc,radic;
95        double lam,lam2,test,mu,alpha,beta;
96        double kk,k2,k3,ds,dc,aq1,aq2,aq3,aq,bq1,bq2,bq3,bq,sq;
97       
98        onemineps = 1.0-perturb;
99        eta = volfraction/onemineps/onemineps/onemineps;
100       
101        sig = 2.0 * effect_radius;
102        aa = sig/onemineps;
103        etam1 = 1.0 - eta;
104        etam1sq=etam1*etam1;
105        //C
106        //C  SOLVE QUADRATIC FOR LAMBDA
107        //C
108        qa = eta/12.0;
109        qb = -1.0*(stickiness + eta/etam1);
110        qc = (1.0 + eta/2.0)/etam1sq;
111        radic = qb*qb - 4.0*qa*qc;
112        if(radic<0) {
113                //if(x>0.01 && x<0.015)
114                //      Print "Lambda unphysical - both roots imaginary"
115                //endif
116                return(-1.0);
117        }
118        //C   KEEP THE SMALLER ROOT, THE LARGER ONE IS UNPHYSICAL
119        lam = (-1.0*qb-sqrt(radic))/(2.0*qa);
120        lam2 = (-1.0*qb+sqrt(radic))/(2.0*qa);
121        if(lam2<lam) {
122                lam = lam2;
123        }
124        test = 1.0 + 2.0*eta;
125        mu = lam*eta*etam1;
126        if(mu>test) {
127                //if(x>0.01 && x<0.015)
128                // Print "Lambda unphysical mu>test"
129                //endif
130                return(-1.0);
131        }
132        alpha = (1.0 + 2.0*eta - mu)/etam1sq;
133        beta = (mu - 3.0*eta)/(2.0*etam1sq);
134        //C
135        //C   CALCULATE THE STRUCTURE FACTOR
136        //C
137        kk = q*aa;
138        k2 = kk*kk;
139        k3 = kk*k2;
140        SINCOS(kk,ds,dc);
141        //ds = sin(kk);
142        //dc = cos(kk);
143        aq1 = ((ds - kk*dc)*alpha)/k3;
144        aq2 = (beta*(1.0-dc))/k2;
145        aq3 = (lam*ds)/(12.0*kk);
146        aq = 1.0 + 12.0*eta*(aq1+aq2-aq3);
147        //
148        bq1 = alpha*(0.5/kk - ds/k2 + (1.0 - dc)/k3);
149        bq2 = beta*(1.0/kk - ds/k2);
150        bq3 = (lam/12.0)*((1.0 - dc)/kk);
151        bq = 12.0*eta*(bq1+bq2-bq3);
152        //
153        sq = 1.0/(aq*aq +bq*bq);
154       
155        return(sq);
156"""
157Iqxy = """
158    // never called since no orientation or magnetic parameters.
159    return -1.0;
160    """
161
162# ER defaults to 0.0
163# VR defaults to 1.0
164
165oldname = 'StickyHSStructure'
166oldpars = dict()
167demo = dict(effect_radius = 200,volfraction = 0.2,perturb=0.05,stickiness=0.2,effect_radius_pd = 0.1,effect_radius_pd_n = 40)
168
169
170
Note: See TracBrowser for help on using the repository browser.