Changeset 6e93a02 in sasview for sansmodels/src/libigor/libTwoPhase.c
- Timestamp:
- Mar 30, 2010 5:53:47 PM (14 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- f10063e
- Parents:
- 64017a8
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sansmodels/src/libigor/libTwoPhase.c
rae3ce4e r6e93a02 116 116 } 117 117 118 // 6 JUL 2009 SRK changed definition of Izero scale factor to be uncorrelated with range 119 // 118 120 double 119 121 DAB_Model(double dp[], double q) … … 127 129 incoh = dp[2]; 128 130 129 inten = Izero/pow((1.0 + (qval*range)*(qval*range)),2) + incoh;131 inten = (Izero*range*range*range)/pow((1.0 + (qval*range)*(qval*range)),2) + incoh; 130 132 131 133 return(inten); … … 152 154 ans = G1*exp(-x*x*Rg1*Rg1/3.0); 153 155 ans += B1*pow((erf1*erf1*erf1/x),Pow1); 156 157 if(x == 0) { 158 ans = G1; 159 } 154 160 155 161 ans *= scale; … … 188 194 ans += G2*exp(-x*x*Rg2*Rg2/3.0); 189 195 ans += B2*pow((erf2*erf2*erf2/x),Pow2); 196 197 if(x == 0) { 198 ans = G1+G2; 199 } 190 200 191 201 ans *= scale; … … 230 240 ans += G2*exp(-x*x*Rg2*Rg2/3.0) + B2*exp(-x*x*Rg3*Rg3/3.0)*pow((erf2*erf2*erf2/x),Pow2); 231 241 ans += G3*exp(-x*x*Rg3*Rg3/3.0) + B3*pow((erf3*erf3*erf3/x),Pow3); 242 243 if(x == 0) { 244 ans = G1+G2+G3; 245 } 232 246 233 247 ans *= scale; … … 278 292 ans += G3*exp(-x*x*Rg3*Rg3/3.0) + B3*exp(-x*x*Rg4*Rg4/3.0)*pow((erf3*erf3*erf3/x),Pow3); 279 293 ans += G4*exp(-x*x*Rg4*Rg4/3.0) + B4*pow((erf4*erf4*erf4/x),Pow4); 294 295 if(x == 0) { 296 ans = G1+G2+G3+G4; 297 } 280 298 281 299 ans *= scale; … … 283 301 284 302 return(ans); 303 } 304 305 double 306 BroadPeak(double dp[], double q) 307 { 308 // variables are: 309 //[0] Porod term scaling 310 //[1] Porod exponent 311 //[2] Lorentzian term scaling 312 //[3] Lorentzian screening length [A] 313 //[4] peak location [1/A] 314 //[5] Lorentzian exponent 315 //[6] background 316 317 double aa,nn,cc,LL,Qzero,mm,bgd,inten,qval; 318 qval= q; 319 aa = dp[0]; 320 nn = dp[1]; 321 cc = dp[2]; 322 LL = dp[3]; 323 Qzero = dp[4]; 324 mm = dp[5]; 325 bgd = dp[6]; 326 327 inten = aa/pow(qval,nn); 328 inten += cc/(1.0 + pow((fabs(qval-Qzero)*LL),mm) ); 329 inten += bgd; 330 331 return(inten); 332 } 333 334 double 335 CorrLength(double dp[], double q) 336 { 337 // variables are: 338 //[0] Porod term scaling 339 //[1] Porod exponent 340 //[2] Lorentzian term scaling 341 //[3] Lorentzian screening length [A] 342 //[4] Lorentzian exponent 343 //[5] background 344 345 double aa,nn,cc,LL,mm,bgd,inten,qval; 346 qval= q; 347 aa = dp[0]; 348 nn = dp[1]; 349 cc = dp[2]; 350 LL = dp[3]; 351 mm = dp[4]; 352 bgd = dp[5]; 353 354 inten = aa/pow(qval,nn); 355 inten += cc/(1.0 + pow((qval*LL),mm) ); 356 inten += bgd; 357 358 return(inten); 359 } 360 361 double 362 TwoLorentzian(double dp[], double q) 363 { 364 // variables are: 365 //[0] Lorentzian term scaling 366 //[1] Lorentzian screening length [A] 367 //[2] Lorentzian exponent 368 //[3] Lorentzian #2 term scaling 369 //[4] Lorentzian #2 screening length [A] 370 //[5] Lorentzian #2 exponent 371 //[6] background 372 373 double aa,LL1,nn,cc,LL2,mm,bgd,inten,qval; 374 qval= q; 375 aa = dp[0]; 376 LL1 = dp[1]; 377 nn = dp[2]; 378 cc = dp[3]; 379 LL2 = dp[4]; 380 mm = dp[5]; 381 bgd= dp[6]; 382 383 inten = aa/(1.0 + pow((qval*LL1),nn) ); 384 inten += cc/(1.0 + pow((qval*LL2),mm) ); 385 inten += bgd; 386 387 return(inten); 388 } 389 390 double 391 TwoPowerLaw(double dp[], double q) 392 { 393 //[0] Coefficient 394 //[1] (-) Power @ low Q 395 //[2] (-) Power @ high Q 396 //[3] crossover Q-value 397 //[4] incoherent background 398 399 double A, m1,m2,qc,bgd,scale,inten,qval; 400 qval= q; 401 A = dp[0]; 402 m1 = dp[1]; 403 m2 = dp[2]; 404 qc = dp[3]; 405 bgd = dp[4]; 406 407 if(qval<=qc){ 408 inten = A*pow(qval,-1.0*m1); 409 } else { 410 scale = A*pow(qc,-1.0*m1) / pow(qc,-1.0*m2); 411 inten = scale*pow(qval,-1.0*m2); 412 } 413 414 inten += bgd; 415 416 return(inten); 417 } 418 419 double 420 PolyGaussCoil(double dp[], double x) 421 { 422 //w[0] = scale 423 //w[1] = radius of gyration [] 424 //w[2] = polydispersity, ratio of Mw/Mn 425 //w[3] = bkg [cm-1] 426 427 double scale,bkg,Rg,uval,Mw_Mn,inten,xi; 428 429 scale = dp[0]; 430 Rg = dp[1]; 431 Mw_Mn = dp[2]; 432 bkg = dp[3]; 433 434 uval = Mw_Mn - 1.0; 435 if(uval == 0.0) { 436 uval = 1e-6; //avoid divide by zero error 437 } 438 439 xi = Rg*Rg*x*x/(1.0+2.0*uval); 440 441 if(xi < 1e-3) { 442 return(scale+bkg); //limiting value 443 } 444 445 inten = 2.0*(pow((1.0+uval*xi),(-1.0/uval))+xi-1.0); 446 inten /= (1.0+uval)*xi*xi; 447 448 inten *= scale; 449 //add in the background 450 inten += bkg; 451 return(inten); 452 } 453 454 double 455 GaussLorentzGel(double dp[], double x) 456 { 457 //[0] Gaussian scale factor 458 //[1] Gaussian (static) screening length 459 //[2] Lorentzian (fluctuation) scale factor 460 //[3] Lorentzian screening length 461 //[4] incoherent background 462 463 double Ig0,gg,Il0,ll,bgd,inten; 464 465 Ig0 = dp[0]; 466 gg = dp[1]; 467 Il0 = dp[2]; 468 ll = dp[3]; 469 bgd = dp[4]; 470 471 inten = Ig0*exp(-1.0*x*x*gg*gg/2.0) + Il0/(1.0 + (x*ll)*(x*ll)) + bgd; 472 473 return(inten); 285 474 } 286 475 … … 303 492 } 304 493 305 494 double 495 GaussianShell(double w[], double x) 496 { 497 // variables are: 498 //[0] scale 499 //[1] radius () 500 //[2] thick () (thickness parameter - this is the std. dev. of the Gaussian width of the shell) 501 //[3] polydispersity of the radius 502 //[4] sld shell (-2) 503 //[5] sld solvent 504 //[6] background (cm-1) 505 506 double scale,rad,delrho,bkg,del,thick,pd,sig,pi; 507 double t1,t2,t3,t4,retval,exfact,vshell,vexcl,sldShell,sldSolvent; 508 scale = w[0]; 509 rad = w[1]; 510 thick = w[2]; 511 pd = w[3]; 512 sldShell = w[4]; 513 sldSolvent = w[5]; 514 bkg = w[6]; 515 516 delrho = w[4] - w[5]; 517 sig = pd*rad; 518 519 pi = 4.0*atan(1.0); 520 521 ///APPROXIMATION (see eqn 4 - but not a bad approximation) 522 // del is the equivalent shell thickness with sharp boundaries, centered at mean radius 523 del = thick*sqrt(2.0*pi); 524 525 // calculate the polydisperse shell volume and the excluded volume 526 vshell=4.0*pi/3.0*( pow((rad+del/2.0),3) - pow((rad-del/2.0),3) ) *(1.0+pd*pd); 527 vexcl=4.0*pi/3.0*( pow((rad+del/2.0),3) ) *(1.0+pd*pd); 528 529 //intensity, eqn 9(a-d) 530 exfact = exp(-2.0*sig*sig*x*x); 531 532 t1 = 0.5*x*x*thick*thick*thick*thick*(1.0+cos(2.0*x*rad)*exfact); 533 t2 = x*thick*thick*(rad*sin(2.0*x*rad) + 2.0*x*sig*sig*cos(2.0*x*rad))*exfact; 534 t3 = 0.5*rad*rad*(1.0-cos(2.0*x*rad)*exfact); 535 t4 = 0.5*sig*sig*(1.0+4.0*x*rad*sin(2.0*x*rad)*exfact+cos(2.0*x*rad)*(4.0*sig*sig*x*x-1.0)*exfact); 536 537 retval = t1+t2+t3+t4; 538 retval *= exp(-1.0*x*x*thick*thick); 539 retval *= (del*del/x/x); 540 retval *= 16.0*pi*pi*delrho*delrho*scale; 541 retval *= 1.0e8; 542 543 //NORMALIZED by the AVERAGE shell volume, since scale is the volume fraction of material 544 // retval /= vshell 545 retval /= vexcl; 546 //re-normalize by polydisperse sphere volume, Gaussian distribution 547 retval /= (1.0+3.0*pd*pd); 548 549 retval += bkg; 550 551 return(retval); 552 } 553 554
Note: See TracChangeset
for help on using the changeset viewer.