Skip to content
This repository was archived by the owner on Jul 19, 2023. It is now read-only.

Commit 0db40b7

Browse files
author
AndiMD
committed
Add distinct type for grid vs. function value
1 parent 76f0105 commit 0db40b7

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

src/derivative_operators/BC_operators.jl

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ struct RobinBC{T, V<:AbstractVector{T}} <: AffineBC{T}
2222
b_l::T
2323
a_r::V
2424
b_r::T
25-
function RobinBC(l::NTuple{3,T}, r::NTuple{3,T}, dx::T, order = 1) where {T}
25+
function RobinBC(l::NTuple{3,T}, r::NTuple{3,T}, dx::U, order = 1) where {T,U}
2626
αl, βl, γl = l
2727
αr, βr, γr = r
2828

29-
s = calculate_weights(1, one(T), Array(one(T):convert(T,order+1))) #generate derivative coefficients about the boundary of required approximation order
29+
s = calculate_weights(1, one(U), Array(one(U):convert(U,order+1))) #generate derivative coefficients about the boundary of required approximation order
3030

3131
a_l = -s[2:end]./(αl*dx/βl + s[1])
3232
a_r = s[end:-1:2]./(αr*dx/βr - s[1]) # for other boundary stencil is flippedlr with *opposite sign*
@@ -36,14 +36,14 @@ struct RobinBC{T, V<:AbstractVector{T}} <: AffineBC{T}
3636

3737
return new{T, typeof(a_l)}(a_l, b_l, a_r, b_r)
3838
end
39-
function RobinBC(l::Union{NTuple{3,T},AbstractVector{T}}, r::Union{NTuple{3,T},AbstractVector{T}}, dx::AbstractVector{T}, order = 1) where {T}
39+
function RobinBC(l::Union{NTuple{3,T},AbstractVector{T}}, r::Union{NTuple{3,T},AbstractVector{T}}, dx::AbstractVector{U}, order = 1) where {T,U}
4040
αl, βl, γl = l
4141
αr, βr, γr = r
4242

43-
s_index = Array(one(T):convert(T,order+1))
43+
s_index = Array(one(U):convert(U,order+1))
4444
dx_l, dx_r = dx[1:length(s_index)], dx[(end-length(s_index)+1):end]
4545

46-
s = calculate_weights(1, one(T), s_index) #generate derivative coefficients about the boundary of required approximation order
46+
s = calculate_weights(1, one(U), s_index) #generate derivative coefficients about the boundary of required approximation order
4747
denom_l = αl+βl*s[1]/dx_l[1]
4848
denom_r = αr-βr*s[1]/dx_r[end]
4949

@@ -76,24 +76,24 @@ struct GeneralBC{T, L<:AbstractVector{T}, R<:AbstractVector{T}} <:AffineBC{T}
7676
b_l::T
7777
a_r::R
7878
b_r::T
79-
function GeneralBC(αl::AbstractVector{T}, αr::AbstractVector{T}, dx::T, order = 1) where {T}
79+
function GeneralBC(αl::AbstractVector{T}, αr::AbstractVector{T}, dx::U, order = 1) where {T,U}
8080
nl = length(αl)
8181
nr = length(αr)
8282
S_l = zeros(T, (nl-2, order+nl-2))
8383
S_r = zeros(T, (nr-2, order+nr-2))
8484

8585
for i in 1:(nl-2)
86-
S_l[i,:] = [transpose(calculate_weights(i, one(T), Array(one(T):convert(T, order+i)))) transpose(zeros(T, Int(nl-2-i)))]./(dx^i) #am unsure if the length of the dummy_x is correct here
86+
S_l[i,:] = [transpose(calculate_weights(i, one(U), Array(one(U):convert(U, order+i)))) transpose(zeros(U, Int(nl-2-i)))]./(dx^i) #am unsure if the length of the dummy_x is correct here
8787
end
8888

8989
for i in 1:(nr-2)
90-
S_r[i,:] = [transpose(calculate_weights(i, convert(T, order+i), Array(one(T):convert(T, order+i)))) transpose(zeros(T, Int(nr-2-i)))]./(dx^i)
90+
S_r[i,:] = [transpose(calculate_weights(i, convert(U, order+i), Array(one(U):convert(U, order+i)))) transpose(zeros(U, Int(nr-2-i)))]./(dx^i)
9191
end
9292
s0_l = S_l[:,1] ; Sl = S_l[:,2:end]
9393
s0_r = S_r[:,end] ; Sr = S_r[:,(end-1):-1:1]
9494

95-
denoml = αl[2] .+ αl[3:end] s0_l
96-
denomr = αr[2] .+ αr[3:end] s0_r
95+
denoml = αl[2] .+ αl[3:end]' s0_l
96+
denomr = αr[2] .+ αr[3:end]' s0_r
9797

9898
a_l = -transpose(transpose(αl[3:end]) * Sl) ./denoml
9999
a_r = reverse(-transpose(transpose(αr[3:end]) * Sr) ./denomr)
@@ -103,7 +103,7 @@ struct GeneralBC{T, L<:AbstractVector{T}, R<:AbstractVector{T}} <:AffineBC{T}
103103
new{T, typeof(a_l), typeof(a_r)}(a_l,b_l,a_r,b_r)
104104
end
105105

106-
function GeneralBC(αl::AbstractVector{T}, αr::AbstractVector{T}, dx::AbstractVector{T}, order = 1) where {T}
106+
function GeneralBC(αl::AbstractVector{T}, αr::AbstractVector{T}, dx::AbstractVector{U}, order = 1) where {T,U}
107107

108108
nl = length(αl)
109109
nr = length(αr)
@@ -112,17 +112,17 @@ struct GeneralBC{T, L<:AbstractVector{T}, R<:AbstractVector{T}} <:AffineBC{T}
112112
S_r = zeros(T, (nr-2, order+nr-2))
113113

114114
for i in 1:(nl-2)
115-
S_l[i,:] = [transpose(calculate_weights(i, one(T), Array(one(T):convert(T, order+i)))) transpose(zeros(T, Int(nl-2-i)))]./(dx_l.^i)
115+
S_l[i,:] = [transpose(calculate_weights(i, one(U), Array(one(U):convert(U, order+i)))) transpose(zeros(U, Int(nl-2-i)))]./(dx_l.^i)
116116
end
117117

118118
for i in 1:(nr-2)
119-
S_r[i,:] = [transpose(calculate_weights(i, convert(T, order+i), Array(one(T):convert(T, order+i)))) transpose(zeros(T, Int(nr-2-i)))]./(dx_r.^i)
119+
S_r[i,:] = [transpose(calculate_weights(i, convert(U, order+i), Array(one(U):convert(U, order+i)))) transpose(zeros(U, Int(nr-2-i)))]./(dx_r.^i)
120120
end
121121
s0_l = S_l[:,1] ; Sl = S_l[:,2:end]
122122
s0_r = S_r[:,end] ; Sr = S_r[:,(end-1):-1:1]
123123

124-
denoml = αl[2] .+ αl[3:end] s0_l
125-
denomr = αr[2] .+ αr[3:end] s0_r
124+
denoml = αl[2] .+ αl[3:end]' s0_l
125+
denomr = αr[2] .+ αr[3:end]' s0_r
126126

127127
a_l = -transpose(transpose(αl[3:end]) * Sl) ./denoml
128128
a_r = reverse(-transpose(transpose(αr[3:end]) * Sr) ./denomr)
@@ -145,7 +145,7 @@ Neumann0BC(dx::Union{AbstractVector{T}, T}, order = 1) where T = NeumannBC((zero
145145
# other acceptable argument signatures
146146
#RobinBC(al::T, bl::T, cl::T, dx_l::T, ar::T, br::T, cr::T, dx_r::T, order = 1) where T = RobinBC([al,bl, cl], [ar, br, cr], dx_l, order)
147147

148-
Base.:*(Q::AffineBC, u::AbstractVector) = BoundaryPaddedVector(Q.a_l u[1:length(Q.a_l)] + Q.b_l, Q.a_r u[(end-length(Q.a_r)+1):end] + Q.b_r, u)
148+
Base.:*(Q::AffineBC, u::AbstractVector) = BoundaryPaddedVector(Q.a_l' u[1:length(Q.a_l)] + Q.b_l, Q.a_r' u[(end-length(Q.a_r)+1):end] + Q.b_r, u)
149149
Base.:*(Q::PeriodicBC, u::AbstractVector) = BoundaryPaddedVector(u[end], u[1], u)
150150

151151
Base.size(Q::AtomicBC) = (Inf, Inf) #Is this nessecary?

0 commit comments

Comments
 (0)