def mk_eig(gf, job_tag, inv_type): timer = q.Timer(f"py:mk_eig({job_tag},{inv_type})", True) timer.start() gpt_gf = g.convert(qg.gpt_from_qlat(gf), g.single) parity = g.odd params = get_lanc_params(job_tag, inv_type) q.displayln_info(f"mk_eig: job_tag={job_tag} inv_type={inv_type}") q.displayln_info(f"mk_eig: params={params}") fermion_params = params["fermion_params"] if "omega" in fermion_params: qm = g.qcd.fermion.zmobius(gpt_gf, fermion_params) else: qm = g.qcd.fermion.mobius(gpt_gf, fermion_params) w = g.qcd.fermion.preconditioner.eo2_ne(parity=parity)(qm) def make_src(rng): src = g.vspincolor(w.F_grid_eo) # src[:] = g.vspincolor([[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]) rng.cnormal(src) src.checkerboard(parity) return src pit = g.algorithms.eigen.power_iteration(**params["pit_params"]) pit_ev, _, _ = pit(w.Mpc, make_src(g.random("lanc"))) q.displayln_info(f"mk_eig: pit_ev={pit_ev}") # cheby = g.algorithms.polynomial.chebyshev(params["cheby_params"]) irl = g.algorithms.eigen.irl(params["irl_params"]) evec, ev = irl(cheby(w.Mpc), make_src(g.random("lanc"))) evals = g.algorithms.eigen.evals(w.Mpc, evec, check_eps2=1e-6, real=True) g.mem_report() # timer.stop() return evec, evals
def mk_qlat_inverter(gf, job_tag, inv_type, inv_acc, *, gt=None): timer = q.Timer(f"py:qinv({job_tag},{inv_type},{inv_acc})", True) if job_tag in ["24D", "32D"]: if inv_type == 0: fa = q.FermionAction(mass=0.00107, m5=1.8, ls=24, mobius_scale=4.0) inv = q.InverterDomainWall(gf=gf, fa=fa, timer=timer) inv.set_stop_rsd(1e-8) inv.set_max_num_iter(200) if inv_acc == 0: maxiter = 1 elif inv_acc == 1: maxiter = 2 elif inv_acc == 2: maxiter = 50 else: raise Exception("mk_qlat_inverter") inv.set_max_mixed_precision_cycle(maxiter) elif inv_type == 1: fa = q.FermionAction(mass=0.0850, m5=1.8, ls=24, mobius_scale=4.0) inv = q.InverterDomainWall(gf=gf, fa=fa, timer=timer) inv.set_stop_rsd(1e-8) inv.set_max_num_iter(300) if inv_acc == 0: maxiter = 1 elif inv_acc == 1: maxiter = 2 elif inv_acc == 2: maxiter = 50 else: raise Exception("mk_qlat_inverter") inv.set_max_mixed_precision_cycle(maxiter) else: raise Exception("mk_qlat_inverter") else: raise Exception("mk_qlat_inverter") if gt is None: return inv else: return q.InverterGaugeTransform(inverter=inv, gt=gt)
total_site = [4, 4, 4, 8] geo = q.Geometry(total_site, 1) q.displayln_info("geo.show() =", geo.show()) rs = q.RngState("seed") gf = q.GaugeField(geo) gf.set_unit() gf.show_info() mass = 0.05 m5 = 1.0 qinv = q.InverterDwfFreeField(mass=mass, m5=m5, timer=q.Timer("py:InverterDwfFreeField")) mobius_params = { "mass": mass, "M5": m5, "b": 1.0, "c": 0.0, "Ls": 32, "boundary_phases": [1.0, 1.0, 1.0, 1.0], } gpt_gf = qg.gpt_from_qlat(gf) qm = g.qcd.fermion.mobius(gpt_gf, mobius_params) pc = g.qcd.fermion.preconditioner inv = g.algorithms.inverter cg = inv.cg({"eps": 1e-11, "maxiter": 10000})
eps=1e-8, maxiter=1)).grouped(4) slv_qm_split = qm.propagator( inv.defect_correcting(inv.mixed_precision(slv_5d_split, g.single, g.double), eps=1e-8, maxiter=100)).grouped(4) slv_qm_madwf = qm.propagator( inv.defect_correcting(inv.mixed_precision( pc.mixed_dwf(slv_5d_f, slv_5d_pv_f, qz_f), g.single, g.double), eps=1e-8, maxiter=100)).grouped(4) inv_qm = qg.InverterGPT(inverter=slv_qm, timer=q.Timer("py:slv_qm", True)) inv_qz_f = qg.InverterGPT(inverter=slv_qz_f, timer=q.Timer("py:slv_qz_f", True)) inv_qm_mp = qg.InverterGPT(inverter=slv_qm_mp, timer=q.Timer("py:slv_qm_mp", True)) inv_qm_split = qg.InverterGPT(inverter=slv_qm_split, timer=q.Timer("py:slv_qm_split", True)) inv_qm_split_sloppy = qg.InverterGPT(inverter=slv_qm_split_sloppy, timer=q.Timer("py:slv_qm_split_sloppy", True)) inv_qm_madwf = qg.InverterGPT(inverter=slv_qm_madwf, timer=q.Timer("py:slv_qm_madwf", True)) def mk_src(geo): src = q.mk_point_src(geo, [0, 0, 0, 0])
q.displayln_info( f"g.qcd.gauge.plaquette = {g.qcd.gauge.plaquette(gpt_gf):.17f}") gf1 = qg.qlat_from_gpt(gpt_gf) gf1.show_info() gpt_gf = qg.gpt_from_qlat(gf) qm = g.qcd.fermion.mobius(gpt_gf, mobius_params) pc = g.qcd.fermion.preconditioner inv = g.algorithms.inverter cg = inv.cg({"eps": 1e-8, "maxiter": 10000}) slv_5d = inv.preconditioned(pc.eo2_ne(), cg) slv_qm = qm.propagator(slv_5d).grouped(4) inv_qm = qg.InverterGPT(inverter=slv_qm, timer=q.Timer("py:slv_qm", True)) def mk_src(geo): src = q.mk_point_src(geo, [0, 0, 0, 0]) grid = qg.mk_grid(geo) g_src = g.mspincolor(grid) g.create.point(g_src, [0, 0, 0, 0]) src1 = qg.qlat_from_gpt(g_src) src1 -= src assert src1.qnorm() == 0.0 return src def test_inv(geo, inverter): src = mk_src(geo)
"c": 0.0, "Ls": 8, "boundary_phases": [1.0, 1.0, 1.0, 1.0], } gpt_gf = qg.gpt_from_qlat(gf) qm = g.qcd.fermion.mobius(gpt_gf, mobius_params) pc = g.qcd.fermion.preconditioner inv = g.algorithms.inverter cg = inv.cg({"eps": 1e-8, "maxiter": 10000}) slv_5d = inv.preconditioned(pc.eo2_ne(), cg) slv_qm = qm.propagator(slv_5d) inv_qm = qg.InverterGPT(inverter=slv_qm, timer=timer) return inv_qm inv = mk_inverter_gpt(gf_gfix, q.Timer("py:slv_qm", True)) inv_gt = q.InverterGaugeTransform(inverter=mk_inverter_gpt( gf, q.Timer("py:slv_qm", True)), gt=gt, timer=q.Timer("py:inv_gfix", True)) src = q.Prop(geo) src.set_rand(rs.split("src_r")) sol = inv * src sol1 = inv_gt * src sol_diff = sol1.copy() sol_diff -= sol1
q.qmkdir_info("results") total_site = [4, 4, 4, 8] geo = q.Geometry(total_site, 1) q.displayln_info("geo.show() =", geo.show()) rs = q.RngState("seed") gf = q.GaugeField(geo) gf.set_unit() gf.show_info() fa = q.FermionAction(mass=0.05, ls=16, m5=1.0) qinv_free = q.InverterDwfFreeField(mass=fa.mass(), m5=fa.m5(), timer=q.Timer("py:InverterDwfFreeField")) qinv_dwf = q.InverterDomainWall(gf=gf, fa=fa, timer=q.Timer("py:InverterDomainWall")) src_p = q.mk_point_src(geo, [0, 0, 0, 0]) src_r = q.Prop(geo) src_r.set_rand(rs.split("src_r")) for src in [src_p, src_r]: sol = qinv_free * src sol1 = qinv_dwf * src
def mk_gpt_inverter(gf, job_tag, inv_type, inv_acc, *, gt=None, mpi_split=None, n_grouped=1, eig=None, eps=1e-8, timer=True): if mpi_split is None: mpi_split = g.default.get_ivec("--mpi_split", None, 4) if mpi_split is not None: n_grouped = g.default.get_int("--grouped", 4) gpt_gf = qg.gpt_from_qlat(gf) pc = g.qcd.fermion.preconditioner if inv_type in [0, 1]: param = get_fermion_param(job_tag, inv_type, inv_acc) if eig is not None: # may need madwf param0 = get_fermion_param(job_tag, inv_type, inv_acc=0) is_madwf = get_ls_from_fermion_params( param) != get_ls_from_fermion_params(param0) else: is_madwf = False if "omega" in param: qm = g.qcd.fermion.zmobius(gpt_gf, param) else: qm = g.qcd.fermion.mobius(gpt_gf, param) inv = g.algorithms.inverter if job_tag[:5] == "test-": cg_mp = inv.cg({"eps": eps, "maxiter": 100}) elif inv_type == 0: cg_mp = inv.cg({"eps": eps, "maxiter": 200}) elif inv_type == 1: cg_mp = inv.cg({"eps": eps, "maxiter": 300}) else: raise Exception("mk_gpt_inverter") if mpi_split is None: cg_split = cg_mp else: cg_split = inv.split(cg_mp, mpi_split=mpi_split) if eig is not None: cg_defl = inv.coarse_deflate(eig[1], eig[0], eig[2]) cg = inv.sequence(cg_defl, cg_split) else: cg = cg_split if inv_type == 0: slv_5d = inv.preconditioned(pc.eo2_ne(), cg) elif inv_type == 1: slv_5d = inv.preconditioned(pc.eo2_ne(), cg) else: raise Exception("mk_gpt_inverter") if is_madwf: gpt_gf_f = g.convert(gpt_gf, g.single) if "omega" in param0: qm0 = g.qcd.fermion.zmobius(gpt_gf_f, param0) else: qm0 = g.qcd.fermion.mobius(gpt_gf_f, param0) cg_pv_f = inv.cg({"eps": eps, "maxiter": 90}) slv_5d_pv_f = inv.preconditioned(pc.eo2_ne(), cg_pv_f) slv_5d = pc.mixed_dwf(slv_5d, slv_5d_pv_f, qm0) if inv_acc == 0: maxiter = 1 elif inv_acc == 1: maxiter = 2 elif inv_acc == 2: maxiter = 200 else: raise Exception("mk_gpt_inverter") slv_qm = qm.propagator( inv.defect_correcting(inv.mixed_precision(slv_5d, g.single, g.double), eps=eps, maxiter=maxiter)).grouped(n_grouped) if timer is True: timer = q.Timer(f"py:inv({job_tag},{inv_type},{inv_acc})", True) elif timer is False: timer = q.TimerNone() inv_qm = qg.InverterGPT(inverter=slv_qm, timer=timer) else: raise Exception("mk_gpt_inverter") if gt is None: return inv_qm else: return q.InverterGaugeTransform(inverter=inv_qm, gt=gt)
def mk_ceig(gf, job_tag, inv_type): timer = q.Timer(f"py:mk_ceig({job_tag},{inv_type})", True) timer.start() gpt_gf = g.convert(qg.gpt_from_qlat(gf), g.single) parity = g.odd params = get_lanc_params(job_tag, inv_type) q.displayln_info(f"mk_ceig: job_tag={job_tag} inv_type={inv_type}") q.displayln_info(f"mk_ceig: params={params}") fermion_params = params["fermion_params"] if "omega" in fermion_params: qm = g.qcd.fermion.zmobius(gpt_gf, fermion_params) else: qm = g.qcd.fermion.mobius(gpt_gf, fermion_params) w = g.qcd.fermion.preconditioner.eo2_ne(parity=parity)(qm) def make_src(rng): src = g.vspincolor(w.F_grid_eo) # src[:] = g.vspincolor([[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]) rng.cnormal(src) src.checkerboard(parity) return src pit = g.algorithms.eigen.power_iteration(**params["pit_params"]) pit_ev, _, _ = pit(w.Mpc, make_src(g.random("lanc"))) q.displayln_info(f"mk_ceig: pit_ev={pit_ev}") # cheby = g.algorithms.polynomial.chebyshev(params["cheby_params"]) irl = g.algorithms.eigen.irl(params["irl_params"]) evec, ev = irl(cheby(w.Mpc), make_src(g.random("lanc"))) evals = g.algorithms.eigen.evals(w.Mpc, evec, check_eps2=1e-6, real=True) g.mem_report() # inv = g.algorithms.inverter # cparams = get_clanc_params(job_tag, inv_type) q.displayln_info(f"mk_ceig: cparams={cparams}") # grid_coarse = g.block.grid(w.F_grid_eo, [get_ls_from_fermion_params(fermion_params)] + cparams["block"]) nbasis = cparams["nbasis"] basis = evec[0:nbasis] b = g.block.map(grid_coarse, basis) for i in range(2): b.orthonormalize() del evec gc.collect() # ccheby = g.algorithms.polynomial.chebyshev(cparams["cheby_params"]) cop = b.coarse_operator(ccheby(w.Mpc)) # cstart = g.vcomplex(grid_coarse, nbasis) cstart[:] = g.vcomplex([1] * nbasis, nbasis) eps2 = g.norm2(cop * cstart - b.project * ccheby(w.Mpc) * b.promote * cstart) / g.norm2(cstart) g.message(f"Test coarse-grid promote/project cycle: {eps2}") cirl = g.algorithms.eigen.irl(cparams["irl_params"]) cevec, cev = cirl(cop, cstart) # smoother = inv.cg(cparams["smoother_params"])(w.Mpc) smoothed_evals = [] tmpf = g.lattice(basis[0]) for i, cv in enumerate(cevec): tmpf @= smoother * b.promote * cv smoothed_evals = smoothed_evals + g.algorithms.eigen.evals( w.Mpc, [tmpf], check_eps2=10, real=True) g.mem_report() # timer.stop() return basis, cevec, smoothed_evals