annotate src/SbpOperators/boundaryops/boundary_restriction.jl @ 563:212e266043dd feature/boundary_ops

Fix region(CartesianBoundary) not returning an instance.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 30 Nov 2020 18:34:48 +0100
parents 8f7919a9b398
children ccb41095def6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
515
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
1 """
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
2 boundary_restriction(grid,closureStencil,boundary)
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
3
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
4 Creates a BoundaryRestriction operator for the specified boundary
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
5 """
514
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
6 function boundary_restriction(grid::EquidistantGrid{1,T}, closureStencil::Stencil{T,M}, boundary::CartesianBoundary{1}) where {T,M}
563
212e266043dd Fix region(CartesianBoundary) not returning an instance.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 562
diff changeset
7 return e = BoundaryRestriction(grid, closureStencil, region(boundary))
514
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
8 end
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
9
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
10 function boundary_restriction(grid::EquidistantGrid{2,T}, closureStencil::Stencil{T,M}, boundary::CartesianBoundary{1}) where {T,M}
563
212e266043dd Fix region(CartesianBoundary) not returning an instance.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 562
diff changeset
11 e = BoundaryRestriction(restrict(grid, 1), closureStencil, region(boundary))
514
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
12 I = IdentityMapping{T}(size(restrict(grid,2)))
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
13 return e⊗I
512
5a8cfcc0765d Sketch on boundary_restriction function in 2D, returning an inflated BoundaryRestriction
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 511
diff changeset
14 end
514
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
15
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
16 function boundary_restriction(grid::EquidistantGrid{2,T}, closureStencil::Stencil{T,M}, boundary::CartesianBoundary{2}) where {T,M}
563
212e266043dd Fix region(CartesianBoundary) not returning an instance.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 562
diff changeset
17 e = BoundaryRestriction(restrict(grid, 2), closureStencil, region(boundary))
514
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
18 I = IdentityMapping{T}(size(restrict(grid,1)))
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
19 return I⊗e
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
20 end
512
5a8cfcc0765d Sketch on boundary_restriction function in 2D, returning an inflated BoundaryRestriction
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 511
diff changeset
21 export boundary_restriction
5a8cfcc0765d Sketch on boundary_restriction function in 2D, returning an inflated BoundaryRestriction
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 511
diff changeset
22
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23 """
515
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
24 BoundaryRestriction{T,N,R} <: TensorMapping{T,0,1}
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26 Implements the boundary operator `e` as a TensorMapping
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 """
515
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
28 struct BoundaryRestriction{T,M,R<:Region} <: TensorMapping{T,0,1}
511
f5f3b832f9c4 Fix boundschecking for BoundaryRestriction
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 510
diff changeset
29 stencil::Stencil{T,M}
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
30 size::NTuple{1,Int}
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
31 end
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
32 export BoundaryRestriction
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
33
514
14e722e8607d Clean up constructors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 513
diff changeset
34 function BoundaryRestriction(grid::EquidistantGrid{1,T}, closureStencil::Stencil{T,M}, region::Region) where {T,M,R}
513
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
35 return BoundaryRestriction{T,M,typeof(region)}(closureStencil,size(grid))
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 end
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37
517
2edacece1637 Fix range_size not returning empty tuple
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 515
diff changeset
38 LazyTensors.range_size(e::BoundaryRestriction) = ()
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 LazyTensors.domain_size(e::BoundaryRestriction) = e.size
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40
562
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
41 # TODO: Should we support indexing into the 0-dimensional lazyarray? This is
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
42 # supported for arrays with linear index style (i.e for e.g
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
43 # u = fill(1), u[] and u[1] are both valid.) This currently not supported by
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
44 # LazyTensorMappingApplication.
511
f5f3b832f9c4 Fix boundschecking for BoundaryRestriction
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 510
diff changeset
45 " Restricts a grid function v on a grid of size m to the scalar element v[1]"
562
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
46 function LazyTensors.apply(e::BoundaryRestriction{T,M,Lower}, v::AbstractVector{T}) where {T,M}
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
47 apply_stencil(e.stencil,v,1)
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 end
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
49
511
f5f3b832f9c4 Fix boundschecking for BoundaryRestriction
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 510
diff changeset
50 " Restricts a grid function v on a grid of size m to the scalar element v[m]"
562
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
51 function LazyTensors.apply(e::BoundaryRestriction{T,M,Upper}, v::AbstractVector{T}) where {T,M}
8f7919a9b398 Merge with default
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 517
diff changeset
52 apply_stencil_backwards(e.stencil,v,e.size[1])
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 end
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 " Transpose of a restriction is an inflation or prolongation.
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 Inflates the scalar (1-element) vector to a vector of size of the grid"
515
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
57 function LazyTensors.apply_transpose(e::BoundaryRestriction{T,M,Lower}, v::AbstractArray{T,0}, i) where {T,M}
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58 @boundscheck if !(0 < Int(i) <= e.size[1])
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 throw(BoundsError())
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 end
515
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
61 return e.stencil[Int(i)-1]*v[]
510
db64cfe4d9de Start sketching on 1D boundary restriction operators.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 end
513
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
63
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
64 " Transpose of a restriction is an inflation or prolongation.
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
65 Inflates the scalar (1-element) vector to a vector of size of the grid"
515
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
66 function LazyTensors.apply_transpose(e::BoundaryRestriction{T,M,Upper}, v::AbstractArray{T,0}, i) where {T,M}
513
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
67 @boundscheck if !(0 < Int(i) <= e.size[1])
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
68 throw(BoundsError())
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
69 end
515
d55008f5e2f3 Fix the range of the BoundaryRestriction tensor mapping (the range is zero for the 1D operator). Add some documentation and todos.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 514
diff changeset
70 return e.stencil[e.size[1] - Int(i)]*v[]
513
547639572208 Get some kind of tested working implementation.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 512
diff changeset
71 end