mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-09 12:42:19 +00:00
602 lines
36 KiB
Plaintext
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": [
|
||
|
|
"iVBORw0KGgoAAAANSUhEUgAAAc0AAACECAYAAADyZXANAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAFUhJREFUeJzt3X1UVHX+B/D3vWI8xIOEoFIqMhvCEIqAo+CmSOuSpYbmwZ/ZkcFyWU0zdxN7sNbHcmlzt87paJsnydhV08W1B7fEElcQ5CCGrMCCiIK7KWxntSMWj5/fH+BdLw9ylcHRfL/OmVMz33u/D7eJ98yd7/1eRUQERERE1C3V3h0gIiK6XTA0iYiIDGJoEhERGcTQJCIiMoihSUREZBBDk4iIyCCGJhERkUEMTSIiIoMYmkRERAYxNImIiAxiaBIRERnE0CQiIjKIoUlERGQQQ5OIiMgghiYREZFBDE0iIiKDGJpEREQGMTSJiIgMYmgSEREZxNAkIiIyiKFJRERkEEOTiIjIIIYmERGRQQxNIiIigxiaREREBjE0iYiIDGJoEhERGcTQJCIiMoihSUREZBBDk4iIyCCGJhERkUEMTSIiIoMYmkRERAY52LsDRPTjdvnyZZSWltq7G0QAgMDAQLi4uNzw/gxNIupVpaWlCA8Pt3c3iAAAR48eRVhY2A3vz9AkopsiLS0NQUFB9u4G3aFKSkrw5JNP9rgehiYR3RRBQUE9+oRPdCvgRCAiIiKDGJpEREQGMTSJiIgMYmgSEREZxNAkIroNnT59Gqqq4vjx4/buik2pqoqPP/7Y3t3oEkOTiOymtrYWyxIT8WhwMKYNH45Hg4OxLDERtbW1dq/ParVCVVXt0b9/f0yePBlFRUU31Df6ceAlJ0RkFzU1Nfi/qCi8VlGBFAAKgBYAecXFmHXoEHbk5MDb29tu9SmKgsmTJ2PLli0AgG+++QYrVqzAlClTcObMmesY6a2roaEBd911l727cVvhN00isos3li/HaxUVGIvWgANa/yCNBbCuogIpycl2rU9E4OjoCB8fH/j4+GDkyJFYvnw5qqur8e2332rbFRUVISYmBi4uLujfvz+SkpJQV1enlUdHR2Pp0qW6uuPi4pCYmKg99/Pzw+uvv4558+bB3d0dQ4cOxXvvvafbJy8vD6NGjYKzszNGjx6NY8eO6cpbWlrw1FNPwd/fHy4uLggMDMTbb7+t28ZqtWL69OlYt24d7r33XgQGBmLNmjUICQnpMP7Q0FD85je/6fTYZGZmQlVVfPXVV4iIiMDdd9+NcePGoaysTLfdxo0bYTKZ4OjoiMDAQKSlpenKy8vLMX78eDg7OyM4OBgZGRkd2qqurkZ8fDw8PT3h5eWFuLg43YeWzMxMWCwWuLq6wtPTEz/96U9RVVXVab9tgaFJRHZRnJeHMV2UjWkrt2d9QGtwXnHp0iWkpaXh/vvvh5eXFwCgrq4OsbGx8PLyQn5+Pnbu3In9+/dj0aJF2n6KokBRFF29nb325ptvwmKx4Ouvv8bChQuxYMECLYQuXbqEKVOm4IEHHkBBQQFWrlyJ559/Xrd/S0sLBg8ejF27dqGkpASvvvoqXnrpJezcuVO33Zdffony8nLs378fn332GebNm4eSkhLk5+dr2xw7dgxFRUW6YO/MihUr8Pvf/x75+flwcHDAvHnztLLdu3fjueeew7Jly3DixAkkJSUhMTERmZmZWn9nzJgBJycn5OXlYdOmTVi+fLmu/sbGRsTGxsLDwwNZWVk4fPgwXF1d8fDDD6OpqQlNTU2Ii4vDxIkTUVRUhNzcXCQlJXU4tjYlRES96OjRowJAjh49qnt9akCACNDlY2pAwHW1Y+v6EhISxMHBQVxdXcXV1VUURRFfX18pKCjQtvnjH/8o99xzj1y+fFl7be/evdKnTx+pqakREZHo6GhZunSpru64uDixWq3acz8/P5k7d65umwEDBsi7774rIiLvvvuu9O/fX+rr67XyTZs2iaIoUlhY2OUYnnnmGZk5c6ZuTIMGDZLGxkbddo888ogsXLhQe7548WKJiYnpst4DBw6Ioijy1Vdf6catKIrWx6ioKElKStLtFx8fL48++qiIiHzxxRfSt29f+eabb7Tyzz//XBRFkT179oiIyIcffiiBgYG6Ourr68XFxUUyMjLk22+/FUVR5ODBg1329Yqu3ofXi980icgumh0cIF2UtbSV27M+AIiJiUFhYSEKCwuRl5eH2NhYTJ48WTv9V1JSgtDQUDg7O2v7REVFoaWlBf/85z+vq60RI0bong8cOBA1NTVaOyNHjtT9/jh27NgOdbzzzjsIDw+Hj48P3Nzc8N5776G6ulq3TUhICBzaHYv58+dj27ZtaGhoQENDA7Zt26b71mikzwMHDgQArc+lpaUYN26cbvuoqCiUlJRoYxo8eLC2X2djKiwsxMmTJ+Hm5qY9vLy8UF9fj4qKCtxzzz2wWq2IjY3FtGnT8Pbbb+PcuXPd9rsnGJpEZBdmiwVHuig70lZuz/oAwMXFBf7+/vD390dERAQ2b96Muro6bN68WdtGpKuobqWqaodtGhoaOpxC7Nu3r+65oihoaWkx3M727duxbNkyzJ8/HxkZGSgsLERiYiLq6+s7jKm9KVOmwNHREenp6fjkk0/Q2NiImTNnXrO99n2+Mp6r+9xTly5dQnh4uPbB5cqjrKwMs2fPBgC8//77yMnJQVRUFHbs2IGAgAAcOdLVO6HnGJpEZBfJKSl4yWRCDlq/CaLtnzkAXjaZkJySYtf6AHT529j3338PADCbzSgsLMTly5e1suzsbKiqiuHDhwMAvL298e9//1srb25uxj/+8Y/r6ofZbMbx48d1AZibm6vbJjs7G1FRUfjlL3+JkSNHwt/fHydPnjT0+56DgwMSEhKwZcsWpKamYvbs2XB0dLyuPrYXFBSErKysDn0MDg7Wyqurq3XfDNuPKTw8HOXl5fD29tY+vFx5uLu7a9uFhobihRdeQHZ2Nh544AH8+c9/7lHfr4WhSUR24e3tjR05OUi3WjHVbMa0gABMNZuRbrVe9+UhvVEfAPzwww84f/48zp07h5KSEixevBjff/89pk6dCgCYM2cOnJyckJCQgBMnTuDAgQNYvHgx5s6dq7UXExODzz77DHv37kVpaSkWLFiAixcvdtv21d8sn3jiCSiKgvnz56O4uBh79+7F7373O932AQEByM/Px759+1BWVoZXXnkF+fn53X5DveLpp5/Gl19+ic8//9zQqdnuLFu2DKmpqdi0aRPKy8uxYcMG7N69W5vANGnSJAQEBCAhIQHHjx/HoUOH8PLLL+vqmDNnDvr374/HHnsMWVlZqKysRGZmJpYsWYJ//etfOH36NF588UXk5ubizJkz2LdvH8rLy2E2m3vc/y716BdRIqJu2GoCxs1mtVpFURTt4e7uLmPGjJH09HTddkVFRRITEyPOzs7i5eUlSUlJUldXp5U3NjbKwoULxcvLSwYOHCi//e1vJS4uThITE7Vt/Pz85K233tLVGxoaKqtWrdKe5+bmSmhoqDg6OkpYWJikp6eLqqraRKD6+npJTEyUfv36iaenpzzzzDPy4osvyqhRo3Rjmj59epdjfvDBByUkJKTbY3PgwAFRVVUuXryovXbs2DFRVVXOnDmjvbZx40YxmUxy1113SWBgoKSlpenqKSsrkwcffFAcHR0lMDBQvvjiC1FVVZsIJCJy7tw5SUhIEG9vb3FychKTySRJSUny3Xffyfnz52X69Oni6+srjo6O4ufnJytXrpSWlpYOfbbV+1ARMfgxhIjoBhQUFCA8PBxHjx7l/TRvYSKC+++/H4sWLcJzzz1n7+7YnK3eh1wR6Cq1tbVISU5GcV4e+jQ1odnBAWaLBckpKTd0asdom8nJKcjLK0ZTUx84ODTDYjEjJSW5V9u82eO0V7t30vElulG1tbXYvn07ampqur02847Xo++pPyLnz5+XiSaT5ADS0nZdVzMgOYBMNJm0a65s3abJNFGAHAFa2i4naxYgR0ymib3W5s0ep73avZOO763sdj09eydRFEV8fHxk27Zt9u5Kr7HV+5Ch2eZ5q1Vyurgo+jAgz191IbKtWK3Pt/1B76zZw2K1Pm/zNu0xTnu1eycd31sZQ5NuBbZ
|
||
|
|
],
|
||
|
|
"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
|
||
|
|
}
|