예제 #1
0
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
예제 #2
0
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
예제 #3
0
def mk_inverter_gpt(gf, timer):
    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)
    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
예제 #4
0
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})
slv_5d = inv.preconditioned(pc.eo2_ne(), cg)
slv_qm = qm.propagator(slv_5d)
ginv = qg.InverterGPT(inverter=slv_qm, timer=q.Timer("py:InverterGPT"))

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 * src
예제 #5
0
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)
예제 #6
0
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