Primarly, in this version several small bugs have been fixed that caused segmentation faults on Ubuntu 20 and/or Python 3.7. Several additional warnings are now resolved to avoid compatibility errors in the future.
Secondly, the arrangement of produced data is reconsidered. All output files are now stored in './src/example/dat/' folders.
List of main changes:
- All *.dat, *.raw and *.log files are now stored in './src/example/dat/'. Snapshots of the wavefunction are stored in './src/example/wf/'.
- If the iSURFV method is chosen to calculate the photoelectron spectrum ('tsurff-version long 2' in './src/example/tsurff.param'), then both tSURFF and iSURFV are performed using the data by the end of the laser pulse. This is mainly useful for long pulses where iSURFV might be less accurate at high energies. Having both, the user might stitch together the results at intermediate electron energies (try an example from './src/excited/' folder as the fastest). The option 'tsurff_method' was added to the script './src/plots/plot_pes.py'.
- The unused class tsurffSave_full_WF was removed from './src/base/tsurffSpectrum.hh', corresponding references were removed from './src/example/real_prop.cc'.
- The unused 'time' package and the 'np.set_printoptions' option were removed from plotting scripts.
- In './src/plots/plot_laser.py', the sign of E(t) was corrected. The wrong time-axis label 'T*dt' was replaced by the correct 'T'.
- Several no-return functions are now of type 'void', as it should be. This fixes segmentation faults reported by users using Ubuntu 20 at default settings.
- Some implicit-return functions are now explicit-return to avoid possible problems with new compilers in the future.
Qprop 3.1 has the same features as Qprop 3.0 but with the possibility to initialize excited states (such as 2s, 3s, ... or 3p, for example) for the real-time propagation directly through the "initial.param" parameter file. Previously, one could do this only by modifying the imaginary-time propagation loop in the "imag_prop.cc" source file (i.e., adding Gram-Schmidt orthonormalization by hand).
Moreover, there are additional Python scripts provided that may ease the plotting of results.
Suggestion how to try the new features
Go to folder "/src/excited/" (or any other), set "initial-nr" (radial quantum number, i.e., the number of nodes of the radial wavefunction) in the "initial.param" file and launch the "do_all.sh" script. The "excited" example will take about two minutes. Plot the photoelectron spectrum (PES) with "plot_pes.py" and the initial state probability density with "plot_wf_snapshot.py", both in the "src/plots/" folder.
One can also plot a wavefunction saved during real-time propagation. To store a wavefunction at certain timesteps, set the parameter "wf-saving-interval" in the "propagate.param" file to the desired value. Data is then stored to the "wf" folder of the current example directory. The GIF below is the animation of the probability density from the "vortex" example. There the laser acts for the first 16fs, followed by laser-free propagation (according to the "additional-time" parameter in the "propagate.param" parameter file).
- Initial states of hydrogen normalized to max=1
- PES from those states for laser parameters as used in the "excited" folder
- Time evolution of the probability density in the "vortex" example (animated GIF, 11.5Mb)
Some technical details
To obtain the n_r-th excited state for a given l and m orbital momentum quantum number, imaginary time propagation is performed n_r+1 times. After the imaginary-time propagation of the first wavefunction, a second wavefunction object is created and propagated in imaginary time with the previous state projected out each time step using Gram-Schmidt orthogonalization. The procedure is then repeated for a third wavefunction (unless n_r < 2, in which case we are already finished) with wavefunctions 1 and 2 projected out, and so on.
To facilitate the Gram-Schmidt orthogonalization, the functions
- void subtract(grid g, wavefunction &wf2) (to project-out the wavefunction "wf2")
- void extract_ell(grid g, long ell, long m0) (to extract the l-component of a wavefunction)
- void extract_ell_m(grid g, long ell, long m0) (to extract the l-m-component of a wavefunction)
have been added to "src/base/wavefunction.cc" and "src/base/wavefunction.h".
qprop_v1.92_slim (The slim version is of slightly reduced functionality but runs without lblas, lapack, and f2c.)