diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index 8033acc..76e5816 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -128,7 +128,7 @@ module Preprocess include("preprocess.jl") export create_elements, Mesh, add_node!, add_nodes!, add_element!, add_elements!, add_element_to_element_set!, add_node_to_node_set!, - find_nearest_nodes, reorder_element_connectivity! + find_nearest_nodes, reorder_element_connectivity!, create_node_set_from_element_set! include("preprocess_abaqus_reader.jl") export parse_abaqus, parse_section, parse_element_section, abaqus_read_mesh, abaqus_read_model diff --git a/src/preprocess.jl b/src/preprocess.jl index 0a8ef78..773f127 100644 --- a/src/preprocess.jl +++ b/src/preprocess.jl @@ -50,12 +50,16 @@ function add_node_to_node_set!(mesh::Mesh, set_name, nids...) end """ Create a new node set from nodes in element set. """ -function create_node_set_from_element_set!(mesh::Mesh, set_name) - node_ids = Set{Int}() - for elid in mesh.element_sets[set_name] - push!(node_ids, mesh.elements[elid]...) +function create_node_set_from_element_set!(mesh::Mesh, set_names::String...) + for set_name in set_names + set_name = Symbol(set_name) + info("Creating node set $set_name from element set") + node_ids = Set{Int}() + for elid in mesh.element_sets[set_name] + push!(node_ids, mesh.elements[elid]...) + end + mesh.node_sets[set_name] = node_ids end - mesh.node_sets[set_name] = node_ids return end @@ -145,14 +149,20 @@ end """ find npts nearest nodes from mesh and return id numbers as list. """ -function find_nearest_nodes(mesh::Mesh, coords::Vector, npts=1) +function find_nearest_nodes(mesh::Mesh, coords::Vector{Float64}, npts::Int=1; node_set=nothing) dist = Dict{Int, Float64}() for (nid, c) in mesh.nodes + if node_set != nothing && !(nid in mesh.node_sets[Symbol(node_set)]) + continue + end dist[nid] = norm(coords-c) end s = sort(collect(dist), by=x->x[2]) nd = s[1:npts] # [(id1, dist1), (id2, dist2), ..., (id_npts, dist_npts)] node_ids = [n[1] for n in nd] + if length(node_ids) == 1 + return first(node_ids) + end return node_ids end diff --git a/test/test_preprocess.jl b/test/test_preprocess.jl index f760f33..e9b8e9a 100644 --- a/test/test_preprocess.jl +++ b/test/test_preprocess.jl @@ -6,6 +6,8 @@ using JuliaFEM.Preprocess using JuliaFEM.Postprocess using JuliaFEM.Testing +datadir = first(splitext(basename(@__FILE__))) + @testset "renumber element nodes" begin mesh = Mesh() add_element!(mesh, 1, :Tet10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) @@ -31,3 +33,14 @@ end @test mesh.elements[1] == vec @test mesh.elements[11] == vec end + +@testset "find nearest nodes from mesh" begin + meshfile = joinpath(datadir, "block_2d.med") + mesh = aster_read_mesh(meshfile) + create_node_set_from_element_set!(mesh, "LOWER_LEFT", "UPPER_BOTTOM") + # nid 1 coords = (0.0, 0.5), nid 13 coords = (0.0, 0.5) + nid = find_nearest_nodes(mesh, [0.0, 0.5]; node_set="LOWER_LEFT") + @test first(nid) == 1 + nid = find_nearest_nodes(mesh, [0.0, 0.5]; node_set="UPPER_BOTTOM") + @test first(nid) == 13 +end