comparison DiffOps/src/laplace.jl @ 284:0b8e041a1873 boundary_conditions

Change how range_size and domain_size work with BoundaryValues and NormalDerivative Also add a whole bunch of questions and todos
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 18 Jun 2020 22:07:10 +0200
parents 12a12a5cd973
children e21dcda55163
comparison
equal deleted inserted replaced
283:12a12a5cd973 284:0b8e041a1873
1 struct Laplace{Dim,T<:Real,N,M,K} <: TensorOperator{T,Dim} 1 struct Laplace{Dim,T<:Real,N,M,K} <: TensorOperator{T,Dim}
2 grid::EquidistantGrid{Dim,T} 2 grid::EquidistantGrid{Dim,T} # TODO: Should this be here? Should probably be possible to applay a Laplace object to any size grid function
3 a::T # TODO: Better name? 3 a::T # TODO: Better name?
4 op::D2{T,N,M,K} 4 op::D2{T,N,M,K}
5 end 5 end
6 export Laplace 6 export Laplace
7 7
8 LazyTensors.domain_size(H::Laplace{Dim}, range_size::NTuple{Dim,Integer}) where Dim = size(L.grid) 8 # At the moment the grid property is used all over. It could possibly be removed if we implement all the 1D operators as TensorMappings
9
10 LazyTensors.domain_size(H::Laplace{Dim}, range_size::NTuple{Dim,Integer}) where Dim = range_size
9 11
10 function LazyTensors.apply(L::Laplace{Dim,T}, v::AbstractArray{T,Dim}, I::NTuple{Dim,Index}) where {T,Dim} 12 function LazyTensors.apply(L::Laplace{Dim,T}, v::AbstractArray{T,Dim}, I::NTuple{Dim,Index}) where {T,Dim}
11 error("not implemented") 13 error("not implemented")
12 end 14 end
13 15
44 op::D2{T,N,M,K} 46 op::D2{T,N,M,K}
45 grid::EquidistantGrid{Dim,T} 47 grid::EquidistantGrid{Dim,T}
46 end 48 end
47 export Quadrature 49 export Quadrature
48 50
49 LazyTensors.domain_size(H::Quadrature{Dim}, range_size::NTuple{Dim,Integer}) where Dim = size(H.grid) 51 LazyTensors.domain_size(H::Quadrature{Dim}, range_size::NTuple{Dim,Integer}) where Dim = range_size
50 52
51 @inline function LazyTensors.apply(H::Quadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T 53 @inline function LazyTensors.apply(H::Quadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T
52 N = size(H.grid) 54 N = size(H.grid)
53 # Quadrature in x direction 55 # Quadrature in x direction
54 @inbounds q = apply_quadrature(H.op, spacing(H.grid)[1], v[I] , I[1], N[1]) 56 @inbounds q = apply_quadrature(H.op, spacing(H.grid)[1], v[I] , I[1], N[1])
69 op::D2{T,N,M,K} 71 op::D2{T,N,M,K}
70 grid::EquidistantGrid{Dim,T} 72 grid::EquidistantGrid{Dim,T}
71 end 73 end
72 export InverseQuadrature 74 export InverseQuadrature
73 75
74 LazyTensors.domain_size(H_inv::InverseQuadrature{Dim}, range_size::NTuple{Dim,Integer}) where Dim = size(H_inv.grid) 76 LazyTensors.domain_size(H_inv::InverseQuadrature{Dim}, range_size::NTuple{Dim,Integer}) where Dim = range_size
75 77
76 @inline function LazyTensors.apply(H_inv::InverseQuadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T 78 @inline function LazyTensors.apply(H_inv::InverseQuadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T
77 N = size(H_inv.grid) 79 N = size(H_inv.grid)
78 # Inverse quadrature in x direction 80 # Inverse quadrature in x direction
79 @inbounds q_inv = apply_inverse_quadrature(H_inv.op, inverse_spacing(H_inv.grid)[1], v[I] , I[1], N[1]) 81 @inbounds q_inv = apply_inverse_quadrature(H_inv.op, inverse_spacing(H_inv.grid)[1], v[I] , I[1], N[1])
96 end 98 end
97 export BoundaryValue 99 export BoundaryValue
98 100
99 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue? 101 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue?
100 # Can we give special treatment to TensorMappings that go to a higher dim? 102 # Can we give special treatment to TensorMappings that go to a higher dim?
101 LazyTensors.range_size(e::BoundaryValue{T}, domain_size::NTuple{1,Integer}) where T = size(e.grid) 103 function LazyTensors.range_size(e::BoundaryValue{T}, domain_size::NTuple{1,Integer}) where T
104 if dim(e.bId) == 1
105 return (missing, domain_size[1])
106 elseif dim(e.bId) == 2
107 return (domain_size[1], missing)
108 end
109 end
102 LazyTensors.domain_size(e::BoundaryValue{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],) 110 LazyTensors.domain_size(e::BoundaryValue{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],)
111 # TODO: Make a nicer solution for 3-dim(e.bId)
103 112
104 # TODO: Make this independent of dimension 113 # TODO: Make this independent of dimension
105 function LazyTensors.apply(e::BoundaryValue{T}, v::AbstractArray{T}, I::NTuple{2,Index}) where T 114 function LazyTensors.apply(e::BoundaryValue{T}, v::AbstractArray{T}, I::NTuple{2,Index}) where T
106 i = I[dim(e.bId)] 115 i = I[dim(e.bId)]
107 j = I[3-dim(e.bId)] 116 j = I[3-dim(e.bId)]
126 end 135 end
127 export NormalDerivative 136 export NormalDerivative
128 137
129 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue? 138 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue?
130 # Can we give special treatment to TensorMappings that go to a higher dim? 139 # Can we give special treatment to TensorMappings that go to a higher dim?
131 LazyTensors.range_size(e::NormalDerivative, domain_size::NTuple{1,Integer}) = size(e.grid) 140 function LazyTensors.range_size(e::NormalDerivative, domain_size::NTuple{1,Integer})
141 if dim(e.bId) == 1
142 return (missing, domain_size[1])
143 elseif dim(e.bId) == 2
144 return (domain_size[1], missing)
145 end
146 end
132 LazyTensors.domain_size(e::NormalDerivative, range_size::NTuple{2,Integer}) = (range_size[3-dim(e.bId)],) 147 LazyTensors.domain_size(e::NormalDerivative, range_size::NTuple{2,Integer}) = (range_size[3-dim(e.bId)],)
133 148
134 # TODO: Not type stable D:< 149 # TODO: Not type stable D:<
135 # TODO: Make this independent of dimension 150 # TODO: Make this independent of dimension
136 function LazyTensors.apply(d::NormalDerivative{T}, v::AbstractArray{T}, I::NTuple{2,Index}) where T 151 function LazyTensors.apply(d::NormalDerivative{T}, v::AbstractArray{T}, I::NTuple{2,Index}) where T