Esempio n. 1
0
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
}
Esempio n. 2
0
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
}