mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-22 10:48:32 +00:00
Merge branch 'master' into kc/local_buffer
This commit is contained in:
+1
-1
@@ -119,7 +119,7 @@ using TimerOutputs
|
||||
export @timeit, print_timer
|
||||
|
||||
import Base: getindex, setindex!, convert, length, size, isapprox,
|
||||
similar, start, first, next, done, last, endof, vec,
|
||||
similar, first, last, vec,
|
||||
==, +, -, *, /, haskey, copy, push!, isempty, empty!,
|
||||
append!, read, copy
|
||||
|
||||
|
||||
@@ -328,6 +328,29 @@ global const xdmf_element_mapping = Dict(
|
||||
"Wedge15" => "Wedge_15",
|
||||
"Hex20" => "Hex_20")
|
||||
|
||||
get_xdmf_element_code(::Element{Poi1}) = 1
|
||||
get_xdmf_element_code(::Element{Seg2}) = 2
|
||||
# get_xdmf_element_code(::Element{Polygon}) = 3
|
||||
get_xdmf_element_code(::Element{Tri3}) = 4
|
||||
get_xdmf_element_code(::Element{Quad4}) = 5
|
||||
get_xdmf_element_code(::Element{Tet4}) = 6
|
||||
get_xdmf_element_code(::Element{Pyr5}) = 7
|
||||
get_xdmf_element_code(::Element{Wedge6}) = 8
|
||||
get_xdmf_element_code(::Element{Hex8}) = 9
|
||||
# get_xdmf_element_code(::Element{Polyhedron}) = 16
|
||||
|
||||
get_xdmf_element_code(::Element{Seg3}) = 34
|
||||
get_xdmf_element_code(::Element{Quad9}) = 35
|
||||
get_xdmf_element_code(::Element{Tri6}) = 36
|
||||
get_xdmf_element_code(::Element{Quad8}) = 37
|
||||
get_xdmf_element_code(::Element{Tet10}) = 38
|
||||
# get_xdmf_element_code(::Element{Pyr13}) = 39
|
||||
get_xdmf_element_code(::Element{Wedge15}) = 40
|
||||
# get_xdmf_element_code(::Element{Wedge18}) = 41
|
||||
get_xdmf_element_code(::Element{Hex20}) = 48
|
||||
# get_xdmf_element_code(::Element{Hex24}) = 49
|
||||
get_xdmf_element_code(::Element{Hex27}) = 50
|
||||
|
||||
"""
|
||||
get_spatial_collection()
|
||||
|
||||
@@ -416,27 +439,48 @@ function update_xdmf!(xdmf::Xdmf, problem::Problem, time::Float64, fields::Vecto
|
||||
add_child(geometry, X_dataitem)
|
||||
|
||||
# 5. save topology
|
||||
all_elements = get_elements(problem)
|
||||
nelements = length(all_elements)
|
||||
element_types = unique(map(get_element_type, all_elements))
|
||||
nelement_types = length(element_types)
|
||||
@debug("Xdmf: Saving topology of $nelements elements total, $nelement_types different element types.")
|
||||
|
||||
for element_type in element_types
|
||||
elements = collect(filter_by_element_type(element_type, all_elements))
|
||||
nelements = length(elements)
|
||||
@debug("Xdmf: $nelements elements of type $element_type")
|
||||
sort!(elements, by=get_element_id)
|
||||
element_ids = map(get_element_id, elements)
|
||||
element_conn = map(element -> [node_mapping[j]-1 for j in get_connectivity(element)], elements)
|
||||
element_conn = hcat(element_conn...)
|
||||
element_code = split(string(element_type), ".")[end]
|
||||
mesh_type = "unstructured"
|
||||
if mesh_type == "unstructured"
|
||||
element_conn = Int64[]
|
||||
for element in get_elements(problem)
|
||||
xdmf_element_code = get_xdmf_element_code(element)
|
||||
xdmf_element_code > 0 || continue
|
||||
push!(element_conn, xdmf_element_code)
|
||||
if xdmf_element_code == 2
|
||||
push!(element_conn, length(element))
|
||||
end
|
||||
for j in get_connectivity(element)
|
||||
push!(element_conn, node_mapping[j]-1)
|
||||
end
|
||||
end
|
||||
topology_dataitem = new_dataitem(xdmf, element_conn)
|
||||
|
||||
topology = new_child(frame, "Topology")
|
||||
set_attribute(topology, "TopologyType", xdmf_element_mapping[element_code])
|
||||
set_attribute(topology, "NumberOfElements", length(elements))
|
||||
set_attribute(topology, "TopologyType", "Mixed")
|
||||
add_child(topology, topology_dataitem)
|
||||
else
|
||||
all_elements = get_elements(problem)
|
||||
nelements = length(all_elements)
|
||||
element_types = unique(map(get_element_type, all_elements))
|
||||
nelement_types = length(element_types)
|
||||
@debug("Xdmf: Saving topology of $nelements elements total, $nelement_types different element types.")
|
||||
if nelement_types != 1
|
||||
error("Xdmf: only single type of element supported by structured grid type!")
|
||||
end
|
||||
for element_type in element_types
|
||||
elements = collect(filter_by_element_type(element_type, all_elements))
|
||||
nelements = length(elements)
|
||||
@debug("Xdmf: $nelements elements of type $element_type")
|
||||
sort!(elements, by=get_element_id)
|
||||
element_ids = map(get_element_id, elements)
|
||||
element_conn = map(element -> [node_mapping[j]-1 for j in get_connectivity(element)], elements)
|
||||
element_conn = hcat(element_conn...)
|
||||
element_code = split(string(element_type), ".")[end]
|
||||
topology_dataitem = new_dataitem(xdmf, element_conn)
|
||||
topology = new_child(frame, "Topology")
|
||||
set_attribute(topology, "TopologyType", xdmf_element_mapping[element_code])
|
||||
set_attribute(topology, "NumberOfElements", length(elements))
|
||||
add_child(topology, topology_dataitem)
|
||||
end
|
||||
end
|
||||
|
||||
# 6. save requested fields
|
||||
@@ -444,7 +488,11 @@ function update_xdmf!(xdmf::Xdmf, problem::Problem, time::Float64, fields::Vecto
|
||||
field_dict = problem(field_name, time)
|
||||
field_center = "Node"
|
||||
field_node_ids = sort(collect(keys(field_dict)))
|
||||
@assert node_ids == field_node_ids
|
||||
if node_ids != field_node_ids
|
||||
@error("geom node ids = $node_ids")
|
||||
@error("field node ids = $field_node_ids")
|
||||
error("!=, geometry does not match with field.")
|
||||
end
|
||||
field_dim = length(field_dict[first(field_node_ids)])
|
||||
if field_dim == 2
|
||||
@debug("Xdmf: Field dimension = 2, extending to 3")
|
||||
|
||||
@@ -154,9 +154,39 @@ function allocate_buffer(problem::Problem{Elasticity}, ::Vector{Element{El}}) wh
|
||||
nnodes = length(El)
|
||||
ndofs = dim*nnodes
|
||||
|
||||
<<<<<<< HEAD
|
||||
return Elasticity3DLocalBuffers(ndofs=ndofs, dim=dim, bi = BasisInfo(El))
|
||||
end
|
||||
|
||||
=======
|
||||
for element in elements
|
||||
|
||||
u = element("displacement", time)
|
||||
X = element("geometry", time)
|
||||
|
||||
fill!(Km, 0.0)
|
||||
fill!(Kg, 0.0)
|
||||
fill!(f_int, 0.0)
|
||||
fill!(f_ext, 0.0)
|
||||
|
||||
for ip in get_integration_points(element)
|
||||
eval_basis!(bi, X, ip)
|
||||
w = ip.weight*bi.detJ
|
||||
N = bi.N
|
||||
dN = bi.grad # deriatives of basis functions w.r.t. X, i.e. ∂N/∂X
|
||||
grad!(bi, gradu, u) # displacement gradient ∇u
|
||||
|
||||
# calculate strain tensor and deformation gradient
|
||||
fill!(strain, 0.0)
|
||||
fill!(F, 0.0)
|
||||
F[:,:] += I
|
||||
if props.finite_strain
|
||||
strain[:,:] = 1/2 * (gradu + gradu' + gradu'*gradu)
|
||||
F[:,:] += gradu
|
||||
else
|
||||
strain[:,:] = 1/2 * (gradu + gradu')
|
||||
end
|
||||
>>>>>>> master
|
||||
|
||||
function reset_element!(buf::Elasticity3DLocalBuffers)
|
||||
fill!(buf.Km, 0.0)
|
||||
@@ -175,6 +205,7 @@ function reset_integration_point!(buf::Elasticity3DLocalBuffers)
|
||||
return
|
||||
end
|
||||
|
||||
<<<<<<< HEAD
|
||||
function to_voigt!(strain_vec, strain)
|
||||
strain_vec[1] = strain[1,1]
|
||||
strain_vec[2] = strain[2,2]
|
||||
@@ -184,6 +215,16 @@ function to_voigt!(strain_vec, strain)
|
||||
strain_vec[6] = 2.0*strain[1,3]
|
||||
return
|
||||
end
|
||||
=======
|
||||
fill!(D, 0.0)
|
||||
E = element("youngs modulus", ip, time)::Float64
|
||||
nu = element("poissons ratio", ip, time)::Float64
|
||||
la = E*nu/((1.0+nu)*(1.0-2.0*nu))
|
||||
mu = E/(2.0*(1.0+nu))
|
||||
D[1,1] = D[2,2] = D[3,3] = 2*mu + la
|
||||
D[4,4] = D[5,5] = D[6,6] = mu
|
||||
D[1,2] = D[2,1] = D[2,3] = D[3,2] = D[1,3] = D[3,1] = la
|
||||
>>>>>>> master
|
||||
|
||||
const u = ([0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0])
|
||||
const X = ([-93.7197, -93.7197, 150.883], [-91.657, -85.8251, 157.885], [-100.523, -88.8309, 157.883], [-91.6593, -88.8309, 157.883], [-92.6883, -89.7724, 154.384], [-96.0902, -87.328, 157.883], [-97.1216, -91.2753, 154.383], [-92.6895, -91.2753, 154.383], [-91.6581, -87.328, 157.883], [-96.0914, -88.8309, 157.883])
|
||||
|
||||
@@ -289,7 +289,7 @@ function update_xdmf!(solver::Solver{Modal})
|
||||
# save modes
|
||||
|
||||
temporal_collection = get_temporal_collection(xdmf)
|
||||
unknown_field_name = ucfirst(get_unknown_field_name(solver))
|
||||
unknown_field_name = uppercasefirst(get_unknown_field_name(solver))
|
||||
frames = []
|
||||
|
||||
@timeit "save modes" for (j, eigval) in enumerate(real(solver.properties.eigvals))
|
||||
|
||||
Reference in New Issue
Block a user