add h2 error function
This commit is contained in:
parent
50d58dc7e8
commit
29627b32c5
|
@ -256,6 +256,66 @@ impl Field {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Field {
|
||||||
|
fn err_diff<SBP: SbpOperator>(&self, other: &Self) -> f32 {
|
||||||
|
assert_eq!(self.nx(), other.nx());
|
||||||
|
assert_eq!(self.ny(), other.ny());
|
||||||
|
|
||||||
|
let h = SBP::h();
|
||||||
|
|
||||||
|
// Resulting structure should be
|
||||||
|
// serialized(F0 - F1)^T (Hx kron Hy) serialized(F0 - F1)
|
||||||
|
//
|
||||||
|
// We accomplish this by serializing along x as fastest dimension
|
||||||
|
// Since h is diagonal, it can be iterated with the following iterators
|
||||||
|
|
||||||
|
// This chains the h block into the form [h, 1, 1, 1, rev(h)],
|
||||||
|
// and multiplies with a factor
|
||||||
|
let itermaker = move |n: usize, factor: f32| {
|
||||||
|
h.iter()
|
||||||
|
.copied()
|
||||||
|
.chain(std::iter::repeat(1.0).take(n - 2 * h.len()))
|
||||||
|
.chain(h.iter().copied().rev())
|
||||||
|
.map(move |x| x * factor)
|
||||||
|
};
|
||||||
|
|
||||||
|
let hxiterator = itermaker(self.nx(), 1.0 / (self.nx() - 1) as f32);
|
||||||
|
// Repeating to get the form
|
||||||
|
// [[hx0, hx1, ..., hxn], [hx0, hx1, ..., hxn], ..., [hx0, hx1, ..., hxn]]
|
||||||
|
let hxiterator = hxiterator.into_iter().cycle().take(self.nx() * self.ny());
|
||||||
|
|
||||||
|
let hyiterator = itermaker(self.ny(), 1.0 / (self.ny() - 1) as f32);
|
||||||
|
// Repeating to get the form
|
||||||
|
// [[hy0, hy0, ..., hy0], [hy1, hy1, ..., hy1], ..., [hym, hym, ..., hym]]
|
||||||
|
let hyiterator = hyiterator
|
||||||
|
.into_iter()
|
||||||
|
.flat_map(|x| std::iter::repeat(x).take(self.nx()));
|
||||||
|
|
||||||
|
let diagiterator = hxiterator.into_iter().zip(hyiterator).cycle();
|
||||||
|
|
||||||
|
diagiterator
|
||||||
|
.into_iter()
|
||||||
|
.zip(self.0.iter())
|
||||||
|
.zip(other.0.iter())
|
||||||
|
.map(|(((hx, hy), r0), r1)| (*r0 - *r1).powi(2) * hx * hy)
|
||||||
|
.sum::<f32>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn h2_diff() {
|
||||||
|
let mut field0 = Field::new(20, 21);
|
||||||
|
for f in field0.0.iter_mut() {
|
||||||
|
*f = 1.0
|
||||||
|
}
|
||||||
|
let field1 = Field::new(20, 21);
|
||||||
|
|
||||||
|
assert!((field0.err_diff::<super::operators::Upwind4>(&field1) - 4.0).abs() < 1e-3);
|
||||||
|
assert!((field0.err_diff::<super::operators::Upwind9>(&field1) - 4.0).abs() < 1e-3);
|
||||||
|
assert!((field0.err_diff::<super::operators::SBP4>(&field1) - 4.0).abs() < 1e-3);
|
||||||
|
assert!((field0.err_diff::<super::operators::SBP8>(&field1) - 4.0).abs() < 1e-3);
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct VortexParameters {
|
pub struct VortexParameters {
|
||||||
x0: f32,
|
x0: f32,
|
||||||
|
|
Loading…
Reference in New Issue