comparison test/testSbpOperators.jl @ 701:38f9894279cd

Merging branch refactor/operator_naming
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 15 Feb 2021 11:13:12 +0100
parents 5ddf28ddee18
children 3cd582257072
comparison
equal deleted inserted replaced
693:d52902f36868 701:38f9894279cd
239 g_1D = EquidistantGrid(121, 0.0, Lx) 239 g_1D = EquidistantGrid(121, 0.0, Lx)
240 g_2D = EquidistantGrid((121,123), (0.0, 0.0), (Lx, Ly)) 240 g_2D = EquidistantGrid((121,123), (0.0, 0.0), (Lx, Ly))
241 241
242 @testset "Constructors" begin 242 @testset "Constructors" begin
243 @testset "1D" begin 243 @testset "1D" begin
244 Dₓₓ = SecondDerivative(g_1D,op.innerStencil,op.closureStencils) 244 Dₓₓ = second_derivative(g_1D,op.innerStencil,op.closureStencils)
245 @test Dₓₓ == SecondDerivative(g_1D,op.innerStencil,op.closureStencils,1) 245 @test Dₓₓ == second_derivative(g_1D,op.innerStencil,op.closureStencils,1)
246 @test Dₓₓ isa VolumeOperator 246 @test Dₓₓ isa VolumeOperator
247 end 247 end
248 @testset "2D" begin 248 @testset "2D" begin
249 Dₓₓ = SecondDerivative(g_2D,op.innerStencil,op.closureStencils,1) 249 Dₓₓ = second_derivative(g_2D,op.innerStencil,op.closureStencils,1)
250 D2 = SecondDerivative(g_1D,op.innerStencil,op.closureStencils) 250 D2 = second_derivative(g_1D,op.innerStencil,op.closureStencils)
251 I = IdentityMapping{Float64}(size(g_2D)[2]) 251 I = IdentityMapping{Float64}(size(g_2D)[2])
252 @test Dₓₓ == D2⊗I 252 @test Dₓₓ == D2⊗I
253 @test Dₓₓ isa TensorMapping{T,2,2} where T 253 @test Dₓₓ isa TensorMapping{T,2,2} where T
254 end 254 end
255 end 255 end
270 270
271 # 2nd order interior stencil, 1nd order boundary stencil, 271 # 2nd order interior stencil, 1nd order boundary stencil,
272 # implies that L*v should be exact for monomials up to order 2. 272 # implies that L*v should be exact for monomials up to order 2.
273 @testset "2nd order" begin 273 @testset "2nd order" begin
274 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 274 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
275 Dₓₓ = SecondDerivative(g_1D,op.innerStencil,op.closureStencils) 275 Dₓₓ = second_derivative(g_1D,op.innerStencil,op.closureStencils)
276 @test Dₓₓ*monomials[1] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10 276 @test Dₓₓ*monomials[1] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10
277 @test Dₓₓ*monomials[2] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10 277 @test Dₓₓ*monomials[2] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10
278 @test Dₓₓ*monomials[3] ≈ monomials[1] atol = 5e-10 278 @test Dₓₓ*monomials[3] ≈ monomials[1] atol = 5e-10
279 @test Dₓₓ*v ≈ vₓₓ rtol = 5e-2 norm = l2 279 @test Dₓₓ*v ≈ vₓₓ rtol = 5e-2 norm = l2
280 end 280 end
281 281
282 # 4th order interior stencil, 2nd order boundary stencil, 282 # 4th order interior stencil, 2nd order boundary stencil,
283 # implies that L*v should be exact for monomials up to order 3. 283 # implies that L*v should be exact for monomials up to order 3.
284 @testset "4th order" begin 284 @testset "4th order" begin
285 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 285 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
286 Dₓₓ = SecondDerivative(g_1D,op.innerStencil,op.closureStencils) 286 Dₓₓ = second_derivative(g_1D,op.innerStencil,op.closureStencils)
287 # NOTE: high tolerances for checking the "exact" differentiation 287 # NOTE: high tolerances for checking the "exact" differentiation
288 # due to accumulation of round-off errors/cancellation errors? 288 # due to accumulation of round-off errors/cancellation errors?
289 @test Dₓₓ*monomials[1] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10 289 @test Dₓₓ*monomials[1] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10
290 @test Dₓₓ*monomials[2] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10 290 @test Dₓₓ*monomials[2] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10
291 @test Dₓₓ*monomials[3] ≈ monomials[1] atol = 5e-10 291 @test Dₓₓ*monomials[3] ≈ monomials[1] atol = 5e-10
307 307
308 # 2nd order interior stencil, 1st order boundary stencil, 308 # 2nd order interior stencil, 1st order boundary stencil,
309 # implies that L*v should be exact for binomials up to order 2. 309 # implies that L*v should be exact for binomials up to order 2.
310 @testset "2nd order" begin 310 @testset "2nd order" begin
311 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 311 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
312 Dyy = SecondDerivative(g_2D,op.innerStencil,op.closureStencils,2) 312 Dyy = second_derivative(g_2D,op.innerStencil,op.closureStencils,2)
313 @test Dyy*binomials[1] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9 313 @test Dyy*binomials[1] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9
314 @test Dyy*binomials[2] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9 314 @test Dyy*binomials[2] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9
315 @test Dyy*binomials[3] ≈ evalOn(g_2D,(x,y)->1.) atol = 5e-9 315 @test Dyy*binomials[3] ≈ evalOn(g_2D,(x,y)->1.) atol = 5e-9
316 @test Dyy*v ≈ v_yy rtol = 5e-2 norm = l2 316 @test Dyy*v ≈ v_yy rtol = 5e-2 norm = l2
317 end 317 end
318 318
319 # 4th order interior stencil, 2nd order boundary stencil, 319 # 4th order interior stencil, 2nd order boundary stencil,
320 # implies that L*v should be exact for binomials up to order 3. 320 # implies that L*v should be exact for binomials up to order 3.
321 @testset "4th order" begin 321 @testset "4th order" begin
322 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 322 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
323 Dyy = SecondDerivative(g_2D,op.innerStencil,op.closureStencils,2) 323 Dyy = second_derivative(g_2D,op.innerStencil,op.closureStencils,2)
324 # NOTE: high tolerances for checking the "exact" differentiation 324 # NOTE: high tolerances for checking the "exact" differentiation
325 # due to accumulation of round-off errors/cancellation errors? 325 # due to accumulation of round-off errors/cancellation errors?
326 @test Dyy*binomials[1] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9 326 @test Dyy*binomials[1] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9
327 @test Dyy*binomials[2] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9 327 @test Dyy*binomials[2] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9
328 @test Dyy*binomials[3] ≈ evalOn(g_2D,(x,y)->1.) atol = 5e-9 328 @test Dyy*binomials[3] ≈ evalOn(g_2D,(x,y)->1.) atol = 5e-9
337 g_1D = EquidistantGrid(101, 0.0, 1.) 337 g_1D = EquidistantGrid(101, 0.0, 1.)
338 g_3D = EquidistantGrid((51,101,52), (0.0, -1.0, 0.0), (1., 1., 1.)) 338 g_3D = EquidistantGrid((51,101,52), (0.0, -1.0, 0.0), (1., 1., 1.))
339 @testset "Constructors" begin 339 @testset "Constructors" begin
340 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 340 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
341 @testset "1D" begin 341 @testset "1D" begin
342 L = Laplace(g_1D, op.innerStencil, op.closureStencils) 342 L = laplace(g_1D, op.innerStencil, op.closureStencils)
343 @test L == SecondDerivative(g_1D, op.innerStencil, op.closureStencils) 343 @test L == second_derivative(g_1D, op.innerStencil, op.closureStencils)
344 @test L isa TensorMapping{T,1,1} where T 344 @test L isa TensorMapping{T,1,1} where T
345 end 345 end
346 @testset "3D" begin 346 @testset "3D" begin
347 L = Laplace(g_3D, op.innerStencil, op.closureStencils) 347 L = laplace(g_3D, op.innerStencil, op.closureStencils)
348 @test L isa TensorMapping{T,3,3} where T 348 @test L isa TensorMapping{T,3,3} where T
349 Dxx = SecondDerivative(g_3D, op.innerStencil, op.closureStencils,1) 349 Dxx = second_derivative(g_3D, op.innerStencil, op.closureStencils,1)
350 Dyy = SecondDerivative(g_3D, op.innerStencil, op.closureStencils,2) 350 Dyy = second_derivative(g_3D, op.innerStencil, op.closureStencils,2)
351 Dzz = SecondDerivative(g_3D, op.innerStencil, op.closureStencils,3) 351 Dzz = second_derivative(g_3D, op.innerStencil, op.closureStencils,3)
352 @test L == Dxx + Dyy + Dzz 352 @test L == Dxx + Dyy + Dzz
353 end 353 end
354 end 354 end
355 355
356 # Exact differentiation is measured point-wise. In other cases 356 # Exact differentiation is measured point-wise. In other cases
368 368
369 # 2nd order interior stencil, 1st order boundary stencil, 369 # 2nd order interior stencil, 1st order boundary stencil,
370 # implies that L*v should be exact for binomials up to order 2. 370 # implies that L*v should be exact for binomials up to order 2.
371 @testset "2nd order" begin 371 @testset "2nd order" begin
372 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 372 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
373 L = Laplace(g_3D,op.innerStencil,op.closureStencils) 373 L = laplace(g_3D,op.innerStencil,op.closureStencils)
374 @test L*polynomials[1] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9 374 @test L*polynomials[1] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9
375 @test L*polynomials[2] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9 375 @test L*polynomials[2] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9
376 @test L*polynomials[3] ≈ polynomials[1] atol = 5e-9 376 @test L*polynomials[3] ≈ polynomials[1] atol = 5e-9
377 @test L*v ≈ Δv rtol = 5e-2 norm = l2 377 @test L*v ≈ Δv rtol = 5e-2 norm = l2
378 end 378 end
379 379
380 # 4th order interior stencil, 2nd order boundary stencil, 380 # 4th order interior stencil, 2nd order boundary stencil,
381 # implies that L*v should be exact for binomials up to order 3. 381 # implies that L*v should be exact for binomials up to order 3.
382 @testset "4th order" begin 382 @testset "4th order" begin
383 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 383 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
384 L = Laplace(g_3D,op.innerStencil,op.closureStencils) 384 L = laplace(g_3D,op.innerStencil,op.closureStencils)
385 # NOTE: high tolerances for checking the "exact" differentiation 385 # NOTE: high tolerances for checking the "exact" differentiation
386 # due to accumulation of round-off errors/cancellation errors? 386 # due to accumulation of round-off errors/cancellation errors?
387 @test L*polynomials[1] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9 387 @test L*polynomials[1] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9
388 @test L*polynomials[2] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9 388 @test L*polynomials[2] ≈ zeros(Float64, size(g_3D)...) atol = 5e-9
389 @test L*polynomials[3] ≈ polynomials[1] atol = 5e-9 389 @test L*polynomials[3] ≈ polynomials[1] atol = 5e-9
391 @test L*v ≈ Δv rtol = 5e-4 norm = l2 391 @test L*v ≈ Δv rtol = 5e-4 norm = l2
392 end 392 end
393 end 393 end
394 end 394 end
395 395
396 @testset "Quadrature diagonal" begin 396 @testset "Diagonal-stencil inner_product" begin
397 Lx = π/2. 397 Lx = π/2.
398 Ly = Float64(π) 398 Ly = Float64(π)
399 Lz = 1. 399 Lz = 1.
400 g_1D = EquidistantGrid(77, 0.0, Lx) 400 g_1D = EquidistantGrid(77, 0.0, Lx)
401 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) 401 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly))
402 g_3D = EquidistantGrid((10,10, 10), (0.0, 0.0, 0.0), (Lx,Ly,Lz)) 402 g_3D = EquidistantGrid((10,10, 10), (0.0, 0.0, 0.0), (Lx,Ly,Lz))
403 integral(H,v) = sum(H*v) 403 integral(H,v) = sum(H*v)
404 @testset "quadrature" begin 404 @testset "inner_product" begin
405 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 405 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
406 @testset "0D" begin 406 @testset "0D" begin
407 H = quadrature(EquidistantGrid{Float64}(),op.quadratureClosure) 407 H = inner_product(EquidistantGrid{Float64}(),op.quadratureClosure)
408 @test H == IdentityMapping{Float64}() 408 @test H == IdentityMapping{Float64}()
409 @test H isa TensorMapping{T,0,0} where T 409 @test H isa TensorMapping{T,0,0} where T
410 end 410 end
411 @testset "1D" begin 411 @testset "1D" begin
412 H = quadrature(g_1D,op.quadratureClosure) 412 H = inner_product(g_1D,op.quadratureClosure)
413 inner_stencil = CenteredStencil(1.) 413 inner_stencil = CenteredStencil(1.)
414 @test H == quadrature(g_1D,op.quadratureClosure,inner_stencil) 414 @test H == inner_product(g_1D,op.quadratureClosure,inner_stencil)
415 @test H isa TensorMapping{T,1,1} where T 415 @test H isa TensorMapping{T,1,1} where T
416 end 416 end
417 @testset "2D" begin 417 @testset "2D" begin
418 H = quadrature(g_2D,op.quadratureClosure) 418 H = inner_product(g_2D,op.quadratureClosure)
419 H_x = quadrature(restrict(g_2D,1),op.quadratureClosure) 419 H_x = inner_product(restrict(g_2D,1),op.quadratureClosure)
420 H_y = quadrature(restrict(g_2D,2),op.quadratureClosure) 420 H_y = inner_product(restrict(g_2D,2),op.quadratureClosure)
421 @test H == H_x⊗H_y 421 @test H == H_x⊗H_y
422 @test H isa TensorMapping{T,2,2} where T 422 @test H isa TensorMapping{T,2,2} where T
423 end 423 end
424 end 424 end
425 425
426 @testset "Sizes" begin 426 @testset "Sizes" begin
427 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 427 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
428 @testset "1D" begin 428 @testset "1D" begin
429 H = quadrature(g_1D,op.quadratureClosure) 429 H = inner_product(g_1D,op.quadratureClosure)
430 @test domain_size(H) == size(g_1D) 430 @test domain_size(H) == size(g_1D)
431 @test range_size(H) == size(g_1D) 431 @test range_size(H) == size(g_1D)
432 end 432 end
433 @testset "2D" begin 433 @testset "2D" begin
434 H = quadrature(g_2D,op.quadratureClosure) 434 H = inner_product(g_2D,op.quadratureClosure)
435 @test domain_size(H) == size(g_2D) 435 @test domain_size(H) == size(g_2D)
436 @test range_size(H) == size(g_2D) 436 @test range_size(H) == size(g_2D)
437 end 437 end
438 end 438 end
439 439
446 end 446 end
447 u = evalOn(g_1D,x->sin(x)) 447 u = evalOn(g_1D,x->sin(x))
448 448
449 @testset "2nd order" begin 449 @testset "2nd order" begin
450 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 450 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
451 H = quadrature(g_1D,op.quadratureClosure) 451 H = inner_product(g_1D,op.quadratureClosure)
452 for i = 1:2 452 for i = 1:2
453 @test integral(H,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14 453 @test integral(H,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14
454 end 454 end
455 @test integral(H,u) ≈ 1. rtol = 1e-4 455 @test integral(H,u) ≈ 1. rtol = 1e-4
456 end 456 end
457 457
458 @testset "4th order" begin 458 @testset "4th order" begin
459 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 459 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
460 H = quadrature(g_1D,op.quadratureClosure) 460 H = inner_product(g_1D,op.quadratureClosure)
461 for i = 1:4 461 for i = 1:4
462 @test integral(H,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14 462 @test integral(H,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14
463 end 463 end
464 @test integral(H,u) ≈ 1. rtol = 1e-8 464 @test integral(H,u) ≈ 1. rtol = 1e-8
465 end 465 end
469 b = 2.1 469 b = 2.1
470 v = b*ones(Float64, size(g_2D)) 470 v = b*ones(Float64, size(g_2D))
471 u = evalOn(g_2D,(x,y)->sin(x)+cos(y)) 471 u = evalOn(g_2D,(x,y)->sin(x)+cos(y))
472 @testset "2nd order" begin 472 @testset "2nd order" begin
473 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 473 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
474 H = quadrature(g_2D,op.quadratureClosure) 474 H = inner_product(g_2D,op.quadratureClosure)
475 @test integral(H,v) ≈ b*Lx*Ly rtol = 1e-13 475 @test integral(H,v) ≈ b*Lx*Ly rtol = 1e-13
476 @test integral(H,u) ≈ π rtol = 1e-4 476 @test integral(H,u) ≈ π rtol = 1e-4
477 end 477 end
478 @testset "4th order" begin 478 @testset "4th order" begin
479 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 479 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
480 H = quadrature(g_2D,op.quadratureClosure) 480 H = inner_product(g_2D,op.quadratureClosure)
481 @test integral(H,v) ≈ b*Lx*Ly rtol = 1e-13 481 @test integral(H,v) ≈ b*Lx*Ly rtol = 1e-13
482 @test integral(H,u) ≈ π rtol = 1e-8 482 @test integral(H,u) ≈ π rtol = 1e-8
483 end 483 end
484 end 484 end
485 end 485 end
486 end 486 end
487 487
488 @testset "InverseDiagonalQuadrature" begin 488 @testset "Diagonal-stencil inverse_inner_product" begin
489 Lx = π/2. 489 Lx = π/2.
490 Ly = Float64(π) 490 Ly = Float64(π)
491 g_1D = EquidistantGrid(77, 0.0, Lx) 491 g_1D = EquidistantGrid(77, 0.0, Lx)
492 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) 492 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly))
493 @testset "Constructors" begin 493 @testset "inverse_inner_product" begin
494 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 494 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
495 @testset "1D" begin 495 @testset "0D" begin
496 Hi = InverseDiagonalQuadrature(g_1D, op.quadratureClosure); 496 Hi = inverse_inner_product(EquidistantGrid{Float64}(),op.quadratureClosure)
497 @test Hi == IdentityMapping{Float64}()
498 @test Hi isa TensorMapping{T,0,0} where T
499 end
500 @testset "1D" begin
501 Hi = inverse_inner_product(g_1D, op.quadratureClosure);
497 inner_stencil = CenteredStencil(1.) 502 inner_stencil = CenteredStencil(1.)
498 closures = () 503 closures = ()
499 for i = 1:length(op.quadratureClosure) 504 for i = 1:length(op.quadratureClosure)
500 closures = (closures...,Stencil(op.quadratureClosure[i].range,1.0./op.quadratureClosure[i].weights)) 505 closures = (closures...,Stencil(op.quadratureClosure[i].range,1.0./op.quadratureClosure[i].weights))
501 end 506 end
502 @test Hi == InverseQuadrature(g_1D,inner_stencil,closures) 507 @test Hi == inverse_inner_product(g_1D,closures,inner_stencil)
503 @test Hi isa TensorMapping{T,1,1} where T 508 @test Hi isa TensorMapping{T,1,1} where T
504 end 509 end
505 @testset "2D" begin 510 @testset "2D" begin
506 Hi = InverseDiagonalQuadrature(g_2D,op.quadratureClosure) 511 Hi = inverse_inner_product(g_2D,op.quadratureClosure)
507 Hi_x = InverseDiagonalQuadrature(restrict(g_2D,1),op.quadratureClosure) 512 Hi_x = inverse_inner_product(restrict(g_2D,1),op.quadratureClosure)
508 Hi_y = InverseDiagonalQuadrature(restrict(g_2D,2),op.quadratureClosure) 513 Hi_y = inverse_inner_product(restrict(g_2D,2),op.quadratureClosure)
509 @test Hi == Hi_x⊗Hi_y 514 @test Hi == Hi_x⊗Hi_y
510 @test Hi isa TensorMapping{T,2,2} where T 515 @test Hi isa TensorMapping{T,2,2} where T
511 end 516 end
512 end 517 end
513 518
514 @testset "Sizes" begin 519 @testset "Sizes" begin
515 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 520 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
516 @testset "1D" begin 521 @testset "1D" begin
517 Hi = InverseDiagonalQuadrature(g_1D,op.quadratureClosure) 522 Hi = inverse_inner_product(g_1D,op.quadratureClosure)
518 @test domain_size(Hi) == size(g_1D) 523 @test domain_size(Hi) == size(g_1D)
519 @test range_size(Hi) == size(g_1D) 524 @test range_size(Hi) == size(g_1D)
520 end 525 end
521 @testset "2D" begin 526 @testset "2D" begin
522 Hi = InverseDiagonalQuadrature(g_2D,op.quadratureClosure) 527 Hi = inverse_inner_product(g_2D,op.quadratureClosure)
523 @test domain_size(Hi) == size(g_2D) 528 @test domain_size(Hi) == size(g_2D)
524 @test range_size(Hi) == size(g_2D) 529 @test range_size(Hi) == size(g_2D)
525 end 530 end
526 end 531 end
527 532
529 @testset "1D" begin 534 @testset "1D" begin
530 v = evalOn(g_1D,x->sin(x)) 535 v = evalOn(g_1D,x->sin(x))
531 u = evalOn(g_1D,x->x^3-x^2+1) 536 u = evalOn(g_1D,x->x^3-x^2+1)
532 @testset "2nd order" begin 537 @testset "2nd order" begin
533 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 538 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
534 H = quadrature(g_1D,op.quadratureClosure) 539 H = inner_product(g_1D,op.quadratureClosure)
535 Hi = InverseDiagonalQuadrature(g_1D,op.quadratureClosure) 540 Hi = inverse_inner_product(g_1D,op.quadratureClosure)
536 @test Hi*H*v ≈ v rtol = 1e-15 541 @test Hi*H*v ≈ v rtol = 1e-15
537 @test Hi*H*u ≈ u rtol = 1e-15 542 @test Hi*H*u ≈ u rtol = 1e-15
538 end 543 end
539 @testset "4th order" begin 544 @testset "4th order" begin
540 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 545 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
541 H = quadrature(g_1D,op.quadratureClosure) 546 H = inner_product(g_1D,op.quadratureClosure)
542 Hi = InverseDiagonalQuadrature(g_1D,op.quadratureClosure) 547 Hi = inverse_inner_product(g_1D,op.quadratureClosure)
543 @test Hi*H*v ≈ v rtol = 1e-15 548 @test Hi*H*v ≈ v rtol = 1e-15
544 @test Hi*H*u ≈ u rtol = 1e-15 549 @test Hi*H*u ≈ u rtol = 1e-15
545 end 550 end
546 end 551 end
547 @testset "2D" begin 552 @testset "2D" begin
548 v = evalOn(g_2D,(x,y)->sin(x)+cos(y)) 553 v = evalOn(g_2D,(x,y)->sin(x)+cos(y))
549 u = evalOn(g_2D,(x,y)->x*y + x^5 - sqrt(y)) 554 u = evalOn(g_2D,(x,y)->x*y + x^5 - sqrt(y))
550 @testset "2nd order" begin 555 @testset "2nd order" begin
551 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 556 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
552 H = quadrature(g_2D,op.quadratureClosure) 557 H = inner_product(g_2D,op.quadratureClosure)
553 Hi = InverseDiagonalQuadrature(g_2D,op.quadratureClosure) 558 Hi = inverse_inner_product(g_2D,op.quadratureClosure)
554 @test Hi*H*v ≈ v rtol = 1e-15 559 @test Hi*H*v ≈ v rtol = 1e-15
555 @test Hi*H*u ≈ u rtol = 1e-15 560 @test Hi*H*u ≈ u rtol = 1e-15
556 end 561 end
557 @testset "4th order" begin 562 @testset "4th order" begin
558 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 563 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
559 H = quadrature(g_2D,op.quadratureClosure) 564 H = inner_product(g_2D,op.quadratureClosure)
560 Hi = InverseDiagonalQuadrature(g_2D,op.quadratureClosure) 565 Hi = inverse_inner_product(g_2D,op.quadratureClosure)
561 @test Hi*H*v ≈ v rtol = 1e-15 566 @test Hi*H*v ≈ v rtol = 1e-15
562 @test Hi*H*u ≈ u rtol = 1e-15 567 @test Hi*H*u ≈ u rtol = 1e-15
563 end 568 end
564 end 569 end
565 end 570 end
576 @test op_l == BoundaryOperator(g_1D,closure_stencil,Lower()) 581 @test op_l == BoundaryOperator(g_1D,closure_stencil,Lower())
577 @test op_l == boundary_operator(g_1D,closure_stencil,CartesianBoundary{1,Lower}()) 582 @test op_l == boundary_operator(g_1D,closure_stencil,CartesianBoundary{1,Lower}())
578 @test op_l isa TensorMapping{T,0,1} where T 583 @test op_l isa TensorMapping{T,0,1} where T
579 584
580 op_r = BoundaryOperator{Upper}(closure_stencil,size(g_1D)[1]) 585 op_r = BoundaryOperator{Upper}(closure_stencil,size(g_1D)[1])
581 @test op_r == BoundaryRestriction(g_1D,closure_stencil,Upper()) 586 @test op_r == BoundaryOperator(g_1D,closure_stencil,Upper())
582 @test op_r == boundary_operator(g_1D,closure_stencil,CartesianBoundary{1,Upper}()) 587 @test op_r == boundary_operator(g_1D,closure_stencil,CartesianBoundary{1,Upper}())
583 @test op_r isa TensorMapping{T,0,1} where T 588 @test op_r isa TensorMapping{T,0,1} where T
584 end 589 end
585 590
586 @testset "2D" begin 591 @testset "2D" begin
707 @inferred apply_transpose(op_r, u, Index(11,Upper)) 712 @inferred apply_transpose(op_r, u, Index(11,Upper))
708 end 713 end
709 714
710 end 715 end
711 716
712 @testset "BoundaryRestriction" begin 717 @testset "boundary_restriction" begin
713 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 718 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
714 g_1D = EquidistantGrid(11, 0.0, 1.0) 719 g_1D = EquidistantGrid(11, 0.0, 1.0)
715 g_2D = EquidistantGrid((11,15), (0.0, 0.0), (1.0,1.0)) 720 g_2D = EquidistantGrid((11,15), (0.0, 0.0), (1.0,1.0))
716 721
717 @testset "Constructors" begin 722 @testset "boundary_restriction" begin
718 @testset "1D" begin 723 @testset "1D" begin
719 e_l = BoundaryRestriction(g_1D,op.eClosure,Lower()) 724 e_l = boundary_restriction(g_1D,op.eClosure,Lower())
720 @test e_l == BoundaryRestriction(g_1D,op.eClosure,CartesianBoundary{1,Lower}()) 725 @test e_l == boundary_restriction(g_1D,op.eClosure,CartesianBoundary{1,Lower}())
721 @test e_l == BoundaryOperator(g_1D,op.eClosure,Lower()) 726 @test e_l == BoundaryOperator(g_1D,op.eClosure,Lower())
722 @test e_l isa BoundaryOperator{T,Lower} where T 727 @test e_l isa BoundaryOperator{T,Lower} where T
723 @test e_l isa TensorMapping{T,0,1} where T 728 @test e_l isa TensorMapping{T,0,1} where T
724 729
725 e_r = BoundaryRestriction(g_1D,op.eClosure,Upper()) 730 e_r = boundary_restriction(g_1D,op.eClosure,Upper())
726 @test e_r == BoundaryRestriction(g_1D,op.eClosure,CartesianBoundary{1,Upper}()) 731 @test e_r == boundary_restriction(g_1D,op.eClosure,CartesianBoundary{1,Upper}())
727 @test e_r == BoundaryOperator(g_1D,op.eClosure,Upper()) 732 @test e_r == BoundaryOperator(g_1D,op.eClosure,Upper())
728 @test e_r isa BoundaryOperator{T,Upper} where T 733 @test e_r isa BoundaryOperator{T,Upper} where T
729 @test e_r isa TensorMapping{T,0,1} where T 734 @test e_r isa TensorMapping{T,0,1} where T
730 end 735 end
731 736
732 @testset "2D" begin 737 @testset "2D" begin
733 e_w = BoundaryRestriction(g_2D,op.eClosure,CartesianBoundary{1,Upper}()) 738 e_w = boundary_restriction(g_2D,op.eClosure,CartesianBoundary{1,Upper}())
734 @test e_w isa InflatedTensorMapping 739 @test e_w isa InflatedTensorMapping
735 @test e_w isa TensorMapping{T,1,2} where T 740 @test e_w isa TensorMapping{T,1,2} where T
736 end 741 end
737 end 742 end
738 743
739 @testset "Application" begin 744 @testset "Application" begin
740 @testset "1D" begin 745 @testset "1D" begin
741 e_l = BoundaryRestriction(g_1D, op.eClosure, CartesianBoundary{1,Lower}()) 746 e_l = boundary_restriction(g_1D, op.eClosure, CartesianBoundary{1,Lower}())
742 e_r = BoundaryRestriction(g_1D, op.eClosure, CartesianBoundary{1,Upper}()) 747 e_r = boundary_restriction(g_1D, op.eClosure, CartesianBoundary{1,Upper}())
743 748
744 v = evalOn(g_1D,x->1+x^2) 749 v = evalOn(g_1D,x->1+x^2)
745 u = fill(3.124) 750 u = fill(3.124)
746 751
747 @test (e_l*v)[] == v[1] 752 @test (e_l*v)[] == v[1]
748 @test (e_r*v)[] == v[end] 753 @test (e_r*v)[] == v[end]
749 @test (e_r*v)[1] == v[end] 754 @test (e_r*v)[1] == v[end]
750 end 755 end
751 756
752 @testset "2D" begin 757 @testset "2D" begin
753 e_w = BoundaryRestriction(g_2D, op.eClosure, CartesianBoundary{1,Lower}()) 758 e_w = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{1,Lower}())
754 e_e = BoundaryRestriction(g_2D, op.eClosure, CartesianBoundary{1,Upper}()) 759 e_e = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{1,Upper}())
755 e_s = BoundaryRestriction(g_2D, op.eClosure, CartesianBoundary{2,Lower}()) 760 e_s = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{2,Lower}())
756 e_n = BoundaryRestriction(g_2D, op.eClosure, CartesianBoundary{2,Upper}()) 761 e_n = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{2,Upper}())
757 762
758 v = rand(11, 15) 763 v = rand(11, 15)
759 u = fill(3.124) 764 u = fill(3.124)
760 765
761 @test e_w*v == v[1,:] 766 @test e_w*v == v[1,:]
764 @test e_n*v == v[:,end] 769 @test e_n*v == v[:,end]
765 end 770 end
766 end 771 end
767 end 772 end
768 773
769 @testset "NormalDerivative" begin 774 @testset "normal_derivative" begin
770 g_1D = EquidistantGrid(11, 0.0, 1.0) 775 g_1D = EquidistantGrid(11, 0.0, 1.0)
771 g_2D = EquidistantGrid((11,12), (0.0, 0.0), (1.0,1.0)) 776 g_2D = EquidistantGrid((11,12), (0.0, 0.0), (1.0,1.0))
772 @testset "Constructors" begin 777 @testset "normal_derivative" begin
773 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 778 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
774 @testset "1D" begin 779 @testset "1D" begin
775 d_l = NormalDerivative(g_1D, op.dClosure, Lower()) 780 d_l = normal_derivative(g_1D, op.dClosure, Lower())
776 @test d_l == NormalDerivative(g_1D, op.dClosure, CartesianBoundary{1,Lower}()) 781 @test d_l == normal_derivative(g_1D, op.dClosure, CartesianBoundary{1,Lower}())
777 @test d_l isa BoundaryOperator{T,Lower} where T 782 @test d_l isa BoundaryOperator{T,Lower} where T
778 @test d_l isa TensorMapping{T,0,1} where T 783 @test d_l isa TensorMapping{T,0,1} where T
779 end 784 end
780 @testset "2D" begin 785 @testset "2D" begin
781 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 786 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
782 d_w = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{1,Lower}()) 787 d_w = normal_derivative(g_2D, op.dClosure, CartesianBoundary{1,Lower}())
783 d_n = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{2,Upper}()) 788 d_n = normal_derivative(g_2D, op.dClosure, CartesianBoundary{2,Upper}())
784 Ix = IdentityMapping{Float64}((size(g_2D)[1],)) 789 Ix = IdentityMapping{Float64}((size(g_2D)[1],))
785 Iy = IdentityMapping{Float64}((size(g_2D)[2],)) 790 Iy = IdentityMapping{Float64}((size(g_2D)[2],))
786 d_l = NormalDerivative(restrict(g_2D,1),op.dClosure,Lower()) 791 d_l = normal_derivative(restrict(g_2D,1),op.dClosure,Lower())
787 d_r = NormalDerivative(restrict(g_2D,2),op.dClosure,Upper()) 792 d_r = normal_derivative(restrict(g_2D,2),op.dClosure,Upper())
788 @test d_w == d_l⊗Iy 793 @test d_w == d_l⊗Iy
789 @test d_n == Ix⊗d_r 794 @test d_n == Ix⊗d_r
790 @test d_w isa TensorMapping{T,1,2} where T 795 @test d_w isa TensorMapping{T,1,2} where T
791 @test d_n isa TensorMapping{T,1,2} where T 796 @test d_n isa TensorMapping{T,1,2} where T
792 end 797 end
796 v∂x = evalOn(g_2D, (x,y)-> 2*x + y) 801 v∂x = evalOn(g_2D, (x,y)-> 2*x + y)
797 v∂y = evalOn(g_2D, (x,y)-> 2*(y-1) + x) 802 v∂y = evalOn(g_2D, (x,y)-> 2*(y-1) + x)
798 # TODO: Test for higher order polynomials? 803 # TODO: Test for higher order polynomials?
799 @testset "2nd order" begin 804 @testset "2nd order" begin
800 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) 805 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2)
801 d_w = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{1,Lower}()) 806 d_w = normal_derivative(g_2D, op.dClosure, CartesianBoundary{1,Lower}())
802 d_e = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{1,Upper}()) 807 d_e = normal_derivative(g_2D, op.dClosure, CartesianBoundary{1,Upper}())
803 d_s = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{2,Lower}()) 808 d_s = normal_derivative(g_2D, op.dClosure, CartesianBoundary{2,Lower}())
804 d_n = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{2,Upper}()) 809 d_n = normal_derivative(g_2D, op.dClosure, CartesianBoundary{2,Upper}())
805 810
806 @test d_w*v ≈ v∂x[1,:] atol = 1e-13 811 @test d_w*v ≈ v∂x[1,:] atol = 1e-13
807 @test d_e*v ≈ -v∂x[end,:] atol = 1e-13 812 @test d_e*v ≈ -v∂x[end,:] atol = 1e-13
808 @test d_s*v ≈ v∂y[:,1] atol = 1e-13 813 @test d_s*v ≈ v∂y[:,1] atol = 1e-13
809 @test d_n*v ≈ -v∂y[:,end] atol = 1e-13 814 @test d_n*v ≈ -v∂y[:,end] atol = 1e-13
810 end 815 end
811 816
812 @testset "4th order" begin 817 @testset "4th order" begin
813 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) 818 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4)
814 d_w = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{1,Lower}()) 819 d_w = normal_derivative(g_2D, op.dClosure, CartesianBoundary{1,Lower}())
815 d_e = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{1,Upper}()) 820 d_e = normal_derivative(g_2D, op.dClosure, CartesianBoundary{1,Upper}())
816 d_s = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{2,Lower}()) 821 d_s = normal_derivative(g_2D, op.dClosure, CartesianBoundary{2,Lower}())
817 d_n = NormalDerivative(g_2D, op.dClosure, CartesianBoundary{2,Upper}()) 822 d_n = normal_derivative(g_2D, op.dClosure, CartesianBoundary{2,Upper}())
818 823
819 @test d_w*v ≈ v∂x[1,:] atol = 1e-13 824 @test d_w*v ≈ v∂x[1,:] atol = 1e-13
820 @test d_e*v ≈ -v∂x[end,:] atol = 1e-13 825 @test d_e*v ≈ -v∂x[end,:] atol = 1e-13
821 @test d_s*v ≈ v∂y[:,1] atol = 1e-13 826 @test d_s*v ≈ v∂y[:,1] atol = 1e-13
822 @test d_n*v ≈ -v∂y[:,end] atol = 1e-13 827 @test d_n*v ≈ -v∂y[:,end] atol = 1e-13