double form_volume(double a_side, double b_side, double c_side); double Iq(double q, double sld, double solvent_sld, double a_side, double b_side, double c_side); double Iqxy(double qx, double qy, double sld, double solvent_sld, double a_side, double b_side, double c_side, double theta, double phi, double psi); // From Igor library double _pkernel(double a, double b,double c, double ala, double alb, double alc); double _pkernel(double a, double b,double c, double ala, double alb, double alc){ double argA,argB,argC,tmp1,tmp2,tmp3; //handle arg=0 separately, as sin(t)/t -> 1 as t->0 argA = 0.5*a*ala; argB = 0.5*b*alb; argC = 0.5*c*alc; if(argA==0.0) { tmp1 = 1.0; } else { tmp1 = sin(argA)*sin(argA)/argA/argA; } if (argB==0.0) { tmp2 = 1.0; } else { tmp2 = sin(argB)*sin(argB)/argB/argB; } if (argC==0.0) { tmp3 = 1.0; } else { tmp3 = sin(argC)*sin(argC)/argC/argC; } return (tmp1*tmp2*tmp3); } double form_volume(double a_side, double b_side, double c_side) { return a_side * b_side * c_side; } double Iq(double q, double sld, double solvent_sld, double a_side, double b_side, double c_side) { double tmp1, tmp2; double mu = q * b_side; // Scale sides by B double a_scaled = a_side / b_side; double c_scaled = c_side / b_side; //Order of integration int nordi=76; int nordj=76; // outer integral (with nordi gauss points), integration limits = 0, 1 double summ = 0; //initialize integral for( int i=0; i1.0) { //printf("parallel_ana_2D: Unexpected error: cos(alpha)>1\n"); cos_val_c = 1.0; } if (fabs(cos_val_a)>1.0) { //printf("parallel_ana_2D: Unexpected error: cos(alpha)>1\n"); cos_val_a = 1.0; } if (fabs(cos_val_b)>1.0) { //printf("parallel_ana_2D: Unexpected error: cos(alpha)>1\n"); cos_val_b = 1.0; } // Call the IGOR library function to get the kernel double form = _pkernel( q*a_side, q*b_side, q*c_side, cos_val_a, cos_val_b, cos_val_c); // Multiply by contrast^2 const double vd = (sld - solvent_sld) * form_volume(a_side, b_side, c_side); return 1.0e-4 * vd * vd * form; }