annotate SbpOperators/src/Quadrature.jl @ 325:41c3c25e4e3b

LazyTensors: Simplify the LazyElementwiseOperation type by restricting it and introducing a LazyConstantArray to handle scalars.
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 24 Sep 2020 22:31:04 +0200
parents 777063b6f049
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 # At the moment the grid property is used all over. It could possibly be removed if we implement all the 1D operators as TensorMappings
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 """
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3 Quadrature{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim}
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5 Implements the quadrature operator `Q` of Dim dimension as a TensorMapping
301
417b767c847f Rename DiagonalQuadrature to DiagonalNorm
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 300
diff changeset
6 The multi-dimensional tensor operator consists of a tuple of 1D DiagonalNorm H
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7 tensor operators.
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8 """
308
8c166b092b69 Move export statements
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 301
diff changeset
9 export Quadrature
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10 struct Quadrature{Dim,T<:Real,N,M} <: TensorOperator{T,Dim}
301
417b767c847f Rename DiagonalQuadrature to DiagonalNorm
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 300
diff changeset
11 H::NTuple{Dim,DiagonalNorm{T,N,M}}
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
12 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14 LazyTensors.domain_size(Q::Quadrature{Dim}, range_size::NTuple{Dim,Integer}) where Dim = range_size
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
16 function LazyTensors.apply(Q::Quadrature{Dim,T}, v::AbstractArray{T,Dim}, I::Vararg{Index,Dim}) where {T,Dim}
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 error("not implemented")
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
20 LazyTensors.apply_transpose(Q::Quadrature{Dim,T}, v::AbstractArray{T,Dim}, I::Vararg{Index,Dim}) where {Dim,T} = LazyTensors.apply(Q,v,I)
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
22 @inline function LazyTensors.apply(Q::Quadrature{1,T}, v::AbstractVector{T}, I::Index) where T
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
23 @inbounds q = apply(Q.H[1], v , I)
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
24 return q
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
27 @inline function LazyTensors.apply(Q::Quadrature{2,T}, v::AbstractArray{T,2}, I::Index, J::Index) where T
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
28 # Quadrature in x direction
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
29 @inbounds vx = view(v, :, Int(J))
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
30 @inbounds qx = apply(Q.H[1], vx , I)
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
31 # Quadrature in y-direction
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
32 @inbounds vy = view(v, Int(I), :)
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
33 @inbounds qy = apply(Q.H[2], vy, J)
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34 return qx*qy
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 """
301
417b767c847f Rename DiagonalQuadrature to DiagonalNorm
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 300
diff changeset
38 DiagonalNorm{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim}
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39
301
417b767c847f Rename DiagonalQuadrature to DiagonalNorm
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 300
diff changeset
40 Implements the diagnoal norm operator `H` of Dim dimension as a TensorMapping
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 """
308
8c166b092b69 Move export statements
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 301
diff changeset
42 export DiagonalNorm, closuresize, LazyTensors.apply
301
417b767c847f Rename DiagonalQuadrature to DiagonalNorm
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 300
diff changeset
43 struct DiagonalNorm{T<:Real,N,M} <: TensorOperator{T,1}
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 h::T # The grid spacing could be included in the stencil already. Preferable?
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 closure::NTuple{M,T}
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 #TODO: Write a nice constructor
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
49 @inline function LazyTensors.apply(H::DiagonalNorm{T}, v::AbstractVector{T}, I::Index) where T
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
50 return @inbounds apply(H, v, I)
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
53 LazyTensors.apply_transpose(H::Quadrature{Dim,T}, v::AbstractArray{T,2}, I::Index) where T = LazyTensors.apply(H,v,I)
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
55 @inline LazyTensors.apply(H::DiagonalNorm, v::AbstractVector{T}, I::Index{Lower}) where T
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
56 return @inbounds H.h*H.closure[Int(I)]*v[Int(I)]
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 end
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
58 @inline LazyTensors.apply(H::DiagonalNorm,v::AbstractVector{T}, I::Index{Upper}) where T
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 N = length(v);
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
60 return @inbounds H.h*H.closure[N-Int(I)+1]v[Int(I)]
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62
322
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
63 @inline LazyTensors.apply(H::DiagonalNorm, v::AbstractVector{T}, I::Index{Interior}) where T
777063b6f049 Dispatch applys on vararg Index instead of tuples
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 308
diff changeset
64 return @inbounds H.h*v[Int(I)]
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66
301
417b767c847f Rename DiagonalQuadrature to DiagonalNorm
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 300
diff changeset
67 function LazyTensors.apply(H::DiagonalNorm, v::AbstractVector{T}, index::Index{Unknown}) where T
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68 N = length(v);
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
69 r = getregion(Int(index), closuresize(H), N)
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
70 i = Index(Int(index), r)
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
71 return LazyTensors.apply(H, v, i)
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
72 end
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
73
301
417b767c847f Rename DiagonalQuadrature to DiagonalNorm
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 300
diff changeset
74 function closuresize(H::DiagonalNorm{T<:Real,N,M}) where {T,N,M}
300
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
75 return M
b00eea62c78e Create 1D tensor mapping for diagonal norm quadratures, and make the multi-dimensional quadrature use those. Move Qudrature from laplace.jl into Quadrature.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
76 end