<graphviz dot> 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;
} </graphviz>