def run(job_tag, traj): q.qmkdir_info(f"locks") q.qmkdir_info(get_save_path(f"")) q.qmkdir_info(get_save_path(f"eig")) q.qmkdir_info(get_save_path(f"eig/{job_tag}")) q.qmkdir_info(get_save_path(f"configs")) q.qmkdir_info(get_save_path(f"configs/{job_tag}")) # total_site = ru.get_total_site(job_tag) geo = q.Geometry(total_site, 1) q.displayln_info("geo.show() =", geo.show()) # path_gf = get_load_path(f"configs/{job_tag}/ckpoint_lat.{traj}") if path_gf is None: gf = mk_sample_gauge_field(job_tag, traj) gf.show_info() gf.save(get_save_path(f"configs/{job_tag}/ckpoint_lat.{traj}")) else: gf = q.GaugeField() gf.load(path_gf) # if q.obtain_lock(f"locks/{job_tag}-{traj}-compute-eig"): get_eig = compute_eig(gf, job_tag, inv_type=0, path=f"eig/{job_tag}/traj={traj}") test_eig(gf, get_eig(), job_tag, inv_type=0) q.release_lock()
def test_hmc(total_site, ga): # q.qmkdir_info("results") q.qmkdir_info("results/gf_info") q.qmkdir_info("results/wilson_flow_energy_info") q.qmkdir_info("results/gm_force_info") # geo = q.Geometry(total_site, 1) rs = q.RngState("test_hmc-{}x{}x{}x{}".format(total_site[0], total_site[1], total_site[2], total_site[3])) gf = q.GaugeField(geo) q.set_unit(gf) traj = 0 for i in range(4): traj += 1 run_hmc(gf, ga, traj, rs.split("hmc-{}".format(traj))) plaq_avg = q.gf_avg_plaq(gf) plaq_sum = np.prod(total_site) * 6.0 * (1.0 - plaq_avg) q.displayln_info("test_hmc: traj={} ; plaq_avg={}".format( traj, plaq_avg)) if traj % 2 == 0: q.display_gauge_field_info_table_with_wilson_flow( "results/gf_info/traj={}.lat".format(traj), "results/wilson_flow_energy_info/traj={}.lat".format(traj), gf, 0.1, 5, 2) q.save_gm_force_magnitudes_list( "results/gm_force_info/traj={}.lat".format(traj))
def test_gf(gf): q.displayln_info(f"test_gf") # plaq = gf.plaq() # gpt_gf = qg.gpt_from_qlat(gf) g_plaq = g.qcd.gauge.plaquette(gpt_gf) # q.displayln_info( f"gf.plaq()={plaq} ; g.qcd.gauge.plaquette(gpt_gf) = {g_plaq:.17f}") assert abs(plaq - g_plaq) < 1.0e-10
def test_src(xg): q.displayln_info(f"test_src: xg={xg}") # src_q = q.mk_point_src(geo, xg) # grid = qg.mk_grid(geo) g_src_gpt = g.mspincolor(grid) g.create.point(g_src_gpt, xg) src_g = qg.qlat_from_gpt(g_src_gpt) # src_diff = src_q.copy() src_diff -= src_g # q.displayln_info(src_q.qnorm(), src_g.qnorm(), src_diff.qnorm()) assert src_diff.qnorm() == 0
def gm_evolve_fg(gm, gf_init, ga, fg_dt, dt): geo = gf_init.geo() gf = q.GaugeField(geo) gf @= gf_init # gm_force = q.GaugeMomentum(geo) # q.set_gm_force(gm_force, gf, ga) # q.gf_evolve(gf, gm_force, fg_dt) # q.set_gm_force(gm_force, gf, ga) # q.display_gm_force_magnitudes(gm_force, 5) q.displayln_info(q.get_gm_force_magnitudes(gm_force, 5)) # gm_force *= dt gm += gm_force
def metropolis_accept(delta_h, traj, rs): flag_d = 0.0 accept_prob = 0.0 if q.get_id_node() == 0: if delta_h <= 0.0: accept_prob = 1.0 flag_d = 1.0 else: accept_prob = m.exp(-delta_h) rand_num = rs.u_rand_gen(1.0, 0.0) if rand_num <= accept_prob: flag_d = 1.0 flag_d = q.glb_sum(flag_d) accept_prob = q.glb_sum(accept_prob) flag = flag_d > 0.5 q.displayln_info( "metropolis_accept: flag={:d} with accept_prob={:.1f}% delta_h={:.16f} traj={:d}" .format(flag, accept_prob * 100.0, delta_h, traj)) return flag, accept_prob
def run_hmc(gf, ga, traj, rs): # is_reverse_test = traj < 3 # geo = gf.geo() gf0 = q.GaugeField(geo) gf0 @= gf # gm = q.GaugeMomentum(geo) q.set_rand_gauge_momentum(gm, 1.0, rs.split("set_rand_gauge_momentum")) # steps = 6 md_time = 1.0 # delta_h = run_hmc_evolve(gm, gf0, ga, rs, steps, md_time) # if is_reverse_test: gm_r = q.GaugeMomentum(geo) gm_r @= gm gf0_r = q.GaugeField(geo) gf0_r @= gf0 delta_h_rev = run_hmc_evolve(gm_r, gf0_r, ga, rs, steps, -md_time) gf0_r -= gf q.displayln_info("run_hmc_evolve reversed delta_diff: {} / {}".format( delta_h + delta_h_rev, delta_h)) q.displayln_info("run_hmc_evolve reversed gf_diff: {} / {}".format( q.qnorm(gf0_r), q.qnorm(gf0))) # flag, accept_prob = metropolis_accept(delta_h, traj, rs.split("metropolis_accept")) # if flag or traj <= 20: q.displayln_info("run_hmc: update gf (traj={:d})".format(traj)) gf @= gf0
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 test_inv(geo, inverter): src = mk_src(geo) q.displayln_info(f"src info {src.qnorm()} {src.crc32()}") sol = inverter * src q.displayln_info(f"sol info {sol.qnorm()} {sol.crc32()}") sol1 = inverter * sol q.displayln_info(f"sol1 info {sol1.qnorm()} {sol1.crc32()}") return src, sol, sol1
def mk_qlat_gpt_copy_plan(ctype, total_site, multiplicity, tag): geo = q.Geometry(total_site, multiplicity) f_gpt = mk_gpt_field(ctype, geo) f_qlat = q.Field(ctype, geo) lexicographic_coordinates = g.coordinates(f_gpt) buf = f_qlat.mview() if tag == "qlat_from_gpt": qlat_from_gpt = g.copy_plan(buf, f_gpt) qlat_from_gpt.destination += g.global_memory_view( f_gpt.grid, [[f_gpt.grid.processor, buf, 0, buf.nbytes]]) qlat_from_gpt.source += f_gpt.view[lexicographic_coordinates] qlat_from_gpt = qlat_from_gpt(local_only=True) return qlat_from_gpt elif tag == "gpt_from_qlat": gpt_from_qlat = g.copy_plan(f_gpt, buf) gpt_from_qlat.source += g.global_memory_view( f_gpt.grid, [[f_gpt.grid.processor, buf, 0, buf.nbytes]]) gpt_from_qlat.destination += f_gpt.view[lexicographic_coordinates] gpt_from_qlat = gpt_from_qlat(local_only=True) return gpt_from_qlat else: q.displayln_info(tag) raise Exception("mk_qlat_gpt_copy_plan")
def test_eig(gf, eig, job_tag, inv_type): geo = gf.geo() src = q.FermionField4d(geo) q.displayln_info(f"src norm {src.qnorm()}") src.set_rand(q.RngState("test_eig:{id(inv)}")) sol_ref = ru.get_inv( gf, job_tag, inv_type, inv_acc=2, eig=eig, eps=1e-10, timer=False) * src q.displayln_info(f"sol_ref norm {sol_ref.qnorm()} with eig") for inv_acc in [0, 1, 2]: sol = ru.get_inv(gf, job_tag, inv_type, inv_acc, eig=eig, timer=False) * src sol -= sol_ref q.displayln_info( f"sol diff norm {sol.qnorm()} inv_acc={inv_acc} with eig") sol = ru.get_inv(gf, job_tag, inv_type, inv_acc, timer=False) * src sol -= sol_ref q.displayln_info( f"sol diff norm {sol.qnorm()} inv_acc={inv_acc} without eig")
#!/usr/bin/env python3 import sys import qlat as q size_node_list = [[1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 1, 4], [1, 1, 1, 8], [2, 2, 2, 2], [2, 2, 2, 4]] q.begin(sys.argv, size_node_list) q.qremove_all_info("results") 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) q.displayln_info(gf.geo().show_all()) q.set_unit(gf) q.gf_show_info(gf) gf.set_rand(rs.split("gf-init"), 0.3, 1) gf.show_info() plaq = gf.plaq()
g.create.point(g_src_gpt, xg) src_g = qg.qlat_from_gpt(g_src_gpt) # src_diff = src_q.copy() src_diff -= src_g # q.displayln_info(src_q.qnorm(), src_g.qnorm(), src_diff.qnorm()) assert src_diff.qnorm() == 0 qg.begin_with_gpt() rs = q.RngState("seed") total_site = [4, 4, 4, 8] geo = q.Geometry(total_site, 1) q.displayln_info("geo.show() =", geo.show()) gf = q.GaugeField(geo) gf.set_rand(rs, 0.2, 2) gf.show_info() test_gf(gf) for i in range(16): xg = [ rs.rand_gen() % total_site[0], rs.rand_gen() % total_site[1], rs.rand_gen() % total_site[2], rs.rand_gen() % total_site[3] ] test_src(xg)
#!/usr/bin/env python3 import qlat_gpt as qg import qlat as q import gpt as g qg.begin_with_gpt() q.qremove_all_info("results") 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() 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,
#!/usr/bin/env python3 import qlat as q import sys, os q.begin() q.qremove_all_info("results") q.qmkdir_info("results") rs = q.RngState("seed") total_site = [4, 4, 4, 8] geo = q.Geometry(total_site, 1) q.displayln_info("geo.show() =", geo.show()) psel = q.PointSelection([[0,0,0,0], [0,1,2,0]]) psel.save("results/psel.txt") psel = q.PointSelection() psel.load("results/psel.txt") q.displayln_info("psel.list() =", psel.list()) n_per_tslice = 16 fsel = q.FieldSelection(geo.total_site(), n_per_tslice, rs) q.displayln_info("fsel info =", fsel.geo().show(), fsel.n_per_tslice(), fsel.prob()) fsel.save("results/fsel.field")
#!/usr/bin/env python3 import qlat_gpt as qg import qlat as q import gpt as g qg.begin_with_gpt() q.qremove_all_info("results") 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") grid = qg.mk_grid(geo) rng = g.random("test") gpt_gf = g.qcd.gauge.random(grid, rng, scale=0.5) q.displayln_info( f"g.qcd.gauge.plaquette = {g.qcd.gauge.plaquette(gpt_gf):.17f}") gpt_gf_f = g.convert(gpt_gf, g.single) q.displayln_info( f"g.qcd.gauge.plaquette = {g.qcd.gauge.plaquette(gpt_gf_f):.17f} single precision" ) gf = qg.qlat_from_gpt(gpt_gf)
import qlat as q import qlat_gpt as qg import rbc_ukqcd as ru qg.begin_with_gpt() job_tag = "test-8nt16" traj = 1000 q.qremove_all_info("results") q.qmkdir_info("results") total_site = ru.get_total_site(job_tag) geo = q.Geometry(total_site, 1) q.displayln_info("geo.show() =", geo.show()) rs = q.RngState(f"seed-{job_tag}-{traj}") gf = q.GaugeField(geo) gf.set_rand(rs.split("gf-init"), 0.05, 2) gf.show_info() inv_type = 1 inv_acc = 0 inv = ru.mk_inverter(gf, job_tag, inv_type, inv_acc, n_grouped=q.get_num_node())
#!/usr/bin/env python3 import qlat_gpt as qg import qlat as q import gpt as g qg.begin_with_gpt() q.qremove_all_info("results") q.qmkdir_info("results") rs = q.RngState("seed") geo = q.Geometry([4, 4, 4, 8], 1) q.displayln_info("geo.show() =", geo.show()) gf = q.GaugeField(geo) gf.set_rand(rs.split("gf-init"), 0.05, 2) gf.show_info() mobius_params = { "mass": 0.1, "M5": 1.0, "b": 1.0, "c": 0.0, "Ls": 8, "boundary_phases": [1.0, 1.0, 1.0, 1.0], } gpt_gf = qg.gpt_from_qlat(gf)
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
#!/usr/bin/env python3 import qlat as q import os q.begin() q.qremove_all_info("results") 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") prop = q.Prop(geo) prop.set_rand(rs.split("prop-1")) q.displayln_info( f"prop.crc32() = {prop.crc32()} ; prop.qnorm() = {prop.qnorm()}") prop.save("results/prop.field") prop = q.Prop() prop.load("results/prop.field") q.displayln_info( f"prop.crc32() = {prop.crc32()} ; prop.qnorm() = {prop.qnorm()}") prop.save_double("results/prop-double.field") prop = q.Prop() prop.load_double("results/prop-double.field")
#!/usr/bin/env python3 import qlat as q import os q.begin() q.qremove_all_info("results") q.qmkdir_info("results") rs = q.RngState("seed") total_site = [4, 4, 4, 8] geo = q.Geometry(total_site, 1) q.displayln_info("geo.show() =", geo.show()) psel = q.PointSelection([[0, 0, 0, 0], [0, 1, 2, 0]]) n_per_tslice = 16 fsel = q.FieldSelection(geo.total_site(), n_per_tslice, rs.split("fsel")) fselc = fsel.copy() fselc.add_psel(psel) prop = q.Prop(geo) prop.set_rand(rs.split("prop-1")) q.displayln_info("prop", prop.crc32(), prop.qnorm()) sfw = q.open_fields("results/prop.fields", "w", [1, 1, 1, 8]) q.displayln_info("sfw.new_size_node()", sfw.new_size_node()) prop.save_double(sfw, "prop.d")