comparison DiffOps/src/laplace.jl @ 244:a827568fc251 boundary_conditions

Fix NormalDerivative and add tests
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 26 Jun 2019 21:22:36 +0200
parents 9819243102dd
children d9e262cb2e8d ed29ee13e92e
comparison
equal deleted inserted replaced
243:01a67d1b8b5d 244:a827568fc251
8 grid::EquidistantGrid 8 grid::EquidistantGrid
9 bId::CartesianBoundary 9 bId::CartesianBoundary
10 end 10 end
11 export NormalDerivative 11 export NormalDerivative
12 12
13 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue?
14 # Can we give special treatment to TensorMappings that go to a higher dim?
15 LazyTensors.range_size(e::NormalDerivative{T}, domain_size::NTuple{1,Integer}) where T = size(e.grid)
16 LazyTensors.domain_size(e::NormalDerivative{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],)
17
13 # Not correct abstraction level 18 # Not correct abstraction level
14 # TODO: Not type stable D:< 19 # TODO: Not type stable D:<
15 function LazyTensors.apply(d::NormalDerivative, v::AbstractArray, I::NTuple{2,Int}) 20 function LazyTensors.apply(d::NormalDerivative, v::AbstractArray, I::NTuple{2,Int})
16 i = I[dim(d.bId)] 21 i = I[dim(d.bId)]
17 j = I[3-dim(d.bId)] 22 j = I[3-dim(d.bId)]
18 N_i = d.grid.size[dim(d.bId)] 23 N_i = size(d.grid)[dim(d.bId)]
19 24
20 r = getregion(i, closureSize(d.op), N_i) 25 if region(d.bId) == Lower
21
22 if r != region(d.bId)
23 return 0
24 end
25
26 if r == Lower
27 # Note, closures are indexed by offset. Fix this D:< 26 # Note, closures are indexed by offset. Fix this D:<
28 return d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[i-1]*v[j] 27 return d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[i-1]*v[j]
29 elseif r == Upper 28 elseif region(d.bId) == Upper
30 return d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[N_i-j]*v[j] 29 return -d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[N_i-i]*v[j]
31 end 30 end
32 end 31 end
33 32
34 function LazyTensors.apply_transpose(d::NormalDerivative, v::AbstractArray, I::NTuple{1,Int}) 33 function LazyTensors.apply_transpose(d::NormalDerivative, v::AbstractArray, I::NTuple{1,Int})
35 u = selectdim(v,3-dim(d.bId),I) 34 u = selectdim(v,3-dim(d.bId),I[1])
36 return apply_d(d.op, d.grid.inverse_spacing[dim(d.bId)], u, region(d.bId)) 35 return apply_d(d.op, d.grid.inverse_spacing[dim(d.bId)], u, region(d.bId))
37 end 36 end
38 37
39 38
40 """ 39 """
50 export BoundaryValue 49 export BoundaryValue
51 50
52 # TODO: This is obviouly strange. Is domain_size just discarded? Is there a way to avoid storing grid in BoundaryValue? 51 # 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? 52 # 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) 53 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)],); 54 LazyTensors.domain_size(e::BoundaryValue{T}, range_size::NTuple{2,Integer}) where T = (range_size[3-dim(e.bId)],)
56 55
57 function LazyTensors.apply(e::BoundaryValue, v::AbstractArray, I::NTuple{2,Int}) 56 function LazyTensors.apply(e::BoundaryValue, v::AbstractArray, I::NTuple{2,Int})
58 i = I[dim(e.bId)] 57 i = I[dim(e.bId)]
59 j = I[3-dim(e.bId)] 58 j = I[3-dim(e.bId)]
60 N_i = size(e.grid)[dim(e.bId)] 59 N_i = size(e.grid)[dim(e.bId)]