digraph qs_forces { #splines="ortho"; node [shape=box, width=4]; start [shape=ellipse, label="qs_forces()", width=1]; zero[label="CALL zero_qs_force()"]; start -> zero; qs_energies[label="CALL qs_energies(calc_forces=TRUE)", URL="http://cp2k.org/code:qs_energies"]; zero -> qs_energies; { rank=same; if_rtp [shape=diamond, label="RTP ?"]; do_rtp [label="Calc RTP forces", width=3]; if_rtp -> do_rtp [label="yes", minlen=1.5]; } qs_energies->if_rtp; { rank=same; if_mulliken[shape=diamond, label="MULLIKEN_RESTR. ?", URL="http://manual.cp2k.org/trunk/CP2K_INPUT/FORCE_EVAL/DFT/QS/MULLIKEN_RESTRAINT.html"]; do_mulliken[label="CALL mulliken_restraint()", width=3]; if_mulliken -> do_mulliken [label="yes", minlen=1.5]; } if_rtp -> if_mulliken [label="no", minlen=1]; do_rtp -> if_mulliken [weight=0]; { rank=same; if_dft_u[shape=diamond, label="DFT+U ?", URL="http://manual.cp2k.org/trunk/CP2K_INPUT/FORCE_EVAL/SUBSYS/KIND/DFT_PLUS_U.html"]; do_dft_u[label="CALL plus_u(matrix_w)", width=3]; if_dft_u -> do_dft_u [label="yes", minlen=1.5]; } if_mulliken -> if_dft_u [label="no", minlen=1]; do_mulliken -> if_dft_u [weight=0]; core_matrix[label="CALL build_core_matrix(calc_forces=TRUE)"]; if_dft_u -> core_matrix [label="no", minlen=1]; do_dft_u -> core_matrix [weight=0]; ks_update[label="CALL qs_ks_update_qs_env(calc_forces=TRUE)"]; core_matrix -> ks_update; { rank=same; if_mp2[shape=diamond, label="MP2 ?", URL="http://manual.cp2k.org/trunk/CP2K_INPUT/ATOM/METHOD/XC/WF_CORRELATION.html"]; do_mp2[label="Calc MP2 forces", width=3]; if_mp2 -> do_mp2 [label="yes", minlen=1.5]; } ks_update -> if_mp2; { rank=same; if_admm[shape=diamond, label="ADMM-MO?"]; do_admm[label="CALL calc_aux_mo_derivs()\nCALL calc_mixed_overlap_force()", width=3]; if_admm -> do_admm[label="yes", minlen=1.5]; } if_mp2 -> if_admm [label="no", minlen=1]; do_mp2 -> if_admm [weight=0]; sum[label="Sum all force contributions"]; if_admm -> sum [label="no", minlen=1]; do_admm -> sum [weight=0]; { rank=same; if_virial[shape=diamond, label="virial%pv_availability?"]; do_virial[label="Distribute virial", width=3]; if_virial -> do_virial[label="yes", minlen=1.5]; } sum -> if_virial; dealloc[label="Dellocate W-matrix"]; if_virial -> dealloc [label="no", minlen=1]; do_virial -> dealloc [weight=0]; return [shape=ellipse, label="RETURN", width=1]; dealloc -> return; }