mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-21 18:33:36 +00:00
v0.5 fixes
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
# This file is a part of JuliaFEM.
|
||||
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
||||
|
||||
# __precompile__()
|
||||
|
||||
using Logging
|
||||
|
||||
if haskey(ENV, "JULIAFEM_LOGLEVEL")
|
||||
|
||||
+2
-2
@@ -423,7 +423,7 @@ function create_boundary_problem(model::Model, bc::AbstractBoundaryCondition, ::
|
||||
bc_name, bc_type, pressure = row
|
||||
bc_type == :P || error("bc_type = $bc_type != :P")
|
||||
elements = []
|
||||
for (parent_element_id, parent_element_side) in model.mesh.surfaces[bc_name]
|
||||
for (parent_element_id, parent_element_side) in model.mesh.surface_sets[bc_name]
|
||||
parent_element_type = model.mesh.element_types[parent_element_id]
|
||||
parent_element_connectivity = model.mesh.elements[parent_element_id]
|
||||
|
||||
@@ -742,7 +742,7 @@ master = create_surface_elements(mesh, :master_surf)
|
||||
"""
|
||||
function create_surface_elements(mesh::Mesh, surface_name::Symbol)
|
||||
elements = []
|
||||
for (parent_element_id, parent_element_side) in mesh.surfaces[surface_name]
|
||||
for (parent_element_id, parent_element_side) in mesh.surface_sets[surface_name]
|
||||
parent_element_type = mesh.element_types[parent_element_id]
|
||||
parent_element_connectivity = mesh.elements[parent_element_id]
|
||||
|
||||
|
||||
+5
-5
@@ -7,7 +7,7 @@ type Element{E<:AbstractElement}
|
||||
id :: Int
|
||||
connectivity :: Vector{Int}
|
||||
integration_points :: Vector{IP}
|
||||
fields :: Dict{AbstractString, Field}
|
||||
fields :: Dict{String, Field}
|
||||
properties :: E
|
||||
end
|
||||
|
||||
@@ -298,22 +298,22 @@ function update!(element::Element, datas::Pair...)
|
||||
end
|
||||
end
|
||||
|
||||
function update!(element::Element, field_name::AbstractString, data::Function)
|
||||
function update!(element::Element, field_name::String, data::Function)
|
||||
element[field_name] = data
|
||||
end
|
||||
|
||||
function update!(element::Element, field_name::AbstractString, field::Field)
|
||||
function update!(element::Element, field_name::String, field::Field)
|
||||
element[field_name] = field
|
||||
end
|
||||
|
||||
function update!(elements::Vector, field_name::AbstractString, data)
|
||||
function update!(elements::Vector, field_name::String, data)
|
||||
for element in elements
|
||||
update!(element, field_name, data)
|
||||
end
|
||||
end
|
||||
|
||||
""" Check existence of field. """
|
||||
function haskey(element::Element, field_name::AbstractString)
|
||||
function haskey(element::Element, field_name::String)
|
||||
haskey(element.fields, field_name)
|
||||
end
|
||||
|
||||
|
||||
+1
-1
@@ -334,7 +334,7 @@ function (field::DVTI)(time::Float64)
|
||||
return field
|
||||
end
|
||||
function (field::DCTI)(time::Float64)
|
||||
return field
|
||||
return field.data
|
||||
end
|
||||
function (field::CVTI)(time::Float64)
|
||||
return field.data()
|
||||
|
||||
+2
-2
@@ -73,12 +73,12 @@ end
|
||||
|
||||
function get_integration_points(element::CartesianSurfaceElement, order::Int64)
|
||||
w, xi = get_integration_points(order)
|
||||
[ (w[i]*w[j], [xi[i], xi[j]]) for i=1:order, j=1:order ]
|
||||
vec([(w[i]*w[j], [xi[i], xi[j]]) for i=1:order, j=1:order])
|
||||
end
|
||||
|
||||
function get_integration_points(element::CartesianVolumeElement, order::Int64)
|
||||
w, xi = get_integration_points(order)
|
||||
[ (w[i]*w[j]*w[k], [xi[i], xi[j], xi[k]]) for i=1:order, j=1:order, k=1:order ]
|
||||
vec([(w[i]*w[j]*w[k], [xi[i], xi[j], xi[k]]) for i=1:order, j=1:order, k=1:order])
|
||||
end
|
||||
|
||||
### triangular and tetrahedral elements
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ type Mesh
|
||||
element_types :: Dict{Int64, Symbol}
|
||||
element_codes :: Dict{Int64, Symbol}
|
||||
element_sets :: Dict{Symbol, Set{Int64}}
|
||||
surfaces :: Dict{Symbol, Vector{Tuple{Int64, Symbol}}}
|
||||
surface_sets :: Dict{Symbol, Vector{Tuple{Int64, Symbol}}}
|
||||
surface_types :: Dict{Symbol, Symbol}
|
||||
end
|
||||
|
||||
|
||||
@@ -244,7 +244,7 @@ function abaqus_read_mesh(fn)
|
||||
for (elset_name, element_ids) in model["elsets"]
|
||||
mesh.element_sets[Symbol(elset_name)] = Set(element_ids)
|
||||
end
|
||||
mesh.surfaces = model["surfaces"]
|
||||
mesh.surface_sets = model["surfaces"]
|
||||
mesh.surface_types = model["surface_types"]
|
||||
return mesh
|
||||
end
|
||||
|
||||
+13
-38
@@ -400,10 +400,11 @@ function update_xdmf!(solver::Solver{Modal}; show_info=true)
|
||||
|
||||
# 2. save topology
|
||||
|
||||
nid_mapping = Dict(j => i for (i, j) in enumerate(node_ids))
|
||||
nid_mapping = Dict(j=>i for (i, j) in enumerate(node_ids))
|
||||
|
||||
all_elements = get_all_elements(solver)
|
||||
nelements = length(all_elements)
|
||||
info("Saving topology: $nelements elements total.")
|
||||
element_types = unique(map(get_element_type, all_elements))
|
||||
|
||||
xdmf_element_mapping = Dict(
|
||||
@@ -425,8 +426,9 @@ function update_xdmf!(solver::Solver{Modal}; show_info=true)
|
||||
|
||||
topology = []
|
||||
for element_type in element_types
|
||||
info("Xdmf save: element type $element_type")
|
||||
elements = filter_by_element_type(element_type, all_elements)
|
||||
nelements = length(elements)
|
||||
info("Xdmf save: $nelements elements of type $element_type")
|
||||
sort!(elements, by=get_element_id)
|
||||
#elements = elements[1:5]
|
||||
element_ids = map(get_element_id, elements)
|
||||
@@ -460,13 +462,13 @@ function update_xdmf!(solver::Solver{Modal}; show_info=true)
|
||||
freqs = real(solver.properties.eigvals/(2.0*pi))
|
||||
for (j, freq) in enumerate(freqs)
|
||||
info("Saving frequency $(round(freq, 3))")
|
||||
|
||||
frame = new_element("Grid")
|
||||
new_child(frame, "Time", Dict("Value" => freq))
|
||||
add_child(frame, geometry)
|
||||
for topo in topology
|
||||
add_child(frame, topo)
|
||||
end
|
||||
add_child(temporal_collection, frame)
|
||||
|
||||
mode = zeros(X)
|
||||
mode_ = solver.properties.eigvecs[:,j]
|
||||
@@ -478,46 +480,19 @@ function update_xdmf!(solver::Solver{Modal}; show_info=true)
|
||||
|
||||
field_type = ndim == 1 ? "Scalar" : "Vector"
|
||||
field_center = "Node"
|
||||
unknown_field_name = get_unknown_field_name(solver)
|
||||
unknown_field_name = ucfirst(unknown_field_name)
|
||||
freqn = freqs[j]
|
||||
path = "/Results/Frequency $freqn/Nodal Fields/$unknown_field_name"
|
||||
info("Storing data to $path")
|
||||
dataitem = new_dataitem(xdmf, path, mode)
|
||||
attribute = new_child(frame, "Attribute")
|
||||
set_attribute(attribute, "Name", unknown_field_name)
|
||||
set_attribute(attribute, "Center", field_center)
|
||||
set_attribute(attribute, "AttributeType", field_type)
|
||||
add_child(attribute, dataitem)
|
||||
add_child(frame, attribute)
|
||||
|
||||
continue
|
||||
|
||||
# save solved fields
|
||||
unknown_field_name = get_unknown_field_name(solver)
|
||||
U = solver(unknown_field_name, freq)
|
||||
node_ids2 = sort(collect(keys(U)))
|
||||
|
||||
@assert node_ids == node_ids2
|
||||
ndim = length(U[first(node_ids)])
|
||||
field_type = ndim == 1 ? "Scalar" : "Vector"
|
||||
field_center = "Node"
|
||||
if ndim == 2
|
||||
for nid in node_ids
|
||||
U[nid] = [U[nid]; 0.0]
|
||||
end
|
||||
ndim = 3
|
||||
end
|
||||
U = hcat([U[nid] for nid in node_ids]...)
|
||||
unknown_field_name = ucfirst(unknown_field_name)
|
||||
unknown_field_name = ucfirst(get_unknown_field_name(solver))
|
||||
path = "/Results/Frequency $freq/Nodal Fields/$unknown_field_name"
|
||||
dataitem = new_dataitem(xdmf, path, U)
|
||||
info("Storing data to $path")
|
||||
attribute = new_child(frame, "Attribute")
|
||||
set_attribute(attribute, "Name", unknown_field_name)
|
||||
set_attribute(attribute, "Center", field_center)
|
||||
set_attribute(attribute, "AttributeType", field_type)
|
||||
add_child(attribute, dataitem)
|
||||
|
||||
add_child(attribute, new_dataitem(xdmf, path, mode))
|
||||
add_child(frame, attribute)
|
||||
#add_child(frame, new_dataitem(xdmf, "/foo$j", [1, 2, 3]))
|
||||
#add_child(temporal_collection, new_dataitem(xdmf, "/bar$j", [1, 2, 3]))
|
||||
|
||||
add_child(temporal_collection, frame)
|
||||
end
|
||||
|
||||
info("Saving Xdmf")
|
||||
|
||||
@@ -57,7 +57,9 @@ using JuliaFEM.Testing
|
||||
g = 576.0
|
||||
E = 288.0
|
||||
nu = 1/3
|
||||
u3 = block("displacement", 0.0)[3]
|
||||
u3_expected = f/E*[-nu, 1] + g/(2*E)*[-nu, 1]
|
||||
@test isapprox(u3, u3_expected)
|
||||
#=
|
||||
# fetch nodal results X + u and join them into one table using DataFrames
|
||||
X = solver(DataFrame, "geometry", :COOR)
|
||||
|
||||
Reference in New Issue
Block a user