pub struct SimulationGrid {
pub width: u32,
pub height: u32,
pub params: AcousticParams,
/* private fields */
}Expand description
The main simulation grid containing all cells.
Uses SoA (Structure of Arrays) memory layout for cache-friendly sequential access and SIMD compatibility. Pressure arrays are double-buffered for in-place FDTD time-stepping.
Fields§
§width: u32Grid width (number of columns).
height: u32Grid height (number of rows).
params: AcousticParamsAcoustic simulation parameters.
Implementations§
Source§impl SimulationGrid
impl SimulationGrid
Sourcepub fn new(width: u32, height: u32, params: AcousticParams) -> Self
pub fn new(width: u32, height: u32, params: AcousticParams) -> Self
Create a new simulation grid.
§Arguments
width- Number of columnsheight- Number of rowsparams- Acoustic simulation parameters
Sourcepub fn step(&mut self)
pub fn step(&mut self)
Perform one simulation step using FDTD scheme.
Uses the 2D wave equation: ∂²p/∂t² = c²∇²p
Discretized as: p[n+1] = 2p[n] - p[n-1] + c²(p_N + p_S + p_E + p_W - 4*p)
Sourcepub fn inject_impulse(&mut self, x: u32, y: u32, amplitude: f32)
pub fn inject_impulse(&mut self, x: u32, y: u32, amplitude: f32)
Inject an impulse at the given grid position.
Sourcepub fn get_pressure_grid(&self) -> Vec<Vec<f32>>
pub fn get_pressure_grid(&self) -> Vec<Vec<f32>>
Get the pressure grid as a 2D vector for visualization.
Returns a Vec of rows, where each row is a Vec of pressure values.
Sourcepub fn pressure_slice(&self) -> &[f32]
pub fn pressure_slice(&self) -> &[f32]
Get the pressure buffer as a flat slice (row-major order).
This is more efficient than get_pressure_grid() for bulk operations.
Sourcepub fn max_pressure(&self) -> f32
pub fn max_pressure(&self) -> f32
Get the maximum absolute pressure in the grid.
Sourcepub fn total_energy(&self) -> f32
pub fn total_energy(&self) -> f32
Get total energy in the system (sum of squared pressures).
Sourcepub fn set_params(&mut self, params: AcousticParams)
pub fn set_params(&mut self, params: AcousticParams)
Update acoustic parameters.
Sourcepub fn set_speed_of_sound(&mut self, speed: f32)
pub fn set_speed_of_sound(&mut self, speed: f32)
Update speed of sound.
Sourcepub fn set_cell_size(&mut self, size: f32)
pub fn set_cell_size(&mut self, size: f32)
Update cell size in meters.
Sourcepub fn cell_count(&self) -> usize
pub fn cell_count(&self) -> usize
Get the number of cells in the grid.
Sourcepub fn get_pressure(&self, x: u32, y: u32) -> Option<f32>
pub fn get_pressure(&self, x: u32, y: u32) -> Option<f32>
Get pressure at a specific cell (for compatibility with old API).
Sourcepub fn is_boundary(&self, x: u32, y: u32) -> bool
pub fn is_boundary(&self, x: u32, y: u32) -> bool
Check if a cell is a boundary.
Sourcepub fn set_cell_type(&mut self, x: u32, y: u32, cell_type: CellType)
pub fn set_cell_type(&mut self, x: u32, y: u32, cell_type: CellType)
Set the cell type at the given position.
This affects how the cell interacts with waves:
- Normal: waves propagate freely
- Absorber: waves are absorbed (0% reflection)
- Reflector: waves are reflected (100% reflection)
Sourcepub fn get_cell_type(&self, x: u32, y: u32) -> Option<CellType>
pub fn get_cell_type(&self, x: u32, y: u32) -> Option<CellType>
Get the cell type at the given position.
Sourcepub fn cell_types_slice(&self) -> &[CellType]
pub fn cell_types_slice(&self) -> &[CellType]
Get all cell types as a flat slice (row-major order).
Sourcepub fn clear_cell_types(&mut self)
pub fn clear_cell_types(&mut self)
Clear all user-defined cell types (reset to Normal).
This keeps the grid boundaries intact.
Sourcepub fn get_buffers_mut(
&mut self,
) -> (&mut Vec<f32>, &mut Vec<f32>, usize, usize, f32, f32)
pub fn get_buffers_mut( &mut self, ) -> (&mut Vec<f32>, &mut Vec<f32>, usize, usize, f32, f32)
Get mutable access to pressure buffers for educational mode processing.
Returns (pressure, pressure_prev, width, height, c2, damping)
Sourcepub fn swap_buffers(&mut self)
pub fn swap_buffers(&mut self)
Swap the pressure buffers (called when educational step completes).
Auto Trait Implementations§
impl Freeze for SimulationGrid
impl RefUnwindSafe for SimulationGrid
impl Send for SimulationGrid
impl Sync for SimulationGrid
impl Unpin for SimulationGrid
impl UnwindSafe for SimulationGrid
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more