Mercurial > repos > public > sbplib_julia
comparison diffOp.jl @ 124:631eb9b35d72 cell_based_test
Make grid spacing a property of EquidistantGrid. Create plotting module for sbplib.
| author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
|---|---|
| date | Wed, 13 Feb 2019 10:37:52 +0100 |
| parents | 4c0c02a80cd4 |
| children | 1aaeb46ba5f4 |
comparison
equal
deleted
inserted
replaced
| 122:6c6979ff17f4 | 124:631eb9b35d72 |
|---|---|
| 57 return nothing | 57 return nothing |
| 58 end | 58 end |
| 59 | 59 |
| 60 # Maybe this should be split according to b3fbef345810 after all?! Seems like it makes performance more predictable | 60 # Maybe this should be split according to b3fbef345810 after all?! Seems like it makes performance more predictable |
| 61 function apply_region!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) where T | 61 function apply_region!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) where T |
| 62 N = D.grid.numberOfPointsPerDim | 62 for I ∈ regionindices(D.grid.size, closureSize(D.op), (r1,r2)) |
| 63 closuresize = closureSize(D.op) | |
| 64 for I ∈ regionindices(N, closuresize, (r1,r2)) | |
| 65 @inbounds indextuple = (Index{r1}(I[1]), Index{r2}(I[2])) | 63 @inbounds indextuple = (Index{r1}(I[1]), Index{r2}(I[2])) |
| 66 @inbounds u[I] = apply(D, v, indextuple) | 64 @inbounds u[I] = apply(D, v, indextuple) |
| 67 end | 65 end |
| 68 return nothing | 66 return nothing |
| 69 end | 67 end |
| 81 return nothing | 79 return nothing |
| 82 end | 80 end |
| 83 | 81 |
| 84 using TiledIteration | 82 using TiledIteration |
| 85 function apply_region_tiled!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) where T | 83 function apply_region_tiled!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) where T |
| 86 N = D.grid.numberOfPointsPerDim | 84 ri = regionindices(D.grid.size, closureSize(D.op), (r1,r2)) |
| 87 closuresize = closureSize(D.op) | |
| 88 ri = regionindices(N, closuresize, (r1,r2)) | |
| 89 | |
| 90 for tileaxs ∈ TileIterator(axes(ri), padded_tilesize(T, (5,5), 2)) # TBD: Is this the right way, the right size? | 85 for tileaxs ∈ TileIterator(axes(ri), padded_tilesize(T, (5,5), 2)) # TBD: Is this the right way, the right size? |
| 91 for j ∈ tileaxs[2], i ∈ tileaxs[1] | 86 for j ∈ tileaxs[2], i ∈ tileaxs[1] |
| 92 I = ri[i,j] | 87 I = ri[i,j] |
| 93 u[i,j] = apply(D, v, (Index{r1}(I[1]), Index{r2}(I[2]))) | 88 u[i,j] = apply(D, v, (Index{r1}(I[1]), Index{r2}(I[2]))) |
| 94 end | 89 end |
| 112 error("not implemented") | 107 error("not implemented") |
| 113 end | 108 end |
| 114 | 109 |
| 115 # u = L*v | 110 # u = L*v |
| 116 function apply(L::Laplace{1}, v::AbstractVector, i::Int) | 111 function apply(L::Laplace{1}, v::AbstractVector, i::Int) |
| 117 h = Grid.spacings(L.grid)[1] | 112 uᵢ = L.a * apply(L.op, L.grid.spacing[1], v, i) |
| 118 uᵢ = L.a * apply(L.op, h, v, i) | |
| 119 return uᵢ | 113 return uᵢ |
| 120 end | 114 end |
| 121 | 115 |
| 122 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, I::Tuple{Index{R1}, Index{R2}}) where {R1, R2} | 116 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, I::Tuple{Index{R1}, Index{R2}}) where {R1, R2} |
| 123 h = Grid.spacings(L.grid) | |
| 124 # 2nd x-derivative | 117 # 2nd x-derivative |
| 125 @inbounds vx = view(v, :, Int(I[2])) | 118 @inbounds vx = view(v, :, Int(I[2])) |
| 126 @inbounds uᵢ = L.a*apply(L.op, h[1], vx , I[1]) | 119 @inbounds uᵢ = L.a*apply(L.op, L.grid.spacing[1], vx , I[1]) |
| 127 # 2nd y-derivative | 120 # 2nd y-derivative |
| 128 @inbounds vy = view(v, Int(I[1]), :) | 121 @inbounds vy = view(v, Int(I[1]), :) |
| 129 @inbounds uᵢ += L.a*apply(L.op, h[2], vy, I[2]) | 122 @inbounds uᵢ += L.a*apply(L.op, L.grid.spacing[2], vy, I[2]) |
| 130 return uᵢ | 123 return uᵢ |
| 131 end | 124 end |
| 132 | 125 |
| 133 # Slow but maybe convenient? | 126 # Slow but maybe convenient? |
| 134 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, i::CartesianIndex{2}) | 127 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, i::CartesianIndex{2}) |
