mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-08-28 15:21:02 +00:00
76 lines
2.5 KiB
Julia
76 lines
2.5 KiB
Julia
# This file is a part of JuliaFEM.
|
|
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
|
|
|
"""
|
|
Parameters
|
|
----------
|
|
dimension
|
|
dimension of surface, 1 for 2d problems (plane strain, plane stress,
|
|
axisymmetric) and 2 for 3d problems. It not given, try to determine problem
|
|
dimension from first element
|
|
rotate_normals
|
|
if all surface elements are in cw order instead of ccw, this can be used to
|
|
swap normal directions so that normals point to outward of body
|
|
adjust
|
|
for elasticity problems only; closes any gaps between surfaces if found
|
|
dual_basis
|
|
use bi-orthogonal basis when interpolating Lagrange multiplier space
|
|
use_forwarddiff
|
|
use forwarddiff to linearize contact constraints directly from weighted
|
|
gap function
|
|
distval
|
|
charasteristic measure, contact pairs with distance over this value are
|
|
skipped from contact segmentation algorithm
|
|
linear_surface_elements
|
|
convert quadratic surface elements to linear elements on the fly, notice
|
|
that middle nodes are missing Lagrange multipliers
|
|
split_quadratic_slave_elements
|
|
split quadratic surface elements to several linear sub-elements to get
|
|
Lagrange multiplier to middle nodes also
|
|
split_quadratic_master_elements
|
|
split quadratic master elements to several linear sub-elements
|
|
store_fields
|
|
not used
|
|
"""
|
|
type Mortar <: BoundaryProblem
|
|
dimension :: Int
|
|
rotate_normals :: Bool
|
|
adjust :: Bool
|
|
dual_basis :: Bool
|
|
use_forwarddiff :: Bool
|
|
distval :: Float64
|
|
linear_surface_elements :: Bool
|
|
split_quadratic_slave_elements :: Bool
|
|
split_quadratic_master_elements :: Bool
|
|
store_fields :: Vector{Symbol}
|
|
end
|
|
|
|
function Mortar()
|
|
default_fields = []
|
|
return Mortar(-1, false, false, false, false, Inf, true, true, true, default_fields)
|
|
end
|
|
|
|
function get_unknown_field_name(problem::Problem{Mortar})
|
|
return "reaction force"
|
|
end
|
|
|
|
function get_formulation_type(problem::Problem{Mortar})
|
|
if problem.properties.use_forwarddiff
|
|
return :forwarddiff
|
|
else
|
|
return :incremental
|
|
end
|
|
end
|
|
|
|
function assemble!(problem::Problem{Mortar}, time::Float64)
|
|
if problem.properties.dimension == -1
|
|
problem.properties.dimension = dim = size(first(problem.elements), 1)
|
|
info("assuming dimension of mesh tie surface is $dim")
|
|
info("if this is wrong set is manually using problem.properties.dimension")
|
|
end
|
|
dimension = Val{problem.properties.dimension}
|
|
use_forwarddiff = Val{problem.properties.use_forwarddiff}
|
|
assemble!(problem, time, dimension, use_forwarddiff)
|
|
end
|
|
|