change json format
This commit is contained in:
		@@ -597,13 +597,12 @@ fn fluxes(k: (&mut Field, &mut Field), y: &Field, metrics: &Metrics) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
pub enum BoundaryCharacteristic {
 | 
			
		||||
    This,
 | 
			
		||||
    Grid(usize),
 | 
			
		||||
    Vortex(VortexParameters),
 | 
			
		||||
    // Vortices(Vec<VortexParameters>),
 | 
			
		||||
    Interpolate(usize),
 | 
			
		||||
    Interpolate(usize, Box<dyn InterpolationOperator>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub type BoundaryTerms<'a> = Direction<ArrayView2<'a, Float>>;
 | 
			
		||||
@@ -618,68 +617,59 @@ fn boundary_extractor<'a>(
 | 
			
		||||
        north: match bc.north {
 | 
			
		||||
            BoundaryCharacteristic::This => field.south(),
 | 
			
		||||
            BoundaryCharacteristic::Vortex(_params) => todo!(),
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                panic!("Only working on self grid")
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        south: match bc.south {
 | 
			
		||||
            BoundaryCharacteristic::This => field.north(),
 | 
			
		||||
            BoundaryCharacteristic::Vortex(_params) => todo!(),
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                panic!("Only working on self grid")
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        west: match bc.west {
 | 
			
		||||
            BoundaryCharacteristic::This => field.east(),
 | 
			
		||||
            BoundaryCharacteristic::Vortex(_params) => todo!(),
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                panic!("Only working on self grid")
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        east: match bc.east {
 | 
			
		||||
            BoundaryCharacteristic::This => field.west(),
 | 
			
		||||
            BoundaryCharacteristic::Vortex(_params) => todo!(),
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
            BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                panic!("Only working on self grid")
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub type InterpolationOperators = Direction<Option<Box<dyn InterpolationOperator>>>;
 | 
			
		||||
 | 
			
		||||
pub fn extract_boundaries<'a>(
 | 
			
		||||
    fields: &'a [Field],
 | 
			
		||||
    bt: &[BoundaryCharacteristics],
 | 
			
		||||
    eb: &'a mut [BoundaryStorage],
 | 
			
		||||
    grids: &[Grid],
 | 
			
		||||
    time: Float,
 | 
			
		||||
    interpolation_operators: Option<&[InterpolationOperators]>,
 | 
			
		||||
) -> Vec<BoundaryTerms<'a>> {
 | 
			
		||||
    bt.iter()
 | 
			
		||||
        .zip(eb)
 | 
			
		||||
        .zip(grids)
 | 
			
		||||
        .zip(fields)
 | 
			
		||||
        .enumerate()
 | 
			
		||||
        .map(|(ig, (((bt, eb), grid), field))| BoundaryTerms {
 | 
			
		||||
            north: match bt.north {
 | 
			
		||||
        .map(|(((bt, eb), grid), field)| BoundaryTerms {
 | 
			
		||||
            north: match &bt.north {
 | 
			
		||||
                BoundaryCharacteristic::This => field.south(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[g].south(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[*g].south(),
 | 
			
		||||
                BoundaryCharacteristic::Vortex(v) => {
 | 
			
		||||
                    let field = eb.north.as_mut().unwrap();
 | 
			
		||||
                    vortexify(field.view_mut(), grid.north(), v, time);
 | 
			
		||||
                    vortexify(field.view_mut(), grid.north(), *v, time);
 | 
			
		||||
                    field.view()
 | 
			
		||||
                }
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g) => {
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g, operator) => {
 | 
			
		||||
                    let to = eb.north.as_mut().unwrap();
 | 
			
		||||
                    let fine2coarse = field.nx() < fields[g].nx();
 | 
			
		||||
                    let fine2coarse = field.nx() < fields[*g].nx();
 | 
			
		||||
 | 
			
		||||
                    let operator = interpolation_operators.as_ref().unwrap()[ig]
 | 
			
		||||
                        .north
 | 
			
		||||
                        .as_ref()
 | 
			
		||||
                        .unwrap();
 | 
			
		||||
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[g].south().outer_iter()) {
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[*g].south().outer_iter()) {
 | 
			
		||||
                        if fine2coarse {
 | 
			
		||||
                            operator.fine2coarse(from.view(), to.view_mut());
 | 
			
		||||
                        } else {
 | 
			
		||||
@@ -689,23 +679,19 @@ pub fn extract_boundaries<'a>(
 | 
			
		||||
                    to.view()
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            south: match bt.south {
 | 
			
		||||
            south: match &bt.south {
 | 
			
		||||
                BoundaryCharacteristic::This => field.north(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[g].north(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[*g].north(),
 | 
			
		||||
                BoundaryCharacteristic::Vortex(v) => {
 | 
			
		||||
                    let field = eb.south.as_mut().unwrap();
 | 
			
		||||
                    vortexify(field.view_mut(), grid.south(), v, time);
 | 
			
		||||
                    vortexify(field.view_mut(), grid.south(), *v, time);
 | 
			
		||||
                    field.view()
 | 
			
		||||
                }
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g) => {
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g, operator) => {
 | 
			
		||||
                    let to = eb.south.as_mut().unwrap();
 | 
			
		||||
                    let fine2coarse = field.nx() < fields[g].nx();
 | 
			
		||||
                    let operator = interpolation_operators.as_ref().unwrap()[ig]
 | 
			
		||||
                        .south
 | 
			
		||||
                        .as_ref()
 | 
			
		||||
                        .unwrap();
 | 
			
		||||
                    let fine2coarse = field.nx() < fields[*g].nx();
 | 
			
		||||
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[g].north().outer_iter()) {
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[*g].north().outer_iter()) {
 | 
			
		||||
                        if fine2coarse {
 | 
			
		||||
                            operator.fine2coarse(from.view(), to.view_mut());
 | 
			
		||||
                        } else {
 | 
			
		||||
@@ -715,23 +701,19 @@ pub fn extract_boundaries<'a>(
 | 
			
		||||
                    to.view()
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            west: match bt.west {
 | 
			
		||||
            west: match &bt.west {
 | 
			
		||||
                BoundaryCharacteristic::This => field.east(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[g].east(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[*g].east(),
 | 
			
		||||
                BoundaryCharacteristic::Vortex(v) => {
 | 
			
		||||
                    let field = eb.west.as_mut().unwrap();
 | 
			
		||||
                    vortexify(field.view_mut(), grid.west(), v, time);
 | 
			
		||||
                    vortexify(field.view_mut(), grid.west(), *v, time);
 | 
			
		||||
                    field.view()
 | 
			
		||||
                }
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g) => {
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g, operator) => {
 | 
			
		||||
                    let to = eb.west.as_mut().unwrap();
 | 
			
		||||
                    let fine2coarse = field.ny() < fields[g].ny();
 | 
			
		||||
                    let operator = interpolation_operators.as_ref().unwrap()[ig]
 | 
			
		||||
                        .west
 | 
			
		||||
                        .as_ref()
 | 
			
		||||
                        .unwrap();
 | 
			
		||||
                    let fine2coarse = field.ny() < fields[*g].ny();
 | 
			
		||||
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[g].east().outer_iter()) {
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[*g].east().outer_iter()) {
 | 
			
		||||
                        if fine2coarse {
 | 
			
		||||
                            operator.fine2coarse(from.view(), to.view_mut());
 | 
			
		||||
                        } else {
 | 
			
		||||
@@ -741,23 +723,19 @@ pub fn extract_boundaries<'a>(
 | 
			
		||||
                    to.view()
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            east: match bt.east {
 | 
			
		||||
            east: match &bt.east {
 | 
			
		||||
                BoundaryCharacteristic::This => field.west(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[g].west(),
 | 
			
		||||
                BoundaryCharacteristic::Grid(g) => fields[*g].west(),
 | 
			
		||||
                BoundaryCharacteristic::Vortex(v) => {
 | 
			
		||||
                    let field = eb.east.as_mut().unwrap();
 | 
			
		||||
                    vortexify(field.view_mut(), grid.east(), v, time);
 | 
			
		||||
                    vortexify(field.view_mut(), grid.east(), *v, time);
 | 
			
		||||
                    field.view()
 | 
			
		||||
                }
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g) => {
 | 
			
		||||
                BoundaryCharacteristic::Interpolate(g, operator) => {
 | 
			
		||||
                    let to = eb.east.as_mut().unwrap();
 | 
			
		||||
                    let fine2coarse = field.ny() < fields[g].ny();
 | 
			
		||||
                    let operator = interpolation_operators.as_ref().unwrap()[ig]
 | 
			
		||||
                        .east
 | 
			
		||||
                        .as_ref()
 | 
			
		||||
                        .unwrap();
 | 
			
		||||
                    let fine2coarse = field.ny() < fields[*g].ny();
 | 
			
		||||
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[g].west().outer_iter()) {
 | 
			
		||||
                    for (mut to, from) in to.outer_iter_mut().zip(fields[*g].west().outer_iter()) {
 | 
			
		||||
                        if fine2coarse {
 | 
			
		||||
                            operator.fine2coarse(from.view(), to.view_mut());
 | 
			
		||||
                        } else {
 | 
			
		||||
@@ -778,25 +756,25 @@ impl BoundaryStorage {
 | 
			
		||||
    pub fn new(bt: &BoundaryCharacteristics, grid: &Grid) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            north: match bt.north {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                    Some(ndarray::Array2::zeros((4, grid.nx())))
 | 
			
		||||
                }
 | 
			
		||||
                _ => None,
 | 
			
		||||
            },
 | 
			
		||||
            south: match bt.south {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                    Some(ndarray::Array2::zeros((4, grid.nx())))
 | 
			
		||||
                }
 | 
			
		||||
                _ => None,
 | 
			
		||||
            },
 | 
			
		||||
            east: match bt.east {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                    Some(ndarray::Array2::zeros((4, grid.ny())))
 | 
			
		||||
                }
 | 
			
		||||
                _ => None,
 | 
			
		||||
            },
 | 
			
		||||
            west: match bt.west {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_) => {
 | 
			
		||||
                BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
 | 
			
		||||
                    Some(ndarray::Array2::zeros((4, grid.ny())))
 | 
			
		||||
                }
 | 
			
		||||
                _ => None,
 | 
			
		||||
 
 | 
			
		||||
@@ -185,7 +185,7 @@ mod traditional8;
 | 
			
		||||
pub use traditional8::SBP8;
 | 
			
		||||
 | 
			
		||||
mod interpolation;
 | 
			
		||||
pub use interpolation::Interpolation4;
 | 
			
		||||
pub use interpolation::{Interpolation4, Interpolation8, Interpolation9, Interpolation9h2};
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
pub(crate) mod testing {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,32 @@
 | 
			
		||||
use crate::Float;
 | 
			
		||||
 | 
			
		||||
pub struct Direction<T> {
 | 
			
		||||
    pub north: T,
 | 
			
		||||
    pub south: T,
 | 
			
		||||
    pub west: T,
 | 
			
		||||
    pub east: T,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn h2linspace(start: Float, end: Float, n: usize) -> ndarray::Array1<Float> {
 | 
			
		||||
    let h = (end - start) / (n - 2) as Float;
 | 
			
		||||
    ndarray::Array1::from_shape_fn(n, |i| match i {
 | 
			
		||||
        0 => start,
 | 
			
		||||
        i if i == n - 1 => end,
 | 
			
		||||
        i => start + h * (i as Float - 0.5),
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn test_h2linspace() {
 | 
			
		||||
    let x = h2linspace(-1.0, 1.0, 50);
 | 
			
		||||
    println!("{}", x);
 | 
			
		||||
    approx::assert_abs_diff_eq!(x[0], -1.0, epsilon = 1e-6);
 | 
			
		||||
    approx::assert_abs_diff_eq!(x[49], 1.0, epsilon = 1e-6);
 | 
			
		||||
    let hend = x[1] - x[0];
 | 
			
		||||
    let h = x[2] - x[1];
 | 
			
		||||
    approx::assert_abs_diff_eq!(x[49] - x[48], hend, epsilon = 1e-6);
 | 
			
		||||
    approx::assert_abs_diff_eq!(2.0 * hend, h, epsilon = 1e-6);
 | 
			
		||||
    for i in 1..48 {
 | 
			
		||||
        approx::assert_abs_diff_eq!(x[i + 1] - x[i], h, epsilon = 1e-6);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user