mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-08-06 04:21:33 +00:00
531 lines
14 KiB
Plaintext
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
|
|
}
|