Files
JuliaFEM.jl/notebooks/2015-06-25-shape-functions.ipynb
T
2015-08-13 00:39:20 +03:00

531 lines
14 KiB
Plaintext

{
"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
}