Apply SAT on boundaries
This commit is contained in:
213
euler/src/lib.rs
213
euler/src/lib.rs
@@ -1002,104 +1002,139 @@ fn vortexify(
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
/// Boundary conditions (SAT)
|
||||
fn SAT_characteristics(
|
||||
pub fn SAT_characteristics(
|
||||
op: &dyn SbpOperator2d,
|
||||
k: &mut Diff,
|
||||
y: &Field,
|
||||
metrics: &Metrics,
|
||||
boundaries: &BoundaryTerms,
|
||||
) {
|
||||
SAT_north(op, k, y, metrics, boundaries.north);
|
||||
SAT_south(op, k, y, metrics, boundaries.south);
|
||||
SAT_east(op, k, y, metrics, boundaries.east);
|
||||
SAT_west(op, k, y, metrics, boundaries.west);
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn SAT_north(
|
||||
op: &dyn SbpOperator2d,
|
||||
k: &mut Diff,
|
||||
y: &Field,
|
||||
metrics: &Metrics,
|
||||
boundary: ArrayView2<Float>,
|
||||
) {
|
||||
let ny = y.ny();
|
||||
|
||||
let hi = if op.is_h2eta() {
|
||||
(ny - 2) as Float / op.heta()[0]
|
||||
} else {
|
||||
(ny - 1) as Float / op.heta()[0]
|
||||
};
|
||||
let sign = -1.0;
|
||||
let tau = 1.0;
|
||||
let slice = s![y.ny() - 1, ..];
|
||||
SAT_characteristic(
|
||||
k.north_mut(),
|
||||
y.north(),
|
||||
boundary,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_deta_dx().slice(slice),
|
||||
metrics.detj_deta_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn SAT_south(
|
||||
op: &dyn SbpOperator2d,
|
||||
k: &mut Diff,
|
||||
y: &Field,
|
||||
metrics: &Metrics,
|
||||
boundary: ArrayView2<Float>,
|
||||
) {
|
||||
let ny = y.ny();
|
||||
let hi = if op.is_h2eta() {
|
||||
(ny - 2) as Float / op.heta()[0]
|
||||
} else {
|
||||
(ny - 1) as Float / op.heta()[0]
|
||||
};
|
||||
let sign = 1.0;
|
||||
let tau = -1.0;
|
||||
let slice = s![0, ..];
|
||||
SAT_characteristic(
|
||||
k.south_mut(),
|
||||
y.south(),
|
||||
boundary,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_deta_dx().slice(slice),
|
||||
metrics.detj_deta_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn SAT_west(
|
||||
op: &dyn SbpOperator2d,
|
||||
k: &mut Diff,
|
||||
y: &Field,
|
||||
metrics: &Metrics,
|
||||
boundary: ArrayView2<Float>,
|
||||
) {
|
||||
let nx = y.nx();
|
||||
|
||||
// North boundary
|
||||
{
|
||||
let hi = if op.is_h2eta() {
|
||||
(ny - 2) as Float / op.heta()[0]
|
||||
} else {
|
||||
(ny - 1) as Float / op.heta()[0]
|
||||
};
|
||||
let sign = -1.0;
|
||||
let tau = 1.0;
|
||||
let slice = s![y.ny() - 1, ..];
|
||||
SAT_characteristic(
|
||||
k.north_mut(),
|
||||
y.north(),
|
||||
boundaries.north,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_deta_dx().slice(slice),
|
||||
metrics.detj_deta_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
// South boundary
|
||||
{
|
||||
let hi = if op.is_h2eta() {
|
||||
(ny - 2) as Float / op.heta()[0]
|
||||
} else {
|
||||
(ny - 1) as Float / op.heta()[0]
|
||||
};
|
||||
let sign = 1.0;
|
||||
let tau = -1.0;
|
||||
let slice = s![0, ..];
|
||||
SAT_characteristic(
|
||||
k.south_mut(),
|
||||
y.south(),
|
||||
boundaries.south,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_deta_dx().slice(slice),
|
||||
metrics.detj_deta_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
// West Boundary
|
||||
{
|
||||
let hi = if op.is_h2xi() {
|
||||
(nx - 2) as Float / op.hxi()[0]
|
||||
} else {
|
||||
(nx - 1) as Float / op.hxi()[0]
|
||||
};
|
||||
let sign = 1.0;
|
||||
let tau = -1.0;
|
||||
let slice = s![.., 0];
|
||||
SAT_characteristic(
|
||||
k.west_mut(),
|
||||
y.west(),
|
||||
boundaries.west,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_dxi_dx().slice(slice),
|
||||
metrics.detj_dxi_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
// East Boundary
|
||||
{
|
||||
let hi = if op.is_h2xi() {
|
||||
(nx - 2) as Float / op.hxi()[0]
|
||||
} else {
|
||||
(nx - 1) as Float / op.hxi()[0]
|
||||
};
|
||||
let sign = -1.0;
|
||||
let tau = 1.0;
|
||||
let slice = s![.., y.nx() - 1];
|
||||
SAT_characteristic(
|
||||
k.east_mut(),
|
||||
y.east(),
|
||||
boundaries.east,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_dxi_dx().slice(slice),
|
||||
metrics.detj_dxi_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
let hi = if op.is_h2xi() {
|
||||
(nx - 2) as Float / op.hxi()[0]
|
||||
} else {
|
||||
(nx - 1) as Float / op.hxi()[0]
|
||||
};
|
||||
let sign = 1.0;
|
||||
let tau = -1.0;
|
||||
let slice = s![.., 0];
|
||||
SAT_characteristic(
|
||||
k.west_mut(),
|
||||
y.west(),
|
||||
boundary,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_dxi_dx().slice(slice),
|
||||
metrics.detj_dxi_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn SAT_east(
|
||||
op: &dyn SbpOperator2d,
|
||||
k: &mut Diff,
|
||||
y: &Field,
|
||||
metrics: &Metrics,
|
||||
boundary: ArrayView2<Float>,
|
||||
) {
|
||||
let nx = y.nx();
|
||||
let hi = if op.is_h2xi() {
|
||||
(nx - 2) as Float / op.hxi()[0]
|
||||
} else {
|
||||
(nx - 1) as Float / op.hxi()[0]
|
||||
};
|
||||
let sign = -1.0;
|
||||
let tau = 1.0;
|
||||
let slice = s![.., y.nx() - 1];
|
||||
SAT_characteristic(
|
||||
k.east_mut(),
|
||||
y.east(),
|
||||
boundary,
|
||||
hi,
|
||||
sign,
|
||||
tau,
|
||||
metrics.detj().slice(slice),
|
||||
metrics.detj_dxi_dx().slice(slice),
|
||||
metrics.detj_dxi_dy().slice(slice),
|
||||
);
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
|
||||
Reference in New Issue
Block a user