Skip to main content

LevelSet

Struct LevelSet 

Source
pub struct LevelSet {
    pub tree: QuadTree,
    pub delta: f64,
}
Expand description

Signed-distance level-set function stored on a QuadTree.

Variable index 0 of each leaf cell contains the level-set value φ. The tree must have been constructed with n_vars >= 1.

The narrow band is the set of cells where |φ| < delta. Only narrow- band cells are updated during reinitialization and advection, which makes these algorithms O(N_interface) rather than O(N_total).

Fields§

§tree: QuadTree

The underlying quad-tree (n_vars == 1, storing φ).

§delta: f64

Narrow-band half-width in physical units.

Implementations§

Source§

impl LevelSet

Source

pub fn new(tree: QuadTree, phi0: impl Fn(f64, f64) -> f64) -> Self

Create a new level-set by evaluating phi0(x, y) on every leaf of an already-constructed quad-tree (must have n_vars >= 1).

phi0 should return a signed distance (positive outside, negative inside) but any smooth function is accepted.

Source

pub fn set_delta(&mut self, delta: f64)

Override the narrow-band half-width (default: 3 × coarsest cell size).

Source

pub fn phi(&self, id: CellId) -> Option<f64>

Return the level-set value φ at a leaf cell.

Source

pub fn reinitialize(&mut self, n_iters: usize)

Sussman reinitialization: solve ∂φ/∂τ + sign(φ₀)(|∇φ|−1) = 0 for n_iters pseudo-time steps using first-order Godunov upwind.

Only narrow-band cells (|φ| < delta) are updated.

Source

pub fn advect( &mut self, vx: &dyn Fn(f64, f64, f64) -> f64, vy: &dyn Fn(f64, f64, f64) -> f64, t: f64, dt: f64, )

First-order upwind advection: ∂φ/∂t + v·∇φ = 0.

vx(x, y, t) and vy(x, y, t) are the advecting velocity components. Only narrow-band cells are updated. The time step dt must satisfy the CFL condition dt * max(|v|) / dx < 1.

Source

pub fn interface_cells(&self) -> Vec<CellId>

Return the IDs of all interface cells: leaf cells where φ changes sign among the cell and its face-neighbours.

Equivalently: cells where |φ| < delta and at least one neighbour has the opposite sign of φ.

Source

pub fn gradient(&self, id: CellId) -> Option<(f64, f64)>

Compute the first-order centred gradient (∂φ/∂x, ∂φ/∂y) at a leaf cell.

Source

pub fn narrow_band_count(&self) -> usize

Statistics: number of narrow-band leaf cells.

Source

pub fn cell_data(&self, id: CellId) -> Option<&CellData>

Retrieve the CellData of a leaf.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,