comparison DiffOps/src/laplace.jl @ 281:1eefaefdd0c7 boundary_conditions

Add missing type parametrization
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 09 Jan 2020 10:53:03 +0100
parents fe9e8737ddfa
children ce6a2f3f732a
comparison
equal deleted inserted replaced
280:fe9e8737ddfa 281:1eefaefdd0c7
46 op::D2{T,N,M,K} 46 op::D2{T,N,M,K}
47 grid::EquidistantGrid{Dim,T} 47 grid::EquidistantGrid{Dim,T}
48 end 48 end
49 export Quadrature 49 export Quadrature
50 50
51 LazyTensors.range_size(H::Quadrature{2}, domain_size::NTuple{2,Integer}) where T = size(H.grid) 51 LazyTensors.domain_size(H::Quadrature{Dim}, range_size::NTuple{Dim,Integer}) where Dim = size(H.grid)
52 LazyTensors.domain_size(H::Quadrature{2}, range_size::NTuple{2,Integer}) where T = size(H.grid) 52
53 53 @inline function LazyTensors.apply(H::Quadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T
54 @inline function LazyTensors.apply(H::Quadrature{2}, v::AbstractArray{T,2}, I::NTuple{2, Index}) where T
55 N = size(H.grid) 54 N = size(H.grid)
56 # Quadrature in x direction 55 # Quadrature in x direction
57 @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])
58 # Quadrature in y-direction 57 # Quadrature in y-direction
59 @inbounds q = apply_quadrature(H.op, spacing(H.grid)[2], q, I[2], N[2]) 58 @inbounds q = apply_quadrature(H.op, spacing(H.grid)[2], q, I[2], N[2])
60 return q 59 return q
61 end 60 end
62 61
63 LazyTensors.apply_transpose(H::Quadrature{2}, v::AbstractArray{T,2}, I::NTuple{2, Index}) where T = LazyTensors.apply(H,v,I) 62 LazyTensors.apply_transpose(H::Quadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T = LazyTensors.apply(H,v,I)
64 63
65 64
66 """ 65 """
67 InverseQuadrature{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim} 66 InverseQuadrature{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim}
68 67
72 op::D2{T,N,M,K} 71 op::D2{T,N,M,K}
73 grid::EquidistantGrid{Dim,T} 72 grid::EquidistantGrid{Dim,T}
74 end 73 end
75 export InverseQuadrature 74 export InverseQuadrature
76 75
77 LazyTensors.range_size(H_inv::InverseQuadrature{2}, domain_size::NTuple{2,Integer}) where T = size(H_inv.grid) 76 LazyTensors.domain_size(H_inv::InverseQuadrature{Dim}, range_size::NTuple{Dim,Integer}) where Dim = size(H_inv.grid)
78 LazyTensors.domain_size(H_inv::InverseQuadrature{2}, range_size::NTuple{2,Integer}) where T = size(H_inv.grid) 77
79 78 @inline function LazyTensors.apply(H_inv::InverseQuadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T
80 @inline function LazyTensors.apply(H_inv::InverseQuadrature{2}, v::AbstractArray{T,2}, I::NTuple{2, Index}) where T
81 N = size(H_inv.grid) 79 N = size(H_inv.grid)
82 # Inverse quadrature in x direction 80 # Inverse quadrature in x direction
83 @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])
84 # Inverse quadrature in y-direction 82 # Inverse quadrature in y-direction
85 @inbounds q_inv = apply_inverse_quadrature(H_inv.op, inverse_spacing(H_inv.grid)[2], q_inv, I[2], N[2]) 83 @inbounds q_inv = apply_inverse_quadrature(H_inv.op, inverse_spacing(H_inv.grid)[2], q_inv, I[2], N[2])
86 return q_inv 84 return q_inv
87 end 85 end
88 86
89 LazyTensors.apply_transpose(H_inv::InverseQuadrature{2}, v::AbstractArray{T,2}, I::NTuple{2, Index}) where T = LazyTensors.apply(H_inv,v,I) 87 LazyTensors.apply_transpose(H_inv::InverseQuadrature{2,T}, v::AbstractArray{T,2}, I::NTuple{2,Index}) where T = LazyTensors.apply(H_inv,v,I)
90 88
91 """ 89 """
92 BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1} 90 BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1}
93 91
94 Implements the boundary operator `e` as a TensorMapping 92 Implements the boundary operator `e` as a TensorMapping
104 # 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?
105 LazyTensors.range_size(e::BoundaryValue{T}, domain_size::NTuple{1,Integer}) where T = size(e.grid) 103 LazyTensors.range_size(e::BoundaryValue{T}, domain_size::NTuple{1,Integer}) where T = size(e.grid)
106 LazyTensors.domain_size(e::BoundaryValue{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],) 104 LazyTensors.domain_size(e::BoundaryValue{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],)
107 105
108 # TODO: Make this independent of dimension 106 # TODO: Make this independent of dimension
109 function LazyTensors.apply(e::BoundaryValue{T}, v::AbstractArray{T}, I::NTuple{2, Index}) where T 107 function LazyTensors.apply(e::BoundaryValue{T}, v::AbstractArray{T}, I::NTuple{2,Index}) where T
110 i = I[dim(e.bId)] 108 i = I[dim(e.bId)]
111 j = I[3-dim(e.bId)] 109 j = I[3-dim(e.bId)]
112 N_i = size(e.grid)[dim(e.bId)] 110 N_i = size(e.grid)[dim(e.bId)]
113 return apply_boundary_value(e.op, v[j], i, N_i, region(e.bId)) 111 return apply_boundary_value(e.op, v[j], i, N_i, region(e.bId))
114 end 112 end
115 113
116 function LazyTensors.apply_transpose(e::BoundaryValue{T}, v::AbstractArray{T}, I::NTuple{1, Index}) where T 114 function LazyTensors.apply_transpose(e::BoundaryValue{T}, v::AbstractArray{T}, I::NTuple{1,Index}) where T
117 u = selectdim(v,3-dim(e.bId),Int(I[1])) 115 u = selectdim(v,3-dim(e.bId),Int(I[1]))
118 return apply_boundary_value_transpose(e.op, u, region(e.bId)) 116 return apply_boundary_value_transpose(e.op, u, region(e.bId))
119 end 117 end
120 118
121 """ 119 """
130 end 128 end
131 export NormalDerivative 129 export NormalDerivative
132 130
133 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue? 131 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue?
134 # Can we give special treatment to TensorMappings that go to a higher dim? 132 # Can we give special treatment to TensorMappings that go to a higher dim?
135 LazyTensors.range_size(e::NormalDerivative{T}, domain_size::NTuple{1,Integer}) where T = size(e.grid) 133 LazyTensors.range_size(e::NormalDerivative, domain_size::NTuple{1,Integer}) = size(e.grid)
136 LazyTensors.domain_size(e::NormalDerivative{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],) 134 LazyTensors.domain_size(e::NormalDerivative, range_size::NTuple{2,Integer}) = (range_size[3-dim(e.bId)],)
137 135
138 # TODO: Not type stable D:< 136 # TODO: Not type stable D:<
139 # TODO: Make this independent of dimension 137 # TODO: Make this independent of dimension
140 function LazyTensors.apply(d::NormalDerivative{T}, v::AbstractArray{T}, I::NTuple{2, Index}) where T 138 function LazyTensors.apply(d::NormalDerivative{T}, v::AbstractArray{T}, I::NTuple{2,Index}) where T
141 i = I[dim(d.bId)] 139 i = I[dim(d.bId)]
142 j = I[3-dim(d.bId)] 140 j = I[3-dim(d.bId)]
143 N_i = size(d.grid)[dim(d.bId)] 141 N_i = size(d.grid)[dim(d.bId)]
144 h_inv = inverse_spacing(d.grid)[dim(d.bId)] 142 h_inv = inverse_spacing(d.grid)[dim(d.bId)]
145 return apply_normal_derivative(d.op, h_inv, v[j], i, N_i, region(d.bId)) 143 return apply_normal_derivative(d.op, h_inv, v[j], i, N_i, region(d.bId))
146 end 144 end
147 145
148 function LazyTensors.apply_transpose(d::NormalDerivative{T}, v::AbstractArray{T}, I::NTuple{1, Index}) where T 146 function LazyTensors.apply_transpose(d::NormalDerivative{T}, v::AbstractArray{T}, I::NTuple{1,Index}) where T
149 u = selectdim(v,3-dim(d.bId),Int(I[1])) 147 u = selectdim(v,3-dim(d.bId),Int(I[1]))
150 return apply_normal_derivative_transpose(d.op, inverse_spacing(d.grid)[dim(d.bId)], u, region(d.bId)) 148 return apply_normal_derivative_transpose(d.op, inverse_spacing(d.grid)[dim(d.bId)], u, region(d.bId))
151 end 149 end
152 150
153 """ 151 """
162 end 160 end
163 export BoundaryQuadrature 161 export BoundaryQuadrature
164 162
165 # TODO: Make this independent of dimension 163 # TODO: Make this independent of dimension
166 # TODO: Dispatch directly on Index{R}? 164 # TODO: Dispatch directly on Index{R}?
167 function LazyTensors.apply(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1, Index}) where T 165 function LazyTensors.apply(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1,Index}) where T
168 h = spacing(q.grid)[3-dim(q.bId)] 166 h = spacing(q.grid)[3-dim(q.bId)]
169 N = size(v) 167 N = size(v)
170 return apply_quadrature(q.op, h, v[I[1]], I[1], N[1]) 168 return apply_quadrature(q.op, h, v[I[1]], I[1], N[1])
171 end 169 end
172 170
173 LazyTensors.apply_transpose(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1, Index}) where T = LazyTensors.apply(q,v,I) 171 LazyTensors.apply_transpose(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1,Index}) where T = LazyTensors.apply(q,v,I)
174 172
175 173
176 174
177 175
178 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end 176 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end