keep working on csc assembly

This commit is contained in:
Kristoffer Carlsson
2018-10-28 20:40:55 -04:00
parent cd22d1a571
commit 32ac97f4b1
4 changed files with 23 additions and 27 deletions
+2
View File
@@ -108,6 +108,8 @@ module JuliaFEM
using SparseArrays, LinearAlgebra, Statistics
using Reexport, ForwardDiff, LightXML, HDF5, Parameters
import FEMSparse
@reexport using FEMBase
import FEMBase: get_unknown_field_name, get_unknown_field_dimension,
assemble!, update!, initialize!
+3 -3
View File
@@ -88,9 +88,9 @@ function assemble!(problem::Problem{Dirichlet}, time::Float64=0.0;
end
end
for (k, v) in field_vals
add!(problem.assembly.C1, k, k, 1.0)
add!(problem.assembly.C2, k, k, 1.0)
add!(problem.assembly.g, k, 1, v)
FEMBase.add!(problem.assembly.C1, k, k, 1.0)
FEMBase.add!(problem.assembly.C2, k, k, 1.0)
FEMBase.add!(problem.assembly.g, k, 1, v)
end
end
+9 -14
View File
@@ -73,7 +73,7 @@ end
function assemble!(assembly::Assembly, problem::Problem{Elasticity},
elements::Vector{<:Element}, time, formulation)
local_buffer = allocate_buffer(problem, elements)
assembler = FEMBase.start_assemble(assembly.K)
assembler = FEMSparse.start_assemble(assembly.K, assembly.f)
for element in elements
assemble_element!(assembly, assembler, problem, element, local_buffer, time, formulation)
end
@@ -168,7 +168,7 @@ end
""" Assemble 3d continuum elements in general solid mechanics problem. """
function assemble_element!(assembly::Assembly,
assembler::FEMBase.AssemblerSparsityPattern,
assembler::FEMSparse.AssemblerSparsityPattern,
problem::Problem{Elasticity},
element::Element{El},
local_buffer::Elasticity3DLocalBuffers,
@@ -341,12 +341,9 @@ function assemble_element!(assembly::Assembly,
# internal load
mul!(Bt_mul_S, transpose(BL), stress_vec)
rmul!(Bt_mul_S, w)
for i=1:ndofs
@inbounds f_int[i] += Bt_mul_S[i]
end
f_int .+= Bt_mul_S
# external load start
if haskey(element, "displacement load")
T = element("displacement load", ip, time)
f_ext += w*vec(T*N)
@@ -358,22 +355,21 @@ function assemble_element!(assembly::Assembly,
f_ext[i:dim:end] += w*vec(b*N)
end
end
# external load end
end
gdofs = get_gdofs(problem, element)
# Update f_ext in place to be f_ext - f_int
f_ext .-= f_int
# add contributions to K, Kg, f
FEMBase.assemble_local_matrix!(assembler, gdofs, Km)
FEMSparse.assemble_local!(assembler, gdofs, Km, f_ext)
if props.geometric_stiffness
add!(assembly.Kg, gdofs, gdofs, Kg)
FEMSparse.assemble_local_matrix!(assembler, gdofs, Kg)
end
add!(assembly.f, gdofs, f_ext - f_int)
return nothing
end
@@ -424,8 +420,7 @@ function assemble!(assembly::Assembly,
end
gdofs = get_gdofs(problem, element)
add!(assembly.f, gdofs, f)
FEMSparse.assemble_local_vector!(assembly.f, gdofs, f)
end
end
+9 -10
View File
@@ -58,17 +58,17 @@ function get_field_assembly(solver::Solver)
problems = get_field_problems(solver)
problem = problems[1]
M = SparseMatrixCOO()
K = spzeros(size(problems[1].assembly.K)...)
Kg = SparseMatrixCOO()
f = SparseMatrixCOO()
fg = SparseMatrixCOO()
M = problem.assembly.M
K = problem.assembly.K
f = problem.assembly.f
Kg = problem.assembly.Kg
fg = problem.assembly.fg
for problem in problems
for problem in problems[2:end]
append!(M, problem.assembly.M)
K += problem.assembly.K
append!(Kg, problem.assembly.Kg)
append!(f, problem.assembly.f)
f += problem.assembly.f
append!(fg, problem.assembly.fg)
end
@@ -80,7 +80,6 @@ function get_field_assembly(solver::Solver)
"pushed to problem and formulation is correct.")
end
Kg = sparse(Kg, N, N)
f = sparse(f, N, 1)
fg = sparse(fg, N, 1)
return M, K, Kg, f, fg
@@ -146,7 +145,7 @@ function get_boundary_assembly(solver::Solver, N)
C1_ = sparse(assembly.C1, N, N)
C2_ = sparse(assembly.C2, N, N)
D_ = sparse(assembly.D, N, N)
f_ = sparse(assembly.f, N, 1)
# f_ = assembly.f
g_ = sparse(assembly.g, N, 1)
for dof in assembly.removed_dofs
@info("$(problem.name): removing dof $dof from assembly")
@@ -171,7 +170,7 @@ function get_boundary_assembly(solver::Solver, N)
C1 += C1_
C2 += C2_
D += D_
f += f_
#f += f_
g += g_
end
return K, C1, C2, D, f, g