Mercurial > repos > public > sbplib_julia
comparison test/testSbpOperators.jl @ 638:08b2c7a2d063 feature/volume_and_boundary_operators
Implement the Quadrature operator as a VolumeOperator. Make DiagonalQuadrature a special case of the general Quadrature operator. Update tests.
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Mon, 04 Jan 2021 09:32:11 +0100 |
parents | fb5ac62563aa |
children | 5e50e9815732 |
comparison
equal
deleted
inserted
replaced
637:4a81812150f4 | 638:08b2c7a2d063 |
---|---|
411 Ly = Float64(π) | 411 Ly = Float64(π) |
412 g_1D = EquidistantGrid(77, 0.0, Lx) | 412 g_1D = EquidistantGrid(77, 0.0, Lx) |
413 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) | 413 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) |
414 integral(H,v) = sum(H*v) | 414 integral(H,v) = sum(H*v) |
415 @testset "Constructors" begin | 415 @testset "Constructors" begin |
416 # 1D | 416 @testset "1D" begin |
417 H_x = DiagonalQuadrature(spacing(g_1D)[1],op.quadratureClosure,size(g_1D)); | 417 H = DiagonalQuadrature(g_1D,op.quadratureClosure) |
418 @test H_x == DiagonalQuadrature(g_1D,op.quadratureClosure) | 418 inner_stencil = Stencil((spacing(g_1D)[1],),center=1) |
419 @test H_x == diagonal_quadrature(g_1D,op.quadratureClosure) | 419 H == Quadrature(g_1D,inner_stencil,op.quadratureClosure) |
420 @test H_x isa TensorMapping{T,1,1} where T | 420 @test H isa TensorMapping{T,1,1} where T |
421 @test H_x' isa TensorMapping{T,1,1} where T | 421 end |
422 # 2D | 422 @testset "1D" begin |
423 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | 423 H = DiagonalQuadrature(g_2D,op.quadratureClosure) |
424 @test H_xy isa TensorMappingComposition | 424 H_x = DiagonalQuadrature(restrict(g_2D,1),op.quadratureClosure) |
425 @test H_xy isa TensorMapping{T,2,2} where T | 425 H_y = DiagonalQuadrature(restrict(g_2D,2),op.quadratureClosure) |
426 @test H_xy' isa TensorMapping{T,2,2} where T | 426 @test H == H_x⊗H_y |
427 @test H isa TensorMapping{T,2,2} where T | |
428 end | |
427 end | 429 end |
428 | 430 |
429 @testset "Sizes" begin | 431 @testset "Sizes" begin |
430 # 1D | 432 @testset "1D" begin |
431 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | 433 H = DiagonalQuadrature(g_1D,op.quadratureClosure) |
432 @test domain_size(H_x) == size(g_1D) | 434 @test domain_size(H) == size(g_1D) |
433 @test range_size(H_x) == size(g_1D) | 435 @test range_size(H) == size(g_1D) |
434 # 2D | 436 end |
435 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | 437 @testset "2D" begin |
436 @test domain_size(H_xy) == size(g_2D) | 438 H = DiagonalQuadrature(g_2D,op.quadratureClosure) |
437 @test range_size(H_xy) == size(g_2D) | 439 @test domain_size(H) == size(g_2D) |
440 @test range_size(H) == size(g_2D) | |
441 end | |
438 end | 442 end |
439 | 443 |
440 @testset "Application" begin | 444 @testset "Application" begin |
441 # 1D | 445 @testset "1D" begin |
442 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | 446 H = DiagonalQuadrature(g_1D,op.quadratureClosure) |
443 a = 3.2 | 447 a = 3.2 |
444 v_1D = a*ones(Float64, size(g_1D)) | 448 v_1D = a*ones(Float64, size(g_1D)) |
445 u_1D = evalOn(g_1D,x->sin(x)) | 449 u_1D = evalOn(g_1D,x->sin(x)) |
446 @test integral(H_x,v_1D) ≈ a*Lx rtol = 1e-13 | 450 @test integral(H,v_1D) ≈ a*Lx rtol = 1e-13 |
447 @test integral(H_x,u_1D) ≈ 1. rtol = 1e-8 | 451 @test integral(H,u_1D) ≈ 1. rtol = 1e-8 |
448 @test H_x*v_1D == H_x'*v_1D | 452 end |
449 # 2D | 453 @testset "1D" begin |
450 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | 454 H = DiagonalQuadrature(g_2D,op.quadratureClosure) |
451 b = 2.1 | 455 b = 2.1 |
452 v_2D = b*ones(Float64, size(g_2D)) | 456 v_2D = b*ones(Float64, size(g_2D)) |
453 u_2D = evalOn(g_2D,(x,y)->sin(x)+cos(y)) | 457 u_2D = evalOn(g_2D,(x,y)->sin(x)+cos(y)) |
454 @test integral(H_xy,v_2D) ≈ b*Lx*Ly rtol = 1e-13 | 458 @test integral(H,v_2D) ≈ b*Lx*Ly rtol = 1e-13 |
455 @test integral(H_xy,u_2D) ≈ π rtol = 1e-8 | 459 @test integral(H,u_2D) ≈ π rtol = 1e-8 |
456 @test H_xy*v_2D ≈ H_xy'*v_2D rtol = 1e-16 #Failed for exact equality. Must differ in operation order for some reason? | 460 end |
457 end | 461 end |
458 | 462 |
459 @testset "Accuracy" begin | 463 @testset "Accuracy" begin |
460 v = () | 464 v = () |
461 for i = 0:4 | 465 for i = 0:4 |
462 f_i(x) = 1/factorial(i)*x^i | 466 f_i(x) = 1/factorial(i)*x^i |
463 v = (v...,evalOn(g_1D,f_i)) | 467 v = (v...,evalOn(g_1D,f_i)) |
464 end | 468 end |
465 # TODO: Bug in readOperator for 2nd order | 469 |
466 # # 2nd order | 470 @testset "2nd order" begin |
467 # op2 = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) | 471 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=2) |
468 # H2 = diagonal_quadrature(g_1D,op2.quadratureClosure) | 472 H = DiagonalQuadrature(g_1D,op.quadratureClosure) |
469 # for i = 1:3 | 473 for i = 1:2 |
470 # @test integral(H2,v[i]) ≈ v[i+1] rtol = 1e-14 | 474 @test integral(H,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14 |
471 # end | 475 end |
472 | 476 end |
473 # 4th order | 477 |
474 op4 = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) | 478 @testset "4th order" begin |
475 H4 = diagonal_quadrature(g_1D,op4.quadratureClosure) | 479 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) |
476 for i = 1:4 | 480 H = DiagonalQuadrature(g_1D,op.quadratureClosure) |
477 @test integral(H4,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14 | 481 for i = 1:4 |
478 end | 482 @test integral(H,v[i]) ≈ v[i+1][end] - v[i+1][1] rtol = 1e-14 |
479 end | 483 end |
480 | 484 end |
481 @testset "Inferred" begin | 485 end |
482 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | 486 end |
483 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | 487 |
484 v_1D = ones(Float64, size(g_1D)) | 488 # @testset "InverseDiagonalQuadrature" begin |
485 v_2D = ones(Float64, size(g_2D)) | 489 # op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) |
486 @inferred H_x*v_1D | 490 # Lx = π/2. |
487 @inferred H_x'*v_1D | 491 # Ly = Float64(π) |
488 @inferred H_xy*v_2D | 492 # g_1D = EquidistantGrid(77, 0.0, Lx) |
489 @inferred H_xy'*v_2D | 493 # g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) |
490 end | 494 # @testset "Constructors" begin |
491 end | 495 # # 1D |
492 | 496 # Hi_x = InverseDiagonalQuadrature(inverse_spacing(g_1D)[1], 1. ./ op.quadratureClosure, size(g_1D)); |
493 @testset "InverseDiagonalQuadrature" begin | 497 # @test Hi_x == InverseDiagonalQuadrature(g_1D,op.quadratureClosure) |
494 op = read_D2_operator(sbp_operators_path()*"standard_diagonal.toml"; order=4) | 498 # @test Hi_x == inverse_diagonal_quadrature(g_1D,op.quadratureClosure) |
495 Lx = π/2. | 499 # @test Hi_x isa TensorMapping{T,1,1} where T |
496 Ly = Float64(π) | 500 # @test Hi_x' isa TensorMapping{T,1,1} where T |
497 g_1D = EquidistantGrid(77, 0.0, Lx) | 501 # |
498 g_2D = EquidistantGrid((77,66), (0.0, 0.0), (Lx,Ly)) | 502 # # 2D |
499 @testset "Constructors" begin | 503 # Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) |
500 # 1D | 504 # @test Hi_xy isa TensorMappingComposition |
501 Hi_x = InverseDiagonalQuadrature(inverse_spacing(g_1D)[1], 1. ./ op.quadratureClosure, size(g_1D)); | 505 # @test Hi_xy isa TensorMapping{T,2,2} where T |
502 @test Hi_x == InverseDiagonalQuadrature(g_1D,op.quadratureClosure) | 506 # @test Hi_xy' isa TensorMapping{T,2,2} where T |
503 @test Hi_x == inverse_diagonal_quadrature(g_1D,op.quadratureClosure) | 507 # end |
504 @test Hi_x isa TensorMapping{T,1,1} where T | 508 # |
505 @test Hi_x' isa TensorMapping{T,1,1} where T | 509 # @testset "Sizes" begin |
506 | 510 # # 1D |
507 # 2D | 511 # Hi_x = inverse_diagonal_quadrature(g_1D,op.quadratureClosure) |
508 Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) | 512 # @test domain_size(Hi_x) == size(g_1D) |
509 @test Hi_xy isa TensorMappingComposition | 513 # @test range_size(Hi_x) == size(g_1D) |
510 @test Hi_xy isa TensorMapping{T,2,2} where T | 514 # # 2D |
511 @test Hi_xy' isa TensorMapping{T,2,2} where T | 515 # Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) |
512 end | 516 # @test domain_size(Hi_xy) == size(g_2D) |
513 | 517 # @test range_size(Hi_xy) == size(g_2D) |
514 @testset "Sizes" begin | 518 # end |
515 # 1D | 519 # |
516 Hi_x = inverse_diagonal_quadrature(g_1D,op.quadratureClosure) | 520 # @testset "Application" begin |
517 @test domain_size(Hi_x) == size(g_1D) | 521 # # 1D |
518 @test range_size(Hi_x) == size(g_1D) | 522 # H_x = diagonal_quadrature(g_1D,op.quadratureClosure) |
519 # 2D | 523 # Hi_x = inverse_diagonal_quadrature(g_1D,op.quadratureClosure) |
520 Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) | 524 # v_1D = evalOn(g_1D,x->sin(x)) |
521 @test domain_size(Hi_xy) == size(g_2D) | 525 # u_1D = evalOn(g_1D,x->x^3-x^2+1) |
522 @test range_size(Hi_xy) == size(g_2D) | 526 # @test Hi_x*H_x*v_1D ≈ v_1D rtol = 1e-15 |
523 end | 527 # @test Hi_x*H_x*u_1D ≈ u_1D rtol = 1e-15 |
524 | 528 # @test Hi_x*v_1D == Hi_x'*v_1D |
525 @testset "Application" begin | 529 # # 2D |
526 # 1D | 530 # H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) |
527 H_x = diagonal_quadrature(g_1D,op.quadratureClosure) | 531 # Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) |
528 Hi_x = inverse_diagonal_quadrature(g_1D,op.quadratureClosure) | 532 # v_2D = evalOn(g_2D,(x,y)->sin(x)+cos(y)) |
529 v_1D = evalOn(g_1D,x->sin(x)) | 533 # u_2D = evalOn(g_2D,(x,y)->x*y + x^5 - sqrt(y)) |
530 u_1D = evalOn(g_1D,x->x^3-x^2+1) | 534 # @test Hi_xy*H_xy*v_2D ≈ v_2D rtol = 1e-15 |
531 @test Hi_x*H_x*v_1D ≈ v_1D rtol = 1e-15 | 535 # @test Hi_xy*H_xy*u_2D ≈ u_2D rtol = 1e-15 |
532 @test Hi_x*H_x*u_1D ≈ u_1D rtol = 1e-15 | 536 # @test Hi_xy*v_2D ≈ Hi_xy'*v_2D rtol = 1e-16 #Failed for exact equality. Must differ in operation order for some reason? |
533 @test Hi_x*v_1D == Hi_x'*v_1D | 537 # end |
534 # 2D | 538 # |
535 H_xy = diagonal_quadrature(g_2D,op.quadratureClosure) | 539 # @testset "Inferred" begin |
536 Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) | 540 # Hi_x = inverse_diagonal_quadrature(g_1D,op.quadratureClosure) |
537 v_2D = evalOn(g_2D,(x,y)->sin(x)+cos(y)) | 541 # Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) |
538 u_2D = evalOn(g_2D,(x,y)->x*y + x^5 - sqrt(y)) | 542 # v_1D = ones(Float64, size(g_1D)) |
539 @test Hi_xy*H_xy*v_2D ≈ v_2D rtol = 1e-15 | 543 # v_2D = ones(Float64, size(g_2D)) |
540 @test Hi_xy*H_xy*u_2D ≈ u_2D rtol = 1e-15 | 544 # @inferred Hi_x*v_1D |
541 @test Hi_xy*v_2D ≈ Hi_xy'*v_2D rtol = 1e-16 #Failed for exact equality. Must differ in operation order for some reason? | 545 # @inferred Hi_x'*v_1D |
542 end | 546 # @inferred Hi_xy*v_2D |
543 | 547 # @inferred Hi_xy'*v_2D |
544 @testset "Inferred" begin | 548 # end |
545 Hi_x = inverse_diagonal_quadrature(g_1D,op.quadratureClosure) | 549 # end |
546 Hi_xy = inverse_diagonal_quadrature(g_2D,op.quadratureClosure) | |
547 v_1D = ones(Float64, size(g_1D)) | |
548 v_2D = ones(Float64, size(g_2D)) | |
549 @inferred Hi_x*v_1D | |
550 @inferred Hi_x'*v_1D | |
551 @inferred Hi_xy*v_2D | |
552 @inferred Hi_xy'*v_2D | |
553 end | |
554 end | |
555 | 550 |
556 @testset "BoundaryOperator" begin | 551 @testset "BoundaryOperator" begin |
557 closure_stencil = Stencil((0,2), (2.,1.,3.)) | 552 closure_stencil = Stencil((0,2), (2.,1.,3.)) |
558 g_1D = EquidistantGrid(11, 0.0, 1.0) | 553 g_1D = EquidistantGrid(11, 0.0, 1.0) |
559 g_2D = EquidistantGrid((11,15), (0.0, 0.0), (1.0,1.0)) | 554 g_2D = EquidistantGrid((11,15), (0.0, 0.0), (1.0,1.0)) |