Mercurial > repos > public > sbplib_julia
annotate SbpOperators/src/d2.jl @ 263:b577b5f64530 boundary_conditions
Add lazy elementwise operations for array with scalar
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Wed, 04 Dec 2019 19:02:18 +0100 |
parents | f89718833620 |
children | ccef055233a2 |
rev | line source |
---|---|
253
396eadb652bd
Rename function closureSize to closuresize
Jonatan Werpers <jonatan@werpers.com>
parents:
249
diff
changeset
|
1 export D2, closuresize, readOperator, apply_e, apply_d, apply_e_T, apply_d_T |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
2 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
3 @enum Parity begin |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
4 odd = -1 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
5 even = 1 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
6 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
7 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
8 struct D2{T,N,M,K} <: ConstantStencilOperator |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
9 quadratureClosure::NTuple{M,T} |
260
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
10 inverseQuadratureClosure::NTuple{M,T} |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
11 innerStencil::Stencil{T,N} |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
12 closureStencils::NTuple{M,Stencil{T,K}} |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
13 eClosure::Stencil{T,M} |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
14 dClosure::Stencil{T,M} |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
15 parity::Parity |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
16 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
17 |
253
396eadb652bd
Rename function closureSize to closuresize
Jonatan Werpers <jonatan@werpers.com>
parents:
249
diff
changeset
|
18 function closuresize(D::D2)::Int |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
19 return length(D.quadratureClosure) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
20 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
21 |
260
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
22 # TODO: Dispatch on Index{R}? |
254
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
23 apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer, ::Type{Lower}) where T = v*h*op.quadratureClosure[i] |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
24 apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer, ::Type{Upper}) where T = v*h*op.quadratureClosure[N-i+1] |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
25 apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer, ::Type{Interior}) where T = v*h |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
26 |
260
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
27 # TODO: Avoid branching in inner loops |
254
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
28 function apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer) where T |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
29 r = getregion(i, closuresize(op), N) |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
30 return apply_quadrature(op, h, v, i, N, r) |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
31 end |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
32 export apply_quadrature |
4ca3794fffef
Add apply_quadrature to SbpOperators
Jonatan Werpers <jonatan@werpers.com>
parents:
253
diff
changeset
|
33 |
260
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
34 # TODO: Dispatch on Index{R}? |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
35 apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer, ::Type{Lower}) where T = v*h_inv*op.inverseQuadratureClosure[i] |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
36 apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer, ::Type{Upper}) where T = v*h_inv*op.inverseQuadratureClosure[N-i+1] |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
37 apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer, ::Type{Interior}) where T = v*h_inv |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
38 |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
39 # TODO: Avoid branching in inner loops |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
40 function apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer) where T |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
41 r = getregion(i, closuresize(op), N) |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
42 return apply_inverse_quadrature(op, h_inv, v, i, N, r) |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
43 end |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
44 export apply_inverse_quadrature |
f89718833620
Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
254
diff
changeset
|
45 |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
46 function apply_e_T(op::D2, v::AbstractVector, ::Type{Lower}) |
253
396eadb652bd
Rename function closureSize to closuresize
Jonatan Werpers <jonatan@werpers.com>
parents:
249
diff
changeset
|
47 @boundscheck if length(v) < closuresize(op) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
48 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
49 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
50 apply(op.eClosure,v,1) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
51 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
52 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
53 function apply_e_T(op::D2, v::AbstractVector, ::Type{Upper}) |
253
396eadb652bd
Rename function closureSize to closuresize
Jonatan Werpers <jonatan@werpers.com>
parents:
249
diff
changeset
|
54 @boundscheck if length(v) < closuresize(op) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
55 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
56 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
57 apply(flip(op.eClosure),v,length(v)) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
58 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
59 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
60 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
61 function apply_e(op::D2, v::Number, N::Integer, i::Integer, ::Type{Lower}) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
62 @boundscheck if !(0<length(i) <= N) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
63 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
64 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
65 op.eClosure[i-1]*v |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
66 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
67 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
68 function apply_e(op::D2, v::Number, N::Integer, i::Integer, ::Type{Upper}) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
69 @boundscheck if !(0<length(i) <= N) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
70 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
71 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
72 op.eClosure[N-i]*v |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
73 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
74 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
75 function apply_d_T(op::D2, h_inv::Real, v::AbstractVector, ::Type{Lower}) |
253
396eadb652bd
Rename function closureSize to closuresize
Jonatan Werpers <jonatan@werpers.com>
parents:
249
diff
changeset
|
76 @boundscheck if length(v) < closuresize(op) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
77 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
78 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
79 h_inv*apply(op.dClosure,v,1) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
80 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
81 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
82 function apply_d_T(op::D2, h_inv::Real, v::AbstractVector, ::Type{Upper}) |
253
396eadb652bd
Rename function closureSize to closuresize
Jonatan Werpers <jonatan@werpers.com>
parents:
249
diff
changeset
|
83 @boundscheck if length(v) < closuresize(op) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
84 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
85 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
86 -h_inv*apply(flip(op.dClosure),v,length(v)) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
87 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
88 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
89 function apply_d(op::D2, h_inv::Real, v::Number, N::Integer, i::Integer, ::Type{Lower}) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
90 @boundscheck if !(0<length(i) <= N) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
91 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
92 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
93 h_inv*op.dClosure[i-1]*v |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
94 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
95 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
96 function apply_d(op::D2, h_inv::Real, v::Number, N::Integer, i::Integer, ::Type{Upper}) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
97 @boundscheck if !(0<length(i) <= N) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
98 throw(BoundsError()) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
99 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
100 -h_inv*op.dClosure[N-i]*v |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
101 end |