Warning
This package is under active development, as such nothing is guaranteed and breaking changes might occur.
This package provides helper functions to assemble the different terms in the weak form of most classical shell formulations â Câ° KirchhoffâLove linear, Câ° Koiter (non-linear KirchhoffâLove), ReissnerâMindlin, and Naghi (non-linear ReissnerâMindlin) shells. Specifically, the classical membrane, bending, and shear contributions to the residuals and the consistent tangent stiffness matrix can be integrated and used with Ferrite.jl.
Note
This package assumes that the shell is defined by a 2D mesh embedded in 3D space Grid{3, P, T} where P<:Union{Triangle, Quadrilateral, QuadraticTriangle, QuadraticQuadrilateral}. To embed Ferrite's 2D generate_grid into 3D space, we provide a simple helper function shell_grid(grid::Grid{2, P, T}; map) -> Grid{3, P, T} , where the map can be used to map the 2D grid into 3D space.
Some formulation that can be assembled with this package:
| Function | Membrane | KirchhoffâLove | ReissnerâMindlin |
|---|---|---|---|
| linear | â | â | â |
| non-linear | â | â | â |
Lagrange{RefTriangle, 1} (T3) |
â | â | â |
Lagrange{RefQuadrilateral, 1} (Q4) |
â | â | â |
Lagrange{RefTriangle, 2} (T6) |
â | âď¸ | â |
Serendipity{RefQuadrilateral, 2} (Q8) |
â | âď¸ | â |
Lagrange{RefQuadrilateral, 2} (Q9) |
â | âď¸ | â |
| MITC | đˇ |
We refer the reader to the documentation for the specific weak form, numerical implementation and limitation of the different shell models.
Warning
KirchhoffâLove shells with Câ° continuity between elements is fundamentally wrong; it works in some cases with small deformations and specific boundary conditions. I would suggest using the ReissnerâMindlin shell instead.
Shells specialize the classical weak form obtained in continuum mechanics to a curvilinear coordinate system located on the shell's midsurface. As a result, classical continuum mechanics quantities, such as the GreenâLagrange strain tensor and the elasticity tensor, change their form.
To help assemble these specific surface metrics, this package uses a new ShellCellValues<:AbstractCellValues, which behaves identically to Ferrite's CellValues, but additionally holds covariant basis vectors, metric tensors, and surface Jacobian at the integration points, which are used in the assembly of the different terms of the different formulations.
struct ShellCellValues{QR, IPG, IPS, T<:AbstractFloat, M} <: AbstractCellValues
# quadrature and interpolation spaces
qr :: QR
ip_geo :: IPG
ip_shape :: IPS
# same as CellValues
N, dNdΞ, d2NdΞ2, detJdV :: Various{T}
# additional fields for shells
Aâ, Aâ, Aââ, Aââ, Aââ :: Vector{Vec{3, T}}
Gâ, Tâ, Tâ :: Vector{Vec{3, T}}
# shell measures
A_metric :: Vector{SymmetricTensor{2, 2, T, 3}}
B :: Vector{SymmetricTensor{2, 2, T, 3}}
# shear-locking treatment
mitc :: AbstractMITC
endCalling reinit!(scv::ShellCellValues) computes the reference covariant basis vectors Aâ and Aâ from the geometry of the shell's midsurface, while the current covariant basis vectors aâ and aâ are computed from the current configuration of the shell. The reference and current metric tensors are then obtained as the inner products of the corresponding covariant basis vectors.
From these surface measures and the contravariant elasticity tensor, the membrane, bending and shear strains can be computed, which are used in the assembly of the different terms in the different formulations.
Assembling the element contributions into the global system is identical to Ferrite, but instead of calling CellValues, the user needs to call ShellCellValues and use the corresponding assembly functions for the different terms in the different formulations. For example, for a non-linear ReissnerâMindlin shell, the assembly of the global consistent stiffness matrix and residual vector can be done as follows:
function assemble_shell!(K_int, r_int, dh, scv, u, mat)
n_e = ndofs_per_cell(dh)
ke_i = zeros(n_e, n_e); re_i = zeros(n_e)
asm_i = start_assemble(K_int, r_int)
for cell in CellIterator(dh)
fill!(ke_i, 0.0); fill!(re_i, 0.0)
reinit!(scv, cell)
sd = shelldofs(cell)
u_e = u[sd]
membrane_residuals_RM!(re_i, scv, u_e, mat)
bending_residuals_RM!(re_i, scv, u_e, mat)
membrane_tangent_RM!(ke_i, scv, u_e, mat)
bending_tangent_RM!(ke_i, scv, u_e, mat)
assemble!(asm_i, sd, ke_i, re_i)
end
endwhere shelldofs is a helper function (similar to celldofs) to get the degrees of freedom of the shell element, which are ordered as follows: first the in-plane displacements, then the out-of-plane displacements, and finally the rotations.
Warning
shelldofs is only useful for ReissnerâMindlin shells where both displacements and rotations are degrees of freedom. For KirchhoffâLove shells, the degrees of freedom are only the displacements, and the rotations are obtained from the displacements. In this case, celldofs must be used instead of shelldofs.
The package also provides helper functions to assemble external loading contributions, such as follower pressure loads or edge tractions, which are often used in shell problems. For terms that depend on the current configuration of the shell (i.e. follower pressure loads) the contribution of these loadings is included in the consistent tangent stiffness matrix, which is necessary for quadratic convergence of the non-linear solver.
| Loading | residual | consistent tangent |
|---|---|---|
| follower pressure | assemble_pressure! |
assemble_pressure_tangent! |
| edge traction | assemble_traction! |
|
| point load | apply_pointload! |
|
| volume coupling | volume_residuals! |
volume_gradient! |
Below are some examples of shell problems assembled using this package.
Dynamic inflation of a square pillow made of a thin Reissner-Mindlin shell (MITC9 treatment) under a uniform pressure loading.
Wrinkling of a Reissner-Mindlin thin shell with MITC4 treatment under pure lateral shear. Non-linear Newton-Raphson solver with Pseudo-Transient Continuation (PTC) to traverse the unstable equilibrium path.
- Marin Lauber, Delft University of Technology, The Netherlands.
We are always looking for contributions and help with FerriteShells. If you have ideas, nice applications, or code contributions, then we would be happy to help you get them included. We ask you to follow the FerriteShells git workflow.
Please use the GitHub issue tracker to report any issues.
FerriteShells is released under the MIT License. See the LICENSE file for details.

