Cache the timestep field on the SimState.

This commit is contained in:
2021-06-01 14:09:43 -07:00
parent ffa3f1c94a
commit 81b6e2cb59

View File

@@ -358,6 +358,7 @@ pub struct SimState<M=GenericMaterial> {
scratch: Array3<Cell<M>>,
feature_size: Real,
step_no: u64,
timestep: Real,
}
impl<M> SimState<M> {
@@ -381,6 +382,12 @@ impl<M> SimState<M> {
self.feature_size.into()
}
pub fn timestep(&self) -> Flt {
self.timestep.into()
}
}
impl<M: Default> SimState<M> {
pub fn new(size: Index, feature_size: Flt) -> Self {
// XXX this has to be multiplied by a Courant Number in order to ensure stability.
// For 3d, we need 3 full timesteps in order to communicate information across the corner
// of a grid. The distance traveled during that time is \sqrt{3}. Hence each timestep needs
@@ -388,16 +395,13 @@ impl<M> SimState<M> {
// In 2d, this would be \sqrt{2}/2.
// It's an upper limit though; it should be safe to go lower.
let courant = 0.577;
(self.feature_size / consts::real::C() * courant).into()
}
}
impl<M: Default> SimState<M> {
pub fn new(size: Index, feature_size: Flt) -> Self {
let feature_size = Real::from(feature_size);
let timestep = feature_size / consts::real::C() * courant;
Self {
cells: Array3::default((size.z() as _, size.y() as _, size.x() as _)),
scratch: Array3::default((size.z() as _, size.y() as _, size.x() as _)),
feature_size: feature_size.into(),
feature_size,
timestep,
..Default::default()
}
}
@@ -406,7 +410,7 @@ impl<M: Default> SimState<M> {
impl<M: Material + Clone + Default + Send + Sync + 'static> SimState<M> {
pub fn step(&mut self) {
use consts::real::*;
let time_step = Real::from_inner(self.timestep());
let time_step = self.timestep;
let half_time_step = HALF() * time_step;
let feature_size = self.feature_size;
let inv_feature_size = Real::from_inner(1.0) / feature_size;
@@ -843,7 +847,6 @@ impl<M: Material> Cell<M> {
use consts::real::{HALF, ONE, TWO, ZERO};
// let inv_feature_size = Real::from_inner(1.0) / feature_size;
let twice_delta_t = TWO() * delta_t;
let half_delta_t = HALF() * delta_t;
let b_prev = self.b();