comparison test/SbpOperators/stencil_test.jl @ 1553:f1eacb923f45

Merge bugfix/sbp_operators/stencil_return_type
author Jonatan Werpers <jonatan@werpers.com>
date Sat, 13 Apr 2024 23:44:56 +0200
parents 4f79ab676ebc
children 471a948cd2b2
comparison
equal deleted inserted replaced
1536:5193e6cd6c6a 1553:f1eacb923f45
1 using Test 1 using Test
2 using Sbplib.SbpOperators 2 using Sbplib.SbpOperators
3 using StaticArrays
3 import Sbplib.SbpOperators.Stencil 4 import Sbplib.SbpOperators.Stencil
4 import Sbplib.SbpOperators.NestedStencil 5 import Sbplib.SbpOperators.NestedStencil
5 import Sbplib.SbpOperators.scale 6 import Sbplib.SbpOperators.scale
7 import Sbplib.SbpOperators: apply_stencil, apply_stencil_backwards
6 8
7 @testset "Stencil" begin 9 @testset "Stencil" begin
8 s = Stencil(-2:2, (1.,2.,2.,3.,4.)) 10 s = Stencil(-2:2, (1.,2.,2.,3.,4.))
9 @test s isa Stencil{Float64, 5} 11 @test s isa Stencil{Float64, 5}
10 12
40 @test Stencil(1,2//2; center = 1) isa Stencil{Rational{Int64}, 2} 42 @test Stencil(1,2//2; center = 1) isa Stencil{Rational{Int64}, 2}
41 end 43 end
42 44
43 @testset "promotion" begin 45 @testset "promotion" begin
44 @test promote(Stencil(1,1;center=1), Stencil(2.,2.;center=2)) == (Stencil(1.,1.;center=1), Stencil(2.,2.;center=2)) 46 @test promote(Stencil(1,1;center=1), Stencil(2.,2.;center=2)) == (Stencil(1.,1.;center=1), Stencil(2.,2.;center=2))
47 end
48
49 @testset "apply_stencil" begin
50 v = [1, 2, 4, 8, 16, 32, 64, 128]
51 s = Stencil(1,2,3,4, center = 2)
52 @test apply_stencil(s,v, 2) == v[1] + 2*v[2] + 3*v[3] + 4*v[4]
53 @test apply_stencil(s,v, 4) == v[3] + 2*v[4] + 3*v[5] + 4*v[6]
54 @test apply_stencil_backwards(s,v, 3) == 4*v[1] + 3*v[2] + 2*v[3] + 1*v[4]
55 @test apply_stencil_backwards(s,v, 7) == 4*v[5] + 3*v[6] + 2*v[7] + 1*v[8]
56 @test apply_stencil(s,v, 2) isa Int
57 @test apply_stencil_backwards(s,v, 7) isa Int
58
59 v = [1, 2, 4, 8, 16, 32, 64, 128]
60 s = Stencil(1.,2.,3.,4., center = 2)
61 @test apply_stencil(s,v, 4) == v[3] + 2. *v[4] + 3. *v[5] + 4. *v[6]
62 @test apply_stencil_backwards(s,v, 7) == 4. *v[5] + 3. *v[6] + 2. *v[7] + v[8]
63 @test apply_stencil(s,v, 2) isa Float64
64 @test apply_stencil_backwards(s,v, 7) isa Float64
65
66 v = [1., 2., 4., 8., 16., 32., 64., 128.]
67 s = Stencil(1,2,3,4, center = 2)
68 @test apply_stencil(s,v, 2) == v[1] + 2*v[2] + 3*v[3] + 4*v[4]
69 @test apply_stencil_backwards(s,v, 3) == 4*v[1] + 3*v[2] + 2*v[3] + 1*v[4]
70 @test apply_stencil(s,v, 2) isa Float64
71 @test apply_stencil_backwards(s,v, 3) isa Float64
72
73 v = [@SVector[1, 2], @SVector[3, 4], @SVector[5, 6], @SVector[7, 8]]
74 s = Stencil(1,2, center = 1)
75 @test apply_stencil(s,v,1) == @SVector[7, 10]
76 @test apply_stencil_backwards(s,v,3) == @SVector[11, 14]
77 @test apply_stencil(s,v,1) isa SVector{2, Int}
78 @test apply_stencil_backwards(s,v,3) isa SVector{2, Int}
79
80 v = [@SVector[1., 2.], @SVector[3., 4.], @SVector[5., 6.], @SVector[7., 8.]]
81 s = Stencil(1,2, center = 1)
82 @test apply_stencil(s,v,1) == @SVector[7., 10.]
83 @test apply_stencil_backwards(s,v,3) == @SVector[11., 14.]
84 @test apply_stencil(s,v,1) isa SVector{2, Float64}
85 @test apply_stencil_backwards(s,v,3) isa SVector{2, Float64}
86
87 v = [@SVector[1, 2], @SVector[3, 4], @SVector[5, 6], @SVector[7, 8]]
88 s = Stencil(1.,2., center = 1)
89 @test apply_stencil(s,v,1) == @SVector[7., 10.]
90 @test apply_stencil_backwards(s,v,3) == @SVector[11., 14.]
91 @test apply_stencil(s,v,1) isa SVector{2, Float64}
92 @test apply_stencil_backwards(s,v,3) isa SVector{2, Float64}
45 end 93 end
46 94
47 @testset "type stability" begin 95 @testset "type stability" begin
48 s_int = CenteredStencil(1,2,3) 96 s_int = CenteredStencil(1,2,3)
49 s_float = CenteredStencil(1.,2.,3.) 97 s_float = CenteredStencil(1.,2.,3.)
153 @test SbpOperators.apply_inner_stencils(ns, c, 4) == Stencil(5,11,6; center=1) 201 @test SbpOperators.apply_inner_stencils(ns, c, 4) == Stencil(5,11,6; center=1)
154 @test SbpOperators.apply_inner_stencils_backwards(ns, c, 4) == Stencil(-4,-7,-3; center=1) 202 @test SbpOperators.apply_inner_stencils_backwards(ns, c, 4) == Stencil(-4,-7,-3; center=1)
155 203
156 @test SbpOperators.apply_stencil(ns, c, v, 4) == 5*7 + 11*11 + 6*13 204 @test SbpOperators.apply_stencil(ns, c, v, 4) == 5*7 + 11*11 + 6*13
157 @test SbpOperators.apply_stencil_backwards(ns, c, v, 4) == -3*3 - 7*5 - 4*7 205 @test SbpOperators.apply_stencil_backwards(ns, c, v, 4) == -3*3 - 7*5 - 4*7
206
207 # Different types in vector and stencil
208 ns = NestedStencil((-1.,1.,0.),(-1.,0.,1.),(0.,-2.,2.), center=2)
209 @test SbpOperators.apply_inner_stencils(ns, c, 4) isa Stencil{Float64, 3}
210 @test SbpOperators.apply_inner_stencils(ns, c, 4) == Stencil(4.,9.,10.; center=2)
211 @test SbpOperators.apply_inner_stencils_backwards(ns, c, 4) isa Stencil{Float64, 3}
212 @test SbpOperators.apply_inner_stencils_backwards(ns, c, 4) == Stencil(-5.,-9.,-8.; center=2)
213
214 @test SbpOperators.apply_stencil(ns, c, v, 4) isa Float64
215 @test SbpOperators.apply_stencil(ns, c, v, 4) == 193.
216 @test SbpOperators.apply_stencil_backwards(ns, c, v, 4) isa Float64
217 @test SbpOperators.apply_stencil_backwards(ns, c, v, 4) == -158.
218
219 # Arrays of vectors
220 ns = NestedStencil((-1.,1.,0.),(-1.,0.,1.),(0.,-2.,2.), center=2)
221 c = [ 1, 3, 6, 10]
222 v = [@SVector[1, 2], @SVector[3, 4], @SVector[5, 6], @SVector[7, 8]]
223 @test SbpOperators.apply_stencil(ns, c, v, 2) isa SVector{2,Float64}
224 @test SbpOperators.apply_stencil(ns, c, v, 2) == 2v[1] + 5v[2] + 6v[3]
225 @test SbpOperators.apply_stencil_backwards(ns, c, v, 2) isa SVector{2,Float64}
226 @test SbpOperators.apply_stencil_backwards(ns, c, v, 2) == -4v[1] - 5v[2] - 3v[3]
158 end 227 end
159 228
160 @testset "type stability" begin 229 @testset "type stability" begin
161 s_int = CenteredNestedStencil((1,2,3),(1,2,3),(1,2,3)) 230 s_int = CenteredNestedStencil((1,2,3),(1,2,3),(1,2,3))
162 s_float = CenteredNestedStencil((1.,2.,3.),(1.,2.,3.),(1.,2.,3.)) 231 s_float = CenteredNestedStencil((1.,2.,3.),(1.,2.,3.),(1.,2.,3.))