Source code for renormalizer.spectra.zerot

# -*- coding: utf-8 -*-
# Author: Jiajun Ren <jiajunren0522@gmail.com>
#         Weitang Li <liwt31@163.com>

import logging

from renormalizer.mps import Mpo, Mps, gs
from renormalizer.spectra.base import SpectraTdMpsJobBase
from renormalizer.mps.mps import BraKetPair
from renormalizer.utils import Quantity, OptimizeConfig

logger = logging.getLogger(__name__)


[docs]class SpectraZeroT(SpectraTdMpsJobBase): '''Calculate the zero temprature absorption & emission spectrum using TD-DMRG Parameters: model : MolList the molecular information spectratype : string "abs" or "emi" optimize_config : parameter for ground state sweep evolve_config : time evolution ''' def __init__( self, model, spectratype, optimize_config=None, evolve_config=None, compress_config=None, offset=Quantity(0), ): if optimize_config is None: self.optimize_config = OptimizeConfig() else: self.optimize_config = optimize_config super(SpectraZeroT, self).__init__( model, spectratype, Quantity(0), evolve_config, compress_config, offset )
[docs] def init_mps(self): if self.spectratype == "emi": operator = "a" else: operator = r"a^\dagger" dipole_mpo = Mpo.onsite(self.model, operator, dipole=True) a_ket_mps = dipole_mpo.apply(self.get_imps(), canonicalise=True) a_ket_mps.normalize("mps_norm_to_coeff") a_ket_mps.evolve_config = self.evolve_config a_bra_mps = a_ket_mps.copy() a_bra_mps.compress_config = self.compress_config a_ket_mps.compress_config = self.compress_config return BraKetPair(a_bra_mps, a_ket_mps)
[docs] def get_imps(self): mmax = self.optimize_config.procedure[0][0] i_mps = Mps.random(self.h_mpo.model, self.nexciton, mmax, 1) i_mps.optimize_config = self.optimize_config energy, i_mps = gs.optimize_mps(i_mps, self.h_mpo) return i_mps
[docs]class SpectraOneWayPropZeroT(SpectraZeroT):
[docs] def evolve_single_step(self, evolve_dt): latest_bra_mps, latest_ket_mps = self.latest_mps latest_ket_mps = latest_ket_mps.evolve(self.h_mpo, evolve_dt) return BraKetPair(latest_bra_mps, latest_ket_mps)
[docs]class SpectraTwoWayPropZeroT(SpectraZeroT):
[docs] def evolve_single_step(self, evolve_dt): latest_bra_mps, latest_ket_mps = self.latest_mps if len(self.evolve_times) % 2 == 1: latest_ket_mps = latest_ket_mps.evolve(self.h_mpo, evolve_dt) else: latest_bra_mps = latest_bra_mps.evolve(self.h_mpo, -evolve_dt) return BraKetPair(latest_bra_mps, latest_ket_mps)