From e64ed7f6a35954f8ecbd0c50cac0b17bda7d9690 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Tue, 15 Nov 2016 22:01:00 +0200 Subject: [PATCH] v0.5 fixes --- src/JuliaFEM.jl | 2 + src/abaqus.jl | 4 +- src/elements.jl | 10 ++-- src/fields.jl | 2 +- src/integrate.jl | 4 +- src/preprocess.jl | 2 +- src/preprocess_abaqus_reader.jl | 2 +- src/solvers_modal.jl | 51 +++++-------------- ..._elasticity_2d_linear_with_surface_load.jl | 2 + 9 files changed, 29 insertions(+), 50 deletions(-) diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index be969a8..810a6ac 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -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") diff --git a/src/abaqus.jl b/src/abaqus.jl index cad1681..81d2111 100644 --- a/src/abaqus.jl +++ b/src/abaqus.jl @@ -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] diff --git a/src/elements.jl b/src/elements.jl index 80c248e..6b77435 100644 --- a/src/elements.jl +++ b/src/elements.jl @@ -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 diff --git a/src/fields.jl b/src/fields.jl index 5c40590..c510171 100644 --- a/src/fields.jl +++ b/src/fields.jl @@ -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() diff --git a/src/integrate.jl b/src/integrate.jl index 8cd8ecd..921b2f2 100644 --- a/src/integrate.jl +++ b/src/integrate.jl @@ -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 diff --git a/src/preprocess.jl b/src/preprocess.jl index 075ab13..eefdc1a 100644 --- a/src/preprocess.jl +++ b/src/preprocess.jl @@ -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 diff --git a/src/preprocess_abaqus_reader.jl b/src/preprocess_abaqus_reader.jl index e4d116f..34ef294 100644 --- a/src/preprocess_abaqus_reader.jl +++ b/src/preprocess_abaqus_reader.jl @@ -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 diff --git a/src/solvers_modal.jl b/src/solvers_modal.jl index adcc6fe..3b607e4 100644 --- a/src/solvers_modal.jl +++ b/src/solvers_modal.jl @@ -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") diff --git a/test/test_elasticity_2d_linear_with_surface_load.jl b/test/test_elasticity_2d_linear_with_surface_load.jl index 489210e..d6995f7 100644 --- a/test/test_elasticity_2d_linear_with_surface_load.jl +++ b/test/test_elasticity_2d_linear_with_surface_load.jl @@ -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)