From e957a4fff78a31979a7e75c6f66a2624aace0fd5 Mon Sep 17 00:00:00 2001 From: Magnus Ulimoen Date: Wed, 29 Jan 2020 20:50:56 +0100 Subject: [PATCH] move integrator to module --- src/euler.rs | 46 ++-------------------------------------------- src/integrate.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 3 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 src/integrate.rs diff --git a/src/euler.rs b/src/euler.rs index 02e3f05..876a479 100644 --- a/src/euler.rs +++ b/src/euler.rs @@ -1,7 +1,8 @@ +use super::integrate::integrate_rk4; use super::operators::{SbpOperator, UpwindOperator}; use super::Grid; +use ndarray::azip; use ndarray::prelude::*; -use ndarray::{azip, Zip}; pub const GAMMA: f32 = 1.4; @@ -224,49 +225,6 @@ impl Field { } } -pub(crate) fn integrate_rk4<'a, F: 'a, SBP, RHS, WB>( - rhs: RHS, - prev: &F, - fut: &mut F, - dt: f32, - grid: &Grid, - k: &mut [F; 4], - mut wb: &mut WB, -) where - F: std::ops::Deref> + std::ops::DerefMut>, - SBP: SbpOperator, - RHS: Fn(&mut F, &F, &Grid, &mut WB), -{ - assert_eq!(prev.shape(), fut.shape()); - - for i in 0..4 { - // y = y0 + c*kn - fut.assign(prev); - match i { - 0 => {} - 1 | 2 => { - fut.scaled_add(1.0 / 2.0 * dt, &k[i - 1]); - } - 3 => { - fut.scaled_add(dt, &k[i - 1]); - } - _ => { - unreachable!(); - } - }; - - rhs(&mut k[i], &fut, grid, &mut wb); - } - - Zip::from(&mut **fut) - .and(&**prev) - .and(&*k[0]) - .and(&*k[1]) - .and(&*k[2]) - .and(&*k[3]) - .apply(|y1, &y0, &k1, &k2, &k3, &k4| *y1 = y0 + dt / 6.0 * (k1 + 2.0 * k2 + 2.0 * k3 + k4)); -} - fn pressure(gamma: f32, rho: f32, rhou: f32, rhov: f32, e: f32) -> f32 { (gamma - 1.0) * (e - (rhou * rhou + rhov * rhov) / (2.0 * rho)) } diff --git a/src/integrate.rs b/src/integrate.rs new file mode 100644 index 0000000..57f26e4 --- /dev/null +++ b/src/integrate.rs @@ -0,0 +1,46 @@ +use super::grid::Grid; +use super::operators::SbpOperator; +use ndarray::{Array3, Zip}; + +pub(crate) fn integrate_rk4<'a, F: 'a, SBP, RHS, WB>( + rhs: RHS, + prev: &F, + fut: &mut F, + dt: f32, + grid: &Grid, + k: &mut [F; 4], + mut wb: &mut WB, +) where + F: std::ops::Deref> + std::ops::DerefMut>, + SBP: SbpOperator, + RHS: Fn(&mut F, &F, &Grid, &mut WB), +{ + assert_eq!(prev.shape(), fut.shape()); + + for i in 0..4 { + // y = y0 + c*kn + fut.assign(prev); + match i { + 0 => {} + 1 | 2 => { + fut.scaled_add(1.0 / 2.0 * dt, &k[i - 1]); + } + 3 => { + fut.scaled_add(dt, &k[i - 1]); + } + _ => { + unreachable!(); + } + }; + + rhs(&mut k[i], &fut, grid, &mut wb); + } + + Zip::from(&mut **fut) + .and(&**prev) + .and(&*k[0]) + .and(&*k[1]) + .and(&*k[2]) + .and(&*k[3]) + .apply(|y1, &y0, &k1, &k2, &k3, &k4| *y1 = y0 + dt / 6.0 * (k1 + 2.0 * k2 + 2.0 * k3 + k4)); +} diff --git a/src/lib.rs b/src/lib.rs index 0a0b710..a8c70a0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ use wasm_bindgen::prelude::*; pub mod euler; mod grid; +pub(crate) mod integrate; mod maxwell; pub mod operators; pub use crate::maxwell::{Field, WorkBuffers};