static void gauge_random(NCPROT QLA_ColorMatrix(*m), int i, void *args) { QLA_D_Complex d1, d2; QLA_ColorMatrix(m1); QLA_ColorMatrix(m2); QLA_ColorMatrix(m3); QLA_Complex c; QLA_RandomState *s = &((QLA_RandomState *)args)[i]; QLA_M_eq_gaussian_S(&m1, s); QLA_M_eq_Ma_times_M(&m2, &m1, &m1); QLA_M_eq_invsqrt_M(&m3, &m2); if(QLA_Nc>1) { QLA_M_eq_M_times_M(&m2, &m1, &m3); QLA_C_eq_det_M(&c, &m2); QLA_DF_c_eq_c(d1, c); d2 = QLA_D_clog(&d1); QLA_c_eq_r_times_c(d1, -1./QLA_Nc, d2); d2 = QLA_D_cexp(&d1); QLA_FD_c_eq_c(c, d2); QLA_M_eq_C_times_M(m, &c, &m2); } else { QLA_M_eq_M_times_M(m, &m1, &m3); } }
static void over_func(NCPROT1 QLA_ColorMatrix(*m), int site) { if(QLA_Nc==1) { QLA_Complex z, zs, t; QLA_C_eq_elem_M(&z, m, 0, 0); QLA_c_eq_ca(zs, z); QLA_C_eq_C_divide_C(&t, &zs, &z); QLA_M_eq_elem_C(m, &t, 0, 0); } else { QLA_ColorMatrix(s); QLA_ColorMatrix(t); QLA_ColorMatrix(tt); QLA_Complex one; QLA_c_eq_r(one, 1); QLA_M_eq_c(&s, &one); /* Loop over SU(2) subgroup index */ for(int i = 0; i < QLA_Nc; ++i) { for(int j = i+1; j < QLA_Nc; ++j) { QLA_Real a[4], r[4], rn; su2_extract(NCARG r, m, i, j); rn = sqrt( r[0]*r[0] + r[1]*r[1] + r[2]*r[2] + r[3]*r[3] ); if(rn<1e-10) { a[0] = 1; a[1] = a[2] = a[3] = 0; } else { rn = 1/rn; a[0] = rn*r[0]; a[1] = -rn*r[1]; a[2] = -rn*r[2]; a[3] = -rn*r[3]; } r[0] = a[0]*a[0] - a[1]*a[1] - a[2]*a[2] - a[3]*a[3]; a[0] *= 2; r[1] = a[0]*a[1]; r[2] = a[0]*a[2]; r[3] = a[0]*a[3]; su2_fill(NCARG &t, r, i, j); QLA_M_eq_M_times_M(&tt, &t, &s); QLA_M_eq_M(&s, &tt); QLA_M_eq_M_times_M(&tt, &t, m); QLA_M_eq_M(m, &tt); } } QLA_M_eq_M(m, &s); } }
static void hb_func(NCPROT1 QLA_ColorMatrix(*m), int site) { QLA_RandomState *srs = rs + site; if(QLA_Nc==1) { // exp(-fac*Re[u*z]) = exp(-fac*|z|*cos(t)) // call Wensley heatbath QLA_Complex cc; QLA_Real r, phi, g, theta; // *m contains r*exp(i*phi), extract r and phi // extract QLA matrix element as complex number QLA_c_eq_c(cc, QLA_elem_M(*m,0,0)); // get norm and arg QLA_R_eq_norm_C( &r, &cc ); QLA_R_eq_arg_C( &phi, &cc ); g = fac*r; // generate theta with probability P(theta)=exp( g*cos(theta) ) get_hb1( &theta, g, srs ); // convert to real and imag //QLA_Real vr = cos( theta - phi ); //QLA_Real vi = sin( theta - phi ); // assemble QLA complex number and set QLA U(1) matrix to this //QLA_c_eq_r_plus_i_r( QLA_elem_M(*m,0,0), vr, vi ); QLA_elem_M(*m,0,0) = QLAP(cexpi)(theta - phi); } else { QLA_ColorMatrix(s); QLA_ColorMatrix(t); QLA_ColorMatrix(tt); QLA_Complex one; QLA_c_eq_r(one, 1); QLA_M_eq_c(&s, &one); /* Loop over SU(2) subgroup index */ for(int i=0; i<QLA_Nc; i++) { for(int j=i+1; j<QLA_Nc; j++) { QLA_Real a[4], b[4], r[4], rn, rl; su2_extract(NCARG r, m, i, j); rn = sqrt( r[0]*r[0] + r[1]*r[1] + r[2]*r[2] + r[3]*r[3] ); rl = fac*rn; if(rn<1e-10) { a[0] = 1; a[1] = a[2] = a[3] = 0; } else { rn = 1/rn; a[0] = rn*r[0]; a[1] = -rn*r[1]; a[2] = -rn*r[2]; a[3] = -rn*r[3]; } get_hb2(b, rl, srs); //b[0] = 1; b[1] = b[2] = b[3] = 0; r[0] = b[0]*a[0] - b[1]*a[1] - b[2]*a[2] - b[3]*a[3]; r[1] = b[0]*a[1] + b[1]*a[0] - b[2]*a[3] + b[3]*a[2]; r[2] = b[0]*a[2] + b[2]*a[0] - b[3]*a[1] + b[1]*a[3]; r[3] = b[0]*a[3] + b[3]*a[0] - b[1]*a[2] + b[2]*a[1]; su2_fill(NCARG &t, r, i, j); QLA_M_eq_M_times_M(&tt, &t, &s); QLA_M_eq_M(&s, &tt); QLA_M_eq_M_times_M(&tt, &t, m); QLA_M_eq_M(m, &tt); } } QLA_M_eq_M(m, &s); } }