source: sasmodels/sasmodels/models/lamellarPC_kernel.c @ d1fe925

gh-pages
Last change on this file since d1fe925 was d1fe925, checked in by ajj, 8 years ago

Creating gh_pages branch for docs

  • Property mode set to 100644
File size: 2.0 KB
Line 
1/*      Lamellar_ParaCrystal - Pedersen's model
2
3*/
4double Iq(double qval,
5      double th,
6      double Nlayers, 
7          double davg, 
8          double pd,
9      double sld,
10      double solvent_sld);
11double paraCryst_sn(double ww, double qval, double davg, long Nlayers, double an);
12double paraCryst_an(double ww, double qval, double davg, long Nlayers);
13
14double Iq(double qval,
15      double th,
16      double Nlayers, 
17          double davg, 
18          double pd,
19      double sld,
20      double solvent_sld)
21{
22   
23        double inten,contr,xn;
24        double xi,ww,Pbil,Znq,Snq,an;
25        long n1,n2;
26       
27        contr = sld - solvent_sld;
28        //get the fractional part of Nlayers, to determine the "mixing" of N's
29       
30        n1 = (long)trunc(Nlayers);              //rounds towards zero
31        n2 = n1 + 1;
32        xn = (double)n2 - Nlayers;                      //fractional contribution of n1
33       
34        ww = exp(-qval*qval*pd*pd*davg*davg/2.0);
35       
36        //calculate the n1 contribution
37        an = paraCryst_an(ww,qval,davg,n1);
38        Snq = paraCryst_sn(ww,qval,davg,n1,an);
39       
40        Znq = xn*Snq;
41       
42        //calculate the n2 contribution
43        an = paraCryst_an(ww,qval,davg,n2);
44        Snq = paraCryst_sn(ww,qval,davg,n2,an);
45       
46        Znq += (1.0-xn)*Snq;
47       
48        //and the independent contribution
49        Znq += (1.0-ww*ww)/(1.0+ww*ww-2.0*ww*cos(qval*davg));
50       
51        //the limit when Nlayers approaches infinity
52//      Zq = (1-ww^2)/(1+ww^2-2*ww*cos(qval*davg))
53       
54        xi = th/2.0;            //use 1/2 the bilayer thickness
55        Pbil = (sin(qval*xi)/(qval*xi))*(sin(qval*xi)/(qval*xi));
56       
57        inten = 2.0*M_PI*contr*contr*Pbil*Znq/(qval*qval);
58        inten *= 1.0e-04;
59       
60        return(inten);
61}
62
63// functions for the lamellar paracrystal model
64double
65paraCryst_sn(double ww, double qval, double davg, long Nlayers, double an) {
66       
67        double Snq;
68       
69        Snq = an/( (double)Nlayers*pow((1.0+ww*ww-2.0*ww*cos(qval*davg)),2) );
70       
71        return(Snq);
72}
73
74double
75paraCryst_an(double ww, double qval, double davg, long Nlayers) {
76       
77        double an;
78       
79        an = 4.0*ww*ww - 2.0*(ww*ww*ww+ww)*cos(qval*davg);
80        an -= 4.0*pow(ww,(Nlayers+2))*cos((double)Nlayers*qval*davg);
81        an += 2.0*pow(ww,(Nlayers+3))*cos((double)(Nlayers-1)*qval*davg);
82        an += 2.0*pow(ww,(Nlayers+1))*cos((double)(Nlayers+1)*qval*davg);
83       
84        return(an);
85}
86
Note: See TracBrowser for help on using the repository browser.