1 | /* PARAMETERS |
---|
2 | { |
---|
3 | name: "ellipsoid", |
---|
4 | title: "Ellipsoid with uniform scattering length density", |
---|
5 | include: [ "lib/gauss76.c" ], |
---|
6 | parameters: [ |
---|
7 | // [ "name", "units", default, [lower, upper], "type", "description" ], |
---|
8 | [ "sld", "1e-6/Ang^2", 4, [-Infinity,Infinity], "", |
---|
9 | "Cylinder scattering length density" ], |
---|
10 | [ "solvent_sld", "1e-6/Ang^2", 1, [-Infinity,Infinity], "", |
---|
11 | "Solvent scattering length density" ], |
---|
12 | [ "a", "Ang", 20, [0, Infinity], "volume", |
---|
13 | "Cylinder radius" ], |
---|
14 | [ "b", "Ang", 20, [0, Infinity], "volume", |
---|
15 | "Cylinder length" ], |
---|
16 | [ "theta", "degrees", 60, [-Infinity, Infinity], "orientation", |
---|
17 | "In plane angle" ], |
---|
18 | [ "phi", "degrees", 60, [-Infinity, Infinity], "orientation", |
---|
19 | "Out of plane angle" ], |
---|
20 | ], |
---|
21 | } |
---|
22 | PARAMETERS END |
---|
23 | |
---|
24 | DOCUMENTATION |
---|
25 | .. _EllipseModel: |
---|
26 | |
---|
27 | DOCUMENTATION END |
---|
28 | */ |
---|
29 | |
---|
30 | real form_volume(real a, real b); |
---|
31 | real Iq(real qx, real qy, real sld, real solvent_sld, real a, real b); |
---|
32 | real Iqxy(real qx, real qy, real sld, real solvent_sld, real a, real b, real theta, real phi); |
---|
33 | |
---|
34 | real form_volume(real a, real b) |
---|
35 | { |
---|
36 | return REAL(1.333333333333333)*M_PI_2*a*b*b; |
---|
37 | } |
---|
38 | |
---|
39 | real ellipsoid_kernel(double q, double b, double a, double dum) |
---|
40 | { |
---|
41 | real sn, cn; |
---|
42 | const real nu = a/b; |
---|
43 | const real arg = q * b * sqrt(REAL(1.0)+(dum*dum*(nu*nu--REAL(1.0)))); |
---|
44 | SINCOS(arg, sn, cn); |
---|
45 | const real f = (arg==REAL(0.0) ? REAL(1.0) : REAL(3.0)*(sn-arg*cn)/(arg*arg*arg); |
---|
46 | return f*f; |
---|
47 | } |
---|
48 | |
---|
49 | real Iq(real q, |
---|
50 | real sld, |
---|
51 | real solvent_sld, |
---|
52 | real a, |
---|
53 | real b) |
---|
54 | { |
---|
55 | real summ = REAL(0.0); |
---|
56 | for (int i=0;i<76;i++) { |
---|
57 | //const real zi = ( Gauss76Z[i]*(uplim-lolim) + uplim + lolim )/2.0; |
---|
58 | zi = ( Gauss76Z[i] + REAL(1.0))/REAL(2.0); |
---|
59 | summ += Gauss76Wt[i] * ellipsoid_kernel(q, b, a, zi); |
---|
60 | } |
---|
61 | //const real form = (uplim-lolim)/2.0*summ; |
---|
62 | const real form = REAL(0.5)*summ |
---|
63 | const real s = (sld - sld_solvent) * form_volume(a, b); |
---|
64 | return REAL(1.0e-4) * form * s * s; |
---|
65 | } |
---|
66 | |
---|
67 | real Iqxy(real qx, real qy, |
---|
68 | real sld, |
---|
69 | real solvent_sld, |
---|
70 | real a, |
---|
71 | real b, |
---|
72 | real theta, |
---|
73 | real phi) |
---|
74 | { |
---|
75 | real sn, cn; |
---|
76 | |
---|
77 | const real q = sqrt(qx*qx + qy*qy); |
---|
78 | SINCOS(theta*M_PI_180, sn, cn); |
---|
79 | const real cos_val = cn*cos(phi*M_PI_180)*(qx/q) + sn*(qy/q); |
---|
80 | const real form = ellipsoid_kernel(q, b, a, cos_val); |
---|
81 | const real s = (sld - solvent_sld) * form_volume(a, b); |
---|
82 | |
---|
83 | return REAL(1.0e-4) * form * s * s; |
---|
84 | } |
---|
85 | |
---|