User element

In this example, we will add support for an element that is currently not supported inside the package: The linear wedge element, C3D6, defined in wedge_element.inp, which exists in Ferrite as Wedge. It is also possible to define how to read in other cells not defined in Ferrite using the same technique, but that also requires defining further information to be able to use such cells in Ferrite later.

using Ferrite, FerriteMeshParser

The Wedge cell has the same node order in Ferrite as in Abaqus (above). Hence, in this case it is not required, but if desired it can be changed by overloading the function FerriteMeshParser.create_cell as follows

create_cell(::Type{Wedge}, node_numbers, ::FerriteMeshParser.AbaqusMeshFormat) = Wedge(ntuple(j->node_numbers[j], length(node_numbers)))
create_cell (generic function with 1 method)

This setup allows changing the node order for your specific element. After these modifications, one can import the mesh by specifying that the Abaqus code C3D6 should be interpreted as a LinearWedge:

grid = get_ferrite_grid("wedge_element.inp"; user_elements=Dict("C3D6"=>Wedge));

Giving the following grid

println(typeof(grid))
println(unique(typeof.(getcells(grid))))    # The different cell types in the grid
Ferrite.Grid{3, Ferrite.Wedge, Float64}
DataType[Ferrite.Wedge]

Plain Program

Below follows a version of the program without any comments. The file is also available here: user_element.jl

using Ferrite, FerriteMeshParser

create_cell(::Type{Wedge}, node_numbers, ::FerriteMeshParser.AbaqusMeshFormat) = Wedge(ntuple(j->node_numbers[j], length(node_numbers)))

grid = get_ferrite_grid("wedge_element.inp"; user_elements=Dict("C3D6"=>Wedge));

println(typeof(grid))
println(unique(typeof.(getcells(grid))))    # The different cell types in the grid

# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl

This page was generated using Literate.jl.