mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-10-02 14:23:58 +00:00
Bug/mortar discretization (#88)
* new mortar segmentation tests which are failing * test_problems_mortar_3d.jl: first test (Tet4) pass * solvers.jl: diagonal of A is now properly filled, if that option is used. Another option is to remove zero rows from matrix system, which is on by default * problems_mortar.jl: added new function diagnose_interface to calculate quantities from interface hopefully revealing bugs in calculation * problems_mortar_3d.jl: added docstring for check_orientation! and removed flooding debug messages not helping to debug anything * solvers.jl: Another way to solve Ax = b * Refactored code to make implementation of Tri6 assemble! easier * Patch test with linear Tet4 elements and quadratic Tet10 elements pass When using quadratic elements, in polygon clipping algorithm element is divided to linear sub-elements as proposed in [Puso2008]. Interpolation of Lagrange multiplier space is done using quadratic shape functions. References ---------- [Puso2008] Puso, Michael A., T. A. Laursen, and Jerome Solberg. "A segment-to-segment mortar contact method for quadratic elements and large deformations." Computer Methods in Applied Mechanics and Engineering 197.6 (2008): 555-566. * increased coverage by adding diagnose_interface * test using dual basis, failing for unknown reason * Fixed dual basis construction for Mortar/Tet4 The coefficient matrix Ae for one particular slave element e is the result performing numerical integration on *all* integration cells associated with this element [Popp2013]. Ae cannot be calculated "cell-wise" like it was done before. Now patch test will pass also using `interface.properties.dual_basis = true` option. Partially integrated slave elements are supported as well. References ---------- [Popp2013] Popp, Alexander, et al. "Improved robustness and consistency of 3D contact algorithms based on a dual mortar approach." Computer Methods in Applied Mechanics and Engineering 264 (2013): 67-80. * Minor modifications to preprocess.jl - removed two functions which are unimplemented (but maybe planned in future) - added function create_node_set_from_element_set!, which can be used, like name suggests, to create a node set from nodes belonging to some set of elements. * solvers.jl: now prints a list of overconstrained nodes which can be easily copy-pasted to problem.assembly.removed_dofs list to solver overconstrained situation manually * Increase code coverage Added a new test which tests dual basis 3d mortar + adjust option when using Tet4 in elasticity problem. * Tet10 + Dual basis still failing, others are working * mortar 3d low level tests * linear surface element projection tests pass * Introduced basis transform constant alpha Tet10 + dual basis patch test still failing, but single element low level routine tests gives expected results with alpha=0.2 * added new integration rule FPG12 for triangular elements * added drop_tolerance option to remove very small values from constraint matrices * Introduced a basis transform matrix T Constructing bi-orthogonal basis for quadratic surfaces is ill-conditioned. By doing a basis transform N' = N*T for slave side displacement vector it's possible to construct a bi-orthogonal basis in a same way than with linear elements. Setting alpha=0.2 ensures that quadratic basis functions are strictly positive in practical cases. * fix 3d clipping test routine, accepts only 3d vertices * dropped number of integration poitns from 12 to 7 in quadratic mortar surfaces intrestingly gives more accurate results, maybe something numerical error in FPG12 integration rule..? * added two displacement patch tests + output writing for all cases * %s/Int64/Int/g * Changed test data location * Fine tuning of logging levels
This commit is contained in:
committed by
Tero Frondelius
parent
a5c093c1d6
commit
f275ce3767
+48
-15
@@ -148,23 +148,56 @@ function get_integration_points(element::TriangularElement, ::Type{Val{4}})
|
||||
return zip(weights, points)
|
||||
end
|
||||
|
||||
""" 7 point integration rule for triangular elements.
|
||||
|
||||
References
|
||||
----------
|
||||
Code Aster documentation, http://code-aster.org/doc/default/fr/man_r/r3/r3.01.01.pdf
|
||||
"""
|
||||
function get_integration_points(element::TriangularElement, ::Type{Val{5}})
|
||||
weights = 0.5*[
|
||||
0.22500000000000,
|
||||
0.13239415278851,
|
||||
0.13239415278851,
|
||||
0.13239415278851,
|
||||
0.12593918054483,
|
||||
0.12593918054483,
|
||||
0.12593918054483]
|
||||
A = 0.470142064105115
|
||||
B = 0.101286507323456
|
||||
P1 = 0.066197076394253
|
||||
P2 = 0.062969590272413
|
||||
weights = [9/80, P1, P1, P1, P2, P2, P2]
|
||||
points = Vector{Float64}[
|
||||
[0.33333333333333, 0.33333333333333],
|
||||
[0.47014206410511, 0.47014206410511],
|
||||
[0.47014206410511, 0.05971587178977],
|
||||
[0.05971587178977, 0.47014206410511],
|
||||
[0.10128650732346, 0.10128650732346],
|
||||
[0.10128650732346, 0.79742698535309],
|
||||
[0.79742698535309, 0.10128650732346]]
|
||||
[1/3, 1/3],
|
||||
[A, A],
|
||||
[1-2A, A],
|
||||
[A, 1-2A],
|
||||
[B, B],
|
||||
[1-2B, B],
|
||||
[B, 1-2B]]
|
||||
return zip(weights, points)
|
||||
end
|
||||
|
||||
""" 12 point integration fule for triangular elements.
|
||||
References
|
||||
----------
|
||||
Code Aster documentation, http://code-aster.org/doc/default/fr/man_r/r3/r3.01.01.pdf
|
||||
"""
|
||||
function get_integration_points{E<:TriangularElement}(element::Element{E}, ::Type{Val{:FPG12}})
|
||||
A = 0.063089014491502
|
||||
B = 0.249286745170910
|
||||
C = 0.310352451033785
|
||||
D = 0.053145049844816
|
||||
P1 = 0.025422453185103
|
||||
P2 = 0.058393137863189
|
||||
P3 = 0.041425537809187
|
||||
weights = [P1, P1, P1, P2, P2, P2, P3, P3, P3, P3, P3, P3]
|
||||
points = Vector{Float64}[
|
||||
[A, A],
|
||||
[1-2A, A],
|
||||
[A, 1-2A],
|
||||
[B, B],
|
||||
[1-2B, B],
|
||||
[B, 1-2B],
|
||||
[C, D],
|
||||
[D, C],
|
||||
[1-C-D, C],
|
||||
[1-C,D, D],
|
||||
[C, 1-C-D],
|
||||
[D, 1-C-D]]
|
||||
return zip(weights, points)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user