Mercurial > repos > public > sbplib_julia
comparison test/testSbpOperators.jl @ 553:d5c45785d318 feature/quadrature_as_outer_product
Add test of accuracy conditions for DiagonalQuadrature
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Sun, 29 Nov 2020 18:57:29 +0100 |
parents | 9bfecd6b6aac |
children | dab9df9c4d66 |
comparison
equal
deleted
inserted
replaced
552:9bfecd6b6aac | 553:d5c45785d318 |
---|---|
114 op = readOperator(sbp_operators_path()*"d2_4th.txt",sbp_operators_path()*"h_4th.txt") | 114 op = readOperator(sbp_operators_path()*"d2_4th.txt",sbp_operators_path()*"h_4th.txt") |
115 Lx = π/2. | 115 Lx = π/2. |
116 Ly = Float64(π) | 116 Ly = Float64(π) |
117 g_1D = EquidistantGrid(77, 0.0, Lx) | 117 g_1D = EquidistantGrid(77, 0.0, Lx) |
118 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) | 118 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) |
119 integral(H,v) = sum(H*v) | |
119 @testset "Constructors" begin | 120 @testset "Constructors" begin |
120 # 1D | 121 # 1D |
121 H_x = DiagonalQuadrature(spacing(g_1D)[1],op.quadratureClosure,size(g_1D)); | 122 H_x = DiagonalQuadrature(spacing(g_1D)[1],op.quadratureClosure,size(g_1D)); |
122 @test H_x == DiagonalQuadrature(g_1D,op.quadratureClosure) | 123 @test H_x == DiagonalQuadrature(g_1D,op.quadratureClosure) |
123 @test H_x == diagonal_quadrature(g_1D,op.quadratureClosure) | 124 @test H_x == diagonal_quadrature(g_1D,op.quadratureClosure) |
129 @test H_xy isa TensorMappingComposition | 130 @test H_xy isa TensorMappingComposition |
130 @test H_xy isa TensorMapping{T,2,2} where T | 131 @test H_xy isa TensorMapping{T,2,2} where T |
131 @test H_xy' isa TensorMapping{T,2,2} where T | 132 @test H_xy' isa TensorMapping{T,2,2} where T |
132 end | 133 end |
133 | 134 |
134 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | |
135 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | |
136 @testset "Sizes" begin | 135 @testset "Sizes" begin |
136 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | |
137 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | |
137 # 1D | 138 # 1D |
138 @test domain_size(H_x) == size(g_1D) | 139 @test domain_size(H_x) == size(g_1D) |
139 @test range_size(H_x) == size(g_1D) | 140 @test range_size(H_x) == size(g_1D) |
140 # 2D | 141 # 2D |
141 @test domain_size(H_xy) == size(g_2D) | 142 @test domain_size(H_xy) == size(g_2D) |
142 @test range_size(H_xy) == size(g_2D) | 143 @test range_size(H_xy) == size(g_2D) |
143 end | 144 end |
144 a = 3.2 | 145 |
145 b = 2.1 | |
146 v_1D = a*ones(Float64, size(g_1D)) | |
147 v_2D = b*ones(Float64, size(g_2D)) | |
148 u_1D = evalOn(g_1D,x->sin(x)) | |
149 u_2D = evalOn(g_2D,(x,y)->sin(x)+cos(y)) | |
150 integral(H,v) = sum(H*v) | |
151 @testset "Application" begin | 146 @testset "Application" begin |
147 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | |
148 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | |
149 a = 3.2 | |
150 b = 2.1 | |
151 v_1D = a*ones(Float64, size(g_1D)) | |
152 v_2D = b*ones(Float64, size(g_2D)) | |
153 u_1D = evalOn(g_1D,x->sin(x)) | |
154 u_2D = evalOn(g_2D,(x,y)->sin(x)+cos(y)) | |
152 # 1D | 155 # 1D |
153 @test integral(H_x,v_1D) ≈ a*Lx rtol = 1e-13 | 156 @test integral(H_x,v_1D) ≈ a*Lx rtol = 1e-13 |
154 @test integral(H_x,u_1D) ≈ 1. rtol = 1e-8 | 157 @test integral(H_x,u_1D) ≈ 1. rtol = 1e-8 |
155 @test H_x*v_1D == H_x'*v_1D | 158 @test H_x*v_1D == H_x'*v_1D |
156 # 2D | 159 # 2D |
157 @test integral(H_xy,v_2D) ≈ b*Lx*Ly rtol = 1e-13 | 160 @test integral(H_xy,v_2D) ≈ b*Lx*Ly rtol = 1e-13 |
158 @test integral(H_xy,u_2D) ≈ π rtol = 1e-8 | 161 @test integral(H_xy,u_2D) ≈ π rtol = 1e-8 |
159 @test H_xy*v_2D ≈ H_xy'*v_2D rtol = 1e-16 #Failed for exact equality. Must differ in operation order for some reason? | 162 @test H_xy*v_2D ≈ H_xy'*v_2D rtol = 1e-16 #Failed for exact equality. Must differ in operation order for some reason? |
160 end | 163 end |
161 | 164 |
165 @testset "Accuracy" begin | |
166 v = () | |
167 for i = 0:4 | |
168 f_i(x) = 1/factorial(i)*x^i | |
169 v = (v...,evalOn(g_1D,f_i)) | |
170 end | |
171 # # 2nd order | |
172 # op2 = readOperator(sbp_operators_path()*"d2_2nd.txt",sbp_operators_path()*"h_2nd.txt") | |
173 # H2 = diagonal_quadrature(g_1D,op2.quadratureClosure) | |
174 # for i = 1:3 | |
175 # @test integral(H4,v[i]) ≈ v[i+1] rtol = 1e-14 | |
176 # end | |
177 | |
178 # 4th order | |
179 op4 = readOperator(sbp_operators_path()*"d2_4th.txt",sbp_operators_path()*"h_4th.txt") | |
180 H4 = diagonal_quadrature(g_1D,op4.quadratureClosure) | |
181 for i = 1:4 | |
182 @test integral(H4,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14 | |
183 end | |
184 end | |
185 | |
162 @testset "Inferred" begin | 186 @testset "Inferred" begin |
187 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | |
188 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | |
189 v_1D = ones(Float64, size(g_1D)) | |
190 v_2D = ones(Float64, size(g_2D)) | |
163 @inferred H_x*v_1D | 191 @inferred H_x*v_1D |
164 @inferred H_x'*v_1D | 192 @inferred H_x'*v_1D |
165 @inferred H_xy*v_2D | 193 @inferred H_xy*v_2D |
166 @inferred H_xy'*v_2D | 194 @inferred H_xy'*v_2D |
167 end | 195 end |