digraph swarm { start [shape=ellipse, label="run_swarm()"]; split_comm[shape=box, label="Split MPI-communicator\ninto a master rank\nand multiple worker groups."]; if_master [shape=diamond, label="Master rank?"]; start -> split_comm -> if_master; node [shape=box, width=3.5]; if_master -> m1 [label="yes"]; if_master -> w1 [label="no"]; subgraph cluster_m { color = blue; label = <Master>; m1[label="Receive report (blocking)"]; m2[label="CALL steer(report, command)"]; m3[label="Send new command as reply"]; m1 -> m2 -> m3; m3:w -> m1:w [weight=0]; } subgraph cluster_w { label = <Worker>; color = blue; w1[label="Send report"]; w2[label="CALL execute(command, report)"]; w3[label="Receive command (blocking)"]; w1 -> w2 -> w3 [dir=back]; w3:e -> w1:e [dir=back, weight=0]; } w1 -> m1 [label="MPI", color=red, minlen=3.5, weight=0]; m3 -> w3 [label="MPI", color=green, minlen=3.5, weight=0]; }