hermit.fenics.elastic_model

Reissner-Mindlin shell elastic model: strains, stress resultants, energy, residual.

Port of ElasticModelShapeOpt from femo dev_coupling. Geometry sensitivity is via SpatialCoordinate differentiation, so all gradients are plain ufl.grad on the (possibly moved) mesh – no gradx / J(uhat).

Classes

ElasticModel

fiber_angle / fiber_direction (at most one) rotate clt_matrices

Functions

inertial_body_force(thickness, density, acceleration)

Force per unit area rho * t * (a' + alpha x X) of an "inertial" term.

load_work(kind, coeff, u_mid, theta, E2[, measure])

Virtual work of one load term on the displacement pair (u_mid, theta).

Module Contents

class hermit.fenics.elastic_model.ElasticModel(mesh, w, clt_matrices, fiber_angle=None, fiber_direction=None, quadrature_degree=4)

fiber_angle / fiber_direction (at most one) rotate clt_matrices (laminate axes) into the element frame inside the form. With neither given, A/B/D/A_s are used exactly as passed (no identity rotation multiplied in), so the unoriented form is bit-identical to the form without orientation.

bending_energy(dx_inplane=dx)
drilling_energy(dx_drilling=dx)
elastic_energy(dx_inplane=None, dx_shear=None, dx_drilling=None)
membrane_energy(dx_inplane=dx)
shear_energy(dx_shear=dx)
weak_residual(elastic_energy, f=None, m=None, load_terms=None, penalty=False, g=None, dss=None, dSS=None, bc_dof_mask=None, penalty_terms=None, penalty_targets=None)

penalty_terms, given, is a list of (dss, dSS, bc_dof_mask) triples whose contributions are summed (multi-region penalty, e.g. hm.clamp(...) + hm.symmetry(...)); with it omitted, the single (dss, dSS, bc_dof_mask) triple is used.

load_terms, given, is a list of (kind, coeff) pairs (coeff as in load_work(), optionally followed by a measure): each contributes its own residual term, on its own space, in place of the fixed-space f/m coefficients load_terms=None (the default) uses. An empty list is valid (no distributed term – e.g. a point-load-only Loads, whose contribution is a direct RHS entry handled entirely outside this form); only f/m both None and load_terms None is the error case (nothing at all to apply).

E01
W
eps
gamma
gradu
kappa
mesh
offset
quadrature_degree = 4
t_gu
w
hermit.fenics.elastic_model.inertial_body_force(thickness, density, acceleration)

Force per unit area rho * t * (a' + alpha x X) of an "inertial" term.

acceleration is a (6,) coefficient (a', alpha): alpha is the angular acceleration and a' the acceleration at the global origin (the caller folds any other reference point in). X is the live SpatialCoordinate, so the lever arm follows the mesh.

hermit.fenics.elastic_model.load_work(kind, coeff, u_mid, theta, E2, measure=dx)

Virtual work of one load term on the displacement pair (u_mid, theta).

The single definition of what each load kind means: the residual evaluates it on the test function and the compliance on the solution. coeff is one Function for "traction" / "moment" / "pressure", and the (thickness, density, acceleration) triple for "inertial".