source: sasmodels/sasmodels/models/cylinder.c @ 0496031

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 0496031 was 0496031, checked in by Paul Kienzle <pkienzle@…>, 10 years ago

add theme to doc

  • Property mode set to 100644
File size: 2.3 KB
Line 
1real form_volume(real radius, real length);
2real Iq(real q, real sld, real solvent_sld, real radius, real length);
3real Iqxy(real qx, real qy, real sld, real solvent_sld,
4    real radius, real length, real theta, real phi);
5
6// twovd = 2 * volume * delta_rho
7// besarg = q * R * sin(alpha)
8// siarg = q * L/2 * cos(alpha)
9real _cyl(real twovd, real besarg, real siarg);
10real _cyl(real twovd, real besarg, real siarg)
11{
12    const real bj = (besarg == REAL(0.0) ? REAL(0.5) : J1(besarg)/besarg);
13    const real si = (siarg == REAL(0.0) ? REAL(1.0) : sin(siarg)/siarg);
14    return twovd*si*bj;
15}
16
17real form_volume(real radius, real length)
18{
19    return M_PI*radius*radius*length;
20}
21
22real Iq(real q,
23    real sld,
24    real solvent_sld,
25    real radius,
26    real length)
27{
28    const real qr = q*radius;
29    const real qh = q*REAL(0.5)*length;
30    const real twovd = REAL(2.0)*(sld-solvent_sld)*form_volume(radius, length);
31    real total = REAL(0.0);
32    // real lower=0, upper=M_PI_2;
33    for (int i=0; i<76 ;i++) {
34        // translate a point in [-1,1] to a point in [lower,upper]
35        //const real alpha = ( Gauss76Z[i]*(upper-lower) + upper + lower )/2.0;
36        const real alpha = REAL(0.5)*(Gauss76Z[i]*M_PI_2 + M_PI_2);
37        real sn, cn;
38        SINCOS(alpha, sn, cn);
39        const real fq = _cyl(twovd, qr*sn, qh*cn);
40        total += Gauss76Wt[i] * fq * fq * sn;
41    }
42    // translate dx in [-1,1] to dx in [lower,upper]
43    //const real form = (upper-lower)/2.0*total;
44    return REAL(1.0e-4) * total * M_PI_4;
45}
46
47
48real Iqxy(real qx, real qy,
49    real sld,
50    real solvent_sld,
51    real radius,
52    real length,
53    real theta,
54    real phi)
55{
56    // TODO: check that radius<0 and length<0 give zero scattering.
57    // This should be the case since the polydispersity weight vector should
58    // be zero length, and this function never called.
59    real sn, cn; // slots to hold sincos function output
60
61    // Compute angle alpha between q and the cylinder axis
62    SINCOS(theta*M_PI_180, sn, cn);
63    const real q = sqrt(qx*qx+qy*qy);
64    const real cos_val = cn*cos(phi*M_PI_180)*(qx/q) + sn*(qy/q);
65    const real alpha = acos(cos_val);
66
67    const real twovd = REAL(2.0)*(sld-solvent_sld)*form_volume(radius, length);
68    SINCOS(alpha, sn, cn);
69    const real fq = _cyl(twovd, q*radius*sn, q*REAL(0.5)*length*cn);
70    return REAL(1.0e-4) * fq * fq;
71}
Note: See TracBrowser for help on using the repository browser.