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:
parent
297e295532
commit
ed0f0e4a20
|
@ -0,0 +1,48 @@
|
||||||
|
{
|
||||||
|
"grids": {
|
||||||
|
"default": {
|
||||||
|
"operators": {
|
||||||
|
"xi": "upwind9",
|
||||||
|
"eta": "upwind9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"grid0": {
|
||||||
|
"x": "linspace:-5:5:101",
|
||||||
|
"y": "linspace:0:5:50",
|
||||||
|
"boundary_conditions": {
|
||||||
|
"south": "multi:grid1(0,61):grid2(0,41)",
|
||||||
|
"north": "vortex",
|
||||||
|
"east": "vortex",
|
||||||
|
"west": "vortex"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"grid1": {
|
||||||
|
"x": "linspace:-5:1:61",
|
||||||
|
"y": "linspace:-5:0:50",
|
||||||
|
"boundary_conditions": {
|
||||||
|
"south": "vortex",
|
||||||
|
"north": "multi:grid0(0,61)",
|
||||||
|
"east": "grid2",
|
||||||
|
"west": "vortex"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"grid2": {
|
||||||
|
"x": "linspace:1:5:41",
|
||||||
|
"y": "linspace:-5:0:50",
|
||||||
|
"boundary_conditions": {
|
||||||
|
"south": "vortex",
|
||||||
|
"north": "multi:grid0(60,101)",
|
||||||
|
"east": "vortex",
|
||||||
|
"west": "grid1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"integration_time": 2.0,
|
||||||
|
"vortex": {
|
||||||
|
"x0": 0.0,
|
||||||
|
"y0": 0.0,
|
||||||
|
"mach": 0.5,
|
||||||
|
"rstar": 0.5,
|
||||||
|
"eps": 1.0
|
||||||
|
}
|
||||||
|
}
|
|
@ -143,6 +143,27 @@ pub fn json_to_grids(
|
||||||
names.iter().position(|other| other == grid).unwrap(),
|
names.iter().position(|other| other == grid).unwrap(),
|
||||||
int_op,
|
int_op,
|
||||||
)
|
)
|
||||||
|
} else if let Some(multigrid) = dir.strip_prefix("multi:") {
|
||||||
|
let grids = multigrid.split(":");
|
||||||
|
sbp::euler::BoundaryCharacteristic::MultiGrid(
|
||||||
|
grids
|
||||||
|
.map(|g| {
|
||||||
|
let rparen = g.find('(').unwrap();
|
||||||
|
let gridname = &g[..rparen];
|
||||||
|
|
||||||
|
let gridnumber =
|
||||||
|
names.iter().position(|other| other == gridname).unwrap();
|
||||||
|
|
||||||
|
let paren = &g[rparen + 1..];
|
||||||
|
let paren = &paren[..paren.len() - 1];
|
||||||
|
let mut pareni = paren.split(',');
|
||||||
|
let start = pareni.next().unwrap().parse::<usize>().unwrap();
|
||||||
|
let end = pareni.next().unwrap().parse::<usize>().unwrap();
|
||||||
|
|
||||||
|
(gridnumber, start, end)
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
sbp::euler::BoundaryCharacteristic::Grid(
|
sbp::euler::BoundaryCharacteristic::Grid(
|
||||||
names.iter().position(|other| other == dir).unwrap(),
|
names.iter().position(|other| other == dir).unwrap(),
|
||||||
|
|
117
sbp/src/euler.rs
117
sbp/src/euler.rs
|
@ -614,6 +614,7 @@ pub enum BoundaryCharacteristic {
|
||||||
Vortex(VortexParameters),
|
Vortex(VortexParameters),
|
||||||
// Vortices(Vec<VortexParameters>),
|
// Vortices(Vec<VortexParameters>),
|
||||||
Interpolate(usize, Box<dyn InterpolationOperator>),
|
Interpolate(usize, Box<dyn InterpolationOperator>),
|
||||||
|
MultiGrid(Vec<(usize, usize, usize)>),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type BoundaryTerms<'a> = Direction<ArrayView2<'a, Float>>;
|
pub type BoundaryTerms<'a> = Direction<ArrayView2<'a, Float>>;
|
||||||
|
@ -628,30 +629,30 @@ fn boundary_extractor<'a>(
|
||||||
north: match bc.north {
|
north: match bc.north {
|
||||||
BoundaryCharacteristic::This => field.south(),
|
BoundaryCharacteristic::This => field.south(),
|
||||||
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
||||||
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Grid(_)
|
||||||
panic!("Only working on self grid")
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
}
|
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
|
||||||
},
|
},
|
||||||
south: match bc.south {
|
south: match bc.south {
|
||||||
BoundaryCharacteristic::This => field.north(),
|
BoundaryCharacteristic::This => field.north(),
|
||||||
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
||||||
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Grid(_)
|
||||||
panic!("Only working on self grid")
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
}
|
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
|
||||||
},
|
},
|
||||||
west: match bc.west {
|
west: match bc.west {
|
||||||
BoundaryCharacteristic::This => field.east(),
|
BoundaryCharacteristic::This => field.east(),
|
||||||
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
||||||
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Grid(_)
|
||||||
panic!("Only working on self grid")
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
}
|
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
|
||||||
},
|
},
|
||||||
east: match bc.east {
|
east: match bc.east {
|
||||||
BoundaryCharacteristic::This => field.west(),
|
BoundaryCharacteristic::This => field.west(),
|
||||||
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
BoundaryCharacteristic::Vortex(_params) => todo!(),
|
||||||
BoundaryCharacteristic::Grid(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Grid(_)
|
||||||
panic!("Only working on self grid")
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
}
|
| BoundaryCharacteristic::MultiGrid(_) => panic!("Only working on self grid"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -689,6 +690,25 @@ pub fn extract_boundaries<'a>(
|
||||||
}
|
}
|
||||||
to.view()
|
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 {
|
south: match &bt.south {
|
||||||
BoundaryCharacteristic::This => field.north(),
|
BoundaryCharacteristic::This => field.north(),
|
||||||
|
@ -711,6 +731,25 @@ pub fn extract_boundaries<'a>(
|
||||||
}
|
}
|
||||||
to.view()
|
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 {
|
west: match &bt.west {
|
||||||
BoundaryCharacteristic::This => field.east(),
|
BoundaryCharacteristic::This => field.east(),
|
||||||
|
@ -733,6 +772,25 @@ pub fn extract_boundaries<'a>(
|
||||||
}
|
}
|
||||||
to.view()
|
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 {
|
east: match &bt.east {
|
||||||
BoundaryCharacteristic::This => field.west(),
|
BoundaryCharacteristic::This => field.west(),
|
||||||
|
@ -755,6 +813,25 @@ pub fn extract_boundaries<'a>(
|
||||||
}
|
}
|
||||||
to.view()
|
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()
|
.collect()
|
||||||
|
@ -767,25 +844,33 @@ impl BoundaryStorage {
|
||||||
pub fn new(bt: &BoundaryCharacteristics, grid: &Grid) -> Self {
|
pub fn new(bt: &BoundaryCharacteristics, grid: &Grid) -> Self {
|
||||||
Self {
|
Self {
|
||||||
north: match bt.north {
|
north: match bt.north {
|
||||||
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Vortex(_)
|
||||||
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
|
| BoundaryCharacteristic::MultiGrid(_) => {
|
||||||
Some(ndarray::Array2::zeros((4, grid.nx())))
|
Some(ndarray::Array2::zeros((4, grid.nx())))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
},
|
},
|
||||||
south: match bt.south {
|
south: match bt.south {
|
||||||
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Vortex(_)
|
||||||
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
|
| BoundaryCharacteristic::MultiGrid(_) => {
|
||||||
Some(ndarray::Array2::zeros((4, grid.nx())))
|
Some(ndarray::Array2::zeros((4, grid.nx())))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
},
|
},
|
||||||
east: match bt.east {
|
east: match bt.east {
|
||||||
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Vortex(_)
|
||||||
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
|
| BoundaryCharacteristic::MultiGrid(_) => {
|
||||||
Some(ndarray::Array2::zeros((4, grid.ny())))
|
Some(ndarray::Array2::zeros((4, grid.ny())))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
},
|
},
|
||||||
west: match bt.west {
|
west: match bt.west {
|
||||||
BoundaryCharacteristic::Vortex(_) | BoundaryCharacteristic::Interpolate(_, _) => {
|
BoundaryCharacteristic::Vortex(_)
|
||||||
|
| BoundaryCharacteristic::Interpolate(_, _)
|
||||||
|
| BoundaryCharacteristic::MultiGrid(_) => {
|
||||||
Some(ndarray::Array2::zeros((4, grid.ny())))
|
Some(ndarray::Array2::zeros((4, grid.ny())))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
|
|
Loading…
Reference in New Issue