SummationByParts/sbp/src/operators/interpolation/interpolation9.rs

83 lines
13 KiB
Rust

use super::*;
pub struct Interpolation9;
impl Interpolation9 {
#[rustfmt::skip]
const F2C_DIAG: &'static [[Float; 15]] = &[
[-5.0/4096.0, 0.0, 49.0/4096.0, 0.0, -245.0/4096.0, 0.0, 1225.0/4096.0, 1.0/2.0, 1225.0/4096.0, 0.0, -245.0/4096.0, 0.0, 49.0/4096.0, 0.0, -5.0/4096.0],
];
#[rustfmt::skip]
const F2C_BLOCK: &'static [[Float; 22]] = &[
[5.2686284188785748e-01, 8.4682941042184923e-01, -2.0727251976345169e-03, -3.5467776280365609e-01, -1.5291230463645894e-02, -9.0976491902894502e-02, -2.9298328682108545e-02, -5.2179807595463586e-03, 3.4062250834683325e-02, 7.3813898085096877e-02, 6.5912558521007691e-02, -2.5455425182224583e-02, -7.8858135268769738e-02, 1.0511170158482339e-02, 1.0297466246544207e-01, 5.6949108895613200e-02, -3.4308921157670390e-02, -5.8997482788315750e-02, -4.2966539044152929e-02, -2.5124065411472413e-02, 1.7139909678724394e-03, 4.3615196424187055e-02],
[-2.3468446435194214e-02, 4.3131420786340957e-01, 8.5980850312858598e-02, 4.7603940875129624e-01, 1.3210073514275335e-02, 6.0881411955347041e-02, 2.5585810411810836e-02, 1.0600733302542303e-02, -2.8158836917230867e-02, -6.7994087660688027e-02, -5.4799898209469740e-02, 5.0238370377932259e-02, 1.0850940737329789e-01, 1.3660999523576111e-05, -1.1424280311019673e-01, -7.0594704953755610e-02, 2.6209331260080626e-02, 5.0182418961172676e-02, 3.2103343148941477e-02, 1.7470268584954918e-02, -7.0745228443207762e-04, -2.8373067246476109e-02],
[2.4916714306945922e-01, -4.7775189410021041e-01, -1.8369140990199855e-02, 4.1977084808920612e-01, 6.6316613209558584e-01, 3.7116423563000828e-01, -2.7151118047839545e-01, -2.9085560694898455e-01, 2.7796013161440170e-01, 8.1515123444641679e-01, 5.4525214595381100e-01, -1.0040515073752119e+00, -1.8219288006779970e+00, -1.6683214390616796e-01, 1.6046462777797821e+00, 1.0846974719520888e+00, -2.2882651660792802e-01, -5.2721786590791042e-01, -2.6947479334214830e-01, -1.2454712416724613e-01, -2.8643203612198978e-03, 1.7325527423286030e-01],
[-3.1374744107225773e-02, -3.8560277245237022e-02, 2.2373357921453515e-03, 1.6624250373884275e-01, 1.7101480843281450e-02, 3.4736941670549754e-01, 2.9074915472830576e-01, 1.8037070362251098e-01, -3.1643970637017987e-02, -1.4439700205357936e-01, -6.2814859725063579e-02, 2.3466168189679312e-01, 3.7917743408128213e-01, 6.1631222196174403e-02, -2.8284935028445379e-01, -2.0614120963189675e-01, 2.0913586845593374e-02, 6.8695794722380743e-02, 2.2528020642632283e-02, 5.4061692073344636e-03, 2.0185034965858510e-03, -1.3215948348859834e-03],
[5.9296747167331777e-02, 1.4378307696751280e-01, -4.0409834787451700e-03, -3.7929003879766199e-01, -3.1546591422357252e-02, -4.2678477551108618e-01, -6.4519096894777528e-02, 6.8916457275965848e-01, 1.2653355304352822e+00, 1.0015090142279532e+00, 1.0424390935875409e-01, -9.7829622252487647e-01, -1.3208748944090689e+00, -2.8300008595522019e-01, 8.1422088300754603e-01, 6.3440130137928941e-01, -1.9955760198721691e-02, -1.5064386074684394e-01, -1.4326889571202749e-02, 1.7711792232011369e-02, -7.9217161324989811e-03, -4.8465911892278418e-02],
[-3.2260941454839102e-03, -9.3712947419508016e-03, 2.0590133951067365e-04, 2.1085040742079481e-02, 1.6586905667752524e-03, 2.3510098029135212e-02, 3.5062071002191428e-03, -4.1732089994723873e-02, -2.1826444408900507e-03, 2.0649123576151260e-01, 3.8634802477549085e-01, 3.4657285748507582e-01, 1.7693083329005391e-01, 1.2957209274305518e-02, -7.7913009746446549e-02, -5.8609417199037818e-02, -3.7071852226009880e-04, 1.1759795657464859e-02, -1.3229500781068283e-03, -3.4952049532427699e-03, 7.3662735648173173e-04, 6.4609024440376705e-03],
];
#[rustfmt::skip]
const C2F_DIAG: &'static [[Float; 8]] = &[
[0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
[-5.0/2048.0, 49.0/2048.0, -245.0/2048.0, 1225.0/2048.0, 1225.0/2048.0, -245.0/2048.0, 49.0/2048.0, -5.0/2048.0],
];
#[rustfmt::skip]
const C2F_BLOCK: &'static [[Float; 15]] = &[
[1.0537256837757150e+00, -2.4288846421921273e-01, 4.3429701911970164e-01, -3.8281710980097783e-01, 1.6566860024112703e-01, -2.7985729116353025e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[3.2729048243799186e-01, 8.6262841572681914e-01, -1.6091848728719577e-01, -9.0919856879246821e-02, 7.7629100522844718e-02, -1.5709654521213201e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-4.7566986935300764e-03, 1.0210763172289250e+00, -3.6738281980399710e-02, 3.1323929502949190e-02, -1.2954788512749336e-02, 2.0495224548048151e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-1.1627405111828265e-01, 8.0757767164055649e-01, 1.1992982462060080e-01, 3.3248500747768550e-01, -1.7369991978798591e-01, 2.9981467167425814e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-2.1892385771606702e-02, 9.7869742354703762e-02, 8.2744488829725205e-01, 1.4937073869608852e-01, -6.3093182844714504e-02, 1.0300199268276950e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-4.1949770425397409e-02, 1.4527057994032164e-01, 1.4915321003780291e-01, 9.7717676895352013e-01, -2.7490881010963303e-01, 4.7020196058270423e-02, -1.7621744548846038e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-1.8716920677698350e-02, 8.4583038536706734e-02, -1.5116294736984345e-01, 1.1331598176662732e+00, -5.7578343981351678e-02, 9.7153558259133310e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-3.0487057786247208e-03, 3.2050993871316637e-02, -1.4810051238794766e-01, 6.4292482016111874e-01, 5.6249066806053438e-01, -1.0575788798746898e-01, 2.1882030311071686e-02, -2.4414062500000000e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[2.0087735588280062e-02, -8.5933975772489596e-02, 1.4285854720715777e-01, -1.1384914286933631e-01, 1.0424198692657576e+00, -5.5830334193693381e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[4.3530713066204312e-02, -2.0750154911869487e-01, 4.1894972646178857e-01, -5.1951365728643595e-01, 8.2507198333460330e-01, 5.2818839773705129e-01, -1.1043385164237317e-01, 2.4149643697856386e-02, -2.4414062500000000e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[3.8871008670068943e-02, -1.6723606656444842e-01, 2.8023417955710428e-01, -2.2599622598531163e-01, 8.5879136206759521e-02, 9.8824796811582738e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-1.5011980647711863e-02, 1.5331538428225466e-01, -5.1603565889716185e-01, 8.4426924973105621e-01, -8.0594861667778428e-01, 8.8650620748676312e-01, 5.5216925821186580e-01, -1.2074821848928192e-01, 2.3925781250000000e-02, -2.4414062500000000e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-4.6505481330402991e-02, 3.3114452886362927e-01, -9.3638645250322083e-01, 1.3642101479846502e+00, -1.0881747976148743e+00, 4.5257520495295200e-01, 9.2313684964726628e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[6.1988154538518501e-03, 4.1690074257599231e-05, -8.5743943088044547e-02, 2.2173771747897486e-01, -2.3314362515542061e-01, 3.3143525828105390e-02, 5.5216925821186580e-01, 6.0374109244640961e-01, -1.1962890625000000e-01, 2.3925781250000000e-02, -2.4414062500000000e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[6.0727865634526521e-02, -3.4864146923076744e-01, 8.2471336696228448e-01, -1.0176395516358734e+00, 6.7077862432757074e-01, -1.9929537265386069e-01, 0.0000000000000000e+00, 1.0093565365961199e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[3.3584939733883018e-02, -2.1543800558928278e-01, 5.5748392441156636e-01, -7.4165787523468796e-01, 5.2263807167283938e-01, -1.4991829579835428e-01, -1.1043385164237317e-01, 6.0374109244640961e-01, 5.9814453125000000e-01, -1.1962890625000000e-01, 2.3925781250000000e-02, -2.4414062500000000e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-2.0233205958094688e-02, 7.9984554906766037e-02, -1.1760616004611729e-01, 7.5243210278702510e-02, -1.6440130255643871e-02, -9.4826892561270318e-04, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-3.4792939561676173e-02, 1.5314463405892736e-01, -2.7096540049760082e-01, 2.4715474039537103e-01, -1.2410475312535753e-01, 3.0080635641143383e-02, 2.2086770328474635e-02, -1.2074821848928192e-01, 5.9814453125000000e-01, 5.9814453125000000e-01, -1.1962890625000000e-01, 2.3925781250000000e-02, -2.4414062500000000e-03, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-2.5338914907631935e-02, 9.7971657014317953e-02, -1.3849747898095244e-01, 8.1051643933268969e-02, -1.1802904442792750e-02, -3.3840026162097964e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[-1.4816565861655355e-02, 5.3315044287206965e-02, -6.4011414565182903e-02, 1.9450395069625474e-02, 1.4591484787125306e-02, -8.9404603406417257e-03, -2.2537520743341464e-03, 2.4149643697856386e-02, -1.1962890625000000e-01, 5.9814453125000000e-01, 5.9814453125000000e-01, -1.1962890625000000e-01, 2.3925781250000000e-02, -2.4414062500000000e-03, 0.0000000000000000e+00],
[1.0108021789406768e-03, -2.1589736695899393e-03, -1.4721271110470103e-03, 7.2622015612738991e-03, -6.5261380057503940e-03, 1.8842350461727676e-03, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00],
[2.5721451516875750e-02, -8.6587755045305664e-02, 8.9045132584768621e-02, -4.7548533304570878e-03, -3.9927614710396069e-02, 1.6526482091438560e-02, 0.0000000000000000e+00, -2.4642493569241209e-03, 2.3925781250000000e-02, -1.1962890625000000e-01, 5.9814453125000000e-01, 5.9814453125000000e-01, -1.1962890625000000e-01, 2.3925781250000000e-02, -2.4414062500000000e-03],
];
}
impl InterpolationOperator for Interpolation9 {
fn fine2coarse(&self, fine: ArrayView1<Float>, coarse: ArrayViewMut1<Float>) {
assert_eq!(fine.len(), 2 * coarse.len() - 1);
use ndarray::prelude::*;
use std::iter::FromIterator;
let block = Array::from_iter(Self::F2C_BLOCK.iter().flatten().copied())
.into_shape((Self::F2C_BLOCK.len(), Self::F2C_BLOCK[0].len()))
.unwrap();
let diag = Array::from_iter(Self::F2C_DIAG.iter().flatten().copied())
.into_shape((Self::F2C_DIAG.len(), Self::F2C_DIAG[0].len()))
.unwrap();
super::interpolate(fine, coarse, block.view(), diag.view(), (5, 2))
}
fn coarse2fine(&self, coarse: ArrayView1<Float>, fine: ArrayViewMut1<Float>) {
assert_eq!(fine.len(), 2 * coarse.len() - 1);
use ndarray::prelude::*;
use std::iter::FromIterator;
let block = Array::from_iter(Self::C2F_BLOCK.iter().flatten().copied())
.into_shape((Self::C2F_BLOCK.len(), Self::C2F_BLOCK[0].len()))
.unwrap();
let diag = Array::from_iter(Self::C2F_DIAG.iter().flatten().copied())
.into_shape((Self::C2F_DIAG.len(), Self::C2F_DIAG[0].len()))
.unwrap();
super::interpolate(coarse, fine, block.view(), diag.view(), (8, 1))
}
}
#[test]
fn test_inter9() {
test_interpolation_operator(Interpolation9, false);
}