int main(int argc, char *argv[]) { int fpos[NDIM]; int c, d, ri; int gamma; int status = 1; int mu; QDP_DiracFermion *f; QDP_DiracFermion *g; /* start QDP */ QDP_initialize(&argc, &argv); if (argc != 1 + 2 * NDIM + 4) { printf0("ERROR: usage: %s Lx ... x ... c d r/i gamma\n", argv[0]); goto end; } for (mu = 0; mu < NDIM; mu++) lattice[mu] = atoi(argv[1 + mu]); for (mu = 0; mu < NDIM; mu++) fpos[mu] = atoi(argv[1 + NDIM + mu]); c = atoi(argv[1 + 2 * NDIM]); d = atoi(argv[1 + 2 * NDIM + 1]); ri = atoi(argv[1 + 2 * NDIM + 2]); gamma = atoi(argv[1 + 2 * NDIM + 3]); /* set lattice size and create layout */ QDP_set_latsize(NDIM, lattice); QDP_create_layout(); f = QDP_create_D(); g = QDP_create_D(); point_fermion(f, fpos, c, d, ri); dump_fermion("check-gamma-f", f); QDP_D_eq_gamma_times_D(g, f, gamma, QDP_all); dump_fermion("check-gamma-g", g); QDP_destroy_D(g); QDP_destroy_D(f); status = 0; end: /* shutdown QDP */ QDP_finalize(); return status; }
void qopWilsonSolve(Layout *l, real *x, real *u[8], real mass, real *y, double rsq, char *sub) { QDP_ColorMatrix *qu[4]; QDP_DiracFermion *out, *in; in = QDP_create_D(); out = QDP_create_D(); unpackD(l, in, y); unpackD(l, out, x); for(int i=0; i<4; i++) { qu[i] = QDP_create_M(); unpackM(l, qu[i], u[2*i]); QLA_Real two = 2; QDP_M_eq_r_times_M(qu[i], &two, qu[i], QDP_all); } QOP_FermionLinksWilson *fla; fla = QOP_wilson_create_L_from_qdp(qu, NULL); QOP_evenodd_t eo=QOP_EVENODD; if(sub[0]=='e') { eo = QOP_EVEN; } if(sub[0]=='o') { eo = QOP_ODD; } QOP_info_t info = QOP_INFO_ZERO; QOP_invert_arg_t inv_arg = QOP_INVERT_ARG_DEFAULT; QOP_resid_arg_t res_arg = QOP_RESID_ARG_DEFAULT; res_arg.rsqmin = rsq; inv_arg.max_iter = 1000; inv_arg.restart = 500; inv_arg.max_restarts = 5; inv_arg.evenodd = eo; inv_arg.mixed_rsq = 0; QDP_D_eq_zero(out, QDP_even); //QOP_verbose(3); QOP_wilson_invert_qdp(&info, fla, &inv_arg, &res_arg, mass, out, in); //QLA_Real n2; //QDP_r_eq_norm2_D(&n2, (QDP_DiracFermion*)out, QDP_all); printf0("QOP its: %i\n", res_arg.final_iter); packD(l, x, out); QDP_destroy_D(in); QDP_destroy_D(out); for(int i=0; i<4; i++) { QDP_destroy_M(qu[i]); } }
void qopSrecon(Layout *l, real *x, real *y, int dir, int sign) { QDP_HalfFermion *in = QDP_create_H(); QDP_DiracFermion *out = QDP_create_D(); unpackH(l, in, y); QDP_D_eq_sprecon_H(out, in, dir, sign, QDP_all); packD(l, x, out); QDP_destroy_H(in); QDP_destroy_D(out); }
void qopWilsonDslash(Layout *l, real *x, real *u[8], real mass, int sign, real *y, char *sub) { QDP_ColorMatrix *qu[4]; QDP_DiracFermion *out, *in; in = QDP_create_D(); out = QDP_create_D(); unpackD(l, in, y); unpackD(l, out, x); for(int i=0; i<4; i++) { qu[i] = QDP_create_M(); unpackM(l, qu[i], u[2*i]); QLA_Real two = 2; QDP_M_eq_r_times_M(qu[i], &two, qu[i], QDP_all); } QOP_FermionLinksWilson *fla; fla = QOP_wilson_create_L_from_qdp(qu, NULL); QOP_evenodd_t eoOut=QOP_EVENODD, eoIn=QOP_EVENODD; if(sub[0]=='e') { eoOut = QOP_EVEN; eoIn = QOP_ODD; } if(sub[0]=='o') { eoOut = QOP_ODD; eoIn = QOP_EVEN; } real kappa = 0.5/(4+mass); QOP_wilson_dslash_qdp(NULL, fla, kappa, sign, out, in, eoOut, eoIn); QLA_Real n2; QDP_r_eq_norm2_D(&n2, out, QDP_all); printf0("out2: %g\n", n2); packD(l, x, out); QDP_destroy_D(in); QDP_destroy_D(out); for(int i=0; i<4; i++) { QDP_destroy_M(qu[i]); } }
void qopWilsonSolveMulti(Layout *l, real *x[], real *u[8], double masses[], real *y, int nmasses, double rsq, char *sub) { QDP_ColorMatrix *qu[4]; QDP_DiracFermion *out[nmasses], *in, **outp; outp = out; in = QDP_create_D(); unpackD(l, in, y); for(int i=0; i<nmasses; i++) { out[i] = QDP_create_D(); unpackD(l, out[i], x[i]); QDP_D_eq_zero(out[i], QDP_even); } for(int i=0; i<4; i++) { qu[i] = QDP_create_M(); unpackM(l, qu[i], u[2*i]); QLA_Real two = 2; QDP_M_eq_r_times_M(qu[i], &two, qu[i], QDP_all); } QOP_FermionLinksWilson *fla; fla = QOP_wilson_create_L_from_qdp(qu, NULL); #if 0 QOP_evenodd_t eo = QOP_EVENODD; if(sub[0]=='e') { eo = QOP_EVEN; } if(sub[0]=='o') { eo = QOP_ODD; } #endif QOP_evenodd_t eo = QOP_EVEN; QOP_info_t info = QOP_INFO_ZERO; QOP_invert_arg_t inv_arg = QOP_INVERT_ARG_DEFAULT; inv_arg.max_iter = 1000; inv_arg.restart = 500; inv_arg.max_restarts = 5; inv_arg.evenodd = eo; inv_arg.mixed_rsq = 0; QOP_resid_arg_t res_arg = QOP_RESID_ARG_DEFAULT; res_arg.rsqmin = rsq; QOP_resid_arg_t *ra[nmasses]; QOP_resid_arg_t **rap = ra; real mf[nmasses], *mfp; mfp = mf; for(int i=0; i<nmasses; i++) { ra[i] = &res_arg; mf[i] = masses[i]; } //QOP_verbose(3); QOP_wilson_invert_multi_qdp(&info, fla, &inv_arg, &rap, &mfp, &nmasses, &outp, &in, 1); //QLA_Real n2; //QDP_r_eq_norm2_D(&n2, (QDP_DiracFermion*)out, QDP_all); printf0("QOP its: %i\n", res_arg.final_iter); QDP_destroy_D(in); for(int i=0; i<nmasses; i++) { packD(l, x[i], out[i]); QDP_destroy_D(out[i]); } for(int i=0; i<4; i++) { QDP_destroy_M(qu[i]); } }
static void setup_cg(void) { static int is_setup=0; if(!is_setup) { int i; is_setup = 1; psi = QDP_create_D(); chi = QDP_create_D(); cgp = QDP_create_D(); cgr = QDP_create_D(); mp = QDP_create_D(); ttt = QDP_create_D(); tt1 = QDP_create_D(); tt2 = QDP_create_D(); t1 = QDP_create_D(); t2 = QDP_create_D(); t3 = QDP_create_D(); //dtemp0 = QDP_create_H(); for(i=0; i<4; i++) { #ifndef PRESHIFT_LINKS gaugelink[i] = QDP_create_M(); #endif } for(i=0; i<8; i++) { #ifdef PRESHIFT_LINKS gaugelink[i] = QDP_create_M(); #endif //dtemp1[i] = QDP_create_H(); //temp1[i] = QDP_create_H(); //temp2[i] = QDP_create_H(); temp1[i] = QDP_create_D(); temp2[i] = QDP_create_D(); temp3[i] = QDP_create_D(); temp4[i] = QDP_create_D(); } } }
void start(void) { double mf, best_mf; QLA_Real plaq; QDP_ColorMatrix **u; QDP_DiracFermion *out, *in; int i, st, ns, nm, bs, sti, nsi, nmi, bsi, best_st, best_ns, best_nm, best_bs; u = (QDP_ColorMatrix **) malloc(ndim*sizeof(QDP_ColorMatrix *)); for(i=0; i<ndim; i++) u[i] = QDP_create_M(); get_random_links(u, ndim, 0.2); plaq = get_plaq(u); if(QDP_this_node==0) printf("plaquette = %g\n", plaq); out = QDP_create_D(); in = QDP_create_D(); QDP_D_eq_gaussian_S(in, rs, QDP_all); QOP_layout_t qoplayout = QOP_LAYOUT_ZERO; qoplayout.latdim = ndim; qoplayout.latsize = (int *) malloc(ndim*sizeof(int)); for(i=0; i<ndim; i++) { qoplayout.latsize[i] = lattice_size[i]; } qoplayout.machdim = -1; QOP_info_t info = QOP_INFO_ZERO; QOP_invert_arg_t inv_arg = QOP_INVERT_ARG_DEFAULT; QOP_resid_arg_t res_arg = QOP_RESID_ARG_DEFAULT; res_arg.rsqmin = rsqmin; inv_arg.max_iter = 600; inv_arg.restart = 200; inv_arg.evenodd = QOP_EVEN; if(QDP_this_node==0) { printf("begin init\n"); fflush(stdout); } QOP_init(&qoplayout); if(QDP_this_node==0) { printf("begin load links\n"); fflush(stdout); } //flw = QOP_wilson_create_L_from_qdp(u, NULL); if(QDP_this_node==0) { printf("begin invert\n"); fflush(stdout); } if(cgtype>=0) { QOP_opt_t optcg; optcg.tag = "cg"; optcg.value = cgtype; QOP_wilson_invert_set_opts(&optcg, 1); } best_mf = 0; best_st = sta[0]; best_ns = nsa[0]; best_nm = nma[0]; best_bs = bsa[0]; QOP_opt_t optst; optst.tag = "st"; QOP_opt_t optns; optns.tag = "ns"; QOP_opt_t optnm; optnm.tag = "nm"; for(sti=0; sti<stn; sti++) { if((style>=0)&&(sti!=style)) continue; st = sta[sti]; optst.value = st; if(QOP_wilson_invert_set_opts(&optst, 1)==QOP_FAIL) continue; for(nsi=0; nsi<nsn; nsi++) { ns = nsa[nsi]; optns.value = ns; if(QOP_wilson_invert_set_opts(&optns, 1)==QOP_FAIL) continue; for(nmi=0; nmi<nmn; nmi++) { nm = nma[nmi]; if(nm==0) nm = ns; optnm.value = nm; if(QOP_wilson_invert_set_opts(&optnm, 1)==QOP_FAIL) continue; for(bsi=0; bsi<bsn; bsi++) { bs = bsa[bsi]; QDP_set_block_size(bs); flw = QOP_wilson_create_L_from_qdp(u, NULL); mf = bench_inv(&info, &inv_arg, &res_arg, out, in); QOP_wilson_destroy_L(flw); printf0("CONGRAD: st%2i ns%2i nm%2i bs%5i iter%5i sec%7.4f mflops = %g\n", st, ns, nm, bs, res_arg.final_iter, info.final_sec, mf); if(mf>best_mf) { best_mf = mf; best_st = st; best_ns = ns; best_nm = nm; best_bs = bs; } } } } } flw = QOP_wilson_create_L_from_qdp(u, NULL); optst.value = best_st; optns.value = best_ns; optnm.value = best_nm; QOP_wilson_invert_set_opts(&optst, 1); QOP_wilson_invert_set_opts(&optns, 1); QOP_wilson_invert_set_opts(&optnm, 1); QDP_set_block_size(best_bs); QDP_profcontrol(1); mf = bench_inv(&info, &inv_arg, &res_arg, out, in); QDP_profcontrol(0); printf0("prof: CONGRAD: st%2i ns%2i nm%2i bs%5i iter%5i sec%7.4f mflops = %g\n", best_st, best_ns, best_nm, best_bs, res_arg.final_iter, info.final_sec, mf); printf0("best: CONGRAD: st%2i ns%2i nm%2i bs%5i mflops = %g\n", best_st, best_ns, best_nm, best_bs, best_mf); if(QDP_this_node==0) { printf("begin unload links\n"); fflush(stdout); } //QOP_wilson_invert_unload_links(); if(QDP_this_node==0) { printf("begin finalize\n"); fflush(stdout); } QOP_finalize(); }