///|
/// 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..