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]); } }