///|
/// Diagnostics for a solid/fluid interface.
pub(all) struct BoundaryDiagnostics {
  solid_cells : Int
  fluid_cells : Int
  exposed_faces : Int
  corner_cells : Int
  periodic_safe : Bool
} derive(Debug)

///|
/// Count interface faces and corner cells.
pub fn analyze_boundary_mask(mask : DomainMask) -> BoundaryDiagnostics {
  let report = mask.report()
  let mut exposed = 0
  let mut corners = 0
  for y in 0..= 2 {
          corners += 1
        }
      }
    }
  }
  {
    solid_cells: report.solid_cells,
    fluid_cells: report.fluid_cells,
    exposed_faces: exposed,
    corner_cells: corners,
    periodic_safe: mask.size.width > 1 && mask.size.height > 1,
  }
}

///|
/// Count the number of fluid neighbors of a lattice cell.
pub fn fluid_neighbor_count(mask : DomainMask, x~ : Int, y~ : Int) -> Int {
  let mut count = 0
  if !mask.is_solid(x - 1, y) {
    count += 1
  }
  if !mask.is_solid(x + 1, y) {
    count += 1
  }
  if !mask.is_solid(x, y - 1) {
    count += 1
  }
  if !mask.is_solid(x, y + 1) {
    count += 1
  }
  count
}

///|
/// Return a scalar field of solid-cell distance in four-neighbor steps.
pub fn distance_to_solid(mask : DomainMask) -> Field2D {
  let field = Field2D::new(size=mask.size, initial=1000000.0)
  for y in 0..