From 1fc701f7147d3eca319a847e1e41f8b3d99c721d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olli=20V=C3=A4in=C3=B6l=C3=A4?= Date: Sat, 28 Nov 2015 13:02:56 +0200 Subject: [PATCH] Added api.jl and broke abaqus_reader.jl --- src/JuliaFEM.jl | 3 + src/abaqus_reader.jl | 187 +++++++++++++++++++------------------------ src/api.jl | 24 ++++++ 3 files changed, 110 insertions(+), 104 deletions(-) create mode 100644 src/api.jl diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index 03a8f9c..28bcf70 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -83,6 +83,9 @@ include("assembly.jl") include("solvers.jl") include("directsolver.jl") # parallel sparse direct solver for non-linear problems +### API ### +include("api.jl") + ### MORTAR STUFF ### include("mortar.jl") # mortar projection diff --git a/src/abaqus_reader.jl b/src/abaqus_reader.jl index 7c3cbea..2a1a8ba 100644 --- a/src/abaqus_reader.jl +++ b/src/abaqus_reader.jl @@ -1,35 +1,13 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md -global handlers = Dict() +global ABQ_ELTYPE_HAS_NODES = Dict( + :C3D10 => 10, + :C3D4 => 4, +) -""" -Register new handler for parser -""" -function add_handler(section, function_name) - handlers[section] = function_name -end -function create_or_get(model, key) - if !(key in keys(model)) - model[key] = Dict() - end - return model[key] -end - -function parse_header(header_line) - args = map(s -> strip(s), split(header_line, ",")) - args[1] = strip(args[1], '*') - d = Dict("section" => args[1], "options" => Dict()) - options = d["options"] - for k in args[2:end] - args2 = split(k, "=") - options[args2[1]] = args2[2] - end - return d -end - -function parse_node_section(model, header, data) +function parse_nodes(model, header, data) nodes = create_or_get(model, "nodes") for line in split(data, "\n") m = matchall(r"[-0-9.]+", line) @@ -39,89 +17,90 @@ function parse_node_section(model, header, data) end end -function parse_element_section(model, header, data) - info("Parsing elements") - eldims = Dict( - "C3D10" => 10, - "C3D4" => 4) - eltype = header["options"]["TYPE"] - if !(eltype in keys(eldims)) - throw("Element $eltype dimension information missing") - end - eldim = eldims[eltype] - test_match = matchall(r"[0-9]+", "234, 242") - m = matchall(r"[0-9]+", data) - m = map((s) -> parse(Int, s), m) - elements = create_or_get(model, "elements") - m = reshape(m, eldim+1, round(Int, length(m)/(eldim+1))) - nel = size(m)[2] - info("$nel elements found") - for i=1:nel - elements[m[1,i]] = m[2:end,i] - end - if "ELSET" in keys(header["options"]) - elsets = create_or_get(model, "elsets") - elset_name = header["options"]["ELSET"] - info("Creating ELSET $elset_name") - elsets[elset_name] = Int64[] - for i=1:nel - push!(elsets[elset_name], m[1,i]) +#function parse_elements(model, header, data) +# info("Parsing elements") +# eldims = Dict( +# "C3D10" => 10, +# "C3D4" => 4) +# eltype = header["options"]["TYPE"] +# if !(eltype in keys(eldims)) +# throw("Element $eltype dimension information missing") +# end +# eldim = eldims[eltype] +# test_match = matchall(r"[0-9]+", "234, 242") +# m = matchall(r"[0-9]+", data) +# m = map((s) -> parse(Int, s), m) +# elements = create_or_get(model, "elements") +# m = reshape(m, eldim+1, round(Int, length(m)/(eldim+1))) +# nel = size(m)[2] +# info("$nel elements found") +# for i=1:nel +# elements[m[1,i]] = m[2:end,i] +# end +# if "ELSET" in keys(header["options"]) +# elsets = create_or_get(model, "elsets") +# elset_name = header["options"]["ELSET"] +# info("Creating ELSET $elset_name") +# elsets[elset_name] = Int64[] +# for i=1:nel +# push!(elsets[elset_name], m[1,i]) +# end +# end +#end +# +#function parse_nodeset(model, header, data) +# nset_name = header["options"]["NSET"] +# info("Creating node set $nset_name") +# data = ASCIIString[] +# m = matchall(r"[0-9]+", data) +# node_ids = map((s) -> parse(Int, s), m) +# nsets = create_or_get(model, "nsets") +# nsets[nset_name] = Int64[] +# for j in node_ids +# push!(nsets[nset_name], j) +# end +#end + +parse_section = Dict(:NODE => parse_nodes) # , + #:ELEMENT => parse_elements, + #:NSET => parse_nodeset, + #:ELSET => parse_elementset) + +""" +Find lines, which contain keywords, for example "*NODE" +""" +function find_keywords(lines) + indexes = Integer[] + for (idx, line) in enumerate(lines) + if startswith(line, "*") && !startswith(line, "**") + push!(indexes, idx) end end -end - -function parse_nodeset_section(model, header, data) - nset_name = header["options"]["NSET"] - info("Creating node set $nset_name") - m = matchall(r"[0-9]+", data) - node_ids = map((s) -> parse(Int, s), m) - nsets = create_or_get(model, "nsets") - nsets[nset_name] = Int64[] - for j in node_ids - push!(nsets[nset_name], j) - end + push!(indexes, length(lines)) + indexes end function parse_abaqus(fid::IOStream) - model = Dict() - section = nothing - header = nothing - data = ASCIIString[] - info("Registered handlers: $(keys(handlers))") - - function process_section(section) - if section == nothing - return +# model = Dict() + lines = readlines(fid) + info("Registered handlers: $(keys(parse_section))") + keyword_indexes = find_keywords(lines) + idx_start = keyword_indexes[1] + keyword_sym::Symbol = :none + for idx_end in keyword_indexes[2:end] + keyword_line = lines[idx_start] + keyword = match(r"\s*(\w+)", keyword_line).match + keyword_sym = :($(uppercase(keyword))) + try + parser = parse_section(keyword_sym) + catch + warn("Keyword not implemented: ", keyword_sym) + idx_start = idx_end + continue end - if !(section in keys(handlers)) - info("Don't know what to do with data in section $section") - info("Skipping $(length(data)) bytes of unknown data") - return - end - joined = join(data, "") - handlers[section](model, header, strip(joined)) - empty!(data) + idx_start = idx_end +# parser(model, lines, idx_start, idx_end) end - - line_idx = 0 - for line in eachline(fid) - if startswith(line, "**") - continue - end - if startswith(line, "*") - process_section(section) - header = parse_header(line) - section = header["section"] - continue - end - push!(data, line) - end - process_section(section) - return model +# return model end -# add handlers -add_handler("NODE", parse_node_section) -add_handler("ELEMENT", parse_element_section) -add_handler("NSET", parse_nodeset_section) - diff --git a/src/api.jl b/src/api.jl new file mode 100644 index 0000000..56efbfc --- /dev/null +++ b/src/api.jl @@ -0,0 +1,24 @@ +# This file is a part of JuliaFEM. +# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md + + +type INode{T<:Real} + id::Integer + coords::Array{T, 1} +end + +type IElement{T<:Real} + id::Integer + connectivity::Array{T, 1} + element_type::AbstractString +end + + +type INodeset + node_ids +end + +type IElementset + jotain +end +