source: sasmodels/sasmodels/models/hollow_cylinder.c @ ed23abe

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

hollow_cylinder: fix errors introduced by code cleanup

  • Property mode set to 100644
File size: 2.5 KB
Line 
1double form_volume(double radius, double thickness, double length);
2double Iq(double q, double radius, double thickness, double length, double sld,
3        double solvent_sld);
4double Iqxy(double qx, double qy, double radius, double thickness, double length, double sld,
5        double solvent_sld, double theta, double phi);
6
7//#define INVALID(v) (v.radius_core >= v.radius)
8
9// From Igor library
10static double
11_hollow_cylinder_scaling(double integrand, double delrho, double volume)
12{
13    return 1.0e-4 * square(volume * delrho) * integrand;
14}
15
16
17static double
18_hollow_cylinder_kernel(double q,
19    double radius, double thickness, double length, double sin_val, double cos_val)
20{
21    const double qs = q*sin_val;
22    const double lam1 = sas_J1c((radius+thickness)*qs);
23    const double lam2 = sas_J1c(radius*qs);
24    const double gamma_sq = square(radius/(radius+thickness));
25    //Note: lim_{r -> r_c} psi = J0(radius_core*qs)
26    const double psi = (lam1 - gamma_sq*lam2)/(1.0 - gamma_sq); //SRK 10/19/00
27    const double t2 = sinc(0.5*q*length*cos_val);
28    return psi*t2;
29}
30
31double
32form_volume(double radius, double thickness, double length)
33{
34    double v_shell = M_PI*length*(square(radius+thickness) - radius*radius);
35    return v_shell;
36}
37
38
39double
40Iq(double q, double radius, double thickness, double length,
41    double sld, double solvent_sld)
42{
43    const double lower = 0.0;
44    const double upper = 1.0;           //limits of numerical integral
45
46    double summ = 0.0;                  //initialize intergral
47    for (int i=0;i<76;i++) {
48        const double cos_val = 0.5*( Gauss76Z[i] * (upper-lower) + lower + upper );
49        const double sin_val = sqrt(1.0 - cos_val*cos_val);
50        const double inter = _hollow_cylinder_kernel(q, radius, thickness, length,
51                                                     sin_val, cos_val);
52        summ += Gauss76Wt[i] * inter * inter;
53    }
54
55    const double Aq = 0.5*summ*(upper-lower);
56    const double volume = form_volume(radius, thickness, length);
57    return _hollow_cylinder_scaling(Aq, solvent_sld - sld, volume);
58}
59
60double
61Iqxy(double qx, double qy,
62    double radius, double thickness, double length,
63    double sld, double solvent_sld, double theta, double phi)
64{
65    double q, sin_alpha, cos_alpha;
66    ORIENT_SYMMETRIC(qx, qy, theta, phi, q, sin_alpha, cos_alpha);
67    const double Aq = _hollow_cylinder_kernel(q, radius, thickness, length,
68        sin_alpha, cos_alpha);
69
70    const double vol = form_volume(radius, thickness, length);
71    return _hollow_cylinder_scaling(Aq*Aq, solvent_sld-sld, vol);
72}
73
Note: See TracBrowser for help on using the repository browser.