Hi Raffaele,
Thanks for reporting an issue. Could you elaborate more on your application? What matrix are you trying to exponentiate and what are you ultimately trying to calculate?
Right now, applyExp
uses a pretty standard Krylov-based method for calculating the exponential of an operator applied to a vector (i.e. it builds the Krylov basis and then the Krylov matrix is exponentiated, you can see the implementation here: https://github.com/ITensor/ITensor/blob/7abb7b2760d0608713f846f6bc85f6b6b8c7e509/itensor/iterativesolvers.h#L970).
The current implementation does not have restarts, so it may be limited in the timestep you can input (i.e. if you are calculating exp(-t*H)*v
, for large t
it may have convergence issues). We would be happy to add in restarts if there is a compelling use case, but we were waiting for a concrete example where that is necessary. For example, in the main use case for us (TDVP), the time step can be taken smaller by doing more sweeps of the MPS, and we have found that the current implementation is sufficient.
Also right now, consider that you can split up your timestep and do multiple calls of applyExp
, for example you can try:
auto expHv = applyExp(H,v,-t/2);
expHv = applyExp(H,expHv,-t/2);
instead of:
auto expHv = applyExp(H,v,-t);
if your timestep t
is too large for convergence. For a fixed ErrGoal
you of course accumulate the error of both calls of applyExp
.
Cheers,
Matt