double form_volume(double r_minor, double r_ratio, double length); double Iq(double q, double r_minor, double r_ratio, double length, double sld, double solvent_sld); double Iqxy(double qx, double qy, double r_minor, double r_ratio, double length, double sld, double solvent_sld, double theta, double phi, double psi); double _elliptical_cylinder_kernel(double q, double r_minor, double r_ratio, double theta); double _elliptical_cylinder_kernel(double q, double r_minor, double r_ratio, double theta) { // This is the function LAMBDA1^2 in Feigin's notation // q is the q-value for the calculation (1/A) // r_minor is the transformed radius"a" in Feigin's notation // r_ratio is the ratio (major radius)/(minor radius) of the Ellipsoid [=] --- // theta is the dummy variable of the integration double retval,arg; arg = q*r_minor*sqrt((1.0+r_ratio*r_ratio)/2+(1.0-r_ratio*r_ratio)*cos(theta)/2); //retval = 2.0*J1(arg)/arg; retval = sas_J1c(arg); return retval*retval ; } double form_volume(double r_minor, double r_ratio, double length) { return M_PI * r_minor * r_minor * r_ratio * length; } double Iq(double q, double r_minor, double r_ratio, double length, double sld, double solvent_sld) { const int nordi=76; //order of integration const int nordj=20; double va,vb; //upper and lower integration limits double summ,zi,yyy,answer; //running tally of integration double summj,vaj,vbj,zij,arg,si; //for the inner integration // orientational average limits va = 0.0; vb = 1.0; // inner integral limits vaj=0.0; vbj=M_PI; //initialize integral summ = 0.0; const double delrho = sld - solvent_sld; for(int i=0;i1.0) { //printf("cyl_ana_2D: Unexpected error: cos(alpha)>1\n"); cos_val = 1.0; } if (fabs(cos_nu)>1.0) { //printf("cyl_ana_2D: Unexpected error: cos(nu)>1\n"); cos_nu = 1.0; } if (fabs(cos_mu)>1.0) { //printf("cyl_ana_2D: Unexpected error: cos(nu)>1\n"); cos_mu = 1.0; } const double r_major = r_ratio * r_minor; const double qr = q*sqrt( r_major*r_major*cos_nu*cos_nu + r_minor*r_minor*cos_mu*cos_mu ); const double qL = q*length*cos_val/2.0; double Be; if (qr==0){ Be = 0.5; }else{ //Be = NR_BessJ1(qr)/qr; Be = 0.5*sas_J1c(qr); } double Si; if (qL==0){ Si = 1.0; }else{ Si = sin(qL)/qL; } const double k = 2.0 * Be * Si; const double vol = form_volume(r_minor, r_ratio, length); return (sld - solvent_sld) * (sld - solvent_sld) * k * k *vol*vol*1.0e-4; }