source: sasmodels/sasmodels/models/ellipsoid.c @ 92ce163

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 92ce163 was 5bddd89, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

use ORIENT macro for remaining symmetric models

  • Property mode set to 100644
File size: 2.0 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 q, sin_alpha, cos_alpha;
52    ORIENT_SYMMETRIC(qx, qy, theta, phi, q, sin_alpha, cos_alpha);
53    const double form = _ellipsoid_kernel(q, radius_polar, radius_equatorial, sin_alpha);
54    const double s = (sld - sld_solvent) * form_volume(radius_polar, radius_equatorial);
55
56    return 1.0e-4 * form * s * s;
57}
58
Note: See TracBrowser for help on using the repository browser.