// by jcho #include #include "libfunc.h" #include //used in Si func int factorial(int i) { int k, j; if (i<2){ return 1; } k=1; for(j=1;j= pi*6.2/4.0){ double out_sin = 0.0; double out_cos = 0.0; out = pi/2.0; for (i=0; i0) { // if (m_max < 1.0e-32){ // uu = sqrt(in_spin * out_spin/ norm) * uu ; // dd = sqrt((1.0 - in_spin) * (1.0 - out_spin)/ norm) * dd ; // } // } // else if (fabs(m_max)< 1.0e-32 && fabs(m_phi)< 1.0e-32 && fabs(m_theta)< 1.0e-32){ // uu = sqrt(in_spin * out_spin/ norm) * uu; // dd = sqrt((1.0 - in_spin) * (1.0 - out_spin)/ norm) * dd; // } else { // // //These are needed because of the precision of inputs // if (in_spin < 0.0) in_spin = 0.0; // if (in_spin > 1.0) in_spin = 1.0; // if (out_spin < 0.0) out_spin = 0.0; // if (out_spin > 1.0) out_spin = 1.0; // // if (q_x == 0.0) q_angle = pi / 2.0; // else q_angle = atan(q_y/q_x); // if (q_y < 0.0 && q_x < 0.0) q_angle -= pi; // else if (q_y > 0.0 && q_x < 0.0) q_angle += pi; // // q_angle = pi/2.0 - q_angle; // if (q_angle > pi) q_angle -= 2.0 * pi; // else if (q_angle < -pi) q_angle += 2.0 * pi; // // if (fabs(q_x) < 1.0e-16 && fabs(q_y) < 1.0e-16){ // m_perp = 0.0; // } // else { // m_perp = m_max; // } // if (is_angle > 0){ // m_phi *= pi/180.0; // m_theta *= pi/180.0; // mx = m_perp * cos(m_theta) * cos(m_phi); // my = m_perp * sin(m_theta); // mz = -(m_perp * cos(m_theta) * sin(m_phi)); // } // else{ // mx = m_perp; // my = m_phi; // mz = m_theta; // } // //ToDo: simplify these steps // // m_perp1 -m_perp2 // m_perp_x = (mx) * cos(q_angle); // m_perp_x -= (my) * sin(q_angle); // m_perp_y = m_perp_x; // m_perp_x *= cos(-q_angle); // m_perp_y *= sin(-q_angle); // m_perp_z = mz; // // m_sigma_x = (m_perp_x * cos(-s_theta) - m_perp_y * sin(-s_theta)); // m_sigma_y = (m_perp_x * sin(-s_theta) + m_perp_y * cos(-s_theta)); // m_sigma_z = (m_perp_z); // // //Find b // uu += m_sigma_x; // dd -= m_sigma_x; // re_ud = m_sigma_y; // re_du = m_sigma_y; // im_ud = m_sigma_z; // im_du = -m_sigma_z; // // uu = sqrt((in_spin) * (out_spin)/ norm) * uu; // dd = sqrt((1.0 - in_spin) * (1.0 - out_spin)/ norm) * dd; // // re_ud = sqrt(in_spin * (1.0 - out_spin)/ norm) * re_ud; // im_ud = sqrt(in_spin * (1.0 - out_spin)/ norm) * im_ud; // re_du = sqrt((1.0 - in_spin) * out_spin/ norm) * re_du; // im_du = sqrt((1.0 - in_spin) * out_spin/ norm) * im_du; // } // p_sld->uu = uu; // p_sld->dd = dd; // p_sld->re_ud = re_ud; // p_sld->im_ud = im_ud; // p_sld->re_du = re_du; // p_sld->im_du = im_du; // } /** Modifications below by kieranrcampbell@gmail.com Institut Laue-Langevin, July 2012 **/ /** Wojtek's comment Mar 22 2016: The remaing code can mostly likely be deleated Keeping it in order to check if it is not breaking anything **/ /* #define ITMAX 100 #define EPS 3.0e-7 #define FPMIN 1.0e-30 void gser(float *gamser, float a, float x, float *gln) { int n; float sum,del,ap; *gln = lgamma(a); if(x <= 0.0) { if (x < 0.0) printf("Error: x less than 0 in routine gser"); *gamser = 0.0; return; } else { ap = a; del = sum = 1.0/a; for(n=1;n<=ITMAX;n++) { ++ap; del *= x/ap; sum += del; if(fabs(del) < fabs(sum)*EPS) { *gamser = sum * exp(-x + a * log(x) - (*gln)); return; } } printf("a too large, ITMAX too small in routine gser"); return; } } */ /** Implements the incomplete gamma function Q(a,x) evaluated by its continued fraction representation **/ /* void gcf(float *gammcf, float a, float x, float *gln) { int i; float an,b,c,d,del,h; *gln = lgamma(a); b = x+1.0-a; c = 1.0/FPMIN; d = 1.0/b; h=d; for (i=1;i <= ITMAX; i++) { an = -i*(i-a); b += 2.0; d = an*d + b; if (fabs(d) < FPMIN) d = FPMIN; c = b+an/c; if (fabs(c) < FPMIN) c = FPMIN; d = 1.0/d; del = d*c; h += del; if (fabs(del-1.0) < EPS) break; } if (i > ITMAX) printf("a too large, ITMAX too small in gcf"); *gammcf = exp(-x+a*log(x)-(*gln))*h; return; } */ /** Represents incomplete error function, P(a,x) **/ /* float gammp(float a, float x) { float gamser,gammcf,gln; if(x < 0.0 || a <= 0.0) printf("Invalid arguments in routine gammp"); if (x < (a+1.0)) { gser(&gamser,a,x,&gln); return gamser; } else { gcf(&gammcf,a,x,&gln); return 1.0 - gammcf; } } */ /** Implementation of the error function, erf(x) **/ /* float erff(float x) { return x < 0.0 ? -gammp(0.5,x*x) : gammp(0.5,x*x); } */