{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Shape function and integration points\n", "\n", "Author(s): Jukka Aho\n", "\n", "**Abstract**: Shape functions and element descriptions used in JuliaFEM." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sympy import *\n", "#init_printing()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "xi = DeferredVector(r\"xi\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1D shape function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Linear 2-node segment (Lagrange family)\n", "\n", "| | $\\xi_1$ |\n", "| ----- | -------:|\n", "| $N_1$ | -1 |\n", "| $N_2$ | 1 |\n", "\n", "\\begin{equation}\n", " \\left(\\mathbf{P}\\boldsymbol{\\alpha}\\right)\\left(\\xi_1\\right) = \\alpha_{1}+\\alpha_{2}\\xi_{1}\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(Matrix([\n", " [-xi[1]/2 + 1/2],\n", " [ xi[1]/2 + 1/2]]), Matrix([\n", " [-1/2],\n", " [ 1/2]]))" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = Matrix([[1, -1], [1, 1]])\n", "P = Matrix([1, xi[1]]).T\n", "N = (P*A.inv()).T\n", "dN = Matrix([N.diff(xi[1]).T]).T\n", "N, dN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quadratic 3-node segment (Lagrange family)\n", "\n", "| | $\\xi_1$ |\n", "| ----- | -------:|\n", "| $N_1$ | -1 |\n", "| $N_2$ | 1 |\n", "| $N_3$ | 0 |\n", "\n", "\\begin{equation}\n", " \\left(\\mathbf{P}\\boldsymbol{\\alpha}\\right)\\left(\\xi_1\\right) = \\alpha_1 + \\alpha_2\\xi_1 + \\alpha_3\\xi_1^2\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(Matrix([\n", " [xi[1]**2/2 - xi[1]/2],\n", " [xi[1]**2/2 + xi[1]/2],\n", " [ -xi[1]**2 + 1]]), Matrix([\n", " [xi[1] - 1/2],\n", " [xi[1] + 1/2],\n", " [ -2*xi[1]]]))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = Matrix([[1, -1, (-1)**2],\n", " [1, 1, 1**2],\n", " [1, 0, 0**2]])\n", "P = Matrix([1, xi[1], xi[1]**2]).T\n", "N = (P*A.inv()).T\n", "dN = Matrix([N.diff(xi[1]).T]).T\n", "N, dN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### P-elements" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2D shape functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Linear triangle\n", "\n", "| | $\\xi_1$ | $\\xi_2$ |\n", "| ----- | -------:| -------:|\n", "| $N_1$ | 0 | 0 |\n", "| $N_2$ | 1 | 0 |\n", "| $N_3$ | 0 | 1 |" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(Matrix([\n", " [-xi[1] - xi[2] + 1],\n", " [ xi[1]],\n", " [ xi[2]]]), Matrix([\n", " [-1, -1],\n", " [ 1, 0],\n", " [ 0, 1]]))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = Matrix([[1, 0, 0], [1, 1, 0], [1, 0, 1]])\n", "P = Matrix([1, xi[1], xi[2]]).T\n", "N = (P*A.inv()).T\n", "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T]).T\n", "N, dN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quadratic triangle\n", "\n", "| | $\\xi_1$ | $\\xi_2$ |\n", "| ----- | -------:| -------:|\n", "| $N_1$ | 0 | 0 |\n", "| $N_2$ | 1 | 0 |\n", "| $N_3$ | 0 | 1 |\n", "| $N_4$ | 1/2 | 0 |\n", "| $N_5$ | 1/2 | 1/2 |\n", "| $N_6$ | 0 | 1/2 |" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Matrix([\n", "[1, 0, 0, 0, 0, 0],\n", "[1, 1, 0, 1, 0, 0],\n", "[1, 0, 1, 0, 1, 0],\n", "[1, 1/2, 0, 1/4, 0, 0],\n", "[1, 1/2, 1/2, 1/4, 1/4, 1/4],\n", "[1, 0, 1/2, 0, 1/4, 0]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P = Matrix([1, xi[1], xi[2], xi[1]**2, xi[2]**2, xi[1]*xi[2]]).T\n", "A = Matrix([\n", " P.subs({xi[1]: 0, xi[2]: 0}),\n", " P.subs({xi[1]: 1, xi[2]: 0}),\n", " P.subs({xi[1]: 0, xi[2]: 1}),\n", " P.subs({xi[1]: Rational(1,2), xi[2]: 0}),\n", " P.subs({xi[1]: Rational(1,2), xi[2]: Rational(1,2)}),\n", " P.subs({xi[1]: 0, xi[2]: Rational(1,2)}),\n", " ])\n", "A" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(Matrix([\n", " [2*xi[1]**2 + 4*xi[1]*xi[2] - 3*xi[1] + 2*xi[2]**2 - 3*xi[2] + 1],\n", " [ 2*xi[1]**2 - xi[1]],\n", " [ 2*xi[2]**2 - xi[2]],\n", " [ -4*xi[1]**2 - 4*xi[1]*xi[2] + 4*xi[1]],\n", " [ 4*xi[1]*xi[2]],\n", " [ -4*xi[1]*xi[2] - 4*xi[2]**2 + 4*xi[2]]]), Matrix([\n", " [ 4*xi[1] + 4*xi[2] - 3, 4*xi[1] + 4*xi[2] - 3],\n", " [ 4*xi[1] - 1, 0],\n", " [ 0, 4*xi[2] - 1],\n", " [-8*xi[1] - 4*xi[2] + 4, -4*xi[1]],\n", " [ 4*xi[2], 4*xi[1]],\n", " [ -4*xi[2], -4*xi[1] - 8*xi[2] + 4]]))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = (P*A.inv()).T\n", "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T]).T\n", "N, dN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3D shape functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Linear tetrahedra, **tet4**\n", "\n", "| | $\\xi_1$ | $\\xi_2$ | $\\xi_2$ |\n", "| ----- | -------:| -------:| -------:|\n", "| $N_1$ | 0 | 0 | 0 |\n", "| $N_2$ | 1 | 0 | 0 |\n", "| $N_3$ | 0 | 1 | 0 |\n", "| $N_4$ | 0 | 0 | 1 |" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Matrix([\n", "[1, 0, 0, 0],\n", "[1, 1, 0, 0],\n", "[1, 0, 1, 0],\n", "[1, 0, 0, 1]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P = Matrix([1, xi[1], xi[2], xi[3]]).T\n", "A = Matrix([\n", " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 0}),\n", " P.subs({xi[1]: 1, xi[2]: 0, xi[3]: 0}),\n", " P.subs({xi[1]: 0, xi[2]: 1, xi[3]: 0}),\n", " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 1}),\n", " ])\n", "A" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(Matrix([\n", " [-xi[1] - xi[2] - xi[3] + 1],\n", " [ xi[1]],\n", " [ xi[2]],\n", " [ xi[3]]]), Matrix([\n", " [-1, -1, -1],\n", " [ 1, 0, 0],\n", " [ 0, 1, 0],\n", " [ 0, 0, 1]]))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = (P*A.inv()).T\n", "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T, N.diff(xi[3]).T]).T\n", "N, dN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quadratic Lagrange tetrahedral element, 10 nodes, **tet10**\n", "\n", "| | $\\xi_1$ | $\\xi_2$ | $\\xi_2$ |\n", "| ----- | -------:| -------:| -------:|\n", "| $N_1$ | 0 | 0 | 0 |\n", "| $N_2$ | 1 | 0 | 0 |\n", "| $N_3$ | 0 | 1 | 0 |\n", "| $N_4$ | 0 | 0 | 1 |\n", "| $N_5$ | 1/2 | 0 | 0 |\n", "| $N_6$ | 1/2 | 1/2 | 0 |\n", "| $N_7$ | 0 | 1/2 | 0 |\n", "| $N_8$ | 0 | 0 | 1/2 |\n", "| $N_9$ | 1/2 | 0 | 1/2 |\n", "| $N_{10}$ | 0 | 1/2 | 1/2 |" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Matrix([\n", "[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", "[1, 1, 0, 0, 1, 0, 0, 0, 0, 0],\n", "[1, 0, 1, 0, 0, 0, 1, 0, 0, 0],\n", "[1, 0, 0, 1, 0, 0, 0, 0, 1, 0],\n", "[1, 1/2, 0, 0, 1/4, 0, 0, 0, 0, 0],\n", "[1, 1/2, 1/2, 0, 1/4, 1/4, 1/4, 0, 0, 0],\n", "[1, 0, 1/2, 0, 0, 0, 1/4, 0, 0, 0],\n", "[1, 0, 0, 1/2, 0, 0, 0, 0, 1/4, 0],\n", "[1, 1/2, 0, 1/2, 1/4, 0, 0, 0, 1/4, 1/4],\n", "[1, 0, 1/2, 1/2, 0, 0, 1/4, 1/4, 1/4, 0]])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P = Matrix([1, xi[1], xi[2], xi[3], xi[1]**2, xi[1]*xi[2], xi[2]**2, xi[2]*xi[3], xi[3]**2, xi[1]*xi[3]]).T\n", "A = Matrix([\n", " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 0}),\n", " P.subs({xi[1]: 1, xi[2]: 0, xi[3]: 0}),\n", " P.subs({xi[1]: 0, xi[2]: 1, xi[3]: 0}),\n", " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 1}),\n", "\n", " P.subs({xi[1]: Rational(1,2), xi[2]: 0, xi[3]: 0}),\n", " P.subs({xi[1]: Rational(1,2), xi[2]: Rational(1,2), xi[3]: 0}),\n", " P.subs({xi[1]: 0, xi[2]: Rational(1,2), xi[3]: 0}),\n", "\n", " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: Rational(1,2)}),\n", " P.subs({xi[1]: Rational(1,2), xi[2]: 0, xi[3]: Rational(1,2)}),\n", " P.subs({xi[1]: 0, xi[2]: Rational(1,2), xi[3]: Rational(1,2)}),\n", " ])\n", "A" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Matrix([\n", "[(xi[1] + xi[2] + xi[3] - 1)*(2*xi[1] + 2*xi[2] + 2*xi[3] - 1)],\n", "[ xi[1]*(2*xi[1] - 1)],\n", "[ xi[2]*(2*xi[2] - 1)],\n", "[ xi[3]*(2*xi[3] - 1)],\n", "[ -4*xi[1]*(xi[1] + xi[2] + xi[3] - 1)],\n", "[ 4*xi[1]*xi[2]],\n", "[ -4*xi[2]*(xi[1] + xi[2] + xi[3] - 1)],\n", "[ -4*xi[3]*(xi[1] + xi[2] + xi[3] - 1)],\n", "[ 4*xi[1]*xi[3]],\n", "[ 4*xi[2]*xi[3]]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = (P*A.inv()).T\n", "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T, N.diff(xi[3]).T]).T\n", "factor(N)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Matrix([\n", "[ 4*xi[1] + 4*xi[2] + 4*xi[3] - 3, 4*xi[1] + 4*xi[2] + 4*xi[3] - 3, 4*xi[1] + 4*xi[2] + 4*xi[3] - 3],\n", "[ 4*xi[1] - 1, 0, 0],\n", "[ 0, 4*xi[2] - 1, 0],\n", "[ 0, 0, 4*xi[3] - 1],\n", "[-4*(2*xi[1] + xi[2] + xi[3] - 1), -4*xi[1], -4*xi[1]],\n", "[ 4*xi[2], 4*xi[1], 0],\n", "[ -4*xi[2], -4*(xi[1] + 2*xi[2] + xi[3] - 1), -4*xi[2]],\n", "[ -4*xi[3], -4*xi[3], -4*(xi[1] + xi[2] + 2*xi[3] - 1)],\n", "[ 4*xi[3], 0, 4*xi[1]],\n", "[ 0, 4*xi[3], 4*xi[2]]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factor(dN)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }