Two-dimensional Problems#

For plane-strain and axisymmetric problems a vector-valued field has to be created for the two-dimensional in-plane displacement components.

import felupe as fem

mesh = fem.Rectangle(n=3)
region = fem.RegionQuad(mesh)
displacement = fem.FieldAxisymmetric(region, dim=2)
import felupe as fem

mesh = fem.Rectangle(n=3)
region = fem.RegionQuad(mesh)
displacement = fem.FieldPlaneStrain(region, dim=2)

The 3x3 deformation gradient for axisymmetric and plane-strain two-dimensional problems is obtained by the grad() or extract() methods (same for FieldPlaneStrain). For these two-dimensional fields the gradient is modified to return a three-dimensional gradient.

field = fem.FieldContainer([displacement])
F = field.extract(grad=True, sym=False, add_identity=True)

For simplicity, let’s use the isotropic hyperelastic NeoHooke material model formulation.

umat = fem.NeoHooke(mu=1, bulk=5)

Note

Internally, FElupe provides an adopted low-level IntegralFormAxisymmetric class for the integration and the sparse matrix assemblage of axisymmetric problems. It uses the additional information (e.g. radial coordinates at integration points) stored in FieldAxisymmetric to provide a consistent interface in comparison to IntegralFormCartesian. The top-level IntegralForm chooses the appropriate low-level integral form based on the kind of field inside the field container.

dA = region.dV

r = fem.IntegralForm(umat.gradient(F), field, dA).assemble()
K = fem.IntegralForm(umat.hessian(F), field, dA, field).assemble()

To sum up, for axisymmetric problems use FieldAxisymmetric and for plane-strain problems use FieldPlaneStrain. Of course, mixed-field formulations may also be used with axisymmetric or plane-strain (displacement) fields.