simplify drawing in js and add workbuffers
This commit is contained in:
41
src/lib.rs
41
src/lib.rs
@@ -68,37 +68,46 @@ impl Universe {
|
||||
}
|
||||
}
|
||||
}
|
||||
pub fn advance(&self, fut: &mut Universe, dt: f32) {
|
||||
|
||||
pub fn advance(&self, fut: &mut Universe, dt: f32, work_buffers: Option<WorkBuffers>) {
|
||||
assert_eq!(self.e_x.shape(), fut.e_x.shape());
|
||||
|
||||
let mut y = self.e_x.clone();
|
||||
|
||||
let mut buffers = work_buffers
|
||||
.unwrap_or_else(|| WorkBuffers::new(self.e_x.shape()[1], self.e_x.shape()[0]));
|
||||
|
||||
// y.assign(&self.e_x)
|
||||
let mut k0 = Array2::zeros(self.e_x.dim());
|
||||
let mut k0 = &mut buffers.k1; // Only need k0 for first step in RK
|
||||
k0.fill(0.0);
|
||||
diffx(y.view(), k0.view_mut());
|
||||
diffy(y.view(), k0.view_mut());
|
||||
|
||||
// y.assign(&self.e_x);
|
||||
y.scaled_add(-1.0 / 2.0 * dt, &k0);
|
||||
let mut k1 = Array2::zeros(self.e_x.dim());
|
||||
let mut k1 = buffers.k1;
|
||||
k1.fill(0.0);
|
||||
diffx(y.view(), k1.view_mut());
|
||||
diffy(y.view(), k1.view_mut());
|
||||
|
||||
y.assign(&self.e_x);
|
||||
y.scaled_add(-1.0 / 2.0 * dt, &k1);
|
||||
let mut k2 = Array2::zeros(self.e_x.dim());
|
||||
let mut k2 = buffers.k2;
|
||||
k2.fill(0.0);
|
||||
diffx(y.view(), k2.view_mut());
|
||||
diffy(y.view(), k2.view_mut());
|
||||
|
||||
y.assign(&self.e_x);
|
||||
y.scaled_add(-1.0 / 2.0 * dt, &k2);
|
||||
let mut k3 = Array2::zeros(self.e_x.dim());
|
||||
let mut k3 = buffers.k3;
|
||||
k3.fill(0.0);
|
||||
diffx(y.view(), k3.view_mut());
|
||||
diffy(y.view(), k3.view_mut());
|
||||
|
||||
y.assign(&self.e_x);
|
||||
y.scaled_add(-dt, &k2);
|
||||
let mut k4 = Array2::zeros(self.e_x.dim());
|
||||
let mut k4 = buffers.k4;
|
||||
k4.fill(0.0);
|
||||
diffx(y.view(), k4.view_mut());
|
||||
diffy(y.view(), k4.view_mut());
|
||||
|
||||
@@ -402,3 +411,23 @@ fn upwind4_diss(prev: ArrayView1<f32>, mut fut: ArrayViewMut1<f32>) {
|
||||
+ diag[6] * prev[(2)];
|
||||
fut[(nx - 1)] += diff / dx;
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct WorkBuffers {
|
||||
k1: Array2<f32>,
|
||||
k2: Array2<f32>,
|
||||
k3: Array2<f32>,
|
||||
k4: Array2<f32>,
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
impl WorkBuffers {
|
||||
pub fn new(nx: usize, ny: usize) -> Self {
|
||||
Self {
|
||||
k1: Array2::zeros((ny, nx)),
|
||||
k2: Array2::zeros((ny, nx)),
|
||||
k3: Array2::zeros((ny, nx)),
|
||||
k4: Array2::zeros((ny, nx)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user