4848@inline getindex (A:: AbstractDerivativeOperator , :: Colon , :: Colon ) = Array (A)
4949
5050@inline function getindex (A:: AbstractDerivativeOperator , :: Colon , j)
51- return Array (A)[:,j]
51+ return BandedMatrix (A)[:,j]
5252end
5353
5454
5555# symmetric right now
5656@inline function getindex (A:: AbstractDerivativeOperator , i, :: Colon )
57- return Array (A)[i,:]
57+ return BandedMatrix (A)[i,:]
5858end
5959
6060
6161# UnitRanges
6262@inline function getindex (A:: AbstractDerivativeOperator , rng:: UnitRange{Int} , :: Colon )
63- m = Array (A)
63+ m = BandedMatrix (A)
6464 return m[rng, cc]
6565end
6666
6767
6868@inline function getindex (A:: AbstractDerivativeOperator , :: Colon , rng:: UnitRange{Int} )
69- m = Array (A)
69+ m = BandedMatrix (A)
7070 return m[rnd, cc]
7171end
7272
8383
8484
8585@inline function getindex (A:: AbstractDerivativeOperator{T} , rng:: UnitRange{Int} , cng:: UnitRange{Int} ) where T
86- return Array (A)[rng,cng]
86+ return BandedMatrix (A)[rng,cng]
8787end
8888
8989#=
@@ -124,9 +124,19 @@ Base.:\(A::AbstractDerivativeOperator, B::AbstractVecOrMat) = Array(A) \ B
124124Base.:/ (A:: AbstractVecOrMat , B:: AbstractDerivativeOperator ) = A / convert (Array,B)
125125Base.:/ (A:: AbstractDerivativeOperator , B:: AbstractVecOrMat ) = Array (A) / B
126126
127- # #######################################################################
127+ #=
128+ The Inf opnorm can be calculated easily using the stencil coeffiicents, while other opnorms
129+ default to compute from the full matrix form.
130+ =#
131+ function LinearAlgebra. opnorm (A:: DerivativeOperator{T,S} , p:: Real = 2 ) where {T,S}
132+ if p == Inf
133+ sum (abs .(A. stencil_coefs)) / A. dx^ A. derivative_order
134+ else
135+ opnorm (BandedMatrix (A), p)
136+ end
137+ end
128138
129- # Are these necessary?
139+ # #######################################################################
130140
131141get_type (:: AbstractDerivativeOperator{T} ) where {T} = T
132142
@@ -138,23 +148,19 @@ end
138148
139149
140150function * (A:: AbstractDerivativeOperator ,M:: AbstractMatrix )
141- y = zeros (promote_type (eltype (A),eltype (M)), size (M ))
151+ y = zeros (promote_type (eltype (A),eltype (M)), size (A, 1 ), size (M, 2 ))
142152 LinearAlgebra. mul! (y, A:: AbstractDerivativeOperator , M:: AbstractMatrix )
143153 return y
144154end
145155
146156
147157function * (M:: AbstractMatrix ,A:: AbstractDerivativeOperator )
148- y = zeros (promote_type (eltype (A),eltype (M)), size (M))
149- LinearAlgebra. mul! (y, A :: AbstractDerivativeOperator , M :: AbstractMatrix )
158+ y = zeros (promote_type (eltype (A),eltype (M)), size (M, 1 ), size (A, 2 ))
159+ LinearAlgebra. mul! (y, M, BandedMatrix (A) )
150160 return y
151161end
152162
153- #=
154- # For now use slow fallback
163+
155164function * (A:: AbstractDerivativeOperator ,B:: AbstractDerivativeOperator )
156- # TODO : it will result in an operator which calculates
157- # the derivative of order A.dorder + B.dorder of
158- # approximation_order = min(approx_A, approx_B)
165+ return BandedMatrix (A)* BandedMatrix (B)
159166end
160- =#
0 commit comments