add tsection type interfaces

This interface combines grids which do not have clean interfaces.

The type of interface has not been tested or verified here.
This commit is contained in:
Magnus Ulimoen
2020-04-19 18:49:43 +02:00
parent 297e295532
commit ed0f0e4a20
3 changed files with 170 additions and 16 deletions

View File

@@ -614,6 +614,7 @@ pub enum BoundaryCharacteristic {
Vortex(VortexParameters),
// Vortices(Vec<VortexParameters>),
Interpolate(usize, Box<dyn InterpolationOperator>),
MultiGrid(Vec<(usize, usize, usize)>),
}
pub type BoundaryTerms<'a> = Direction<ArrayView2<'a, Float>>;
@@ -628,30 +629,30 @@ fn boundary_extractor<'a>(
north: match bc.north {
BoundaryCharacteristic::This => field.south(),
BoundaryCharacteristic::Vortex(_params) => todo!(),
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
panic!("Only working on self grid")
}
BoundaryCharacteristic::Grid(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
},
south: match bc.south {
BoundaryCharacteristic::This => field.north(),
BoundaryCharacteristic::Vortex(_params) => todo!(),
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
panic!("Only working on self grid")
}
BoundaryCharacteristic::Grid(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
},
west: match bc.west {
BoundaryCharacteristic::This => field.east(),
BoundaryCharacteristic::Vortex(_params) => todo!(),
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
panic!("Only working on self grid")
}
BoundaryCharacteristic::Grid(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
},
east: match bc.east {
BoundaryCharacteristic::This => field.west(),
BoundaryCharacteristic::Vortex(_params) => todo!(),
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
panic!("Only working on self grid")
}
BoundaryCharacteristic::Grid(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
},
}
}
@@ -689,6 +690,25 @@ pub fn extract_boundaries<'a>(
}
to.view()
}
BoundaryCharacteristic::MultiGrid(grids) => {
let to = eb.north.as_mut().unwrap();
let mut i = 0;
let mut remaining = grids.len();
for &(g, start, end) in grids.iter() {
let n: usize = end - start;
to.slice_mut(s![.., i..i + n])
.assign(&fields[g].south().slice(s![.., start..end]));
remaining -= 1;
if remaining != 0 {
to.slice_mut(s![.., i]).iter_mut().for_each(|x| *x /= 2.0);
i += n - 1;
} else {
i += n;
assert_eq!(i, to.len_of(Axis(1)));
}
}
to.view()
}
},
south: match &bt.south {
BoundaryCharacteristic::This => field.north(),
@@ -711,6 +731,25 @@ pub fn extract_boundaries<'a>(
}
to.view()
}
BoundaryCharacteristic::MultiGrid(grids) => {
let to = eb.south.as_mut().unwrap();
let mut i = 0;
let mut remaining = grids.len();
for &(g, start, end) in grids.iter() {
let n: usize = end - start;
to.slice_mut(s![.., i..i + n])
.assign(&fields[g].north().slice(s![.., start..end]));
remaining -= 1;
if remaining != 0 {
to.slice_mut(s![.., i]).iter_mut().for_each(|x| *x /= 2.0);
i += n - 1;
} else {
i += n;
assert_eq!(i, to.len_of(Axis(1)));
}
}
to.view()
}
},
west: match &bt.west {
BoundaryCharacteristic::This => field.east(),
@@ -733,6 +772,25 @@ pub fn extract_boundaries<'a>(
}
to.view()
}
BoundaryCharacteristic::MultiGrid(grids) => {
let to = eb.west.as_mut().unwrap();
let mut i = 0;
let mut remaining = grids.len();
for &(g, start, end) in grids.iter() {
let n: usize = end - start;
to.slice_mut(s![.., i..i + n])
.assign(&fields[g].east().slice(s![.., start..end]));
remaining -= 1;
if remaining != 0 {
to.slice_mut(s![.., i]).iter_mut().for_each(|x| *x /= 2.0);
i += n - 1;
} else {
i += n;
assert_eq!(i, to.len_of(Axis(1)));
}
}
to.view()
}
},
east: match &bt.east {
BoundaryCharacteristic::This => field.west(),
@@ -755,6 +813,25 @@ pub fn extract_boundaries<'a>(
}
to.view()
}
BoundaryCharacteristic::MultiGrid(grids) => {
let to = eb.east.as_mut().unwrap();
let mut i = 0;
let mut remaining = grids.len();
for &(g, start, end) in grids.iter() {
let n: usize = end - start;
to.slice_mut(s![.., i..i + n])
.assign(&fields[g].west().slice(s![.., start..end]));
remaining -= 1;
if remaining != 0 {
to.slice_mut(s![.., i]).iter_mut().for_each(|x| *x /= 2.0);
i += n - 1;
} else {
i += n;
assert_eq!(i, to.len_of(Axis(1)));
}
}
to.view()
}
},
})
.collect()
@@ -767,25 +844,33 @@ impl BoundaryStorage {
pub fn new(bt: &BoundaryCharacteristics, grid: &Grid) -> Self {
Self {
north: match bt.north {
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
BoundaryCharacteristic::Vortex(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => {
Some(ndarray::Array2::zeros((4, grid.nx())))
}
_ => None,
},
south: match bt.south {
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
BoundaryCharacteristic::Vortex(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => {
Some(ndarray::Array2::zeros((4, grid.nx())))
}
_ => None,
},
east: match bt.east {
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
BoundaryCharacteristic::Vortex(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => {
Some(ndarray::Array2::zeros((4, grid.ny())))
}
_ => None,
},
west: match bt.west {
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
BoundaryCharacteristic::Vortex(_)
| BoundaryCharacteristic::Interpolate(_, _)
| BoundaryCharacteristic::MultiGrid(_) => {
Some(ndarray::Array2::zeros((4, grid.ny())))
}
_ => None,