Esempio n. 1
0
def test_quasiboson_solver(value):
    np.random.seed(0)
    # normal boson
    mol_list1 = parameter.custom_mol_list(None, *value[0])
    mps1, mpo1 = solver.construct_mps_mpo_2(
        mol_list1, procedure[0][0], nexciton
    )
    mps1.optimize_config.procedure = procedure

    # quasiboson
    mol_list2 = parameter.custom_mol_list(None, *value[1])
    mps2, mpo2 = solver.construct_mps_mpo_2(
        mol_list2, procedure[0][0], nexciton
    )
    mps2.optimize_config.procedure = procedure

    # quasiboson + normal boson
    mol_list3 = parameter.custom_mol_list(None, *value[2])
    mps3, mpo3 = solver.construct_mps_mpo_2(
        mol_list3, procedure[0][0], nexciton
    )
    mps3.optimize_config.procedure = procedure

    for method in ["1site", "2site"]:
        mps1.optimize_config.method = method
        mps2.optimize_config.method = method
        mps3.optimize_config.method = method
        energy1 = solver.optimize_mps(mps1, mpo1)
        energy2 = solver.optimize_mps(mps2, mpo2)
        energy3 = solver.optimize_mps(mps3, mpo3)
        assert np.min(energy1) == pytest.approx(np.min(energy2), rel=1e-4)
        assert np.min(energy2) == pytest.approx(np.min(energy3), rel=1e-4)
Esempio n. 2
0
def test_zero_t_abs_mposcheme3(
    algorithm, compress_method, ph_info, rtol, switch_to_64backend
):
    np.random.seed(0)
    # print "data", value
    j_matrix = (
        np.array([[0.0, -0.1, 0.0], [-0.1, 0.0, -0.3], [0.0, -0.3, 0.0]])
        / constant.au2ev
    )
    procedure = [[1, 0], [1, 0], [1, 0]]
    mol_list = parameter.custom_mol_list(j_matrix, *ph_info)
    nsteps = 50
    dt = 30.0
    if algorithm == 1:
        SpectraZeroT = SpectraOneWayPropZeroT
    else:
        SpectraZeroT = SpectraTwoWayPropZeroT
    optimize_config = OptimizeConfig()
    optimize_config.procedure = procedure
    zero_t_corr2 = SpectraZeroT(
        mol_list, "abs", optimize_config, offset=parameter.offset
    )
    zero_t_corr2.evolve(dt, nsteps)
    zero_t_corr3 = SpectraZeroT(
        mol_list.switch_scheme(3), "abs", optimize_config, offset=parameter.offset
    )
    zero_t_corr3.evolve(dt, nsteps)

    assert np.allclose(zero_t_corr2.autocorr, zero_t_corr3.autocorr, rtol=rtol)
Esempio n. 3
0
def test_zero_t_abs(algorithm, compress_method, ph_info, rtol, switch_to_64backend):
    np.random.seed(0)
    # print "data", value
    procedure = [[1, 0], [1, 0], [1, 0]]
    optimize_config = OptimizeConfig()
    optimize_config.procedure = procedure
    mol_list = parameter.custom_mol_list(None, *ph_info)
    if algorithm == 1:
        SpectraZeroT = SpectraOneWayPropZeroT
    else:
        SpectraZeroT = SpectraTwoWayPropZeroT

    zero_t_corr = SpectraZeroT(
        mol_list.switch_scheme(2), "abs", optimize_config, offset=parameter.offset
    )
    zero_t_corr.info_interval = 30
    nsteps = 100
    dt = 30.0
    zero_t_corr.evolve(dt, nsteps)
    with open(
        os.path.join(
            cur_dir, "ZeroTabs_" + str(algorithm) + str(compress_method) + ".npy"
        ),
        "rb",
    ) as f:
        std = np.load(f)
    assert np.allclose(zero_t_corr.autocorr[:nsteps], std[:nsteps], rtol=rtol)
Esempio n. 4
0
def test_FT_spectra(D_value, spectratype, std_path):

    if spectratype == "emi":
        E_offset = 2.28614053 / constant.au2ev
    elif spectratype == "abs":
        E_offset = -2.28614053 / constant.au2ev
    else:
        assert False

    mol_list = custom_mol_list(None,
                               dis=[Quantity(d) for d in D_value],
                               hartrees=[True, True])

    T = Quantity(298, "K")
    insteps = 50
    spectra = tdh.LinearSpectra(spectratype,
                                mol_list,
                                E_offset=E_offset,
                                temperature=T,
                                insteps=insteps)
    nsteps = 300 - 1
    dt = 30.0
    spectra.evolve(dt, nsteps)
    with open(os.path.join(cur_dir, std_path), "rb") as f:
        std = np.load(f)
    assert np.allclose(spectra.autocorr, std)
Esempio n. 5
0
def test_distance():
    mol_list = parameter.custom_mol_list(n_phys_dim=(2, 2))
    a = Mps.random(mol_list, 1, 10)
    b = Mps.random(mol_list, 1, 10)
    check_distance(a, b)
    h = Mpo(mol_list)
    for i in range(100):
        a = a.evolve(h, 10)
        b = b.evolve(h, 10)
        check_distance(a, b)
Esempio n. 6
0
def test_construct_MPO_scheme3():
    Mmax = 10
    J = (np.array([[0.0, -0.1, 0.0], [-0.1, 0.0, -0.3], [0.0, -0.3, 0.0]]) /
         constant.au2ev)
    mol_list = custom_mol_list(J)
    mps2, mpo2 = construct_mps_mpo_2(mol_list, Mmax, nexciton)
    mps3, mpo3 = construct_mps_mpo_2(mol_list.switch_scheme(3), Mmax, nexciton)
    assert mpo2.ephtable == mpo3.ephtable
    assert mpo2.pbond_list == mpo3.pbond_list
    assert mpo3.distance(mpo2) == pytest.approx(0)
Esempio n. 7
0
def test_SCF_exact():

    nexciton = 1

    dmrg_mol_list = custom_mol_list(None,
                                    ph_phys_dim,
                                    dis=[Quantity(0), Quantity(0)])
    # DMRG calculation
    procedure = [[40, 0.4], [40, 0.2], [40, 0.1], [40, 0], [40, 0]]
    mps, mpo = construct_mps_mpo_2(dmrg_mol_list, 40, nexciton)
    mps.optimize_config.procedure = procedure
    energy = optimize_mps(mps, mpo)
    dmrg_e = mps.expectation(mpo)

    # print occupation
    dmrg_occ = []
    for i in [0, 1, 2]:
        mpo = Mpo.onsite(dmrg_mol_list,
                         r"a^\dagger a",
                         dipole=False,
                         mol_idx_set={i})
        dmrg_occ.append(mps.expectation(mpo))
    print("dmrg_occ", dmrg_occ)

    hartree_mol_list = custom_mol_list(None,
                                       ph_phys_dim,
                                       dis=[Quantity(0),
                                            Quantity(0)],
                                       hartrees=[True, True])
    WFN, Etot = tdh.SCF(hartree_mol_list, nexciton)
    assert Etot == pytest.approx(dmrg_e)

    fe, fv = 1, 6
    HAM, Etot, A_el = tdh.construct_H_Ham(hartree_mol_list,
                                          nexciton,
                                          WFN,
                                          fe,
                                          fv,
                                          debug=True)
    assert Etot == pytest.approx(dmrg_e)
    assert np.allclose(A_el.flatten(), dmrg_occ, rtol=1e-4)
Esempio n. 8
0
def test_1mol_Exact_Spectra_hybrid_TDDMRG_TDH(algorithm):
    nmols = 1
    J = np.zeros([1, 1])

    if algorithm == "pure":
        mol_list = parameter.custom_mol_list(J, nmols=nmols)
    elif algorithm == "hybrid":
        mol_list = parameter.custom_mol_list(J, hartrees=[True, False], nmols=nmols)
    else:
        assert False

    E_offset = -mol_list[0].elocalex - mol_list[0].reorganization_energy
    exact_abs = SpectraExact(mol_list, spectratype="abs", offset=Quantity(E_offset))
    exact_abs.info_interval = 100
    nsteps = 1000
    dt = 30.0
    exact_abs.evolve(dt, nsteps)

    with open(os.path.join(cur_dir, "1mol_ZTabs.npy"), "rb") as f:
        mol1_ZTabs_std = np.load(f)

    assert np.allclose(exact_abs.autocorr[:nsteps], mol1_ZTabs_std[:nsteps], rtol=1e-3)
Esempio n. 9
0
def test_finite_t_spectra_abs(algorithm, compress_method, ph_info, rtol):
    # print "data", value
    mol_list = parameter.custom_mol_list(None, *ph_info)
    insteps = 50
    finite_t_abs = SpectraFiniteT(mol_list, "abs", Quantity(298, "K"), insteps,
                                  parameter.offset)
    nsteps = 50
    dt = 30.0
    finite_t_abs.evolve(dt, nsteps)
    with open(os.path.join(cur_dir, "TTabs_" + str(compress_method) + ".npy"),
              "rb") as fin:
        std = np.load(fin)
    assert np.allclose(finite_t_abs.autocorr[:nsteps], std[:nsteps], rtol=rtol)
Esempio n. 10
0
def test_quasiboson_constructMPO():

    mol_list1 = parameter.custom_mol_list(None, [4, 4])
    mps1, mpo1 = solver.construct_mps_mpo_2(mol_list1, procedure[0][0],
                                            nexciton)

    mol_list2 = mol_list = parameter.custom_mol_list(None, [4, 4], [2, 2],
                                                     [1e-7, 1e-7])
    mps2, mpo2 = solver.construct_mps_mpo_2(mol_list2, procedure[0][0],
                                            nexciton)

    # merge the decomposed MPO
    mpo_merge = Mpo()
    mpo_merge.mol_list = mol_list
    impo = 0
    for mol in mol_list:
        mpo_merge.append(mpo2[impo])
        impo += 1
        for _ in mol.dmrg_phs:
            mo = einsum("abcd, defg -> abecfg", mpo2[impo],
                        mpo2[impo + 1]).reshape((mpo2[impo].shape[0], 4, 4,
                                                 mpo2[impo + 1].shape[-1]))
            mpo_merge.append(mo)
            impo += 2

    assert mpo1.distance(mpo_merge) == pytest.approx(0)

    mps2.optimize_config.procedure = procedure
    mps2.optimize_config.method = "2site"
    energy = solver.optimize_mps(mps2, mpo2)
    assert np.min(energy) * constant.au2ev == pytest.approx(2.28614053133,
                                                            rel=1e-4)

    mps2.optimize_config.method = "1site"
    energy = solver.optimize_mps(mps2, mpo2)
    assert np.min(energy) * constant.au2ev == pytest.approx(2.28614053133,
                                                            rel=1e-4)
Esempio n. 11
0
def test_save_load():
    mol_list = custom_mol_list(hartrees=[True, False])
    mps = Mpo.onsite(mol_list, "a^\dagger", mol_idx_set={0}) @ Mps.gs(
        mol_list, False)
    mpo = Mpo(mol_list)
    mps1 = mps.copy()
    for i in range(2):
        mps1 = mps1.evolve(mpo, 10)
    mps2 = mps.evolve(mpo, 10)
    fname = "test.npz"
    mps2.dump(fname)
    mps2 = Mps.load(mol_list, fname)
    mps2 = mps2.evolve(mpo, 10)
    assert np.allclose(mps1.e_occupations, mps2.e_occupations)
    os.remove(fname)