From 91a2eec4c422e4ae4b6b66b95e044c2eb255dc3c Mon Sep 17 00:00:00 2001 From: Jeremy Bleyer Date: Tue, 17 Apr 2018 23:16:24 +0200 Subject: [PATCH] 2D elasticity example --- doc/index.rst | 2 +- examples/elasticity/2D_elasticity.py.rst | 164 ++++++++++++++++++++ examples/elasticity/cantilever_deformed.png | Bin 0 -> 129926 bytes 3 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 examples/elasticity/2D_elasticity.py.rst create mode 100644 examples/elasticity/cantilever_deformed.png diff --git a/doc/index.rst b/doc/index.rst index 3018a52..6c34eaf 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -12,7 +12,7 @@ Contents: :maxdepth: 2 intro - 2D_elasticity + demo/elasticity/2D_elasticity.py.rst demo/modal_analysis_dynamics/cantilever_modal.py.rst demo/reissner_mindlin/reissner_mindlin.rst diff --git a/examples/elasticity/2D_elasticity.py.rst b/examples/elasticity/2D_elasticity.py.rst new file mode 100644 index 0000000..c94124b --- /dev/null +++ b/examples/elasticity/2D_elasticity.py.rst @@ -0,0 +1,164 @@ + +.. # gedit: set fileencoding=utf8 : + +.. _LinearElasticity2D:: + + +========================= + 2D linear elasticity +========================= + + +Introduction +------------ + +In this first numerical tour, we will show how to compute a small strain solution for +a 2D isotropic linear elastic medium, either in plane stress or in plane strain, +in a tradtional displacement-based finite element formulation. Extension to 3D +is straightforward and an example can be found in the :ref:ModalAnalysis example. + +We consider here the case of a cantilever beam modeled as a 2D medium of dimensions +:math:L\times H. Geometrical parameters and mesh density are first defined +and the rectangular domain is generated using the RectangleMesh function. +We also choose a criss-crossed structured mesh:: + + from __future__ import print_function + from fenics import * + + L = 25. + H = 1. + Nx = 250 + Ny = 10 + mesh = RectangleMesh(Point(0., 0.), Point(L, H), Nx, Ny, "crossed") + + +Constitutive relation +--------------------- + +We now define the material parameters which are here given in terms of a Young's +modulus :math:E and a Poisson coefficient :math:\nu. In the following, we will +need to define the constitutive relation between the stress tensor :math:\boldsymbol{\sigma} +and the strain tensor :math:\boldsymbol{\varepsilon}. Let us recall +that the general expression of the linear elastic isotropic constitutive relation +for a 3D medium is given by: + +.. math:: + \boldsymbol{\sigma} = \lambda \text{tr}(\boldsymbol{\varepsilon})\mathbf{1} + 2\mu\boldsymbol{\varepsilon} + :label: constitutive_3D + +for a natural (no prestress) initial state where the LamÃ© coefficients are given by: + +.. math:: + \lambda = \dfrac{E\nu}{(1+\nu)(1-2\nu)}, \quad \mu = \dfrac{E}{2(1+\nu)} + :label: Lame_coeff + +In this demo, we consider a 2D model either in plane strain or in plane stress conditions. +Irrespective of this choice, we will work only with a 2D displacement vector :math:\boldsymbol{u}=(u_x,u_y) +and will subsequently define the strain operator eps as follows:: + + def eps(v): + return sym(grad(v)) + +which computes the 2x2 plane components of the symmetrized gradient tensor of +any 2D vectorial field. In the plane strain case, the full 3D strain tensor is defined as follows: + +.. math:: + \boldsymbol{\varepsilon} = \begin{bmatrix} \varepsilon_{xx} & \varepsilon_{xy} & 0\\ + \varepsilon_{xy} & \varepsilon_{yy} & 0 \\ 0 & 0 & 0\end{bmatrix} + +so that the 2x2 plane part of the stress tensor is defined in the same way as for the 3D case +(the out-of-plane stress component being given by :math:\sigma_{zz}=\lambda(\varepsilon_{xx}+\varepsilon_{yy}). + +In the plane stress case, an out-of-plane strain component :math:\varepsilon_{zz} +must be considered so that :math:\sigma_{zz}=0. Using this condition in the +3D constitutive relation, one has :math:\varepsilon_{zz}=-\dfrac{\lambda}{\lambda+2\mu}(\varepsilon_{xx}+\varepsilon_{yy}). +Injecting into :eq:constitutive_3D, we have for the 2D plane stress relation: + +.. math:: + \boldsymbol{\sigma} = \lambda^* \text{tr}(\boldsymbol{\varepsilon})\mathbf{1} + 2\mu\boldsymbol{\varepsilon} + +where :math:\boldsymbol{\sigma}, \boldsymbol{\varepsilon}, \mathbf{1} are 2D tensors and with +:math:\lambda^* = \dfrac{\lambda^2}{\lambda+\mu}. Hence, the 2D constitutive relation +is identical to the plane strain case by changing only the value of the LamÃ© coefficient :math:\lambda +(equivalently, this corresponds to using a pseudo-Poisson coefficient :math:\nu^*=\dfrac{\nu}{1-\nu} +instead of :math:\nu when defining :math:\lambda in :eq:Lame_coeff). We can then have:: + + E = Constant(1e5) + nu = Constant(0.3) + model = "plane_stress" + + mu = E/2/(1+nu) + lmbda = E*nu/(1+nu)/(1-2*nu) + if model == "plane_stress": + lmbda = lmbda**2/(lmbda+mu) + + def sigma(v): + return lmbda*tr(eps(v))*Identity(2) + 2.0*mu*eps(v) + +.. note:: + Note that we used the variable name lmbda to avoid any confusion with the + lambda functions of Python + + We also used an intrinsic formulation of the constitutive relation. Example of + constitutive relation implemented with a matrix/vector engineering notation + will be provided in the :ref:OrthotropicElasticity example. + + +Variational formulation +----------------------- + +For this example, we consider a continuous polynomial interpolation of degree 2 +and a uniformly distributed loading :math:\boldsymbol{f}=(0,-f) corresponding +to the beam self-weight. The continuum mechanics variational formulation (obtained +from the virtual work principle) is given by: + +.. math:: + \text{Find } \boldsymbol{u}\in V \text{ s.t. } \int_{\Omega} + \boldsymbol{\sigma}(\boldsymbol{u}):\boldsymbol{\varepsilon}(\boldsymbol{v}) d\Omega + = \int_{\Omega} \boldsymbol{f}\cdot\boldsymbol{v} d\Omega \quad \forall\boldsymbol{v} \in V + +which translates into the following FEniCS code:: + + rho_g = 1e-3 + f = Constant((0,-rho_g)) + + V = VectorFunctionSpace(mesh, 'Lagrange', degree=2) + du = TrialFunction(V) + u_ = TestFunction(V) + a = inner(sigma(du), eps(u_))*dx + l = inner(f, u_)*dx + + +Resolution +---------- + +Fixed displacements are imposed on the left part of the beam, the solve +function is then called and solution is plotted by deforming the mesh:: + + def left(x, on_boundary): + return near(x[0],0.) + + bc = DirichletBC(V, Constant((0.,0.)), left) + + u = Function(V, name="Displacement") + solve(a == l, u, bc) + + plot(1e3*u, mode="displacement") + +The (amplified) solution should look like this: + +.. image:: cantilever_deformed.png + :scale: 15% + + +Validation and post-processing +------------------------------ + +The maximal deflection is compared against the analytical solution from +Euler-Bernoulli beam theory which is here :math:w_{beam} = \dfrac{qL^4}{8EI}:: + + print("Maximal deflection:", -u(L,H/2.)[1]) + print("Beam theory deflection:", float(3*rho_g*L**4/2/E/H**3)) + +One finds :math:w_{FE} = 5.8172\text{e-3} against :math:w_{beam} = 5.8594\text{e-3} +that is a 0.72% difference. \ No newline at end of file diff --git a/examples/elasticity/cantilever_deformed.png b/examples/elasticity/cantilever_deformed.png new file mode 100644 index 0000000000000000000000000000000000000000..0460121d341d8f4207215b7d47cce41100f48227 GIT binary patch literal 129926 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