Mercurial > repos > public > sbplib_julia
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 |