Пример #1
0
    def init_mps(self):
        mmax = self.optimize_config.procedure[0][0]
        i_mps = Mps.random(self.h_mpo.mol_list, self.nexciton, mmax, 1)
        i_mps.optimize_config = self.optimize_config
        solver.optimize_mps(i_mps, self.h_mpo)
        if self.spectratype == "emi":
            operator = "a"
        else:
            operator = r"a^\dagger"
        dipole_mpo = Mpo.onsite(self.mol_list, operator, dipole=True)
        if self.temperature != 0:
            beta = self.temperature.to_beta()
            # print "beta=", beta
            # thermal_mpo = Mpo.exact_propagator(self.mol_list, -beta / 2.0, space=self.space1, shift=self.shift1)
            # ket_mps = thermal_mpo.apply(i_mps)
            # ket_mps.normalize()
            # no test, don't know work or not
            i_mpdm = MpDm.from_mps(i_mps)
            tp = ThermalProp(i_mpdm, self.h_mpo, exact=True, space=self.space1)
            tp.evolve(None, 1, beta / 2j)
            ket_mps = tp.latest_mps
        else:
            ket_mps = i_mps
        a_ket_mps = dipole_mpo.apply(ket_mps, canonicalise=True)
        a_ket_mps.canonical_normalize()

        if self.temperature != 0:
            a_bra_mps = ket_mps.copy()
        else:
            a_bra_mps = a_ket_mps.copy()

        return BraKetPair(a_bra_mps, a_ket_mps)
Пример #2
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)
Пример #3
0
def test_zt_init_state():
    ph = Phonon.simple_phonon(Quantity(1), Quantity(1), 10)
    mol_list = MolList([Mol(Quantity(0), [ph])], Quantity(0), scheme=3)
    mpo = Mpo(mol_list)
    mps = Mps.random(mol_list, 1, 10)
    optimize_mps(mps, mpo)
    ct = ChargeTransport(mol_list)
    assert mps.angle(ct.latest_mps) == pytest.approx(1)
Пример #4
0
def test_optimization(scheme):
    mps, mpo = construct_mps_mpo_2(mol_list.switch_scheme(scheme), procedure[0][0], nexciton)
    mps.optimize_config.procedure = procedure
    mps.optimize_config.method = "2site"
    energy = optimize_mps(mps.copy(), mpo)
    assert energy * constant.au2ev == pytest.approx(2.28614053133, rel=1e-5)

    mps.optimize_config.method = "1site"
    energy = optimize_mps(mps.copy(), mpo)
    assert energy * constant.au2ev == pytest.approx(2.28614053133, rel=1e-5)
Пример #5
0
def test_csvd():
    np.random.seed(0)
    mps1, mpo = construct_mps_mpo_2(mol_list, procedure[0][0], nexciton)
    mps1.threshold = 1e-6
    mps1.optimize_config.procedure = procedure
    optimize_mps(mps1, mpo)
    mps1.compress()
    mps2 = Mps.load(mol_list, os.path.join(cur_dir, "test_svd_qn.npz"))
    d = pytest.approx(mps1.distance(mps2), abs=1e-4)
    # the same direction or opposite direction
    assert d == 0 or d == 2
Пример #6
0
def test_multistate():
    mps, mpo = construct_mps_mpo_2(mol_list, procedure[0][0], nexciton)
    mps.optimize_config.procedure = procedure
    mps.optimize_config.nroots = 5
    mps.optimize_config.method = "1site"
    energy1 = optimize_mps(mps.copy(), mpo)
    mps.optimize_config.method = "2site"
    energy2 = optimize_mps(mps.copy(), mpo)
    # print energy1[-1], energy2[-1]
    energy_std = [0.08401412, 0.08449771, 0.08449801, 0.08449945]
    assert np.allclose(energy1[:4], energy_std)
    assert np.allclose(energy2[:4], energy_std)
def test_hybrid_DMRG_H_SCF(mol_list, target):

    nexciton = 1
    mps, mpo = solver.construct_mps_mpo_2(mol_list, 10, nexciton)
    Etot = solver.optimize_mps(mps, mpo)
    # print("Etot", Etot)
    assert Etot == pytest.approx(target, abs=1e-5)

    nexciton = 0
    mps, mpo = solver.construct_mps_mpo_2(mol_list, 10, nexciton)
    Etot = solver.optimize_mps(mps, mpo)
    # print("Etot", Etot)
    assert Etot == pytest.approx(0.0, abs=1e-5)
Пример #8
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)
Пример #9
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)
Пример #10
0
    def init_oper(self):
        if self.spectratype == "abs":
            self.nexciton = 0
            dipoletype = r"a^\dagger"
        else:
            self.nexciton = 1
            dipoletype = "a"

        dipole_mpo = \
            Mpo.onsite(
                self.mol_list, dipoletype, dipole=True
            )
        mps, self.mpo = \
            construct_mps_mpo_2(
                self.mol_list, self.procedure_gs[0][0], self.nexciton
            )
        # ground state calculation
        mps.optimize_config = OptimizeConfig(procedure=self.procedure_gs)
        mps.optimize_config.method = "2site"
        self.lowest_e = optimize_mps(mps, self.mpo)
        ket_mps = dipole_mpo.apply(mps, canonicalise=True)
        self.b_oper = ket_mps.scale(-self.eta)
Пример #11
0
 def get_imps(self):
     mmax = self.optimize_config.procedure[0][0]
     i_mps = Mps.random(self.h_mpo.mol_list, self.nexciton, mmax, 1)
     i_mps.optimize_config = self.optimize_config
     solver.optimize_mps(i_mps, self.h_mpo)
     return i_mps