The basic idea of interferometry is to create a coherent superposition of a wavepacket whose properties we want to study, and a reference wavepacket. In some way, we manage to set them up such that they propagate independently of each other. When overlapping both of them later on, we get interference phenomena that can be used to deduce valuable information about the dynamics of the probed system.
In a paper by V. Engel and H. Metiu, a special idea of two-photon interferometry is proposed, and qualitatively discussed for the case of a three-state model of the sodium dimer Na2. By absorbing one photon, the molecule can be excited from the X to its A state, when absorbing another photon of approximately the same wavelength, the molecule can be further excited to the 2 state. The idea is now to make a pump-probe experiment where the pump and probe pulse have identical frequency and shape, but can have different field strengths and phases. The final population of the 2 state is then made up of three different contributions. In two cases, both photons are absorbed from the first or second pulse. This constitutes the reference wavepacket(s). The third contribution comes from a wavepacket that absorbs one photon from the first pulse, propagates on the A surface, and finally absorbs another photon from the second pulse. When all three contributions come together after the probe pulse, the population of the 2 state strongly depends on the various interferences between the single wavepackets. By adjusting the parameters (phase and field strength) of the pump and probe pulse, and varying the time delay between them, it is possible to disentangle the single contributions, and obtain insight into the dynamics on the A surface.
This problem is a prime example of an advanced pump-probe setup. We cannot simulate the probe signal by just calculating some expectation value, but have to treat the probe pulse properly, i.e. do separate calculations for each value of the time delay between pump and probe signal.
Note that the C++/Python version differs in doing all calculations in one script (C++ program or equivalent Python script).
Starting from a poor initial guess, we first relax the wavefunction to the vibrational ground state of the ground state potential energy surface via propagation in imaginary time. The result is written to an output file that the next simulation uses as input.
The next step is the propagation using only the pump pulse at a fixed time. This has little value in itself, but we can save the result of the propagation.
The final and most time-consuming step consists of propagating the wavepacket for each pump-probe delay. To save considerable computing time, we just load the wave function from the previous pump-only propagation, and propagate it for the short time that the probe pulse is actually on. The total population of the 2 state can be decomposed into the single contributions, depending on when the two photons were absorbed, and the various interference terms between them.
In the following we show the output produced with the Matlab version of WavePacket. The C++/Python output is qualitatively similar.
Wiki: Demos.FemtoChem.Main
Wiki: Numerics.TISE
Some (but not all!) of the pump-probe signal changed a little after the many changes in June/July 2017. Can we figure out why that happened?
Did you change things incrementally, so that some intermediate versions were stable? In that case, you could try to go through the commits and see where exactly it changed to narrow down the list of candidates. An alternative would be to undo selectively some of the changes and see if you can reproduce the old behavior.
Either way, figuring this out is important (I guess we do not want surprising changes in the results) and at the same time very time-consuming. Same at work, so I guess there is no magic bullet known to mankind.