The question that follows was raised earlier at e.g. performance-enhancement-for-setindex-for-sparse-array.
I remain confused regarding the use of sparse(Is,Js,As,[n,n]). profview shows that computation time is spend in setindex!.
The code that follows
"""
genLocStiffMat(element::Element)
Generates local stiffness matrix for single linear triangular element.
"""
function genLocStiffMat(element::Element)
v = SVector(element.e1, element.e2, element.e3)
Emat = copy(element.Emat)
area = element.area
reluctivity = element.physics.reluctivity
Iloc = SVector{9}(v[i] for j=1:3, i=1:3)
Jloc = SVector{9}(v[i] for i=1:3, j=1:3)
Emat[3,:] .= 0.;
Amat = SMatrix{3,3}(area*reluctivity*(transpose(Emat)*Emat))
Aloc = vec(Amat)
return Iloc, Jloc, Aloc
end
"""
genStiffMat(mesh::Mesh)
Generates global stiffness matrix on mesh of linear triangular elements.
"""
function genStiffMat(mesh::Mesh)
#..recover number of elements
nnodes = mesh.nnodes
nelems = mesh.nelems
dofPerElem = mesh.dofPerElem
dofPerElem2 = dofPerElem^2
#..set range vector
irng = SVector{9}(1:9)
#..preallocate the memory for local matrix contributions
Avalues = zeros(Float64,dofPerElem2*nelems)
I = zeros(Int64,length(Avalues))
J = zeros(Int64,length(Avalues))
#..loop over number of elements..
for element in mesh.Elements
Iloc, Jloc, Aloc = genLocStiffMat(element)
I[irng] .= Iloc
J[irng] .= Jloc
Avalues[irng] .= Aloc
irng = irng.+dofPerElem2
end
#..form sparse matrix
A = sparse(I,J,Avalues,nnodes,nnodes)
return A;
end
indeed has a Profvview as shown below.
Thanks.
