2025-11-08 11:08:10 +02:00
|
|
|
# This file is a part of JuliaFEM.
|
|
|
|
|
# License is MIT: see https://github.com/JuliaFEM/FEMSparse.jl/blob/master/LICENSE
|
|
|
|
|
|
|
|
|
|
mutable struct SparseVectorDOK{Tv,Ti<:Integer} <: AbstractSparseArray{Tv,Ti,1}
|
2025-11-08 11:25:13 +02:00
|
|
|
data::Dict{Ti,Tv}
|
2025-11-08 11:08:10 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function SparseVectorDOK()
|
2025-11-08 11:25:13 +02:00
|
|
|
return SparseVectorDOK(Dict{Int64,Float64}())
|
2025-11-08 11:08:10 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function SparseVectorDOK{Tv,Ti<:Integer}(b::SparseVector{Tv,Ti})
|
|
|
|
|
I, V = findnz(b)
|
|
|
|
|
c = SparseVectorDOK()
|
|
|
|
|
add!(c, I, V)
|
|
|
|
|
return c
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function SparseVectorDOK{T}(b::Vector{T})
|
|
|
|
|
return SparseVectorDOK(sparsevec(b))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function add!{Tv,Ti<:Integer}(b::SparseVectorDOK{Tv,Ti}, i::Ti, v::Tv)
|
|
|
|
|
b.data[i] = get(b, i) + v
|
|
|
|
|
return nothing
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function add!{Tv,Ti<:Integer}(b::SparseVectorDOK{Tv,Ti}, dofs::Vector{Ti}, data::Vector{Tv})
|
|
|
|
|
@assert length(dofs) == length(data)
|
|
|
|
|
z = Tv(0)
|
2025-11-08 11:25:13 +02:00
|
|
|
for i = 1:length(dofs)
|
2025-11-08 11:08:10 +02:00
|
|
|
@inbounds b.data[dofs[i]] = Base.get(b.data, i, z) + data[i]
|
|
|
|
|
end
|
|
|
|
|
return nothing
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function get{Tv,Ti<:Integer}(b::SparseVectorDOK{Tv,Ti}, i::Ti)
|
|
|
|
|
return Base.get(b.data, i, Tv(0))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function get!{Tv,Ti<:Integer}(b::SparseVectorDOK{Tv,Ti}, dofs::Vector{Ti}, data::Vector{Tv})
|
2025-11-08 11:25:13 +02:00
|
|
|
for (i, j) in enumerate(dofs)
|
2025-11-08 11:08:10 +02:00
|
|
|
data[i] = get(b, i)
|
|
|
|
|
end
|
|
|
|
|
return nothing
|
|
|
|
|
end
|
|
|
|
|
|