Mercurial > repos > public > sbplib_julia
changeset 946:469ed954b493 feature/tensormapping_application_promotion
Allow volume_operator, boundary_operator, and constant_interior_scaling_operator to act on arbitrary arrays
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sat, 12 Mar 2022 22:26:23 +0100 |
parents | 1f41cf9454f2 |
children | 86889fc5b63f |
files | src/SbpOperators/boundaryops/boundary_operator.jl src/SbpOperators/volumeops/constant_interior_scaling_operator.jl src/SbpOperators/volumeops/volume_operator.jl test/SbpOperators/boundaryops/boundary_operator_test.jl test/SbpOperators/volumeops/constant_interior_scaling_operator_test.jl test/SbpOperators/volumeops/volume_operator_test.jl |
diffstat | 6 files changed, 28 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/SbpOperators/boundaryops/boundary_operator.jl Sat Mar 12 22:20:45 2022 +0100 +++ b/src/SbpOperators/boundaryops/boundary_operator.jl Sat Mar 12 22:26:23 2022 +0100 @@ -62,28 +62,28 @@ LazyTensors.range_size(op::BoundaryOperator) = () LazyTensors.domain_size(op::BoundaryOperator) = (op.size,) -function LazyTensors.apply(op::BoundaryOperator{T,Lower}, v::AbstractVector{T}) where T +function LazyTensors.apply(op::BoundaryOperator{<:Any,Lower}, v::AbstractVector) apply_stencil(op.stencil,v,1) end -function LazyTensors.apply(op::BoundaryOperator{T,Upper}, v::AbstractVector{T}) where T +function LazyTensors.apply(op::BoundaryOperator{<:Any,Upper}, v::AbstractVector) apply_stencil_backwards(op.stencil,v,op.size) end -function LazyTensors.apply_transpose(op::BoundaryOperator{T,Lower}, v::AbstractArray{T,0}, i::Index{Lower}) where T +function LazyTensors.apply_transpose(op::BoundaryOperator{<:Any,Lower}, v::AbstractArray{<:Any,0}, i::Index{Lower}) return op.stencil[Int(i)-1]*v[] end -function LazyTensors.apply_transpose(op::BoundaryOperator{T,Upper}, v::AbstractArray{T,0}, i::Index{Upper}) where T +function LazyTensors.apply_transpose(op::BoundaryOperator{<:Any,Upper}, v::AbstractArray{<:Any,0}, i::Index{Upper}) return op.stencil[op.size[1] - Int(i)]*v[] end # Catch all combinations of Lower, Upper and Interior not caught by the two previous methods. -function LazyTensors.apply_transpose(op::BoundaryOperator{T}, v::AbstractArray{T,0}, i::Index) where T - return zero(T) +function LazyTensors.apply_transpose(op::BoundaryOperator, v::AbstractArray{<:Any,0}, i::Index) + return zero(eltype(v)) end -function LazyTensors.apply_transpose(op::BoundaryOperator{T}, v::AbstractArray{T,0}, i) where T +function LazyTensors.apply_transpose(op::BoundaryOperator, v::AbstractArray{<:Any,0}, i) r = getregion(i, closure_size(op), op.size) apply_transpose(op, v, Index(i,r)) end
--- a/src/SbpOperators/volumeops/constant_interior_scaling_operator.jl Sat Mar 12 22:20:45 2022 +0100 +++ b/src/SbpOperators/volumeops/constant_interior_scaling_operator.jl Sat Mar 12 22:26:23 2022 +0100 @@ -28,19 +28,19 @@ LazyTensors.domain_size(op::ConstantInteriorScalingOperator) = (op.size,) # TBD: @inbounds in apply methods? -function LazyTensors.apply(op::ConstantInteriorScalingOperator{T}, v::AbstractVector{T}, i::Index{Lower}) where T +function LazyTensors.apply(op::ConstantInteriorScalingOperator, v::AbstractVector, i::Index{Lower}) return op.closure_weights[Int(i)]*v[Int(i)] end -function LazyTensors.apply(op::ConstantInteriorScalingOperator{T}, v::AbstractVector{T}, i::Index{Interior}) where T +function LazyTensors.apply(op::ConstantInteriorScalingOperator, v::AbstractVector, i::Index{Interior}) return op.interior_weight*v[Int(i)] end -function LazyTensors.apply(op::ConstantInteriorScalingOperator{T}, v::AbstractVector{T}, i::Index{Upper}) where T +function LazyTensors.apply(op::ConstantInteriorScalingOperator, v::AbstractVector, i::Index{Upper}) return op.closure_weights[op.size[1]-Int(i)+1]*v[Int(i)] end -function LazyTensors.apply(op::ConstantInteriorScalingOperator{T}, v::AbstractVector{T}, i) where T +function LazyTensors.apply(op::ConstantInteriorScalingOperator, v::AbstractVector, i) r = getregion(i, closure_size(op), op.size[1]) return LazyTensors.apply(op, v, Index(i, r)) end
--- a/src/SbpOperators/volumeops/volume_operator.jl Sat Mar 12 22:20:45 2022 +0100 +++ b/src/SbpOperators/volumeops/volume_operator.jl Sat Mar 12 22:26:23 2022 +0100 @@ -43,19 +43,19 @@ LazyTensors.range_size(op::VolumeOperator) = op.size LazyTensors.domain_size(op::VolumeOperator) = op.size -function LazyTensors.apply(op::VolumeOperator{T}, v::AbstractVector{T}, i::Index{Lower}) where T +function LazyTensors.apply(op::VolumeOperator, v::AbstractVector, i::Index{Lower}) return @inbounds apply_stencil(op.closure_stencils[Int(i)], v, Int(i)) end -function LazyTensors.apply(op::VolumeOperator{T}, v::AbstractVector{T}, i::Index{Interior}) where T +function LazyTensors.apply(op::VolumeOperator, v::AbstractVector, i::Index{Interior}) return apply_stencil(op.inner_stencil, v, Int(i)) end -function LazyTensors.apply(op::VolumeOperator{T}, v::AbstractVector{T}, i::Index{Upper}) where T +function LazyTensors.apply(op::VolumeOperator, v::AbstractVector, i::Index{Upper}) return @inbounds Int(op.parity)*apply_stencil_backwards(op.closure_stencils[op.size[1]-Int(i)+1], v, Int(i)) end -function LazyTensors.apply(op::VolumeOperator{T}, v::AbstractVector{T}, i) where T +function LazyTensors.apply(op::VolumeOperator, v::AbstractVector, i) r = getregion(i, closure_size(op), op.size[1]) return LazyTensors.apply(op, v, Index(i, r)) end
--- a/test/SbpOperators/boundaryops/boundary_operator_test.jl Sat Mar 12 22:20:45 2022 +0100 +++ b/test/SbpOperators/boundaryops/boundary_operator_test.jl Sat Mar 12 22:26:23 2022 +0100 @@ -72,6 +72,14 @@ @test (op_r*v)[1] == 2*v[end] + v[end-1] + 3*v[end-2] @test op_l'*u == [2*u[]; u[]; 3*u[]; zeros(8)] @test op_r'*u == [zeros(8); 3*u[]; u[]; 2*u[]] + + v = evalOn(g_1D, x->1. +x*im) + @test (op_l*v)[] isa ComplexF64 + + u = fill(1. +im) + @test (op_l'*u)[1] isa ComplexF64 + @test (op_l'*u)[5] isa ComplexF64 + @test (op_l'*u)[11] isa ComplexF64 end @testset "2D" begin
--- a/test/SbpOperators/volumeops/constant_interior_scaling_operator_test.jl Sat Mar 12 22:20:45 2022 +0100 +++ b/test/SbpOperators/volumeops/constant_interior_scaling_operator_test.jl Sat Mar 12 22:26:23 2022 +0100 @@ -24,6 +24,9 @@ @test a*v == [.1,.2,.5,.5,.5,.2,.1] @test a'*v == [.1,.2,.5,.5,.5,.2,.1] + @test (a*rand(ComplexF64, domain_size(a)... ))[1] isa ComplexF64 + @test (a'*rand(ComplexF64, domain_size(a')...))[1] isa ComplexF64 + @test range_size(a) == (7,) @test domain_size(a) == (7,)
--- a/test/SbpOperators/volumeops/volume_operator_test.jl Sat Mar 12 22:20:45 2022 +0100 +++ b/test/SbpOperators/volumeops/volume_operator_test.jl Sat Mar 12 22:26:23 2022 +0100 @@ -89,6 +89,8 @@ @testset "Application" begin @test op_x*v ≈ rx rtol = 1e-14 @test op_y*v ≈ ry rtol = 1e-14 + + @test (op_x*rand(ComplexF64,size(g_2D)))[2,2] isa ComplexF64 end @testset "Regions" begin