//#define INVALID(v) (v.radius_equat_minor > v.radius_equat_major || v.radius_equat_major > v.radius_polar) static double form_volume(double radius_equat_minor, double radius_equat_major, double radius_polar) { return M_4PI_3*radius_equat_minor*radius_equat_major*radius_polar; } static double radius_from_volume(double radius_equat_minor, double radius_equat_major, double radius_polar) { return cbrt(radius_equat_minor*radius_equat_major*radius_polar); } static double radius_from_min_dimension(double radius_equat_minor, double radius_equat_major, double radius_polar) { const double rad_equat_min = (radius_equat_minor < radius_equat_major ? radius_equat_minor : radius_equat_major); return (rad_equat_min < radius_polar ? rad_equat_min : radius_polar); } static double radius_from_max_dimension(double radius_equat_minor, double radius_equat_major, double radius_polar) { const double rad_equat_max = (radius_equat_minor < radius_equat_major ? radius_equat_major : radius_equat_minor); return (rad_equat_max > radius_polar ? rad_equat_max : radius_polar); } static double effective_radius(int mode, double radius_equat_minor, double radius_equat_major, double radius_polar) { switch (mode) { default: case 1: // equivalent sphere return radius_from_volume(radius_equat_minor,radius_equat_major, radius_polar); case 2: // min radius return radius_from_min_dimension(radius_equat_minor,radius_equat_major, radius_polar); case 3: // max radius return radius_from_max_dimension(radius_equat_minor,radius_equat_major, radius_polar); } } static void Fq(double q, double *F1, double *F2, double sld, double sld_solvent, double radius_equat_minor, double radius_equat_major, double radius_polar) { const double pa = square(radius_equat_minor/radius_equat_major) - 1.0; const double pc = square(radius_polar/radius_equat_major) - 1.0; // translate a point in [-1,1] to a point in [0, pi/2] const double zm = M_PI_4; const double zb = M_PI_4; double outer_sum_F1 = 0.0; double outer_sum_F2 = 0.0; for (int i=0;i