QDP_Subset * qhmcqdp_get_timeslices(lattice_t *lat) { if(lat->timeslices==NULL) { int dir = lat->nd - 1; int n = QDP_coord_size_L(lat->qlat, dir); lat->timeslices = QDP_create_subset_L(lat->qlat, slice_func, (void*)&dir, sizeof(dir), n); } return lat->timeslices; }
QDP_Subset * qhmcqdp_get_hyper(lattice_t *lat, int ha[], int *n) { int nd = lat->nd; int hn[nd]; *n = 1; for(int i=0; i<nd; i++) { int c = QDP_coord_size_L(lat->qlat, i); hn[i] = (c+ha[i]-1)/ha[i]; *n *= hn[i]; } int *args[3] = {&nd, ha, hn}; QDP_Subset *s = QDP_create_subset_L(lat->qlat, hyper_func, (void*)args, sizeof(args), *n); return s; }
static int qopqdp_lattice_call(lua_State *L) { BEGIN_ARGS; GET_LATTICE(l); OPT_INT(dim, 0); END_ARGS; if(dim>0) { int s = QDP_coord_size_L(l->qlat, dim-1); lua_pushinteger(L, s); } else { int nd = QDP_ndim_L(l->qlat); int x[nd]; QDP_latsize_L(l->qlat, x); qhmc_push_int_array(L, nd, x); } return 1; }
QDP_Subset * qhmc_qopqdp_qsubset_from_string(lua_State *L, lattice_t *lat, const char *s, int *n) { *n = 0; if(s==NULL) return NULL; QDP_Subset *subs = NULL; QDP_Lattice *qlat = lat->qlat; switch(s[0]) { case 'a': subs = QDP_all_and_empty_L(qlat); if(strcmp(s,"all")==0) *n = 1; else *n = 2; break; case 'e': *n = 1; if(strncmp(s,"evenodd",7)==0 || strncmp(s,"evenandodd",10)==0) *n = 2; subs = QDP_even_and_odd_L(qlat); { int t=0; int nn = sscanf(s,"%*[^0-9]%i",&t); if(nn && t>=1 && t<=lat->nd) { subs = qhmcqdp_get_eodir(lat, t-1); } } break; case 'o': *n = 1; subs = 1 + QDP_even_and_odd_L(qlat); { int t=0; int nn = sscanf(s,"%*[^0-9]%i",&t); if(nn && t>=1 && t<=lat->nd) { subs = 1 + qhmcqdp_get_eodir(lat, t-1); } } break; case 's': if(strncmp(s,"staggered",9)==0) { int ns = 1 << QDP_ndim_L(qlat); if(strcmp(s+9,"")==0) { subs = qhmcqdp_get_staggered(lat); *n = ns; } else { int t=0; int nn = sscanf(s+9,"%i",&t); if(nn && t>=0 && t<ns) { subs = &qhmcqdp_get_staggered(lat)[t]; *n = 1; } } } break; case 't': if(strncmp(s,"timeslice",9)==0) { int nt = QDP_coord_size_L(qlat,QDP_ndim_L(qlat)-1); if(strcmp(s+9,"s")==0) { subs = qhmcqdp_get_timeslices(lat); *n = nt; } else { int t=0; int nn = sscanf(s+9,"%i",&t); if(nn && t>=0 && t<nt) { subs = &qhmcqdp_get_timeslices(lat)[t]; *n = 1; } } } break; } return subs; }