///|
/// Human-readable one-block simulation summary.
pub fn Lattice::summary(self : Lattice, name? : String = "lattice") -> String {
let s = self.stability()
let b = StringBuilder(size_hint=160)
b.write_string("name=\{name}\n")
b.write_string("size=\{self.size.width}x\{self.size.height}\n")
b.write_string("steps=\{self.step_count}\n")
b.write_string("mass=\{s.mass}\n")
b.write_string("rho=[\{s.min_rho}, \{s.max_rho}]\n")
b.write_string("max_speed=\{s.max_speed}\n")
b.write_string("recommended=\{s.recommended}\n")
b.to_string()
}
///|
/// Export vorticity as CSV for quick plotting.
pub fn Lattice::vorticity_csv(self : Lattice) -> String {
let b = StringBuilder(size_hint=self.size.width * self.size.height * 24)
b.write_string("x,y,vorticity\n")
for y in 0..