Changeset eb63414 in sasmodels for sasmodels/models/rpa.c
- Timestamp:
- Mar 7, 2017 2:04:48 PM (7 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 3a45c2c
- Parents:
- a57b31d (diff), 20c856a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/models/rpa.c
rfa4a994 reb63414 39 39 double S31,S32,S33,S34,S41,S42,S43,S44; 40 40 double Lad,Lbd,Lcd,Nav,Intg; 41 41 42 // Set values for non existent parameters (eg. no A or B in case 0 and 1 etc) 42 43 //icase was shifted to N-1 from the original code 43 44 if (icase <= 1){ … … 57 58 Kab = Kac = Kad = -0.0004; 58 59 } 59 60 61 // Set volume fraction of component D based on constraint that sum of vol frac =1 62 Phi[3]=1.0-Phi[0]-Phi[1]-Phi[2]; 63 64 //set up values for cross terms in case of block copolymers (1,3,4,6,7,8,9) 60 65 Nab=sqrt(N[0]*N[1]); 61 66 Nac=sqrt(N[0]*N[2]); … … 79 84 Phicd=sqrt(Phi[2]*Phi[3]); 80 85 86 // Calculate Q^2 * Rg^2 for each homopolymer assuming random walk 81 87 Xa=q*q*b[0]*b[0]*N[0]/6.0; 82 88 Xb=q*q*b[1]*b[1]*N[1]/6.0; … … 84 90 Xd=q*q*b[3]*b[3]*N[3]/6.0; 85 91 86 Paa=2.0*(exp(-Xa)-1.0+Xa)/(Xa*Xa); 87 S0aa=N[0]*Phi[0]*v[0]*Paa; 88 Pab=((1.0-exp(-Xa))/Xa)*((1.0-exp(-Xb))/Xb); 92 //calculate all partial structure factors Pij and normalize n^2 93 Paa=2.0*(exp(-Xa)-1.0+Xa)/(Xa*Xa); // free A chain form factor 94 S0aa=N[0]*Phi[0]*v[0]*Paa; // Phi * Vp * P(Q)= I(Q0)/delRho^2 95 Pab=((1.0-exp(-Xa))/Xa)*((1.0-exp(-Xb))/Xb); //AB diblock (anchored Paa * anchored Pbb) partial form factor 89 96 S0ab=(Phiab*vab*Nab)*Pab; 90 Pac=((1.0-exp(-Xa))/Xa)*exp(-Xb)*((1.0-exp(-Xc))/Xc); 97 Pac=((1.0-exp(-Xa))/Xa)*exp(-Xb)*((1.0-exp(-Xc))/Xc); //ABC triblock AC partial form factor 91 98 S0ac=(Phiac*vac*Nac)*Pac; 92 Pad=((1.0-exp(-Xa))/Xa)*exp(-Xb-Xc)*((1.0-exp(-Xd))/Xd); 99 Pad=((1.0-exp(-Xa))/Xa)*exp(-Xb-Xc)*((1.0-exp(-Xd))/Xd); //ABCD four block 93 100 S0ad=(Phiad*vad*Nad)*Pad; 94 101 95 102 S0ba=S0ab; 96 Pbb=2.0*(exp(-Xb)-1.0+Xb)/(Xb*Xb); 103 Pbb=2.0*(exp(-Xb)-1.0+Xb)/(Xb*Xb); // free B chain 97 104 S0bb=N[1]*Phi[1]*v[1]*Pbb; 98 Pbc=((1.0-exp(-Xb))/Xb)*((1.0-exp(-Xc))/Xc); 105 Pbc=((1.0-exp(-Xb))/Xb)*((1.0-exp(-Xc))/Xc); // BC diblock 99 106 S0bc=(Phibc*vbc*Nbc)*Pbc; 100 Pbd=((1.0-exp(-Xb))/Xb)*exp(-Xc)*((1.0-exp(-Xd))/Xd); 107 Pbd=((1.0-exp(-Xb))/Xb)*exp(-Xc)*((1.0-exp(-Xd))/Xd); // BCD triblock 101 108 S0bd=(Phibd*vbd*Nbd)*Pbd; 102 109 103 110 S0ca=S0ac; 104 111 S0cb=S0bc; 105 Pcc=2.0*(exp(-Xc)-1.0+Xc)/(Xc*Xc); 112 Pcc=2.0*(exp(-Xc)-1.0+Xc)/(Xc*Xc); // Free C chain 106 113 S0cc=N[2]*Phi[2]*v[2]*Pcc; 107 Pcd=((1.0-exp(-Xc))/Xc)*((1.0-exp(-Xd))/Xd); 114 Pcd=((1.0-exp(-Xc))/Xc)*((1.0-exp(-Xd))/Xd); // CD diblock 108 115 S0cd=(Phicd*vcd*Ncd)*Pcd; 109 116 … … 111 118 S0db=S0bd; 112 119 S0dc=S0cd; 113 Pdd=2.0*(exp(-Xd)-1.0+Xd)/(Xd*Xd); 120 Pdd=2.0*(exp(-Xd)-1.0+Xd)/(Xd*Xd); // free D chain 114 121 S0dd=N[3]*Phi[3]*v[3]*Pdd; 122 123 // Reset all unused partial structure factors to 0 (depends on case) 115 124 //icase was shifted to N-1 from the original code 116 125 switch(icase){ … … 193 202 S0dc=S0cd; 194 203 204 // self chi parameter is 0 ... of course 195 205 Kaa=0.0; 196 206 Kbb=0.0; … … 243 253 ZZ=S0ad*(T11*S0ad+T12*S0bd+T13*S0cd)+S0bd*(T21*S0ad+T22*S0bd+T23*S0cd)+S0cd*(T31*S0ad+T32*S0bd+T33*S0cd); 244 254 255 // D is considered the matrix or background component so enters here 245 256 m=1.0/(S0dd-ZZ); 246 257 … … 297 308 S44=S11+S22+S33+2.0*S12+2.0*S13+2.0*S23; 298 309 310 //calculate contrast where L[i] is the scattering length of i and D is the matrix 311 //Note that should multiply by Nav to get units of SLD which will become 312 // Nav*2 in the next line (SLD^2) but then normalization in that line would 313 //need to divide by Nav leaving only Nav or sqrt(Nav) before squaring. 299 314 Nav=6.022045e+23; 300 315 Lad=(L[0]/v[0]-L[3]/v[3])*sqrt(Nav); … … 303 318 304 319 Intg=Lad*Lad*S11+Lbd*Lbd*S22+Lcd*Lcd*S33+2.0*Lad*Lbd*S12+2.0*Lbd*Lcd*S23+2.0*Lad*Lcd*S13; 320 321 //rescale for units of Lij^2 (fm^2 to cm^2) 322 Intg *= 1.0e-26; 305 323 306 324 return Intg;
Note: See TracChangeset
for help on using the changeset viewer.