SummationByParts/sbp/src/grid.rs

84 lines
2.3 KiB
Rust
Raw Normal View History

use crate::Float;
2019-12-10 21:03:42 +00:00
use ndarray::Array2;
2020-01-28 18:31:14 +00:00
#[derive(Debug, Clone)]
2019-12-10 21:03:42 +00:00
pub struct Grid<SBP>
where
SBP: super::operators::SbpOperator,
{
pub(crate) x: Array2<Float>,
pub(crate) y: Array2<Float>,
2019-12-10 21:03:42 +00:00
pub(crate) detj: Array2<Float>,
pub(crate) detj_dxi_dx: Array2<Float>,
pub(crate) detj_dxi_dy: Array2<Float>,
pub(crate) detj_deta_dx: Array2<Float>,
pub(crate) detj_deta_dy: Array2<Float>,
2019-12-10 21:03:42 +00:00
operator: std::marker::PhantomData<SBP>,
}
impl<SBP: super::operators::SbpOperator> Grid<SBP> {
pub fn new(x: Array2<Float>, y: Array2<Float>) -> Result<Self, ndarray::ShapeError> {
2020-01-25 19:40:55 +00:00
assert_eq!(x.shape(), y.shape());
let ny = x.shape()[0];
let nx = x.shape()[1];
2019-12-10 21:03:42 +00:00
let mut dx_dxi = Array2::zeros((ny, nx));
SBP::diffxi(x.view(), dx_dxi.view_mut());
let mut dx_deta = Array2::zeros((ny, nx));
SBP::diffeta(x.view(), dx_deta.view_mut());
let mut dy_dxi = Array2::zeros((ny, nx));
SBP::diffxi(y.view(), dy_dxi.view_mut());
let mut dy_deta = Array2::zeros((ny, nx));
SBP::diffeta(y.view(), dy_deta.view_mut());
let mut detj = Array2::zeros((ny, nx));
ndarray::azip!((detj in &mut detj,
&dx_dxi in &dx_dxi,
&dx_deta in &dx_deta,
&dy_dxi in &dy_dxi,
&dy_deta in &dy_deta) {
*detj = dx_dxi * dy_deta - dx_deta * dy_dxi;
assert!(*detj > 0.0);
});
let detj_dxi_dx = dy_deta;
let detj_dxi_dy = {
let mut dx_deta = dx_deta;
dx_deta.mapv_inplace(|v| -v);
dx_deta
};
let detj_deta_dx = {
let mut dy_dxi = dy_dxi;
dy_dxi.mapv_inplace(|v| -v);
dy_dxi
};
let detj_deta_dy = dx_dxi;
Ok(Self {
x,
y,
detj,
detj_dxi_dx,
detj_dxi_dy,
detj_deta_dx,
detj_deta_dy,
operator: std::marker::PhantomData,
})
}
2020-01-25 19:40:55 +00:00
pub fn nx(&self) -> usize {
self.x.shape()[1]
}
pub fn ny(&self) -> usize {
self.x.shape()[0]
}
2020-03-31 22:08:55 +00:00
pub fn x(&self) -> ndarray::ArrayView2<Float> {
self.x.view()
}
pub fn y(&self) -> ndarray::ArrayView2<Float> {
self.y.view()
}
2019-12-10 21:03:42 +00:00
}