Changeset 3c56da87 in sasmodels for sasmodels/models/stickyhardsphere.py
- Timestamp:
- Mar 4, 2015 10:55:38 PM (9 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 3a45c2c
- Parents:
- b89f519
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/models/stickyhardsphere.py
r1353f60 r3c56da87 1 1 # Note: model title and parameter table are inserted automatically 2 r"""This calculates the interparticle structure factor for a hard sphere fluid with 3 a narrow attractive well. A perturbative solution of the Percus-Yevick closure is used. 4 The strength of the attractive well is described in terms of "stickiness" 5 as defined below. The returned value is a dimensionless structure factor, *S(q)*. 2 r""" 3 This calculates the interparticle structure factor for a hard sphere fluid 4 with a narrow attractive well. A perturbative solution of the Percus-Yevick 5 closure is used. The strength of the attractive well is described in terms 6 of "stickiness" as defined below. The returned value is a dimensionless 7 structure factor, *S(q)*. 6 8 7 The perturb (perturbation parameter), |epsilon|, should be held between 0.01 and 0.1. 8 It is best to hold the perturbation parameter fixed and let the "stickiness" vary to 9 adjust the interaction strength. The stickiness, |tau|, is defined in the equation 10 below and is a function of both the perturbation parameter and the interaction strength. 11 |tau| and |epsilon| are defined in terms of the hard sphere diameter (|sigma| = 2\*\ *R*\ ), 12 the width of the square well, |bigdelta| (same units as *R*), and the depth of the well, 13 *Uo*, in units of kT. From the definition, it is clear that smaller |tau| means stronger 14 attraction. 9 The perturb (perturbation parameter), |epsilon|, should be held between 0.01 10 and 0.1. It is best to hold the perturbation parameter fixed and let 11 the "stickiness" vary to adjust the interaction strength. The stickiness, 12 |tau|, is defined in the equation below and is a function of both the 13 perturbation parameter and the interaction strength. |tau| and |epsilon| 14 are defined in terms of the hard sphere diameter (|sigma| = 2\*\ *R*\ ), the 15 width of the square well, |bigdelta| (same units as *R*), and the depth of 16 the well, *Uo*, in units of kT. From the definition, it is clear that 17 smaller |tau| means stronger attraction. 15 18 16 19 .. image:: img/stickyhardsphere_228.PNG … … 20 23 .. image:: img/stickyhardsphere_229.PNG 21 24 22 The Percus-Yevick (PY) closure was used for this calculation, and is an adequate closure 23 for an attractive interparticle potential. This solution has been compared to Monte Carlo 24 simulations for a square well fluid, with good agreement. 25 The Percus-Yevick (PY) closure was used for this calculation, and is an 26 adequate closure for an attractive interparticle potential. This solution 27 has been compared to Monte Carlo simulations for a square well fluid, with 28 good agreement. 25 29 26 The true particle volume fraction, |phi|, is not equal to *h*, which appears in most of 27 the reference. The two are related in equation (24) of the reference. The reference also 28 describes the relationship between this perturbation solution and the original sticky hard 29 sphere (or adhesive sphere) model by Baxter. 30 The true particle volume fraction, |phi|, is not equal to *h*, which appears 31 in most of the reference. The two are related in equation (24) of the 32 reference. The reference also describes the relationship between this 33 perturbation solution and the original sticky hard sphere (or adhesive 34 sphere) model by Baxter. 30 35 31 NB: The calculation can go haywire for certain combinations of the input parameters, 32 producing unphysical solutions - in this case errors are reported to the command window and 33 the *S(q)* is set to -1 (so it will disappear on a log-log plot). Use tight bounds to keep 34 the parameters to values that you know are physical (test them) and keep nudging them until 36 NB: The calculation can go haywire for certain combinations of the input 37 parameters, producing unphysical solutions - in this case errors are 38 reported to the command window and the *S(q)* is set to -1 (so it will 39 disappear on a log-log plot). Use tight bounds to keep the parameters to 40 values that you know are physical (test them) and keep nudging them until 35 41 the optimization does not hit the constraints. 36 42 37 In sasview the effective radius will be calculated from the parameters used in the38 form factor P(Q) that this S(Q) is combined with.43 In sasview the effective radius will be calculated from the parameters 44 used in the form factor P(Q) that this S(Q) is combined with. 39 45 40 For 2D data: The 2D scattering intensity is calculated in the same way as 1D, where41 the *q* vector is defined as46 For 2D data: The 2D scattering intensity is calculated in the same way 47 as 1D, where the *q* vector is defined as 42 48 43 49 .. math:: … … 99 105 100 106 Iq = """ 101 102 103 104 107 double onemineps,eta; 108 double sig,aa,etam1,etam1sq,qa,qb,qc,radic; 109 double lam,lam2,test,mu,alpha,beta; 110 double kk,k2,k3,ds,dc,aq1,aq2,aq3,aq,bq1,bq2,bq3,bq,sq; 105 111 106 107 112 onemineps = 1.0-perturb; 113 eta = volfraction/onemineps/onemineps/onemineps; 108 114 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 161 115 sig = 2.0 * effect_radius; 116 aa = sig/onemineps; 117 etam1 = 1.0 - eta; 118 etam1sq=etam1*etam1; 119 //C 120 //C SOLVE QUADRATIC FOR LAMBDA 121 //C 122 qa = eta/12.0; 123 qb = -1.0*(stickiness + eta/etam1); 124 qc = (1.0 + eta/2.0)/etam1sq; 125 radic = qb*qb - 4.0*qa*qc; 126 if(radic<0) { 127 //if(x>0.01 && x<0.015) 128 // Print "Lambda unphysical - both roots imaginary" 129 //endif 130 return(-1.0); 131 } 132 //C KEEP THE SMALLER ROOT, THE LARGER ONE IS UNPHYSICAL 133 lam = (-1.0*qb-sqrt(radic))/(2.0*qa); 134 lam2 = (-1.0*qb+sqrt(radic))/(2.0*qa); 135 if(lam2<lam) { 136 lam = lam2; 137 } 138 test = 1.0 + 2.0*eta; 139 mu = lam*eta*etam1; 140 if(mu>test) { 141 //if(x>0.01 && x<0.015) 142 // Print "Lambda unphysical mu>test" 143 //endif 144 return(-1.0); 145 } 146 alpha = (1.0 + 2.0*eta - mu)/etam1sq; 147 beta = (mu - 3.0*eta)/(2.0*etam1sq); 148 //C 149 //C CALCULATE THE STRUCTURE FACTOR 150 //C 151 kk = q*aa; 152 k2 = kk*kk; 153 k3 = kk*k2; 154 SINCOS(kk,ds,dc); 155 //ds = sin(kk); 156 //dc = cos(kk); 157 aq1 = ((ds - kk*dc)*alpha)/k3; 158 aq2 = (beta*(1.0-dc))/k2; 159 aq3 = (lam*ds)/(12.0*kk); 160 aq = 1.0 + 12.0*eta*(aq1+aq2-aq3); 161 // 162 bq1 = alpha*(0.5/kk - ds/k2 + (1.0 - dc)/k3); 163 bq2 = beta*(1.0/kk - ds/k2); 164 bq3 = (lam/12.0)*((1.0 - dc)/kk); 165 bq = 12.0*eta*(bq1+bq2-bq3); 166 // 167 sq = 1.0/(aq*aq +bq*bq); 162 168 163 169 return(sq); 164 170 """ 165 171 … … 176 182 stickiness=0.2, effect_radius_pd=0.1, effect_radius_pd_n=40) 177 183 178 179
Note: See TracChangeset
for help on using the changeset viewer.