They do have options to calculate the dynamics in CP2K. And it seems like they have support for features like Langevin dynamics. But at a glance I only saw constant time stepping, and variable time stepping seems pretty important. Also monitoring the progress of CP2K calculations across multiple time steps is harder than just doing one at a time so you know when to look at new output. I'm not sure what the ideal middle ground is yet.
Here is essentially the code I used to read the cube files.
data = Import[
cp2kDir <> "sim-" <> ToString@frame <>
"-ELECTRON_DENSITY-1_0.cube", "Table"];
output = Import[cp2kDir <> "testoutput.txt", "Table"];
atomCount = data[[3, 1]];
numX = data[[4, 1]];
basisX = data[[4, 2 ;;]];
numY = data[[5, 1]];
basisY = data[[5, 2 ;;]];
numZ = data[[6, 1]];
basisZ = data[[6, 2 ;;]];
volume = data[[7 + atomCount ;;]] // Flatten // Rescale //
Transpose[ArrayReshape[#, {numX, numY, numZ}], {3, 2, 1}] &;
atomTypes = data[[7 ;; 7 + atomCount - 1, 1]];
atomPos =
Rescale[#[[3 ;;]], {0, numX*basisX[[1]]}, {0, numX}] & /@
data[[7 ;; 7 + atomCount - 1]];
atomForces =
Take[output,
Position[
output, {"#", "Atom", "Kind", "Element", "X", "Y", "Z"}][[1,
1]] + {1, 3}][[All, 4 ;;]];