static int qopqdp_force_random(lua_State *L) { #define NC QDP_get_nc(g->links[0]) BEGIN_ARGS; GET_GAUGE(g); END_ARGS; QDP_RandomState *rs = g->lat->rs; qassert(rs!=NULL); if(QLA_Nc==3) { // use MILC conventions QLA_RandomState *s = QDP_expose_S(rs); for(int i=0; i<g->nd; i++) { QDP_M_eq_funcia(g->links[i], randforce, s, QDP_all_L(g->qlat)); } QDP_reset_S(rs); } else { QDP_ColorMatrix *m = QDP_create_M_L(g->qlat); for(int i=0; i<g->nd; i++) { QDP_M_eq_gaussian_S(m, rs, QDP_all_L(g->qlat)); QDP_M_eq_antiherm_M(g->links[i], m, QDP_all_L(g->qlat)); } QDP_destroy_M(m); } return 0; #undef NC }
static int qopqdp_gauge_random(lua_State *L) { BEGIN_ARGS; GET_GAUGE(g); END_ARGS; QLA_RandomState *qrs = QDP_expose_S(g->lat->rs); for(int i=0; i<g->nd; i++) { QDP_M_eq_funcia(g->links[i], gauge_random, qrs, QDP_all_L(g->qlat)); } QDP_reset_S(g->lat->rs); return 0; }
void QOP_symanzik_1loop_gauge_heatbath_qdp(QOP_info_t *info, QDP_ColorMatrix *links[], QLA_Real beta, QOP_gauge_coeffs_t *coeffs, QDP_RandomState *rs0, int nup, int nhb, int nover) { #define NC QDP_get_nc(links[0]) double dtime = QOP_time(); double nflops = 0; if(coeffs->adjoint_plaquette) { QOP_error("%s: adj plaq not supported\n", __func__); } fac = beta/QLA_Nc; int imp = (coeffs->rectangle!=0)||(coeffs->parallelogram!=0); QDP_Lattice *lat = QDP_get_lattice_M(links[0]); int nd = QDP_ndim_L(lat); QDP_Subset *cbs=QDP_even_and_odd_L(lat); int ncb = 2; if(imp) { ncb = 32; cbs = QOP_get_sub32(lat); } QDP_ColorMatrix *staple = QDP_create_M_L(lat); QDP_ColorMatrix *v = QDP_create_M_L(lat); QDP_ColorMatrix *tmp = QDP_create_M_L(lat); rs = QDP_expose_S(rs0); for(int up=0; up<nup; up++) { for(int hb=0; hb<nhb; hb++) { for(int cb=0; cb<ncb; cb++) { QDP_Subset subset = cbs[cb]; for(int mu=0; mu<nd; mu++) { QDP_M_eq_zero(staple, subset); QOP_symanzik_1loop_gauge_staple_qdp(info, links, staple, mu, coeffs, cbs, cb); QDP_M_eq_M_times_Ma(v, links[mu], staple, subset); QDP_M_eq_funcit(v, hb_func, subset); QDP_M_eq_M_times_M(tmp, v, links[mu], subset); QDP_M_eq_M(links[mu], tmp, subset); } } } for(int over=0; over<nover; over++) { for(int cb=0; cb<ncb; cb++) { QDP_Subset subset = cbs[cb]; for(int mu=0; mu<nd; mu++) { QDP_M_eq_zero(staple, subset); QOP_symanzik_1loop_gauge_staple_qdp(info, links, staple, mu, coeffs, cbs, cb); QDP_M_eq_M_times_Ma(v, links[mu], staple, subset); QDP_M_eq_funcit(v, over_func, subset); QDP_M_eq_M_times_M(tmp, v, links[mu], subset); QDP_M_eq_M(links[mu], tmp, subset); } } } } QDP_reset_S(rs0); QDP_destroy_M(tmp); QDP_destroy_M(v); QDP_destroy_M(staple); info->final_sec = QOP_time() - dtime; info->final_flop = nflops*QDP_sites_on_node; info->status = QOP_SUCCESS; #undef NC }