source: sasmodels/sasmodels/models/ellipsoid.c @ 0d6e865

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 0d6e865 was 0d6e865, checked in by dirk, 8 years ago

Rewriting selected models in spherical coordinates. This fixes ticket #492 for these models.

  • Property mode set to 100644
File size: 2.2 KB
Line 
1double form_volume(double radius_polar, double radius_equatorial);
2double Iq(double q, double sld, double sld_solvent, double radius_polar, double radius_equatorial);
3double Iqxy(double qx, double qy, double sld, double sld_solvent,
4    double radius_polar, double radius_equatorial, double theta, double phi);
5
6double _ellipsoid_kernel(double q, double radius_polar, double radius_equatorial, double sin_alpha);
7double _ellipsoid_kernel(double q, double radius_polar, double radius_equatorial, double sin_alpha)
8{
9    double ratio = radius_polar/radius_equatorial;
10    const double u = q*radius_equatorial*sqrt(1.0
11                   + sin_alpha*sin_alpha*(ratio*ratio - 1.0));
12    const double f = sph_j1c(u);
13
14    return f*f;
15}
16
17double form_volume(double radius_polar, double radius_equatorial)
18{
19    return M_4PI_3*radius_polar*radius_equatorial*radius_equatorial;
20}
21
22double Iq(double q,
23    double sld,
24    double sld_solvent,
25    double radius_polar,
26    double radius_equatorial)
27{
28    // translate a point in [-1,1] to a point in [0, 1]
29    const double zm = 0.5;
30    const double zb = 0.5;
31    double total = 0.0;
32    for (int i=0;i<76;i++) {
33        //const double sin_alpha = (Gauss76Z[i]*(upper-lower) + upper + lower)/2;
34        const double sin_alpha = Gauss76Z[i]*zm + zb;
35        total += Gauss76Wt[i] * _ellipsoid_kernel(q, radius_polar, radius_equatorial, sin_alpha);
36    }
37    // translate dx in [-1,1] to dx in [lower,upper]
38    const double form = total*zm;
39    const double s = (sld - sld_solvent) * form_volume(radius_polar, radius_equatorial);
40    return 1.0e-4 * s * s * form;
41}
42
43double Iqxy(double qx, double qy,
44    double sld,
45    double sld_solvent,
46    double radius_polar,
47    double radius_equatorial,
48    double theta,
49    double phi)
50{
51    double sn, cn;
52
53    const double q = sqrt(qx*qx + qy*qy);
54    SINCOS(phi*M_PI_180, sn, cn);
55    const double cos_alpha = (q==0. ? 1.0 : (cn*qx + sn*qy)*sin(theta*M_PI_180)/q);
56    const double alpha = acos(cos_alpha);
57    SINCOS(alpha, sn, cn);
58    const double form = _ellipsoid_kernel(q, radius_polar, radius_equatorial, sn);
59    const double s = (sld - sld_solvent) * form_volume(radius_polar, radius_equatorial);
60
61    return 1.0e-4 * form * s * s;
62}
63
Note: See TracBrowser for help on using the repository browser.