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

602 lines
36 KiB
Plaintext
Raw Normal View History

{
"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": [
"iVBORw0KGgoAAAANSUhEUgAAAc0AAACECAYAAADyZXANAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAFQ5JREFUeJzt3XtUVWX+BvBnHzEucZEQUUpFmBAOodxEOU5KNA5ZamguzGzJwXIYTTNnErtY47VxcHKm1mpp5UoyZtR0cOzilFjqCIEswJARGBBRcCaEaS1ticVFvr8/yP1zc5EXQQ/p81nrrDrn3fvd33e34zlnn33erYmIgIiIiLpksnUBREREPxUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkUMTSIiIkV2ti6AiG5tly5dQmlpqa3LIAIABAQEwMnJ6brXZ2gS0Q1VWlqK8PBwW5dBBADIz89HWFjYda/P0CSimyItLQ2BgYG2LoNuUyUlJXjyySd73A9Dk4huisDAwB69wyfqC3ghEBERkSKGJhERkSKGJhERkSKGJhERkSKGJhHRT9Dp06dhMplw/PhxW5fSq0wmEz766CNbl9EphiYR2UxdXR2WJSbikaAgTBs5Eo8EBWFZYiLq6ups3p/VaoXJZNIfAwcOxOTJk1FUVHRdtdGtgT85ISKbqK2txeMWC16rqEAKAA1AC4Dc4mLMOnIEO7Oz4enpabP+NE3D5MmTsXXrVgDAN998gxUrVmDKlCk4c+ZMN0badzU2NuKOO+6wdRk/KfykSUQ2sWH5crxWUYFxaA04oPUP0jgA6yoqkJKcbNP+RAT29vYYNGgQBg0ahNGjR2P58uWorq7Gt99+qy9XVFSEmJgYODk5YeDAgUhKSkJ9fb3eHh0djaVLlxr6jouLQ2Jiov7cx8cHv//97zFv3jy4urpi+PDhePfddw3r5ObmIjQ0FI6OjhgzZgyOHTtmaG9pacFTTz0FX19fODk5ISAgAG+++aZhGavViunTp2PdunW4++67ERAQgDVr1iA4OLjd+ENCQvC73/2uw31z6NAhmEwmfPnll4iIiMCdd96J8ePHo6yszLDcpk2b4OfnB3t7ewQEBCAtLc3QXl5ejgkTJsDR0RFBQUHIyMhot63q6mrEx8fD3d0dHh4eiIuLM7xpOXToECIjI+Hs7Ax3d3f8/Oc/R1VVVYd19waGJhHZRHFuLsZ20jb2x3Zb9ge0BucVFy9eRFpaGu699154eHgAAOrr6xEbGwsPDw/k5eVh165dOHDgABYtWqSvp2kaNE0z9NvRa6+//joiIyPx9ddfY+HChViwYIEeQhcvXsSUKVNw3333oaCgACtXrsTzzz9vWL+lpQVDhw7F7t27UVJSgldffRUvvfQSdu3aZVjuiy++QHl5OQ4cOIBPP/0U8+bNQ0lJCfLy8vRljh07hqKiIkOwd2TFihX405/+hLy8PNjZ2WHevHl62549e/Dcc89h2bJlOHHiBJKSkpCYmIhDhw7p9c6YMQMODg7Izc3F5s2bsXz5ckP/TU1NiI2NhZubGzIzM/HVV1/B2dkZDz30EJqbm9Hc3Iy4uDg88MADKCoqQk5ODpKSktrt214lREQ3UH5+vgCQ/Px8w+tT/f1FgE4fU/39u7Wd3u4vISFB7OzsxNnZWZydnUXTNPH29paCggJ9mXfeeUfuuusuuXTpkv7avn37pF+/flJbWysiItHR0bJ06VJD33FxcWK1WvXnPj4+MnfuXMMyXl5e8vbbb4uIyNtvvy0DBw6UhoYGvX3z5s2iaZoUFhZ2OoZnnnlGZs6caRjTkCFDpKmpybDcww8/LAsXLtSfL168WGJiYjrt9+DBg6Jpmnz55ZeGcWuaptdosVgkKSnJsF58fLw88sgjIiLy+eefS//+/eWbb77R2z/77DPRNE327t0rIiIffPCBBAQEGPpoaGgQJycnycjIkG+//VY0TZPDhw93WusVnR2H3cVPmkRkE5ft7CCdtLX82G7L/gAgJiYGhYWFKCwsRG5uLmJjYzF58mT99F9JSQlCQkLg6Oior2OxWNDS0oJ///vf3drWqFGjDM8HDx6M2tpafTujR482fP84bty4dn289dZbCA8Px6BBg+Di4oJ3330X1dXVhmWCg4Nh12ZfzJ8/H9u3b0djYyMaGxuxfft2w6dGlZoHDx4MAHrNpaWlGD9+vGF5i8WCkpISfUxDhw7V1+toTIWFhTh58iRcXFz0h4eHBxoaGlBRUYG77roLVqsVsbGxmDZtGt58803U1NR0WXdPMDSJyCbMkZE42knb0R/bbdkfADg5OcHX1xe+vr6IiIjAli1bUF9fjy1btujLiHQW1a1MJlO7ZRobG9udQuzfv7/huaZpaGlpUd7Ojh07sGzZMsyfPx8ZGRkoLCxEYmIiGhoa2o2prSlTpsDe3h7p6en4+OOP0dTUhJkzZ15ze21rvjKeq2vuqYsXLyI8PFx/43LlUVZWhtmzZwMA3nvvPWRnZ8NisWDnzp3w9/fH0aOdHQk9x9AkIptITknBS35+yEbrJ0H8+M9sAC/7+SE5JcWm/QHo9Lux77//HgBgNptRWFiIS5cu6W1ZWVkwmUwYOXIkAMDT0xP//e9/9fbLly/jX//6V7fqMJvNOH78uCEAc3JyDMtkZWXBYrHg17/+NUaPHg1fX1+cPHlS6fs9Ozs7JCQkYOvWrUhNTcXs2bNhb2/frRrbCgwMRGZmZrsag4KC9Pbq6mrDJ8O2YwoPD0d5eTk8PT31Ny9XHq6urvpyISEheOGFF5CVlYX77rsPf/3rX3tU+7UwNInIJjw9PbEzOxvpViumms2Y5u+PqWYz0q3Wbv885Eb0BwA//PADzp07h5qaGpSUlGDx4sX4/vvvMXXqVADAnDlz4ODggISEBJw4cQIHDx7E4sWLMXfuXH17MTEx+PTTT7Fv3z6UlpZiwYIFuHDhQpfbvvqT5RNPPAFN0zB//nwUFxdj3759+OMf/2hY3t/fH3l5edi/fz/KysrwyiuvIC8vr8tPqFc8/fTT+OKLL/DZZ58pnZrtyrJly5CamorNmzejvLwcGzduxJ49e/QLmCZNmgR/f38kJCTg+PHjOHLkCF5++WVDH3PmzMHAgQPx6KOPIjMzE5WVlTh06BCWLFmC//znPzh9+jRefPFF5OTk4MyZM9i/fz/Ky8thNpt7XH+nevSNKBFRF3rrAoybzWq1iqZp+sPV1VXGjh0r6enphuWKiookJiZGHB0dxcPDQ5KSkqS+vl5vb2pqkoULF4qHh4cMHjxY/vCHP0hcXJwkJibqy/j4+Mgbb7xh6DckJERWrVqlP8/JyZGQkBCxt7eXsLAwSU9PF5PJpF8I1NDQIImJiTJgwABxd3eXZ555Rl588UUJDQ01jGn69Omdjvn++++X4ODgLvfNwYMHxWQyyYULF/TXjh07JiaTSc6cOaO/tmnTJvHz85M77rhDAgICJC0tzdBPWVmZ3H///WJvby8BAQHy+eefi8lk0i8EEhGpqamRhIQE8fT0FAcHB/Hz85OkpCT57rvv5Ny5czJ9+nTx9vYWe3t78fHxkZUrV0pLS0u7mnvrONREFN+GEBFdh4KCAoSHhyM/P5/30+zDRAT33nsvFi1ahOeee87W5fS63joOOSNQN9TV1SElORnFubno19yMy3Z2MEdGIjkl5bpO/dxq6urqkJycgtzcYjQ394Od3WVERpqRkpLM/QMeP9R31dXVYceOHaitre3yt5m3O4amot6eoutWU1tbC4vlcVRUvAZctYeKi3Nx5MgsZGfvvO33D48f6qu8vLzg6emJd955B25ubrYup0/jhUCKenuKrlvN8uUbfgzM9nuoomIdkpO7f+XirYTHD/VlLS0tOHfuHB5//HFbl9Ln8ZOmouLcXHT2Z38sgBWHD6OgoOBmltSnHD5cAFxjDx0+vOK
],
"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
}