pub struct SimulationGrid3D {
pub width: usize,
pub height: usize,
pub depth: usize,
pub pressure: Vec<f32>,
pub pressure_prev: Vec<f32>,
pub cell_types: Vec<CellType>,
pub reflection_coeff: Vec<f32>,
pub params: AcousticParams3D,
pub step: u64,
pub time: f32,
/* private fields */
}Expand description
3D simulation grid using Structure of Arrays (SoA) layout.
Memory layout is z-major (z varies slowest):
index = z * (width * height) + y * width + x
Fields§
§width: usizeGrid dimensions
height: usize§depth: usize§pressure: Vec<f32>Current pressure field (row-major, z-major ordering)
pressure_prev: Vec<f32>Previous pressure field (for time-stepping)
cell_types: Vec<CellType>Cell types (boundary conditions)
reflection_coeff: Vec<f32>Reflection coefficients per cell (0 = full absorption, 1 = full reflection)
params: AcousticParams3DAcoustic parameters
step: u64Current simulation step
time: f32Accumulated simulation time
Implementations§
Source§impl SimulationGrid3D
impl SimulationGrid3D
Sourcepub fn new(
width: usize,
height: usize,
depth: usize,
params: AcousticParams3D,
) -> Self
pub fn new( width: usize, height: usize, depth: usize, params: AcousticParams3D, ) -> Self
Create a new 3D simulation grid.
§Arguments
width- Number of cells in X directionheight- Number of cells in Y directiondepth- Number of cells in Z directionparams- Acoustic simulation parameters
Sourcepub fn index(&self, x: usize, y: usize, z: usize) -> usize
pub fn index(&self, x: usize, y: usize, z: usize) -> usize
Convert (x, y, z) coordinates to linear index.
Sourcepub fn coords(&self, idx: usize) -> (usize, usize, usize)
pub fn coords(&self, idx: usize) -> (usize, usize, usize)
Convert linear index to (x, y, z) coordinates.
Sourcepub fn in_bounds(&self, x: i32, y: i32, z: i32) -> bool
pub fn in_bounds(&self, x: i32, y: i32, z: i32) -> bool
Check if coordinates are within bounds.
Sourcepub fn inject_impulse(&mut self, x: usize, y: usize, z: usize, amplitude: f32)
pub fn inject_impulse(&mut self, x: usize, y: usize, z: usize, amplitude: f32)
Inject a pressure impulse at a specific position.
Sourcepub fn inject_impulse_at(&mut self, pos: Position3D, amplitude: f32)
pub fn inject_impulse_at(&mut self, pos: Position3D, amplitude: f32)
Inject a pressure impulse at a 3D position (in meters).
Sourcepub fn inject_spherical_impulse(
&mut self,
center: Position3D,
amplitude: f32,
radius_cells: f32,
)
pub fn inject_spherical_impulse( &mut self, center: Position3D, amplitude: f32, radius_cells: f32, )
Inject a spherical impulse (Gaussian distribution).
Sourcepub fn set_cell_type(
&mut self,
x: usize,
y: usize,
z: usize,
cell_type: CellType,
)
pub fn set_cell_type( &mut self, x: usize, y: usize, z: usize, cell_type: CellType, )
Set cell type at a specific location.
Sourcepub fn create_obstacle(
&mut self,
min: Position3D,
max: Position3D,
cell_type: CellType,
)
pub fn create_obstacle( &mut self, min: Position3D, max: Position3D, cell_type: CellType, )
Create a rectangular obstacle.
Sourcepub fn step_sequential(&mut self)
pub fn step_sequential(&mut self)
Perform one FDTD time step (CPU, sequential).
Sourcepub fn step_parallel(&mut self)
pub fn step_parallel(&mut self)
Perform one FDTD time step (CPU, parallel with Rayon).
Sourcepub fn sample_pressure(&self, pos: Position3D) -> f32
pub fn sample_pressure(&self, pos: Position3D) -> f32
Get pressure value at a specific position (interpolated).
Sourcepub fn get_xy_slice(&self, z: usize) -> Vec<f32>
pub fn get_xy_slice(&self, z: usize) -> Vec<f32>
Get an XY slice of the pressure field at a given Z.
Sourcepub fn get_xz_slice(&self, y: usize) -> Vec<f32>
pub fn get_xz_slice(&self, y: usize) -> Vec<f32>
Get an XZ slice of the pressure field at a given Y.
Sourcepub fn get_yz_slice(&self, x: usize) -> Vec<f32>
pub fn get_yz_slice(&self, x: usize) -> Vec<f32>
Get a YZ slice of the pressure field at a given X.
Sourcepub fn total_energy(&self) -> f32
pub fn total_energy(&self) -> f32
Get the total energy in the simulation.
Sourcepub fn max_pressure(&self) -> f32
pub fn max_pressure(&self) -> f32
Get the maximum absolute pressure.
Sourcepub fn dimensions(&self) -> (usize, usize, usize)
pub fn dimensions(&self) -> (usize, usize, usize)
Get grid dimensions as (width, height, depth).
Sourcepub fn physical_size(&self) -> (f32, f32, f32)
pub fn physical_size(&self) -> (f32, f32, f32)
Get the physical size of the simulation domain in meters.
Trait Implementations§
Source§impl From<&SimulationGrid3D> for GridParams
impl From<&SimulationGrid3D> for GridParams
Source§fn from(grid: &SimulationGrid3D) -> Self
fn from(grid: &SimulationGrid3D) -> Self
Auto Trait Implementations§
impl Freeze for SimulationGrid3D
impl RefUnwindSafe for SimulationGrid3D
impl Send for SimulationGrid3D
impl Sync for SimulationGrid3D
impl Unpin for SimulationGrid3D
impl UnwindSafe for SimulationGrid3D
Blanket Implementations§
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<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> 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> 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 more