comparison DiffOps/src/laplace.jl @ 235:a5fdc00d5070 boundary_conditions

Fix a bunch of compilation errors
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 26 Jun 2019 17:54:32 +0200
parents 5acef2d5db2e
children 60011a10e17d
comparison
equal deleted inserted replaced
234:d119dfdd749c 235:a5fdc00d5070
1 struct NormalDerivative{N,M,K} 1 """
2 op::D2{Float64,N,M,K} 2 NormalDerivative{T,N,M,K} <: TensorMapping{T,2,1}
3
4 Implements the boundary operator `d` as a TensorMapping
5 """
6 struct NormalDerivative{T,N,M,K} <: TensorMapping{T,2,1}
7 op::D2{T,N,M,K}
3 grid::EquidistantGrid 8 grid::EquidistantGrid
4 bId::CartesianBoundary 9 bId::CartesianBoundary
5 end 10 end
6 11 export NormalDerivative
7 function apply_transpose(d::NormalDerivative, v::AbstractArray, I::Integer)
8 u = selectdim(v,3-dim(d.bId),I)
9 return apply_d(d.op, d.grid.inverse_spacing[dim(d.bId)], u, region(d.bId))
10 end
11 12
12 # Not correct abstraction level 13 # Not correct abstraction level
13 # TODO: Not type stable D:< 14 # TODO: Not type stable D:<
14 function apply(d::NormalDerivative, v::AbstractArray, I::Tuple{Integer,Integer}) 15 function apply(d::NormalDerivative, v::AbstractArray, I::CartesianIndex{2})
15 i = I[dim(d.bId)] 16 i = I[dim(d.bId)]
16 j = I[3-dim(d.bId)] 17 j = I[3-dim(d.bId)]
17 N_i = d.grid.size[dim(d.bId)] 18 N_i = d.grid.size[dim(d.bId)]
18 19
19 r = getregion(i, closureSize(d.op), N_i) 20 r = getregion(i, closureSize(d.op), N_i)
28 elseif r == Upper 29 elseif r == Upper
29 return d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[N_i-j]*v[j] 30 return d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[N_i-j]*v[j]
30 end 31 end
31 end 32 end
32 33
33 struct BoundaryValue{N,M,K} 34 function apply_transpose(d::NormalDerivative, v::AbstractArray, I::CartesianIndex{1})
34 op::D2{Float64,N,M,K} 35 u = selectdim(v,3-dim(d.bId),I)
36 return apply_d(d.op, d.grid.inverse_spacing[dim(d.bId)], u, region(d.bId))
37 end
38
39
40 """
41 BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1}
42
43 Implements the boundary operator `e` as a TensorMapping
44 """
45 struct BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1}
46 op::D2{T,N,M,K}
35 grid::EquidistantGrid 47 grid::EquidistantGrid
36 bId::CartesianBoundary 48 bId::CartesianBoundary
37 end 49 end
50 export BoundaryValue
38 51
39 function apply(e::BoundaryValue, v::AbstractArray, I::Tuple{Integer,Integer}) 52 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue?
53 # Can we give special treatment to TensorMappings that go to a higher dim?
54 LazyTensors.range_size(e::BoundaryValue{T}, domain_size::NTuple{1,Integer}) where T = size(e.grid)
55 LazyTensors.domain_size(e::BoundaryValue{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],);
56
57 function LazyTensors.apply(e::BoundaryValue, v::AbstractArray, I::CartesianIndex{2})
40 i = I[dim(e.bId)] 58 i = I[dim(e.bId)]
41 j = I[3-dim(e.bId)] 59 j = I[3-dim(e.bId)]
42 N_i = e.grid.size[dim(e.bId)] 60 N_i = e.grid.size[dim(e.bId)]
43 61
44 r = getregion(i, closureSize(e.op), N_i) 62 r = getregion(i, closureSize(e.op), N_i)
53 elseif r == Upper 71 elseif r == Upper
54 return e.op.eClosure[N_i-j]*v[j] 72 return e.op.eClosure[N_i-j]*v[j]
55 end 73 end
56 end 74 end
57 75
58 function apply_transpose(e::BoundaryValue, v::AbstractArray, I::Integer) 76 function LazyTensors.apply_transpose(e::BoundaryValue, v::AbstractArray, I::CartesianIndex{1})
59 u = selectdim(v,3-dim(e.bId),I) 77 u = selectdim(v,3-dim(e.bId),I)
60 return apply_e(e.op, u, region(e.bId)) 78 return apply_e(e.op, u, region(e.bId))
61 end 79 end
80
81
62 82
63 struct Laplace{Dim,T<:Real,N,M,K} <: DiffOpCartesian{Dim} 83 struct Laplace{Dim,T<:Real,N,M,K} <: DiffOpCartesian{Dim}
64 grid::EquidistantGrid{Dim,T} 84 grid::EquidistantGrid{Dim,T}
65 a::T 85 a::T
66 op::D2{Float64,N,M,K} 86 op::D2{Float64,N,M,K}