lz

Implementation of the Landau-Zener transition probability.

libra_py.workflows.nbra.lz.Belyaev_Lebedev(Hvib, params)[source]

Computes the Landau-Zener hopping probabilities based on the energy levels according to: (1) Belyaev, A. K.; Lebedev, O. V. Phys. Rev. A, 2011, 84, 014701

See also: (2) Xie, W.; Domcke, W. J. Chem. Phys. 2017, 147, 184114 (3) Crespo-Otero, R.; Barbatti, M. Chem. Rev. 2018, 188, 7026 - section: 3.2.3

Specifics: 1) The estimation of d^2E_ij / dt^2 is based on the 3-point Lagrange interpolation 2) This is done within the NBRA

Parameters
  • Hvib (list of CMATRIX(nstates,nstates)) – vibronic Hamiltonians along the trajectory

  • params (dictionary) –

    control parameters

    • params[“dt”] ( double ): time distance between the adjacent data points [ units: a.u., defaut: 41.0 ]

    • params[“T”] ( double ): temperature of the nuclear sub-system [ units: K, default: 300.0 ]

    • params[“Boltz_opt_BL”] ( int ): option to select a probability of hopping acceptance [default: 1]

      Options:

      • 0 - all proposed hops are accepted - no rejection based on energies

      • 1 - proposed hops are accepted with exp(-E/kT) probability - the old (hence the default approach)

      • 2 - proposed hops are accepted with the probability derived from Maxwell-Boltzmann distribution - more rigorous

      • 3 - generalization of “1”, but actually it should be changed in case there are many degenerate levels

    • params[“gap_min_exception”] ( int ): option to handle the situation when extrapolated gap minimum is negative

      Options:

      • 0 - set to zero [ default ]

      • 1 - use the mid-point gap

    • params[“target_space”] ( int ): how to select the space of target states for each source state

      Options:

      • 0 - only adjacent states

      • 1 - all states available [ default ]

libra_py.workflows.nbra.lz.adjust_SD_probabilities(P, params)[source]

Adjusts the surface hopping probabilties computed according to Belyaev-Lebedev’s work by setting the probability to hop between Slater determinants that differ by more than 1 electron to zero.

Parameters
  • P (list of lists of MATRIX) – each element of P contains the probability matrix according to the NBRA BLSH method

  • params (dictionary) – control parameters

  • params["excitations"] (*) –

    SDs themselves (QE or dftb+ non-tddftb) or the SD transitions (tddftb). If the excitations are non-changing, then the

    length of excitations is 1. If excitations do change, then there must be an excitation list for each step. In this case, the length of excitation = nsteps = len(P) params[“excitation”][i][j][k] = kth SD step for the jth step of the ith nuclear trajectory

    i: index of nuclear trajectory j: index of timestep of nuclear trajectory i k: index of SD for the jth timestep on nuclear trajectory i

    Examples

    Assume we have constructed SDs from a basis of 4 alpha and 4 beta Kohn-Sham spin-orbitals The ground state is defined as: [1, 2, -5, -6]. Consider only alpha-excitations

    We currently do non-tddftb computations by forming our own SDs in libra_py.workflows.nbra.step3

    • QE or dftb+ non-tddftb - [ [ [1, 3, -5, -6], [1, 4, -5, -6], [3, 2, -5, -6], [4, 2, -5, -6] ] ]

    As tddftb is used exclusively with the BLSH-NBRA method, we usually just read the energies, and know information only regarding the index of the orbtial transitions, such as: [2 -> 3]. So, we package this in the following form

    • tddftb - [ [ [2,3], [2,4], [1,3], [1,4] ] ]

libra_py.workflows.nbra.lz.run(H_vib, params)[source]

Main function to run the SH calculations based on the Landau-Zener hopping probabilities, all within the NBRA. The probabilities are implemented according to the Belyaev-Lebedev work.

Parameters
  • params (dictionary) – control parameters

  • params["dt"] (*) – time distance between the adjacent data points [ units: a.u.; default: 41.0 a.u.]

  • params["ntraj"] (*) – how many stochastic trajectories to use in the ensemble [ defult: 1]

  • params["nsteps"] (*) – how nuclear steps in the trajectory to be computed [ defult: 1]

  • params["istate"] (*) – index of the starting state (within those used in the active_space) [ default: 0]

  • params["Boltz_opt"] (*) –

    option to control the acceptance of the proposed hops Options:

    • 0 - all proposed hops are accepted - no rejection based on energies

    • 1 - proposed hops are accepted with exp(-E/kT) probability - the old (hence the default approach) [ default ]

    • 2 - proposed hops are accepted with the probability derived from Maxwell-Boltzmann distribution - more rigorous

    • 3 - generalization of “1”, but actually it should be changed in case there are many degenerate levels

  • params["Boltz_opt_BL"] (*) –

    what type of hop acceptance scheme to incorporate into the BL probabilities Options:

    • 0 - all proposed hops are accepted - no rejection based on energies [ default ]

    • 1 - proposed hops are accepted with exp(-E/kT) probability - the old (hence the default approach)

    • 2 - proposed hops are accepted with the probability derived from Maxwell-Boltzmann distribution - more rigorous

    • 3 - generalization of “1”, but actually it should be changed in case there are many degenerate levels

  • params["T"] (*) – temperature of the nuclei - affects the acceptance probabilities [ units: K, default: 300.0 K]

  • params["do_output"] (*) – whether to print out the results into a file [ default: True ]

  • params["outfile"] (*) – the name of the file, where all the results will be printed out [ default: “_out.txt” ]

  • params["do_return"] (*) – whether to construct the big matrix with all the result [ default: True ]

  • params["evolve_Markov"] (*) – whether to propagate the “SE” populations via Markov chain [ default: True ]

  • params["evolve_TSH"] (*) – whether to propagate the “SH” populations via TSH with many trajectories [ default: True ]

  • params["extend_md"] (*) – whether or not to extend md time by resampling the NBRA hopping probabilities

  • params["extend_md_time"] (*) – length of the new dynamics trajectory, in units dt

  • params["detect_SD_difference"] (*) – see if SD states differ by more than 1 electron, if so probability to zero [ default: False ]