ATIsimPL -- Solving the integral for the strong-field tunnel ionisation amplitude, based on Picard-Lefschetz theory
This repository contains the code used to evaluate the one-dimensional integral that calculations the ionisation amplitude for direct photoelectrons in an above-threshold ionisation setup.
We assume the integrand to be of the shape `exp(im S)'.
get_thimble(S::Function, drv::Function, tmin::Float64, tmax::Float64;
Nflow::Int64 = 60,
Δinit::Float64 = 10.,
flowstepfactor::Float64 = 2.,
h_threshold::Float64 = -300.,
gradnthreshold::Float64 = 1.,
subdividethreshold::Float64 = 4.,
flow_bounds:;Vector{Bool}=[true,true]
)
Nflow: how many flow steps to doΔinit: how fine to chop the integration domain in the beginningflowstepfactor: how big the flow steps areh_threshold0: how deep down into the valley the contour goesgradnthreshold: how precise we are around the saddle points (ignore)subdividethreshold: how fine we chop the integration domain into pieces (smaller number --> finer)flow_bounds: whether to keep the endpoints fixed (flow -> false)
The integration domain (here a line along the real time axis) is represented as a set of points and the resulting line segments (with distance < Δinit).
In each iteration step of the flow procedure, each of the points "flow" in the direction of the normalised gradient* (see step in the flow() function here, multiplied with the flowstepfactor.
If the distance between two points is too big (greater than subdividethreshold), we insert a new one in the middle.
If the imaginary part of the phase function drops below a certain threshold (namely, h_threshold), the point is turned inactive and won't flow any longer. That is the part of the contour flows deep down into the valley where the integrand vanishes.
The algorithm is adapted (and nicely explained) on Job Feldbrugge's website.
(*) the gradient will be normalised if its norm is greater than gradnthreshold.
Example of an integration domain flow, for a monochromatic driving field: