static double f_exp(double q, double r, double sld_in, double sld_out, double thickness, double A) { const double vol = 4.0/3.0 * M_PI * r * r * r; const double qr = q * r; const double alpha = A * r/thickness; const double bes = sph_j1c(qr); const double B = (sld_out - sld_in)/expm1(A); const double C = sld_in - B; double fun; if (qr == 0.0) { fun = 1.0; } else if (fabs(A) > 0.0) { const double qrsq = qr*qr; const double alphasq = alpha*alpha; const double sumsq = alphasq + qrsq; double sinqr, cosqr; SINCOS(qr, sinqr, cosqr); fun = -3.0( ((alphasq - qrsq)*sinqr/qr - 2.0*alpha*cosqr) / sumsq - (alpha*sinqr/qr - cosqr) ) / sumsq; } else { fun = bes; } return vol * (B*fun + C*bes); } static double f_linear(double q, double r, double sld, double slope) { const double vol = 4.0/3.0 * M_PI * r * r * r; const double qr = q * r; const double bes = sph_j1c(qr); double fun = 0.0; if (qr > 0.0) { const double qrsq = qr*qr; double sinqr, cosqr; SINCOS(qr, sinqr, cosqr); // Jae-He's code seems to simplify to this // fun = 3.0 * slope * r * (2.0*qr*sinqr - (qrsq-2.0)*cosqr)/(qrsq*qrsq); // Rederiving the math, we get the following instead: fun = 3.0 * slope * r * (2.0*cosqr + qr*sinqr)/(qrsq*qrsq); } return vol * (sld*bes + fun); } static double f_constant(double q, double r, double sld) { const double bes = sph_j1c(q * r); const double vol = 4.0/3.0 * M_PI * r * r * r; return sld * vol * bes; } static double form_volume(double core_radius, double n, double thickness[]) { int i; double r = core_radius; for (i=0; i < n; i++) { r += thickness[i]; } return 4.0/3.0 * M_PI * r * r * r; } static double Iq(double q, double core_sld, double core_radius, double solvent_sld, double n, double in_sld[], double out_sld[], double thickness[], double A[]) { int i; r = core_radius; f = f_constant(q, r, core_sld); for (i=0; i