Ignore:
Timestamp:
Mar 30, 2010 5:53:47 PM (14 years ago)
Author:
Jae Cho <jhjcho@…>
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
Message:

updated libigor files from NIST svn

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sansmodels/src/libigor/libTwoPhase.c

    rae3ce4e r6e93a02  
    116116} 
    117117 
     118// 6 JUL 2009 SRK changed definition of Izero scale factor to be uncorrelated with range 
     119// 
    118120double 
    119121DAB_Model(double dp[], double q) 
     
    127129        incoh = dp[2];  
    128130         
    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; 
    130132         
    131133        return(inten); 
     
    152154        ans = G1*exp(-x*x*Rg1*Rg1/3.0); 
    153155        ans += B1*pow((erf1*erf1*erf1/x),Pow1); 
     156         
     157        if(x == 0) { 
     158                ans = G1; 
     159        } 
    154160         
    155161        ans *= scale; 
     
    188194        ans += G2*exp(-x*x*Rg2*Rg2/3.0); 
    189195        ans += B2*pow((erf2*erf2*erf2/x),Pow2); 
     196 
     197        if(x == 0) { 
     198                ans = G1+G2; 
     199        } 
    190200         
    191201        ans *= scale; 
     
    230240        ans += G2*exp(-x*x*Rg2*Rg2/3.0) + B2*exp(-x*x*Rg3*Rg3/3.0)*pow((erf2*erf2*erf2/x),Pow2); 
    231241        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        } 
    232246         
    233247        ans *= scale; 
     
    278292        ans += G3*exp(-x*x*Rg3*Rg3/3.0) + B3*exp(-x*x*Rg4*Rg4/3.0)*pow((erf3*erf3*erf3/x),Pow3); 
    279293        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        } 
    280298         
    281299        ans *= scale; 
     
    283301         
    284302    return(ans); 
     303} 
     304 
     305double 
     306BroadPeak(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 
     334double 
     335CorrLength(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 
     361double 
     362TwoLorentzian(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 
     390double 
     391TwoPowerLaw(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 
     419double 
     420PolyGaussCoil(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 
     454double 
     455GaussLorentzGel(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); 
    285474} 
    286475 
     
    303492} 
    304493 
    305  
     494double 
     495GaussianShell(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.