Files
JuliaFEM.jl/notebooks/2015-06-30-parallel-solution-using-substructuring.ipynb
T

602 lines
36 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Parallel solution of problem using substructuring and static condensation of internal nodes\n",
"\n",
"Author(s): Jukka Aho <jukka.aho@kapsi.fi>\n",
"\n",
"**Abstract**: First ideas of going towards parallel solution"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Substructuring and static condensation\n",
"\n",
"Let us again consider something as simple as possible to give idea of algorithm, e.g. 1d poisson equation with homogeneous Dirichlet boundary condition and Neumann boundary condition in other end.\n",
"\n",
"\\begin{equation}\n",
"u'' = 0 \\quad u(0)=0 \\quad u'(2)=1\n",
"\\end{equation}\n",
"\n",
"Accurate solution is $u(x) = x$.\n",
"\n",
"We discretize this to to elements and have three nodes therefore. Discretized solution is"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" 0.0\n",
" 1.0\n",
" 2.0"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = [1 -1 0; -1 2 -1; 0 -1 1]\n",
"f = [0, 0, 1]\n",
"free_dofs = [2, 3]\n",
"u = zeros(3)\n",
"u[free_dofs] = A[free_dofs, free_dofs]\\f[free_dofs]\n",
"u"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We call middle to node to interior node and left and right node to boundary nodes, i.e."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": [
"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"
],
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x318ba7bd0>)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"using PyPlot\n",
"figure(figsize=(5, 1))\n",
"plot([0, 1, 2], [0, 0, 0], \"k\")\n",
"plot([0, 2], [0, 0], \"ro\", label=\"Boundary nodes\")\n",
"plot([1], [0], \"bo\", label=\"Interior nodes\")\n",
"legend(loc=5, prop=Dict(\"size\" => 10))\n",
"xlim(-0.2, 5.2)\n",
"axis(\"off\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Static condensation. We define two sets of nodes, $I$ for interior nodes and $B$ for boundary nodes, so the equation in block-matrix form is now\n",
"\n",
"\\begin{equation}\n",
"\\mathbf{A}=\\left[\\begin{array}{cc}\n",
"\\mathbf{A}_{\\mathrm{II}} & \\mathbf{A}_{\\mathrm{IB}}\\\\\n",
"\\mathbf{A}_{\\mathrm{BI}} & \\mathbf{A}_{\\mathrm{BB}}\n",
"\\end{array}\\right]\\quad\\mathbf{u}=\\left[\\begin{array}{c}\n",
"\\mathbf{u}_{\\mathrm{I}}\\\\\n",
"\\mathbf{u}_{\\mathrm{B}}\n",
"\\end{array}\\right]\\quad\\mathbf{f}=\\left[\\begin{array}{c}\n",
"\\mathbf{f}_{\\mathbf{I}}\\\\\n",
"\\mathbf{f}_{\\mathbf{B}}\n",
"\\end{array}\\right]\n",
"\\end{equation}\n",
"\n",
"After matrix algebra we end up to\n",
"\n",
"\\begin{eqnarray}\n",
"\\mathbf{A}_{\\mathrm{II}}\\mathbf{u}_{\\mathrm{I}}+\\mathbf{A}_{\\mathrm{IB}}\\mathbf{u}_{\\mathrm{B}} & = & \\mathbf{f}_{\\mathbf{I}}\\\\\n",
"\\mathbf{A}_{\\mathrm{BI}}\\mathbf{u}_{\\mathrm{I}}+\\mathbf{A}_{\\mathrm{BB}}\\mathbf{u}_{\\mathrm{B}} & = & \\mathbf{f}_{\\mathbf{B}}\n",
"\\end{eqnarray}\n",
"\n",
"\\begin{equation}\n",
"\\mathbf{u}_{\\mathrm{I}}=\\mathbf{A}_{\\mathrm{II}}^{-1}\\left(\\mathbf{f}_{\\mathbf{I}}-\\mathbf{A}_{\\mathrm{IB}}\\mathbf{u}_{\\mathrm{B}}\\right)\n",
"\\end{equation}\n",
"\n",
"\\begin{equation}\n",
"\\mathbf{A}_{\\mathrm{BI}}\\mathbf{u}_{\\mathrm{I}}+\\mathbf{A}_{\\mathrm{BB}}\\mathbf{u}_{\\mathrm{B}}=\\mathbf{A}_{\\mathrm{BI}}\\left(\\mathbf{A}_{\\mathrm{II}}^{-1}\\left(\\mathbf{f}_{\\mathbf{I}}-\\mathbf{A}_{\\mathrm{IB}}\\mathbf{u}_{\\mathrm{B}}\\right)\\right)+\\mathbf{A}_{\\mathrm{BB}}\\mathbf{u}_{\\mathrm{B}}=\\mathbf{f}_{\\mathbf{B}}\n",
"\\end{equation}\n",
"\n",
"\\begin{equation}\n",
"\\mathbf{A}_{\\mathrm{BI}}\\left(\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{f}_{\\mathbf{I}}-\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{A}_{\\mathrm{IB}}\\mathbf{u}_{\\mathrm{B}}\\right)+\\mathbf{A}_{\\mathrm{BB}}\\mathbf{u}_{\\mathrm{B}}=\\mathbf{f}_{\\mathbf{B}}\n",
"\\end{equation}\n",
"\n",
"\\begin{equation}\n",
"\\mathbf{A}_{\\mathrm{BI}}\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{f}_{\\mathbf{I}}-\\mathbf{A}_{\\mathrm{BI}}\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{A}_{\\mathrm{IB}}\\mathbf{u}_{\\mathrm{B}}+\\mathbf{A}_{\\mathrm{BB}}\\mathbf{u}_{\\mathrm{B}}=\\mathbf{f}_{\\mathbf{B}}\n",
"\\end{equation}\n",
"\n",
"\\begin{equation}\n",
"\\mathbf{A}_{\\mathrm{BB}}\\mathbf{u}_{\\mathrm{B}}-\\mathbf{A}_{\\mathrm{BI}}\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{A}_{\\mathrm{IB}}\\mathbf{u}_{\\mathrm{B}}=\\mathbf{f}_{\\mathbf{B}}-\\mathbf{A}_{\\mathrm{BI}}\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{f}_{\\mathbf{I}}\n",
"\\end{equation}\n",
"\n",
"\\begin{equation}\n",
"\\left(\\mathbf{A}_{\\mathrm{BB}}-\\mathbf{A}_{\\mathrm{BI}}\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{A}_{\\mathrm{IB}}\\right)\\mathbf{u}_{\\mathrm{B}}=\\mathbf{f}_{\\mathbf{B}}-\\mathbf{A}_{\\mathrm{BI}}\\mathbf{A}_{\\mathrm{II}}^{-1}\\mathbf{f}_{\\mathbf{I}}\n",
"\\end{equation}\n",
"\n",
"\\begin{equation}\n",
"\\mathbf{A}_{\\mathrm{C}}=\\mathbf{f}_{\\mathrm{C}}\n",
"\\end{equation}\n",
"\n",
"where interior nodes has been succesfully eliminated. So we first form condensated matrix $\\mathbf{A}_{\\mathrm{C}}$ and vector $\\mathbf{f}_{\\mathrm{C}}$"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2x2 Array{Float64,2}:\n",
" 0.5 -0.5\n",
" -0.5 0.5"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"B = [1, 3]\n",
"I = [2]\n",
"Ac = A[B,B] - A[B,I]*inv(A[I,I])*A[I,B]\n",
"Ac"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2-element Array{Float64,1}:\n",
" 0.0\n",
" 1.0"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fc = f[B] - A[B,I]*inv(A[I,I])*f[I]\n",
"fc"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we solve the condensed system with interior node removed"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" 0.0\n",
" 0.0\n",
" 2.0"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"free_dofsc = [2] # free degrees of freedom in condensed system\n",
"u = zeros(3)\n",
"u[B[free_dofsc]] = Ac[free_dofsc, free_dofsc]\\fc[free_dofsc]\n",
"u"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we want to calculate field variable in interior node:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" 0.0\n",
" 1.0\n",
" 2.0"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u[I] = inv(A[I,I])*(f[I] - A[I,B]*u[B])\n",
"u"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Of course we cannot take inverse of interior node matrix in real life applications, it's costs way too much.."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parallel solution\n",
"\n",
"We can use exactly same concept as described earlier. We first remove interior nodes in subdomains and after that solve boundary system. Boundaries must be \"tied\" together with Lagrange multipliers, penalty method or something similar. This time we discretize the system to 4 elements and split it to two domains:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": [
"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"
],
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x3186e0a10>)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": [
"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"
],
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x318f895d0>)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"figure(figsize=(5, 1))\n",
"plot([0, 1, 2, 3, 4], [0, 0, 0, 0, 0], \"k\")\n",
"plot([0, 2, 4], [0, 0, 0], \"ro\", label=\"Boundary nodes\")\n",
"plot([1, 3], [0, 0], \"bo\", label=\"Interior nodes\")\n",
"legend(loc=5, prop=Dict(\"size\" => 10))\n",
"xlim(-0.2, 13)\n",
"axis(\"off\")\n",
"figure(figsize=(5, 1))\n",
"plot([0, 1, 2], [0, 0, 0], \"k\")\n",
"plot([3, 4, 5], [0, 0, 0], \"k\")\n",
"\n",
"plot([0, 2, 3, 5], [0, 0, 0, 0], \"ro\", label=\"Boundary nodes\")\n",
"plot([1, 4], [0, 0], \"bo\", label=\"Interior nodes\")\n",
"legend(loc=5, prop=Dict(\"size\" => 10))\n",
"xlim(-0.2, 13)\n",
"axis(\"off\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here the third node in now shared between boundaries. Now we can make static condensation in parallel, because domains do not share information yet"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(\n",
"2x2 Array{Float64,2}:\n",
" 1.0 -1.0\n",
" -1.0 1.0,\n",
"\n",
"[0.0,1.0])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"\n",
"Condensate system A = f, i.e. remove interior nodes from system.\n",
"\"\"\"\n",
"function condensate(A, f, B, I)\n",
" # in real life application we obviously make integration\n",
" # and assembly of system here before condensation\n",
" Ac = A[B,B] - A[B,I]*inv(A[I,I])*A[I,B]\n",
" fc = f[B] - A[B,I]*inv(A[I,I])*f[I]\n",
" return Ac, fc\n",
"end\n",
"A1 = 2*copy(A)\n",
"f1 = zeros(3)\n",
"A2 = 2*copy(A)\n",
"f2 = copy(f)\n",
"\n",
"# PARALLEL solution starts here\n",
"Ac1, fc1 = condensate(A1, f1, B, I) # worker 1: assembly domain 1 matrices and make static condensation\n",
"Ac2, fc2 = condensate(A2, f2, B, I) # worker 2: assembly domain 2 matrices and make static condensation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we have two 2x2 systems describing the boundaries. In condensated system\n",
"\n",
"\\begin{eqnarray}\n",
"u_{1} & = & 0\\\\\n",
"u_{2} & = & u_{3}\n",
"\\end{eqnarray}\n",
"\n",
"So our Lagrange multipliers (\"restriction operator\"?) are"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2x4 Array{Int64,2}:\n",
" 1 0 0 0\n",
" 0 1 -1 0"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R = [1 0 0 0; 0 1 -1 0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Assembly of boundary systems + Lagrange multipliers"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"4-element Array{Float64,1}:\n",
" 0.0\n",
" 0.0\n",
" 0.0\n",
" 1.0"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Z22 = zeros(2, 2)\n",
"Z2 = zeros(2)\n",
"A_ass = [Ac1 Z22; Z22 Ac2]\n",
"f_ass = [fc1; fc2]"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"6-element Array{Float64,1}:\n",
" 0.0\n",
" 0.0\n",
" 0.0\n",
" 1.0\n",
" 0.0\n",
" 0.0"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A_ass_w_lag = [A_ass R'; R Z22]\n",
"f_ass_w_lag = [f_ass; Z2]"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"6-element Array{Float64,1}:\n",
" 0.0\n",
" 1.0\n",
" 1.0\n",
" 2.0\n",
" 1.0\n",
" -1.0"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sol = A_ass_w_lag \\ f_ass_w_lag"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we have our shared boundary node solution defined twice + Lagrange multipliers. I think we can go even further and condensate this remaining system. If we again are interested of interior solution in domains, we can"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1-element Array{Float64,1}:\n",
" 0.5"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"inv(A1[I,I])*(f1[I] - A1[I,B]*sol[[1, 2]])"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1-element Array{Float64,1}:\n",
" 1.5"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"inv(A2[I,I])*(f2[I] - A2[I,B]*sol[[3, 4]])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 0.4.0-dev",
"language": "julia",
"name": "julia-0.4"
},
"language_info": {
"name": "julia",
"version": "0.4.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}